OmniAICreator/Qiita-1.07M huggingface dataset:
ROS1&2 ROSBAG再生、保存時におけるクロック情報の保持方法

## はじめに
タイトルの通り、rosbagを保存時に各トピックのHeaderに保存されるタイムスタンプとは別に取得時間に基づく時刻情報がトピック毎に付与されるわけですがあるターミナルでrosbagをrosbag play(ros2 bag play)で再生、もう一つのターミナルでrosbag record(ros2 bag record)で保存した際にrosbagには元のROSBAGのクロックではなく現在のrostimeがrosbagに付与されてしまうので保存されたデータを使って新しい処理を挟む場合、ros::time::now()等で時刻を取ると取得できるタイムスタンプとヘッダーに付与されたタイムスタンプが異なるという問題が発生してしまいました。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1178362/27d177ed-6041-3d46-ff3d-6d25a1c55bcf.png)
(赤線の箇所)

今回元のrosbagファイルの特定のトピックをノードで処理、再度rosbagで保存をした際に元のクロック情報を保持する必要になったため元のrosbagのクロック情報を保持しつつ処理＆データの保存にはどうしたらいいのだろうかということでちょっと色々と試した結果をここにまとめます。



## ROS1の場合
ROS1の場合、以下のコマンドにてまずはroscoreから出力されるクロックを停止した上でrosbag play時に--clockオプションを有効にすることでrosbag record時の元のrosbagで保持している時刻情報のまま処理をすることができます。
(rosbag recordで保持すると元のrosbagの時刻情報と新たに保存したrosbagの時刻情報が合致しているのが確認できると思います)
```
rosparam set /use_sim_time true
rosbag play ${PATH_TO_ROSBAG} --clock
```


## ROS2の場合
ROS1の時と同様にros2 param setにて/use_sim_timeをセットしようとしたところros2の場合、ROS1で言うとroscoreに当たるものがないので先にros2 bag record $${TOPIC_NAME}を先に立ち上げてROS1と同様にtime_simを有効にしてros2 bag play ${PATH_TO_ROSBAG} --clockでクロック情報を発信させつつros2 bag recordでトピックを保存したところROS1の時とは異なり、生成したrosbagには現在のクロックが記録されてしまっていました。

**(もし元のrosbagクロックを保持し続ける方法ご存じの方いらっしゃったら教えていただきたいです・・・)**

```
ros2 param set /rosbag2_recorder use_time_sim true
```



## 応急処置的な対応
正しくros2系のコマンドを使えばROS2でもできそうな気がしますがぱっと見分からんということで元のrosbagからクロック情報を取得して処理済みデータを保存したrosbagファイルのクロック情報を書き換えるといった荒業な方法にて対応してみました。需要あるかどうか分からないですが一応Githubにあげておきます。
引数に以下のパラメータを渡してあげる事でトピックのヘッダーに含まれるタイムスタンプを元にrosbagファイルの処理前のトピックからクロック情報を取得し、処理済みのrosbagファイルのタイムスタンプを上書きすることで同様の結果が得られ（る気が）します。
・元のrosbagファイルへのパス
・処理済みデータを保存したrosbagファイルへのパス
・処理結果のrosbag保存先のパス
・対象のトピック名
【個人開発】PaPut（パプト）を支える技術

