OmniAICreator/Qiita-1.07M huggingface dataset:
GitLabCI/CDについて

### はじめに
GitLabCI/CDについて触る機会があったので備忘録代わりにまとめていきます。

### そもそもCICDって何？

![gitlab-説明資料1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1928016/e26ce01a-fccf-7312-7f71-6edc61e5e49f.png)

gitlab公式サイトから画像を引用。


CI/CDとはCI(継続的なインテグレーション)　CD（継続的デリバリー）の略。
CD（継続的デプロイ）もあります。

この字面から何となく想像がつく通り、

**CICDとは何か特定の技術を指している訳ではありません**。

技術ではなくソフトウェア開発手法を指してます。

CI(継続的なインテグレーション）ではリポジトリにpushされてきた時に自動でテストを行います。
自動でテストを行ってくれるのでバグの混入に気づきやすくなります。

CD（継続的デリバリー）ではCIでのテストが終了したものをテストサーバーにビルドし、動作確認が行えるというもの。

CDにはほかにもCD（継続的デプロイ）というものがある。
こちらは自動で本番環境へデプロイを行うこと。

#### CI/CDの何がいいの？

**自動でテストやデプロイを行ってくれるので、人的ミスを防げるし、開発の効率も向上する。**

仕様の修正が入る度に手動でテストを走らせるのは手間だし、アジャイルだと開発中に仕様が変更になるケースも多いのではないかなと思います。

#### GitLab CI/CD
GitLabでCI/CDを行う場合は、リポジトリのルートディレクトリ直下に

.gitlab-ci.ymlという名前のファイルを作成するだけ。

.gitlab-ci.ymlというファイル名をGitLabが検知して、GitLab Runnerが走る。

GitLabRunnerは複数の動作方式が用意されていて、今回はdockerを使用。

下のコードは公式サイトから引用したもの。

```.gitlab-ci.yml
before_script:
  - apt-get install rubygems ruby-dev -y

run-test:
  script:
    - ruby --version
```

このbefore_scriptはジョブを実行する前に処理が走る。
なので各ジョブに共通の依存関係を持たせたいパッケージのインストールを行う際にこちらのbefore_script属性を使用する。
上記のサンプルコードの場合、before_script属性の処理が走った後に、run_testというジョブが実行される。

before_script以外にも複数の予約語が用意されており、GitLab CICDでやれることは多いのかなと思います。

https://gitlab-docs.creationline.com/ee/ci/yaml/README.html



#### 参考にしたサイト

> https://gitlab-docs.creationline.com/ee/ci/introduction/
【AWS】CDKv2で環境構築　StepFunctions編

# はじめに
現在運用中の環境をテスト用として複製する際に`CDKv2`を用いて
コード化することになったのでその学びです。

[DynamoDB編はこちら](https://qiita.com/yamato1491038/items/f388afa3aa4f701321f5)
[Lambda編はこちら](https://qiita.com/yamato1491038/items/6a3eb65688389a5d6e31)
[Cognito編はこちら](https://qiita.com/yamato1491038/items/bbef1df21e54e22d36ca)
[apigateway編はこちら](https://qiita.com/yamato1491038/items/63fc91325c6f72464b49)


# 準備

このへんの記事でまずは環境設定
https://aws.amazon.com/jp/getting-started/guides/setup-cdk/

今回は`TypeScript`を用いて実装しました。

```
$ cdk init --language typescript
```

# StateMachine作成
今回作成するものは指定時刻になるとLambdaを呼び出すシンプルなものです。

```typescript:main-stack.ts
import * as stepfn from 'aws-cdk-lib/aws-stepfunctions';
import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks';

export class MainStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // 指定時間まで待つ
    const wait = new stepfn.Wait(this, 'Wait until a specific date and time', {
      time: stepfn.WaitTime.timestampPath('$.timestamp'), // 今回は入力された項目のtimestamp項目を参照
    });

    // 指定時間後に呼び出すタスク（Lambda）
    const sample_task = new tasks.LambdaInvoke(this, 'Scheduled task', {
      lambdaFunction: sample_fn, // Lambda編で作成したsample_fn
    });

    // ステートマシンの作成
    new stepfn.StateMachine(this, 'Sample-Schedule', {
      definition: wait // 上で作成したwait
        .next(sample_task), // 上で作成したtask
      stateMachineName: 'Sample-Schedule',
    });
```

まずは`task`を定義する。
`StateMachine()`でステートマシンを作成し、
`definition:`でその内容（順序）を指定する。
`next()`をつなげて順序を定義していく。

Waitの種類については以下参照↓
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_stepfunctions.WaitTime.html


# ドキュメント
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_stepfunctions-readme.html

Taskについては別途参照
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_stepfunctions_tasks-readme.html
LPIC 102合格体験記

この記事ではLPIC 102の取得にあたっての流れや学習方法を紹介します。
基本的にはLPIC101と同様の学習方法で進めました。
LPIC101合格体験記：https://qiita.com/takasho9321/items/99099648631c06f3b52b

# 目次
- [受験の経緯](#受験の経緯)
- [学習に使った教材](#学習に使った教材)
- [学習の期間と流れ](#学習の期間と流れ)
- [ping-tを2周して知識をインプット](#ping-tを2周して知識をインプット)
- [スピマスの問題集を2周実施](#スピマスの問題集を2周実施)
- [ping-tの模擬試験を実施](#ping-tの模擬試験を実施)
- [試験前日にスピマスの模擬試験を実施](#試験前日にスピマスの模擬試験を実施) 
- [本番試験](#本番試験)
- [試験の感想](#試験の感想)
- [教材のリンク](#教材のリンク)

# 受験の経緯
- Linuxの知識を獲得する為

# 学習に使った教材
- ping-t 問題集
- スピマス
- 実機でコマンドの動作確認

# 学習の期間と流れ
**1. 学習期間**
2021年9月中旬～2022年10月上旬


**2. 学習の流れ**

| 開始日 | 終了日 | 学習内容 |
|:-----------|:------------|:-----------------------------------------------------------|
| 2021/09/11  | 2021/09/29  | ping-tの最強WEB問題集を2周 　　　　　　　 |
| 2021/09/30  | 2021/10/01  | ping-tの模擬試験を3回　　　　　　　 |
| 2021/10/02   | 2021/10/07   | スピマスの問題集を2周         |
| 2021/10/08  | 2021/10/08   | スピマスの模擬試験を1回      |
| 2021/10/09   | 2021/10/09   | 本番試験で合格      |

# ping-tを2周して知識をインプット
ping-tの最強WEB問題集を2周やりました。
LPIC101と同様に知識の積み上げを目的として活用しました。
1周目の全体的な正答率は55%前後でした。
とにかく分からない用語はネットでググって理解を深めました。
それでも理解できない場合は、AWS上にEC2インスタンスのLinuxサーバを立ててコマンドの出力結果を確認しながら理解を深めました。
実機でコマンド叩いて実際の挙動を確認するのはイメージがつきやすくは覚えやすいと個人的に感じました。
その為、1周目はかなり時間がかかりました。
ただし、2周目の正答率は69%と101の学習に比べて正答率がかなり低かったです。

# ping-tの模擬試験を実施
問題集の2周目の正答率がかなり低かったので力試しで模擬試験を実施してみましたが、正答率が85%と思いのほか良かったので、残り1週間でスピマスの問題集を実施して試験に臨むことを決意しました。

# スピマスの問題集を2周実施
ping-tの模擬試験が85%であるにも関わらずスピマスの正答率は50%とかなり低かったです。
LPIC101同様に体感だと本番試験よりも難易度が高いと感じました。
その為、スピマスの正答率が低くても落ち込む必要は無く、本番を想定した問題演習の位置付けで取り組むと良いかと思います。
また、スピマスの問題が試験にそのまま複数出題されたのでスピマスの問題集を最低でも1周実施しておくことを強くお勧めします。

# 試験前日にスピマスの模擬試験を実施
試験前日に最終確認としてスピマスの模擬試験を実施しました。
正答率は58%でしたが、本番試験よりも難しかったです。
その為、正答率が6割超えていれば確実に合格できるかと思います。

# 本番試験
そしていよいよ本番試験。
択一式の問題がメインで、記述式の問題は6~8問ぐらいでした。(2021/10/09 時点)
ベンダー系の資格特有ですが問題文をちゃんと翻訳してくれないので分かりにくい部分は英語に直して読むといった工夫も必要になります。

個人的な体感の正答率は7~8割くらい。
結果は680点で正答率は8.5割と余裕を持って合格出来ました。

# 試験の感想
参考書に比べて実際の試験問題の方が難易度が低いと感じました。
その為、ping-tとスピマスの内容が理解出来ていれば十分に合格できると感じました。
各コマンドや単語をきちんと理解しておくことが重要になります。
少しでも学習の参考になれば幸いです。

# 教材のリンク
ping-t：
https://ping-t.com/

Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応 単行本（ソフトカバー）：
https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version5-0%E5%AF%BE%E5%BF%9C-%E5%B1%B1%E6%9C%AC/dp/4798160857
【覚書】ABC257-B: 1D Pawn

覚書です。
# 概要
## URL
[問題ページ](https://atcoder.jp/contests/abc257/tasks/abc257_b)
[公式解説](https://atcoder.jp/contests/abc257/editorial/4180)

## 入力
n： マス数
k： コマ数
q： 操作数
a_i： 左から`i + 1`つ目のコマの初期位置
l_i： `i + 1`番目に操作するコマの番号

```
n k q
a_1 a_2 ... a_k
l_1 l_2 ... l_q
```

## 操作
配列`l`で指定されたコマをひとつ右に動かす。このとき、
* 右に別のコマが存在する
* コマの位置が最右（それ以上右にマスが存在しない）である

場合は操作を行わない。
## 出力
左から`index + 1`つ目のコマの初期位置を空白区切りで出力する

```
b_1 b_2 ... b_k
```

# 提出コード
```kotlin
fun main(args: Array<String>) {
    // 入力
    val (n, k, q) = readLine()!!.split(" ").map(String::toInt)
    val a = readLine()!!.split(" ").map(String::toInt)  // 各コマの初期位置
    val l = readLine()!!.split(" ").map(String::toInt)  // 操作

    // マスを定義
    var math = MutableList(n) { 0 }

    // マス上にコマを配置
    for(i in a.indices) math[a[i] - 1] = i + 1

    // コマの位置を記録
    var pieceIndexes = mutableListOf<Int>()
    math.forEachIndexed { index, i ->
        if(i != 0) pieceIndexes.add(index)
    }

    // 操作
    var mathIndex: Int  // 指定したコマの存在するマス
    for(i in l) {
        mathIndex = pieceIndexes[i - 1]

        // 例外処理
        if(mathIndex + 1 >= math.size) {
            continue
        }
        if(math[mathIndex + 1] != 0) {
            continue
        }

        math[mathIndex + 1] = math[mathIndex]
        math[mathIndex] = 0
        pieceIndexes[i - 1]++
    }

    // 出力
    var out = mutableListOf<Int>()
    math.forEachIndexed { index, it ->
        if(it != 0) out.add(index + 1)
    }
    println(out.joinToString(" "))
}
```

## 課題点
* 「コマの初期位置を記録する配列」「マス状態を記録する配列」「移動したコマの位置を記録する配列」など、同じオブジェクトの状態を扱う変数が複数に分かれている
    * これによって記述中にすごく混乱した
    * そもそも一時配列に擬似的にマスを再現する必要がない（各コマの経過だけ追えばいい）

## 解決法
* 変数`a`を各コマの位置遷移を記録する変数として利用する

## 付記
配列への挿入に`+=`演算子を利用していたが、実行環境では対応していない(コンパイルエラーを吐いてしまった)ため、`MutableList.add()`で代用している。

# リファクタリング後
```kotlin
fun main(args: Array<String>) {
    val (n, k, q) = readLine()!!.split(" ").map(String::toInt)
    var a = readLine()!!.split(" ").map(String::toInt).toMutableList()  // 各コマの初期位置
    val l = readLine()!!.split(" ").map(String::toInt)  // 操作

    l.forEach {
        // コマが端にある場合はパス
        if(a[it - 1] == n) {
            return@forEach
        // 最右のコマなら動かす(14行目のIndexError対策)
        } else if(it == k) {
            a[it - 1] += 1
        // 動かすコマの移動先にコマがなければ動かす
        } else if((a[it - 1] + 1) < a[it]) {
            a[it - 1] += 1
        }
    }

    // 出力
    println(a.joinToString(" "))
}
```
【AWS】CDKv2で環境構築　apigateway編

# はじめに
現在運用中の環境をテスト用として複製する際に`CDKv2`を用いて
コード化することになったのでその学びです。

[DynamoDB編はこちら](https://qiita.com/yamato1491038/items/f388afa3aa4f701321f5)
[Lambda編はこちら](https://qiita.com/yamato1491038/items/6a3eb65688389a5d6e31)
[Cognito編はこちら](https://qiita.com/yamato1491038/items/bbef1df21e54e22d36ca)
[StepFunctions編はこちら](https://qiita.com/yamato1491038/items/7393c910f70bf241ed62)


# 準備

このへんの記事でまずは環境設定
https://aws.amazon.com/jp/getting-started/guides/setup-cdk/

今回は`TypeScript`を用いて実装しました。

```
$ cdk init --language typescript
```

# オーソライザーの作成
今回はオーソライザーを使用したAPIGatewayの作成をします。
まず先にオーソライザー作成が必要です。

```typescript:main-stack.ts
import * as cognito from 'aws-cdk-lib/aws-cognito';

export class MainStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // オーソライザー作成
    const sample_authorizer = new apigw.CognitoUserPoolsAuthorizer(this, 'Sample_authorizer',{
        authorizerName: 'sample-authorizer',
        cognitoUserPools: [UserPool], // Cognito編で定義したUserPoolを指定しています
    });
  }
}
```

# api作成

```typescript:main-stack.ts
import * as cognito from 'aws-cdk-lib/aws-cognito';

export class MainStack extends cdk.Stack {
  constructor(scope: cdk.App, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // オーソライザー作成
    const sample_authorizer = new apigw.CognitoUserPoolsAuthorizer(this, 'Sample_authorizer',{
        authorizerName: 'sample-authorizer',
        cognitoUserPools: [UserPool], // Cognito編で定義したUserPoolを指定しています
    });

    const sample_api = new apigw.RestApi(this, 'Sample-api', {
      restApiName: 'sample-api',
      endpointTypes: [apigw.EndpointType.REGIONAL],
      deployOptions: {
        stageName: "v1", // デフォルトでprod
      },
    });
    sample_api.root
    .addResource('{proxy+}', {
      defaultCorsPreflightOptions: { // リソースに対してCORS設定　optionメソッドが追加される
        allowOrigins: apigw.Cors.ALL_ORIGINS,
        allowMethods: apigw.Cors.ALL_METHODS,
        allowHeaders: apigw.Cors.DEFAULT_HEADERS,
        statusCode: 200,
      },
    })
    .addMethod('ANY', new apigw.LambdaIntegration(sample_fn, { // Lambda編で作成したsample_fnを指定
      proxy: true, // Lambdaプロキシ設定
    }), {
      authorizer: sample_authorizer, // オーソライザー指定
      methodResponses: [ // メソッドレスポンス設定（必要な場合は）
        {
          statusCode: "200",
          responseModels: {
            'application/json': apigw.Model.EMPTY_MODEL
          },
        },
      ]
    });

  }
}
```

`root.addResource()`でルートにリソース設定。
`addMethod()`でメソッド設定し、apigw.LambdaIntegration()でLambdaを指定する。

# オーソライザーでの注意点
apiを複数作成するが、同じユーザープールのオーソライザーを使用することはあると思います。
しかし、オーソライザーとAPIは１対１である必要があるため、apiの数だけオーソライザー（必要な場合は）は作成する必要があります。

# ドキュメント
https://docs.aws.amazon.com/cdk/api/v2/docs/aws-cdk-lib.aws_apigateway-readme.html
GitHub Copilotのメモ

# GitHub Copiotとは
GitHubが提供するコード入力補完機能。AIがコード自動生成してくれる。
https://docs.github.com/en/copilot/overview-of-github-copilot/about-github-copilot

# 利用開始
- 登録してエディタに拡張機能を追加する
- 支払い
    - 支払い先にPaypal可
    - 無料期間は2か月
https://github.com/features/copilot/

# 設定
- Visual Studio CodeとGitHub連携時のリダイレクト成功結果が表示されなかった？使えているので成功したものと思われる。 
- GitHub側のSettingで、Suggestions matching public code の Allow or Blockで何が変わるのか不明。機能のON/OFFではない？
https://github.com/settings/copilot
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/228134/f57e8df0-9dd1-738d-4043-4b78a79b78cc.png)

# 他気になったこと
- Ctrl + Enter で複数候補を出せる
- 英語ドキュメントのみ
- ブラウザ(Visual Studio Code for web)は非対応
- 用語
    - ユーザーエンゲージメントデータ：Copilotの利用履歴
    - コードスニペットデータ：設定のチェックを有効にしたら収集される
    - https://github.com/features/copilot#faq-privacy
- 類似サービス
    - [Amazon CodeWhisperer](https://aws.amazon.com/jp/codewhisperer/) ※まだ使えない
    https://aws.amazon.com/jp/blogs/aws/now-in-preview-amazon-codewhisperer-ml-powered-coding-companion/
- [AWS Copilot](https://aws.amazon.com/jp/containers/copilot/)との関連は無い
    https://aws.amazon.com/jp/blogs/news/introducing-aws-copilot/

- 著作権の課題：未決着
https://gigazine.net/news/20220627-github-copilot-blame/
CSSだけで作る簡単SPA

# CSSだけで作る簡単SPA（シングルページアプリケーション）

## 今回作ったもの（「戻るボタン」で前のページに戻れる）
![2022-06-26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/471258/c4644f2b-afeb-2e4e-a6fa-f28e9f40eed2.png)
- [応用したサイト](https://mf3px.sakura.ne.jp/simple_spa/#p1)
- 基礎的なデモ
<p class="codepen" data-height="300" data-default-tab="html,result" data-slug-hash="eYMOJRm" data-user="masa_mf3" style="height: 300px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid; margin: 1em 0; padding: 1em;">
  <span><a href="https://codepen.io/masa_mf3/pen/eYMOJRm">CSSで作った簡単SPA</a></span>
</p>
<script async src="https://cpwebassets.codepen.io/assets/embed/ei.js"></script>


## SPAとは？
SPAとは、"Single Page Application"の略で、**単一のページで作られたサイトやアプリケーション**のことです。ページが切り替わる際にリロードせずに遷移します。

## SPAをCSSで作れるの？
一般的にSPAは、ReactやVue.jsなどのフレームワークを用いて構築されます。今回はHTMLとCSSのみでさくっとSPAもどきを作ってみました。ただし、ページは瞬時に遷移しますが、実際のSPAのような非同期通信は行いません。

## このSPAの特徴
- 「#（ハッシュ）」で画面遷移をする
- 戻るボタンで前のページに戻ることができる
- CSSの「display: none」で見え隠れさせる

## 実際のコードの説明

### HTML
- リンク先を「#（ハッシュ）」で設定し、それをページごとにidで設定します。
- 各ページのdivに「page」というクラス名を振ります（CSSで説明します）。

```HTML:index.html
<!--リンクボタン（常に上に表示）-->
<div>
    <h1>CSSで作った簡単SPA</h1>
    <a href= "#p1">ページ1</a>
    <a href= "#p2">ページ2</a>
    <a href= "#p3">ページ3</a>
</div>

<!--ページ1-->
<div class= "page"  id= "p1">
    <h2>ページ1</h2>
    <p>こちらが「ページ1」です</p>
</div>

<!--ページ2-->
<div class= "page"  id= "p2">
    <h2>ページ2</h2>
    <p>こちらが「ページ2」です</p>
</div>

<!--ページ3-->
<div class= "page"  id= "p3">
    <h2>ページ3</h2>
    <p>こちらが「ページ3」です</p>
</div>
```

### CSS
- ハッシュがそのidと一致しない時、「display: none」を設定します。
- ハッシュがそのidと一致する時、「display: block」を設定します。

```CSS:style.css
/*ページの見え隠れ*/
.page:not(:target){
    display: none;
}
/*URLのフラグメントに一致するidをもつとき*/
.page:target{
    display: block;
}
```

## これで完成です！
以上でページ遷移の仕組みが完成しました。すごくシンプルです。
ただのJavaScriptを使わずシンプルで、**「戻るボタン」で前のページにも戻ることができる**のが魅力です。
本物のSPAのように、差し替えたい部分を非同期通信で取得するのではなく、簡単なハッシュとCSSを活用したSPAでした！
- [これを応用して作ったサイト（シンプル版）](https://mf3px.sakura.ne.jp/simple_spa/#p1)
LPIC 101の合格体験記

この記事ではLPIC 101の取得にあたっての流れや学習方法を紹介します。

# 目次
- [受験の経緯](#受験の経緯)
- [学習に使った教材](#学習に使った教材)
- [学習の期間と流れ](#学習の期間と流れ)
- [ping-tを2周して知識をインプット](#ping-tを2周して知識をインプット)
- [スピマスの問題集を2周実施](#スピマスの問題集を2周実施)
- [試験1週間前にping-tの模擬試験を実施](#試験1週間前にping-tの模擬試験を実施)
- [試験前日にスピマスの模擬試験を実施](#試験前日にスピマスの模擬試験を実施) 
- [本番試験](#本番試験)
- [試験の感想](#試験の感想)
- [教材のリンク](#教材のリンク)

# 受験の経緯
- Linuxの知識を獲得する為

# 学習に使った教材
- ping-t 問題集
- スピマス
- 実機でコマンドの動作確認

# 学習の期間と流れ
**1. 学習期間**
2021年7月末～2022年9月上旬


**2. 学習の流れ**

| 開始日 | 終了日 | 学習内容 |
|:-----------|:------------|:-----------------------------------------------------------|
| 2021/07/31  | 2021/08/24  | ping-tの最強WEB問題集を2周 　　　　　　　 |
| 2021/08/24   | 2021/09/05   | スピマスの問題集を2周         |
| 2021/09/05  | 2021/09/08  | ping-tの模擬試験を3回　　　　　　　 |
| 2021/09/08  | 2021/09/08   | スピマスの模擬試験を1回      |
| 2021/09/09   | 2021/09/09   | 本番試験で合格      |

# ping-tを2周して知識をインプット

ping-tの最強WEB問題集を2周やりました。
実際の試験問題と似たような問題は少し出題されますが、どちらかというと知識の積み上げを目的として活用しました。
1周目の全体的な正答率は50%前後でした。
とにかく分からない用語はネットでググって理解を深めました。
それでも理解できない場合は、AWS上にEC2インスタンスのLinuxサーバを立ててコマンドの出力結果を確認しながら理解を深めました。
実機でコマンド叩いて実際の挙動を確認するのはイメージがつきやすくは覚えやすいと個人的に感じました。
その為、1周目はかなり時間がかかりました。
ですが、1周目に時間をかけたおかげで理解度が上がったことで2周目の正答率は85%とかなり良かったです。

# スピマスの問題集を2周実施
ping-tの問題集を2周実施した後にもかかわらず、スピマスの正答率は50%とかなり低かったです。
体感だと本番試験よりも難易度が高いと感じました。
その為、スピマスの正答率が低くても落ち込む必要は無く、本番を想定した問題演習の位置付けで取り組むと良いかと思います。
また、スピマスの問題が試験にそのまま複数出題されたのでスピマスの問題集を最低でも1周実施しておくことを強くお勧めします。

# 試験1週間前にping-tの模擬試験を実施
スピマスが2周終わったタイミングでpinu-tの模擬試験を複数回実施しました。
正答率は80～90%と高く、試験も受かる自信がありました。

# 試験前日にスピマスの模擬試験を実施
試験前日に最終確認としてスピマスの模擬試験を実施しました。
正答率は77%でしたが、本番試験よりも難しかったです。
その為、正答率が6割超えていれば確実に合格できるかと思います。

# 本番試験
そしていよいよ本番試験。
択一式の問題がメインで、記述式の問題は5~7問ぐらいでした。(2021/09/09 時点)
ベンダー系の資格特有ですが問題文をちゃんと翻訳してくれないので分かりにくい部分は英語に直して読むといった工夫も必要になります。

個人的な体感の正答率は8.5～9割くらい。
結果は750点と正答率9割超えたので余裕を持って合格出来ました。

# 試験の感想
ping-tとスピマスの内容が理解出来ていれば十分に合格できると感じました。
各コマンドや単語をきちんと理解しておくことが重要になります。
少しでも学習の参考になれば幸いです。

# 教材のリンク
ping-t：
https://ping-t.com/

Linux教科書 LPICレベル1 スピードマスター問題集 Version5.0対応 単行本（ソフトカバー）：
https://www.amazon.co.jp/Linux%E6%95%99%E7%A7%91%E6%9B%B8-LPIC%E3%83%AC%E3%83%99%E3%83%AB1-%E3%82%B9%E3%83%94%E3%83%BC%E3%83%89%E3%83%9E%E3%82%B9%E3%82%BF%E3%83%BC%E5%95%8F%E9%A1%8C%E9%9B%86-Version5-0%E5%AF%BE%E5%BF%9C-%E5%B1%B1%E6%9C%AC/dp/4798160857
潜在因子分析(LFA)による欠損値の補完

# 目次

1.はじめに
2.前提
3.研究背景
4.提案手法
5.潜在因子分析による欠損値の補完
6.今後
7.参考文献

# はじめに
オンライン学習についての論文に目を通していく中で，**潜在因子分析(LFA)による欠損値の補完[[1]](https://ieeexplore.ieee.org/abstract/document/9506984?casa_token=TJ9qwLPbE24AAAAA:Z2zfITNU_oKtKv-vlMnfX4Rs2PTXxgaNFTHMO6zi1-xIS4lbVtgqgXyCZmi_7zlkjdnyyRITkr0)**　についての論文を読んだので，まとめておきます．

# 前提
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627906/d18dace8-8e28-aa34-e319-0ce7b6e5013f.png" width=50%>

上図のように特徴量が時間と共に増加していくようなデータをストリーミング特徴量データをする．

# 研究背景
- 実際のストリーミング特徴量データでは欠損値が含まれることが多いにも関わらず、既存のオンライン特徴量選択(OSFS)の手法は欠損値を考慮されていない。

- 高次元かつスパース(欠損値を含むという意味)なデータに対しては潜在因子分析(LFA)を用いた欠損値推定が高い精度を持つことが知られている。


# 提案手法
潜在因子分析(LFA)を用いた欠損値処理をストリーミング特徴量データ対応するように拡張し、既存のオンライン特徴量選択(OSFS)の手法と結びつけたLOSSAというフレームワークを提案している。LOSSAの流れは以下の通り．
![スクリーンショット 2022-06-26 16.01.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627906/3823cade-5eb1-240e-4eb1-63187489eed3.png)

# 潜在因子分析による欠損値の補完

**指針**：既知なデータのみに基づいて潜在因子行列を学習することにより、その欠損データを推定する

##### 前提
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627906/0f65902d-3322-49dd-5c43-0ec89986ee19.png" width=80%>

また，欠損値を含んだ行列を$B$とおき，欠損値を補完した行列を$\hat{B}$とおく．
![スクリーンショット 2022-06-26 16.15.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627906/044ce45c-3712-3c27-2d36-1d2b9a2ab952.png)

そして，$\hat{B}=UV^T$ とおけるものとする．


つまり，$U$と$V$を求めることで$\hat{B}$を得ることができる．

![スクリーンショット 2022-06-26 16.47.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627906/29c26211-9a99-67bc-3954-cb5882328bb3.png)

$\hat{B}$と$U$と$V^T$の対応関係は以下のようになる．
![スクリーンショット 2022-06-26 16.49.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627906/e2263e72-70ce-37e3-d774-1d476d7a85aa.png)

##### 目的関数

目的関数は以下のようになる．
既知のデータのみに基づいて，目的関数は最小化されている．

![スクリーンショット 2022-06-26 16.50.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627906/dc3593aa-dfe3-25b7-bf22-4157960785aa.png)

##### 更新式

更新式は以下のようになる．
ここでは，実装の容易さと収束の速さから確率的勾配降下法が用いられている．


![スクリーンショット 2022-06-26 16.59.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627906/6fb9e73f-1c73-df74-0821-623a97849fe2.png)

# 今後

実装と引用元の論文を見ていきたいと思います

# 参考文献
[1][A Latent Factor Analysis-Based Approach to Online Sparse Streaming Feature Selection](https://ieeexplore.ieee.org/abstract/document/9506984?casa_token=TJ9qwLPbE24AAAAA:Z2zfITNU_oKtKv-vlMnfX4Rs2PTXxgaNFTHMO6zi1-xIS4lbVtgqgXyCZmi_7zlkjdnyyRITkr0)
Firebase In-App Messagingを試してみる（iOS）

# 概要
- アプリ内で表示させるポップアップを広報担当者レベルで出したいという要望が出そうなため、Firebaseコンソール画面で操作できるFirebase In-App Messagingを試してみる。BigQuery連携してユーザーセグメントを作成していければサーバー担当者の負担を減らせないかな・・・。

# Firebase In-App Messagingについて
- ドキュメント
    - https://firebase.google.com/docs/in-app-messaging?hl=ja
- Firebaseコンソール
    - https://console.firebase.google.com/?hl=ja

# 前提
- Firebaseプロジェクトを作成していること
    - [Firebase を Apple プロジェクトに追加する](https://firebase.google.com/docs/ios/setup?hl=ja)

## プロジェクトに Firebase In-App Messaging SDK を追加する（podでも良さそう）
- XCodeを開き、File > Add Packageを選択する。
![ss 2022-06-25 11.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/992f0328-00bb-a9fb-57af-9002eb7bf2ee.png)

- ダイアログ右上の検索バーに`https://github.com/firebase/firebase-ios-sdk`を入力すると`firebase-ios-sdk`が表示されるので、Add Packageする。
![ss 2022-06-25 11.11.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/ccd251c0-db7d-35bf-17e2-c0136c826601.png)

- Firebase In App Messaging を選択して、Add Packageする。（2種類あるけど、どちらか片方で良いのだろうか）
![ss 2022-06-25 11.16.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/8de19af7-63e8-187b-2a38-3e3ccaf27f4a.png)

- AppDelegateで下記を記述する。
    - `import Firebase`
    - didFinishLaunchingWithOptionsメソッド
        - `FirebaseApp.configure()`

## Firebase Install ID を確認する
- デバイスを特定するためにFirebase Install IDが必要になる。テストデバイスのためにInstall IDを取得する方法があるので確認する。
- XCodeからEditScheme > Run > Arguments > FIRDebugEnabledを追加する。
- アプリを実行し、デバッグコンソールを確認する。
    - Firebase Installation ID `xxxxxxxxxxxxxxx`

## Firebaseコンソール画面からテスト実行する
- Firebaseコンソール画面からIn-App Messaging を選択し、キャンペーンの作成を選択 > アプリ内メッセージングを選択する。
- メッセージレイアウトでモーダルを設定する。
- メッセージタイトルを設定する。本文は任意設定する。
![ss 2022-06-25 13.24.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/78236eec-82b4-1354-e983-837901b94503.png)
- URLも任意で設定可能、URLスキームも設定できる。
    - Delegateで実装しておくことで、ポップアップを操作したときの挙動を拾うこともできそう。
    - [Firebase In-App Messaging のメッセージの動作を変更する](https://firebase.google.com/docs/in-app-messaging/modify-message-behavior?hl=ja&platform=ios)


※~~画像を表示するためには`Blazeプラン`（従量課金制）にアップデートする必要があるので注意する。~~
（2022年11月21日編集）
誤っていたので修正。画像をCloud Storageへとアップロードするには`Blazeプラン（従量課金制）`が必要ですが、単にポップアップ上に画像を表示するだけであれば、課金は不要っぽいです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/383e0610-edda-1de5-d675-6a641e6b3f2a.png)

- デバイスのプレビューで「デバイスをテスト」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/5106372c-aeee-80da-6ffb-28d1604535d2.png)

- XCodeで取得したインストールIDを設定し、テストを押下する。
![ss 2022-06-25 13.25.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/9d639364-ebf3-230c-c04c-2387bda9ff9e.png)

- アプリを起動するとポップアップが確認できる。
![ss 2022-06-25 12.17.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/245300/8907f35a-ab81-1934-804b-f41a07659dde.png)

# まとめ
- Firebase In-App Messagingでモーダルなポップアップを表示することができた。
- URLスキームも設定できる、ポップアップタップ時のイベントもDelegateで拾える。
- Firebaseプロジェクトを従量課金制にしておけば画像も設定できる。
- FirebaseAnalytics、BigQueryと連携してユーザーセグメントを作成できれば、サーバー担当者の業務を一つ減らせるかも。
- AnalyticsのロギングやBigQuery連携・セグメント作成あたりも試しておきたい。
Vueのエラーを解決する#1：Module not found

業務で使うのでVue.jsを勉強しています。
vue-cliでプロジェクトを作成し、ページを追加したいので処理を実装し、npm run serve で実行してみたらエラーが出たので、調べて解決します。

出たエラーは以下の画像の通りです。

![20220626_Vueエラー画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/97293a0e-8b25-3916-8a12-0328c1c84af8.png)

「Module not found」って何だろう？何かが見つからないよ、と言われていることはわかります。エラーメッセージを続けて読むと./views/Count.vueがrouterの中にないよ、と言われているみたい。

そもそも1行目に「error in ./src/router/index.js」って書いてあった。
./src/router/index.jsを確認。

viewsフォルダに作成したファイルはCountView.vueなのにCount.vueをcomponentに渡してしまっていたので修正。

```
component: () => import('../views/CountView.vue')
```

無事、コンパイルが通りました。
![20220626_エラー解決画像.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2725725/9f3ad9e6-4132-94c8-0577-9e96e478aa57.png)

存在しないソースファイルをrouterに渡すとこんなエラーが出る、ということでひとつ勉強になりました。
Hugo + GitHub PagesでNo url found for submodule pathが出てデプロイに失敗してしまった時の解決策

## エラー
１年ぶりくらいにHugoを使ってGitHub Pagesに上げているリポジトリを更新しようとしたらデプロイに失敗しました  
```
Error: fatal: No url found for submodule path 'themes/hugo-identity-theme' in .gitmodules
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/190874/8a42af83-852d-fad6-a742-cb72d9d5a3e4.png)

今までは`config.toml`のテーマの部分を見てsubmoduleをいい感じに参照してくれてたのかなぁと思うのですが
何かしらの仕様変更でうまいこと見れなくなってしまったのではないかと思います

## 解決方法
明示的に`.gitmodules`を追加してあげて参照できるようにしました
```.gitmodules
[submodule "themes/hugo-identity-theme"]
path = themes/hugo-identity-theme
url = https://github.com/aerohub/hugo-identity-theme
```

元々の仕様をちゃんと理解してなく解決までに少しハマってしまいました
CloudSQL ユーザ認証方式検討

# ユーザ認証方式検討 / IaC検討
## まえがき
CloudSQL(PostgreSQL/MySQL)のユーザ認証方式を検討したのでここに書き記しておきます。

- ユーザ認証方式検討 (本記事)
- [PostgreSQLのユーザ構成管理(IaC) -Anasible編- ](https://qiita.com/drafts/955f83f4acaa003a7560/edit)
- [PostgreSQLのユーザ構成管理(IaC) -Terraform編-](https://qiita.com/tp7hayct/items/9d7f3489f741866835a3)
- MySQLのユーザ構成管理(IaC) -Anasible編- (記事がかけたらリンク張る)
- MySQLのユーザ構成管理(IaC) -Terraform編- (記事がかけたらリンク張る)

## 比較した認証方式
### Cloud IAM
- メリット
  - cloud_sql_proxyがBastionの代わりを用意してくれるので踏み台サーバを用意しなくても良くなる。
  - パスワードの配布をしなくても良い。
```
$ cloud_sql_proxy -instances=[project id]:[region]:[instance name]=tcp:5432 -enable_iam_login
$ psql "host=localhost dbname=postgres user=taro.yamada@example.com"
```
- デメリット
  - オンプレのDBに関しては別の手法で管理する必要がある(GCP/AWSと管理方式が異なる)
  - DBにアクセスする際には、都度cloud_sql_proxyを都度実行してやる必要がある。複数のDBに常日頃から接続する必要がある場合には面倒。
　
- その他
  - 権限周りの設定ができるわけではない。
  - メール名が同じでドメイン名が異なる 2 人のユーザーを追加できない
https://cloud.google.com/sql/docs/postgres/add-manage-iam-users?hl=ja-
  - IntelliJ / DataGripだと `postgres-socket-factory` で認証できそうだけれどできない(検証済み)。
https://www.jetbrains.com/help/datagrip/connect-to-google-cloud-sql-instances.html


### 組み込み認証
- メリット
  - cloud_sql_proxyを都度実行しなくても、IntelliJとかSequelでアクセスできるのは便利。

- デメリット
  - DB毎にユーザ名とパスワードを管理する必要がでてくる。
  - メールなどで配信する機構を実装するのが面倒。

### Okta + StrongDM
- メリット
  - お金があれば管理は楽そう（未検証）。DBだけではなくいろいろなシステムに連携できるのアカウント発行運用コストも減りそう。
https://dev.classmethod.jp/articles/dive-deep-into-modern-data-saas-about-strongdm/


### ActiveDirectory
ActiveDirectoryを使っていればADも良いと思います。うちの会社では使っていませんでした。
https://cloud.google.com/blog/ja/topics/developers-practitioners/creating-sql-server-instance-integrated-active-directory-using-google-cloud-sql

### LDAP
CloudSQL、RDSでは使えませんでした。

## 比較したIaC
### Ansible
- メリット
  - オンプレ、CloudSQL、RDS問わずAnsibleで一元管理ができる。
- デメリット
  - CloudSQLをTerraformで管理しているばあい、DBインスタンスの構築とユーザ作成の処理を別で回さないと行けないので面倒。

### Terraform
- メリット
  - CloudSQLをTerraformで管理していれば、Terraformで完結させられる。
  - オンプレ、CloudSQL、RDS問わずTerraformで一元管理ができる。
- デメリット
  - ゼロトラストなどの理由で組み込み認証ユーザをSSH経由でのみのアクセスに制限している場合は、 `local-exec` を使ったり、ssh port fowardingなどの対応が必要。(※ `local-exec`を使うにしても環境差異はでそうなのでGitHubAction化するか踏み台サーバ上で実行するなどが必要そう)
https://github.com/hashicorp/terraform-provider-postgresql/issues/42

## オマケ
### メール名が同じでドメイン名が異なる 2 人のユーザーを追加できない
この記載はPostgreSQLとMySQLのドキュメントどちらにも記載があります。
![スクリーンショット 2022-06-25 1.44.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1313152/84f4b4d0-097f-5b7c-1c39-daef7421eba5.png)

MySQLに関してはその通りですが、PostgreSQLに関しては実態は違っていてメールアドレスがドメインごとフルで登録されます。メール名が同じでドメインが異なればユーザ登録も問題なく可能でした。
https://cloud.google.com/sql/docs/postgres/add-manage-iam-users?hl=ja-
Macでスクショをクリップボードとファイルの両方に保存する

# TL;DR

クリップボードにも、フォルダにもファイルとしてスクショが保存されるAutomatorのアプリケーションを作成した。ファイル名は`20220626-162858.jpg`のように時刻にする。


# 手順
Mac標準アプリのAutomatorを開く。

アプリケーション
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/2b3bc250-d06c-8fd4-4cee-b28955ddc036.png)

`シェルスクリプトを実行` でコードをコピペ。（スクショを保存するフォルダが/Users/$USER/scaptureの場合）
```
var="$(date "+%Y%m%d-%H%M%S").jpg"
screencapture -i -x -t jpg "/Users/$USER/sccapture/$var"
echo "$var"
```
もう一つ`シェルスクリプトを実行`で以下。`引数として`にすることに注意。
```
var=$1
echo $var
osascript << EOF
	tell application "Finder"
		set aRes to exists of POSIX file "/Users/$USER/sccapture/$var"
		if aRes
			set the clipboard to (read alias POSIX file "/Users/$USER/sccapture/$var" as TIFF picture)
		end if
	end tell
EOF
```

今回は、`⌘+shift+コントロール+4`と同じことをコマンドで実行している。
creencaptureコマンドのオプション
`-i` インタラクティブモード
`-W` 全画面モード
`-m` メインモニタの画面のみ撮影
`-c` クリップボードに保存
`-x` ミュート
`-t` ファイルフォーマットを指定。`-t　jpg`　でjpg指定

全画面でキャプチャしたいなら
```
var="/Users/$USER/sccapture/$(date "+%Y%m%d-%H%M%S").jpg"
screencapture -m -c -x -t jpg $var
echo "$var"
```
ウィンドウのみをキャプチャしたいなら
```
var="$(date "+%Y%m%d-%H%M%S").jpg"
screencapture -W -o　-x -t jpg "/Users/$USER/sccapture/$var"
echo "$var"
```
cf) 色々いじりたい人 https://tcd-theme.com/2020/12/screen-shots-without-the-shadow.html

`osascript`以降はAppleScriptを実行。クリップボードにあるJPEG画像をファイルとして保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/316390/a2f1e6fd-11be-9ed5-9231-51dba870e565.png)

アプリケーションを保存する。

あとは、dockに保存されたアプリケーションを入れておいてクリックするか、BetterTouchToolでショートカットを割り当てるなりして使う。

# 詰まっていたポイント
以前のコードでは、まず`screencapture -c`でクリップボードに画像をコピーしておいてそれをフォルダに貼り付けるというようにしていた。
この順番では、アプリを呼び出してescしたときに`いくつかのデータを期待されるタイプに変換できません`というアラートが出てしまっていた。
```
var="/Users/$USER/sccapture/$(date "+%Y%m%d-%H%M%S").jpg"
screencapture -m -c -x -t jpg $var
osascript << EOF
set jpg_data to the clipboard as JPEG picture
set the_file to open for access POSIX path of (POSIX file "$var") with write permission
write jpg_data to the_file
close access the_file
EOF
```
今回は、`-c`オプションをなくし、まずフォルダに保存させておいてから画像ファイルにアクセスしてそれをクリップボードにコピーする順番にした。そうするとスクショを撮らなかったときにアラートが出なくなった。


# 最後に
意外とクリップボードにもファイルとしても保存したいことが多かったので便利。消音なのも良い。
https://github.com/kentoak/screencapture
wslでsudoできなくなったときの対応方法


wslではroot作業はsudoで行うので、sudoできなくなると結構困ります。

これはwsl2で、visudoを使って失敗し、sudo できなくなったときの対処方法です。
あわせてsudoで入力する自分のパスワードを忘れた場合の対処方法も提示しています。

wsl2で実施しましたが、検索したwsl1の情報を参照して対応したので、wsl1でも使えるはずです(未確認)。

### sudoersファイルを破損した場合

* 発生原因

   `visudo`(古い人なのでsudoers.dに慣れてないのです)で修正時に構文エラーがあると、
   * e: 再修正(eじゃなかったかも)
   * x: 保存せず終了
   * Q: そのまま終了(危険)
   
   と表示されるのですが、ここでxとQの意味を取り違え「Q」を選んでしまいました。

   すると、sudoersファイルが構文エラーの状態のまま保存されてしまい、sudoコマンドが構文エラーで失敗するようになってしまいます。

   物理・仮想マシンにインストールしたlinuxであれば、boot cdやsingle user modeでリカバリーできるのですが、wsl2ではどうすればわからなかったです。

* 対応方法1

    検索して発見した下の「対応方法2」を元に見つけた対処方法です。こちらのほうがすこし簡単です。
    もし、うまくいかななけれ「対象方法2」を試してみてください。

    1. **コマンドプロンプトで** sudoersを変更可能にする
        ```
        C:\Users\mtag> wsl -u root chmod u+w /etc/sudoers
        ```
    1. **コマンドプロンプトで** sudoersを修正する。
       
        ```
        C:\Users\mtag> wsl -u root vi /etc/sudoers
        ```

        元の内容がわからない場合、以下の内容で更新すればとりあえず動くはずです。
        ```
        Defaults        env_reset
        Defaults        mail_badpass
        Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
        root    ALL=(ALL:ALL) ALL
        %admin ALL=(ALL) ALL
        %sudo   ALL=(ALL:ALL) ALL
        #includedir /etc/sudoers.d
        ```

    1. wsl内部でsudoができるか確認する。できなければ再修正する。
   
    1. **コマンドプロンプトで** sudoersを変更不可にする
        ```
        C:\Users\mtag> wsl -u root chmod u-w /etc/sudoers
        ```
* 対応方法2

    調べたところ[Stack Exchange](https://askubuntu.com/questions/1144326/sudoers-file-syntax-error-on-wsl)に回答を見つけました。sudoに問題があるのであれば、su(switch user)ではなく、起動時にrootにしてしまえ、という対応でした。

    こちらはubuntuの場合に依存した手順があります。ほかのディストリビューションの場合、読み替えが必要です。

    1. **コマンドプロンプトで**起動時のユーザーをrootにする。
        ```
        C:\Users\mtag> ubuntu config --default-user root
        ```
    1. **コマンドプロンプトで**wslをいったん終了する
        ```
        C:\Users\mtag> wsl --shutdown
        ```
    1. wslを起動し、sudoersを修復する。`visudo`は使えないと思いますので`vi /etc/sudoers`で修正します。

        sudoを実行した時に、構文エラーがでなくなるようにしてください。

        元の内容がわからない場合の内容は「対処方法1」の2に記述しています。

    1. **コマンドプロンプトで**起動時のユーザーを元に戻しておく。
        ```
        C:\Users\mtag> ubuntu config --default-user [元のwslユーザー]
        ```
### 自分のパスワードがわからなくなった場合

* 対処方法1と同じように対応できます。

    1. **コマンドプロンプトで** rootで現在のユーザーのパスワードを修正する。
       
        ```
        C:\Users\mtag>wsl -u root passwd [自分のwslユーザー名]
        New password:
        Retype new password:
        passwd: password updated successfully

        ```

* 対処方法2の起動ユーザーをrootで再起動したwslの中で、`password [自分のユーザー名]`でもパスワードをリセットできます。

* こちらはほかにも方法があると思います。
Mapbox Studioの英語を和訳する

副業のほうでMapboxを調べているのですが、英語力がないのでGoogle翻訳やDeepLを使って翻訳してみる。
訳してたら目的を達成してしまったので、とりあえず左メニューの一部のみ。


# Components
## Administrative boundaries 行政の境界線

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Country boundaries|国の境界線||
|　Dash pattern|線の種類||
|　Width|幅||
|Disputed country boundaries|紛争中の国の境界線||
|　Dash pattern|線の種類||
|State/province boundaries|州・県境||
|　Dash pattern|線の種類||
|　Width|幅||
|County/district boundaries|郡・地区境界||
|　Worldview|世界観||

## Buildings 建物

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Adjust opacity|透過度||
|3D buildings|3D建造物||
|Underground|地下||
|House numbers|家屋番号||
|　Halo width|？？？||

##Land & water 陸地と水上

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Land|陸上||
|　Type|種類|Landuse & landcover(土地利用・地形)、Landuse only(土地利用のみ)& Landcover only(地形のみ)のいずれかを選択可能|
|　　Stype|スタイル||
|　　Landuse density|土地利用密度||
|　　Control density by category|カテゴリー別の密度のコントロール||
|　Transition land color on zoom|ズーム時のランドカラーの遷移||
|Water|水|海岸線、水域、水路など、水の表現方法を変えられるらしい|
|Bathymetry|水深測定|水中深度の表示／非表示|

## Natural features 自然界の特徴

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Label style|ラベルスタイル||
|Label density|ラベル密度||
|Language|言語||
|Worldview|世界観||
|Label halo|？？？||

## Place labels ラベルの配置

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Continents|大陸|大陸名の表示非表示|

## Point of Interest labels 注目のポイントラベル

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Label style|ラベルスタイル||
|Control density by category|カテゴリー別の密度のコントロール||
|　Arts and entertainment|アート＆エンターテイメント||
|　Buildings|建物||
|　Commercual services|商業サービス||
|　Education|教育||
|　Food and drink|食品・飲料||
|　Food and drink stores|食品・飲料店||
 
## Road network 道路網

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Labels|ラベル||
|　Control label density|ラベルの密度コントロール||
|　Exits|道路出口||
|　Shields|ハイウェイシールド||
|　Shield Density|高速道路のシールドの密度||
|　Icon color scheme|アイコンの配色||
|　Icon saturation|アイコンの彩度|高速道路のシールドや鉄道のアイコンの彩度|
|　Icon lightness|アイコンの明度||
|　One way arrows|一方向の矢印||
|　Railway crossing|踏切||
|　Label style|ラベルのスタイル||
|　Language|言語||
|Turning circles|ターニングサークル？||
|Polygon fuatures|ポリゴンフューチャー||
|Minor roads|細街路||
|Roads under construction|建設中の道路||
|Fade out roads on zoom|ズーム時の道路フェードアウト||

## Terrain 地形

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Hillshade|丘の陰影||
|　Hillshade style|丘の陰影スタイル||
|Cliffs|崖||
|Contours|輪郭||
|　Contour style|輪郭線スタイル||
|  Contour elevation unit|等高線標高単位||
|　Fade on zoom|ズーム時のフェード||

※等高線は11倍くらいから見えるみたい

## Transit 乗り継ぎ

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Label style|ラベルスタイル||
|　Icon color scheme|アイコンの配色||
|　　Match label and network icon|ラベルとネットワークアイコンを一致させる|
|　Icon saturation|アイコンの彩度||
|　Icon lightness|アイコンの明度||
|Transit labels|乗り継ぎラベル||
|　Control by transit type|トランジットタイプ別コントロール||
|　Entrances|エントランス||
|Airport labels|空港のラベル||
|Aeroways|航空路||
|Railways|鉄道||
|　style with tracks|トラックスタイル||
|Ferries|フェリー||
|Aerialway|航空路||

## Walking cycling.etc. ウォーキング・サイクリング.etc.

|英語|日本語|備考|
|----|-----|----|
|Colors|色||
|Pedestrian polygon features|歩行者用ポリゴン機能||
|Paths, cycleways, and pistes|道路、自転車道、ゲレンデ||
|　style with background|背景付きスタイル||
|　Control dash pattern|線の種類をコントロールする||
|　　Paths|経路||
|　　Cycleways and pistes|自転車道とピスト||
|　　Trails|トレイル|移動したマーク的な|
|Golf courses|ゴルフ場||
|Structures|構造物||
|Labels|ラベル||
|Language|言語||
作業ブランチで、メインブランチの変更を取り込む

タスクをこなしていると、メインブランチの変更を取り込まずに作業ブランチへ分岐してしまうことや、作業中にメインブランチが更新されることがありがちですよね（？）

今現在いるブランチの状態のまま、メインブランチの変更を取り込むコマンドを備忘録的に残しておきます。

```
$ git fetch && git merge --no-ff origin/main
remote: Enumerating objects: 5, done.
remote: Counting objects: 100% (5/5), done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), 788 bytes | 87.00 KiB/s, done.
From github.com:himitudesu/himitudesu
   aeeaed9..2b64c5e  main       -> origin/main
Merge made by the 'ort' strategy.
 README.md | 1 +
 1 file changed, 1 insertion(+)
```
`origin/main`の`main`は`dev`でもなんでもいいです。
国土地理院タイルとC#とWindowsフォームで地図表示（2D）

cvx0017と申します。

以前、国土地理院タイルを使用した地形表示プログラム（OpenGLで3D）について投稿させていただきました。

[国土地理院タイルとWindowsフォームとOpenGLで地形表示](https://qiita.com/cvx0017/items/7b9d26c0775a01ae7ed4)

今回は、同じく国土地理院タイルを使用した2D地図プログラムを紹介させていただきます。3D版とほぼ並行して作成していたものです。

WebでもJavaScriptでもない、C#でWindowsフォーム（NET6.0）なので使い道はちょっとアレですが、見ていただけると幸いです。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/63eff6fd-cba8-0748-a6e2-e0c410e05817.png)
プログラムの実行方法を含む詳細は、後述するソース（プロジェクト）のフォルダにある「MapViewer_sample_github.pdf」をご覧ください。

ここでは、本プログラムの概要を紹介させていただきます。可能であれば、ソースもご覧いただき、ご意見等をいただけると幸いです。

# プログラムの概要・動作環境

本プログラムは、設定ファイルに指定した地域の地図画像タイル（地図画像及び衛星画像）を国土地理院HPから自動的にダウンロードして表示します。

動作環境等はWindows11、Windowsフォーム（.NET6.0）です。Windows10（64bit）でも動作確認済みです。

:::note info
本プログラムの実行には、.NET6.0の他、MSVCランタイムが必要です。この後の項目「ソース（C#プロジェクト）」の解説に従ってインストールしてください。
:::

本プログラムは、国土地理院が公開している以下のデータを使用します。

* 国土地理院タイル
標準地図（任意のズームレベル）
写真（任意のズームレベル）
（必要なタイルが自動的にダウンロードされます。）

出典：国土地理院タイル（[https://maps.gsi.go.jp/development/ichiran.html](https://maps.gsi.go.jp/development/ichiran.html)）

:::note warn
本プログラムは、国土地理院タイルを自動的にダウンロードしてローカルディスクに保存するため、インターネットを使用し、ディスク（プロジェクトフォルダの「bin/Debug/net6.0-windows/gsi」フォルダ）に書き込みを行います。本プログラムの実行により生じた損害に対しては責任を負いかねますのでご了承ください。
:::
:::note warn
国土地理院が提供する各種データの使用にあたっては、国土地理院の定める使用条件に従ってください。
:::

# ソース（C#プロジェクト）

下記のGitHubからプロジェクトを取得してください。Visual Studio 2022のC#プロジェクトです。Visual Studio Community 2022（Version 17.2.0）で開発しています。

 [地図表示サンプルプログラム](https://github.com/nimbus1170/MapViewer_sample)

:::note info
C++で作成した.NETクラスライブラリを使用しますので、Visual Studio Installerのワークロードで「.NET デスクトップ開発」の他に「C++によるデスクトップ開発」をインストールしておいてください。（実行のみの場合でもランタイムが必要です。）
:::

# プログラムの概要

設定ファイル（XML）で指定した地域を表示します。マウス操作で地図のスクロールとズームが可能です。
![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/63eff6fd-cba8-0748-a6e2-e0c410e05817.png)
地図上には、経緯度とUTMのグリッドと、グリッド座標値をグリッドの交点と地図の端の両方に表示しています。また、地図の中心とマウス座標の情報を表示しています。（サンプルですので全部表示してゴチャゴチャしてますが。）

メニューから、座標グリッドの表示の有無と地図画像／衛星画像を切り替えることができます。下の画像は衛星画像を表示したものです。
![image2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/e2a7ce40-fe90-88ff-7a61-1eb95da4df21.png)
C#で地図上に図形等を描画することもできます。
![image3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/205521/b61d7b46-c612-c02d-baf8-3b7945e2a904.png)

# 終わりに

ここまでお読みいただき、ありがとうございました。

サンプルプログラムでは、設定ファイルで任意の地域の表示が可能ですので、お試しいただけると幸いです。

失礼いたします。
Git リモートリポジトリにpushするときにブランチ名を省略する方法

## めんどくさい方法

```
$ git push origin topic-xxx
```

ブランチ名指定するのがめんどくさい！

```
$ git push origin HEAD
```

HEAD指定するとローカルブランチを同じ名前のリモートブランチを作成してくれます。

```
$ git push -u origin HEAD
```

`-u` オプションを付けると次回以降は `git push` だけで良くなります。

まぁ、めんどくさい。

## 快適な方法

```
$ git config --global push.default current
```

上を予め設定しておくと

```
$ git push
```

だけでローカルブランチと同じ名前のリモートブランチを作成してくれます。

## 参考

http://git-scm.com/docs/git-config#Documentation/git-config.txt-pushdefault

https://qiita.com/ucan-lab/items/aadbedcacbc2ac86a2b3
基数変換　n進数から１０進数への基数変換

# 基数変換とは
ある基数で表した数値を別の基数表現に置き換えることを基数変換と言います。

## 気づき
なるほど
確かに大きい数字を変換させるときには必要だ。

# n進数から１０進数への基数変換
重みをかけることで１０進数になる。
そしてそれ同士をたす。

例
```1101.011```
それぞれに重みを掛ける。
そうすると
１３.３７５になる。
　
# １０進数からn進数への基数変換
## 重みで割っていく方法
```1101.011```はぞれぞれ８、４、２、１、0.5、0.25、0.125の重みを持っている。
なので１０進数の１３.３７５を割ってみれば
８が１、４が１、２が０、１が１、０.5が０、０.２５が１、０.125が１になる
1101.011になる。

## １０進数を基数で割る方法
基数で割っていくと１の余が出たり出なかったりして２進数を求めていく。
１０進数１３.375を２進数に求めてく。
整数部と少数部で分けていく。
### 整数部は割り算
余が２進数になる。
１３を２で割ると６余１、６を２で割ると３余０、３を２で割ると１余１、１を２で割って０余１
### 少数部分は掛け算
かけていく答えの整数部が２進数となる、少数部はもう一回基数で掛ける。それを答えが１.0になるまでする
0.375と２で掛けて0.75 0.75に２をかけて1.5 ０.5に２をかけて１.０

### 整数部と少数部を合わせる
整数部は下から読み込む、少数部は上から読み込む
1101.011

## 気づき
計算法は２つあることがわかった。
計算方法は理解していないが方法だけは理解できた。
少数部の計算方法がわからなかった。

出典 キタミ式イラストIT塾 基本情報技術者　令和３年
[react-cookie]useCookiesでセットしたばかりのcookieを取得できない

👇のライブラリを使用した際に詰まったのでメモ
https://github.com/reactivestack/cookies/tree/master/packages/react-cookie


```react
const [cookies, setCookie] = useCookie(['cookieName'])

setCookie('key', 'value')
cookies.key // => undefined
```

cookiesはuseCookie呼び出し時点のcookieの値がセットされた"[x: string]: any"型のオブジェクトに過ぎないため、useCookie後にセットした値は取り出せない。
undefinedとなる。

```react
const [cookies, setCookie] = useCookie(['cookieName'])

setCookie('key', 'value')
cookies.key // => undefined

const [newCookies, _] = useCookie(['cookieName'])
newCookies.key // => 'value'
```
👆のように再度useCookieを呼び出せば、セットした値を取り出せる。
が、あまりきれいな書き方ではないので、そもそも設計が間違っているのかもしれない。
flutter Button 3種類

# 初めに
短い記事になりますが、flutterのButtonを3種類記述します。
![](https://storage.googleapis.com/zenn-user-upload/8d1d7413b784-20220626.png)
# TextButton
![](https://storage.googleapis.com/zenn-user-upload/7930ac991acd-20220626.png)
縁取り等の装飾のないシンプルなボタン
```
    TextButton(
      onPressed: (){
	//ボタンを押した時に呼ばれるコードを書く
      },
      child: Text('TextButton'),
    ),
```
# ElevatedButton
![](https://storage.googleapis.com/zenn-user-upload/2aaee986c568-20220626.png)
物理的なボタンを実際に押した時のような、影がついているボタン。
よく使う。
```
    ElevatedButton(
      onPressed: (){},
      child: Text('ElevatedButton'),
    ),
```
# OutlinedButton
![](https://storage.googleapis.com/zenn-user-upload/7d25ffafef72-20220626.png)

外枠だけがついているボタン
```
    OutlinedButton(
      onPressed: (){},
      child: Text('OutlinedButton'),
    ),
```

# 終わりに
Twitterでも情報発信しておりますので、ぜひフォローお願い致します!
https://mobile.twitter.com/tatsuki_kt
【初学者向け】E2Eテストとは



## はじめに
もくもく会に参加していて「E2E」というワードを聞いたので、何だろうと思って調べてみました。

私は実務では単体テストや結合テストくらいしか対応したことがないです。
テストってテスト仕様書通りに手を動かすくくらいの単純作業と思っていましたが、実際にやってみると色んなケースを考慮しなければいけないので真面目にやるとそれなりに頭を使うと思いました。



## ざっくりイメージ
・単体テストは早くてコストも低い
・UI(ユーザーインターフェース)テストは遅くてコストかかる。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884151/4ea9bdc8-9164-5602-3589-f544e397f652.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884151/4c2f52d9-9eb7-c2b1-b906-e1af7ffdb2df.png" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884151/12fa3035-a826-6093-7be7-10f31b64b876.jpeg" width=70%>

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1884151/11b11f56-78c9-b66c-5ddf-c4519f895f68.png" width=70%>


## E2Eテストとは
E2Eテスト = End to end テスト
E2E(End to End)テストは、UI(User Interface)テストとも呼ばれ、システム全体を通してテストをする。

Webサービスの場合は、ユーザと同じようにブラウザを操作し、挙動が期待通りになっているかを確認することができる。


## 特徴
ユニットテストとは逆の特徴があるようです。

> ・自動化したテストでコードの振る舞いをシステム全体を通して確認できるようになる
・壊れやすく、メンテナンスが大変
・導入・運用コストが高い
・実行速度が遅い



## メリット
:::note info
メリット
・単体テストでは明らかにならない不具合を発見することができる。
・アプリケーションのすべての依存関係が正しく連携して動作することを確認できる。
・本番環境にデプロイ不具合が見つかる可能性を減らすことができる。
・実際の稼働に近い動きをテストできるため、単機能だけの途切れ途切れのテストではない。
:::
## デメリット
::: note warn
デメリット
・実行速度が遅い。
　→ 実際にサーバーやブラウザを起動するため、単機能のテストとは比べ物にならない時間がかかる
・脆弱/ flaky(不安定な)テスト
　→ 細かいUIのテストを実装すると、ちょっとした文言の変更ですぐ落ちる。
・導入・運用コストが高い。
　→ テスト用の環境を用意する必要があり、実行コストがかかる。
:::

## 参考文献
以下、記事を書くにあたり参考にした記事のリンクです。

[E2Eテスト: 導入の必要性・何を導入するのか](https://commerce-engineer.rakuten.careers/entry/tech/0031)
[E2Eテストの導入から学んだこと](https://qiita.com/mt0m/items/7e18d8802843d9f60d28)
[E2Eテスト(とUIテスト)ってなんなの？](https://qiita.com/ukey-ino/items/81a44cacfe07052194a5)
[E2Eテストについて](https://zenn.dev/big_tanukiudon/articles/3aefa690ab3998)
[E2Eのテスト環境とテストデータの理想と現実](https://speakerdeck.com/hgsgtk/real-world-e2e-testing)
[E2Eテストの長所と短所](https://ranorex.techmatrix.jp/blog/2021/12/10/end-to-end-testing-pros-cons-benefits/#:~:text=%E3%83%86%E3%82%B9%E3%83%88%E3%82%AB%E3%83%90%E3%83%AC%E3%83%83%E3%82%B8%E3%81%AE%E6%8B%A1%E5%A4%A7%EF%BC%9AE2E,%E6%B8%9B%E3%82%89%E3%81%99%E3%81%93%E3%81%A8%E3%81%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82)
[E2Eテスト(インテグレーションテスト)の利点と不利点](https://qiita.com/NAKKA-K/items/58d6b8476a3717179bda)


## おわりに
調べてみて、テストにも段階があり、それぞれ別に役割があることが分かりました。
「アイスクリームコーン」については恥ずかしながら、初めて知ったのでもっと調べてみたいです。

製品の品質を高めるためにもテストの手法や進め方なども設計段階で考える必要があると思いました。

最後まで読んでいただきありがとうございました。
よければLGTMお願いします！今後のアウトプットの励みになります。
未経験WEBエンジニア7-8ヶ月目振り返り

# 概要
最近実務や勉強を通して身につけた事の振り返りです。
日々学ぶ事が多く頭の中を整理するためのアウトプット記事です。
内容が皆様の少しでも役に立てたら嬉しく思います。

## トピック
- プロジェクトテンプレート作成
- auth0の認証まわりとNoSQLのMongoDB
- AWS環境の構築　SAA試験勉強

## プロジェクトテンプレート作成
弊社では経験の浅いエンジニアでも案件にスムーズに取り掛かれるように
要件定義から開発まで一通りの流れをノウハウとして纏めたドキュメントを作成しています。
その中で課題として上がっていたのが、新規プロジェクトを始める際に毎回1から環境構築をしていて開発に入る前に時間を取られてしまう問題がありました。その手間を省くためにある程度構築が済んでいる雛形のリポジトリ を作成し、コピーする事でスムーズに開発に入れるような状態を作る事ができました。

内容としては、Dockerfile(compose)にwebサーバー、アプリケーションサーバー、DBサーバコンテナを構築する記述を行い、docker-compose upとするだけで開発環境が整う様になりました。
Laravelもあらかじめ入れておき初期設定を済ませておく事で毎回行っている設定(日本語化の設定など)をしなくても良くなりました。
また、makefileでエイリアスを作る事で、make up とするだけで環境構築ようの一連のコマンドが自動で走りるようにしました。つまり、リポジトリ をクローンしたら、make upするだけで環境構築が出来てしまうのです。

またLinterやprecommitやフォーマッターやGitHub Actionsの設定を行う事で、コミット時に自動でlinterが走り、コードを整形してリポジトリにpush時にテストが自動で実行される様な設定にしました。

https://github.com/squizlabs/PHP_CodeSniffer

https://knowledge.sakura.ad.jp/23478/


ここまでの作業を毎回行うのは手間ですよねーかなり短縮されたのではと思います。

## auth0の認証まわり
最近、JWTを使って認証するAPIを作成しましたが、今度はauth0を使ったM2M認証を行う必要がありました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/0d24309f-9cfb-7079-cd24-94f5ba56f0ba.png)


認証フロー図は以下より引用

https://auth0.com/docs/get-started/authentication-and-authorization-flow/client-credentials-flow

Laravel用auth0のSDKを用いて認証が必要なAPIを作成しました。

https://auth0.com/docs/quickstart/backend/laravel/01-authorization

https://auth0.com/docs/quickstart/backend/laravel/02-using

ヘッダーのAuthorizationにトークンを詰めて認証する方式ですね。

## NoSQLのMongoDB
今回初めてRDBではなくてキーバリュー型のMongoDBを使用しました。

https://qiita.com/Brutus/items/8a67a4db0fdc5a33d549

https://qiita.com/saba1024/items/f2ad56f2a3ba7aaf8521

LaravelではMongo用のライブラリをインストールしMoloquentを使う事でEloquentと同じ書き方でDB操作が出来ます。

https://0115765.com/archives/4403

導入に結構詰まりましたが無事解決しました。
Mongo Expressを導入するとGUIでデータ確認できるので便利です。

https://de-milestones.com/docker_mongodb_mongo-express/


## AWS環境の構築　SAA試験勉強
最近は実務でインフラを担当する事が多く、Udemyで学習して実際にインフラを構築したり、資格取得に向けて勉強したりしてます。
最近作った環境は下記の感じです。(かなりざっくりでちょっとボカシ、冗長化はコストの関係で後ほど)

![AWS .jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1008745/0c458af4-1bfe-c295-fc79-c3a2b635a7d6.jpeg)

マネジメントコンソールでポチポチ作ったので今度はTerraformやPackerでIacで作りたいです。

ハマった点(添付記事で解決)
privateサブネットのEC2にSSHできない。。。

https://t.co/603j6yXnCU

ベーシック認証(Lamda)

https://qiita.com/shonansurvivors/items/422924e720eb3465b865

ALBに証明書2つ設定してホストによるルーティング

https://dev.classmethod.jp/articles/alb-support-sni/

### AWS資格試験
通勤時間等にAWS SAAの勉強をしてました。
Udemyのコースで内容を勉強して、Koiwaの問題集で試験対策しました。

https://www.udemy.com/course/aws-associate/

https://aws.koiwaclub.com/

見事合格できました！！

今回は以上になります。最後まで読んでいただきありがとうございました。
Colaboratory と AWSの連携

## この記事の目的

[Colaboratory](https://colab.research.google.com/)でboto3を経由してAWSのAPIを実行する環境を作成します。

## 👇これより先は下記記事の内容を前提とします

- [Colaboratoryを利用したPython実行環境](https://docusaurus.plant11.com/tips/Colaboratory)

## AWS設定ファイルをGoogle Drive へ保存する

ColaboratoryからAWS認証情報を読み込むため、`aws configure`の実行により生成された設定ファイル`config`および`credentials`をGoogle Driveへ保存します。  

- AWS設定ファイル`config`および`credentials`の場所  
Linux または macOS では「~/.aws/」、Windows では「C:/Users/USERNAME/.aws/」にあります。
- AWS設定ファイルのGoogle Drive保存先  
Google Drive保存先は任意の場所ですが、以下の説明では`[Google Drive]/.aws/`を利用します。  
👇  
`[Google Drive]/.aws/config`  
`[Google Drive]/.aws/credentials`  

## Google Drive のマウント

Colaboratoryから下記コードを実行しGoogle Driveをマウントします。

```python:
from google.colab import drive
drive.mount('/content/drive')
```

![image](https://user-images.githubusercontent.com/38905609/175802617-fe6cb375-59f3-475a-bee2-91cee8ceaef5.png)

Google Driveへのアクセス許可を確認するダイアログが表示されます。
![image](https://user-images.githubusercontent.com/38905609/175802657-f55ee108-754a-4b07-9e41-ac59e5b84efb.png)

![image](https://user-images.githubusercontent.com/38905609/175802698-81aeadc0-2c2b-48f1-9b83-77261e9ba7ed.png)

## AWS認証設定

Colaboratoryから下記コードを実行しAWSの認証ファイルを設定します。  

```python:
import os

path1 = "/content/drive/MyDrive/.aws/config"
os.environ['AWS_CONFIG_FILE'] = path1

path2 = "/content/drive/MyDrive/.aws/credentials"
os.environ['AWS_SHARED_CREDENTIALS_FILE'] = path2
```

![image](https://user-images.githubusercontent.com/38905609/175802765-aee34b39-230a-4e90-822e-3903d37c0607.png)

## boto3のインストール

Colaboratoryから下記コードを実行しboto3をインストールします。  

```:ps
!pip install boto3
```

![image](https://user-images.githubusercontent.com/38905609/175802817-085bb0b8-c310-472c-9561-b5c55f891f39.png)

## boto3実行サンプル

Colaboratoryからboto3のAPIを利用できます。  

```python:
import boto3

bucket_name = 'your.bucket.name.xxxxx'
key_prefix = ''

s3 = boto3.resource('s3')
bucket = s3.Bucket(bucket_name)
list = bucket.meta.client.list_objects_v2(Bucket=bucket.name, Prefix=key_prefix)

for obj in list.get("Contents"):
  print("file:",obj.get("Key"),obj.get("Size"), obj.get("LastModified"))
```

![image](https://user-images.githubusercontent.com/38905609/175802902-7cb239ed-909d-42b6-a194-1c38039d591c.png)

## 👇前提記事

- [Colaboratoryを利用したPython実行環境](https://docusaurus.plant11.com/tips/Colaboratory)

## 👇参考URL

- <https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html>  
- <https://boto3.amazonaws.com/v1/documentation/api/latest/guide/configuration.html>
【自己学習】Go言語を学ぶ(3)

公式チュートリアルから基本を学ぶ
https://go-tour-jp.appspot.com/list

# Variables（変数）

* varで変数宣言を行える。

サンプルコード
* c, python, javaはbool型
* i はint型

```go
package main

import "fmt"

var c, python, java bool

func main() {
  var i int
  fmt.Println(i, c, python, java)
}
```
結果：0 false false false

# Variables with initializers（変数の初期化）

* var 宣言では、変数毎に初期値を指定できます。

サンプルコード
* i jをint型で i = 1 j = 2を指定
```go
package main

import "fmt"

var i, j int = 1, 2

func main() {
  var c, python, java = true, false, "no!"
  fmt.Println(i, j, c, python, java)
}

```
結果：1 2 true false no!

# Short variable declarations(短い変数宣言)

* var 宣言の代わりに、短い := の代入文を使い、型宣言ができる。

サンプルコード
* `k := 3`で代入
```go
package main

import "fmt"

func main() {
  var i, j int = 1, 2
  k := 3
  c, python, java := true, false, "no!"

  fmt.Println(i, j, k, c, python, java)
}
```
結果：1 2 3 true false no!
日付系のメモ

日付実装する時に参考にしたサイト
世の中には文章力のある国語マンのイイ人がたくさんいますね。


https://qiita.com/nao0725/items/409ece34ecbec5167125

https://qiita.com/ryouzi/items/950401a3d6032bd5641d

https://railsdoc.com/page/date_related

https://fuchiaz.com/ruby-rails-time-date/#Date


なんであんなに長文打てるのだろう
指先が腱鞘炎になるので、文字数少なめにメモしていきます.../(◉〜◉)