<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0" xml:base="https://jpoesen.com/">
  <channel>
    <title>/home/jpoesen</title>
    <link>https://jpoesen.com/</link>
    <description/>
    <language>en</language>
    
    <item>
  <title><a href="/articles/2026/09/03/tutorial-single-user-access-single-scaleway-object-storage-s3-bucket" hreflang="en">Tutorial: Giving a Single User Access to a Single Scaleway Object Storage (S3) Bucket</a></title>
  <link>https://jpoesen.com/articles/2026/09/03/tutorial-single-user-access-single-scaleway-object-storage-s3-bucket</link>
  <description/>
  <pubDate>2026-09-03 - 07:22</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">e897fe2a-f472-4309-aaf3-c87f109fec83</guid>
    </item>
<item>
  <title><a href="/articles/2026/08/21/on-softcore-indieweb-and-smallscale-drupal" hreflang="en">On Softcore IndieWeb and Smallscale Drupal</a></title>
  <link>https://jpoesen.com/articles/2026/08/21/on-softcore-indieweb-and-smallscale-drupal</link>
  <description>&lt;hr&gt;&lt;p&gt;&lt;strong&gt;The IndieWeb&lt;/strong&gt; is a people-focused alternative to the "corporate web". In this post I talk about &lt;em&gt;Softcore IndieWeb&lt;/em&gt; as an alternative to &lt;em&gt;Hardcore IndieWeb&lt;/em&gt;. Along the way I go into how and why I use Drupal as a Static Site Generator to get there.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;In the beginning, there was the web.&lt;br&gt;And we didn't know what we had, so we messed it up royally.&lt;br&gt;Everything that arises, also ends. But the web doesn't have to end there.&lt;/p&gt;&lt;p&gt;Enter the &lt;a href="https://indieweb.org"&gt;IndieWeb&lt;/a&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The IndieWeb is a people-focused alternative to the "corporate web". A community of independent and personal websites based on the principles of owning your own domain and using it as your primary online identity, publishing on your own site first (optionally elsewhere as well), and owning your content.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;One essential aspect of the IndieWeb is that it's &lt;em&gt;conceptual&lt;/em&gt; rather than &lt;em&gt;concrete&lt;/em&gt;: it's a set of ideas that can be implemented to various degrees with whichever technology or approach you're comfortable with.&lt;/p&gt;&lt;p&gt;One such approach is the &lt;strong&gt;Hardcore IndieWeb&lt;/strong&gt;. As &lt;a href="https://adam.omg.lol/"&gt;Adam Newbold&lt;/a&gt; (of &lt;a href="https://omg.lol"&gt;omg.lol&lt;/a&gt; fame) puts it, slightly paraphrased:&lt;/p&gt;&lt;ol&gt;&lt;li class="ck-list-marker-italic" data-list-item-id="eea3d8b3bf5244db116fc1a86de411b73"&gt;&lt;em&gt;Create your site by hand, on your hard drive, using a text editor.&lt;/em&gt;&lt;/li&gt;&lt;li class="ck-list-marker-italic" data-list-item-id="e15b39ee476be0871851c5d96386669ba"&gt;&lt;em&gt;Preview it in your browser.&lt;/em&gt;&lt;/li&gt;&lt;li class="ck-list-marker-italic" data-list-item-id="e58c3368f42d994a44c5a0cc1b2010294"&gt;&lt;em&gt;Upload it to a web host tied to a domain you control.&lt;/em&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;em&gt;No IDEs, no framworks, no Static Site Generators, no Content Management Systems. If your host vanishes, you can just use another host and upload your website there. You don’t have to worry about critical security vulnerabilities in blogging software or Static Site Generator dependencies or anything like that.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;You are in complete control over every aspect of your web content, and you’re reliant upon no one else.&lt;/em&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;As of 2026 I have worked with the opensource CMS &lt;a href="https://drupal.org"&gt;Drupal&lt;/a&gt; for 20 years, so I'm pretty comfortable using it to build sites. I'm used to the workflow, I can use it to quickly give shape to new ideas, to prototype applications, and to spin up new projects.&lt;/p&gt;&lt;p&gt;Yet for various reasons, both personal and societal, my flame was al flickered out, and I could hardly bother with the work I'd been doing for so long.&lt;/p&gt;&lt;p&gt;But then I found comfort in slowing down, scaling down, and using Drupal for small things. &lt;em&gt;Smallscale Drupal&lt;/em&gt;, if you will.&lt;/p&gt;&lt;p&gt;The last couple of months I've been living the IndieWeb ethos:&lt;/p&gt;&lt;ol&gt;&lt;li data-list-item-id="e4f026baaea0a51f7fe148f697cc1311d"&gt;Build the site with Drupal locally on my laptop.&lt;/li&gt;&lt;li data-list-item-id="e60d1f53d146b505724e02a878a13021a"&gt;Customise or hand-write the HTML and CSS that make up the visual theme.&lt;/li&gt;&lt;li data-list-item-id="ea0ad3a77e2426160cbc4c6176c28bf25"&gt;Export it as a static site.&lt;/li&gt;&lt;li data-list-item-id="e31e55833b7885cbf956d33ecde559e59"&gt;Upload it to a webhost [*]&lt;/li&gt;&lt;/ol&gt;&lt;p style="font-size:85%;"&gt;[*] To be precise, I use a version control system (&lt;a href="https://git-scm.com/"&gt;git&lt;/a&gt;) to keep track of all the HTML changes, push the files to a central source code repository (&lt;a href="https://gitlab.com"&gt;GitLab&lt;/a&gt; or &lt;a href="https://codeberg.org"&gt;Codeberg&lt;/a&gt;), which in turn takes care of hosting through their built-in "&lt;a href="https://docs.gitlab.com/user/project/pages/"&gt;Git Pages&lt;/a&gt;" hosting system &lt;strong&gt;free of charge&lt;/strong&gt; (yes, &lt;em&gt;gratis&lt;/em&gt;).&amp;nbsp;All this is just a fancy alternative to using an SFTP or SSH client like &lt;a href="https://filezilla-project.org/"&gt;FileZilla&lt;/a&gt; to upload files to your web space manually. Same thing, shiny wrapper. My inner geek is satisfied.&lt;/p&gt;&lt;p&gt;I like this. It suits me. It builds on my earlier experience while still yielding plain HTML and CSS files that I can host anywhere else, later on, should the fancy tickle me.&lt;/p&gt;&lt;p&gt;I prefer it over building everything by hand because I change my mind often, and that would mean having to change many things in many places in many files more often than I care for. I would end up copy/pasting things all over the place, and knowing myself I would end up with an inconsistent mess.&lt;/p&gt;&lt;p&gt;And since Drupal runs on a full-fledged server environment inside my laptop, I can still syndicate a version of my staticly generated content to other online places, a practice the IndieWeb has dubbed &lt;a href="https://indieweb.org/POSSE"&gt;POSSE&lt;/a&gt; (Publish Own Site, Syndicate Elsewhere).&lt;/p&gt;&lt;p&gt;The IndieWeb movement favours &lt;a href="https://indieweb.org/principles"&gt;principles&lt;/a&gt; over dogmatic project-centrism, and welcomes a breadth of solutions. All roads lead to Rome.&lt;/p&gt;&lt;p&gt;Hardcore IndieWeb specifically aims to remove all external dependencies (tools, frameworks, hosting platforms) from the web creation process, and produce plain old HTML and CSS to give you ultimate control over your creation.&lt;/p&gt;&lt;p&gt;What I see as &lt;strong&gt;Softcore IndieWeb &lt;/strong&gt;tries to walk the middle way: produce plain old HTML and CSS to retain ultimate control, but use whichever set of technologies you're comfortable with, be it a static site generator, development framework, content management system, or something else.&lt;/p&gt;&lt;p&gt;But when you depend on a specific tools, you open yourself to potential issues down the road: the tools may stop working. You may need to pay license fees. Your laptop may crash and you may have neglected to take timely backups and store them offsite.&lt;/p&gt;&lt;p&gt;You can mitigate all of these risks, but you have to put in the work. It can be a lot of work, but nothing worthwhile ever comes easy.&lt;/p&gt;&lt;p&gt;Or go hardcore, learn the crap out of HTML and CSS, build your site brick by brick, and experience true freedom.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Take your time, hurry up.&lt;/em&gt;&lt;br&gt;&lt;em&gt;The choice is yours, don't be late.&lt;/em&gt;&lt;/p&gt;&lt;hr&gt;&lt;p&gt;More elsewhere:&lt;/p&gt;&lt;ul&gt;&lt;li data-list-item-id="ed9e1c412e7e1a7bc22e60e57969591f7"&gt;&lt;a href="https://indieweb.org"&gt;https://indieweb.org&lt;/a&gt;&lt;/li&gt;&lt;li data-list-item-id="e1be2a6d2812a3536ff2ef8b81e62bbca"&gt;&lt;a href="https://www.neatnik.net/hardcore-indieweb"&gt;https://www.neatnik.net/hardcore-indieweb&lt;/a&gt;&lt;/li&gt;&lt;li data-list-item-id="e065f43fe45b0240c0e4fcda6aceeb8fe"&gt;&lt;a href="https://indieweb.org/POSSE"&gt;https://indieweb.org/POSSE&lt;/a&gt;&lt;/li&gt;&lt;li data-list-item-id="e7d728ebe8f6d36d890057e3e63e31675"&gt;&lt;a href="https://dri.es/to-pesos-or-to-posse"&gt;https://dri.es/to-pesos-or-to-posse&lt;/a&gt;&lt;/li&gt;&lt;li data-list-item-id="e333b9ff3fc9717f124a298d3836f8bdf"&gt;&lt;a href="https://omg.lol"&gt;https://omg.lol&lt;/a&gt;&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;</description>
  <pubDate>2026-08-21 - 14:29</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">8bbc52df-3153-407d-9db7-0ed8699236a5</guid>
    </item>
