Free Speech in the World

Posted on May 07, 2010 by Brian Tajuddin

The First Amendment

The First Amendment to the Constitution of the United States of America reads as follows:

Congress shall make no law respecting an establishment of religion, or prohibiting the free exercise thereof; or abridging the freedom of speech, or of the press; or the right of the people peaceably to assemble, and to petition the Government for a redress of grievances.

This is an incredible freedom that is enjoyed by many people throughout the world. Many use it as a rallying cry to defend the American way of life. I do believe the order of the Amendments in the Bill of Rights was not an accident. While the Constitution performs the incredible task of setting up a government that has lasted over 200 years, it is the Bill of Rights that really sets the tone for what that government has been able to give to the people.

I'm not one to argue that our government is perfect or that it works cleanly and efficiently. On the contrary, it has become an overly-bureaucratic system that is in need of an overhaul. Even so, such a change is well within the abilities of the constitution. It just is not in the agendas of the people we elect to administer the government. I digress.

As an American citizen, I believe that the First Amendment is the most important in defining our society, and it is essential to the culture of tolerance and sharing of ideas we have today.

Facebook Groups

Now, consider a recent experience of mine. I was recently invited by a friend to join a new (to me) type of Facebook group. This group was a petition to Facebook to take down another group. I did not join it. Both sides have a right to be heard, but I refuse to be on either side of the argument. In my opinion, as long as the group is not violating the rights of any human being or any other laws, it should not be suppressed. People should not even think to suppress it. They should be exercising their own freedom of speech to act against the agenda. Since this is all happening on Facebook, the terms of service of the site come into play. I will not deal with that because I am trying to keep this argument from becoming too detailed and technical.

Of course, this wasn't a group about gun control, health care, or any other legitimate, life-changing issue. No, the group they wanted to be removed was a group of people praying for the death of President Barack Obama. Now, we have a politically-charged situation where everyone thinks they are right. While I strongly disagree with this group, I am in no position to demand they be silenced because my very right to produce this argument (or the other group's demand that they be removed) would also have to be suppressed. Therefore, I sit in the middle like so many moderates. I look to one side to see extremists saying cruel and disrespectful things, hoping people will die, and generally being poor human beings. I look to the other side and see extremists trying to stop the other extremists by revoking their rights.

As far as I am concerned, the people who wish our President dead have serious moral (if not psychological) issues. However, as long as they are not actually causing any harm to the President, it would be ethically and legally wrong to suppress their freedom of speech.

Free Speech and the World

While ideas are more open and free in the world than ever, despite what governments attempt to regulate, there is still a large part of the world where free speech is not part of their lives. As people with an acknowledged right to free speech, we are in a position to express ourselves in ways that people in many countries cannot. This is a freedom to be shared and used to create a more cohesive global culture, promoting equality for everyone.

In order to help spread this freedom, we have to convince the regular people, the silent majority, that it is something to demand. Normal, everyday people are needed to create the support necessary to tear down enforcement of laws designed to limit free speech. It is the large group of moderates that are critically important here. Yes, there are countries governed by dictators who do not want their people to express themselves freely. However, there are plenty of ways that those countries can be helped to develop the freedom if there is general support for the idea among common people. My argument is that our goal should be to show people what this freedom mean. Help them understand how it can make life better. Do not hide the dark sides of it. Let them know that such a freedom means that others have it as well. False advertising just makes them that much angrier in the future.

Current Events

Finally, I have followed my argument through to current events. There are two events of note, one following from the other. The first event is the South Park episode "depicting" the Muslim prophet Muhammad in a bear suit. Considering the efforts they went through to not actually depict the prophet, I am quite impressed. Nevertheless, they were threatened with violence for what they did. A threat of violence is wrong in any major world religion. An argument about how what they did was wrong would be welcome. Blind threats of violence are not free speech.

The creators of the show exercised their free speech to poke at a culture that has very stringent rules about idolatry. Consider the point of view of the average Muslim, in the United States or in a country governed by the rules of Islam. This jab at their culture is targeted, but it is also walking a line to avoid breaking the letter of the rule, if not the spirit. Any thinking person should be able to appreciate that there is a difference between masking an allusion to an act versus actually performing the act.

The dispute did not end there. In Seattle, WA, some people decided that it would be clever to have a day where people around the world draw Muhammad. It has since caught on across the country. This is still free speech, and I refuse to see them censored or suppressed in any way. This is the First Amendment at work. Much like the people who are praying for the death of our President, being defended by the First Amendment and being right are not the same thing.

