山pの楽しいお勉強生活

勉強の成果を垂れ流していきます

Jupyter Notebook上でDjangoを動かす

はじめに

ちょっとQuerySetの動きをみたいとか、特定のコードを動かしたいとかあるよね?Django Shellでもいいのだけど、色々試したいからちょっと面倒なのでJupyter Notebookで動かしたい。 前職でも似たようなことをやっていてその時のスニペットをメモしていなくて地味に困っていたのだけど、時間ができたので再度作成しました。 もっと短かった気もするのだけど、とりあえず動くのでOK

コード

import os
import django

# https://docs.djangoproject.com/en/3.2/topics/async/#envvar-DJANGO_ALLOW_ASYNC_UNSAFE
os.environ["DJANGO_ALLOW_ASYNC_UNSAFE"] = "true"
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.settings")

django.setup()

上記のコードで設定が完了。次のセルでQuerySetなどが動きます。

from your_app_name.models import YourModelName

YourModelName.objects.all()

キャプチャ

jupyter notebook

DJANGO_ALLOW_ASYNC_UNSAFE について

  • コード上にコメント入れているけど、 DJANGO_ALLOW_ASYNC_UNSAFE を有効にしています
  • あくまでも開発時に少し試したいという時のコードなので問題はないはず
  • 詳細はドキュメント参照
  • 「はじめに」にも書いたけど前職のときのスニペットはこれは設定していなかった気がする
  • 設定しない場合には以下のエラーが発生する(ドキュメントの通り)
    • SynchronousOnlyOperation

ログ全文はこちらクリック

---------------------------------------------------------------------------
SynchronousOnlyOperation                  Traceback (most recent call last)
Cell In[1], line 12
      8 django.setup()
     10 from api.modules.user.models import User
---> 12 User.objects.filter(email="a@example.com").exists()

File /usr/local/lib/python3.9/site-packages/django/db/models/query.py:808, in QuerySet.exists(self)
    806 def exists(self):
    807     if self._result_cache is None:
--> 808         return self.query.has_results(using=self.db)
    809     return bool(self._result_cache)

File /usr/local/lib/python3.9/site-packages/django/db/models/sql/query.py:550, in Query.has_results(self, using)
    548 q = self.exists(using)
    549 compiler = q.get_compiler(using=using)
--> 550 return compiler.has_results()

File /usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py:1145, in SQLCompiler.has_results(self)
   1140 def has_results(self):
   1141     """
   1142     Backends (e.g. NoSQL) can override this in order to use optimized
   1143     versions of "query has any results."
   1144     """
-> 1145     return bool(self.execute_sql(SINGLE))

File /usr/local/lib/python3.9/site-packages/django/db/models/sql/compiler.py:1173, in SQLCompiler.execute_sql(self, result_type, chunked_fetch, chunk_size)
   1171     cursor = self.connection.chunked_cursor()
   1172 else:
-> 1173     cursor = self.connection.cursor()
   1174 try:
   1175     cursor.execute(sql, params)

File /usr/local/lib/python3.9/site-packages/django/utils/asyncio.py:24, in async_unsafe.<locals>.decorator.<locals>.inner(*args, **kwargs)
     22     else:
     23         if event_loop.is_running():
---> 24             raise SynchronousOnlyOperation(message)
     25 # Pass onwards.
     26 return func(*args, **kwargs)

SynchronousOnlyOperation: You cannot call this from an async context - use a thread or sync_to_async.

sync_to_async を使うと DJANGO_ALLOW_ASYNC_UNSAFE が不要

import os
import django  # type: ignore
from asgiref.sync import sync_to_async  # type: ignore

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "api.settings")

django.setup()

from api.modules.user.models import User


@sync_to_async
def check_user_exists():
    return User.objects.filter(email="a@example.com").exists()
await check_user_exists()

上記のように sync_to_async を使用することで同期を正しくとって安全に動かすことも可能。っというかこちらがあるべきの実装になる。が、繰り返しになるが今回は開発時など一時的に使用することを目的とするため、こちらはあまり使うことはないかなと思った次第です。

docs.python.org

docs.djangoproject.com

Dev ContainerでVS Codeの拡張機能がインストールされない場合に手動でインストールする

はじめに

  • VS CodeでDev Containerを使う場合、 .devcontainer/devcontainer.json拡張機能を書いておくことで自動でインストールされます
  • ただ、何らかの理由によりインストールされない場合が稀によくあります
    • 割と長くDev Container使っていますが、理由は不明です。わかる人教えてください。
    • 再度開いたりするとうまくいく場合もあるので、私の環境問題なのかもしれない
  • 私の環境は大体Python入っているのでPythonで記載

Pythonコード

import json
import subprocess
from pathlib import Path

p = Path(".devcontainer/devcontainer.json")

with open(p) as f:
    jsonc_data = f.read()
json_data = "\n".join(line for line in jsonc_data.split("\n") if not line.strip().startswith("//"))

for extension in json.loads(json_data)["customizations"]["vscode"]["extensions"]:
    subprocess.run(["code", "--install-extension", extension])

※多分バージョン関係ないですが、3.11.9で動作確認済み ※jupyter notebookで動作させる場合、 "jupyter.notebookFileRoot": "${workspaceFolder}" を設定するか、devcontainer.json のPATHを変更する必要あるかも

Bash

#!/bin/bash

# JSONC形式のファイルパス
JSONC_FILE=".devcontainer/devcontainer.json"

