Friday, October 12, 2007

I'm in love with my Nokia N95

I fought with myself for weeks, but about 2 weeks ago I could not resist anymore and finally bought a Nokia N95. I have been using it since then and what I can tell is that the device is amazing!

For those who don’t now the device yet, it’s a GSM smartphone with a 5MP camera, Wi-Fi and embedded GPS running on S60v3 (Symbian OS). A great generic review is available in the link bellow:

Nokia N95 review: Nokia’s crown jewel
http://www.gsmarena.com/nokia_n95-review-141.php

My digital camera is broken; I needed an mp3 player because I have been spending about 10h a week in a bus because of my current project and I like to listen to music while traveling, so I decided to buy this phone, because it can be used for these functions pretty well.

Currently I’ve been running some very cool softwares on it. For example:

  • Putty for ssh;
  • Python for some cool scripts (graphics, text editor, etc.) that I found;
  • Quake 1;
  • Google Maps integrated with the GPS, which, btw, absolutely rocks;
  • DivX Player to watch TV series episodes while traveling;
  • Fring to make Skype calls over Wi-Fi, which it’s also very very cool;
  • Gmail client for reading e-mails which is very close to the standard gmail, but gmail mobile is ok too;
  • Nokia podcasting software for listening to podcasts;
  • Nokia mp3 player is very nice too; most of my favorite albums are in the phone already, etc.
And now I can take nice pictures (5MP) whenever I want!

Using it for web browsing over Wi-Fi is very cool also. Currently more than half of my feeds I read on it using Mobile Google Reader, which is also very cool. The standard browser of N95 is very good in general; it uses the same engine of Safari and it’s a real browser (not a “wap” browser)! I can access most of my “standard” sites using it and everything works pretty well. I have installed Opera mini, but I think it’s too heavy. So, for reading and listening to music I've been using my N95 more than my laptop.

There are some things that I want to do in the future with it, for example, install a ruby interpreter, install a software for use it as a webcam that I cannot remember the name, buy more memory; install a software to download maps of Sorocaba and Volta Redonda to use with GPS without having to use any Internet connection (it already has a pretty good map for São Paulo), download more games like Quake, write some apps in python for it, send photos to flickr directly using it, etc.

I’m also impressed about how easy is to write graphical applications with python for S60. I’m thinking about writing some apps in python to explore the GPS and also, if possible, a Nokia mp3 player integration with last.fm site.

In my opinion, for advanced users, there’s no comparison with iPhone, which is VERY cool because of its UI, but it’s also much closed for custom software. I could not do most of the things that I’m doing with my N95 if I had an iPhone!

Of course, it has some problems, for example, the battery sucks, the camera flash sucks, internal RAM is not enough for running more than 3 applications in parallel, it’s very expensive (~2,3K reais in Brazil), it’s kind of big, etc. But, for me, up to now, it rocks!

Some images of my N95 running:

Some of my applications











A skype call


Route: Parents' home in Sorocaba -> my apartment in São Paulo


Fibonnaci in python


The mp3 player


Some of my photos


Using google reader


Using google reader

Monday, June 25, 2007

Tools that I Love

Common Tools

  • Launchy - I rarely use the "Start Menu" with it. It's the closest Windows tool to Mac Quicksilver. I used to use SlickRun, which is also a great tool, but I moved to Launchy because of the better user experience;
  • Notepad2 - The best "simple" text editor around, it looks like the traditional Notepad, but much more powerful;
  • Process Explorer - Much better than the traditional Windows Task Manager. Using it you can know what is really going on in your machine.
  • Unlocker - Do you want to delete some file and Windows does not allow you because some other process is using it? Unlocker solves this kind of problems perfectly;
  • TrueCrypt - Strong cryptography made easy, specially for usb sticks;
  • Paint.NET - Similar to Notepad2; simple as the traditional Paint, however much much more powerful;
  • Foxit - Is it so hard to read a pdf file? I can't even remember the Acrobat Reader nowadays with Foxit;
  • Free Download Manager - Kick ass download manager without ads and stuff like that, although the name is not the most "creative" I ever seen;
  • Firefox - I cannot figure out why people still use Internet Explorer. Firefox is great, but its add-ons are even better: del.icio.us, greasemonkey, flashgot, firebug, fasterfox, etc. are fantastic...

