Gaming Life

一日24時間、ゲームは10時間

最近読んだ本・漫画を振り返る 2019/11・12月編

月1更新のノルマをすっかり忘れてたのでFGO特番が始まるまでのこの時間で急いで更新。

IT系

ゲーム制作者になるための3Dグラフィックス技術

ゲーム制作者になるための3Dグラフィックス技術 改訂3版

ゲーム制作者になるための3Dグラフィックス技術 改訂3版

ゲームグラフィックだったりGPUだったりを日本語で調べると必ず一度は目にすることになる西川善司さんの最新作。実はまだ半分くらいしか読めていない。

3Dゲーム黎明期から始まりDirectX12世代までの技術を一通りかいつまんで学べる。数式は殆ど出てこないので読みやすい方だが、ある程度バックボーンとなる知識がないと理解は困難。CGエンジニア検定のコンピュータグラフィックスあたりを読んでからこの本に手を出すとちょうど良い。読み切ったら高いけどリアルタイムレンダリングに手を出そうと思う。

コンピュータグラフィックス [改訂新版]

コンピュータグラフィックス [改訂新版]

  • 作者:
  • 出版社/メーカー: 画像情報教育振興協会
  • 発売日: 2016/09/20
  • メディア: 単行本

リアルタイムレンダリング 第4版 (Real Time Rendering Fourth Edition 日本語版)

リアルタイムレンダリング 第4版 (Real Time Rendering Fourth Edition 日本語版)

ビジネス書

FACT FULLNESS

どこの本屋に行っても一番目立つところに置いていたのでそれなら、と買った。今年読んだ本のベスト3には入る。嘘に騙されてしまう、事実を曲解してしまうような人間の本能を、元医者である著者の興味深い体験談から説明し、その誤りをファクト(事実)を以って否定していく。SNS時代に生きる我々がぜひ読んでおきたい一冊であった。

具体と抽象

具体と抽象 ―世界が変わって見える知性のしくみ

具体と抽象 ―世界が変わって見える知性のしくみ

  • 作者:細谷 功
  • 出版社/メーカー: dZERO
  • 発売日: 2014/11/27
  • メディア: 単行本(ソフトカバー)
Twitterでバズってて,つい勢いで買ってしまった。負のイメージを持たれがちな抽象・抽象論の重要性を説いている。就職する前に読んでおいてよかったと心から思える一冊。1年後、会社で後輩が出来る頃にもまた読みたい。ほぼ同時期に読んでいた、後述の理科系の作文技術と通ずるものがあって面白かった。

理科系の作文技術

理科系の作文技術 (中公新書 (624))

理科系の作文技術 (中公新書 (624))

学会提出用の論文を書いてるし、読まないわけにはいかなかった。かなり前に書かれた本故、たとえや言い回しに古臭さを感じるものの、一生通用する作文技法を学べる。恐らく生涯何度も読み返すことになると思う

その他一般書

桜井政博のゲームについて思うこと

桜井政博のゲームについて思うこと 2015-2019

桜井政博のゲームについて思うこと 2015-2019

ごめんなさい。桜井さんがファミ通で連載持っているのを最近知りました……天才ゲームデザイナー(という肩書でいいんだろうか?)の恐ろしさを思い知った。ステージで即興で話した内容を殆ど暗記してるのおかしいでしょ……

漫画

オレが私になるまで

オレが私になるまで 1 (MFC)

オレが私になるまで 1 (MFC)

個人的The TS漫画 of the year 全年齢版。TS好きはとにかく読め。

SPY×FAMILY

SPY×FAMILY 1 (ジャンプコミックスDIGITAL)

SPY×FAMILY 1 (ジャンプコミックスDIGITAL)

今年の漫画賞を総ナメした化け物。ジャンプ+で追っかけてる。最早私から説明することはあるまい。

まとめ

大学に入ってから、CS系の技術書と漫画ばかり買い漁っていて、売れ筋のビジネス書(ホリ○モン)とかクソとか思っていたのだが、気が向いて買ったFACT FULLNESSが面白くて、ビジネス書にも手を出せるようになったのは成長。この調子で技術書ばかりではなく小説等もたくさん読んでいきたいなあ。