<item>
  <title><a href="/articles/2026/08/12/a-bash-script-for-ddev-snapshots-with-a-more-useful-name-based-on-git-branch" hreflang="en">A bash script for DDEV snapshots with a more useful name based on git branch, commit, and timestamp</a></title>
  <link>https://jpoesen.com/articles/2026/08/12/a-bash-script-for-ddev-snapshots-with-a-more-useful-name-based-on-git-branch</link>
  <description>&lt;p&gt;&lt;a href="https://docs.ddev.com/en/stable/"&gt;DDEV&lt;/a&gt; provides a &lt;a href="https://docs.ddev.com/en/stable/users/usage/commands/#snapshot"&gt;snapshot&lt;/a&gt; command for taking and restoring database snapshots.&lt;/p&gt;&lt;p&gt;By default it generates a snapshot name based on your project name and timestamp.&lt;/p&gt;&lt;p&gt;When you work with multiple git branches (who doesn't?) and frequently need to revert to a previous project state, it can become hard to track which database snapshot relates to which version of your codebase.&lt;/p&gt;&lt;p&gt;This little bash script makes snapshots with a name based on:&lt;/p&gt;&lt;ul&gt;&lt;li data-list-item-id="e0fc6298aa158a5c55a54bbb226ca0ccc"&gt;the current git branch&lt;/li&gt;&lt;li data-list-item-id="e5d40d86239bc2b6e348930b57afd3465"&gt;the current (latest) git commit hash&lt;/li&gt;&lt;li data-list-item-id="e744a190b5317b706e4f7b9030af21a0a"&gt;the current timestamp&lt;/li&gt;&lt;li data-list-item-id="e69f43e5fb755b616017b0a1e9e789bb1"&gt;an optional message to provide more info&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;&lt;strong&gt;Usage example:&lt;/strong&gt;&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;./snapshot.sh -m "before D11 core upgrade"&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;Creating database snapshot 2026-08-12-144610_main_98abe3c2_before_D11_core_upgrade 
Created database snapshot 2026-08-12-144610_main_98abe3c2_before_D11_core_upgrade 
Restore this snapshot with 'ddev snapshot restore 2026-08-12-144610_main_98abe3c2_before_D11_core_upgrade'&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;The script is available as a Gitlab snippet: &lt;a href="https://gitlab.com/-/snippets/6029816"&gt;https://gitlab.com/-/snippets/6029816&lt;/a&gt;:&lt;/p&gt;&lt;script src="https://gitlab.com/-/snippets/6029816.js"&gt;&lt;/script&gt;</description>
  <pubDate>2026-08-12 - 12:35</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">18d729f0-95a2-49e6-90d3-9d15d4329479</guid>
    </item>
<item>
  <title><a href="/articles/2025/02/24/turning-off-drupals-superuserpolicy-to-harden-the-user1-account" hreflang="en">Turning off Drupal's SuperUserPolicy to Harden the user/1 Account</a></title>
  <link>https://jpoesen.com/articles/2025/02/24/turning-off-drupals-superuserpolicy-to-harden-the-user1-account</link>
  <description/>
  <pubDate>2025-02-24 - 11:40</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">a11da827-ca52-4963-bcc4-b0fcb8c73e27</guid>
    </item>
<item>
  <title><a href="/articles/2025/02/05/the-drupal-community-and-the-need-for-more-ethical-vendor-selection-criteria" hreflang="en">The Drupal Community and the Need for More Ethical Vendor Selection Criteria</a></title>
  <link>https://jpoesen.com/articles/2025/02/05/the-drupal-community-and-the-need-for-more-ethical-vendor-selection-criteria</link>
  <description>&lt;h2 id="in-short"&gt;In short&lt;/h2&gt;&lt;p&gt;Digital platforms used by the Drupal community conflict with the community’s values. X/Twitter and Meta are no longer safe places.&lt;/p&gt;&lt;p&gt;I propose the creation or tightening of the community's vendor selection process to ensure Drupal’s social media channels and collaboration tools remain safe and welcoming to all.&lt;/p&gt;&lt;p&gt;Remain present on X/Twitter and Meta, but no longer post there. Instead, signpost to Mastodon and/or other non-corporate social media presences.&lt;/p&gt;&lt;hr&gt;&lt;h2 id="problem-corporate-social-media-conflict-with-our-values"&gt;Problem: Corporate Social Media conflict with our values&lt;/h2&gt;&lt;p&gt;It is February 2025.&lt;/p&gt;&lt;p&gt;While X/Twitter was once a neutral and (arguably) inclusive social media platform, after Musk’s takeover it has become a heavily extreme-right leaning platform used by its new owner to aggressively pursue his own interests, including dismantling DEI initiatives, promoting right-wing politics internationally, and threatening democratic processes.&lt;/p&gt;&lt;p&gt;Directed by the newly installed US government, Meta / Facebook / Instagram / Threads has completely disbanded its fact checking team and DEI initiatives, and is explicitly allowing hate speech. Google and Amazon followed shortly after.&lt;/p&gt;&lt;p&gt;The Drupal project having an official, active presence on these platforms legitimizes and endorses them. This goes against Drupal’s own &lt;a href="https://www.drupal.org/dcoc"&gt;Code of Conduct&lt;/a&gt;, Drupal’s &lt;a href="https://www.drupal.org/about/values-and-principles"&gt;Core Values &amp;amp; Principles&lt;/a&gt;, and the &lt;a href="https://www.drupal.org/community/cwg"&gt;Community Working Group&lt;/a&gt; (CWG)’s mission.&lt;/p&gt;&lt;p&gt;I could selectively quote from these policies to make my point, but I invite you to take this opportunity to (re-)familiarize yourself with the values the Drupal community stands for.&lt;/p&gt;&lt;p&gt;X/Twitter’s descent into neofascism and Trump’s dismantling of checks and balances make it clear that digital platforms are vulnerable to corporate and state-led interference.&lt;/p&gt;&lt;p&gt;With this in mind, it is both &lt;strong&gt;unconscionable&lt;/strong&gt; and &lt;strong&gt;against Drupal’s own values&lt;/strong&gt; to expose our community to these platforms.&lt;/p&gt;&lt;h2 id="digital-platforms-community-standards"&gt;Ethical vendor selection criteria&lt;/h2&gt;&lt;p&gt;Our community has formulated and stands by high standards. It’s high time we apply those standards to the digital platforms, centrally managed by DA staff and volunteers, where we expect the community to be active.&lt;/p&gt;&lt;p&gt;I’m calling for the community to gather and formulate new or stricter vendor selection criteria based on:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Drupal’s Code of Conduct and Core Values &amp;amp; Principles&lt;/li&gt;&lt;li&gt;Guarding against the threat of corporate and state-led interference.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;The criteria &lt;em&gt;could&lt;/em&gt; include things like:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Not centralised if decentralised equivalent is available.&lt;/li&gt;&lt;li&gt;Not proprietary if FOSS equivalent available.&lt;/li&gt;&lt;li&gt;Respects Drupal's CoC and Core Values.&lt;/li&gt;&lt;li&gt;Respects Diversity, Equity, and Inclusion guidelines and initiatives.&lt;/li&gt;&lt;li&gt;Respects democracy and the sovereignty of nations.&lt;/li&gt;&lt;li&gt;Respects individuals' privacy.&lt;/li&gt;&lt;li&gt;Distributed and/or run by non-profit in safe jurisdiction.&lt;/li&gt;&lt;li&gt;Not owned by corporations, VC funds, or other investment vehicles.&lt;/li&gt;&lt;li&gt;Safe from political / state-led interference&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;And while we’re at it, why not include climate-saving practices like use of renewable energy and reduced CO2 emissions?&lt;/p&gt;&lt;p&gt;As these criteria stand, would X/Twitter and Meta pass? Clearly not.&amp;nbsp;&lt;br&gt;Would Slack? Youtube?&lt;/p&gt;&lt;h2 id="moving-forward"&gt;Moving forward&lt;/h2&gt;&lt;p&gt;In the next weeks, not months, we should agree on the first set of standards, freeze our X/Twitter and Meta presence, stop advertising our presence on these platforms, and find a new home.&lt;/p&gt;&lt;p&gt;Based on that experience we can review the standards and how we put them in practice, and turn our attention to the Drupal community’s other external digital properties such as Slack and Youtube. Even if there’s no trouble there yet, we should behave as if it’s only a matter of time.&lt;/p&gt;&lt;p&gt;Risk management and such.&lt;/p&gt;&lt;h2&gt;"But we won't be able to reach our target audience"&lt;/h2&gt;&lt;p&gt;To be quite frank: people who are exclusively on X/Twitter, today, and choose not to be active on other social media... is that your target audience?&lt;/p&gt;&lt;p&gt;I would humbly submit that it is not. But I'd love to be proven wrong and learn something.&lt;/p&gt;&lt;h2 id="join-the-conversation"&gt;Join the conversation&lt;/h2&gt;&lt;p&gt;I raised an issue in the Community Working Group’s issue queue in early January:&lt;/p&gt;&lt;p&gt;&lt;a href="https://www.drupal.org/project/drupal_cwg/issues/3498933"&gt;Withdraw official presence from X/Twitter and Meta platforms&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Though one person from the Drupal Association has commented in an unofficial capacity, at the time of writing (2025-02-11) there is no official response from the Drupal Association, Community Working Group, or other Drupal leadership figure.&lt;/p&gt;&lt;p&gt;If you feel as strongly about this as I do, please add your voice constructively and respectfully. This is a highly polarising issue; let’s try not to fracture our community.&lt;/p&gt;</description>
  <pubDate>2025-02-05 - 11:49</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">414c7e18-28c3-47aa-b919-74210f697d09</guid>
    </item>
<item>
  <title><a href="/articles/2025/01/11/the-drupal-project-has-no-place-on-xtwitter-or-meta" hreflang="en">The Drupal project has no place on X/Twitter or Meta</a></title>
  <link>https://jpoesen.com/articles/2025/01/11/the-drupal-project-has-no-place-on-xtwitter-or-meta</link>
  <description>&lt;p&gt;It's 2025 and the &lt;a href="https://drupal.org"&gt;Drupal&lt;/a&gt; project is still on X/Twitter and Meta.&lt;/p&gt;&lt;p&gt;Drupal's &lt;em&gt;Values &amp;amp; Principles&lt;/em&gt; state:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;"We will not accept intolerance. Every person is welcome, but every behavior is not.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;Our community promotes behaviors and decisions that support diversity, equity, and inclusion and reduce hatred, oppression, and violence.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;strong&gt;We believe that safety is an important component of dignity and respect, and we encourage behaviors that keep our community members safe."&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Meta has completely disbanded its fact checking team and DEI initiatives, and is &lt;strong&gt;explicitly allowing hate speech&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;Musk has oriented X/Twitter towards extreme right wing, xenophobic, homophobic, and transphobic views. He uses his platform as a &lt;strong&gt;fire hose of hatred&lt;/strong&gt; aimed at dismantling power structures that inhibit his ever growing need for wealth, power, and influence.&lt;/p&gt;&lt;p&gt;These are facts, not hyperbole.&lt;/p&gt;&lt;p&gt;Drupal's continued presence doesn't only legitimize X/Twitter; it &lt;em&gt;endorses&lt;/em&gt; it.&lt;/p&gt;&lt;p&gt;If we accept Drupal's presence on X, why not on Gab, Truth Social, and StormFront too?&lt;/p&gt;&lt;p&gt;The Drupal project has no place on X/Twitter or Meta.&amp;nbsp;&lt;/p&gt;&lt;p&gt;I opened &lt;a href="https://www.drupal.org/project/drupal_cwg/issues/3498933"&gt;issue #3498933 on drupal.org&lt;/a&gt; to start the discussion.&amp;nbsp;&lt;br&gt;Use your voice. Join in.&lt;/p&gt;</description>
  <pubDate>2025-01-11 - 11:32</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">24fb8932-a627-45c3-9e17-2fbff08a37dd</guid>
    </item>
<item>
  <title><a href="/articles/2025/01/08/unable-to-paste-images-in-firefox-try-this" hreflang="en">Unable to paste images in Firefox? Try this.</a></title>
  <link>https://jpoesen.com/articles/2025/01/08/unable-to-paste-images-in-firefox-try-this</link>
  <description>&lt;p&gt;For a long time my Firefox has refused to paste images into form fields. Pasting text works fine, but pasting images silently fails.&lt;/p&gt;&lt;p&gt;I tried turning off all add-ons, but no luck.&lt;/p&gt;&lt;p&gt;The solution, in my case:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;Navigate to &lt;code&gt;about:config&lt;/code&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;Ensure &lt;/span&gt;&lt;code&gt;&lt;span&gt;dom.&lt;wbr&gt;event.&lt;wbr&gt;clipboardevents.&lt;wbr&gt;enabled &lt;/span&gt;&lt;/code&gt;&lt;span&gt;is set to &lt;/span&gt;&lt;code&gt;&lt;span&gt;true&lt;/span&gt;&lt;/code&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;That's it.&lt;/p&gt;&lt;p&gt;If I understand correctly, setting this value to &lt;em&gt;true&lt;/em&gt; does give websites the power to intercept copy/paste actions to, for example, prevent copy/pasting into password fields. Some people also report issues with pasting into Google docs.&lt;/p&gt;&lt;p&gt;I haven't encountered any of these side effects, and I exclusively use Chrome for working with Google products.&amp;nbsp;&lt;/p&gt;&lt;p&gt;For now this solution works perfectly fine &lt;em&gt;for me&lt;/em&gt;.&lt;/p&gt;</description>
  <pubDate>2025-01-11 - 09:58</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">bc83dccf-a631-41ec-9644-2c8bacda9cc0</guid>
    </item>
<item>
  <title><a href="/articles/2025/01/11/look-for-the-light" hreflang="en">Look for the light</a></title>
  <link>https://jpoesen.com/articles/2025/01/11/look-for-the-light</link>
  <description>&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;I wholehartedly applaud &lt;a href="https://arstechnica.com/tech-policy/2025/01/meta-kills-diversity-programs-claiming-dei-has-become-too-charged/"&gt;Zuck removing the Meta Fact Checking and DEI teams&lt;/a&gt; and &lt;a href="https://www.thegreenwebfoundation.org/news/digital-sustainability-in-wordpress/"&gt;Matt killing the WP Sustainability team&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;These actions will hasten the platforms' enshittification and exodus, and bring more people to current and new &lt;a href="https://opensource.com/article/23/3/tour-the-fediverse"&gt;Fediverse&lt;/a&gt; communities faster.&lt;/p&gt;&lt;p&gt;Go on tech leaders, be bold. Be more like Musk. Let your inner asshole shine, and hasten your own downfall.&lt;/p&gt;&lt;p&gt;It'll get worse before it gets better, but IT WILL GET BETTER.&amp;nbsp;&lt;br&gt;We'll make it so.&lt;/p&gt;&lt;p&gt;&lt;sub&gt;(To be clear: I very much support DEI initiatives, working groups, and other initiatives that make communities safer and more inclusive. Corporate platforms that disband such initiatives only hasten their own demise, and I'm all in favour).&lt;/sub&gt;&lt;/p&gt;</description>
  <pubDate>2025-01-11 - 08:49</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">0d34b379-6b59-4d84-9a89-0c855d571773</guid>
    </item>
