OmniAICreator/Qiita-1.07M huggingface dataset:
Huawei H12-811_V1.0 試験問題

Huawei H12-811_V1.0 試験を控えて不安を感じていますか？あなただけではありません—しかし、良いニュースがあります。CertsTime の専門的に作成された Huawei H12-811_V1.0 試験問題を使えば、自信を持って準備し、完全に準備が整った状態でストレスなく試験に臨むことができます。私たちの Huawei H12-811_V1.0 の最新バージョンと信頼できる練習教材は、実際の試験形式を再現するように設計されており、重要なコンセプトを習得し、本当に重要なことに集中できるようになります。早めに準備を始める方にも、試験直前の最終確認をする方にも、CertsTime は学習の不確実性を解消します。不安を捨てて、スマートな成功への道を選びましょう—CertsTime Huawei H12-811_V1.0 試験ダンプを使えば、試験に簡単に合格できます。多くの新卒者や現職のプロフェッショナルたちも、CertsTime の信頼できる準備教材で Huawei H12-811_V1.0 資格を取得しています。

今すぐ 25% 割引 – コード: SAVE25

無料デモ質問を試す:  https://www.certstime.com/cheat-sheet-h12-811-v1.0-dumps
【Qitta_CLIについて】Qitta_CLIについて少し導入して試してみました。

下記の記事の通り、QittaのCLIによる管理を導入してみました。
### 環境
OS : Linux DESKTOP-C0A2DE7 5.15.153.1-microsoft-standard-WSL2

 大きくてこずる部分はありませんが、記事内であるNode.jsを入れる部分がバージョンが古いなどで何度かググりながらnpmのバージョンを上げたりしました。

https://github.com/increments/qiita-cli

導入が完了すると、Qitta上の記事がローカルにmdファイルの形式で下記のように配置されます。

```bash
(base) user@DESKTOP-C0A2DE7:~/Github_repo/qiita/public$ cat 4d1f0389ba86abeeaccf.md
---
title: 【Linuxメモ】Railsインストール時のawkのreinstallについて
tags:
  - Railsインストール時のawkのreinstall
private: false
updated_at: '2025-03-01T17:54:48+09:00'
id: 4d1f0389ba86abeeaccf
organization_url_name: null
slide: false
ignorePublish: false
---
RubyのRailsインストール時にawkのreinstallを実施した時の、個人用の備忘メモです。
 brew reinstall awk
を実行して、エラーなくRailsがインストールされた
```

　このqiitaのディレクトリをGithub側のレポジトリにプッシュして、Github側で管理するわけです。個人的にはQittaをブラウザ上で編集した方がやりやすいかなぁというのが個人的な本音ですねぇ。

 以上
【Python】クラスの継承


ベースになるクラスを基底クラスと呼び、基底クラスから派生したクラスを派生クラスと呼びます。

派生クラスは「class クラス名(基底クラス名):」と記述します。

基底クラスの変数やメソッドを派生クラスで利用する場合はsuper()関数を使います。
Kotoba.ai：私たちはどのようにして「語気をアップグレードする」敬語変換AIツールを作ったのか


はじめに
日本語における「敬語」は、単なる文法の話ではなく、文化そのものです。
Kotoba.ai は、あらゆる日本語使用者が「もっと自然に・もっと適切に」敬語を使えるようにするためのツールです。

この記事では、Kotoba.ai の開発背景・技術構成・機能設計を紹介しつつ、敬語を扱う際に私たちが直面した課題と、それに対するAIソリューションを共有します。

なぜ敬語なのか？（Why we built this）
多くの翻訳ツールやチャットボットは、文法や単語の正確性に注目していますが、「語気」「距離感」「場面による言い換え」には十分対応できていないケースが多いと感じていました。
特に日本語における敬語のバリエーション（丁寧語・謙譲語・尊敬語など）は、文脈や相手との関係性に強く依存するため、単純な文法変換では対応できません。
そこで私たちは、「場面に応じた敬語生成」をテーマに、AIでどこまで丁寧な語気制御が可能かを挑戦しました。

機能概要（Features）
✨ 一文敬語アップグレード機能：入力文を自動で複数パターンの敬語に変換

📜 ことば図書館（例文集）：生成した敬語例文を保存・再編集・共有可能

🧧 小神社モード：おみくじ＋願い事機能を搭載、語気と運勢を融合

💼 ビジネス・履歴書・ご近所などのシーン別対応

今後の展望（Future Plans）
文法修正にとどまらず「語気診断」機能の拡充

海外学習者向けの自動フィードバックモード

モバイルアプリ版の展開

サイトURL
👉 https://kotobaai.jp
【Python】デコレーター関数

デコレーター関数を作成する流れは以下です。

1. デコレーター関数を定義して、デコレート対象の関数を引数として受け取る。

1. デコレーター関数の中にデコレート対象の関数に代わりに呼び出されるラッパー関数を定義し、その中でデコレーター関数の引数で受け取った関数を呼び出す。

1. デコレーター関数の戻り値としてラッパー関数を返す。

デコレーター関数は、問題文のように@デコレーターを付けるだけで、既存の関数に処理を加えることができます。
GitHub ActionsでClaude Codeが「Credit balance is too low」エラーになる問題と対処法

# はじめに

GitHub ActionsでClaude Codeを使用していると、突然「Credit balance is too low」というエラーが発生し、ワークフローが失敗することがあります。本記事では、このエラーの原因と対処法について詳しく解説します。

# エラーの概要

## 発生するエラーメッセージ

```json
{
  "type": "error",
  "error": {
    "type": "invalid_request_error",
    "message": "Your credit balance is too low to access the Anthropic API. Please go to Plans & Billing to upgrade or purchase credits."
  }
}
```

このエラーは、Claude APIのクレジット残高が不足している場合に発生します。

## 実際のGitHub Actionsでの表示例

```
Error: Process completed with exit code 1.
Credit balance is too low
```

# エラーの原因

## 1. 実際にクレジット残高が不足している

最も単純な原因は、Anthropic APIのクレジット残高が実際に不足していることです。

## 2. APIキーの設定ミス

GitHub SecretsにAPIキーが正しく設定されていない、または無効なAPIキーを使用している場合もこのエラーが発生します。

## 3. 既知のバグ

実は、十分なクレジット残高があるにも関わらずこのエラーが発生するケースが多数報告されています：