技術書はこの二ヶ月大量に買ってしまったので、暫くは積ん読消化フェーズ。そんなこと言いつつ3月4月にまた新しい本買いそう。ゲーム系やPG言語の解説書だけでなく、OSなど低レイヤの本や、数学系の専門書にも手を出していきたい。

Notionをメモツールとして1ヶ月使い倒したので学生・PG目線でレビューしてみる

弊ブログで何度か紹介しているAsciidoc。markdownより高い表現力に、充実したドキュメント、VSCodeのAsciidoc用拡張機能の使いやすさから、一年近くメモから趣味開発プログラムの仕様書、大学のレポートの執筆に積極的に利用していた。

ai-gaminglife.hatenablog.com

ただこのAsciidoc、文法がやや複雑で覚えにくい為markdownほどお手軽には書けず、テーブルなど小難しいことをしようと思うと毎回公式wikiを見ながら書いていた。 というわけでAsciidocからの移行先を探していたら、notionというアプリに出会った。

www.notion.so

一ヶ月くらい使い倒した結果、メモツールとして非常に優秀で、これ無しで学業・開発やってられないってくらいに優れたアプリだったので紹介。

Notionとは

一言でいうと、markdownでの記述が可能な、Evernoteの超強化版メモツール。ノートをとったり、Trelloのようなタスク管理をしたり、ToDoリストを作ったり、簡易テーブルでデータを管理したり、wikiのような運用をしたり、これらを複数人で共有したりできる。公式サイトにもある通り、多種多様で複雑化するメモ・タスク管理ツールをこれ一つにまとめてしまうことができる。

ここがすごいよnotion

  • 見た目が洗練されている

毎日使うようなツールは、使いやすいことは大前提として、やはり見た目も重要。その点Notionはモダンでシンプルな、美しいデザインになっている。

f:id:ai_gaminglife:20191128000429j:plain

要素を横に並べたり、絵文字を使ったりして見やすいページを自分でつくることができる。

  • Web Clipping対応

f:id:ai_gaminglife:20191128000442j:plain

ChromeFirefox拡張機能を使えば、Web Clippingを使って、画像のように気になった記事を貯めていくことが可能。

  • DataBase機能が凄まじい

Notionを使ってて一番すごいと思う機能。例えば先程のWeb Clipping。ちょちょっと操作してやると、

f:id:ai_gaminglife:20191128000536j:plain

このようにリスト形式の表示に変えることができる。他にもTrelloのようなカンバン形式にしたり、テーブルにすることもできる。テーブルは、簡易的ながら数式を利用することができる。

私はこの機能を使ってプレイしたゲームや読書の記録をつけている。

f:id:ai_gaminglife:20191128000559j:plain

  • 複数人での同時編集

実際に使ったことはないが、複数人で一つのワークスペースを編集することが可能。だれがどこを編集したかは一定数履歴が残るし、ページごとに公開範囲を設定、編集権限を他の人に与えないといったことも可能。手元のPCとiPadを使って確かめた所、同期も相当早く、リアルタイムで同じページを複数人で編集することもできると思う。

  • テンプレートが豊富

これだけ機能が豊富だと、どこから手をつけていいかわからなくなる。そんな人のために公式・非公式でテンプレートが公開されている。

f:id:ai_gaminglife:20191128000648j:plain

テンプレートをそのまま使うもよし。自分の使いやすいように改造するもよし。どうあれ最初はテンプレートを入れてみて、それを参考にしてNotionの機能を知っていくのが良いと思う。

f:id:ai_gaminglife:20191128000704j:plain

▲ 因みにお気に入りのサブスクリプションの管理用テンプレート

