OmniAICreator/Qiita-1.07M huggingface dataset:
CCNA(200-301)に合格したので勉強法、試験概要について書く

#前提
今から2年ちょっと前(2019年初頭)に、一か月間ほどネットワーク構築に携ったことがありました。主にCisco製スイッチの設定を行いました。
当時はほぼ知識もなくやっていたので、それがCCNAを取得しようと思ったきっかけでした。それ以来はネットワーク構築に携わることはなく、しばらくモチベが低下していたので結局今頃になって取得になってしまいましたが…。

#勉強期間
実際に勉強し始めてから取得するまでには10か月ほどかかりましたが…飽きてサボってた時期も何か月かあったので体感は半年くらいかなと思っています。やる気があるときに毎日短くて1時間、長くて3時間くらいのペースかな。ホントは30分でもいいからちゃんと毎日コツコツやるほうがいいです。でもぼくは一生できる気がしない！

#勉強方法
* [参考書] 1週間でCCNAの基礎が学べる本 第2版 徹底攻略シリーズ
* [学習サイト] Ping-t

結果的にはほぼPing-tだけでいけました。分野の後半は有料なので節約したい場合は短期集中でやりたいところ。Ping-tで勉強するときにありがち、全問題を3周解きましたが、不安になって直前に4周目も解いてしまいました。

なのでPing-tだけでOK！と言いたいところなんですが、終わってみて後悔している点があるのでこれから受ける方は以下参考にしてください。

####参考書選びについて
もちろんPing-tだけでも解説は充実してます。が、体系的に学びたい！節約のために利用期間中は問題を解くことに集中したい！というのがありますよね。なので参考書を買ったんですが、タイミングが悪いことに2020年2月にCCNAは大幅に改定されていました。一応紹介した参考書は目を通したんですが、新試験200-301でいうところの半分くらいの内容しか書かれておらず、後はPing-tの解説頼りになりました。買った当時はまだ200-301対応のものが多くなく、そもそもそんなに大幅に変わってるって知らなかった…。

できれば試験問題(せめて分野)を確認してから参考書を選んでくださいね。当たり前といえば当たり前なんですが…。今なら対応のものもそれなりに出てるようなので大丈夫と思いますが、改定には注意して最新の情報を入手しましょう。

####試験について
まんまとハマった改定後の200-301なんですが、具体的には、

* ICND1、ICND2というように分割しての受験が廃止
* 自動化、無線など幅広い分野に対応

以前から一括で受ける試験区分もあったようですが、それらが廃止、統合される形で新区分になったようです。よく言えば一回で取得できる。悪く言えば一回の試験あたりの勉強量と受験費用の増加。合格すれば会社から補助は出ますが…万が一落ちたときに自己負担になるとか考えるとプレッシャーも増しますよね。

分野が広くなったことで、実務での活用の期待度は上がりますが、旧試験と比べると試験の難易度も上がったようです。私も業務経験から、従来の有線LANの構築に関わる知識について学ぼうという心づもりだったので、自動化や無線などの分野は経験がなく苦戦しました。

#実際に受験してみて
####問題数・試験時間
試験は、101問120分でした。案内のメールは140分とありますが、最初の20分は規約への同意やチュートリアルの時間ですね。

####問題形式
単一or複数回答の選択問題と、ドラッグアンドドロップ問題。ドラッグアンドドロップは、用意された選択肢を関係する選択肢に当てはめていく問題です。
コマンド問題やシスコ機器のシミュレーション問題があるという情報もありましたが、出題されませんでした。(一応Ping-tのコマ問解いたんだけどな)
このあたりは直近の合格体験記から情報をキャッチするのがいいかもしれない。

####合格ライン
1000点満点中825点以上で合格。そこそこ高いラインだなあと思って、不安になって直前にPing-t問題4周目解いたりしましたが、結果的には912点で少し余裕をもって合格できました。

####所感
いわゆるシスコ語と揶揄されるような、不自然な日本語が登場するという情報もありましたが、その通りでした。Ping-tの問題は日本語がしっかりしているので、いきなり本番の問題を見てしまうと不安になります。そのせいで回答に支障が出る問題も少しだけですがありました。が、それのせいで不合格になってしまうほどではないので安心してください。

難易度は、Ping-tの問題のほうが高いので合格できるという情報もありましたが、その通りでした。ですが、そっくりそのままの問題が出るということはほとんどなく、前述の不自然な日本語と合わせて不安になります。が、シンプルな問題が多いように感じたので、もし自信がなくても素直に回答すればいいのかなと思いました。

####注意点
戻って回答することが一切できないことです。つまり何らかの回答をしないと次に進めません。よくあるのが、少し悩んでわからない問題は飛ばすというやつ。後の問題で関連する知識が登場して前の問題に回答できることがあるというパターン。そういうことはできないので、もし後で答えがわかっても回答を修正することはできません。純粋に一つの問題文に対して一つの回答をするしかありません。
逆に言うと見直しの時間は考える必要がないということです。約100問なので平均して1分ちょっとで1問ずつ解いていけば終わる計算になります。私は見直しできる可能性も考えて早めに回答し、20分ほど残っていましたが結局見直しはできなかったので、不安な方はギリギリで終われるように粘るのもありかも。

#まとめ
私はCBTの試験はいつも同じテストセンターで受験しているのですが、違うベンダーの試験を同じ会場で何度も受けて、あたかも慣れてきたかのように錯覚してしまったのが今回の勉強の失敗と試験中の不安の原因だったかもしれません。
方式が同じなだけで、やはり別のベンダーの試験なので、学習や試験情報に関する質も量もまちまちですし、当然問題の形式や日本語対応の程度も違います。同じベンダーの試験なら経験則も通用するかもしれませんが、毎回違うベンダーの試験を受けている私は、あくまで新しい気持ちで情報収集にあたるべきだったなと思いました。
最新のrubocopを使いたい

かなり古いバージョンのrubocopを使っていたが、
最新版を使ってみたくなった

意外と躓いたので備忘としてメモを残しておく

## 導入
### gemのインストール
Gemfileに以下を記載
念のためバージョンは指定しておく

```
gem 'rubocop', '~> 1.18', require: false
```

rubocopの拡張機能も同時に入れる

```
# rails用の拡張
gem 'rubocop-rails', require: false

# パフォーマンス低下に繋がるcopを指摘してくれる拡張
gem 'rubocop-performance', require: false

# rspec用の拡張
gem 'rubocop-rspec', require: false
```

### rubocop.ymlを設定する
インストールした拡張機能の設定をする

```yml
require:
  - rubocop-rails
  - rubocop-rspec
  - rubocop-performance
```

除外したいものを設定

```yml
Exclude:
  - 'vendor/**/*'
  - 'bin/**/*'
  - 'db/**/*'
  - 'tmp/**/*'
  - 'node_modules/**/*'
```

`The following cops were added to RuboCop, but are not configured.`と言われた場合

指摘されている内容を個別にrubocop.ymlに書くか
以下のようにすべての設定を一括で設定する

```yml
AllCops:
  NewCops: enable
```

## 使用方法
```sh
// auto-correctしたい場合
bundle exec rubocop -a

// 内容だけ見たい場合
bundle exec rubocop
```
databaseからを情報を取得して配列に格納

firebaseのdatabeseから情報を取得して配列に格納する方法の備忘録

## 環境
```yaml
OS: macOS 
Vue: 2.6.12
vue-cli: 4.5.13
vue-router: 2.6.10
vuex: 3.6.2
```
##dataに配列を設定

```js
data(){
   return {
     hoges: [],
   }
 },
```


##hogeにdatabaseの情報を格納

```js
created() {

hogesRef.on('child_added', (snapshot) => {

const hoge = snapshot.val();

});
```
※snapshot.val()でdatabaseから情報を取得


##hogesにhogeの情報とsnapshot.keyを追加

```js

const hoge = snapshot.val();

const hogehoge = {
  title: hoge.title,
  image: hoge.image,
  id: '',
  readDate: '',
  memo: '',
  learn: '',
  important: '',
  examples: '',
  different: '',
  userId: this.$store.state.userId,
}

hogehoge.id = snapshot.key;
this.hoges.push(hogehoge);
});

```
※オブジェクトの中にundefindなプロパティがあると追加処理ができない。
※.pushでhogesの配列にdatabaseのデータとhogehogeの情報を追加


>[公式リファレンス]
(https://qiita.com/Junpei_Takagi/items/603d44f7885bd6519de2)
Visual Studio 2019 インストール済み SDK のバージョン確認

Visual Studio 2019 では、コードで使用するSDKなどのパッケージは``NuGet``というパッケージマネージャを利用して管理している。そのため現在インストールされているSDKのバージョン確認は``NuGet``から行う。

ツール > NuGet パッケージマネージャ > ソリューションの NuGet パッケージの管理 > NuGet ソリューション > インストール済み

からインストール済みパッケージを確認できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414729/93133696-7866-cafe-874b-1d00ea4c4c79.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/414729/1ef4824b-0635-a34c-3119-68d9ead45c83.png)

注意点として、***ソリューションの*** ``NuGet`` パッケージを確認するものなので、***ソリューション***を一旦作っておかないと確認できない。
シングルクォテーションで括った文字列についての注意点（シェル）

こんにちは
シングルクォテーション```'``` で括った文字列[^1] [^2]についての注意点をまとめました（```'文字列'```）。シェルの話題です。

