[link] Hey, archive.org has a project I worked on 11 years ago: a web site to send virtual gifts (custom images) to other people. Many images are missing. They were various candies and chocolates that we found or scanned. The site would randomly place the images over your choice of background, and then save that image for your recipient. The site did really well in Australia, for reasons we never learned. Maybe it was mentioned in a magazine there or something. I have the original files on disk, and they show up 4 times in various backups over the years. That number seems low, given how sloppy my backup procedures are. The code looks like 9 perl cgi programs, 860 SLOC total. The storage is an ad-hoc text file format, and it looks like this version sent 1800 gifts (400 with .au in the addresses). I still have the messages people wrote to each other. I suspect they're different from what people would write today, but I can't even think how to rerelease something like this given the spam problem. On the site information page, you can see my friends who worked on the site. I think these are their jobs today (not in order): That's a project I want to do in the future, by the way. I want to list all the jobs of all the people I know, and you list all the jobs of people you know, etc. Then when I need someone with, say, access to a fog machine, or someone who can design and print me a poster, or someone who can advise on IP law, I just search the job network for people close to me. It would be like a slice of what linkedin.com does, but without any need for a central company like linkedin to broker all the private data (because there isn't any).
2008-11-16T22:52:04 Virtual Gift Factory:
[link] 2008-11-02T10:08:32 Graphs from sparql results: This is a response to Download SPARQL results directly into a spreadsheet So far you've motivated seeing the results of a query in a table and making a graph from them. I'd like to have both of those capabilities in a webapp. E.g. I should be able to embed a live graph in my own page like this:
<img src="http://sparqlgrapher.com/svg/example.com/query=SELECT+?date+?price+{...}">
Visiting my hypothetical sparqlgrapher.com directly would give you a UI to layout and customize the graph. When you're done, you'd take that url and embed it elsewhere (or just take a copy of the image, if you want a one-off).
[link] 2008-08-31T14:57:16 People think anything animated is flash: A fine site like http://browsegoods.com/ gets tagged as 'flash' in delicious :(
[link] I played with a bunch of New Fangled Web Technologies and redid my home page. Almost everything is dynamically derived from data sources that I presumably keep up to date for other reasons. The foaf part and projects list part aren't done yet. I also haven't removed all the zope pages yet, unfortunately. (Zope turned out not to be a good system for making a low-maintenance site that lasts for 10+ years.) I hope to have a DOAP document for each project, which will make them easy to list on my home page as well as other project-list systems.
2008-08-03T22:25:34 New home page:
[link] This is not the first time I've been completely lost in the RTM UI. On this page, I have no idea what's going on. Dying of curiosity, I made some groups: I now learn that the top box on the right displays some info about the group that I'm hovering over in the main list. I still don't know how to add members to a group that I've made. I have "1 contact and 2 groups selected", but there seems to be nothing to click that would affect the membership of any groups. Dare I suggest that the behavior of groups (they contain users) be reflected in the visual layout of the page (the depiction of a group contains depictions of users)? Finally, we're out of laundry soap, so please get some if you go to a store before I do and you're Kelsi.
(1) 2008-06-05T21:00:51 I think I hate the rememberthemilk.com UI: 

