OmniAICreator/Qiita-1.07M huggingface dataset:
プログラマーにオススメの機械式腕時計２選

　プログラマーやコンピュータエンジニアにも機械式腕時計好き、いますよね？
　えっパソコンいじると磁気帯びするから機械式は使わない?それも合理的ですね…。
　今回は私の独断で軽いのと重いの、数十万と数万のものを用意しました!

# グリシンエアマンglycine airman
![PXL_20230723_212339157~3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/ad36eb69-73ea-e7f7-48f7-84d64ce84e3d.jpeg)
　本体だけなら約50グラム
　ナイロンのNATOストラップも使えるかなり軽い腕時計。
　60〜70年代のビンテージ品は20〜25万円
　定期的に発売される新品の復刻品も同程度の価格帯。
　プログラマーは1984の世界よろしく24時間表記でデータを扱います。
　そして避けられないのが24時間表記でのＵＴＣと日本時間+9hの変換です。
　パソコンのログは、使ったアプリ、作成されたファイルによってＵＴＣと日本時間+9hが混じり合い、時系列で把握するのが大変、ということがあります。
　海外とのやり取りがあるときも、どの時刻を基準に何時かを考えないと時系列が把握できません。
　そんなときオススメの時計がグリシンエアマンです。

　もともとGMT(グリニッジ標準時)と現地時間を把握する必要のあるパイロットに使いやすい時計を追求して作られ、ベトナム戦争のアメリカ空軍に人気だったこの時計。
　ベトナム時間とアメリカ時間だってすぐに把握できます。

　現時刻のGMTを把握するだけならロレックスのGMTマスターをはじめとする時計がたくさんあるのですが、この時計は文字盤が24時間表記で、24時間表記のベゼル付きなので、現時刻以外のGMTなども確認が容易です。
　文字盤を日本時間に、ベゼルをＵＴＣに合わせています。
![PXL_20230723_212352242~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/e67886b2-5cf6-70dc-70b1-d5fb63957bce.jpeg)
日本時間で6時のときはＵＴＣ21時(前日)
7時のときはＵＴＣ22時
8時のときはＵＴＣ23時
9時のときはＵＴＣ24[0]時
![PXL_20230723_212358229~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/2562b619-0f97-1f0d-0416-4f1de466381d.jpeg)
16時のときはＵＴＣ7時
17時のときはＵＴＣ8時
18時のときはＵＴＣ9時
19時のときはＵＴＣ10時
と、現時刻でないログ確認時にもＵＴＣ時間を確認可能です。
　ＵＴＣ時間と日本時間の切り替えに便利です。
　もちろん、第２時間帯をＵＴＣでなく取引のある国にすることもできます。

　なお、現時刻については時針の反対側の突起で12時間表記のPM時間も分かります。

# セイコー　ファーストモンスター　SEIKO SKX779
![PXL_20230723_104458085~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/76026a93-09c8-8963-514f-33a2e0275813.jpeg)
　本体だけでも約100グラム正規ブレスレットつけたら約200グラムのつけごたえ
　2000年代の中古品は約3万円
　新品は5〜7万円

　実務は泥臭く、全てのログがＮＴＰサーバーで時間が揃ってはいません。
　ネットワーク繋がってないスタンドアロンのパソコンやカメラがあるし、それぞれのパソコン、カメラで時間が違う、なんてことはしょっちゅうです。
　ログ精査、デジタル・フォレンジック、監視カメラ精査などは、秒ずれ、分ずれを実時間と比較して初めて時系列が作成できるのです。
　そこで、ダイバーズの経過時間表示ベゼルが役に立ちます。
　ダイバーズウォッチはボンベの残り時間を把握するために入水時からの分数を把握できる機能があるのですが、カウントダウン方式でなく経過時間表示のベゼルを使うことで、分ズレ、秒ずれをらくらく直すことができるのです。
　例えば監視カメラの時間が実時刻と10分ずれていて、実時刻=表示時間+10分のとき、文字盤の目盛を表示時間、ベゼルを実時刻に見立てて目盛を10分、反時計回りに回します
![PXL_20230723_104458085~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/5afec5ea-f1bd-97ef-1d9b-6189604e5cdd.jpeg)
表示時刻[文字盤]が20分なら実時刻[ベゼル]30分
表示時刻が13分のとき実時刻23分
表示時刻が50分のとき実時刻00分[次時]
表示時刻が33分のとき実時刻43分[数字に踏まれてる]

　というように分ずれ秒ずれをすぐに計算できます。
　数字に踏まれてるところもありますが、慣れると意外と読めるようになります。
　むしろ大きい数字が読みやすい。

　また、120クリックで目盛がカチッと合うのでフリーな回転ベゼルより合わせやすく、ベゼル脇にも線が入っていて、目盛が合っているか、ベゼル脇で確認することもできます。
　5分単位のズレならベゼルと本体の穴が合う
![PXL_20230723_104547799~2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/9dfa8d80-3363-4005-d68d-fa3cc8a9a3ca.jpeg)
　2目盛ずらすとベゼルと本体も2目盛ずれる
![PXL_20230723_212145818~3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622636/14c9e62b-012f-8424-6d89-52fb0aea7dbd.jpeg)
　緊急の対応を求められ、〇〇分で一旦進捗を報告するなんてときも使えます。そのようなときはクロノグラフの方がかっこいいですけどね。

# まとめ
　特に残業中や、一刻も早く時系列を作らないといけないときは、電卓を叩いたりエクセルで計算するのが面倒で、計器として腕時計を使えるとかなり楽になります。

　なお、私がベゼル好きなので内容は偏っています。
　皆さんの使っている腕時計、プログラマーやエンジニアに役立つ腕時計があれば教えてください。
Vanilla JS とは　...

## 結論
フレームワーク（JQuery等も含む）を一切使わないJS(JavaScript)のこと。
※Pure JavaScript のこと

## 余談
ゲームのマインクラフト（Minecraft）をする人は、よくご存じかと思うがMODを入れていない状態のことをVanillaという。

### どうでもいい話
どうしてこの記事を書いたかというと、Vanilla JSフレームワークが...的なのが検索に引っかかって時間無題にしたなと思い。そんな脱力感の中で・・・
【自分メモ】Udemy「【入門】システム要件定義と基本設計」のアウトプット1

## 背景
昨年から会社でWeb開発の手法を学んできましたが、開発技術面がある程度理解できてきたので、設計面での勉強を開始しました（開始させられました）。Udemy「【入門】システム要件定義と基本設計」を視聴して、理解したことをアウトプットしていこうと思います。

Udemyの講義はこちら
https://www.udemy.com/course/digisaku_requirements_definition_and_system_design/
## システム開発全体の流れ

会社や状況、チームによって流れは変わるかもしれませんが、大まかに以下の流れで進められます。

企画構想→要件定義→設計→実装→テスト→リリース→保守

システム開発と聞いてイメージしやすいプログラミングなどの開発作業は全体の3割程度であり、残りの5割以上は概要設計、基本設計などの設計部分（上流工程）に費やされることが多いです。

つまり、システム開発においては設計作業がとても重要なフェーズになります。設計作業ではユーザーからの要望をヒアリングなどで集め、それをシステムに反映させるための詳細な仕様の策定や、システムの機能や要件の明確化などが含まれます。

設計作業がしっかりと行われないと、「こんな機能いらない」「欲しかった機能がない」などのトラブルにつながる可能性があります。

## システム開発の関係者

大きくビジネス側とエンジニア側に分けられ、ビジネス側にはユーザーやPM、エンジニア側にはSEやPGが含まれます。

PMとSEが起点となり、リーダーとしてチームの舵取りを行います。

PMはユーザーからの要望を受け止め、それをシステムに反映させるための橋渡し役です。ユーザーからの要望を聞く→SEに伝えるという役割を担うため、正確に情報を伝えられないとユーザーが本当に求めているシステムを作り上げることができません。

SEやPGはシステムの設計や開発を担当するエンジニアです。ビジネス側の要望を的確に受け止め、それを機能として反映させることがエンジニア側の仕事です。

## システム開発が難しくなる要因

最も重要なのはPMの役割です。関係者の部分にも書きましたが、要望をSEにまる投げするだけでユーザーが本当に欲しいものがSEに伝わっていなかったり、PMの勝手な思い込みでSEに伝えたりするとシステム開発が劇的に難しくなります。

また、PM側の思い込みだけでなくエンジニア側も勝手な仕様変更や経験則から勝手に仕様を決めるなど暴走することも注意が必要となります。

システム開発が難航する要因は技術要素よりもその前段階に原因があることが多いです。目的やゴールを明確にし、目的と手段を分けてとらえ、改善目的を定義してから設計を行うのが望ましいです。

## まとめ

システム開発においては企画の時点で失敗する可能性が高いため、コミュニケーションを密にとることが大切です。
闘魂Mac ーー 新しいMacBook Proのセットアップで詰まったこと

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>

<b><font color="red">$\huge{闘魂とは己に打ち克つこと。}$</font></b>
<b><font color="red">$\huge{そして闘いを通じて己の魂を磨いていく}$</font></b>
<b><font color="red">$\huge{ことだと思います}$</font></b>

# はじめに