.NET Developer Tools (I haven't developed in Java for the last 2 years, so my Java tools will be in another post)

  • Resharper - It's impossible to use Visual Studio without Resharper if you ever seen Java IDEs like IntelliJ and Eclipse. It makes you at least 25% more productive. I rarely use mouse in VS because of it...
  • Reflector - Visual Studio Class Browser is a shame when compared with Reflector. Reflector is much more user friendly, more powerful, great disassembler and have nice plug-ins;
  • Subversion - Simply the best version control system around if your team is not 200+, TortoiseSVN is a great client as well;
  • Cruise Control .NET - I cannot imagine myself working in a team without a CI server anymore and Cruise Control .NET does a fantastic job. However, it could get a better default report page, like the new Cruise Control Enterprise. CCTray is great as well;
  • Test Driven .NET - The best way to launch your unit tests inside Visual Studio. I love the Resharper, but its unit testing tools are not so clean/light/not intrusive as Test Driven .NET. Run Last Test feature is fantastic;
  • NCover - Very simple but efficient way to check your tests coverage;
  • FxCop - Great inspection tool, Microsoft could create more tools like that, however it sucks for creating custom inspection rules because of its API;
  • ActiveWriter - Do you want to create a full domain model compatible with Active Record and/or NHibernate? Using ActiveWriter is the simplest way to implement it;

Wednesday, May 23, 2007

Resharper Jedi

Reading the blogs from some guys that went to DevTeach, I've learned a new term that emerged (I think) from there, "Resharper Jedi".

Oren (Ayende) seems to be the official Resharper Jedi, elected by the guys during DevTeach. In his Hibernating Rhinos series you can see how fast he uses a lot of features from Resharper.

In my teams I try to convince every developer to learn at least the most important Resharper shortcuts, it really really improves the programming speedy. I personally rarely use a mouse inside visual studio due Resharper features shortcuts.

I cannot imagine myself using Visual Studio without Resharper anymore; it seems only a text editor with an integrated compiler/debugger. However, I'm happy with VS + Resharper, but I still would like a "JetBrains IDE for .NET", kinda "IntelliN".

Talking about Resharper, I just found a new blog from a JetBrains' developer about Resharper. It looks like a nice blog:
http://resharper.blogspot.com/

Sunday, May 13, 2007

Fast system <> real time system

Why a lot of people think that systems that have fast response are "real time" systems? I often hear things like "It's a real time system, the values are constantly updated in real time.", "It's a real time system, it responds immediately after it receive a request". Real time is about compromise to give a response in a window of time, I mean, the system has to produce a response in x seconds, no matter what, it has to produce it in x seconds, point. A formal definition from http://www.dedicated-systems.com/:

A Real-Time System responds in a (timely) predictable way to unpredictable external stimuli arrivals. In short, a Real-Time System has to fulfill under extreme load conditions:

  1. Timeliness: meet deadlines, it is required that the application has to finish certain tasks within the time boundaries it has to respect;
  2. Simultaneity or simultaneous processing: more than one event may happen simultaneously, all deadlines should be met.;
  3. Predictability: the real-time system has to react to all possible events in a predictable way;
  4. Dependability or trustworthiness: it is necessary that the real-time system environment can rely on it.

Common examples of real time system are: automobile airbag systems, temperature control system of a nuclear power plants, etc.

In one of my current projects we have to control PLCs for pallets transportation in a warehouse, we have to reply the PLCs quick, otherwise the efficiency of the warehouse goes down, but it's far from being a real time system, even so I bet someone (colleagues, partners, client, providers, etc.) will call it a real time in some moment in the future.

The majority of systems people call real time are .NET or Java (not JSR-001/JSR-282) systems. However, the garbage collector in .NET and Java is not deterministic, so you cannot be sure about when some things will happen. For this reason, you cannot build real time systems in .NET or Java, at least not a “hard” real time system.

With JSR-001/JSR-282, Java will be able to build hard real time system; however, I've never saw anything similar for .NET, unfortunately.

Wednesday, May 9, 2007

My default .NET data access strategy - NHibernate based approach

In my new project I and my team are being able to use a set of tools that I have been looking at for some time for data access in .NET. The approach is based on well know open source ORM framework: NHibernate, however, we are using other fantastic tools above it.

Instead of creating NHibernate mapping files, we are using Castle Active Record (AR) attributes to decorate our domain model classes. Analyzing the attributes AR can generate the mapping files dynamically, so we don’t have to deal with a lot of xmls files. We have something like this.

But we also don’t create the domain model directly, we use the Active Writer, which is a VS add-in that works like VS Class Designer, but it generates classes decorated with the AR attributes. So, it’s very fast to create a full domain model mapped using the AR attributes.

However, we don’t use the ActiveRecordBase class as base class for our model in order to avoid getting the persistence methods in our domain model. We prefer to use repositories (DDD flavor).

For the repositories we use a slightly modified version of Rhino Commons ARRepository (generic specialization). The implementation uses the ActiveRecordMediator which already have most of basic persistence operations, such as Save, Delete, FindAll, FindOne, etc.

For custom queries, we try to avoid using the NHibernate query API directly; instead we use the Ayende’s NHibernate Query Generator tool. It allows us to have strong typed queries that feels like SQL Queries, much better/natural in my opinion.

So, we have something like this in the EquipmentRepository:

Equipment FindDougEquip()
{
return FindOne(Where.Equipment.Name == “DouglasEquip” && Where.Equipment.Id > 0);
}


Well, I think this approach is very productive; we have a full persistable domain model and basic repository classes, besides the strong typed queries in few minutes. Really really fantastic open source tools.

Monday, May 7, 2007

First post - Introducing myself

Well, this is my first post so I think it would be a good idea to introduce myself to anyone who could find this blog or even read it and don't know me yet.

As you can find somewhere in this page, my name is Douglas and I'm from São Paulo, Brazil. I'm an Electrical/Computer Engineer graduated at Poli-USP. I work as a Team Leader at Chemtech, an industrial services company from Siemens group. I usually work at São Paulo office, mainly in software development projects for a range of industries such as metals and mining, logistics, water and electric power, etc. Chemtech is a really nice place to work, I'll post about it in the future.

I'm a huge fan of modern/agile software development practices like refactoring, continuous integration, TDD, DDD and techniques like IoC/DI, ORM, AOP, etc.. Most of my projects uses .NET platform (my favorite), but I already did some huge projects in Java EE world, which I like as well.

I'm always looking for great tools, whenever possible, open source one. In .NET world I (and my teams) use a lot of them, such as Castle Project stack (Windsor, Active Record, Active Writer, Dynamic Proxy), NHibernate, Ayende tools (Rhino Mocks, NQG, NQA, Commons), Cruise Control .NET, NAnt, NUnit, etc.. While JetBrains does not create a kick ass .NET IDE, I use Visual Studio with its fantastic Resharper add-in. In Java world I use the similar ones.

I'm also very interested in project management, I like to compare and merge/use whenever possible agile practices such as Scrum and XP with PMI PMBoK guidance in my projects.

Well, so it's the end of my first post. In the future I'll post more about my life in software development industry and other random stuff.

More about me in Linkedin:

http://www.linkedin.com/in/dougfernando