Gaming Life

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

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. おわり!

プログラミングに関する調べ物や最新技術のキャッチアップ方法

※注 ポエム要素が高い記事です

最近は研究室で忙しく、ブログに公開できるようなネタになるようなことをやれないでいる。 しかし、月イチ更新は守りたい → じゃあプログラミングを始めた頃の自分が知りたかった情報を書こう → プログラマーってどうやって最新技術を追いかけて、わからなかったことを調べているんだ、と当時考えていたことを思い出す

というわけで、今の自分が実践している、プログラミングに関する調べ方、最新技術のキャッチアップ方法をつらづらと書いていく。

Google検索

まずはここから。どんなときも、わからないことがあったらGoogleに聞けば大体解決する。しかしながら、ここ最近のプログラミング関連のワードの、Google日本語検索の上位に出てくる記事は くだらないゴミ記事 正しい情報が書かれていないモノが増えてしまい、求めている、正確な情報には簡単にたどり着けなくなっている(特にPythonとか酷い)。あまりにも酷いサイトは、ブラウザの拡張機能で検索結果に表示されなくするのが吉。(FireFoxユーザの私はPersonal BlockList を使っている)

初学者の内は日本語情報でも十分だが、そのうち、日本語情報では不足するようになる。そういったときは、公式リファレンスや、Stack Overflow、Google英語検索を利用している。英語が読めなくても近年の機械翻訳は相当な精度なので、十分読めている。

書籍

信頼と安心の情報源。古い本だと、最新の環境で使えないことがままあるが、それでも、基礎を抑えるには最良の手。なにか新しい言語、ライブラリに挑戦するときは、まず、書籍を当たるようにしている。

また、特に買う予定の本もないのに本屋に行く事も続けている。何か行き詰まっていたり、求めている機能を提供してくれるソフトが見当たらなかったりした時、本屋に行くと答えがあったりする。そして買う予定のなかった本を買って財布が薄くなる。

はてなブックマーク

Qiitaやら、ITMediaやら、engadgetやら、各サイトそれぞれ見にいくってのも一つの手ではあるが、毎日全部見るというのは、現実的には難しい。私は、代わりにはてブテクノロジーカテゴリのトレンド を一通り見ている。 トレンドに上がっている中で、気になる情報があればそのサイトに飛んでみるし、タイトルだけ見ておくだけでも、最新トレンドを知(った気にな)ることができる。

Twitter

その分野の第一人者とも言えるような人をフォローし、 TweetDeck でその人の全ツイートを追っかける、みたいなストーカー的ムーブができる。真似しないほうがいい。

最近、ハマっているのは、エラーに悩まされていたり、ソフトの使い方がわからなかったときに、Google検索の前に、Twitter検索で調べるということ。「Python リスト」みたいなざっくりした検索ワードだと、なんの役にも立たないが、エラー番号等、詳細なキーワードで検索すると、Google検索するより早く解決することがある。

興味のある技術分野に関わる人々を沢山フォローすると、TLを眺めているだけで有益な情報が集まってくる。

デメリットはTwitterにハマりすぎて、作業が疎かになりがちなこと。(そしてこれが最近の悩みでもある)

まとめ

こういって調べ事をしていると、最初の内は何のことかわからないワードだらけだが、継続は力なり。いずれ理解できる日が来る。そして1理解すると10理解できない事が生まれ、またそれを調べる。プログラマーとはそうやって永遠に終わりのない調べ物をし続ける生き物なのだなぁとつくづく思う近頃。これからも続けていきたい。