◯◯◯◯ソフト開発日誌

日々の出来事を殴り書き

ロート製薬の定期購入を解約したい

突然ですが皆さんはスキンケアをされているでしょうか。 最近は男性でもスキンケアをする人が増えているらしく、かく言う私もその一人です。

私がスキンケアを初めたのは去年の6月あたりだったでしょうか。 本題と少しズレますが写真があるのでせっかくですし比較してみましょう。

~Before~

続きを読む

Lenovo Yoga Tab 13を買いました

うっひょ~~~~~~~!いくつになっても新しい端末を触るのは心躍るものです。以前母親の誕生日プレゼントで、下位機種の「Yoga Tab 11」を購入してから薄っすらと欲しい気持ちがあったのですが、ついに購入してしまいました。

ちなみに、この端末が発売されたのは2021年で現在では生産が終了してます。後継機もないこんな型落ち機種を何故買うのか、そう思った皆様にこの機種の素晴らしさをお伝えしたいと思います。

1. デザイン

なんといってもこのデザイン!円柱がくっついたような独自のフォルムからは、縦持ちのことなど一切考慮しないという強い意志を感じます。この円柱部分の左右に端子があるのも美しい...背面のファブリック素材も高級感がありますね。(ケースつけたら見えませんが)

また、Yoga Tabには端末にキックスタンドが搭載されており、ケースなしでも自立させることができます。ケースのスタンドって角度が調節できなくてしっくりこないことが多いのですが、このキックスタンドは自由に調節が可能でとても気持ちがいいです。180°回転するので、フックにぶら下げることもでき、その自由度は圧倒的と言えます。

手持ちの4世代 iPad Air と比較。13インチなので一回り大きいですね。

画面が角丸じゃないのも好感度高。

2. GPSなし、背面カメラなし

これは人によるところではあるのですが、私はかなり好きな点です。GPSを搭載していない端末は珍しくないと思いますが、Yoga Tab 13はなんと背面カメラすらオミットしています。(11には背面カメラがあります)

なぜカメラがないことが嬉しいのかと言うと、私はタブレット端末で写真を取らないからです。だってスマホのほうが持ち運びしやすいんだから、写真もスマホで十分ですよね。であれば、不要な部分をオミットしてコストカットしてくれたほうがお財布が喜びます。

私は6万円で購入したのですが、定価は10万円らしいです。10万と聞くと少し悩みますね...

3. HDMI「入力」

昨今のモバイル端末では画面を外部ディスプレイに出力する機能を持つものが多くあります。しかし、「入力」する機能を持った端末はどれほどあるでしょうか。

何を隠そう、Yoga Tab 13はmicro HDMI入力端子が搭載されています。画面をミラーリングするアプリを使えば解決する話ではありますが、わざわざそこまでするほどではないかな...という私にとってこの機能はとても魅力的です。

早速今度帰省したときの在宅勤務で活用させていただきます。

 

ちなみに映像入力ができる端末が他にあるか調べたところ、「LAVIE Tab T14」がヒットしました。定価はなんと14万円。たっか...

 

イマイチなところ

持ち上げてばかりではフェアじゃないので、不満点も書いておきます。

一番大きいのはストレージが128GBかつ、SDカードスロットが無いことです。自分はゲーム用途でも使うつもりなのでせめて256GBは欲しかった。

あと欲を言えば指紋認証も欲しかったけど、顔認証があるのでまぁ良いでしょう。

余談

紹介の中で書いたのですが私はすでにiPadを持っています。普通の人間ならタブレットなんて1台あれば十分ですが、2台目を購入したのには2つ理由があります。

1つは布団の中でソシャゲを二窓したかったから。...さすがにそのためだけに6万は払えません。

そして肝心の2つ目は...

 

 

 

 

 

ペイントソフト開発のためじゃ~~~~~!

私も今の今まで信じていなかったのですが、なんとQtはAndroid/iOSアプリにも対応しています。モバイル環境におけるQtの情報はどれもQMLばかりだったので無理だと思ったのですが、まさかのC++ソースコード(ほとんど)そのままでAndroid版がビルドできました。

iPad持ってるならiOS開発すればいいじゃん、とお思いかもしれませんが、私は私用のMacBookを持っていないのでiOS開発ができないのです。おのれApple

もともとPC用しか作るつもりがなかったのですが、この前コミケに行ってサークル参加をしたくなった結果、実機で展示するならノーパソよりタブレットのほうがかっこいいよな!となったのがきっかけです。

