August 2002 Archives
August 29, 2002

Bruce Perens no longer with HP

Open Source

Bruce Perens, one of the original open source movement founders, is no longer with HP. He was one of the open source leaders in HP, promoting open sourcing various projects which were not the core business of HP. He was also a big promoter of Debian Linux as part of the Linux Systems Operations.

His departure follows two highly publicized cases where HP invoked DMCA to threaten a group of researchers not to publish a vulnerability of the Tru64 operating system, which HP inherited by its aquisition of Compaq. The other case where HP invoked DMCA involved Bruce Perens himself. He was asked to not give a public demonstration of a DVD region-protection circumvenition technique at the highly visible O'Reilly Open Source Convention.

As a note to the reader, my employer is HP.

Posted by ovidiu at 04:09 PM |
August 27, 2002



This evening I've upgraded my Powerbook 800MHz to Jaguar: overall it's been a pleasant experience.

In the past 5 years the desktop I used was Linux, and each update meant a complete reinstall of the system, with little being reused other than some personal data. Over these years I think I installed Linux on more than two dozen times on various desktop and laptop systems. This was driven primarily by my curiosity in playing with new desktop applications, just to get a feeling of how things evolve on Linux. Each time I would end up sticking to my favorite tools, WindowMaker as the window manager, XEmacs for editing, a highly customized version of exmh for mail reading, and a custom compiled version of rxvt as the terminal application. Each time I felt the quality and extensibility of the new tools was far less than what I wanted to have.

When I first switched to MacOS X, on 10.1.2, I was surprised to see how many applications were still in their infancy. As I noted in my first report on MacOS X, one of the primary tool I needed,, was very poor in features and capabilities. In the past months, I was essentially forced to use, ahem, Microsoft Entourage, which was surprisingly powerful and well designed.

Given my past experiences with system upgrades, I liked how easy and smooth the update to Jaguar was. I chose to maintain the current filesystem and upgrade to the new OS. After the installation, I had to do some minor changes of the global settings, as I inadvertently stopped the installation midway through, which caused these settings to not be transferred in the new system.

After the new system was installed, I configured my HP DeskJet 970Cxi printer, which is accessed over the network using an HP JetDirect 500x using AppleTalk. The printer installation was really nice and smooth, as opposed to the installation on MacOS X 10.1, for which I had to search for drivers and figure out how to install the network printer.

I found Jaguar's to be a much more improved application. It finally has good email sorting capabilities. It would be good if it had also the option to run an AppleScript as action when a message is selected. This could give even more power in the hands of demanding users.

But even as it is, it's quite usable, and I think I'll switch to using it. It was able to import all my Entourage email without any problems (about 20,000 messages in the past 3 months). One thing I don't know how well it handles, is the ability to connect to external POP3/IMAP/SMTP servers living outside of a firewall, by tunneling through a Web proxy (Entourage has this). I'll find this out tomorrow at work.

One thing I really like about is the fact that it doesn't use a proprietary file format to maintain its emails. With Entourage I was really worried that in only 3 months of using it, its database file grew to almost 2Gb in size, and the app was crashing quite frequently lately. I suspected the size of this database might have something to do with it, so I started to delete emails. This fixed the problems for a while, but they kept reappearing.

I'll check the much praised junk mail filtering tomorrow at office, where I receive about 100 junk mail messages per day. is a very good application, very similar to the one I'm used to from the old NeXTSTEP days and to rxvt. No surprises here.

The biggest problem is that initially I couldn't get XFree86 to start-up. I depend on XFree86 to run my favorite editor, which unfortunately is not yet ported to MacOS X.

I had installed the XTerm upgrade to prevent X11 from crashing, but it would still not run. I then discovered that in the process of upgrading, the /usr/X11R6 and /usr/local were not moved to the new location. I had to manually move them from their location in /Previous Systems/Previous System 1, and reinstalled the XTerm patch. I managed to get OroborOS X up and running, but my XEmacs would not startup because of missing symbols in shared libraries. I need to recompile it.

Mozilla works just fine, no problems so far. I haven't tried IE yet, but I'm not too worried about it.

One problem is that SSHAgentServices does not work on Jaguar. I rely on this little hack to enter the password for my SSH keys only once per login session. I tried recompiling the login plugin, without success. I need to investigate more what's going on.

