Archive for February, 2009

History of the Internet

Thursday, February 26th, 2009

picture2A short note by Dion Moult: Hello there readers! Today I present to you a guest article by none other than a guest writer – namely Nathan from Inkweaver-review (link below). If you want your article to be published on thinkMoult, simply drop me an email and we’ll have a chat :)

Today the Internet is a seamless service that seems to fit into human life as it was always there, but the truth is that it is only about forty years old.  The Internet began in the 1960s when early packet switching networks were created.  Packet switching is the process of dividing data into chunks that are sent one at a time.  Prior to this concept it was very difficult to route data through a network.  For example, if the computer was to send a file it would be sent in a stream of data usually in analog format.  Computers would have a hard time trying to determine where the stream began and ended.  This makes it nearly impossible to route the stream through a network.  With packet switching, however, it becomes much easier to package data and then address it so that computers can tell where it should be sent.

In 1964 the advantages of digital packet switching were first explored with the purpose of creating a communications network that had wide connectivity and would be able to survive failure of any of its nodes.  This was visualized in a series of papers titled On Distributed Communications.  This communications idea was very attractive for military purposes as it promoted a network that could easily survive attack.  Messages could be forwarded around any computer or server that had failed or been destroyed.  The first internet application was therefore a military network called ARPANET, developed during the height of the Cold War to make communication possible in the case of a wide spread nuclear attack.

In the 1979 however, ARPANET became the backbone of a new network called USENET.  This network began as a system for connecting major universities so that they could share resources and data from experiments.  However, this network was also used for bulletin board systems and email.  College students found that they could use USENET  for their own purposes.  Although the ARPANET networks forbid the use of their servers for discussions on subjects such as drugs and sex, innovative students found ways to set up their own servers to host such discussions.  The development of personal computers made it possible for a much larger group of people to connect to the developing internet.  Hackers and computer buffs from around the world began setting up their own servers and chat systems.

The Internet as we know it today began at CERN with the innovation of Tim Berners-Lee.  He wanted to set up a network that would work well between different types of computers.  He also thought up hypertext, text documents that had links and other active content that paper documents could not have.  This protocol, called the World Wide Web, works on top of the infrastructure that is the internet.  Today it has absorbed such a large portion of internet use that most people confuse the World Wide Web with the Internet itself.

To summarize the Internet began as a military network to distribute information in the case of an enemy attack.  From there it expanded to include educational institutions that wanted a good way to share data.  Then college students began using the network for bulletin boards, chat, and other applications, paving the way for the internet that we know today.

For more information see:

Guest Post by NathanKP of Inkweaver Review.

Tech Tip: Speed up Firefox to use less CPU.

Tuesday, February 24th, 2009

firefox_throbberIt seems as though I’m coming up with a lot of little series here on my blog.  Such existing examples include “How to actually use your computer”, “How to make a website”, and “Rapid fire”. I’ve decided to start yet another one. This one, as you’ve probably guessed from the title, is called “Tech Tips”.

For the first ever Tech Tip post, I’ve decided to address an issue quite a lot of Firefox users are experiencing. Mozilla Firefox is a popular browser and so it should seem a sad issue when people experience 30% or more CPU usage. Some testing has revealed the culprit to be tabs. Not just tabs, but specifically the loading animation – those spinning circle things – that cause this CPU usage.

Are you a victim of this issue? It’s simple to test. Open up about 3 or more tabs and tell them to load non-existent pages. This will cause Firefox to load them until they timeout. During this period, quickly fire up an xterm and start up “top”. Check the X and firefox CPU usages. If you are on Windows, press control-alt-delete and go to system processes, check the CPU usage. If you see spikes (sudden surges in CPU % usage), it’s likely it’s because of Mozilla Firefox.

Alright. How do I fix this issue? Well, you’ll have to remove that annoying loading animation. (You can try change it to something that isn’t animated, but I haven’t tested that). To remove it, you don’t need to do dirty hacks into your theme, but simply edit the Firefox css. That’s right, it’s really simple! (Wow, the power of open-source yet again!)