* その中へシングルクォテーション文字（```'```）を入れたい場合は、
  * ```"'"```と表す必要があり、
  * 文字列の分割・結合を用いて実現する：```'string1'``` + ```"'"``` + ```'string2'```
     * したがって 「```'"'"'```」とすれば良いと説明する人もいます

* その中へ変数（```$VAR```）を入れたい場合は、同様に、
  * ```$VAR```もしくは```"$VAR"```[^3]と表す必要があり、
  * 文字列の（分割）結合を用いて実現する：```'string1'``` + ```"$VAR"```[^3] + ```'string2'```
     * したがって 「```'$VAR'```もしくは```'"$VAR"'```[^3]」とすれば良いと説明する人もいます


#### 方法の説明について

「したがって〜とすれば良い」の箇所は、方法だけを言った説明です

* しかしながらもしも、方法だけを覚えて済まそうとすることは、仕組みから理解しないおそれもあります

[^1]: シングルクォテーション```'``` で文字列を括ると、シェルが特殊解釈する文字（空白文字を含む）を解釈させないことになります。
[^2]: プログラム（の文字列）を引数としてコマンドへ渡す際には、シングルクォテーション```'``` で括ることがお勧めです。
[^3]: 空白文字を含む変数の場合には```"$VAR"```と表す必要があります（```"```で括る）。
他のPCやスマホからVirtualBox(ゲストOS)のWebサーバに接続する

ホストOSはWindows10、ゲストOSはUbuntu(18.04)、WebサーバはApacheです。ゲストOSにApache2のインストール済みとします。

## ホストOSからゲストOSへのアクセス
ブリッジ接続、NAT + ホストオンリー アダプターなどありますが、今回はポートフォワーディングを使用します

#### NAT + ポートフォワーディングの設定
   - VirtualBox で作った環境の設定を開く
   - ネットワークのポートフォワーディングを開く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/8c36d095-035a-ed62-510f-3cf900cb13b3.png) 

  - 画面右上の＋アイコンから新規ルールを追加で 名前：任意（HTTP)、プロトコル：TCP、ホストポート：50080、ゲストポート：80 に設定<br>
 (ホストポートはウェルノウンポート以外で設定 )

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1665304/2391a3a3-83d9-203e-ed7f-1a8e14e9f0b1.png)

#### ホストOSからアクセス確認
VirtualBOXにてゲストOS起動後に、ホストOSのブラウザから以下にアクセス
 `http://localhost:50080`
”IT WORKS”の画面が表示されることを確認

## 他PC(スマホ)からアクセス確認
スマホから以下にアクセス
`http://ホストOSのIPアドレス:50080`
”IT WORKS”の画面が表示されることを確認
[CSS]文字の色がつかない？？（初心者悩み）

# 初めに
#### しょうもないことでした。
なぜだろうと、
ずっと感じていたことでしたので、
かなり短いですが、共有したいと思います。

# 疑問点
### *子クラスに色がつかない？？？*
すぐにわかってしまう方はいるかもしれませんが、
当時、こんな感じで記述してますが、文字に色がつきませんでした。

```ruby
HTML

<div class="parent">親
  <div class="child">子供
  </div>
</div>
```
```ruby
CSS

.parent{
  width :360px;
  height: 360px;
  margin: 40px;
  position: relative;
}

.child{
  width :200px;
  height: 200px;
  position: absolute;
  calor: blue;
  top: 40px;
  left: 40px;
```

# 結論
calorじゃない、`color`だ・・・。


# 終わり
くだらない、と感じられるかもしれませんが、
これに悩んでいた人がここにいます。*（私です。）*

他にも文字打ち間違いを連発してました。
img scrじゃない、`img src`だ・・・。
rigthじゃない、`right`だ・・・。
などなど。

文字の打ち間違いには、本当に気をつけないとと感じました。

しょうもないですが、以上です。
GitHub Actionsをステップの実行結果によって分岐させる

意外と参考になる資料が見つからなかったので投稿します。
GitHub Actionsのステップの実行結果による分岐についてです。

## やりたいこと
- ステップの実行結果によってその先の実行内容を切り替えたい
  - `StepA`が成功だった場合、`StepB`を実行する
  - `StepA`が失敗だった場合、`StepC`を実行する
  - ジョブの実行結果に`StepA`の実行結果を反映させない
- Ansibleで言うところの`when`のようなことをしたい

## やりたいこと(私が詳しく調べたきっかけ)
シェルコマンドの結果によって処理を分岐させたかった。
具体的に`curl http://example.com/list | grep "hoge"`によって"hoge"が見つかった時、途中のステップを実行したくなかった。

## やろうとした時に困ったこと
- ステップの実行結果による分岐の資料が意外と見つからなかった
  - ジョブの方は見つかった