ProjectBuilder seems to have been improved a lot. I've noticed it now has the ability to run shell scripts on the selection, a crude way of scripting, but better than nothing. I'll give it a try as my development editor for a while, to see if I can switch to using it.

I didn't have time to investigate whether I could write an AppleScript that gets notified each time the network location changes. I've found the /System/Library/Core Services/System Events application, but this doesn't seem to generate any notifications when the network location changes. I'll do some more research.

DiskCopy seems to be still hopeless in the ability to burn Windows CDs. I may be missing something however, many other people would have complained so far.

I'll come back with some of my findings in the next days.

Posted by ovidiu at 02:58 AM |
August 22, 2002

MacOS X 10.1 doesn't burn CDs for Windows!


Last night I wanted to put some pictures on a CD to be used on Windows. To my great surprise and dismay, I discovered that DiskCopy, standard MacOS X 10.1.5 application, does not know how to burn CDs running on Windows! At least not if you have long file names, not the dreaded 8.3 MS-DOS file names, which is useless today.

This is really unexpected from a system which wants to be compatible with both Windows and Linux/Unix. I hope this problem is fixed in Jaguar, I don't want to rely on my Linux box to burn CDs for Windows. And I don't want to buy any third party application to do this either!

Posted by ovidiu at 11:16 AM |
August 21, 2002

Bash customization for Terminal

Apple | Linux

If you're using bash as your login shell on MacOS X, you can setup Terminal windows to display the username, the machine and the pathname where of the shell is. Just add the following in your ~/.bashrc file:

case $TERM in
        TITLEBAR='\[\033]0;\u@\h: \w\007\]'

export PS1="${TITLEBAR}\u@\h:\w> "

Just make sure you disable all the "Title Displays" in the "Window" section of the preferences in

This works fine also on Linux and Windows under Cygwin.

Posted by ovidiu at 07:15 PM |

RSS aggregator requirements and tools


Anders Jacobsen was looking for the perfect RSS aggregator and he found it, as he describes here.

Some of the requirements that he had are described here. In other place he also mentions the ability to read news offline, which I'm not sure is so useful to me: most of the time I sit in front of a computer which has a fast Internet connection anyway.

I think I still prefer an RSS aggregator running on the server side, which is integrated with my Weblog, perhaps running in a separate area, rather than my current setup.

Posted by ovidiu at 06:34 PM |

Macworld Jaguar review


Macworld has a good review of the new MacOS X 10.2 release, nicknamed Jaguar. The new system looks fairly promising, especially the improved speed and the new Mail application.

I'm curious to see if the control panel application is now scriptable through AppleScript. I'd really love to have an AppleScript script take care of reconfiguring my Web browser, mail and SSH settings each time I switch my laptop between home and work. Today, I have to do this manually, but I hope in Jaguar there's a way to run an AppleScript each time the location changes, which would allow me to do what I need.

Anyways, I've ordered my Jaguar copy from today. They have a special $99.95 for Jaguar if you pre-order it before August 24th. I hope to have the system by Saturday, so I can install it on my PowerBook.

Posted by ovidiu at 05:39 PM |
August 20, 2002


Cocoon | Java

Christopher Oliver points out JPetStore, a reimplementation of the classic J2EE PetStore application. Chris is looking at replacing the front-end JSP/Struts implementation of JPetStore with a Cocoon based implementation that uses the control flow engine.

Posted by ovidiu at 11:57 AM |
August 17, 2002

Changes in Cocoon's flow engine


The global space of the variables is no longer shared between users now. Each user has his/her own space for the global variables, and the only way to share information between different users is by means of the servlet API or Cocoon's Environment object.

Another visible change is the fact that scripts now reload as expected when they are modified, when they are declared using the file: protocol. Unfortunately the migration of Source from Cocoon to Avalon (org.apache.avalon.excalibur.source.impl.ResourceSource) broke the reload of the files declared using the resource: protocol. The problem is that the getLastModified() method on the Excalibur ResourceSource always returns 0, instead of checking the timestamp of the real file if possible (see org.apache.avalon.excalibur.source.impl.AbstractSource).

The next thing which I'm working on is to have the JavaScript org.mozilla.javascript.Scriptable object saved in the user' session object, if one is available. This will allow invocations of top level functions (those called using <map:call function="...">) to share the same values of the global variables. This will improve even further the functionality of the whole flow engine, as it will allow applications to invoke top-level functions that implement different parts of the application in the same global scope context, e.g. with the same global variables.

