OmniAICreator/Qiita-1.07M huggingface dataset:
【JS】プロパティの値を破壊→非破壊処理にする方法。

個人メモです。

テーブルでボタンクリックに合わせtdタグ、thタグを切り替える処理でバグが発生。

プロパティの値の変更の破壊処理を非破壊に変更したらバグが直ったので忘備録として。

>破壊処理をデバッグで確認したが、処理は問題なく最終的なアウトプットがおかしい状況。（vue.jsの処理のせい？？）


##対処方法

変数をコピーする必要がある。

```js:オブジェクトの外側のデータをコピー
//修正前
this.innerValue = this.innerValue.map((tr, rowKey) => {


//修正後
this.innerValue = this.innerValue.map((tr, rowKey) => {
        const _tr = {...tr}
```

オブジェクトをスプレッド構文で展開してコピーする。

```js:オブジェクトの内側のデータをコピー
//修正前
cell['item_type'] = 'TYPE_TH'
return cell


//修正後
return {
    ...cell,
    item_type: 'TYPE_TD'
}
```

変数の値を直接変更していたものを、スプレッド構文に展開（別データとしてコピー）して作成。



<br>
##コード

```js:修正後
    changeRowTh(){
      this.innerValue = this.innerValue.map((tr, rowKey) => {
        const _tr = {...tr}
        if(rowKey === 0){
          _tr.article_items = _tr.article_items.map((cell, cellKey) => {
            return {
              ...cell,
              item_type: 'TYPE_TH',
            }
          })
        }else{
          _tr.article_items = _tr.article_items.map((cell, cellKey) => {
            return {
              ...cell,
              item_type: 'TYPE_TD'
            }
          })
        }
        return _tr
      })
    },
```

```js:修正前
    changeRowTh(){
      this.innerValue = this.innerValue.map((tr, rowKey) => {
        if(rowKey === 0){
          tr.article_items = tr.article_items.map((cell, cellKey) => {
            cell['item_type'] = 'TYPE_TH'
            return cell
          })
        }else{
          tr.article_items = tr.article_items.map((cell, cellKey) => {
            cell['item_type'] = 'TYPE_TH'
            return cell
          })
        }
        return tr
      })
    },
```


<br>
<br>
プロジェクトのデザインパターンが破壊処理を使わない方針の場合、非破壊処理にするよう注意が必要。
M1 Mac 初期設定

M1 Mac Book Airを購入した。
M1 Mac Book Proを買おうとおもってお店に行った。
店頭在庫はAirだけで、金額もAirの方がお値打ちそうだった。
Air を購入した。

電源を入れたら、言語、国の設定の次に、Wi-Fiの設定があり、他のPCからの以降の選択肢があった。

左の方に「しない」という選択肢があることに気がつかず、古いMac Book Proに電源を入れた。

同じWi-Fiに繋いでいるのに、なぜか現れなかった。

そこで左下を見たら、移行しない選択肢があることを知り、今ここ。

何を入れたらいいか分からずにこの記事を書き始めた。

アプリで動くもの、動かないものの一覧を探している。

Is Apple silicon ready ?
https://isapplesiliconready.com/

Here's an Apple Silicon M1 Mac Apps Compatibility List（iPhone in Canada Blog）
https://www.iphoneincanada.ca/mac/heres-an-apple-silicon-m1-mac-apps-compatibility-list/

~~今ここ。19:00~~

|App|Native|Rosetta|URL|
|--:|--:|--:|--:|
|Webex| - | v|https://www.webex.com/ja/downloads.html|
|mi||v|https://www.mimikaki.net/|

今ここ。~~19:15~~
【正規表現】はじめの数文字は英字、それ以降は数字で制限する

内容に不備があります😓
コメント欄を参考にしてください（ご指摘ありがとうございます。。）。

# たとえば

`A012345`

みたいな形式の文字列で制限したい。
今回は『**最初1文字は英大文字、それに続く数字は6文字**』というルールを作る。
たぶん他の言語でもいけると思いますが、PHPで書くことを想定します。

## 正規表現を書く

```php
/^[A-Z{1}]+[0-9{6}]+$/
```

『**英大文字（1文字）+数字（6文字）**』と指定しています。単純ですね。
こちらで検証できます。↓

**PHP: preg_match() / JavaScript: match() 正規表現チェッカー ver3.1**
<http://okumocchi.jp/php/re.php>
内定をもらってから採用日まで何をするとよいか。2021年版

内定をもらってから採用日まで何をするとよいか。
会社によっては、いろいろ推奨している事があるかもしれない。

費用を出してもらえてやってもよいことは、やるとよいかもしれない。
自己費用でやって欲しいといわれたことは、それなりに聞き流すとよいかもしれない。

自分磨きをするか、じっくり休養するかは本人の健康状態にもよる。

#海外

海外へ行くという選択肢は、渡航の困難性から、2021年は推奨できないのがつらい。
海外へ行ったつもりで、海外で経験しそうなことを、自宅で経験するのはよいかもしれない。

一日中英語しか使わない。
英語の文書、音声しか聞かない。
海外のサイトで検索したり、英語などで書き込んだり。

英語の文献を読み込むのもいいかもしれない。



仮説・検証(111) アメリカ留学、アメリカ就職の代わりに行ったこと。行なっていること。英語(33)
https://qiita.com/kaizen_nagoya/items/9f8e791bd6be3bed34bb
docker-composeでbuildkitに引数を渡すことは(まだ)出来ない


# docker-compose
docker-composeはupやdownでお手軽にコンテナを操作できるため、ローカルでコンテナを試す際に利用しています
buildkitと併用できないか調べました。備忘のために残します

# buildkit
dockerでのビルド内でgithubのprivateリポジトリにアクセスするケースがあり、
buildkitの機能でsecretを渡しています

```
DOCKER_BUILDKIT=1 docker build --secret id=token,src=.token .
```

# 結論
これをdocker-composeでも使いたかったので調べたのですが2021年１月時点では使えないようです

`COMPOSE_DOCKER_CLI_BUILD=1`を設定することで、buildkitを用いたbuildはできるようです
https://blog.pokutuna.com/entry/caching-docker-and-docker-compose

ただ、secretを渡すようなオプションはなさそうです
http://docs.docker.jp/v1.12/compose/compose-file.html

docker-composeのPRがopenされてないので、未対応のようです
https://github.com/docker/compose/pull/7046
EMLからPSTへの変換 フリーソフト

4n6EMLからPSTへのコンバーター
4n6 EML to PST Converterは、EMLファイルをMS OutlookPSTファイル形式やその他の一般的なファイルターゲットに正確に変換するのに最適なツールです。 4n6 EML to PST Converterは、EMLからOffice 365への移行、EMLからLive Exchange Serverへの移行、PDFへの変換、簡単にアクセスできるファイル形式のようなMSGなど、多くの機能を提供します。 このソフトウェアは、MS Windowsのすべてのバージョンをサポートし、MSOutlookのUnicodeファイルとANSIPSTファイルの両方を処理します。 ソフトウェアの無料試用版も入手できます。 ソフトウェアのいくつかのハイライトを以下に示します。

Download https://forensiksoft.com/converter/eml.html

![4n6-eml-converter.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1012251/b1fa6b88-0e65-dfc2-ebce-f444ebd4ee5e.png)


複数のEMLからPSTファイル形式への制限なしの即時変換。
EMLファイルをハードルなしでLiveExchangeServerとOffice365にすばやくエクスポートします。
結果として生じる特大のPSTファイルは、ユーザーの必要に応じて小さなPSTファイルに分割できます。
EMLをすべての添付ファイル付きのPSTおよびMSGファイル形式に変換できます。
EML / EMLXファイルはLiveExchangeパブリックフォルダーとアーカイブメールボックスにもエクスポートできます。
Outlook PSTファイルのすべてのエディション（ANSIおよびUnicode）へのEMLファイル変換。
このソフトウェアは、MSWindowsのすべてのエディションでの作業に最適です。
データ移行のための無料のコンサルタントサービスとソフトウェアに関する24時間年中無休のテクニカルヘルプ。
EMLデータをOutlookプロファイルストアにエクスポートする

EMLをPSTに変換する

EML to PST Converterソフトウェアには、EMLをすべての添付ファイルとメタデータとともにPSTファイル形式に変換するための高度に保護されたアルゴリズムが付属しています。 ソフトウェアは、複数のEMLファイルをPSTファイル形式に変換するための安全で迅速です。

サイズ制限なし

EMLおよびEMLXファイルからプロパティを失うことなく、このツールは、EMLサイズの制限なしに大きなEMLをPSTファイル形式にエクスポートすることができます。 このソフトウェアには、ユーザーがEMLメールボックスからPSTファイル形式にデータを転送できる拡張機能が付属しているため、EMLファイルに多くの時間と労力を費やすことなく簡単にアクセスできます。

EMLをOffice365にエクスポートする

EML Converterツールを使用すると、EMLメールボックスをOffice 365にエクスポートしてクラウドサービスを利用できます。これにより、いつでもどこからでもメールにアクセスできます。 このソフトウェアを使用すると、EMLをすべての添付ファイルとファイルデータとともにOffice365にすばやく移行できます。

変換のための複数のフォーマット

EMLファイル形式をMSGやPSTファイル形式などのさまざまなファイル形式にエクスポートして、電子メールデータの尊厳と整合性を失うことなく多くの電子メールクライアントで電子メールにアクセスできるようにします。このソフトウェアで可能です。

すべての人気のある電子メールクライアントで作成されたEMLファイルをサポートする

これは、EMLユーザーにとってもう1つの魅力的な機能です。 Outlook Express、Windows Liveメール、Windowsメール、Eudora、Thunderbird、およびEMLファイルが生成されたその他の電子メールクライアントがサポートされています。

EMLとその添付ファイルのプレビュー

