6 Web Design Tips for Beginners

I’m a newbie in a number of things, and web design is one of them. I created my first real web page just a few days ago, though I’ve been tinkering with my own website for quite a while. (No, I’m showing it to you, yet). But I’m a fast learner as well. So before I move on from newbie to intermediate, here are some things that I’ve learnt, which might be useful to beginners.

1. Use simple tools

Many people, both beginners and experts, think that the bigger and more complex your tools are, the better you will be at something. Wrong! The problem with complex tools are that they take time to learn. As a beginner, your priority is to learn web designing, i.e. the proper use of HTML, CSS and graphics to get what you want. You’ll only be wasting your time if you try learning a tool without learning the basics first. Remember that the various IDEs and other tools are written for people who already know what they are doing and just want to make their work cycle more efficient. I would personally say that you only need three things: a text editor, a browser, a HTML validator (more on that later). A corollary to this is that you should learn to write HTML and CSS and not rely on a WYSIWYG editor.

2. Validate your code

Always write web pages that conform to the W3C standard. And once you finish making a page, make sure you validate it and correct any errors. Avoid the use of deprecated tags, they have been deprecated for a reason and their replacements are mostly better solutions.

3. Learn some graphics editing.

The modern internet is very much graphical in nature and it’s going to stay that way. HTML and CSS can take you a long way, but they certainly have their limitations. If you want to make professional-looking web pages, you’re going to have to learn to do some graphics. You don’t have to become a digital Picasso, just learning how to make good buttons, headers and backgrounds and how to use gradients and color combinations will take you a long way. That doesn’t mean that you have to go shell out $600 for PhotoShop, just use the GIMP, it’s free and can do pretty much whatever PhotoShop can. There’s a good starting point here.

4. Learn Liquid Design

Computer resolutions range from 800×600 to 1600×1200. Making sure that your web page looks the same in all of them may seem daunting, but it can be done without much hassle if you make your designs liquid. Liquid design mostly involves expressing sizes in terms of a percentage of the screen size, rather than something fixed like the number of pixels. Of course it gets harder when you throw graphics into the mix, but it is possible to get a good mix of hard and liquid elements. This might sound like an advanced technique, but in truth it is just a good habit and like all good habits, the faster you start the better. And it will save you from worrying about compatibility across resolutions. This site should give you some ideas.

5. Plan Ahead

Don’t start making a site on whim. Do some research and make a good design before you start. Know what content the site will have, what visitors might be looking for and decide if it’s going to be heavy on graphics or focus on textual information. Also fix the color schemes and navigation layout you’ll use before starting. Planning everything together will let you use your time more efficiently and will make sure that you’re not constantly tinkering and changing things without actually finishing your project.

6. Use the Internet

There are a lot of well-designed websites out there and even more badly designed ones. Take a look at both types, learn from there mistakes and successes and apply that knowledge to your own context. There are also a large number of tutorials and guides on all aspects of web design, find them, read them and use them. Above all, show your works-in-progress to other people, get their feedback and try to incorporate that into your design.

Perl vs Python: Why the debate is meaningless

Competition is a common thing is hackerdom, and arguments over which one of two (or more things) is the better are common and keep coming and going (but never really go away). Some of the most common ones are: Java vs C#, Emacs vs Vi (and it’s clones), Linux vs BSD, Closed Source vs Open Source and everyone’s favorite: Microsoft vs everyone else. And the internet is littered with evidence of these great wars (which none too rarely take on epic proportions) and some digging will throw up evidence on forums, website, bulletin boards, Usenet archives and of course, blogs. Today I’m taking a look at one of these wars that I’ve had personal experience with: Python vs Perl.

The last few years of my life have been filled with an as yet unfulfilled to learn some real programming (see last post). A few months ago I sat down to really learn Python, because I had a read a lot online about how it is a great beginner’s language (though I’m not really a complete newbie at this point). Anyway, I’ve been at it for a while and I’m liking how things are going.

But before I had started Python, I had a brief brush with Perl a year ago. At first glance it seemed something I had dreamed of. After struggling through memory management in C++ and Java and sitting through long compile times (which are really irritating if you’re a new programmer making lots of mistakes), Perl’s write and run was a dream and built in memory management made me a lot happier. But it didn’t take too long for me to get dissatisfied. Reading other people’s code was never very easy and variables behaving differently in different contexts was not something that I liked. I left Perl in just over a month.

Looking for an alternative I quickly found out about the Python vs Perl debate and was especially inspired by Eric Raymond’s Linux Journal article. I started Python and quickly fell in love with it. It had all the things I liked in Perl, but none of the eccentricities that I had wanted to leave behind. For a long term I didn’t give Perl another thought. But being the avid netizen, open source fan and linux lover, I kept reading about Perl here and there. So, last December, I decided to look into Perl again.

What I found out since then is that the Perl vs Python debate is rather like apples vs oranges. One of the biggest complaints about Perl is that it is untidy. Perl’s philosophy of “There’s More Than One Way To Do It” means that there are numerous ways to twist your code syntax around and it can be made absolutely unreadable. And it’s not just the syntax. Perl’s later features, especially object-orientation, have a distinctly kludge-like feel about them, as if they were simply slapped on later rather than integrated. Python, on the other is much cleaner and better designed. But there’s a twist to this tale. It’s this: Perl and are Python are very different languages.

