OmniAICreator/Qiita-1.07M huggingface dataset:
フィラメント自動供給装置2

フィラメント自動供給装置を、Flashforge Dreamerのデュアルヘッドに合わせて、
2つのフィラメントを供給できるように設計変更しました。

同時に、湿気を吸わないように密閉構造（完全ではないですが）にしてみました。
（また散在しまくりです（笑））

まずは設計
https://grabcad.com/library/3d-printer-filament-feeder-for-dual-head-1
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/13c7013f-bca0-2e1a-b8de-ef263001e4a4.png)

実物（内部に湿気取りを入れてます）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/664748/c04a11b3-5d4e-5700-3df9-8bd7e802f1db.png)

arduinoで上手に2つのステッピングモーターを同時制御する知識が無かったので、
左右のスプールは別々のコントローラーで制御しています。

また、シングルの時に1回だけあった、（何故か）モーター？センサー？の暴走によるフィラメントの
過剰供給（絡まってました）を防止するため、一定時間供給ONが連続すると
自動的にシステムがダウンするように、arduino pro-miniとは別にAttiny85を追加して、
センサー情報のモニタリングするようにしました。
（リレーでモーターOFF）これで不在時のプリントで、モーターが暴走して（無いとは思いますが）
最悪ケースで火事が起きることはないと思っています。（保証無し）
(回路図と基板については準備でき次第アップロードします)

arduino pro-mini(5V)のスケッチ
```
/**
 * spool feeder with TMC2130 SPI
 * PIN 4 = limit switch or other sensor input
*/
#define EN_PIN           7  // Enable
#define DIR_PIN          5  // Direction
#define STEP_PIN         6  // Step
#define CS_PIN           10 // Chip select
#define SW_MOSI          11 // Software Master Out Slave In (MOSI)
#define SW_MISO          12 // Software Master In Slave Out (MISO)
#define SW_SCK           13 // Software Slave Clock (SCK)

int val = 0;
int cc = 0;
constexpr uint32_t steps_per_mm = 80;

#include <TMC2130Stepper.h>
TMC2130Stepper driver = TMC2130Stepper(EN_PIN, DIR_PIN, STEP_PIN, CS_PIN);

#include <AccelStepper.h>
AccelStepper stepper = AccelStepper(stepper.DRIVER, STEP_PIN, DIR_PIN);

void setup() {
    SPI.begin();
    Serial.begin(9600);
    while(!Serial);
    Serial.println("Start...");
    pinMode(CS_PIN, OUTPUT);
    digitalWrite(CS_PIN, HIGH);

    pinMode(4, INPUT);
    
    driver.begin();             // Initiate pins and registeries
    driver.rms_current(600);    // Set stepper current to 600mA. The command is the same as command TMC2130.setCurrent(600, 0.11, 0.5);
    driver.stealthChop(1);      // Enable extremely quiet stepping
    driver.stealth_autoscale(1);
    driver.microsteps(16);

    
    stepper.setMaxSpeed(4000);
    stepper.setAcceleration(2000);
    stepper.setEnablePin(EN_PIN);
    stepper.setPinsInverted(true, false, true);
    stepper.enableOutputs();
}

void loop() {
    val = digitalRead(4);
    if (val == HIGH){
       stepper.move(50*steps_per_mm); // Move 50mm
       stepper.enableOutputs();
    }
stepper.run();

}
```

attiny85のスケッチ（arduino化）
```
//for attiny85

unsigned int timeCount = 0;

int inPin = 1;
int outPin = 3;

void timerFire() {
  if(digitalRead(inPin)==LOW){
    //timer reset
    timeCount = 0;
      }else {
    //timer count up
          timeCount++;
    }
    }

void setup() {
  digitalWrite(outPin, HIGH);
  Serial.begin(9600);
  pinMode(inPin, INPUT);
  pinMode(outPin, OUTPUT);
  
 }

void loop() {
  if (digitalRead(inPin) == HIGH){
    
    delay(10);
    timerFire();
    //timer start
    
  }
  
  Serial.print(timeCount);
  Serial.println("");
  
  if (timeCount >3000) { //stop signal after continue 3000count
    digitalWrite(outPin, LOW);
    while(1);
   }
}
```
（WDTをうまく使えばattiny85は要らないかも・・・）
ECSサービスをALBで公開する際のポート設定

# はじめに
ECSサービスをALBで公開するとき、いつもポートの設定がわからなくなるので理解をまとめました。

# Fargateのとき
- アプリケーションのポート / TargetGroupのPort設定 / ServiceのロードバランサのContainerPort / Task定義のContainerPort は同じ値に設定する
- TargetGroupのTargetTypeは`ip`固定
- Task定義のNetworkModeは`awsvpc`固定
![スクリーンショット 2022-05-08 21.25.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/7f4be067-c67d-56c5-b891-0cc49d15ed64.png)

# EC2のとき
- アプリケーションのポート / Task定義のContainerPort は同じ値に設定する
- TargetGroupのPort設定 / ServiceのロードバランサのContainerPort / Task定義のHostPort は同じ値に設定する
- TargetGroupのTargetTypeは`instance`固定
![スクリーンショット 2022-05-08 21.31.44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/572098/bd6d1786-d7a1-2c49-a8a3-282c03d3db58.png)

# 参考
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html

https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-taskdefinition.html

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-ecs-service.html
[テクスチャ] BlenderでColladaファイルをエクスポートすると、UV座標の原点位置が異なって出力される

# 概要
FBXファイルをBlenderを用いてColladaファイルに変換すると、左下を原点としたUV座標で出力されるので、そのまま値を使用すると意図しないマッピングがされてしまう。

# 他の記事
colladaファイルのテクスチャが上手く貼れない件について、かなり長い時間自分のプログラムを疑って調査をしてしまったが、蓋を開けてみればファイルの変換で原点が異なるという簡単な原因であった。
ググってみると、Blenderで変換するとUV座標の原点位置が左下になってしまうという記事がいくつかあったので、同じ罠に嵌っている方がいれば参考にしてほしいと思う。
https://shikemokuthinking.blogspot.com/2013/08/fbxuv_2.html
https://qiita.com/yukimituki11/items/7dc1ec71df37b38ec3a5

# Blender
Blenderのマニュアルを漁っても原点が左下である記載は見当たらなかったが、実際にBlenderでUV editingをみると、たしかに左下が原点だった。
下は不死鳥のモデルのテクスチャの一枚だが、(0, 0)の位置に丸くカーソルが当たっている。
![スクリーンショット (20).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1446998/717ba1e6-b59b-8799-678a-da726b6965c3.png)

モデルの権利表記
>This model was created by NORBERTO-3D
>https://sketchfab.com/3d-models/phoenix-bird-844ba0cf144a413ea92c779f18912042
>
>LICENSE Creative Commons Attribution
>https://creativecommons.org/licenses/by/4.0/legalcode

# 対処法
Blender側で原点位置を変えるなどいくつか考えられるが(可能かどうかは不明)、プログラム側での対処としてはV座標を
``` cpp
v = 1.0f - v
```
で変換する方法も考えられる。
Colladaファイルにはテクスチャ座標は

``` xml
library_geometry > geometry > mesh > source id = *map*
```
の場所に保存されるはずなので、sourceからデータを読み取るときにV座標だけ1.0fから引く。
上図の不死鳥のtechnique_commonには
``` xml
<technique_common>
  <accessor source="#Mesh_001-mesh-map-0-array" count="12189" stride="2">
    <param name="S" type="float"/>
    <param name="T" type="float"/>
  </accessor>
</technique_common>
```
とあるので、UV座標ではなくST座標といった方が正確かもしれない。

# 最後に
フォーマットの変換に用いたツール側に原因があったという例なので、同じ現象に嵌って自分のコードを何度見直してもテクスチャが上手く貼れない原因がわからず、絶望している方の助けになれば幸いです。

colladaファイルからデータを読み込んで、Androidでray tracingパイプラインを作成しモデルをレンダリングするサンプルコードをGitHubに上げていますので興味のある方はご覧ください。
https://github.com/kodai731/Aqoole-Engine-Android-Vulkan-Rendering-Engine-

はてなブログにも色々書いています。
https://blog.hatena.ne.jp/Aqoole_Hateena/aqoole-hateena.hatenablog.com/
Moodle プロファイルを表示させない

PHPを弄って消すのか、CSSで消すのかと思っていたが案外簡単な事でした。
![スクリーンショット-2022-05-08-202505.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299978/04869a22-0c52-ee5a-5c98-0aef5bd2c6db.png)

# 管理権限のあるマネージャとかでログイン

<strong>サイト管理 → アピアランス → テーマ → テーマ設定</strong>

# 
「<strong>ユーザメニューアイテム</strong>」の項目に以下が記入されているので全部消す
```
profile,moodle|/user/profile.php
grades,grades|/grade/report/mygrades.php
calendar,core_calendar|/calendar/view.php?view=month
privatefiles,moodle|/user/files.php
reports,core_reportbuilder|/reportbuilder/index.php
```

そして
```
###
```
と入力する。Moodle4の場合だけかも知れないが、こうしないと「ログアウト」まで表示されなくなるので。
これで消えてくれます。
Reactのkeyについて

