OmniAICreator/Qiita-1.07M huggingface dataset:
AWSの導入事例

# AWSの導入事例
* Webサイト・コンテンツ配信
* Web・モバイルアプリケーション
* 基幹・業務システム
* 分析
* ビックデータ活用
* バックアップ・災害対策
* スタートアップ企業
* 政府・教育機関
* エンタープライズ企業
* 金融・証券サービス
など**様々な場面でAWSは活用されてる**
# AWSサービス活用例
## 小規模なブログサイト
小規模なブログサイトはWebサーバーとDBサーバーで構成する
1. EC2インスタンス（サーバー）×１
    Webサーバーとして使用。WebサーバーにWordPressのソフトウェアをインストールする
1. RDSインスタンス（DBサーバー）×１
    通常はマルチAZ（物理的に独立した、複数の拠点で運用すること）にして冗長構成をとる。WordPressに必要なDBサーバーとして利用
※VPC（仮想ネットワーク）内にEC2とRDSを配置する
## 中規模なECサイト
Webサーバーを２台構成で負荷分散し、商品登録サーバー、DBサーバー、画像・動画サーバーを別に構成する
1. EC2インスタンス（サーバー）×３
    Webサーバー２台と商品登録サーバーとして使用。
1. RDSインスタンス（DBサーバー）×１
    通常はマルチAZ（物理的に独立した、複数の拠点で運用すること）にして冗長構成をとる。
1. S3バケット（ストレージ）×１
    画像・動画サーバーとして使用
1. ELB(ロードバランサー)×１
    ロードバランサーとして使用
※VPC（仮想ネットワーク）内にEC2とRDS、ELBを配置し、S3はVPC外に置く
## 業務システムの例
業務システムサーバーと認証サーバー、DBサーバー、ファイルサーバーで構成する
1. EC2インスタンス（サーバー）×2
    業務システムサーバーと認証サーバとして使用
1. RDSインスタンス（DBサーバー）×１
    通常はマルチAZ（物理的に独立した、複数の拠点で運用すること）にして冗長構成をとる。
1. S3バケット（ストレージ）×１
    ファイルサーバーとして使用。接続にはゲートウェイエンドポイントを使用
1. Direct Connect×１
    車内から接続回線として使用
※VPC（仮想ネットワーク）内にEC2とRDSを配置し、S3はVPC外に置く
## 集計システム
Webサイトから集計したログや売り上げデータを保存し、集計・解析した結果を書き出す
1. EC2インスタンス（サーバー）×１
    ECサイトなどで使用
1. Redshift（データシェアハウス）×１
   集計・解析サーバーとして使用。
1. S3バケット（ストレージ）×2
    ログの保存や結果の書き出し先として使用
※VPC（仮想ネットワーク）内にEC2を配置し、S3はVPC外に置く。ログデータや売上データをS3に集計し、それらをRedshiftで集計・解析し、S3に結果の書き出す
## ゲームサイトでオンプレミスとAWSを併用する
固定で考えられる部分はオンプレミスで用意し、イベントなどの変動率の高い部分をAWSで構成することで弾力性を持たせられる
1. EC2インスタンス（サーバー）×複数
    WebサーバーやAPIサーバーとして使用
1. RDSインスタンス（DBサーバー）×複数
    RDSサーバーとして使用。レプリケーションするために複数台であることが多い
1. S3バケット（ストレージ）×複数
    画像やHTML、静的Webサーバーとして使用。複数のこともある
1. ELB(ロードバランサー)×１
    ロードバランサーとして使用。複数のこともある
1. DynamoDB(DBサーバー)×複数
    キューバリューストア型DBとして使用
※VPC（仮想ネットワーク）内にEC2とRDS、ELBを配置し、S3とDynamo DBはVPC外に置く

**これら以外にも機械学習や災害対策バックアップなどに使用される**
はじめてのパターン認識　第７章　誤差逆伝搬法

![スクリーンショット (200).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779277/22eafe33-2771-fcc6-fedc-b8d196d5cdcb.png)
![スクリーンショット (201).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779277/85aaf346-20ec-baf0-7efb-768c49930a8c.png)
![スクリーンショット (202).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779277/3fdb3a36-ec37-16c9-c5a9-6253975f7c95.png)
![スクリーンショット (203).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779277/8936a234-b2da-8ded-decf-587928901c1c.png)
![スクリーンショット (204).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779277/5e7d1d3e-d286-6eac-d8e6-ab35a906c7f1.png)
![スクリーンショット (205).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779277/64bd28fb-64e5-b1ea-0fc3-37b6ab906358.png)
パターン認識の第７章、誤差逆伝搬法のメモを取ったので共有してみました。
式変形の省略部分や式の言語化を意識してまとめてみましたが、無知故間違っているところも多いかと思います。間違っていたらご指摘してくださるとうれしいです。
2022/8/7主にITとかセキュリティの記事

脆弱性を外に出さない、開発チームのセキュリティ成熟度を上げる2つの方法(8/5)
https://gunosy.com/articles/exXNy

NICTサイバーセキュリティ人材育成レポート「サイバーセキュリティ・トランスフォーメーション ビジネスリスクのニューノーマル」を公開(8/5)
https://www.nict.go.jp/publicity/topics/2022/08/05-2.html

厚労省委託先のＰＣがウイルス感染、個人情報６１件流出か…「なりすましメール」届き発覚(8/5)
https://www.yomiuri.co.jp/national/20220805-OYT1T50251/

WDBホールディングスにランサムウェア攻撃、メールシステムやファイルサーバにアクセスできない障害(8/5)
https://scan.netsecurity.ne.jp/article/2022/08/05/48022.html

フィッシングのなりすましブランド--トップはマイクロソフト、日本は「au」(8/5)
https://japan.zdnet.com/article/35191533/

2022年上半期にフィッシング攻撃でなりすまし最多だったのはMicrosoft──Vade調査(8/5)
https://enterprisezine.jp/news/detail/16440

三和倉庫で不正アクセスによる障害発生、物流システムが稼働停止(8/5)
https://scan.netsecurity.ne.jp/article/2022/08/05/48020.html

フィッシング報告数が過去最高　カード会社など装う(8/4)
https://www.nikkei.com/article/DGXZQOUC049FS0U2A800C2000000/

東大、ボット判定に情報セキュリティ・倫理に関する学習を織り込んだシステム「DualCheck」を構築(8/5)
https://www.nikkei.com/article/DGXZRSP637855_V00C22A8000000/

BANDAI SPIRITSをかたる偽サイトに注意　同社になりすまして商品を販売(8/5)
https://www.itmedia.co.jp/news/articles/2208/05/news155.html

OT導入組織の78%が3回以上の侵害を経験、生産性に影響する運用停止は半数に至る(8/5)
https://scan.netsecurity.ne.jp/article/2022/08/05/48010.html

北朝鮮サイバー攻撃で数百億円窃盗と指摘(8/5)
https://www.minyu-net.com/newspack/KD2022080501000651.php

得体の知れないフリーWi-Fiに繋ごうとしてない？ 外出先のネット利用で気を付けたいこと(8/5)
https://internet.watch.impress.co.jp/docs/column/dlis/1428728.html

Nym コイン (NYM) トークン、Mixnet Nym、および DeFi プラットフォームとは?(8/4)
https://portalcripto.com.br/ja/nym-%E3%82%B3%E3%82%A4%E3%83%B3-nym-%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3-mixnet-nym-%E3%81%A8%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0-defi-%E3%81%A8%E3%81%AF/

Uniswap DAOは、プロトコルの成長に焦点を当てたUniswap Foundationの設立を検討しています(8/4)
https://portalcripto.com.br/ja/uniswap-dao-%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%83%88%E3%82%B3%E3%83%AB%E3%81%AE%E6%88%90%E9%95%B7%E3%81%AB%E7%84%A6%E7%82%B9%E3%82%92%E5%BD%93%E3%81%A6%E3%81%9F-uniswap-%E8%B2%A1%E5%9B%A3%E3%81%AE%E8%A8%AD%E7%AB%8B%E3%82%92%E6%A4%9C%E8%A8%8E%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99/

Meta、ハッカーに関する報告書を発表--ロシアの偽アカウントへの対応などを説明(8/5)
https://japan.cnet.com/article/35191493/

「Instagram」のNFTサポート、100カ国に拡大(8/5)
https://japan.cnet.com/article/35191488/

「量子暗号通信」に関する最新動向と展望【JPIセミナー 9月13日(火)開催】
https://newscast.jp/news/6129612

自民党「NFTホワイトペーパー」の要諦と具体施策【JPIセミナー 9月14日(水)開催】
https://newscast.jp/news/4845168

データが確実に届くのは「TCP」のおかげ、信頼性と効率を高める4つの仕組み(8/5)
https://active.nikkeibp.co.jp/atcl/act/19/00395/072100005/

フィリピン証券規制当局はBinanceの苦情を受けて公に警告(8/5)
https://nextmoney.jp/?p=52137

10億人の個人情報がネットに流出…IT先進国・中国の「残念すぎる実態」(8/5)
https://gendai.media/articles/-/98214

302リダイレクトとは？SEOへの影響と301との違い・設定方法を解説(8/5)
https://lucy.ne.jp/bazubu/302redirect-42428.html
Haskellでもアローラロコンをアーロンにする

## 元ネタ
https://qiita.com/tadsan/items/828cf43ec902440255cb

