カンテラの光の下で

dNaga392's memorandom

【SQL】SQLを書く際に便利なWebツール

SQL 文を書く際に、「おおっ!これ便利!」と感じたツールを紹介します。

随時追加予定ですので、ご推薦などありましたらコメントにバシバシ送ってください!₍₍(ง˘ω˘)ว⁾⁾

  • 構文チェッカ
    • EverSQL Validator
  • フォーマッタ
    • SQLフォーマッターFor WEB
続きを読む

【C++】Windowsのバージョン情報を取得する

要点

  • C++Windowsのバージョン情報を取得します。
  • Windows 固有のライブラリ ntdll.dll の RtlGetVersion 関数を使います。
  • 内部バージョンが取得できるので、ユーザー向け表示にはひと手間必要です。

説明

Windows のバージョン情報を取得する方法はいくつかありますが、その一つが ntdll.dllRtlGetVersion 関数を使う方法です。

この方法は、マニフェストファイルなど設定ファイルが不要なため、実行の準備が少なくてすむという利点があります。

実際には次の手順で行います。

  1. ntdll.dll を利用するため、 GetModuleHandle 関数でモジュールのハンドルを取得します。
  2. RtlGetVersion を使うため、GetProcAddress 関数で ntdll.dll のモジュールハンドルから関数のアドレスを取得します。
  3. RtlGetVersion を用いて、OS のバージョン情報を取得します。

この方法で得られるバージョン情報は、RTL_OSVERSIONINFOW 構造体として取得されます。

構造体のメンバである dwMajorVersion および dwMinorVersion に、OSの内部バージョンが格納されるので、どのOSなのかは次の表に従って判断します。

dwMajorVersion dwMinorVersion
Windows 10 10 0
Windows 8.1 6 3
Windows 8 6 2
Windows 7 6 1
Windows Vista 6 0

実装例

#include <ntstatus.h>  // RtlGetVersion 関数の戻り値となる STATUS_SUCCESS の定義を使用するため
#include <windows.h>   // GetModuleHandle など、Windows特有の処理を使用するため
#include <iostream>    // std::cout など、実行結果を画面に表示するため

/// DLL 内の関数ポインタを定義
typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW lpVersionInformation);

/*!
    \brief OSのバージョンを取得。
*/
RTL_OSVERSIONINFOW GetOsVersion()
{
    auto versionInfo = RTL_OSVERSIONINFOW{sizeof(RTL_OSVERSIONINFOW), 0, 0, 0, 0, 0};

    // 1. `ntdll.dll` を利用するため、 `GetModuleHandle` 関数でモジュールのハンドルを取得します。
    auto hModule = GetModuleHandle(L"ntdll.dll");
    if (!hModule)
    {
        std::cerr << "GetModuleHandle Error" << std::endl;
        return versionInfo;
    }

    // 2. `RtlGetVersion` を使うため、`GetProcAddress` 関数で `ntdll.dll` のモジュールハンドルから関数のアドレスを取得します。
    auto RtlGetVersion = (RtlGetVersionPtr)GetProcAddress(hModule, "RtlGetVersion");
    if (!RtlGetVersion)
    {
        std::cerr << "GetProcAddress Error" << std::endl;
        return versionInfo;
    }

    // 3. `RtlGetVersion` を用いて、OS のバージョン情報を取得します。
    if (RtlGetVersion(&versionInfo) != STATUS_SUCCESS)
    {
        std::cerr << "RtlGetVersion Error" << std::endl;
        return versionInfo;
    }

    return versionInfo;
}

int main(int /*argc*/, char** /*argv*/)
{
    auto version = GetOsVersion();
    std::cout << "OSVersionInfoSize: " << version.dwOSVersionInfoSize << std::endl;
    std::cout << "MajorVersion: " << version.dwMajorVersion << std::endl;
    std::cout << "MinorVersion: " << version.dwMinorVersion << std::endl;
    std::cout << "BuildNumber: " << version.dwBuildNumber << std::endl;
    std::cout << "PlatformId: " << version.dwPlatformId << std::endl;
    std::cout << "CSDVersion: " << version.szCSDVersion << std::endl;
    return 0;
}

実行した結果がこちら。winver の結果とも合っていることが分かりますね。

f:id:dNaga392:20200513233442p:plain

参考資料

【C++】std::sort とラムダ式を使ったカスタムソート

クラスや構造体のソートには、標準ライブラリ <algorithm>std::sort を使う方法があります。 Qt でも同様の qSort がありましたが、 std::sort に置き換えることが推奨されています。

次の例は、座標情報のリストに対して、第1ソート条件にX座標の逆順、第2ソート条件にY軸の正順を適用したものです。

    QList<QPoint> points({{0, 4}, {2, 2}, {1, 3}, {3, 1}});
    std::sort(points.begin(), points.end(),
              [](const QPoint& p, const QPoint& q) -> bool {
                  if (p.x() == q.x())
                  {
                      return p.y() < q.y();
                  }
                  return p.x() > q.x();
              });
    qDebug() << points;  // => (QPoint(3,1), QPoint(2,2), QPoint(1,3), QPoint(0,4))

std::sort は昇順でソートされます。

第一引数と第二引数は、それぞれコンテナの開始と終了のイテレータです。

第三引数は bool cmp(const T &a, const T &b); と等価なラムダ式であり、operator< と同じ意味を持ちます。 つまり、上の例では p < q となるならば true、そうでなければ false となります。

Sort it Color Balls 3D

Sort it Color Balls 3D

  • 発売日: 2020/02/13
  • メディア: アプリ

コーディングのケーススタイルまとめ

コーディングにおけるケーススタイル(Case Style)とは、一つまたは複数の単語で命名する場合に、どのような表記で命名するかのスタイルです。

一般に採用されているケーススタイルは、おおむね次の3種類です。

呼称 単語の区切り
🐪 Camel case (単語の先頭が大文字) theWorldIsYourOyster
🐍 Snake case _(アンダースコア) the_world_is_your_oyster
🥙 Kebab case -(ハイフン) the-world-is-your-oyster

これらをベースにして、条件を強めたスタイルも存在します。 数学でいう「一般形」と「特殊形」の関係にあたります。1

呼称 条件
🐪 Upper camel case 先頭文字が大文字 TheWorldIsYourOyster
🐪 Lower camel case 先頭文字が小文字 theWorldIsYourOyster
🐍 Scaling snake case すべて大文字 THE_WORLD_IS_YOUR_OYSTER
🥙 Train case すべて大文字 THE-WORLD-IS-YOUR-OYSTER

ファイル名などでは、単語の区切りがなかったり、スペースを利用した命名もみられます。

呼称 単語の区切り 条件
📝 Upper case (なし) すべて大文字 THEWORLDISYOUROYSTER
📝 Lower case (なし) すべて小文字 theworldisyouroyster
📝 All Upper case (半角スペース) すべて大文字 THE WORLD IS YOUR OYSTER
📝 All Lower case (半角スペース) すべて小文字 the world is your oyster

参考資料

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年ぶり(?)に大学時代の友人に出会いました。 彼はロシア研究の修士課程にいるようで、短い時間ではありましたが久しぶりに話ができてよかったです。