mardown、Asciidocとの比較

  • 表現力

    Notion >>>>>>>>>> Asciidoc > markdown

    Notionの圧勝。ただのマークアップ言語とGUIツールの比較は一概にできないが。

  • 編集・入力の簡単さ

    markdown > Notion > Asciidoc

    markdownはある程度PCに慣れている人ならすぐに覚えられ、使えるというのが良いところ。Notionは現在メニュー画面などが日本語に対応しておらず、また、やれることが半端なく多いので、慣れるまでに時間がかかるのが難点。ただ、 / を入れれば大体の機能にアクセスできる。

  • 利用料

    markdown、Asciidoc 0円 Notion 5ドル / 月

気になる点

  • gitでバージョン管理ができない

    当然っちゃ当然だが、GUIツールなので、gitで差分をとってバージョン管理ができない。一応履歴で、誰が、どこを編集したか確認することができるが……

  • 万が一サービス終了したときのダメージが大きい

    All in oneのメモツールなので、もしサービス終了することがあれば、ダメージが大きすぎる。ただこれは外部サービスに頼る以上避けられないことか。

  • 頻繁なマウス操作が求められる

    大体の機能は / でアクセスできるし、ショートカットも充実しているが、それでもマウス操作が必要な場面が頻繁にある。プログラマは気にする人が多いかも

  • スマホアプリ版の完成度が低い

    iPad版はそこまででもないが、Android版の動作が本当に重すぎる。iPhone版は知りません。

  • タブ機能がない

    そういうデザイン思想で作ったのだろうと想像できるが、それでもタブ機能がほしい。色んな場所に散らばったページを同時に編集したい時がよくあるので。

おすすめの運用

  • 人に渡すメモ、高い表現力が必要ない、バージョン管理したい文書 ...... markdown
  • 仕様書などある程度の表現力が求められる文書 ..... asciidocで書いてPDF変換
  • スマホタブレットでもメモを取りたい・閲覧したい人 …… Google keepやevernote
  • それ以外 ...... Notion

ただしこれらは一人で運用する場合。研究室や会社等、集団で使う場合はまた違う判断基準になる。感覚的には、Notionは一つのワークスペースで30人くらいまでが編集権限を持つ、が限度だと思う。それ以上は相当厳格な運用ルールを定めないとグチャグチャになると思う。

まとめ

Notionはとことん触り心地の良さにこだわっているツールで、お陰でメモを取るのが苦痛ではなくなってしまった。自分だけのwikiが出来上がっていくのはとても楽しい。当面はこれで殆どのメモを取るつもりでいる。1年後、どれだけの情報が蓄積されることになるのだろうか……

スマホでも編集したい、という人を除けば、非常におすすめのツールなのでぜひ使ってみてもらいたい。

ところでイース9が期待通りに面白かったのでレビューを書く

半年ぶりくらいに発売日にゲームを買ったのですが、案の定めっちゃ面白かったので大学の課題の締め切りが近いにも関わらず1週間ほどでクリアしてしまった。クリアタイムはだいたい40時間くらい。トロコンはしてないです。

イースIX -Monstrum NOX - PS4

イースIX -Monstrum NOX - PS4

イースシリーズは前作イース8を不倒城さんのレビュー記事きっかけで3年遅れでswitch版を買ったくらいの新参者ですが、8の重厚なストーリーと動かして気持ちいい爽快なアクションの虜になってしまい、9は発売前から非常に注目していました.で,このPVが流れてきた時の衝撃。

youtu.be

イース8で唯一といっていいくらいの不満だったのが、敵が周りにいない時のフィールド移動の単調さ。基本的に走る以外の移動手段がないので、終盤だれてしまったのを記憶している(とは言えファストトラベル用のランドマークがこまめにあるのでそう気にならないレベルだったが)。

イース9はその問題に対し、「異能アクション」というアンサーを出してきた。壁登りで高い場所に移動し、サードアイでフィールド上の隠しアイテムを見つけ、滑空で目的地まで一気に飛び移る。8にはなかった縦の移動を加えることで、ただ街中を移動しているだけで楽しいというゲーム性の獲得に成功しています。PVで異能アクションを初めて見た時感動した。