- 公式ドキュメントのページ内リンクが間違っていて、目的の情報に辿り着きにくかった
  - 2021-07-18時点
  - 当該記事: [GitHub Actions のコンテキストおよび式の構文](https://docs.github.com/ja/actions/reference/context-and-expression-syntax-for-github-actions)
      - 例えば[#steps-context](https://docs.github.com/ja/actions/reference/context-and-expression-syntax-for-github-actions#steps-context)にアクセスすると `needsコンテキスト` が表示されてしまう

## サンプル
- [サンプルリポジトリ(GitHub)](https://github.com/ljourm/sample-github-actions-fork-command-result)
- [check somethingが成功した時のAction実行結果](https://github.com/ljourm/sample-github-actions-fork-command-result/runs/3097557189)
    - `something when command failure`が実行されていないのがポイント
- [check somethingが失敗した時のAction実行結果](https://github.com/ljourm/sample-github-actions-fork-command-result/runs/3097553348)
    - `something when command success`が実行されていないのがポイント

```yml
name: sample-action

on: workflow_dispatch

jobs:
  something-job:
    runs-on: ubuntu-latest
    steps:
      - name: check something
        id: check_something
        run: exit `echo $(($RANDOM % 2))`
        continue-on-error: true

      - name: output step context
        run: echo $CONTEXT
        env:
          CONTEXT: ${{ toJSON(steps.check_something) }}

      - name: something when command success
        run: echo "result - success"
        if: steps.check_something.outcome == 'success'

      - name: something when command failure
        run: echo "result - failure"
        if: steps.check_something.outcome == 'failure'
```

### 解説

ポイントとなる記述を解説します。

#### `id: check_something`
ステップの実行結果を後続ステップで参照するためにidを付与します。

#### ``run: exit `echo $(($RANDOM % 2))` ``
終了コードを乱数で決定します(0または1)。
これによって「`check something`の結果がランダムで成功したり、失敗したり」となるようにします。

#### `continue-on-error: true`
このステップ(`check something`)の実行結果がエラーとして扱われないようにします。

#### `CONTEXT: ${{ toJSON(steps.check_something) }}`
デバッグ用の記述です。
これによって`steps.check_something`の中身を確認することができます。

#### `if: steps.check_something.outcome == 'success'`
`check_something`が成功した場合にのみ、このステップが実行されるようにします。

#### `if: steps.check_something.outcome == 'failure'`
同上です。

## ジョブの実行結果による分岐
ステップでなくジョブによる分岐は参考記事がたくさんあるので、ここでは詳しく扱いません。
ジョブの場合は`if: success()`や`if: failure()`によって分岐させる点がポイントです。

例えば、以下の記事がわかりやすかったです。
[GitHub Actionsでビルドの成功・失敗をSlackに通知する方法(Qiita)](https://qiita.com/progrhyme/items/badf31978612b22dbf47)

## 分岐処理が大きい場合は別スクリプト化
GitHubActionsやその他CIに複雑な処理を書くべきではないと思っています。
保守・管理が難しくなってしまうためです。
その場合は専用のスクリプトに分離していくことをオススメしたいです。
Jiraでルーチンタスクのチケットを自動的に作成する方法

タイトル通り「Jiraでルーチンタスクのチケットを自動的に作成する方法」をJiraの機能を使って実現する方法です。

- 右上の歯車マークから「システム」を選択
- 左側に表示されるメニューの一覧から一番下の「Automation rules」を選択
- 「ルールを作成」ボタンを押す

「ルールを作成」ボタンを押すと「新しいトリガー」一覧が表示され，自動化の起点となるイベント一覧が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26865/89472607-58a4-85cf-430a-e3301c5647c4.png)

その中で一番下にある「スケジュール時」という選択します。次の例は毎週月曜日の9時にイベントを実行するという設定です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26865/9a3af575-ebde-fccc-002c-463aad995364.png)

チケットを作成する場合「コンポーネントの追加」で「新しいアクション」を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26865/ab543872-03cf-12c5-e9a3-83b4ad3f194d.png)

課題作成時は「プロジェクト」「課題タイプ」「要約(タイトル)」が必須の項目になっています。設定するフィールドを追加することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26865/7f60c798-81d8-66aa-2dd1-2c1e6b7b3c65.png)

例えば 日付であれば `{{now.plusdays(1)}}` のような書き方で変数を埋めることができます。Automationで使える変数はSmart Valuesと言って一覧は下記のURLから参照することができます。

https://support.atlassian.com/jira-software-cloud/docs/advance-your-rules-with-smart-values/
Kotlin > Ktor > DockerでHello world!



Web ApplicationをDockerで動作するようにします。
（クラウドでデプロイするのに使えます）


# プロジェクトの作成

[Ktor Project Generator](https://start.ktor.io/)で新規プロジェクトを作成します

※ IntelliJでも新規プロジェクトは作れますが、obsolete（廃止）になっているので非推奨です。

<img src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/2e1f3068-303b-a930-21b5-14872052be07.png width=500px />



# Dockerの作成


## Dockerfile

ルートフォルダに`Dockerfile`を作成します

```:Dockerfile
# Use the official gradle image to create a build artifact.
FROM gradle:6.7 as builder

# Copy local code to the container image.
COPY build.gradle.kts .
COPY gradle.properties .
COPY src ./src

# Build a release artifact.
RUN gradle installDist

FROM openjdk:8-jdk
EXPOSE 8080:8080
RUN mkdir /app
COPY --from=builder /home/gradle/build/install/gradle /app/
WORKDIR /app/bin
CMD ["./gradle"]
```

### debug

試しに起動します

```
docker build -t my-application .
docker run -p 8080:8080 my-application
```


## docker-compose.yml

ルートフォルダに`docker-compose.yml`を作成します

```:docker-compose.yml
version: '2'
services:
  web:
    build:
      context: ./
      dockerfile: Dockerfile
    ports:
      - 8080:8080
```


## Docker起動

```
docker-compose up --build
```


起動後、↓にアクセスすると、Hello World!が表示されました。
http://0.0.0.0:8080/



![スクリーンショット 2021-08-07 23.25.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/49910/677984ae-6aec-70cb-cf0d-36f17e040385.png "スクリーンショット 2021-08-07 23.25.42.png")



こんなに簡単にDockerで起動できるなんて感動です


# ソース

今回のソースは以下に保存してます。

[sugasaki/ktor\-docker\-hello](https://github.com/sugasaki/ktor-docker-hello)




以下の情報を参考にしました


[Docker \| Ktor](https://ktor.io/docs/docker.html#getting-the-application-ready)


[docs/docs/serving/samples/hello\-world/helloworld\-kotlin at mkdocs · knative/docs](https://github.com/knative/docs/tree/mkdocs/docs/serving/samples/hello-world/helloworld-kotlin)

[Docker \- クイックスタート \- Ktor](https://jp.ktor.work/quickstart/quickstart/docker.html)
RealSense D455(librealsense2)使ってみた -導入編-

# はじめに
RealSense D455を使用するためには，librealsenseという公式SDKが必要です．
しかし，SDK2.0の公式ドキュメント以外のドキュメント(記事や書籍)がほぼありません．
微力ながら，自分で使ってみて得た知見などを共有していければと思います．

:::note alert
記事が分散して見つけづらくなっていたので以下に移動しました．
ご了承ください :bow:
:::

https://zenn.dev/yosse95ai/books/6fea5a9a44dfaf

シリーズをすべて一冊の本としてまとめたので，見やすくなりました．
MacBookの初期設定 おすすめソフト（作業効率化に）

新しくMacBookPro13インチを購入したので
初期設定準備がてら
個人的にインストールしておきたいソフトをリストアップしてみる。

- Clipy（クリッピー）
　コピペ履歴をしっかり管理、よく使用するワードはスニペット機能に登録しておくと便利！！
　windows + V を活用してたあなたに

- Mos
　タッチパットでの画面スクロールをマウスで実現、（ホイールのもっさり対策に）

- Shiftlt
　13インチの画面をフル活用したい場合に

- EVERNOTE
　勉強の整理、メモに

- Google日本語入力
　高精度変換機能（あくまで個人的な感想です）と「a,s,d,f,g,....」での変換候補の選択が可能

- trello
　タスク、やることリストの管理に

- GoogleChrome
　検索といったらコレでしょ！

- VSCode
　コード書くときはいつもコレ使ってます。（お好みで）

- XCode
　デフォルトではインストールされていないので忘れずにインストールしておきましょう（インストール長い）

以上、勢いで書きなぐりました。
もっとコレあると便利ですよ！がありましたらコメントください。
p5.playをやる記事#09_沢山のスプライト

[前回の記事](https://qiita.com/sdkfz181tiger/items/13d9646c6f5d0307ee72)

p5.playの使い方を解説しております。
[第1回の記事](https://qiita.com/sdkfz181tiger/items/c424b0777f7d7fe2203a)はこちらにありますのでご参照ください。

## 沢山のスプライト

スプライトの扱い方には慣れてきましたか?
今回は、沢山のスプライトを扱う方法についてのお話です。
p5.playでは、Groupという機能を使う事で、スプライトをまとめて扱う事ができます。

![group1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9823/cb5d378d-ff05-f924-2080-40950c43812c.png)

## グループの使い方
グループは、複数のスプライトを1つにまとめる機能です。(配列として扱う事も可能です)
使い方のおおまかな流れは下記の様になります。

1. グループを格納する変数を用意する(グローバル変数ですね)
2. グループを作る
3. グループにスプライトを追加する(何個でも追加できます)
4. グループにあるスプライトに色々やる

次の様にしてグループを作ります。

```JavaScript
let tanukiGroup = new Group();// タヌキグループ
```

このグループに対して、add関数を使ってスプライトを追加していきます。
(好きなだけ追加する事ができます)

```JavaScript
let tanu = createSprite(0, 0);// スプライトを作る
tanukiGroup.add(tanu);// スプライトを追加する <- ここですね!!
```

グループにも様々な関数が用意されており、その一例として衝突処理があります。
(スプライト同士の衝突処理でも使いましたね)

別のグループ(仮にninjaGroup)との衝突処理は、下記の様に記述できます。
これだけで、グループ同士の衝突処理ができてしまいます。

```JavaScript
tanukiGroup.bounce(ninjaGroup);//　タヌキグループとニンジャグループの衝突
```

![group2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9823/b4d912f7-579c-a93e-e3f9-6cb622f9009e.png)

これらを具体的にコードにすると下記の様になります。

```JavaScript
let imgA, imgB;
let tanukiGroup, ninjaGroup;// 1, タヌキグループ、ニンジャグループ

function preload() {
	imgA = loadImage("t_tanu.png");
	imgB = loadImage("t_ninja.png");
}

function setup() {
	createCanvas(windowWidth, windowHeight);
	frameRate(32);
	noSmooth();
	angleMode(DEGREES);
	
	tanukiGroup = new Group();// 2-1, タヌキグループを作る
	ninjaGroup = new Group();// 2-2, ニンジャグループを作る
	
	// 5個のスプライトをタヌキグループに追加
	for(let i=0; i<5; i++){
		let x = random(width);
		let y = random(height);
		let tanu = createSprite(x, y);
	  tanu.addImage(imgA);
	  tanu.debug = true;
		tanu.setSpeed(4, random(360));// 適当にどこかに向かう
		tanukiGroup.add(tanu);// 3-1, タヌキグループに追加
	}
	
	// 5個のスプライトをニンジャグループに追加
	for(let i=0; i<5; i++){
		let x = random(width);
		let y = random(height);
		let ninja = createSprite(x, y);
	  ninja.addImage(imgB);
	  ninja.debug = true;
		ninja.setSpeed(4, random(360));// 適当にどこかに向かう
		ninjaGroup.add(ninja);// 3-2, ニンジャグループに追加
	}
}

function draw() {
	background(33);
	drawSprites();
	tanukiGroup.bounce(ninjaGroup);// 4, タヌキグループ x ニンジャグループ
	
	// 全部のスプライトを画面から出ない様にする処理
	for(let spr of allSprites){
		if(spr.position.x < 0) spr.position.x = width;
		if(width < spr.position.x) spr.position.x = 0;
		if(spr.position.y < 0) spr.position.y = height;
		if(height < spr.position.y) spr.position.y = 0;
	}
}
```

タヌキグループとニンジャグループの衝突処理がうまくいきました!!(やった!!)

![mov2.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9823/b9964543-2234-fde7-e7e5-bc4a9abd0adb.gif)

お疲れ様でした。p5.playの解説は今回で最後です。
画像、アニメーション、マウスイベント、衝突処理までをやってみましたが、
いかがだったでしょうか?(何か作れそうな気がしてきますよね!?)

p5.playはとてもシンプルで扱いやすいライブラリだと思います。
是非挑戦してみてくださいね。
ここまで読んでいただき有難うございました。

[前回の記事](https://qiita.com/sdkfz181tiger/items/13d9646c6f5d0307ee72)

## おまけ動画(こちらもよろしくお願いします)

<iframe width="560" height="315" src="https://www.youtube.com/embed/bHtS5tgRmFY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Red Hat UBIに足りないパッケージをリクエストする方法

Red HatのUBI（Universal Base Image）はコンテナのベースイメージとしてRed Hatが正式サポートするイメージです。以前はRed Hat社のイメージレジストリでしか公開していなかったのですが、最近はUBI8がDocker Hubでも公開されるようになりました。

一方、UBIのyumリポジトリはRed Hat Enterprise Linuxと同等ではなく、かなり制限されたサブセットとなっています。そのため、必要なパッケージがなくて困るケースがあります。

足りないパッケージをリクエストする方法を下記FAQで見つけたので、困っている人はリクエストを上げてみると対応してくれる、かもしれません。

> https://developers.redhat.com/articles/ubi-faq?extIdCarryOver=true&sc_cid=701f2000001Css5AAC#

> #### 35. How to request new features in UBI?
Red Hat partners and customers can request new features, including package requests, by filing a support ticket through standard methods. Non-Red Hat customers do not receive support but can file requests through the standard Red Hat Bugzilla under Red Hat Enterprise Linux and the proper ubi7 or ubi8 Product Component. See the example screenshot:

> ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/241424/0a9ec9f4-32c9-1f28-3936-b94cd42e0a34.png)

> See also: [Red Hat Bugzilla Queue](https://red.ht/2UmqzEH)
gitでcommitをまとめる

push済みcommitをまとめる方法

```
# 直近3コミットをまとめる場合
git rebase -i HEAD~3

# (rebase画面)editor画面で直近1-2コミットを"squash"あるいは"s"にして上書き保存

# (commit画面)新しいコミットメッセージを入力して保存

# force push
git push -f origin master
```
【Python】グーグル検索結果のタイトルとリンクをCSVファイルに保存（ページ移動有）

##はじめに
グーグルの検索結果って時々刻々と変わっていると思うんだよね。
その仮説を調べるどうかは別として、
グーグル検索結果のタイトルとリンクをCSVファイルに保存するようにしたい

##仕様
・WebDriverはchromedriver を使用
・ブラウザはChrome ※ヘッドレスモードで実行
・検索エンジンはGoogle
・検索エンジンでの検索結果の対象とするページ数はコード内で指定（とりあえず10ページ）
・ページの移動は検索結果ページ下部の「次へ」のリンクテキストをclickすることで遷移
・ページが指定したページより少ない場合は最終ページに到達後に処理を終了してタイトルとリンクをCSVに保存する※エラーで終了しない
・検索するワードはコード内で指定→「トノサマバッタのローキック」
・ページ間の移動時は１秒待つ

##コード

```python
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
from bs4 import BeautifulSoup
from urllib.parse import urljoin
import requests
import pandas as pd
from time import sleep

MAX_PAGES = 10 # リンクをコピーするグーグル検索結果のページ数
SLEEP_TIME = 1 # 待ち時間[秒]
SEARCH_WORD = "トノサマバッタのローキック" # 検索ワード
SAVE_FILE_NAME = "result.csv"

def get_titles_links(url):
    # サイト内のリンクをリスト化する
    html = requests.get(url)
    soup = BeautifulSoup(html.content, "html.parser")
    links = []
    titles = []
    for element in soup.find_all("a"):
        try:
            title = element.find_all("h3")[0].text
            titles.append(title)
            link_ = element.get("href")
            link_url = urljoin(url, link_)
            links.append(link_url)
        except:
            pass
    return titles, links

# Chromeドライバーのオプション
options = Options()
options.add_argument('--disable-gpu')
options.add_argument('--disable-extensions')
options.add_argument('--proxy-server="direct://"')
options.add_argument('--proxy-bypass-list=*')
options.add_argument('--start-maximized')
options.add_argument('--headless')

# Chromeドライバーの起動
driver = webdriver.Chrome(options=options)

# Googleにアクセスする
url = 'https://google.com/'
driver.get(url)
sleep(SLEEP_TIME)

# Google検索窓にキーワードを入力して検索
selector = "body > div.L3eUgb > div.o3j99.ikrT4e.om7nvf > form > div:nth-child(1) > div.A8SBwf > div.RNNXgb > div > div.a4bIc > input"
element = driver.find_element_by_css_selector(selector)
element.send_keys(SEARCH_WORD)

# enterキーを押して検索
element.send_keys(Keys.ENTER)
sleep(SLEEP_TIME)

all_page_titles = [] #全ページのページタイトルを格納するリスト
all_page_links = [] #全ページのページURLを格納するリスト

# 指定のページ数分だけページを遷移させてタイトルとURLをリストに格納する
for page in range(MAX_PAGES):
    # 検索結果のページのリンクをリストに格納
    titles, links = get_titles_links(driver.current_url)
    
    # 検索結果のページのリンクを全ページのリストに格納
    all_page_titles.extend(titles)
    all_page_links.extend(links)
    
    # 検索結果下部の「次へ」ボタンをクリックしページ遷移する
    try:
        next_button = driver.find_element_by_link_text('次へ')
        next_button.click()
        sleep(SLEEP_TIME)
    except Exception as e:
        print(e)
        print("エラーページ：" + str(page+1))
        driver.quit()
        break

# データフレーム化する前にリストを辞書型のデータにする
result ={"title":all_page_titles,
         "link":all_page_links}

# データフレーム化してCSVファイルに保存
df = pd.DataFrame(result)
with open(SAVE_FILE_NAME,
          mode="w",
          newline="",
          encoding="cp932",
          errors="ignore") as f:
    df.to_csv(f, index=False)
```
【UE4】UPROPERTY(meta=(ContentDir))を知った

[1]:https://docs.unrealengine.com/4.26/ja/ProgrammingAndScripting/GameplayArchitecture/Properties/Specifiers/

UE4公式ドキュメントの[プロパティ指定子][1]で見つけてお試ししてみたメモ。

```c++
UPROPERTY(EditAnywhere, BlueprintReadWrite, meta = (ContentDir))
FDirectoryPath ContentDirectory;
```

上のように`FDirectoryPath`と`UPROPERTY(meta=(ContentDir))`を組み合わせると、変数の横に「…」ボタンがついて、コンテントディレクトリのブラウズができるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/2ab63388-888c-2574-b2ca-eb22e431e04d.png)

このスクショの例ではData Assetクラスの変数だが、クラスはAActorでもUActorComponentでも何でもよい。

ちなみに、`meta=(ContentDir)`がない場合は、OS標準のディレクトリブラウザが出る。
（これは`FDirectoryPath`の機能）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/eba2069c-9fa8-67e1-5318-d186c040cae0.png)

OS標準のディレクトリブラウザで良いときは、C++は不要。
Blueprintの変数に`Directory Path`型の変数を作ればよい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/358170/5e5883cb-f278-fae5-01f4-45c47ee51ab2.png)

Instance Editable(インスタンス編集可能)をTrueにしておけば、レベルに配置したときの詳細パネルに、「…」ボタン付きで公開される。

「このフォルダ以下のアセットを全部処理する」といった、エディタユーティリティの作成が捗るといいな。
Javaの超基礎（繰り返し処理)

##はじめに
Javaの基本文法のなかの繰り返し処理についてまとめました。よろしくお願いします。

##while文
while文はwhileの後の()の中に条件式を記述し、その条件が成り立つならば、{}の処理を繰り返し続けます。

```java
int n = 10;

while (i <= 20)
  System.out.println(i);
  i++;
}
```

上記の例は「i++」の記述によって一回処理が終わるごとにiに1が足され、20を超えると処理を終えます。
「i++」の記述がないと永遠に処理を行なってしまうので注意です。(無限ループ)

##for文
forの後の()に、変数の定義、条件式、変数の更新をこの順番通りに記述していきます。
また、それぞれの区切りにセミコロンをつけます。

先ほどのwhileと同じ処理をforで書いてみます。

```java
for (int i = 10; i <= 20; i++) {
  System.out.println(i);
}
```

なんだかこっちの方がわかりやすい気がします。

また、繰り返し処理を終了させる方法に、条件式から外れる以外に、「break;」でも終了させられます。

```java
for (int i = 10; i <= 20; i++) {
  if (i > 15) {
    break;
  }
  System.out.println(i);
}
```

このように記述すると、iが16になった時点で繰り返しを終了できます。

また繰り返しの中でif文と組み合わせてcontinueを使うと、ifの条件式に当てはまったときはスキップします。


```java
for (int i = 10; i <= 20; i++) {
  if (i % 2 == 1) {
    continue;
  }
  System.out.println(i);
}
```

このように記述すると、奇数はスキップされて、偶数だけが表示されます。
jsx, tsx コワクナイ

ワタシ、 [jQuery](https://jquery.com/) ツカッテキタ

ワタシ、 [Vue 2](https://jp.vuejs.org/index.html) ツカッテキタ

jsx? tsx?

アタラシイ拡張子、ナニソレ、コワイ

vue 拡張子、シラナイ、でも vue センヨウ拡張子ナンデショ。

```vue:index.vue
<template>
  <h1>Hello {{ userName }}!</h1>
</template>

<script>
export default {
  data: () => {
    return {
      userName: 'il-m-yamagishi',
    };
  },
};
</script>
```

[シングルファイルコンポーネント](https://v3.ja.vuejs.org/guide/single-file-component.html)、カンタン、ワカル

React ワカラナイ、コワイ

デモツカッテミル。エンジニア、チョウセン、スル

```jsx:index.jsx
import React from 'react';

const Index = ({ userName }) => {
  return <h1>Hello {userName}!</h1>;
};

export default Index;
```

ナニコレ、コワイ。 JavaScript ノナカニ HTML ノッテル！！

...

アレ、デモ、コッチノホウガ カンタンカモ？

関心ノ分離、デキテル。

タダノ関数ダカラ、状態ガナクテワカリヤスイ。

ソレニ コレ、糖衣構文ラシイ。

> これは JSX と呼ばれる JavaScript の構文の拡張です。UI がどのような見た目かを記述するために、React とともに JSX を使用することを私たちはお勧めしています。JSX はテンプレート言語を連想させるでしょうが、JavaScript の機能を全て備えたものです。
> https://ja.reactjs.org/docs/introducing-jsx.html

```js:index.js
import React from 'react';

const Index = ({ userName }) => {
  return React.createElement(
    'h1',
    {},
    'Hello ' + userName + '!'
  );
};

export default Index;
```

コレヲ ワカリヤスク カキクダスノガ jsx ナンダネ。ワカッテキタ。

```tsx:index.tsx
import React from 'react';

type IndexProps = {
  userName: string,
};

const Index: React.FC<IndexProps> = ({ userName }) => {
  return <h1>Hello {userName}!</h1>;
};

export default Index;
```

TypeScript モキレイニ型ガウメコメル。キモチイイ。

jsx, tsx ワカッタ。 vue ヨリキモチイイ カモ。

ミンナモ クワズキライ セズ tsx ツカッテミテ。
sympyで(内心)「2021年度東海大学(医)2日目数学【１】(1)」をやってみた。

もっと、短くなる方法を教えて下さい。
解答、別解1.別解2のようにやったら、いいですか？

# original link
x-y=0,x+y-2=0,3*x-y-6=0
3直線でできる三角形に内接する円の中心の座標(内心)

https://www.mebio.co.jp/files/answer/2021/M_toukai_2021B.pdf


#SymPy Liveで
以下のソースコードを貼り付けて、Evaluateです。

https://live.sympy.org/

```python
from sympy import *
var('x y')
def mySympify(myL):
    return sympify(myL.replace('=0',''))
def myDicPoint(myDic):
    return Point2D(myDic.get(x,""),myDic.get(y,""))
myInput="x-y=0,x+y-2=0,3*x-y-6=0"
print("#",myInput)
myStr=myInput.split(',')
myLine_0=Eq(mySympify(myStr[0]),0)
myLine_1=Eq(mySympify(myStr[1]),0)
myLine_2=Eq(mySympify(myStr[2]),0)
myP0=myDicPoint(solve([myLine_1,myLine_2],[x,y]))
myP1=myDicPoint(solve([myLine_2,myLine_0],[x,y]))
myP2=myDicPoint(solve([myLine_0,myLine_1],[x,y]))
print("#",Triangle(myP0,myP1,myP2).incenter)
# x-y=0,x+y-2=0,3*x-y-6=0
# Point2D(4 - sqrt(5), 1)
# ('#', 'x-y=0,x+y-2=0,3*x-y-6=0')
# ('#', Point2D(4 - sqrt(5), 1))
```

# WolframAlphaでもやってみたい。

https://stackoverflow.com/questions/68589658/3-line-triangle-3-inequality-i-want-to-convert

# (参考)

https://qiita.com/mrrclb48z/items/c01ef729963e5b6cdc6a
【メモ】AWSでApplication Load Balancerの作成

実際にやってみたときのメモです。
（覚えたものがあれば、随時更新）

### 前提事項
とりあえず作成したため、細かい設定はしていません。

# 手順

## ロードバランサーの作成
`EC2`のメニューから、`ロードバランサー`を選択し、
`[ロードバランサーの作成]` ボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/579c137b-c3cd-36db-d862-2338f4aaf43e.png)

## ロードバランサーの種類の選択
* `Application Load Balancer`を選択し、[作成] ボタンを押す

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/b1f2cc52-c09e-04fc-23c0-959acbc18421.png)

## ロードバランサーの設定
基本事項の設定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/6d1b33b5-19f9-2ddd-0a48-208f9ba46e71.png)

* 基本的な設定

|項目|説明|
|:--|:--|
|名前|作成するロードバランサーの名前|
|スキーム|`インターネット向け`, `内部向け`を選択|
|IPアドレスタイプ|`ipv4`, `dualstack`を選択|

* リスナー

|項目|説明|
|:--|:--|
|ロードバランサーのプロトコル|`HTTP`, `HTTPS`を選択|
|ロードバランサーのポート|特定の番号にする場合、個別に入力|

* アベイラビリティーゾーン

|項目|説明|
|:--|:--|
|VPC|対象のVPCを指定。|
|アベイラビリティーゾーン|トラフィックを振り分けしたいAZとそのサブネットを指定。<br>AZは2つ以上で設定し、サブネットは1つのAZに1つ設定。|

* アドオンサービス（任意）

* タグ（任意）
タグ管理したいときに設定。

## セキュリティ設定の構成
HTTPSを選択した場合、SSL証明書の設定を行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/d97b3d62-e85a-7702-abfa-cb5b043e8ca6.png)

|項目|説明|
|:--|:--|
|証明書タイプ|使いたい証明書の取得方法や設定方法に応じて選択。<br>ACMのサービスで証明書を取得・利用することも可能。|
|証明書の名前|取得した証明書の名前を選択|

* セキュリティポリシーの選択<br>
特に指定なければ、デフォルトのまま。


## セキュリティグループの設定
作成するELBに適用するセキュリティグループを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/7fe11391-5db6-a6f8-a50c-67d591ec8d16.png)

## ルーティングの設定
リクエストをルーティングするターゲットグループを選択。
ターゲットグループがない場合は新規作成。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/b6265f2e-9838-7dd9-68c7-439a7f19fe74.png)

* ターゲットグループ

|項目|説明|
|:--|:--|
|ターゲットグループ|未作成の場合は、`新しいターゲットグループ`を選択。|
|名前|ターゲットグループの名前。|
|ターゲットの種類|ロードバランサーがルーティングで使うプロトコル。<br>`インスタンス`, `IP`, `Lambda 関数`から選択。|
|プロトコル|`HTTP`, `HTTTPS`から選択|
|ポート|ロードバランサーがルーティングで使うポート。|
|プロトコルバージョン|`HTTP1`, `HTTP2`, `gRPC`|

* ヘルスチェック（任意）

## ターゲットの登録
ルーティングするインスタンスを設定。
`インスタンス`から、設定したいインスタンスにチェックを入れ、
`[登録済みに追加]`で、登録済みターゲットに追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/a8bab979-50fc-65f4-d485-d72fa5567aa3.png)

## 確認
作成するロードバランサーの内容を確認して、`[作成]`。
【メモ】AWSでEC2インスタンスの作成

実際にやってみたときのメモです。
（覚えたものがあれば、随時更新）

### 前提事項
とりあえずEC2を作ってみたもので、細かい設定等は実施していません。

# 手順

## インスタンスの起動
`EC2`のメニューから、`インスタンス`を選択し、
`[インスタンスの起動]` ボタンを押す。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/a6d772df-184f-ef47-f00d-fb7da6135f2d.png)


## Amazon マシンイメージ (AMI)
作成するEC2のテンプレートを`[選択]`

* クイックスタート<br>
特に個別のAMIを使わない場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/2dbc84e1-4768-0637-d781-100ab225b441.png)

