Help us understand the problem. What is going on with this article?

クソアプリを作った件

クソアプリ Advent Calendar 2019 に参加したので

ウンコさんのデスクトップアクセサリを作りました!

Windows 10
image.png

macOS Catalina
スクリーンショット 2019-11-27 2.24.59.png

機能

このデスクトップアクセサリでは以下の機能があります。
特に、ダブルクリックでアンサイクロペディアの記事をランダムで見れるのって超便利だよね~!

  • Windows / macOS に対応
  • ダブルクリックでアンサイクロペディアをブラウザに表示
  • ウンコさんに7色の後光
  • アバウト画面ではリップルエフェクト
  • ちゃんと前回の起動位置を覚えて次に起動するときはそこで起動
  • タスクトレイ/ステータスバーに常駐
  • 終了時、水洗で流される!

実行時の動画

Qiita にアップできるように色数を相当落としたので大分汚いですが…

unko.gif

ソース

リポジトリ
https://bitbucket.org/freeonterminate/kusoapp/src/master/

実行ファイル
https://bitbucket.org/freeonterminate/kusoapp/downloads/

このアプリは Delphi で作成しました!
ビルドする場合は Delphi 10.3 Rio Release 3 Community Edition (無料版)でどうぞ!

解説

ほとんど解説するようなことも無く今までの総集編です。

ウンコ大回転
https://qiita.com/pik/items/a0dc426b2089dbce8bc3

FireMonkey で Window Drag
https://qiita.com/pik/items/907641319e4de4d74805

タスクトレイ常駐コンポーネント
https://qiita.com/pik/items/bd3448e2cf0c4c528027

アンサイクロペディア API

アンサイクロペディアも Wikipedia と同じで MediaWiki で作成されているため MediaWiki API を使って情報を取得できます。

MediaWiki API
https://www.mediawiki.org/wiki/API:Main_page/ja

MeidaWiki API については解説記事が多くあるのでここでは詳しくは書きません。
今回は以下のように記事をランダムで取得しています。

https://ja.uncyclopedia.info/api.php?format=json&action=query&rnnamespace=0&list=random

Json Serializer

MediaWiki API は Json と XML で値を返せるのですが今回は Json を採用しました。
何故かというと、Delphi にも Json Serializer があり、これを使うと定型の JSON を非常に簡単に扱えるからです。

例えば上記のアンサイクロペディアの API を叩くと下記の様な JSON が返ってきます。

image.png

その構造をクラスに落とし込みます。

// Json の continue を定義したクラス
TContinue = class
private var
  RnContinue: String;
  Continue: String;
end;

// Json の random 内の要素を定義したクラス
TPage = class
private var
  Id: UInt64;
  NS: UInt64;
  Title: String;
end;

// Json の query を定義したクラス
TQuery = class
private var
  Random: TArray<TPage>;
end;

// 全体を表すクラス
TRandomResult = class
private var
  BatchComplete: String;
  Continue: TContinue;
  Query: TQuery;
end;

ここで取得した Json を TJsonSerializer.Deserialize メソッドに渡すと、クラスが生成され Json の値がセットされます。

var S := TJsonSerializer.Create;
try
  var R := S.Deserialize<TRandomResult>(JSON);
  Writeln(R.Query.Random[0].Title); // 値の取得
finally
  S.DisposeOf;
end;

上記のように簡単にアクセスできます。

まとめ

クソアプリ作るのが一番楽しい!!

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away