mortonfox: (Morton small)
Yes, it's already the second week of the new year but I was busy the first week and 2011 was such a busy year that it was hard to distill the important things from the year. The biggest change is after 16 months being out of work, I returned to work for a small startup (literally a 6-person office when I joined) in Wilmington. My previous job wasn't at a big firm but this one is microscopic in comparison and it's a lot different. There is no bureaucracy, no office politics, no cubicles, and very little formality. I was given full access and was trusted to do the right thing from day one. I learnt a lot as I went along and within a week, I had started contributing important code to the system. Best of all, I was never left with the feeling that anything I did was futile or a waste. Any software I wrote was put to good use pretty much right away and I deployed it myself most of the time. So all in all, it's been a promising start. Then again, I thought the same thing back when my previous job began, so let's check back on this one in 14 years and see if it has withstood the test of time. :)

Of course, with the new job, I had less time for geocaching but I think I did as much of that as I wanted to on weekends and after work in the summer. I ended the year with more geocache finds than year 2009 but not 2010. The year was dominated by Lancaster with two big geocache series, the battleship caches and the rail trail caches, although Delaware was no slouch either with the DGT caches, the C&D power trail, and the First State Challenge. I tried to get out to more geocaching events as well, especially the ones in Bucks and Montgomery County that would've been a 2-hour drive from my old home in North Jersey. Now that these are only an hour from home, it hardly feels like an arduous journey getting there. I also started going to a few Where's George events locally and in Maryland. And of course, I went to local furmeets too whenever I could and attended 3 furry conventions, FA: United, Anthrocon and Furfright. The great thing about this area is there's an event or gathering going on pretty much every weekend. On the other hand, the downside is I haven't had as many mascot gigs now that I'm distant from Hi-4. I'm also losing touch with NYC-area folks but that is to be expected.

I kept up the pace on personal projects as usual. In its 4th year, TwitVim had another round of incremental improvements, although I thought the multiple login feature was big enough to bump the version number. My Foursquare webapp, 4sqNoGPS, became PlainSquare when I rewrote it for the Foursquare V2 API. I also changed the CSS so it looks more like a mobile app on small screens while keeping the desktop interface simple. I've found this setup to be good enough for most day-to-day use and really only hit the official app to upload photos and claim specials. Remember the beta Google Chromebook I received in December 2010? Well, I used it a lot more throughout 2011 and that led to my participation in the Cr-48 binaries project. I probably wouldn't use the Cr-48 for serious development work but now that we have a text editor, a few scripting languages, and some dev tools ported to it, light work is possible. And finally, I did get around to scrapping my old website and reworking it into a Drupal-based site. This doesn't mean that I'll update it any more frequently but when I do, it'll be less of a pain. :)
mortonfox: (words)
The stock Chrome OS installation on a Google Chrome notebook doesn't make it easy to install additional software. So all this while, in order to use TwitVim, I'd been opening an ssh session to my webhost, Joyent, and running Vim and TwitVim in the shell account there. This is an adequate solution to get up and running with TwitVim quickly but it has a few problems. The worst problem is ssh will disconnect if the network connection is bad or if you leave it idle for too long. Also, the ssh session is not preserved if I close the lid of the Cr-48 (to put it in sleep mode) because the network connection goes away then too. Those problems are lessened somewhat if I run Vim and TwitVim in a screen virtual terminal, but still I thought there had to be a better way.

Recently, I came across a blog post about installing Nano on the Cr-48. The basic idea is the stock Cr-48 setup can use binary packages from Arch Linux. That completely eliminates the need to set up a Chrome OS development system and build the software yourself. I figured if he can do that with Nano, then I can install Vim the same way and after that, running TwitVim would be a snap.

Here are the steps I used:

Read more... )
mortonfox: (words)
I released TwitVim 0.5.4 yesterday, just a day ahead of Vim 7.3 final. I haven't written about TwitVim development in a few months. The last time I wrote in any detail was while I was in the middle of writing the OAuth code. From 0.5.0 to 0.5.4, there have been over 3 dozen revisions, mostly to complete the feature set with some bugfixes and documentation improvements thrown in the mix.