なので、最近はAndroid対応ばかりしてます。とっても楽しい。ペイントソフトそのものの進捗はお察しのとおりです。

夏コミ行ってきました

8月11日から2日間開催のコミックマーケット104に行ってきました。一般参加で今回が初めてだったんですが、噂に違わぬ人の多さでした。あれでコロナ前より少ないって言うんだから恐ろしい。。。

 

一日目

午後入場のリストバンドを事前に買っていたので、12:30からの入場。時間通りに現地については良いものの、そこから室内に入るまでは40分くらい外をデスマーチすることになりました。

この日はTwitter(X)でフォローしている人の新刊を買いながら、大体のホールを回りました。現地にいたのは3~4時間くらいだったかな。お陰でこの日の夜は筋肉痛が痛かったです。

二日目

この日が本命で午前入場で挑みました。入場10分前くらいについたんですが、列が動くまで40分くらいかかりました。潮風があった分一日目より涼しかった気がします。

欲しかったるいせんと先生の新刊セットと既刊全部買えたんで大満足。情報・評論島や同人ソフト島は歩いてて楽しかったですね。

 

感想

俺もサークル参加してぇ~~~~!夏コミはあつすぎるから冬のほうが良いんだけど、日程がね。。。

ペイントソフトの制作進捗をまとめて一冊出したいなぁ。

クラステンプレート版 std::same_as の作り方

std::same_asのクラステンプレート版が作れないかな~とネットを調べてたら、簡単なやり方を見つけたのでメモ。

std::same_asって何?

std::same_asとはc++20で導入されたコンセプトの一つです。
コンセプトというのは一言で言うならテンプレートパラメータで渡せる型を制限するための言語仕様です。
例えば、TestというクラステンプレートのテンプレートパラメータをBaseクラスの派生クラスのみにしたい場合は、以下のようなコードを書きます。

#include <concepts>

class Base {};

template <std::derived_from<Base> Type>
class Test {};

std::same_asは任意の型が特定の型と同じかどうかを表します。
当然、任意の型が特定のクラステンプレートと同じかどうかを判定するのには使えません。

材料

ジェネリックラムダのテンプレート構文

cpprefjp.github.io

実装

#include <iostream>
#include <concepts>

template <class Type>
class Test {};

concept IsTestClass = requires(T v) {
  []<class T>(Test<T>) {}(v);
};

int main()
{
  std::cout << IsTestClass<int> << std::endl; // 0
  std::cout << IsTestClass<Test<int>> << std::endl; // 1
}

おしまい

ペイントソフト開発進捗 ~7月~

今やっていること

現状の画面

最近はリソース周りのシステムの実装を進めています。
ここで言うリソースというのはカラーパレットやブラシプリセットなどの素材のことを指します。
画面真ん中にはリソースの管理を行う「Resource Tree」ドックとカラーパレットの編集を行う「Color Palette」ドックを表示しています。
進捗としてはリソース管理に関してはファイルの作成、削除ができるくらいにはなっていてもうそろそろ一区切りつきそうなところに来ています。

リソース周りで実現したいこと

今作っているペイントソフトではリソース周りに関して以下の3つのことをやりたいと考えています。

  • ファイル入出力処理の非同期化
  • 更新されたリソースの自動保存
  • リソースをプロジェクトファイルに保存可能にする

ファイル入出力処理の非同期化

これはモダンなソフトウェアにおいては必要不可欠な項目ですね。
ストレージへのアクセスは実行時の環境に大きく左右される処理なので、メインスレッド上でファイルの読み書きを行うのはUIのレスポンスが遅れることに繋がります。
それらの処理を非同期化することでユーザビリティの向上を図ります。

更新されたリソースの自動保存

ソフトウェアは人が作っている以上バグの発生は避けられず、場合によってはプログラムが強制終了することもあります。
そのような問題が発生してもユーザーへの不利益を最小限にする方法として、データを定期的に保存するのは有効な手段と言えます。

リソースをプロジェクトファイルに保存可能にする