[link] I put a link on www.hackaday.com, and learned that 2/3 of the people who followed the link to my site have 'Firefox' in their user agent strings: wc -l grep Linux | wc -l grep Windows | wc -l grep Macintosh | wc -l grep Firefox | wc -l grep -v Firefox | wc -l grep Opera | wc -l
2008-05-10T20:57:01 www.hackaday.com browser profiles:
1601
171
1158
256
1073
528
47
[link] 2008-05-02T20:38:08 Looking for the mouse: Clay Shirky: "Looking for the Mouse" talk from Web 2.0 Expo
This is the best talk I've seen all year. You can read it here, but I recommend the video since Clay speaks really well, and you should see his passion. After the second time through, I noticed how well his TV producer stories worked for the momentum and interest of his talk. She was a character that he got into conflict with, and we pay more attention to his side when we think there's a person in a high (or at least rare) position who might win a point in the debate. (Spoiler: she doesn't.)
[link] 2008-04-29T01:38:52 tinymce patch for newsbruiser: This patch hopefully works on the new newsbruiser release 2.6.2. It lets us use the excellent TinyMCE editor widget to write blog posts. Along with this patch, you have to actually put tinymce such that it shows up at /resources/tiny_mce/tiny_mce.js. (Coming soon: another newsbruiser patch and accompanying tools that let us send picture posts from our cell phones.) Index: nb/CoreCGIs.py
===================================================================
RCS file: /cvs/newsbruiser/nb/CoreCGIs.py,v
retrieving revision 1.100
diff -u -r1.100 CoreCGIs.py
--- nb/CoreCGIs.py 27 Apr 2008 11:52:33 -0000 1.100
+++ nb/CoreCGIs.py 29 Apr 2008 08:16:41 -0000
@@ -271,7 +267,7 @@
self.printDisplaySnippets('aboveEntryText')
print '<table><tr><td valign="top">'
self.textArea(self.notebook.getEntryBoxLength(), 70,
- const.ENTRY_CGI_KEY)
+ const.ENTRY_CGI_KEY, html=True)
self.printDisplaySnippets('rightOfEntryText')
if showHelp:
@@ -819,7 +815,7 @@
print '<table><tr><td valign="top">'
self.textArea(self.notebook.getEntryBoxLength(), 70,
- const.ENTRY_CGI_KEY, entry.text)
+ const.ENTRY_CGI_KEY, entry.text, html=True)
self.printDisplaySnippets('rightOfEntryText')
if names:
print '</td><td valign="top">'
Index: nb/lib/LOMP.py
===================================================================
RCS file: /cvs/newsbruiser/nb/lib/LOMP.py,v
retrieving revision 1.16
diff -u -r1.16 LOMP.py
--- nb/lib/LOMP.py 5 Dec 2004 20:20:51 -0000 1.16
+++ nb/lib/LOMP.py 29 Apr 2008 08:16:59 -0000
@@ -183,9 +183,41 @@
maxlength = ''
print '<input type="text" name="%s" value="%s" size="%s"%s />' % (name, cgi.escape(str(value), 1), size, maxlength)
- def textArea(self, rows, cols, name, content=''):
- "Prints a standard multiline text box."
- print '<p><textarea wrap="virtual" rows="%s" cols="%s" name="%s">%s</textarea></p>' % (rows, cols, name, cgi.escape(str(content)))
+ def textArea(self, rows, cols, name, content='', html=False):
+ """Prints a standard multiline text box.
+
+ drewp adds html mode using tinymce
+ """
+ escContent = cgi.escape(str(content))
+ if html:
+ # it would be cool to grab recent images and put them in
+ # the external_image_list
+ # see http://wiki.moxiecode.com/index.php/TinyMCE:Configuration/external_image_list_url
+
+ # the way i include this js probably only works if there's
+ # one html textarea on the page
+ print """
+<script type="text/javascript" src="/resources/tiny_mce/tiny_mce.js"></script>
+<script type="text/javascript">
+ tinyMCE.init({
+ mode : "exact",
+ elements : "elm1",
+ theme : "advanced",
+ table_inline_editing : true,
+ plugins : "table,emotions,style",
+ theme_advanced_blockformats : "p,pre,div,h1,h2,h3,h4,h5,h6,blockquote,dt,dd,code,samp",
+ theme_advanced_toolbar_location : "top",
+ theme_advanced_statusbar_location : "bottom",
+ theme_advanced_resizing : true,
+ theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,bullist,numlist,|,outdent,indent,blockquote,|,formatselect,fontselect,fontsizeselect",
+ theme_advanced_buttons2 : "undo,redo,|,link,unlink,anchor,image,cleanup,help,code,|,insertdate,inserttime,preview,|,forecolor,backcolor,|,hr,removeformat,visualaid,|,sub,sup,|,charmap,emotions,styleprops",
+ theme_advanced_buttons3 : "tablecontrols"
+ });
+</script>
+
+ <p><textarea id="elm1" name="%(name)s" rows="20" cols="60">%(escContent)s</textarea></p>""" % vars()
+ return
+ print '<p><textarea wrap="virtual" rows="%s" cols="%s" name="%s">%s</textarea></p>' % (rows, cols, name, escContent)
def listBox(self, boxName, names, values, defaults=None, size=1,
allowMultiple=0):
[link] Some goals for a better wiki system: A common case seems to be "add a new page and list it in some existing TOC section". Another one is "add a new section (paragraph or more) to this page". Editing words within an existing section that you didn't write, that might be rare. I still like tinymce, although nelix_ isn't a fan. Wikis that I use (that I'm trying to be better than) are: twiki, zwiki, confluence. Related: rdf blog engine ideas
(1) 2008-02-22T00:38:14 Goals for a wiki system:
[link] I moved another project from CVS to darcs. The main secret is just cvs2darcs, which has worked perfectly for me. But in this case, I knew I there were some URLs in the wild pointing into my viewcvs site, which I didn't want to break. So I fired up darcsweb, which is nicer than I expected it would be. I'm using nginx, so I can't just run darcsweb as CGI. While eventually the darcsweb toplevel code should be rewritten to not be CGI, for now I'm running a simple twisted.web CGI server. Here's the full code: So now you can go to an old link to viewcvs and it'll redirect to a reasonable point in darcsweb. Until I relocate all my files into new directories, which darcs will let me do easily :)
2008-01-22T02:16:04 Smooth migration from CVS to darcs: #!/usr/bin/python
import sys
from twisted.internet import reactor
from twisted.python import log
from twisted.web import server, resource, static, twcgi
class Root(resource.Resource):
def __init__(self):
resource.Resource.__init__(self)
for f in ['darcs.png', 'minidarcs.png', 'style.css']:
self.children[f] = static.File(f)
self.children[''] = twcgi.CGIScript(filename='./darcsweb.cgi')
log.startLogging(sys.stdout)
reactor.listenTCP(8004, server.Site(Root()))
reactor.run()
Finally, to make the URLs redirect, I added a nginx rewrite rule:server { include conf/stdsite.conf;
server_name cvs.bigasterisk.com;
location / {
proxy_pass http://bang:8003/;
# for 'room', filenames in viewcvs forward to the new darcs repository
# e.g. '/viewcvs/room/evening_lights?rev=1.3'
rewrite ^/viewcvs/room/([^\?]*).* "http://bigasterisk.com/darcs/?r=room;a=headblob;f=/$1?" permanent;
}
}
[link] I made a web app to help people with date/time format conversions in python. The only one I especially checked was the one I needed at the moment: email ("Wed, 26 Dec 2007 11:42:54 -0800") to iso8601 ("2007-12-26T11:42:54-08:00").
2007-12-31T23:01:00 Python date convert:
[link] 2007-06-08T00:12:23 Searching for 'search': I searched google for 'search' and followed the first result, searched that for 'search', etc.: http://www.google.com/ -> http://www.live.com/ -> http://www.search.com/ -> http://search.yahoo.com/ and yahoo returns itself.
[link] 2007-02-11T14:18:11 Visited-link hack proposal for revyu.com: http://revyu.com gathers people's reviews of anything on the web. The web is so big that you don't even think of lots of things that you could review and would be happy to review. So what happens is that when you come to http://revyu.com, you notice the list of recent reviews, realize that you are familiar with some of them, so you pile on a few more reviews of your own. That mechanism for capturing more reviews won't scale very well if revyu.com becomes a lot more popular. Every time I visit, there could be a huge number of new reviews. I might like to look through them to see what I can offer, but I don't have time to scan the list of 80 new links. This nearly-useless css hack can help. It measures the colors that your browser applies to visited/non-visited links to separate a known set of links into the ones you've seen and (probably) haven't seen. That's just what I want on revyu.com-- a list of the recently-reviewed URLs that I have also seen. It's fine to show all the recent reviews too, just for interest, but I'm much less likely to have a pile-on review for those.
[link] 2006-11-04T23:00:35 gps tracker: Today I wrote a thing with the python gps module (from gpsd), a nevow website with livepage, and google maps. Then I went out on the road with a gps receiver, laptop, and Treo 600 and broadcasted my position. You could watch me move at http://maps.bigasterisk.com darcs get http://darcs.bigasterisk.com/maps to get the code, or just look at: http://darcs.bigasterisk.com/maps/serve http://darcs.bigasterisk.com/maps/postPosition for the good parts.
[link] 2006-09-06T10:01:30 hiding firefox bars: There are some web pages that I want to leave on my screen a lot, e.g. my tiddlywiki page. I would like a firefox command to hide all menus/toolbars/statusbars at once, and only for my selected windows. The closest I have right now is some menu options that turn off most of the bars, but I can't turn off the top menubar. But, the settings affect future windows I create unless I undo them, and that workflow is a pain. I'd prefer one key to show/hide the UI, like photoshop's tab key (toggles all palettes on and off). While we're at it, there should be a page mangler that collapses any empty elements so that my always-on-screen page can take up minimal space. https://addons.mozilla.org/firefox/786/ may be relevant, haven't tried it yet. also http://www.aqua-soft.org/board/showthread.php?t=36979#4
[link] 2006-07-22T19:55:41 connecting the loggers of mochikit, firebug, and divmod: This will save you about 50 seconds of RTFS, but maybe that's all that was stopping you from having a comfortable logging setup. The plan is to redirect mochikit log() messages and divmod log messages into firebug, whose console will stay active over a reload, and can be turned on and off more easily than a mochikit in-the-page page. Now:
Divmod.logger.addObserver(function(ev) {
if (ev.channel == "transport") {
return;
}
console.info("divmod (%s): %s", ev.channel, ev.message);
});
logger.addListener('logConsole', null, function(msg) {
console.info(msg);
});
log("mochikit message");
console.info("firebug message");
Divmod.log("divmod message");
[link] 2006-02-11T18:00:04 posted gasuse: http://gasuse.bigasterisk.com now runs the latest gasuse code, including some SVG line graphing. The data is fixed RDF (read from xml). Next comes authentication so I can start adding new records in the field from my cell phone.
[link] 2006-01-29T17:04:41 SHDH 7 : Super Happy Dev House 7 report: I got started on gasuse and rearranged some things. Donovan helped me with a nested sequence in nevow. Nevow is hard because of all the things you can't see, but isn't omitting things you don't need to see the point of programming languages? Then I got distracted with Jesse's request for some demo tiles to ship with his scrolling map widget in dojo. I had recently made some renderings of the TIGER streetmap data, so I hacked that code some more to output tiles at multiple zooms. Then, to make our demo tiles somehow better than the tiles you get with gmaps, I added rendering of address numbers on the streets. My renderings still had various embarrassing artifacts, so I spent the rest of the night cleaning some of them up. I'm especially pleased with the results of the street name repeater code, which tries to write a street name label every 200 pixels. Text alignment still needs work; and we didn't get to try any street-smoothing algorithms. Meanwhile, David Weekly was jacking into ODB-II ports on people's cars to see what they would output, and I didn't even notice! I'd love to get that going on my Accord. Logs with accurate speed and timestamps would make great plots on my street maps.
[link] 2005-10-07T13:41:42 google reader vs bloglines: I'm a bloglines.com user, but I tried google.com/reader for 3 minutes. It doesn't seem to have anything interesting, at least not immediately after you import your subscriptions. I also see that google hasn't improved on the horrible 'keep unread' command that bloglines also has. GR has 'stars' and 'blog this' and 'labels' which I have not investigated. On bloglines, 'keep unread' is by far the cheapest way to say 'this article is notable and I want to reread it later or show it to someone else later'. Putting an article in clippings (and finding it later) is many times harder. But 'keep unread' sucks, because it makes the article indistinguishable from new articles. That property combined with the fact that, on a quick news scan, 'keep unread' is how I'm encouraged to mark the articles I especially like, means that the unread flag is being overloaded in a bad way. The only time 'keep unread' would mean what it says is when I accidentally load an article onto the screen but then somehow do not read it at all. Anything other condition means something like 'seen', 'read', 'viewed in the last session', 'would like to reread', etc. Possibly GR stars are a fix to this, but then there shouldn't be a per-article 'keep unread'. There should be viewer commands like 'undo last article view' or 'undo last session' which are more clearly to be used when articles were presented but the user didn't read them. Also, the GR status line says 'Could not find parameter "date" in map "entry-template". TypeError: a has no properties' :)
![]() | Unless otherwise noted, all content licensed by Drew Perttula under a Creative Commons License. |