<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>ilManzo's blog</title><link>https://ilmanzo.github.io/</link><description>Recent content on ilManzo's blog</description><generator>Hugo</generator><language>en-us</language><copyright>2012-2025 Andrea Manzini</copyright><lastBuildDate>Thu, 09 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://ilmanzo.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Landlock idiomatic sandboxing in Nim</title><link>https://ilmanzo.github.io/post/landlock_idiomatic_sandboxing_in_nim/</link><pubDate>Thu, 09 Apr 2026 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/landlock_idiomatic_sandboxing_in_nim/</guid><description>Harden linux programs using Linux Landlock</description></item><item><title>Rootless Podman as a Salt Lab Environment</title><link>https://ilmanzo.github.io/post/rootless_podman_as_salt_lab_environment/</link><pubDate>Wed, 18 Mar 2026 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/rootless_podman_as_salt_lab_environment/</guid><description>&lt;h2 id="-salt-without-the-sudo"&gt;🧂 Salt without the sudo&lt;/h2&gt;
&lt;p&gt;Follow-up from &lt;a href="https://ilmanzo.github.io/post/podman_quadlets_tutorial/"&gt;the previous post&lt;/a&gt;, today we are going to put our systemd-managed containers to work and use them for some useful tasks.&lt;/p&gt;
&lt;p&gt;The idea is to set up an environment to learn how the configuration management &lt;a href="https://saltproject.io/"&gt;Salt&lt;/a&gt; works, and play/hack around with it, without even needing root or &lt;code&gt;sudo&lt;/code&gt; rights. After all, in the infra-world, &lt;strong&gt;the Salt must flow&lt;/strong&gt;!&lt;/p&gt;
&lt;p&gt;So we will setup two containers, one as a &lt;em&gt;salt server&lt;/em&gt; and the other as a &lt;em&gt;salt &amp;ldquo;minion&amp;rdquo;&lt;/em&gt; (representing the machine that will be configured via salt).&lt;/p&gt;</description></item><item><title>Zig Day 2026 recap</title><link>https://ilmanzo.github.io/post/zig_day_2026/</link><pubDate>Sun, 22 Feb 2026 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/zig_day_2026/</guid><description>Small debriefing after coding event</description></item><item><title>A Friendly Guide to Podman Quadlets</title><link>https://ilmanzo.github.io/post/podman_quadlets_tutorial/</link><pubDate>Tue, 03 Feb 2026 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/podman_quadlets_tutorial/</guid><description>&lt;h2 id="-hi-geekos"&gt;🦎 Hi geekos!&lt;/h2&gt;
&lt;p&gt;If you’ve been running containers on your &lt;a href="https://get.opensuse.org/leap"&gt;Leap&lt;/a&gt; or &lt;a href="https://get.opensuse.org/tumbleweed/"&gt;Tumbleweed&lt;/a&gt; machine, you probably started with &lt;code&gt;podman run&lt;/code&gt; commands. Maybe you moved to &lt;code&gt;Docker Compose&lt;/code&gt; files to manage stacks. Those are great tools, but they have a limitation, as they don&amp;rsquo;t integrate natively with &lt;code&gt;systemd&lt;/code&gt;, your operating system&amp;rsquo;s init system.&lt;/p&gt;
&lt;p&gt;When your server reboots, do your containers start back up automatically? If a container crashes, does it restart? How do you view its logs alongside your system journal?&lt;/p&gt;</description></item><item><title>A Headless Linux Router Build</title><link>https://ilmanzo.github.io/post/repurpose_old_netbook_as_wifi_repeater/</link><pubDate>Sat, 24 Jan 2026 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/repurpose_old_netbook_as_wifi_repeater/</guid><description>&lt;h2 id="-void-in-the-basement"&gt;👻 Void in the Basement&lt;/h2&gt;
&lt;p&gt;I have a basement, and I have a problem: no WiFi signal in said basement. I have also a piece of e-waste that refuses to die: a &lt;a href="https://en.wikipedia.org/wiki/Samsung_N130"&gt;&lt;strong&gt;Samsung N130 netbook from 2009&lt;/strong&gt;&lt;/a&gt;.
It has a single-core Atom processor and 1GB of RAM. By modern standards, it can barely open a web browser. But for a Linux terminal, It&amp;rsquo;s a &lt;em&gt;supercomputer&lt;/em&gt;.
Instead of buying a generic ~10€ WiFi repeater, I decided to turn this little warrior into a fully programmable, secure, and transparent WiFi router using &lt;a href="https://voidlinux.org/"&gt;&lt;strong&gt;Void Linux&lt;/strong&gt;&lt;/a&gt;. Here is exactly how I did it.&lt;/p&gt;</description></item><item><title>Automating OpenQA Job Cloning with Python and YAML</title><link>https://ilmanzo.github.io/post/automating_job_cloning/</link><pubDate>Wed, 07 Jan 2026 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/automating_job_cloning/</guid><description>&lt;h2 id="-happy-new-year"&gt;🎉 Happy New Year!&lt;/h2&gt;
&lt;p&gt;As anyone working with &lt;a href="https://open.qa/"&gt;OpenQA&lt;/a&gt; knows, it is a powerful tool for automated testing. But sometimes, the workflow around re-triggering those tests for investigation purposes can feel a bit&amp;hellip; &lt;em&gt;Manual&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Recently, I found myself in a repetitive cycle while debugging complex test scenarios. My workflow looked something like this:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Take a known &amp;ldquo;good&amp;rdquo; job URL.&lt;/li&gt;
&lt;li&gt;Open a scratchpad editor.&lt;/li&gt;
&lt;li&gt;Craft a long &lt;code&gt;openqa-clone-job&lt;/code&gt; command with tons of specific override parameters (&lt;code&gt;BUILD=0&lt;/code&gt;, custom git branches, skipping specific modules, etc.).&lt;/li&gt;
&lt;li&gt;Run the command in the terminal, wait for the output.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Painfully visual scan of the terminal output&lt;/strong&gt;, to identify the newly created job URLs, and select them with my mouse, to copy them.&lt;/li&gt;
&lt;li&gt;Paste them into &lt;a href="https://github.com/os-autoinst/openqa-mon"&gt;&lt;code&gt;openqa-mon&lt;/code&gt;&lt;/a&gt; or a text file to track their progress.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Till now I used a &lt;code&gt;Bash&lt;/code&gt; script that kind of helped, but modifying giant arrays of arguments for every different debugging scenario was annoying and error-prone.&lt;/p&gt;</description></item><item><title>Advent of code 2025: the diaries</title><link>https://ilmanzo.github.io/post/advent_of_code_2025/</link><pubDate>Mon, 01 Dec 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/advent_of_code_2025/</guid><description>Having fun with Christmas code challenges</description></item><item><title>October 2025 conferences recap</title><link>https://ilmanzo.github.io/post/october_2025_conferences/</link><pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/october_2025_conferences/</guid><description>Quick debriefing after autumn events</description></item><item><title>Automated files cleanup on Linux</title><link>https://ilmanzo.github.io/post/my-linux-janitor/</link><pubDate>Thu, 23 Oct 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/my-linux-janitor/</guid><description>🚮 Or: how I taught my Linux box to take out its own trash</description></item><item><title>From QEMU Headache to Headless</title><link>https://ilmanzo.github.io/post/qboot-qemu-helper/</link><pubDate>Sun, 28 Sep 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/qboot-qemu-helper/</guid><description>Taming a Command-Line Monster</description></item><item><title>my resume</title><link>https://ilmanzo.github.io/curriculum/</link><pubDate>Mon, 07 Jul 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/curriculum/</guid><description>curriculum vitae</description></item><item><title>June 2025 conferences recap</title><link>https://ilmanzo.github.io/post/june_2025_conferences/</link><pubDate>Sun, 29 Jun 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/june_2025_conferences/</guid><description>Quick debriefing after summer events</description></item><item><title>How much code are you testing ? (3)</title><link>https://ilmanzo.github.io/post/pintool-function-tracing/</link><pubDate>Tue, 17 Jun 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/pintool-function-tracing/</guid><description>Using Intel PIN to measure test coverage on binaries</description></item><item><title>Refactoring the D Koans with metaprogramming</title><link>https://ilmanzo.github.io/post/refactoring-d-koans-with-metaprogramming/</link><pubDate>Wed, 21 May 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/refactoring-d-koans-with-metaprogramming/</guid><description>How metaprogramming helped create a cleaner testing experience for D Koans</description></item><item><title>How much code are you testing ? (2)</title><link>https://ilmanzo.github.io/post/measuring-test-coverage-on-binaries/</link><pubDate>Sun, 30 Mar 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/measuring-test-coverage-on-binaries/</guid><description>Measuring test coverage on binaries</description></item><item><title>How much code are you testing ? (1)</title><link>https://ilmanzo.github.io/post/measuring-coverage-of-integration-tests/</link><pubDate>Sun, 23 Feb 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/measuring-coverage-of-integration-tests/</guid><description>Measuring coverage of integration tests</description></item><item><title>Systemd Socket Activation Explained</title><link>https://ilmanzo.github.io/post/systemd-socket-activated-services/</link><pubDate>Sun, 02 Feb 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/systemd-socket-activated-services/</guid><description>Stop Wasting Resources: how to start your services on demand</description></item><item><title>Writing shell filters for fun and profit</title><link>https://ilmanzo.github.io/post/openqa-job-filter-rust/</link><pubDate>Sun, 19 Jan 2025 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/openqa-job-filter-rust/</guid><description>An utility to simplify monitoring openqa job clones</description></item><item><title>Debriefing Advent of Code 2024</title><link>https://ilmanzo.github.io/post/advent_of_code_2024/</link><pubDate>Thu, 26 Dec 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/advent_of_code_2024/</guid><description>A personal recap of Advent of Code 2024</description></item><item><title>Wrapping up GoLab 2024</title><link>https://ilmanzo.github.io/post/golab2024/</link><pubDate>Fri, 15 Nov 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/golab2024/</guid><description>Personal recap of GoLab 2024 conference</description></item><item><title>Linux Test Project part 2</title><link>https://ilmanzo.github.io/post/followup_linux_test_project_options/</link><pubDate>Sun, 27 Oct 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/followup_linux_test_project_options/</guid><description>Follow-up on LTP: the test options</description></item><item><title>Wrapping up ContainerDay 2024</title><link>https://ilmanzo.github.io/post/containerday2024/</link><pubDate>Fri, 11 Oct 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/containerday2024/</guid><description>Highlights from Italian ContainerDay 2024 conference</description></item><item><title>The Linux kernel ftrace</title><link>https://ilmanzo.github.io/post/kernel_ftrace/</link><pubDate>Tue, 01 Oct 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/kernel_ftrace/</guid><description>Overview of the Linux kernel tracing feature</description></item><item><title>Testing a cheap MicroSD card quality</title><link>https://ilmanzo.github.io/post/testing_a_microsd_card/</link><pubDate>Tue, 03 Sep 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/testing_a_microsd_card/</guid><description>Some basic checks to ensure you bought a good storage for your files</description></item><item><title>Playing with Linux kernel capabilities</title><link>https://ilmanzo.github.io/post/playing_with_linux_capabilities/</link><pubDate>Fri, 02 Aug 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/playing_with_linux_capabilities/</guid><description>What are and how to use the Linux kernel capabilities</description></item><item><title>Measure your program's power consumption</title><link>https://ilmanzo.github.io/post/measure_your_power_consumption/</link><pubDate>Sun, 30 Jun 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/measure_your_power_consumption/</guid><description>Understand how much power you are using</description></item><item><title>Headless Testing of PySide/PyQt GUI Applications with pytest-qt</title><link>https://ilmanzo.github.io/post/testing_pyside_gui_applications/</link><pubDate>Wed, 22 May 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/testing_pyside_gui_applications/</guid><description>An approach to headless testing of GUI programs</description></item><item><title>A different approach to terminal user interfaces</title><link>https://ilmanzo.github.io/post/first_steps_with_golang_tui/</link><pubDate>Fri, 03 May 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/first_steps_with_golang_tui/</guid><description>First steps with Bubble Tea, a Go TUI framework</description></item><item><title>SEGFAULT: Debugging a crashing application</title><link>https://ilmanzo.github.io/post/debugging_segfault/</link><pubDate>Fri, 05 Apr 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/debugging_segfault/</guid><description>What&amp;#39;s a core dump and how to use it for debugging ?</description></item><item><title>Osday 2024 recap</title><link>https://ilmanzo.github.io/post/wrapping_up_osday_2024/</link><pubDate>Mon, 11 Mar 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/wrapping_up_osday_2024/</guid><description>Quick debriefing after a cool event in Florence</description></item><item><title>Playing with Rust on ARM architecture</title><link>https://ilmanzo.github.io/post/experiments_with_rust_on_arm_architecture/</link><pubDate>Fri, 01 Mar 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/experiments_with_rust_on_arm_architecture/</guid><description>Easy cross compilation for everyone</description></item><item><title>First steps with Linux Test Project</title><link>https://ilmanzo.github.io/post/first_steps_of_ltp_linux_test_project/</link><pubDate>Sat, 10 Feb 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/first_steps_of_ltp_linux_test_project/</guid><description>How the Linux Kernel is tested, one syscall at a time</description></item><item><title>Introduction to packaging Rust application</title><link>https://ilmanzo.github.io/post/introduction_to_packaging_rust_applications/</link><pubDate>Fri, 19 Jan 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/introduction_to_packaging_rust_applications/</guid><description>How to package a Rust application on openSUSE</description></item><item><title>Fault Injection in Network Namespace and Veth Environments</title><link>https://ilmanzo.github.io/post/faulty_network_simulation/</link><pubDate>Sat, 06 Jan 2024 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/faulty_network_simulation/</guid><description>How to improve your software by simulating a faulty network device</description></item><item><title>Expect the unexpected</title><link>https://ilmanzo.github.io/post/faulty_disk_simulation/</link><pubDate>Sun, 19 Nov 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/faulty_disk_simulation/</guid><description>How to improve your software by simulating a faulty block device</description></item><item><title>A trip on the rusty D-Bus</title><link>https://ilmanzo.github.io/post/a_trip_on_the_rusty_dbus/</link><pubDate>Wed, 04 Oct 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/a_trip_on_the_rusty_dbus/</guid><description>How to expose a D-Bus service and create a simple client writing some Rust code</description></item><item><title>Quiet fans on Thinkpad P15</title><link>https://ilmanzo.github.io/post/quiet_thinkpad_fans/</link><pubDate>Fri, 01 Sep 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/quiet_thinkpad_fans/</guid><description>How to lower the default fan noise on Thinkpad P15 Gen2</description></item><item><title>Using containers for unit testing of bash functions</title><link>https://ilmanzo.github.io/post/unit_testing_bash_functions/</link><pubDate>Thu, 17 Aug 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/unit_testing_bash_functions/</guid><description>How to create an isolate environment to safely test your bash scripts</description></item><item><title>Embed git commit hash into an executable</title><link>https://ilmanzo.github.io/post/embed_git_commit_hash_in_build/</link><pubDate>Sat, 01 Jul 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/embed_git_commit_hash_in_build/</guid><description>How to insert the current HEAD commit hash in a binary</description></item><item><title>Old-School demo effects with Crystal</title><link>https://ilmanzo.github.io/post/crystal-demo-effects/</link><pubDate>Thu, 18 May 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/crystal-demo-effects/</guid><description>revisiting old code with a new programming language</description></item><item><title>Benchmarking a Rust function</title><link>https://ilmanzo.github.io/post/advent_of_benchmark/</link><pubDate>Sun, 02 Apr 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/advent_of_benchmark/</guid><description>A first look at Rust performance benchmarking</description></item><item><title>Debugging a problematic build</title><link>https://ilmanzo.github.io/post/inspect-obs-vm-during-build/</link><pubDate>Tue, 14 Mar 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/inspect-obs-vm-during-build/</guid><description>A technique to inspect Open Build Service build process</description></item><item><title>a SUSE hackweek22 report</title><link>https://ilmanzo.github.io/post/suse-hackweek-2023-recap/</link><pubDate>Fri, 03 Feb 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/suse-hackweek-2023-recap/</guid><description>writeup about learnings and achievements in last SUSE hackweek</description></item><item><title>compare package version across distros</title><link>https://ilmanzo.github.io/post/compare_package_versions_across_distros/</link><pubDate>Mon, 09 Jan 2023 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/compare_package_versions_across_distros/</guid><description>a tool to check if an openSUSE package version is up to date against other distros</description></item><item><title>get update info about packages</title><link>https://ilmanzo.github.io/post/check-last-update-on-packages/</link><pubDate>Thu, 24 Nov 2022 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/check-last-update-on-packages/</guid><description>a simple wrapper to get last update date on a package</description></item><item><title>get notifications about openQA job status</title><link>https://ilmanzo.github.io/post/openqa-jobs-notifier/</link><pubDate>Wed, 05 Oct 2022 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/openqa-jobs-notifier/</guid><description>how to receive notification about your openQA job status update</description></item><item><title>web components with Nim and Karax</title><link>https://ilmanzo.github.io/post/nim-frontend-web-development-with-karax/</link><pubDate>Thu, 07 Jul 2022 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/nim-frontend-web-development-with-karax/</guid><description>how to create a simple web component in a Karax web application</description></item><item><title>automate OTP credentials for multi-factor authentication</title><link>https://ilmanzo.github.io/post/otp-generation-from-command-line/</link><pubDate>Tue, 14 Jun 2022 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/otp-generation-from-command-line/</guid><description>automate generation of OTP for multi-factor authentication</description></item><item><title>linux resource control with cgroups</title><link>https://ilmanzo.github.io/post/linux-resource-control-with-cgroups/</link><pubDate>Tue, 03 May 2022 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/linux-resource-control-with-cgroups/</guid><description>using systemd slices to manage resources</description></item><item><title>integration between Python and Rust - Part 2</title><link>https://ilmanzo.github.io/post/writing-python-modules-in-rust-2/</link><pubDate>Fri, 07 Jan 2022 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/writing-python-modules-in-rust-2/</guid><description>some experiments with language FFI</description></item><item><title>integration between Python and Rust - Part 1</title><link>https://ilmanzo.github.io/post/writing-python-modules-in-rust-1/</link><pubDate>Wed, 18 Aug 2021 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/writing-python-modules-in-rust-1/</guid><description>some experiments with language FFI</description></item><item><title>playing with eBPF interface - 2</title><link>https://ilmanzo.github.io/post/tracing-with-ebpf-02/</link><pubDate>Wed, 19 May 2021 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/tracing-with-ebpf-02/</guid><description>some fun experiments with tracing and snooping linux kernel</description></item><item><title>playing with eBPF interface - 1</title><link>https://ilmanzo.github.io/post/playing-with-ebpf-01/</link><pubDate>Tue, 11 May 2021 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/playing-with-ebpf-01/</guid><description>some fun experiments with tracing and snooping linux kernel</description></item><item><title>a 'pythonic' fileinput module for the D programming language</title><link>https://ilmanzo.github.io/post/fileinput-for-d-programming-language/</link><pubDate>Mon, 25 Jan 2021 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/fileinput-for-d-programming-language/</guid><description>an implementation of a custom iterator similar to Python&amp;#39;s fileinput</description></item><item><title>Writing Python modules in Nim</title><link>https://ilmanzo.github.io/post/writing-python-modules-in-nim/</link><pubDate>Sat, 05 Dec 2020 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/writing-python-modules-in-nim/</guid><description>how to write a Python module using the Nim programming language</description></item><item><title>A new project to learn the Crystal Programming Language</title><link>https://ilmanzo.github.io/post/a-new-project-to-learn-the-crystal-programming-language/</link><pubDate>Fri, 20 Nov 2020 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/a-new-project-to-learn-the-crystal-programming-language/</guid><description>learn the crystal programming language by solving simple exercises</description></item><item><title>Hijack C library functions in D</title><link>https://ilmanzo.github.io/post/hijack-c-library-function-in-d/</link><pubDate>Tue, 10 Mar 2020 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/hijack-c-library-function-in-d/</guid><description>&lt;p&gt;I like playing with the &lt;a href="https://dlang.org/"&gt;D programming language&lt;/a&gt; and I wrote this little post to show how it&amp;rsquo;s easy to create a dynamic library (shared object, &lt;code&gt;.so&lt;/code&gt;) that can be invoked in other programs; to have a little fun we will write a D replacement for the &lt;code&gt;rand()&lt;/code&gt; C standard library function call. For your convenience, all the code is also &lt;a href="https://github.com/ilmanzo/hijack_C_stdlib_func_with_D"&gt;on github&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the demo implementation, a C program that calls 10 times the stdlib function &lt;code&gt;rand()&lt;/code&gt; to get a random number.&lt;/p&gt;</description></item><item><title>a very simple NTP client in D</title><link>https://ilmanzo.github.io/post/a-simple-ntp-client-in-d/</link><pubDate>Thu, 20 Feb 2020 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/a-simple-ntp-client-in-d/</guid><description>&lt;p&gt;I am quite a fan of the &lt;a href="https://dlang.org/"&gt;D programming language&lt;/a&gt; and I think it deserves more attention, even if since a few months it&amp;rsquo;s becoming more and more popular, as it gained top20 in the &lt;a href="https://www.tiobe.com/tiobe-index/"&gt;TIOBE Index&lt;/a&gt; for February 2020.&lt;/p&gt;
&lt;p&gt;As an experiment in network programming, I took &lt;a href="https://github.com/SanketDG/c-projects/blob/master/ntp-client.c"&gt;this simple NTP client&lt;/a&gt; written in C and translated to D ; in my opinion while it&amp;rsquo;s keeping the low-level nature, it&amp;rsquo;s shorter, clearer and more effective. It&amp;rsquo;s only a dozen lines of code, but full program is available &lt;a href="https://github.com/ilmanzo/ntpclient"&gt;on my github&lt;/a&gt;; stars and contributions are welcome!&lt;/p&gt;</description></item><item><title>migrating a repository from mercurial to git</title><link>https://ilmanzo.github.io/post/migrating-a-repository-from-mercurial-to-git/</link><pubDate>Sun, 15 Dec 2019 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/migrating-a-repository-from-mercurial-to-git/</guid><description>&lt;p&gt;Since &lt;a href="https://bitbucket.org/blog/sunsetting-mercurial-support-in-bitbucket"&gt;bitbucket is sunsetting the support for mercurial repositories&lt;/a&gt;, I wrote a quick and dirty script to automate the migration from mercurial to GIT:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;set -u
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#f92672"&gt;[&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;$#&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; -ne &lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#f92672"&gt;]&lt;/span&gt;; &lt;span style="color:#66d9ef"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;Illegal number of parameters&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo &lt;span style="color:#e6db74"&gt;&amp;#34;usage: migrate.sh reponame hgrepourl gitrepourl&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exit &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;REPONAME&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;HGURL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$2
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;GITURL&lt;span style="color:#f92672"&gt;=&lt;/span&gt;$3
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;Migrating &lt;/span&gt;$REPONAME&lt;span style="color:#e6db74"&gt; from &lt;/span&gt;$HGURL&lt;span style="color:#e6db74"&gt; to &lt;/span&gt;$GITURL&lt;span style="color:#e6db74"&gt;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hg clone $HGURL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd $REPONAME
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hg bookmark -r default master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hg bookmarks hg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ..
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mv $REPONAME &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;REPONAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;_hg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;mkdir &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;REPONAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;_git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd &lt;span style="color:#e6db74"&gt;${&lt;/span&gt;REPONAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;_git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init --bare .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ../&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;REPONAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;_hg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hg push ../&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;REPONAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;_git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd ../&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;REPONAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;_git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote add hgmigrate $GITURL
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push hgmigrate master
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd /tmp
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;rm -rf /tmp/&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;REPONAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;_hg /tmp/&lt;span style="color:#e6db74"&gt;${&lt;/span&gt;REPONAME&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;_git
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;...done&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Before running the script, you only need to install git and create a git repository (remote or local).&lt;/p&gt;</description></item><item><title>il linguaggio Lua: parte 14</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-14/</link><pubDate>Fri, 15 Feb 2019 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-14/</guid><description>introduzione al linguaggio Lua</description></item><item><title>il linguaggio Lua: parte 13</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-13/</link><pubDate>Sat, 19 Jan 2019 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-13/</guid><description>introduzione al linguaggio Lua</description></item><item><title>il linguaggio Lua: parte 12</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-12/</link><pubDate>Wed, 24 Oct 2018 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-12/</guid><description>introduzione al linguaggio Lua</description></item><item><title>il linguaggio Lua: parte 11</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-11/</link><pubDate>Fri, 07 Sep 2018 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-11/</guid><description>introduzione al linguaggio Lua</description></item><item><title>il linguaggio Lua: parte 10</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-10/</link><pubDate>Fri, 03 Aug 2018 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-10/</guid><description>introduzione al linguaggio Lua</description></item><item><title>a honeypot ssh server in Go</title><link>https://ilmanzo.github.io/post/a-honeypot-ssh-server-in-go/</link><pubDate>Tue, 26 Jun 2018 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/a-honeypot-ssh-server-in-go/</guid><description>a fake ssh server that works as a honeypot, written in Go</description></item><item><title>il linguaggio Lua: parte 9</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-09/</link><pubDate>Fri, 22 Jun 2018 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-09/</guid><description>introduzione al linguaggio Lua</description></item><item><title>il linguaggio Lua: ottava parte</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-08/</link><pubDate>Mon, 23 Apr 2018 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-08/</guid><description>introduzione al linguaggio Lua</description></item><item><title>il linguaggio Lua: settima parte</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-07/</link><pubDate>Sat, 03 Mar 2018 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-07/</guid><description>introduzione al linguaggio Lua</description></item><item><title>a simple PNG decoder in Go</title><link>https://ilmanzo.github.io/post/a-simple-png-decoder/</link><pubDate>Sun, 28 Jan 2018 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/a-simple-png-decoder/</guid><description>&lt;p&gt;while working with image files, I needed a simple way to analyze content of a picture; so I wrote this tool that &amp;ldquo;walks&amp;rdquo; inside a PNG file and reports all the chunks seen; this is intended to be expanded with more features in a future.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;encoding/binary&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;io&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;type&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;chunk&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;Length&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;uint32&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;ChunkType&lt;/span&gt; [&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;]&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; len(&lt;span style="color:#a6e22e"&gt;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Args&lt;/span&gt;) &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;2&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Usage: %s filename.png\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Exit&lt;/span&gt;(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Open&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;os&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Args&lt;/span&gt;[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; panic(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;defer&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;header&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; make([]&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;, &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Read&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;header: %v\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;header&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; panic(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;chunk&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;offset&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;int64&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;offset&lt;/span&gt; = &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;binary&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Read&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;binary&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;BigEndian&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;io&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;EOF&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; panic(&lt;span style="color:#a6e22e"&gt;err&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;fmt&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;Offset: %d chunk len=%d, type: %s\n&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;offset&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Length&lt;/span&gt;, string(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ChunkType&lt;/span&gt;[:&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;]))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Seek&lt;/span&gt;(int64(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Length&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;), &lt;span style="color:#a6e22e"&gt;io&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;SeekCurrent&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;offset&lt;/span&gt; &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; int64(&lt;span style="color:#a6e22e"&gt;data&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Length&lt;/span&gt;) &lt;span style="color:#f92672"&gt;+&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;usage:&lt;/p&gt;</description></item><item><title>il linguaggio Lua: sesta parte</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-06/</link><pubDate>Fri, 22 Dec 2017 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-06/</guid><description>introduzione al linguaggio Lua</description></item><item><title>linux: how to access DHCP options from client</title><link>https://ilmanzo.github.io/post/access-dhcp-options-from-client/</link><pubDate>Mon, 06 Nov 2017 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/access-dhcp-options-from-client/</guid><description>how to access DHCP options from client</description></item><item><title>il linguaggio Lua: quinta parte</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-05/</link><pubDate>Mon, 16 Oct 2017 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-05/</guid><description>introduzione al linguaggio Lua</description></item><item><title>il linguaggio Lua: parte 4</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-04/</link><pubDate>Tue, 11 Apr 2017 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-04/</guid><description>introduzione al linguaggio Lua</description></item><item><title>il linguaggio Lua: parte 3</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-03/</link><pubDate>Mon, 20 Mar 2017 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-03/</guid><description>introduzione al linguaggio Lua</description></item><item><title>convert a binary file to ascii using hexdump</title><link>https://ilmanzo.github.io/post/hexdump-for-binary-file-manipulation/</link><pubDate>Thu, 20 Oct 2016 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/hexdump-for-binary-file-manipulation/</guid><description>convert a binary file to ascii using hexdump</description></item><item><title>playing with Crystal Programming Language</title><link>https://ilmanzo.github.io/post/playing-with-crystal-programming-language/</link><pubDate>Tue, 11 Oct 2016 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/playing-with-crystal-programming-language/</guid><description>exploring new languages</description></item><item><title>a simple HTTP rewriting proxy</title><link>https://ilmanzo.github.io/post/a-simple-http-rewriting-proxy/</link><pubDate>Fri, 12 Aug 2016 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/a-simple-http-rewriting-proxy/</guid><description>&lt;p&gt;This is an example of using &lt;a href="https://github.com/elazarl/goproxy"&gt;goproxy&lt;/a&gt;, a fast and robust multithread proxy engine to develop an HTTP proxy that rewrites content on the fly, with multiple search and substitutions. It can be useful for debugging and other less noble (but useful) purposes &amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// rewriting_proxy project main.go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;package&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;bytes&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;flag&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;io/ioutil&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;github.com/elazarl/goproxy&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;var&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;replacements&lt;/span&gt; = []&lt;span style="color:#66d9ef"&gt;struct&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;from&lt;/span&gt; []&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;to&lt;/span&gt; []&lt;span style="color:#66d9ef"&gt;byte&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {[]byte(&lt;span style="color:#e6db74"&gt;&amp;#34;#e8ecec&amp;#34;&lt;/span&gt;), []byte(&lt;span style="color:#e6db74"&gt;&amp;#34;Red&amp;#34;&lt;/span&gt;)}, &lt;span style="color:#75715e"&gt;// ugly colors!!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {[]byte(&lt;span style="color:#e6db74"&gt;&amp;#34;Comic Sans MS&amp;#34;&lt;/span&gt;), []byte(&lt;span style="color:#e6db74"&gt;&amp;#34;Lucida Sans Unicode&amp;#34;&lt;/span&gt;)}, &lt;span style="color:#75715e"&gt;// for eyes sanity&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {[]byte(&lt;span style="color:#e6db74"&gt;&amp;#34;Java &amp;#34;&lt;/span&gt;), []byte(&lt;span style="color:#e6db74"&gt;&amp;#34;Golang &amp;#34;&lt;/span&gt;)}, &lt;span style="color:#75715e"&gt;// just joking&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;myHandler&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;resp&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Response&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;ctx&lt;/span&gt; &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;goproxy&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ProxyCtx&lt;/span&gt;) &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Response&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;readBody&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ioutil&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ReadAll&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;resp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Body&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;err&lt;/span&gt; &lt;span style="color:#f92672"&gt;!=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;nil&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;//TODO handle read error gracefully&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;resp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;resp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Body&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Close&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;_&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;elem&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;range&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;replacements&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;readBody&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;bytes&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Replace&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;readBody&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;elem&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;from&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;elem&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;to&lt;/span&gt;, &lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;resp&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Body&lt;/span&gt; = &lt;span style="color:#a6e22e"&gt;ioutil&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NopCloser&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;bytes&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NewReader&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;readBody&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;resp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;func&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;verbose&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;flag&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Bool&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;v&amp;#34;&lt;/span&gt;, &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;should every proxy request be logged to stdout&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;proxy&lt;/span&gt; &lt;span style="color:#f92672"&gt;:=&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;goproxy&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;NewProxyHttpServer&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;proxy&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Verbose&lt;/span&gt; = &lt;span style="color:#f92672"&gt;*&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;verbose&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;proxy&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;OnResponse&lt;/span&gt;().&lt;span style="color:#a6e22e"&gt;DoFunc&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;myHandler&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;Fatal&lt;/span&gt;(&lt;span style="color:#a6e22e"&gt;http&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;ListenAndServe&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;:8081&amp;#34;&lt;/span&gt;, &lt;span style="color:#a6e22e"&gt;proxy&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>wrapping c plus plus classes in Python</title><link>https://ilmanzo.github.io/post/wrapping-c-plus-plus-classes-in-python/</link><pubDate>Mon, 08 Aug 2016 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/wrapping-c-plus-plus-classes-in-python/</guid><description>&lt;p&gt;This is a quick and dirty way to interface C++ code with Python, translating one or more C++ classes in Python objects.&lt;/p&gt;
&lt;p&gt;First, we need some c++ sample code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//myclass.h
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#ifndef MYCLASS_H
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define MYCLASS_H
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;using&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;namespace&lt;/span&gt; std;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;namespace&lt;/span&gt; pets {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Dog&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;public&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Dog(string name, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; age);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;virtual&lt;/span&gt; &lt;span style="color:#f92672"&gt;~&lt;/span&gt;Dog();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; string &lt;span style="color:#a6e22e"&gt;talk&lt;/span&gt;();
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;protected&lt;/span&gt;&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; string m_name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; m_age;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; };
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-cpp" data-lang="cpp"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;//myclass.cpp
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;#34;myclass.h&amp;#34;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt; &lt;span style="color:#75715e"&gt;&amp;lt;string&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;namespace&lt;/span&gt; pets {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Dog&lt;span style="color:#f92672"&gt;::&lt;/span&gt;Dog(std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string name, &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; age)&lt;span style="color:#f92672"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m_name(name),m_age(age) { }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Dog&lt;span style="color:#f92672"&gt;::~&lt;/span&gt;Dog() { }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; std&lt;span style="color:#f92672"&gt;::&lt;/span&gt;string Dog&lt;span style="color:#f92672"&gt;::&lt;/span&gt;talk() {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;BARK! I am a DOG and my name is &amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;+&lt;/span&gt;m_name;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;now, we can try a little test program just to exercise our class:&lt;/p&gt;</description></item><item><title>il linguaggio Lua: parte 2</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-02/</link><pubDate>Tue, 24 May 2016 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-02/</guid><description>introduzione al linguaggio Lua</description></item><item><title>how to automatically expire mysql records after a fixed amount of time</title><link>https://ilmanzo.github.io/post/automatic-expiring-of-mysql-rows/</link><pubDate>Thu, 05 May 2016 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/automatic-expiring-of-mysql-rows/</guid><description>how to automatically delete mysql records after an amount of time</description></item><item><title>il linguaggio Lua: prima parte</title><link>https://ilmanzo.github.io/post/il-linguaggio-lua-01/</link><pubDate>Wed, 13 Apr 2016 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/il-linguaggio-lua-01/</guid><description>introduzione al linguaggio Lua</description></item><item><title>monit helper for quota monitoring in go</title><link>https://ilmanzo.github.io/post/golang-quota-monit-helper/</link><pubDate>Wed, 30 Mar 2016 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/golang-quota-monit-helper/</guid><description>a small program to parse quota information and report via monit</description></item><item><title>simple and easy linux job queue</title><link>https://ilmanzo.github.io/post/simple-easy-job-queue-linux/</link><pubDate>Mon, 21 Dec 2015 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/simple-easy-job-queue-linux/</guid><description>exploiting linux printing queue facility to manage heterogeneous jobs</description></item><item><title>serata introduttiva al FabLab sulla programmazione Python</title><link>https://ilmanzo.github.io/post/serata-fablab/</link><pubDate>Thu, 19 Nov 2015 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/serata-fablab/</guid><description>&lt;p&gt;Pubblico qui le slide che ho usato durante la serata dedicata alla programmazione Python, svoltasi presso il &lt;a href="http://www.veronafablab.it"&gt;FabLab Verona&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://ilmanzo.github.io/files/slide_serata_python_fablab_2015.html"&gt;http://ilmanzo.github.io/files/slide_serata_python_fablab_2015.html&lt;/a&gt;&lt;/p&gt;</description></item><item><title>CGI with the Go Programming Language</title><link>https://ilmanzo.github.io/post/cgi-apps-in-go/</link><pubDate>Thu, 29 Oct 2015 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/cgi-apps-in-go/</guid><description>standard library of the Go Programming Language: CGI and templates</description></item><item><title>sample template usage in the Go Programming Language</title><link>https://ilmanzo.github.io/post/templating-in-go/</link><pubDate>Wed, 30 Sep 2015 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/templating-in-go/</guid><description>how to use the standard library template of the Go Programming Language</description></item><item><title>redirect output of an already running process</title><link>https://ilmanzo.github.io/post/redirect-output-of-running-process/</link><pubDate>Fri, 24 Apr 2015 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/redirect-output-of-running-process/</guid><description>how to store standard output/error of a process after the execution</description></item><item><title>Sincronizzare una directory tra due server linux</title><link>https://ilmanzo.github.io/post/simple-directory-sync/</link><pubDate>Fri, 20 Mar 2015 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/simple-directory-sync/</guid><description>Sincronizzare una directory tra due server linux</description></item><item><title>A new project to learn the D Programming Language</title><link>https://ilmanzo.github.io/post/a-new-project-to-learn-the-d-programming-language/</link><pubDate>Sun, 07 Dec 2014 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/a-new-project-to-learn-the-d-programming-language/</guid><description>learn D programming language by solving simple exercises</description></item><item><title>monitor apache performance statistics</title><link>https://ilmanzo.github.io/post/logging-apache-performance-historical-statistics/</link><pubDate>Wed, 05 Nov 2014 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/logging-apache-performance-historical-statistics/</guid><description>how to use apache mod_status to collect performance statistics</description></item><item><title>Linux: get simple I/O statistics per process</title><link>https://ilmanzo.github.io/post/simple-io-statistics-per-process/</link><pubDate>Fri, 22 Aug 2014 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/simple-io-statistics-per-process/</guid><description>&lt;p&gt;I had a trouble with a long process running and wish to know how much I/O
this process is doing, so I wrote this quick and dirty python 2.x script:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; time&lt;span style="color:#f92672"&gt;,&lt;/span&gt;sys&lt;span style="color:#f92672"&gt;,&lt;/span&gt;datetime
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;read_stat&lt;/span&gt;(pid):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#f92672"&gt;=&lt;/span&gt;open(&lt;span style="color:#e6db74"&gt;&amp;#34;/proc/&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/io&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt; pid ,&lt;span style="color:#e6db74"&gt;&amp;#34;r&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; line &lt;span style="color:#f92672"&gt;in&lt;/span&gt; f:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(&lt;span style="color:#e6db74"&gt;&amp;#39;rchar&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; rchar&lt;span style="color:#f92672"&gt;=&lt;/span&gt;line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;)[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(&lt;span style="color:#e6db74"&gt;&amp;#39;wchar&amp;#39;&lt;/span&gt;):
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; wchar&lt;span style="color:#f92672"&gt;=&lt;/span&gt;line&lt;span style="color:#f92672"&gt;.&lt;/span&gt;split(&lt;span style="color:#e6db74"&gt;&amp;#39;:&amp;#39;&lt;/span&gt;)[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;close()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; int(rchar),int(wchar)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pid&lt;span style="color:#f92672"&gt;=&lt;/span&gt;sys&lt;span style="color:#f92672"&gt;.&lt;/span&gt;argv[&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;r0,w0 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; read_stat(pid)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; time&lt;span style="color:#f92672"&gt;.&lt;/span&gt;sleep(&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r1,w1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; read_stat(pid)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; print &lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\t\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt;r=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\t\t&lt;/span&gt;&lt;span style="color:#e6db74"&gt;w=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;%s&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;%&lt;/span&gt; (datetime&lt;span style="color:#f92672"&gt;.&lt;/span&gt;datetime&lt;span style="color:#f92672"&gt;.&lt;/span&gt;now()&lt;span style="color:#f92672"&gt;.&lt;/span&gt;time(),r1&lt;span style="color:#f92672"&gt;-&lt;/span&gt;r0,w1&lt;span style="color:#f92672"&gt;-&lt;/span&gt;w0)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; r0,w0&lt;span style="color:#f92672"&gt;=&lt;/span&gt;r1,w1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;You must give the process PID number as input to the script. In the output you
get the read/write throughput of the process in bytes per second, for instance:&lt;/p&gt;</description></item><item><title>how to setup disk redundancy with BTRFS filesystem</title><link>https://ilmanzo.github.io/post/btrfs-mirroring/</link><pubDate>Wed, 09 Jul 2014 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/btrfs-mirroring/</guid><description>how to setup disk redundancy with BTRFS filesystem</description></item><item><title>Compress and encrypt your backups</title><link>https://ilmanzo.github.io/post/compress-and-encrypt-your-remote-backups/</link><pubDate>Wed, 11 Jun 2014 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/compress-and-encrypt-your-remote-backups/</guid><description>How to securely backup your files in a remote location</description></item><item><title>how to display the IP address of a virtual machine before logon</title><link>https://ilmanzo.github.io/post/know-your-vm-address-before-logon/</link><pubDate>Mon, 05 May 2014 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/know-your-vm-address-before-logon/</guid><description>a small trick to save time when using linux virtual machines</description></item><item><title>dovecot: cleaning old Spam and Trash messages after some days</title><link>https://ilmanzo.github.io/post/postfix-dovecot-cleanup-virtual-folders/</link><pubDate>Wed, 05 Mar 2014 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/postfix-dovecot-cleanup-virtual-folders/</guid><description>a script to do maintenance of a small number of mail folders</description></item><item><title>number of physical sockets and cpu cores</title><link>https://ilmanzo.github.io/post/sockets-and-cores/</link><pubDate>Sat, 14 Sep 2013 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/sockets-and-cores/</guid><description>how to find out how much your next licence will cost...</description></item><item><title>Automate Cisco ssh connections with plink in Windows</title><link>https://ilmanzo.github.io/post/plink-automation/</link><pubDate>Mon, 27 May 2013 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/plink-automation/</guid><description>&lt;p&gt;A quick and dirty way to send a bunch of commands to any ssh device (in my case, Cisco appliances)&amp;hellip;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;create a plain old batch file with commands echoed inside:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @echo off
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo ter len 0
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo show ver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo show clock
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo exit
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;execute the batch, piping its output to &lt;a href="http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html"&gt;plink.exe&lt;/a&gt;
(putty command link ssh client):&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; c:\&amp;gt; commands.bat | plink -ssh -l username -pw password 11.22.33.44
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>semplice rate limit in Sinatra</title><link>https://ilmanzo.github.io/post/semplice-rate-limit-in-sinatra/</link><pubDate>Fri, 21 Dec 2012 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/semplice-rate-limit-in-sinatra/</guid><description>&lt;p&gt;Giocando con &lt;a href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt; ho avuto l&amp;rsquo;esigenza di servire una determinata pagina solo con un certa frequenza (tecnicamente un &lt;strong&gt;rate-limit&lt;/strong&gt;); la cosa si puo&amp;rsquo; fare installando il &lt;em&gt;middleware&lt;/em&gt; &lt;a href="https://github.com/datagraph/rack-throttle"&gt;Rack:Throttle&lt;/a&gt; ma non volevo aggiungere un&amp;rsquo;altra gemma alle dipendenze&amp;hellip;&lt;/p&gt;
&lt;p&gt;In questo esempio se al server arriva piu&amp;rsquo; di una richiesta in un intervallo di cinque secondi, rispondiamo a tono&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;SECONDS_BETWEEN_REQUEST&lt;/span&gt;&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;enable &lt;span style="color:#e6db74"&gt;:sessions&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;ratelimit?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; now&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;Time&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;new&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; session&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;lastrequest&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]||=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#75715e"&gt;#inizializza se non presente&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; result&lt;span style="color:#f92672"&gt;=&lt;/span&gt;(now&lt;span style="color:#f92672"&gt;-&lt;/span&gt;session&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;lastrequest&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]&lt;/span&gt;)&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;SECONDS_BETWEEN_REQUEST&lt;/span&gt; &lt;span style="color:#75715e"&gt;#passati dall&amp;#39;ultima richiesta ?&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; session&lt;span style="color:#f92672"&gt;[&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;lastrequest&amp;#39;&lt;/span&gt;&lt;span style="color:#f92672"&gt;]=&lt;/span&gt;now &lt;span style="color:#75715e"&gt;# aggiorna&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; result
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;get &lt;span style="color:#e6db74"&gt;&amp;#39;/&amp;#39;&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ratelimit?
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;h1&amp;gt;sorry, rate limit exceeded!&amp;lt;/h1&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;&amp;lt;h1&amp;gt;hello!&amp;lt;/h1&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>run-parts e problemi di crontab</title><link>https://ilmanzo.github.io/post/run-parts-problemi-crontab/</link><pubDate>Thu, 06 Dec 2012 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/run-parts-problemi-crontab/</guid><description>&lt;p&gt;Mi e&amp;rsquo; capitato di inserire degli script nelle varie directory
/etc/cron.daily, /etc/cron.weekly
ma di scoprire che questi script non vengono eseguiti.
Il motivo e&amp;rsquo; che il run-parts usato nelle Debian e derivate ignora i file che contengono un &amp;ldquo;.&amp;rdquo; (e quindi tutti quelli con l&amp;rsquo;estensione)&lt;/p&gt;
&lt;p&gt;Questo comportamento e&amp;rsquo; &lt;a href="http://www.oreillynet.com/linux/blog/2007/08/runparts_scripts_a_note_about.html"&gt;documentato&lt;/a&gt; anche nella man page, e previene alcuni inconvenienti come l&amp;rsquo;esecuzione dei &lt;strong&gt;.bak&lt;/strong&gt; ma lo scrivo anche qui per ricordarmelo &amp;hellip; E forse potra&amp;rsquo; essere utile a qualcun altro :)&lt;/p&gt;</description></item><item><title>generare comandi di creazione utenze a partire da un passwd</title><link>https://ilmanzo.github.io/post/generare-comandi-di-creazione-utenze-a-partire-da-un-passwd/</link><pubDate>Fri, 23 Nov 2012 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/generare-comandi-di-creazione-utenze-a-partire-da-un-passwd/</guid><description>&lt;p&gt;A volte e&amp;rsquo; necessario replicare le utenze con gli stessi parametri su piu&amp;rsquo; server linux diversi.&lt;/p&gt;
&lt;p&gt;Perche&amp;rsquo; farlo a mano ? Se sono tanti e&amp;rsquo; un lavoro noioso e potremmo anche commettere degli errori.&lt;/p&gt;
&lt;p&gt;Ecco un semplice &lt;em&gt;one-liner&lt;/em&gt; che fa il parsing di un file &lt;strong&gt;/etc/passwd&lt;/strong&gt; e genera
i corrispondenti comandi &lt;strong&gt;useradd&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;awk -F: '{printf &amp;quot;useradd -m -u%s -g%s -d%s -s%s %s\n&amp;quot; , $3,$4,$6,$7,$1}' /etc/passwd
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ovviamente l&amp;rsquo;output puo&amp;rsquo; essere comodamente filtrato con grep, usato via copy&amp;amp;paste, inserito in uno script, eccetera&amp;hellip;&lt;/p&gt;</description></item><item><title>gestire i led delle schede PC Engines ALIX in Ruby</title><link>https://ilmanzo.github.io/post/gestire-i-led-delle-schede-pc-engines-alix/</link><pubDate>Fri, 09 Nov 2012 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/gestire-i-led-delle-schede-pc-engines-alix/</guid><description>&lt;p&gt;Natale si avvicina: mentre smanettavo su queste ottime &lt;a href="http://pcengines.ch/alix.htm"&gt;PC Engines ALIX&lt;/a&gt; su cui ho installato una &lt;a href="http://code.google.com/p/debian-for-alix/"&gt;Debian modificata&lt;/a&gt;,
ho scritto una comoda interfaccia per accendere/spegnere e far lampeggiare i led alla velocita&amp;rsquo; desiderata&amp;hellip;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;Led&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;#numero da 1 a 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;initialize&lt;/span&gt;(ledno)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ledno&lt;span style="color:#f92672"&gt;++&lt;/span&gt; &lt;span style="color:#75715e"&gt;# passo 0 ma comando 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ledno&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ledno&lt;span style="color:#f92672"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ledno&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; ledno&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @ledsyspath&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;/sys/devices/platform/leds_alix2/leds/alix:&lt;/span&gt;&lt;span style="color:#e6db74"&gt;#{&lt;/span&gt;ledno&lt;span style="color:#e6db74"&gt;}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;/&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;blink&lt;/span&gt;(millisec)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;File&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;open(@ledsyspath&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;trigger&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) { &lt;span style="color:#f92672"&gt;|&lt;/span&gt;f&lt;span style="color:#f92672"&gt;|&lt;/span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(&lt;span style="color:#e6db74"&gt;&amp;#39;timer&amp;#39;&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;File&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;open(@ledsyspath&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;delay_off&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;f&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(millisec&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_s)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;File&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;open(@ledsyspath&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;delay_on&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;f&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(millisec&lt;span style="color:#f92672"&gt;.&lt;/span&gt;to_s)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;blink_slow!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blink(&lt;span style="color:#ae81ff"&gt;500&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;blink_fast!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; blink(&lt;span style="color:#ae81ff"&gt;50&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;on!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;File&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;open(@ledsyspath&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;trigger&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) { &lt;span style="color:#f92672"&gt;|&lt;/span&gt;f&lt;span style="color:#f92672"&gt;|&lt;/span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(&lt;span style="color:#e6db74"&gt;&amp;#39;default-on&amp;#39;&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;File&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;open(@ledsyspath&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;brightness&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;f&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(&lt;span style="color:#e6db74"&gt;&amp;#39;1&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;off!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;File&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;open(@ledsyspath&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;trigger&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) { &lt;span style="color:#f92672"&gt;|&lt;/span&gt;f&lt;span style="color:#f92672"&gt;|&lt;/span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(&lt;span style="color:#e6db74"&gt;&amp;#34;none&amp;#34;&lt;/span&gt;) }
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;File&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;open(@ledsyspath&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#39;brightness&amp;#39;&lt;/span&gt;,&lt;span style="color:#e6db74"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;) &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt; &lt;span style="color:#f92672"&gt;|&lt;/span&gt;f&lt;span style="color:#f92672"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; f&lt;span style="color:#f92672"&gt;.&lt;/span&gt;write(&lt;span style="color:#e6db74"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>background tasks in Ruby e linux</title><link>https://ilmanzo.github.io/post/background-tasks-in-ruby-e-linux/</link><pubDate>Mon, 05 Nov 2012 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/background-tasks-in-ruby-e-linux/</guid><description>&lt;p&gt;A volte negli script Ruby ho bisogno di controllare l&amp;rsquo;esecuzione di un comando eseguito in modalita&amp;rsquo; asincrona, ho creato pertanto una classe apposita:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-ruby" data-lang="ruby"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;class&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;BackgroundJob&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;initialize&lt;/span&gt;(cmd)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; @pid &lt;span style="color:#f92672"&gt;=&lt;/span&gt; fork &lt;span style="color:#66d9ef"&gt;do&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# this code is run in the child process&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# you can do anything here, like changing current directory or reopening STDOUT&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; exec cmd
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;def&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;stop!&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# kill it (other signals than TERM may be used, depending on the program you want&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# to kill. The signal KILL will always work but the process won&amp;#39;t be allowed&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# to cleanup anything)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;Process&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;kill &lt;span style="color:#e6db74"&gt;&amp;#34;TERM&amp;#34;&lt;/span&gt;, @pid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# you have to wait for its termination, otherwise it will become a zombie process&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#75715e"&gt;# (or you can use Process.detach)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;Process&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;wait @pid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;end&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;end&lt;/span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;come si usa ? Molto semplice:&lt;/p&gt;</description></item><item><title>Enerduino</title><link>https://ilmanzo.github.io/post/enerduino/</link><pubDate>Sat, 03 Nov 2012 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/enerduino/</guid><description>il porting del progetto per il nuovo IDE Arduino 1.0</description></item><item><title>Linux Day 2012</title><link>https://ilmanzo.github.io/post/linux-day-2012/</link><pubDate>Sat, 03 Nov 2012 00:00:00 +0000</pubDate><guid>https://ilmanzo.github.io/post/linux-day-2012/</guid><description>&lt;p&gt;Anche quest&amp;rsquo;anno ho avuto il piacere di partecipare al Linux Day,
organizzato per Verona presso la sede del &lt;a href="http://www.lugverona.it/linux-day-2012/"&gt;LUG Verona&lt;/a&gt; in via dei Gelsi a Montorio;
Ho tenuto una breve presentazione su un argomento che mi sta a cuore:
partecipare attivamente alla comunita&amp;rsquo; del software libero,
perche&amp;rsquo; anche se ormai Linux e Il free software hanno una discreta diffusione, la
maggior parte degli utenti si limita all&amp;rsquo;utilizzo passivo e anzi spesso si lamenta per
la scarsa qualita&amp;rsquo; del software open. Il software libero &lt;strong&gt;NON&lt;/strong&gt; e&amp;rsquo; solo avere programmi gratis!
Vorrei invitare chiunque a &amp;ldquo;passare dall&amp;rsquo;altra parte&amp;rdquo; e abbandonare il comodo stato di
&amp;ldquo;spettatori&amp;rdquo; per cominciare a dare il proprio contributo, ognuno per quello che puo'.&lt;/p&gt;</description></item></channel></rss>