28 September, 2007

Basecamp Review

This entry was originally posted on the omnistaretools.com blog. It is reposted here for reference only.


Good project management software is hard to find, but thankfully, after you read this, you won’t have to go looking very far. That’s because our group here at Omnistar Etools has already found the ultimate project management software: 37signal’s Basecamp.
Basecamp has everything you could ever want: an ease of functionality that allows even the most computer illiterate to understand and participate, an intuitive interface that allows and even encouragesclear communication, and a beautiful design that will get you bonus points every time you use the software with clients.
Using Basecamp makes it very clear how closely good communication is linked to completion of projects on time and as ordered. With Basecamp, everything is so easy to use that poor communication on a project is nearly impossible. And the tools used to track hours spent on a project makes it clear exactly how efficiently work is coming along on each type of task.
Perhaps more impressive is the ability to use Basecamp not just with your employees, but also with clients to keep them abreast of projects as they’re being worked on. Keeping clients ‘in the loop’ has never been so easy: you can upload files for viewing, and they can easily leave comments that can be replied to at will. And since the site design is fully customizable, you can maintain the look and feel of the rest of your site.
But by far the best thing about Basecamp is the main Project Overview page. There, you can see exactly how everything is progressing, with upcoming deadlines, details of who is responsible for what, and reports of how many hours each person has spent on doing their assignments. Plus, it even creates an RSS feed, so you can be informed at your convenience or even on the go via PDA or cell phone!
Basecamp truly does offer everything you’ve ever wanted in project manangement software, and then some. If you haven’t used it before, you will be amazed at how simple a thing as ease of use will streamline your project completion. We use it here at Omnistar Etools every day, and it truly is something that we cannot imagine going without. It truly is the last project management tool you will ever need.
Posted by Eric Herboso
Did you enjoy this article? If so, then subscribe to my RSS Feed.
There are more resources available at our On-line Webmaster Resource Center.

27 September, 2007

Why Typography is Important


When designing your site, a common mistake is to spend all your time working on nothing but content and layout. But, as in most things, it is always the little things that make you stand out from the crowd.
Typography is, when you think about it, one of the most important design decisions you can make on your website. Sure, your color scheme, layout, and logo are just as (if not more) important, but remember that the whole point of getting visitors to your site is for them to read your content, and that means that more than anything else, your site visitors are going to be looking at your typography near-continuously. So you can see why choosing a good typographic style is extremely important for every web designer.
There are a few main issues that you have to keep in mind when dealing with typography:
Minimalism
Never use more than three different fonts on a single page, unless you have an exceedingly good reason to. One for headers, one for subheadings, and one for content is more than enough.
Serif versus Sans-Serif
Serif fonts do not scale to smaller sizes well, so copy should always be in a sans-serif font. Headers are a different matter, so long as they are larger type.
Using CSS
Site-wide typography decisions should always be maintained at the stylesheet level. This is important for three main reasons.
  • Good SEO technique requires content keywords to be coded semantically–headers should use tags, and emphasized content should use tags. By keeping typography out of the html code, you make it easier to code semantically, and to update for keyword-related issues later on.
  • Your pages render better. On dial-up connections, if you don’t use CSS, then every time a new page is loaded, the browser has to read the style commands over again, and so momentarily, your site will look very different from how you wish it to appear. With CSS, this problem occurs only on the first page load; every subsequent load uses the same style sheet, and so the problem never recurs.
  • Bandwidth conservation & load times: by using CSS for typography, you save on bandwidth costs and your pages will load faster as a result.