Step 1: If you are on Linux, go to your ~/.mozilla/firefox/***.default/chrome/ folder, where *** is a random bunch of characters. If you are on Windows, go to C:\Program Files\Mozilla Firefox\chrome\

Step 2: In that directory, find a file called userChrome-example.css. Rename it to userChrome.css. If you look in the file, you should see some examples with lots of comments explaining what things do.

Step 3: The thing you’re looking for is called the “throbber”. Stupid name, I know, but that’s what it’s called. Add these few lines and it should remove the Throbber animation on the top right of the window and the Throbber animation on each of the individual tabs – respectively (for each code block).

/* Eliminate the throbber and its annoying movement */
#throbber-box {
display: none !important;
}
/* Remove tab loading indicator while the tab is loading */
.tabbrowser-tabs *|tab[busy] .tab-icon {
display: none !important;
}

Step 4: Restart Firefox and all Throbber nastiness should be gone. Your Firefox should now use sane CPU % and feel faster in general.

Hope it helped!

How to use CodeIgniter’s OpenID library to integrate OpenID in your existing user system.

Sunday, February 22nd, 2009

Apparently OpenID is all the rage nowadays in the coding world and those using the CodeIgniter framework are left all alone without a proper guide on how to get it working. So as a budding programmer I is be halping all of you. Yes, it IS a long post, but it should help if you read it step by step.

INTRODUCTION

Here is a nifty short guide to get people to use the CodeIgniter OpenID library to start using OpenID in your web application. Firstly I will assume you already have a registration system of some sort, and if you don’t, you should, because not everybody knows/cares about OpenID. What we have to do to spread OpenID is to provide a choice to people, not force them upon it – forcing people would simply get them to leave.

BRIEFING OF SYSTEM

So, let’s say you have a registration system that uses a table to store some sort of user ID (username/email/uid/whatever) and some sort of password. You also have a login form which all works fine, and now you want to allow people to use OpenID on that system.

Here’s the briefing on how it’s going to work. I’m assuming you know how OpenID is used already. I’m also assuming you are comfortable with PHP. What will happen is that in the place of the username field (or if you want you can make a separate form for it) people have the choice to just type in their OpenID URL, then ignore the password field. When they click the login button, firstly we will do a check for whether or not it is an OpenID URL.  If it is not valid, then we just continue checking if it’s a proper user account like our previous system and everything is fine. If it IS a valid OpenID URL, then it will perform the usual “please authenticate” checks with the OpenID server, and once that’s done, we’ll add an OpenID row to a NEW OpenID table which’ll store this stuff, and that table will also have a UID column, which allows us to bind an OpenID URL to a user account. Note that this is a one way bind, so many OpenIDs can refer to a single user account, but not the other way around.

This means you will have to create another table in your database, this depends on what type of database you are using, but in general you should have two columns:

Column 1) openid_url
This would be a varchar field to store a canonicalised version of the openid
url, for example http://foo.bar.com/

Column 2) user_id
This would be an INT that would contain the userid of the username this openid
url is binded to. This should be the key field as it must be unique.

Here is the SQL that should create this for you, but remember it only applies on SQL databases.

