OmniAICreator/Qiita-1.07M huggingface dataset:
VisionKitで四角がずれて表示される

# はじめに

VisionKitで物体認識を行う際、boundingBoxがうまく表示されないことがあります。

原理は簡単ですが直し方が難しいので、コードでまとめておきます。

# 四角がうまく表示されない

今回は **トマトを検出する** アプリを参考にします。
こちらのアプリの作り方は以下の記事を参照：

https://qiita.com/AS_atsushi/items/cc71a30460ea5cd020fa

ここで、以下のようなコードで検出された部分に四角を描画しようとします。

```swift
func drawBoundingBoxes(on image: UIImage, with observations: [VNRecognizedObjectObservation]) -> UIImage? {
    let renderer = UIGraphicsImageRenderer(size: image.size)
    
    let annotatedImage = renderer.image { context in
        image.draw(at: .zero)
        
        let ctx = context.cgContext
        ctx.setLineWidth(2.0)
        
        for observation in observations {
            let boundingBox = observation.boundingBox
            //描画する四角を生成
            let rect = CGRect(
                origin: CGPoint(
                    x: boundingBox.origin.x * image.size.width,
                    y: boundingBox.origin.y * image.size.height
                ),
                size: CGSize(
                    width: boundingBox.width * image.size.width,
                    height: boundingBox.height * image.size.height
                )
            )
            
            ctx.setStrokeColor(isFresh ? UIColor.green.cgColor : UIColor.red.cgColor)
            
            ctx.stroke(rect)
        }
    }
    
    return annotatedImage
}
```

しかしこれだと、若干ズレた位置に描画されてしまいます。

![スクリーンショット 2024-12-17 20.24.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/dfc0f5cf-fb0f-38b4-0fba-63e7b82207dc.png)

# 原因

実は、`VNRecognizedObjectObservation`で得られる四角の座標系と、CGImageの座標系は **異なります！**

![IMG_8B48DC6C290F-1.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/55db8864-d49e-312b-fe4c-df420daf0abd.jpeg)

このため座標が狂ってしまっています。

また、**UIImageをCGImageに変換する際に向きの情報が失われる** ことがあります。

これにより、**座標系がごちゃごちゃになっている** ことがうまく描画されない原因です。

# 解決方法

四角を生成するコードを変更します。

```swift
let rect = CGRect(
    x: boundingBox.minX * image.size.width,
    y: (1 - boundingBox.maxY) * image.size.height,
    width: boundingBox.width * image.size.width,
    height: boundingBox.height * image.size.height
)
```

こうすることで、正しい位置に表示することができます！

# まとめ

このあたり、Appleが公式で変換用のコードを用意してくれたらいいのに…とずっと思ってます。
CloudFrontのログをCloudWatch Logsに出力して集計してみた

## はじめに

CloudFrontのログがS3以外に、Amazon CloudWatch Logs と Amazon Data Firehoseに送信することができるようになったので、CloudWatchにログを送信して使ってみます。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/amazon-cloudfront-log-formats-destinations-access/?nc1=h_ls

## ログの設定方法

CloudFrontの設定画面に新しくLoggingの項目が追加されました。
ここから作成していきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/68863e3d-2e40-9342-3962-508c703511ed.png)

作成画面のダイアログが表示された後は、ログの出力先・内容を指定します。

1. 右上の「作成」ボタンをクリックしてロググループ作成（既に作成済みならスキップ）
1. Destination log groupの箇所で、ロググループを選択
1. フィールド選択で出力する項目を選択
1. Output formatでフォーマットを選択（ログ調査するならJSONが良い）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/284278/3ea0794c-dfae-4f0f-79d3-011acb136238.png)

以上で設定は完了です。
これで、試しにアクセスするとCloudWatchのログに出力されているのが確認できます。

## ログインサイトで集計

CloudWatchにログを出力する目的は、基本的にはログを調査するためになるのでログのインサイトで集計もしてみます。

HTTPステータス500系のログを調査する場合は以下で確認できます。
※JSONのフィールド名にハイフン（-）が使われているのでバッククォート（`）で囲む必要があります

```
fields @timestamp, `c-ip` as ip, `sc-status` as status, `cs-method` as method, `cs-uri-stem` as path, `cs(User-Agent)` as ua
| filter status like /^5[0-9]+$/
```

### 500系のログの件数を集計

```
fields @timestamp, `c-ip` as ip, `sc-status` as status, `cs-method` as method, `cs-uri-stem` as path, `cs(User-Agent)` as ua
| filter status like /^5[0-9]+$/
| stats count(*) by status
| sort status asc
```

### method＆pathごとの件数集計

```
fields @timestamp, `c-ip` as ip, `sc-status` as status, `cs-method` as method, `cs-uri-stem` as path, `cs(User-Agent)` as ua
| stats count(*) as count by method, path
| sort count desc
```

## その他
CloudFrontのログに使われているフィールドは、以下から確認できます。

https://docs.aws.amazon.com/ja_jp/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html#LogFileFormat:~:text=%E3%82%B9%E3%83%9A%E3%83%BC%E3%82%B9-,%E6%A8%99%E6%BA%96%E3%83%AD%E3%82%B0%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%83%95%E3%82%A3%E3%83%BC%E3%83%AB%E3%83%89,-%E3%83%87%E3%82%A3%E3%82%B9%E3%83%88%E3%83%AA%E3%83%93%E3%83%A5
Warpを使おう！ - ホットキーの設定方法 -

# はじめに
**ターミナルって使いづらいですよね！！！**
そこで、現代の最強ターミナル、Warpを紹介します。

# Warpとは？

Warpは、AI機能を搭載したRustベースのターミナルアプリです。

https://www.warp.dev/

無料で使うことができる他、AIによる自動補完や自然言語での命令が可能です。また、ホットキーの設定によって画面にすぐにターミナルを表示できるようになります。

![スクリーンショット 2024-12-12 22.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/e6b395c1-3379-84cb-b747-ec21de456266.png)

# ホットキーを設定しよう

まずはWarpを開き、`⌘+,`を押します。`Features`から`Keys`を探し、以下のように設定してください。

![スクリーンショット 2024-12-12 22.37.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/d7f4d391-935d-2e0c-a027-ad6fcc1dc9ab.png)

ここで、以下に留意してください。
- `Left Option key is Meta`が選ばれているか
- `Keybinding`に**ESC、BACKTICK、TAB、SHIFT、CAPS**が含まれていないか
- 入力モードが英語（ABC）になっており、**日本語の英字にはなっていないか**
- 設定の`プライバシーとセキュリティ > アクセシビリティ`でWarpが選択されているか

これらに気をつけないとホットキーがうまく使えません…

それでもホットキーが設定できなければ、**Warpアプリを再インストール**してください。（私はこれでホットキーが使えるようになりました）

# 見た目の設定

また、画面の透明度を下げることで画面上部に表示される際見やすくなります。
以下の`Window Opacity`を調節することで透明度を設定できます。

![スクリーンショット 2024-12-12 22.43.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/d6b262f7-f2b3-b8ac-a3b7-e448b3de6abd.png)

以下のように表示できるようになったら成功です！

![スクリーンショット 2024-12-12 22.35.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/e6b395c1-3379-84cb-b747-ec21de456266.png)

# まとめ

Warpを使うことで、gitの操作やdockerの操作などがとても楽になります。
特にホットキーの設定は詰まっている人が多いようだったので、この記事が参考になればと思います。
SwiftUI×macOSで、選択したPCのファイルを編集する方法

# はじめに
macOSアプリでは、PCファイルを編集できる機能がとても大事になってきます。
そこで今回は、ユーザーが指定したファイルの中身を書き換える方法をまとめていきます。

# ユーザーが指定したファイルを書き換える

今回は単純に`.txt`ファイルの編集を行うとします。（設定を変更することで様々な形式のファイルを編集できるようになります）

まずは`TARGET > Signing & Capabilities > App Sandbox`の`File Access`で、`User Selected File`を`Read/Write`にします。

![スクリーンショット 2024-12-10 0.05.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/e75fccfb-05b7-701c-be10-aa5e8cb1158e.png)

```swift
import SwiftUI
import AppKit

struct ContentView: View {
    let text = "hello, world"
    
    var body: some View {
        Button {
            let panel = NSOpenPanel()
            panel.allowsMultipleSelection = false
            panel.canChooseDirectories = false
            panel.canChooseFiles = true
            panel.allowedContentTypes = [.plainText]
            
            panel.begin { response in
                if response == .OK {
                    guard let fileURL = panel.url else { return }
                    
                    do {
                        try text.write(to: fileURL, atomically: true, encoding: .utf8)
                    } catch {
                        print(error.localizedDescription)
                    }
                }
            }
        } label: {
            Text("テキストを変更する")
        }
    }
}
```

実行すると以下のようなウィンドウが表示され、ファイルを選択できるようになります。

![スクリーンショット 2024-12-10 0.03.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/7a6bd3a6-7323-289b-d160-9b4b91e0d489.png)

## 選択できるファイルの設定方法

表示されるパネルが
- 複数選択可能か
- ディレクトリ（フォルダ）を選択可能か
- ファイルを選択可能か
- どのようなファイルが選択可能か（`.png`など拡張子も指定可能）

をここで設定します。

```swift
let panel = NSOpenPanel()
panel.allowsMultipleSelection = false
panel.canChooseDirectories = false
panel.canChooseFiles = true
panel.allowedContentTypes = [.plainText]
```

# まとめ
macOSのアプリもみんな作っていきましょう！
FirestoreのCodableでdocumentIDをいじるとエラーが出る

# はじめに

Firestoreで以下のようなstructを作っているとします。
```swift
struct User: Identifiable, Codable, Equatable {
    @DocumentID var id: String?
    var name: String
    var email: String
}
```

そのときにこんなエラーが出てきます…

>Attempting to initialize or set a @DocumentID property with a non-nil value: "D87EAD42-7B52-4510-929D-2414B9DB4E66". The document ID is managed by Firestore and any initialized or set value will be ignored. The ID is automatically set when reading from Firestore.

`@DocumentID`に値を設定するな、ということらしいです。

# 修正方法

おそらくどこかに、このようなコードがあります。

```swift
let user = User(id: UUID().uuidString, name: "name", email: "email")
```

要するに、`@DocumentID`に他の値を代入するな！ということらしいです。

そうなると **テスト用のダミーデータの作成** などが大変ですが、それはテスト用の構造とstructを別で作成して回避しましょう。

# まとめ
なんだかんだこのエラーに悩まされたので備忘録として書きました。テストケースの生成には気をつけよう！
ChatGPTのAPIを使えるようにしよう

# はじめに

**ChatGPTのAPI、使いたいですよね！！**
そんなあなたに、まずはOpenAI APIの登録方法から伝授します！

# アカウント作成

まずは**OpenAI API**と調べましょう。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/8814cbff-53b4-0335-47d2-0a0e58d01add.png)

一番上の**OpenAI API**を選んだら、**Sign Up**をクリックします。

![2.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/dd94cc34-dc72-b115-574c-30f70655fd1d.jpeg)

**アカウントの作成**と出てきたら、今回は**Googleで続行**を選択します。

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/54d236ff-e404-c24e-c74e-4948b830a57f.png)

用いるアカウントを選択しましょう。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/4b7d267f-9dea-0848-3f45-77d88bde3ea4.png)

このような画面が表示されたら**アカウント作成成功**です！

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/5ad1a39b-26c2-f783-37dd-a92b3848ee95.png)

# APIを使えるようにしよう

まずは**右上の歯車**をクリックします。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/0b66ed0b-3a89-68da-849e-8dbc5e2e577e.png)

次に画面左の**API Keys**をクリックします。

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/fdef631a-ad62-f844-df95-8eb214747512.png)

真ん中の**Create new secret key**を選択します。

![8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/f69e8887-f3bd-3b8c-3c3c-4f812e3e9cdf.png)

**キーの名前**（ChatGPTを使いたいアプリの名前などを入れましょう）、**Project**（一番上のDefault projectなどを選びましょう）を選択し、**Create secret key**をクリックします。

![9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/bd235869-8d33-a907-a745-2fe4e65b3d4c.png)

このような画面に長い文字列が表示されたら、それがこれから使っていくAPIキーになります！誰にも見せないように保存しましょう。

![10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/2db993e4-7111-49c6-2977-974fd25c16d1.png)
macOSでListの背景色を透明にする

# はじめに

SwiftUIでmacOSアプリを開発する際にはiOSアプリ作成とは勝手が違うことが多いです。
今回は、Listの背景色がmacOSだと白くなってしまう問題に対処していきます。

# 背景色がある

例えばこのようなアプリを作っているとします。

```swift:ContentView
struct ContentView: View {
    var body: some View {
        VStack {
            List(0..<3) { num in
                Text(String(num))
            }
            .frame(width: 800, height: 600)
        }
        .background(Color.red)
    }
}
```

ここで、VStackの背景色は赤のはずなのに、背景色は白いままです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/75c1478f-a1d6-b025-3f3a-56d3c1934124.png)

これは、macOSだとListにデフォルトで背景色がついていることが原因です。

# 背景色を消す方法

以下のmodifierをつければ解決します！

```swift:ContentView
struct ContentView: View {
    var body: some View {
        VStack {
            List(0..<3) { num in
                Text(String(num))
            }
            .scrollContentBackground(.hidden)
            .frame(width: 800, height: 600)
        }
        .background(Color.red)
    }
}
```

こうすると背景色が透明になります！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2823873/af734cd7-3ea8-ed3f-8dc1-2a8a4a58be06.png)

また、`NavigationStack`に対しても成り立ちます。

```swift:ContentView
struct ContentView: View {
    var body: some View {
        VStack {
            NavigationStack {
                List(0..<3) { num in
                    NavigationLink {
                        EmptyView()
                    } label: {
                        Text(String(num))
                    }
                }
            }
            .scrollContentBackground(.hidden)
            .frame(width: 800, height: 600)
        }
        .background(Color.red)
    }
}
```
extend

# extendによってモジュール内のメソッドをそのクラスの特異メソッド(クラスメソッド)にすることができる
```rb
irb(main):001* module Loggable
irb(main):002*   def log(text)
irb(main):003*     puts "[LOG] #{text}"
irb(main):004*   end
irb(main):005> end
=> :log
irb(main):006* class Product
irb(main):007*   extend Loggable
irb(main):008*
irb(main):009*   def self.create_product(names)
irb(main):010*     log 'create_product is called.'
irb(main):011*   end
irb(main):012> end
=> :create_product

irb(main):013> Product.create_product
(irb):9:in create_product': wrong number of arguments (given 0, expected 1) (ArgumentError)

irb(main):014> Product.create_product([])
[LOG] create_product is called.
=> nil
irb(main):015> Product.create_product("")
[LOG] create_product is called.
=> nil
irb(main):016> Product.log("Hello")
[LOG] Hello
=> nil
irb(main):017>
```
# クラス構文直下でextendされたモジュールのメソッドを使うことができる
```rb
irb(main):001* module Loggable
irb(main):002*   def log(text)
irb(main):003*     puts "[LOG] #{text}"
irb(main):004*   end
irb(main):005> end
=> :log
irb(main):006* class Product
irb(main):007*   extend Loggable
irb(main):008*
irb(main):009*   log 'Defined Product class.'
irb(main):010> end
[LOG] Defined Product class.
=> nil
```
10ヶ月の空白を経て目の当たりにしたHubbleの変貌

これは[Hubble Advent Calendar 2024](https://qiita.com/advent-calendar/2024/hubble)の5日目[^1]の記事です。

# はじめに
2022年1月から2023年12月までHubbleでフロントエンド開発を担当していた@beltway7です。
一時的に離れた後、今年の10月に戻ってきました。10ヶ月のブランクを経て、Hubbleの進化に驚かされた私の体験を共有します。

ちなみに10ヶ月ぶりにHubbleへ復帰した時に、あまりに変化が大きく、浦島太郎になった気分でした。

![浦島太郎の気分](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/5bcb760c-3724-9f67-41fc-7089e28bb17c.png "浦島太郎の気分")

# 変化に気づいたきっかけ
2022年1月から2023年12月まで2年間いたとはいえ、10ヶ月ぶりなので、色々忘れてたり、キャッチアップする必要があり、小さめな修正タスク、リファクタタスクを担当させてもらいました。

それで、コード修正してる時に見慣れないコード見かけて
![Screenshot 2024-11-22 at 16.19.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/d51e2dc6-bd6f-436a-8492-993894a8f106.png)

英語対応済み、Excelも対応済みとのことで、浦島太郎の気分になりましたww
（10ヶ月しか離れてないのに。。。）

フロントメンバーは４人しかいないです（10月に自分が入って現在は５人）が、結構大変なイメージのある英語対応、Excel対応もやって、複数のプロジェクトを回して、Angularのバージョンアップも追随してて。。。（変化がすごい）

# Hubbleのリリースノート

そんなことがあった後、しばらくリファクタや、コードレビューして、「あれ？これ知らないな」と思う機能がいくつか見つかります。

そこで、Hubbleのリリースノートを見ると、私の不在中に追加された25の新機能や改善を発見。驚きです！

https://hubble-docs.com/release-note

# 技術面でも浦島太郎状態に
技術面に関しては2年間いたんで、少しやれば思い出すかなと思いきや、Hubbleのフロントは進化してました！

確か昨年末は、Angular17に上がったところで、一部signal化、control flow, standaloneとかだった気がします。

今年Hubbleを離れ、別のとこでコード書いてた時、そこもAngular17に上げたんですが、積極的にsignalやcontrol flowを使わなかったので、久しぶりにHubbleへ戻ったら、signal, control flow, standaloneはもはや常識となっていました。

HubbleのフロントはNgrxを使ってるのですが、そこも[signal化](https://ngrx.io/guide/store/selectors#using-signal-selector)してて、慣れるのが大変でした。

とはいえ、変わってないところも。
あいわらず、がっつりテストコードは書かれています。
コードと同じくらいか、場所によってはコード以上の行数も！
たくさんテストコードを書くところは、そのままなので良かったです。

# 最後に

ここまで紹介したように、多くの機能がリリースされ、積極的に、新しい書き方でコードが書かれているので、少し離れただけですが、まるで何年も経過してような感覚になりました。

自分もこのスピードに追いつけるように、奮闘中です！！

次は[@yamaopanku](https://qiita.com/yamaopanku)さんです！


[^1]: 平日のみの投稿なので6日ですが、5日目の記事としています。
レビューの流れ

レビュー時に行っていることを振り返ってみました。

## 1. プルリクの diff を眺めてコードレビュー

### 文章としての違和感を確認
段落のズレや不要なスペースが入っていないか、書き方が統一されているかをチェックします。  
リンターやフォーマッターは非常に優秀ですが、完全に網羅できない部分もあります。そのため、私は diff を眺めながら違和感に気づくことが多いです。

### リファクタリングの可能性を探る
diff ではファイルを跨いでコードの変更点を一望できるため、リファクタリングできそうな箇所を見つけやすいです。  
気になった部分はローカルで実際に試してみます。

## 2. ローカルでのスペルチェック  
人は間違うのもなので、スペルチェックはエディタに任せています。  

私は Vim を使用しているので、以下のプラグインを活用しています
- [kamykn/spelunker.vim](https://github.com/kamykn/spelunker.vim)

## 3. 仕様の確認  
元々の仕様やプルリクでの変更内容をしっかり確認します。  
正常系・異常系の判断をするには、まず仕様を正しく理解することが必要です。また、仕様そのものに違和感や見落としがないか、多角的にチェックすることも大事だと考えています。

## 4. 正常系の動作確認  
とりあえず「想定通り動くか」を確認します。  
実装中に一度は動作確認していても、その後の微調整で意図せず動作が変わってしまうことがあります。だが、そのことを実装者自身が気づていないケースもあります。

## 5. 異常系の動作確認  
異常系の想定漏れがないかをチェックします。  
具体的には、以下のようなケースを試します：  
- ブラウザバックやボタン連打  
- URL直打ち  
- 非表示にすべき情報が見えていないか  

「意地悪な操作をした場合どうなるか」を意識して確認するのがポイントです。

## 最後に  
書き出してみたところ、思ったより項目が少なく、記事としては少し物足りないと感じました。

そこで、気分転換に一曲どうぞ。  

**「レビューの流れ」**  

https://suno.com/song/c0fb4480-9a17-431f-a584-a0f0ac9a49aa

この曲は、先日 [ossan.fm](https://ossan.fm/episode/320) で紹介されていた [suno.ai](https://suno.com/about) を使って作りました。適当にテキストを入れただけで、簡単に完成したのには驚きました！

### 個人的にお気に入りの歌詞  
> 正常 非常のチェックを跨いで  
> コードの未来 闘志込めて描くんだ  

> レビューの苦労も 一瞬の喜び  
> 君と分かち合う チームの栄光  

---

最後までお読みいただき、ありがとうございました！
初心者なりのPrompt Engineering手法解説【モックプロンプト編】

今回はプロンプトエンジニアリング手法の一つのモックプロンプトについて解説していこうと思います！
ぜひ使用時の参考にしてみてください！
本記事の実装環境で使用しているLLMはGPT-4oです。

## モックプロンプト
前提の認識として、AIのことをAIと捉えずに一人間として捉える認識を持ってください。
曖昧な指示をLLMに送って、成果物が期待と異なる、そもそも見当違いのものが出る、という経験はないですか？
人間社会でも曖昧な指示により、認識齟齬が発生するケースは見られると思います。
一例として以下の状況を考えてみましょう。

プロジェクト管理において、チームメンバーに「タスクの優先順位を考えて進めてください」とだけ指示した結果、以下のような問題が起きたことはないですか？
* * *

* メンバーごとに優先順位の基準が異なり、進行がバラバラになる
* 重要なタスクが後回しにされ、プロジェクト全体の遅延につながる
* 指示した側の「重要度」が正確に伝わらず、誤解された成果物が出てくる

これらの問題の根本原因は、**指示を出す側と受け取る側のコンテキストの不一致**にあります。このような曖昧さを解消するため、モックプロンプトを活用する方法が役立ちます。

モックプロンプトは、**本題に入る前にLLMとやり取りを行い、質問のコンテキストについてすり合わせを行う手法**です

* * *
### モックプロンプトを実際に使用してみる
まず、以下のような抽象的な質問をLLMに投げかけた場合を考えます。
```
タスクの優先順位をつけるための重要なポイントを教えてください。
```
```
回答:

1.緊急度と重要度を考慮する。
2.プロジェクト全体の目標に沿うタスクを優先する。
3.リソースの利用効率を最大化する。
```

この回答は表面的には役立つ情報ですが、具体的な状況や背景に適応するには不足しています。

次に、背景を明確にしたモックプロンプトを使用します。

モックプロンプト↓
```
私はプロジェクトマネージャーで、現在、納期が迫っている複数のタスクを管理しています。
限られたリソースで、重要なタスクを効率的に進める必要があります。
タスクの優先順位を決めるために、具体的にどのような基準を考慮すべきか教えてください。
```

```
回答:

1.納期に直結するタスクの優先度を高く設定する。
2.他のタスクの進行に影響を与える依存関係を確認する。
3.高いインパクトを持つタスク（顧客満足や収益に寄与）を優先する。
4.リスクの高いタスクを早めに対処しておく。
5.タスクごとの所要時間とリソース配分を考慮する。
```
上記回答には具体性があり、状況に応じた実践的なアドバイスが含まれています。
また、LLMに指示を出す場合、自分がどういう立場で、どういう目的を持って、どういうことをしたいのか明確に示すことで、正確な背景を考えてくれるので意識すると良いポイントです。
最初に記載した通り、LLMは人間と同じなので、人間と同じように物事を伝えましょう
* * *
### 本題に基づいた再質問
背景設定後に、本題の質問を改めて行います。

```
これらの基準を踏まえて、以下のタスクに優先順位をつけてください。

1.クライアント用のプレゼン資料作成（納期: 2日後）
2.新商品の試作レビュー（他チームの進行待ち）
3.定例会議の準備（1週間後）
4.納期延期リスクのある問題対応（影響範囲が広い）
```
```
回答:

1.納期の最も近い「クライアント用のプレゼン資料作成」
2.プロジェクト全体に影響を与える「納期延期リスクのある問題対応」
3.次に進行できる状態を整えるための「新商品の試作レビュー」
4.最後に「定例会議の準備」
```
上記回答は、背景のコンテキストを反映しており、具体的な優先順位付けの理由も明確です。
LLMを利用したAIチャットサービスは、直前までのユーザーとAIのチャットのやり取りを記憶し、コンテキストとしてLLMへ情報を渡します。
![スクリーンショット 2024-11-26 19.35.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3840107/ad760a0e-8140-c8bd-a273-09c7aace441c.png)



### モックプロンプトの効果と応用
モックプロンプトを活用した結果、曖昧な指示が解消され、具体的かつ状況に応じたアクションプランが得られることが分かります。


モックプロンプトのメリットと応用例を以下に記載します。
* メリット

 **コンテキストの共有がスムーズ**
背景を明確に伝えることで、LLMの回答が具体性を増し、実用的になる。
**やり直しの削減**
曖昧な指示による手戻りを防ぎ、効率的にプロジェクトを進行できる。

**学習とフィードバックの活用**
モックプロンプトで得られた回答を基に、さらなる改善や意思決定の精度向上が可能。
* 応用例
**プロジェクト計画:** 複数タスクの優先順位付けやスケジュール調整。
**リスクマネジメント:** 潜在的な課題を早期に洗い出し、対策を計画。
**意思決定支援:** 資源配分や戦略の優先順位設定。

## まとめ
モックプロンプトは、曖昧な指示を明確にし、LLMの回答精度を高めるツールです。特に、タスク管理やプロジェクト進行の場面では、背景を共有し、段階的に質問を掘り下げる手法が効果的であることがわかります。

ぜひ、日常業務やプロジェクト管理でモックプロンプトを試してみてください。より具体的で効果的なアウトプットが得られるはずです！
転職をする前に考えたほうが良いこと3選

# はじめに
Qiita Advent Calendar4日目ですね。
だんだんと寒くなってくる時期だと思います。
今日は転職に関する記事を書きたいと思います。
それではどうぞ。


## 転職をする前に考えたほうが良いこと3選

### 1. 転職の前に退職をするな
- 転職先が決まる前に現在の職場を退職するのは避けましょう。
  理由1: 新しい仕事が見つかるまでの期間が長引く可能性があり、収入が途絶えることで経済的な不安を招くことがあります。
  理由2: 退職後に転職活動を行うと、焦りから条件の悪い職場を選んでしまうリスクが高まります。
  理由3: 現在の職場に在籍している間に転職活動を行うことで、より冷静に判断し、適切な選択ができる可能性が高まります。

  **実体験からのアドバイス**:
転職前に退職したことで、転職の選択肢が限られてしまいました。新卒だったため、第二新卒としての採用では業種を変えるのが難しかったです。転職活動ではエージェントを利用して成功することもありましたが、新卒の私には業界の知識が乏しく、エージェントの意見を絶対視してしまいました。


### 2. 転職する会社の雰囲気を知れ
- 転職先の会社の雰囲気や文化を事前にリサーチしましょう。
  理由1: 会社のウェブサイトやSNS、口コミサイトなどを活用して、
  　　　実際に働いている人の声を確認することが大です。
  
  理由2: 面接時に職場見学をお願いすることで、実際の職場環境を直接確認できます。
  理由3: 会社の雰囲気を知ることで、自分に合った職場かどうかを判断しやすくなります。
  
  **実体験からのアドバイス**
  ・カジュアル面談だけではなく、会社見学やLinkedInなどで社員と直接会う機会を作りましょう。
  ・リファラル採用を行っている企業に注目するのも良い方法です。実際の職場の雰囲気や社員の人柄をより深く理解することができます。

### 3. 人事を信用するな
- 人事担当者の言葉を鵜呑みにせず、自分自身で情報を確認することが重要です。
  理由1: 面接時に聞いた内容や条件は、必ず書面で確認し、後からトラブルにならないようにしましょう。
  理由2: 自分のキャリアに関わる重要な決定は、慎重に行うべきです。
理由3: 複数の情報源から情報を得ることで、より正確な判断ができます。

　**実体験からのアドバイス**
  
　VBAというレガシーな言語で、とても苦労しました。また、労働環境も思っていたより過酷でした。

常駐率については「半々が多い」とされていましたが、実際には常駐する案件に配属され、割合は全く関係ありませんでした。そのため、人事との面談の際には、中途面接でどのポジションにアサインされるのかを約束してもらうことや、自分がやりたくないことが含まれている会社を選ばないことが大切だと感じました。

# 最後に
転職後、最初は新しい環境にストレスを感じることもありましたが、次第にその会社に馴染むことができました。新しい環境に身を置くことは誰にとってもストレスフルで、人生に迷うこともあると思いますが、大切なのは自分の選択が最適解になるように行動し続けることです。

現在の会社ではSaaS製品に携わることが多く、SaaSについて学ぶうちにその面白さに気づき、仕事にもやりがいを感じるようになりました。環境も重要ですが、最終的には自分の心の持ちようが大切だと感じています。

幸アレ。
signalの監視を調整する：Angularのuntrackedの基本と実践

Angular 16以降では、リアクティブなsignalやエフェクトを使ったアプリケーション開発がより直感的になりました。その中でも「`untracked`」という機能は、意外と知られていない便利な特性を持っています。

現場で、レビューしていた時、`untracked`を初めてみて、気になったので調べてみました！

## `untracked`とは？

`untracked`は、エフェクトの中でsignalの値を取得する際に、値を取得した瞬間に「依存関係」として認識されることを防ぐための関数です。

通常、エフェクトは内部で使用されたsignalを「依存関係」として監視します。これにより、依存関係が更新されるたびにエフェクトが再実行されますが、場合によってはsignalを監視対象から外したいことがあります。このような場面で`untracked`が役立ちます。

例えば以下のケースを考えてみましょう：
- ボタン1をクリックした際にボタン1のカウントを監視し、ログを出力したい。
- ただし、その際にボタン2のカウントは**監視対象に含めたくない**。

このような要件を満たすために`untracked`を使います。

## サンプルコードの概要

```html:html
    <div class="container">
      <h2>ボタンカウンター</h2>

      <div class="button-group">
        <button mat-raised-button color="primary" (click)="incrementButton1()">
          ボタン1
        </button>
        <p>ボタン1が押された回数: {{ button1Count() }}</p>
      </div>

      <div class="button-group">
        <button mat-raised-button color="accent" (click)="incrementButton2()">
          ボタン2
        </button>
        <p>ボタン2が押された回数: {{ button2Count() }}</p>
      </div>

      <div class="log-info">
        <p>ログ出力回数: {{ logCount() }}</p>
      </div>
    </div>
```

```typescript:typescript
  button1Count = signal(0);
  button2Count = signal(0);
  logCount = signal(0);

  constructor() {
    effect(
      () => {
        const count1 = this.button1Count();
        if (count1 >= 5) {
          const count2 = untracked(() => this.button2Count());
          // const count2 = this.button2Count();
          console.log(
            `#ボタン1ログ送信：ボタン1が5回を超えました(${count1}回), ボタン2の現在値: ${count2}回`
          );
          this.logCount.update((count) => count + 1);
        }
      },
      { allowSignalWrites: true }
    );
  }

  incrementButton1() {
    this.button1Count.update((count) => count + 1);
  }

  incrementButton2() {
    this.button2Count.update((count) => count + 1);
  }
```

1. ボタン1とボタン2をクリックして、それぞれのカウントを増加させる。
2. ボタン1が5回以上クリックされた場合にログを出力する。
3. このとき、`untracked`を使用すると、ボタン2のカウントはログ出力のトリガーには影響を与えません。

実行時の挙動は次のセクションに記載します。

## 実行結果を見てみよう

### `untracked`を使用した場合

ボタン1を5回クリック(GIFは6回押下してます)するとログが出力されますが、**ボタン2をクリックしてもログの再実行は発生しません**。これは、`untracked`によってボタン2のカウントがエフェクトの監視対象から外れたためです。

![untracked.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/2c944bca-cd26-8652-3cde-ec60b1646246.gif)


### コメントアウトを外した場合

`untracked`をコメントアウトして、ボタン2の値を直接参照するとどうなるでしょうか？
ボタン1の条件を満たしている状態でボタン2をクリックするたびにログが出力されます。この挙動は、`untracked`を使用していないため、ボタン2も監視対象に追加された結果です。

![untracked-not.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/89497/f595a402-0b96-b92f-d52f-3b3ce3c2b40e.gif)

## `untracked`を使うべきシーンとは？

- エフェクト内でsignalを参照したいが、監視対象にしたくない場合。
- 一時的な値の参照やデバッグ情報の取得時。
- パフォーマンスや不要な再実行の抑制が求められる場合。

## 最後に

Angularのリアクティブシステムでは、`untracked`を使うことでエフェクトの挙動を柔軟に制御できます。このシンプルな機能を理解して活用することで、より効率的で意図通りに動作するアプリケーションを構築できます。ぜひ自分のプロジェクトでも試してみてください！

https://github.com/ksakae1216/nx-unpacked

明日は、[@kazumeat](https://qiita.com/kazumeat)さんです！
ktorのHttpClientでCaused by: java.lang.NoClassDefFoundError: kotlinx/io/unsafe/UnsafeBufferOperations

# はじめに

KtorでHttpリクエストをするのに手間取ったのでまとめます

# 問題

以下のドキュメントどおりに設定を進めたところエラーが出ました

https://ktor.io/docs/client-requests.html#http-method

```kt
    suspend fun get(): Res {

        val client = HttpClient(CIO)
        val response: HttpResponse = client.request("https://ktor.io/") {
            method = HttpMethod.Get
        }
```

```
java.io.IOException: kotlinx/io/unsafe/UnsafeBufferOperations
	at io.ktor.utils.io.CloseToken.<init>(CloseToken.kt:27)
	at io.ktor.utils.io.ByteChannel.cancel(ByteChannel.kt:133)
	at io.ktor.utils.io.ByteWriteChannelOperationsKt$writer$job$1.invokeSuspend(ByteWriteChannelOperations.kt:151)
	at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
	at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:101)
	at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:113)
	at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:89)
	at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:589)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:823)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:720)
	at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:707)
Caused by: java.lang.NoClassDefFoundError: kotlinx/io/unsafe/UnsafeBufferOperations
	at io.ktor.utils.io.ByteWriteChannelOperations_jvmKt.write(ByteWriteChannelOperations.jvm.kt:26)
	at io.ktor.utils.io.ByteWriteChannelOperations_jvmKt.write$default(ByteWriteChannelOperations.jvm.kt:24)
	at io.ktor.network.sockets.CIOReaderKt.readFrom(CIOReader.kt:134)
	at io.ktor.network.sockets.CIOReaderKt.access$readFrom(CIOReader.kt:1)
	at io.ktor.network.sockets.CIOReaderKt$attachForReadingDirectImpl$1.invokeSuspend(CIOReader.kt:97)
	at io.ktor.network.sockets.CIOReaderKt$attachForReadingDirectImpl$1.invoke(CIOReader.kt)
	at io.ktor.network.sockets.CIOReaderKt$attachForReadingDirectImpl$1.invoke(CIOReader.kt)
	at io.ktor.utils.io.ByteWriteChannelOperationsKt$writer$job$1.invokeSuspend(ByteWriteChannelOperations.kt:143)
	... 8 common frames omitted
 ```

 # 解決方法

 おそらくマルチプラットフォームの関係で入れているライブラリが違うようです

 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/073212c4-deb3-97fa-654f-8afd8727d04e.png)

調べたところ該当のクラスはありませんでした
ライブラリを検索したところ以下のリポジトリがヒットしてこちらを`ktor-client-core-jvm`の代わりに入れました

https://github.com/Kotlin/kotlinx-io

```
<dependency>
    <groupId>org.jetbrains.kotlinx</groupId>
    <artifactId>kotlinx-io-core-jvm</artifactId>
    <version>0.6.0</version>
</dependency>
```

うまくいきました

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/810513/dbe9c758-e41d-327b-c8d9-2fca304034e1.png)

# おわりに

ドキュメント通りでは絶対にうまく行かないと思ったのでさんこうになるとうれしいで
GitHub ActionsからECRへのpush: ローカルキャッシュ・リモートキャッシュの違い

# はじめに

GitHub ActionsでのDockerイメージのビルドとプッシュにおいて、ビルド時間を短縮するためにキャッシュを活用することができます。
このキャッシュには、ローカルキャッシュとリモートキャッシュ（ECR）の2種類があり、それぞれに特徴があります。

# キャッシュの種類と実装方法

## ローカルキャッシュ
GitHub Actionsのランナー上にキャッシュを保存する方法です。

```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Cache Docker layers
        uses: actions/cache@v3
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-

      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ github.sha }}
          cache-from: type=gha,src=/tmp/.buildx-cache
          cache-to: type=gha,dest=/tmp/.buildx-cache-new