これだけ聞くと、知ってる人は「大体ゼルダBotWじゃねえか!」とツッコミを受けそうですが、実際プレイした時に受ける印象は全くの別物。ゼルダがとにかく広大な世界を自由に駆け回り、能動的に新たなイベントを探索することが軸に据えられているに対し、イース9はあくまで戦闘がメイン。次の目的地はマップで指示され続けるので、誰がプレイしてもEDまでの全体通しての流れは同じになるでしょう。異能アクションはその目的地までの過程で「これはなかなか見つけられないだろう」といったショートカットルート、地図には表示されているのにどこにあるかわからない宝箱を見つける為にあります。

じゃあなんでこんなにも異能アクションが楽しいのかというと、ゲームの大半を過ごす<<監獄都市>>バルドゥークの、異能アクションで駆け回るために最適化されたレベルデザインが全てというほかありません。ストーリー進行で都度解放される異能アクションによって、最後まで決して広大とは言えない(狭いとはいっていない)一つの街を探索しているのに繰り返し新しい発見ができるように配置は、長年アクションRPGを作り続けてきた日本ファルコムさんの執念を感じます。そしてバルドゥークの街中を建物内など一部例外を除き、ロードなしの移動を実現した開発者。すごい。

8でも十分な量があった収集要素も更に充実。異能を駆使しなければ集めきることができない配置と数が探索をより楽しくさせています。

戦闘は、異能アクションという発明で、8以上にスピード感のある仕上がりとなっており、正当に進化させてきたなーという印象。まぁ戦闘に関しては前述の不倒城さんのイース8のレビューが全てです。ガチャ押しでスキルを押し付けるだけでも楽しく、中盤以降は敵の動きを見切り回避、防御し有利属性で敵を付いてブレイクを発生させ、大技をぶつけて一掃する……「仁王」で九州から出るのでやっとな腕前の筆者でも最後まで、楽しく遊ぶことができました。特に何も考えずボタンを押しているだけで楽しいアクションゲームはそうそうない。あと、これは個人的な評価点なのですが、プレイ中に気軽に難易度を変えられるのが非常にありがたい。いわゆるゲームオーバーに伴う戻し作業というのが苦手なので、稀にHARD->NORMALに変更してゲームオーバー回避ということをしていた。

ストーリーはコテコテのJRPGといった風合いで非常に私の好みに合致している。属性てんこ盛りの個性的なキャラクター達の人間ドラマと徐々に明かされていくバルドゥークの謎。舞台装置的な悪役もおらず、メインの登場人物皆人間臭い側面を持っている。しかしながらストーリーの完成度はイース8に軍配があがるかなあと。王道を往くせいで早い内に先が読めてしまったので。ただし、最終盤のあるワンシーンはイース8他、過去作ファンなら感動する。した。

欠点は、街中での戦闘でフレームレートが安定しない、岩肌などのテクスチャが現世代機ゲーム機後期に発売されたものとしてはやや荒い、あるクエストで即死トラップが至るところに仕掛けられていてダレたところなど。個人的にはこれくらいならまぁ愛嬌として許せる。ただしメインストーリー進行中に踏んだ進行不能バグ。テメーはダメだ(難易度変更することで解決した)。

過去作ファンなら楽しめる要素が随所に散りばめられているが(8しかプレイしてないお前がいうか?)、最初のイースシリーズとして十分オススメできる仕上がり。非常に完成度の高いアクションRPGだと断言できます。超おすすめ。

最近読んだ本・漫画を振り返る 2019年10月編

読書メモとして、最近読んだ技術書、一般書、漫画で面白かった本をブログに残していこうと思う。一応2~3ヶ月に一度は書くつもりでいる。

技術書

通信・ネットワーク周り

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

マスタリングTCP/IP 入門編 第5版

最早私が説明するまでもない、コンピュータ通信技術入門の大名著。ある論文の紹介をする際、何度も読み返し、その度にわかりやすい説明に感銘を受けた。

アプリケーション層しか触らないような人でも読むべき。というかコンピュータに関わる技術者はみんな読むべき。

改訂三版 802.11高速無線LAN教科書

改訂三版 802.11高速無線LAN教科書 (インプレス標準教科書シリーズ)

改訂三版 802.11高速無線LAN教科書 (インプレス標準教科書シリーズ)

