<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>KDE on Rebel Zhang のブログ</title>
        <link>https://rebel1725.codeberg.page/blog/ja/tags/kde/</link>
        <description>Recent content in KDE on Rebel Zhang のブログ</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja-JP</language>
        <managingEditor>rebel1725@tilde.club (Rebel Zhang)</managingEditor>
        <webMaster>rebel1725@tilde.club (Rebel Zhang)</webMaster>
        <lastBuildDate>Sun, 09 Aug 2026 20:49:33 +0800</lastBuildDate><atom:link href="https://rebel1725.codeberg.page/blog/ja/tags/kde/index.xml" rel="self" type="application/rss+xml" /><item>
            <title>GammaRay を使って QtWidgets アプリケーション内の機能の実装箇所を見つける</title>
            <link>https://rebel1725.codeberg.page/blog/ja/post/find-the-implementation-of-a-function-in-a-qtwidgets-application-using-gammaray/</link>
            <pubDate>Sun, 09 Aug 2026 20:49:33 +0800</pubDate><author>rebel1725@tilde.club (Rebel Zhang)</author>
            <guid>https://rebel1725.codeberg.page/blog/ja/post/find-the-implementation-of-a-function-in-a-qtwidgets-application-using-gammaray/</guid>
            <description>&lt;p&gt;フリーソフトウェアの自由 1 と自由 3 を実践したり、フリーソフトウェアコミュニティに貢献したりするには、ある機能に関連するソースコードを変更して、ソフトウェアに別の動作をさせる必要があります。しかし、私たちはプロジェクトに慣れていないため、変更すべきソースコードがどこにあるのか分からないことがよくあります。&lt;code&gt;grep -R &amp;lt;some-user-facing-string&amp;gt; .&lt;/code&gt; を試してみてうまく見つかることもありますが、うまくいかない場合もあります（&lt;a class=&#34;link&#34; href=&#34;../the-very-beginning-of-my-journey-contributing-to-the-free-software-community-existing-projects&#34; &gt;前回の記事&lt;/a&gt; を参照）。そのような場合には、高度なソフトウェア内省ツールが必要です。Qt で開発されたソフトウェアには、&lt;a class=&#34;link&#34; href=&#34;https://www.kdab.com/software-technologies/developer-tools/gammaray/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;GammaRay&lt;/a&gt; という強力なユーティリティがあります。&lt;/p&gt;&#xA;&lt;p&gt;GammaRay を使うには、まずインストールする必要があります。ディストリビューションの公式リポジトリからインストールしたソフトウェアを内省したい場合は、GammaRay もそこからインストールしてください。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;# apt install gammaray&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;KDE アプリケーションの開発に &lt;code&gt;kde-builder&lt;/code&gt; を使っている場合は、&lt;code&gt;~/.config/kde-builder.yaml&lt;/code&gt; に次の行を追加します。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;project gammaray:&#xA;  repository: https://github.com/KDAB/GammaRay.git&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;そして、作業ディレクトリにビルドします。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;$ kde-builder gammaray&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;GammaRay を使うには、内省したいアプリケーションを起動しておく必要があります。次に GammaRay を起動し、一覧からアプリケーションを選びます。&lt;/p&gt;&#xA;&lt;p&gt;例として、Gwenview のスライドショーのロジックを見つけてみましょう。Gwenview を開き、画像を開くと、メニューに &lt;code&gt;Start Slideshow&lt;/code&gt; オプションが表示されます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;a screenshot of Gwenview&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;390px&#34; data-flex-grow=&#34;162&#34; height=&#34;952&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://rebel1725.codeberg.page/images/pic_20260809_001.png&#34; srcset=&#34;https://rebel1725.codeberg.page/blog/pic_20260809_001_9260183633641420788_hu_365916c355e33157.png 800w, https://rebel1725.codeberg.page/images/pic_20260809_001.png 1548w&#34; width=&#34;1548&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;Widgets の一覧を一つずつ見ていくと、&lt;code&gt;0x13bda470&lt;/code&gt; が内省したいメニューであり、その中に &lt;code&gt;Start Slideshow&lt;/code&gt; オプションが含まれていることが分かります。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;GammaRay QtWidgets introspection&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;402px&#34; data-flex-grow=&#34;167&#34; height=&#34;1002&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://rebel1725.codeberg.page/images/pic_20260809_002.png&#34; srcset=&#34;https://rebel1725.codeberg.page/blog/pic_20260809_002_4293608996693979957_hu_43bd5ee0e43f111b.png 800w, https://rebel1725.codeberg.page/blog/pic_20260809_002_4293608996693979957_hu_c573a96130bd048e.png 1600w, https://rebel1725.codeberg.page/images/pic_20260809_002.png 1681w&#34; width=&#34;1681&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;そして、Connections タブに &lt;code&gt;toggle_slideshow&lt;/code&gt; QAction があるのが見えます。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Connections&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;304px&#34; data-flex-grow=&#34;126&#34; height=&#34;604&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://rebel1725.codeberg.page/images/pic_20260809_003.png&#34; width=&#34;767&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; なら、そのような QAction がどこにあるのかを教えてくれます。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;~/kde/src/gwenview$ grep -R toggle_slideshow&#xA;app/fullscreencontent.cpp:    addAction(QStringLiteral(&amp;#34;toggle_slideshow&amp;#34;));&#xA;app/gwenviewui.rc:        &amp;lt;Action name=&amp;#34;toggle_slideshow&amp;#34; /&amp;gt;&#xA;app/mainwindow.cpp:        mToggleSlideShowAction = view-&amp;gt;addAction(QStringLiteral(&amp;#34;toggle_slideshow&amp;#34;), q, &amp;amp;MainWindow::toggleSlideShow);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;お気に入りの IDE、たとえば Qt Creator でプロジェクトを開き、&lt;code&gt;app/mainwindow.cpp&lt;/code&gt; 内の文字列を検索してください。ここで &lt;code&gt;toggle_slideshow&lt;/code&gt; が見つかります。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;        mToggleSlideShowAction = view-&amp;gt;addAction(QStringLiteral(&amp;#34;toggle_slideshow&amp;#34;), q, &amp;amp;MainWindow::toggleSlideShow);&#xA;        q-&amp;gt;updateSlideShowAction();&#xA;        connect(mSlideShow, &amp;amp;SlideShow::stateChanged, q, &amp;amp;MainWindow::updateSlideShowAction);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;次に &lt;code&gt;toggleSlideShow&lt;/code&gt; を検索すると、この関数にたどり着きます。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void MainWindow::toggleSlideShow()&#xA;{&#xA;    if (d-&amp;gt;mSlideShow-&amp;gt;isRunning()) {&#xA;        d-&amp;gt;mSlideShow-&amp;gt;pause();&#xA;    } else {&#xA;        if (!d-&amp;gt;mViewAction-&amp;gt;isChecked()) {&#xA;            d-&amp;gt;mViewAction-&amp;gt;trigger();&#xA;        }&#xA;        if (!d-&amp;gt;mFullScreenAction-&amp;gt;isChecked()) {&#xA;            d-&amp;gt;mFullScreenAction-&amp;gt;trigger();&#xA;        }&#xA;        QList&amp;lt;QUrl&amp;gt; list;&#xA;        for (int pos = 0; pos &amp;lt; d-&amp;gt;mDirModel-&amp;gt;rowCount(); ++pos) {&#xA;            QModelIndex index = d-&amp;gt;mDirModel-&amp;gt;index(pos, 0);&#xA;            KFileItem item = d-&amp;gt;mDirModel-&amp;gt;itemForIndex(index);&#xA;            MimeTypeUtils::Kind kind = MimeTypeUtils::fileItemKind(item);&#xA;            switch (kind) {&#xA;            case MimeTypeUtils::KIND_SVG_IMAGE:&#xA;            case MimeTypeUtils::KIND_RASTER_IMAGE:&#xA;            case MimeTypeUtils::KIND_VIDEO:&#xA;                list &amp;lt;&amp;lt; item.url();&#xA;                break;&#xA;            default:&#xA;                break;&#xA;            }&#xA;        }&#xA;        d-&amp;gt;mSlideShow-&amp;gt;start(list);&#xA;    }&#xA;    updateSlideShowAction();&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;続けて &lt;code&gt;mSlideShow&lt;/code&gt; を検索すると、ここにたどり着きます。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;struct MainWindow::Private {&#xA;    ...&#xA;    SlideShow *mSlideShow = nullptr;&#xA;    ...&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これで &lt;code&gt;d-&amp;gt;mSlideShow&lt;/code&gt; の型が &lt;code&gt;SlideShow *&lt;/code&gt; であることが分かります。&lt;code&gt;SlideShow&lt;/code&gt; という文字列にマウスを重ねると、その型が &lt;code&gt;lib/slideshow.h&lt;/code&gt; で提供されていることが分かります。&lt;/p&gt;&#xA;&lt;p&gt;&lt;img alt=&#34;Qt Creator&#34; class=&#34;gallery-image&#34; data-flex-basis=&#34;271px&#34; data-flex-grow=&#34;112&#34; height=&#34;363&#34; loading=&#34;lazy&#34; sizes=&#34;(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px&#34; src=&#34;https://rebel1725.codeberg.page/images/pic_20260809_004.png&#34; width=&#34;410&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;では、&lt;code&gt;lib/slideshow.cpp&lt;/code&gt; と &lt;code&gt;lib/slideshow.h&lt;/code&gt; を開いて、作業を進めましょう。&lt;/p&gt;&#xA;</description>
        </item><item>
            <title>フリーソフトウェアコミュニティへの私の最初の一歩（既存プロジェクト）</title>
            <link>https://rebel1725.codeberg.page/blog/ja/post/the-very-beginning-of-my-journey-contributing-to-the-free-software-community-existing-projects/</link>
            <pubDate>Sun, 02 Aug 2026 23:18:30 +0800</pubDate><author>rebel1725@tilde.club (Rebel Zhang)</author>
            <guid>https://rebel1725.codeberg.page/blog/ja/post/the-very-beginning-of-my-journey-contributing-to-the-free-software-community-existing-projects/</guid>
            <description>&lt;p&gt;ここ数日、私はフリーソフトウェアコミュニティから受けてきた恩恵に比べると、コミュニティへははるかに少ない貢献しかできていませんでした。これまでの貢献も、&lt;a class=&#34;link&#34; href=&#34;https://codeberg.org/rebel1725/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;小さくてシンプルな個人プロジェクト&lt;/a&gt;や、コード以外の貢献（たとえばいくつかの翻訳、&lt;a class=&#34;link&#34; href=&#34;https://screenshots.debian.net/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Debian Screenshots&lt;/a&gt; への数枚のスクリーンショットのアップロード、そして &lt;a class=&#34;link&#34; href=&#34;https://freeswzhcn.codeberg.page/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Free Software Chinese Site&lt;/a&gt; への記事執筆）に限られていました。この1年ほどで、私は C/C++、Qt、アセンブリ、そして少しの Rust を学びました。そろそろ、フリーソフトウェアコミュニティとフリーソフトウェア運動のために、意味のあることをする時だと思っています。&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;免責事項：これはガイドではありません！私は自分自身の経験を共有するためだけにこの記事を書いています。フリーソフトウェアコミュニティへの貢献方法をより詳しく知るには、関連する文書を参照し、専門家に相談してください。&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;kde-を選んだ理由&#34;&gt;KDE を選んだ理由&#xA;&lt;/h2&gt;&lt;p&gt;当初は postmarketOS への貢献を考えていました。しかし、自分のスキルが必要とされる水準にまったく届いていないと感じたため、比較的簡単なものから始めることにしました。私は C++ と Qt の方により親しみがあるので、コミュニティへの最初の貢献先として KDE を選びました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;気持ち&#34;&gt;気持ち&#xA;&lt;/h2&gt;&lt;p&gt;私のソースコード読解力はあまり高くありません。2025 年の初めごろ、&lt;a class=&#34;link&#34; href=&#34;https://github.com/pdfarranger/pdfarranger&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;PDF Arranger&lt;/a&gt; のソースコードを読もうとして、気分が悪くなるほど圧倒されました。&lt;/p&gt;&#xA;&lt;p&gt;しかし、&lt;a class=&#34;link&#34; href=&#34;../a-brief-introduction-into-reverse-engineering&#34; &gt;リバースエンジニアリングを学ぶ&lt;/a&gt;という経験を通じて、アセンブリコードを読む必要があったおかげで、高水準言語のソースコードを読む力も向上しました。そのため、実際の環境で自分のスキルを鍛えるためにも、きちんとしたフリーソフトウェアへの貢献を試してみるべきだと思いました。&lt;/p&gt;&#xA;&lt;p&gt;ソースツリーを開く前は少し緊張していて、PDF Arranger のソースを読んだときのように、またソースコードに圧倒されるのではないかと不安でした。しかし、友人の &lt;a class=&#34;link&#34; href=&#34;https://blog.i7arch.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;Integral&lt;/a&gt; の励ましのおかげで、その一歩を踏み出す勇気を持てました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;ツール&#34;&gt;ツール&#xA;&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://develop.kde.org/docs/getting-started/building/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;KDE が推奨する開発環境のひとつ&lt;/a&gt;は、最新版の Fedora KDE です。私は Qubes OS を使っているので、スタンドアロンの HVM をすぐに立ち上げ、その中ですべての作業を行うのがとても簡単です。&lt;/p&gt;&#xA;&lt;p&gt;その後、&lt;a class=&#34;link&#34; href=&#34;https://develop.kde.org/docs/getting-started/building/kde-builder-setup/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;KDE 開発者向けの公式ドキュメント&lt;/a&gt;に従って &lt;code&gt;kde-builder&lt;/code&gt; を設定しました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;作業&#34;&gt;作業&#xA;&lt;/h2&gt;&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;KDE の公式 Bugzilla&lt;/a&gt; にある &lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/buglist.cgi?chfield=%5BBug%20creation%5D&amp;amp;chfieldfrom=7d&amp;amp;f1=product&amp;amp;o1=notequals&amp;amp;v1=Spam&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;バグ一覧&lt;/a&gt;をざっと確認しました。&lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/show_bug.cgi?id=523617&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;とても簡単に修正できそうなバグ&lt;/a&gt;に気づきましたが、ソースコードを取得してバイナリをビルドしたあと、最新バージョンの Ark では自分の環境でそのバグを再現できないことが分かりました。&lt;/p&gt;&#xA;&lt;p&gt;そこで再びバグ一覧に戻ると、&lt;a class=&#34;link&#34; href=&#34;https://bugs.kde.org/show_bug.cgi?id=523757&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;&#xA;    &gt;別のバグ&lt;/a&gt;が目に留まりました。それはとても単純そうに見えました。バグ報告に書かれていたシステム環境とソフトウェアのバージョンは私と同じで（Fedora KDE、26.04）、Fedora の公式リポジトリで提供されているアプリケーションでも再現できました。それを確認したあと、ソースコードを取得してビルドしました。&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;~/kde/build/konsole/bin/konsole&lt;/code&gt; というバイナリに対して GDB を起動しました。バグ報告に記載されていた文字列（&lt;code&gt;calt,liga,ss03, ss07,ss09&lt;/code&gt;）を入力欄に貼り付けると、コンソールに次の出力が表示されました。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;The tag name must be exactly 4 characters long!&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;LLM と何度かやり取りした結果、GDB の Python スクリプトを使って、この警告を出力しているソースコード上の行を見つける方法を思いつきました。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;python&#xA;import gdb&#xA;&#xA;TARGET = b&amp;#34;The tag name must be exactly 4 characters long!&amp;#34;&#xA;&#xA;class FilteredWrite(gdb.Breakpoint):&#xA;    def stop(self):&#xA;        fd = int(gdb.parse_and_eval(&amp;#34;$rdi&amp;#34;))&#xA;        if fd not in (1, 2):&#xA;            return False&#xA;&#xA;        buf = int(gdb.parse_and_eval(&amp;#34;$rsi&amp;#34;))&#xA;        count = int(gdb.parse_and_eval(&amp;#34;$rdx&amp;#34;))&#xA;&#xA;        try:&#xA;            data = gdb.selected_inferior().read_memory(buf, count).tobytes()&#xA;        except gdb.MemoryError:&#xA;            return False&#xA;&#xA;        if TARGET in data:&#xA;            gdb.write(&amp;#34;\n=== matched output ===\n&amp;#34;)&#xA;            gdb.write(data.decode(&amp;#34;utf-8&amp;#34;, &amp;#34;replace&amp;#34;) + &amp;#34;\n&amp;#34;)&#xA;            gdb.execute(&amp;#34;bt full&amp;#34;)&#xA;            return True&#xA;&#xA;        return False&#xA;&#xA;FilteredWrite(&amp;#34;write&amp;#34;)&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;GDB セッションのあと、この警告は &lt;code&gt;kwidgetsaddons&lt;/code&gt; の &lt;code&gt;kfontchooser.cpp&lt;/code&gt; から出されていることを確認しました。また、この警告を発生させている関数も見つけました。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;void KFontChooserPrivate::slotFeaturesChanged(const QString &amp;amp;features)&#xA;{&#xA;    m_selectedFont.clearFeatures();&#xA;&#xA;    if (features.isEmpty()) {&#xA;        return;&#xA;    }&#xA;&#xA;    const QStringList rawFeaturesList = features.split(QLatin1Char(&amp;#39;,&amp;#39;), Qt::SkipEmptyParts);&#xA;    for (const QString &amp;amp;feature : rawFeaturesList) {&#xA;        auto f = QStringView(feature).trimmed();&#xA;        if (f.isEmpty()) {&#xA;            continue;&#xA;        }&#xA;        QList&amp;lt;QStringView&amp;gt; parts = f.split(QStringLiteral(&amp;#34;=&amp;#34;), Qt::SkipEmptyParts);&#xA;        if (parts.length() == 2) {&#xA;            const auto tag = QFont::Tag::fromString(parts[0]);&#xA;            bool ok = false;&#xA;            const int number = parts[1].toInt(&amp;amp;ok);&#xA;            if (tag.has_value() &amp;amp;&amp;amp; ok) {&#xA;                m_selectedFont.setFeature(tag.value(), number);&#xA;            }&#xA;        } else if (f.size() &amp;lt;= 4) {&#xA;            const auto tag = QFont::Tag::fromString(feature);&#xA;            if (tag.has_value()) {&#xA;                m_selectedFont.setFeature(tag.value(), 1);&#xA;            }&#xA;        }&#xA;    }&#xA;&#xA;    Q_EMIT q-&amp;gt;fontSelected(m_selectedFont);&#xA;}&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;分割結果がトリミングされていることに気づきました。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;auto f = QStringView(feature).trimmed();&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;しかし、元の、トリミングされていない文字列がそのまま tag として使われていました。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;const auto tag = QFont::Tag::fromString(feature);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;これは開発者のミスだと思われます。問題を修正するには、トリミングされていない文字列をトリミング済みのものに置き換えるだけで十分です。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;const auto tag = QFont::Tag::fromString(f);&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;その後はブランチを作成し、そのブランチに変更をコミットして、マージリクエストを送る段階でした。しかし、Git の経験が限られていたため、次のような問題に遭遇しました。&lt;/p&gt;&#xA;&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;warning: redirecting to https://invent.kde.org/rebellfs/kwidgetsaddons.git/&#xA;Enumerating objects: 21973, done.&#xA;Counting objects: 100% (21973/21973), done.&#xA;Delta compression using up to 4 threads&#xA;Compressing objects: 100% (2790/2790), done.&#xA;Writing objects: 100% (21973/21973), 41.17 MiB | ... KiB/s, done.&#xA;Total 21973 (delta 13428), reused 21374 (delta 12884), pack-reused 0 (from 0)&#xA;remote: Resolving deltas: 100% (13428/13428), done.&#xA;remote: Audit failure - Commit 046e4bb16e60b66070ee4a00c368ca6924db3a08 - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit 046e4bb16e60b66070ee4a00c368ca6924db3a08 - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit c8c7ab3d0e7ca825bbb01d58de005d4d589b12cc - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit c8c7ab3d0e7ca825bbb01d58de005d4d589b12cc - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit 62e5736a1f4afc2d24ef2c4d643a98bc60e6d6cd - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit 62e5736a1f4afc2d24ef2c4d643a98bc60e6d6cd - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit f317243c63620acec15a46c412502e73b9a04e2a - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Audit failure - Commit f317243c63620acec15a46c412502e73b9a04e2a - Email address has an invalid domain : [kde@randomguy3.me.uk](mailto:kde@randomguy3.me.uk)&#xA;remote: Push declined - commits failed audit&#xA;remote: Should the audit failures above mention issues regarding your name, please ensure that your Git username has been set to your full name.&#xA;remote: Please see https://git-scm.com/book/en/v2/Getting-Started-First-Time-Git-Setup for more details on ensuring Git has been fully configured.&#xA;remote: In the event that your full name has been set and is shown above as being rejected, please file a Sysadmin ticket at https://go.kde.org/systickets&#xA;To https://invent.kde.org/rebellfs/kwidgetsaddons&#xA;! [remote rejected]     work/rebel1725/fix523757 -&amp;gt; work/rebel1725/fix523757 (pre-receive hook declined)&#xA;error: failed to push some refs to &amp;#39;https://invent.kde.org/rebellfs/kwidgetsaddons&amp;#39;&#xA;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;最終的には、これは単一ファイルの些細な変更にすぎなかったため、ブラウザ経由でこの修正を提出しました。&lt;/p&gt;&#xA;&lt;h2 id=&#34;結論&#34;&gt;結論&#xA;&lt;/h2&gt;&lt;p&gt;今日、私はフリーソフトウェアコミュニティへの最初の貢献を果たし、新たにフリーソフトウェアの貢献者にもなりました。今後は、もっと多く貢献し、自分の技術をさらに磨き、コミュニティとフリーソフトウェア運動により役立てるようになりたいと思っています。&lt;/p&gt;&#xA;</description>
        </item></channel>
</rss>