# コメントを削除したJSONを生成する一時ファイル
TEMP_JSON_FILE=$(mktemp)

# JSONC形式のコメントを削除してJSONに変換
grep -v '^\s*//' "$JSONC_FILE" > "$TEMP_JSON_FILE"

# VS Codeの拡張機能をインストール
extensions=$(jq -r '.customizations.vscode.extensions[]' "$TEMP_JSON_FILE")
for extension in $extensions; do
    code --install-extension "$extension"
done

# 一時ファイルを削除
rm "$TEMP_JSON_FILE"

※Chat GPTさんに作成してもらったので詳細は割愛
jq コマンドが必要

bashワンライナー

JSONC_FILE=".devcontainer/devcontainer.json"; TEMP_JSON_FILE=$(mktemp); grep -v '^\s*//' "$JSONC_FILE" > "$TEMP_JSON_FILE"; extensions=$(jq -r '.customizations.vscode.extensions[]' "$TEMP_JSON_FILE"); for extension in $extensions; do code --install-extension "$extension"; done; rm "$TEMP_JSON_FILE"

※Chat GPTさんに作成してもらったので詳細は割愛
jq コマンドが必要

転職して1年経ったまとめと2023年の振り返り

2023年のイメージ画像(OpenAI作成)
2023年のイメージ

はじめに

この記事は2023年の振り返りをすることで2024年に気合を入れようという記事、ポエムです。40代のITエンジニアがどういうこと考えて日々を過ごしているのかは少しわかるかも。ITエンジニアチックな話は少なめです。

何日かに分けて書いていたら7000文字弱という文字数になってしまった。それだけ盛り盛りの1年だったということで良いことです。

ベンチャー企業への転職

2023年の1月から株式会社STYZへ転職しました。Syncable という非営利組織向けの寄付プラットフォームサービスを開発しています。創業8年目で40人くらいの会社です。メンバーの全体的に若く、経営陣含めても私が最年長です。転職したきっかけは一緒に働きたいと思っていた人に誘われたため。

今までの所属企業も大企業(従業員1000人以上)のみいうことではなかったですが、最低でも100人以上所属 OR 大企業の子会社だったので会社内部制度等の会社としてあるべきこと?は大体揃っていて運用されているっという状態でした。これも振り返ってみればそう思うというだけで、当時はそんなこと考えてもみなかった。

で、転職してみたらあって当たり前、やってくれて当たり前と思っていたことが多いこと多いこと。これはITエンジニアとして、開発業務は勿論。会社の制度やオフィスそのもの、物品、会社として?社員として?みたいなことなどなど様々です。具体的に書けることはあまりないのですが、誰かがやってくれてたんだなということがとても多く、自分でやらなければならないこと、やり方が決まっていないこと、誰もやっていないこと、そもそもモノがない。そんなことばかり。

ただ、話を聞くと、チーム、会社としては必要。誰かがやらなければならない。やり方を決めなければならないという。っという意識はあるが手が回っていないという状況です。これらを率先して拾っていくことで、経営陣、若い方、中堅、ベテランの方問わずにこいつなんか色々やってくれるぞ?っと思われて信頼貯金の形成に大きく役立ったと思います。拾い方としても「XX探してもみつからないのですがありますか?ないならとりあえず決めちゃうのでレビューお願いします。」みたいな感じでさっさと動いちゃうと、自分のやりやすい形、慣れている形で決めることができるのでとても楽でした。上位者が気になる点あれば後で突っ込んでくれますし。(突っ込みなかったら全体に展開するだけ)

そしてこういう動きをしているとやたら褒められる!!今の会社で一番好きなのはみんな褒めてくれるとこです。大好きです。この文章を書きながら、私はこんなに褒めてもらって喜んでいるのに、皆を褒めているのか?と気づいてしまったので、2024年は良いところ、嬉しかったことは褒めていくことを心がけていきます。

メンバーの会社への共感度

会社のビジョンは「あらゆる境遇を打破できる社会」、ミッションは「民間から多種多様な社会保障を行き渡らせる」というものです。若い会社だからか事業が社会貢献性が高いからなのかはわかりませんが、メンバーの会社ビジョンやミッションへの共感度がとても高い。正直今まで所属していた会社のビジョンやミッションはそこまで意識して働いていたことはなかったのですしそういった方を見たことなかったのですが、今の会社は全然違う。若い方も自分が何をしたいのかを明確に見てそれにあった会社を選んでいるので、方針等を決める際には会社のビジョンやミッションの話が必ずでてそれに沿って話が進んでいく。勿論、お金や数値の話は必要ですしそういう話もしますが、会社として事業としてどのように進んでいくのかの際にはビジョンやミッションに沿っているかが検討されているのは衝撃でした。「Xだと売り上げは上がるがミッションに沿っていないので、そういう方向性は考え直そう」みたいな。

そんな中、私自身はビジョンやミッションに共感したから入社したわけではない。社会貢献という軸で見てもボランティア経験は少しはあります*1が、考えたことすらない人生です。そもそも自分の考えとしては自分が基準なんですよね。パートナーや子もいますが、自分が楽しいからやる。子を可愛がったら子が喜んで私が嬉しいのでやる。みたいな。勿論、1年ほど働いた今となっては回りまわって自分に返ってきて自分が楽しい、嬉しい。というのはありますが、正直よくわからない。

が、そういった興味のない方をどうやって取り込んでいくのか。っというところは、当事者である私のような人じゃないとわからないと思うので、そういったところで戦力になれるかなと思っており、将来的にはその辺りを目標にして動いていけたら良いなと考えています。寄付とかしたことない人に如何に興味を持ってもらうのか面白そうじゃない。

