Friday, October 28, 2011

TRouBLe is Useful

Web programmers have probably seen this a lot:
margin-top: 10px;
margin-right: 20px;
margin-bottom: 10px;
margin-left:20px;

The reason many programmers "need" 4 lines of code for such a simple thing, is that it's impossible to set the margin (margin is just an example, since this is also true for padding/border/...) to 20px, and then override just the top margin. But isn't there a better way?

Well, there is a shortcut for the above:
margin: 10px 20px;

Shorter, heh?
The parameters for attributes such as margin, are specified in this order: Top Right Bottom Left, or TRouBLe for short. CSS parsers are smart enough to apply the last specified parameters, to those that were omitted. So in the above example, I've omitted bottom and left, so the 20px value would be applied to those as well.
The general rule is:
* if only one value is specified - it is used for all (top, right, bottom and left)
* if two values were specified - the first will be used for top and bottom, and the second for left and right
* if thee values were specified - the first will be used for the top value, the second for the left and right values, and the last for the bottom value
If I wanted to set the margin-left to 10px, I'd have to write this "long" statement:
margin: 10px 20px 10px 10px;
Which is still shorter than the first example above.
Many times, the shortened syntax can be used, and save us some typing while increasing the expressiveness of CSS attributes.

EDIT: It seems I messed up a bit the order in which things are shortened. Thanks for Tomer for correcting me. I've updated the post accordingly.

Wednesday, October 26, 2011

Installed Apps Doesn't Show in Market

Today I noticed an annoying bug in the Android Market application: it showed only 3 applications under the "my apps" section in the market, even though I have over a couple of dozen installed.

Rebooting the device or removing the SD card didn't help.
Being rather new to Android, I was tempted to remove the market application, and reinstall it. But Android is much like Linux, and much less like Windows, so reinstalling an application would probably retain the old settings.

And then it hit me - the settings. Why not reset those?

Simply go to: settings -> applications -> manage applications -> market -> clear data
That's it. The next time the market app launches, it will rescan the installed applications, and everything will be fine again.
That's pretty robust, even though it's in a geeky way, since I don't expect most people to do that.

Friday, October 21, 2011

Best Windows Development Environment

I know, this one is going to sound a bit crazy, but hear me out. IMHO, the best Windows development environment is Linux.

First, let me start with a less surprising statement: the best way to run a Windows installation is on a VM. This should make perfect sense to anyone who runs Windows on a daily basis, and knows that as time goes by, it simply gets slower.
No registry or other cleaning utilities can return it to run as fast as it was the day you installed it.
Moreover, when one wants to test a new piece of software, the VM's snapshot feature really shines.
So, every once in a while, one can revert to the a stored snapshot, and get an almost fresh Windows installation, almost instantly.

When it comes to development environments, where one rarely install tools, and the code is managed in source-control, reverting to a snapshot is even easier.

My second point is: use the host environment that you feel most comfortable with. In my case, it's Linux. Specifically Ubuntu. If you prefer running a Mac or a different Windows as the VM guest, it's OK as well. But I can assure you that after giving Linux a trial period as the host OS, you'll find it the most pleasant one.

Moreover, if cross platform compatibility is an issue for you, having Linux *and* Windows running simultaneously, is a great advantage and a real time saver.

Sunday, September 25, 2011

C# Extension Methods

One of my favorite features in C# is Extension Methods. Let me explain why.

Did it ever happen to you that you needed to add a method to a class you cannot edit, and inheritance couldn't help as well?
This can happen in various opportunities, especially when working with libraries and SDKs that uses a certain class for its internal operations, and exposes this class to the user as well.

In such cases, in languages that doesn't support extension methods, the only way to add functionality to that class, is to write a "helper" class or method, and use it.

C# Provides a better way.
Let's say you have a blogging system, and you have a blog summary page, that displays only the first 100 characters of each post, as a teaser. There could be many ways to get the shortened text, but image you could have your own String class, that provides a method that displays the entire post if it's less than 100 characters long, and displays only the first 100 characters and "..." if it is longer.

Have a look at the following extension method:


public static class StringExtension
{
        public static String ShortenText(this String str, int length)
        {
                if (str.Length > length)
                {
                        return str.Substring(0, length) + "...";
                }
                return str;
        }
}


Simple. This code needs very little explanation. All it does is create a new extension method for the String class that implements the logic described above. Here's a sample usage for this new method:

Console.WriteLine("12345678".ShortenText(5));


The output of this would be "12345...", as you'd expect.

The possibilities of extending built-in classes provided by C# and the various libraries, such as ASP.NET MVC, are endless. Just make sure you don't abuse it.

