FreeBSD Ports, a treasure trove of useful tools

Tags: ,

I’ve been configuring one of my machines as a FreeBSD 6.1 server in my spare picoseconds, to serve as a fileserver, rsync server, public mirror, backup server, transparent squid proxy, coffee maker and whatever else I can make it do.

In order to do this, I needed to add a bunch of packages and tweak quite a few hundred things in various places on the system (sysctl, make.conf, loader.conf, add missing tweaks and options to the kernel config) and so on.

I rebuild kernels nightly and keep ports up to date with cvsup. I rarely find time or a need to run portupdate or buildworld, but I know I should, so I found this useful article which describes how to stay current with all of these pieces (and there are a LOT of them).

Buried in the comments, was a pointer to ‘sysutils/fastest_cvsup‘, which is probably the BSD ports equivalent of Debian’s netselect-apt tool. fastest_cvsup is described as follows:

Perl script to find fastest CVSup server:

* uses socket connections not just 'pings'
* takes notice of server responses
* connects to servers in countries specified on the command line 
   - or - 
  connects to the 'local' servers defined in the script
   - or -
  connects to ALL the servers in ALL the countries
* returns either fastest server or top 3 (useful for scripts)
* returns exit codes (useful for scripts)
* can re-write itself to update the CVSup server list, obtained
  from the online FreeBSD Handbook
* can easily add other CVSup servers (NetBSD/OpenBSD...etc)


Running it was as simple as executing it with the right country in mind (or you can pass it ‘-c all’ and test all of them):

# fastest_cvsup -c us
>>  Querying servers in countries: us
--> Connecting to []...
    - server replied: ! Access limit exceeded; try again later
    - time taken: 146.89 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 42.03 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 35.09 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 114.04 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 74.04 ms
--> Connecting to []...
    * error: connect: Invalid argument
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1g CVSup server ready
    - time taken: 104.05 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 57.24 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 53.00 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 52.02 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 33.05 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 49.02 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 50.02 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 156.16 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 50.05 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 65.03 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 43.05 ms
--> Connecting to []...
    - server replied: OK 17 0 SNAP_16_1h CVSup server ready
    - time taken: 56.02 ms

>>  Speed Daemons:
    - 1st:   33.05 ms
    - 2st:    35.09 ms
    - 3st:    42.03 ms

So now I can stick in my .sup files and hopefully gain the fastest connection to those servers for updates.

Rusty Solaris

Tags: ,

Recently, I’ve been offered a job working as a Solaris system administrator, answering “tickets” from a queue, writing up documentation, business procedures, and other similar things for a local company about 5 miles away from where we live. The opportunity looks fun, but my Solaris experience is a bit rusty. I’m great with Unix in general, and I’m stellar with Linux, but my Solaris experience is a bit lacking. It isn’t something I can’t pick back up fast, I just haven’t used it in many years.

I haven’t made a decision on the job yet. The initial pass at the salary they offered was a bit lower than I expected, but a few negotiations have brought it around to where I’m comfortable with it. A few more details, and I’ll be able to make a decision.

So I took some time to start re-learning Solaris 10 on x86, so I can refamiliarize myself with it. I installed it in VMware and did the full install. It topped out at about 3.5GiB of disk space, not too bad. The full install took about 3 hours. It really unpacks slow.

Solaris 10 in VMware
(Actual screenshot of my version running within vmware)

The Java Desktop, a new option with Solaris 10, is very slick, very nice, and reasonably fast, even while being emulated without any accellerated video drivers, on my ageing P3/1133MHz laptop (yes, that laptop).

Getting the right pieces working was not as easy as I thought…

First, I had to download the binary X server from this page. Since there is no text-mode browser on Solaris by default (even when installing everything), I had to use a Perl trick… I configured CPAN on the machine, and installed LWP::Simple, so I could use the ‘getstore()’ function to fetch the binary X server over http. While in CPAN, I installed a few other useful modules I will be using later on.

Then I installed the binary X server, and then followed these other instructions to get the right resolution on my laptop’s screen (1400×1050), which required creating a local file that didn’t exist, and reconfiguring XSun with kdmconfig.

