OmniAICreator/Qiita-1.07M huggingface dataset:
（イベントレポート）ハイパー・チームマネジメントを体感する！ミニセミナー：ふりかえりと学習編

# はじめに

この記事は、2021年6月17日に開催されたオンラインイベント[「ハイパー・チームマネジメントを体感する！ミニセミナー：ふりかえりと学習編」](https://www.hypercollaboration.co.jp/event-details/haipa-chimumanejimento-hyper-team-management-wotaikansuru-minisemina-furikaeritogakushuhen)のレポートです。

「ふりかえり」がテーマということで参加してきました。

# 座学

## コラボレーションの必要性

「自社の中で自前で」「自分一人で」というのが難しい時代になってきた。今までよりもより融合性の高いことをやることが前提であり、そこに技術力も前提となってきている。

**Society 5.0**：仮想空間と現実空間を高度に融合させたシステムにより、経済発展と社会的課題の解決を両立する、人間中心の社会。

Society 5.0に向かっていくときに

「コロナだから、会社に行けないからリモート」ではなく「ツール・データ・マネジメントのの3つをデジタルツイン環境で機能する体制を整える」ことで、DXを加速できるようになる。

今回は、そんなリモートワーク・テレワークの中でも肝となる「ふりかえり」を学んでいく。

## チーム活動のとても、とても、シンプルな基本

### チームとは他者とのコラボレーション活動である

チーム活動＝私と私以外の人が、同じゴールを目指して共に活動する
これは、作業を複数名で分担することではない。

チームでは3つのことを理解する必要がある。

- ①ゴールは何か
- ②私とみんなは、今、どの地点にいるのか？
- ③私とみんなは、今、どんな状況なのか？

未来が不確実だからこそ、②③はこまめに確認していかないといけない。
VUCAな時代とは言われているものの、それ以前から「絶対に計画通りに進まない」ということは経験済みのはず。
こまめに調整すれば、失敗は怖くなくなる。

こまめな確認をどうするか、が「ふりかえり」。

## ふりかえりとは

経験から学び、未来を確実に作り出すこと。**反省ではない。**
未来を確実に作り出す、というのはワクワクしませんか？

## 経験から学ぶために必要なこと

現状を認識するためには、仕事の手を止める必要がある。
**多くの場合、終わってない状態で立ち止まる必要がある。**
ここで重要な考え方は、**立ち止まることは「遅延」ではない。**
未来を考えるために、いったん止まる必要がある。

学ぶことは、経験を端的に言語化することから始まる。
言語化することで経験が認知され、人に共有できるようになる。

みんなで言語化しあうことで、**自分がやったことも認知できるようになる。**

# ワーク

## ワーク#1 / 自己紹介

「チームでふりかえりをしていますか？」という質問とともに自己紹介をしました。
している人もいれば、していない人もいて、半々くらいです。

## ワーク#2 / ふりかえりと学習

論理パズルを5人でやるワークをしました。

## ワーク#3 / YWTでのふりかえり

- やったこと
- わかったこと
- つぎにやること

でチームでふりかえる。

「やったこと」を可視化して、そのやったことを1つ1つ丁寧に「わかったこと」に分解していくふりかえりの進め方でした。

## ワーク#4 / ふりかえりでの感想を共有する

- 自然とポジティブなことが出てきた。ふりかえることで「楽しかったんだ」と気が付いた
- 「楽しいふりかえり」だとは思えてなかった。反省会をしていた
- 「助かったよね」といったお互いへのフィードバックが、「楽しい」につながる
- 感情をあわせてふりかえりをする
- 感情を書かないほうがいいのか？事実だけを書いたほうがいいのか？と思っていたが、感情を書くことで、話が膨らむ

# クロージング

## 仕事に置き換えてみると？

やったこと／チームの経験：業務目標達成に向けてやったこと、工夫したこと
わかったこと／チームの学習：わかったこと、他の人がわかったことから学んだこと
つぎやること／チームの成長：ふりかえり対象期間の経験から学んだことを活かして、次の期間に行うこと

こまめにふりかえりをすることで、循環が起こる。

## ふりかえりと翌週の計画

YWTで毎週でふりかえりをしてみる。

> 実践から気付きを言語化し、知恵に結び付けていくプロセスです。忙しい毎日の中で、立ち止まり、言語になりきっていない発見、感情の変化、ありたい姿のイメージなどをチームで言語に結び付けていくことが、チームの実践値を形成していく。

## チームがふりかえりができるようになるまで

- 1週目：チームごとに個別にファシリテーターがついて行う
- 2週目以降：複数チームが集合して、チーム主導でふりかえりを行う。チームマネジメントとふりかえりの工夫について、複数チームが情報交換する

これを繰り返して、チームが自分たちで行えるようになるのを伴走する。

## SECIモデル

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/221788/fdec4708-410d-c268-081e-697665613ec3.png)

このサイクルを回して、知識創造サイクルを高めていく。
暗黙知が形式知化され、共感が生まれる、といったことを実感できるのがYWTでのふりかえり。

このSECIモデルがチームの中で現実化されているのを目指していきたい。

# このイベントのふりかえり

YWTを軸に行っていく中で、1つ1つの「やったこと」をがっつり深く掘り下げていくのはなかなか経験がない（普段自分もやらない）ことでしたが、自己効力感・集団効力感を高めるのによいのに気づけました。
※ただ、ネガティブな部分を掘り起こしていくと、逆の効果が生まれるかも？

私が掲げているふりかえりの定義とは違いますが、目指す部分は一緒だな、と感じられたのも嬉しかったです。

ふりかえりを「楽しい」と思えるメンバーが増えたのも、とても嬉しく感じました。

私も、楽しいふりかえりをこれからも広げ続けようと思います。
Git基礎２

##概要
Git基礎について、覚えておいたほうが良い事柄をまとめる
前回Git基礎として第１弾を投稿したので、引き続き。