# コンポーネントへのkeyの設定
Reactはいい感じにDOMの更新を行う都合で、動的に複数の子要素を作るときはkeyを割り当てる必要があります。なくても動きますが、ブラウザのコンソールにwarningが出てしまうため気持ちのいいものではありません。

最も遭遇する場面は、``map``や``for``などのループで子コンポーネントを複数呼ぶときでしょう。この時、例えば``Child``というコンポーネントを呼ぶとき（またはそれをラップする別の要素へ）``key``属性とユニークな値を付与します。

また、``key``属性はpropsで子コンポーネントには送れません。そのため``key``属性用の変数は``key``でええやろといった気持ちでpropsから受け取ろうとするとバグの原因になります。

また、その気持ちで子コンポーネントでPropsを受け取る時、keyを指定すると受け取る値は``undefined``になります。使い方を間違って子で受け取ったkeyの値をkey属性に指定すると怒られます。



# 正しい例
※以下のコードではkeyに配列の中身の値を設定していますが、重複があったらとかインデックス的な値はよろしくないと言ったベストプラクティス系は無視してください
複数の要素を作るときにkeyを指定する
親コンポーネント
```TypeScript:parrent.tsx
import Child from './child'
export const parent = () => {
    const a = [1,2,3,4,5]
    return (<>
        {
            a.map((e: number) => {
                return <Child e={e} key={e} />
            })
        }
        </>)
}
export default parent
```
子コンポーネント
```TypeScript:child.tsx
import React from 'react'
type Props = {
    e:number
}
export const child :React.FC<Props>= ({e}) => {
    return <div>{e}</div>
}
export default child
```


## 間違い1
複数呼ばれる子コンポーネント側で``key``を指定する例

``Warning: Each child in a list should have a unique "key" prop.``

各要素にはユニークなkeyを設定しなさ〜いと言われます。

親コンポーネント
```diff_TypeScript:parrent.tsx
import Child from './child'
export const parent = () => {
    const a = [1,2,3,4,5]
    return (<>
        {
            a.map((e: number) => {
-                return <Child e={e} key={e} />
+                return <Child e={e} />
            })
        }
        </>)
}
export default parent
```
子コンポーネント
```diff_TypeScript:child.tsx
import React from 'react'
type Props = {
    e:number
}
export const child :React.FC<Props>= ({e}) => {
-    return <div>{e}</div>
+    return <div key={e}>{e}</div>
}
export default child
```

## 間違い2
keyを子要素で受け取って使った

``Warning: child: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop.``

``props``で``key``を受け取れないので``undefined``ですよ。

親コンポーネント
```diff_TypeScript:parrent.tsx
import Child from './child'
export const parent = () => {
    const a = [1,2,3,4,5]
    return (<>
        {
            a.map((e: number) => {
                return <Child e={e} key={e}/>
            })
        }
        </>)
}
export default parent
```
子コンポーネント
```diff_TypeScript:child.tsx
import React from 'react'
type Props = {
    e:number,
+    key:number
}
-export const child :React.FC<Props>= ({e}) => {
-    return <div key={e}>{e}</div>
-}
+export const child :React.FC<Props>= ({e,key}) => {
+    return <div key={e}>{e}</div>
+}
export default child
```

気にしなくても動くことは動くんですけどね。
Heroku scheduler addonの画面でUTCではなく日本時間を表示する

# やること

Heroku Schedulerの時間がUTC時間表記なのでわかりにくい
![2022-05-08_20h09_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168315/67e07bbe-755a-8741-9b72-8c435d741cbe.png)

これを、日本時間を併記するスクリプトを作る
![2022-05-08_20h09_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/168315/14935bec-4dea-8a0a-a7bd-f5cec72e48c9.png)

# コード

自分用なので適当に書いた。
うまくいったからそれでいい的なコードですいません。

- JavaScriptは日付時刻のフォーマットが面倒だ。0:0になるけど気にしない。
- 日付の判定は`Date()`に任せた。うまくいったときだけ日本時間表示する。
- UTC -> JST変換もDateが正しく返す前提。
- たまにしか使わないので、Bookmarklet化するほどでもない

```javascript
let spans = $('td.pa2 span'); 
for( span of spans ){
  let utctext = span.innerText;
  let d = new Date(utctext);
  if(d != 'Invalid Date'){
    let jst = d.getFullYear() + "/" + (d.getMonth() + 1) + "/" + d.getDate() + " " + d.getHours() + ":" + d.getMinutes();
    console.log('%s >> %s', utctext, jst);
    span.innerHTML = span.innerHTML + '<br><b>' + jst + '<b>';
  }
}
  
```



# 使い方
develper ツールのコンソールにコピペするだけで動きます。
メモ: GitHubへの commit と push で使うアカウントが違う？ (Windows)

# 概要

GitHub のアカウントを複数使っているのだけど、``git commit`` と ``git push`` で使われるアカウントが違う！
ので修正します。

※ **Windows** の場合の記事です。Macの場合は資格情報の消し方が異なります。https://support.apple.com/ja-jp/guide/keychain-access/kyca2423/mac からキーチェーンアクセスを削除できます。

ひとつのリポジトリだけに適用される設定です。全体に適用したい場合は他の記事を探してください...。

# どんな動作？

VSCode で
```
You don't have permission to push to (URL). Do you want to fork it instead?
```
のような通知が出ました。

``git push`` すると Git ではこんなエラー。
```
remote: Permission to [使いたいアカウント]/Repo.git denied to [使いたくないアカウント].
fatal: unable to access 'https://github.com/[使いたいアカウント]/Repo.git/': The requested URL returned error: 403
```

push する際のアカウントが間違っていました。が、``git config user.email`` に設定されていたのは push する際に使いたいアカウントであり、PGP 鍵も同じアカウントのものを要求されました。


# commit するほうのIDで push もしたい

commit するほうのIDを使いたいので、``git config -l`` で確認できる ``user.name`` と ``user.email`` が正しい場合です。

## すること！

1. Windows に残っている GitHub の資格情報を消します
1. ``.git/config`` の ``[remote "..."]`` の ``url`` を書き換えます
1. ``git push`` などを行い、資格情報を入れ直します

## 1. Windows に残っている資格情報の削除

コントロールパネルを開く (Win+R -> Control と入力 -> Enter)
右上の表示が「カテゴリ」なら、「大きいアイコン」にします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/237641/73fa66e0-05fc-2f44-23e4-c62c7b57b46e.png)
**ユーザーアカウント** をクリックします。

左側に **資格情報の管理** があるのでクリックします。
**Windows 資格情報** を押して、
``git:https://[アカウント]@github.com`` を見つけてすべて削除します。



## 2. ``.git/config`` を書き換える

push できていないリポジトリのフォルダに移動すると、隠しフォルダで ``.git`` というフォルダがあるので、その中の ``config`` ファイルを開きます。

```
[remote "[remote名]"]
url = https://github.com/[アカウント]/[リポジトリの名前].git
```

のようになっていたら、その箇所を以下のように編集します。

```
[remote "[remote名]"]
url = https://[使いたいアカウント]@github.com/[使いたいアカウント]/[リポジトリの名前].git
```

[アカウント]@github.com の形式にすればよいです。

例えば
```
[remote "main"]
url = https://icy9ptcl@github.com/icy9ptcl/GreenBreeze-Light-Theme.git
```

## 3. push かなにかしよう

```
git push
```

を行うと、再度認証情報を要求されます。**Personal Access Token** をパスワードの代わりに入力しましょう。

※ Visual Studio Code であればパスワードを入力と表示されますが、Personal Access Token を代わりに入力してください。
Personal Access Token の作り方は以下です。
https://docs.github.com/ja/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

# push するほうのIDで commit したい？

この場合 
```bash
git config --local user.name (使いたいアカウントの表示名)
git config --local user.email (使いたいメールアドレス)
```
をすると、**そのとき開いているフォルダが所属するリポジトリ** に対して、commit 先のアカウントが変更されます。
※ PGP鍵で認証している場合 ``user.signingkey`` の変更も忘れずに。

## もう commit しちゃった

念のため commit のログを見てみましょう。直前のコミットは以下で確認できます。

```bash
git log -1 --pretty=full
```
※ -1 を -2 にすると2つ前までのコミットが確認できます。

Author と Commit が出るはずです。

### 間違った commit が1回だけの場合

直前の**1つの** commit は amend = やり直す(修正) することができます。

まずは commit した人(Committer)を変えます。リポジトリのcommit先を変更してから、

```bash
git config --local user.name (使いたいアカウントの表示名)
git config --local user.email (使いたいメールアドレス)
```

直前の Committer を変更します。

```bash
git commit --amend
```

Author (作成者) を変更します。このとき ``--author=名前 <メールアドレス>`` のように指定します。

```bash
git commit --amend --author="正しいアカウントの表示名 <メールアドレス>"
```

修正されたか ``git log --pretty=full`` で確認するのをお忘れなく！

### commit が複数回にわたる場合

複数回間違ったアカウントで commit してしまった場合は、

https://qiita.com/y10exxx/items/dcea0e39788d649ca8ba

