Onno.Com is 15 years old!

Mar 15, 2012 in Life

wpid-welcome-onno-com-2012-03-15-16-25.pngWe’re well in our teenager years!

I claimed the domain on March 3, 1997. The first web pages went up a few days later.

In the beginning I had a specific need for the web site. Locating it at onno.com was pleasing to the ego. But back to the purpose. In early January of ’97 I relocated to the US from England to work for Apple in Cupertino, CA. My new role was Product Marketing Manager for OpenDoc – a technology for developer to build their application from smaller pieces that could be mixed and matched depending on the user’s needs. Just around that time Apple had acquired Next (or as the inside joke went, Next acquired Apple). Quite soon after getting off the plane and inhabiting my new office on the 4th floor with a lovely view of the Mount Hamilton range two things were obvious:

–        a substantial re-org and layoff was just weeks away, and

–        OpenDoc was not going to survive.

A team member and I, forgot the guy’s name, decided to use the time between now and when D-Day would be to prepare for the next step in the career: we walked down to the Computer Bookstore on the ground floor, bought ourselves copies of Java In A Nutshell and Symantec’s Visual Cafe for Java. To learn Java I wrote a Checkers game as an applet. Once that was working well I wanted a place, a web site, to host that applet so that my intended new colleagues of Sun Microsystems could play with it and admire my knowledge of the Java technology. And thus: onno.com.

Later it became a personal web site and blog to host my photographic exploits and my stories about travel, cycling and whatever else I choose to write about. The first number of years this was all handcrafted html. Over time I replaced pieces with off the shelf tools: the photo gallery moved to MobileME and very recently to onno.smugmug.com, and the main content is now managed by wordpress running on onno.com. The hosting moved from pacbell.net to yahoo to lunarpages.

A few times a year I get inquiries to buy the domain. A t-shirt company in Colorado tried a few times; it was never clear why “onno.com” was meaningful to them. Various fellow Onno’s asked including Onno Tijdgat who was known as a hacker during the 80-ies and the Chaos Computer Club days. The most recent request was a few months ago from a Polish company building a portal at onno.pl. I somewhat regret not having grabbed the .nl and .org domains at the time and so now other Onno’s occupy those.

The site hosted Rachel’s photography business for awhile before we moved it off to its own home at rachelgracie.com. It hosted my consulting business for the year it was active. Last year onno.com was hacked and I spent some long nights going through every file to check if it was compromised. And I once got a death threat – a comment on a story about gun control.

Sadly I don’t have a backup from the very early days of the site. The image you see above shows what the main page looked like in April 2002. Web crawlers visited the domain a few times and so there are some fun nuggets in the wayback machine. Such as my December 2000 roadtrip: http://web.archive.org/web/20010216193812/http://www.onno.com/travel/newyearseve.html and the 2000 Thanksgiving weekend Amtrak journey: http://web.archive.org/web/20010422061814/http://www.onno.com/travel/allaboard.html. I may lift a few of those and re-post them; I have quite fond memories of a some of those trips.

Impromptu Rides

Feb 28, 2012 in Technology

wpid-impromptu-2012-02-28-10-13.png

Yesterday Cindy and I pushed out the new version of the Day Rides Center web site, now renamed to Impromptu Rides.

This site supports our cycling club’s program for scheduling ad-hoc bike rides. While the club (Rochester Bicycling Club) has a yearly formal schedule of rides, that schedule is put together with a workweek in mind: mostly rides in the weekend and the evening weekday hours once daylight savings starts. But many club members and other local cyclists have time during the week during the day. And so an initiative came about to help coordinate interested riders to suggest, find and join in on rides outside the regular schedule. At first this was an email send-around effort. Then last winter Cindy asked if I could help make a web site to make this easier. My answer: “Sure!”