<item>
  <title><a href="/articles/2024/09/28/community-governance-wordpress-vs-drupal" hreflang="en">Community Governance - WordPress vs Drupal</a></title>
  <link>https://jpoesen.com/articles/2024/09/28/community-governance-wordpress-vs-drupal</link>
  <description>&lt;div class="content"&gt;&lt;div class="moz-reader-content reader-show-element"&gt;&lt;div class="page" id="readability-page-1"&gt;&lt;div tabindex="0" dir="ltr"&gt;&lt;p id="ember2660"&gt;The current &lt;a href="https://www.wordpress.org" target="_self" data-test-app-aware-link&gt;WordPress&lt;/a&gt; / &lt;a href="https://www.wpengine.com" target="_self" data-test-app-aware-link&gt;WP Engine&lt;/a&gt; drama demonstrates how differently things can go with your community depending on how you support it.&lt;/p&gt;&lt;p id="ember2661"&gt;WordPress and Drupal were both born around the same time, use the same technology stack, and are similar in too many other ways to talk about right now.&lt;/p&gt;&lt;p id="ember2662"&gt;They both have a "Benevolent Dictator for Life" as project lead, both of them run a non-profit organisation to support their open-source project, and both of them run a huge for-profit company to monetize their open-source work.&lt;/p&gt;&lt;h2 id="ember2663"&gt;WordPress&lt;/h2&gt;&lt;p id="ember2664"&gt;From what I can tell, WP's lead runs Automattic, runs wordpress.com (commercial WP hosting), controls wordpress.org (WP community infrastructure), and is reportedly the only active member of the WordPress Foundation's 3-person board).&lt;/p&gt;&lt;p id="ember2665"&gt;in other words, every bit of controlling power in this community is centralized in the person of Matt who is free to go where his internal or external motivators drive him.&lt;/p&gt;&lt;h2 id="ember2666"&gt;Drupal&lt;/h2&gt;&lt;p id="ember2667"&gt;The &lt;a href="https://association.drupal.org" target="_self" data-test-app-aware-link&gt;Drupal Association&lt;/a&gt; works out in the open, has community-elected board members, and gets its funding from corporate and individual membership fees that are used to keep Drupal's project and infrastructure running. This includes source code collaboration tools, discussion spaces, and download access to all of Drupal's contributed extensions - modules, themes, distributions, and more.&lt;/p&gt;&lt;p id="ember2668"&gt;The Drupal community has spent a lot of time and effort over the years to come up with the unique &lt;a href="https://www.drupal.org/drupalorg/contribution-credit" target="_self" data-test-app-aware-link&gt;contribution credits system&lt;/a&gt; that encourages code and non-code contributions alike, and rewards contributors by boosting their visibility.&lt;/p&gt;&lt;p id="ember2669"&gt;Though the system has had its issues with abuse and unfair advantage to larger contributors, at its heart lies a community-driven algorithm, scrutinized and continuously improved by the community.&lt;/p&gt;&lt;h2 id="ember2670"&gt;In conclusion&lt;/h2&gt;&lt;p id="ember2671"&gt;Both projects face the problem of unevenly distributed contributions and convincing those who benefit more to contribute more.&lt;/p&gt;&lt;p id="ember2672"&gt;One leader spends decades building a community governed by its members, shares his thought process on &lt;a href="https://dri.es/balancing-makers-and-takers-to-scale-and-sustain-open-source" target="_self" data-test-app-aware-link&gt;Makers vs Takers&lt;/a&gt;, and asks for feedback.&lt;/p&gt;&lt;p id="ember2673"&gt;The other leader does not, and uses community infrastructure to attack specific competitors under the guise of forcing fair play.&lt;/p&gt;&lt;p id="ember2674"&gt;In a truly open and collaboratively run community, a rising tide lifts all the boats.&lt;/p&gt;&lt;p id="ember2675"&gt;Where there is centralization of power into a single person, combined with no checks and balances, a strongman is a weakness that will inevitably bring things crashing down.&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
  <pubDate>2024-12-23 - 13:21</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">826b2ccf-b7fe-4e96-acab-43629c95d15f</guid>
    </item>