One issue I've struggled with in TwitVim 0.5.x is about requiring the user to use a Vim executable that has been compiled with one of the scripting interfaces. (Perl, Python, Ruby, or Tcl) The reason for this is I don't have a good implementation of the HMAC-SHA1 digest code in pure Vim script1, so TwitVim has to sign OAuth requests by calling a HMAC-SHA1 module from one of those scripting languages. This is a terrible inconvenience; if it were not for this requirement, one would be able to run TwitVim in a precompiled Vim executable. Because of this requirement, a prospective TwitVim user now needs to be reasonably familiar with compilers and be able to build Vim from scratch. Furthermore, the required module isn't present by default in most Perl distributions other than ActivePerl, so the user has to fetch it from CPAN. Fortunately, the TwitVim user base (which seems to number about 3 at the moment :) ) appears to be quite good at those things. So far, those who contacted me with questions only needed a nudge in the right direction to get it working.

Another problem that's still unresolved at this time is Vim breaks some Tcl 8.5 modules. In particular, this bug prevents TwitVim from using Twitter SSL via the Tcl interface if Vim is compiled with Tcl 8.5. (TwitVim needs the "tls" package that I mentioned in my post to vim_dev. Tcl 8.4 is fine.) It was too late to address this issue in Vim 7.3, but I hope there'll be an official patch for this before Vim 7.4. (The unofficial patch is simply to hack out the redefinition of the "catch" command in if_tcl.c.)

1 There are Vim script modules for HMAC and SHA1 but these are very slow. The problem is Vim script does not have bitwise operators, so all the shifts, rotates, ANDs, ORs, and XORs have to be done using regular math operators and table lookups. It's really quite clever but I'd rather wait until the necessary enhancements are in Vim script before implementing HMAC-SHA1 in pure Vim script.
mortonfox: (Robot)
Futuro house Bram recently added a bunch of if_ruby (Ruby Interface) patches to Vim to add support for Ruby 1.9, improve overall support for Ruby, and fix a few problems. Of course, two of those patches affected TwitVim and I'll discuss them here. First, the good stuff: Patch 7.2.360 finally fixes the if_ruby Windows sockets problem. I used to recommend this unofficial patch but that won't be needed any more if the user has patch 7.2.360 or (the upcoming) Vim 7.3 or later.

Patch 7.2.374 allows VIM::evaluate() to return Ruby arrays or hashes instead of strings if the Vim expression results in a list or dictionary. This, unfortunately, did break TwitVim because TwitVim does the following:
    keys = VIM.evaluate('keys(a:parms)')
    keys = keys.split(/\n/)
If the parms dictionary has keys "user", "text", and "status", prior to patch 7.2.374, VIM.evaluate() will return "user\ntext\nstatus" and the next line will split it into the array ["user", "text", "status"]. After patch 7.2.374, VIM.evaluate() returns ["user", "text", "status"], causing the next line to hit a Ruby error because a Ruby array doesn't have a split() method.

How do we solve this problem? At first, I was thinking of checking for this Vim patch using a conditional like this:
    v:version > 702 || v:version == 702 && has("patch374")
In other words, Vim 7.3 and later are guaranteed to have patch 7.2.374 and we only check for the patch itself if the Vim version is 7.2. If I stick this expression into VIM.evaluate(), it'll return "1" if that patch is present and "0" otherwise. Then it occurred to me that there are two better ways to deal with this:

1. Make the Vim expression return a string regardless by doing an explicit join on the array:
    keys = VIM.evaluate('join(keys(a:parms), "\n")')
    keys = keys.split(/\n/)
2. Use Ruby's type introspection to see if a split is needed:
    keys = VIM.evaluate('keys(a:parms)')
    keys = keys.split(/\n/) if keys.is_a? String
I prefer the second approach because it is more efficient and a few years into the future, once everyone has upgraded their Vim installations past this patch, we can clean up the code easily by removing the second line. Thus, this fix is in TwitVim revision 82.
mortonfox: (face tree)
The recent snowstorm did some damage to one of the cedar trees in the front yard. A few branches snapped under the weight of the snow and were hanging down dangerously. So this morning, we went to work sawing off those branches. That was tough work because the branches were pretty high up. We used a long pole with a saw blade at the end for the higher branches. For the lower branches, we used a ladder and a regular saw. Then we cut up those branches into smaller pieces and put those away until such a time when we can take those to the yard waste collection center.

