<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tib</title>
    <description>The latest articles on DEV Community by Tib (@thibaultduponchelle).</description>
    <link>https://dev.to/thibaultduponchelle</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F520170%2Fc4002303-5d36-46d7-827a-4aa1b65b192b.jpeg</url>
      <title>DEV Community: Tib</title>
      <link>https://dev.to/thibaultduponchelle</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/thibaultduponchelle"/>
    <language>en</language>
    <item>
      <title>My participation to the Perl Toolchain Summit 2025</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Thu, 27 Mar 2025 07:36:14 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/my-participation-to-the-perl-toolchain-summit-2025-41j2</link>
      <guid>https://dev.to/thibaultduponchelle/my-participation-to-the-perl-toolchain-summit-2025-41j2</guid>
      <description>&lt;p&gt;(cover by &lt;a href="https://unsplash.com/@hnhmarketing" rel="noopener noreferrer"&gt;Hunter Haley&lt;/a&gt;) &lt;/p&gt;

&lt;h2&gt;
  
  
  What is the Perl Toolchain Summit?
&lt;/h2&gt;

&lt;p&gt;The &lt;a href="https://perltoolchainsummit.org/" rel="noopener noreferrer"&gt;Perl Toolchain Summit&lt;/a&gt; (PTS) nee "Perl QA Hackathon" is an amazing event, in the form of an hackathon, taking place yearly in Europe. &lt;/p&gt;

&lt;p&gt;It's a open source gathering of several critically important people running the Perl infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqcicnb58fmn9vms245o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqcicnb58fmn9vms245o.jpg" alt="Factory" width="640" height="427"&gt;&lt;/a&gt;&lt;br&gt;
(picture from &lt;a href="https://unsplash.com/@rozetsky" rel="noopener noreferrer"&gt;Ant Rozetsky&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Some of the vital pieces of software taken care at Perl Toolchain Summit are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://pause.perl.org" rel="noopener noreferrer"&gt;PAUSE&lt;/a&gt;, &lt;a href="https://www.cpan.org/" rel="noopener noreferrer"&gt;CPAN&lt;/a&gt; and  &lt;a href="https://metacpan.org/" rel="noopener noreferrer"&gt;MetaCPAN&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;CPAN installers: &lt;a href="https://metacpan.org/pod/CPAN" rel="noopener noreferrer"&gt;cpan&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/CPANPLUS" rel="noopener noreferrer"&gt;cpanp&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/App::cpanminus" rel="noopener noreferrer"&gt;cpanm&lt;/a&gt;, &lt;a href="https://metacpan.org/dist/App-cpm/view/script/cpm" rel="noopener noreferrer"&gt;cpm&lt;/a&gt;, etc... &lt;/li&gt;
&lt;li&gt;Builders: &lt;a href="https://metacpan.org/pod/ExtUtils::MakeMaker" rel="noopener noreferrer"&gt;ExtUtils::MakeMaker&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Module::Build" rel="noopener noreferrer"&gt;Module::Build&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Module::Build::Tiny" rel="noopener noreferrer"&gt;Module::Build::Tiny&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Smokers: &lt;a href="https://cpantesters.org/" rel="noopener noreferrer"&gt;CPANTesters&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Test::Smoke" rel="noopener noreferrer"&gt;Test::Smoke&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Authoring tools: &lt;a href="https://metacpan.org/pod/Dist::Zilla" rel="noopener noreferrer"&gt;Dist::Zilla&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Dist::Milla" rel="noopener noreferrer"&gt;Dist::Milla&lt;/a&gt;, &lt;a href="https://metacpan.org/pod/Minilla" rel="noopener noreferrer"&gt;Minilla&lt;/a&gt;, etc...&lt;/li&gt;
&lt;li&gt;Test frameworks: &lt;a href="https://metacpan.org/pod/Test2" rel="noopener noreferrer"&gt;Test2&lt;/a&gt;, etc...&lt;/li&gt;
&lt;li&gt;&lt;a href="https://security.metacpan.org/" rel="noopener noreferrer"&gt;CPAN Security&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This gathering, invite-only, is happening once a year and group together a lot of essential folks running Perl and CPAN.&lt;/p&gt;

&lt;p&gt;It is made possible thanks to the &lt;a href="https://perltoolchainsummit.org/pts2025/sponsors.html" rel="noopener noreferrer"&gt;generous sponsoring of companies&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;By sponsoring this event, companies both mark their strong belief in Free Software and help maintaining the present/future quality of Perl ecosystem (or give thanks for past good and loyal service for years). &lt;/p&gt;

&lt;p&gt;It radiates well beyond the event since the attendees are committed to Perl all along the year before and after the summit.&lt;/p&gt;

&lt;p&gt;To give you an example, see the list of achievements of &lt;a href="https://security.metacpan.org/cpansec/update/2025/03/12/CPANSec-Retrospective-2024.html" rel="noopener noreferrer"&gt;CPAN Security group in 2024&lt;/a&gt; (which is particularly relevant since &lt;a href="https://security.metacpan.org/" rel="noopener noreferrer"&gt;CPANSec&lt;/a&gt; group was created at Perl Toolchain Summit 2023 and will be again well represented during this summit)&lt;/p&gt;

&lt;h2&gt;
  
  
  What about /me?
&lt;/h2&gt;

&lt;p&gt;This year, I got invited to the Perl Toolchain Summit. It will be my first time :)&lt;/p&gt;

&lt;p&gt;I felt honored and blessed to receive an invitation.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx076xtky48rw4odis5hw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx076xtky48rw4odis5hw.png" alt="Woohoo" width="286" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Woohoo!" \o/&lt;/p&gt;

&lt;p&gt;I'm now feeling excited to join this event and meet all those great names.&lt;/p&gt;

&lt;p&gt;I'm far from the value of some core members participating to the Perl Toolchain Summit but I think this invitation rewards my involvement in Perl toolchain (and Perl in general). So I would lie to say that I'm an imposter. But still, I will try be up to the chance I'm given!&lt;/p&gt;

&lt;h2&gt;
  
  
  My plan
&lt;/h2&gt;

