OmniAICreator/Qiita-1.07M huggingface dataset:
【Rails+dynamodb-local 】配列型でカラムを保存したい

# はじめに
こちらの記事に続きになります。

https://qiita.com/does_not_exist/items/19c35639e466844e8b0e

https://qiita.com/does_not_exist/items/23a70dab286ed146b05f

dynamodb-localに保存されたレコードを確認すると、配列として保存されてほしいデータが文字列になっていました。
フロントから配列としてデータを受け取れていたので、dynamoidの設定を見直してみることにしました。

```backend/app/models/hoge.rb
class Hoge
  include Dynamoid::Document

  table name: :hoges, key: :id, capacity_mode: :on_demand
  field :title, :string
  field :comments, :string ,array: true

end
```

modelを確認すると、配列型の宣言が間違っていました。
dynamoidの公式ドキュメントを確認すると `:array` で宣言する必要がありました。

https://github.com/Dynamoid/dynamoid

```backend/app/models/hoge.rb
class Hoge
  include Dynamoid::Document

  table name: :hoges, key: :id, capacity_mode: :on_demand
  field :title, :string
  field :comments, :array

end
```

# おわりに
はやくdynamodbになれていきたいです。
Daeja ViewONE Virtualでテキストファイルを表示する

# ViewONE Virtualによるテキストファイルの表示
今回はViewONEでのテキストファイルの方法方法について説明したいと思います。これまでViewONEではテキストファイルの表示を正式にサポートしていませんでしたが、バージョン5.0.12より新たにテキストファイルを表示できるようになりました。
[https://www.ibm.com/docs/ja/daeja-viewone/5.0.x?topic=new-whats-in-5012](https://www.ibm.com/docs/ja/daeja-viewone/5.0.x?topic=new-whats-in-5012)
# サーバー側のフォント設定
テキストファイルに日本語が含まれる可能性がある場合には日本語のフォントを指定する必要があります。
デフォルトでは英語のフォント(Arial,courier)が使用されます。そのため、日本語が含まれるテキストファイルを表示しようとした場合には正しく表示されません。
## viewone.propertiesの作成
フォントの指定をするには、HTMLのパラメータやAPIによる指定ではなく、サーバー側のプロパティファイルに指定する必要があります。web.xmlが存在するフォルダに、viewoneサーブレットの名前と同じ名前のプロパティファイル(viewoneというサーブレットを使用する場合にはviewone.propertiesという名前）を配置することでサーバー側のパラメータを指定することが可能です。プロパティファイルには以下の内容を含めてください。
 ```viewone.properties
fontRepositoryBaseLocal=C:/Windows/Fonts
enhancedTextFont=Meiryo UI
```
fontRepositoryBaseLocalにサーバー上のフォントファイルがある場所を指定します。そして、enhancedTextFontでフォントファミリーを指定します。なお、筆者のWindows環境で確認したところ、フォントの埋め込み可能属性が「編集可能」のフォントを指定する必要がありました。

# 表示確認
サーバー側の設定を行ったら、実際にビューワ上でテキストファイルを開いて確認してみましょう。
以下の様に日本語テキストが表示されていれば成功です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/1c9aec40-4455-4e4b-d0ac-08bdc1e7ef83.png)

以下の様に表示された場合には、サーバー側の設定が正しく行われていない可能性がありますので確認してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/117736/622e7a16-cf6c-d3d4-d66f-15fd1d7503b7.png)

# サポートされるテキストファイルについて
テキストファイルのエンコード形式は、UTF-8である必要があります。（2023/04/11更新：BOM付きのテキストファイルは5.0.12 iFix3でサポートされるようになりました。それより前のバージョンですと正しく表示されません。）ビューワーでテキストファイルを表示する必要がある場合には、ファイルの形式にご注意ください。
# まとめ
いかがでしたでしょうか？今回は、ViewONE Virtualでのテキストファイルの表示方法についてまとめました。

 - サーバー側のプロパティファイルでフォントの設定が必要
 - サポートされるファイル形式はUTF-8
 
次回は、マスキングやファイル編集といった高度な機能について説明したいと思います。

### ※Japan Business Automation User Groupのご紹介
IBMのコミュニティーである、[Japan Business Automation User Group](http://ibm.biz/JPBizAutomationUG)では、IBMのBusiness Automation製品関連の様々な技術情報、イベント情報の参照や、フォーラムを介した技術的な質問を行うことが可能です。是非ご参加ください。　http://ibm.biz/JPBizAutomationUG
【Laradock】ERROR: Service 'php-fpm' failed to buildの解決方法

Laradockを使用して環境構築する際にエラーが出たので、その内容と解決方法をメモしておきます。

## エラー内容

Laradockの.envファイルを作成し、以下のコマンドを実行したところ…

```sh
$ cd laradock
$ sudo docker-compose up -d --build nginx mysql workspace
```
以下のエラーが出ました。
```sh
E: Failed to fetch http://deb.debian.org/debian/pool/main/o/openexr/libopenexr25_2.5.4-2_amd64.deb  404  Not Found [IP: 151.101.110.132 80]
E: Failed to fetch http://deb.debian.org/debian/pool/main/o/openexr/libopenexr-dev_2.5.4-2_amd64.deb  404  Not Found [IP: 151.101.110.132 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
ERROR: Service 'php-fpm' failed to build: The command '/bin/sh -c if [ ${INSTALL_IMAGEMAGICK} = true ]; then     apt-get install -yqq libmagickwand-dev imagemagick &&     if [ $(php -r "echo PHP_MAJOR_VERSION;") = "8" ]; then       cd /tmp &&       if [ ${IMAGEMAGICK_VERSION} = "latest" ]; then         git clone https://github.com/Imagick/imagick;       else         git clone --branch ${IMAGEMAGICK_VERSION} https://github.com/Imagick/imagick;       fi &&       cd imagick &&       phpize &&       ./configure &&       make &&       make install &&       rm -r /tmp/imagick;     else       pecl install imagick;     fi &&     docker-php-ext-enable imagick;     php -m | grep -q 'imagick' ;fi' returned a non-zero code: 1
```

## 解決方法

`laradock/php-fpm/Dockerfile`に`apt-get update && \`を追記したら、無事ビルドできました（`RUN if…`の一行下）

```php:laradock\php-fpm\Dockerfile
###########################################################################
# ImageMagick:
###########################################################################

USER root

ARG INSTALL_IMAGEMAGICK=false
ARG IMAGEMAGICK_VERSION=latest
ENV IMAGEMAGICK_VERSION ${IMAGEMAGICK_VERSION}

RUN if [ ${INSTALL_IMAGEMAGICK} = true ]; then \
    apt-get update && \
    apt-get install -yqq libmagickwand-dev imagemagick && \
    if [ $(php -r "echo PHP_MAJOR_VERSION;") = "8" ]; then \
      cd /tmp && \
      if [ ${IMAGEMAGICK_VERSION} = "latest" ]; then \
        git clone https://github.com/Imagick/imagick; \
      else \
        git clone --branch ${IMAGEMAGICK_VERSION} https://github.com/Imagick/imagick; \
      fi && \
      cd imagick && \
      phpize && \
      ./configure && \
      make && \
      make install && \
      rm -r /tmp/imagick; \
    else \
      pecl install imagick; \
    fi && \
    docker-php-ext-enable imagick; \
    php -m | grep -q 'imagick' \
;fi
```

## 参考
https://github.com/laradock/laradock/issues/1890#issuecomment-454434262

https://domwp.hatenablog.com/entry/2019/01/30/151146
【AWS】DWHサーバー移行PJにあった課題および解決方法

2022/9からオンプレミス環境にあるお客様のDWHサーバーをAWS（Aurora）に移行するプロジェクトを始め、2023/2すべての対応は終わりました。移行作業中にいろいろ課題が出てきましたが、２つ挙げてメモとして残しておきます。

◆移行背景
オンプレミス環境にあるDWHサーバーは、データ量は増えつつあり、ハードディスクの容量不足は顕在化しております。物理的なハードディスクは柔軟に拡張できないため、容量監視でアラートが出来たら、データを削除したり、圧縮したりしていました。このような対応は都度必要があり、対象データの判断など、多大な工数はかかってしまっていました。
AWS Auroraは性能は優れているほか、ストレージも自動的に拡張できるので、移行先として進めることにしました。Redshiftも検討視野に入れましたが、リレーショナルデータベースが必要、毎日夜間バッチでデータ反映必要、データ量はそこまで大きくなく、迅速的にデータ抽出が必要という理由で、最終的にAuroraへ移行することにしました。

◆移行後の構成図
![構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/17816a5a-122d-81bb-4069-b8579af08f9c.png)
お客様のクライアントPCに事前にインストールしているMicroStrategyという分析ツールで、Auroraから必要なデータを抽出し分析を行っていただきます。

◆移行中の課題および解決方法
【課題】
Auroraのエンドポイントは将来復旧等変わっても、アプリケーション側に影響を及ぼさないため、Route53へCNAMEレコードを作成し、登録しました。
しかし、オンプレミス環境にあるお客様のクライアントPCは、インターネット接続ができないクラウド専用線でセキュアな通信をしており、DNS名前解決ができず、ODBCを設定しても繋がらないとの課題がありました。

【解決方法】
① Route 53 Resolver(インバウンドエンドポイント)作成
  Route 53 Resolver(インバウンドエンドポイント)は、AWS VPCの外部(ダイレクトコネクトやVPNで接続されているオンプレミスなど)から、VPC内のRoute 53 Resolverを使用して、VPC内の名前解決を可能にするためのエンドポイント。
② NTT.com Enterprise Cloud側のServer、On-Premise環境にあるClientPCに、DNSサーバーIPアドレスに、エンドポイントのIPアドレス設定

【課題】
SQLServerが入っているNTT.com Enterprise Cloud側のServerから、毎晩データを抽出してリンクサーバーを使い、AWS Auroraへデータを更新したり、インサートしたりするバッチ処理は動いています。
当該バッチ処理はかなり時間かかり、予定時間内で終了できず、後方処理への影響がある課題がありました。

【原因調査】
・AWS Aurora のCloudWatchメトリクス調査
![無2題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/5cbf3ccd-3bc9-90da-9ecc-fbcd2bcd1ed8.png)
・NTT.com Enterprise Cloud、オンプレミスからAWSへ通信できるよう設定している、Flexible InterConnect側調査
![無1題.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/8f33b3c7-149f-fbe1-3bfb-996887396545.png)
・ECL側のServer → Auroraと同じPrivate SubnetにあるEC2は、PINGコマンドで確認したところ、8ms程度のレイテンシ

【解決方法】
上記調査結果により、8ms程度のレイテンシが発生する環境で、数十万件のデータを UPDATE/INSERT で追加している状況にあり、やはりネットワークのレイテンシがボトルネックであるように見受けられました。

例として 30 万件のデータを INSERT する場合を考えます。この環境でネットワークのレイテンシが全体の処理に与える時間を単純に計算すると、以下のようになります。

8 (レイテンシ[ms]) * 2(往復) * 300000 (件数) / 1000 / 60 = 80 (分)

クエリの処理時間を無視しても 80 分程度の時間を要することがわかります。ネットワークのレイテンシが処理時間の支配的な要素となっていたことが疑われます。
CloudWatchメトリクスを確認したところ、CPU や Memory は十分な余裕がありました。また、ネットワークのスループットも DB インスタンスクラスの上限には達していませんでした。ただし、ネットワークのスループとは何らかの制限に抵触した際に見られる、台形のグラフが確認できました。これはネットワークのレイテンシに律速されたことによって現れたグラフと考えております。

Amazon Aurora MySQLとS3間でデータをロード&アンロードするをする機能がありますので、SQLServerリンクサーバーを使う設計を変えて、一度テキストのデータをS3にPUTし、S3からAuroraへロードする案で対応を進めました。
①Aurora が S3 にアクセスするための IAM ロールを作成
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/fe5757a5-2702-18b8-6307-452de1fbb9b0.png)
②DB クラスターパラメーターグループのパラメーターに IAM ロールの ARN を指定
![2.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/a29bdf60-00c6-dba1-1a78-60ceeb3720a7.png)
③IAM ロールをアタッチ
![3.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/c9c9b884-5602-deeb-3cf1-76ef47166849.png)
④Aurora クラスター再起動

設定後、mysql クライアントから実行して問題なくデータはアップロードできるようになりました。
![5ャ.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2600067/672e3dd3-a794-f0fe-e02d-f93333c07bf1.png)

問題ないことを確認してから、NTT.com Enterprise Cloud側のServerで、S3へテキストデータを出力し、Auroraへロードする処理を追加するようプログラムのロジックを変更し、解決に至りました。
tiny sqlite3 + node + sqlite_web

#tiny sqlite sample

## node + sqlite3 
- create workspace

```bash
mkdir your-directory-id
cd your-directory-id
npm init -y
touch index.js
```
</br>

- install npm package [sqlite3]

```bash
npm install sqlite3
```

</br>

- copy code to index.js

```javascript
const sqlite3 = require("sqlite3");
const db = new sqlite3.Database("./somedb.db");

db.serialize(() => {
    db.run("drop table if exists sometable");
    db.run("create table if not exists sometable(id,number)");
    db.run("insert into sometable(id,number) values(?,?)", "hoge", 10);
    db.run("insert into sometable(id,number) values(?,?)", "foo", 20);
    db.run("update sometable set number = ? where id = ?", 30, "foo");
    db.each("select * from sometable", (err, row) => {
        console.log(`${row.id} ${row.number}`);
    });
    db.all("select * from sometable", (err, rows) => {
        console.log(JSON.stringify(rows));
    });
    db.get("select count(*) from sometable", (err, count) => {
        console.log(count["count(*)"]);
    })
});

db.close();
```
<br>

- node index.js

``` bash
hoge 10
foo 30
[{"id":"hoge","number":10},{"id":"foo","number":30}]
2 
``` 

## sqlite3 check database with sqlite-web

- check python & pip & install sqlite-web

``` bash
python -V
pip list 
python -m pip install --upgrade pip setuptools
pip install sqlite-web
```

- use sqlite-web
``` bash
sqlite_web /path/to/database.db
```
- get sth like following..

``` bash
* Serving Flask app "sqlite_web.sqlite_web" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:8080/ (Press CTRL+C to quit)
127.0.0.1 - - [15/Feb/2023 15:52:49] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [15/Feb/2023 15:52:52] "GET /members/ HTTP/1.1" 200 -
```

- AND browser will launch itself..
シェルスクリプトを実行しようとしたら「syntax error: unexpected end of file」が出た場合

共同開発をしているソフトウェアのインストールスクリプトを実行したところ，以下のエラーが出た
```
$'\r': command not found
syntax error: unexpected end of file
```
調べてみたところ，Windowsでスクリプトの編集を行った方がいて，改行コードが異なったファイルが混じってしまっていたようだった．
これを一括で修正を実行した．
シェルスクリプトがいくつかのディレクトリに配置されているため，サブディレクトリの中も.shファイルを探索して変換するコマンドを忘備録的に記載しておく．

```
find . -type f -name "*.sh" -print0 | xargs -0 nkf --overwrite -w -Lu
```

* 「.」：探索の開始点はカレントディレクトリ
* 「"*.sh"」：シェルスクリプトファイルを指定
* 「-Lu」：改行コードをUNIX系のものにする
Azuki に TextBox 互換のメンバを追加

手っ取り早く TextBox を AzukiControl に置き換えるため、いくつかメソッドやプロパティを追加しました。

※ 部分的な実装のため完全互換ではありません。

# Azuki

Azuki は C# 2.0 で書かれたフリーのテキストエディタエンジンです。

https://azuki.osdn.jp/

https://github.com/kkato233/azuki

https://srad.jp/story/09/01/27/0547207/

# AzukiTextBox

Azuki はメンバ名などある程度は TextBox を意識しているようですが、互換ではありません。

AzukiControl を継承して必要最低限のメソッドやプロパティを追加します。

```fsharp
type AzukiTextBox() as this =
    inherit AzukiControl()

    member _.Select(start, length) =
        this.SetSelection(start, start + length)
    member _.DeselectAll() =
        this.SelectionLength <- 0
    member _.SelectionStart
        with get() = this.GetSelection() |> fst
        and set(index) = this.SetSelection(index, index)
    member _.SelectionLength
        with get() = this.GetSelectedTextLength()
        and set(length) = this.Select(this.SelectionStart, length)
    member _.SelectedText
        with get() = this.GetSelectedText()
        and set(text) = this.Document.Replace(text)

    member _.Lines =
        let doc = this.Document
        Array.init<string> doc.LineCount doc.GetLineContent
    member _.GetLineFromCharIndex index =
        this.GetLineIndexFromCharIndex index
    member _.GetFirstCharIndexFromLine line =
        this.GetLineHeadIndex line
    member _.GetFirstCharIndexOfCurrentLine() =
        this.GetLineHeadIndexFromCharIndex this.SelectionStart
```

※ 少し名前が違うだけのものを追加するのはどうなのかという気もしますが、既存のコードになるべく手を入れずに使いたかったための措置です。

# メモ

* タブ関連 `UsesTabForIndent = false, TabWidth = 2`
* 自動インデント `AutoIndentHook = AutoIndentHooks.GenericHook`
* コンテキストメニュー

https://qiita.com/7shi/items/b28767a0f1303bd08245

# 使用感

* API のすり合わせをして TextBox と差し替えましたが、コンパイルが通ればすんなり動きました。
* undo/redo が柔軟になるので、それだけでも差し替える価値があります。
* TextBox と同様の Windows 標準のキーバインドで、挙動にあまり違和感はありません。
* 5000 行程度のファイルを読ませると少し時間が掛かります。

# 参考

https://yaneurao.hatenadiary.com/entry/20100519/p9

https://yaneurao.hatenadiary.com/entry/20100519/p10
【Unity】GraphViewの構造解説

## GraphViewの解説

ざっくりですが
UnityのEditor機能の一つでノードを作成して繋ぎ合わせることでプログラマーでなくてもロジックを組むことのできる機能です。
代表的なものは
・ShaderGraph
・VFXGraph
などUnity公式ツールでもGraphViewの機能は使用されております。

![スクリーンショット 2023-02-15 143313.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128572/16b667d6-5e5b-4451-b9dc-f2e71a335fbc.png)


## GraphViewの要素

主に3つの要素から成り立っております

・Node => 箱の形 <font color="red">■</font>
・Port => 丸ぽちの形 <font color="yellow">■</font>
・Edge => PortとPortを繋いでいる線 <font color="green">■</font>

その他GraphView内にボタンやテキストなどUIElementの機能を追加することも可能です。

![スクリーンショット 2023-02-15 142713.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128572/dbcb5704-907f-5e3c-ee8a-ad29a9640c03.png)


### Nodeの構造

主に6つの要素から成り立っております。
それぞれのContainerは描画座標がことなるので表示したい座標のContainerに要素を入れるとよいです。

・titleContainer <font color="red">■</font>
・inputContainer <font color="orange">■</font>
・outputContainer <font color="yellow">■</font>
・topContainer <font color="green">■</font>
・extensionContainer <font color="blue">■</font>
・mainContainer <font color="purple">■</font>
![スクリーンショット 2023-02-15 140433.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128572/70c70f02-6665-f499-2046-be8c33218dad.png)

上記の画像はTextFiledをそれぞれのContainerにAddしております。
``` diff_c#
titlecontainer.Add(new TextFiled("コンテナ名"))
```

### Portの構造

主に2つの要素から成り立っております。

・Node 親のノード
・Edge Portから生えている線

![スクリーンショット 2023-02-15 144121.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128572/a0f9582d-1990-d564-aee3-db21e8836c6a.png)

### Edgeの構造

主に2つの要素から成り立っております。

・Port outPut側のPort <font color="yellow">■</font>
・Port input側のPort <font color="red">■</font>

![スクリーンショット 2023-02-15 144723.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3128572/e178a699-1d34-4215-0b65-a71bab5990b6.png)

## 参考

https://qiita.com/ma_sh/items/7627a6151e849f5a0ede

https://github.com/Unity-Technologies/ShaderGraph

https://learning.unity3d.jp/7654/

## 実装したプロジェクト

環境 2021.1.17f1

https://github.com/KensukeStudent/NodeGraph
フィクションなどから拾う情報処理用語 その5 IPS(Intrusion Prevention System) (秘密戦隊ゴレンジャー)

秘密戦隊ゴレンジャー第41話「青い万能戦車! バリタンク発進」(脚本：上原正三、監督：竹本弘一、技斗：岡田勝、(C) 石森プロ、東映)より

イーグルの隊員が幌付きのトラックを運転していた。
ゴレンジャー基地に資材を輸送するためである。
余談だが、演じているのは第24話、第25話、第26話の技斗を担当した池田力也さんである。
池田力也さんの運転するトラックが黒十字軍に襲撃された。
その指揮をとっていたエレキ仮面は荷台にいた隊員2名(おそらく大野剣友会の人)を倒し、池田力也さんにこう言った。

エレキ仮面「おい、このままゴレンジャー基地に向かって突っ走るのだ。」

仕方なく池田力也さんはトラックをそのまま走らせた。
そしてトラックは長沢浄水場もといゴレンジャー基地の資材搬入基地に到着した。
助手席にはイーグルの制服を着た新堀和男さんが座っていた。
あのアカレンジャーの中の人だが、池田力也さんの腹に拳銃を突きつけたのでその正体はアカレンジャーではなくてゾルダーであろう。
池田力也さんは門で警備をするイーグル隊員に通行証を渡した。通行証をゲートの装置に挿し込むと

イーグル隊員「よし、OKだ。」

1976年の時点では非接触式ICカードなどなかったので、これでも最新(?)の認証技術だったのだ。時代を感じる場面である。
閑話休題。

荷台でほくそ笑むエレキ仮面軍団の皆さん

エレキ仮面「まんまとゴレンジャー基地に潜り込めたぞ。ムフフフ。」

だがゴレンジャールームでは

ペギー松山「スパイが潜入したわ。」

ペギーが海城剛に、あのトラックのレントゲン写真を渡した。
エレキ仮面軍団の皆さんがしっかり写っていたのである。

海城「黒十字軍だ。」

後ろから明日香健二が覗き込んだ。
余談だが明日香の衣装は演じた伊藤幸雄さんの私服だったそうな。
そういえば、海城、新命、大岩、ペギーの衣装は毎回統一されていたが、
明日香の衣装はバラバラである。
流石に予算が取れなかったのであろう。
本郷猛を演じた藤岡弘、も同様の措置をとっていた。
もっとも人の良さそうな藤岡は「自分に合う服が見つからなかったんだよねえ」と言っていたが。
閑話休題。

海城「よーし、行こう。」
明日香「OK!」

海城と明日香は出ていき、新命はレントゲン写真を観ていた。
愛用の帽子をしっかり被っている。

大平透「ゴレンジャー基地に入るには、まず第一ゲートで車の積荷に至るまでレントゲンチェックを受け、そして異質なものが紛れ込んでいるとチェックオフされる。このように決してゴレンジャー基地の本部に入ることはできない。そしてチェックオフされた車は…」

トラックが急停車して驚くエレキ仮面。
外に出るとそこはトンネルの出口でブルーマシンに跨る大岩、レッドマシンに跨る海城、そしてグリーンマシンに跨る明日香の順に並んでいた。

海城「残念だったな。簡単に潜入されてたまるか。」
エレキ仮面「おのれ、ゴレンジャーめ。」
海城「ゴー!」
大岩「ゴー!」
明日香「ゴー!」

というわけで戦闘開始。

エレキ仮面「エレキ仮面様に刃向かうとは良い度胸だ。よし。かかれえ。」

とはいうもののいつもの如く

ミド「ミド、パンチャー」
ゾルダー「ホイー!」
キ「キレンジャー様のキーステッカーの威力をみんしゃい。」

アカのヤリビュートと機能がかぶるような気がするが、キーステッカーの矢じりがエレキ仮面に突き刺さった。これは効いたようだがエレキ仮面も敗けてはいない。

エレキ仮面「エレキスパーク!」

これは効き、キレンジャーは「痺れちゃう」と悶絶する羽目に陥った。
こんな感じで暫く戦った後、コンドラーがやってきた。

エレキ仮面「おーい、ここだ、ここだ。」

コンドラーがエレキ仮面を掴んで飛び

エレキ仮面「この礼は100倍にして返すからなあ。」

要するに「今日はこれくらいにしといてやるわ」と捨て台詞を吐いて去ったのである。
以後もエレキ仮面はあの手この手を尽くしてゴレンジャー基地に潜入しようとしたが、結局失敗。以後、黒十字軍も最後の最後まではゴレンジャー基地への攻撃を行なわなかったのであった。
Alfred 5 + KeePassXCで爆速でパスワードをコピペする

![demo](https://user-images.githubusercontent.com/4987502/218909942-34f80265-de15-4338-8238-b7cd2d2d6ddf.gif)

この記事はMac環境な方を対象に書かれています。

# はじめに
パスワード管理って面倒。。
WebAuthnが2019年にウェブ標準として承認されてしばらく経ちますが、Webサービスでの認証は未だにパスワード(＋多要素認証)が全盛ではないでしょうか。

普段のブラウザにパスワードを記憶させたり、秘密鍵が使える環境ならマシかもしれませんが、サイトによっては自動入力に未対応だったり、あらゆる状況でパスワードフリーな時代はまだまだ来なそうなので、Macユーザな私は長年 *KeePass(XC)* を愛用しています。

今回は、そんなKeePassの運用で感じた課題を拙作のツールで解決する方法を紹介したいと思います。

# KeePassの課題

サービス毎に一定のルールに沿ったパスワードを自動生成したり、ユーザ名やURLをまとめて管理したりと多機能な *KeePass* ですが、コピー＆ペースト時にウィンドウを行き来するのが億劫で、ついつい雑なパスワードを作ってしまいそうになっていました。
愛用している *KeePassXC* にはAutoTypeという機能もありますが、毎回ランダムで出題される秘密の質問には対応できず使用を断念しました。

# Alfredについて

![Alfred](https://upload.wikimedia.org/wikipedia/en/a/a4/Alfred-logo.png)

Alfredとはコマンド文字列でMacを操作する、Mac界で最強とも言われるランチャーアプリです。CLIに抵抗感がない人には特におすすめできます。後述のワークフロー機能を使うには有料版の購入が必要ですが、その価値はあります。買いましょう。

使いこなしのTIPSはネット上にたくさんあるので別途参照推奨。

# Alfred + Workflow

有料版を購入するとワークフローと呼ばれる、コマンドを入力すると予め定義しておいた一定の手順を自動的に実行してくれる機能が使えます。課題となっている煩雑なコピペワークをこの機能を使って解決したいと思います。

※ ワークフロー作成方法についての詳細はここでは触れません。解説記事は他にもあるので探してみてください。ワークフローの中でJSONを操作することでUIをコントロールしています。

# ワークフローの導入

**ここから先はAlfred 5以降＆KeePassXCが必要です。**

[ここ](https://github.com/mikyk10/alfred-keepass/releases)から `.alfredworkflow` ファイルをゲットします。インストール後に、KeePassのデータベースファイル、暗号化解除用のマスタパスワードの設定画面が表示されるので、適切に設定します。

![Alfred](https://user-images.githubusercontent.com/4987502/218407644-7069c96a-7c63-4b94-8385-2c30e3bf45c0.png)

設定後、Alfredのコマンド入力画面から `kp [検索文字列]` を入力しパスワードの一覧が表示されます。所望のエントリを選択して **[Enter]** キーを押すとパスワードがクリップボードにコピーされます。

**[Enter]** を押すときに特定のキーを同時押しすると、コピーするデータが次のように変わります。

| キー | 効果 |
|:-:|:--|
| ↵ のみ | パスワードをコピー |
| ⌘ + ↵  | ユーザ名をコピー |
| ⌥ + ↵  |  URLをコピー |
| ⇧⌥ + ↵ | URLを開く  |
| ⌘⌥ + ↵ | メモをコピー  |
| ⌃ + ↵  | その他、2段階認証コード、添付ファイル、その他のAttributes  |

# 中でやっていること

KeePassのデータベースファイルから、Alfredに入力されたキーワードにマッチするエントリを所定のJSONに加工し、AlfredのUIに検索結果を表示させています。

# おわりに

コマンド一発でパスワードのコピペが出来るようになり満足しています。当然ですが使用中のMacを乗っ取られてしまえば折角の暗号化も無意味です。離席時も含め、マスタパスワードの管理は慎重に。。。

使って頂けると嬉しいですがご使用に際しては自己責任でお願いします。
.bat→.vbsへ変数を渡し実行する

# はじめに
.bat→.vbsに変数を渡し実行したかったのでやり方をまとめました。

# コード
使用したコードは下記です。

① 変数をvbsファイルに渡して実行
　batファイルからvbsファイルに変数を渡すには**cscriptコマンド**を使用します。
　複数の変数を送る場合は末尾に追加します。
```batch:SendVarToVBS
    REM 変数取得
    Set variable1=%CD%

    REM vbs実行
    cscript hogehoge.vbs %variable1%

    REM 複数の場合
    cscript hogehoge.vbs %variable1% %variable2%
```

② 変数を受け取り、処理実行
　vbsファイルで変数を受け取るには**WScriptオブジェクトのArgumentsプロパティ**を使用します。
　送られてきた変数の参照は、オブジェクト変数にインデックス番号を指定して参照します。
　インデックスは0からなので、変数を1つ送った場合はWScript.Arguments(0)が一つ目の変数値です。

　送られてきた変数の数は**WScript.Arguments.Count**で確認できるので
　変数の数が0だったらエラーにする、そうでなければ変数値をメッセージボックスで表示するというプログラムにしています。
```vb:vbsRun
    ' 変数宣言
    Dim arg
    Set arg=WScript.Arguments
    
    ' 変数存在CHK
    If arg.Count = 0 then
    	Msgbox "引数がありません"
    	WScript.Quit
    Else 
        msgbox "送られてきた変数値は" & arg(0) & "です"
    End If
```
# 終わりに
変数を渡すのも受け取るのもそんなに難しくなく対応できました。
参考になれば幸いです。
Nuxt3にNuxt/imageを導入する。

# まえがき
Nuxt3もRC版になったということで、勉強も兼ねて自分のWebサイトを作っている途中で得た知識や問題について書く。
今回は画像の最適化を行ってくれる"nuxt/image"モジュールについて。これを導入するまではレスポンシブ画像を全部手動で作っていたので、導入した直後はあまりの手間の無さに変な笑い声が出たのを覚えている。
# 環境
- node.js v18.13.0
- Typescript v4.7.4
- Nuxt v3.0.0-rc.14
- TailwindCSS v3.2.4
- @nuxt/image-edge v1.0.0
※Vueは当然3.0系
開発環境はWSL(Debian)だったりChromeOS(Crostini+Debian)だったり色々。

# 導入手順
手順自体は公式ドキュメントの丸写しなので、間違っていたらコメントください。
## パッケージの導入

```sh
npm i @nuxt/image-edge
```
Nuxt3系で使う場合は"@nuxt/image-edge"を導入する必要がある。"nuxt/image"で検索するとNuxt2向けのドキュメントが先に出てきてしまうのでこの辺が少しややこしい。導入手順のページは[ここ](https://v1.image.nuxtjs.org/get-started)

## 追記:RC版になっていた
最新のドキュメントでは"@nuxt/image-edge"から"@nuxt/image@rc"にインストールするパッケージの名称が変わっている。

```sh
npm i @nuxt/image@rc
```

## nuxt.config.tsの編集
導入したモジュールをnuxtで使用できるよう設定ファイルを書き換える。
基本的にはmodulesに"@nuxt/image-edge"を追加するだけでいい。
```typescript:nuxt.config.ts

import { defineNuxtConfig } from 'nuxt/config'

export default defineNuxtConfig({
  typescript: {
    shim: false
  },
  modules: [ '@nuxt/image-edge'], // 追記,RC版を導入した場合は'@nuxt/image'
  image: {

    presets: {
      common: {
        'legacy-format': 'jpeg',
        'img-attrs': { class: 'img-inside-picture', height: 400, width: 400, decoding: 'async' }
      }
    }
  },
})

```

Nuxt3ではmodulesとbuildmodulesが区別されなくなった。modulesに追加すればあとはいい感じにやってくれる。

### 型の追加について
そのままだとTypescript側でエラーが出るので、tsconfigも書き換える。
```json:tsconfig.json
{
  "extends": "./.nuxt/tsconfig.json",
  "compilerOptions": {
    "types": [ "@nuxt/image-edge"], // 追記,RC版を導入した場合は'@nuxt/image'
  },
}
```
やることはnuxt.configで行ったことと似ていて、compilerOptionsのtypesに"@nuxt/image-edge"を追加するだけ。
これで/<NuxtImg/>コンポーネントと/<NuxtPicture/>コンポーネントが使用可能になる。

細かい使い方は[公式ドキュメント](https://image.nuxt.com/)を参照

# 追記
[MicroCMSと組み合わせて使ってみた。](https://qiita.com/ddg171/items/578313738d1e81fd3cbe)

# 参考資料
- [Optimized images for Nuxt · Nuxt Image](https://image.nuxt.com/)
【Mac】docker で Spring Boot + MySQL の環境を構築する

# 概要
docker を使ったSpring Boot + MySQL の環境構築方法をまとめます。

# 前提
事前にdockerとgradleをインストール済みとします。

# サンプルコード
https://github.com/s-kii3/TaskList/tree/v2

# ディレクトリ構成
```terminal
$ tree -L 2
.
├── Dockerfile
├── README.md
├── app # 作成したプロジェクト
│   ├── HELP.md
│   ├── bin
│   ├── build.gradle
│   ├── docker-compose.yml
│   ├── gradle
│   ├── gradlew
│   ├── gradlew.bat
│   ├── settings.gradle
│   └── src
├── docker-compose.yml
└── mysql # mysqlの設定ファイル
    ├── init
    ├── my.conf
    └── mysql.cnf

9 directories, 11 files
```
docker-compose.ymlとDockerfileを作成し、同じディレクトリ内のapp配下に作成したプロジェクトを配置します。
mysqlは以下にはdockerで作成するmysqlサーバーの設定ファイルを配置します。

# docker-compose.ymlの作成
```yml
version: "3"
services:
  # SQLのサービス
  db:
    image: mysql:8.0
    container_name: "spring_db"
    ports:
      - "3306:3306"
    volumes:
      - ./mysql/init/:/docker-entrypoint-initdb.d # テーブル作成やデータの初期化
      - ./mysql/mysql.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      MYSQL_DATABASE: "spring_test"
      MYSQL_ROOT_USER: "root"
      MYSQL_ROOT_PASSWORD: "root"
      TZ: "Asia/Tokyo"

  # springアプリケーションのサービス
  spring:
    container_name: "spring"
    ports:
      - "8080:8080"
    tty: true
    depends_on:
      - db
    volumes:
      - ./:/app:cached
    working_dir: /app
    build: .

```
上記ymlファイルを作成し配置します。

# DockerFileの作成
```dockerfile
FROM eclipse-temurin:17-jdk-alpine
ENTRYPOINT ["java","-jar","/app/build/libs/TaskList-0.0.1-SNAPSHOT.jar"]
```
上記Dockerfileファイルを作成し配置します。
docker-compose.yml内で記述することも出来ますが、今後個別に設定を追加することを想定してDockerfileを定義しています。

# アプロケーションの起動
gradle buildでjarファイル作成後、docker composeで起動させます。
```c
# アプリケーションのビルド
gradle clean build

# 起動
docker compose up -d
```
# 最後に
あらかじめgradle buildをしないといけないのが気持ち悪いので、docker composeと同時にビルドするよう設定したいのですが、上手く出来ずやり方を模索中です。

# 参考
https://zenn.dev/junki555/articles/a19f27d1045805
Linux にゴミ箱を用意し、rm コマンドでゴミ箱に移動するようにする

## はじめに
`rm` コマンドを実行すると、ゴミ箱を経由せず直接ファイルやフォルダが削除されてしまいます。間違えて削除してしまったということを防ぐために、ゴミ箱を用意し `rm` コマンドを実行する際は、ゴミ箱に移動するようにしてみました。

## 実装と使い方
`.bashrc` に以下のコードを追加して下さい（`.bashrc` に追加せずに シェルスクリプトとしてファイルを追加しても構いません（`~/bin/` など））。

```bash
function rm_wrap (){
  if [ ! -e ~/.trash ]; then
    mkdir ~/.trash
  fi
  if expr "$1" : "^-" >/dev/null 2>&1; then
    echo "This is rm_wrap: Do not use any options."
    return 1
  fi
  date=`date +%y%m%d-%R:%S`
  mv -t ~/.trash -f "$@" --suffix $date
}
function clean (){
  ionice -c 3 -p $$
  echo -n "clean : ゴミ箱を空にしますか? (y/n)"
  read answer
  case $answer in
    y)
    \rm -rf ~/.trash/* 
    \rm -rf ~/.trash/.* 
    ;;
    n)
    ;;
    *)
    ;;
  esac
}
```

ゴミ箱内に同一のファイルまたはディレクトリが存在している場合には、名前の最後に日付と時刻を付与する設定にしています。`clean` コマンドでゴミ箱内のファイルを全て削除します。`ionice` コマンドで I/O の優先度を下げていますが、無くても構いません。また、`.bashrc` に以下のエイリアスを追加して下さい。

```bash:エイリアスの追加
alias rm=rm_wrap
```

最後に`source .bashrc` コマンドを実行して下さい。これで `rm` コマンドを実行したときは、`rm_wrap` コマンドが呼び出されゴミ箱に移動してくれるようになります。通常の `rm` コマンドを使いたいときは先頭に "\\" を付けて実行して下さい（\rm）。

## 最後に
間違えて `rm` コマンドを実行してしまい、大事なファイルを削除してしまった経験がありました。そのようなことを防ぐためにも、ゴミ箱機能を持った `rm` コマンドを使うのが便利かと思いました。
未経験から就活してみた③

# 目次
* はじめに
* 結果
* 苦戦したこと
* 良かったこと
* あとがき
# はじめに
こんにちは、中学校の先生です。今回は未経験からの就活記事第3弾になります。
結論から述べると、満足いく結果になりました。
情報共有、今後の自分への戒め、アウトプットの練習として記事を書きます。
お付き合い頂けますと幸いです。
# 結果
まず私の来歴と、就活方針として、、、
趣味で半年Python勉強
↓
サーバー立てようとしてサーバーレスアーキテクチャを知る
↓
AWS面白そう
↓
AWS資格とる
↓
就活してみる
↓
せっかくAWSあるので、クラウドに絞っていく
と、いうくだりがありました。
数字で述べると30戦10勝くらいです。当然その中で決めて、4月1日からエンジニアとして働く予定です。私が勝ち取りやすかった会社さんには傾向があったので、記録しておこうと思います。
* SES
こちらは言わずもがな、全戦全勝でした。規模や業務内容問わず、履歴書出しただけで内定頂く企業がほとんどでした。
一部上長との面談を設けた企業はありましたが、あまり値踏みされるような感じはしませんでした。「採用するための面接」という雰囲気があり、面接面談の中で学習することもあまり無かったような気がしています。
ごく一部ですが一緒にキャリアプランを考えてくださった企業さんもいて、吟味する価値はあったというか、期限を設けつつも複数受けてみることが大事だな、という感想です。
* なかなかの規模のクラウドインフラ屋さん
こちらがなかなか想定外で、ご時世と自分の立ち位置と色々なものが重なって得た結果だと思います。
私の中では
（受かり　やすい）＜＜（受かりにくい）＜＜（無　理）
（スタートアップ）＜＜（中小一部上場）＜＜（大企業）
と思っていましたが、
（悩まれるが、落選）＜＜（手応え大）＜＜（書類落ち）
という結果でした。
スタートアップ、もしくはベンチャーと呼ばれる企業さんから就活を始めていましたが、多くは少数精鋭であり、未経験にOJTさせる余力も無い、と言われました。
企業の規模が大きくなるほどエンジニア不足は深刻なようで、私の来歴やキャリア構想をしっかり聞いて、採用に向けて真剣に考えてくださっていた印象があります。
# 苦戦したこと
* IaC
どの仕事もそうですが、目の前の仕事をただこなすだけじゃなくて、メタ視点で機械化自動化していくことが求められているんだな、と感じました。
大きな規模の企業さんほどIaCをガンガン使っていくようで、面接中でよく読めるか使えるかを聞かれました。
私は勉強不足で恥ずかしい思いをしましたが、これから就活される方々は是非武器にしてほしいと思います。
* スケジュールや進捗管理、中長期のマルチタスク
ぶっちゃけ就活初めてだった（学校の先生あるある）ので、複数社を同時に書類出して面接受けて、話の内容をまとめるのが大変でした。
とにかく何かに書く、アウトプットすることが大事だったと感じています。
* キャリア構想
就活初期は「採用後どんなエンジニアになりたいか」がフワフワしていたので、よく見透かされては突かれ、痛い思いをしました。採用する側としては目の前の仕事しか考えてない人はいらないので、当然と言えば当然ですね。
今の仕事の経験も織り交ぜつつ、具体的な数字も混ぜつつ、自分の実力を推し量りつつ、「こんなエンジニア目指してます」を突き詰めまくると、胸を張って就活できていた、と顧みています。
# 良かったこと
* 強がらない
未経験でも誰でもそうですが、知らないことは知らない、できないことはできない、とハッキリ言った方がお互いのためだな、と思いました。
知らないことを勉強していく姿勢を見せていくのも、エンジニアとして求められていることを感じています。
* 好きなことを頑張る
パソコンに触ることが好きで、プログラミングが好きで、それを支えていくインフラを考えるのが好き、という自分をブレさせない習慣も大事だな、と振り返っています。
企業のウケ狙いで下手に流行りのフレームワークやライブラリを触って付け焼き刃しても、自分の核がブレるだけであまり意味が無いように感じました。
* 今の仕事をしっかりやる
中途採用組なら当然今の仕事があるわけで、そこにしっかり向き合っていく姿勢も好評価でした。マイナスな理由で転職しても誰も欲しがらないので、、、
今の仕事をここまで掘り下げた
↓
並行してこういうこともやった
↓
今の仕事も好きだが、こういう事もやりたい
↓
次の仕事には、こんなことを活かせる
という自分を固めていきました。当たり前のことですいませんって感じです。
# あとがき
長々とお読みくださり、ありがとうございました。
今までは趣味でパソコンに触っている人生でしたが、これからはお金をもらうプロとしてやっていく予定です。
世の中に多くいるエンジニアさん達に負けないよう頑張っていきます。
応援ご指導、よろしくお願いします。
Astro Docker環境作成

## Astroとは

MPA(Multi Page Application)でSSG(Static Site Generator)でき、特定のフレームワークに依存しない独立したフレームワーク。
[Astro | Build faster websites](https://astro.build/)

## 簡易なDocker環境作成
※Dockerそのもののインストールは省略

以下のような状態でフォルダ・ファイルを作成。

```
astro-app
├─ app
├─ Dockerfile 
└─ docker-compose.yml
```

それぞれのファイル内容は以下

```docker:Dockerfile
FROM node:16.15.0-alpine
WORKDIR /usr/src/app
COPY ./app /app
EXPOSE 3000
```

```yaml:docker-compose.yml
version: '3.9'
services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: astro-app
    volumes:
      - ./app:/usr/src/app
    ports:
      - "3000:3000"
    stdin_open: true
    tty: true
```

フォルダを作成したら以下の流れでコンテナを立ち上げ
```bash
cd astro-app
docker-compose build
docker-compose up -d
docker-compose ps

docker exec -it astro-app sh
→　/app　に入る
```

```docker
npm create astro@latest

...プロジェクト作成時の設定を入力

npm run dev -- --host 0.0.0.0
```

[localhost:3000](http://localhost:3000) へアクセスすればAstroの初期表示
![スクリーンショット 2023-02-15 15.04.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/122221/ce31f975-2af0-6b88-e1e1-671c870d096e.png)
【JavaScript】フォームのinputタグでURLパラメータを取得する方法

先日、フォームのinputタグでURLパラメータを取得する実装を行いました。
備忘録のためにメモ残しておきます。

## 背景
- 広告の流入元を知るため、以下3つのパラメータを取得したい
    - utm_source
    - utm_medium
    - utm_campaign
- 取得したパラメータをフォームで送信したい


## URLパラメータとは
プログラムに情報を送信するため、URLの末尾についた文字列

```
https://hogehoge.co.jp?○○○=×××
```

## パラメータの種類（？）
utm_source：どこからの流入なのかを分類
utm_medium：どのメディアからの流入なのかを分類
utm_campaign：メルマガなど広告を条件ごとに絞って分析する
utm_term：有料検索での「キーワード」を分析
utm_content：一つの広告に同一のURLを複数入れている場合、どの「コンテンツ」から流入したかを分類

## 実装内容
### 大まかな流れ
1. HTMLでinputタグを作成
1. JavaScriptでパラメータを取得
1. 取得したパラメータをinputタグのvalueに入れる
1. フォーム送信

```html:例のURL
https://hogehoge.co.jp?utm_source=hoge&utm_medium=fuga&utm_campaign=piyo
```

### HTMLでinputタグを作成
```html:index.html
<input type="hidden" name="utm_source" value=""></input>
<input type="hidden" name="utm_medium" value=""></input>
<input type="hidden" name="utm_campaign" value=""></input>
```
ユーザーに入力してほしいものではないので`type="hidden"`にして見えなくしています。

### JavaScriptでパラメータを取得＆取得したパラメータをinputタグのvalueに入れる
```javascript:form.js
// パラメータを取得
const params = new URLSearchParams(location.search);
// 取得したそれぞれのパラメータをそれぞれのinputタグのvalueに入れる
document.getElementsByName("utm_source")[0].value = params.get("utm_source");
document.getElementsByName("utm_medium")[0].value = params.get("utm_medium");
document.getElementsByName("utm_campaign")[0].value = params.get("utm_campaign");
```

下記のような形で、それぞれのパラメータがそれぞれのinputタグのvalueに入る
```
<input type="hidden" name="utm_source" value="hoge"></input>
<input type="hidden" name="utm_medium" value="fuga"></input>
<input type="hidden" name="utm_campaign" value="piyo"></input>
```

## 参考
すごく参考になりました！ありがとうございます
- [【Javascript】「？」から始まるURLのクエリパラメータを設定・取得する方法](https://qiita.com/hiroyukiwk/items/5162a8861f716bcd5fd7)
- [【JS】フォームのinputタグにURLパラメータを渡す方法](https://www.i-ryo.com/entry/2018/07/09/215039)
- [【JavaScript】URLのクエリパラメータを取得する【URLSearchParams】](https://into-the-program.com/javascript-get-url-query-parameters/#toc0)
MacでRuby3.2.1 インストールメモ

# 変更履歴
2023/2/15 初稿（とりあえず殴り書き）

# 環境
H/W :  Macbook Air 13inch (model A1932、メモリ16GB)
OS  :  macOS Ventura 13.2

# はじめに
ヤフオクでMacbook Airを手に入れたので最新版のRuby3.2.1を入れようとしたら無茶苦茶めんどかったのでメモを残します。
最終的にうまく行ったコマンドの羅列となります。
誰かの参考になればいいなぁ。

# インストール準備

## Homebrew
ここを見るような人はとっくに入っていると思いますが、私のようなMac初心者もいると思いますので。
以下よりインストールしてください。
[Homebrew]<https://brew.sh/index_ja.html>

バージョンを確認。
```
% brew --version
Homebrew 3.6.21-91-g31ec835
Homebrew/homebrew-core (git revision 31ec835c9; last commit 2023-02-13)
Homebrew/homebrew-cask (git revision 8784f1a42f; last commit 2023-02-13)
```

## Rust
Ruby3.2から使えるようになったYJITを試すためにRustをインストールしました。
不要な場合は入れなくても良い。

```
% brew install rustup-init
% runtup-init
% rustc --version
rustc 1.67.1 (d5a82bbd2 2023-02-07)
```

## openssl
既にmacbookに入っていましたが、rbenvではそのまま使えません。

```
% openssl version
LibreSSL 3.3.6
```

openssl@3をインストール。2023/1/15現在`openssl 3.0.8`が入ります。

```
% brew install openssl@3
```

## readline

入っていない場合はHomebrewから入れる。

```
% brew install readline
```

## libyaml
Ruby3.2系からソースが同梱されなくなったとかで必要。

```
% brew install libyaml
```

## xcode

ここを見るような人は入れていると思いますが、xcodeを入れていない場合は以下で入れます。
通信環境にもよりますが、時間がかかります。私の環境では１時間くらいかかりました。
`xcrun: error: invalid active developer path 〜`というエラーの対処のためです。

```
% xcode-select --install
```

## 環境変数
YJIT有効、docとrdocを入れない（導入時間短縮の定石）、opensslのPATH指定となります。
rustを入れない場合（YJIT無効）は`--enable-yjit`を省きます。

```
% export RUBY_CONFIGURE_OPTS="--enable-yjit --disable-install-doc --disable-install-rdoc --with-openssl-dir=/usr/local/opt/openssl@3"
```

opensslのパスは以下で確認できます。
環境変数の指定で`--with-openssl-dir=$(brew --prefix openssl)`とすることも可能です。
```
% brew --prefix openssl
/usr/local/opt/openssl@3
```

# インストール手順
準備が面倒でしたが、ここからRuby3.2.1のインストール手順です。

## rbenvとruby-buildのインストール

```
% brew install rbenv ruby-build
```

## rubyインストール

インストール可能なバージョンを確認します。
```
% rbenv install --list
2.7.7
3.0.5
3.1.3
3.2.1
jruby-9.4.1.0
mruby-3.1.0
picoruby-3.0.0
truffleruby-22.3.1
truffleruby+graalvm-22.3.1
```

ruby 3.2.1をインストールします。
```
% rbenv install 3.2.1
```

rubyの切替可能バージョンを確認します。
3.2.1が切替選択可能になっています。
```
% rbenv versions
* system
  3.2.1
```

ruby3.2.1をglobalで指定して切り替えます。
```
% rbenv global 3.2.1
% rbenv versions    
  system
* 3.2.1 (set by /Users/mac/.rbenv/version)
```

## シェル設定ファイル
zshを使っているので、.zshrcにrbenvのinit設定を入れます。
必ずホームディレクトリで作業してください。
```
% echo 'eval "$(rbenv init -)"' >> .zshrc
% source .zshrc
```

## バージョン確認
インストールしたRubyのバージョンを確認します。
```
% ruby -v
ruby 3.2.1 (2023-02-08 revision 31819e82c8) [x86_64-darwin22]
```

# 終わりに

お疲れ様でした〜。
うまくインストールできましたでしょうか。
私は何度も何度もエラーとなり、その度にGoogle先生を訪ねる旅に出かけました。
私の環境はIntelMacですがM1やM2のAppleシリコン搭載のMacだと、また別のエラーに遭遇するかもしれませんね。
神のご加護がありますように。
【Rails】後から id 列を追加したい

`id: false` で作成したテーブルに対して、やっぱり id を追加したいってなることもありますよね。

そんなときは以下のマイグレーションで追加できます。

```rb
class AddIdToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :id, :bigint, primary_key: true, auto_increment: true, null: false, first: true
  end
end
```

これで以下のようなマイグレーションが実行されます。

```ruby
Migrating to AddIdToUsers (20230215062132)
== 20230215062132 AddIdToUsers: migrating =======================
-- add_column(:users, :id, :bigint, {:primary_key=>true, :auto_increment=>true, :null=>false, :first=>true})
   (54.6ms)  ALTER TABLE `users` ADD `id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST
   -> 0.0554s
== 20230215062132 AddIdToUsers: migrated (0.0555s) ==============
```

auto_increment で自動採番されるので、NOT NULL カラムとして追加できます。
また、 `first: true` 指定によって、先頭カラムとして追加できます。

これで、 `id: false` を指定せずにテーブル作成した場合と同じような感じになります。

## 動作確認環境

- Rails: 6.1.7
- MySQL: 5.7
TortoiseGitで、Colud not open log. libgit reports: bad object refs/desktop.ini が出た時の対処方法

TortoiseGitのバージョンをあげて 2.14.0 にしたら、「Colud not open log. libgit reports: bad object refs/desktop.ini 」というエラーが出てしまいました。

![2023-02-15_tortoisegit.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/180861/776745bd-81c2-f3b7-8bb9-3bc2579ee88e.png)

エラーが出たフォルダ以下の `desktop.ini` をすべて削除し、`git gc` をすることで直りました。

以下はWindowsのコマンドプロンプトで実行する
```
cd [エラーが出たフォルダ]
del desktop.ini /F /S /A:H
```

以下はGitが動く環境で実行する（Windowsのコマンドプロンプトでも良い
```
git gc
```

delのオプションは以下の通り

/F…読み取り専用のファイルを消す
/S…サブフォルダから再帰的に削除する
/A:H…隠しファイルを削除する

## 参考

https://kitano-daichino-gijyutuya.hatenadiary.jp/entry/2015/06/08/160456
jQueryに関する自分用メモ

・フェードイン

```javascript
function fadeUpEffect() {
		$('.fadeUpEffect').each(function () {
			var element = $(this).offset().top + 100; //画面上からの距離。+100でmargin-top: 100px;の意味。
			var scroll = $(window).scrollTop();
			var windowHeight = $(window).height();
			if (scroll >= element - windowHeight) {
				$(this).addClass('fadeUp');
			}
		});
  }
  $(window).scroll(function () {
		fadeUpEffect();
  });
```

https://logical-studio.com/develop/frontend/20200522-scroll-event/#offsettop

CSS↓↓
```css
.fadeUpEffect {
  opacity: 0;   //該当する要素を透明にしとく。
}

.fadeUp {
  opacity: 0;
  animation-name: fadeUp;
  animation-duration: 0.8s;
  animation-fill-mode: forwards;
}
@keyframes fadeUp {
  from {
    opacity: 0;
    transform: translateY(40px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
```
Androidのgradleでのbuild variantsあれこれ

# 前提
このようなVariantsの状況であるとします。

```.gradle
android{
    buildTypes{
        debug{...}
        release{...}
    }
    flavorDimensions "number", "alphabet"
    productFlavors{
        one{
            dimension "number"
        }
        two{
            dimension "number"
        }
        alpfa{
            dimension "alphabet"
        }
        beta{
            dimension "alphabet"
        }
    }
}
```

これでsyncすると以下のようなパターンが出力されますね
```
oneAlphaDebug
oneAlphaRelease
oneBetaDebug
oneBetaRelease
twoAlphaDebug
twoAlphaRelease
twoBetaDebug
twoBetaRelease
```

# 優先度
## モジュール
この状態でモジュール直下にvariants用のディレクトリを作成すると、該当variantsが指定された際に優先的に読み込ませることができます。

```
ex)
project/app/src/main/java/Util.kt
↓
project/app/src/debug/java/Util.kt -> 「〇〇Debug」variantsの時に優先される
project/app/src/release/java/Util.kt -> 「〇〇Release」variantsの時に優先される
```

flavorと組み合わせた際の優先度は以下になります
1. src/oneDebug/ (flavor1 + buildType)
2. src/alphaDebug/ (flavor2 + buildType)
3. src/debug/ (buildType)
4. src/one/ (flavor1)
5. src/alpha/ (flavor2)
6. (src/main/ (main))

/mainの優先度はresファイルを置いた時のみです
/mainとのクラス重複はビルドエラーになるので、正しく分けましょう

## dependencies
flavor or buildType +"implementation" で指定できます

```
implementation "aaa" -> 全てのvariantsで読み込まれる
debugImplementation "aaa" -> 「〇〇Debug」varantsでのみ読み込まれる
oneImplementation "aaa" -> 「one〇〇」varantsでのみ読み込まれる
alphaImplementation "aaa" -> 「〇〇alpha〇〇」varantsでのみ読み込まれる
oneDebugImplementation "aaa" -> ×
```

注意すべきなのは
flavorとbuildTypeはそれぞれ一つしか指定できないことです。
(もしかしたら出来るかも...指定方法あれば教えてほしいです)

# filter
「twoAlphaはデバッグ専用のvariantsなので、「twoAlphaRelease」variantsはいらない。表示したくない。」という場合

gradle7.0から以下のように書けば対応できます。

```.gradle
android{
    buildTypes{...}
    buildFlavors{...}
    androidComponents {
            beforeVariants(selector().all()) { variantBuilder ->
                def isRelease = variantBuilder.buildType == "release"
                def isTwo = variantBuilder.productFlavors[0].second == "two"
                def isAlpha = variantBuilder.productFlavors[1].second == "alpha"
                if (isRelease && isTwo && isAlpha) {
                    variantBuilder.enabled = false
                }
            }
        }
}
```

# 参考
https://developer.android.com/studio/build/build-variants?hl=ja#filter-variants
https://stackoverflow.com/q/67330818
【React】JSX記法のルールとコンポーネント

## この記事の目的
- Reactの理解とアウトプット、振り返り用
- Reactでよく使われている基本的な技術を言語化できるようする

# JSX記法のルール
```react
// Reactコンポーネントを書く場合、お作法としてreactのインポートが必要（React17のアップデートでJSXを使用するだけの場合は記述不要になった）
import React from "react";
// htmlにコンポーネントを反映するために、react-domをインポートする
import ReactDom from "react-dom";

// Reactでは関数を使用して画面の要素であるコンポーネントを表現していけるので、アロー関数を書いていく
const App = () => {
 return (
  <> 
   <h1>ReactJSX記法のルール</h1>
   <p>React学習中</p>
  </>
 );
};
// Appをコンポーネントとしてレンダリングする
// 第一引数にレンダリングしたいコンポーネント、第二引数に反映箇所を指定する
ReactDom.render(<App />, document.getElementById("root"));
```

# JSX記法のルールまとめ
- jsxはjavascriptの中にHTMLを書いていく。
- ファイル拡張子はjsxとする。
- returnの内容が複数になる場合は（）で囲う必要がある。
- returnしていく内容は1つのタグで囲わないとエラーになるので、フラグメント（<></>）で囲ってあげる。

# コンポーネント
コンポーネント：Reactで画面に表示される部品のことで、表示に必要なデータや処理などを1つのオブジェクトにまとめたものです。画面に表示するための部品を作ることによって、いつでも簡単に組み込むことで部品を再利用することができます。

```react
import React from "react";
import ReactDom from "react-dom";

const App = () => {
  return (
    <> 
   　<h1>ReactJSX記法のルール</h1>
   　<p>React学習中</p>
    </>
  );
};

// コンポーネントをエクスポートして、他のファイルでインポートできるようにする。
export default App;
```
# コンポーネントまとめ
コンポーネントとは画面要素の1単位。大（1画面）から小（1つのテキストボックス）まで様々。
コンポーネント名は必ず先頭を大文字から始めるようにする。
コンポーネントをエクスポートして、他のファイルでインポートできるようにする。

## 参考資料
[React公式ドキュメント](https://ja.reactjs.org/docs/getting-started.html)
[React公式チュートリアル](https://ja.reactjs.org/tutorial/tutorial.html)
【MySQL】Workbenchでオートインクリメントをリセットする

## 実施すること
* 設定しているオートインクリメントをリセットする

データを追加していると削除されたデータのインクリメントのところから新しく番号が振られるので、一度リセットしたい。

## 現在の状態
|  id  |  name  |
| ---- | ---- |
|  1  |  John  |
|  2  |  Alice  |
|  3  |  Bob  |

のようなカラムがあり、新しく`Jack`を追加したとします。
そうすると、以前データを追加→削除したことがあるので`4`ではなく`5`が振り分けられるようになっています。
|  id  |  name  |
| ---- | ---- |
|  1  |  John  |
|  2  |  Alice  |
|  3  |  Bob  |
|  5  |  Jack  |

## Workbenchでこれをリセットする
絶対に正解かは分かりませんが、（バックアップなどは取っておいた方がいい）すごく簡単にできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2884542/8551e2b3-0e83-baf4-093d-c15b7d077b23.png)
個々の`AI`のチェックマークを一度外し、`Apply`、その他ともう一度チェックマークを付けて`Apply`することでリセットされます。

この方法が絶対ではないですが、簡単にリセットできました。

一般的な方法は以下の通りだそうです。
***1. カラムのデータ削除***
```
TRUNCATE TABLE テーブル名;
```

***2. オートインクリメントの値リセット***
```
ALTER TABLE テーブル名 AUTO_INCREMENT = 1;
```
# Error: NameError: file C:\Program Files\Autodesk\Maya2022\Python27\lib\site-packages\pymel\core\__init__.py line 77: name 'windows' is not defined

# Error: AssertionError: file C:\Program Files\Autodesk\Maya2022\Python27\lib\site-packages\pymel\internal\factories.py line 3099: ('AiSky', <class 'maya.OpenMaya.MFnDagNode'>, <class 'maya.OpenMaya.MFnDependencyNode'>)
# Error: NameError: file C:\Program Files\Autodesk\Maya2022\Python27\lib\site-packages\pymel\core\__init__.py line 77: name 'windows' is not defined

```userSetup.py
import pyeml.core as pm
```
Zoho SalesIQのチャットウィジェットを特定のページで表示させないようにする

設定では実現できなかったので、JSを使って制御する
```html
<script type="text/javascript">
	$zoho.salesiq.ready=function(embedinfo){
		if((window.location.href == "URL1") || (window.location.href =="URL2") || (window.location.href == "URL3") || (window.location.href == "URL4")){
			$zoho.salesiq.floatbutton.visible("hide"); 
		}
	}
</script>
```
上記のコードを設置すれば実現できる。
AXLBIT株式会社、「技術ブログ」始めました。

皆さま、はじめまして。このたび、AXLBITの開発情報を発信する目的で、Qiitaにて技術ブログを新設いたしました。今回は、その最初の投稿です。

# AXLBITとは
#### はじめに自己紹介をさせてください。
弊社 AXLBIT株式会社は「サブスクリプションで世の中をもっと豊かに便利に」をテーマにサブスクリプション型ビジネス支援ソフトウェア「AXLGEAR」の開発・提供、エンタープライズ向けアプリケーションプラットフォーム「AXLBOX」を運営しているスタートアップ企業です。読み方は「アクセルビット」といいます。
公式HP　https://axlbit.com/

#### ビジョン
”「めんどくさい」を「楽しい」に変える”を合言葉に！”
AXLBITでは、サブスクリプションを提供する側も消費する側も楽しく利用できるシステムを目指して開発を進めています。新しい技術を積極的に取り入れサービス機能の拡充、社内でも従業員がワクワクする仕事を増やしていくことを目指しています。

# 「技術ブログ」を始める理由
この度、技術ブログを開設した理由は2点あります。

#### もっとAXLBITのことを知ってほしい。
弊社のようなBtoBのスタートアップ企業ではどうしても発信力に限界があります。その中で、技術ブログを持つことで、エンジニアのスキルだけではなく、製品の魅力やメンバーの性格、組織カルチャーも見えるようになり、弊社に興味を持ってくれる方との接点作りに寄与すればと思っています。

#### エンジニアにアウトプットの場を作りたい。
実際に自分が書いたコードや学習していく中で得た知識を具体的な対外文章にすることで、書き手である本人のスキルの定着に貢献します。また、情報を収集する立場から共有・発信する立場になることで世の中のエンジニアの皆様に貢献することができると考えます。

# 終わりに
ご存じの通り技術ブログは継続が難しいものです。しかし何事も挑戦がなければ新しい学びは得られません。ブログを続けていく中で得られた発見や気づきをAXLBITの新しい文化として、形にしていければと思います。あたたかく見守っていただけますと助かります。

このほか、AXLBITのソリューションや導入実績については、以下の製品サイトから詳細をご覧の上、何かございましたらいつでもお気軽にご相談いただけると幸いです。

・サブスクリプション型ビジネス支援ソフトウェア「AXLGEAR」製品サイト
https://axlgear.net/

・SaaS型アプリケーションプラットフォーム「AXLBOX」製品サイト
https://axlbox.com/
√(4/x-1)の定積分「2023年藤田医科大」をwolframalphaとsympyでやってみた。

グラフがでます。

オリジナル

https://youtu.be/MK84qPVOnBI

# wolframで
プロットでます。いいですね。

https://ja.wolframalpha.com/input?i=1%E3%81%8B%E3%82%893%E3%81%AE%E7%AF%84%E5%9B%B2%E3%81%A7%E2%88%9A%284%2Fx-1%29%E3%82%92%E7%A9%8D%E5%88%86

出力?
定積分

integral_1^3 sqrt(4/x - 1)dx = (2 π)/3≈2.0944

上と同じです

https://www.wolframalpha.com/input?i=Integrate%5B%E2%88%9A%284%2Fx-1%29%2C+%7Bx%2C+1%2C3%7D%5D&lang=ja


https://www.wolframalpha.com/input?i=int_1%5E3%5Bsqrt%284%2Fx-1%29%5D&lang=ja

# sympyで

chromebook+linux+vscode+python+sympy+matplotlib(numpyみたい)で、できると思いませんでした。
普通は？windowsです。

```python
from sympy import *
var('x')
y=sqrt(4/x-1)
print("#",integrate(y,((x,1,3))))
plot(y)
#plot(y, (x,1,3))
plot(y,0,(x,1,3))
# 2*pi/3
```
plotコマンドは、縦横比？異なります。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/b740bde1-ed95-73bc-78db-e8cd0e91fdb1.png)
![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/e406f5e2-79a5-170a-efe5-113df0eafab6.png)

# 積分の過去問

https://kamelink.com/blog/tag/%E7%A9%8D%E5%88%86%E3%81%AE%E8%A8%88%E7%AE%97/
MySQLインストール時の、VisalStudioのインストール要求を満たす

# MySQLインストール時にVisalStudioが要求される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452092/940613d8-84f8-eca4-0b4b-101496742831.png)
MySQLインストール時に、VisalStudioのインストールが要求される場合があるかと思います。VisalStudioのインストールを飛ばして、MySQLのインストールを続行する事も出来ますが、今回は要求を満たす方法をメモしときます。
# Visal Studioのインストール
要求されているバージョンは2019年のものです。2022年版には正式に対応していません(2023年2月時点)。
以下の公式サイトから2019年版を選択しダウンロードをクリック。（「Visal Studio 2019」とかで検索しても出てきます。）
https://visualstudio.microsoft.com/vs/older-downloads/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452092/7b4caf7a-0b5e-5c87-6c29-10995ef7c613.png)
何やらいっぱいありますがCommunityが無料で使えるやつです、ダウンロードをクリック。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452092/33f37839-b6ca-a201-ec67-00f50b3211c6.png)
あとは手順通りにインストールすれば良いのですが、以下の画面(Workloads)で「.NET desktop development」を選択してください。すると画面右のoptionalがデフォルトで沢山選択された状態になっていますが、**上２つだけがMySQLで要求されているモノ**です。上２つ以外の選択肢は外しても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452092/c28cda07-3d3d-7831-8a85-ccad9906bc39.png)
以上のインストールが終われば、Visal Studioの要求は満たされます。

--補足--
「.NET desktop development」の選択を忘れてしまった！という人や、あるいは既にVisal Studioが入っている方も、ダウンロードしたインストーラーの「Modify」からいつでも変更できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2452092/c02b94fd-4a01-0722-e40f-5962dbe0046c.png)
ChatGPTにIISログをバックアップするpowershellを書かせてみた

質問：先月のiisログを圧縮するpowershellを書いて

回答：
以下は、PowerShellを使用して先月のIISログを圧縮するスクリプト例です。このスクリプトでは、IISログがデフォルトの場所に保存されていることを前提としています。

```posh
# 先月の日付を取得
$lastMonth = (Get-Date).AddMonths(-1)

# IISログの保存場所
$logPath = "C:\inetpub\logs\LogFiles\W3SVC1"

# 先月のログファイル名
$logFileName = "u_ex" + $lastMonth.ToString("yyMMdd") + ".log"

# 圧縮後のファイル名
$zipFileName = $logFileName + ".zip"

# 圧縮するログファイルのパス
$logFilePath = Join-Path $logPath $logFileName

# 圧縮後のファイルの保存先
$zipFilePath = Join-Path $logPath $zipFileName

# 圧縮する
Compress-Archive -Path $logFilePath -DestinationPath $zipFilePath -Force

# 圧縮したファイルを削除する
Remove-Item $logFilePath
```

このスクリプトは、以下の手順に従ってログファイルを圧縮します。

1.`Get-Date` コマンドレットを使用して、先月の日付を取得します。
2.`$logPath` 変数に、IISログが保存されている場所のパスを格納します。
3.`$logFileName` 変数に、先月のログファイル名を格納します。
4.`$zipFileName` 変数に、圧縮後のファイル名を格納します。
5.`$logFilePath` 変数に、圧縮するログファイルのパスを格納します。
6.`$zipFilePath` 変数に、圧縮後のファイルの保存先を格納します。
7.`Compress-Archive` コマンドレットを使用して、ログファイルを圧縮します。`-Path` パラメーターに圧縮するファイルのパス、`-DestinationPath` パラメーターに圧縮後のファイルの保存先、`-Force` パラメーターに圧縮後のファイルがすでに存在する場合に上書きするよう指定します。
8.`Remove-Item` コマンドレットを使用して、圧縮したログファイルを削除します。

このスクリプトを実行すると、先月のIISログが圧縮され、元のログファイルが削除されます。
[Flutter] Do not use BuildContexts across async gapsの対処方法


こんにちわ。いせきです。

今回は、warningの一つを対処する方法を共有します

では今回は、画面遷移の際に


```dart
await Navigator.push(
      context,
      MaterialPageRoute<dynamic>(
        builder: (context) => const WeatherScreen(),
      ),
    );
```

## 解決策

<b>mountedを入れてあげると、Warningが消えて問題なくなる。</b>


```
if (!mounted) {
      return;
    }
    await Navigator.push(
      context,
      MaterialPageRoute<dynamic>(
        builder: (context) => const WeatherScreen(),
      ),
    );
```
Gitの基本

配属後に新人チームで開発を行う機会があり、その際にGit周りで使用した部分についてまとめた記事です。所属チームでは主にGitLabを利用しているので、ここではGitLabでの例を挙げます。

## GitLab連携
まずGitLab上でプロジェクトを作成し、GitLabにSSHでアクセスする場合には、公開鍵を登録しておきます。
参考：[SSH認証キーをGitLabに登録・設定手順 覚書](https://qiita.com/redamoon/items/07e445d1fce360cb5fa3)

#### ローカルでまだプロジェクトを作成していない場合
プロジェクトを置きたい場所で以下コマンドを実行し、リポジトリを取得します。
```
git clone [URL]
```

#### 既にローカルでプロジェクトを作成している場合
プロジェクトのルートディレクトリで以下コマンドを実行します。
```
git init    # まだGitで管理していない時のみ実行
git remote add　[リモート名] [URL]
git push -u [リモート名] [ローカルブランチ名]
```

これでこのブランチに関しては、次回からpushやpullなどでURLを指定する必要がなくなります。

## .gitignoreの用意
Gitで管理したくないファイルを`.gitignore`に記述しプロジェクトのルートディレクトリに置いておくことで、管理対象から外すことができます。[gitignore.io](https://www.toptal.com/developers/gitignore)を利用すると簡単に作ることができます。

開発前に行う基本的な流れは以上で、あとは必要に応じてCI用の設定ファイルを作成したりします。

## 開発時の基本的な流れ
コミットしたいファイルをステージングエリアにあげます。
```
git add [ファイル名]
```
コミットしたくないファイルがステージングエリアに含まれていないか確認します。
```
git status

# コミットしたくないものが含まれていた場合はステージングエリアから除去
git restore --staged [ファイル名]
```
問題なければメッセージをつけてコミットします。
```
git commit -m 'メッセージ'
```


リモートリポジトリにあげたいタイミングでリモートリポジトリの変更分を取り込み、コンフリクトが起きなければpushします。
```
# リモートリポジトリの内容の取り込み
git pull
# または
git fetch
git merge

# リモートリポジトリにローカルリポジトリの内容を反映
git push
```
基本的にはこれを繰り返して開発を進めていきます。

## その他よく使ったコマンド
#### ブランチ関連
チームの方針にもよるのかもしれませんが、基本的に機能毎・修正点毎などでブランチを分けて作業するので、そのブランチの管理に使ったコマンド達です。
```
# リモートブランチ含め全てのブランチを表示(-aをつけない場合はローカルブランチのみ)
git branch -a

# 新しいブランチを作成し、そのブランチに切り替える(-cを付けずに既存のブランチ名を指定すると、ブランチの切り替え)
git switch -c [ブランチ名]

# ブランチの削除
git branch -d [ブランチ名]
```

#### 変更点の確認
ワーキングツリーとステージングエリア、ステージングエリアとコミット内容などの間の変更点を確認できます。
```
git diff
```
参考：[忘れやすい人のための git diff チートシート](https://qiita.com/shibukk/items/8c9362a5bd399b9c56be)

#### コミット履歴の確認
オプションを付けることで見た目や表示範囲を変えることができますが、VSCodeを使っている場合には拡張機能を使ったほうが見やすいと思います。私は[Git Graph](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph)を使っています。
```
git log 
```

参考：[git log よく使うオプションまとめ](https://qiita.com/take4s5i/items/15d8648405f4e7ea3039)

#### 過去のコミット地点に戻る
ここはワーキングツリーやステージングエリアの内容をどうするか、移動先で変更を加えたいのかなどで使い分ける必要があります。
```
# 過去コミットに移動(--hardはワーキングツリーの内容も消えるため注意)
git reset --hard [ハッシュ]

# 一時的に移動(変更を保存したい場合には新しくブランチを作ることを忘れない)
git switch [ハッシュ]
```
参考：
- [[git reset (--hard/--soft)]ワーキングツリー、インデックス、HEADを使いこなす方法](https://qiita.com/shuntaro_tamura/items/db1aef9cf9d78db50ffe)  
- [第19話　detached HEAD 状態って何？ブランチがない状態を解決する方法　【連載】マンガでわかるGit～コマンド編～](https://www.r-staffing.co.jp/engineer/entry/20201225_1)

#### 作業内容の一時保存
ブランチを切り替える前などに、コミットするほどではないがワーキングツリーの変更を残したい場合に使用します。
```
# コミットしていない変更を退避
git stash

# 直近のstashを戻す
git stash apply
```
参考：[【git stash】コミットはせずに変更を退避したいとき](https://qiita.com/chihiro/items/f373873d5c2dfbd03250)

#### pushの取り消し
誤ってpushした場合に行います。pushに-fをつけると問答無用で変更が適用され、他者のコミットを消してしまう可能性があるので、チーム開発の際は行わない方がいいです。
```
# 履歴が残らない。
git reset [戻したいコミットのハッシュ]
git push -f

# 履歴が残る。
git revert [取り消したコミットのハッシュ]
git push
```
参考：[git pushを取り消す方法](https://qiita.com/S42100254h/items/db435c98c2fc9d4a68c2)