彼方のアストラ(1)〜(5)

Rebuild.fm でオススメされていて、「マンガ大賞 2019」で大賞を獲得した「彼方のアストラ」をようやく読むことができた。

惑星キャンプで惑星マクバを訪れた ケアード高校の 9 人が、 謎の光の球体に飲み込まれて 5012 光年離れた宇宙に飛ばされてしまう。 飛ばされた先で偶然にも宇宙船を拾い、 力を合わせて帰還するという物語。

宇宙で遭難したという状況からして、 メンバー間の衝突は不可避というギスギスしがちな題材なのに、 スペースコメディかと思うような明るい雰囲気を作り上げている。

それは 9 人の魅力によるところが大きい。 リーダーのカナタは行動力と決断力もさることながら、 特に明るさが他のメンバーに好影響を与えていた。 明るさといったらアリエスの天然なところもか。 というか、みんな良いキャラクター。 最初は人間的に未熟な部分を抱えているけど、 様々な試練を乗り越えて成長していく。 9 人みんなキャラが立っていて魅力的だった。

5012 光年飛ばされた光の玉の謎に始まり、刺客の発覚、9 人の命が狙われた理由、世界の秘密と、次々と伏線が張られていき、伏線を回収したと思ったら さらに大きな伏線が張られる怒涛の展開。

それらの伏線を全て回収し、作中の謎も全て明らかにし、広げた風呂敷を見事に畳んだ。 5 巻という冊数に凝縮されていて、余計なところが見当たらない。

「いつからそうだと錯覚していた?」と思う場面が何度もあり、正直「作者にしてやられた!」という思いだ。 時折ちゃんとシリアスもあり、 手に汗握る熱い展開もありと、 あっという間に読み終えてしまった。 ホントに無駄が無くて見事な構成。 名作だと思う。

Docker で Windows コンテナのプロセス分離を使って世界に挨拶してみた

はじめに

October 2018 Update から、 Windows 10 Professional 以上で、 開発・テスト用に Windows コンテナが使えるようになっていた。 どうやって使えばいいのか調べたら Docker から使うのか。 独自のインタフェースを提供するより、既にデファクトスタンダードに乗っかる選択をしたのは賢明だな。

Docker のインストール

Docker Desktop for Windows は下記の URL でインストーラーを入手してインストール。

https://hub.docker.com/editions/community/docker-ce-desktop-windows

Docker のトレイメニューで [Switch to Windows containers...] をクリックして、Docker が使うコンテナの種類を Windows コンテナに切り替えられた。

コンテナイメージのダウンロード

早速、Windows Server のコンテナイメージをダウンロードしてみた。

> docker pull mcr.microsoft.com/windows/nanoserver:1809

f:id:griefworker:20190619110102p:plain

ちゃんとダウンロードできたことを確認。

> docker images

f:id:griefworker:20190619110206p:plain

プロセス分離モードでコンテナ起動

プロセス分離モードで実行するには、--isolation process の指定が必要。 「Hello World!」をテキストファイルに出力してコンテナを終了するところまでやってみた。

> docker run -it --isolation process mcr.microsoft.com/windows/nanoserver:1809 cmd.exe
> echo "Hello World!" > Hello.txt
> exit

f:id:griefworker:20190619110233p:plain

コンテナが停止されていることを確認。

> docker ps -a

f:id:griefworker:20190619110300p:plain

ステータスが Exited になっている。

新しいコンテナイメージを作成

変更したコンテナから新しいコンテナイメージを作成してみた。

> docker commit <コンテナID> helloworld

f:id:griefworker:20190619110326p:plain

コンテナイメージに helloworld が追加されていることを確認しておく。

> docker images

f:id:griefworker:20190619110336p:plain

作成したコンテナイメージを使ってコンテナを起動

helloworld コンテナイメージを使って、コンテナを起動してみた。 もちろんプロセス分離モードで。 今回は、テキストファイルの中身を表示したら即コンテナを停止させている。

> docker run --rm --isolation process helloworld cmd.exe /s /c type Hello.txt

f:id:griefworker:20190619110345p:plain

おわりに

--isolation process を指定するだけで、Docker から Windows コンテナをプロセス分離モードで起動できるのは、 Docker 頑張ったなという印象。 いや、頑張ったのはMicrosoft か?

Docker で使うコンテナは Linux コンテナが多いと思うけど、 本業で開発しているアプリは Windows の資産がほとんどなので、 しばらくは Windows コンテナと仲良くすることになりそうだ。

令和最初の誕生日

36 歳になった。35 歳がプログラマーの定年だとするなら、36 歳はプログラマー再雇用から 1 年経過といったところか。今でも相変わらずコードを書いている。

本業では技術基盤チームみたいな仕事をしているから、仕事内容に不満はあまりない。仕事内容はね。まぁ、稀に超つまらない仕事が来て、そいつをやっている間は転職を考えたりすることもあったけど、最近は考えることがだいぶ減った。

というのも、自分がしたいのは、転職ではなくアーリーリタイアだってことに気付いたから。あ〜 5000 兆円欲しい。転職して給料が上がったところで、アーリーリタイアにはほど遠い。それよりは、個人開発に力を入れて、アプリやサービスで副収入を得る方が、アーリーリタイアの可能性が僅かにある、と思う。理想は Twilog のロプロス氏。

そういった思惑があり、今年の抱負に個人開発を掲げたわけだけど、予想通り現実は厳しい。副収入を得るどころか、まだ今年になってプロダクトをリリースしていない。解決したい問題ではなく、つい作りたいもののアイデアを出しがちなのは、ソフトウェアエンジニアの Saga なのか。

