OmniAICreator/Qiita-1.07M huggingface dataset:
Google Apps Sciprt(GAS)でSlackのchallenge認証を処理する

先日社内Slack上のイベントを処理して業務改善を行うボットをSlackAppで作成しました。
簡単な処理のためGASと連携させて処理しましたが、たまにしか行わずchallenge認証のやり方を毎回忘れてしまうので備忘録として残します。

## challenge認証とは
Event SubscriptionなどでSlack上のイベントをトリガーにして何かしら処理する場合、処理をリクエストするURLを事前に認証しておく必要があります。
Slackから以下のようなパラメータでPostリクエストが飛んでくるため、challengeパラメータをレスポンスで返してあげる必要があります。

```
{
    "token": "xxxxxxxxxxxxx",
    "challenge": "yyyyyyyyyyyyyyyyyyyyyyy",
    "type": "url_verification"
}
```
challenge認証が正式な呼び方なのかは不明。


## GASでの処理
最終的に以下のような形でchallengeパラメータを返してあげます。

```javascript
function doPost(e) {
  const params = JSON.parse(e.postData.getDataAsString());

  if (params.type === 'url_verification') {
    return ContentService.createTextOutput(params.challenge);
  } 
}

```

外部からのリクエストを処理するためウェブアプリケーションとしてGASを公開しますが、セキュリティの問題上、文字列をそのままreturnすることはできないようです。
[GAS ウェブアプリケーションの条件](https://developers.google.com/apps-script/guides/web#requirements_for_web_apps)

```javascript
//これはエラーになります
return params.challenge;
```

なのでContentServiceクラスのcreateTextOutputメソッドを使ってTextOutputクラスのオブジェクトに変換してから返してやる必要があります。
[TextOutputクラス](https://developers.google.com/apps-script/reference/content/text-output)

```javascript
return ContentService.createTextOutput(params.challenge);
```
CPU処理ースケジューリング方式

応用情報技術者平成30年秋期 午前問16

処理はすべてCPU処理である三つのジョブ A，B，C がある。それらを単独で実行したときの処理時間は，ジョブAが5分，ジョブBが10分，ジョブCは15分である。この三つのジョブを次のスケジューリング方式に基づいて同時に実行すると，ジョブBが終了するまでの経過時間はおよそ何分か。

〔スケジューリング方式〕
１）、一定時間(これをタイムクウォンタムと呼ぶ)内に処理が終了しなければ，処理を中断させて，待ち行列の最後尾へ回す。
２）、待ち行列に並んだ順に実行する。
３）、タイムクウォンタムは，ジョブの処理時間に比べて十分に小さい値とする。
４）、ジョブの切替え時間は考慮しないものとする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/4d06c089-26fb-6a04-4cdb-75d92df8a4ba.png)

１、〔スケジューリング方式〕の説明から、
3つのジョブは同時並行的に実行されていくことがわかります。

本当の並行ではないですけれども、並行と同じように考慮するので、
１）、A,B,C並行で　各５分実行した。Aが完了。　※本当は並行ではないので、　合わせて１５分
２）、B,C並行で、各５分実行した。Bが完了。　※合わせて１０分
３）、Cが残りを実行。

つまり、並行だけど、本当は並行ではないの方式。
利点とは、A,B,Cはどっちでも実行しているよとのことですね。
B完了までは、２５分になりますね。

参照：

https://www.fe-siken.com/kakomon/20_aki/q32.html
Windows 10 ジャンプリストの最大数を増やす

Windows 10 ジャンプリストの最大数を増やすにはレジストリに以下のエントリーを追加します。値は最大数。

```
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"JumpListItems_Maximum"=dword:00000019
```
django-extensionsのadmin_generatorコマンドを使ってからadmin.pyを自動記述

# やりたいこと
models.pyにテーブルがいっぱいあると、admin.pyへの記述が大変。
自動でやってほしい。

⇣

`django-extensions`というライブラリの`admin_generator`コマンドを使うと自動でやってくれます。
models.pyの内容に合わせてうまいことやってくれます。

# django-extensionsって？
`django-extensions`は`manage.py`の機能を拡張してくれるもので、 他にもいろいろながコマンドがあります。
* [ドキュメント](https://django-extensions.readthedocs.io/en/latest/)
* [リポジトリ](https://github.com/django-extensions/django-extensions)


# インストール

インストールして

```sh
$ pip install django-extensions
```

settings.pyに追記するだけ

```py:pj_name/settings.py
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'django_extensions', # <- 追記
]
...
```

# 実行

出力結果をadmin.pyに上書きします。

`$APP`には `$ python manage.py startapp xxx`で作ったアプリケーション名が入ります。

```sh
$ python manage.py admin_generator $APP > $APP/admin.py
```

# 結果

たとえばこんなclassは

```py:models.py
...
class Users(models.Model):
    user_name = models.CharField(max_length=255)
    last_name = models.CharField(max_length=255)
    first_name = models.CharField(max_length=255)
    email = models.CharField(max_length=255)
    created_at = models.DateTimeField()
    updated_at = models.DateTimeField()
    del_flg = models.IntegerField()

    class Meta:
        managed = False
        db_table = 'users'
...
```

こんな感じ

```py:admin.py
...
@admin.register(Users)
class UsersAdmin(admin.ModelAdmin):
    list_display = (
        'id',
        'user_name',
        'last_name',
        'first_name',
        'email',
        'created_at',
        'updated_at',
        'del_flg',
    )
    list_filter = ('created_at', 'updated_at')
    date_hierarchy = 'created_at'
...
```

# 管理画面にログインするユーザーを作成

```sh
$ python manage.py createsuperuser

Username (leave blank to use 'anata_no_home_dir'): <- 任意の名前
Email address: <- 任意のメールアドレス
Password: <- パスワード
Password (again):  <- もう一回
Superuser created successfully.
```

ローカルサーバを起動

```sh
$ python manage.py runserver
```


ここにアクセス
http://127.0.0.1:8000/admin/
![スクリーンショット 2020-08-21 13 21 13](https://user-images.githubusercontent.com/63569663/90852144-ae3a6300-e3b1-11ea-8851-455469cc5f81.png)



先程つくったユーザー情報でログイン -> テーブルが表示されていればOKです。


# おしまい
最後まで読んでいただきありがとうございました。
django-extensionsをインストールしてrunserverより便利なrunserver_plusを使う

# やりたいこと
Djangoのエラー画面上（ブラウザ）でデバグする。
対話型シェルを使えるようにする。

⇣

`django-extensions`と`Werkzeug`というライブラリを使う。

# django-extensionsって？
`django-extensions`は`manage.py`の機能を拡張してくれるもので、 他にもいろいろながコマンドがあります。
* [ドキュメント](https://django-extensions.readthedocs.io/en/latest/)
* [リポジトリ](https://github.com/django-extensions/django-extensions)

# Werkzeugって？

> Werkzeugは、包括的なWSGI Webアプリケーションライブラリです。これは、WSGIアプリケーション用のさまざまなユーティリティの単純なコレクションとして始まり、最も高度なWSGIユーティリティライブラリの1つになりました。

https://werkzeug.palletsprojects.com/en/1.0.x/

WSGIを簡単に使えるようにするものってことですね。

# WSGIって？
> WSGI [1]は、サーバー、Pythonモジュール、フレームワーク、API、またはあらゆる種類のソフトウェアではありません。これは、サーバーとアプリケーションが通信するための単なるインターフェース仕様です。

http://wsgi.tutorial.codepoint.net/intro

PythonのWebフレームワークがいろいろと出てきて、バラバラの通信規格が存在するようになってしまったためインターフェースを統一する目的があったようです。

# インストール

インストールして

```sh
$ pip install django-extensions Werkzeug
```

settings.pyに追記するだけ

```py:pj_name/settings.py
...
INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',

    'django_extensions', # <- 追記
]
...
```

# コード

たとえば’test’という文字列を表示するだけのviewで

```py:views.py
from django.shortcuts import render
from django.http import HttpResponse


def test(request):
    message = 'test'
    return HttpResponse(message)
```

変数`message`を `mesage` とタイプミスすると
⇣


```py:views.py
from django.shortcuts import render
from django.http import HttpResponse


def test(request):
    message = 'test'
    return HttpResponse(mesage) # <- タイポ
```

# 実行

## runserver

まずはいつものrunserverを実行。

```sh
$ python manage.py runserver
```

http://127.0.0.1:8000/ にアクセスします。
こんなエラー画面。

![スクリーンショット 2020-08-21 12 21 41](https://user-images.githubusercontent.com/63569663/90849241-d32ad800-e3a9-11ea-9172-bb20976a96c4.png)

## runserver_plus

今度はrunserver_plusを実行。
runserverをrunserver_plusに変えるだけ。
`Debugger PIN` は後で使います。

```sh
$ python manage.py runserver_plus

...
 * Debugger is active!
 * Debugger PIN: 125-696-991 # <- これ

```

runserver_plusではこんな感じ。

![スクリーンショット 2020-08-21 11 46 30](https://user-images.githubusercontent.com/63569663/90848690-767aed80-e3a8-11ea-9d86-c0407f310b2b.png)

コードのエリアをマウスオーバーすると、ターミナルアイコンが出てくるのでクリックします。

![スクリーンショット 2020-08-21 12 10 42](https://user-images.githubusercontent.com/63569663/90848689-75e25700-e3a8-11ea-92e4-68ed59cf38f2.png)

先程のDebugger PINを入力

![スクリーンショット 2020-08-21 12 13 02](https://user-images.githubusercontent.com/63569663/90848687-75e25700-e3a8-11ea-8194-8dff308afe93.png)

対話型シェルが使えるようになります。

![スクリーンショット 2020-08-21 12 14 31](https://user-images.githubusercontent.com/63569663/90849244-d625c880-e3a9-11ea-9203-755509d2fdb9.png)

# おしまい
最後まで読んでいただきありがとうございました。
一からコンピュータを作る ~機械語、コンピュータアーキテクチャ~


下記の資料を参考にした。
[コンピュータシステムの理論と実装 4章 機械語](https://slides.lulichn.net/slides/nand2tetris/04.pdf)
[コンピュータシステムの理論と実装 - 資料一覧 - connpass](https://nandtetris.connpass.com/presentation/?page=3)

## 機械語
- コンピュータにおけるハードウェアとソフトウェアの重要なインターフェースの役割をもつ
- プロセッサ(CPU) と レジスタ を⽤いて、 メモリ を操作する
- 各セルは ワード と呼ぶ

英語だけれども、下記がよくまとまっています。
[Machine Language](https://docs.wixstatic.com/ugd/56440f_12f488fe481344328506857e6a799f79.pdf)

### 全体像
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/e19cb2c7-e28c-155e-5dd5-f35db1ffc5c8.png)


[Jack](https://www.slideshare.net/secret/fQixJa3JGZwMFi)


## メモリアクセス
- 直接アドレッシング
- イミディエイトアドレッシング
- 間接アドレッシング
  - ポインタを扱うのに用いられる

## Hack機械語
メモリ操作を伴うものは2回実行する必要があります。
それが、命令メモリとデータメモリになります。

Aレジスタは、命令メモリとデータメモリ、Dレジスタは、データメモリを表します。

### A命令
#### `@`
- `@R2` は、変数の宣言みたいなもの
- `M` は、現在のメモリレジスタを表す

```hack
@R2
    M=0 // R2=0
```

`A` アドレス
`@5`のように数値だった場合は、5の2進数を レジスタに格納することになります。

### C命令
`comp, dest, jump`が該当し、
`comp` は、計算する対象、
`dest` は、計算した結果の格納場所、
`jump` は、次に何を実行するか を示します。


### オペランド / オペコード
**オペコードは、命令の動作を表し、オペランドは、命令の対象を表します。**

[命令・オペランド・オペコード \| ぷにぷにバイオ](http://biology.love/?p=516)
[第４章 基本的なアセンブリ言語プログラミング](http://teacher.nagano-nct.ac.jp/furulab/3Etext4H29.pdf)
[OSを書く：初歩から一歩ずつ \| POSTD](https://postd.cc/writing-an-os-baby-steps/)

## 手順
- アセンブラを使って機械語に翻訳
- CPUエミュレーターを使って、 `hack` ファイルのテストを行う

>アセンブラとマシン語は，1対1に対応します。
[【5分で覚えるIT基礎の基礎】だれでも一度はアセンブラを学んでおこう！　第1回 \| 日経クロステック（xTECH）](https://xtech.nikkei.com/it/members/ITPro/ITBASIC/20021218/1/)



## コンピュータアーキテクチャ
ここからは第5章のお話です。

### コンピュータ
- CPU
- データメモリ
- 命令メモリ

### ノイマン型アーキテクチャ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/148392/b3c93379-760c-ded8-15d7-82a076283271.png)


### メモリ
- データメモリ
- 命令メモリ


### レジスタ
- レジスタは単純な計算を行うためのパフォーマンス向上に役立つ
- レジスタは通常複数存在する

#### データレジスタ
計算結果を一時的に格納しておく場所

#### アドレスレジスタ
メモリにアクセスするためのアドレスを格納しておく場所

#### プログラムカウンタレジスタ
命令メモリから次にフェッチすべきアドレスを格納しておく場所

#### メモリとレジスタの違い
- レジスタはメモリデータを素早くより出すことが可能
- レジスタはメモリよりも容量が少ない


[Computer system5](https://www.slideshare.net/secret/2VUPyEuoFInzDZ)
Visual Studio のフォントを設定する

Visual Studio のすべての表示フォントを変更する

1. [ツール]→[オプション]を開く
2. [オプション]ダイアログ→[環境]→[フォントと色]を選択
3. [設定の表示]プルダウン→**[環境]**を選択
4. フォント設定を変更
5. [OK]
システムの信頼性指標　MTBFとMTTR

応用情報技術者平成30年秋期 午前問15

システムの信頼性指標に関する記述のうち，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/ed4049fb-a303-f5b8-999c-1edb5371a7f8.png)


稼働率と、MTBF，MTTRはシステムの信頼性や可用性を評価するのに使われる指標で、次の式に示す関係があります。

　稼働率＝MTBF／(MTBF＋MTTR)

１、MTBF(Mean Time Between Failures)
システムの修理が完了し正常に稼働し始めてから、次回故障するまでの平均故障間隔

２、MTTR(Mean Time To Repair)
システムの故障を修理するために要した平均修復時間

つまり、MTBFは稼働時間、MTTRは故障時間ですね。
Visual Studio Presentation Modeで利用する

Visual Studio 2019/2022 を普段の開発環境ではない初期化された環境で起動できるようになりました。

```
devenv /RootSuffix <Alias>
```


例：

```powershell
"C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\Common7\IDE\devenv.exe" /RootSuffix Demo
```

参考：
Use Visual Studio in Presentation Mode
https://devblogs.microsoft.com/visualstudio/use-visual-studio-in-presentation-mode/
Visual Studio を常に管理者権限で実行する

Visual Studio を常に管理者権限で実行する場合、レジストリに以下を追加する。

```
Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers]
"C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\Enterprise\\Common7\\IDE\\devenv.exe"="~ RUNASADMIN"
"C:\\Program Files (x86)\\Common Files\\Microsoft Shared\\MSEnv\\VSLauncher.exe"="~ RUNASADMIN"
```
装置の稼働率

応用情報技術者平成30年秋期 午前問14

3台の装置X～Zを接続したシステムA，Bの稼働率について，適切なものはどれか。ここで，3台の装置の稼働率は，いずれも0より大きく1より小さいものとする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/f6b54fda-2dec-0329-a52c-c5fbc79b96e2.png)

１、稼働率
・直列
　Ra　×　Rb

・並列
　１－（１－Ra)　×　（１－Rb)

２、当該質問につきまして、
3つの装置X～Zの稼働率をそれぞれx～zとすると、システムA，Bの稼働率は次の式で表せます。

[システムA]
　(1－(1－x)(1－y))・z
＝(1－(1－x－y＋xy))・z
＝(x＋y－xy)・z
＝xz＋yz－xyz

[システムB]
　1－(1－x・z)(1－y)
＝1－(1－y－xz＋xyz)
＝xz＋y－xyz

[システムB]-[システムA] = y - yz　＝　y(1-z) ですね。

０＜x,y,z＜１だから（１を含まない）、y(1-z)>0　ですね。
つまり、システムBの稼働率が常に大きいですね。


まあ、もちろん、システムA、システムBの稼働率をx,y,zで式を求めてから、
仮に
１、x=y=z=0.1の場合は
システムA　＝０．０１＋０．０１ー０．００１＝０．０１９
システムB　＝０．０１＋０．１ー０．００１＝０．１０９
Bが大きいですね。

２、x=y=z=0.5の場合は
システムA　＝０．２５＋０．２５ー０．１２５＝０．３７５
システムB　＝０．２５＋０．５ー０．１２５＝０．６２５
Bが大きいですね。


３、x=y=z=0.9の場合は
システムA　＝０．８１＋０．８１ー０．７２９＝０．８９１
システムB　＝０．８１＋０．９ー０．７２９＝０．９８１
Bが大きいですね。

計算は面倒ですが、常にBが大きいですね。


もう一つの考えとは、Bは並行だから、Yの稼働率より大きいですね。
Aは直列だから、Zより小さいですね。
仮に、ｘｙｚが同じとすると、BがAより大きいだろう。

参照：
https://qiita.com/lymansouka2017/items/4e1ad6954db51d573975

https://www.ap-siken.com/kakomon/22_aki/q17.html
[iOS] [Android] [Crashlytics] Fabric SDKを使っているアプリはそろそろヤバイ

Crashlyticsを利用中のアプリについて、Fabric SDKを組み込んでいる場合、**2020年11月15日までにSDKを入れ替えてリリースしないと、Firebase Crashlyticsでクラッシュレポートを見ることができない**、ということになります。

Firebase Crashlyticsの公式ドキュメントより：

>注: Fabric SDK は非推奨になりました。
>Fabric SDK がアプリのクラッシュを報告するのは 2020 年 11 月 15 日までとなります。
>この日をもって、Fabric SDK と古いバージョンの Firebase Crashlytics SDK はアプリのクラッシュの送信を停止します。
>引き続き Firebase コンソールでクラッシュ レポートを表示するには、Firebase Crashlytics SDK のバージョンを Android の場合は 17.0.0 以降に、iOS の場合は 4.0.0 以降に、Unity の場合は 6.15.0 以降にアップグレードしてください。

https://firebase.google.com/docs/crashlytics/get-started?hl=ja


Firebase Crashlytics SDKへの移行手順はこちらにあります。

https://firebase.google.com/docs/crashlytics/upgrade-sdk?hl=ja
ライブマイグレーション

応用情報技術者平成30年秋期 午前問12

仮想サーバの運用サービスで使用するライブマイグレーションの概念を説明したものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/9cca33d8-5a25-f8ac-771d-63f2748666ec.png)


１、ライブマイグレーション(Live Migration)
"Migration"には「移動」や「移住」などの意味があり、"live"は「生で」「生の」と訳されるので、2つを繋げた"Live Migration"は、アプリケーションを実行状態のまま移動させる技術ということを表しています。
ライブマイグレーション(Live Migration)は、ある物理サーバ上で稼働している仮想マシンを、OSやソフトウェアを停止させることなく別の物理サーバに移し替え、処理を継続させる技術です。切り替えによるダウンタイムはほとんどゼロで、移動前の処理やセッションが全て引き継がれるため可用性を損なうことがありません。


２、ストレージ自動階層化の概念
データの利用目的や頻度などに応じて，データを格納するのに適したストレージヘ自動的に配置することによって，情報活用とストレージ活用を高める技術である。

「ストレージ階層化」とは、異なる性能のストレージ・デバイスを組み合わせ、利用頻度の高いデータを高速なデバイスへ、利用頻度の低いデータは安価で低速なデバイスに保存するという考え方です。
現在、主流のストレージ・デバイスとしては、高速なものから順に「SSD」、「SAS HDD」、「SATA HDD」などがあります。一般的に、高速になるほど、容量は小さくなり容量あたりの単価は高くなります（図1参照）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8e18dc8e-b8ee-00a2-b6ad-a53497f87f48.png)

・SSDはSolid State Drive（ソリッドステートドライブ）の略で、HDDと同様の記憶装置です。半導体素子メモリを使ったドライブ（記憶媒体）のことを指します。

SSDに用いられている「フラッシュメモリ」のデータを記録する最小単位をセルと呼びますが、このセルは徐々に劣化を起こします。一般的な「NANDフラッシュメモリ」の場合、セルはおよそ1千～1万回程度の書き込みと消去で寿命に達します。 毎日頻繁に大量のデータを書き換える場合などはHDDを選択しましょう。


３、マルチテナントの概念
複数の利用者でサーバやデータベースを共有しながら，利用者ごとにデータベースの内容を明確に分離する技術である。


４、リソースオンデマンドの概念

利用者の要求に応じてリソースを動的に割り当てたり，不要になったリソースを回収して別の利用者のために移し替えたりする技術である。


ーーーーーーーーーーーーーーーーーーーーーーーーーー
補足

仮想サーバの運用サービスで使用するライブマイグレーションの概念を説明したものはどれか。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/d07fd152-6627-012b-0219-7d75fb84db41.png)



・データの利用目的や頻度などに応じて，データを格納するのに適したストレージヘ自動的に配置することによって，情報活用とストレージ活用を高める技術である。
　→×。ストレージ自動階層化の概念です。

・複数の利用者でサーバやデータベースを共有しながら，利用者ごとにデータベースの内容を明確に分離する技術である。
　→×。マルチテナントの概念です。


・利用者の要求に応じてリソースを動的に割り当てたり，不要になったリソースを回収して別の利用者のために移し替えたりする技術である。
　→×。リソースオンデマンドの概念です。

参照：

https://www.ap-siken.com/kakomon/28_haru/q14.html

https://www.ap-siken.com/kakomon/28_haru/q14.html

ストレージ自動階層化とは
https://www.kobelcosys.co.jp/column/itwords/245/

SSD
https://www.pro.logitec.co.jp/about_hdd/hddssd/0718/

ハードディスク　HDD（SAS、SATA）、SSD
HDD(hard disk drive)とSSD(solid state drive)
https://itskillmap.com/menu2_07/
ストレージ技術におけるシンプロビジョニング

応用情報技術者平成30年秋期 午前問11

ストレージ技術におけるシンプロビジョニングの説明として，適切なものはどれか。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/32eb6662-db26-5369-7b19-5171a652f1d7.png)


１、シンプロビジョニング
シンプロビジョニング(Thin Provisioning)は、ハードディスク装置などの外部記憶装置(ストレージ)群を仮想化することで、物理的な記憶容量より多くの容量を利用者に割り当てることを可能にする仕組みです。

利用者の要求する記憶容量を最初から物理ディスク容量として割り当てると、未使用の物理ディスク領域が多くなり無駄が生じます。これがその技術存在の理由ですね。シンプロビジョニング機能が導入されたストレージでは、利用者の要求に応じて今後使用する予定の最大容量を割り当てておいて、実際の内部では使った分だけの物理容量を割り当てるということを行います。

・provisioning
《コ》プロビジョニング◆ネットワーク設備やシステム管理、ストレージ管理設備などを顧客のニーズに応じて提供するプロセス。


下記例として、シンプロビジョニング機能が導入されたストレージでは、150GB空き容量が利用できるようになりますね。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/740391b4-2df4-3739-0091-7ab40b7c743b.png)


２、ミラーリングの説明
同じデータを複数台のハードディスクに書き込み，冗長化する。
コンピュータにおけるミラーリングとは、
複数のファイルやディレクトリ構造を、別のストレージにまったく同じ構成で複製すること。

ハードディスクドライブ障害の対策として、複数のローカルなディスクドライブに同一の内容を記録すること。ディスクドライブのミラーリングで使用されたディスクをミラーリングディスクと呼ぶ。主に高可用性を求められるサーバ用途に使用されるほか、小規模サーバや個人のコンピュータでも使用される。RAIDと呼ばれる技術では、複数のディスクドライブを仮想的に単一のディスクとして運用することができる。RAIDはその目的に応じ、0から6までのレベルがあり、そのなかで、RAID1（レベル1）をミラーリングと呼ぶ。


３、パーティション分割の説明
一つのハードディスクを，OSをインストールする領域とデータを保存する領域とに分割する。
パーティション分割とは、ひとつの物理ストレージ（HDD・SSD）を仮想的に複数に分割する事です。

４、SAN(Storage Area Network)の説明
ファイバチャネルなどを用いてストレージをネットワーク化する。
ストレージ・ネットワークとは、その名のとおり、ネットワークとストレージを結び付けるものである

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/591618/8252c13d-8061-7858-b33f-421f24f28245.png)


参照：

https://www.ap-siken.com/kakomon/26_aki/q10.html

ミラーリング (Mirroring)
https://ja.wikipedia.org/wiki/%E3%83%9F%E3%83%A9%E3%83%BC%E3%83%AA%E3%83%B3%E3%82%B0

ストレージをネットワーク化する
https://www.itmedia.co.jp/im/articles/0605/24/news102.html
csvkitでvlookupのような表結合を行う

cost.csv
TYPE,COST
A,100
B,200
C,300

model.csv
MODEL,TYPE
m1,A
m2,C
m3,B
m4,C
m5,A

csvjoin -c TYPE --left model.csv cost.csv

MODEL,TYPE,COST
m1,A,100
m2,C,300
m3,B,200
m4,C,300
m5,A,100

csvstatを使うとcostの合計も計算できる。

csvjoin -c TYPE --left model.csv cost.csv | csvstat -c COST --sum
Scrapyのインストールのトラブルと対応

#概要
scrapyをインストールしようとしたら、エラーが発生したため対応した時のメモ

#環境
- Widnows 10
- Anaconda
- Python3.7

#現象

インストール手順

```sh
$ conda install scrapy
```

エラー内容

```sh
$ scrapy startproject pdb_get

<中略>

from cryptography.hazmat.bindings.openssl.binding import Binding File "C:\Users\kimisyo\.conda\envs\sars_trace_1\lib\site-packages\cryptography\hazmat\bindings\openssl\binding.py", line 14, in <module>
    from cryptography.hazmat.bindings._openssl import ffi, lib
ImportError: DLL load failed: 指定されたプロシージャが見つかりません。
(sars_trace_1)
```

#対応
condaをやめてpipでインストールする

```
$ conda uninstall scrapy
$ pip install --force --upgrade scrapy
$ scrapy startproject pdb_get
```
ラズパイとAWSとSoftEtherで自宅のネットワークにVPN接続する手順

# この記事の対象者
- 外出先から自宅のネットワークへVPNでアクセスしたい方

- 既存の記事のやり方ではなぜか失敗してしまっている方

# 作りたいもの
タイトル通り、外出先から自宅のネットワークへアクセスする仕組みを

- SoftEther

- AWS(EC2)

- ラズパイ(Ubuntu18.04)

の3つで作ります
イメージ図(手抜き)はこんな感じです
![自宅VPN.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696389/e7a3259d-5f52-fe1b-efc9-9a119098b148.jpeg)

今回の場合、自宅のネットワークのポート解放は行わなくて良いです

# 全体の流れ
1. EC2にインスタンスを作成
2. EC2にSoftEther VPN Serverをインストール
3. 自宅のラズパイにSoftEther VPN Bridgeをインストール
4. EC2とラズパイをカスケード接続
5. 外出先からEC2へVPN接続し、疎通確認

ざっくりこんな流れです

## 1. EC2にインスタンスを作成
ここの手順はいくらでも記事があるので今回は省略しますが、インスタンスタイプに関しては私の場合無料枠がまだあったのでt2.microを選択しました(ここのスペックで通信速度が変わると思ってます)

##2. EC2にSoftEther VPN Serverをインストール
この部分に関しては[こちらの記事](https://qiita.com/showwin/items/92861057a8b62611444d "こちらの記事")を参考に進めました
この時点では仮想HUBやユーザーはまだ作成しないでください
ここで注意点があります
**「仮想 NAT および DHCP サーバー機能 (SecureNAT 機能) の有効化」については行わないでください**
これは単体のVPNサーバーとして用いるなら有効化して構わないのですが、今回の場合これを有効化してしまうと失敗します(私も詳しくは無いですが、カスケード接続で双方向の通信が必要なのにNATがあるとそれが阻まれてしまうのだろうと解釈しています。。。)

##3. 自宅のラズパイにSoftEther VPN Bridgeをインストール
これも2とほぼ同様の手順(VPN ServerをVPN Bridgeに読み替えて行ってください)

##4. EC2とラズパイをカスケード接続
ここからは自宅のネットワークのMacかWindowsのPC(ラズパイと同じネットワークのPC)でSoftEther VPN Server Managerによって作業を行っていきます
ソフトの使い方自体は他にいくらでも記事があるので省略しますが、流れを示します

###EC2側
1. Server Managerでもvpncmdでもどちらでも良いですが、仮想HUBを一つとそれに対するユーザーを2つ作ります(ユーザーを2つ作るのはカスケード接続用と通常のVPNサーバー用で分けるためです)
2. L2TPをONにして事前共有キーを控えておきます
3. 先程出てきたSecureNATをここで設定します。具体的には、NAT機能は無効にしてDHCPサーバーとしての機能のみ有効にします。これに関するServer Managerによる手順は以下の通りです


　「仮想HUBの管理」　→　「仮想NATおよび仮想DHCPサーバー機能」
　と進んだ後、SecureNATが無効であることを確認した後に
　「SecureNATの設定に進みます」
　![2020-08-23 08.21.28 のスクリーンショット.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696389/d29d59b4-2b85-54dd-465b-c1a7084f2670.jpeg)
　その後、次のように「仮想NAT機能を使用する」からチェックを外し、
　「仮想DHCPサーバー機能を使用する」にチェックを入れてください
　![2020-08-23 08.21.56 のスクリーンショット.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/696389/bfd353ac-afd2-68f3-ca9b-e40e6dd499aa.jpeg)

これでEC2側の設定は終了です

###ラズパイ側
1. まず仮想HUBを1つ作ります
2. 次に1で作った仮想HUBの設定化からEC2側の仮想HUBへカスケード接続を行います
3. こちらはEC2側とは違ってSecureNATを有効にします(NAT機能とDHCPサーバー機能が両方有効です)

これでラズパイ側の設定は終了です

##5. 外出先からEC2へVPN接続し、疎通確認
ここまでで目的のネットワークは完成しているので、出先からEC2へVPN接続して自宅のNAS等にアクセス出来ることを確認してください

#注意点・ポイント

- SecureNATの設定が肝になります。ここを間違えないようにしましょう

- ローカルブリッジを作成するといった記事が多いのですが、私の環境では失敗してしまったので、同様の状態に陥っている方はこちらの記事を試してみてください(ここは完全に私の理解不足なのでローカルブリッジを作成した上でも成功する方法はあるかもしれません)

- 今回のような構成だとEC2へ接続できた時点で自宅のネットワークに即侵入されることになるのでセキュリティーグループの設定等には十分注意しましょう

- 今回の記事ではラズパイを使いましたが、SoftEtherが動けばなんでも良いと思います(未検証) 

#参考にさせていただいた記事

- https://blog.seamonkey-delivery.com/pc/1642/

- https://ja.softether.org/4-docs/1-manual/A/10.B

- https://www.gadgets-today.net/?p=1004

- https://qiita.com/showwin/items/92861057a8b62611444d
Docker+nginxでHTTPSサーバを簡単に構築

DockerのVolumeをホスト側に持って証明書と設定ファイルとHTMLを置いて読ませる。
他の環境とセットで動かしたかったのでDocker-composeにしているが、もちろんDocker単体でも良い。

Let's encryptで証明書を取得し以下に格納しておく。
手順は他に参考記事がたくさんあるのでここでは触れず。
ホスト側の置き場所はDockerからアクセスできる場所ならどこでも良い。

```
./nginx/conf/certs
```

default.confを作成し./conf.dに置く。
HTTP 80番は使わないので書かず。

```
server {
    listen              443                 ssl;
    server_name      your.hostname; # 自分で取得したホスト名に変更
    ssl_certificate     /etc/nginx/certs/server.crt;
    ssl_certificate_key /etc/nginx/certs/server.key;

    location / {
        root   /usr/share/nginx/html;
    }
}
```

これで完了。スタートさせる。

(必要なら)
htmlを用意してホストに置いておく
./html

docker-composeをこのようにかく。

```docker-compose.yml
nginx:
  restart: always
  image: nginx
  volumes:
          - ./html:/usr/share/nginx/html:ro
          - ./conf.d:/etc/nginx/conf.d
          - ./nginx/conf/certs:/etc/nginx/certs
  ports:
    - "8080:443" # デフォルト443のままで良いなら不要
```
rails tutorial 第5章

#はじめに

独学で[rails tutorial](https://railstutorial.jp/)を進めていく過程を投稿していきます。

進めていく上でわからなかった単語、詰まったエラーなどに触れています。

個人の学習のアウトプットなので間違いなどあればご指摘ください。

初めての投稿なので読みにくいところも多々あるかと思いますがご容赦ください。


#第5章 レイアウトを作成する
##5.1.2 BootstrapとカスタムCSS
余談です。

リスト5.6でBootstrap CSSフレームワークを導入した後、ブラウザで確認をしてみました。
すると先の演習(5.1.1の演習3)により猫の画像が表示されたままだったのでCTRL+/でコメントアウトを試みましたところ

```
# <%= image_tag("kitten.jpg", alt: "cat image") %>
```
となりブラウザで確認をすると猫の画像は表示されたままでした。

どうやらerbをコメントアウトする場合は

```
<%#= image_tag("kitten.jpg", alt: "cat image") %>
```
とし、<%の後に#をつけるようです。
(次の演習でこちらの内容についてフォローされていました)

##5.4.2 ユーザー登録用URL

演習1
もしまだ5.4.1.1の演習に取り掛かっていなければ、まずはリスト 5.41のように変更し、名前付きルートsignup_pathを使えるようにしてください。また、リスト 5.43で名前付きルートが使えるようになったので、現時点でテストが green になっていることを確認してください。([rails tutorial](https://railstutorial.jp/)第5章より引用)

問題発生!!
成功するはずのテストでエラーが出ました。

```
ERROR["test_should_get_root", #<Minitest::Reporters::Suite:0x00000000091feba0 @name="StaticPagesControllerTest">, 0.5797893999842927]
 test_should_get_root#StaticPagesControllerTest (0.58s)
ActionView::Template::Error:         ActionView::Template::Error: Permission denied @ rb_file_s_rename - (C:/environment/sample_app/tmp/cache/assets/sprockets/v4.0.0/99/99m8UCKl4j8IpsVOK8ltLHyNh8Ae0nHw3GBkC34V_co.cache.47870560.18376.12839, C:/environment/sample_app/tmp/cache/assets/sprockets/v4.0.0/99/99m8UCKl4j8IpsVOK8ltLHyNh8Ae0nHw3GBkC34V_co.cache)
```
あれ?似たようなエラー3章で遭遇したような、、、
3章で参考にした記事
https://qiita.com/yasumichi/items/ccf1f7f57b6627034226

ということで改めて

```
> rails tmp:cache:clear
> rails assets:precompile
```
こちらのコマンドを入力し、テストを実行したら無事成功しました。

#終わりに
今回の章はそこまで躓かずに終えることが出来ました。
windowsでiverilog その70

# 概要　

windowsでiverilogやってみた。
8bitのcpu書いてみた。

# cpu仕様

レジスタマシン
8bit CPU（汎用レジスタが8bit8本）
マシン語は16bit固定長
命令は、ロード、ストア、代入、加算、減算、xor、大きい、小さいの11種類
命令に4bit、レジスタ指定に3bit、8bitを値に


|15:12|	11|	10:8|	7:0|
|:--|:--|:--|:--|
|命令|	フラグ|	レジスタ|	値|

レジスタは3bitなので8コ、最後レジスタをプログラムカウンタr7
条件判定用のフラグはゼロフラグだけ、フラグによるスキップ
出力はメモリにマッピング（RAMは16bit x 32word、最後の32番目を出力に接続）

# アセンブラの説明


```
r2 9   //r2に9を代入。
r1 0   //r1に０を代入。
r1 + 1 //ｒ１をインクリメント。
out r1 //ｒ１を出力。
r2 - 1 //ｒ２をデクリメント。
jz 2   //ゼロならアドレス2へジャンプ。
jp 6   //アドレス６へジャンプ。
```

# サンプルコード


```

module cpu8(input clk, input rst, output [7:0] outport);
	reg [7:0] r[7:0];
	reg [15:0] mem[31:0];
	reg zeroflg;
	wire [15:0] code;
	wire skipflgz;
	wire [3:0] op;
	wire [2:0] rega;
	wire [7:0] opland;
	assign code = mem[r[7]];
	assign op = code[15:12];
	assign skipflgz = code[11];
	assign rega = code[10:8];
	assign opland = code[7:0];
	assign outport = mem[31][7:0];
	task init_blink;
	begin
		mem[0] <= 16'h02_09; //r2 9
		mem[1] <= 16'h01_00; //r1 0
		mem[2] <= 16'h31_01; //r1 + 1
		mem[3] <= 16'h21_1f; //out
		mem[4] <= 16'h52_01; //r2 - 1
		mem[5] <= 16'h0f_02; //jz 2
		mem[6] <= 16'h07_06; //jp 6
	end
	endtask
	task init_reg;
	begin
		r[0] <= 16'h0;
		r[1] <= 16'h0;
		r[2] <= 16'h0;
		r[3] <= 16'h0;
		r[4] <= 16'h0;
		r[5] <= 16'h0;
		r[6] <= 16'h0;
		r[7] <= 16'h0;
		zeroflg = 1'b0;
	end
	endtask
	always @(posedge clk, negedge rst)
	begin
		if (!rst)
		begin
			init_blink;
			init_reg;
		end
		else
		begin
			if (skipflgz && zeroflg)
				r[7] <= r[7] + 1;
			else
			begin
				case (op)
				4'h0://let
					r[rega] <= opland;
				4'h1:// load mn
					r[rega] <= mem[opland];
				4'h2:// save mn
					mem[opland] <= r[rega];
				4'h3:// + n
					r[rega] <= r[rega] + opland;
				4'h4:// a + b
					r[rega] <= r[rega] + r[opland];
				4'h5:// - n
				begin
					r[rega] <= r[rega] - opland;
					zeroflg <= r[rega] == 0;
				end
				4'h6:// < n
				begin
					r[rega] <= r[rega] < opland;
					zeroflg <= r[rega] == 0;
				end
				4'h7:// > n
				begin
					r[rega] <= r[rega] > opland;
					zeroflg <= r[rega] == 0;
				end
				4'h8:// xor
					r[rega] <= r[rega] ^ r[opland];
				4'h9:// load mb
					r[rega] <= mem[r[opland]];
				4'ha:// save mb
					mem[r[opland]] <= r[rega];
				endcase
				if (rega != 7)
					r[7] <= r[7] + 1;
			end
		end
	end
	initial
	begin
		$monitor("%d", outport);
	end
endmodule

module test2(input clk, input rst, output led2);
	wire [7:0] outport;
	assign led2 = outport[0];
	cpu8 u(.clk(clk), .rst(rst), .outport(outport));
endmodule

module test;
	reg clk,
		rst;
	test2 t(.clk(clk), .rst(rst), .led2(led2));
	initial
	begin
		//$monitor("%d", led2);
		clk = 0;
		rst = 1;
		#2
			rst = 0;
		#2
			rst = 1;
		#900
			$finish;
	end
	always
		#1
			clk = ~clk;
	initial
	begin
		$dumpfile("test.vcd");
		$dumpvars(0, test);
	end
endmodule





```

# 実行結果


```

VCD info: dumpfile test.vcd opened for output.
  x
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10


```

以上。
簡易CMSで無料ブログを公開、カスタム レイアウトを複数追加 #Vue #Vue-CLI #javascript

# 概要
事例的な内容となります。

CMSのアップデート内容で、
レイアウトを追加しました。

・デモサイトは、GithubPagesに設置して例になります。
・投稿データ等の、編集機能は前回と同じで。MD書式対応です

***
# 環境

Vue CLI
vue: 2.6.11
vue-router

***
#前の関連のページ
前の CMS表示の内容

https://note.com/knaka0209/n/nc10d352550ed

***
#  画面 Top

・type2, グリッドレイアウト風の
　投稿データ表示となります。

![ss-type2-0821a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159710/a8cc6b49-28ed-16f3-1730-19373a02ca4e.png)

### ■ 参考の、デモのページ　

https://kuc-arc-f.github.io/cms-sample-type2

### ■ 参考のコード
https://github.com/kuc-arc-f/vue_spa3cms3_type2

***
・type3 , 少し明るめ
![ss-type3-0821b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159710/106bf20f-1dab-fa48-c147-3f05252b4c5f.png)


### ■ 参考の、デモのページ　、type3

https://kuc-arc-f.github.io/cms-sample-type3

### ■ 参考のコード , type3

https://github.com/kuc-arc-f/vue_spa3cms3_type3


***
・type4
初版と、似ていますが、サイドに。twitterタイムラインを埋込可能な形です。
![ss-type4-0822a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159710/5bd5c352-cbe9-2f9a-bcf3-4db6c125d989.png)


### ■ 参考の、デモのページ　、type4

https://kuc-arc-f.github.io/cms-sample-type4

### ■ 参考のコード　、type4

https://github.com/kuc-arc-f/vue_spa3cms3_type4

***

### ■　補足
・初版レイアウトの、デモはこちら
https://kuc-arc-f.github.io/cms-sample


***
KENTA師匠に学ぶ高給取りエンジニアになるためのアンテナの立て方

時給単価5000円以上の高単価案件獲得は長い道のりなので、
KENTA師匠の動画から何が高単価案件なのか？
どんなスキルを学び、どうアプローチすれば高単価案件をゲットできるか参画できるのか。
情報をまとめてみた。


-----------------------------------------
## フリーランスエンジニアが「本当の高単価案件」を獲得するための指針
https://www.youtube.com/watch?v=01V3ZedFv2g


#### 高単価の基準

東京周辺のweb系フリーランスエンジニアの準委任契約の案件で
一般的に高単価と言われる基準は
月160時間の稼働で80万前後、時間単価に直すと大体5000円程度になる。
しかし本当の高単価案件は時間単価がさらにもっと上になる。



※本当の高単価案件に参画する指針その1
#### 「上流業務を専門にすること」

つまり、新規開発フェーズの設計の工程等である。

このような案件
（例として高単価のバックエンド）に参画するため持つべきスペックは

「手を動かしてコードをかける」は大前提
AWSやGCPなどのクラウドインフラやアプリケーション全体の
アーキテクチャ設計とか基盤コード開発とか

インフラのコード化とかCICDパイプライン構築などの
devops系を担当できるエンジニアはそのエンジニアの能力事態で
開発業務全体のの作業効率やアプリの品質が大きく左右されるため
高単価を得やすくなるケースが多い


※本当の高単価案件に参画する指針その2
#### 「新規開発フェーズの案件に参画する」

そういった上流業務を専門に出来れば、案件の初期の時点から
チームに参加することが多くて

その案件の意思決定者やキーマンの方と非常に近いポジションで
しかもそのチーム内の基準単価が決まってない段階で単価交渉を行うことが
可能になるのでより高単価で参画しやすいメリットがある。

しかし、アーキテクチャが確立されていて、ほぼプログラミングメインの
下流工程を担当する場合、影響が少ない為、単価も多少落ちる。

保守改修フェーズに至っては、人件費の見直しもされるフェーズなので
高単価を得るのはますます難しくなる。



------------------------------------------------------
## 年収1200万円の高額オファーを獲得したエンジニアがお薦めする5つの業務経験
https://www.youtube.com/watch?v=Aop6PgReM0E


https://qiita.com/poly_soft/items/f08460f559ed5e9304b5

1.大量アクセスを捌く業務経験
　スケールアウトやスケールアップによるインフラの冗長化もこれにあたるか。
　Amazon CloudFrontやElastic cash(redis)を使用した、大容量データを
　高速に送る技術もこれにあたるかもしれない。


2.大規模データを扱う業務経験
　いわゆるビッグデータからpythonなどでデータ分析して
　ビジネスに生かすデータサイエンティストがその部類にあたる。


3.難易度の高い言語による開発経験
　C++やJAVAは間違いなく、難易度が高い言語なので、
　長い業務経験者なら重宝される？
　今だったら、pythonやgoのほうが、将来性ありそうな気がする。


4.アーキテクト的な業務経験
　いわゆる上流業務、新規開発フェーズで仕様が決まってない中、
　アーキテクト設計してドキュメントに落とす仕事がこれにあたる。


5.DevOps系の業務経験
　CICDパイプラインの構築
　　（circleCI・aws code deploy・aws code build）
　インフラのコード化
　　（terraform・ansible・cloudfomation）

上記のように、組織環境を技術で効率化していく業務がdevops
linuxやawsの知識や経験あることは大前提。




------------------------------------------------------
## 高単価を得たいなら「アンカリング効果」を活用しよう
https://www.youtube.com/watch?v=7Nv-l2hjiB0


「アンカリング効果」とは？
「直前に提示された数字に判断が歪められてしまう認知バイアスの一種」

（例）
「タンカー事故による環境汚染対策への支援としてoドル以上寄付するつもりはありますか？」
というアンケートを行った際

この「oドル以上」の部分を「5ドル以上」と記載した際の寄付金が平均20ドルだったのに対し
「400ドル以上」と記載した際の寄付金が平均はなんと7倍の143ドルになった。

このように私たちは
「直前に提示された基準値を判断から除外する」ことが非常に苦手であり、
その様子が「船がアンカーを下ろして係留してる様子」に似てることから
「アンカリング効果」と呼ばれる。


(例)給与や単価を低くするアンカリング効果の例

「業務未経験からweb系エンジニアにジョブチェンジした際の１年目の給与」がそれです。

よりアンカーが高い位置に設定されてるフリーランスエンジニアになってしまえば逃れられる。

また、エージェントが持ってきた案件も、時給いくらまでと暗黙の了解が決まっているので
更に上の高単価を目指すには望ましくはない。

※本当の高単価を実現するためには
「まだプロジェクトの座組が確定していない新規開発フェーズの案件に

「エージェントさんではなく、自分の人脈経由で引き合いを頂いて、こちらから直接金額を提示して単価交渉する」
というのが、最も賢い選択になる。

他にも「技術顧問」や「cto、cioのアドバイザー」開発以外の高単価のポジションも同じく。


「高い単価を提示してくるエンジニアの方がより優秀に見えてしまう」効果がある。
Headless Service が必要になる場面について

## 前提
- 本記事執筆時の各ツールのバージョン  
kubernetes v1.16.5  
docker 19.03.12
- 書いている人は k8s をこれから使ってみようとしている人。

## 悩み
- StatefulSet を使う際に Headless Service が出てきて、機能は理解したが必要性がすぐにピンとこなかった。

## 結論
- StatefulSet のようにステートフルなもので、状態を持っている Pod に対して直接接続したい。（プライマリ / レプリカ構成の DB、とか）
- k8s の実装とは別の、外部の[サービスディスカバリ](https://qiita.com/saburou_itijiku/items/937ef53711ad5fc4a526)を利用したい。（gRPC だから envoy 挟みたい、とか）
- pod へのルーティングを自分でコントロールしたい。（均等に割り振りたいけど偏っちゃう、とか）

他にもあるとは思いますが、調べて出てきた具体的な用途はこんな感じでした。

## Headless Service の機能
通常の`Service`はデフォルトでは単一の`ClusterIP`が振られます。これは文字通りクラスター内でのIPで、ここを窓口にして裏側の Pod へはいい感じにロードバランシングやプロキシしてくれます。
しかし`.spec.clusterIP`の値を`None`にすることで、サービス自体のIPは設定されない Headless Service となります。
サービス名で引いた時、セレクターを設定しているかどうかで DNS の挙動がかわるのですが、結論で書いてあるような用途はセレクター有りで使うのかなと思います。

- セレクター有りの場合  
裏側にある Pod の IP を全部返してきます。ちなみにこの場合にサービス名でつなごうとすると DNS ラウンドロビンとおんなじ感じでつながります。
- セレクター無しの場合  
公式の説明では、以下です。  
    - ExternalNameタイプのServiceに対するCNAMEレコード  
    - 他の全てのServiceタイプを含む、Service名を共有している全てのEndpointsレコード  

`ExternalName`を yaml に書くと`ExternalIP`として設定されるのは理解しましたが、後者についてはまだよくわかってません。


## ということで
DNS やルーティングについての知識がないので理解ができていない部分もありますが、Headless Service の背景はわかりました。

## 参考文献
- [kubernetes - What exactly is a headless service, what does it do/accomplish, and what are some legitimate use cases for it? - Stack Overflow](https://stackoverflow.com/questions/52707840/what-exactly-is-a-headless-service-what-does-it-do-accomplish-and-what-are-som)
- [KubernetesのHeadless Service を理解したい  - Qiita](https://qiita.com/yuta_vamdemic/items/4f21fc955c0ced6f33d6)
- [Kubernetes "サービス"の概要についての自習ノート](https://qiita.com/MahoTakara/items/d18d8f9b36416353066c#%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)
- [公式ドキュメント - Service](https://kubernetes.io/ja/docs/concepts/services-networking/service/)
- [Service Discovery Pattern  - Qiita](https://qiita.com/saburou_itijiku/items/937ef53711ad5fc4a526)
git cloneしたリポジトリでgit branchをいきなり使うと怒られた件

こんにちは、rickyです。
今回はgitについてはまったので情報をまとめてみました。

#問題点
今回はgit repositoryをロカール環境に作ってbranchを切ろうとしたら詰まったので対処法と原因の追究を行います。
まず、ことの起こりは
github上でリポジトリの作成を行いました。
その後sshでローカル環境にcloneし、そのリポジトリの階層に移動しました。
そしてgit branchを行ったところfatal: Not a valid object name: ''.
この翻訳は有効なオブジェクト名ではありません。という意味でした。
これはgitにマスターが作成されていないとブランチを切ることができないことに起因しているようです。

#解決策
そのため適当なファイルなどをプッシュしてやればブランチが切ることができるようになります。

#結論
ブランチは 1)『新しい機能を追加したり、バグを修正したりするときは、どんなに大きくても小さくても、変更をカプセル化するために新しいブランチを生成します。』と記載されているようにあくまで修正や変更のための機能のため、何もpushされていない状態では使えなかったと推察されます。

#参考記事
1)https://www.atlassian.com/git/tutorials/using-branchesより抜粋
gitで環境別のコンフィグを管理するベストプラクティス

# gitで環境別のコンフィグを管理するベストプラクティス

## やりたいこと
- 接続系のコンフィグファイルを、ローカルで変更する（例えば"DB:localhost"とか）
- 当然commitには含めたくない
- だけどpullもされたくない
- でも、git管理はしたい（できればリモートには雛形かprodの状態で）

## 背景
- gitignoreすると、管理そのものがされなくなるので困る
- いちいちcommit/pullのときstashするのはめんどくさすぎるし、忘れた人がローカルをリモートにあげがち
- assume-unchangedすると、大元に変更があった時にconflictする
- なぜトーパルズは「gitignorelocal」を用意しなかったのか！

という問題に何度か遭遇して考えて自分の結論を出したので残しておく
（あとググってもそういう記事があんまりなかった）

## 答え

- 本来あるべき場所、正規パスのコンフィグファイルはgitignoreする
- このignoreはcommitに含めて各開発者が同様になるようにする
- config置き場を作り、そこにdev/stg/prodのファイルをおく
- デプロイの瞬間に対応するコンフィグを正規の場所に配置するようにする
- ローカル設定ファイルはそのまま自分の環境で正規のパスに置いておく


## 後書き
- もっといいやり方知っている人は教えてください
- 後からプロジェクトに参画したときはすでに開発者のコンフィグがcommitされている場合しかなかった
- トーパルズはいつも正しい。
Flutter で Channel を切り替える

# やること

Flutter で、使用する Channel を切り替える。

## Channel とは

- stable
- beta
- dev
- master

の種類があり、機能だったり安定性に差がある。

Ref: https://flutter.dev/docs/development/tools/sdk/releases

# やりかた

## 現在の Channel を確認する

```bash
$ flutter --version
Flutter 1.20.2 • channel stable • https://github.com/flutter/flutter.git
Framework • revision bbfbf1770c (9 days ago) • 2020-08-13 08:33:09 -0700
Engine • revision 9d5b21729f
Tools • Dart 2.9.1
```

`stable` になってるみたい。

## beta に切り替えてみる

例えば beta に切り替えてみる。

```bash
$ flutter channel beta
Switching to flutter channel 'beta'...
flutter git: Switched to a new branch 'beta'
git: Branch 'beta' set up to track remote branch 'beta' from 'origin'.
Successfully switched to flutter channel 'beta'.
To ensure that you're on the latest build from this channel, run 'flutter upgrade'
```

切り替わった。

## 各種アップデート

Channel を切り替えると、それに伴って使用するパッケージだったりも変わるので、更新しておく。

```bash
$ flutter upgrade
$ flutter pub get
```

おわり。
WildFly Maven Pluginを使ってWildFlyにデプロイ（メモ）

# はじめに

WildFly Maven Pluginを使ってWildFlyにデプロイする。

# 環境

- CentOS 7.5(JDK8インストール済み)
- WildFly 20.0.1.Final
- WildFly Maven Plugin 2.1.0.Beta1


# Wildflyのインストール

Wildflyは以下からダウンロード。

- [WildFly Downloads](https://wildfly.org/downloads/)

以下のコマンドでインストールと起動。

```
# tar xvzf /tmp/wildfly-20.0.1.Final.tar.gz -C /opt

# cd /opt/wildfly-20.0.1.Final/bin/
# ./standalone.sh -b 0.0.0.0 –bmanagement=0.0.0.0
～省略～
00:21:59,063 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0025: WildFly Full 20.0.1.Final (WildFly Core 12.0.3.Final) started in 6161ms - Started 314 of 580 services (370 services are lazy, passive or on-demand)
00:21:59,065 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0060: Http management interface listening on http://127.0.0.1:9990/management
00:21:59,065 INFO  [org.jboss.as] (Controller Boot Thread) WFLYSRV0051: Admin console listening on http://127.0.0.1:9990
```

ユーザー作成

```
# ./add-user.sh -u 'testadmin' -p 'xxxxxxxxxx'
```


# デプロイするサンプルアプリケーション作成

以下でサンプルアプリケーションを作成し、warファイルまで作成。

```
mvn archetype:generate -DgroupId=com.example -DartifactId=web-app -DarchetypeArtifactId=maven-archetype-webapp -DinteractiveMode=false

mvn compile war:war
```

以下のwarファイルが生成される。

.\web-app\target\web-app.war


# WildFlyにデプロイ

作成したプロジェクトのpom.xmlにWildFly Maven Pluginを追加。

```xml:pom.xml
  <build>
    <finalName>web-app</finalName>
    <plugins>
      <plugin>
        <groupId>org.wildfly.plugins</groupId>
        <artifactId>wildfly-maven-plugin</artifactId>
        <version>2.1.0.Beta1</version>
        <configuration>
          <hostname>192.168.10.56</hostname>
          <username>testadmin</username>
          <password>xxxxxxxxxxxx</password>
        </configuration>
      </plugin>
    </plugins>
  </build>
```

以下でデプロイ。


```
> mvn wildfly:deploy
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------< com.example:web-app >-------------------------
[INFO] Building web-app Maven Webapp 1.0-SNAPSHOT
[INFO] --------------------------------[ war ]---------------------------------
[INFO]
[INFO] >>> wildfly-maven-plugin:2.1.0.Beta1:deploy (default-cli) > package @ web-app >>>
～省略～
[INFO] JBoss Threads version 2.3.3.Final
[INFO] JBoss Remoting version 5.0.12.Final
[INFO] XNIO version 3.7.2.Final
[INFO] XNIO NIO Implementation Version 3.7.2.Final
[INFO] ELY00001: WildFly Elytron version 1.9.1.Final
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  5.630 s
[INFO] Finished at: 2020-07-11T08:00:42+09:00
[INFO] ------------------------------------------------------------------------
```

# 参考

- [WildFly Maven Plugin](https://docs.jboss.org/wildfly/plugins/maven/latest/index.html)
vistaでquartus その30

#概要

vistaでquartusやってみた。
アセンブラ作ってみた。

#参考にしたページ

http://www.yama-lab.org/fpga-i2c/index.php?FpgaI2c

#アセンブラ仕様

|ニーモニック	|意味	|stackの状態|code|
|:---|:--|:--|:--|
|%	|stack-1, stackの剰余を求める。	|1個減る|f00|
|+	|stack-1, stackの加算を求める。	|1個減る|f000|
|/	|stack-1, stackの除算を求める。	|1個減る|f00|
|*	|stack-1, stackの乗算を求める。	|1個減る|f002|
|-	|stack-1, stackの減算を求める。	|1個減る|f001|
|=	|stack-1, stackの等しいを求める。	|1個減る|f00a|
|>	|stack-1, stackの大を求める。	|1個減る|f00e|
|<	|stack-1, stackの小を求める。	|1個減る|f00f|
|push 1	    |stackに整数1を積む。	        |1個増える|1001|
|set i	    |変数iにstackを入れる。	|1個減る|300i|
|get i	    |stackに、変数iの値を入れる。	|1個増える|200i|
|out 	    |stackを数値で印字する。	|1個減る|e000|
|jz i	    |stackが真ならiへ飛ぶ。       |1個減る|500i|
|jnz i	    |stackが偽ならiへ飛ぶ。       |1個減る|600i|
|jmp i	    |無条件でiへ飛ぶ。		|変化無し|400i|


#ソース

```
push 'h'
out
push 'e'
out
push 'l'
out
push 'l'
out
push 'o'
out
push ' '
out
push 'w'
out
push 'o'
out
push 'r'    
out
push 'l'
out
push 'd'
out
push '!'
out
loop:
jmp loop

    
```

#結果


```
mem[12'h000]=16'h1068 ; //             push 'h'
mem[12'h001]=16'he000 ; //             out
mem[12'h002]=16'h1065 ; //             push 'e'
mem[12'h003]=16'he000 ; //             out
mem[12'h004]=16'h106c ; //             push 'l'
mem[12'h005]=16'he000 ; //             out
mem[12'h006]=16'h106c ; //             push 'l'
mem[12'h007]=16'he000 ; //             out
mem[12'h008]=16'h106f ; //             push 'o'
mem[12'h009]=16'he000 ; //             out
mem[12'h00a]=16'h1NaN ; //             push ' '
mem[12'h00b]=16'he000 ; //             out
mem[12'h00c]=16'h1077 ; //             push 'w'
mem[12'h00d]=16'he000 ; //             out
mem[12'h00e]=16'h106f ; //             push 'o'
mem[12'h00f]=16'he000 ; //             out
mem[12'h010]=16'h1072 ; //             push 'r'    
mem[12'h011]=16'he000 ; //             out
mem[12'h012]=16'h106c ; //             push 'l'
mem[12'h013]=16'he000 ; //             out
mem[12'h014]=16'h1064 ; //             push 'd'
mem[12'h015]=16'he000 ; //             out
mem[12'h016]=16'h1021 ; //             push '!'
mem[12'h017]=16'he000 ; //             out
mem[12'h018]=16'h4018 ; //loop:  jmp loop

```

#成果物

https://embed.plnkr.co/plunk/S3UNqN4cYy1jhA1N

#実機実行結果

![無題.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/18104/2d711f1f-f66d-933c-ae03-237b6b306510.jpeg)


以上。
自動記事作成AI「Articoolo(アルティコーロ)」で職場の人間関係の記事を書いたら、インドの労働法に辿り着いた件

ディープラーニングによる人工知能・AIの発展によって、自然減処理の研究分野は2010年以降急速な発展を遂げました。
自然言語処理では、感情分析(ネガポジ判定)や文章の要約、自動分類などのAIサービスが登場しました。


+ [Google Cloud Natural Language](https://cloud.google.com/natural-language?hl=ja)(Google 自然言語処理サービス)
+ [A32RT-Text Classification API](https://a3rt.recruit-tech.co.jp/product/textClassificationAPI/)(リクルート テキストの自動分類)

## AIの夢は記事の自動生成

そんな中自然言語処理が到達したい夢は、テキスト生成、すなわちAIによる記事自動作成です。
インターネットが発展し、多くの人がブログを書くようになったことで、この記事自動作成の夢に挑み、散っていきました。

特に日本語は、英語に比べると言語構造が異なるため、自然言語処理が難しいと言われてきました。
しかし、そんな状況の中、AIテクノロジーを引っさげて、記事自動作成サービスの日本語化に取り組んだサービスが、Articoolo(アルティコーロ)です。

## 2019年にArticooloがベータ版で日本語対応

2019年にArticooloが日本語にβ版として対応した際には、SEOやブログ界隈では盛り上がりを見せ、日本語の記事自動作成に挑戦した記事が登場しました。
ただ、残念ながら、この時もまだまだ日本語対応したといっても、一昔前の英語→日本語のひどい記事が生成されました。
おそらく内部的には、以下の4Stepが行われていたと推測されます。

1. ユーザーが日本語のキーワードを入力
1. 入力キーワードを英語に変換
1. 英語キーワードに基づいて記事自動作成
1. 英語の記事を日本語に翻訳

## 1年の時を経て、AIの進化を体感！

けれども、**あの悲劇的な記事自動作成から早1年**。
ネットの世界はドッグイヤー、ラットイヤーで進むと言われています。
人間の1年は犬だと7年、ネズミでは20年に相当するわけで、最先端のAIで言えば、20年近く経過したと捉えることができます。

2020年8月になったら、Articooloの日本語記事作成も凄まじい発展を遂げているに違いない！
そう思って試してみました。

[Articoolo](https://articoolo.com/?lang=ja)

※新規にアカウント登録するとお試しで1記事作成することができます。

今回**「職場」「人間関係」**という２つのキーワードで作成してみました。
多くの人が気になるテーマに対し、AIは応えられるのか？実際に生成された記事がこちらです。

## スムーズな仕事上の関係(AIによる見出しママ)

**インドの労働法は労働権を規定し、雇用条件を規制しています。** 通常、労働法は雇用主と従業員の関係に関係する法律です。さらに、彼らは労働者の利益を促進することを目指しています。労働法は2つの主要なカテゴリに分類できます。最初のカテゴリは、労働組合、従業員、雇用主間の関係を定義する法律で構成されています。 2番目のカテゴリには、職場での従業員の権利を規定する法律が含まれます。労働法は、労働条件、賃金、労働時間の改善、労働権の保護、労働争議の解決に対する労働者の要求に対処するために策定されました。労働者の権利と職場に関するインドの法律は、労働雇用省によって規制されています。インドの労働法は、ストライキとストライキの権利を規定しています。政府は、公の秩序を支持してこれらの権利を制限する権限を与えられています。この法律の規定は、1929年の貿易紛争法に由来するものはほとんどありません。産業の平和を促進するための2種類の機関、すなわち、労働委員会と産業裁判所の設立を規定しました。委員会は労働者と雇用者の代表で構成されます。それは調和のとれた関係を促進し、当事者間のコミュニケーションプロセスを円滑にすることを目的としています。法廷は労働争議に対処する権限を与えられた。国際労働機関は、労働問題に取り組み、労働権を促進する国際機関です。さらに、それは「労働は商品ではない」という原則を支持し、職場の労働者に平等で公正かつ尊厳のある待遇を要求します。**作者のスワプナは、クレイジーで楽しく愛情があり、強烈でムーディーでリベラルな考え方のインド人のお母さんです。**彼女は、本、ワイン、食べ物、映画、世界中のニュースの黙示録、インドの法律について書くのが大好きです。彼女は最近のLLBコースで労働法を専門とするケララ州での訴訟で3年間法律を実践してきました。彼女はまた、レントコントロール裁判所が裁判所に代わって現地調査を実施するよう任命した委員として機能し、前述の裁判所に報告書を提出しました。

ん？

んん？

**んんん！？**

何だこれ？職場の人間関係による関係について記事が期待された結果、でてきたのはインドの労働法に関する記事でしたOTL
スムーズな仕事上の関係で労働法を持ち出したら、**職場の人間関係ぶち壊しだよ**！

あと**いきなり出てくる「作者のスワプナ」って誰！？**
スワプナさんがインコ人のお母さんとか、ガンジーがインド建国の父ってこと以来学んだインド知識だし。
インド人のお母さんなのに、まったく情報が出てこないし、なんの作者なのかまったくわからないままでした・・・

このレベルの記事を読まされたら、まじで時間返せだし、そのブログには二度と訪問しないレベルのトラウマ級の記事でした。

## まとめ・終わりに

結論：まだまだ記事自動作成では人間を脅かさない

インドのお母さんって誰？
生のNode.jsでプロジェクト作成時にやること

当然ではありますが、生のNode.js(特にWebアプリ)でプロジェクト作成時にやることが多く、通信に関する勉強にもなったのでメモを残しておきます。
Node.jsに関してはほぼ初心者なので、不足や誤りがあるかもしれません。発見した場合はコメントなどでご報告いただけますと幸いです。
## プロジェクトの初期化
とりあえず初期化。
いろいろ聞かれるので、それぞれのプロジェクトに合った選択をしていきます。

```zsh
$ npm init
```
- __package name: (フォルダ名)__　プロジェクトの名前を定義します。特に変更がなければそのままReturnまたはEnterでOK。
- __version: (1.0.0)__　バージョンを定義します。これも1.0.0のままでよければそのままReturnまたはEnterでOK。
- __description:__　プロジェクトの概要を定義します。これも空白のままでよければそのままReturnまたはEnterでOK。
- __entry point: (index.js)__　アプリケーションを起動するためのファイルを指定します。index.jsやmain.jsが多そう?これもindex.jsのままでよければそのままReturnまたはEnterでOK。
- __test command:__　テストコマンドの指定をします。これも空白のままでよければそのままReturnまたはEnterでOK。
- __git repository:__　Gitのリポジトリを指定します。これも空白のままでよければそのままReturnまたはEnterでOK。
- __keywords:__　npmに公開した時のキーワードを設定します。今回はWebアプリを作ることを想定しているのでそのままReturnまたはEnterでOK。
- __author:__　製作者の名前を設定します。これもnpmに公開した時に使われるようなので、そのままReturnまたはEnterでOK。
- __license: (ISC)__　npm に公開された時のライセンスを記述します。これもnpmに公開した時に使われるようなので、そのままReturnまたはEnterでOK。

-yを末尾につけることで、すべてデフォルトのまま初期化することができます。
## http-status-codesをインストールする
```bash
$ npm install http-status-codes --save #--saveはNode.js 5.0.0以降は自動で付与されるのでなくてもよい
```
サーバーがリクエストの受信に成功したことを表す200や、Not foundを表す404などを返します。
##リクエストとレスポンスに最低限必要なコードを書く
### ポート番号の設定
```js:index.js
const port = 3000; //今回は3000番ポートを使用。 
```
### httpモジュールのロード
```js:index.js
const http = require('http');
```
### http-status-codesモジュールのロード
```js:index.js
const httpStatus = require('http-status-codes');
```
### サーバーを作成する
```js:index.js
app = http.createServer((req, res) => {
    res.writeHead(httpStatus.OK, {
        'Content-Type': 'text/html'
    });
    res.write('<h1>Hello, World!</h1>');
    res.end();
});
```
httpStatus.OKには200が入っています。
これをres.writeHeadの引数にとることで、リクエストが成功したことを表します。
その後、res.write()でボディを記述し、res.end()でレスポンスを閉じることで、クライアントにレスポンスを送信します。
### ポートの監視
このコードの初めに記述した3000番ポートを監視します。

```js:index.js
app.listen(port);
```
これで__localhost:3000__にアクセスすることができるようになりました。
実際にブラウザからアクセスしてみると、下の写真のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431701/585dbf74-9a85-eb03-d138-e8982a96d966.png)
## まとめ
これで、サーバーを立てることができるようになりました。
実際にExpressなどのフレームワークなどを一切使わずにNode.jsをサーバーサイドとして使用する機会はあまり多くはないと思いますが、通信の仕組みをやんわりと理解することにも役立ちそうな気がします。
PCでもLTEの電波を取得して通信したい。 ~EM06-J取り付けレビュー~

# PCでもLTEの電波を取得して通信を行いたい
この発想から今回の計画が始まっています。スマートフォンであれだけしっかり拾っているLTE回線、PCでも拾ってみたいですよね。  
できるだろうなと推測は立てていましたが、実例を見たことはないです。　　
あわよくばSMSや電話の着信も行うことができれば、PCを見ながらSMS認証を通すことができます。
また、直接接続しているため、一般的に想定されるスマホを中継する分のロスがなくなるため、外でPCを使う際には最も理想的な形で利用できるといえます。（外にデスクトップPCをもっていくのかという突込みは置いておいてください。）
![LTE-A_Module_on_Windows.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/6a4474ab-467d-1f62-a5bd-405f3d1b5b44.png)

# 前提環境
ざっくりとこんな環境です。

- 屋内
- Windows 10 Pro Build: 20H2 (Insider Program)
- 無線LAN: Intel Wi-Fi6 AX200 (802.11ax & BT5.1)
- 他、PC性能(一応関連しそうなのだけ)
  -  CPU: AMD Ryzen 3700X
  -  M/B: ASRock B450 Pro4(こっちに有線LANついてます)
  -  Mem: CORSAIR 16GB*2 

# 必要なもの  
今回の提案を基に使用したもの。総額1万弱（SIMは特殊なため除く）で用意出来ました。

- LTE-A モジュール(当然だけど): "Quectel EM-06J"を使用。技適マークついてます。
- SIM: ピンクのあそこ。対応エリアです。
- モジュール変換用ボード: ファームファクタがM.2のためUSBに変換するボード。
- 送受信用アンテナ: 接続端子はSMA -> MHF4です。

# 実際の手順
予想できるかと思いますが、ざっくりと以下の流れです。アンテナ付けるのが意外と嵌りづらく、大変です。

1. LTE-Aモジュールに送受信アンテナを装着し、SIMを挿入
2. 本体に接続
3. 携帯回線のみの環境にする
4. つながった
![こんな感じ。](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/3018ce96-1d49-7bc0-6e7b-38dd6006b666.png)
![セルラー回線表示です](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/7fa024ad-e005-0b5b-76a8-8a2fb599534e.png)


# 測定
実際どれぐらいでるの？> [CloudFlareのスピードテストで計りました](https://twitter.com/Gameofthebest/status/1295342380959203330) 具体的なデータは[gist](https://gist.github.com/kazu0617/ba2547a0c582fac83d9c010514a9cde1)に。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/7f4647a7-0674-08b2-29e3-3a4fd522b350.png)  
おおよそ80mbps出ていますので測定当時の状況（屋内）と楽天の性能（なんか配ってる）からすると必要十分なのではないかと。
試しにこの状態でVRChatに入り、会話できるか試したところ、読み込みはPLCと同等か、それより少し早いぐらい。
喋るときやIKが変化するときに関しては特段不快になることはない感じでした。
少なくとも日本で流通しているPLCよりかは早いです。

ここら辺は測定不足気味なので何か欲しければコメント欄へ。
# Tips
- 検証したモジュールについての詳細 https://www.quectel.com/product/EM06.htm
- WindowsのUSBドライバをダウンロードしようとしたところ、ログインしてよとのこと  
-> アカウントを作成したところ表示が変わり、問い合わせるか地域の代理店に相談とのこと。問い合わせもメールなので、さすがに法人格でもないと相手にされなさそうなのでここはあきらめ。  
現在はWindowsに標準で搭載されているドライバだが、設定の内容の多さ的に不完全っぽい
- モジュール変えたら5G対応できるのは利点かもしれないです
- 動作周りはSurfaceにLTE対応端末があるからか、そこそこちゃんとしてました。驚きなのがWiFiの状況に応じて入れます？どうします？っていう設定があったこと。確かに外の環境ではWiFiが不安定なところがある可能性も低くないため、そういった場合では利用されそうですね。APNの設定項目やSIM PIN設定もありました。  
ただ、具体的な電波強度、つかんでいるBandなどは探しても出てこず、ここら辺は要調査です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/273ee6cf-db90-95ba-dc57-6d91dcb71de1.png)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147334/2c4a3da1-d558-7ea7-b16f-eb7f7f1ab841.png)

# 最後に
もし外でもデスクトップPCを利用したいけどテザリングをしたくないという方はいかがでしょうか。
gitコマンド表

#はじめに
gitとはプログラムソースなどの変更履歴を管理する分散型のバージョン管理システムのことです。

#記事を書こうと思った経緯
開発中にgithubを使用しており、コマンドが多く覚えるために記録用として。

#gitコマンド集

###初期設定
```
git config --global user.name "XXXX"
git config --global user.email "XXXX@hogehoge.com"
```

###リポジトリを新規に作成
```
git init
```
initコマンドを実行すると、現在のディレクトリまたは指定したディレクトリに「. git」というリポジトリを構成するディレクトリが作成されます。

###変更のあったファイルをステージングします
```
git add (ファイル名)  /*特定ファイル*/
git add .          /*全て*/ 
git add -A         /*全て*/
```
###ステージングされた変更をコミット(確定)します
```
git commit -m "コミットメッセージ"
```

###前回のコミットと統合する
```
git commit --amend -m "コミットメッセージ"
```

###commitした内容をローカルからリモートにpush
```
git push origin ブランチ名
git push origin　HEAD　現在のブランチでpush
```

###強制push
```
git push -f origin ブランチ名
```
過去のコミットを変更した際等に使用。チーム開発等を行なっている際は、チーム開発者の編集がなかったことになる恐れもあるため細心の注意が必要。

###リモートからローカルに反映
```
git pull origin ブランチ名
```
github等でマージした際にローカルでは反映されていないため、このコマンドが必要。

###ログ確認
```
git log
```
###現在の変更ファイル確認
```
git status
```
ファイル編集をした際に確認。削除したファイルや追加したファイルが表示される。

###現在の変更コード確認
```
git diff
```
コードを編集した際に確認。削除コード追加コードが表示される。

###git add取り消し
```
git reset HEAD
git reset HEAD　(ファイル名)  /*特定ファイル*/
```

###直前に戻る
```
git reset --hard HEAD
```

###指定したlogに戻る
```
git reset --hard コミットid
```
コミットIDはgit logにて確認できる。

###一旦コミットを退避させる
```
git stash
```
現在のブランチでコード編集している途中で、別ブランチにてコードを編集を行いたい時に使用。

###退避した作業をみる
```
git stash list
```
###退避した作業を戻す
```
git stash apply <stash名>
```

###退避した作業を消す
```
git stash drop <stash名>
```

###退避した作業を全て消す
```
git stash clear
```

###リポジトリ内の最適化
```
git gc
```
リポジトリが使用するストレージを最適化。頻繁に使う必要はないが、大量マージした際に行うとよし。

###ブランチの切り替え
```
git checkout <ブランチ名>
```

###新規ブランチ作成
```
git checkout -b <ブランチ名>
```
ABC176 A-Cやってみた

出よう出ようと思いつつも用事が入ったので……。
![418a6d2aa47db27afa160152ee1d8dbf.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/692802/7dd133af-07a9-a03d-5796-5dad3bf1e40f.png)
10分足らずでCまでは行けました。その先は謎です。

# [A - Takoyaki](https://atcoder.jp/contests/abc176/tasks/abc176_a)
割って切り上げてかける

```python
from math import ceil
n,x,t=map(int,input().split())
print(ceil(n/x)*t)
```
#[B - Multiple of 9](https://atcoder.jp/contests/abc176/tasks/abc176_b)
各桁足して9で割る

```python
n=[int(i)for i in input()]
print("Yes" if sum(n)%9==0 else "No")
```

#[C - Step](https://atcoder.jp/contests/abc176/tasks/abc176_c)
$A_{n-1}$が$A_n$より大きかったら$A_{n-1}-A_n$を$A_n$と答え用の変数に加えて行く。

```python
n=int(input())
a=[int(i)for i in input().split()]
res=0
for i in range(1,n):
    if a[i-1]>a[i]:
        tmp=a[i-1]-a[i]
        a[i]+=tmp
        res+=tmp
print(res)
```

#[D - Wizard in Maze](https://atcoder.jp/contests/abc176/tasks/abc176_d)
全くとっかかりすらつかめなかったのでアーッアアアーッてなった。

#おわりに
Dから先が未知の概念と化しているのはなんとかしないとなあと思いました。
ここのギャップはかなり大きく感じるような。