Skip to content

Posts

Developers Summit 2025 Summer Day2

二日目は昨日のパスが使えるので、受付は一瞬。

空調は昨日より効きすぎてなかったけど寒い瞬間はあった。

AIによるエンジニア総プレイングマネージャー時代の思考法~EM×プロダクト開発×アジャイル開発の交差点~

AIエージェントを前提とした時代に開発を進めるうえで重要なマネジメントの視点と技術を知り明日からスキルを伸ばせるようにする

  • 仕事のスピードを上げるためのマネジメントスキル

    • コードとドキュメントを同じリポジトリで管理する
      • AIがスプリントの計画から管理まで実施
    • 開発サイクルが短くなる
      • 1日スプリントが基本になっていく
    • より小さなチーム、多くのチームへ
      • 6人x2チームが(1〜3人+AI)x5チームに
        • 人間の人数は変わっていない
      • マネジメントする人間がボトルネックになっていく
  • 協働のためのマネジメントスキル

    Read more

Developers Summit 2025 Summer Day1

久しぶりに参加のDevelopers Summitは、開発生産性カンファレンスと同じ会場。ちょっと狭いけど駅から近いのが良い。 https://event.shoeisha.jp/devsumi/20250717

参加証印刷してなかったから早めに行ったら早く着きすぎた。

開発生産性カンファレンスの時も思ったけど、ホール内の空調が効きすぎて寒い。

仕組みから学ぶLLMエージェント開発の勘所──基礎理解と実践開発手法

  • AIエージェントはソフトウェア技術者を置き換える?

    Read more

Surface go 2にChromeOSをインストールする

Surface go 2の動作が重いしバッテリーの持ちがカンファレンス1日持たなくなってきたので、なんとかしたいと思い、ChromeOS Flexを試してみた。

ChromeOS Flex インストール ガイドに沿って実行したらとくに問題なく完了できた。

USBからのブートは、Windowsの設定で変更できた。

Linux入れて、VS Code入れて、npm入れて、Claude Code入れるところまでやってVS Codeの日本語フォントが明朝なのが気になってUDEV Gothicを入れたけど反映されず。 →/usr/local/share/fonts/にttfファイルを置いたら反映された。

Read more

開発生産性Conference 2025 Day2

開発生産性カンファレンス2025の2日目の聴講メモです。

受付は並ばずできて、昨日の混雑はKent Beckのせいだったようです。

開発生産性向上の探求:DevOpsの進化、普遍的な原則、そして生成AIがもたらす変革

Gene Kim

  • DevOpsのビジネス価値は我々の想定よりさらに高い

  • ハイパフォーマーはより安全で管理しやすい

    • 市場で勝つのはハイパフォーマー

「開発生産性」ではなく、事業の投資対効果に向き合う「事業生産性」へ

山口拓弥

https://speakerdeck.com/onecareer_tech/from-development-productivity-to-business-productivity-that-focuses-on-business-return-on-investment

  • 生産性の本質

    • レベル1:チーム

    • レベル2:組織

    • レベル3:部門

      Read more

開発生産性Conference 2025 Day1

開発生産性カンファレンス2025の1日目の聴講メモです。

最初の受付から行列になっていて人気度の高さを感じました。

開発生産性測定のトレードオフ 「グッドハートの法則」はもっと悲観的に捉えるべきだった

Kent Beck

  • 計測は必要だが、それを指標とすると、思った効果が得られない

    • PR数、コード行数、障害発生数
      • すぐにハックされる
    • AIとの協働により、この問題は加速する
  • いくつ作成したかではなく、いくつ学んだかを大切にする

    Read more

PHP Conference Japan 2025

PHPカンファレンス2025に参加してきました。

https://phpcon.php.gr.jp/2025/

2024に続いて2回目の参加です。

PHPの今とこれから 2025 by 廣川 類

https://fortee.jp/phpcon-2025/proposal/ba73ff87-93ff-4772-8003-43f246a310ae

シェアはあまり変化なし

11月に8.5リリース予定  パイプ演算子など

8.0以前の利用者は、まだ世界で6割くらいいる

8.0以前のバックポートもあるが、オススメはアクティブバージョンにアップデートすること

CVE-2024-8929 MySQLサーバ情報の漏洩  やばそう

Read more

Amazon Q CLIでゲームを作成する

Amazon Q CLI でゲームを作ろう Tシャツキャンペーンに乗っかってAmazon Q CLIを試してみた。

環境はWindows11でWSL2(Ubuntu)。

お題は、Ebitengineを使ったゲームを作ってもらうこと。

🤖 You are chatting with claude-3.7-sonnet