MacBook Pro 16インチ、2023を新調しました。  
Time Machineでホームディレクトリを[データ移行](https://support.apple.com/ja-jp/HT204350)したあとに各種ソフトウェアのインストールを進めようとしたとき詰まったことを書いておきます。  

https://github.com/TORIFUKUKaiou/qiita_articles

# Google 日本語入力がインストールできない

[Google 日本語入力](https://www.google.co.jp/ime/)をインストールできませんでした

https://support.google.com/gboard/thread/208195633/mac%E3%81%AEos%E3%82%92ventura%E3%81%AB%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89google%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82?hl=ja

[macのOSをVenturaにしてからGoogle日本語入力が使えません。](https://support.google.com/gboard/thread/208195633/mac%E3%81%AEos%E3%82%92ventura%E3%81%AB%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89google%E6%97%A5%E6%9C%AC%E8%AA%9E%E5%85%A5%E5%8A%9B%E3%81%8C%E4%BD%BF%E3%81%88%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82?hl=ja)

こちらの記事に助けてもらいました。
開発版をインストールすることで解消しました。

# docker command: not found

[Docker Desktop](https://www.docker.com/products/docker-desktop/)をインストールしました。  
ターミナルから`docker ps`とかってコマンドを打つと、`not found`と言われます。

これらの記事に助けてもらいました。

https://stackoverflow.com/questions/64009138/docker-command-not-found-when-running-on-mac

[Docker command not found when running on Mac](https://stackoverflow.com/questions/64009138/docker-command-not-found-when-running-on-mac)

https://zenn.dev/joo_hashi/articles/ffa50076261963

[Dockerコマンドが反応しない？](https://zenn.dev/joo_hashi/articles/ffa50076261963)

3通り解決策があります。  

1. ls -la ~/.docker/bin をしてみてシンボリックリンクができていたらパスを通す
2. dockerバイナリへのパスを通す
3. アンインストール（上部クジラアイコンをクリックしてTroubleshoot）してから再インストール

私は3でうまくいきました。  

1番はたとえば`~/.zprofile`にこんな感じです。  

```:~/.zprofile
export PATH="$HOME/.docker/bin:$PATH"
```

2番はたとえば`~/.zprofile`にこんな感じです。  

```:~/.zprofile
export PATH="$PATH:/Applications/Docker.app/Contents/Resources/bin/"
```


# さいごに

そのうち解消されることばかりだとはおもいますが、記録を残しておきます。  
MacBook Pro 16インチ、2023をセットアップ（セラップ）するに際して、[Google 日本語入力](https://www.google.co.jp/ime/)と[Docker](https://www.docker.com/)のインストールがスッといかなかった思い出を書いておきました。  

**元氣があればなんでもできる！** であります。



---

**闘魂**とは、  **「己に打ち克つこと。そして闘いを通じて己の魂を磨いていくことである」** との猪木さんの言葉をそのまま胸に刻み込んでいます。
知っているだけで終わらせることなく、実行する、断行する、一歩を踏み出すことを自らの行動で示していきたいとおもいます。
**アントニオ猪木さんのメッセージから元氣をもらったものとして、それを次代に語り継ぎ、自分自身が「闘魂」を体現するものでありたいとおもいます。**

---

<b><font color="red">$\huge{元氣ですかーーーーッ！！！}$</font></b>
<b><font color="red">$\huge{元氣があればなんでもできる！}$</font></b>
<b><font color="red">$\huge{１、２、３ ぁっダァー！}$</font></b>
shamrock:Linuxのディレクトリ構成

### :shamrock:Linuxのディレクトリ構成について
Linuxのディレクトリ構成は、様々なファイルやディレクトリが整然と配置されているシステムです。以下は、Linuxのよく使用するディレクトリ構成とその説明です。

**/ (ルート)**
Linuxファイルシステムの最上位にあるディレクトリ。すべてのファイルやディレクトリは、このルートディレクトリから始まります。

**/bin**
基本的なコマンドバイナリが保存されているディレクトリ。ls, cp などの基本コマンドがここにあります。

**/boot**
システム起動に関連するファイルが格納されている場所。カーネルや初期RAMディスクなどが格納されています。

**/dev**
デバイスファイルが格納されているディレクトリ。HDD、USBデバイス、キーボードなど、システム上のすべてのデバイスがこのディレクトリにファイルとして表現されます。

**/etc**
システム全体の設定ファイルやスクリプトが格納されているディレクトリ。

**/home**
ユーザーのホームディレクトリ。各ユーザーには/home/ユーザー名というディレクトリが割り当てられます。

**/lib, /lib64**
システムライブラリやモジュールが格納されているディレクトリ。

**/media**
一時的なマウントポイント、特にリムーバブルデバイス（USBデバイスなど）のマウントに使用されることが多い。

**/mnt**
一時的なファイルシステムのマウントポイントとして使用されるディレクトリ。

**/opt**
オプションのソフトウェアパッケージを格納するためのディレクトリ。

**/proc**
プロセスやシステム情報を扱う仮想的なファイルシステム。/proc以下のファイルやディレクトリは、実際の物理的なデータではなく、システム情報をリアルタイムで表示するためのものです。

**/root**
ルートユーザー（スーパーユーザー）のホームディレクトリ。

**/sbin**
システム管理用のコマンドバイナリが保存されているディレクトリ。

**/tmp**
一時ファイルを格納するディレクトリ。システム再起動時にこのディレクトリの内容は消去されます。

**/usr**
ユーザーレベルのアプリケーションとデータを格納するディレクトリ。

**/var**
システムのログファイルやデータベース、キャッシュなどの可変データを格納するディレクトリ。（再起動しても消去されない）

これらのディレクトリは、Linuxの標準的なファイルシステム階層標準（FHS: Filesystem Hierarchy Standard）に基づいています。実際のシステムやディストリビューションによって、追加のディレクトリや変更がある場合もあります。
【備忘録】VSCodeでlinter、formatterの設定をする自分用メモ（flake8、black、isort）

# 概要
題名の通り、VSCodeでlinter、formatterとしてflake8、black、isortを使用するための設定方法についての手順メモ。自分用メモなので間違っているかもしれない。

# 手順
## 前提
以下を前提とする：
* Python3系がインストール済み
* VSCodeがインストール済み
* VSCodeの拡張機能のPythonがインストール済み
* VSCodeの拡張機能のPylanceがインストール済み(拡張機能のPythonを入れると勝手に入ってるはず)
## flake8、blackのpipインストール
上記3つを使うためにとりあえず以下を実行してモジュールをインストールする：
```shell:flake8のインストール
pip install flake8
```
```shell:blackのインストール
pip install black
```
（本当はどちらも次のisortと同じく、VSCodeの拡張機能で入れるのが推奨っぽい）
## VSCodeの拡張機能でisortを入れる
VSCodeの「拡張機能」を開き、検索窓から「isort」を検索してisortをインストールする。
## settings.jsonへ設定を記載
まず、左下の歯車マークをクリック→設定を選択し、右上の方にある「紙をひっくり返す？」的なマークをクリックしてsettings.jsonを開く。
そして開いたsettings.jsonに次を追記する：
```json:settings.jsonへの追記事項
{
    "python.linting.enabled": true,
    "python.linting.pylintEnabled": false,
    "python.linting.flake8Enabled": true,
    "python.formatting.provider": "black",
    "editor.defaultFormatter": null,
    "editor.formatOnSave": true
}
```
これである程度PEP8に沿ってプログラミングを進めていける（はず）
Nuxt Vue3 Inputで選択した画像を表示する

# Input type="file"から画像を表示する
プログラミン初心者です。
間違ってたらごめんね

```vuejs
<script setup lang="ts">
// imageの値を変更できるようにする(ref)
const image = ref<string>("")

// v-onで使う関数
const upladFile = (e: any) => {
  // file情報取得
  const file = e.target.files[0]
  // 取得したファイル情報を 
  // (createObjectURL)の引数に入れることでファイルにアクセス可能な
  // (URL)を作成することができます
  const url = URL.createObjectURL(file)
  // (url)をimageに代入する
  image.value = url
}
// 画像を消す
const deleteFile = () => {
  image.value = ""
}
</script>
```

v-modelは使えないのでchangeイベントを使う
```vuejs
<template>
    <div>
      <input type="file" @change="upladFile"/>
    </div>
    <!-- 画像を表示する -->
    <div>
        <img src="image">
    </div>
</template>
```
[人要らず]ChatGPTを使った一人議論やってますか？

## はじめに

今回は私が良くやっている「一人議論」という方法について紹介いたします。
これはアイデア出しや壁打ちに便利な手法です。
「使えるかも」と思った方は、ぜひやってみてください。


## 一人議論とは？

ChatGPTを使った議論のシミュレーションの一つです。
具体的には次のようなプロンプトを利用して行います。

```markdown
# タスク
テーマについて議論してください。

# ルール
- 登場人物を3人出してください。
- 議論をまとめないでください。
- 10回会話を続けたところで会話を止めてください。

# テーマ
ChatGPTがもたらしたもの
```


すると、次のような議論が始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/40729196-b796-fbbd-e98c-17ee1c47bce4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/b316af2d-19c2-86ff-b90f-cfa42d6be1bb.png)



ここからが**一人議論のポイント**です。
次に、自分の意見を差し込みます。

ChatGPTにて次のような文章を打ち込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/0aaf7362-f707-18f8-f8e7-c5775789cda0.png)


すると、それを元に、次のような会話が続きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/551316/f1d2810b-32b9-46ca-5b62-bcca0296774b.png)



あとはひたすらこれを続けるだけです。

強めの反論をしても誰も怒りませんし、自分の話したいテーマを選択できるので非常に便利です。

## まとめ

今回は一人議論について説明させていただきました。

今後は、何か議論したいときはChatGPTを使って議論することが可能ですね！

## 紹介

その他にもこんな記事を書いています。

よかったら見ていってください。

https://qiita.com/Gamari0009/items/a7de53514504ea99db7d

https://qiita.com/Gamari0009/items/c21f3fa8fb18794e3d00

https://qiita.com/Gamari0009/items/71984915068b1ca93238


## 補足（8/15）

沢山の反応ありがとうございます！

反応の中では、どうもGPT3.5では会話をまとめたり、話が続けられない事象が見受けられます。

次のようなプロンプトを試してみてください。

```
# タスク
テーマについて議論してください。

# ルール
- 登場人物を3人出してください。
- 時間制限は無いため、会話をまとめようとしないでください。
- 会話は中途半端で止めて、最後に（続く）と書いてください。

# テーマ
美味しい浅漬けの作り方
```

比較的、3.5でも会話をまとめずに継続することが可能です。
Webの発展と今後への期待

## Webの概念
　Webとは、インターネット上で情報を検索したり共有したりすることができる大幅な空間を意味します。Webは様々情報がリンクに繋がるハイパーリンクシステムとして誕生しました。

　こういう仕組みのWebは、素早く発展して全世界の人々にテキスト、イメージ、映像などのメディアを無限提供していて、ビジネスや教育などの分野で幅広く活用されています。

　この度は我がの日常に欠かせないWebの進化についてお話ししようと思います。
## Webの発展と世代別特徴
### Web1.0
:bulb:KeyWord **静的ページ、Only Read**
　
　1990年代前半から2000年代中盤まではWeb1.0の時代でした。HP（HomePage）やECサイトなど、管理者がユーザーへ一方的に情報を与える形態でした。
 
　JSとかCSSとかの言語が充実されてない為、視覚的な要素が非常に基礎的でありデータの制御及びインタラクティブな機能が足りてなかったのです。そこで、Wikipediaのように、情報提供のみを目的とするWebページが大体で、ユーザーは読み取りのみにした一方的なコンテンツを利用しました。
### Web2.0
:bulb:KeyWord **動的ページ、クラウド、インタラクティブ、ソーシャルメディア、Read＆Write**
　
　Web2.0は2000年代中盤から現在にかけているWebの形態です。TwitterやInstagramなど、様々なソーシャルメディアが登場しはじめることにより、ユーザーたちはコンテンツをもっと活発に共有し相互作用できる環境に発展しています。以前のWeb1.0では、ユーザーが情報を一方的に得ていたんですが、Web2.0になってからはユーザーが直接コンテンツを生成することができます。（CGM；Comsumer Generated Media）
　
　こういうコンテンツはある管理者により管理されてます。画像は「Instagram」に、短い映像は「TikTok」に、キャリア関連投稿は「LinkedIn」に代表するように私たちが作っている全てのデータらは一つの場所（サーバー）に集まり、私たちがアクセスできないデータベースに保存されてます。
　
　このデータベースを管理する大企業は、ユーザーが作ったデータを活用してB2BまたはB2Cとして商業化しています。ユーザーの個人情報を収集してまた他のユーザーたちにコンテンツを提供するということです。よってWeb2.0は、個人情報が敏感に扱われ、管理者が勝手に検閲しないはずだとの信頼を与えることが非常に大切になります。

### Web3.0
:bulb:KeyWord **分散コンピューティング（脱中央）、ブロックチェーン、個人所有権、収益化**

　Web3.0は、Dr.Gavin Woodが考案して概念です。ユーザー経験の向上と人工知能及び大規模データ分析技術を活用することで、Webをより知能的で個人化された環境に発展することを目指しています。しかし、現在完璧に存在していると言えません。

　各種データが中央集権として管理されるWeb2.0と違って、Web3.0は脱中央、つまり分散コンピューティングによって扱われます。一つのサーバーがホスティングすることではなくて分散ネットワークによりデータが保存されるとのことです。この仕組みによって信頼の大切さが感じられなくなり個人情報保護をより強めることができます。

　こういう技術によって管理者不在というネットワークが作られます（脱中央≒分散コンピューティング≒管理者不在）。これはデータ管理者と所有者との関係性が著しく変わるようになります。現在はAmazonのようなプラットフォームにて売買が行われるので管理者に依存してますが、管理者のないWeb3.0では各端末にてデータを監視しNFTというのを所有することになります。ログイン情報などのデータ管理はユーザーの責任になるとのことです。

## Webユーザーの新しい期待と要望
　今もWebは早く変わっていて、いつも通り想像以上のサービスがどんどんできていくはずです。ある時は私の検索キーワードが保存され、閲覧するサイトごとに表示される広告バナーを見ていたら誰から後を追われていると気持ち悪くなることもありますが、ユーザーの要望を早めに満たしてくれるのがWebでもあります。

　私たちは、一日中大量の情報を受け入れています。その理由で自分で価値判断をするより他人による選択から信頼を築き上げ、情報取得と消費活動に大きな影響を与えられます。そのほど間違っている情報を疑い自分で正しさを判断すべきです。そしてユーザーたちは最近起こったFacebookの個人情報漏えいといったサイバー攻撃の恐れを感じもっと高いレベルのセキュリティを求めることになります。
　
　Webはこういう問題点を補うシステムを導入することでもっと創造的なWebを実現することができると思います。
クリーンアーキテクチャの基本

# 参考
マーティン.C.ロバーツさんのブログをもとに、学んだことをまとめます。
https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html

# クリーンアーキテクチャとは
クリーンアーキテクチャは、関心の分離を実現し、依存関係のコントロールをするためのアーキテクチャ。
アプリケーションの構造をレイヤーに分けて、役割の違うソースを一緒にしないことで管理しやすくする考え方。
円(ブログ参照)の内側へ進むほど、重要度が上がっていく。
そのため、依存関係も常に外側から内側へと向かう。
内側の層が外側の層に依存してはいけない。

### 1.Frameworks and Drivers
webとか、DBとか、アプリケーションの外部に当たる部分の実装。
（フレームワークがここ、というのはちょっと違和感があるけど、フレームワークがあまりアーキテクチャに対応していなかった時代なのかもしれない）


### 2.Interface Adapters
外側のレイヤーと内側のレイヤーの通信を行う部分。
外側のレイヤーからデータを受け取って、より内部のレイヤーにとって便利な形に整形して渡す、あるいは、内部のレイヤーからデータを受け取って、外部のレイヤーに渡す。
データの変換、ビジネスロジックの呼び出しを行うレイヤー。

### 3.Use Cases
アプリケーション特有のビジネスロジックを記載する。
よく混同しがちだが、ここには対象業務のビジネスロジックは記載しない。
アプリケーションがなければ存在しないようなビジネスロジックを記載する。
アプリケーションに依存しないビジネスロジックは、もっと内側のレイヤーになる。

### 4.Entity
業務特有のビジネスロジックを記載する。
あるいは、業務のない、シンプルなアプリケーションの場合は、アプリケーションのビジネスロジックを書く場所にもなる。

4つ以外にレイヤーを持ってもいいが、依存関係は常に外から内にすること。

# まとめ
一番大事なのは、業務特有のビジネスロジックと、アプリケーション特有のビジネスロジックを分けること、そして、重要な部分が、より重要でない部分に依存しないようにすること。
入力値の整形をどこでするかとか、バリデーションをどこでするか、みたいなことは必要に応じてされていればどこでしてもいいと思う。
AndroidStudioで電卓作ってみる

私は基本的にWeb側を触っているため、
アプリ開発などを業務でしたことはないのですが、
何かアプリを作ってみたいということで
手始めに電卓を作ってみようと思います。

電卓は計算式も単純なためお勧めらしいです。
とりあえずAndroidStudioを自宅PCにインスコ！

めっちゃ重い・・・

でも負けません。


～導入～

とりあえず空のプロジェクトを作成したうえで
動作環境はAndroid7で設定。
googleplay対応のpixelの環境をまず作っていく。
（ここも重い）
Javaの動作環境SDKなどは自動でやってくれるので
放置でOK（長い）

～方針～

AndroidStudioではHtml的な部分を資格的に作成できるので
まずはレイアウトを作成。
CSSなどを整えたうえで、
各ボタンアクション（今回であれば計算）を実装していく

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1316547/e848b40c-9ba9-b5a4-1d88-dd8f93f2f0b0.png)


すると大体上のような感じで画面が作成される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1316547/7e736e96-2ff0-8f02-c8e2-f1da09c4a1d6.png)

html、cssに関しては視覚的に設定が可能なため、
コードを打つ必要はさほどなく、細かな調整のみで手打ちで必要となる。
※キーなど

次回はその細かな調整に関して実施していく
【SwiftUI】画像を丸くクリッピングする

# こんな感じにしたい
![simulator_screenshot_3020C2F7-B580-453C-946A-EFEB2362348D.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1745371/2f20a026-2603-3000-85ed-e336b49bc16d.png)

# 実装
```diff_swift
import SwiftUI

struct ContentView: View {
    var body: some View {
        Image("sample")
            .resizable()
            .scaledToFit()
            .frame(width: 100)
+           .clipShape(Circle())
    }
}
```

# おわり
1行だけでできるの便利ですね
【論文読み】LightGBMを用いた不動産投資における高精度価格推定モデルの構築

## はじめに
こんにちは。論文を読んだ結果の紹介記事です。  
今回紹介するのは、「LightGBMを用いた不動産投資における高精度価格推定モデルの構築」という論文です。  

- タイトル： 【論文読み】LightGBMを用いた不動産投資における高精度価格推定モデルの構築
- 出典： 李 天琦, et al.; 人工知能学会 2020    
- URL： https://www.jstage.jst.go.jp/article/pjsai/JSAI2020/0/JSAI2020_3Rin449/_pdf/-char/ja


## 概要
マンションブランド名や地理要因の緯度経度情報を考慮し、価格推定モデルに組み入れる事で精度向上を実現した。


## 特徴
- LightGBMを使用
- feature interactionで特徴量を追加（既存の特徴量の交互作用によって新しい特徴量を作成）
- Geocoding APIで緯度経度の情報を追加
- マンションブランド名でフラグを立てる
- SHAP valueでの予測への影響の産出
- 重要特徴量の上位は、専有面積、築年、間取り、所在地、駅など


## 想定される適用例
- 不動産価格の予測


## 参考
- [LightGBMを用いた不動産投資における高精度価格推定モデルの構築](https://www.jstage.jst.go.jp/article/pjsai/JSAI2020/0/JSAI2020_3Rin449/_pdf/-char/ja)
Arduino UNO R4 Minimaの速度検証

今年の6月末ごろにArduino Unoの新型となるR4 Minima/WiFiがリリースされ、先日Minimaを大阪日本橋の[シリコンハウス](https://eleshop.jp/shop/default.aspx)で入手しました(3200円ぐらい)。従来ではATMega328Pを搭載してましたが、今回はルネサスのRA4M1というマイコンに変更され大幅に機能が強化されました。HIDサポートやメモリ増加、DAC搭載などいろいろありますが今回は動作クロックが16MHｚから48MHzへとなり、動作が3倍に高速化されました。そこでこの記事では`digitalWrite`、`digitalRead`、`analogRead`の速度を検証します。

# R3での検証
[garretlabさんのR3の検証記事](https://garretlab.web.fc2.com/arduino/lab/performance_io/)を参照ください。そちらではdigitalReadが3.52~4.97us、digitalWriteが3.14~4.59us、analogReadが112usとのことでした。

# R4での検証
## 検証方法
R3と比較するため上記内に記載されている検証コードを基本改変せずに使用。RESETボタンでの再起動で2回検証。開発環境はArduinoIDE 2.1.1です。

```C++
const int repeat = 10000;
 
void measure(int pin) {
  long begin, end;
  volatile int val;
   
  Serial.print("Pin No.: ");
  Serial.println(pin);
 
// digitalRead()
  pinMode(pin, INPUT);
  delay(3000);//0ピンの結果を表示するため待機時間を変更
  begin = micros();
  for(int i = 0; i < repeat; i++) {
    val = digitalRead(pin);
  }
  end = micros();
   
  Serial.print("  digitalRead:    ");
  Serial.println((end - begin) / (float)repeat);
 
// digitalWrite()
  pinMode(pin, OUTPUT);
  delay(1000);
  begin = micros();
  for(int i = 0; i < repeat; i++) {
    digitalWrite(pin, HIGH);
  }
  end = micros();
   
  Serial.print("  digitalWrite:   ");
  Serial.println((end - begin) / (float)repeat);
   
// analogRead()
  if ((pin >= A0) && (pin <= A5)) {
    val = analogRead(pin);
    begin = micros();
    for(int i = 0; i < repeat; i++) {
      val = analogRead(pin);
    }
    end = micros();
   
    Serial.print("  analogRead:   ");
    Serial.println((end - begin) / (float)repeat); 
  }
   
  Serial.println();
}
   
void setup () {
  int pin;
   
  Serial.begin(9600);
  for(pin = 0; pin < 20; pin++) {
    measure(pin);
  }
}
 
void loop () {
}
```

## 検証結果

**私の持っているR4Minima**(純正)では`digitalRead`が**1.13us**、`digitalWrite`が**0.75us**、`analogRead`が**26.01us**となりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286973/0730cecb-35bc-5b41-bc57-501f80c2e005.png)

digitalReadでは約3.1～4.4倍、digitalWriteでは約4.2～6.6倍、analogReadでは約3.5～5.2倍で動作するようになりました。

しかし、A0からA5まで処理時間が増加しているのが気になります。そこでA5からA0への逆向きで再び2回測定。
結果は2回とも共通でした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286973/3132beae-0a32-5c55-2b4f-f412831370af.png)

25us前後という結果となりました。(digitalRead/Writeは変わらず)

# まとめ
R4 MinimaではIO周りでは速度が3~6倍になりました。またデジタルピンはR3で見られたピンごとの速度のばらつきがなくなり、全ピンで速度はほとんど一定となりました。(どこかの記事で見た全ピンがPWM対応になったのが影響？)またanalogReadは実行方法で変動があるようです。
また結果の項で書きませんでしたが、setup内のSerial.beginの後に2msのdelayを入れたところdigitalReadが1.17us、digitalWriteが0.84usへとやや遅くなりました。analogReadは変わりませんでした。

## 追加検証したいこと
ピンの順番をランダムにするなどしてanalogReadの処理時間がどう変化するか、前後の処理で各処理時間がどう変動するか。またIDEの更新に伴う影響があったか。

みなさんの追走や疑問などのコメントお待ちしております。
echoの出力にタブ(¥t)を加えようとしたら上手くいかなかった、、、と思ったら、`-e`を付ければOKのようだった際のメモ

echoの出力にタブ(¥t)を加えようとしたら上手くいかなかった、、、

```bash
$ echo "aaa\tbbb"
aaa\tbbb
```

と思ったら、`-e`を付ければOKのようだった。

```bash
$ echo -e "aaa\tbbb"
aaa	bbb
```

これでOK

# 参考

[echoで表示する内容にタブ](https://tech.withsin.net/2018/03/28/echo-e/)
SwiftUIでリストの要素を横スライドで削除する方法

現在SwiftUIを勉強中なので、さまざまなUIを実装しています。
今回は、SwiftUIでリストの要素を横スライドで削除する実装をしてみました。

Xcode Version 14.2

```EditListView.swift

struct EditListView: View {
    @State private var tee = ["緑茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶", "烏龍茶", "ほうじ茶", "ジャスミン茶", "麦茶"]
    
    var body: some View {
        VStack(spacing: 0) {
            Divider().background(Color.brown).padding(.top, 10)
            List {
                ForEach(tee, id: \.self) { tee in
                        VStack(alignment: .center ,spacing: 0) {
                            Text(tee)
                                .font(.system(size: 16))
                                .frame(maxWidth: .infinity, alignment: .leading)
                        }.listRowInsets(EdgeInsets())
                }
                .onDelete(perform: remove)
            }
            .listStyle(PlainListStyle())
        }
    }
    
    /// 行削除処理
    func remove(index: IndexSet) {
        tee.remove(atOffsets: index)
    }
}

```

スライドで削除する処理はこちらになります。

```.swift
func remove(index: IndexSet) {
    tee.remove(atOffsets: index)
}
```

リストに削除機能を実装するには
`.onDelete(perform: remove)`
を設定してあげる必要があるみたいです。

![スクリーンショット 2023-08-06 21.29.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/274615/ea51d355-2190-a8f2-82ef-e7d7e8931c76.png)

以上です。
docker exec -it xxx bach のようにインタラクティブオプションをつけて実行/つけないで実行した際の環境変数の違いメモ

docker exec -it xxx bach のようにインタラクティブオプションをつけて実行/つけないで実行した際の環境変数の違いメモ

具体的には、
`docker exec -it ${ContainerName} bash` のように`-it(インタラクティブオプション)`をつけてから`env`を実行した時と、
`docker exec ${ContainerName} bash -c env`のように`-it(インタラクティブオプション)`をつけずに`env`を実行した時では、環境変数の適用度合いが異なってので何が違うんだろうと思った際のメモ

# 結論

以下のように`bash`起動時の設定を読み込まれるかどうかが環境変数差分に繋がっている様子だった（他にもあるかもしれません）

> https://www.wakuwakubank.com/posts/389-linux-bashrc/#index_id4

> ログイン時に読み込まれる設定ファイル
読込順	ファイル	概要
1	/etc/profile	システムの全ユーザーに適用されます。
2	~/.bash_profile
~/.bash_login
~/.profile	上のファイルがなければ下のファイルを読み込みます。
ログイン時のみ読み込ませたい設定を記述します。
3	~/.bashrc	bash起動の度に読み込ませたい設定を記述します。
4	/etc/bashrc	システム全体の関数、エイリアスの設定が記述されています。

これで大体、環境変数の違いが解消された（他にもあるかもしれません）

# 参考

https://www.wakuwakubank.com/posts/389-linux-bashrc/#index_id4
jar war ear

開発（実装）エンジニアとして20年ほどやってきて、デプロイや本番環境にかかわる機会が
ほとんどなかったです。
なので、jarとかwarとか言われても、圧縮されて纏まられてんだとって感じでしかありませんでした。

https://qiita.com/fusassy/items/31b8840878e371479ed1

こことかを読んで学んでみました。


# 違い

違いを簡単にまとめると

- いずれもJava仕様準拠定義のzip形式パッケージ
- Javaプログラムを実行・配布しやすくするための形式
- 規模感は、ear > war > jar
- 拡張子をzipに変更すると解凍ツールで開ける


# 作成方法

eclipseを利用するとわりと簡単そうです。

プロジェクト右クリックしてエクスポートで簡単にできそうです。
そこで、war、eat、jarを選択すれば。
卒業制作（ポートフォリオ）

## 初めての達成感
どうも４０代オッサンですｗ何とか冷房がない中で生きてますｗｗ
さて今回の記事は卒業作品（ポートフォリオ）を作ってみての感想と。。
少し話題になったＧＰＴ（ＡＩ）ついてです。

## 今回作成しようとしたもの
簡潔に言えば「ログイン機能付きのＢＢＳ（掲示板）」に音声機能を足した物です。
## 今回使った機能
・**FLASK**
・**HTML**
・**CSS**
・**JS**
・**MP3**（音声ファイル）
・**MONGODB**（データ保存に）
・**ChatGPT**
## 機能面での主な補足としては
### FLASK
**ログイン機能**（新規登録やログアウト機能込みで）
**テンプレート機能**（HTMLの表示指定やHTML側にデータを渡したり）
## JS,MP3
**JS**（音声をリストにしたものをランダムに受け取る）
**MP3**（音声の圧縮？したもの、比較的に扱いやすい）
## ChatGPT
僕自身のスキルが低いのと理解力が弱く
納期も短かったので今回使ってみました。
結論から言えば**有能です**有料ではありますがデータのアップロードして
読み取って貰いコメント機能で解説してもらたり。
実際にコードを書いてもらったり凄い助かりました。
**注意点**
・AIが書いてくれるコードはあくまで**基本**だけです
　なので実際の環境に合わせたパスは自分で書かないといけない
・AIは聞かれたことしか答えません、なので１～１０まで何でもやってくれる
　分けではないです。
・一定の年までしか学習を終えていないので、その後の事
　（コード、ニュース含め）は基本的に答えれない可能性がある。
・毎回回答が違う事もある（特にコード）
なのでお互いに高めあう良きライバル（友）感覚で使うのが一番かなと思っています。

## 作った背景
今回、個人のVの方やココ〇〇等から声のお仕事の人に依頼をしたりして
この方々は基本的に「**声**」で人を引き付ける（個人的な感想です）と思っているので
この特性をいかして何か変わるのかを知りたく作成しました（シンプルですが）
理想としては反応が返ってくる（音声）ことによってモチベーションが上ればなと
その結果次第では「学習の継続」や「継続的な検査（血統測定など）の継続」にいかせればな
と思っています。
## 反省点
・無理してFLASKにこだわる必要はなかった。
・僕自身の知識が低いため選択肢が少なかった。
・基礎知識が足りなかった。具体的には
　・ブラウザーのガイドライン知識
　・ログイン機能のデリケートさ
## まとめ
今回AIの力を借りましたが、０から自分の思いを「**形**」に出来た経験は
私の中で大きな成長の一歩となりました。
スクール関係者の皆様ならびに二期生の皆様、先輩方
短い間ではありましたが**お世話になりました**
またこのスクールで会える事を楽しみにしています🎵。
Salesforceのカスタムオブジェクトでリストビューボタンや検索レイアウトが表示されない場合解決方法

こんにちは


標準オブジェクトでは
オブジェクトマネージャーから
・検索レイアウト
・リストビューボタンレイアウト
の表示がされています
![b-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/a7ddcbb5-7aa3-71e1-2afd-0706234327a8.png)


しかし、カスタムオブジェクトでは設定により

・検索レイアウト
・リストビューボタンレイアウト
の表示がされていないです

![ｂ－０２.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/2b9a753c-4e08-6988-bc40-8c9956620a63.png)

カスタムオブジェクトに
・検索レイアウト
・リストビューボタンレイアウト
を表示させたい場合、詳細から「検索条件」に「検索許可」に☑をつけて保存をすれば
カスタムオブジェクトで

・検索レイアウト
・リストビューボタンレイアウト
の表示が可能です

![ｂ－０３.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/da2fed08-24dc-6c1c-90c7-e3545b8882c5.png)
【Rails】deviseで使用できるヘルパーメソッド

## はじめに
deviseはユーザー認証機能を簡単に実装できるgemです。
導入後、便利なヘルパーメソッドを使用できるので頻用するものを紹介していきます。

## RubyとRailsのバージョン
- Ruby 2.7.7
- Rails 6.0.6.1

## deviseで使用できるヘルパーメソッド一覧
```
before_action :authenticate_user!
# コントローラーの先頭に記述。サインインユーザーのみ実行できるように制限出来る。

user_signed_in? 
# ユーザーがサインインしているかどうかを確認。

current_user 
# 現在サインインしているユーザーを指定出来る。
```
※deviseのmodelが「user」であると仮定します。
それ以外の場合は「user」部分を対応するmodel名に変更して下さい。

### before_action :authenticate_user!
コントローラーの先頭に記述します。ログインンユーザーのみ実行出来るアクションを指定できます。
下記コードでは「new」「create」はログインユーザーのみ実行可能、それ以外ではログイン画面に遷移させる事が出来ます。
onlyを使用しなければ全てのアクションに対してログインを要求する事になります。
``` ruby:posts_controller.rb
class PostsController < ApplicationController
  before_action :authenticate_user!, only: %i[new create]
end
```

### user_signed_in? 
コントローラーやビューで使用し、ログインしているユーザーかどうか確認します。
下記はログインしているユーザーであれば新規投稿のリンクを表示、未ログインであれば投稿出来ないように制御しています。

```ruby:index.html.haml
- if user_signed_in? 
  = link_to '新規投稿' new_post_path
```


### current_user 
現在ログインしているユーザーの情報を取得出来ます。
``` ruby:posts_controller.rb 
#一部省略

def index
# 現在ログインしているユーザーの情報を取得して表示する処理
  @user = current_user

# 現在ログインしているユーザーの投稿情報を取得する処理
  @posts = current_user.Post
end
```


## 最後に
忘備録としてまとめました。現在転職目指して勉強中です。
間違いがあればご指摘いただければ幸いです。


## 参考文献
https://github.com/heartcombo/devise#starting-with-rails


https://qiita.com/tobita0000/items/866de191635e6d74e392
deviseの導入の仕方

# deviseとは
Railsにおいて、ユーザー認証機能を簡単に実装できるgemのこと
gemはRubyのライブラリで、便利な機能をもったプログラムの部品です

# deviseの導入
まずは、gemのインストールをします
Gemfileに以下を追加します
```ruby:Gemfile
gem 'devise'
```
# セットアップ
deviseをセットアップするには、以下の３つのコマンドを実行します

1つ目のコマンドで、railsアプリにdeviseをインストールします
```command
$ rails generate devise:install
```

2つ目のコマンドで、ユーザー情報を扱うモデルを作成します
なお、モデル名はUserにしています
```command
$ rails generate devise User
```

3つ目のコマンドで、migrationファイルを読み込み、変更点をデータベースに反映させます
```command
$ rails db:migrate
```
ソフトウェア事業に中間管理職は要らない

ソフトウェア事業を、交響楽団にみたてて、いかに中間管理職が要らないかを記述しようとしてみる。　

失敗は、多くの中間管理職の存在である。　

ほうれんそうが、機能していない場合に、中間管理職をなくしたら機能しはじめたというのが本文の流れである。　

プログラマの「日報、週報、月報、年報」考。仮説(73)

https://qiita.com/kaizen_nagoya/items/97ad8ac9217c12c3bb69

 ＜この記事は書きかけです。順次追記します。＞
 This article is not completed. I will add some words in order.
# 交響楽団　
交響楽団には、指揮者と演奏家がいる。　

組織の中には、音響・録音技術者などの機材担当、給料支払いなどの事務担当など、他にも大勢人がいるかもしれない。　これらの人々は、ここでいう中間管理職ではない。　それぞれに、固有の仕事を持ち、自分のためにも、組織のためにも、社会のために働いている。　


プログラムは音楽だ (A program is a music.) 仮説（54）

https://qiita.com/kaizen_nagoya/items/33c9f33581e6886f8ad8

指揮者は、すべての団員の技術について、音で確認している。　

報告書が要るわけではない。　

プログラムの事業管理者が、全員のソースコードをまとめてビルドしたときに、誰のソースコードと、誰のソースコードが、不協和音のような警告を出したかを確認している。

報告書が要るわけではない。　

にもかかわらず、不要な報告を集め、あたかもなにかをしているようなふりをしながら、　
プログラミングの生産性を下げるのに貢献している人が要るのだろうか。　

一人一人のプログラマだと孤立するかもしれないという心配は要らないかもしれない。　

交響楽団と同じように、第一奏者がいればいい。　
第一奏者の音を聞きながら、自分も演奏すればいい。　

Part練習も、第一奏者が管理者である必要はない。　
練習の手本になることはあっても、指示をしなくてはいけないわけではない。　

プログラマも同様だ。プログラマに指示は要らない。

# 交響楽団より先に

指揮者が、編曲者であったり、作曲者であるのが、ソフトウェア事業だろう。　

指揮者は、指揮するだけではなく、新しいソフトウェアの作曲をする用事が半分くらいあるだろう。場合によっては、編曲相当の編集だけでいいことがあるかもしれない。Webサイトの別の会社名に差し替えるだけのような。　

指揮者とは別に作曲者が必要になることもあるだろう。　

作曲、編曲班だ。　
中間管理職が要らないことに変わりはない。　


 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong. 


# 文書履歴(document history)
ver. 0.01 初稿　　20230814

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.









 ＜この記事は個人の過去の経験に基づく個人の感想です。現在所属する組織、業務とは関係がありません。＞
This article is an individual impression based on the individual's experience. It has nothing to do with the organization or business to which I currently belong. 


# 文書履歴(document history)
ver. 0.01 初稿　　20230814
ver. 0.02 ありがとう追記　　20230814

### 最後までおよみいただきありがとうございました。

いいね　💚、フォローをお願いします。

####  Thank you very much for reading to the last sentence.

Please press the like icon 💚　and follow me for your happy life.
リファクタリングをする際の考慮点

# はじめに
こんばんは、ponponnsanです。朝活をしていたらほぼリモートになっています。運動不足が課題ですね。。。

さて、今回は、「良いコード悪いコード」という本を読んだので、その時個人的に大事だと思ったことをまとめていこうと思います。

リファクタリングは業務でもあまり担当になったことがありませんでした。新卒2年目にして少し触れる機会があり、私将来やるんだろうなぁという漠然とした予測から書いています。

参考文献のリンクは以下です。

https://www.amazon.co.jp/%E8%89%AF%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89-%E6%82%AA%E3%81%84%E3%82%B3%E3%83%BC%E3%83%89%E3%81%A7%E5%AD%A6%E3%81%B6%E8%A8%AD%E8%A8%88%E5%85%A5%E9%96%80-%E2%80%95%E4%BF%9D%E5%AE%88%E3%81%97%E3%82%84%E3%81%99%E3%81%84-%E6%88%90%E9%95%B7%E3%81%97%E7%B6%9A%E3%81%91%E3%82%8B%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E6%9B%B8%E3%81%8D%E6%96%B9-%E4%BB%99%E5%A1%B2/dp/4297127830


# 個人的まとめ

### 1. コードの品質と整合性
**関数と変数の命名**: わかりやすい名前の関数を作成、具体的で動詞1単語ですむメソッドを設計する。
**クラスの設計**: 強く関係あるデータとロジックはクラスに。クラス自身も単体で正常動作するように設計する。
**例外処理**: 関数内に例外も書く。
**独自の型の使用**: コンパイルエラーを避けるために独自の型を用いる。
### 2. オブジェクト指向の原則
**完全コンストラクタ**: 不正状態から防御し、初期化できるだけの情報を持つ。
**値オブジェクト**: 値をクラスとして設計。全額、日付、注文数などをクラス化。
**変数の取り扱い**: 変数は不変に。可変にするのはパフォーマンス向上など特別な理由がある場合のみ。
### 3. コードの効率と可読性
**引数の取り扱い**: 引数は入力値として扱う、出力値としては扱わない。
**プリミティブ型の使用**: 強く関係するコードとロジックを凝集するためには避ける。
**関数とクラスの責任範囲**: 引数が多すぎないようにし、詳細はロジックは呼ばれる側に実装。
### 4. クラスとフォルダ構造
**クラスの責任**: クラスが担う責任は1つに限定。100-200行程度になるように。
**公開範囲**: Publicはすべてのクラスからアクセス可能、基本的にはPrivate。
**フォルダ構成**: ビジネス概念として強く関係し合うもの同士を一緒にする。
### 5. エラー処理とセキュリティ
**nullの取り扱い**: null自体は無効な扱いで、メモリアクセストラブルを防止。
**マジックナンバー**: ロジック内に直接ハードコーディングする数字は避ける。
**問題検出時のエラー文**: 必ず書く。

### 6.名前を設計する際の注意点

*  可能な限り具体的で、意味範囲が狭い、特化した名前を選ぶ
*  存在ベースではなく、目的ベースで名前を考える
*  どんな関心事があるか分析する
*  声に出して話してみる
*  利用規約を読んでみる
* 違う名前に置き換えられないか検討す
* 目的以外のロジックが混入しそうなら、名前を見直す。他のクラスと幾つ関連づけられているか個数を確認する。何個もあるのは良くない。影響範囲が大幅なため。

### 7.コメントルール

| ルール | 理由 |
| ---- | ---- |
| ロジック変更時、同時にコメントも変更すること | ロジックと乖離したコメントが生じてしまう。読み手が混乱するから。 |
| ロジックの内容をなぞるだけのコメントをしないこと | 可読性がない。|
| 補足説明するようなコメントをしないこと。代わりにロジックの可読性を高めること | コメントのメンテが必要になる。 |
| ロジックの意図や仕様変更時の注意点をコメントすること。 | 保守や仕様変更の助けになる。 |
| 入力と出力、例外の引数とそれが何をするのか書くこと。 | 読み手が他のファイルを見なくても済むようになる。 |
	
	

#### プリミティブ型とは...
プリミティブ型（primitive type）とは、プログラミング言語において、最も基本的なデータ型のことを指します。これらの型は、言語自体に組み込まれており、より複雑なデータ構造を構築する基盤となります。
以下は、一般的なプリミティブ型の例です：

**整数型（int）**: 整数を表すための型で、プラス・マイナスの整数値を取ることができます。
**浮動小数点型（float）**: 小数点以下の値を持つ数値を表す型です。
**文字型（char）**: 単一の文字を表す型です。
**真偽値型（boolean）**: 真または偽の値を取る型で、条件文や論理演算によく使用されます。
プリミティブ型は非常に効率的で、メモリや計算リソースの消費が少ないため、パフォーマンスが重視される場合に使用されます。しかし、プリミティブ型だけを使うと、コードが不明確になることもあります。より具体的な概念やビジネスロジックを表現するために、オブジェクト指向プログラミングではクラスや構造体などの複合型を使うことが一般的です。

### 他の参考記事
テストをもれなく、ダブりなくするために

https://qiita.com/C_HERO/items/c86f0eee23af7e8d1a21

pythonでリファクタリングする際のコツ

https://qiita.com/nuko-suke/items/643801c91ab13415aebf
データビジュアライゼーション超入門_円グラフは使うな

## はじめに

[Google流資料作成術](https://www.njg.co.jp/book/9784534054722/)という本を最近読みまして、データ分析の可視化（データビジュアライゼーション）に関して新たな知見が得られたのと同時に自分なりの意見を持ちましたので、今回それを綴ります。

## 主張: 円グラフは使うべきでない

P63からP66にて、円グラフの利用は極力控えるべきと、本の著者コール氏は主張していました。
また、円グラフの代替案としては以下の4つが提唱されていました。(P249～P249のケーススタディにて記載)
1. 直接数字を見せる
2. 縦棒グラフを使う
3. 100%積み上げ横棒グラフを使う
4. スロープグラフを使う

私的にも、2.と3.の縦棒グラフと100%積み上げ横棒グラフで円グラフを代替するというのがけっこうしっくりきて、実際に円グラフで描画したときよりも見やすくなるなと感じました。
## 円グラフは使うべきでない理由

円グラフは使うべきでない理由ですが、著者は「円グラフでは、要素の大小関係がわかりずらい」と述べていました。

これに対して、私も賛成です。具体的な事例な事例として、実際に同じデータビジュアライゼーションの事例を用いて円グラフと積み上げ棒グラフとで比較してみます。

## 具体的な事例

例えば、「大谷翔平選手の変化球の投球割合が一番多いのはスイーパーである」と主張したい場合があるとします。
その際に、円グラフで描画する場合と横棒グラフを使って描画する場合に分けて見比べてみます。

まずは、以下に2023年の大谷翔平選手の変化球の投球割合を円グラフで示します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330349/acb25f92-d3db-cd12-79de-278b872aae52.png)

上記の円グラフで描画した場合、以下のようなことを思うのではないでしょうか。
- 「投球割合が一番多いのはスイーパーである」という主張について、2番目に投球割合が多いストレートよりとそんなに変わらないんじゃないかな？(定量的な違いがグラフから読み取りにくい)
- 各要素(変化球)の割合がどれくらいなのかわからない。

次に、以下のように横棒グラフにして描画を行いました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330349/3bc19a10-f6ef-cb54-7abc-e5fbcd5602ef.png)

上記の横棒グラフで描画した場合、以下のようなことを思うのではないでしょうか。
- 「投球割合が一番多いのはスイーパーである」ことがすぐわかり、2番目に投球割合が多いストレートとどれくらい数値で違うかというのもわかりやすい？(定量的な違いがグラフから読み取りやすい)
- 各要素(変化球)それぞれの割合がどれくらいなのかについて、視覚的・定量的に読み取りやすい。(ex. カットボールの割合はスイーパーの1/3くらいかなど..)

ちなみに、色を今回は主張したいスイーパーは赤、それ以外は薄ピンクというような同系色で強調をしていていますが、これも棒グラフで達成できる利点です。
この同系色で強調実施は円グラフではできません。なぜなら、円グラフでは、それぞれの要素を境界線の仕切りによって見分けているので、それが同系色(主張したい色以外)となった場合、各要素の判別ができなくなるためです。

## 結論・まとめ

具体例を見てもわかるように、「要素の大小関係」を主張するために円グラフは不向きと言えます。
確かに、私の今までの経験上も、円グラフを用いると、「その数値の大小関係が見にくい」や「そもそも何が重要かわかりにくい」といった指摘をもらったことがありました。
ただ、その代替的な方法として、棒グラフを用いることで視覚的に見えやすくなるということは今まで知らなかったので、今回学んだことを今後のデータビジュアライゼーション業務で生かしていきたいと思います。

## 補足

補足ですが、「2021年と2023年の変化球の投球割合を比較し、2023年度はスイーパーの割合が増加している」ということを主張したい場合も、以下のように横棒グラフで描画すると大変見やすいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330349/1dae0c4f-cbd1-751d-d2c8-7831990945ce.png)

上記の横棒グラフだと、例えば、2023年はスプリットの割合は減ったなとか、ストレートの割合が減ったななどといった全ての要素(変化球)についても視覚的に判別しやすいです。

また、以下のように左バッターと右バッターで変化球の割合を比較するというのも、棒グラフを使えば見やすくなるということがわかりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3330349/c486d98e-1f69-df29-0786-3ac4b4673119.png)

今までは、2つ期間などで同一の要素を比較する際、円グラフを2つ使って比較するということをやっていたので、今後は棒グラフを上手く使っていきたいと思います。
【小ネタ・自分メモ】GitBashでローカルフォルダの画像をbase64に変換する方法

## base64とは
https://ja.wikipedia.org/wiki/Base64
Base64は、データを64種類の印字可能な英数字のみを用いて、それ以外の文字を扱うことの出来ない通信環境にてマルチバイト文字やバイナリデータを扱うためのエンコード方式です。
とWikipediaには書いてありますが、簡単に言うと「画像などをテキストデータに変えたもの」と理解しています。
## なぜbase64に変換する必要があったか
今回は画像を外部のクラウドストレージに保存する処理を行うアプリのAPIにJSONでbase64の画像データを送りたいため、
ローカル内で「画像ファイル→base64」の変換を行う必要がありました。
## 画像のbase64変換手順
### 変換したい画像の用意
base64に変換したい画像をローカルのストレージ内に用意します。
ひとまず画像は何でもよいので適当に撮ったスクリーンショットを使いたいと思います。
今回は「base64image_from.PNG」という画像を「C:\base64test」のディレクトリに保存しました。
どのフォルダに保存したかだけメモしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/973fe6e8-914b-dd76-d235-9de4ca6a1b2b.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/315ba4d4-75f0-3e54-d23e-f1f135d436ef.png)