こちらは私が一番やりたかったことで、開発の進捗を狂わせる一番の難所です。
私は趣味で絵を描くことがあるのですが、そのフローの中で再利用可能な素材を作成することがあります。
それは例を上げると、キャラの色をカラーパレットに保存するとか、同じ画像を複数配置するためにブラシプリセットを作成する、といったものです。
そこで私が常々感じていたのは、素材の保存場所がストレージ上しかないことへの不満感でした。
というのもこれらの素材は作成したときに描いていた絵でしか使わないものが多々あり、それらがストレージ上に残って以降も参照できる状態になると、定期的に削除する必要があり不便では?と思ったためです。
(ただし、私自身はそこまで素材を作成する方ではないので、かなり憶測が入っています。)
その対応として、素材をストレージに保存する以外にもプロジェクトファイルに含めることもできれば、素材を作成することへの心理的ハードルを下げることができると考えています。

実装の話

では、これら3つの要件をどのように実装しているか少し解説して今回は終わります。
設計としてはMVCアーキテクチャに基づいていて、Viewにまで触れると話が長くなってしまうので省略します。

UML

Model層

  • StorageResourceStructure
    • ストレージ上のリソースの構造を表すクラス
    • 木構造や各リソースの名前などの情報を保持するのみで、リソースのデータそのものには関与しない
    • そのため、リソースファイルのフォルダ構造はStorageResourceStructureの構造とは一致しない
    • このクラスのデータは1つのファイルにシリアライズされる
  • StorageResourceNodeとその派生クラス
    • リソース一つを表すノード
    • 各ノードにはUUIDが割り当てられている
  • StorageResourceNodeTag
    • お気に入りなどのタグ付けを管理するクラス
    • タグの名前などの情報や、タグが登録されたノードのIDのリストを保持する
  • ResourceNodeとその派生クラス
    • リソースのデータを表すクラス
    • 派生クラスはカラーパレットやブラシプリセットなど多岐にわたる
  • ResourceFactory
    • リソースクラスのインスタンスを作成するための基底クラス
    • リソース周りのクラスはライブラリとして切り分けたので、任意のリソースクラスを扱えるようにインターフェースを提供する

Controller層

  • StorageResourceManager
    • ストレージ周りのクラスを管理するクラス
  • StorageResourceCacheStackStorageResourceCache
    • ストレージから読み取ったデータを管理するためのクラス
    • キャパシティを設けることで利用しなくなったデータを自動で開放する
  • StorageResourceTaskThreadStorageResourceTaskの派生クラス
    • ストレージアクセスを行うためのスレッドとそのタスククラス
  • StorageResourceSaveScheduler
    • リソースの保存を一定間隔で行うためのクラス
    • キャッシュデータの変更通知を受け取るとStorageResourceTask_SaveCacheを発行する
    • 変更通知はResourceNodeに関数を設け、StorageResourceCacheStorageResourceCacheStackを経由して通知される

クラスの構成としてはこんな感じになります。
もともとはResourceNodeStorageResourceNodeは同一の基底クラスから派生する設計で進めていたのですが、自分の脳のキャパシティを超えてしまったので分けることにしました。
正直この設計で進めて良いのか不安な気持ちもあるのですが、まぁリリースしない限りは好きなだけいじっていいよね。
いい加減ブラシツールとか選択ツールの実装も進めないとなので、一区切りついたらその辺りをやっていきます。
できれば月一くらいで更新していきたいものです。

Qt-ADSでVisualStudioみたいなアプリを作ろう

はじめに

今回は私がペイントソフト開発で使用しているライブラリの一つであるQt Advanced Docking System(以下Qt-ADS)について紹介します。
こちらのライブラリはQtでドックウィジェットを実装するためのQDockWidgetの機能をより強化したライブラリです。
「ドックウィジェット」というのはVisual Studioで言うところの「出力」や「プロパティ」といった、ユーザーが任意で配置をカスタマイズできるウィンドウを指します。
Qtには標準でそれに近いことができるQDockWidgetというクラスがあるのですが、機能的に未熟な点が多いため、このライブラリを使用することでそれを改善することができます。

Visual Studioの画面

QDockWidgetの不満点

Qt-ADSの機能を紹介する前にQt標準のQDockWidgetがどういったものか見せておきます。
ここでは例としてQt公式のQDockWidgetを利用したサンプルプロジェクトを使用します。
興味がない方は読み飛ばしてもらって構いません。

Dock Widgets Example

実装について気になる方はこちらのページに解説があるため御覧ください。
アプリとしてはメールのテンプレートを構築する機能が備わっており、「Customers」や「Paragraphs」がドックウィジェットに該当します。
結論から書くとQDockWidgetにはフローティング中ドックウィジェットに関して以下の問題があります。

