OmniAICreator/Qiita-1.07M huggingface dataset:
ＤＸ

## 2021/3/4 日経新聞　各社の失敗例
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/16ca0315-95b6-b3bd-9538-020a3f663cb4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/d429f500-7657-9195-dd17-fe43400de1d9.png)


## 2021/2/3 日経新聞 中外製薬のDX
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/02718e72-6e2e-5784-2f88-f7a344cb0741.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/432ef7a8-4f98-2db8-b346-f1dacf117362.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/0a1fa7bd-658d-2234-0e96-493415fecb8e.png)


## 2021/1/9 日経新聞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/01e5d1b2-d299-be60-c75e-79c2d1c846f9.png)

## 2020/12/17 日経新聞 大阪ガス　データ分析社員全員
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/5f40a7b2-0f02-4616-5359-32db5a0b0777.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/20242900-f1f0-da0d-86c1-ba66e3b510f8.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/73f90dd0-21c7-d416-606c-fbb36a340752.png)

## 2020年12月25日日経新聞
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/bdb4c8da-c0c1-17b3-f5a1-fe4d9ad348c3.png)

![スキャン_20201010.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/a5715784-14b5-29dc-e244-bbb81726345e.png)
![スキャン_20201212.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/cd39bb93-ce7e-0e15-dea9-c961a9866e1e.png)

![スキャン_20201212 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/abd83419-b88e-c104-734b-36890668d238.png)
![スキャン_20201218.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/487409e2-6b6f-959c-0a98-a854de21e496.png)

