OmniAICreator/Qiita-1.07M huggingface dataset:
RubyGems, Bundler, Gemfile.lock, 開発者, 運用者, それぞれの声

正確な記述ではないのですが、上記の件名について、砕けた感じで書いていきます。

# 1. library 開発者

## 1.1 古(いにしえ)の library 開発者

 * 俺が作った library "AAA"、便利だから世の中に公開しよう。
 * .tar.gz で圧縮して、自分の web site に置いておこうか。
 * 世の中のみんなに存在を知ってもらうことは難しいなぁ。
 * update したら、利用者も update してくれるだろうか。手間がかかるだろうなぁ。
 * 実はこの "AAA" 1.0 は、別作者の "BBB" 2.3 を同梱しているんだけど、"BBB" 2.4 が出たらそっちと組み合わせて使ってほしいなぁ。

## 1.2 RubyGems 以降の library 開発者

 * 俺が作った "CCC"、.gemspec さえ書いて固めれば RubyGems という仕組みでかなり自動的に install できるんだって? それは便利だ。
 * しかも、この RubyGems という仕組みのために、rubygems.org という site まで用意してくれているんだって? 早速利用しよう。
 * この "CCC" は別作者の "DDD" に依存しているんだけど、これも .gemspec に書いておけば `gem install CCC` で勝手に依存を解決してくれるんだって? 至れり尽くせりだなぁ。

## 1.3 少々ずぼらな library 開発者

 * 俺が作った "EEE" は "FFF" に依存しているから、.gemspec に `add_dependency "FFF"` って書いておこう。
 * いや、待てよ、俺が今の "EEE" を開発して自分の手元で test した時、"FFF" は 3.4 だったから、 `add_dependency "FFF", ">= 3.4"` と書いておこう。そうすれば、FFF 3.4 未満で "EEE" を動かそうとした人から「動きません」という質問をされることもなくなる。
 * 何? 「"FFF" 10.0 や "FFF" 20.0 で動かなくなるかも」だって? そうかも知れないが、"FFF" の update を俺自身がずっと追いかける気はないよ。うまく動かなくなったら、Gemfile を自作して Bundler で対応してくれ。

## 1.4 とてもきっちりした library 開発者

 * 俺が作った "GGG" は "HHH" に依存しているんだけど、実は "HHH" の作者も俺だから、依存する version 指定は `add_dependency "HHH", "= 4.0.1"` ときっちり固定してしまおう。どうせ "GGG" 4.0.2 と "HHH" 4.0.2 は同時に release する予定だし。

## 1.5 中庸な library 開発者

 * 俺が作った "III" は "JJJ" に依存しているんだけど、.gemspec での version 指定をどうしようかな。
 * 現行の "JJJ" 5.1.2 なら確実に動作することは分かってる。多分、"JJJ" 5.1.3, 5.1.4, 5.1.5, … というように 5.1.X なら恐らく正しく動作するだろう。
 * でも、"JJJ" 5.2.0 になったら不安だなぁ。
 * そうだ、 `add_dependency "JJJ", "~> 5.1.2"` と指定しよう。

## 1.6 database を使う library の開発者

 * 俺が作った "KKK" は SQLite の gem か PostgreSQL の gem のどちらかが必須なんだけど、どちらか片方があればいいから、.gemspec に書くわけにはいかないなぁ。
 * まあ、Gemfile の例を同梱しておいて、あとは利用者に選ばせるか。

# 2. application 開発者

 * この "III" って便利だなぁ。この "III" を使って、application "mmm" を作ってみた。
 * でも、"III" が依存している "JJJ" の 5.1.3 までは処理上の問題があって、"JJJ" 5.1.4 以降じゃないと安心して使えないから、Gemfile に `gem 'JJJ', '>= 5.1.4'` と書いておこう。
 * え、「既存の "III" の .gemspec を書き換えたらいいんじゃないか」だって? 不可能じゃないけど、それは大仕事だ。Gemfile 1枚を記述するだけで済むなら、それでいいじゃないか。

# 3. application 運用者

## 3.1 application 配置者

 * application "mmm" をわが社で導入することになった。
 * なるほど、「bundle install」と実行すれば、Gemfile が許容する範囲で最新の libraries を揃えてくれるのか。
 * 「bundle install」の実行が終われば、現在の環境が Gemfile.lock に記録されるんだな。
 * おお、"JJJ" 7.0.0 が入ってきた? まずいな、取引先 server との protocol の都合で、6.x.x じゃないといけないから、Gemfile を書き換え、Gemfile.lock を削除して、再度 `bundle install` しておこう。
 * "JJJ" 7.0.0 が入っていても、 `bundle exec` でちゃんと "JJJ" 6.x.x が呼び出されるから安心。

## 3.2 application 運用者

 * え? 支店 X の server だけ今朝から動かない? RAID の警告を無視して使い続けていたって? 物理交換かな。昨夜の締め処理で backup が取れているのが幸いだ。
 * 無事に稼働していた時の Gemfile.lock があるから、これを使おう。Gemfile.lock のおかげで、問題が発生しても切り分けが少し楽になる。
 * `bundle update` したいだって? ダメダメ、まずは Gemfile.lock を使って旧状態に確実に復帰させることが先。どうしても `bundle update` したいなら、復旧後に自己責任でどうぞ。

# 4. 終わりに

自分で読み返してみて、あまりいい文章じゃないですが、誰かの参考になれば幸いです。

この文章を書いたきっかけは、RubyGems は依存関係を解決してくれないから Bundler が存在するという偽情報が広まってきていることに気付いたからです。RubyGems も Bundler も、どちらも依存関係を解決してくれます。ただ、その使われる階層が違うのです。

この文章に誤りを発見したら、ご指摘いただくか、または別の場所でご批判下さい。
Pure-FTPd + Ubuntu 18.04 でFTPサーバを建てる

# TL;DR

- **`/etc/pure-ftpd/pure-ftpd.conf`は罠**
- **設定は`sudo tee /etc/pure-ftpd/pure-ftpd.conf/(項目名) <<< (設定値)`で**
- 本記事では最低限+αの設定方法しか述べません

# きっかけ

- GCEでf1-microのインスタンス作って最低限の設定でFTPサーバを立てたかった
- 有名な競合ソフトのvsftpdはFTPSで繋ぐとユーザ認証完了直後の挙動がおかしいのでパス

# インストール

お茶の子さいさい、ここで迷うことはないでしょう

```bash
sudo apt install -y pure-ftpd
```

# Pure-FTPdの設定

ここが地味に地雷原です。TL;DRにも書きましたが、**設定ファイルに思われる`/etc/pure-ftpd/pure-ftpd.conf`はただのハリボテです。**これを変更しても、systemdで(すなわちサーバ起動時に)起動するPure-FTPdのデーモンには設定が反映されません。どう設定すれば反映されるのでしょうか。

反映させるには、**`/etc/pure-ftpd/conf`の中に設定項目の名前で、設定値を内容としたファイルを作ることが必要です。**それでは、私が既定値から変更した設定内容と、その理由を紹介していきます。また、以下のコマンドは、予め`cd /etc/pure-ftpd/conf`した後で実行したものです。

なお、インストール時の初期設定は、以下の通りになっています。

```
MinUID = 1000
UnixAuthentication = no
NoAnonymous = yes
FSCharset = UTF-8
AltLog = clf:/var/log/pure-ftpd/transfer.log
PAMAuthentication = yes
PureDB = /etc/pure-ftpd/pureftpd.pdb
TLSCipherSuite = HIGH
```

## FTPS関連

```bash
sudo tee TLS <<< 3
sudo tee TLSCipherSuite <<< AESGCM+TLSv1.3:AESGCM+ECDHE+TLSv1.2
```

`TLS = 3`は、FTPSをサポートしないクライアントからの接続を切ります。Ubuntuには自動発行されたオレオレ証明書(後述)がありますし、ドメインを予め取っておけば、Let's Encryptの証明書がタダで取れます。オレオレ証明書でも、検証目的程度ならば、FTPクライアント次第ではどうにかなります。なお、`TLS = 1`にすると、TLSなしのFTPでのログインも許可します。

`TLSCipherSuite`は、デフォルトが`HIGH`という高セキュリティを謳いながらセキュリティ的に微妙な暗号スイートを含む設定値を使いたくなかった・今どきTLS1.2に対応していないクライアントはおかしいのが変更理由です。

## PASVモード関連

```bash
sudo tee PassivePortRange <<< '60000 60099'
sudo tee MaxClientsNumber <<< 50
```

50台の分ポートを確保しました。検証目的ならば、もっとポート数を減らしてもよいでしょう。(例: 60000～60009)
ポート範囲は、明示的に指定してファイアウォールの設定難度下げ・FW開放ポート数を減らすことによるセキュリティ向上を狙いました。



## セキュリティ関連

以下はユーザ自身のホームディレクトリ以外のディレクトリにアクセスすることを許可する場合のみ設定してください。

```bash
sudo tee ChrootEveryone <<< no
```

# TLS証明書の設定

TLS証明書・秘密鍵ファイルへの既定のパスは、`/etc/ssl/private/pure-ftpd.pem`にハードコーディングされています。オレオレ証明書を使用する場合、

```bash
sudo cat /etc/ssl/private/ssl-cert-snakeoil.key /etc/ssl/certs/ssl-cert-snakeoil.pem | sudo tee /etc/ssl/private/pure-ftpd.pem
```