* マイAMI
自分で作成したAMIを使う場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/aefcdd8f-829a-974f-8e9b-8d210c8b980a.png)

## インスタンスタイプの選択
作成したいタイプを選択。
CPU数やメモリ等でタイプが異なるため、適切なものを選ぶ。

詳細設定不要であれば、`[確認と作成]`。
詳細設定を行う場合は、`[次のステップ：インスタンスの詳細の設定]`。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/ea1ec753-56db-29b1-75ed-a3ab61975594.png)

## インスタンスの詳細の設定
細かい内容の設定を行う。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/2d8e11c6-7f63-5792-360a-90a891b7a578.png)

|項目|説明|
|:--|:--|
|インスタンス数|作成する数。デフォルトは1。|
|購入のオプション|スポットインスタンスをリクエストして、支払い可能なインスタンス時間当たりの最高価格が指定できるオプション。|
|ネットワーク|インスタンスを作成するVPC。|
|サブネット|インスタンスを作成するサブネット。|
|自動割り当てパブリック IP|パブリックIPアドレスの設定方法。<br>`サブネット設定を使用(有効)`, `有効`, `無効`を選択。|
|配置グループ|プレイスメントグループにインスタンスを起動すると、冗長性とネットワーキングスループットが高められる。|
|キャパシティーの予約|特定のアベイラビリティーゾーンの EC2 インスタンスに対してキャパシティーを予約する。<br>`開く`, `なし`, `グループ別のターゲット`, `ID別のターゲット`|
|ドメイン結合ディレクトリ|AWS Directory Service で定義したディレクトリにインスタンスを結合することができ、インスタンスのネットワーク全体でシングルサインオンと一元管理が可能になる。|
|IAM ロール|必要であれば設定。|
|シャットダウン動作|OS レベルのシャットダウンが実行された時のインスタンスの動作。<br>`停止`…再起動できる、 `終了`…再起動できない(削除)|
|停止 - 休止動作|休止動作はインスタンスを停止し、インスタンスのRAMにある情報をルートボリュームに保存する。|
|終了保護の有効化|インスタンスを誤って終了しないように保護する。|
|モニタリング|CloudWatchのモニタリング利用時に設定。|
|テナンシー|`共用-共用ハードウェアインスタンスの実行`, <br>`専用-専用ハードウェアインスタンスの実行`, <br>`専用ホスト-このインスタンスを専用ホストで起動`|
|Elastic Inference|Elastic Inferenceを使うときに設定。|
|クレジット仕様|無制限を設定するとバースト上限超過してもインスタンスを利用可能。|
|ファイルシステム|インスタンスにマウントする Amazon EFS ファイルシステムを指定。|

