OmniAICreator/Qiita-1.07M huggingface dataset:
[翻訳] ERC20Votes【Bunzzスマートコントラクトモジュール】

:::note info
本記事は下記の翻訳となります。
[『ERC20Votes Smart Contract Module in Bunzz』](https://blog.bunzz.dev/erc20votes-smart-contract-module-in-bunzz/)
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/8d767f6b-c0d3-06ca-5388-893b64315171.png)

ERC20Votes は、Compound のような投票とデリゲート(委任)をサポートするための ERC20 の拡張です。このバージョンは Compound よりも汎用性があり、トークンの供給量は 2²²⁴^ - 1 までサポートしていますが、ERC20VotesComp は 2^96^ - 1 に制限されています。

このモジュールとコードには、こちらからアクセスできます：https://bit.ly/40ircwI

### 使用方法

この拡張機能は、各アカウントの投票権の履歴 `checkpoints` を保持します。投票権は、 `delegate` 関数を直接呼び出すか、 `delegateBySig` と一緒に使用するための署名を提供することでデリゲートすることができます。

投票権は、公開アクセサー `getVotes` と `getPastVotes` を介してクエリできます。

デフォルトでは、トークンの残高には投票権が反映されません。これにより、転送が安くなります。

欠点は、投票権をアクティブ化し、投票権を追跡するために、ユーザーが自分自身にデリゲートする必要があるということです

## 関数

### #WRITE

- delegate
- approve
- increaseAllowance
- transfer
- permit
- transferFrom
- decreaseAllowance
- delegateBySig

### #READ

- name
- numCheckpoints
- balanceOf
- symbol
- totalSupply
- decimals
- delegates
- getPastVotes
- getVotes
- checkpoints
- DOMAIN_SEPARATOR
- getPastTotalSupply
- allowance
- nonces

このモジュールとコードには、こちらからアクセスできます：https://bit.ly/40ircwI

---

---

:::note info
【Bunzz とは】
Bunzz はアジア最大級の DApps 開発インフラを運営する、web3×LLM におけるリーディングカンパニーです。「公共財としてのスマートコントラクト」の実現に向けて、各種 web3 インフラやサービスを開発・提供しております。

【Our Projects】