Posted by ovidiu at 11:34 AM |
August 15, 2002

RSS autodiscovery


Mark Pilgrim has some thoughts on how RSS should be discovered by news aggregators, rather than explicitly being added to them. He points out to a desktop applications which does most of what he'd like. However having to run yet another desktop app to read my news is not very convenient. I would much rather have the RSS aggregated in my Weblog, perhaps in a separate area. Then how would the RSS autodiscovery work when the RSS aggregator is a Web application? They don't know what is that you're browsing, since they live on a different machine.

It would be nice if your Web browser would search for an RSS feed in each HTML page you visit, and propose you to subscribe to it. This would be annoying however for one time only pages that you visit, but if go repeatedly go back to visit the same feed, it could ask you about it. If you choose to subscribe, it could send a subscribe notification to your Weblog over HTTP/XML-RPC. I think a Mozilla extension could do it; I need to investigate some more. Of course, a nice RSS aggregator would also have to be integrated in your Weblog tool.

Posted by ovidiu at 05:00 PM |
August 13, 2002

Weblog publishing using Emacs

Emacs | Weblogs

While reading some weblogs this night, I found Kevin Burton's records-mode for Emacs to be a really promising tool to maintain a Weblog from my editor. Browsing the code did not reveal the important component of publishing the news using Blogger API, but it should be easy to add it.

Now if I can only have XEmacs running natively on MacOS X... It's so annoying to run it in X-Windows emulation mode. Maybe after I finish the Cocoon control flow layer, and implement the user feedback application for Anteater using the new Cocoon, I'll look more closely at porting XEmacs.

Posted by ovidiu at 02:59 AM |

My Weblog looks ugly on IE5/Windows


A friend of mine pointed out that my Weblog is really ugly on Windows using IE5: the fonts are all wrong, and the columns interfere with one another. It looks like I broke the original CSS which came with MT. Some days ago I fixed another problem with the default templates: they were not showing the page correctly on Netscape 4.7. The culprit was the div element, and the way it was used to show the page as a table in the CSS stylesheet. I reverted to using a table. For the IE5 problem, it looks like I need to do more work.

Posted by ovidiu at 01:40 AM |

Upgrading the XSLT-process package in XEmacs


Ville Skytt? contacted me few days ago regarding the status of the XSLT-process in XEmacs. I've been really lazy updating this package in the XEmacs distribution, it's version 1.2.1, more than a year old. The primary reason is that the 2.1 version of XSLT-process is about 6.5Mb, with all the Java jar files for doing Docbook translation to PDF and HTML. This is really bloated by XEmacs standards, whose total size of all packages is about 20Mb. I simply cannot imagine having a sumo distribution with more than a quarter of it being my package! I would probably be spammed by all the XEmacs users...

Steve Youngs suggested a while ago to add the ability to download the optional jar files off the Net, when the user actually needs them. Today he pointed out to Ecrypto, recently added to XEmacs packages, which adds cryptographic functions to Emacs. However these functions are low level functions for encryption only, and there's no provision for verifying signatures and all the goodies tools like PGP and GnuPG provide.

In a separate email, Ville Skytt? pointed out that I can use mailcrypt to sign the jar files that need to be downloaded on demand. I think this tool is what I need, although to make sure things are secure, the user must have gpg or pgp installed on their machine. Linux users might have it if they run a recent Linux distribution, but Windows and even MacOS X, don't come with GnuPG installed.

I need to look into what means to sign a jar file using Java tools only. I strongly suspect the out-of-the-box JVM installations recognize only Sun signed files, and there are little provisions to add third party public certificates. In which case this cannot be an option.

Posted by ovidiu at 01:06 AM |
August 09, 2002

MacOS X on Intel hardware


There are many rumors flying around about whether MacOS X will be ported or not to Intel hardware.

If one looks back at the roots of the main technology on MacOS X, the old OPENSTEP system, and the fact that it was available on four different architectures (Motorola 68040, Intel, PA-RISC and Sparc), you'll have no doubt that this is possible from a technological point of view.

However for this to happen, Apple has to gradually phase out the old MacOS, and have the majority of the software vendors, at least the important ones, port and write new applications using the new platform. The faster this process happens, the quicker we'll probably see MacOS X being used on Intel platforms. Without the third-party software, Apple cannot make this transition.