### base64への変換とテキストデータへの保存
- 保存場所へディレクトリ移動
まずはGitBashでcdコマンドを使用し該当データのディレクトリに移動します。
※現在の場所から相対パスを使用してこの次の手順を行ってもOKです。
```
cd base64test/
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/387600ec-e068-d31b-e0d6-2a706d1e16a0.png)


- 該当画像ファイルをbase64に変換
catコマンドを使用し画像ファイルを指定し、base64への変換を行います。
プロンプト画面にbase64に変換された文字列を表示させることできました。
しかし、プロンプト画面出るだけでどこにも保存されないので少し使いずらいですね。
また、自分が使用しているVScodeのターミナル画面では表示行数に限界があるため上のほうのテキストは消えてしまっています。
```
cat ./base64image_from.PNG | base64
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/3fca8af8-46c9-3534-caf0-bfcfa962860d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/9319e808-3d3d-cc3e-afb4-fa76fd45d290.png)

- 出力されたbase64のデータをテキストとして保存する
プロンプト画面ではすべて表示しきれないため、先ほどのcatコマンドに追記して出力されたテキストを.txtファイルとして保存しなおしています。
```
cat ./base64image_from.PNG | base64 > ./base64iamge_to.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/8307eb79-0b50-7e34-3be0-a816cecad294.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/ef7fc106-3857-d4fe-f641-f75bf2d59f28.png)

「base64image_to.txt」として保存することに成功しました。


### 改行の削除
上記のcatコマンドで画像をbase64変換し.txtファイルとして保存しなおすことはできましたが、
今度はデータの途中に大量の改行が入ってしまいました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/e0ea0f37-c0a8-f41c-22e6-f34bb2fe1c44.png)
改行を抜いてテキストにするためのcatコマンドが以下になります。
こちらはtrコマンド(置換コマンド）を使用して改行文字「\n」を削除しています。
```
cat ./base64image_from.PNG | base64 | tr -d '\n' > ./base64iamge_to.txt
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2780477/6f957415-9786-7723-24fa-6dfa18f80230.png)
改行なしで.txtファイルにすることができました。


