Monthly Archives: September 2010

Samsung Galaxy S from a recovering iPhone user

[UPDATE NOTE: Although much of this post is accurate and my overall impressions are in the Summary, you might be interested in knowing that after 8 months, I ended up selling this device and purchasing an iPhone 4. Why? Some day I'll blog about it....]

After being an iPhone user for over two years, the day before iOS 4.1 was released, I purchased a Samsung Galaxy S. Like many iPhone users I made the terrible mistake of upgrading my iPhone 3G to iOS 4. And like many, I suffered the consequences. Being left-handed and not a big iTunes devote, getting the iPhone 4 was not that attractive of an option and I was quite interested in trying out Android. So I decided to settle on the Galaxy S.

The Hardware

I was quite surprised when I picked up the phone as it was extremely light, even with the battery. Width-wise it’s pretty much the same as the iPhone 3G. In height it’s around 1cm longer. Having the feeling of being able to take off the cover and get access to the battery was kind of overwhelming. For over two years I had forgotten what a phone battery even looked like. The case feels less solid than the iPhone however. So far I’ve not dropped it, and I’d be concerned to do so since it feels like it wouldn’t survive a fall (my iPhone twice rolled down several stone stairs and survived, among other accidents).

Contrary to the iPhone and many other phones, the Power socket and USB connection is on the top part of the phone, next to the ear jack. Similar to the iPhone it has 3 hardware buttons, the middle Home one, then volume control on the left and a power button on the right. This last one can be used to not only power the phone off, but also select a variety of options such as putting the phone in Silent Mode, Connectivity options as well as Flight Mode. It also comes with two touch (?) buttons on each side of the Home button. The left one is used to get access to contextual options for each application, and the right one is a general “back button”.

The screen size is larger than the iPhone and although not by much, it really does make a difference when using the browser and other applications. Much nicer. Also, the fact that the menu options and back button are not “on the screen” per se, it allows for more surface area for applications (i.e. no row with a “Back” or “Edit” or “Done” on the top part of every screen).

In regards to storage, by default, mine comes with an internal 8GB storage, however you can extend it using an SD card which is quite nice.

Camera and Video

The phone comes with a 5MP camera and can also record VGA video. The quality is not bad at all. Much better than the iPhone (probably not as good as the iPhone 4 however from some comparison I saw recently). Then again, for my usage of the camera, it’s more than sufficient. It also has a mode to capture text (thanks Gary) which is great for snapshots of business cards, etc.

Home Screen

Android operating system (to the best of my knowledge this is Android generic and not Samsung specific) has what we could consider a Desktop and also an Applications Folder. The Desktop is what you see when you access the phone. It’s where you can place your frequently used applications. You have 7 desktop (Image 1), that is you can scroll left and right between them.

image2ac3

On one of the desktops you have quick access to activate and deactivate certain functionality such as Bluetooth, WiFi, etc

image04f1

On the first desktop you have a similar row of applications like that of iOS4 that remain static across all desktops. However, contrary to the iOS4, I’ve not been able to change these items. Maybe there’s a way. Icons don’t snap into position like they do with the iOS4, so you can place them anywhere. The normal procedure is to access the application folder and drag them over to the desktop. You access the Application folder by clicking on the Applications icon (see first image, bottom right)

image7bdf

The desktop background is also configurable with either static pictures, from photo album or a live gallery with moving images. The overall experience of the desktop is not much different from iOS4. One advantage is that you don’t clutter your screens with applications you don’t want quick access to (of course iOS4 did introduce folders).

Purchasing Applications and Installations

With iOS4, purchasing is quite simple. iTunes requires that you register your credit card details so that it’s really a one click operation to purchase. This is both a good thing and a bad one, specially if your kids know your password. With the Android, although I’ve not yet purchased an application, I did see it requires you to fill out payment details each time, which can also become quite cumbersome. Then again, maybe you can save this. Not sure.

The installation process is nicer too. With iOS4, every time you purchase an application, it takes you back to your “desktop” and shows its progress. With Android, it performs the download it background and allows you to continue to look through the store.

Favorite Apps

The variety of applications is quite good. I’ve not yet missed any app that I’ve had on the iPhone. Quite the contrary, I’ve found some things (KeePass anyone) that I’d not had on iOS due to Apple’s silly policies. The default Mail application does suck quite a bit, but then again I wasn’t a big fan of the iOS one either. Since I use Gmail, I just stick to the Browser version. For Twitter, not having Tweetdeck, I’m using Touiteur which isn’t bad. For SMS I use ChompSMS which gives more iOS feeling to it.

I have found quite a few Games on the Android that were also available on the iPhone and I have to say that the quality of the graphics were far superior on the iPhone. Now whether this is a limitation of the platform or it’s developer competence, I’m not sure.

Music

Listening to Music is pretty similar in experience to iPhone. You have access to artists, albums, playlists, etc. The default application does not know what a Podcast is, but then again, it doesn’t matter much. There’s also some specific Podcast apps I’m sure if you really need it.

The headphones I’m not too fond of. They have some plastic around them that form a kind of suction effect in your ears. Sure it might provide a better sound experience, but it also is quite an annoying feeling.

Making Calls

Phone experience is similar to the iPhone except some operations require two key presses. For instance, with the iPhone when you click on a Favorite contact, it automatically dials. Here it displays the contact’s details and you then have to choose a phone. Of course, the advantage is that can also choose to send a text message, email and ot
her operations from the same place, so it is quite useful.

Update: Apparently, instead of pressing the contact, if you slide your finger, it will dial the first number. Thanks to Leonxki for the tip

Notification Area

The top bar of the phone displays all the notifications you receive. These can be from missed calls, SMS’s, Emails, Facebook notifications, etc. I have to say, I love it. One thing I didn’t like about the iPhone is that you had to look at the application icons to see notifications. Here they are all available on one screen that you literally just pull down (using fingers to scroll top bar down). You can then access the application directly from there. The other great thing is that they remain there until you clear them. This works great for things like appointment notifications. With the iPhone, once you read an appointment it was gone. Here you can snooze it!

image1c41

(notice that if you have Music playing you can access the app and controls from the notification area also. Very handy)

Connectivity

No issues in terms of connectivity. Phone network has been the same as iPhone, both at home and during roaming. WiFi is simple to configure much like the iPhone and Bluetooth works great. In fact, I get a much better experience when hooking it up to the car system. I’ve had data connections over GPRS as well as 3G without any issues. However, GPS is a different matter.

Despite coming with a couple of Navigation applications, the GPS leaves quite a bit to be desired. I once used it to find my way and it was lagging behind about 1km and would frequently lose the GPS signal. Apparently there are some *issues* in regard to this.

When it comes to Tethering, although Kies offers the option I’ve not been able to get it to work, partly cause I have problems connecting the device*. However, you can also use Tethering easily using what’s called the MobileAP option on the phone. It sets up the phone as a gateway and you connect to it using WiFi and a key. Problem is that it only uses 3G so I can’t tether using Telefonica’s WiFi zones for instance. I’ve yet to play with this more though.

* Considering I managed to even upgrade the firmware on the first connect, I find it strange Kies just stopped working.

Syncing

To sync with the phone you normally use Kies (i.e. Samsung’s version of iTunes). It’s not the nicest user experience and I only managed to get it to work once, and once again, there seem to be some issues with the software and Windows 7 64bit. However, you can configure the phone to connect as a USB device which pretty much means that you can access any folder and transfer things manually, from music to videos to photos.

Regarding Mail, Calendar and Contacts, it’s Google. If you use Gmail and have your contacts in Gmail, then you’re pretty much set. It syncs over the cloud and does a great job at it. The Calendar is actually nicer than the iPhone one. Before on the iPhone I used to use the browser based calendar since it provided better information when you have more than one Gmail calendar. On the Android, the calendar provides native integration with Google so it works out great.

Input

The onscreen keyboard input is great. Better distance between keys makes it easier to type on. I was a little surprised as to not having spell correctors until someone pointed me to Swype. This is an input method that allows you to swipe your fingers through the letters of the word you want to type and it will automatically insert it for you. If it has doubts, it will prompt you with options. It works amazingly well and I’ve switched to this ever since.

Battery

If there’s one thing that I don’t like, it’s the batter life. I’ve not yet managed to get more than a day of usage out of it without having to recharge it. Depending on what you’re doing, it can also drain the battery quite fast. I’ve noticed 3G and WiFi contribute substantially whereas for instance Bluetooth or listening to music or playing games do not much.

The difference also with the iPhone is that it allows you to run more than one application at a time (remember the Windows Mobile days?). This means that when you launch an application, it sits running in background. Some say this contributes to battery usage although others disagree. The phone actually provides statistics on how much each application or activity has an impact on battery life and most of these applications don’t seem to contribute much since they pretty much sit in the background with 0% CPU usage. You can however kill applications if you like easily using the Task Manager.

imageb384

Openness

One great thing about the phone is that it’s open. Not only can you configure pretty much anything you want, but you can also access the file system easily. When it comes to installed applications, you have the same benefits. Don’t like the SMS app? No problem. You can change it and make it the default app on the system. Don’t like the default Music application? Again, just change it. You’re pretty much open to do anything you want.

Overall impressions

At first when I started using the new phone, I felt like a Windows users thrown in front of Ubuntu (not Linux). It kind of felt odd to find my way around. Although many things were similar to iOS, I had gotten used to a certain way of working and it was strange to have to adapt in some cases. For instance, operations that were one-click have now become two clicks. However, after understanding the benefits added by doing certain things the way they are done, I have come to not only adapt to this way of working but appreciate the advantages it offers.

Overall I don’t regret the decision of not going with iPhone 4. Apart from the battery life, everything else of the phone is pretty slick. I also think it’s brought Google and myself pretty closer. Up to now, they owned my email, calendar and contacts. Now they own my life.

Scary, I know. But as they say, every cloud has a silver lining. And in this case, iTunes is off my machine!

Spending time with you

At JetBrains, pretty much everyone is a developer. From our CEO, all the way through to our Product Managers and QA. Even our head of Marketing has contributed with code to IntelliJ. As such, we get to dogfood our own products quite a bit, which provides us with a lot of feedback for improvements and new features. However, this has it’s drawbacks too. As developers and consumers of the products, we work with them mostly in ways that are “expected”, and often miss that angle where tools are used in manners they weren’t set out to be.

That is why our users opinion, that is, yours, is fundamental, and by far the most important aspect of the feedback cycle. Different users, different companies work in different ways. For us, it’s important to know this.  This kind of feedback is often provided by email, support forums or even the occasional blog post or twitter. However, it is sometimes hard to understand certain things without looking at the bigger picture, and that is not always easy to communicate over electronic media.

What would be ideal, would be to sit down with our users and see how they work, the problems they face and what we can do to improve things; to get actual face time. We’ve been thinking about how to do this and come up with an idea, an experiment, that might work, might not. But as they say, it is better to have tried and failed than to never have tried at all.

Coming to a location near you

JetBrains exhibits at many conferences worldwide, on different technologies and topics. At each of these conferences, different teams attend. If it’s a .NET conference or cross-platform, we have members of the .NET team and some of the cross-platform tools such as TeamCity and YouTrack attend. If it’s a Java Conference, members of the IntelliJ attend. When exhibiting at conferences, you usually need to arrive a day or two before and leave a day after. Also many conferences have limited exhibit hours so often you end up with free time on your hands. Being in a country, where you have already had to cover travel expenses, seems like a great opportunity for meeting with customers.

As such, we are reaching out to our customers who would like to have the developers of the products they use daily, on-site to share with them their experiences, the challenges they face, the good, the bad and the ugly.

This is not a sales meeting, nor is it about training

These sessions are not about training nor sales. Those fall into different categories. These sessions are about having a relaxing two-way communication with customers. For this to be successful, we need both parties to genuinely be interested. From our side, only developers that are voluntarily willing to take part in the program will do so.

What is the process?

We’re playing this in an Agile way. Since this is an experimental program, we are still trying to shape things, but much of the decisions we need to make depends on how successful the program will become. In other words, we are not going to set up a sophisticated application process before we know there is sufficient demand for it. Right now we are going to use the tools that are at our disposition, and luckily we have one good one: Social media.

Before every event comes up, once we have most of the logistics and people coordinated, we will let all our customers that are on Facebook or following some of the Twitter accounts know we will be in town. If you are interested, you can contact us to set something up. To begin with (and most likely in the long term), it will be based on a first-come first-served basis. Once we have the quota complete, we will let all whom applied know.

If it proves to be successful, then we’ll look into setting up a more 21st Century automated system. Until then, we’ll play YAGNI.

We have many developers, Product Managers and QA members genuinely interested and committed to making this work. We hope this feeling is mutual.

 

On a side note, although this isn’t exactly the same, we do have a JetBrains Community Night coming up at DevCon in London, on the 29th of Septemeber where we’ll be meeting with customers. If you’d like to come, please make sure you sign up as places as limited

WTF you got against Silverlight?!

Nothing.

Friend of mine, and Silverlight MVP, asks me why I’ve become The Anti-Silverlight. I’m actually not on a crusade to bash Silverlight. My “issue” per se is not so much the technology but how it’s being sold.

Despite the recent outburst of Global amnesia, some of us recall how Silverlight, which originated from WPF/E, a subset of WPF, was about bringing rich user interfaces to the web. It was about, and I quote “lighting up the web”. Rich User Interface? Silverlight. Vivid user experiences? Silverlight. Video? Silverlight. And might I add, there was a lot of emphasis placed on video…

Of course, fast-forward to today, and things haven’t gone so much according to plan. And with recent changes, it looks less promising.

Now, some of us that have been doing web development for some time, and have suffered the pains of cross-browser compatibility, JavaScript (the copy/paste snippet joke language), CSS (the “crap, I moved a DIV and all hell’s broken loose” language), have also seen the advances in these fields. Not to sound repetitive, but jQuery for example has not not only made JavaScript fun, but opened our eyes in seeing how powerful this so called “joke” language actually is. CSS has become easy. I actually really dug into CSS after learning jQuery and realized how stupid I was to ignore it for so long.

Frameworks such as ASP.NET MVC (for context, I’m sticking to .NET), MonoRail and others are proving that the whole abstraction that WebForms provided didn’t work that well, and have made web development in .NET more productive, maintainable, testable, and consequently fun. 

There are many web sites now being developed using nothing more than HTML4, JavaScript and CSS and being done so very productively, and providing a very rich user experience. We have applications that work “offline”. We have applications that are keyboard centric. Cross-platform? If by platform we mean not only browsers but operating systems, yep, we have that too! Easy deployment? Yes sir! That one is actually inherent to the whole “web thingy”.

So we’ve managed to successfully create Consumer and Line of Business Applications. And now, with HTML5 coming, we’re also going to get video and more!

Yet despite all this, recent posts about what Silverlight is most suited for, are selling these same points as benefits of Silverlight, as if somehow implying that none of this can be accomplished with existing technology.

Some say “Sure, I can also program in Assembly and not use C#”, to which I reply "Open your eyes". Using HTML, jQuery and CSS is by no means less productive or harder to do than learning XAML, MVVM and asynchronous programming.

Now, having said that, if you prefer Silverlight, whether or not you’ve even tried alternatives, that’s great. I have absolutely no issue with people choosing to use Silverlight or any other technology for that matter. What I don’t agree with however is promoting technologies in the wrong way.

Of course, some now say that Silverlight was never about taking over the web, or lighting it up for that matter. It has always been about Windows Phone and Desktop applications. Wait?! Wasn’t this a subset of WPF?

JetBrains Community Night at DevCon


From the 27th to the 29th of September, DevCon London is taking place. DevCon is organized by Software and Support, the great team behind conferences such as BASTA, JAX, PHPCon and many more. The conference is in parallel with JAX London so there’s for sure going to be a mix of crowds between .NET and Java developers. There’s a great line-up of speakers (a few more not on the list including Greg Young and Neil Robbins) and Richard and Carl will be there with their .NET Rocks Panel. If you’ve not signed up yet, I recommend you do. It’s going to be a great event.

The night of the 29th, JetBrains is holding an Open Doors community event, where we’ll show some of the things we are working on, discuss some future plans and also have two great friends of JetBrains, Sebastian Lambla and Howard van Rooijen talk to us about dealing with packages in .NET and promoting standards across teams. All this will be topped off with Beer and Snacks.

This is a free event, and you do not need to register for the main conference to attend this. However, places are limited so I do recommend you sign up as soon as possible if you want to come.

Also, don’t forget that you can still have a chance to win a free entrance to DevCon or JAX London (2 day pass valued at over 540 Pounds Sterling) by submitting a Screencast to JetBrainsTV

Hope to see you there!

JetBrains TV: It’s here…

For some time now, we’ve had requests from the community to have a central point where people could have access to Screencasts and other Video related material that we provide. In response to that, we are happy to announce the availability of JetBrainsTV (Beta!).

 

image9c0c

 

The content is organized by Channels, currently one per product, although we will be expanding that to include other topics in the near future. Most of this content, if not all, is tagged with keywords, allowing you to easily locate topics you are interested in. In addition, the cross-cutting nature of the tags allow you to discover new things, for instance functionality that you knew existed in IntelliJ but weren’t aware that ReSharper also provided.

Content can be voted and commented on, neither of which require you to create an account. Voting is anonymous and comments can be left as a Guest user or using other social media accounts such as Twitter, Disqus or OpenId (obviously based on level of Spam we might have to adjust this in the future).

 

Contributing content

JetBrains TV is not only a platform to offer centralized screencasts, but also a chance for community members to contribute. By signing in (click on the link in the top right-hand corner), you can upload your own videos, thus providing you with a platform for other community members to see your work.

The sign-up process is easy, in fact, you might not even need to create an account, as it uses the consolidated JetBrains account. If you’ve contributed to the forums or the JetBrains developer  
community in the past, you’re good to go!

Although it is still in Beta, there’s quite a lot of content on there already and we hope that by opening it up to the community early, we can improve things based on your valuable feedback.

Enjoy!

 

PS. To support our love for dogfooding we’ve implemented the TV site with PHP and Drupal using PhpStorm IDE. PhpStorm team has received a good bunch of feedback they wanted.

Templates Galore: Surround Templates

This is part three of a four part series on Templates:

Surround templates, as the name indicates, allow us to surround a selection of text and apply a transformation to it. This can be from wrapping some code inside a try..catch block or performing more complex tasks such as iterations.

Surround Template Gallery

As with Live Templates and File Templates, we can view the list of available Surround Templates via the Live Templates entry in the ReSharper menu (for the record, I’ve filed a request for it to be renamed to the more appropriate Template Explorer, so feel free to support my request by voting for it).

1

The layout is similar to File Templates. The right-hand side column allows us to define a “quick list” of Surround Templates we want available based on context. Like before, we can first see how to use existing ones and then expand them by adding new ones.

Invoking a Surround Template

Like pretty much everything in ReSharper, we can invoke Surround Templates using the ReSharper menu (ReSharper|Edit|Surround with Template) or alternatively and more conveniently via the shortcut, which is Ctrl+E,U if using Visual Studio Scheme (Ctrl+Alt+J for IntelliJ).

Let’s assume we have some code that we need to wrap in a try..catch block. We first select the line(s) of code, press Cltr+E,U and ReSharper prompts a menu for us to select the specific template. Each entry is numbered, allowing us to quickly make a selection (in this case it would be 8)

2

The selected part of the code is then wrapped inside the try..catch part (later on we’ll see how this is defined), resulting in:

3

This is not limited to C# code, but can be used in Visual Basic as well as HTML (ASPX) and XML pages. Take the following text in an ASPX page:

4

Invoking the Surround Templates provides us with the option to surround it with a tag, link or other constructs. In this particular case, if we select a tag, we’ll be presented with a second menu which allows us to define the actual tag. ReSharper provides a list of all tags currently on the page, but we are free to start typing our own:

5

as shown here (writing span):

7

or when iterating over a series of fields, we can invoke the foreach template:

9

resulting in:

10

 

Creating new Surround Templates

Below is a typical MVC Action. We receive a customer and save it to a repository

11

The data however might not always be valid. That’s why it’s wise to validate it before operating on the data. This is usually done in ASP.NET MVC checking the IsValid property of ModelState:

12

Let’s see how we can easily make a Surround Template to do this for us, that is go from the single _customerRepository.Save(customer) to the code above*.

1. Open the Surround Te
mplate
tab using ReSharper | Live Templates | Surround Templates

2. Create a new User Template, by right-clicking on User Template and selecting New Template

13

3. Enter the follow text in the Template Editor, giving it the name ModelState:

14

With Live Templates and File Templates, we generate text from scratch. With Surround Templates, we mostly select existing text and our intention is to work with it. As such, ReSharper offers a series of pre-defined variables that helps us with this task:

Variable Description
$SELECTION$ The selected text when invoking the template
$END$ Where the cursor should be placed on termination of template interaction
$SELSTART$ Denotes the start of selected text after template has been invoked
$SELEND$ Denotes end of selected text after template has been invoked

The new items here are $SELECTION$, $SELSTART$ and $SELEND$, which we’ll see their purpose shortly. As always, anything else in between the $ will act as a variable on which we can apply a macro.

4. Similar to File Templates, in order to make this efficient, we need to add it to the quick list of templates. Drag the newly created template. You can optionally set the filter to C# files only. See previous entry on Live Templates to see how to do that

 

15

5. Close the Template Editor.

6. Select the line of text we want wrapped in the template and press Ctrl+E,U. Choose ModelState

16

We should now end up with the following:

17

Refining the template

As it is now, the Surround Template created assumes that we always want to perform a RedirectToAction, which is the norm**. If however on occasions we want to perform some other operation, we can make it easier to replace the default RedirectToAction call by selecting the text. As such, all we need to do is start typing to delete it. We can do this using the $SELSTART$ and $SELEND$ variables as shown below:

18

This is now telling ReSharper to prompt for the variables, but to ultimately select the entire RedirectToAction for us to replace it if required. If we are OK with this default, we can hit ESC. We also change the order in which the variables are prompted for to make it more convenient.

Summary

Surround Templates offer us a way to conveniently add construct around existing code with ease. They are different than Live and File templates in that the concept of a selection exists. With Surround Templates, we cover the three different types of Templates that exist in ReSharper. In the last part of this four part series we’ll see how we can create new macros to extend the ones ReSharper offers us when playing with variables. This will allow us to do all sorts of things with templates.

 

Notes

* I’ve used this as an example because it’s all too common to see this approach. Personally however, I recommended using AOP to avoid constant repetitive code duplication across actions.

** This is known as the PRG pattern: POST-Redirect-GET. The reason we do this and not return a View is because if the user presses the Refresh button in the browser, it would act as a new POST. In this case maybe nothing will occur, but think about adding new records for instance. By first performing a Redirect and then doing a GET for Index, a refresh will only cause a new GET of the request we redirected to (in this case Index action).