さらにその元ネタ
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">アローラロコンを1文字飛ばしで読むと…<br><br>&gt;&gt;&gt; &quot;アローラロコン&quot;[::2]<br>&#39;アーロン&#39;</p>&mdash; 清原弘貴@ShodoでAI校正 (@hirokiky) <a href="https://twitter.com/hirokiky/status/1552193259820032001?ref_src=twsrc%5Etfw">July 27, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


最近少しHaskellの文法を勉強していて、練習にとてもよさそうなお題だったので乗っからせてもらいました。

## 実行
```haskell:skipchar.hs
import Debug.Trace
main = do cs <- getContents
          print $ map (\(n, c) -> c) $ filter (\(n, c) -> if (n `mod` 2) == 1 then True else False) $ zip [1..] $ cs
```

```
$ echo "アローラロコン" | stack runghc skipchar.hs
"アーロン"
```

## 詳細
冗長に書くと以下のようになります。
```haskell:skipchar.hs
import Text.Show.Unicode
main = do cs <- getContents
          uprint $ skipchar $ cs

skipchar :: [Char] -> [Char]
skipchar cs = removeIndexes $ filterOddIndexes $ addIndexes $ cs

addIndexes :: [Char] -> [(Int, Char)]
addIndexes cs = zip [1..] cs

removeIndexes :: [(Int, Char)] -> [Char]  
removeIndexes cs = map removeIndex cs

removeIndex :: (Int, Char) -> Char  
removeIndex (n, c) = c

filterOddIndexes :: [(Int, Char)] -> [(Int, Char)]
filterOddIndexes ts = filter isIndexOdd ts

isIndexOdd :: (Int, Char) -> Bool
isIndexOdd (n, c) = if (n `mod` 2) == 1 then True else False
    
```

Char型の配列になっている入力を、一度(Int, Char)型の配列に変換することでどの文字が偶数番目なのかを判断をさせています。

```
  ['ア', 'ロ', 'ー', 'ラ'., ...]
→ [(1, 'ア'), (2, 'ロ'), (3, 'ー'), (4, 'ラ'), ...]
```

直感的に思いついた方法がこれでしたが、番号の割り振り介さないもっとシンプルな書き方もありそうです。
ただHaskellっぽさのある操作であるところの無限リスト及び遅延評価が触れたので結果オーライかなと思ってます(？)

## 感想
処理そのものよりも、カタカナを出力する方に地味に時間がかかってしまいました。
(Unicodeを扱うライブラリを使うためStackというものをインストールしたかったのですが、WSLで上手く動作せずMacに移動しました)

Haskell自体の勉強はすこし進んだところでまた混乱してきているので、引き続きゆっくり進められたらと思います。

それではありがとうございました。
要件定義を担当する【ITエンジニア】に必要な【コミュニケーションスキル】

# はじめに

タイトルの主張が少し強いですが、以下の本を読んでコミュニケーションスキルについて書かれている部分が有益だなと思ったので **メモ程度** にまとめました。
元の本では具体例などが書かれていてわかりやすいので、その点を押さえたい方は購入をお勧めします。


https://bookplus.nikkei.com/atcl/catalog/17/264350/


# コミュニケーションスキル

以下の3つがある
1. ヒアリングスキル
1. ミーティングスキル
1. プレゼンテーションスキル

## 1.ヒアリングスキル

### A.質問
- Open-Close
    - Open
        - 5W2Hを用いた質問
            - Why,What,Who,When,Where
            - How(程度),How to(手段)
    - Close
        - yes,noで解答できる質問
        - 認識の不一致が連続すると信頼を下げやすいので注意する
- 深掘り
    - 目的
    - 原因
    - 影響・結果
    - 手段
- 反復
    - 「それ以外にありますか？」
- 明確化
    - 曖昧な表現を明確にする
        - 例：「うまくできない」→「納期に間に合わない」
- 論理性チェック
    - A → B に飛躍がないかなど

### B.聞き方
- ポジショニング
    - 座る位置
        - 真正面は圧迫感がある
        - 1.5 - 1m の距離を取る
- アクティブリスニング
    - 興味を持っていることを伝え、発言を促す
        - 前傾
        - 記録
        - 注視
        - 相槌
            - 分からないときは素直に伝える
        - 同意・共感
            - 自分の意見を挟まない
- ネガティブリスニング
    - 話す意欲を低下させてしまう聞き方なので禁止する
        - 中断・遮断
        - うわの空
        - 批判・否定
            - 「今の意見は矛盾してますよね」
            - 「それが本当に問題なのでしょうか？」
        - 自己解釈
#### 言い回し
- 例
    - 「興味深いご意見なので詳しく聞きたいのですが」
    - 「理解が追いつかなかったので確認させてください」
#### ヒアリング依頼状
ヒアリングスキルの不足を補うために事前に準備を依頼するためのもの
- ヒアリングの目的
- お聞きしたい内容
- ヒアリング時の留意点
- 日時・場所
- ヒアリングまでのお願い事項

## 2.ミーティングスキル
### A. 環境整備

#### 会場のレイアウト
座席位置や配置を状況によって変える

#### アジェンダ
会議室の前面に張り出しておくと良い

- 目的
- 成果物
- 進め方
- 参加者の役割

#### ミーティングルール

- 本音を言いやすくする、若手が発言しやすくするために作成
- 会議の冒頭に伝える

##### ミーティングルールの例
- 経営的見地で発言する
- 建前無用、本音で話す
- 参加者の立場は対等
- 批判は禁止。討論は自由
- 挙手制
- 結論は参加者の総意とみなす

### B. リーディング
- 進行役や発言者に参加者の視線を集中させる
- 発言機会は均等にする
- 発言の意味を全員がわかるようにする
- 参加者同士の議論を通して結論を決める
- 対立する意見がある場合は認識を合わせる
- 他責の意見がでたら、指摘された側の意見も聞く
- 行き詰まったら休憩する

## 3. プレゼンテーションスキル
- 冒頭でプレゼンの趣旨を伝える
- 理解してほしい内容を中心に説明する
- 検討した内容をいくつかにわけて説明する
- ジェスチャーをつけてゆっくりとした口調で説明する
- 相手の反応を確認しながら説明する
Excel VBAでよく確認することのメモ

Excel VBAについて、よく確認することをまとめた記事です。

## 配列の宣言とFor Nextステートメント

* 配列の宣言
    + 添字の上限値を指定する（要素数ではない）
* For Nextステートメント
    + 変数counterとその初期値は省略できない
    + ループ範囲は、初期値0以上～最終値9以下（counter<=9）

__コード__

```vb
Dim counter As Long
Dim lngArray(9) As Long '添字の上限値を指定する

For counter = 0 To 9
    lngArray(counter) = counter
    Debug.Print lngArray(counter); ';を付けると改行なしで出力される
Next counter
```

__実行結果__

```sh
 0  1  2  3  4  5  6  7  8  9 
```

> __C言語との比較__
> 
> ```c
> long counter;
> long lngArray[10]; /* 要素数を指定する */
> 
> for(counter=0 ; counter<=9 ; counter++){
>   lngArray[counter] = counter;
>   printf(" %d ", lngArray[counter]);
> }
> ```

* 参考サイト
    + [エクセルの神髄（鵜原パソコンソフト研究所）
](<https://excel-ubara.com/>)


## 2種類の空文字列と既定の初期値

* 空文字列は2種類ある
    + ""（長さ0の文字列）
    + vbNullString（文字列型の変数の初期値）

* 空文字列はStrPtr()で区別出来る
    + StrPtr("")：StrPtr()の戻り値はアドレス値となる
    + StrPtr(vbNullString)：StrPtr()の戻り値は0となる

> __変数は自動で初期化される__
> 
> 変数には既定の初期値が定められており、
> 変数を宣言すると自動で初期化される
> |型|初期値|
> |:-|:-|
> |Boolean|FALSE|
> |Byte, Integer, Long, Single, Double|0|
> |Currency|0|
> |Data|1899/12/30 00:00:00|
> |Object|Nothing|
> |String|vbNullString|
> |Variant|Empty|


## エラーをクリアする

* エラーが発生していない時、Err.Numberは0
    + エラーが発生すると、Err.Numberにエラー番号が格納される
* Errオブジェクトをクリアする2種類の方法
    + Err.Clearを使う方法
    + On Error Goto -1を使う方法

> 参考：[Err.Clear と On Error GoTo -1 は同じ?!](<https://qiita.com/nagura202010/items/2691476ecfb8b863597e>)


## 割り算の演算子

* 通常の割り算：/
    + `7/2`（解答：3.5）
* 割り算の整数部を求める：\（半角￥マーク）
    + `7\2`（解答：3）
* 割り算の余りを求める：Mod
    + `7Mod2`（解答：1）

> 剰余演算のことを、Modulo（モジュロ）と呼ぶ。
> [剰余演算 - Wikipedia](<https://ja.wikipedia.org/wiki/%E5%89%B0%E4%BD%99%E6%BC%94%E7%AE%97>)

## Dir()関数の注意点

* フォルダのパスを指定する場合、定数`vbDirectory`の指定が必要
    + ファイルのパスを指定する場合は、省略可能
* ファイルやパスが見つからない場合、戻り値は`""`

__コード__

``` vb
If Dir("C:\...\folderName", vbDirectory) <> "" Then
    Debug.Print "フォルダは存在します"
End If
```
HTML が学べるサイト紹介  無料！

ハンズオンで学べる！
視覚的に理解できる！

https://www.codecademy.com/learn/learn-html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654025/113865cf-b6f8-0049-3f8a-8778191c81e4.png)


https://www.codewars.com/
【PHP学習メモ】HTTPリクエストメソッド

# HTTPリクエストメソッドの使い方
※本記事はPHP学習の備忘録目的です。筆者は初学者ゆえ、誤りなどございましたらご指摘いただけますと幸いです。


**HTTPリクエストメソッドとは**
ブラウザ(クライアント)からWebサーバに対してしてほしいことを依頼するための手段
HTTPメソッドには「GET,POST,PUT,DELETE」などがある


どのHTTPメソッドが使われているかはデベロッパーツールの「Network」パネルから確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734868/f761729c-f0b0-43b5-e68a-45535ed5bba7.png)


## 各メソッドの使い方
**1．GETメソッド**
データを取得するときに使用されるメソッド
WebブラウザにURLを入力してページを表示するときには常に「GET」メソッドが使用される。
条件を指定して検索する場合にはURLパラメータとして条件を指定する
https://example.com/search.php?
の「?」
以降の部分に検索用パラメータを設定する

例えばGoogle検索ボックスで「http get」と検索した場合のURLは以下のようになっています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734868/d27e55b8-ea14-9bab-fe0f-43e9ad78b6d8.png)


**フォームでの実装例（PHP）**
```php:index.php
<form action="sample.php" method="GET">
    <div>
        ID:<input type="text" name="id">
    </div>
    <div>
        PW:<input type="password" name="pw">
    </div>
    <div>
        <input type="submit" value="送信">
    </div>
</form>
```
※formタグのmethod属性は省略した場合「GETメソッド」になる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734868/f51c95f8-0899-a249-75f3-582d7b6c6e93.png)


