OmniAICreator/Qiita-1.07M huggingface dataset:
varとletとconstの違いについて

# JavaScriptの変数宣言について

はじめまして。見習いエンジニアです。学んだことのアウトプットとしてたまに記事を投稿したいと思います。

JavaScriptには変数宣言で利用できるキーワードが3つあります。
`var`と`let`と`const`の3つです。この違いを見ていきましょう。

## var let constの違い

| | 再宣言 | 再代入 | スコープ | ホイスティング |
| :-------: | :----: | :----: | :------: | :------------: |
| **var** | ○ | ○ | 関数 | undefined |
| **let** | × | ○ | ブロック | エラー |
| **const** | × | × | ブロック | エラー |

### 再宣言とは

その名の通り、同じ変数名を再度宣言してしまうことです。
`var`は再宣言してしまうと、最初に宣言した変数を上書きしてしまいます。
`let`と`const`は再宣言不可であり、間違えて再宣言してしまった場合もエラーで知らせてくれます。

```JavaScript:
var myVar = 0;
var myVar = 10;
console.log(myVar); // 10

const myConst = 0;
const myConst = 10; // SyntaxError: Identifier 'myConst' has already been declared
```

### 再代入とは

再代入とは、既に宣言された変数に新しい値を割り当てることです。
`var`と`let`は再代入可能ですが、`const`はできません。

```JavaScript:
var myVar = 0;
myVar = 10;
console.log(myVar); // 10

let myLet = 0;
myLet = 10;
console.log(myLet) // 10

const myConst = 0;
myConst = 10; // TypeError: Assignment to constant variable.
```

しかしながら、`const`で宣言した配列やオブジェクトは変更可能です。
数値や文字列はイミュータブルなため変更できませんが、配列やオブジェクトはミュータブルなため変更が可能です。

```JavaScript:
const products = {
name: "apple"
};
products.name = "orange";
console.log(products.name) // "orange"

const number = [1, 2, 3];
number[0] = 0;
console.log(number) // [0, 2, 3]
```

### スコープとは

スコープとは、変数や関数が有効でアクセス可能な範囲を指します。
JavaScriptでは

1. **グローバルスコープ**(プログラム全体からアクセス可能)
2. **関数スコープ**(関数内でのみアクセス可能)
3. **ブロックスコープ**(if文やfor文などのブロック内でのみアクセス可能)

の3種類があります。
`var`は関数スコープであり、予期せぬ再宣言を行ってしまう可能性があります。

### ホイスティングとは

巻き上げとも呼ばれ、変数や関数の宣言が、実際のコード実行前にそのスコープの最上部に「持ち上げられる」動作を指します。
`var`で宣言された変数は関数スコープまたはグローバルスコープの先頭にホイスティングされます。ただし、初期化はそのままの位置に留まります。
これがどういう現象を実際に引き起こす可能性があるのかと言うと、`var`は`undefined`で処理するためエラーが発生せず、意図しない挙動やバグが発生してしまいます。
一方、`let`や`const`ではその時点でエラーを出してくれるので、原因の特定が簡単になります。

```JavaScript:
console.log(hoge); // undefined
var hoge = 5;
console.log(hoge); // 5
```

このコードは以下のように解釈されます。

```JavaScript:
var hoge;
console.log(hoge); // undefined
hoge = 5;
console.log(hoge); // 5
```

`let`と`const`で宣言された変数も正確にはホイスティングされますが、宣言が初期化されるまで一時的にテンポラルデッドゾーンに留まるため、
宣言前にアクセスするとエラーが発生します。

## おわり

以上が`var`と`let`と`const`の違いです。
私は以前研修を受けたときにとりあえず`var`使っておけと言われたのですが、学びなおしてみると現実は異なっておりました。
2023年に研修を受けたはずなのですがきっと2015年以前にタイムスリップしてたのでしょう。
[TypeScript] Partial, Requiredが便利だった話

以下のようなコードがある。
``` ts
interface Address {
    prefecture?: string;
    code: string;
    city?: string;
    detail?: string;
}

const address: Address = {
    code: '111-1111',
};
```

ここで、全てがoptionalではないように型を変えたい時、
今まではAddressを直接に変更するか、同じ構造で作り直したりしていた。
``` ts
interface Address { // 直接変更する
    prefecture: string;
    code: string;
    city: string;
    detail: string;
}

interface Address2 { // 新しいものを作る
    prefecture: string;
    code: string;
    city: string;
    detail: string;
}
```

TypeScriptを有効活用すると変数定義時の型定義で解決できる
```ts
interface Address {
    prefecture?: string;
    code: string;
    city?: string;
    detail?: string;
}

const address: Required<Address> = {
    prefecture: 'Osaka',
    code: '111-1111',
    city: 'Osaka',
    detail: 'Kita-ku',
};
```

全てoptionalにしたいときは`Partial`で解決できる
```ts
interface Address {
    prefecture?: string;
    code: string;
    city?: string;
    detail?: string;
}

const address: Partial<Address> = {};
```
Windows11を色々快適にする

整理中です。

参考になれば。

## アニメーション効果を無効にする。
効果★★★★★
ウィンドウの最小化・最大化など、画面の操作時のアニメーション効果をオフにします。

- 設定 → アクセシビリティ → 視覚効果
- アニメーション効果を無効にする

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/91013f28-aaf4-2fe1-dc3d-c85f831fa90a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3633035/566db806-c31e-5880-527c-32805e8d732f.png)


## ツールはアプリ版を使用する。
効果 ★★★★☆
Discordなどのツールは、ブラウザ版よりアプリ版の方が軽快に動作します。

## ロック中の通知を無効にする。
効果 ★☆☆☆☆
ロック中の通知を無効にします。

ロック中の通知がONになっていると、セキュリティ上の問題や、電力消費の面で悪影響があります。
- 設定 → システム → 通知
- 「ロック画面に通知を表示する」をオフにする


## 参考資料
https://kantanmusen.sakura.ne.jp/cn927.oak/97_003.htm
wsl2 で、npm run build したら、CMD.EXE was started with the above path as the current directory. UNC paths are not supported.  Defaulting to Windows directory. って出たときの対処法

# 背景

python playwright を動かそうとして、上手くいかないと思ってたら
front build してないことに気付く

で、やってみたら、以下のようなエラーになったときの対処法
```bash: build
$ npm run build

> frontend@0.0.0 build
> tsc && vite build

'\\wsl.localhost\Ubuntu-22.04\home\{user}\{project}\app\frontend'
CMD.EXE was started with the above path as the current directory.
UNC paths are not supported.  Defaulting to Windows directory.
```

# 結論

/mnt の下に、デフォルトで windows の drive が mount されているので、そこで作業すればよい

# 試行錯誤

## :ng: drive mapping 

- cmd ならよくやる、Z: に割り付け、とかで対処しようとしたら、何故か wsl2 が wsl1 に downgrade されるという珍現象に遭遇したので、やめ。

これが原因だったのかは不明ではあるが、他に記憶なし・・
その際の備忘録は以下

https://qiita.com/baku2san/items/089ab85df391d95ed54b

## :construction: Linux Drive を作って、mount

drive 作って mount したあとで、/mnt/c, /mnt/e を発見し・・不要だったことに気付く :sweat: 

https://learn.microsoft.com/ja-jp/windows/wsl/wsl2-mount-disk

# あとがき

問題起きると本題からそれていって余分な時間がかかるのが辛いね

しかも慣れてない世界だとササッと解決できない。

まぁ、解決できると楽しいわけだけど :laughing:
Prisma使い方メモ

Prismaのキャッチアップで、自分用のメモを作成

# Prismaとは
今回はPrisma ORMを試します。Prisma ORMは、Node.jsとTypescriptのO/Rマッパー。ちょっと前から話題になっています。

https://www.prisma.io/

Node.jsとTypescriptのO/Rマッパーでは、Squelizeがよく使われています。

違いとしては、
Sequelizeの方が、コミュニティが発達している、ドキュメント量が多い、安定性が高い、対応しているリレーショナルデータベースも多い
Prismaは、タイプセーフなインターフェースになっている（最初から型を使った開発者エクスペリエンスを意識して開発がされていそう）

あたりがあるかと思います。
CLIについては、Sequelizeも様々パッケージがあるので、どちらかの方が優秀という感じはしませんでした。

現時点では、大規模な開発であれば、Sequelizeを選ぶ方が無難という感じはします。
今回は、学習のためにもPrismaを試します。

# 使い方メモ

CRUDの実装などの初歩的な部分はわかりやすいので、ここには記載しません。

## モデルのカスタムのstaticメソッド
`Extensions`の`model`が該当していそう
https://www.prisma.io/docs/orm/prisma-client/client-extensions/model

例えば、customersのモデルで、nameフィールドで検策するメソッドを作る場合は、下記のように書きます

```ts
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient().$extends({
  model: {
    customers: {
      async findByName(name: string) {
        return await prisma.customers.findMany({ where: { name }});
      }
    }
  }
})

const data = await prisma.customers.findByName('hogehoge');

```

## モデルのカスタムのinstanceメソッド
`Extensions`の`result`が該当していそう
https://www.prisma.io/docs/orm/prisma-client/client-extensions/result

例えば、customersのモデルで、nameフィールドから表示用の名前を取得するメソッドを作る場合は、下記のように書きます

```ts
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient().$extends({
  result: {
    customers: {
      fullName: {
        needs: { id: true, name: true },
        compute(customer) {
          return `${customer.id} ${customer.name}`;
        }
      }
    }
  }
})

const data = await prisma.customers.findByName('hogehoge');
const fullName = data[0].fullName;
```

## モデルのhook処理
`Extensions`の`query`が該当していそう
https://www.prisma.io/docs/orm/prisma-client/client-extensions/query

例えば、customersのモデルで、customersを作成した時、タイムスタンプを設定するhook処理を実装する場合は下記のように書きます