- **[Smart Contract Hub | スマートコントラクトの Github](https://www.bunzz.dev/)**
- **[DeCipher | "Read me" for All of Contracts](https://www.bunzz.dev/decipher)**
- **[Bunzz for Enterprise | Tier1 の技術リソースを日本企業に提供](https://enterprise.bunzz.dev/ja)**
- **[Bunzz Audit | 透明かつ持続的なコントラクト監査の仕組みを実現](hhttps://www.bunzz.dev/audit)**

【Social Links】

- [X(旧 Twitter))](https://twitter.com/BunzzDev)
- [Discord Community](https://t.co/6hHgssJdvW)
- [Youtube](https://www.youtube.com/@bunzzdev)
- [Instagram](https://www.instagram.com/bunzzdev/)

【お問合せ】
web3 開発・コンサルティングのご相談はこちらから 👉[Google Form](https://forms.gle/4tgQjWSw2MMMZW6E6)
:::

:::note info
Bunzz R&D エンジニア荒牧さんの著書[『スマートコントラクトの仕組みと法律』](https://amzn.to/3V03sNH)が好評発売中です 📕
<a href="https://amzn.to/3V03sNH" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">
<img
    src="https://m.media-amazon.com/images/I/81wopoZ1K4L._SY522_.jpg"
    alt="『スマートコントラクトの仕組みと法律』（中央経済グループパブリッシング）"
    width="200px"
    height="auto"
    Style="border: 0px;"
  />
</a>
:::
[翻訳] ERC1155D【Bunzzスマートコントラクトモジュール】

:::note info
本記事は下記の翻訳となります。
[『ERC1155D Smart Contract Module in Bunzz』](https://blog.bunzz.dev/erc1155d-smart-contract-module-in-bunzz/)
:::
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/faa6573e-3dd7-9850-488f-09701c8f3806.png)

ERC1155D モジュールは、ガス効率の良い NFT コントラクトであり、ERC721 の代替となります。これは 1/1 の NFT（供給数が 1）にのみ使用することを意図しており、供給数が 1 より大きいトークンはサポートしていません。

このモジュールは、ERC1155 と完全に後方互換性があり、仕様に従う場合に高いガスコストの問題はありません。ERC1155 トークンをスワップする中央集権的または非中央集権的な取引所を壊すことはありません。

その利点の中には、次のものがあります：

仕様に干渉せずに ERC1155 プロトコルを拡張するための有用な関数があります。
OpenZeppelin の ERC1155 よりもマイニングと転送のガスコストが低いです。
完全に非代替可能であり、ERC721 およびその派生バージョンの適切な代替品です。
ERC721 slim や ERC721A などの高度に最適化されたものを含め、他のどのコントラクトよりもガス効率が優れています。
このモジュールとコードには、こちらからアクセスできます：https://bit.ly/42gmxwN

### 使用方法

プロジェクトで ERC1155D スマートコントラクトモジュールを使用するには、contracts/ERC1155D.sol をプロジェクトにコピーします。

次に、それをインポートし、コントラクトを ERC1155 として拡張する実装を書きます。

注意：ERC1155D は tokenID の列挙を維持しません。コントラクト内でカウンターを実装する必要があります。

## 関数

### #書き込み

- safeBatchTransferFrom
- safeTransferFrom
- setApprovalForAll

### #読み取り

- MAX_SUPPLY
- balanceOf
- balanceOfBatch
- getERC721BalanceOffChain
- getOwnershipRecordOffChain
- isApprovedForAll
- ownerOfERC721Like
- supportsInterface
- uri
  このモジュールとコードには、こちらからアクセスできます：https://bit.ly/42gmxwN

---

---

:::note info
【Bunzz とは】
Bunzz はアジア最大級の DApps 開発インフラを運営する、web3×LLM におけるリーディングカンパニーです。「公共財としてのスマートコントラクト」の実現に向けて、各種 web3 インフラやサービスを開発・提供しております。

【Our Projects】

- **[Smart Contract Hub | スマートコントラクトの Github](https://www.bunzz.dev/)**
- **[DeCipher | "Read me" for All of Contracts](https://www.bunzz.dev/decipher)**
- **[Bunzz for Enterprise | Tier1 の技術リソースを日本企業に提供](https://enterprise.bunzz.dev/ja)**
- **[Bunzz Audit | 透明かつ持続的なコントラクト監査の仕組みを実現](hhttps://www.bunzz.dev/audit)**

【Social Links】

- [X(旧 Twitter))](https://twitter.com/BunzzDev)
- [Discord Community](https://t.co/6hHgssJdvW)
- [Youtube](https://www.youtube.com/@bunzzdev)
- [Instagram](https://www.instagram.com/bunzzdev/)

【お問合せ】
web3 開発・コンサルティングのご相談はこちらから 👉[Google Form](https://forms.gle/4tgQjWSw2MMMZW6E6)
:::

:::note info
Bunzz R&D エンジニア荒牧さんの著書[『スマートコントラクトの仕組みと法律』](https://amzn.to/3V03sNH)が好評発売中です 📕
<a href="https://amzn.to/3V03sNH" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">
<img
    src="https://m.media-amazon.com/images/I/81wopoZ1K4L._SY522_.jpg"
    alt="『スマートコントラクトの仕組みと法律』（中央経済グループパブリッシング）"
    width="200px"
    height="auto"
    Style="border: 0px;"
  />
</a>
:::
[翻訳] StakingRewards【Bunzzスマートコントラクトモジュール】

:::note info
本記事は下記の翻訳となります。
[『StakingRewards Smart Contract Module in Bunzz
』](https://blog.bunzz.dev/stakingrewards-smart-contract-module-in-bunzz/)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/d5f47179-8b0a-0bf1-436c-98d96c55e0b7.png)

StakingRewards コントラクトは、一定期間トークンをステーキングし、ステーキングしたシェアに応じて報酬を受け取ることができます。つまり、ERC20 トークンをステーキングすることで、より多くの ERC20 トークンを報酬として受け取ることができます。

このモジュールとコードには、[https://bit.ly/3zzyocs](https://bit.ly/3zzyocs)からアクセスできます。

### 使用方法

1. ステーキングトークン、報酬トークンのアドレス、報酬期間を準備します。
2. オーナーが報酬トークンを資金提供します。
3. ユーザーはステーキングトークンをステークすることができ、報酬額はシェアによって計算されます。
4. ユーザーは必要に応じてトークンをアンステークしたり、ステーキングを終了したりすることができます。
5. ユーザーはいつでも報酬を請求することができます。
6. オーナーは報酬期間が終了した後に再び資金提供することができます。

### 関数

**#書き込み**

- recoverERC20
- renounceOwnership
- setRewardsDuration
- stake
- transferOwnership
- unstake
- claim
- exit
- fund

**#読み取り**

- balanceOf
- earned
- lastTimeRewardApplicable
- lastUpdateTime
- owner
- paused
- periodFinish
- rewardPerToken
- rewardPerTokenStored
- rewardRate
- rewards
- rewardsDuration
- rewardsToken
- stakingToken
- getRewardForDuration
- userRewardPerTokenPaid

このモジュールとコードには、[https://bit.ly/3zzyocs](https://bit.ly/3zzyocs)からアクセスできます。

---

---

:::note info
【Bunzz とは】
Bunzz はアジア最大級の DApps 開発インフラを運営する、web3×LLM におけるリーディングカンパニーです。「公共財としてのスマートコントラクト」の実現に向けて、各種 web3 インフラやサービスを開発・提供しております。

【Our Projects】

- **[Smart Contract Hub | スマートコントラクトの Github](https://www.bunzz.dev/)**
- **[DeCipher | "Read me" for All of Contracts](https://www.bunzz.dev/decipher)**
- **[Bunzz for Enterprise | Tier1 の技術リソースを日本企業に提供](https://enterprise.bunzz.dev/ja)**
- **[Bunzz Audit | 透明かつ持続的なコントラクト監査の仕組みを実現](hhttps://www.bunzz.dev/audit)**

【Social Links】

- [X(旧 Twitter))](https://twitter.com/BunzzDev)
- [Discord Community](https://t.co/6hHgssJdvW)
- [Youtube](https://www.youtube.com/@bunzzdev)
- [Instagram](https://www.instagram.com/bunzzdev/)

【お問合せ】
web3 開発・コンサルティングのご相談はこちらから 👉[Google Form](https://forms.gle/4tgQjWSw2MMMZW6E6)
:::

:::note info
Bunzz R&D エンジニア荒牧さんの著書[『スマートコントラクトの仕組みと法律』](https://amzn.to/3V03sNH)が好評発売中です 📕
<a href="https://amzn.to/3V03sNH" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">
<img
    src="https://m.media-amazon.com/images/I/81wopoZ1K4L._SY522_.jpg"
    alt="『スマートコントラクトの仕組みと法律』（中央経済グループパブリッシング）"
    width="200px"
    height="auto"
    Style="border: 0px;"
  />
</a>
:::
[翻訳] Staking ERC721【Bunzzスマートコントラクトモジュール】

:::note info
本記事は下記の翻訳となります。
[『Staking ERC721 Smart Contract Module in Bunzz』](https://blog.bunzz.dev/stakingerc721-smart-contract-module-in-bunzz/)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/79bd1154-0374-78a5-357e-cae3fc074fe9.png)

StakingERC721 は、ERC20 で報酬を得ることができるステーキング契約です。

このリポジトリには、任意の ERC721 互換 NFT を使用したファーミングのための契約が含まれています。

指定された ERC-721 は、通常の ERC-20 トークンの代わりに ERC-721 を使用する ERC721Staking 契約に預け入れ/ロックすることで、任意の ERC-20 互換トークンをファームするために使用することができます。NFT の所有者はいつでも NFT をステークまたはアンステークすることができます。

このモジュールとコードには、[https://bit.ly/3MzgnCH](https://bit.ly/3MzgnCH)からアクセスできます。

### Staking ERC721 の使用方法

1. ステーキングトークン（ERC721）、報酬トークン（ERC20）のアドレス、および報酬期間を準備します
2. オーナーが報酬トークンを資金提供します
3. ユーザーはステーキングトークンをステークすることができます。報酬額はシェアによって計算されます
4. ユーザーは必要に応じてトークンをアンステークしたり、ステーキングを終了したりすることができます
5. ユーザーはいつでも報酬を請求することができます
6. オーナーは報酬期間が終了した後に再度資金提供することができます

### 関数

**#書き込み**

- claim
- fund
- onERC721Received
- renounceOwnership
- setPaused
- setRewardsDuration
- stake
- unstake
- recoverERC20
- transferOwnership
- exit

#読み取り

- balanceOf
- balances
- earned
- getRewardForDuration
- lastTimeRewardApplicable
- lastUpdateTime
- owner
- paused
- periodFinish
- rewardPerToken
- rewardPerTokenStored
- rewardRate
- rewards
- rewardsDuration
- rewardsToken
- stakedAssets
- stakingToken
- totalSupply
- userRewardPerTokenPaid

このモジュールとコードには、[https://bit.ly/3MzgnCH](https://bit.ly/3MzgnCH)からアクセスできます。

---

---

:::note info
【Bunzz とは】
Bunzz はアジア最大級の DApps 開発インフラを運営する、web3×LLM におけるリーディングカンパニーです。「公共財としてのスマートコントラクト」の実現に向けて、各種 web3 インフラやサービスを開発・提供しております。

【Our Projects】

- **[Smart Contract Hub | スマートコントラクトの Github](https://www.bunzz.dev/)**
- **[DeCipher | "Read me" for All of Contracts](https://www.bunzz.dev/decipher)**
- **[Bunzz for Enterprise | Tier1 の技術リソースを日本企業に提供](https://enterprise.bunzz.dev/ja)**
- **[Bunzz Audit | 透明かつ持続的なコントラクト監査の仕組みを実現](hhttps://www.bunzz.dev/audit)**

【Social Links】

- [X(旧 Twitter))](https://twitter.com/BunzzDev)
- [Discord Community](https://t.co/6hHgssJdvW)
- [Youtube](https://www.youtube.com/@bunzzdev)
- [Instagram](https://www.instagram.com/bunzzdev/)

【お問合せ】
web3 開発・コンサルティングのご相談はこちらから 👉[Google Form](https://forms.gle/4tgQjWSw2MMMZW6E6)
:::

:::note info
Bunzz R&D エンジニア荒牧さんの著書[『スマートコントラクトの仕組みと法律』](https://amzn.to/3V03sNH)が好評発売中です 📕
<a href="https://amzn.to/3V03sNH" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">
<img
    src="https://m.media-amazon.com/images/I/81wopoZ1K4L._SY522_.jpg"
    alt="『スマートコントラクトの仕組みと法律』（中央経済グループパブリッシング）"
    width="200px"
    height="auto"
    Style="border: 0px;"
  />
</a>
:::
[翻訳] ERC721 LazyMint 【Bunzzスマートコントラクトモジュール】

:::note info
本記事は下記の翻訳となります。
[『ERC721A Smart Contract Module in Bunzz』](https://blog.bunzz.dev/erc721a-smart-contract-module-in-bunzz/)
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1926720/20dc9d02-e20e-c0c0-bc95-6efe1b54d303.png)

ERC721A モジュールは、ERC721 NFT 標準の変更版であり、内部の変更を追加してシリアル化された一括ミントを大幅に最適化しますが、ERC721 が使用するすべての外部関数を保持し、サードパーティのアプリケーションが相互に操作できるようにします。

このモジュールとコードには、こちらからアクセスできます：https://bit.ly/3LaBDOv

ERC721A モジュールを使用すると、ユーザーは次のことができます：

- 1 つのトランザクションで複数の NFT をミントできます。
- オーナーが 2⁶⁴-1（uint64 の最大値）を超える供給を持つことはできないものとします。
- シリアルは`_startTokenId()`から順次ミントされ、デフォルトは 0 です（例：0、1、2、3...）。

## 使い方

ERC721A の目標は、1 つのトランザクションで複数の NFT をミントする際に、著しくガスを節約する完全に準拠した実装を提供することです。

インストール後、ライブラリ内のコントラクトをインポートして使用できます：

```
pragma solidity ^0.8.4; // Minimum solidity version is 0.8.4

contract ERC721ATest is ERC721A {
    constructor() ERC721A("ERC721ATest", "Test") {}

    function mint(uint256 quantity) external payable {
        // `_mint`'s second argument now takes in a `quantity`, not a `tokenId`.
        _mint(msg.sender, quantity);
    }
}
```

### 関数

**#WRITE**

- transferOwnership
- renounceOwnership
- approve
- safeTransferFrom
- safeTransferFrom
- setApprovalForAll
- transferFrom

**#READ**

- getApproved
- ownerOf
- supportsInterface
- symbol
- tokenURI
- totalSupply
- balanceOf
- isApprovedForAll
- name
- owner

このモジュールとコードには、こちらからアクセスできます：https://bit.ly/3DBUVrv

---

---

:::note info
【Bunzz とは】
Bunzz はアジア最大級の DApps 開発インフラを運営する、web3×LLM におけるリーディングカンパニーです。「公共財としてのスマートコントラクト」の実現に向けて、各種 web3 インフラやサービスを開発・提供しております。

【Our Projects】

- **[Smart Contract Hub | スマートコントラクトの Github](https://www.bunzz.dev/)**
- **[DeCipher | "Read me" for All of Contracts](https://www.bunzz.dev/decipher)**
- **[Bunzz for Enterprise | Tier1 の技術リソースを日本企業に提供](https://enterprise.bunzz.dev/ja)**
- **[Bunzz Audit | 透明かつ持続的なコントラクト監査の仕組みを実現](hhttps://www.bunzz.dev/audit)**

【Social Links】

- [X(旧 Twitter))](https://twitter.com/BunzzDev)
- [Discord Community](https://t.co/6hHgssJdvW)
- [Youtube](https://www.youtube.com/@bunzzdev)
- [Instagram](https://www.instagram.com/bunzzdev/)

【お問合せ】
web3 開発・コンサルティングのご相談はこちらから 👉[Google Form](https://forms.gle/4tgQjWSw2MMMZW6E6)
:::

:::note info
Bunzz R&D エンジニア荒牧さんの著書[『スマートコントラクトの仕組みと法律』](https://amzn.to/3V03sNH)が好評発売中です 📕
<a href="https://amzn.to/3V03sNH" rel="nofollow" referrerpolicy="no-referrer-when-downgrade">
<img
    src="https://m.media-amazon.com/images/I/81wopoZ1K4L._SY522_.jpg"
    alt="『スマートコントラクトの仕組みと法律』（中央経済グループパブリッシング）"
    width="200px"
    height="auto"
    Style="border: 0px;"
  />
</a>
:::
【visionOS】RealityKitを使用して3Dモデルに複数のアニメーションを再生する方法

本記事では、RealityKitを使用して3Dモデルに複数のアニメーションを再生する方法を紹介します。
(※技適特例届け出済み)

## デモ

![画面収録 2024-05-15 13.12.23.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1042576/141b0c6e-4120-13ed-2418-fdb3fd4dcc1f.gif)

## 方法

複数のアニメーションを再生させる方法は、以下のように述べられています

![スクリーンショット 2024-05-15 14.16.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1042576/6b88e768-5cb1-5dfb-1fae-efa95a06c9dd.png)


> The first way is to have one USD file per clip. We can load each USD as an entity and get its animations as AnimationResources. The AnimationResource can then be played on any entity, as long as the names of the joints in its skeleton match the animation.

これは、各アニメーションクリップを個別のUSDファイルとして用意し、それぞれをエンティティとしてロードし、そのアニメーションをAnimationResourceとして取得する方法です。AnimationResourceは、スケルトンのジョイント名が一致する限り、任意のエンティティで再生できます。

引用: [Dive into RealityKit 2 - WWDC2021](https://developer.apple.com/videos/play/wwdc2021/10074/)

この方法に従い、以下のステップで実装を進めます。

## 実装手順

#### 1. USDファイルの準備
各アニメーションクリップを個別のUSDファイルに保存します。アニメーションを適用させたUSDファイルを準備する方法は[こちらの記事](https://qiita.com/1-eyeddd/items/758305fe8cca1937035c)に記載しています。

#### 2. アニメーションリソースのロード
クリップごとにUSDファイルをロードし、エンティティとして取得します。

#### 3. AnimationResourceの作成
エンティティのアニメーションをAnimationResourceとして取得します。

#### 4. アニメーションの再生
必要なエンティティに対して、取得したAnimationResourceを設定し、再生します。

#### コード例

```swift
struct ImmersiveView: View {
    
    @State var animationResource: [AnimationResource] = []
    @State var death = try! Entity.loadModel(named: "death")
    
    var body: some View {
        RealityView { content in
            do {
                if let entity = try? await ModelEntity(named: "scream") {
                    entity.collision = await CollisionComponent(shapes: [try ShapeResource.generateConvex(from: entity.model!.mesh)])
                    entity.components.set(InputTargetComponent())
                    entity.playAnimation(entity.availableAnimations[0].repeat())
                    content.add(entity)
                }
            } catch {
                print("Error loading model or setting up entity: \(error)")
            }
        }
        .onAppear {
            animationResource.append(death.availableAnimations[0])
        }
        .gesture(tapGesture)
        
    }
    
    private var tapGesture: some Gesture {
        TapGesture()
            .targetedToAnyEntity()
            .onEnded { value in
                value.entity.playAnimation(animationResource[0], transitionDuration: 0.05)
            }
    }
}
```

上記のコードでは、タップジェスチャーが検出されたときに、ModelEntityに対して指定されたAnimationResourceを再生します。

## 応用

Vision Proの位置に応じて3Dモデルを自分の方向に移動させ、イベントが発生したタイミングでさまざまなアニメーションを再生することで、よりゲームっぽくなります。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1042576/0602f65f-3620-f946-6411-aec445d5af1f.gif" width=100%>


## 参考資料

https://stackoverflow.com/questions/76599901/how-to-use-multiple-animations-on-a-usdz-model-with-realitykit/76600896#76600896

https://stackoverflow.com/questions/63672309/realitykit-playing-multiple-animations-in-usdz-file

https://developer.apple.com/videos/play/wwdc2021/10074/

https://note.com/npaka/n/n96b549879161
MMdetectionの環境構築

公式の通りではうまくいかなかったので記録

#### 環境
Windows11
RTX 3060Ti
CUDA11.8


https://mmdetection.readthedocs.io/en/latest/get_started.html

公式を見ながらインストール開始

#### 仮想環境作成
コマンドプロンプトを起動して
Python3.8で仮想環境作成
```
conda create --name openmmlab python=3.8 -y
conda activate openmmlab
```


#### torchインストール
```
conda install pytorch torchvision -c pytorch
```
↑このコマンドに不安を覚えつつ実行

確認してみる
```
python
>>> import torch
>>> torch.cuda.is_available()
False
```
やはりダメ

torchのversionを確認
```
>>> torch.__version__
'1.13.1
```
結構古め

なので
https://pytorch.org/get-started/previous-versions/
previous versionを参考に以下を実行

```
conda install pytorch==1.13.1 torchvision==0.14.1 torchaudio==0.13.1 pytorch-cuda=11.7 -c pytorch -c nvidia
```
確認してみる
```
python
>>> import torch
>>> torch.cuda.is_available()
False
```
またしてもダメ

3度目の正直
```
pip install torch==1.13.1+cu117 torchvision==0.14.1+cu117 torchaudio==0.13.1 --extra-index-url https://download.pytorch.org/whl/cu117
```
確認してみる
```
python
>>> import torch
>>> torch.cuda.is_available()
True
```
いけました！

PCのCUDAのversionは11.8なのですがtorch1.13.1はcuda11.7までしか対応していない模様…

### mmengineとmmcvインストール
```
pip install -U openmim
mim install mmengine
```
公式ではこのあと
mim install "mmcv>=2.0.0"
ですが…
エラーが出ます
```AssertionError: MMCV==2.2.0 is used but incompatible. Please install mmcv>=2.0.0rc4, <2.2.0.```

↓バージョンが気に食わないそうなのでこちらを実行
```
mim install "mmcv<2.2.0" 
```

### mmdetectionインストール
```
git clone https://github.com/open-mmlab/mmdetection.git
cd mmdetection
pip install -v -e .
```
確認をば
```
python
>>> import mmdet
```
エラーが出なければOK


### インストール確認
jupyter labをインストール

- rtmdet_tiny_8xb32-300e_coco.py
- rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth
をダウンロードするため以下のコマンドを実行
```
mim download mmdet --config rtmdet_tiny_8xb32-300e_coco --dest .
```
以下のコードで実行確認
```check.py
from mmdet.apis import init_detector, inference_detector

config_file = 'rtmdet_tiny_8xb32-300e_coco.py'
checkpoint_file = 'rtmdet_tiny_8xb32-300e_coco_20220902_112414-78e30dcc.pth'
model = init_detector(config_file, checkpoint_file, device='cuda')  # or device='cuda:0'
inference_detector(model, 'demo/demo.jpg')
```

※CUDAは11.8のままでも動く模様
### 完了！！
UnityのC#で実装時に「InvalidOperationException: Collection was modified」エラーが出た時は

## 背景

配列の操作を実装していたらこんなエラーが出た

```
InvalidOperationException: Collection was modified; enumeration operation may not execute.
```

おや？

やっていることは

```
foreach (型 data in dataList)
{
    〜
    if (条件)
    {
         dataList.Remove(data);
    }
}
```

のような処理である。


ググってみると「ループ内で要素・行を追加また削除すると発生します」とのことらしい。

## 解決法

以下のように対応

```
List<型> tmpDataList = new List<型>(dataList);

foreach (型 data in tmpDataList)
{
    〜
    if (条件)
    {
         dataList.Remove(data);
    }
}
```

これで解決！
JUST.DB 構築ルールヒント集

## 統一感項目

### 1. 業務プレート
行ごとに利用者を分ける

### 2. 色、アイコン
検索系　：グレー
登録系：オレンジ
承認系：グリーン
全社KPI系：ブルー
部門KPI：イエロー
取引先、PJ管理　：パープル
管理本部系：ピンク
マスター：グレー

### 3. 名称付与ルール
+ 業務プレート
例｜NO｜目的｜プレート名、NO：シーケンス番号
目的：営業、管理者、登録、KPI、マスター。。。
 プレート名：メニューへのプレート配置数を考慮。長すぎると見えなくなる。
　
+ パネル
NO｜パネル名
NOは業務プレートと合わせる、パネル名は自由
例）01｜活動登録、02｜見積作成、31｜事業部別活動KPI
例外）
パネル間連携用の検索パネル：* 検索｜＊＊＊テーブル
業務｜テーブル名（マスター系：マスター、トランザクション系：トラン）
例　営業｜活動トラン、人事｜社員マスター
　
+ フィルター
並び順だけ利用の場合は↑↓を明
　
+ 採番フィールド
各データテーブルに自動採番フィールドを作成する　名称はxxxxNoで統一
　
+ 検索用パネル
ツールバーから不要なアイコンを削除して統一する。
一覧でダブルクリックした時に保存ボタンが表示されないように設定する。
パネル設定→ツールバー設定→ダブルクリック操作を閲覧にする。
　
+ 権限設定
パネル、データテーブル、フィルター作成時に公開設定タブの権限付与を忘れずに行う環境構築時
グループ設定（運用管理画面→グループ管理）
例　開発Ｇ：パネルやデータを作成・更新するユーザーを参加させる
メール通知G：パネルから自動通知させる場合のユーザーを参加させる
　
+ データテーブルの作成
パネル構築時において、新規テーブル作成時には先にこちらを設定
検索のパネル等の場合には、閲覧のみのにする。
例　開発権限　　　　　ユーザー：開発Ｇ データテーブル：閲覧/編集パネル作成/レコード作成　レコード:閲覧/編集/削除　
　ユーザー権限　　　ユーザー：すべてのユーザー　データテーブル：閲覧/レコード作成　レコード:閲覧/編集/削除
　
+ パネル作成
データベースに更新するパネルの場合は、基本データベースの権限を継承するにチェックをする。
公開設定（パネルの基本設定→公開設定）
例）開発権限　　　ユーザー：開発Ｇ　アクセス権：閲覧/編集/フィルター作成　
ユーザー権限　　　ユーザー：全てのユーザー　アクセス権：閲覧/フィルター作成
　
+ フィルター作成
公開設定タブで、パネルに対するアクセス権を検証するにチェックを入れる。　
※弊社デモ環境の場合は、パネル構築時及びデータテーブルの設定時に、すべてのユーザーに対してALL権限を付与する。
　
+ 一覧・単票パネル一覧の表示件数は100件にする。
　
+ 数値、金額フィールド
桁区切りを有効にする。
　
+ 見出しフィールド
フィールド強調表示設定から、背景色を設定する。
　
+ ドロップダウンフィールド
数値タイプを使用する。
ラベルには表示名を入力し、値には並び順を意識した数値を入力する。
　
+ ユーザーフィールド(単数, 複数)
従業員マスタ以外では基本的に使用しない。
ユーザー情報を登録する場合は、従業員マスタからルックアップで取得したものを登録する。
Java Sliverに合格しました

# 初めに
この記事は初心者視点での説明になります。正確性に欠ける可能性がございますが、ご了承ください。明らな誤りがありましたら、ご指摘くださると幸いです。

## きっかけ
Javaを使用した開発案件に入りたいと思い、転職活動の準備を兼ねて資格取得に向けた学習を始めました。あとかっちりした言語を学びたいと思いJavaを少し齧ったところ、オブジェクト指向楽しい！となったので。

## 学習期間
4月末から学習を始め、5月13日に受験しました。
期間としては2週間と少し、勉強時間は100時間弱だと思います。かなり詰め込み学習になってしまったので、余裕がある方は2ヶ月くらいを想定するといいと思います。

## 使用した教材
まずは基礎固めのためスッキリわかるJava入門を1周しました。書籍で紹介されているWeb上のエディタ環境は動作が重めなので、余裕があれば自分のPC上に環境構築することをお勧めします。

自分は他の言語の学習経験があったのでサクサク進んだのですが、全くのプログラミング初心者ですと難しい部分も多いと思います。深く考えず、5割くらいの理解で進めても大丈夫です。

https://book.impress.co.jp/books/1123101044

さらに理解不足な点や浅い理解になっている部分を埋めるために以下の動画教材を試聴しました。Java講座を1.5倍速で流して、挙動が気になった部分はエディタで動作確認しました。

https://www.youtube.com/@SekaChan

次に有名な黒本です。Chap1~11が基礎問題、Chap12,13が実際の試験を想定した問題になります。自分は以下の流れで進めました。

1. Chap1~11を3周
1. Chap12,13を2周
1. 苦手分野の洗い出し、書籍や動画教材で再度学習
1. Chap12,13の3周目
1. Chap1~14の4周目

自分が気をつけていたのは1周目は気楽にわからない問題はすぐに答えを見る、ということです。また解答の説明も始めは理解できないものもあると思うので、これも100%の理解を目指さずにサクサク進めましょう。

Chap12,13は実際の試験にそのまま出てくる問題も多いです。何度も繰り返して、解答の理由を口頭で説明できるレベルまで上げていきましょう。

https://book.impress.co.jp/books/1118101186

問題を解くのに疲れた時は動画教材で休憩していました。書籍では理解しにくい部分や細かい知識まで説明してくれているので、時間があれば目を通すと良いかと思います。

https://www.youtube.com/@java9521

## 試験当日

私が受験した会場は試験の日程が朝9時からの枠しかなく、朝に弱い自分的には辛かったです。
試験会場付近で2時間ほど学習し、試験に挑みました。Chap13から出る問題が多いとの噂を聞いていたので、ここを中心に軽く流す感じです。

## 試験結果

78%で合格しました！
80%は届くかと思っていたので少し悔しいですが、受かったのでよしです。

## 最後に
実際の試験は黒本を少し優しくしたレベル感の問題なので、黒本を完璧にすれば試験当日焦ることもなさそうです。次は基本情報勉強しようと思います。
Arduinoでぬるぬる動かしたい

# MotionPath - 時間拘束型S字加減速運動軌跡<br>Time-constrained S-curve motion path

## 概要
MothionPathは、指定した位置に、指定した **時間** で、ジャークが考慮されたS字加減速を行いながら到達する、「軌跡」を計算するライブラリです。
移動距離の違う複数の軸に対し、適切な時間を指定することにより、複数の軸を同期して動作させることができます。

## 適用例
軸1をx、軸2をyに見立て、xを544->2400まで、yを544->1800まで、両軸ともに0.7secで移動させた例です。<br>

![t-v_plotting_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082015/b2a508bb-7c1b-b61c-e2f5-3aebdffc83b0.png)

![x-y_plotting_01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1082015/c3fbc8fb-5b67-79c7-bdec-5e5ddff37568.png)

## 使用方法
以下から入手。
[MotionPath - GitHub](https://github.com/hrbm-smy/MotionPath.git)
### (Arduinoで使う場合)
Arduinoで使用する場合は、**BOMを削除して** ご使用ください。(コンパイルエラーになる)
Cソースコードでの提供(MIT)となるので、[Arduino開発、ファイルを分割してC/C++で書く、VSCode](https://qiita.com/somehiro/items/6a6d954be159b6a5fccd)を参考に、組み込んでください。

## 動機
本年度の技術課題目標を設定するにあたり、やはり何か **動かしたい**。
通信だけとか、見えないものだとやはりちょっとつまらない。
で、以下を買ったが
[Freenove Quadruped Robot Kit(FNK0030)](https://www.amazon.co.jp/Freenove-FNK0030-%E3%83%AA%E3%83%A2%E3%83%BC%E3%83%88%E3%81%A7%E5%9B%9B%E8%B6%B3%E3%83%AD%E3%83%9C%E3%83%83%E3%83%88%E3%82%AD%E3%83%83%E3%83%88%EF%BC%88Arduino-IDE%E3%81%A8%E4%BA%92%E6%8F%9B%E6%80%A7%E3%81%82%E3%82%8A%EF%BC%89%E3%80%81%E3%82%A2%E3%83%97%E3%83%AA%E3%81%AE%E3%83%AA%E3%83%A2%E3%82%B3%E3%83%B3%E3%80%81%E3%82%A6%E3%82%A9%E3%83%BC%E3%82%AD%E3%83%B3%E3%82%B0%E3%82%AF%E3%83%AD%E3%83%BC%E3%83%AB%E3%83%84%E3%82%A4%E3%82%B9%E3%83%88%E3%82%B5%E3%83%BC%E3%83%9CSTEM%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88/dp/B08DXH6Q8X?ref_=ast_sto_dp&th=1)
組み立ててサンプルプログラム動かすだけじゃ、要するにただの **遊び**。何か付加価値が必要である。
で、ちょっと中身を見てみると、ある位置に動けって軸ごとに制御してるだけで、どうやら加減速制御してないし、軸間の同期もなさそう。
ものすごい昔の話だが、S字制御の知見もいくらかあるし、やってみるか。

実際に動かしたところ、どうやら **サーボモーター側で加減速制御している** 節が見受けられるが、良い子のみんなはここに突っ込んではいけない。 **絶対だぞ！約束な！**

ていうか20msec程度の解像度じゃ、たいしてぬるった感じがしない。:frowning2:

…続く。(たぶん)
kintone ナビゲーションに開発環境を表示

kintone の本番環境と開発環境の識別のため、ナビゲーションに"開発環境"を表示してみます。

# 概要

kintone の本番環境と開発環境の識別のため、ナビゲーションに"開発環境"を表示
画面をスクロールしても、表示が残ります。
ただし管理画面には、"開発環境"が表示されません。
kintone 全体のカスタマイズで、css を指定します。

ヘッダーの色を本番環境と開発環境で、変えることも有効です。

- ポータル
![2024-05-15_12h50_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/d9974500-032d-0e78-4702-99e4e38e241b.png)

- アプリ画面
![2024-05-15_12h50_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/06015cf0-e43a-1a59-cb2d-5d76fc13904a.png)

- アプリ管理画面には、"開発環境"が表示されない
![2024-05-15_12h54_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/111ce3b6-ee0f-7ef3-2eea-ab9e05ca809d.png)

# kintone 全体のカスタマイズ

kintone システム管理からJavaScript / CSSでカスタマイズを指定します。
文字・サイズ・色などをカスタマイズしてください。

![2024-05-15_12h55_38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/937a6da7-1b50-395e-f84c-54cc8c7312ef.png)

```.css
#header-global-navigation-root nav>div:first-child>ul::after {
    content: "開発環境";
    color: #c97171;
    font-size: 28px;
    font-weight: bold;
    margin-left: 6px;
}
```

# ヘッダーの色

kintone システム管理からヘッダーの色を指定します。

![2024-05-15_13h00_22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/100572/b6e92f06-3b2e-3c15-9f3a-16f673ff174f.png)
Windows11でロック画面に出てくる天気とかを無効に

# やり方

『設定』 ⇒ 『個人用設定』 ⇒ 『ロック画面の状態』を『なし』。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/706116/9225ee3e-b59f-6b9f-5374-c0fc747f571f.png)

# 参考サイトさん

https://kantanmusen.sakura.ne.jp/cn927.oak/92_037.htm#:~:text=%E3%83%AD%E3%83%83%E3%82%AF%E7%94%BB%E9%9D%A2%E3%81%AE%20%EF%BD%A2%E5%A4%A9%E6%B0%97%E3%82%AB%E3%83%BC%E3%83%89,%E3%83%AD%E3%83%83%E3%82%AF%E7%94%BB%E9%9D%A2%EF%BD%A3%20%E8%A8%AD%E5%AE%9A%E7%94%BB%E9%9D%A2%E3%81%A7%E3%81%99%E3%80%82&text=%E3%81%AE%E9%A0%86%E3%81%AB%E9%81%B8%E6%8A%9E%E3%81%97%E3%81%A6%E3%81%8F%E3%81%A0%E3%81%95%E3%81%84%E3%80%82&text=%EF%BD%A2%E3%81%AA%E3%81%97%EF%BD%A3%20%E3%81%BE%E3%81%9F%E3%81%AF%20%EF%BD%A2%E5%A4%A9%E6%B0%97%EF%BD%A3,%E3%81%93%E3%81%AE%E8%A1%A8%E7%A4%BA%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%99%EF%BD%A1

# バージョン

Microsoft Windows [Version 10.0.22631.3593]
【GPT-4o+GAS+LINEbot】GPT-4oの画像入力対応のLINEbot

今、大いに話題になっているGPT-4oを使ったLINEbotを作成してみました！

マルチモーダルなので以前作成したGemini対応版を改良して作成しました。

**GPT-4o体験ボット**
https://lin.ee/0WcZ3HG2
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/624933/25ac2f0e-2555-cbf0-88cc-92ea732613ad.png)

下記が、作成方法です！

https://qiita.com/specialman9999/items/38c318112fda54ccc036

作成したものがこちら！
(デプロイ⇒webアプリのURLをLINEdeveloperのwebhookに張り付けると完成！)

https://docs.google.com/spreadsheets/d/196cWzbi3-04L2EP3Lltl2Lzq2_yfjxXmEaGKJC3E9MY/edit?usp=sharing

画像を渡す前にImgAppライブラリで画像を縮小して渡しております。
(値段節約のため。。。)

Geminiと違って、画像をURLで渡せるのでそこをちょっと変えております。

```javascript:GAS
function GPT4oImg(message, fileUrl,fileID,i) {
  const options = {
  method: 'POST',
  headers: {
    'content-type': 'application/json',
    authorization: 'Bearer ' + ChatGPT_APIKEY
  },
  muteHttpExceptions: true,
  payload: JSON.stringify({
    "model": "gpt-4o",
    "messages": [
      {
        "role": "user",
        "content": [
          {
            "type": "text",
            "text": message
          },
          {
            "type": "image_url",
            "image_url": {
              "url": fileUrl
            }
          }
        ]
      }
    ],
    "max_tokens": 300
  })
};

 const response = UrlFetchApp.fetch('https://api.openai.com/v1/chat/completions', options);
 const chatreply = JSON.parse(response.getContentText());

  //回答の抽出はドキュメントに方法が記載されてます
  //https://platform.openai.com/docs/guides/chat/introduction
       UserSheet.getRange(i+1, 10, 1, 2).clearContent();
       var image = DriveApp.getFileById(fileID);
       image.setTrashed(true);
  return chatreply['choices'][0]['message']['content'].trim();
}
```

画像を送ったときは一問一答のゼロショットプロンプトにしております。

もうちょっときれいにできそうですが、現状はここまでです💦
【m1 mac】how to virtual box install(use brew)

### 結論
　通常手法ではアーキテクチャエラーによりM1MacにVirtual Boxをインストールすることはできません。
そのためRosettaを使用してx86として認識させて、HomeBrewからインストールします。


### 手順
**1**.アプリケーションフォルダーから普段使用するターミナルアプリを探し、右クリックメニューから”情報を見る”をクリック。

**2**.一般情報のツリー内に”Rosettaを使用して開く”があるのでチェックを入れる。

**3**.設定をしたターミナルアプリを開き、`brew install virtualbox` を叩いてログに従ってインストールします。

以上。



#### あとがき
どうやらVirtualBoxはArmアーキテクチャCPUに対応していない様で。
適当に解決方法を探しましたが情報がまばらだったので自分用の備忘録として認めておきます。
電子工作のかっこいい中国語

「プログラミング用語の中国語の漢字表記がカッコ良すぎるし初心者に優しいからもっとみんなに知ってほしい」
https://qiita.com/kota1021/items/c31d7c7d7c6fdc589b9f

をリスペクトして、電子工作のかっこいい言葉などをリストアップしました。

中国のタオバオなどでパーツを探すときに使ってみよう!

# かっこいい言葉

- シールド線  屏蔽电线
- ブルーツース 蓝牙
- スペクトラムアナライザ 频谱分析仪
- ガイガー 盖革
- 焦電型赤外線人体検出  红外热释电人体感应
- 炎センサー 火焰传感器
- 超音波測距 超声波测距

# オンラインショップなどで使ってみよう!

検索キーワードを何を使ったらいいかが結構難しい。
辞書を引いても直訳言葉が出てきたりして、専門的なずばりが出てこなかったりする。


## 基本の基本

- ケーブル 线
- モジュール 模块
- 自動 自动

## 基本的なパーツ

- ダイオード 二极管
- コンデンサ 电容器
- 抵抗 电阻
- 電源 电源
- 直流 直销
- スイッチ 开关

## 結構出てこない言葉

- はんだフラックス 助焊膏
- フラックス 助焊剂 
- インバータ 逆变器 または 变频器
- 高圧トランス 高压包
- SSR 固态继电器
- 開発ボード 开发板
- タクトスイッチ 轻触开关
- トグルスイッチ 摇头开关
- ボタンスイッチ 按钮开关
- 波動スイッチ 船型开关
- ロッカースイッチ 翘板开关
- スライドスイッチ 滑动开关
## 日本語と同じ感じの言葉



- Up-Down 升降压
- トランス 变压器
- 電源 电源


## あの言葉は?

- Raspberry Pi 树莓派
- 
## 知っておくと便利!

- 旗舰店：タオバオなどだと、自社ブランドを扱うショップにこの名称がつきます。
- 手机：スマホ
- 密码：パスワード
- 短信：SMS


ここらへんはふつうですね。

- Arduino 検索時に衣類やらカー用品やらごちゃまぜになった場合、"Arduino" で複合検索すると電子工作パーツに絞り込みができたりします。
JavaScriptとJava間違えないで。ダメ。ゼッタイ。

どうもAtsu1209です。

突然ですが...
### 「JavaScriptとJavaは同じです。」
これを見て舌打ちをした方もいるんではないでしょうか。
でもよく間違えられます。

僕も台パンしました。

そこでめちゃくちゃ短くわかりやすく解説します。

# HelloWorld
ではまずは親の顔より見た`HelloWorld`を出力しましょう。

```javascript:JavaScript
console.log("HelloWorld");
```
簡単です。
続いてJava
```java:Java
public class Main {
    public static void main(String[] args) {
        
        System.out.println("Hello World");

    }
}
```
```console:コンパイル
javac Main.java
```
```console:実行
java Main
```
:::note alert
Javaほとんどわからないので間違ってるかも
:::

これを見るとバックエンドが苦手な僕は頭が痛くなります...

そう。 JavaとJavascriptは全く違うんです。

# 用途
２つとも名前は似てるのに用途が全然違うんです
### Java
Javaは

:::note
・Web・PC・スマホなどのアプリケーション開発
・Webサイトの作成(バックエンド)
・ソフトウェア開発
など
:::
こんなことができます。
僕的にはアプリケーション開発が主かなと思います。

### JavaScript
JavaScriptは

:::note
Webサイトに動きをつける
ブラウザの状態に合わせたリアルタイム処理
非同期通信（Ajax）
サーバーサイド開発
など
:::
こんなことができます。僕は主にJSはWebサイト開発に使うものと考えています。

# まとめ
JavaとJavaScriptは両方ともWebサイト開発やアプリ開発ができますが、
それぞれに特徴やできることがあります。
いろんな用途に合わせて使い分けましょう。

あ..でも
#### JavaとJavaScriptはまちがえないで
ちゅうことで
又次の記事でお会いしましょう
では
【python】日本語モウラを子音と母音に分ける

# 概要
日本語のモウラを子音と母音に分ける方法を検討しました。

# 結論
[`jamorasep`](https://github.com/tachi-hi/jamorasep/)を使ってsimple-ipa表記に変換したあと、末尾以外を子音、末尾を母音として取り出すのがよさそうです。

```
pip install jamorasep
```

```Python
import jamorasep
from typing import Tuple

def split_consonant_vowel(mora: str) -> Tuple[str, str]:
    simpleipa = jamorasep.parse(mora, output_format='simple-ipa')[0]
    consonant, vowel = "".join(simpleipa[:-1]), simpleipa[-1]
    return consonant, vowel
print(split_consonant_vowel("ア"))
print(split_consonant_vowel("ン"))
print(split_consonant_vowel("ッ"))
print(split_consonant_vowel("キャ"))
print(split_consonant_vowel("シャ"))
print(split_consonant_vowel("クヮ"))
```

```
('', 'a')
('', 'N')
('', 'Q')
('kj', 'a')
('ɕ', 'a')
('kw', 'a')
```

# 検討した事項
[`jaconv`](https://github.com/ikegami-yukino/jaconv/tree/master)や[`pykakasi`](https://pypi.org/project/pykakasi/)などでローマ字に変換してから前と後ろのアルファベットに分ければそれでよいかと最初思いましたが、「クヮ」「リェ」のようなマイナーなモウラに対して理想の結果になりませんでした。調べた範囲では、jamorasepでsimple-ipaに変換した場合が最も理想的だったので、それを採用しました。以下はjaconvで少し試した例です。

```Python
import jaconv
print(jaconv.kata2alphabet("クヮ"))
print(jaconv.hiragana2julius("くゎ"))
```

```
kuゎ
k u w a
```

jamorasepを使う場合、output_formatを訓令式ローマ字にするか、ヘボン式ローマ字にするか、シンプルIPAにするかは、同リポジトリに含まれる[kanamap.csv](https://github.com/tachi-hi/jamorasep/blob/main/jamorasep/resource/kanamap.csv)を眺めて決めました。

訓令式はナイーブに実装すると「スィ（tui）」と「サ（sa）」の子音が異なってしまうなど、違和感のある結果になるため、不採用にしました。
ヘボン式も同様に「デャ（deya）」と「ディ（dei）」の子音などはナイーブに実装すると異なってしまい違和感があるため、不採用にしました。
オニオンアーキテクチャでFastAPIで勉強してみた

## 背景
オニオンアーキテクチャを理解したかったので、FastAPIをオニオンアーキテクチャで作ることにした！

とは言ったものの、オニオンアーキテクチャを調べると難しかったので、自分が理解できるレベルに噛み砕いてみた

## 前提知識
オニオンアーキテクチャ
よく見つやつ↓

![Group 1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/11a25e2d-3c5e-dd8a-eb92-0bfbefc871b6.png)

## 勉強スタート
### ディレクトリ構成
以下のディレクトリ構成を作る
```
interface/      # アプリケーションが外部システムと通信するためのAPI

application/    # DB操作、トランザクション管理、外部サービスなどを組み合わせる

domain/         # モデル、モデルを作ったり、計算するサービス

infrastructure/ # 外部サービスとの連携, DB との連携
```

オニオンアーキテクチャの絵を書き直す

![Group 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/104a8608-ced4-834d-3127-4cc330c1061b.png)


### 基本的なデータの流れ
赤の矢印に沿ってプログラムが進んでいく。

逆向きに進んではNG！
NG例： DomainServiceからApplicationServiceを呼び出してはいけない

![Group 4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/36d05c68-588c-e1a4-2d31-72430fbd3c45.png)


### DBが操作できない？
この絵の通りプログラムを書いていくと、壁にぶち当たった

ApplicationServiceでDBを更新したりするのだが、DBを更新するプログラムは`infrastructure/`にある

矢印の向き的に、ApplicationServiceから`infrastructure/`を呼び出せない。
これを解消するために、`domain/`にInterfaceを作る。
DomainInterfaceはただの箱。実体は、`infrastructure/`にある。
`interface/api` を実行する時に、箱の中身も渡してあげるイメージ

コードだとこんな感じ
```Python
# domain/interface/repositories/message_repository.py
class IMessageRepository(ABC):
    @abstractmethod
    def find_by_id(self, message_id: int) -> Message:
        pass

    @abstractmethod
    def save(self, message: Message) -> Message:
        pass
```

```Python
# infrastructure/repositories/message_repository.py
class MessageRepository(IMessageRepository):
    def __init__(self, session: SQLAlchemySession) -> None:
        self.session = session

    def find_by_id(self, message_id: int) -> Message:
        try:
            p_message = (
                self.session.query(MessagePersistence).filter_by(id=message_id).one()
            )
            return self._create_message_from_persistence(p_message)
        except Exception:
            raise

    def save(self, message: Message) -> Message:
        p_message = MessagePersistence.create(message)
        try:
            self.session.add(p_message)
            if self.session.in_transaction():
                self.session.flush()
            else:
                self.session.commit()
            return self._create_message_from_persistence(p_message)
        except Exception:
            raise

```

イメージ
![Group 5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/634885/b7cd6e6e-986f-f7f7-9abe-aa704d54ae44.png)


### 最終的に出来上がったもの
```
interface/
|- api/             # API

application/
|- services/        # DB操作、トランザクション管理、外部サービスなどを組み合わせる

domain/
|- services/        # DomainModel作成、計算処理
|- models/          # プログラム全体で利用するモデル
|- interfaces/
   |- repositories/ # infrastructure/respositoriesを呼び出すための箱
   |- externals/    # infrastructure/externalsを呼び出すための箱

infrastructure/
|- repotitories/    # DBの処理
|- externals/       # 外部サービスの呼び出し
```

## 感想
オニオンアーキテクチャの基本的な流れが理解できた。
まだ、書いてないがテストがやりやすそう。
ただ、コード書く量が多いなーとは正直思った。
特定条件下でGoRouterでの遷移を中断する

# 概要
ログインしていない状態で、ユーザー情報を必要とする画面への遷移
のように、特定条件下で、特定の画面に遷移することを中断したいケースがあると思います。

これを`GoRouter`で実現する方法を考えます。

# 環境
* Flutter 3.19.6
* Dart 3.3.4
* GoRouter 13.2.4

# 結論
`redirect`で特定条件を満たしているか判断し、
満たしていれば、存在しないパスを返し、例外を引き起こす。
`onException`で例外を受け取り、`state`からパスを取得し、パスごとの処理を行う。

```dart: 結論
GoRouter(
  redirect: (context, state) {
    final isLoggedIn = ...;
    final fullPath = state.fullPath;
    if (!isLoggedIn && fullPath == '/required_logged_in_page') {
      return '/not_logged_in'; // 存在しないパス
    }
    return null; // 遷移を許可する
  },
  onException: (context, state, exception) {
    if (state.uri.toString() == '/not_logged_in') {
      // 必要に応じて、ダイアログなどを表示する
    }
  },
  ...
);
```


# 考え方
特定条件下で画面遷移を中断したい
ということで、画面遷移中に処理を挟むことを考えます。

## [失敗] `NavigatorObserver`を用いる
[NavigatorObserver](https://api.flutter.dev/flutter/widgets/NavigatorObserver-class.html)はFlutter標準の仕組みとして用意されている、遷移時に処理を挟むことができる仕組みです。
これは`GoRouter`でもサポートされています。

しかし、用意されているタイミングとしては、
* `didPop`
* `didPush`
* `didRemove`
* `didReplace`

などのように、処理後になるので、遷移を中断する、という用途には利用できませんでした。

## [失敗] `GoRoute`の`builder`で例外をスローする
`GoRouter`にはどうやら例外をキャッチする`onException`という仕組みがありそうでした。
ということで、ページを構築する箇所で例外をスローすることで対応してみようとします。

```dart: 失敗例
GoRouter(
  routes:[
    GoRoute(
      path: '/required_logged_in_page',
      builder: (context, state) {
        final isLoggedIn = ...;
        if (!isLoggedIn) {
          throw NotLoggedInException();
        }
        return const RequiredLoggedInPage();
      },
    ),
    ...
  ],
  onException: (context, state, exception) {
    if (exception is NotLoggedInException) {
      // 必要に応じて、ダイアログなどを表示する
    }
  },
  ...
);

class NotLoggedInException extends Exception {}
```

この場合だと、`onException`がキャッチしてくれず、思った挙動を得られませんでした。

## [調査] `GoRouter`の`redirect`について
少し調べると、`redirect`は特定条件下で、他のページへ遷移するために使われることが分かりました。
```dart: redirectの調査
GoRouter(
  redirect: (context, state) {
    final isLoggedIn = ...;
    final fullPath = state.fullPath;
    if (!isLoggedIn && fullPath == '/required_logged_in_page') {
      //　ここで遷移を中断したい
    }
    return null; // 遷移を許可する
  },
  ...
),
```

文字列を返すと、そのパスへのリダイレクト遷移を行え、
nullを返すと、そのまま遷移を実行する。
というものでした。

## [成功] `GoRouter`の`redirect`で存在しないパスを返す
先程の`onException`と`redirect`のあわせ技として、
`redirect`が存在しないパスを返せば、`onException`で受け取れるのでは？
という仮説のもと、実装してみた結果、想定した挙動が得られました。

再掲となりますが、こちらが成功時のコードのサンプルです。
```dart: 結論 (再掲)
GoRouter(
  redirect: (context, state) {
    final isLoggedIn = ...;
    final fullPath = state.fullPath;
    if (!isLoggedIn && fullPath == '/required_logged_in_page') {
      return '/not_logged_in'; // 存在しないパス
    }
    return null; // 遷移を許可する
  },
  onException: (context, state, exception) {
    if (state.uri.toString() == '/not_logged_in') {
      // 必要に応じて、ダイアログなどを表示する
    }
  },
  ...
);
```

# まとめ
ちょっとハック的にはなりますが、
`redirect`で存在しないパスを返し、`onException`で受け取る
という方法で遷移を中断することができました。

今回はログイン状態かどうか、というケースでしたが、ほかケースにも応用できるかと思うので、ぜひ。
【ChatGPT＋DALL-E3】OpenAIサイトの“機能の探索”について。


　どうも、カーブミラーです。

　今回は、OpenAIサイトの“機能の探索”について。

:::note info
本記事は、ChatGPT（有料版）
＋DALL-E3で行なっております。
画像はあります。　あしからず。
:::

　OpenAIのLIVEも
　　大変な反響があり、
　　　また、GPT-4oが開放された結果、
　　　　その検証がX-Twitterを
　　　　　賑やかしました。
　　　　　　自分もですが😅

　みなさんも
　　私の昨日（2024/05/14）の
　　　記事に来ていただきましたね。
　　　　ありがとうございます😊

　しかも
　　今夜は
　　　Google I/Oがあります。

　さすがに付き合いきれません。
　　寝ましたよ😅
***
　なんとOpenAIの創業者で
　　Chief Scientistのイリアさんが
　　　OpenAI を離れました。
[Ilya Sutskeverポスト](https://x.com/ilyasut/status/1790517455628198322?t=E9rkIUWauY3XSWkxkNthQA&s=03)
***
　Google I/Oの詳細は
　　以下の記事を参照してください。
[【徹底網羅】Google I/O 2024の発表内容まとめ](https://x.com/shota7180/status/1790465749754249368?t=49tx6vqOFatSlPm9TlDf_g&s=03)
***
　さて、本題です。

　GPT-4oに関する情報が欲しくて
　　OpenAIのサイトを眺めていて、
　　　勉強になりそうな場所を
　　　　見つけました。

[こんにちは GPT-4o](https://openai.com/index/hello-gpt-4o/)
　の“機能の探索”をごらんください。

　こちらでは、
　　DALL-E3の利用法の
　　　例が以下のように
　　　　上げられています。

　ちなみに
　　Chromeを翻訳モードで
　　　出しています。

　・ビジュアルナラティブ - ロボ ットライターのブロック 視覚的な物語
　・郵便配達員の サリー
　・映画『探偵』のポスター制作
　・キャラクターデザイン-ロボットのギアリー
　・反復編集による詩的なタイポ グラフィー1 
　・反復編集による詩的なタイポ グラフィー2
　・GPT-4oの記念コインデザイン○
　・写真を似顔絵に
　・テキストをフォントに変換
　・3Dオブジェクト合成
　・ブランドの配置 コースター
　・写真を似顔絵に
　・テキストをフォントに変換
　・3Dオブジェクト合成
　・ブランドの配置 コースター のロゴ
　・詩的なタイポグラフィー
　・複数行のレンダリング - ロボ ットのテキストメッセージ送 信
　・複数の講演者による会議メモ C
　・講義概要
　・変数バインディング - キュー ブスタッキング
　・具体的な詩

　少し独特な表記をしていますので、
　　わかっている範囲で書きます。

　私がいつも書いているパターンに
　　当てはめると
　　　入力　“**user**”
　　　出力　“**ChatGPT**”　です。

　“省略入力”は
　　意味がわかりません。
　　　入力しなければ、
　　　　送信できませんから。

　“<|本文終了|>”は
　　画像をダウンロードして
　　　“新しくセッションを開く”かと。

　一部に入力が
　　重複していますので、
　　　ご注意ください。

　入力に
　　画像がある場合は
　　　画像のアップロードを
　　　　意味します。
　　　　　“添付ファイル”と
　　　　　　書かれていますね。

　例の中の
　　“テキストをフォントに変換”は
　　　画像が添付となっていますが、
　　　　これはフォントのパターンを
　　　　　覚え込ませるための
　　　　　　ものです。

　“3Dオブジェクト合成”では
　　“4つの隠れたステップ”は
　　　(ビュー 1)→(ビュー 4)のことで
　　　　同じ内容での送信
　　　　　を意味しています。

　“変数バインディング 〜”では
　　出力が続いていますが、
　　　これはおそらく、
　　　　リジェネ（再描画）したものと
　　　　　思われます。

　だいたい
　　こんなところでしょうか。
***
　この中で
　　私が試したのは
　　　“複数行のレンダリング 〜”です。

　Promptを
　　そのまま送信。

　出来上がったのが
![A_first-person_perspective_of_a_robot_using_its_th.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/023430a5-5630-b784-32eb-2a8b8bc9a860.jpeg)
　　と（再描画）
![A_first-person_perspective_of_a_robot_looking_at_a.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457238/19c4ff77-ef2a-609a-2cda-97491f73a1b1.jpeg)

　サイトの出力では
　　モノクロだったのですが……。

　みなさんの
　　作品制作の糧に
　　　なれば、幸いです。

　今回は、ここまで。
Google Chromeショートカットキーメモ

# 概要
Windows環境でのGoogle Chrome ショートカットキーメモ <br>
よく使いそうなもの、使っていて便利なものを随時追記していく。

# タブ・ウィンドウ操作
| 操作 | ショートカットキー |
|:--|:--|
| 新しいウィンドウを開く | Ctrl+N |
| 新しいウィンドウをシークレットモードで開く | Ctrl+Shift+N |
| 新しいタブを開いてそのタブに移動する | Ctrl+T |
| 次のタブに移動 | Ctrl+Tab または Ctrl+PgDn |
| 前のタブに移動 | Ctrl+Shift+Tab または Ctrl+PgUp |
| 現在のタブを閉じる | Ctrl+W または Ctrl+F4 |
| 現在のウィンドウを閉じる | Ctrl+Shift+W または Alt+F4 |
robloxでassistant その45

# 概要
robloxでassistantやってみた。
練習問題やってみた。

# 練習問題
ゲームに入った、出たを検出せよ。

# 手順
- ServerScriptServiceに、scriptを追加。
- スクリプトを書く。
```
ame.Players.PlayerAdded:Connect(function(player)
	print("入った")
end)

game.Players.PlayerRemoving:Connect(function(player)
	print("出た")
end)




```


以上。
読みたい記事は「見出し」と「いいね」で選んで、簡単情報収集！

# はじめに
情報が溢れる世の中、なるべく効率的に目的のものを見つけたいという思いは皆さんあるかと思う。そこで、特定のテーマに関連するQiitaの記事から、タイトルといいね数だけを抽出して、効率よく閲覧できる仕組みを構築したいと考えた。

# やってみたいこと
・今回は、Qiitaから『顔認証』についての記事を探す
・タイトルといいね数を抽出し、一目で人気の記事が分かるようにしたい

# Node-REDを活用
Node-REDで、Qiitaの顔認証の記事をピックアップしてみることにした。

・HTTPリクエストノード
QiitaのAPIを使用して特定のクエリに基づいてアイテム（記事）を検索する。https://qiita.com/api/v2/items というURLは、パラメーターに検索クエリを設定することで、特定のキーワードを含む記事を取得することが可能である。

・Functionノード
検索クエリに含まれる日本語や特殊文字をURLエンコードする必要がある。そこで、Functionノードを使って、msg.query = encodeURI("顔認証"); を実行することで、msg.query にエンコードされた検索キーワードが代入される仕組みを作る。

# Node-REDのフロー
![スクリーンショット 2024-05-20 17.29.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772350/816d4518-dcd5-3c4c-9d65-333cd9d2f485.png)

# ソースコード
Qiita記事の中から、『顔認証』をキーワードに、functionノードとHTTP requestノードを活用して、関連記事のデータを取得してみた。
```json
[{"id":"399e10a81a36c4df","type":"inject","z":"e40ef36cdbd7d416","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":480,"wires":[["e6f017bb337c2fce"]]},{"id":"e6f017bb337c2fce","type":"function","z":"e40ef36cdbd7d416","name":"function 4","func":"msg.query = encodeURI(\"顔認証\");\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":140,"y":560,"wires":[["ba8d10fe4c87eae2"]]},{"id":"ba8d10fe4c87eae2","type":"http request","z":"e40ef36cdbd7d416","name":"","method":"GET","ret":"obj","paytoqs":"ignore","url":"https://qiita.com/api/v2/items?query='{{{query}}}","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"x":310,"y":560,"wires":[["0a214efff857c35f"]]}]
```

# タイトルといいね数だけ抽出する
次に、タイトルといいね数だけを抽出することにした。web上で公開されていたコードを参考に作成してみたところ抽出できた。
```json
[{"id":"0a214efff857c35f","type":"function","z":"e40ef36cdbd7d416","name":"function 5","func":"// レスポンスから記事の情報を取得\nvar articles = msg.payload;\n\n// 記事ごとにタイトルといいね数を抽出して新しい配列に格納\nvar extractedData = articles.map(function (article) {\n    return {\n        title: article.title,\n        likes: article.likes_count\n    };\n});\n\n// 抽出された情報を新しいメッセージにセットして出力\nmsg.payload = extractedData;\nreturn msg;","outputs":1,"timeout":0,"noerr":0,"initialize":"","finalize":"","libs":[],"x":500,"y":560,"wires":[["478a25efaebae2ea"]]}]
```
JavaScriptコードの説明
```
var articles = msg.payload;
```
articlesには、Qiitaから取得した記事情報の配列が代入され、msg.payloadにセットして返す

```
var extractedData = articles.map(function (article) {
return {
title: article.title,
likes: article.likes_count
};
});
```
articles.map(function (article) {...}) は、配列 articles の各要素に対して関数を適用し、その結果を新しい配列 extractedData として返す。
return { title: article.title, likes: article.likes_count }; では、各記事の title プロパティと likes_count プロパティを抽出し、新しいオブジェクト { title, likes } として返す。

この結果、extractedData には、記事ごとのタイトルといいね数だけを含むオブジェクトの配列が格納される。

![スクリーンショット 2024-05-14 21.59.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3772350/b4167b08-3f56-4fc7-7b2b-45e5a025db47.png)

# 結果
特定のキーワードが含まれる記事を抽出し、タイトルといいね数を表示させることができた！注目されている記事を効率よく閲覧するため、いいね数順に並び替えたり、リンクを作成する等、発展の余地はまだまだある。（今回はここまで）
ｈ

import pandas as pd
import matplotlib.pyplot as plt

# Redefine the DataFrame as dt_with_bpr_and_roa
dt_with_bpr_and_roa = pd.read_excel('/mnt/data/Book2.xlsx')

# Ensure TDATE is treated as a string to facilitate YYYYMM formatting
dt_with_bpr_and_roa['TDATE'] = dt_with_bpr_and_roa['TDATE'].astype(str)

# Define a function to calculate monthly returns
def calculate_monthly_returns(df):
    df = df.sort_values(by('TDATE'))
    df['Return'] = df['PRC'].pct_change()
    return df

# Apply the function to calculate monthly returns for each company
dt_with_bpr_and_roa = dt_with_bpr_and_roa.groupby('SICC_CODE').apply(calculate_monthly_returns).reset_index(drop=True)

# Drop the rows with NaN values in the 'Return' column
dt_with_bpr_and_roa = dt_with_bpr_and_roa.dropna(subset=['Return'])

# Calculate mean return, risk, and efficiency for each quantile
quantile_stats = dt_with_bpr_and_roa.groupby('qua')['Return'].agg(['mean', 'std'])
quantile_stats['Efficiency'] = quantile_stats['mean'] / quantile_stats['std']
quantile_stats.columns = ['Mean Return', 'Risk', 'Efficiency']

# Calculate cumulative returns for each quantile
cumulative_returns = dt_with_bpr_and_roa.groupby(['TDATE', 'qua'])['Return'].mean().unstack().cumsum()

# Plot cumulative returns for each quantile
plt.figure(figsize=(12, 8))
for qua in cumulative_returns.columns:
    plt.plot(cumulative_returns.index, cumulative_returns[qua], label=f'Quantile {qua}')
plt.title('Cumulative Returns by Quantile')
plt.xlabel('Date')
plt.ylabel('Cumulative Return')
plt.legend()
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()

# Show the plot
plt.show()

# Display the re-calculated statistics
quantile_stats
Dockerfileとdocker-composeを使用してコンテナ作成


#  Dockerfileとdocker-composeを使用してコンテナ作成

Dockerファイルはユーザがイメージを組み立てるために呼び出せるコマンドを含めたドキュメントになります。

ドライブの適当な場所に、フォルダを作成し、Dockerfileと、docker-compose.ymlファイルを作成します。

フォルダ構成は以下のようになります。

```
 .
 |---- docker-compose.yml
 |---- Dockerfile

```


まずは、Dockerfileには 以下のようにイメージを記載します。


```
FROM hello-world

```
docker-compose.ymlファイルには以下のように記載をします。

``` yml
services:
  my-aws-app:
    build:
      context: .
```

ファイルを保存し、Dockerfileとdocker-compose.ymlの上のフォルダの場所でコマンドを

> docker-compose up


```bash
docker-compose up
```

と入力し起動します。

コンテナ名には{フォルダ名}-myaws-app-{数字}という形になりますので、こちらを駆使すれば複数コンテナ起動も可能です。

![000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/544972/6fad73eb-7ec8-4028-06e3-9477cf6a9771.png)
(java silver) あれこれ

## JavaSilverでメモしたところ備忘録として残しておこうと思います。
# エントリーポイント
* エントリーポイントの記述ミスはJavaのメソッドがっていればコンパイルが通るが、mainメソッドが認識されず例外が発生する
### エントリーポイント条件
1. public
1. static
1. void
1. string[]もしくはString...
1. mainというメソッド名(小文字)
1. 変数名(引数)を付ける※argsでなくてもよい
::::note
finalやthrowsをつけても実行される
::::

# カプセル化
* アクセス修飾子を適切に設定することで「フィールド」や「メソッド」へ外部のプログラムからのアクセスを制限します。クラス米の独立性が高まり想定しない操作をされないように制御することが可能
```java
public class Car {
    // フィールド
    private String name; // 名前
    private int Speed; // 速度
    // コンストラクタ
    public Car() {
    }
    public Car(String name, int Speed) {
        this.name = name;
        this.speed = speed;
    }
    // アクセスメソッド
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getSpeed() {
        return speed;
    }
    public void setSpeed(int speed) {
        this.speed = speed;
    }
}
```
#### メリット
* 意図しないアクセスを防ぐことにより未然にバグを防いだり、セキュリティ面の強化・提供されたメソッドを使うだけで内部構造を理解する必要がなくなる

#### デメリット
* ソースコードの記述量が増え、クラスの意図を理解していないと修正委によりカプセル化のメリットを壊してしまう可能性がある

# swicth文におけるdefault
* swich文でdefaltラベルを使用すると式を評価したいずれもラベルと一致しない場合ラベルとして使用することができる。
::::note
フォロースルー時にもdefaultの処理は行われる
(java silver) モジュール

# moduleとは
* パッケージを束ねるためのもので配下パッケージの権限を細かく設定できる
* モジュールの実行
```java
java --module-path(-p) モジュールのルートディレクトリ --module(-m) モジュール名/モジュールのクラス
```
* ほかのモジュールを利用する際はrequires宣言
```java
module A {
  requires java.net.http;
}
```
* modul1が利用しているmodul2が利用しているmodul3をmodul1が利用したいときにはmodul1でrequiresする必要はなくmodul2でrequires transitiveを使用しmodul3を宣言する
```java
module modul1 {
  requires mod2;
}
-----------------------------------------------
module mod2 {
  requires transitive module3;
}
```

* モジュールは以下のパッケージはデフォルトでモジュールプライベート(モジュールの外からはアクセスできない)とみなされ、モジュールの外からアクセスを許可するにはexportsで公開したいパッケージを宣言する
```java
module mynavi {
  exports com.example.B;
}
```
::::note
特定のモジュールに対してのみのパッケージを公開したいならばexports…to宣言を使用する
::::

### 自動モジュール
* 非モジュールとモジュール前提のコードが混在していても非モジュールをモジュールとして扱えるようにするための仕組み
* モジュールパスに配置されたjarファイルでモジュール定義ファイルを持たないコードは自動モジュールとみなされる

### 無名モジュール
* モジュール定義を持たないjarファイルがモジュールパスではなくクラスパスから読み込まれた場合は無名モジュールとなる
* module.info.javaはなく外部に公開され、すべてのモジュールグラフ上のモジュールをrequirsしている

## モジュールのコンパイル
```java
javac -d [クラスファイルの出力先ディレクトリ] [モジュール用に配置したファイルパス][コンパイルするファイルのパス]

```

### モジュールの情報の確認
1. --describe-module
1. jmod describe

```java
java --module-path [モジュールのルートディレクトリ] --describe-module[モジュール名]

jmod describe [JMODのパス]
```
### クラスモジュール依存関係の確認
1. jdeps
1. -show-module-resolution

```java
jdeps --list-deps[JARファイルのパス]

java --module-path [モジュールディレクトリ] -m [モジュール名/モジュールのクラス名] -show-module-resolution
```

## 非公開パッケージの一時利用
```java
javac -d [クラスの出力先ファイルの出力先ディレクトリ]　--module-path[モジュールのルートディレクトリ] --add-exports [対象のモジュール/公開するパッケージ=利用モジュール] [module.info.javaのパス] [コンパイルするファイルパス]
```
::::note
[.\]もしくは[.￥]「自分がいるディレクトリ(フォルダ)」を表す
[..\]もしくは[..￥]「自分がいるディレクトリの一階層上のディレクトリ」を表す
::::