I posted a new release of TwitVim today. I uploaded the previous release the day before New Year's Day, so it's only fitting that I upload this one the day before Chinese New Year. Okay, that was just a coincidence. I don't think I'll be posting all future releases just before holidays. :) Anyway, when I went to the TwitVim plugin page at Vim Online, I noticed that there's a new link in the header to a page for this plugin at the Vim Tips Wiki. Cool! Ostensibly, this wiki page is meant for user comments and suggestions but I figured I could also use it to host a few screenshots.

After that, I started work on revision r80, which changes "replies" to "mentions" in the TwitVim UI. This change is almost totally cosmetic, I know, but apparently, everyone now refers to tweets containing @username as "mentions" so the client has to follow that convention.


Dec. 19th, 2009 07:29 pm
mortonfox: (xmas)
After about 4" of snow

Woke up this morning to about 4" of snow on the ground and it continued snowing throughout the day, so that put a stop to this evening's plans. But that's okay. There'll be another meet next month and it's better to be safe than to try to drive out on those snowy roads. So all we did this morning was brush the snow off the car and shovel and salt the sidewalk and driveway. We'll have to do this again tomorrow morning to take care of a few more inches of snow that fell later in the day.

Worked on a Twitter login prompt for TwitVim last night. I didn't think of this before because I'd always just started it up by script. This suggestion came from a user who wanted to set up TwitVim on a system that wasn't his, so he couldn't put his login info (whether plain or base64) in the vimrc.
mortonfox: (create a fursona)
Over the last two weeks, I've done a lot of work (r35 thru r50) on TwitVim to get it from version 0.3.5 to 0.4, so I think it would be good to stop for a while and explain some of the enhancements I've put in. This article will be the 0.4 release notes when it comes out. Of course, since I know of only about a dozen or so users of this Twitter client, almost everyone can safely skip this post. :)

Read more... )

Indian Rock

Oct. 2nd, 2008 11:16 pm
mortonfox: (morton blvd)

This afternoon, I went to Indian Rock Shopping Center in Suffern for the Indian Rock geocache. The strip mall is built around Indian Rock, a large glacial erratic that got its name because local tribes used to hold tribal meetings there. There used to be a cache right at the rock but that one didn't even last a day; the cache owner archived and removed it as soon as he found out that the spot had historic significance. This new cache is somewhat different. The first part now involves using a number at the cache site to calculate the final coordinates and the actual cache container is on the other side of the parking area, which in my opinion is a much better cache location.

TwitVim update )
mortonfox: (words)
Old Troy Park

After digging into the Vim mailing list archives, I found out why the networking code in Ruby/if_ruby was failing in Vim. It is because if_ruby.c didn't call NtInitialize() when setting up the if_ruby interface. Better yet, someone posted a patch for this a few months ago and Bram added a slight correction to the patch. Unfortunately, this patch still isn't in the Vim source distribution. Why? Because it was a drive-by patching. The original poster didn't follow up with Bram and Bram cannot include the patch without knowing the author's name. And so the bug remains to this day. I'll see if there's anything I can do to get this patch into the source (even if I have to take responsibility for it) but in the meantime, I added a Ruby version of the networking code to TwitVim in r13.

I also added a Tcl version of the code in r14. That was fun to do, mostly because I had no idea it was at all possible. I hadn't touched Tcl in over a decade and back then, the Tcl standard library didn't have half as many commands as it does now. One thing I noticed is the ActiveTcl 8.5 download doesn't include Tcllib by default. I don't know why ActiveState would omit such an important library component but it is easy to install using the teacup program afterwards.

Losing air

Sep. 11th, 2008 12:30 am
mortonfox: (create a fursona)

The driver's side rear tire is still losing air but only at the rate of 5 psi per day. It's a slow leak. I haven't found the leak yet so I've just been pumping it up every few days. I have my own air pump and I've also been using the free air at the gas station near work. I'll get someone to check it within the month.

Teck Cominco is buying Fording Coal. So I'll get cash and TCK stock, but at the same time, I'll be saying goodbye to yet another top-performing and high-yielding stock. Many in the investment community still do not realize what bargains income trusts have become in the wake of the Canadian tax scare two years ago, but other energy resource companies have taken notice. Of my five income trust picks, two have gotten bids. I'm sure many more income trusts that I've not been following have also been acquired. Market forces will eventually correct what the government has broken.

More TwitVim development and a problem with if_ruby... )
mortonfox: (words)