エンジニアリングチームのリーダー

長くIT業界にいますが、実は開発チームのリーダーは初の経験。*2

とはいっても、ロードマップやスプリント等のタスク管理、サービス自体の品質は経験があったので特に問題はなかったはず。目指すことができたかというとそうではないですが、目指すところに近づくような動きはできたと思います。(多分)しかし、メンバーマネジメントに関しては難しい!メンバーのモチベーション向上や今後のキャリア等々。自分自身の経験に基づいたことは話すことができますが、当然人はそれぞれ違うのでそれを考慮するというのがとても難しい。私自身はあまり人の気持ちがわからないので気持ちを読み取ろうとするのではなく、信頼関係を気づいた上でなるべく話してもらうことを目指していきたいなと思っています。

なんでも話してもらうということを意識しているけれど、なんでも言える環境、関係を作るという部分が足りていなかったかなというのは、結構思うところがあります。また、最初はリーダーとして指名されたこと、周りからどう見えるかを意識しなさすぎた点、その後は逆にリーダーとして無理に振舞おうとしたという部分もあるので、自分は自分のままでやるべきことをやるということを意識していくというのも課題です

まぁまぁうまくやれたとは思いますが課題は色々出たので2024年はより良い形で終われるようにしていきたいです。

関係があった方の成長

2023年は前職等で付き合いがあった若い方がそれぞれ花開いていてとても嬉しい1年でした。転職を成功させた方、サービスを開発運用された方、フリーランスとして再開したら見違えるほど強くなっていた方など。自分でいうのもなんですが、大なり小なり影響を与えられたかなという方々なので成功してくれてたのはとても嬉しいです!来年以降も嬉しい話を聞きたいですね。

今年はフリーランスの方と一緒に働くことができたので、来年はもう1人でも一緒に働く機会を作れたらよいなと。

本読んだ

私は全然本を読まない、読めない人なのだけど今年は結構読んだ。とてもえらい。そもそもなんで読んだかというと、基礎ができていないという自覚があるので体系的に学びたいということと、よい年齢になってきたこともあって意識して勉強をしていかないとダメだよねーという思いから。↓にまとめてみたら14冊読んだらしい。技術書典産の薄い本が5冊もあるのでかさ増ししている感はあるけども素晴らしいと思う。読めたコツとしては出勤中の電車の中では必ず本を読むということ。大事な点は5分でも良いことと、帰りの電車は含まないところ。少しでもハードルは低くことが私にとっては継続していくコツなのだと思う。並べた本を見てみると、技術書典楽しかったなという思いが強い。今年も行く予定なので興味ある人は声かけて欲しいです。一緒に行きましょうー!

読んだ本

今後のキャリア

年齢的にも経験的にもベテランと呼ばれる時期になってきて、直近は転職もあり目の前のことをこなすことが多くなると思っていたものの、今後のキャリアについてどうするかなとは思っていました。そういった時に出会ったのがスタッフエンジニア です。私の動きや目指すところがまさにスタッフエンジニアで、将来目指すところが明確になりました。また、名前が付いたことで他のケースを探すことができ、自分に何が足りないのか、どのような動きを行うべきなのかという先行事例、キャリアケースを探すことができることになったのも嬉しいです。私はスタッフエンジニアの4つの原形の中でも右腕の役割を担いつつ、他の役割をこなしていくという感じですかね。具体的にはCTOを補佐しつつ会社全体としてエンジニア組織を作り、非エンジニアに対してもサポートしていくような形で動いていくことを考えています。

勿論、これは今の段階の話であり変わることは十分ありますが、たとえ一時でも人生でキャリアについてはっきりと決まった瞬間というのはなかったのでこれは大きな転機であるはずです。2024年も頑張るぞ!

最後に

まとめると2023年は転機もあり大きく飛躍できた1年だったなという感想です。明らかに考え方や方向性が良い方向に変わっていますし成長を感じます。2024年も同様かそれ以上の感想を抱けるように、「こんな振り返りしてるけど勘違いだったわwww」っとならないように、日々頑張っていきましょー

*1:障害がある子どもの水泳教室。友人から人が足りないので助けてと依頼されたので月1、数年ほど続けた気がする。よく考えたら謝礼が良かったこともあるのでボランティアではなくアルバイトだったのかもしれない。

*2:厳密にはそういう期間はあるにはあったったのですが、リーダーが退職や異動でプロパー社員の合間とかの期間。

転職したよ

はじめにの前に

  • 本記事は2022年末に書いて、2023/03くらいに公開する予定だったけど完全に忘れていた記事です。
  • 夏くらいに気づいたけどまぁいいかと思って放置してたけど、せっかくなので今(2023/12/31)公開してみます。
  • 公開時点では現職(この記事でいうところの転職先)に1年いるわけですが、その話はないです。

はじめに(概要)

  • 株式会社ALBERT の最終出社が2022/12/20
    • 2017/07/01から2023/03まで所属。有給休暇の残が多かったので実質5年5か月くらい(以下5年半と記載)
    • 今はアクセンチュアに取り込まれたので存在しない
    • データ分析とかAIとかそういうことやっていた
    • 私の職種はエンジニア
  • 転職先は 株式会社STYZ
    • 2023/01から所属
    • 非営利団体向けの寄付フォーム開発とかしている
    • 私の職種はエンジニア -> エンジニアチームのリーダー
  • 前回の転職は↓
  • 本記事は5年半間の振り返り、成長記録を書いたポエム

