OmniAICreator/Qiita-1.07M huggingface dataset:
バッチファイル(.bat)でPCのFirewall(on/off)を切り替える

ネットワークエンジニアとして構築やテストをしてきて、使用頻度はそこまで多くはないけど便利になるツールがあったので紹介したいと思います。(もしかしたら、当たり前に使われているのかもしれませんが)

## バッチファイル(.bat)とは
IT業界に転職して初めて使ったものです。
PCに入っているのは知って今したが、何かわからずそのままにしていました。

以下、バッチファイルの説明です。

(引用)
バッチファイルとは、一連の処理を記述したものであり、それをまとめて実行するためのテキストファイルです。 バッチファイルで処理を自動化でき、人為的ミスや手間の削減に役立ちます。 Windows環境下ではメモ帳を使って作成可能です。 コードを記入して拡張子を「.bat」に変更し、コマンドプロンプトから実行できます。

https://it-trend.jp/development_tools/article/32-0040#:~:text=%E3%83%90%E3%83%83%E3%83%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%A8%E3%81%AF%E3%80%81%E4%B8%80%E9%80%A3,%E3%83%97%E3%83%AD%E3%83%B3%E3%83%97%E3%83%88%E3%81%8B%E3%82%89%E5%AE%9F%E8%A1%8C%E3%81%A7%E3%81%8D%E3%81%BE%E3%81%99%E3%80%82

## Firewallをon/offするバッチファイル
```batchfile:Firewall_on.bat
@echo off
color 2f
netsh advfirewall set allprofiles state on
echo Windows Firewall "Status ON"

netsh firewall show config

pause
```

```batchfile:Firewall_off.bat
@echo off
color 4f
netsh advfirewall set allprofiles state off
echo Windows Firewall "Status OFF"

netsh firewall show config

pause
```

## Firewall_on (/off).batの解説
```
@echo off
```
バッチファイルがコマンドの実行時にコマンドが表示されないようにするための指令です。

```
color 2f (/4f)
```
バッチファイルのコンソールのテキストと背景の色を設定するためのコマンドです。

```
netsh advfirewall set allprofiles state on (/off)
```
`netsh`コマンドを使用してWindowsのファイアウォールを無効(有効)にするためのコマンドです。`allprofiles`は、すべてのプロファイル（ドメイン、プライベート、パブリック）に対して変更を行うことを意味します。

```
echo Windows Firewall "Status ON" (/"Status OFF")
```
ファイアウォールの状態をユーザーに通知するためのメッセージを表示します。

```
netsh firewall show config
```
ファイアウォールの設定を表示するためのコマンドです。これにより、ファイアウォールが無効になったことを確認できます。

```
pause
```
バッチファイルが実行を一時停止し、ユーザーがキーを押すまで続行しないようにします。これにより、スクリプトが瞬時に閉じるのを防ぎます。

## 実際に動かしてみると
### Firewalloff.bat実行
**batファイル実行画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/e538bfcc-e012-8fe7-e092-04eaa3d517e1.png)

**Windowsセキュリティを確認**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/92e1e0d6-340e-fe59-109c-7d7cff67610d.png)

Firewallがoffになっていることが確認できました。
続いてonにするバッチファイルを実行させます。

### Firewallon.bat実行
**batファイル実行画面**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/4f114dea-7825-ca7b-2b81-068a93a62fe0.png)

**Windowsセキュリティを確認**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2958142/aa8a4c87-bb36-feb2-6e52-ebd72f1e6668.png)
    

Firewallがonになっていることが確認できました。

背景の色が違うのは、実行したときに瞬時にonかoffか判断できるようにしています。
```
color 2f (/4f)
```
で背景と文字の色は変更することができます。
【10日目】Autoware-Microのデバッグログ表示させてみた