The full source code of the sample given above is available on my bitbucket samples repository. It compiles on Mono as well as on MS C# compiler.

Friday, September 23, 2011

Ubuntu 11.04 and Unity

For a long time I've been a 10.10 user. Probably too long. To tell you the truth, I couldn't care less. Everything was so customized to my own needs, and everything worked perfectly.
Moreover, since most of my development nowadays is done on a Windows box, I didn't feel the urge to try something new on Linux.
Finally, there were so many bad reviews about Unity, and "thanks" to those I had second thoughts about replacing the desktop environment.

Last week I took the "risk", and you know what? I love it!
I had 11.04 installed both on my workstation and my laptop, and I can easily say it's one of the best Ubuntu versions I used.

On my laptop, I rarely connect a mouse, and I hate touchpads. This means I use the keyboard almost exclusively. Unity seems to be adapted to this, so it provides great keyboard shortcuts. Now I need the mouse even less.

On the workstation, even though I have a big screen with a "big resolution", I always try to find the best utilization for the screen space real-estate. If you ever seen a those 30" mac wide monitors that have the mac dock dragged to the left edge, you know what I'm talking about.
Unity also knows what I'm talking about.

Also, performance is great, as ever. Far better than using Windows. Ubuntu never misses this one.

I wish I didn't wait so long to try Ubuntu 11.04 and Unity. On the other hand, since this version is quite mature, there's a chance I saved myself some of the glitches and bugs it had 5 months ago.

Sunday, September 18, 2011

Trello and Blogging

If you're following TechCrunch Disrupt, or have been reading the recent news from Joel Spolsky, you've probably heard by now about Trello.

If you haven't, let me bring you up to date. Trello is a note taking application aimed to replace ordinary to-do lists and sticky notes used in project management. Every note taken, dubbed "Card", can be much more than a sticky note, as it can contain background text, votes, embedded objects and even someone "assigned" to the card. Cards are organized in lists which are organized in boards.
If you've ever seen agile project management techniques, such as Scrum, you'll be familiar with the board filled with columns of sticky notes, and sticky notes being able to "move" between columns. That's exactly like that.

So far, in order to see what Trello is worth, I've been using it to manage ideas for this blog.
Up until now, ideas for posts where mostly in my head, with some starred items in my inbox that contains the research I did. Now, I have a board with "Ideas", "Collecting information", "Writing", "Follow comments" and "Done" columns. Finally, my ideas are organized and I have a place save the information and even order/rank the ideas before writing posts.

I can see now that I have two ideas I should be working on. If you have more ideas for stuff you want me to blog about, leave a comment, and I'll treat it when this post will reach the "Follow comments" phase.

Monday, August 22, 2011

Home Mercurial Server

I hope I'm not the only one who had this problem:
I've been working on some code demos and web designs and wanted to having it under source control, so I could keep track on changes, work from multiple computers and generally have a backup for everything.
For normal projects, I guess this should be done as an open-source project on bitbucket or github, but in some cases it's simply more convenient to have the repository at home.

So, I installed a Mercurial server. Want to know how?

The only thing you'll need is the Mercurial installation for your favorite OS (yes, Windows included). After installing it, run
hg init RepoName
this will create a repository called RepoName under the current directory.
For the next part, I'll assume the server is accessible only inside the home network, and there's no need to configure extra security measures. So, create a script that servers this repository inside the the repository directory:
hg serve --config web.push_ssl=No --config "web.allow_push=*"
All you have to do now is to schedule this script to run on boot time.
Now, from any machine on the network you can use commands such as:
hg clone http://ServerName:[probably_8000]
to work with your new Mercurial repository.
That's it.

Having a "development server" can be very handy, as it could also hold other documents (NAS functionality), personal wiki, local deployment server, etc.

Saturday, August 20, 2011

People Skills

I've just read this great post which I found on Hacker News, and felt sympathetic.
For too many times in my short career I was forced to work with people that has no people skills. Those people held a programming, admin or other technical roles, which means they weren't "customer facing", so for the employer, there was no need to require people skills when hiring them.

But that's a wrong call in my opinion. Even if the people in question were among the top 5% of the most professional people I met, I'd rather not work with them at all, than suffer their presence. Even if that means spending a few more days on solving some technical issues.

Many things bother me with such people:
  1. Some of them know they're so good at what their doing, and leverage their bad people skills in a way that no one would be able to learn from them. This gives them job security.
  2. Some of them use the fact no one wants to communicate with them in order to get this quiet room "in the basement".
  3. If there's a "dirty job" that involves communicating with customers, obviously they aren't tasked with handling it. That's an ugly way to get only the "nice" tasks.
  4. They get away with ugly code, since no one wants to communicate with them and get them to beautify it or write documentation.