研究の参考に教授に勧められた本。発売が2008年ということで802.11nまでの情報しか乗ってないが、802.11x系の無線通信フレームのフォーマットについて、くどいほど詳しく書いてある。TCP/IPを一定程度理解した人間が、Wifi周りの勉強をする時はまず最初に読んで、間違いないと思う。早く.11ac対応版出て。

Linuxネットワークプログラミング

Linuxネットワークプログラミング

Linuxネットワークプログラミング

Linuxネットワークプログラミングバイブル

Linuxネットワークプログラミングバイブル

Linuxネットワークプログラミングバイブル

IPv6に対応した貴重なネットワークプログラミングの入門本。これがなかったら研究室でコードなにも書けないニートになるところだった。

ゲームプログラミング・3DCG関連

コンピュータグラフィックス [改訂新版]

コンピュータグラフィックス [改訂新版]

コンピュータグラフィックス [改訂新版]

CG-ARTS検定の参考書.たかが一民間試験の参考書と侮るなかれ.CGの基本を,カラーの画像や数式を交えながら事細かく説明している.これ一冊で,最新のCG技術を実装できるようになるわけでは無いが,足がかりにはなる.CG特有の専門用語をざっくりと学ぶのにおすすめ.

Effective Modern C++

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

Effective Modern C++ ―C++11/14プログラムを進化させる42項目

モダンなC++を書くのには必携の本.C++を学ぶならこの本から,という入門本の立ち位置ではないのに注意.

C++ポケットリファレンス

[改訂第3版]C++ポケットリファレンス (POCKET REFERENCE)

[改訂第3版]C++ポケットリファレンス (POCKET REFERENCE)

正直これは買わなくてもよい,cpprefjpやらcppreferenceなど,Web上には無料で閲覧できる日本語のC++ライブラリの解説ページが存在するからだ.私は電車の中など,スマホで調べてもいいが,スマホを使うとゲームで遊んでしまいそうな時などによく読んでいる.

一般書

岩田さん 岩田聡はこんなことを話していた。

岩田さん 岩田聡はこんなことを話していた。

岩田さん 岩田聡はこんなことを話していた。

任天堂岩田聡社長の,生前のインタビュー記事をまとめた一冊.課題解決によって人を幸せにすることを最上の幸せとして生きた氏の生き方が詰まっている.

(Linux) UDPを使って一定時間おきに文字列を送信するプログラム

研究室でUDPを使った無線通信の受信側が受信待ち状態にない時のパケットキャプチャをする必要があったので書いた.

劣化iperfにすぎないとか言ってはいけない

#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>

enum { DEST_PORT = 12345 };

void rand_text(int length, char* result) {
    int i, rnd_int;
    const char char_set[] = "01234567890abcdefghijklmnopqrstuvwkyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
    for (i = 0; i < length; i++) {
        result[i] = char_set[rand() % strlen(char_set)];
    }
    result[length] = 0;
}

// ./main 192.168.20.2 7360(1パケットあたりのUDPデータ長[Byte]) 1(何秒間隔で送るか) count(合計何回送るか)
int main(int argc, char* argv[]) {
    if (argc < 5) {
        printf("command line arguments is invalid!\n");
        return 1;
    }
    const char* dest_addr = argv[1];
    const int udp_data_len = atoi(argv[2]);
    const int interval_sec = atoi(argv[3]);
    const int count_max = atoi(argv[4]);

    printf("Send random data(%dByte) %dtimes to %s through UDP to every %d sec\n", udp_data_len, count_max, dest_addr, interval_sec);
    char* str;
    str = (char*)malloc(sizeof(char) * udp_data_len);
    srand(time(NULL));
    rand_text(udp_data_len, str);
    printf("create string strlen(%ld)\n", strlen(str));

    int sock = socket(AF_INET, SOCK_DGRAM, 0);
    struct sockaddr_in addr;
    addr.sin_family = AF_INET;
    addr.sin_port = htons(DEST_PORT);
    addr.sin_addr.s_addr = inet_addr(dest_addr);

    int count = 0;
    while (count < count_max) {
        printf("send %ldByte\n", strlen(str));
        sendto(sock, str, strlen(str), 0, (struct sockaddr*)&addr, sizeof(addr));
        printf("----------\n");
        sleep(interval_sec);
        count++;
    }
    free(str);
    return 0;
}

