A couple of months ago I discovered the joys of an Internet Explorer bug revolving around HTTP.. If a HTTP redirect is returned from a server but the Location: header is not in the same TCP packet, Internet Explorer would have some serious issues. This seems to affect MSIE6, MSIE7, & MSIE8. This suggests some poor separation of the network layers in Windows & IE, but it also highlighted the strangeness of SimpleHTTPServer's implementation, which is used by paste's default server.
Every time it sends a header, it flushes the buffer.. the end result is that you often get one TCP packet for each header, and then the data afterwards.. obviously this isn't the most efficient use of the network. Headers and data should be buffered before sending.
The solution was to switch to using FLUP & FastCGI for both the testing and production environments. We're using Nginx, and this combination proved very robust. Wireshark certainly showed much nicer results.
— by Robert Thomson, created 19th Dec, 2009, last modified 19th Dec, 2009 | Tags: Tech
I decided to splurge and purchase this baby: The AsRock ION 330 HT for all my media center needs.
People seem to have got it working fine with Linux, except for the remote control... but I'll look into that.
Now, all I need is a TV (or monitor), and a keyboard+mouse for it. Time to head to Saturn and start evaluating TV sets.
Update: It arrived today, and I didn't have a keyboard nor screen for it... I've now bought a decent Samsung monitor and a cheap microsoft wireless keyboard+mouse. The TV can come in a little while - too big a purchase to buy under pressure.
— by Robert Thomson, created 21st Nov, 2009, last modified 25th Nov, 2009 | Tags: Tech
WE DO! 8-)
Tonight we received two lovely leather sofas and a matching armchair.. and a dining room table..
Sophia's aunt & uncle bought some new sofas, and they asked if we wanted theirs.. Naturally, we replied with an emphatic "Yes!" We initially wanted to buy a Sofa-Bed, but we couldn't find one that we liked (for less than €800).. We looked in quite a few places.. so we started to look for normal Sofas that someone could sleep on. Yesterday, I suggested that we start considering second hand sofas, and today we get a phone call. :-)
So, we now have a complete set of loungeroom furniture, for just the cost of delivery. (And the cost of repairs to some plaster & paint, but that's a lot less than it would've cost to get the furniture, and now I can learn how to repair plaster damage! .. Yes, I'm an eternal optimist. :-)
— by Robert Thomson, created 6th Nov, 2009, last modified 6th Nov, 2009 | Tags: World
It's been almost two weeks since we moved into the apartment.. It's looking okay, but we still have unpacked boxes and bags full of clothes. We still need to buy some cupboards (and surface area) for the kitchen, a sofa, and a wardrobe for me.. some nicer ceiling lights would be good too. Once we have the sofa, we should be ready for visitors. :-)
— by Robert Thomson, created 3rd Nov, 2009, last modified 3rd Nov, 2009 | Tags: World
I finally have keys to put on my keyring again.. We just have to choose a moving company now.. hopefully in under 2 weeks we'll be in.
— by Robert Thomson, created 14th Oct, 2009, last modified 14th Oct, 2009 | Tags: World
This works, but is there a better way, like only modifying a Widget or a Field?
class TextCheckboxSelectMultiple(widgets.CheckboxSelectMultiple):
"""
Set checked values based on a comma separated list instead of a python list
"""
def render(self, name, value, **kwargs):
if isinstance(value, basestring):
value = value.split(",")
return super(TextCheckboxSelectMultiple, self).render(name, value, **kwargs)
class TextMultiField(forms.MultipleChoiceField):
"""
Work in conjunction with TextCheckboxSelectMultiple to store a
comma separated list of multiple choice values in a CharField/TextField
"""
widget = TextCheckboxSelectMultiple
def clean(self, value):
val = super(TextMultiField, self).clean(value)
return ",".join(val)
— by Rob, created 15th Sep, 2009, last modified 15th Sep, 2009 | 2 comments | Tags: Tech
We've been in Berlin for a little over a week now. We've mostly recovered from the sunburn we got in Taormina (it's all too easy to get sunburnt when you have clouds and a pool), and I'm almost recovered from the stresses of Etna. It was a fantastic experience though.
Right now, I'm trying to juggle work (finishing off projects from before the holiday) and apartment hunting. Oh yeah, Sophia got accepted into FU Berlin, the University she wanted to change to, so she's now in the progress of switching and she has to give notice on her apartment in Passau, and we have to arrange transport for her goods. I think it will be an expensive affair, this moving business. But I'm looking forward to having a Zuhause again. In every place that I've stayed since 2004, I've treated it as temporary lodgings, so I didn't really settle down.
I'm also deciding whether I want to find a proper job here and go mainstream, or continue contracting.. Or maybe both.. I think it will come down to a combination of money and life satisfaction in the end. I can afford to wait for the right opportunity, though.
— by Robert Thomson, created 11th Sep, 2009, last modified 11th Sep, 2009 | Tags: World
2. September
Catania's a nice city - a real city - not too much visible tourism. Still things to do and see, if you are willing to brave the heat. The hostel was quite good - simply a modified apartment run by an italian couple, but it was a good price, had working aircon, and for a reasonable fee we could make use of the kitchen for cooking.
We went to the Volcano, Etna, yesterday. Absolutely amazing. We went right to the top, and looked into the big crater. We had perfect weather and volcanic conditions. We could see a long way down, because the gases weren't too thick. Smelt awful though. The whole volcano was like a black desert. In some places, you'd sink 30cm or more into the "sand" when walking.
28. August
Syracuse good. Taormina touristy. We're in Catania since yesterday.
18. August
Bit of a gap in my writings, but here goes. Palermo was great, but we spent too long there, and/or didn't take advantage of the nearby opportunities there.
We found a nice cheap outdoor restaurant where we treated our taste buds to many sicilian specialties. We ate there almost daily, and said an almost teary goodbye to our regular waiter, Vincenzo, the day before we left.
The shopping opportunities are quite good there. There are some nice beaches just outside of Palermo, which we failed to visit.
Trapani was pleasant. We changed from our out of the way hostel to a hotel at the last minute, and from then on Trapani was great. We went to the small island of Levanzo first, lost the trail trying to find the main grotto there, so
backtracked and found our way to a smaller grotto, where we swam and took in some sun before heading to one of the very few local restaurants/bars, where we ate pizza before catching the ferry back.
The second day in Trapani we visited the hilltop city of Erice, and the ruins of the temple there, before returning to the city, catching the afternoon sun and watching the sunset with our plastic cups full of red wine, and finally a walk through the city in the evening.
Because Saturday, August 15. was a public holiday, we opted to take a train back to Palermo, and then down to Agrigento instead of taking the one and only bus in the evening.
Agrigento failed initially to make a good impression, largely to do with the public holiday and sunday, and the initially malfunctioning fan in the room (we had it replaced at 11pm when we couldn't sleep and I went to find the hostelkeeper with murderous thoughts, but he had a spare, lucky for him) Our local take away pizza store did make excellent pizza, though, so we enjoyed that the first night on a nearby bench overlooking the all-but deserted street and some trashcans. Luckily we were in good company. On Sunday we visited the Valley of the Temples, which was indeed impressive. Amazingly well preserved. A little warm, though, as most of this holiday has been so far. We went to the beach afterwards, but didn't want to swim or set foot on the sand until later in the day, so we walked for a bit, eventually settling for a little beachside cafe with umbrellas. They have chip-patties in Sicily. Oh how I've missed them.
The second day we wanted to visit "le scale dei turchi" (the turkish steps), and assumed it woud be an easy trip. After chilling in the morning, we caught a bus to Realmonte, then we walked for 1 hour in the midday-sun to the stairs, because the next bus was still 1.5 hours away and we were told it would take 30 minutes. There were no cafe's in-between to buy more water, but it was mostly downhill. We made it, drank lots of water, took some photos on the steps, waded in the ocean, and then decided we didn't have time to stay longer if we had to walk back too, so went on our way. 10 minutes out we asked a man on a motorbike if he knew the number for a taxi service. He told us there was no service because it's such a small town, but he called a friend of his with a car and negotiated a fee. 25 minutes later we were enjoying a beer at the caffé next to the bus stop, with 40 minutes to spare until the last bus back to Agrigento. The bus came late, and our taxi driver stopped on his motorbike to see if everything was ok, but we made it back ok. So - Agrigento is good for public transport to the temples, and ok to its beaches, but you want a car for anything else. A motorbike would be ok too, but don't expect to be able to hire one there.
Right now we're on a train to Catania, and we'll catch another train later to Syracuse. The hotel looks ok, but we'll see!
At the Hotel. It looks great! The aircon's on and we'll shower before taking off to explore the old city at night. I love places like this. New plan - if the hostels aren't significantly less than hotels, just stay at a hotel!
7. August
First day in Palermo was a success. It was a bit of a walk from the port to the hostel - different port than we thought. But we walked it anyway, getting directions from friendly natives.
— by Robert Thomson, created 2nd Sep, 2009, last modified 11th Sep, 2009 | Tags: World
6. August, 5.30am
The ferry from Sorrento to Naples was faaaast - on a hydrofoil - it only took 30 minutes, which was nice. But we ended up with 5 hours in Naples. It was better this time - different part of the city. We enjoyed a spicy pizza for lunch, visited an Internet cafe, and then a couple of cafe's before embarking the ship.
Dinner was funny. We pre-booked the cheapest dinner on the website along with our tickets (choices were none, a cheap pizza menu, or one of two expensive menu's), but we must have been the only people to have done that because nobody knew what to do. It involved a lot of running around and asking questions and a special exception for us. Tutto casino, tutto normale. Next time we'll know that we don't need to pre-order.
I slept well for a while tonight, but Sophia not so well. We'll get ready now, and we'll go to watch the ship come into port in a few. Must do washing soon. But otherwise we'll just spend the day in Palermo.
4. August
We went to the island of Capri today. Wow - stunning - I only wish I had enough money to afford more than one cup of coffee per day there though! The boat trip was quite nice, but I prefer larger boats against potential sea sickness. We walked up to Capri city from Marina Picola, where we arrived, and spent some time getting our bearings. We then found a cafe out of the main tourist zone (hoping it would be affordable - alas not - €3 for an espresso, when we got the bill) and a supermarket (normal prices, mostly). We wandered up a hill hoping to hit Salto di Tiberio, where Tiberius apparently threw his (usually very young) ex's off the cliff. We didn't find it, but we did find the Belvedere, which was breathtaking. The blue waters near the island make for great photos (forthcoming). Afterwards we spent a while at the beach near the port. Rocks instead of sand, but great, and a very picturesque backdrop. We saw a few grottos from the boat, but we didn't go into any (and the blue grotto was closed to boats because of choppy waters, but a few people swam in, some sustaining a few scratches). A great day. Tomorrow, we have to go to Naples (by ferry hopefully), then from there to Palermo.
3. August
Third day involved a trip to Amalfi. 2hr bus trip, although it's only 30km away, it was a little hellish with the inadequate aircon. Hot air blowing on our heads - yet better than no aircon. And those mountainous corners! Italians beep before going around a blind corner, and don't slow down very much at all. Can't imagine the number of accidents there are, even for Italian trained drivers. Amalfi itself is small and pretty. The history is more interesting than the tourist city it has become. But we found a small normal priced pizzeria to enjoy a lunchtime snack. We're catching a boat back to Sorrento in a few minutes. Should be faster and more comfortable thana return bus trip. And we'll see the coastline better.
End of the day. Ok - forget the bus. If you go, pay extra for a ferry bothways. Preferably one or both ways slow. It takes about 2 hours on a slow ferry, but the coastline is magnificent. We had deck chairs undercover but in the open facing the coast. Amazing. We even dozed off for a while. I think we'll opt for a ferry to Naples port instead of catching the train on Wednesday too. That way we'll also skip the dreck of the city and have no hassles finding the port there.
2. August
Travel from Perugia to Naples was nightmarish. We arrived too late for our next connection.. But it too was late.. So we ran to catch it, but had no water. We waited for 30 minutes in an overcrowded entrance while the sign always said 5 minutes until departure. Italian trains leave much to be desired. Berlusconi is no Mussolini. From Naples to Sorrento was no problem, just on a very slow local train. We failed to find the bus stop taking us to our hostel though. So we caught a taxi for €20.
We stayed in Sorrento the first day, and we quite like it. Beautiful coastline, and obviously benifiting from the tourist industry. But the local supermarket we found was better and cheaper than the small one in Perugia's center. Can't wait for Germany again. We did a lot of walking, bought a travel chess/backgammon set, and found a small shop selling cheap beer by a park before returning to our campsite and cooking dinner - a great first day of the holiday.
Our second day was less thrilling, however. Too hot, and we went to see Herculaneum, then Naples. Too hot for Herculaneum, but very interesting. Naples is north africa, though, and I'm not referring to the street vendors. Beautiful old buildings, but the poverty shines through. Cheap clothes shopping on Corso Umberto 1 though.
— by Robert Thomson, created 6th Aug, 2009, last modified 11th Sep, 2009 | Tags: World
We're leaving now. Wish you all the best! Take care! See you in a month. You can contact me on my Italian number if you have to (See Contact Details).
Ciao!
— by Robert Thomson, created 31st Jul, 2009, last modified 31st Jul, 2009 | Tags: World
class RedirectModel(grok.Model):
"""
RedirectModel + RedirectView allow us to do redirects from Traverser's easily
"""
def __init__(self, request, url):
request.setTraversalStack(['@@index'])
self.redirecturl = url
class RedirectView(grok.View):
grok.context(RedirectModel)
grok.name('index')
def update(self):
self.redirect(self.context.redirecturl)
def render(self):
pass
Then from your Traverser's traverse():
return RedirectModel(self.request, "/newURL/")
— by Robert Thomson, created 29th Jul, 2009, last modified 29th Jul, 2009 | Tags: Tech
On Friday, we hand over the keys to the apartment and embark on our trip down south. We will first go to Sorrento, where we will stay for a few days, exploring it and nearby places such as Capri and Naples.
We will then catch a ferry to Palermo, and travel counter-clockwise around the island. At the start of September, we will eventually fly to Berlin. No doubt somewhat exhausted and tanned. :-P
During this time, I won't have computer or regular Internet access, so excuse the lack of response!
— by Robert Thomson, created 28th Jul, 2009, last modified 28th Jul, 2009 | Tags: World
The Problem: MSSQL database with "LATIN1" (case-sensitive) encoding, SQLAlchemy and PyMSSQL. Fields with non-ascii characters were sometimes being returned double encoded.. The actual case is that SQLAlchemy passes parameters to the DBAPI as however you pass them to SQLAlchemy.. the convert_unicode option doesn't seem to change the encoding of unicode parameters when saving, only the SQL string.. which seems kind of inconsistent. I'm actually not 100% certain of the interactions here, and who is to blame - PyMSSQL or SQLAlchemy - but let's split the difference and blame Microsoft, they're always a good target.
The Solution: A custom type:
class EncodedString(types.TypeDecorator):
impl = types.String
def process_bind_param(self, value, dialect):
if type(value) == unicode:
return value.encode(dialect.encoding, 'replace')
return value
def process_result_value(self, value, dialect):
if value and type(value) == str:
return value.decode(dialect.encoding)
return value
and instead of defining a Column with types.String or types.Unicode, use EncodedString.
It looks like types.Unicode should do exactly this, but for some reason it's not working for me.
— by Robert Thomson, created 16th Jul, 2009, last modified 16th Jul, 2009 | Tags: Tech
It's possible via a slightly non-standard method to have offline web apps on the Maemo platform. Tear is a webkit based browser, and when using a recent webkit (more info here) you have access to the local storage facilities as specified in HTML5. The problem is that full AppCache functionality doesn't exist/work yet..
However, you can host your apps locally on your maemo device, and by setting "document.domain = your.domain" in javascript, you can use the security context of the remote domain when making requests.. When you're offline, you just return information from the local data stores, but when you're online, you can get new information easily. Neat, eh?
Still, I'm looking forward to AppCache support so I don't have to save pages locally.
— by Robert Thomson, created 10th Jul, 2009, last modified 10th Jul, 2009 | 1 comment | Tags: Tech
LinuxTAG was interesting.. I got a better grasp of the Linux and Open Source crowd in Berlin (and in Germany in general). I think my geek-side will be satisfied there. I've decided to check out Sugar-on-a-stick after chatting to them there (and pointed one of the developers in the direction of Numptyphysics, which just may appear as a Sugar package at some point). I'm looking forward to settling down in a proper apartment again, and setting up a media center for myself - A nice ATOM dual core + NVidia (ION) server combination (TEO-X had one there) should provide all the power that I need (with lower power consumption) for XBMC & a retro (& not so retro) gaming setup. :-)
Also interesting was Büro 2.0, which involves a shared workspace and services for Open Source companies and freelancers in Berlin. If I decide to be a freelancer there, this might be an option.
— by Robert Thomson, created 30th Jun, 2009, last modified 7th Jul, 2009 | Tags: Tech, World
This Italian weather is killing us. We're about to step out the door and head to the mild temperature in Berlin for a week. We're taking our big suitcases, and we'll leave them there, because we will be travelling around Italy in August and we can't take so much with us. And I'm taking my laptop, since I want to work from Berlin. I plan to visit LinuxTAG during the week too.
— by Robert Thomson, created 20th Jun, 2009, last modified 20th Jun, 2009 | Tags: World
Announcing Seantis Questionnaire, a Django Questionnaire/Survey application that I developed for Seantis GmbH in Switzerland.
Features
- Multiple Questionnaires, multiple pages (QuestionSets) per questionnaire, multiple runs of same questionnaire per subject (eg. for annual surveys)
- Multilingual using the django transmeta application.
- Questions (ie. 6) & SubQuestions (ie. 6a), with appropriate layout tweaks.
- Email Invitations (direct URL to Questionnaire)
- Does _not_ require Django’s authentication system to answer questionnaires
- CSV export of answers.
- Complex dependencies utilising a full Boolean Expression Parser, and Javascript support. eg. (6a=yes and 6b=yes) OR 5=no
- Built-in Question types including:
- Open (single line), Open (text area)
- Yes/No, Yes/No/Dont Know, Yes/No/Comment
- Single Choice, Single Choice + Freeform Option
- Multiple Choice, Multiple Choice + Freeform Option(s)
- Number Range
- Time Period
- Easily extensible question types (Question Processor + Template, and Answer Processor)
- Django Signals on completion of QuestionSets and Questionnaires
- Javascript to hide irrelevant questions (works fine without Javascript too) and disable irrelevant form fields.
Talk to Seantis GmbH about custom development.
Download Seantis Questionnaire from GitHub. It is released under the same license as Django itself.
— by Robert Thomson, created 15th Jun, 2009, last modified 18th Jun, 2009 | Tags: Tech
Zope 3's Pluggable Authentication Utility doesn't automatically store a cookie saying that you're logged in if you've been authenticated once. Instead, it uses credentials and authentication plugins. For each credentials plugin, it passes the credential's output to each of the authentication plugins, and if any succeed, then it returns a Principal. It sounds logical enough, except that it does that every time, instead of storing a variable in my session stating that I'm already authenticated. Since I'll be authenticating against an external system, I didn't like the idea of checking the password on every request.. It wasn't immediately obvious to me how I could simply achieve this within the Pluggable Authentication framework, and I wasn't sure I needed the power of it anyway, so I decided to create my own IAuthentication implementation, and forget about the PAU altogether.
What it does
This implementation stores all the IPrincipal information (id, name, and description) as a signed cookie in the user's browser. By default, the session will expire after 6 hours of non-use, and the cookie's timestamp will be updated every 5 minutes with a new timestamp.
The Code
The signed string code is located in securestring.py, and the authentication code in auth.py. You also need to implement the authentication in your login form, and add it as a local utility to your application/site.
securestring.py
# coding: utf-8
import md5, random
SECRET='SomeRandomStringThatYouShouldNotShare' # CHANGE THIS
def make_sstring(question, string, r = None):
if r is None:
r = ''.join([random.choice('1234567890abcdef') for x in '12345678'])
m = md5.md5(SECRET + question + ":" + string + r)
return "%s|%s|%s" % (string, r, m.hexdigest())
def get_sstring(question, securestring):
string, r, md5 = securestring.split('|',2)
if make_sstring(question, string, r) == securestring:
return string
return False
auth.py
# coding: utf-8
from zope.app.security.interfaces import IAuthentication, IUnauthenticatedPrincipal, PrincipalLookupError, IPrincipal, ILogout
from zope import interface, schema, security
from securestring import make_sstring, get_sstring
from zope.app.component import hooks
from zope.traversing.browser.absoluteurl import absoluteURL
import time
from urllib import urlencode
class Principal(object):
interface.implements(IPrincipal)
def __init__(self, id, title, description):
self.id = id
self.title = title
self.description = description
def __str__(self):
return "<Principal: %s>" % self.title
def make_authenticated(request, principal):
id = principal.id
title = (principal.title or '').replace("::","..")
description = (principal.description or '').replace("::","..")
tm = int(time.time())
sstring = "%d::%s::%s::%s" % (tm, id, title, description)
sstring = make_sstring('z3c_sstring_login', sstring)
request.response.setCookie('z3c_sstring_login', sstring, path="/")
return principal
class SStringAuthenticator(object):
interface.implements(IAuthentication, ILogout)
loginpagename = 'login'
timeout_in_seconds = 60*60*6 # 6 hours
update_timeout = 60*5 # how often to update the cookie
def logout(self, request):
request.response.expireCookie('z3c_sstring_login', path="/")
def authenticate(self, request):
sstring = request.cookies.get('z3c_sstring_login', None)
if sstring is None:
return None
sstring = get_sstring('z3c_sstring_login', sstring)
if not sstring:
return None
try:
tm, id, title, description = sstring.split('::',3)
tm = int(tm)
now = int(time.time())
if (now - tm) < self.timeout_in_seconds:
principal = Principal(id, title, description)
if (now-tm) > self.update_timeout:
make_authenticated(request, principal)
return principal
except:
pass
def unauthenticatedPrincipal(self):
# not really sure what to do here, but it doesnt seem to hurt
return None
def unauthorized(self, id, request):
site = hooks.getSite()
stack = request.getTraversalStack()
stack.reverse()
query = request.get('QUERY_STRING')
camefrom = '/'.join([request.getURL(path_only=True)] + stack)
if query:
camefrom = camefrom + '?' + query
url = '%s/@@%s?%s' % (absoluteURL(site, request),
self.loginpagename,
urlencode({'camefrom': camefrom}))
request.response.redirect(url)
def getPrincipal(self, id):
principal = Principal(id, id, id)
interface.directlyProvides(principal, IUnauthenticatedPrincipal)
return principal
Install it as a local utility
In your application, you can add it as a local utility. Since I'm using Grok, I'll give a Grok example:
class MyApp(grok.Application)
grok.local_utility(SStringAuthenticator, provides=IAuthentication)
You could of course also provide a setup function, to modify the string.
Local Utilities will only appear on NEW objects, so your existing applications/sites won't make use of it.
Authenticate from your login form
I wasn't sure the best way to do the actual authentication here, so I thought I'd just leave it up to the login form. If successful, the login form should just call auth.make_authenticated(request, principal) where Principal is an instance of an IPrincipal (you can use auth.Principal if you like, but there's no doubt a better way).
The Alternative using Pluggable Auth
I realised afterwards that it would be possible to do the same thing within the pluggable auth framework. You could do it almost exactly the same way, except that the credentials plugin should just return the cookie if it's set (credentials just returns a dict, so you're not limited to just a login/password), and the authentication plugin can just check if it's valid. The credentials plugin can still redirect unauthorized users to a login page. http://grok.zope.org/documentation/how-to/authentication-with-grok should be able to give you an idea about how to implement Pluggable Authentication.
— by Robert Thomson, created 9th Jun, 2009, last modified 18th Jun, 2009 | Tags: Tech
My Xen server is now IPv6 enabled, and I have 4bn or so routable IPs. Yay!
And with a little bit of playing, I have IPv6 over the openvpn connection to my laptop, so now I have my very own public IPv6 network at home. And of course, yay for ip6tables!
— by Robert Thomson, created 22nd May, 2009, last modified 22nd May, 2009 | Tags: Tech
I got busy with work just after the N810 arrived, but nevertheless I’ve enjoyed having it and I find it quite a cool gadget. It’s screen is readable in all but direct sunlight, which helps to make it a great device when traveling. I found myself using it mostly as an E-Book reader when on the road, and loving Project Gutenberg and the Baen Library. I still have quite a few application ideas for it – largely revolving around making online content easily searchable and then available offline (eg. train timetable searches, hostel/hotel contact information & reviews).
As a side note, I suspect that the next device I buy will come with a PixelQi screen for it’s easy readability, low power, and versatility, but it will still be a few months until the first commercial device using it makes it to market.
I’ve developed a reasonably complex Django application for questionnaires/surveys for a medical study, which I hope to release publically in the near future, after the internal project is released. We’re still working on a name, as django-questionnaire and django-survey are both taken.
— by Robert Thomson, created 11th May, 2009, last modified 11th May, 2009 | Tags: Tech, World
I received my N810 about 3 weeks ago, and despite the fact it says "N00" instead of "N810" on the front (N00 is the normal number for prototype models from Nokia, but its internal labeling and hardware specs are that of a N810), I am quite taken with it. Surprisingly, I use it mostly as an Ebook reader (it turns out that I really enjoy reading, I just hate carrying books around). As far as Internet goes, I mostly use the weather widget, and receive email updates on it too. Maemo Mapper is quite good to have around also, when one gets lost in a city.. but the GPS doesn't work that well. One of my primary reasons for geting the device itself was that I wanted something that I could hack on and program for easily.. it certainly fits the bill. Some of the standard software release's libraries are a little old, but they're easy enough to update. Python works fine, but I'm partial to using Vala for efficiency. All I need now is a good phone and data plan to go along with it.. but I think that will have to wait until I'm settled in Germany.
On the work front, I've found some programming work with a small Swiss company. I'm currently in Luzern, enjoying the weather and the lovely water views. I miss having the water nearby.. I'm doing some Django and Zope work, and will continue working from home from next week. Sophia's coming up on Thursday and we'll meet some friends in Switzerland and see some of the sights.
— by Robert Thomson, created 7th Apr, 2009, last modified 7th Apr, 2009 | Tags: Tech
Yesterday I placed an order for the N810 Internet tablet. They've been talking about a successor to the N810 for months now (RX-51 / N900), but frankly, the N810 will probably suffice for years whether or not a new (and more expensive) model appears in the next few months.
— by Robert Thomson, created 13th Mar, 2009, last modified 13th Mar, 2009 | Tags: Tech
I’ve been playing around with Parrot again lately, since it’s approaching a 1.0 release. I’m going through the tutorials for the Parrot Compiler Toolkit, and I’m quite impressed. Sure, I keep shooting myself in the foot since I don’t understand how everything interacts yet, but it does work. I like it because it makes it easy to figure out what’s really going on and how the conversion processes work, and it seems to be reasonably well documented.
One of my longer term goals is to have a suitable nice language for MUD world programming (which assumes that the programmers can’t be trusted), and I think I’d like to modify an existing language to fulfill the requirements. Of course, having almost no idea about compiler design seriously limits how much I can tweak without wreaking havoc.
— by Robert Thomson, created 10th Mar, 2009, last modified 10th Mar, 2009 | Tags: Tech
From the website: “Scala is a general purpose programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages. It is also fully interoperable with Java.”
I quite like it.. I’ve never been a fan of Java, but I have been of good VMs and their well tested highly tuned libraries. Java and the CLR being the two common ones these days. I did briefly look at the website a few months ago, but disregarded it because the funny syntax didn’t appeal to me at the time.. I shouldn’t have. I recommend the book “Programming in Scala” (available as an PDF download from the publisher Artima or from a bookshop near you) in preference to the online tutorials and documentation that exist today.
Of course, given my tendency to get bored easily, I could be learning another language next week. :-)
— by Robert Thomson, created 17th Jan, 2009, last modified 19th Jun, 2009 | Tags: Tech