## さいごに
今回はGitBashを使用して画像のbase64変換を行いました。
同様のコマンドをPowerShellでも試しましたが動作しませんでした。
PowerShellで行うには別の方法を調べる必要がありそうです。
また、コマンドを使用せずに変換を行う方法としてはWeb上で画像を登録するとbase64に変えてくれるようなサービスもありそうなので、
結果だけほしいときや外部に漏れても問題ない画像データの場合はそちらを使ってみてもよいかもしれません。
ComfyUIで生成したpngから、WorkFlowを復元するPythonコードをGPT4の手助けで即席に作れたよ

### ComfyUIで生成したpngから、WorkFlowを復元するPythonコードをGPT4の手助けで即席に作れたよ

### ComfyUIでSDXLで画像を生成したい

👇SDXLで生成

![ComfyUI_00009_.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/b8082ab1-29bb-5c64-aaee-2eb9ddba5fce.png)

　StableDiffusionのためのWebuiでの画像生成環境であるAUTOMATIC1111は、最近世に出たSDの高画質版のSDXLで画像生成できるにはできるのだが、まだ、refinerなどに対応していないため、久しぶりにComFyUIにもどって使っていたのところ、生成したpng画像をドロップするだけで、生成した時のプロンプトを復元できるAUTOMATIC1111のような機能がないので、不便だなーと思いながら、色々調べていたら、
cibitai.comのtoolのところで SD Image Infoというウェブアプリを見つけた。