```ts
import { PrismaClient } from '@prisma/client'

const prisma = new PrismaClient().$extends({
  query: {
    customers: {
      async create({ model, operation, args, query }) {
        return query({
          ...args,
          data: {
            ...args.data,
            timestamp: now,
          }
        });
      }
    }
  }
})

await prisma.customers.create({ data: { name: 'hogehoge' }});
```

## マイグレーションのコマンド
https://www.prisma.io/docs/orm/reference/prisma-cli-reference

### マイグレーションファイルの作成と適用
開発環境向け

注意：Prismaのスキーマ定義型ファイルで、DBのスキーマが変わるので、PrismaのスキーマファイルとDBのスキーマで差分がある場合は、実行しない

```sh
$ npx prisma migrate dev
```

### マイグレーションファイルの適用

```sh
$ npx prisma migrate deploy
```

警告がなかったり、シャドウデータベースに依存せず、マイグレーションを行う

### DBのスキーマからDBマイグレーションファイルの作成

```sh
$ npx prisma db pull
```

### スキーマの検証

```sh
$ npx prisma format
```

### 失敗したマイグレーションの適用済みorロールバック済みにする

```sh
$ npx migrate resolve 

--applied(適用済みにする) or --rolled-back(ロールバック済みにする) を指定する
```

### マイグレーションの状態を確認

```sh
$ npx prisma migrate status
```

一旦、ここまで
Prisma Accelerateあたりを読んで面白かったら書きます。
ウィルソン素数とウィルソンの定理

こんにちは｜こんばんは。カエルのアイコンで活動しております @kyamaz :frog: です。

## はじめに
人名がついた「●●素数（●●は人の名前）」という素数を紹介する第７弾です。これまでの６つのエントリは脚注にリンクを貼っておきます。[^ref1][^ref2][^ref3][^ref4][^ref5][^ref6]

このあとのプログラムで素数列を利用するため、ワンライナーで素数列を定義しておきます。

```Haskell: 素数列を生成する
ghci> p=2:3:5:5#p;m#(a:b:x)=[n|n<-[a^2..b^2-2],(mod (n+1) 6)*(mod (n-1) 6)==0,gcd n m<2]++(m*b)#(b:x)
```

# ウィルソン素数
[ウィルソン素数のWikiPedia](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%83%AB%E3%82%BD%E3%83%B3%E7%B4%A0%E6%95%B0)によると、イングランドの数学者ジョン・ウィルソンに由来して命名されています。

ウィルソン素数の定義は以下のとおりです。

:::note info
<dl><dt>ウィルソン素数の定義</dt>
<dd>$p^2$ が $(p − 1)! + 1 $を割り切るような素数 $p$
</dd></dl>
:::

後述の「ウィルソンの定理」が示すとおり、$(p − 1)! + 1 $ を素数 $p$ で必ず割り切れますが、$p^2$でも割り切るような素数 $p$ です。既知のウィルソン素数は $2×10^{13}$まで調べられており $5, 13, 563$ の３つしか確認されていないそうです。ウィルソン素数は無限個存在し、さらに区間 $[x, y]$ に約 $\log(\log(y)/\log(x))$ 個存在すると予想されていますが、未解決問題です。

さて、この定義を用いて、ウィルソン素数のリストを出力してみましょう。この処理はいつもどおり停止しないため、適当なところで`Ctrl-C`で停止しています。
（※だいぶ大きな数まで調べても３つしか確認できていないので、$563$が出力されれば直ぐに停止してもよいでしょう。）

```Haskell:
ghci> [n|n<-p, mod (product [2..(n-1)] +1) (n^2) == 0]
[5,13,563^CInterrupted.
```

## ウィルソンの定理
「ウィルソンの定理」は、素数に関する次のような定理です。$p$ が大きくなるにつれて計算量が膨大になるため、素数判定に用いるには実用的な手法ではありません。

:::note info
<dl><dt>ウィルソンの定理</dt>
<dd> $p$ が素数ならば $(p − 1)! \equiv −1 \pmod p$ が成り立つ。

逆に、整数 $p \gt 1 $に対し、$(p − 1)! \equiv −1 \pmod p$ ならば、$p$ は素数である。
</dd></dl>
:::

この定理の発見と証明の経緯は少し複雑で[ウィルソンの定理のWikiPedia](https://ja.wikipedia.org/wiki/%E3%82%A6%E3%82%A3%E3%83%AB%E3%82%BD%E3%83%B3%E3%81%AE%E5%AE%9A%E7%90%86)によると、発見は10世紀のペルシャの数学者イブン・アル・ハイサム（アルハゼン）であったが、18世紀のイングランドの数学者ジョン・ウィルソンにより再発見され、その師匠であるエドワード・ウェアリングにより1770年に発表され、命名されたそうです。さらにその証明は、1773年にラグランジュが最初の証明を与えました。

>（投稿後の追記）
ウィルソンの定理の証明は、https://mathlandscape.com/wilson-theorem/ に詳しく解説があります。

## おわりに

ご一読いただきまして有り難うございます。
最後に、本稿を記載するために検証したHaskell環境を記しておきます。お手元の環境で検証する際に、動作が異なるときには参考になるかもしれません。

<details><summary>本稿の環境</summary>
本稿のために使用した環境は以下となります。

* macOS: Sonoma 14.5 (chip: Apple M1)
* GHCup: 0.1.30.0
* GHC: 9.6.4

</details>


（●）（●） Happy Hacking!
/""　＿＿""＼

[^ref1]: [ウォルステンホルム素数](https://qiita.com/kyamaz/items/848f4868b9055bc09fc0)
[^ref2]: [カレン素数とウッダル素数](https://qiita.com/kyamaz/items/7b73265525cd9ebe4f31)
[^ref3]: [ヴィーフェリッヒ素数](https://qiita.com/kyamaz/items/d550448562f07b9d75fb)
[^ref4]: [キネア素数とキャロル素数](https://qiita.com/kyamaz/items/04b1a58ef7a25e988a76)
[^ref5]: [プロス素数とピアポイント素数](https://qiita.com/kyamaz/items/98d6fa9b4dbd0de52284)
[^ref6]: [ワグスタッフ素数と新メルセンヌ予想](https://qiita.com/kyamaz/items/08d73cc92ac6a40c9952)
【2024年7月版】Ubuntu で マウントされた root ディレクトリのサイズ縮小 【vgchange, resize2fs, lvreduce, e2fsck】

# はじめに

Ubuntu のインストールしたけど、root ディレクトリのサイズ多めにしてもた。。。縮小しよう。。。

という時のメモ

# 前提

- Ubuntu22.04
- 論理ボリュームのサイズは 30G → 15G に縮小したい
- 対象の論理ボリューム名は、ubuntu-lv
- 対象のボリュームグループは、ubuntu-vg
- ファイルシステムは、ext4

# 手順

- インストールDVDなどで起動する
- Shellに入る
- LVMのアクティベート
- ファイルシステムのサイズ縮小
- 論理ボリュームのサイズ縮小
- 再起動

:::note info
Proxmoxなどの環境でBIOSをつかめないときは、VMのオプションで起動順序があったり、`sudo systemctl reboot --firmware-setup` ができたり、`sudo reboot`した後にBIOSに入れたりします。
:::

## インストールDVDなどで起動する

インストールDVDなどで起動しましょう。HELPからShellを起動できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/d42a2d2f-855f-aa17-a67c-99991375417d.png)

## Shellに入る

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/143127/78c6066a-cf3e-b013-d26a-e7d3af00b840.png)


## LVMをアクティベート

```terminal
# vgchange -ay
```

## ファイルシステムのサイズ縮小

- ファイルシステムのチェックを行います

```terminal
# e2fsck -f /dev/ubuntu-vg/ubuntu-lv
```

- ファイルシステムのサイズを縮小します

```terminal
# resize2fs /dev/ubuntu-vg/ubuntu-lv 15G
```

## 論理ボリュームのサイズ縮小

- 論理ボリュームのサイズを縮小します

```terminal
# lvreduce -L 15G /dev/ubuntu-vg/ubuntu-lv
```

- ファイルシステムのチェックを行います

```terminal
# e2fsck -f /dev/ubuntu-vg/ubuntu-lv
```

## 再起動

```terminal
# reboot
```

:::note info
このときに、ライブCDやインストールDVDなどを取り外しておくか、BIOS、UEFIで起動順序を変更しておくと良いでしょう。
:::

# さいごに

かんたんでしたね
初めての個人開発

## 概要
このプロジェクトは、タスク管理と生産性向上を目的としたウェブアプリケーションです。ユーザーは、タスクの作成・管理ができ、ポモドーロタイマーを使用して作業時間と休憩時間を効果的に管理することができます。ログインすることで、タスクや設定の情報を長期的に保持でき、統計情報の取得もできます。ログインせずに、ゲストユーザーとしても使用できます。また、Youtubeのプレイヤーが埋め込まれており、お気に入りの再生リストを再生することが可能です。

## 背景
私の友人は休日に個人開発を行っています。一人で作業する環境では作業と休憩が曖昧になりがちです。作業の途中で他のことに目移りしてしまったり、休憩の時間が長引いてしまったりと集中力の維持が難しくあります。特に作業中でも休憩中でも、動画を流し好きな音楽を聞いていたりすると途中で動画サイトが気になりいつの間にか動画を見続けてしまうこともあります。 私も現在一人での学習時間が多いため、共感できる部分が多くありました。そのため、これらの問題を解決することで効率よく作業を進められるようにしたいと思ったからです。

## 要件
* タスク管理機能: タスクの作成、編集、削除、完了を管理しやすいインターフェース
* ポモドーロタイマー: 作業時間と休憩時間を設定でき、タイマーで通知することで、集中と休憩のメリハリをサポート
* 音楽再生機能: お気に入りのプレイリストの URL を登録して再生できる
* 統計グラフ: タスク完了状況や作業時間をグラフで可視化し、作業効率を意識できる

## 実装の流れと学んだこと

### views
UIの構築にBladeテンプレートエンジン、Bootstrap、JavaScriptを使用しました。Bootstrapの使用がはじめてでしたが使いやすく簡単に良いデザインに整えることができました。また、jQueryを使用しタスクの順番をドラッグ操作できるようにしました。

### データベースの接続とマイグレーション
ユーザー認証機能を実装するためにLaravel Breezeを使用しました。ユーザー登録、ログイン、パスワードリセットなどの機能を迅速に構築することができました。
ログインしていないゲストユーザーのためのセッションidを作成しました。

### コントローラーの作成
ログインユーザーとゲストユーザーでデータの管理を分岐しました。

### APIリクエストとテスト
外部クライアントからのAPIリクエストを処理し、テストを行いました。

- **requestの作成**: 新しいタスクの作成や既存タスクの更新に対するリクエストを処理するためのRequestクラスを作成しました
- **validateの実装**: Requestクラスを使用して、入力データのバリデーションを行いました。タスクのタイトルが必須であることや、入力データが適切な形式であることを確認しました
- **APIテスト**: Talend API Testerを使用して、APIの動作をテストしました。正常系の際に正しくプログラムが実行されることを確認しました

## 結果
無事、期待される動作をするアプリケーションを作ることができました。今後、統計機能の実装のためのライブラリを学んで機能の追加、実装を試みて行きたいと思います。
Docker環境でtailwindを途中から導入する@Rails7

## Dockerで作ったRails7の環境に途中からtailwindを入れたい...
rails newするときにcssの指定にtailwindとしてプロジェクトを作成するけど
一度rails newした後で途中からtailwindを導入したいと思った



## 前提
・Docker
・Rails 7.1.3
・Ruby　3.2.3
※もうrails newしてプロジェクトは作成している

##　手順

①tailwindを下記コマンドでインストール
```
$docker-compose run web ./bin/bundle add tailwindcss-rails
$docker-compose build
$docker-compose run web ./bin/rails tailwindcss:install
```

②生成された`Procfile.dev`を編集する
```
web: bash -c "rm -f tmp/pids/server.pid && bin/rails server -p 3001 -b 0.0.0.0"
css: bin/rails tailwindcss:watch
```
主に`web`の箇所を編集するのですが、`docker-compose`ファイル内のrailsコンテナ内で
`3000`のポート番号を既に使っている場合はProcfile.devのwebの中でも同じく3000のポート番号だと
エラーになるので異なるポート番号に変える必要がある

③tailwindのクラスをなんか使ってみて反映されているか確認
```
# 自分の環境では　/bin/bashじゃない
$docker-compose exec bash 

# railsのコンテナ内で下記コマンド実行
./bin/dev
```

反映されている
![3cc0eba88a5147513a74f34c237a88bd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3825215/d86a2b50-113a-cba2-970e-d151dcec452b.png)


# でもこれでいいのか
この場合だと`docker-compose up -d`したときに3000のポートと3001のポートで
railsのコンテナが立ち上がっていることになるのか...?
それと`docker-compose up -d`した後にコンテナに入って`./bin/dev`を実行しないといけないのが
いちいちめんどくさいと感じるから、`docker-compose up -d`したら`./bin/dev`が実行されるようにしたい。

だから、下記のように`docker-compose`ファイル内を編集

```
web:
    build: &web_build
      context: .
      dockerfile: Dockerfile.dev
    command: bash -c "rm -f tmp/pids/server.pid && ./bin/dev" ##　ここ
```

`Procfile.dev`はこんな感じに編集

```
web: bin/rails server -b 0.0.0.0 -p 3000
css: bin/rails tailwindcss:watch
```

これで`docker-compose up -d`をして、ページを確認しようとするがページが確認できない....
コンテナも立ち上がっているのになぜなのか....


# 最終的な結果はこの形に落ち着く
そもそも`Procfile.dev`の中に記述している`web`の箇所を削除して
`css`だけを残す
```
css: bin/rails tailwindcss:watch
```
なので`rails(web)`は`docker-compose`内のコンテナでサーバーを立ち上げる感じにする

これでも動いたのだが、あんまり腑に落ちていない...
また分かり次第で追加更新する予定
AtCoder 勉強記録[C++] その27

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

int main() {
  vector<string> s(4);
  rep(i, 4) cin >> s[i];
  for(int i = 0; i < 4; i++){
    for(int j = 0; j < 4; j++){
      if(i!=j && s[i]==s[j]) {
        cout << "No" << endl;
        exit(0);
      }
    }
  }
  cout << "Yes" << endl;
}
```
### 解法
すべての文字列が違う場合のみ`Yes`を出力し、それ以外の場合`No`を出力する。
PythonでmicroCMSのエンドポイントにリクエストを投げる

# はじめに
個人ブログに記事を投稿するプログラムをPythonで作っていたのですが、microCMSで作成したスキーマにリクエストを投げるプログラムの作成に少し時間がかかったので、備忘録も兼ねて投稿します。

# microCMSのエンドポイントにリクエストを投げるクラス
今回は、classesフォルダにrequest.pyというファイルを格納しているものとします。
```classes/request.py
import requests as req
import json

class Request:
    def __init__(self, url):
        self.headers = {
            'X-MICROCMS-API-KEY': 'xxxxxxxxxxxxxxxxx',
            'Content-Type': 'application/json'
        }
        self.url = url

    def get(self):
        res = req.get(self.url, headers=self.headers)
        return res.json()
    
    def post(self, data):
        res = req.post(self.url, data=json.dumps(data), headers=self.headers)
        return res.json()
```
下記がポイントです。
* requestsを使う
* ヘッダーに「X-MICROCMS-API-KEY」を組み込む
    * APIキーはmicroCMSの管理画面から取得可能
* POSTリクエストのdataは、json.dumpsを使ってJSONデータにする

# 実際にGET・POSTリクエストを行う
```main.py
from classes.request import Request

# abcスキーマにリクエストを行う
req = Request('https://hogehoge.microcms.io/api/v1/abc')

# GETリクエスト
getRes = req.get()

# POSTリクエスト
data = { ... }
postRes = req.post(data)
```

# おわりに
以前自作のAPIに対して同じような処理を実装したことがあったのですが、その際はurllib3.requestを使用して実装したので、POSTのdataはどうやってリクエストに含める？と戸惑いながら実装しました。
paizaの問題をPowerShellで解いてみた【足し算 (paizaランク D 相当)】

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

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

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

###

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

## 問題
足し算 (paizaランク D 相当)

https://paiza.jp/works/mondai/d_rank_skillcheck_sample/addition


#### 問題: ２つの正の整数 a, b が半角スペース区切りで入力されるので a と b を足した数を出力してください。

入力: 半角スペース区切りで2つの整数aとb
出力: 整数aとbを足した結果


#### 解き方:
1. 標準入力から1行の文字列を読み込む
1. 半角スペースで分割して2つの整数 a と b を取得
1. 整数に変換して合計を計算
1. 結果を出力


#### コード:
~~~
# 標準入力から文字列を読み込む
$a,$b = (read-host).split()

# 整数に変換して合計を計算
$result = [int]$a + [int]$b

# 結果を出力
write-host $result

~~~


#### コードの説明:

1.文字列の読み込み:
~~~
$a,$b = (read-host).split()
~~~
- read-hostを使って標準入力から文字列を読み込みます
- split()を使って入力文字列を半角スペースで分割します


2.合計の計算:
~~~
$result = [int]$a + [int]$b
~~~
- 変数$a変数$bは文字列なので数値型(int)に変換して合計を計算し、結果を result に格納します

3.結果の出力:
~~~
write-host $result
~~~
- write-host $result を使って、合計を出力します



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

https://note.com/mahalo_/m/m421b17a881c8
each_with_indexメソッド

each_with_indexメソッドを用いると、繰り返し処理の中で、配列の添え字も扱うことができる。

```
animals = ["dog", "cat", "fox"]

animals.each_with_index do |animal,index|
  puts "#{index}:#{animal}"
end
```

これを実行すると、以下の結果になる。
```
0:dog
1:cat
2:fox
```

スタートを１からにしたい場合はindex+1とすると１から始めることができる。
```
animals = ["dog", "cat", "fox"]

animals.each_with_index do |animal,index|
  puts "#{index + 1}:#{animal}"
end
```
```
1:dog
2:cat
3:fox
```
【PHP】トランプの戦争ゲームで、手札からカードを出したり戻したりする

## はじめに
トランプゲームの戦争で、
手札からカードを引く、戻すを行った方法を学習用にまとめた。

## 結論
[array_shift](https://www.php.net/manual/ja/function.array-shift.php), [array_push](https://www.php.net/manual/ja/function.array-push.php)を使って実装した。
array_push関数で手札配列の末尾にカードを追加し、array_shift関数で先頭からカードを出すイメージです。

 <dl>
  <dt>array_shift</dt>
  <dd>配列の先頭から要素を一つ取り出す</dd>
  <dt>array_push</dt>
  <dd>一つ以上の要素を配列の最後に追加する</dd>
</dl>

array_pushとarray_shiftの組み合わせで、キュー（先入れ先出し）のデータ構造を表現できる
※array_pushはブラケット構文でも可
## 詳細
戦争は、プレイヤーが手札からカードを出し合って、カードのランクを比べて強いカードを出したほうが勝ちとなります。勝ったプレイヤーはカードをもらい、引き分けの場合はカードを手札に戻します。
以下、作成したプログラムのクラス図の抜粋です。
```plantuml
@startuml TrumpGameWar
title トランプゲームの戦争 クラス図（処理に直接関係する部分の抜粋）
class Player{
  +int id
  +Hand hand
}
class Card {
  +string suit
  +string eye
  -getSuit()
  -getEye()
}
class Hand{
    +array cards
    -addCard()
    -playCard()
}
Player -- Hand
Hand -- Card
@enduml
```

#### 手札からカードを引くは、array_shift
```php
public function drawCard() 
{
    return array_shift($this->cards);
}
```
#### 手札にカードを戻すは、array_push（ブラケット構文でも可）

```php
public function addCard(Card $card) 
{
    array_push($this->cards, $card);
}
```

## 参考記事
[array_shift](https://www.php.net/manual/ja/function.array-shift.php)
[array_push](https://www.php.net/manual/ja/function.array-push.php)
[独習PHP 第3版](https://www.amazon.co.jp/dp/B01FH3KVNU/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[Angular]forRootではなくprovideStoreでState(NGXS)を初期化する スタンドアロンコンポーネント

## はじめに
個人開発でAngularのスタンドアロンコンポーネントを使用しており、state(NGXS)の初期化方法がNgModuleを介して使用する時と変わっていたので記録しておきます!

## 環境
- Angular CLI: 17.3.8
- @ngxs/store@^18.0.0
- Node: 20.11.0

## stateの初期化方法
### NgModule
```ts
// app.module.ts
@NgModule({
  imports: [
    NgxsModule.forRoot([HeroState]),
  ],
  bootstrap: [AppComponent],
})
export class AppModule {}
```
### スタンドアロンコンポーネント

```ts
// app.config.ts
import { provideStore } from '@ngxs/store';
export const appConfig: ApplicationConfig = {
  providers: [
    ...
    provideStore([HeroState]),
  ]
}
```

## summary
HttpClientModuleとかも`provideHttpClient()`で代用することになっていたので、最初につまづけて良かったです💦
以下の記事がとても参考になりました。
https://blog.lacolaco.net/posts/angular-provider-function-pattern/

## 余談
NGXSの[インストールガイド](https://www.ngxs.io/introduction/installation)に`provideStore`について記載がありましたが、完全に読み飛ばしていて、詰まってしまいました。

最初に以下のようなコードでapiにリクエストできているのか確認したのですが...
```ts
this.store.dispatch(new GetRaceList()).subscribe({
  next: () => console.log('終了'),
  error: (err) => console.error(err),
})
```
dispatchしているのにリクエストが飛ばない...「終了」が表示される❓❓
初期化されていないActionが呼ばれたら教えてくれてもいいんだよ？😤
SegPoint: 大規模言語モデルを活用した3Dポイントクラウドセグメンテーションの新時代

# SegPoint: Segment Any Point Cloud via Large Language Model

今回は、最新の研究成果である「SegPoint: Segment Any Point Cloud via Large Language Model」という論文をご紹介します。この研究は、3Dポイントクラウドのセグメンテーションにおいて、大規模言語モデル（LLM）の推論能力を活用し、多様なタスクを一つのフレームワーク内で実現するモデルを提案しています。

### 論文情報
- **タイトル**: SegPoint: Segment Any Point Cloud via Large Language Model
- **リンク**: [SegPoint論文](https://arxiv.org/abs/2407.13761)
- **発表日**: 2024年7月18日
- **著者**: Shuting He, Henghui Ding, Xudong Jiang, Bihan Wen
- **DOI**: 10.48550/arXiv.2407.13761

## 背景と目的

3Dポイントクラウドのセグメンテーションは、ロボティクス、自動運転、バーチャルリアリティなど、多くの分野で重要な役割を果たしています。しかし、従来の手法は特定のタスクに特化しており、ユーザーの暗黙の意図を理解することが難しいという課題がありました。この研究の目的は、LLMの推論能力を活用して、ユーザーの意図を理解し、多様なセグメンテーションタスクに対応する統一モデル「SegPoint」を提案することです。

## 研究の焦点

SegPointは、以下の4つのタスクに対応します：
1. **3D指示セグメンテーション**: 複雑で暗黙的な指示テキストに基づくセグメンテーション
2. **3D参照セグメンテーション**: 明示的なテキスト記述に基づくセグメンテーション
3. **3D意味セグメンテーション**: 既存のセマンティックセグメンテーションタスク
4. **3Dオープンボキャブラリー意味セグメンテーション**: 未知のオブジェクトを含むセグメンテーション

このモデルは、新たに導入された「Instruct3D」というベンチマークデータセットを使用して評価されています。

## モデルのアーキテクチャ

SegPointは、大規模言語モデル（LLM）と以下の2つの主要モジュールで構成されています：

### Geometric Enhancer Module
このモジュールは、ポイントクラウドからローカルセマンティクスを抽出し、特徴抽出プロセスに組み込みます。具体的には、KPConv（Kernel Point Convolution）を用いて局所的な幾何学的情報を効果的に捉えます。

### Geometric-guided Feature Propagation
このモジュールは、幾何学的な事前情報とLLMの隠れ埋め込みを利用して、高品質な特徴を生成し、密な予測タスクを実現します。具体的には、PointNet++の伝播技術を利用して、スパースなポイントセットから高密度なポイントセットへアップサンプリングします。

## 実験の概要と結果

**実験方法**:
- SegPointは、LLMの推論能力を利用して、ポイントごとのセグメンテーションマスクを生成します
- 新たに導入されたInstruct3Dデータセットを用いて評価を行いました

**結果**:
- SegPointは、ScanReferやScanNetなどの既存のベンチマークで競争力のある性能を示し、新しいInstruct3Dデータセットでは特に優れた結果を達成しました
- ScanReferデータセットでは、他の最先端手法を上回る精度を達成しました（例：SegPointのmIoUは41.7%、既存の最高精度は35.4%）
- Instruct3Dデータセットでは、指示に基づくセグメンテーションタスクで特に高い性能を示し、mIoUは27.5%に達しました

## 具体的なユースケース

SegPointは以下のようなシナリオで特に有効です：
- **ロボティクス**: 複雑な指示に基づいて物体を正確に認識し、操作することが求められるシナリオ
- **自動運転**: 未知のオブジェクトを含む複雑なシーンの理解
- **バーチャルリアリティ**: 仮想空間内での詳細なオブジェクトセグメンテーション。

## 将来の課題と展望

現時点でのSegPointの限界と、それを克服するためのアプローチについて以下のように考えられます：
- **非テキストのプロンプト処理**: 現在はテキストプロンプトのみを処理可能ですが、将来的にはボックスやポイントなどの非テキストプロンプトも処理できるようにする
- **計算資源の効率化**: トレーニングと推論に必要な計算資源を減らすための最適化が必要

## まとめ

SegPointは、LLMの推論能力を活用し、3Dポイントクラウドの多様なセグメンテーションタスクを統一されたフレームワーク内で解決するモデルです。新しいベンチマークデータセットInstruct3Dを通じて、複雑な指示に基づくセグメンテーションタスクにおいて優れた性能を示しました。この研究は、ロボティクスや自動運転などの分野での実用化に向けた大きな一歩となるでしょう。

この記事が皆さんの研究や実務に役立つことを願っています。ご質問やフィードバックがありましたら、コメント欄にお寄せください。
正規表現のPatternで指定可能な値

# 早速実践
まずはじめに、前提としてですが
Pattern.compile(text)
とすることで、指定された正規表現をパターン化することができます。

ここで第二引数を指定するか埋め込みフラグを使用する事で、そのままでは使用できない文字などを指定できます。


|フラグ|内容|埋め込みフラグ|
|:---|:---|:---|
|CANON_EQ|正規等価を有効にする|-|
|CASE_INSENSITIVE|大文字と小文字を区別しないマッチングを有効にする|(?i)
|COMMENTS|パターン内で空白とコメントを使用できるようにする|(?x) 
|DOTALL|"."が行末記号にもマッチするようにする|(?s)
|LITERAL|リテラル構文解析を有効|-
|MULTILINE|複数行モードを有効にする|(?m)
|UNICODE_CASE|大文字と小文字を区別しないマッチを有効にする|(?u) 
|UNIX_LINES|Unix ラインモードを有効にする|(?d) 


# 参考

https://developer.android.com/reference/java/util/regex/Pattern.html

https://kamifuji.dyndns.org/JSupport/JAVA_Regex/Option/index.html

http://javadrive.s25.xrea.com/regex/option/index4.html
macbookでRustの環境構築した際のエラー（os error 17, os error 13）

# はじめに
MacBookを買って、なにか新しいことを始めたいと思い、最近ホットなRust言語に手を出してみました。
まあ、Reactの勉強中ということもあって、本格的には始めませんが、環境構築だけでもやっとくか。と思い、いろいろ試してみるとあまり情報がないエラーが出てきてしまったので、その対処をまとめます。

# 記事を参考に環境構築
環境構築に参考にした記事は以下です。

https://zenn.dev/shogo_wada_pro/articles/365e2710a44f5a

https://zenn.dev/icck/articles/f2e8ecaf6bd8bf

# 発生した問題

非常に参考になったんですが、`rustup-init`を実行してセットアップしようとしたところ、以下のようなエラーが発生しました。
```
error: could not create link from '/Users/hoge/.cargo/bin/rustup' to　'/Users/hoge/.cargo/bin/rustfmt': File exists (os error 17)
```
このエラーは`rustup-init`コマンドを実行してRustをインストールしようとしたときに、既存のファイルやシンボリックリンクが原因で新しいリンクを作成できなかったことを示しているそうですが、私は一度もRustを触ったことがないので、なぜこのようなエラーが出たのか不明です。
このエラーの対処法として、以下のコマンドを実行しました。
```
rm /Users/hoge/.cargo/bin/rustfmt
rm -rf ~/.rustup ~/.cargo
```
その後再度、`rustup-init`コマンドを実行しました。

ところが、次は以下のようなエラーが発生しました。
```
error: could not amend shell profile: '/Users/hoge/.bash_profile': could not write rcfile file: '/Users/hoge/.bash_profile': Permission denied (os error 13)
```

17番エラーから13番エラーに変わったけど、なにがなんやら…
調べてみると権限の問題で書き込みが出来ないというエラーらしく、書き込みの権限を与えるために所有権を変更する必要があるとのこと。
以下のコマンドを実行して、所有者と権限を確認し、書き込み権限がない場合は権限を与えます。
```
ls -l ~/.bash_profile
sudo chown $(whoami) ~/.bash_profile
chmod u+w ~/.bash_profile
```

`.bash_profile`がない場合は、以下のコマンドでファイルを作成し、権限を付与します。
```
touch ~/.bash_profile
chmod 644 ~/.bash_profile
```
その後再度、`rustup-init`コマンドを実行したところ、問題なくセットアップすることができました。

あとは、参考記事のとおり、ターミナルを再起動し、
```
cargo --version
rustc --version
rustdoc --version
rustup --version
```
のコマンドでそれぞれバージョンの確認が取ることができれば完了です。

# まとめ
今回なぜこのような問題が発生したか不明ですが、おそらくインストールしていたパスが良くなかったのかな～と思ってます。
同じような問題で困っている方がいれば参考にしていただければと思います。
とりあえず、環境構築だけ済ませてReactの勉強に戻ります。
それでは！！！
GitHubをもっと便利に！すぐに使えるショートカットテクニック

## はじめに
GitHubを日々の開発で使用している皆さんにとって、操作を効率化する方法を見つけることは非常に重要です。特に、キーボードショートカットを活用することで、時間の節約と生産性の向上が期待できます。
本記事では、GitHubをさらに便利に使いこなすためのキーボードショートカットを紹介します。ぜひ最後までご覧ください！

## Github 便利なショートカット一覧
特に便利なものを抜粋して紹介して行きます。

### 絶対に覚えた方が良いショートカット

#### `?` : ページで使用可能なキーボード ショートカットを一覧表示する
ショートカットは便利ですが、その反面覚えるのが大変な一面もあります。
それを解決してくれるのがこのショートカット。以下画像のようにそのページで使用可能なショートカットを一覧表示してくれます。

![スクリーンショット 2024-07-21 20.28.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2778030/02725fbc-19ed-24f6-4efa-b904c408642a.png)

#### `G + N` : 通知ページに移動
`G`キーのあとに続けて`N`キーを押すことで通知ページに移動できます。

#### `S (または/)` : 検索バーにフォーカス

### リポジトリの画面で便利なショートカット

#### `G + C` : コードのタブに移動

#### `G + I` : Issueのタブに移動

#### `G + P` : Pull requestsのタブに移動

#### `G + A` : アクションのタブに移動

#### `G + B` : Projectsのタブに移動

#### `G + W` : Wikiのタブに移動

#### `G + G` : Discussionsのタブに移動

### ソースコード閲覧中に便利なショートカット

#### `T` : ファイル検索バーにフォーカス

#### `Y` : urlを永続的に使用可能な(commit idが含まれる)urlに展開

#### `B` : Blame表示に切り替え

### Issue / プルリクエストの一覧画面で便利なショートカット

#### `C` : Issue / プルリクエストの作成

#### `A` : アサインでフィルター
自分がアサインされたissueでフィルターしたい時便利です。

### Issue / プルリクエストの画面で便利なショートカット

#### `Q` : レビュワーを指定（プルリクエストのみ）

#### `A` : アサインを指定

#### `X` : 同じリポジトリからのIssueまたはプルリクエストをリンク

#### `Command+Shift+P` : `Write`モードと`Preview`モードを切り替え

## おわりに
どうだったでしょうか？
これ以外にもさまざまなショートカットがあるので、`?`キーや以下のリンクを確認して自身のよく使う操作にショートカットが割り当てられていないか、ぜひ確認してみてください！

https://docs.github.com/ja/get-started/accessibility/keyboard-shortcuts#notifications
【CVPR2024】リアルタイムオープン語彙物体検出の時代到来？（YOLO-World: Real-Time Open-Vocabulary Object Detection）

# YOLO-World: Real-Time Open-Vocabulary Object Detection

(余談)
「YOLO-World」...プログラミング言語の入門時によく用いられる「Hello World」みたいで名前が面白いですよね(著者絶対狙ってる)...

## 概要

この記事では、CVPR 2024に採択された論文「YOLO-World: Real-Time Open-Vocabulary Object Detection」について解説します。この研究は、従来のYOLO（You Only Look Once）シリーズをオープン語彙物体検出に拡張し、高速かつ柔軟な検出を実現しています。

## はじめに

物体検出は、自動運転やロボティクスなど多くの応用分野で重要な役割を果たしています。しかし、従来のモデルは事前定義されたカテゴリーにのみ対応しており、新しいオブジェクトや未知のカテゴリーを検出することができませんでした。YOLO-Worldは、この制限を克服し、実世界での多様なドメインに対応できる新しいモデルを提案しています。

### 図1: YOLO-Worldの概念図
![IMG_1362.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/b5ef1dcd-38f1-c73b-2bc5-4dc68cfdabfb.jpeg)




上図は、YOLO-Worldがどのようにオープン語彙検出を実現しているかを示しています。従来のYOLOと異なり、テキスト入力を受け取り、柔軟な物体検出が可能になっています。

## 提案手法

YOLO-Worldの主要な特徴は以下の通りです：

1. 再パラメータ化可能なビジョン-言語パス集約ネットワーク（RepVL-PAN）
2. 領域-テキスト対比学習による事前学習
3. 効率的な推論のためのプロンプト後検出パラダイム

### 図2: YOLO-Worldの構造
![IMG_1363.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/f7185894-4dde-f240-8029-a4829ad8460f.jpeg)



図2は、YOLO-Worldの全体的な構造を示しています。RepVL-PANがどのようにテキスト特徴と画像特徴を結合しているかがわかります。

## 提案手法の詳細

YOLO-Worldは、従来のYOLOアーキテクチャを基盤としつつ、以下の主要な技術革新を導入しています：

1. 再パラメータ化可能なビジョン-言語パス集約ネットワーク（RepVL-PAN）
   - 画像特徴とテキスト特徴を効果的に結合
   - テキストガイドCSPLayer (T-CSPLayer)を導入し、言語情報を画像特徴に注入
   - 画像プーリング注意(I-Pooling Attention)により画像認識テキスト埋め込みを強化
   - 推論時に再パラメータ化可能で、効率的な展開が可能

2. 領域-テキスト対比学習
   - 大規模データセットを用いた事前学習
   - 検出データ、グラウンディングデータ、画像-テキストデータを統合
   - 領域-テキストペアを用いた対比損失で学習

3. プロンプト後検出パラダイム
   - ユーザーのプロンプトを事前にエンコードしてオフライン語彙を構築
   - 推論時にプロンプトを再エンコードせず、効率的に検出を実行

### 図3: RepVL-PANの構造
![IMG_1365.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/bc69ca6e-3b2f-03f0-1085-5dfa83aa7a28.jpeg)

図3は、RepVL-PANの詳細な構造を示しています。テキストガイドCSPLayerと画像プーリング注意がどのように組み込まれているかがわかります。

4. テキストエンコーダー
   - CLIP事前学習済みTransformerテキストエンコーダーを採用
   - 入力テキストをテキスト埋め込みにエンコード

5. テキスト対比ヘッド
   - オブジェクト-テキスト類似度を計算
   - L2正規化とアフィン変換を用いて安定した学習を実現

6. オンライン/オフライン語彙
   - 学習時はモザイクサンプルごとにオンライン語彙を構築
   - 推論時はオフライン語彙を用いて効率化


## 評価実験

YOLO-Worldの性能評価は、主にLVISとCOCOデータセットで行われました。

### 図4: LVISデータセットでの性能比較
![IMG_1364.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/db031ca4-7ba2-70b2-c51e-7ca713f62c1d.jpeg)



図4は、LVISデータセットでのYOLO-Worldと他の最先端手法との性能比較を示しています。YOLO-Worldが精度と速度の両面で優れていることがわかります。

主な結果：
- LVISデータセットでのゼロショット評価：35.4 AP @ 52.0 FPS
- COCOデータセットでの微調整後：53.3 AP @ 156 FPS

## 結論

YOLO-Worldは、高速性と柔軟性を兼ね備えたオープン語彙物体検出器として、実世界応用に大きな可能性を示しています。今後は、より複雑なシーン理解やマルチタスク学習への拡張が期待されます。

## 批判的分析

YOLO-Worldは印象的な成果を上げていますが、以下の点についてさらなる検証が必要と考えられます：

1. 異なるドメインへの転移性能
2. 長期運用での安定性
3. 非常に稀なカテゴリーに対する性能

これらの課題に取り組むことで、YOLO-Worldの実用性がさらに向上すると期待されます。

---

参考文献: 「YOLO-World: Real-Time Open-Vocabulary Object Detection」, 著者 [Tianheng Cheng, Lin Song, Yixiao Ge, Wenyu Liu, Xinggang Wang, Ying Shan], 掲載会議 [CVPR] 2024.​​​​​​​​​​​​​​​​
Postgres/RedShiftのtimestamp with timezoneについて

## はじめに

先日業務でtimestamp with timezoneのカラムに時刻を投入する機会があり、timestamp with timezoneの扱い方について調べました。

## 認識していた内容と結論

当初下記の様に認識（想像）していましたがこれは誤りです。

- データ投入時のtimezoneを持ったままDBへ保存されているのではないか

正しくはこちらでした。

- ~~データ投入時のtimezoneを持ったままDBへ保存されているのではないか~~ → 投入時に指定した日付データをUTC時刻に変換した上でデータの投入がされる

まずDBにデータを投入する際には、投入対象となるデータをUTC時刻に変換した上でデータの投入がされるため、DBに入っている値は恐らくyyyy-mm-dd hh : mm :ss+00になります。

こちらのデータを取得する際には、セッションやDBユーザに設定されているタイムゾーンを基に、取得結果データの時刻を変換してくれるというのがtimestamp with timezoneなんだと理解しました。

## 例

実際にデータがどうなるか下記で確認します

まずテーブルを作成します。

```sql

postgres=# create table test_timezone(tz_test timestamptz);

```

### ①セッションのタイムゾーンをUTCにしてデータを投入した場合

```sql

-- セッションタイムゾーンをUTCに変更
postgres=# SET SESSION TIMEZONE = UTC;
SET

-- データを挿入する
postgres=# INSERT INTO test_timezone VALUES('2024-07-07 00:00:00');
INSERT 0 1

-- 取得
postgres=# SELECT tz_test FROM test_timzone

-- セッションタイムゾーンがUTCの場合の取得結果
2024-07-07 00:00:00+00

-- セッションタイムゾーンをJSTに変更
postgres=# SET SESSION TIMEZONE = 'Asia/Tokyo';
SET

-- 先ほどと同様のデータを取得
postgres=# SELECT tz_test FROM test_timzone

-- 結果
 2024-07-07 09:00:00+09

 ```

セッションのタイムゾーンが取得結果に適用されることを確認できました。投入時のタイムゾーンをUTCにしていたため、データもUTCで挿入されています。


### ②セッションのタイムゾーンJSTにしてデータを投入した場合

```sql

-- セッションタイムゾーンをJSTに変更
postgres=# SET SESSION TIMEZONE = 'Asia/Tokyo';
SET

-- データを挿入する
postgres=# INSERT INTO test_timezone VALUES('2024-07-07 00:00:00');
INSERT 0 1

-- 取得
postgres=# SELECT tz_test FROM test_timzone

-- セッションタイムゾーンがJSTの場合の取得結果
2024-07-07 00:00:00+09

-- セッションタイムゾーンをUTCに変更
postgres=# SET SESSION TIMEZONE = UTC;
SET

-- 先ほどと同様のデータを取得
postgres=# SELECT tz_test FROM test_timzone

-- 結果
2024-07-06 15:00:00+00

```

セッションタイムゾーンをJSTにした上でデータを投入すると、データがUTCに変換されて格納されていることが確認できました。

## 終わりに

なんとなく苦手意識がありましたが下記だけ気をつければ大丈夫かなと思っています
- 投入時にはUTCへ変換されるため、投入時に適用されているタイムゾーンに注意
- 取得時にはセッションやユーザ、DBのタイムゾーンが適用され、取得結果にそのタイムゾーンが適用される

今後、ユーザ、DB、セッションに設定されるタイムゾーンの優先順位も調べたいと思いました。
【Ruby】ハッシュについて改めて振り返ってみる

こんにちは。あがさんです！！
アプレンティスへの参加を機に定期的に記事を投稿していきます。
どうぞよろしくお願いいたします。
ただの感想文になるかも...

## Rubyを学習していて
Rubyを学習をしていく中で、理解しているつもりでも全然理解していなかったところを記事にして再確認していきます。今回はハッシュについてです。
データの受け渡しに関わるコードを書いているとぶち当たる内容ですよね〜。

このあと簡単なコードで仕組みや振る舞いを再確認していきたいと思います！！

## ハッシュってなに？
ハッシュはキー(key)と値(value)の組み合わせでデータを管理するオブジェクトのことです
```ruby sample.rb
ash_sample = {}
hash_sample = {"key_a" => 1, "key_b" => 2, "key_c" => 3}

p hash_sample # => {"key_a"=>1, "key_b"=>2, "key_c"=>3}
p hash_sample.class # => Hash　　　　　　　　　・・・　Hashというクラスになっている
p hash_sample.length # => 3
```
興味深いのが`p hash_sample.length`の結果が`3`であることからキーと値が一対であることがわかります。

## あれこれ確認してみる
　番号と文字列のペアを配列のみで管理する場合は、配列の中に配列を作る連想配列が手段の一つに挙げられます。学習初期の私は外側の配列のインデックスを指定して、内側の配列のインデックスを指定するという味気ない方法しか知りませんでした。
　
```ruby sample.rb
gw_array = [[1, "Heero"],[2, "Duo"],[3, "Trowa"],[4, "Quatre"],[5," Wufei"]]

p gw_array[0][0] # => 1
p gw_array[3][1] # => "Quatre"
```
**上記の記述をhashの形式に書き換えるとこうなります！↓**
```ruby sample.rb
gw_hash = { 1 => "Heero", 2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}
p gw_hash.keys #=> [1, 2, 3, 4, 5]
p gw_hash[1] #=> "Heero" ← キーに対応した値が出力
p gw_hash["Duo"] #=> nil ← 逆に値からキーを出力できないようです。。。
p gw_hash.values #=> ["Heero", "Duo", "Trowa", "Quatre", "Wufei"]
```
なんだかワンランク上のコードに見えて良き!

ハッシュのキーや値を出力する方法はいくつかあります。
※キーと値は一対となっていますが値からキーを出力できないようです。


```ruby sample.rb
gw_hash = { 1 => "Heero", 2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}

gw_hash_a = {2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei", 1 => "Heero",}
gw_hash_b = { 1 => "Duo", 2 => "Heero", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}

p gw_hash == gw_hash_a  #=>ture
p gw_hash == gw_hash_b  #=>false
```
続いて要素の並び替えをしてみました。`gw_hash_a`はキーと値はそのままに`1 => "Heero"`を最後に配置しました。その後、元の`gw_hash`と比較してみました。返り値はtrueとなるようです。
ただ、キーと値の組み合わせを変えた`gw_hash_b`は流石にfalseとなるようですね..。

```ruby sample.rb
gw_hash = { 1 => "Heero", 2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}


gw_hash[6] = "Zechs"
p gw_hash #=>{1=>"Heero", 2=>"Duo", 3=>"Trowa", 4=>"Quatre", 5=>"Wufei", 6=>"Zechs"}

gw_hash[2] = "Duo Maxwell" #値の変更
p gw_hash.delete(1)  #=> "Heero"　を削除

p gw_hash #=> {2=>"Duo Maxwell", 3=>"Trowa", 4=>"Quatre", 5=>"Wufei", 6=>"Zechs"}
```
追加、編集、削除もこのように行うことができました。何回かコードを書いているとまた新たな発見があるかもしれません。他にも様々な記述方法があるようですが今回は割愛します!!

## よく使いそうな処理
実際に便利だなと感じた処理を書いていきます。
```ruby sample.rb
gw_hash = { 1 => "Heero", 2 => "Duo", 3 => "Trowa", 4 => "Quatre", 5 => "Wufei"}
#eachメソッドで繰り返し処理
gw_hash.each do |key, value|
  puts "#{key}: #{value}"
end
--------------
#出力結果
#1: Heero
#2: Duo
#3: Trowa
#4: Quatre
#5: Wufei
```
keyと値をセットにして出力できます。この処理は実際にコードを書いていく中ですごくお世話になりました。

## まとめ
いかがでしたでしょうか。取り急ぎ書き綴った記事になりましたが、ハッシュについて自分が本当に最初の段階で覚えた内容から今回投稿してみようと思いました。他にはシンボルや配列に変換するなどいろんなことができるテーマだと感じました。頭がパンクしそうなので今回はこの辺にしておきたいと思います。それでは次回もお楽しみ〜!


*~Qiitaの歴史がまた1ページ~*

**参考文献**
・プロを目指す人のためのRuby入門（伊藤淳一 著）
【CVPR2024】リアルタイム物体検出の新境地：RT-DETR

# RT-DETR: DETRs Beat YOLOs on Real-time Object Detection

## 概要
この記事では、CVPR 2024で発表された「DETRs Beat YOLOs on Real-time Object Detection」論文について解説します。この研究では、エンドツーエンドの物体検出モデルであるDETRをリアルタイム処理に適用可能にした新しいモデル、RT-DETRを提案しています。

## はじめに
リアルタイム物体検出は、自動運転やロボット視覚など多くの応用分野で重要な技術です。従来、YOLOシリーズが高速性能で注目されてきましたが、NMS（Non-Maximum Suppression）後処理が必要なことが課題でした。一方、DETRはエンドツーエンドの学習が可能ですが、計算コストが高くリアルタイム処理には適していませんでした。

### 図1: 従来手法とRT-DETRの比較
![IMG_1359.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/1f9a3a85-6b8a-bb79-fdc2-7dadc584f04f.jpeg)



図1は、YOLOv5、YOLOv8、そしてRT-DETRの速度と精度のトレードオフを示しています。RT-DETRが両面で優れていることがわかります。

## 提案手法
RT-DETRは以下の主要な特徴を持ちます：

1. 効率的なハイブリッドエンコーダ
2. トップKクエリ選択
3. 柔軟なデコーダ構造

### 図2: RT-DETRのアーキテクチャ
![IMG_1360.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/32c938e8-b072-5550-4006-d116fab041fd.jpeg)



図2はRT-DETRの全体アーキテクチャを示しています。バックボーン、ハイブリッドエンコーダ、クエリ選択、デコーダの流れがわかります。

### 効率的なハイブリッドエンコーダ
AIFIとCCFFという2つのモジュールで構成されています：
- AIFI: 高レベル特徴マップにself-attention機構を適用
- CCFF: 異なるスケールの特徴マップを融合

### トップKクエリ選択
エンコーダ出力から最も確信度の高いK個のクエリを選択します：

```python
_, topk_ind = torch.topk(enc_outputs_class.max(-1).values, self.num_queries, dim=1)
```

### 柔軟なデコーダ構造
デコーダ層数を動的に調整可能で、速度と精度のバランスを柔軟に変更できます。

## 評価実験

### 図3: COCO val2017での性能比較
![IMG_1361.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2610305/7d074cbf-1316-419e-ea97-323eb38cc371.jpeg)



図3はCOCO val2017データセットでのRT-DETRと他のモデルの性能比較を示しています。

主な結果：
- RT-DETR-R50: 53.1% AP, 108 FPS
- RT-DETR-R101: 54.3% AP, 74 FPS

YOLOv8-Lとの比較：
- 精度: +0.2% AP
- 速度: +52.1% FPS

同じ精度で速度が2倍になっていることがわかりますね。

## 結論
RT-DETRは、DETRアーキテクチャをリアルタイム物体検出に適用することに成功し、YOLOシリーズを上回る性能を達成しました。効率的なエンコーダ設計と動的クエリ選択により、高速かつ高精度な検出が可能になりました。

今後の課題として、小物体検出の精度向上や、より多様な環境での評価が挙げられます。RT-DETRは、自動運転やロボット視覚など、リアルタイム性能が求められる多くの分野での応用が期待されます。

---
参考文献: 「DETRs Beat YOLOs on Real-time Object Detection」, 著者 [Yian Zhao, Wenyu Lv, et al.], 掲載会議 [CVPR] 2024.
SEの本質

# SEの本質

![title](https://raw.githubusercontent.com/legitwhiz/legitwhiz.github.io/master/technology_memo/images/1000007568.jpg)

## ●誰でもできる仕事をしていませんか？

### 思い描いていた将来

・ITが好きで、いつかGoogleやFacebookのような、世界を変えるサービスを作りたい！
・ITの力で、世の中をもっと便利にしたい。
・自分のアイデアを形にして、人の役に立つサービスを作りたい。

### 現実は？

そんな想いをもってエンジニアを志し、IT業界に入ったものの、実際にやる仕事はというと…

・ひたすらテストを繰り返し、画面のキャプチャを撮る。
・設計とは程遠いドキュメントばかり作っている。
・下請け企業の人間の管理業務ばかりしている。
・プロジェクトの進行管理ばかりしている。

などなど、美しいコードを書いたり、新しい技術を取り入れサービスを改善していくような、IT本来のクリエイティブな姿とは縁遠い「誰でも出来る作業」ばかりしている。

そんな悩みをお持ちのSEの方、多いのではないでしょうか？

SEの本質は、多くの人の生活を便利にしたり、世の中に大きなインパクトを与えたり、技術力で貢献するのが本来の役割なはずなのに…

それなのに、目先の利益しか考えていない一部の人間のせいで、優秀なSEたちが本来の実力を発揮することもなく、多重下請け構造の劣悪な環境で使い潰されていく。

### SEの需要

優秀なエンジニアが、自由に、好きなだけその才能を発揮出来るようになってほしい！

今、IT業界ではどこの会社もエンジニアが足りていません。そして、その状況は今後しばらく続くでしょう。

しかし、ITの爆発的な普及と、それに伴うエンジニアへの需要の増大の恩恵は、すべてのエンジニアに平等にもたらされることはありません。

需要が増え、引く手あまたとなるのは、スキルのある上位何パーセントかの限られたエンジニアだけです。

### SEの本質は

ひたすらテストや下請けの管理等と誰でも出来る仕事などの作業ばかりしているようなSEは、いずれシステム化され干されてしまうでしょう!!

問題は、技術力がありクリエイティブなSEになるかということなのです。

SEの将来性は、日々の仕事を通じて、いかに将来性のあるスキル・経験を身につけられるかということこそが重要となるのです。

プレイヤー・マネージャーのいずれの立場であっても、ITを使って価値のあるモノを生み出すことができる人材のみが生き残るのです。

あなたが若手のSEなら、上司や先輩たちから
「まずは出来る事を積み重ね、仕事の意味を理解するまでは3年は言われた事やっていろ」
なんて言われた事ありませんか？

でも、SEの主な仕事である、各種ドキュメント作成や下請けの管理などの仕事は、いくらやってもあなたのエンジニアとしての価値にはほとんど結びつきません。

アプリやサービスの企画を作り、実際に試作品を自分で実装したり、客の業務改善のレベルからコンサルティングを行い、システムに落とし込んだような経験が無いと、本当に意味での価値にはなりません｡

以上を常に意識し、日々の仕事に打ち込むこと!!

まあ、偉そうなこと書いてますが、私も若いうちはできていないことばかりです。
今、若い世代に頑張って欲しいというエールだと思って受け止めてください。
TryHackMeやるといっていた人がようやくHackerランクになった話


:::note info
この記事の中身
・2024年10月に開始したTryHackMeの日記
・どれくらいやればHackerランクになるかの軽い目安
・これからの学習の方針
:::
去年12月の[この記事](https://qiita.com/tsukamoto_yadonnnn/items/6d8f4b4c73081646ec1a
)を最後にTryHackMeでの学習について全く残せていませんでした。ランクがHackerになったこともあり学習の記録を残そうといった記事になります。

**ただしこの記事を書いてから公開するのを忘れて5か月放置していました、、
またゼロから書き直すのももったいないので、記事はそのままで後ろの方にTryHackMeで現在実施しているお得なクリスマスイベントについて記載することにします。**

https://x.com/start_sec/status/1814949184031883441

## 目次
- [学習の記録](#学習の記録)
- [どれくらいの数こなしたか](#どれくらいの数こなしたか)
- [ランクの上昇幅](#ランクの上昇幅)
- [今後の学習について](#今後の学習について)
- [おまけ_Advent of Cyber 2024](#おまけ_advent-of-cyber-2024)



## 学習の記録
今までの活動はこんな感じです。法事で160日の連続記録が途切れてからは週末にちょっとやる程度に落ち着いています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/d489d78c-f993-af92-6589-a41b7a9e651f.png)




## どれくらいの数こなしたか
コンプリートした部屋は37個です。
12月のこの記事では15個なので、一か月で2つ完了するぐらいのペースです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/7899a739-4aff-781c-510d-449cbbdaac5e.png)


## ランクの上昇幅
144462位で上位13%らしいです。資格取得や英語学習に逃げてモチベーションが上がらずあまりやっていないのも響いているのか、上昇幅は少ないですね。


**2023/11/27(8か月前)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/b7d7d6ff-a285-be6f-8c3d-de3ce92b7505.png)

**2024/7/21(現在)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/b9a8e702-88c0-57f3-9e9f-46c4051cc54d.png)




## スキルマトリクス
特に意図したつもりはなかったのですが、特権昇格が高くなっています。
今後はWindowsマシンを積極的にやっていく必要があるなといった印象です。
いまは10分詰まったらウィークスルーで次の一手をカンニングしているので、そのうち何も見ずにサクサク進められるようになればいいなとは思ってますが、毎度初期侵入でめちゃめちゃカンニングしているのでまだまだ先な気はします。


**2023/11/27(8か月前)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/fda1bbc2-81fd-d802-5f22-1f33d6587496.png)

**2024/7/21(現在)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/12957115-5bd6-0ef6-d6f4-fa3fc89347e4.png)




## 今後の学習について
もともとOneNoteでチートシートを作成していたのですが、検索機能がダメダメすぎてObsidianを使うようになりました。Linuxのマシンについてはそこそこまとまってきてチートシートだけでもある程度は進められるくらいにはまとまってきました。
これからはWindowsについてまとめられたらなと思います。
（無料で何人かで共有できるんだったら全員編集可能にしてみんなで作り上げた方が楽なんですがね、、）
※ObsidianはQiitaと同じくMarkdown方式なのでQiitaにそのままコピペできるのもうれしいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/afb07dd1-70ec-ec66-153f-1c7fae6ac294.png)

## おまけ_Advent of Cyber 2024
半年前の話を長々とするのもちょっと嫌なので、現在実施中のイベントの紹介です。
ざっくり言ってしまうと、1問でも問題を解くと賞品が当たる抽選会みたいなルームになります。
商品の合計金額は100,000ドル以上で、タスクを進めれば進めるほど当選の可能性が上がるとのことです。
参加は無料ですべてのタスクにyoutubeのウォークスルーが付いているので初心者でも気楽に参加できます。
商品に興味のある方は12/31までに問題を解いてみてはいかがでしょうか。

https://tryhackme.com/r/room/adventofcyber2024



12/20の23:00現在、自分はDay9まで実施。
年末のタイミングで全部のタスクを完了を目指せればなぁ。といった進捗具合です。
ブルー寄りなタスクからレッド寄りのタスクまで幅広くあって、初心者用ルームというだけあって手順通りに進めていけばフラグが手に入ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/f5b3e54e-f11f-fc60-a57c-eafe38dc6dcd.png)


<font color="Lavender">先月、英語を本格的に学ぼうと思ってabceedの年間プランに課金しました。ただ最近だれてしまって平日に勉強するモチベーションが下がっています。年末まで平日でも学習習慣を付けられるように頑張ります</font>




## おまけのおまけ（結果発表）

いい感じのものは当たりませんでしたが、3か月分のサブスクが当たりました。
また機会があればチャレンジしたいです。
![THMプライズゲット.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3588702/614eeead-4a56-44fc-5bf4-96bde204d7af.png)
未経験文系エンジニアの1年の過ごし方と学んだこと

<h1>はじめに</h1>
この記事7月で私が未経験からエンジニアになってちょうど1年が経つので、自身の経験の棚卸もかねてこれからエンジニアになるかもしれないという方の参考になれば幸いです。
<h1>自己紹介</h1>
・20台半ば
<br>・Sier＆SES企業中途入社2年目</br>
<br>・私立文系</br>
<br>・入社時プログラミング経験皆無</br>
<h1>入社から1年</h1>
<br>入社してからの1年間では大きく分けて<b>研修</b>と<b>業務</b>の2つを経験しました。</br>
<ul>
    <li><b>研修</b></li>
    研修期間は<b>約3か月間</b>でした。学習内容としてはJava, HTML, CSS, JS, SQL全般, SpringBootの学習を行いました。
    <br>基礎的な技術を身に付けた後に、Webアプリケーション開発などの実践的な演習で応用を身につけることができました。個人的にしんどかったのはSpringBootの内容に入った時でした。なにを言っているかチンプンカンプンで本当に泣きそうになりながら学習していたのを思い出します。。。</br>
    <li><b>業務</b></li>
    初業務はJava言語でのWebアプリケーションの機能追加(DX対応)でした。
    <br>基本設計書作成</br>
    <br>↓</br>
    <br>詳細設計書作成</br>
    <br>↓</br>
    <br>製造</br>
    <br>↓</br>
    <br>単体テスト(仕様書作成含む)</br>
    <br>↓</br>
    <br>結合テスト(仕様書作成含む)</br>
    <br>と初業務ながら様々な工程の経験をさせてもらいました！</br>
</ul>
<h1>やってよかったこと</h1>
    <ul>
        <li>質問力を上げる</li>
        <br>
            まず、わからないことを先輩に質問することは当然なのですが、最初はその質問の仕方が正しいかどうかを考えていませんでした。
            <br></br>
            <br>例えば、「●●の処理の書き方が分からないんですけど、、、」では、自身が知りたい
            情報へのヒントが少なすぎますし、ちゃんと調べたの？具体的にどうわからないの？などと思われてしまいかねません。</br>
            <br>
            <br>正しい質問の仕方としては、「●●の動作の実装行いたいのですが、既存の設計書や△△といったサイトを参考にして××という方法を見つけて、自身で実装したのですが□□の箇所がうまく動作しません。ですので該当箇所を教えてください。」というように、</br>
            <br><b>わからない内容</b>、<b>参考にしたもの</b>、<b>自分で試したこと</b>の最低でもこの3つのことを盛り込んで質問をするとスムーズなやり取りができました。</br>
            <br>
            <br>質問の仕方はエンジニアに限ったことではありませんが、お恥ずかしながら社会人1年目の私はこのことを知らなかったため、非常に勉強になり自身の成長にもつながりました。</br>
            <br>
            <br>
            <li>体系的知識の習得</li>
            <br>
            初めのころは業務に関係のある知識の習得を優先していましたが、業務をこなしていくうちに所々で業務外の知識を問われたりすることが増えました。そこでITの基礎的な知識を身につけるべく、登竜門ともいえる基本情報技術者試験に向けて学習を始めました。</br>
            <br>
            <br>取得するまでの学習で業務では学び得なかった様々な知識を取得することができ、業務に応用することができました。</br>   
    </ul>
<h1>やっておいたほうがよかったこと</h1>
    <ul>
        <li>興味のある分野の学習</li>
        <br>業務に関する自主学習は行っていたのですが、興味のある分野の学習に手が回っていませんでした。</br>
        <br>やはりプログラミングの原動力は興味のある分野だと考えているので、その分野のことを蔑ろ良してはモチベーションも上がらないと思います。</br>
        <br></br>
    </ul>
    <h1>さいごに</h1>
    社会人＆エンジニア1年目は右も左もわからず悪戦苦闘した1年間でした。ただ、この1年間で大きく成長できたと思います。
    <br>自身の経験が誰かの役に立てばうれしく思います。ここまで読んでいただきありがとうございました！
安価なコワーキングスペース（東京都、ドロップイン利用可能）

ドロップイン利用で一日2000円以内のところをピックアップしました。

情報が変わっていたり、貸切対応やイレギュラーで営業していない場合も考えられるため、
サイトや電話にて確認されてから行かれることをお勧めします。


### <font color="#1e90ff">Startup Loft Tokyo</font>
https://aws-startup-lofts.com/apj/loft/tokyo
最寄駅:目黒
条件:AWS アカウント IDをお持ちのスタートアップ、デベロッパー
料金:無料
営業:平日 10:00〜18:00

### <font color="#1e90ff">FFFFF Cafe</font>
https://fffff-cafe.com
最寄駅:神田、淡路町
料金:500円〜（ワンドリンクから利用可能）
営業:平日 15:00〜21:00

### <font color="#1e90ff">LIFORK秋葉原Ⅱ</font>
https://lifork.jp/akihabara2/share.html
最寄駅:秋葉原
料金:5分～14分165円、1日最大1,980円
営業:9:00～21:00

### <font color="#1e90ff">Lightningspot(ライトニングスポット)</font>
https://lightningspot.com
最寄駅:渋谷
料金:1,000円(混雑時NG)
営業:10：00～19：00


### <font color="#1e90ff">Coin Space 渋谷公園通り店</font>
https://coinspace.jp/shops/3
最寄駅:渋谷
料金:30分毎220円、1日最大1,650円
営業:月曜日 9:00-17:00 、火〜日 9:00-20:30

### <font color="#1e90ff">コワーキングスポット赤坂</font>
http://coworking-spot.jp/akasaka
最寄駅:赤坂見附
料金:30分300円 、1日最大1,500円 / 人
営業:平日 9:00〜20:00

### <font color="#1e90ff">ニュー新橋コワーキング</font>
https://www.nscow.com
最寄駅:新橋
料金:30分150円、1日最大1,000円
営業:平日10：00～17：00 （ドロップイン可能時間）


### <font color="#1e90ff">アイビーカフェ ネイバー&ワーク 西早稲田</font>
https://www.ivycafe.jp
最寄駅:早稲田
料金:税込539円/回（エントリープラン）
営業:7:00〜23:00
お気に入りを検索するChrome拡張が便利だった

同じサイトを何回も訪問するために、お気に入り登録する人は多いと思います。しかし、登録したお気に入りを分類して、ブックマークからずらりと並んでいる中からいちいち開くのは微妙に不便だと感じていました。なんとかテキストで検索できないかと思っていたところ、ドンピシャのChrome拡張を見つけました。

https://chromewebstore.google.com/detail/dhnahdpjgnphiglnbijfoafjdokkbclk?hl=ja

### 使い方
Ctrl+Shift+Sを押すことで起動できます。

こんな感じでテキストを入れるとブックマークを検索できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563801/a983c348-3313-49d2-1af3-f043121a94dc.png)


また、ブックマークの編集や削除を簡単にできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3563801/6f09b7fa-394f-a9b6-0de9-f9af3164b4f4.png)

機能としてはシンプルなのですが、痒い所に手が届く拡張だと思います。
ProxmoxのサーバのIPアドレスを変更する

　自宅ネットワークの変更工事をすることとなり、Proxmoxサーバを別ネットワークへ配置転換しました。サーバのIPアドレスが変更されたことから、当然のことながらWEBブラウザからリモート接続ができなくなりました。
　今回もお約束通りコテコテして、IPアドレスを変更しましたので、そのときの手順を記録に残します。

手順
１　Proxmoxサーバにモニターとキーボードを接続し、サーバを起動します。
 （このときに何とも言えない敗北感を感じるのは、私だけでしょうか。サーバのIPアドレスを変更することになる自分のネットワーク計画への見通しのなさを感じます。）

２　サーバが起動したら、rootでログインします。
３　下記２つのファイルを修正します。
　　ここがポイント！
　　　　/etc/network/interfaces
  　　　　/etc/hosts
４　編集は、nanoをつかいました。
５　#nano /etc/network/interfaces の編集時の画面イメージ。
![interface2 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832918/bd96ce40-6252-878c-3ef0-6965f6aa6b88.png)
実際の画面はスクリーンショットが取れないので、イメージです。

６　同様に#nano /etc/hosts の編集時の画面イメージ。 
 ![hosts2 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3832918/d5e4f6ae-a63c-b50b-4b38-e205c3822c00.png)
 
７　それぞれの設定が完了したら、WEBブラウザからリモートで接続してみましょう。
　　うまくいったら完了です。
GitHub Actions で CloudFormation template の Linter の実行

CloudFormation の template にも Linter があることを知ったので、記事にしておきます。
※ [CloudFormation のベストプラクティス](https://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/best-practices.html#shortenfeedbackloop)に Linter が記載されていました。

## install

Linter（cfn-lint） は Python で実装されているため、 [Python](https://www.python.org/downloads/) が必要となります。

```cmd
pip3 install cfn-lint
```

## cfn-lint

試しに、未使用の Parameter（ExistingVPC）があるテンプレートファイルに cfn-lint を実行してみます。

```template/sample.yml
AWSTemplateFormatVersion: '2010-09-09'
Parameters:
  ExistingSecurityGroups:
    Type: List<AWS::EC2::SecurityGroup::Id>
  ExistingVPC:
    Type: AWS::EC2::VPC::Id
    Description: The VPC ID that includes the security groups in the ExistingSecurityGroups parameter.
  InstanceType:
    Type: String
    Default: t2.micro
    AllowedValues:
      - t2.micro
      - m1.small

```

下記のように、５行目の ExistingVPC が未使用という指摘が出ます。

```cmd
$ cfn-lint template/*.yml
W2001 Parameter ExistingVPC not used.
template/sample.yml:5:3

E1151 '!Ref ExistingVPC' is not a 'AWS::EC2::VPC.Id'
template/sample.yml:56:7
```

## GitHub Actions

GitHub にテンプレートを push した時に、cfn-lint が実行されるように GitHub Action を設定します。

```.github/workflows/test.yml
name: CloudFormation lint

on:
  push:
    branches:
        - '**'
    tags-ignore:
        - '**'

jobs:
  cfn-lint:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout
      uses: actions/checkout@v3

    - name: Install cfn-lint
      shell: bash
      run: pip3 install cfn-lint

    - name: cfn-lint
      shell: bash
      run: |
        cfn-lint template/*.yml
```

Push 時に cfn-lint が実行され、テンプレートファイルに指摘がある場合は、エラーとなります。

![スクリーンショット 2024-07-21 19.46.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254520/95ca73f6-8d04-39ae-262c-3fd3d0a5b270.png)