以上の記事を参考にしてください (私ではまだうまく解釈できませんでした...。)
Blenderで2つのオブジェクトの頂点の差分を調べる

## 概要

Blenderでメッシュが微妙に異なる2つのオブジェクトがあったときに、差分を選択状態にして可視化する方法を紹介します。
なお、シェイプキーがある場合は、先頭のシェイプキーを対象にします。
また、オブジェクトは、頂点数が異なっていても大丈夫です。

## 手順

頂点座標をイミュータブルにして積集合を作り、積集合に入ってない頂点を選択します。

```py
import bpy


def main():
    """2つのオブジェクトの差分を選択"""
    if len(bpy.context.selected_objects) != 2:
        print("2つのオブジェクトを選択してください")
        return
    obj1, obj2 = bpy.context.selected_objects
    bpy.ops.object.mode_set(mode="EDIT")  # for deselect
    bpy.ops.mesh.select_all(action="DESELECT")
    bpy.ops.object.mode_set(mode="OBJECT")  # for select
    vtx1 = [vert.co.to_tuple(4) for vert in obj1.data.vertices]
    vtx2 = [vert.co.to_tuple(4) for vert in obj2.data.vertices]
    st = set(vtx1) & set(vtx2)
    for vtx, vert in zip(vtx1, obj1.data.vertices):
        vert.select = vtx not in st
    for vtx, vert in zip(vtx2, obj2.data.vertices):
        vert.select = vtx not in st
    bpy.ops.object.mode_set(mode="EDIT")


if __name__ == "__main__":
    main()
```