CREATE TABLE IF NOT EXISTS `user_openids` (
 `openid_url` varchar(255) NOT NULL,
 `user_id` int(11) NOT NULL,
 PRIMARY KEY  (`openid_url`),
 KEY `user_id` (`user_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Now as a final note, what if a user already has account, but wants an OpenID to bind to that one instead of creating a new one? The simplest way to do this is to automatically create a new one, but have an option, perhaps in the user control panel or settings page that will allow them to “bind” to an existing account. They will have to provide that account’s user/pass to authenticate they are allowed to bind to it, and if they do, then the original account will be deleted, the user_id will change in the user_openids table, and the user will have to relogin to continue. Tada. Simple.

OK, let’s get started.

STEP 1: Setting up the libraries.

Alright, the first step is to get the library. You can obtain it from the CodeIgniter Wiki.  Now go and upload all the files. This library is … well … just a CI library, so that means it’s limited to CI functions and so it also needs the actual PHP OpenID Library to actually interface with OpenID itself. So go and download the PHP OpenID Library then upload the Auth/ directory in your system/application/libraries/ directory.  Note that this is the same place as the Openid.php file you uploaded from the CI OpenID Library. For those impatient folks who have already run the test controllers, it should’ve failed on you asking for mkdir permissions. Well, instead of chmodding our entire system, we’re just going to add those directories for it ourselves. Go to the CI root directory (the one that contains the system/ directory) and add another directory called tmp/. Go inside tmp/ and then add three more directories called associations/ and nonces/ and temp/. That should be enough to set up the library.

STEP 2: Testing if it works.

The next step, now that you supposedly have the files in the right places, is to check whether or not it works. Thankfully the CI OpenID library has already provided us with a test.php controller. So, what are you waiting for? Go to yoursite.com/test and put in your OpenID URL and see if it authenticates. Obviously if you don’t have an OpenID URL to test with, you need to go get one.  There are many providers available. If it works flawlessly (don’t forget to test with a non-valid URL to see if it catches that too) then skip the next paragraph. Or you can read it anyway.

OPTIONAL: If it doesn’t work?

Now, let’s say it’s mucked up for you. If you get nonce already used errors, try clearing out all the files in the tmp/ directory you made earlier on. Other nonces errors or authentication/redirection errors can be a problem with your CI configuration. Go to your system/application/config directory and edit your config.php file. Look for the uri_protocol option and try all of the options there. I find AUTO works fine for me but on my remote server apparently it only likes ORIG_PATH_INFO. Another glitch I encountered on my localhost is that the server would deny my authentication request. This is probably an Apache setting on my localhost but I played so much with my Apache settings it’s probably all my fault. Uploading to my remote server showed it worked perfectly there, but if you’re having problems testing it on your localhost, you might want to apply this very dirty hack. Go to your system/application/libraries/Auth/ directory and edit the OpenID.php file. The very first function is called isFailure($thing). Now screw them but right now I don’t care about authentication because I know it works on a non-mucked up server. So comment out the return is_a($thing… line and add a line after then to just simply return false;. You’ll get:

function isFailure($thing)
 {
 //return is_a($thing, 'Auth_OpenID_FailureResponse');
 return False;
 }

Note that I DO NOT RECOMMEND YOU DO THIS. IT IS A HACK IF YOU HAVE PROBLEMS RUNNING IT ON A TESTING SERVER. MAKE SURE YOU KNOW IT WORKS PROPERLY OTHERWISE.

Ok. Assuming now everything is working fine on the test controller, let’s start integrating it into our system.

STEP 3: Port the test controller to your own system.

Now we having a working test controller, but it isn’t part of our own system yet. Let’s say you have another controller which contains a Users class which deals with people logging in. Comment out all the code so that after they try to login using your existing form, it does nothing. Therefore, if your login form points to <form action=”foo/bar”>, you will comment out all the code in bar(). Now we are going to add the OpenID check.

Because a test controller already exists, this speeds up the reverse engineering process significantly as we already have a working example of use. All we have to do is do code reuse in the right places. This is a bit hard to guide because all of our user systems are different in terms of the code. So here you’ll have to use your own wits on if you need modifications to work for your own system.

Here is the system flow chart of how things are going to work – existing processes you should already have on your system are marked in dotted lines:

diagram1

Firstly we want to look at section (A). This section deals with checking if it is a valid OpenID URL. This can be done by copying the test controller function exactly. I have also added at the beginning some code, so read the comments as to why. Put this code in the function where your login form would normally point to in the <form action=”foo/bar”>. So therefore you would put it in the bar() function. For the moment, we are going to disregard going to section (D), as this is covered later on in Step 4. Here is the code you have to put in bar():

 // Before we check if the username is in fact an OpenID, we must secure
 // the variable. OpenID refers to the url as $user_id, so be sure to assign
 // the value of the inputted openid to $user_id. Here is have used
 // $this->username but this might change on your system.
 $user_id = trim($this->username);
 $user_id = htmlspecialchars($user_id);

 // Load the neccessary OpenID libraries as shown by the example.
 $this->lang->load('openid', 'english');
 $this->load->library('openid');

 $this->config->load('openid');
 $req = $this->config->item('openid_required');
 $opt = $this->config->item('openid_optional');
 $policy = site_url($this->config->item('openid_policy'));
 $request_to = site_url($this->config->item('openid_request_to'));

 $this->openid->set_request_to($request_to);
 $this->openid->set_trust_root(base_url());
 $this->openid->set_args(null);
 $this->openid->set_sreg(true, $req, $opt, $policy);
 $pape_policy_uris = array();
 $this->openid->set_pape(true, $pape_policy_uris);
 $this->openid->authenticate($user_id);

Now, to better integrate into your system (this is optional, but HIGHLY recommended) you should go into your system/application/config directory and edit the openid.php file. Edit it to fit your needs. openid_required is the required information you want to grab from the openid provider, and openid_optional is the optional information you want to grab. That’s all good and fine, but what we’re interested in is the openid_request_to variable. This is the link to the function that checks the authenticity of the openid URL.  Right now it goes to the test check function, but I would recreate this check() function in my own controller, as keeping it in a test controller is … stupid.

So if you change the openid_request_to option, you need to recreate the check() function. So it’s practically a copy and paste. Just copy the check() function from the test controller into the controller you want to store the check() function in. Here is the copy and pasted code, with some added comments to show where things happen:

/**
 * Checks for proper OpenID authentication.
 */
 public function check()
 {
 $this->lang->load('openid', 'english');
 $this->load->library('openid');
 $this->config->load('openid');
 $request_to = site_url($this->config->item('openid_request_to'));

 $this->openid->set_request_to($request_to);
 $response = $this->openid->getResponse();

 switch ($response->status)
 {
 // This is probably the most important bit of the check. The switch case
 // statements. They're pretty obvious as to what they do. All the same,
 // I have bolded part of their names for the hard of thinking ... haha.
 case Auth_OpenID_CANCEL:
 $data['msg'] = $this->lang->line('openid_cancel');
 break;
 case Auth_OpenID_FAILURE:
 $data['error'] = $this->_set_message('openid_failure', $response->message);
 break;
 case Auth_OpenID_SUCCESS:
 $openid = $response->getDisplayIdentifier();
 $esc_identity = htmlspecialchars($openid, ENT_QUOTES);

 $data['success'] = $this->_set_message('openid_success', array($esc_identity, $esc_identity), array('%s','%t'));

 if ($response->endpoint->canonicalID) {
 $data['success'] .= $this->_set_message('openid_canonical', $response->endpoint->canonicalID);
 }

 $sreg_resp = Auth_OpenID_SRegResponse::fromSuccessResponse($response);
 $sreg = $sreg_resp->contents();

 foreach ($sreg as $key => $value)
 {
 $$key = $value;
 $data['success'] .= $this->_set_message('openid_content', array($key, $value), array('%s','%t'));
 }

 $pape_resp = Auth_OpenID_PAPE_Response::fromSuccessResponse($response);

 if ($pape_resp)
 {
 if ($pape_resp->auth_policies)
 {
 $data['success'] .= $this->lang->line('openid_pape_policies_affected');

 foreach ($pape_resp->auth_policies as $uri)
 {
 $data['success'] .= "<li><tt>$uri</tt></li>";
 }

 $data['success'] .= "</ul>";
 }
 else
 {
 $data['success'] .= $this->lang->line('openid_pape_not_affected');
 }

 if ($pape_resp->auth_age)
 {
 $data['success'] .= $this->_set_message('openid_auth_age', $pape_resp->auth_age);
 }

 if ($pape_resp->nist_auth_level)
 {
 $data['success'] .= $this->_set_message('openid_nist_level', $pape_resp->nist_auth_level);
 }
 }
 else
 {
 $data['success'] .= $this->lang->line('openid_pape_noresponse');
 }

 // At this point, we have authenticated the OpenID COMPLETELY, and
 // we have also grabbed whatever information we have requested. For
 // example:

 // $nickname is the nickname we have grabbed in openid_required. It
 // may or may not be empty.
 echo $nickname;
 if ( !$nickname )
 {
 // If $nickname is blank, and we require it for our system, we
 // should now execute some code that will ask them to fill out a
 // nickname. This is for you to figure out. It will probably
 // loading a separate view or redirecting.
 }
 else
 {
 // If we have all the required information we need, we can move on
 // to section (C) in the flow chart.
 }

 // Remember we had to store the openid URL in a new table so we can
 // bind them to users? $esc_identity is the variable you need. Note:
 // it is canonicalised - that means that the format is standardized
 // such as foo.bar.com becomes http://foo.bar.com/.
 echo $esc_identity;

 break;
 }

 $data['pape_policy_uris'] = array(
 PAPE_AUTH_MULTI_FACTOR_PHYSICAL,
 PAPE_AUTH_MULTI_FACTOR,
 PAPE_AUTH_PHISHING_RESISTANT
 );
 // I have commented out the load->view because we want to use our own
 // view. See flow chart. You will have to edit it so that it does what
 // YOU want it to do. All I am doing is showing you how to set up a
 // basic structure.

 //$this->load->view('view_openid', $data);   
 }

Ok. After you’re sure you know or have a brief idea of what’s going on, also note that several other functions are referenced to. So you’ll also have to add the _set_message() function to this controller. Just copy and paste from the test.php controller. MAKE SURE YOU DO THIS.

Now we have a working check() function. So if we’re on the SUCCESS switch case statement, we now have the requested information we need and an open ID url. The requested information (in the example code above it’s $nickname) can be used in section (B) of the flow diagram, and the canonicalised openid URL can be used in section (C) of the flow diagram. So hooray! We now have a working OpenID system. How you are going to display the form to request for additional information is UP TO YOU on how you are going to add it, as it depends on your system.

STEP 4: Integrate OpenID check with normal usersystem checks.

We’re almost done here. Let’s take another look at section (A) of the flow diagram. Through reverse engineering the OpenID library, we can see that when it checks if it is a valid openid URL, and returns FALSE, it will use the _set_message() function to and give an appropriate error message. This _set_message() function can be found in the system/application/libraries/Openid.php file. If you look at it, it will echo the error message then call an exit(). Now, we don’t want to grudge our users with annoying error messages, especially if there is NOTHING wrong if they don’t provide an openid URL. (Remember, I am assuming you are merging your existing login box with your openID login box. NOT making a new openid login box – if you are making a new login box, you can pretty much disregard this step.) We also don’t want to call an exit(), because we want to continue with section (D). So comment out the echo and the exit line. After commenting them out, we want to replace the exit with something that will tell our script to skip the rest of our OpenID check and go straight to our usual account checks.

Here’s how we do it. (There might be alternatives, but this is what I think is the easiest) We will add a header redirect in place of the exit; line. Here’s what you should get:

function _set_message($error, $msg, $val = '', $sub = '%s')
 {
 $CI =& get_instance();
 $CI->lang->load('openid', 'english');
 //echo str_replace($sub, $val, $CI->lang->line($msg));

 if ($error)
 {
 //exit;
 header( 'Location: /foo/bar/0' ) ;
 }
 }

Where foo/bar goes to the same place as your <form action=”whatever”> we talked about in the beginning. Notice I pass a parameter ‘0′ to the function. This is so that we can restructure the existing bar() function to follow this sort of pseudo code:

function bar($check_openid=1)
 {
 if ( $check_openid )
 {
 // Here you execute the OpenID check code (NOT THE check() FUNCTION)
 // that you added in step 2.
 // Note that successful OpenID logins/registrations will occur in
 // the check() function, which is elsewhere.
 }

 if ( !$check_openid )
 {
 // Now you continue with the code the describes section (D) of the
 // flow diagram.
 }
 }

… and that’s it! You should now have the basis of a system that accepts both traditional user logins and OpenID. Obviously you have a lot of extra to add in but if you’re here anyway you should know how to adapt it to your system and what else you have to add. Particularly in sections (B) and (C). I’m not going to guide you how to do those steps as it depends on what information you want, how you want to display your request form, and how your database is structured. I’m very sorry, but you will have to work it out yourself. (It shouldn’t be too hard)

I have tested this as this is a running documentation based on what I have done to integrate OpenID in my own CI run site. However of course there may be bugs and things I’ve missed out, any comments will be appreciated, and of course I will answer questions (just leave it as a comment)! :) Spelling corrections are also welcome.

Please do NOT copy this post. Just link to this page if you want to share it with others.

I hope it has helped! Please leave a comment as I love “thanks yous”.

Surviving the Week

Friday, February 20th, 2009

fat_geekWell, I took a break on the last scheduled post because that Perspective release was considered a “big” thing. Mock exams (to mock us, obviously) are coming up in about a weeks time, and I am disgusted with my current state of revision – or lack of it. Why I am still typing this blog post I don’t know, but I think it’s great to share a bit about what’s going on (or whatever I deem suitable for online viewing – which isn’t much).

Today is penguin day. That’s because it’s a Friday. The story behind this was during my work experience, where apparently Fridays were when people would come late to work, and bum around most of the day – hence bringing along the slang term of “waddling”. This then slowly evolved into the weekly celebration of Penguin day. I’ve taken this into my own schedule, meaning Fridays are the days when I am more slack than usual. This usually leads to either a 8:30PM curfew or a 2:30AM curfew, depending on what I indulge myself in.

The past week I’ve been home alone. Aside from the shortened periods of sleep time and slightly less bother on privacy (OK – let’s stray away from the TMI swamps), some of the more interesting revelations on “how to live like a lazy bum” were reallised.

For example, only use a fork. If it’s soup, just tilt the plate/bowl/saucepan back and slurp it up. A spoon isn’t required. A knife? That’s why we have teeth, you know. To carnivorously rip apart our food.

Just eat straight from the saucepan you cook in. This saves you having to wash a plate, and the absolute requirement of you having to wash the pan before your next meal serves as an indirect form of motivation to do the “dishes”. If you’re having toast, that’s even easier, you don’t need any cutlery nor dishes.

Trash? You don’t need a trash bag. Just dump it in a common area (you’ll create hardly any trash anyway – just the regular packaging) and every morning before you go out to school – because you’re going out anyway, throw it in the outside bin. If you purchase take away food from outside, eat it whilst walking home. By the time you’ve reached home, you would’ve already been able to dispose of the
garbage.

Cleaning up your room/bed/any sort of house cleaning can be neglected for a couple days. If you don’t bother to sleep on your bed, you don’t need to clean it. If you don’t bother to turn on the lights, draw the curtains, open the windows or even turn on the aircon, these are less little minorities you have to bother about.

Dirty laundry can also be minimized if you don’t bother to change your clothes or bother to wear anyt- ok. Danger zone.

Alright – that was enough of for a “personal life” post. I promise the next post won’t be random and will actually be related to technology – and really interesting. I also apologize for the image if it has scarred any of you.

Perspective Magazine Feb 09 Released!

Monday, February 16th, 2009

Another two days have passed and the time is ripe for yet another thinkMoult post. As the title suggests, the Perspective Magazine for February 2009 has been released today. (The actual date was meant to be Friday, but somebody forgot to tell people to collect it Friday morning – oh well, no harm done) … and as promised, here is a snapshot (click on the thumbnail for a larger resolution) of it. Sometime in the future I plan to allow people to download digital .pdfs of these magazines, but until then you’ll have to make do with snapshots. Well – enough blabbering, here it is!

perspective09

In slightly more unfortunate news, apparently my previous post about the importance of the design phase in Perspective has caused one of the editors in the team to be quite angry. I’m not quite certain what it’s about, but one of the reasons is about “talking about it online”, so I shall respect her views and will not disclose further information. In my efforts today to figure out what exactly went on during the Perspective meeting (apparently this one was a bit more eventful than the usual session), I came across an email my lead editor sent to all the other editors, urging them to be stricter on time management. Further enquiry showed that my lead editor also spent most of today’s session telling people off on deadlines and such. I applaud this action and sure hope design can be allocated more time, and hence become a more serious part of the creation process. Of course, this doesn’t just benefit me, it benefits everybody in the team, especially the editors as they know work will be handed in on time.

I apologize for any ignorance I might’ve displayed of the system – and I offer my suggestions to improve time management and incorporate designing more as beneficial and constructive criticism – not as bait for arguments or even personal attacks. To prevent further misunderstanding I have stopped comments (yes, you lazy lot can go back to using your feed readers and not bothering to comment) on the post, and hope to have this issue cleared up soon.

Epoch Fail – The UNIX Doomsday

Saturday, February 14th, 2009

big_y2kYesterday was the 13th of February. It was a very special day. Not only was it Friday the 13th, which probably means something unlucky will  happen – it just so happens that yesterday was the end of the world for UNIX systems.

Anybody here remember the Y2K bug? Basically they said computers couldn’t understand what would happen after the  year 2000 starts, and therefore computers would all fail and we’d be cast into a world of non-high-tech evilness. Or something like that. However the year 2000 came and went, and we all continued the happy people we were. UNIX systems, such as Apple Macs and Linuxes, used the UNIX date timestamp in order to calculate time. This is basically measuring the number of seconds since the last epoch. It’s a 10 digit number, and it just so happens that yesterday, the number of seconds since the last epoch would be exactly:

1234567890

Stunning. That happens only once an epoch.

It’s probably the geekiest event to celebrate, and I myself made a good hot cup of cocoa and drank it in bed doing mathematics on this wonderful occasion. How apt. If you visited Google.com around that second, you would’ve seen that their logo had changed to celebrate it too.

unix1234567890

During the Y2K bug, nobody was certain whether or not it would affect them. This is because it was on DOS systems (Windows) and naturally all Windows users are a bit soft in the head. However, us savvy UNIX users know that we do have our own time bomb, and that it’ll happen in the year 2038, when UNIX reaches the end of the epoch – it’s the mark of the doomsday where all our systems would shut down. Well, at least we are certain a disaster would happen instead of causing unnecessary fear.

Of course, we aren’t stupid and we actually did somethign about it – we now run in 64 bit mode and UNIX systems would only fail … let’s say about the time the sun burns out.

So much for the year of the Linux Desktop.

Oh, and in unrelated news, happy Valentine’s day – I guess.

Perspective Failure

Thursday, February 12th, 2009

trevor-as-artistAn experienced website designer can look at a website and instantly pick out the flaws down to pixel perfect alignment issues. Today looking at the newly printed Perspective magazines, I was disappointed.

It had something to do with the fact that there were unwanted grey borders around our gradiented background boxes (they should’ve been borderless!) which clashed horribly with the text. It also had to do with the stunning TWO editions which turned out instead of the lovely red one I was expecting. We now have Perspective: Bromine Edition and Perspective: Dirty-Swamp-Green Edition. Well, arguably the colours do look quite nice, but THERE SHOULD HAVE BEEN ONE COLOUR.  Not a clear difference between half the issues. “Hey there, how come yours looks a strange colour compared to mine?” Not to mention STUNNING visual effects such as blur, smudge, ink-splatter, and shadow being applied on the text, making it look visually rich and appealing . With these new additions, you will surely be a professional at answering CAPTCHA questions. (those “please enter the text in the photo” things on websites to check whether or not you’re a robot – normally featuring distorted text). Oh, and did I forget about the modern 3D technology used to produce anagliffs for random photos? (Anagliffs are those generated images such that if you look at them through red-green 3D glasses they look 3D) That’s right, but we don’t ship with the glasses. Conclusion? The printer has made nothing short of vandalism of our hard work.

Skimming very -very- quickly through the booklet you might not notice these defects enhancements, but will notice several mysterious visual apparitions artistically misaligned double sets of pages, with an obvious difference in colour between the left and right pages.

I quite liked the front page and the upgrades I did to the inner page templates (including fashionably fake curled up pages where the page number and category could be displayed – but these printing issues have truly cast a dark shadow over these improvements. The printers have done a fine job of coming a stunning 5-6 hours late on their promised delivery time both times we’ve worked with them, and their annoying ringtone (take me into your heart!) does little to appease the humour as we try to predict their true arrival time and next creative excuse.

I also want to take this opportunity that I have a newfound resentment to being called the Layout Editor. I didn’t sign up to be a Layout Editor. From here on out, I shall be referred to as The Layout Designer, or any title which has the word “Designer” in it. The reason? The job of a Layout Editor is to edit the freaking layout – that is to position boxes of text and images so that they fit on a page. I’m sorry, but last time I checked, I’ve seen this done by a 3 year old. Heck, we all do it when writing our essays (which have pictures). Before I came to this position, the magazine was quite literally just arranged boxes of text with some boxes that had another colour to differentiate articles from one another. I don’t blame the Layout Editor then- I don’t think he was well known for creativity (not really an insult, he was exceptional in other areas and still is). However this time, I’m sure people have noticed the big differences – though they are limited to the front page template and the inner page template.  To me, out of the 28 pages in this issue, I actually designed 2. That’s 7%. Wow, I didn’t even hit double digits. There is so much that can be done to visually enhance (now not in the sarcastic sense of the phrase) each and every single page, and this is simply not being done at the moment.

You see, currently the process is that every single “meeting” we in general don’t get anything done, then we wait for everybody to submit their articles late, then we cram in the “designing” stage at the very end. For this issue, the “designing” stage lasted 1 day. For 28 pages. Like mentioned before, all it consisted of was two slightly edited page templates and stacked boxes of text. I’m sorry – but how about this: we actually make designing part of the creation process, and not just shove it to a shoddy job done at the very end of the production line when the release date is in a weeks time.

Ask another designer to accomplish this feat and they will say  flat out “screw you”. It’s impossible to do. They are not going to waste their time stressing over such crappy time schedules. No matter how much money you offer them, they will not do it. It’s almost as bad as the time I got asked to do a 10 minute animation in 2 days. Those 2 days can take a running jump for all I care.

Oh wait, I forgot to mention that we don’t really want you to design during that time. We just want you to put boxes on a page.

“Sure”, says the designer. I’ll do it. Except might I quickly correct something? That is NOT design.

The excuse we’re using is that “we don’t have time”. Screw time. If it’s going to take a long time, then it will – but it should NOT go out looking just like an arranged list of articles. I’ve known enough about website creation to know that you can create just another website, or you can take time and create a masterpiece. Believe me, any other web developer will know the difference between a polished website and a shoddily done one. Oh, so will hackers. Even decent web users can notice the difference.

If you so as respect my ideas on design and layouting, please drop me a comment on this post so I may persuade my stiff necked “lead editor” to allow me to rebel on the next issue – hopefully making something truly worth printing.

Edit: the grumpy looking picture was added because some people complained that this post was a “wall of text”. It was among the first results in Google images for “grumpy looking guy”.

The Urge to Create

Tuesday, February 10th, 2009

urge

The urge to create is a painful urge. I know quite a few designers who, like me, suffer from this. It is when we can visualise something amazing, beautiful, touching, heart-warming, cold, dark, humourous, slightly sarcastic, provoking, and so damned influential – but we just cannot create it. We cannot share the vision. We cannot express nor even get a clear pencil sketch.

I have deleted the rest of this post, despite the word count nearing several thousand.

Food, Design, and Marketing.

Friday, February 6th, 2009

The past week has been. Yes. That’s it. It’s gone now. It was a shorter week in terms of school due to Chinese New Year eating into the first day of the week, and similarly I will have an extended weekend this time (not sure why the next Monday is being eaten). I decided not to give a technical post today as I myself haven’t been doing very technical things very article-worthy about. The minor technical tweaks that all Gentoo-users undergo that some might be interested in are all documented in my Twitter feed.

Well, it’s another rapid fire post. It’s basically what I put when I have a post to kill. Basically it includes random tidbits that aren’t meaty enough for a post of their own. The first thing I’d like to share is hardly meaty. It’s more soupy and buttery and full of disgusting preservatives. It’s what our wonderful school canteen company Sodexho serves us at lunchtimes. Sodexho is a monopoly at our school. Being the only caterer, they charge inconsistent (high) prices, give us leftover food, generate longer queues than the Malaysian immigration, and present all of this not with a smile, but more of a grimace as they attempt to operate their pocket calculators. The following fine specimen is a rarely found combination of slightly separated immiscible butter (which forms a strangely greenish coloured coagulated buttery oily soup), and leftover spaghetti noodles, the purpose of which is to play hide and seek as you fish for these slippery items with your bent plastic fork. In case you missed the point, here is a plate of butter and spaghetti. Emphasis on butter.

image_085

Of course, how could Sodexho survive with such pathetic food being distributed?  Simple – effective marketing (akin to Microsoft). As you can see, each day we are greeted by a finely decorated menu of what the day’s special is. The scrumptious descriptions leave nothing but mouth watering thoughts egging us throughout the day to beat the lunchtime queue. These guys have embraced the seventies notion that “Less is More”. Ah. Yes. Simplicity:

image_086

Well, that’s enough food for thought – any more and you’d be sick. I also have to share a twisted derivative of the historic “Mojave” experiment. For those that don’t know, the “Mojave” experiment was carried out by Microsoft with one aim: to prove that the problem wasn’t with Vista – it was with the customers.  People wanted to hate Windows. What they did was change a couple pictures in Vista, named it “Mojave” and got consumers to test what they thought was the upcoming Windows version. What happened? More consumers said it was an improvement. Of course, nothing was said about the supercomputers they ran it on to prevent lag, or the debugging team all SSHed in ready to correct any errors that might arise. This new experiment was similar: what some people did was take a computer with Linux and KDE 4.2 installed on it, and showed it to random people on the street, telling them it was the new Windows 7. Let’s take a look at what happened.

In other news, I’ve also been working on the new Perspective issue. It’s ready for publication and should be printed and distributed soon. However, here is a small screenshot showing the new design for the front cover. Of course there isn’t any text on it yet, but all in a good time. Here it is:

snapshot20

Ok, that’s enough for today’s rapid fire. Lots of articles in the drafts queue, none of which are just quite finished :)