This post was written in 2011. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
Debian Squeeze reached end-of-life in 2016, and Node.js now ships official .deb packages via NodeSource or comes pre-packaged in every modern Debian release. You definitely do not want to cross-compile from SID anymore – just use nvm or the official repos.
Abstract: add SID APT source, configure
APT Pinning to give squeeze packages
priority over SID ones, rebuild the nodejs package under squeeze.
Add SID APT source by creating /etc/apt/sources.list.d/sid.list (use
your nearest mirror):
deb http://ftp.us.debian.org/debian/ sid main
deb-src http://ftp.us.debian.org/debian/ sid main
Configure APT pinning by creating /etc/apt/preferences.d/sid:
Install the latest version of libv8 manually, libv8-3.8.9.20 at the time of writing this:
apt-get install libv8-3.8.9.20
Download the nodejs package sources, dependencies and build them:
cd
apt-get source nodejs
apt-get build-dep nodejs
cd nodejs-*
debuild -nc -uc
If you encounter build-dependency errors, you should try first to lower the
dependency in debian/control, both in Build-Depends and in Depends and re-run
debuild. If the build fails (e.g. with undefined reference to 'ev_run') the
previous version is missing required functions. So, you must install the
updated versions of the required dependencies (e.g. libev4) from sid, using
apt-get install name=version e.g. libev4=1:4.11-1. I suggest this because
you’ll have to manually update packages installed from sid, so the lesser, the
best.
This post was written in 2011. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
Since Linux 4.11 (2017), sysctl net.ipv4.ip_unprivileged_port_start=0 lets any user bind low ports without capabilities — no setcap needed. Also, the Thin web server shown here has been obsolete since Puma became the default Rails server in Rails 5 (2016). And if you’re using Docker, none of this matters anyway.
So you have a Linux VM you use for development, because you want to mirror the
production environment as closely as possible. You have many applications to
deal with, they have to be running at the same time because they are nifty REST
JSON web services.
You are very tired of remembering which one you put on port 8081, and your
configuration files slowly become a real mess. So you set up IP address aliases
in for the network interface and decide to assign even host names –
/etc/hosts is just fine – for each app.
Then, in such a setup, why would you still need to run them on ports higher
than 1024? Wouldn’t it be just great to type the application name in the browser
address bar? Indeed it is, but it’s better to not run them as root, anyway.
The solution is Linux
capabilities
(see also here). The one that
interests us is cap_net_bind_service: it gives a process the right to bind
well-known ports (< 1024). If you use an interpreted language, of course you’ll
have to add the capability to the interpreter itself. That’s why there’s
development in the title of this article – you should not set this up on a
production server, if you don’t know what you are doing.
This post was written in 2011. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
PH-Neutral was the last edition — true to the motto on the badge, “if it is good, they stop making it.” Phenoelit disbanded shortly after. Many of the attack techniques described here (ASLR bypass, Chip & PIN downgrade, TETRA interception) have since been patched or mitigated, but the underlying lessons about implementation flaws in “secure” technologies remain timeless. The DWARF exploitation research by James Oakley and Sergey Bratus became a seminal paper in the field.
“If it is good, they stop making it”, the
payoff printed on the conference necklaces, distributed to every participant,
along with an über-l33t badge customized with our nickname and the key
hash.
Being my first experience at an international security conf (I’ve only been
to the ccc2k+7 camp), and being a ph outsider ‘cause I never participated
to previous editions, the boot keynote held by FX, staffer and frontman, has been
enlightening: “you ought to be here!”, he yelled while pointing at
the stage, wearing a white shirt with the Phenoelit logo printed on both
arms.
“This conference has never started on time”, he continued,
“so there was no reason to do that for this last one”. the schedule
is straightforward: party, the next day's talks from 12.00PM to 7.30PM, then
party, and the last day's talks from 12.00PM to 5.30PM. definitely a setup
well-playing with the available alcohol :-D.
This post was written in 2011. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
RVM is still around but most Rubyists have switched to rbenv, asdf, or mise for version management. The Ruby Social Club meetups faded out, but the Italian Ruby community lives on through RubyDay and various local groups.
Thanks to @jodosha efforts and praising the
former Javaday event, now renamed into codemotion
that brought in Rome many Ruby developers from Milan, Padua and other parts of
Italy – the first official Ruby Social Club in Rome has been a great success.
Of course, officialty is measured only in the amount of twitter spam
posted about it! :-): earlier RSCs in Rome go back in time to
2006
organized by current mikamai members and more meetups
promoted by @jekoin
2007.
What matters is that there’s a community, there’s a passion, and there’s love
to share knowledge - no matter who holds the meetings, the important thing is
that they’re being held :-).
The event was simple and direct - some beers first, then my keynote on RVM and
Ruby interpreters, then Luca’s one announcing his
minege.ms project and after real social networking
:-). I met @gravityblast after much time we
didn’t meet, knew the PIP group and met
@svarione,
@punkmanit,
@leonardoperna,
@riggasconi,
@ogeidix and other smart people. Moreover, we
spent quite some nice time together, making up a really lousy and funny
week-end. Of course, huge kudos to @nhaima’s car
- that tirelessly carried us around Rome for two days :-)
Now, looking forward to the next meetup, thanks everyone who participated,
who offered me beers and, last but not least, thanks to
@etapeta for bringing me in time at the meeting -
you’re the real hero :-).
This post was written in 2011. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
Good news: FreeBSD has fully supported the MacMini 4,1 hardware (NV MCP89 SATA, BCM57762 NIC) since FreeBSD 9.x (2012). NetBSD and OpenBSD also gained support. The “no way” in the title aged poorly — BSDs run fine on this machine now.
I spent the last two days trying to set up the Aluminium Mac Mini (rev. 4,1)
as a home NAS server with encrypted storage, and I
wanted a BSD system on it. There’s already an
embedded OpenBSD onto the soekris gateway, and another companion would have
been nice. :-)
FreeBSD 8.2-RC1 boots but, due to the same bug, doesn’t recognize any
SATA drive nor any USB
umass device;
NetBSD 5.1 boots fine, handles SATA disks via the generic pciide driver (no DMA, thus quite slow) but, unluckily, doesn’t handle
the BCM57762 ethernet controller. I tried with quick
and dirty patches to bring the
bge driver up to date with -current, but still no luck: the MII link detection works, the card transmits but
doesn’t receive. The sdmmc controller as well works with -current but not
with 5.1-RELEASE. ACPI works correctly;
OpenBSD 4.8 boots, can access the SATA drives
without DMA, and recognizes the bge network card, but
exposes the very same behaviour as NetBSD 5.1 with the -current driver fitted
in;
DragonFlyBSD 2.8.2 doesn’t even enter kernel mode, I suspect
due to ACPI bugs;
PureDarwin didn’t
inspire me too much, due to the many blocking issues.
All of them support encrypted storage, I built up a NetBSD CGD disk flawlessly onto dk wedges; FreeBSD has got the
interesting gbde(8) and
geli(8) GEOM-based tools that I wasn’t able to test, while OpenBSD
supports crypto via a softraid
personality. Unluckily, support for the, nowadays, exotic Apple hardware is
a no-brainer.
This post was written in 2010. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
For the big picture — why Myousica was ahead of its time and who does it today — see the 2026 retrospective.
This is the third and final post in the Myousica series. The first covered the Rails platform, the second the Flash multitrack editor. This one covers how audio actually gets from the user’s microphone to a playable MP3 — the pipeline that connects all the services together.
The uploader is a separate Rails 2.2 application — headless, no database, no ActiveRecord. Just controllers, background workers, and audio processing tools. Andrea Franz built the initial version in April 2008, I took over from May 2008 onwards. 120 commits, originally called multitrack_server before being renamed to mewsic-uploader in March 2009.
Two entry points: the user can upload an MP3 file directly, or record via microphone (which produces an FLV stream through Red5). Both end up as an MP3 with a waveform PNG.
This post was written in 2010. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
For the big picture — why Myousica was ahead of its time and who does it today — see the 2026 retrospective.
This is the second post in the Myousica series. The first one covered the Rails platform. This one dives into the multitrack editor — the Flash/Flex component where users actually mix music in the browser.
The multitrack was initially developed by Vaclav Vancura, who built the original architecture, the UI component library, and the audio playback engine. I then took over and rewired it heavily — integrating recording, upload, the backend services, and the state machine that holds it all together. 81 ActionScript files, ~7,300 lines of code, 129 commits.
This post was written in 2010. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
For the big picture — why Myousica was ahead of its time and who does it today — see the 2026 retrospective.
Today we’re releasing the source code of Myousica — the collaborative music remixing platform we’ve been building since late 2007. We launched in September 2008 after 9 months of development, ran it for about 5 months, and paused the site in February 2009. The project has been rebranded to Mewsic along the way, but the idea is the same. Rather than letting the code rot on a private server, we’re putting it all on GitHub. Full history preserved, warts and all.
This is the first of three posts walking through the codebase. This one covers the main Rails application — the platform itself. The next two will cover the Flash multitrack editor and the audio processing pipeline.
The pitch is simple: I upload a bass track for Let It Be, you upload your voice, someone else adds guitar and drums. Through Myousica, there’s a multitrack editor running in your browser where you can mix everything together, adjust volumes, and publish the result. Other people can then take your remix, add their own tracks, and remix the remix.
This post was written in 2010. It's preserved here for historical purposes — the technical details may no longer be accurate.
Out of curiosity, I was looking how a browser interacts with the Google Instant
backend. While looking at the HTTP exchanges via Firebug, I first asked myself
why they’re encoding HTML and JS with \xYY escape sequences, then why the
very same JS functions are sent back and forth on every request, and later I
stumbled upon the google.com/s?q=QUERY JSONp service.
Give it a query, and it’ll return the suggested related phrases that are used
to build the menu under the search input while using suggestions and/or instant
(didn’t dig too much into all the other parameters).
Anyway, what’s interesting is that, of course, the suggestions are customized
on a per-country basis. To show the differences explicitly, let’s ask the
service the simplest query possible, a:
This post was written in 2010. It's preserved here for historical purposes — the technical details may no longer be accurate.
🔍
2026 retrospective
Panmind is long gone. The GitHub repos still exist as historical artifacts, but the Rails plugin ecosystem described here was replaced by gems and engines long ago. For the deeper architecture story — the SPA framework, the analytics pipeline, the cross-language session sharing — see the 2026 retrospective.
On July 22nd 2010, Mikamai hosted a Ruby Social Club in
Milan, where
nearly 50 people attended watching five speeches about Ruby, Web development
and Startups. I was glad to be one of the speakers, and I presented a set of
Rails plugins we spun off from our latest (and
greatest) project: Panmind (read more on the about
page) and released as Open Source on
GitHub.
The keynote is split in two parts: the first one explains why you should
follow the sane software engineering principle of writing modular and
interest-separated code and then how you could (and should) extract it from
your Rails application by decoupling configuration and then prepare for the
Open Source release, by writing documentation AND presenting to a Ruby
event so, hopefully, someone else will write unit tests! :-)
We released an SSL helper plugin that
implements filters (like Rails’ ssl_requirement) but also named route helpers:
no more <%= url_for :protocol => 'https' %>! You’ll have something like
plain_root_url and ssl_login_url - like they were built into the framework.
Then, a Google Analytics ultra-simple
plugin, with <noscript> support, a couple of test helpers and an
embryo
of a JS Analytics framework - hopefully it’ll evolve into a complete jQuery
plugin. Then, a ReCaptcha interface,
with AJAX validation support and eventually a
Zendesk interface for Rails.