* ネットワークインターフェイス（任意）
* 高度な詳細（任意）

## ストレージの追加
ストレージが使うルートボリュームの設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/20e7d611-4ea5-a540-6e79-5382623ed397.png)

## タグの設定
タブ管理したいときに設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/15a443f7-af05-424f-87be-ed7cf05c6ff6.png)

## セキュリティグループの設定
作成するインスタンスへのアクセス権限の設定。
新規作成、または、既存のセキュリティグループを利用できる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/c0d8624c-c4d5-2076-bb5f-c1a192b54293.png)

## インスタンス作成の確認
作成するインスタンスの内容を確認して、`[起動]`。
キーペアの利用方法を選択して、`[インスタンスの作成]`。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580406/c1d1e966-e6a0-a09b-e44d-a9a8d38830ab.png)
Railsでデバック　binding.pryを使う

# デバックとは
プログラムのバグを手直しすること。
binding.pryを止めたい場所に挟む。

# デバックの考え方
binding.pryで止まらなかった。
それより前にどこかに問題がある。

# railsでbinnding.pryの導入
まずはgemのインストール
Gemfile

```rb
group :development, :test do
  gem 'pry-rails'
  gem 'pry-byebug'
end

```

# binding.pryで処理を止める
binding.pryを挟めばok