So yeah, I know many people don't go to work in order to socialize, but having people with zero people skills, no matter how professional they are, simply hurts the organization.

When it's time for me to hire employees, be sure that having decent people skills will be a criteria.

Friday, July 22, 2011

Twitter - part 2. Android.

Twitter

So my Twitter 30 days challenge is about to be over, and I think I'm ready to summarize it and write some conclusions:
  • I'm following 17 people, and have 9 followers. Only recently I began to gain an audience. Just like with blogging, it takes patience and persistence.
  • So far I made 43 tweets. I'm pretty pleased with this number.
  • Except for once or twice, all of the replies to my tweets were done on Google Buzz, which is connected to my Twitter account. That's pretty lame, and makes me want to lock both services - more on that, later.
  • Tweeting is fun. I didn't think I'd say that.
  • The TwimGo client for N900 is great. The official Twitter client for Android is just perfect. Not having a Twitter mobile client renders is useless. This could be another reason for Google Buzz failure, as it doesn't have a decent mobile client.
  • 140 characters limit makes a lot of sense when posting from mobile. Longer than that is cumbersome. When posting from PC - it's too limiting.
So, am I going to keep using Twitter? For following people - yes. For replying to people - yes. For publishing stuff - probably no.
I guess most of the stuff I publish today on Twitter, will be published to "public" or "extended circles" in Google+ instead.
This means that my short "romance" with Twitter will probably end soon. While it's a lot of fun, it provides little gain compared to Google+. Perhaps had I joined 2 years ago, I'd stick to it until I know my followers would follow me to Google+.
It doesn't mean I'm going to generate too much noise in Google+ either, since I believe posts that complains about the Israeli heat will probably be published only to "Friends".

As a final note for this topic: I just removed the Google Buzz tab from my GMail and disconnected all of the accounts associated with it (Twitter, Google Reader, this blog). Since I never bother looking at the Buzz tab in Google+, this means I will ignore everything going on in there. I don't see the point of having a place where I need to follow people's comments on stuff published in other places. Comments for this blog should go here. Comments for Google+ should go there.


Android

This week was a happy and sad week in terms of mobile devices. Not sad as in tears, but somewhat sad. After 10 years of owning 5 different Nokia devices, I switched to a brand new SGS2 running Android Gingerbread. My last Nokia device was the N900, which is by far the geekiest toy I ever owned. No other smartphone can be tinkered by modifying things under /etc, and get updates using apt-get. A truly open-source device.

In the past few days I had very little time to dig into Android. They say it's Linux. IMHO, it's barely noticeable. No glibc, different filesystem structure, etc. I learned about odex, kernel versions and other fun stuff that will surely waste (in a fun way) many hours of my time in the near future. Can't wait.

P.S - if you want to follow me on Google+, you can use gplus.to/mosh. I don't know how long this link will last, though I hope forever.

Sunday, July 10, 2011

When the Safety Net Fails

It's been quite some time since my sysadmin/DBA skills were put to test. Usually, when they do, it means something bad has happened.

Recently, a server I'm responsible for, suffered some a catastrophe in the form of a power outage. Usually, when such things happen, and the UPS (if such exists) fails, one is still relatively safe, since corruptions to the data itself will be handled by the RAID. This means that if one HDD fails - you can pull it out and push in another - and everyone's happy.

Not my case. In the last power outage something far worse has happened - the RAID controller died. As you may know, with many RAID controllers this means long nights of data recovery, since rebuilding the RAID will cause initialization of the disks, which means total loss.

This is the kind of the events no one is planning for in terms of redundancy. The only redundancy possible is a second server in a cluster configuration, but it doesn't solve exactly this problem, and has its costs. Backup is another form of "redundancy".

So, the component that was supposed to save us in case of failures - failed us.
Luckily, with some witchcraft, we managed to reconstruct the RAID, losing only 1 of the logical drives. That drive had to be restored from backup. Yet, that was the easier thing to do, as another drive, containing the DB, appeared to be alright, while it actually hid a far worse problem - corruptions in the DB. Did I already mention it's good to have backups?

My conclusions were also applied on my home equipments - have a detached (as in "doesn't require power 24/7") backup, and get yourself a good UPS.

Sunday, July 3, 2011

Why I Love C# and Mono?

Let the comments in the code do the talking.
--------------------

using System;
using System.Collections.Generic;

public class Iter
{
    public class Book
    {
        //short way to declare a property:
        public string Title { get; set; }
        public string Author { get; set; }
    }