Firstly Perl was not meant to be a general purpose language. It was meant to be a sort of shell-script on steroids. It’s a glue language, aptly called a Swiss Army Chainsaw. If you have a myriad of different programs and data sources and all you need to do is bind them with the electronic equivalent of duct tape, use Perl. Keeping Perl to it’s original uses makes most of the problems disappear. You don’t come into contact the kludginess of more advanced features because you will rarely (if ever) use them and readability isn’t so big a problem, because your programs will not genrally be more than a hundred or two lines.

Python on the other hand, is a more general purpose language. Features like object orientation are better implemented because you’re expected to use them all the time. And there is a definite emphasis on writing clean code because your programs will be big with complex tasks, not just delegating to other programs.

So the final word is this: choose your tools carefully. If you need something that will update a web page with a list of recently played songs, use Perl. A good example of how to use Perl effectively would be Xterminus’ changes page, which uses a Perl script to gather data from his del.icio.us account and his wiki software and create a pure HTML page. If you want to write anything with more than a few layers of abstraction and of more than medium complexity, grab Python. If you have any experience with these two, let me know.

Tomorrow’s debate: Emacs vs Vi

Update: I had said above that I found memory management in Java and C++ tedious, I admit that was something of a typo. I hadn’t meant to say just C++. Thanks to Digg and Reddit users for pointing this out.

The 5 year programming plan

I’ve been trying to learn programming for a number of years and I really haven’t gotten too far. My first brush with programming was with BASIC and I never learnt much beyond FOR. My first real programming language was Java. I learnt some more, but nothing beyond simple inheritance. On the way I tried twiddling with C++ and failed miserably (I won’t go into details). The reasons for my failures were numerous, including bad teachers, bad syllabi and my own inability to settle down with a good text-editor rather than IDE-hopping. But enough is enough. I’m finishing school in a few months and then I hope to get a Computer Science degree in college. So I’m starting a 5 year plan to really learn programming starting now and going upto 2011 when I graduate.

Before I outline the plan, here are the basic premises on which the plan is based: I should learn at least one programming language and one programmig tool each year. By “learn” I don’t mean knowing everything that there is to know about the language, or learning all the available extensions and toolkits that are available. By the end of the year, I should be able to write significantly large program without having to lookup documentation too regularly. I should also be able to read other people’s code and understand what is going on without much difficulty. As part of my project, I’ll also be implementing at least one large project. As you may have realized by now, all this leaves room for a certain amount of ambiguity and interpretation, but that’s ok for me, because I think that it’s good to have some amount of flexibility in one’s plans. Without any delay, here goes:

2007

  • Languages: Python/Perl/Shell Script
  • Tools: Emacs
  • Project: A PIM with internet backup and synchronization

2008

  • Language: Java
  • Tools: Eclipse
  • Project: Undecided

2009

  • Language: C/C++
  • Tools: Undecided
  • Project: Perhaps some sort of Databsse application

2010

  • Language: Ruby
  • Tools: Rails
  • Project: Perhaps a reimplementation of my previous apps to a web framework.

2011

  • Language: LISP
  • Tools: SLIME
  • Project: Undecided

As you can see, there is a fair amount of stuff that is currently undecided. I intend to fill in the blanks as I learn more abouot the langaguages and programming in general and where to use what. Another thing that i should mention is that since I’m going to be using Emacs, I suppose I will have to dabble in Elisp a bit, but I’d like to keep it to a minimum until I actually start learning LISP. If you’re a programmer and have had experience with anything listed above, any advice would be welcome.

One Calendar to Rule Them All

Gather round boys and girls, and let me tell you a tale of frustration, anger, moments of joy and a great journey in search of the perfect time-management tool. Let me tell you a tale of online calendars.

I’ve been looking for the perect calendar for quite a while. My first round of searching took me to HipCal, Kiko and Google Calendar. But I didn’t like them. HipCal had too few features, Kiko was cluttered, Google Calendar had just been released and was horrendously simple. I tried using to-do lists like Remember the Milk instead, but I realized that I needn’t a calendar. Being a full-time student, I need a way to divide the day into portions for various subjects. I needed something that focussed on the time and the day, not just on the task. I needed something with color coding, which allowed easy grouping (preferably with tags) but could show multiple groups together. So I went back to my search and finally settled with 30boxes. It was a really nice product. Adding things was extremely simple using natural language in the Add bar, you could use colors and tags and the user interface was sleek, efficient and good looking. I was happy.

