kakakakakku blog

Weekly Tech Blog: Keep on Learning!

PHPCompatibility v10.0.0-alpha1 で PHP 8.2 の非推奨コードを検出する

PHPCompatibility は2019年にリリースされた v9.3.5 で止まっていて,今まで PHP 8.x の非互換を検出する場合は dev-develop ブランチを使う必要があった.

github.com

リリース自体は止まってしまったのかな?と思っていたら,2025年10月に突然 v10.0.0-alpha1 が Pre-release で登場していた❗️なんと6年振り⌛️もう少ししたら正式に v10 がリリースされる可能性がある.

github.com

👾 index.php

たとえば以下のようなサンプルコードがあるとする.

<?php

$name = "kakakakakku";
echo "Hello ${name}!";

PHP 8.2 で ${var} 形式のまま文字列と結合する実装が非推奨になっている🚨

www.php.net

👾 composer.json (PHPCompatibility v9.3.5)

まずは PHPCompatibility v9.3.5 をセットアップする.

{
    "name": "kakakakakku/php-compatibility-v10",
    "require-dev": {
        "phpcompatibility/php-compatibility": "9.3.5"
    },
    "config": {
        "allow-plugins": {
            "dealerdirect/phpcodesniffer-composer-installer": true
        }
    }
}

実行すると非推奨になったコードを検出できなかった.

$ ./vendor/bin/phpcs --standard=PHPCompatibility --runtime-set testVersion 8.2 src/index.php

👾 composer.json (PHPCompatibility v10.0.0-alpha1)

今度は PHPCompatibility v10.0.0-alpha1 をセットアップする.

{
    "name": "kakakakakku/php-compatibility-v10",
    "require-dev": {
        "phpcompatibility/php-compatibility": "10.0.0-alpha1"
    },
    "config": {
        "allow-plugins": {
            "dealerdirect/phpcodesniffer-composer-installer": true
        }
    }
}

実行すると非推奨になったコードを検出できた❗️

$ ./vendor/bin/phpcs --standard=PHPCompatibility --runtime-set testVersion 8.2 src/index.php

-------------------------------------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
-------------------------------------------------------------------------------------------------------
 4 | WARNING | Using ${var} in strings is deprecated since PHP 8.2, use {$var} instead. Found: ${name}
-------------------------------------------------------------------------------------------------------

関連情報

アップデートガイドもある📝

github.com

どんな困難でも乗り越えられるチームに育てるには /「レジリエントマネジメント」を読んだ

成功するチームへと導くにはどうしたら良いのだろう!?チームメンバー(本書の表現だとチームメイト)である「人」にフォーカスしたコミュニケーションスタイルへの気付きが得られる一冊「レジリエントマネジメント 荒波に立ち向かい、困難を乗り越えるチームの育て方」を読んだ📕

2025年10月27日に出版された新著で本書は翻訳を担当された @guyon さんに送っていただいた❗️出版おめでとうございます🎉

目次

  • Chapter.1: チームとの出会い
  • Chapter.2: チームメイトの成長を支援する
  • Chapter.3: 明確な期待を設定する
  • Chapter.4: 効果的なコミュニケーション
  • Chapter.5: 困難を乗り越える力を高める

個人的には Chapter.2「チームメイトの成長を支援する」が参考になったかな💡あと Chapter.5「困難を乗り越える力を高める」の内容も良くて,これからリーダーとして本格的に活動するような人におすすめできる.

book.mynavi.jp

BICEPS

本書では BICEPS という言葉が出てくる.人によって異なる価値観(中核になるニーズ)がカテゴライズされていて参考になった.人によって価値観が違うことを理解していないと「良かれと思ってしたことが相手にとって嬉しくなかった」ということが起きたりする.答えを求めるのではなく「違い」を理解することが重要だなと改めて気付けた.

  • 帰属 (Belonging)
  • 向上/成長 (Improvement)
  • 選択 (Choice)
  • 平等/公平 (Equality/ Fairness)
  • 予測可能性 (Predictability)
  • 意義 (Significance)

ちなみに僕はどうだろう?と考えてみて,圧倒的に「向上/成長 (Improvement)」を重要視しているなーと思った.逆に「帰属 (Belonging)」にはほとんど関心がなかったりもして,チームメンバーと話すネタとしても使えそうだった😀

www.palomamedina.com

マッドリブス

Chapter.1 に出てくるマネジメントスタイルを表現する「マッドリブス(穴埋め)」もスゴイ良くてさっそく作ってみようと思った❗️

私は___と___に価値をおく___なリーダーです。
私が___するときに私のリーダーに対する価値観が見られます。
私はチームを、___でサポートし、___することで会社の価値観に沿うようにします。
私は___な環境で力を発揮します。
私は___することを約束します。

プロジェクトをキックオフする前やチームアップをするときにマネジメントスタイルをチームメンバーに伝えつつ,定期的にレトロスペクティブをしながらより良く改善できたら良さそう.

昔に公開した資料では「心配性 + 完璧主義」というのを僕自身の特徴として挙げていて,こういう情報も使えそう.

speakerdeck.com

あとマッドリブスを見たときに「インセプションデッキ」「アジャイルソフトウェア開発宣言」にも似ているな〜と思ったりした.

1on1

Chapter.2 に出てくる

  • メンタリング
  • コーチング
  • スポンサリング
  • フィードバック

という4種類の役割を理解してチームメンバーと関係を築くという話は 1on1 が苦手なマネージャーに刺さりそうな内容だなと思った.実際に良さそうな質問やアプローチテクニックが紹介されてて,こうやって話すとうまくチームメンバーの思いを引き出せそうだった.

ちなみに僕は「1on1 ミーティングガイド」を定期的に見るようにしてておすすめ💪

guide.1on1guide.org

さらに本書のサブタイトルにもある「チームを育てる」という観点だと「ザ・ファシリテーター」「あなたのチームは、機能してますか?」もおすすめ📕

その他読書メモ

  • 責任ベン図
  • RACI マトリックス
  • デリケートな情報の伝達

他にも印象に残ったところをポストしてある💬

まとめ

「Resilient Management」の翻訳書「レジリエントマネジメント 荒波に立ち向かい、困難を乗り越えるチームの育て方」を読んだ.どんな困難でも乗り越えられて 1 + 1 = 3 になるようなチームを作るためのプラクティスがまとまっていて良かった😀

関連本

kakakakakku.hatenablog.com

kakakakakku.hatenablog.com

Terraform AWS Provider v6: deprecated になった aws_region データソースの name プロパティ

Terraform AWS Provider v6 へのバージョンアップを数回やっていて(既に4プロジェクトほどやった💪)そのときによく遭遇するのが aws_region データソースの name プロパティが deprecated になった件で,v6 以降は region プロパティを使う必要がある.

name - (Optional, Deprecated) Full name of the region to select. Use region instead.

たとえば以下のような Terraform コードがあったとする.

data "aws_region" "current" {}

output "region" {
  value = data.aws_region.current.name
}

terraform validate コマンドを実行すると Deprecated attribute という警告が出る🚨

$ terraform validate
╷
│ Warning: Deprecated attribute
│
│   on main.tf line 4, in output "region":
│    4:   value = data.aws_region.current.name
│
│ The attribute "name" is deprecated. Refer to the provider documentation for details.
╵
Success! The configuration is valid, but there were some validation warnings as shown above.

以下のように修正すれば OK👌

data "aws_region" "current" {}

output "region" {
  value = data.aws_region.current.region
}

ちなみに region プロパティは Terraform AWS Provider v5 には実装されてなく,Terraform AWS Provider v6 にアップデートする前に修正できないという課題がある.よって Terraform AWS Provider v5 にも region プロパティをバックポートして欲しいというコメントも出ていた❗️気持ちはわかるな〜という感じ.

github.com

Google Analytics MCP Server: 自然言語でアナリティクスデータを取得しよう

Google Analytics でブログ記事の PV を確認する機会がちょこちょこある📊

たとえば「人気記事の定点観測」「AWS Community Builders のアウトプット報告」など.

今までは Google Analytics コンソールでポチポチと確認していたけど Google Analytics MCP Server を使ってみたら便利だったので試したことをまとめておく❗️現状まだ Experimental な MCP Server である点は注意する.

github.com

セットアップ

Google Analytics MCP Server の GitHub リポジトリと Google Analytics のドキュメントが充実しててセットアップで困るところはほとんどなかった.YouTube 動画もあって真似しながら進めることもできる.

developers.google.com

まずは Google Cloud でプロジェクトを作って「Google Analytics Admin API」「Google Analytics Data API」を有効化しておく.

developers.google.com

developers.google.com

次に OAuth クライアントを作って Google Cloud CLI で Application Default Credentials (ADC) をセットアップする.最終的に application_default_credentials.json ファイルが取得できていれば OK👌

$ gcloud auth application-default login \
  --scopes https://www.googleapis.com/auth/analytics.readonly,https://www.googleapis.com/auth/cloud-platform \
  --client-id-file=./client_secret_xxx-xxx.apps.googleusercontent.com.json
Your browser has been opened to visit:

(中略)

Credentials saved to file: [/Users/kakakakakku/.config/gcloud/application_default_credentials.json]

These credentials will be used by any library that requests Application Default Credentials (ADC).

最後は MCP Client をセットアップする.MCP Client は何でも良くて,今回は Google Analytics MCP Server のドキュメントに載っている Gemini CLI を使うことにした.

cloud.google.com

~/.gemini/settings.json に以下の設定をして PATH_TO_CREDENTIALS_JSONYOUR_PROJECT_ID を置き換えれば OK👌uvx ではなくて pipx なんだ〜という気付きもあった.

{
  "mcpServers": {
    "analytics-mcp": {
      "command": "pipx",
      "args": [
        "run",
        "analytics-mcp"
      ],
      "env": {
        "GOOGLE_APPLICATION_CREDENTIALS": "PATH_TO_CREDENTIALS_JSON",
        "GOOGLE_PROJECT_ID": "YOUR_PROJECT_ID"
      }
    }
  }
}

動作確認