![スキャン_20201218 (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/691463/c4f5f2df-b740-2e72-5961-f047ad3ab78c.png)
ナビメニューで中央揃え、真ん中に配置したい時

ナビメニューの横並びでいくつか項目があり真ん中の中央にテキストを持ってきたい時ってありますよね？
そのような時は「position」を使いましょう。
並べる項目の親要素に「position:relative;」を
こここで親要素を絶対的な位置とします。
次に、子要素に「position:absolute;」を設定します。
そして親要素の位置からどれだけ動かしたいかをtop,bottom,left,rightで指定します。
例）.子要素　{
  position:absolute;
  top:10px;
  left:10px;
}
それぞれ上「から」、左「から」、どれだけ動かしたいかということになります。
そうすることでまとめて綺麗に配置することができます。
[PDFmerger]生まれて初めてのソフト公開v0.1

[本記事は、自分サイトのこの記事と同一内容です。](https://hagiayato.github.io/my-site/jekyll/update/2020/12/28/Pdfmerger.html)
#公開の経緯
[PdfSharpでPDFを結合する](https://qiita.com/hagii-x/items/7e2dc668a446acec560e)
この記事が約500回表示をいただいております。
多くの方から見ていただく中でコードだけ公開するままはどうかと思い、仮ですが実行ファイルを公開します。
#PDFmergerについて
MITライセンスのライブラリ、PdfSharpを用いてPDFの結合を行うwindowsアプリケーションです。
###作成理由
 - MITライセンスのPDF編集ライブラリを使ってみたいという興味
 - 過去に使ったPDF結合ソフトに結合設定の保存機能がなく、結合対象のPDFの一部のみ修正した際に必ず結合設定をするという手間がかかったため  
※結合設定…結合するPDFファイル、結合する順番の設定  

###特徴
 - PDFファイルの結合設定を.datファイルに保存する機能があります。  
   PDFを結合しなおす際にこの.datファイルを読み込むことで、結合設定をすぐに復元できます。

###DLリンク
[PDFmerger リリース](https://github.com/HagiAyato/PDFmerger/releases)
同じリポジトリで、ソースコードも確認可能です。
###以下、ソフトのreadme

<h1>PDFmerger</h1>
PDFファイルの結合アプリケーションです。
<h2>インストール方法</h2>
<ol type="1">
  <li>[リリースページ](https://github.com/HagiAyato/PDFmerger/releases/)
  から"Release_PDFmerger.zip"をダウンロードする</li>
  <li>ダウンロードした"Release_PDFmerger.zip"を、任意のフォルダに解凍する</li>
</ol>
<h4>必須環境</h4>
<ul>
  <li>Framework: .NET Framework 4.6.1</li>
</ul>
<h2>使い方</h2>
<ol type="1">
  <li>アプリケーション"PDFmerger.exe"を開く</li>
  <li>PDFファイルの結合構成を行う
    <ul>
      <li>"+追加"ボタン…結合するPDFを、結合PDFリストの一番下に追加する(複数選択可能)</li>
      <li>"▲一番上へ"ボタン…選択中のPDFを、結合PDFリストの一番上に移動する</li>
      <li>"△一行上へ"ボタン…選択中のPDFを、結合PDFリストの一行上に移動する<br />
        ※選択中のPDFのうち、一番上のPDFを基準にします。
      </li>
      <li>"△一行下へ"ボタン…選択中のPDFを、結合PDFリストの一行下に移動する<br />
        ※選択中のPDFのうち、一番下のPDFを基準にします。
      </li>
      <li>"▼一番下へ"ボタン…選択中のPDFを、結合PDFリストの一番下に移動する
      </li>
      <li>"-削除"ボタン…選択中のPDFを、結合PDFリストから削除する</li>
    </ul>
  </li>
  <li>出力ファイル名・パスを決定する(下記いずれかの方法)<br />
    1.出力ファイルパス欄に、直接入力<br />
    &nbsp;※パスを入力しない場合は、アプリケーション"PDFmerger.exe"と同じフォルダに出力されます。<br />
    2."出力ファイル変更"ボタンを押して、ダイアログで名前を決定する<br />
    3."結合・出力"ボタンを押した際に決定する(この段階では出力ファイルパス欄を空欄にする)
  </li>
  <li>"結合・出力"ボタンを押して、結合したPDFを出力する</li>
</ol>
<h3>拡張機能</h3>
<h4><b>◆結合設定書き出し/読み込み機能◆</b></h4>
<p>
  現在の結合PDFリストと出力ファイルパスの設定をファイルに書き出し/読み込みする機能です。<br />
  上部メニュー"ファイル"から起動します。<br />
  拡張子…".dat"<br />
<ul>
  <li>ファイル&gt;結合設定&gt;結合設定読み込み…既に存在する結合設定ファイルを読み込む<br />
    &nbsp;※アプリケーションに現状入力されている設定は破棄されます。
  </li>
  <li>ファイル&gt;結合設定&gt;結合設定読み込み…結合設定ファイルを作成・名前を付けて保存する</li>
</ul>
</p>
<h4>PDFファイルドロップ機能</h4>
<p>
  アプリケーションにPDFファイルをドラッグアンドドロップすると、<br />
  ドラッグアンドドロップしたPDFファイル全てを結合PDFリストの一番下に追加します。
</p>
<h2>補足情報</h2>
<h4>開発環境</h4>
<ul>
  <li>OS: Windows10</li>
  <li>ソフト: Microsoft Visual Studio Community 2017</li>
</ul>
<h4>使用ライブラリ</h4>
・PDFsharp version="1.50.5147"
<h4>著作権</h4>
Copyright (C) 2020 HA Works
<h4>問い合わせ・規約</h4>
商用以外の利用は無制限・無料で可能です。<br />
商用利用について、もしくは問題発生時などは下記アドレスにお問い合わせください。
haworks.eng☆gmail.com※☆→@
<h4>ライセンス表記(MITライセンス)</h4>
Creator of PDFsharp is empira Software GmbH<br />
Kirchstrase 19 53840 Troisdorf Germany<br />
www.empira.de<br />
PDFsharp (R) is a registered trademark of empira Software GmbH<br />
Released under the MIT license<br />
http://www.pdfsharp.net/PDFsharp_License.ashx
vscodeでtypescriptのフォーマッター（prettier）を使う方法

開発するときのeditorとしてvscodeを使っています。
reactを使って開発をしており、
typescriptを導入し始めたあたりから、
コードのフォーマットが起動しなくなり、
あれこれと試したので、備忘録として残しておきます。


#Prettier - Code formatter のインストール
下記ページで「Install」ボタンを押して、インストールする。
[https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode)

vscodeのextensionsで「prettier」で検索してもいいが、たくさん出てわからなくなるからやらない。
（私は、ここで変なのをインストールしてしまって、公式ドキュメントを見ても、上手く設定できず、躓きました。。。）
#settings.json
vscodeの「View > Command Palette」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640981/71981832-380e-f667-f729-61f93b7547a0.png)
「settings.json」と検索し、
「Open Settings(JSON)」をクリックする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640981/7cd241ee-b375-296c-b468-139a00390a81.png)

すると、vscodeの設定ファイルであるsettings.jsonが開くので、
下記を追記する。

```settings.json
{
  ...,
  ...,
  // 下記の２行を追記
  "editor.defaultFormatter": "esbenp.prettier-vscode",
  "editor.formatOnSave": true,
}
```

#試してみる
Ctrl + S でファイルを保存した時
Alt +  Shift + F でコード整形ショートカットを実行した時
にちゃんと変換されるようになりました！
![ezgif.com-gif-maker.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/640981/3b802af3-fde3-03db-e369-a1d6da04dcf3.gif)

#その他の設定
詳細に設定するには、「.prettierrc」をプロジェクトのルートディレクトリに配置すればいいみたいです。
【logstash】オフライン環境でプラグインインストールする

オフラインまたは外部への接続が制限された状態でpluginをインストールする方法についてメモ

プロキシ環境の場合はそもそもhttps://rubygems.org/ へ繋げるように
設定できるのが一番楽だけどそれが出来ないときは以下の方法でインストールする。

***
#１．ローカル環境でlogstashを構築
外部への接続ができるマシンでlogstashを構築し、そこに目当てのプラグインをインストールする。

```
bin/logstash-plugin install プラグイン名
```

#２．インストール用のパッケージを出力
以下のコマンドでオフライン環境でのインストール用のパッケージ(zip）を生成する

```
bin/logstash-plugin prepare-offline-pack プラグイン名
```

#３．インストール
インストール用パッケージを対象の環境に配置し以下のコマンドを実行してインストールを行う

```
bin/logstash-lugin install file://パッケージのファイルパス
```

***
参考サイト：
https://www.elastic.co/guide/en/logstash/current/offline-plugins.html
dockerコンテナに、Could not find hoge in any of the sources Run `bundle install` to install missing gems.が出た場合の対処

bundle installをするたびに、dockeのrailsコンテナを再起動して見る
↓
それでもうまくいかない場合、

```docker:docker
docker-compose build --no-cache
```

以下を実行します。
参考
https://fuqda.hatenablog.com/entry/2019/03/21/204118

## 最後に
僕のdockerfileが悪いのかもしれません。それとも、bundle installするたびにrails sする必要があるのかもしれません。
Python スクレイピングについてまとめ


今回、社内目標でPython学習を目標として設定し、学習した。

スクレイピングの技術が気になったので、まとめることにします。


#スクレイピングとは

スクレイピングとは、webサイトから任意の情報を抽出する技術のことを指します。

スクレイピングすることで、web上の情報を自動で収集します。

しかし、web上で公開されている情報であればなんでもデータベースに格納できるということではありません。

下記のような技術が備わっております。

・データベースに格納するためには、形式を変更させる
・広告などの不要な情報を排除し、必要な情報を取り出す為のサイトの構造解析
・ログインが必要なページにアクセスする技術
Laravel の seeder がカオスになってきたのでフォルダ分けした

システムの継続開発が進むにつれ、システムに必要なデータもどんどん増えていく。
そして気づけば migration のフォルダも seeder のフォルダもファイルだらけで何が何やら・・・。ということに。
migration は時系列で並ぶのでまだマシだが、seeder は デフォルトで UserSeeder みたいな命名のファイルがあるので、それに釣られてしまった結果、どの seeder がどのときに追加したやつだっけ？みたいになりがち。

なので seeders フォルダの下にサブフォルダを切って、機能別に整理しようと思い立った。
単にフォルダを切っただけど「特定の seeder だけ実行したい」と言う場合や「Controller や Service クラスなどから実行できない」事態になる。

やることは以下の4つ。
1. seeder を任意にディレクトリ分けする
2. composer.json に記述を追加する (Laravel5 などの場合)
3. ディレクトリ分けした seeder に namespace の記述を追加する
4. seed コマンド実行時に namespace を付与する

## seeder を任意にディレクトリ分けする
好きなようにやる。
![database以下のディレクトリ構成](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/3d152a79-902c-3ce6-4540-4be2a9196080.png)

上記の例では `DatabaseSeeder.php` は 引数を指定せずに `php artisan db:seed` を実行した時に使われるデフォルトの seeder ここでは、初期設定に必要な seeder 群を呼び出している。
![seederの中身](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/81722862-f2e9-38e4-4b6a-84d55d4ae53a.png)
それぞれの seeder クラスの中ではさらに以下のように namespace 付きでディレクトリ分けした seeder クラスを呼び出す(記述については後述)。
![スクリーンショット 2020-12-28 8.36.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/c73cf07f-0956-7cd1-cad7-a494cb357dbd.png)
この例では call のクラスに namespace つけているが、ファイルの先頭で use を使っても問題ない。
繰り返し呼び出すわけでもないし、増減した時に2箇所編集するのも面倒なので、自分はここに直接全部書いている。


## composer.json に記述を追加する (Laravel5 などの場合)
autoload のところに `"Database\\Seeders\\": "database/seeders/"` の行を追加。
Laravel8 のを見たところ、すでにこの記述があるので不要。

```php
"autoload": {
    "psr-4": {
        "App\\": "app/",
        "Database\\Seeders\\": "database/seeders/"
    },
    "classmap": [
        "database/seeds",
        "database/factories"
    ]
},
```

キーの方にある`\` はバックスラッシュ (Macでのバックスラッシュの出し方は [こちら](https://qiita.com/shimon_haga/items/de3e67e864fcb36f64d3) )。
2個つけるのを忘れずに。

`classmap` を消した方がいいのかなと思いつつも、とりあえずはこのまま。

## ディレクトリ分けした seeder に namespace の記述を追加する
`Database\Seeders` は composer.json に書いた通りで、それ以下の名前は任意で。
任意だけど、ディレクトリ名のキャメルケースとかがわかりやすいかと。
![namespace記述](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/52b30d9a-1e19-659e-0e60-a55b92cb6998.png)


## seed コマンド実行時に namespace を付与する
例えば setup ディレクトリにある管理者のデータを単体で流したいときは以下のようにする。

**実行する前に！** `composer dump-autoload` を実行して、クラスの読み込みを最新化おくこと (seeder を編集した時の基本)。

```sh
php artisan db:seed --class=Database\\Seeders\\Setup\\AdministratorsSeeder
```
またしてもバックスラッシュは2こ。
引用符などは不要。


## おまけ : Controller など app 側から呼び出す場合
時々、動的にデータを流し込みたいと言う要望があるケースがある。
新規利用者がいた時に、システム利用サンプルを生成する場合など。

普通にプログラム中にモデルを呼び出してゴリゴリ書いても良いんだけど、外部化しておきたい。
データ流し込みといえば seeder の仕事だろう。
じゃぁ seeder を呼び出せばいいじゃない！

![クラスの呼び出し](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/da84bc3b-9457-c249-83c9-05da54dba8dc.png)
先ほど namespace を追加したので、普通に use するだけ！
なんと簡単。

普通のクラスなので、 run メソッドを実行するだけ。
![app側からseederを実行](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/ce041201-01d1-23ba-c7bf-7c5aa172ad93.png)
上記例では引数を受け取っている。
参考までにseeder側も。
![引数を設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/71497/6f492b87-b464-61fc-315c-e06ec531e82a.png)

それでは良き seeder ライフを！
npm でライブラリをアンインストールする方法

npm でインストールしたライブラリをアンインストールする方法をメモします。

#書き方
```
npm uninstall パッケージ名
```

#package.jsonのdevDependenciesが下記だったとする
```package.json
{
  "name": "npm uninstall",
  "version": "0.1.0",
  "private": true,
  "scripts": {
  },
  "dependencies": {
  },
  "devDependencies": {
    "@types/node": "^14.14.14",
    "@types/react": "^17.0.0",
    "@types/react-dom": "^17.0.0",
    "prettier": "2.2.1",
    "tslint-config-prettier": "^1.18.0",
    "tslint-plugin-prettier": "^2.3.0",
    "tslint-react": "^5.0.0",
    "typescript": "^4.1.3"
  }
}
```

#「prettier」をアンインストールしたい場合は下記のように書く
```
npm uninstall prettier
```
npm install したときは、--save-devとかが必要だったけど、uninstallするときはいらないみたい。（2020/12/28時点）
Firebaseのデプロイ作業をcronで実行

Firebase上で作成したサイトへcronを利用して定期的にデプロイさせるとき、単に「firebase」コマンドを入れても実行されなかったため、その回避方法を記載します。

# 環境
Raspberry pi3 (Raspbian)

# 回避方法
下記の手順で「firebase」の実体を探し、その実体から直接デプロイを実行させる。

```
# which firebase
/usr/local/bin/firebase
# ls -l /usr/local/bin/firebase
lrwxrwxrwx 1 root root 54 Jul 11 23:55 /usr/local/bin/firebase -> ../lib/node_modules/firebase-tools/lib/bin/firebase.js
```
あとは普段「firebase」と入力していた部分を、上記の実体をnodeコマンドで実行するように置き換えれば完了。

```
00 00 * * * cd /home/user/firebase; node /usr/local/lib/node_modules/firebase-tools/lib/bin/firebase.js deploy
```

なお、「firebase」コマンドと同様、「--only=hosting」オプションも有効です。
[Rails&Docker&MySQLの環境構築]　Could not find gem ‘mysql2 (>= 0.4.4, < 0.6.0)’ in any of the gem sources listed in your Gemfile.とエラーメッセージが出てきた。

#概要
初投稿です。

[こちらの動画](https://www.youtube.com/watch?v=Fq1PH0Gwi8I&t=1161s)を見ながら環境構築をしていた最中に
```docker-compose build```後
```docker-compose up``` を実行したら

```Could not find gem ‘mysql2 (>= 0.4.4, < 0.6.0)’ in any of the gem sources listed in your Gemfile.```
というエラーが出た。


#開発環境
macOS catalina
バージョン10.15.7


#試したこと
とりあえずググって

* myslqの再インストール
+ ruby2.5.8から2.6.6へのアップデート
+ docker desktopの再設定

その他諸々のことを試したが色々試したが事象変わらず。
4時間経過。
朝日が登ってきて泣きそうになる。

#解決方法


```docker-compose run web bundle install```
```docker-compose up```
の順で実行したら解決した。
AWS EC2で、index.phpが表示されない？

[AWS EC2上にPHPサイトを立ち上げて、独自ドメインでアクセスできるようにするまでの全手順](https://qiita.com/harufuji/items/4fcd8f991fab5ad3354a#ssh%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E6%8E%A5%E7%B6%9A%E3%81%99%E3%82%8B)
[AWSに登録してwebサーバーを立ち上げてみる](https://qiita.com/Hikery/items/b919ae9e35f0f66e6a95)

これらの方々の情報共有で最後のところまでいけたんですが（ありがたい..🙏）
なぜか、この最後の部分で引っかかってたんですが、sudo追加でいけました。

```terminal
systemctl restart httpd.service
```
↓

```terminal
sudo systemctl restart httpd.service
```
ピタゴラゴールの音が小さくなった場合の修理

# 1.はじめに
自分でピタゴラスイッチを楽しむピタゴラゴール1号というおもちゃがあります。私のは、ある日突然、音が小さくなり、電池を替えても小さいままでした。結論としては、スピーカー部品がずれたためでした。修理は10分程度で終わりました。

# 2.必要なもの

- ドライバー（100均のものでも可）

あと、細かいものを見るのが厳しい方は拡大鏡も必要かもしれません^^

# 3.分解

4つのネジを取ると蓋が開きます。電池のケーブルが繋がっていますので、透明部分は下を近づけたまま上からに開きます。
![pita01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/2b46cb18-2ead-9059-4ba9-bff57a827838.jpeg)

スピーカーを押さえている赤い部分だけとります。（ネジ2本を取ります。基板は外す必要ありません。）
![pita02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/c1ecb52d-76e1-be0a-bf0b-612bed0d0119.jpeg)

スピーカーを優しく取り出して、透明な部分の縁を押し込みます。
ここが何かの拍子に外れたため、音が小さくなっていました。
![pita03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/b5b4b91a-ed2e-c2f6-80c6-2a2ab930e934.jpeg)

# 4.確認
スイッチを押して、音が鳴るか確認します。きちんと鳴ることが確認できたら、ネジを止めてもとに戻します。

音が小さいままならば、透明な部分が外れてないか確認します。

# 5.おわりに
故障も色々あり、検索すると断線や機構的に動かないなど、いろいろですが、私の場合は音が小さくなったという、微妙な現象でした。簡単に直せるので、情報として残しておこうと思い記載しました。
Gatsby.jsのTypeScript対応手順

## 手順

### 1. `ts-node`, `typescript`, `gatsby-plugin-graphql-codegen`をインストール

```
yarn add ts-node typescript gatsby-plugin-graphql-codegen
```

※ GatsbyでTypeScriptのサポートがデフォルトになったので、`gatsby-plugin-typescript`は不要

### 2. `gatsby-node.js`ファイルを作成して以下を記述

```gatsby-node.js
"use strict"

require("ts-node").register({
  compilerOptions: {
    module: "commonjs",
    target: "esnext",
  },
})

exports.createPages = require("./gatsby-node/index").createPages
```

### 3. `tsconfig.json`ファイルを作成して以下を記述

```tsconfig.json
{
  "compilerOptions": {
    "module": "commonjs",
    "target": "esnext",
    "strict": true,
    "sourceMap": true,
    "noImplicitAny": true,
    "esModuleInterop": true,
    "jsx": "react",
    "lib": ["dom", "esnext"]
  },
  "include": ["./types/**/*", "./gatsby-node/**/*", "./src/**/*"]
}
```

### 4. `types`ディレクトリを作成して、その配下に`graphql-types.d.ts`ファイルを作成

### 5. `gatsby-config.js`に以下を記述

```gatsby-config.js
plugins: [
  ...,
  {
    resolve: `gatsby-plugin-graphql-codegen`,
    options: {
      fileName: `types/graphql-types.d.ts`,
    },
  }
]
```

## 詳細

### TypeScript

#### メリット
- コンパイルエラーによってJavaScriptではフォローできない、スクリプト実行前の未然検知を可能にする。
- IDEと組み合わせることで型補完やエラーを表示させ開発体験を向上させることができる。


### gatsby-plugin-graphql-codegen
- srcディレクトリ内で`import { graphql } from "gatsby"`しているファイルの query 定義から、型定義が自動生成されます。
- 自動生成した型定義は`gatsby-config.js`の`fileName`で指定したファイルに記述されます。


## ディレクトリ構成

```
gatsby-node
  └── index.ts
src
  ├── components
  ├── pages
  ├── styles
  ├── templates
  └── utils
static
types
  └── graphql-types.d.ts
.gitignore
.prettierignore
.prettierrc
gatsby-config.js
gatsby-node.js
package.json
package-lock.json
tsconfig.json
yarn.lock
```

## 参考文献

### GatsbyのTypeScript化関連の記事・Githubリポジトリ
- [Gatsby.js を完全TypeScript化する](https://qiita.com/Takepepe/items/144209f860fbe4d5e9bb)
- [GatsbyMicroCMSBlog](https://github.com/YouheiNozaki/GatsbyMicroCMSBlog)

### ts-node
- [ts-node](https://github.com/TypeStrong/ts-node)

### tsconfig.json
- [What is a tsconfig.json](https://www.typescriptlang.org/docs/handbook/tsconfig-json.html)
- [tsconfig.jsonの全オプションを理解する（随時追加中）](https://qiita.com/ryokkkke/items/390647a7c26933940470)

### gatsby-plugin-graphql-codegen
- [Gatsby Typescript Graphql Codegen](https://www.gatsbyjs.com/plugins/gatsby-plugin-graphql-codegen/)
WSLの0x80370102エラー (on Windows10 on Parallels on MacOS)

# はじめに
普段macOSを使っているのですが，ふとしたときにLinuxやWindowsを使用したくなります．（なりますよね？）
それぞれ物理マシンはあるのですが，立ち上げるのが面倒だったりするので，僕は仮想環境（[Parallels](https://www.parallels.com/jp/)）を利用して各OSで遊んでます．
（Parallelsはシェアウェアですが，macOS上で仮想環境を使用するならば最もお金を払うべきソフトウェアの一つだと思います．思いますよね？）

今回の記事は，Windows10 HomeをParallels上にクリーンインストールし，WSL2で遊ぼうと思っていたときにおきたエラーに関する忘備録です．
（実は初投稿）

# 忙しい人向け
Parallels上で動くWindowsでWSLを動かそうとして，`0x80370102`エラー（仮想化機能大丈夫？）が出た場合Paralellsの各仮想マシンの[設定:gear:]-[ハードウェア]-[CPU及びメモリ]-[詳細設定]から，「ネストされた仮想化」を有効化してください．
![WSL2_error_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659431/1648830e-f573-bbfb-34ca-41a9b1057929.png)

# 環境
| 項目 | 値 | 詳細 |
|---|---|---|
| ホストマシン | MacBook Pro | 15-inch, 2018 |
| ホストOS | macOS Big Sure | 11.1 |
| 仮想化ソフト | Parallels Desktop 16 for Mac | 16.1.2 (49151) |
| 仮想OS | Windows 10 Home | 20H2 (19042.685) |

# 発生したこと
何も考えずにWindows10をインストールし，[公式インストールガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)を参考にWSL2をインストールしようとしました．
WSL2自体のインストールまではうまくいきましたが，いざ[MicrosoftStoreからUbuntu 20.04 LTS](https://www.microsoft.com/store/productId/9N6SVWS3RX71)をインストールし起動しようとしたところ，以下のようなエラー
![WSL2_error_2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659431/cd99b9a5-67e1-a379-d078-d1399a528ef8.png)

```
Installing, this may take a few minutes...
WslRegisterDistribution failed with error: 0x80370102
Error: 0x80370102 ??????????????????????????????????????

Press any key to continue...
```

が発生しました．

# 原因
前述公式ガイドの[インストールのトラブルシューティング](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10#troubleshooting-installation)によると，)
> - インストールがエラー 0x80070003 またはエラー 0x80370102 で失敗した
>   - コンピューターの BIOS 内部で仮想化が有効になっていることを確認してください。 これを行う方法の手順は、コンピューターによって異なりますが、最も可能性が高いのは CPU 関連のオプションの下です。

だそうです．

「でもガイドどおりやって仮想化有効にしたしなぁ．．．タスクマネージャ見たら「仮想化：はい」ってなってるしなぁ．．．」っとムチムチで無知な僕は考えました．
（僕はこの項目で「仮想化が有効になっていることを確認してください」しか目に入りませんでした．安直！！）
![WSL2_error_4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659431/6ffd92ee-8c8d-1bfc-a108-dc6458c25885.png)

実は，このとき僕の仮想Windows10君は仮想化がOnになってなかったのです！！
つまり，仮想OS上での仮想化機能（ネストされた仮想化機能）を有効化する必要があったのです．

# 解決策
GitHub.comのWSLのIssueで[同じエラーが起きている人がいた](https://github.com/microsoft/WSL)ので（これはVirtualBoxでしたが），同じように解決します．
OSを一旦シャットダウンしたあと，Parallelsの各仮想マシンの設定（:gear:マーク）から，

- ハードウェア
    - CPUおよびメモリ
        - 詳細設定
            - Hypervisor: 「Apple」 → 「Parallels」
            - ネストされた仮想化を有効にする: チェックを付ける✅

のように設定し，画像のようにします．
![WSL2_error_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/659431/1648830e-f573-bbfb-34ca-41a9b1057929.png)

その後OSを起動し，再度WSLのUbuntuを立ち上げると，無事起動できるようになりました！！

# 参考
[Windows 10 用 Windows Subsystem for Linux のインストール ガイド](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)
[Error 0x80370102 when running WSL2 in a Win10 VirtualBox VM (macOS Host) #5430](https://github.com/microsoft/WSL/issues/5430)
macのAndroid Studioで実行ボタン押しても実行できない【No Target Device Found】

とりあえずAndroid触ってみるかとAndroid Studioをインストールして実行しようとしても

```
No Target Device Found
```

とエラーが出て実行できない。ただサンプルコード動かしてみたいだけで一行も触ってないのに...


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/98127/05084f5c-6dda-167f-ecdf-593976761f06.png)

↑上図のようにデバイスが選択できないといけないのだが、自分の場合は緑の再生ボタンの左にデバイス選択のセレクトタブすら表示されていなかった。( 正確には loading devise と表示されるものの、loadingに失敗したのかタブ自体がしばらくすると消失していた）



とりあえず仮装デバイスを公式のマニュアル通りに1つ追加してみる

https://developer.android.com/studio/run/managing-avds?hl=ja#createavd

すると、installした仮装デバイスが緑の再生ボタンの左に表示されるようになり実行できるようになりました。( ´ー｀)ﾌｩｰ．．．やれやれ
Route53 で取得したドメインが nslookup で SERVFAIL になる

#ターゲット
- Route53で取得したドメインにアクセスできない人
- Route53で取得したドメインがnslookupでSERVFAILになる人


#概要
AWSのRoute53で、EC2インスタンスのIPアドレスと取得したドメインを紐付けした上でドメインにアクセスした際、下の画像のように`このサイトにアクセスできません`と出てページを表示できませんでした。
![このサイトにアクセスできません.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823943/8883b9c8-17d7-7890-4d19-234f7d41798c.png)


#原因
上の画像の下部に`DNS_PROBE_FINISHED_NXDOMAIN`とあること、後述のnslookupコマンドの結果からDNSサーバーになんらかの異常があったようです。

nslookupコマンドを打つと、以下のように`SERVFAIL`となりドメインが使えない状態であることがわかりました。

```
$ nslookup mydomain.com
;; Got SERVFAIL reply from xxx.xxx.xxx.xxx, trying next server
```

#解決策
stackoverflowに解決策がありました。
>dev.classmethod.jp/cloud/register-domains-route53/… によると、ドメインを登録する前に、先にHosted Zoneを作成すると、Your Domains内の購入したドメインの4つのName ServerとHosted Zoneの4つのName Serverが異ることがあるようです。その場合は、Your Domains内の該当ドメインの4つのName Serverを修正し、Hosted Zoneを設定する必要があるようです。Your DomainsとHosted Zoneの4つのName Serverの値に差異がないか確認すると良いかもしれません。 – user28902 18年7月20日 10:35

引用元：[route53で取得した独自ドメインから、アクセスできない。](https://ja.stackoverflow.com/questions/46780/route53%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%8B%E3%82%89-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)
<br>

ドメインを登録する前にホストゾーンを作成したわけではないですが、記述の通りドメインのネームサーバーをホストゾーンのNSレコードに記載されているネームサーバーに変更して解決できました。

ちなみにネームサーバーとDNSサーバーは同じ意味です。

たとえば、登録済みドメインの`ネームサーバー`の項の`ネームサーバーの追加/編集`から`ns-1010.awsdns-62.net`を
![登録済みドメイン.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823943/b00195b2-8c3d-9ce0-c1ee-a665f51c49a0.png)

ホストゾーンの詳細の`NS`レコードの項の`ns-661.awsdns-18.net.`で書き換えます。
![ホストゾーンの詳細.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823943/987c42ba-60ac-e0aa-848c-befb21064954.png)

すると、nslookupコマンドの結果がこのように名前解決できるようになりました。

```
$ nslookup mydomain.com
Server:		xxxx:xx:xxx:xxxx:xxxx:xxxx:xxxx:xxxx
Address:	yyyy:yy:yyy:yyyy:yyyy:yyyy:yyyy:yyyy#53

Non-authoritative answer:
Name:	mydomain.com
Address: xxx.xxx.xxx.xxx
```

同時に`このサイトにアクセスできません`となっていたページが表示できるようになりました。
変更が反映されるまでに時間がかかるかもしれませんので、解決できない場合は少し時間を置いてからリロードしてみてください。(私の場合、AWSから設定変更完了のメールが来てから10分ほどかかりました。)
![EC2のページ表示成功.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/823943/9680cca8-ffb1-2b83-f22c-95712769fd98.png)

# 追記
[2021/04/18]
Route53は反映に10分程度時間かかることがあるので、単に反映されていなかっただけかもしれません。

[2020/12/28]
解決後も調べて気づいたのですが、ローカルDNSキャッシュをクリアすることがで解決できたかもしれません。エラーが再現できず、確かめられなかったので参考サイトだけ載せておきます。上記で解決できない場合は7つの解決方法を確かめてみるといいかもしれません。

[ChromeのDNS_PROBE_FINISHED_NXDOMAINの解決方法（7つの対策方法）](https://kinsta.com/jp/knowledgebase/dns_probe_finished_nxdomain/)


#引用 / 参考
引用
1. [route53で取得した独自ドメインから、アクセスできない。](https://ja.stackoverflow.com/questions/46780/route53%E3%81%A7%E5%8F%96%E5%BE%97%E3%81%97%E3%81%9F%E7%8B%AC%E8%87%AA%E3%83%89%E3%83%A1%E3%82%A4%E3%83%B3%E3%81%8B%E3%82%89-%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84)

参考
1. [ChromeのDNS_PROBE_FINISHED_NXDOMAINの解決方法（7つの対策方法）](https://kinsta.com/jp/knowledgebase/dns_probe_finished_nxdomain/)
2. [初心者のためのDNS運用入門 - トラブルとその解決のポイント -](https://dnsops.jp/event/20130719/20130719-dns-beginners-guide-mizuno-2.pdf)
→DNSの基本ととトラブルシューティングについてわかりやすく解説されています。
AWS EC2で「pip install annoy」でgccのエラー解決策

Annoyをインストールしようとしたら...

```
pip install annoy
```

```terminal
地獄の長いエラー...
...
gcc -pthread -Wno-unused-result -Wsign-compare -DNDEBUG -g -fwrapv -O3 -Wall -fPIC -I/home/ec2-user/.pyenv/versions/3.7.0/include/python3.7m -c src/annoymodule.cc -o build/temp.linux-x86_64-3.7/src/annoymodule.o -D_CRT_SECURE_NO_WARNINGS -march=native -O3 -ffast-math -fno-associative-math -DANNOYLIB_MULTITHREADED_BUILD -std=c++14
    gcc: error trying to exec 'cc1plus': execvp: No such file or directory
    error: command 'gcc' failed with exit status 1
```

##解決策
__問題は、g++がないことでした。__
情報源：[Error trying to exec 'cc1plus': execvp: No such file or directory](https://qiita.com/kai0706/items/d6ca791e9815d61d5132)

無料枠のLinuxサーバー（CentOS）を使っているので、このようにインストール。

```
sudo yum -y install gcc-c++
```
情報源：[g++をCentOSへインストールする](https://kaworu.jpn.org/cpp/g++%E3%82%92CentOS%E3%81%B8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B)

うまく行きました。✌️

```
Collecting annoy
  Using cached annoy-1.17.0.tar.gz (646 kB)
Using legacy 'setup.py install' for annoy, since package 'wheel' is not installed.
Installing collected packages: annoy
    Running setup.py install for annoy ... done
Successfully installed annoy-1.17.0
```
macOSでPython入れようとして「export」がterminalに表示され続けた時の対処法

### 執筆経緯
- pythonでpandas使おうと思ってた
- pyenvをinstallしようとした（参考：[pyenvを使ってMacにPythonの環境を構築する」](https://qiita.com/1000ch/items/93841f76ea52551b6a97))
- terminalに「$:export」が表示され続けた...

```
$ export
```
→「え、え、？？あれ、なんかまずいことしちゃいました？？？」

- ちょっと焦ったのと、「まさに同じ現象で困ってます！」みたいな記事が(多分)なかったので誰かのお役に立てればと思い執筆

## 前提条件
- 「`user/"ユーザー名"/.zshrc`」にコマンドプロンプトの表示形式を記入。
- [homebrew](https://brew.sh/index_ja)はinstall済み

ちなみにプロンプトは下記みたいな感じにしてます。

```
# zshrc内コード
PROMPT='[%F{cyan}%# %{No.%h %D %T %$ %C%F{reset_color}]:'
```

```
# 表示イメージ（色は反映してません)
[% No.58 20-12-28 3:36 User]：python --version
```

プロンプト変更参考記事：[ターミナルプロンプトの表示・色の変更](https://qiita.com/hmmrjn/items/60d2a64c9e5bf7c0fe60)

## exportが表示され続ける原因
- プロンプトカスタマイズで参照している「.zshrc」ファイルに、**記述したコードが改行されていなかった**

どういうことかというと

#### path通した直後の「.zshrc」ファイル内記述
↓↓↓

```
PROMPT='[%F{cyan}%# %{No.%h %D %T %$ %C%F{reset_color}]:'export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

#### 改行して、プロンプト表示も改善された後の「.zshrc」ファイル内記述
↓↓↓

```
PROMPT='[%F{cyan}%# %{No.%h %D %T %$ %C%F{reset_color}]:'
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init -)"
```

こういうことです。

`PROMPT`の行に`export`が記載されてしまっていました。。

### 対処手順をまとめると
- MacのFinderで隠しファイルを表示 `⌘command + shift + .(ドット)`
- 「`user/"ユーザー名"/.zshrc`」にあるファイルを開く（バックアップとってね）
- `PROMPT`コードとexportコードの行を分ける（改行する）
- 「.zshrc」ファイルを保存
- terminalを再起動
- 完了

何にせよ、ぶっ壊れてなくてよかった:hushed:...。


## 確認した記事（見たけど今回のケースとは違った（多分））
- [MacのTerminalの環境変数をブッ壊したときの対処法](https://qiita.com/keisei_1092/items/746dfe6ddac9b4f516b3)
- [【Mac】Terminalで主要なコマンドが実行できなくなった場合の解決方法](https://qiita.com/keisei_1092/items/746dfe6ddac9b4f516b3)
- [【zsh, bash】macでPATHを通す方法 - not found と出てしまったら](https://qiita.com/k3ntar0/items/eb8cdbd8eba9da388def)
- [シェルスクリプト export コマンド](https://qiita.com/blueskyarea/items/7e8bd6efcc538746a569)
    - exportコマンドの影響とか再確認した
- [Vim / Vi を終了させる方法](https://qiita.com/kon_yu/items/b8864ff566b8b67a9810)
    - 上記確認記事中に、Vimで編集する案内があったので試してましたが、どうも終了できず調べた（結局終了しなかった）。

#### 同じ現象になった人の参考URL
- [teratail：ターミナルにexportが出現、消したい](https://teratail.com/questions/188828)
    - 同じようになった人は多分これくらいかなという感じです。

## おまけ：pyenv install参考記事
- [pyenvを使ってMacにPythonの環境を構築する」](https://qiita.com/1000ch/items/93841f76ea52551b6a97)
- [Progate:Pythonの開発環境を用意しよう！（Mac）](https://prog-8.com/docs/python-env)
    - さすがというかめちゃ丁寧でした。

以上。
時間になったら動画が再生されるサイトを作った

## はじめに

年越しは「ウルトラソウル ハイッ！」でしたいですよね？

でもタイミングを合わせるのが難しい…

そういうときは！

## 時間になったら勝手に動画が再生されるアプリ

<https://kabo2468.github.io/justimetube/>

![reiwa.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/319875/83aa2301-3e84-da9e-02c8-97b525c0d546.jpeg)
令和が始まる瞬間の画像（2019年の年越しのときは撮るの忘れてた）

## なぜこんなアプリを作ったか

「12月31日の23時58分54秒にウルトラソウルを流すとウルトラソウル ハイッ！でちょうど新年を迎えられる」ということをTwitterなどで見て、
もっと楽にウルトラソウルを流したい…なんて思ったのがきっかけです。

それと、他の曲一緒に流して~~うるさい~~**楽しい年越しを迎えたい**ということでこのアプリを作りました。

## 使い方

1. 動画をリストから選ぶ。
2. 「決定」を押すとプレイヤーが表示される。
3. あとは、時間が来るのを待つだけ！

自動的に動画が再生されていきます。

動画が再生される時刻より動画を選ぶ時刻の方が遅いと、再生されません。

なので、余裕を持って動画を選んでください。

左上のボタンから音量や動画の数を増やしたり減らしたり出来ます。

30個まで増やすことが出来ます。

もちろん、動画を増やすとその分PCスペックやネット回線を多く使うようになるので、高負荷にならないように気をつけてください。

高負荷になるとタイミングがずれる可能性があります。

スマホだと小さすぎて何も見れないので、PC推奨です。

## 仕組み

### タイミング

あらかじめ、動画IDなどが書いてあるjsonファイルを読み込んでタイミングを合わせています。

```json:video-list.json
[
  {
    "name": "ultra soul",
    "id": "Ujb-ZeX7Mo8",
    "fit": 65,
    "start": 0,
    "end": 0
  },
  {
  }
]
```

この`fit`というプロパティが合わせるタイミングです。

`start`や`end`は動画が長過ぎるときに指定します。

### 動画を再生する

動画を再生するのは setTimeout でしています。

0.5秒ほどタイミングに余裕をもたせたり、バッファのために1秒追加したりしています。

1秒だけ再生させることで、再生するところのバッファを取ることが出来ます。

## 作るときに使ったもの

- JavaScript
  - これがないと何も始まりません。

- jQuery
  - グリッドを増やしたり減らしたりDOM関係に使っています。

- YouTube IFrame Player API
  - プレイヤーを表示したり、動画を再生したりするのに使っています。

- SCSS
  - 変数とかを使いたかったのでCSSに近いSCSSを使いました。（あまり使いこなせていないけど…）

- Google Fonts
  - 文字をきれいにしたかった。

## おわり

[こちらの記事](<https://qiita.com/aiandrox/items/09ffe4c301e74de668a1>)を見て、タイミングを合わせるアプリ作ったなと思い出し、この記事を書きました。

実はこのアプリを作り始めたのが2018年末頃で、まだプログラミングは浅かった時期でした。

今見ても、きれいなコードとは言えません。

IssueやPRで動画の追加などを手伝ってくれると嬉しいです。

<https://github.com/kabo2468/justimetube>

では、良いお年を！
[Ruby]例外処理基本

# はじめに

今回は例外について改めて勉強しましたので
忘れないように記述していきます。
今回は少しずつ理解して行こうということで第１回目:ok_woman:


# 例外処理とは

コード実行時にエラーが発生したときにする処理のことです。
原因の調査がしやすくなるなどのメリットがあります。

# 使用するメイン機能

- **begin**　例外が起こるであろうコードを指定して処理の問題を検索する。

- **rescue**　問題が発生したときに対応する内容を記述する。

- **raise**　意図的にエラーを発生したいときに記述する。

- **ensure**　エラーが発生してもしなくても実行する。

# シンプルなものを書く

流れが分かりやすいように"puts" で番号をふっています。

```Ruby
puts 1
begin           # エラーが起きそうなところをbeginで囲む
  number = 0
  answer = 100 / number
  puts 2       # ↓　エラーが起きたら対応する内容をrescueに記述
rescue ZeroDivisionError => e    # e変数に発生した例外を表すオブジェクトが代入
  p e           #=> <ZeroDivisionError: divided by 0> 
ensure          # エラーが発生しても実行する
  puts 3
end
puts 4

# 動きは 1　→　３　→　４　
```

（変数は「 e 」 じゃなくても大丈夫。）

例外が発生したらその直後の処理はされずにrescueの処理に飛びます。

`**例外ハンドラ**`　例外に対応するrescueブロックの部分のこと

<br/>

rescueの出力は以下のものもあります。（"`p e`"のところに同様に記述）

| 記述                    | 出力内容                                                   |
|:---------------------  |:---------------------------------------------------------:|
| p　"0では割り算できません" （出力したい内容を記述） | "０では割り算できません"                                        |
| p　e.class             | ZeroDivisionError                                          |
| p　e.class.superclass  | StandardError                                             |
| p　e.message           | "divided by 0"                                            |
| p　e.backtrace         | ["exception.rb:23:in `/'", "exception.rb:23:in `<main>'"] |
| STDERR.puts "０ですよ！！" | "０ですよ！！"(標準出力エラーに出力)                                 |

このように記述すると色々な情報を見ることができます。

# 例外処理の動きを見てみる

呼び出しもとで例外をキャッチできるようにします。

```Ruby
def test_exception(number)
  puts 2
  begin
    puts 3
    answer = 100 / number      # ここで例外が発生！！
    return answer
    puts 4
  rescue ZeroDivisionError => e
    puts 5
    raise e
  end
  puts 6
end

puts 1

  begin
    answer = test_exception(0)
    puts 7
  rescue ZeroDivisionError => e
    puts 8
    p e               # 最後に実行される
  end

# 動きは 1 → 2 → 3 → 5 → 8 → #<ZeroDivisionError: divided by 0>
```

発生した例外は呼び出しもとへ自動で伝わります。(戻される)

rescueブロック内でraiseを使用し意図的に発生させ、発生した呼び出し元に戻すことができます。

# 例外処理の継承関係

たくさんの例外クラスがあります。

![例外処理の継承.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/892628/749159c6-f4e3-120c-8a5f-6dd8193e69d0.png)

こちらに詳細が載っています。   [例外クラスリファレンス](https://docs.ruby-lang.org/ja/latest/library/_builtin.html)

>参考：　伊藤 淳一. プロを目指す人のためのRuby入門 言語仕様からテスト駆動開発・デバッグ技法まで

# 例

rescue部分を記述するときに気をつけなくてはいけないことがあります。


```Ruby
begin
    number = 0
    answer = 100 / number
rescue Exception => e
    puts "予期せぬエラーが発生しました"
    p e
rescue ZeroDivisionError => e
    puts "0ですよ！！"
    p e
end

#=> 予期せぬエラーが発生しました
#=> #<ZeroDivisionError: divided by 0>
```

Exceptionは全てのスーパークラス（親クラス）なので2番目のrescueは実行されずに先にエラーをキャッチし、初めのExceptionのエラー文章を出力します。

<br/>

...なので思った通りの文章を出力したいときは

<br/>

  :zap:**rescueの順番に注意！！**:zap:

<br/>

# まとめ


・・・と、今回はこのような感じで学習しました。

次回はもう少し深掘りしてみたいと思います。
Unity ShaderGraph レシピ #8 リムライト

#リムライト
![gif_animation_009.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/4a0eb046-33c6-6cb1-074b-4f3081852358.gif)


#作り方

### 1.輪郭の頂点を抽出
視線（ViewDirectionノード）と頂点法線（NormalVectorノード）の内積を取ります。
-1〜1の値が返ってきますが、0に近いほどカメラベクトルと直角に交差している状態です。

![スクリーンショット 2020-12-28 3.34.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/c3cc8848-44b6-d636-f063-b43034691331.png)

0付近を抽出したいので絶対値を取得(Absoluteノード)し、0付近にリムライトカラーを乗せたいのでOneMinusノードを使って0<->1を反転させます。

![スクリーンショット 2020-12-28 3.34.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/8a131f0f-86f2-c6ed-2221-c367e3c69ef5.png)


### 2.ライトカラーを適用
※EdgePowerは1をまとめたSubShaderGraphです。
![スクリーンショット 2020-12-28 3.35.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/7cb0bb7e-4ef1-6894-a0b3-e847b4aedb2b.png)

輪郭にいくほどライトカラーが濃くなるようにはできましたがこの状態では、補完がなだらか過ぎてリムライト感が出ません。
![スクリーンショット 2020-12-28 3.35.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/8cab55a4-510c-3f58-4245-601f20048195.png)

### 3.SmoothStep
SmoothStepノードを使って輪郭部分にだけ急激に色が乗るようにカーブを調整します。

![スクリーンショット 2020-12-28 3.43.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/ce71a7c9-9037-4bdc-5f0b-809a05a6c7c8.png)


###完成！
![スクリーンショット 2020-12-28 2.45.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/198311/2e9c6ed9-aebd-73e0-e81b-7775f41fd924.png)


---
その他のレシピは[ShaderGraphレシピ一覧](https://qiita.com/Teppy/items/73fc6141751a62f5265d)にまとまっています
ラズパイにjupyter notebookとspyderを導入

# はじめに
Raspberry Piのpytohn開発環境を整えたい。
今回は **Jupyter Notebook** と **Spyder** の導入法について。

# Jupyter Notebookの導入
参考サイト：[Python開発環境「Jupyter Notebook」をラズパイで動作させる](https://www.fabshop.jp/jupyternotebook_raspbianinst/)
何も問題が起きなかったため、今回は引用のみ。

- 起動方法

```
$ jupyter notebook
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963393/a5d7b3dc-46ef-ca08-4e89-95d44e726748.png)

OpenCVのインポートもできた。（元々インストール済み）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/963393/39fde730-d8f5-936b-c9cf-ce21810022a6.png)


# Spyderの導入
参考サイト：[Raspberry PiでPythonの統合開発環境(IDE)を構築する方法](http://wheelchairtext.net/program/1745/)

いつも通りパッケージの更新をしてから

```
$ sudo apt install spyder3
```

```
$ spyder3
```

で起動する。

あれ。開かない。

```
ImportError: cannot import name 'create_prompt_application' from 'prompt_toolkit.shortcuts' (/usr/local/lib/python3.7/dist-packages/prompt_toolkit/shortcuts/__init__.py)
```

と出てきた。
調べたところ、

```
$ pip3 install 'prompt-toolkit==1.0.15'
```

を行い、再び起動させたところ開けた。
バージョンの相性の問題だったのかな。もしくはそもそも入ってなかったか。

# まとめ
**Jupyter notebook** と **spyder** のインストールをしてみた。
使うかどうかはわからないけど、とりあえず。
**berry conda** も試してみたいなぁ。
ただ、大学で使ってるラズパイだからむやみやたらに色々できない。。
Unity1Week　あけるに参加したよって話

![bandicam 2020-12-28 02-04-16-090.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/295760/b1e18bcb-4d63-80cf-6c2c-4326d857fe63.jpeg)





久しぶりに　

Unityのゲームジャムに参加してみました。　



こちら　↓　

https://unityroom.com/games/takarabako




対応は　ＰＣオンリーになります。　

スマホからは遊べませんで。




操作方法は、左クリックのみです。　

９つの宝箱を見つけるだけなので、すぐにクリアできると思います。　



今回のゲームのお題は　あけるでしたが。　

あけるって結構難しくない？　

開ける　明ける　空ける　飽けるなどありますけど　

どれにしようかと悩んでいるだけで　２日もかかってしまった。　

まず、思いついたのが脱出ゲーム
【扉を開ける】でしたけど　

脱出ゲームは、みんな作ってくるだろうと思ったので　

それじゃいかんと思い、　急遽変更して　

そういえば、ちょうどいい宝箱の素材があったので

それで作ることに。　

本当はもっと、ワンピースっぽくしたかったけど　

時間が足りず、断念。　

【グランドライン作りたかったけどねー】





ゲーム自体はすぐに完成したけど　

ビルドエラーがすさまじかったのよ。　

クリスマスはずっと、エラーを直す作業をしていて　

完成したのが　日曜日の朝だったので　

ギリギリでしたわ。　
【締め切りは夜８時だったかな】

一番の反省点としては、　Unityの2020.1を使ったことですね。　

多分、2019.4LTSなら　出ないエラーが　

2020では出ていた。　　

ということで、　ゲーム開発するなら　素直にLTSを　

使ったほうがいいですね。　

新しいvrだと、色々とエラーが起きやすいです。

あとは、エラーを直す時間を残すことも必要です。　

絶対、ビルドエラーは出るものなので　

１週間でゲームを作るなら　

最初の５日間でゲームを完成させて

残りの２日ぐらいで、エラーを直したり　

ゲーム調整をしたりするのがベストでしょう。

何より大事なことは、　期限内に間に合わせることです。

それを守ってのゲームジャムですからね。
プログラミングがわからなすぎてプログラミングができなくてもいい道に逃げようとしていた話　Part1

#挫折を乗り越えた過去
こんにちは！現在渋谷のWeb系企業でlaravelやvue.jsなどを扱っている３年目のエンジニアです。
今でこそプログラミングの楽しさを実感して充実したエンジニアライフを送っていますが過去にプログラミングに挫折して別の業界・職種に転職しようとしていた経験があります。
その時の体験談（反省）と当時の自分へ伝えたいこと（戒め）を記したいと思います。

#プログラミングワカンネ
###パソコン音痴なのにエンジニアに
私は私立文系大学を卒業後、割と大きめの一部上場のSIerに入社しました。
プログラミング歴は皆無でなんなら機械音痴でエクセルなどを学ぶ大学のパソコンの授業では毎回ついていけず先生を困らせてしまうほど。タイピングももちろん人差し指でキーを見ながら入力していました。
就職活動ではSIerのビジネスモデルについて少し学んでガクチカのゴリ押しでなんとかエンジニアとして滑り込むことができました。
連絡くるのが遅かったので補欠だったのかな、、、
内定後はIT知識がゼロだったにも関わらず入社してから研修で学べばいいやと最後の学生生活を満喫していました。

###まあなんとかなるでしょ
入社後、同期が営業など含め６０名ほどいる環境で最初の1週間は旅館でビジネス研修の合宿があったり、週末にバーベキューをしたりまるで学校のように過ごしながら1ヶ月ほどマナーの研修を受けていました。

ビジネス研修ではプレゼンなども学びますが、自分はプレゼンテーションやグループワークの経験が多くあったためとても評価され、新聞記事の発表でもを経済専攻の知識を活かして研修を上手くこなして優越感に浸っていました。

そしていよいよ技術研修に入ります。文系とはいえある程度勉強は得意だし「まあなんとかなるでしょ」と呑気に研修を始めることになります。そのあとに地獄を見るとも知らずに、、、

###研修でゲームセット
技術研修に入って最初は全職種合同でコンピュータの基礎などを学びます。
サーバーとは？ネットワークとは？みたいなITパスポートで出題されるようなITの基礎知識を習得します。
この時点でPC音痴の自分はチンプンカンプン。
さーばー？？ぷろとこる？？でーたべーす？？
スマホを持っていないおばあさんがこれらを学んでいるのと同じ脳内だと例えるとイメージしやすいかもしれません。
家でも勉強はしてたものの基礎の基礎が抜け落ちていてこのレベルも理解できていませんでした。そしてテストでは営業や事務職の同期よりも点数は低く、再テストになることもしばしばありました。人事から取得するように言われていたITパスポートの試験に２回も落ちました。

多分ここまで聞いて「嘘だろ。。。なんでそんな奴がエンジニアになろうとしたんだよ。」とドン引きされた方もいるかもしれません。

そしていよいよプログラミング研修に入ります。
ITの基礎はよくわかんなかったけどプログラミングで挽回するぞ！と謎の自信を持っていました。

天のささやき「そんなの因数分解もわからないのに微分積分をするようなもんだぞ」

プログラミングの授業はまるでプログラミングを手取り足取り講義のように教えてくれるものだと思っていました。
まず教室で配られたのは山積みのJavaのテキスト。これからこんなにも講師が教えてくれるんだというワクワク気分と不安が混じっていました。
そして講師が一言放ちました。
「ではこのテキストに沿って演習をはじめてください。解けたら講師にレビューをもらってください。でははじめ！」

ぼく「...」

ぼく「演習？？まだ何も習ってないじゃないか」

まあいいや。その手取り足取りが全てこのテキストに書いてあってその通りにやればできるはずだ。
ペラッ📖

class~~~~ public~~~
setter~~~~     ?％＆＄∈〜〜〜〜〜〜〜〜　void~~~~~~
try~~~　catch~~~~~~~　extends~~~~
継承　修飾　条件分岐　コンパイル　eclipse オブジェクト指向　関数
?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈?％＆＄∈

ぼく「？？？！！！！」

ナンダコレ？？٩( ᐛ )وココハドコ？ワタシハダレ？
アラビア語？ダイイングメッセージ？？

ぼく「なんだこれ！！こんなのわかるわけない！！みんなもわからないよな！！！」

同期「ﾓｸﾓｸﾓｸﾓｸ」

同期「mokumokumokumoku」

講師「...」

ぼく「オワタ」


###こんなのできるようになるわけない
結局研修ではついていけず課題も同期の支えに~~(コピペにも　コンプラ)~~頼りながら結局なんでプログラムが動くのかわからず2ヶ月くらいJavaの基礎の研修を終えました。

「だめだこんなの一生できるわけないよ。。」

英語や歴史など学校の勉強がある程度やればできた自分の勉強に対する自信が一気に崩れ去りました。

「ああ、俺は世界一頭悪いわ」

ただ同期にもぼくと同じようについていけない人が何人かいました。
研修の途中で飛んで地元に帰った人もいました。

飛ぶ前日に彼に「来週ツーリング行こうぜ！！」と誘った際にちょっと悲しげな表情をしていたのを覚えています。
もう決心をしていたのでしょう。その顔はぼくが彼を見た最後の顔でした。


もう一人仲良しで同じようについていけない同期がいました。
彼はW大学で高学歴でしたがそれでもITが苦手だと言っていて少しホッとしました。

ぼく「まあプログラミングわかんねーよなー」

同期「うん。でも俺プログラミングやる部署じゃないし。サーバー系だからな」

ぼく「え？！」

そう。この会社はプログラミングを扱うソフトウェア系、ハードウェアを扱うサーバー系、運用保守などを行うセキュリティ系など様々なタイプの部署があり、エンジニアが存在していたのです。

そして奇しくも（？）ぼくの配属は、、、
プログラミングをやるソフトウェア系だったのです！！！！！！！！！！！！！
ドヤっ！！！！！\٩( 'ω' )و /　　　←何が？？？

プログラミングをしなければならない部署の配属にも関わらずプログラミングがわからない俺って一体、、、
不安に押しつぶされそうでした。

同期「そういえば来週からOJTだな」

研修は半年間ありまだ続くのですが、その合間に数週間現場体験のような形で配属の部署でそれぞれOJTをするというのが研修の一環でありました。

ぼく「ああ、、不安だ」

そしてこのOJTがきっかけで私はますますプログラミングから遠ざかっていくのです、、、

Part2に続く　（しばしおまちを）
managed Google Playを利用している他組織へアプリの限定公開

この記事は [CBcloud Advent Calendar 2020 22日目](https://qiita.com/advent-calendar/2020/cbcloud)の記事です。

CBcloud 徳盛です。
Kotlin Coroutineの記事を書こうと思いましたが、ちょっと年が明けそうなので一旦保留して、あまりこんな機会ないであろう、最近あった他組織へ限定公開する方法を書きます。

# 背景
managed Google Playを利用している組織から、弊社アプリを組織内で配信したいという話があったので調べた。

# 方法
1. リリース前にGoogle Play consoleの「詳細設定」より「managed Google Play」タブを選択し、「オンにする」を選択する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/451ea191-8e70-ddfa-077b-4a032c374367.png)

2. 非公開アプリへのアクセス権より組織を追加し、対象組織のIDを入力し、追加を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/124149/afc2b8d5-1b74-59ba-e568-dc89ae135857.png)

以上で、リリースしても通常のPlayStoreには公開されず、対象の組織のみインストールが行えるようになります。

# 参考
[Play Console から限定公開アプリを公開する](https://support.google.com/googleplay/work/answer/6145139)
Pythonでgif動画を作成

# 初めに
いろいろあってgif動画の出力をする機会があったので，軽くまとめました．かなり短いです．


# 関数
```python
import imageio

def make_gif(frames, filename, duration=1./60.):
    imageio.mimsave(filename, frames, 'GIF', **{'duration': duration})
```
引数は (高さ✕幅✕RGB) の画像 (uint8のnp.arrayとかを想定)の配列，出力ファイル名，gif動画のフレームレートです．gif動画の作成の実装はPIL.Imageを使うことが多いですが，自分の環境で何故かうまく行かなかったのでimageioで実装することになりました．

# おわり
誰かの役に立てば幸いです．


# どんな感じかみたい人用

```python
import imageio
import numpy as np

def make_gif(frames, filename, duration=1./30.):
    imageio.mimsave(filename, frames, 'GIF', **{'duration': duration})

if __name__ == "__main__":
    import gym
    frame = []
    env = gym.make('Seaquest-v0')
    obs = env.reset()
    for _ in range(500):
        obs, _, _, _ = env.step(env.action_space.sample())
        frame.append(obs)

    make_gif(frame, 'out.gif') 
```

出力はQiita上に貼れなかったのでないです．
【Unity】UnityEditorでARのデバッグができるアセットの紹介【AR Foundation Editor Remote】

#はじめに
AR開発時にいちいち端末ビルドするのが嫌だったので購入。
日本語の記事があまりなかったので自分用にメモしておきます。


#AR Foundation Editor Remoteの使い方
![ARFoundationEditorRemote.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/e3d0b513-99c6-bad8-fc93-7b367f5f1d8f.png)

##ARプロジェクトの準備
Assetをインポートする前に準備をしておきます。

###ARに必要なPackageのインストール
ファイルメニューのWindow > Package Managerから以下の2つをインポートします。
・AR Foundation(4.1.1)
・ARKit XR Plugin(4.1.1)
※「AR」で検索すると見つかりやすいです。
![スクリーンショット 2020-12-27 23.46.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/7813237f-c699-3057-41c6-df2ff4fa8934.png)

###XR Plug-in Managementの設定(1)
Project SettingsからXR Plug-in Managementの設定をします。
利用プラットフォームのInitialize XR on StartUpとPlug-in ProvidersのARKit(Androidの場合はARCore)にチェックを入れます。
![スクリーンショット 2020-12-28 0.33.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/24a5117c-9bb1-82ad-c9b4-636cc45bc01e.png)

※この設定の前にAssetをインポートするとARFoundationRemoteのPlug-in Providersが表示されないっぽい？
詳しい方いたらコメントください。


###Assetのインポート
下記URLからAssetを購入して、ARFoundationEditorRemoteのPackageをインポートします。
https://assetstore.unity.com/packages/tools/utilities/ar-foundation-editor-remote-168773

###XR Plug-in Managementの設定(2)
Packageが正常にインポートされていればXR Plug-in Management > PC,Mac & LinuxStandalone Settings > Plug-in ProvidersにARFoundationRemoteが出現するのでチェックを入れます。
![スクリーンショット 2020-12-28 0.47.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/eb2a3ca3-fd3b-47ca-08e1-92a4b0661220.png)

※うまく表示されなかった場合は下記の方法を試してください。(僕はこれで解決しました)
1.「Assets > XR > Loaders > AR Foundation Remote Loader.asset」の削除。
2.「Pligins > ARFoundationRemoteInstaller > Installer > Delete AR Companion app build folder」ボタンをクリックした後に「Un-install Plugin」ボタンをクリック。
3.「Assets > Plugins > ARFoundationRemoteInstaller」を削除。
4.ARFoundationEditorRemoteのPackage再インポート。

###プラットフォームを変更
ファイルメニューのFile > Build Settingsから利用したいプラットフォームにスイッチします。(今回はiOSを選択)
![スクリーンショット 2020-12-28 1.11.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/5751a6a1-5105-1567-303d-7d193addba24.png)

###端末に専用アプリのインストール
ビルドしたい端末とPCを接続し、「Pligins > ARFoundationRemoteInstaller > Installer > Install AR Companion App」をクリックします。
![スクリーンショット 2020-12-28 1.14.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/96931eff-55b4-a16f-3d29-a946ff6c9164.png)
成功するとUnityビルドがはじまりXcodeまで飛ばしてくれるので、そのまま端末へビルドしましょう。
失敗するとエラーがでますがAssetが丁寧なエラーを出してくれるので従いましょう。

###IPアドレスの入力
「Assets > Plugins  > ARFoundationRemoteInstaller > Resources > Settings.asset」のAR Companion App IPに際ほどビルドしたアプリの起動画面に表示されているIPアドレスを入力します。
![スクリーンショット 2020-12-28 1.47.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/d318acbb-0d4e-23f0-b358-299dae2eed85.png)

####アプリ画面
![IMG_0001.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/293639/1cb15212-a785-46cb-487f-34a57bd4eb99.png)

###UnityEditorで実行
準備が完了したのでUnityEditorで実行します。
「Assets > Plugins > ARFoundationRemoteInstaller > Scenes > Examples」にSampleシーンが用意されているので今回は`AnchorsExample.unity`を使ってみます。

アプリを起動したままUnityEditorで再生すると、端末でタップした位置にはアンカーが配置され正しく動いていることが確認できます！
[備忘録]  Excelマクロ チェックボックス(ActiveX コントロール)で指定したシートを初期化

###◇Excelマクロ チェックボックス(ActiveX コントロール)で指定したシートをクリアで初期化する

###〇参考
　↓基本処理
　・Excel マクロ　チェックボックス(activateX コントロール)を使用した処理分岐
　　https://qiita.com/ema_gencyCall/items/55fce401436134bd2555

###〇事前準備
　・初期化対象のシートを準備
　　今回は以下のようなフォーマットを想定。各シートの2行目移行をクリアする。
![jizen3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730953/878ab8b4-4e7c-e066-bc14-7a60b7c2b226.png)
　
　・初期化対象を選ぶメインシートはこんな感じ。
![jizen4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/730953/38b859d3-df47-4e59-c099-4f090becfa6c.png)


###〇ソース

Option Explicit

'シート名
Const SHEET_NAME_MAIN = "sheet1"
Const SHEET_NAME_K = "k"
Const SHEET_NAME_Y = "y"
Const SHEET_NAME_S = "s"
Const SHEET_NAME_M1 = "m1"
Const SHEET_NAME_M2 = "m2"

Sub selectSheetProcess()

Dim rc As Integer

rc = MsgBox("初期化処理開始しますか？", vbOKCancel)

If rc = vbCancel Then

  MsgBox ("処理中断。")
  Exit Sub

End If


'mainシートをactive
Worksheets(SHEET_NAME_MAIN).Activate

'以下チェックボックスの状態で処理分岐
'チェックが入っていたらシート初期化処理を呼び出す

'sheet:k
If ActiveSheet.checkBox_k.Value = True Then
  Call sheetClear(SHEET_NAME_K)
End If

'sheet:y
If ActiveSheet.checkBox_y.Value = True Then
  Call sheetClear(SHEET_NAME_Y)
End If

'sheet:s
If ActiveSheet.checkBox_s.Value = True Then
  Call sheetClear(SHEET_NAME_S)
End If

'sheet:m1
If ActiveSheet.checkBox_m1.Value = True Then
  Call sheetClear(SHEET_NAME_M1)
End If

'sheet:m2
If ActiveSheet.checkBox_m2.Value = True Then
  Call sheetClear(SHEET_NAME_M2)
End If

MsgBox ("処理終了。")

End Sub

'シート初期化処理
Sub sheetClear(sheetName As String)

Dim clearRowRange As String

'クリア範囲を2～シート最大行に設定
clearRowRange = "2:" & Rows.Count

'指定シートの2行目以降の値をクリア
'クリア対象：値と数式
Worksheets(sheetName).Range(clearRowRange).ClearContents

End Sub

〇結果
チェックを入れたシートが初期化される！
交流電力を計測する(3)：回路

IoT開発スタートブック の第6章にしたがって、
交流電力を計測する装置をつくってみる。

電流センサで取得した抵抗の電圧を、ADコンバータを介してArduinoに伝達する回路。

#ADコンバータの使用方法
製品ページ
MCP3004：https://www.akizukidenshi.com/catalog/g/gI-11987/

ピン|意味
---|---
Vdd|電源電圧。動作電圧は2.7～5.5V。
Vref|基準電圧。アナログ入力の電圧として使用する。
AGND|アナログGND
CH0-CH7|アナログ入力
CLK|マイコンとのSPI通信用CLKピン
Dout|マイコンとのSPI通信用OUTピン(MISO)
Din|マイコンとのSPI通信用INピン(MOSI)
DGND| デジタルGND
CS/SHDN|チップセレクト・シャットダウン。通信初期化時はlow。AD変換中はhighとする。

Vdd、Vrefは3.3V
GND類はArduinoのGNDと接続
CH0は電流センサ抵抗と接続
CLK、Dout、DinはArduinoのSPIピンと接続
CS/SHDNはArduinoのGPIOと接続

#Arduinoとの接続
実際に配線した写真

![unnamed.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/581044/3b001628-2d65-899d-973a-403f59f58848.jpeg)

次回、実際にプログラムを書き込んで動作させて終わる予定。
ランチメンバーをランダムでいい感じに選ぶGASスクリプト




![スクリーンショット 2020-12-28 2.10.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/112929/8f90e8a8-454e-8e70-e817-3c46a6435f05.png)

以下のようなURLをクリックするだけで、規定の配列から何人か選んでくれる。

```
https://script.google.com/macros/s/XXXXX-XXXX/exec
https://script.google.com/macros/s/XXXXX-XXXX/exec?num=2
https://script.google.com/macros/s/XXXXX-XXXX/exec?num=3
https://script.google.com/macros/s/XXXXX-XXXX/exec?num=4
```

以下のようなスクリプトをGASにいれて、Webアプリケーションとして公開したらOK

```js
function doGet(e) {
  if(!isOurGsuiteUser()) {
    return resText("ログインアドレスが違います");
  }

  postSlackMessage(getMessageArray(e).join("\n"));

  return resText("OK!");
}

function testSlack() {
  const array = getMessageArray();

  postSlackMessage(array.join("\n"))
}

function getMessageArray(e) {
  const num = getNum(e);
  const array = [
    getLoginUser() + `さんからのリクエストでランダムに \`${num}人\` 選ばれました :tada:`,
    "",
    "```",
    ...(getMember(num)),
    "```",
    "",
    "ランチとか1on1とか楽しんできてください:+1::star:",
  ];
  
  return array;
}

function postSlackMessage(message) {
  var postUrl = 'https://hooks.slack.com/services/BBBBB/XXXX/????????'; // webhookurlは自分のチャンネルで取得してください
  var username = 'Choice BOT';
  var icon = ':slightly_smiling_face:';

  var jsonData =
  {
     "username" : username,
     "icon_emoji": icon,
     "text" : message
  };
  var payload = JSON.stringify(jsonData);

  var options =
  {
    "method" : "post",
    "contentType" : "application/json",
    "payload" : payload
  };

  UrlFetchApp.fetch(postUrl, options);
}

/**
 * memberを指定の数だけ返す
 */
function getMember(num){
  const member = [
    'Aさん',
    'Bさん',
    'Cさん'
  ];

  return shuffle(member).slice(0,num);
}

/**
 * 何人にするか
 * 基本は1人
 * @return number
 */
function getNum(e) {
  if (!e) {
    return 1;
  }

  const num = parseInt(e.parameter.num);

  return isNaN(num) ? 1 : num; 
}

/**
 * ログインユーザーのアドレスを確認して弊社社員か確認する
 */
function isOurGsuiteUser() {
  const user = Session.getActiveUser();
  const email = user.getEmail();

  return email && email.split("@") && email.split("@")[1] === "gmail.com";
}

/**
 * ログインユーザーを取得
 * return Sting
 */
function getLoginUser() {
  const user = Session.getActiveUser();
  const email = user.getEmail();

  if (email && email.split("@") && email.split("@")[0]) {
    return email.split("@")[0];
  }

  return "Who??";
}


/**
 * responceのラッパーにしようとしている
 */
function resText(text) {
  return ContentService.createTextOutput(text)
}


/**
 * 配列をシャッフルする
 */
function shuffle(array) {
  for (let i = array.length - 1; i >= 0; i--) {
    const j = Math.floor(Math.random() * (i + 1));
    [array[i], array[j]] = [array[j], array[i]];
  }

  return array;
}

```