EMLをさまざまなファイル形式で保存するために、ツールにはさまざまなファイル形式が含まれていますが、EMLファイルをそれぞれのファイル形式で保存する前に、ユーザーが品質を保証できるようにEMLファイルをプレビューするオプションが提供されます。

選択的エクスポート用のフィルター

必要に応じてデータをフィルタリングするために、ソフトウェアは「件名」、「開始」、「終了」などのカテゴリを提供します。 ユーザーは、カテゴリを選択してフィルターを適用することにより、データを簡単にフィルター処理できます。 このオプションは、特定のデータのエクスポートが必要な場合に非常に役立ちます。
javaの基礎の基礎②～if文とswitch文～

・if文
①if文を使うと「もしも・・・ならば」という文章をプログラムで表現することができます。
　「もしも降水確率が50%以上なら、傘を持っていく」をプログラムで書いてみましょう。
　(if文を説明するためのプログラムの断片です)

　if (p >= 50) {
  　　System.out.println("傘を持っていきます");
  } 

　これは「変数pの値を調べ、その値がもしも50以上なら、"傘を持って行きます"と画面に表示する」という動作をします。
　上のプログラムは次のような構造をしています。
　
　if (条件式) {
　　条件が成り立つときの処理
}

　条件式の値は、「条件を満たすときtrue(トゥルー)」、「満たさないときはfalse(フォルス)」になります。
　条件式の値は、必ずこのどちらかになります。
　()でくくられた条件式の後には｛｝でくくられた処理がやってきます。これは条件が満たされたときに行う処理の範囲を示します。
　if文は、()の中の条件が満たされるかどうかを調べ、もし満たされるなら｛｝の中を実行し、満たされなければ｛｝の中を実行しません。
②if…else文を使うと「もしも・・・ならば・・・さもなくば・・・」という文章をプログラムで表現できます。
　
　if (p >= 50) {
　　System.out.println("傘を持っていきます");
  } else {
　　System.out.println("傘を持っていきません");
}
　
　ここに登場する新しい言葉は「else(エルス)」です。まさに日本語の「さもなくば」に相当します。
　elseの後ろにはまた｛｝があります。ここには条件が成り立たなかった(満たされなかった)時に行う処理が書かれています。
　
　if (条件式) {
　　条件が成り立った(true)時の処理A
  } else {
　　条件が成り立たなかった(false)時の処理B
}

　条件が成立すると同時に成立しない、などということはありません。したがって処理Aと処理Bのどちらか一方は必ず行われます。
③演算子「&&」は「～かつ～」を表すもので、演算子「||」は「～または～」を表すものです。
　
　0 <= n && n < 50
　
　は、「nが0以上である、かつ、nが50より小さい」となります。
　「条件式1 && 条件式2」は、「条件式1と条件式2の両方が成り立つときのみ真」となる条件です。
　次に、
　
　n < 0 || 100 < n

　は、「nが0より小さい、または、nが100より大きい」となります。
　「条件式1 || 条件式2」は、「条件式1と条件式2の少なくともどちらか一方が成り立ったとき真」となる条件です。
③if文の連鎖(else if)
　if(条件式1) {
　　　　条件式1を満たすとき
} else if (条件式2) {
　　　　条件式1を満たさず、
　　　　条件式2を満たすとき　　
} else {
　　　　条件式1、2両方をみたさないとき
}
　ifとelseの間にelse ifを入れることによって三者択一になります。
　3つのうちどれか1つが必ず実行されるからです。
　人間にとって常識のことでも、コンピュータに常識を期待してはいけません。
　すべてきちんと明示的にプログラムを書かなくてはいけません。

・switch文
①多くの選択肢から1つを選んで実行するための構文を「switch(スイッチ)文」と言います。
　
　　switch (式)　{
　　case 定数式1:
　　　　　　処理1
　　　　　　break;
  
　　case 定数式2:
　　　　　　処理2
　　　　　　break;

　　default:
　　　　　　処理3
　　　　　　break;
}

　｛｝でくくられた範囲が選択をするための候補たちです。
　候補のはじめには、候補ごとに「case(ケース)」と書きます。caseの最後にはコロン(:)を書きます。
　最後の候補には「default(デフォールト)」と書きます。これは「いままで1つ1つあげた場合のどれでもなかったら」という意味です。
　switch文のdefaultはif文のelseに相当するといってもよいでしょう。
　1つのswitch文の中にcaseは何個書いてもかまわないが、defaultは1個しか書けません。
　caseとして明示的に書かれていない値ならば、default以下が実行されます。
②caseとcase(あるいはdefault)の間に書かれるのが、選択された場合の処理です。
　処理の最後には「break(ブレーク);」を書きます。これは「ここで処理を終わります」という意味です。
　複数のcaseをbreakなしで書いておくと、同じ処理が行われます。言い換えれば、必要なbreakは書き忘れてはいけません。
　さもないと、他のcaseのところまでどんどん処理が進んでしまいます。
③switch文を実行する時、まず()でくくられた式が計算されます。これを「式の評価」と言います。
　式を評価した結果(計算の結果)、定数式1の値に等しければ処理1が実行され、もし定数式2の値に等しければ処理2が実行されます。
　定数式1と定数式2の両方の値と等しくなければ、defaultに対応した処理3が実行されます。
　switch文は、式の値によって処理を選ぶ構文です。ですから、1つのswitch文の中では、２か所以上のcaseに同じ定数式を書いてはいけません。
　同じ定数式が２つ以上あったら、どの処理を実行してよいかわからなくなってしまうからです。
【typescript】classのconstructorを省略していけない！！

あるエンジニアがjavascriptを使用して開発を行っていたが、開発速度をあげるためにtypescriptを導入した。
型を定義することで変数の中身が明確になったりと、開発速度があがった。
しかし、型の定義を行っているはずが、型のバグに悩まされていた。

結論からいうと、<font color="Red">**tsconfigは厳しめに設定すべきだった**</font>

型を定義しても、それにそっていない内容のものがあり、想定外のところでバグを起こしてしまっていた。
以下のような例があげられる。

---

と、その前にクラスについて

### クラスのインスタンス
インスタンス化、つまり、newしたものがインスタンス
newしていないものはインスタンスでない。インスタンスでないと、クラスメソッドなどを使用できない。

以下はただの `object` を型アサーションで `User` にしたもの。
インスタンスではないので、クラスメソッドの `getFullName` を使用できない。（TypeErrorになる。）

```typescript
class User {
  public id: string;
  public firstName: string;
  public lastName: string;

  constructor (input?: Partial<User>) {
    this.id = input?.id ?? "id"
    this.firstName = input?.firstName ?? "firstName"
    this.lastName = input?.lastName ?? "lastName"
  }

  getFullName(): string {
    return `${this.firstName} ${this.lastName}`
  }
}

const _user = {
  id: "id",
  firstName: "firstName",
  lastName: "lastName"
}

{
  const user = _user as User;

  console.log(_user instanceof User) // false
  console.log(user instanceof User) // false

  console.log(user.getFullName()) // TypeError: user.getFullName is not a function
}

{
  const user = new User(_user);

  console.log(user instanceof User) // true

  console.log(user.getFullName()) // firstName lastName
}
```

---

### constructorを省略
constructorを省略することで以下のような型と違う状況が起きる可能性がある。

```typescript
class User {
  id: string;
  name: string;
}

const _user = new User();
_user.id = "id";
console.log(_user.name) // undefined

const user = new User();
user.id = "id";
user.name = "name";
console.log(user.name) // name
```

ただの型なのか、classを用意すべきかは考えたほうがいい。
もし型だけなら以下のようにする。

```typescript
type User = {
  id: string;
  name: string;
}

const _user: User = {
  id: "id"
};
// Property 'name' is missing in type '{ id: string; }' but required in type 'User'.
// 'name' is declared here.

const user: User = {
  id: "id",
  name: "name"
};

console.log(user) // { id: 'string', name: 'string' }
```

クラスを用意するならconstructorを定義する

```typescript
class User {
  id: string;
  name: string;

  constructor (input?: Partial<User>) {
    this.id = input?.id ?? "id"
    this.name = input?.name ?? "name"
  }
}

const user = new User()
console.log(user.name) // name
```

### delete（オブジェクトからプロパティを削除）

deleteにも要注意。型アサーションと同様のことが起きる。

```typescript
class User {
  id: string;
  name: string;

  constructor (input?: Partial<User>) {
    this.id = input?.id ?? "id"
    this.name = input?.name ?? "name"
  }
}

const user = new User()
delete user.name
console.log(user.name) // undefined
```

---

他にもany型など開発者を泣かせるtypescriptの仕様がある。

以下のような記事にもあるとおり、 `as` や `any` はtypescriptの効果をなくしてしまう。