Posted by ovidiu at 06:11 PM |
August 07, 2002

Wish list for a Weblog tool

Cocoon | Weblogs

I've been using MT for more than a week now, and I started to feel some of its limitations. Here's a small wish list for it, or for any other Weblog tool. In particular, I got prompted by Ugo Cei's message on cocoon-dev, to think about working on Cocoblog as the tool to use for my Weblog.

Here is the list:

  • As with MT, and unlike Radio, the Weblog tool should reside on the Web site only. No installation on the user's desktop should be required, other than perhaps a simple Weblog editor which communicates over XML-RPC with the server. In my case, this editor would have to be XEmacs, of course. Other free software/open source tools are available as well.
  • The Weblog tool should have the notion of multiple users or authors, each managing one or more weblogs. It should allow multiple users to author the same weblog.
  • The system should have the notion of an administrator, which manages the permissions of users. The administrator should not be an user.
  • As with MT, the system should generate static HTML pages for the Weblog reader. Dynamically generating HTML pages would quickly become a problem when the system is deployed within limited resources available, such as those imposed by cheaper accounts at various ISPs. The management interface for the Weblog author would have to be dynamic though, to permit the management of the Weblog.
  • The system should provide two views of the generated Weblog. One view should be public, accessible to external viewers. The other view should be visible to the Weblog author only, and it will allow him/her to customize the look and feel of the site without afecting the public view. Once the author is happy with the look and feel of the private view, this could be published as the public view.

    With MT you get only one view, the public view. Each time you want to change something in the Weblog look, the changes become immediately visible to the public, which is not a good thing. Of course, you can setup a private area which uses the same data, but that's an administrative headache which could be avoided.

  • The system should have the ability to run periodic tasks on behalf of the user. This could be used to run blogroll scripts, calendar updates or any other action which causes the static HTML regeneration to happen.
  • It should be possible to edit Weblog entries in languages other than XHTML. I specifically have in mind the ability to edit entries using Docbook, xdocs or any other custom built XML format. This would give the ability to easily change the generated HTML markup or to generate entirely different markup, like plain text or XSL-FO for PDF generation.
  • The user should have the posibility of specifying custom XSLT stylesheets for different markup generation. The system should also allow arbitrary XML processing to happen on the original markup.
  • With the ability to edit Weblog entries in an XML format, a dictionary of abbreviations could be easily defined. This could be implemented either as XML entities or as XML elements which are translated to their definition by custom XSLT stylesheets.
  • The system should be written using components which plugin into the system easily. Ideally, it should be easy to write such components using any scripting language.
  • The system should have a clearly defined internal API, which exposes all the major items in it: entries, categories, stories, components etc. These internals should be exposed to all the scripting languages supported. Components written in different languages should be able to inter-communicate.
  • New components should be easily added to the system. However this task should be under the control of the administrator, which could install these components and make them available to users, perhaps in a selective, per-user maner, to permit a pay-per-use model.

In my opinion, Cocoon can solve most of these problems. One thing it badly misses is the ability to easily add new components to the system, and make them available in a selective manner, and the ability to have these components written in different scripting languages.

Posted by ovidiu at 10:20 PM |

New release of MT-Search


Mark Pilgrim points out that MT-Search has been updated. I'll spend some time to install it on my Weblog today.

Posted by ovidiu at 01:41 PM |
August 06, 2002

SSH behind a firewall

Apple | Linux

I've finally figured out how to cleanly access hosts outside my company's firewall using OpenSSH.

OpenSSH has a way to specify an external program that performs the TCP/IP connection, instead of doing it directly. This allows you to specify an external program that connects to a Web proxy, and tells it to connect to the external machine you want to connect to, using the CONNECT method.

The following connect.c program does exactly this. Just compile the program on your machine, put the resulting binary in a convenient place (like /usr/local/bin), and add the following line at the top of your ~/.ssh/config file:

ProxyCommand /usr/local/bin/connect -H web-proxy:port %h %p

Each time you run ssh host, OpenSSH will spawn off connect and pass to it in the command line the host and port number you want to connect to. connect will take care of connecting using the supplied Web proxy information.

You may want to configure the ProxyCommand line to be on a host basis, instead of being globally applied to all the hosts you connect to, including those inside the firewall. Read the OpenSSH configuration manual to understand how to do this.