<item>
  <title><a href="/articles/2006/05/22/rails-kung-fu" hreflang="en">Rails kung-fu</a></title>
  <link>https://jpoesen.com/articles/2006/05/22/rails-kung-fu</link>
  <description>&lt;blockquote&gt;&lt;p&gt;Ruby on Rails is astounding.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Using it is like watching a kung-fu movie, where a dozen bad-ass frameworks prepare to beat up the little newcomer only to be handed their asses in a variety of imaginative ways.&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;Nathan Torkington, O'Reilly&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:54</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">3b62f46a-3190-465d-a79f-257d183170e0</guid>
    </item>
<item>
  <title><a href="/articles/2006/06/01/amateur-night" hreflang="en">Amateur night</a></title>
  <link>https://jpoesen.com/articles/2006/06/01/amateur-night</link>
  <description>&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt; : There are some severe performance drops on of the MS SQL Servers, occurring at seemingly random moments. Can you check it out?&lt;/p&gt;&lt;p&gt;&lt;strong&gt;DBA&lt;/strong&gt; : sure&lt;/p&gt;&lt;p&gt;&lt;strong&gt;DBA&lt;/strong&gt; : I figured out the problem. We're running MS SQL Server Personal Edition. There's the problem right there.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Me&lt;/strong&gt; : Don't you think it is a little strange and a tiny bit alarming that a crucial database server in production, is running an MSSQL &lt;em&gt;Personal&lt;/em&gt; Edition?&lt;/p&gt;&lt;p&gt;... tumbleweed rolls across the hallway ...&lt;/p&gt;&lt;p&gt;&lt;strong&gt;DBA&lt;/strong&gt; : we've scheduled the upgrade for this weekend&lt;/p&gt;&lt;p&gt;&lt;strong&gt;ME&lt;/strong&gt;: splendid idea.&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:51</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">5a657a78-d5b3-47f3-843e-17f8b65c40b3</guid>
    </item>
