I've just finished upgrading my image gallery to Gallery 2. Please let me know if you run into any problems.
Posts from January 2006
Get Opera Mini
Today, Opera Software unleashed Opera Mini on the World. Unlike the Opera releases I usually talk about here, Opera Mini is for devices such as mobile phones, PDAs, or just about anything with Internet access and Java. Most device browsers have to be tailor made for each device. Opera Mini just works. In fact, it usually works better than the browsers tailor made for the device. And it's free!
Looking up phone numbers, addresses, movie times, or flight information is now just as easy as pulling your phone out of your pocket. Check your e-mail while you're in an elevator. Get the weather forecast from your toilet. Read the newspaper on the subway without needing the newspaper! It's all possible with Opera Mini. Get it now.
Access Denied
Apparently my site has been denying access to everyone since about 9:30pm Saturday night completely unbeknowst to me. I don't really know what happened, but this certainly wasn't on purpose. Sorry. Everything should be up and working again now. Please let me know if that isn't the case.
Acid2 - SGML comments begone!
The most frequent criticism I've seen about the Acid2 test is the inclusion of SGML comments. Thankfully, the test author has taken the criticism to heart and removed the SGML comment requirement from the Acid2 test in favor of the Web Apps 1.0 comment spec.. If you take a look at the test source now, the old SGML comment test has been changed to:
<div class="parser"><!-- ->ERROR<!- --></div></div> <!-- two dashes is what delimits a comment, so the text "->ERROR<!-" earlier on this line is actually part of a comment -->
We were wary of fixing our SGML comment parsing problems in the first place, so this is a positive change in the test. It looks like we have just one more bug to fix before we pass the Acid2 test, though there's still one more update to do about changes already visible in Opera 9.0 Preview 1, so stay tuned for further updates.
Great Opera fan sites
Sometimes in the late evening, when I'm just not tired enough for sleep or awake enough to code or write, I'll browser around for news about Opera from fan sites. That may sound a bit silly, as surely an employee would know what's going on with Opera. Yes, I know what's going on internally, but I can't always keep track of what's going on externally. Sometimes it nice to know that some news is finally public or which rumors are spreading now. Reading rumors is probably one of my favorite pastimes. I thank y'all rumor spreaders for the entertainment.
My Opera news search usually takes me to three sites:
- Avencius, an Opera news and commentary site (with occasional relevant posts about competitors) running Drupal(!).
- Planet Opera, an aggregator feeding off 50+ newsfeeds from Opera fan sites. If there's Opera news, you'll read it there.
- Opera Watch, the one-stop shop for Opera rumors.
Where do you get your Opera news?
And since we're on the topic of Opera, Avencius highlighted the Why Opera blog, a great blog overflowing with Opera graphical goodness from suggestions for a new Opera icon to great wallpapers to graphics to stick on your site or in your forum signature. Get into the graphical goodness!
And let us not forget literarymoose.info (RIP), the CSS experiment and Opera customization site. If you haven't heard, Moose has moved his site to lofotenmoose.info and has started posting again. Don't walk, run there and get Moosified!
A Day at the Office (Part 2: The Office)
Part 2 in a series. See also A Day at the Office (Part 1: History).
Opera Software has offices all around the world. Our headquarters is in Oslo, Norway, where work began on Opera ten years ago. Since then, we've opened offices in Linköping, Sweden; Göteburg, Sweden; Tokyo, Japan; San Diego, California, USA; and Beijing, China. The Oslo office, home to over two-thirds of our employees, remains the hub of Opera development.
The Opera Software headquarters is located in a group of non-descript office buildings a bit north of downtown Oslo. We take up large parts of the fourth and fifth floor of our five-story buildings. Incidentally, Trolltech, a significant contributor to KHTHL, shares some of the fourth floor with us (some of us used to say that 50% of the popular rendering engines (Presto and KHTML, leaving out Trident and Gecko) in the world were made in our building), but I digress. The trip up to our floors used to be via a great old elevator (made by "Stahl", no less), but alas it was recently replaced.
The headquarters is spread out across several connected office buildings. From Reception, the offices spread out like spider legs. Directly ahead after entering the front door are offices for our Executives and Human Resources, along with a door to the Sales hallway. To the left is a spiraling staircase down to Marketing, Information Systems, and System Administration. Just beyond the door is a short hallway to Accounting. To the right of the front door is a hallway leading around to the Canteen. Through the Canteen are the Development offices, where Engineering and Quality Assurance turn out release after release.
The walls in Reception are covered by years of awards and articles about Opera. Around the corner toward the Canteen are three clocks representing Opera, Netscape, and Internet Explorer. Opera is ahead of the times, of course. Also in Reception, are letters from users wishing Jon luck on his swim across the Atlantic, as well as the registration fee for a user who didn't give any return address or contact information.
Since I started working for Opera, we've more than doubled in size. Consequently, I've moved offices at least four times. As more and more employees join our ranks, we take over more of our buildings and shuffle people around so departments stay together. At least I never get tired of my office space.
Most development offices sport posters for random Norwegian operas, marker boards, and dying plants. There are usually a couple employees per office, though some large offices have half a dozen or more. All offices have windows, about half with a good view of the city. The furniture is almost entirely from Ikea. The walls are white and the offices usually have windows out into the hallway. It's very light and airy, making it easy to relax and work.
Smack in the middle of the upstairs Development hall is the Pillar of Prefs. After the release of Opera 7, one of the Core QA superstars wanted to show just how complicated the preferences for Opera were, so he plastered screenshots of every part of the preferences dialog over a column in the middle of the Development hall. Each day, most of the Development team walks past the pillar. The Pillar is currently covered with the Opera 8 preferences.
Between 11:30am and 1:00pm, we all pack into the Canteen for lunch. Three times a week, we have warm meals of waffles, spaghetti, chicken and rice, etc. There's also plenty of salad supplies and lunch meats. From the Canteen, you can access the veranda, which wraps around the fifth floor of one of our buildings. During the Summer, many of us sit outside during lunch to soak up some rays. The veranda has a great view of the city too. Every other month or so, a couple employees will make everyone lunch from their country. Jon von Tetzchner (you know, the CEO) even made us an authentic Icelandic Christmas meal last December.
One of the great things about working at Opera is the diversity of the employees. For instance, I share an office with a Norwegian and an Englishman (I keep waiting for someone to come up with a joke about us: "A Norwegian, an Englishman, and an American walk into a..."). I probably never would have met such a diverse group of people if it weren't for Opera. I've learned about last name customs in Spain (children take both their mother and father's last name), chatted with sauna loving Finns, and continually joke with my British friends about the differences between British English and American English (aerials vs. antennas, hosepipes vs. hoses, lifts vs. elevators, etc.).
That about wraps up our trip around the offices. We're expanding again this Winter and redesigning our Canteen, but we're used to changes in the offices about as often as we have Desktop releases, so it's nothing new.
The War on Spam
About two months ago, I installed Bad Behavior for Drupal to ward of some of the spam that was plaguing my site. I had previously installed spam.module to hide spam when it was posted. Bad Behavior tries to prevent spam from being posted at all. I can tell you that Bad Behavior has greatly reduced the amount of spam posted to my site, but not without costly side-effects.
A couple weeks after I installed Bad Behavior, I got an e-mail from an Opera user that was having problems accessing my site. He was getting HTTP 412 errors when browsing to the site and was also having problems with my RSS feed. I looked into it and found that Bad Behavior was blocking him because it was expecting an HTTP header that wasn't present in his page request. We never found the root of the problem, but it definitely seemed like it was out of his control.
At the time, I decided that a user here or there that couldn't access my site was an acceptable causality of my personal war on spam. Here's what I told him:
The war on spam is a balance of inconvenience. I have information I want to present to others. Others want that information. Still others are trying to feed off our desire to spread information. Some might say it's my responsibility to keep my site clear of such rubbish. To do so, I must make hard decisions based on time (cleaning up spam), money (increased hosting costs becwause of bots trawling my site), and the quality of my site (if spam is visible and for how long). Weighing these factors, I decided to install Bad Behavior. I've already seen a drop in spam, so it's paid off. Additionally, you're the first one that's complained. I'd rather deal with complaints one-by-one and try to improve Bad Behavior than deal with spam as I was before.
That might sound a bit high and mighty, but it's how I felt at the time.
I've since periodically browsed my Bad Behavior logs and found a lot of requests from spam bots, but also a lot of requests that looked pretty innocent. When I came across a post in the Opera forums about problems accessing my site this morning, I decided it was time for a change. A couple days ago, I installed comment_closer.module, which closes old comments after a specified period of time. That should help cut down on spam. As of this posting, I've disabled Bad Behavior, so no one should have problems accessing my site now. I decided there are too many legitimate requests being blocked.
Spam on my site is the same as unsolicited phone calls or mail: it's a pain to put up with, but we do it because we want the legitimate phone calls and mail. I want people to have access to the information here and that's more valuable to me than dealing with the current load of spam. I'll see how it goes without Bad Behavior for a bit. Hopefully I won't need to do anything else just yet.
To anyone that has had problems accessing my site over the past two months: I'm sorry, that was never my intention. And welcome back!
Gmail Rich Text Editing Toolbar (Updated!)
If you use Gmail in Opera 9.0 Preview 1, you've probably noticed that the rich text editing toolbar isn't formatted as it is in other browsers:

Gmail in Opera 9.0 Preview 1

Gmail in Mozilla 1.8
Instead of all the buttons being on one line, they're bunched together on the left. This is caused by legacy CSS styling on the toolbar.
In CSS1, multiple TABLEs could be displayed on the same line by setting display: inline on the TABLE element. In CSS2.1, this is done using display: inline-table (test case 1, test case 2). If you take the time to wade through the Gmail source code, you'll find that the rich text editing toolbar in Gmail is made via the following function:
function uG(a) {
var b = "<table cellpadding=0 cellspacing=0 unselectable=on class=tbr><tr>";
var c = [b];
var d = 0;
var e = B ? "tbb2" : "tbb";
for (var f=0; f < us.length; f++) {
var g = us[f];
var h = g[0];
if (h == "|") {
c[c.length] = '</table><span class="sv"></span>'+b;
d++;
}
else{
c[c.length] = "<td><div class="+e+' id="'+La+h+"_"+a+'" unselectable=on ondragstart="return false">'+'<img src="'+qN+'" style="margin-left:-'+(f-d)*18+'px" '+'title="'+g[1]+'"></div></td>'
}
}
c[c.length] = "</table>";
c[c.length] = wG(a);
return c.join("")
}
Once that function is run, we end up with the following pseudo-code:
<table class="tbr">
<tr>
<td>
<div>
<img>
</div>
</td>
</tr>
</table>
<span></span>
The toolbar is made of five such TABLEs in total, which causes the five rows of buttons seen in Opera. The .tbr CSS rule is as follows: .tbr {display:inline;-moz-user-select:none}. As you can see, they specify display: inline;, which won't have the desired effect in a CSS2.1 compliant browser, such as Opera.
The "« Plain text" link at the end of the toolbar isn't included in the code above. Here's the relevant code for it:
function XA (a, b) {
var c = a.e() ? uG (a.id) + " " : "";
var d =
var d = "<tr><td><td" + (Gf ? " colspan=2>" : ">") + '<div class="' + "tbo" + '" unselectable=on>' + '<table cellpadding=0 cellspacing=0 style="float:right"><tr>' + '<td style="text-align:right;' + "padding: " + (a.e() ? "5" : "0") + "px 8px 0 8px;" + '-moz-user-select:none;white-space:nowrap"' + " unselectable=on>" + ("<span class=sl" + (B ? ' style="font-size:90%"' : "") + ' id="' + "spck_" + a.id + '">' + Kv(b, a.id) + "</span>" + "<span id=" + "cspd_" + a.id + ' style="display:none"> - ' + '<span class="' + "lk" + " " + "sl" + (B ? '" style="font-size:90%' : "") + '" id="' + "cspck" + '">' + "Done" + "</span></span>") + "</table>" + " " + c + (Es() ? ' <table cellpadding=0 cellspacing=0 style="display:inline"><tr><td style="vertical-align:middle;" id=ht_' + a.id + ' class="' + "lk" + '"><span style="font-size:' + (B ? "90" : "100") + '%">' + jB(a) + "</span></table>" : "") + "</div>";
return d;
}
function jB(a) {
if (a.e()) {
;
return "« Plain text";
}
else {
;
return "Rich formatting »"
}
}
That basically boils down to the following:
<div class="tbo">
<table>
<tr>
<td>
</td>
</tr>
</table>
<table style="display: inline;">
<tr>
<td>
« Plain text
</td>
</tr>
</table>
</div>
The .tbo class on the DIV is as follows .tbo {width:100%;background: /* some JS variable */ ;padding-top:2px;-moz-user-select:none}. Since the DIV also contains the problematic toolbar TABLEs mentioned above, we can solve both issues by using the following style override on .tbo: .tbo > table { display: inline-table !important; }.
In Opera 9.0 Preview 2, users will be able to use site-specific CSS rules to override .tbo and fix this problem themselves. Meanwhile, in Opera 9.0 Preview 1, adding the above override to your user CSS will solve the problem. Someone can probably come up with a pretty simple user JS script to fix this in Opera 9.0 Preview 1, too.
Since Internet Explorer and Mozilla don't support inline-table, Google can theoretically solve this issue by changing the .tbr rule to .tbr {display:inline;display:inline-table;-moz-user-select:none}. Thanks to the error-handling rules in CSS, browsers that don't support display: inline-table; will ignore it, leaving them with the CSS1 display: inline rule to style the TABLEs (test case 3). They'll also need to override the inline CSS rule used for the "« Plain text" link.
But wait, there's more! That fix won't work in IE because it tries to do something with display: inline-table even though it doesn't support it. There are plenty of IE CSS hacks that can be used to get around this problem, so I hope it won't stop Google from fixing their error. We've contacted them and asked them to do so, but haven't seen results yet.
Update: I got an e-mail from a CSS Working Group member stating that the handling of display: inline for TABLE will change in the next public CSS2.1 draft. When display: inline is used on a TABLE, an anonymous table element will be created and set to display: inline-table. Assuming this change makes it into the next public draft, we'll update our rendering engine to conform and this issue will go away without Gmail needing to change anything.
I want to stress that Opera is following the current public draft, so this isn't an error in our implementation. I guess this is one of the problems when implementing working drafts.
Fear of Flying
I don't fly well. I know at least part of it is due to motion sickness, but I don't think that's all of it. I think airplanes are perfectly safe. I've flown enough to be comfortable with the various noises and idiosyncracies of everything from seventeen-seat propeller planes to 747 jumbo jets. I know for a fact that there are fewer deaths and injuries per passenger in airplane-related accidents than car accidents (at least, I'm pretty sure I remember hearing this somewhere).
I also know that flying is a necessary evil. If I want to go home, I'm on planes for about ten hours. On our honeymoon, we flew from Maryland to Oklahoma to Florida and back to Maryland. I have something like 20,000 frequent flyer miles with British Airways alone. Still, all that flying hasn't made it any easier.
It's not really the take-offs or the cruising that does it, either. Sure, if there's a lot of turbulence, it's no good. However, after lift-off, planes usually break through clouds quickly and only experience turbulence for a short time, if any. Once the plane reaches cruising altitude, there isn't much turbulence until the descent.
Then, once I've been doing pretty well for the entire journey, the descent begins. And that's what usually does me in. As we slowly passes through layer upon layer of clouds, the entire plane shakes and I feel like I left my stomach a couple hundred feet above us. I break out in sweat and my body can't decide whether it's hot or cold. My mouth gets dry and my hands start getting numb. I cram starlight mints into my mouth, in an uphill battle against nausea. All I want is to be on the ground and off the plane.
The weird thing is, these feelings often aren't accompanied by nausea. Maybe it's the starlight mints or maybe it's not motion sickness at all: it could be fear. I don't consciously fear crashing during a landing and I don't recall feeling anxious about it (other than being anxious about getting sick). Whatever the case, I just want it to end.
If I'm lucky, we land quickly and everything goes back to normal by the time I'm off the plane. If I'm unlucky, we circle the airport for what seems like hours on end. Or, we land, but we don't pull up to the gate. Or, I'm at the back of the plane and these people can't understand that I have to get off!
I've tried all kinds of things to ease my journeys. Starlight mints (white cirles with red lines coming out from the middle) usually help a bit with nausea. I'll take Dramamine if we're on a long trip. That stuff messes me up. I'm completely useless. I have some wrist bands that are supposed to help by stimulating pressure points. I've tried some sort of patch, but I think it had did something weird to my eyesight.
If things get really bad, I try to find ways to keep my mind busy. On a recent trip, I started counting in Norwegian (which I was just learning at the time). On another trip, I did multiplication tables in my head. I'll do pretty much anything to keep my mind occupied and away from the idea that I'm going to be sick. Just don't make me talk. Opening my mouth is usually the last thing I want to do.
Rebekah and I are taking a trip back to the US at the beginning of March. This will be our first plane trip with Sara Ellen, so we're a bit concerned. We know how everyone complains about crying babies on planes and we hope we won't have one. Personally, I hope she didn't inherit my problems with motion sickness. Both my parents suffer from it, so I have a feeling it could be hereditary. And I also hope that I don't get sick. Then poor Rebekah would have to put up with a crying baby and a sick husband. Bless her heart.
I look forward to the day we all use teleporters. When I was in elementary school, I had plans to build a teleporter and be the champion of travelers everywhere. That hasn't quite worked out yet, but who knows where my life will go in the next fifty or so years. Don't hold your breath, though.