> Ebitengineを使ったゲームを作って
Ebitengineを使ったゲームを作りましょう。Ebitengineは、Goで書かれた2Dゲーム開発のためのシンプルなライブラリです。ま
ずは基本的なゲームを作成してみましょう。

まず、プロジェクトディレクトリを作成し、必要なパッケージをインストールします:


🛠️  Using tool: execute_bash
 ⋮
 ● I will run the following shell command:
mkdir -p ebiten-game && cd ebiten-game && go mod init ebiten-game
 ⋮
 ↳ Purpose: ゲームプロジェクトのディレクトリを作成し、Go moduleを初期化


Allow this action? Use 't' to trust (always allow) this tool for the session. [y/n/t]:

> t
bash: line 1: go: command not found

 ⋮
 ● Completed in 0.103s
すみません、Goがインストールされていないようです。まずはGoをインストールする必要があります。


🛠️  Using tool: execute_bash (trusted)
 ⋮
 ● I will run the following shell command:
which go || echo "Go is not installed"
 ⋮
 ↳ Purpose: Goがインストールされているか確認

Go is not installed

 ⋮
 ● Completed in 0.110s
Ebitengineを使ったゲームを作るには、まずGoをインストールする必要があります。Goをインストールした後、以下の手順でシ
ンプルなゲームを作成できます。

### Goのインストール方法

Linuxでは、以下のコマンドでGoをインストールできます:

bash
# Ubuntuの場合
sudo apt update
sudo apt install golang-go

# Fedoraの場合
sudo dnf install golang

# Arch Linuxの場合
sudo pacman -S go


### Goをインストールした後の手順

1. プロジェクトディレクトリを作成し、Go moduleを初期化
2. Ebitengineパッケージをインストール
3. シンプルなゲームコードを作成

### シンプルなゲームのコード例

Goをインストールした後、以下のようなコードでシンプルなゲームを作成できます:

go
package main

import (
        "image/color"
        "log"
        "math/rand"

        "github.com/hajimehoshi/ebiten/v2"
        "github.com/hajimehoshi/ebiten/v2/ebitenutil"
        "github.com/hajimehoshi/ebiten/v2/inpututil"
)

const (
        screenWidth  = 640
        screenHeight = 480
        playerSize   = 20
        enemySize    = 15
        enemyCount   = 5
)

type Game struct {
        playerX, playerY float64
        enemies          []enemy
        score            int
}

type enemy struct {
        x, y          float64
        speedX, speedY float64
}

func (g *Game) Update() error {
        // プレイヤーの移動
        if ebiten.IsKeyPressed(ebiten.KeyUp) {
                g.playerY -= 4
        }
        if ebiten.IsKeyPressed(ebiten.KeyDown) {
                g.playerY += 4
        }
        if ebiten.IsKeyPressed(ebiten.KeyLeft) {
                g.playerX -= 4
        }
        if ebiten.IsKeyPressed(ebiten.KeyRight) {
                g.playerX += 4
        }

        // 画面端の処理
        if g.playerX < 0 {
                g.playerX = 0
        }
        if g.playerX > screenWidth-playerSize {
                g.playerX = screenWidth - playerSize
        }
        if g.playerY < 0 {
                g.playerY = 0
        }
        if g.playerY > screenHeight-playerSize {
                g.playerY = screenHeight - playerSize
        }

        // 敵の移動
        for i := range g.enemies {
                g.enemies[i].x += g.enemies[i].speedX
                g.enemies[i].y += g.enemies[i].speedY

                // 画面端での反射
                if g.enemies[i].x <= 0 || g.enemies[i].x >= screenWidth-enemySize {
                        g.enemies[i].speedX = -g.enemies[i].speedX
                }
                if g.enemies[i].y <= 0 || g.enemies[i].y >= screenHeight-enemySize {
                        g.enemies[i].speedY = -g.enemies[i].speedY
                }

                // 衝突判定
                if g.playerX < g.enemies[i].x+enemySize &&
                        g.playerX+playerSize > g.enemies[i].x &&
                        g.playerY < g.enemies[i].y+enemySize &&
                        g.playerY+playerSize > g.enemies[i].y {
                        // 敵を新しい位置に
                        g.enemies[i].x = rand.Float64() * (screenWidth - enemySize)
                        g.enemies[i].y = rand.Float64() * (screenHeight - enemySize)
                        g.score++
                }
        }

        // Rキーでリセット
        if inpututil.IsKeyJustPressed(ebiten.KeyR) {
                g.init()
        }

        return nil
}