After that, I was in business… full 1400×1050 resolution at 65k colors inside VMware, running Solaris 10 x86.

Now off to break it and fix it and break it again. I need a faster laptop..

Useful links:

Quotable Quotes


Quotable Quotes

    goingware, interesting quotes, but the Caesar one may not be as accurate as you first believe. After doing some research, I found an interesting WiKi on this exact quote. I also found someone else who attributes it to William Shakespeare. A search of the complete works of Shakespeare returns nothing.

    While on the subject, here’s a few other interesting ones:

    George F. Kennan, 1987. Professor Emeritus at the Institute for Advanced Study and former US Ambassador to the Soviet Union.

    “Were the Soviet Union to sink tomorrow under the waters of the ocean, the American military-industrial establishment would have to go on, substantially unchanged, until some other adversary could be invented. Anything else would be an unacceptable shock to the American economy.”

    Former Sec’y of State Henry Kissinger speaking at Evian, France, May 21, 1992 Bilderburgers meeting.

    It is then that all peoples of the world will plead with world leaders to deliver them from this evil. The one thing every man fears is the unknown. When presented with this scenario, individual rights will be willingly relinquished for the guarantee of their well being granted to them by their world government.”

    Adolph Hitler, My New World Order, Proclamation to the German Nation at Berlin, February 1, 1933

    “The National Government will regard it as its first and foremost duty to revive in the nation the spirit of unity and cooperation. It will preserve and defend those basic principles on which our nation has been built. It regards Christianity as the foundation of our national morality, and the family as the basis of national life.”

The Day’s Events

    I woke up at 3:30am this morning, and started working right away. I got more done before 5:30am today than I’ve did all day yesterday with the neighbors playing basketball with bowling balls in every room.

    Today; one word: Perl

    Possible developer/sysadmin job in… Iceland.

    Mother’s birthdays coming up (there are now two).

Handera Palm Emulator

    Finally got the Handera ROM images working (thanks to Jes and dgibson for their assistance re: -gstabs in POSE_CXXFLAGS). Turns out having the Handera skins in /usr/share/pose/Skins didn’t work like the rest of the POSE emulations, they had to be in ~/Skins.

    Handera’s online registration system is completely inept, and still hasn’t responded to my request. It’s supposed to be minutes, it’s been days now. Their website is disgusting too, looks like it was designed by a class of 5th graders. I decided to yank the rom from the REAL device with pi-getrom, and use dd to bite off the first 32k of smallrom.

    dd if=handera330.rom bs=1 skip=32768 of=out.rom

    All this for some screenshots of OUR application in THEIR device.

Lots of cool stuff coming. Just finishing up on one of the tools now, may have to pull an all-nighter on this one, I don’t want to put it down until it’s done. Can’t get distracted.


    Status: None, 301 days. I wish I could find a paying job.

pilot-link Ruby Language Bindings


ianmacd, since you’re beginning to get fluent with Ruby, care to contribute to the “Ruby Palm Bindings” effort? I’ve been wanting to get the Perl bindings ported to Ruby in pilot-link for awhile, but my time to devote, and skill with Ruby is sketchy.


Some random things about Advogato certification

Tags: , , ,

Bug Tracking

ishamael, the bug tracking package you seek is called Mantis. I use it quite extensively now on my server, and it works very well. I had to change some of the UI a bit and move some things around, but generally, it’s rock-solid. You can see it in action on one of my bug sites. Another you can look at is called RoundUp, and is really good. I tested 11 separate packages before narrowing down on these two. I chose Mantis in the end because it was PHP, and I didn’t want to have to burden my box with Python code, runtime, in the browser. You may also want to go here and see the other dozens of alternatives.

I can’t post much, in the middle of too much hardware hackery, but I’ve been reading all the diaries today and yesterday regarding the whole certification and trust metric issue and have to make some points.