Font-family attribute
It is sometimes tempting to resort to all kinds of fancy font faces, but remember that the end user will only see the fonts that they have installed on their computer. As a consequence, you must always remember to cite a number of fonts, from your first pick to your last, ending with a description of the font-family you prefer. For example, you might use the following in your stylesheet:
h1   { font-family: Garamond, Georgia, serif; }
body { font-family: Verdana, Arial, sans-serif; }
Column width
Dictating a maximum column width is useful for many reasons, but the most important one is that when you have a large block of text, it is much easier for the eye to read the text in narrower columns than in columns that take up the entire monitor width. Magazines and newspapers limit column width for the same reason you should: the human eye finds it much less stressful to read in smaller blocks of text.
Browser variability
Remember that how your site looks on your computer is not necessarily how it may look on someone else’s machine. Every browser may show typography differently; that’s why you have to pay careful attention to your css specifications.
Of course, this is certainly not all you’ll ever need to know about typography. But it is a start that will not only make your site more user-friendly, but also will help to keep more visitors coming back. After all, that’s what being a webmaster is all about.

24 September, 2007

Ahmadinejad at Columbia University

Today, I saw Iranian President Mahmoud Ahmadinejad speak at Columbia University. I'd like to share a few highlights of the encounter, and I don't just mean the novelty of dealing with secret service agents staring down the visitors, nor the protesters outside, nor the fact that if you got up to use the restroom, you weren't allowed back into the auditorium. Instead, I want to share what I heard, as well as what I felt.
The event started with the President of Columbia University "introducing" Ahmadinejad--but what started as a simple introduction turned into a speech all by itself. Columbia President Lee Bolinger remarks included this amazing initial salvo:
"Mr. President, you exhibit all the signs of a petty and cruel dictator...."
Bolinger then listed item after item pointedly asking President Ahmadinejad about policies such as his statement two years ago that the Holocaust did not happen, and whether he was using nuclear threats to hide the fact that he was an incompetent president of his people. He said that either Pres. Ahmadinejad was "brazenly provocative or astonishingly uneducated". He claimed that Iran is the leading country in executing minors, and asked very pointedly why women, members of the Baha'i faith, homosexuals, and academics have all become targets of prosecution in Iran.
Bolinger's 'introduction' lasted thirty minutes. During this time, President Ahmadinejad patiently waited for his chance to speak.
Finally, Pres. Ahmadinejad took the podium. He started, as most Muslims of his type do, by reciting verses from the Koran, which really turned me off, but you really have to put up with such cultural eccentricities, I suppose, if you ever want to mount a successful dialogue.
Then he finally started, thanking God for his chance to speak to an academic audience. His initial words I am copying here from the Associated Press reports that came out, instead of by memory:
"At the outset, I want to complain a bit about the person who read this political statement against me. In Iran, tradition requires that when we invite a person to be a speaker, we actually respect our students and the professors by allowing them to make their own judgment and we don’t think it’s necessary before the speech is even given to come in with a series of claims and to attempt to provide a vaccination of sorts to our faculty and students. I think the text read by the dear gentleman here, more than addressing me, was an insult to information and the knowledge of the audience here, present here. In a university environment we must allow people to speak their mind, to allow everyone to talk so that the truth is eventually revealed by all."
The audience bursted into applause at this point. I don't usually applaud unless I really appreciate a point, but I have to admit that I ended up clapping, too.
Pres. Ahmadinejad then went on to mention that he would indeed answer Pres. Bolinger's questions, but that first he had much to say. He added that many of Bolinger's facts were incorrect, and that they were in some parts exaggerations and in other outright lies.
Then Ahmadinejad went into that mode of speech that I so came to despise back at Spring Hill College: logic combined with religious crap. Think apologist-style, for you catholics out there. Something about science is illumination, god loves illumination, therefore god loves science; also science isn't just experiments and hypotheses, but also divine truth as told by the prophets; science is a light source by which we may see the reality of knowledge, but we must not ignore knowledge which remains occluded by shadow; but science's light is best used by scientists, and "some world powers" that choose to use science against humanity are wrong to do so; etc., ad nauseum. I expect this was his written speech, prepared well in advance. It sucked big time.
But afterward, and before he moved on to taking questions from the audience, he decided to respond to Bolinger's earlier attacks in his 'introduction'. This is where it got good.
First, he responded to the holocaust denial accusation.
He said that two years ago, he raised two questions, both of which he feels are valid questions, and should be asked. Yet instead of getting answers, he instead has been ridiculed by the press and insulted by Bolinger concerning his asking of these questions.
I will quote him directly, again copied straight from AP, so that you can see what he said for yourself:
"You know that my main job is as a university instructor. Right now, as president of Iran, I still continue teaching graduate and Ph.D.-level courses on a weekly basis. My students are working with me in scientific fields. I believe that I am an academic myself, so I speak to you from an academic point of view. And I raise two questions. But instead of a response, I got a wave of insults and allegations against me. And regretfully, they came mostly from groups who claimed most to believe in the freedom of speech and of information.
"You know quite well that Palestine is an old wound –- as old as 60 years. For 60 years, these people are displaced. For 60 years, they are being killed. For 60 years, on a daily basis there’s conflict and terror, for 60 years, innocent women and children are destroyed and killed by helicopters and airplanes that rake the houses over their heads. Children in schools are being tortured, for 60 years, the slogan of expansionism, from the Nile to the Euphrates, has been chanted.
"Given that the Holocaust is a present reality of our time, a history that occurred, why is there not sufficient research that can approach the topic from different perspectives?"
His 'two questions' are these:
  • Why is there no further research on the Holocaust? Why is there only one perspective shown in every historical narrative of the Holocaust?
  • Even if everything traditionally said historically about the holocaust is true, why do the Palestinians have to pay for atrocities the Axis powers committed?