## (👇やこの記事で触れたコードがなくてもConfiUI内にpng画像をドロップすれば、WorkFlowが復元します）

https://sdimage.info

しかし、これは画像をよそのクラウドにアップロードしなければならないので、ローカルでできるように
するため、pngの中のテキストファイルを抜き出すコードを自分で書こうと思ったが、以前C++でpngファイル
をごにょごにょするコードを書いたことがあったので、それを引っ張りだして眺めていたが、buildの環境
を整えるのがめんどうなので、GPT4+コードインタープリターでなんとかならないものかと、試してみた。

### GPT4+コードインタープリターは頼りになる助手

　GPT4がpngファイルの扱い方をどれくらいわかっているか試しているうち、一発でテキストを抜き出す
コードを作ってもらうのは無理そうということがわかったので（tEXtチャンクが無いとか言ってくる）、
ネットのpngコードを処理を処理するコードをアップロードし、

https://m-zaki.hatenablog.com/entry/2020/10/09/002500

「これを参考にして、pngから、workflow(json)を抜き出すコードを書いて」と依頼したところ、わりとすんなり書いてくれた。しかし、細かい問題があったので、多少手直して、使えるコードができた。
以下のようなお願いをしたのだが、英語がテキトーなのはご容赦を.....

![スクリーンショット 2023-08-06 201502.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/430586/326e6ed0-d66c-d73e-43e6-88503c34cb44.png)