Along the way, I heard about a new startup called Scrybe. I signed up to be added to their private beta and promptly forgot about them in a few weeks. I stayed with 30boxes for about 3 months before something unexpected happened. A few days ago I suddenly got an email from Scrybe informing me about their progress. Like I said, I had forgotten all about them, but the email made me remember. I decided to check out Scrybe again, and I liked what I saw. The only real source of information about what Scrybe offered was a movie on their site. I watched the movie (I hadn’t seen it before) and it hooked me. Scrybe had everything that I had gradually felt missing in 30Boxes: Drag and drop reordering of events, a smart day view, and a proper to-do-list that integrated perfectly with the calendar. Over the last few months I had gradually become dissatisfied with 30Boxes. The ease of adding an event to the calendar was in sharp contrast with all the trouble one had to take to reschedule or reorder an event. The trouble with only one view was that it was hard to concentrate on events for a single day. And there seemed to be almost no co-ordination between the to-do list and calendar.

So I started searching again. This time my general requirements were the same as before. But with that I needed simple drag and drop reordering of events. Anything that needed me to manually change the times was out. I looked at HipCal and Kiko again. Kiko had drag and drop, but it was buggy. HipCal didn’t. I took a look at Planzo, it’s use of drag and drop were what I had been looking for, but it lacked in other more important ways: color coding was done by using groups, but I found no way to add new groups or to change the old ones. I checked out SpongeCell and to my great horror it said that my Firefox 2.0 was unsupported. At this point I was seriously thinking about going back to 30Boxes and making do with what it had, until Scrybe finally came out of private beta.

Upto that point I hadn’t really considered Google Calendar. I remembered having rejected it the first time, but for some reason, I couldn’t quite remember exactly why. Finally I decided to give it try. After all, I had once rejected Google Reader and now I use it exclusively for all my feeds. So I went back to Google Calendar, and behold! it was just what I was looking for! It had matured quite a bit. There was kinkless drag and drop functionality, the individual day view was awesome and the interface on the whole was the definition of sleekness. Although it didn’t quite support tags, the multiple calendars feature, each with it’s own color, combined with the option of showing all or only a few of them at a time was enough for my needs. Once again, after a long time, I was happy.

And that it is where the tale ends. Google Calendar is my schedule organizer and I love it. I am still waiting for Scrybe to be released and when it does, I will give it a try. But it will have to be incredibly good to lure me away.

Other Programming Languages for the Java Virtual Machine

Did you think the Java Virtual Machine was only for running Java programs? Think again. There’s a reason it’s called a virtual machine. By itself, the JVM doesn’t run any Java code. All Java code must first be compiled into bytecode which is then executed by the JVM. This system means that any programming language that can be compiled into bytecode can be used with the JVM. What follows is a brief list of some other languages that can be compiled to run on the JVM.

1. Java

This is the one that started it all. Java is one of the most widely used languages today, especially in developing corporate back-ends. Predominantly object-oriented, but with a syntax that should be familiar to anyone with some amount of experience with C/C++. It fulfills a wide variety of roles which is made possible due to a large and well-documented API and also a growing number of extensions for a variety of purposes. Being the language native to the JVM, it’s development is in sync with that of the JVM, with obvious benefits.

2. BeanShell

BeanShell is not strictly a language: it is a java interpreter which allows quick execution of Java code without actually compiling it.  However, BeanShell adds features like closures and commands similar to those found in scripting languages like Perl. BeanShell can be easily integrated as part of any Java program allowing it to be easily extended by writing new code without having to recompile. BeanShell is now destined to become an official part of the Java platform which means that it will be faster to extend already written applications.

3. Groovy

Groovy recently launched its 1.0 release and it is meant to be a full-fledged language capable of being used interchangeably with Java. It uses Java syntax but it is dynamic in nature and adds feature that are part of languages like Python or Ruby. Of special importance are its inclusion of both static and dynamic typing, closures and native syntax for lists, maps and arrays. Also of interest is built-in support for markup syntax like XML, which would make it handy for writing AJAX backends.

4. F3

It is a compiled scripting language, with an emphasis on graphics manipulation.  F3 is still in heavy development and has not been officially released. However, it looks promising and is capable of being used intimately with Java itself. It can call Java classes and create Java objects as well as calling their methods. This is certainly something tokeep an eye on if you are interested in user interface design and implementation.

5. Scala

As the website says: ” Scala is a modern multi-paradigm programming language designed to express common programming patterns in a concise, elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages.” Scala is mainly of interest if you are a computer science student. However it deserves mention because it is not tied to the JVM, but can run on Microsoft’s Common Language Runtime as well.

6. JRuby and Jython

These are implementations of Ruby and Python on the JVM. Though both are entirely usable, each has it’s specialities. JRuby in particular has ambitious goals of being more than just a port: it aims to allow tight integration with the JVM in turn allowing two-way communication between Java and Ruby code. Currently only interpretation is supported, but a compiler is being actively developed. Jython on the other hand has more conservative goals, but a lack of experienced developers with enough time means that it’s implementation of Python is at 2.1 while Python itself is approaching 2.5. So any code containing more recent features will not run.

7. Rhino

Once again, not really a language. It is an engine for JavaScript running on the JVM, capable of running in both interpreted and compiled mode. It is now a part of Java SE, thus making it easier to integrate JavaScript with Java programs and use JavaScript’s features with Java programs.

That’s a brief overview of what’s currently available on the JVM, and there should be something there formost programmer’s needs. In case you want to do the opposite: run Java programs without the JVM, the GNU Java compiler lets you compile Java code directly to machine specific binary.