色々書く予定

精神的に向上心がないので、馬鹿

Minecraft ポリネシアン鯖構築 (2025 GCP 逆Any%)

この記事は さいが崖 Advent Calendar 2025 31日目の記事です。

嘘です。13日目の記事という事にします。

 

(マイクラのサーバーをGCPで建てる方法だけを確認したい場合、目次の「2025年9月」からどうぞ。)

2025年1月

年明けちゃったな、本当に嫌だなあという気持ちの中、友人宅で新年を迎える。

(筆者は年齢を重ねる実感を感じる年末年始が1年で一番嫌いな時期です。)

今年の抱負を考える。新しい趣味をはじめてカードゲームから足を洗う(2025/12/31時点 目標未達)とか、他界隈でやっている創作での目標を達成する(2025/12/31時点 目標未達)とか、新しく作ったDiscord鯖の友人と沢山遊ぶ(2025/12/31時点 目標未達)とか……

 

色々あるけど、新しく作ったDiscordサーバーでマイクラの話が出ていたことを思い出す。

昔はハ○チみたいな魚の名前をした、仕組みもよく分からない外部ツールを使って友人とマイクラしてたなあ。何が起きて遊べているのかも分かっていなくて、今思い返すとITリテラシーがまるで足りていなかった……(脆弱だな~~)

 

2025年5月

色々あって生活環境激変、仕事以外のすべてをサボりまくる。

ゲームもしていないしほとんど誰とも話していないので、今年の抱負のことはすっかり忘れる。

 

2025年9月

やっと現実生活が落ち着いてきたのでサーバーを構築する。

色々調べた結果、Googleの「Google Cloud プラットフォーム」(通称GCP)ってのが一番管理しやすそう。

console.cloud.google.com

 

登録までの流れの参考記事

zenn.dev

 

実際やったことはそこまで複雑ではない。

こちらの記事に詳しく書いており、上から手順をなぞらせていただきました。

qiita.com

 

特に気を付ける点としては、

・(元記事にも書いてありますが)可用性ポリシーのVM プロビジョニング モデルを スポット とすること

 これを行うことにより、コストが1/3になりコストを大きく抑えられます。

Linuxの基本的な操作を身に付けておくこと(当たり前)

 Windowsに慣れすぎている私は、Nanoのインストールにもかなり手間取りました。

 コピペが出来ない事に苦慮したので、助けられた記事も貼っておきます。(Linux的には邪道なのかな)

qiita.com

 

Discordサーバーからマイクラを起動・終了する流れはこちらの記事も参照させていただきました。

qiita.com

 

ノンパス設定のリンクが切れていたため、私は以下の記事を参考にさせていただきました。

qiita.com

 

私は以下のようにDiscord bot用のコードを改変しました。

import discord
import os
import subprocess
import time
import random
from google.cloud import compute_v1

### define
# Discord Bot アクセストークン
TOKEN = 'ここにDiscordのDevサイトで発行したトークンを入れます'
# インスタンス名
INSTANCE = 'ここにGCPのインスタンス名を入れます'
# インスタンスのzone
ZONE = 'ここにGCPのインスタンスのzoneを入れます(例:asia-northeast1-a)'

