OmniAICreator/Qiita-1.07M huggingface dataset:
MQTTのQoS (Quality of Service) とは

IoTに特化して設計されたプロトコルであるMQTTは、PCだけでなく、狭帯域ネットワークや低消費電力のデバイスでも利用できます。MQTTでは、メッセージ配信の信頼性をさまざまなネットワーク環境下で保証する`QoS`が定められています。

## MQTTのQoS

MQTTは3つのQoSレベルを設計しています。

- _At most once_ (0)
- _At least once_ (1)
- _Exactly once_ (2)

QoS 0は"fire and forget"のメッセージ送信モードです。送信者（PublisherかBroker）はメッセージを送信した後、それが相手に送信されたかどうかは確認せず、再送する仕組みも用意しません。

QoS 1には単純な再送メカニズムが含まれています。送信者はメッセージを送信した後、受信者のACKを待ちます。ACKを受信しなかった場合は、メッセージを再送します。このモードでは、メッセージが少なくとも1回は届くことを保証できますが、メッセージが重複して届く場合があります。

QoS 2では、メッセージが一度だけ到着することを保証するために、再送する仕組みと重複を検知する仕組みが用意されています。

## 動作原理

### QoS 0 - Publish once at most

QoS 0の場合、メッセージのPublishはネットワークの能力に左右されます。Publisherはメッセージを一度だけ発行します。受信者はメッセージを受け取っても返信せず、Publisherはメッセージの保存や再送を行いません。QoS 0では、メッセージの伝送効率が最も高くなりますが、メッセージが配信されない場合もあります。

![8c6e4c6b37e76e23b84d3341a2ff9b33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763141/fe723974-1ba4-220c-219c-795a6dac9846.png)

### Qos 1 - Publish once at least

QoSが1の場合、メッセージは少なくとも1回はPublishされることが保証されます。MQTTでは、ACKを受け取るシンプルな仕組みによってQoS 1を保証しています。Publisherはメッセージを発行して、受信者のPUBACKパケットが返ってくるを待ちます。指定された時間内にPUBACKを受信しなかった場合、Publisherはメッセージの`DUP`フラグを0から1に変更し、メッセージを再送します。受信者は、QoS 1のメッセージを受信したときには、PUBACKに応答する必要があります。受信者は同じメッセージを複数回受けとる場合があります。`DUP`フラグが0でも1でも、受信者は受信したメッセージを新しいメッセージとして扱い、応答としてPUBACKパケットを送信します。

![6777e0797f80ddaa1d623b173890f63c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763141/8ff2cfb0-f95f-38cf-de62-e51de1c9230c.png)

### QoS 2 - Publish only once

QoS 2の場合、PublisherとSubscriberは、2つのセッションを通じてメッセージが1回だけPublishされるようにします。これはMQTTにおいて最も高いQoSで、メッセージが失われたり重複したりすることを許容しません。QoS 2を使用する場合、通信は他のQoSと比べて遅くなります。

QoS 2のメッセージをPublishした後、送信者はPublishしたメッセージを保存し、受信者からPUBRECが返ってくるのを待ちます。送信者はPUBRECを受信することで、受信者がメッセージを正常に受信したことを知り、そのメッセージを破棄します。送信者はPUBRECを保存してPUBREL（PUBLISHのリリース）を受信者に返し、受信者がPUBCOMPメッセージで応答するのを待ちます。送信者はPUBCOMPメッセージを受信すると、保存していた状態を全て破棄します。

受信者は、QoS 2のメッセージを受信すると、そのメッセージを処理し、応答としてPUBRECを返します。また、PUBRELメッセージを受け取った受信者は、保存されていたすべての状態を破棄し、PUBCOMPで応答します。

送信中にパケットロスが発生した場合は、送信者は前のメッセージを再送します。これは、送信者がPublisherであるかBrokerであるかに関わらず同様です。また、受信者も各コマンドに応答する必要があります。

![9d1234bb84dc9a3e3c178c55732f8444.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/763141/742f1a5c-42b1-3d9a-9cb5-29b8c7034a33.png)

## PublishとSubscribeにおけるQoS

MQTTにおけるQoSは、エンドツーエンドではなく、クライアントとサーバーの間に適応されます。そして、あるメッセージにおいて、Subscriber-Broker間のQoSが、Publisher-Broker間のQoSよりも高い場合、Subscriber-Broker間のQoSはPublisher-Broker間のQoSまで下がります。つまり、以下の表のようになります。

| publishのQoS | SubscribeのQoS | メッセージのQoS
| ---- | ---- | ---- |
|0 | 0 | 0
|0 | 1 | 0
|0 | 2 | 0
|1 | 0 | 0
|1 | 1 | 1
|1 | 2 | 1
|2 | 0 | 0
|2 | 1 | 1
|2 | 2 | 2

## QoSの選び方

QoSが高いほど、処理が複雑になり、リソースの消費は多くなります。ネットワークやビジネス要件に応じて、それぞれのアプリケーションに適切なQoSを選択しましょう。

### QoS 0を選ぶユースケース

- たまにメッセージが失われることがあることを受け入れられる場合
- 同じサブネット内の内部サービスとしてMQTTを使う場合
- クライアントとサーバーのネットワーク間が非常に安定している場合

### QoS 1を選ぶユースケース

- パフォーマンスの最適化を望む場合 (QoS 2では重い場合)
- メッセージを失いたくはないが、メッセージの重複については処理が可能な場合

### QoS 2を選ぶユースケース

- メッセージの損失も避けなければならないが、重複したメッセージは受け取りたくない場合
- 銀行、消防、航空など、高いデータの完全性と適時性が要求される業種の場合
Gofakeitでダミーデータを生成する