もう今年の前半が終わる。後半巻き返さなければ。

アイアムアデータベーススペシャリスト

平成31年度春期のデータベーススペシャリスト試験の合格発表があり、なんとか合格できた。今回は結構しっかり準備して挑んだんだけど、午後Iと午後Ⅱが過去問とは毛色が違っていて敗色濃厚かなぁと思っていたんで、マジで嬉しい。

過去問を解いていたら3年おきくらいにハズレ、じゃなくて苦手な問題が出る年があって、ちょうど今回がその年に該当してしまったかぁ、と試験後に絶望的な気持ちになっていた。一応解答欄は埋めたけど自信は無かった。

f:id:griefworker:20190621141857p:plain

奇跡的に受かるとしたら、午後Ⅱがギリギリだろうなと思いきや、午後Iの方がギリギリだった。危ねえ。でもまぁ、ギリギリでも合格には違いない。

テキストは技術評論社が出している「データベーススペシャリスト合格教本」を選んだが失敗だったな。解説は丁寧だったけど、解答テクニックをもっと教えてほしかった。その点では「情報処理教科書データベーススペシャリスト」の評判が良いみたいだったので、そっちにしておけばよかったと後悔している。

平成31年度データベーススペシャリスト合格教本

平成31年度データベーススペシャリスト合格教本

情報処理教科書 データベーススペシャリスト 2019年版

情報処理教科書 データベーススペシャリスト 2019年版

今度違う高度試験を受けるときは、評判をよく調べてからテキストを選ぶようにしよう。それだけが反省点。

五等分の花嫁(10)

10巻はまるまる修学旅行編だったが、その中で一花がダークサイドに堕ちてしまった。嘘に嘘を重ねる姿は見てられなかったな。最終的にはその報いをうけるわけだけど、身から出た錆とはいえ、すべてが嘘というわけでもないようなので、ちょっと同情。この展開だと、よっぽどのことがなければ一花が花嫁はないかなぁ。

今のところ三玖が有力。ただ、二乃でも綺麗にまとまりそう。二乃の家族思いなところは美点だ。ニ乃なら全員祝福してくれそう。そんな一花・二乃・三玖の三つ巴と思いきや、今回はなぜか五月がグイグイきていた。別に風太郎に惚れてそうな様子は見られなかったから不自然。と思っていたら、最後の最後にどデカイ秘密が明らかにされた。花嫁の正体に次ぐ秘密、つまりは零奈の正体。それを知ると、五月がグイグイきた理由も想像つく。

11巻では五つ子の過去が明らかになるみたいで、ますます盛り上がってきた。 案外、物語終盤だったりするんだろうか。

ぼくたちは勉強ができない(12)

12巻でついに真冬先生の過去が明かされたわけだが、思っていたのとちょっと違っていたな。

てっきり、高校時代に一時的にフィギュアスケートを離れた時期があって、そのブランクを取り戻せず、フィギュアスケートの道を断念したことを後悔してるんだと思ってた。

そうではなくて、進路にフィギュアスケートではなく教師の道を選んだけど、なろうとしたスタイルの教師が自分に向いていなかった、憧れた恩師のような教師になる才能はなかった、と。そういう後悔だったのか。

ただ、 そこから方針転換して、生徒の才能を優先させるようになったわけだけど、その方針は決して間違ってるとは思わないな。やり方が不器用だっただけで、教え方も上手みたいだし、ちゃんと教師としての才能はあるでしょ。成幸の影響は受けてるだろうけど。

そんな成幸の活躍もあって、真冬先生もようやく過去の呪縛から解放されてめでたしめでたし。

HTTP.sys でポート共有

Microsoft Docs によると、HTTP.sys はポート共有をサポートしていると書いてある。

docs.microsoft.com

ただ肝心のやり方が載ってない。 見つけられないだけかも? だけど推測はできる。 おそらく、重複しない URL プレフィックスを指定してやればいいんだろう。

HTTP.sys でホストする最小限の ASP.NET Core アプリで試してみることにした。

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.HttpSys;

namespace PortSharingSample.Foo
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseHttpSys(options =>
                {
                    options.Authentication.Schemes = AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
                    options.Authentication.AllowAnonymous = true;

                    // prefix を登録する
                    // prefix が重複していなければ、ポートが同じでもホストできる
                    options.UrlPrefixes.Add("http://localhost:5000/Foo");
                });
    }

    public class Startup
    {
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello Foo!");
            });
        }
    }
}

名前空間と登録する URL プレフィックスだけが違う ASP.NET Core アプリをもう 1 つ作成。

using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Server.HttpSys;

namespace PortSharingSample.Bar
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>()
                .UseHttpSys(options =>
                {
                    options.Authentication.Schemes = AuthenticationSchemes.NTLM | AuthenticationSchemes.Negotiate;
                    options.Authentication.AllowAnonymous = true;

                    // prefix を登録する
                    // prefix が重複していなければ、ポートが同じでもホストできる
                    options.UrlPrefixes.Add("http://localhost:5000/Bar");
                });
    }

    public class Startup
    {
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            app.Run(async (context) =>
            {
                await context.Response.WriteAsync("Hello Bar!");
            });
        }
    }
}

実行すると、5000 番のポートを共有して 2 つの ASP.NET Core アプリを起動することができた。

f:id:griefworker:20190603143341p:plain

HTTP.sys でのポート共有の方法がドキュメントで見つからなかったけど、 予想通り URL プレフィックスを登録することで上手く動いた。 予想通りだったとはいえ、こういうのはちゃんと試しておくのが大事。