カンテラの光の下で

dNaga392's memorandom

PlantUML で ER 図を描く

PlantUML の公式ドキュメントにはER図の例がありませんが、クラス図の応用で描くことができるようです。

次の記事にてその紹介があります。

qiita.com

次は記事を参考にした作成例です:

@startuml
!define MAIN_ENTITY #E2EFDA-C6E0B4
!define MAIN_ENTITY_2 #FCE4D6-F8CBAD

!define MASTER_MARK_COLOR AAFFAA
!define TRANSACTION_MARK_COLOR FFAA00

package "社内サービス用データベース" as db <<Database>> {
    entity "departments - 部門" as departments <<M,MASTER_MARK_COLOR>> {
        + id:int [PK] - 部門ID
        --
        * name:nvarchar(32) - 部門名
    }

    entity "employees - 社員" as employees <<M,MASTER_MARK_COLOR>> {
        + no:int [PK] - 社員番号
        --
        # department_id:int [FK] - 部門ID
        * name:nvarchar(32) - 氏名
    }

    entity "conference_reservations - 会議室予約" as conference_reservations <<T,TRANSACTION_MARK_COLOR>> MAIN_ENTITY {
        + id:bigint [PK] - 会議室予約ID
        --
        # employee_no:int [FK] - 社員番号
        * start_date:datetime - 開始日時
        * end_date:datetime - 終了日時
        * content:nvarchar(256) - 内容
    }

    entity "plans - 予定" as plans <<T,TRANSACTION_MARK_COLOR>> MAIN_ENTITY {
        + id:bigint [PK] - 予定ID
        --
        # employee_no:int [FK] - 社員番号
        * date:date - 日付
        * content:nvarchar(256) - 予定内容
    }
}

plans                   -do- employees
conference_reservations -up- employees
employees               -do- departments

@enduml

f:id:dNaga392:20190509132650p:plain

参考資料

「ジオ展2019」アフターレポート

先週の4月20日(金)、「ジオ展2019」が開催されました。

すでに一週間が経ち、GWが始まってしまいましたが、非常に新鮮で楽しい経験だったので記事としました。

ジオ展とは

「地図位置情報関連の企業やサービスが一堂に出展するミニ展示会」です。

今年2019年は「ナビタイムジャパン」にて開催されました。

www.geoten.org

ジオ展の雰囲気

ジオ展でのアピール方法は大きく次の2つがありました。

  • ブース出展
  • プレゼンテーション登壇

ほとんどの参加団体は、この両方をされていました。

以降では、個人的に印象に残った発表を紹介します。

青山学院大学 古橋研究室

最も強い衝撃を受けたのが、こちらのプレゼンテーション登壇でした。

研究室長たる古橋教授が「4年間ジオな学部生を育ててみてわかったこと」というタイトルで、 指導戦略と指導計画および成果を紹介されました。

その綿密さボリューム圧倒され、未知の手法の紹介に驚き、 古橋先生のトークの熱量もあって聴き入っていました。

思い出せる範囲でも、次のお話をされていました。

  • 目標は地図が作れ、国内外のコミュニティにコミットできる人材育成
  • 情報の整理・分析・解釈の訓練として、グラフィックレコーディングを実践
  • Mapillary や MAPS.ME などアプリを通じた位置情報の貢献
  • ドローンによる空撮と動画編集による空間情報を活かした映像作成
  • フィールドワークでは、各自マイテント・マイ寝袋を所持
  • OpenStreatMap や GitHub OSS へのコミュニティでの活躍

某有名大学でなんとなくやって卒業した私には、 (古橋先生の頑張りが大きいと思いますが)青学すごい…ここまで違うのか...と強く感じさせられました。

ただ、社会人にできない内容ではないので、いくつかは取り入れて自分の力にしていきたいです。

特にGitHubを通じたコミュニケーションなど、現代的なツールを積極的に活用した手法が示されたことは、 この分野の成長性やレベルの高さを感じた良い講演でした。

株式会社MIERUNE

OpenStreetMapを活用した地図サービスを提供している札幌の企業です。

独自の配色と付加情報のバランスがよく、非常に使いやすい地図を作成していました。

個人的には壁に投影したいくらい良い仕上がりなので、機会があれば活用したいです。

mierune.co.jp

NAVAGIS

Google Map API 活用した地理情報サービスを展開している外資企業です。

類似地形の抽出サービスや空港のリアルタイム情報サービスなど様々なソリューションを実現しています。

なによりインタラクティブな変化がカッコよく、登壇後に展示ブースでお話を聞かせてもらいました。

www.navagis.com

ジオ展実行委員会

ジオ展の企画・運営を行っておりますジオ展実行委員会です。

プレゼンテーション登壇にて、実行委員会の小山文彦さんによる「勝手に選ぶ2018-2019 ジオ界隈10大ニュース」が発表されました。

こちらの内容は IMPRESS でも紹介されています。

internet.watch.impress.co.jp

なかでも好きだったネタは第10位の島根と鳥取を厚生省が取り違えた事件。 この事件の説明で、小山さんは島根と鳥取が同じ県だった時期が存在したことに言及されました。

県境や行政区分の歴史が好きな私としては、徳島と高知もそうだったよね1、と深くうなずきながら聞いていました。

第5位の「NEVER LOST AGAIN」も実に興味をそそられました。内容はこれまでのGoogle マップの軌跡を描いたもので、スタートアップのストーリーになっているようです。

NEVER LOST AGAIN グーグルマップ誕生 (世界を変えた地図)

NEVER LOST AGAIN グーグルマップ誕生 (世界を変えた地図)

会場受付ではジオ展の特製Tシャツも販売しており、1着購入しました。なかなかおもしろい切り方の世界地図で気に入っています。 来年もぜひまた行きたいです。


  1. 島根・鳥取島根県として、徳島・高知は高知県として存在した時期があり、2組とも2016年参院選から合区となりました。

「ソ連製の世界地図 “レッド・アトラス”を読む」に行きました

`昨日2019/04/16に、下北沢の本屋B&Bにてトークイベントが開催されました。

bookandbeer.com

イベントでは、ユーリィ・イズムィコの名でも有名な軍事アナリストの小泉悠さんと、「大砲とスタンプ」を連載している漫画家の速水螺旋人さんが登壇されました。

地図好きの筆者の書籍とソ連に詳しいお二方ということで、若干のズレは感じましたが、大変楽しく興味深いお話を聞かせていただきました。

特にソ連やロシアの文化や習俗などは、普段日本にいるだけでは知りえないことも多いです。 小泉さんと速水さんは本業ということもあり、そのあたりの内容をわかりやすく面白くお話しいただきました。

一部を挙げますと、徴兵より前に軍事的な基礎知識・経験を得られる青少年のための組織があること、 グーグルマップのようにヤンデックス(Yandex)という企業がウェブマップサービスを実施していること、 空挺部隊の日など様々な職業の日が設定されていること、などがありました。

お二方は、書籍タイトルのせいもあり、陰謀や計略などより扇情的な内容を予想していて、 (良くも悪くも)裏切られたような気持ちになったとも話されていました。

レッド・アトラス 恐るべきソ連の世界地図

レッド・アトラス 恐るべきソ連の世界地図

イベントは前後編に分けて、休憩をはさんで開催されました。 前編では上に挙げたお話の他、書籍の感想と解説をされていました。

後半では本書の日本語版に収録されている東京の地図の広域地図を投影し、これを説明・解説されておりました。 朝霞や大泉学園から池袋、松戸から小岩と書籍では分割されていた地図が一つの大きな地図として映されたのは圧巻でした。

全体として楽しい時間を過ごせたのですが、あえて最もよかったところを挙げると、 前後編にかけて読み方と本来の地名との違いを解説いただいたところが大変興味深かったです。

私自身はロシア語が読めないので、おそらくあるだろうと思っていた誤植や解釈違いを 専門家の方々にひとつひとつなぞって説明いただいたのはすごくうれしかったです。

これは私事ですが、奇遇にも7年ぶり(?)に大学時代の友人に出会いました。 彼はロシア研究の修士課程にいるようで、短い時間ではありましたが久しぶりに話ができてよかったです。

「レッド・アトラス」を読んで

地図は人間が生み出した最も美しい世界の描き方のひとつである。

そう思うほど地図好きな私がこの本を手にするのに時間はかかりませんでした。

レッド・アトラス 恐るべきソ連の世界地図

レッド・アトラス 恐るべきソ連の世界地図

本書はソ連時代の地図を多数収録し、比較考察され様々な観点から地図を説明しています。

しかしながら、体系的にブレることはなく地図の情報を余すことなく示しています。

本書は冒頭にて「推理小説」を自称しています。これは、実際には推理小説ではないのですが、筆者にとって地図がまさにそのような存在であると伝えてくれます。

特に私が気に入っているのが、序文の次の一節です。

 いまはGPS機能付きスマートフォンやカーナビが当たり前の時代。どの道を進めばいいか、どこで渋滞が発生し、スピード違反の取締装置がどこに設置されているか、音声で教えてくれる。もはや紙の地図は時代遅れかもしれない。
 それでも歴史的な意義と、その美しさは少しも色あせないのだ。

この一節だけで筆者にとって地図とは、ただの道具ではなく、さながら美術品のような存在であることが伝わってきます。

実際に筆者であるジョン・デイビス氏らが収集した地図は、現在や近代とも異なる冷戦期に作成されたもので、建物や道路を事細かに描く緻密さと必要な事実が全体に散りばれられて記された情報量が、なにより現在のものとは明らかに違うアンティーク調の色づかいは大変美しいものばかりです。

中学生のころに地図帳や社会の資料集を読んでいた時のような、わくわくした気持ちで読むことができました。

当然ながら現実を記した地図ですので、現在発行されている地図やインターネットで活用できる地図と比べることもできます。

本書の日本語版では特別付記として、ソ連で作成された東京の地図が収録されています。 東京の当時の情景が、ロシア語という異国の言葉によって描かれているそれはミステリアスな雰囲気があり、魅了されます。

地図好き、特に西洋の地図が好きな方であればきっと気に入ると思います。

2019/04/16には、下北沢の本屋B&Bにてトークイベントも開催されます。

bookandbeer.com

特定の地図について識者の方がトークする場はそうそうありませんので、ぜひとも足を運びたいところです。

【GitHub】issue template url ジェネレータを作った【GitLab】

Vue.jp を使って、GitHubとGitLabに対応する issue template url ジェネレータを作りました。

dnaga392.github.io

dnaga392.gitlab.io

GitLabを仕事で使っていて、issueのテンプレートが欲かったので作ってみました。

GitLabでのテンプレートには他の手法もあるのですが、URLでワンクリックというissue作成時の手軽さに魅力を感じました。

ひとまず自分が欲しい機能は実現できたので、あとは利用者がいたり作り込みたくなったりしたら更新すると思います。

Vue.js

普段Web開発をしておらず何かフレームワークを使ってみたかったことから、周りに利用者が多かったこととイケてる感じがしたのでVue.jsを使ってみました。

v-modelv-bind の使い勝手がよくて、なるほど人気が出るわけだと実感しました。動的ページ最高!

基礎から学ぶ Vue.js

基礎から学ぶ Vue.js

もう一つのテンプレート機能

GitLab で issue のテンプレートを実現する方法は次の2つを見つけました。

  1. URLにパラメータを指定する方法
  2. テンプレートファイルをリポジトリに配置する方法

次は方法1の参考記事と公式ドキュメントです。

qiita.com

Create a new Issue | GitLab

次は方法2の参考記事と公式ドキュメントです。

qiita.com

Description templates | GitLab

それぞれの特徴は次の通りです。

  1. URLにパラメータを指定する方法
    • README に URL を書いておけばワンクリックでテンプレートが展開できる
    • URL化するために文字列をエンコーディングする必要がある(テンプレートの編集コストが高い)
    • テンプレートの範囲はTitle、Descriptionなど
  2. テンプレートファイルをリポジトリに配置する方法
    • markdownを既定の位置に配置すればOK
    • issue 作成画面のテンプレート一覧からコンボボックスで選択する(1よりはissue作成の手間がある)
    • テンプレートの範囲はDescriptionのみ

どちらも多少なりリポジトリに干渉するので、好みで選ぶところがあるかと思います。

今回は作成コストと記述可能な範囲の広さから方法1を採用し、そのデメリットを軽減するためにツールを作った次第です。

Links

GitHub/GitLab それぞれのリポジトリです。

参考資料

【Qt】QSignalMapperは まいそうされます。

Image from Gyazo

画像のような複数のUIの操作に応じて一つのUIを更新する処理は QSignalMapper が担ってきました。

しかし Qt5 では QSignalMapper は非推奨とされ、 ラムダ式 への置き換えが推奨されます。

そこで、実際にどのように置き換えていくかをここに記録します。

従来の QSignalMapper を用いた手法

    // legacy style signal mapping
    mapper = new QSignalMapper(this);
    QVector<QPushButton *> foobarButtons({
        ui.fooButton,
        ui.barButton,
        ui.foobarButton,
    });
    for (auto const &button : foobarButtons)
    {
        connect(button, SIGNAL(clicked()), mapper, SLOT(map()));
        mapper->setMapping(button, button->text());
    }
    connect(mapper, SIGNAL(mapped(QString)), this, SLOT(foobarLabelUpdate(QString)));

処理の流れは次の通りです:

  1. QSignalMapper を作成する。
  2. sender(button) から QSignalMapper へ connect をする。
  3. QSignalMapper::map() が実行されるとき、 QSignalMapper から送出する内容を登録する。
  4. QSignalMapper::mappped() から送出される内容を受け取る slot (foobarLabelUpdate) へ connect する。

前提として必要なことは2つ、 QSignalMapper のインスタンス該当の操作に対応できるSlot そして、くじけない心です。

世界樹の迷宮II 諸王の聖杯(特典無し)

世界樹の迷宮II 諸王の聖杯(特典無し)

ラムダ式を用いた手法

    // qt5 style signal mapping
    QVector<QPushButton *> fizzbuzzButtons({
        ui.fizzButton,
        ui.buzzButton,
        ui.fizzbuzzButton,
    });
    for (auto const &button : fizzbuzzButtons)
    {
        auto const &text = button->text();
        connect(button, &QPushButton::clicked, [=] { ui.fizzbuzzLabel->setText(text); });
    }

処理の流れは次の通りです:

  1. sender(button) からラムダ式へ connect をする。

もう少し言うと、[=] ではじまるラムダ式なので送出していた内容を変数textに格納するという準備をしています。

これは比較のためにQStringで揃えているだけですので、buttonそのものを渡すことでより簡潔に書けます。

    for (auto const &button : fizzbuzzButtons)
    {
        connect(button, &QPushButton::clicked, [=] { ui.fizzbuzzLabel->setText(button->text()); });
    }

非常にシンプルになりました。 これなら気軽に書いていけますね。

参考資料

【Rust】Rustチュートリアルをはじめました

いまイケてる言語と噂の[要出典]Rustを触ってみました。

www.rust-lang.org

まだチュートリアル第2節の「数当てゲームをプログラムする」までしか進んでないですが、 よさが感じられたのでここで記録しておきます(チュートリアルは付録込みで21節まであります)。

比較的容易な開発環境の構築手順

プログラミングをする場合、何をやるにも最初は環境構築の壁が存在します。

Rust の場合、LinuxMacならコマンド一発な感じです。 ただ、Windowsの場合は次の依存関係があります。

記事執筆時点では、Microsoft Visual C++ Build Tools 2019 が最新です(Rust公式のインストールページにも反映されてますね)。

これはインストールページに書いてあることですが、僕みたいにうっかり読み飛ばす人は注意が必要です。

Install - Rust programming language

読みやすいチュートリアル

公式はバリバリ英語ですが、チュートリアルは日本語訳が存在します。

https://doc.rust-jp.rs/book/second-edition/

Rust のチュートリアルは、いわゆる教科書やリファレンスのような形式だったものとは異なります。

しかし、実際に動くコードを動かして、なぜそのように動くのかを一行一行、一つ一つ説明しています。 それは既知の方には退屈なくらい丁寧に述べられています。

これはどんな些細なことであってもキチンと解決させるという Rustacean (Rust開発者)の性格が見えるような気がします。

私はここが気に入ったのですが、一方で関連技術についてはあまり深く説明してないまま進めているので、 分かりやすいかは評価が分かれるだろうと感じます。

build と check が分かれている

Rust はコンパイルを実行する cargo build のほか、コンパイルできることを確かめる cargo check というコマンドを提供しています。

他のコンパイルを必要とする言語では、 コンパイルの実行でコンパイルできることを確かめています。 これは実行可能ファイルができるまでを指示するため、しばしば時間を要します。

Rust でも cargo build を実行すると同様のことは発生します。 しかし、 cargo check によりその悩みはいくらか軽減されます。

実際に開発していると、コンパイルできることを確かめたくなることがよくあるので、 cargo check は嬉しい機能です。

コンパイラのエラーメッセージ

Hello world でうっかり文字列の終了記号(")を付けそびれたとします。

fn main() {
    println!("Hello, world!);
}

Rust の場合、この異常を次のように関連する複数行を提示してくれます。

f:id:dNaga392:20190408232923p:plain

同様のバグコードが C++ の場合は次のようになります。関連するすべてのエラーを出しているので比べるとうるさく感じますね。

f:id:dNaga392:20190408233020p:plain

このため、親切さでは Rust がよさそうに感じます。

一方で、必ずしもわかりやすくはないとも感じました。 次のエラーメッセージでは match guess.cmp(&secret_number) の行が示されています。

f:id:dNaga392:20190408234908p:plain

しかし実際に問題があったのはそれより前の行でした。

        // 本当は次のように match をつける
        // let guess: u32 = match guess.trim().parse() {
        let guess: u32 = guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {  // この行がエラーメッセージに出ていた
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        }

このあたりは C++ など他言語とおなじように慣れが必要かもしれません(勘が働くというやつですね)。

最後に

良いことと同じくらい注意したことを書いていますが、 Rust がかなり好きになりました。

なにより、公式ガイドが読んでわくわくする仕上がりになっているのがとても大きいです。

まだまだ最初の段階ですので、楽しんで読み進めて書いていきたいです。