参考：[BlenderでPythonを実行する方法](https://qiita.com/SaitoTsutomu/items/cec67381a8789b40e377)

`bpy.ops.mesh.select_all(action="DESELECT")`せずに、下記だけでもできそうですが、うまくいきませんでした。

```py
        vert.select = vtx not in st
```

すべて非選択にしてからオブジェクトモードに戻らないと反映されないようです。

以上
【Rails】deviseでログイン機能実装

# はじめに
本記事では、deviseでのログイン機能の実装方法をまとめます。

# 手順
```ruby:Gemfile
gem 'devise'
```

上記を記入後、ターミナルで、`bandle install`。
その後、下記を実行。

```terminal
$ rails generate devise:install
```
下記の画面が出てきたら、インストールできています。
ただ、1~4の設定が必要です。
![スクリーンショット 2022-05-08 19.43.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1244172/41f86e3a-6e03-2fdb-5d11-e05d541f5423.png)

1.config/environments/development.rbに下記コードを追加。

```ruby:config/environments/development.rb
config.action_mailer.default_url_options = { host: 'localhost', port: 3000 }
```

2.ルートパスを設定。
既に設定できていれば、そのままで大丈夫です。
```ruby:config/routes.rb
root to: "home#index
```

3.フラッシュメッセージの追加
```ruby:application.html.erb
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
```

4.deviseのビューのカスタマイズ
deviseのビューファイルがデフォルトで用意されているので、使用する方は下記コマンドを実行。
```console
$ rails g devise:views
```

1~4が完了したら、Userモデルを作って完了です。
```console
$ rails g devise User
```
忘れずに、`rails db:migrate`を実行して、実装完了です。

# 参考
https://github.com/heartcombo/devise
VScode 個人的に使用しているプラグイン 

# VSCodeの使用プラグイン一覧

| No | プラグイン名 |
|:-:|:-|
| 1 |  Japanese Language Pack for Visual Studio Code  |
| 2 |  Remote - WSL |
| 3 |  PHP Intelephense |
| 4 |  PHP Debug |
| 5 | Python |
| 6 | Pylance |
| 7 | Jupyter Notebook Renderers |
| 8 | Jupyter |
| 9 | Jupyter Keymap |
| 10 | Git Graph |
| 11 | Code Runner |
| 12 | vscode-icons |
| 13 | Prettier – Code formatter |
| 14 | Go |
| 15 | C/C++ |
| 16 | SQLTools |
| 17 | Laravel Snippets |
| 18 | Laravel Blade Snippets |
| 19 | Laravel Artisan |
| 20 | Laravel Extra Intellisense |
| 21 | Laravel goto View |
| 22 | DotENV |
| 23 | EditorConfig for VS Cod |
| 24 | Laravel Blade formatter |
| 25 | Laravel Create View |
| 26 | laravel-goto-components |
| 27 | Laravel Blade Wrapper |
| 28 | VSCode Ruby |
| 29 | Ruby Solargraph |
| 30 | Rufo - Ruby formatter |
docker-containerでmongodbにpymongoから繋ぐまで

# TL;DR
ローカルでpymongoの動作確認するためのdocker-composeを作成した。
`docker-compose.yml`をローカルに保存して、upした後下のexecからのフローでpymongoの簡単な確認ができる。
```bash
docker-compose up -d
docker-compose exec app /bin/bash
```
```docker-compose.yml
version: '3.7'
services:
  mongo:
    image: mongo
    restart: always
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: example
    ports:
      - 27017:27017
    volumes:
      - ./db:/data/db
      - ./configdb:/data/configdb
    networks:
      - default


  mongo-express:
    image: mongo-express
    restart: always
    ports:
      - 8081:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: example
    networks:
      - default
  app:
    image: python3.8
    depends_on:
      - mongo
    tty: true
    networks:
      - default

networks:
  default:
    driver: bridge
```

```
pip install --upgrade pip
pip install ipython pymongo
```
ipythonから接続を確認する
```bash
docker-compose ps
docker-compose exec app /bin/bash
pip install --upgrade pip
pip install ipython pymongo
ipython
```
ipythonの中に入ると、`[project_name]`の中身はdocker containerの名前で下で確認できる。
```python
client = MongoClient('mongodb://[project_name]_mongo_1', username='root', password='example')
db = client.test
collection = db.test
accounts = [{'account_id': 100002, 'limit': 9000, 'products': ['TEST2', 'TEST2-1']}]
result = collection.insert_many(accounts)
account = collection.find_one({"account_id": 100002})
```
accountを確認すると、入れたものが入ってる。
`MongoClient`の`'mongodb://[project_name]_mongo_1'`は下のリンクが参考になる
`docker-compose ps`
で確認した、container nameから引っ張ってくる。
```
                Name                              Command               State            Ports
--------------------------------------------------------------------------------------------------------
[project_name]_app_1             python3                          Up
[project_name]_mongo-express_1   tini -- /docker-entrypoint ...   Up      0.0.0.0:8081->8081/tcp
[project_name]_mongo_1           docker-entrypoint.sh mongod      Up      0.0.0.0:27017->27017/tcp
```
https://stackoverflow.com/questions/7744147/pymongo-keeps-refusing-the-connection-at-27017
DockerのコンテナにHinemosエージェントを入れて監視してみる

## 背景・目的・読み手
　[DockerのコンテナにHinemosマネージャを入れて動かしてみる \- Qiita](https://qiita.com/yoshi_iwa/items/adda2ea12d8c9767251c#hinemos-web%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9%E8%B5%B7%E5%8B%95)で立てたマネージャを使って監視ができるかどうかを確認。引き続きDockerのコンテナを使って監視できるかどうか確認してみる。


 時間もなかったので上記コンテナにエージェントも突っ込んでセルフ監視させてみる。


## Hinemosエージェント導入

### 必要なモジュールの導入

　vimとrsyslogがなかったので導入しておく。

```sh:下準備
rsyslog入れる
# dnf -y install rsyslog

vim入れる
# dnf -y install vim
```


### Hinemosエージェント導入と起動

```
エージェントインストール
# rpm -ivh hinemos-7.0-agent-7.0.0-1.el.noarch.rpm
Verifying...                          ################################# [100%]
warning: Unable to get systemd shutdown inhibition lock: Unit systemd-logind.service is masked.
Preparing...                          ################################# [100%]
Updating / installing...
   1:hinemos-7.0-agent-0:7.0.0-1.el   ################################# [100%]

vim でAgent.propertiesを編集する（managerAddressにマネージャーのIPアドレスを指定。今回は172.17.0.2）
[root@fed08f920778 /]# vim /opt/hinemos_agent/conf/Agent.properties
（中略）
managerAddress=http://172.17.0.2:8083/HinemosWeb/
（中略）

hinemos_agent起動
# systemctl start hinemos_agent
# systemctl enable hinemos_agent
hinemos_agent.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable hinemos_agent
# systemctl status hinemos_agent
● hinemos_agent.service - SYSV: Hinemos Agent
   Loaded: loaded (/etc/rc.d/init.d/hinemos_agent; generated)
（中略）

snmpd起動
# systemctl start snmpd
# systemctl enable snmpd
● snmpd.service - Simple Network Management Protocol (SNMP) Daemon.
   Loaded: loaded (/usr/lib/systemd/system/snmpd.service; enabled; vendor preset: disabled)
（中略）
```

## ノード登録と監視ジョブ設定

　以下手順を参考に、自分自身をノードとして登録する。
[Hinemos 6\.1 をインストールしてジョブを実行してみるまで \- Qiita](https://qiita.com/itatibs/items/5a3d5ad8b11581ca9262#%E3%83%8E%E3%83%BC%E3%83%89%E7%99%BB%E9%8C%B2%E3%81%BE%E3%81%A7)

　その後、こちらの手順を参考に、CPU使用率の監視を行う。
[Hinemos ver\.6\.1 入門編② Hinemos ver\.6\.1で監視してみよう \| Hinemos](https://www.hinemos.info/technology/nttdata/2018041201)

　どうにか監視できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151198/4d1164a4-a42c-5315-bc58-221e99feb974.png)


## 課題

　アラート検知時刻が標準時刻で表示されるので、JSTに直したい。OSはJSTで動いているのだけど…。


## 参考文献

- [Hinemos（エージェント）をインストールする！（Ubuntu 18\.04）](https://lab4ict.com/system/archives/4247)
[Apollo Client] GraphQLWsLinkのcreateClientでWebSocket implementation missing



Apolloのドキュメント通りに、graphql-wsでSubscriptionを実装していたのですが、以下のエラーが出ました。
[https://www.apollographql.com/docs/react/api/link/apollo-link-subscriptions](https://www.apollographql.com/docs/react/api/link/apollo-link-subscriptions)

```tsx
Error: WebSocket implementation missing; on Node you can `import WebSocket from 'ws';` and pass `webSocketImpl: WebSocket` to `createClient`**
```

コードはこんな感じです。

```tsx
function MyApp({ Component, pageProps }: AppProps) {
  return (
    <ApolloProvider client={client}>
      <Component {...pageProps} id="modalId" />
    </ApolloProvider>
  );
}

const httpLink = new HttpLink({
  uri: 'http://~~~',
});

const wsLink = new GraphQLWsLink(
  createClient({
    url: 'ws://~~~',
  })
);

const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query);
    return definition.kind === 'OperationDefinition' && definition.operation === 'subscription';
  },
  wsLink,
  httpLink
);

const client = new ApolloClient({
  link: splitLink,
  cache: new InMemoryCache(),
});
```

## 解決法

Next.jsのSSRが原因のようです。

```tsx
function MyApp({ Component, pageProps }: AppProps) {
  return (
    <ApolloProvider client={client}>
      <Component {...pageProps} id="modalId" />
    </ApolloProvider>
  );
}

const httpLink = new HttpLink({
  uri: 'http://~~~',
});

const wsLink =
  // ドキュメントにはないコードでwindow !== 'undefined'を追加。
  typeof window !== 'undefined'
    ? new GraphQLWsLink(
        createClient({
          url: 'ws://~~~',
        })
      )
    // ↓別の指定の方が良さそうであるが、一旦設定。
    : httpLink;

const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query);
    return definition.kind === 'OperationDefinition' && definition.operation === 'subscription';
  },
  wsLink,
  httpLink
);

const client = new ApolloClient({
  link: splitLink,
  cache: new InMemoryCache(),
});
```

## 参考

[https://stackoverflow.com/questions/72116940/apollo-graphql-graphqlwslink-subscriptions-troubles-cannot-get-websocket-imp](https://stackoverflow.com/questions/72116940/apollo-graphql-graphqlwslink-subscriptions-troubles-cannot-get-websocket-imp)

[https://qiita.com/ku1987/items/e592cb5133659c3136de](https://qiita.com/ku1987/items/e592cb5133659c3136de)
プログラマーに必要なロジカルシンキングとは

## はじめに
プログラマーとして働き始めて、<font color="Blue">技術の勉強は順調</font>。
でも、上司から<font color="Red">「もうちょっと案件の仕様を把握しようか。」</font>と言われることが多い...そんな悩みありませんか？

もしかしたら、その悩みは<font color="Red">技術の習得では解決できないかもしれません！</font>
プログラミングスキルとは別に「思考法のスキル」が必要かもです。

この記事ではプログラマーに必要な思考フレームワーク3つのうち、**ロジカルシンキング**について解説します。

【関連記事】
[プログラマーに必要な思考フレームワーク3つ](https://qiita.com/YutaManaka/items/5f0c38f1b3a29d1f028e)
[プログラマーに必要なロジカルシンキングとは](https://qiita.com/YutaManaka/items/26b6ad868c0779db55b9)
[プログラマーに必要なラテラルシンキングとは](https://qiita.com/YutaManaka/items/33cb905eb89f846daca2)
[プログラマーに必要なクリティカルシンキングとは](https://qiita.com/YutaManaka/items/e11a89b9fc2cc939d10a)

## 対象者
この記事は下記のような人を対象にしています。
- 駆け出しエンジニア
- プログラミング初学者
- 上司に「もうちょっと考えてみようか」と言われがち
- 複雑な問題にぶち当たると頭痛がする

## 結論
:::note
- ロジカルシンキングとは、論理的に物事を分解して考える思考法。
- 主に実装を担当する人が使う思考法。
- アプローチの方法は「演繹法」「帰納法」の2つ。
:::

## ロジカルシンキング(垂直思考)とは
ロジカルシンキングとは、**論理的に物事を分解して考える思考法**のことです。
複雑な課題を単純な課題に切り分けて、一つ一つ地道に考えていくやり方になります。

ざっくり言うと<font color="Blue">「AをやったらBになるはず」</font>と言う考え方なので、とっつきやすいのが特徴。
プログラマーで言うと、主に**実装を担当する人が使う思考法**と言えます。

ロジカルシンキングでは、過去のデータや経験に基づいて判断します。
そのため、<font color="Red">経験のない現象に関しては効果的に対処ができない場合がある</font>ので要注意です。

アプローチの方法は「演繹法」「帰納法」の2つです。

### 演繹法とは
演繹法は一般的には**三段論法**と呼ばれる思考法です。
「個別の事実」と「一般的なルール」を使って、「結論」を推測できるのが特徴です。

では、プログラマーが遭遇しそうな具体例で解説しましょう。

【前提条件】
- **楽天やYahooショッピングのようなECサイトの商品一覧ページ**を制作している。
- 「あるロジックに商品IDを渡せば、商品名、税込価格、商品写真を表示する」部分を実装している。

【解説】
その際に、<font color="Red">商品の個数分、全部ベタ書きする...</font>なんてことはしませんよね。

:::note info
「1つの商品を表示できるようにする」
　　　　　　　↓
「ループ処理で全商品分表示できるようにする」
:::

と言うのが一般的なやり方かと思います。
これがまさに演繹法の考え方です。

:::note info
- 個別の事実　　　→　1つの商品が表示できた。
- 一般的なルール　→　ループ処理は同じ処理を繰り返すもの。
- 結論　　　　　　→　上記を組み合わせればすべての商品が表示できる(だろう)。
:::

ここで言う「一般的なルール」とは、<font color="Blue">誰が見ても同じ認識になるような常識的な範囲にする</font>のがキモです。
ここでオレオレ理論を主張してしまうと<font color="Red">「奴の言ってることはわからん」「アイツはワガママ」</font>などといわれてしまうので要注意です。

### 帰納法とは
帰納法とは**いくつかの個別の事実を集め、結論を推測する思考法**です。
少ないデータで結論が出せるので、効率が良いのが特徴です。

では、プログラマーが遭遇しそうな具体例で解説しましょう。

【前提条件】
- **楽天やYahooショッピングのようなECサイトの商品ページ**を制作している。
- 「商品ページに税込価格を表示する」部分を実装している。

【解説】
全ての商品で税込価格が表示されているか、<font color="Red">1つずつ確認するのは効率が悪い</font>ですよね。
その際に活用するのが帰納法の考え方です。

:::note info
「商品Aで正しく表示されている」
 　　　　　　　+
「商品Bでも正しく表示されている」
　　　　　　　↓
「全ての商品で正しく表示されている(だろう)」
:::

上記のように考えれば、2つ確認するだけで全部OKの判断が出せます。

:::note info
- 個別の事実(1つ目)　→　商品Aが正しく表示できている
- 個別の事実(2つ目)　→　商品Bが正しく表示できている
- 結論　　　　　　　 →　全ての商品が正しく表示できている(だろう)
:::

ただし、<font color="Red">個別の事実を適当に選んでしまうと、論理が破綻してしまう</font>ので要注意です。
例えば、「セール対象商品は10%割引して税込価格を表示する」というロジックが別途実装されていた場合、<font color="Blue">セール対象品/非対象商品の両方をチェック</font>すれば完璧でしょう。

## おわりに
「プログラマーに必要なロジカルシンキングとは」についてまとめました。
演繹法と帰納法を使い分けて、駆け出しエンジニアを卒業しましょう！

## 関連記事
[プログラマーに必要な思考フレームワーク3つ](https://qiita.com/YutaManaka/items/5f0c38f1b3a29d1f028e)
[プログラマーに必要なロジカルシンキングとは](https://qiita.com/YutaManaka/items/26b6ad868c0779db55b9)
[プログラマーに必要なラテラルシンキングとは](https://qiita.com/YutaManaka/items/33cb905eb89f846daca2)
[プログラマーに必要なクリティカルシンキングとは](https://qiita.com/YutaManaka/items/e11a89b9fc2cc939d10a)


## 参考文献
[ビジネス思考法使いこなしブック](https://www.amazon.co.jp/dp/B00ZZ4JGGU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
絶対はずさないお店を検索できるwebアプリケーションをリリースするまで③

javascript　文字列を数値に変換するメソッド

 ~~~
parseFloat　メソッド名
javascript　文字列を数値に変換するメソッドになる。
~~~

  ~~~
グーグルマップ表示
  let timer = setInterval(() => {
      if (window.mapLoaded) {
        clearInterval(timer);
        console.log(parseFloat(this.cooks[0].lat))
        const map = new window.google.maps.Map(this.$refs.map, {
　　　　　　　　　　　　　　　　center: { lat: parseFloat( this.cooks[0].lat), 
　　　　　　　　　　　　　　　　lng:　parseFloat(this.cooks[0].lng) },
~~~

~~~
parseFloatの使い方（緯度経度）
center: { lat: parseFloat( this.cooks[0].lat), 
　　　　　　　　　　　　　　　　lng:　parseFloat(this.cooks[0].lng) },

今回、緯度経度の文字列を数値に変換する
 lat: parseFloatで、緯度の文字列を数値に変換しますよ〜と宣言する。
( this.cooks[0].lat)でcooksの中身の緯度を取得する。
経度も同様に、　　lng:　parseFloatで、経度の文字列を数値に変換しますよ〜と宣言する。
(this.cooks[0].lng) },ででcooksの中身の経度を取得する。

~~~
Rails向けのDigdagブリッジライブラリを作った

## これなに

RailsとDigdagを繋ぐライブラリ、「[mogura](https://github.com/KentFujii/mogura)」を公開しました。

## モチベーション

Railsでバッチを管理する手段としてRakeタスクがあります。
しかしバッチ処理というのは泥臭い要件が発生することが多く、コードベースが肥大化し運用コストがかさみがちです。

バッチの運用コスト肥大化に伴いワークフローエンジンの導入を検討するかとおもいますが、Airflowを筆頭にしたPython製のプロフェッショナルなETLツールを導入するのは、学習/構築/運用/費用あるいは人材採用といったハードルが存在する局面があるかと思います。
またRakeタスクに内包された、Railsに紐づいた業務ロジックをマイクロサービスとして切り出しPythonで書き直すのは、工数を鑑みると現実的な選択肢にならないことが往々にしてあるかと思います。
Railsアプリケーションの中にワークフローエンジンを内包したい、という需要もあるのではないでしょうか？

そこでRailsアプリケーションの業務ロジックを流用しつつ、ワークフローエンジンとしての要件をしっかり満たす構成を模索したところ、Rails向けのDigdagブリッジライブラリを作るという選択肢を取りました。

## 使い方

お手元のRailsプロジェクトのGemfileに下記を追加し、 `bundle install` してください

```ruby
gem 'mogura'
```

ライブラリのインストールが完了したら、Railsプロジェクトのrootディレクトリで下記コマンドを実行してみてください

```
$ bundle exec mogura help
Commands:
  mogura help [COMMAND]  # Describe available commands or one specific command
  mogura init            # Initialize Digdag files
  mogura push            # Push Digdag workflows
  mogura version         # Prints version
```

`bundle exec mogura init` でRailsプロジェクトに下記ファイルが生成されます

```
RAILS_ROOT/config/digdag/sample.dig
RAILS_ROOT/app/dags/sample_dag.rb
```

```sample.dig
_export:
  rb:
    require: {{ RAILS_ROOT }}/config/environment
+run:
  rb>: SampleDag.run
```

```sample_dag.rb
class SampleDag
  def run
    puts "Hello Rails #{Rails.env}"
  end
end
```

`bundle exec mogura push` を実行することで `sample.dig` がDigdagに登録されます。
`sample.dig`内部でDigdagからRailsの環境を読み込むことで、ワークフローからRailsの業務ロジックを呼び出すことができます。

## 今後の開発

現状は単一のDigdagプロジェクトしかワークフローを登録することができませんが、複数のDigdagプロジェクトを登録できるようにするとより良いかと思っております。
また現状本ライブラリではcliからのみDigdagの操作が可能となっていますが、Railsアプリケーションの業務ロジックからワークフローの登録や編集などの操作が出来ればと思っております。
また本ライブラリの改善や新しい機能の追加要望などありましたら、是非GitHubにフィードバックやコントリビューションなどをいただけますと幸いです。
【AWS】S3のハンズオンで学んだことをまとめる

こんにちは、k_ukiです。
「AWSではじめるクラウド開発入門」の10章と11章を進めていきました。
そこでは、サーバーレスクラウドに関連する技術が取り上げられており、「Lambda」「DynamoDB」「S3」の3つの技術をハンズオン形式で学習しました。

その中でも、今回は「S3」について学んだことをまとめていきます。
## 「S3」とは？
　S3はAWSが提供する<b>サーバーレスなストレージ</b>のことです。
　サーバーフルのストレージの場合、ディスクの容量の割り当てはディスクのフォーマットを行うときに決める必要があり、自由にサイズを変更することはできませんでした。そのため、従来のクラウドでストレージを借りる際は指定した領域のディスクをまるごと借りる必要がありました。（例えば、1GBのストレージを借りた場合、現在100mbしか使っていなくても1GB分の料金が発生する）
　S3は基本的にAPIを通してデータの読み書きを行うため、OSにマウントするという概念自体が存在しません。そのことから、ディスク領域を指定する必要がなく、データを入れた分だけ領域が拡張されていきます。

## S3を触ってみた
今回のハンズオンではSTEP1,STEP2の二つを実施しました。それぞれの内容は以下の通りです。
- STEP1: AWS CDKを使用し、S3に新しいバケットを生成する。
- STEP2: データのアップロード、ダウンロードを実践する。



### STEP1
STEP1ではS3に新しいバケットを生成してみます。今回デプロイするプログラムは以下の通りです。
```
class SimpleS3(core.Stack):
 def__init__(self, scope: core.App, name: str, **kwargs) -> None:
  super().__init__(scope, name, **kwargs)
  
  bucket = s3.Bucket(
   self, "bucket",
   removal_policy=core.RemovalPolicy.DESTROY,
   auto_delete_objects=True,
```
　s3.Bucket()メソッドを呼ぶことによって新しいバケットが新規作成されます。

　また、s3はCloudFormationスタックが削除されたとしてもバケットとその中身は削除されないようにデフォルトで設定されています。
  しかし、今回のハンズオンではデータを残す必要はないので以下のパラメータを追記し、スタックの削除と同時にs3のデータも削除されるようにしています。
```
removal_policy=core.RemovalPolicy.DESTROY,auto_delete_objects=True,
```


まず、プロジェクトのディレクトリに移動し以下のコマンドを実行しました。
```
# venvを作成し、依存ライブラリのインストール
$ python3 -m venv .env
$ source .env/bin/activate
$ pip install -r requirements.txt
# デプロイの実行
$ cdk deploy
```
実行後、以下の文字列が返されました。正しくデプロイできたことがわかります。
![10-11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/3c2ab945-f6c7-f24d-45f7-20589fc9a169.png)

### STEP2
STEP2ではSTEP1で作ったバケットにアップロード、ダウンロードを行ってみます。
### データのアップロード
まずは、データの書き込みを実践してみます。ここではハンズオンで用意されていた"simple_s3.py"を使用します。アップロードに使用するコードは以下の通りです。
```
def upload_file(bucket_name, filename, key=None):
 bucket = s3.Bucket(bucket_name)

 if key is None:
   key = os.path.basename(filename)
   bucket.upload_file(filename, key)
```
bucket = s3.Bucket(bucket_name)で作成したバケットを呼び出しています。また、upload_fileでファイルのアップロードを実行しています。

以下のコードを実行し"HelloWorld"という文字列が入ったファイルのアップロードを行います。

```
python simple_s3.py バケット名 upload tmp.txt --key a/b/tmp.txt
```
コンソールを確認すると無事ファイルがアップロードされたことが分かります。
![10-14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2341225/2d03c23a-406d-88fc-07d2-3c17fc844559.png)

### データのダウンロード
次にアップロードしたtmp.txtのダウンロードを実行してみます。ダウンロードを担う部分のコードは以下の通りです。
```
def download_file(bucket_name, filename, filename=None):
 bucket = s3.Bucket(bucket_name)

 if filename is None:
   filename = os.path.basename(key)
   bucket.download_file(key, filename)
```
下記のコマンド実行後、正しくダウンロードされていることが確認できました。
```
python simple_s3.py バケット名 download tmp.txt
```


### スタックの削除
演習は完了なので以下のコマンドでスタックを削除しました
```
$ cdk destroy
```
## 最後に
今回はS3についての学習と演習を行いました。今回の学習でAWSではじめるクラウド開発入門」の10章と11章を進めていきました。
そこでは、サーバーレスクラウドに関連する技術が取り上げられており、「Lambda」「DynamoDB」「S3」の3つの技術をハンズオン形式で学習しました。
モデルベース開発入門_MILSとは

# はじめに
入門者(新入社員や転職者)向けモデルベース開発解説記事第4弾です。
今回はシミュレーション方法の１つであるMILS(Model In the Loop Simulation)について解説します。
HILS、SILS、PILSなど似てる用語がたくさんあり、初心者は混乱しがちですよね。私も新入社員時代は混乱していました。
この記事を読むとMILSの概要、メリット、実施タイミングについて理解することができます。

MILSに限らずモデルベース開発を中心に組み込み系の情報をまとめたホームページを作成中です。よければ覗いてみてください。
[モデルベース開発入門](http://lets-mbd.com/)

# MILSとは
MILSとはModel In the Loop Simulationの略で、ECUモデルとプラント(制御対象)モデルを接続してのシミュレーション手法です。開発工程早期に実施することにより、仕様の漏れやバグを発見し手戻りを防止して開発効率を向上させる効果があります。

![MILSとは-1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643741/f3094cfa-c286-5dd5-3ed7-d21601ac9c18.png)

モデルベース開発では下図のようにプラント(制御対象)とECU(コントローラー)が実物なのか、それともモデルなのか、その組み合わせによって4つの検証方法が存在します。MILSはプラント(制御対象)とECU(コントローラー)両方がモデルの場合の検証方法となります。
![MILSの位置づけ-1024x300.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643741/6a033d93-1b5e-8ba6-a162-4833b39ec164.png)

# MILSのメリット
メリット① 早期の動作確認が可能
本物の制御対象(自動車の自動運転制御開発であれば自動車本体)が必要ないので、早期に実施可能(例:新型車開発のため、そもそも車両自体ができあがっていない場合でもモデルがあればMILS実施可能)

メリット②　自動チェックが可能。
MILSはシミュレーション方法の一種なので、人間が実際に入力パターンを与える必要がありません。大量の試験パターンを夜通し自動実行して次の日の朝結果を確認するといった自動化が可能です。

メリット③　制御仕様の共有・調整に便利
動作をアニメーション表示することができるので、難解な制御仕様の具体的な動きを共有しやすいです。グラフをいくつも使って説明するよりも具体的な動きを共有したほうが理解が容易で議論が進みやすいと思います。
<iframe width="560" height="315" src="https://www.youtube.com/embed/0rB3RJcSU4c" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>

# MILSで使用するモデルについて
ECUモデルはSimulinkを用いて作成します。プラント(制御対象)モデルはSimscapeを用いて作成します。MathWorks社製品以外ではAmesimやMapleSim等各社いろいろな製品を販売しています。SimscapeはSimulinkと同じMathWorks社製品なので、ECUモデルとプラントモデルの接続に手間がかかりません。社外の製品をSimulinkに接続するのは手間がかかる印象です。![作成ツール.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643741/173407dd-4a78-b217-c72e-406ef5a26f87.png)

# MILSの実施タイミングについて
MILSはECU・プラント両者がモデルなので開発プロセスの早い段階から取り組むことができます。(コンパイル不要。制御機能の一部分からシミュレーション可能。実機レスで検証可能)早期に検証を始めることにより、後工程からの手戻りを防止することができます。特に実機が出来上がってから不具合が発覚し、機構や部品の変更が必要になった場合は致命的な日程遅延が発生してしまいます。
![実施タイミング.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2643741/e95b296d-a246-3c57-dfd5-17afda06bb6f.png)

# まとめ
本ページではMILSについて解説しました。MILSを活用して、早期に検証を開始することにより手戻りを防止し開発プロジェクトを効率的に進めていきましょう。

MILSに限らずモデルベース開発を中心に組み込み系の情報をまとめたホームページを作成中です。よければ覗いてみてください。
[モデルベース開発入門](http://lets-mbd.com/)
Blenderのちょっとした自作アドオンの紹介

## 概要

Blenderのちょっとした自作アドオンを紹介します。

- OpenURL：テキストに書いてあるURLからブラウザを開きます。
- ShapeKeyBit：シェイプキーのちょっとしたツールです。

## OpenURL

### アドオンのインストール

- [Blender Add-on: OpenURL](https://github.com/SaitoTsutomu/OpenURL)の画面にしたがってインストールしてください。
    - アドオンのチェックでは「テスト中」を選んでください。

### 使い方

- URLの記述されたテキストを選択します。
- オブジェクトメニューの`Open URL`を選びます。

### Pythonのコード

https://github.com/SaitoTsutomu/OpenURL/blob/main/__init__.py

## ShapeKeyBit

### アドオンのインストール

- [Blender Add-on: ShapeKeyBit](https://github.com/SaitoTsutomu/ShapeKeyBit)の画面にしたがってインストールしてください。
    - アドオンのチェックでは「テスト中」を選んでください。

### 使い方

シェイプキーを持つオブジェクトを選択します。
サイドバーの編集タブのShapeKeyBitで、下記を実行できます。

- Select Diff：選択したシェイプキーとBasisシェイプキーとの差分を選択して表示します。
- Set Vert：選択したシェイプキーの選択している点を対象のシェイプキーに反映します。対象のシェイプキーのインデックスは、パネルの`Target ShapeKey Index`に指定します。
- Save CSV：選択したシェイプキーの選択している点をCSVに出力します。
- Load CSV：シェイプキーのCSVを読み込み反映します。

たとえば、Basisで行うべき修正を別のシェイプキーで行った場合、影響範囲を確認したり、シェイプキー間で反映したりできます。

### Pythonのコード

https://github.com/SaitoTsutomu/ShapeKeyBit/blob/main/__init__.py

以上
EC2(Windows)でユーザーデータを利用するノウハウ

# はじめに

ユーザーデータって便利ですよね。個人的にはOSの外で設定管理できるのが柔軟でいいなって思ってます。
以前からLinux OSのEC2ではよく利用してたんですが、Windows OSで利用する機会があったので個人的なノウハウをまとめました。

# 基本的な使用方法

公式ドキュメントと被るんですが一応
Linuxのケース同様、所定のテキストをセットしてあげればOKです。バッチスクリプト(bat)もPowershellスクリプトも使えます。

## バッチスクリプトの場合

`<script></script>`で囲ったテキストを用意。

```batch
<script>
echo %DATE% %TIME%
</script>
```

## PowerShellの場合

`<powershell></powershell>`で囲ったテキストを用意。

```powershell
<powershell>
$file = $env:SystemRoot + "\Temp\" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
```

## 複合記述したい場合(未検証)

ドキュメント上の情報では、上記ブロックは1つのユーザーデータtxt上に同居させることができるようです(未検証)。
留意点として、実行順はブロックの記述順に関わらず下記とのこと。

1. バッチスクリプト
2. PowerShell

## 停止→起動や再起動時にも実行してほしい場合

普通はlaunch時にしか実行されませんが、
下記のようにブロック下に`<persist>true</persist>`を指定を記述すると、再起動や停止からの起動でも実行されます。

```batch
<script>
echo %DATE% %TIME%
</script>
<persist>true</persist>
```

(これ複合指定だと効き方ってどうなるんすかね？気分が乗ったら試します)

# デバッグに利用できるリソース(ログ 等)

## 実行ログ格納先(**EC2Launchの場合**)

`EC2Config`の場合はまた別なようです(公式に載ってそう/丸投げ)

この辺をCloudwatch Logsで出してあげると管理とかにお便利でしょう。

| 実行ログpath | C:\ProgramData\Amazon\EC2-Windows\Launch\Log\UserdataExecution.log |
| --- | --- |

## スクリプトファイル配置先

想定の動作しなくてなんぞ？？？ってなったときにローカル実行して試すのに便利です。

| スクリプトファイルpath | C:\Windows\Temp\UserScript[.bat/.ps1] |
| --- | --- |

# Tips

## [bat]remでコメントしつつ文字列出力

`rem`の一番の存在理由はコメント用途ですが、バッチスクリプトでは(設定によっては無効になってるらしいが)基本`echo`と同じ動きになってくれるので、前述のログ出力等いろいろ使える場面が多い。

下記の例では、`rem %DATE% %TIME%`の実行結果は`echo %DATE% %TIME%`と同じになります。

```batch
<script>
rem Userdata Command
rem =======Start Command date and time=======
rem %DATE% %TIME%
rem =======END Command date and time=======
rem %DATE% %TIME%
</script>
```

## [bat]外部バッチスクリプトを呼び出す場合、callをつける

呼び出す場合は先頭に`call`を書くのを忘れずに。

下記はスクリプトの中で`a.bat`というファイルを実行する場合の例です。

```batch
<script>
rem Userdata Command
rem =======Start Command date and time=======
rem %DATE% %TIME%
call "C:\path_to_bat_file\a"
rem =======END Command date and time=======
rem %DATE% %TIME%
</script>
```

`call`を記載しなかった場合、そこから下の行は実行されません。

EC2ユーザーデータに限らず、バッチスクリプトくん(以下batくん)の中でbatくんを単純にお呼び出しすると、呼び出されたbatくんの実行後に呼び出し元のbatくんに処理が戻らず終了してしまい、後続の記述内容は実行されないことになる、ということのようです。

# おわりに(無関係)

今回「全編Powershell上映の予定だったが、実装の途中で実行したいファイルが.batだったと判明した」という事情がありました。なのでユーザーデータというよりほぼバッチスクリプトの話になってたかも知れません。

WindowsのシェルはLinuxシェルとはいろいろ勝手が違いますね。誰かのお役に立てば幸いです。

# 参考文献

[Windows インスタンスでの起動時のコマンドの実行 - Amazon Elastic Compute Cloud](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2-windows-user-data.html)

[rem \| Microsoft Docs](https://docs.microsoft.com/ja-jp/windows-server/administration/windows-commands/rem)
自作スクリプトをコマンドとして追加する

# はじめに

自作したスクリプトをコマンドとして追加する方法は、以下のように既にいくつかの記事が投稿されていますが、今回は私なりの方法をまとめてみました。

* [自作のコマンドを作成した](https://qiita.com/yoshiken/items/2b8e6c24d6b95e65b625)
* [Linuxで独自コマンドを作成/追加する覚書](https://qiita.com/CyberMergina/items/57ba95d777e8f3389a93)

# コマンド検索パスの確認

* `echo $PATH` でコマンド検索パスを確認して、既にパスの通っているディレクトリを確認します。
  * パスの通っているディレクトリに、作成したスクリプトを配置します。
* `$PATH` に新たなコマンド検索パスを追加する（＝パスを通す）という方法もありますが、今回は採用しませんでした。
  * パスの通った場所を好き勝手に増やすと、後々で管理コストが嵩むのが理由です。
* 今回は`/usr/local/bin`に作成したスクリプトを配置することにします。
  * `/bin`は「シングルユーザーモードでも使われる基本的なプログラム」、`/usr/bin`には「RPMやdebなどのパッケージ管理システムによって管理されるコマンドやプログラム」が保管されるそうなので、`/usr/local/bin`を使いました。（[※参考URL](https://linuc.org/study/knowledge/544/)）

```shell-session:
[root@akagi ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
```

# スクリプトの作成

* `/usr/local/bin`以下に`hardware_info`という名前のファイルを作成し、以下の内容でスクリプトを作成します。
  * [以前の記事](https://qiita.com/nkojima/items/74ce022f4157262477b8)で作成したスクリプトと同じものです。

```bash:hardware_info
#!/bin/bash

echo "[CPU Info]"
echo $(cat /proc/cpuinfo | grep "model name" | sort -u)
echo $(cat /proc/cpuinfo | grep "cpu cores" | sort -u)
echo "cpu threads : "$(cat /proc/cpuinfo | grep "processor" | wc -l)

echo "[Memory Info]"
echo $(cat /proc/meminfo | grep "MemTotal" | sort -u)

echo "[SCSI device]"
echo $(cat /proc/scsi/scsi)

echo "[PCI-E device]"
echo "$(lspci | grep -iE "SSD|Non-Volatile memory")"
```

# 実行権限の付与

* `/usr/local/bin/hardware_info`に実行権限を付与します。
  * 今回はハードウェア情報を表示するだけの処理なので、全てのユーザーとグループに対して実行権限を付与しました。

```shell-session:
[root@akagi bin]# pwd
/usr/local/bin
[root@akagi bin]# chmod +x hardware_info 
[root@akagi bin]# ls -la | grep hardware_info 
-rwxr-xr-x   1 root root 413  5月  8 17:19 hardware_info
```

# コマンドの実行

* 実行権限を付与されているユーザーまたはグループから、作成したスクリプトのファイル名を呼び出せばコマンドを実行できます。

```shell-session:
[nkojima@akagi ~]$ hardware_info 
[CPU Info]
model name : Intel(R) Pentium(R) CPU G4560 @ 3.50GHz
cpu cores : 2
cpu threads : 4
[Memory Info]
MemTotal: 7706184 kB
[SCSI device]
Attached devices:
[PCI-E device]
01:00.0 Non-Volatile memory controller: Phison Electronics Corporation E12 NVMe Controller (rev 01)
```

# 参考URL

* [自作のコマンドを作成した](https://qiita.com/yoshiken/items/2b8e6c24d6b95e65b625)
* [Linuxで独自コマンドを作成/追加する覚書](https://qiita.com/CyberMergina/items/57ba95d777e8f3389a93)
* [「/bin」「/usr/bin」「/usr/local/bin」ディレクトリの使い分け](https://linuc.org/study/knowledge/544/)
* [簡易スクリプトでハードウェア情報を取得する](https://qiita.com/nkojima/items/74ce022f4157262477b8)
Javaの変数と型名

現在Javaを独学で学習中。
備忘録のために色々と記述していこうと思います。

## 型名

Javaで変数を代入する場合は、そのデータにあった型名に収める必要がある。
以下はその一覧。

|種類           |型名    |データ                   |
|--------------|--------|-----------------------|
|整数　　　　　        |byte    |-128 〜 128まで       　　  |
|              |short   |-32,000 〜 32,000まで　　　　　　　　|
|              |int     | -21億 〜 21億まで        |
|              |long    |-900京 〜 900京まで       |
|小数点数　　　|float| 小数（doubleより厳密さに欠ける）|
|        |double| 小数　　　　　　　|
|文字　　　|char |1文字のみ　　|
|     |String | 文字列　　|

色々と種類があって、使い分けが難しい・・・
現在学習しているUdemyの講座によると、
**基本的に整数を扱う場合はint型、少数点数を扱う場合はdouble型を使用する。**
と講義されている。

また文字に関しても２種類存在する。
**char型は1文字のみ扱える型。**
例えば '赤' や '魚' etc...
2文字以上だとエラーを吐き出す。
逆に　**String型は何文字でもOK**
極論を言うと0文字でも問題ない模様。

## 定数
変数の宣言の仕方は下記の通り。

```java
char food = '魚';
System.out.println (food);
//　魚が表示される

food = '肉';
System.out.println (food);
//魚が上書きされて肉が表示される
```
ただし下記の通りに変数名の前に`final`を記述すると上書きができなくなる。
```java

final char FOOD = '魚';
System.out.println (food);
//　魚が表示される

food = '肉';
System.out.println (food);
　//上書きされずにエラーが出る
```
ポイントは変数名を大文字英字で記述すること。
小文字で記述しても問題はないが、他の人が一目で「上書きできない」と理解してもらえるように、あえてわかりやすく大文字で書くことが一般的。

どこまでいってもプログラムとは独りよがりではなく、相手への思いやりを持って記述する必要があるのだと感じた。
MoodleでjQueryとカスタムjsを利用する

MoodleでjQueryやカスタムjsを利用する方法を明記します。
MoodleではjQuery非推奨ではありますが、あしからず。

# テーマにjavascriptフォルダを作成（無い場合）
```
/theme/テーマ名/javascript
```
この中にjQueryとカスタム.jsファイルを保存する

# config.phpに以下の一行を追加
```config.php
//ファイル拡張子を付けないので、.jsがないことに気をつける
$THEME->javascripts_footer = array ('jquery-3.6.0.min', 'script');
```
config.phpの場所
```
/theme/テーマ名/config.php
```

# 参考
https://docs.moodle.org/dev/Using_jQuery_with_Moodle
Python3エンジニア認定基礎試験合格体験記

## はじめに

この記事ではPython3エンジニア認定基礎試験に合格するまでの勉強方法について書いています。
私自身プログラミング未経験で合格しましたので、同じような方の参考になればと思います。

## 勉強教材

書籍
[Pythonチュートリアル 第3版](https://www.amazon.co.jp/Python%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB-%E7%AC%AC3%E7%89%88-Guido-van-Rossum/dp/4873117534/ref=sr_1_33?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=CJ1LMPIX81LF&keywords=python+%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB&qid=1651982403&sprefix=python+%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%2Caps%2C191&sr=8-33)
[Python 3 エンジニア認定基礎試験問題集　第三版改訂版](https://www.amazon.co.jp/Python-3-%E3%82%A8%E3%83%B3%E3%82%B8%E3%83%8B%E3%82%A2%E8%AA%8D%E5%AE%9A%E5%9F%BA%E7%A4%8E%E8%A9%A6%E9%A8%93%E5%95%8F%E9%A1%8C%E9%9B%86-%E7%AC%AC%E4%B8%89%E7%89%88%E6%94%B9%E8%A8%82%E7%89%88-Watson-Clicks-ebook/dp/B08FY814J8/ref=sr_1_4?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&crid=34LQVTLNTLW0J&keywords=python+%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB&qid=1651982318&sprefix=python%E3%83%81%E3%83%A5%E3%83%BC%E3%83%88%E3%83%AA%E3%82%A2%E3%83%AB%2Caps%2C201&sr=8-4)

模擬試験問題
[DIVER](https://diver.diveintocode.jp/)
[PRIME STUDY](https://study.prime-strategy.co.jp/)

## 勉強方法
まず最初に、Pythonの基礎を学びました。YouTubeやProgate、書籍などでif文やfor文の書き方を勉強しました。
その後模擬試験を解き進めましたが、模擬試験を解き過ぎてしまい答えを覚えてしまったので、なぜその答えになるのかコードを確認しながら、分からないところは調べて正解率が9割を越えるまで解き進めました。

最後にPythonチュートリアルをしっかり読み内容を暗記しました。
よくPythonチュートリアルが読みにくいとよく聞くのですが、個人的にはコードを理解する方が難しかったので、Pythonチュートリアルの文章とコード自体も暗記して試験に挑みました。
文章問題は模擬試験ではPythonチュートリアルからそのまま出題されているイメージなので、要点を掴んで暗記しました。出題数の少ない章は流し読み程度で読みました。

## 試験結果

700点合格ラインで、750点とギリギリで合格できました。

## 感想

実際の試験は模擬試験より難しい印象でした。
ですが、コードの理解がきちんと出来ていれば合格できる内容だと思います。
システム構成

## システム構成
<b>業務を遂行する上で不可欠なシステムや、停止すると社会に深刻なダメージを及ぼすシステムのことを
<font color = blue>ミッションクリティカル</font>なシステムという
## デュプレックスシステム
<b>現用系と待機系の2系統のシステムで構成され、現用系に障害が発生すると、待機系に切り替えて処理を続行する形態
### ホットスタンバイ
<b>待機系は現用系と同一の業務システムを最初から起動しておき、<font color = blue>現用系に障害が発生したとき、待機系に速やかに切り替えて処理を続行する形態</font>。
### コールドスタンバイ
<b>待機系はバッチ処理などの他の処理を行なっていて、<font color = blue>現用系に障害が発生した時にはその処理を中断し、業務システムを起動して処理を続行する形態</font>。

![7eda0d27ee57327e537cb76078b572d6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/18b44c91-f6e5-9a33-96f9-17eb9ad5fd95.png)

#### バッチ処理
<b><font color = blue>データを一定期間または一定量貯めてから、まとめて処理する形態</font>(一括処理)
#### オンラインリアルタイム処理
<b><font color = blue>データの発生と同時に処理をする形態</font>
### バックアップサイト
<b>災害などに備えて、システムを遠隔地に準備しておくもの。イメージは待機系と同じ。
#### ホットサイト
<b>現用系と同じ構成で稼働させておき、データやプログラムもネットワークに介して常に更新を行うもの。
#### ウォームサイト
<b>ハードウェアを準備して、データやプログラムは定期的に搬入しておくもの。
#### コールドサイト
<b>バックアップサイトのみ確保しておくもの。

### BCP
<b>災害やシステム障害などの緊急事態に備えて、事前に決めておく行動計画。
### RTO
<b>事業が中断した場合、復旧にかかるまでの時間のこと。
### BCM
<b>BCPを策定し、PCDAサイクルで継続的に維持・向上を図るマネジメント活動のこと。
## デュアルシステム
<b>一つの処理を2系統のシステムで独立に行い、結果を照合する形態。
![A86.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/bb9d9825-5fbe-6e76-a6e5-b2df2ae74c27.jpeg)
## クラスタシステム
<b>複数のサーバをあたかも一台のサーバのように見せかける技術
### HAクラスタ
可用性を高め、高信頼化を目的とするシステム構成
<b><font color = blue>負荷分散型クラスタ</font> - 利用者からのリクエストに対する処理を、各サーバに振り分けて負荷分散するもの。
<font color = blue>フェールオーバ型クラスタ</font> - 同じ機能の複数のサーバを現用系と予備系に分けて運用するもの。
### データベースのディスク共有
分散を行う場合データの整合性を取る必要がある。
<b><font color = blue>負荷分散型クラスタ</font>では、サーバそれぞれにデータをもち、迅速な複製で整合性を取る。
<font color = blue>フェールオーバ型クラスタ</font>では、現用・予備系のサーバが一つのデジスクを共有する<font color = blue>共有ディスク方式</font>。
現用系のサーバのディスクに書き込まれたデータを予備系のサーバに同時にミラーリングして同期する、<font color = blue>ミラーディスク方式</font>がある。
![cluster03.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600460/e880d4ca-7ffd-ac0e-cbef-1122b0290052.gif)

### HPCクラスタ
高性能化を目指すシステム構成。複数の演算処理を連携させ、高い演算処理を引き出す。
## グリッドコンピューティング
<b>ネットワークを介して複数のコンピュータを連携させることで、仮想的に一台の巨大な高性能コンピュータを作る技術。余裕のある数百台のコンピュータを連携して並列処理させる。
分散学習をサポートしてくれるシェルを書いた


## はじめに

勉強しているものの、いまいち頭に残ってる気がしないなあ、、、と感じ始めました。

そこで頭に残る学習方法を調べたところ、やはりアウトプットと復習こそが最強のソリューションとのこと。

ちなみに復習するタイミングは以下が良いとのことで、これに沿って復習を始めることにしました。  

 >最初の復習－1日後  
 二回目の復習－7日後  
 三回目の復習－16日後  
 四回目の復習－35日後  
 五回目の復習－62日後
[エビングハウスの忘却曲線から見る、効率的な暗記法 | 百記夜行](https://100kiyakou.com/%E3%82%A8%E3%83%93%E3%83%B3%E3%82%B0%E3%83%8F%E3%82%A6%E3%82%B9%E3%81%AE%E5%BF%98%E5%8D%B4%E6%9B%B2%E7%B7%9A%E3%81%8B%E3%82%89%E8%A6%8B%E3%82%8B%E3%80%81%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AA%E6%9A%97)より


ただし僕の場合、勉強したことはmindnodeというアプリのファイルをGoogle ドライブに保存しており、  
既存のアプリはオーバースペックだったり、ファイル抽出に適してなかったりして合いませんでした。

指定のディレクトリから復習対象の日付名がついたファイルを検索するなら、シェルだけでできそうだな～と思い書いてみた次第です。

## シェルの中身

```
#!/bin/sh
VAR=`date -v -1d '+%F'`
ls 検索したいディレクトリパス | grep $VAR

VAR=`date -v -7d '+%F'`
ls 検索したいディレクトリパス | grep $VAR

VAR=`date -v -16d '+%F'`
ls 検索したいディレクトリパス | grep $VAR

VAR=`date -v -35d '+%F'`
ls 検索したいディレクトリパス | grep $VAR

VAR=`date -v -62d '+%F'`
ls 検索したいディレクトリパス | grep $VAR
```

## 使い方

- 好きなディレクトリに勉強した内容を記したファイルを置く

    - ファイルの名前はyyyy-mm-dd形式の日付にする

- 前述のシェルをコマンド化する

    - 僕の場合zshなので、[こちら](https://wemo.tech/3949)を参考にしました

- コマンドを叩けば、復習対象のファイルが表示されます

## 参考文献

[エビングハウスの忘却曲線から見る、効率的な暗記法 | 百記夜行](https://100kiyakou.com/%E3%82%A8%E3%83%93%E3%83%B3%E3%82%B0%E3%83%8F%E3%82%A6%E3%82%B9%E3%81%AE%E5%BF%98%E5%8D%B4%E6%9B%B2%E7%B7%9A%E3%81%8B%E3%82%89%E8%A6%8B%E3%82%8B%E3%80%81%E5%8A%B9%E7%8E%87%E7%9A%84%E3%81%AA%E6%9A%97)

[最短の時間で最大の成果を手に入れる　超効率勉強法](https://www.amazon.co.jp/dp/B07NYWPLDG/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)

[Mac（Catalina）でのzshの自作コマンドの作り方 | WEMO](https://wemo.tech/3949)
ds218jでpythonのbeautifulsoup4を使いたい

ds218jでpythonのbeautifulsoup4を使いたい。
pip install beautifulsoup4を実行すると、pipがないというエラーが発生。

pipをinstallする方法。
sudo curl -k https://bootstrap.pypa.io/get-pip.py | sudo python3

その後、pip install beautifulsoup4が成功
GitHubにてPullRequest後のコンフリクト修正の流れ

# 前提
チーム開発にて自分がプルリクエストした後にコンフリクトの修正を依頼された場合の修正方法についての忘備録。
具体的な状況としては、自分のプルリクエストした後に他の人のプルリクエストがマージされたことでコンフリクトが発生し、そのコンフリクトを解消する時の流れについての記述です。


# 修正の流れ
1.masterブランチに移動する
```
git checkout master
```

2.ローカルのmasterブランチに最新状態のリモートリポジトリの状態を取り込む
```
git pull origin master
```

3.自分の作業していたブランチに移動する
```
git checkout <作業していたブランチ名>
``` 

4.masterブランチをマージ
```
git merge master
```
  するとコンフリクトが起きている旨を表すメッセージが表示される
例）
```
git merge master
Auto-merging static/app.css
CONFLICT (content): Merge conflict in static/app.css
Auto-merging src/routes/index.svelte
CONFLICT (content): Merge conflict in src/routes/index.svelte
Automatic merge failed; fix conflicts and then commit the result.
```

5.エラーで指摘されているファイルを開いてコンフリクトの修正を行う
```
<<<<<<< HEAD
自分の作業ブランチの内容
=======
最新状態にしたmasterブランチの内容
>>>>>> >master
```
コンフリクトしている内容に加えて`>>>>>>> HEAD`、`=======`、`>>>>>>> master`なども消してpushする綺麗な形に直す。
この時にmasterブランチの内容をむやみに自分の環境に合わせないように気を付ける。

6.pushするまでと同じ流れを踏む。
`git add .`=>`git commit -m "コミットメッセージ"`=>`git push origin HEAD<自分の作業ブランチ>`

新しくpushしたブランチの内容がGitHubに挙がっているので確認する。