PROJECT_ID = 'ここにGCPのプロジェクト名を入れます'
### OSコマンド実行
def exec_subprocess(cmd: str, raise_error=True):
    child = subprocess.Popen(cmd, shell=True,
    stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = child.communicate()
    rt = child.returncode
    if rt != 0 and raise_error:
        raise Exception(f"command return code is not 0. got {rt}. stderr = {stderr}")

    return stdout, stderr, rt

intents = discord.Intents.default()
intents.message_content = True
client = discord.Client(intents=intents)

### 起動処理
@client.event
async def on_ready():
    print('discord鯖接続完了')
    print('/help でコマンド確認')

### メッセージ受信処理
@client.event
async def on_message(message: discord.Message):
    if message.author == client.user:
        return
    
    if message.content.startswith('$hello'):
        await message.channel.send('Hello!')

# ヘルプの表示
    if message.content == '/mc help':
        await message.channel.send('/mc status  : 状態確認')
        await message.channel.send('/mc start   : 起動')
        await message.channel.send('/mc stop    : 停止')
        await message.channel.send('/mc ip      : IP取得')


## インスタンス操作
    else:
        cmd = ''

        if message.content == '/mc status':
            await message.channel.send('=== インスタンス状態取得 ===')
            cmd = 'gcloud compute instances describe ' + INSTANCE + ' --zone ' + ZONE + ' | grep status:'

        elif message.content == '/mc start':
            await message.channel.send('=== インスタンス起動開始 ===')
            start_instance(PROJECT_ID, ZONE, INSTANCE)

        elif message.content == '/mc stop':
            await message.channel.send('=== インスタンス停止開始 ===')
            stop_instance(PROJECT_ID, ZONE, INSTANCE)

        elif message.content == '/mc ip':
            await message.channel.send('=== インスタンスIP取得 ===')
            await message.channel.send(get_minecraft_ip(PROJECT_ID, ZONE, INSTANCE))

## コマンド実行
        if cmd != '':
            stdout, stderr, rt = exec_subprocess(cmd)
            if len(stdout) != 0:
                await message.channel.send(stdout.decode("utf-8"))
            if len(stderr) != 0:
                await message.channel.send('stderr: ' + stderr.decode("utf-8"))
            await message.channel.send('--- コマンド実行完了 ---')

def start_instance(project_id: str, zone: str, instance_name: str):
    instance_client = compute_v1.InstancesClient()
    instance_client.start(
        project=project_id, zone=zone, instance=instance_name
    )

def stop_instance(project_id: str, zone: str, instance_name: str):
    instance_client = compute_v1.InstancesClient()
    instance_client.stop(
        project=project_id, zone=zone, instance=instance_name
    )

def get_minecraft_ip(project_id: str, zone: str, instance_name: str):
    instance_client = compute_v1.InstancesClient()
    instance = instance_client.get(
        project=project_id, zone=zone, instance=instance_name
    )
    return instance.network_interfaces[0].access_configs[0].nat_i_p

client.run(TOKEN)

2025年12月

31日。この記事を書きながら、3か月寝かせていい感じに熟成されたサーバーをやっと公開。タイマーストップです。

みそかに突然サーバーを公開する精神異常者

(登録キャンペーンでもらったGCPの無料枠は登録から月日が経過しすぎていて消滅しました。)

 

余談

実は本記事は記事書きRTAでもありました。

この記事ネタを思いついたのは2025/12/31 18:00 です。

(実質1時間で書きました。)

 

まともにマイクラのサーバー構築について書いている記事はこの世に山ほどある為、これくらいゆるくて良かったと思います。

一発ネタにお付き合いいただきありがとうございました。

Windows10→Windows11へのアップデート前にハマった話

この記事は 六間坂上 Advent Calendar 2024 12日目の記事です。

オールジャンルであることをいいことに好き勝手書きます。

 

Windows10のサポート期限は2025/10/14までだそうです。MicroSoftの嘘つき。

learn.microsoft.com

何故かWindows10のサポートも切れるし(Win10が最後のWindowsって聞いてたのにな)、時期的にそろそろアップデートしておきたいな~と思い、Windows11へのアップデートをしようと考えていました。

しかし、Cドライブの空き容量が一桁GBになっている。日頃からダウンロードフォルダにファイルを溜め込む悪癖もあり、Cドライブの容量はいつもギリギリで生きています。

四年前から使っているCドライブ用SSDは容量が512GBで心もとない。時は12月頭、ブラックフライデーセールも行われ時期も良い。

思い立ったが吉日(思い立って購入した12/1は本当に大安でした。)、ついでにSSDの換装もしてしまおう。増設用に4TBのSSDを買いました。

執筆時点でAmazonに在庫なしのためリンク未掲載ですが、Western DigitalのSN850X(4TB)です。

 

計画はこうです。

バックアップも兼ねてCドライブの内容をまるまる新しいSSDにクローン

クローンしたSSDWindowsをアップデートし、Windows11へ!

 

しかし、現実はもっともっと複雑な手順を踏むことになるのでした……

 

セキュアブートをサポートしている必要があります。有効にしなきゃ。

ひとまずWindows10からwindows11へのアップデートを行えるのか確認する為に、クローン前にPC正常性チェックツールを入れました。今回の作業前に他PCをWindows11に上げる作業を数回行っていたため、この辺りの流れはお手のものです。

早速チェックすると「PCはセキュアブートをサポートしている必要があります。」の警告が。

 

マザボASUSのB550-PLUSだったので、公式ドキュメントを確認してセキュアブートを有効にします。

www.asus.com

しかし、手順を踏んでもPC正常性チェックツールは「PCはセキュアブートをサポートしている必要があります。」の警告文のまま。ここでハマると思っていませんでした。

 

BIOSモード」にピンときたら110番(大嘘)

結論、BIOSモードが「レガシ」だとセキュアブートを有効にできないそうです。マジか……

今回アップデートしようとしていたPCはまるでテセウスの船のようにツギハギしている自作PCのため(多分もう電源とメインSSDくらいしか残ってるパーツないけど)、BIOSモードが「レガシ」のままでした。

BIOSモードを「UEFI」に変更しなければセキュアブートをオンにできない。しかしBIOSモードを変更する作業は多少リスクがあるようです。

(Windowsが標準で用意してくれているMBR2GPTがあるとはいえ)

learn.microsoft.com

 

そのため、作業工程がこのように変わりました。

PCをクローン

BIOSモード変更←new!

SSDWindowsをアップデート

 

ようやくClonezillaにてクローン着手

SSDのクローンについてはこちらの記事が詳しく、とても参考にさせていただきました。クローンはとても順調で、以下の記事をなぞることになってしまうので書くことがないです。

osa030.hatenablog.com

 

とても参考になる記事で、クローンするだけでは駄目でパーティション拡張をしないと4TBが有効に使えない事を知ることが出来ました。ありがとうございます。

 

現在の作業工程(やっと最終版です)

PCをクローン

パーティション拡張←new!

BIOSモード変更

SSDWindowsをアップデート

 

パーティション拡張でまたハマる

しかし、パーティション拡張のソフトを同様に起動した際に何度起動しようとしても起動前にフリーズしてしまいます。これは困った。

osa030.hatenablog.com

 

色々調べてみた結果、驚きの事実が判明。

 

GPartedはセキュアブートが無効でないと起動しません。

こちとらセキュアブートを有効にするために様々設定をして試行錯誤していたので、大きな落とし穴でした。

 

www.long-life-tour.com

Gpartedを起動するには、Secure bootをOFFにして、CSMをONにする必要があります。

 

一度BIOSからセキュアブートをオフ、CSMをオンにし、再度起動。

GPartedが動き、無事4TBのSSDを用意出来ました。あとはBIOSモードの変更だけです。

 

MBR2GPTを用意してくれてありがとうMicroSoft。飴と鞭の使い分けがDV彼氏みたいだな。

MBR2GPTでのBIOSモード変更は以下の記事が参考になりました。

この記事ほど苦戦しませんでしたが、参考になった記事を貼らせていただきます。

note.com

 

特に詰まらず、一発で変更に成功しました。バックアップがあると心の余裕があってとても良いです。

 

完了です、お疲れさまでした。

 

誰でも「読みやすい」コードとは?

この記事は 六間坂上 Advent Calendar 2024 3日目の記事です。

 

はじめに

はじめまして。たーとると申します。

むかしむかし、DSでうごメモにハマっていたこともありHatena Blogを根城に選びました。

人生で初めて記事を書くため、不備がありましたら大目に見てください。

技術者もすなるAdvent Calenderといふものを、私もしてみむとてするなり

 

全くの別業種から転職を行い、(大学で少し触った程度の)未経験からSEもどきになって早4年ほどです。

1年目はとても丁寧にプログラミングの基礎を教えてもらいました。今でも先輩方には頭が上がりません。

それでも、最初に業務のコードを見たときは「どこから読んでいいのか、自分が実現したいことを達成するためにどう書くべきか」が全く見当もつきませんでした。勿論今でも悩むことはありますが。

そこで、初学者の頃を思い出して読みやすいコードについて簡単な考察をしてみたいと思います。プログラム初心者でも読みやすいコードってなんだろう?

読みやすいコードとは

例えばこんなコードがあったとします。

(業務で書くコードはC#が多いため、サンプルもC#で)

  1. List<int> nums = new List<int>() { 1, 2, 3, 4, 5 };
  2. int total = 0;
  3. foreach (var num in nums)
  4. {
  5.     total = total + num; // なんなら total += num; って書きたいけど
  6. }
  7. Console.WriteLine("合計" + total + "です。");

 

恐らく入社したての僕でも一文ずつを追えば読める、簡単なコードです。意図が明確ですし、プログラミング初学者でも読み書き可能な易しいコードと言えるでしょう。

でもC#にはもっといい書き方、ありますよね。こう書くと思います。

  1. List<int> nums = new List<int>() { 1, 2, 3, 4, 5 };
  2. Console.WriteLine("合計" + nums.Sum() + "です。");

 

これは、読みやすいコードと言えるでしょうか。

「Sumは合算だ」という知識さえあればとても読みやすいと言えると思います。

何なら今の僕であればこう書かれているのが自然に感じます。というかこうあるべきです。

 

当時の僕はLinqもプログラムで用いられる基礎的な英語や単語も知らない若造だったので、Linqが何行にもわたっていると「なんか繋がってる~」となりいちいち調べることで何とか読み解いていた覚えがあります。GroupByの概念を理解するのに一週間くらいかかったような。

 

それでは、処理について日本語でメモを残せば良いでしょうか。

  1. List<int> nums = new List<int>() { 1, 2, 3, 4, 5 };
  2.  
  3. // numsの合算値を出力
  4. Console.WriteLine("合計" + nums.Sum() + "です。");

 

……同じことが二回書いてある

と読めてしまいます。基礎的な知識が付いたからこそそのように読めるのですが、もし業務コードにこのようなコメントがそこかしこにあったら発狂してしまいます。

コメントは可能な限り削ぎ落とし、一見して何をしているか分からないコードにそっと添えるくらいが乙なものです。

 

日本語で説明させてみた

では、プログラマなら読めるコードをAIで説明させたら、初学者でもそれなりに分かりやすい説明が出力されるのでは?

思いついたが吉日、試してみましょう……

Microsoft Copilot より

 

おお、これならプログラムを触ったことのない文系大学生でもかなり理解しやすそうです。部分的に理解できない場合はまあまあ使えるのではないでしょうか。

 

…………と言いたいところですが、実際の業務のコードってこんなに分かりやすいことはないと思います。独特なクラスやプロパティがあることは日常茶飯事ですし、クラスやメソッドを他コードから継承していた場合、コピペ範囲が膨大になる事は容易に想像ができます。

 

使用するのが初学者の場合AIが正しい回答を返しているか自分で検証しようがないというのも問題です。

コードが沢山ある中でどこを読ませればいいのか何も分からなくてここだけを読ませてしまった人がいたとします。

で、そのメソッドの中で何やってるんだよ!!のパターン

プログラムの追い方をある程度分かってきた今なら、コードを抽象化してAIに読んでもらう選択肢もありですが、初学者の頃にそれができるとは思えず……

 

また、Chat系のAIを使う時はセキュリティポリシーを確認する必要がありますし、データを食わせる先を選ばなきゃいけないのはネックです。

情報漏洩のリスクを完全に排除できない以上、業務のコードをそのままコピペするのは個人的にはしたくないので、食わせても問題のない形に成形する手間がある……

(というか成形できるのなら、そのプログラムの根幹を理解しているのでは??)

そこまでするならその時間で「検索力」を高めて読めるように訓練することが真のプログラマー(ぢから)なのではないでしょうか……違うかも……

 

まとめ?

・プロジェクトメンバーの認識を合わせて、言語特性に合わせた読みやすいコードを意識して書く。

・ちゃんと書かれているコードで読めない物は読む側が知識を付ける。

・読めないコード、読みにくいコードを書かない。

・ネットに転がっているようなオープンソースのコードの意図が読み取れないときは、AIに突っ込んでみてもいいかもね。

 

当たり前で抽象的な事しか書いてないな……

 

Linqであれ三項演算子であれ、書き方のルールのようなものなので、初見で完全に理解するのは不可能です。C#も年々進化しもう13.0です。

learn.microsoft.com

新しい文法や記法・組み込み型が出てくることも珍しくなく、常にこちらの知識をアップデートしていかなければいけない事は自明です。

初学者の方はめげずに初めて見る型やメソッドを検索しましょう。分からない事は分かる人にどんどん聞きましょう。みんなそうして知識を付けてきました。

 

そうして人に教える側に回り、後輩に基礎的な事象を一通り説明できるようになった時、プログラマーとしてのスタートラインに立てるのではないでしょうか。知らんけど。

 

 

 

……僕ですか?

僕は何年経っても後輩が入ってこないのでよくわからないですね……大丈夫かな