コード->https://github.com/ultrahamlet/png2ComFyUI_WorkFlow.git
Pythonの新常識　dataclassを使ってみた。AtCoder 二次元問題用処理を書いてみる編

# はじめに

dataclassについて勉強中です。
dataclass自体の説明は、他の記事にお任せします。

https://qiita.com/ttyszk/items/01934dc42cbd4f6665d2

学習の為にdataclassを使ってみたかったので、AtCoderの問題で使ってみました。

# 2次元問題

私が勝手に2次元問題と呼んでいるのですが、H列、W行の二次元平面の問題があります。
例えばこの問題

https://atcoder.jp/contests/abc308/tasks/abc308_d

 (1,1) から(H,W) まで移動できるは判定する問題です。
上下左右に移動する時、`[(1,0),(-1,0),(0,1),(0,-1)]`のようなリストを用意して移動させたり、H列、W行の範囲外のチェックなどが必要になります。

dfsを使って辿っていけるかを確認してみます。
二次元固有の処理はBoardクラスにまとめてみます。

```Python
from dataclasses import dataclass

@dataclass
class Board:
    H: int
    W: int
    S: list

    def get_neighbor_pos(self, pos):
        i,j = pos
        for di,dj in [(1,0),(-1,0),(0,1),(0,-1)]:
            ni = i + di
            nj = j + dj
            if 0<= ni < self.H and 0 <= nj < self.W:
                yield (ni,nj)
    def get(self, pos):
        i,j = pos
        return self.S[i][j]

def solve(H: int, W: int, S: "List[str]"):
    
    s = ["s","n","u","k","e"]
    visited = defaultdict(bool)

    board = Board(H,W,S)

    def dfs(pos,d):
        if pos == (H-1,W-1):
            return True
        for next_pos in board.get_neighbor_pos(pos):
            if not visited[next_pos] and board.get(next_pos) == s[(d+1)%5]:
                visited[next_pos] = True
                if dfs(next_pos, d+1):
                    return True
        return False

    if dfs((0,0),0):
        print(YES)
    else:
        print(NO)
```