```home_controller.rb

class HomeController < ApplicationController
  def index
    binding.pry
end
end

```
```
$ bundle exec rails s
```

```localhost:3000/homes/index``` のURLに入力すると処理が止まる。

# 使えるコマンド
|next|次の行へ移動|
|--|--|
|continue|プログラムの実行|
|step|次の行かメソッド　あまり使わない|
|exit!|強制終了|
直接の親子関係無しで「動く足場」の上の物体を制御する

動く足場の上に乗った物体を足場と一緒に動かしたい場合、足場のオブジェクトと親子関係にするのが定番だが、親子関係にすると不都合が出る場合がある。
たとえば、CharacterControllerで制御しているプレイヤーを動くオブジェクトの子供にすると、CharacterControllerの動作が怪しくなることなどがあった。

そのような場合に、なるべく簡単かつ軽量に同様の処理を実装したい。

前提として
・「足場」は次frameでどのように移動できるか予測できない
・「上に乗っている物体」は、足場の上で好きに動く（乗り物の上にいる操作キャラのように）
のような状態でも使える方法とする。

実装1：計算でゴリ押し実装
親子関係で無い以上、LateUpdate()内で、動く足場が前フレームの位置からどれだけ移動したか？どれだけ回転したか？を確認する方法になるが、ややこしい計算になる。
「平行移動」については、足場のposition変化量を物体のpositionに加算するだけで良いが、足場のrotationについては、足場の回転軸と物体の位置関係も考慮する必要がある。
Vector3系関数を使って計算する場合、お互いのlossyScaleに影響しないように考慮が必要な場合もある。

一応はそれっぽく動いたが、複雑な計算だと分かりづらく、意図的にイレギュラーな動きをさせたい場合などに応用が難しそうだったため、もっと簡単な方法を模索

実装2：目印オブジェクトを使う
動く足場の子オブジェクトとして、目印のオブジェクトを用意する。RigidbodyもColliderもRendererも無いEmptyオブジェクトで良い。

動く足場に乗った物体ごとに1つずつの目印を用意する

LateUpdate()内でやることは、
①目印のpositionが前フレームの目印のpositionと異なる場合
　②物体のposition += 目印のposition - 前フレームの目印のposition
　③目印のposition = 物体のposition
　④目印のpositionを変数に格納(次フレームに①②で利用)
⑤目印のrotationがQuaternion(0f, 0f, 0f, 1f)と異なる場合
　⑥物体のrotation = 物体のrotation * 目印のrotation
　⑦目印のrotation = Quaternion(0f, 0f, 0f, 1f)

つまり、目印のrotationを毎フレーム「物体の座標」、「固定の方向」に合わせておく。
目印は足場の子オブジェクトなので、「物体が子オブジェクトだったらどれだけ動くか？」をトレースしてくれる。なので、次フレームでは物体の座標を「目印の座標変化量」だけ移動させ、物体の回転を「目印の回転」だけ回転させるだけ。

工夫したところは、前フレームの目印のrotationを覚えておいたり、物体のrotationと合わせたりしなくても、毎フレームQuaternion(0f, 0f, 0f, 1f)で固定しておけば、次フレームで変化分を簡単に反映できるところ。

処理がシンプルなので、「足場の動きの変化にあわせて揺らしたい」「移動や回転速度が一定以上になると追従を弱めたい」「足場から離れた時の慣性の計算に使いたい」ような場合にも工夫しやすい。

毎フレームの計算になるので、目印と物体のtransformを変数に入れておくこと。Quaternion(0f, 0f, 0f, 1f)も事前にnewで作って使い回すことを忘れずに。
Docker+RailsAPIモード+MySQL設定プロジェクトをHerokuにデプロイ

※自分用メモ

開発環境はDockerでフォルダをバックエンド(RailsAPI)、フロントエンド(Vue)に分けHerokuにデプロイするまでの流れです。
この記事ではバックエンドフォルダをHerokuにデプロイするまでの行程を紹介します。

Dockerで開発したRailsプロジェクト(APIモードじゃない)をHeorkuにデプロイするやり方は前に書いた記事で紹介したんですが、上手くいかなかったので、APIモードのRailsプロジェクトでは今回の方法を採用しました。
前回記事
https://qiita.com/ryota-0906/items/55c6204532988aa73c82

#1 前提条件 
1 クレジットカード登録済みのherokuアカウント
2 heroku cliインストール済み

#2 コンテナ停止&server.pidを削除

```
$ cd <RailsAPIディレクトリ>
$ docker-compose stop
$ rm -f tmp/pids/server.pid
```
#3 heroku準備　

```
$ heroku login --interactive
$ heroku container:login 
$ heroku create アプリ名
Creating ⬢ アプリ名... done
https://アプリ名.herokuapp.com/ | https://git.heroku.com/アプリ名.git
```

#4 herokuでMySQLを使えるようにする。　

HerokuでMySQLを使うためにClearDBのアドオンを追加

```
$ heroku addons:create cleardb:ignite --app アプリ名
$ Creating cleardb:ignite on ⬢ app_name-20201027... free
Created cleardb-deep-10722 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation
```

CLEARDB_DATABASE_URLにDB接続情報がセットされている

```
$ heroku config:get CLEARDB_DATABASE_URL
mysql://{ユーザー名}:{パスワード}@{ホスト名}/{データベース名}?reconnect=true
```

DATABASE_URLにMySQLのURLをセットする
mysql://ではなくmysql2://になっているので注意。

```
$ heroku config:add DATABASE_URL=mysql2://{ユーザー名}:{パスワード}@{ホスト名}/{データベース名}?reconnect=true
```

 config/database.ymlのproductionの箇所を変更

```config/database.ymlのproduction
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: <%= ENV.fetch("DB_HOSTS") { 'db' } %>

development:
  <<: *default
  database: app_name_development

test:
  <<: *default
  database: app_name_test

production:
  <<: *default
  url: <%= ENV['DATABASE_URL'] %>　##これを追加
```

#4 herokuにRailsAPIプロジェクトをデプロイ。

```
$ cd <RailsAPIプロジェクト>
$ git init 
$ git add =A
$ git commit -m "first commit"
$ git remote add heroku https://git.heroku.com/アプリ名.git
$ git push heroku master
$ heorku run rails db:migrate --app アプリ名
$ heroku open --app アプリ名 #サイトを開く
```

#5 ターミナルでデータをリクエストを送りデータ通信・保存ができているかテスト
※開発段階でTaskモデルを作成しています。

```
#Post
$ curl https://アプリ名.herokuapp.com/api/tasks -X POST -d 'task[text]=洗濯する'
create new task.
#Get 
$ curl https://アプリ名.herokuapp.com/api/tasks
[{"id":1,"text":"洗濯する","created_at":"....","updated_at":"...."}]
#Delete
$ curl https://アプリ名.herokuapp.com/api/tasks/1 -X DELETE
destroy a task.
```

#6 RailsにおけるCORS対応
※フロントエンドとのやり取りに必要
Rails側のAPIサーバ側で、CORSに対応していなかったためブラウザ側で受信を拒絶されていたようです。Railsでは gem cyu / rack-coresを使うと、簡単にCORS対応が可能になります。
Gemfileに以下の一行を追加して、bundle installをします

```Gemfile
gem 'rack-cors'
```

次に、config/initializers/cors.rbのコメント部分をコメントアウトします。
originsのところで、許容するオリジンを指定してあげます。
これだけで、APIサーバ側でCORSの設定ができます。

```config/initializers/cors.rb
# Be sure to restart your server when you modify this file.

# Avoid CORS issues when API is called from the frontend app.
# Handle Cross-Origin Resource Sharing (CORS) in order to accept cross-origin AJAX requests.

# Read more: https://github.com/cyu/rack-cors

Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'フロントエンドアプリのURL'

    resource '*',
      headers: :any,
      methods: [:get, :post, :options]
  end
end
```
GRDBが実行しているsqlを出力する方法

## はじめに

GRDBでinsertやupdateを発行した際、実際に実行されているsqlを確認する方法について記載します。ログ出力などにも活用できると思います。

## 実装

DatabaseQueueを生成する際にconfigrationを指定します。

```Swift
var config = Configuration()
config.prepareDatabase { db in
    db.trace {
        let description = $0.description
        print(description)
    }
}
let dbQueue = try DatabaseQueue(path: Const.DB_FILE_PATH, configuration: config)
```
Servicenowでテーブルの最新レコードの一覧をGASで取得し、定期更新する