で一発です。きちんとした証明書を使う場合は、秘密鍵→証明書の順番で`cat`します。証明書のパスを変更する場合、以下の設定のどちらかが必要です。

```bash
sudo tee CertFileAndKey <<< "(証明書単独) (秘密鍵)"
sudo tee CertFile <<< (合体済証明書)
```

# ファイアウォールを開ける

`PassivePortRange`で指定した範囲のポート・21番ポートを開けてください。以下はUFWを使う場合の設定です。

```bash
sudo ufw allow ftp
sudo ufw allow 60000:60099/tcp
```

# FTPユーザの作成

GCEなどを利用するなど、常用しているユーザにパスワードがない場合に必要です。

```bash
sudo useradd (ユーザ名)
sudo passwd (ユーザ名)
```

接続ユーザを制限するなど、さらなるセキュリティを求める場合は、LDAPを使用する・仮想ユーザを作るなどしてください。本記事では解説しません。

# Pure-FTPdの設定反映

```bash
sudo systemctl restart pure-ftpd
```

# 起動確認

```bash
ss -ltn
```
パルスカウンターを作ってみる

#パルスカウンターを作ってみる
m5stackを使ってパルスカウンターを作ってみました。

m5stackについて調べた自分の記事のテスト編になります。
>m5stackで遊ぼう
https://qiita.com/zasshyu6/items/35a1048a9781bdcfebb7

##開発環境
- windows 10 Home 64bit 
- Visual Studio Code 1.36.1
- PlatformIO
    - 使用言語はarduino


##仕様

- 動作仕様
    - `5usec`で入力の変化を取得してパルスをカウントする。
    - 入力モードは5種類
        - A/Bパルス入力　-> 1/2/4逓倍
        - +/-パルス入力
        - DIR/PLS入力
    - 最高取得周波数は`100kHz`
        - `5usec`周期なので無茶苦茶遅い・・・　



- ボタンとか入力の設定
    - `Button A`でCOUNT START/STOP
    - `Button B`で1/2/4逓倍と+/- pulse入力 ,DIR/PLS 入力切替
    - `Button C`でカウントリセット
    - `GPIO21`が`A_INPUT`,`GPIO22`が`B_INPUT`
    - 入力は内部で`PULL-UP`する
    - 使用するエンコーダは千石電商で購入`EC12シリーズ`
        - https://www.alps.com/prod/info/J/HTML/Encoder/Incremental/EC12E/EC12E2430404.html


##やってみた

いつも通りソースはgithubに上げました。今回は分割しました。
https://github.com/zasshyu66/m5stack_Study/tree/master/pulseCounter

多分使われないと思いますが・・・
最高周波数の確認などはしていないので自己責任でお願いします。

今回は、スレッドを2つに分け、一つはボタン確認、もう一つは画面表示に使用しています。
やってて気づいたのですが、スレッドを定周期で回すために`vTaskDelayUntil`を使用しましたが、
どうやらWDTのほうへ処理を返していないのか、すぐにリセットがかかってしまいました。
`vTaskDelay`か`delay`を入れてあげないとリセットがかかるようです。
どういう動きになっているのか・・・

##次にやること
サーボモータを動かそうと思いましたが、最近softAPを使ってみて楽しかったのと
ESP32が持っているパルスカウンターを使ってみたいといったことが出てきたので
`ESP-IDF`にチャレンジしてみたいと思います。
UnityのWebGLビルドはWeb Server for Chromeで簡単に確認できるよ

# はじめに

UnityでWebGLビルドした時にさくっとブラウザで確認したいものですがChromeはセキュリティの関係でローカルファイルを開いても動作しません。
以下の解説のように`-allow-file-access-from-files`を起動時オプションに渡せば回避できますが常駐しているChromeを終了させなければならなかったりと面倒です。

* [Chrome でローカルファイルを読み込むためにセキュリティポリシーを回避する方法](http://neos21.hatenablog.com/entry/2018/01/06/080000)

そこでChromeから簡易Webサーバーを起動できる[Web Server for Chrome](https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb)を使えばさくっと確認できるので紹介します。

# 使い方

1. Chromeのブックマークバー左端のアプリからWeb Serverを開きます。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/0263fd36-4d01-926a-b0c5-b383bf68d4a8.png)
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/3c8ab4d3-3e67-c334-2494-35b764c99b19.png)
1. 設定画面が開くので`CHOOSE FOLDER`からWebGLビルドしたフォルダを選択します。
1. Web Serverのスイッチをオンにしてサーバーを起動します。
1. `http://127.0.0.1:8887`のリンクをクリックします。

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/8995/c6a6482a-414c-b339-fe1a-5e11cfbf87c5.png)

以上の手順でWebGLビルドしたページをChromeで確認できます😊

# リンク