I opened a Google Code project for TwitVim. It's better this way because I can check in any work in progress to the Subversion repository instead of just keeping it on my hard disk, even though I have been taking precautions to avoid losing work.

So what's new? Two weeks ago, the Twitter folks introduced the new in_reply_to_status_id parameter in the API. Through the use of this parameter, a Twitter client can point an @reply to the tweet that the user is actually replying to instead of the latest tweet, which was the default. The intention is to let Twitter track conversations more accurately. This parameter is optional and still new, so I don't think it is in broad use yet, but maybe we can do some interesting things with the reply graphs later.

Last week, I started thinking about how I can support that new parameter in TwitVim and then I did it in r6 and r7. It is a significant change to the implementation. Previously, the buffer text was all the script needed to maintain state but after this addition, it now keeps a script-local list of status IDs. There is potential for breakage now because the script has to account for buffer changes. Hope I got them all.

Just for fun, I hopped over to to see if the new reply parameter would work there too but it doesn't. A bit disappointing, but I can wait.

A TwitVim screenshot, because I don't think I've posted one before... )
mortonfox: (Robot)

There must be a sales drive going on at Sprint now because yesterday morning, I got a phone call from a rather insistent Sprint sales representative. Of course, I wasn't going to upgrade my calling plan since I hardly use any minutes in the first place, and I wasn't going to upgrade my phone either because I just got a replacement Razr V3m in good working condition. However, that sales call did get me to at least take a look at Sprint's current selection of phones.

The LG Rumor is one that I might get for the slide-out keyboard. The dealbreaker is it doesn't support EV-DO! If I have Power Vision, why get a phone that can't use it? The only other Sprint offering that I thought was interesting was the HTC Touch, a touchscreen Windows Mobile smartphone. However, the reviews are lukewarm. The rest of the phones are either less capable than the Razr V3m (so why buy those when I can always get a V3m on eBay?) or too high-end for me to be bringing out into the woods. Bottom line is I ought to wait and see. Maybe they'll have more choices next year when my contract is up for renewal.

Did more work on TwitVim. Yesterday, I added support for highlighting #hashtags and jumping to the Twitter Search for those hashtags. That should make hashtags easier to follow in TwitVim, not that many people on my friends timeline use those.

Then today, I rewrote TwitVim's date/time reformatting code in pure Vim script. It used to be written in Perl, so only those who ran Vim with the if_perl extension compiled in would see those. Everyone else saw raw Twitter API timestamps, which are in GMT instead of local time and aren't very pretty, besides. Now that this piece of code is in Vim script, everyone will get the new timestamps. Why was it in Perl earlier? Because Vim has barely anything by way of date/time handling functions so I was using Perl's library functions for that. Once I had the Julian date formula though, it was easy to write a Vim function to convert date strings to UNIX time values. (i.e. seconds since Jan 1, 1970) Of course, it was even easier to peek into the Perl library to see how they implemented timegm(). Wish I'd thought of that earlier.

Here's what timegm() looks like in Vim script... )


May. 23rd, 2008 11:55 pm
mortonfox: (fox yawn)

This evening, I did a maintenance run for this geocache at Children's Park in Chestnut Ridge, NY. Earlier in the week, an accidental finder reported that the cache was wet or damaged and took it away to dry it out. She returned it yesterday and so I went to take a look. It's actually still in pretty good shape. However, I relocated it up the slope a little in case the stream floods again.

I also received two pairs of eyeglasses that I ordered online. Two pairs for $54 (after their 2-for-1 special and coupon code discount) is a fair deal, I'd say. And shortly, I'll fax in my flex account claim form.

And finally, I posted release 0.1 of FFeedVim, my Friendfeed client in Vim script. It only supports posting items to Friendfeed at the moment because I don't know yet how I'd render a Friendfeed stream in a Vim buffer. I also requested an API client ID (so that it says "via FFeedVim" in the stream when I use it) from the Friendfeed folks and they added it to the system within an hour, which is super-fast service even for a Web 2.0 outfit.

Friday Five )
mortonfox: (morton ave)
Ramapo Reservation

It was a rainy day yesterday but the weather was fine today, so it's funny that I went to Rainy Day Women this evening. This geocache is in Ramapo County Reservation in Mahwah. Like the geocache I did last week in the same park, this too is up the mountain. This one is a little further up the mountain though. Whereas last week's geocache was at the reservoir level, this one is near the first lookout point on the blue trail. Although steeper, this evening's walk was shorter and I was there and back to the parking area in well under an hour. After that, I had a meatball marinara footlong at Subway in Ramsey.