やってたこと

  • 全体で5年半のうち、社内案件1年半、常駐4年でほとんど常駐
  • マネージャ業務はほぼなし。1エンジニアとして設計して、コード書いていた
    • 厳密にいうとメンバの管理業務はあるにはあったが、同チームどころか部署も違うし職種も違うので建前的な奴。
  • 詳細も書いたけど長くなったので下のほうに移動した

エンジニアとしての自信

前回の転職時には 私はそれなりにコード書けるという自信 としていましたが、これは中堅エンジニアとしてやっていけるかな。くらいの自信でした。ただ、今はシニアエンジニアとして自称できるくらいの自信は持っています。 狭義のエンジニアとしてみると技術面が強く出ると思うため良くて1.5流かなと思いますが、技術面以外の部分でエンジニアとしての自信を持つことができました。具体的には他者の教育(特にエンジニア以外)であったり、エンジニア文化*1の創出や向上、エンジニア職種以外の方へのエンジニアリング技術の啓蒙やエンジニアの使い方(扱い方)、一緒に働くことのメリットを伝えることのように、組織へ貢献することができるようになりました。っというか、これ自体がエンジニアとしての価値になるということがわかったということが成長かなと思っているところです。

やりたいことをやる

先日の記事にも書きましたが、自分のやりたいことをやるということをできるようになりました。こう書くとちょっと響きが良くないですが、言われたことをやるだけではなく仕事を作り出すことで自分のやりたいことをやる。組織は基本的に利益がでれば良いので、自分がやりたいことを提案する際に組織に利益となるということを主張すればよい。言い出しっぺが大なり小なり絡むことになるのでやりたいことができると。また、利益になることを提案したとして評価されるところもポイント。自分のやりたいことと組織が向いている方向*2が同一である前提ではありますが、そもそもそれが異なっていたらその組織にいる必要はないという話。私自身は世界を変えるような大きいことをしたいということはないため少しの働き方でやりたいことができるというのもあります。視座が上がることで難しくなるのかもしれませんが、その時は別の動き方もあるのかなと思っております。とりあえず、動き方が変わってきたというのがポイント。

人に教える

これも前回の転職時にも書いたことですが、私は人に教えることが好きで適性がありそうです。純エンジニアとはほぼ仕事をしていなかったのですが、逆にエンジニア以外の職種の人とエンジニアリングの仕事をする機会は多数ありました。そのほぼ全てで一緒に働く機会が持ててよかったという評価を頂いたのは自信となりました。結果的に道場長や先生という肩書?で呼ばれるようになったのも恥ずかしいですが嬉しいことでした。*3

※以前の転職の時にエンジニアの講師として声をかけていただいたのですが、そちらの道でもまあまあうまくやれたのかもしれない

まとめ

飛躍的に伸びた5年半でした。反省点はありつつも大きな失敗もなく貴重な経験を得ました。また、多数の人と繋がりが持てたことも重要です。*4割と今までの会社では仲は良かったものの次(?)に繋がるという形ではなかなかいかなかったのですが、今回は開発メンバーという以上に関われた方が多くいたためよりよい関係を築けていけそうです。 今後も山pの活躍にご期待ください!


やってたこと詳細

社内案件内訳(時期に被りあり)

  • プライベートDMP(Data Management Platform)開発、保守(3カ月)
    • 入社直後に慣れるまでとりあえずエンジニアとして入った感じ
    • システムの作り自体はそれほど得るものはなかったが5年間の基本となるデータ分析の基礎となる情報を色々学べた
      • 作りが悪いと言っているわけではない
      • データの持ち方、バッチシステムの作り方、通常?のよくあるシステムとデータ分析系のシステムとの違いとか
    • 社員のエンジニアと働いたのはこれが最初で最後
      • ここだけ切り取ると酷い境遇だったように見える(そんなことは思ってないです)
  • プライベートDMP導入企業のPM(6カ月)
    • アサインされてすぐにPMが体調不良で抜けたことによる交代だったのでかなり焦った
    • 既に導入から数年経っていて最終的に企業側で自前?で作ったものに移行してClose
    • クライアントと話して色々やるのは経験になった
      • 入った時からCloseが見えていたので色々目こぼししてもらいつつも、過去の遺産を漁る作業が多かった記憶
    • Close作業は多分初で、色々面倒なことあるなーと思った記憶あり
    • 割と大きいクライアントだったので普段は温厚でもいきなり圧が凄いときがあった
  • 分析案件PM(9カ月)
    • 定型レポートの提出的なお使い業務と聞いていたのに、実際に会ってみたら分析についてサポートしろよと言われて、えーってなった案件
    • やれることはやっていたという自負はあるが、そもそも分析者ではないので最終的には担当者交代となった
    • 信頼関係はできていたと思うので完全に実力不足というか、私をアサインしたのが悪いと言いたい
      • 上司への相談、アラート上げるのが遅かったという反省は強くある
  • 学習モデルPOCからのシステム開発案件PM(3カ月)
    • 大変という言葉でしかない
    • 新規で作っている大きなシステム内で使われる1機能、APIみたいなイメージ
    • POCで作った学習モデルを組み込んで予測するという話が、クライアント的には学習モデルを作るという話になってて笑った
      • 上位の大きなシステム作っているベンダーに界隈の有名人がいてその人もクライアントに振り回されていた
      • 今から考えるとなんであんな案件をうちでやっていたのだろうか。最初はPOCだけやるつもりだったのに上位のベンダーが無理って言ったのか?
    • 何もわかっていないのに承認するんだなーっと、要件定義の難しさを知った
    • とりあえず期間が短すぎて最低限のことしかできなかったけど、1つのシステムを作り上げたという自信には繋がった
  • 学習モデルPOCからのシステム開発案件PM(2カ月)
    • これも大変だった
    • POC段階でほぼシステム的に動くものはあるからと2カ月になっていたが。。。
    • データサイエンティストとエンジニアとの違いを実感した案件
    • 確かに動くものはある
      • POCとして条件が色々ある状態のものであり正常系のみ
      • 細かい部分も考慮されていないので結局仕様を読みつつ再実装が必要
    • 学習モデルやAIを使用するPOCからのシステム化案件をこの後も色々見たけど、全てのアンチパターンを踏み抜いていた案件だった
  • 他にも細かい案件いくつか
    • 月5万の保守案件
      • 遥か昔の案件システムの極々一部の保守
      • クライアントもこちらも誰も仕様を知らない
      • クライアント側に手動作業があるのだが催促してもやってくれない(多分使っていない)
      • 更に値切られたときにはなんで案件切らないのかクライアント、社内ともに問い詰めた