I could try to make an argument about why we should respect other religions because it is the right thing to do. I am going to take a more pragmatic approach, though. Throughout the world, there are normal people without strong opinions about Western culture. They live their lives without the freedoms that many of us take for granted. I'm not talking about extremists or terrorists here. I'm talking about people who wake up and go to work every day, just like anyone else. There is a very large number of these people who are Muslims. A South Park episode that ended up being censored and turned into a huge debate is not likely to offend the Muslim living a normal life without a lot of freedom. If it does offend them, I do not believe it is likely to drive them to action. However, an organized effort to attack the religious beliefs of this normal person is likely to stir up some thoughts, potentially strong thoughts, and perhaps it drives them to action. It is possible that they continue with their lives and chalk it up to those crazy Americans and their sinful ways, but it is also possible that they act.

I leave you with this question: Is attacking the beliefs of others really the appropriate place to be exercising our freedom of speech? In a world with practical problems facing us every day, is mocking the beliefs of people we should be trying to understand really going to help? More importantly, are there arguments to be made that can help move the world to a more unified and friendly place to share ideas? I do not believe that alienation is the answer to the problems of a fractured global culture. We should be demonstrating the benefits of our way of life rather than using it to attack those who are less fortunate.

ProFlowers thinks the customer is an idiot!

Posted on February 08, 2010 by Brian Tajuddin

Over the weekend, I ordered flowers for my girlfriend for Valentine's Day. Unfortunately, she is leaving for a vacation on Feb. 14, so we decided to reschedule the day for Feb. 26. The flowers were ordered to be delivered to her office on Feb. 26 in the morning.

This morning, I received an email from ProFlowers (signed by the CEO) that ran like this:

Dear Brian,

     

We're writing to let you know that there has been a change in your recent order (#<removed>) of One Dozen Red Roses w/FREE Elegant Ruby Vase.

       

We noticed that the order appears to be meant for Valentine's Day, but the delivery date selected 2/26/2010 is after Valentine's Day.  Due to the time-sensitive nature of the occasion, we have adjusted your delivery date to 2/12/2010.  This was done to ensure delivery by Valentine's Day.

No action is necessary on your part, but we do want to make sure you are happy with this change.  Please contact us at wecare-AT-customercare.proflowers-DOT-com if you have any questions or concerns.

We appreciate the opportunity to help you celebrate this special occasion.

Sincerely,

Bill Strauss, CEO

 For those who aren't shocked enough yet, let me provide one possible translation of this email:

Dear Brian,

     

We're writing to let you know that you're dumb.

       

We think you're going to be in trouble if we deliver these flowers when you asked us to. You'll probably come back and yell at us for not delivering them in time. In order to save ourselves the hassle of your own stupidity, we're going to prove that we can be more idiotic.  You have less than one week left, so we have adjusted your delivery date to 2/12/2010.  This was done because we're pretty sure you're stupid.

No action is necessary on your part, because we're smarter than you, and this is what you actually wanted anyhow.  Please contact us at wecare-AT-customercare.proflowers-DOT-com to tell us how much we saved your ass.

We appreciate this opportunity to cover for your stupidity about this special occasion.

Sincerely,

Bill "Savior of Stupid Customers" Strauss, CEO

Maybe I'm being a bit harsh. I don't think so. As a retail company, you do not proactively change customer-supplied information. If you suspect something is wrong, you contact the customer to see if they want it changed. You do not do it automatically.

There is just a little more to this story. I sent an email to the address they provided. I didn't get a response within 30 minutes. A couple hours later, I still have no response. I called them, and talked to a very sensible and intelligent woman. Without telling her, she had guessed that the delivery date was later due to the flowers being for something else or that someone was not going to be around. If a customer service representative intuitively knows this, why don't the bigwigs at ProFlowers have any idea that someone might be celebrating Valentine's Day on *gasp* a different day? In any case, she modified my order to set the date to 2/26/2010 again, and all is (hopefully) well with the world. I am trying to find an email address for Bill Strauss, though. I want to personally tell him what an idiotic idea this is. I don't care if it wasn't his idea. His name is on the email.

Thank you ProFlowers for eliminating one more site (plus all their sibling subsidiaries) from my variety of options for shopping online.

Update: ProFlowers has now changed my order 3 times in as many days. After the second time, customer service said they had noted on the order that it was not to be changed again. It was. I have canceled my order. I appreciate the efforts of customer service and the marketing director who commented on this post, but I no longer feel the need to go through this hassle. I am going to order from a local florist after Valentine's Day.

Another cool waste of time

Posted on May 15, 2009 by Brian Tajuddin

I recently found a really cool game that, despite being flash-based, I cannot call a "casual game". It is called flOw. I have to admit that I may never actually play it again, but it is a good piece of entertainment for 30-45 minutes. The goal (if you can call it that) is to grow and evolve your creature. There are a few tricks to playing it that I won't spoil. Just understand that when things happen to you without you doing anything, that's probably bad. The game comes with a few very basic instructions. Other than that, you just play and explore.

Quartz and Hibernate

Posted on October 25, 2008 by Brian Tajuddin