TwitVim development continues. Summize Twitter search provides an API so I used it and made it so that TwitVim displays search results in a Vim window. I also added mappings and extended some existing commands to jump to timelines of other users. A TwitVim user actually suggested this feature and generously provided code for it, but I already had a different implementation in mind so I went with the latter.

I've been geotagging my photos, at least those photos that were taken near cache sites. My camera doesn't have GPS and thus doesn't embed GPS metadata into the JPEG files. So, up until yesterday, I'd been uploading photos to Flickr, Geosnapper, Panoramio, etc, and then adding the location data using the interfaces of those websites. (with the help of some AutoHotkey macros) However, because these photo websites recognize GPS tags in EXIF headers of uploaded images, it is less work to add the information to the image file before uploading. This way, I need only add the information to one place: the image file itself. Wish I'd thought of that earlier! So I started using ExifTool this evening to do that. Flickr and Panoramio accept location data just fine this way. Unfortunately, Geosnapper, for reasons unknown, fails to interpret the GPS tags correctly and comes up with locations that are as much as 10 miles off. I'll have to ask them about this problem some time.

Army 2

May. 7th, 2008 11:41 pm
mortonfox: (fox bend)
FDNY Mural

Two choices for this evening's geocache: one in Ramsey and one in Congers. Based on proximity, the Ramsey cache won but I'll probably go for the one in Congers the next day anyway. So this evening, I went for Army Cache 2. It's in a wedge-shaped wooded area between Wyckoff Avenue and Woodland Avenue. Nothing remarkable yet, but there is already the beginnings of a trail through it.

After that, I went for another $5 footlong at Subway in Ramsey, just down the road from the cache site. This time I was lucky and got a parking space right in front of the restaurant, although my usual parking location really isn't that far down the sidewalk. I got an Italian BMT Footlong. What does BMT stand for? Well... some folks answered the question here, but it reminds me of the BMT section of the NYC subway.

Other updates: Posted K-Meleon macros for Readbag, for Evernote, and for Google Reader. Also added some enhancements to TwitVim that were suggested by users. As always, it's great that there are users willing to help me test the plugin on Vim platforms that I don't use. Given what I know now about Vim scripting, I would like to go back and revise some of my earlier Vim scripts but there's not enough time. Maybe later.
mortonfox: (create a fursona)
Cow Meadow Park Marina

After about six months of hair growth, I finally decided to get a haircut two evenings ago. As an interim measure, I'd been cutting my own hair just to get the annoying parts out of the way but that eventually proved insufficient. What prompted my decision was the 70-degree weather over the weekend, so it was ironic that the temperature went down to around 50°F on the day I went for the haircut. That's the weather mocking me! This was the fastest haircut I've ever gotten at Supercuts in Ramsey. There was no wait and the superfast hairdresser finished in less than five minutes! (Of course, it helped that I didn't care how it looked and basically just asked for a #4.)

TwitVim is semi-stable, and by that I mean I haven't thought of a thing that I'd like to tweak or enhance in this plugin for over a day now. :) What's gratifying is it actually has a few users now and they've contacted me over Twitter to say that they're using it. One problem I ran into is Vim script's lack of time-handling functions. While you can parse time strings using Vim's regular expressions, there is no support for time calculations and time zones. My solution is to use if_perl to embed a piece of Perl code in the Vim script to perform the time functions. I did that in a way that degrades gracefully, so if the user's Vim installation does not have the Perl interface enabled, TwitVim will simply use Twitter's raw timestamps, which are ugly but better than nothing.
mortonfox: (Robot)
Fire Department Memorial

The latest enhancement to Flickr is they now accept video uploads. I don't shoot much video but I did have a video file that was sitting on the hard disk for about a month, so I uploaded it. Nothing spectacular. Just a 23-second video of Pennypack Creek overflowing its banks in Northeast Philadelphia after heavy rainfall. Those trees at the upper right corner are not normally in the river!

I thought I was done for a while with TwitVim at version 0.2.0 yesterday, but I went ahead and added a few more features. I've also been in correspondence with a user who contributed some fixes to make the plugin work in Chinese Vim. That's wonderful! I can't possibly test the plugin on every Vim platform, so it's good to have someone step in to fill the gaps. I also got the client software registered with Twitter (emailed them with my request and it was done within a day) so that tweets I post with it say "from TwitVim" with a link to the download page.