##記事の参考リンク
[いつやるの？Git入門](https://www.slideshare.net/matsukaz/git-17499005)

##ワークツリー、ステージングエリア、ローカルリポジトリについて
###それぞれ用語解説
・ワークツリー
ローカルに作成する、Gitで管理したい作業ディレクトリのこと
実際に自身が変更や追加を行うファイル
・ステージングエリア
Git initで作成される.gitのディレクトリの中のindexファイルのこと
ここにワークツリーからaddされたファイルが一時保存される
・Gitリポジトリ(ローカルリポジトリ)
ステージングエリアにステージされている差分をcommitすることで保存される保存領域
commitIDが付く
前のcommitが親となることで、前回のcommitをたどることができる

###それぞれの領域での操作
・ステージングエリアをGitリポジトリの状態に戻す
git reset HEAD(※１) <file>
※１
Gitリポジトリが見ている最新のcommit位置のことを表す
HEADが格納しているのはブランチのポインタである
ブランチはコミットの場所を記憶している
つまりHEADはポインタのポインタともいえる
参考：[GitのHEADとは何者なのか](https://qiita.com/ymzk-jp/items/00ff664da60c37458aaa)
・ワークツリーをステージングエリアの状態に戻す
git checkout --<file>
・ステージングエリアの内容を確認する
git ls-files
・ステージングエリアとローカルブランチの差分を確認
git diff --staged


ShareSlideの101ページの画像を貼る
これら3つの関係と操作が分かりやすくまとめられていた

###その他基本コマンド
・ファイルやディレクトリを移動させる
コマンド例：git mv *.txt move/
カレントディレクトリのtxtファイルをmoveディレクトリ直下に移動する
git moveとせずにmvコマンドだけでやってしまうと別ファイルとして扱われるため、それまでのログが途切れてしまう
参考：[ファイルを移動する](https://tech.katsubemakito.net/git/git_move)
・データ領域を指定commitの状態に戻す
git reset --<mode> <commit>
コマンド例：git reset --hard HEAD
ひとつ前のcommitの状態に戻す
・ワークツリーの状態を確認する
コマンド例：git status
・コミットログを確認する
コマンド例：git log
表示するコミット数(-n コミット数)
ファイルを指定してコミットログを確認する(<file>)
ワンラインでログを表示する等のオプションがある(--oneline)
等のオプションがある
参考：[git log の使い方とオプション一覧（コミット履歴を確認する）](https://26gram.com/git-log)
・最新のCommit情報を表示する
コマンド例：git show、git log -1


##ブランチ
###ブランチについて
・GitではTrunk(幹)なるものがなく、すべてブランチである
・デフォルトでmasterブランチが用意されるので、便宜的にこれがTrunkのように扱われるだけ
・ブランチはコミットの位置をさす
・あくまでポインタという意味合いでブランチという言葉は定義されている
・コミットオブジェクトには以下情報が格納される
１．ツリーオブジェクトへのポインタ
２．親コミットのポインタ
３．コミッターのメタ情報
４．コミットメッセージ
・上記が数珠つなぎのようになってGitツリーは形成されている
参考：[GitのHEADとは何者なのか](https://qiita.com/ymzk-jp/items/00ff664da60c37458aaa)
masterからブランチを作成すると同じ位置をさすブランチが作成される
masterでコミットするとmasterブランチだけコミット位置が変わる
・トピックブランチのコミットをmasterにマージするとき
そのマージコミットについてはmaster側とトピックブランチの前のコミット両方を親に持つことになる
・トピックブランチをリベースするとき
masterとの共通の先祖に移動する
masterのHEADまでのdiffを取得
取得したdiffをmasterに適用して新しくcommitを作成する(この時点で元のトピックブランチのcommitは消える)
★元のトピックブランチがなくなる分、トピックブランチでの変更を追いづらくなるためあまり過度に使用するのはよくない
conflictがあれば対応

###操作
・gitのブランチ作成
コマンド例：git branch develop
masterのブランチから新しくdevelopブランチを作成する
・作業中のブランチを切り替える
コマンド例：git checkout <branch>
HEADの位置が変わる
その結果、ステージングエリアとワークツリーがHEADに合わせて復元される
・上二つの合わせ技
コマンド例：git branch -b <new> <old>
・現在対象となっているブランチに指定のブランチをマージする
コマンド例：git merge develop
developとmaster共通のマージコミットが作成される
コンフリクトがある場合は解消する必要がある
・現在のブランチを指定ブランチからリベースする
コマンド例：git rebase master
現在対象となっているブランチがdevelopとする
masterの最新commitにdevelopのブランチがrebaseされる
この結果、元のcommit(便宜的にEとでもおいておく)がcommit:E'というそもそものcommitとは異なるものになる



##リモートリポジトリ
・リモートブランチ
リモートの状態をさすブランチ
cloneやpullしてきた段階のリモートリポジトリのブランチをさす
同名のローカルブランチもできる
・ローカルブランチをリモートリポジトリと合わせる
pull = fetch + merge/rebaseとなる
git pullをすればリモートブランチもローカルブランチも同時に更新できる
・ローカルリポジトリとリモートリポジトリが同時に更新されていた場合(重要)
１．一度ローカルリポジトリ側でリモートリポジトリの内容をマージする
２．マージコミットをPushしてリモートリポジトリに反映する
リモートリポジトリが頻繁に更新されるような場合はほとんどこの操作をする必要が出てくると思う
リモートブランチの内容がリモートリポジトリのブランチとずれている可能性が高いため
STM32F103C8で温度,S-5851Aをシリアル出力 (Mbed)(USBserial)


x Mbed NUCLEO-F103RB Mbed2 リビジョン172
x 9600bps
x BluePill F103C8

目的
温度をシリアルに出力したい

USBserialをインポートしメインを書き換える

https://os.mbed.com/users/hudakz/code/STM32F103C8T6_USBSerial/


忙しい人よう

https://os.mbed.com/users/caa45040/code/i2c_s5851_103/





```c++



#include "stm32f103c8t6.h"
#include "mbed.h"
#include "USBSerial.h"

USBSerial usbSerial(0x1f00, 0x2012, 0x0001,  false);    // connection is not blocked when USB is not plugged in
//Serial    pc(PA_2, PA_3);


//#define S5851A 0x48
#define ADDR        ((0x48)<<1)   //  address

//I2C i2c(I2C_SDA, I2C_SCL);
I2C i2c(PB_7, PB_6); //103


int     tempval;        //温度
char    data_read[6];   //i2cバッファー
int     n10;            //10の桁

int main() {
    confSysClock();     //Configure system clock (72MHz HSE clock, 48MHz USB clock)

    //usbSerial.printf("\r\n103\r\n");

    while(1) {

        //初期化
        //set address 0
        i2c.write(ADDR, "\000", 1); //addres 0

        //温度の読み込み
        // Read temperature register
        i2c.read(ADDR, data_read,1,false);

        //温度の保存
        // Calculate temperature value in Celcius
        tempval =  data_read[0];

        //tempval = 12; //debug

        //計算
        // Calculation temp
        n10 = tempval/10;                 //10の桁
        tempval = tempval - ( n10 * 10 ); //1の桁

        //液晶に出力
        // Display result
        data_read[0] = '0' + n10;
        data_read[1] = '0' + tempval;
        data_read[2] = '\r';
        data_read[3] = '\n';
        data_read[4] = 0;

        //温度の出力
        //puts(data_read); //010
        //pc.printf(data_read); //767
        usbSerial.printf(data_read); //103

        //1秒待つ
        wait_ms(1000);
        
    }//while
    
}//main




```

![selial_ws2812_303_1_3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/840352/90188a8c-caab-bc48-74df-9f651e2ffbf2.jpeg)
Heroku-20へデプロイ時に、Failed to install gems via Bundler.が出てしまった。

Rubyもアップデートし、これでherokuへプッシュできるかと思いきや、
今度は別のエラーが...

#発生したエラー
```
〜省略〜
remote:        Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
remote:        Bundler Output: Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
remote: 
remote:  !
remote:  !     Failed to install gems via Bundler.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
〜省略〜
```

うーん、よく分からないので、
<font color="Red">Failed to install gems via Bundler.</font color>
↑でググってみた。

すると、同じような状況を解説した記事がいくつかヒットした。

この手のエラーの原因の１つに、ローカルとHerokuで、bundlerバージョンの不一致が起きているというケースがあるらしい。

エラー文をよく見ると

```
remote: -----> Installing bundler 2.2.16
```
Herokuではbundler 2.2.16をインストールしており、ローカルのbundlerのバージョンと一致していないことがわかった。

#試した方法
ローカルのbundlerのバージョンをHerokuのものと一致させた。

```
$ gem uninstall bundler   //ローカルのbundlerをアンインストール
$ gem install bundler --version '2.2.16'  //Herokuのbundlerと同じバージョンをインストール
$ bundler -v  //適用されたbundlerのバージョンを確認
```
次に、変更前のbundlerのバージョンで作成されているGemfile.lockを削除し、新しいbundlerのバージョンで作り直す。

```
$ rm gemfile.lock  //Gemfile.lockを削除
$ bundle _2.2.16_ install   //新しいバージョンで作り直す
```
これでOK！
かと思いきや、Herokuへ再度プッシュするも、再度同じエラーが...。

どうやら他にも原因があるらしい...。


エラー文を読み返してみると、

```
〜省略〜
remote:        Your bundle only supports platforms ["x86_64-darwin-20"] but your local platform
remote:        is x86_64-linux. Add the current platform to the lockfile with `bundle lock
remote:        --add-platform x86_64-linux` and try again.
〜省略〜
```

<font color="Red">
あなたのバンドルは["x86_64-darwin-20"]プラットフォームのみサポートしてるけど、ローカルのプラットフォームがx86_64-linuxだよ。 bundle lock --add-platform x86_64-linuxを実行して、現在のプラットフォームをロックファイルに追加してからまた試してみて。
</font color>


？？？　なんのこっちゃ。(勉強不足...)

#原因
どうやら、bundlerを実行できるプラットフォームが制限されているために起こるエラーらしい。

#詳細
bundlerのバージョンが2.2.◯〜の場合、bundlerが実行できるプラットフォームは、開発をしている環境のOSのみに制限されている。(デフォルトの段階で)
自分の場合、macOSで開発を行っているが、その他のOSではbundlerが実行できないというワケだ。
# 解決方法
エラー文にも記載があったように、以下のコマンドでデプロイ先のプラットフォームを追加する。

```
$ bundle lock --add-platform ruby
$ bundle lock --add-platform x86_64-linux
```
Gemfile.lockを開き、

```
PLATFORMS
  ruby
  x86_64-darwin-20
  x86_64-linux
```
このようになっていたらOK!

再度Herokuへプッシュ...デプロイ成功!

#参考
・https://yumishin.com/heroku-push-error/
・https://www.autovice.jp/articles/150
・https://www.moncefbelyamani.com/understanding-the-gemfile-lock-file/
ITMS-90863:　Apple store connectでバイナリーが上がらない対処

MacOSとXcodeを更新して、アプリをビルドしてApp store connectにアップしたら

```
We identified one or more issues with a recent delivery for your app, "＊＊＊＊＊＊＊＊" 1.1 (5). Your delivery was successful, but you may wish to correct the following issues in your next delivery:

ITMS-90863: Apple silicon Macs support issue - The app links with libraries that are not present on Mac:

/System/Library/Frameworks/AVFAudio.framework/AVFAudio
.
After you’ve corrected the issues, you can upload a new binary to App Store Connect.
```

と怒られてworring。
「Apple silicon Macs サポート問題 - アプリは Mac に存在しないライブラリとリンクしています。」　
AVFAudioがApple Siliconで対応していないと言われても、どうしたものか....
とおもっていたら、AppをApple Silicon Macに配信しないという設定をApp Store Connect側で設定を変えればよいらしい。

![appstore.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/194223/683c3163-4ebf-7092-5be8-b57f9fe6fe0a.png)


「フレームワーク、リソース、ランタイム環境を使用します」とさらっと書いているんだけどAVFAudio.frameworkが使えないとは....

Xcodeではiphoneだけ選択してArchiveするだけではダメで、App Store Connectで配信設定をしないといけないです。

はい、わかりました先生。
LINE Technical Writing Meetup vol. 4 まとめ

本記事は2021年6月17日に行われたLINE Technical Writing Meetup vol. 4のまとめになります。
https://line.connpass.com/event/213308/

公式ではなく、あくまで自分用のメモですので、詳しい内容については後日アップロードされるアーカイブを参照ください。

# 区別できるタイトルをつける　
発表者：矢崎 誠/ LINE株式会社 テクニカルライター
### 前回、前々回の振り返り
- 名前を大事にする話 : 文章を見直すときのヒントになる
- 読者との距離を近づける話 : タイトルと概要に時間をかける
- 本文の並べ方 : 時系列、粒度、重要度
- 情報を整理するコツ : 誰が読むのか、いつ読むのか

### 良いタイトルの必要性
多くの情報を一覧で表示しても、どこに何が書いているかわからなくなる

```
01 3 2020更新内容
出張・旅行について
社内における各対応
イベントの対応について
感染予防について
全社方針
Q&A
```

**多くの情報から必要な内容だけを探すのはとても難しい**。
→項目ごとの違いがわかるように区別できるタイトルをつける必要がある

改善例）適切なグループ分け

```
- 新型肺炎コロナウイルスについて
- 新しい勤務体系（トライアル）について
- 業務などにおける感染予防
```

改善例）グループ内での項目の分類

```
×全社方針 //何でも書いてありそうで、逆に分かりづらい
◯在宅勤務、フレックス勤務  //適切なサイズに区切る
```

各項目がMECEになっているかどうかが重要！

### どのように良いタイトルをつけるか
以下のチェックポイントで考える

- [ ] 前後の項目と正しく区別できるかどうか
- [ ] タイトルと内容が大きく離れていないか
- [ ] １つ上の階層を正しく理解していることが前提になっていないか

#### 具体例

- Flex Message
    - Flex Messageを送信する
    - Flex Messageの要素
    - Flex Messageのレイアウト　


#　テクニカルライティングに学ぶ モノや概念をわかりやすく伝えるテクニック
発表者：仲田 尚央 / サイボウズ株式会社 テクニカルライター

テクニカルライティング　＝　モノやコト（概念）を伝えるための説明技術

### 説明の鉄則
**概要から具体へ**　また　**全体から部分へ**　を絶対に守る。

### 説明の具体的なポイント

1. 最初に概要/全体を端的に言う
1. 相手に合わせて説明の粒度を変える（相手にとって難しい用語には説明を加える）
1. モノや概念を分解する２つの方法
    - 具体例で分解する
    - 構成要素で分解する
1. 要素同士の関係を説明する
1. 配分に注意して、テーマからずらさないようにする


# その他
Q＆Aで紹介されていた[本](https://www.amazon.co.jp/%E6%83%85%E5%A0%B1%E3%82%A2%E3%83%BC%E3%82%AD%E3%83%86%E3%82%AF%E3%83%81%E3%83%A3-%E7%AC%AC4%E7%89%88-%E2%80%95%E8%A6%8B%E3%81%A4%E3%81%91%E3%82%84%E3%81%99%E3%81%8F%E7%90%86%E8%A7%A3%E3%81%97%E3%82%84%E3%81%99%E3%81%84%E6%83%85%E5%A0%B1%E8%A8%AD%E8%A8%88-Louis-Rosenfeld/dp/4873117720)
夏の風物詩の一つ、音色を楽しむ風鈴(ふうりん)をCSSで作ってみた

#どうも7noteです。夏の風物詩、風鈴(ふうりん)を作ってみた。

だんだんと暑い日が続く中、チリーンというあの音が聞こえてくると、「あぁ、今年も夏が始まったんだな」と思います。

そんな夏の風物詩である風鈴(ふうりん)をCSSで作ってみました。

![sample.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/661092/86c67ef6-774c-35c9-5041-96d849bd62f7.png)


あんまり関係ないですが、四季を表現しているホームページっておしゃれでとても好きです。

## ソース

```index.html
<div class="windbell">
  <div class="glass"></div>
  <div class="zetsu"></div>
</div>
```

```style.css

.windbell {
  width: 150px;
}

.windbell .glass {
  width: 100%;
  height: 140px;
  background: linear-gradient(#ABCDE7, #FFF);
  border-radius: 50% 50% 50% 50% / 60% 60% 40% 40%;
  position: relative;
}

.windbell .glass::before {
  content: '';
  width: 80%;
  height: 15px;
  border: solid 3px #ABCDE7;
  border-radius: 50%;
  display: inline-block;
  position: absolute;
  bottom: 15px;
  left: 0;
  right: 0;
  margin: auto;
}

.zetsu {
  width: 50px;
  height: 200px;
  background: linear-gradient(20deg, #75C4B3, #B6DFF0);
  margin: 0 auto;
  transform: skew(-3deg, -5deg) translate(-5px);
  position: relative;
}

.zetsu::before {
  content: '';
  width: 50px;
  border-top: 2px solid #ccc;
  position: absolute;
  top: -10px;
  transform: rotate(93deg);
}
```


## まとめ

CSSで風鈴を作りました。
CSSアニメーションと組み合わせて動きを入れてもいいかもしれませんね。

室内での開発でも熱中症には気をつけてお過ごしください。

#### おそまつ！
~ Qiitaで毎日投稿中!! ~
[【初心者向け】WEB制作のちょいテク詰め合わせ](https://qiita.com/7note)
【論文紹介】Eating Like an Astronaut: How Children Are Willing to Eat “Flying” Food Using Acoustic Levitation

#論文紹介
論文：Eating Like an Astronaut: How Children Are Willing to Eat “Flying” Food Using Acoustic Levitation
著者：Chi Thanh Vi, Asier Marzo, Dmitrijs Dmitrenko, Martin Yeomans, Marianna Obrist
https://dl.acm.org/doi/pdf/10.1145/3395035.3425655

#どんなもの
　音響浮遊法と従来の(お皿に乗せて食べる)方法の2つの提供方法を用いて7種類の食品の味覚の実験を行った。音響浮遊法はTastyFloatsデバイスを使って、周囲の温度と食品の特性、味覚への影響を考慮して液体、固体の食品を浮遊させる。TastyFloatsは苦味の不快感を軽減できるため、子供の野菜摂取を促すことに利用できるとされていた。<font color="gray">(しかし、子供が音響浮遊を食卓での食品提示手法として喜んで受け入れるかは検証されていなかった。)</font>
　この研究では、子供を対象として従来の方法と比較することで、どのように浮遊する食品を食べるのか検証した。実験の結果、TastyFloatsは従来の方法(お皿の上)で食べ物や飲み物を味わうよりも快適でないと感じた。これは、浮遊させる食べ物や飲み物が小さなかけらだったため、浮遊している食品を積極的に装置内に取り込まないといけなくなり、食べにくくなってしまったと考えられる。しかし、TastyFloatsは従来の方法に対して快適ではないが、楽しいと感じた。このことから、浮遊する食品の大きさを大きくすることで、実際の食体験に組み込める可能性を示した。


#先行研究と比較してすごいところ
　今までの研究では、苦くても健康的な食品を摂取することで、子供の野菜摂取を促すために利用することができるものだった。しかし、ユーザ(主に子供)が音響浮遊を食卓での食品提示手法として喜んで受け入れるかは検証されていなかった。この研究では、子供を対象として、音響浮遊(TastyFloats)を使用し、伝統的な食事方法の2つの異なる提供方法を比較した。
→子供たちがどのように浮遊する食品を食べようとするのかを実証した初めての実験。

#技術や手法のキモ
　TastyFloatsデバイスを使って様々な食べ物や飲み物を試食してもらい、カトラリーを使った通常の食べ方との好みや快適さを比較する。
　ビデオを使って子供たちに新しい食事体験を示すことが、試食した食べ物や飲み物に対する好意にどのように影響するか検証する。(浮遊する食品がどのように食べるかのビデオを見せる人と見せない人に分けて実験した。)

#検証方法
　野菜サラダ、ハム、ポテトチップス、ビスケット、りんご、牛乳、チーズの7種類のtべ物を使った。TastyFloatsを使った音響浮遊法とお皿の上に億従来の方法で実験を行う。
　食品の好きさ(その食べ物がどのくらい好きなのか)、快適さ(どれくらい快適に味わうことができたか)を浮遊法と従来の方法のそれぞれで比較してもらった。

　分散分析(ANOVA)を使って評価を分析した。独立変数として提供方法、条件(ビデオを見せるかどうか)、食品の種類を設定。
→TastyFloatsは従来の方法(お皿の上)で食べ物や飲み物を味わうよりも快適でないと感じる。これは、浮遊させる食べ物や飲み物が小さなかけらだったため、浮遊している食品を積極的に装置内に取り込まないといけなくなり、食べにくくなってしまったと考えられる。しかし、TastyFloatsは従来の方法に対して快適ではないが、楽しいと感じた。
　試食の前にビデオを見た被験者は食べ物の好意が高かった。


#議論
　(TastyFloatsでは小さなかけらでしか食品を取り込めないが、)大きい(1口サイズ)食品を浮遊させるデバイスはないのか。
　取り込むのが大変ならば、ユーザの舌の上に直接運ばれるLeviSenseを使えばいいのでは。
　今回の実験の被験者はTastyFloatsに慣れていない人だったため、新しい食事方法を試すことが楽しみだったのではないか。なので、被験者がすでにTastyFloatsに慣れている場合、好き嫌いや快適さがどのように変化するかを調査した方がいい。
　食事は人間の全ての感覚が関わってくる多感覚的な経験なので、味だけではなく視覚や嗅覚、触覚を調査に取り込む必要がある。



#気になった論文
　TastyFloatsシステム[44]
　→このシステムは、周囲の温度と食品の特性、味覚への影響を考慮して液体、固体の食品を浮遊させる。つまり、カトラリーを使わずに食事をするという斬新な方法を提供する。味覚(甘味、苦味、旨味))の強さは浮遊させた状態で味わった方が高いという結果になった。また、浮遊状態では、苦味の快楽性が変調し、不快感の少ない味になることがわかった。
　LeviSense [46]
→浮遊する食品は、そのヘドニック品質が変更される(甘いものはより甘く、苦いものはより心地よくなる)ため、これらのデバイスは、苦い食品であっても健康的な利点(ブロッコリー、ピーマンなど)を摂取するのを助け、ユーザーに不快感の少ない体験を提供することができる。
NTT第36回定時株主総会の議決権行使のご案内を読む

# 概要

NTTに限らず上場企業の株を持っていると1年に1回株主総会の案内が来ます。
ほとんどの人は見ない、もしくは流し見する程度だと思います。
株主総会において、株主は、議決権を行使することが可能です。
![D8B661D7-ED37-49F9-812F-1A2A59CF8DEC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/115974/e9e5c7b2-b48e-f570-ffba-25c0827a2f38.jpeg)

---

# 議決権とは

議決権とは、株主総会での決議に参加して票を入れることができる権利のことで、一般的には1単元株に対し1つの議決権があります。

---

# 議案

会社提案
- 余剰金の配当の件
- 取締役に対する業績連動型株式報酬などの額および内容決定の件
- 取締役の報酬などの額および内容改定の件

株主提案
- 取締役 渋谷 直樹氏解任の件

---

# 余剰金の配当の件

当社では、中長期的に企業価値を高めるとともに、株主の皆さまに利益を還元していくことを重要な経営課題の一つとして位置づけております。
冬季の配当につきましては、安定性・継続性に配意しつつ、業績どうこう、財務状況および配当性向などを総合的に勘案し以下のとおりといたしたいと存じ上げます。

配当金の種類： 金銭
配当財産の割り当てに関する事項： 当社普通株式１株につき55円
およびその総額： 配当総額199,210,696,080円

１株あたり年間配当金額
2017年： 75円
2018年： 90円
2019年： 95円
2020年： 105円

過去の配当金金額
https://group.ntt/jp/ir/shares/dividend.html

---

# 取締役に対する業績連動型株式報酬などの額および内容決定の件

5ページにわたって、取締役の業績連動型株式報酬などの額について、説明がありますが、めんどくさいので省略。

---

# 取締役の報酬などの額および内容改定の件

取締役の報酬について、提案となります。
当社の取締役の報酬などの総額は、2006年6月28日の第21回定時株主総会において、年額７億５千万円以内とご承認いただき今日に至っておりますが、当社の中長期的な企業価値向上に向けた取り組みを促すとともに、取締役が当社の経営者としてより一層強い責任感を持ち、株主の皆さまと同じ目線に立った経営を推進することを目的として、役報酬制度の全般的な見直しを図る一環として、取締役金銭報酬の額を、年額◯億円以内（うち社外取締役分は年額◯億円以内）に、また役員持株会を通じた当社の普通株式の取得のための資金として当社が取締役（社外取締役を除く）に支給する額を、年額5千万円以内に改訂したく存じます。

〜 省略 〜

現在の取締役は8名（うち社外取締役4名）であります。

---

# 株主提案 「取締役 渋谷 直樹氏解任の件」の渋谷直樹氏とは

渋谷直樹氏とは、NTT東日本の副社長を経て、現NTT副社長である。

---

# 取締役 渋谷 直樹氏解任の件

理由
　取締役 渋谷直樹氏は、東日本電信電話株式会社（以下、東日本という）の取締役在任中、下記のような経営を行った。これを見ると、当社の取締役として不適任である。よって取締役の解任を提案するものである。
　当方は、東日本とフレッツ光ライトを契約した。料金が200MB（当方が役2時間利用できる）まで無料とする、と言うものである。
　当方の利用状況は、全く利用しない月が多い。利用しても２００MBの無料の範囲である。それなのに度々不当な料金を請求されてきた。
　これについて、以前「調べてもらいたい。必要があれば東方の利用状態を調べてもらってもよい」と提案している。このことは、その後も事あるごとに伝えてきた。恐らく東日本は、東方の利用状態を、既に傍受していると思われる。そうであっても、何の不思議もない。
　それなのに、何年経っても、何の説明もない。
　また、数ヶ月前に、1,009MB利用している請求があった。この時も「調べてもらいたい」とこれを請求してきた。NTTファイアンんすに申し入れた。こちらでは「NTT料金センターへ言ってくれ」と言う。
　そちらへ話したところ、長々と話した挙句「プロバイダに言ってくれ」と言う。これではどこと契約しているか分からない。
　さらに先日、今年1月分の請求が届いた。この中で利用料が６４４MB（無料分含む）とある。東方の1月分の利用は、1月4日8時14分から8時19分の約5分と1月19日11時28分から11時53分の約25分の合計やく30分（５０MB）である。何と当方が実際に利用した12倍あまりもの請求である。
　当方は、何しろ約7年前から、不当料金問題を提起している。これが解明できる立場にあるのは唯一東日本である。
　不当な料金請求について、速やかに問答無用の方針を改め納得できる説明をしてもらいたい。
　なお、渋谷直樹氏が東日本で、ここにあるような経営をしてきたことは紛もない事実である。

---

# 取締役会の意見

取締役会としては、本議決に反対いたします。

至極、当たり前である。

---

# 結論

NTT株の配当はかなり良い気がする
XAMPP M1 MACインストール

PHPの環境構築ということでXAMMPをM1　MACにインストールしようとしたときにダウンロードファイルの拡張子が.bz2と.cpgzのループにはいってファイルの解凍ができなかった。

調べてみてもあまり参考文献が多くなかったので書き残そうと。

Google Chromeからダウンロードすると拡張子が上記の用になってしまうが、safariからダウンロードを行うと.dmgファイルでダウンロードできる。

また、下記のダウンロードボタンを押すとタブが新しく開かれ画面遷移するが、もとのタブにダウンロードの許可を求められるポップアップが出てきているので許可としないとダウンロードが進まないので注意
![スクリーンショット 2021-06-17 19.43.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/512448/4f82e1e3-d7fa-d2d4-d44f-598a7da42837.png)
for文でcompactMapするのはやめよう！

Swiftでオプショナルな要素を持つ配列をfor文で回すとき、`compactMap`してから回すことが多々あると思います。


↓ こういうの

```swift
let array: [Int?] 

for elm in array.compactMap({ $0 }) {
   // do something...
}
```

ただこれ、compactMapで余計に新しい配列を生成していて割とコストがかかっているのと、`for in ...`の部分でTrailing Closureが使えないので文法的にも他部分と整合性が取りにくくなります。

そこで`for case in`文（造語）を使うと割と綺麗に書けます。

```swift
let array: [Int?] 

for case .some(let e) in array {
   // do something...
}
```


速度の比較をしてみると2倍くらい違うので積極的に使ってい行こう、というメモでした。

```swift
let array: [Int?]

let start = Date()
for _ in 0...100 {
    for e in array.compactMap({ $0 }) { ... }
}    
print(Date().timeIntervalSince(start), "s")  // 0.443s

// ----------

let start = Date()
for _ in 0...100 {
    for case .some(let e) in array { ... }
}
    
print(Date().timeIntervalSince(start), "s") // 0.209s

```
laravel クエリビルダ whereInを使って賢く取得情報を絞ろう

# 目的

- クエリビルダにて「Aカラムの値が〇〇、もしくは✕✕の情報を取得する」命令を記載する際、`orWhere()`メソッドではなく`whereIn()`メソッドを使って記載を短縮する方法をまとめる

# ご注意

- 下記の説明で直接ソースコード上に数字をハードコーディング（いわゆるマジックナンバー）されているが、これはアンチパターンである。
- 本来このような書き方は避けたほうが良いが説明のために致し方なく記載する。
- 本当は定数を記載するファイルや`const`などを用いてその数字の意味を記載してあげてほしい。
    - PHPの定数定義の参考文献
        - [https://qiita.com/Hiraku/items/bb0cb665d830f7cd37ff](https://qiita.com/Hiraku/items/bb0cb665d830f7cd37ff)
        - [https://www.php.net/manual/ja/language.constants.syntax.php](https://www.php.net/manual/ja/language.constants.syntax.php)

# 情報

- 下記のように記載されたクエリビルダがあるとする。
- これはusersテーブルのstatus_idが2か3のレコードを取得するクエリビルダである。
- この書き方でも問題ないが、同じカラムに対しての条件で`orWhere()`メソッド以外の選択肢もある。

```
$query
    ->where( 'users.status_id', '=', 2 )
    ->orWhere( 'users.status_id', '=', 3 );
```

# 方法

- `whereIn()`メソッドを使って下記のように記載する事ができる。
- `whereIn( '判定したいテーブル名.判定したいカラム名', [判定したいカラム名の値として期待されるものを配列状に記載する])`のように記載する。

```
$query->whereIn( 'users.status_id', [2, 3] );
```

# 参考文献

- [https://readouble.com/laravel/6.x/ja/queries.html](https://readouble.com/laravel/6.x/ja/queries.html)
既にGithubにpushしているディレクトリを.gitignoreで無視する。

#はじめに
.gitignoreでファイルを管理しようとしたが、すでにpushしているものへの対応が分からなかったので調べた。

#本文
既に追加しているファイルをgitの追跡から削除すればいいのでgit rmコマンドで追跡から消す。

```
git rm --cached ディレクトリ名orファイル名
```
その後.gitignoreファイルにファイル名を追加。ディレクトリの場合は/を入れるのを忘れずに。ファイル名の場合も/を入れないとそのディレクトリにあるファイル以外も無視される可能性があるので注意。あとはadd,commit,pushすればOK。
#おわりに
reactのモジュールなどはプッシュしない方がいいと聞いたのでやってみました。
それではまた。

#参考文献
[1]:https://www-creators.com/archives/1662
[[1]]:.gitignore の書き方。ファイル/ディレクトリの除外
KHCoderランキング

KHCoderって何か調べるときに参考にした記事

#第1位
https://qiita.com/kazuo_reve/items/6b7205ffb4ce6ad230ba
#第2位
https://qiita.com/kazuo_reve/items/b15d99759d75f942b9f0
#その他
https://qiita.com/mrbabyyy/items/15bd05b938f9db3b94d4

いつもわかりやすい記事ありがとうございます
ReactでpreventDefaultできない問題に対処する

# はじめに

TouchEventなどに対するイベントリスナでは、`Event.preventDefault()` をよびだすことができません。もしイベントリスナ内で呼び出そうとすると、次のようなエラーを目にするでしょう。

```
[Intervention] Unable to preventDefault inside passive event listener due to target being treated as passive. See...
```

これは、イベントリスナが受動イベントリスナとして扱われていることが原因です。`Event.preventDefault()` をよびだすには、イベントリスナが受動的でないことが必要なので、本記事ではReactでイベントリスナを受動的でない形で定義する方法を説明します。

# 非受動イベントリスナを設定する

（以下、TypeScriptで記述しますがJavaScriptでも同様です。）

次のような、内部にSVGの`<Rect>` エレメントを持つReactコンポーネントを考えます。

```react
const MyCircle = () => {
  return(
    <rect x={0} y={10} width={50} height={100} /> 
  );
};
```

ここにタッチイベントに対するリスナ（長方形を触るとイベントが発火する）を定義するには、次のようにします。

```react
const MyCircle = () => {
  // タッチイベントリスナ
  const onTouchStart = (event: Event) => {
    e.preventDefault(); // ここでpreventDefault()を呼べる
    const touchEvent = event as TouchEvent;
    console.log(touchEvent.changedTouches[0].pageX);
  };
  const onTouchMove = (event: Event) => {...}; // onTouchStartと同様
  const onTouchEnd = (event: Event) => {...}; // onTouchStartと同様

  const circleRef = useRef<SVGRectElement>(null);
  useEffect(() => {
    ref.current?.addEventListener("touchstart", onTouchStart, { passive: false });
    ref.current?.addEventListener("touchmove", onTouchMove, { passive: false });
    ref.current?.addEventListener("touchend", onTouchEnd, { passive: false });
    return (() => {
      ref.current?.removeEventListener("touchstart", onTouchStart);
      ref.current?.removeEventListener("touchmove", onTouchMove);
      ref.current?.removeEventListener("touchend", onTouchEnd);
    });
  });
  return(
    <rect x={0} y={10} width={50} height={100} ref={circleRef} /> 
  );
};
```

ポイントは次のとおりです。

- イベントリスナの引数は`Event` 型とする。`TouchEvent`型のプロパティを利用するときは、キャストする。
- DOM要素には、refを設定してアクセスする
- useEffect内で、 `ref.current?.addEventListener()` でリスナを設定する。オプションとして`{ passive: false }` を渡す。
- クリーンアップ時に `ref.current?.removeEventListener()` でリスナを除去する。

これで、TouchEventのリスナでも`Event.preventDefault()` が動作するようになります。

# おわりに

こんな面倒なことしなくても非受動イベントリスナを設定できるようになるといいですねorz
Java言語でasList()メソッドを利用する方法

乃木坂4期生の関西出身、在住していたメンバーで配列のasList()メソッドの利用する方法を記事にします。



```Java
// 乃木坂4期生の大阪に関係するメンバーで配列のasList()メソッドを実験する。
// 乃木坂好きのITエンジニア
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Yonkisei {
	public static void main(String[] args) {
		//asList()メソッドの利用
		String[] s_array = {"早川聖来","林瑠奈","賀喜遼香"};
		List<String> list = new ArrayList<>(Arrays.asList(s_array));
		list.add("弓木奈於");
		for(String val:list) {
			System.out.print(val + " ");
		}
	}
}
```
【JavaScript】WebOTP API で UI/UX を向上させる

## まえがき
・OTP とは one-time-password のこと
・WebOTP APIとはSMSワンタイムパスワードをブラウザ側に通知するもの
・セキュリティ強化のため、二段階認証などで使われることが多い

・SMSで通知されてきたワンタイムパスワードをポチッとするだけで入力してくれる便利な**アレ**のこと。

## SMS認証を入力する入力欄の設定
```html
<input autocomplete="one-time-code" required/>
```

## SMSメッセージのフォーマット
```
Your OTP is: 123456.

@www.example.com #123456
```
・@以降は対応するドメイン、#以降はワンタイムパスワード

## iOS と Android
・iOS: OSでサポートしていて自動的に入力まで行われる。特に対応はいらない。
・Android: 日本語SMSメッセージでは自動では行われない様子。スクリプトで対応。

## Chrome on Android 用スクリプト
```javascript
    <script>
      if ('OTPCredential' in window) {
        window.addEventListener('DOMContentLoaded', function(e) {
          var input = document.querySelector('input[autocomplete="one-time-code"]');
          if (!input) return;

          var ac = new AbortController();
          var form = input.closest('form');
          if (ac && form) {
          	form.addEventListener('submit', function(evt) {
          		ac.abort();
          	});
          }
          navigator.credentials.get({
            otp: {transport:['sms']}
          }).then(function(otp){
          	input.value = otp.code;
          	input.dispatchEvent(new Event('change'));
          });
        });
      }
    </script>
```
コードが冗長だったので修正しました。
・input.dispatchEvent(new Event('change')); で入力後の change イベントを発火させています。
・OTPCredential は firefox on Android では現状未対応の様子。。。

お手軽にUX向上するので是非入れてみてはいかがでしょう。
以上、お疲れさまでした！

## 参考サイト
https://web.dev/web-otp/

https://developer.mozilla.org/en-US/docs/Web/API/OTPCredential

https://akaki.io/2021/sms_otp_autofill
【RDS】DBサーバーを構築する。sec6

目的：プライベートにサブネットにデータベースサーバーを設置する。

→　RDSを利用する。

今回やるもの。

複数のプライベートサブネットにDBサーバーを設置する。プライベートサブネットに設置する理由は、インターネットから直接アクセスさせないようにするため。
それに向け、まずは別のアベイラビリティゾーンに2つ目のDBサーバーを作成する。一つのプライベートサブネットでは、耐障害性が低いため。

## RDS

フルマネージドなリレーショナルデータベース。
フルマネージドとは。アプリに対してDBを最適化する。それ以外のアップデートやバックアップなどは勝手にやってくれる。
DBエンジンに対して直接的な変更が加えられないため、以下に示す各種設定グループを変更することでDBを最適化する。

### DBパラメータグループ

DB設定値を制御

### DBオプショングループ

RDSへの機能追加を制御

### DBサブネットグループ

RDSを起動させるサブネットを制御

### RDSの特徴

1. 高い可用性

    マルチAZを簡単に作成できる。
    マルチAZ：複数のアベイラティゾーンに跨って、複数のDBを構築できる。（1つがマスター、そのほかがスレイブ

2. パフォーマンス向上

    リードレプリカを簡単に構築できる。
    リードレプリカ：複数のRDSを構築することで、読み込み専用のDBインスタンスを作成する事ができる。

その他いっぱい。スクリーンショットからのリストアなど。
plunkerでjexcel その3

#概要

plunkerでjexcelやってみた。
vueでやってみた。

#サンプルコード

```

var options = {
    data: [
        ['Mazda', 2001, 2000],
        ['Pegeout', 2010, 5000],
        ['Honda Fit', 2009, 3000],
        ['Honda CRV', 2010, 6000],
    ],
    columns: [{ 
        title: 'Model',
        width: 300 
    }, { 
        title: 'Price', 
        width: 80
    }, { 
        title: 'Model', 
        width: 100 
    }],
    minDimensions: [5, 6],
}

var vm = new Vue({
    el: '#spreadsheet',
    mounted: function() {
        let spreadsheet = jexcel(this.$el, options);
        Object.assign(this, spreadsheet);
    }
}); 


```

#成果物

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

以上。
刺身線表とは

#刺身線表とは
刺身線表とは、複数タスクが並列している表の事を指します。

例えば、タスクA、タスクB、タスクC、があったとしましょう。

仕事を進めていく場合、タスクA→B→Cという具合に順番に進めていくのが余裕のあるスケジュールと言えます。

これに対して刺身線表はタスクA・B・Cを同時に並べて進めていきます。タスクの並んでいる様子が魚のお刺身のようなので、刺身線表と呼ばれます。
[Rails]MVCモデルを深掘る~Controller編~

##はじめに
RailsのMVCモデルのC(コントローラー）について、少し踏み込んだ内容をアウトプットしていきたいと思います。
よろしくお願いします。

## コントローラーの役割とAction Controller
コントローラーはルーティングによって振り分けられたリクエストを受け取り、モデルやビューに命令をしている司令塔みたいなものです。最終的にレスポンスを返しているのもコントローラーですが、この機能は**Action Controller**という仕組みが働いているからです。

ビューにもAction Viewってのがありましたね。
Action ControllerはRailsのコントローラーの機能を実現させているオブジェクトです。

##可読性を意識する（メソッドの切り出し）
コードを書くときには可読性を向上し、わかりやすく、すっきりとしたコードを書くことに努めるべきですよね。

Viewのときにも、複雑なRubyの処理はビューファイルに書き込むより、モジュールとして切り出したりしてコードを読みやすくできることを説明しました。

コントローラーにもあまり、長文で複雑な処理を書くのは好ましくありません。コントローラーは司令塔の役割をしているので、できれば処理をするよりは、何を受け取っていて、レスポンスで何が返されているのかが明確であるべきです。

そのために、そういったデータを扱う複雑な処理はモデルに切り出してあげることがポイントになります。

##サービスクラス
複雑な処理は、できればモデルに切り出すということをお話ししました。しかしながら、規模が大きなアプリケーションになれば、モデルの記述量も多くなってきて、肥大化しやすいという注意点が存在します。

そこで**サービスクラス**にコードを切り出してあげます。
**サービスクラス**とはコントローラーのコードの可読性を高めるために用いる概念です。

**というのが、よくある説明なんですが！クラスに分ける理由はもう一つあります！むしろこっちの方を理解せずにサービスクラスにコードを分割すると実際の現場では大変なことになるようです！**

クラスに分けたい一番の理由は、アプリケーションの改修などが行われる際に、一つのモデルが膨大な量のインターフェイスを抱え過ぎた結果、変更範囲が確定できなくなることを防ぐために切り出すのだそう。

もし、モデルが肥大化したとしても、構造が安定し、インターフェイスが明確で変更することがないのであれば、問題にならないとのこと。

こちらの記事で詳しく書かれていたのでぜひ読んでみてください↓

https://qiita.com/joker1007/items/25de535cd8bb2857a685

こちらの記事でおっしゃっておられますが、サービスクラス云々の前に、オブジェクト指向というものにしっかりと向き合っていかなければならないそうです。

##最後に
コントローラーについて深ぼっていたら、サービスクラスという概念が出てきて、そこには大きな落とし穴がありました。
もし新しい概念や手法が出てきたときに無理に使うのではなくて、なぜ使うのかよく理解してから使わなければならないなあと痛感しました。反省です。
DockerでPHP+Nginx+MySQLの環境構築

PHPの環境構築地味に大変なので、Dockerで環境構築してみました。
dockerをインストールしていることが前提条件となります。

## 環境
- php7.4系
- mysql5.7

## ディレクトリ、ファイル作成

```
workspace/test_php
           |-nginx
           │  └conf.d
           │    └default.conf       
           |-php
           │  ├Dockerfile
           │  └php.ini
           ├docker-compose.yml
```

このようなディレクトリ、ファイル構成になるように空ディレクトリ、空ファイルを作っておきます。

## ファイルの中身の記述

``` yml:docker-compose.yml

version: "3"
services:
  db:
    image: mysql:5.7
    environment:
        MYSQL_DATABASE: test_php
        MYSQL_USER: root
        MYSQL_PASSWORD: test
        MYSQL_ROOT_PASSWORD: test
    ports:
        - "4306:3306"
    command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
      - ./db/mysql:/var/lib/mysql

  php:
    build: ./php
    volumes:
      - ./nginx/html:/usr/share/nginx/html
      - ./php/php.ini:/usr/local/etc/php/conf.d/php.ini
    depends_on: ["db"]

  nginx:
    image: nginx:latest
    volumes:
      - ./nginx/conf.d/default.conf:/etc/nginx/conf.d/default.conf
      - ./nginx/html:/usr/share/nginx/html
    restart: always
    ports: ["8080:80"]
    depends_on: ["php"]
```
- こちらに関しては、「docker-compose.yml 解説」等でググれば色々な記事がヒットすると思います。

```test:Dockerfile
FROM php:7.4.0-fpm

RUN apt-get update \
    && docker-php-ext-install pdo_mysql

ADD ./php.ini /usr/local/etc/php/php.ini
```

- DockerでPHPの環境構築をすると、`PDOがデフォルトでsqlite`になっているので、環境構築時にpdo_mysqlをインストールします。
- php.ini をコンテナの中の　`/usr/local/etc/php/php.ini` にコピーします。

```php.ini
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

```
- タイムゾーンをAsia/Tokyoに変更しています。

```default.conf
server {
    listen       80;
    server_name  localhost;
    root   /usr/share/nginx/html;
    index  index.php index.html;
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }
    location ~ [^/]\.php(/|$) {
        fastcgi_pass php:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include       fastcgi_params;
    }
}
```

```shell:shell
// test_php/配下で実行
$ docker-compose up -d
```
nginx/配下にhtmlディレクトリが作られます。
html/ 配下にindex.phpを作成します。

```index.php
<?php
  echo phpinfo();
?>
```

localhost:8080/にアクセスして、phpの画面が出てきたら成功です。

## SQLクライアントに接続
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/499375/574f040b-ebc8-039b-8c2e-8d3a2d2655f6.png)
Docker-compose.ymlに記載してあるDB情報を入力して接続する。
GDALをMacにインストールする

GDALをMacにインストールする方法は[こんな記事](https://qiita.com/harmegiddo/items/fa7ca59e636489990edb)があり以前お世話になりました。今回はQGIS等は使わずにパッケージマネージャーのHomebrewとpipを使ってインストールします。

## 環境
各種ツール等のバージョンは以下の通り。<br>
OS: Mac OSX Catalina
GDAL: 3.3.0
Python: 3.3.6
Homebrew: 3.1.12
pip: 21.1.2

## インストール方法
ターミナルで以下のコマンドを実行します。<br>
たくさんログを吐きますが、気にせず進めます。

```
brew install gdal
pip download GDAL
tar -xpzf GDAL-3.3.0.tar.gz
cd GDAL-3.3.0
python setup.py build_ext --gdal-config /usr/local/Cellar/gdal/<GDALのバージョン>/bin/gdal-config
python setup.py build
python setup.py install
```
<br>
ダウンロードしたGDALのバージョンがわからない場合は `ls /usr/local/Cellar/gdal/` で確認しましょう。

## 確認方法
それぞれバージョン情報が表示されればOKです。

### GDAL
```
gdalinfo --version
gdal_merge.py --version
```

### Python
Pythonの環境で以下のコマンドを実行します。

```python
>>> from osgeo import gdal
>>> gdal.VersionInfo()
```

## スペシャルサンクス
こちらを参考にしました。Thank you Kelvin!
[kelvinn/InstallPythonGDAL](https://gist.github.com/kelvinn/f14f0fc24445a7994368f984c3e37724)
【Laravel】toastrを使って、フラッシュメッセージを表示する

今回は、フラッシュメッセージをフワッと表示する方法を記載します。

#使用環境
Laravel 6.2

#フラッシュメッセージとは？
簡単に言うと、セッションに一時的に保存して、表示するものです。
ステータスメッセージなどに使われます。

Laravelでは、flashメソッドなるものが用意されています。

#使い方
書き方は、いろいろあります。

```php
session()->flash('message','作成しました');
```
または、

```php
return view('index')->with('message','作成しました');
```

とかです。

これで、デフォルトのフラッシュメッセージは表示されるようになったかと思います。

今回は、toastr.jsというものを使い、以下のようにするためにしていきます。
![スクリーンショット 2021-06-17 16.53.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1024973/68544daf-9140-9b6f-8e43-00b770dd498e.png)

#1,スクリプトを読み込む
toastr.jsを使うために、以下をviewに読み込みます。

```php
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/toastr.js/latest/toastr.min.js"></script>
```

#2,viewファイルの作成
適当にviewを作成します。そこに記載します。

```php:toastr.blade.php
@if(session('message'))
<script>
$(function(){
  toastr.success('{{session("message")}});
});
</script>
@endif
```
`""`をつけ忘れたおかげで、めちゃめちゃ苦労しました。。。


これをレイアウトのファイルに`include()`することで使えるようになります。

#3,オプションの設定

また、画面の中央部に表示したいなどは、オプションをつけましょう。

```php:toastr.blade.php
toastr.options = {
            "closeButton": false,
            "debug": false,
            "newestOnTop": false,
            "progressBar": true,
            "positionClass": "toast-top-center",
            "preventDuplicates": false,
            "onclick": null,
            "showDuration": "300",
            "hideDuration": "1000",
            "timeOut": "5000",
            "extendedTimeOut": "1000",
            "showEasing": "swing",
            "hideEasing": "linear",
            "showMethod": "fadeIn",
            "hideMethod": "fadeOut"
          }
```
オプションは、色々いじれます。
以下のサイトを参考にしてください。
https://codeseven.github.io/toastr/demo.html

#参考
https://qiita.com/n_oshiumi/items/17753aa6237c7afbbe09
https://qiita.com/usaginooheso/items/6a99e565f16de2f9ddf7
【kotlin】スコープ関数 apply,also,let,run

#■プロパティを設定する。
プロパティ設定用関数

通常のやり方

``` kotlin
class Hoge(val name: String) {
 var num = 0
 var menu:String? = null
}

val hoge1 = Hoge("マイケル")
//インスタンスhoge1を使用
hoge1.num = 15
//インスタンスhoge1を使用
hoge1.menu = "カレー"
//インスタンスhoge1を使用
println(hoge1.menu) 
//結果:カレー

```

通常上記の様にインスタンスを生成しインスタンスを使いクラスの中身の変数を設定していく。

##■apply
applyを使えばシンプルにコードを書ける。
クラスの中身の変数を設定する時にインスタンスを必要としない。

```kotlin
  var インスタンス = クラス名(引数の値).apply{ラムダ式}
```

``` kotlin
class Hoge(val name: String) {
 var num = 0
 var menu:String? = null
}

//インスタンス生成時にapplyを呼び出している。
val hoge1 = Hoge("マイケル").apply {
//インスタンスhoge1いらない
num = 15
//インスタンスhoge1いらない
menu = "カレー"
}
//インスタンスhoge1を使用
println(hoge1menu) 
//結果:カレー
```

レシーバ(hoge1インスタンス)の部分をthisでも代用可能
thisを省略も可能


##■also
意味合い的にはapplyと似ている。
レシーバ(hoge1インスタンス)の代わりにitを使っている。

``` kotlin
//インスタンス生成時にapplyを呼び出している。
val hoge1 = Hoge("マイケル").also {
//インスタンスhoge1の代わりにit
it.num = 15
//インスタンスhoge1の代わりにit
it.menu = "カレー"
}
//インスタンスhoge1を使用
println(hoge1.menu) 
//結果:カレー
```
▼thisの意味合いで使い分ける。
applyでは{}の中ではthisはレシーバ(hoge1インスタンス)を意味する。
alsoでは{}の中でもthisはレシーバーを意味せず標準の意味で現在のアクティビティを意味する。

{}内の処理によって使い分ける。

#■メソッドを実行する。


##■let
メソッドを実行
itで中の値の事を指している。

``` kotlin
fun main(){
    val cake = "hello".let{
        //大文字にした4文字目を標準出力 
        println(it.toUpperCase()[3]) 
        //最初の文字だけ大文字に変換    
        it.capitalize()     
    }
    //letのメソッドの結果が入っている。
    println(cake)
}

//L
//Hello
```

##■run
letのapply版みたいな物
{}の中のthisがitの代わり
letの{}の中でthisだと意味合いが変わる。

``` kotlin
fun main(){
    val cake = "hello".run{
        //大文字にした4文字目を標準出力 
        println(this.toUpperCase()[3]) 
        //最初の文字だけ大文字に変換    
        this.capitalize()     
    }
    //letのメソッドの結果が入っている。
    println(cake)
}
```
Windows,Revel,Docker環境でHot reloadに対応する

# Windows端末でDocker、RevelでHot reloadさせる

RevelがHot reloadせずに、修正の都度、Dockerをリスタートさせて非常に効率が悪かったので、
Hot reloadさせるために行った対応を記載します。

## 動作確認環境

- Windows 10
- Docker version 20.10.5
- Revel V1.0.0

Dockerを使用してhostとコンテナのファイル共有がNFSで行われている場合、
ファイル変更の通知が行われずに、Revelのhot reloadの対象となりません。

LinuxやmacOSでは発生すると記載されていませんが、
Windows環境では発生事例がGithubのIssueに登録されてます。

- [Hotreload does not work for an docker/vagrant environment](https://github.com/revel/revel/issues/1473)
- [Edit notifications don't work when running inside of Docker container on Windows](https://github.com/fsnotify/fsnotify/issues/292)

Windowsの場合、以下の方法でhot reloadさせる事が出来ます。

- [WSLをインストールする](https://docs.microsoft.com/ja-jp/windows/wsl/install-win10)
  - Ubuntu 20.04 LTSをインストールする
- WSLの Ubuntuをターミナルで立ち上げる
- WSLの任意のディレクトリーに git clone でソースを取得する
- WSLのターミナルからDockerを立ち上げる
- ファイルを修正して、hot reloadが実行されることを確認する

## HostコンピューターからWSLのファイルを開く方法

- エクスプローラーから _\wsl$_ でアクセス出来る
- ターミナルからはWSL側のファイルには、//wsl$/Ubuntu でアクセス出来る
ios13以降で、UIFontPickerViewControllerにシステムフォント以外の、ユーザーがインストールしたフォントも表示するようにするレシピ

# 問題: UIFontPickerViewControllerにシステムフォントしか表示されない。

##解決
1. "TARGETS"の"Signing & Capabilities"に、"Fonts"を追加。
1. 追加した"Fonts"の、"Privileges" -> "Use installed Fonts"にチェックを入れれば、いいらしいです。

下記リンクの二番目の方法です。

https://stackoverflow.com/questions/58189283/ios-13-installed-fonts-retrieval
E: パッケージ XXXX.deb が見つかりません というエラーを解決する

# 概要

NVIDIA関係のライブラリを再インストールするために一旦すべて削除しようとした際，`パッケージ nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb が見つかりません`というエラーによって正常に削除できなくなった．

```bash:パッケージが消せない
$sudo apt remove nvidia-*
# 英語環境での出力
Reading package lists... Done
Building dependency tree       
Reading state information... Done
E: Unable to locate package nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
# 日本語環境での出力
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています                
状態情報を読み取っています... 完了
E: パッケージ nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb が見つかりません
```

# 原因と解決方法

エラー中に述べられているパッケージ名`nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb`がなぜかファイル名(`~.deb`)の形式をしていることからもわかるとおり，このエラーが出る場合はカレントディレクトリの直下にファイル名が`nvidia-`から始まるファイルがある．つまり，`apt remove [ワイルドカードを含む表現]`となっているときに，ファイル名がその表現に含まれる文字列になっているファイルがあるとこのエラーが出る．

今回は

```bash
$ls
Desktop Document ... nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
```

となってしまっていた．`nvidia-*`にマッチするファイルを持たない適当なディレクトリに移動して実行すれば解決．

# 所感

カレントディレクトリ内の`XXXX.deb`ファイルから`apt`でパッケージをインストールする際に注意することとして以下のような話がある．

>```bash
>$sudo apt install XXXX.deb
>```
>だとXXXX.debがパッケージ名として解釈され`E: パッケージ XXXX.deb が見つかりません`というエラーになるので，
>
>```bash
$sudo apt install ./XXXX.deb
>```
>としなければならない

このことから，今回の`apt remove`の引数が`nvidia-*`であり`./`から始まるパス表現ではなかったためにファイル名として解釈されることはないだろうと考えていたが，ワイルドカードを使うと事情は異なるようだ．このエラーが出たらまずは冷静になって`ls`するようにしたい．
Speedtest CLIでインターネット速度を定期自動計測してログを残す方法

# はじめに
ネットワークのスピードを計測する際に、[Speedtest.net](https://www.speedtest.net)や[fast.com](https://fast.com/ja/)を使うとWebブラウザ上で気軽に測れますが、1時間に1回など自動で定期的に測って記録を残しておきたい場合があります。その方法を簡単にまとめます。
# 対応方針
今回は、次のように対応したいと思います。

- コマンドラインで使える[Speedtest CLI](https://www.speedtest.net/ja/apps/cli)で、csvでログが出力されるようにバッチを作成
- Windowsのタスクスケジューラで、上記を実行するバッチを定期実行できるようにする。

なお、Speedtest CLI自体はMacやlinux版もありますので、cronなどで定期実行できるようにすれば同様に対応は可能と思われます。

# 実際の対応

## Speedtest CLIのダウンロードと、今回の使い方のポイント

1. ダウンロード先はこちら→[Speedtest CLIのサイト](https://www.speedtest.net/ja/apps/cli)
1. csvで出力するには、実行時に -f csvのオプションをつける
1. ヘッダ情報を得るには、実行時に-f csv --output-headerのオプションをつける。ただし、計測ログは追記で対応したいので、事前に1回だけ実行しておいて、ヘッダファイルを作っておく。
1. -s %id%オプションで、接続先のサーバを選ぶことができる。つけないと実行時に変わる可能性があるので、指定した方が良いかも。
1. 上記の%id%のリストとその接続先情報は-Lオプションで閲覧可。事前に確認しておく。
1. csvファイル出力にすると、実行時間が記録されないので、追記されるようにバッチ側で対応する。この時に、前に作成したヘッダも実行時間カラムを追記しておく。

以上を踏まえて、次のように作ってみました。
事前にヘッダ情報だけは、%current_dir%log_speedtest.csvに書いておく感じです。
**※9/29追記：このバッチとspeettest.exeは同じフォルダにあるのを想定して書いています。exeファイルと分けて保存する場合は、5行目のinの中で指定しているexeファイルのパスを配置場所に置換してください。**
**※9/29再度追記：転記した関係で5行目にバグがありました。usebackq delimsのところが、usebackq delimと記載されてました。下記コードは修正済みです。大変失礼いたしました。**

```speedtest-cli.bat
@echo off
setlocal
set current_dir=%~dp0
set NOW_TIME="%date% %time%"
for /f "usebackq delims=" %%A in (`%current_dir%speedtest.exe -f csv -s 21569`) do set RSLT=%%A
set RSLT_DATA=%NOW_TIME%,%RSLT%
echo %RSLT_DATA% >> %current_dir%log_speedtest.csv
```

一応、バッチ単体で動くことを確認して、バッチ作成までは終わりとなります。

## Windowsのタスクスケジューラの設定
簡単に設定できると思いきや、意外と罠がありました。
不要な設定もあるかもしれませんが、関連サイトを見ながら設定しました。
参考にしたサイトとポイントだけ記載します。

### 基本的なタスクの設定
[Windowsでbatファイルを自動実行したい時（タスクスケジューラの設定）](https://qiita.com/Richard_Roe/items/44e16841f16ee40c6113)を参考にしました。
「[トリガー]の設定」と「[操作]タブにて実行させるスクリプトの設定」以外は同様に対応しました。

### トリガーの設定
1日1回の計測だと不十分で、1時間に1回はやりたく、[Windows10でタスクを1時間間隔で実行する方法](https://www.wannko.net/windows10/kihon/task5.html)を参考にしました。
ポイントとしては、詳細設定の**繰り返し間隔**と**終了時間**を設定するところです。

### タスク作成の全般の一番下の構成を変更
私はWindows10を使ったのですが、なぜかデフォルトでVistaになっているので、一応変更しておきました。

### 操作タブの開始（オプション）の設定
ここまでしても、**タスクスケジュールのログ的には正常に実行されたと表示されますが、バッチは実行されず。。**
困って、[タスクスケジューラに登録したバッチがうまく実行できない時に確認すること](http://sogohiroaki.sblo.jp/article/178281845.html)を調べて対処したところ、下記の設定が必要ということがわかりました。
> 例えば、この1行バッチのようにカレントディレクトリに依存するコマンドがある場合は、[操作]タブの設定で「開始（オプション）」という欄にどのディレクトリで実行したいか――すなわち作業フォルダを記述しないといけない。

「set current_dir=%~dp0」と書いたせいですかね。。
タスクスケジューラで使うバッチの場合は、絶対パス記載の方が良かったかも。
###

# 最後に
意外と、バッチで対処するところやタスクスケジューラで対応するところがありました。
特に、タスクスケジューラはタスクスケジューラ上では「正常に実行された」とログが残るが、実際はバッチが実行されないとログだけではわからないところもあり、設定に少し悩みました。(ググればすぐわかりましたが。。)
不要な設定もあるかもしれませんが、参考になれば幸いです。

# 実行環境
- Window 10 Pro ver 20H2
- Speedtest CLI windows版 1.0.0

# 参考文献

- [Speedtest CLI](https://www.speedtest.net/ja/apps/cli)
- [Windowsでbatファイルを自動実行したい時（タスクスケジューラの設定）](https://qiita.com/Richard_Roe/items/44e16841f16ee40c6113)
- [Windows10でタスクを1時間間隔で実行する方法](https://www.wannko.net/windows10/kihon/task5.html)
- [タスクスケジューラに登録したバッチがうまく実行できない時に確認すること](http://sogohiroaki.sblo.jp/article/178281845.html)
ハンズオン６　キャッシュサーバーの配置


####今回の仕組み（以前のハンズオンからの続き）

クライアント
↓　ROUTE53（blog.handson4.netとCloudFrontのドメイン紐付け）
CloudFront
↓　ROUTE53（alb.handson4.netとELBのドメイン紐付け）
ELB


＊CloudFrontとELBにSSL証明書を発行
ただし、CloudFrontの証明書はバージニア北部のみで発行可





###①ROUTE53のドメイン変更

現在のドメイン
`blog.handson4.net`
↓
`alb.handson4.net` へ変更

＊S3のSorryページにルートしてる場合
新しくS3バケットを`alb.handson4.net`で作り直さないと設定できない
（S3バケット名とドメイン名の紐付けが必要）


###②ロードバランサーにアタッチされている証明書のホスト名をワイルドカードに作り直す
（一つの証明書で複数のドメインの証明が可能）

現在のドメイン
`blog.handson4.net`
↓
`*.handson4.net`

＊以前のリスナー、証明書、ROUTE53のドメインは削除する
＊alb.handson.netで接続できることを確認

###③CloudFront用の証明書を発行
＊バージニア北部（US-east1）から発行
`*.handson4.net`で発行

###④CloudFrontの作成
・Create Distribution
１、Select a delivery method for your content
Web-`Get Started`

２、Create Distribution
Origin Domain Name　→ alb.handson4.net
Origin Protocol Policy →HTTPS Only
Viewer Protocol Policy →HTTPS Only

Cache Policy　→　Create a new policy
＊テスト用に短いTTLを設定
Name - ShortCache
TTL Settings - 全て６０秒
他デフォルト

Create Distributionの画面に戻り、Cache Polocyを先ほど設定したShortCacheに指定

Alternate Domain Names - blog.handson4.net
(CNAMEs)

SSL Certificate - Custom SSL Certificate (example.com)
`*.handson4.net`(③で設定したSSL証明書)

他デフォルトでOK
Distribution　作成

statusがdeployedになったら使えるようになる
CloudFrontのdomain nameでアクセスできるか確認

＊https通信のみ許可してる場合、httpでは４０３エラーになるので注意
Origin の https 設定はALB側
Behavior の https 設定はクライアント（ブラウザ）側

###⑤blog.handson4.netとCloudFrontのドメインの紐付け
ROUTE53でシンプルルーティングで紐付け


これで`blog.handson4.net`からアクセスした際にCloudFrontからキャッシュで返される仕組みができた



＊直接ELB（`alb.handson4.net`）に接続するとEC2サーバー１、２のどちらかの応答が返ってくるが、CloudFront(`blog.handson4.net`）でアクセスするとTTLで設定した６０秒は同じキャッシュが返されるのですぐにオリジン（EC2）の結果が反映されない事になる。
デバック環境を構築する　Windows10をクリーンインストールする

ソフトウェアやハードウェアのデバックを行う際に開発環境とともに必要となるのがデバック環境です。
デバック環境を構築する　Windows10の回復機能でクリーンな環境に戻すの続きとして、Windows10のクリーンインストールを簡単にまとめました。
https://qiita.com/usashirou/items/3dca5fa424fd637be079
#ドライバーをバックアップする
最初に、ドライバーをバックアップします。
Windows10のドライバーは以下のディレクトリにあります。
___C:\Windows\System32\DriverStore___
これを丸ごとコピーしておきます。
#プロダクトIDを確認する
WIndows10のプロダクトIDはデジタル認証を受けている場合が多く、見ることが出来ません。
こういったときに役立つのがProductKeyを見るアプリケーションとしてWindows Product Key Viewerなどを使用します。
PowerShellで表示できるはずですが、私は表示されなかったのでアプリケーションをお勧めします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/405c4c5a-cdba-bcb5-91a1-3a133277c885.png)
#Windows10インストールディスクを作る
MediaCreationToolをダウンロードしUSBメモリ等にWindows10のインストールディスクを製作します。
この際に使用するUSBメモリは16GBが良いようです(32bit,64bit対応版）
https://www.microsoft.com/ja-jp/software-download/windows10
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d3ebd5dd-0e98-3fee-fbe1-084d437e8a91.png)
#インストールする
再インストールの場合、プロダクトID等入力せずにインストール出来ると思います。
#ドライバーを復元する
いくつかのデバイスのドライバーが当たっていません。
![繧ｳ繝｡繝ｳ繝・2021-06-16 154435.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/689270bf-bb96-8179-4dba-b275c28d1e46.png)
先ほどバックアップしておいたドライバーを指定してインストールしていきましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2ffcd30a-81cd-c23d-6693-0e0759667983.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/07e98ce5-1b51-a90c-5180-c9db6c592dbf.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/8129913c-7497-088a-feec-83992ac88236.png)
![繧ｳ繝｡繝ｳ繝・2021-06-16 154559.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/92b28054-690c-f94c-089f-a267243a1b3f.png)
#Windows Update
念のため、すべてのパッチを充てるようにします。

以上で終了です。
SSDのPCであれば1~2時間程度で完了すると思います。
機械学習勉強記録 Pandasで重複する行を除外する

# 1　重複する行を消す `.drop_duplicates()`
データフレームの中で、重複したデータが入っている時に、それを簡単に削除する方法があります。
`.drop_duplicates()`を使います。

```python
df.drop_duplicates()
```

# 2 パラメータ

## 2.1 `subset`
例えば、`subset=['Name']`とすると、`'Name'`の列で同じ要素を持った（二回目以降に同じ要素が出てきた）行が消えます。

## 2.2 `keep` 
`keep='last'`重複したもののなかでも、最後の一つだけを残して、他は全て消えます。
`keep=False`重複したものは何も残らず、全て消えます。
Amazon DynamoDBについて（DVA対策に）

## はじめに
今回はDVA対策に勉強していた所Amazon DynamoDBについての理解が浅いと感じたので、書籍やAWS公式からDynamoDBについてのアウトプットとして書いていきます。

##　Amazon DynamoDBとは


・フルマネージドなNoSQLデータベース
・ユーザーはリージョンを選択してテーブルを作成し、サーバーの管理もしなくていい
・パーティション（データの保存先）を分散させることで水平スケーリングを可能とするため、多くのリクエストが発生するアプリケーションに非常に適している。
・トランザクションは無理

## テーブル

![スクリーンショット 2021-06-17 164451.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/993659/cf731c81-fcf3-8a1d-cde0-2e4e2e5fcb35.png)

　リージョンを選択してテーブル名を入力する。
　データを一意として扱うために作成時にプライマリキーを決定しておく必要がありプライマリキーには2つのパターンがある。

#### キーの種類

**パーティションキー（ハッシュキー）**
・テーブル作成時に1つの属性を選ぶ
・単独での重複×

**ソートキー（レンジキー）**
・2つの値の組み合わせによって1つの項目を特定
・ソートキーの設定は任意

**プライマリキー**
・「パーティションキー」または「パーティションキーとソートキーの複合キー」のこと
・プライマリキーによってデータは一意に識別できるようになる

##　請求モード
　DynamoDBのストレージ料金は実際に保存した容量に応じた料金がかかる。テーブルを作成する際に容量を確保する必要はなく、テーブルには無制限にデータを保存できます。
　書き込み、読み込みは2つの請求モードから選択する。

**オンデマンドキャパシティモード**
　読み込み回数とサイズ、書き込み回数とサイズに応じて請求が発生し結果整合性での読み込みに対して強い整合性での読み込みは倍のコストが発生する。
　
**プロビジョニングキャパシティモード**
　読み込みキャパシティユニット（RCU）と書き込みキャパシティユニット（WCU）をプロビジョニング（確保、設定）するモード
　1つのWCUでできることは最大１KBの項目を1秒間に1回書き込むことです。1つのRCUでできることは、最大４KBの項目を1秒間に2回結果整合性で読み込むか、1秒間に1回強い整合性で読み込むかになります。
　強い整合性の場合は、更新された項目をリアルタイムで読み込む。

## セカンダリインデックス
　セカンダリインデックスとは名前の通りプライマリキーが1つ目のインデックスなので2つ目以降のインデックスとして使用する。
　パーティションキーとソートキーだけでは不十分な場合に設定することができ、それが**グローバルセカンダリインデックス（GSI）とローカルセカンダリインデックス（LSI）**です

**グローバルセカンダリインデックス（GSI）**
　パーティションキーの属性の代わりになり、パーティションキーをまたいだ自由な検索を可能にする
　テーブル作成後に作成
　
**ローカルセカンダリインデックス（LSI）**
　プライマリキーのタイプが、パーティションキーとソートキーの場合のみ設定可能で、別の規則でのインデックスを可能にする。
　テーブル作成時に作っておく必要があり、後から追加はできません。

## セキュリティについて

**IAMによるアクセス制御**
・テーブルへのアクセス制御にはIAMポリシーを使う
・テーブルにアクセスする際は、アクセスを許可したIAMポリシーをアタッチしたロールを使う

**暗号化**
・KMSを使用してデータの暗号化可能
・暗号化設定はRDS同様作成時のみ可能
・暗号化されたテーブルへのアクセスには、KMSへのアクセス許可があるポリシーが必要になる

## DVA学習を通して感じたこと
・DynamoDBについてめちゃくちゃ問われる
・LSIやGSIなどについてもよく問われる
・実際にハンズオンを通して一度構築してみたほうがよい
EC-CUBE4で、コアのクラスを触らずに上書きする


EC-CUBEのコアのクラスの一部の挙動を変えたい、といったときの方法です。

Symfonyの`decorates`を使用することで、コアのソースコードを触らずにカスタマイズすることができます。

https://symfony.com/doc/3.4/service_container/service_decoration.html

## カスタマイズ方法

例えば、OrderPdfServiceのmakePdfの挙動を変えたい場合は、以下のようになります。

app/Customize/Resource/config/services.yamlを作成

```php:app/Customize/Resource/config/services.yaml
services:
  Customize\Service\OrderPdfService:
    public: false
    autowire: true
    decorates: Eccube\Service\OrderPdfService
```

app/Customize/Service/OrderPdfService.phpを作成

```php:app/Customize/Service/OrderPdfService.php
<?php

namespace Customize\Service;

class OrderPdfService extends \Eccube\Service\OrderPdfService
{
    public function makePdf(array $formData)
    {
        // ここで既存の処理を変更
        return parent::makePdf($formData);
    }
}
```

## 注意事項

既存の処理を変更することになるので、プラグイン等に影響がでる可能性があります。
使用する際は影響範囲を見極めて活用してください。