自然言語で https://kakakakakku.hatenablog.com/entry/2025/10/29/192801 の直近1週間の PV は? という質問を投げると結果が返ってきた👏

$ gemini
Loaded cached credentials.

 ███            █████████  ██████████ ██████   ██████ █████ ██████   █████ █████
░░░███         ███░░░░░███░░███░░░░░█░░██████ ██████ ░░███ ░░██████ ░░███ ░░███
  ░░░███      ███     ░░░  ░███  █ ░  ░███░█████░███  ░███  ░███░███ ░███  ░███
    ░░░███   ░███          ░██████    ░███░░███ ░███  ░███  ░███░░███░███  ░███
     ███░    ░███    █████ ░███░░█    ░███ ░░░  ░███  ░███  ░███ ░░██████  ░███
   ███░      ░░███  ░░███  ░███ ░   █ ░███      ░███  ░███  ░███  ░░█████  ░███
 ███░         ░░█████████  ██████████ █████     █████ █████ █████  ░░█████ █████
░░░            ░░░░░░░░░  ░░░░░░░░░░ ░░░░░     ░░░░░ ░░░░░ ░░░░░    ░░░░░ ░░░░░

╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ > https://kakakakakku.hatenablog.com/entry/2025/10/29/192801 の直近1週間の PV は?
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

✦ 直近1週間のPVは3219です。

 Using: 1 MCP server

実際に Google Analytics コンソールで確認した値と一致していた❗️

今度は自然言語で トップページを除いて直近1週間で人気記事トップ3は? という質問を投げると結果が返ってきた👏

╭────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ > トップページを除いて直近1週間で人気記事トップ3は?
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯

✦ トップページを除いた直近1週間で人気の記事トップ3は以下の通りです。

   1. /entry/2025/10/29/192801 (3219 PV)
   2. /entry/2022/07/10/140253 (67 PV)
   3. /entry/2024/11/12/083326 (66 PV)

 Using: 1 MCP server

X ポスト

Terraform: AWS WAF で Basic 認証を実装する

AWS WAF を使ってアプリケーションに Basic 認証を設定できる🔒️Basic 認証のセキュリティレベルを理解した上で一時的な社内用途などで使いたいという場面はあると思う.

今回は AWS WAF + ALB(固定レスポンス)という簡単な組み合わせを Terraform で実装して試す.

準備

base64 コマンドでエンコードして Basic 認証の値を作っておく.

$ echo -n 'user:password' | base64
dXNlcjpwYXNzd29yZA==

👾 variables.tf

Basic 認証の値は Terraform コードには直接実装せず variable として渡す.

variable "basic_auth_base64" {
  type      = string
  sensitive = true
}

👾 waf.tf

次は aws_wafv2_web_acl リソースを使って AWS WAF の Web ACL sandbox-waf を実装する.ポイントは Authorization ヘッダーに Basic xxx という値が設定されていなかったら AWS WAF で 401 Unauthorized を返してブロックするところ.visibility_config などは必要最低限の実装にしてるので適宜修正して OK👌

resource "aws_wafv2_web_acl" "main" {
  name  = "sandbox-waf"
  scope = "REGIONAL"

  default_action {
    allow {}
  }

  visibility_config {
    cloudwatch_metrics_enabled = true
    metric_name                = "sandbox-waf"
    sampled_requests_enabled   = true
  }

  rule {
    name     = "basic-auth"
    priority = 1

    action {
      block {
        custom_response {
          response_code = 401
          response_header {
            name  = "www-authenticate"
            value = "Basic"
          }
        }
      }
    }

    statement {
      not_statement {
        statement {
          byte_match_statement {
            positional_constraint = "EXACTLY"
            search_string         = "Basic ${var.basic_auth_base64}"

            field_to_match {
              single_header {
                name = "authorization"
              }
            }

            text_transformation {
              priority = 0
              type     = "NONE"
            }
          }
        }
      }
    }

    visibility_config {
      cloudwatch_metrics_enabled = true
      metric_name                = "basic-auth"
      sampled_requests_enabled   = true
    }
  }
}

👾 alb.tf

最後に AWS WAF を紐付ける ALB sandbox-alb を実装する.今回はサンプルとして固定レスポンスにした.AWS WAF と ALB の紐付けには aws_wafv2_web_acl_association リソースを使う.

resource "aws_lb" "main" {
  name               = "sandbox-alb"
  internal           = false
  load_balancer_type = "application"
  security_groups = [
    "sg-xxxxxxxx"
  ]
  subnets = [
    "subnet-xxxxxxxx",
    "subnet-xxxxxxxx",
  ]

  drop_invalid_header_fields = true
}

resource "aws_lb_listener" "http" {
  load_balancer_arn = aws_lb.main.arn
  port              = "80"
  protocol          = "HTTP"

  default_action {
    type = "fixed-response"

    fixed_response {
      content_type = "text/plain"
      message_body = "Hello!"
      status_code  = "200"
    }
  }
}

resource "aws_wafv2_web_acl_association" "alb" {
  resource_arn = aws_lb.main.arn
  web_acl_arn  = aws_wafv2_web_acl.main.arn
}

動作確認

イイ感じ❗️