<item>
  <title><a href="/articles/2006/07/07/dreamhost-why-suckst-thou-thusly" hreflang="en">Dreamhost, why suckst thou thusly?</a></title>
  <link>https://jpoesen.com/articles/2006/07/07/dreamhost-why-suckst-thou-thusly</link>
  <description>&lt;p&gt;&lt;em&gt;Dreamhost, why suckst thou thusly?&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;My configs error free, all see.&lt;/em&gt;&lt;br&gt;&lt;em&gt;My width of band a mere mirage.&lt;/em&gt;&lt;br&gt;&lt;em&gt;My use of space a jesting joke.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Thy wages paid in full, in time, and yet&lt;/em&gt;&lt;br&gt;&lt;em&gt;Thy temper so villain, so foul.&lt;/em&gt;&lt;br&gt;&lt;em&gt;Thy warnings ne'er timely come.&lt;/em&gt;&lt;br&gt;&lt;em&gt;Thy daemons line up to be killed,&lt;/em&gt;&lt;br&gt;&lt;em&gt;and rise and die and rise and die.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;My host of dreams, I do implore,&lt;/em&gt;&lt;br&gt;&lt;em&gt;Why dost thou suck on cosmic scale?&lt;/em&gt;&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:50</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">2d6fbff3-c9ec-4c6d-bda8-574d3f170fd8</guid>
    </item>