func (g *Game) Draw(screen *ebiten.Image) {
        // 背景
        screen.Fill(color.RGBA{40, 40, 60, 255})

        // プレイヤー
        ebitenutil.DrawRect(screen, g.playerX, g.playerY, playerSize, playerSize, color.RGBA{0, 255, 0, 255})

        // 敵
        for _, e := range g.enemies {
                ebitenutil.DrawRect(screen, e.x, e.y, enemySize, enemySize, color.RGBA{255, 0, 0, 255})
        }

        // スコア表示
        ebitenutil.DebugPrint(screen, "Score: "+string(rune('0'+g.score)))
}

func (g *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
        return screenWidth, screenHeight
}

func (g *Game) init() {
        g.playerX = screenWidth / 2
        g.playerY = screenHeight / 2
        g.score = 0
        g.enemies = make([]enemy, enemyCount)

        for i := range g.enemies {
                g.enemies[i] = enemy{
                        x:      rand.Float64() * (screenWidth - enemySize),
                        y:      rand.Float64() * (screenHeight - enemySize),
                        speedX: (rand.Float64()*2 - 1) * 2,
                        speedY: (rand.Float64()*2 - 1) * 2,
                }
        }
}

func main() {
        ebiten.SetWindowSize(screenWidth, screenHeight)
        ebiten.SetWindowTitle("Simple Ebiten Game")

        game := &Game{}
        game.init()

        if err := ebiten.RunGame(game); err != nil {
                log.Fatal(err)
        }
}


このゲームは、緑色の四角(プレイヤー)を矢印キーで動かして、赤い四角(敵)に当たるとスコアが増えるシンプルなもので
す。Rキーを押すとゲームをリセットできます。

Goをインストールした後、以下のコマンドでEbitengineをインストールし、ゲームを実行できます:

bash
go get github.com/hajimehoshi/ebiten/v2
go run main.go


Goのインストールが完了したら、お知らせください。その後、詳細な手順でゲーム作成をサポートします。

>

goをインストールして再実行

Read more

PHP Conference Japan 2024

PHP Conference Japan 2024に行ってきました。 PHP Conferenceは初参加です。

トラック1とトラック2は配信があったので、それ以外のトラックを主に見て回りました。 見たセッションはテスト系の話が多く、参考になりました。

PHPの今とこれから2024 by 廣川 類

  • PHPは1995年の登場からwebの進化とともに成長してきた
  • 今年は日本人がたくさん開発に参加した年
  • EOLバージョンの対応
    • ディストリビューションがメンテ
    • Remiバックポート(非公式)
  • 8.4の新機能
    • JITの改善
      • 中間表現を使用
    • プロパティアクセスフック
    • 非対称プロパティ可視性
    • 遅延オブジェクト
      • Lazyゴースト、プロキシの2種類ある
    • HTML5対応、DOM対応改善
      • HTML5はすでに廃止された など
  • FRANKENPHP
  • PHPは進化し続けることが必要

良いテストコードを書くためのガイドライン〜作成から運用まで〜 by rikuto

  • 開発者が行う自動テスト
  • なぜテストするのか
    • バグを早い段階で検出する
  • 良いテスト
    • 実装の詳細ではなく振る舞いをテストする
  • ふるまいのテスト
    • 得られた値が想定通りかのテスト
  • 実装の詳細のテスト
    • モックを利用したテスト
      • 関数内での呼び出しを確認するのみ
        • 仕様の変更に追従できない
  • ふるまいのテストをできるコードにする意
    • 実装の詳細を公開すると、ふるまいをテストしにくい
      • ふるまいだけを公開する
  • モックの利用は最小限にする
    • 自分たちの管理街にあるもの
      • 外部APIなど
  • どこにどんなテストを書けばよいのか
    • テストレベル
      • 単体<統合<E2E
      • 下位レベルのテストで担保しているものは高レベルでは省略できる
  • ガイドラインの作成
    • 本のコピー、抜粋ではなく現場の例で具体的に
    • ルールを厳しくしすぎない
    • 重要度別に優先度を設定
    • 作って終わりにしてはいけない
      • 定着するところまでする

PSR-15 はあなたのためのものではない? by やまゆ

ObsidianにRemotely Saveを導入した

GitHub - remotely-save/remotely-save: Yet another unofficial Obsidian plugin allowing users to synchronize notes between local device and the cloud service. Supports S3, Dropbox, OneDrive, webdav.

バックアップ先はCloudflare R2を選択。 最近、Cloudflare気になっていたので良い機会。

設定手順もremotely-save/docs/remote_services/s3_cloudflare_r2/README.mdの通りで問題なかった。

ただ、E2E encryptionを設定したら、iPhone8やiPad air4には重すぎたようで同期が完了しないことがしばしば。 暗号化しなければ常識的な時間で同期できる。

Read more