    public static void Main(string[] args)
    {
        // implicit type, yet still a strong type:
        var books = new List<Book>
        {
            // inline initialization:
            new Book { Title = "Book1", Author = "Moshe" },
            new Book { Title = "Book2", Author = "NotMoshe" }
        };
       
        // closure, lambda expression:
        books.ForEach(book => Console.WriteLine(book.Title));
    }
}

--------------------
Did you know C# has all of those cool features?
This is why I think that even if you're not going to write code in C#, you should get familiar with it.

Saturday, June 25, 2011

30 Days. Twitter.

A while ago I started considering doing those 30-days challenges. The benefits are obvious, and the fact they're published gives motivation to actually stick to the plan.
So, I already have several such challenges in mind, and some were already started. For example, taking the stairs instead of the elevator in the building I'm living in. I'm on the 4th floor, so it is a "free exercise".

Another thing I had in mind for a while now, is using twitter. It happens to me every day: There's some new technology I want to blog about, but when I start thinking about the actual post, I realize it would take me no more than 2 lines. For example: I installed Firefox 5, and thinks it's great.
So instead, I opened a twitter account (@technomosh), and I'm planning to post those short musings there. Hopefully people will follow me, and discussions would develop.

What does this have to do with 30 days challenge? Simple. Basically, up until now, I wasn't a big believer in Twitter/Identi.ca/Buzz/etc. So my first instinct is to ditch the Twitter account a second after I opened it. Instead, I just installed the wonderful TwimGo on my N900, so it would be easier for me to post some tweets. Hopefully, in 30 days I'll know whether Twitter helped me in getting those musings off my head, or didn't.

Monday, May 30, 2011

A Quick Productivity Tip for Windows Users

As you may recall, I'm a big fan of keyboard shortcuts, and generally prefer those over using a mouse.

Still, there are keyboard shortcuts that are not comfortable, especially those that require the control/alt key in combination with a F key. For instance, Alt+F4. The reason for this is that one must lift at least of on his hands from the keyboard in order to use this combo.