# まとめ

- classを使った記述では__init__()の記述に比べてすっきり書ける。
- dfsの関数中身は、経路をたどっていく処理に専念した記述にできた。
- このclassをもちょっと育てていったら、使いやすいものになりそう。

AtCoderの問題は、いつも力づくで書いてしまうんですが、綺麗な構造で書きたいですね。
フルスタックエンジニアの将来性

# 目次
1. [フルスタックエンジニアとは](#フルスタックエンジニアとは)
1. [将来性](#将来性)
1. [フルスタックを目指す上で必要なこと](#フルスタックを目指す上で必要なこと)

# フルスタックエンジニアとは
複数のスキルを持つITエンジニアの事を指す
『<font color="red">**マルチエンジニア**</font>』ともいう

一般には以下の4領域をカバーしている
1. アプリ領域（iOS/Androidアプリ）
2. ネットワーク・インフラ領域（AWSとかGCP, Azure）
3. webフロント領域（JavaScript。VueとかReactとか）
3. webバックエンド領域（APIの開発だったり、データベース周り）

# 将来性
1. [エンジニア不足の世の中で強い存在](#エンジニア不足の世の中で強い存在)
1. [複数職種をまかなえることによる優位性](#複数職種をまかなえることによる優位性)
1. [年収](#年収)

### エンジニア不足の世の中で強い存在
[経済産業省の調査(2019年3月)](https://www.meti.go.jp/policy/it_policy/jinzai/houkokusyo.pdf)によると、2030年にはIT人材（主に情報サービス業、ITサービス・ソフトウェアなどを提供する企業、ITを活用する一般企業の情報システム部門などに所属する人材）の不足数が最大で<font color="red">**約79万人**</font>になるという試算が出ている

<img src="https://tech-camp.in/note/wp-content/uploads/2020/10/A677C71B-E765-433B-A5A5-D34CA0FFADD3_1_105_c-e1602060623961.jpeg" />

**この統計から、設計～運用・保守などを一気に行えるフルスタックエンジニアは非常に市場価値が高い存在といえる**

### 複数職種をまかなえることによる優位性
フルスタックエンジニアの最大の強みは『**複数の領域に対する知識・技術がある事**』である。
その為、以下の点で優位に立てる

**▼エンジニア側**
1.**コミュニケーションエラーが発生しにくい**
　・<INS>知識がある分共通認識を持たせるコミュニケーションが可能</INS>
2.**開発スピードの短縮**
　・<INS>各領域の要件の整理が付きやすい</INS>

**▼企業側**
1.**人件費の削減**
　・<INS>単純に一人で複数の領域担当できるならその分人を集める必要がなくなる</INS>
1.**信頼性を獲得しやすい**
　・<INS>「この人は何でも知っている・何でもできる」という周りからの認識は、仕事・人間関係の幅を広げるチャンスになる</INS>

### 年収
[ITプロマガジンの記事(2023.02.20)](https://itpropartners.com/blog/7311/#i-4)によると、フルスタックエンジニアと呼ばれる程度に現場経験とスキルを持つITエンジニアの年収は**想定500万円〜1000万円**ほどである。
※『フルスタックエンジニア』の定義が曖昧な所もあり、具体的な平均年収を割り出すのは難しい

##### 勤務形態別：ITエンジニアの平均年収
[ITプロマガジンの記事(2023.02.01)](https://itpropartners.com/blog/7274/#IT)によると、日本人の平均年収は**403万円**である。

<img src="https://i.ibb.co/KWk0rRk/2023-08-06-191606.png" alt="2023-08-06-191606" />

## フルスタックを目指す上で必要なこと
1. [専門性の追求](#専門性の追求)
1. [需要のある開発スキル・言語を習得する](#需要のある開発スキル・言語を習得する)

### 専門性の追求
エンジニアに限らず、知的労働職では「専門性」がキモになる。
フルスタックエンジニアに必要な4領域を先ほど挙げたが、本来であれば各領域の専門性を追い求めなければならない。
その上でフルスタックエンジニアの持つ恩恵をもらえる事を念頭に置くべき


### 需要のある開発スキル・言語を習得する
フルスタックエンジニアは様々な領域に対する知見が必須であり、学習習慣が必要である。しかしITの動向について知っておかなければ、不必要な学習をしてしまったり器用貧乏になりかねない。
長く活用できる開発スキルを身につける為に、ITの動向は見ておく必要がある。
Gitのobjectsとmergeについてのメモ

#### ./gitの構成
```
.
├── COMMIT_EDITMSG
├── HEAD
├── config
├── description
├── hooks
├── index
├── info
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           ├── master
│           └── test
├── objects
│   ├── 1e
│   │   └── asdfa887932510deeecdfa800000082341743a
.
.
.
│   ├── fa
│   │   └── cad48f0ac69f851bsdb8aefcc81234asba1782
│   ├── a8
│   │   └── 8d8325673948adacefdab7485f0c5b80f01112
│   ├── info
│   └── pack
├── packed-refs
└── refs
    ├── heads
    │   ├── master
    │   └── test
    └── tags

```

#### オブジェクトのタイプを見る
```
$ git cat-file -t faca
tree
```

#### オブジェクトの内容を見る
```
$ git cat-file -p faca
100644 blob 8d8325673948adacefdab7485f0c5b80f01112 memo1.txt
```

#### オブジェクトの種類
- commit　コミット情報（日時、著者、コメント）
- tree　すべてのファイル名とその種類
- blob ファイルの中身

#### git addするとどうなるか
- index上ではtreeが作られる
```
git ls-files --stage
```
- blobが作られる


#### 変更管理の仕組み
```
cat .git/logs/refs/heads/master (masterブランチ)
cat .git/logs/refs/heads/test（testブランチ）
```
- コミットはparentのコミットハッシュを持っている（コミットリレー）

#### マージには２種類ある
- マージをするときに元のブランチの最後のコミットからブランチを切っていた場合はマージコミットが作られない。Fast Forwardマージと呼ぶ。
- マージをするときにブランチを切ったコミットより後にコミットが作られていた場合、マージコミットが作られる。Non-Fast Forwardマージと呼ぶ。マージコミットはparentのコミットハッシュを２つ持つ。
【SystemVerilog】テストベンチのタイムスケールについてのメモ

# モジュールとテストベンチ
systemverilogで状態遷移するモジュールとそのテストベンチを書いたので、書き方（主にタイムスケールについて）を記録しておきます。
以下のリポジトリで自作CPUを作成してます。
https://github.com/rei0515reten/Re_RISCV


```verilog:stat.sv
typedef enum logic [1:0] {FETCH, DECODE, MEMORY, WRITEBACK} state_type;

module stat(input logic clk,
            input logic reset,
            output state_type out);
    state_type next_state, state;

    //組み合わせ回路
    //状態を遷移する
    always_comb begin
        case (state)
            FETCH: next_state = DECODE;
            DECODE: next_state = MEMORY;
            MEMORY: next_state = WRITEBACK;
            WRITEBACK: next_state = FETCH;
        endcase
    end

    //順序回路
    //always_ff @の()内はセンシティビティリストで＠はイベントを意味する
    //非同期リセット付きフリップフロップを意味する
    //センシティビティリストにresetがないフリップフロップは同期リセット付きフリップフロップ
    always_ff @(posedge clk, posedge reset)
        if(reset) state <= FETCH;
        else state <= next_state;
    
    assign out = state;

endmodule
```


```verilog:stat_test.sv
//タイムスケールの設定
`timescale 1ns/1ps

module stat_test();
    logic Clk,reset;
    logic[1:0] s;

    stat _stat(Clk,reset,s);
    always #5 Clk = ~Clk;      //5nsごとにクロックを切り替える

    initial begin
        reset = 1;
        Clk = 0;
        #20                    //20ns後にresetを0にする
        reset = 0;
        #500                   //500nsでシミュレーションが終了
        $finish;
    end

    initial begin
        $monitor("state=%d",s);
        $dumpfile("state.vcd");
        $dumpvars(0, stat_test);
    end


endmodule
```


# タイムスケールについて
以下を参照。
http://zakii.la.coocan.jp/hdl/52_timescale.htm

以下の行がテストベンチ内のタイムスケールを設定している。
設定しないとデフォルトのタイムスケールが設定される。
タイムスケールはシミュレーション用に存在するものでテストベンチで使用される。
```verilog
`timescale 1ns/1ps   // 単位/精度
```
UiPathのCloud Robot Serverless、Data Service、Appsを使ってみた所感

UiPathの無料で使える追加機能を試してみた感想。

# Cloud Robot Serverless

## 課金について

課金はRUという単位で行われるが、Freeプランには毎月300RUが無償で与えられている。
ブラウザ操作を含むワークフローを8分くらい動かして8RU消費したので、300分＝5時間くらい使える計算。

## 便利な点

環境の用意が不要な点はありがたい。
PC交換の影響を考えなくていい。

後で述べるがクロスプラットフォームでしか使えないので、ユースケースは限られるが、ブラウザ操作もできるiPaaS、という感覚で使うのがちょうどいいと思う。

## 微妙な点
### 対応OSをクロスプラットフォームにしないと動かせない
クロスプラットフォーム自体がかなり使いづらい。
まず、画面操作はブラウザに限られると思ったほうがいい。
Excelなどのファイル操作もMircorsoft365経由じゃないとできなかったはず。

そこまでなら想定の範疇内だが、使えるアクティビティの仕様が微妙に違ったり、アクティビティが微妙になかったりする。
例えばUI操作系で言うと、「繰り返し（UI要素）」が無い。裏技的に対応OSをWindowsにして作りこんだ後Studioを2画面開いてコピペすると使えるが、編集はできない。
データテーブル系で言うと、「データテーブルを構築」が無い。こちらはVB.NETのコードをガリガリ書いていけば回避できるものの、こういう微妙な差異があるせいで開発効率が落ちる。
アクティビティの仕様もよく分からないところで違ったりする。

Windowsじゃなくても動くようにしたい強い意志がない限り、クロスプラットフォームを選択するのはやめたほうがいい。

# Data Service

## 便利な点
### 追加費用無しでサクッと試せる。
1日1000回まで追加費用無しでAPIが使えるらしい。
1回1件ずつ触ると1000回はすぐに到達してしまうが、1回のデータ操作で1000件まで一度に扱えるので、うまく節約すれば十分使える。
GUI操作で作れて、とりあえず触る分にはいい。

### Studioでのエンティティの管理が簡単
ブラウザ上でData Serviceの操作を行い列を追加したりした場合、Studio側ですぐにその変更を反映させることができる。
エンティティが持つフィールドがデータ型に反映されているので、コード入力の際に補完で呼び出せて便利。

## 注意点とか

### データ操作の際は、基本的に1000件単位で行う必要がある
参照の場合は1000以上のデータは返ってこないし、追加・更新・削除は1000件を超えるデータを一度に与えるとエラーになる。
Studio/Robotからしか触ってないけど、API経由で使ってもたぶん同じだと思う。

### SQLは使えないし、ストアドプロシージャみたいなことはできない。
そもそも期待するほうが間違ってそうだけども。
前述の1000件単位の縛りもあって、ちょっとしたデータ整形をするにも時間がかかる

1000件以内で運用するならそこまでストレス無さそうだけど、1万件とか10万件とかになってくるとそれはもう普通にSQL Databaseとかを考えたほうがよさそう。

### 参照画面の一覧性が悪い
別に普通の画面なんだけど、例えば2000件のデータを並べて変なのがないかなーって見たいとき、1ページあたり最大50件しか表示できないので、全部みるのに40回ページ送りが必要なのでめんどくさい。

そうするとExcelなりGoogle Spreadsheetにでも吐き出したほうがよくて、たぶんData Serviceだけ使うのは無理がありそう。

### ライブラリを使っていて、参照先ライブラリ、参照元プロジェクトの両方でData Serviceのエンティティを使う場合、名前空間は違うものにする必要がある。

同じだと参照元プロジェクトでエンティティの指定がうまくできない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/586252/417c54b0-4d00-8bf5-970f-cabef02d0d08.png)

### 列の順序は後から変えられなそう
まあ、表示側で考えればいいのであまり大した制約でもないか。

# Apps

とりあえず無料で使えるから使ってみたけど、利用制限があるのかはよく分からない。

## 良い点

公開可能、もしくはOrchestratorのユーザーロールに基づくアクセス権を設定した状態で、さくっとWebアプリケーションを作れるのは良い点。

## 微妙な点

### 公開する方法が直感的に分かりにくい
まあ、eラーニングとかガイドを見ればいい話なんだろうけど…。
パブリッシュするだけではだめで、Orchestratorからデプロイする必要がある。
Apps画面からはデプロイできず、Orchestratorに行く必要があるが、導線がないので分からない。

### テンプレートが微妙
まず数が6つくらしかない。
とりあえずデータを表示したいだけなのに、テンプレートを見てみてもそれっぽくすぐ使えそうなのがない。
フォーム形式が多い。

### Data Serviceとの連携はできるが、フィルタリングでOR条件が使えない
AND条件のフィルタリングはできるのに、OR条件のフィルタリングはできない。
複雑な条件もたぶん指定できない。

そんなに大して使ってないのに基礎的なところでハードルが出てきたので、たぶんちゃんと使おうとするともっといろいろ制約がありそう。

データの参照の仕方にこの手の制約があると、データ設計からやり直しになる。
コードで実装してたら置換してなんとかなることもあるけど、ノーコードだと手作業でやり直しになるのが色々辛い。

# 参考

ライセンスごとの利用枠はここに記載あり。
https://docs.uipath.com/ja/automation-cloud/automation-cloud/latest/admin-guide/about-licensing
タイトル: 「初心者でも分かる！tRPCで型安全なAPIを手軽に実現する方法」


## 目次
1. [はじめに](#はじめに)
2. [tRPCとは何か？](#tRPCとは何か)
3. [TypeScriptとtRPCの組み合わせの強み](#TypeScriptとtRPCの組み合わせの強み)
4. [tRPCの基本的な使用例](#tRPCの基本的な使用例)
5. [実際のコード例](#実際のコード例)
6. [まとめ](#まとめ)

## はじめに
API開発における型安全は重要なテーマです。tRPCとTypeScriptを組み合わせることで、初心者でも手軽に型安全なAPI開発ができます。この記事では、tRPCの基本から実際のコード例までを解説します。

## tRPCとは何か？
tRPCは、サーバーとクライアント間で型情報を共有するためのツールです。このセクションではtRPCの概要とメリットについて説明します。

### 型安全
型エラーをコンパイル時に検出できるため、ランタイムエラーを削減します。

### TypeScriptとtRPCの組み合わせの強み
TypeScriptと組み合わせることで、tRPCはより強力になります。このセクションではその理由と利点について解説します。

### tRPCの基本的な使用例
ここでは、ウェブサイトの管理者が訪問者の情報を取得する一般的なケースを例に、tRPCの基本的な使用方法を説明します。

### 実際のコード例

### サーバー側のコード

```typescript
import { createTRPCRouter } from '@trpc/server';

const router = createTRPCRouter()
  .query('getUser', {
    resolve() {
      return { id: 1, name: 'Bilbo' };
    },
  });

// Expressとの統合例
import express from 'express';
import { inferAsyncReturnType } from '@trpc/server';
import { z } from 'zod';

type Context = inferAsyncReturnType<typeof createContext>;

const createContext = async ({ req, res }: express.Request) => ({ req, res });
const app = express();
app.use('/trpc', trpcExpress.createExpressMiddleware({ router, createContext }));
```

### クライアント側のコード

```typescript
import { createTRPCClient } from '@trpc/client';

const trpc = createTRPCClient({
  url: '/trpc',
});

// getUserクエリの使用例
const user = await trpc.query('getUser');
console.log(user.id, user.name); // 1, 'Bilbo'
```

### まとめ
tRPCは、初心者でも手軽に型安全なAPI開発を実現できる強力なツールです。この記事を通じてtRPCの基本を学び、実際のプロジェクトに活用する方法について理解を深めることができたことでしょう。

ぜひ自分のプロジェクトでtRPCを使ってみて、その強力な型安全機能を体感してください！

---

この記事の構造と内容は、初心者にもわかりやすく、具体的なコード例も提供しています。Qiitaのフォーマットに従い、読者に興味を持ってもらえる内容になるよう工夫しています。