Posted by ovidiu at 06:55 PM |

Xalan debugging support

Emacs | XSLT

Tony Addyman managed to add debugging support for Xalan 2.4D1 in XSLT-process for Emacs! Now XSLT-process supports both Saxon and Xalan as XSLT debuggers.

Xalan debugging support in XSLT-process has been problematic because of the lack of source location information. During late June 2001, I've modified Xalan to add support for file and line information in both the source XML and in the stylesheet.

For some reasons this code was not working in the 2.2 release, which made the XSLT-process support unusable. Because of the rapid changes in Xalan and the lack of time, I've decided to drop the debugging support for Xalan in XSLT-process. Tony took up the support for this and he's doing a great job at it!

Posted by ovidiu at 05:55 PM |

Properties grouping

Jeff Turner finished implementing property groups in Anteater. These allow properties to be grouped and referred to as a whole in all the places they are needed.

In Anteater you define the behavior of a test by specifying various properties which affect the tasks which are part of the test. Up until property groups, you'd have to specify these properties each time you were using a particular task. With groups, you specify these properties in one place, and refer to all of them in your tasks. You can define specialized groups which inherit from a common set of properties, and modify or add new property definitions.

Here is Jeff's description of this feature:


Groups are like containers for Anteater objects, allowing reuse of definitions:

<group id="mygroup">
  <logger type="xml"/>
  <property name="host" value="localhost"/>

<!-- Each member task inherits the group's logger and session -->
<httpRequest group="mygroup" path="/a.html" .. />
<httpRequest group="mygroup" path="/b.html" .. />

Group Properties

Anteater tasks' behaviour is now configured through properties of the group to which the task belongs. Currently recognised properties are 'host', 'port', 'debug', 'timeout', 'protocol', 'haltonerror' and 'usetidy'. So if we had:

<group id="cocoontests">
  <property name="host" value=""/>
  <property name="port" value="8080"/>
  <property name="debug" value="0"/>
<httpRequest group="cocoontests" ... />
<httpRequest group="cocoontests" ... />

Then those tasks would run against, with debug level 0, unless overridden by attributes on the httpRequest object.

Group properties can also be set from outside a group:

<property name="cocoontests.debug" value="2"/>

This allows group values to be specified in properties files outside the test script, or from the command-line, eg:

anteater -Dcocoontests.debug=2 -f tests.xml

Group Inheritance

Since a Group object is an Anteater object, a Group can belong to another Group, either by nesting:

<group id="a">
  <property name="host" value=""/>
  <group id="b"/>

or by the 'inherits' attribute ('group' also works):

<group id="a">
  <property name="host" value=""/>
<group id="b" inherits="a"/>

Group elements are inherited in what I hope seems a natural manner. Properties are passed through unless overridden, so 'b' in the above example has host ''. Loggers are passed through, unless any loggers are defined in the child group. Same with sessions.

The Default Group

There is an implicit 'default' group, to which all tasks belong unless otherwise indicated. If the default group were written out, it would look like this:

  <group id="default">
  <logger type="minimal"/>
  <property name="host" value="localhost"/>
  <property name="debug" value="0"/>
  <property name="port" value="BUILTIN,8080"/>
  <property name="timeout" value="30s"/>
  <property name="protocol" value="HTTP/1.0"/>
  <property name="haltonerror" value="false"/>
  <property name="usetidy" value="false"/>

  <!-- Declare all other groups as children of 'default' here -->
  <group refid=".."/>

So by default, all tasks get a session, and a logger that prints to stdout, plus a bunch of properties used to configure the default Anteater behaviour.

The default group can be overridden by the user, by declaring a group with id 'default'. This way, we can override specific properties for all tasks:

<group id='default'>
  <property name="host" value=""/>
  <property name="port" value="8080"/>

All other items are inherited from the 'default' defaults.

And of course the 'default' group properties can be overridden at the command-line, eg

Putting it all together