Luckily, someone at Redmond thinks like me, and in Windows 7 (didn't test on other versions of Windows) one can use Ctrl+W to close the current explorer (the file management tool) window. Just like in your favorite browser and preferred IDE.

Too bad that in order to edit the current location, one still needs to use Ctrl+F4. I'd expect Ctrl+L to work. Anybody from MS reading this?

Wednesday, April 13, 2011

Needed: Ruby/Rails Developers in Israel

I just read Ido's great post, and couldn't stop myself from writing a response post.

Basically, what we have in Israel is a chicken-and-an-egg problem. Why? because there will be no Rails programmers if the market (=big # of companies) would require it, and no company would shift to Rails development if there would be no developers to make it do that.

The problem starts in the way developers are "born" in Israel. They are either:

  1. become developers during their service in the IDF - no Rails there.
  2. become developers after a relevant academic degree - AFAIK, no Rails there either.
  3. become developers in different ways, most of those would try and learn technologies which are required by the market. The remaining few that would bother learning Rails (or Django) are probably those who also read this blog.
I think that in the US market, especially in the Silicon Valley, this is not the case. Developers there are educated differently and are much more likely to be exposed to Rails. The only Rails developer I know - learned it while working in the Valley.

Here's another one for you: how many Israeli web-hosting companies do you know that supports Rails? How many for PHP/Java/.NET?
So, even if I'd try and develop a Rails application for the local market, I'd have to host it abroad, which is a shame.

A while back I did a short survey regarding the buzz around Rails development and other web frameworks. Check out the replies. How many chose Rails?

Finally, I must admit that I'm no better. I had a chance to choose Rails recently, but didn't. Sorry, I couldn't find others whom I could hire if needed.

Monday, April 4, 2011

.NET MembershipProvider with MySQL

If you're a .NET developer (Mono or MS, doesn't matter) and an OSS enthusiast, then you're probably using the MembershipProvider provided by MySQL instead of the default MS provider for MS-SQL. The MySQL MembershipProvider comes bundled within the MySQL Connector for .NET.


In certain configurations, one can expect various bugs related to the MySQL Connector, especially with the latest version of MySQL Server and/or Windows and/or IIS. The most annoying thing about such bugs is that they don't introduce themselves on a development machine (different web-server, different OS, etc.).

My latest bug involved getting NULL for Membership.GetUser calls, even for logged in users. The bug  would occur inconsistently, which made stuff quite hard to debug.
The solution? simple - always use the latest version of the MySQL Connector.

This is why I always plan the first-time production deployment to take a few days. You can never tell what will go wrong.

Thursday, February 24, 2011

Nokia, What Went Wrong?

I've been using the Nokia N900 for a week now, and it made me wonder: how comes there are no more Maemo based devices out there, and how comes Nokia's CEO states they're standing on a burning platform?

The N900 hardware is great, yet nowadays it doesn't stand out. Other companies produce hardware with the same quality. It's the software that makes all the difference.
The Maemo platform should appeal to every nerd and every software developer, as it is based on Debian, and porting applications to it is so simple.
As a result, it is capable of running some truly amazing applications, such as Firefox (including addons) and games that were ported from the PC.

I've set up a dual boot with Android, so I could compare stuff, and access applications that aren't available for Maemo. And although there are quirks in the Android (NITDroid) port, it's successful in providing the full Android experience. And you know what? I don't use it. There's no point in booting into Android when everything can be easily done with Maemo, and sometimes even better (like having a full, real, browser).

The two apps I do miss, though, are Shazam and Waze, and I believe that had Nokia continued developing the Maemo platform, ports of those apps would've become available as well.

Some of the best things I find in the device are:
  • Integrated IM/VoIP with Skype/GTalk/MSN/FreeTelecom/Jabber/etc.
  • USB Host.
  • Really useful desktop gadgets, and not plain icons that represents apps.
  • DLNA.
  • apt-get.
  • A full, real, browser. Renders everything exactly the way the desktop Firefox does, including flash.
  • QWERTY keyboard.
and the list goes on...

So my question to Nokia: why did you stop developing this platform?

Sunday, February 6, 2011

Sometimes IE/FF renders fine, and Chrome doesn't

Twitter style post (125 characters, not including this header):

After two hours of head banging on a bug in my HTML/CSS being rendered differently in Chrome, it appears it was a Chrome bug.

Friday, January 14, 2011

JavaScript Implementation In Different Browsers

In Hebrew, when counting or describing objects, it matters whether the object is considered as male or female. A table is male, while a television is female. As far as I know, this rule applies to Russian and other languages as well.
What's nice about humans is that if they use the wrong form, like a female form for a table, people around them would still understand what they're talking about. Although some might think that the language is ruined. That's OK.

When it comes to programming languages, things are different. Computer languages are supposed to be considered as an exact science, thus, if one not using the syntax correctly, the code won't execute.

Or so we'd like to think.

Consider this loop in JavaScript:
var i = 0;
do {
i++;
} while(i<2);
alert("done:"+i);


As you might expect, it would popup an alert box with "done:2" as the message. This would work on any JavaScript implementation I'm aware of.
Now, let's make a tiny difference (like using the female form in Hebrew, which is only a bit different than the male form):
var i = 0;
do {
i++;
}; while(i<2);
alert("done:"+i);

What was changed? Notice the semicolon (;) before the "while" statement. Try this using your favorite browser. If you get "done:2" as before, I urge you to replace your favorite browser immediately.
This piece of code shouldn't work. It has a syntax error. The semicolon is "unexpected".

Internet Explorer ignores that, and the code works as before. Other browsers (Firefox, Chrome) would halt the script execution.

I'm willing to forgive when people don't follow the Hebrew syntax down to the last rule, but when it comes to code - I'm unforgiving. Moreover, I'm unforgiving to the guys that implemented a "fuzzy" interpreter for a programming languages. This is supposed to be an exact science.

Let me give you another example. In this case, I'm not sure with which implementation I agree:
alert([1, 2, 3, ].length);
alert([1, , 2, 3].length);

Firefox and Chrome would print "3" and then "4", while Internet Explorer would print "4" twice. Basically, each array has an "empty" (undefined) element, so their length is supposed to be the same. But it appears that Firefox and Chrome would drop that element if it is the last one in the array.

Sunday, January 9, 2011

The Difference Between DIV and SPAN

Every now and then I see people wonder about the difference between the DIV HTML tag, and SPAN. Sometimes, people do some trial and error with the two before deciding which fits better for the problem at hand.

So I decided it would be a good idea to clarify this issue.
The DIV element is a "block" element. This means it occupies a full block when rendered, which also means that by default the browser will render a new line before and after rendering the DIV element. SPAN, on the other hand, is rendered inline. This makes SPAN perfect for formatting text which is part of a paragraph.

Want to see the difference? Create an HTML file containing the below code, and run it in a browser:
<html>
<body>
<p>Here goes for span: <span style="color:red" >hello</span> world</p>
<p>Here goes for div: <div style="color:red">hello</div> world</p>
</body>
</html>

And if you're lazy, this is how it looks like:

Here goes for span: hello world


Here goes for div:

hello
world



Makes sense, right?