```

## リモートキャッシュ（ECR）
ECRにキャッシュを保存する方法です。

```yaml
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Build and push
        uses: docker/build-push-action@v4
        with:
          context: .
          push: true
          tags: ${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:${{ github.sha }}
          cache-from: type=registry,ref=${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:buildcache
          cache-to: type=registry,ref=${{ env.ECR_REGISTRY }}/${{ env.ECR_REPOSITORY }}:buildcache,mode=max
```

参考記事
https://aws.amazon.com/jp/blogs/news/announcing-remote-cache-support-in-amazon-ecr-for-buildkit-clients/ 

# キャッシュの特徴比較

## ローカルキャッシュの特徴
### メリット
- 高速なアクセス（ローカルディスク上）
- セットアップが簡単
- GitHub Actionsの標準機能を使用
- 追加コストなし

### デメリット
- GitHub Actionsのストレージ制限の対象
- キャッシュサイズに制限（10GB程度）

## リモートキャッシュの特徴
### メリット
- チーム間で共有可能
- 永続的な保存
- 容量制限がない（ECRの制限内）
- 異なるCI/CD環境でも使用可能

### デメリット
- ネットワーク通信が必要
- ECRの追加コスト
- 権限設定が必要

# まとめ

選択の基準：
- 小・中規模プロジェクト → ローカルキャッシュ
- 柔軟な運用・大規模チーム開発 → リモートキャッシュ

プロジェクトの規模や要件に応じて、適切なキャッシュ方式を選択することが重要です。
皆さん、こんにちは。今週のITニュースのお時間です

といった挨拶から始まる「今週のITニュース」というコーナーを社内でやっています。本記事では、このコーナーを紹介しつつ、なぜ、どのようにやっているかをご紹介します。
想定読者は、ITに関するちょっとした情報共有を社内で始めたい方です。

本記事は、[リンクアンドモチベーション Advent Calendar 2024](https://qiita.com/advent-calendar/2024/lmi) の1日目になります。

# 「今週のITニュース」とは

私の所属するモチベーションクラウドの開発組織では、30人程度が週に1度集まり、情報共有を行うミーティングがあります。その初めの3分程度を使って、毎週2つ、比較的最近のITに関するニュースを独断でピックアップし、アイスブレイクがてら紹介しています（ややニュースキャスターっぽく）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638702/bc643b36-6c2c-c8f3-fe96-e4fad059aeb7.png)

※上記は、次の記事を紹介したときのスライドのスクショです：[Gartner、IT部門およびユーザーに影響を与える、2025年以降の重要な展望を発表](https://www.gartner.co.jp/ja/newsroom/press-releases/pr-20241029-predictions)

# なぜやっているか

組織の視点としては、インプットの機会が少しでも増えたらいいなと考えやっています。自分より特定分野に詳しかったりたくさんインプットしている方は社内にもいますが、追えていない情報もあるかも知れないし、本コーナーがきっかけでミーティングのコメントが増えたり、会話が広がったりしたらいいなと考えています。個人の視点としては、毎週なんだかんだインプットしているけど、どっかに吐き出したくなるので、そのアウトプット先としています。SNSやtimesも候補かと思うのですが、相性などを鑑みて判断しました。

また過去に、プロジェクトチームの朝会でも持ち回りで、アイスブレイクがてらの情報共有を毎日していたのですが、こちらも自分のインプットの機会にもなるし、他の方から知らないことを教えてもらえるし、そこでの話が日々の開発にも応用できることもあったりして、いい感じだったので、似たようなこと（まずは自分から）やってみようと思いました。

# 準備

ここからは、どう情報を収集して、準備しているかを書きます。

## 収集

調べれば、情報収集のやり方や見ておくと良いサイトはいくつも出てくると思います。ここでは、軽めに自分のケースを書きます。

基本的にRSSを用いています。[Feedly](https://feedly.com/) を使っています。（IT以外も含め）30個くらいのサイトを登録して見てます。個人のブログもあるし、有名なニュースサイトもあるし、QiitaやZennからタグで指定しているのもあります。

Feedlyへの一元化を主な方針としつつそれ以外にも、Google Discover、社内の他の方のtimes、Xなどはチェックしています。Google Discoverはハートアイコンをタップしていい感じにしようと日々メンテしてます。これらは記事を読むというよりは、諸先輩方の感想をチェックすることのほうが多いと思います。

チェックするタイミングは、ちょっと席を立つ時が多いかなと思います。というかその時くらいしか見てないです。飲み物取ったり、トイレに行ったりするときに、1つくらい気になるのを見て、良かったらread laterとかお気に入り登録しておく感じです。1日に何回か見ていると、1つくらい紹介したい記事が見つかったりするものです。

## 発表

いくつか保存してあった記事の中から、みんなに共有すると良さそうなものを考えて選びます。ここは、2つの記事の組み合わせや先週の発表内容を考えて、バランスを取ろうとしています。技術っぽいことを話したと思ったら、もう一つは軽いイベント告知系にするとか。

記事の紹介用スライドですが、記事のタイトルや画像を概ねそのままスライドに貼ることが多いです。話す内容は、記事そのままの時もあるし、自分で考える時もあるし、GPTで作ってもらうこともあります。話すと良さそうな部分をコピペして、「45秒程度で話せる、ニュースキャスターが読むような原稿を作成してください」などとすれば、だいたいなんとかなります。

それだけだと、無味乾燥な場合もあるので、少し用語の補足やら自分が思いつく例を話すこともあります。この辺は、自動化しすぎると自分で記事読まなくてもいいじゃん、となり勉強にならなくなってしまうので、少し面倒さを残していたりします。とはいえ、もうちょっといい感じにできそうな気はする。

## 日報での紹介

ちなみに、このようにインプットしていく中で、共有したいけれど、全体で話すほどでもないな、という記事やニュースもあったりします。そういったものは、日報で紹介するようにしています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/638702/fa18255f-fcbf-e429-037e-775a956dc1bf.png)

これも1つのアウトプット先です。1週間まとめたものは、別途個人のブログなどに転記してたりします。ちなみにこれは、桜井さんの以下の動画を見て、やろうと思いました笑

[日報のすすめ 【チーム運営】](https://www.youtube.com/watch?v=cvIauz7IK0E&t=1s)

あとは、マウンティングっぽくなる（俺、こんなの知ってるんだぜー）、薄っぺらい話になる（こんなすごいAIが出たらしいよ！記事の中身は読んでないけどね！）にはならないように気をつけています。とはいっても100%理解は時間的に難しい場合もあるため、せめて自分が話す箇所の用語については、説明できる程度になろうとしてます。

# まとめ

これらの情報収集をしたからといって、エンジニアとしてのスキルが大きく向上したりはしないし、プログラミングの速度も上がったりはしないわけですが、なんとなくでも用語を知っておくことは後々役に立ったりします。自分が観察してきた一定レベル以上の方々は皆こういう力が普通に備わっている気がします。ハードル低く、わりとすぐ取り入れられる仕組みだと思うので、この記事が少しでも参考になれば幸いです。

# 裏目的

「今週のITニュース」は、現在私が（勝手に）やっていますが、そのうちどなたかに譲る（あるいは定期的に回していく）形式にできないかなと思っています。いろんな人の気になるニュースを聞く機会にもなりそうだし、比較的ハードルの低いアウトプットの場として若手の機会にもなると思っています。やりたい人がいたら！ 概ねやり方は書きましたので、引き継ぎ資料としての役割も満たすと思います。
Google photosの容量が足りなくなったのでimmichを立てたら快適だった

こんにちは
ALJの江口と申します。

immichをご存じでしょうか。
写真や動画の保存にGooglePhotosを利用している方は多いと思いますが、そのセルフホスト版と思っていただけると早いと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/015e30a5-509d-cc32-004b-e388088bdfba.png)

GooglePhotosは、追加契約しても、100GBで月額250円というお得な契約があるので、セルフホストと比較すると、コストではかなわないのですが、我が家は既に立ち上がっているProxmoxサーバーがあるので、宅内サーバーの有効利用という観点からimmichを立てることを選択しました。

既にファイルサーバーはあるのですが、アーカイブファイルを解凍して画像を見るという作業って意外と家族には受けが悪いんですよね。

# immichにはスマホアプリがあります
ファイルサーバーで画像を管理するのと比べ、大きな違いは、immichには、Android用とiphone用のスマホアプリがあるという点だと思います。
PCからはURLを入力する必要がありますが、アプリなら一度設定すればその後は簡単に利用できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/8b8156a7-bfc1-9fcc-8752-821c4ac82b79.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/e3d0e489-173e-7b2c-2232-325ad4144949.png)

# セットアップも簡単です
セットアップ方法は複数あります。
・Docker（公式）
・snap（community）
・Truenas等のアドイン

公式のHPには、Dockerのセットアップ方法が記載されています。
今回は、snapでの導入方法をご紹介します。snap版はcommunityが提供しているので、公式ではないですが、リバースプロキシ（haproxy）なども含めて全てやってくれるので、専用サーバーを立てる場合はこちらの方が便利だと思います。

## step1 Ubuntuサーバーを立てる
メモリ4G～6G程度のUbuntuサーバーを立てます。
Proxmoxで準備する場合、LXCだとsnapがうまく動かないため、VMで準備します。

## step2 snapでインストールする
まず、snapを入れます。
```bash
$ sudo apt install snap
```
immichをインストールします。
```bash
$ sudo snap install immich-distribution
```
これで終わりです。
サーバーにhttpでアクセスして、以下の画面が出たら完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/af27fe04-0f43-fb98-e1b3-52c39032652a.png)

# GooglePhotosのバックアップファイルはimmich-goで一気に登録
GooglePhotosからバックアップしたデータは、解凍してimmichに登録してもいいのですが、immich-goという登録ツールがあります。Windows版もあります。
実行はコマンド形式なので、コマンドラインが苦手でなければ使ってみるのもいいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662107/5528d0bf-3c66-bf3b-d4a3-21f61fef2ebe.png)

```bash
コマンド入力例
アーカイブファイルが複数でも、 * でファイル名を指定し、全てを対象にできます。

（１）まずdry run
./immich-go  -server=http://192.168.xxx.xxx   -key=xxxxxxxxxxxxx upload -dry-run  -create-albums  -google-photos  takeout-*.zip

（２）上記から dry run　を取ると実際に登録される

```

# 外部からの接続
セルフホストなので、基本的にはローカルでしか閲覧できませんが、速度が速いのでGooglePhotosよりも快適で、かなり満足できます。

外部から接続したい場合は、以下のような選択になると思います
・ポート開放し、ddnsなどを利用する
・zero trustを利用する

immich +　CloudFlare　の方法は、以下の方が詳しく説明しているので、必用な方は以下の記事を参考にされるといいと思います。
というか、このページは、snapでの導入以外は、ほぼ以下の方と内容が同じだったりします。

https://qiita.com/muhi111/items/7a3a5aa2217fed9adb06

# 立ち上げた感想
CloudFlareもセットアップし、外部からimmichが利用できるようになったので、GooglePhotosの必用性がほぼなくなりました。
【超基礎】TypeScript、readonly修飾子について

## 前提
この記事は、初学者の私が、サバイバルTypeScriptで学んだこと+調べたことをまとめたものになります。

従って、経験則に基づいた発言ではないため、一部慣習とは違っていたり、認知にずれがあったりする可能性がありますので、ぜひコメントで指摘していただけると幸いです。

https://typescriptbook.jp/

## 環境
記事内のコードは以下の環境で動作確認済みです。
- Node.js: v22.10.0
- TypeScript: Version 5.6.3

## readonly修飾子とは？
- その要素を読み取り専用にする修飾子
- 配列や、オブジェクトのプロパティに使える
- constの様に再代入を防ぐわけではない

## 配列へのreadonly
- **編集できない配列**として宣言できる
- `readonly`を型注釈の前につける方法と、`ReadonlyArray<T>`型として型注釈する方法がある
- **別のreadonly配列への代入はできるが、通常の配列に対しては不可**
```typescript
let nums1: readonly number[] = [1,2,3]

nums1=[4,5,6]//再代入は可能

nums1[1] = 4 //Error
nums1.push //Error

let nums3: number[] = num1 //Error
```
## オブジェクトへのreadonly
- **readonlyをつけたプロパティのみ**を読み取り専用にする
- プロパティの書き換えはできないが、**再代入は可能**

- JSにはreadonlyが無いため、コンパイル時にチェックされる
```typescript
//readonlyのプロパティを持つオブジェクト
let a:{
    readonly num: number;
    str: string
} = { num: 5,str: "hello" }


a.num = 5 //error

a = {num: 4,str: "world" };//再代入は可能
a.str = "こんにちは"//readonlyがついていないため編集可能
```
## ネストされたオブジェクトについて
**直下のプロパティのみに作用するため、ネストされたプロパティには効かない**
➡読み取り専用にしたいすべてのプロパティにreadonlyを付ける
```typescript
const obj:{
    readonly a:{
        num: number;
        str: string;
    };
} =  { a: { num: 5, str: "hello"} };

obj.a = {num: 3,str: "world"};// error プロパティaの編集はできない

obj.a.num=5;//ネストされたnumプロパティは書き換え可能
```

## 一括でreadonlyにする
- `Readonly<T>`により、一括で読み取り専用にできる
- ネストされたプロパティには効かない
```typescript
//通常逐一readonlyを付ける必要がある
let obj1: {
    readonly num: number;//書き換え不可
    readonly str: string;//書き換え不可
} 

//一括でreadonlyにできる
let obj2: Readonly<{
    num: number;//書き換え不可
    str: string;//書き換え不可
}>

//ネストされたプロパティには効かない
let obj3: Readonly<{
    a:{
        num:number;//書き換え可能
        str:string;//書き換え可能
    };
}>;
```

## まとめ
以上になります。


当方初学者なため、認知のずれや、モダンな開発現場ではもう使わない表現などがありましたらコメントで指摘していただけると幸いです。😸
福岡出身システムエンジニア誕生記(フリーランスになるまで)

# はじめに

初めまして、自己紹介させていただきます。

1995年生まれ福岡出身フリーランスエンジニアです。
先日福岡に帰省して、いろいろ自分のこと振り返るの大切だなとおもい、
今回記事を書くことを決断しました。

普通の人間がフリーランスになって生活しているという一例をシェアできたらとおもいます。
誰かの参考になれば幸いです！

今回は社会人2年目前半について書いてみようと思います。

# 目次
少し細かく振り返りながら記載するので複数記事書く予定です！
##### ・学生~就活編⇒https://qiita.com/Yutajino/items/bf074102e254457af934
##### ・1年目前半編⇒https://qiita.com/Yutajino/items/37d0ab0cd64d063870b7
##### ・1年目後半編⇒https://qiita.com/Yutajino/items/a4f3ac0e4f6821a3b264
##### ・2年目前半編⇒本記事
##### ・3年目編⇒完成次第リンク貼ります
##### ・フリーランス~失敗編⇒完成次第リンク貼ります
##### ・失敗~現在編⇒完成次第リンク貼ります

# いろんな種類の案件を任されるようになる
1年目をなんとか乗り切り、2年目に突入した私は、
厳しいリーダーと一緒に色々な現場へ突入することが増えました。

自分が担当した案件では
システム導入、開発以外のことも扱ってました。

BIツールは、
Excelやプログラミングができない人たちでも、
データ分析ができるようにしたい！
ということで、導入されるケースが多いと思います。

経営層や業務担当の人たちが
データに基づいた判断、舵取りができるようになるということで、
各ツール導入したはいいものの、
うまく活用できない、そもそも使い方がわからない、
など現場レベルの困りごとが多かったです。

なので、
・一ヶ月間だけ、業務担当者にBIツールの使い方を教える
・事前情報なしで、お客様と顔を突き合わせて、
　その場で出したい指標と元データを確認して、
　簡単なダッシュボードを作る
・データの整形作業の手伝い

など、開発のスキルも磨きながら、
お客様とのコミュニケーション力と、その場の対応力、
思考の瞬発力を鍛える機会が多かったです。

# 今思うと、、、
2年目になりたての当時は

「開発しっかりやった方が、自分のスキルも上がるから、
開発案件にしっかり入った方がいいなあ」

「同じツールを扱うのも飽きてきたから他のツール触りたいなあ」

とも思っていましたが、
今振り返ると、
ユーザーとのコミュニケーションが多かったおかげで
自分の開発するシステムがどのように使われていてを理解が深まりましたし、
開発する中で、ユーザー目線でどのポイントに気をつけたらいいのか
アンテナを張ることができるようになったと思います。

現場側が理想としている状態を細かく聞く癖がつき、
開発側がやりがちな必要以上の機能を載せたり、
複雑な処理を組み込んだりすることがなくなりました。

この記事を読んでくださってる方は、
いろいろな種類のSEさんがいて、
状況はいろいろ異なるかと思いますが、

振られた仕事を淡々とやっているときは気づかないですが、
後々になってその仕事を通して身についた力があると思うので、
3年目くらいまではがむしゃらに仕事し続けてもいいのかなと思います。

今回はこの辺りで！

# あとがき
・当時は現場に行くたびめちゃくちゃ緊張していた
・クーラーガンガンの部屋でも緊張して汗だくでした
・しっかり動いた仕事って意外と覚えているものですね
・今も仲良くしている取引先もあります
プロダクト・ビジネスマネジャーとは何ぞ？？

ご覧いただきまして、ありがとうございます。​

ニッセイ情報テクノロジー株式会社 プロダクト・サービス事業推進室の須賀です。​

私はソフトウェア・エンジニアとして社会人人生をスタートし、多くのプロジェクトを経験しながら、プロダクト・ビジネスマネジャーとしてのキャリアを積んできました。もっとも、最近では自身でコードを書くことは無くマネジメントや人材育成でなど、組織運営が業務の大半を占めるようになってしまいましたが…​

アドベントカレンダー5日目のこの記事では、私なりのプロダクト・ビジネスマネジャー像について記述いたします。​


## ​■プロダクト・ビジネスマネジャーとは？​

担当する業務領域と必要な技術に深い知識をもち、（顧客目線 ＆ 提供者目線の）戦略的な視点と実行力をもって、顧客に価値を提供する職務です。受託開発とは異なり、自社製品やサービスを企画・開発できるのが特徴です。​

## ■キャリア形成の上で最も重要だと思うスキルは？​

プロダクト・ビジネスマネジャーで最も重要だと思うスキルは「意思決定力」ではないかと考えています。​

プロダクトビジネス（以下PBと称す）では、製品開発や市場投入の過程で、業務の問題、技術的な課題、顧客の期待、予算など多くの要素を考慮しながら、何を優先し、何を犠牲にするか考えなければなりません。​

意思決定力を伸長するには、客観的な事実に基づく判断の習慣化が重要だと思います。これは法令や規則といった静的な事実だけではなく、データに基づく動的な事実などを含みます。顧客の利用シーンを考え、法令や規制のもと、どう使われるか複数のシナリオを考える仮説立てであったり、実務担当者やステークホルダーへのヒアリングであったり、そういった事実に基づく判断を心がけています。​

## ■失敗体験とそこから学んだコト​

顧客から捻じ込まれた要望を安易に承諾してしまい、大失敗しました。その要望による綻びが、それまで構築したプロセスに矛盾を生じさせたのです。プロダクトビジネスマネジャーには「意思決定力」が重要と記載しましたが、決定する際に生じるメリット、デメリット、影響範囲など、どこまで考慮しておくべきかを見誤ると失敗に繋がるという教訓を得ました。​

## ■目標とするプロダクトビジネスマネジャー​

プロダクトビジネスマネジャーでは無いかもしれませんが、Linuxカーネルの産みの親、リーナス・トーバルズ氏を尊敬しています。​

多くの開発者の意見に耳を傾けながら、何を取り入れ、何を切り捨てるか判断し、Linuxの開発に貢献し続けています。コンピューターアーキテクチャの将来像まで見据えLinuxのロードマップを策定しているのです。目標にするには恐れ多い方ですが、同世代のエンジニアとしても尊敬しています。​
​
## ■最後に​
ここまで読んでくださいまして、ありがとうございます！
少しでもプロダクトビジネスマネジャーというキャリアに興味をもっていたいただけたら幸いです。最後にリーナス・トーバルズ氏の名言を１つ紹介して終わりたいと思います。​

> ​"But it's true: you can create your own world. The only limitation is your own abilities." ​
> 「でも、本当のことだ。君は自分の世界を作ることができる。君にできることを制限するのは、君自身の能力だ。」​

～リーナス・トーバルズ氏の自伝 “Just for Fun” より～

![Tux.svg.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3939945/a126ca95-be18-fe6e-7479-923c12b0cacd.png)
Tux by ラリー・ユーイング
<lewing@isc.tamu.edu>​
fx-JP900-Nをレビュー

## おいおい、またかよ
こんにちは、関数電卓を買ってきたbockringです。私は普段使い用として使い勝手の良い関数電卓を探している(という名目で物欲を満たしている)のですが、実際のところ、fx-JP900CW(CASIO)はキーアサインがとても使いにくく、HP Prime G2(hp)は使いやすいのですが、微分積分などのそこそこ使用頻度の高い関数が表に出ていません。もはや裏でもなく、特殊メニューの中にあります。そしてEL-509T(SHARP/5160T改造済)に至ってはキーアサインが良くても、計算速度が論外級に遅いです(fx-290Aのさらに前の古いモデルよりも遅いです)。

実際、試しながらなのでこれが良いかは分かりませんが、レビューしていきます。

## fx-JP900-Nとは
CASIOによって2015年(?)から発売されていた関数電卓で、初代ClassWizシリーズとなります。残念ながら、2作目より1作目の方が全体的に良い評価を得ています。下位機種(と2作目)より高級感のあるデザインで、どうやら精度・速度ともに2作目よりは劣っているようです(これに関しては仕方がない)。

https://amzn.to/3CUJ22v

しかし、SHIFT・ALPHAキーがあり、主要な関数のほぼ全てが表あるいは裏に回っている(双曲線関数はオプションメニュー内)ので、非常に扱いやすいです。

2作目よりは少し分厚いですが、パッと見の見た目よりはかなり薄く、ケース無しではほんの少しだけ1作目の方が薄いです。

カーボン風の彫り込みがあり、デザインは非常に良いです。この彫り込みによって文字が見えにくいというレビューもあるようですが、私の環境では感じませんでした。視野角については、文字列45°、画面60~70°といったところでしょうか。特に困ることはないように感じます。

## 開封
このシリーズの製造終了までが、ビニールパッケージ(外から操作ができるタイプ)でした。

パッケージ上部の樹脂を上に(剥がすように)持ち上げ、台紙を抜き取って中身を取り出します。袋から本体を取り出し、ケースと本体を固定している2本のテープを剥がせばOKです。

あとは感覚で使うだけです。

## レビュー
ここから、少しずつレビューしていきます。その際、この画像も参考にしていただけると良いかと思います。

このレビューではHP Primeは比較対象から除いて3機で比較しながら進めていきます。

### サイズ・ディスプレイ
![IMG_2432.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/8399991f-e3db-f018-8f41-971ae2a84a11.jpeg)
この画像からも分かりますが、EL-509Tは表示能力の限界を感じます。この小さな指数を読むくらいならライン表示の`^2`の方が見やすいと感じるほどです。

逆にCASIOの2機は、表示能力に余裕を感じます(192*63画素)。特に横方向については入力している式をより多く確認できるので、この点はやはり高精細ディスプレイの恩恵ですね。

実は日本でも販売されていた廉価グラフ電卓のfx-9860/9750GIIの画面が128*64画素なので、グラフ電卓の約1.5倍の表示能力を持ちます。~~上位機種でグラフ描画機能を追加してくれないかなぁ、CASIOさん。それで10000~15000円で売ってくれたら買いたいって思ってしまうものです。~~**マジでいつの間にか出ていました。GRAPH LIGHTが5000円以下、そしてその上位機種のGRAPH MATH+も10000円程度という破格です。(ユーロ→円換算) とはいえ、キーアサインの劣化感は否めませんが。**

### キー
キーについて、2作目よりは硬く、少しクリック感が弱めのものです。キーに関してはSHARPのものが優れていると感じます。

キーアサイン(キーの配置)はEL-509Tが最も優れているものの、本機も使いやすいキーアサインです。逆に、なぜ2作目でこんなにも使いにくいキーアサインになったかが謎なほどです。

### 計算速度・精度
計算速度は十分です。2作目よりは少し遅いですが、ストレスは感じません。この電卓でストレスを感じるような計算はグラフ電卓に計算させるのが賢明でしょう。

計算精度は特に問題ありませんが、`tan(355/226)`を`-7497258.44`と返します。本来は2作目のように`-7497258.185`と返すべきなので、その点で2作目は進化していると言えるでしょう。

1から10000までの和が1作目(本機)では16秒、2機目では10秒で終わりました。

### 本体刻印
キーに書かれた文字などは、(おそらく)全てプリントされているものですので、使い込んだら削れて読めなくなります。まぁその時は買い替えれば良いのですが、その時にお気に入りの機種は手に入らないのでどのように進化しているかは問題になります。

### 本体
手で触る面は、基本的に触り心地の良いマットな樹脂あるいはカーボン風の加工をされた樹脂になっています。ケースを取り付けた状態でのグリップ感も良好です。ただしケースをつけていないと、薄すぎて違和感を感じました。

画面や太陽電池部分のくり抜きも2作目より美しく仕上がっています。

そして1作目の方がキーを押した時の本体の揺れも少ない(ほとんどない)です。2作目は、横方向に少し揺れるのです。

### 不要であろう(あまり使わない)
- QRコード…グラフを描きたいならグラフ電卓を使う
- エンジニアリング記号…手動で「M(メガ)ってことは`*10^6`だな」と置き換えれば良い
- 表計算…使い道がない　使用できるセルの数も非現実的(※)

※170セルまでと公称されているが連番で115セルまで、全て0を入力して170セルまで。関数を用いるとさらに少なく、`=RanInt#(0,1)`(0から1までの整数乱数)では100セルまで。

ちなみに、QRコードを活用すると、このようなことができます。
![IMG_2437.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3777721/fbcbf016-824a-6673-c924-0d06c9446634.jpeg)

この機能は、リンクをごり押しして実現しているのですが、QRコードに含められる文字数には限りがあるので、場合によっては2つ以上に分かれます。こうなると、2個目を正しく機能させるのは至難の業です。2つのコードを読み取って、そのデータをメモ帳ソフトでくっつけて開けば大丈夫ですが…

## まとめ
<font color=red>**「なぜ2作目を発売した？」**</font>
と感じるほど、1作目の出来は素晴らしいです。何の関数電卓を買うか迷っているなら「これ(あるいはこのシリーズ)を買え」と言うでしょう(在庫があるなら)。

そして本体も高級感があり、気に入りました。

まぁ肝心の値段は高くなっていて、2作目よりもなぜか高いです。これは製造終了したからでしょうか。

また数ヶ月ほど使用して何か不満があれば書き込もうと思います。

それではまた〜
【備忘録】AutoScallingGroupにインスタンスが１台しかない時にもう１台起動せずに既存のインスタンスを停止起動する方法

# 目次
[1.はじめに](#1-はじめに)
[2.前提条件](#2-前提条件)
[3.手順](#3-手順)
[4.CLI系](#4-CLI系)
[5.まとめ](#5-まとめ)

# 1. はじめに
皆さんこんにちは、こんばんは、おはようございます
タイトル通りなんですけど、このパターンの時皆さんどうしてますか？
そもそもユースケースが少ないのですが、リタイアメント通知が来た時このパターンに合致しました。
私がこの記事を書くきっかけといってはなんですが、スケールイン保護して手動停止したのですがインスタンスが削除されてしまって大失敗、改めて検証と調査をしました。

スケールイン保護は最小キャパシティを元にASGのプロセスから守る為って感じなので手動停止等には対応していない（適用されない）ようです。
もう1台作成しないことを条件に1台完結で起動停止ができる方法を模索しました。

なおコンソール上では解決しないのでCLIでASGを制御する方法を採用しました。
# 2. 前提条件
Cloudshellを使用しコマンドを実行します。
別途サーバからコマンド打ちたい方はAWS CLIを打てるように環境を整えてください。

以下ASGのプロセスの知識を覚えておいてください。
|プロセス名|説明|
|---|---|
|Launch| インスタンスの起動を制御。|
|Terminate| インスタンスの終了を制御。|
|HealthCheck| ヘルスチェックを制御。|
|ReplaceUnhealthy| 非正常なインスタンスの置き換えを制御。|
|AZRebalance| アベイラビリティゾーン間のバランスを制御。|
|AlarmNotification| アラーム通知に基づくスケーリングを制御。|
|ScheduledActions| スケジュールされたアクションを制御。|
|InstanceRefresh| インスタンスのリフレッシュ操作を制御。|
|AddToLoadBalancer| インスタンスをロードバランサに登録するプロセスを制御。|
|RemoveFromLoadBalancerLowPriority| 低優先度インスタンスのロードバランサからの削除を制御。|

インスタンスはASGからデタッチしないので注意です。
デタッチしてしまうと、プロセスを停止するため再アタッチできなくなります。
プロセスを稼働させれば再アタッチできますが、プロセスを再稼働させた時点で新規のインスタンスが立ち上がってしまいます。

# 3. 手順
手順については以下の流れ
１.ASGのプロセスを停止→➀のコマンド
２.現在稼働しているプロセスを確認→➁のコマンド
３.インスタンス停止
４.インスタンス起動
５.ASGのプロセス再開→➂のコマンド
６.現在稼働しているプロセスを確認→➁のコマンド

# 4. CLI系
```AWSCLI:ASGプロセス停止➀
aws autoscaling suspend-processes --auto-scaling-group-name <ASG名>
```

```AWSCLI:ASGプロセス確認➁
aws autoscaling describe-auto-scaling-groups --auto-scaling-group-names <ASG名> | jq '
  .AutoScalingGroups[].SuspendedProcesses | map(.ProcessName) as $suspended |
  ["Launch", "Terminate", "HealthCheck", "ReplaceUnhealthy", "AZRebalance", "AlarmNotification", "ScheduledActions", "InstanceRefresh", "AddToLoadBalancer", "RemoveFromLoadBalancerLowPriority"] - $suspended'
```

```AWSCLI:ASGプロセス起動➂
aws autoscaling resume-processes --auto-scaling-group-name <ASG名>
```

以下は使用しませんが、ご参考程度にどうぞ

```AWSCLI:ASG特定のプロセス停止
aws autoscaling suspend-processes --auto-scaling-group-name <ASG名> --scaling-processes <プロセス名>
```

```AWSCLI:ASG特定のプロセス再開
aws autoscaling resume-processes --auto-scaling-group-name <ASG名> --scaling-processes <プロセス名>
```

# 5. まとめ
ASGの設定値をいじることなくプロセス起動停止の間で停止起動することで新規のインスタンスが立ち上がらず既存の一台を起動停止することができました。

ぐぐってもなかなかややこしい部分で書いてる人が見つけられなかったのでこの記事を備忘録として置いておきます。

デタッチは必要ないので、その点も便利かなと思います。

もっといい方法があればコメントいただけるとしっぽブンブンです。
よろしくお願いいたします～～
知って得するGoogle CloudCLI(SDK)の導入、ローカルPCとクラウドをつなぐ方法

# 紹介
この記事は、AEON Advent Calendar 2024の2日目です。
https://qiita.com/advent-calendar/2024/aeon

イオンリテール（株）デジタル戦略部データソリューションGの丸尾です。
当チームは実店舗出身&非エンジニア人材のみで構成された
システムの内製化チームとなっておりまして、
今回はその中で利用しているものを共有します。

# 概要
本投稿ではGoogle Cloud Platform(GCP)とローカルPCを、
特定のCLI(SDK)ツールを利用してファイルの送受信や、
Biqueryからのデータ抽出を行う方法を説明します。

実際のイントラネットを介した連携は、
詳細なシステムを組んだ方が良いですが、
POC検証やクイックに試したい場合は参考にして下さい。

投稿はいくつか分けて投稿しますので各リンク先をご参照下さい。


# 稼働環境
💻windowsマシン(windows10)
弊社の従業員向けPCが基本windowsなのでwindowsマシンの方法を記載
公式リファランスにはmac,linuxマシンでの導入方法が記載されています

# 対象者
①本投稿はGCP初心者の方
②Azcopyなど別クラウドのsdkを使っていた方
③ベンダーに特定ファイルの連携行わせたい方

# 想定シナリオ
①ローカルPC→GCloudStorageへのファイル転送
②GCloudStorage→ローカルPCへのファイル取得
③ローカルPC→Bigqueryへのファイルデータアップロードとクエリ稼働
④Bigquery→ローカルPCへのクエリ結果ファイル取得
※+おまけ：これらをRPAで回すバッチファイル作成

# 実施方法

### <大まかな流れ>
①公式サイトからwindowsマシン用のCLI(SDK)ツールを取得
②インストール後CLI(SDK)のコンフィグ設定を実施
③上記想定シナリオを回すコマンドを作成・テスト・実行

### <詳細な流れ>
①公式サイトからwindowsマシン用のCLI(SDK)ツールを取得

　-1.【[こちら](https://cloud.google.com/sdk/docs/install-sdk?hl=ja)】のリンクへアクセスし、
 　　「Google CLIインストーラー」のリンクをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668769/a421a97f-7e7d-aba2-427c-47c8a1e2c70b.png)

　-2.ダウンロードが完了したら任意の場所にインストーラーを移動
 　　もしくはそのまま変更することなく実行
　　 セットアップツールが立ち上がるので基本的にそのまま実行
　　     ※screen readerは視覚障害の方が利用する読み上げツールです
   　　  ※インストーラーはVPN環境で止まる場合がある点は注意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668769/508c48ad-30aa-a75f-04bb-ea9166e8e85d.png)

　-3.セットアップツールを進めInstallを実行でローカルへの導入が完了　
　　 CLIツールにはpython3が必要ですが、
   　　Bundled Pythonにチェックが入っていると必要な物が自動入手
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668769/1c6a652a-88e8-54aa-7d1b-546bef3136b3.png)

　-4.セットアップが完了すると、
 　　デスクトップ画面にshellのショートカットが追加
　　 ショートカットからSDKを起動し利用できればインストールは完了
　   　※この時点でローカルPCのcmd(コマンドプロンプト)で、
     　　　gcloud init と入力すれば同じようにSDKが起動されます。
        　　　起動できない場合は「システム環境変数」を編集
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3668769/18684a71-8070-13c9-1161-eb3932ce8ccb.png)

◆上記方法でインストール失敗する場合、
  　以下のスタンドアローンタイプで実行

 -1.【[こちら](https://cloud.google.com/sdk/docs/downloads-versioned-archives?hl=ja)】のリンクへアクセスし、
 　　自身のPC環境にあったパッケージをダウンロード

  　※PC環境の確認は↓　
    　Windows の場合: [コントロール パネル] > [システム] > [システムの種類]

 -2.任意の場所にパッケージを展開したら、
 　 中に入っている「bash」もしくは「install.bat」や「insatll.sh」を起動
　【[こちら](https://cloud.google.com/sdk/docs/downloads-versioned-archives?hl=ja)】のリンク先の案内に従って、残りの操作を実行して下さい。
   　※バージョンによってbash,install.bat,insatll.shが無い場合もありますが、
      　　同等の機能があるはずなので、cmdもしくはpowershellから、
      　　該当の機能を実行する方法を生成AIに聞くなりして実行して下さい


②インストール後CLI(SDK)のコンフィグ設定を実施
https://qiita.com/bleachonn77/items/ad939e578408c85cace9



③上記想定シナリオを回すコマンドを作成・テスト・実行
https://qiita.com/bleachonn77/items/bca83ba62d69cb3d8dc4
知らないと損！Eclipse IDEで開発効率を3倍にするショートカット技

railsばかり使っていて、最近javaに手を出し始めました。
Java＋Eclipse IDEという新しいもののコンボに慣れておらず、やりにくさを感じております。

Eclipse IDEは、JavaやPHPなどの開発において広く使われる統合開発環境（IDE）ですが、ショートカットキーを使いこなすことで作業効率を大幅に向上させることができます。この記事では、MacとWindowsそれぞれで使える便利なショートカットキーと、Macでの設定方法について詳しく解説します。


## 基本のショートカットキー一覧
ここでは、日常的に使える代表的なショートカットキーを紹介します。これを知っているだけで、Eclipseでの作業が格段にスムーズになります！

| 機能                  | Mac               | Windows             | 説明                               |
|-----------------------|-------------------|---------------------|------------------------------------|
| **ファイル検索**      | ⇧⌘R              | Ctrl+Shift+R        | プロジェクト内の任意のファイルを検索し、即座に開きます。 |
| **宣言・実装を開く**  | ⌘クリック         | Ctrl+クリック        | メソッドや変数の宣言元や実装箇所へジャンプします。 |
| **コード整形**        | ⌘⇧F              | Ctrl+Shift+F        | 自動でインデントや空白を整え、見やすいコードにします。 |
| **コード補完**        | ⌃Space            | Ctrl+Space          | コード補完候補を表示し、入力ミスや作業時間を削減します。 |

これらを使いこなすことで、わざわざメニューを開いたりマウスを使ったりする手間が省けます。


## コード補完をMacで使えるようにする方法
Macでは、⌃Space（Control + Space）がmacOSの入力ソース切り替えに割り当てられているため、デフォルトではEclipseでコード補完が使えない場合があります。この問題を解決する手順を以下にまとめました。

### 1. macOSのショートカット設定を変更
1. **システム環境設定** → **キーボード** を開きます
2. **ショートカット** タブをクリックします
3. 左メニューから **入力ソース** を選択します
4. 「次の入力ソースを選択」に割り当てられた ⌃Space のチェックを外します

### 2. Eclipseのショートカット設定を確認
1. Eclipseを開き、**[Preferences（設定）] (⌘,) → [General(一般)] → [Keys(キー)]** に移動します
    フィルター入力欄に「キー」と入力すると遷移できます
    ![スクリーンショット 2024-11-28 17.27.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/ed91dfe1-9f2c-da06-abd1-49c7eae7cf2a.png)

2. `Content Assist` （コンテンツ・アシスト）を検索します
フィルター入力欄に「アシスト」と入力するとあります
   ![スクリーンショット 2024-11-28 17.28.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3524128/a0bd83de-cb43-23c6-6db8-c05e112f3561.png)


3. `Content Assist`（コンテンツ・アシスト）を選択し、バインディングに自分の使いやすいショートカットキーを指定します
指定した後で、適用ボタンを押すと変更は完了です。

この設定を行うことで、Macでもスムーズにコード補完が使えるようになります。


## 検索機能をフル活用！`^h`の強力な使い方
Eclipse IDEには、`^h`（Ctrl + H）でアクセスできる高度な検索ツールがあります。このツールでは以下のような検索が可能です。

- **ファイル内容検索**  
  プロジェクト内の任意の文字列やコード内容を一括で検索
- **宣言や使用箇所の検索**  
  特定のメソッドや変数の使用箇所を効率よく探せます
- **正規表現検索**  
  より柔軟な条件で検索が可能

たとえば、大規模なプロジェクトで「この変数、どこで使ってたっけ？」という疑問をすぐに解決できます。

## おわりに
Eclipse IDEのショートカットキーを活用することで、開発作業のスピードや効率を格段に向上させることができます。特に、Macをお使いの方は⌃Spaceを有効化する設定を行うことで、さらに便利に使えるようになります。

みなさんもぜひ、この記事を参考にショートカットキーを活用してみてください！  
もし他にも便利なショートカットやおすすめの設定があれば、コメントで教えてください。