Servicenowを使っていて、テーブル一覧をスプレッドシートに取得し、かつ１５分おきに更新して最新の状態を維持したくなったので自分用のメモ。

APIを用いて、シートに既に入っているレコードは更新し、シートに入っていないレコードは新規行を追加する。

何をキーにするか、レコードごとの一意の値を予め決めておく必要があるのは注意。

```
const ID = "ID";
const TOKEN = "TOKEN";
const ss = SpreadsheetApp.openById("スプレッドシートid");
const sheet = ss.getSheets()[0];
const values = sheet.getDataRange().getValues();
const lastRow = sheet.getLastRow();

function getData() {
  const encoded = encode();
  const headers = {
    "Authorization": " Basic " + encoded
  };
  const options = {
    "method": "get",
    "headers": headers,
    "contentType": "application/json",
  }
  const res = UrlFetchApp.fetch("https://インスタンス名.service-now.com/api/now/table/テーブル名?sysparm_limit=1000", options);
  const resultObjArr = JSON.parse(res.getContentText()).result;
  outerArr = [];
  resultObjArr.forEach(function (data) {
    let innerArr = [
      //ここの配列にカラムの物理名を入れればシートの列がに増える
      data.number,
      data.columnName1,
      data.columnName2,
      data.columnName3,
    ]
    judgeIfUpdateOrInsertAndExcec(sheet, [innerArr])
  });
}


function judgeIfUpdateOrInsertAndExcec(sheet, request) {
  const textFinder = sheet.createTextFinder(`^${request[0][0]}$`).useRegularExpression(true);//[0][xxx]のxxxに、キーにするカラムの列番号を入力する
  const cell = textFinder.findNext();
  if (cell === null) {//新規の時
    sheet.appendRow(request[0]);
  } else {//更新のとき
    let rowNumber = cell.getRow();
    updateRow(sheet, request, rowNumber);
  }
};

function updateRow(sheet, request, rowNumber) {
  sheet.getRange(rowNumber, 1, 1, request[0].length).setValues(request);
};

function encode() {
  let encoded = Utilities.base64Encode(ID + ':' + TOKEN);
  console.log(encoded);
  return encoded;
}
Action Text(リッチテキストコンテンツ)に文字数制限をかける際の注意点

#はじめに
右も左もわからない未経験エンジニアが書く投稿です。
膨大な勉強量の中で、気になったことや発見などを書いていこうと思います。

今回はRail6より導入されたActionTextでvalidate length: { maximum: }を扱う際の注意点を
メモしようと思います

#開発環境
Rails 6.1.3.2
actiontext (6.1.4)

#本記事を書くまでの経緯
現在、Railsにてポートフォリオ（Q&Aサイト）の制作をしていて
記事作成・編集時にActionTextを使用しています
（Rails6であれば導入自体はとても簡単なのでおすすめです♪）

https://railsguides.jp/action_text_overview.html

ActionTextに文字数制限を掛けたくて

``` rb:models/article.rb
validates :content, length: { maximum: 20000 }
```

と設定後、テストしてみると文字数が合わないことに気が付きました

初めて使用する機能で、何がどうなってるんだ？と気になり
原因を探ることになったのでメモします


#先に結論
###保存されるデータにはHTMLタグなども含まれます
文字数の制限を掛けたりする時は気をつけましょう！

#本題
####ActiveTextを使用しない場合

「文字数制限かけよう！」となったら

``` rb:models/article.rb
validates :content, length: { maximum: 100 }
```

と記述すれば１００文字以内で記入することを定められ、DBに登録される際は入力された文字がそのまま保存されます

例）　記事に**「こんにちは」**と書いた時
`content: "こんにちは"`
と保存される
***


####ActionTextエディタを使用した場合
***action_text_rich_text***
というテーブルに保存される事になるのですが、ここで異変が起こります

例）記事にエディタ機能（太文字など）を使わずに**「こんにちは」**と書いた時
`body: #<ActionText::Content "<div class=\"trix-conte...">`
と保存される

保存される前に　binding.pry　で確認すると中身は
`<div class=\"trix-content\">\n  こんにちは\n</div>\n"`
となっています

「こんにちは」に追加で**３７文字**入っている事になります

#結果
以上の事からActionTextを使用した際は
**100文字書き込んだとしたら、100文字以上になってしまう**


もちろん画像を含めたり、エディタ機能を使えば文字数はどんどん増えていきます

この事を頭に入れてからlengthをかけましょう♪

#最後に
勉強を始めたばかりで知識もなく、拙い文章ですがアウトプットすることで頭の中を整理しつつ、どなたかのお役に立てれば良いなと思い投稿させて頂きました。
最後まで見て頂きありがとうございました！
[Dockerfile] FROMよりも前に記載したARGが有効にならなかった

# ダメなパターン

こんな`docker-compose.yml`があったとして、

```yaml:docker-compose.yml
version: "3.0"
services:
  python:
    build:
      context: .
      args:
        SMILE: o(^ワ^*)o
```

以下のようにARGを指定するとダメ。

```Dockerfile:Dockerfile
# ARGが、FROMよりも上に書いてある！！！
ARG SMILE
FROM python:3.8.1

RUN echo "SMILE: ${SMILE}"
```

このようなDockerfileだと、

```bash:bash
$ docker-compose build
Building python
Step 1/3 : ARG SMILE
Step 2/3 : FROM python:3.8.1
 ---> efdecc2e377a
Step 3/3 : RUN echo "SMILE: ${SMILE}"
 ---> Running in 522ab58c9bac
SMILE:
Removing intermediate container 522ab58c9bac
 ---> 64687fd42d90

Successfully built 64687fd42d90
Successfully tagged docker-sample_python:latest
```

上記の通り `SMILE:` しか表示されず、`ARG`が使えていないことがわかる。

# 対策

`ARG`は`FROM`よりも後に記載する。

```Dockerfile:Dockerfile
FROM python:3.8.1
# ARGはFROMよりも下に記載する！！！！！
ARG SMILE

RUN echo "SMILE: ${SMILE}"
```

こうすると、

```bash:bash
$ docker-compose build
Building python
Step 1/3 : FROM python:3.8.1
 ---> efdecc2e377a
Step 2/3 : ARG SMILE
 ---> Using cache
 ---> da3cf9ae6c2f
Step 3/3 : RUN echo "SMILE: ${SMILE}"
 ---> Running in 36276236b609
SMILE: o(^ワ^*)o
Removing intermediate container 36276236b609
 ---> 31d8eae73c0b

Successfully built 31d8eae73c0b
Successfully tagged docker-sample_python:latest
```

`SMILE: o(^ワ^*)o`と表示されてますねo(^ワ^*)o


# ひとこと

「あの～、この問題の対処と理解が終わるまで、5時間以上かかったんですけど～」
「それが今のお前の実力だ。」
「(´；ω；｀)ﾌﾞﾜｯ」

|･`ω･´)ﾁﾗﾘｯ みなさんのお役に立てれば嬉しいです！

# 参考にした記事

今回の問題には直接の関係はなかったのですが、`ARG`について非常に勉強になったので、特に学習に有用と感じたサイトを掲載しておきます。

## 1. ARGそのものについて

https://qiita.com/nacika_ins/items/cf8ceb20711bd077f770

## 2. ENVとARGの違いについて

https://techblog.recochoku.jp/1979

https://kossy-web-engineer.hatenablog.com/entry/2020/01/04/000857

## 3. [RUN]が関係するときの動作について

https://www.it-swarm-ja.com/ja/bash/run%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E6%96%87%E5%AD%97%E5%88%97%E5%86%85%E3%81%AEdockerfile-arg%E7%BD%AE%E6%8F%9B/838552360/

https://h-yoshikawa44.com/docs/docker/docker-dockerfile/#run

## 4. docker build時にARGのcacheが有効になるかどうかについて

https://docs.docker.jp/engine/reference/builder.html#impact-on-build-caching

## 5. [CMD]で変数が展開されないとき

https://qiita.com/shts/items/9435efc718a7a618d8f3
[Ruby on rails]グループ作成機能③グループ管理者/作成者の表示　class_nameオプション

<h2>初めに</h2>

①②の記事で、グループ作成、参加、退会を実装してきました。
今回その続きです。
:sunny:注意①②と③④で作ってるアプリが違います。
①②は本の投稿(bookモデル）サイトでの、グループ作成機能。
③④は記事の投稿（postモデル）サイトでの、グループ作成機能です。
①②と③④でGroupのカラムが若干違います。
グループ名（name)、
グループ紹介（introduction)
オーナーid(owner_id)は共通ですが、
①②では、t.string :image_idがあるのに対し、
③④では、image_idが無く、t.string :status（参加条件）を
付け足しています。

行う作業自体は変わりませんが、少しややこしいかもしれません...

<h2>やりたいこと</h2>

以下のように、グループ管理者を表示させたいです。
今回の場合は、山田たお　さんです。

![スクリーンショット 2021-08-03 22.41.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1633266/14a17637-1383-ddef-927f-3cc739784546.png)

<h6>正直、大変でした！！！全然、分からず、できず......</h6>



<h2>マイグレーションファイルの編集</h2>


```perl:Groupのマイグレーションファイル
class CreateGroups < ActiveRecord::Migration[5.2]
  def change
    create_table :groups do |t|
      t.string :name,null: false
      t.text :introduction,null: false
      t.integer :owner_id
      t.string :status
      t.references :user
      t.timestamps
    end
  end