I recently put Quartz into a project with Hibernate and ran into a strange problem. Every time I'd try to create a new JobDetail, I would get this exception:

java.lang.NoSuchMethodError: org.apache.commons.collections.SetUtils.orderedSet (Ljava/util/Set;)Ljava/util/Set;

I had the right version of Jarkarta Commons Collections in my classpath. I couldn't figure out what was going on for quite some time. I eventually realized that too many JAR files from Hibernate were being pulled in. Hibernate ships with a file called checkstyle-all.jar which is not used at runtime. It runs checkstyle (obviously). However, this includes all of checkstyle's dependencies, including an old version of commons collections. Once I removed it from the classpath (or at least got the real commons JAR earlier in the classpath) everything worked fine.

Inherited Embedded IDs

Posted on October 17, 2008 by Brian Tajuddin

I recently ran into a difficult problem using Hibernate through JPA. I had two tables that were effectively the same but had to be separate for various database optimization reasons. The two tables had equivalent primary key definitions. That definition was a composite key based off of two foreign keys. Here is the general view of what I had.

@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Entity {
private IdClass _id;

@EmbeddedId
public IdClass getId() { return _id; }
protected void setId(IdClass id) { _id = id; }
}

@Entity
@Table(name="table_a")
public class EntityA extends Entity {}

@Entity
@Table(name="table_b")
public class EntityB extends Entity {}

@Embeddable
public class IdClass {
// a couple foreign keys
}

This caused some problems. There is a point in normal execution where we have to actually copy the values from one table to another. It turns out that the IDs are actually bound to a table as well as long as they are attached to the context. This made things very messy. I decided that it would be better for each of them to have their own IDs anyhow. I thought it would be easy to use inheritance on this. It was somewhat easy in the end, but there were definitely issues. Here is how I finally got everything working.

@MappedSuperclass
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
public abstract class Entity<T extends IdClass> {
private T _id;

@Transient
public T getId() { return _id; }
protected void setId(T id) { _id = id; }
}

@Entity
@Table(name="table_a")
public class EntityA extends Entity<IdClassA> {
@EmbeddedId
public IdClassA getId() { return super.getId(); }
}

@Entity
@Table(name="table_b")
public class EntityB extends Entity
<IdClassB> {
@EmbeddedId
public IdClassB getId() { return super.getId(); }
}

@MappedSuperclass
@Embeddable
public abstract class IdClass {
// a couple foreign keys
}

public class IdClassA extends IdClass {}

public class IdClassB extends IdClass{}

The secret sauce here is the getId() method in the two entity child classes. I tried several things before finding this. Without this, you will likely be getting ClassCastExceptions every time you try to retrieve one of these things. It would appear that it is retreiving something that is of the parent type but not the child. I don't really understand what is going on there. The other error I got (and can't remember the exact flavor of incantation to get it) involved a message saying that IdClassA had no id property.

All in all, it isn't a terribly complex solution, but it took a while to find the right combination of annotations and the magic getId() method in the subclasses. That was the hardest part to find.

Subspace/Continuum

Posted on October 10, 2008 by Brian Tajuddin

A long time ago, a company called Virgin Interactive put out a beta of a game. The game was an online 2D space fighter. It was pretty cool for its time. It could be a pretty massive online game. Usually, there were 40 or 50 people in a given room. The general concept was that you would go around killing each other. There were several ships to choose from. Each had its own specialty. Combine that with a lot of upgrades that you could pick up, and it was a pretty good game.

I originally got the game on a CD with my PC Games magazine. I started to play and really enjoyed it. It really was a fun game.

A couple years later, Virgin tried to sell it. After giving it away for free for so long, the $30 price tag certainly hurt. The game suffered with only a couple rooms open to those of us who weren't paying. Honestly, I had stopped playing much by this point. I knew it was coming (even as a teenager) and stopped playing as much.

In college, I was a bit unusual. After my first co-op, I had a solid job that I could do from home. It paid well, and I could actually spend money on things. I decided to look and see if Subspace had come down in price at all. I couldn't find it anywhere. I started looking around online and found that it had completely flopped. Some users had effectively taken over the game and created some patches. On top of all that, they were working on a new version that was branded under the name Continuum.

The early versions of Continuum had some bugs. All in all, it was pretty stable for the version number it had. I really don't know how much was rewritten. In any case, they're up to version 0.40 right now. It plays like a full release. I don't often have problems with it.