- [Issue #867](https://github.com/anthropics/claude-code/issues/867): $50のクレジットがあるのにエラー
- [Issue #627](https://github.com/anthropics/claude-code/issues/627): クレジットがあるのにエラー
- [Issue #1245](https://github.com/anthropics/claude-code/issues/1245): 組織にクレジットがあるのにエラー

## 4. レート制限との混同

フリープランのレート制限に達した場合でも、「Credit balance is too low」というエラーメッセージが表示されることがあります。

# 対処法

## 1. クレジット残高の確認

まず、[Anthropic Console](https://console.anthropic.com/)にログインして、実際のクレジット残高を確認します。

```bash
# APIキーが正しく設定されているか確認
echo $ANTHROPIC_API_KEY
```

## 2. クレジットの購入

残高が不足している場合は、最低$5からクレジットを購入できます：

1. Anthropic Consoleにログイン
2. "Plans & Billing"セクションへ移動
3. クレジットを購入（最低$5）

## 3. GitHub Secretsの設定確認

```yaml
# .github/workflows/claude-code.yml
env:
  ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
```

GitHub リポジトリの Settings > Secrets and variables > Actions で、`ANTHROPIC_API_KEY`が正しく設定されているか確認します。

## 4. 一時的な回避策

バグの場合の一時的な回避策：

```yaml
# リトライロジックの追加
- name: Run Claude Code with retry
  run: |
    for i in {1..3}; do
      if claude-code your-command; then
        break
      fi
      echo "Retry attempt $i..."
      sleep 10
    done
```

## 5. 代替手段の検討

エラーが続く場合は、以下の代替手段を検討：

- Claude APIの直接使用（Claude Code経由ではなく）
- 他のAI APIサービスの利用
- ローカル環境でClaude Codeを実行してからコミット

# デバッグ方法

## 1. 詳細なログの確認

```yaml
- name: Run Claude Code with debug
  env:
    DEBUG: true
  run: claude-code --verbose your-command
```

## 2. APIダッシュボードでの確認

Anthropic APIダッシュボードで以下を確認：
- リクエスト履歴
- エラーコード（499エラーなど）
- 使用量の推移

## 3. 組織アカウントの確認

組織でAPIを使用している場合：
- 組織のクレジット残高
- メンバーの権限設定
- 組織のAPIキーの有効性

# まとめ

「Credit balance is too low」エラーは、実際のクレジット不足以外にも様々な原因で発生する可能性があります。まずは基本的な確認事項をチェックし、それでも解決しない場合は既知のバグの可能性を疑い、GitHubのIssueを確認することをお勧めします。

このエラーに遭遇した場合は、[Claude Codeのリポジトリ](https://github.com/anthropics/claude-code/issues)でIssueを検索するか、新しくIssueを作成して報告することで、問題の早期解決に貢献できます。

# 参考リンク

- [Anthropic API Console](https://console.anthropic.com/)
- [Claude Code GitHub Repository](https://github.com/anthropics/claude-code)
- [Anthropic API Documentation](https://docs.anthropic.com/en/api)
- [GitHub Actions Secrets Documentation](https://docs.github.com/en/actions/security-guides/encrypted-secrets)
【Python】ジェネレーター式の構文

ジェネレーター式の構文は「(式 for 変数 in イテラブル)」です。丸カッコのためタプルのようですが、タプルに内包表記はありません。

ジェネレータオブジェクトは値を取得するまで次の値が作られないため、インデックスでは取得できません。for文かnext関数で取得します。
pyenv+poetryの初期設定

# pyenv + poetry セットアップガイド

## 1. 前提条件
- macOS
- Homebrew がインストール済み
- zsh シェルを使用

## 2. インストール手順

### 2.1 pyenvのインストール
```bash
# Homebrewを使用してpyenvをインストール
brew install pyenv

# 環境変数の設定（~/.zshrcに追加）
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc
echo 'eval "$(pyenv init -)"' >> ~/.zshrc
```

### 2.2 poetryのインストール
```bash
# poetryのインストール
curl -sSL https://install.python-poetry.org | python3 -

# PATHの設定（~/.zshrcに追加）
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc

# 設定の反映
source ~/.zshrc
```

## 3. 基本的な使用方法

### 3.1 pyenvの使用方法
```bash
# Pythonバージョンの一覧表示
pyenv versions

# 特定のバージョンをインストール
pyenv install 3.11.0

# グローバルバージョンの設定
pyenv global 3.11.0

# ローカルバージョンの設定（プロジェクトごと）
pyenv local 3.11.0
```

### 3.2 poetryの使用方法
```bash
# 新規プロジェクトの作成
poetry new プロジェクト名

#　環境はpython3.11を使用
poetry env use python3.11

# 既存プロジェクトの初期化
poetry init

# パッケージのインストール
poetry add パッケージ名

# 開発用パッケージのインストール
poetry add --dev パッケージ名

# 仮想環境の有効化
poetry shell

# 依存関係のインストール
poetry install
```

## 4. 推奨設定

### 4.1 poetryの設定
```bash
# 仮想環境をプロジェクトディレクトリ内に作成
poetry config virtualenvs.in-project true

# 並列インストールを有効化
poetry config installer.parallel true
```

## 5. プロジェクト構成例
```
my-project/
├── .venv/                  # 仮想環境（poetry config virtualenvs.in-project true の場合）
├── .python-version         # pyenvのローカルバージョン設定
├── pyproject.toml         # poetryの設定ファイル
├── poetry.lock           # 依存関係のロックファイル
└── src/                  # ソースコード
    └── my_project/
        ├── __init__.py
        └── main.py
```

## 6. トラブルシューティング

### 6.1 よくある問題と解決方法
1. パスが通っていない場合
   - `~/.zshrc` の設定を確認
   - `source ~/.zshrc` で設定を再読み込み

2. poetryコマンドが見つからない場合
   - `which poetry` で実際のパスを確認
   - PATHが正しく設定されているか確認

3. pyenvでPythonのインストールに失敗する場合
   - Xcodeコマンドラインツールが最新かを確認
   - `xcode-select --install` を実行

## 7. 参考リンク
- [pyenv GitHub](https://github.com/pyenv/pyenv)
- [Poetry 公式ドキュメント](https://python-poetry.org/docs/)
＜大嶋淑之・新潟＞映像制作の醍醐味と創造の自由

こんにちは、大嶋淑之です。

私はフリーランスとして映像制作を行っていますが、映像の世界には無限の可能性が広がっており、毎日が新しい挑戦の連続です。映像制作には、ただの「記録」や「表現」にとどまらない深い醍醐味があります。今日は、その魅力と、私自身がどのように映像制作に取り組んでいるのかをお話ししたいと思います。

映像制作の醍醐味の一つは、**「視覚的なストーリーテリング」**にあります。文字や音だけでは伝えきれない感情やメッセージを、映像を通じて表現できる力があるのです。例えば、企業のプロモーション動画を作る際、どんなカットをどのタイミングで入れるかが、映像の印象を大きく変えます。視覚的な要素が物語の展開を加速させたり、感情を引き出したりする瞬間が、映像制作の面白さの一つだと感じています。

また、映像制作では**「技術とアートの融合」**が求められます。例えば、カメラワークやライティング、音響といった技術的な部分と、色合いや構図、ストーリーテリングといったアート的な部分。この両者をバランスよく組み合わせることで、視覚的に魅力的な作品が生まれるのです。例えば、暗いシーンにスポットライトを当てることで、重要なキャラクターを強調し、物語の緊張感を高めるといったテクニックがあります。これらをうまく使いこなすことで、映像に深みを持たせ、視聴者を引き込む力が生まれます。

映像制作をしていると、**「伝えるべきメッセージをどれだけ効果的に表現するか」**という課題に直面します。例えば、企業のイメージビデオであれば、ブランドのストーリーを映像を通して伝える必要がありますが、それだけでなく、視覚的に「どれだけ魅力的に見せるか」も非常に重要です。クライアントの要望をしっかりと理解し、どんな映像にすればそのメッセージが効果的に伝わるのかを考えるプロセスは、映像制作の中でも最も刺激的な部分です。

さらに、映像制作における**「試行錯誤の楽しさ」**も大きな魅力の一つです。映像は一度作り上げてしまうと、それが完成形として永久に残ります。しかし、その過程では何度も構成を変えたり、エフェクトを調整したり、色合いを変更したりと、試行錯誤を繰り返します。最初はイメージしていたものと違う方向に進んでしまったり、うまくいかなかったりしても、最終的に「これだ！」という瞬間に辿り着いた時の達成感は格別です。その過程が楽しさとやりがいを感じさせてくれます。

映像制作の自由度もまた魅力的です。映画や広告、YouTube動画、SNSコンテンツなど、ジャンルにとらわれることなく自由に創造することができます。技術的に洗練された作品を作ることもあれば、感覚的に心に残る映像を作ることもあります。その自由度が、映像制作の大きな魅力です。技術の進化により、誰でも手軽に映像を作れる時代になった中で、クオリティやアイデア、そしてその実行力が作品の評価を大きく左右します。

最後に、映像制作で最も魅力的だと感じる点は、**「作品が視聴者に与える影響」**です。完成した映像を見た時に、視聴者が感動したり、考えさせられたり、行動を起こしたりする様子を見ることができるのは、映像制作の中で最も満足感を感じる瞬間です。映像がどれだけ人々の心に響くかを考えながら、制作している自分がいます。

映像制作は、技術的な側面と創造的な要素がうまく絡み合う仕事です。日々試行錯誤しながら、どれだけ面白いものが作れるかを考えることが、私の仕事の醍醐味だと感じています。映像制作の魅力は無限大です。これからも、さらに多くの素晴らしい映像を作り出していきたいと思っています。
[CCNA]受験体験談,IT未経験(1)



# 今回やること

・CCNA受験の体験談と、勉強方針の記録をまとめています:writing_hand:

# 0.初めに

現在自分は**インフラエンジニア**🧑‍💻を目指しており、その第一歩としてCCNAの講習を受け、6月に無事合格することができました:tada:

この記事では、**受験当日の様子や勉強方法**を紹介していきます。

>💡筆者もまだ勉強中なので、内容は7割くらいの信頼度で読んでください。
また**コメント**していただけると、私の大きな学びになるので是非お願いします。

# 1.CCNAの概要


| 項目    | 内容                                |
| ----- | --------------------------------- |
| 主催    | Cisco Systems                     |
| 対象者   | 初級〜中級ネットワーク技術者、インフラエンジニア志望者       |
| 試験時間  | 120分（日本語対応あり）                     |
| 合格ライン | 非公開（※おおよそ70％前後と思われる）            |
| 有効期限  | 3年間                               |
|問題数|約 83問|
|受験料|46,860円|

### 試験について:page_with_curl:
受験方法は**「オンライン受験」**と**「会場受験」**の2つがあります。
オンライン受験は不正対策が非常に厳しいため、ストレスを感じやすいという声も。
そのため、**会場受験をおすすめします**。

* 試験時間は**120分**ですが、自分はゆっくり解いても**15分**ほど余裕がありました。

* 暗記問題も多いため、時間に追われることは少ないです。

* 自分は30問ごとに **5分ほどの休憩**を取り、リフレッシュしながら進めました。

試験後には簡単なアンケートがあり、それが終わると**即座に合否結果が表示**されます。
最後に受付でA4用紙3枚（大まかな配点と合否結果）が渡されて終了です。
 
<br>

### 問題について:writing_hand:
自分の当日の問題数は83でした。また問題を解いたら**後戻りｈｓできない**ので気をつけてください。<br>

- **選択問題（約80問）**
  - 四択一答
  - 複数選択
  - ドラッグ＆ドロップ
- **実技問題（3問）**
  - 仮想機器にコマンドを入力するシミュレーション形式
  - 出題タイミングはランダム
 :::note info
シミュレーション問題
> 公式から配点の情報は無いのであくまで、ネットの意見や今までのCCNAの傾向によるものということを留意して下さい。

- 実技試験は **部分点** をもらえることがあります。途中までコマンドを入力し、保存コマンドを打つだけでも点数が入る可能性があります。

- また、**配点はそれほど高くない** 傾向にあります。難易度は高めですが、仮に3問すべてスキップしても、選択問題で7割以上正解すれば合格できたという報告もあります。


:::



# 2.問題の特徴と対策



### 🔹 1. 問題文が読みづらい
- 専門用語や横文字が多く、図も情報量が多い。
- **文を整理して読むスキル**が必要。

### 🔹 2. IPv4の計算力が重要
- 例：`192.168.1.28/26` のようなアドレスを **2進数に変換**する必要あり。
- **IP計算の練習**を繰り返すことが重要。

### 🔹 3. 覚える用語が多い
- NAT、ACL、TCPなど**英語3文字の略語**が大量に登場。
- **語呂合わせやイメージ記憶**で工夫して暗記を。

### 🔹 4. 問題のパターンが決まっている
- 問題文は複雑でも、問われている内容はシンプルなことが多い。
- **よく出るパターンを覚える**ことが効率的。


# 終わりに

お疲れ様でした。
少し長くなりそうだったので、一旦ここで終わりにして具体的な対策については次の記事に書いていこうと思います。

もし誰かの役にたてたなら幸いです。
またコメント待っていますので、「みたよ」だけでもいいので是非よろしくお願いします。

[次記事]→https://qiita.com/yoshiwork777/items/6015db9f660d3ebe2881
データを消さずにMBRをGPTに変換する方法は？安全に行う手順

MBRからGPTに変換しようとしたとき、「データが消えちゃうんじゃないのか？」と心配になったこと、ありませんか？

実は、Windowsの標準機能を使うと、**変換中にディスク内のデータがすべて消えてしまう**んです。でも、**専用の変換ソフトを使えば、データをそのままにして安全に変換する**ことができます！

この記事では、以下のポイントを解説します：

- [MBRとGPTの違い](https://partition.aomei.jp/gpt-mbr/mbr-vs-gpt.html/?_ut=llyy_djl_qiita_aomei)
- 変換が必要な理由
- データを保持したまま安全に変換する方法

# MBRとGPTの違いとは？なぜ変換が必要なのか

**MBR（マスターブートレコード）**と**GPT（GUIDパーティションテーブル）**は、ディスクのパーティションを管理する方式です。

- **MBR**：古い形式で、最大2TBまでしか認識できず、パーティションも4つまで。
- **GPT**：新しい形式で、2TB以上の大容量ディスクに対応し、128個以上のパーティションが作成可能。

最近では、**Windows 11**などの最新OSではGPT形式が推奨されており、**UEFIモードでの起動**にも必須です。そのため、MBRからGPTへの変換が必要になるケースが増えています。

# MBRからGPTに変換する2つの方法

## 方法① データを削除して変換（Windows標準機能）

Windowsに標準搭載されている `diskpart` [コマンド](https://partition.aomei.jp/articles/what-is-the-command-prompt-5533-gc.html/?_ut=llyy_djl_qiita_aomei)を使って、MBRをGPTに変換する方法です。ただし、**すべてのデータが消去される**ので注意が必要です。

### 手順

1. 検索ボックスに「`diskpart`」と入力し、右クリックで「**管理者として実行**」。
2. 以下のコマンドを順に実行：

    ```cmd
    list disk
    select disk x   # xは変換対象のディスク番号
    clean
    convert gpt
    ```

3. `clean`コマンドでディスク上のパーティションがすべて削除されます。
4. 最後に `convert gpt` で変換を実行。

> ⚠️ この方法は**事前に必ずバックアップが必要**です。初心者にはややリスクがあります。

## 方法② データを保持して変換（専用ソフトを使用）

**MBRとGPTの間でデータを保持したまま変換するには、専用ソフトの使用が最も安全かつ確実**です。

### おすすめソフト：AOMEI Partition Assistant

このソフトは、以下のような特徴があります：

- データを消さずにMBR⇔GPTを相互変換
- わかりやすい日本語UI
- 数クリックで変換が完了
- システムディスクにも対応

> 「**データを失いたくない**」「**安全に変換したい**」「**バックアップが面倒**」という方に最適！

[✅ AOMEI Partition Assistantのダウンロードはこちら](https://partition.aomei.jp/download.html?_ut=llyy_djl_qiita_pa)  

### 操作手順

1. AOMEI Partition Assistantをインストール・起動。
2. 対象ディスク（例：MBR形式のディスク0）を右クリック → 「**GPTディスクに変換**」を選択。
![GPTディスクに変換.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115730/5021b6a3-3924-4206-9b9d-c78b2f19cce6.png)
3. 確認画面で「**はい**」をクリック。
![はいをクリック.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115730/24d133c5-c3fc-4aca-9e53-1fa41f464d72.png)
4. 「**適用**」をクリックして変換を実行。
![適用.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115730/417c0a4b-2680-4831-8487-7fae6e9866ef.png)

> ※MBRディスクには「GPTディスクに変換」、GPTディスクには「MBRディスクに変換」と表示されます。

# まとめ

MBRからGPTへの変換は、**Windowsの最新機能や大容量ディスクを活用する上で重要なステップ**です。

- `diskpart`を使えば無料で変換できるが、データがすべて消えるリスクあり。
- **データを保持したまま変換するなら、専用ソフトがベスト。**

特に、**AOMEI Partition Assistant**は初心者でも扱いやすく、安全性にも優れているため、強くおすすめします。大切なデータを守りながら、スムーズにMBRからGPTへの移行を実現しましょう。

[公式サイトはこちら](https://www.aomei.jp/?_ut=llyy_djl_qiita_aomei)
Flutter "Target of URI doesn't exist:..."

なぜか、自分で作ったdartファイルがインポートできない。

```
import 'package:myproject/test.dart'; # エラー発生

# vscode 
Target of URI doesn't exist: 'package:myproject/test.dart'.
Try creating the file referenced by the URI, or try using a URI for a file that does exist.darturi_does_not_exist
```

通った。

```
import './test_import.dart';
```
【さくらのクラウド】オリアプのデプロイを目標に学習開始しました。

# ☁️ 日本のクラウドサービスを学ぶ：さくらのクラウドとさくらインターネットのサービスまとめ

今回は、日本発のクラウドサービスである「さくらのクラウド」について、提供元である**さくらインターネット**の各種サービスとあわせて学習しました。
自身のオリジナルWEBアプリをAWSにてデプロイしましたが、日本のクラウドサービスであるさくらインターネットの
「さくらのクラウド」においても稼働させてみたいと思いたち、学習を開始しました。

**※あくまで自身が学習し、解釈した内容となります。**
　

---

## 🌸 さくらインターネットのサービス一覧

### ✅ クラウドサービス

- **さくらのクラウド**  
- **さくらのVPS（Virtual Private Server）**  
- **さくらのレンタルサーバ**（クラウドアプリケーションとして）  

### ✅ 物理基盤サービス

- **さくらの専用サーバ PHY**  
- **高火力PHY**  
- **データセンター（国内複数拠点）**

### ✅ 周辺サービス

- **さくらのIoT**
- **さくらのSSL**
- **ImageFlux**
- **ウェブアクセラレータ**

> 🚀 これらのサービスにより、**幅広いニーズに対応した計算資源**が提供されています。

---

## 🏗 クラウドインフラストラクチャー

### 🌐 IaaS基盤とは？

さくらのクラウドが提供するのは、**IaaS（Infrastructure as a Service）** 型のクラウドです。  
以下のようなインフラが、ユーザーの操作で自由に構成できます。

- サーバー
- ストレージ
- ネットワーク

---

## ☁️ さくらのクラウドが持つパブリッククラウドの特徴

| 特徴 | 内容 |
|------|------|
| オンデマンド・セルフサービス | 必要なときに、ユーザーが自分でリソースを調達可能 |
| 幅広いネットワークアクセス | 多様なネットワークからアクセス可能 |
| リソースの共用 | 仮想化された環境でリソースを共有 |
| サービスが計測可能 | 使用量を測定・課金できる仕組みがある |

---

## 🌟 さくらのクラウドの特徴（独自性）

- 2011年11月にサービス提供開始
- **データ転送量による従量課金なし → コスト最小化可能**
- サーバやストレージ等の料金は**利用時間に応じた最安値**が適用される
- 国内2箇所のリージョン（石狩・東京）を使い分け可能
- **直感的なコントロールパネル**と**IaC（Infrastructure as Code）対応API**
- 他サービスとの連携に強く、リソース種別も豊富

---

## 🚀 注目の関連サービス

### AppRun

- コンテナ化されたアプリケーションを**簡単にデプロイ**
- トラフィック量に応じた**自動スケーリング**が可能

### 高火力Doc（Docker）

- **NVIDIAのGPU**を使用可能な、コンテナ型クラウド
- **Dockerイメージで高速実行**できる設計

### 高火力VRT（Virtual）

- **VM型のGPUクラウドサービス**
- さくらのクラウドと**シームレスに接続**

---

## 🖥 さくらのVPSとは？

- VPS（Virtual Private Server）：**仮想専用サーバー**
- **管理者権限あり**（root権限を持てる）
- **OS再インストールやミドルウェア構築が自由**
- スケール**アウトは不可**、スケール**アップは簡単**
- 複数VPS間の**ローカルネットワーク接続が可能**

---

## 🆚 パブリッククラウド vs VPS（さくらのクラウドとさくらのVPSの違い）

| 比較項目 | さくらのクラウド | さくらのVPS |
|----------|------------------|--------------|
| 仮想基盤の冗長性 | 高い（障害時でも即復旧） | 低い（物理障害で停止） |
| スケールアウト | 可能 | 不可 |
| 管理自由度 | 高い | 高い |
| 自動化・API連携 | あり | 一部制限あり |
| コスト | 柔軟（時間単位課金） | 月額固定が多い |

---

## 📝 まとめ

- **さくらのクラウド**は、日本国内で提供されている高機能・高信頼のIaaS型クラウドサービス
- 他にもVPSや専用サーバ、IoT系など豊富なサービスラインナップを提供
- 初学者でも扱いやすい**GUIとAPIの両対応**
- コスト面でも良心的で、**国内ユーザーにとって安心な選択肢**

---
SwiftUIの@EnvironmentObjectとは？簡単に解説してみた！

SwiftUIを使ってアプリを作る中で、複数の画面やコンポーネント間で共通のデータを扱いたい場面はよくあります。そんなときに便利なのが、@EnvironmentObjectです。

@EnvironmentObjectとは？
---
@EnvironmentObjectは、SwiftUIでアプリ全体に共有できるデータを扱うための仕組みです。

簡単に言えば、

- 画面Aで更新したデータを、画面Bでも自動で反映したい

- いろんなViewで共通の状態を使いたい

といった場面などで使われます。

それぞれの違い
--
@State → そのViewだけの状態

@ObservedObject → 親から渡されたデータを監視

@EnvironmentObject → アプリ全体に共有するデータを使う

使い方ステップ
--

① 共有したいデータをクラスとして定義
```swift
class UserSettings: ObservableObject {
    @Published var username: String = "ゲスト"
}
```
② .environmentObject()注入
```swift
@main
struct MyApp: App {
    var settings = UserSettings()

    var body: some Scene {
        WindowGroup {
            ContentView()
                .environmentObject(settings)
        }
    }
}
```
③ 子Viewで@EnvironmentObjectを使う
```swift
struct ContentView: View {
    @EnvironmentObject var settings: UserSettings

    var body: some View {
        VStack {
            Text("こんにちは、\(settings.username)さん！")
            NavigationLink("名前を変更", destination: EditView())
        }
    }
}

struct EditView: View {
    @EnvironmentObject var settings: UserSettings

    var body: some View {
        TextField("名前を入力", text: $settings.username)
    }
}
```
最後に
--
@EnvironmentObjectを使えば、複雑なデータの受け渡しをシンプルにできます。MVVMアーキテクチャ（Model-View-ViewModel）に個人的に非常に役に立つと思います！ぜひ参考にしてみてください! 🙌
ネットワークに関する基礎を再学習しました②。

# 🌐 ネットワークの基礎を学ぶ：ARP・DNS・ドメイン・インターネットの仕組み

しばらく転職活動準備やオリジナルアプリ制作に時間を割いていたため、投稿ができていませんでした。
これから少しずつ投稿していきます。オリジナルアプリ制作中に気づいたことなども投稿していきたいですが
今回はインフラ領域について学習（再学習含む）した内容を記事にしました。

本記事では、ネットワークを学び始めた方向けに「ARP」「DNS」「URLとドメイン名」「インターネットの構成」などをまとめました💡  

---

## 🔄 ARPとは？  
ARP（Address Resolution Protocol）は、**IPアドレスからMACアドレスを調べるプロトコル**です。

### 🧩 通信の流れ
1. **ARPリクエスト**  
　→ 通信相手のMACアドレスが分からないとき、ネットワーク全体に「このIPアドレスのMACアドレスは誰？」とブロードキャスト送信。

2. **ARPリプライ**  
　→ 対象のIPを持つ端末が「それは私です」と自分のMACアドレスを返答。

3. **対応付け完了**  
　→ IPアドレスとMACアドレスが結びつき、通信できるようになる。

---

## 🌍 インターネットとは？
インターネットとは、**世界中のネットワーク同士が相互に接続された仕組み**です。

---

## 🛰 インターネット通信の仕組み
外部のネットワークへ接続するには、**ルーター**や**ISP（インターネットサービスプロバイダ）**を利用します。

---

## 🏢 ISPとIXの違い

| 用語 | 内容 |
|------|------|
| **ISP（Internet Service Provider）** | インターネット接続を個人や企業に提供する事業者（例：OCN、auひかりなど） |
| **IX（Internet Exchange）** | 複数のISPを相互接続するための専用設備。データセンター同士をつなぐ役割もある。 |

---

## 🏬 データセンターとは？

- サーバなどのIT機器を保管・管理・運用するための施設
- 耐震設備や自家発電装置を備える
- 近年は**省電力化**や**再生可能エネルギー**の導入が進んでいる

---

## 🧵 バックボーンとは？

- ネットワークの中核となる**主要な通信経路**
- 通常は**拠点間や事業者間を結ぶ重要な回線**を指す

---

## 🌐 ドメインとIPアドレスの関係

### IPアドレス
- 通信相手を指定するための識別番号（例：192.168.1.1）
- 人間には覚えにくいため、「ドメイン名」を使って名前解決する

### DNS（Domain Name System）
- IPアドレスとドメイン名の**相互変換**を行う仕組み

#### 権威DNSサーバ
- 自分が管理するドメインの情報（ゾーンファイル）に基づいて返答

#### キャッシュDNSサーバ
- クライアントからの問い合わせを一時保存し、他のDNSサーバに問い合わせて応答

### DNSレコードの形式

- `www`：ホスト名  
- `IN`：インターネットクラス  
- `A`：IPv4アドレス  
- `192.168.3.45`：対応するIPアドレス

---

## 🔗 URLとドメイン名の関係

### URLの構成例

例：`https://www.example.co.jp/blog/exfile`

| 要素 | 説明 |
|------|------|
| プロトコル | `https`：通信の種類 |
| ホスト名 | `www`：ネットワーク内の特定のホスト |
| ドメイン名 | `example.co.jp`：インターネット上の一意の名前 |
| パス | `/blog/exfile`：ファイルの場所 |

### FQDN（Fully Qualified Domain Name）

- ホスト名＋ドメイン名の完全な形式（例：`www.example.co.jp`）

---

## 🔍 ホスト名とドメイン名の補足

- **ホスト名**：ネットワーク内で特定の端末を識別する名前（自由に設定可能）
- **ドメイン名**：一意に割り当てられたインターネット上の住所（発行サービスが必要）

---

## ✅ まとめ

- ARPにより、IPアドレスとMACアドレスを結びつける
- インターネットはルーターやISPを介して接続
- DNSはドメイン名とIPアドレスの橋渡しを担う
- URLはプロトコル・ホスト名・ドメイン名・パスの組み合わせで構成されている

---
Rails 豆知識シリーズ（"p"メソッド、括弧の省略）

## 先輩「デバックするときは puts じゃなくて p メソッドを使うといいよ！」よくわかっていない俺「ぽよ？」
皆さんはデバックしていますか？俺はデバックあんまり好きじゃないです。
大昔、先輩に言われたことをようやっと理解したので、備忘録として記録します。

最近仕事の隙間時間にRailsチュートリアルを読み直しているんですけど、抜け落ちているところや２年前は理解できなかったことなどをつらつら書いていきたいと思います。


## p メソッドは puts ●●.inspect の省略形
いやマジで知らなかったです。
リテラル（そのままの形）で出力されるんですね。
だから、オブジェクトがどのような形なのかっていうのが put メソッドでは見えずらいから p を使おうっていう話だったんですね。ありがとうございます先輩。

## 括弧の省略


```rb
stylesheet_link_tag "application", "data-turbo-track": "reload"
```

上記のコードが、下記のコードの省略形って初見でわかる人いるんですかね...。

```rb
stylesheet_link_tag("application", { "data-turbo-track": "reload" })
```

ポイントは二つで、
・Rubyのメソッド呼び出しの丸括弧は省略できる
・ハッシュがメソッド呼び出しの最後の引数である場合は、波カッコを省略できる
らしいです。

## 感想
ほかの人のコードなどを読む際に、Railsは特に省略などが激しい言語なのでこういう知識は丸暗記しておくとスムーズに読めそうです。まぁ、なんとなくでわかるやろって言われたらそれまでですが。
Railsマスター目指してガンバルビィ！コットンキャンディえいえいおー！
＜元島純貴＞エラーを怖がらずに試した結果

最近、あるプロジェクトで「何か新しいことに挑戦してみよう！」という気持ちから、ちょっとだけ「エラー」を意図的に起こしてみました。普段、エラーが出ると「あ、またか…」と、つい焦ったり、落ち込んだりしてしまいますよね。でも今回は「エラーを怖がらずに、あえて挑戦してみるとどうなるのか？」という実験をしてみたんです。

使ったのは、JavaScriptとNode.jsを使った簡単なAPIの開発。普段、エラーが出るとその原因をすぐに調べて解決するんですが、今回はわざとエラーを起こして、どんなエラーメッセージが表示されるのか、またそれをどのように解決するのかを一つ一つ試してみました。

最初に挑戦したのは「モジュールが見つからない」というエラー。通常、このエラーが出た時点で、「あ、モジュールをインストールし忘れたな」と即解決に向けて動きますが、今回はそのエラーメッセージをじっくり観察。よく見ると、「どのモジュールが足りないか」が詳細に記載されていることに気づきました。普段、流し読みしていたエラーメッセージですが、その一行一行が実は問題を解決する手がかりをしっかりと提供していたんです。

次に挑戦したのが、非同期処理のエラー。async/awaitを使っているときに、エラーが発生してしまいました。「なぜ動かないんだ？」と、焦りながらデバッグしていたんですが、ふと「試しにエラーハンドリングを変更してみよう」と思い立ち、try/catchを駆使してエラーハンドリングをカスタマイズしてみたんです。その結果、エラーメッセージが非常に分かりやすくなり、エラーの場所を一発で突き止めることができました。

さらに面白かったのは、データベースとの接続時に「接続タイムアウト」のエラーが出たときです。このエラーが出ると、いつもはすぐに接続設定を見直すのですが、今回は「タイムアウト」がなぜ発生するのか、ネットワークやサーバーの状態も確認しつつ、設定値をいろいろ変更してみました。その結果、タイムアウトの原因が単に接続先のホスト名を間違えていたことに気づき、あっけなく解決！

最初は「エラーって怖い」「すぐに解決しなきゃ」と思っていた自分が、今では「エラーが起こった時こそ新しい発見のチャンス！」と感じるようになったんです。エラーメッセージを深掘りして調べたり、エラーを意図的に起こしてみることで、普段見落としていた細かいポイントに気づけるようになったことが、思わぬ成果となりました。

この経験から学んだことは、エラーは問題を解決するための「手がかり」であり、ただ怖がって避けるべきものではないということ。むしろエラーを意識的に扱うことで、開発者として成長できる部分があると実感しました。

次回からは、エラーが出ても「あ、また面白い学びがあるな！」とポジティブに捉えて、もっとエラーに挑戦していこうと思います。みなさんも、エラーを恐れずに「どうやったら解決できるか？」を楽しんでみてください。思わぬ発見があるかもしれませんよ！
Jetpack ComposeでApple Watch風の「くるくる回るコイン」を再現する

## はじめに
Apple Watchでアクティビティを達成した際に表示される、あのコインがくるっと回転する演出について、Jetpack Composeで再現できるか気になったので試してみました。

今回実装したものは以下のような動きです。

![preview](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/354522/eefcaf0e-79dc-4049-b129-6163dce8f845.gif)

## 使用技術と前提

- Jetpack Compose 1.6以降
- Kotlin 2.0
- Animatable を使用して状態を管理
- pointerInput と VelocityTracker を組み合わせたスワイプ検知
- graphicsLayer による rotationY 制御

## 実装の概要

回転の制御には `Animatable<Float>` を使用し、スワイプ中の回転は `snapTo`、指を離したあとの惰性回転は `animateDecay` を用いています。

また、rotationZ ではなく rotationY を使うことで、奥行きのある「立体的な回転」を実現しています。

## コード全体

```kotlin
@Composable
fun InteractiveCoin() {
    val rotation = remember { Animatable(0f) }
    val scope = rememberCoroutineScope()
    val density = LocalDensity.current

    val decay = remember {
        splineBasedDecay<Float>(density)
    }

    Box(
        modifier = Modifier
            .fillMaxSize()
            .pointerInput(Unit) {
                val velocityTracker = VelocityTracker()

                detectDragGestures(
                    onDragStart = {
                        velocityTracker.resetTracking()
                    },
                    onDragEnd = {
                        val velocity = velocityTracker.calculateVelocity().x
                        scope.launch {
                            rotation.stop()
                            rotation.animateDecay(
                                initialVelocity = velocity,
                                animationSpec = decay
                            )
                        }
                    },
                    onDrag = { change, dragAmount ->
                        change.consume()
                        velocityTracker.addPosition(change.uptimeMillis, change.position)
                        scope.launch {
                            rotation.snapTo(rotation.value + dragAmount.x)
                        }
                    }
                )
            },
        contentAlignment = Alignment.Center
    ) {
        CoinImage(rotationY = rotation.value)
    }
}

@Composable
fun CoinImage(rotationY: Float) {
    val density = LocalDensity.current

    Image(
        painter = painterResource(id = R.drawable.coin_transparent),
        contentDescription = null,
        modifier = Modifier
            .size(160.dp)
            .graphicsLayer {
                this.rotationY = rotationY
                cameraDistance = 12 * density.density
            }
    )
}
```

## 素材について

今回使用したコイン画像は、背景が透過されたPNG画像です。  
自作しても構いませんが、円形で金属的なテクスチャを用意すると見栄えが良くなります。

## さいごに

今回の実装を通じて、Jetpack Compose でもアニメーションとジェスチャーを組み合わせたリッチなインタラクションを比較的簡単に構築できることがわかりました。

今後もUIのちょっとした再現や工夫を試していきたいと思います。
Laravelのリレーションについて

## リレーションとは
Laravelではテーブルに対応したModelを定義することにより、関連を明示することでデータをうまく扱うことができる。
テーブル同士の関連の種類は、1対1、1対多、多対多、その他にも関係の構文がある。


## リレーション種類

| 名前             | 説明            | 例                |
| -------------- | ------------- | ---------------- |
| hasOne         | 1対1（親→子）      | ユーザー → プロフィール    |
| belongsTo      | 1対1（子→親）      | プロフィール → ユーザー    |
| hasMany        | 1対多（親→子）      | ユーザー → 投稿（複数）    |
| belongsToMany  | 多対多（中間テーブルあり） | 投稿 ↔ タグ          |
| hasManyThrough | 間接的な1対多（2段階）  | 国 → 投稿（ユーザー経由）   |
| morphManyなど    | ポリモーフィック（多形）  | 画像を投稿にも商品にも付けたい等 |

## リレーションの実装例

#### ① ユーザー（User）と投稿（Post）の関係

```models/User.php
public function posts()
{
    return $this->hasMany(Post::class);
}
```
users.id ← posts.user_id で紐付く

```models/Post.php
public function posts()
{
    return $this->hasMany(Post::class);
}
```
#### 使用例
```php
$user = User::find(1);
$posts = $user->posts; // そのユーザーの投稿一覧

$post = Post::find(10);
$user = $post->user;   // 投稿をしたユーザー
```

#### ②多対多（belongsToMany）【例：投稿とタグ】

中間テーブル：post_tag（post_id, tag_id）

```models/Post.php
public function tags()
{
    return $this->belongsToMany(Tag::class);
}
```

```models/Tag.php
public function posts()
{
    return $this->belongsToMany(Post::class);
}
```

#### 使用例

```php
$post = Post::find(1);
$tags = $post->tags; // 投稿に付いてるタグ一覧

$tag = Tag::find(2);
$posts = $tag->posts; // このタグがついている投稿一覧
```
#### 関連データの一括取得

```php
// 投稿とその投稿者をまとめて取得
$posts = Post::with('user')->get();
```
[Mac] ローカル開発環境のディレクトリ構成

# 概要
- 個人的なローカル開発環境のディレクトリ構成についてのメモです
- 主にPoCやその前段階の検証に使用します
- もしお勧め等あればコメント頂けますと嬉しいです

# ローカル開発環境のディレクトリ構成
~~~plaintext
~/projects
└── development
    ├── storybook
    │   ├── poc-v1/
    │   └── poc-v2/
    ├── nextjs
    │   ├── poc-component-lib/
    │   └── poc-performance-test/
    ├── streamlit
    │   ├── poc-dashboard/
    │   └── poc-chat-ui/
    └── shared
        └── templates/
~~~

# 手順(と言う程でもないですが)
## 1. ディレクトリが存在しない場合
- `mkdir`の`-p`オプションで親ディレクトから作成する
    ~~~bash:
    mkdir -p ~/projects/development/storybook/poc-v1
    ~~~
## 2. ディレクトリが既に存在する場合
- `mkdir`でプロジェクト（用ディレクトリ）を作成する
    ~~~bash:
    cd ~/projects/development/storybook/
    mkdir poc-v1
    ~~~
若手エンジニアに送る、超爆絶おすすめ技術書7選😁✌️

今まで様々な本を読んできましたが、その中でも現状のスキルの一助となっている本をピックアップしてみました。

エンジニアとして若年の方を対象としています。
主観も入り混じったコラムのようなものなので気楽に読んでいただけると嬉しいです。

各書籍について、個人的なおすすめ度を示そうかと思ったのですが
いずれも甲乙つけがたいほど優れているためやめてしまいました。

## キタミ式イラストIT塾 基本情報技術者(きたみりゅうじ, 技術評論社)
ジュニアエンジニアの登竜門ともいえる基本情報技術者の参考書です。

僕は新卒1年目の時、他にも基本情報技術者の参考書を1冊手にとったことがありました。
しかし文字びっしりであまり頭にはいってこず、思い悩んでいた時に巡り合った本です。

この本の特徴としては、技術的な説明を文字だけでなくイラストや漫画で表現しているため
対象をイメージして理解することができます。

このテキストで基本情報技術者の勉強をした結果、現場における会話やドキュメントの理解度がいっきに上がった記憶があります。

実際に資格取得までは至らずとも、一度読んでみることをお勧めします。

## Good Code, Bad Code ～持続可能な開発のためのソフトウェアエンジニア的思考(Tom Long, 秀和システム)
ソフトウェアの設計に関する書籍です。

内容は比較的容易ですが、実践的な内容だと思います。
個人的に気に入っているのは「Chapter 4 エラー」です。

設計に関する1つの指針を得られるため、「機能は実装できたけどこの書き方でいいのかな……？」っていう迷いを感じることの多い方におすすめです。

## 体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 (徳丸 浩, SBクリエイティブ)
セキュリティというと、攻撃を防ぐレイヤーが書籍によって違ったりしますが
この書籍はアプリケーションに特化しています。

エクスプロイトコード(もしくはHTTPリクエスト等)をサンプルアプリケーションの脆弱性をつくように実行することによって、より攻撃方法・防御方法について理解を深めることができます。
(適切に防御をするために敵の攻撃手法について理解しておく、ということは大事だと思います。)

サンプル環境として、僕は書籍の通りVirtualBoxで構築しましたが
今はDockerの環境も提供されているため、より学習しやすくなったと思います。

## ネットワークは何故つながるのか(戸根 勤, 日経BP)
本1冊全体で、自分の端末から送出されたパケットがサーバへ届き、またサーバからパケットが送られてくる旅になっています。

WEBブラウザのURLバーにURLを打ち込んでエンターキーを押下した時に、
 - パソコンの中で何が起きているのか
 - パソコンからどうやってパケットが送出されるか
 - パソコンから送出されたパケットがどこを通ってサーバへ到達するか

 が理解できます。

ネットワークについてよくわからない人でも理解できる内容であり、またレイヤーの低いところも取り扱っているため多少心得のある人でもよりネットワークへの理解がより具体化すると思います。

## 達人に学ぶSQL徹底指南書 第2版 初級者で終わりたくないあなたへ(ミック, 翔泳社)
SQLという言語の「中級者」になるための本です。
逆に言えば、初級者レベルの本ではないため自分の目的にあった本であるかは電子書籍のサンプル等に目を通して判断したほうがよいかもしれません。

技術書としての価値が非常に高い本だと思いますが、それと同時にパズルのような面白さもありおすすめです。

以下のような人にお勧めだと考えています。
 - 1)エラーが出ないクエリを書けるが、「なんでこう書く必要があるのか」というSQLの本質的な思想に興味のある方
 - 2)SQLの本来持つパワーを存分に発揮し、テーブルという全体集合から欲しい部分集合だけを効率の良く取得するにはどうすればいいんだろう？ということに興味がある方
 - 3)手続き型Likeなプログラムを書くことが多く、SQLという言語の構造に疑問や戸惑いを抱いている方 ※1)と近いかもしれません


## ［試して理解］Linuxのしくみ　―実験と図解で学ぶOS、仮想マシン、コンテナの基礎知識【増補改訂版】(武内 覚, 技術評論社)
 - 最近インフラエンジニアとしてキャリアを築き始めた方
 - 普段CliでLinuxを操作しているアプリケーションエンジニア
 
がもう少しLinuxカーネルに踏み込んで理解してみたい、という場合はこの本が最良だと思います。
僕のようなLinuxについて詳しくないエンジニアでも本格的にLinuxカーネルについて学び始める第一歩となるような本が欲しいと思い、
本屋のLinux本を色々めくってみて最終的に行き着いたのがこちらの書籍でした。

少しレイヤーの低いところに踏み込んで浅く一通り学習してみる、というような内容だと思います。

通して読むと、熟練のインフラエンジニアの方ともLinuxの会話ができるようになると思います。

## 世界一流エンジニアの思考法(牛尾剛, 文藝春秋)
今まで紹介してきた本は
 - 読んだ方がいい
 - 自分のキャリアプランに照らして、あるいは現状の自分のレベル的に読まなくても問題ない
 
かが人によって分かれるものもあったように思います。

しかしこの本に関しては全てのエンジニアにおすすめだと考えています。

著者である牛尾 剛氏の周囲におけるハイスキルなエンジニアを事例に、
どのようにシステム・問題に向かうべきかの指針が得られる本だと思っています。
(著者自身も非常にハイスキルなエンジニアだと思いますが、、)

現場において様々なタスクをこなしたり問題をこなせるようになると
エンジニアリングというものにマンネリ化を感じる人も多々いると思います。
(僕自身経験があります。)

そのようなときに技術的なモチベーションを取り戻す、もしくは刺激を受ける本です。

 - エンジニアリングにマンネリ化を感じてしまっている人
 - 問題に当たった時に、場当たり的に解決してしまっていることに何となく不安を感じている人
 - できるエンジニアがどのようにシステムを把握しているか・問題に当たっているかが気になる人

などは是非手に取ってみてほしいです。

僕は最近になってようやく本質に触れようとするようになったように感じていますが、それには間違いなくこの本が一助になっています。

腰を据えて読む必要はなく、通勤等のお供にするのもよいと思います。


## 最後に
ここまでお読みいただきまして、ありがとうございます。
この記事が皆様の技術書を手に取るきっかけになれば非常に幸いです。

また、おすすめの書籍がありましたらご紹介いただけると嬉しいです。
promiseの使い方

## promiseとは？

非同期処理の処理結果を示すためのデータ型（オブジェクト型）。
とりうる値（状態）は、3つのみ。

- **pending** : 保留中の意。初期状態（まだ処理結果の判定が行われていない状態）。
- **fulfilled** : 成功の意。`resolve()`が呼び出されることで、処理が正常に完了したとみなされる状態。
- **rejected** : 失敗の意。`reject()`が呼び出される、または例外がスローされることで、処理が異常終了したとみなされる状態。

## 基本構文
```javascript
//非同期処理関数fetch
function fetch() {
    return new Promise((resolve, reject) => {
        //非同期処理（最終的に resolve() もしくは reject() を呼ぶ必要がある）
        //try~catchで、tryブロック末尾にresolve()を、catchブロック内にreject()を書くのが安牌。
    });
}

fetch()
    .then((result) => {
        //非同期処理関数fetchの結果がresolveだった時に実行したい処理
    })
    .catch(err => {
        //非同期処理関数fetchの結果がrejectだった時に実行したい処理
    })
    .finally(() => {
        //非同期処理関数fetchの結果がresolveであってもrejectであっても、常に実行したい処理
    });
```

## 応用構文

#### `.all`：複数のPromiseの並列実行
```javascript:
Promise.all([fetch1(), fetch2()])
    .then(results => {
        //指定した全ての非同期処理関数（ここではfetch1とfetch2）がresolveの場合、実行したい処理
        //それぞれのresolve値が配列化されて渡される
    })
    .catch(err => {
        //指定した非同期処理関数のうちいずれか一つでもrejectの場合、実行したい処理
        //rejectした関数以外の結果は、無視される
    });
```
#### `.race`：最初に処理完了した結果のみを採用
```javascript:
Promise.race([fetch3(), fetch4()])
    .then(result => {
        //指定した非同期処理関数のうち、最初に値を返したものがresolveだった場合に実行したい処理
        //他関数の結果は、無視される
    })
    .catch(err => {
        //指定した非同期処理関数のうち、最初に値を返したものがrejectだった場合に実行したい処理
        //他関数の結果は、無視される
    });
```
#### `.allSettled`：すべての結果を採用
```javascript
Promise.allSettled([fetch5(), fetch6()])
    .then(results => {
        results.forEach(r => {
            if(r.status === "fulfilled") {
                //現在参照している非同期処理関数の結果がresolveだった場合に実行したい処理
            } else {
                //現在参照している非同期処理関数の結果がrejectだった場合に実行したい処理
            }
        });
    });
```
#### `.any`：最初にresolveしたものの結果のみを採用
```javascript
Promise.any([fetch7(), fetch8()])
    .then(result => {
        //最初にresolveを返したものを採用して実行したい処理
    })
    .catch(() => {
        //指定した非同期処理関数がすべてrejectだった場合に実行したい処理
    });
```
＜城間勝行＞フリーランスエンジニアの進化論

フリーランスエンジニアとして生き抜いていくためには、技術だけでは足りません。もちろん、コードが書けることは大前提ですが、それに加えて「問題解決力」や「ビジネス感覚」などの非技術的スキルも重要です。実際に私がフリーランスとしてのキャリアを積んできた中で感じた、エンジニアとして進化し続けるためのポイントをお話しします。

1. 最初はただのエンジニア
多くのフリーランスエンジニアは、最初のうちは技術に自信を持っています。「自分はこれだけのスキルを持っているから、きっと仕事を取れる」と思いがちです。しかし、現実はそう簡単ではありません。特に初めのうちは、ただコードを書くだけではなく、クライアントとの調整や要件定義、提案書作成なども含めた仕事全体をこなすことになります。

その時に気づいたのは、「エンジニアリングは手段であって、目的ではない」ということです。クライアントが求めているのは、ただ動くシステムではなく、ビジネスの問題を解決するためのシステムです。そのことに気づくことで、自分の視点が一気に広がりました。

2. 技術だけでは限界がある
「この技術を使えばうまくいく」と思って導入した技術スタックが、必ずしもクライアントのニーズにフィットするとは限りません。例えば、あるスタートアップのプロジェクトでは、私が最初に提案した技術がクライアントのリソースに合わないことが分かり、急遽別のアーキテクチャに変更することになりました。この経験から、フリーランスエンジニアとして最も重要なのは「柔軟性」だと実感しました。

もちろん、コードを書く力は大事ですが、クライアントにとって最適な技術選定や、スケーラビリティ、コストを最優先で考える視点が必要です。フリーランスとしてやっていくためには、技術力だけでなく、ビジネス的な判断ができるようになることが求められます。

3. コミュニケーション力の重要性
フリーランスエンジニアは、クライアントと直接やり取りする機会が多いため、技術的なスキルに加えて「コミュニケーション力」が欠かせません。特に、非エンジニアのクライアントとのやり取りでは、専門用語を避けて分かりやすく説明する能力が必要です。技術的な問題や進捗状況を適切に伝え、信頼関係を築くことがプロジェクトの成功に直結します。

また、場合によってはクライアントが求めている結果を実現するために、技術的な妥協をすることもあります。このような「折衝」のスキルも、フリーランスエンジニアとしての成長に欠かせない要素です。

4. 自分をアップデートし続ける
フリーランスとしてのキャリアを積んでいく中で、最も大切にしているのが「自己アップデート」です。業界は日々進化し、新しい技術やツールが次々と登場します。その中で、自分自身のスキルセットをどう維持し、さらに進化させていくかが、長期的な成功に繋がります。

私は、自分の成長に役立ちそうなオンライン講座や書籍を常に取り入れ、実際のプロジェクトに応用しています。例えば、最近では「クラウドインフラ」の分野に力を入れており、AWSやGCPを使ったシステム設計のスキルを磨いています。このように、学び続けることで、次に進むための「武器」を手に入れることができます。

5. フリーランスとしてのスタンス
フリーランスエンジニアとして仕事をしていく中で、最も大切にしているのは「信頼」です。クライアントに信頼されることが、次の仕事や新しいチャンスに繋がります。そのためには、ただ技術を提供するだけでなく、クライアントのビジネスを理解し、積極的に提案を行うことが重要です。

最初のうちは、ただの「作業者」として見られることが多いですが、少しずつ「パートナー」として信頼されるようになり、仕事の幅が広がっていきます。この変化を感じる瞬間が、フリーランスエンジニアとしての醍醐味だと思います。
[TryHackMe] W1seGuy-writeup


- easy

pythonで書かれたソースコードが渡されています。

```python:source.py
import random
import socketserver 
import socket, os
import string

flag = open('flag.txt','r').read().strip()

def send_message(server, message):
    enc = message.encode()
    server.send(enc)

def setup(server, key):
    flag = 'THM{thisisafakeflag}' 
    xored = ""

    for i in range(0,len(flag)):
        xored += chr(ord(flag[i]) ^ ord(key[i%len(key)]))

    hex_encoded = xored.encode().hex()
    return hex_encoded

def start(server):
    res = ''.join(random.choices(string.ascii_letters + string.digits, k=5))
    key = str(res)
    hex_encoded = setup(server, key)
    send_message(server, "This XOR encoded text has flag 1: " + hex_encoded + "\n")
    
    send_message(server,"What is the encryption key? ")
    key_answer = server.recv(4096).decode().strip()

    try:
        if key_answer == key:
            send_message(server, "Congrats! That is the correct key! Here is flag 2: " + flag + "\n")
            server.close()
        else:
            send_message(server, 'Close but no cigar' + "\n")
            server.close()
    except:
        send_message(server, "Something went wrong. Please try again. :)\n")
        server.close()

class RequestHandler(socketserver.BaseRequestHandler):
    def handle(self):
        start(self.request)

if __name__ == '__main__':
    socketserver.ThreadingTCPServer.allow_reuse_address = True
    server = socketserver.ThreadingTCPServer(('0.0.0.0', 1337), RequestHandler)
```

# flag1
ncatで ip 1337で接続すると暗号文が表示されます。
鍵を特定したらflagが貰えそうです。
鍵はランダムな英数字の62で5文字使用しています。

与えられているプログラムを見ると
`setup関数`で`flag`は`THM{xxxxxxx}`形式だとわかります。
`setup関数`はXORでflagを暗号化し、その結果を16進数形式でエンコードする関数です。
なのでこれを複合する鍵を作成していきます
```python:chatGPTすごい
import binascii
import string

def decode_hex_encoded(hex_encoded, key):
    xored_bytes = binascii.unhexlify(hex_encoded)
    return ''.join(chr(b ^ ord(key[i % len(key)])) for i, b in enumerate(xored_bytes))


def brute_force_optimized(hex_encoded):
    characters = string.ascii_letters + string.digits
    known_plaintext = "THM{"
    xored_bytes = binascii.unhexlify(hex_encoded)
    
    # 既知の平文 "THM{" を使って最初の4文字の鍵を推定
    partial_key = ''.join(chr(xored_bytes[i] ^ ord(known_plaintext[i])) for i in range(len(known_plaintext)))

    # 最後の1文字を総当たりで試す
    for char in characters:
        key = partial_key + char
        flag = decode_hex_encoded(hex_encoded, key)
        if flag.startswith("THM{") and flag.endswith("}"):
            print("Key found:", key)
            print("Decoded flag:", flag)
            return True
    return False
    
if __name__ == "__main__":
    hex_encoded = input().strip()
```
> THM{p1alntExtAtt4ckcAnr3alLyhUrty0urxOr}
# flag2
先ほど出力された`key`を入力すると2つ目のflagが入手できます。

> THM{BrUt3_ForC1nG_XOR_cAn_B3_FuN_nO?}
【Git開発】HEADについての超メモ程度に振り返りしました。

　Gitで、ブランチに対してpushしたりcommitしたり機会は多いと思いますが、git branchの結果に表示される**HEAD**について改めて整理してみました。

```bash
(base) user@DESKTOP-C0A2DE7:~/Github_repo/my_repo$ git branch -a

* main
  readme_feature
  remotes/origin/HEAD -> origin/main
  remotes/origin/Life-Tech316-patch-1
  remotes/origin/feature2
  remotes/origin/main
  remotes/origin/readme_feature
```

ここでHEADとは「**現在作業中のブランチを指し示すポインタ**」になります。

ローカルだと
`* main`という記載がありますが、これは
この `*` が付いている **main** が、**現在の HEAD が指しているブラン**チという意味になります。
```
  remotes/origin/HEAD -> origin/main
```
**「GitHub 上の HEAD」**は **mainブランチ** を指している（GitHub上のデフォルトブランチが main）という意味になります。

GUI上からもレポジトリのデフォルトブランチは変更可能ですが、CLIからもデフォルトブランチを変更することは可能です。
```bash
gh repo edit --default-branch feature2
```
【Flutter】小さいアプリの開発　ポケモン表示アプリ

### 目的
API接続
画像表示

### 想定
ランダム変数を取得
API＋ランダム値でポケモンの画像を取得
更新ボタンで画像をランダム変更

### ソースコード
https://github.com/kmiono/pokemon_dareda

### 利用したAPI
pokeAPI
https://pokeapi.co

### 詰まる
イメージの取得はいけたが、名前の取得（json経由）が出来ない
そういやpokeAPIって海外製だからポケモンの英語名しか取得できないんだったことに気づく
更新ボタンを追加して仮完成
名前出したかった…

### 更新ボタン
APIを使用しているので、画面の更新は再描画が必要
そのため更新ボタンは
```
onPressed: () {
	setState(() {});
	},
),
```
ではなく
```
onPressed: () {
	setState(() {
		Navigator.pushReplacement(
			context,
				MaterialPageRoute(
					builder: (BuildContext context) => super.widget));
	});
		},
			),
```
で画面自身を呼び出す必要がある。

~~これでもブラウザの更新ボタン押すより早いからキチンと機能実装することの大事さが分かる~~

### 反省点
~~APIの理解が浅かった~~

参考にしたサイトがProviderを使用しているため、データ伝達の方法の理解が浅かった。

### その他感想
やっぱ最近のポケモンは解像度高いなーと思うなど

### 参考リンク
[はじめに｜ポケモンから学ぶFlutter](https://zenn.dev/sugitlab/books/flutter_poke_app_handson/viewer/introduction)
[Flutter初回起動画面から簡単なAPIを叩くまで | ramble - ランブル -](https://ramble.impl.co.jp/3345/#toc6)
[Flutterで画面を再描画する方法 #Flutter - Qiita](https://qiita.com/celcior0913/items/a447b774a172facc76ec)
【Python】可変長位置引数、可変長キーワード引数、アンパック

【def func(*args, **kwargs)】
仮引数にアスタリスクを1つ付けて「*args」とすると、可変長の位置引数として実引数を受け取ります。
また、仮引数にアスタリスクを2つ付けて「**kwargs」とすると、可変長のキーワード引数として実引数を受け取ります。


【func(*num, **dic)】
実引数にアスタリスクを1つ付けて「*num」とすると、リストやタプルの要素をアンパックして渡します。
また、実引数にアスタリスクを2つ付けて「**dic」とすると、辞書の各キーと値を複数のキーワード引数として渡します。


なお、「args」と「kwargs」は慣例で使われている仮引数の名称のため、他の名称でも問題ありません。重要なのはアスタリスクの数です。
【データ構造編】キューとスタックについて、よわよわエンジニアが教えます

## はじめに
「キュー」と「スタック」の違いを説明してください。と言われて説明できるでしょうか？
よわよわエンジニアの私は当然説明できないため、調べたことをまとめます。


「キュー」と「スタック」は、プログラミングにおける基本的なデータ構造のひとつです。
どちらも「データを一時的にためておく入れ物」ですが、取り出し方のルールが異なるため、使いどころも変わってきます。

## ■ キュー（Queue）とは
特徴： 先に入れたものから順に取り出す（FIFO：First In, First Out）
スーパーのレジ待ちの列のような処理

イメージ図
```
追加 → [1] [2] [3] [4] → 取り出し
```

用途例：
* プリンタの印刷待ち行列
* タスクの順次処理


## ■ スタック（Stack）とは
特徴： 最後に入れたものから取り出す（LIFO：Last In, First Out）
積み重ねた本の山を上から取る処理（最後に積んだ本が最初に取れる）

イメージ図
```
追加 →   ┌───┐
         │ 3 │  ← 最後に追加（最初に取り出される）
         ├───┤
         │ 2 │
         ├───┤
         │ 1 │  ← 最初に追加（最後に取り出される）
         └───┘
取り出しは上から（3 → 2 → 1 の順）
```

用途例：
* ブラウザの「戻る」操作（Undo処理）
* 関数呼び出しの履歴管理（コールスタック）

## ■ まとめ
「順番を守って処理したい」ときはキュー

「直前の操作を取り消したい／戻りたい」ときはスタック

アルゴリズムやデータ処理を行う際の基礎になる構造なので、名前だけでなく用途までしっかり押さえておきましょう。
【Github開発】ghコマンドを入れてCLIで触ってみた。

 **`gh`** はGithubをCLIでコントロールする為のAPIツールである。簡単にWSLにインストールできて使用してみた所感を記載していきます。

### インストール方法
WSLへのインストール方法は下記の記事を参考にしました。

https://qiita.com/kikutch/items/188462fdda893a520d9e

実際にインストールしてauthの認証を実施して、下記のようにGithubの情報を取得した更新したりすることができる。

```bash
 (base) user@DESKTOP-C0A2DE7:~/Github_repo/my_repo_internal$ gh issue list

Showing 6 of 6 open issues in Life-Tech316/My_repo_internal

ID  TITLE                     LABELS  UPDATED
#6  GCP認定_スキルアップ              about 10 minutes ago
#5  カーソルのエディタ調査            about 10 minutes ago
xxxx

```

試しに下記のようにレポジトリ間でissueをコピーするスクリプトを実施して、コピー先のレポジトリにissueが作成できることを確認できました。

```bash.sh
#!/bin/bash

SRC_REPO="Life-Tech316/my_repo"
DEST_REPO="Life-Tech316/My_repo_internal"
ISSUE_LIMIT=10

# 一時ファイル
TMP_FILE=$(mktemp)

# 1. issue一覧を取得
gh issue list -R "$SRC_REPO" --limit $ISSUE_LIMIT --json number,title | jq -c '.[]' | while read -r issue_json; do
    ISSUE_NUMBER=$(echo "$issue_json" | jq -r '.number')
    TITLE=$(echo "$issue_json" | jq -r '.title')

    echo "Copying Issue #$ISSUE_NUMBER: $TITLE"

    # 2. 元Issueの本文を取得
    BODY=$(gh issue view "$ISSUE_NUMBER" -R "$SRC_REPO" --json body | jq -r '.body')

    # 3. コピー先に作成
    gh issue create -R "$DEST_REPO" --title "$TITLE" --body "$BODY"
done

# Cleanup
rm "$TMP_FILE"
```

## 最後に
　ghコマンドを使ってCLIで操作できるのはスクリプト操作ができるので楽ですね。今後、活用していきたいと思います。
 
 以上
生成AIを使ったデザイン改善の勧め

**＜本記事のターゲット層＞**
- Blazorでデザインがうまくいかない人
- デザインが苦手な人

## はじめに
エンジニアの皆様こんにちわ！！
さて今回はデザインが苦手であろうエンジニアの皆様に生成AIを使ったデザイン改善方法についてご紹介したいと思います。

## あっというまに終わるデザインの改善

やり方は非常にシンプルです。

自分が「ださい」、あるいは「もう少しなんとかならないかな」と思っているデザイン部分をSnniping Toolなどで撮影し、生成AIにお願いするだけです。「良い感じのデザインにしたいです。いい感じのデザインをいくつか提案してください」と。

そうするとこれが・・・・
![f8b090dc-e4f7-4a61-a042-05a6f1d78cd0.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755626/38d50c6f-e1fa-43fa-9f4c-085e1e0c0d18.png)

こうなります(笑)
![スクリーンショット 2025-06-20 124711.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755626/b9707180-a272-4513-abc1-7c29a68e41a1.jpeg)

---

そしてこちらのモーダル表示できなかった画像が・・・
![スクリーンショット 2025-06-20 124915.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755626/74e5c97b-94a4-46e8-b621-724db255628d.jpeg)

このようにモーダル表示できるようになります(笑)
![スクリーンショット 2025-06-20 124954.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/755626/7047a1ef-dd49-43ac-9656-33f25eef166d.jpeg)

## デザイン改善の試し方
これだけでは話が終わってしまうのでもう少し説明をすると、生成AIは最初にお願いした段階ではデザインサンプル、またはHTML & CSSでの提案をしてきます。

こちらはそれを検証する必要があるので、HTML & CSSで吐き出された内容をファイルにコピペして、デザインをブラウザで表示させる必要があります。

そのときに便利なものがあります。

エディターはVS Codeをお勧めいたします。これからのVS CodeはAIエディターとして成長していくので、触ったことがない方は今の内になれておいたほうがよいでしょう。

VS Code拡張機能については、[Auto Rename Tag](https://marketplace.visualstudio.com/items?itemName=formulahendry.auto-rename-tag)、[indent-rainbow](https://marketplace.visualstudio.com/items?itemName=oderwat.indent-rainbow)、[Live Server](https://marketplace.visualstudio.com/items?itemName=ritwickdey.LiveServer)をお勧めいたします。

それぞれ、役割は以下の通りです。
- Auto Rename Tag：タグをリネームしたときに、対になるタグの名前を自動で変更してくれます。
- indent-rainbow：インデントに色がつき、html/cssを読みやすくしてくれます。
- Live Server：右下にある「GO Live」をクリックすると、localhost表示してくれて、html/cssを保存するだけで画面をリフレッシュしてくれるので、デザイン調整の作業が捗ります。

これらを駆使して、生成AIが作成したデザインを確認したり、微調整を行い、再度生成AIに効率的に指示をすることで、デザインが苦手なエンジニアのデザイン改善を効率的にサポートしてくれます。
【Python】コンテキストマネージャー、__enter__()と__exit__()の特殊メソッド

コンテキストマネージャーは、__enter__()と__exit__()の特殊メソッドを実装したクラスで、以下の順番で処理されます。

【1】 __enter__()
【2】 withブロック
【3】 __exit__()
Cloud Functions 

# Cloud Functions
Google Cloud Functions（GCF）は、Google Cloud が提供するサーバーレスなイベント駆動型関数実行サービスです。インフラ管理不要で、コードを書いてイベントトリガーを設定するだけでデプロイできます。

## 特徴
- 完全マネージド：サーバーのプロビジョニング・スケーリング不要

- イベント駆動：Cloud Storage、Pub/Sub、HTTPなど様々なトリガーで動作

- スケーラブル：アクセスに応じて自動スケーリング

- 課金体系：実行時間とリソース使用量に基づく従量課金（リクエスト数にも依存）

## 主なユースケース
- Cloud Storage にファイルがアップロードされたらサムネイルを自動生成

- Pub/Sub 経由でキュー処理・バッチ処理を非同期で実行

- HTTP API を簡易的に作る（Webhookなど）

- Firestore にデータが書き込まれた際の通知処理

## サポートされているトリガー

| トリガーの種類              | 主な用途               |
| -------------------- | ------------------ |
| HTTP トリガー            | REST API や Webhook |
| Cloud Pub/Sub        | 非同期メッセージ処理         |
| Cloud Storage        | ファイルアップロード検知       |
| Firestore / Firebase | DB変更イベントの検知        |
| Cloud Tasks（v2）      | スケジュール処理や遅延実行      |


## 開発とデプロイの流れ

```bash
# 1. プロジェクト設定
gcloud config set project [PROJECT_ID]

# 2. 関数ファイルの作成 (例: index.js / main.py)

# 3. デプロイ（例: HTTPトリガー）
gcloud functions deploy helloWorld \
  --runtime python311 \
  --trigger-http \
  --allow-unauthenticated

# 4. 確認
gcloud functions describe helloWorld
```

## ランタイム一覧（2025年現在）
- Node.js（18, 20）

- Python（3.10, 3.11）

- Go（1.20, 1.21）

- Java（11, 17）

- .NET（6）

- Ruby（3.0）

- PHP（8.1）

## Cloud Run や Cloud Functions for Firebase との違い


| 項目    | Cloud Functions | Cloud Run  | Firebase Functions |
| ----- | --------------- | ---------- | ------------------ |
| 実行モデル | 関数単位            | コンテナ単位     | Firebase向け関数       |
| 起動時間  | やや短い            | 長め         | Firebase統合         |
| 柔軟性   | △               | ◎（任意のコンテナ） | △（Firebase連携に特化）   |


## よくある落とし穴
- Cold Start が発生する場合あり（特にリージョン初回呼び出し時）

- ランタイムによっては 最大実行時間 や メモリ制限 に注意

- 長時間処理やバッチには不向き → Cloud Run や Workflows の検討を
ローカルからクラウドへ、シームレスな移行：Mac開発者がローカルプロジェクトを世界と簡単に共有する方法

今日の高度に連携された開発の世界では、Mac開発者は日々コードと創造性に取り組んでいます。しかし、ローカルプロジェクトをチームメンバーにデモンストレーションしたり、クライアントにプレビューしてもらったり、Webhookのデバッグを行ったりする必要があるとき、次のような「困った瞬間」に遭遇することはありませんか？

「ちょっと待って、まずテストサーバーにデプロイしないと...」
「リモートコラボレーション？どうやってローカル環境を公開すればいいの？」
「Webhookのデバッグは面倒だ、デプロイされるまでテストできない！」
![截屏2025-06-20 8.37.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115246/dc4fea66-ccb4-4626-b2b3-b4225718c77e.png)


これらの些細な「不便さ」は、実は私たちの開発効率とコラボレーション体験に大きな影響を与えています。ローカルで実行中のサービスを安全にパブリックインターネットに公開するには、複雑な設定や高価な外部サービスに頼らなければならないことがよくあります。この「環境の壁」は、多くのMac開発者にとって悩みの種となっていました。

煩わしさから解放され、「シームレス」な共有を体験
もしあなたのMacローカル開発環境が、ワンクリックでイントラネットとパブリックネットワークの障壁を打ち破り、わずか数分で安全かつ便利にローカルプロジェクトを遠隔地の同僚やクライアントと共有できるとしたら、どれほどの効率向上が見込めるでしょうか？

そうです、これは現実になりつつあります。Mac開発者にとって、ローカル開発と外部コラボレーションの境界線を曖昧にし、さらには「意識させない接続」を実現する、より洗練された効率的なソリューションが登場しました。

ローカルからパブリックへ、かつてないほど簡単に
これまで、私たちは手動で複雑なNginxリバースプロキシを設定したり、初心者にはあまり優しくないコマンドラインツールを使ってイントラネットを貫通させようと試みたりする必要がありました。しかし、今ではそのすべてが簡素化されました。

![截屏2025-06-20 8.31.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115246/32f80638-23ac-4389-ad95-b17442edb13b.png)


現在、主要なローカル[開発ツール](https://www.servbay.com)は「統合化、インテリジェント化」の方向へと進化しています。例えば、一部の先進的なローカルWeb開発統合環境では、すでに様々な人気のサードパーティ製リバースプロキシツールが組み込まれています 。これにより、これらのツールを個別にインストールして設定する必要がなくなり、すぐに使える状態になり、簡単にアクセスできます 。


frp、ngrok、Cloudflared、Pinggy.ioといった強力なサードパーティ製リバースプロキシツールは、ローカルサービスを安全にパブリックインターネットに公開することで、イントラネットの貫通を簡単に実現するのに役立ちます 。一時的にWebサービスをデモンストレーションしたり、Webhookのコールバックをデバッグしたりする必要がある場合でも、公開可能なURLを生成できるため、プロセスが大幅に簡素化されます 。

![截屏2025-06-20 8.33.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/4115246/94f7654c-3b45-4b5c-9698-c779159db50a.png)



ファイアウォールでインバウンドポートを開く必要はありません。安全なアウトバウンド接続を通じて、ローカルサービスを外部に公開できます 。これは、開発環境のセキュリティと利便性を確保する上で、間違いなく大きな進歩です。これからは、チームコラボレーションとクライアントへのデモンストレーションがこれまで以上にスムーズになり、プロジェクトワークフローの効率が飛躍的に向上するでしょう。

まとめ：最適なツールを選び、コラボレーション効率を向上させましょう
ペースの速い現代の開発において、真に効率を向上させるツールを選ぶことは非常に重要です。[統合性が高く、使いやすく、実際のコラボレーションの課題を解決できるローカル開発環境は](htttps://www.servbay.com)、Mac開発者がより創造的な作業に集中できるようにするでしょう。ローカルプロジェクトを簡単に「公開」して世界と共有できるようになれば、あなたの開発作業はさらに加速します。
[TryHackMe] Lo-Fi-writeup

- Easy

# reconn
```bash
┌─[user@parrot]─[~]
└──╼ $nmap 10.10.146.42
Starting Nmap 7.94SVN ( https://nmap.org ) at 2025-06-20 03:43 UTC
Nmap scan report for 10.10.146.42
Host is up (0.33s latency).
Not shown: 998 closed tcp ports (conn-refused)
PORT   STATE SERVICE
22/tcp open  ssh
80/tcp open  http

```
# http(80)
webブラウザで開くとyoutubeの動画を見れる感じのwebアプリでした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/1a9a06e1-be4a-4aa4-a405-2183614e75a8.png)

`Discography`で適当に`sleep`をクリックすると`?page=sleep.php`でphpファイルを指定していることがわかりました。
# flag
適当にファイルを指定したらファイルが見つからないとエラーが出て、ディレクトリトラバーサルできることがわかりました。
flag.txtを探します。
`?page=../../../flag.txt`で見つかりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3556452/94b2d7b7-fd7c-4684-b1fd-d311fbff5232.png)
> flag{e4478e0eab69bd642b8238765dcb7d18}
「select * from」は「table」で置き換えられる？

# 初めに
![AI Data CloudであるSnowflakeをかわいい白熊が使いこなしている.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3487310/9c7bc570-c566-4970-be55-692ef5f90fe0.jpeg)
### Snowflake
こんにちは、初心者です。
先日、SnowflakeのユーザーグループであるSnowVillage内のRookiesCampで行われている「初心者向け勉強会」というウェビナーに初参加しました。

https://techplay.jp/event/981100

ウェビナーそのものの話じゃなくて、その中で知ったことがあり書きました。
説明の中でこんなSQLが出てきて
```
table [テーブル名] order by [列名];
```
「なにこのSQL」ってなったわけです。

実行結果は全件取得なんです。
つまり下記のSQLと同じ。
```
select * from [テーブル名] order by [列名];
```

**「select * from」を「table」に置き換えられる**ってことのようです。
知らんかった。
これはSnowflakeの方言？

なお、試してみた結果、ビューの場合もtableと書くようです。
```
--✕
view [ビュー名];
--〇
table [ビュー名];
```
「table型で返してね」という意味だと思います。
マテリアライズドビューも同様です
# 実験
他のDB製品でも自分が触れる範囲で試してみました。

### PostgreSQL
Snowflakeと同じように
```
table [テーブル名] order by [列名];
```
で結果返ってきたんですけどー。
Postgreよ、お前もか。
いきなり予想外でした。
ひょっとして方言じゃなくて標準？みんな対応してるの？
これからの検証が不安。

### Oracle
今まで一番触っているOracleはエラー。
よかった、標準じゃなかったんだ。
結構触ってきたと思ってるのに知らなかったんだったらショック死するとこだった。
昔のSQLポケットリファレンスみたいな本にこんなSELECTの置き換え、載ってなかったもんね。（たぶん）

### SQLServer
昔ちょっと触っていたSQLServerもエラー。

### SQLite3
この確認のためのわざわざインストールした。
エラー。

### Access
```
table [テーブル名] order by [列名];
```
Accessもで結果が返ってきた！
SQLServerと同じマイクロソフト製品なのに結果が違うとは。

# まとめ
| | table対応 | 
|:-----------:|:-----------:|
|Snowflake | 〇 |
|PostgreSQL | 〇 |
|Oralce | ✕ |
|SQLServer | ✕ |
|SQLite | ✕ |
|Access | 〇 |

という結果になりました。
まさかの半々です。
知らなかった機能が意外と各DBで実装されてるんですね。