常駐案件

  • BI表示用データの作成バッチシステム開発
    • PySparkに慣れるまでが大変だったが案件そのものの難易度はそれほど高くない
    • 詳しく要件聞くと汎用的である必要があったので、忙しい中でも必要以上に汎用化したらそれが後々かなり効いてきて、やった感を得た
    • 案件そのものよりも隔離環境の経験が新鮮であった
  • マーケティング施策向けWebアプリケーション開発(3年くらい)
    • 本当の0から、コンセプトやターゲットといった部分から携われたのは最大の経験
      • 私が作った!と言えるくらい全部に関われた
      • アプリケーション本体についてもDB、Class、API、バッチ、開発環境などなど0から全部に関われた
      • フロントエンドはまったく触っていなかったが、最後の数カ月でフレームワークのバージョンアップを行ったので一気に詳しくなった
    • やることに対してアーキテクチャが複雑になりすぎてしまったのが反省ポイント
      • とはいっても、環境の要因が大きいのでクライアントとの交渉で覆すくらいしか浮かばない

*1:とは?っというのはありますが、定義は一旦おいておく

*2:組織の目的、ビジョンなど

*3:次の会社では既に先生と呼ばれている人がいるため、2代目として引き継ぐか別の呼称を狙っています!

*4:次の会社が決まったことも繋がりの1つ

【無料】Minecraft統合版サーバーをOracle Cloudで作成する

はじめに

内容の難しさ

  • なるべくわかるように書きますが、CloudサービスやLinuxの基礎操作ができないと作成するのは難しいです
    • SSHVimでのテキスト編集方法などは説明しません
  • 便利設定などはコード書いたりするのでこの辺りも慣れていないと難しいと思われます

コンパートメントの作成

前置き

  • コンパートメントとはリソースをグループ分けするようなものらしいです
  • コンパートメントの管理
  • 作成せずrootに配置しても動作は可能ですが、今後Oracle Cloudを別の用途で使用する場合に備えて作成しておきます

手順

  • コンパートメントページを表示
  • コンパートメントの作成ボタン押下
  • 必要な情報を入力
    • 名前: わかりやすい任意の名前(本記事では minecraft_server としました)
    • 説明: わかりやすい任意の説明(本記事では minecraft server としました)
    • 親コンパートメント: root
    • タグ: 必要であれば設定

インスタンスの作成

前置き

手順

  • インスタンスページを表示
  • インスタンスの作成ボタン押下
  • 必要情報を入力(その1)
    • 名前: わかりやすい任意の名前(本記事では minecraft_server_instance_test としました)
    • コンパートメントに作成: ↑で作成したコンパートメントを選択
    • 配置、セキュリティ: デフォルト
  • イメージとシェイプ
    • イメージ: Ubuntu22のMinimal(本記事では Canonical Ubuntu 22.04 Minimal としました)
      • Minecraft サーバーはUbuntu用としてリリースされているため
      • Oracle Linuxでも運用しておりWeb上にも記事は多くありますが、Ubuntuの方が気持ち軽い気がするのと、OS自体の情報はUbuntuの方が格段に多いので運用が楽です
    • シェイプ: VM.Standard.E2.1.Micro
      • 「Always Free対象」となっていることを確認
      • 「はじめに」に書いたが、AmpereにもAlways Free対象がありスペックは格段にこちらが高いが、ArmCPUで動作させるのは難しいです
  • 必要な情報を入力(その2)
    • VNIC名 オプション: デフォルト
    • プライマリ・ネットワーク: 新規仮想クラウド・ネットワークの作成
      • 新規仮想クラウド・ネットワーク名: デフォルト(必要があれば変更)
      • コンパートメントに作成: ↑で作成したコンパートメントを選択
    • サブネット: 新規仮想クラウド・ネットワークの作成
      • 新規サブネット名: デフォルト(必要があれば変更)
      • コンパートメントに作成: ↑で作成したコンパートメントを選択
      • CIDRブロック: デフォルト
  • プライマリVNIC IPアドレスセカンダリVNICオプション
    • デフォルトでOK
  • SSHキーの追加
    • キー・ペアを自動で生成を選択
      • 使いたいキーがあるならば適当にしてください
    • ※秘密キーの保存、公開キーの保存を忘れずに
      • 忘れた場合には作成時に警告してくれます
  • ブート・ボリューム
    • デフォルト
  • 作成ボタン押下
    • 「実行中」になればOK