end
```
①グループテーブルにuserの外部キーを記載しました。
Group：User は１：N
User:Groupは１:Nなので、GroupUserという中間テーブルを作成してますが、
グループの作成者については、作成者はグループに「１人」なので、
別でリレーションを書くことができるんですね:point_up:

<h2>モデルファイル編集</h2>

```perl:group.rb
class Group < ApplicationRecord
  has_many :group_users
  # グループは複数のユーザーを持つ。group_usersから参照可能
  has_many :users, through: :group_users,dependent: :destroy
  # グループオーナー表示のために
  belongs_to :user
省略
```

```perl:group.rb
class Group < ApplicationRecord
  has_many :group_users
  # グループは複数のユーザーを持つ。group_usersから参照可能
  has_many :users, through: :group_users,dependent: :destroy
  # グループオーナー表示のために
  belongs_to :user
省略
```

```perl:user.rb
# グループのアソシエーション
  has_many:group_users
  # group_usersは中間テーブル
  has_many:groups, through: :group_users,dependent: :destroy
  # グループオーナー表示のため
  has_many :owned_groups, class_name: "Group"
省略
```
```has_many :owned_groups, class_name: "Group"```は、
正直に書くと、```has_many :groups```です。
しかしながら、すでにその記述はしているので、出来ません。
なので、グループとグループオーナーの関係は、class_nameを使用して書きます。
これでユーザー１に紐づくグループ、ユーザー１に紐づくowned_groupの関連づけが完成すると。

<details><summary>class_nameオプションとは？</summary><div>

関連名と参照先のクラス名を異なるものにしたい場合に指定します。
以下の記事で、スッキリわかります。


https://qiita.com/wacker8818/items/eccdf0a63616feb14a70

</div></details>

<h2>コントローラー編集</h2>

```perl:groups_controller.rb
def create
    @group = current_user.owned_groups.new(group_params)
    @group.owner_id = current_user.id
    @group.users << current_user
    if @group.save
      redirect_to group_path(@group)
    else
      render 'index'
    end
  end
```

<h2>Viewでオーナー表示</h2>

```perl:index.html.erb
<%= group.user ? group.user.name : "不明" %>が
  <i class="far fa-clock"><%=group.created_at.strftime('%Y/%m/%d') %>に作成</i>
```
```<%= group.user ? group.user.name : "不明" %>```
この記述も以下で紹介している記事にあった記述なのですが、
プロっぽいな・・・と思いました。
group.userが存在してたらユーザー名、
そうでないなら”不明”と表示するという記載だと思います。


<h2>以下の記事を参考にして、実装出来ました！！</h2>

https://teratail.com/questions/306622


<h2>うーーん難しい</h2>

正直、理解しきれていません。。。。。。
また、随時更新します。
貢献チャンスの探し方

バグだと文句言うな、貢献チャンスと言え委員会がお送りします。
貢献がどんだけ大事かはこの記事では説明しません。

多分続編：[最短2週間で著名OSSのメンテナになる方法](https://qiita.com/umireon/items/50bd6521b0f861fdef4c)

## Qiita編

### ホームフィードからTypo指摘

Qiitaにログインしていると[パーソナライズされたおすすめ記事一覧](https://qiita.com/)が表示されます。自分が興味ありそうというだけなので、だいたい10本に1本くらいはTypoがあります。Typoを直すだけの編集リクエストを送りましょう。
貢献チャンス！

例：https://qiita.com/oga0927/items/195a1dfd92d545ae6102/revisions/4

### TwitterからTypo指摘

[@qiitapoi](https://twitter.com/qiitapoi)や[@qiita_milestone](https://twitter.com/qiita_milestone)をフォローしていると急に人気が出てきた記事を発見できます。そのような記事はだいたい5本に1本くらいはTypoがあります。あとは同じです。
貢献チャンス！

例：https://qiita.com/taka_horibe/items/8838b08f88f1a55fb9a7/revisions/2

### 自分が読んだ記事のTypo指摘

開発していて色々検索してQiitaの記事にたどり着くことは多いと思います。メジャーな技術スタックの記事ならいいですが、マイナーなものの記事にはかなりの確率でTypoが含まれています。
貢献チャンス！

例：https://qiita.com/Zero_Kohaku/items/45f07b6b094ad3d65c3c/revisions/5

### LGTMやストックされる記事を書く

これは難しいですが、自分がハマった問題を記事にするとたまにヒットします。
貢献チャンス!

例：https://qiita.com/umireon/items/f2cf44621070e749d73e

### 検索したら一番上にくる記事を書く

これは狙ってやるのは無理ですね。
貢献チャンス！

例：https://www.google.com/search?q=pgfplots

## GitHub編

### ドキュメントのTypo指摘

ドキュメントにTypoを見つけたらソースのGitHubリポジトリにプルリクエストをマージしてもらえる可能性があります。
貢献チャンス！

例：https://github.com/mdn/translated-content/pull/1511

### 自分でOSS作ってコミット

自分で作ったOSSへのコミットも立派な貢献です。
貢献チャンス！

例：https://github.com/taka3sh/sns.taka3sh.org

### HomebrewのFormulaの修正

みなさん使っているであろうHomebrewのソフトウェア定義であるFormulaは、実はGitHubで管理されていて大元のバージョンアップなどが原因でしょっちゅう古くなったり壊れたり、そもそも元々の定義がおかしかったりします。Homebrewでインストールするのを諦める前にFormulaの修正ができないかやってみましょう。だいたい1日で結果が出ます。
貢献チャンス！

例：https://github.com/Homebrew/homebrew-cask/pull/105736

### 開発で使っているOSSの仕様に不満があったら変更の提案のプルリク

OSSは利用者みんなで開発してより良いものを作っていこうと言う方針のところが多いので、よほど巨大な変更でない限りいきなり新仕様案のプルリクエストを送っても見てもらえます。自分が不便だと思うことはみんなも不便だと感じているかもしれないので、とりあえず提案してみましょう。それがOSSを利用するもののあるべき姿だと思います。
貢献チャンス！

例：https://github.com/aws/aws-cdk/pull/15177

### OSSのバグ修正

OSS使っているとコーナーケースのバグに遭遇することがあります。遭遇したら初期化してなかったことにするのではなく、メンテナにレポートして直してあげましょう。バグ修正でレポートがしっかりしていたりテストケースを追加していたりするなら喜んでマージしてくれるはずです。
貢献チャンス！

例：https://github.com/Homebrew/brew/pull/1547

### OSSのメンテナが実装したがっている機能を代わりに全部実装する

一歩間違えるとすごい揉めるので段階を踏んでやりましょう。
貢献チャンス！

例：https://github.com/DhavalKapil/luaver/pulls?q=is%3Apr+is%3Aclosed+author%3Aumireon

### OSSの仕様修正

これは相当消耗するのでやらない方がいいです。
貢献チャンス！

例：https://github.com/Homebrew/brew/pull/1535

## 結論
貢献チャンスは向こうからはやってきませんが、そこらじゅうに転がっています。
Let's 貢献, やりましょう！
プログラミングスクールでの学習カリキュラムの修了して、

本日プログラミングスクールのカリキュラムを全て終え、無事卒業しました。
この半年間のカリキュラムを通じての心境の変化、またスクールに入って良かったなと思えることを書きたいと思います。
また、スクールに入学するか悩んでいる方の判断材料になれば幸いです。

##努力の習慣化
まずはなんといってもプログラミングスキルに関してですが、スクールに入学したからといって必ずコードを書けるようになる訳ではなく、個人の相当な努力が必要でした。
実際に私自身も平均約25時間/週は学習に時間を割いていましたし、全カリキュラムを期限内に修了した同期（約15人）は私を含め2人でした。
そんな中で最後までやり遂げられたのはエラーで1ヶ月も先に進めず、やる気を失いかけていた私をずっと鼓舞してくれたライフコーチの存在でした。
独学と比べ、スクールだと鼓舞してくれるスタッフ・同期の仲間がいるので、そういった面でスクールに通う価値があったと思います。

##アウトプット(言語化)の重要性
スクールではプログラミング言語の勉強、いわゆるインプットだけではなくアウトプットすることを強く勧められていました。というのもその日の学習内容を言語化することで自分の中にしっかり落とし込むことができるからです。
それだけでなくアウトプットするためのコミュニティーもあるので、その日勉強したことを1分でまとめて発表し合うこともでき、アウトプットだけでなく、プレゼンテーションスキルも磨くことができたと思います。

##いつでもコード問題を相談できる
私はフルリモートでスクールに通っていたのですが、時間内であればいつでもチャット、もしくはビデオ通話で問題を相談することができました。問題解決に何時間かけても解決できなかったことも少なくなかったので、いつでもプロに相談ができる事は非常に助かりました。
ただ分からない！！と相談するのではなく事前に問題の仮説・検証が義務付けられていたので、エラー解決のアプローチ方法も勉強できました。
私の場合時間外では、仕事前にチャットに問題を記述しておき、帰宅後にスタッフさんからのアクションプランを見るという形を取っていました。こうすることで時間を無駄にせずストレスフリーにカリキュラムをやり遂げることができました。

以上がこの半年間の学習を通じて、スクールに通って良かったと思う点です。

####追備
半年間サポート・鼓舞し続けてくれたスタッフの皆様、本当にありがとうございました。