deven, you realize of course that by removing your certification of others when you were certified as Apprentice, that you have lowered their ranking, just as I removed your Apprentice status altogether by removing my certification of you. This is how the trust metric works, and it works well. Your point regarding the “Good ‘ol Boys Network” is completely unjustified, since you clearly don’t understand why Advogato exists. Nobody here is refusing people access to Advogato. Anybody can join. Anybody can post their diary entry. Anybody can contribute.

Your comment of:

“..Since most of Raph’s writings here seem to focus on effectiveness in keeping out the bad people, it’s not clear whether he ever paid close attention to the flip side of the coin, letting in the good people…”

If this were nothing other than a web-based forum without a hint of any certification metrics, created solely to discuss open source projects, like Blogger, would you have the same complaints? I would guess not.

To quote George Carlin:

…a radio has at least two knobs; one changes the channel, and the other… turns it off!

The value of certs here is not linear. If 10 people certify you as Apprentice, and they themselves are not even holding an Apprentice certification, you do not get an Apprentice certification. However, if raph or lilo or alan or myself certifies you as Apprentice, at the next sync, you will now be holding an Apprentice cert, even if nobody else certifies you. There is a very logical reason for that (and I wish it was applied to Slashdot and other projects as well).

You are measured here by your peers for your contributions to the free software community (and sometimes, non-free contributions, as some people here have talked about before). You are not “given” certifications. You earn them.

Again though, my desire to post my diary here has absolutely no bearing on the color that my name appears in. I didn’t start coming here because I wanted to gain some sort of status. I wanted to have a place to share my contributions, let people know what I’m doing (and if you read my diaries, they can be quite personal, ugly, and graphic at times, I have nothing to hide).

There’s a lot of cool things I do, as well as other people. I like to see what’s going on in the community I’ve been a part of for over a decade, and I like to watch it grow.

In your July 31, 2000 diary entry, you decided to certify yourself as Master, and I’m still trying to see what “important” free software project you are the author of, or what groups you mentor. Can you help me find it?

Your comments regarding the certification of God, Satan and Jesus are important, because they point out the lack of clarity in the people who are certifying these accounts. Look at rms for a perfect example. People don’t take the time to really understand the accounts before they go and waste certifications on them (hint: That’s not really Richard Stallman’s account).

As raph points out, there is a bit of weirdness going on in the certifications right now, and you have seen the trend also, but it fits exactly into the model which works here. The more people who join, the more uncertified users will exist, who are then going to be certifying already-certified users (sometimes wrongly, in the case of rms and others as above). This must be how you determined the system to be a “Good ‘ol Boys Network”, since the new users are the ones creating the dilution as you call it.

Here’s a tip: Ignore the certification altogether. Simply post your diary as you would have for any other site, and talk about what you’re doing in the community, free software space, open source space, or whatever. Relax. Have fun. If people respect you, and feel you’re doing “the right kinds of things” (subjective), then you may find yourself with a certification… or maybe not, but who cares. This is not gaining you PayPal bucks, or being used towards grading your GPA.

I respect the fact that you are doing development, and that you have taken the time to report some Mozilla bugs, but at the same time, you blather on about certifications. The two don’t jive. Free Software advocates and contributors give of themselves selflessly, often sacrificing deep into their personal lives to do it, and many times, unrecognized and uncompensated. Keep up the work, push hard, advance the status of free software where you can, and ignore what people think of you. There’s a famous quote I live by:

“There’s no defense for the truth”

If this isn’t working for you, there’s always Badvogato and Blogger.


I am having nothing but trouble with my hardware here, and right when I need it the most, it fails me in exactly the ways I require of it to be working.

I have a single bootable RedHat cdrom I found in the back of a book here (Out of all of my linux cdroms, the only one I found to be bootable was in this RedHat Bible book, pft! No, bootable floppies were not possible, since I had no floppy drive, and even if I could install one in this machine, there was no way to get the images onto the disks, ugly all the way to the bank on this one).

After having to gut a production machine to get a the build onto the drive, it neglected to install perl (apparently Perl is not part of a ‘Development Workstation’ according to their installer, gar!). I decided to mount the cdrom in another drive, and map it over nfs.