Windowsのスナップ機能が効かない

Windowsのスナップ機能が効かない
メインウィンドウから独立したドックウィジェットは上記のようになるのですが、このウィンドウには最小化や最大化といったボタンは存在しておらず、Windowsのスナップ機能(画面端に持っていったときに隙間なくレイアウトされるやつ)が動作しません。
デュアルディスプレイ環境では画面いっぱいに使いたいこともあるので、そういったユーザーからするとストレスになります。

ドックウィジェット同士をドッキングできない

もう一つの不満点としてメインウィンドウから独立したドックウィジェット同士をドッキングできないというものもあります。
この仕様の問題点としては、ウィンドウの移動やリサイズを一つ一つ行う必要があり、手間がかかるといったものが挙げられます。

Qt-ADSの機能

それでは本題です。Qt-ADSでは上記2つの問題のほか様々なエンハンスが行われています。
本当はQDockWidgetのサンプルコードを修正するのが望ましいのですが、面倒なのでこちらも公式のサンプルコードを使用します。

AdvancedDockingSystemDemo

この画面だけでもタブにアイコンが表示されていたり、アクティブなウィンドウがハイライトされていることがわかります。
そして注目すべきはドックウィジェットのレイアウトを変更するときのこのUI...

VisualStudioじゃん!
何を隠そうこのライブラリを使えばVisualStudioのUIに近い機能を簡単に実装できてしまうのです。

ライブラリとしての質も高く、様々なプロジェクトに導入実績があります。
ライセンスはQtと同じLGPLなのでOSSでなくとも採用ができます。
気になる導入手順ですが、CMakeでビルドできるので詳細は省かせてください。

github.com

QtCreatorのClang-Tidyをカスタマイズしてコーディングを効率化しよう

目次

はじめに

突然ですが皆さんはコーディングにどのエディタを使っているでしょうか。
私はメインがQtCreatorでたまにVSCodeを使っています。
Qtユーザーしか使っていない印象ですが、良いところがたくさんあるのでこの記事ではその一つを紹介します。
メインはClang-Tidyの話なのでQtCreatorに興味がない方もお付き合いいただけると嬉しい。

Clang-Tidyって何?

Clang-TidyはC/C++用の静的解析ツールです。
これを使うとプログラムのエラーやスタイル違反、ベストプラクティスの指摘などコードの質を上げることができます。 昔のQtCreatorでは構文解析にClangは使っていなかったのですが、いつからかClangが使われるようになりCPUリソースを馬鹿食いモダンなC++も正確に構文解析できるようになりました。
Clang-Tidyにはチェック項目が数多くあり、QtCreatorではそれらをカスタマイズすることができるので、手順を以下に紹介します。

Clang-Tidyの設定手順

Qt Creatorのバージョンは13.0.0を使用しています。

  1. [編集] > [Preferences...] > [解析] > [Clang Tools] > [Run Options] > [Diagnostic configuration] から[診断設定]のダイアログを開きます
  2. ビルトインの設定を右上の[コピー...]から複製します
  3. あとは下の[Clang-Tidy Checks]のタブから有効にしたい項目にチェックを入れるだけです

modernize-use-trailing-return-typeをONにしよう

チェックを入れるだけ、と言われても数が多すぎて何が使える項目なのか見当がつかないと思います。(かくいう私もほとんど知りません)
そこで今回はmodernize-use-trailing-return-typeを紹介します。
ここからの内容は前回の記事の補足にもなるので良ければこちらもどうぞ。 rough-paint.hatenablog.com

前回の記事では戻り値型の後置記法の話を書いたのですが、以下の問題を挙げました。

Q.IDEの自動生成が対応していない
Q.タイプ数増えるから嫌
Q.既存の実装を書き換えるのダルい

これに対する私の回答は「Clang-Tidyで後から一括で書き換える」です。
Clang-Tidyは一部の内容についてはコードを直してくれる機能があります。
ちょっと力技ですが、楽なのでauto->を直書きするよりもこっちを使うことが多いです。
QtCreatorでこの設定を有効にすると以下のようになります。

Before After

警告も出してくれるので一目でわかるのも嬉しい。
左クリック > [Analize Current File with Clang-Tidy] を実行して表示される画面から、[Select Fixits] > [Apply Fixits]を押すことでコードを直してくれます。

ここではQtCreatorでのやり方を紹介しましたが、Visual StudioVSCodeでも使えるようなので、みんなも使ってみよう。