<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<link href="https://perlmaven.com/atom" rel="self" />
<title>Perl</title>
<id>https://perlmaven.com</id>
<updated>2026-02-11T08:00:02</updated>

  <entry>
    <title>Setup GitHub Actions with Dist::Zilla, how to advance PRs</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-02-11T08:00:02Z</updated>
    <pubDate>2026-02-11T08:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/github-action-with-dist-zilla-video" />
    <id>https://perlmaven.com/github-action-with-dist-zilla-video</id>
    <content type="html"><![CDATA[<iframe width="560" height="315" src="https://www.youtube.com/embed/ciQw5DMvRm8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>
<p>00:00 Introduction</p>
</li>
<li>
<p>01:30 <a href="https://osdc.code-maven.com/perl">OSDC Perl</a>, mention last week</p>
</li>
<li>
<p>03:00 Nikolai Shaplov <a href="https://metacpan.org/author/NATARAJ">NATARAJ</a>, one of our guests author of <a href="https://metacpan.org/dist/Lingua-StarDict-Writer">Lingua-StarDict-Writer</a> on GitLab.</p>
</li>
<li>
<p>04:30 Nikolai explaining his goals about security <a href="https://github.com/radiator-software/p5-net-ssleay/pull/509">memory leak in Net::SSLeay</a></p>
</li>
<li>
<p>05:58 What we did earlier. (Low hanging fruits.)</p>
</li>
<li>
<p>07:00 Let's take a look at the <a href="https://github.com/radiator-software/p5-net-ssleay">repository of Net::SSLeay</a></p>
</li>
<li>
<p>08:00 Try understand what happens in the repository?</p>
</li>
<li>
<p>09:15 A bit of explanation about adopting a module. (co-maintainer, unauthorized uploads)</p>
</li>
<li>
<p>11:00 <a href="https://pause.perl.org/">PAUSE</a></p>
</li>
<li>
<p>15:30 Check the &quot;river&quot; status of the distribution. (reverse dependency)</p>
</li>
<li>
<p>17:20 You can CC-me in your correspondence.</p>
</li>
<li>
<p>18:45 Ask people to review your pull-requests.</p>
</li>
<li>
<p>21:30 Mention the issue with DBIx::Class and how to take over a module.</p>
</li>
<li>
<p>23:50 A bit about the OSDC Perl page.</p>
</li>
<li>
<p>24:55 <a href="https://cpandashboard.com/">CPAN Dashboard</a> and how to add yourself to it.</p>
</li>
<li>
<p>27:40 Show the issues I opened asking author if they are interested in setting up GitHub Actions.</p>
</li>
<li>
<p>29:25 Start working on <a href="https://metacpan.org/dist/Dancer-Template-Mason">Dancer-Template-Mason</a></p>
</li>
<li>
<p>30:00 clone it</p>
</li>
<li>
<p>31:15 perl-tester Docker image.</p>
</li>
<li>
<p>33:30 Installing the dependencies in the Docker container</p>
</li>
<li>
<p>34:40 Create the GitHub Workflow file. Add to git. Push it out to GitHub.</p>
</li>
<li>
<p>40:55 First failure in the CI which is unclear.</p>
</li>
<li>
<p>42:30 Verifying the problem locally.</p>
</li>
<li>
<p>43:10 Open an issue.</p>
</li>
<li>
<p>58:25 Can you talk about dzil and Dist::Zilla?</p>
</li>
<li>
<p>1:02:25 We get back to working in the CI.</p>
</li>
<li>
<p>1:03:25 Add <code>--notest</code> to make installations run faster.</p>
</li>
<li>
<p>1:05:30 Add the git configuration to the CI workflow.</p>
</li>
<li>
<p>1:06:32 Is it safe to use <code>--notest</code> when installing dependencies?</p>
</li>
<li>
<p>1:11:05 git rebase squashing the commits into one commit</p>
</li>
<li>
<p>1:13:35 <code>git push --force</code></p>
</li>
<li>
<p>1:14:10 Send the <a href="https://github.com/yanick/Dancer-Template-Mason/pull/8">pull-request</a>.</p>
</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Add META data, .gitignore and GitHub Actions to Common::CodingTools</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-02-01T22:00:02Z</updated>
    <pubDate>2026-02-01T22:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/meta-data-and-github-actions-for-common-codingtools-video" />
    <id>https://perlmaven.com/meta-data-and-github-actions-for-common-codingtools-video</id>
    <content type="html"><![CDATA[<p><a href="https://osdc.code-maven.com/perl">OSDC Perl</a>.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/fW3uCc-Vw-g" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>00:00 Introduction to OSDC</li>
<li>01:30 Introducing myself <a href="https://perlmaven.com/">Perl Maven</a>, <a href="https://perlweekly.com/">Perl Weekly</a></li>
<li>02:10 The earlier issues.</li>
<li>03:10 How to select a project to contribute to?</li>
<li>04:50 Chat on <a href="https://osdc.zulipchat.com/">OSDC Zulip</a></li>
<li>06:45 How to select a Perl project?</li>
<li>09:20 <a href="https://cpan-digger.perlmaven.com/">CPAN::Digger</a></li>
<li>10:10 Modules that don't have a link to their VCS.</li>
<li>13:00 Missing CI - GitHub Actions or GitLab Pipeline and Travis-CI.</li>
<li>14:00 Look at Term-ANSIEncode by Richard Kelsch - How to find the repository of this project?</li>
<li>15:38 Switching top look at Common-CodingTools by mistake.</li>
<li>16:30 How MetaCPAN knows where is the repository?</li>
<li>17:52 Clone the repository.</li>
<li>18:15 Use the <a href="https://github.com/szabgab/perl-docker-on-ubuntu/">szabgab/perl</a> Docker container.</li>
<li>22:10 Run <code>perl Makefile.PL</code>, install dependency, run <code>make</code> and <code>make distdir</code>.</li>
<li>23:40 See the generated <code>META.json</code> file.</li>
<li>24:05 Edit the <code>Makefile.PL</code></li>
<li>24:55 Explaining my method of cloning first (calling it <code>origin</code>) and forking later and calling that <code>fork</code>.</li>
<li>27:00 Really edit <code>Makefile.PL</code> and add the <code>META_MERGE</code> section and verify the generated <code>META.json</code> file.</li>
<li>29:00 Create a branch locally. Commit the change.</li>
<li>30:10 Create a fork on GitHub.</li>
<li>31:45 Add the <code>fork</code> as a remote repository and push the branch to it.</li>
<li>33:20 Linking to the PR on the <a href="https://osdc.code-maven.com/perl">OSDC Perl report page</a>.</li>
<li>35:00 Planning to add <code>.gitignore</code> and maybe setting up GitHub Action.</li>
<li>36:00 Start from the <code>main</code> branch, create the <code>.gitignore</code> file.</li>
<li>39:00 Run the tests locally. Set up GitHub Actions to run the tests on every push.</li>
<li>44:00 Editing the GHA configuration file.</li>
<li>48:30 Commit, push to the fork, check the results of GitHub Action in my fork on GitHub.</li>
<li>51:45 Look at the version of the <a href="https://hub.docker.com/r/perldocker/perl-tester/">perldocker/perl-tester</a> Docker image.</li>
<li>54:40 Update list of Perl versions in the CI. See the results on GitHub.</li>
<li>55:30 Show the version number of perl.</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Perl-related GitHub organizations</title>
    <summary type="html"><![CDATA[A list of GitHub organization containing Perl projects]]></summary>
    <updated>2026-01-31T10:00:02Z</updated>
    <pubDate>2026-01-31T10:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/github-organizations" />
    <id>https://perlmaven.com/github-organizations</id>
    <content type="html"><![CDATA[<p>Most projects are started by a single person in a GitHub repository of that person. Later for various reasons people establish GitHub organizations
and move the projects there.
Sometimes the organization contains a set of sub-projects related to a central project. (e.g. A web framework and its extensions or database access.)
Sometimes it is a collection of projects related to a single topic. (e.g. testing or IDE support.)
Sometimes it is just a random collection of project where people band together in the hope that no project will be left behind. (e.g. the CPAN Authors organization.)</p>
<p>Organizations make it easier to have multiple maintainers and thus ensuring continuity of project, but it might also mean that none of the members really
feel the urge to continue working on something.</p>
<p>In any case, I tried to collect all the Perl-related GitHub organizations.</p>
<p>Hopefully in ABC order...</p>
<ul>
<li>
<p><a href="https://github.com/beyondgrep">Beyond grep</a> - It is mostly for <code>ack</code>, a <code>better grep</code> developed by Andy Lester. No public members. 4 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl-catalyst/">Catalyst</a> - Catalyst is a web-framework. Its runtime and various extensions are maintained in this organization. 10 members and 39 repositories.</p>
</li>
<li>
<p><a href="https://github.com/cpan-authors/">cpan-authors</a> - A place for CPAN authors to collaborate more easily. 4 members and 9 repositories.</p>
</li>
<li>
<p><a href="https://github.com/davorg-cpan">davorg cpan</a> - Organisation for maintaining Dave Cross's CPAN modules. No public members and 47 repositories.</p>
</li>
<li>
<p><a href="https://github.com/exiftool">ExifTool</a> - No public members. 3 repositories.</p>
</li>
<li>
<p><a href="https://github.com/foswiki">Foswiki</a> - The Foswiki and related projects. 13 members and 649 repositories.</p>
</li>
<li>
<p><a href="https://github.com/gitpan">gitpan</a> - An archive of CPAN modules - 2 members and 5k+ read-only repositories.</p>
</li>
<li>
<p><a href="https://github.com/Kelp-framework">Kelp framework</a> - a web development framework. 1 member and 12 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Metacpan">MetaCPAN</a> - The source of the MetaCPAN site - 9 member and 56 rpositories.</p>
</li>
<li>
<p><a href="https://github.com/mojolicious">Mojolicious</a> - Some Perl and many JavaScript projects. 5 members and 29 repositories.</p>
</li>
<li>
<p><a href="https://github.com/moose/">Moose</a> - Moose,<code>MooseX-*</code>, Moo, etc. 11 members and 69 repositories.</p>
</li>
<li>
<p><a href="https://github.com/netdisco">Netdisco</a> - Netdisco and SNMP-Info projects. 10 members and 14 repositories.</p>
</li>
<li>
<p><a href="https://github.com/PadreIDE">PadreIDE</a> - Padre, the Perl IDE. 13 members and 102 repositories.</p>
</li>
<li>
<p><a href="https://github.com/paracamelus">Paracamelus</a> - No public members. 2 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl/">Perl</a> - Perl 5 itself, Docker images, etc. 20 members, 8 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl-actions/">Perl Actions</a> - GitHub Actions to be used in workflows. 5 members and 9 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perladvent/">Perl Advent Calendar</a> - including the source of <a href="https://perl.com/">perl.com</a>. 3 members and 8 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl-Bitcoin">Perl Bitcoin</a> - Perl Bitcoin Toolchain Collective. 3 members and 7 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl-Toolchain-Gang">Perl Toolchain Gang</a> - ExtUtils::MakeMaker, Module::Build, etc. 27 members and 41 repositories.</p>
</li>
<li>
<p><a href="https://github.com/PerlToolsTeam/">Perl Tools Team</a> - source of planetperl , perl-ads  etc. No public members. 6 repositories.</p>
</li>
<li>
<p><a href="https://github.com/PerlDancer/">Perl Dancer</a> - Dancer, Dancer2,  many plugins. 30 members and 79 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perltidy">perltidy</a> - Only for Perl::Tidy. No public members. 1 repository.</p>
</li>
<li>
<p><a href="https://github.com/perl5-dbi/">perl5-dbi</a> - DBI, several <code>DBD::*</code> modules, and some related modules. 7 members and 15 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perlorg/">perl.org</a> - also cpan.org and perldoc.perl.org. 3 members and 7 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl5">Perl5</a> - DBIx-Class and DBIx-Class-Historic. No public members. 2 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl5-utils/">perl5-utils</a> - List::MoreUtils, File::ShareDir etc. 2 members and 22 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Perl-Critic">Perl-Critic</a> - PPI, Perl::Critic and related. 7 members and 5 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl-ide">perl-ide</a> - Perl Development Environments. 26 members and 13 repositories.</p>
</li>
<li>
<p><a href="https://github.com/perl-pod">perl-pod</a> - Pod::Simple, Test::Pod. 1 member and 4 repositories.</p>
</li>
<li>
<p><a href="https://github.com/PerlPkgConfig">PkgConfig</a> - 1 member 1 repository.</p>
</li>
<li>
<p><a href="https://github.com/plack/">plack</a> - psgi-specs, Plack and a few middlewares. 5 members and 7 repositories.</p>
</li>
<li>
<p><a href="https://github.com/RexOps">RexOps</a> - Rex, Rexify and related projects. 1 member and 46 repositories.</p>
</li>
<li>
<p><a href="https://github.com/sqitchers/">Sqitch </a> - Sqitch for Sensible database change management and related projects. No public members. 16 repositories.</p>
</li>
<li>
<p><a href="https://github.com/StrawberryPerl/">StrawberryPerl</a> - The Perl distribution for MS Windows. 4 members and 10 repositories.</p>
</li>
<li>
<p><a href="https://github.com/Test-More">Test-More</a> - Test::Builder, Test::Simple, Test2 etc. - 4 members, 27 repositories.</p>
</li>
<li>
<p><a href="https://github.com/EnlightenedPerlOrganisation">The Enlightened Perl Organisation</a> - Task::Kensho and <code>Task::Kensho::*</code>. 1 member and 1 repository.</p>
</li>
<li>
<p><a href="https://github.com/Thunderhorse-Framework">Thunderhorse Framework</a> - a modern web development framework. No public members. 4 repositories.</p>
</li>
<li>
<p><a href="https://github.com/webmin">Webmin</a> - Webmin is a web-based system administration tool for Unix-like servers. - 5 repositories.</p>
</li>
</ul>
<h2 class="title is-4">Companies</h2>
<p>These are bot Perl-specific GitHub organizations, but some of the repositories are in Perl.</p>
<ul>
<li>
<p><a href="https://github.com/cpanel">cPanel</a> - Open Source Software provided by cPanel. 1 member and 22 repositories.</p>
</li>
<li>
<p><a href="https://github.com/orgs/duckduckgo/">DuckDuckGo</a> - The search engine. 19 members and 122 repositories.</p>
</li>
<li>
<p><a href="https://github.com/fastmail">Fastmail</a> - Open-source software developed at Fastmail. 4 members and 38 repositories.</p>
</li>
<li>
<p><a href="https://github.com/RotherOSS">RotherOSS</a> - Otobo (OTRS fork). No public members. 47 repositories.</p>
</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Lock and unlock hash using Hash::Util</title>
    <summary type="html"><![CDATA[lock_hash and unlock_hash to avoid accidental changes]]></summary>
    <updated>2026-01-28T18:00:02Z</updated>
    <pubDate>2026-01-28T18:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/lock-and-unlock-hash" />
    <id>https://perlmaven.com/lock-and-unlock-hash</id>
    <content type="html"><![CDATA[<p>If you don't like the <a href="/autovivification">autovivification</a> or simply would like to make sure the code does not accidentally alter a
hash the <a href="https://metacpan.org/pod/Hash::Util">Hash::Util</a> module is for you.</p>
<p>You can <code>lock_hash</code> and later you can <code>unlock_hash</code> if you'd like to make some changes to it.</p>
<p>In this example you can see 3 different actions commented out.
Each one would raise an exception if someone tries to call them on a locked hash.
After we unlock the hash we can execute those actions again.</p>
<p>I tried this both in perl 5.40 and 5.42.</p>
<p><strong><a href="https://github.com/szabgab/perlmaven.com/tree/main/examples/locking_hash.pl">examples/locking_hash.pl</a></strong></p>
<pre><code class="language-perl">use strict;
use warnings;
use feature 'say';

use Hash::Util qw(lock_hash unlock_hash);
use Data::Dumper qw(Dumper);


my %person = (
    fname =&gt; &quot;Foo&quot;,
    lname =&gt; &quot;Bar&quot;,
);
lock_hash(%person);

print Dumper \%person;
print &quot;$person{fname} $person{lname}\n&quot;;
say &quot;fname exists &quot;, exists $person{fname};
say &quot;language exists &quot;, exists $person{language};

# $person{fname} = &quot;Peti&quot;;     # Modification of a read-only value attempted
# delete $person{lname};       # Attempt to delete readonly key 'lname' from a restricted hash
# $person{language} = &quot;Perl&quot;;  # Attempt to access disallowed key 'language' in a restricted hash

unlock_hash(%person);

$person{fname} = &quot;Peti&quot;;     # Modification of a read-only value attempted
delete $person{lname};       # Attempt to delete readonly key 'lname' from a restricted hash
$person{language} = &quot;Perl&quot;;  # Attempt to access disallowed key 'language' in a restricted hash

print Dumper \%person;

</code></pre>
<pre><code class="language-perl">$VAR1 = {
          'lname' =&gt; 'Bar',
          'fname' =&gt; 'Foo'
        };
Foo Bar
fname exists 1
language exists
$VAR1 = {
          'language' =&gt; 'Perl',
          'fname' =&gt; 'Peti'
        };
</code></pre>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Open Source contribution - Perl - Tree-STR, JSON-Lines, and Protocol-Sys-Virt - Setup GitHub Actions</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-01-25T11:00:02Z</updated>
    <pubDate>2026-01-25T11:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/meta-data-and-github-actions-video" />
    <id>https://perlmaven.com/meta-data-and-github-actions-video</id>
    <content type="html"><![CDATA[<p>See <a href="https://osdc.code-maven.com/perl">OSDC Perl</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Y1La0sfcvbI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>
<p>00:00 Working with Peter Nilsson</p>
</li>
<li>
<p>00:01 Find a module to add GitHub Action to. go to <a href="https://cpan-digger.perlmaven.com/recent">CPAN::Digger recent</a></p>
</li>
<li>
<p>00:10 Found <a href="https://metacpan.org/dist/Tree-STR">Tree-STR</a></p>
</li>
<li>
<p>01:20 Bug in CPAN Digger that shows a GitHub link even if it is broken.</p>
</li>
<li>
<p>01:30 Search for the module name on GitHub.</p>
</li>
<li>
<p>02:25 Verify that the name of the module author is the owner of the GitHub repository.</p>
</li>
<li>
<p>03:25 Edit the Makefile.PL.</p>
</li>
<li>
<p>04:05 Edit the file, fork the repository.</p>
</li>
<li>
<p>05:40 Send the Pull-Request.</p>
</li>
<li>
<p>06:30 Back to CPAN Digger recent to find a module without GitHub Actions.</p>
</li>
<li>
<p>07:20 Add file / Fork repository gives us &quot;unexpected error&quot;.</p>
</li>
<li>
<p>07:45 Direct fork works.</p>
</li>
<li>
<p>08:00 Create the <code>.github/workflows/ci.yml</code> file.</p>
</li>
<li>
<p>09:00 Example <a href="https://perlmaven.com/setup-github-actions">CI yaml file</a> copy it and edit it.</p>
</li>
<li>
<p>14:25 Look at a GitLab CI file for a few seconds.</p>
</li>
<li>
<p>14:58 Commit - change the branch and add a description!</p>
</li>
<li>
<p>17:31 Check if the GitHub Action works properly.</p>
</li>
<li>
<p>18:17 There is a warning while the tests are running.</p>
</li>
<li>
<p>21:20 Opening an <a href="https://github.com/ehuelsmann/perl-protocol-sys-virt/issues/1">issue</a>.</p>
</li>
<li>
<p>21:48 Opening the PR (on the wrong repository).</p>
</li>
<li>
<p>22:30 Linking to output of a CI?</p>
</li>
<li>
<p>23:40 Looking at the file to see the source of the warning.</p>
</li>
<li>
<p>25:25 Assigning an issue? In an open source project?</p>
</li>
<li>
<p>27:15 Edit the already created issue.</p>
</li>
<li>
<p>28:30 USe the Preview!</p>
</li>
<li>
<p>29:20 Sending the <a href="https://github.com/ehuelsmann/perl-protocol-sys-virt/pull/2">Pull-Request</a> to the project owner.</p>
</li>
<li>
<p>31:25 Switching to Jonathan</p>
</li>
<li>
<p>33:10 CPAN Digger recent</p>
</li>
<li>
<p>34:00 Net-SSH-Perl of BDFOY - Testing a networking module is hard and Jonathan is using Windows.</p>
</li>
<li>
<p>35:13 Frequency of update of CPAN Digger.</p>
</li>
<li>
<p>36:00 Looking at our notes to find the GitHub account of the module author LNATION.</p>
</li>
<li>
<p>38:10 Look at the modules of <a href="https://metacpan.org/author/LNATION">LNATION on MetaCPAN</a></p>
</li>
<li>
<p>38:47 Found <a href="https://metacpan.org/pod/JSON::Lines">JSON::Lines</a></p>
</li>
<li>
<p>39:42 Install the dependencies, run the tests, generate test coverage.</p>
</li>
<li>
<p>40:32 Cygwin?</p>
</li>
<li>
<p>42:45 Add Github Action copying it from the previous PR.</p>
</li>
<li>
<p>43:54 <code>META.yml</code> should not be committed as it is a generated file.</p>
</li>
<li>
<p>48:25 I am looking for sponsors!</p>
</li>
<li>
<p>48:50 Create a branch that reflects what we do.</p>
</li>
<li>
<p>51:38 commit the changes</p>
</li>
<li>
<p>53:10 Fork the project on GitHub and setup git remote locally.</p>
</li>
<li>
<p>55:05 <code>git push -u fork add-ci</code></p>
</li>
<li>
<p>57:44 Sending the Pull-Request.</p>
</li>
<li>
<p>59:10 The 7 dwarfs and Snowwhite. My hope is to have a 100 people sending these PRs.</p>
</li>
<li>
<p>1:01:30 Feedback.</p>
</li>
<li>
<p>1:02:10 Did you think this was useful?</p>
</li>
<li>
<p>1:02:55 Would you be willing to tell people you know that you did this and you will do it again?</p>
</li>
<li>
<p>1:03:17 You can put this on your resume. It means you know how to do it.</p>
</li>
<li>
<p>1:04:16 ... and Zoom suddenly closed the recording...</p>
</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Open source contribution - Perl - MIME::Lite - GitHub Actions, test coverage and adding a test</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2026-01-25T09:00:02Z</updated>
    <pubDate>2026-01-25T09:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/testing-mime-lite-video" />
    <id>https://perlmaven.com/testing-mime-lite-video</id>
    <content type="html"><![CDATA[<p>See <a href="https://osdc.code-maven.com/perl">OSDC Perl</a></p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/XuwHFAyldsA" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>
<ul>
<li>00:00 Introduction and about <a href="https://osdc.code-maven.com/perl">OSDC Perl</a></li>
<li>01:50 <a href="https://metacpan.org/about/sponsors">Sponsors of MetaCPAN</a>, looking at some modules on CPAN.</li>
<li>03:30 The river status</li>
<li>04:10 Picking <a href="https://metacpan.org/dist/MIME-Lite">MIME::Lite</a> and looking at MetaCPAN. Uses RT, has no GitHub Actions.</li>
<li>05:55 Look at the clone of the repository, the 2 remotes and the 3 branches.</li>
<li>06:40 GitHub Actions <a href="https://perlmaven.com/setup-github-actions">Examples</a></li>
<li>08:00 Running the Docker container locally. Install the dependencies.</li>
<li>09:10 Run the tests locally.</li>
<li>09:20 Add the <code>.gitignore</code> file.</li>
<li>10:30 Picking a module from <a href="https://metacpan.org/recent">MetaCPAN recent</a></li>
<li>11:10 <a href="https://cpan-digger.perlmaven.com/recent">CPAN Digger recent</a></li>
<li>12:20 Explaining about pair-programming and workshop.</li>
<li>13:25 CPAN Digger statistics</li>
<li>14:15 Generate test coverage report using <a href="https://metacpan.org/pod/Devel::Cover">Devel::Cover</a>.</li>
<li>17:15 The <code>fold</code> function that is not tested and not even used.</li>
<li>18:39 Wanted to open an issue about <code>fold</code>, but I'll probbaly don't do it on RT.</li>
<li>20:00 Updating the OSDC Perl document with the TODO items.</li>
<li>21:13 Split the packages into files?</li>
<li>22:27 The culture of Open Source contributions.</li>
<li>24:20 Why is the BEGIN line red when the content of the block is green?</li>
<li>27:40 Switching to the <code>long-header</code> branch.</li>
<li>30:40 Finding <code>header_as_string</code> in the documentation.</li>
<li>32:15 Going over the test with the long subject line.</li>
<li>33:54 Let's compare the result to an empty string.</li>
<li>36:15 Switching to <a href="https://metacpan.org/pod/Test::LongString">Test::Longstring</a> to see the difference.</li>
<li>37:35 <a href="https://metacpan.org/pod/Test::Differences">Test::Differences</a> was also suggested.</li>
<li>39:40 Push out the branch and send the Pull-request.</li>
<li>40:35 Did this really increase the test coverage? Let's see it.</li>
<li>43:50 Messing up the explanation about codition coverage.</li>
<li>45:35 The repeated use of the magic number 72.</li>
<li>47:00 Is the output actually correct? Is it according to the standard?</li>
<li>51:45 Discussion about /usr/bin/perl on the first line.</li>
<li>52:45 No version is specified.</li>
<li>55:15 The sentence should be &quot;conforms to the standard&quot;</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>JSON::Schema::Validate</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-12-24T16:30:02Z</updated>
    <pubDate>2025-12-24T16:30:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/json-schema-validate" />
    <id>https://perlmaven.com/json-schema-validate</id>
    <content type="html"><![CDATA[<p>At an online event through the <a href="https://luma.com/perl-maven">Perl Maven</a> group we tried to understand this module
and even to contriute to it. For more details about the contributions check out the <a href="https://osdc.code-maven.com/perl">OSDC Perl</a> page.</p>
<p>This example is based on the one in the documentation of the <a href="https://metacpan.org/pod/JSON::Schema::Validate">JSON::Schema::Validate</a> and tweaked a bit. It will be useful again if we continue dealing with this module.</p>
<p><strong><a href="https://github.com/szabgab/perlmaven.com/tree/main/examples/json_schema_validate.pl">examples/json_schema_validate.pl</a></strong></p>
<pre><code class="language-perl">use JSON::Schema::Validate;
use JSON ();
use open qw( :std :encoding(UTF-8) );
my $schema = {
    '$schema' =&gt; 'https://json-schema.org/draft/2020-12/schema',
    '$id'     =&gt; 'https://example.org/s/root.json',
    type      =&gt; 'object',
    required  =&gt; [ 'name' ],
    properties =&gt; {
        name =&gt; { type =&gt; 'string', minLength =&gt; 5 },
        next =&gt; { '$dynamicRef' =&gt; '#Node' },
    },
    '$dynamicAnchor' =&gt; 'Node',
    additionalProperties =&gt; JSON::false,
};
my $js = JSON::Schema::Validate-&gt;new( $schema )
    -&gt;compile
    -&gt;content_checks
    -&gt;ignore_unknown_required_vocab
    -&gt;prune_unknown
    -&gt;register_builtin_formats
    -&gt;trace
    -&gt;trace_limit(200) # 0 means unlimited
    -&gt;unique_keys; # enable uniqueKeys

    #my $data = {
    #    name =&gt; 'head',
    #    next =&gt; {
    #        name =&gt; 'tail'
    #    }
    #};
    #my $data = {
    #    name =&gt; 23,
    #    next =&gt; {
    #        name =&gt; 'tail'
    #    }
    #};
    #my $data = {
    #    name =&gt; 'head',
    #};
my $data = {
    name =&gt; 'head big',
};


my $ok = $js-&gt;validate($data)
    or die( $js-&gt;error );
print &quot;ok\n&quot;;

</code></pre>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Shutter crashing</title>
    <summary type="html"><![CDATA[]]></summary>
    <updated>2025-11-13T11:35:02Z</updated>
    <pubDate>2025-11-13T11:35:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/shutter-crashing" />
    <id>https://perlmaven.com/shutter-crashing</id>
    <content type="html"><![CDATA[<p>A long time ago I used Shutter and found it as an excellent tool. Now I get all kinds of crashes.</p>
<p>Actually &quot;Now&quot; was a while ago, since then I upgraded Ubuntu and now I get all kinds of other error messages.</p>
<p>However, I wonder.</p>
<h2 class="title is-4">Why are there so many errors?</h2>
<p>Who's fault is it?</p>
<ul>
<li>
<p>A failure of the Perl community?</p>
</li>
<li>
<p>A failure of the Ubuntu or the Debian developers?</p>
</li>
<li>
<p>A failure of the whole idea of Open Source?</p>
</li>
<li>
<p>Maybe I broke the system?</p>
</li>
</ul>
<p>It starts so badly and then it crashes. I don't want to spend time figuring out what is the problem.
I don't even have the energy to open a ticket. I am not even sure where should I do it. On Ubuntu?
On the Shutter project?</p>
<p>Here is the output:</p>
<pre><code>$ shutter
Subroutine Pango::Layout::set_text redefined at /usr/share/perl5/Gtk3.pm line 2299.
	require Gtk3.pm called at /usr/bin/shutter line 72
	Shutter::App::BEGIN() called at /usr/bin/shutter line 72
	eval {...} called at /usr/bin/shutter line 72
Subroutine Pango::Layout::set_markup redefined at /usr/share/perl5/Gtk3.pm line 2305.
	require Gtk3.pm called at /usr/bin/shutter line 72
	Shutter::App::BEGIN() called at /usr/bin/shutter line 72
	eval {...} called at /usr/bin/shutter line 72
GLib-GObject-CRITICAL **: g_boxed_type_register_static: assertion 'g_type_from_name (name) == 0' failed at /usr/lib/x86_64-linux-gnu/perl5/5.36/Glib/Object/Introspection.pm line 110.
 at /usr/share/perl5/Gtk3.pm line 489.
	Gtk3::import(&quot;Gtk3&quot;, &quot;-init&quot;) called at /usr/bin/shutter line 72
	Shutter::App::BEGIN() called at /usr/bin/shutter line 72
	eval {...} called at /usr/bin/shutter line 72
GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed at /usr/lib/x86_64-linux-gnu/perl5/5.36/Glib/Object/Introspection.pm line 110.
 at /usr/share/perl5/Gtk3.pm line 489.
	Gtk3::import(&quot;Gtk3&quot;, &quot;-init&quot;) called at /usr/bin/shutter line 72
	Shutter::App::BEGIN() called at /usr/bin/shutter line 72
	eval {...} called at /usr/bin/shutter line 72
GLib-GObject-CRITICAL **: g_boxed_type_register_static: assertion 'g_type_from_name (name) == 0' failed at /usr/lib/x86_64-linux-gnu/perl5/5.36/Glib/Object/Introspection.pm line 110.
 at /usr/share/perl5/Gtk3.pm line 489.
	Gtk3::import(&quot;Gtk3&quot;, &quot;-init&quot;) called at /usr/bin/shutter line 72
	Shutter::App::BEGIN() called at /usr/bin/shutter line 72
	eval {...} called at /usr/bin/shutter line 72
GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed at /usr/lib/x86_64-linux-gnu/perl5/5.36/Glib/Object/Introspection.pm line 110.
 at /usr/share/perl5/Gtk3.pm line 489.
	Gtk3::import(&quot;Gtk3&quot;, &quot;-init&quot;) called at /usr/bin/shutter line 72
	Shutter::App::BEGIN() called at /usr/bin/shutter line 72
	eval {...} called at /usr/bin/shutter line 72
GLib-GObject-CRITICAL **: g_boxed_type_register_static: assertion 'g_type_from_name (name) == 0' failed at /usr/lib/x86_64-linux-gnu/perl5/5.36/Glib/Object/Introspection.pm line 110.
 at /usr/share/perl5/Gtk3.pm line 489.
	Gtk3::import(&quot;Gtk3&quot;, &quot;-init&quot;) called at /usr/bin/shutter line 72
	Shutter::App::BEGIN() called at /usr/bin/shutter line 72
	eval {...} called at /usr/bin/shutter line 72
GLib-CRITICAL **: g_once_init_leave: assertion 'result != 0' failed at /usr/lib/x86_64-linux-gnu/perl5/5.36/Glib/Object/Introspection.pm line 110.
 at /usr/share/perl5/Gtk3.pm line 489.
	Gtk3::import(&quot;Gtk3&quot;, &quot;-init&quot;) called at /usr/bin/shutter line 72
	Shutter::App::BEGIN() called at /usr/bin/shutter line 72
	eval {...} called at /usr/bin/shutter line 72
Variable &quot;$progname_active&quot; will not stay shared at /usr/bin/shutter line 2778.
Variable &quot;$progname&quot; will not stay shared at /usr/bin/shutter line 2779.
Variable &quot;$im_colors_active&quot; will not stay shared at /usr/bin/shutter line 2787.
Variable &quot;$combobox_im_colors&quot; will not stay shared at /usr/bin/shutter line 2788.
Variable &quot;$trans_check&quot; will not stay shared at /usr/bin/shutter line 2798.


... About 700 similar error messages ...


Name &quot;Gtk3::Gdk::SELECTION_CLIPBOARD&quot; used only once: possible typo at /usr/bin/shutter line 291.
WARNING: gnome-web-photo is missing --&gt; screenshots of websites will be disabled!

 at /usr/bin/shutter line 9038.
	Shutter::App::fct_init_depend() called at /usr/bin/shutter line 195
Useless use of hash element in void context at /usr/share/perl5/Shutter/App/Common.pm line 77.
	require Shutter/App/Common.pm called at /usr/bin/shutter line 206
Useless use of hash element in void context at /usr/share/perl5/Shutter/App/Common.pm line 80.
	require Shutter/App/Common.pm called at /usr/bin/shutter line 206
Subroutine lookup redefined at /usr/share/perl5/Shutter/Draw/DrawingTool.pm line 28.
	require Shutter/Draw/DrawingTool.pm called at /usr/bin/shutter line 228
Variable &quot;$self&quot; will not stay shared at /usr/share/perl5/Shutter/Draw/DrawingTool.pm line 671.
	require Shutter/Draw/DrawingTool.pm called at /usr/bin/shutter line 228
Variable &quot;$self&quot; will not stay shared at /usr/share/perl5/Shutter/Screenshot/SelectorAdvanced.pm line 840.
	require Shutter/Screenshot/SelectorAdvanced.pm called at /usr/bin/shutter line 233
Failed to register: GDBus.Error:org.freedesktop.DBus.Error.NoReply: Message recipient disconnected from message bus without replying
</code></pre>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Adding tests to legacy Perl code</title>
    <summary type="html"><![CDATA[Notes from a live-coding session writing tests for the SVG module.]]></summary>
    <updated>2025-11-11T12:00:02Z</updated>
    <pubDate>2025-11-11T12:00:02Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/adding-tests-to-legacy-perl-code" />
    <id>https://perlmaven.com/adding-tests-to-legacy-perl-code</id>
    <content type="html"><![CDATA[<p>Notes from the live-coding session (part of the <a href="/live">Perl Maven live</a> events.</p>
<ul>
<li>
<p><a href="https://metacpan.org/dist/SVG">SVG</a> the module for which we wrote tests.</p>
</li>
<li>
<p><a href="https://metacpan.org/dist/Devel-Cover">Devl-Cover</a> to generate test coverage report run <code>cover -test</code>.</p>
</li>
<li>
<p><a href="https://metacpan.org/pod/Test::More">Test::More</a></p>
</li>
<li>
<p><a href="https://metacpan.org/pod/Test::Exception">Test::Exception</a></p>
</li>
<li>
<p><code>done_testing()</code> or <code>done_testing(2)</code></p>
</li>
<li>
<p><a href="https://www.cpancover.com/latest/">CPAN cover</a></p>
</li>
</ul>
<h2 class="title is-4">Meeting summary</h2>
<h3 class="title is-5">Quick recap</h3>
<p>The meeting began with informal introductions and discussions about Perl programming, including experiences with maintaining Perl codebases and the challenges of the language's syntax. The main technical focus was on testing and code coverage, with detailed demonstrations of using Devel::Cover and various testing modules in Perl, including examples of testing SVG functionality and handling exceptions. The session concluded with discussions about testing practices, code coverage implementation, and the benefits of automated testing, while also touching on practical aspects of Perl's object-oriented programming and error handling features.</p>
<h3 class="title is-5">SVG Test Coverage Analysis</h3>
<p>Gabor demonstrated how to use Devel::Cover to generate test coverage reports for the SVG.pm module. He showed that the main module has 98% coverage, while some submodules have lower coverage. Gabor explained how to interpret the coverage reports, including statement, branch, and condition coverage. He also discussed the importance of identifying and removing unused code that appears uncovered by tests. Gabor then walked through some example tests in the SVG distribution, explaining how they verify different aspects of the SVG module's functionality.</p>
<h3 class="title is-5">Original announcement</h3>
<p>Adding tests to legacy Perl code</p>
<p>During this live coding event we'll take a Perl module from CPAN and add some tests to it.</p>
<h3 class="title is-5">Further events</h3>
<p>Register on the <a href="https://luma.com/perl-maven">Perl Maven Luma calendar</a>.</p>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

  <entry>
    <title>Perl Maven Live presentations</title>
    <summary type="html"><![CDATA[Zoom-based live presentations and their video recordings]]></summary>
    <updated>2025-08-16T07:30:01Z</updated>
    <pubDate>2025-08-16T07:30:01Z</pubDate>
    <link rel="alternate" type="text/html" href="https://perlmaven.com/live" />
    <id>https://perlmaven.com/live</id>
    <content type="html"><![CDATA[<p>Live on-line presentations and video recordings. See the full list of the <a href="https://live.code-maven.com/">Code Maven live events</a></p>
<h2 class="title is-4">Next</h2>
<ul>
<li>2025.12.01 <a href="https://luma.com/perl-maven">Perl Code-reading and testing</a></li>
</ul>
<!--
During this online event we are going to take a look at the JSON::Schema::Validate module ( https://metacpan.org/pod/JSON::Schema::Validate  )

We'll try to use it. We'll look at the tests it has etc.

Link to access the event will be provided later.
-->
<h2 class="title is-4">Past</h2>
<ul>
<li>
<p>2024.06.13 <a href="/getting-started-with-docker-for-perl-developers">Getting Started with Docker for Perl Developers</a></p>
</li>
<li>
<p>2024.08.04 <a href="/github-actions-for-perl-projects">GitHub Actions for Perl projects</a></p>
</li>
<li>
<p>2024.08.15 <a href="/github-pages-for-perl-developers">GitHub pages for Perl developers</a></p>
</li>
<li>
<p>2025.01.20 <a href="/gitlab-pipelines-and-ci-for-perl-developers">GitLab pipelines and CI for Perl developers</a></p>
</li>
<li>
<p>2025.11.11 <a href="/adding-tests-to-legacy-perl-code">Adding tests to legacy Perl code</a></p>
</li>
</ul>
<h2 class="title is-4">Ideas for further sessions</h2>
<ul>
<li>Perl Code-reading and testing: We are going to try fuzz-testing using the <a href="https://metacpan.org/dist/App-Test-Generator">https://metacpan.org/dist/App-Test-Generator</a></li>
<li>Dancer2 themes (new features in Dancer2 version 2)</li>
<li>modern coding practices like the new features of Perl 5.38+</li>
<li>named arguments</li>
<li>maybe also HTMX</li>
<li>Bioinformatics-related things.</li>
</ul>
]]></content>
    <author>
      <name></name>
    </author>
  </entry>

</feed>