&lt;p&gt;I'm involved in multiple topics but I'm thinking I will work mainly on the 3 following topics:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Perl interpreter smoke test tooling (for which I'm the maintainer now)&lt;/li&gt;
&lt;li&gt;Security (along with CPANSec group) where I've been involved lately&lt;/li&gt;
&lt;li&gt;CPAN in general (PAUSE, indexes, installers, architecture, etc...)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Topics 2. and 3. are largely overlapping themself.&lt;/p&gt;

&lt;p&gt;For the topics involving collaboration, I'm not going with big breaking ideas but mostly with little realistic changes that I consider with relatively big "return on invest". I think there's some inertia (because of the compatibility value being deep rooted in the DNA of Perl) that we should respect and should make us "reasonable dreamers".&lt;/p&gt;

&lt;p&gt;If you're used to read me, you know that I'm also thinking out of the technical box. Sometimes speaking about the social nature of CPAN or how communication impacts as much as technical excellence.&lt;/p&gt;

&lt;p&gt;I'm not fixing myself "success criteria" to fulfill to consider I would have succeeded my summit. If I'm preparing a bit, I also want to keep some "freshness" toward the event. &lt;/p&gt;

&lt;p&gt;What else to say now apart that &lt;strong&gt;I can't wait to be there!&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Meanwhile... &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Happy Perl Hacking&lt;/strong&gt;!
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flr1dgg15gsmngd87bxgn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flr1dgg15gsmngd87bxgn.png" alt="Perl Logo" width="300" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>perl</category>
      <category>cpan</category>
      <category>opensource</category>
      <category>hackathon</category>
    </item>
    <item>
      <title>Habemus Perl Logo!</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Sat, 04 Jan 2025 16:25:36 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/habemus-perl-logo-cd3</link>
      <guid>https://dev.to/thibaultduponchelle/habemus-perl-logo-cd3</guid>
      <description>&lt;h2&gt;
  
  
  The new Perl logo
&lt;/h2&gt;

&lt;p&gt;Perl has a logo!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fixx9e4uy0cnyhiizofwo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fixx9e4uy0cnyhiizofwo.png" alt="Perl new logo - camels" width="800" height="802"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I mean, a &lt;strong&gt;FREE&lt;/strong&gt; logo.&lt;/p&gt;

&lt;p&gt;It's a camel, with good quality and not a derivative of O'Reilly camel...&lt;/p&gt;

&lt;p&gt;Take your time to fall in love with it.  &lt;/p&gt;

&lt;p&gt;Use it... or not, no obligation.&lt;/p&gt;

&lt;p&gt;But we have one, a free one, that we can use. &lt;/p&gt;

&lt;h3&gt;
  
  
  References
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Please read &lt;a href="https://perladvent.org/2024/2024-12-23.html" rel="noopener noreferrer"&gt;Perl Advent Day 23 2024 - A New Logo for Perl&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Find source images for usage at &lt;a href="https://github.com/metacpan/perl-assets/tree/main/blessed/src" rel="noopener noreferrer"&gt;perl-assets&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>perl</category>
      <category>logo</category>
      <category>opensource</category>
      <category>news</category>
    </item>
    <item>
      <title>Further on Perl Camel</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Thu, 07 Nov 2024 09:07:12 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/further-on-perl-camel-3ak1</link>
      <guid>https://dev.to/thibaultduponchelle/further-on-perl-camel-3ak1</guid>
      <description>&lt;p&gt;Get enough of Perl logo discussion?&lt;/p&gt;

&lt;p&gt;You would well take a little bit more! 😉&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0kzcw05j0za2jlegcd0.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0kzcw05j0za2jlegcd0.jpg" alt="Get some more" width="800" height="1088"&gt;&lt;/a&gt;&lt;br&gt;
(Picture from &lt;a href="https://www.pexels.com/photo/woman-serving-pasta-for-thanksgiving-5638706/" rel="noopener noreferrer"&gt;Askar Abayev&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I know some people think it's not worth the pain discussing again, but I suppose it's because they don't have the same needs than me and some others 😀&lt;/p&gt;

&lt;p&gt;What if you want to use a logo to illustrate a Perl blog? What if you want to use an icon to illustrate Perl sources files (Ubuntu)? What if...?&lt;br&gt;
You either have to use a random camel or ignore the law...&lt;/p&gt;

&lt;p&gt;And it's in Perl roots and inside us to be good at free software.&lt;/p&gt;

&lt;p&gt;If you don't know well the context, please go read my post &lt;a href="https://dev.to/thibaultduponchelle/the-perl-complex-topic-of-logos-3161"&gt;The complex topic of Perl logos&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later, I posted my &lt;a href="https://dev.to/thibaultduponchelle/open-letter-to-tim-oreilly-to-free-the-perl-camel-k3i"&gt;Open Letter To Tim O'Reilly To Free The Perl Camel&lt;/a&gt; on &lt;a href="https://news.ycombinator.com/item?id=36648949" rel="noopener noreferrer"&gt;Hacker News&lt;/a&gt; and people mentioned about the fact that Perl Camel was a "trademark" of O'Reilly, not a copyright (license).&lt;/p&gt;

&lt;p&gt;It is true and it's a fundamental thing to understand.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's the difference between trademark and copyright
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfttpnsrbckg5u1ovm4f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjfttpnsrbckg5u1ovm4f.png" alt="Image description" width="716" height="664"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.uspto.gov/trademarks/basics/trademark-patent-copyright" rel="noopener noreferrer"&gt;Trademark vs Patent vs Copyright&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How is &lt;em&gt;trademarked&lt;/em&gt; Perl Camel?
&lt;/h2&gt;

&lt;p&gt;First, just having used the Perl Camel on a book provided to O'Reilly Media a "public statement", then quickly after (in 1998) they secured the trademark via registering trademarks against organisms like United States Patent and Trademark Office (USPTO).&lt;/p&gt;

&lt;h2&gt;
  
  
  Public statement?
&lt;/h2&gt;

&lt;p&gt;Once a business begins to use a logo to advertise and sell goods or services, they automatically attain common law ownership and the limited protections associated with it—but only if the business can prove it was the first businesses to use the mark. Common law legal protection for a trademark only applies to the geographic area where the business operates. If nationwide protection is needed, then registering a logo with the USPTO is a wise step.&lt;/p&gt;

&lt;h2&gt;
  
  
  USPTO / WIPO
&lt;/h2&gt;

&lt;p&gt;United States Patent and Trademark Office (USPTO) and World Intellectual Property Organization (WIPO)  are organisms where one can register a trademark.&lt;/p&gt;

&lt;p&gt;Trademarks are not "global", they apply only in jurisdictions (countries) who recognize it.&lt;/p&gt;

&lt;p&gt;We can find USPTO registrations for Perl Camel, I was not able to find one in WIPO (is there any?).&lt;/p&gt;

&lt;h2&gt;
  
  
  The actual trademark and service mark
&lt;/h2&gt;

&lt;p&gt;"The bottom line is that a trademark represents a product produced by a business (in this case: The Programming Perl book) while a service mark represents a service offered by the business (in this case: O'Reilly selling books). A single business can register both trademarks and service marks to brand themselves."&lt;/p&gt;

&lt;h3&gt;
  
  
  Trademark
&lt;/h3&gt;

&lt;p&gt;Serial: 75414570&lt;br&gt;
Reg number: 2262465&lt;br&gt;
2nd renewal: 20190828&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmgvit8f7lqn95bsakr3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbmgvit8f7lqn95bsakr3.png" alt="Perl Camel USPTO Trademark" width="535" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Camels, both bactrian and dromedary, including heads and other parts uniquely identifiable with camels, and also including stylized, costumed, and those with human attributes&lt;/p&gt;

&lt;h3&gt;
  
  
  Service Mark
&lt;/h3&gt;

&lt;p&gt;Serial number: 75414568&lt;br&gt;
Reg number: 2209120&lt;br&gt;
2nd renewal: 20181012&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa70gxwxxwyoji80vcnph.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa70gxwxxwyoji80vcnph.png" alt="Perl Camel USPTO Service Mark" width="489" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can search and verify by yourself at &lt;a href="https://www.uspto.gov/trademarks/search" rel="noopener noreferrer"&gt;USPTO Trademark Search System&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trade dress
&lt;/h2&gt;

&lt;p&gt;More in general, covers of animals (camels but also others) on O'Reilly books seem protected under a &lt;a href="https://en.wikipedia.org/wiki/Trade_dress" rel="noopener noreferrer"&gt;Trade dress&lt;/a&gt;:&lt;/p&gt;

&lt;p&gt;"Trade dress is the characteristics of the visual appearance of a product or its packaging (or even the design of a building) that signify the source of the product to consumers. Trade dress is an aspect of trademark law, which is a form of intellectual property protection law.&lt;/p&gt;

&lt;p&gt;In the United States, the Lanham Act protects trade dress if it serves the same source-identifying function as a trademark. It is possible to register trade dress as a trademark, but for practical reasons most trade dress and product configurations are protected without registration."&lt;/p&gt;

&lt;h2&gt;
  
  
  If copyrights have a duration, how long lasts a trademark?
&lt;/h2&gt;

&lt;p&gt;10 years but you can renew (O'Reilly well renews them when needed).&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the &lt;em&gt;copyright&lt;/em&gt; (license) of O'Reilly Perl camel?
&lt;/h2&gt;

&lt;p&gt;Actually, the design was free when O'Reilly decided to use it.&lt;/p&gt;

&lt;p&gt;O'Reilly animal designs are copyright free (public domain). It implies it has no restriction  and no license.&lt;/p&gt;

&lt;p&gt;Edie Freedman and Hanna Dyers designed the Programming Perl cover based on &lt;a href="https://www.doverbooks.co.uk/animals-1419-copyright-free-illustrations-of-mammals-birds-fish-insects-etc" rel="noopener noreferrer"&gt;Animals 1,419 Copyright Free Illustrations of Mammals, Birds, Fish, Insects, etc.&lt;/a&gt; by Jim Harter&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w1fpje3r477oplyk8om.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2w1fpje3r477oplyk8om.jpg" alt="Animals" width="764" height="1000"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So it's important to understand that Perl Camel is not protected because of any copyright/license or creator but because of its association with O'Reilly and books publishing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Using Perl shadow camel?
&lt;/h2&gt;

&lt;p&gt;Yes, what about this guy?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhclt95fetml94dvz5jbb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhclt95fetml94dvz5jbb.png" alt="Perl Shadow Camel" width="256" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Being a &lt;em&gt;derivative&lt;/em&gt; of the Perl Camel does not free us from the trademark. Like using Coca Cola logo just replacing with a "Koka Cola" or changing color from red to blue. No derivative can help, design should not recall in any way the initial trademark/picture and, moreover, the association. &lt;/p&gt;

&lt;h2&gt;
  
  
  Fair use
&lt;/h2&gt;

&lt;p&gt;The concept of fair use refers to some usages of trademarked logo for  some limited usage like representing the brand. For instance, using the Perl Camel to write a blog post about the Perl Camel &lt;strong&gt;Book&lt;/strong&gt; or O'Reilly in general is OK.&lt;/p&gt;

&lt;p&gt;Fair use is not well recognized everywhere though.&lt;/p&gt;

&lt;h2&gt;
  
  
  Blanket license
&lt;/h2&gt;

&lt;p&gt;It exists some solutions to delegate permissions, in the sort of "automatic grant of permissions to use". Somewhat like a blanket license. What was done with The Perl Foundation looks like a bit to a blanket license, but with restrictions. The way it was done makes it still very far from making it "free to use".&lt;/p&gt;

&lt;p&gt;Expanding blanket license (remove restrictions and do not attach to TPF) is difficult or impossible without an entity (Perl "community" is not what we can call "an entity").&lt;/p&gt;

&lt;h2&gt;
  
  
  Logo vs mascot
&lt;/h2&gt;

&lt;p&gt;Using camels to represent Perl has become more like a mascot.&lt;/p&gt;

&lt;h2&gt;
  
  
  My hypothesis and conclusion
&lt;/h2&gt;

&lt;p&gt;I'm not a lawyer 😉&lt;/p&gt;

&lt;p&gt;When we talk about trademarks, we don't talk about something really rigorous. For instance it works on some countries, but not all.&lt;br&gt;
When defending a trademark in court, it's not all black and white, it's more like you build a defense with a maximum of documents and history facts to prove your precedence and that you undoubtly own the trademark (and trade dress).&lt;/p&gt;

&lt;p&gt;My hypothesis is that O'Reilly never trademarked other animals with books in his entirety but Perl Camel was the first one (to be trademarked, not the first published). Protecting books covers with animals seems to fall under a "Trade dress" protection, built on top of the Perl camel trademark registration (among maybe other registrations). It means Perl Camel trademark can now be used to protect all others. Sadly for us, it is probably then the cornerstone of the whole protection of "O'Reilly Trademark family" (or more appropriately: "menagerie").&lt;/p&gt;

&lt;p&gt;It's why if we dream to have it free, we can't reasonably expect to see it happen. And even if O’Reilly would lose total interest in Perl, it would weaken too much their whole family of books.... And they still remain friends that we don't want to hurt too much. &lt;/p&gt;

</description>
      <category>perl</category>
      <category>trademarks</category>
      <category>books</category>
    </item>
    <item>
      <title>My London Perl And Raku Workshop 2024</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Tue, 29 Oct 2024 14:38:19 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/my-london-perl-and-raku-workshop-2024-1i6m</link>
      <guid>https://dev.to/thibaultduponchelle/my-london-perl-and-raku-workshop-2024-1i6m</guid>
      <description>&lt;p&gt;Few days ago, I participated to &lt;a href="https://act.yapc.eu/lpw2024/" rel="noopener noreferrer"&gt;London Perl And Raku Workshop&lt;/a&gt; and I was shocked and thrilled to see how it was a brilliant success!&lt;/p&gt;

&lt;p&gt;For once, I will say a word about &lt;a href="https://deriv.com/who-we-are" rel="noopener noreferrer"&gt;Deriv&lt;/a&gt; which was the biggest sponsor of the event.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqr3ql1ohnnfm8bmm20w.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvqr3ql1ohnnfm8bmm20w.jpg" alt="Deriv" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It's a nice place to work 👍 for both juniors and gray hairs (that are very much desired). There's an office in &lt;a href="https://www.google.com/maps/place/Apex/@51.4581106,-0.9695783,15z/data=!4m2!3m1!1s0x0:0x2b1e03f086e4cf0a?sa=X&amp;amp;ved=1t:2428&amp;amp;ictx=111" rel="noopener noreferrer"&gt;Reading&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;Also for once, I will post a picture of me.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg5r98dtvitud02pfvdi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxg5r98dtvitud02pfvdi.jpg" alt="Tib At LPRW 2024" width="800" height="970"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The review
&lt;/h2&gt;

&lt;p&gt;The venue was great. Both the location, size and equipment.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36g072qn81btte5pzzdv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36g072qn81btte5pzzdv.jpg" alt="Venue" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When arriving, you got a sticker to wear with your name (great idea!) and a gorgeous scarf (best goodie ever!).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr2z9l26y0kzye4g8rdec.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr2z9l26y0kzye4g8rdec.jpg" alt="Scarf" width="481" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The venue was literally crowded of Perl developers. With a ratio of 2/3 Britishers and 1/3 of foreigners.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ibpjutzmrcjko61131a.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ibpjutzmrcjko61131a.jpg" alt="Crowded Perl Devs" width="627" height="474"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It started with a keynote from Julien:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmfxpg5qi5fr6p13naqw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmfxpg5qi5fr6p13naqw.jpg" alt="Keynote Julien" width="800" height="505"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I attended the very much awaited talk from Paul Evans, on Perl syntax, CPAN experiments and Perl future:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzf82q43su05ebzoq57r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkzf82q43su05ebzoq57r.jpg" alt="Talk Paul Evans" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In front of this talk was the another very much awaited talk "Perl Diver" that I had to miss (but I managed to steal a picture from it).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5glvch6czu4palztjg7.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz5glvch6czu4palztjg7.jpg" alt="Perl Diver" width="640" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then it continued with a Raku talk ("RakuDoc v2").&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtgdhlix5mca7dgyvvmh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbtgdhlix5mca7dgyvvmh.jpg" alt="Rakudoc" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I liked this talk.&lt;/p&gt;

&lt;p&gt;Then the usual "TPF updates" with half of presentation and half of questions.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthd01xt5slkluppa2vue.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthd01xt5slkluppa2vue.jpg" alt="TPF" width="640" height="347"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;One a side (TPF) note, &lt;a href="https://github.com/makotots" rel="noopener noreferrer"&gt;Makoto Nozaki&lt;/a&gt; took a recent great initiative with a 3 parts blog posts, doing a big gift to the foundation and everyone, be sure to read them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blogs.perl.org/users/makoto_nozaki/2024/09/things-ive-learned-serving-on-the-board-of-the-perl-foundation.html" rel="noopener noreferrer"&gt;Things I've Learned Serving on the Board of The Perl Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.perl.org/users/makoto_nozaki/2024/09/board-reflections-continued-experiences-with-the-perl-foundation.html" rel="noopener noreferrer"&gt;Board Reflections: Continued Experiences with The Perl Foundation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.perl.org/users/makoto_nozaki/2024/10/understanding-the-financials-of-the-perl-and-raku-foundation-tprf.html" rel="noopener noreferrer"&gt;Understanding the Financials of The Perl and Raku Foundation (TPRF)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This transparency is needed for solid trust in our foundation. It's very much welcome and breaks some relative opacity (not on purpose) of the foundation. So once again thank you Makoto!&lt;/p&gt;

&lt;p&gt;Then, a talk that I would never miss, OpenTelemetry from José Joaquín  (JJ) Atria. Never deceived by a talk from JJ Atria!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76og67pk2tgo7a43mbva.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F76og67pk2tgo7a43mbva.jpg" alt="OpenTelemetry" width="640" height="480"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The picture does not render it, but small room was so full that organizers had to refuse people to enter (but by luck I arrived earlier).&lt;/p&gt;

&lt;p&gt;And it was already half of the day track...&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79zgxjy8qdtkypxptlop.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F79zgxjy8qdtkypxptlop.jpg" alt="Half Way" width="598" height="1955"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Went at hotel for lunch and talk preparations. My talk rehearsals took longer than expected and I missed first talks of the afternoon 😢 and also missed the CPAN Security BoF 😢 that was in parallel.&lt;/p&gt;

&lt;p&gt;Still was able to attend a later talk about security (&lt;strong&gt;Meterian&lt;/strong&gt;)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fcr3idv625mlty9jwq5.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3fcr3idv625mlty9jwq5.jpg" alt="Meterian" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And take a moment in a room to work closer with Sebastien, Olaf And Leo (in the common space).&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2ll8a75ptgnx2aa3ozl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx2ll8a75ptgnx2aa3ozl.jpg" alt="Relax LPW 2024" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And finally we reached the lightning talks, maybe the activity that I enjoy the most in conferences. I delivered a little talk ("This is a camel") and  listened to others (Paul about &lt;a href="https://metacpan.org/dist/App-sdview" rel="noopener noreferrer"&gt;sdview&lt;/a&gt;, Tux about &lt;a href="https://metacpan.org/pod/DBI" rel="noopener noreferrer"&gt;DBI&lt;/a&gt;, Dave about &lt;a href="https://perlschool.com/" rel="noopener noreferrer"&gt;Perl School&lt;/a&gt; etc...) &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvp23ip5pyvp7pik8n2c.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmvp23ip5pyvp7pik8n2c.jpg" alt="Dave Lightning Talk" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Also, Theo Van Hoesel did a tribute to Abe Timmerman, it was very poignant when the whole room did a minute of silence. &lt;/p&gt;

&lt;p&gt;The conference ended with a keynote from Lee Jo, revealing the undercover of such event organization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visiting around the venue
&lt;/h2&gt;

&lt;p&gt;The venue location was nice.&lt;/p&gt;

&lt;p&gt;I walked around it, first reaching Bunhill Fiels cemetery where I relaxed for a while. The place, even being a cemetery, is more like a little garden, and it reigns a absolute calm, it's very pleasant.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0y8tgxhwuzhnb7yc3pss.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0y8tgxhwuzhnb7yc3pss.jpg" alt="Bunhill Fields" width="480" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;William Blake has its tomb here.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0wjuxjp3qio7hg1eas01.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0wjuxjp3qio7hg1eas01.jpg" alt="William Blake" width="480" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I went to the south to reach Saint Paul's Church. My first impression was that it is gigantic (and beautiful).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnky2aenyi2rk8xo86236.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnky2aenyi2rk8xo86236.jpg" alt="Saint Paul" width="516" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Another very beautiful place is Guildhall library.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi72iga0g16fclrwo3sbt.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi72iga0g16fclrwo3sbt.jpg" alt="Guildhall" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Totally by luck, I discovered a Banksy fresque (the "Banksy Basquiat") in Golden Lane, when going back to hotel after pub on Friday!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zm7nm2a8yg63ic94p6o.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0zm7nm2a8yg63ic94p6o.jpg" alt="Banksy Basquiat" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Before the event, we enjoyed a beer at Craft Beer (45 min from venue,  just good for me). A typical pub with a large choice of beers.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdscl2599hyqr9prlvjw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkdscl2599hyqr9prlvjw.jpg" alt="Beer Craft" width="480" height="640"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;After the event, I even more enjoyed the event at "The Eagle" pub (more people and hello 👋 Stig, Rolf, Salve, Robert...)&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnk46tbyjnszyafpc081v.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnk46tbyjnszyafpc081v.jpg" alt="The Eagle" width="640" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Fun
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The accent problem
&lt;/h3&gt;

&lt;p&gt;It's not a surprise but in UK, as a French guy, and more of that from South of France, I have an accent problem.&lt;br&gt;
It means people don't catch some of my words, even some simplistic ones like "London", "City Road" or "Burden". And worst, my nickname "tib".&lt;br&gt;
Second, it means that my comprehension is very reduced because of British accent (and native using more vocabulary).&lt;/p&gt;

&lt;h3&gt;
  
  
  UK is same but different
&lt;/h3&gt;

&lt;p&gt;First UK is not anymore in EU, so the need of passport.&lt;br&gt;
Second, UK is geographically aligned to where I live, but not aligned  as a timezone.&lt;br&gt;
Third, of course I forgot about the different power supply format and had to buy an adapter.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cultural shift
&lt;/h3&gt;

&lt;p&gt;London, at least the area where I stayed, was full of good energy.&lt;br&gt;
You really feel the "go to pub for a beer" cultural habit (when we do "apero" in France), and my hotel had installed a fixed beer bottle opener on a wall. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1zz1q6ewfwm7iflqmihc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1zz1q6ewfwm7iflqmihc.jpg" alt="Bottle Opener" width="480" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Errol Court / Error Count
&lt;/h3&gt;

&lt;p&gt;Do you like me read "Error Count"?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1wzrq24pgz0fga2h074.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb1wzrq24pgz0fga2h074.jpg" alt="Errol Court" width="480" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Too long time spent as a programmer...&lt;/p&gt;

&lt;h3&gt;
  
  
  Red Hat
&lt;/h3&gt;

&lt;p&gt;I finally found where we can buy &lt;del&gt;Red&lt;/del&gt; Fedora Hats!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzt1eq00z0l0e97xcqntk.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzt1eq00z0l0e97xcqntk.jpg" alt="Red Hats" width="480" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Free library
&lt;/h3&gt;

&lt;p&gt;A very picturesque free library&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumengihbw2jix7gwt2mo.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fumengihbw2jix7gwt2mo.jpg" alt="Free Library" width="480" height="640"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Perl Monks Pub
&lt;/h3&gt;

&lt;p&gt;Is it where Perl Monks gathers at end of day?&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvj0yujzfmxsusfd4t1kg.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvj0yujzfmxsusfd4t1kg.jpg" alt="Monks" width="409" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Going to such even was such a lot of fun, socializing and charging battery that I'm more than grateful to have been part of it. I really feel like "privileged". &lt;/p&gt;

&lt;p&gt;Again, it was a a brilliant success, thanks to organizers, speakers, attendees and all. &lt;/p&gt;

&lt;p&gt;See you again and "Long live to Perl!"&lt;/p&gt;

</description>
      <category>perl</category>
      <category>opensource</category>
      <category>conference</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>App::cpx</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Thu, 05 Sep 2024 17:56:04 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/appcpx-1ilf</link>
      <guid>https://dev.to/thibaultduponchelle/appcpx-1ilf</guid>
      <description>&lt;p&gt;(Picture from &lt;a href="https://unsplash.com/@erdaest" rel="noopener noreferrer"&gt;Erda Estremera&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;I'm sometimes doing Front End dev.&lt;/p&gt;

&lt;p&gt;Or sometimes the best tool for the job is only installable via &lt;code&gt;npm&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;It can be scripts to "uglify" or "beautify" css/js, optimize svg files (&lt;code&gt;svgo&lt;/code&gt;) or clients to SaaS platforms (&lt;code&gt;wrangler&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Actually, it's not that important if it's part of javascript ecosystem, what I want is just to execute them!&lt;/p&gt;

&lt;p&gt;The usual process: I start testing it locally, quickly and in a "trash-able" way, then install in a continuous integration pipeline, then forget 😄&lt;/p&gt;

&lt;p&gt;So far, do you feel some resemblance with some periodical process or yours? &lt;/p&gt;

&lt;p&gt;For this purpose, I'm using frequently &lt;a href="https://www.npmjs.com/package/npx" rel="noopener noreferrer"&gt;npx&lt;/a&gt; (now part of &lt;a href="https://www.npmjs.com/package/npm" rel="noopener noreferrer"&gt;npm&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Do you see now where I'm going to? 🤔&lt;/p&gt;

&lt;h2&gt;
  
  
  App::cpx, a &lt;code&gt;npx&lt;/code&gt;-like for CPAN
&lt;/h2&gt;

&lt;p&gt;I just uploaded &lt;a href="https://metacpan.org/pod/App::cpx" rel="noopener noreferrer"&gt;App::cpx&lt;/a&gt; for this purpose.&lt;/p&gt;

&lt;p&gt;Give &lt;code&gt;cpx&lt;/code&gt; a binary and it will find it in CPAN, install it for you then execute it.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cpx hr -s 40
🎯 Found [bin/hr]
📦 Release to install [https://cpan.metacpan.org/authors/id/W/WO/WOLDRICH/App-term-hr-0.11.tar.gz]
🔧 Will install into /home/tib/cpx-test/.cpx
DONE install Term-ExtendedColor-0.504
DONE install App-term-hr-0.11
2 distributions installed.
=======================================
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(purpose of &lt;code&gt;hr&lt;/code&gt; is to draw horizontal lines)&lt;/p&gt;

&lt;p&gt;Or another example with &lt;code&gt;mlocate&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$  cpx mlocate Redis Moo
🎯 Found [bin/mlocate]
📦 Release to install [https://cpan.metacpan.org/authors/id/C/CE/CELOGEEK/App-Module-Locate-0.7.tar.gz]
🔧 Will install into /home/tib/cpx-test/.cpx
DONE install Module-Locate-1.80
DONE install Module-Build-0.4234
DONE install App-Module-Locate-0.7
3 distributions installed.
/usr/local/share/perl/5.34.0/Redis.pm
/usr/local/share/perl/5.34.0/Moo.pm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;mlocate&lt;/code&gt; is a script that lives in &lt;a href="https://metacpan.org/pod/App::Module::Locate" rel="noopener noreferrer"&gt;App::Module::Locate&lt;/a&gt;. It's an utility to "find a module by its name".&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cpx&lt;/code&gt; saves you from some frustrating tries: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is it &lt;code&gt;cpm install App::mlocate&lt;/code&gt;? &lt;/li&gt;
&lt;li&gt;OK try capitalize &lt;code&gt;cpm install App::Mlocate&lt;/code&gt;, I know some authors do that&lt;/li&gt;
&lt;li&gt;Hmm maybe simply &lt;code&gt;locate&lt;/code&gt; like this &lt;code&gt;cpm install App::locate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Oh wait, capitalize &lt;code&gt;cpm install App::Locate&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Raaah! Stop it and open &lt;a href="https://metacpan.org/" rel="noopener noreferrer"&gt;MetaCPAN&lt;/a&gt; and search&lt;/li&gt;
&lt;li&gt;OK it's &lt;code&gt;cpm install App::Module::Locate&lt;/code&gt; but now it's installed locally, how do I set local::lib? Maybe I should install globally&lt;/li&gt;
&lt;li&gt;Hmm I will install globally even if it can be a bit dirty for a one time use&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And at start were you 100% sure &lt;code&gt;mlocate&lt;/code&gt; was something that exists in CPAN? 🤔&lt;/p&gt;

&lt;p&gt;&lt;code&gt;cpx&lt;/code&gt; saves you from this pain and hides you the internals of installing the module, if missing.&lt;/p&gt;

&lt;p&gt;When running &lt;code&gt;cpx&lt;/code&gt; again, it won't reinstall but reuse the already installed binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cpx mlocate Redis Moo
⚓ Found executable already installed
/usr/local/share/perl/5.34.0/Redis.pm
/usr/local/share/perl/5.34.0/Moo.pm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Your companion for Continuous Integration
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ curl -sL https://git.io/cpm | sudo perl - install -g App::cpx
$ cpx hr -s 40
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In GitHub Actions, it would give something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name &lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test cpx&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;push&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;cpx&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;

    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Install cpx&lt;/span&gt;
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;curl -sL https://git.io/cpm | sudo perl - install -g App::cpx&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cpx hr&lt;/span&gt; 
        &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;cpx hr -s &lt;/span&gt;&lt;span class="m"&gt;40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And see the result:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizg4dnzqsldthd36niad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fizg4dnzqsldthd36niad.png" alt="GitHub Action cpx" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;As of now, the code for this small utility is &lt;em&gt;ridiculously&lt;/em&gt; simple (&lt;a href="https://metacpan.org/release/CONTRA/App-cpx-0.03/source/bin/cpx" rel="noopener noreferrer"&gt;source&lt;/a&gt;), but sometimes good ideas (yes, all glory to myself 😀) are simple to implement.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.olafalders.com/2024/08/28/i-am-still-lazy/" rel="noopener noreferrer"&gt;I'm still lazy&lt;/a&gt; - Great module discussed here and I stole the idea of using &lt;code&gt;App::cpm::CLI&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>perl</category>
      <category>cpan</category>
      <category>npx</category>
    </item>
    <item>
      <title>SlapBirdAPM with Mojolicious</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Tue, 27 Aug 2024 11:14:25 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/mojolicious-slapbirdapm-4cde</link>
      <guid>https://dev.to/thibaultduponchelle/mojolicious-slapbirdapm-4cde</guid>
      <description>&lt;p&gt;This is my quick walk-through exploration of &lt;a href="https://slapbirdapm.com/" rel="noopener noreferrer"&gt;SlapBirdAPM&lt;/a&gt; with my Perl web framework of choice (&lt;a href="https://www.mojolicious.org/" rel="noopener noreferrer"&gt;Mojolicious&lt;/a&gt; of course!)&lt;/p&gt;

&lt;h3&gt;
  
  
  Setup Mojolicious Web App
&lt;/h3&gt;

&lt;p&gt;Install Mojolicious:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cpanm Mojolicious
--&amp;gt; Working on Mojolicious
Fetching http://www.cpan.org/authors/id/S/SR/SRI/Mojolicious-9.38.tar.gz ... OK
Configuring Mojolicious-9.38 ... OK
Building and testing Mojolicious-9.38 ... OK
Successfully installed Mojolicious-9.38 (upgraded from 9.32)
1 distribution installed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generate project:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mkdir webapp
$ cd webapp
$ mojo generate lite-app bird
  [exist] /home/tib/Code/webapp
  [write] /home/tib/Code/webapp/bird
  [chmod] /home/tib/Code/webapp/bird 744
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;morbo bird
Web application available at http://127.0.0.1:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And check in your browser &lt;a href="http://127.0.0.1:3000/" rel="noopener noreferrer"&gt;http://127.0.0.1:3000/&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create SlapBirdAPM account
&lt;/h2&gt;

&lt;p&gt;Go visit &lt;a href="https://www.slapbirdapm.com" rel="noopener noreferrer"&gt;SlapBirdAPM&lt;/a&gt;:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn3b9am7io9k3ua5stny.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzn3b9am7io9k3ua5stny.png" alt="Image description" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Login with GitHub:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde5jkkbl7e1rvty0ugxe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fde5jkkbl7e1rvty0ugxe.png" alt="Image description" width="190" height="48"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create new app:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzv3iq8ghxvrhbomcczmt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzv3iq8ghxvrhbomcczmt.png" alt="Image description" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And get your API Key:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1ld3h64t3vxe5s36woz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1ld3h64t3vxe5s36woz.png" alt="Image description" width="800" height="334"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Install SlapBirdAPM in Web App
&lt;/h2&gt;

&lt;p&gt;First install Mojolicious plugin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cpanm SlapbirdAPM::Agent::Mojo
&lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Working on SlapbirdAPM::Agent::Mojo
Fetching http://www.cpan.org/authors/id/R/RA/RAWLEYFOW/SlapbirdAPM-Agent-Mojo-0.005.tar.gz ... OK
Configuring SlapbirdAPM-Agent-Mojo-0.005 ... OK
&lt;span class="o"&gt;==&amp;gt;&lt;/span&gt; Found dependencies: Const::Fast, System::Info
&lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Working on Const::Fast
Fetching http://www.cpan.org/authors/id/L/LE/LEONT/Const-Fast-0.014.tar.gz ... OK
Configuring Const-Fast-0.014 ... OK
Building and testing Const-Fast-0.014 ... OK
Successfully installed Const-Fast-0.014
&lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Working on System::Info
Fetching http://www.cpan.org/authors/id/H/HM/HMBRAND/System-Info-0.065.tgz ... OK
Configuring System-Info-0.065 ... OK
Building and testing System-Info-0.065 ... OK
Successfully installed System-Info-0.065
Building and testing SlapbirdAPM-Agent-Mojo-0.005 ... OK
Successfully installed SlapbirdAPM-Agent-Mojo-0.005
3 distributions installed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And add &lt;code&gt;plugin SlapbirdAPM;&lt;/code&gt; to your web app. &lt;/p&gt;

&lt;p&gt;Our full application now looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight perl"&gt;&lt;code&gt;&lt;span class="c1"&gt;#!/usr/bin/env perl&lt;/span&gt;
&lt;span class="k"&gt;use&lt;/span&gt; &lt;span class="nn"&gt;Mojolicious::&lt;/span&gt;&lt;span class="nv"&gt;Lite&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nv"&gt;signatures&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nv"&gt;plugin&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;SlapbirdAPM&lt;/span&gt;&lt;span class="p"&gt;';&lt;/span&gt;

&lt;span class="nv"&gt;get&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="p"&gt;'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="k"&gt;sub &lt;/span&gt;&lt;span class="p"&gt;($c) {&lt;/span&gt;
  &lt;span class="nv"&gt;$c&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;template&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;index&lt;/span&gt;&lt;span class="p"&gt;');&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nv"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nv"&gt;start&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="cp"&gt;__DATA__

@@ index.html.ep
% layout 'default';
% title 'Welcome';
&amp;lt;h1&amp;gt;Welcome to the Mojolicious real-time web framework!&amp;lt;/h1&amp;gt;

@@ layouts/default.html.ep
&amp;lt;!DOCTYPE html&amp;gt;
&amp;lt;html&amp;gt;
  &amp;lt;head&amp;gt;&amp;lt;title&amp;gt;&amp;lt;%= title %&amp;gt;&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;
  &amp;lt;body&amp;gt;&amp;lt;%= content %&amp;gt;&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Test!
&lt;/h2&gt;

&lt;p&gt;Let's restart the application with the plugin and an API Key:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ export SLAPBIRDAPM_API_KEY=01ABCDEFGHIJKLMNOPKtest-app &amp;amp;&amp;amp; morbo bird
Web application available at http://127.0.0.1:3000
[2024-08-27 11:33:27.51107] [8402] [info] Slapbird configured and active on this application.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use your favorite browser to browse &lt;a href="http://127.0.0.1:3000" rel="noopener noreferrer"&gt;http://127.0.0.1:3000&lt;/a&gt; or &lt;code&gt;curl http://127.0.0.1:3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Your activity will immediately reflect in your SlapBirdAPM portal &lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3mxp69pekqyvglnqu5p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa3mxp69pekqyvglnqu5p.png" alt="Image description" width="800" height="705"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  We're done! 😀
&lt;/h2&gt;

</description>
      <category>perl</category>
      <category>mojolicious</category>
      <category>monitoring</category>
    </item>
    <item>
      <title>3 original Perl CPAN social concepts</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Fri, 23 Aug 2024 11:00:30 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/3-original-perl-cpan-social-concepts-52ef</link>
      <guid>https://dev.to/thibaultduponchelle/3-original-perl-cpan-social-concepts-52ef</guid>
      <description>&lt;p&gt;(Picture from &lt;a href="https://www.pexels.com/fr-fr/@eren-li/" rel="noopener noreferrer"&gt;Eren Li&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  CPAN Lieutenants
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp00z9ilo7aj6ch6dak10.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp00z9ilo7aj6ch6dak10.jpg" alt="Man army" width="800" height="1198"&gt;&lt;/a&gt;&lt;br&gt;
(Picture from &lt;a href="https://www.pexels.com/fr-fr/@alex-andrews-271121/" rel="noopener noreferrer"&gt;Alex Andrews&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I often mentally represent modules "per namespace" (I explained it &lt;a href="https://dev.to/thibaultduponchelle/browse-cpan-modules-per-namespaces-6p"&gt;here&lt;/a&gt;) like in a tree where we have a node "JSON" that contains all JSON related (&lt;code&gt;JSON:PP&lt;/code&gt;, &lt;code&gt;JSON:XS&lt;/code&gt;, etc...).&lt;/p&gt;

&lt;p&gt;I know it's partially wrong, there's no such "order" and for instance &lt;code&gt;Cpanel::JSON::XS&lt;/code&gt; is out of this hierarchy but still well a JSON thing. But most of the time, this mental model works.&lt;/p&gt;

&lt;p&gt;If we care about the quality of the Perl ecosystem, we should try to find a solution to &lt;em&gt;fight the CPAN inertia&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Indeed, what happen when a module is broken and maintainer is inactive/unresponsive?&lt;/p&gt;

&lt;p&gt;Some important modules can be considered a bit a "common good" (is it wrong to think like this?) but we need also to respect the ownership and copyright.&lt;/p&gt;

&lt;p&gt;So here is the concept of CPAN Lieutenants. &lt;/p&gt;

&lt;p&gt;For some very specific cases (e.g. a module does not install at all), I think we should be able to "force apply" a patch to a module. &lt;br&gt;
Boundaries should be clear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Purpose is to fix a broken module&lt;/li&gt;
&lt;li&gt;Fix is relatively simple (to review), blocker is about releasing it&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In practice, it would mean to let few trusted members to manage a dedicated &lt;strong&gt;sub-tree&lt;/strong&gt; of CPAN namespaces. And in extreme case, after some formal review, discussion and notifications, these people would be able to &lt;strong&gt;push&lt;/strong&gt; a fix to CPAN (= publish a new release). &lt;/p&gt;

&lt;p&gt;It would be a bit like these people, thanks to their trust and expertise, have implicit co-maintainer rights (&lt;code&gt;CO-MAINT&lt;/code&gt; in CPAN jargon) on a topic (e.g. "Alien" modules, or "XML").&lt;/p&gt;

&lt;p&gt;It won't imply these "lieutenants" to maintain these modules neither the ceremonial of asking (and eventually being refused) co-maintainer permissions. And don't hear what I did not say: I do not criticize PAUSE operating model for that.&lt;/p&gt;

&lt;p&gt;The name is inspired from Linux kernel development with "lieutenants" that have responsibility on sub parts of the kernel.&lt;/p&gt;

&lt;p&gt;Also we need to respect authors and their rights. It's a matter of finding the right balance so everybody wins. That's why we should be careful with boundaries and rules (e.g. a minimum number of lieutenants approvals), the same way PAUSE admins are careful with module ownership.&lt;/p&gt;

&lt;p&gt;If it proves to be incompatible with license, we could consider a layer of patches, inspired by what do several Linux distributions (see for instance &lt;code&gt;Locally applied patches:&lt;/code&gt; section under Debian/Ubuntu &lt;code&gt;perl -V&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;It proved to work (for inertia and licensing) but I would prefer to avoid this, first because it's generally considered good practice "to push patch upstream" when possible, also because it would add complexity and "yet another layer of patches":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPAN release contains base delivery&lt;/li&gt;
&lt;li&gt;GitHub locally applied patches (merged commits in GitHub that never reached CPAN)&lt;/li&gt;
&lt;li&gt;CPAN locally applied patches ⚠️&lt;/li&gt;
&lt;li&gt;OS Distribution locally applied patches &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But on the other hand, the CPAN local patch layer approach has advantage of managing the storage of patch (since &lt;em&gt;inertia&lt;/em&gt; very likely also concerns code forge...)&lt;/p&gt;

&lt;p&gt;I don’t know the exact solution, but I think there’s something to do 😄&lt;/p&gt;

&lt;p&gt;Actually, a recent discussion on &lt;a href="https://www.nntp.perl.org/group/perl.perl5.porters/2024/08/msg268685.html" rel="noopener noreferrer"&gt;perl development mailing list&lt;/a&gt; ("p5p") has highlighted the same need and discussed some close proposals. I swear I did not copied! 😀 But it decided me to post this!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;edit 1&lt;/strong&gt;: a CPAN module security vulnerability is also a valid reason to want this and I see that CPANSec folks have similar concern, see &lt;a href="https://github.com/orgs/CPAN-Security/projects/11/views/1" rel="noopener noreferrer"&gt;CPAN Security Patch Tooling&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;edit 2&lt;/strong&gt;: &lt;a href="https://perldoc.perl.org/perlpolicy#A-Social-Contract-about-Artistic-Control" rel="noopener noreferrer"&gt;A Social Contract about Artistic Control&lt;/a&gt; - perl core statement (applies to modules added to perl core distribution)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;edit 3&lt;/strong&gt;: &lt;a href="https://metacpan.org/pod/CPAN#Configuration-for-individual-distributions-(Distroprefs)" rel="noopener noreferrer"&gt;DistroPrefs&lt;/a&gt; - CPAN.pm patching facility&lt;/p&gt;
&lt;h2&gt;
  
  
  CPAN Mentors
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsueg2jvq81vir1e9vgbh.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsueg2jvq81vir1e9vgbh.jpg" alt="Helping blind" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Picture from &lt;a href="https://www.pexels.com/@thirdman/" rel="noopener noreferrer"&gt;Thirdman&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I think &lt;a href="https://dev.to/thibaultduponchelle/the-difficult-road-to-perl-3o5f"&gt;the barrier of entry of Perl is high&lt;/a&gt; but with a compatible mindset, once someone get in, Perl (and CPAN) produces often long time involved members.&lt;/p&gt;

&lt;p&gt;These days, there's no so much new entrants to the CPAN. &lt;/p&gt;

&lt;p&gt;We should optimize for retention (and unity).&lt;/p&gt;

&lt;p&gt;The idea of CPAN Mentors is to offer help to newcomers, once they pass the entry door, something that we can monitor from &lt;a href="https://www.nntp.perl.org/group/perl.modules/" rel="noopener noreferrer"&gt;perl modules mailing list&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let’s say after 3 weeks, if a new CPAN AUTHOR has not published any module, someone can drop a little mail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Hello new CPAN AUTHOR,

I noticed you recently registered to PAUSE/CPAN, congratulation for this.
I also noticed that you did not publish any module, yet.
I don't know your level of expertise,
maybe you would benefit from some guidance?
I'm reaching you to kindly offer my help :) 
Feel free to ask me questions or we can maybe even accommodate some pairing via a call.

Regards.

Tib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I think the number of new monthly CPAN registrations would permit it, and reinforce the community feeling that always been a strength of Perl.&lt;/p&gt;

&lt;h2&gt;
  
  
  CPAN Guards
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkwc4tis671ums68rb0z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffkwc4tis671ums68rb0z.jpg" alt="Guard" width="800" height="1200"&gt;&lt;/a&gt;&lt;br&gt;
(Picture from &lt;a href="https://www.pexels.com/@wdnet/" rel="noopener noreferrer"&gt;PhotoMix Company&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;This concept joins actually a bit the CPAN Lieutenants concept.&lt;/p&gt;

&lt;p&gt;The idea is to watch (and contribute to) a limited set of critical modules (depended by several modules or in Perl jargon: those high in the &lt;a href="http://neilb.org/2015/12/22/cpan-river-water-quality.html" rel="noopener noreferrer"&gt;CPAN river&lt;/a&gt;) and help keeping  them in good quality and portable.&lt;/p&gt;

&lt;p&gt;This is actually not a new concept (forgive me the "original" in title), some people (CPANTesters and perl core developers) are already on it (see for instance &lt;a href="https://www.nntp.perl.org/group/perl.qa/2017/03/msg13747.html" rel="noopener noreferrer"&gt;BBC and CPAN River 5000&lt;/a&gt;). &lt;/p&gt;

&lt;p&gt;So it's more about formalizing this under a fancy name.&lt;/p&gt;

&lt;p&gt;CPAN Guards concept fits well the Perl folks that are more contributors than maintainers and prefer to jump often from modules to modules.&lt;/p&gt;

&lt;p&gt;At some point it's also related to the &lt;a href="https://www.perl.com/pub/2005/01/13/phalanx.html/" rel="noopener noreferrer"&gt;Perl Phalanx initiative&lt;/a&gt; (more focused on tests)&lt;/p&gt;

&lt;h2&gt;
  
  
  Some reading and watching
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blogs.perl.org/users/brendan_byrd/2013/03/the-four-major-problems-with-cpan.html" rel="noopener noreferrer"&gt;The Four Major Problems with CPAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.perl.org/users/neilb/2013/03/dont-release-experiments-to-cpan.html" rel="noopener noreferrer"&gt;Don't release experiments to CPAN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qa.perl.org/phalanx/" rel="noopener noreferrer"&gt;Perl Phalanx Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.perl.com/pub/2005/01/13/phalanx.html/" rel="noopener noreferrer"&gt;What is Perl Phalanx Project&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.nntp.perl.org/group/perl.qa/2017/03/msg13747.html" rel="noopener noreferrer"&gt;BBC testing from upriver downwards&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.youtube.com/watch?v=9J_9WQ_haDs" rel="noopener noreferrer"&gt;Whither Perl? - Olaf Alders - TPRC 2023&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://neilb.org/2017/05/16/missing-metadata-files.html" rel="noopener noreferrer"&gt;Fix distributions without META file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://neilb.org/2015/04/24/cpan-downstream-testing.html" rel="noopener noreferrer"&gt;Downstream CPAN Smoke Testing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>perl</category>
      <category>opensource</category>
    </item>
    <item>
      <title>The perl.fish experiment</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Thu, 22 Aug 2024 08:06:37 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/the-perlfish-experiment-6lm</link>
      <guid>https://dev.to/thibaultduponchelle/the-perlfish-experiment-6lm</guid>
      <description>&lt;p&gt;(Picture from &lt;a href="https://www.pexels.com/@chokniti-khongchum-1197604/" rel="noopener noreferrer"&gt;Chokniti Khongchum&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;I like &lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;, it provides a nice little and simple free hosting. I also like their &lt;a href="https://en.wikipedia.org/wiki/Static_site_generator" rel="noopener noreferrer"&gt;static site generators&lt;/a&gt; (SSG) companions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://gohugo.io/" rel="noopener noreferrer"&gt;Hugo&lt;/a&gt; - used by example for &lt;a href="https://perl.com" rel="noopener noreferrer"&gt;perl.com&lt;/a&gt; (&lt;a href="https://github.com/perladvent/perldotcom" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://jekyllrb.com/" rel="noopener noreferrer"&gt;Jekyll&lt;/a&gt; - that I used for &lt;a href="https://thibaultduponchelle.github.io/the-ephemeral-miniconf/" rel="noopener noreferrer"&gt;The ephemeral miniconf&lt;/a&gt; (&lt;a href="https://github.com/thibaultduponchelle/the-ephemeral-miniconf" rel="noopener noreferrer"&gt;source&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;About 3 years ago, I spent some time experimenting with more advanced Hugo and Jekyll concepts (&lt;a href="https://jekyllrb.com/docs/variables/" rel="noopener noreferrer"&gt;variables&lt;/a&gt;, &lt;a href="https://jekyllrb.com/docs/configuration/" rel="noopener noreferrer"&gt;config&lt;/a&gt;, &lt;a href="https://jekyllrb.com/docs/layouts/" rel="noopener noreferrer"&gt;layouts&lt;/a&gt;, &lt;a href="https://jekyllrb.com/docs/includes/" rel="noopener noreferrer"&gt;includes&lt;/a&gt;, ...). &lt;/p&gt;

&lt;p&gt;I wanted to produce a modular website with content separated from a complex structure, using parameterized includes. &lt;/p&gt;

&lt;p&gt;The experiment also contained a commenting system powered by GitHub issues (yes!) along with a blog (it’s Jekyll after all!). &lt;br&gt;
I used this effort to compare Hugo and Jekyll features (Jekyll won for me). &lt;br&gt;
Then I continued by adding some content, syntax highlighting and various other things...&lt;/p&gt;

&lt;p&gt;But why I tagged this post with &lt;code&gt;#perl&lt;/code&gt; tag? &lt;/p&gt;

&lt;p&gt;Because ultimately the website content is about Perl, with some generic informations and links that I tried to present in a bit "catchy" way.&lt;/p&gt;

&lt;p&gt;After some time, I let this website aging somewhere in my GitHub private space. &lt;/p&gt;

&lt;p&gt;Nobody asked for it, but this is finally it! &lt;/p&gt;

&lt;h1&gt;
  
  
  🐟 &lt;a href="https://perl.fish/" rel="noopener noreferrer"&gt;perl.fish&lt;/a&gt; 🐠
&lt;/h1&gt;

&lt;p&gt;It’s public but I have zero plan for this. &lt;/p&gt;

&lt;p&gt;And about the name "perl-dot-fish", I doubt I can give any explanation except that I consider that "it sounds good".&lt;/p&gt;

&lt;h1&gt;
  
  
  A little preview
&lt;/h1&gt;

&lt;p&gt;For the very most lazy 😀, here is a little preview:&lt;br&gt;
&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmatdwqiqg7m2zr382pl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpmatdwqiqg7m2zr382pl.png" alt="Perl Fish Index" width="800" height="804"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s also looking good on mobile.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl52h2zuu8dguv3peg846.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl52h2zuu8dguv3peg846.png" alt="Perl Fish Mobile" width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: for the design skeleton, I started from &lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;rust-lang.org&lt;/a&gt; (license permits it), but it now has well diverged.&lt;/p&gt;

&lt;h2&gt;
  
  
  About the stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Registry: &lt;a href="https://www.identity.digital/" rel="noopener noreferrer"&gt;Identity Digital&lt;/a&gt; for the &lt;code&gt;.fish&lt;/code&gt; (I wanted to pick a not so common nTLD)&lt;/li&gt;
&lt;li&gt;Registrar: &lt;a href="https://www.ovhcloud.com" rel="noopener noreferrer"&gt;OVH&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DNS: &lt;a href="https://www.ovhcloud.com" rel="noopener noreferrer"&gt;OVH&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hosting: &lt;a href="https://pages.github.com/" rel="noopener noreferrer"&gt;GitHub Pages&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Framework: &lt;a href="https://jekyllrb.com/" rel="noopener noreferrer"&gt;Jekyll&lt;/a&gt; (SSG)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built using Jekyll &lt;a href="https://jekyllrb.com/docs/includes/" rel="noopener noreferrer"&gt;parameterized includes&lt;/a&gt;, to me it makes it both modular and a bit inelegant 😀 &lt;br&gt;
Website is easy to edit and the GitHub Pages setup &lt;a href="https://github.com/thibaultduponchelle/perlfish/actions" rel="noopener noreferrer"&gt;deploys on commit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Read the source at &lt;a href="https://github.com/thibaultduponchelle/perlfish" rel="noopener noreferrer"&gt;perlfish&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It’s and experiment, probably running for about a year. &lt;/p&gt;

&lt;h3&gt;
  
  
  🐟 &lt;a href="https://perl.fish" rel="noopener noreferrer"&gt;perl.fish&lt;/a&gt; 🐠
&lt;/h3&gt;

</description>
      <category>perl</category>
      <category>github</category>
      <category>jekyll</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Installing CPAN modules from git</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Tue, 21 May 2024 18:18:32 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/installing-cpan-modules-from-git-2mk0</link>
      <guid>https://dev.to/thibaultduponchelle/installing-cpan-modules-from-git-2mk0</guid>
      <description>&lt;p&gt;(picture from &lt;a href="https://www.pexels.com/fr-fr/@elevate/" rel="noopener noreferrer"&gt;elevate&lt;/a&gt;) &lt;/p&gt;

&lt;p&gt;For various reasons, you might want to install CPAN modules from a git repository. &lt;/p&gt;

&lt;p&gt;It can be because somehow a git repository is in advance against CPAN:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A fix was merged in official git repository but never released to CPAN&lt;/li&gt;
&lt;li&gt;A branch or a fork contains some valuable changes (this &lt;em&gt;very-little-but-absolutely-needed&lt;/em&gt; fix)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or it can be because the modules are actually not in CPAN: not public and not in a alternative/private CPAN (see Addendum) or simply they are only "experiments"&lt;/p&gt;

&lt;p&gt;But this post is not meant to discuss about the "why" but instead mainly share technically the "how" you could do that 😀&lt;/p&gt;

&lt;p&gt;I tested various syntax and installers and will share now some working examples.&lt;/p&gt;

&lt;p&gt;☝️ Before we continue, be sure to upgrade your installers (&lt;code&gt;App::cpm&lt;/code&gt; and &lt;code&gt;App::cpanminus&lt;/code&gt;) to their latest&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing from command line with &lt;code&gt;cpm&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Installing with &lt;code&gt;cpm&lt;/code&gt; is straighforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cpm &lt;span class="nb"&gt;install &lt;/span&gt;https://github.com/plack/Plack.git &lt;span class="nt"&gt;--verbose&lt;/span&gt;
33257 DONE fetch     &lt;span class="o"&gt;(&lt;/span&gt;0.971sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
33257 DONE configure &lt;span class="o"&gt;(&lt;/span&gt;0.033sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
33257 DONE resolve   &lt;span class="o"&gt;(&lt;/span&gt;0.031sec&lt;span class="o"&gt;)&lt;/span&gt; Clone -&amp;gt; Clone-0.46 &lt;span class="o"&gt;(&lt;/span&gt;from MetaDB&lt;span class="o"&gt;)&lt;/span&gt;
...
33257 DONE &lt;span class="nb"&gt;install&lt;/span&gt;   &lt;span class="o"&gt;(&lt;/span&gt;0.364sec&lt;span class="o"&gt;)&lt;/span&gt; URI-5.28
33257 DONE &lt;span class="nb"&gt;install&lt;/span&gt;   &lt;span class="o"&gt;(&lt;/span&gt;0.046sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
31 distributions installed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can also work the same with ssh &lt;code&gt;git@github.com:plack/Plack.git&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cpm &lt;span class="nb"&gt;install &lt;/span&gt;git@github.com:plack/Plack.git &lt;span class="nt"&gt;--verbose&lt;/span&gt;
64383 DONE fetch     &lt;span class="o"&gt;(&lt;/span&gt;2.498sec&lt;span class="o"&gt;)&lt;/span&gt; git@github.com:plack/Plack.git
64383 DONE configure &lt;span class="o"&gt;(&lt;/span&gt;0.039sec&lt;span class="o"&gt;)&lt;/span&gt; git@github.com:plack/Plack.git
...
64383 DONE &lt;span class="nb"&gt;install&lt;/span&gt;   &lt;span class="o"&gt;(&lt;/span&gt;0.045sec&lt;span class="o"&gt;)&lt;/span&gt; git@github.com:plack/Plack.git
31 distributions installed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing from command line with &lt;code&gt;cpanminus&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Installing with &lt;code&gt;cpanm&lt;/code&gt; is not harder:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cpanm https://github.com/plack/Plack.git
Cloning https://github.com/plack/Plack.git ... OK
&lt;span class="nt"&gt;--&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; Working on https://github.com/plack/Plack.git
...
Building and testing Plack-1.0051 ... OK
Successfully installed Plack-1.0051
45 distributions installed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Installing from &lt;code&gt;cpanfile&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;The correct syntax is the following (thank you &lt;a class="mentioned-user" href="https://dev.to/haarg"&gt;@haarg&lt;/a&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;requires &lt;span class="s1"&gt;'Plack'&lt;/span&gt;, git &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/plack/Plack.git'&lt;/span&gt;, ref &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'master'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;code&gt;ref =&amp;gt; 'master'&lt;/code&gt; is optional)&lt;/p&gt;

&lt;p&gt;And it would just work later with &lt;code&gt;cpm&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cpm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--verbose&lt;/span&gt;
Loading requirements from cpanfile...
33257 DONE fetch     &lt;span class="o"&gt;(&lt;/span&gt;0.971sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
33257 DONE configure &lt;span class="o"&gt;(&lt;/span&gt;0.033sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
33257 DONE resolve   &lt;span class="o"&gt;(&lt;/span&gt;0.031sec&lt;span class="o"&gt;)&lt;/span&gt; Clone -&amp;gt; Clone-0.46 &lt;span class="o"&gt;(&lt;/span&gt;from MetaDB&lt;span class="o"&gt;)&lt;/span&gt;
...
33257 DONE &lt;span class="nb"&gt;install&lt;/span&gt;   &lt;span class="o"&gt;(&lt;/span&gt;0.364sec&lt;span class="o"&gt;)&lt;/span&gt; URI-5.28
33257 DONE &lt;span class="nb"&gt;install&lt;/span&gt;   &lt;span class="o"&gt;(&lt;/span&gt;0.046sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
31 distributions installed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;⚠️ Despite being a &lt;code&gt;cpanfile&lt;/code&gt;, please note the use of &lt;code&gt;cpm&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing from &lt;code&gt;cpmfile&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Let's write our first &lt;a href="https://github.com/skaji/cpmfile" rel="noopener noreferrer"&gt;cpmfile&lt;/a&gt;  and save it as &lt;code&gt;cpm.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;prereqs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;runtime&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;requires&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;Plack&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;git&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://github.com/plack/Plack.git&lt;/span&gt;
        &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;master&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then it would just work with &lt;code&gt;cpm&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;cpm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--verbose&lt;/span&gt;
Loading requirements from cpm.yml...
66419 DONE resolve   &lt;span class="o"&gt;(&lt;/span&gt;0.000sec&lt;span class="o"&gt;)&lt;/span&gt; Plack -&amp;gt; https://github.com/plack/Plack.git@master &lt;span class="o"&gt;(&lt;/span&gt;from Custom&lt;span class="o"&gt;)&lt;/span&gt;
66419 DONE fetch     &lt;span class="o"&gt;(&lt;/span&gt;1.695sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
66419 DONE configure &lt;span class="o"&gt;(&lt;/span&gt;0.034sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
...
66419 DONE &lt;span class="nb"&gt;install&lt;/span&gt;   &lt;span class="o"&gt;(&lt;/span&gt;0.023sec&lt;span class="o"&gt;)&lt;/span&gt; https://github.com/plack/Plack.git
31 distributions installed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Beware of "incomplete" repositories
&lt;/h2&gt;

&lt;p&gt;Releases on CPAN are standardized and generally contain what is needed for installers, but distributions living in git repositories are more for development and very often not in a "ready to install" state.&lt;/p&gt;

&lt;p&gt;(thank you &lt;a class="mentioned-user" href="https://dev.to/karenetheridge"&gt;@karenetheridge&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;There's some limitations that you can encounter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;cpm&lt;/code&gt; would refuse to install if no META file is found (but &lt;code&gt;cpanm&lt;/code&gt; would be OK with that)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;cpm&lt;/code&gt; would refuse to install if no &lt;code&gt;Makefile.PL&lt;/code&gt; nor &lt;code&gt;Build.PL&lt;/code&gt; is found, except if &lt;a href="https://blogs.perl.org/users/shoichi_kaji1/2017/03/make-your-cpan-module-static-installable.html" rel="noopener noreferrer"&gt;x_static_install: 1&lt;/a&gt; is declared in META (&lt;code&gt;cpanm&lt;/code&gt; would still refuse) &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Should I mention the repositories with only a &lt;code&gt;dist.ini&lt;/code&gt;? (used by authors to generate everything else) &lt;/p&gt;

&lt;p&gt;And you would get similar trouble with distributions using &lt;code&gt;Module::Install&lt;/code&gt; but having not versioned it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You should probably not rely too much on "install from git" method but still, it can provide an handy way to install modules to test fixes or experiments. &lt;/p&gt;

&lt;p&gt;And now with this post you should have good examples of “how” you can achieve that.&lt;/p&gt;

&lt;h1&gt;
  
  
  Addendum
&lt;/h1&gt;

&lt;h2&gt;
  
  
  Alternative CPAN
&lt;/h2&gt;

&lt;p&gt;For alternative/private CPAN, several tools can come to your rescue: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/dist/CPAN-Mini/view/bin/minicpan" rel="noopener noreferrer"&gt;minicpan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/pod/App::opan" rel="noopener noreferrer"&gt;opan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://metacpan.org/pod/OrePAN2" rel="noopener noreferrer"&gt;OrePAN2&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://metacpan.org/dist/Pinto/view/bin/pinto" rel="noopener noreferrer"&gt;pinto&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is &lt;em&gt;not&lt;/em&gt; working (2024)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  cpanm with cpanfile
&lt;/h3&gt;

&lt;p&gt;Look at following &lt;code&gt;cpanfile&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;requires &lt;span class="s1"&gt;'Plack'&lt;/span&gt;, git &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'https://github.com/plack/Plack.git'&lt;/span&gt;, ref &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'master'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It is not well "honored" by &lt;code&gt;cpanminus&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Broken syntax
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;requires &lt;span class="s2"&gt;"MyExperimental::Module"&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"git://github.com/lestrrat/p5-MyExperimental-Module.git"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Resources
&lt;/h2&gt;

&lt;p&gt;(some of them are outdated)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://stackoverflow.com/questions/38603421/is-it-possible-to-require-a-git-repo-in-a-cpanfile-for-cpanm" rel="noopener noreferrer"&gt;Is it possible to require a git repo in a cpanfile for cpanm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blogs.perl.org/users/lestrrat/2013/03/the-main-problem-with-cpan-modules-on-github.html" rel="noopener noreferrer"&gt;The Main Problem With CPAN Modules On Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/miyagawa/cpanminus/issues/381" rel="noopener noreferrer"&gt;Private Git URLs &amp;amp; the --installdeps option&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/miyagawa/qahack-tokyo/issues/6" rel="noopener noreferrer"&gt;cpanfile: support git URL&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>perl</category>
      <category>git</category>
      <category>cpan</category>
    </item>
    <item>
      <title>[GitHub] Combine Pull Requests... For The Win!</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Thu, 09 Nov 2023 17:03:20 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/github-combine-pull-requests-for-the-win-kda</link>
      <guid>https://dev.to/thibaultduponchelle/github-combine-pull-requests-for-the-win-kda</guid>
      <description>&lt;p&gt;Picture from &lt;a href="https://unsplash.com/photos/brown-metal-train-rail-near-rocky-mountain-during-daytime-nShLC-WruxQ" rel="noopener noreferrer"&gt;Lance Grandahl&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In GitHub, whether you want to improve merge velocity, test interdependent changes or setup some sort of releasing model, you could be interested in grouping code changes.&lt;/p&gt;

&lt;p&gt;It is called "bundling" or "combining" pull requests.&lt;/p&gt;

&lt;p&gt;It allows multiple pull requests to be built and tested together (in CI) and qualified together (e.g. pre-production deployment with shadow traffic).&lt;/p&gt;

&lt;p&gt;In order to achieve this easily, you would need some automation. You're lucky, I'm going to share an elegant solution to solve this.&lt;/p&gt;

&lt;p&gt;(before we continue, also think about &lt;a href="https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/configuring-pull-request-merges/managing-a-merge-queue" rel="noopener noreferrer"&gt;GitHub merge queues&lt;/a&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo!
&lt;/h2&gt;

&lt;p&gt;I have 2 pull requests (from forks) targeting &lt;code&gt;main&lt;/code&gt;. They have passed minimal tests running on PR but I now would like to run &lt;em&gt;long&lt;/em&gt; and &lt;em&gt;consuming&lt;/em&gt; tests together. I also want to check they work well together without merging first one of them to &lt;code&gt;main&lt;/code&gt; (or to a release branch).&lt;/p&gt;

&lt;p&gt;My plan for the two following changes is to target the next release &lt;code&gt;v2.3&lt;/code&gt;, so I added a label &lt;code&gt;v2.3&lt;/code&gt; to the pull requests:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwq8ug4jdxl7p32ceutm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjwq8ug4jdxl7p32ceutm.png" alt="Label v2.3" width="384" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In order to trigger the bundle creation, I create the branch &lt;code&gt;v2.3&lt;/code&gt; from &lt;code&gt;main&lt;/code&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm80bhb955e05b2bnsfx8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm80bhb955e05b2bnsfx8.png" alt="Create branch v2.3" width="304" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once I finished to create branch, it already started to run an action:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn28c5ymg1baez2cet7n1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn28c5ymg1baez2cet7n1.png" alt="Combining" width="238" height="54"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After seconds, the run is finished:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1v7p47nqbp32d8qsgedx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1v7p47nqbp32d8qsgedx.png" alt="Combined" width="420" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A new pull requests (targeting &lt;code&gt;main&lt;/code&gt;) appeared: &lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6ogvak0e4ii2bs6b9dr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft6ogvak0e4ii2bs6b9dr.png" alt="New PR" width="345" height="60"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;The pull requests contains well the 2 pull requests changes (and branch &lt;code&gt;v2.3&lt;/code&gt; was updated):&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60k5wz4ak1pb1glpgsz4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F60k5wz4ak1pb1glpgsz4.png" alt="PR combined contains 2 PRs" width="800" height="795"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Later, when the bundled pull request will be merged, the combined pull requests will be automatically merged:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1zyygr8qzgunxouryffy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1zyygr8qzgunxouryffy.png" alt="Remotely merged" width="348" height="115"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Hello "combine-pull-requests"
&lt;/h2&gt;

&lt;p&gt;This magic can happen thanks to the great &lt;a href="https://github.com/bobvanderlinden/combine-pull-requests" rel="noopener noreferrer"&gt;combine-pull-requests&lt;/a&gt; 🎉&lt;/p&gt;

&lt;p&gt;Thank you &lt;a href="https://github.com/bobvanderlinden" rel="noopener noreferrer"&gt;Bob van der Linden&lt;/a&gt; for this 👍 🚀&lt;/p&gt;

&lt;p&gt;This GitHub action makes it deadly simple to combine multiple pull requests based on their labels.&lt;/p&gt;

&lt;p&gt;My preferred workflow consists in triggering bundle by branch creation (but you can use other events) then push and open a pull request to &lt;code&gt;main&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I know you want to see the code, please find below my setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Combine&lt;/span&gt;
&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;create&lt;/span&gt;

&lt;span class="na"&gt;permissions&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;write-all&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;combine&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.ref_type == 'branch'}}&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v3&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;fetch-depth&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;bobvanderlinden/combine-pull-requests@master&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.ref }}&lt;/span&gt;
          &lt;span class="na"&gt;repo-token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Push changes&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ad-m/github-push-action@master&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;github_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
          &lt;span class="na"&gt;branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.ref }}&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Create pull request&lt;/span&gt;
        &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;devops-infra/action-pull-request@v0.4.1&lt;/span&gt;
        &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
          &lt;span class="na"&gt;github_token&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.GITHUB_TOKEN }}&lt;/span&gt;
          &lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;[${{&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;github.event.ref&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;}}]&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;combined!"&lt;/span&gt;
          &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
          &lt;span class="na"&gt;source_branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ github.event.ref }}&lt;/span&gt;
          &lt;span class="na"&gt;target_branch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;main&lt;/span&gt;
          &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;.github/BUNDLE_TEMPLATE.md&lt;/span&gt;
          &lt;span class="na"&gt;label&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;bundle&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then you would probably put your build-test-deployment... at the end of this same workflow.&lt;/p&gt;

&lt;p&gt;Or you can leave the responsibility to another workflow. There's various manners to differentiate the bundle from other pull requests, for instance you can filter the label &lt;code&gt;bundle&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;To give you an example on how you would run/skip a workflow based on PR having the label &lt;code&gt;bundle&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;pull_request&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;types&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;opened&lt;/span&gt;
&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;run_if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;if&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;contains(github.event.pull_request.labels.*.name, 'bundle')&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;echo "This is a bundle, run more tests"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What else?
&lt;/h2&gt;

&lt;p&gt;What if I pushed a new commit to one of the pull request? Just need to delete and recreate branch &lt;code&gt;v2.3&lt;/code&gt;. Same procedure applies if I want to add or remove a pull request from the bundle.&lt;/p&gt;

&lt;p&gt;Customize to your needs, you can listen to more events than only &lt;code&gt;on: create&lt;/code&gt; 😇&lt;/p&gt;

&lt;p&gt;Another great thing with labels is that same pull request can belong to multiple bundles 🔥&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;You should design tooling and branching model that suits you the best, so maybe this is not for you, but I really like how elegant is this workflow and I needed to share.&lt;/p&gt;

&lt;p&gt;I hope you can also find it useful for you. &lt;/p&gt;

&lt;p&gt;Then, now it only remains for me to wish you "happy hacking!" 😁&lt;/p&gt;

</description>
      <category>github</category>
      <category>githubactions</category>
      <category>git</category>
    </item>
    <item>
      <title>Perl Advent Calendar</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Thu, 09 Nov 2023 16:36:36 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/perl-advent-28ga</link>
      <guid>https://dev.to/thibaultduponchelle/perl-advent-28ga</guid>
      <description>&lt;h2&gt;
  
  
  Blogging here or there
&lt;/h2&gt;

&lt;p&gt;If in 2023 I did almost no blogging at all, in 2022 I produced a decent number of posts, but not all landed on DevTo! &lt;/p&gt;

&lt;p&gt;Late 2022, I helped to make the Perl Advent Calendar tradition to run once again 🎅&lt;/p&gt;

&lt;p&gt;2022 be like:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bfZa5w19--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i4qe59m158rdr780xp1l.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bfZa5w19--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/i4qe59m158rdr780xp1l.jpg" alt="Blog on Devto / Blog on Perl Advent Calendar" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Believe me, all articles in &lt;a href="https://perladvent.org/2022/index.html"&gt;Perl Advent Calendar&lt;/a&gt; deserve a read. But let me share mine 😀&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://perladvent.org/2022/2022-12-03.html"&gt;Santa is On GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://perladvent.org/2022/2022-12-05.html"&gt;Catching Dreams&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://perladvent.org/2022/2022-12-07.html"&gt;The Sleigh Odometer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://perladvent.org/2022/2022-12-10.html"&gt;The Christmas Time Machine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://perladvent.org/2022/2022-12-12.html"&gt;The Delivery Map&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://perladvent.org/2022/2022-12-18.html"&gt;TWVycnkgQ2hyaXN0bWFzIDop&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This year, I'm not planning to contribute but please give them force and think about &lt;a href="https://github.com/perladvent/Perl-Advent/issues/new?assignees=&amp;amp;labels=article&amp;amp;projects=&amp;amp;template=i-want-to-write-an-article.md&amp;amp;title="&gt;contributing yourself&lt;/a&gt;!&lt;/p&gt;

</description>
      <category>perl</category>
    </item>
    <item>
      <title>Open Letter To Tim O'Reilly To Free The Perl Camel</title>
      <dc:creator>Tib</dc:creator>
      <pubDate>Fri, 07 Jul 2023 12:11:49 +0000</pubDate>
      <link>https://dev.to/thibaultduponchelle/open-letter-to-tim-oreilly-to-free-the-perl-camel-k3i</link>
      <guid>https://dev.to/thibaultduponchelle/open-letter-to-tim-oreilly-to-free-the-perl-camel-k3i</guid>
      <description>&lt;p&gt;Dear Tim,&lt;/p&gt;

&lt;p&gt;I've been thinking about this letter for a while now.&lt;/p&gt;

&lt;p&gt;There was a time (an eternity in IT age) where you did a lot for Perl and I thank you so much for this 🙏&lt;/p&gt;

&lt;p&gt;But time passed and Perl has lost its value to your eyes. &lt;/p&gt;

&lt;p&gt;Thanks to you ❤️ Perl inherited a logo: the camel &lt;br&gt;
But because of you, Perl actually never had a logo at all 😢&lt;/p&gt;

&lt;p&gt;Over the years, you never ever made the Perl camel open enough for us (Perl community) to freely use or modify.&lt;br&gt;
Consequently, we are in a very uncomfortable position.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Let's just use a new logo, what's the point? &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No, it's not that simple and we were never able to achieve this.&lt;/p&gt;

&lt;p&gt;As of today, we are torn between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your camel 🐪 that we are not allowed to use &lt;/li&gt;
&lt;li&gt;A shadowed camel 🐪 derived from your camel, still problematic even if it's de facto used everywhere &lt;/li&gt;
&lt;li&gt;An onion 🧅 that is not Perl but foundation logo (and not even free to use/modify)&lt;/li&gt;
&lt;li&gt;A raptor 🌋 that some people don't like or don't recognize well the association &lt;/li&gt;
&lt;li&gt;Various other attempts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's a long standing problem with numerous discussions, attempts and continuous frustrations for us.&lt;/p&gt;

&lt;p&gt;Now, the thing is, only YOU can fix this 🎯&lt;/p&gt;

&lt;p&gt;And it's time.&lt;/p&gt;

&lt;p&gt;So I'm asking solemnly, &lt;strong&gt;free the Perl camel&lt;/strong&gt;! 🆓&lt;br&gt;
And do it with a nice and clear license.&lt;/p&gt;

&lt;p&gt;#FreeThePerlCamel&lt;/p&gt;

&lt;p&gt;Please.&lt;/p&gt;

&lt;p&gt;Thibault&lt;/p&gt;

&lt;p&gt;Notes: it was sent to &lt;code&gt;permissions@oreilly.com&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Background
&lt;/h2&gt;

&lt;p&gt;The association of Perl and camel originally comes from &lt;a href="https://www.oreilly.com/library/view/programming-perl-4th/9781449321451/" rel="noopener noreferrer"&gt;Programming Perl&lt;/a&gt; book. Since then, O'Reilly always protected it with (too much) restrictions and Perl was never able nor wanted to break association.&lt;/p&gt;

&lt;p&gt;We talk about this guy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cgro7mnpsx5506um5z5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8cgro7mnpsx5506um5z5.png" alt="The non-free Perl camel" width="360" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;...and derivatives!&lt;/p&gt;

&lt;p&gt;As far as I know, O'Reilly never enforced restrictions and kept friendly to Perl along all these years.&lt;/p&gt;

&lt;h2&gt;
  
  
  Past O'Reilly position on Camel
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://web.archive.org/web/20180425080044/http://archive.oreilly.com/pub/a/oreilly/perl/usage" rel="noopener noreferrer"&gt;Perl camel usage&lt;/a&gt; (webarchive)
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7it49w6as2ztukswo94v.png" alt="Perl Camel usage old" width="800" height="261"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Non-commercial use&lt;/p&gt;

&lt;p&gt;We will license the camel image widely for open source products and non-commercial sites related to Perl, requiring only an acknowledgement of its trademark status and a link to &lt;a href="http://www.perl.com" rel="noopener noreferrer"&gt;www.perl.com&lt;/a&gt;. To request the camel artwork, please send email to &lt;a href="mailto:permissions@oreilly.com"&gt;permissions@oreilly.com&lt;/a&gt;, indicating where, how, and for what purpose you plan to use the image. Please note that we generally do not allow alterations of the Perl camel artwork.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It sounds free at first but it's not at all 😞&lt;/p&gt;

&lt;p&gt;Also note the following sentence (at the beginning) which sounds particularly rude: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;After all, the only reason that people think of camels in association with Perl is because we used a camel on the cover of Programming Perl.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ouch! The last edition of &lt;a href="https://www.oreilly.com/library/view/programming-perl-4th/9781449321451/" rel="noopener noreferrer"&gt;Programming Perl&lt;/a&gt; was 11 years ago.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some clarification in &lt;a href="https://web.archive.org/web/20180123132933/http://archive.oreilly.com/pub/a/oreilly/perl/usage/faq.html" rel="noopener noreferrer"&gt;Perl camel FAQ&lt;/a&gt; (webarchive)
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7bd7cxa7ks4ek2tx243f.png" alt="Perl Camel FAQ" width="800" height="468"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Q: I want to design a T-shirt with the Perl camel on it. Do I need to get your permission?&lt;/p&gt;

&lt;p&gt;A: Yes. But we're willing to make allowances for those of you who have creative ideas and want to do something fun for your friends. So, if the lifetime print run of the T-shirt design is less than 100, you may consider permission automatically granted. For larger print runs, please ask first. We promise to answer quickly!&lt;/p&gt;

&lt;p&gt;Q: Why isn't your trademark just restricted to books?&lt;/p&gt;

&lt;p&gt;A: We also do conferences, software, research, and online publishing in Perl, and we use the camel image for those things as well. We may want to camel-brand other Perl-related products in the future.&lt;/p&gt;

&lt;p&gt;Q: I want to place a picture of a camel on my Perl web page. Am I allowed to do that? Do I have to use your camel?&lt;/p&gt;

&lt;p&gt;A: Yes, as long as your page is non-commercial, and the context in which the camel is placed portrays Perl in a positive light. You will need to include the following language in small text somewhere on the page where the camel appears:&lt;/p&gt;

&lt;p&gt;"The Perl camel image is a trademark of O'Reilly Media, Inc. Used with permission."&lt;/p&gt;

&lt;p&gt;Please make the "O'Reilly Media, Inc." part of the statement a link to our home page (&lt;a href="http://www.oreilly.com" rel="noopener noreferrer"&gt;http://www.oreilly.com&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This FAQ sounds terrible to me. It's "yes but no", unclear, restrictive...&lt;/p&gt;

&lt;p&gt;At least O'Reilly has some sense of humor:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Q: I want to use $camel as a variable name in a Perl program. Do I need to acknowledge the trademark?&lt;/p&gt;

&lt;p&gt;A: No.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Thank you sir, now let's move one step forward and Free The Perl Camel 😉&lt;/p&gt;

&lt;h2&gt;
  
  
  Recent position
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;From &lt;a href="http://neilb.org/2020/12/04/perl-and-camels.html" rel="noopener noreferrer"&gt;Perl and Camels&lt;/a&gt;, Tim O'Reilly answered questions from &lt;a href="http://neilb.org/index.html" rel="noopener noreferrer"&gt;Neil Bowers&lt;/a&gt; (Perl figure and former perl maintainer). Here's what we can (not) do now:
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1xdu48ck4wa8d3iil0ae.png" alt="Perl Camel usage recent" width="689" height="139"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's even worse 😠&lt;/p&gt;

&lt;p&gt;And what is allowed for shadowed camel? &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwb6shere96l2b8w7iss.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzwb6shere96l2b8w7iss.png" alt="Shadowed camel is a derivative" width="380" height="158"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(It's a derivative of "specific image of the camel that appears on the cover of the Programming Perl book")&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.perl.org/advocacy/white_camel/2007.html" rel="noopener noreferrer"&gt;White camel award 2007&lt;/a&gt; - Tim O'Reilly recognized for major contribution to Perl&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/thibaultduponchelle/the-perl-complex-topic-of-logos-3161"&gt;The complex topic of Perl logos&lt;/a&gt; - Perl logos and licenses (same author)&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://neilb.org/2020/12/04/perl-and-camels.html" rel="noopener noreferrer"&gt;Perl and Camels&lt;/a&gt; - Neil Bowers clarified recent O'Reilly position &lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ubuntu/yaru/issues/3938" rel="noopener noreferrer"&gt;Ticket to change icon in Ubuntu&lt;/a&gt; - Living between tastes and licenses&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.oreilly.com/amazon_patent/amazon_patent.comments.html" rel="noopener noreferrer"&gt;Tim O'Reilly Open Letter to Jeff Bezos&lt;/a&gt; (2000) - "[...] other attempts to limit the use of web technology for private advantage have put the whole software development and standards process into a precarious state."&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.oreilly.com/pub/pr/949" rel="noopener noreferrer"&gt;Tim O'Reilly Open Letter to Microsoft&lt;/a&gt; (1998) - "[...] you should follow the lead of companies like O'Reilly [...] who are supporting various Open Source communities while finding ways to build commercial added-value products on the open platforms these communities provide."&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/kraih/perl-raptor" rel="noopener noreferrer"&gt;Perl raptor&lt;/a&gt; - Another Perl logo&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://www.oreilly.com/library/view/programming-perl-4th/9781449321451/" rel="noopener noreferrer"&gt;Programming Perl&lt;/a&gt; - Great book&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.oreilly.com/" rel="noopener noreferrer"&gt;Oreilly.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/thibaultduponchelle/perlres#books-books" rel="noopener noreferrer"&gt;List of Perl books&lt;/a&gt; - List books including a lot of O'Reilly references&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://web.archive.org/web/20180425080044/http://archive.oreilly.com/pub/a/oreilly/perl/usage" rel="noopener noreferrer"&gt;Perl camel usage&lt;/a&gt; - Old trademark notice&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://web.archive.org/web/20180123132933/http://archive.oreilly.com/pub/a/oreilly/perl/usage/faq.html" rel="noopener noreferrer"&gt;Perl camel FAQ&lt;/a&gt; - Old trademark notice FAQ&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Example of discussions
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/perl/comments/zyyelx/perls_new_mascot_the_machines_know/" rel="noopener noreferrer"&gt;Perl new mascott?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/perl/comments/ok809e/official_icon_for_perl_programming_language/" rel="noopener noreferrer"&gt;Official icon?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/perl/comments/d9ygpf/comment/f1njywx/" rel="noopener noreferrer"&gt;Logos [...] are legally restricted&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.reddit.com/r/perl/comments/n4le8l/why_perls_logo_is_an_onion_which_one_is_the/" rel="noopener noreferrer"&gt;Perl has no official logo&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.perlmonks.org/?node_id=845773" rel="noopener noreferrer"&gt;A logo for Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.perlmonks.org/?node_id=741680" rel="noopener noreferrer"&gt;Who bestowed the camel to perl?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://dev.to/smonff/notes-about-the-ongoing-perl-logo-discussion-4c80"&gt;Notes about the ongoing Perl logo discussion&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Timeline
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;06/07/2023 - Sent email "A letter to Tim O'Reilly to ask to free the Perl camel" to &lt;code&gt;permissions@oreilly.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;07/07/2023 - Published blog post&lt;/li&gt;
&lt;li&gt;08/07/2023 - Sent another email to &lt;code&gt;permissions@oreilly.com&lt;/code&gt; on Saturday &lt;/li&gt;
&lt;li&gt;08/07/2023 - I posted on Hacker News and it has hit the front page with 170 votes and 50 comments 🔥 - &lt;a href="https://news.ycombinator.com/item?id=36648949" rel="noopener noreferrer"&gt;Open Letter to Tim O’Reilly to Free the Perl Camel&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;10/07/2023 - Sent email to &lt;code&gt;tim@oreilly.com&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;14/07/2023 - Got answer by email from O'Reilly&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>perl</category>
      <category>opensource</category>
      <category>books</category>
      <category>camel</category>
    </item>
  </channel>
</rss>