<item>
  <title><a href="/articles/2006/07/07/newbie-dedicated-server-setup-part-1" hreflang="en">Newbie dedicated server setup - part 1</a></title>
  <link>https://jpoesen.com/articles/2006/07/07/newbie-dedicated-server-setup-part-1</link>
  <description>&lt;p&gt;So I've finally decided to turn my back on &lt;strong&gt;Dreamhost&lt;/strong&gt; and set up a dedicated server.&lt;/p&gt;&lt;p&gt;I've decided to go for &lt;strong&gt;Ubuntu&lt;/strong&gt; + &lt;strong&gt;RubyOnRails&lt;/strong&gt; + &lt;strong&gt;MySQL&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;A thrilling prospect for any true geek, but also chilling, since I've no real linux sysadmin experience... This is going to be a very interesting weekend.&lt;/p&gt;&lt;p&gt;I'm going for Ubuntu because I've been toying with Breezy, Hoary and Dapper for some time now on my laptop, and I like it. Similarly, I've developed a few minor projects on Rails recently, and the framework just feels right for me.&lt;/p&gt;&lt;p&gt;Apache seems a logical choice as webserver (Webrick is not production material and lighttpd seems to have stopped playing nicely with FastCGI), so there you have it... Apache it is.&amp;nbsp;&lt;/p&gt;&lt;p&gt;But I do not want to have the same shitty performance issues as I've been having on Dreamhost! No hanging &lt;code&gt;dispatch.fcgi&lt;/code&gt; processes and unexplainable unresponsiveness, no freaky "incomplete headers sent" crap.&lt;/p&gt;&lt;p&gt;This means I'll be setting up &lt;a href="http://httpd.apache.org/docs/2.0/"&gt;Apache 2.0&lt;/a&gt; and use &lt;a href="http://httpd.apache.org/docs/2.0/mod/mod_proxy.html"&gt;mod_proxy&lt;/a&gt; as a reverse proxy to direct the workload to &lt;a href="http://mongrel.rubyforge.org/"&gt;mongrel&lt;/a&gt;, and let it do its gruffy magic. Arf.&lt;/p&gt;&lt;p&gt;Like I said, interesting days a-comin'...&lt;/p&gt;&lt;p&gt;Interestingly, &lt;a href="http://blog.taragana.com/index.php/archive/fighting-with-linux-server-setup/"&gt;Angsuman Chakraborty&lt;/a&gt; seems to be doing almost exactly the same thing this weekend...&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:48</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">a7a25d0c-88e8-4054-9dbe-a251fa3fb56e</guid>
    </item>
<item>
  <title><a href="/articles/2006/08/14/consequences-of-the-mandatory-rails-116-upgrade" hreflang="en">Consequences of the mandatory Rails 1.1.6 upgrade</a></title>
  <link>https://jpoesen.com/articles/2006/08/14/consequences-of-the-mandatory-rails-116-upgrade</link>
  <description>&lt;p&gt;It would seem the mandatory &lt;strong&gt;Rails 1.1.6&lt;/strong&gt; upgrade broke my blog engine in a couple of ways.&lt;/p&gt;&lt;p&gt;I've managed to reduce the problem to a weird Model-refusing-to-reload bug that only occurs when I let FastCGI handle the request. When I fall back to good old CGI all is well, but all is slow.&lt;/p&gt;&lt;p&gt;For now, CGI it is until I&lt;/p&gt;&lt;ul&gt;&lt;li&gt;figure out what is up with fcgi&lt;/li&gt;&lt;li&gt;switch to my dedicated server&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;whichever comes first.&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:47</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">50408d33-7f00-4cb3-969c-2c9ff47e7437</guid>
    </item>
<item>
  <title><a href="/articles/2006/11/07/nelson-the-newest-server-in-the-rack" hreflang="en">Nelson: the newest server in the rack</a></title>
  <link>https://jpoesen.com/articles/2006/11/07/nelson-the-newest-server-in-the-rack</link>
  <description>&lt;p&gt;So after much fiddling and (re)compiling, I'm happy to announce the new web server setup is only a few tweaks away from completion.&lt;/p&gt;&lt;p&gt;Nelson's running a custom compiled Apache 2.2 + mod_proxy_balancer + mongrel. A detailed write-up will follow.&lt;/p&gt;&lt;p&gt;I'll be moving over some of the Rails projects to Nelson soon, but first, we sleep.&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:46</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">8ee78d52-70ce-4b43-a917-9491c8a3246c</guid>
    </item>
<item>
  <title><a href="/articles/2006/11/15/ruby-performance-tuning-with-ruby-prof" hreflang="en">Ruby performance tuning with ruby-prof</a></title>
  <link>https://jpoesen.com/articles/2006/11/15/ruby-performance-tuning-with-ruby-prof</link>
  <description>&lt;p&gt;I've been working on a multithreaded ruby server/process monitor to keep track of a number of production environments. I'll be writing up on the specifics later on, including the related python/ruby showdown with &lt;a href="http://blog.heymans.org"&gt;Bert Heymans&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Today however, I'm going to focus on a specific problem I encountered: the ruby process immediately took up somewhere between 95% and 99% of the CPU. Not good.&lt;/p&gt;&lt;p&gt;Enter &lt;a href="http://ruby-prof.rubyforge.org/"&gt;ruby-prof&lt;/a&gt;, a mean and fast ruby code profiler helps you figure out exactly which bits of code are hogging the resources. It even produces text files and nicely formatted html graphs. Ooh, shiny! Indeed.&lt;/p&gt;&lt;p&gt;Simply install ruby-prof as a gem and run&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;ruby-prof --printer=graph_html --file=myoutput.html myscript.rb&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In my case, this exposed the fact that Time.new was being called approximately 2 million times in 30 seconds, and that - unsurprisingly - most of the time was spent instantiating Time objects.&lt;/p&gt;&lt;p&gt;I no longer blame my cpu for going nuts.&lt;/p&gt;&lt;p&gt;I was trying to introduce timed event handling to make sure my scheduled monitoring processes run every x seconds. I solved this by entering an endless loop (&lt;code&gt;while (true)&lt;/code&gt;) and on each iteration comparing the difference between &lt;code&gt;Time.new&lt;/code&gt; and the end time of the moment the action finished last. Bad idea.&lt;/p&gt;&lt;p&gt;I replaced this brainfart with a&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sleep (my_interval)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;that's called after the monitoring action has been executed.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Problem solved and my script doesn't even show up in the top list anymore.&lt;/p&gt;&lt;p&gt;Sweet.&lt;/p&gt;&lt;hr&gt;&lt;p&gt;&lt;strong&gt;Resources&lt;/strong&gt;:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://ruby-prof.rubyforge.org/"&gt;ruby-prof project page&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cfis.savagexi.com/articles/2006/06/21/ruby-prof-0-4-0-with-call-graphs"&gt;Charlie Savage on ruby-prof.0.4.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.oreillynet.com/ruby/blog/2006/08/profiling_ruby_code_with_rubyp.html"&gt;O'Reilly ruby: Profiling Ruby code with ruby-prof&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description>
  <pubDate>2024-12-23 - 11:44</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">a812505d-5c1b-4a8f-8ac9-e0c986306358</guid>
    </item>
<item>
  <title><a href="/articles/2007/02/23/setting-up-an-nginx-based-rails-stack-on-ubuntu" hreflang="en">Setting up an nginx based rails stack on ubuntu</a></title>
  <link>https://jpoesen.com/articles/2007/02/23/setting-up-an-nginx-based-rails-stack-on-ubuntu</link>
  <description>&lt;article&gt;&lt;h2&gt;Overview&lt;/h2&gt;&lt;p&gt;We'll be installing a full rails stack without apache on ubuntu dapper:&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.nginx.net"&gt;nginx&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ruby-lang.org"&gt;ruby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rubyonrails.org"&gt;rails&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mysql.com"&gt;mysql&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mongrel.rubyforge.org"&gt;mongrel&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mongrel.rubyforge.org/docs/mongrel_cluster.html"&gt;mongrel_cluster&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Make sure you download the latest version of nginx, ruby and the other components. Don't just blindly copy/paste the code snippets or your precious rails stack will be obsolete in a New York minute.&lt;/p&gt;&lt;p&gt;Okay, let's get messy.&lt;/p&gt;&lt;h2&gt;Preparations&lt;/h2&gt;&lt;p&gt;Start by enabling the Ubuntu Universe repository and updating your package sources:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sudo nano /etc/apt/sources.list&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Uncomment the lines containing 'universe'. Save and exit.&lt;/p&gt;&lt;p&gt;Update the package sources:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sudo apt-get update&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;MySQL and friends&lt;/h2&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sudo apt-get install mysql-server mysql-common mysql-client libmysqlclient15-dev libmysqlclient15off

sudo mysqladmin -u root password newrootsqlpassword

sudo apt-get install libmysql-ruby&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;GCC compilers and dev tools.&lt;/h2&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sudo apt-get install build-essential libpcre3-dev&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Ruby and friends&lt;/h2&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sudo apt-get install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 libreadline-ruby1.8 libruby1.8 libopenssl-ruby

sudo ln -s /usr/bin/ruby1.8 /usr/local/bin/ruby
sudo ln -s /usr/bin/ri1.8 /usr/local/bin/ri
sudo ln -s /usr/bin/rdoc1.8 /usr/local/bin/rdoc
sudo ln -s /usr/bin/irb1.8 /usr/local/bin/irb&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;&lt;li&gt;On &lt;strong&gt;ubuntu dapper&lt;/strong&gt;, you'll have to install the ruby gems system by downloading it from sourceforge and running &lt;code&gt;./setup.rb&lt;/code&gt;.&lt;/li&gt;&lt;li&gt;On &lt;strong&gt;ubuntu edgy&lt;/strong&gt;, you can just install ruby gems with &lt;code&gt;apt-get&lt;/code&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;Mongrel and mongrel_cluster&lt;/h2&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sudo gem install daemons gem_plugin mongrel mongrel_cluster --include-dependencies&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Rails&lt;/h2&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sudo gem install rails --include-dependencies&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;ImageMagick&lt;/h2&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;sudo apt-get install libxml2-dev libmagick9-dev imagemagick
sudo gem install rmagick&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;Nginx&lt;/h2&gt;&lt;p&gt;Download nginx into a temp directory, unpack and install:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;wget http://sysoev.ru/nginx/nginx-0.5.14.tar.gz
tar -xzvf nginx-0.5.14.tar.gz
cd nginx-0.5.14
./configure --sbin-path=/usr/local/sbin
make
sudo make install
sudo chmod +x /usr/local/sbin/nginx&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;All done. Have fun.&lt;/p&gt;&lt;/article&gt;&lt;footer&gt;&amp;nbsp;&lt;/footer&gt;</description>
  <pubDate>2024-12-23 - 11:30</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">fbf91610-7b63-4b27-9308-467bc331af0e</guid>
    </item>