[敗北者のTypeScript](https://qiita.com/uhyo/items/aae57ba0734e36ee846a)


---

#### Docs
typescript: https://www.typescriptlang.org/

---

やるからには厳しくせなあかんな
（やるからには厳しくしないといけないな）
【Ruby on Rails】Rails tutorial 14章　ステータスフィードの実装方法まとめ

#はじめに
Rails tutorialに出てくる`ステータスフィード`の実装が少しややこしかったので自分なりにまとめておきます。

#ステータスフィード
ステータスフィードとは、ツイッターなどでいうTL（tweet list）のことです。
フォローしているユーザーの投稿を表示することが可能です。

#実装方法
`feed`メソッドを作成します。

```ruby:user.rb
#ステータスのフィードを返す。
def feed
end
```

はじめに結論から描きます。`feed`メソッドには以下のように記載します。

```ruby:user.rb
#ステータスのフィードを返す。
  def feed
    following_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id"
    Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
  end
```

これだけ見てもワケワカリマセン。詳しく詳細を見ていきます。
まずは以下に着目します。

```ruby:user.rb
    following_ids = "SELECT followed_id FROM relationships WHERE follower_id = :user_id"
```
上記のコードは、SQL文で表されていて`SELECT`コマンドが使われています。

|SQLコマンド|意味|
|:-:|:-:|
|SELECT|テーブルのデータを検索します。|

|SELECTコマンドのパラメータ|意味|
|:-:|:-:|
|FROM|対象となるソーステーブルを指定します。|
|WHERE|取得したい値の条件を設定する|

つまり、ここで何を意味しているかというと、、、
`relationships`テーブルの`followed_id`カラムが`user_id`と一致しているユーザーを取得すると言う意味になります。`following_ids`変数**フォローしているユーザー情報**を取得することができます。

次に以下コードに着目します。

```ruby:user.rb
Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
```

これはrailsの`where`メソッドを使っています。
`where`メソッドでも使い方が少しややこしかったので整理していきます。

まずは`IN`と`OR`を見ていきます。
`IN`は**複数の条件**を定義するために使います。
以下に例を記載します。

```ruby
#単体指定
#ageカラムが「２０」のユーザーを取得します。
user = User.where("age = 20")

#複数指定
#ageカラムが「２０と３０」のユーザーを取得します。
user = User.where("age IN (20, 30)")
```
上のコードに戻ってみ考えてみると、、、
`user_id`の値が、先ほど定義した`following_ids`（フォローしているユーザー一覧）のidの値の投稿を取得するということになります。

```ruby:user.rb
Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
```
次に`OR`に着目していきます。
`OR`は**どちらかの条件に一致するデータを取得するという意味**です。
以下に例を記載します。

```ruby
#nameカラムが「太郎」でageカラムが「20」のユーザーを取得します。
user = User.where("name = '太郎' and age = 20")
```
こちらも上のコードに戻って考えてみると、、、
`user_id`の値が`following_ids`（フォローしているユーザー一覧）のidもしくは"id"(自分のid)であればその値を返すということになります。

```ruby:user.rb
Micropost.where("user_id IN (#{following_ids}) OR user_id = :user_id", user_id: id)
```

ちなみに`user_id = :user_id", user_id: id`の部分については、`:`で指定されている値が`,`後に指定されている値に代入されるというような挙動になっています。

```ruby:
#ageカラムが「２０」のユーザーを取得します。
user = User.where("age = :xxx", xxx: 20)

#ageカラムが「２０」のユーザーを取得します。
user = User.where("age = 20")
```

feedメソッドの理解はできました。
feedメソッドを以下のように使うと、ログインしているユーザーがフォローしているユーザーの投稿を取得することができます。

```ruby
current_user.feed
```

#参考文献
Rails tutorial 第１４章 ユーザーをフォローする
https://.jp/chapters/following_users?version=6.0#sec-the_status_feed

Pikawaka 【Rails】whereメソッドを使って欲しいデータの取得をしよう！
https://pikawaka.com/rails/where
AWS概要　ストレージについて

#概要
もはや何番煎じているか分かりません。
1月から個人的に始めている未経験AWSチャレンジの一環として、CP試験に向けての個人的なメモとして記述します。

※は書き方を模索中ですが、問題を通して思った感想になります

#ストレージサービス（★★★：めっさ問題に出る）
データの特性やシステムの要件に応じてストレージを選択していこう

※ということは特性からストレージの選択問題や、その逆も然りと幅広く問題で扱われる

##Amazon　Simple　Strage　Service（Amazon　S3）
高耐久（保存しているデータが失われる確率）・大容量のオブジェクトストレージサービス
 
※”オブジェクト”を”バケット”で保存という単語だけで選択肢を判断できる場合もあるので、覚えておくことに越したことはない。

##Amazon　Glacier（Glacier≒氷河：いかつい名前）
アーカイブを目的としているデータベース

※もうアーカイブという文言があったら、ほぼ1択に絞り込る。迅速・標準・大容量とオプションがあるが、今のところの問題では出会っていない。こちらもS3同様にオブジェクトストレージなので、複数選択問題でS3と一緒にチェックさせる問題はあった。

S3   　  :オブジェクト
Glacier:オブジェクト

##Amazon　Elastic　Block　Store（EBS）
EC2を使用する際に、AZ内で自動的に複製される保存領域
EC2の中に領域がつくられるのではなく、EBSという領域がEC2とネットワークで繋がっているためEBSを増やす（容量を増やす、数を増やす）ことが出来る（ただし1つのEC2に、1つのEBSな）。

※EBSはAZに複製されるので、AZに障害があるとデータが消える可能性はある。だから”スナップショット”を利用してバックアップをとるということを問うてくる問題は多い。

※それと名前にもある　Block（ブロックアクセスという方法でデータにアクセスする）のも覚えておくと、意外と選択肢を絞ることに役立つ。

S3 ：オブジェクト
EBS：ブロック
EFS：ファイル

##インスタンスストア（エフェメラルディスク：こちらの名前では見かけない）
EC2と物理的につながっているストレージサービスとして理解しています。
そのためEC2が消えたら、一緒に消えるのでデータももちろん消失します

※上記のEBSと対比させる問題でお腹がいっぱいになる。細かい違いは各自に調べてもらうとしても、試験問題としては、消えるor消えないかくらいの違いしかない（先人達から避難の的になりそう）

EBS　　　　　　　：データ消えない
インスタンスストア：データ消える

##Amazon　Elastic　File　System（EFS）
スケーラブルな共有ストレージサービス

※EC2と”複数”接続ができる保存領域として覚えておく。自動で複数のAZに保存されるので

EBS：単数
EFS：複数

#おしまい
CP試験ということもあると思うので、なによりサービスの差分がわかっていることが重要かなと思っています。
レベルが上がれば内容の細かさが問われてくるのでしょうが、現状では問題集を通して獲得した差分を記述させていただきました。

理解が甘い、その理解が間違ってるあれば、お手数ですがご鞭撻お願いします。
そのご鞭撻により、よりよい学習へ繋げられればなと思っています。
テストに関するQ&A～RSGT2021のOSTメモ～

本記事は、RSGT2021のOSTにてディスカッションした内容のまとめになります。
# 忍者式テストはどう定着していった？

http://www.jasst.jp/archives/jasst04/pdf/A7ah.pdf

# テストに対する意識や興味を会社で高めるために最初にすると良さそうなことは？

お客さんから報告があった(お客さんの業務に影響があった)不具合の分析からスタートすると良い。

# テストを端折りたくなった時、どうする？

テストをやりたくない時ほどやった方がいい。
テストをしたくない場所はテスタビリティが低い可能性が高い。

https://blogs.itmedia.co.jp/hiranabe/2005/08/post_e66c.html

# 新卒一年目はテスト関連のことについてどう勉強していくと良い？

## 書籍

https://swquality.jp/?p=1180
に記載のある書籍がおすすめ。

## コミュニティ・イベント

- http://jasst.jp/

- https://wacate.jp/
- https://ost-zatu.connpass.com/
- https://autotest-lab.connpass.com/

# 探索的テストのチャーターってどんなものが使われるの？

Explore It！(https://www.amazon.co.jp/Explore-Increase-Confidence-Exploratory-Testing/dp/1937785025)
の例が参考になる。
チャーターは正解がないが、 テストの実行者がテスト実施（手順）をイメージできる粒度にしておくと良い。

# もし世界からテスト外注会社が消えたら？

完全に任せきりにしているところから、部分的に（上流から）抑えるようにしていくという手もある

# 外部会社のQAチームと距離を感じてる。距離の近いやりとりをうまくやっているチームがあるのだろうか？

やり方次第で距離を縮められるはず。
ブロッコリーさん(https://twitter.com/nihonbuson)
の会社も外部会社と協働している。

# 非エンジニアがテストスキルを習得するには？

https://note.com/mishizuka/n/n5bb083dc8716

# 受入テストの自動化をしたいが自動化のコストが高い。ノウハウはあるか？

受け入れテストの自動化（おそらくE2E自動テスト）で目指したい部分を絞った方が良い。ポイントはいくつかある。

1. 自動化をできる体制になるまでの初期コストがある程度存在することを理解する
   概念としては、以下スライドを参考。
   https://speakerdeck.com/yoshikiito/tesutozi-dong-hua-toosao-chu-robotuto

2. 本当にE2Eで確認したい部分なのか考える
   E2Eよりも下の段階（APIレベルやUnitレベル）で確認できないのか考えた方が良い。
   本当にE2Eで見たい部分を考えることについては下記の記事を参照。
   https://nihonbuson.hatenadiary.jp/entry/2018/10/29/210000

3. 特に不具合が発生したらまずいところから自動化を検討する
   どこから自動化を検討するかについては下記資料を参考。
   http://www.jasst.jp/symposium/jasst16tokyo/pdf/D4.pdf

4. E2Eテストの自動化では、手動のテストとは別の気にする部分が複数存在することを理解する
   テスト自動化研究会が書いた「テスト自動化の8原則」を参考にすると良い。
   https://sites.google.com/site/testautomationresearch/test_automation_principle
Microsoft Azure のアラート設定について

## 概要

- Azure Monitor の監視データを使用して問題が見つかった時に、アラートによって事前通知される。

- アラートルールを設定することで、アラートのターゲットと条件が取得される。

- アラートを表示しルールを管理するには、各リソースのメニュー[アラート]を使用する。

- 以下の３点のように、メトリックとログについてアラートできる。

  - アクティビティログアラート

  - メトリックアラート

  - ログクエリアラート

- 個々の Azure リソースを管理できるのは、アクティビティログアラートと、メトリックアラートのみ。

- ログクエリアラートは、Log Analytics ワークスペースがターゲットとして使用される。

  - すべてのリソースのアラートの表示・管理・ルールを管理するには、Azure Monitor のメニューを使用する。

## Azure Monitor を使用して、アクティビティログアラートを作成、表示、管理する

以下のサイトを参考。

> [Azure Monitor を使用してアクティビティ ログ アラートを作成、表示、管理する](https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/alerts-activity-log)

## Azure Monitor を使用して、ログクエリアラートを作成、表示、管理する

以下のサイトを参考。

> [Azure Monitor を使用してメトリック アラートを作成、表示、管理する](https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/alerts-metric)

## Azure Monitor を使用して、メトリックアラートを作成、表示、管理する

以下のサイトを参考。

> [Azure Monitor を使用してログ アラートを作成、表示、管理する](https://docs.microsoft.com/ja-jp/azure/azure-monitor/platform/alerts-log)

## 以下のサイトでも詳細な設定方法が記述されている

- [Azure Functions の異常を検知する](https://www.magata.net/memo/index.php?Azure%20Functions%20%A4%CE%B0%DB%BE%EF%A4%F2%B8%A1%C3%CE%A4%B9%A4%EB)

- [Azure Monitor で App Service のモニタリングアラートを飛ばす](https://papemk2.hateblo.jp/entry/2018/12/12/203928)

- [Azure Monitor の Alert アクションで mattermost 通知をする](https://qiita.com/kita-atsushi/items/bc15824056586ccef05f)

## 参考資料

> [Azure Monitor のアラートについて](https://docs.microsoft.com/ja-jp/azure/azure-monitor/insights/monitor-azure-resource#alerts)
rails newをしたらPG::ConnectionBad: could not connect to server: No such file or directoryとエラーが出た

ご覧いただきありがとうございます。
この記事は[こちら](https://hnnsk.hatenablog.com/entry/2021/06/26/112924)へ移動致しました。
お手数おかけしますが、よろしくお願いいたします。
他人に対して「XXXして欲しい」と思ったら～RSGT2021のOSTメモ～

本記事は、RSGT2021のOSTにてディスカッションした内容のまとめになります。

___
他人に対して「XXXして欲しい」と思った場合は、相手の価値観や考えを受け入れた上で、相手の考えと自分の考えを理解する所から始めるという話でした。
相手の考えや価値観を探る具体的な方法としては、以下のような方法が挙げられていました。

- 「XXXして欲しい」と思った相手の行動について、行動背景を尋ねる
  - 1on1(信頼関係の構築ができるので、本音を聞き出しやすい)
  - スクラムイベントの終わりに席に戻るまでの間で雑談
- (上司など)伝えにくい人に対しては、「さっきの行動良かったです！相談させてください！」と、頼る感じで話を聞いて本音を聞き出す。

また、そもそも相手のことを変えたいと思う気持ちがエゴだと思うという話も出ていました。
変えようとするのではなく、自身と相手の価値観や考えを理解するために対話する姿勢が重要だという話があり、自分自身も納得しました。
原点からの距離を求める

##コード
入力された点の、原点からの距離を求める。

```genten.cpp
#include<iostream>
#include<string>
#include<cmath>

//点の座標を格納するための構造体
struct Point{
        std::string name;
        double x,y;
};

//構造体に、点の名前、点の座標を入力する関数
void input(Point *p){
        if(p!=nullptr){
            std::cin>> p->name >> p->x >> p->y;
        }
}

//原点からその点までの距離を返す関数
double dist(Point &p){

        double x1=std::pow((p.x),2.0);
        double y1=std::pow((p.y),2.0);

        double distance=sqrt(x1+y1);

        return distance;
}

int main(){
        Point a;

        std::cout<<"座標を入力してください。";
        input(&a);
        double d=dist(a);

        std::cout<< "Distance : "<< d << "\n";

        return 0;
} 
```

##解説
まず、座標を格納するための構造体・Pointを定義します。

次にその構造体に座標を入力し格納する、input関数を定義します。
ここで、ポインタの理解を深めるために、ポインタを使った値渡しを使用してみました。

```genten_input.cpp
void input(Point *p){
        if(p!=nullptr){
            std::cin>> p->name >> p->x >> p->y;
        }
}
```

input関数はvoid型です。
main関数内で、`input(&a)`とすることで、Point型変数・aへのポインタを渡します。

このときポインタ pは、変数aを指します。
よって、ここで名前や値を入力していくと、各要素は変数aに代入されていきます。

次は、原点からの距離を求める、dist関数です。

```genten_dist.cpp
double dist(Point &p){

        double x1=std::pow((p.x),2.0);
        double y1=std::pow((p.y),2.0);

        double distance=sqrt(x1+y1);

        return distance;
}
```

原点からある点までの距離は、ある点を (a,b)　とすると、

```math
\sqrt{a^2+b^2}
```

で求めることができます。
これを利用して計算していきます。




##以上です。

今回、始めて投稿をさせていただきました。
何か間違いがありましたら教えていただけると助かります。
【 JavaScript 】Async/awaitとpromiseの非同期処理で詰まった話

初投稿です。忘備録としてQiitaに投稿します。

VueとLIFFでLINEからuser_idを取得し、user_idをHTTPパラメータとしてaxiosでHTTPS通信を行おうとしたのですが、詰まったので記録として残しておきます。
##起きた問題
user_idをパラメータとして入力しているはずなのに、パラメータ部がundefinedとなっていて通信できない。

##promiseでの非同期処理コード
```
created(){
  liff.init({ liffId: this.myLiffId }).then(() => {
    ・・・
   }

  liff.getProfile().then((response) => {
    ・・・
  }
}
```
（汚いコードですいません）
クソ雑魚プログラマの自分にはなぜうまく行かないか分からなかったのですが、先輩に聞いたところthenでPromiseチェーンを作った場合、
同期的処理になるのはPromiseチェーンの中だけで、外部は非同期的に処理されるらしいです。
(ここもあまり理解できていないので間違っていた場合はご指摘ください)

そのため、vueのtemplete内の処理は非同期的に処理されるため、user_idがまだ取得されていない状態でtemplete処理が起こるようです。


##解決法
Promiseチェーンではなく、async/awaitではuser_idが取得されてからtemplete処理が行われるようになるため、async/awaitで非同期処理を行います。

##async/awaitでの非同期処理コード
```
async created() {
  await liff.init({ liffId: this.myLiffId });
    ・・・
  await liff.getProfile().then((response) => {
    ・・・
    });
```

user_idが取得されてからHTTPSリクエストが行われるようになりました。
Vueは専門ではないのに解決策を提示していただいた先輩には頭が上がりません。


##参考にさせていただいた記事
- [async/await、promise・・これが最後の「JavaScriptの非同期処理完全に理解した」](https://qiita.com/_takeshi_24/items/1403727efb3fd86f0bcd)
- [【 Vue.js 】Async/awaitとaxiosによる非同期処理
](https://qiita.com/kbind/items/ea9d3dd7449f1b6f0fb0)
Vue.js + Rails で電子年賀状アプリを作った話

2021/1/11　デモ部分の追記、その他の修正
##背景
自分は季節の行事や習慣が好きでそれを自分の得意なことで表現したいということから年賀状のWebサイトを作ろうと考えました。
加えて、自分が作ったもので遊んで楽しんでもらいたいという思いで年賀状を作れるWebアプリという案が生まれました。ユーザーが遊ぶ姿を想像しながら作ることで、TwitterAPIを使ったり、ログインにはTwitterアカウントを用いたり、ログインせずに遊べたりとアイデアが生まれました。

PCユーザーをメインで作成しました。
しかし、大半の人がスマホで遊んでくれたことでスマホのバグがたくさん見つかりました。。
年末はバグと戦いましたが、今ではスマホでも難なく遊べるはずです。。

## 使用技術
* Vue.js・・・フロントエンド
* Rails・・・バックエンド
* FirebaseAuth・・・ログイン認証
* TwitterAPI・・・年賀状の公開範囲の設定


↓↓↓デプロイも済ませておりますので、ぜひ遊んでみて下さい↓↓↓
https://newyearmaker.netlify.app/card/new

##開発環境
* macOS 10.15.7
* Ruby 2.7.2
* Rails 6.0.3
* vue/cli 4.5.6

#軽くデモ
###1. まずは年賀状作成ページから
![私のビデオ2 (1).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999622/08b8bae4-3b2d-256c-161a-70e2ba4e8749.gif)

* 年賀状に乗せるユーザー名の記入 (未ログイン時のみ)←ログイン時はログインしているTwitterのアカウント名になります。
* 年賀状の動く背景を選択 (共通)
* 年賀状に乗せるメッセージの入力 (共通)
* 年賀状の公開範囲の設定 (ログイン時のみ)
* 年賀状のプレビュー (共通)

###2. 次に年賀状ページ
![私のビデオ6.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999622/ba44febc-f6e6-d346-e449-20755831196b.gif)

* anime.jsによるアニメーション
* 限定公開の場合ページを読み込む際に見ているユーザー情報から公開制限を行っています
* ～様の部分はログイン時はアカウント名、非ログイン時は「あなた」に設定されます
* 下部の名前は年賀状作成者の名前が設定されます。
* 左下のボタンから年賀状の受け取り (ログイン時のみ)
* 右下のボタンから年賀状作成ページへ (共通)

###3. 最後にユーザーページ (ログイン時のみ)
![私のビデオ2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/999622/1abf6f21-5a85-2505-d7ec-3904f84b9b07.gif)

* 年賀状ページから受け取った年賀状一覧を表示、クリックすることで年賀状を確認することが可能です。
* 自分が作った年賀状の編集ページへ遷移(編集ページは作成ページとほとんど変わらないので紹介を省略)

##工夫したところ
自分の周りにはTwitterを使っている人が多かったのでフォロワー限定公開などの機能を実装しました。firebaseを用いてTwitterでのログインを可能にしており、実装がとても簡単でした。

誰でも気軽に使ってもらいたかったので、ログインしなくても遊べるようにしました。
ログインすると年賀状を受け取れたり編集できたり、公開範囲を設定できるのでぜひ、ログインして遊んでみて下さい！！

ユーザーページは12/31にひらめいて必死に作ってたらガキ使が終わってました。。。(笑)

#感想
Railsはチュートリアル程度の知識しかなかったのですが、とても参考になる記事が多く実装が思ったより早くできました。
Vueは半年とちょっとしか触っていませんが、オフラインのハッカソンに二回ほど参加させていただき、そこで多くのものを学ぶことができ、効率的に学習できたと思います。ハッカソンを開いていただいた方々、教えて下さったメンターの方々、そこで出会った先輩に感謝しかありません。


#最後に
自分が作った年賀状よかったら見てみて下さい。↓↓↓
https://newyearmaker.netlify.app/card/b5d4cc19/show
(バックエンドをherokuでデプロイしてるからちょっと読み込みに時間がかかってしまうかも。。)

以上、ここまで読んでいただきありがとうございます。
年賀状の背景動画を作ってくれたYさんありがとう！！
Node.jsを勉強する⑥ - コマンドライン引数の受け取り

##はじめに
前回は[JSONファイルの書き込みと読み込み](https://qiita.com/arata0520/items/7daf0b37bfd6c95c8b16)についてまとめました。
今回は、コマンドライン入力した引数をjsファイル上で受け取って使う方法を記事にします。
##教材
Udemy
The Complete Node.js Developer Course (3rd Edition)
https://www.udemy.com/course/the-complete-nodejs-developer-course-2/

##引数配列の受け取り

まずは、app.jsという名前のファイルを作成します。コマンドラインから引数を受け取るには"process"を使います。
processだけでも作動しますが、入力した以外の膨大なデータを受け取っているので、"argv"を用いて、引数だけに、表示範囲を狭めます。
argvはargument vector（引数の配列）を意味します。今回はconsoleに出力します。

```javascript:app.js
console.log(process.argv)
```
ターミナルでファイルを実行します。今回は"hello"と引数を入力しました。

``` terminal:ターミナル
node app.js hello
```
実行結果は以下の通りです。

``` terminal:ターミナル
[
  'C:\\Program Files\\nodejs\\node.exe',
  'C:\\Users\\admin\\Desktop\\node development\\test-app\\app.js',
  'hello'
]
```
１つ目の要素は、使っているパソコンの中で実行可能なNode.jsへのパス
2つ目の要素は、実行したjsファイルまでのパス
3つ目の要素が、入力した引数になります。

1つ目と2つ目は引数の値にかかわらず、同じものが表示されます。

配列の要素番号を指定することで、入力した引数のみを取り出すこともできます。引数の値は、３つ目の要素になるので、要素番号は２になります。

```javascript:app.js
console.log(process.argv[2])
```

ファイルを実行すると、引数の"hello"のみが表示されます

``` terminal:ターミナル
node app.js hello

hello
```
スクラムマスターはファシリテーションをどう学ぶべきか？～RSGT2021のOSTメモ～

本記事は、RSGT2021のOSTにてディスカッションした内容のまとめになります。

- Scrum研修の講師を真似る
- ファシリテーション研修を受ける
- 自分がやる/やってもらうを繰り返してフィードバックを交換する
- 師匠から学ぶ
  - 本テーマをOSTで出したgaoryuさんを師匠としている人が多かったです(https://twitter.com/DiscoveryCoach)
- 本だと、**Paricipatory Dicsision making**と**The skilled facilitator**がお勧め
  - https://www.amazon.co.jp/Skilled-Facilitator-Comprehensive-Consultants-Facilitators/dp/0787947237
  - https://www.amazon.co.jp/Facilitators-Guide-Participatory-Decision-Making-Kaner/dp/0865713472
- ファシリテーションで必要な価値原則とプラクティスを行き来する
- 何を見ていたのか？それは何のため？どんなこと意識していた？という問いかけを通して、ファシリテーションスキルを高める
  - 例:) OSTのファシリテーション
    - 何を見ていた？ => 声を見ていた
    - それは何のため？ => オンラインで開催しているため情報が声しかないから。
    - どんなこと意識していた？ => 声のトーンを意識していた。上手く言語化できていないと本人が感じているかどうかを判断することに意識を置いていた
- HOWは参加者のコンテキストに依存するので、画一的なものはない。
- アジャイル開発系のコミュニティのOSTでファシリテーションスキルを磨く
[php] __constructについて

#今回の記事
phpを学んでいる中で、躓いた__constructについて初心者なりに解説していきたいと思います。
#__constructとは？
クラスから新しく**インスタンス**を生成する時に最初に実行される関数が__constructです。これを使用することにより、インスタンスを生成する際の初期化に用いることができます。
#インスタンス
上記で出てきたインスタンスとは、生成したクラスから値を作成するときに作るものです。クラスで定義したプロパティ（変数）を受け継いでいるものとして考えていただければ大丈夫です。

#使い方
まずは比べた方がわかりやすいと思うので__constructを使わない場合を見てみたいと思います。

* 書いたコード

```
<?php

class Post
{
  public $text;
  public $likes;
  
  public function show()
  {
    printf('%s (%d)' . PHP_EOL, $this->text, $this->likes);
  }
}

$posts = [];
$posts[0] = new Post;
$posts[0]->text = "hello";
$posts[0]->likes = 0;

$posts[1] = new Post;
$posts[1]->text = "hello again";
$posts[1]->likes = 0;

$posts[0]->show();
$posts[1]->show();
```

* 実行結果

```
hello (0)
hello again (0)
~ $
```
次に同じ内容で__constructを使った場合を見ていきます。

* 書いたコード

```
<?php

class Post
{
  public $text;
  public $likes;
  
  public function __construct($text, $likes) //本題のコンストラクトの部分
  {
    $this->text = $text; 
//ここで記入している$textや$likesはプロパティとは異なる変数ということに注意！
    $this->likes = $likes;
  }

  public function show()
  {
    printf('%s (%d)' . PHP_EOL, $this->text, $this->likes);
  }
}

$posts = [];
$posts[0] = new Post('hello', 0); //上記とは異なり、インスタンスの引数に設定

$posts[1] = new Post('hello again', 0);

$posts[0]->show();
$posts[1]->show();
```

* 実行結果

```
hello (0)
hello again (0)
~ $
```

`__construct`はインスタンス生成時に実行される関数なので引数として渡します。
そして使い方として`public function __construct(変数)`と記入して使います。**また、 construct内で使っている＄textや＄likesはクラスのプロパティではないということに注意してください。**インスタンスの引数で渡した値が`__construct`の＄textや＄likesに入り、プロパティに格納される仕組みになっています。
#まとめ
`__construct`を定義することにより、newを使い呼び出すたびに初期化処理を確実に行っていくれるので記入漏れや呼び出いてから毎回定義しなくて済むのでとても便利です。クラスを使う時は必ず使うので使えるようになっておいて間違いはないです。
ImageMagickで指定方向のみtrimする方法 

ImageMagickで-trimとすると、四方全てで空白部分を除去してしまいます。

これを指定方向のみ行うことは以前は（現実的な方法では）できませんでしたが、現在の最新版では「入力画像.jpg -define trim:edges=south,east -trim 出力画像.jpg」のようにすることで、方角の英語方向に対してのみ（複数指定可）でtrimを行えます。

なので、下側の空白部分のみ除去する、ということを簡単に行うことができます。
ちなみに、下側のみであれば magick.exe 入力画像.jpg -define trim:edges=south 出力画像.jpg のように「south」のみ指定します。

（また、除去する基準は、指定した端に存在するピクセルと同じ色、という仕様が基本です。透明色を指定するなどで、端が罫線のケースで罫線が除去されない、という方法もあるようです。）
PaperileとMouse Dictionary

# やりたいこと
Paperpileで管理しているpdfファイルで，Mouse Dictionaryを使いたい．

# 結論
Google Drive内のアプリ**DocHubだとMouse Dictionaryが使える**ので，それを用います．

1. Paperpileの設定 -> Browser Integration -> PDF Viewer -> Google Drive
2. 論文のpdfを開く．
3. 「Google Chromeで開く」の横のドロップダウンメニューでDocHubを選択
4. Googleの認証関連の諸々をOK
5. Chromeの拡張機能からMouse Dictionaryを使う

# その他の設定・操作

ただ初期設定のままだと，DocHubを開くのに手間がかかるので，
「Google Driveでファイルを開く時，いつもDocHubで開くようにする」設定を紹介します．

また，「いつもはpaperpile独自のpdf viewerで開くようにして，Mouse Dictionaryが必要な時だけ使いたい」方のための操作も紹介します．

## Google Driveでファイルを開く時，いつもDocHubで開くようにする

Google Driveの設定を以下のように変更します．
**Google Driveの設定 -> アプリの管理 -> DocHub の「デフォルトで使用」にチェック**


## いつもはpaperpile独自のpdf viewerで開くようにして，Mouse Dictionaryが必要な時だけ使いたい

いつもは通常通りView PDFによって論文を開き，  
Mouse Dictionaryが必要な時に

1. 論文のpdfを開く
2. PDF viewerの設定
3. Open in Google Drive
4. 「Google Chromeで開く」の横のドロップダウンメニューでDocHubを選択
5. Googleの認証関連の諸々をOK
6. Chromeの拡張機能からMouse Dictionaryを使う

を行えば，Mouse Dictionaryを使うことができます．

## 別の選択肢
なぜかDocHubだとうまく文字を認識してくれない時があるので，DocHubはやめて，

1. Google Driveのpdf viewerでMouse Dictionaryを起動
2. 日本語訳を知りたい英単語を選択and右クリックコピー

すると，日本語訳してくれます．
多少手間ですがこの方法の方が確実なので，最近はこの方法使ってます．

もしその論文が長い場合は，一旦ダウンロードして，  
Mouse Dictionaryのpdf viewerで開くのがいいと思います．

※Mouse Dictionary作者のTetsuさんは頻繁に改善されているようなので，別の改善策がある可能性があります．
もし別の解決策があれば，コメントで教えていただけると嬉しいです．
Regional Scrum Gathering Tokyo 2021 Day 3 「OST -スクラムメンバーの成長をどう捉えているか聞きたい・語りたい-」

この記事はRegional Scrum Gathering Tokyo Day3で実施されたOSTの内容についてのメモです。

Open SpaceTechnology(OST)については[こちら](https://www.humanvalue.co.jp/keywords/ost/)のサイトなどを参照ください。

いわゆる資料を作っての発表とは異なり、その場での議論が広がる一時的な情報ですが、
勉強になる内容も多いので、この記事では話に上がった内容をメモしています。 

# チームの成長とは
- チームが勝手に良くなる方向にいっている
- チームの問題を自分ごととして捉えて解決に向かっているとき
	- やり始めは、タスクの担当者ごとになりがち
	- 役割を超えてお互い助け合うのが大切
- みんな楽しそうに仕事している状態
	- 目が変わってくる。
	- 成長が結果として出て、成果もついてくる状態になる
- コミュニケーションをきちんと取るようになってきた
	- 「他のメンバーもこう思っているだろう」という思い込みが減る
	- コミュニケーションしてお互いの思いを共有するようになる

# 成長を促すためにやっていることは？
- 権限移譲やチャレンジしていい環境の用意
- 早めにユーザからのフィードバックが得られるようにする
	- 長い間リリースがなくて、うまくいっているかわからない状態だと不安になる。
	- 貢献しようという気持ちになり楽しくなってくる
	- ユーザからの反応もそうだし、チーム内でもプラスの感情のキャッチボールがあるとモチベーションに繋がる。
- 失敗OKであることを伝えてから仕事を始めてもらう
	- やってみないとわからないこともある
	- 失敗してもチームに学びを還元できればそれはプラスになる
- 事業がやりたいこととつながっているかを個々人と会話してみる

- 失敗してもいいよ。って伝えても、やはり失敗に対して拒否反応があったりする。
	- 実際に失敗させて、失敗体験を通すと失敗OKな雰囲気ができてきたことがある
	- "失敗"という語感が強いので違う表現をすることがある。
	- とりあえずやってみせる方向に振るのだろうか
	- やってみてもらうのもあるし、自分が失敗することもある。
	- 暗黙知が減るということもありそう
- チームの問題・課題にオーナーシップを持ち始めたとき
	- チームの課題は解決しても組織・ユーザに貢献していないという状態もあるのではないだろうか
	- チームの問題・課題、というのが抽象度高かったかも。オーナーシップを持ち始めるのは成長の第一課題で、そこから視座を高くして、組織やユーザに貢献する視点を身に着けていくのも成長だと思った。
	- たしかに成長の通過点としてその過程はあるかもしれない
	- スクラムでは”チーム”が主体なので、個人の責任ではなくてチームの責任だと捉えるほうが適切ではないだろうか
	- チームが悪い。となっても関わった人が自信で責任を感じすぎちゃうときがある。
	- ふりかえって次はどのようにやっていくかを考える方向にするといいのではないだろうか

# 感想
- チームの成長を実感するのは、次の成長へのモチベーションに繋がるなと感じました。
- 「なんとなく成長しているよね。」ではなくて、「こういうところが成長したよね。」と”どこが”というのを認識するのも自分たちの現状を把握するのにいいのかなと思いました。
【ネットワーク用語】MACヘッダーとは

MACヘッダーは__[イーサネット](https://qiita.com/sasami_dc2/items/f4da7a7c33df9b7eccad)__を使用する際のヘッダーで宛先や送信元のMACアドレスが記載されている。

|フィールド名|ビット長|内容|
|:--|:--:|:--|
|宛先MACアドレス|48|送信先のMACアドレスを記載|
|送信元MACアドレス|48|送信元のMACアドレスを記載|
|イーサタイプ|16|使用するプロトコルの種類を記載([こちらを参照](https://qiita.com/sasami_dc2/items/462a6d3face77c7bd1d7))|
Regional Scrum Gathering Tokyo 2021 Day 3 「OST -"成功体験"をいい感じの言葉に言い換えたい-」

この記事はRegional Scrum Gathering Tokyo Day3で実施されたOSTの内容についてのメモです。

Open SpaceTechnology(OST)については[こちら](https://www.humanvalue.co.jp/keywords/ost/)のサイトなどを参照ください。

いわゆる資料を作っての発表とは異なり、その場での議論が広がる一時的な情報ですが、
勉強になる内容も多いので、この記事では話に上がった内容をメモしています。 

# テーマの背景
若手に「成功体験」という言葉を伝えることに難しさを感じることがある。
うまく伝わるような表現について会話したい。

# どんなときに"成功体験"という言葉を使ってる？
- 自己肯定感や自尊心を育くもの。成功体験は暗黙的に認識してしまう。確証バイアスを強化してしまうこともある
- 新しいことを始めるために顧客を説得するための要素としてつかうことがる。
- 成功体験を積んでいくのが大事。という使い方をすることがある。
- 小さなことでも変化できたと思ったら成功体験と伝えているかもしれない
- 成功体験、というものを大きなものと捉えていることでハードルを自分の中で上げてしまっていたかもしれない。
- 成功したと思ったことが外から認められ、結果にもつながっているとき
- 「ハードルを下げる」という目的のために使うことが多そう。少しずつ自信をつけていくために。
- 褒めたいとき、達成感が得られたとき。
	- 良かったところ探し。と考えたら良いのではないだろうか。
	- たしかに、"成功"と聞くと身構えてしまう。
	- 良くなった変化に着目してもらうために使うかもしれない。
- 成功というよりは学びに変換する
- 達成できたことを実感するため
- 他の人に言ってもらうほうがいいかもしれない
- 承認欲求を満たされていくと良い
- 学びを祝い合う
- Celebration Gridは失敗も祝えるのでおすすめ

# Celebration Grid
- 失敗であったとしても、やったことを元に学びを深めていく手法
- 「何かをためそう」としているときは、たとえ失敗であっても学びが深い
- やったことを付箋でペタペタ貼っていって会話ができると、それが学びにつながる。

## 実際にCelebration Gridをやってみた感触
- チームが停滞しているようなときに使う
- 「失敗している」ということも、余白があって成長につながるものであることを伝えたい
- 「成功している」ときって、本当にいいのだっけ？ということも考える機会になる
- 実験して失敗することが悪いことって思ってしまっている人もいる
- Fail Fastを実践するときに使える

# 感想
- 失敗することを許容することを伝えるのは難しいなと感じました。言葉では「失敗してもいいよ！」と伝えるにしても、なかなか気持ちの麺で素直に受け取れないというのには共感しました。
- 自信をつけてもらうために"成功体験"という形で認識してもらうという考え方に個人的にはしっくり来ました。
ラズパイ 起動したらpythonファイル実行を最速で設定する。

## 前提
- ラズパイの用意
- microSDにラズパイのOSがインストールされていて、ラズパイ を起動できる
- ラズパイ のコードは外付けのキーボード、マウス、ディスプレイを用いて記述している

## やること
1. 実行したいファイルの実行許可を与える
2. ラズパイ 起動時に実行するコマンドを指定のファイルに記述する

## 実行したいファイルの実行許可を与える
まずはラズパイのターミナルで、実行したいファイルがあるディレクトリへ移動する。
私はデスクトップに保存したのでそこへ移動

```
sudo chmod 755 ファイル名.拡張子
```
私の場合は

```:Desktop
sudo chmod 755 test.py
```
これで実行権限オッケー。

## 起動時にファイルを実行するコマンドを記述
起動時に読み込まれるファイルは、/etc/rc.localにあります。
ターミナルで以下のコマンドを実行してください。

```
sudo vi /etc/rc.local
```

``echo 0``の上で、起動時に実行したいコマンドを入力。

```
// ここに記述
echo 0
```
私の場合はデスクトップにあるPythonファイルを実行するので

```
python3 /home/pi/Desktop/test.py 
```

これで保存。
vimコマンド保存方法は``:wq!``
nanoコマンド保存方法は``ctr+o``, その後``enterで保存``、そして``ctr+x``で終了できます.

これでGUI操作ではなく、ラズパイ を起動したら指定したファイルが実行されます。


## おまけ
### 今回途中で出て来たchmodとは
途中で出てくるchmodは権限のことです。
そのファイルの権限をどうするのか、、。ということです。
今回755という権限を書きました。

[参考サイト](http://www.tohoho-web.com/wwwxx012.htm)によると
``通常のディレクトリ、コマンド、CGIスクリプトなど。誰でも読込みと実行はできるが、書き込みは自分だけ。``
という権限です。


## 参考サイト
- [teratail](https://teratail.com/questions/30955)
- [Raspberry Piをローテクで「便利」に使う！](https://www.pc-koubou.jp/magazine/14369)
Regional Scrum Gathering Tokyo 2021 Day 3 「OST -積読を解消。みんなさくさく読んでる？-」

この記事はRegional Scrum Gathering Tokyo Day3で実施されたOSTの内容についてのメモです。

Open SpaceTechnology(OST)については[こちら](https://www.humanvalue.co.jp/keywords/ost/)のサイトなどを参照ください。

いわゆる資料を作っての発表とは異なり、その場での議論が広がる一時的な情報ですが、
勉強になる内容も多いので、この記事では話に上がった内容をメモしています。 

# みんな読書どうしてる？
## 自分が経験していないことに関して読むのが難しいと感じる
- そういうときは割り切って、さらさらと読み進めてしまう。場合によって後から戻ってみる。
- 読み進める中で「前の章がわかっていないとこの章がわからない」ということにもなる気がしている。
- 急に戦略の章とかになるとわからない
- 本を翻訳しているときに困ったことがある
- とりあえずバーっと読んで、重要そうなところをピックアップしてそこから周りを読んでいく。
- 頭から通しで読もうとしない
- 薄く読んでマーキングしながら進めたりする。
- 浅く何周もしたりするということなんですね
- 一回じゃ理解できないことが多い。特に技術本なんか。
- 関係するジャンルの本を複数読んでみると徐々にわかったりする。
- 個人的には完璧を求めようとしない。
- 読みきらないと行けない脅迫観念を捨てる

## 締め切り駆動
- 図書館で借りてみる。２週間で返さないといけない感覚。
- 読んだ本をアウトプットする場をセッティングする。
- 著者としては買ってほしいけどｗ

## 一冊に集中しない

## 今日の話を聞いてみてどうだった？
- これまでは「読みきらなきゃ」といった気持ちがあった
- 本によっては読みきらないくても良いものなんだと感じた。 

## 紙？電子書籍？
- 併用している
- 両方買うことがある
- 技術書なんかは検索機能が便利
- 電車なんかだと電子書籍が便利
- 電子書籍であれば端末だけ持っていれば気分に応じて読む本を切り替えられる
- 紙の本の見開きつらい
- サインもらいたいときは紙
- 本は一期一会だから本屋で良さそうなら即買う
 
# 感想
- 自分自身少しずつ読書量を増やしているところで、いろんな方の考え方を聞けるいい機会でした
- 「全部完璧に読まなきゃ」という脅迫観念を捨てる。というのは割と共通理解だなと感じ安心しました。
- イベントに参加・発表している方々はやはり読書量が多いな、と感じました。自分もこれからいろいろ知識を身に着けていこうというモチベーションに繋がりました。
【ネットワーク用語】イーサ・タイプ

イーサ・タイプの内容物は主に以下にあるようなプロトコルのパケットとなる。
それを番号にして記載する。

|タイプ番号|プロトコル名|
|:--|:--|
|0000-05DC|IEEE802.3|
|0101-01FF|実験用|
|0800|Internet IP(IPv4)|
|0806|Address Resolution Protocol(ARP)|
|8035|Reverse Address Resolution Protocol(RARP)|
|805B|VMTP(Versatile Message Transaction Protocol)|
|809B|AppleTalk(EtherTalk)|
|80F3|AppleTalk Address Resolution Protocol(AARP)|
|8137|IPX(Novell Netware)|
|814C|SNMP over Ethernet|
|8191|NetBIPS/NetBEUI|
|817D|XTP|
|86DD|IP version 6(IPv6)|
|8863|PPPoE Descovery Stage|
|8864|PPPoE Session Stage|
|9000|Loopback(Configuration Test Protocol)|
Docker コンテナ内で composer install/require したら `Could not find package` となった 

## 起こったこと
個人作成のアプリを作成中 docker のコンテナ内に入って、`composer require laravel/laravel` を実行したら以下のメッセージが出てきた。

```shell
[InvalidArgumentException]
Could not find package laravel/laravel with stability stable.
```
ちなみにローカルからだとうまくいく。
なんでやねーーーん！！

## 紆余曲折を経て最終的にやったこと
Dockerfile から composer をインストールしている以下の記述を削除

```dockerfile
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer
RUN composer config -g repos.packagist composer https://packagist.jp
```

マルチステージビルドを使用して composer を install する

```dockerfile

COPY --from=composer:2.0.8 /usr/bin/composer /usr/bin/composer
```

終わったら docker image を ビルドして完了
Regional Scrum Gathering Tokyo 2021 Day 3 「OST -ScrumMasterのファシリテーションをどう学ぶか-」

この記事はRegional Scrum Gathering Tokyo Day3で実施されたOSTの内容についてのメモです。

Open SpaceTechnology(OST)については[こちら](https://www.humanvalue.co.jp/keywords/ost/)のサイトなどを参照ください。

いわゆる資料を作っての発表とは異なり、その場での議論が広がる一時的な情報ですが、
勉強になる内容も多いので、この記事では話に上がった内容をメモしています。


# どのようにファシリテーションを学習したか
- スクラムの研修講師を真似てみる
- ファシリテーションを実際にやってみてFBをもらう
- 学習し始めは書籍がメインだった。その後はメンバーからFBをもらっていた。
- 最初に海外のアジャイルカンファレンス参加時に、会の進め方のの上手さに感動した。skilled facilitator, patripate

# ファシリテーションのフィードバックはどうもらう？
- なにを見ていたかを聞く。コンテンツ？参加者の顔？全体？。そしてなぜそこを見ていたのかを聞いていく。
- チェックリストをつくってフィードバックをもらったこともある。
- なにを見ていたか、なにを意識していたか、流れを

# 実際にどんなフィードバックをもらった？
- 事前にいくつか視点を用意した。
- 質問項目と、本人がどう感じたかのフリーコメント。
	- スケジュールどおりに進めようといしている印象だった。
	- 方向を誘導しようとしているように感じた。
- 「本筋から皆離れていく事があった。」というコメントしたのに対して、「なぜそれを共有しなかったの？」というフィードバックをもらった。
- 相談できる場があるのはいいですね。

# ファシリテーションの勉強の場について
- 場所によって違う
	- 会議の仕方です！という場であったり
	- スピリチュアルなことを言う場であったり。
- howに特化した本や、人にフォーカスした本が多いかなという印象。
- バランス良くインプットしていくのが良さそう。型だけでもなく、スピリチュアルなことだけでなく。

# オンラインの会話について
- オンラインだと声に集中する。
- 今後オンラインでのファシリテーションのとり方を学んでみるのも面白いかもしれない。

# ファシリテーションの練習
- 現場以外での練習方法
- ワークショップデザインというなかでファシリテーションについて考えてみても良いかもしれない
- テクニックなどの練習と合わせてスキルが身についたりしないだろうかと思った。
- 師匠に教えを請うのも一つだが、一人のときにどう学ぶか。
- 会社のなかで研修など練習できる場があるといいかもしれない
- 会社のファシリの研修だと時間を決めてやりましょうというのが多い
- ファシリテーションスキルが高い人の講演などに行って、講演後にどういう意図で組み立てていたかを質問してみるのも良いかもしれない。


# 感想
- 自分もスクラムマスターとしてチームの成長にどのように貢献できるかを考えることがあります。求められるソフトスキルの１つであるファシリテーションスキルをどのように身につけるかについて多くの経験者の方の意見を聞けたのが学びになりました。
- 学習においてもやはりフィードバックは重要な要素ですね！
Ubuntu で Flutter を使う (その２)

こちらで作成したプログラムを、Node.js のサーバーで動かしてみました。
[Ubuntu で Flutter を使う](https://qiita.com/ekzemplaro/items/3c57e66460f76a664e87)

Node.js のサーバーのインストール

```bash
sudo npm install -g http-server
```

ビルドをする

```bash
flutter build web
```

次のように作成されます。

```text
$ tree build/web -L 2
build/web
├── assets
│   ├── AssetManifest.json
│   ├── FontManifest.json
│   ├── NOTICES
│   ├── fonts
│   └── packages
├── favicon.png
├── flutter_service_worker.js
├── icons
│   ├── Icon-192.png
│   └── Icon-512.png
├── index.html
├── main.dart.js
├── manifest.json
└── version.json
```

buid/web でサーバーを実行します。

```text
$ cd build/web/

$ http-server
Starting up http-server, serving ./
Available on:
  http://127.0.0.1:8080
  http://192.168.1.8:8080
  http://10.64.227.1:8080
Hit CTRL-C to stop the server
```

ブラウザーでアクセスした結果
![flutter_dec08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/179446/0c62e70e-f495-eebb-89ff-248bc19ec348.png)

次のバージョンで確認しました。

```text
$ flutter --version
Flutter 3.1.0-0.0.pre.2054 • channel master • https://github.com/flutter/flutter
Framework • revision 00a4773ded (2 hours ago) • 2022-08-02 23:38:07 -0400
Engine • revision c456476277
Tools • Dart 2.19.0 (build 2.19.0-58.0.dev) • DevTools 2.16.0
```
Rの散布図中に決定係数と回帰式を書き込む

ggplot2なら簡単だが、baseのplotだと思っていたより難しかった。

```r2.R
xx1 <- rnorm(100)
yy1 <- -1*xx1+rnorm(100)
result <- lm(yy1~xx1)
slp <- round(result$coef[2], digits=2)
intc <- round(result$coef[1], digits=2)
plot(xx1,yy1,xlab="x",ylab="y",
     cex.axis = 1.2, cex.lab = 1.2, bty = "o", pch=16, col = "black", lwd=1.5)
text(x=-2, y=-2, as.expression(substitute(italic(R)^2 == r, list(r = round(summary(result)$r.sq, digits=2)))), cex=2)
if (intc > 0) {text(x=-2, y=-2.5, as.expression(paste0("y= ", slp, "x + ", intc)), cex=2) # y切片の符号で場合分け
  } else {text(x=-2, y=-2.5, as.expression(paste0("y= ", slp, "x ", intc)), cex=2)}

```

結果はこんな感じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100982/4eaa6e88-24ba-f3a8-2df5-5233b3688d0a.png)
Visualforce pageのPDF作成時のCSSについての覚え

普段はVisualforce pageを使うことはほぼないのですが（新規ではつくらない）、ただ１つPDF帳票を作りたいときには使っています。

今回はCSS関係の小技についての覚えを書いておきます。

#ヘッダを改行する

[I'm trying to set a footer with css and I need to have 2 lines](https://stackoverflow.com/questions/48117976/im-trying-to-set-a-footer-with-css-and-i-need-to-have-2-lines)


#PDFのサンプル
https://blog.deadlypenguin.com/2016/04/04/pdf-headers-footers-visualforce/
pythonで月の休日(土日・祝日)の日数を取得してみた

# はじめに<br>

###動機
機械学習に必要なデータの作成をしている際に、月の休日日数を自動で取得する必要があったため作成しました。

平日(営業日)を判定する記事は多く見かけたのですが、休日判定(日数取得)に関するものが少なかったため、備忘録的な意味も込めて投稿することにしました。

###使用ライブラリ
- [JPBizDay](https://pypi.org/project/jpbizday/)：日本の営業日を取得するライブラリ

- datetime：pythonの標準ライブラリ、日付や時刻を操作するためのクラスを提供

- calendar：pythonの標準ライブラリ、日時を扱う

### 実行環境
[GoogleColaboratory](https://colab.research.google.com/notebooks/welcome.ipynb?hl=ja)

# 準備
まず、jpbizdayをインストールします。<br>
colab上でインストールする場合はpipの前に!をつける必要があります。

```
!pip install jpbizday
```

次に必要なモジュールをimportします

```
import jpbizday
import datetime
import calendar
```

# 実装

###手順
1.本日の年・月を取得する
2.取得した年・月を元に今月の日数を取得
3.取得した年・月を元に今月の平日の日数を取得
4.今月の日数から平日の日数を引き、休日の日数を取得

```
#本日の年・月の取得
dt_now = datetime.datetime.now()
year = dt_now.year
month = dt_now.month

#今月の日数を取得
days = calendar.monthrange(year, month)[1]

#平日の日数を取得
heijitu = jpbizday.month_bizdays(year, month)
heijitu = len(a)

#休日の日数を取得
holiday = days - heijitu
print(holiday)
```
---

jpbizdayを使用したことで結構シンプルに実装できたのではないかと思います。
他の方法があるよ！こっちの実装方法の方がいいんじゃない？などのアドバイス等ありましたらお気軽にお願いいたします!

---
##参考にさせていただいたサイト
- calendarモジュールの使い方<br>
https://note.nkmk.me/python-days-weeks-of-the-month/
- jpbizdayの使い方<br>
https://pypi.org/project/jpbizday/
[Rails]carrierwaveでアップロードした画像の削除方法(devise使用)

carrierwaveでアップロードしたユーザー画像を削除したいと思い、公式のgithubを見た所、

```Ruby
<%= f.check_box :remove_avatar %>
Remove avatar
```

このようなチェックボックスを設置することで削除できると書かれていたのでやってみました。簡単！
すると以下のようなエラーが。

```
Unpermitted parameter: :remove_image
```

許可されていないということは、削除する際にはストロングパラメーターに:remove_imageというカラムを追加する必要があるようです。

##deviseのストロングパラメーターにカラムを追加

今回私はユーザー周りにdeviseを使用しており、画像のアップロードや削除はユーザー編集時に行う仕組みにしています。
なのでdevise_parameter_sanitizer.permit(:account_update,)のキーに:remove_imageを追加して許容する必要がありました。

```Ruby:controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :configure_permitted_parameters, if: :devise_controller?



  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:account_update, keys: [:name, :profile, :image, :remove_image])
  end
end
```

これによりエラーが消え、無事画像の削除ができるようになりました！
Lispでパイプ演算子

#はじめに
ElixirやRubyなどモダンな言語にはパイプ演算子というちょっと便利な記法があります。Lispのマクロで取り入れてみました。コードはISLispで書いてありますが、Common-Lispでもそのまま動くと思います。

#表記

```lisp
(pipe 1 |> (foo 2) |> (bar 3) |> (boo 4))
```

このように表記することとします。これは次のS式と等価です。

```lisp
(macroexpand-1 '(pipe 1 |> (foo 2) |> (bar 3) |> (boo 4))) 
;; #=> (BOO (BAR (FOO 1 2) 3) 4)
```


#使い方

```common-lisp
(defun foo (x y)
    (+ x y) )

(defun bar (x y)
    (* x y) )

(defun boo (x y)
    (- x y) )

(pipe 1 |> (foo 2) |> (bar 3) |> (boo 4)) 
;; #=> 5
```

#実装

```common-lisp:common_lisp
(defmacro pipe (:rest expr)
    (pipe-macro (cdr expr) (car expr)) )

(defun pipe-macro (pipe func)
    (cond ((null pipe) func)
          ((eq (car pipe) '|>) (pipe-macro (cdr pipe) func))
          (t (pipe-macro (cdr pipe) (pipe-macro1 (car pipe) func))) ))

(defun pipe-macro1 (fun funcs)
    (cons (car fun) (cons funcs (cdr fun))) )
```

#Github
tests/pipe.lsp にコードがあります。

https://github.com/sasagawa888/eisl
macでmysqlが動かなくなった時の解決策 (Railsプロジェクト動かす編)

# 久しぶりにローカルのmysql使ったら動かなくなった
railsプロジェクトで久しぶりにlocalのmysql使ったらmysqlが動かなくなっていました。その解決手順を以下に記述します。



#とりあえず今あるmysqlを全部消す

データは消えてしまいますが、そのデータを作り直す時間を加味しても結果的にはmysqlを削除してしまったほうが早いです。古いmysqlが悪さしている場合、解決にかなり時間を取られてしまいますので。localのmysqlを辞めてdockerでmysqlを起動させて接続すればデータを残して解決するのですが、きっとこの記事の読者はlocalのmysqlを起動して接続したいはず...

- コミュニティエディションのｍysqlを削除する方法

```
rm -rf ~/Library/PreferencePanes/My*
sudo rm /usr/local/mysql
sudo rm -rf /usr/local/mysql*
sudo rm -rf /Library/StartupItems/MySQLCOM
sudo rm -rf /Library/PreferencePanes/My*
sudo rm -rf /Library/Receipts/mysql*
sudo rm -rf /Library/Receipts/MySQL*
sudo rm -rf /private/var/db/receipts/*mysql*
sudo rm /Library/LaunchDaemons/com.oracle.oss.mysql.mysqld.plist
```

- brewで入れたmysqlを削除する方法

```
$ brew uninstall mysql
sudo rm -rf /usr/local/Cellar/mysql*
sudo rm -rf /usr/local/bin/mysql*
sudo rm -rf /usr/local/var/mysql*
sudo rm -rf /usr/local/etc/my.cnf
sudo rm -rf /usr/local/share/mysql*
sudo rm -rf /usr/local/opt/mysql*
sudo rm -rf /etc/my.cnf
```

上2つとも流しておけばmysqlは全部消えるはず。

# brewでmysqlをinstall
今回はbrewを使ってmysqlをinstallします。現状、`brew install mysql`をすると8系列のmysqlがinstallされてしまうので、無難に5.7をinstallします。

```
brew install mysql@5.7
```

pathを通すために以下の1行を自分が使っているシェルの設定ファイルに記載してください。 ( bashなら ~/.bash_profile )

```
export PATH="/usr/local/opt/mysql@5.7/bin:$PATH"
```
※もし昔に設定していたmysqlのPATHがあったら削除しましょう。


```
mysql.server start
```

```
Starting MySQL
 SUCCESS!
```
となればmysqlのinstallまで成功です。


# 過去に起動したRailsプロジェクトを動かす

以下はrailsのプロジェクトを動かすときのはまりポイント置いておきます。

過去にbundle installを実行したプロジェクトだと、その時入れてあったmysqlのversionに合わせてgemがinstallされていると思うので、rails db:createを実行すると以下のようなエラーが出てmysql周りが怒られているよ！というエラーが表示されると思います。

```
> rails db:create
rails aborted!
LoadError: dlopen
```

ですので以下のコマンドでgemをuninstallします。

```
bundle exec gem uninstall mysql2
```
して

```
bundle install 
```
を実行してmysql2のgemを入れ直しましょう。
ここでエラーが出る人は

```
bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib"
```

bundle install前に上記コマンドを流してみてください。


参照：
https://qiita.com/akiko-pusu/items/aef52b723da2cb5dc596
はじめてSwiftUIでMacアプリを作って画面遷移に困った話

# はじめに

今までiPhoneアプリケーションの経験しかなく、Macアプリを作成したことはありませんでした。
最初からMacアプリを作ってみるとiPhoneとの違いに少し驚いた話です。
SwiftUIについても初心者なので勉強中です。

ちなみに環境は以下
Xcode:11.7
Swift5


# ログイン画面からメイン画面に遷移したい

[Appleのチュートリアル](https://developer.apple.com/tutorials/swiftui/creating-a-macos-app)やったときに画面遷移なかったなとは思ったのですが、
iPhoneのようにNavigationViewでは遷移しません。
チュートリアルにもありますがNavigationViewでは１画面にリスト画面と詳細画面が並べられることになります。

私はログイン画面でログインした後メイン画面に移動する処理がうまく書けず困ったので
画面遷移についてメモを残します。

# ZStackを使う方法

ZStackを使って、Viewを切り替えるように実装しました。

```swift:ZStack
    var body: some View {
        ZStack {
            // メイン画面を表示
            MainView()
            // 上からログイン画面を表示
            if !isLogin {
                LoginView()
            } 
        }
    }
```

メイン画面の上からログイン画面が出てきた方がMacアプリっぽいかなと思ったのですが、
ifelseにして丸ごと切り替えても良かったかもしれません。

# sheetを使う方法

メイン画面の上からログイン画面を出すならsheetも良かったです。
macOSBigSureだととても綺麗に見えます。
macOS Catalinaだと上からピロっと出る感じであんまりおすすめできませんでした。

```swift:sheet
    var body: some View {
        VStack {
            // メイン画面を表示
            MainView()
        }.sheet(isPresented: $isLogin, content: {
            LoginView()
        })
    }
```

# 感想
sheetは画面外をクリックされると閉じてしまうのでログインには向きませんね！
sheetと同じようなものに.alertもありますがこちらは「Alert」型でないといけないので画面を切り替えるには使えません。
またsheetとalertを多用すると画面遷移時にぶつかって？しまいどちらかが表示されない場合もありました。
なにもなければZStackで切り替えるのが一番シンプルだなと思います。

スマートな画面遷移方法があればぜひ教えてください！