OmniAICreator/Qiita-1.07M huggingface dataset:
ADアカウント配下でintra-martのプロキシを突破する[cntlm]

# 事象
intra-martのLD等で外部API叩きたい時、proxy配下だと怒られる時がある
proxyは設定できるが、AD配下などPASS/IDを求められる場合には対応していない🥺

[プロキシ環境下で intra-mart AccelPlatform から外部サイトにアクセスする方法を教えてください](https://product.intra-mart.support/hc/ja/articles/20083075832473-%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E7%92%B0%E5%A2%83%E4%B8%8B%E3%81%A7-intra-mart-AccelPlatform-%E3%81%8B%E3%82%89%E5%A4%96%E9%83%A8%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)
```
【認証を必要とするプロキシサーバの場合】

intra-mart AccelPlatform では、認証を必要とするプロキシサーバに対して ID/パスワードを設定することができません。
これを解決するためには、以下のような代替案が考えられます。

■CNTLM 等を利用する
　例えば CNTLM 等にて、通信時に認証を肩代わりするようなサーバをサーバ通信間に配置いただき、
　上記を経由して認証を代わりに実行いただく方法があります。
```
👆サポートより、CNTLM使えばいいらしい。

# CNTLMの設定
https://cntlm.sourceforge.net/

あくまでハマった部分のメモのみ

## ダウンロード＆インストール

[ダウンロード](https://sourceforge.net/projects/cntlm/files/)をする

* なぜかZIP解凍するとsetup.exeがない（win）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212532/7122bfb7-1f2f-6710-0650-0e36c72f04f0.png)
フォルダ潜るとなぜかsetup.exeがあるので[直接DL](https://sourceforge.net/projects/cntlm/files/cntlm/cntlm%200.92.3/cntlm-0.92.3-setup.exe/download)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212532/2ef1a9ea-9ca8-599d-ff91-db06f1b0f7bc.png)

* インストールした後、[ここ](https://qiita.com/yohskeey/items/6f17ea051fbe5568f3bf#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%B7%A8%E9%9B%86)見てcntlm.iniを更新、動作確認まで終わらせる
これで`172.0.0.1:3128`をproxyに指定すれば認証を突破できるハズ
## intra-martの設定
[サポート](https://product.intra-mart.support/hc/ja/articles/20083075832473-%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E7%92%B0%E5%A2%83%E4%B8%8B%E3%81%A7-intra-mart-AccelPlatform-%E3%81%8B%E3%82%89%E5%A4%96%E9%83%A8%E3%82%B5%E3%82%A4%E3%83%88%E3%81%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84)を参考にproxyを設定

<%RESIN_HOME%>/conf/resin.properties の jvm_argsに追記
```
-Dhttp.proxyHost=127.0.0.1 -Dhttp.proxyPort=3128 -Dhttps.proxyHost=127.0.0.1 -Dhttps.proxyPort=3128
```
<%RESIN_HOME%>/conf/resin.xml に追記
```
  <system-property
    jdk.tls.ephemeralDHKeySize="2048"
    jdk.tls.rejectClientInitiatedRenegotiation="true"
    sun.security.ssl.allowUnsafeRenegotiation="false"
    sun.security.ssl.allowLegacyHelloMessages="false"
    http.proxyHost="127.0.0.1"
	http.proxyPort="3128"
	https.proxyHost="127.0.0.1"
	https.proxyPort="3128"
    />
```

設定後、resinごと再起動で無事proxy突破

### 参考
https://qiita.com/yohskeey/items/6f17ea051fbe5568f3bf#%E8%A8%AD%E5%AE%9A%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AE%E7%B7%A8%E9%9B%86
Dev Container起動中にGitが操作できない

# 概要
先日参加したハッカソンで初めてDev Containerを使用した際にGitの操作が上手くいかないことがあったので、行った対処法をここに残しておこうと思います！  
※もしかしたら超初歩的なミスかもしれませんが、検索しても出てきませんでした汗

## 今回起こった問題
GitHubのリモートリポジトリからクローンしたローカルのリポジトリで、Dev Containerを立ち上げてVSCodeのターミナル上でGit操作をすると、Gitリポジトリがない(fatal: not a git repository)と言われてしまう
```terminal
vscode ➜ /workspace $ git status
fatal: not a git repository (or any parent up to mount point /)
Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
```
## 解決方法
**Dev Containerを開いている間はgitの操作をしない。閉じてからcommitなりpushする。**  
です。以下にその理由を説明します。

## 原因
おそらく原因はDev Containerで開いているファイル(workspace)と.devcontainerファイル、.gitファイルが同階層にあるため、Dev Containerで開いているworkspace以下に.gitファイルが存在しないことからgit操作がうまく出来ないからだと考えられます。  
(起動中はVSCode上のソース管理タブでは**リポジトリを初期化**ボタンが出てきてしまう)   
<img width="200" alt="スクリーンショット 2024-07-24 0.16.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3774078/5c25fe33-b0b7-f5e0-6143-67e1d749bdb3.png">
  
ですのでDev Containerで開いている間はGitの操作はせず、閉じてからcommitなりpushなりを行うことをお勧めします。
【DeviseTokenAuth】前のメールアドレスにメールアドレス変更通知を送信する方法

## 設定を記述

前のメールアドレスにメールアドレス変更通知を送信するための設定を記述する。

```rb:config/initializers/devise.rb
Devise.setup do |config|
  # ...
  config.send_email_changed_notification = true
end

```

## メール内容の変更

メール内容を変更する。

```erb:app/views/devise/mailer/email_changed.html.erb
<p><%= t(:hello).capitalize + '、' + @resource.name %>さん。</p>

<% if @resource.try(:unconfirmed_email?) %>
  <p>
    メールアドレスの変更がリクエストされました。<br />
    <%= @resource.unconfirmed_email %>にメールアドレス確認用のメールを送信しています。<br />
    内容を確認し、メールアドレスを認証してください。
  </p>
<% else %>
  <p>メールアドレスが<%= @resource.email %>に変更されました。</p>
<% end %>

```

## 参考ページ

https://github.com/heartcombo/devise/blob/a259ff3c28912a27329727f4a3c2623d3f5cb6f2/lib/generators/templates/devise.rb#L131C2-L132C51

https://github.com/heartcombo/devise/blob/a259ff3c28912a27329727f4a3c2623d3f5cb6f2/app/views/devise/mailer/email_changed.html.erb#L4
prismaで微妙につまずいた話

# 概要
next.jsで prismaとローカルのMySQLで環境構築しようとしたときに、
```
$ mysql -u root -p
  Enter password: 
  ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using 
  password: YES)
```
パスワードは絶対にあっているのに接続ができませんでした。

割と意外な理由だったのでメモとして書いておきます。

ネタバレするとパスワードに # を含んでいると上手くいかないようです。
微妙！

# 環境
OS    : Fedora 39
prisma: v5.17.0
MySQL : v8.4.1

# 解決方法
パスワードを変更したら接続できるようになりました。

例：
```
#password -> password+
```
```
# .env
DATABASE_URL="mysql://root:password+@localhost:3306/database_name"
```

```
$ npx prisma migrate dev --name init
  Environment variables loaded from .env
  Prisma schema loaded from prisma/schema.prisma
  Datasource "db": MySQL database "database_name" at "localhost:3306"

  Applying migration `20240723142312_init`

  The following migration(s) have been created and applied from new 
  schema changes:

  migrations/
    └─ 20240723142312_init/
      └─ migration.sql

  Your database is now in sync with your schema.

  ✔ Generated Prisma Client (v5.17.0) to ./node_modules/@prisma/client 
  in 88ms
```
intelliJで"kotlin not configured"が出た場合の対処

Tools -> Kotlin -> Configure Kotlin In Project

![スクリーンショット 2024-07-23 23.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/629824/73ccdb59-a60f-cf07-20eb-c8a37e786f6d.png)
【ROS2 launch.py Tips】launch.pyファイル内で、実行時引数(DeclareLaunchArgument)の値を取得する方法

# はじめに

　ROS2のlaunch.pyで、ファイル内で実行時に引数で指定した値を使う方法を紹介する。テストコードで挙動を変えたりURDFの読み込み先を引数によって変更したい場合などに有効。

# 動作確認環境

* ROS2 Foxy

# 方法

launch.acitons.OpaqueFunctionを使う。

* ポイント
  * DeclareLaunchArgumentで設定したcontextを受け取れるaction
  * OpaqueFunctionの引数で設定した関数内で、上記のcontextを利用してLaunchConfigurationに設定されたパラメータを取得する


## サンプルコード

グローバルに宣言している
* bool_param
* int_param
* float_param

```python
from distutils.util import strtobool
from ament_index_python.packages import get_package_share_directory, get_package_prefix
import launch
from launch.actions import DeclareLaunchArgument, OpaqueFunction
from launch_ros.actions import Node
from launch.substitutions import (EnvironmentVariable, FindExecutable,
                                LaunchConfiguration, LocalSubstitution,
                                PythonExpression)
from launch.launch_context import LaunchContext
import launch_testing.actions
import launch_testing_ros

bool_param = False
int_param = 1
float_param = 0.0

def launch_setup(context: LaunchContext, *args, **kwargs):
    bool_param_config = LaunchConfiguration('bool_param')
    int_param_config = LaunchConfiguration('int_param')
    float_param_config = LaunchConfiguration('float_param')

    # globalパラメータとして宣言することで、launch_setup関数外でも利用可能にする
    global bool_param
    global init_param
    global float_param
    
    # context.perform_substitution関数を用いて、
    # 実行時、DeclareLaunchArgumentで指定した引数の値をLaunchConfiguration経由で取得
    # Text(str)型なので、型変換が必要
    bool_param = bool(strtobool(context.perform_substitution(bool_param_config)))
    int_param = int(context.perform_substitution(int_param_config))
    float_param = float(context.perform_substitution(float_param_config))
    
    # 通常通り、ノードのパラメータはLaunchConfigurationで渡す
    some_node = Node(
        package='some_node_package',
        executable='some_node',
        output='screen',
        parameters=[{
            'bool_param': bool_param,
            'int_param': int_param,
            'float_param': float_param
        }],
    )
    return [some_node]

def generate_launch_description():    
    return (
        launch.LaunchDescription([
            DeclareLaunchArgument(
                'bool_param', default_value='false', description='bool param'
            ),
            DeclareLaunchArgument(
                'int_param', default_value='10', description='int param'
            ),
            DeclareLaunchArgument(
                'float_param', default_value='0.1', description='float param'),
            OpaqueFunction(function=launch_setup)
        ])
```

# まとめ

　ROS2のlaunch.pyで、ファイル内で実行時に引数で指定した値を使う方法を紹介した。URDFの動的な読み込みやテストコードで挙動を変えたいときに役立つ。

# 参考

https://answers.ros.org/question/396345/ros2-launch-file-how-to-convert-launchargument-to-string/

https://github.com/UniversalRobots/Universal_Robots_ROS2_Driver/blob/333d0bc80ba5ccc66d7c1bbce0b86456c2ac99eb/ur_moveit_config/launch/ur_moveit.launch.py
【解決法】CozeでLINE Botを作成したが、Sorry, the free chat quota...というエラーが出る

・事象

タイトルの通り。CozeでLINE Botを作成したが、下記エラーが出る。
全然答えてくれない...なぜ...

![スクリーンショット 2024-07-23 23.20.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844439/d3f5dad8-792b-63b0-0abe-cf5f0491c6d9.png)

メッセージの内容：
Sorry, the free chat quota for the current bot has been used up. If you wish to experience more bots, please visit: https://www.coze.com/

DeepLで翻訳：
申し訳ございませんが、現在のボットの無料チャット枠は使い切ってしまいました。より多くのボットを体験したい方は、https://www.coze.com/

課金してるのに！まだ全然使ってないのに！！

--------------

・解決方法

めちゃくちゃ簡単でした。

設定画面の中央上あたり（画像だと右上）の「User Message Billing」をOFFにするだけ。

![スクリーンショット 2024-07-23 23.26.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3844439/0ccf277f-f86d-1fec-6858-65830ba630f4.png)

これ、「注意 ユーザーメッセージの課金は無効になっています。ボットユーザーに発生したメッセージクレジットの費用は、すべてユーザー負担となります。」ということで、
つまり、
「OFFにすると、Bot作成者が費用を負担するよ」ということみたいです

英語難しい。。
UE5勉強日記 C++で作ったActorのlocationとrotation表示されない

C++で下記のようにActorを定義して、blueprintを生成したが、

```
private:
	UPROPERTY(EditDefaultsOnly)
	UStaticMeshComponent* ActorMesh;
    UPROPERTY(EditDefaultsOnly)
    UCapsuleComponent* CapsuleCollision;
```

RootComponent　ActorMeshのlocationとrotation表示されない問題が発生(下記図)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3574567/8281b1bf-8473-fcb8-4c45-604f20781a72.png)
※CapsuleCollisionのlocationとrotation表示されます。

publicを変更したり、UPROPERTYを変更したりいろいろ試したが、表示されないままでした。

# 解決策
```
private:
	UPROPERTY(EditDefaultsOnly)//追加
	UStaticMeshComponent* RootMesh;//追加
	UPROPERTY(EditDefaultsOnly)
	UStaticMeshComponent* ActorMesh;
    UPROPERTY(EditDefaultsOnly)
    UCapsuleComponent* CapsuleCollision;
```
RootMeshを追加,RootComponentをRootMeshに設定、
そして
ActorMesh->SetupAttachment(RootComponent);
※RootComponentはRootMeshではなくほかのもので置き換えでもいいと思います
【Python】ModuleNotFoundErrorの原因は環境変数PYTHONPATHにあった...

# エラー概要
以前まで使用していたpytestを実行したら、「`ModuleNotFoundError`」になって、失敗してしまった。

> xxx.app.main import app E ModuleNotFoundError: No module named 'xxx'

# 原因と解決方法
今回の原因は`PYTHONPATH`にありました。

まずは以下のコマンドで確認。

```
echo $PYTHONPATH
```

そして今回実施するプロジェクトのルートディレクトリがない場合は以下のように追加してあげます。

```
export PYTHONPATH="${PYTHONPATH}:/xxxx"
```


ディレクトリ構造は以下の通り。



使用したtestファイルでは、プロジェクトのルートディレクトリから別のディレクトリのモジュールをインポートして使用していたのですが、それが原因なのか。以前までできていたような気がするのだが...



よく仮想環境venvを使っているので、その切り替えや新規作成により、設定に影響があったのかも。
または、何がしか（IDEとか）のアップグレードが影響あったのか...

この環境変数の詳細は以下をご参考ください。

https://engineerblog.mynavi.jp/technology/python-path/
エントリーポイントでのクラスのインスタンス作成をテストする(pytest)

# 概要
エントリーポイント内でクラスのインスタンスを作成し、クラス内のメソッドを`main`関数内で呼び出す場合のモック方法について説明します。

## テスト対象
- `main`関数の中でクラス「`ClassExample`」のメソッド「`get_number`」を呼び出す
- エントリーポイント内で「`ClassExample`」のインスタンスを作成

```python:examle.py
def main():
    number = class_example.get_number()
    return number

if __name__ == "__main__":
    # クラスのインスタンスを作成
    class_example = ClassExample()
    # main関数の呼び出し
    main()
```
## テストコード
以下のテストコードでは、`pytest`と`unittest.mock`を使用して、`ClassExample`クラスのメソッド呼び出しをモックしています。

```python:test_example.py
import pytest
from unittest.mock import patch, MagicMock
import example

# fixtureを使用し、エントリーポイントでインスタンスを作成するクラスを設定
@pytest.fixture
def class_example_setup():
    with patch('example.ClassExample') as Mock:
        mock_instance = Mock.return_value
        mock_instance.get_number = MagicMock()
        example.class_example = mock_instance
        yield mock_instance

def test_main(class_example_setup, mocker):
    example.main()
    # クラス内のメソッドが呼び出されたことを検証
    assert class_example_setup.get_number.call_count == 1
```
## ポイント
- **`pytest.fixture`の使用**: クラスのインスタンスをモックし、`main`関数のテストが実行される前にセットアップします。
- **`unittest.mock`の使用**: `ClassExample`クラスのメソッドをモックして、実際のメソッド呼び出しをシミュレートします。
- **`main`関数の呼び出しと検証**: テスト内で`main`関数を呼び出し、`get_number`メソッドが正しく呼び出されたことを確認します。

## その他
この方法はChatGPTを使用して辿り着きました。
(テストコード作成中に詰まりました)
より良い方法があれば、ご教示いただきたいです。

(新規作成時にはクラスのインスタンス作成場所についても考慮する必要があるかもしれません。勉強します。。。)
エンジニアにおすすめの本〜ゲーム理論トレーニング

# きっかけ

元々私は目をつけられやすい人物でした
- タッパがでかい
- よくやらかす
- 立ち回りが悪い
- 言葉遣いがよくない

など今にして思えば悪目だちするようなことをやらかしていましたが

そのおかげか気に入られることもあり、転職を何回か成功させて、妻子となんとか一緒に暮らしていけるようになったと思います。

※会議中にガム噛んでる先輩に怒られているのは納得いかなかったなー

# 本の紹介

https://www.amazon.co.jp/%E3%82%B2%E3%83%BC%E3%83%A0%E7%90%86%E8%AB%96%E3%83%88%E3%83%AC%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0-%E9%80%A2%E6%B2%A2-%E6%98%8E/dp/4761260785

- エンジニアおすすめ度:⭐︎
- 社会人おすすめ度:⭐︎⭐︎⭐︎⭐︎⭐︎

エンジニアの要素はありませんが

社会人としてどう立ち回るか、あの人がこの仕事をしているから自分はこの仕事をやっておかないと・・・など先読み、立ち回りを考えさせられる本だと思います

# ゲーム理論

大学の時に少し勉強していましたが全く理解ができずじまいでした

書店を物色している時にふと目に入りました

行動科学？数学？読み終わった後もわかりませんが論理問題のようでもあり数学でもありとても知的好奇心を刺激される本だと思います

# 囚人のジレンマ、ナッシュ均衡

一度は聞いたことあるような単語をゲーム理論と絡めて説明をしてくれます

ゲームをする上で相手がいることが必然なので相手がどう動くか、どうすれば利益を大きくできるか

などエンジニアに関係ないかもしれませんが

できるだけやりたい仕事をするために、やりたくない仕事を避けるために相手の利益や相手のやってほしいことを先読みすることはとても大切ですね

# いかにルールを変えるか

相手と駆け引きをする時は一定のルールがあると思いますが自分を有利にするために以下にルールを変えるかが大事になります

1. 自分が不利にならないように先に宣言をする
2. 情報を集める
3. 相手（上司）の動きを予想する

# プロポーズする方が有利！？

個人的にとても面白かったです

本書を読んでいただければわかると思いますがプロポーズをする側が有利になるようです

男性、女性関係なくプロポーズをする側が有利になります

ぜひ購入して根拠を見てほしいです

# 選挙と投票のパラドックス

自分が議員として立候補するわけではないですが

この政党はこう動きたい、今はこの政党がキーとなっている

など社会情勢が少し読めるようになるかもしれません


# 企業と特許

自分と関わりがない話かなと思っていましたが過去の特許に関する企業間の話があったり

会社を買収する時の株式をどう買っていけばいいかなど

投資をしているのでこの会社はどんなこと考えているかなどなんとなくわかりそうな気がします


# 終わりに

エンジニア的な要素はあまりありませんが仕事を進める上での立ち回りがなんとなく上手くなれそうです

自分の仕事を有利に、楽に進めていくためにモラルを持って利用していければと思います
イベント操作で画像を表示できるようにするー2

お疲れ様です。

今日は昨日の続きをやっていきました。
昨日は画像表示する手前で、エラーが出てしまうところでしたので、エラーを解決しつつ、あと残り2つのボタンにも別の画像を紐づけして、選択されたときに表示されるようにJavaScriptのコードを書いていきました。

![231.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/20e70b51-70a5-b76d-1d61-c8ed5ffecc9e.png)

![232.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/66f9a10b-1285-1a36-aa45-117a80b9449c.png)

画像が残っておりませんが、昨日出たエラーは定数名の設定でひっかかりがあったようです。

調べても分からなかったので、chatGPT先生に教えていただきましたが、getElementByClassName("btn")の定数名を Btn としていましたがそれがひっかかっているかもということでしたので、 btns に変更。
そして、addEventListener の使い方が間違っており、getElementByClassName で取得したボタンすべてに addEventListener を追加しなければならなかったようです。
というわけで定数名変更、コードの書きなおしと、for文のところはGPT先生に教わりながら記述しました。
その結果、それぞれのボタンに対して、全3種類の画像を紐づけすることができ、「選択」ボタンを押すことで表示できるようになりました！

ただ…
![233.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3810013/c6612656-c24b-14d7-b664-62f4860fd9e7.png)
ページを更新せず、別のボタンを選択すると、前に表示されていた画像がそのまま残っちゃいました…
それはそうだと思います。隠すようなコードを書いてませんので…:cold_sweat:

なので、これについては display: none を使って画像を隠すようにしていけば大丈夫なようですので、分からない部分を調べつつ実装していきます:writing_hand:

そこができるようになったら、少し前にやったことのある keyframe を使ってふわっと画像が表示されるように変更したり、労りのメッセージも一緒にだせる（のか分かりませんが）ようにやっていきたいと思います！
Visual Studio 2019をインストールしたい

同じように困っている人が多そうな気がしたので。
PCを買い替えた時に、ライセンスはあるのにダウンロードの場所がわからなくて探し回りました。

ここからダウンロードできました。

https://learn.microsoft.com/ja-jp/visualstudio/install/use-command-line-parameters-to-install-visual-studio?view=vs-2019
【個人開発】PasswordBoxってアプリを作ったよって話

個人開発でアプリ作ったので、紹介とかいろいろ語ります。
正直、技術的な話はあまりしません。

# アプリの紹介
改めて、個人開発で iOS アプリケーションを作成しました。
名前は "PasswordBox" です。
名前に「パスワード」とある通り、Password Manager アプリです。
しかし、ただのパスワード管理アプリではなく、パスワードを生成してくれるアプリケーションとなっています。

https://apps.apple.com/jp/app/passwordbox/id6520392403

## アプリの詳細
このアプリは大きく分けて、3個の機能があります。
- ロック画面：FaceIDでアプリのロックを解除します
- パスワードの作成・編集
- アプリの情報

とてもシンプルでチープなアプリだと思います。

### ロック画面
このアプリではパスワードを扱う以上、セキュリティ性を高めるためにアプリを使用するにはパスコード等を使ってアプリを使う必要があります。
しかし、ログイン画面を1から使うのは大変だし、個人的にこのアプリで Firebase などを使ったログイン認証を作りたくなかったので、このアプリでは FaiceID を使っています。

FaceIDの使い方は、以前書いたこちらの記事をご参照ください：

https://qiita.com/KaitoMuraoka/items/602c4f8e5e2683f8e7f0

### パスワードの作成・編集
このアプリのメイン機能です。ホームの左上にある + ボタンからパスワードを追加することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/a055022c-0ed7-b68b-fd89-0122b6742bfb.png" width=300>

また、追加したらパスワードの一覧画面からパスワードを編集することができます。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/c67b16c6-0dd1-323c-fe79-f4b223deea45.png" width=300>

編集できる内容は以下の通りです：
- Password
- タイトル
- アイコン

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/5741650e-1c94-da4c-0d91-cf8b6afb9a2a.png" width=300>

アイコンについては、アイコン一覧から好きなアイコンを選択することができます。
また、パスワード自体は iCloud のキーチェーンに保存されます。アイコン、パスワードのタイトルについてはSwiftDataでユーザーの端末内に保管されます。

# こだわったところ
## パスワード生成
パスワードを自動生成する機能を搭載しています。
この機能は ChatGPT などの生成AIを使わず、ランダム関数を使って生成されます。そのため、一定の規則性で生成されることはありません。

パスワード生成機能では、パスワードに以下の特徴を持たせて生成することができます。
- パスワードの長さ：1桁から100桁まで生成することができます
- アルファベット・記号の有無：すべてOFFにすると数字のみのパスワードを生成できます

アルファベット・記号の有無を選択できるようにした理由は、パスワードの複雑さをユーザーが選べるようにしたかったからです。
パスワードは複雑にすればするほどセキュリティの難易度が上がります。しかし、それは逆にユーザーがパスワードを入力する際の煩わしさも生まれてしまいます。
他にも、パスワードによっては数字のみの入力を要求されることもあります。例えば、自転車のキーロックなど。
そこの問題を解決するためにパスワードの長さ、アルファベット・記号の有無を選択できるようにしました。

## アイコン・タイトルの編集画面
iPhone で標準でインストールされているリマインダーアプリを参考に作ってみました。
パスワードの名前と関連するアイコンを追加することができます。
アイコンは、SFSymbolから取ってきています。

# 作った経緯
Password Manager アプリはこの世の中にごまんとあります。有名なのは [1Password](https://1password.com/jp) でしょうか。
また、iOS18, iPadOS18 から、[Apple純正のパスワードアプリ](https://gigazine.net/news/20240607-apple-ios-18-passwords-app/)が登場します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/1081f8a2-b20c-293b-1964-4694735107e2.png" width=300>

これらのアプリでもパスワードの自動生成は行なってくれます。しかし、パスワードの長さや複雑性は固定となっています。
iPadOS 18 beta で試したところ、アルファベット・記号を含めた10文字ほどの長さのパスワードが生成されます。

私はここに、もう少しユーザーの自由度を与えてみてはどうかと思いこのアプリを作成しました。

# 最後に
このアプリの需要はとても少ないと思います。しかし、「企業が解決しにくい課題を解決する」というのも個人開発の良い面かなと思います。
今後、Appleのパスワードアプリがこのアプリの機能を追加してくれることを願っています。
エンジニア会社設立！電子定款で引っかかる

ついに会社作るますと。
定款を電子定款でやりますと
ここでかなり時間喰ったのでまとめ

必要なもの
・icカードリーダ（2000円のでOK）

・マイナンバー（電子証明入ってるもの）
※マイナンバ作った際、4桁の数字とかパスワード設定してたら電子証明入ってる

・PDF署名プラグイン
https://www.touki-kyoutaku-online.moj.go.jp/download_soft.html


・JPKI利用者ソフトのダウンロード
https://www.jpki.go.jp/download/

インストール後にアプリ起動→ウインドウ立ち上がる→自分の証明書→
パスワード求められる（たぶんマイナンバー作った時の）→表示された内容問題なければOK閉じる

・adobe acrobat　32bitをインストール
※注意：普通にacrobatインストールではダメ
なぜか？→acrobat起動後→メニュー→環境設定→署名→作成と表示方法の詳細→
デフォルトの署名方法のプルダウンに「SignedPDFが表示されない」

※ここに記載のことやってもプルダウンから表示されなかったら再起動してね
下記リンクから32bitをDLする（お使いのPCが64bitでも）
ちなみに自分は「Acrobat Standard」の32bitを入れたよ
ちなみに7日間の体験期間に加入しました。
しないとできなさそうだったので・・

https://helpx.adobe.com/jp/acrobat/kb/acrobat-dc-downloads.html

行った設定を記載
acrobat起動→メニュー→環境設定→セキュリティ（拡張）→起動時に保護モードを有効にするのチェック外しておく

【実際にやる】
icカードにPCつないでリーダーにマイナンバー差し込んで置く

その後acrobat起動の電子署名したPDFファイルを選択して開く
すべてのツール→証明書を使用→デジタル署名
で署名したい部分をドラッグでいけるはず

【エラー部分】
体験したエラーは2つ

1.ちなみに最後のドラッグした部分でacrobatが強制終了になりました。
再度立ち上げて行ったら何も問題なかった、よくわからん

2.ICカードとの接続に失敗しました。
GORMでUpdateするメソッドについて表に整理してみた

gormのUpdateメソッドについてそれぞれ違いがあるので表にまとめてみた。



### GORMの更新メソッドの違い

| メソッド         | 更新対象         | `UpdatedAt`の自動更新 | ゼロ値の扱い（数値型の0、空文字、boolのfalse　など） | 主な用途                        |
|------------------|-----------------|----------------------|-------------------------------------------------|-------------------------------|
| `Save`           | 全フィールド       | する                  | 更新される                                          | 全フィールドの更新、新規レコードの保存 |
| `Update`         | 単一フィールド     | する                  | 更新される                                          | 特定のフィールドの更新           |
| `Updates`        | 複数フィールド     | する                  | **構造体:** 無視される<br>**マップ:** 更新される       | 複数のフィールドの更新           |
| `UpdateColumns`  | 複数のフィールドの更新 | しない                 | 無視される                                          | 複数のフィールドの更新       |



ゼロ値の更新の部分はゼロ値を正しく理解してないとハマる。例えば、ポインタ型の場合は、nilがゼロ値になるということを意識しておく必要がある。
例えば
```go:sample
abc struct {
isTest bool 
isProd *bool
}

db.Model(&sample).UpdateColumns(User{isTest: false, isProd: false})

// 生成されるSQLのset句にゼロ値が除外される。ポインタ型はnilがゼロ値でこの場合は除外されない。
// update sample set isProd = false
```



関連ドキュメント
https://gorm.io/docs/update.html

ゼロ値について
https://qiita.com/tenntenn/items/c55095585af64ca28ab5
IntelliJでよく使うショートカットをまとめようとして挫折した

## はじめに
プログラマーの３種の神器の一つIDEですが、皆さんは何を使っていますか？
私は、タイトルの通り、IntelliJを使っています。

どのIDEでも同じですが、コーディングをする際、できる限りキーボードで操作したいですよね？

ね？(圧高め)

IntelliJはショートカットが非常にたくさんあり、とてもじゃ無いですが覚えきれません。

最低限よく使うものを忘れないようにするため、まとめておきたいと思います。
(間違えているものがあったらご指摘いただけると幸いです。)

## この記事の対象者
- macユーザーの方
- IntelliJを使っている人
- マウスやトラックパッドは使わない派になりたい人
- 忘れたとき用にチートシートを探している人


## ショートカットたち

:::note info
コマンドの種類が似てるものを固めて並べています。
(覚えることの方が大変そうなので…。)
:::

凡例
⌘: command
⌃: control
⌥: option
⇧: shift

| 挙動 | ショートカット |
|:-:|:-:|
| プロジェクトのリボンを開く/閉じる  | ⌘ + 1 |
| 定義元に飛ぶ  | ⌘ + B |
| 引数の定義を見る  | ⌘ + P |
| カーソル位置の部位を折りたたむ  | ⌘ + - |
| カーソル位置の部位を展開する  | ⌘ + = |
| 選択した変数に対するマルチカーソル  | ⌃ + G  |
| 前回実行したテストの実行  | ⌃ + R  |
| カーソル位置のスコープにあるテストの実行  | ⌃ + ⇧ + R  |
| とにかく便利なショートカット  | ⌥ + Enter  |
| ターミナルを開く/ターミナルへカーソル移動  | ⌥ + F12  |
| リネーム  | ⇧ + F6  |
| テストファイルと実装ファイルの移動  | ⌘ + ⇧ + T |
| 大文字小文字を逆転させる  | ⌘ + ⇧ + U |
| ファイル内全体を折りたたむ  | ⌘ + ⇧ + - |
| ファイル内全体を展開する  | ⌘ + ⇧ + = |
| タブ間の移動  | ⌘ + ⇧ + [ or ] |
| ファイル名検索  | ⌘ + ⇧ + O |
| コード整形  | ⌥ + ⌘ + L |
| 関数の切り出し  | ⌥ + ⌘ + M |
| 変数のインライン化  | ⌥ + ⌘ + N |
| 変数化  | ⌥ + ⌘ + V |
| 不要なimportの最適化  | ⌥ + ⌃ + O |
| {}の中の改行を消して１行にする  | ⌃ + ⇧ + J  |
| 行の入れ替え  | ⌥ + ⇧ + ↑ or ↓  |
| 変数の順番左右入れ替え  | ⌥ + ⌘ + ⇧ + ← or → |
| 上下にマルチカーソルを増やす  | ⌥ → ⌥(長押し) + ↑ or ↓ |
|   |   |
|   |   |


まだまだたくさんあると思うし、覚えられていないものもありますが、
さらに便利なものや使いたいものがあったら随時増やしておきたいと思います。
個人的メモ：i3-wmの使い方_基本1

個人的なメモです。
Lenovoの古いノートにLinux mint + i3で運用してます。

`mod`：Windowsキー
`数字キー`:1,2,3,4,5,6,7,8,9,0のキー

# ログアウト、設定再読込（再起動）

| 操作 | アクション |
|:-|:-:|
| mod+Shift+e | ログアウト |
| mod+Shift+c | 設定を再読込 |
| mod+Shift+r | i3を再起動|

# ターミナルを開く、ターミナル（アプリ）を閉じる

| 操作 | アクション |
|:-|:-:|
| mod+Shift+Enter | ターミナルを開く |
| mod+Shift+q | ターミナル（ウィンド・アプリ）を閉じる |

# 仮想デスクトップ関連（ワークスペース）

| 操作 | アクション |
|:-|:-:|
| mod+`数字キー` | 対象のワークスペースへ移動 |
| mod++Shift+`数字キー` | アクティブなウィンドを、対象のワークスペースへ移動 |

# アクティブウィンド（アプリ）をフルスクリーン化

| 操作 | アクション |
|:-|:-:|
| mod + f | アクティブウィンド（アプリ）を全画面化 |

もう一度押すと、フルスクリーンを解除する。

# コンテナ（アプリ）の積み方をチェンジ

| 操作 | アクション |
|:-|:-:|
| mod+e | "splith/splitv"方式（i3-wmのデフォルト） |
| mod+s | "スタッキング"方式（積み重ねる） |
| mod+w | "タブ"方式 |

詳細は　[こちら](https://i3wm.org/docs/userguide.html#_changing_the_container_layout "2.2. Changing the container layout")


# 次につくるコンテナ（アプリ）の分裂方向（水平・垂直）

| 操作 | アクション |
|:-|:-:|
| mod+h | 水平方向(i3-wmのデフォルト) "To split it horizontally." |
| mod+v | 垂直方向 "To split a window vertically." |

一度実行すると効果は継続する。

例1
```
$ mod+v
$ mod+Enter
$ mod+Enter
$ mod+Enter
```

![スクリーンショット_2024-08-27_22-38-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/78936/9c2f86da-e619-3804-815b-51053923313b.png)
JavaScriptで、宣言した関数がコンソールに関数がそのまま表示される

# はじめに

JavaScript初心者です。
変数に入れた関数がそのままコンソールに表示されてしまう現象で詰まりました。

### 実際にコンソールに出てきた表示
![スクリーンショット 2024-07-22 223900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3815580/1b55a1ca-d3b2-3d3e-c8e8-86d33f6e1564.png)


# 問題

発生したコードは以下です。

```javascript
const getStudyRecord = async () => {
  const data = await supabaseClient
    .from('study-record')
    .select("*");
  return data;
};

console.log(getStudyRecord); // # はじめに で表示されてしまった箇所
```

# 原因

**関数を代入した変数に`()`をつけ忘れていました。**

```javascript
console.log(getStudyRecord()); // Promiseが表示される（期待通り）
```

どうやら関数を代入した変数をコンソールに表示すると、**関数の中身がそのまま表示されてしまう**ようです。~~なんじゃそりゃ~~

# 最後に

過去のコードを確認してみたら、アロー関数を代入した変数には必ず`()`を付けていました。
変数から関数に切り替えるという意識を持つのがいいのでしょうか……

今までほぼJava周辺の似たような言語しかやってきておらず、JavaScriptのようなモダンな言語に触ると混乱するのが自分の弱みだなと実感しました。
線形回帰の最小二乗法　計算してみよう

# 今日のお題
線形回帰の最小二乗法
$ J(w) = \sum_{i=1}^n (y_i - w^T x_i)^2 $を最小化
→ $(X^T X) $が正則なら 
$ w = (X^T X)^{-1} X^T Y $
が最小解

これを計算してみます。

# 関数J(w)の勾配を求める
関数 $ J(w) $ は次のように与えられている。
$ J(w) = \sum_{i=1}^n (y_i - w^T x_i)^2 $

ここで、$ y_i $ は目標値、$ w $ は重みベクトル、$ x_i $ は教師データのベクトルです。

この関数 $ J(w) $ の勾配を求めるために、各 $ w $ に関して微分します。まず、行列形式に変換する。
$ J(w) = (Y - Xw)^T (Y - Xw) $
ここで、 $ Y $ は $ y_i $ のベクトル、$ X $ は $ x_i $ の行列である。

この式を展開すると：
$ J(w) = Y^T Y - 2 Y^T X w + w^T X^T X w $

これを $ w $ に関して微分すると：
$ \nabla J(w) = -2 X^T Y + 2 X^T X w $

したがって、勾配 $ \nabla J(w) $ は次のようになる。
$ \nabla J(w) = 2 X^T (X w - Y) $

# 勾配が0になる値を求める
$ 2 X^T (X w - Y) = 0 $
$ X^T X w = X^T Y $

これを解くと、重みベクトル $ w $ は次のようになる。
$ w = (X^T X)^{-1} X^T Y $
MUIでDialogを表示させると背景が真っ暗になる件

[MUI](
https://mui.com/)はお使いでしょうか？
reactできれいなUIを作りたい時にとっても便利で、お世話になっている方も多いかと思います。

今回は、初心者🔰が躓いた点を備忘録としてメモしておこうと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/22e889f5-8f8d-1ca3-8f7d-79e835fe420b.png)


ソースの詳細は割愛しますが、切り分けていった結果mapで同じDialogを使いまわした際にDialogの状態が管理できずこのような動作になるようです。

（読み飛ばし推奨の経緯：
- ネットで同様の事情が見つからず、BackDropも触ってみたのですが当てが外れる
- Boxなどの設定がよくないのではないかと疑ったのですが、mapを使わずべた書きすると発生しない
- Dialog以外はmapを使っても正常に動いていた

以上より状態管理を疑うに至りました）


本来だと下記のように元々の画面が透けるはずなのです😿
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3811577/3b9cb32d-35cd-c510-4b65-7d5306c9706e.png)

さて、ではmapを使いたいしDialogも使いまわしたい場合はどうすればよいのでしょうか？
Dialogのオンオフ用に作成するuseStateで各Dialogの状態を管理できれば使いまわしても挙動がおかしくならないはず！
ということでuseStateはtrue/falseではなく各Dialogのidで管理します。
```
const [openDialog, setOpenDialog] = useState<number | null>(null);
```
また、Dialogのopen用handleは下記のようにidを渡し、処理が終わったもしくはキャンセルされた場合はnullをセットします。
```
  const handleDialogOpen = (id: number) => {
    setOpenDeleteDialog(id);
  };

  const handleDialogClose = () => {
    setOpenDeleteDialog(null);
  };

  const handleDelete = () => {
    // 削除処理
    setOpenDialog(null);
  };

```
また、Dialogの呼び出しは下記のように行うことで、openDialogの値とidが同じ時だけDialogが開きます。
```
    <DeleteDialog
      openDialog={openDialog === id}
      handleDialogClose={handleDialogClose}
      handleDelete={handleDelete}
    />
```
オリジナルアプリ（ウォンツ）の制作過程〜要件定義〜

## はじめに

こんにちは、今日もオリジナルアプリの制作過程を記録していきます。今日は要件定義についてです！
このシリーズの記事では、企画・要件定義から設計、実装、テストまでの全てのプロセスを詳細に説明します。毎日少しずつ進めていきますので、アドバイスや指摘があればぜひ教えてください。

## 要件定義

### 機能要件

#### ユーザー管理
- **ユーザー登録**: 名前、メールアドレス、パスワード、住所を入力して新規登録。
- **ログイン/ログアウト**: 登録済みユーザーがメールアドレスとパスワードでログイン。
- **ユーザープロフィール管理**: 名前、住所、メールアドレス、電話番号の変更機能。

#### 依頼管理
- **依頼内容**: タイトル、説明、カテゴリー、条件価格、画像をアップロードし、依頼の投稿。
- **依頼一覧表示**: 全依頼の一覧を表示、カテゴリーや価格帯でフィルタリング可能。
- **依頼条件詳細表示**: 依頼の条件の詳細情報（タイトル、説明、上限・下限価格、依頼者情報、着払い可否）を表示。
- **依頼検索**: 依頼している商品タイトルや説明で検索可能。

#### 商品管理
- **商品出品**: タイトル、説明、カテゴリー、価格、画像をアップロードし、商品の出品。
- **商品一覧表示**: 一つの依頼に出品している全商品の一覧を表示
- **商品詳細表示**: 個別商品の詳細情報（タイトル、説明、価格、出品者情報）を表示。


#### 購入機能
- **カート機能**: 購入したい商品をカートに追加。
- **購入手続き**: カート内の商品を購入、支払い情報（クレジットカード情報）を入力。
- **購入履歴**: 過去の購入履歴を表示。

#### 支払い機能
- **クレジットカード決済**: PAY.JPを使用したクレジットカード決済機能。
- **決済履歴**: 決済の履歴を表示。

#### コメント機能
- **各依頼へのコメント**: 依頼者と訪問者がコメントできる


### UI/UX要件
- **レスポンシブデザイン**: モバイル、タブレット、デスクトップでの表示に対応。
- **使いやすさ**: 直感的なインターフェース、簡単なナビゲーション。

### 開発・運用要件
- **技術スタック**: 
  - フロントエンド: HTML, CSS, JavaScript
  - バックエンド: Ruby on Rails
  - データベース: PostgreSQL
  - 決済: PAY.JP
- **開発プロセス**: 
- **運用・保守**: AWSを利用したサーバー運用、月次メンテナンス。

## ページごとの機能

| ページ             | 機能                                            | ボタン                                      | 表示                                       |
|--------------------|-------------------------------------------------|---------------------------------------------|--------------------------------------------|
| **トップページ**   | ユーザー登録、ログイン、商品検索、カテゴリー閲覧 | ユーザー登録、ログイン、検索、カテゴリーリンク、新規依頼 | ヘッダー、検索バー、カテゴリーリスト、注目依頼 |
| **ユーザー登録ページ** | ユーザー登録                                  | 登録                                        | 名前、メールアドレス、パスワード、住所のフォーム、入力ヒント |
| **ログインページ** | ユーザーログイン                                | ログイン                                    | メールアドレス、パスワードのフォーム、パスワードリセットリンク |
| **依頼一覧ページ** | 依頼閲覧、検索、フィルタリング                | 依頼詳細、新規依頼                                    | 依頼カード、フィルタリングオプション       |
| **依頼投稿ページ** | 依頼投稿                | 投稿                                    |タイトル、画像、説明、上限・下限価格、依頼者情報、着払い可否       |
| **依頼詳細ページ** | 依頼の詳細情報の表示、商品一覧                     | 商品詳細、出品                          | 依頼内容、依頼条件・情報                         |
| **商品一覧ページ** | 商品の閲覧、検索、フィルタリング                | 商品詳細                                    | 商品カード、フィルタリングオプション       |
| **商品詳細ページ** | 商品の詳細情報の表示、購入                      | 購入                          | 商品画像、商品情報                         |
| **購入手続きページ** | 購入手続き、支払い情報入力                      | 購入確定                                    | クレジットカード情報、配送先住所、注文概要 |
| **購入履歴ページ** | 購入履歴の表示                                  | 詳細                                        | 購入履歴一覧、購入詳細                     |

## まとめ

オリジナルアプリの要件定義と各ページごとの機能について詳しく説明しました。今後の記事では、これらの要件に基づいて具体的な設計や実装の手順を紹介していきます。毎日の投稿を目指していますので、ぜひフォローしていただき、アドバイスや指摘があればお聞かせください。
DNSってなーに？

# DNSとは？
## 正式名称
**<font color="red">D</font>omain <font color="red">N</font>ame <font color="red">S</font>ystem**

## DNSの役割

DNSとはネットワーク上の住所(IPアドレス)に対して、人が理解しやすい名前(ドメイン名)を結びつけるシステムです。

## ネットワーク上の住所：IPアドレス

ネットワーク上の住所の事を「IPアドレス」と呼びます。

### 例
- <font color="blue">192.168.33.10</font>
- <font color="blue">192.168.33.11</font>
- <font color="blue">192.168.33.12</font>

## IPアドレスの問題

しかし、人間にとってこれらの数字を覚えるのは難しいですよね。

## ドメイン名の利用

そこで私たちが覚えやすいようにドメイン名(Domain Name)を使います。

### 例
- **<font color="green">www.youtube.com</font>**
- **<font color="green">www.google.com</font>**

## DNSの働き

つまり、私たちが「<font color="green">www.youtube.com</font>」と入力すると、DNSが「<font color="blue">192.168.33.10</font>」のようなIPアドレスに変換され、コンピューターは正しい場所に接続できます。この正しい場所に変換してくれるシステムのことを**「<font color="red">DNS</font>」**といいます。

## DNSサーバー

DNSのサービスを実際に担当しているのは**DNSサーバー**です。サーバーとは、サービスや機能を提供する側のコンピュータのことです。つまりDNSサーバーは、IPアドレスとドメイン名を正しい場所に変換してくれるシステムを提供してくれるコンピューターとなります。

## DNSサーバーの種類

DNSサーバーには2種類あり、「キャッシュDNSサーバー」と「権威DNSサーバー」があります。2種類に分ける理由は、DNSサーバーの仕組み全体のスピードアップ化が見込めます。

### キャッシュDNSサーバーとは

DNSによるドメイン名に対応するIPアドレスの問い合わせ結果を一定期間保存しておき、短期間に繰り返し同じ問い合わせを同じサーバに送らないようにする仕組みです。

つまり、「PCからの名前解決要求（このドメインのIPアドレスは何ですか？）をとりまとめる」サーバーの事です。

### 権威DNSサーバーとは

内部にIPアドレスとサーバ名などを対応させるレコードを持ち、キャッシュDNSサーバから来る名前解決要求に対して、返答を返してくれます。

つまり、「名前解決要求に対して名前解決結果を返答する」サーバーのことです。

## ゾーンファイルとは

権威DNSサーバーの仕事は「名前解決要求に対して名前解決結果を返答する」仕事でした。この権威DNSサーバは、お仕事用のマニュアルを持っています。このマニュアルの事を「ゾーンファイル」といいます。ゾーンファイルにはドメイン名とIPアドレスの対応表が書かれています。

## DNSレコードとは

先ほどのゾーンファイルの一行一行のことを「DNSレコード」といいます。

## DNSレコードの種類

今回は5種類、紹介します。

- **Aレコード**  
  ドメイン名に対応するIPアドレスが書かれた行

- **CNAMEレコード**  
  ドメイン名に付けた別名（あだ名）が書かれた行

- **PTRレコード**  
  IPアドレスに対応するドメイン名が書かれた行（Aレコードの逆）

- **MXレコード**  
  ドメイン名に送信されたメールメッセージの受信を担当するが書かれた行

- **TXTレコード**  
  コメントやドメインに関する追加情報が書かれた行

## まとめ

以上より、DNSは「ネットワーク上の住所(IPアドレス)に対して、人が理解しやすい名前(ドメイン名)を結びつけるシステム」です。

**DNSサーバー**は「IPアドレスとドメイン名を正しい場所に変換してくれるシステムを提供するコンピューターとなります。」

**DNSレコード**は「サーバーのファイルに書いてあった一行一行のこと」となります。
FirelensしたいけどFluentbitがよくわからんのでローカルで試す

みなさんFluentbitは好きでしょうか。
はい！好きです！と勢いよく答えた方、きっとFluentbitもあなたの事が好きです。

しかし私は片思いでした。

なので、ローカルで色々試したかったので、その環境構築などなどメモしたいと思います。

あ、Docker使うのでその前提で。

# とりま動かす
こちら参考にさせていただきました。
https://zenn.dev/amezousan/scraps/d41491d800d682

以下の2行でFluentbit動きます。
```
docker pull fluent/fluent-bit:latest-debug
docker run --name fluentbit --rm fluent/fluent-bit:latest-debug /fluent-bit/bin/fluent-bit -i tail -p path=/tmp/test -p refresh_interval=5 -o stdout
```

動いたら別のターミナルで接続します。
```
docker exec -it fluentbit bash
```

あとは/tmp/testに書き込めば、Fluentbitが動作します。
例）
```
echo test >> /tmp/test
```

画像の２行目が出てきた子です。かわいいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828005/9cefd367-44b4-355e-18ba-a9eca974dfa0.png)

# 設定ファイル使いたい
FirelensとかだとS3にファイル置けるんすけど、ローカルDockerの場合どうするんだろ？
設定ファイル変えるたびにDocker Imageビルドしなおすのは嫌ですね。

なので、Dockerのボリュームマウントで、設定ファイル置いてあるローカルの場所共有しましょう。
c:\Users\User\aws\fluentbit
というディレクトリの下に、extra.confというファイルを置いているとします。（名前は自由なのでextra.confでなくてもOK）
その場合、コマンドは以下です。（extra.conf作る前に実行するとエラーになると思います）
```
docker run -v c:\Users\User\aws\fluentbit:/root --name fluentbit --rm fluent/fluent-bit:latest-debug /fluent-bit/bin/fluent-bit -i tail -p path=/tmp/test -p refresh_interval=5 -o stdout -c /root/extra.conf
```
extra.confの中身は、単純に以下にしましょう。
```
[FILTER]
  Name  rewrite_tag
  Match *tail*
  Rule  log test log2 false

[OUTPUT]
  Name  stdout
  Match *
```
先のコマンドで実行して、別のターミナルで/tmp/testに書き込みます。
すると以下のようになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3828005/b5e26868-e7b8-a7e0-7ea6-7725af3b7f1f.png)

前の出力結果で、「tail.0」だったものが「log2」に書き換わりました。

後はお好きなように。

:::note
extra.confでは、タグに「tail」を含むものを、「log2」に書き換えてます。
私の環境ではデフォルトのタグが「tail.0」だったのですが、他の人でも同じかは知らんです。
:::
:::note
デフォルトの設定ファイルあるだろうから、extra.confに[OUTPUT]いらんくない？って思ったそこのあなた。
私もそう思ったんですが、書かないとログ出力されなかったです。
:::

:::note warn
書き忘れたんすけど、[PARSER]は他の設定ファイルと異なるファイルに書かないといけないです、確か。
extra.confで別のファイル指定することもできたと思いますけど、fulentbitの実行時引数に渡す場合は、-Rで渡すんだったはずです。
https://docs.fluentbit.io/manual/administration/configuring-fluent-bit
:::
AWS CloudShellでのファイルダウンロードを簡単に！ フルパス生成コマンド

# 目的

CloudShellでファイルをダウンロードする際、フルパスが必要で少々面倒です。
本記事では、カレントディレクトリ内のファイルのフルパスを時系列順で
取得できるスクリプト作成し、手間を少し減らします。

# スクリプト

```bash
#!/bin/bash
# カレントディレクトリの全てのファイルをフルパスで表示する（最新のファイルが最後）
find "$(pwd)" -maxdepth 1 -type f -printf '%T+ %p\n' | sort -n | cut -d' ' -f2-
```

## 時系列でソートした理由
最初は、pwdとlsをそれぞれ実行しコピペを2回することでフルパスを取得していましたが、
Cloudshell内で同じような操作を繰り返すにつれて手間だと感じるようになりました。

そこで、コピペが一回を済むようにフルパスで表示し、
時系列順でソートすることにより、 ~~ずぼら~~心配性で過去に作成したファイルを
削除していなくても、簡単に最新のファイルを見つけたいと考えました。

## 使用方法

1\. AWS CLIでデータを取得
```bash
aws ec2 describe-instances > ec2_instances.json
```

2\. フルパス生成スクリプトを実行
```bash
./list_files.sh
```

3\. 出力されたファイルのフルパスをコピー ※トリプルクリックで行を選択→ctrl+c

4\.「アクション」メニューから「ファイルのダウンロード」を選択

5\.コピーしたフルパスを「ファイルパスの入力」欄に貼り付け

6\.「ダウンロード」ボタンをクリックしてファイルをダウンロード

# まとめ
小さな工夫ですが、AWS CloudShellでの作業の効率を少し向上させることができます。
ぜひ試してみてください！
Pythonの型ヒントマスター: mypy活用とジェネリクスの高度な使用法

## はじめに

Pythonの型ヒントは、コードの品質と可読性を向上させる強力なツールです。本記事では、静的型チェッカーであるmypyの活用方法と、ジェネリクスを使用した高度な型ヒントの実装について解説します。

## 目次

1. [mypyの基本](#mypyの基本)
2. [mypyの高度な設定](#mypyの高度な設定)
3. [ジェネリクスの基本](#ジェネリクスの基本)
4. [ジェネリクスの高度な使用法](#ジェネリクスの高度な使用法)
5. [まとめ](#まとめ)

## mypyの基本

mypyは、Pythonの静的型チェッカーです。コードを実行せずに型の整合性をチェックできます。

### インストールと基本的な使用方法

```bash
pip install mypy
```

使用例:

```python
# example.py
def greet(name: str) -> str:
    return f"Hello, {name}!"

result = greet(42)  # 型エラー
```

mypyを実行:

```bash
mypy example.py
```

出力:
```
example.py:4: error: Argument 1 to "greet" has incompatible type "int"; expected "str"
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/802933de-65c8-cd03-c7ee-0d982fc11a64.png)

## mypyの高度な設定

mypyの設定ファイル（mypy.ini）を使用することで、より細かな型チェックが可能になります。

```ini
# mypy.ini
[mypy]
disallow_untyped_defs = True
strict_optional = True
warn_return_any = True
warn_unused_ignores = True
```

これらの設定により、より厳密な型チェックが可能になります。

## ジェネリクスの基本

ジェネリクスを使用すると、型に依存しない汎用的なコードを書くことができます。

```python
from typing import TypeVar, List

T = TypeVar('T')

def first_element(lst: List[T]) -> T:
    if lst:
        return lst[0]
    raise IndexError("List is empty")

# 使用例
int_list = [1, 2, 3]
str_list = ["a", "b", "c"]

print(first_element(int_list))  # 1
print(first_element(str_list))  # "a"
```

## ジェネリクスの高度な使用法

### 制約付きジェネリクス

特定の型に制約をつけたジェネリクスを定義できます。

```python
from typing import TypeVar, List

Number = TypeVar('Number', int, float)

def sum_list(lst: List[Number]) -> Number:
    return sum(lst)

print(sum_list([1, 2, 3]))  # 6
print(sum_list([1.5, 2.7, 3.2]))  # 7.4
# print(sum_list(["a", "b", "c"]))  # エラー
```

### ジェネリッククラス

ジェネリクスを使用してクラスを定義することもできます。

```python
from typing import Generic, TypeVar

T = TypeVar('T')

class Box(Generic[T]):
    def __init__(self, content: T):
        self.content = content

    def get_content(self) -> T:
        return self.content

int_box = Box[int](42)
str_box = Box[str]("Hello")

print(int_box.get_content())  # 42
print(str_box.get_content())  # "Hello"
```

## まとめ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2648069/61689a69-10fb-07a2-9239-7b078ba75c8b.png)

Pythonの型ヒントとmypyを活用することで、より安全で読みやすいコードを書くことができます。ジェネリクスを使用することで、型に依存しない柔軟なコードを実装できます。これらのテクニックを習得することで、Pythonプログラミングのスキルを一段階上げることができるでしょう。

参考資料:
- [Python公式ドキュメント - typing](https://docs.python.org/3/library/typing.html)
- [mypy公式ドキュメント](http://mypy-lang.org/)

https://qiita.com/Tadataka_Takahashi/items/300d99bb42ec1df719f3
AWSリソースをTerraform or CloudformationにImportする_フォルダ構成

# 前提
全体の概略は[こちらから](https://qiita.com/hrkkanda/items/1ef47fd6213547396c99)

# このページの概略
Terraform とClloudFormationによるImportで既存のインフラをIaC化する際の設計思想等々を記載します。

## Terraform, CloudFormation共通
### for_eacの採用
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705595/69ecdd18-491b-ff65-e9ac-c61f8f03b793.png)

このように
- NoProdアカウントにはdev, test, stage環境のリソースがある
- Prodアカウントにはprod環境のリソースがある
- 高価なリソースや一部のリソースは
    - NoProdアカウントにdev, test, stage環境を兼ねるリソースがある
    - Prodアカウントにprod環境のリソースがある

といった条件のものもとでIaC化を実施しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705595/3f71cc90-5ae2-2f28-b82f-165a3940ccb3.png)

加えて、
- dev, test, stage, prod環境がすべて同じコードで構築される
- コードを格納しているフォルダとAWSアカウントの対応が分かりやすくする
- (terraformに限りますが)tfstateファイルとAWSアカウントが1:1対応する

という条件を満たすため、環境ごとにfor_eachによるリソースの繰り返しを用いて対応しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705595/5f315f4c-746c-2309-46ef-584fd0aab22b.png)

### 環境の差分はmain.tf(ルートスタック)のみに記載されるようにする
上記に加えて、他プロジェクトへの転用も用意し塗るべく、AWSアカウント後ごとに分けたmain.tfとvariable.tfにのみ環境差分（リソース名, etc）が記載されるように設定しました。
※cloudformationのばあいはルートスタック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705595/f406fab5-d683-d44e-c5a6-09e0991450c8.png)

## CloudFormationの注意点
### 一部リソースが対応していない
[こちらの公式Doc.](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-supported-resources.html?icmpid=docs_cfn_console)でImportしたいリソースが対応しているのか要確認です。

### import時のリソースIDの種類と取得
コンソールからimportを行う場合、リソースの識別子を入力する必要があります。必要な識別子はARN, リソース名とまちまちなため要確認です。
さらにSubnetとRouteTableの関連付けIDなどはコンソールに表示されないため、aws-cliで確認が必要になります。
![cluster.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705595/7602b9fb-7305-9f5a-8679-72f86188b940.png)

### ネスト化された子スタックにImportは不可！
[こちらの公式Doc.](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/resource-import-nested-stacks.html)に以下の記載があり、３階層以上のネスト化されたスタックにImportするのは不可なようです
`AWS CloudFormation は、resource import を使用して 1 つのレベルのネスト化のみをサポートします。つまり、子スタックにスタックをインポートしたり、子を持つスタックをインポートしたりすることはできません。`
Salesforceユーザにある「Service Cloud ユーザー	」チェックの効果検証

本橋孝昭です

今回はSalesforceユーザにある「Service Cloud ユーザー	」チェックの効果を検証しました

チェックの場所はこちら

![ServiceCloudユーザ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/53eaa7aa-3d56-653a-87ab-2f070a988a1f.png)

ユーザ作成編集画面にあるので多くの人がなんだろう　と思ったはずです

結論としてはClassic環境でのみ使えるサービスコンソールを見せるor見せない　のための権限です


※参考ヘルプ

Salesforce Classic のサービスコンソールの設定
https://help.salesforce.com/s/articleView?id=sf.console2_setting_up_serviceconsole.htm&type=5


Classic環境のコンソールとはこのような画面が見えます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/9931a993-77ff-2520-06ef-e137f4a324f6.png)

Classicのコンソールの作り方はこちらです

Salesforce Classic の Salesforce コンソールアプリケーションの設定
https://help.salesforce.com/s/articleView?id=sf.console2_define_app.htm&type=5



「アプリケーション」から「新規」をクリックし

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/f4e38786-d16d-a0a9-9136-a463444521a0.png)

コンソールを選択しましょう

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/34aa757b-8a1d-f759-777f-1694d71764d2.png)


このようなClassicアプリケーションが作成可能です


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/1c623b8f-fd7b-9f6d-ce4b-46f691c6af51.png)

なおユーザの「Service Cloud ユーザー	」チェックを外した場合Classicのサービスコンソールを見ることができず

アクセス権がありません
アクセス権がないため要求を実行できません。データの所有者、またはシステム管理者にお問い合わせください。 詳細は、「「アクセス権がありません」エラー」を参照してください。

というエラーが表示されます


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/3bd624d3-1e8a-c30c-b102-1f9d7f93eaa7.png)



なお、Lightning環境の「サービスコンソール」の表示や非表示はユーザの「Service Cloud ユーザー」チェックの有無とは関係ないのでご注意ください

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531631/cae74ede-3e3f-0df3-7ec2-72ddea777fbd.png)

いかがでしたでしょうか

## 所感

ユーザ画面に堂々と「Service Cloud ユーザー	」とあるのでなにやら重要な機能のためのチェックボックスか？と思いきや実際はClassic環境でしか使えない？コンソールの表示や非表示をつかさどるものでLightning環境しか使わない環境であればあんまり関係無さそうでしたね。


## 終わりに

今後もこのような「Salesforceでよく見る設定だけど実際これなんだろう？」のようなものを調査し報告できればと思います。
yukicoder No.26 シャッフルゲーム　解説

[問題文](https://yukicoder.me/problems/no/26)

# 解説
問題文の通りに実装する問題。
$ans$という変数を用いる。
$ans$=今の段階で〇印がついているコップの番号
もし$ans=p_i$なら$ans$を$q_i$に変更する。
もし$ans=q_i$なら$ans$を$p_i$に変更する。
もし$ans$がそのどちらでもないならそのまま。
これを繰り返していけば解は求まる。

# C++での解法
```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int n,m,ans;cin>>n>>m;
  ans=n;
  vector<int> p(m),q(m);
  for(int i=0;i<m;i++)cin>>p[i]>>q[i];
  for(int i=0;i<m;i++){
    if(ans==p[i])ans=q[i];
    else if(ans==q[i])ans=p[i];
  }
  cout<<ans<<endl;
}
```
AWSのアカウント閉鎖は突然に

AWSを長年利用していると、アカウントが凍結したり、閉鎖したりすることもあると思います。

例えば
- 単純な未払い
- 暫定的に自分の名義で登録したAWSアカウントを使い納品した先が、しばらくしたら支払をやめていた
- S3にアップしていた画像がアダルト・児童ポルノ認定を受けた
- 適当に作ったメールサーバーが、迷惑メールの踏み台にされた
… etc.

「どうせ別のアカウントの話だから」と油断していたら、
運用中のサーバが午前３時に急に停止、メールを確認すると以下のようなメールが届いていました。ぱっと見フィッシングっぽいけど本物です。

<img width="300px" alt="IMG_3868.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41274/7c4d90dc-9793-9520-15f6-e2ea4039dc61.png">
<img width="300px" alt="IMG_3869.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41274/b7f8e13c-83ba-91e5-6143-7eac083da4c2.png">

要約すると、アカウントの利用者がブラックリストや不正利用等に該当していないかを確認するため
身分証明書をアップするようにとの指示ですが、
「このメールが届いた時点で既に」すべてのサーバーは停止し、マネージメントコンソールにもアクセス出来なくなっていました。そのため、急いでデータを避難しようとしても時は既に遅し。
なお、この対応の期限は **たったの２日後** なので、Mackerel / Datadogによる外形監視をしていなければ気付きませんでした。
三連休だったらメールに気付かない可能性もあるくらい、恐ろしくシビアです。

指示に従って身分証明書をアップロードしましたが、今回のケースでは、その数十分後にはアカウントは完全に停止されてしまいました。
<img width="300px" alt="IMG_3867.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41274/91c54eb7-79a2-a864-ff52-34b39a77df86.png">

AWS内でマルチリージョン等でバックアップを取っていても、アカウントごと即日閉鎖されてしまっては取り出しようがありません。AWS Backupだけで安心しきっていないでしょうか？
アダルト関係のデータを扱う場合や大量のメール送受信を扱う場合など、クラウドベンダーとの関係がシビアな場合は特に、アカウント閉鎖のリスクをきちんと考えた方がよさそうです。

GCPの話ですが、[海外の年金基金のGCPアカウントが「誤って削除」されてしまった事例](https://www.itmedia.co.jp/news/articles/2405/13/news090.html)もあるようです。こういったケースでは、マルチリージョンでのバックアップも無意味です。
単一のクラウドに依存せず、万が一のために**マルチクラウドでのバックアップを念の為行っておきましょう。**
Sybase DBで利用するコマンド

# 概要
今日はSybaseというデータベースで利用するコマンドのメモです。

# Sybaseとは
SAP Sybase Adaptive Server Enterprise (ASE) は、旧Sybase社の中核的な製品でありエンタープライズ級の用途向けの関係データベース管理システム (RDBMS) 製品であり、現在はヨーロッパ最大級のソフトウェア企業SAP社のRDBMS製品ラインナップの1つである。

※詳しい情報は以下のウィキペディアを参照してください。

https://ja.wikipedia.org/wiki/Adaptive_Server_Enterprise

# Sybaseコマンド一覧
下記のコマンドはInteractive SQLツールから実行するコマンドです。

●sp_help
選択されたDBに存在するテーブルの一覧が表示される。

●sp_help table_name
指定したテーブルの情報が表示される
＞テーブル構成
＞Index情報
＞その他

●sp_rename table_name1, tablen_name2
指定されたtable_name1からtable_name2にテーブル名を変更される

●sp_helprotect [tablename]
・テーブル名が指定されない場合、該当DBにあるすべてのテーブルごとにSELECT,INSERT,UPDATE,DELETE権限が付与されているか確認できる
・テーブル名が指定された場合は該当テーブルにSELECT,INSERT,UPDATE,DELETE権限が付与されているか確認できる

●sp_helpuser
DBで利用されているログインユーザ一覧とGroup_nameなどが表示される

●SQLの実行時間の計測確認
set statistics time on
set showplan on
上記の２つのコマンドからONにすると実行時間及びSQLの詳細内容が表示される

●sp_dba_who2
SQL実行リストが確認できる。負荷があるSQLの場合、このコマンドから確認ができる

●alter table tablename lock datarows
テーブルデータを行ロックの方式に変更するコマンド

●alter table tablename lock allpages
テーブルデータをページロックの方式に変更するコマンド

# コンソール上のコマンド

●ddlgen
ddlgen -U[loginid] -S[DB hostname] -TU -Ndbo.table_name -D[dbname] -P[loginpw] > table_name.ddl
上記のコマンドを入れるとテーブルのスキーマとINDEX、権限情報など指定されたファイルに出力される

# isqlコマンド
コマンドを利用するには.cshrcの環境設定に「set PATH」の指定が必要です。
通常Linux環境で指定しているパスの概念で指定すれば問題なく実行されます。

●isql -S[db hostname] -D [dbname] -W2000 -Jeucjis -U[loginid]
Linux環境でコンソール上にDBをログインする際に利用するコマンド

●isql -S[db hostname] -D [dbname] -W2000 -Jeucjis -U[loginid] -i[xxxx.tbl]
Linux環境でスキーマファイルを実行する際に[-i[filename.tbl, filename.idx, filename,grt]を指定してテーブルを作成に使うコマンド
※-wXXXX:バッファを指定する数字です。

# BCPコマンド
bcp [db_name]..[table_name] out/in [file_name].dat -S[db_host] -U[db_userid] -Jeucjis -b2000 -c -t \\t
テーブルのデータをDATファイル形式にエクスポート・インポートする際に利用するコマンド
out指定はテーブルデータを指定したファイルに保存するコマンド
in指定は指定したテーブルに該当ファイルのデータを登録するコマンド
yukicoder No.24 数当てゲーム　解説

[問題文](https://yukicoder.me/problems/no/24)

# 解説
いわれたとおりに素直に実装するタイプの問題。
まず、処理の都度残ったものの判定をする必要がある。
$ans_i$=解の選択肢に$i$が残っているか
$ans_i$=trueなら残っている
$ans_i$=falseなら残っていない
というものを作ろう。
今回は$R_i$で場合分けしよう。
・$R_i$がYESのとき
$A_i,b_i,c_i,d_i$**以外を**falseにする
・$R_i$がNOのとき
$A_i,b_i,c_i,d_i$**を**falseにする
これでただひとつtrueになったものを出力する。

# C++での解答例
```C++
#include <bits/stdc++.h>
using namespace std;

int main(){
  int n;cin>>n;
  vector<bool> ans(10,true);
  for(int i=0;i<n;i++){
    int a,b,c,d;string r;cin>>a>>b>>c>>d>>r;
    if(r=="YES")
      for(int j=0;j<10;j++){
        if(j==a||j==b||j==c||j==d)continue;
        ans[j]=false;
      }
    else{
      ans[a]=false;
      ans[b]=false;
      ans[c]=false;
      ans[d]=false;
    }
  }
  for(int i=0;i<10;i++)
    if(ans[i]){
      cout<<i<<endl;
      return 0;
    }
}
```
Blenderファイルのサムネイルを取得するには

## はじめに

Blenderファイルのサムネイルを取得する方法を検索すると、BlenderのPythonでファイルを開いてレンダリングする方法が出てきたりします。
実は、Blenderファイル自体がサムネイルを持っているので、レンダリングする必要はありません。

## サムネイルの設定

サムネイルの設定は、プリファレンスのセーブ＆ロードのBlendファイルのファイルプレビュータイプです。

![image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/bc797d4c-a098-b66e-61a2-f3d15b5ef57b.png)

「なし」を選んで保存したファイルからは、サムネイルが取得できないのでご注意ください。

## サムネイルを取得する準備

Pythonを使いますが、Blenderに付属するPythonを使う必要はありません。
次のように必要なものをインストールしてください。

```
pip install blender-asset-tracer pillow
```

## サムネールを取得してファイルに保存

`sample.blend`というBlenderファイルのサムネイルを取得して`thmbnail.png`に保存するには、次のようにします。

```python
import struct
from pathlib import Path
from PIL import Image
from blender_asset_tracer import blendfile

bf = blendfile.open_cached(Path("sample.blend"))
data = bf.find_blocks_from_code(b'TEST')[0].raw_data()
w, h = struct.unpack('>BxxxBxxx', data[:8])
image = Image.frombytes("RGBA", (w, h), data[8:])
image = image.transpose(Image.FLIP_TOP_BOTTOM)
image.save("thmbnail.png")
```

`transpose(Image.FLIP_TOP_BOTTOM)`は、画像の上下を反転させます。


Blender4.2のファイルを試した限りでは次のように取得できましたが、完全に理解しているわけではないので、環境によっては動かないかもしれません。

![thmbnail.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/13955/42bf8e63-8a0e-2521-b5d0-7addaed6977d.png)

以上
paizaの問題をPowerShellで解いてみた【名刺バインダー管理 (paizaランク B 相当)】

この記事はpaizaのプログラミング問題をPowerShellで解いてみようという試みの記事です。

## paizaのプログラミング問題とは？
ブラウザ上でコードを書いて実行できる、無料プログラミング練習問題集です。
1. 難易度別に問題を選ぶ
2. 問題文を読んで、解答コードを書く
3. 提出するとテストケースが実行されて結果をわかる
正解・不正解だけではなく、解答コード例や解説も見ることができるので、プログラミングの習得から復習まで活用できます

## こんな人におすすめ
- プログラミングスキルの腕試しをしたい方
- プログラミングのスキルアップしたい方
- 新しい言語にチャレンジをしたい方

###

通常は問題をc言語やJavaなどで解くのですがPowerShellで解いてみます。

## 問題
【殿堂入りキャンペーン】名刺バインダー管理 (paizaランク B 相当)

https://paiza.jp/works/mondai/b_rank_skillcheck_archive/name_card


#### 問題
あなたはこれまでに出会った人たちの名刺を集めています。
名刺は、複数枚のファイルを閉じることができるバインダーに保存されています。

1枚のファイルには、n個のポケットが横に並んでおり、表と裏の両面から名刺を眺めることができます。
このため、1つのポケットには、2枚の名刺が背中合わせに入っています。

各名刺には1から順に通し番号が付いているため、この番号の順に名刺を眺めることができるようにポケットに入っています。
1番からn番の名刺は、1枚目のファイルの表面から見たときに左詰めに並んでおり、
n+1番から2n番の名刺は、1枚目のファイルの裏面から見たときに左詰めに並んでいます。
2枚目以降のファイルにも同様に名刺が並んでいます。


入力: n m
出力: m番の名刺の裏側の番号



#### コード:
~~~
# 標準入力を読み込み、数値型に変換
$n, $m = (read-host).split()
$n = [int]$n
$m = [int]$m

# バインダーのページ番号を計算
$page=1
$tmp=($m - 1)
while($tmp -ge ($n * 2)){
	$tmp -= ($n * 2)
	$page+=1
}

# ページの最初と最後の名刺番号を計算
$page_last = $page * $n * 2
$page_first = $page_last - ($n * 2 - 1)

# 名刺の裏側の番号を計算
write-host ($page_first + $page_last - $m)

~~~


#### コードの説明:

1.標準入力を読み込み、数値型に変換:
~~~
$n, $m = (read-host).split()
$n = [int]$n
$m = [int]$m
~~~
- read-hostを使って標準入力から文字列を読み込みます
- split()で２つに分解して$n, $mに格納します
- $nと$mをint型に変換します

2.バインダーのページ番号を計算
~~~
$page=1
$tmp=($m - 1)
while($tmp -ge ($n * 2)){
	$tmp -= ($n * 2)
	$page+=1
}
~~~
- バインダーをめくってページを計算します

3.ページの最初と最後の名刺番号を計算
~~~
$page_last = $page * $n * 2
$page_first = $page_last - ($n * 2 - 1)
~~~
- ページ番号から名刺番号を計算によって求めます

4.名刺の裏側の番号を計算
~~~
write-host ($page_first + $page_last - $m)
~~~
- ページの最初と最後の名刺番号から$m番を引いて名刺裏の番号を計算してwrite-hostで出力します





### 終わりに
noteにPowerShellのサンプルコードの記事を書いています。そっちも見てね
[PowerShellまとめ](https://note.com/mahalo_/m/m421b17a881c8)

https://note.com/mahalo_/m/m421b17a881c8