This evening, after running some errands in Ramsey and Mahwah, I went to Subway in Ramsey and had a BBQ rib patty footlong sub. They've had $5 footlong specials for a while now, so I should've eaten there more but I've been busy and haven't had too many opportunities to go to downtown Ramsey.
mortonfox: (create a fursona)
Memorial Park

This evening, I visited Uncle's Memorial Cache. It is in the woods of Memorial Park in Oradell, just a short hop (and a 35-cent toll) down the Parkway. Then I went to the Chinese supermarket in River Edge to get a boxed dinner.

Later in the evening, since it's a triple-coupon week and since I'd already sorted out my coupons the night before, I went to A&P to see what I could get. It's actually harder to bag the big discounts now. Coupons are for brand-name items and maybe I've been out of the loop for a while, but that stuff is expensive! Even so, I got $35.90 in groceries for $14.67 and I do now have enough of most items to last well into next week.

Last night, after watching their Campfire One video, I snagged a Google App Engine invitation. Not sure what I would do with it yet. I suppose the main draws are that you can run your web app on Google's dime, and storage and scalability become Google's problems, at least until your app hits the free account limits. One downside, for now, is they only support the Python language and I haven't touched Python in many years. I don't think it'll take too long to relearn, or I could be lazy and wait for App Engine to support Perl.

There was also a bit of hype on the part of Google. They claimed that only the first 10,000 developers would be able to register. Just a short time after midnight, the signup page looked like they had already run out of registration spots, but I put my Google account on the waiting list and got in an hour later. Some Web 2.0 bloggers were still able to register for App Engine as late as this morning, so the "preview release" is really not such an exclusive club.

Further TwitVim development... )
mortonfox: (morton blvd)
Grove Park

This afternoon, I went to Grove Park in Ridgewood, not far away, for the Cache Cow geocache. It was sunny and around 50°F, not bad weather for a quick walk in the woods. And it didn't take long to find the geocache.

There is an interesting quandary associated with this cache though. The cache owner originally placed it in Saddle River County Park, half a mile South of its current location. The cache listing was approved yesterday. Then he realized that it was close to another cache, so he decided to move it to Grove Park. Meanwhile, Ramapo, acting on the info in the cache listing, went to the original location and failed to find the cache after a fruitless search. So how ought one move a cache? As Ramapo suggested, the cache owner could've disabled the cache listing before moving the cache. However, that still may not help because someone might've downloaded or printed the cache info the night before. My inclination would be to not move the cache unless there was a real problem with its location or at least disable the listing for a period of time first to provide sufficient advance warning. When I wanted to retire one of my caches, I disabled the cache listing for two weeks before actually heading out to remove it. I thought that was playing it a bit too safe, but to my surprise, there were still a few last-minute visitors.

I also did a bit more work on TwitVim, the Vim Twitter plugin. I had already started work on the next major feature, which will be to parse and display Twitter timelines, but I decided that it would be a good idea to first polish up and document what I had already released. Hence today's minor point release.
mortonfox: (fox yawn)
Dahnerts County Park

Lots of new geocaches showed up in the listings today. So I went and did 4 of those that weren't too far away. Only got FTF on one though. China Syndrome 2 and Aaron Burr Drank Here Too!!! were in Ramsey. The latter was at the Old Stone House, which was an 18th-century tavern where Aaron Burr reputedly stopped for liquid refreshment. In the evening, I went for Dahnerts County Park Cache in Garfield (the town, not the lasagna-eating cat) and Hackensack River Park Beach behind Riverside Square Mall in Hackensack.

I posted my improved Twitter Vim script to the Vim script archive. The original author is not using the Twitter Vim script any more since he has switched to another text editor. (the one that resembles an operating system :) ) I discussed the hand-off with him and the way we did this is the last version of his script will be the pre-release version of the new script. Then I create a branch off of the script and I'll post updates to my page from now on. I wish the Vim script archive allowed a script to have multiple authors. That would make the hand-off easier.

I also posted K-Meleon macros for FriendFeed, Profilactic, and Google Bookmarks. I've been busy.

Friday Five )


mortonfox: (Default)
Morton Fox

September 2017

17181920 212223


RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags