OmniAICreator/Qiita-1.07M huggingface dataset:
Gitとbashに設定しているaliasをメモする．

## 作業環境

| 項目 | バージョン / 詳細 |
|------|-----------------|
| OS | Windows 11 (WSL2) |
| エディタ | VSCode |
| 拡張機能 | [Git Graph](https://marketplace.visualstudio.com/items?itemName=mhutchie.git-graph) |
| Git | 2.39.3 |

## 誰に向けた記事か

- Docker のコマンドを打つのが面倒 / 打ち間違えがちな人
- Git の基本はわかるけど、もっと便利に使いたい人
- （サブ）Ruby on Rails を使って開発している人

## やらないこと

- `alias` の設定方法の解説
- 基本的なコマンドの解説

## 設定内容
bashのalias
```conf
alias d='docker'
alias dc='docker compose'
alias dcud='docker compose up -d'
alias dceab='docker compose exec app bash'

alias gst='git stash'
alias gstp='git stash pop'
alias gcan='git commit --amend --no-edit'
alias gp-rdev='git pull --rebase -autostash origin develop'
alias gf='git fetch'

alias create-todo='rubocop --auto-gen-config --exclude-limit 999999'

alias ..='cd ..'
```

Gitのalias

```config
[alias]
	sw = switch
	edit-comment = commit --amend
	current-branch = ! git branch | grep -e '^* ' | sed -e 's/^* //g'
 	where = branch --contains=HEAD
	fpull = !git fetch && git reset --hard origin/$(git current-branch)
	fpush = push --force-with-lease
	fixup = commit --fixup
	autosquash = rebase -i --autostash --autosquash
	commits = log --pretty=oneline --grep=\"^fixup\\!\" --invert-grep
	head-hash = log -1 --pretty=format:\"%H\" --grep=\"^fixup\\!\" --invert-grep
	wip = !git commit --fixup $(git head-hash)
	upstream = !git branch --format='%(if)%(HEAD)%(then)* %(else)  %(end)%(refname:short) : %(upstream:short)' | grep $(git current-branch)
 	alias = !"if test -z $1; then loop=; for k in `git config --get-regexp ^alias\\. | sort | sed -e 's/^alias\\.\\(\\S*\\).*/\\1/g'`; do echo -n $k; loop="${loop}1"; if test ${#loop} -lt 5; then echo -n '\t'; else echo; loop=; fi; done; exit; fi; git config --list | grep ^alias\\.$1= | sed -e s/^alias\\.//; exit;"
 ```

## 主要なものについて設定してみての所感

### bash のaliasについて

| コマンド    | 所感 |
|:-----------|:------------|
| `dc`・`dcud`| 高頻度で利用している。タイポが激減してとても嬉しい |
| `gcan`・`gf`| git操作でよく利用する。雑に打つことが多いため重宝している。 |
| `gst`・`gstp`| git の`--autostash`オプションを知ってからは利用頻度が少ない。稀にコンフリクト等で事故が発生するため注意が必要。   |
| `gp-rdev` | rebase派のあなたはぜひ設定を。 |

### Git の alias

| コマンド | 所感 |
|:---------|:------------|
| `edit-comment` | 直前のコミットメッセージを編集する。alias を使うか直接打つかは気分次第。 |
| `current-branch` | 現在のブランチを表示する。後述の alias でも使用。もっと簡単なコマンドがありそう。 |
| `where` | 現在のブランチを表示する alias その2。コンソールで打ちがちなのはこちら。 |
| `fpull` | `force push` はあるのに `force pull` がないので作成。コンフリクトや rebase に失敗したときに使う。 |
| `fpush` | `force push` を気軽に使うために作成。`--force-with-lease` を付けているため、自分以外の変更がある場合は push できないので比較的安全。 |
| `fixup`・`autosquash` | 2つセットで利用。コミット履歴を整理する際に便利。`fixup` は多用しすぎるとコンフリクトするため、定期的に `autosquash` を実行するのがおすすめ。 |
| `commits` | `fixup` で作成したコミット以外のハッシュとメッセージを表示する。`git commits -5` のように打つと5個分のコミットが表示可能。 |
| `wip` | `fixup` タグのない最新のコミットへ向けたfixupコミットを作成。`git commit --amend --no-edit` とは違い、履歴が残るため、キリが悪い時の保存に便利。 |
| `upstream` | push 前にリモートブランチを確認するための alias。誤ったブランチへの push を防げる（n敗）。 |
| `alias` | 設定した alias の一覧や内容を表示する。たまに alias を忘れるので作成。`alias {command}` でaliasの内容を表示。|

## 終わりに

備忘録的な形で記事を作成しました。

より良い alias や便利なコマンド、記事内の誤りなどありましたらコメントでご指摘いただけると嬉しいです。

ご拝読ありがとうございました。
EclipseをVSCodeのテーマにカスタマイズする for Mac

## この記事について
以前はDevStyle適用状態でも以下記事にあるprefsファイルの取り込みで動作したのだが、Eclipseのバージョンを2022→2023上げたところ
うまくテーマが読み込まれなかったので、設定画面から手動でカスタマイズした方法を備忘録として書き記す。

https://qiita.com/oh_yeah_sayryo/items/aa8cb1a82fe2471598a9

## 環境
・Eclipse IDE for Java Developers
　Version: 2023-12 (4.30.0)
　Build id: 20231201-2043

・MacBook Pro2019
 プロセッサ：2.6 GHz 6コアIntel Core i7

## Darkest Dark Themeのインストール
マーケットプレイスからDarkest Dark Themeをインストールする。
ヘルプ→Eclipseマーケットプレース→検索で「Darkest Dark Theme」
![スクリーンショット 2024-07-07 2.36.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738565/b63ac6b3-29f5-5109-707c-06f0545fb3b8.png)

ひとまずテーマをIntelliJにして再起動。
設定→DevStyle→色テーマ
ワークベンチ・テーマ：Dark Custom(テーマの数値はいじった記憶がない。。)
アイコン色：Pastels
エディタテーマ：IntelliJ IDEA Dark

※設定完了後にスクショしたため、プレビュー画面が既にVSCodeっぽくなっている。理由は後述する。
![スクリーンショット 2024-07-07 2.33.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738565/6f5814d3-59b5-1ee4-a233-a73a4e9ed713.png)

## Java構文の色指定を手動で設定していく
設定→Java→エディタ-→構文の色指定
![スクリーンショット 2024-07-07 3.03.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738565/87092ac6-4f38-8f6e-c59f-0d21d4a5b693.png)


以下のカラーコードをもとに手動で設定していく。(難儀だがかっこいい環境造りのためにがんばる)
要素→Java→要素を選択し「色：」からカラーコードを指定する。
macの場合は真ん中のタブをクリックし、プルダウンで「Web セーフカラー」を選ぶとやりやすい。

```yml:colorCode.yml
'return'を除外したキーワード：3399cc
static final フィールド ：33ccff
static フィールド：99ccff
static メソッド呼び出し：cccc99
インターフェース：66cc99
オート(アン)×××××：使用可能のチェックをはずす
キーワード'return' :996699
クラス：66cc99
ストリング：cc9966
その他：66cc99
パラメータ変数：99ccff
フィールド：33ccff
メソッド：cccc99
メソッド宣言：cccc99
ローカル変数：99ccff
ローカル変数宣言：99ccff
演算子：cccccc
括弧：996699
型引数：66cc99
型変数：66cc99
継承されたフィールド：cccccc
継承メソッド呼び出し：cccc99
使用すべきではないメンバー：cc3333
数値：99cc99
制限された識別子：3399cc
抽象クラス：cccc99
抽象メソッド呼び出し：cccc99
注釈：66cc99
注釈要素の参照：cccc99
列挙型：66cc99
```

設定完了後「適用して閉じる」を押すと以下のように設定できる。
![スクリーンショット 2024-07-07 3.41.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3738565/e10c8885-5be5-73cd-493b-0d33a134d9d3.png)


:::note warn
適用完了後にDevStyleの色やテーマを変更すると設定が初期化されて
今までの努力が水の泡となる可能性があります。テーマ変更する際はお気をつけください。:angel_tone1:
:::
ABC361 日記

　新人競プロerの山田です。
　ABC3完、4733位、perf768、rate変動は988→963(-25)でした。死。

### [A問題](https://atcoder.jp/contests/abc361/tasks/abc361_a)
　配列に挿入する問題。21:03:14 AC。こういうの1分以内でACしている人はなんなんだ。状況把握だけで30秒以上かからないか普通。

### [B問題(一回目)](https://atcoder.jp/contests/abc361/tasks/abc361_b)
　立体問題。これのせいで冷えた。これがなければ暖まっていた。
　何からすればいいのかわからないし、全探索も不可能。ゴリ押しで重たい実装するしかないと思ってしまった。

　山田がまず実装しようとしたのは、「二つ目の図形の辺が、一つ目の図形を通っていればYes、一つも通っていなければNo」というもの。これを27分かけて実装した。
　実装中の山田の心境は、「時間かかるなー、でもB問題はどうせ正解しなきゃいけないから後に回しても意味ない。もっとずっと単純な解法があるはずなんだけど、思いつかないしどうにかして実装するしかない」だったけれど今考えるとマジで後に回すべきだった。
　
　21:29:04 提出。WA。あー今日終わったと思った。ここで初めてBを飛ばすことを決意。

### [C問題](https://atcoder.jp/contests/abc361/tasks/abc361_c)
　数列の要素を消していく問題。
　Bでペナった上にACできていないことを引きずりながらC問題を考える。こう焦っていると、死ぬほど短い問題文でも題意の把握に時間がかかる。問題文の誤読とバグらせを繰り返しながら約7分で実装。21:37:10 AC。普段なら5分以内でできていたかもしれない。
　Bに対して簡単すぎると思った。

### [B問題(二回目)](https://atcoder.jp/contests/abc361/tasks/abc361_b)
　長方形２に長方形１が内接している図形を想像した。これは共通部分を持つのに、山田のプログラムだと共通部分を持たないことになることに気が付く。それを修正した（後でわかるがこれでも間違っている）。WAになる可能性もあるのでいったんDをACしてからBを提出しようと考えた。

### [D問題](https://atcoder.jp/contests/abc361/tasks/abc361_d)
　ボール移動問題。
　ボールの数の制約がクソ小さいことからbit全探索→BFSという解法はすぐにわかった。
　しかし結構大変そうだった。2進数にいろいろな情報を詰め込むという重そうな実装。ボールを置ける範囲がNまでではなくN+2までというバグらせやすい構造。山田のこの時の精神状態。苦戦する未来しか見えていなかった。

　とりあえず、BFSするグラフの、頂点番号の数字(2進数)の0~N+1桁目にボールの白(0)黒(1)の情報(ボールのないところは0とした)、N+2~N+5桁目にボールのないところがどこであるか、を載せた。
　今思うと、上の段落に書いたことは手元の計算用紙にメモするべきであったけれど、この時の山田は焦りすぎてすべてを頭のなかでやっていた。

　これはACできるか……？　って実装中になったのでとりあえずBを先に片付けようってなった。

### [B問題(三回目)](https://atcoder.jp/contests/abc361/tasks/abc361_b)
　さっき修正したプログラム（図形同士の内接を考慮したもの）を提出(21:50:45)。WA。「ええええええええええええええ」ってkokorおのなｋさけんで、
　でも！　直方体２が直方体１を完全に内包しているパターンが見落とされていることにすぐ気が付きこれを追加してAC(21:54:55)。とりあえず最悪の事態は避けることができた。
 
　いやーーーーーーーーーーーーーーーーーーーーーボロボロ。このとき順位表見たら4000位ぐらいだったから冷えは確定だなーーーーってなげくとどうじにD問題せいかいしなきゃっておもってDにもどった。

### [D問題(再開)](https://atcoder.jp/contests/abc361/tasks/abc361_d)
　なんだか頭の中が混沌として、集中もできなくて、実装中にコードの全体像がまったく見えていなかった。
　たしか22:15ぐらいに実装完了した。案の定バグった。間違っている部分がBFS部分なのかグラフ実装部分なのかわからない。状況を2進数で表す系の問題でバグると、coutを使うデバッグが難しくなるから面倒。
 
　結局バグの原因はグラフ実装部分で
・ボールの置ける範囲を1~nとしてしまっていたこと（本当は1~n+2）（このミスは予測していたのに）
・2進数の初期化をするタイミングを間違えたこと。
　だった。

　前者はメモ用紙をまともに使っていれば防げた。後者みたいなミスは初心者のころにしかしてなかったのに今日やってしまったのは、競プロのメンタル的側面の強さを表している。

　バグは全然取れず、ACしたのは大会終了後だった。

### 大会終了
　焦ると全部崩れますね。Bで焦らせて、D(冷静な処理が要求される)で詰ませるという構成が意図的なものだとしたらよくできていると思います。

　重要な反省点としては
 
・Bで**余事象**（立体同士が離れている状態）を想像するという考察はすべきだった。それをしていれば正攻法にたどり着いていた。

・そもそもBで**激重解法しか思いつかなかったときにすっ飛ばすべきだった。** ここで崩れると後で全部ダメになり得ることがわかっていなかった。中盤以降（B以外で3完した後など）に回すべきだった。

・Dではもっとメモ用紙を使いまくって、冷静に整理するべきだった。焦っていると頭の中でやろうとしてしまい、なおさら頭がゴチャゴチャして焦りが加速してしまう。**焦っているときこそ手を使いまくって冷静に整理。**

　上の反省点ほど重要ではありませんがEやFも覗くべきでした。結果論に近いですがD425、E500、F500という配点や、D問題の実装の重さ、E,Fの問題設定の単純さなどから、そうする選択肢も可能でした。そして現に大会終了後にEをパッと見たときに、こうかな？　といった解法は浮かびました。実装難易度はDの半分以下なので大会終了までに提出することができたと思います。
【VSCode】行の高さを変更する方法

`settings.json`で`editor.lineHeight`を設定することで行の高さを変更できます。

```settings.json
{
  "editor.lineHeight": 1.3
}
```

変更前
![スクリーンショット 2024-07-07 2.14.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/997413ef-ec15-41d7-3cf3-c0b132b48220.png)

変更後
![スクリーンショット 2024-07-07 2.14.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2342443/09337ad3-6e54-66d6-e19b-f06d2d8d8848.png)
AWS CDK Conference Japan 2024にて初登壇して感じたこと。

https://jawsug-cdk.connpass.com/event/317921/

こちらのイベントにて、エンジニアとして初めて登壇しました。
とても素敵な空間で、こんな最高なデビューを果たせて幸せだなと感じています。

初の登壇、初のJAWS-UGで感じたことをそのままアウトプットしようと思います。

## 発表したこと

スライドとしては以下です。

https://speakerdeck.com/hosomatu/tuo-potipotiwomu-zhi-site-cdkdeinhuragou-zhu-wositemita

### 要約
CDKに初めて触れた良い感想
- 高抽象度化（L3）にて簡単にパターンごとデプロイできた感動
- アプリ開発に近い開発体験だったことへの感動
- CloudFormationに関するエラーで大変だったこと


## 登壇準備で得られたもの

### 1. 人に伝えるための思考機会
まだまだジュニアエンジニアでお客様の前で直接話す機会も少ない中でこの経験は貴重だと感じました。
話し方の緩急、どれだけスライドに文字を入れるか？どこまで詳細に話すか？どのタイミングでまとめを挟むか？など、普段の仕事では使わない筋肉を使った感覚がありました。
最終的に割と良い反応ももらえてよかったです。
こういうソフトスキルな部分を磨いていくのもキャリア構築に際して有効なのかもなと感じました

### 2. 知識の深掘り
教えるものが最も学ぶの言葉通り、自分の知識をアウトプットできるまで理解することの重要性をとても感じました。
特にCDKのコンストラクトの概念を人に話せるようになるため、浅い理解の状態からかなり時間がかかりました。
たくさんの壁打ちや資料の作成を経て、確固たる理解として自分の中に落とし込めたように感じます。
また、今回は時間や総合的に考えて割愛しましたが、CloudFormationの概念についてもかなり理解が深まりました。
独学では概念系はなんとなくの理解で終わりがちなので、あえてそれに関する登壇を交えることで理解を深めていく学習を続けても良いのかなと感じました。


## 実際に登壇本番を通じて得られたもの

### 1. 人前で話す経験値
ソフトスキルが大きく磨かれたように感じます。オンラインを含めると500人ほどの前で話す経験値は普通に働いているだけではなかなか得られないものなので、このような場でトレーニングを積めることは良いことだなと感じました。いつか大型案件などでフロントとして立つことになったりした時に、このような経験があるかないかで仕事のしやすさが変わってきそうだなと思いました。

### 2. 広い範囲からのフィードバック
現状の自分の到達点を、隠すことなく話すことによって得られるフィードバックの中に成長のヒントがたくさんあるように感じました。
例えば、私はCloudFormationのロールバックの失敗の対応策として、CLIの強制削除コマンドを提唱したのですが、Xにて、「最近はマネジメントコンソールでも強制削除できるようになった気がする」という反応を頂けました。
このように、オープンな場で発表することの怖さの裏返しでもありますが、より広い範囲からフィードバックを受けることができるのは、とても大きなメリットのように感じました。

### 3. コミュニティからの認知
これは非常に大きいなと感じました。一番大きなメリットだと思います。
会社、個人として、業界に多少なりともアピールできたのはよかったのかなと感じます。
登壇をきっかけに色々な方に話しかけていただいて、交流を深めることができました。
社外の方からのトレンド情報だけでなく、モチベーションの面でも良い伝播をたくさん受けられたように感じます。
今回は初回だったのでわかりませんが、この認知の輪は登壇やコミュニティの参加の回数に連れてさらに加速度的に広がっていくのでは？という感触もありました。


## 登壇のデメリット
### 時間を失う
得られるものも大きい分消費する時間も大きく感じました。資料作りももちろんのこと、練習時間、イベントへの出張（日帰りだとしても丸一日使う）など家庭への負担はめちゃくちゃでかいなと感じました。
私は仕事意外にも、家庭の時間と趣味の時間にとても重きを置いているのでこのデメリットは正直かなり大きいなと感じています。

練習時間、本番の時間を失わずに済む技術記事の投稿を程よく混ぜることによって、自分の幸せにダメージのないようにアウトプット生活を充実させたいと思いました。


## まとめ
ジュニアエンジニアの私にとって、登壇することはとても良い経験で、これ以上ないくらいたくさんのことを学べました。JAWS-UGの文化はとても温かく、このコミュニティに長く関わっていきたいなと感じました。
純粋にめちゃくちゃ楽しかったです。

一方で取られる時間も非常に大きいことも理解しました。普段の生活の無駄を見直して時間を捻出しつつ、登壇一回我慢して技術記事2つ書く、などの工夫をちゃんとしていきたいなと思いました。
弱い自分でも走り続けられるペースをきちんと見極めて、コツコツとエンジニアとして成長していきたい。
fetch関数の内部的な挙動とResponseオブジェクト

今回は、fetch 関数の内部的な挙動と、Response オブジェクトについて見ていきます。
JavaScript の fetch API は、ブラウザでリクエストを簡単に行うためのものでしたね！

## fetch 関数の基本
fetch 関数は、ウェブサーバーにリクエストを送信して、レスポンスを受け取るために使います。
fetch を使うと非同期にデータを取得し、それを簡単に操作できます！

### 使用例

```js
const fetchUsers = async () => {
  // fetch でリクエストを送信
  const res = await fetch("https://jsonplaceholder.typicode.com/users/");
  // JSON データを取得
  const users = await res.json();
  console.log(users); // 取得したデータをコンソールに表示
};

fetchUsers();
```

fetch 関数が成功すると、Response というオブジェクトが返されます。
このオブジェクトには、レスポンスのいろいろな情報が含まれています。

#### Response オブジェクトの主なプロパティとメソッド
- **status**: HTTP ステータスコード（例: 200, 404）
- **statusText**: ステータスコードに対応するテキスト（例: "OK", "Not Found"）
- **ok**: ステータスが 200-299 の範囲内にある場合は `true`
- **headers**: レスポンスヘッダーを操作するための `Headers` オブジェクト
- **body**: `ReadableStream` として提供され、レスポンスのデータが含まれています。非同期的にデータが少しずつ読み取られます。
- **json()**: レスポンスボディを JSON としてパースします。プロミスを返すので、`then` や `await` でプロミスを解決しないと使えない `←よくみるやつ`
- **text()**: レスポンスボディをテキストとして返す
- **blob()**: レスポンスボディを Blob として返す
- **arrayBuffer()**: レスポンスボディを ArrayBuffer として返す


## fetch の内部的な挙動
それでは、fetch 関数がどのように動作するのか見ていきます！

```js
const res = await fetch("https://jsonplaceholder.typicode.com/users/");
```

この時点で、指定された URL にリクエストが送信され、リクエストが成功すると、Response オブジェクトが返されます。



### Response bodyの読み取り

```js
const users = await res.json();
```

res.json() を使って、Response の body 部分を JSON に変換します。このメソッドはプロミスを返し、非同期でデータが読み取られるのを待ちます。

:::note info
ReadableStream??(リーダブルストリーム？？)
ホースから水が出てくるように、少しずつデータを流してくれるものです。
データの受け取りは一度に全部ではなく、少しずつ非同期で（後から順々に）受け取ります。
res.json() は、ReadableStream からすべてのデータを非同期で読み取ってから JSON オブジェクトに変換することを保証してくれます！
:::

### JSON データの取得
それではもう一度具体的なコードを見てみます！

```js
const fetchUsers = async () => {
  try {
    const res = await fetch("https://jsonplaceholder.typicode.com/users/");
    // ステータスコードをチェック
    if (!res.ok) {
      throw new Error(`HTTP error! status: ${res.status}`);
    }
    const users = await res.json(); // レスポンスボディを JSON に変換
    console.log(users); // データをコンソールに表示
  } catch (error) {
    console.error('Fetch error:', error); // エラーハンドリングもしておく
  }
};

fetchUsers();
```

### まとめ

- fetch が返す Response オブジェクトには、ステータスコードやレスポンスボディが含まれている
- レスポンスボディは json(), text(), blob(), arrayBuffer() などのメソッドで読み取る
- これらのメソッドはすべてプロミスを返すので、プロミスを解決する必要がある

fetch と Response オブジェクトの関係を理解できたので、「これは一体何がどうなっているんだ...？」ということがなくなりました！データの取得は避けて通れないので、しっかり理解しておきましょう！
[Atcoder] プログラミング初心者が4か月で入緑した話

# 初めに
皆さんはじめまして、あじゃじゃと申します。
ABC361で緑コーダーになることができたので今後の精進のメモもかねて
緑になるまでにやったことを書こうと思います。

↓レートの推移はこんな感じです
![スクリーンショット 2024-07-07 015413.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3830299/7906b2e2-c6f0-c24c-7b8c-2a8452dc11c9.png)

# 自己紹介
* 大阪大学の基礎工学部のB2
* Atcoderを本格的に始めたのは今年の三月
* Atcoderを始めたころはPythonの基本的な文法が分かる程度
* AtcoderのIDはjuten

# 緑までにやったことその1-知識をつける
ABCのA,B問題はいわゆる"やるだけ"なのですぐにできるようになったのもあってか、「なんや、競プロちょろいやんけ」なんて思っていたのですが、C問題に取り組みだすとすぐに競プロの洗礼を浴びました。これはまずいと思い、本格的に勉強を始めました。知識を身に着けるため、つかった参考書は次の二つです。

## 1.アルゴリズム的思考力が身につく! プログラミングコンテストAtCoder入門(愛称：鹿本)
### 読んだ感想
Python,C++を始めたばかりのユーザーが対象者です。
一通りよめば、400～600パフォーマンスくらいは安定するかなと思います。
サンプルコードも読みやすいので、入門書として非常におすすめです。
が、正直次に挙げる本で事足りるので理解力に自信があれば飛ばしちゃっても大丈夫です。
[ここから買えます](https://www.amazon.co.jp/dp/B0B6MLQ43C?th=1&psc=1&linkCode=sl1&tag=atcoder08-22&linkId=aa3641baf3d89d6c3e735ec97d3e58cc&language=ja_JP&ref_=as_li_ss_tl)

## 2.競技プログラミングの鉄則(愛称：鉄則本)
### 読んだ感想
C++ユーザーが一番読みやすいと思います。ただ、どの言語のユーザーでもやることをおすすめします。かなり広い範囲のアルゴリズムについてカテゴリーごとに整理されており例題及び演習問題を解くことである程度の応用力も身に着けることができます。
正直今回の入緑はほぼほぼ、これのおかげです。
[ここから買えます](https://www.amazon.co.jp/dp/B0BDZGDM9J?th=1&psc=1&linkCode=sl1&tag=atcoder08-22&linkId=3b97a8d1a45d22d6404624ca16b76556&language=ja_JP&ref_=as_li_ss_tl)

# 緑までにやったことその2-早解き力をつける
その1で紹介した本を読みながら並行して行っていたのが「実装力の強化」です。個人的にこの能力は二つの領域に分けることができると思っており、それは「解法が生えてから実装を終えるまでが速さ」と「重実装をバグらせない能力」です。後者に関しては緑になるまでに困ったことはなかったので「早解き力」の強化にとりかかりました。主に取り組んだことは次の二つです。
### ABCコンテストの問題A,Bの過去問
実装速度を上げるには実装する回数をこなせばいいだろ！！！という単純な考えのもと、解法が一瞬で思いつくA,Bをたくさん解くことでアウトプットすることになれていきました。
### Atcoder Daily Trainingへの参加
Atcoder Daily Trainingとは毎週火、水、木曜日に開催されているABCコンテストのバーチャルコンテストです。Easy,Medium,Hard,Allにカテゴリーが分かれており、好きなカテゴリーに参加することができます。コンテストの時間も１時間と短いため参加しやすいように思います。
私は、簡単な問題の早解きに慣れることを目的にEasy、コンテストの空気感になれる目的でMediumに各週一回は最低でも参加していました。
# 今後水色になるためやること
1.EDPCを埋める
2.典型90問を埋める
3.そろそろ過去問を埋める
# 終わりに
つらつらとABCの練習について書いたけどARCでレートを400稼いでいるので全人類はマスターオブ整数をやってARCに特攻すべきだと思います。
Javaで「文字列に含まれる文字を大文字または小文字に変換する」の動作を確認してみた

# 概要

Javaで「文字列に含まれる文字を大文字または小文字に変換する」の動作を確認してみました。
以下のページを参考にしました。

https://www.javadrive.jp/start/string/index14.html

# 実装

以下のファイルを作成しました。
```JSample14_1.java
class JSample14_1{
  public static void main(String[] args){
    String str1 = "TeaCup";
    String str2 = "Ｍｏｕｓｅ";

    System.out.println(str1);
    System.out.println(str1.toUpperCase());
    System.out.println(str1.toLowerCase());

    System.out.println(str2);
    System.out.println(str2.toUpperCase());
    System.out.println(str2.toLowerCase());
  }
}
```

以下のコマンドを実行しました。
```
$ javac JSample14_1.java 
$ java JSample14_1 
TeaCup
TEACUP
teacup
Ｍｏｕｓｅ
ＭＯＵＳＥ
ｍｏｕｓｅ
```

# まとめ

何かの役に立てばと。
AlmaLinux9のKVM+Cockpit環境構築

AlmaLinuxにKVM環境を構築する機会が多いため、個人的な手順書として記載

# OSインストール

最小限のインストールを実施した。rootアカウントを作成する際にSSHでのログインを許可する。

# KVM環境構築手順

下記の通りコマンドを実行

```console
# systemctl enable --now cockpit.socket
# dnf install qemu-kvm libvirt virt-install cockpit cockpit-machines
# systemctl enable --now cockpit.socket
# grubby --update-kernel=ALL --args="intel_iommu=on"
# grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
# virt-host-validate
# vi /etc/cockpit/disallowed-users
```

`# vi /etc/cockpit/disallowed-users`ではrootアカウントでcockpitのWEB GUI画面にアクセスするため、下記のように設定変更

```diff_conf
# List of users which are not allowed to login to Cockpit
- root
+ #root
```

# WEB GUI画面操作

1. 「接続がプライベートではありません」と表示されるが、「詳細設定」⇒「192.168.X.Xに進む (安全ではありません)」の順にクリック
1. ログイン情報を入力しログイン
1. メニューにある「ツール　アプリケーション」をクリック
1. 更新ボタン（矢印が丸くなっているもの）をクリック
1. 「ストレージ」という項目が出てくるのでクリック

# 参考文献

- [AlmaLinuxにKVM仮想マシンを作成する](https://higmasan.com/almalinux/almalinux%e3%81%abkvm%e4%bb%ae%e6%83%b3%e3%83%9e%e3%82%b7%e3%83%b3%e3%82%92%e4%bd%9c%e6%88%90%e3%81%99%e3%82%8b/)
- [AlmaLinuxにCockpitをインストールする](https://higmasan.com/cockpit/install-cockpit-in-almalinux/)
- [1.7. root ユーザーとしてリモートマシンからの Web コンソールへの接続](https://docs.redhat.com/ja/documentation/red_hat_enterprise_linux/9/html/managing_systems_using_the_rhel_9_web_console/connecting-to-the-web-console-from-a-remote-machine-as-a-root-user_getting-started-with-the-rhel-9-web-console)
Pythonのrandom.sample, choicesの挙動

引数を適当に回していたらエラーすることがあったため備忘録として書きました。

### [random.sample](https://docs.python.org/ja/3/library/random.html#random.sample)
>母集団のシーケンスから選ばれた長さ k の一意な要素からなるリストを返します。値の置換を行わないランダムサンプリングに用いられます。

シーケンスから重複なしでk個選ぶ。シーケンスはリスト, タプル, 文字列のいずれか。

```python
random.sample([], k=0)    # []
random.sample([], k=1)    # エラー (ValueError)
random.sample([1], k=0)   # []
random.sample([1], k=1)   # [1]
random.sample([1], k=2)   # エラー (ValueError)
random.sample([1,2], k=0) # []
random.sample([1,2], k=1) # [1] or [2]
random.sample([1,2], k=2) # [1,2] or [2,1]
random.sample("abc", k=0) # []
random.sample("abc", k=1) # ['a'] or ['b'] or ['c']
random.sample("abc", k=2) # ['a','b'] or ['b','a'] or...
random.sample("abc", k=3) # ['a','b','c'] or ['b','a','c'] or... 
random.sample([1,2], counts=[1,2], k=2) # =random.sample([1,2,2], k=2)
```

### [random.choices](https://docs.python.org/ja/3/library/random.html#random.choices)

>population から重複ありで選んだ要素からなる大きさ k のリストを返します。population が空の場合 IndexError を送出します。

シーケンスから重複なしでk個選ぶ。シーケンスはリスト, タプル, 文字列のいずれか。

```python
random.choices([], k=0)    # []
random.choices([], k=1)    # エラー (IndexError)
random.choices([1], k=0)   # []
random.choices([1], k=1)   # [1]
random.choices([1], k=2)   # [1,1]
random.choices([1,2], k=0) # []
random.choices([1,2], k=1) # [1] or [2]
random.choices([1,2], k=2) # [1,1] or [1,2] or [2,1] or [2,2]
random.choices("abc", k=0) # []
random.choices("abc", k=1) # ['a'] or ['b'] or ['c']
random.choices("abc", k=2) # ['a','a'] or ['a','b'] or ['b','a'] or...
random.choices("abc", k=3) # ['a','a','a'] or ['b','a','a'] or...
random.choices("abc", weights=[1,0,0], k=3) # ['a','a','a']
random.choices("abc", weights=[0,0,0], k=3) # エラー (ValueError)
```

(Python 3.9.6)
Google Postmaster Toolsのコンプライアンスのステータス

## 「ワンクリックでの登録解除」 に異常が起こっている

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/caecef38-a2f3-b030-1fc0-22aa2eb1b8a6.png)

2024/4/24 時点では、「**近日提供予定**」になっていたようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/06e0feec-f84f-ed8d-d432-21fb08007c69.png)

その後、6月中旬くらいにワンクリックでの登録解除に対応したドメインには「**遵守**」が表示されていた。

ところが、6月下旬になって「遵守」しているはずのドメインで「**要対応**」が表示されるようになり、界隈がザワついた模様。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/90217/03eac616-3277-3859-5b62-3fe5ff2519c5.png)

そして、7月に入ってからまた「**近日提供予定**」に戻りましたとさ。

機能に異常が発生し、メンテナンスに入ったのかもしれませんね。
コードの良し悪しを判断する指標

引用文献

https://gihyo.jp/book/2022/978-4-297-12783-1

---

**コードの良し悪しを判断する指標**について言語化されていたので備忘録。。。



# コードの良し悪しを判断する指標
### 実行可能コードの行数
:::note
実行可能なロジックを含む行数が多いと、多くのことをやりすぎている可能性がある。
:::

適切なコード行数の一例（RuboCopのデフォルト設定）
| スコープ | 行数上限 |
| :---: | :---:|
| メソッド | 10行以内 |
| クラス | 100行以内 |

行数が多すぎる場合は、メソッドやクラスの分割を検討する。


### 循環的複雑度
:::note
コードの構造的な複雑さを示す指標で、条件分岐やループ回数が増える、ネストすると複雑さは増大する。
:::

複雑度は、早期returnなどのテクニックを駆使することで低減可能。


### 凝集度
:::note
モジュール内における、データとロジックの関係性の強さを表す指標。
:::

具体的には、**インスタンス変数**とそのインスタンス変数を用いる**ロジック**が同じクラス内に実装されていると凝集度が高いと言える。

### 結合度
:::note
モジュール間の依存の度合いを示す指標。
:::

依存しているクラスが多いほど、すなわち結合度が増大するほど多くの変更影響を考慮する必要がある、保守や仕様変更が困難になる。

### チャンク
:::note
クラス設計の際に、マジカルナンバー4を心がける。近年の認知心理学の研究において、人間の短期記憶は一度に4±1個の概念しか把握できないという説があり、この個数をマジカルナンバー4と呼ぶ。
この記憶個数の単位を**チャンク**と呼ぶ。
:::

クラス設計の際に、クラス内部で取り扱う概念が4±1個に収まるように設計し、大きなクラスは小さなクラスに分割する。
AtCoder 勉強記録[C++] その12

AtCoderで入茶を目指して勉強しています。
勉強を継続するために投稿を始めました。
もともとアカウントを作成していましたが、今年の4月から本格的に勉強を始めました。
一応自分用に解法を書いていますが雑です、自分で読み返して困ったら修正します。
[私のアカウント](https://atcoder.jp/users/nanami_brother)
[解いた問題](https://kenkoooo.com/atcoder/#/table/nanami_brother)
# 本日解いた問題
ABC361に参加した。A問題を2回`WA`した上にB問題以降解けなかった。もっと冷静に問題に向き合えるようにしたい。
## A - Insert
[A - Insert](https://atcoder.jp/contests/abc361/tasks/abc361_a)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  ll n, k, x, a;
  cin >> n >> k >> x;
  vec b(0);
  rep(i, n) {
    cin >> a;
    b.push_back(a);
    if(i == k - 1) b.push_back(x);
  }
  for (auto &i: b) {
    cout << i << ' ';
  }
}
```
### 解法
空の配列`b`を用意しておき、`A`の要素を追加していき`K`番目になったら`X`を追加してその後も`A`の要素を追加する。
## B - Intersection of Cuboids
[B - Intersection of Cuboids](https://atcoder.jp/contests/abc361/tasks/abc361_b)
解答
```c++
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using vec = vector<ll>;
#define rep(i, n) for (int i = 0; i < (int)(n); i++)

int main() {
  vec a(6), b(6);
  rep(i, 6) cin >> a[i];
  rep(i, 6) cin >> b[i];
  bool jud1 = false, jud2 = false, jud3 = false;
  if(!(a[3] <= b[0] || a[0] >= b[3])) jud1 = true;
  if(!(a[4] <= b[1] || a[1] >= b[4])) jud2 = true;
  if(!(a[5] <= b[2] || a[2] >= b[5])) jud3 = true;
  if(jud1&&jud2&&jud3) cout << "Yes" << endl;
  else cout << "No" << endl;
}
```
### 解法
判定するための変数を用意しておき、x,y,z軸すべてにおいて変数の共通部分が正であるときに`Yes`、そうでないときに`No`を出力する。
MacのDockerでdifyを起動するとpermission deniedになるときの対処

MacでDifyを試してみようとして、`docker compose up`したらログに`permission denied`と出力されて使用できない方はこの記事に書いてあることを試してみてください。

# UIDとGIDを確認

先に`id`コマンドを実行してユーザーID(UID)とグループID(GID)を取得します。

```zsh
$ id -u
100
$ id -g
50
```

# docker/docker-compose.yamlを修正

docker/docker-compose.yamlを開き、`api:`と`worker:`と`db:`と`redis:`と`weaviate:`の直後に`user: "100:50"`を記入します。

100の部分はUID、50の部分はGIDです。

```diff
diff --git a/docker/docker-compose.yaml b/docker/docker-compose.yaml
index d94753230..77d0f7a7a 100644
--- a/docker/docker-compose.yaml
+++ b/docker/docker-compose.yaml
@@ -161,6 +161,7 @@ x-shared-env: &shared-api-worker-env
 services:
   # API service
   api:
+    user: "100:50"
     image: langgenius/dify-api:0.6.12-fix1
     restart: always
     environment:
@@ -181,6 +182,7 @@ services:
   # worker service
   # The Celery worker for processing the queue.
   worker:
+    user: "100:50"
     image: langgenius/dify-api:0.6.12-fix1
     restart: always
     environment:
@@ -209,6 +211,7 @@ services:
 
   # The postgres database.
   db:
+    user: "100:50"
     image: postgres:15-alpine
     restart: always
     environment:
@@ -226,6 +229,7 @@ services:
 
   # The redis cache.
   redis:
+    user: "100:50"
     image: redis:6-alpine
     restart: always
     volumes:
@@ -314,6 +318,7 @@ services:
 
   # The Weaviate vector store.
   weaviate:
+    user: "100:50"
     image: semitechnologies/weaviate:1.19.0
     profiles:
       - ''

```

# 起動できるか確認

`docker compose up`して起動してみましょう。

Webブラウザで`http://localhost`を開くとDifyが表示されると思います。

# 参考にした issue

https://github.com/langgenius/dify/discussions/4822
【サーバ仮想化技術】IBM PowerのLPARプロファイルについて

## 仮想化の主な種類

### ハードウェア仮想化（サーバー仮想化）
 例：VMware ESXi, Microsoft Hyper-V, KVM　, IBM Power(商用製品)
 物理マシン上で複数の仮想マシン（VM※製品によってはLPARとも言われたり）を動作させる技術。

### OSレベルの仮想化（コンテナ仮想化）
 例：Docker, Podman, LXC
 OSのカーネルを共有し、軽量なコンテナ環境を提供する技術。

### ネットワーク仮想化
 例：VLAN,vSwitchなど
 物理ネットワークを抽象化し、仮想ネットワークを作成する技術。

## 2. コンテナ技術とDockerの登場
　従来の仮想化技術（VM）では、OSごとに仮想環境を作成するため、リソース消費が大きくなりがちでした。一方、コンテナ技術はホストOSのカーネルを共有しながら、独立したアプリケーション環境を提供するため、軽量で高速に動作するのが特徴です。
　Dockerは、コンテナ技術の代表的な実装の一つであり、開発・運用の効率化を大幅に向上させました。





## 区画プロファイルとは

 区画プロファイルは、IBM Powerシステムで使用される設定ファイルで、各論理区画（LPAR）の構成情報を記録しています。この設定ファイルは、ハードウェア管理コンソール（HMC）上で管理されます。
具体的な役割


区画プロファイルには、以下の情報が含まれます：

- プロセッサー：割り当てるCPUの数
- メモリ：割り当てるメモリの量
- I/Oリソース：入出力のためのリソース

これらの情報をもとに、論理区画がどのように動作するかが決まります。

### VMwareとの比較
 VMwareで仮想マシンを作成するとき、CPUやメモリ、ストレージの設定を行いますよね。区画プロファイルは、これと非常に似ています。VMwareで仮想マシン（VM）のリソースを設定するのと同じように、区画プロファイルを使って論理区画のリソースを設定します。

### 区画プロファイルの活用例

リソースの割り当て：例えば、4つのCPUを持つサーバーがあり、区画プロファイルAで3つのCPUを割り当て、区画プロファイルBで2つのCPUを割り当てたとします。この場合、両方の区画プロファイルを同時に有効にしようとすると、CPUの数が足りなくなるため、Bの論理区画は起動に失敗します。これは、VMwareで仮想マシンに過剰なリソースを割り当てようとしたときと同様です。

- 動的なリソース変更：HMCを使用して、現在の論理区画の構成を区画プロファイルとして保存できます。これにより、動的に行ったリソース変更を反映させ、次回の起動時にも同じリソース構成を維持できます。

### 注意点

- オーバーコミットのリスク：HMCは他の区画プロファイルが使用しているリソースを考慮しないため、リソースがオーバーコミットされる可能性があります。VMwareでも、ホストのリソースを超えて仮想マシンを作成すると、パフォーマンスに問題が発生することがあります。

- 自動起動設定：区画プロファイルを設定すると、次回のシステム起動時に自動的に論理区画を起動することも可能です。これも、VMwareでホスト再起動時に仮想マシンを自動的に起動する設定と似ています。

# 結論

区画プロファイルは、IBM Powerシステムで論理区画(VM:仮想サーバ)を効率的に管理するための設定ファイル。
VMwareで仮想マシンのリソースを設定するのと同じように、区画プロファイルを使って論理区画のリソースを設定し、効率的に運用することができます。これにより、システムのパフォーマンスを最大化し、安定した運用を実現することが可能です。
[JavaScript] DOM

# 目次
- [まとめ](#まとめ)
- [詳細](#詳細)
- [活用例1](#活用例1)

# まとめ
- **DOM（Document Object Model=ドキュメントを物として扱うモデル）**：プログラム（JavaScript）からHTMLやXMLを自由に操作するための仕組み、データ構造
DOMツリーという階層構造を定義しているものがDOMという仕組み
- **Node**：DOMツリー（オブジェクトツリー）を構成する一つ一つの要素
- **Element**：Nodeの種類の一種（Element型Node）

# 詳細
## DOM
1. **プログラム（JavaScript）からHTMLやXMLを自由に操作するための仕組み、データ構造**
JavaScriptからHTMLドキュメントに要素を追加したり、ボタンクリック時のイベントを登録したり、スタイルや属性を変更したり、要素のサイズや位置を取得したり、こういったものはすべてDOMのAPIを使うことで操作できる。
1. **DOMツリー（オブジェクトツリー）という階層構造を定義しているものがDOMという仕組み**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2955010/0d95c62f-6494-565b-0dce-d7290da44e62.png)




# 活用例1
JavaScriptを使用してDOMを操作し、HTML文書の内容を動的に変更します。

~~~html:index.html
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>DOM操作の例</title>
</head>
<body>
    <h1 id="title">初期タイトル</h1>
    <button id="changeButton">タイトルを変更</button>

    <script src="script.js"></script>
</body>
</html>
~~~

~~~js:script.js
document.addEventListener("DOMContentLoaded", function() {
    // ボタンのクリックイベントを設定
    document.getElementById("changeButton").addEventListener("click", function() {
        // h1要素を取得
        var titleElement = document.getElementById("title");
        
        // h1要素のテキストを変更
        titleElement.textContent = "変更されたタイトル";
    });
});
~~~

## 解説
### HTML
- `h1`要素にIDを付与して特定の要素を簡単に取得できるようにしています（`id="title"`）
- `button`要素にもIDを付与して、JavaScriptからアクセスできるようにしています（`id="changeButton"`）
- `script`タグで外部JavaScriptファイルを読み込んでいます（`src="script.js"`）

### JavaScript
- `DOMContentLoaded`イベントを使って、HTMLが完全に読み込まれてからスクリプトが実行されるようにしています
- `getElementById`メソッドで、IDが`changeButton`のボタン要素を取得し、クリックイベントリスナーを追加しています
- ボタンがクリックされると、IDが`title`の`h1`要素を取得し、その`textContent`を変更しています


# 参考リンク
- [JavaScript初心者でもすぐわかる！DOMとは何か？](https://eng-entrance.com/what-is-dom)
MongoDBについて調べてみた

最近、CMS刷新の会話をすることがあり、そのサイトではMongoDBを利用しているとのことでした。NoSQLについては今までRedisくらいしか使用したことがなかったので、この際、MongoDB、NoSQLについて調べてみることにしましたので、その結果をレポートします。

# MongoDBとは
MongoDBとは、NoSQLに分類されるデータベースの1つです。データベースというと、一般的に知られているのがRDB（リレーショナル・データベース）です。Oracle Database、MySQL、SQLServer，PostgreSQLなどが有名です。RDB以外のデータベースを、NoSQL（Not Only SQL）と言います。
NoSQLとは「SQLだけはない（Not Only SQL）」で、「SQLに変わる存在」という意味を含んでいるそうです。

# NoSQLの特徴
近年、Webサイトのコンテンツ（静止画、動画）の量は増大化し、かつ、膨大なアクセス数が集中することで、サーバーの負荷が増加しています。
RDBによるデータの管理では、サーバー台数を増やす（水平スケールアウト）が難しく、DBサーバーのスペックを高速化するしか対応手段がありませんでした。そこで、登場したのが、NoSQLでした。

NoSQLが生まれた歴史的背景からみても、NoSQLの特徴はRDBの不満を解決するものになっています。特徴を列挙してみます。
* スキーマレス
* トランザクションがない
* 水平スケールアウトが容易
注）MongoDBはテーブル結合ができます

## スキーマレスとは
スキーマレスとは、スキーマがないということで、固定されたスキーマやテーブル構造を必要としません。
RDBでは、予め決めたスキーマ（テーブル）にデータが格納されます。しかし、MongoDBでは、データをJSON形式で保持します。テーブルの項目を定義しないため、アプリケーションの要件が変更になっても、データベースの構造を簡単に変更することができます。
スキーマレスであるため、リレーションという考え方もありません。

## トランザクションがない、とは
RDBはACID特性を持ち、トランザクションを使用することで、データの一貫性を保ちます。トランザクションは必ず結果を返却します。成功した場合はデータが更新され、エラーになった場合は、ロールバックされ、データは元の状態に戻ります。
NoSQLはトランザクションをサポートせず「結果整合性」という考え方に基づいてデータ処理を行います。結果整合性とは、即座にデータが反映されることを前提とせず、結果的に(実際に読み込まれる時までに)一貫性が保証されていればよいという考え方になります。
また、NoSQLは、水平スケールアウト（サーバーを増やすこと）を容易に出来きます。トランザクションはサーバーを跨ぐことは出来ない、ということもありません。

## 水平スケールアウトが容易
RDBでは、処理能力を向上させるには、サーバーのCPU・メモリを増強させるか、リードレプリカを作成し、読み取り速度を向上させる、といった方法をとります。
NoSQLでは、サーバーをほぼ無制限に増やすことができるため、水平スケールアウトが容易と言えます。

## NoSQLが得意なシステムは
NoSQLは柔軟性やスケーラビリティが容易であるため、リアルタイムでの大量データ処理、非構造化データの取り扱い、高速な読み書きが必要とされるアプリケーションなどで活用が期待されています。
具体的には、
* ソーシャルメディア（SNS等）
* ECサイト
* BIなどのデータ分析
* モバイルアプリケーション
などが挙げられます。

## NoSQLであるMongoDBとは・・・
NoSQLにも色々な種類のデータベースが存在していますが、MongoDBは「ドキュメント型」データベースになります。ドキュメント型とは、JSONのようなドキュメント形式でデータを保存するという意味です。

ちなみに、JSONとは、「JavaScript Object Notation」を略した言葉で、JavaScript用に作られたテキストでのデータ形式の１つです。XMLよりも記述が簡単なため、近年、より多く使われるようになってきたデータ形式になります。

このため、JSONに似た形式のドキュメントでデータを保存・処理することから、複雑な形式のデータを扱いやすく、ドキュメント形式であるため、動的かつ柔軟に扱うデータの形式を変えることもできます。

MongoDBの名前は、英単語の『humongous』（ばかでかい、巨大な）に由来しています。そのことからも、大容量のデータを扱いのに適したデータベースと言えるかもしれません。

また、MongoDBはMongoDB社（元 10gen社）が開発し、オープンソースとして提供されています。

# 最後に
NoSQL、MongDBについて調べてみて、システムが扱うデータの特定を見極め、RDBが良いのか、NoSQLが良いのか、はたまた、RDBとNoSQLの両方を利用するのがよいか、を検討することが良いのだと思いました。
次回は、MongDBをローカルに構築し、データのやり取りの方法を確認してみたいと思います。
jQuery　課題

お疲れ様です。

自己紹介ページは一旦置いといて、jQueryの勉強と課題提出を行ってきました。

昨日学んだのは属性フィルタでした。
今日は .on()メソッドを使ってイベント処理をする内容でした。
![63.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/9591fa84-03a2-da0a-4a12-feb4a6182985.png)

![64.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/139e4b25-1c92-b7b9-d275-c65450ef58b6.png)
長いコードのようではありますが、実際は 'click' の時の処理内容、 'dblclick' の時の処理内容が縦に並んでいるだけですので、すべてが続いているわけではありません。

この他にもイベントの種類として、 keydown や load などいろいろあるようです。
定期的に出てくるような気がするので、暗記までしなくても意味が分かるようにしておいた方がよさそうですね。
<br>
そして提出してきました課題の内容は、「イベント処理を使用してコンソール内容を変更する」というものです。
条件として、load、scrollを使ってイベントが発生した際、コンソールの内容が変化するようにというものがありました。
課題を読みながら、これかなー？と考えているものはありましたので、30分くらいでできたと思います。
![66.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/04862365-3b10-2c54-ee7e-c3e2fb0c367a.png)

![65.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/275d5476-8719-dd38-fab8-71b2e3446ffe.png)
提出してきたものが上の画像です。
こういうことなのだろうと思うのですが、合格はいただけるのでしょうか…。
プログラムのランダムについて思ったこと（重箱の隅的なポエム）


## 前書き

* 疑似乱数の話をしている
* 疑似乱数と乱数の違いは各自ググって
* ぶっちゃけどうでもいい重箱の隅の話
* くどい言い回しをしているのは曲解されるとダルいから

## 本文1

簡単のため、JavaScriptのMath.randomを使って考える。

この関数は0以上1未満の浮動小数点数を返す。

仮に0～2の数をランダムに返す関数が欲しい場合、以下のようにして実装できる。

```js
function random3() {
    return Math.floor(Math.random() * 3);
}
```

で、私はふと

0～2の数がそれぞれ1/3の確率で出現していないのではないだろうか？

と思った。

何故か。

疑似乱数だからだ。

実用的な疑似乱数は非常に長い周期性があるので、全く気にする必要はないが、周期性があることは確かだ。

仮にMath.randomが乱数を100個生成すると、一番最初の乱数に戻るとする。

これを先ほど私が作ったrandom3で以下のように振り分けられるとする。

Math.randomの周期に現れる全100個の乱数のうち、33個がrandom3で0に変換される。
Math.randomの周期に現れる全100個の乱数のうち、33個がrandom3で1に変換される。
Math.randomの周期に現れる全100個の乱数のうち、34個がrandom3で2に変換される。

このとき、0～2の確率はそれぞれ33/100、33/100、34/100となる。
これは厳密には1/3の確率にはなっていない。

まあ、重箱の隅だが。

## 本文2

先ほどは0～2の範囲で考えたが、では0～98の範囲ではどうだろうか？

これは以下のように実装できる。

```js
function random99() {
    return Math.floor(Math.random() * 99);
}
```

で。

仮にMath.randomが乱数を100個生成すると一番最初の乱数に戻るとする。（大事なので何回でも同じことを言う）

これを先ほど私が作ったrandom99で以下のように振り分けられるとする。

Math.randomの周期に現れる全100個の乱数のうち、1個がrandom99で0に変換される。
Math.randomの周期に現れる全100個の乱数のうち、1個がrandom99で1に変換される。
Math.randomの周期に現れる全100個の乱数のうち、1個がrandom99で2に変換される。
…
Math.randomの周期に現れる全100個の乱数のうち、1個がrandom99で97に変換される。
Math.randomの周期に現れる全100個の乱数のうち、2個がrandom99で98に変換される。

このとき、0～98の確率はそれぞれ1/100、1/100、…、1/100、2/100となる。
これは厳密には1/99の確率にはなっていない。

**で、だ！**

98の出現確率が他の数値よりも2倍も高くなっている！

たかが1/100の2倍とあなどるなかれ。
麻雀で例えれば、4枚待ちと8枚待ち、1枚待ちと2枚待ちくらいなもんだ。
2倍というのは偉いのだ。

これは確率としてよいのだろうか？

と思った。

終わり。

実際のところ、プログラムで使われる疑似乱数の周期は非常に長いので、これが実務で問題になることはないでしょうけどね！
git pushまでの手順(コンフリクトなし版）

# 目的
業務効率化資料

# 背景 
今回は、昔プッシュしていたJavaコードに対して、Java17機能でsealedの対応が
新たに加わったため、コードの修正対応をしてみました。

# コマンドで覚えるGit編 
> （★印はポイントになります）
```terminal
PS C:\work\javaProgramSample\src\demo> git status    （★）                                                                      
On branch main
Your branch is up to date with 'origin/main'.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   sample1/Rectangle.java
        modified:   sample1/Shape.java
        modified:   sample1/Triangle.java
        (＊ステージングされていないファイルは赤くなります）

no changes added to commit (use "git add" and/or "git commit -a")
PS C:\work\javaProgramSample\src\demo> git add sample1/Rectangle.java  （★）
PS C:\work\javaProgramSample\src\demo> git add sample1/Shape.java  （★）
PS C:\work\javaProgramSample\src\demo> git add sample1/Triangle.java  （★）
PS C:\work\javaProgramSample\src\demo> git status （★git add できていると緑色になる）
On branch main
Your branch is up to date with 'origin/main'.

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   sample1/Rectangle.java
        modified:   sample1/Shape.java
        modified:   sample1/Triangle.java

PS C:\work\javaProgramSample\src\demo> git commit -m "Java17対応  sealed付与" （★）
[main 6310f1b] Java17蟇ｾ蠢・ sealed莉倅ｸ
 3 files changed, 3 insertions(+), 3 deletions(-)
PS C:\work\javaProgramSample\src\demo> git push （★）
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 4 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 601 bytes | 601.00 KiB/s, done.
Total 6 (delta 4), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (4/4), completed with 4 local objects.
To https://github.com/xxxxxx/xxxx.git
   d8e4da7..6310f1b  main -> main
PS C:\work\javaProgramSample\src\demo> 
```

# おまけ

> tig コマンドを使うと以下のように、一覧で視覚化してくれるのでおすすめです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/aa6ace8d-e6ec-3ec3-b2c8-73930487f382.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/a00220f5-24a6-3c27-0391-987e5a8beceb.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/7cfdfa89-e451-0f38-d69a-b049aa605318.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/57249/fd1fd99d-b6b2-366e-82ad-92b13ff65a78.png)
Github Topicsでレポジトリ探し

## レポジトリ探しの今まで
githubの右上にある検索欄からキーワードを入力し、ヒットしたレポジトリを順番に閲覧していた

## Github Topics
https://github.com/topics
Topics から検索することで、より適切なレポジトリが検索できる（気がする）

画像のプレビューがあるため、テーマ探しなどの際にはかなり便利だと思った
https://github.com/topics/neovim-colorscheme


Topics のほかにも Explore で関心がありそうなものをピックアップしてくれたり、 Trending で人気のあるレポジトリを言語や日付で絞り込んでリストアップしてくれたりする


レポジトリ探しの際には、活用していきたい
シェルスクリプトでホームディレクトリを指定する方法

簡単なことなのだろうけれど、知らなくてハマったので記録。

# 環境

- Debian Testing ( Debian 13 : 2024/07/06 時点 )

# 問題のシェルスクリプト

```
#!/bin/sh
FILE="~/.config/gnome-initial-setup-done"
echo $FILE

while [ ! -e $FILE ]
do 
  sleep 1
done
echo "done of gnome-initial-setup"

```
gnome-initial-setup-done ファイルが生成されたら echo するプログラム。

しかしながら走らせていても ファイルを検出しない。

3行目の `echo $FILE`

の出力も
```
~/.config/gnome-initial-setup-done
```
問題ないように見える。

# 修正


```
FILE=~/.config/gnome-initial-setup-done
```
ないし
```
FILE=~/".config/gnome-initial-setup-done"
```
ないし
```
FILE="${HOME}/.config/gnome-initial-setup-done"
```

# 理由

チルダの展開は、シェルが行っているけれどもクォートなどで囲うと展開せずに処理される。

ワイルドカードなどと同じですね。


知らなかったので、1~2時間ぐらい悩んでしまいました。
【ROS】sensor_msgs/Imuメッセージを扱うときに注意すべきポイント

お疲れ様です。秋並です。

今回は、ROSの「sensor_msgs/Imuメッセージ」を扱う際に注意すべきポイントを紹介します。

ちなみに、今回紹介することはImuメッセージの公式ドキュメントに書いてあります。

# ポイント1：加速度の単位はm/s^2

 「加速度：`linear_acceleration` 」に格納する加速度の単位はm/s^2になります。

使用するIMUモジュールによってはG単位で加速度が取得されるため、その場合は単位変換してから格納する必要があります。
<br>

Gに重力加速度（≒9.8）を掛けるとrad/s^2に変換できます。

```cpp
msg.linear_acceleration.x = acc_g_x * 9.8F
msg.linear_acceleration.y = acc_g_y * 9.8F
msg.linear_acceleration.z = acc_g_z * 9.8F
```

# ポイント2：角速度の単位はrad/s

「角速度： `angular_velocity` 」に格納する角速度の単位はrad/sになります。

<br>
degree/sec に π/180.0 を掛けると rad/sec に変換できます。<br>

:::note 
割り算は計算量が大きいので、下コードのように π/180.0 の計算結果である0.017453を掛けることが一般的です。
:::

```cpp
msg.angular_velocity.x = gyro_degree_x * 0.0174533F
msg.angular_velocity.y = gyro_degree_y * 0.0174533F
msg.angular_velocity.z = gyro_degree_z * 0.0174533F
```

# ポイント3：取得できない要素は、共分散の0番目に-1を代入

IMUの種類によっては、「姿勢： `orientation` 」「加速度：  `linear_acceleration`」「角速度： `angular_velocity` 」のうち、一部の情報が取得できない場合があります。

<br>

例えば、「姿勢： `orientation` 」を取得できないような場合は、対応する共分散行列の0番目の要素に-1を代入することで、 
- **`orientation` は無効値である**

ということを示します。

```cpp
msg.orientation_covariance[0] = -1 // orienationは無効値であること示す
```

# ポイント4：姿勢はクォータニオン

ROS2では、基本的にクォータニオンで姿勢を示すため、Imuの「姿勢： `orientation` 」もオイラー角ではなく、クォータニオンで示す必要があります。
<br>

オイラー角→クォータニオンへの変換は、元のオイラー角の回転の順番によります。
詳しくは下記記事を参照してください。

https://qiita.com/aa_debdeb/items/3d02e28fb9ebfa357eaf

# さいごに

今回は、Imuメッセージを扱う際の注意点を紹介しました。

navigation2などのパッケージと連携させてImuメッセージを扱う場合は、この辺りが間違っていると正しく動作しないので注意しましょう。

# 一言

公式ドキュメントは確認しよう！

# 参考サイト

https://docs.ros.org/en/noetic/api/sensor_msgs/html/msg/Imu.html

https://choreonoid.org/ja/manuals/latest/ros/tank-tutorial/step4.html
eleganttで祝日を考慮したガントチャートを作成する

７月と言えば海の日がありますが、祝日があるととスケジュール管理が面倒ですね。

[elegantt](https://github.com/usop4/elegantt)は少ないコード量でガントチャートが描けるライブラリですが、ちょっとした工夫で祝日に考慮したガントチャートを生成することができます。この方法はeleganttに限らず、祝日を扱う一般的な方法だと思いますので、ぜひ参考にしてみてください。

まず、変更前のコードから。カレンダーがすぐ確認できるようGoogle Colab上でIpythonを使って表示させています。祝日を考慮していないので海の日が完了日になってますね。

```python
import elegantt
from IPython.display import display

g = elegantt.EleGantt()
s = """
プロジェクトA: 2024-07-08,3d
プロジェクトA2: 3d
"""
g.auto_draw(s)
display(g.im)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/bc9e7a20-2ccc-d0fe-9ae5-74583fcab85b.png)


これに対してholidaysという祝日を取得できるライブラリを使って、祝日対応させてみます。

https://python-holidays.readthedocs.io

まずholidaysで「JP」の祝日を設定し、pandasのdate_rangeとtolistで作った連続した日付のリストに対して祝日か否かを判定し、祝日の場合はmy_holidaysに加えます。

```python
import holidays
import pandas as pd

jp_holiday = holidays.country_holidays('JP')
my_holidays = []
days = 10

date_list = pd.date_range(
    start=pd.Timestamp("today").normalize(),
    end=pd.Timestamp("today")+pd.Timedelta(days=days)
).tolist()

for date in date_list:
  if date in jp_holiday:
    print(date, jp_holiday.get(date))
    my_holidays.append(date.strftime('%Y-%m-%d'))
  else:
    print(date)

print(my_holidays)
```

実行すると下記のように出力します。なお、これは7月6日に実行したからこうなりますが、祝日がない時期に実行する場合は`pd.Timestamp("today")`という箇所を`pd.Timestamp("2024-07-06")`に書き換えれば同じように出力されます。

```
2024-07-06 00:00:00
2024-07-07 00:00:00
2024-07-08 00:00:00
2024-07-09 00:00:00
2024-07-10 00:00:00
2024-07-11 00:00:00
2024-07-12 00:00:00
2024-07-13 00:00:00
2024-07-14 00:00:00
2024-07-15 00:00:00 Marine Day
2024-07-16 00:00:00
['2024-07-15']

```

サンプルなのでdays=10としましたが実際は365日ぐらい設定しておいた方がいいと思います。

こうして生成したmy_holidaysをeleganttのset_holidaysで指定すれば、祝日を考慮したガントチャートが手軽に生成できます。

```python
g.set_holidays(my_holidays)
g.auto_draw(s)
display(g.im)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33389/303bae46-7380-00bb-953e-de1551f37ff2.png)


なお、会社の創立記念日などカレンダーに乗ってない祝日を設定したい場合はmy_holidaysに下記のように設定しておき、holidaysで判定した結果をappendすれば動作します。

```python
my_holidays = ["2024-07-10"]
```

韓国語版はこちら。

https://velog.io/@usop4/eleganttholidays
IAMの基本

# AWS IAM（Identity and Access Management）について

## はじめに
AWS IAM（Identity and Access Management）は、AWSリソースへのアクセスを安全に管理するためのサービスです。IAMを使用することで、ユーザーやグループに対して適切なアクセス権限を付与し、AWSリソースのセキュリティを強化することができます。

この記事では、IAMの基本概念、主要な機能、および簡単な使用例について説明します。

## IAMの基本概念

### ユーザー
IAMユーザーは、AWSアカウント内の個々のエンティティを表します。ユーザーには、AWSリソースへのアクセス権限を付与することができます。

### グループ
IAMグループは、複数のユーザーをまとめて管理するためのものです。グループに対してアクセス権限を設定することで、グループ内のすべてのユーザーに同じ権限を付与することができます。

### ロール
IAMロールは、特定のAWSリソースに対して一時的なアクセス権限を付与するためのものです。ロールは、他のAWSサービスや外部のユーザーに対しても使用できます。

### ポリシー
IAMポリシーは、ユーザー、グループ、ロールに対してアクセス権限を定義するためのJSON形式のドキュメントです。ポリシーを使用して、どのリソースに対してどのような操作が許可されるかを指定します。

## IAMの主要な機能

### ユーザーとグループの管理
IAMを使用すると、AWSアカウント内のユーザーとグループを簡単に作成、管理することができます。ユーザーごとに個別のアクセスキーやパスワードを設定し、グループに対して共通のポリシーを適用することができます。

### ロールの作成と管理
IAMロールを作成して、特定のAWSリソースに対して一時的なアクセス権限を付与することができます。ロールは、他のAWSサービスや外部のユーザーに対しても使用できます。

### ポリシーの作成と適用
IAMポリシーを作成して、ユーザー、グループ、ロールに対してアクセス権限を定義することができます。ポリシーは、JSON形式で記述され、詳細なアクセス制御を行うことができます。

## IAMの使用例

### ユーザーの作成
以下の手順でIAMユーザーを作成します。

1. AWSマネジメントコンソールにログインします。
2. IAMダッシュボードに移動します。
3. 「ユーザーを追加」ボタンをクリックします。
4. ユーザー名を入力し、アクセスの種類を選択します（プログラムによるアクセス、AWSマネジメントコンソールへのアクセス）。
5. 必要に応じて、ユーザーに対してポリシーを適用します。
6. ユーザーの作成を完了します。

### ポリシーの作成
以下の手順でIAMポリシーを作成します。

1. IAMダッシュボードに移動します。
2. 「ポリシーを作成」ボタンをクリックします。
3. ポリシージェネレータを使用して、ポリシーを作成します。
4. ポリシーのJSONドキュメントを編集して、詳細なアクセス制御を設定します。
5. ポリシーの作成を完了します。

### ロールの作成
以下の手順でIAMロールを作成します。

1. IAMダッシュボードに移動します。
2. 「ロールを作成」ボタンをクリックします。
3. ロールの使用ケースを選択します（例：AWSサービス、他のAWSアカウント）。
4. ロールに対してポリシーを適用します。
5. ロールの作成を完了します。

## まとめ
AWS IAMは、AWSリソースへのアクセスを安全に管理するための強力なツールです。ユーザー、グループ、ロール、ポリシーを適切に設定することで、AWS環境のセキュリティを強化し、効率的なアクセス管理を実現できます。

この記事が、IAMの基本概念と主要な機能について理解を深める一助となれば幸いです。ぜひ、実際にIAMを使用して、AWSリソースのアクセス管理を行ってみてください。
LaravelのEloquentを使ったデータベースからのデータ取得方法の違い

# データベースからのデータ取得方法の違い
Eloquentを使ったデータベースからのデータ取得をしてViewにて表示させようとした際に

```php
// UserController.php

public function index()
{
    $user = User::where('use_id', 1)->get();
    return view('users.index', compact('user'));
}
```
```php5
//users/index.blade.php

<h1>{{ $user->user_id }}</h1>
```
エラーメッセージ「プロパティ [user_id] はこのコレクション インスタンスに存在しません。」が表示される。
これは$userがコレクション（配列）であり、単一のオブジェクトではないためで、いままでgetメソッドは取得の際に単一オブジェクトを返すものと思っていた・・・

```php
// UserController.php

public function index()
{
    $user = User::where('use_id', 1)->first();
    return view('users.index', compact('user'));
}
```
```get```から```first```メソッドに変更することで単一オブジェクトとして取得。
メソッド使用の際は取得形をよく確認して行うこと。


https://readouble.com/laravel/8.x/ja/collections.html#method-get
文字列のsubstringとlengthの使用

# substringとlengthの使用

- ### substring
このメソッドは、開始インデックから終了インデックスまでの手前まで、また、終了インデックスが記載されていない場合は、文字列の最後までを返すメソッドです。

例えば、
```javascript
const abc = 'abcd'
console.log(abc.substring(1,3))
// 結果　bc

console.log(abc.substring(0))
//結果　abcd
```
となります。

- ### lengthとの併用
length自体は文字の数をカウントするため、最初の文字は0からではなく、1からスタートされます。


例えば、以下のコードにおいて、最後の文字を出力したい場合は

```javascript
const abc = 'abcd'

console.log(abc.substring(abc.length -1) )
//結果　d

console.log(abc.substring(abc.length -2))
//結果　cd
```
となります。

- ここで私が疑問に感じたのは、「－」が何を意味しているのかという事でしたが、ここは単純に、変数に代入されている値の最後からカウントしているというだけの事でした
議論が収束しない問題への対処法

# 議論とは
- 主張と、それを支える理由とデータから構成される。イメージは以下の図。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1081780/3dfe69f3-7ab4-24ac-beba-04e741ecc6da.png)

- 反論は相手の言っていることを否定することである。反論には2種類があり、**主張型反論**と**論証型反論**である。主張型反論とは、相手の主張とは反対の主張をすることである。
(例：原案が「全社員毎日出社すべきである」ならば、主張型反論は「出社かリモートワークかは選べるようにすべきである」など)
論証型反論とは、相手の理由/データが間違っているあるいは理由が主張を支えていないと突くことである。
(例：原案が「全社員毎日出社すべきである。なぜならオフィスの方がコミュニケーションは円滑になり、全体の生産性が上がるからだ」だとする。すると、論証型反論は「オフィスでコミュニケーションが円滑になっても、生産性は上がらない。なぜなら必要な話し合いはオンライン会議やチャットでできるし、オフィスだとムダ話が増えるからだ。」などがありうる)

# 議論が収束しない要因
2つありうる。
1. 論点がずれたまま、議論が進む
2. 議論が平行線になる

# 1. 論点がずれたまま、議論が進む問題への対処法
対処法は以下の通り。
1-1.論点を的確にとらえる
1-2.論点がずれないように予防する
1-3.論点がずれたら元の論点に戻す

## 1-1.論点を的確にとらえる
- 論点となりうるのは、3種類である。
    - 根拠と主張の結びつきは妥当か
    - 主張の言う通りのメリット/デメリットがあるか
    - そのメリット/デメリットがあるならどの程度か	

- これらを具体的なケースで確認してみる。例えば、次のような主張と根拠があったとする。「もともとリモートワークを許可していたが、今後は全社員が出社すべきである。なぜなら、オフィスでは相手の様子が見え、相手が話せる状態かが分かる。それゆえ、より迅速に必要なコミュニケーションをとることができる。その結果、コミュニケーションは円滑になり、全体の生産性が上がるからだ。」この場合の論点は以下のようになる。
    - 「オフィスにいたら、相手が話せる状態なのか分かる」は本当か？
    - 「相手が話せる状態かが分かれば、より迅速に必要なコミュニケーションをとることができる」は本当か？
    - 「より迅速に必要なコミュニケーションをとることができれば、全体の生産性が上がる」は本当か？
    - その生産性はどれほど上がるのか？

## 1-2.論点がずれないように予防する
- 論点がずれるとは、**目下で扱っていない論点について論証型反論をする**こと。さらに、論点がずれることを利用して、議論を煙に巻くことがある。これを揚げ足取りという。	論点のずれが起きやすいのは、一方にとって議論が不利になった時である。不利な側が逃げるように、無意識に論点を変える場合がある。
    - 例：Aさん「リモートワークか出社かを当人の裁量で選べるようにすべきです。なぜなら、本人が働きやすい環境を選ぶことで生産性が高まるからです」Bさん「うちのオフィスは郊外なので遠いですよ」ここでの論点は本人が働きやすい環境を選ぶことで生産性が高まるか、あるいは選ばなくとも生産性が高まるか、それはどの程度の高まりか、というのが論点である。だが、Bさんはそれに反論をしていない。
- 論点がずれないような反論をする。上記のような論点に対し、論証型反論を使って反論する。すなわち、**相手の根拠を否定する。あるいは、根拠と主張の繋がりを否定する**。その否定の上で、**主張を追加**する。**その主張に対して根拠を追加**する。これを守ると、論点はずれない。
- 論点のずれの予防法は、**相手が論証型反論を述べているかをチェック**する。そして、もしも述べていないなら、相手の言っていることに直接答えるのを我慢する。代わりに、論点がずれたことを指摘する。論点のずれに気づくためのコツは、**相手が述べるべきことを予測しておく**こと。すなわち、相手が正しく論証型反論をするなら、相手は自分の述べた根拠を否定した形の主張をのべ、その後にその根拠を追加するはずだ。その形になっていないなら、論点がずれていると判別できる。

## 1-3.論点がずれたら元の論点に戻す
- 論点がずれた場合に、元の論点に戻すには、**論点ずれを相手に指摘**する。	
例：
Aさん「リモートワークか出社かを当人の裁量で選べるようにすべきです。なぜなら、本人が働きやすい環境を選ぶことで生産性が高まるからです」
Bさん「うちのオフィスは郊外なので遠いですよ」
ここで、通勤しやすさについては論点ではありません。そのため、元の論点を指摘します。
Aさん「今議論しているのは、リモートワークか出社かを選べるようにすることで、生産性が高まるというメリットがあるかです。通勤しにくいというデメリットについてはその後で議論しましょう。」

# 議論が平行線になった時の対処法
## 議論が平行線になる要因
2種類ある。
1. **お互いが主張型反論をし、根拠に言及しない**
2. **根拠を否定しているにもかかわらず、相手が元の主張を繰り返している**	
    - 1の例：
Aさん「リモートワークか出社かを当人の裁量で選べるようにすべきです。なぜなら、本人が働きやすい環境を選ぶことで生産性が高まるからです」
Bさん「いえ、出社を義務化すべきです。なぜなら、出社する方がコミュニケーションの効率と質が上がるからです。」
Aさん「しかし、オフィスよりも自宅の方が生産性が上がるという方がいます。」
Bさん「いや、コミュニケーションを円滑化する方が重要です。」
    - 2の例：
    Aさん「リモートワークか出社かを当人の裁量で選べるようにすべきです。なぜなら、本人が働きやすい環境を選ぶことで生産性が高まるからです」
    Bさん「本人が働きやすい環境を自覚しているとは限りません。そのため、選べるようにしても生産性が高まるとはいえないでしょう」
Aさん「しかし、本人が自由に働く場所を選ぶことで仕事はやりやすくなるはずです」

## 対処法
議論が平行線になったら、**無視されている論点についての意見を聞く**。
1の例での対処法：Aさん「Bさんは、コミュニケーションの円滑さについて話しておられますが、本人が働きやすい環境を選ぶことで生産性が高まるという点については認められますか？」
2の例での対処法：Aさん「本人が働きやすい環境を自覚していないとしても、自由に働く場所を選べるようにして生産性が高まるという根拠を教えていただけますか？」


# 参考資料
論理が伝わる 世界標準の「議論の技術」 Win-Winへと導く5つの技法 (ブルーバックス 1914)

https://www.amazon.co.jp/dp/4062579146
mdbookで日本語検索できるようにする

個人的「質はともかく継続する」29日目です

## mdbookで日本語検索できるようにする

mdbookには標準で検索機能が付いていますが、
日本語には対応していません。

![Pasted image 20240706230908.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45303/d3875759-99be-5c0a-4ba8-0a81e0119824.png)


日本語で検索できるようになると、tips集をつくったりするのに
便利になるので、日本語検索ができるようにしていきます。

### スクリプトをダウンロードして配置

bookやsrcがあるフォルダと同じ階層に、
assets というフォルダを作成しておきます。

![Pasted image 20240706231448.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45303/3ea881e7-8fac-b446-cd89-5fd2f88cb314.png)


次にここから日本語検索機能を追加してくれるJSファイルを
ダウンロードして、先ほど作ったassetsフォルダに入れます。

https://github.com/allfunc/docker-mdbook/blob/main/mdbook-demo/assets/fzf.umd.js

https://github.com/allfunc/docker-mdbook/blob/main/mdbook-demo/assets/elasticlunr.js

![Pasted image 20240706231618.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45303/462ec57f-4793-a575-8a73-2c36db037847.png)

### book.tomlを編集する

つづいて、このダウンロードしたJSファイルを有効にするために、
book.tomlファイルを編集します。
このbook.tomlファイルは、mdbookの各種設定をコントロールするファイルです。
ここに、assetsにいれたJSファイルを参照するように追加します。

```toml
[output.html]
additional-js = ["assets/fzf.umd.js", "assets/elasticlunr.js"]
```

### ビルドして確認してみる

ビルドして確認します。

```sh
mdbook build --open
```

うまくいきました。

![Pasted image 20240706232754.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45303/66520e0d-f6f3-122e-af1b-0006839e34b2.png)
NeovimのインストールにAppImageを使った

### 環境
Windows11
WSL2
Ubuntu 20.04
## Neovimのバージョンをあげたい
使いたいプラグインが`Neovim >= 0.8`を要求してきたため、これに合わせてNeovimをインストールしなおしてみた
### apt-get
最初は[ドキュメント](https://github.com/neovim/neovim/blob/master/INSTALL.md)にもある apt-get を用いて neovim のインストールしてみた

```
sudo apt-get install neovim
```

インストールされたバージョンは `0.4` だった...

### ppa
ChatGPTにお伺いしたところ、ppaからインストールするとより新しいバージョンがインストールできるとのこと

さっきいれたバージョンを削除
```
sudo apt purge neovim
sudo apt autoremove
```
インストール
```
sudo add-apt-repository ppa:neovim-ppa/stable
sudo apt update
sudo apt install neovim
```
バージョンは `0.7`

微妙に足りない

### AppImage
AppImageを使うのが簡単（とRedditにあった）
こちらの方法も[ドキュメント](https://github.com/neovim/neovim/blob/master/INSTALL.md)に記載されていたため、これに従いインストール

```
curl -LO https://github.com/neovim/neovim/releases/latest/download/nvim.appimage
chmod u+x nvim.appimage
./nvim.appimage
```
グローバルにする場合は
```
mkdir -p /opt/nvim
mv nvim.appimage /opt/nvim/nvim
```
```
export PATH="$PATH:/opt/nvim/"
```

インストールされたバージョンは `0.10`
無事、最新バージョンをインストールすることができた


## 参考文献
neovim/INSTALL.md
https://github.com/neovim/neovim/blob/master/INSTALL.md
UbuntuのPPAて何？
https://allabout.co.jp/gm/gc/438675/
How do I install the latest version of Neovim on Ubuntu? (Further explanation in post)
https://www.reddit.com/r/neovim/comments/f9661m/how_do_i_install_the_latest_version_of_neovim_on/
【初心者向け】AppImageファイルって何？使い方と実行権限の設定方法を紹介
https://tanoike.com/linux-appimage-file-usage