It was a great excuse to tinker with a few technologies I have wanted to play with and learn but didn’t have a “real world”-enough project to try them out on. These were GWT (Google Web Toolkit) and GAE (Google App Engine). GWT allows one to write the browser portion in Java. GWT compiles the Java source code to Javascript and takes care of the differences between the various browsers. GAE is Google’s cloud computing platform and so that is hosting the backend of the site. GAE is what GWT is to Javascript: I can just write Java without having to worry much, or know much, about server-side computing and Java EE at all.

We launched the first version last March and then during the year added some features, fixed bugs and so on. We used this winter – not many people riding bikes – to redesign the layout, add a bunch new features and I took the opportunity to re-implement a good portion. The latter is the usual software engineering happenstance: I learned a lot about the two technologies during the year and so found better ways to do certain things, the bolting on of new features made some parts a little bloated, and to make doing some of the new things easier it required some rewriting as well.

The backend also gained a new front end client this winter: the Club Rides iOS app now plugs in too to show both the regular ride schedule and the impromptu rides. The ease of doing this shows a benefit of both App Engine and GWT: it’s all just a REST API and so the front end and the back end are nicely decoupled.

This winter I focused on getting feature parity between Impromptu Rides and the Club Rides app. The Club Rides app grabs the RSS feed from the RBC web site to display recent club news. The new version also uses a Google service to grab the weather forecast. This content is also returned as XML. Working with XML, and in general any content over an http connection, is really easy to do in Objective-C. It has always amazed me how hard, comparatively, this is in Java. The built-in parsers are memory hungry and it takes a lot of code to get the content from the http connection and then parse it. For Objective-C there’s a really nice, fast, small open source library to parse XML: TBXML. Delighted I was to discover that Julien Foltz ported it to Java!

Now, all that is needed to ingest the RSS feed is:

try {
    URL url = new URL(http://rbcbike.wordpress.com/feed/);
    TBXML doc = new TBXML(url);
    if (doc != null) {
        TBXMLElement root = doc.rootXMLElement();
        TBXMLElement channel = doc.childElement(“channel”, root);
        TBXMLElement element = doc.childElement(“item”, channel);
        ArrayList> result = new ArrayList>();
        while (element != null) {
            TBXMLElement temp = doc.childElement(“title”, element);
            […snip…]
            result.add(entry);
            element = doc.nextSibling(“item”, element);
        }
        return result;
    }
} catch (Exception e) {
     this.sendEmailReport(“AdminServiceImpl:getClubNews”, e.toString());
}

The browser’s security framework does not allow the opening of URL connections – GWT doesn’t therefore implement java.net.URL – so the above code runs on the server. The client makes a Java RPC call to the server requesting the feed, the server grabs it, parses it and passes it back as a hashmap array to the browser.

Impromptu Rides tries to determine whether it’s being viewed on a computer, a tablet or a phone. In case of the latter it displays a simpler version of the app: just the Find Rides portion. This involves interpreting the user.agent values that the browser reports. Messy stuff. The Android devices, or rather their manufacturers, could be a little nicer and more forthcoming about what category of device they are. In the end I chose to distinguish between “Safari” and “Mobile Safari” which seems to work to draw the line between computers and tablets on one side and phones (and iPods) on the other. At least for iOS and Android devices. I don’t know how Blackberry or other non-Android devices present themselves. The Impromptu Rides site also knows about the regular RBC schedule and so together with the mobile device support this saves me needing to do an Android version of the Club Rides app.

As you can see from the code snippet the server-side code sends me an email when something is amiss. I quite like that. I can leave the application running by itself without needing to keep an eye. When something unexpected happens it sends me a little email.

When I started playing with GWT last year, I had to smile. When Google first released GWT I was working at Sun. We, JavaSoft, were not amused. This was not Java. What Google did was Wrong and Bad, how dare they! Now, as a software developer I find GWT great. Google directly addressed a developer need and a niche in the available tools at that time: writing in a well-known high-level language, no need to learn Javascript, shielded from (most) browser-specific stuff, zero administration and no plug-ins required.

A quick summary of the new features:

–        Elevation profiles for most, known, routes

–        Weather forecast for the starting location

–        Recent club news

–        When scheduling a ride, include a link to MapMyRide, BikeToaster, etc for Garmin Edge bike computers

–        “Remember me” for ride leaders and admin

–        Adjusted layout for iPhones and Android phones

–        and an About page which explains what Impromptu Rides are actually about!

So, have a play with it and join us on some of our rides!

Windows Azure – first impressions

Sep 12, 2011 in Technology

The last few weeks I’ve been exploring Windows Azure, Microsoft’s cloud computing platform.

This turned itself into a learning experience on several levels:
1. I haven’t done Windows software development in years
2. Getting to grips with MS’s development model vis-a-vis Java and iOS/Objective-C
3. Contrasting Azure against my experiences with Amazon Web Services and Google App Engine (GAE)

The second item has been intriguing in its own right. Windows developers – the way they develop software, the way they talk about it – do seem rather different from both Java and iOS developers. Some of that is inherent to the technological differences but part of it is culture. Certainly in Java, but also in iOS, a lot of software development involves pulling in open source software for various plumbing pieces (xml parsing, graphics manipulation, network abstraction, persistence abstraction, what have you). There’s a plethora of public projects to stand on the shoulders of: Ruby on Rails, Tomcat, Glassfish, Spring, Hibernate, KissXML, the list goes on. Many developers use different languages for specific pieces of the overall product: php, python or javascript on the front-end; JRuby, Groovy, Java (of course) on the other tiers. Then there are open source products such as Puppet to help you manage the (virtual) datacenter and the deployment of your product.

On the Windows side there doesn’t seem to be that same rich diversity and choice. I use the verb ‘seem’ on purpose: I may well be wrong and discover that as I spend more time with this platform. But for now it seems that Windows developers are missing out on the cross-pollination and opportunities to learn from each other that I see in the Java environment and even in the equally closed (as compared to Windows) iOS development environment. Maybe that is good blog entry of its own?

But back to Windows Azure itself and my experiences so far.

Most tutorials, books, blogs and sample code I found approach Azure from the perspective of a web site: serving up web pages, storing and retrieving the information that comes along with it. And many assume Windows (a PC, a phone, a server) on both sides of the virtual wire.

Regarding the latter, it is a function of the internet that you don’t know (or should not know/assume) the particulars of what is connecting to you. One entertaining result of this Windows-centric view is that while much of Azure is exposed as REST services, most of the sample code just make .NET method calls. Thus obfuscating the benefits of the platform-agnostic API that Azure does expose.

Regarding the former, that – a web site – is not the context I am looking into Azure for: instead of web pages served up, it is services that need to be served up to which different kinds of mobile devices will be connecting.

Azure distinguishes between web roles and worker roles. A useful simplification is to see a web role (or the collection of web roles in your project) as the web server and the worker roles as the background processes performing the computation, data mining and so on. This distinction is still something I’m getting to grips with: it seems you can do in a worker role what you can do in a web role and vice versa. So what really does this architecture give you?

This brings up a broader point. Design patterns, or best practices. In my project I wanted the mobile devices to communicate with my Azure project through a REST API. I know how to do this in Objective-C, and in Java. But how do you expose a REST API in C#/.NET and how do you receive GET, POST, PUT messages Azure-side? Much reading on MSDN, StackOverlow.com, other developers’ blogs showed that there are many ways to do this: as a WCF service, or use ASP.NET, or ASP.NET MVC, or…
Similarly to the question of where to keep the project’s data, there are many answers: local storage, Azure table or blob services, Azure SQL, or…

I admit that for sure in the first two weeks I had a hard time separating the trees from the forest. Now, a month or so further into the journey I have a much better feel for Azure’s application model but it was not easy arriving there from outside the Windows world.

There are two areas though where I really like to see improvements: deployment and diagnostics.

Currently my project consists of a fairly simple worker role that exposes several entry points via a REST API and maintains two tables. Still, a build & deploy from Visual Studio takes 10 minutes. That’s just an eternity in a develop-build-deploy-test cycle. In comparison, from Eclipse I build and deploy a much larger GWT+GAE project in just a minute or so. I am curious what the deployment time will be once the effort grows to the projected several worker roles, Azure AppFabric bus, certificate store and more.

Sometimes after some development my worker role won’t instantiate and Visual Studio ends up in an endless cycle of creating, starting, stopping, creating, starting, stopping cycle. Yes, I can retrieve information about why it is unsuccessful via diagnostics but I had really expected Visual Studio to be able to just get that for me: it knows the worker role failed to deploy so it should really also be able to get me the failure.

To get trace and other diagnostic information from my Azure project involves sprinkling trace calls throughout my code, configuring and setting up the diagnostics framework, transferring the collected analytic data to storage, and then retrieving that data. In my experience so far this is an error prone process where I sometimes seem to spend as much time trying to have the right data collected and then accessing it as I spend fixing the particular bug I’m trying to use diagnostics for. Together with the aforementioned deployment situation this makes for a slow and rather tedious development/testing experience. I miss the end-to-end debugging I can do with GWT+GAE and I miss the GAE dashboard where I can see in one glance the main issues for my app, its resource usage and its data store.

So far I like that Azure makes much use of standard web methodology – REST most notably – and that existing .NET applications should migrate quite easily to Azure thus gaining cloudiness. But that last point I see also as a weakness: little reason for non-Windows deployments to migrate to Azure, GAY and AWS will feel much more natural.

I’d love to hear your experiences with Azure. I’ll follow up with future entries as the project progresses. Possibly the next installment quite soon as later this week I’m attending the Azure bootcamp in Cambridge, MA!

JavaOne & WWDC: A tale of two conferences

Jun 09, 2009 in Technology

Sun gathered the faithful last week in San Francisco and Apple is doing so this week.

I attended and participated in both conferences many times but am not at either this year for the first time in many years. “Withdrawal symptoms?”, a friend asked. No, surprisingly not. I didn’t miss the internal mayhem that is Sun’s preparation leading up to JavaOne. But now that WWDC is underway I do have the temptation to reflect a bit and share with you.

I attended WWDC the first time in 1989. I worked for KPMG Peat Marwick and so put on the business suit that Monday morning to register for the conference. I looked about the long line snaking to San Jose’s Convention Center seeing only jeans, shorts and t-shirts. I turned around, walked back to the hotel and changed. My ego has the fondest memories of the 1996 conference when the OpenDoc team included an OpenDoc component that I had written in their on-stage demo.

My first JavaOne conference was in 1997, just before joining Sun, watching Graham and Larry present JavaBeans. The next year I was on stage together with Graham doing JavaBeans demos. That was pretty cool too.

But I want to talk about this year’s conferences rather that those close to ancient past.

When you’re part of something it seems that the world at large evolves around it, pays rapt attention. Only when you’re on the outside do you see that the larger world may not be paying so much attention. Last week I did not see any mention of the JavaOne conference on news.com. On my Yahoo page where I track JAVA stock news a few Sun announcements came by but nothing that seemed very major. Larry Ellison was on stage but Yahoo only appeared to report that Oracle is (still) interested in netbooks. From arguably the industry’s most important software developer conference only a few years back JavaOne seems to have descended to the common ranks of all the many conferences that take place during the year.

Such a pity. As my neighbor Cort who works for IBM and I were chatting last week: such a missed opportunity. Such a shame that at Sun we never really figured out how to capitalize on having invented the most significant software technology of the last decade. We Javasofters should have Ferrari’s on our drive ways. I’ll take mine yellow, thank you. We were probably a little too nice to the industry and Sun competitors rather than focus on our own commercial success. From that perspective JavaFX is interesting but is there enough time left? It will be intriguing to watch what Oracle can do.

Leading up to WWDC’s opening keynote yesterday, news.com had various articles speculating about the conference and possible Apple announcements. News.com blogged live during the keynote as did several other news outlets. CNN HeadLineNews made brief mention of the conference. And Apple had a fair amount of news: updated laptops, Mac OS X news, new iPhone apps, new iPhone OS, new iPhone. Oh and the conference was sold out. It sold out in late April already. Looking at the breadth of the news, the size of the conference, this appears to be a company that’s ticking very well. And so it appears WWDC is inheriting JavaOne’s crown as the significant yearly developer conference.

The saying goes “execution is everything.” I do think that’s one of things that plagued Sun since 1995: picking and choosing from all the opportunities before it and sticking with any one of them long enough.

Which leads me back to JavaFX and Android for just a moment. The iPhone adoption numbers (eg its share of mobile web usage) that Phil Schiller released during the keynote were just very impressive. In contrast Sun announced its JavaFX app store last week but without the financial component, JavaFX is not pre-installed on phones by any carrier as far as I know. On the Android side, there still seems to be only the one T-Mobile G1 phone. Certainly I had expected Google with its market muscle to have had a much great impact on the market by now.

Execution.

JavaFX Talk for RJUG

Jan 15, 2009 in Technology

This Tuesday I presented on the JavaFX technology to the Rochester Java User Group. It was a lot of fun to do a technical presentation again – it’s been a long time since I spoke on technical stuff. Dave Cok of RIT brought his compiler class to the presentation. That was a little daunting – language theory is not my strongest side – but was very motivating as well.

I used my pet project to talk about how one might migrate a Java project to JavaFX and how to mix Java code and JavaFX code. I have been rewriting Bahamontes in JavaFX and named that project “Anquetil” to stay with the theme (this reminds me that should upload what I’ve been doing with Bahamontes since July ‘07). In order to get the Anquetil work in a state to fit my talk it was a mad scramble during the weekend and Monday. It also became a time scramble because I stared myself blind on two programming mistakes: situations where you know that it is something simple that you have done wrong in the code but you’re just not seeing it. I entertained the audience with them, and here they are for your delight as well.

The first code snippet (why do I get null pointer exceptions during runtime!?):

public class Mapping extends JPanel {
        public void Mapping() {
                myLayout();
                mapClient = new Exec();
        }

        private void myLayout() {
                setLayout(new BorderLayout());
                setPreferredSize(new Dimension(1000, 450));
                JLabel mapLabel = new JLabel();
                mapLabel.addMouseListener(
                        new MouseAdapter() {
                                public void mousePressed(MouseEvent evt){
                                        mapLabelMousePressed(evt);
                                }
                        });
                add(mapLabel, BorderLayout.CENTER);
        }
        private Exec mapClient;
}

And the second (why is the calendar component not showing on the screen in the way I want!?):

public class MyCalendar extends JXMonthView {
        public MyCalendar(final RideData parent) {
                datePicker = new JXMonthView();
                datePicker.setShowLeadingDates(true);
                datePicker.setShowTrailingDates(true);
                datePicker.setTraversable(true);
                addActionListener(
                        new java.awt.event.ActionListener() {
                        public void actionPerformed(ActionEvent evt) {
                                        parent.dateChanged(getSelectedDate());
                                }
                        });
                datePicker.setFlaggedDates(parent.getFlaggedDates());
                datePicker.setSelectedDate(
                        new Date(parent.getFlaggedDates()[0]));
                datePicker.commitSelection();
        }
        private JXMonthView datePicker;
}

Anyways, onto JavaFX. Sun released version 1 of JavaFX on December 4. The technology makes it much easier to create media-rich applications that run on desktops, laptops, in browsers, on cell phones, settop boxes, Bluray players and so forth. With the new plug-in in Java SE 6U10 applets are much more powerful, can interact with JavaScript and with CSS stylesheets, and you can drag them out of the browser.

The part of my own talk that I enjoyed the most was discussing the JavaFX Script language. It has a number of features that enable you to write very efficient code such as “bind”, “on replace” and the operations you can do on sequences. The language has a concept of time (it knows what seconds, milliseconds, minutes and so on are), transformations, interpolations making it very easy to do animations. We examined the source code of some of the samples that come with Netbeans 6.5 and did things like “what happens if you remove ‘bind’ from that statement?”

References:
– The JavaFX website: http://javafx.com
– Get Netbeans 6.5 with the JavaFX SDK: http://netbeans.org
– The new plug-in: http://java.com
– Language tutorial: http://java.sun.com/javafx/1/tutorials/core/
– API reference: http://java.sun.com/javafx/1/docs/api/
– Josh Marinacci’s blog: http://weblogs.java.net/blog/joshy/

Growing RJUG

Oct 28, 2008 in Technology

Met with Tom and Rob yesterday evening at Timothy Patrick’s – an Irish pub, appropriate no? – to brainstorm on how to grow the Rochester Java User Group. How to get on average a larger turnout at the meetings, how to attract more members.

Over the last year or so we did manage to attract quite good speakers – James Gosling, Ted Leung, Neal Gafter, Brain Leonard and others. But the size of the audience could have been better for these speakers and topics. So we’re going to try a number of things to see if we can change this.

One approach is to broaden how we reach out and connect to the membership. Currently the main avenue is the web site and the mailing list. We’re going to try some of the social networking places like LinkedIn and Twitter to give potential interested developers more ways to find us and to communicate with us. The mailing list is mainly one directional, a LinkedIn group gives the possibility for a member to start discussions. And the web site could do with a refresh.

Getting good speakers is one thing, making sure speakers cover topics that match the local interest is at least as important. To that end we’re going to hook up with local companies doing Java development and talk to them about what value RJUG could provide to their developers. In this vein, we do get regular participation from RIT (one or two of the professors, a few students) but not much if any from UfoR (maybe because the meeting is at RIT?), and so an action item for me to go talk to the faculty there.

In addition to learning about new Java technologies the user group is seen as a place for networking. While our meetings aren’t specifically geared towards that, we do have a social aspect attached to each meeting: those interested go to McGregor’s (aka Conference Room M) afterwards just ti chat. Something we don’t really advertise in the meeting announcements (ie you have to have been to a meeting to know about it).

During the summer months it is always hard to get people into a conference room in the evening. Thus far this meant we don’t have meetings then because of the very low turn out. Perhaps during that time of year we solely focus on the networking aspect at a nice beet garden and forego the formal part.

In good silicon valley style we decided that we need a logo and a t-shirt. Now, Duke was open sourced under a BSD license, so no hurdles to our creative skills!

stretch mark removal products
Спорт-как способ похудеть ссылка сайт кремлёвской диеты женские сайты диеты как быстро похудеть и накочать мускулы как можно быстро похудеть без проблем рисовая диета для похудения как быстро похудеть, рецепты похудения как похудеть быстро без дееты за 14 дней срочно похудеть с помошью салона красоты в казани как быстро похудеть народные рецепты как похудеть быстро и не мучить себя голодом диеты для снижения веса сайт девчат быстро похудеть на 30 килограмм срочно похудеть на 5 кг. за 10 дней алан кар легкий способ похудеть скачать бесплатно как быстро и безвредно похудеть? как похудеть быстро за месяц 10кг спомощю воды диетхудеем быстро без с упражнениями отзывы средства для похудения хочу быстро легко похудеть быстрый способ похудеть aллен кaрр срочно похудеть за три дня три колограмма быстро похудеть без лекарств худеем быстро после родов ка быстро похудеть делая клизмы сайт диета доктора аткинса легкий способ похудеть от алена карра диета для похудения из куриного мяса танец живота как способ похудеть индивидуальная диета тест худоба ру легкий способ похудеть