Planet KDE https://planet.kde.org Planet KDE https://planet.kde.org Planet KDE https://planet.kde.org/assets/img/planetkde.png 48 48 Tue, 07 Jul 2020 12:13:48 +0000 https://dilsonguim.github.io/kde/gsoc/2020/07/07/gsoc-week4.html Google Summer of Code 2020 - Week 4 Tue, 07 Jul 2020 12:00:00 +0000 https://dilsonguim.github.io/kde/gsoc/2020/07/07/gsoc-week4.html <p>According to my GSoC proposal, I should be done with the general purpose graph layout capabilities for <a href="https://kde.org/applications/education/org.kde.rocs">Rocs</a> and free to start working on layout algorithms specifically designed to draw trees. This is not the case for a series of reasons, including my decision to write my own implementation of a general purpose force-based graph layout algorithm and failure to anticipate the need for non-functional tests to evaluate the quality of the layouts. I still need to document the functionalities of the plugin and improve the code documentation as well. Besides that, although it is not present in my original purpose, I really want to include the layout algorithm presented in [1], because I have high expectations about the quality of the layouts it can produce.</p> <p>Even though I am not done with this first part, I decided to start working on the layout algorithms for trees. Now that I am more used to the code base and to the precesses used by KDE, I expect to be more productive and finish everything on time.</p> <p>The main motivation for implementing layout algorithms specifically designed for trees is the possibility of exploiting the properties of trees to come up with better layouts. Yesterday, I started studying more about layout algorithms for trees. Most of them are based on a subset of the following ideas:</p> <ul> <li>Select a root node for the tree. This node can be provided by the user or selected automatically.</li> <li>Partition the nodes by their depth in the rooted tree and draw all nodes with the same depth at the same layer (usually a line or a circle).</li> <li>Draw the sub-trees in a recursive way and compose the resulting drawings to get the complete layout.</li> </ul> <p>All of these ideas are related to the structure of trees. In order to improve my intuition about them, I wrote an experimental implementation based on the first two ideas above. The application of this implementation to a tree with 15 nodes generated the following result:</p> <p><img src="//dilsonguim.github.io/website/assets/images/2020-07-07-tree.png" alt="Tree layout."></p> <p>By taking advantage of the properties of trees, even simple solutions such as my one-day experimental implementation can guarantee some desirable layout properties that the general purpose force-based layout algorithm can not. For instance, it guarantees that there are no intersections between edges or between nodes. The force-based layout algorithm I implemented can generate layouts with pairs of edges that intersect even when applied to trees.</p> <p>[1] R. Davidson and D. Harel. Drawing graphs nicely using simulated annealing.ACM Transactions on Graphics, 15(4):301–331, 1996.</p> Dilson Guimarães (dilsonguim) tag:blogger.com,1999:blog-6222342164368075135.post-2547158868796311341 Cantor - Plots handling improvments Tue, 07 Jul 2020 07:22:00 +0000 https://cantorgsoc2020.blogspot.com/2020/07/cantor-plots-handling-improvments.html <div dir="ltr" style="text-align: left;" trbidi="on">Hello everyone, <br><br>this is the third post about the progress in my GSoC project and I want to present new changes in the handling of the external packages in Cantor.<br>The biggest changes done recently happened for Python. We now properly support integrated plots created with matplotlib.<br>Cantor intercepts the creation of plots and embedds the result into its worksheet.<br>This also works if multiple plots are created in one step the order of plots is preserved.<br>Also, text results between plots are also supported.<br><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-nZ1mIz1fdAw/XwQfNqg_U_I/AAAAAAAAAsQ/PoAdmTdkPewGiUCwIVL1UilJEOnty63wgCLcBGAsYHQ/s1600/PythonMultiplePlots.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1026" data-original-width="1600" height="256" src="//1.bp.blogspot.com/-nZ1mIz1fdAw/XwQfNqg_U_I/AAAAAAAAAsQ/PoAdmTdkPewGiUCwIVL1UilJEOnty63wgCLcBGAsYHQ/s400/PythonMultiplePlots.png" width="400"></a></div> <br>Besides matplotlib, we also properly handle Plot.ly - another popular graphing library for Python and R. This package has some requirements<br>that have to be fulfilled first. The user is notified about these requirements in case they are not fulfilled.<br><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-371xpn0-U3w/XwQfXJVJHiI/AAAAAAAAAsU/DJnYrSczeuU2w0aVkQqRyQWSw2aSGLcuACLcBGAsYHQ/s1600/PythonPlotly.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1129" data-original-width="1600" height="281" src="//1.bp.blogspot.com/-371xpn0-U3w/XwQfXJVJHiI/AAAAAAAAAsU/DJnYrSczeuU2w0aVkQqRyQWSw2aSGLcuACLcBGAsYHQ/s400/PythonPlotly.png" width="400"></a></div> <br>Similar implementation was also done for Julia and Octave, but to a smaller extent.<br>Though many preparational changes were done in the code for this, the only visible result for the user <br>are at the moment the new messages about unfulfited requirements of graphing packages.<br>Especially for Julia this is imprortannt now since for graphing the package GR was hard-coded in the past and there was no notification to the user<br>if this package was not installed and it was not immediately clear to the user why the creation of plots fails.<br>With this improvements Cantor is doing the next steps to become more user friendly.<br><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-J93nfhzquSo/XwQfdaRLdVI/AAAAAAAAAsY/CtgVvwHB2HoHtyHHuWnNXJD-cTU1mt1HgCLcBGAsYHQ/s1600/JuliaGrWarning.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="906" data-original-width="1399" height="258" src="//1.bp.blogspot.com/-J93nfhzquSo/XwQfdaRLdVI/AAAAAAAAAsY/CtgVvwHB2HoHtyHHuWnNXJD-cTU1mt1HgCLcBGAsYHQ/s400/JuliaGrWarning.png" width="400"></a></div> <br>There is another important change - the settings for graphing packages become dynamic.<br>The user can now change them on the fly without having to restart the session.<br><br><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" width="600" height="460" src="//www.blogger.com/video.g?token=AD6v5dy8aifg__WV-t2xuzSNn1VyAlksmtM7Du0xotY1m5D1OjQ3FoTX2zmGiRrb7dlAAmjPZi5AfysRZODEVpmgig" class="b-hbp-video b-uploaded" frameborder="0"></iframe></div> <br>Also, the plot menu was extended. Julia and Python now can produce code for multiple packages - the prefered package can be choosen in settings.<br><br><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen="allowfullscreen" webkitallowfullscreen="webkitallowfullscreen" mozallowfullscreen="mozallowfullscreen" width="600" height="460" src="//www.blogger.com/video.g?token=AD6v5dyi95YaW_zKMv2EcLng8sYvDWcpBtk5wgerSvjHh-HB1g9CYVKXfFVkh4KAn3hwoEyOhOBC_VXvICgiRanEog" class="b-hbp-video b-uploaded" frameborder="0"></iframe></div> <br>In the next post I plan to show how the usability of Cantor panels is going to be improved. </div> Cantor GSoC 2020 tag:blogger.com,1999:blog-1708421134682889292.post-8187614072867949874 Week #5 Status Report [Preset Editor MyPaint Engine] Mon, 06 Jul 2020 11:21:00 +0000 https://ashwindhakaita.blogspot.com/2020/07/week-5-status-report-preset-editor.html <div dir="ltr" style="text-align: left;" trbidi="on"> <div>The second month of Google Summer of Code has been started. This month my prime focus would be to improve the mypaint brush engine, fix some issues and also I aim to add a better preset editor than the one provided by other painting applications.</div> <div><br></div>Last week I worked solely on the preset editor for the newly available MyPaint brush engine in Krita.<br><div>This was in accordance to the mockup as was presented in the proposal and contained only the very basic 3-4 settings for the engine. All most all of the applications with MyPaint integration just provide some 3-4 basic settings for the engine. Though the library does provide api to add all of the mentioned settings.</div> <div><br></div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-mFEcMa95rE0/XwMFzYFXY8I/AAAAAAAACjw/Dj6pW0hovoIYGBVpG2VaK_-pN8Z90zXgQCLcBGAsYHQ/s1600/preset_editor.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="440" data-original-width="671" src="//1.bp.blogspot.com/-mFEcMa95rE0/XwMFzYFXY8I/AAAAAAAACjw/Dj6pW0hovoIYGBVpG2VaK_-pN8Z90zXgQCLcBGAsYHQ/s1600/preset_editor.png"></a></td></tr> <tr><td class="tr-caption" style="text-align: center;">Preset Editor</td></tr> </tbody></table> <div><br></div> <div>This week I will look at how shall I add more settings and customization options to it. I have some thing like this in mind. Though as per the standard procedure will discuss it with Boud first.</div> <div><br></div> <table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody> <tr><td style="text-align: center;"><a href="https://1.bp.blogspot.com/-NGnZpV70P20/XwMHWzbkurI/AAAAAAAACj8/qYopi3Rsfj0sPDQZiD26aMUhV6lFBXRPQCLcBGAsYHQ/s1600/preset_editor_2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" data-original-height="456" data-original-width="562" src="//1.bp.blogspot.com/-NGnZpV70P20/XwMHWzbkurI/AAAAAAAACj8/qYopi3Rsfj0sPDQZiD26aMUhV6lFBXRPQCLcBGAsYHQ/s1600/preset_editor_2.png"></a></td></tr> <tr><td class="tr-caption" style="text-align: center;">Mockup for Preset Editor with All the Settings</td></tr> </tbody></table> <div><br></div> <div>This week I shall focus on this and will try to add as much settings as possible in the widget.</div> <div><br></div> <div>Till then,</div> <div>Good Bye :)</div> <div><br></div> <div><br></div> </div> Ashwin Dhakaita http://prasunka.github.io/posts/gsoc2020-wrapping-phase-1 GSoC'20 progress : Phase I Sun, 05 Jul 2020 18:30:00 +0000 http://prasunka.github.io/posts/gsoc2020-wrapping-phase-1 Wrapping up the first phase of Google Summer of Code Prasun Kumar http://pointieststick.com/?p=5371 This week in KDE: A little bit of everything Sat, 04 Jul 2020 05:03:41 +0000 https://pointieststick.com/2020/07/03/this-week-in-kde-a-little-bit-of-everything/ <p><a href="http://blog.davidedmundson.co.uk/blog/modern-process-management-on-the-desktop/">A lot of exciting things are happening behind the scenes these days</a>, but in terms of what landed this week, we focused on bugfixing–including a few nice high DPI fixes–and also got a few nice Dolphin and Konsole features.</p> <h2>New Features</h2> <p>Dolphin <a href="https://bugs.kde.org/show_bug.cgi?id=407004">now has a new “Copy Location” menu item</a> (Yann Holme-Nielsen, Dolphin 20.08.0):</p> <div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img data-attachment-id="5396" data-permalink="https://pointieststick.com/screenshot_20200701_124217/" data-orig-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg" data-orig-size="1084,1511" data-comments-opened="1" data-image-meta='&#123;"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}' data-image-title="screenshot_20200701_124217" data-image-description="" data-medium-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg?w=215" data-large-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg?w=735" src="//pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg?w=735" alt="" class="wp-image-5396" width="374" height="521" srcset="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg?w=735 735w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg?w=374 374w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg?w=748 748w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg?w=108 108w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_124217.jpeg?w=215 215w" sizes="(max-width: 374px) 100vw, 374px"></figure></div> <p>…<a href="https://invent.kde.org/plasma/kwin/-/merge_requests/70">And so does Konsole</a>! (Tomaz Canabrava, Konsole 20.08):</p> <div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img data-attachment-id="5403" data-permalink="https://pointieststick.com/screenshot_20200702_142348/" data-orig-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg" data-orig-size="1036,1441" data-comments-opened="1" data-image-meta='&#123;"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}' data-image-title="screenshot_20200702_142348" data-image-description="" data-medium-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg?w=216" data-large-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg?w=736" src="//pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg?w=736" alt="" class="wp-image-5403" width="377" height="524" srcset="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg?w=736 736w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg?w=377 377w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg?w=754 754w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg?w=108 108w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_142348.jpeg?w=216 216w" sizes="(max-width: 377px) 100vw, 377px"></figure></div> <p>Konsole’s <a href="https://invent.kde.org/utilities/konsole/-/merge_requests/92">split view headers can now be optionally disabled, and the thickness of the separator can be optionally increased</a> (Tomaz Canabrava, Konsole 20.08.0):</p> <div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img data-attachment-id="5408" data-permalink="https://pointieststick.com/screenshot_20200702_143225/" data-orig-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg" data-orig-size="1701,1529" data-comments-opened="1" data-image-meta='&#123;"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}' data-image-title="screenshot_20200702_143225" data-image-description="" data-medium-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=300" data-large-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=1024" src="//pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=1024" alt="" class="wp-image-5408" width="600" height="538" srcset="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=1024 1024w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=600 600w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=1197 1197w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=150 150w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=300 300w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200702_143225.jpeg?w=768 768w" sizes="(max-width: 600px) 100vw, 600px"></figure></div> <h2>Bugfixes &amp; performance Improvements</h2> <p>Various non-default Task Switchers <a href="https://bugs.kde.org/show_bug.cgi?id=422547">now have the right size when using a high DPI scale factor</a> (me: Nate Graham, Plasma 5.18.6 and beyond)</p> <p>Fixed <a href="https://bugs.kde.org/show_bug.cgi?id=421275">various system tray items’ context menus popping up in the wrong location</a> (Konrad Materka, Plasma 5.18.6 and beyond)</p> <p>When using a wallpaper package with multiple sizes (e.g. the default Plasma wallpaper), <a href="https://bugs.kde.org/show_bug.cgi?id=423563">the correct size is now displayed when using a high DPI scale factor or changing screen resolutions</a> (David Edmundson, Plasma 5.19.3)</p> <p>The plasma start-up sound <a href="https://bugs.kde.org/show_bug.cgi?id=422948">is no longer cut off when starting up the computer</a> (David Edmundson, Plasma 5.19.3)</p> <p>The new System Monitor widgets <a href="https://bugs.kde.org/show_bug.cgi?id=423747">now always have the correct text color when using a Plasma theme with a different color scheme from the Application color scheme</a> (Marco Martin, Plasma 5.19.3)</p> <p>System Settings <a href="https://bugs.kde.org/show_bug.cgi?id=422819">no longer crashes when you open the Applications page without any file managers installed</a> (Alex Merry, Plasma 5.19.3)</p> <p>Krunner is now faster to open so <a href="https://bugs.kde.org/show_bug.cgi?id=416145">the text that you type winds up in KRunner rather than in the app below it</a> (David Redondo, Plasma 5.20)</p> <p>When changing the default browser, <a href="https://bugs.kde.org/show_bug.cgi?id=416161">the “default browser” entry visible in Kickoff and the Task Manager by default now automatically updates too</a> (Alexander Lohnau, Plasma 5.20)</p> <p>Dolphin <a href="https://bugs.kde.org/show_bug.cgi?id=423412">can once again execute script files with spaces in the filename or path</a> (David Faure, Frameworks 5.72)</p> <p>Close buttons in Kirigami sheets <a href="https://bugs.kde.org/show_bug.cgi?id=422965">are no longer subtly pixelated some of the time</a> (Nicolas Fella, Kirigami 5.72)</p> <p>Several Breeze icons which had subtle pixel mis-alignments that could make them appear blurry <a href="https://bugs.kde.org/show_bug.cgi?id=423727">no longer suffer from this issue</a> (Maksym Hazevych, Frameworks 5.72)</p> <p>When using Qt scaling in Plasma by setting the <code>PLASMA_USE_QT_SCALING=1</code> environment variable, <a href="https://bugs.kde.org/show_bug.cgi?id=407458">windows now minimize to the correct locations in the Task Manager</a> (Marco Martin, Frameworks 5.72)</p> <h2>User Interface Improvements</h2> <p>The System Settings Screen Locking page <a href="https://invent.kde.org/plasma/kscreenlocker/-/merge_requests/3">has been rewritten in QML</a>, which <a href="https://bugs.kde.org/buglist.cgi?component=kcm_screenlocker&amp;list_id=1763833&amp;product=systemsettings&amp;resolution=---">fixes all of the open bugs</a> (David Redondo, Plasma 5.20):</p> <div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img data-attachment-id="5391" data-permalink="https://pointieststick.com/screenshot_20200701_091314/" data-orig-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg" data-orig-size="2786,2039" data-comments-opened="1" data-image-meta='&#123;"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}' data-image-title="screenshot_20200701_091314" data-image-description="" data-medium-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=300" data-large-file="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=1024" src="//pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=1024" alt="" class="wp-image-5391" width="700" height="512" srcset="https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=1024 1024w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=700 700w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=1400 1400w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=150 150w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=300 300w, https://pointieststick.files.wordpress.com/2020/07/screenshot_20200701_091314.jpeg?w=768 768w" sizes="(max-width: 700px) 100vw, 700px"></figure></div> <p>The Keyboard Layout System Tray item <a href="https://invent.kde.org/plasma/kwin/-/merge_requests/76">now always uses a monochrome icon, to better match the style</a> (Nicolas Fella, Plasma 5.20):</p> <div class="wp-block-image is-style-default"><figure class="aligncenter size-large is-resized"><img data-attachment-id="5381" data-permalink="https://pointieststick.com/kl_after/" data-orig-file="https://pointieststick.files.wordpress.com/2020/06/kl_after.png" data-orig-size="387,232" data-comments-opened="1" data-image-meta='&#123;"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}' data-image-title="kl_after" data-image-description="" data-medium-file="https://pointieststick.files.wordpress.com/2020/06/kl_after.png?w=300" data-large-file="https://pointieststick.files.wordpress.com/2020/06/kl_after.png?w=387" src="//pointieststick.files.wordpress.com/2020/06/kl_after.png?w=387" alt="" class="wp-image-5381" width="323" height="194" srcset="https://pointieststick.files.wordpress.com/2020/06/kl_after.png?w=323 323w, https://pointieststick.files.wordpress.com/2020/06/kl_after.png?w=150 150w, https://pointieststick.files.wordpress.com/2020/06/kl_after.png?w=300 300w, https://pointieststick.files.wordpress.com/2020/06/kl_after.png 387w" sizes="(max-width: 323px) 100vw, 323px"></figure></div> <h2>How You Can Help</h2> <p>Have a look at <a href="https://community.kde.org/Get_Involved">https://community.kde.org/Get_Involved</a> to discover ways to help be part of a project that really matters. Each contributor makes a huge difference in KDE; you are not a number or a cog in a machine! You don’t have to already be a programmer, either. I wasn’t when I got started. Try it, you’ll like it! We don’t bite!</p> <p>Finally, consider <a href="https://www.kde.org/community/donations/index.php">making a tax-deductible donation</a> to the <a href="https://ev.kde.org/">KDE e.V. foundation</a>.</p> Nate Graham https://www.amyspark.me/blog/posts/2020/07/03/third-alpha-release Third alpha release of my project Fri, 03 Jul 2020 14:45:00 +0000 https://www.amyspark.me/blog/posts/2020/07/03/third-alpha-release.html <p>I’m glad to announce the third alpha of <a href="https://krita.org/en/item/presenting-our-google-summer-of-code-students/">my GSoC 2020 project</a>. For anyone not in the loop, I’m working on integrating <a href="/blog/posts/2020/05/19/what-is-seexpr-about.html">Disney’s SeExpr expression language as a new type of Fill Layer</a>.</p> <p>Releases are available here:</p> <ul> <li>Windows x64: <a href="https://dump.amyspark.me/krita-4.3.1-alpha-0b32800992-x86_64.zip">https://dump.amyspark.me/krita-4.3.1-alpha-0b32800992-x86_64.zip</a> </li> <li>Linux x64: <a href="https://dump.amyspark.me/krita-4.3.1-alpha-0b32800-x86_64.appimage">https://dump.amyspark.me/krita-4.3.1-alpha-0b32800-x86_64.appimage</a> </li> </ul> <p>Integrity hashes:</p> <pre><code class="language-plaintext" data-lang="plaintext">d5aa5138650c58ac93e16e5eef9e74f81d7eb4d3fa733408cee25e791bb7a3e1 krita-4.3.1-alpha-0b32800-x86_64.appimage 634d1c0dedc96bc8b267f02b5c431245eefde021a1e7b8e6fcdce33f5e62c25a krita-4.3.1-alpha-0b32800992-x86_64.zip</code></pre> <p>In this release, I fixed the following issues:</p> <ul> <li>SeExpr textures use the scRGB color space, which is not supported by Qt’s <code>QColor</code> until 5.12. This makes the conversion to Krita space unbearably slow (thanks Wolthera van Hövell)</li> <li>Refactored SeExpr error reporting to make messages Qt-translatable. <ul> <li><strong>This adds KDE’s ECM to the list of (optional) dependencies of SeExpr.</strong></li> </ul> </li> <li>Error reporting is now available, including highlighting! (thanks Wolthera too for noticing)</li> <li>Configuration is saved and restored when changing between Fill layer types (<a href="https://bugs.kde.org/show_bug.cgi?id=422885">bug 422885</a>, thanks Boudewijn Rempt)</li> <li>Cleaned up SeExpr headers <ul> <li>They are now installed only if used in the UI library itself.</li> </ul> </li> <li>UI labels have extra spacing (thanks Wolthera van Hövell)</li> </ul> <p>Another outstanding issue is SeExpr’s vulnerability to the current <code>LC_NUMERIC</code> locale, due to its use of <code>sscanf</code> and <code>atof</code>. I am sad to announce I won’t be able to change this; the library I wanted to use, <a href="https://github.com/eliaskosunen/scnlib">scn</a> is <a href="https://github.com/eliaskosunen/scnlib/issues/24">itself vulnerable</a> to locale changes.</p> <p>But the most important feature, and final contribution, are <strong>bundleable presets</strong>!</p> <figure class="text-center d-block figure"> <div class="row figure-img"> <div class="col-12 col-md-6"> <img class="img-fluid" src="//www.amyspark.me/assets/posts/2020/07/seexpr-bundle-1.png"> </div> <div class="col-12 col-md-6"> <img class="img-fluid" src="//www.amyspark.me/assets/posts/2020/07/seexpr-bundle-2.png"> </div> </div> </figure> <p>This enables SeExpr scripts to be bundled just like any other resource in Krita. Below you can find a bundle containing all of <a href="https://krita-artists.org/t/procedural-texture-generator-example-and-wishes/7638/8">the example scripts</a> posted by Wolthera on the Krita Artists thread.</p> <figure class="text-center figure"> <img class="figure-img img-fluid" src="//www.amyspark.me/assets/posts/2020/07/seexpr-bundle-3.png"> </figure> <p>Link: <a href="https://dump.amyspark.me/Krita_Artists'_SeExpr_examples.bundle">https://dump.amyspark.me/Krita_Artists'_SeExpr_examples.bundle</a></p> <p>Integrity hash:</p> <pre><code class="language-plaintext" data-lang="plaintext">1e4a1bc6a9b8238cee96dfee9a50e7db903fe7b665758caf731d53c96597dc20 Krita_Artists'_SeExpr_examples.bundle</code></pre> <p>Looking forward to your comments!</p> <p>Cheers,</p> <p>~amyspark <span class="emoji" aria-label=":sparkles_nonconforming:" role="img"><img aria-hidden="true" alt=":sparkles_nonconforming:" title=":sparkles_nonconforming:" style="width: 1em; height: 1em;" src="//www.amyspark.me/assets/static/emoji/sparkles/sparkles_nonconforming.png"></span></p> <p>PS: The Git hash in the files point <a href="https://invent.kde.org/lsegovia/krita/-/commits/amyspark/rebase-T13097-gsoc2020-seexpr/">to a cleaned up branch at my own fork of Krita</a>. I am reviewing options to sync this work back to the main <code>krita/4.3</code> branch.</p> Amyspark https://deepak2431.github.io/GSOC-First-Evaluation GSoC’20 First Evaluation Fri, 03 Jul 2020 00:00:00 +0000 https://deepak2431.github.io/GSOC-First-Evaluation/ <p>Hello everyone,</p> <p>In the last blog, I wrote about my first two weeks on the GSoC period. In this blog, I will write about the activities on which I have worked further to implement multiple datasets.</p> <p>Until now, I have implemented the multiple datasets in the following activities:</p> <ol> <li>Enumeration memory game</li> <li>Addition memory game with Tux and without Tux</li> <li>Subtraction memory game with Tux and without Tux</li> <li>Multiplication memory game with Tux and without Tux</li> </ol> <h3 id="why-multiple-datasets-for-gcompris-activities">Why multiple datasets for GCompris activities?</h3> <p>All of the GCompris activities had a generalized dataset so for some of the age groups like 3-5 yrs the activity were quite difficult to play, while for older age groups the activity were easy. So, multiple datasets helps in resolving this issue and making the activity adaptive for children of all age groups.</p> <h3 id="enumeration-memory-game">Enumeration memory game</h3> <p>In this activity, the child needs to turn the cards to count the images and match with the corresponding number cards. I started my work of implementing multiple datasets to memory activities with this activity. To do this I needed to change the logic of the code to support both the default datasets and the multiple datasets. I made the required changes to the code and after implementing multiple datasets there was an issue in case of just two images so I updated the condition which checks that the resources of images, sounds, texts are enough to load a particular level or not. There is a total of 8 multiple datasets for this activity. <br> Below image shows the dataset screen for Enumeration memory game activity</p> <p><img src="//user-images.githubusercontent.com/66898390/86505756-55edd880-bde6-11ea-86e4-88a3d73ff9aa.png" alt="enumeration-multiple-datasets"></p> <p>After implementing multiple datasets for this activity there was a regression that affected all memory activities as a blank activity config was displayed for activities with no multiple datasets. I fixed this too and pushed the changes to my branch for review. Once I had everything perfectly done and tested, I made a merge request from my working branch so that it could be merged to master.</p> <h3 id="addition-memory-game">Addition memory game</h3> <p>In this activity, the child needs to turn the cards to match an addition and its result, until all the cards are gone. The goal of this activity is to practice addition. After the implementation of multiple datasets for enumeration memory games it’s not that difficult to add multiple datasets for other memory activities as we just need to create different Data.qml files in the resource directory and load the datasets. For this activity we need to use the function getAddTable() implemented in math_util.js and pass the arguments for the respective numbers. In this activity there is a total of 10 multiple datasets. This activity has two mode as a second mode “with Tux” so I have implemented multiple datasets for this too. The dataset content of the activity Addition memory games with Tux is the same as without Tux. Once I have implemented the datasets for both modes, I made a merge request from my working branch.</p> <p>Code of Data.qml file</p> <div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>import GCompris 1.0 import "qrc:/gcompris/src/activities/memory/math_util.js" as Memory Data &#123; objective: qsTr("Addition table of 1.") difficulty: 4 data: [ &#123; // Level 1 columns: 5, rows: 2, texts: Memory.getAddTable(1) } ] } </code></pre></div></div> <p>You can see that the content of the dataset is in json format. And to just add another multiple dataset we need to change the number from 1 to 2 and update the goal. Quite easy to add ten multiple datasets :)<br> Below image shows the dataset screen for Addition memory game activity</p> <p><img src="//user-images.githubusercontent.com/66898390/86506233-25f50400-bdeb-11ea-8e8d-6988a4f397da.png" alt="addition-memory-games"></p> <h3 id="subtraction-memory-game">Subtraction memory game</h3> <p>In this activity, the child needs to turn the cards to match an subtraction and its result, until all the cards are gone. The goal of this activity is to practice subtraction. The datasets implementation procedure is same as for addition memory game just we need to use the getSubTable() function from math_util.js. This activity also have two modes so I have implemented multiple datasets to both mode.<br> Below image shows the dataset screen for Subtraction memory game activity</p> <p><img src="//user-images.githubusercontent.com/66898390/86506339-2a6dec80-bdec-11ea-8885-7609f39b8f48.png" alt="subtraction-memory-games"></p> <h3 id="multiplication-memory-game">Multiplication memory game</h3> <p>In this activity, the child needs to turn the cards to match an multiplication and its result, until all the cards are gone. The goal of this activity to practice multiplication. The dataset implementation procedure is the same as for addition and subtraction memory game just we need to use the getMulTable() function from math_util.js. This activity also have two modes so I have implemented multiple datasets to both mode.<br> Below image shows the datasets screen for Multiplication memory game activity</p> <p><img src="//user-images.githubusercontent.com/66898390/86506381-90f30a80-bdec-11ea-8447-65ef69975833.png" alt="multiplication-memory-games"></p> <h3 id="whats-next">What’s next?</h3> <p>I will further work on the implementation of multiple datasets to division memory games activity and other memory activities. As our project is moving to KDE Gitlab instance. I will be push all of my further work there only on a different git branch for each activity group</p> <p>Regards<br> Deepak Kumar</p> Deepak Kumar https://euroquis.nl//kde/2020/07/03/ksnip KSnip and Spectacle Thu, 02 Jul 2020 22:00:00 +0000 https://euroquis.nl//kde/2020/07/03/ksnip.html <p>I have two screenshot applications installed – <a href="https://github.com/ksnip/ksnip">KSnip</a> and <a href="https://invent.kde.org/graphics/spectacle">Spectacle</a> – because they offer different, and independently useful, functionality. Here’s some notes on what each does well.</p> <blockquote> <p>Spectacle has been in the FreeBSD ports collection for some time now, since it ships as part of the KDE release service.</p> <p>KSnip was recently added to the FreeBSD ports collection: we already had KColorPicker as a dependency for Spectacle, so packaging up the rest of the stack from Damir was a natural next-step.</p> </blockquote> <h2 id="ksnip">KSnip</h2> <p>The <strong>biggest</strong> reason I have for KSnip is the multiple-screenshots-in-tabs feature it has. Like any other document reader, it has tabs and you can switch between them relatively quickly. I use this particularly for keeping track of visual changes while developing Calamares: by screenshotting the Calamares window repeatedly, I can see what changes (for instance, while doing screen-margin tweaks for mobile).</p> <p><img src="//euroquis.nl/img/2020/06/ksnip.png" alt="KSnip in Action" class="inline-image"></p> <p>Switching back-and-forth between the tabs gives me a “pixels moved” sense, and that’s really useful. KSnip’s wide selection of annotation tools – it’s nearly a specialized drawing application – helps, too: I tell people to draw big red arrows on screenshots pointing to problems (because describing things is difficult, and a glaring visual glitch to you may be totally invisible to me).</p> <p>With KSnip, adding detail to a screenshot is child’s play.</p> <p>That’s not to say that KSnip doesn’t have its issues. But a blog post is not a place to complaing about someone else’s Free Software: the issue tracker is (with constructive bug reports, not complaints).</p> <h2 id="spectacle">Spectacle</h2> <p>Spectacle on the other hand integrates more nicely with my Plasma desktop on the whole, can screenshot pop-ups and tooltips and understands weird screen geometry.</p> <p><img src="//euroquis.nl/img/2020/06/spectacle.png" alt="Spectacle shot" class="inline-image"></p> <p>I end up using Spectacle more for the “quick screenshot needed” part of writing blogs, and sometimes for sharing bits of screen where no annotations are needed.</p> <p>With Spectacle, delivering or sharing the screenshot is simple.</p> <blockquote> <p>Overall, I like having two applications that each do their own thing, and do their thing pretty well. Since the <strong>shared</strong> code stack is enormous, each of the two applications is only small: less than 1MB. That’s a small price for specialization.</p> </blockquote> Adriaan de Groot ([ade]) http://blog.davidedmundson.co.uk/?p=240 Bringing modern process management to the desktop Wed, 01 Jul 2020 13:03:58 +0000 http://blog.davidedmundson.co.uk/blog/modern-process-management-on-the-desktop/ <p>A desktop environment's sole role is to connect users to their applications. This includes everything from launching apps to actually displaying apps but also managing them and making sure they run fairly. Everyone is familiar the concept of a "Task manager" (like ksysguard), but over time they haven't kept up with the way applications are being developed or the latest developments from Linux.</p> <h1>The problem</h1> <h2>Managing running processes</h2> <p>There used to be a time where one PID == one "application". The kwrite process represents Kwrite, the firefox process represents Firefox, easy. but this has changed. To pick an extreme example:<br> <strong>Discord in a flatpak is 13 processes!</strong></p> <p>It basically renders our task manager's process view unusable. All the names are random gibberish, trying to kill the application or setting nice levels becomes a guessing game. Parent trees can help, but they only get you so far.</p> <p>It's unusable for me, it's probably unusable for any user and gets in the way of feeling in control of your computer.</p> <p>We need some metadata.</p> <h2>Fair resource distribution</h2> <p>As mentioned above discord in a flatpak is 13 processes. Krita is one process.</p> <ul> <li>One will be straining the CPU because it is a highly sophisticated application doing highly complicated graphic operations</li> <li>One will be straining the CPU because it's written in electron</li> </ul> <p>To a kernel scheduler all it would see are 14 opaque processes. It has no knowledge that they are grouped as two different things. It won't be able to come up with something that's fair.</p> <p>We need some metadata.</p> <p>(caveat: Obviously most proceses are idling, and I've ignored threads for the purposes of making a point, don't write about it)</p> <h2>It's hard to map things</h2> <p>Currently the only metadata of the "application" is on a window. To show a user friendly name and icon in ksysguard (or any other system monitor) we have to fetch a list of all processes, fetch a list of all windows and perform a mashup. Coming up with arbitrary heuristics for handling parent PIDs which is unstable and messy.</p> <p>To give some different real world examples:</p> <ul> <li>In plasma's task manager we show an audio indicator next to the relevant window, we do this by matching PIDs of what's playing audio to the PID of a window. Easy for the simple case... however as soon as we go multi-process we have to track the parent PID, and each "fix" just alternates between one bug and another.</li> <li>With PID namespaces apps can't correctly report client PIDs anymore.</li> <li>We lose information on what "app" we've spawned. We have bug reports where people have two different taskmanager entries for "Firefox" and "Firefox (nightly)" however once the process is spawned that information is lost - the application reports itself as one consistent name and our taskbar gets confused.</li> </ul> <p>We need some metadata.</p> <h1>Solution!</h1> <h2>This is a solved problem!</h2> <p>A modern sysadmin doesn't deal in processes, but cgroups. The cgroup manager (which will be typically systemd) spawns each service as one cgroup. It uses cgroups to know what's running, the kernel can see what things belong together. </p> <p>On the desktop flatpaks will spawn themselves in cgroups so that they can use the relevant namespace features.</p> <p>You're probably already using cgroups. As part of a <a href="https://systemd.io/DESKTOP_ENVIRONMENTS">cross-desktop effort</a> we want to bring cgroups to the entire desktop.</p> <h2>Example</h2> <p>Before and after of our system monitor<br> <a href="http://blog.davidedmundson.co.uk/wp-content/uploads/2020/12/old1.png"><img src="//blog.davidedmundson.co.uk/wp-content/uploads/2020/12/old1.png" alt=""></a></p> <p><a href="http://blog.davidedmundson.co.uk/wp-content/uploads/2020/12/ksysguardqml_apps.png"><img src="//blog.davidedmundson.co.uk/wp-content/uploads/2020/12/ksysguardqml_apps-1024x772.png" alt=""></a></p> <p>Ultimately the same data but way easier to read..</p> <h1>Slices</h1> <p>Another key part of cgroup usage is the concept of slices. Cgroups are based on a heirachical structure, with slices as logical places to split resource usage. We don't adjust resources globally, we adjust resources within our slice, which then provides information to the scheduler.</p> <p><a href="http://blog.davidedmundson.co.uk/wp-content/uploads/2020/12/treepie.png"><img src="//blog.davidedmundson.co.uk/wp-content/uploads/2020/12/treepie.png" alt=""></a></p> <p>Conceptually you can imagine that we just adjust resources within our level of a tree. Then the kernel magically takes care of the rest.</p> <p>More information can be found on slices in this excellent series <a href="https://www.redhat.com/en/blog/world-domination-cgroups-part-2-turning-knobs"> World domination with cgroups</a>.</p> <h2>Default slices</h2> <p>This means we can set up some predefined slices. Within the relevant user slice this will consist shared of</p> <ul> <li>applications</li> <li>the system (kwin/mutter, plasmashell)</li> <li>background services (baloo, tracker)</li> </ul> <p>Each of these slices can be given some default prioritisations and OOM settings out of the box.</p> <h2>Dynamic resource shifting</h2> <p>Now that we are using slices, and only adjusting our relative weight within the slice, we can shift resource priority to the application owning the focused window.</p> <p>This only has any effect if your system is running at full steam from mulitple sources at once, but it can provide a slicker response at no drawback.</p> <h2>Why slice, doesn't nice suffice?</h2> <p>Nice is a single value, global across the entire system. Because of this user processes can only be lowered, but never raised to avoid messing with the system. With slices we're only adjusting relative weight compared to services within our slice. So it's safe to give the user full control within their slice. Any adjustments to an application, won't impact system services or other users.</p> <p>It also doesn't conflict with nice values set by the application explicitly. If we set kdevelop to have greater CPU weight, clang won't suddenly take over the whole computer when compiling.</p> <h1>Fixing things is just the tip of the iceberg</h1> <h2>CGroup extra features</h2> <p>CGroup's come with a lot of new features that aren't available on a per-process level. </p> <p>We can:</p> <ul> <li>Set limits so that a CPU can't use more than N% </li> <li>We can gracefully close processes on logout</li> <li>We can disable networking</li> <li>We can set memory limits</li> <li>We can prevent forkbombs</li> <li>We can provide hints to the OOM killer not just with a weight but with expected ranges that should be considered normal</li> <li>We can freeze groups of processes (which will be useful for Plasma mobile)<br> ... </li> </ul> <p>All of this is easy to add for a user / system administrator. Using drop in's one can just add a .service file [example file link] to ~/.config/systemd/user.control/app-firefox@.service and manipulate any of these.</p> <p>[caveat, some of those features works for applications created as new transient services, not the lite version using scopes that's currently merged in KDE/Gnome - maybe worth mentioning]</p> <h1>Steps taken so far</h1> <p>Plasma 5.19 and recent Gnome now spawn applications into respective cgroups, but we're not yet surfacing the results that we can get from this.</p> <p>For the KDE devs providing the metadata is easy.</p> <p>If spawning a new application from an existing application be sure to use either <a href="https://api.kde.org/frameworks/kio/html/classKIO_1_1ApplicationLauncherJob.html"><code>ApplicationLauncherJob</code></a> or <a href="https://api.kde.org/frameworks/kio/html/classKIO_1_1CommandLauncherJob.html"><code>CommandLauncherJob</code></a> and set the respective service. Everything else is then handled automagically. You should be using these classes anyway for spawning new services.</p> <p>For users, you can spawn an application with either <code><code>kstart5 --application foo.desktop"</code></code></p> <p>That change to the launching is relatively tiny, but getting to this point in Plasma wasn't easy - there were a lot of edge cases that messed up the grouping correctly.</p> <ul> <li>kinit, our zygote process really meddled with keeping things grouped correctly</li> <li>drkonqi, our crash handler and application restarter</li> <li>dbus activation has no knowledge of the associated .desktop file if an application is DBus activated (such as spectacle our screenshot tool)</li> <li>and many many more papercuts throughout of different launches</li> </ul> <p>Also to fully capitalise on slices we need to move all our background processes into managed services and slices. This is worthy of another (equally lengthy) blog post.</p> <h2>How you can help?</h2> <p>It's been a battle to find these edge cases.<br> Whilst running your system, please run systemd-cgls and point out any applications (not background services yet) that are not in their appropriate cgroup.</p> <h1>What if I don't have an appropriate cgroup controller?</h1> <p>(e.g BSD users)</p> <p>As we're just adding metadata, everything used now will continue to work exactly as it does now. All existing tools work exactly the same. Within our task manager we still will keep a process view (it's still useful regardless) and we won't put in any code that relies on the cgroup metadata present. We'll keep the existing heuristics for matching windows with external events, cgroup metadata would just be a strongly influence factor in that. Things won't get worse, but we won't be able to capitalise on the new features discussed here, </p> David Edmundson http://jyeno.home.blog/?p=135 Google Summer of Code 2020 – week 4 and 5 Wed, 01 Jul 2020 04:11:04 +0000 https://jyeno.home.blog/2020/07/01/google-summer-of-code-2020-week-4-and-5/ <p>Hi, today I will talk about my week 4 and week 5 and bring some news!</p> <p>The last post was short but this one will make up for it, explaining some important bits, and changes, in the structure of mark that changed/improved during the first month of coding in GSoC.</p> <p>In week 4, I documented a huge part of the existing code, although there is still a need for some updates. Currently in week 5, I am fixing some bugs of the new logic and I will document the newly created Painter class (more information below), also start developing the logic for text annotation.</p> <p>The structure of marK had some changes that I had like to highlight and explain. this diagram represents the current structure, with marK also being the main window class.</p> <figure class="wp-block-image"><img src="//lh4.googleusercontent.com/MjERtHh2HMZBUi9NyIjVWaqd-7OCgwOxZ2UegTTgKHzLcgBM5LnGg0iAGWaUd87C0O1vBTu2rOWT_N1Gfnal01gemBDi60EG1zJqv00ytk3LZ4SFjn7aoby_EE9-7T3ibSc38av9" alt=""><figcaption>Current relationship of classes.</figcaption></figure> <p>Container was an abstract class and its children handled the loading of the necessary items, such as the image for the previous ImageContainer and text for the to be TextContainer, and also annotate the data. After talking with my mentor, we decided that it could change for better and be simpler.</p> <p>Now marK has only one Container, this one is a “canvas” to the Painter and he will be switched accordingly to the file type, the painters now are the ones responsible for load and display the contents of the files, and also handle the annotation of data.</p> <p>The container holds the current MarkedObject being annotated and also a vector of the previous ones. With this change the code is smaller and it is easier and faster to change between different types of annotation.</p> <figure class="wp-block-image size-large"><img data-attachment-id="136" data-permalink="https://jyeno.home.blog/markedobjectdiagram4/" data-orig-file="https://jyenohome.files.wordpress.com/2020/06/markedobjectdiagram4.png" data-orig-size="703,219" data-comments-opened="1" data-image-meta='&#123;"aperture":"0","credit":"","camera":"","caption":"","created_timestamp":"0","copyright":"","focal_length":"0","iso":"0","shutter_speed":"0","title":"","orientation":"0"}' data-image-title="markedobjectdiagram4" data-image-description="" data-medium-file="https://jyenohome.files.wordpress.com/2020/06/markedobjectdiagram4.png?w=300" data-large-file="https://jyenohome.files.wordpress.com/2020/06/markedobjectdiagram4.png?w=703" src="//jyenohome.files.wordpress.com/2020/06/markedobjectdiagram4.png?w=703" alt="" class="wp-image-136" srcset="https://jyenohome.files.wordpress.com/2020/06/markedobjectdiagram4.png 703w, https://jyenohome.files.wordpress.com/2020/06/markedobjectdiagram4.png?w=150 150w, https://jyenohome.files.wordpress.com/2020/06/markedobjectdiagram4.png?w=300 300w" sizes="(max-width: 703px) 100vw, 703px"><figcaption>Children of MarkedObject, each one represents, respectively, audio, image (and video) and text annotation.</figcaption></figure> <p>MarkedObject represents the annotated data. Each MarkedObject has a reference of a MarkedClass, and use it to have a color and identifier for the annotation. It also uses d pointer to avoid problems related to ABI changes (as I said in the previous post).</p> <p>The existing markedClasses are shown in the marK’s comboBox, being possible to select and also modify the name identifier and color. Allowing the user to personalize and edit accordingly to his needs.</p> <p>Serializer is responsible for reading and saving the MarkedObjects resulted from the annotation in marK. Its functions have been refactored to support text annotation (and others types of annotation). Currently, serializer only exports to two file formats, xml and json.</p> <figure class="wp-block-image"><img src="//lh3.googleusercontent.com/l9itWXgLhDpDfqidKLkO2HD_GugitWtJgiNB6AhXcTLL-0zj_8394yhBTYPzJxVjC8bquTuqknQXOepll7TMfhu2wtgn-4PKT7iYSIuZL-OzVripC3YLOmPmJqh4-ugo5O2puhPe" alt=""><figcaption>Existing and futures children of Painter.</figcaption></figure> <p>Painter is the base class of all Painters and is friend of the Container, as said before, it takes over the responsibility of the containers (of the previous logic). There will be a derived class for each type of annotation (such as the ones shown above). Currently, only ImagePainter exists and works but this month I will develop the TextPainter and change this.</p> <p>In the next post I will explain about the TextPainter and show the initial text annotation in marK.</p> <p>That is it, see you in the next post ; )</p> Jean Lima Andrade