この記事は筆者オンリーの[Advent Calendar 2023](https://qiita.com/advent-calendar/2023/aichallenge_racing_for_mas)10日目の記事です。  

ネタがなくなってしまったので、Autoware-Mirroの(ROS2の)デバッグログ表示してみたという記事を投稿します。
以前[この記事](https://qiita.com/Massy0127/items/a408a221739337934b9c)に関連した調査でAutoware-Miniのデバッグログを表示させて原因を確認しましたので、今回もデバッグログがお助けになるのであればということで。

# 修正内容
Autowareのドキュメントにnodeのデバッグレベルを変更する方法が乗っていました。
[こちら](https://autowarefoundation.github.io/autoware-documentation/pr-278/contributing/coding-guidelines/ros-nodes/console-logging/)です。
Linuxのログレベル同様、FATAL、ERROR、WARN、INFO、DEBUGで設定できるようです。
変更は、node_containerの後ろに、--log-level XXXXX(XXXXXはログレベル)をつけるだけです。
以下に実施時の修正前後の記載をしておきます。

修正前
```xml:autoware_mini_awsim.launch.xml
<node_container pkg="rclcpp_components" exec="component_container" name="behavior_planning_container" namespace="">
```
修正後
```xml:autoware_mini_awsim.launch.xml
<node_container pkg="rclcpp_components" exec="component_container" name="behavior_planning_container" namespace="" ros_args="--log-level debug">
```

# 実行
デバッグログの表示レベルが変更され、DEBUGのログも表示されるようになりました。
![Screenshot from 2023-12-08 13-06-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3154772/f5c68419-749d-583b-ae3d-64d596bd7096.png)
iOSアプリ開発でDanger+SwiftLintをサクッと導入する

# はじめに
この記事は[and factory.inc Advent Calendar 2023](https://qiita.com/advent-calendar/2023/andfactory) 11日目の記事です。

andfactoryでiOSエンジニアとして従事しています。
今回はiOSアプリ開発にサクッとDanger+SwiftLintを追加、移行する方法を書きます。

# Danger Swift
https://danger.systems/swift/

Danger Swiftを使用すると、開発チームはより一貫したコーディング標準を維持し、コードレビューの時間を節約し、品質の高いソフトウェアをより迅速に提供することが可能になります。

今回は以下の条件のソースコードが対象で、かつ変更も少なく、すぐできる方法です。
- iOSアプリをSwiftで書いているソースコード
- GitHub使ってる
- 時間ないので、ひとまず簡単に入れたい、移行したい
- 軽量に運用したい

## まずはGitHub Actionsを作成
当初楽に自作しようとして以下の問題にぶち当たりました。
- gemとmacOSの環境でやっていましたが、GutHub ActionsだとmacOSの倍率高い
- gemとubuntuでやろうとしていちいちSwiftLintをビルドしないといけない

なんかスマートにできる方法ないかと探していたら下記のDocker Imageを見つけました。メンテナンスもされている。ありがとう

https://github.com/417-72KI/danger-swiftlint

**これだけでいいです***

```yml:.github/workflows/danger.yml
name: Danger
on:
  pull_request:
    branches:
      - '**'
      - '!master'
jobs:
  danger:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      
      - name: Danger
        uses: 417-72KI/danger-swiftlint@v5.9 # Xcode15系
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
```

## Dangerfile.swift
上記のDocker Imageの都合上、Swiftで書く必要がありますが、iOSエンジニアとしてはその方がしっくりくるかと。

```swift:Dangerfile.swift
import Danger
import Foundation

let danger = Danger()

// swiftlint
SwiftLint.lint(inline: true, configFile: ".swiftlint.yml")
```

# 完成
これだけで完成です。
特にキャッシュとかも考慮せずとも、1分強とかで終わりますので、最高です。

弊社のiOSチームはプロダクト横断してレビューを行ったり、複数プロダクトで実装しているエンジニアしています。
なので、あまりプロダクト間でブレがあるとしんどいので、Dangerfileにいろいろルールを追記してチームで共通化を図っています。

明日の[Advent Calender](https://qiita.com/advent-calendar/2023/andfactory)もお楽しみに。
Google Workspace：ドライブとドキュメントの共有オプションが「オン」以外の場合、サービスアカウントを「共有」に加えることができない

# はじめに

[Google Workspaceの管理コンソール](https://admin.google.com/)の「ドライブとドキュメント」の『共有オプション』で「オン」以外を選択した場合、Google DriveやGoogle Sheetsなどの「共有」でサービスアカウントを共有ユーザーに追加できなくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/696e158d-8ca7-b241-14e0-cf400699b33c.png)


## 共有オプションで「オフ」が選択されている場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/034395ce-242d-96ba-8564-ad0dab95ea0e.png)

## 共有オプションで「許可リスト登録済みドメイン」が選択されている場合

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/64876/0e745d3e-bda1-b91d-09eb-b3fbd5759964.png)

なお、以下の通りサービスアカウントを許可リストに含めることはできません。

https://support.google.com/a/answer/6160020?hl=ja より引用

> Google サービス アカウント（ドメイン名の末尾が「gserviceaccount.com」）を、信頼しているドメインにすることはできません。


# 対応方法

サービスアカウントに対してファイルやフォルダを共有させることはできないため、次のAあるいはBで対応を進めることになります。

- A) Google Workspace上に存在するユーザーでOAuth2認証を行う　
- B) システムユーザーとしてGoogle Workspaceアカウントを追加し、OAuth2認証を行う

なお、Aで対応する場合、そのユーザーのアカウントがGoogle Workspace上から削除されると、API経由でのGoogle Workspaceサービスへのアクセスが行えない状態となります。関連するシステムに障害が生じないよう、アカウントの取り扱いには注意が必要となります。

# 最後に

私が出した結論は以上の通りですが、「サービスアカウントに対してファイルを共有させることが出来る」方法をお持ちの方がいらっしゃいましたら、是非共有いただけましたら幸いです。
[MapLibre GL JS]ReactやVueでレイヤー管理する際のプラクティス

# TL;DR

- モダンなウェブフレームワークでは、「宣言的」なコードがうれしい
- `Map.addLayer/removeLayer`を利用すると「手続き的」なコードとなってしまう
- `Map.setStyle(newStyle)`を利用すると、宣言的にレイヤーを定義できる

# はじめに

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73197/c70745c9-d36f-6f76-a9a9-bb8ad4991ba3.png)


MapLibre User Group Japanの@Kanahiroです。

MapLibreとは、モダンなWeb地図にまつわるOSSを傘下に収める開発者コミュニティです。

# この記事について

現代のWeb開発ではもはや、ReactやVueといったフレームワーク（ないしライブラリ）の利用は当たり前となりました。当然、MapLibre GL JSを利用する場合はそれらと組み合わせて開発するわけですが、適切なAPIを用いた「ちょっと賢そうな」実装を紹介します。

# モダンなフレームワークと地図ライブラリ

ReactやVue、最近ではSvelteが人気ですが、これらは、JavaScriptの変数とUIを同期させやすくしている、と理解できると思います。これは、JavaScriptの変数を監視して変更をUIに反映している…、と言えます。

```mermaid
graph LR

JavaScriptの変数 --変更を検知--> UIを更新
```

UIがDOMなら、フレームワークの作法に沿うだけで、簡単にUIを更新出来るでしょう。しかし地図ライブラリの場合はちょっと違って：

```mermaid
graph LR

JavaScriptの変数 --変更を検知--> 地図ライブラリの関数を実行
```

となります。LeafletやMapLibre GL JSだと`addLayer`なんて関数があり、これを利用するようなコードを書くことになります。Reactだと以下のようになるでしょうか（疑似コードです）

```tsx
// layersという、表示するレイヤーを保存する配列があるとして
useEffect(() => {
    const newLayer = getNewLayer(layers); // 追加されたレイヤーだけを抽出
    map.addLayer(newLayer);
}, [layers])

```

もちろん`removeLayer`の場合も考慮する必要があるでしょう。

この実装はかなり面倒です：

1. layersの変更を検知して、何が増えたのか・何が減ったのか、判別する必要がある
2. すでに存在する（しない）レイヤーをadd（remove）してしまうとエラーが起きるので、存在チェックが必要

という問題があるためです。

これらの根本原因は、フレームワークで監視している「状態」と、mapインスタンス内の「状態」が独立しているためです。

# MapLibre GL JSのちょっと賢いレイヤー管理

MapLibre GL JSでは`Map.setStyle(newStyle)`という関数が提供されています。変更後のスタイルを引数として関数を実行すると、地図の状態がそのスタイルの状態に書きかわります。

https://maplibre.org/maplibre-gl-js/docs/API/classes/maplibregl.Map/#setstyle

なのでさっきと同様に疑似コードを書くと

```tsx
// mapStyleという、地図スタイルを保持する変数があるとして
const [mapStyle, setMapStyle] = useState({
    version: 8,
    layers: [],
    source: {}
});
useEffect(() => {
    map.setStyle(mapStyle);
}, [mapStyle])

```

となります。こうすると、たとえば`mapStyle.layers`が変化したら、map.setStyle(mapStyle)が実行され、mapに新しいスタイルが適用されることになります。するとさっきに比べて：

1. 何が増えたのか・減ったのか、考える必要がない
2. すでに存在する（しない）レイヤーをadd（remove）してしまうことはない

という嬉しいことがあります。これは常に「表示すべき地図スタイルを定義すればよい」ということです。すなわち「宣言的」なコードとなります。どれだけたくさんのレイヤーがあっても、管理しやすいコードになるでしょう。

なお、`setStyle`は、前後の差分のみを変更する処理を行うので、パフォーマンスにも優れています（＝全てのレイヤーを削除して再追加したりしない）。

# 終わりに

地図ライブラリはモダンなフレームワークでは「副作用」であるため、うまく使わないと色々難しいことが起きると思います。今回の記事でうまく使う手法を紹介しました。

また、たとえばReactなら`react-map-gl`というライブラリがあります。

https://github.com/visgl/react-map-gl

これはまさに、「副作用」をラップしてReactの「宣言的な世界」で使いやすくしているものです。こういったライブラリを利用するのも、よいプラクティスです。
AWS でアカウントロックはできるのか調査

# はじめに
業務で運用するシステムのセキュリティ要件に、「サインインが指定された回数間違ったらアカウントロックすること」とあり、AWSで実現可能なのか気になり調べてみました。

# 対象者
- root,iamユーザでアカウントロックが可能なのか知りたい方

# 結論
- サインインが指定された回数失敗したユーザーをアカウントからロックアウトするために、「ロックアウトポリシー」を作成することはできません

# 推奨
- セキュリティを強化するために、強力なパスワードポリシーと Multi-Factor Authentication (MFA) を組み合わせることをお勧め

## おわりに
AWSでアカウントロックが可能かについてまとめました。

# 参考文献
- [IAM ユーザー用のアカウントパスワードポリシーの設定](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_credentials_passwords_account-policy.html)
Airflowスケジューリングマスターへの最初の一歩

# はじめに

インティメート・マージャーではワークフロー管理ツールであるAirflowを活用しています。

https://airflow.apache.org/

今回は、Airflowを触り始めの初心者の方に向けて、実務上必要になることの多いスケジューリング周りの理解の助けになるような記事を書いていきたいと思います。

Airflowは公式ドキュメントが豊富でありソースコードも公開されているので、より詳しい内容について知りたい方はそちらを参照するのもおすすめです。

本記事は、Airflow2.x系を想定していますが、Airflow1.x系も対応したものになっています。

# DAG定義と実行スケジュール
公式ドキュメントからDAG定義を拝借して解説していきます。
```py
with DAG(
    "my_dag_name", start_date=pendulum.datetime(2021, 1, 1, tz="UTC"),
    schedule="@daily", catchup=False
) as dag:
    op = EmptyOperator(task_id="task")
```
DAGの実行スケジュールは、DAGクラスコンストラクタの`start_date`および`schedule`（Airflow 2.3以前は`schedule_interval`）引数により決定づけられます。
上記の場合、`pendulum.datetime(2021, 1, 1, tz="UTC")`から`@daily`つまり1日ごとにDAGの実行がスケジュールされる（以降DAG Runが作成されると言い換えます）ということになります。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27575/196af16c-b2f9-f382-ba85-d07a970eeabe.png" placeholder="図1. 作成されるDAG Runのイメージ">

ここでそれぞれのDAG Runはいつ作成されるでしょうか。
この場合は、`2021/1/1 00:00:00`のDAG Runは`2021/1/2 00:00:00`以降に作成されます。
直感的には1日遅れているように思いますが、以下の図のように考えるとわかりやすいと思います。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27575/f8b1d4de-f3cb-5ab7-a02f-01c046ca939c.png" placeholder="図2. DAG Run作成のタイミング">



つまり次の実行までの1日分のデータ（`2021/1/1 00:00:00` ~ `2021/1/1 23:59:59`）が蓄積されたタイミングでDAG Runが作成される = DAGが実行されるということです。


また、実際には`0 1,2 * * *`のような等間隔ではないCron表現を利用することもあるかもしれません。
その場合でも考え方は同様で、次の実行までのデータが蓄積されたタイミングでDAG Runが作成されます。つまり`2023-01-01 01:00:00`のDAG Runは`2023-01-01 02:00:00`に、`2023-01-01 02:00:00`のDAG Runは`2023-01-02 01:00:00`に作成されます。

:::note
Airflow2.3以降ではTimetableを実装することでより柔軟なスケジューリングが可能です。
https://airflow.apache.org/docs/apache-airflow/2.3.4/howto/timetable.html
:::

# 日時に関する変数

理解を進めるためにここでDAGの実行に関するオブジェクトについて触れていきます。

![スクリーンショット 2023-12-08 12.01.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/27575/608b8567-770b-1b9e-9b0c-dc0a4c4dedd4.png)



|オブジェクト | 意味 |
| -- | -- |
|Task|何を行うかの定義。PythonコードでOperatorやSensorなどをインスタンス化して実装される。 |
|Task Instance| Taskの実行ごとに作成され、ステータス等の属性を持つ。`dag_id`, `task_id`, `logical_date` の組み合わせでユニーク。|
|DAG Run| DAGの実行ごとに作成され、ステータス等の属性を持つ。`dag_id`, `logical_date`でユニーク。|

また、各オブジェクトが持つdatetime型の属性について見てみます。


|オブジェクト | 属性 | 意味 |
| -- | -- | -- |
|Task|`start_date`|スケジュールをいつから行うかの設定値 |
|Task Instance, DAG Run|`logical_date` (`execution_date`)|各実行を一意に識別するための値（DAG Runが作成される時間とは異なる） |
|Task Instance, DAG Run|`start_date`|各実行の実際の開始時間 |

ここで伝えたいことは以下の二点です。

一つ目は、start_dateという属性はオブジェクトにより意味合いが異なるので注意が必要ということです。
Task InstanceおよびDAG Runは実際の実行開始時間の記録であることに対して、Taskの`start_date`は設定値でありDAG定義時の`start_date`パラメータに一致します。

二つ目は、Task InstanceおよびDAG Runには`logical_date`という、各実行を区別するような識別子としての属性があるということです。こちらは図1の処理すべきデータの開始時間に一致します。
つまり、DAG定義時の`start_date`はこの`logical_date`の最小値を指定すると考えるといいでしょう。


# おわりに
Airflowのスケジューリングに関して、基本的な考え方と注意点について説明しました。
Airflowは使い始めは直感に反する動作をすると思うことがあるかもしれませんが、コンセプトを理解することで正しく使いこなせるはずです。
この記事が、DAGのスケジューリングで疑問が湧いた時の助けになれば幸いです。

明日は、Docker関連の記事についての記事だそうです！
ぜひお楽しみに！

https://qiita.com/advent-calendar/2023/intimatemerger
GitHub Copilot Chat活用のこまごまTips

こんにちは。ココネ株式会社でサーバーエンジニアをしているkkuchiです。

2023年、私の仕事における最も大きなインパクトは
**GitHub Copilotの導入**でした。

弊社ではGitHub Copilot活用の動きが進んでおり、
日々の業務の効率化や、コードの品質向上に貢献してくれています。

そこで`Cocone Advent Calendar 2023`8日目となる本記事では、
VSCodeの拡張機能`GitHub Copilot Chat`を中心として
GitHub Copilotさんと一緒にエンジニアリングを行うためのTipsをお伝えできればと思います。

ちょっとした事ばかりですが、何かの役に立てば幸いです。

## 前提

GitHub Copilot本体ののコード提案も大変便利なのですが、
今回はあくまでもGitHub Copilot Chatを中心にお話します。

そのため、
拡張機能`GitHub Copilot Chat`がインストールされたVSCodeの使用を前提としています。
あらかじめご了承下さい。

## Tips1:質問はインラインチャットではなく、サイドバーから行う

色々試してみた所感として、サイドバーのチャットで聞くほうが
インラインチャットよりも**提案の幅が広い**ように思えます。

例として以下のシェルスクリプトを使います。
```sh
TZ=Asia/Tokyo date +"%Y-%m-%dT%H:%M:%S.%3N%z"
```
JSTの現在日時をISO8601形式(ミリ秒あり)で出力したいのですが、
ミリ秒部分がうまく出力されません。修正してもらいます。

### お願いすること
>Macで実行しましたが、ミリ秒が出力されません。修正して下さい。

### インラインでの修正
```sh
TZ=Asia/Tokyo date +"%Y-%m-%dT%H:%M:%S.%3N%z" | sed 's/.\{4\}$//'
```

直りませんでした。しかもタイムゾーン部分がなくなってしまった...

### サイドバーでの修正
回答がこちら。
>Macのdateコマンドは、Linuxのdateコマンドとは異なり、ミリ秒を直接サポートしていません。しかし、pythonやrubyなどの他のツールを使用して同じ結果を得ることができます。
>
>以下に、Pythonを使用して現在の日時を同じフォーマットで出力する方法を示します。
>```sh
>python -c 'import datetime; print(datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%S.%f%z"))'
>```
>このコマンドは、Pythonのdatetimeモジュールを使用して現在の日時を取得し、指定されたフォーマットで出力します。%fはマイクロ秒を表し、%zはタイムゾーンを表します。ただし、このコマンドはマイクロ秒単位で時間を出力するため、ミリ秒単位に変換するためには出力を調整する必要があります。

これでミリ秒が出力されるようになりました。
(タイムゾーンを表す数字部分がなくなってしまったため、別の修正は必要ですが)

### 所感
サイドバーの良いところは、理由の説明や出力したコードの説明があることです。

上記のケースで言えば、
`Macのdateコマンドではミリ秒のフォーマットができない`という原因が分かったのが大きかったです。
(調査の時間がだいぶ削減できました)

### インラインチャットの使い所

じゃあインラインチャットは使わない方がいいの？と思うかもしれませんが、
そういうわけではありません。
インラインチャットは、サイドバーからの質問に比べて応答が早いと感じます。

そのため「コードの修正をしたい」ケース、その中でも特に
- 限定的な範囲
- 「どう変更するか」のイメージがついている
- 手を動かす手間を省きたい

といった状況ではとても便利です。

## Tips2:もう一声！と思ったら、何回か質問してみる

この記事を書くにあたり、色々試してみたのですが
同じ質問をしたとしても、提案されるコードはちょいちょい変わります。

出力されたコードに「おや？」と思った時は、もう一度同じ質問をしてみると
欲しい答えに近づけるかもしれません。

```sh
本記事を書くにあたり、同じ質問を何度も投げかけたり
ちょっと言葉を変えて質問をしてみたりと、時間を使って色々試してみたのですが
その時々で提案されるコードがガラッと変わることがありました。
```

## Tips3:質問の粒度を調整してみる

ChatGPTはじめ、他のAIサービスでも同様かと思いますが
`質問する際に、どのくらい詳細に情報を渡すか`によって、提案されるコードが変わってきます。

またまた日時を出力するシェルスクリプトを例に出します。

### ざっくりした投げかけ

>現在日時を出力するシェルスクリプトを書いて下さい

```sh
#!/bin/bash

# 現在の日時を取得
date
```

実行結果がこちら。
何も指定していないので、dateコマンドのデフォルト出力です。
```
2023年 12月 7日 木曜日 21時09分08秒 JST
```

### フォーマットを名前で指定

>現在日時をISO8601形式で出力するコードを書いて下さい

```sh
#!/bin/bash

# 現在の日時をISO 8601形式で取得
date -u +"%Y-%m-%dT%H:%M:%SZ"
```

実行結果がこちら。
秒までは想定通りですが、「ミリ秒が欲しい」「JSTにしてほしい」「タイムゾーンの数字4桁が欲しい」など、もう一声というところです。
```
2023-12-07T12:09:46Z
```

### フォーマットの実例を渡す

>JSTの現在日時を出力するコードを書いて下さい。
>フォーマット例→"2023-12-01T12:00:00.000+0900"

```sh
#!/bin/bash

# JSTの現在の日時を取得
TZ=Asia/Tokyo date +"%Y-%m-%dT%H:%M:%S.%3N%z"
```

実行結果がこちら。
前述のミリ秒問題以外は想定通りになりました。
```
2023-12-07T21:09:57.3N+0900
```

### 所感
やはり詳細に条件を指定をした方が、出力されるコードも理想に近いものになります。
(当たり前ですが...)

とはいえ、適当な質問から意図を汲んでくれることも多いため
- 考えるのが面倒な時は、ざっくりした質問をする
- 欲しい答えが得られなければ、細かい条件を伝えていく

が良さそうです。

## まとめ・最後に

以上、GitHub Copilot Chatさんと二人三脚でエンジニアリングを進めるための
ちょっとしたTipsをお届けしました。

色々試してみての結論をざっくりとまとめると
>誤解を与えないよう明確な文章で伝えれば、理想に近い答えが得られる

という印象です。
人間同士でコミュニケーションを取る時と同じですね。

**人間と話す時と同じ考え方が、AIへの意思伝達においても通用する**
というところに、AIの劇的な進化をひしひしと感じました。
YOLOv8でセグメンテーションを行ってみた

YOLOv8でセグメンテーション（インスタンスセグメンテーション）を行ってみました。
YOLOの最新版であるYOLOv8には日本語のドキュメントもあります。

https://docs.ultralytics.com/ja/

https://github.com/ultralytics/ultralytics

ドキュメントと[Google Colaboratoryのノートブック](https://colab.research.google.com/github/ultralytics/ultralytics/blob/main/examples/tutorial.ipynb)を読みながらYOLOv8を実行してみました。

# セグメンテーション
Google Colaboratoryにて実行しました。
ランタイム->ランタイムのタイプを変更->T4 GPUを選択
```Python
from google.colab import drive
drive.mount('/content/drive')
```
```Python
!mkdir "/content/drive/MyDrive/yolov8"
```
```Python
%pip install ultralytics
import ultralytics
ultralytics.checks()
```

セグメンテーション（結果はyolov8/runs/segmentに保存される）
```Python
%cd "/content/drive/MyDrive/yolov8"
!yolo predict model=yolov8n-seg.pt source='https://ultralytics.com/images/zidane.jpg'
```

![zidane.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/ec9e15f9-0156-4950-6b9d-072cce98f655.jpeg)

この画像が出力されました。
1本のネクタイが2本と認識されていることがわかります。

# 学習＆セグメンテーション
次に、COCO128-segデータセットを用いて、事前学習済みモデルの学習を行いました。

学習（結果はyolov8/runs/segmentに保存される）
```Python
%cd "/content/drive/MyDrive/yolov8"
!yolo train data=coco128-seg.yaml model=yolov8n-seg.pt epochs=100 imgsz=640
```
学習結果を用いて、もう一度セグメンテーションを行います。
```Python
%cd "/content/drive/MyDrive/yolov8"
!yolo predict model="/content/drive/MyDrive/yolov8/runs/segment/train/weights/best.pt" source='https://ultralytics.com/images/zidane.jpg'
```

![zidane.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3569835/09b19c9f-120f-4a5a-6766-aa7dc11b6c95.jpeg)

この画像が出力されました。
1本のネクタイを1本と認識することができました。
また、学習前に比べて、スコアが上がったことがわかります。

YOLOv8で物体検出を行ってみた記事も、よければご覧ください。

https://qiita.com/wawana12/items/fde830c0b04567c4d68a
Mermaidを使ったドキュメント作成術

はじめまして。カバー株式会社のTです。
この記事は、[カバー株式会社 Advent Calendar 2023
](https://qiita.com/advent-calendar/2023/cover)の12日目の記事になります。
前回の記事は、@ys-coverの[AWS Control Towerにおける非準拠リソースの通知](https://qiita.com/ys-cover/items/2121f4db469a7e7047b8)です。

## Mermaidとは
Mermaidとは、テキストベースの図やチャートの作成ツールです。
内部的にはJavaScriptでテキストを解釈して図やチャートの生成を行います。
Mermaidを使うにはMermaidで書かれたテキストを変換する環境が必要です。
実際にGitHubやNotion、Qiita等でサポートされていますので、是非使っているドキュメントツールがMermaidをサポートしているか確認してみてください。

## グラフィカルなドキュメントで認識齟齬を減らす

カバー株式会社では、リモート可能な勤務日と出社が義務付けられる日が曜日ごとで分けられているハイブリット型の勤務体系となっています。（※実際のルールは部署ごとに異なります）

そんな中で、リモート上での円滑なコミュニケーションを取ることと後から見返した時に読み手のコストをかけないという2つの意味で、Mermaidを使ったドキュメントは役に立ちます。

例えば、複雑な状態を持つ機能実装時には、Mermaidによる遷移図を元にコミュニケーションを取ります。

例：ゲームのとある機能の状態遷移図

```mermaid
stateDiagram-v2
    通常モード --> プログレスバーモード: 移行
    プログレスバーモード --> 選択モード: 数秒後
    選択モード --> プレビューモード: アイテム選択
　　選択モード --> 通常モード: Escキー
    プレビューモード --> 選択モード: 右クリック
		プレビューモード --> 除去モード: Rキー
　　プレビューモード --> 通常モード: Escキー
		除去モード --> 通常モード: Escキー
```

このような図を元に仕様提案をする方と機能実装をするエンジニア間に齟齬が発生しないように進めることが可能です。

## ChatGPTを使用して自然言語から図を作成する

ChatGPTを使うことで自然言語からMerimaidのテキストコードを作成することが可能です。
Pluginsを使えば、レンダリングまでChatGPT内で完結することが出来ます。

例： 前述のMerimaidコードをPluginsのMermiad Chartを使用して描画する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630944/3698ce62-9fdc-d38a-31bc-4c72cc7f57e8.png)

しかし、ChatGPTはMermaid記法を間違えることが多いので、生成されたMermaidコードがレンダリングされない（＝エラーが出てしまう）場合には、GPTにMermaidの公式ドキュメントを読み込ませることをお勧めします。

例： stateDiagramのドキュメントを読み込ませてから状態遷移図を出力させる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3630944/16894c04-a54b-0212-e9a9-5b92529489e2.png)

## おしまい

最後までお読みいただきありがとうございます。
今回はMermaidのご紹介から導入のメリット、ChatGPTによる自然言語からの変換までお話しさせていただきました。
GPTを使えば文法を知らずとも簡単に試すことが出来るので、是非１度は挑戦してみていただきたいです。

次回は@kura-cvrの「GitHub ActionsでUnityプロジェクトをビルドする」です。お楽しみに！

## 参考

https://mermaid.js.org/

https://www.mermaidchart.com/plugins/chatgpt
jetpackComposeでPaLM APIを使うための環境構築

# 開発環境
MacBookPro(M2)

# 環境構築

[参考(PaLM API: Android のテキスト クイックスタート)](https://developers.generativeai.google/tutorials/text_android_quickstart?hl=ja)

### palmのAPIkeyを取得する
[このドキュメント](https://developers.generativeai.google/tutorials/setup?hl=ja)を参考に、APIを取得してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255712/5bd448e6-8668-6c06-c5e0-c4a92d81ab55.png)

APIkeyですが、コンソールから確認できても取得ができなかったため、環境変数として実装しました。そのままapikeyを実装すれば動きました。


### APIクライアントをインストールする
[これ](https://developers.generativeai.google/tutorials/text_android_quickstart?hl=ja)の通りに進める
- ファイルのダウンロード
    - 任意のダウンロードフォルダでOK
    - 将来的にダウンロードしなくていいようになるらしい
- ダウンロードしたディレクトリパスでターミナル開いてコマンドを実行

### 任意のプロジェクトを設定する
- AndroidManifest.xmlを編集
- setting.gradleを編集
- build.gradle(:app)を編集


# サンプルで遊んでみる
### MainViewModelの作成
サンプルの注意
- `transportChannelProvider`の`hashMapOf`関数で`"x-goog-api-key"`の後に`to`を入れてください
- ``` :MainViewModel.kt
    val transportChannelProvider = InstantiatingGrpcChannelProvider.newBuilder()
                .setHeaderProvider(FixedHeaderProvider.create(hashMapOf("x-goog-api-key" to System.getenv("PALM_API_KEY"))))
                .build()
    ```

### MainActivityの作成
- SampleUiのTextコンポーネントのスタイル指定を修正してください
```MainActivity.kt
// ...
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun SampleUi(
    viewModel: MainViewModel = hiltViewModel()
) {
    // ...
    Column(
        // ...
    ){
        Card(
            // ...
        ) {
            Column(
                modifier = Modifier.padding(8.dp)
            ) {
                Text(
                    modifier = Modifier.fillMaxWidth(),
                    text = textOutput,
                    // この行
                    style = MaterialTheme.typography.bodyMedium
                )
            }
        }
    }
}
```

エミュレーターで動くようになりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2255712/0a19fe96-d70d-34a1-fd99-a6887d365a3d.png)
Memo on how to write a paper in latex

## LaTeX Rules
Update if necessary.

* input space after comma.
* input break line after a period.
* input blank line by entering break line two or more times.
* make space = [\ +,] 
* make hyperlink
* write the official name for the first abbreviation that appears.
* check the citation of papers
* use centering instead of begin{center} in figure environment
* use mathrm instead of rm
* Table captions are above, figure captions are below.
* Units and subscripts are in roman, physical quantities are in italic


## package


```
\usepackage[dvipdfmx,colorlinks,linkcolor=black]{hyperref}
\usepackage{pxjahyper}  %link
\usepackage{amsmath,amssymb} %mathmatics
\usepackage{ascmac} %making frame
\usepackage{mathrsfs} %花文字
\usepackage{color}
\usepackage{here}
\usepackage{geometry} %margin setting
\usepackage{multicol,multirow} %multi column
\usepackage{caption}
\usepackage{subcaption}
\usepackage{bm} %boldsymbol
\usepackage{epigraph} %make epigraph
\usepackage{acronym} %make abbreviation
\usepackage[dvipdfmx]{graphicx} %insert images
\usepackage{comment} %comment
\usepackage{physics} %about physics
```
ファイル圧縮を効率化!ファイル圧縮&圧縮率を表示する関数

## はじめに

こんな悩みを持っていませんか？

**「`tar`でファイルを圧縮する時のオプションを毎回調べている」**

手持ちのPCの場合はファイルの圧縮はGUIでもできますが、サーバーでの操作はGUIでの作業が困難です。よってコマンドでファイル圧縮をする機会が生じます。筆者は毎回`tar`コマンドのオプションを調べていました。

**「ファイルを圧縮したはいいけど、圧縮率を瞬時に確認できない」**

ファイルを本当に圧縮できたのか、ファイルの圧縮によってどのくらいサイズが軽減されたか気になると思います。
その都度毎回コマンドを打つorあるいはコマンドを覚えていない場合は調べる必要があるので、小さなストレスが溜まります。

今回は二つの悩みを解決する自作のzsh関数を紹介します。

## 内容
### ファイル圧縮&圧縮率を表示するzsh関数
ファイル圧縮&圧縮率を表示するzshの関数`compress_file`は以下です。

```zsh
## 使い方: %compress_file file1 file2 
compress_file () {
    # 圧縮されたファイルの名前をローカル変数に設定
    local compressed_file="files.tar.gz"

    # 元のサイズをキロバイト単位で取得し、バイト単位に変換
    local original_size=$(du -c -k "$@" | grep total$ | awk '{print $1}')

    # 元のサイズを表示
    echo "Original size: $original_size KB"

    # ファイルを圧縮
    tar -czf "$compressed_file" "$@"

    # 圧縮後のサイズをキロバイト単位で取得し、バイト単位に変換
    local compressed_size=$(du -k "$compressed_file" | awk '{print $1}')

    # 圧縮後のサイズを表示
    echo "Compressed size: $compressed_size KB"

    # 圧縮率を計算
    local compression_ratio=$(echo "scale=2; 100 - ($compressed_size / $original_size * 100)" | bc)

    # 圧縮率を表示
    echo "Compression ratio: $compression_ratio%"
}
```

(1)圧縮したいファイル群のサイズを計算して保持しておき(2)`tar`で圧縮して(3)圧縮後のファイルサイズを計算して圧縮率を出しています。

圧縮したファイルは`files.tar.gz`としてカレントディレクトリに保存されます。

(圧縮したファイル名をコマンドで指定したい場合は、`$1`や`shift`を使えば実装できます。ただ今回は使い方を簡単にしたかったので、ファイル名は`files.tar.gz`固定としています。)

### 使い方
上記の関数`compress_file`の内容を`~/.zshrc`に関数を記載し、`source ~/.zshrc`で読み込めばいつでも使えます。

`compress_file`の使い方の例は以下です。

```bash
% ls
file1.txt file2.txt
% compress_file file1.txt file2.txt
Original size: 8 KB
Compressed size: 4 KB
Compression ratio: 50.00%
% ls
file1.txt file2.txt files.tar.gz　#files.tar.gzが新規作成
```

## おわりに

**「`tar`でファイルを圧縮する時のオプションを毎回調べている」**

**「ファイルを圧縮したはいいけど、圧縮率を瞬時に確認できない」**

これらの悩みとはもうおさらばできたはずです！やったね！
biome.jsのバージョンをあげるスクリプトv2

https://qiita.com/Yuumillar/items/1749272af0fd076dee82

前回作成したスクリプトだが、biomeはcli以外にもいろいろreleaseしているので動かないときがあった。
よって、release全体からcliに限定して取得するように変更。

```ts
import { readFileSync, writeFileSync } from "fs";

const f = await fetch(
    //latestではなくreleases全体を取得します
	"https://api.github.com/repos/biomejs/biome/releases",
);

const fetchedJson = await f.json();

/* 
cli/v1.4.1 -> 1.4.1
*/
const getVersion = (str) => {
	const arr = str.split("/");
	const version = arr[arr.length - 1];
	/* vを取る */
	if (version[0] === "v") {
		return version.slice(1);
	}
	return version;
};

const cli = fetchedJson.find((v) => {
    // nightlyは危険なのであげません。
	if (v.tag_name.includes("nightly")) return false;
	return v.tag_name.includes("cli");
});

const tag_name = getVersion(cli.tag_name);

/* biome.jsonの中身も書き換える */
const biomejson = JSON.parse(readFileSync("./biome.json", "utf-8"));
const result = {
	...biomejson,
	$schema: `https://biomejs.dev/schemas/${tag_name}/schema.json`,
};

/* over write */
writeFileSync("./biome.json", JSON.stringify(result, null, 2));

/* install */
await $`pnpm update --save-exact @biomejs/biome@${tag_name}`;
```
チームをイキイキとさせる！スプリントゴールの効果

## ■ はじめに

本記事はリンクアンドモチベーション Advent Calendar 2023の10日目の記事です。

https://qiita.com/advent-calendar/2023/lmi


リンクアンドモチベーションでエンジニアリングマネージャーをしているnakagam3です。
最近チームでスプリントゴールを設定するようにしたところ、タスクに追われ疲弊していたチームがだんだんイキイキと仕事をするように変わっていきました。その絶大な効果を紹介させてください。

## ■ スプリントゴールとは

そもそもスプリントゴールって何？って方もいると思うので簡単に説明。
スプリントゴールはアジャイル開発手法の一つであるスクラムで定義されているプラクティスです。

スクラムガイドでは以下のように説明されています。
> スプリントゴールはスプリントの唯⼀の⽬的である。スプリントゴールは開発者が確約するものだが、スプリントゴールを達成するために必要となる作業に対しては柔軟性をもたらす。スプリントゴールはまた、⼀貫性と集中を⽣み出し、スクラムチームに⼀致団結した作業を促すものでもある。

[スクラムガイドより引用](https://scrumguides.org/docs/scrumguide/v2020/2020-Scrum-Guide-Japanese.pdf)

## ■ スプリントゴール、その絶大な効果

### 1. 「明確な目標」がやる気をグンと上げる

これまでは数ヶ月後のリリースという遠い目標に対し、日々の進捗は進んでいる実感が薄く「タスクが終わらない」「終わったけどまだある、本当に終わるのか？」とどこか不安がありました。

しかし、「ユーザーが進捗状況を確認できるようにして喜んでもらう！」のようなゴールを設定したことで、明確なゴールがチームに着実に進んでいる実感を与え、「絶対達成するぞ！」という前向きなチームへと徐々に変わっていきました。

### 2. 「チーム全員の目標」がメンバー同士の助け合いを生む

これまではPjMがマイルストーンを設定し、メンバーは自分が担当するタスクを期間内に終わらせる、という構図になっていました。その結果、ふりかえりをしても「自分のタスクが終わらなかった」といった自身の反省が多く出ていました。

しかし、スプリントゴールを全員で決めるようにしたことで、チーム全体で達成すべきゴールという構図になり、毎日ゴールを確認して、困っているメンバーがいれば助け合うように徐々に変わっていきました。
また、ふりかえりでも「ゴール達成できたね！」「もっと早くフォローできてれば達成できてたかもなー」のようなチームで喜ぶ・反省するといったシーンが増えていきました。

### 3. 「価値ベースの目標」がチームからの提案を生む

これまではどうしても「決まった仕様を実現する」という受け身なスタンスがよく見られました。気になったことがあったとしても、ユーザーの視点に確信が持てず提案などにも至らないということも。

しかし、スプリントゴールを設定するようになってしばらく、とある仕様変更でユーザーに約束した期日にリリースが間に合わない可能性が出たことがありました。するとチームメンバーから「ユーザーの方ってこういう風に使うんですよね？じゃあ〇〇でも良いのでは？それならすぐできます」という提案が出てきたのです。
「ユーザーのニーズ」を踏まえた上での「ソリューションの提案」が出てくるようになったのはスプリントゴールを設定して感じた1番の変化でした。

## ■ 効果的なスプリントゴールの運用ポイント

いいことばかり言いましたが、当然はじめから上手くいったわけではありません。
実際にやってみて感じたポイントをまとめてみました。

### 1. 自分たちで決める！

書籍「[モチベーション3.0 持続するやる気をいかに引き出すか！](https://www.amazon.co.jp/%E3%83%A2%E3%83%81%E3%83%99%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B33-0-%E6%8C%81%E7%B6%9A%E3%81%99%E3%82%8B%E3%80%8C%E3%82%84%E3%82%8B%E6%B0%97-%E3%80%8D%E3%82%92%E3%81%84%E3%81%8B%E3%81%AB%E5%BC%95%E3%81%8D%E5%87%BA%E3%81%99%E3%81%8B-%E8%AC%9B%E8%AB%87%E7%A4%BE-%CE%B1%E6%96%87%E5%BA%AB/dp/4062816199/ref=tmm_pap_swatch_0?_encoding=UTF8&qid=1702008809&sr=1-1)」でも「自律性」がモチベーションの3要素の一つとして挙げられているように、「自分で決めること」は人のモチベーションに大きく影響します。そして、チーム全員でゴールを決めることで「自分たちのプロジェクトだ」という主体性も育まれます。

これがチームに前向きなエネルギーと助け合いを生んだんだろうなーと確信しているので、ぜひ**全員**で決めましょう！

### 2. フェーズ毎にゴールの種類を変える！

スプリントゴールはアウトカムベースが理想的とされています。ですが、プロジェクトのフェーズによっては実装作業が行われないこともあり、そんな時のゴール設定は難しいと感じることが多かったのです。
そこで、開発のフェーズに合わせてスプリントゴールを柔軟に設定するようにしたところ中々良さそうでした。

例えば、要件定義フェーズでは「〇〇機能の不確実な部分を明確にして実装できる状態にする！」のように不確実性を減らすことを目標にすることで、プロジェクトが明らかになり進んでいる実感を得られるようになりました。

一方で、実装フェーズでは「ユーザーが進捗状況を確認できるようにして喜んでもらう！」のようにユーザーに届けるアウトカムベースの目標にすることで、チームからの提案が出てきやすいようにしています。

無理にルールに固執せず、**目的を持って**ゴールを設定しましょう！

### 3. 毎週ゴールをふりかえる！

今はスプリントゴールの効果を感じていますが、はじめからうまくいったわけではありません。やり始めた時のスプリントゴールは単にタスクを終えることに焦点を当ててたり、そもそもゴールを忘れていることもありました。
しかし、毎週のゴールの達成状況をふりかえることで「達成できたか？」「できなかった理由は何か？」をふりかえることで、設定するゴールが変わってきたり、ゴールについての発言が増えていき、達成した時には全員で喜ぶことができるようになりました。

ふりかえりではスプリントゴールを達成できたか？**必ずふりかえる**ようにしましょう！

## ■ さいごに

みんなスプリントゴールを設定してイキイキ働きましょう！
Postman を使ってAPIドキュメンテーションを簡単に公開しよう

## 概要

私が個人開発をするときに
APIのドキュメントを書く手法については
FastAPI を使っていれば、FastAPIのSwagger UIを使って簡単にドキュメント化したりしていました。


しかし今回はPostmanを使ってドキュメントを生成できると知り、試してみたところとても簡単に公開することができたのでここでやり方を共有しようと思っています。


## 作り方

バックエンドの開発の時に、

Postmanで 
- collection 作成
- add request からそれぞれのエンドポイントを作成
- エンドポイントにexample を作成

しておくことで、いつでもAPIが試せるようにしておくと便利なので、個人開発ではそうしています。


### Postmanを利用してのデバッグ（テスト）環境整備


例えば、

authblue-api というコレクションを作成し、

- get_api_token
- delete_api_token
- get_tenants

などのリクエスト（エンドポイント）を作成、それぞれにexample を作成しているのがこちらです。

![Screenshot 2023-12-08 at 12.13.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/e5885ecb-c4f9-9e62-1dbd-a3a324d5047c.png)




このように、それぞれのエンドポイントでexampleを用意してテストすると個人であっても、チーム開発であってもテストがしやすいのでとても便利であり、こうやっている人も多いのではないでしょうか？



### ドキュメントの作成

![Screenshot 2023-12-08 at 12.14.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/ab9997cd-8bbc-1865-e936-5e28d5afac43.png)

このコレクションから、

**View documentation**

を選択することができます。

![Screenshot 2023-12-08 at 12.15.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/519792/dc2789f5-7758-7276-44b7-e2d3601afd52.png)

View Documentation をクリックすると、ドキュメント画面に移行し、
コレクションが、Exampleも含めてドキュメントの形にまとまっていることがわかると思います。


さらに、このドキュメントは右上のPublishボタンから、簡単に公開することができます。


## 作成したAPIドキュメント

結果として出力され、公開されたAPIドキュメンテーションは次のものになります。

https://documenter.getpostman.com/view/30519632/2s9YR6aEKK


開発時にPostmanを使ってデバッグしており、exampleなどをきちんと整備していれば、
ドキュメントはexample も含めて簡単に公開することができ、とても強力だと思いました。



## まとめ

Postman を用いてテスト環境を整備していれば、
気の利いたドキュメントも自動で生成され、公開も非常に簡単になります。
Postmanを開発環境で使っている人はぜひドキュメントもPostmanで作ってみてはいかがでしょうか？


今回はこの辺で。

kenmaro
ToMo指数〜チームのモチベーションを可視化〜

# あなたは何のために働いていますか？
- お金（生存, 家族を養う, 趣味の満喫）がほしいから？
- 誰かを失望させたくないから？
- 楽しいから？

# ToMo指数とは
- 「ToMo」は「Total Motivation」の略
    - 日本語でいえば「総合的動機」
- 2016年に発売された「マッキンゼー流最高の社風のつくり方」という本で定義
- 労働の動機を6つに分類してそれぞれの動機に対する回答結果から算出

## ToMo指数の概要
ToMo指数は、以下の6つの動機に基づいて計算されます。

### 直接的動機
- 楽しさ
    - 仕事自体を報酬に感じる
- 目的
    - 仕事の結果に価値が感じられる
- 可能性
    - 仕事の二次的な結果が自分の価値観や信念と一致する

### 間接的動機
- 感情的圧力
    - 自分や周囲からの失望/罪悪感/羞恥心
- 経済的圧力
    - 報酬を得るため。
    - 解雇されないため。
- 惰性
    - 続ける理由もないが、やめる理由もない。
    - なんとなく。

## ToMo指数を測ってみよう
以下サイトで計測可能です
https://heart-quake.com/assessment/tomo.php

ToMo指数は以下の式で計算されます。
```
ToMo指数 = (楽しさ指数 × 10 + 目的指数 × 5 + 可能性指数 × 1.66) - (感情的圧力指数 × 1.66 + 経済的圧力指数 × 5 + 惰性指数 × 10)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3493134/9ea1116d-fbeb-d1de-b8c5-9ccd7d3f416a.png)

つまり、直接的動機（楽しさ、目的、可能性）が高いほどToMo指数は高まり、
間接的動機（感情的圧力、経済的圧力、惰性）が高いほどToMo指数は低下します。

## ToMo指数が注目される理由
- ToMo指数は、社員のモチベーションと生産性、顧客に対する満足度、そして企業の高業績に関連しています。
- スタバは、他のファストフード/レストランより約18ポイント高いらしいです。

# 衰退の悪循環
あなたはメンバーのToMo指数を低下させるような管理をしていませんか？
業績のために管理（締め付け）を強化すると、破滅の道を歩むことになるかもしれません。

以下、NG例です。
1. 業績が低迷する
2. 管理者による管理の強化が図られる
    - ノルマを達成しろ!
    - 期日を厳守しろ!
    - 逐一状況を報告しろ！
3. メンバーの間接的動機が増大する（ToMo指数の低下）
    - 言われたからやらなければ...
    - 計画達成をしないと申し訳ない...
    - 進捗でない時の報告がつらい...
4. 創造性が低下する
    - 計画されていない新しい打ち手を考え出し、試すという能力が減退する
5. **【1に戻る】**

# ToMo指数を向上させるリーダーであるためには
### 【楽しさ】への働きかけ
- 実験や学びをするための時間の余裕と場所を与える
- 高業績とはどういった状態なのかを明確に定義する
- 問題があれば、メンバーが自分でそれを解決することを促す
### 【目的】への働きかけ
- メンバーが、自分の仕事には重要で意味があると思えるよう後押しする
- 自ら手本となり、従業員が前向きな共通の目的意識を持てるようにする
### 【可能性】への働きかけ
- 仕事と従業員の個人的な目標を積極的につなげる
- 従業員の弱みではなく強みに注目を集め、その成⻑を手助けする
- 従業員の成⻑に合わせて、仕事の難易度を調整する

### 心理的安全性を高める
#### 状況より人を非難するバイアスを防ぐ「REAPモデル」
1. 思い出す(Remember)
    - なにか問題が起き、自分がメンバーを非難していることに気づいたら、「相手に悪気はない」ということを思い出す。
    - 良かれと思ってやっている可能性もあるのではないかと考える。
2. 説明する(Explain)
    - 「悪気はないとして、では何がそうさせたのか」のシナリオを考える
3. 尋ねる(Ask)
    - 自分が見たことだけを伝え、理由を確認。
        - この際、非難のニュアンスが入らないようにすることが何より重要
4. 計画する(Plan)
    - 相手と一緒に、今後そうしたことが起きないような計画を立てる
        - 相手の改善だけの計画はNG


# 備考
- ToMo指数が高いことによって、計画外のことに柔軟に対処し、創造性の発揮が必要とされる場面では、直接的動機の方が、はるかに高い成果を生み出します。
- しかし、すでに出来ているプランを実行するだけの作業であれば、間接的動機でおこなっても、直接的動機であっても、成果はさほど変わらないらしいです。

# まとめ
- 厳しい管理でメンバーを締め付けると逆効果に働きます
    - 単純労働の場合を除く
- メンバーに対して、「目標」や「やりがい」や「成功体験」が持てるように働きかけ、心理的安全性の高い環境を維持することで、創造性の高い組織になります。
パフォーマンステスト時のTIPS

# パフォーマンステスト時のTIPS

まず、パフォーマンステストの目的は、通常の予定同時接続数においてユーザが満足するパフォーマンスが出るかどうか確認します。その結果を基づいてチューニングを支援するためです。

Webアプリケーションのパフォーマンステストを行う際、テスト結果の信頼性を向上させるためには、様々な観点が存在します。この記事では特にテスト環境の構築において不足しがちな要素に焦点を当て、信頼性向上のために考慮すべき4つのポイントをご紹介いたします。


#### ポイント１：連続リクエスト送信間隔
サーバーのレスポンスパフォーマンスを計測するテストでは、例えば100件のリクエスト送信をシミュレーションしたい場合に、一括に送信するとサーバー側に負荷を与えてしまう可能性があります。逆にリクエスト１件ずつを長い間隔で送信するとあまり意味がないと考えています。
では、連続リクエスト送信の間隔はどれくらい設定すれば効果的なのでしょうか。基本的には前リクエストの処理が終わる前に次のリクエストを送信するという原則を守ることが重要です。
連続リクエスト送信の間隔を計算する方法をご紹介します。
まず、１つのリクエストの平均レスポンス時間を先に計算しましょう。それから各リクエスト送信の間隔は１つのリクエストの平均レスポンス時間と近く小さい時間を設定します。
例として、
`・１つのリクエストの平均レスポンス時間：1ms`
`・連続リクエスト送信の間隔：0.8ms`
というような感じで良いかなと思います。

Jmeterを使う場合、`Ramp-Up期間`という概念がありまして`Ramp-Up期間`とは、すべてのスレッド（リクエストという理解でもOK）が起動するまでの時間です。 この時間内で、等間隔にスレッドが起動します。 

上記の「連続リクエスト送信間隔」と関連する例を記載します。

>事前計測
<table>
  <tr>
    <td> １つのスレッドの平均レスポンス時間 </td> <td>1ms</td>
  </tr>
</table>



→`連続スレッド送信の間隔`は`0.8ms`で想定する。

>Ramp-Up期間設定
<table>
  <tr>
    <td> スレッド数 </td> <td>100</td>
  </tr>
  <tr>
    <td> Ramp-Up期間 </td> <td>80ms (=100 * 0.8ms)</td>
  </tr>
</table>

→ここでスレッド数100を実行したい場合は、Ramp-Up期間に80msを設定していれば良いと思います。

#### ポイント２：複数端末での実施

パフォーマンステストを実行する際、テストを実行する端末（PC）が大量のリソースを消費する場合や、シミュレーションのユーザー数が多すぎると、一台のPCでの実行ではPCがフリーズしてしまい、正確な結果が得られない可能性があります。そのため、テストの実行には必ず2台以上のPCを使用してください。
これにより、リソースの適切な分散とテストの安定性が確保され、信頼性の高い結果が得られるでしょう。

#### ポイント３：異なるネットワークでの実施

パフォーマンステストを一つのネットワークから実施する際、そのネットワークレベルでのキャッシュ機能が影響を及ぼし、計測結果が実際の状況とずれてしまう可能性があります。そのため、より正確な結果を得るためには複数の異なるネットワークでテストを行う設計が望ましいです。
これにより、ネットワークの特定の影響を排除し、テストの信頼性が向上します。

#### ポイント４：十分なTCP/IPポート数
Windows OSの場合、デフォルトのTCP/IPポート数は5,000です。
[netstat – a] コマンドを実行してポートの利用状況を確認できます。
表示される値が5,000を超えていればポート数を増やす必要があります。
`HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/ParametersでMaxUserPort` という名前の新しい `dWord` を作成し、その値を 65,000 等に設定すればOKです（設定後にコンピューターを再起動する必要があります）。
未経験から2年経ったWEBデザイナーの知っておくとちょっと便利なサイト6選

Webデザイン等をする上で、これまで見つけた個人的にちょっと(かなり)便利だなと思っているサイトを紹介します。
頻繁に使用しているサイトはもちろん、いつか使いたいと温めているものも合わせて紹介します！

---

### 1. WebGradients
美しく綺麗なグラデーションがまとめられているサイト。
デザインの時の色決めはもちろん、ワンクリックでcssのコードがコピーできるのでよくお世話になっています。

https://webgradients.com/

--- 

### 2. CSS Section Separator Generator
セクション分けで利用できる、CSSのみで作成された境界線デザインを作成・ダウンロードできます。
微調整も可能なのがありがたいです。
もっと早く知りたかったツールの一つ。

https://wweb.dev/resources/css-separator-generator

---

### 3. CSS Background Patterns
こちらはCSSのみで作成された背景をダウンロードできます。
柄の幅や色、透明度などを調整してからダウンロードが可能です。
個人的には方眼紙みたいなグリッドの背景がお気に入りです！

https://www.magicpattern.design/tools/css-backgrounds

---

### 4. CSS clip-path maker
最近巷でよくみるclip-pathプロパティを直感的に作成できるサイトです。
もちろん作成した図形のCSSコードをコピーできます。

https://bennettfeely.com/clippy/

clip-pathプロパティはアニメーションの幅も広がるのでもっと使いこなしていきたい所存です。

---

### 5. gridpx
コンテンツを横並びにするときに幅やマージンの数値に悩むことはありませんか？
こちらのツールはコンテンツ幅・カラム数・カラム間のマージンを入力することで、カラムのpx数を算出してくれます。
本当に毎回お世話になっています。

https://www.kenjisugimoto.com/gridpx/

---

### 6. 3D Book Image CSS Generator
３Dで書籍を表示してくれるCSSジェネレーターです。
高さや幅、最初の傾きなど微調整ができるので、自分のお気に入りの見せ方が見つかります。

https://scastiel.dev/3dbook


## おわり
以上、私が実際に使用している・したいサイトの紹介でした。
この他に「このサイト実際使っていて便利！」というものがあったら是非教えてください。
AWS Amplify + CognitoでOAuthParam not configuredを解決

## 背景

AWSの[ドキュメント](https://docs.amplify.aws/react/build-a-backend/auth/add-social-provider/)に従って、Amplify + Cognito（Google Provider追加）の環境をセットアップした。

ただ、今回cognitoの設定（別の方が作業した）をimportする形でAmplifyを構築した。
[ドキュメント](https://docs.amplify.aws/javascript/tools/console/auth/import/)

## 問題

1. reactのプロジェクトを普通に構築
2. `amplify pull`で設定を取得、`Amplify.configure()`で設定を読み込む
3. この[ステップ](https://docs.amplify.aws/react/build-a-backend/auth/add-social-provider/#add-custom-state)でサンんプルコードを動かしてみたら、ログインボタンを押すと「OAuthParam not configured」エラーが出る


## 解決

結論、cognitoのアプリケーションクライアント設定にsignout urlが必要である
![スクリーンショット 2023-12-08 12.03.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2332865/58ead162-e699-6744-abfe-d32f45c889b9.png)

再度、`amplify pull`, `amplify push`したら、無事ログインできた。
ibm-cloud-sdk-coreのIAMAuthenticatorを使って IAM トークンの生成(python)

IBM Cloud サービス API の呼び出しには通常IBM Cloud Identity and Access Management (IAM) トークンが必要です(参考: [IBM Cloud サービス API の呼び出し](https://cloud.ibm.com/docs/account?topic=account-iamapikeysforservices&locale=ja))。

このIAMトークンを取得するは、APIキーを使用して、RESTサービスにアクセスして取得します。
- [API キーを使用した IAM トークンの生成](https://cloud.ibm.com/docs/account?topic=account-iamtoken_from_apikey&code=curl)

上記のLinkにはCurlでの取得方法、そしてpythonでの取得コードサンプルがあります。
がしかし、pythonでの取得コードサンプルは以下のように[IBM Cloud SDK](https://github.com/IBM/ibm-cloud-sdk-common/blob/main/README.md)のサービス利用前提となっていて、単独でIAMトークン文字列を取得するコードになっていません。

```python
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator
from <sdk-package-name>.example_service_v1 import *

# Create the authenticator.
authenticator = IAMAuthenticator('myapikey')

# Construct the service instance.
service = ExampleServiceV1(authenticator=authenticator)

# 'service' can now be used to invoke operations.
```

よってIAMトークン文字列のみをpythonで取得したい時は、Curlを参考にRESTリスクエストをpythonで書いてました。

でもせっかくIAMAuthenticatorでおそらくIAMトークン文字列を取得しているはずなので、中にあるんだろうということで、調べました。RESTで書くよりは簡単になります。

# 1. 事前準備
 [`ibm_cloud_sdk_core`](https://github.com/IBM/python-sdk-core)が未導入の場合はpip等で導入してください。
```shell
python -m pip install --upgrade ibm-cloud-sdk-core
```

またAPIKEYが必要なのでない場合は以下を参考に取得して下さい。
- [IBM Cloud APIKEYの作成(取得)方法](https://qiita.com/nishikyon/items/fa8b951267efbe911fe7)

# 2. ibm-cloud-sdk-coreのIAMAuthenticatorを使って IAM トークンの生成

以下のコードを実行すれば`access_token`にIAMトークンが入ります。
`<ここにAPIKEYを入れる>`にAPIKEYの文字列をコピーしてください。前後の`<>`は不要なので含めないようにしてください。
例: `authenticator = IAMAuthenticator('xxxxxxxxxx')`
```python
from ibm_cloud_sdk_core.authenticators import IAMAuthenticator

authenticator = IAMAuthenticator('<ここにAPIKEYを入れる>')
access_token=authenticator.token_manager.get_token()

# 参考までに表示してみます
print(access_token)
```

上記はエラーハンドリングなしなので、本気で使う場合は追加でエラーハンドリングが必要です。Jupyter Notebookなんかで軽く使うならこのまま使えて、RESTで書くより簡単だと思います。

以上です。
【Rails】部分テンプレートのlocalsオプションについて

## 部分テンプレートとは
・RailsではViewをerbファイル（EmbeddedRuby: 埋め込みRuby）で記述できる。
・erbファイルでは共通のパーツを部分テンプレートとして切り出せる。

## 部分テンプレートの使い方
### 作成の仕方
```ruby: app/views/my_partials/_my_partial_hoge.html.erb
<p>hogeの部分テンプレートです</p>
```

### 呼び出し方
```ruby: app/views/sample.html.erb
<%= render partial: 'my_partials/my_partial_hoge' %>
```
※ パスはviews配下から
※ partial:オプションは、省略可能。

## 本題: 部分テンプレートのlocalsオプションについて
部分テンプレートではlocalsオプションで、部分テンプレートに変数を渡すことができる。

```ruby: app/views/my_partials/_my_partial_hoge.html.erb
<p><%= title %>の部分テンプレートです</p>
```

```ruby: app/views/sample.html.erb
<%= render partial: 'my_partials/my_partial_hoge', locals: { title: 'hoge' }%>
```

しかし、他で呼ぶ時にlcoalsオプションを使用しない場合、
部分テンプレート側でローカル変数は定義されないため、エラーとなる（NameError）

とりあえずdefined?で分岐させておくとNameErrorは回避される
```ruby: app/views/my_partials/_my_partial_hoge.html.erb
<p><%= title if defined?(title) %>の部分テンプレートです</p>
```

開発者側のルールとすればそれでもいいのだが、
ローカル変数は、必須なもの任意なものを教えてほしい
~~（というかコンパイルしてエラー出してほしい）~~

## rails7.1以降で部分テンプレートのローカル変数を明示的にできるマジックコメントがある
ひとまずこれでいい。
https://blog.kiprosh.com/allow-template-to-set-strict-locals/
[備忘録] Poetryからrequirements.txtを出力させる

# 出力方法

## [tool.poetry.dependencies]に記述しているもののみ出力させる場合

```shell
$ poetry export -f requirements.txt -o requirements.txt --without-hashes
```

## [tool.poetry.group.dev.dependencies]のものを含める場合


```shell
$ poetry export -f requirements.txt -o requirements.txt --without-hashes --with dev
```

# `poetry export`コマンドの引数

```shell
Description:
  Exports the lock file to alternative formats.

Usage:
  export [options]

Options:
  -f, --format=FORMAT        Format to export to. Currently, only constraints.txt and requirements.txt are supported. [default: "requirements.txt"]
  -o, --output=OUTPUT        The name of the output file.
      --without-hashes       Exclude hashes from the exported file.
      --without-urls         Exclude source repository urls from the exported file.
      --dev                  Include development dependencies. (Deprecated)
      --without=WITHOUT      The dependency groups to ignore. (multiple values allowed)
      --with=WITH            The optional dependency groups to include. (multiple values allowed)
      --only=ONLY            The only dependency groups to include. (multiple values allowed)
  -E, --extras=EXTRAS        Extra sets of dependencies to include. (multiple values allowed)
      --with-credentials     Include credentials for extra indices.
  -h, --help                 Display help for the given command. When no command is given display help for the list command.
  -q, --quiet                Do not output any message.
  -V, --version              Display this application version.
      --ansi                 Force ANSI output.
      --no-ansi              Disable ANSI output.
  -n, --no-interaction       Do not ask any interactive question.
      --no-plugins           Disables plugins.
      --no-cache             Disables Poetry source caches.
  -C, --directory=DIRECTORY  The working directory for the Poetry command (defaults to the current working directory).
  -v|vv|vvv, --verbose       Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug.
  ```
digging...僕はネットにつながっているのかな？

![DALL·E 2023-12-08 11.20.56 - A detailed image of an individual using the 'dig' command on a computer to check internet connectivity. The scene is set in a modern home office. The .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/2d1ffbd0-97b2-3c35-05bd-d95321754fd1.png)

# はじめに

皆さん、コロナも明け、外で仕事をする機会は増えましたか？
そんな私も週に数回はお客様先をコールするようになりました。
外に出たら一番先に何をするのか、そうです、自分のパソコンをネットに繋ぎます。
ただ、ネットにつながったはずなのに、ホームページが開けない、メールが見れない、なんてことはないですか？
時には、ネットにつながっているにも関わらず、接続先のサーバーがダウンしている、なんてこともありました。
そんな時に私が試している方法(あまり大した話ではありませんが)をご紹介します。

# 自分のパソコンがネットにつながっているのか？

以前は、Googleに対してpingコマンドを発行し、replyがあるかどうかで判断していました。
毎回、「Google様に無駄な通信を発生してしまい、申し訳ない」気持ちでいっぱいだったのですが、ある日を境に、pingではなく、別のコマンドを使うようになったよ、というお話です。

# なぜ、pingを使わなくなったのか？

一番の理由はキーボードで打ち込む文字数が多いことです。
例えば

~~~shell:command
$ ping www.google.com
~~~

「スペース入れても、たかだか、19文字でしょ」と思われたかもしれませんが、電車の中だとキーボード操作がしづらかったり、揺れたりなんかするとタイプミスを起こしやすいです笑

さらにGoogle様にICMPメッセージを送信しますし、Ctrl-Cでpingコマンドを停止する必要があります。

あと、まれにですが、ネットにはつながってはいるものの、DNSサーバーが不調で名前解決に失敗し、相手先サーバーと通信ができなかったという事象も経験しました。

/etc/resolv.confをcatして、ちゃんとDNSサーバのアドレスを取得できているのか、そのDNSサーバに接続して、名前解決が正しく行われているのかをnslookupコマンドで調べたりしていたものです。いやー、面倒極まりない。

# 今は、digコマンドを使ってます

こんな面倒な作業から解放してくれるのがdigコマンドです。
やり方は簡単です。

~~~shell:command
$ dig
~~~
と入力するだけ。それもたった3文字で、しかもCtrl-Cでコマンドを中断する必要もありません。

digコマンドは引数にホスト名を指定することができ、ホスト名を指定した場合は、そのホスト名の名前解決を実施し、IPアドレスを返却してくれます。ただし、引数に何も指定しない場合は、単にDNS会の頂点に立つroot DNSサーバ(神DNSサーバ)に通信をとり、現在応答可能なroot DNSサーバとそのIPアドレスを返してくれます。

これが何を意味しているのかって。。。
はい、
* 自分のパソコンがネットにつながっている
* DNSサーバと通信ができ、ホスト名の名前解決の準備ができている

ことを意味するのです。
たったの3文字を入力するだけで、pingコマンドを使っていた時の煩わしさが一気に解決されました。

**digコマンドを実行した時のイメージ**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52151/b91268ee-f471-57e9-91c6-5626b0aeb52e.png)

# 終わりに

「pingで確認してたよ」という人が一番多く、「digコマンドを初めて知った」という方も結構いましたが、皆さんはいかがですか？
少しでも皆さんのネット・ライフに貢献できたら幸いです:beer:

# 参考

https://www.diggui.com/dig-command-manual.php

https://qiita.com/cokemaniaIIDX/items/b5fad7b516f8ce50882f

https://qiita.com/Natukasi/items/a2d7e6c947095e28a885

https://qiita.com/nkoseki/items/f6be5c1b2dd87cca3ca6
【macOS】MySQLWorkbenchが予期しない理由で終了しました。

# 今回の問題

久々にMyMySQLWorkbenchを開こうとしたところ **「MySQLWorkbenchが予期しない理由で終了しました。」** が表示されて実際のデータベースが見れない。

何度開き直しても同じエラーが表示されてしまう。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/7d2d75da-95f6-5594-bb0a-1c35e7e60bb1.png" />

# 解決方法

私の場合単純にMyMySQLWorkbenchのアップデートで解決できた。

以下に実施したアップデート方法を備忘録として記載する。

## 環境
OS: macOS Sonoma(ver.14.1.1)
MyMySQLWorkbench: 8.0.30

## MyMySQLWorkbenchのバージョン確認
一番初めのトップページだけは開くので、現在のバージョンを確認。

ヘッダーのMySQLWorkbenchからAbout MySQL Workbenchで表示。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/07158bbf-0776-db23-a31e-f62eca5c65f0.png" />

現在のバージョンは8.0.30。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/5d60cb58-e7a4-883d-f8cb-c62bfa9ff0ac.png" />


## アップデートを確認
ヘッダーのHelpからCheck for Updatesで確認。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/a2d0ae1d-0716-0c3f-b8a1-b485ecc08c8c.png" />

現在の最新バージョンは8.0.34のようなのでGet it Nowで進んでいく。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/bcf86310-0e82-b576-cb0d-13a72b0d7e13.png" />

## アップデートの実施

表示された画面でOSとバージョンを選択してダウンロードを行う。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/3e914a7e-144f-a6f0-c310-cc9d4c4aaec3.png)

:::note info
ARMかx86かの確認は以下のコマンドで確認可能。
```console
% uname -m
arm64
```
:::

ログインかサインアップが求められるが、画面最下部の「No thanks, just start my download.」でスキップが可能。

<br />

ダウンロード完了後Applicationsフォルダに場所を移すと古い項目をどうするか聞かれるので **”置き換える”** を選択する。

<img width="500" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743174/a406a94d-2124-42e0-c815-6f0583cd70e1.png" />

以上でMyMySQLWorkbenchのバージョンが最新になり、問題なく動作するようになった。
Xfceのウインドウの端の変な隙間をなくす


[Xfce]デスクトップ環境がシンプルで動作が早いので気に入っており、特に大きなカスタマイズをせずに使っています。

ただ、一つだけ気になっていたことがありました。それがウインドウの右端と下の小さな隙間です。このくらい目を瞑ろうかとほったらかしにしてましたが、やっぱり変なので直そうと思います。

![xfce-window-gap 2023-12-07 20-40-36--1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/bf41629c-01aa-a667-b3f6-0f6668354192.png)

ネットで調べてみると、関連の情報はあまりありませんでしたが、同じ問題に悩んでいる人はいました。

https://forum.xfce.org/viewtopic.php?pid=66277

## 直し方

まずは、念のために「Settings Manager > Workspaces > Margins」のマージンの設定が全てゼロであることを確認します。

![settings-workspaces-margins 2023-12-07 21-12-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/1cac823d-a819-876b-eaa9-e2ada612a2cb.png)

僕の場合は、全てゼロになってました。

次に、`$HOME/.config/gtk-3.0/gtk.css`を作り、以下の内容を追加し、ログアウトまたはリブートします。

```css:$HOME/.config/gtk-3.0/gtk.css
VteTerminal, vte-terminal {
  padding-left: 4px; padding-right: 4px;
  padding-top: 6px; padding-bottom: 6px;
}
```

僕の環境では、以下のコマンドでディスプレイマネージャ（[lightdm]）を再起動しました。

```
sudo systemctl restart lightdm
```

これで直りました。場合によってはピクセルの値を調整する必要があるそうです。

![xfce-window-gap--fixed 2023-12-07 20-41-41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/4f4dc2e2-6a18-527d-7631-109af2b453ee.png)

## 原因

よくわかりませんが、こう説明している方がいました。

> The xfce4-terminal window size is dependent on the geometry of the font size and dimensions of the window. This works differently than windows like thunar or mousepad that are sized based on pixel dimensions.

[xfce4-terminal]のウィンドウ サイズは、フォント サイズの形状とウィンドウの寸法に依存するとのことです。

## さいごに

本記事は [闘魂Elixir #59](https://autoracex.connpass.com/event/300542/) の成果です。ありがとうございます。

https://autoracex.connpass.com/

https://qiita.com/torifukukaiou/items/1edb3e961acf002478fd

![toukon-qiita-macbook_20230912_091808.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/82804/fd5c55ec-4fe0-8af6-59bc-bab1ef3d182b.jpeg)

[Xfce]: https://www.xfce.org/?lang=ja
[lightdm]: https://ja.wikipedia.org/wiki/LightDM
[xfce4-terminal]: https://docs.xfce.org/apps/terminal/start