Another thing that came up after the original game flopped was the growth (or creation...I don't really remember) of specialized rooms. There are several different types of games that you can play. The most popular is "Trench Wars". This room is a capture the flag game with most ships having some form of one-hit kill. It's a lot of fun. The map is very small compared to how big it can be. People tend to really try to play as a team. The map is also very well-refined. It is basically impossible to employ a strategy to hold onto the flag forever. If the other team coordinates a bit and tried to get the flag, it will probably only take a few tries. The turnover of players in the room is also fast enough that a team will rarely be overpowered (skill-wise) for long.

In addition to the nice standard play in the Trench Wars room, they also host strange games with even stranger rules. I've played a naval battleship version of the game in there. They changed all the tilesets and ship images to make it like a naval battle. It was pretty cool.

The best thing about this game is that you can play it for a couple hours or you can hop on for 10 minutes. I've never felt any real urges to play it. It has always been something I do to kill a certain amount of time. Depending on who's playing, you might get bored, but I've rarely found that to be the case. It's a great game to check out.

Yahoo! Site Explorer: A Step Backwards

Posted on October 07, 2008 by Brian Tajuddin

I have been using Yahoo! Site Explorer for some time to track my site's status on the Yahoo! search engine. I have to say that I'm somewhat partial to Yahoo! for a couple reasons.

First, they index a lot more of my pages. They currently have almost 200k pages indexed on my site. Second, they provide more information about how they view your site in a real-time manner. Sure, it's not completely real time, but you can actually see changes occurring.

For the record, I also use the webmaster tools for Google and Microsoft Live. Both of them suck pretty bad.

Recently, I noticed that Yahoo! had a link to the "new" Site Explorer. I took a look and was pretty annoyed by what I saw. I guess I was alone because they've launched it. It is a step backward in useful design. The functionality is almost exactly the same as the previous version. They've spruced up the buttons a bit and added a little more color. Otherwise, they moved some navigational items from the top to the left and made the useful area of the screen 10% smaller. That's not enough, though. They decided that all this variable width stuff is useless. The information column is now 772 pixels wide. Sure, it fits perfectly on a 1024x768 screen. It's tiny on my 1280x1024 screen.

I cannot fathom what would make them do this. In the world where larger screens are more common, why would you tailor a site to the screen size people were using 5 years ago. I haven't seen an LCD monitor with a 1024x768 native resolution in years.

My advice to anyone out there is to fire any web designer who will not make their design adjust to the width of the user's browser window.

Chrome's marketshare

Posted on September 15, 2008 by Brian Tajuddin

A brief look at how Google Chrome is doing.[Read More]

jMock and interfaces galore

Posted on August 09, 2008 by Brian Tajuddin

The ASM pain is now over with, I think. I've tried various mocking packages and settled on jMock. There really isn't a huge difference between jMock and EasyMock. In fact, they both use CGLib. However, there are some subtle differences.

First, jMock integrates better with JUnit 4.4. This is pretty cool. If I were so inclined, I could specify exactly which mocked methods are called and the sequence in which they should be called. I can even specify several sequences. Then, at the end of each test, it would check the expectations and throw an exception. I also like the smaller overhead of jMock. EasyMock forces you to perform a lot more setup overhead for each mocked object. This can be pretty annoying. jMock simlpy makes me annotate the class, create a Mockery (I love the jMock terminology), create the mock, put it where it belongs, and create Expectations. There is no need to call a method to start the replay because I'm not calling the methods on the actual mocked object to set the expectations.

Second, jMock uses CGLib but provides a dependency-free version of the JAR. This allows me to more safely put it at the front of the classpath. I have used this a bit with hibernate being called and see no issues.

Finally, if you need to mock a class rather than an interface, you have to use an Imposteriser. That has to be the best word that I've ever typed into code. Therefore, jMock wins style points.

Of course, I have done a lot of work on this and just now realized that I'm only mocking a single class. That class is used in a package that doesn't need to call hibernate in the unit tests. That makes my life a lot easier. This is mostly due to the fact that one of the custom service dispatchers we use is a final class. That made it impossible to mock. I ended up creating a singleton that my unit tests could replace. Since I wrote it, I could make an interface for it. At this point, the only thing class I'm mocking is InitialLdapContext. I think this is a pretty good situation.

There you have it. ASM pain still exists in the world, but I've found my way around it.

ASM is not my friend

Posted on August 07, 2008 by Brian Tajuddin

I am currently working on cleaning up our unit tests at work. Our service code calls several other services within the company. However, we don't necessarily want those called during the unit tests. Development-level services are notoriously unreliable. I have started using EasyMock 2.3 to mock the interfaces for our dependencies. However, some of the things we need to do require mocking classes. Enter EasyMock Class Extensions 2.3.

I first tried to use the class extensions and immediately got a NoSuchMethodError when running my tests. To make a long (and painful) story short, Hibernate imports a version of ASM that is newer than the one used by EasyMock Class Extensions. Luckily, the particular package I'm using doesn't need Hibernate. It only gets included in the classpath because it is in the list of transitive dependencies. However, once I start using Hibernate, I fear it will not work. I will be trying this out today. If anyone has any ideas, though, please let me know.