* [Web Server for Chrome](https://chrome.google.com/webstore/detail/web-server-for-chrome/ofhbbkphhbklhfoeikjpcbhemlocgigb)
* [Chrome でローカルファイルを読み込むためにセキュリティポリシーを回避する方法](http://neos21.hatenablog.com/entry/2018/01/06/080000)
制限環境下でのサボりソフト開発_01

#制限環境下でのサボりソフト開発_01
携帯持ち込み禁止の職場における有意義な暇つぶしの為のソフト開発をしたい
今回は、最低限の骨組みだけ作る
##1. 職場における制限
- 職場の業務用端末にソフトウェアを勝手にインストールしてはいけない
- 業務用端末はインターネットから完全に切り離されている
- 可搬記憶媒体（ＵＳＢメモリ等）を差し込んではいけない
- 未知のexeファイルはセキュリティソフトに引っかかる
- ブラウザはＩＥ１１のみ

##2. 開発環境
- Visual Studio2015（会社の端末に入ってた）
- サクラエディタ（上に同じ）

##3. 上記制限を鑑みてやれそうなこと
- HTML5のCanvas機能で面白フラッシュもどきを作る
- 上記をHTA化してなんちゃってソフトにする

##4. すごく大雑把な説明
###(1) HTML5のCanvas
Webページ上に**JavaScript**で図形を描いたり、動かしたりできる
###(2) HTA
HTML Application
**HTML**と**JavaScript**でアプリケーション作れる
##5. 定型もどき
sample.hta

~~~html
<!DOCTYPE html>
<html lang="jp">
<head>
    <meta charset="UTF-8" http-equiv="X-UA-Compatible" content="IE=10"><!--VBSで弄るならいる-->
    <title>HTAの骨組み</title>
</head>
<body>
    <div style="position: absolute; top: 0px; left: 0px;">
        <canvas id="canvasOne" width="800" height="600">
            Your browser does not support HTML 5 Canvas.
        </canvas>
    </div>
</body>
</html>
~~~

なお、htaをブラウザでデバッグする方法は知らないので、デバッグの都度htmlに拡張子を変更する
##6. 参考
[Markdown記法 サンプル集](https://qiita.com/tbpgr/items/989c6badefff69377da7)：記事の書き方
書籍
「HTML5 Canvas」オライリー・ジャパン・・・難解
one_Sgp4ライブラリでウインドウをICSで書き出す

[GitHub - 1manprojects/one_Sgp4: C# SGP4 orbit prediction Library](https://github.com/1manprojects/one_Sgp4)

NuGetで読み込める。

***

試しに複数の衛星を読み込んでパスを計算してみる。結果はICSで書き出す。

`Coordinate`で地上局の位置を設定する。Lat/Lngは度、Hgtはメートル。

今回は「起動した時に属する週(日-土)の7日分のウインドウを計算する」という挙動。このあたりはDateTimeやEpochTimeで設定する。EpochTimeはDateTimeと似て非なるものなので、DateTimeで設定して渡すほうが楽そう。
one_Sgp4はUTCをベースにしている。
ICSもUTCが基本だが、Zを省略すればローカル時間で読み込んでくれるので、デバッグの容易性のためにローカル時間で吐き出す。

今回はLINQのフィルタで最大仰角20度以上だけを書き出した。


```csharp
Coordinate observer = new Coordinate(43, 142);

DateTime startDate = DateTime.Now;
startDate = new DateTime(startDate.Ticks - startDate.Ticks % (TimeSpan.TicksPerDay));
startDate = new DateTime(startDate.Ticks - (int)startDate.DayOfWeek * TimeSpan.TicksPerDay);

DateTime endDate = startDate.AddDays(7);

List<Tle> tleList = ParserTLE.ParseFile("tle.txt");

EpochTime startTime = new EpochTime(startDate);
Dictionary<Pass, Tle> dic = new Dictionary<Pass, Tle>();

int maxNumberOfDays = (int)Math.Ceiling((endDate - startDate).TotalDays);

foreach (Tle tle in tleList)
{
    foreach (var v in SatFunctions.CalculatePasses(observer, tle, startTime, 200, maxNumberOfDays))
    {
        dic[v] = tle;
    }
}

using (StreamWriter sw = new StreamWriter("pass.ics", false, Encoding.UTF8))
{
    TimeSpan utcOffset = DateTimeOffset.Now.Offset;

    sw.WriteLine("BEGIN:VCALENDAR");
    sw.WriteLine("VERSION:2.0");

    foreach (var v in
        dic
        .Keys
        .Where(a =>
            a.getPassDetailOfMaxElevation().elevation > 20)
        .Where(a =>
            a.getStartEpoch().toDateTime() < endDate)
        .OrderBy(a =>
            a.getPassDetailOfMaxElevation().time.toDateTime()))
    {
        sw.WriteLine("BEGIN:VEVENT");
        sw.WriteLine("DTSTART:" + (v.getStartEpoch().toDateTime() + utcOffset).ToString("yyyyMMddTHHmmss"));
        sw.WriteLine("DTEND:" + (v.getEndEpoch().toDateTime() + utcOffset).ToString("yyyyMMddTHHmmss"));
        sw.WriteLine("SUMMARY:" + dic[v].getName());
        sw.WriteLine("END:VEVENT");
    }

    sw.WriteLine("END:VCALENDAR");
}
```

Win10のカレンダーに読み込むとこんな感じになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264452/f32c3ec4-4710-4857-4f57-033092efce78.png)

***

精度とかは評価してないけど、ウインドウの目安にするくらいなら問題なさそう。
Ubuntu 18.04 への nvidia-driver2 のインストール

# 環境
OS: Ubuntu 18.04.3 LTS (Bionic Beaver)
GPU: Tesla T4

# インストール

```sh
# Install required packages
sudo apt update && \
sudo apt install -y \
    apt-transport-https \
    ca-certificates \
    curl gnupg-agent \
    software-properties-common \
    ubuntu-drivers-common

# Install NVIDIA Driver
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo ubuntu-drivers autoinstall

# Install Docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io -y

# Install NVIDIA Docker2
curl -sL https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -sL https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt update
sudo apt install nvidia-docker2 -y

# Set default runtime
sudo sed -i -e '2i \    "default-runtime": "nvidia",' /etc/docker/daemon.json

# Add user to docker group
sudo gpasswd -a $USER docker

# Reboot
sudo shutdown -r now
```
LightsailのLAMP環境で常時SSL化

## はじめに
LightsailのLAMPブループリントを使ったインスタンスを常時SSL化したく、
certbotのインストール手順を参考にしつつ、作業していたのですが
certbotを動かす段階で以下のようなエラーに遭遇しました。
<pre>
Error while running apache2ctl graceful.
httpd not running, trying to start
Action 'graceful' failed.
The Apache error log may have more information.

AH00558: apache2: Could not reliably determine the server's fully qualified domain 
name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this mes
sage
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:8
0
no listening sockets available, shutting down
AH00015: Unable to open logs
</pre>
https://certbot.eff.org/lets-encrypt/ubuntuxenial-apache

もう少し探せばきちんとした解決策があるのかもしれませんが、
私が調べた限りの情報を共有できればと考えております。


## 解決策
bitnamiのドキュメントによると、
let's Encryptを使うためのツールが準備されているようです。
https://docs.bitnami.com/aws/infrastructure/lamp/administration/generate-configure-certificate-letsencrypt/

ただ、LightsailのLAMPには同梱されていないように見受けられ、
以下のドキュメントを参考にツールのインストールを行いました。
https://docs.bitnami.com/installer/how-to/understand-bncert/
<pre>
cd ~
wget -O bncert-linux-x64.run https://downloads.bitnami.com/files/bncert/latest/bncert-linux-x64.run
sudo mkdir installdir
sudo mkdir installdir/bncert
sudo mv bncert-linux-x64.run installdir/bncert/
sudo chmod +x installdir/bncert/bncert-linux-x64.run
</pre>

最後に、ツールを実行します。
<pre>
sudo ./installdir/bncert/bncert-linux-x64.run
</pre>
1. ドメイン名を聞かれます。入力してEnterを押してください
2. サーバーに設定を加える旨、同意を求められるので特に何もなければ[Y]を入力後、Enterを押してください。www->non wwwへのリダイレクトが不要など、除きたい設定があれば[No]を入力し、必要な設定を取捨選択してください。
3. ご自身のメールアドレスを入力してください
4. Let's Encryptを使う上での同意書のURLと、それに同意するか質問されます。pdfを読んだ後[Y]を入力し、Enterを押してください。
5. しばらくすると設定が完了した旨メッセージが表示されます。Enterを押してください。

## 最後に
以上で設定が完了します。
お使いのドメインにhttpsでアクセスし、証明書が有効になっていることを確認してください。
また、crontabにコマンドが挿入され、期限が切れる前に自動的に証明書をアップデートする仕組みとなっているようです。
自身の手順の備忘録となってしまいますが
もしも同じ問題でハマっている方のヒントになれば幸いです。
Salesforce DX Project Template for Remote Development on VS Code

こんにちは。先日の [@ntotten さんのツイート](https://twitter.com/ntotten/status/1167487823697432576) に刺激を受けて、VS Code の Remote Development 機能を使った Salesforce 開発環境の雛形を作ってみました。

- [takahitomiyamoto/vscode-remote-sfdx-project](https://github.com/takahitomiyamoto/vscode-remote-sfdx-project)

必要な設定や拡張機能を事前に定義してあって、Docker コンテナを起動するときに自動でやってくれます。複数の開発端末で同じ設定をするときに便利ですね。また、途中でおかしくなった場合にはRebuildすれば最初の設定から再開できるので助かりますね。

今後も細かい調整をし続けていくので、ご興味あるかたはリポジトリをwatchしていただければと思います。それでは。

## 公式
https://forcedotcom.github.io/salesforcedx-vscode/articles/user-guide/remote-development
Raspberry Pi 3B×Ubuntu 18.04　wireless deviceのCountryCodeをきちんと設定しよう

会社の自由研究の一環でラズパイにUbuntuをセットアップしてて、無線LANの設定でハマったことの備忘です。

# 環境
* Raspberry Pi 3B
* Ubuntu 18.04.3(ARMHF)
    * [ラズパイ用のイメージ](http://cdimage.ubuntu.com/ubuntu/releases/bionic/release/ubuntu-18.04.3-preinstalled-server-armhf+raspi3.img.xz)を使いました。

# 何がおこったか
wirelessデバイスはきちんと動作していて、周辺のアクセスポイントは検出できるものの、自宅のアクセスポイントの検出ができなかった。

# 何が原因だったか
* 自宅のwifiの電波がchannel 14で飛んでた
* `iw reg get`で確認すると`country 00`となっていた。
    * この状態だと使用できるchannelが11までになるらしい
    * 国によって使えるチャネルが違うらしいのでこうなってるみたい

# 対処法
以下のファイルを編集します。
`vi /etc/default/crda`

以下のように`REGDOMAIN`の右辺を`JP`にします。
`REGDOMAIN=JP`

ファイルを保存してOSをリブートしたら、無事自宅のアクセスポイントが検出できるようになりました。
（`sudo iw reg set`だとリブートするともとに戻るので、↑の方法で永続的に設定しよう）





# 参考になったサイト
* https://forums.ubuntulinux.jp/viewtopic.php?id=13756
* https://askubuntu.com/questions/503416/wifi-country-changed-to-us-how-do-i-change-it-back
Approximate Inferenceのevidence lower boundとVariational Autoencodersのvariational lower boundの等価の証明

Variational Autoencoders (VAE)の論文[Auto-Encoding Variational Bayes](https://arxiv.org/pdf/1312.6114.pdf)を読んだ時、式(1)にあるp(z|x)が、式(3)の中にp(z)になったところに引っかかって、簡単ですが、この証明を記載したいと思います。
式(1)
<img width="826" alt="Screen Shot 2019-09-01 at 19.00.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216936/44965cbd-41c9-ec9a-56f2-575e4e9fd401.png">
式(3)
<img width="826" alt="Screen Shot 2019-09-01 at 19.01.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216936/f2669c53-6466-f3bc-5aa2-5839e73f9150.png">

# evidence lower bound (ELBO)
式(1)はevidence lower bound (ELBO)の定義です。Deep Learning本の第19章Approximate InferenceにELBOを結構利用しています。式(3)はVAEの実装に使っているlower bound。式(1)にあるp(z|x)はほとんど解けないので、p(z|x)がない方の式(3)で実装しやすいです。

# ELBOとVAEのvariational lower boundが等価の証明
```math
\begin{split}
\mathcal{L}

&= 
log p(x)-D_{KL}(q(z|x)\|p(z|x))
\\

&=
logp(x)-\mathbb{E}_{z\sim q}log\frac{q(z|x)}{p(z|x)}
\\

&=
logp(x)-\mathbb{E}_{z\sim q}log\frac{q(z|x)}{\frac{p(z,x)}{p(x)}}
\\

&=
logp(x)-\mathbb{E}_{z\sim q}log\frac{q(z|x)p(x)}{p(z,x)}
\\

&=
logp(x)-\mathbb{E}_{z\sim q}log\frac{q(z|x)p(x)}{p(z)p(x|z)}
\\

&=
-\mathbb{E}_{z\sim q}log\frac{q(z|x)}{p(z)p(x|z)}
\\

&=
\mathbb{E}_{z\sim q}logp(x|z)-\mathbb{E}_{z\sim q}log\frac{q(z|x)}{p(z)}
\\

&=
\mathbb{E}_{z\sim q}logp(x|z)-D_{KL}(q(z|x)\|p(z))

\end{split}
```
Youtube Data API + firebase + nuxt + vuex + typescript + sass開発時のメモ

俺が躓いたエラーをメモ

## sassじゃなくてscss

vueファイルの中身のスタイルシートでエラーが出たら、langをsassじゃなくてscssにすると動く場合もある

```
<style lang="scss" scoped>
</style>
```

sass-loader入れてるのに、何故かscss。

## youtubeApiを叩く時はnpm使ってはいけない

npmにGoogeAPIsというモジュールがGoogle純正であるが、これはwebpack非対応らしく `Cannot find module 'child_process'`というエラーが出てnuxtが動かない。

幸い、googleAPIはURLの構文が簡単だからライブラリ使わず直に文字列操作出来るからナシでいく。


## typescriptでextendは使ってはいけない

vueファイルでexport defaultするオブジェクトは、asyncData等 vue標準には無いプロパティが追加されている。`export default Vue.extend({});`とすると、そんなプロパティが無い とエラーになってしまうので`export default {}`の書き方にする。
typescriptの意味が半減してるからなんとか解決出来たらいいんだがな。

## node-sassは最新バージョンを使ってはいけない

2019/09/01時点ではsass-loaderのv8系は相性が悪いのでv7系を指定する事

` options has an unknown property 'indentedSyntax'. These properties are valid:`のエラーが出る。issueは以下。

https://github.com/vuejs/vue-cli/issues/4513


## nuxtはsrc dirを指定する

nuxtはlayoutsやpages等、予約されたサブフォルダを配置する必要がある。標準ではプロジェクトルートに配置されるが、ソースコードはsrcディレクトリに纏めたい。

ので、nuxt.confg.ts に` srcDir:"./src",` を追加する。

## youtubeApiでリクエスト時にopenIdを指定する

youtubeAPIのログインとfirebaseのログインは別の仕組みなので、本来はユーザは二度ログインしないといけない。
それは面倒なので、youtubeAPIのログイン結果で受信するidトークンという文字列をfirebaseに渡す事で、firebaseは確認画面を出さずにこっそりログイン状態にする事が出来る。

逆に、firebaseのログイン結果をyoutubeAPIに投げるのは出来なさそう？

idトークンの文字列は「oauth2 openID Token 」「JWT (JSON Web Token)」あたりが検索キーワード。

参考サイト

- http://webos-goodies.jp/archives/how_to_migrate_from_openid_to_openid_connect.html
- https://oauth.jp/blog/2012/10/26/json-web-token-jwt/
- https://uruly.xyz/firebase-youtube-channel/
- https://www.oauth.com/oauth2-servers/signing-in-with-google/getting-an-id-token/

なんでもIDトークンが使える訳ではなく、事前にfirebaseのプロジェクトの設定に このYoutubeAPI(実際はgoogleAPI)からのIDトークンを使えますよ という設定をする必要がある。

まず、YoutubeのAPI設定画面から、以下の赤枠の文字列を見る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/63fc93ef-f811-8f74-d444-b36e6a9c9e0f.png)

 その値をFirebaseのAuthenticationのログイン方法、Google 外部プロジェクト の値に入れる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/5825/8ba14c14-5e71-70af-2266-0902f2ce0080.png)

管理画面での準備はこれでよし。

apiを取得する時、一番最初に投げる https://accounts.google.com/o/oauth2/auth へのリクエストパラメータのscopeにopenid emailを追加する。

そうすると、最後の https://www.googleapis.com/oauth2/v4/token からのレスポンスにid_tokenというパラメータがあり、文字列を取得出来る。

この文字列を以下のidTokenに入れると、ユーザからはログインを認識されずにログイン出来る。

```
      const creds = firebase.auth.GoogleAuthProvider.credential(idToken);
      firebase.auth().signInAndRetrieveDataWithCredential(creds).then((result) => {
        if (result) {
          let user = result.user;
          console.log(user);
          alert("idtokenでログイン成功")
        }
      }).catch(error => {
        console.log(error);
        alert("idtokenでログイン失敗")
      })
```
JLabelの文字が切れる。そんな時...フォントサイズを自動調整する。

# 注意
getFontSizeAdjustedメソッドの -8 しているところはお好みで変えてください。

# ソースコード

```java:Example
int fontSizeAdjusted = 0;
int sideMarginSize = 10; // 左右の余白サイズ（片方のみのサイズ）
JLabel label = new JLabel("SampleText");
fontSizeAdjusted = getFontSizeAdjusted(label, label.getText(), sideMarginSize);
label.setFont( new Font(label.getFont().getFamily(), label.getFont().getStyle(). fontSizeAdjusted) );

/**
 * コンポーネントの横幅に収まるフォントサイズを取得する処理
 * @param component コンポーネント
 * @param str 文字列
 * @param sideMarginSize 横の余白サイズ
 * @return fontSize
 */
private int getFontSizeAdjusted(JComponent component, String str, int sideMarginSize) {
    Font font = component.getFont();
    int fontSize = font.getSize();
    int componentWidth = component.getPreferredSize().width - sideMarginSize*2;
    // 「文字列の横の表示サイズ > コンポーネントの横の表示サイズ」である場合、フォントサイズを -1point する。
    while(stringWidth > componentWidth - 8) {
        fontSize--;
        font = new Font(font.getFamily(), font.getStyle(). fontSize);
        stringWidth = component.getFontMetrics(font).stringWidth(str);
    }
    return fontSize;
}
```

# これを書いた理由
検索したら、JLabelに文字を収める方法が全然出てこなかったから。
…JLabelの横のサイズを自動調整する方法はたくさん書いてあった。
Docker の MySQL で大量レコードで遊ぶレシピ

```sql:~/init_dummy.sql
create table users (
  id int not null auto_increment,
  name varchar(255),
  score int not null default 0,
  primary key (id)
);

delimiter //
create procedure insert_users(in x int)
begin
  declare i int default 0;
  while i < x do
    -- insert data は自由に適当にどうぞ
    insert into users (name, score) values (concat('name', i), ROUND(RAND() * 1000));
    set i = i + 1;
  end while;
end
//
delimiter ;

call insert_users(100000); -- 10万行くらい用意してみましょう
```

上のファイルを適当に用意しておいて。

```bash
# コンテナたてて
$ docker run -it --rm \
  --name my_container \
  -e MYSQL_ALLOW_EMPTY_PASSWORD=yes \
  -e MYSQL_DATABASE=sample_db \
  -p 3306:3306 \
  -v ~/init_dummy.sql:/docker-entrypoint-initdb.d/init_dummy.sql \
  mysql:5.7
```

```bash
# コンテナに入る
$ docker exec -it my_container mysql sample_db
```

以上で、10万行と戯れることができます。 :lemon:
railsのサーバーを立ち上げる際のエラーについて

railsの勉強をし始めて間もない初心者エンジニアです。
railsをインストールしサーバーを立ち上げローカルホストで表示したいのですが
rails sとコマンドを打つと以下のようなエラーが出てローカルホストに接続できません。

どのような問題があるのかご教授頂けませんでしょうか? 

=> Booting Puma
=> Rails 6.0.0 application starting in development 
=> Run `rails server --help` for more startup options
RAILS_ENV=development environment is not defined in config/webpacker.yml, falling back to production environment
Exiting
Traceback (most recent call last):
	79: from bin/rails:3:in `<main>'
【コマンド操作に悩まない】docker docker-compose チートシート

## 初めに
 docker,docker-composeのコマンド一覧を用意しました。
日々の開発ライフに役立ててください。

使わないコンテナやイメージを放置しているとPCのメモリなど食うので
**定期的にコンテナ、イメージを見直すことをおすすめします。**

※開発用のため詳細説明は控え、別途記事で解説しようと思います。

## 環境
```console
$ docker --version
version:19.03.1

$ docker-compose --version
version:1.24.1
```

## よく使う定番コマンド
```console
#dockerコマンドを表示
$ docker -h
```
```console
#docker-composeコマンドを表示
$ docker-compose -h
```

```console
#コンテナ一覧を表示
$ docker-compose ps
```

```console
#コンテナのビルド
$ docker-compose build
```

```console
#コンテナの起動
$ docker-compose up -d
```
```console
# コンテナのシェル起動
$ docker-compose exec {image-name} bash

# alpine linux ベースのコンテナのシェル起動
$ docker-compose exec {image-name} ash

## {image-name}には、イメージの名前を入れてください
```


```console
#コンテナの停止
$ docker-compose stop
```

```console
#コンテナの設定閲覧
$ docker-compose config
```


## 一括操作
### PC上のコンテナやイメージを管理
```console
#未使用コンテナ、未使用イメージ、ボリューム、ネットワークを一括削除
$ docker system prune
```

```console
#　コンテナ、イメージ、ボリュームの情報表示
$ docker system df
```

```console
# 停止コンテナ一括削除
$ docker container prune
```

```console
# 未使用イメージ一括削除
$ docker image prune
```

```console
# 未使用ボリューム一括削除
$ docker volume prune
```

```console
# 未使用ネットワーク一括削除
$ docker network prune
```
便利だけどよく知らないBluetoothについてまとめた

# 目的

- Bluetoothについてよく知らなかったので調べてみた

# Bluetoothってそもそも何？

- 無線通信規格のひとつ
- 線を繋がなくてもデータをやり取りできる
- 複数の機器を同時に接続させることが得意
- 通信速度が爆速
- でも実は消費電力が大きい
- 国際規格である

# Bluetoothには電波強度がある

- Classという名前で電波強度を分けている。
- Classは1〜3の三種類でClass1が最も通信距離が長く、Class3が短い。
- 市販されている有名メーカーのイヤホンやマウス、キーボードならそこまで気を使う必要はないが、Amazonなどで売っている怪しい中華製のBluetooth製品を購入するときはClassを一応気にした方がいいかも。。。
- Classが違う製品でも接続することは可能！問題なのは距離だけ！

# Bluetoothプロファイルとは

- 機器同士がBluetooth通信を行う時に必要になるもの。
- 通信時の動作や送受信するデータの内容が定義されている。
- やり取りするデータによってプロファイルが用意されている。
- 製品の用途によってプロファイルが異なるのでマウス用のBluetoothレシーバーで音声データを送受信するなどはできない。
- プロファイルの種類と用途は検索するとすぐにヒットするため調べてみると面白い。

# そのほか詳しくまとめられているリンク
- [Bluetoothのセキュリティリスクと安全に使うための3つの対策方法](https://cybersecurity-jp.com/security-measures/28123)
Unity2019.2でNetworkBehaviourが使えない問題の解決法

#概要
Unity5.6からUnity2019.2にアップデートした際に、NetworkBehaviourが使えなくなりハマったので解決策を共有しておきます。

#解決策

どうやらどこかしらのバージョンでネットワーク関連のコンポーネントはパッケージ化されたらしく、パッケージマネージャーを用いて別途インストールしてあげる必要があるようです。

パッケージマネージャーはWindow→Package Managerから開けます
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490782/463e554a-81b5-3e97-da6f-bf3e10cb2799.png)

パッケージマネージャーを開くとパッケージの一覧が表示されるので、その中からMultiplayer HLAPIを選択して右下のInstallボタンを押します。

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/490782/da1210a6-5777-dd75-4b98-948c34ecb396.png)

Installボタンを押すと自動でインストールが始まり、しばらく待つとNetworkBehaviourを含むネットワーク関連のコンポーネントのインストールは完了します。
これで従来通り開発が行えるようになると思います。
CloudBuildを使ってgithubのpushをGKEにデプロイする

# 記事の目的

自分の備忘録
GitHubのPUSHをトリガーにCloudBuildを発火させてGKEにデプロイする方法


# 準備

GitHub
GCP
IAMにサービスアカウントにGKEの権限設定
デプロイするアプリケーション（Docker）


# CloudBuildとは

## スピードと柔軟性
>Cloud Build では、すべての言語でソフトウェアを迅速にビルドでき、複数の環境（VM、サーバーレス、Kubernetes、Firebase など）でのビルド、テスト、デプロイ用にカスタム ワークフローの定義を完全に制御できます。![cloudbuild.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/429104/11fb5bc4-c019-8de0-6680-a80fcd28c7e4.png)
https://cloud.google.com/cloud-build/?hl=ja

# やってみよう

##### Dockerfileとは
- 作成したいイメージを作る際の設定や手順をまとめたもの
- docker buildコマンドを実行することでDockerfileに記載した手順を実行してくれる
- このファイルを共有すれば、誰でも同じ環境を構築できる

##### Dockerfileを書いてみる

今回は下記のディレクトリ構成でやっていきます

```
docker-ruby
 ├ sample.rb
 ├ Dockerfile
 ├ deployment.yaml
 └ cloudbuild.yaml
```

```ruby:sample.rb
puts 'Hello, from Docker container!'
```

```dockerfile:Dockerfile
# ベースとなるイメージを指定する
FROM ruby:2.5
# コンテナ上のワーキングディレクトリを指定する
WORKDIR /usr/src/
# ディレクトリやファイルをコピーする
# 左側がホストのディレクトリ、右側がコンテナ上のディレクトリ
COPY ./sample.rb /usr/src/sample.rb
# "docker build"時に実行される処理
RUN echo "building..."
# "docker run"実行時に実行される処理
CMD ruby sample.rb
```
##### GKE(kubernetes)側のマニュフェストファイル

```yaml:deployment.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: cb-sample-server
spec:
  replicas: 2
  selector:
    matchLabels:
      name: cb-sample-server
  template:
    metadata:
      labels:
        name: cb-sample-server
        cluster_name: cb-sample-server
    spec:
      containers:
      - name: cb-sample-server
        image: gcr.io/プロジェクト名設定/cb-sample-server:latest
        ports:
        - containerPort: 8080
          protocol: TCP
  revisionHistoryLimit: 100
```

```yaml:cloudbuild.yaml
steps:
# Dockerfileを利用してアプリのテストビルドとイメージのビルドを行う。$_VERSIONはトリガーの変数として設定します。
# $PROJECT_IDには使用中のプロジェクトIDが自動的に挿入されます
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-f', 'Dockerfile', '--tag=gcr.io/$PROJECT_ID/cb-sample-server:$_VERSION', '.']
# 作成したcb-sample-serverイメージをPUSHする
- name: 'gcr.io/cloud-builders/docker'
  args: ["push", "gcr.io/$PROJECT_ID/cb-sample-server:$_VERSION"]
# Clusterを取得。$_ZONEはトリガーの変数として設定します。
- name: 'gcr.io/cloud-builders/gcloud'
  args:
  - beta
  - container
  - clusters
  - get-credentials
  - cb-sample-server
  - --zone=$_ZONE
  - --project=$PROJECT_ID
# アプリのデプロイ設定
- name: 'gcr.io/cloud-builders/kubectl'
  args:
  - 'apply'
  - '--filename=deployment.yaml'

timeout: 1000s

```
#### CloudBuildのトリガーの作成
ブラウザー上、GCPのWeb Console画面を開きます。


##### 1. 左のナビゲーションメニューからTools > Cloud Build選択
##### 2. Cloud Build > Build triggers > Add triggerボタンクリック

##### 3. Github選択後、Continueボタンクリック

##### 4. レポジトリ選択
※github.comの認証は省略させて頂きます。
##### 5. トリガーの内容設定

トリガー名はなんでも構いません
cloudbuild.yamlを選択
cloudbuild.yamlで利用する変数を設定

```
_VERSION : latest
_ZONE : asia-northeast1-a
```

#### トリガー実行と動作確認

###### 1. cloudbuildの画面からトリガーの実行を押して確認
###### 2. GitHub Pushを実行してトリガーが発火されるか確認

# 最後に

備忘録がてら書いたので雑な部分も多いです
わからない部分の質問や間違っている部分のコメントお待ちしております

# 参考にしたサイト

[今日から始めるDocker【Dockerfileを書いてみよう編】]
(https://qiita.com/yu-croco/items/6f9d9e210c59c65f54f6)
[GCPのCloud Buildを使おう]
(https://developers.cyberagent.co.jp/blog/archives/17034/)
node-red環境の作成手順（ibmcloud）

お仕事でnode-redを触る機会があり、結構楽しかったので、環境が欲しいなぁと思い、
ibmcloudに登録して環境を作成しました！

### ibmcloudアカウント作成
まず、[こちら](https://cloud.ibm.com/registration/free)でメールアドレスなどを入力して、アカウントを作成。
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483835/9d0e899b-9ddd-eaff-5640-c930979b05c3.png)

プライバシーポリシー云々を確認して、登録＋ログイン。

### サーバ作成
ログイン直後はダッシュボード?が表示されるため、「リソースの要約」パネルの「作成」をクリック。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483835/cdd06ceb-47fe-5610-0121-cc0e0d450b04.png)


作成するサーバのテンプレートを選択するカタログ画面が表示されるので、検索窓に「node-red」と入力して、。表示される「Node-RED Starter」をクリック。
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483835/fe46a150-e6f2-07e6-fce8-2239e345b46e.png)

選択後にアプリ名の設定画面などが表示されるため、任意のアプリ名を入力して、「作成」をクリック。
※作成には3~5分くらいかかるので、サンドウィッチマンのネタでも見てのんびり待つ。
（その他の項目はデフォルト値で問題なし。ただし、課金項目もあるので、念のためライトプラン用のものになっているか確認しておく。）
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483835/fa0cba50-f6b7-29f2-fd78-5bc5fa6796f2.png)


アプリ名の横が「このアプリは稼働中です」になれば作成完了。
「アプリURLにアクセス」をクリック。
![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483835/24d4a101-f29c-eca1-dc08-6155947798c7.png)

初回はnode-redのアクセス用ID/PASSを設定する以下のような画面になるため、任意のID/PASSを設定。
（途中に、インストールするライブラリを選択するパートがあるが、あとから追加もできるはずなので何も選択しなくてOK）
![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483835/da84f06b-f20a-cb54-40e5-8aac5bab5487.png)

### できた
ID/PASSを設定して、ログインを行うとnode-redのエディター画面が表示されます。
ひとまずこれで、ibmcloud上でnode-redを使用することが可能になりました！

#### linebotと連携したものをつくってみた
[晩ご飯を決めてくれるボットをnode-red+linebotでつくった](https://qiita.com/koan_u/items/091c34d60ed414678b3d)


node-redは処理のフローが見えるので、単純にソースコードを見るより処理筋が理解しやすいような気がしますね。
新入社員への教育で基本的なロジックのパターンを説明するのに使えたりするかぁと思ったりしています。
webarenaでubuntu その40

#概要

webarenaでubuntu18.04やってみた。
plunkerでメールアドレスを難読化してみた。

#参考にしたページ

http://gadd9.com/soft/entity.html

#写真

![image](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/9f31be36-5853-7ed7-5366-a91fd2a63221.png)

#成果物

https://embed.plnkr.co/YV4oNVW5Fib3zvdNiyM7/

以上。
考える時間を増やそう！UiPathショートカット集

<h2>概要</h2>
今回は業務効率化のために現場で使えるUiPath Studioのショートカットを紹介します。

<h2>UiPathショートカット</h2>
<h3>プログラム実行系</h3>
|機能|コマンド|
|---|---|
|プログラム実行|F5|
|プログラム実行を停止|F12|
|ブレークポイントを置く|F9|
|すべてのブレークポイントを削除|Shift + F9|
|デバッグモードで実行|F7|
|ログを開く|ctrl + l(える)|

<h3>開発系</h3>

|機能|コマンド|
|---|---|
|デザイナーパネルのワークフロー間を移動|ctrl + tab|
|保存する|ctrl + s|
|すべて保存する|ctrl + shift + s|
|アクティビティパネルを検索|ctrl + alt + f|
|変数を生成|ctrl + k|
|新しいプロジェクトを作成|ctrl + shift + n|
|新しいシーケンスを作成|ctrl + n|
|デザイナーパネルの拡大(縮小)|ctrl + + (-)|
|Try Catchアクティビティの追加|ctrl + t|
|コメントアウト|ctrl + d|
|コメントアウトを解除|ctrl + e|

<h3>レコーディング系</h3>

|機能|コマンド|
|---|---|
|Basicレコーディング|ctrl + alt + b|
|デスクトップレコーディング|ctrl + alt + d|
|Webレコーディング|ctrl + alt + w|
|レコーディング一時停止|F2|
|レコーディング中止|Esc|

<h2>まとめ</h2>
あちこちのサイトからUiPath Studioのショートカットをまとめてみました。
今後どんどんショートカットを使ってみて追加していきたいと思います！
次回はSAPのショートカットまとめます。それでは！

https://qiita.com/harumaki_dayo/items/75d1c1dfcb963d491a2a
・Windows, Explore, Chromeショートカット

https://qiita.com/harumaki_dayo/items/9524ea2de0a7934b9a87
・Excelアクセスキー集

![2019-09-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/402218/2f672159-9909-5501-3d55-afe933f7ba39.png)
Tシャツも作りました
「成長できるプログラマ」になるための10の改善


# はじめに

[僕が僕を「成長できないプログラマ」だと思う10の理由](https://qiita.com/ganariya/items/e55251a9c03c08ca4f4b)という記事を書きました。

このままだと大学院生活が失敗する未来しか見えないため、自分が駄目な点を振り返る点です。

そして、この記事は自分がどうするべきかをまとめる記事です。

# 1. 興味を持つ

どんなことでもいいから、興味を持つ。
バグを見つけたらどうしてそのエラーが出るのか？
うまくいかないことがあったとき、どうしてその方法でエラーが回避できるのか？
を調べながら理解する。

そして、最後まで徹底する。

# 2. 最後まで続ける

自分は常に諦めがちである。
本も最後まで読む。
実行しながら作る。
完成したと思ってももう少し細部をこだわってみる。

最後まで続けることでもっとうまく強くなりたい。

# 3. 余裕主義

完璧主義を辞める。
なにか予定が狂ってもその日の努力を辞めるのではなく、
その時点から頑張れることを頑張る。

そもそも人間なので、いろいろな人との関わりや出来事で時間を取られる。
その時点でできることを最大限頑張る。

# 4. アウトプット重視にする

これまでどんなことでもまずは完璧に頭に入れようとしていた。
かつ、紙に書いたり読んで理解しようとしていた。

Qiitaに書いたりQrunchに書くでもいいが
とりあえず形に残していきたい。

# 5. 買うものを最小限にする

買って満足している時点でその本を理解できていない。
読める分だけきちんと最後まで読んで理解したい。

# 6. 環境構築に強くなる

Linux・Macなどのシステム周りに強くなる。
具体的にはQiitaで調べながら自分で記事を書いてLinuxの仕組みを理解する。

# 7. 一つの言語を完璧に理解する

C++とPythonを理解しよう。（２つだが）
C++は競技プログラミングで使用する。そのために使いながら学ぼう。
Pythonは競技プログラミング・機械学習で使用する。

ただ、JavaScriptをおそらく研究で使うので考えどころである。

# 8. ファイル設計を工夫する

アウトプット重視にすることで、当然コーディング量も増える。
その中で、きちんとモジュール設計を工夫する。

人に見せられる設計にする。

# 9. 惰性的に楽をする

いい意味で楽をする。
もっと良いツールはないか、書き方はないか、分割できないか考える。

# 10. 自分にある程度厳しくする

時間をある程度決めて行動する。
がっちり決めすぎると自分の性格上守れない。
5分まず動いてPomodoroで動く。

そして、朝・夜できちんとゆっくりする時間を作りたい。
JSを使わないドロップダウンメニュー

# 実行結果

[左下にドロップダウンするメニューのサンプル](https://code.sololearn.com/WF5k5jATlr0Y) 

# サンプルコード

```html
<div class="dropdown-container" data-position="bottom-left" >
    <input type="checkbox" id="dorpdown-heading">
    <label for="dorpdown-heading">メニュー</label>
    <ul>
        <li>アイテム - 1</li>
        <li>アイテム - 2</li>
        <li>アイテム - 3</li>
        <li>アイテム - 4</li>
        <li>アイテム - 5</li>
    </ul>
</div>
```

```css
.dropdown-container {
    position: relative;
}

.dropdown-container > input {
    display: none;
}

.dropdown-container > *:last-child{
    position: absolute;
    display: none;
    white-space: nowrap;
}

.dropdown-container[data-position="bottom-right"] > *:last-child{
    left: 0px;
}

.dropdown-container[data-position="bottom-left"] > *:last-child{
    right: 0px;
}

.dropdown-container > input:checked ~ *:last-child{
    display: block;
}
```

# 概説

チェックボックスはクリックするごとにチェックされている状態とチェックされていない状態を行き来するので、それを利用してドロップダウンメニューの表示を管理します。

- `.dropdown-container > input` でチェックボックスそのものが表示されないように指定しています。
- `.dropdown-container` はドロップダウンメニューを `position: aboslute` で指定する都合で、 `position: relative` か `position: absolute` である必要があります。
- `.dropdown-container > *:last-child` によってドロップダウンメニューが表示されているとき/されていないとき共通のスタイルを指定しています。
- `.dropdown-container > input:checked ~ *:last-child` によって、チェックボックスが `checked` な場合にドロップダウンメニューが表示されるようにしています。
- `.dropdown-container[data-position="bottom-right"]` と `.dropdown-container[data-position="bottom-left"] > *:last-child` によって、ドロップダウンメニューの表示位置を `data-position` で指定できるようにしています。
【kmeans】教師なし学習のクラスタリング（kmeans）をコーディングしてみる

# はじめに
教師なし学習のクラスタリングをコーディングしてみます。
クラスタリングは、データに対してクラスタリングをし、何かしらの規則性を解釈するために使うものだと理解しております。
そのため、この技術が何かしらの解を与えるのではなく、きっかけをうみだすものだと認識しております。

# 使用するデータ
使用するデータは、例によってアボカドデータです。
https://qiita.com/iwasaki_kenichi/items/ea580fd9498ad6950a75

ただし、クラスタリングをする際は数字データを使うことができないため、文字列となるデータ（今回の場合はregionやtype）は削除して処理します。

# コード

```python:main1.py
%matplotlib inline
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.preprocessing import scale
from sklearn.cluster import KMeans

df = pd.read_csv("hogehoge/avocado.csv",engine="python")

```

`from sklearn.preprocessing import scale`
の`scale`と`from sklearn.cluster import KMeans`の`KMeans`が今回新しく使用する機能です。

`scale`は、正規化する関数であり、平均値を引いて標準偏差で除算する処理を行っています。

```python:main2.py
df.info()
```

df情報を見ると、下記だとわかりました。

<img width="253" alt="2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/01fcd0a6-b9d8-5aa5-0ac9-6178803a2b80.png">

Dateとtype、regionはobject型であり、実際に中身を見てみると文字列であることがわかりました。
そのため、KMeansを実行するとエラーがそのため、
1. 削除する
2. `pd.Categorical(df.type).codes`を使って値に変更する。

のどちらかをする必要があります。今回は、１番の削除をする方向で進めます。
また、Unnamed:0は列番号のため、意味をなしません。
そのため、Unnameed;0は削除します。

```python:main3.py
del(df["Unnamed: 0"],df["Date"],df["type"],df["year"],df["region"])
```

```python:main4.py

#モデルの作成 
model = KMeans(n_clusters=4,random_state=1)

#データを正規化し、fit関数により訓練を実施
model = model.fit(scale(df))


df_model = pd.DataFrame(model.labels_)
df["k_value"] = df_model

plt.figure(figsize=(8,6))
plt.scatter(df["4770"],df["k_value"],c=model.labels_.astype(float))
```
`n_clusters=4`とし、クラスター数は4とします。
また、`model.labels_`はnumpy.ndarray型のため、これをDataFrame型に変換し、dfに新たに"k_value"という列を追加し、そこに結果を入れます。
クラスタリングした結果をプロットすると、下記のようになりました。

![１.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/0e6e0ea8-6042-be55-aa38-68981371a9a7.png)

クラスタの値は0~4であるにも関わらず、対になる変数が大きな値のため、プロットしてもよくわからない図になってしまいました。。。片対数とかにしたほうがいいかもしれません。。。

次に、k_valueごとの各項目の平均値を求めます。

```python:main5.py
df[df["k_value"]==0].mean()
df[df["k_value"]==1].mean()
df[df["k_value"]==2].mean()
df[df["k_value"]==3].mean()
```

上記をまとめたものが下記になります。

```python:main6.py
cinfo = pd.DataFrame()
for i in range(4):
    cinfo['cluster' + str(i)] = df[df['k_value'] == i].mean()
```

<img width="438" alt="3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/eb5a900b-0f8e-bebd-0e86-f78129d9c664.png">


最後にグラフをプロットしてみます。

```python:main7.py
myplot  = cinfo.T.plot(kind = 'bar',stacked=True,
                      title = "main")
myplot.set_xticklabels(myplot.xaxis.get_majorticklabels(),rotation=0)
```

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284911/2babeb99-8ab3-d2a3-7d06-1265ee32d339.png)

cluster0<cluster2<cluster3<cluster1の順番で値が大きくなっているのがわかりますね。
cluster0とcluster2が小さすぎるため、このままでは傾向がつかめることができませんが。。。
もっと扱いやすいデータでトライしてみたいです。

# おわりに
教師なし学習のクラスタリングでした。実務ではどのように使われているのか気になります。
教師あり学習の前処理的な使われ方をするのでしょうか。


参考サイト；
https://pythondatascience.plavox.info/scikit-learn/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E5%88%86%E6%9E%90-k-means
RailsからWordPressにAPI経由で投稿する

まとまっている最近の記事がないのでメモ。

# やること
* Railsから、WordPressにREST API経由で投稿する
* APIの認証には、Application Passwordsプラグインを利用する（インストール・パスワード発行済とします）
* Application Passwordsで発行したユーザ名、パスワードは、Railsのcredentials.ymlで管理する


# 環境
* Ruby 2.6.0
* Rails 5.2.2
* WordPress 5.2.1
* Application Passwords 0.1.0

# 記事内で利用する設定値
| 項目 | 設定値 |
|--------|----------|
| WordPressのサイトURL | https://example.com |
| WordPress ユーザ名 | wp-user |
| wp-user用のAPIパスワード | aaaa bbbb cccc dddd eeee ffff |
| API投稿時の公開状態 | draft（下書き）|

# credentialsの設定
```terminal
$ EDITOR="vi" bin/rails credentials:edit
```

```terminal:credentials.yml.enc
wp_api_username = 'wp-user'
wp_api_password = 'aaaa bbbb cccc dddd eeee ffff'
```

保存しておく。

# 投稿クラス作成
今回は、ServiceクラスとしてWordPressへの投稿機能を作成します。
※Serviceクラス自体邪道とも言われているので、場所はそれぞれの環境下で最適な場所を選んでください。
※あるモデルのデータを投稿するのであれば、そのモデル内でもいいと思います。

```rb:/services/wp_api_post_service.rb
# frozen_string_literal: true

require 'net/http'
require 'open-uri'

Class WpApiPostService
  API_URL = 'https://example.com/wp-json/wp/v2/posts'

  def initialize(title, body, categories, tags)
    @title = title
    @body = body
    @categories = categories
    @tags = tags
  end

  def api_post
    uri = URI.parse(API_URL)

    http = Net::HTTP.new(uri.host, uri.port)
    http.use_ssl = true
    http.verify_mode = OpenSSL::SSL::VERIFY_NONE

    req = Net::HTTP::Post.new(uri.path)
    req.content_type = "application/json"
    req.set_form_data(article_setting)
    req.basic_auth(Rails.application.credentials.wp_api_username, Rails.application.credentials.wp_api_password)

    response = http.request(req)

    if response.code == '201'
      Rails.logger.info('Successfully posted WP API')
    else
      Rails.logger.warn(['---Failed to WP API Post---', response.code, response.message, response.body].join("\n"))
    end
  end

  private

  def article_setting
    {
      title: @title,
      content: @body,
      status: 'draft',
      categories: @categories,
      tags: @tags
    }
  end
end
```

APIのURLは、WordPressのURLにwp-json/wp/v2/postsをくっつけた値です。
記事のタイトル、本文、カテゴリ、タグを引数として渡せば、API投稿がされます。

```rb:投稿例
WpApiPostService.new('テストタイトル', '<h2>テスト本文</h2>', '1, 222, 333', '2, 20').api_post
```

正常に投稿がされれば、response.codeで201が返ってきます。

# カテゴリとタグ
カテゴリとタグは、IDを指定します。また、複数選択する場合、配列ではなく、カンマ区切りのIDの文字列を渡します。投稿例の第3引数と第4引数が例となっています。
（Pythonから投稿する例では配列だったんですけど、Rubyでは配列の最初の要素のみ適用されるだけでちゃんと動きませんでした。）

# 作ってるときに遭遇したエラー
### 401 Unauthorized
ベーシック認証時のIDとPASSの構成に間違えがありませんか？
**注意点は、このAPIにおけるユーザ名がWordPressのユーザ名のことを指すという点です。
1とか2とかのWordPressのUserIDでも、Application Passwords作成時の名前のことでもないです。**


### 400 Bad Request
api_postメソッド内、uri/http/req　の属性値の設定が間違っていたため、正常に動作しなかった模様。開発上は、squidのプロキシ経由で接続しているので、squidのzero size replyが表示される状態でした。


### 502 Bad Gateway
cloudfrontなどを使って、管理側にSSL接続するときに、 http.use_ssl = true が抜けていると、オリジンサーバに接続できずに502が返ってくるようです。


# 参考サイト
 * [WP REST API v2 Documentation](https://ja.wp-api.org/)
Laravelをさくらのレンタルサーバに上げたらローカルで表示できた画像が表示できない時の対処法

#パスの違いがある
php artisan serve コマンドで立ち上げた簡易サーバーの場合、
ホスト名の直下がプロジェクトルートなのに対し、
ホスト名/ルートディレクトリ
さくらレンタルサーバーにアップロードした場合は
ホスト名/プロジェクト名/public/ルートディレクトリ
となるため絶対パスで指定していた場合、どちらか片方でしか表示できなくなってしまう。

**ローカル環境でしか表示できないパス**

```php

<img src="/storage/pan_anpan.jpg">
```

**本番環境でしか表示できないパス**

```php

<img src="/myapp/public/storage/pan_anpan.jpg" >
```

これを、相対パスに直せば開発環境と本番環境の両方で表示できるようになる。
**どちらでも表示できるパス**

```php

<img src="storage/pan_anpan.jpg" >
```

ポイントは一文字目のスラッシュ「/」記号で頭にこれが付いていると絶対パス、ついていないと相対パスになります。
【Go】gormで使用するstructを共通化する方法

#はじめに
gormを使用するときに同じようなstructを作ってしまわないために
structを再利用する方法を記載する。

# よくある一例
例えば以下のようなphotoテーブルとmovieテーブルがあるとする

```Go
type photo struct {
	ID     int    `gorm:"column:id"`
	Name   string `gorm:"column:name"`
	Path   string `gorm:"column:path"`
	Height int    `gorm:"column:height"`
	Width  int    `gorm:"column:width"`
}

type movie struct {
	ID     int    `gorm:"column:id"`
	Name   string `gorm:"column:name"`
	Path   string `gorm:"column:path"`
	Height int    `gorm:"column:height"`
	Width  int    `gorm:"column:width"`
	Time   int    `gorm:"column:time"`
}
```

二つの構造体の違いは,movieに再生時間のカラムがあることだけが違いである。
普通に書くとID,Name,Path,Witdth,Heightが重複することになる


#解決方法
以下のように書くとまとめることができる。

```Go
type Photo struct {
	Content
}

type Movie struct {
	Time int `gorm:"column:time"`
	Content
}

type Content struct {
	ID     int    `gorm:"column:id"`
	Name   string `gorm:"column:name"`
	Path   string `gorm:"column:path"`
	Height int    `gorm:"column:height"`
	Width  int    `gorm:"column:width"`
}

```

# その他
実際のカラム名が違う時はエイリアスを使うなどして揃えなければいけないこともある。
たとえば、基本的なID,create_time,delete_flgなどを共通化して、structに含めることができる。
特にjoinを多くするときに効果を発揮する。同じstructの連発を避けられる
情報セキュリティ白書2019を読み解く：ビジネスメール詐欺

引用元：
https://www.ipa.go.jp/security/publications/hakusyo/2019.html

##ビジネスメール詐欺（BEC）
巧妙な騙しの手口を駆使した偽のメールを組織・企業に送り付け、従業員を騙して
送金取り引きに関わる資金を詐取する等の金銭被害をもたらす攻撃。


##事例
国内企業（A社）の担当者に対し、A社のCEOをかたる攻撃者から、ビットコインを
購入するための準備と称して、国際送金をさせようとするビジネスメール詐欺が
試みられた。
メールの送信者として、本物のCEOの氏名とメールアドレスが使われていた。
A社の担当者がやり取りの途中で不審であると気付くことができ、金銭被害は
発生していない。
攻撃者は、金融庁の正規のドメインに似た、偽の「詐称用ドメイン」を新規に取得し、
DNSやメールサーバの設定も実施していた。
詐称用ドメインのDNS 情報には、SPF（Sender Policy Framework）レコードも
存在しており、SPF検証を「Pass」する状態だった。


##対策
#####（a）ビジネスメール詐欺の周知徹底
全従業員（特に送金処理に関係する担当者）に詐欺の手口について周知徹底し、
ビジネスメール詐欺への意識を高めておく。
取引先等に対しても注意を促す。

#####（b）組織内外での情報共有
不審な兆候が見られた場合、CSIRT 等の適切な部門に報告できる体制を整え、
その情報を組織内外で共有する。

#####（c）送金処理のチェック体制強化
突然の振込先の変更や、急な送金の依頼といった、通常と異なる対応を求められた
場合は、ビジネスメール詐欺を疑い、別の担当者とダブルチェックを行う、信頼
できる方法で入手した連絡先に、電話やFAX 等のメール以外の手段で事実を確認
する等、二重三重のチェックを行う体制とすることが必要。

#####（d）類似ドメインへの対応
定期的に、自組織に似たドメイン名が取得されていないかを確認し、不審なドメイン
が取得されていた場合、必要であれば注意喚起を行う。
外部のメールアドレスやフリーメールから着信したメールについて、件名や本文に
その旨の注意喚起を表示するメールシステムを採用する。

#####（e）ウイルス・不正アクセス対策
攻撃や被害に至る前に、何らかの方法で攻撃者によってメールが盗み見られている
場合があるため、基本的なウイルス対策・不正アクセス対策が重要。
多要素認証等の利用により、第三者による不正ログインを防ぐことが重要。
メールアカウントが乗っ取られている可能性がある場合、迅速にパスワードを変更
するとともに、不正な転送設定や、メールを削除するルールが設定されていないか
を確認する等の対応を行う必要がある。
VirtualBoxのブリッジアダプターを使ってみる。

# この記事は？
VirtualBoxなどを使って仮想マシン(VM)を起動する際にネットワーク接続の設定には大きく以下の5つのようなものがあります。

* NAT
   * VMの内部から外部へのアクセスを可能にする。
   * VMごとにNATが作成されるため、VM間の通信はできない。
* 内部ネットワーク
  * VirtualBoxのVM間のみでの通信を許可する。
* ホストオンリーアダプター
  * 内部ネットワークにさらにホストからのアクセスを可能にする。
* ブリッジアダプター
  * ネットワークインターフェースを作成しホストマシンのNICを紐づけ、別の物理マシンからのアクセスも可能とする。
  * 外部からは別マシンが存在するように見える。
* ポートフォワーディング
  * ポート番号を利用しホストへのインバウンドアクセスをVMへフォワーディングする。

この中でホストの外からの仮想マシンへのインバウンドアクセスを可能とするネットワーク設定はブリッジアダプターとポートフォアディングです。
私は普段ポートフォワーディングを使うことがほとんどなのですが、今回はブリッジアダプターのほうを試してみてまとめたいと思います。設定にはVagrantを用います。

# ブリッジアダプターとは
ネットワークの設定としてブリッジアダプターを選ぶ場合、VirtualBoxはホストのネットワークフィルタードライバーと呼ばれるディバイスドライバーを利用します。このドライバーを利用すると、物理ネットワークアダプターからのデータをインターセプトし、VirtualBoxへと流し込むことを可能とし、ソフトウェアネットワークインターフェースを作成することができます。
このように作成したネットワークインターフェースをVMのNICに割り当てると、同じネットワーク内に存在する別端末からアクセスが可能となり、その端末から見るとネットワーク内に端末が(ホストとゲストの)2台存在するように見えます。
注意点としては、ゲストが外部からアクセス可能となるため、パブリックなネットワークでこの設定を使う場合はファイアウォールを使うなどして、セキュリティを考慮する必要があります。

# ローカル環境
ホストOS：Windows 10 pro
ゲストOS：CentOS 7.5
VirtualBox 6.0.0
Vagrant 2.2.2
ホストの物理ネットワーク:Wi-Fi

ちなみに、今回はVagrantのイメージとして[bento/centos-7.5 ](https://app.vagrantup.com/bento/boxes/centos-7.5)を利用させていただきました。

# ブリッジアダプターを使ってローカルIPを割り当てpingしてみる。

まずは、以下のようなVagrantFileを用意します。

```
Vagrant.configure("2") do |config|
  config.vm.box = "bento/centos-7.5"
  config.vm.network "public_network"
end
```

設定はこれだけです。`config.vm.network "public_network"`の部分がブリッジアダプターを利用する設定です。`config.vm.network "private_network", ip: "[固定IP]"`のように記述すると固定IPを利用することもできますが、今回はDHPCによる動的割り当てを使います。

このVagrantFileを利用し`vagrant up`し`vagrant ssh`で仮想マシンにログインして割り当てられているIPアドレスを確認してみます。

```
[vagrant@localhost ~]$ ip -4 address
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 10.0.2.15/24 brd 10.0.2.255 scope global noprefixroute dynamic eth0
       valid_lft 85323sec preferred_lft 85323sec
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    inet 172.22.1.35/21 brd 172.22.7.255 scope global noprefixroute dynamic eth1
       valid_lft 2524sec preferred_lft 2524sec
```

この中で、外部から接続可能なネットワークインターフェースは`eth1`の`172.22.1.35/21`です。(`eth0`は多分NATかな？)
ホストOSからこの仮想マシンにpingを打ってみます。

```
$ ping 172.22.1.35

172.22.1.35 に ping を送信しています 32 バイトのデータ:
172.22.1.35 からの応答: バイト数 =32 時間 <1ms TTL=64
172.22.1.35 からの応答: バイト数 =32 時間 <1ms TTL=64
172.22.1.35 からの応答: バイト数 =32 時間 <1ms TTL=64
172.22.1.35 からの応答: バイト数 =32 時間 <1ms TTL=64

172.22.1.35 の ping 統計:
    パケット数: 送信 = 4、受信 = 4、損失 = 0 (0% の損失)、
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 0ms、最大 = 0ms、平均 = 0ms
```

アクセスができているようですね。
同じWi-Fiにつながっている別物理端末からもpingを売ってみましたが同様にアクセスができていました。

# まとめ
* VirtualBoxブリッジアダプターを利用するとVMのNICにIPを割り当てることができる。

# 参考サイト
* [VirtualBoxドキュメント](http://download.virtualbox.org/virtualbox/UserManual.pdf)
* [Vagrantドキュメント(Public Networks)](https://www.vagrantup.com/docs/networking/public_network.html)
* [VirtualBoxのネットワーク設定を絵で説明する](https://qiita.com/feifo/items/0fde474005589afcff68)
Swaggerについて

はじめに
===
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<小栗>です。
「プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

Swaggerとは
===
RESTful APIを構築するためのオープンソースフレームワークのこと。
Swagger Spec を書いておけば自動的にドキュメント生成までしてくれ、ドキュメントから実際のリクエストができる。

Swagger Specとは
===
Swaggerの書式で記述した仕様書のこと。
JSONもしくはYAML形式で記述し、Excelなどでの管理と比較するとテキストベースなのでバージョン管理が容易。

RESTとは
===
REST（レスト）とはWebサービスの設計モデルのこと。
設計モデルとはDjangoのMTV（Model・Template・View）のように、システムに共通する性質や作法を表す。
また、
・同じURLからは常に同じ内容のレスポンスが返ってくる。
・クライアントのマシンの状態やブラウザのセッションに依存しない。

上記の条件を満たす物をRESTfulなサービスと呼ぶ。
Unity2019.3.0a3でWebGLのビルドができない！！

#ビルドできない！！
Library/PackageCache/com.unity.multiplayer-hlapi@1.0.2/Runtime/NetworkDiscovery.cs(317,30): error CS0117: 'NetworkTransport' does not contain a definition for 'SetMulticastLock'
とかいうエラーが出てきてビルドできない！！！！！！

#解決法
https://qrunch.net/@7VmvlFPFT2or7yZl/entries/AUkheDFRYRydUjCB
ここのサイトによると、「PackageManagerの「Multiplayer HLAPI」を削除する」だけでいけるらしい。
![スクリーンショット 2019-09-01 17.27.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/292021/6f2c8722-1e8c-a87e-001d-22dfa33f0144.png)
ここの右下に「Remove」ってある場合はクリック！
Django REST frameworkについて

はじめに
===
[未来電子テクノロジー](https://www.miraidenshi-tech.jp/intern-content/program/)でインターンをしている<小栗>です。
「プログラミング初心者であるため、内容に誤りがあるかもしれません。
もし、誤りがあれば修正するのでどんどん指摘してください。

Django REST frameworkとは
===
DjangoでWebAPIを開発することをサポートしてくれるライブラリ。RESTfulなAPIの開発をライブラリの標準としてサポートしている。

###特徴
APIの動作検証をするためのWebコンソールが標準で準備されている。
そのため、他のツールを使わずに簡単にAPIｎパラメータや戻り値を確認できる。

APIとは
===
APIとは、外部とソフトウェアの機能を共有するためのプログラムのこと。
自分のソフトウェアに他のソフトウェアの機能を埋め込む事ができ、アプリケーション同士で連携することが可能になる。