But wait, my 3c905 Vortex NIC decides to start spouting packet errors and ghosted frames. I rummaged through my storage and spare parts and found one lone 3c509 ISA card, and put it into the box. Try again, no video. Wiggle some cards, move some slots, now I get video, but the cdrom in the other system fails on one lone file… guess which file I can’t read from the cdrom: perl_5.005.*.rpm. ARG! I can’t get a break!

dyork, you’re not off of the XML/XSLT hook with me yet… I have quite a handful of questions to toss your way. I’ll try to keep them en anglais for you.

Enough for me for today. I’m just not going anywhere near hardware right now. Maybe a good movie will get me distracted enough to concentrate on this when I get back tonight.

jails, chroots and other account lockdowns


Thu Jun 28 00:18:49 PDT 2001


    There’s quite a lot to consider when locking down a system for anonymous public consumption. Mind-numbing. I spent a good portion of tonight testing many of my own hacks on my system here, and found that some still work. EEP! Basically there are four ways to run processes on any given machine:

    1. [as root/full]: Processes running as root with access to the entire filesystem end up being the first target of rootkits. Compromising a service running this way could allow the attacker to replace binaries, such as /bin/ps and /bin/netstat, open privileged network ports, and read any file on the system, including a shadowed password file. At worst, they have the capacity for complete damage (rm -Rf /). Sendmail is an example of one daemon which runs in this state.
    2. [as root/jailed]: A typical rootkit would probably fail to operate, because they typically require a shell (/bin/sh) and basic commands such as /bin/rm and /bin/cp. A process in this state can break from a jail. Given that the process is running as root, the attacker could use an exploit to execute code which makes system calls to perform root activities (referencing inodes outside the jail). Though a bit safer than [1], in the context of a scripted attack, this state does not provide the strongest defense.
    3. [non-root/full]: The threat for a full system compromise is reduced slightly from [1] in that the attacker will not immediately have root permissions. However, any process in this state can execute all the standard commands and shells, and thus allow the attacker to explore the filesystem in search of
      root-level exploits. Also, most configuration files and information about the system are available to this process, so an attacker can garner further information about the system (‘mail < /etc/passwd‘).

    4. [non-root/jailed]: This scenario has the most restrictions upon the running process. Because the jail should only contain enough information to support the service, a compromised service would give them no opportunity to execute shells or common commands or to explore system information. Also, the extent of damage posed by file deletion is limited to directories within the jail. The greatest danger in this category is if an attacker can place binaries or files (in the jail) that will be accessed from outside the jail by other processes. In this case, it is possible for exploits to spread. Postfix is a daemon which runs in this context. Monitoring jails becomes extremely important here.

    I’ve designed a completely new way of handling this situation in my sandbox system here, one which I’ve never seen implemented or discussed before (I must thank all this Embedded Linux work for giving me the idea, and the guys in #perl on Efnet for helping me squeeze some of the last bugs out of the theory — no, it is not implemented in Perl, but trying to get something as spindly as Perl installed in the jail, and remain functional, presented quite a challenge).

    So far, in my testing, I have not been able to break through it. I have an edge, though, I know the technology used to implement it, which lets me know how to try to exploit it. Normal users on the server would not know this, or be able to find it out from their own vantage point.

    “…Nothing is secure. Only secured…”

    Creating a full file system inside a chroot() jail can involve several things, including hardlinks [bad, potentially insecure, doesn’t cross filesystem boundaries], symlinks [ug, needs no explanation],
    or statically compiled binaries [definitely not ideal for a server potentially holding hundreds of user accounts].

    What I’ve managed to do, is provide a fully-working, non-crippled file system with intact shared binaries and libraries, including perl and python and friends, inside the jail, read-only, in a way which is reproducible, secure, and not crippled.

    At this point, we have a fully-functional shell account, with all services read-only (using my new design), and the user themselves gets a nice large chunk of quota’d space under their account from which they can use for web, code builds, whatever (process-limited, and using idled, of course. There are ways around it, but that’s already been taken care of on my end).


    int fd = open("/", O_RDONLY);
    for (int i=0; i<10; i++) {
    execl("/bin/sh", "/bin/sh", NULL);

    I’ll let the others figure out what this fixes.

So much more to go, but I’m learning quite a bit of theory and technology I never knew before. I’ll keep posting my findings as I go through them. Perhaps others can take advantage of some of this on their own systems. The next step is to start locking down every service and daemon on the box so that they too run in
mode [3] or mode [4] above. Something similar to:

#include <stdio.h>
#include <stdlib.h>

main(argc, argv) {
        int gidlist[] = { 505 };
        setgroups(1, gidlist);  // or initgroups()
                "/bin/MyDaemon", NULL);

You get the idea. More later.




Thanks to dave0, I now have a better place to purchase books

Here’s the books (fictional) I’ve managed to polish off in the past three weeks:

From the Corner of His Eye
by Dean R. Koontz

Seize the Night
by Dean R. Koontz

Night Moves (Tom Clancy’s Net Force, 3)
by Tom Clancy and Steve R. Pieczenik

A Wizard of Earthsea (Earthsea Trilogy)
by Ursula K. Le Guin, Ruth Robbins

I used to have so many books at my last place. I had to leave 14 boxes of books behind. Saddens me. This is all I could find around the apartment, or at the local store, or that Erika bought for me (thanks!)

It’s good to not be so focused on work though, but there’s this other pile sitting here next to my computer, growing and begging to be cut into (most technical, some not). I plan on cutting through them soon:

GNU Autoconf, Automake, and Libtool
by Gary V. Vaughan, Ben Elliston, Tom Tromey, Ian Lance Taylor

Official Guide to Programming With Cgi.Pm
by Lincoln Stein

Dynamics of Software Development
by Jim McCarthy, Denis Gilbert

Mastering Regular Expressions: Powerful Techniques for Perl and Other Tools (O’Reilly Nutshell)
by Jeffrey E. Friedl and Andy Oram

Sams Teach Yourself C++ for Linux in 21 Days
by Jesse Liberty, David B. Horvath

Graphical Applications with Tcl & TK
by Eric Foster-Johnson

XML Bible
by Elliotte Rusty Harold and Elliote Rusty

Beginning PHP4
by Chris Lea, Wankyu Choi, Allan Kent, Ganesh Prasad and Chris Ullman

by Paul DuBois, Michael Widenius

The Leadership Challenge: How to Keep Getting Extraordinary Things Done in Organizations
by James M. Kouzes and Barry Z. Posner and Tom Peters

Learning to Lead: A Workbook on Becoming a Leader
by Joan Goldsmith and Warren G. Bennis


I’m also trying to teach myself German and Italian. I think I may put them into active use some day soon.

I bought these two multimedia courses at CompUSA here in San Bruno:

Instant Immersion German

Instant Immersion Italian

Japanese is next.

I’m just so exhausted with learning, fighting, defending, coding, fixing, and dealing with an insurmountable amount of uncertainty looming over me every day with ${COMPANY}.

Such a productive weekend.

I wish the liars and deceitful people pounding my back would learn to see the light of truth.

Could I be tasting life again?

Advogato Diary Available in Plucker Format

Tags: , , , ,

I’m sitting in a hotel on a network that can’t stay up (and paying $9.95 a night for it), while I’m here at LWCE, so I won’t be putting down much here for the moment, but I had a great idea.

Firstly, I have to credit jimw for sparking this idea in my head.

If Advogato’s copy of recentlog.html had a Last-Modified header, I could determine when the person at the top of recentlog.html ailed off the bottom by parsing it with some Perl, thus making sure there’s no duplicate entries in the Plucker database.

I can then make a copy of it available on the site in the Samples section, and update it regularly with a Perl script on the server.

Comments anyone?

SuperBoring 2001

Tags: ,

Its no secret, I hate the SuperBowl. It represents everything I hate about manipulation, money, and greed. It’s practically a national holiday now.

Presenting the instant replays in “Matrix-style” doesn’t mean that now they’re going to attract the analytical technology sector. I have better things to do with my time. For what they spend on 15 seconds of commercial time could buy me a nice house out here in the Bay Area.

I’m so glad I don’t own a television.

Perl and Python Experts Required, Apply Within

It’s that time again. Time to canvas the technology masses to help us work out the bugs in the Python parser for Plucker, and in the Perl version as well. The perl version as it stands now (though incomplete) is still about 700% faster in execution time than the Python counterpart, based on timings used purely on the gather-content portion of the code.

I don’t know enough about Python yet to help with that part, and some of the things in perl I’m trying to do are a bit outside of my current skill level.

Pain At 40,000 Feet

Another plane flight to the other coast. Let’s hope my ears and headaches can handle the altitude. I should be racking up these miles, but I never end up flying on the same airline. Ugh. I’ve got over 20,000 in the past year alone. Could I bring my snowboard and stay the weekend? Maybe my mountain-bike? I need to get out more.

Is she going to come out and see me?

So once again, my gut was right.

My friend Casey once told me:

“If you have all the facts, and it still doesn’t make sense, you’re being lied to…”

OpenFlock, code, monkeys and keyboards


dsifry: I created a project for OpenFlock here. Add yourself. Your sites aren’t routing, and only one is up, with lots of dead links. Yes, I know, we all have no time left. Once I clear my plate, I can help you with this if you still need it.


Have to work on my Secure CVS talk. Seems that the need for anonymous ssh access to a secured CVS in a chrooted jail with non-privileged accounts and quotas is getting more and more popular. Well, maybe not, but some people need it, namely me, for $PROJECT[937].


More perl goo for my portal.

if ($nummatches > 0) {
   $lastmatch = $max+($set-1)*$max;
   $lastmatch = $nummatches if ($lastmatch>$nummatches);
   for ($i=($set-1)*$max;$i<$lastmatch;$i++) {
      $file = $matches[$i];
      $ip1 = $i+1;
      my($ksize) = ($sizes{$file}/1000);
      $size = &round($ksize,1);
      $date = &formattedDate($dates{$file});
      # convert the url for the forum messages
      $url = $file;
      foreach $dir (keys(%forums)) {
         if ($file =~ /$dir/ && $file =~ /(.*)/(.*).txt/)
            $url = "$forums{$dir}?msg=$2";
      $resultstr .= "<p><b>$ip1.</b><a
      $resultstr .= "<br /><b>URL:</b>
      $resultstr .= "<br /><b>Size:</b>
${size}KB, <b>Date:</b> $today_date";
   $numsets = int($nummatches/$max)+1;
   $next = $set+1;
   $previous = $set-1;
   $qstr =~ s/&set=(.*[0-9])//;
   $qstr = "$config{'scriptsearch'}?$qstr&set=";


I hate shopping around for cheap flights. Can’t someone get this scam in order? Guliani could probably get the Mob in line and get this thing regulated. One site has a flight for $700.00, and another has the same flight for $408.00. ARG!


Some days, I feel this incredible rush of productivity. Today was one of those days. Other days, I just feel like everyone else was productive, because I was doing their job for them, forgoing my own responsibilities.

No more! I can’t be responsible for voluntary ineptitude.

Employee Retention

We lost another one. I fear that if we don’t start treating employee retention as an important topic, we won’t have many more
employees left to retain.

“I can’t do everything, I can only do enough…”


Contributions are starting to come in for pilot-link now. A few OS/2 users are contributing patches. This is great! Keep up the incredible work guys.

n9mtb is going to help us shore up the python code in the tree now as well.

Stumbled across this yesterday. Looks like a good start for a server-based clipping application server. I’ve started something similar here about a year ago, though not nearly as thorough. I like the term “renderings” regarding the transcoding of the web content. Makes more sense then “channels” that AvantGo uses.

Plucker Desktop Buddy needs some TLC. Any GNOME guys want to help me fix this?

Someone gave me yet another idea for a Palm application today. A Flash viewer! Now that we have Open SWF, this should be easier. I’ll stick it on the long-term TODO list.

Anyone want to volunteer some time to come up with a good technically accurate Functional Requirements Specification for this?

Bad Behavior has blocked 426 access attempts in the last 7 days.