30分程度で書いた使い捨てのプログラム故,エラー処理が一切書いてないのに注意.

std::bindではデフォルト引数を省略できない

std::bindを使っていたらある問題に遭遇した。

void func(int a){
    std::cout << a * 10 << std::endl;
}
int main(){
    using namespace std::placeholders;
    auto fuction = std::bind(func, _1);
    function(2);
}

std::bindを使ってライブラリで用意されている関数を束縛し別のところで呼び出す、といったことをしたかったのだが、これが何故かコンパイルが通らなかった。(実際は、クラスのメンバ関数をbindした。簡単のためそのコードはここに示す

なぜだろうか……といろいろ調べて回ったところ、とても単純な話だった。

void func(int a, int b = 10){
    std::cout << a * b << std::endl;
}
int main(){
    using namespace std::placeholders;
    auto fuction = std::bind(func, _1);
    function(2);
}

引数1つで呼び出すものと思っていたfunc()関数が、実際は第2引数にintを取る関数で、それにデフォルト引数が設定されていた。じゃあどうやってこの関数を束縛すればいいかというと、bind時、デフォルト引数も明示的に渡せばよい。

// Error!
// auto function = std::bind(func, _1);

// OK!
auto function = std::bind(func, _1, 10);

// call
function(2);

wandbox.org

bindは使うべきではないという話

ここまでbindを使って関数を束縛してきたが、調べてみると、bindはパフォーマンス上に問題があるらしい。

じゃあ代わりに何を使うのかっていうと、みんな大好きラムダ式である。

// Error!
// auto function = std::bind(func, _1);

// OK! (low performance)
auto function = std::bind(func, _1, 10)

// OK! (high performance)
auto function = [=](int _1){ func(_1); };

// call
function(2);

Compiler Explorerbindラムダ式を比較してみると一目瞭然でパフォーマンスにかなり影響することがわかる。

まとめ

bindなんか使わずラムダを使おう。

VSCodeでAsciidocを書く時相対パス入力補完を働かせる

当ブログで何度か紹介しているAsciidocだが,仕様書を書いたり,レポートを書いたりするのに非常に重宝している.

ただ,画像挿入時などで,相対パスの記述をする時に,Path InteliSenceによる入力補完が効かないことがとにかく不便だった.

import {} from './include/hogehoge'  // 引用符で囲む時は補完が効く
image::./img/sample.png     // 引用符で囲んでいないので補完が効かない

この度この問題を解決出来たのでメモ.

Path Autocompleteによるパス入力補完

まず,Path Intelisenceを入れている場合はアンインストールし,代わりに,Path Autocompleteを導入する.

marketplace.visualstudio.com

ただ,Path Autocompleteのデフォルト設定のままでは,目的の入力補完が効かない.

  • Path Autocompleteのデフォルト設定
import {} from './include/hogehoge'  // 引用符で囲む時は補完が効く
image::./img/sample.png     // 引用符で囲んでいないので補完が効かない

Path Autocompleteの設定の内, path-autocomplete.triggerOutsideStringstrueにすると,引用符で囲まなくても入力補完が効くようになる.

しかしながら,これでも,目的の入力補完が効かない.

  • Trigger Outside Strings On
import {} from './include/hogehoge'  // 引用符で囲む時は補完が効く
./img/sample.png            // 引用符で囲まなくても補完が効く
image::./img/sample.png     // ':' と './'の区切りを認識出来ないので補完が効かない.

path-autocomplete.pathSeparators は,文と ./ の区切りを定義している.ここに,: を加えることで, image::./img/sample.png と入力する時も,相対パスの補完が効くようになる.

まとめ

  1. Path Autocompleteを導入
  2. path-autocomplete.triggerOutisideStringsをtrueに設定
  3. path-autocomplete.pathSeparatorsに : を追加
  4. おわり!