He did not mention the Iraq invasion in this part of his speech, but the implication was clear: Just as Al Qaeda attacked the United States, and we took it out on Iraqis, the Germans attacked the Jews, and in retaliation, the West decided to kick out the Palestinians so that the Jews could have their own state.
"We need to still question whether the Palestinian people should be paying for it or not. After all, it happened in Europe. The Palestinian people had no role in it. Why is it that the Palestinian people are paying the price for an event they had nothing to do with?
"They had no role to play in World War II. They were living with the Jewish and Christian communities in peace at the time. They didn’t have any problems. Today, too, Jews, Christians and Muslims live in brotherhood in many parts of the world. Why is it that Palestinians should pay a price -– innocent Palestinians -– for five million people to remain displaced and refugees abroad, for 60 years? Is this not a crime? Is asking about these crimes a crime in itself? Why should an academic like myself face insults for asking questions like this?"
He went further than this, noting that those few Western academics who try to research the holocaust from an alternate perspective are not only ridiculed, but jailed for doing so. Personally, I can think of no such example offhand. but I hesitate to flatly deny this accusation of his, especially since I have seen reports of holocaust deniers being thrown off faculties and the like in the past. Of course, if I was a University President, I'd probably throw out Holocaust deniers, too, for fear that they were incompetent. But maybe I'd be wrong to do so automatically.
Pres. Ahmadinejad then concluded quickly, under duress, noting that he had much more to say, but that Bolinger had spoken just as long as he had, and stolen the time available for Ahmadinejad to talk. He mentioned the nuclear issue, stating that Iran has been a member of the International Atomic Energy Agency (IAEA) for years, and that the organization's bylaws allow all members to use nuclear energy freely--and he pointed out that IAEA inspectors have repeatedly shown that Iran is following correct protocols, and it is only "two or three world powers" who keep objecting to Iran's development of uranium. (Amusingly, the interpreter found it particularly difficult to say "IAEA" correctly, and this problem was compounded by Ahmadinejad's repeated use of the term.)
He mentioned that yes, other countries have offered to give Iran uranium rather than let Iran develop it themselves, but Ahmadinejad demurred, stating:
"Why do we need the fuel from you? [meaning 'why should we have to get fuel from you?'] You’ve not even given us spare aircraft parts that we do need for civilian aircraft, under the name of embargo and sanctions under the pretext that we are against human rights and freedom. We want the right to self-determination, to be independent."
He said that he does not trust the Western nations to give him fuel; Iran needs to develop this capability by herself. He then cited contractors from America, France, Germany and Canada that promised to help Iran benefit from nuclear energy, and pointed out that "unilaterally each and every one of them canceled their contracts with us as a result of which the Iranian people had to pay the heavy cost in billions of dollars."
At this point, the moderator (not Bolinger) stopped Ahmadinejad, stating time restraints, and the question/answer section was started.
Question one:
Do you, or your country, call for the destruction of Israel?
(This question is in relation to previous statements of his for the past few months that give that effect.)
Ahmadinejad danced around the question, stating that he had no problem with Jews, that he liked Jews just as he liked every other nation. He pointed out that many Jews live peacefully in Iran, and that they even get a special status in the Parliament, where they get more representatives than the Iranian constitution technically requires them to have. But it was apparent that Ahmadinejad drew a sharp distinction between Jews and Israel. "Palestinians should be free to choose their own destiny. Let them decide what should happen there."
The moderator was not satisfied with this answer, and responded back quickly: "I think most of the members of our audience would prefer a real answer to this question. It can be answered with a single word: yes or no?"
Ahmadinejad's consternation was clear. He responded by saying that "you have asked the question, but you do not like the answer." He claimed that what was important was that Palestinians should choose for themselves what happens in their lands. For sixty years, the Palestinians have lived in exile. "Let them--all of them, jewish palestinians, muslim palestinians, all of them--pass a free referendum. "Let the people of Palestine freely chose what they want for their future."
Question two:
Why does Iran sponsor terrorism?
(This question is in regard to Gen. Betrayus' testimony earlier last week that claimed that terrorist attacks in Iraq had grown to a level that could only indicate that Iran was sending weapons and training.)
Ahmadinejad's reaction to this question was strong. "Iranians hate terrorism." He denied sponsoring terrorism, and then accused the United States of being the true sponsors of terrorism. "The groups your country sponsors in Iraq right now--these are the same groups that killed members of my parliament. They are terrorists many times over, and the United States actively supports them today." He went on, reminding the audience that Saddam Hussein was also sponsored by the United States, and pointed out: "We need to address the root causes of terrorism and eradicate those root causes.” He then said that where he is from, in the middle east, "It is clear which powers incite terrorists, support them, fund them."
"Our nation, the Iranian nation, through history, has always extended a hand of friendship to other nations. We’re a cultured nation. We don’t need to resort to terrorism. We’ve been victims of terrorism ourselves. It’s regrettable that people who argued they are fighting terrorism — instead of supporting the Iranian nation — are supporting the terrorists and then turn the finger at us. This is most regrettable."
The next few questions dealt with women in Iran, and more Holocaust stuff. Unfortunately, the questions and responses on the Holocaust stuff was very similar to what I quote earlier, so I won't go back into it. But on women, Ahmadinejad was very defensive, stating that "when a woman is born to a family, they are ten times as blessed", and gave many specifics about women in high positions of authority in Iran. He even made a jab at the United States' low voter participation rate, mentioning that in Iran, "we are a free people, and we all vote, 80-90%, and half of these are women. Women in Iran are free, with true freedoms."
Question five:
Why are so many people put to death in Iran? Women, academics, homosexuals?
Ahmadinejad answered by pointing out that Iran puts people to death the same way the United States does. When a criminal kills people, Iran makes an example of them. He went on and on in this vein.
But then the moderator interrupted, saying: "The question is not about criminals, but about homosexuals and women. Why do you put homosexuals and women to death?"
Ahmadinejad paused, took a breath, and then stated:
In Iran we don't have homosexuals like in your country. We don't have that like in your country. [audience laughs] In Iran we do not have this phenomenon. I don't know who's told you that we have this.
That was probably my favorite quote of the afternoon.
He then went on about women again. I won't repeat his restatements.
The next question was about what he would have said if he had been allowed to visit ground zero at the world trade center, to which he claimed confusion as to why people would think it disrespectful for him to pay his respects for the lives that were lost on Sept. 11.
And he was asked again about nuclear weapons. I won't go over most of his rehashing, but he added at the end:
"If you have created the fifth generation of atomic bombs and tested them already, what position are you in to question the peaceful purposes of others who want nuclear power? We don’t believe in nuclear weapons, period. It goes against the whole grain of humanity. Leaders--politicians who are interested in nuclear weapons are backward--they are retarded."
That was a great jab at Bush, by the way, what with our recent nuclear bomb developments.
And finally, after thanking his audience, he extended an invitation to the Univeristy faculty and students to come to Iran whenever they wanted, and they could speak at any University they chose. Plus, he added: "When you come, we will treat you with respect."
It was a very interesting experience.

21 September, 2007

How to Prevent Bandwidth Theft


One problem every webmaster should be aware of is bandwidth theft. Sometimes, malignant webmasters who like your images may decide to hotlink them, effectively serving your images (using up your bandwidth) on their site. While it may not be a problem ordinarily, all it takes is one time: if a blog with a large readership hotlinks your image, you may use up your monthly bandwidth allowance in the space of a day.
As with most problems, the best way to solve this issue is to prevent it from happening in the first place.
There are a few of ways you can stop hotlinkers from showing your images:
  • Denial of Access
  • Alternate Image Served
  • HTML Document Served
Each of these methods requires modifying the .htaccess file associated with your site. Your .htaccess file protects all files in the same directory as the .htaccess file as well as all files in subdirectories of that folder. When modifying the .htaccess file, remember that it must remain in ASCII format, so use Notepad or any other plain text editor.
The denial of access route is the most common method used. It basically consists of refusing any domain other than the ones you specify to show the image. The modification to your .htaccess file should include the following lines of code:
RewriteEngine On
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^http://yoursite.com [NC]
RewriteCond %{HTTP_REFERER} !^http://www.yoursite.com [NC]
RewriteRule .*\.(gif|jpg|swf|png)$ - [NC,F]
Make sure that each line is unbroken, and remember to replace yoursite.com with your actual domain name. Notice that this code refuses hotlinking of gifs, jpgs, pngs, and flash files.
Alternately, you may wish to try and gain hits from unwanted bandwidth theft. By serving an alternate image, you will still be serving up images, which causes you to lose bandwidth, but instead of the image the hotlinker requested, you may show an image that states: "To see this image, please visit YourSite.com" or something similar. To do this, simply replace that last line of code (the Rewrite Rule line) with the following:
RewriteRule .*\.(gif|jpg)$ http://yoursite.com/hotlinked.gif [R,NC]
Please notice that in this case, the image replaces only gifs and jpgs with your custom image.
The last method is rarely used, because it takes much more effort to implement, and requires php. But the last method has the added benefit of allowing people to link to your image, which the aforementioned methods do not allow. For example, if someone likes your image and decides to link to it, when the page loads, it will show the referrer as the page that linked to it–which means the RewriteRule from above takes effect, and the above code will deny or replace it. Yet you may not want to deny viewers from seeing your image in such a situation, since the person linking your image is not stealing it for their own use, but is actively referring their visitors to your content.
The idea is to change all requests for a picture file to instead serve an html file that shows the image requested. If someone hotlinks this image, the request will fail, because what your site will serve them is an html file, and browsers will be unable to render the file, and instead will show the generic image placeholder. But if someone links to the image, they will silently be redirected to an html page which will not only show them the image they wanted, but also provide links back to the rest of your content! So with this method, you disallow hotlinkers, and yet provide image linkers with the image they wanted, plus additional content that you specify.
There are two drawbacks to this final method: first, you must be using php; second, you will not be able to serve up an alternate image to hotlinkers. For an in-depth description of how to implement html document serving on image requests, see Thomas Scott’s excellent article on AListApart.