Skip to content

Posts

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

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

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

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

Linux入れて、VS Code入れて、npm入れて、Claude Code入れるところまでやってVS Codeの日本語フォントが明朝なのが気になってUDEV Gothicを入れたけど反映されず。

Read more

開発生産性Conference 2025 Day2

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

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

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

Gene Kim

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

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

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

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

山口拓弥

  • 生産性の本質

    • レベル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

Windowsでbunを試す

Bun — A fast all-in-one JavaScript runtime

v1.1でWindowsにも対応したということなので、Surface go 2で試してみた。

$ bun create next-app
√ What is your project named? ... bun-next-app
√ Would you like to use TypeScript? ... No / Yes
√ Would you like to use ESLint? ... No / Yes
√ Would you like to use Tailwind CSS? ... No / Yes
√ Would you like to use `src/` directory? ... No / Yes
√ Would you like to use App Router? (recommended) ... No / Yes
√ Would you like to customize the default import alias (@/*)? ... No / Yes
√ What import alias would you like configured? ... @/*
$ cd bun-next-app/
$ bun --bun run dev
$ next dev
   ▲ Next.js 14.1.4
   - Local:        http://localhost:3000

 ✓ Ready in 9.1s
 ○ Compiling / ...

で終了して、終了できない枠だけのターミナルが起動した。

Read more

英語学習

ITエンジニアのゼロから始める英語勉強法(日経BP Next ICT選書) | 牛尾剛 | 英語 | Kindleストア | Amazonを読んだ。

書籍では、学習用のCDを買ってひたすら聞きこむところから始めるのだけれど、おすすめの教材のAmazon評価がいまいちなので、別の教材がないか考えた。

あとで答え合わせをするために、文字起こしがあることを条件にすると、AWSのPodcastがそうだったのを思い出した。

Read more