# はじめに
Rubyには[Faker](https://github.com/faker-ruby/faker)というダミーデータを生成するツールがありますが、同じようなことをGoで実現したい場合に便利そうなツールがあったので利用例を備忘録として書いておこうと思います。

# Gofakeit
GofakeitはGoで書かれたランダムデータジェネレータです。[awesome-go](https://github.com/avelino/awesome-go) にもリストされているツールです。

https://github.com/brianvoe/gofakeit

# 使い方
下記のコードのように簡単に利用できます。
詳細な使い方に関しては [README](https://github.com/brianvoe/gofakeit) が充実しているのでそちらが参考になるかと思います。

```go
import (
	"fmt"
	
	"github.com/brianvoe/gofakeit/v6"
)

type Topic struct {
	Name  string
	Tag   []string
}

type User struct {
	Name string `fake:"{firstname}"`
	Age  int    `fake:"{number:0,150}"` 
	
}

func main() {
	// 関数で生成
	fmt.Println(gofakeit.Name())  // Dell Champlin
	fmt.Println(gofakeit.Color()) // BurlyWood

	// Structのフィールドにセット
	var t Topic
	gofakeit.Struct(&t)
	fmt.Println(t.Name) // TfEgs	
	fmt.Println(t.Tag)  // [PdebUjW jcQvLbX UBdJrxA jxEbLyUjF]
	
	// Structにfakeアノテーションを追加
	var u User
	gofakeit.Struct(&u)
	fmt.Println(u.Name) // Cecil	
	fmt.Println(u.Age)  // 109
}
```
[Playground](https://play.golang.org/p/mQwml3i8K4B)

# まとめ
Gofakeitでダミーデータの生成を行いました。   
私はGoMockのReturnするデータとしてテストコードで利用しましたが、他にも実装途中のAPIの返却値として一時的に埋め込んでおくなど幅広く利用できそうなので、関わっているプロジェクトのgo.modにそっと追加しておくと便利そうです。
LaravelをherokuにDeployする時のエラー

LaravelのプロジェクトをHerokuにデプロイするのに、
laradock % git push heroku master
を実行したら下記のエラーが。
Enumerating objects: 12648, done.
Counting objects: 100% (12648/12648), done.
Delta compression using up to 8 threads
Compressing objects: 100% (5024/5024), done.
Writing objects: 100% (12648/12648), 22.10 MiB | 1.06 MiB/s, done.
Total 12648 (delta 7002), reused 12476 (delta 6873), pack-reused 0
remote: Compressing source files... done.
remote: Building source:
remote: 
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote:  !     No default language could be detected for this app.
remote: 			HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
remote: 			See https://devcenter.heroku.com/articles/buildpacks
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !	Push rejected to lara-heroku-test3.
remote: 
To https://git.heroku.com/lara-heroku-test3.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/lara-heroku-test3.git'

で、エラーメッセージを検索すると
https://qiita.com/taku_hito/items/52c6c52385386544aa62
に同じエラーで悩んだ人が。

今回はphpなので、

laradock % heroku buildpacks:set heroku/php 
Buildpack set. Next release on lara-heroku-test3 will use heroku/php.
Run git push heroku main to create a new release using this buildpack.
laradock % heroku buildpacks:add heroku/nodejs
Buildpack added. Next release on lara-heroku-test3 will use:
  1. heroku/php
  2. heroku/nodejs
Run git push heroku main to create a new release using these buildpacks.
でbuildpackをセットして、

再度、実行
laradock % git push heroku master
同じエラーでだめ。

laradock % heroku buildpacks:clear
で、デフォルトのビルドパックを元に戻す。

サードパーティのビルドパックを使う設定を試す。
laradock % heroku buildpacks:set https://github.com/some/buildpack.git -a lara-heroku-test3
Buildpack set. Next release on lara-heroku-test3 will use https://github.com/some/buildpack.git.
Run git push heroku main to create a new release using this buildpack.
hnakase@HironoMacBook-Pro laradock % git push heroku master  
同じエラーで駄目。

https://mrkmyki.com/heroku%E3%81%AE%E3%83%87%E3%83%97%E3%83%AD%E3%82%A4%E3%81%A7no-default-language-could-be-detected-for-this-app-%E3%81%A8%E5%87%BA%E3%82%8B%E5%A0%B4%E5%90%88%E3%81%AE%E5%AF%BE%E5%87%A6%E3%80%82
に答えが書いてあった。
laravelのrootに
composer.json
というファイルが存在していないと駄目らしい。
laradock % cp workspace/composer.json .
で、rootにファイルをコピーして実行。

すると、
remote: Verifying deploy... done.
To https://git.heroku.com/lara-heroku-test3.git
 * [new branch]      master -> master
laradock % 
で、デプロイが成功！！
Anaconda備忘録

1.Anacondaダウンロード
　https://www.anaconda.com/からインストール
![hp画像.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1699007/f2d025b7-346b-3655-96d1-a3b1dd455e2d.png)
![hp画像2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1699007/c252e791-b640-7479-2206-b64e9261c2a7.png)
２.インストール
https://www.javadrive.jp/python/install/index5.html

3.アンインストール
https://senriblog.com/windows10-anaconda-uninstall/
賞味期限をよく切らすからどうすりゃええんや…

#冷蔵庫の管理ってむずくない？
一人暮らしをしてると、スーパーに買い物行くとついいろいろ買っちゃいます。
・キャベツ
・にんじん
・豚バラ肉　…あ、今夜は焼肉にしよう。焼肉のたれも買って…
###数日後
「あ、今夜は焼肉にしよう」
あれ、この前の肉って残ってたっけ？
あれ、にんじんっていつ買ったっけ？
あれ、焼肉のたれって買ったっけ？

一人暮らしを始めて１年、こんなことを何度してきたことか。。。
プログラム初心者だけどなんとかフロントとサーバ周りを使ってなんか作ってみたい。。。

##家の食べ物・日用品・様々なクーポンとかの期限把握したい
そこで考えたこと↓
　・期限を入力するならメモ帳でもいいか…　←すべてキーボード、スマホで入力するの？面倒
　・スマホにローカルで保存するか…　　←キッチンで常にスマホいじいじする必要ある。面倒。
　・記録する＝使い勝手、登録の勝手が楽なことが超絶重要
　・RFIDで全在庫を一元管理したら面白いし、ラクかも　←出し入れしたときにデータの更新が面倒かも？
　・バーコードリーダーでひとまず登録が簡単だったらいいかも？

と、いろいろ考えた。

##大まかな流れ
##### STEP.1 DjangoでwebページとDBをつくってみる
##### STEP.2 保管先をタブで切替ながら見る
##### STEP.3 バーコードリーダーで入力がしたい　←イマココ
##### STEP.4 STEP.3の情報をCRUDできるようにしたい
##### STEP.5 装飾？わかりやすく？


##STEP.1 DjangoでWebページとDBを作ってみる
ページを作ったことないプログラミング情弱初心者が作ったTOP
やりたいこととしては、
 1. 品物の登録（キーボードから、バーコードリーダーから）
 2. 保存先の登録（冷蔵庫、戸棚、シンク下など）
 3. 登録された保存先はタブとして現れ、各保存先には登録されている品物が表とかで見られる
 4. 品物は入れた日や更新した日、その個数が分かるように
 5. 品物は更新したり、削除したい

ここで１～４を作ってみたイメージ↓
![TOP.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458821/fba5235a-7fba-9145-5c24-bf8bdbb4841f.png)

使えそうなとこまでの道のりが長い。。。
未経験でリモートワークのIT企業入社して1.5か月経ったので簡単な振り返り

ずっと書こうと思っていたのに、すっかり時間が経ってしまいました。
時短するため箇条書きで書いていきます。

# 簡単な自己紹介
前職は一般事務員として勤めており、
IT完全未経験ですが、5月半ばから自社開発企業に入社いたしました。
趣味はラーメン巡りです。

# 思ったこと・感じたこと
- 一番心配していたことは「人間関係」だったが、杞憂に終わった。
    - 皆さんめちゃくちゃいい方ばかり・・・！
- フルリモートワークでも全く問題なかった。モブプロで開発しており通話しっぱなしなので、むしろ話しやすい。
    - おそらくモブプロでなかったら死んでた。
- 開発以外の仕事も多い。
    - お客様へ技術的なサポートが必要な時もある。
    - サポートサイトの記事修正　etc...
    - 上記の理由で日本語力が試される。
- 最初の１週間は本当に疲れた。土日はほとんど寝ていた。
- 何を話しているか理解できないことが多い。用語もわからない。
- 思った以上に時間を取って、丁寧に説明してもらえた。
- チーム内ですぐに判断、実行できることに驚いた。

# チャレンジしたこと
- 毎日欠かさず学習できた。
    - プログラミングを初めてから毎日学習継続中！
- 毎日の振り返りで必ず意見を出すことができた。
- 自分ができることを探した。
    - ナレッジの修正、サポートサイトの修正、簡単な課題の消化
    - もっとできること増やしたい！
- とにかくメモを取った。
    - 分からない単語、夕会の共有内容、製品の機能メモ etc...
- なるべく意見を出すように心がけた。
    - 分からないなりにこうしたらどうですか？っと言ってみたりしました。（緊張した）

# 悪かったこと・反省
- 9か月続いていた学習記録を付けなくなった。
    - 自主学習なのか仕事なのかよくわからなくなり、面倒になって辞めました。
- わからないことばかりで落ち込む。
- 生活習慣が乱れ、体重増加＆肌荒れ。
- オブジェクト指向がよくわからなくなった。
- 英語が読めない。読めなさすぎて笑われている・・・
- コードが追えない。焦る・・・

# 今後2~3か月間の目標
- お客様へのサポートの対応をスムーズにこなすこと。
- 開発で「何をやっているかわからん」状態を抜け出すこと。
- オブジェクト指向を理解すること。
適応障害になった私が時を巻き戻して実践したいこと

# 背景
私はエンジニアとして新卒入社してから1年で適応障害になり、1年休職しても治らず、
そのまま退職、5か月後に転職した経験があります。

今回は私のような人がなるべく少なくなるよう、適応障害にならない立ち回りや
なってしまったらどうすればよいのかを記事にいたしました。

# 適応障害
まずは軽く適応障害について説明します。

## 適応障害とは
ストレスになる原因(仕事や学校等)があり、気分、行動、体調に症状として現れる病気です。

## 症状
人により症状が異なりますが、私は動悸がひどかったです。
以下のような症状が出やすいと言われています。

- 抑うつ気分になる
- 不安になる
- 頭痛
- 動悸
- 不眠

## 治療方法
ストレスの原因から遠ざけるための自宅療養や薬やカウンセリングによる治療です。
私は自宅療養と薬による治療をしており、現在はほとんど症状がない状態です。

# 適応障害にならないためには
私が人生やり直せるなら適応障害にならないためにやりたいことを記述します。

## 休憩をきちんととる
私は若いうちにたくさん経験を積もうと休憩を取らず、月100時間以上残業していました。
入社したばかりの頃はわかりませんでしたが、休憩はとても大切です。
まず、休憩を取らないと作業効率が落ちるので休憩したほうが効率よく働けます。
また、精神的にも肉体的にも休まらず、ストレスがたまり、病気になってしまいます。

仕事が終わらず、残業したくなる気持ちもわかりますが、体が第一なので休憩は取りましょう。
どうしても仕事が終わらない場合は上司に相談して仕事の量を調整してもらうことをおすすめします。

## 人間関係を良くする
私は入社したての頃に人間関係は仕事と関係ないから気にしないというスタンスを貫いてました。
振り返って考えてみると仕事は人と人とのやり取りで行われているので、人間関係というのはとても重要です。

人間関係を良くしておくと色々なメリットがあります。
例えば以下のようなメリットがあります。

- 仕事で分からないことがあった際に相談にのってくれる
- 失敗してしまったときの対応が優しくなる
- 仕事の手伝いをお願いするときにOKがもらいやすくなる

他にもあると思いますが、人は良い対応をすると良い対応で返してくれることが多いです。
自分のためだと思って、飲み会に付き合ったり、仕事で手伝うことがあるか聞いてみるのもよいと思います。

## 仕事のミスを気にしすぎない
新入社員は必ずと言っていいほど仕事でミスをします。
私は仕事のミスを気にして落ち込んでいることが非常に多かったです。
ミスするたびに大きなストレスを感じてしまうと精神的につらいです。

ミスするのは先輩方は想定してます。
そして、最初から完璧に仕事ができる人間はいません。

ミスして落ち込むより、なぜミスしたのか原因を考え、改善策を練って、上司に伝え、次ミスしないように頑張ろうとモチベーションにつなげれると良いと思います。

ミスをカバーしてくれた上司や同僚の方には謝罪とお礼、飲み物や食べ物を買っていくと人間関係もよくなるのでおすすめです。

## パワハラを受けていたら
暴言、体罰等、パワハラを受けていた場合は客観的にパワハラが証明できる証拠を残してください。
暴言を言われて、上司に相談しても「そんなこと言ってない」と言われてしまいます。
自分の聞き間違えの可能性もあるので、録音、録画などで証拠を残しましょう。

証拠を残したら、証拠を持って、上司や人事部に相談してください。
部署等を変えてもらえるかもしれません。

# 適応障害になってしまったときの対処法
もし、適応障害になってしまった、または適応障害の疑いがあるときの対処法を記述します。

## 適応障害かもしれないとき
ちょっとした症状でも適応障害だと思ったら、精神科や心療内科を受診してください。
私は何もしてないのに涙が出るという症状でやっと気づきました。

- 気分が憂鬱で仕事に行きたくない
- 仕事に集中できない
- 最近頭痛がひどい

適応障害を治さず、働き続けるともっとひどくなり、取り返しがつかなくなってしまいます。
まずは適応障害と診断してもらい、上司に相談して今後の方針を決めましょう。

私は休職して病気を治してから働きたいと上司に相談しました。

## 傷病手当金支給の手続きをしましょう
休職する場合は傷病手当金の手続きをしましょう。
傷病手当金は以下の条件を満たしている人が手続きした際に支給されます。

- 療養を要する病気やケガが業務外の事由によること
- 病気やケガの療養で仕事に就けないこと
- 連続する３日間を含み４日以上仕事に就けなかったこと
- 病気やケガで仕事を休んでいる間に給与の支払いがないこと

条件を満たしていたら、加入している健康保険の会社のWebページから傷病手当金の申請書がダウンロードできると思うので、印刷して記入してください。

自分が記入する欄の他に主治医が記入する欄と会社の方が記入する欄があります。
主治医に記入してもらってから、会社の方に記入してもらい、すべて記入後に健康保険の会社に郵送で送ります。

会社の誰宛に申請書を送ればよいかは会社の方に確認してください。

## 休職中の過ごし方
仕事に関連することから離れましょう。
ストレスの原因から離れて、しばらくは好きなことをして過ごしましょう。
私は散歩して、ゲームして寝る生活をしていました。

ある程度、症状がおさまってきたら、主治医に相談して今後の方針を決めましょう。
会社にも その時の状態 + 今後どうするのか(復職？休職継続？) を報告すると親切です。

仕事ができなくて、周りと差がついてしまうかもしれないと不安になると思います。
しかし、病気を治さなければ働けません。
私は休職中、仕事の勉強をしている間は症状が一向に治りませんでした。
まずは病気を治すことを優先しましょう。

## 休職期間で治らなかったら
退職になってしまいますが、ポジティブに考えましょう。
退職しても傷病手当金給付開始から1年6か月は傷病手当金がもらえます。
ゆっくり休憩して、病気を治してから転職活動を行いましょう。

転職は不安だと思いますが、元適応障害でも雇ってくれる会社はあります。
私は1年しか経験がなく、適応障害でしたが雇ってくれる会社が見つかりました。
経験が長い方は私より多くの企業を選べると思います。
ですので、安心してください。

# 最後に
この記事は私の経験を元に書いておりますので、この記事に書いていることを実践すれば
必ず適応障害にならないということではありません。

しかし、私のように病気で苦しむ方を減らしたいと思い、この記事を書かせていただきました。
ご参考になれば幸いです。

最後まで読んでいただきありがとうございました。
STM32F767と温度センサーMCP9701で温度をシリアル出力 (Mbed)


x MCP9701-E/TO 販売コード 103199

x あまり正確では、ない

目的
秋月で売っている安価なMCP9701(約25円)を使って温度を出力する。

構成
MCP9701-E/TO I-03199

説明
MCP9701は、
0℃の時、400mV
1℃あたり19.5mV
精度は、±4℃
電線が引き出しやすい位置のA0をアナログ入力にする
計算には、容量削減の為に浮動小数点と割り算は、使わない
MCP9700は、ファミリー、オフセット500mV、10mV/1℃ 今回は、使わない



```c++

//温度

#include "mbed.h"

//10の割り算 0から1028までは、正しい。主に0から999
#define DVI10(n) ((n*205)>>11)

//アナログ入力の設定
//AnalogIn adc_vbat(A3); //PA_4
AnalogIn adc_vbat(A0); //767 303

//Serial pc(USBTX, USBRX); // tx, rx
Serial pc(SERIAL_TX, SERIAL_RX); //767 303
//Serial pc(PA_2, PA_3); //010
//Serial pc(PA_9, PA_10); //010

int main() {

    int s;  //ADCの値
    int n0; //温度　小数点以上

    //無限ループ
    while(1) {

        //adcの読み込み 0から4096
        s = (adc_vbat.read_u16()>>4);

        //電圧を温度に変換 ex 20.0 -> 200 温度の十倍を出力
        s=((s-496)*27081)>>16;

        //s = 0;   //0  debug
        //s = 200; //20 debug

        //小数点以上と小数点以下を分ける
        n0=DVI10(s);    // 小数点以上
        s =(s-(n0*10)); // 小数点以下

        //温度の表示
        pc.printf("%d.%d\r\n",n0,s); //767 303

        //1秒の待ち
        wait_ms(1000);

    } //while

} //main



```

![adc_9701_767M_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/28ae737e-fc97-e193-c049-77d8f2baa078.jpeg)
Transformerを理解するための下準備

## はじめに
すでに多くの人がTransformerの解説記事を書いているが、執筆者のバックグラウンドによって説明の重点の置き方は様々である。よって、解説記事はいくらあっても困ることはないはずである。このたび、業務上の必要に迫られてTransformerを本格的に勉強したので、自分の言葉でまとめてみる。
・・と思ったのが、息切れして本記事はTransformerを理解するための下準備で終わった。それでもよければお読みください。


## 私のバックグラウンド
- TransformerやAttentionという断片的な情報は聞いたことがあり理解した気になっていたが、細かい点は知らなかった。


## 全体像

新しいモデルを理解するには、入出力、すなわち何を入れて何が出てくるモデルなのかを把握することが理解の第一歩である。

- TransformerはSeq2Seqモデルである。つまり、系列を入れたら何か別の系列を出すモデルである。

### 具体例
系列は数値の系列だったら何でも良い。例えば・・

- 数値が表すものが文字であれば、Transformerは文字列を別の文字列に変換することになり、それはすなわち翻訳である。
- 入力系列は文字列で、出力系列が音声信号であってもよい。そのようなモデルは読み上げモデルと言えよう。


このように系列→系列というタスクは様々な応用に使うことができるので、Transformerをマスターしておけば、データサイエンティストとしての活躍の場も増えることだろう。


## Transformer以前

系列→系列というタスクはその重要性から、Transformer以前から研究がされてきた。典型的な構造がRNNを用いたEncoder-Decoderモデルである。



### RNNによるSeq2Seq
I have a penという英文を日本語に翻訳するタスクを描いてみた。図の上側がEncoder、下側がDecoderである。
RNNをたくさん並べて描いているが、たくさんの別々のRNNを使うという意味ではなく、一つのRNNに繰り返し入力するよという意味である。ただ、Encoder内のRNN(水色)とDecoder内のRNN(緑色)は別物である。


![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801279/419e91d8-51e6-01d0-8085-a44c1f298dc7.png)



#### Encoderの役割
RNNというものは、何か入力を入れると出力を出すとともに内部状態が変わるコンポーネントであることはご存知だろう。しかし今回出力は特に使わない。移り変わる内部状態に着目する。
I, have, a, penという4単語を順番に入力したあとの内部状態は、"I have a pen"という文章に関する情報を表しているとみなすことができる。

ちなみに、わかりやすくIとかhaveとか描いてあるが、実際は何らかのルールのもと数値表現に直しておかないといけない。愚直には、存在する単語に一意の数字を割り振る。I=1, have=２, ...のように。もしくは、I=[0, 1, 0, 0], have=[0, 0, 1, 0], ...のようなone-hot形式のベクトル表現でもいい。さらには、word2vecのような高度な変換でもよいし、Embeddingレイヤーを使って表現の変換自体もネットワークの一部として学習してもいい。


#### Decoderの役割
図中のオレンジ色がEncoder RNNの最終内部状態を表しており、これをDecoderに渡すことで、Decoderはそれに相当する日本語を出力するタスクを担う。
Decoder内も中身はRNNである。ただ、Encoder側のRNNと違って出力と内部状態の両方を活用する。

DecoderのRNNには最初、前記Encoder RNNの最終状態がセットされる。その状態で、まずSOS (start-of-sentence)という特殊な単語をRNNに入力する。そうするとRNNは、まず第一声を発そうと「私」という単語を出力する。続いて今度はその「私」をRNNへの入力として与えると、「私」の次の単語を出そうとなって「は」を発す。このようにして「持っている」まで発すると、次はもう発するものがないのでEOS (end-of-sentence)を出して終わる。



### RNNによるSeq2Seq + Attention
さて、上記のモデルの弱点は、Encoder RNNの最終状態という小さな器に文章に関するすべての情報を詰め込もうとしている点である。I have a penのような短い文章であれば、十分表せるかもしれないが、もっと長い文では、文章の意味を表すだけの十分な表現力がないだろう。そこで、"I"を読んだあとの内部状態、"have"を読んだあとの内部状態, ..というように内部状態の履歴を全部Decoderに渡すことになった。下図でオレンジ色のベクトルが4つに増えているのはこれを表す。

こうしてDecoderに十分な情報が渡せるようになったが、Decoder側でどう使うかという問題が発生した。それをエレガントに解決したのがAttentionである。近年ディープラーニング界隈でよく聞くAttentionは、別にTransformerでなくても実現できる仕組みであることを強調しておきたい。

![Untitled.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/801279/7bfbe451-9dbc-bbcd-2e2d-4a3fb23cf61f.png)

Attentionを一言でいえば、次の文字を出すときに注目するのは前記4ベクトルのなかのどれか？である。例えば「私」という文字の次に何を出そうか考えるときと、「は」の次に何を出そうか考えるときでは、前記4ベクトルへの注目具合が異なるはずである。注目という計算イメージ湧かなければ、4ベクトルそれぞれへの重みと思えば良い。計算の流れとしては、「私」から、4ベクトルへの注目(=重み)を計算する。その重みを実際に4ベクトルへ掛け合わせる。それをRNNへの入力とする。注目の仕組みが入った以外は前述の基本的なSeq2Seqと同じである。


## Transformer

このように進化したSeq2Seqモデルであるが、RNNの学習が非効率であることが課題感としてあった。そこでRNNフリーな構造を実現するものとして登場したのがTransformerである。

## まとめ

長くなったので続きはまた今度とする。
[初学者用] cloud９でのRailsインストール方法

Amazon AWS cloud9にRuby on Railsの
インストールの仕方をさらっとメモ感覚で記事にします。


今回は簡単な家計簿アプリを個人開発していくので
Rails5.2系をインストールします。

6以降はwebpackの仕様が必要。
つまり高度なJavaScriptを使用する前提だからです。

5系の中でも5.2系は便利な機能がついているとのことなので
5.2系で行きます。

まず下のコマンドをターミナルに入力していきます。
```
＄　gem install rails -v 5.2.3 
```
（空欄に注意）



少し時間がかかります。
インストールできたか確認していきましょう。
```
＄ rails -v
```
このコマンドで5.2.3と表示されればOK。
改：ggplot2を使用して棒グラフ＋エラーバー＋ドットプロットを描く

library 指定を含め，3行で描けます

```R 
# library(tidyverse)　なんか，不要です。
# シードを固定
set.seed(1234)

# factor型で並び順を指定
genotype <- factor(c(rep("WT", 10), rep("KO", 10)),
                   level = c("WT", "KO"))

# 正規分布乱数生成。KO群の平均値を高めに設定
value <- c(rnorm(10, mean = 10, sd = 2),
           rnorm(10, mean = 15, sd = 2))
```

ボックスプロット（箱髭図）

```R 
# データフレームにする必要ありません。
# beeswarm の引数は，お好きなように。
library(beeswarm)
boxplot(value ~ genotype, ylim=c(0, max(value)))
beeswarm(value ~ genotype, method="center", add=TRUE,
  col=c("red", "blue"), pch=19, cex=2)
```
![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/ee937efd-e94b-cdb0-9393-fd0a0e80b0b2.png)

バイオリンプロット

```R 
library(vioplot)
vioplot(value ~ genotype, col="gray90", ylim=c(0, max(value)))
beeswarm(value ~ genotype, method="center", add=TRUE,
  col=c("red", "blue"), pch=19, cex=2)
```
![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/cfb9802d-534d-f020-3811-6581149b5a9c.png)
Laravel+vagrant+centos7+apache 仮想環境構築

# laravel プロジェクト作成
readubleに従い、プロジェクト作成をする
すると、以下のエラーが発生した。

```[InvalidArgumentException]                                     
  Could not find package laravel/laravel with stability stable.
```
composerをインストールし直すと直るという記事が多かったためこちらの記事参考し、削除。

https://akamist.com/blog/archives/287

composerを再インストール後、気を取り直して再度プロジェクト作成

# vagrant+cento7 を導入
プロジェクトディレクトリで以下コマンド。
今回はcentos7。

```
vagrant init centos/7
```
```
vagrant up
```
次はこんなエラー

```
Vagrant was unable to mount VirtualBox shared folders. This is usually
because the filesystem "vboxsf" is not available. This filesystem is
made available via the VirtualBox Guest Additions and kernel module.
Please verify that these guest additions are properly installed in the
guest. This is not a bug in Vagrant and is usually caused by a faulty
Vagrant box. For context, the command attempted was:

mount -t vboxsf -o uid=1000,gid=1000 var_www_html /var/www/html

The error output from the command was:

mount: unknown filesystem type 'vboxsf'
```
内容は翻訳通り。

このプラグインで解決できる模様。
**vagrant-vbguest**
インストール後、再度 vagrant up
またエラー

```
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

umount /mnt

Stdout from the command:



Stderr from the command:

umount: /mnt: not mounted
```
プラグインのバージョンが良く無いらしい（詳しい内容は追ってない）
なので0.21をインストール
これでひとまずvagrantは立ち上がる。

# apacheを導入
vagrant ssh後

```
 yum -y install httpd
```
その後有効にして、vagrantで設定したプライベートIPに接続でTesting123が表示されるはず。
ここからが長かった。
なんとLaravelのwelcomeページの表示方法がわからない！
つまり、**/etc/httpd/conf/httpd.conf**の設定方法がわかりませんでした。
そして、エラーもどこで見るかすらわかっていない状態。困りました。
調べたらある程度出てきました。

エラーはここにあるようでした**/var/log/httpd/error_log**
はい、初歩です。
見たところ、いろいろ出てました。

**No matching DirectoryIndex**
**ServerNameをセットしてください**
等々

***エラーを愛しましょう***

https://qiita.com/rana_kualu/items/379eefb3a40c6b44cb92#24-%E3%82%A8%E3%83%A9%E3%83%BC%E3%82%92%E5%AB%8C%E3%81%86

設定後はお待ちかねのLaravel8系welcomeページ！
![スクリーンショット 2021-06-27 22.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/536474/18fa3cfe-a0a6-90d7-cc5a-0ee7aeda10b2.png)

その後、仮想環境にphp,composer等々入れてきます。。
Macに登録されているURLスキームを調べる

#ターミナルを開いて下記を入力
基本的に参考のページのコマンドと同じです。
※自分の環境だと重複しているスキームが表示されたので、uniqコマンドを追加しました。

```
/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister -dump | egrep "bindings.+:" | sort | uniq
```

##参考
https://mac-tegaki.com/basic-usage/url-scheme-list-command.html
[Qiita] 画像を中央寄せにする

# Qiitaで`img`タグを使っても画像を中央寄せにしたい！

## 前提条件

+ `img`タグで画像を貼り付けても大丈夫なとき
+ `%`を単位として画像を貼り付けても大丈夫なとき

## 方法

サイズを小さくするために`img`タグで画像を貼り付けている場合は、以下のように記述してみてください。

```md:example
<img width=A%><img width=B% src="画像URL">
```

ただし、`A = (100-B)/2`とし、`0 < B <= 100`です。
また、1行で記述してください。
改：ggplot2を使用して棒グラフ＋エラーバー＋ドットプロットを描く

データ定義を除いて，ライブラリ設定も含めて3行で描けます。

```R 
# シードを固定
set.seed(1234) 
# factor型で並び順を指定
genotype <- factor(c(rep("WT", 10), rep("KO", 10)), 
                   level = c("WT", "KO")) 
# 正規分布乱数生成。KO群の平均値を高めに設定
value <- c(rnorm(10, mean = 10, sd = 2), 
           rnorm(10, mean = 15, sd = 2))

# ここから 3 行！！！
library(beeswarm)
boxplot(value ~ genotype, ylim=c(0, max(value)))
beeswarm(value ~ genotype, method="center", add=TRUE, col=c("red", "blue"), pch=19, cex=2)
```

![Rplot.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1653782/4501820b-bd07-640b-0c94-2b1296defa67.png)
チーム開発ではルールやテンプレートの整理が大事

この記事は以下のイベントに参加して書いてます。
https://qiita.com/official-events/c826cda7a9514df143cb

# はじめに
チームでプロジェクトを遂行している中でこんなシーンをよく見ます。

- KPTで決まったTryがふわっとしたやり方で実行されて、いつの間にかやらなくなってる
- AさんからBさんへの依頼のはスムーズなのに、CさんからBさんへの依頼のときはやたらとコミュニケーションコストが高い
- 「あのとき、あれをやって良かったね」という感想が多かったことがその後必要なタイミングで実施されていない

今回は、２度と同じ失敗を繰り返さないようにルールやテンプレートを作成しようという話をします。

# 明文化しなかったルールは文化になる前に消える

ルールの明文化はとても大事です。もしも、チーム内でこれは継続していきたい仕組みだと思うことがあるならばきちんと明文化し、整理しておきましょう。

健全なチームであれば、プロジェクトが進行していく中でチーム内でいろいろなプロセス改善案が挙がると思います。改善案が挙がることはもちろんとても大切ですが、それがきちんと継続され、文化として根付くことはもっと大切です。継続されなければまたいつか同じ問題に直面することでしょう。

`KPTで決まったTryがふわっとしたやり方で実行されて、いつの間にかやらなくなってる`

こんな例を冒頭に書きました。スクラムを導入しているチームではレトロスペクティブをスプリントの最後に行うのが一般的だと思います。スプリントは１、２週間などの区切りなので、レトロスペクティブは概ね週末に行われるのではないでしょうか。KPT形式で実施し、こんなTryを来週から実行しよう、と決めたときにルールを付箋に一言書いてふわっと決めてしまうと以下のようなことが起きてしまうかもしれません。

1. Tryを決める
1. 週明けにほとんどのメンバーがTryを忘れる
1. 数人がTryを実行する
1. 全員がやってないから徐々に廃れる
1. 同じProblemが発生する

まあ実際これはかなりひどいパターンですが、なくはないと思います。明文化しなかったルールは文化になる前に消えてしまいがちなので、そうならないようにルールはきちんと明文化しておきたいです。

私のチームではプロジェクトの進め方についてのWikiを用意しており、何かしらのルールを決めた際にはWikiにドキュメントを残し、チームメンバーがいつでも閲覧できるようにしています。これによって以下のメリットが得られると考えています。

- ルールを忘れない
- チーム内でのルールの認識が一致する
- ルールになっているので継続しやすい
- 新メンバーが加入してもルールを漏れなく伝えられる

# テンプレート化はコミュニケーションの質を底上げする

同じアクションでも人によって対応が異なる場合には、テンプレートを用意することで全員が少なくともテンプレートに沿った対応をしてくれるようになるので、コミュニケーションの質を底上げすることができます。特に依頼や質問については受ける側が必要な項目を並べたテンプレートを作成し、共有しておくと効果が大きいです。必要な情報を収集するための無駄なやり取りを減らし、本質的な作業に時間を割くため、テンプレートをどんどん作るのが吉です。

`AさんからBさんへの依頼のはスムーズなのに、CさんからBさんへの依頼のときはやたらとコミュニケーションコストが高い`

冒頭でこんな例を挙げました。依頼のときにBさんが作業に取り掛かるために十分な情報を提供できるAさんと、いつも情報不足で何度もやり取りをしてしまうCさんみたいな状況は結構あるのではないでしょうか。こういう場合はさっさと依頼のテンプレートを作成してしまいましょう。どんな情報があると作業に取りかかれるのかを一番知っているのは依頼を受ける側のBさんなので、Bさんがテンプレートを用意するのがベターです。依頼する側のAさんやCさんががテンプレートを作成する場合にはこれまでの経験からBさんが求めそうな情報を整理する必要があります。チーム外への依頼の場合には依頼する側が用意せざるを得ない場合もありますが、同じチーム内であれば受ける側が用意したいです。

# 良かったねで終わらせず、継続的に良い状況を生み出す

良かったとみんなが思ったことがあれば、それはきちんとルールやテンプレートに組み込むべきです。KPTのKはKeepされなければなりません。Kに挙がったことは何が良かったのか、どうしたら継続できるのかをきちんと整理し、ルールやテンプレートに組み込みましょう。

`「あのとき、あれをやって良かったね」という感想が多かったことがその後必要なタイミングで実施されていない`

冒頭でこんな例を挙げました。振り返りをするとき、うまくいかなかったことは「次こそ頑張ろう」と思ってTODOを決めやすいですが、うまくいったことはうまくいったが故に整理を怠りがちです。私は何度も同じ失敗をしました。ルールやテンプレートに組み込めていれば、再び同じ場面に遭遇したときに、もしくは未然に問題を防ぎつつ冷静に対処することができます。

# まとめ

プロジェクトをうまく回すには

- プロジェクトのルールを整理すること
- テンプレートを用意すること

これらが大事です。
Laravelでのマルチ認証でuserでは無いほうのログイン情報を取得する

エラーで時間かけてしまったので、記事書きます。

まずはuserのログイン情報を取得するコード
（マイページボタンをクリックしたときに取得しています）

```php:nav.blade.php
<a href='{{ route('users.show', ['name' => Auth::user()->name]) }}'>
マイページ</a>
```

ログインしているユーザーのnameを取得します

次に、userでは無い方のnameを取得

```php:nav.blade.php
<a href='{{ route('restaurant.show', ['restaurant_name' => Auth::guard('restaurant')->user()->restaurant_name]) }}'>マイページ</a>
```

このguardは``config/auth.php``に入力しているコードですね。
これでエラーがなくなりました。
【AWSオンライン認定試験】仕方なく、英語の試験官で受験してみたら想像以上に苦労した話

#はじめに
本日、SYSOPS（AWS認定SysOpsアドミニストレータ）をオンラインにて受験しました。

5月にSAA受験していますが、その際は試験会場に出向いて受けた為、今回が初のオンライン受験となりました。

すんなりと、受験することができず...トラブル、パニックの連続だったのでこれからオンライン受験を考えている方の参考になればよいと思います。

#英語でのオンライン受験をするに至った理由
まず、私の試験会場は計20分以内で着くことができ、それほど遠くはありません。
なのにオンライン受験を選んだ理由。それは...


![スクリーンショット 2021-06-27 20.46.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430611/2ed3eb26-49c1-c667-cec2-ef33edd6b995.png)

これ。
これが理由です。

現在、2021年5月1日から2021年7月31日の間にオンライン受験することで一回落ちても2回目無料！
（無料、タダという言葉ほど恐ろしいものは無いということをあとから身に染みて体感する）

しかも、2020年9月16日から日本語で受けれるよう対応したみたいです。
それならオンライン受験しようと、意気込んで予約を取ろうと思いましたが...

「日本語の試験監督の予約が、平日の夜しか空いてないじゃん！！」

ということでそれならば、英語の試験監督で受けてしまえ！となり今回の受験に至りました。

#試験準備

色々とネットで、先人の知恵を探し適した環境を構築しました。

####■受験端末
・Macbookを使用して、専用のアプリケーションを実行し受験しました。
・先人からの情報では、Windowsのほうが安定して受験できるとのこと。

####■インターネット環境
・公式の推奨は有線での接続でしたが、無線LANで挑みました。

####■空調
・休日11:00〜受験した為、近所の子供達が騒いでおり窓を閉めていたので、扇風機を回していました。
・試験中は、リモコン操作や窓を開けに行く行為などはできない為、自動で温度管理してくれる環境がベストです。

####■部屋
・何人たりとも部屋に入ることは許されません。
・私は寝室を試験会場として使用しました。

####■持ち込めるもの
・基本的に電子機器はNGですが、トラブル発生時の連絡手段としてスマホの持ち込みはOKです。
・身分証明書
・眼鏡

####■事前のシステムテスト

[ピアソン公式ホームページ](https://www.pearsonvue.co.jp/aws/onvue)からシステムテストを行いました。
・試験用ソフトウェアの動作確認
・インターネット回線の動作確認
・マイク、Webカメラの動作確認

こちらは、実際の本番環境と同じ環境にした上で実行するとよいです。
サンプル試験が実行できる状態になればOKです。

####■AWS受験英会話リスト
・不安だったので、[こちら](https://blog.trainocate.co.jp/blog/online-e_028)も参考にできそうなページを見つけたので共有します。

#試験当日
試験予約時間の30分前にチェックインを済ませようと、試験準備を開始しました。

###試験官がアサインされるまでの流れ
これについては、すでに色々な記事で参考にできるものがあるかと思いますので省略します。
（問題はここではない）

###英語試験官からの指示
身分証明などをアップロードしたあと、試験官がアサインされます。
私の場合は、ボイスチャットが開始されました。

試験官「Hello,〜〜〜〜〜〜How are you?」

中間なにも聞き取れませんでしたが素直に
私「I'm fine」と一言w

相手のマイクの音質と、スピーカーで聞いているのも相まってすごく聞き取りづらかったです。

####以下、その後のやりとりを想像で和訳した日本語でお送りします。

試験官「英語で身分証明できるものみせて欲しいんだけどパスポート持ってる？」

私「パスポートあるよ。これパスポート。（Webカメラにうつしながら）」

試験官「パスポートあるね、それを身分証明として写真撮ってアップロードしてほしいんだけどできる？」

このあと、先ほど身分証明書をアップロードするのに使用したページから再度アップロードを行いました。

試験官「ありがとう。確認できたよ。そしたら机の周りをビデオカメラで映してくれない？」

私「これが机の周りだよ。机の下も映すね。」

試験官「ありがとう、あとは腕と耳になにもつけていないことを見せて？」

私「はい、腕と耳にはなにもつけていないよ。」

こんな感じで一番不安に感じていた試験官とのやりとりを行ったあと、試験開始します。
※実際はこんなにスムーズなやり取りではなく、何度も聞き直したりチャットで打ってもらいました。

#開始直後、トラブル発生
###試験問題が表示されない!

拙い英語で、何も表示されないことを喋りますが伝わらずチャットでなんとか伝えることに成功。
試験官からは、アプリケーションを終了して再起動してくれと指示されましたが重すぎて再起動ができませんでした。
15分前後格闘していましたが、フリーズしていたのでPC再起動することを試験官に了承を得た後、再起動を実施。

###再起動から復帰後、試験が開始されない！
再起動後に、自動的に試験アプリケーションが立ち上がったのでそのまま試験コードを入力し、
「あと少しでチェックインプロセスが完了します」の画面で20分以上待たされた後
「接続エラーが発生しました。キューの先頭に戻しています」のエラーメッセージが出力された後に
別の試験官からボイスチャットが開始されました。

###ようやく試験スタート...
ボイスチャットにて案内を受けながら、手順を進めていくと...
やっと試験画面が表示されました。

イケボのお兄さんに案内されながら、試験を開始することができました。

#試験中に起きたこと

・15問程度解いたあとに、長文の英文チャットが試験官から届く。軽く読んでみたが意味分からず。
とりあえず放置して試験を進めました。

・試験問題のメモ機能を使用しているときに、アプリがフリーズ。5分程度待っていると再度動き出しました。
今回の試験が、無効になって再試験になるのも面倒だったのでメモ機能は極力使わずに最後まで解きました。

#まとめ
オンライン試験は実施されてまだ日が浅いので、こういうトラブルがあるのはしょうがないかと思いますが改善されると嬉しいですね。

今回は、AWSのキャンペーンがあったのでオンラインで受験しましたが
キャンペーン終了後は試験会場で受けますね、**絶対。**

少しでもこの記事が参考になれば、幸いです。
今回のSysOpsは無事合格できたので、次回はSAPを目標にAWSを引き続き学んでいきます。
Automate の実行権限削除(Run Only User) 方法

# 背景
**[modify-run-only-users](https://docs.microsoft.com/ja-jp/connectors/flowmanagement/#modify-run-only-users)** のコネクターを使って、ユーザー削除ができなかったので、対処法を調査した記録

Remove を利用してみると、以下のエラーが出る。

```json:エラーの内容
{
  "error": {
    "code": "AzureResourceManagerRequestFailed",
    "message": "Request to Azure Resource Manager failed with error: '{\"Code\":\"NotFound\",\"Message\":\"Cannot find connection acl with name users.\",\"Target\":null,\"Details\":[{\"Message\":\"Cannot find connection acl with name users.\"},{\"Code\":\"NotFound\"},{\"ErrorEntity\":{\"ExtendedCode\":\"14010\",\"MessageTemplate\":\"Cannot find connection acl with name {0}.\",\"Parameters\":[\"users\"],\"Code\":\"NotFound\",\"Message\":\"Cannot find connection acl with name users.\"}}],\"Innererror\":null}'."
  }
}
```
# 概要
1. Run-Only Users は諦めて、上位権限である、Ownerを一時的に与える。
1. 続けて、Owner権限を削除する。

### 実際のフロー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/69f00639-6c03-7250-ddf9-459251b63e02.png)
### 削除された権限
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/e39fd8cb-6b18-286a-d668-d7d87672ef97.png)

# 補足
- Instant属性のフローは Run-Only Users に User/Group を追加することで、他者と共有できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120072/056622eb-225d-9f4d-64e1-5762b2ef5314.png)
- この機能を使って他者に自動共有・解除をしようとした際に嵌った際の対策です。

# powerusers 上で回答した内容
https://powerusers.microsoft.com/t5/Using-Flows/How-to-configure-the-Modify-Run-Only-users-action-item-in-the/m-p/1350726#M27065

# keyword
how to remove Run-Only users

:::note warn
一瞬Owner権限を与えるのが問題になるケースが若しかしたらあるかもなので、利用時にはご注意を🤔
:::
機械学習

#線形回帰モデル

* 回帰問題（ある離散的な入力から出力を直線で予測する問題）を解くための機械学習モデルの一つ
* 教師あり学習
* 入力と$m$次元パラメータの線形結合を出力する
* 説明変数が1次元の場合($m=1$の場合)、単回帰モデル(直線)と呼ぶ
* 説明変数が多次元($m>1$)の場合、線形重回帰モデル(曲面)
* パラメータは最小二乗法で推定する

【説明変数】
$$\boldsymbol{x}=(x_1, _2, \cdots, x_m)^T\in\mathbb{R}^m$$

【目的変数】
$$y\in\mathbb{R}^1$$

【教師データ】
$$\\{ (\boldsymbol{x_i}, y_i);i=1, 2, \cdots , n \\}$$
$\boldsymbol{x}$：説明変数
$y$：目的変数
$n$：教師データのデータ数

【パラメータ】
$$\boldsymbol{w}=(w_1, w_2, \cdots, w_m)^T \in \mathbb{R}^m$$
$m$：パラメータの次元数

【線形結合】

```math
\hat{y}=\boldsymbol{w}^T \boldsymbol{x}+w_0 = \sum_{j=1}^{m}w_jx_j+w_0
```

$\hat{y}$：予測値
$\boldsymbol{w}^T$：モデルのパラメータ
$w_0$：切片
$m$：説明変数、パラメータの次元数

【最小二乗法】

```math
MSE=\frac{1}{n} \sum_{i=1}^{n}\left\{\hat{y}_i-y_i\right\}^2
```

【回帰係数】
$$\hat{w} = (X^TX)^{-1}X^T\boldsymbol{y}$$

【予測値】
$$\hat{y} = X(X^TX)^{-1}X^T\boldsymbol{y}$$

【単回帰モデル】
$$y=w_0+w_1x_1+\epsilon$$
$y$：目的変数
$w_0$：切片
$w_1$：回帰係数
$x_1$：説明変数
$\epsilon$：誤差

【重回帰モデル】
$m=2$の場合
$$y=w_0+w_1x_1+w_2x_2+\epsilon$$

一般に

```math
y=w_0 + \sum_{i=1}^{m} w_i x_i+\epsilon
```

#非線形回帰モデル

複雑な非線形構造を内在する現象に対して適用される機械学習モデルの一つ

【基底展開法】

* 回帰関数として、基底関数と呼ばれる既知の非線形関数とパラメータベクトルの線形結合を使用
* 未知パラメータは最小二乗法や最尤法により推定

○基底関数と呼ばれる既知の非線形関数
$$ y_i = f(\boldsymbol{x_i}) + \epsilon_i $$
○パラメータベクトルの線形結合
$$ y_i = w_0 + \sum_{j=1}^{m} w_j\phi_j(\boldsymbol{x_i}) + \epsilon_i $$

【非線形回帰モデル関数】
$$ y_i = f(\boldsymbol{x_i}) + \epsilon_i= w_0 + \sum_{j=1}^{m} w_j\phi_j(\boldsymbol{x_i}) + \epsilon_i $$
$y_i$：目的変数
$w_0$：切片
$w_i$：回帰係数
$\phi(\boldsymbol{x_i})$：基底関数
$\boldsymbol{x_i}$：説明変数
$\epsilon_i$：誤差

【よく用いられる基底関数】
○多項式関数
$$ \phi_j(x) = x^j $$

○ガウス型基底
$$ \phi_j(x) = exp \left\{ \cfrac{(x - \mu_j)^2}{2h_j} \right\} $$
$$ \phi_{j}(x) = exp \left\{ \dfrac{(x - \mu_{j})^{2}}{2h_{j}} \right\} $$
$$ a \left{ \frac{1}{2} \right] $$
am
【説明変数】
$$ \boldsymbol{x_i} = (x_{i1}, x_{i2}, \cdots, x_{im}) \in \mathbb{R}^m $$
$m$：説明変数の次元数

【非線形関数ベクトル】
$k$次元の特徴ベクトル
$\phi_1$〜$\phi_k$の写像で変換する
$$ \boldsymbol{\phi}(\boldsymbol{x_i}) = (\phi_1(\boldsymbol{x_i}), \phi_2(\boldsymbol{x_i}), \cdots, \phi_k(\boldsymbol{x_i}))^T \in \mathbb{R}^k $$
$k$：基底関数の数

【非線形関数の計画行列】
$$ \Phi^{(train)} = (\boldsymbol{\phi}(x_{1}), \boldsymbol{\phi}(x_{2}), \cdots , \boldsymbol{\phi}(x_{n})) \in \mathbb{R}^{n \times k} $$

【最尤法による予測値】
$$ \hat{y} = \Phi(\Phi^{(train)T}\Phi^{(train)})^{-1}\Phi^{(train)T} \boldsymbol{y}^{(train)} $$
UXを意識したはじめてのLP作成めも

普段はフロントエンドの実装を行なっている社内のフロントチームで、所属しているチームのLPを作成しました。
メンバー全員、UXはもちろんデザインについてもほぼ初心者というところから作り上げるというなかなかない経験だったので、どんな流れで作成していったかをメモ程度に記録しておきます。
記事の公開にあたり、詳細は記載せずかなりぼやっとした雰囲気にしていますが、流れが分かればいいかなと思っています。

## LP作成にあたって
LP作成の目的は、自分たちで作成したLPからの受注実績をつくることです。
UXについては、社内研修にて講師の方を招いて学習させていただく機会があったため、一部のメンバーは一通りの流れについて理解していました。
社内にはデザインチームも存在しますが、0から自分たちで作ることに挑戦しました。

## 公開までのおおまかな流れ

### 実際には
最初からメモしている雰囲気で書いてますが、実際には1度リリースしていました。
1度目のリリースも0からフロントチームのみで作成していましたが、こちらはUXの観点は持たずに作成をはじめたものでした。
ひとまずリリースはしましたが、社内のマーケティングチームから改善のアドバイスをいただいたので、UXについてきちんと考えた上で再度作成することになりました。
記録としてはそこから2回目のリリースまでのメモになります。

### やることを決める
マーケティングチームからは、約20個ほどアドバイスをいただけました。(ありがたや・・・！)
私たちには見えていなかった観点で指摘をいただけてかなり勉強になりました。
大まかには
- 見た目
- ユーザビリティ
- コンテンツの内容
などなど
その中から優先度を決めて、どこを対応するか決めました。
また、この時点でLP公開までのスケジュールも立てています。

### 目標にむけて
詳細は省きますが、
- 自分たちのLPを作ってなにを伝えたいのか
- 案件につなげるためにはどういったアプローチが必要か
などについても話し合いました。
LPを作成し直すことになり、はじめにチームとして立てていた目標から遠ざかっていたため、
- 目標達成にむけてどのように動いていくべきか？ 
- それに対する対応策
をそれぞれ考え、チームとしてやるべきことに加えていきました。

### ペルソナを立てる
方針を固めるために、ターゲットとなるユーザーのペルソナを立てました。
決め方としては、メンバーそれぞれがターゲットとして考える人物像のプロフィールシートを持ち寄り、すり合わせしていく形を取りました。
ITのリテラシーが高いのか低いのか、どんな性格か(真面目とかせっかちとか)、どれくらいの年代のひとで何に課題を感じているのかなどをメインに詰めていきました。
人物像は架空でももちろんいいのですが、より具体的にするために身近な人をモデルにしてきたメンバーが多かったです。

### コンテンツ決め
どんなコンテンツが必要か、決定したペルソナから考えたり、公開されている様々なLPを見に行って検討を重ねました。
コンテンツは全部で5〜6個にまとめました。
自分たちの実績紹介や、お問い合わせフォームなどもここに含めています。
そのうちの一つに、「自分たちの強み」について記載する項目を用意することにしたので、強みについて考えました。


### 自分たちの強みを知る
メンバーそれぞれが思う、自分たちの強みについてディスカッションを行いました。
幸いなことに、私たちのチームはチーム外の社内メンバーからも評価していただく声をいただくことがあったので客観的な意見も含めることができました。
- 技術面
- チームメンバー個人の人柄
- チームとして評価いただけていること
などを出し合い、最終的には伝わりやすい文章として落とし込みました。

### その「強み」はペルソナに響くの？
そうして作成した文章について、自分たちは満足できても実際にユーザーに伝わるのか？という疑問が出たので、簡単にアンケートを取ることにしました。
方法は単純で、作成した文章を読んでもらい、どう捉えたかを教えてもらいました。
対象はメンバーそれぞれの知り合いで、立てたペルソナに近い知り合いもそうですが、全くITに関係ない業種の方も含め、年齢性別バラバラの10名ほどです。
いただいた意見をもとにブラッシュアップして、文章を決定しました。
客観的な意見をもらうのは緊張するけど、直接生の声を聞けると思いがけないところに目をつけるんだなといった発見があってとてもよかったです。

### デザイン作成・コーディング
LPの画面全体のワイヤーを作成し、立候補したメンバーがそれぞれXDで作成したデザインを持ち寄りました。
集まったデザインをメンバー全員で確認しながら、最終的なものを決定し、コーディングに入りました。
コーディングは2名で行ってくれました。

### 公開
公開するにあたっては管轄が別になるため、マーケティングチームにも協力をいただき、無事に公開することができました！

## おわりに
はじめにペルソナを立てたことで、方向性がずれそうになったときにはペルソナを軸として考え直すことができ、本当にやってよかったと思っています。
今は参考になる記事や資料も豊富なので、やり方も調べたら出てくるしありがたいですね。。
目標もはじめに立てていたので、どうすればよりよくなるかを考えながら話し合いができたこともよかったです。
個人的には、チームメンバー全員で時間を作って話し合いをしながら最後まで作れたことがとてもよかったし楽しかったです。忙しいメンバーもいましたが、みんなで協力してひとつのものを作成できたことは意味があったことだなと思います。
公開はしましたが、ここからブラッシュアップをしつつ実績につなげていけたらと思います。
また、ここまでの流れをメインになってまとめてくれたメンバーに感謝しています。本当にお疲れ様＋ありがとう・・・！
私もデザインを作ったので、そこで意識したことはまた別の記事にしたいなと思っています。
【Flutter】HTTPのプラグインhttp.get時のエラーの対処法

microCMSとFlutterを使ってメディアを作るチュートリアルを行ったときのことです。
puv.devのHTTPプラグインをインストールしてhttp.getしたときにエラーが出たのでその解消法を記述します。

https://pub.dev/packages/http

https://blog.microcms.io/flutter-micrcocms-tutorial/


microCMSさんおブログの通り進めて行くのですが、microCMSに対してHTTPリクエストを行う部分のhttp.getのところで下記のようなエラーが出てきました。

```main.dart
  void _loadListItem() async {
    final result = await http.get(
       'https://sample.microcms.io/api/v1/articles?fields=id,publishedAt,title,eyecatching',
        headers: {"X-API-KEY": 'fvvav89v-0019-65f6-4rg2-vfvf9v08fvaf'});
    List contents = json.decode(result.body)['contents'];
    _listItems.clear();
    _listItems.addAll(contents.map((content) => ListItem.fromJSON(content)));
  }
```
※ APIは適当に書いています。

```
lib/main.dart:28:9: Error: The argument type 'String' can't be assigned to the parameter type 'Uri'.
 - 'Uri' is from 'dart:core'.                                           
        'https://sample.microcms.io/api/v1/articles?fields=id,publishedAt,title,eyecatching',
        ^   
```

メッセージ通り、Uri型な関数が必要なのに、String型として関数を受け取っているためエラーがでています。

`package:http 0.13.0`では変更が行われ、以前は`String`または`Uri`を渡すことができたAPIは、すべてUriを必要とするようになりました。
ちょうどNull safetyが対応してきたやつですね。

https://pub.dev/packages/http/versions/0.13.0/changelog

# 解消法
`Uri.parse`で置換することで解消することができます。

| 以前の書き方 | 置換する方法 | 
|:-----------|:------------|
| http.get('hogehoge')       | http.get(Uri.parse('hogehoge'))        | 

※ `http.post`の場合も同じです。

ということなので上のソースを書き換えるとこのようになります。

```main.dart
  void _loadListItem() async {
    final result = await http.get(
        Uri.parse(
            'https://sample.microcms.io/api/v1/articles?fields=id,publishedAt,title,eyecatching'),
        headers: {"X-API-KEY": 'fvvav89v-0019-65f6-4rg2-vfvf9v08fvaf'});
    List contents = json.decode(result.body)['contents'];
    _listItems.clear();
    _listItems.addAll(contents.map((content) => ListItem.fromJSON(content)));
  }
```

無事エラーが解消されました。
バージョンには気をつけてください。


参考：

https://stackoverflow.com/questions/66473263/the-argument-type-string-cant-be-assigned-to-the-parameter-type-uri
Rust で新しく struct や enum を定義するときに実装を検討する trait まとめ

メモっとかないとよく忘れるんですよ…… (おい)

## 基本

- Clone, Copy
- Default
- Debug, Display

## 比較

- PartialEq, Eq
- PartialOrd, Ord

## 変換

- Deref, DerefMut
- AsRef, AsMut
- Borrow, BorrowMut
- From, TryFrom
- FromStr
- ToOwned

## 出力

- Binary
- Octal
- LowerHex, UpperHex
- LowerExp, UpperExp
- Pointer

## 特定用途向け

### エラー用

- Error

### ハッシュテーブルの要素用

- Hash

### コンテナー用

- Extend
- FromIterator
- IntoIterator

### 演算子

- Sum, Product
- Add, AddAssign, Sub, SubAssign, Mul, MulAssign, Div, DivAssign, Rem, RemAssign,
- Shl, ShlAssign, Shr, ShrAssign
- BitAnd, BitAndAssign, BitOr, BitOrAssign, BitXor, BitXorAssign
- Neg, Not
- Index, IndexMut
- RangeBounds
【HTML＆CSS】画像の背景設定とサイズ変更の仕方



#対象者

①画像の背景設定をしたい方
②画像のサイズ変更をしたい方

#手順目次
1.background-imageプロパティで背景画像指定

2.background-sizeで画像の大きさを変更

3.background-positionで背景画像の位置を調整


#実際の手順と実例
###1.background-imageプロパティで背景画像指定

**必ず画像専用フォルダを準備して、そのフォルダ内に画像をダウンロードしておく!!**

実際に使うプロパティは以下の通り

``````

セレクタ {
  background-image: url(画像のパス);
}

実例を上げると

index.html
    <div class = "main-visual">
      <img src="mv.png" alt="#">
    </div>

``````
``````
style.css
.main-visual {
  width: 100%; 
  height: 650px;
  ここに追加！
  background-image: url(img/mv.png)
  }
``````

###2.background-sizeで画像の大きさを変更
値、画像幅、画像の高さをそれぞれ指定する

`````````
セレクタ {
  background-size: 値;
  background-size: 画像の幅 画像の高さ;
}
````````


実際には

```````````
.main-visual {
  width: 100%;
  height: 650px;
  background-image: url(img/mv.png);
  background-size: cover;
}
``````````````

値だけでもOK！全体を覆うサイズで伸縮させる

```````
【おまけ：その他の使用例まとめ】

セレクタ {
  /* 元画像のサイズを維持したまま、自動的に表示される 初期値 */
  background-size: auto;

  /* 画像の縦横比を維持したまま、領域全体を埋め尽くすまで伸縮される（画像全体が表示される） */
  background-size: contain;

  /* 画像の縦横比を維持したまま、領域全体をおおうサイズで伸縮される（画像の表示されない部分も発生） */
  background-size: cover;

  /* 表示領域の幅100％ 高さ100％で表示（縦横比は無視） */
  background-size: 100% 100%;

  /* pxを指定して表示 */
  background-size: 24px auto;
}
``````````


###3.background-positionで背景画像の位置を調整

```````
セレクタ {
  background-position: 値;
  background-position: 値 値;
}
```````````

値には

* top
* right
* bottom
* left
* center

この他にもpxや％指定も可能です！

実際に例を用いてコードを記述すると、

``````
.main-visual {
  width: 100%; /* 横幅いっぱい */
  height: 650px;
  background-image: url(img/mv.png);
  background-size: cover;
  background-position: center;
}
```````


上記の３つで自在に背景画像を動かすことができます！
NodejsでエクセルやPDFをテンプレートにして文字を挿入＆ダウンロードする

WebUIで表示する分にはいろいろUIライブラリーがあったりして綺麗にできデータ連係とかで完結すれば良いのですが、結局はエクセルに記入して提出とか、PDFに文字を記入して提出とかありますよね。出力までスマートに自動化したくて、挿入する方法をいくつか検討しました。

# 前提

Nodejsでの例になります。

+ Nodejs
+ [FileSaver](https://github.com/eligrey/FileSaver.js) - 生成したblobをダウンロードするには一手間必要ですが、それをシンプルにします。おすすめです。
 
``yarn add file-saver``でインストールします。


# PDF

いろいろやりましたが、[labelmake](https://labelmake.jp/javascript-pdf-generator-library/)を使うのが簡単です。pdf-libがベースのようですが、テンプレートデザイン＆コードジェネレータがあり、PDF上に位置指定が簡単にできます。

https://labelmake.jp/javascript-pdf-generator-library/

``yarn add labelmake``

## 準備

### フォントダウンロード

日本語フォントファイルが無い場合はIPAフォントをダウンロードしておきます。

https://moji.or.jp/ipafont/

### テンプレートの作成

位置をXYで細かく指定する従来の方法もつかえますが、差し込み位置を定義できる[デザイン＆コードジェネレーター](https://labelmake.jp/javascript-pdf-generator-library/template-design/)があるので、それを利用します。

![スクリーンショット 2021-06-27 21.25.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/14768/13e37c9c-eb62-72a0-90e9-4b671c570099.png)


使い方は見れば解る簡単さです。BasePDFでテンプレート元のファイルを選択し、フィールド枠をドラッグで合わせ名称、フォントサイズ、色などを指定します。Alignmentやフォントサイズ、スペーシングが設定できるのでほぼキッチリあわせる事ができます。 「Get Code」で表示されるtemplate以下をコピペするのが便利かと思います。fontが指定されていないと日本語が入っているとエラーになるので注意が必要です。

## サンプルコード

```javascript
import { saveAs } from 'file-saver'
import labelmake from 'labelmake'

// ここではURLから読み込みます
const basePdf = await fetch('/base.pdf').then((res) =>
  res.arrayBuffer()
)
const IPAFont = await fetch('/ipaexg.ttf').then((res) => res.arrayBuffer())
const font = { IPAFont }

// テンプレートの差し込み位置情報
const template = {
  fontName: 'IPAFont',
  basePdf,
  schemas: [{
    field1: {
      ....
    }
  }]
}
// テンプレートに対応するデータ
const inputs = [{
  "field1": "hogehoge"
  ....
}]
const pdf = await labelmake({ template, inputs, font })
const blob = new Blob([pdf.buffer], { type: 'application/pdf' })

const output_filename = 'output.pdf'
saveAs(blob, output_filename)
```

# Microsoft Excel

まだまだ、手元で修正できるエクセルで欲しいという要望もあります。いろいろ試行錯誤しましたが、[xlsx-populate](https://github.com/dtjohnson/xlsx-populate) を使うのが便利でした。

https://github.com/dtjohnson/xlsx-populate

``yarn add xlsx-populate``

## サンプルコード

いろいろできますが、とりあえず指定のセルに文字を入れるだけならこんな感じでできます。

```javascript
import { saveAs } from 'file-saver'
const XlsxPopulate = require('xlsx-populate')

// テンプレート読み込み
const baseXLSX = await fetch('/base.xlsx').then((res) =>
  res.arrayBuffer()
)
const wb = await XlsxPopulate.fromDataAsync(baseXLSX)
const ws = wb.sheet(0)

// セル操作
ws.cell('A1').value("ほげほげー")

// ダウンロード(SaveAsモジュール）
const wbout = await wb.outputAsync()
const blob = new Blob([wbout], { type: 'application/octet-stream' })

const output_filename = "output.xlsx"
saveAs(blob, output_filename)
```

# むにゃむにゃ

ちょっとしたツールを作る事が多いのですが、結局最終出力は紙で！という感じになるのでうまくテンプレートファイルから生成する方法を試行錯誤していました。

今回[labelmake](https://labelmake.jp/javascript-pdf-generator-library/)を発見して、使って見たらテンプレート出力に特化していて非常に良くできていたのでPDF出力まで簡単に実装する事ができました。感謝です。

# 参考

他のPDFライブラリーも比較したまとめがあります。PDFKitは使った事があり、結構大変だった思い出があります...。参考まで。

https://labelmake.jp/blog/javascript-pdf-generator-library/
VS Codeに追加した拡張機能からextensions.jsonを作成する

# はじめに
<!-- 発端や概要を記載 -->
VS Codeに追加した拡張機能から楽に`extensions.json`を作れないかと思い調査した。
`code`コマンドを使えば楽に作れることが分かった。

# 目次
<!-- タイトルとアンカー名を編集 -->
1. [環境](#環境)
1. [作成手順](#作成手順)
1. [共有方法](#共有方法)
1. [参考文献](#参考文献)

<!-- 各チャプター -->
<a id="#env"></a>
# 環境

- Windows10
- Git Bash(MSYS2)
- [jq](https://stedolan.github.io/jq/)

<a id="#作成手順"></a>
# 作成手順

## extensions.jsonを作成する
※git bashを使うのでUNIXの書き方になる

```sh
echo '{"recommendations": [],"unwantedRecommendations":[]}' > extensions.json
code --list-extensions | xargs -i sh -c "cat extensions.json | jq '.recommendations |= .+[\"{}\"]' > tmp && mv tmp extensions.json"
```

```json
{
  "recommendations": [
    "ms-vscode-remote.remote-containers",
    "ms-vscode-remote.remote-ssh",
    "ms-vscode-remote.remote-ssh-edit",
    "ms-vscode-remote.remote-ssh-explorer",
    "ms-vscode-remote.remote-wsl",
    "ms-vscode-remote.vscode-remote-extensionpack"
    ～略～
  ],
  "unwantedRecommendations": []
}
```

## インストールコマンドの一覧を作成する
### Windows
```bat
code --list-extensions | % { "code --install-extension $_" } > install_vscode_extensions.bat
```

### UNIX
```sh
code --list-extensions | xargs -L 1 echo code --install-extension > install_vscode_extensions.bat
```

### batファイル
```bat
code --install-extension ms-vscode-remote.remote-containers
code --install-extension ms-vscode-remote.remote-ssh
code --install-extension ms-vscode-remote.remote-ssh-edit
code --install-extension ms-vscode-remote.remote-ssh-explorer
code --install-extension ms-vscode-remote.remote-wsl
code --install-extension ms-vscode-remote.vscode-remote-extensionpack
～略～
```

<a id="#共有方法"></a>
# 共有方法
.vscodeディレクトリに`extensions.json`を保存する。
`.gitignore`から拡張機能をコミット対象外にしてあとは`push`して共有する。

```
.vscode/*
!.vscode/extensions.json
```

<a id="#参考文献"></a>
# 参考文献
- [Managing Extensions in Visual Studio Code](https://code.visualstudio.com/docs/editor/extension-marketplace#_command-line-extension-management)
- [The Visual Studio Code command\-line options](https://code.visualstudio.com/docs/editor/command-line#_working-with-extensions)
- [【VSCode】推奨拡張機能を共有 - 開発覚書はてな版](https://kakkoyakakko2.hatenablog.com/entry/2018/10/18/003000)
- [How can you export the Visual Studio Code extension list? - Stack Overflow](https://stackoverflow.com/questions/35773299/how-can-you-export-the-visual-studio-code-extension-list)
- [チームでVSCodeを使用する際にインストールすべき拡張機能を設定する - Qiita](https://qiita.com/Glavis/items/c3dac07e4bcf5c50db0a)
データの流れ ― J 言語入門

J 言語のプログラムでは、基本的にデータは**右から左へ**流れます。

monad は引数が右側に一つなので、右から左へデータを流すのは明らかですね。

一方 dyad は左右に引数がありますが、左の引数と右の引数は役割が異なることがあります [^1]。

- 右の引数は、monad の場合と同様に**操作の対象のデータ**を表します。
- 左の引数は、verb の処理の**パラメータ**を表します。

要するに右が主、左が従だということです。

例えば、`{` (dyad) は**配列から**値を取り出す操作なので、右に配列を、左にインデックスを渡します。それに対して `i.` (dyad) は**対象の値**に一致する要素のインデックスを返すので、右に値を、左に配列を渡します。

逆に言えば、左右の引数が何を要求しているかによって、その verb が**何に着目した処理なのか**を (ある程度) 知ることができます。

J 言語に慣れてきたら、こういった視点で見てみるのも面白いかもしれません。

---

\[ [目次](https://qiita.com/unsigned-wrong-wrong-int/items/e15a87999cedfc6b9ced) \]

[^1]: 必ずしも全ての verb に当てはまるわけではありません。`+` などは左右の引数の意味に差がありません。
error "gatsby-plugin-netlify-cms" threw an error while running the onCreateWebpackConfig lifecycle: の対策のためにやったこと

次の３つを行って解決することができました。何が有効であったかの確認はしていません。

1. .cacheフォルダの削除
1. publicフォルダの削除
1. Gatsby cleanの実行

この３つを行うことによってエラーを解決することができました。

原因は把握できていないので、もしご存知の方がいたら、教えてください！！
Servletでログイン機能を実装する手順

## はじめに
本記事はメモ用として残しています。
詳細を書いていないので、追加で知りたいことがあればコメントをお願いします。

## 前提条件
開発環境：Eclipse
Java Vesrion：pleiades java 11
データベース：H2 Database

※H2データベースのダウンロードは[こちら](https://sukkiri.jp/technologies/databases/h2/h2-database_install.html)から


## H2データベース作成
以下のコマンドを実行してテーブルを作成。

```sql
create table account (
    ID INT PRIMARY KEY AUTO_INCREMENT,
    USERNAME VARCHAR(100) NOT NULL,
    EMAIL VARCHAR(100) NOT NULL,
    PASSWORD VARCHAR(100) NOT NULL
);
```

Accountテーブルを作成したらH2(Server)を選択し、接続。
![h2database.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189371/3ed2cab9-6386-e581-42e8-e3d69d7934f4.jpeg)

テーブルを作成したら以下をコピペして実行。

```sql
INSERT INTO ACCOUNT (USERNAME, EMAIL, PASSWORD) VALUES ('admin', 'admin@admin.com', 'admin');
INSERT INTO ACCOUNT (USERNAME, EMAIL, PASSWORD) VALUES ('user', 'user@user.com', 'user');
```

## プロジェクト作成
Eclipseのファイル＞新規＞動的プロジェクトを選択。
任意のプロジェクト名を設定。

![javaweb.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189371/cd2ef3bd-e26a-f8a5-fd58-c026a6ec3adf.jpeg)

プロジェクトを作成したらsrc/main/javaを右クリックして新規パッケージを作成を選択。
パッケージ名「model」を入力し完了を選択。

![modelpackage.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/189371/5ad7017f-10c0-668e-4b92-dbdff7177add.jpeg)

同様に「servlet」パッケージを作成。

## Servletパッケージ内の作業
Servletパッケージ内で作成するファイルは以下の通り。

* Main.java
* Login.java
* Logout.java
* SignUp.java
* DeleteAccount.java

## modelパッケージ内の作業
modelパッケージ内で作成するファイルは以下の通り。

* AccountInfo.java
* LoginLogic.java


コードはgithub参照。
さくらのレンタルサーバ のメールクライアントとして、 Gmail を設定してみました。


## はじめに

昔は Becky! を愛用していたのですが、環境が Mac になったり Windows になったりするうちに、メールデータの管理がおざなりになってきていたので、少しずつ見直していこうと思っています。

Gmail は、「～@gmail.com」というアドレスのメールサービスとして使用する、というのが一般的かと思うのですが、実は Becky! のように（？）「～@gmail.com」じゃないメールアドレスでも、任意のメールサーバー（POPサーバー）に接続してメールを受信してきて 取り扱える、汎用的なメールクライアントとしても使えるようです。

今回は、 さくら のレンタルサーバ のメールクライアントとして Gmail を設定してみました。

## 環境、前提、方針

- さくらのレンタルサーバ スタンダードプラン
- 独自ドメイン使用（～.jp）
- 暗号化設定する（SSL(TLS))

## 作業の方法の確認、ポイント

- サポートの情報を元に設定したら、それほどつまらずに設定できました
    - https://help.sakura.ad.jp/206054132/

- ポイント
    - ユーザー名は、設定するメールアドレス全体（〜@〜.jp）を入力する必要がある
    - 以下は、今回の方針が **暗号化設定する** なので必須
        - 受信ポートの設定を 110 から変更する必要がある
        - POPサーバーの設定を **独自ドメインではなく初期ドメイン（〜.sakura.ne.jp）にする**

## 画面イメージ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44791/49abd628-0727-06e6-60ad-766f2d20c9be.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/44791/bba2fbad-8bc2-9404-5dee-2c335a01e9ec.png)

## さいごに

今後は、メール転送機能 なども活用し、いくつかあるメールアカウントをできるだけ整理していい感じに管理できるようにしていきたいところです。
OS選択画面の後にUbuntuが起動せず黒い画面になっているときの対処法(NVIDIA GPUドライバの再インストール)

1.はじめに
Ubuntuとwin10のデュアルブート環境で、研究のためにUbuntuを常用しているのですが、たまにwindowsを起動して色々したあとUbuntuを起動すると、BIOSのあとのOS選択後なぜか黒い画面のまま起動しなくなるときがあり、たいていドライバの再インストールで治るのでメモしておきます。

2.対処法
今まさに黒い画面が表示されている、というところから始めます。
ドライバに原因があるとき、単純に画面表示がうまく行ってないだけなので、黒い画面でデスクトップが表示されていなくても、もしssh接続できる環境にあったらssh経由で"sudo shutdown now -r"で再起動できると思います。
再起動してOS選択の画面に行ったら、"Advances Options for Ubuntu"を選択し、Recovery modeでUbuntuを起動します。
その後、rootでCUIを起動します。
また、他のPCやスマホなどで、NVIDIA GPUのダウンロードURLをメモしておきます。
今回はストレージに余裕があると仮定してrunファイルをダウンロードします(手順が一番わかり易いと思うので)。
[ここ](https://developer.nvidia.com/cuda-downloads)から自分の環境に合わせて選択肢を選びます。
そうするとrunファイルかdebファイルか選択できるので、runファイルを選択します。
自分の環境ではこの選択肢になっています。
![スクリーンショット 2021-06-27 204912.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607313/fa14cf9d-8f0f-41d3-01cc-f59d1db425ab.png)
そうすると、実行すべきコマンドが表示されている(画像下部)ので、Recovery modeでCUIを起動しているUbuntuでコマンドを打っていきます。runファイルのダウンロードに少し時間がかかりますが、そのうちダウンロードできると思います。
また、二行目の"sudo sh ..."は"sh ..."と読み替えてください(すでにrootとしてログインしているので)。
runファイルを実行すると、ライセンス条約に同意するのか聞かれるので"accept"と打ってEnter、インストールするものを選ぶ画面になるので、**最上段の"NVIDIA Driver"のみインストール**してください。そうするとインストールが完了するので、PCを再起動し、通常通りUbuntuを起動してください。GUIのデスクトップが表示されたら成功です。

3.まとめ
今回はGPUドライバの再インストールをCUIで行うことにより、GUIの正常な起動を行いました。時々この不具合に遭遇することがあり、たいていGPUドライバの更新・再インストールで治るので、また不具合に遭遇したときのためにメモとして置いておきます。もし同じ不具合で起動しない方のお役に立てれば幸いです。
Pyhone 例外処理

プログラミングにおけるエラーは
・構文エラー
・例外
の二つに分けられる

**構文エラー**
記述ミスが原因で発生し、プログラムが実行できない。スペルミス、かっこの閉じ忘れなど
・SyntaxError
・IndetationError

**例外とは**
プログラムで予期しない事態のこと。
構文としては正しくても定義していない変数や関数を参照するなどで例外が発生する。

代表的な例外

・NameError
定義していない関数や変数を使用したときに発生する
・TypeError
関数が意図しないデータ型を受け取ったときなどに発生する
.indexError
リストに存在しないインデックスを指定した場合に発生する
・KeyError
辞書型の変数に無いキーを指定した場合に発生する。

例外処理は発生したエラーによりプログラムを中断させないようにするための処理
try〜except構文を使うことで発生した例外を処理できる。

例

```Python
try:
  処理
except:
  例外の処理
finally:
 　例外が発生してもしなくても実行したい処理