固定IPを取得

  • IPが変わるとクライアント側で接続先を変更する必要があり、面倒なので固定します
  • ネットワーキング→IP管理→予約済パブリックIP
  • 「パブリックIPアドレスの予約」を押下して必要情報を入力
    • 予約済みパブリックIPアドレス名: わかりやすい任意の名前(本記事では minecraft_server_test_ip としました)
    • Create in Compartment: ↑で作成したコンパートメントを選択
  • パブリックIPアドレスの予約押下
  • 一覧に作成した名前で表示されていればOK

※このIPにクライアントから接続することになります

インスタンスのIPを固定

  • ↑で取得した固定IPをインスタンスに設定します
  • インスタンス画面を表示し、 下の方にある アタッチされたVNICを押下、選択。
    • 下の方にあるのですごくわかりにくいので注意
  • 下の方にある「IPv4 アドレス」を押下し、 から「編集」を押下
  • パブリックIPの割り当てを解除 → 更新
  • 再度、 から「編集」を押下
  • 「予約済みパブリックIP」が選択できるようになっているので、取得した予約済みIPアドレスを選択 → 更新
  • インスタンスに戻って、プライマリVNICのパブリックIPv4アドレスが取得した予約済みIPアドレスになっていればOK

インスタンスのポート開放

  • クライアントからサーバにアクセスできるようにポートを開放します
  • インスタンス画面を表示
  • プライマリVNIC内のサブネットを押下
  • イングレス・ルールの追加を押下
  • 必要な情報を入力
    • ソースCIDR: 0.0.0.0/0
    • IPプロトコル: UDP
    • 宛先ポート範囲: 19132-19133
      • IPv6で接続する場合に19133が使用されるので、実質的には19132だけでOK
  • 一覧に作成されたルールが表示されていればOK