# はじめに
こんにちは、mizukoです！
この度、エンジニアのためのインプット・アウトプットを加速させるサービス「[PaPut（パプト）](https://paput.io)」のβ版をリリースしました！
サービスについてはぜひ[こちら](https://qiita.com/mizuko_dev/items/5335f93bb3c93f407796)をご覧ください！

本記事では、PaPutを支える技術について記載していきたいと思います！

# 技術選定の軸
私が技術選定を行う際に軸にしているのは以下です。
- モダンか？
- 情報は多いか？
- 市場価値は高いか？
- 人材確保は容易か？

いくら素晴らしい技術でも、導入や保守が大変だと無駄なコストがかかってしまいます。
他人にも受け入れやすく、できるだけモダンで今後に繋がるような技術を選定するように心がけています。

# フロントエンド
## フレームワーク
フロントエンドには[Next.js](https://github.com/vercel/next.js)を使っています。
開発当初、丁度App Routerが登場したので、そのまま採用しています。
また、検索エンジンにインデックスしてもらいたいので、基本的にはSSRで動くようにしています。

今だとRemixも選択肢に含まれてくるかなとは思いますが、当時はNext一択レベルだったと思います。
Nuxtに関しては、3への破壊的なバージョンアップ及び3自体のバグの多さを見てしまうと、採用する気にはなれませんでした。。ごめんねNuxt君。。

## Tailwind CSS
UIにはTailwind CSSを利用しています。
柔軟にデザインを実装できるかつ、モバイルファーストなためレスポンシブにも対応しやすい事が採用した大きな理由です。

## 状態管理
状態管理には、グローバルでuseContextとRecoilを併用して使っています。
useContextはアプリケーション全体で利用され、頻繁に更新されない静的な情報を管理し、Recoilではモーダルの表示非表示のような、動的な状態を管理する様にしています。
非同期の状態管理は、TanStack Queryを利用しています。

# アーキテクチャ
アーキテクチャにはfeaturesを採用しています。
採用した理由としては、
- DDDライクになる
- 機能毎にコードをグループ化することで、可読性、保守性が上がる
- コンポーネントの切り方が明確になる

という点です。
atomic designは切り分けが難しくなりがちで、結果的に一貫したコンポーネント設計ができなくなる事が多い印象です。
featuresなら機能毎にシンプルにコンポーネントを切っていけるので、気に入っています！

## その他
- chart.js
- react-calendar-heatmap
- react-hook-form
- react-select
- react-toastify
- react-infinite-scroller
- zod

など

# バックエンド
## 言語
バックエンドではGoを利用しています。
採用理由としては、
- 速度が速い
- 言語仕様がシンプルで良い
- クリーンアーキテクチャと相性が良い（ベストプラクティスではないけど）

の2点と、冒頭で記載した軸で選定しました。
GoはExceptionや継承が利用できないなど、これまでの言語仕様と大きく異なる部分があり最初は戸惑うことも多かったですが、クリーンアーキテクチャと組み合わせて開発していく中では非常にシンプルに開発する事ができて気に入っています。（ここは賛否があるところですよね）
フロントエンドと型の共有が行える、NodeのExpressやNest.jsも選択肢でしたが、上記の開発体験の良さや市場価値の高さ、速度面で強いGoを採用しました。
単純に個人開発のスピードだけ考えると、Nodeを採用した方が効率的かなと思います。

## ORM
ORMはBunを採用しています。
採用理由としては、
- ライブラリ自体が軽量
- 他ORMに比べて高速
- 型安全性が高い

という点です。
開発当初はGormを採用していたのですが、せっかくならと比較し、明らかに高速かつ開発体験が良かったのでBunへ乗り換えました。
その際、[Genも試してみた](https://zenn.dev/mizuko_dev/articles/dbeb7c93883b57)ので、興味がある方は是非見てみてください！

## アーキテクチャ
アーキテクチャはクリーンアーキテクチャを採用しています。
一人で開発を行うにしてはやりすぎ感はあるのですが、今後サービスを作り続ける上で基盤となる仕組みを構築したかったので、あえて採用しました。
基盤ができたので、今後はスピード感を上げて開発していけそうです...！

# インフラ
## ホスティングサービス
### Vercel
フロントにはVercelを利用しています。
言わずもなが、Next.jsと相性が良く、特筆した設定をしなくても簡単にデプロイできます。
素敵

### Render
バックエンドにはRenderを利用しています。
無料枠で十分な機能を使え、デプロイに関してもBluprintデプロイというymlファイルの定義で簡単に行えるので個人開発としては最良な選択肢になりうるかなと思います。
RenderでもDockerのruntimeで動作するようにしているので、Clud RunやECSへの切り替えも容易（なはず）という構成になっています。

## DB
DBはPostgreSQLを採用しており、Renderで動かしています。
拡張機能が豊富なのと、複雑なクエリでのパフォーマンスがMySQLよりも優れているとされているからです。
将来、特に検索周りでクエリが複雑になる可能性が高いので、PostgreSQLを採用しました。
また、全文検索の拡張機能PGrongaも試してみたかったのも一つの要因です。（Renderで利用できなかったので、本番運用はしていません...）

# おわりに
本記事では、PaPutを支える技術を紹介しました！
個人開発をする上で、どんな技術を使うべきか悩んでいる人の参考になれば幸いです🤗

今回リリースした[PaPut（パプト）](https://paput.io/login)も、是非手軽に利用してみて下さい！
サービスの詳細に関してもこちらに記載していますので、是非ご覧いただけると嬉しいです！
chattrコマンドとlsattrコマンド（Linuxのファイル属性の変更）

`chattr`コマンドで、変更不可等のファイル属性を変更することができます。
`lsattr`コマンドで、ファイルの属性情報を表示することができます。

# 環境
+ OS : CentOS Linux release 8.5.2111
+ bash : GNU bash, バージョン 4.4.20(1)-release (x86_64-redhat-linux-gnu)

```console:実行結果
[root@centos85 ~]# cat /etc/redhat-release
CentOS Linux release 8.5.2111
[root@centos85 ~]# bash --version
GNU bash, バージョン 4.4.20(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2016 Free Software Foundation, Inc.
ライセンス GPLv3+: GNU GPL バージョン 3 またはそれ以降 <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[root@centos85 ~]#
```
# 1. chattr コマンド

`chattr`コマンドの書き方は以下の通りです。

`chattr [オプション] [設定する属性] [対象のファイルやディレクトリ]`

代表的なオプションは以下の通りです。
|オプション|説明|
|:---:|:---|
|-v|ファイルの世代情報を設定する|
|-R|対象にディレクトリがある場合はその中身も再帰的に設定する|
|-V|バージョン情報を表示する|

代表的な属性は以下の通りです。
|属性|説明|
|:---:|:---|
|a|追記のみ可能とする|
|c|ファイルを圧縮する|
|d|dumpの対象外とする|
|e|拡張フォーマットを使用する|
|i|変更できなくする|
|j|データのジャーナリングを行う|
|s|安全な削除（データブロック内を消去）|
|t|末尾のマージをできなくする|
|u|削除できなくする|
|A|atime（アクセス時刻）を更新しない|
|D|ディレクトリを同期的に更新する|
|S|同期的に更新する|

# 2. lsattr コマンド

`lsattr`コマンドの書き方は以下の通りです。

`lsattr [オプション] [対象のファイルやディレクトリ]`

代表的なオプションは以下の通りです。
|オプション|説明|
|:---:|:---|
|-a|全てのファイルおよびディレクトリを表示する|
|-d|ディレクトリの内容ではなく、ディレクトリそのものを表示する|
|-v|ファイルの世代情報を設定する|
|-R|対象にディレクトリがある場合はその中身も再帰的に設定する|
|-V|バージョン情報を表示する|

# 3. 使用例

使用例は以下の通りです。

ファイルの属性情報を参照する。
`lsattr sample.txt`

```console:実行例
[root@centos85 ~]# lsattr sample.txt
-------------------- sample.txt
[root@centos85 ~]#
```

ファイルを変更不可にする。
`chattr +i sample.txt`

```console:実行例
[root@centos85 ~]# chattr +i sample.txt
[root@centos85 ~]#
```

変更後のファイルの属性情報を参照する。
`lsattr sample.txt`

```console:実行例
[root@centos85 ~]# lsattr sample.txt
----i--------------- sample.txt
[root@centos85 ~]#
```

ファイルを変更できるよう元に戻す。
`chattr -i sample.txt`

```console:実行例
[root@centos85 ~]# chattr -i sample.txt
[root@centos85 ~]#
```

元に戻した後のファイルの属性情報を参照する。
`lsattr sample.txt`

```console:実行例
[root@centos85 ~]# lsattr sample.txt
-------------------- sample.txt
[root@centos85 ~]#
```

---

以上
20代未経験エンジニアの初投稿

4月よりサイト制作担当として制作会社で勤めている20代の未経験エンジニアです。
あっという間に３ヶ月が経ち、自分のモチベーションを上げることを始めたく、
今回を皮切りにQiitaの投稿をスタートします！

## 経歴について
前職は旅館で接客担当(5年)とSNS担当(2年)を兼任しておりました。
退職後、職業訓練でwebクリエーターコースの講座に6ヶ月通い、Illustrator・PhotoshopといったAdobeソフトの使い方、マークアップ言語であるHTMLやCSSについて学び、実際の飲食店さんのサイトを制作しコンペを行うといったことをしておりました。
そして4月よりwebサイト制作担当として制作会社で働いております。
勤め先は、社員が自分を含めて5人という少人数の会社です。
また、基本リモートで週に1回の出社なので会社の方とお話しすることはほとんどありません。
ですが、週に1回だけの出社でわかるぐらいには皆さんいい人たちで、早く会社に貢献したいなという一心です。

## 現状について
入社より3ヶ月が経ち、現状をまとめてみます。

* wordpressで制作したHPを４社に納品
* HTML,CSSを使用したコーディングでのwebサイトの更新担当1件(先輩から引き継ぎ)
* 基本的に自分一人でサイトを制作
* 自社主催のイベントに関するSNS発信・ブログ更新

以上のような感じで仕事は進んでおります。

## 自身の所感
気づいたら3ヶ月なのかという気持ちと、まだ3ヶ月かという気持ちがぶつかっている日々です。
3ヶ月経って、会社にはだいぶ慣れてきましたし、なかなか会うことのない社員の皆さんとも少しずつですが打ち解けている気がします。
一人で任される仕事も増えてきて、頼ってもらえている感覚が自分に自信を与えています。
とにかくできなくてもやってみて、今なら質問をするのが当たり前だからねという周りからのありがたい環境に甘えて、わからなければ頼る、これを繰り返しています。
もちろん日々その回数が減ってきていて、先輩にも訂正される回数が減ってきていることが自分にとっては嬉しい成長です。

## これからの自分
ただ、3ヶ月経つと次のステップにいかなくてはならない気が自分の中でしていて、勉強しないといけないこともたくさんあるよな、でもどうしたらいいか分からないというジレンマを抱えていました。
そんな折に、代表との面談がありましたので、これについて相談させていただきました。
おかげさまで私の今後しばらくの目標を見つけることができました。
目標がないと、そこに辿り着くための道筋が見えてこない。それが私の抱えるジレンマの原因ではないかと思います。
今はゴールが見つかったので、そのためにやってみたいことを色々整理していこうと思います。


## 最後に
今回は自己紹介と3ヶ月の振り返りについて記事にさせていただきました。
これを読んで、同じような境遇の方の共感を得られたら嬉しいですし、先輩方からはこれから先のエンジニア人生に向けてアドバイスを頂戴できたらありがたいです。
この記事を皮切りに、投稿を継続できるように学びをアウトプットしていきたいと思います。
これからどうぞ、よろしくお願いします:)
Linuxのメモリ使用量を意図的に増減させる

## 概要

特別なツールを使わずに、bashと簡単なコマンドでLinuxのメモリ使用量を意図的に増減させる

## やり方

1. 適当な容量のファイルを作成する
1. メモリ使用量を増やすには、bashの変数に作成したファイルの中身を食べさせる
1. メモリ使用量を減らすには、ファイルの中身を食べさせた変数をunsetする

## 具体的に

### 1. 適当な容量のファイルを作成する

ここでは100MBのダミーファイルを作っています
ファイルサイズはお好みに合わせて適当に調整すればよいです

```shell:100MBのファイルを作成する例
$ dd if=/dev/zero bs=1M count=100 | base64 | head -c 100M > 100m.data
$ ls -lh 100m.data
-rw-r--r--. 1 user1 user1 100M May  3 05:22 100m.data
```

### 2. メモリ使用量を100MB増やす

適当な変数に作成したファイルの中身を食べさせると、メモリ使用量が増える

```shell:増やす前(usedが326MB使用している)
$ free -m
               total        used        free      shared  buff/cache   available
Mem:            1775         326        1283           9         317        1448
Swap:           2083           0        2083
```

```shell:メモリ使用量を増やす
$ MEM1=$(cat 100m.data)
```

```shell:増やした後(usedがだいたい100MBぐらい増える)
$ free -m
               total        used        free      shared  buff/cache   available
Mem:            1775         406        1204           9         317        1369
Swap:           2083           0        2083
```

### 3. メモリ使用量をもっと増やす

増やしたい分だけの数の変数に、それぞれ最初作成したファイルの中身を食べさせます
ここでは、上のMEM1とあわせて合計5個の変数にそれぞれ100MBのファイルを食べさせたので、合計で500MBぐらいメモリ使用量が増えました

```shell:別の変数にも同じようにデータを食べさせる
$ MEM2=$(cat 100m.data)
```

```shell:さらにメモリ使用量が増えた
[user1@localhost ~]$ free -m
               total        used        free      shared  buff/cache   available
Mem:            1775         497        1112           9         317        1277
Swap:           2083           0        2083
```

```shell:どんどんデータを食べさせる
$ MEM3=$(cat 100m.data)
$ MEM4=$(cat 100m.data)
$ MEM5=$(cat 100m.data)
```

```shell:合計500MBぐらいメモリ使用量が増えた
$ free -m
               total        used        free      shared  buff/cache   available
Mem:            1775         804         806           9         317         971
Swap:           2083           0        2083
```

### 4. メモリ使用量を減らす

メモリ使用量を減らすには、その変数をunsetすればよいです

```shell:メモリ使用量を減らす
$ unset MEM1
$ unset MEM2
$ unset MEM3
$ unset MEM4
$ unset MEM5
```

```shell:減らした後(usedが増やす前と同程度に戻っている)
$ free -m
               total        used        free      shared  buff/cache   available
Mem:            1775         296        1314           9         317        1479
Swap:           2083           0        2083
```
国内クレジットカード情報漏えいインシデントまとめ/2024年6月公表分

## 概要

- 2024年6月に公表されたクレジットカード情報漏えいインシデントのまとめです

## notes
- この月間に公表したものなので、各インシデントごとの被害発生期間は別です
- どの程度のインシデントと被害が月ごとに発生しているかの備忘録なので、個別具体的名称は書きません
- 被害に遭った可能性のある人には事業者等より個別に連絡があると思われます

## 当月の被害の概要

- この月は、3件のクレジットカード情報漏えいインシデントが国内で公表されました
- 合計で、24,193件ほどのクレジットカード情報について漏えいの可能性があるそうです

## 当月のインシデント

### 1. 服飾小売・受注販売サイト

- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- 2024年1月18日に、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 1,054名のセキュリティコードを含むクレジットカード情報について漏えいした可能性があります
- クレジットカード情報の漏えい期間は、2021年5月21日～2024年1月2日とのことです
- 3,126名の個人情報の漏えいの可能性があることについて公表されています

### 2. 音楽関連商品販売サイト

- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- 2024年1月15日に、警察より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 4,696件のセキュリティコードを含むクレジットカード情報について漏えいした可能性があります
- クレジットカード情報の漏えい期間は、2021年4月10日～2024年1月14日とのことです
- 2,092名の個人情報の漏えいの可能性があることについて公表されています

### 3. 食品販売サイト

- 割賦販売法における、クレジットカード情報非保持化タイプと推測されます
- 原因は、当該サイトの脆弱性の放置と推測されます
- 2024年4月19日に、一部のクレジットカード会社より漏えいの可能性の連絡を受けてインシデントが発覚したそうです
- 18,443名のセキュリティコードを含むクレジットカード情報について漏えいした可能性があります
- クレジットカード情報の漏えい期間は、2021年3月30日～2024年4月19日とのことです
- 54,583名の個人情報の漏えいの可能性があることについて公表されています

## 感想

今月の被害はこの数年間において比較的平均的だったと思います
SMTPがセキュアでないのを突っ込むのはありなのか？

## SMTPがセキュアでないことが多い？

この記事で

https://qiita.com/ripple_naip/items/a5d13bb4a973a77d5c2a

SMTPサーバーがSTARTTLS対応していないだの、古いTLSバージョンを受け入れるだの書きましたが
もうちょっと調べてみました。

STARTTLSにすら対応していないのは、さすがに手抜き以外に感想が無いのだけど。
TLSバージョンに関しては、ある程度古いバージョンが残るのも仕方ないのかな？と思ってみるけどはたして？

CRYPTERECのガイドラインを見てみた。

https://www.cryptrec.go.jp/op_guidelines.html

２０２４年６月にガイドライン更新されていた。
「TLS暗号設定ガイドライン」第3.1版によると
推奨セキュリティ・高セキュリティでTLS1.2(必須),TLS1.3(オプション)とされTLS1.2以下は使用不可。
セキュリティ例外型としてTLS1.3～TLS1.0を使えることになっている。

セキュリティ例外型は「TLS 暗号設定ガイドライン － 38」に
> 安全性より相互接続性に対する要求をやむなく優先させてTLS通信させる場合に

とわざわざ太字で書いてある。

さらに赤字で

> 2029年度を目途とした改定時に終了させる予定である。速やかに推奨セキュリティ型への移行を完了させるべきである。


と書いてある。

つまり、基本的にはTLS1.2以上を使え、それで問題があるならひとまずは1.0/1.1を使ってもいいけど。と言っている。

ここまでだとTLS1.2未満にも対応しているのは、
システムが複雑で対応が出来ていないか
いまだにTLS1.2以上に未対応のMTA(メール送信サーバー)がいるか
という事になる。
いや、TLS1.2以上に未対応のMTAっているのか？


## 実際にはどうなのか？

WebサイトではSSL Labsによれば

https://www.ssllabs.com/ssl-pulse/


2024年5月時点で
TLS1.2サポート:99.9%
TLS1.2未満のみサポート:0.1%以下
TLS1.2未満もサポート:30%程度

****

SMTPだとどうなのかなとちょっと探してみたら調べてる人がいました。

接続して確認なのでMDA(メールを受信するサーバー)ですが

https://speakerdeck.com/hirachan/1-dot-1fei-zhi-nixiang-kete-jpaawg-6th-open-round-tableyi-shi-lu

2023年7月で
TLS無し:24.4%
TLS1.2未満：62.8%
TLS1.2以上のみ：12.8006%

TLS1.2以上のみにしているところはかなり少ない、と判断していいのかな。
MTAの状況はわからないけど、OpenSSLでTLS1.2が対応したのは１０年以上前の1.0.1で
かなり前にサポート終了しているので、さすがにそれ以降のバージョンで動いて
対応していると思いたいが、実際にはどうなんだろう？？。

****

スライドで「詳しくWebでとのことなので」とのことなので、こちら読んでみました。

https://qiita.com/hirachan/items/a7c87ae44453f30f2f37

> 1.0/1.1を中途半端に使うなら、平文で送る
> 1.0/1.1を許可すると1.3をちゃんと使いたい相手が脆弱になる可能性があるので平文が良い。

この辺り、すごくわかるなあ。
ただこういう問題なら、いま非対応なところは一気に1.2以上のみに出来るのか。

****
STARTTLS(>=1.2)+MTA-STSに対応するに越したことはないが、
メール配送の世界では古い環境が残りやすいみたいです。

しかし、MTAでの対応状況ってどうなっているのだろうか？
調査は難しいんだろうけど、切り替えが進まないというのもあるのかもしれないけど。
Testrailの良し悪しについてまとめてみる

## はじめに
弊QAチームでは約1年半に渡り、テスト管理にはTestrailを使っております。
2024年6月、チームの部署変更がきっかけで、テスト管理ツールを見直すことに。
継続要否を決めるにあたりチームで議論した
「Testrailの良いところ、イマイチなところ」をまとめてみます。
※主にスプレッドシートとの比較になることをご了承ください



## 前提
- QAチームについて
    - 筆者含む7人体制
    - 約1年半、テスト業務にはTestrailを使用
        - メンバーはTestrail熟練者
- 筆者について
    - QA歴：9年弱
        - 上記QAチームのリード。その為この半年間テスト業務はやってなかった
    - しかし、最近テスト業務もやることになった
        - Testrail歴は約2ヶ月の素人Testrailer
    - 過去のテストケースは99％スプレッドシート


## 良いところ

- **画像挿入しやすい**
    - ドラッグ&ドロップでできるのが直感的！
- **項目を検索しやすい**
    - スプレッドシートでは都度シートを開く必要がある
- **セクションごとのコピーが楽**
    - スプレッドシートだとセルがズレることも…
- **テスト実施時に見やすい**
    - スプレッドシートは横長になりがち
- **コメントを残せる**
    - テスト実施状況のログを細かく記録できる！
 
## イマイチなところ

- **項目作成が手間**
    - 項目のガワを作成→中を開き「手順」や「期待値」を入力する というUX
        - そのため、1項目ごとに画面遷移を1つ挟む必要がある
:::note info
項目が多い場合はCSVでのインポート機能を使うと良い
::: 

- **表が作りづらい**
    - 直行表やペアワイズテストなどとの相性が悪い
:::note info
スプレッドシートで表を作り、Testrail上にURLを貼るハイブリッド形式で対応
::: 

## 終わりに
厳正なる議論の結果、今回はTestrailを継続することに決定！
議論の中で出てきた「イマイチなところ」はnoteに記載の対応でカバーしていくことになりました。

テストリードの立場からしてみると、テスト内容やプロセス改善に使えそうな機能もあるように見受けられますが、まだ使いこなせていないのが正直なところ…。
これからじっくり、その良さを引き出していけたらと思います。
TypeScriptで配列要素のパラメータの総和を出す

Qiita内にありそうでなかったっぽいので、備忘録も兼ねて書いておきます。

```typescript
function sumOf<T>(arr: Array<T>, f: (el: T) => number): number {
    return arr.reduce<number>(
        (sum: number, el: T) => sum + f(el),
        0
    );
}

// 数値配列ならば恒等関数と一緒に渡せば総和が出ます
sumOf([1, 2, 3, 4], el => el)

// 数値ではないものの配列でも、それから数値を返させる関数があれば総和が出せます
sumOf([{a: 1, b: 'hoge'}, {a: 3, b: 'fuga'}], el => el.a)

// 配列要素から数値が出てくれば、総和を取る対象の出し方は何だって良いです
sumOf(
    [{expect: 100, actual: 90}, {expect: 100, actual: 110}],
    el => (el.actual - el.expect) * (el.actual - el.expect) / el.expect
);

```
新しい案件にアサインされたときにいち早く戦力になる方法

私はチームに入ってから1年程度で5つの案件に関わってきました。

新しい案件にアサインされると、環境やプロジェクトの内容が変わるため、最初は戸惑うことも多くストレスに感じることもあるでしょう。
その中でも迅速に適応し、成果を出せる人は、どの職場でも高く評価されますしストレスを感じる時間も短くなると考えられます。
この記事では、アサインされた案件でいち早く戦力になるためのコツを紹介します。

# 情報収集をする
新しいプロジェクトでは、**情報が命**です。
以下の方法で効率的に情報収集を行いましょう。
- **プロジェクトのドキュメントを確認**
仕様書、過去のレポート、会議の議事録など、プロジェクトに関連するドキュメントを丁寧に読み込みます。
- **プロジェクトメンバーと話す**
プロジェクトの主要なメンバーや顧客と話をして、背景情報や期待される成果を確認します。
- **過去の成果物のレビュー**
これまでの成果物やコードを確認して、どのような基準で作業が行われているのかを理解します。

私は**ドキュメントの確認**に一番時間をかけています。

私の所属するチームでは、報告やメモのために各個人用のSlackチャンネルを用意し、全社員が閲覧可能にしています。
そのため、ドキュメントだけではなく同じような作業をしている人のslackの案件のスレッドを覗くことで情報を収集することもあります。

# 関連する技術の学習をする
新しい技術やツールを使用する場合、自己学習が不可欠です。
新たな言語だけではなくメソッドなどもこの対象です。

- **オンラインリソースを活用する**
UdemyやCourseraなどのオンラインプラットフォームで、関連するコースを受講します。
- **書籍やドキュメントを読む**
関連する書籍や公式ドキュメントを読み、知識を深めます。

活用するリソースも大切ですが、ここで重要なのは自分のわかっていない点を明確にすることであると考えています。
例えばrailsの案件に参画したばかりの私の話をしましょう。
以下のようなコードの処理を書き換えたかったのですが動きがいまいち理解できず困っていました。
```slim
restructured_data.map do |category, subcategories|
  characters = subcategories.map do |subcategory, point|
    detail = I18n.t("attributes.#{subcategory}.detail")
    equation = TRAIT_METRICS[subcategory][:equation]
    {
      title: subcategory,
      category_text: I18n.t("attributes.#{subcategory}.category"),
      text_detail: I18n.t("attributes.#{subcategory}.detail"),
      description: detail,
      score: point.round,
      key_traits: equation.keys.map { |key| I18n.t("core_traits.#{key}.name") }
    }
  end
end
```
以下が「いまいち理解できていない」事象を分解した私のメモです。

:::note info
charactersに何が入っているのか把握できていない
- subcategoriesとはどんなデータか理解できてない
- .mapのイメージが自分の中で構築できていない
:::

このように事象に対してこの事象がわからないのはなぜ？という問いを繰り返すとどこが理解できていないのか明確になってくると思います。
分解したことを元にドキュメントなどで理解をします。
点を集めると線になるようにコードも部分部分を理解していくことで全体像がわかってくるようになると思います。

# 積極的なコミュニケーションを図る
チームメンバーとのコミュニケーションは、迅速な適応に欠かせません。
情報によっては人に聞く方が早いこともあるので、相談しやすい関係を構築しておくと良いです。
- **定期的なミーティングに参加**
定期的にチームミーティングに参加し、最新の情報を共有します。
- **フィードバックを求める**
自分の作業に対するフィードバックを積極的に求め、改善点をすぐに取り入れます。

若手であり、まだまだ知識不足なため他の企業の方とのミーティングなどに参加することはまだありません。
同じ案件内の先輩からコードに対するフィードバックをいただくことはあります。
また、対面で会った際には日常のたわいもない会話をするなどしてコミュニケーションをとり、関係構築をするようにしています。


# 最後に
これまで述べてきたことに通じることは「積極的な姿勢」だと考えています。
人は一生懸命に頑張る人を助けたり、応援したいと思う生き物だと思っています。
積極的な姿勢で仕事に取り組むことで周りの人に助けてもらいながら一日でも早く戦力になれると思います。

ここまで読んでいただきありがとうございました。
BigQueryでデータの重複チェック！

BigQueryデータマートを作成する際やデータの数値検証をする際によく使うSQLのメモ。
BigQUeryでなくてもいけると思う。

たとえば、下記のようなテーブル「sample」があるとする。カラムはanimalとfavoriteである。

|animal  |favorite  |
|---|---|
|dog  |meat  |
|cat  |vegetable  |
|dog  |fish  |
|fish  |vegetable  |

様々な処理を施しanimalユニークなテーブルだと想定していたが、上記の表のとおり、animal='dog'のデータが2つある。
このような重複が発生しているデータを取得するSQLは下記である。

```
WITH
TMP AS
(
    SELECT
        animal
        ,COUNT(*) AS CNT
    FROM
        sample
    GROUP BY
        animal
)

SELECT
    *
FROM
    animal A
WHERE
    EXISTS
        (
            SELECT
                *
            FROM
                TMP B
            WHERE
                A.animal = B.animal
                AND B.CNT >= 2
        )
ORDER BY
    animal
    ,favorite
```

最後のORDER BYは状況に応じて実装する。
今回でいえば、下記のような結果が出力される。
|animal  |favorite  |
|---|---|
|dog  |fish  |
|dog  |meat  |

ちなみに、複合主キーの場合についても、同様に実装できる。

じゃあ例えば、今回のsampleテーブル（下記、再掲）で、(animal, favorite)の組み合わせが複合主キーだとする。
|animal  |favorite  |
|---|---|
|dog  |meat  |
|cat  |vegetable  |
|dog  |fish  |
|fish  |vegetable  |

この場合は下記で重複チェックができる。

```
WITH
TMP AS
(
    SELECT
        animal
        ,favorite
        ,COUNT(*) AS CNT
    FROM
        sample
    GROUP BY
        animal
        ,favorite
)

SELECT
    *
FROM
    animal A
WHERE
    EXISTS
        (
            SELECT
                *
            FROM
                TMP B
            WHERE
                A.animal = B.animal
                AND A.favorite = B.favorite
                AND B.CNT >= 2
        )
ORDER BY
    animal
    ,favorite
```

この場合は、重複が存在しないので、BigQueryであれば「表示できるデータがありません」のような表示が出てくる。

お終い。
ボビーオロゴンに倣う

[前回の問題一応解決しました](https://qiita.com/suzukidog/items/34b6c0665a0fdf95378a#%E8%A7%A3%E6%B1%BA%E6%B8%88%E3%81%BF20240703)

***
今プログラミングの勉強で手一杯だが、投資の勉強もしたいと思っている。
しかし投資の勉強をはじめたらプログラミングの勉強効率が落ちてしまう…。
…がこのモチベーションを失いたくはない。

学生だって１日のうちにいくつもの教科を勉強するんだ。
今ひとつに絞っているが勉強するものがふたつに増えたところでそこまで支障は出ないはずだ！！
ということでちょっとずつ投資の勉強も始めようと思っています。

とは言ってもメインはプログラミングなので本当にちょっと勉強するだけです。

ボビーオロゴンも言っていました…大金が貯まってから始めたら失敗するリスクが大きい。収入が少ないなら少ないなりに投資をするものだと。
俺もそう思います。
お金がないならデモ口座でいいので経験を積むべきだと思います。

まあまだなにもしていないうちから偉そうなことはいえませんが…。
ミドルウェアのインストールからポート開放まで

### 概要
Rocky Linux でのミドルウェアインストールからポート解放までの一連の作業をまとめる
Apache（ウェブサーバー）を例にする

#### インストール
Apacheのインストールは過去記事参照
[パッケージ管理ツールdnfを使ってみた](https://qiita.com/tonoaki_sato/items/d0b62ca32146df880c2c#%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB "パッケージインストール")

#### サービス起動と起動確認
* systemctl を使う
* Active: active（running）となっていればOK
```console
// サービス開始
[root@marmoset ~]# systemctl start httpd

// サービス確認
[root@marmoset ~]# systemctl status httpd
● httpd.service - The Apache HTTP Server
     Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; preset: disabled)
     Active: active (running) since Wed 2024-07-03 15:35:41 JST; 6s ago
       Docs: man:httpd.service(8)
   Main PID: 4562 (httpd)
     Status: "Started, listening on: port 80"

// （参考）サービス停止
[root@marmoset ~]# systemctl stop httpd

// （参考）サービス再起動
[root@marmoset ~]# systemctl restart httpd
```

#### 自動起動設定と設定確認
```console
// 自動起動設定
[root@marmoset ~]# systemctl enable httpd
Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

// 設定確認
[root@marmoset ~]# systemctl is-enabled httpd
enabled

// （参考）自動起動設定を解除
[root@marmoset ~]# systemctl disable httpd
```

#### ポート開放と開放確認
Apacheのデフォルトポート80番を開放する
簡易的にサービス名で指定
```console
// ポート開放
[root@marmoset ~]# firewall-cmd --add-service=http --zone=public --permanent
success

// （参考）開放済みのポートを開放しようとすると警告メッセージが表示される
[root@marmoset ~]# firewall-cmd --add-service=http --zone=public --permanent
Warning: ALREADY_ENABLED: http
success

// ファイアウォールリロード
[root@marmoset ~]# firewall-cmd --reload
success
```

ポートの開放状況を調べる
services: に http があればOK
```console
[root@marmoset ~]# firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3 enp0s8
  sources:
  services: cockpit dhcpv6-client http ssh
  ports: 3000/tcp
  protocols:
  forward: yes
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

#### 導通確認
ホストOSのブラウザで https://192.168.56.130/ を開く。
HTTP Server Test Page が表示されればOK
挨拶エンジニアが最近思うこと

# はじめに
挨拶は基本的なコミュニケーション手段ですが、意外と多くの人がこれを形式的に済ませています。例えば、朝の「おはようございます」がただのルーティンになってませんか？これは問題です。なぜなら、挨拶一つでその日の自分の気持ちだけでなく、職場全体の雰囲気が左右されるからです。正しく、心を込めて挨拶をすれば、相手にポジティブな印象を与え、コミュニケーションの質を向上させることができます。この記事では、日常でよく見落とされがちな、挨拶の力について私の観察と考えを共有します。

# 挨拶の対象を人に向ける
例えば、「お疲れ様です！」と言われたときに、パソコンに向かって「お疲れ様で〜す」と言っていませんか？ そこで、私が心掛けているのは全員の目を見て挨拶をすることです。一見些細なことですが、積み重ねることでチームに明るい雰囲気を作り出せます。作業に集中している、急な要望が来ているなど言い訳は多いですが、挨拶は一瞬です。必ず相手の方を向いて言いましょう。これにより、相手への尊重と感謝の気持ちが伝わります。

# おわりに
小さな努力が大きな変化を生み出すことを忘れないでください。
元気な挨拶を心掛けることで、自分自身も周りも明るくすることができます！
GA4→BigQueryエクスポートデータをPV（ページビュー）単位に集約

GA4からBigQueryにエクスポートされたデータを加工する際の工夫のメモ。

GTMなどで独自にイベント（例えば、event_name='sample'）を発火させる場合に、このsampleイベントのデータを取得しつつ、ページビュー単位のテーブルを作成する方法について。

その１．
・全データを取得しつつ、下記のようにpage_viewイベントかどうかのフラグを作成する。
・セッションID（user_pseudo_idとga_session_idを結合して作る、セッションユニークなID）カラムは作成しておく。下記ではunique_session_idと呼ぶ。
```
CASE
    WHEN event_name = 'page_view' THEN 1 
END AS page_view_flg
```

ちなみにga_session_idは下記のイメージ
```
select value.int_value from unnest(event_params) where key = 'ga_session_id'
```

その２．
その１の結果に対して、下記の処理を行う。
・page_viewイベントのレコードに対して、セッション内でのpage_viewイベントのナンバリングを行う。
```
CASE
    WHEN page_view_flg = 1 THEN
        ROW_NUMBER() OVER (PARTITION BY unique_session_id, page_view_flg ORDER BY event_timestamp)
END AS page_view_num
```

その３．
その２の結果に対して、下記の処理を行う。
・page_viewイベント以外のレコードに対しても、直前のpage_viewイベントのレコードのpage_view_numを付与する
```
LAST_VALUE(page_view_num IGNORE NULLS) OVER (PARTITION BY unique_session_id ORDER BY event_timestamp) AS page_view_num
```

その４．
その３の結果に対して、下記の処理を行う。
・page_view_num内でカラムの値を共有し、SELECT DISTINCTでデータを取得する
　分析関数は、FIRST_VALUE()、LAST_VALUE()、SUM()なのかはカラムの定義に併せて実装する。
　セッション単位のカラムについては、PARTITION BY でpage_view_numを使わないように。
```
LAST_VALUE(sample_column IGNORE NULLS) OVER (PARTITION BY unique_session_id, page_view_num ORDER BY event_timestamp ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS sample_column
```

お終い。


【注意点とか】
・ページビューイベント以外のイベント数の集計であれば、その４で、分析関数SUM()を使う。
・同一ページビュー（次のページビューイベントまでに発生したイベントを含む）で、複数のsampleイベントが発火したとして、これらを識別した状態でテーブルを作成することは想定していない。
　→もし識別した状態で作成するなら、上記のその１～その４を、sampleイベントベースでも行い、ページビューイベントベースのテーブルと結合すればOk。
 　ただし、同一ページビュー（次のページビューイベントまでに発生したイベントを含む）で複数のsampleイベントが発生しているデータについては、イベント数の集計が重複することに注意。
　 この場合は、ページビュー数はCOUNT(DISTINCT uniuq_session_id, page_view_num)みたいなイメージ。
nodenvでよく使うコマンド一覧

### nodenvでインストールが可能なNode.jsのバージョン一覧を出力

```bash
nodenv install -l
```

### 指定したnode.jsのバージョンを新規インストール

```bash
nodenv install 18.19.1
```

### 既にインストールされているNode.jsのバージョン一覧を出力

```bash
nodenv versions
```

### 現在のディレクトリで利用するNode.jsのバージョンを設定

```
nodenv local 18.19.1
```

### グローバルで利用するNode.jsのバージョンを設定

```
nodenv global 18.19.1
```
flutter_svg_test でテスト対象の svg が見つからないとき

## 概要
[flutter_gen](https://pub.dev/packages/flutter_gen)、[flutter_svg](https://pub.dev/packages/flutter_svg)、[flutter_svg_test](https://pub.dev/packages/flutter_svg_test) を利用したアプリの Widget Test で svg が表示されているかのテストコードを実装したところ、表示されているはずの svg が見つからないという事象が発生したので、調査した。

## 結論
`SVGPicture` のインスタンス生成方法によって変わることがわかった。

```dart
// SvgPicture.asset('/assets/my.svg') のようにインスタンス生成していた場合は、Find by BytesLoader で紹介された記述が使える
⭕
final SvgPicture asset = SvgPicture.asset('/assets/my.svg');
expect(find.svg(asset.bytesLoader), findsOneWidget);

// flutter_gen を利用してインスタンス生成した場合（ソースコード上で Assets.my.svg() を利用している）は、Find by BytesLoader で紹介された記述が使えないので
// Find by svg path で紹介された記述を使う
❌ 
final SvgPicture asset = SvgPicture.asset('/assets/my.svg');
expect(find.svg(asset.bytesLoader), findsOneWidget);

⭕
final svg = '/assets/my.svg';
expect(find.svgAssetWithPath(svg), findsOneWidget);
```

## おわりに
ドキュメントをちゃんと読みましょう。
C_TS4FI_2021 SAP Certified Associate - SAP S/4HANA 2021 for Financial Accounting対策（11/100）

【11日目】
トピック 1：組織割当およびプロセス統合（11/15）

≪問題11≫
財務会計で代入を定義するには、次のどのステップが必要ですか。
正しい答えを3つ選択してください。
□管理領域に代入ルールを割り当てる。
□有効化レベル2を選択する。
□論理式エディタを使用して、異なるステップを持つ代入ルールを定義する。
□正しい呼出位置を選択する。
□権限グループを設定する。

≪解答≫
□管理領域に代入ルールを割り当てる。
■有効化レベル2を選択する。
■論理式エディタを使用して、異なるステップを持つ代入ルールを定義する。
■正しい呼出位置を選択する。
□権限グループを設定する。

≪解説≫
◆正解の選択肢の解説
・有効化レベル2を選択する。
有効化レベルは、代入がどのレベルで有効になるかを設定するためのものです。有効化レベル2を選択することで、代入ルールが適用される範囲を指定します。
・論理式エディタを使用して、異なるステップを持つ代入ルールを定義する。
論理式エディタを使用することで、複雑な条件を持つ代入ルールを設定できます。これにより、特定の条件下でのみ代入を実行するように細かく定義することができます。
・正しい呼出位置を選択する。
呼出位置は、代入ルールが実行されるタイミングを指定します。これにより、特定のプロセスやトランザクション中に代入が適用されるように設定します。
◆不正解の選択肢の解説
・管理領域に代入ルールを割り当てる。
管理領域（Controlling Area）は主に管理会計で使用されるものであり、財務会計の代入ルールの定義には直接関係しません。
・必要な権限設定を行う。
権限設定はシステムのセキュリティに関するものであり、代入ルールの定義自体には関与しません。
Tiny Character Controller でキャラクターをジャンプさせよう

# Tiny Chacater Controller とは

Tiny Character Controller（以下、TCC）は、GitHub上で無料公開されている、**キャラクターの挙動を複数の小さなコンポーネントを組み合わせて実現するシステム**のことです。

具体的には、**「Brain」「Check」「Control」「Effect」** という4つの基本的なコンポーネントを組み合わせることで、キャラクター挙動の構築・カスタマイズを簡単にしてくれます。

各コンポーネントの説明は、[リポジトリ](https://github.com/unity3d-jp/Project_TCC)下部の解説ドキュメントに記載されています。

# TCCのインストール

TCCをまだインストールしていない方は、[こちらの記事](https://qiita.com/GameDevEgg/items/ea07565f384754fff758)を参考にインストールしましょう。

# 必要なコンポーネントのアタッチ

TCCでキャラクターをジャンプさせるには、**JumpControl** コンポーネントが必要です。
さっそく、キャラクターのオブジェクトにアタッチしましょう。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470968/b73f4bc6-f1b6-6423-0123-33029d9cfc7b.png">

無事にアタッチすると、画像のように警告が表示されます。

これは、「いずれかの **Brain**、**Gravity**、**足元の接地判定**、**頭上の接触判定** のコンポーネントを必要としている」ということなので、それぞれ1つずつアタッチしていきます。

警告が表示されなくなったら準備完了です。

# TCCでキャラクターをジャンプさせる

続いて、キャラクターをジャンプさせる処理を実装します。
適当なスクリプトをプレイヤーにアタッチして、下記のコードをコピペして下さい。
そして、ボタンなどからJumpPlayerメソッドを呼び出しましょう。

```cs
using UnityEngine;
using Unity.TinyCharacterController.Control;

public class Test : MonoBehaviour
{
    private JumpControl _jumpControl;
    void Start()
    {
        _jumpControl = GetComponent<JumpControl>();
    }

    public void JumpPlayer()
    {
        _jumpControl.Jump();
    }
}
```

ボタンを押すとプレイヤーがジャンプするのが確認できると思います。
これで、TCCでキャラクターをジャンプさせることに成功しました！

JumpControlコンポーネントの各プロパティを設定することで、
自分好みのジャンプ挙動を実装することもできます。

ご覧いただきありがとうございました :laughing:
EBSボリュームをデタッチできないときにやったこと(Windows 2016 Datacenter Edition)

数週間後には忘れそうだったので備忘として残します。
OSの言語が英語になっているので、必要に応じて読み替えていただければと思います。

# 事象
・OSのDisk Managementからディスクをオフラインにできない
・AWSコンソールから「ディスクのデタッチ」をして「成功」ときてもボリュームの状態が「使用中」のまま

# 原因調査
コマンドラインから実行したところ、下記画像のように「The operation is not allowed on a disk that contains a pagefile volume.」と表示される。Pagefileが含まれているボリュームはデタッチできない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/7b0d1740-a499-ee02-5e5d-74ddf6d93915.png)

# 対処法
Pagefileをデタッチしたいボリュームから削除する。手順は以下の通り。

## 1.検索ボックスに「sysdm.cpl」と入力
## 2.「Advanced」>Performanceの「Settings」>「Change」の順にクリック
画像からはPerformanceの「Settings」は隠れているので注意。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/d5c021f9-9cec-6970-4d62-41aa6084941a.png)

## 3.対象のボリュームを選択し、「No paging file」> Set > OK > Applyの順にクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2986198/7be21fba-0c38-d3f5-b70b-5fdcac25b59c.png)

## 4.OSを再起動する
OSの再起動を求められるので再起動します。
再度試したところ、無事ディスクのデタッチができました。

# 最後に
今回は試していませんが有識者の方曰く、インスタンスが停止可能なら停止してデタッチも可能だろうとのことでした。今回は以上です。ありがとうございました。

# 参考URL

https://partition.aomei.jp/free-up-space/delete-page-file-windows-10.html
データベースまたはプロジェクトに、ファイルMSCOMCTL.OCX version2.1を参照する切断された参照が含まれています

# ACCEESSファイル起動時エラー
![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/675a1802-3a26-3b87-db13-39ea539f3b07.png)

データベースまたはプロジェクトに、ファイルMSCOMCTL.OCX version2.1を参照する切断された参照が含まれています
# 原因
ACCEESSの32bitで作られたものをACCEESSの64bit版で開いてるが、
Formに表示するプログレスバー機能に使ってるMSCOMCTL.OCXが、32bit版だけのものだった様子。

# 対応
対応方法は以下のどっちか
①64bit版を使い続けるならプログレスバーのVB処理を全部消す
②32bit版を使う

②はアプリを変えれば簡単だが、①で行く場合↓↓↓↓↓
「VisualBasic」をひらく
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/1f97d6dd-fe37-43b5-7e99-aa7d05ca4da4.png)

ツール＞参照設定
![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/b044b7ff-7e60-96d5-7bc6-eff9eef1b4aa.png)


参照不可のものはチェックはずす
![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1058523/aeca5d35-cdb6-013b-52a6-a845bcf599bc.png)


必要なら代わりの参照先を用意してチェックを入れる。
VBのコードでプログレスバー（またはMSCOMCTL.OCXを使ってるところ）をすべて削除し、別の方法で似た機能を作成する。
どこでMSCOMCTL.OCXを使ってるか分からない場合、参照を消したあと実行すると「このコントロールにはオブジェクトがありません」というエラーで引っかかるので、デバッグしながらつぶしていくのが良さそうでした。
山形大学HPの情報更新を通知してくれるプログラムを作ってみた

# はじめに
こんにちは！
私は、山形大学大学院にて地球科学×データサイエンスの研究をしているしがない院生です。
今回は、私が在籍している山形大学のHPに新着記事があった際にそれを通知してくれるPythonプログラムを作ったので、紹介します。

# 本プログラム作成の動機
弊学では（どこの大学でもそうだと思いますが）、様々な情報がHP上にて公開されます。

例えば、[授業の成績発表の日程](https://www.yamagata-u.ac.jp/jp/information/campus/20240222/)や、[弊学とネッツトヨタ山形株式会社が提携したカーシェアのサービスが開始](https://www.yamagata-u.ac.jp/jp/information/info/20231012/)されたことなど、把握しておきたい様々な情報を得ることができます。
ただ、いくら大事な情報が掲載されるとはいえ、毎日HPを開いて新規記事がないかチェックする...というのは面倒だと思いませんか？

そこで、**いっそHPの新規記事を確認する作業を自動化してしまおう**、というのがこのプログラムを作成した動機です。

# 実行確認済みの環境
- Windows10 (コマンドプロンプト)
- Python 3.11.2
- 使用ライブラリ: os, re, sys, requests, Beautifulsoup, pandas, pprint

# 使い方
要: Python実行環境 (Python実行環境がない方: [こちら](https://www.python.jp/install/windows/install.html)を参考にしてインストールできます)

プログラムのリンク: [GitHub](https://github.com/ceedarr/notify_yamagata_univ_hp_update)
`yamagata_univ_hp_notify_1.1.py`というファイルがあるので、これをダウンロードしてお使いください。

実行するには、お好きなターミナル (コマンドプロンプト, PowerShell, bash等)で以下コマンドを実行します。
`python yamagata_univ_hp_notify_1.1.py`

コマンドプロンプトで実行すると、次のように表示されます。
![実行例.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527371/cc447868-338a-98d3-6f7a-f928477bed30.png)

初回実行時、`yamagata_univ_hp_notify_1.1.py`と同じディレクトリ(__file__の場所)にフォルダ`univ_hp_history`が作成されます。そのフォルダの中に、弊学HPの「重要なお知らせ」, 「新着情報」それぞれの記事情報を格納したcsvファイル`important_history.csv`, `news_history.csv`が保存されます。

フォルダ作成場所:
![pythonファイル_logファイル位置関係.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527371/c5edb44b-2560-2f39-942a-74656e940537.png)
csv保存場所:
![logファイル内容.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3527371/296fc8df-af2f-0f51-dcde-cf70b864e1c0.png)


2回目以降の実行では、`univ_hp_history`に格納された過去の記事情報を基に新規追加項目を検出して実行したターミナル上で知らせてくれます。

また、このプログラムのポイントはただ追加記事を表示できることではありません。**各記事を確認したかどうか**をcsvファイルへ保存し、次回以降の通知に反映できることが利点です。

本プログラムを実行し、表示される説明文の通りに「入力してください>>」の所へコマンドを入力すると、コマンドに対応した番号の記事を「確認済み」にすることができます。この機能によって、「**確認したいけど今はちょっと...**」 というようなときに記事をストックしておくことができます。

# 終わりに
私が開発した「山大HP更新通知プログラム」の紹介は以上です。あなたの需要に刺さったなら幸いです。
今後も似たような記事を投稿しようと思うので、その際はぜひまたお越しください。
初投稿のため拙いところもあったと思いますが、最後までお読みくださりありがとうございました。
CP2Kの使い方: インストール

# CP2Kとは
* 原子・分子レベルでの第一原理計算ソフトウェア
* 密度汎関数理論(density functional theory: DFT)、Hatree-Fock、Moller-Presset摂動法(MP2)などの計算ができる
* 周期境界条件(periodic boundary condition: PBC)のある場合とない場合の両方が計算可能
* 基底関数は局在基底(Gauss関数)と平面波規定の**両方**を使う(mixed basis set)
* 全てフリー・オープンソースで利用可能 -> メリット
* 更新が頻繁(年2,3回程度?)に行われ、新しい手法が順次追加される -> メリット
* マニュアル等が少なく、特に日本語のリソースが少ない -> デメリット

# コンパイル
* 公式サイトの指示通りにすればほぼ問題なくコンパイルできる
    * https://github.com/cp2k/cp2k/blob/master/INSTALL.md

## Linuxでのコンパイル
* 環境: PRIMERGY CX2550, Intel Xeon Gold, cp2k-2023.1
* 手順
    1. intelコンパイラをロード: `module load intel; module load impi`
    2. Githubからソースをダウンロード: `git clone -b support/v2023.1 --recursive https://github.com/cp2k/cp2k.git cp2k-2023.1`
    3. `cd cp2k-2023.1`
    4. `git submodule update --init --recursive`
    5. `cd tool/toolchain`
    6. 補助ライブラリ等をコンパイル: `./install_cp2k_toolchain.sh --mpi-mode=intelmpi --math-mode=mkl --with-elpa=install --with-pexsi=install --with-sirius=no --with-plumed=install`
        * `--with-PKG=install`で各パッケージがインストールされる。入れない場合は`=no`。
        * 実際に使うかわからないけど、入れれるものは入れたほうがいい？
        * elpaは入れたほうが計算が早いような印象
        * siriusはコンパイルできないことが多いのでパス
    7. `cd ../../`
    8. makefileを編集
        * `./arch`に対応するmakefileがあるので編集する
        * この場合は`Linux-intel-x86_64.psmp`
        * `CXX=icpc`を追加
        * SIRIUS, SCOTCHなど、使っていないライブラリの`USE...`ををコメントアウト
    9. `make ARCH=Linux-intel-x86_64 VERSION=psmp`

* cp2kのバージョンやコンパイル環境で補助ライブラリがコンパイルできる・できないが変わるので注意。基本的にはBLAS, LAPACK, XSMMがあればよい。LIBXC, LIBINTも可能であればコンパイルしたい。

## Dockerを使う場合
* 環境: Ubuntu- 20.04-LTS (Google Cloud Platform)
1. `sudo apt-get install curl`
2. `curl -fsSL https://get.docker.com -o get-docker.sh`
3. `sudo sh get-docker.sh`: ここまでdockerのインストール
4. `sudo usermod -aG docker your_user_name`: 権限の設定
5. `docker run -it --rm -v $PWD:/mnt cp2k/cp2k:latest cp2k -i H2O-32.inp`: cp2kの実行
* `H2O-32.inp`はhttps://github.com/misteliy/cp2k/blob/master/tests/QS/benchmark/H2O-32.inp から入手可能 (一部手直し必要)

## MacOSでのコンパイル
1. `brew uninstall cp2k`
2. `brew unlink open-mpi scalapack`
3. `ln -f -s /opt/homebrew/bin/gcc-13 /opt/homebrew/bin/gcc`
4. `ln -f -s /opt/homebrew/bin/g++-13 /opt/homebrew/bin/g++`
5. `ln -f -s /opt/homebrew/bin/gfortran-13 /opt/homebrew/bin/gfortran`
6. `git clone --recursive https://github.com/cp2k/cp2k.git cp2k`
7. `cd cp2k`
8. `source arch/Darwin-gnu-arm64.ssmp`
9. `make -j ARCH=Darwin-gnu-arm64 VERSION=ssmp`

## バイナリの種類
* 並列計算に用いるライブラリ(OpenMP, MPI)によってcp2kバイナリファイルの種類が異なる

|種類| 並列計算の設定 |
|:-----|:----------|
| sdbg | OpenMP + debug settings |
| sopt | OpenMP + OMP_NUM_THREADS=1 |
| ssmp | OpenMP |
| pdbg | MPI + OpenMP + debug settings |
| popt | MPI + OpenMP + OMP_NUM_THREADS=1 |
| psmp | MPI + OpenMP |

* poptはpsmpをリンクしているだけなので、実際はpsmpのみをコンパイルすればよい

# プログラムの実行
### serial計算
* コンパイルしたcp2kは`${HOME}/cp2k/cp2k-version/cp2k/exe/Linux-.../cp2k.sopt`とする
* 実行コマンド: `cp2k.sopt -i input.inp -o output.out`

### parallel計算
* プロセス数をNPROCSとする
* 実行コマンド: `mpiexec -n $NPROCS cp2k.popt -i input.inp -o output.out`
    * `mpiexec.hydra -n ${PJM_MPI_PROC}`を使う場合もある
サークルの共同サーバから、GitHubの特定のリポジトリにだけSSHアクセスできるようにしたい

:::note warn
この記事では、読書者の方がある程度SSHの設定ができる想定で書いています。SSHについて分からない場合はGitHubへのSSH鍵の登録方法などを、別の記事で参照してください🙇
:::

## 先にまとめ
**GitHubのデプロイキー**という機能を用いてリポジトリ専用のキーペアを作成し、それをサーバに登録しておいてSSH接続するようにしました。

https://docs.github.com/ja/authentication/connecting-to-github-with-ssh/managing-deploy-keys

## 背景
私の所属しているサークルでは、部員が比較的自由にいじることのできる共用サーバがあります。このサーバは管理が完全に学生によるものであるため、特に部長やインフラの管理をしている学生はsudo権限のような強い権限を持っています。

このサーバ内で例えばGitHubにSSH接続をするために、公開鍵認証のキーペアを生成すると、ファイルの権限を適切に設定していても他のsudo権限を持つユーザから個人の秘密鍵が閲覧できてしまうという状況でした。[^1]

[^1]: そもそもsudo権限を持つなという話かもしれませんが、サークルの活動としてそこは一旦大目に見ることにしていました。

基本的にサークルのサーバに置いているのは、サークルとして開発しているプロダクトが主であり、それらのプログラムが他のサークルメンバーから閲覧できる分には問題はありません。一方で秘密鍵が閲覧できてしまうと、対応する公開鍵をGitHubに登録しているユーザ個人の非公開リポジトリや、別のorganizationの非公開リポジトリをいじることができてしまいます。

サークルメンバーとの信頼関係を信じて秘密鍵を置くというのもありましたが、万が一のことも考えてそれ以外の対応法を検討していました。

## 対応策
私の中で考えられた対応策は次のようなものがありました。

- **アクセストークン**を利用して**HTTPS認証**をする
- **デプロイキー**を利用する

このうち、私は「デプロイキーを使用する」という方法を利用することにしました。

普段からGitHubへの接続にはSSH認証を利用していて慣れており、デプロイキーであればSSH認証と似た形で設定ができたためです。

デプロイキーの場合でもキーペアを生成して秘密鍵をホームディレクトリ内に置いておく必要があり、他ユーザからそれを見られる心配はあります。ただ、万が一見られた場合でも、その秘密鍵では紐づいている1つのリポジトリしか操作ができず、任意の非公開リポジトリの操作は行えません。ですので、サークルのプロダクトを共用サーバ内で扱う分には問題がないだろうということになりました。

## 実際にデプロイキーを設定してみる
まずはサーバ内でキーペアを生成します。

```shell
ssh-keygen -f demo_key
```

GitHub上で先ほど生成した公開鍵をデプロイキーに設定します。デプロイキーは**リポジトリの設定画面**から、赤枠の箇所で追加できます。

![デプロイキーの設定](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351104/e6f25369-b307-732a-9c3c-196fb99520ff.png)

この枠に公開鍵を入力します。**コミットやプッシュをする場合は**下にある`Allow write access`というチェックボックスにチェックを入れないと、書き込みができません。

![share-server-github-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/351104/598a9f5e-e341-945a-fb8f-3e0c08c8cb79.png)

そうしたら、[参考の記事](https://qiita.com/narikei/items/fe05e27a58aa35fa8752)にある通り、複数のリポジトリをいじるための設定を`~/.ssh/config`に記述しておきます。

```~/.ssh/config
Host demo-repo
  HostName github.com
  User git
  IdentityFile ~/.ssh/demo_key
```

そして最後に、以下のコマンドでデプロイキーを設定したリポジトリをクローンしてこれればOKです。

```shell
git clone git@demo-repo:組織名/リポジトリ名.git
```

追加でリポジトリを設定する際には、新しくキーペアを生成し、**ホスト名を変えてクローン**してください。普段のクローン時とは以下の部分が異なっています。ここを、`.ssh/config`に設定したホスト名にします。

```diff_shell
+ git clone git@demo-repo:組織名/リポジトリ名.git
- git clone git@github.com:組織名/リポジトリ名.git
```

## 参考

https://qiita.com/tamorieeeen/items/c24f8285448b607b12dd

https://qiita.com/narikei/items/fe05e27a58aa35fa8752
Tiny Character Controller でキャラクターを動かそう

# Tiny Chacater Controller とは

Tiny Character Controller（以下、TCC）は、GitHub上で無料公開されている、**キャラクターの挙動を複数の小さなコンポーネントを組み合わせて実現するシステム**のことです。

具体的には、**「Brain」「Check」「Control」「Effect」** という4つの基本的なコンポーネントを組み合わせることで、キャラクター挙動の構築・カスタマイズを簡単にしてくれます。

各コンポーネントの説明は、[リポジトリ](https://github.com/unity3d-jp/Project_TCC)下部の解説ドキュメントに記載されています。

# TCCのインストール

TCCをまだインストールしていない方は、[こちらの記事](https://qiita.com/GameDevEgg/items/ea07565f384754fff758)を参考にインストールしましょう。

# 必要なコンポーネントのアタッチ

TCCでキャラクターを動かすには、**MoveControl** コンポーネントが必要です。
さっそく、キャラクターのオブジェクトにアタッチしましょう。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3470968/69bb50da-6e39-c2ca-1483-e54359763925.png">

無事にアタッチすると、画像のように警告が表示されます。

これは、「**MoveControl** が依存している **CharacterSettings** が、いずれかの **Brain** コンポーネントを必要としている」ということなので、今回は**CharacterBrain** コンポーネントをアタッチしましょう。これで下準備は完了です。

# TCCでキャラクターを動かす

続いて、キャラクターを動かす処理を実装します。
適当なスクリプトをプレイヤーにアタッチして、下記のコードをコピペして下さい。
そして、ボタンなどからMovePlayerメソッドを呼び出しましょう。

```cs
using UnityEngine;
using Unity.TinyCharacterController.Control;

public class Test : MonoBehaviour
{
    private MoveControl _moveControl;
    
    void Start()
    {
        _moveControl = GetComponent<MoveControl>();
    }

    public void MovePlayer()
    {
        _moveControl.Move(Vector2.up * 1.0f);
    }
}
```

ボタンを押すとプレイヤーが前方に進んでいくのが確認できると思います。
これで、TCCでキャラクターを動かすことに成功しました！

実際にTCCでキャラクターを制御する際は、
MoveContorol.Move()の引数にキー入力を与えると良い感じの動きになります。

ご覧いただきありがとうございました :laughing:
C_TS422_2021 SAP Certified Application Associate SAP S/4HANA Production Planning and Manufacturing対策（34/100）

【34日目】
トピック4：SAPS/4HANAの資材所要量計画（MRP）（1/10）

≪問題34≫
資材所要量計画（MRP）における従属所要量の特性は何ですか。
（２つ選択）
□従属所要量は多段階BOM（部品表/配合表）構造に対してのみ作成される。
□従属所要量は計画実行中に組立レベルで設定される。
□従属所要量はアドバンスト計画の所定の時点で設定される。
□最終製品に対して計画独立所要量が定義されるときに、従属所要量が生成される。

≪解答≫
□従属所要量は多段階BOM（部品表/配合表）構造に対してのみ作成される。
■従属所要量は計画実行中に組立レベルで設定される。
■従属所要量はアドバンスト計画の所定の時点で設定される。
□最終製品に対して計画独立所要量が定義されるときに、従属所要量が生成される。

≪解説≫
◆MRP中に品目に対して計画手配が登録されますが、この品目を生産するために下位（BOM）レベルの品目が必要な場合、BOMの展開時に従属所要量が登録されます。
◆計画実行の第一画面で購買依頼の登録区分を使用することで、システムが購買依頼を直接登録するか、最初に計画手配を登録するかを制御することができます。この登録区分は、単一段階および多段階の単一品目計画に対して有効です。
◆PP/DSによる計画（アドバンス計画）では、従属所要量が正確な時間（分単位）に基づいて設定されるという利点があります。従属所要量は、アドバンス計画の所定の時点で設定されます。
【初投稿】自己紹介など

# 初カキコ
エンジニアを始めて7〜8年ほどになります。
私も今ではシニアエンジニアクラスになっていて、そろそろ発信をしていってもいいのでは？と思い、重い腰をあげることにしました。

# 経歴
塾講師
↓
ソシャゲ会社のバイト
↓
登録型派遣
↓
SES
↓
車載ソフトウェア開発
↓
受託のWebシステム開発リーダー
↓
大規模C向け自社サービス開発責任者

と転々としながらポジションや年収をぐんぐん伸ばしてきました。
自分の得意や不得意は理解できている方で、自分の売り込み方が上手かったのかなと思っています。

# 得意領域
プログラミング言語に関して言えば、今世の中で使われているような言語は一通り書けます。
推し言語はRustですが、業務上で採用したり初学者にオススメするならTypeScriptといいます。
プログラミング以外の領域だと、プロジェクトマネジメントやスクラム運営なんかは得意分野になります。
今後の投稿でスクラムは掘り下げて書こうと思っているのでお楽しみに。

# 考え方
プログラミングは私にとってはビジネスツールの一種でしかないので、プログラミングそのものが好きだからエンジニアをやっているといったわけではないです。
そういう意味ではエクセルやスプレッドシートと私の中での扱いは大差ないかもしれません。
もちろん、ビジネスで優秀な人はエクセルを使いこなせるでしょうし、同じように私にとってはプログラミングも使いこなせて然るべきだと思っているだけです。

# 一緒に働く方へ
せっかくコンピュータという機械を使いこなせる職種についているんだし、できる限り楽をして働きましょう。
Chatbot Arenaで言語モデルをURLから指定する方法

# Chatbot Arenaとは
ユーザーが入力したプロンプトに対し2つの言語モデルを実行しその結果をユーザーが評価するサイトです。
https://arena.lmsys.org/ （ https://chat.lmsys.org/ ）

https://japan.zdnet.com/article/35205615/

# Direct Chatとは
Chatbot Arena の Direct Chat タブを開くと言語モデルを選ぶコンボボックスがあり、ユーザーはそのうち1つを選んでその言語モデルと対話する事ができます。
# Direct Chatで使用する言語モデルをURLから指定する方法
例として llama-3-70b-instruct という言語モデル指定したければ
https://arena.lmsys.org/?model=llama-3-70b-instruct
と書きます。
ちなみに llama-3-70b-instruct はこの方法を教えてくれた言語モデルです。
サーバーレスベストプラクティスで初めて知ったこと

# はじめに
サーバーレス大好きなエンジニアです！
AWS SUMMIT 2024に行ってきて、たくさんのことを学んできました！
特に「サーバーレス開発のベストプラクティス」の内容が面白かったのでシェアしたいと思います。

# サーバーレスとは
サーバーやインフラの管理を気にすることなくアプリケーションを実行することができる最高の技術です。細かい設定を気にすることなく、すぐに価値を提供できることが魅力です。

# Lambdaのベストプラクティス
ここからAWS SUMMIT 2024の内容に触れていきます。

## TransportではなくTransform
まず、ハッとさせられたのは以下のことです。
>Transport （転送）ではなくTransform（変換）に使⽤する。

今までLambdaをどれだけ転送機能として使ってきたかを考えさせられました。
何でもかんでもLambdaに任せるのではなく、特定の変換処理を行うことに専念させると、より効果的に使うことができます。

## 繋げるLambdaを減らす
複数のLambdaを繋げるのではなく、できるだけシンプルに、独自の処理を行うためにLambdaを使うのが理想です。
Lambdaを経由せずそのままアプリケーションを繋げることでエラー確率を減らすことができます。

## 単一責務の原則
Lambda関数に単一責務を持たせることが重要です。
一つのAPIをすべてのLambdaに集約させると、ロールの権限管理が複雑になり、わかりにくくなります。
一方で、一つのAPIごとにLambdaを持たせると数が増えすぎてしまいます。そこで、関連するAPIをグループ化するのがベストです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991303/89989235-8feb-ef4d-159d-50b51308674a.png)

## ConfigurationとしてのAWSサービス
独自のコードを書くのではなく、CONFIGURATIONとして組み込むことを考えると効率的です。例えば、AWS Step FunctionsやAmazon EventBridgeを使うことで、複雑なフローも簡単に管理できます。

### AWS Step Functionsのメリット
Step Functionsを使うと、異なるAWSサービスを連携させたワークフローを簡単に構築できます。視覚的にフローを確認できるので、デバッグも楽に行うことができます！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1991303/19354d63-49fb-c8b9-f448-58b9cbf601bb.png)

# まとめ

サーバーレスをより効率的により賢く使いこなすためには以下のことが重要です。
- Lambdaの役割を理解して使う
- Step functionを使用し、拡張性のあるさサーバーレスアーキテクチャを構築する

LambdaやStep Functionsを上手に活用して、アプリケーションをより良いものにしていきましょう。
皆さんの参考になれば幸いです！
「ブレートシュナイダーの公式」をChatGPTとsympyとFreeCADでやってみたい。


・正しいかどうかわかりませんでした。

# 参考

https://en.wikipedia.org/wiki/Bretschneider%27s_formula

https://ja.wikipedia.org/wiki/ブレートシュナイダーの公式


google検索 ブレートシュナイダーの公式



# 大学入試の過去問

＞"ブレートシュナイダー"一致する結果はありません　大学入試数学問題集成 様内

＞site://kamelink.com "ブレートシュナイダー"との一致はありません。

＞site://mathmathmass.exblog.jp "ブレートシュナイダー" に一致する情報は見つかりませんでした。

# ChatGPT-3.5先生へ
```
ブレートシュナイダーの公式の証明を教えて下さい。
```


```
sympyで
```

```python
import sympy as sp

# 変数の定義
a, b, c, d = sp.symbols('a b c d')  # 四辺形の各辺の長さ
alpha, gamma = sp.symbols('alpha gamma')  # 対角の角度
s = (a + b + c + d) / 2  # 半周長

# ブレートシュナイダーの公式
area = sp.sqrt((s - a) * (s - b) * (s - c) * (s - d) - a * b * c * d * sp.cos((alpha + gamma) / 2)**2)

# 結果の表示
print(area)
```
```
sqrt(-a*b*c*d*cos(alpha/2 + gamma/2)**2 + (-a/2 + b/2 + c/2 + d/2)*(a/2 - b/2 + c/2 + d/2)*(a/2 + b/2 - c/2 + d/2)*(a/2 + b/2 + c/2 - d/2))
```
# FreeCADのマクロで作図
勉強中
RustとWebAssemblyでFaviconマルチアイコンChecker作ってみた



# はじめに

前回作成した「RustとWebAssembly使ってFaviconGenerator」に引き続き同じ構成で

学習用にRustとWebAssembly使ってFaviconのマルチアイコンChecker的なのを作成しようと思います。


https://qiita.com/shisojuice/items/2ce43d25ec48c2c36486


faviconについて

https://developers.google.com/search/docs/appearance/favicon-in-search?hl=ja


# プロジェクトの作成

前回のFaviconGeneratorの続きで書いていく。

今回は、wasmでFaviconのdataを受け取り、icoクレートを使用して

マルチアイコン内の画像数を出力する関数を作成する。

Favicon(.ico)画像を読み取りicoクレートのIconDirに入れる。

IconDir内に含まれるIconの数だけWidthとHeightを表示していくような処理にする。

最後に、出力結果の文字列を返す。

```rust:lib.rs
// 省略

#[wasm_bindgen]
pub fn favicon_check(image_data: &[u8]) -> String {
    let icon_dir = ico::IconDir::read(Cursor::new(image_data)).unwrap();
    let mut result = String::new();
    result.push_str("出力結果 \n");

    for entry in icon_dir.entries() {
        result.push_str("Width : ");
        result.push_str(&*entry.width().to_string());
        result.push_str(" x Height : ");
        result.push_str(&*entry.height().to_string());
        result.push_str("\n");
    }
    result
}

// 省略

```


# 今回の成果物

デモURL

https://shisojuice.github.io/Rust_Favicon/


デモ画像

・元画像(16x16)

![RustとWebAssemblyでFaviconマルチアイコンChecker作ってみた_003.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777149/26edaa9e-dcf1-46af-283b-becc5af05c1e.jpeg)

・元画像(16x16,32x32,64x64)

![RustとWebAssemblyでFaviconマルチアイコンChecker作ってみた_004.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777149/15d24413-3675-4219-b8c1-d5ae8e2a9306.jpeg)


ソース

https://github.com/shisojuice/Rust_Favicon


# まとめ

前回、今回を通じてFaviconを処理してみた。📚

icoクレートなどで処理したが、ライブラリクレートもどんなものがあるのかを知っておくだけで

今後の開発が変わりそうなので注目していきたい。💪

※間違い等ありましたら、ご指摘いただけると助かります。
「ブラーマグプタの公式」をChatGPTとsympyとFreeCADでやってみたい。

・正しいかどうかわかりませんでした。


# 参考

https://en.wikipedia.org/wiki/Brahmagupta%27s_formula

https://ja.wikipedia.org/wiki/ブラーマグプタの公式

google検索　ブラーマグプタの公式 
https://www.google.com/search?q=%E3%83%96%E3%83%A9%E3%83%BC%E3%83%9E%E3%82%B0%E3%83%97%E3%82%BF%E3%81%AE%E5%85%AC%E5%BC%8F&oq=%E3%83%96%E3%83%A9%E3%83%9E%E3%82%AF%E3%83%96%E3%82%BF&gs_lcrp=EgZjaHJvbWUqCQgBEAAYDRiABDIGCAAQRRg5MgkIARAAGA0YgAQyCQgCEAAYDRiABDIMCAMQABgNGIsDGIAEMgwIBBAAGA0YiwMYgAQyCQgFEAAYDRiABDIJCAYQABgNGIAEMgkIBxAAGA0YgAQyCQgIEAAYDRiABDIJCAkQABgNGIAEMgkIChAAGA0YgAQyCQgLEAAYDRiABDIJCAwQABgNGIAEMgkIDRAAGA0YgAQyCAgOEAAYDRge0gEJMTM5NjJqMWo3qAIAsAIA&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8

https://manabitimes.jp/math/583

# 大学入試の過去問

＞一致する結果はありません　大学入試数学問題集成 様内

＞???恒等式
https://www.google.com/search?q=site%3A%2F%2Fkamelink.com+%22%E3%83%96%E3%83%A9%E3%83%BC%E3%83%9E%E3%82%B0%E3%83%97%E3%82%BF%22&oq=site%3A%2F%2Fkamelink.com+%22%E3%83%96%E3%83%A9%E3%83%BC%E3%83%9E%E3%82%B0%E3%83%97%E3%82%BF%22&gs_lcrp=EgZjaHJvbWUyBggAEEUYOTIGCAEQRRg60gEJNDY0MzBqMGo0qAIAsAIA&client=ms-android-huawei&sourceid=chrome-mobile&ie=UTF-8

＞site://mathmathmass.exblog.jp "ブラーマグプタ" に一致する情報は見つかりませんでした。

# ChatGPT-3.5先生へ
```
ブラーマグプタの公式の証明を教えて下さい。
```
...基本的なアイデアはヘロンの公式と四辺形の性質を組み合わせることにあります。
```
sympyで
```

```python
import sympy as sp

# 辺の長さの定義
a, b, c, d = sp.symbols('a b c d')
# 半周長の定義
s = (a + b + c + d) / 2

# ブラーマグプタの公式による面積
A = sp.sqrt((s - a) * (s - b) * (s - c) * (s - d))

# 対角線の定義
e = sp.symbols('e')

# 三角形 ABC の半周長
s1 = (a + b + e) / 2
# 三角形 ADC の半周長
s2 = (c + d + e) / 2

# ヘロンの公式を使って面積を計算
K1 = sp.sqrt(s1 * (s1 - a) * (s1 - b) * (s1 - e))
K2 = sp.sqrt(s2 * (s2 - c) * (s2 - d) * (s2 - e))

# 合計面積
total_area = K1 + K2

# 面積がブラーマグプタの公式に一致することを確認
simplified_area = total_area.simplify()

# 確認
proof = sp.Eq(A, simplified_area)
proof

print("#",proof)
# Eq(sqrt((-a/2 + b/2 + c/2 + d/2)*(a/2 - b/2 + c/2 + d/2)*(a/2 + b/2 - c/2 + d/2)*(a/2 + b/2 + c/2 - d/2)), sqrt((-a + b + e)*(a - b + e)*(a + b - e)*(a + b + e))/4 + sqrt((-c + d + e)*(c - d + e)*(c + d - e)*(c + d + e))/4)
```


# FreeCADのマクロで作図
勉強中
【git】プロキシが邪魔したお話

# はじめに
学校内のPCでリモードリポジトリにpushしようとしたらアクセスエラーが出たので、その解決方法の備忘録です。


# 実行環境
OS：windows11
開発ツール：VScode
gitコマンドは，VScodeのターミナル内でたたいています

# エラー
```python:
unable to access 'https://github.com/<リモートリポジトリ>.git/': Failed to connect to github.com port 443
```
github.comに接続できませんでしたというエラー

# 原因
gitでプロキシの設定をしていなかったため。
私の通信環境内でプロキシサーバを使っていたため、外部サーバへ直接のアクセスが禁止されており、github.comにアクセスできなかったのだろうと考えた。

# windows11でのプロキシ確認方法
`設定`>`ネットワークとインターネット`>`プロキシ`>`手動プロキシセットアップ`
これで自分のプロキシ設定を確認できます。

# 解決方法
「**接続しているプロキシを設定**」することで解決

**gitでプロキシ設定**
```
git config --global http.proxy <自分のプロキシIPアドレス>:<ポート番号>
```
**設定されているか確認**
```
git config --global --list

Out:
http.proxy=<自分のプロキシIPアドレス>:<ポート番号>
```


# まとめ
今回プロキシについて調べていく中で、自分のプロキシ設定がどうなっているのかが分からず、ずっと迷っていました。プロキシの仕組みについて詳しく理解できていないですが、今回の問題は解決できたので良しとしてます。

# 参考文献
この記事は以下の情報を参考にして執筆しました

- [【エラー】プロキシ環境内でのGit コマンド使用【備忘録】](https://qiita.com/p_owl/items/6c4ff9b5069e2e6ae14c)
- [「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典-プロキシ（proxy）](https://wa3.i-3-i.info/word1752.html)