<item>
  <title><a href="/articles/2007/03/10/building-your-own-firewall-with-a-linksys-wrt54g" hreflang="en">Building your own firewall with a linksys WRT54G</a></title>
  <link>https://jpoesen.com/articles/2007/03/10/building-your-own-firewall-with-a-linksys-wrt54g</link>
  <description>&lt;p&gt;One of the two remaining windows machines on our network has been infected with a spambot trojan. Our ISP has warned us they'll cut off our access unless we bring them proof "our network is clean".&lt;/p&gt;&lt;p&gt;So, I sighed and cursed and put a shitload of work on hold to fix the problem. I've done quite some pc repair work (virii, malware, unpatched windows installs, etc), but I've never come across anything this nasty. This spambot is untraceable: AVG Antivirus, AVG Antispyware, DrWeb, Spybot, Adaware, PcCilin, ClamWin,... not a single anti-malware app can find this thing.&lt;/p&gt;&lt;p&gt;I do know it is there, though. The traffic logs on my &lt;strong&gt;linksys WRT54GL&lt;/strong&gt;, running the linux based replacement firmware &lt;a href="http://www.dd-wrt.com"&gt;DD-WRT&lt;/a&gt;, clearly shows a massive amount of SMTP connections per second, originating from the windows machine.&lt;/p&gt;&lt;p&gt;So, a windows reinstall being out of the question (no time to reinstall and configure all the apps), I decided it's time for an external &lt;strong&gt;firewall&lt;/strong&gt;. I'm planning to replace the windows machines with &lt;a href="http://www.ubuntu.com"&gt;Ubuntu&lt;/a&gt; anyhow, and I can't spend any more time hunting for the trojan. Since I already have a router with firewall capabilities, why not figure out how to configure it?&amp;nbsp;&lt;/p&gt;&lt;p&gt;Here goes: installing a firewall on a linksys WRT54GL&lt;/p&gt;&lt;p&gt;As it turns out, it is easy as hell!&lt;/p&gt;&lt;p&gt;Linux comes with a firewall called &lt;a href="http://www.linuxguruz.com/iptables/howto/maniptables.html"&gt;iptables&lt;/a&gt;. All you have to do is add specific rules for incoming or outgoing traffic. You can start with some basic, easy rules and work your way up to very intricate rules that involve blacklists, whitelists, packet timing, QOS (quality of service), attack signatures, etc.&lt;/p&gt;&lt;p&gt;For my problem, I need to be able to send e-mail (SMTP) through several e-mail servers, but I want to block all other outgoing SMTP-traffic.&lt;/p&gt;&lt;p&gt;As the order of your firewall rules is very important, you want to start by allowing certain traffic and end with disallowing all the other traffic. This is how it's done:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;/usr/sbin/iptables -I FORWARD 1 -p tcp -d safe.server1.com --dport 25 -j logaccept&amp;nbsp;
/usr/sbin/iptables -I FORWARD 2 -p tcp -d safe.server2.com --dport 25 -j logaccept&amp;nbsp;
/usr/sbin/iptables -I FORWARD 3 -p tcp --dport 25 -j logdrop&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Digging deep into the guts of iptables rules is beyond the scope of this article. You just have to understand that:&lt;/p&gt;&lt;p&gt;1. all tcp traffic on port 25 (smtp) from any machine on the network to two specific machines on the internet, is accepted and logged.&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2. All other tcp traffic on port 25 is dropped and logged.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;6 steps to transform a clean linksys WRT54G into a firewalled DD-WRT router&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;1. download the DD-WRT replacement firmware (latest version: v23 SP3 at the time of writing)&lt;br&gt;2. go to your linksys WRT54G's admin page&lt;br&gt;3. install the firmware through [Administration] &amp;gt; [firmware upgrade]&lt;br&gt;4. go to [Administration] &amp;gt; [commands]&lt;br&gt;5. click [edit] in the firewall window&lt;br&gt;6. enter the iptables the above iptables rules in the [commands] window and click [save firewall]&lt;/p&gt;&lt;p&gt;Voila , all done. Test by doing:&lt;/p&gt;&lt;p&gt;&lt;code&gt;telnet safe.server.com 25&lt;/code&gt;&lt;/p&gt;&lt;p&gt;If you can connect: great, the firewall let you through. Test if all the other outgoing smtp traffic is rejected by doing:&lt;/p&gt;&lt;p&gt;&lt;code&gt;telnet smtp.some-other-server.com 25&lt;/code&gt;&lt;/p&gt;&lt;p&gt;You should not be able to connect. After a while, your connection attempt should time out.&lt;/p&gt;&lt;p&gt;And that's it. There's nothing more to it. You've got yourself a home grown linux based firewall. Geeky delight.&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:26</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">594e2fbe-b68d-4e8d-87ed-6ba9a56467c8</guid>
    </item>
<item>
  <title><a href="/articles/2007/03/23/mysql-data-import-via-the-command-line" hreflang="en">MySQL data import via the command line</a></title>
  <link>https://jpoesen.com/articles/2007/03/23/mysql-data-import-via-the-command-line</link>
  <description>&lt;p&gt;If you're used working with phpmyadmin, you might find yourself a bit lost when you're working in an environment without php-support like, say, when you're setting up an nginx-based rails stack.&lt;/p&gt;&lt;p&gt;To import an export script (or any other slq script obviously), here's what you do:&lt;/p&gt;&lt;pre&gt;&lt;code class="language-plaintext"&gt;mysql -u YOURNAME -p YOURPASS -D YOUBD &amp;lt; filename.sql&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;params:&lt;br&gt;-&lt;strong&gt;u:&lt;/strong&gt; username&lt;br&gt;-&lt;strong&gt;p:&lt;/strong&gt; password&lt;br&gt;-&lt;strong&gt;D:&lt;/strong&gt; database name&lt;/p&gt;&lt;p&gt;Sweet, no?&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:24</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">4d577aa9-ceac-4e8b-8b6d-685c3c9d14f7</guid>
    </item>
<item>
  <title><a href="/articles/2007/03/23/little-nugget-of-wisdom-235-binrm-argument-list-too-long-oh-my" hreflang="en">Little Nugget of Wisdom #235: /bin/rm: Argument list too long - oh my!</a></title>
  <link>https://jpoesen.com/articles/2007/03/23/little-nugget-of-wisdom-235-binrm-argument-list-too-long-oh-my</link>
  <description>&lt;p&gt;When you have too many files in a given directory, and want to delete them all using &lt;code&gt;rm&lt;/code&gt;, you can get presented with:&lt;/p&gt;&lt;p&gt;&lt;strong&gt;/bin/rm: Argument list too long&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Crap. What's happening here? Basically &lt;code&gt;rm&lt;/code&gt; uses a 128K buffer for its operations, but if the list of files (argument list) is too long to fit into that buffer: tough luck.&lt;/p&gt;&lt;p&gt;Solution:&lt;/p&gt;&lt;p&gt;&lt;code&gt;find . -name '*.txt' -print0 | xargs -0 rm&lt;/code&gt;&lt;/p&gt;&lt;p&gt;Voila. All gone.&lt;/p&gt;&lt;p&gt;Hat tip: &lt;a href="http://www.matrixlist.com/pipermail/leaplist/2002-August/023528.html"&gt;John Simpson&lt;/a&gt;.&lt;/p&gt;</description>
  <pubDate>2024-12-23 - 11:23</pubDate>
    <dc:creator>Joeri Poesen</dc:creator>
    <guid isPermaLink="false">8d25c978-4428-4e76-b0f2-b6ad9a5ca999</guid>
    </item>

  </channel>
</rss>