インスタンスへのSSH接続

  • ssh がインストールされているか確認
    • ssh -V
  • OpenSSHのインストール
    • sshがインストールされていない場合はインストールします
    • Windowsの場合インストールされていない気がします
    • winget install Microsoft.OpenSSH.Beta
      • 本記事執筆時点ではBetaとなっていました winget search openssh で最新バージョンが出ていないか確認してください
  • インスタンス作成時に取得した秘密鍵、公開鍵を ~/.sshフォルダに格納
    • Windowsの場合は C:\Users\${ユーザー名}\.ssh
    • Windows以外は /home/${ユーザー名}/.ssh
  • ssh configの作成
    • sshコマンドを長く書くのは面倒なので設定ファイルに書きます
    • ~/.ssh を開く
    • config という名称でファイルを作成(拡張子は不要)
    • 設定値
      • Host: わかりやすい任意の名前。接続時に使用します(本記事では minecraft_test としました)
      • HostName: インスタンスのパブリックIPv4アドレス(↑で設定した予約済みIPアドレス
      • User: ubuntu
      • Port: 22
      • IdentityFile: ↑で置いた秘密鍵のPATH
    • サンプル↓(HostName)
Host minecraft_test
   HostName 192.0.2.0/24
   User ubuntu
   Port 22
   IdentityFile ~/.ssh/ssh-key-2023-10-28.key
  • インスタンスへ接続
    • ターミナルを開く
      • Windowsの場合は Windowsキー + Rcmd 入力
    • ssh ${↑のconfigで指定したHost} とコマンドを入力
      • 例: ssh minecraft_test
    • はじめて接続する場合にはfingerprint確認しろと出るので yes と入力
    • 以下のように接続できればOK

インスタンスの設定

sudo apt update
sudo apt upgrade -y

上記のようなメッセージが表示された場合は「15」入力し、一旦抜けてから sudo shutdown -r now と実行し、サーバーを再起動。

カーネルのバージョンが変わるので、再起動しろよっというメッセージです。(意訳) ※再起動すると当然ssh接続は切れるので、再度sshで接続してから次に進みましょう

sudo apt install vim zip unzip ufw cron -y
  • タイムゾーンの設定
    • デフォルトではUTCで日本時間で生活している民はややこしいので、日本時間に変更
sudo timedatectl
sudo timedatectl set-timezone Asia/Tokyo

sudo ufw status verbose
sudo ufw default deny
sudo ufw allow 22/tcp
sudo ufw allow 19132/udp
sudo ufw allow 19133/udp
sudo ufw enable
sudo ufw status verbose

  • システム再起動
    • 不要な気がするが、前回作成時にうまくいかなかったため再起動
    • sudo shutdown -r now
    • 再起動すると当然ssh接続は切れるので、再度sshで接続してから次に進みましょう

Minecraftをインストール

  • 現在のバージョンのURLを確認
    • 以下にアクセスし、最新のバージョン、URLを取得取得
      • www.minecraft.net
      • 上記のキャプチャの場合だと、「1.20.41.02」、「 https://minecraft.azureedge.net/bin-linux/bedrock-server-1.20.41.02.zip
      • ※もっと良いバージョン確認の方法があったら教えて欲しい
  • モジュールを取得
    • wget https://minecraft.azureedge.net/bin-linux/bedrock-server-1.20.41.02.zip
    • URLは上記で取得したURLを使用する
  • モジュールを解凍
    • unzip bedrock-server-1.20.41.02.zip -d ./minecraft
    • minecraft というフォルダ内に解凍します
    • 以下のようになっていればOK
  • 試し起動
    • minecraftフォルダに移動
      • cd minecraft
    • 起動
      • LD_LIBRARY_PATH=. ./bedrock_server
  • 試し接続
    • ※Switch版の場合、色々設定が必要です。ここではAndroid版(スマホ)で確認しています
    • サーバー → サーバーを追加
    • 入力
      • サーバー名: わかりやすい任意の名前(本記事では test_server としました)
      • サーバーアドレス: インスタンスのパブリックIPv4アドレス(↑で設定した予約済みIPアドレス
      • ポート: 19132
    • Worldに接続できたらOK
  • ログを確認
    • サーバー側に以下のようにログが出ていればOK
  • お試し起動終了
    • サーバー側で CTRL + C で終了

起動設定

  • 現在の方法でも普通に遊べますが、サーバー側で起動が必要ですし、ssh接続が切れたらMinecraftは止まってしまう
  • よって、サーバー起動時に自動で起動するように設定を行う
  • systemdの設定ファイルを作成、編集
    • sudo vim /etc/systemd/system/minecraft.service
  • 以下のように記載
    • 一通りオプションは調査していますが、気になる人は自分で調べてください
[Unit]
Description=Minecraft Bedrock Server
After=network.target local-fs.target

[Service]
Type=simple
User=ubuntu
Group=ubuntu
WorkingDirectory=/home/ubuntu/minecraft
Environment=LD_LIBRARY_PATH=.
ExecStart=/home/ubuntu/minecraft/bedrock_server
Restart=always

[Install]
WantedBy=multi-user.target

  • systemdに設定
sudo systemctl daemon-reload
sudo systemctl enable minecraft
sudo systemctl start minecraft

  • サーバーを再起動して、Minecraftが起動するかを確認
    • sudo shutdown -r now
  • サーバー再起動後に、クライアント(AndroidとかのMinecraftアプリケーション)から接続できたらOK

Nintendo Switch から接続する

はじめに

  • 基本的にXbox OneNintendo SwitchPS4/PS5 などは任意の外部サーバーに接続することはできません
  • そのため、本体側の設定を変更する必要があります
  • なお、色々なblog等でこの設定が紹介されていますが、これは↓を使用しています。この人は無償で提供してくれていますので、GitHubアカウントを持っている方は★、そうでない方は寄付等で感謝を示しましょう!!

手順

www.youtube.com

※英語ですが、本家の動画ですので一番わかりやすい。 ※どうしても日本語が良い、テキストでほしい場合には switch minecraft 外部サーバー - Google 検索 とかで調べると、色々出てきますが、情報古かったり間違っていたりするのでおススメはしません

未成年アカウントで外部サーバーに接続する場合

はじめに

  • 未成年は外部サーバーにアクセスすることができないように制限されています
  • MinecraftMicrosoftアカウントでログインする必要があり、Microsoftアカウントの年齢で制限されます
  • Microsoftではゲーム系の設定はXboxで管理するらしいので、Xbox.com 側で設定することになります。

手順

※概要だけ記載します。画面や設定内容は時期によってかなり変わるようなので参考程度にしてください

Minecraft設定

最低限の設定を記載しておく

  • server.properties
    • Minecraftのサーバー側の設定
    • allow-list=true にして下記の allowlist.json を有効にしておく
  • allowlist.json
    • サーバーにアクセスすることができるユーザー一覧
  • permissions.json
    • Minecraft内の権限の設定
    • 身内でやるなら operator が良いと思う

バックアップについて

  • Worldsフォルダがあれば復旧可能
    • 復旧経験あり
  • 加えて、上記の設定ファイル3種をバックアップしておけば良い

Minecraftバージョンアップについて

はじめに

  • Minecraftはサーバー側とクライアント側のバージョンが一致していないとプレイすることができない
  • Switch等だと自動でバージョンアップが行われるため、サーバー側も常に最新バージョンにアップデートする必要がある
  • が、統合版の最新バージョンを知るためのAPI等を見つけることができなかったので、クライアント側でバージョン差異でエラーになった際に手動でバージョンアップをすることを想定している
  • バージョンアップは最新のバージョンを取得、解凍した後に、Worldsと設定ファイルを上書きすればOK

スクリプト

以下のリポジトリのREADME参照 github.com

Minecraft のバックアップについて

はじめに

  • バックアップはworldsフォルダのみを取得する
    • 本来は設定ファイルも取得した方が良いが、大した設定していないので無視している
  • 容量削減のため1週間以上古いバックアップは削除している
    • 動作しているサーバーに直接バックアップしているため
    • 本来はCloud Storageにバックアップするのが良い

スクリプト

以下のリポジトリのREADME参照 github.com

Windowsで起動しているDev Container内からGitのリモートリポジトリに操作を行うと Permission denied が発生する場合の対処方法

事象

  • VS CodeでDev Containerを使用し、コンテナ内からsshアクセス(GitHub操作等)を行おうとした際に Permission denied が発生する

git@github.com: Permission denied (publickey).

  • 発生しうる環境
    • Windows
    • ホストのssh-agentのバージョンが8.8以下
    • コンテナ内のssh-agentのバージョンが8.9以上

解決策

  • ホストのssh-agentのバージョンを上げる
    • winget install Microsoft.OpenSSH.Beta
    • 記事執筆時にはBetaしかなかったが winget search openssh で正式版が出ているか確認すること
  • Dev Containerのドキュメントにも注意書きがある

詳細の前置き

詳細とか詳細な手順とか

事象が発生することを確認

git@github.com: Permission denied (publickey).

ちなみに python:3.11.4 のコンテナで発生した。( Docker Hub

ssh-agentのバージョンを確認

  • ssh-agentはsshについてくるものらしいので、sshのバージョンを確認
    • ssh -V
    • ホストのWindows側( OpenSSH_for_Windows_8.6p1, LibreSSL 3.4.3
      • バージョン8.8以下
      • ホストのWindows側のsshバージョン
    • Dev Container( OpenSSH_9.2p1 Debian-2, OpenSSL 3.0.9 30 May 2023
      • バージョン8.9以上
      • Dev Containerのsshバージョン
  • ホスト(Windows)でopensshの最新バージョンを調査
    • winget search openssh
    • winget search openssh
  • ホスト(Windows)にopensshをインストール
  • sshのバージョンを確認
    • ※私の環境だとインストールを行ったターミナルではだめだったので、別のターミナルを立ち上げて確認
  • Dev Container内に秘密鍵が共有されていること、エラーが発生しないことを確認

参考

code.visualstudio.com

memo

  • Gitコマンドではなく、 ssh-add -l とかの結果を記載する方が本質的だったなと思った

チームとして大切にしたいと思っている3つのこと

はじめに

リーダーとしての立場になり、どのようなチームを作り、どのように進んでいきたいのかをメンバーに明確に伝えなかったことが、一部のすれ違いの原因となりました。 今までも近いポジションを担っていたことはありますが、暗黙的な理解に助けられていたことを改めて知った次第です。 今まで一緒に働いていた方ありがとうございます。

そんなこともあって、私がチーム、組織の中心となる際に何を大切しているか、どういうチームを作っていきたいかというものを言語化して書いておこうと思った次第です。 今も昔も全てを実現できているかというと難しいところではありますが、意識していきたいなと思っております。

ただし、これは私の個人的な視点であり、会社全体や特定のチームの公式な目標やKPIとは異なることに注意してください。

※なので、会社内に閉じるのではなく個人のblogに書いて公開しているわけです。

大事にしているもの

  1. 何でも自由に言う
  2. 背景を意識する
  3. 市場価値を上げる

何でも自由に言う

チームで大切にしたいことの一つ目は、「何でも言える」環境の実現です。 新人であろうとベテランであろうと、全てのメンバーが自由に意見を出せる環境を作りたいと思っています。 年齢や経験年数に関係なく、皆が「こうした方がいいんじゃない?」、「これはなぜこのような形?」、「理由はわからないけど筋が良くない気がする」と自由に提案できる場です。 これはネガティブな意見でも同じです。「今担当のXが楽しいのでYはやりたくない」、「Zは好きではない」といったそれだけでは自分勝手と受け取られるような意見を言える場としたいです。

全ての意見が採用されるわけではないですが、それぞれの意見はチーム全体が多様な視点から問題解決や改善策を考えるための重要な資源です。

「何でも言える」ことができるためには、互いを尊重する信頼関係を築くこと、心理的安全性を高く保つ必要があります。 自由に発言することで不要なストレスを抱えることなく、自分たちの能力を最大限に引き出すことができると考えています。

背景を意識する

次に大切にしたいことは「背景を意識する」ことです。 これは仕事をただこなすのではなく、なぜその仕事をする必要があるのか、その背後にある意図や目的を理解し、行動することを指します。 タスクをただ達成するだけではなく、それが何のために必要なのかを常に考えることで、より効果的な方法がないか、あるいはそのタスク自体が本当に必要なのかを見極めることができます。

この考え方はプロジェクトの全体像を理解し、より具体的で質の高い提案や意見を出すための基盤となります。 また、背景を理解することで、自身の仕事の価値を感じ、その結果、モチベーションの維持にも繋がると考えています。

市場価値を上げる

最後に大切にしているのは「市場価値を上げる」ことです。 これは自分たちがどのようなスキルや知識を身につけることで、自身の価値を市場でも認められるようにするかという視点です。

特定のプロジェクトやサービスに深く関わる専門知識は、その分野や組織内では非常に価値がありますが、市場全体での価値とは必ずしも相関しないことが多いです。 一方、コミュニケーション能力や問題解決力のような広範なスキルはどの組織でも求められ、業界や役職によって求められる具体的なスキルや知識も、それらが広く利用される範囲であれば、高い市場価値を有しています。

もちろん、自社のプロジェクトやサービスに精通することは重要ですが、それと同時に、なぜそのような設計が選ばれたのか、他にどのような選択肢があったのかといった、背後にある理論や理由を理解することが重要だと考えています。 これにより、汎用的な知識を身につけ、自分の市場価値を上げることができます。

最後に

私がチームとして大切にしている3つのポイント、「何でも自由に言う」、「背景を意識する」、「市場価値を上げる」について書きました。これらはチームの行動指針となり、共に成長し、問題解決を進めていく上での鍵となる要素ではないかと思います。 最後に、これを読んでくださった方が少しでも参考になる点を見つけられたら、自身のチーム作りに活用していただければと思います。

そして、この機会にお知らせです。 現在、私たちと一緒に働き、これらの価値観を共有し、挑戦を共にする仲間を募集しています。 興味がある方は、以下のWantedlyまたはTwitter(DMでも可)までお気軽にご連絡ください。

www.wantedly.com

https://twitter.com/yamap_55