**リクエストを受け取った側での処理例**
```php:sample.php
<div>
    <?php echo $_GET['id']; ?>
</div>
<div>
    <?php echo $_GET['pw']; ?>
</div>
```
→スーパーグローバルの「$_GET」でリクエスト送信時のname属性を指定して参照する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734868/0748fa53-e57b-472c-e186-f90c3b0d5cc1.png)

→送信ボタンを押すと上記のように入力内容が表示されます

ちなみにこのときのURLは?以降にパラメータが格納されています
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734868/c357c05c-af39-9318-a553-5ba24f06f980.png)
このようにURLにリクエスト情報が保持されているので別のタブでこのURLを打ち込んでも同様のページが表示されます。

---

**2．POSTメソッド**

クライアント(ブラウザ)からサーバにデータを送信したいときに使用するメソッド
（記事の新規投稿、フォームの送信など）

POSTメソッドはGETメソッドとは異なり、リクエスト内容（パラメータ）をHTTP通信のbody部に含めることで、URLにその内容が表れない通信方式。
代わりに、リクエストボディ内に内容が含まれているため、URLを直接入力するだけでは同じ通信を再現することはできません。

先ほどのGETメソッドのサンプルコードで
method="POST"
スーパーグローバル変数を$_POSTに変更してフォームを送信してみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734868/84a79d54-4440-9125-2d23-8b8595ec2d3a.png)

デベロッパーツールからフォームデータを確認するとidとpwがペイロード(本体)に格納されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2734868/3cf63898-0135-7f09-90fc-92d5168b59ef.png)
GETメソッドとは異なり、URLにはパラメータは含まれていません

---


### GETメソッドとPOSTメソッドの使い分け

GETメソッドでは、送信内容がURLパラメータに含まれているため、同じURLに再度アクセスすると同じ内容が再現できる。

一方、POSTメソッドでは送信内容はURLからはわからないため同じページにURLでアクセスすることはできません。
ですので、フォーム入力中などに再読み込みした場合、入力内容が失われてしまうなどの事象が発生します。
（ユーザー登録作業とかでよく起こりますよね！！）

GETメソッドではURLに送信内容を含めることができるので、Googleにインデックスさせたいページや他からのアクセスでも同様のページを表示させたい場合に使用します。

一方、POSTメソッドはURLに送信内容を含めない点を活かして個人情報やパスワードの入力時に使用します。

---
以上で今回のまとめは終了しますが、もう少し理解が深まったり使い方が分かってきたら追記しようと思います!
laravel/jetstream[v2.10.0, ..., v2.10.1] require illuminate/support ^9.0 と返ってくるエラーの解消方法

## はじめに
Laravel(v9.2.1)で開発を進めていったところ、Viteの影響に対応できず
バージョンを落とし(v8.7.5)、Jetstreamをインストールしようとコマンドを
実行したところで、タイトルのエラーが発生。

## 起きた事象の詳細
Jetstreamをインスールするためのコマンドを実行。
```
composer require laravel/jetstream
```
すると、以下のエラーが返ってくる。
![20220806-231443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2659821/aa3b21e6-5266-71bc-ea1d-9bc8b2844d17.png)
出力されているエラーによると、現在リリースされているJetstreamの
バージョン(2.1.0)はLaravelのバージョン9.0以上でサポートされているようです。

## 解決方法
Jetstreamのバージョン2.1以下に指定し、コマンドを実行する事で解決。
```
composer require laravel/jetstream:^1.8.0
```
## 今回の学び
・バージョンを落とすことで、エラーが発生し得るリスクの内容。
・バージョン起因のエラーはコマンドを実行時に、バージョンを指定する事で解決できる。
・バージョンを何も指定しないと最新版がインストールされる(落とし穴)。
・ファイルを手で修正する必要はない(時と場合による)。

## 参考
・https://zakkuri.life/composer-require-laravel-ui-error/
未経験からのIT転職が上手くいったからポイントまとめる

# サマリ
事業会社の総合職（主に内勤部署）としてそこそこのキャリア。データ分析にはまる過程でITに興味を持ち、社内の情シス異動を経てWeb系大手企業の情シスへ転職。給与UP/在宅メイン/残業少なめ/専門性ありを一気に達成。社内外にDX案件があふれている2022年現在、再現性ありそうなので記事にまとめます。

# 未経験からIT転職を思い立つ
内勤部署でのデータ分析を通してITに興味を持ち、プライベートでSQLを触ってみる中でキャリアの方向性を考えるようになった。IT関連の職種を調べてみると大きくわけて次の3つがあることを理解。

- エンジニア
- ITコンサル
- 情シス

# 検討
### エンジニア
技術的な興味が高まっていたので最初はエンジニアを検討。スキルがあれば好待遇が望めそうなバックエンドのWeb系エンジニア転職を中心に情報収集した。

ただ、当面は内勤部署で身に着けたスキル（業界知識・経営知識・プレゼンスキル）がおまけ程度にもならず、待遇がかなり悪くなる現実に直面。未経験からエンジニア転職は必要な学習時間を確保すれば十分可能だけど、事業会社の内勤部署で食べていけてる自分にとっては投資対効果が悪いと判断。

### ITコンサル
ビジネスモデル的に未経験からの転職はまず無理なので検討外。とは言え、いずれやるかもしれないので軽く情報収集したところ、好待遇な求人が多い。そこそこ技術力のあるエンジニアより、きっちりプロジェクト管理できるITコンサルの方が好待遇。やはり上流は強い。

エンジニアもフリーランスで高単価案件を受注し続けられれば、ITコンサルより働き方が自由で、技術的に楽しく、好待遇なのかもしれないけど、それはかなり強いエンジニアのイメージ。正直、有名ファームのITコンサルで好待遇の方が再現性あるなという印象を持った。

### 情シス
ヘルプデスクのような定型業務から、基幹システムの刷新プロジェクト推進まで、内情はかなり幅の広い職種。IT職として決して本流ではないが、未経験から潜り込み、内勤部署で身に着けた既存のスキルを活かすには良さそうな印象。とは言え、未経験で転職できる情シスはPCキッティングやヘルプデスクといった定型業務のポジション。待遇も決して良くないので直行は危険と判断。

# 転職準備
### 情シスへの異動
社内DX案件が積み上がり情シスのリソースが枯渇していたので、当時の勤務先で情シスへの異動を手上げ。しばらくしてOKが出た。ヘルプデスクやプライベートでの開発練習を通してITの基本を覚え、サーバー/ネットワーク保守、DXがらみのシステム導入プロジェクト推進を担当した。

異動は転職と違って自分でコントロールできない不確定要素が多いので正直ラッキー。それでも、2022年現在どこの企業でも社内DXのプロジェクトは乱立しているので、そういったプロジェクトへの参画でIT関連の経験を積むことには再現性がありそう。

### プライベートでの開発練習
情シスへの異動を達成したものの、未経験の自分が実務で触らせてもらえる環境には限りがあるので、プライベートで幅広くITを触るようにした。
- 古いノートPCにWindows Serverを立ててAD構築
- AWSにDjangoで作った簡単なWebアプリをデプロイ
- ローカルでpythonの機械学習チュートリアル
- Kali Linuxの環境を用意して簡単なCTFに挑戦
etc...

### ベンダー資格の取得
情シス求人のうち、技術的に面白そうで待遇の良いものはだいたい実務経験5年以上が要件。1年ちょっとで転職するには、よっぽど良いポートフォリオを作るか、ベンダー資格で下駄をはくしかないと判断。情シス実務でインフラ案件が多かったのでサーバー/ネットワークを中心に3つのベンダー資格を取った。

- LPIC Level1
- CCNA
- VCP-DCV

# 転職活動
次の4つを条件に応募先をピックアップ。
- 給与UP
- 在宅メイン
- 残業少なめ
- 専門性あり

10社投げて書類が通ったのは3社。情シス経験1年半だったので、おそらく経験年数不足で足切られた感じだと思う。面接にあげてもらえた3社はすべてIT企画系の情シスで内定をいただいた。面接は事業内容への興味（御社で仕事がしたい）×プロジェクト管理能力（人を巻き込んで仕事できます）×自己学習能力（技術面は伸びしろの塊）でストーリーを構築。