The purpose of grouping has been to make simple things easier, and complicated things possible. Some scenarios, from simple to complex:

  • With the advent of the default group, most users need never bother with loggers, sessions, groups or properties. They just rely on the defaults, maybe occasionally overriding them, eg -Ddefault.debug=5.
  • For users for whom the defaults need modifying, that can easily be done by overriding the 'default' group, and otherwise not touching the script. Want to log to XML as well as the console? Redefine the default group:
      <group id="default">
        <logger type="minimal"/>
        <logger type="xml" todir="${log.dir}"/>
  • Users with somewhat large scripts, who want to break it up into sections can do so, by defining a hierarchy of groups:
      <group id="mytests">
        <property debug="0"/>
      <group id="livesite" inherits="mytests">
        <property name="host" value=""/>
        <logger type="xml" todir="{docs.dir}"/> <!-- HTML report -->
      <group id="devsite" inherits="mytests">
        <property name="host" value=""/>
        <property name="debug" value="1"/> <!-- devsite a bit unstable -->
        <property name="failonerror" value="true"/> <!-- Don't waste time testing whole site -->
        <group id="devsite-brokenbit">
          <!-- Very broken bit of devsite -->
          <property name="debug" value="10"/>
      <httpRequest group="section1" ... />

So we define a hierarchy of groups at the top of the script, and then use it in the subsequent tests.

Posted by ovidiu at 04:21 PM |
August 02, 2002

Blogroll using RSS feeds for MovableType

Weblogs | XSLT

I've finally managed to integrate my simple Blogroll engine into the MT system. The sytem is a combination of XML/XSLT, MT regeneration of HTML pages and crontab.

This is essentially composed of two components.

The first component is an XML file which describes what are the RSS feeds you're interested in. In this file you specify the location of the feed, and optionally you can give a simple name to it. This name is used in the generated HTML as the title for the news, in case the RSS feed doesn't specify a name in it (like Slashdot for example).

Here is a simple XML feed document:

  <user>Ovidiu Predescu</user> 
  <title>Ovidiu Predescu's news stories</title> 
    <rss name="Ovidiu Predescu" href="" />
    <rss name="Slashdot" href=""/> 
    <rss name="James Strachan" href=""/> 
    <rss name="Sam Ruby" href=""/> 
    <rss name="Matthew Langham" href=""/> 

The XSLT stylesheet then takes this document and translates into HTML. The stylesheet knows how to handle RSS 0.91 and RSS 0.92, which are the formats used by Radio, RSS 1.0 (preferred by Radio), and Backslash, which is used by Slashdot.

I defined the generated HTML file as template in MT, which I called RSSFeedNews. In my new templates for MT 2.21, I include this template in the appropriate place so it can appear in the generated HTML.

I want to automatically retrieve the news, create the HTML fragment to be inserted in each page, and then regenerate all the pages with the fresh news. For this task, I've dug into MT to see how to do it. The documentation was quite clear on what needs to be done, but I encountered some problems. Below is the script which seems to work fine now.

#!/usr/bin/perl -w 
use strict; 
use lib '/path/to/mt/lib'; 
use lib '/path/to/mt/extlib'; 
use MT; 
my $mt = MT->new( Config => '/path/to/mt/mt.cfg', 
                  Directory => '/path/to/mt'); 
my $result = $mt->rebuild( 
                          BlogID => 1, 
                          EntryCallback => sub { print " => ", $_[0]->title, "\n" } 
print "Done.\n"; 

The POD documentation for lib/ does not mention that the Directory parameter in new is required. I found that after few hours of poking around.

To run the translation you need to have an XSLT processor. I use Saxon, a compliant and very fast XSLT processor written in Java. With Saxon you run the translation like this:

java -jar saxon.jar subscriptions.xml rss2html-standalone.xsl

The rss2html-standalone.xsl XSLT stylesheet will generate a complete HTML, you'll need to customize it for inclusion in another HTML document. This is usually done by simply removing the unnecessary HTML tags from the rssfeed template.

I've put all the necessary code you need to run in this directory.

Posted by ovidiu at 01:18 AM |

Navigation improvements


I've done some major changes in the way MT generates the HTML files. Previously I didn't like the way the calendar was displayed. Clicking on a blog entry did not show the calendar for the month when the post was made, but the one for the current month. The navigation between months still lacks, since the only way to go back and forth one month is to choose the appropriate month from the Archives section. I like the month navigation Radio has, but it turns out in MT is difficult to implement it, due to how the MT template tags work. I'll tackle this when I'll have more time.

Posted by ovidiu at 01:10 AM |
Cool stuff
  Arduino TinyWebServer: part 3 and part 2
More from me
Picture gallery
Copyright © 2002-2016 Ovidiu Predescu.