# 入社後
オンプレでVMを触る日々から、クラウドベースの仕事になりキャッチアップは大変だったものの楽しく働いています。

# 参考サイト
[僕が「バックエンド」を主戦場にしている理由](https://www.youtube.com/watch?v=cY5qOXH12Vo)
自己紹介と初投稿

初めまして、やっさんです。

いままでは製造業に勤めていました。
未経験からエンジニアを目指しています。

30代で転職して、IT業界に入ろうとただいま就活中です。

5月から8月まで職業訓練校で【java】の学習をしていました。
が、正直なところ、仕事で活かせるほどマスターしたとは言い難い状態。

訓練校卒業後は自己学習がメインになりましたが、
やはり自分一人の意志だとレベルが低い自己満足でおわってしまうのが弱いところ･･･。

どこかしらでアウトプットをしたいなと考えていた矢先に、こちらの【Qiita】というブログ？？的なサイトを知りました。
基本的には、個人の勉強を乗せていく予定です。
学習したことをメモ帳的な感じで記載し、自分の思考の過去ログとして利用できたらなとも考えています。


コード入力や、自己解釈についての誤解があると思われますので、参考にはしないでください。笑
あれば指摘やアドバイスしていただけると嬉しいです。

あと同じような境遇の方とも知り合いたいとも思っております。

こんな感じですね！笑
よろしくお願いします。
【JavaScript && CSS】今更方向キーで丸を動かす

# はじめに
JavaScriptでゲームを作る際に必要になる(と思っている)キー入力で何かを動かす操作について、今更ながら調べて実装してみました。

# デモ
![demo.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465078/50865835-4018-e210-71d6-44e7ab63e8bf.gif)

# コード

```html
<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8" />
    <title>キー入力</title>
    <style>
      #circle {
        width: 50px;
        height: 50px;
        border-radius: 50%;
        background: blue;
        position: absolute;
        top: 0; /* デモでは調整しています */
        left: 0; /* デモでは調整しています */
      }
    </style>
  </head>
  <body>
    <div id="circle"></div>
    <script>
      const movePx = 5;
      document.addEventListener("keydown", (e) => {
        // 現在の位置を取得、単位を外すためにint化(空文字の場合はNaNになるため0を設定)
        const nowTop =
          parseInt(document.getElementById("circle").style.top) || 0;
        const nowLeft =
          parseInt(document.getElementById("circle").style.left) || 0;

        switch (e.code) {
          case "ArrowUp":
            document.getElementById("circle").style.top =
              nowTop + -movePx + "px";
            break;
          case "ArrowDown":
            document.getElementById("circle").style.top =
              nowTop + movePx + "px";
            break;
          case "ArrowLeft":
            document.getElementById("circle").style.left =
              nowLeft + -movePx + "px";
            break;
          case "ArrowRight":
            document.getElementById("circle").style.left =
              nowLeft + movePx + "px";
            break;
        }
      });
    </script>
  </body>
</html>
```


# おわりに
switch/caseをもっと簡潔に書ける気がするのですが自分の力ではここまででした…
「クン、クーーーーーーーーーーン」と動くのも何とかしたかったのですが、それもよくわからず解決できませんでした。

めちゃくちゃに基礎レベルだと思いますが、参考になりましたら幸いです。
GradleでCheckstyleとOpenRewriteを使ってみた

## はじめに
個人開発で作成したコードに対して以下の作業をしてみます。
・CheckstyleでJavaのコーディング規約に準じていない部分を検出
・OpenRewriteで一部をリファクタリング
## 開発環境
- Linux(Kali 5.10.0)
- Gradle 7.2.0
- Java 16.0.1
## 導入
### Checkstyle
#### Gradleにプラグインとバージョン情報を追加
```
plugins {
	id 'checkstyle'
}
checkstyle {
    toolVersion = '10.3.2'
}
```    
#### checkstyle.xmlを追加
まず、checkstyle.xmlを配置する新しいディレクトリを作成します。
デフォルトの構成は以下のようになります。

```
(root)
└── config
    └── checkstyle           
        └── checkstyle.xml
```
checkstyle.xmlはcheckstyleの公式GitHubレポジトリからコピペできます。
参考リンク：[checkstyle.xmlのコピペ先](https://github.com/checkstyle/checkstyle/tree/master/src/main/resources)
GoogleのスタイルとSunのスタイルがありますが、私はGoogleスタイルを選びました。
ちなみにカスタマイズしたcheckstyle.xmlを登録することもできます。

#### 実行
```
$ ./gradlew build
```
#### 結果
buildが完了したら`rootディレクトリ/build/reports/checkstyle`にレポートが生成されます。
↓こんな感じでhtmlファイルでレポートが生成されます。ていうかめっちゃ怒られましたね😂 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/aa2a0c7e-47d8-816c-854b-86b28a553cde.png)

### OpenRewrite
#### Gradleにプラグインとレシピを追加
```
plugins {
	id 'checkstyle'
	id 'org.openrewrite.rewrite' version'5.25.0'
}
rewrite {
    activeRecipe("org.openrewrite.java.format.AutoFormat")
    activeRecipe("org.openrewrite.java.cleanup.Cleanup")
    activeRecipe("org.openrewrite.java.OrderImports")
}
```
activeRecipeにはリファクタリングしてもらいたい主題について記入します。
レシピのリストは公式サイトからご確認してください。
参考リンク：[javaのレシピリスト](https://docs.openrewrite.org/reference/recipes/java#recipes)
#### 実行
```
$ ./gradlew rewriteRun
```
#### 結果
再度、`./gradlew build`を実行して様子を確認してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2727545/0867ec52-9b4f-c3a8-6341-dba2f45cdf90.png)
1回目よりは減りましたね。でも、まだまだ多くありますね🥺。
レポートを読んでみたらインデントのこととimportコードの位置に関する指摘がほとんどでした。
`AutoFormatとOrderImports`のレシピで修正をお願いしましたけれど、解決できなかったようです。
恐らくGoogleスタイルの方向性とopenrewriteの方向性に齟齬があったのではないでしょうかね🤔。
### リファクタリングの対象外ファイルを追加
```
rewrite {
    activeRecipe("org.openrewrite.java.format.AutoFormat")
    activeRecipe("org.openrewrite.java.cleanup.Cleanup")
    activeRecipe("org.openrewrite.java.OrderImports")

    //リファクタリングの対象外ファイルを追加
    exclusion(
        "**/*.gradle", "**/*.json", "**/")
    }
}

```
`exclusion`にリファクタリングの対象外にしたいファイルを追加することができます。
## 最後に
詳細のコードはGibHub上でアップしています。
[build.gradle](https://github.com/crane93/gongbu/blob/java-linter/build.gradle)
[リファクタリング前後のレポート](https://github.com/crane93/gongbu/tree/java-linter/config/checkstyle/report)
visit_Psych_Nodes_Alias': Unknown alias: default (Psych::BadAlias)　解決方法

# 概要
rails new 後にはじめてrails sしようとしたら遭遇したエラー

**環境**
windows10
Rails 6.0.5.1
ruby 3.1.2p20

```
PS C:\Users\ml\rails_tutorial_2\hello> rails s
=> Booting Puma
=> Rails 6.0.5.1 application starting in development
=> Run rails server --help for more startup options
Exiting
C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/psych-4.0.4/lib/psych/visitors/to_ruby.rb:430:in visit_Psych_Nodes_Alias': Unknown alias: default (Psych::BadAlias) from C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/psych-4.0.4/lib/psych/visitors/visitor.rb:30:in visit'
from C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/psych-4.0.4/lib/psych/visitors/visitor.rb:6:in accept' from C:/Ruby31-x64/lib/ruby/gems/3.1.0/gems/psych-4.0.4/lib/psych/visitors/to_ruby.rb:35:in accept'
```

# 解決方法
gemfileに以下の記述を追加します。※バージョンは4より低いものを指定
```gem 'psych', '~> 3.1'```
そのうえで再度 rails sしたところ、無事にサーバが立ち上がりました。

# 原因について
psychはRuby 本体の default gemです。yamlはpsychに依存する形で書かれています。
psych 4.0 から YAML.loadが非互換になりました。それに起因して今回のエラーが起きたようです。
そのため、古いバージョンを指定することで対応できます。もちろん、最新バージョンを利用したうえで対応するのが理想的ではありますが。

# 参考
大変お世話になりました。ありがとうございます。
https://github.com/ruby/psych/pull/487
https://stackoverflow.com/questions/71191685/visit-psych-nodes-alias-unknown-alias-default-psychbadalias
【SpotifyAPI】現在のユーザーのプレイリスト取得メモ

# メモ内容
SpotifyAPIを使ってSpotifyCloneを作ってる際、現在のユーザーのプレイリストを取得するときに注意しておきたかったこと。

# 結論
プレイリストが**public**であれば、`scopeを指定せず`に取得でき、
プレイリストが**private**であれば、`scopeを指定することで`非公開のプレイリストを取得できる。
```javascript:scopeの指定
scope = [
      // privateのプレイリストを取得するときに必要
      'playlist-read-private',
    ];
```

## 引っかかりポイント
でも、ここで厄介なのがプレイリストの詳細にある**プロフィールに追加する**でした。

ちょうど1年前に、`公開・非公開`から`プロフィールに追加`に仕様変更しているという記事があったので、これで納得しました。
↓↓↓
参考記事：
[Spotify のプレイリストを非公開にできなくなった？](https://blog.punxsavetheearth.com/spotify-playlist-cant-be-private/)

AppleMusicユーザーの僕にとっては全然知らないことでした。。。笑
(これで、公開・非公開の概念が頭から突き放されてたわけだ...🤔)

## プレイリストの公開方法(アプリとWebの比較)
アプリかWebによって、プレイリストの公開方法が異なるようなので下記にまとめておきます。

:::note warn
Spotify Appの場合
**プロフィールに追加する** or **公開する**
→scopeを指定せずに、現ユーザーの公開プレイリストを取得できる

**プロフィールから削除** or **非公開にする**
→scopeを指定することで、現ユーザーの非公開プレイリストを取得できる(公開プレイリストを含む)

※**公開する**と**プロフィールに追加**のずれが生じることアリ
:::

:::note warn
Spotify Webの場合
**プロフィールに追加する**
→scopeを指定せずに、現ユーザーの公開プレイリストを取得できる

**プロフィールから削除**
→scopeを指定することで、現ユーザーの非公開プレイリストを取得できる(公開プレイリストを含む)
:::

これで、現在のユーザーのプレイリストを取得することができました！

# コメント
今回は、SpotifyAPIを使った現ユーザーのプレイリストを取得することのちょっとしたメモを書いてみました。

やっぱり開発は、なぜを明確にすることが大事って思わされましたね。

SpotifyAPIでどんなデータが返ってくるかの確認は、[コンソール](https://developer.spotify.com/console/)とか使って確認するのもいいかもですね。


# 参考文献
[Spotify のプレイリストを非公開にできなくなった？](https://blog.punxsavetheearth.com/spotify-playlist-cant-be-private/)

[Web API Reference | Spotify for Developers](https://developer.spotify.com/documentation/web-api/reference/#/operations/get-a-list-of-current-users-playlists)
Vue3 Props Validation

# 経緯
Vue.js-Challenges Prop Validationをやって間違えてしまった

<font color="Green">この問題</font>

https://github.com/webfansplz/vuejs-challenges/blob/main/questions/323-prop-validation/README.md

他にも問題があるので興味ある人は是非やって見てください

条件：
1. Propsで受け取る typeは 'primary'  'ghost'  'dashed'  'text'  'default'　だけ
2. typeのデフォ値は 'default'
3. typeは必須Propsでない
4. 'primary'  'ghost'  'dashed'  'text'  'default' 以外のものはValidationする

# 最初の間違えた解答

子Componentである 
Button.vue
```ts
<script lang="ts" setup>

interface Props{
  type?: 'primary' | 'ghost' | 'dashed' | 'text' | 'default';
}

const props = withDefaults(defineProps<Props>(),{
  type: 'default'
})
</script>

<template>
  <button :type="props.type">Button</button>
// わかりやすくするために表示している
  <p>{{ props.type }}</p>
</template>
```
親コンポーネント
```ts
<script setup lang="ts">
import Button from './Button.vue';
</script>


<template>
      <Button />
      <br />
      <Button type="primary"  />
      <br />
      <Button type='unknown' />
</template>
```

一見綺麗に見えるし、表示上は問題ないように見えるが....

<font color="Red">問題点</font>


> 4.'primary'  'ghost'  'dashed'  'text'  'default' 以外のものはValidationする

この条件をクリアできていない。consoleにもwaringはでない。エディター上ではtypeを渡そうとしたときに補完は効くものの unknownにしたところでエディター上でもwarning等はでていない

# なぜこのような解答にしたのか？

typescriptで型定義されているから指定外のものを渡した時には型errorなりwarningが出るなり勝手にやってくれると勘違いした。


# 解決法


https://v3.ja.vuejs.org/api/sfc-script-setup.html#typescript-%E3%81%AE%E3%81%BF%E3%81%AE%E6%A9%9F%E8%83%BD


型宣言を使用したdefinePropsの定義ではvalidateを入れるような方法を見つけられなかった
また、実行時の宣言と型宣言は同時に使えなかったので今回は型宣言を諦めて実行時の宣言にした

> defineProps または defineEmits は、実行時の宣言か型宣言のどちらかしか使用できません。両方を同時に使用すると、コンパイルエラーになります。


```ts
<script lang="ts" setup>
import { PropType } from 'vue';

type ButtonType = 'primary' | 'ghost' | 'dashed' | 'text' | 'default';

const props = defineProps({
  type: {
    type: String as PropType<ButtonType>,
    default: 'default',
    validator: (value: ButtonType) => {
      return ['primary', 'ghost', 'dashed', 'text', 'default'].includes(value);
    },
  },
});
</script>

<template>
  <button :type="props.type">Button</button>
  <p>{{ props.type }}</p>
</template>
```

親コンポーネントは変更なし

**[結果]期待している通りwaringがconsoleで出た**
```
[Vue warn]: Invalid prop: custom validator check failed for prop "type". 
  at <TestButton type="unknown" > 
  at <NotFound onVnodeUnmounted=fn<onVnodeUnmounted> ref=Ref< undefined > > 
  at <RouterView> 
  at <SimpleLayout> 
  at <App>
```

# 実際にどのように使い分ければいいのかの自論

Propsの値をより厳密にしたいケースはValidationを含める

タイポミスでPropsの値が違っていることに気づかなかったりするメリットはあるものの、型宣言からのPropsの定義方法は非常に簡単で見やすい部分があるため、Propsの値を限定的なものにしたいケース以外はValidationを行わない。

ただ、より正確に書くにはValidationを含めた書き方の方が良さそう
Herokuにデプロイ → エラーメッセージ[ syntax error near unexpected token `(' ]

# 概要
Herokuにデプロイしようとしたところ、 syntax error near unexpected token `('
と表示され先へ進めなかった。

# 目次
 - [環境](#環境)
 - [修正前](#修正前)
 - [対策](#対策)
 - [修正後](#修正後)
 - [おわりに](#おわりに)
 

# 環境
Ruby 3.1.2
Rails 7.0.3
Heroku 7.60.2

# 修正前


```bin/rails
#frozen_string_literal: true
#!/usr/bin/env ruby
APP_PATH=File.expand_path('../config/application',__dir__)
require_relative '../config/boot'
require 'rails/commands
```
この状態でデプロイしました。が．．．
```エラー画面
bin/rails syntax error near unexpected token `('
`APP_PATH = File.expand_path('../../config/application',  __FILE__)'
```
この通り、できませんでした。
# 対策
エラーメッセージをみると、bin/railsの'　(　'付近に異常があるみたいです。
いろいろ調べたところ、#!/usr/bin/env rubyの部分にスペースが余分に入っていていないか確かめ、取り除くと直ったとあったのでやってみましたが変化なしでした。
他にも調べると、”最初に記載されている#!/usr/bin/env rubyを．．．（以下省略）”という記事を発見し、「最初？自分の最初じゃないなぁ」と思い1行目と２行目を入れ替えることにした。


# 修正後

```bin/rails
#!/usr/bin/env ruby
#frozen_string_literal: true
APP_PATH=File.expand_path('../config/application',__dir__)
require_relative '../config/boot'
require 'rails/commands'
```
これでgit push herokuしたら動くのかな．．．
無事デプロイできました！

# おわりに
なかなか気づけず、解決までに時間を要してしまいました。
もっと早くエラー修正できるようがんばります！
Solidityについて調べてみた

# Solidityについて調べてみた
  
:::note info
この記事はSolidityに初めて触れる初学者による感想文です。どうぞお手柔らかにお願いいたします。
:::
お久しぶりです〜
さて
チャレキャラ: https://challecara.org/ にブロックチェーンを用いたwebアプリで参戦すると宣言し以上、本腰を入れて開発に取り掛からなければならない。
とりあえず、安直にスマートコントラクトあたりの知見を得て後輩に共有せねば。
Solidity....
Solidityってなんやねん！　　....ということで今回はSolidityについて調べ、以後独学した内容を書いていこうと思う。
  
前提としてSolidityはEthereum上で動かせる手続型プログラム言語であり、スマートコントラクトを記述する。　　
学習を進めるにあたってこのようなサイト:https://cryptozombies.io/jp/ を見つけた。
1.気にせず始めるを押下
![スクリーンショット 2022-08-06 22.22.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514897/10192d07-f409-e2fa-802c-c9fb222e7d6b.png)
※めっちゃ怪しそうでわろた
2.ゾンビファクトリーを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514897/f7088512-0b6f-6c5b-e8f2-906171d791e2.png)

3.内容に沿って学習を始める
![スクリーンショット 2022-08-06 22.24.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1514897/8a2dfe5a-acdf-5818-0fa7-0e10fb03b4aa.png)
プロゲートに近い雰囲気でとっつきやすい
Solidity自体はJSに近い雰囲気かな？

# まとめと今後
SolidityのコードはEthereum上で動かせる手続言語である。
Loomはとっつきやすい。
久しぶりにQiitaを書いた() これから数回はSolidityについてまとめてみようと思う1
それでは！

## 参考
わかりやすかった:https://ippeiblogs.com/solidity-tutorial/
紹介したゲーム:https://cryptozombies.io/jp/course
ドキュメント:https://solidity-jp.readthedocs.io/ja/latest/
Görli Testnet 接続方法

[Görli Testnet](https://goerli.net/)への接続方法について解説します。
英語で書くとGoerli＝「ゴエールィ」と読みそうな勢いですが、ドイツ語のようでGörlitzer＝「ゲルリ」が正解なんでしょうかね。進みましょう。

## 接続方法
ネットワークを追加する必要はありません。
メタマスクにはデフォルトでGoerliテストネットワークが用意されています。
![メタマスク](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779122/25f4dd66-4781-a936-db11-4da593fe519a.png)

## Goerliが見付からない？
設定でテストネットが表示されていない場合があるようです。

### ①右上を押下し、設定 > 高度な設定を開く
![メタマスク②](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779122/fd161688-ffdd-cb3e-f7a2-0aac9c454ff6.png)

![メタマスク②](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779122/ff8dc435-1129-e684-7082-2381608222bc.png)

### ②テストネットワークを表示　のトグルをON
![メタマスク③](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2779122/7fd274ab-cfa9-ae96-e248-2fd47228ba34.png)

## Faucet
2022/8 現在使える蛇口はコチラ↓

0.05Eth貰えるFaucet↓

https://goerli-faucet.slock.it/

マイニング報酬としてEthが貰える↓

https://goerli-faucet.pk910.de/
コモンコントロールとWM_NOTIFYに関するメモ

# Memo
普通に参考書等を真似していれば陥らないとは思うけどメモ。
コモンコントロールを使ったの子ウィンドウを初期化するときに、
`CreateWindowExW`関数の第九引数(`hWndParent`)を`NULL`にして後で`SetWindowLongPtrW`で親Windowを設定するつくりにすると、子ウィンドウからの
`WM_NOTIFY`や`WM_NOTIFYFORMAT`が取得できなくなる。
(Tree Viewでのみ検証済み)(**要検証**)
Webに好きにリンクを追加するクロム拡張が複数ユーザ共有対応（Google API申請のコツ付き）

# ツールの特徴

- Web上のHTML/ [PDF](https://qiita.com/largetownsky/items/ee9db46b372e5adb20f0)の好きな場所にノートを張り付けられる
- 同じノートを複数の場所に貼り付けて、その間を双方向リンクで結べる
- **複数ユーザによるノート共有が可能（New）**

Web上での勉強や調査で、高機能なブックマークやハブとして活用できます。

##### 説明ページ
https://worth-hole.com/category/worth-hole
##### 新機能の紹介ページ
https://worth-hole.com/posts/sharingNote/
##### ダウンロード
https://chrome.google.com/webstore/detail/worth-hole/menfedfefhcmpmmlgndofkkgpmlfgine/

# Google APIの申請について
## 申請が必要な場合
Google APIを使う際に、常に申請が必要なわけではありません。限られた範囲内で使うなら不要ですし、スコープ（Google APIでできる事の範囲）が狭いと申請不要です。例えば

- Google Drive™ API でアプリ専用ファイルにアクセスするだけ　→　申請不要
- 任意のファイルにアクセスするが、ユーザが都度選択する　→　申請不要（[Google Drive Picker API](https://developers.google.com/drive/picker/guides/overview)）

今回は、以下の要件があったので、広いスコープで申請せざるを得ませんでした。

- Google DriveのGUIを使って共有したい
- 他ユーザからの共有ファイルも含め、自動で定期的に更新チェックをしたい

## 申請のコツ
今回、１回だけ軽微な修正を求められただけで、審査を通過できました。
これは、幾多の先人の苦労（[ここ](https://qiita.com/satrex/items/e69500f1b2decf13156c)とか[ここ](https://halzoblog.com/google-api-oauth-procedure/)とか）で予習していたからが大きいです。

それでもなお、前もって知っておけばよかったと思う点があるので、参考のために列挙します。

### 自分のドメインが必要
先人のサイトにも書いてあるのですが、間抜けにも見落としていました。突貫工事で色々トラブルありましたが、最終的に[Gatsby](https://qiita.com/tags/gatsby)でビルドしたサイトを、[Cloudflare pages](https://qiita.com/tags/cloudflare)にデプロイできました。

Cloudflareはあまり引っかかるところが無く、無料でできる範囲がかなり大きいのでお勧めです。

Gatsbyは、Starter（テンプレート）の選択で間違うと、スキー初心者がいきなりコブ急斜面コースに突っ込むみたいな事になります。最初は機能の豊富さより、最低限したいことができるシンプルさで選ぶ方が無難そうです。自分の場合、最初に[gatsby-material-starter](https://www.gatsbyjs.com/starters/Vagr9K/gatsby-material-starter/)に突っ込んだ後、リフトで下まで帰ってきて、[gatsby-starter-lumen](https://github.com/alxshelepenok/gatsby-starter-lumen)で作り直しました。誰か、初級中級上級コースに分けてくれないかな…

### 自ドメインのメアドで早めにGoogleアカウントを取っておく
admin@mydomain.com の様なメアドをOAuth確認画面の問い合わせ先にする場合、なるべく早めにアカウント登録をしましょう。

自分の場合、直前に登録したため、最初の申請ではGoogle Cloudのプロジェクトオーナーとして選択できませんでした。登録3日後に、ある意味幸運にも微細な修正を求められたため、その時にメアドを修正できました。

### 説明Youtube動画は、無音で英語字幕を付ければ十分
動画は、無料で5分までのフルスクリーン動画を撮影できる[Icecream Screen Recorder](https://icecreamapps.com/jp/Screen-Recorder/)を使いました。
英語字幕は、Youtube公式Web編集環境の、Youtube Studioで十分でした。

### 公式の説明もちゃんと把握
先人の過去問に頼りすぎて、公式で見落としがありました。以下のサイトをちゃんとチェックしておきましょう。
- [OAuth API verification FAQs](https://support.google.com/cloud/answer/9110914)
- [Use the Google Drive brand](https://developers.google.com/drive/api/guides/branding)（Google Drive APIの場合）

# 最後に
以上、少しでもGoogle API申請の参考になれば幸いです。
Dependency Injector for Python: provider 内で別のオブジェクトを生成

[Dependency Injector — Dependency injection framework for Python](https://python-dependency-injector.ets-labs.org/)

オブジェクトの生成方法を Module で定義し、その中で別のオブジェクトを自動生成したい場合、provider 関数に injector を渡せば良い。

```python
from injector import Injector, Module, provider


class AppModule(Module):
    @provider
    def provide_hoge(self, injector: Injector) -> Hoge:
        return Hoge(injector.get(Fuga), "hello")


injector = Injector([AppModule])
hoge = injector.get(Hoge)
```
Dependency Injector for Python: 配列を Inject する

[Dependency Injector — Dependency injection framework for Python](https://python-dependency-injector.ets-labs.org/)

オブジェクト単体でなく配列を注入したい場合、multiprovider を使う。

```python
from injector import Injector, Module, multiprovider


class AppModule(Module):
    @multiprovider
    def provide_hoges(self, injector: Injector) -> list[Hoge]:
        return [
            injector.get(Hoge1),
            injector.get(Hoge2),
        ]


injector = Injector([AppModule])
hoges = injector.get(list[Hoge])
```

注意点

- `list` は Python 3.9 からサポートされた構文であり、過去のバージョンでも `from __future__ import annotations` を記述すればそれ自体を使用することはできるが、inject はできない。その場合は代わりに `typing.List` を使う。
AWS SDK のリトライモード

AWS SDK によるリトライモードには legacy と standard そして試験的ステータスである adaptive があり、デフォルトで何も指定しない場合は legacy になる。リトライをあまり意識せずに使うことも多いと思うが、レガシーと名のついたモードを使い続けるのも抵抗があるので、基本的には指定すべきと思われる。これらの違いについて整理してみた。

## 概要

参考) [Retry behavior - AWS SDKs and Tools](https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html)


各モードの概要は以下のとおり。

- legacy : デフォルのリトライ。言語ごとに挙動は異なる。
- standard : 標準的なリトライルール。標準的なエラーセットとリトライクオータをサポートする。デフォルト(未指定時)の最大試行回数は 3 回。
- adaptive (試験的) : standard モードの機能に加え、クライアントサイドのスロットリングをおこなう。このモードは試験的ステータスであるため、将来的に動作が変更される可能性がある。

## legacy モード

動作は言語により異なる。

## standard/adaptive モード

SDK に依存しない標準的なリトライロジックとして、以下のように定義されている。異なる言語でも統一された動作となる(はず)。

### リトライ判定

以下の要素から失敗理由によりリトライ可能かどうかを判断する。一時的なエラーやスロットリングエラーといったものはリトライするが、不正なリクエストといったリトライしても意味がないものはリトライしない。

- レスポンスの HTTP ステータスコード
- サービスから返されたエラーコード
- 接続に関するエラー (応答が受信できなかった場合)


### 再送間隔(バックオフ時間)

エクスポネンシャルバックオフ(指数的に増やした時間(例: 1,2,4,8,16,20,20,...))を最大値としてランダム化した時間を再送間隔とする。最大バックオフ時間は主に 20 秒だが、SDK によって異なる可能性がある。計算式で書くと以下のとおり。

再送間隔(秒) = min($b･2^{i}$, MAX_BACKOFF)
※$b$ = 0〜1 のランダム値, $i$ = 試行回数

### Retry Quota (adaptive モードのみ)

リクエストが失敗しがちな状況では連続でリトライしないようにすることでトラフィックを制御、輻輳を防止する機能。連続してリクエストできる量をトークンバケット方式で管理する。リクエストが失敗したら消費、成功したら補充し、空になった場合はリトライを諦める。

## 言語ごとの実装例

- Python (boto3): [legacy](https://github.com/boto/botocore/blob/master/botocore/retryhandler.py) / [standard](https://github.com/boto/botocore/tree/master/botocore/retries)
- PHP: [legacy](https://github.com/aws/aws-sdk-php/blob/master/src/RetryMiddleware.php) / [standard](https://github.com/aws/aws-sdk-php/blob/master/src/RetryMiddlewareV2.php)

## 関連

- [AWS SDK for Python (boto3) のリトライ・タイムアウト制御](https://qiita.com/yh1224/items/5bdf43307c4c97281e7e)
- [AWS SDK for PHP のリトライ・タイムアウト制御](https://qiita.com/yh1224/items/fcf89db4b559657ef686)
【苦戦した時の対処】仮想マシン動かない、vagrant upできない

## はじめに
仮想マシンを使ってWordPressの構築を行う際に、
なかなか`vagrant up`できない問題でしたので、
解決した内容を書きたいと思います。

## 環境
ホスト環境
mac OS Monterey  (12.5)
Vagrant:2.2.6
VirtualBox:6.1.0

## エラー内容


```:ターミナル
There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["hostonlyif", "create"]

Stderr: 0%...
Progress state: NS_ERROR_FAILURE
VBoxManage: error: Failed to create the host-only adapter
VBoxManage: error: VBoxNetAdpCtl: Error while adding new interface: failed to open /dev/vboxnetctl: No such file or directory
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component HostNetworkInterfaceWrap, interface IHostNetworkInterface
VBoxManage: error: Context: "RTEXITCODE handleCreate(HandlerArg *)" at line 95 of file VBoxManageHostonly.cpp

```
最近, macOSアップデートしたのですが、vagrantがうまく動かない原因はmacOSをアップデートしたからでした。
他参考にさせてもらった記事もアプデが原因で起こったという記事が多くそこに問題を感じた。

## VagrantとVirtualBoxを最新版にする

`まずはアンインストールをします`
```
brew cask uninstall virtualbox
brew cask uninstall vagrant

もしくは

brew uninstall virtualbox --cask  
brew uninstall vagrant --cask  
```

`次にインストールをします。`

```
brew cask install virtualbox
brew cask install vagrant

もしくは

brew reinstall --cask virtualbox
brew reinstall --cask vagrant
```

でアップデート出来ましたが、
またも同じエラーが出てしまいます。

そこで行ったのが、

## 仮想マシンの削除
Virtualboxを開いて、使用中の仮想マシンを削除

![スクリーンショット 2022-08-06 21.41.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/8e1ae57f-1e4e-e2dc-1b70-b30eee104bcd.png)


右クリック→除去！！

そして再度`vagrant up`

```
これが表示されたらオッケー！
  default: SSH auth method: private key
.
.

```
## 最後に
`vagrant ssh`で接続してログインすることができました。
![スクリーンショット 2022-08-06 21.48.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/859347/a9b91f0c-66bc-a6ad-a922-8b83b2c8e660.png)

filezillaの使用もでローカルで触ることが出来ます。

また忘れた頃にやってくるので、その時の自分に記しておきます。^^


##　参考記事
https://qiita.com/akane_kato/items/c103332729e3d0ac39e6
SagemathのCycle Indexを用いてピザの色分け問題を解く（その１）

前回[バーンサイドの補題を用いてピザの色分け問題を解く](https://qiita.com/masa0599/items/55559687baab78254448)という投稿をしました。今回はこれをSagemathのCycle Index(巡回指数)の機能を用いてより一般的な問題を解くことを目標とします。

まずは巡回指数というものを少しでも理解するために、色を使う回数に制限がない場合から見て行きます。

### 【例題 1】ピザの色分け問題 (3色・制限なし)
以下のように6個に切ったピザを3色で塗る方法は何通りあるでしょう。各色は何度使っても（使わなくても）良い。（回転したものは同じとみなす）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1922159/9af1f1c6-df7c-efc1-409d-7a505efca6be.png)

以下の手順で考えて行きます。
1. 群の置換を巡回置換表現で表す
1. 巡回指数を求める
1. 式に色の数を代入

#### 1. 群の置換を巡回置換表現で表す

巡回群C6なので6通りの回転を以下のように巡回置換表現で表し巡回指数の各項が出てきます。

| 回転置換 | 巡回置換表現 | 巡回指数の項 | 
| :--- | :--- | :---: | 
|[123456] | (1)(2)(3)(4)(5)(6) | $a_1^6$|
|[234561] | (123456) |$a_6$ |
|[345612] | (135)(246) |$a_3^2$ |
|[456123] | (14)(25)(36)  | $a_2^3$|
|[561234] | (153)(264) | $a_3^2$ |
|[612345] | (165432) |$a_6$  |


#### 2. 巡回指数を求める

巡回指数の各項を足してC6の位数６で割ると以下のように**巡回指数**$Z(C_6)$が求まります。詳しくは[Cycle index (Wikipedia)(英語)](https://en.wikipedia.org/wiki/Cycle_index)を参考にしてください。

```math 
Z(C_6) = \frac{1}{6}(a_1^6+a_2^3+2a_3^2+2a_6)
```

#### 3. 式に色の数を代入

この巡回指数からバーンサイドの補題のポイント **「回転して同じ形になるもの数を数えて回転の種類の数で割ったもの」** を利用して数え上げをして行きます。

例えば$a_3=(135)$に注目するとこれは$120^\circ$回転したときに$(135)$の色が同じになるということなので$a_3=3$(赤か緑か青)と置けます。同様にすべての$a_i=3$となるので、以下のように解答が得られます。

```math 
Z(C_6) = \frac{1}{6}(3^6+3^3+2 \times 3^2+2 \times 3) \\
= (729+27+18+6) / 6 = 130
```
### Sagemathで解く

この手順をSagemathを使って計算していきます。まず巡回群C6を定義して巡回置換表現をリストしてみます。単位元の
$(1)(2)(3)(4)(5)(6)$は$()$で表されています。

```python
S = CyclicPermutationGroup(6)
S.list()
# [(), (1,2,3,4,5,6), (1,3,5)(2,4,6), (1,4)(2,5)(3,6), (1,5,3)(2,6,4), (1,6,5,4,3,2)]
```

つぎに巡回指数(Cycle Index)を求めます。ちょっと表現が分かりずらいですが。$p[2,2,2]=a_2^3$という感じでざっくり理解してもらえばいいと思います。

```python 
P = S.cycle_index();P
# 1/6*p[1, 1, 1, 1, 1, 1] + 1/6*p[2, 2, 2] + 1/3*p[3, 3] + 1/3*p[6]
```

後はこの$p$の中の数に３を代入して計算して答えの130が得られました。

```python 
sum([i[1]*prod([3 for j in i[0]]) for i in P])
# 130
```

これだけだとそれほどSagemathのすごさは感じられませんが、[後編のその２](https://qiita.com/masa0599/items/0ecd9a0c6a746f0409ad)で十分にすごさが堪能できますので楽しみにしてください。

（開発環境：CoCalc, Sage Worksheet）
📖nbdev2入門＋Dockerによる環境構築



 
# nbdevとは

nbdevはライブラリ作成の多くを自動化して、少人数での大規模プロジェクト開発をサポートするツール。fastaiなどの開発に使われている。

前記事　https://qiita.com/lilacs/items/780123ecbb2936d493e7
公式トップページ　[nbdev – Jupyter Notebook で楽しいソフトウェアを作成する](https://nbdev.fast.ai/)
ドキュメント　[nbdev - Getting started](https://nbdev.fast.ai/getting_started.html)

## nbdev1からの更新点

### nbdevプロジェクトのセットアップが楽になった
   - `nbdev_new`コマンドでセットアップできるようになった。
   - 今まではGitHubでnbdev_templateでプロジェクト作成してから、ローカルへクローンする必要があり、ちょっと面倒だった。

### ドキュメント生成ツールはjekyllからQuartoに変更
- 今までのjekyllは難点が多かった。
  - rubyが必要だったりとインストールの手順が多く環境構築がつらい
  - インストール失敗が多い（docフォルダが未準備でjekyllインストールに失敗するなど）
  - ドキュメント更新後に、ローカルサーバでのプレビューが失敗したりする。（いったんdocフォルダを削除・再出力で解決したりする）

- Quartoは比較的新しいツールで、上記の難点がいくつか解決している
    - インストールが楽。nbdevユーザとしては`nbdev_install_quarto`を実行するだけ。内部的には１パッケージダウンロード・インストールしてる。

```python:nbdevソースコードの該当箇所
# https://github.com/fastai/nbdev/blob/263a9af6690587922fc5ce8de162ace8ddc2a530/nbdev/_modidx.py#L28
    nbdev_install=nbdev.shortcuts:install

# https://github.com/fastai/nbdev/blob/master/nbdev/shortcuts.py#L26
    system(f'curl -LO {BASE_QUARTO_URL}quarto-linux-amd64.deb')
    system('sudo dpkg -i *64.deb && rm *64.deb')
```

- Quartoチームは積極的に対応してくれてるぽい

> [nbdev+Quarto: A new secret weapon for productivity](https://www.fast.ai/2022/07/28/nbdev-v2/)
> Quartoは、Jupyter Notebook、VSCode、Observable、およびプレーンテキスト エディターをサポートするテクニカル パブリッシングを可能にするプロジェクトです。さらに、Quarto を使用すると、高品質の記事、レポート、Web サイト、ブログを HTML、PDF、ePub、PowerPoint スライドなどで公開できます。
> ...
> Quarto と nbdev は多くの目標を共有しており、Quarto チームは私たちの提案に非常に迅速に対応してくれました。

### その他
- Windowsでは動かないので、wslを使うこと（2022年8月6日）
- ライブラリ作成コマンドが`nbdev_build_lib`から`nbdev_export`に変更
   - 今までも、ビルドではなくコードを抜き出すだけだったので、妥当な名称になったと思う
- execnb　ノートブックをCLIで高速に実行するツール。テストが速くなる（nbdevでは、Notebookの実行成功をテストとするため）


## 変わらない点
- Notebookの記述方法は同じ
    - 例
        - `#|export`を付けたセルは*.pyへ出力
        - `#|hide`を付けたセルはドキュメントに出力しない
    - 参考　[📖nbdevの記述方法](https://qiita.com/lilacs/items/780123ecbb2936d493e7#nbdev%E3%81%AE%E8%A8%98%E8%BF%B0%E6%96%B9%E6%B3%95)


## 利用条件

-  macOS, Linux（WSL可）, ほとんどのUnix-style OS
- Python 3.9 以上　（nbdev_installで失敗する）

# Dockerによる環境構築
## 🐳Dockerイメージ
pytorchと一緒に使うために作成。nbdevはpython 3.9以上が必要だが、pytorch公式イメージはpython3.8までしかなかったため。（2022年8月6日）

🐳https://hub.docker.com/r/lilacs2039/fastai-nbdev
🐙https://github.com/lilacs2039/docker_fastai-nbdev

## 利用手順
```
# 本リポジトリの`docker-compose.yml`を取得
wget https://raw.githubusercontent.com/lilacs2039/docker_fastai-nbdev/main/docker-compose.yml
wget https://raw.githubusercontent.com/lilacs2039/docker_fastai-nbdev/main/Dockerfile

# 環境立ち上げ
sudo service docker start
docker compose up
```
Express + TypeScriptでexpress-sessionを利用する

### 初めに
Express + TypeScriptで開発を行う際に、sessionの設定方法がJavascriptと異なっていたため備忘録として投稿する。

### 環境
■ Nodeのバージョン
14.14.0
■ 使用OS
MacOS Big Sur：バージョン11.6
■ expressのバージョン
4.16.1
■ @types/express-sessionのバージョン
1.17.4
■ express-sessionのバージョン
1.17.2


### 設定方法
使用するパッケージをインストールする。
JavaScriptでは、express-sessionのみインストールしていたが、TypeScriptで使用するには@types/express-sessionが必要。

```shell
npm i express-session @types/express-session
```

app.tsに下記の記載を行う。


```ts
var session = require('express-session');
declare module 'express-session' {
  interface SessionData {
      user: any,
      like_arr: any
  }
}

var session_opt = {
  secret: 'secret',
  cookie: {maxAge: 60 * 60 * 1000}
};
app.use(session(session_opt));
```

アンビエント宣言内に、使用したいオブジェクトを追加することでTypeScriptにも対応できる。
session_optという変数には、cookieの有効時間等の情報を格納する。

### 使用例

```ts

import express from 'express';
const router = express.Router();
router.post('/sign_in', (req: express.Request , res: express.Response, next: express.NextFunction) =>  {
  (async () => {
      req.session.user = result;
      req.session.like_arr = like_arr;
      req.session.save();
      res.redirect('/');
    });
  })();
});
```

reqの型は、インポートしたexpressのRequestに設定することでsessionを使用可能。
GitHubのコンフリクトをブラウザ上で解消する方法(初心者向け)

今回は、GitHubのブラウザを使用してコンフリクトを解消する方法を記述します。
今までは基本的にコンフリクトを起こさないように開発をしていました。
しかし、その方法だと開発効率が落ちてしまうため本記事を投稿するに至りました。

それでは始めます。

### 環境
■ 使用OS
MacOS Big Sur：バージョン11.6
■ 総合開発環境
Visual Studio Code

### 初めに
今回は、「master」「test1」「test2」というブランチを用います。
具体的な使用用途は、「test1」のプルリクエストで、「master」ブランチの内容を変更し、「test2」のプルリクエスト時にコンフリクトを発生させます。
また、masterブランチには、ローカル、リモートリポジトリの両方で、下記のファイルを作成しています。
※ファイル名や内容は任意です。

```conflict.txt
masterブランチの記述です。
```

### コンフリクトのためのファイルを作成して、コミット・プッシュを行う
では、早速コンフリクトを発生させるためのプルリクエストを作成します。
まず、「test1」には

```conflict.txt
test1ブランチの記述です。
```

上記のような、「master」ブランチで記載していた内容とは異なる記述を行い、コミット・プッシュを行います。

次に、「test2」ブランチも、「test1」ブランチとは、異なる内容の変更を行います。

```conflict.txt
test2ブランチの記述です。
```

同じように「test2」ブランチも、コミット・プッシュを行います。


### プルリクエストを作成する
次に、「test1」「test2」ブランチで作成した内容を「master」ブランチにマージするためのプルリクエストを作成します。
「test1」のプルリクエストを作成したら「master」ブランチにマージします。
マージしたことにより「master」ブランチのファイルが下記に変更されます。

```conflict.txt
test1ブランチの記述です。
```

現時点では、「master」ブランチの内容が「test1」ブランチのプルリクエストをマージして最初のファイルとは異なる状況です。

### コンフリクト解消

次に、「test2」ブランチで作成したGitHubのプルリクエストの画面に遷移します。
すると、下記画像のような画面が表示されています。

![スクリーンショット 2021-11-15 23.43.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/ba683c0c-b4b5-4913-99d9-ce3da3e2e0d8.png)

これは、「test2」ブランチでは、「master」ブランチの内容を変更しようとしていたのに、「master」ブランチの内容が「test1」ブランチで変更した内容に変わっているためコンフリクト(衝突)が起きています。
これを解消するには、上図右上にある、「Resolve conflicts」ボタンをクリックします。

ボタンをクリックすると以下の画面に遷移します。
![スクリーンショット 2021-11-15 23.46.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/3696290e-99b3-cb33-99ca-f6f3a0f1a317.png)

「test2」ブランチで変更したコードが2行目に、現在の「master」ブランチ(test1ブランチマージ済)のコードが4行目に記載されています。
ここで、変更したい内容に修正し、右上にある「Mark as resolve」ボタンをクリックします。

変更内容はその時々で変わりますが、今回は下記画像のように変更をしました。
![スクリーンショット 2021-11-15 23.50.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/45a19923-da94-382b-d24f-eebcd3b681c5.png)

それでは、「Mark as resolve」ボタンをクリックします。
ボタンをクリックすると下記画像のように「Commit merge」ボタンが出力されるのでクリックします。
![スクリーンショット 2021-11-15 23.52.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/78969d26-56cd-a06b-7e8b-18b3806e2ea4.png)

コンフリクトが解消できると、プルリクエストに下記内容を変更した新たなコミットがされています。
![スクリーンショット 2021-11-15 23.55.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1229062/8416306e-c027-8531-7cb1-18da7fc65333.png)

これで、コンフリクトを解消してプルリクエストを作成することができます。
以上です。
ありがとうございました。
ホストPC(Ubuntu 22.04)をアップグレードしたらJupyterがクラッシュした話と対処法

# 1.この記事の内容

ホストPC(Ubuntu 22.04.1 LTS)のパッケージをアップグレードしたら，TensorFlowベースイメージ([tensorflow/tensorflow:latest-gpu-jupyter](https://www.tensorflow.org/install/docker?hl=ja#download_a_tensorflow_docker_image))をベースイメージとしたDockerイメージでJupyterがクラッシュするようになりました．

クラッシュする前に下記のメッセージが表示され，protocolのバージョンが合わなくなったようです（TensorFlowベースイメージが古い）．

```
[I 11:41:40.553 NotebookApp] Adapting from protocol version 5.1 (kernel 8334987e-49da-40e7-9bb3-2dbffba6b9e3) to 5.3 (client).
```

# 2.対処方法

[ipykernel](https://pypi.org/project/ipykernel/)を最新にしたらクラッシュしなくなりました．  
上記エラーメッセージの場合，バージョンは5.3以上でよいと思われますが，今回は最新へアップグレードする方法をとりました．

## 2-1.Dockerfileへの追記内容

```
RUN pip install --upgrade ipykernel
```

# 3.関連リンク

* [Messaging in Jupyter](https://jupyter-client.readthedocs.io/en/latest/messaging.html)
* [tensorflow/tensorflow:latest-gpu-jupyter](https://www.tensorflow.org/install/docker?hl=ja#download_a_tensorflow_docker_image)
* [ipykernel](https://pypi.org/project/ipykernel/)
C#開発

## 概要
C#開発で学んだことのメモ

## この記事で伝えたいこと
特になし

### linuxでC#をコンパイルして実行する方法
- Monoをインストールしてください。
C#のコンパイラーです。

- .csファイルを作成する。
今回はMain関数を持つMainProc.csとエンティティクラスのAnimal.csを作成しました。
```c#:MainProc.cs
using System;
namespace HelloWorld
{
    public class MainProc
    {
        public static void Main(string[] args)
        {
            Animal animal = new Animal();
            animal.setName("ライオン");
            animal.setAge(4);
            Console.WriteLine(animal.getAge());
            Console.WriteLine(animal.getName());
        }
    }
}
```
```c#:Animal.cs
using System;
namespace HelloWorld
{
    public class Animal
    {
        public Animal()
        {
        }

        private string m_name;
        private int m_age;

        public string getName()
        {
            return m_name;
        }
        public int getAge()
        {
            return m_age;
        }
        public void setName(string name)
        {
            m_name = name;
        }
        public void setAge(int age)
        {
            m_age = age;
        }
    }
}
```

- csファイルが格納されているディレクトリに移動する。
- コンパイルのコマンドを実行し、exeファイルを生成する。
```mcs MainProc.cs Animal.cs```

- exeファイルを実行する。
```mono MainProc.exe ```

実行結果です。
```
4
ライオン
```