Saturday, 26 December 2009

The Final Bugzination! Final Release! Et3alemooha ba2a ya Mina!

I just submitted the patch for the thing i donez, i dont really think i did it correctly thought, bass eshta ba2a.. maleesh da3wa ya3ni ana khallasto ba2a.. homma 3ayzeen yestafado be shoghly.. kana beha... mesh 3ayzeen.. wallahi ya3ni...

The difference between the final release and 0.2 is the following:
- user can choose the forwarding headers he wants to include in the mails he forwards, and furthermore, the user can choose to automatically remove all original headers independent of the headers he is using at the moment. The screenshot shall explain more:


How Do ZAT?

(i added the 'forward headers' dropdown and the 'remove existing ...' checkbox, in case you are wondering what's new about this window.)

I Tell you nao!

First you need to add a "preference", which is passed on somehow to the preferences window and can be called to hold certain values for the properties.

A preference is added in the following way:

< id="mail.forward_message_header" name="mail.forward_message_header" type="int">"

< id="mail.forward_remove_headers" name="mail.forward_remove_headers" type="bool">"

The first one is the preference for the dropdown and the second one for the checkbox. I added these two lines to the compose.xul file located under comm-central/mail/components/preferences. Under the last folder you will find .xul files for most of the GUI components like, display.xul, general.xul, which are both tabs in the preferences windows, and so on.

Then, you add the actual box, that is displayed in the preferences window:

< align="center">
< value="&forwardHdr.label;" accesskey="forwardHdr.accesskey;" control="forwardMessageHeader">
< id="forwardMessageHeader" preference="mail.forward_message_header">
<>
< value="3" label="&noHeaders.label;">
< value="0" label="&minHeaders.label;">
< value="1" label="&normHeaders.label;">
< value="2" label="&maxHeaders.label;">

< /menulist>
< id="removeHeaders" label="&removeHeaders.label;" preference="mail.forward_remove_headers" accesskey="&removeHeaders.accesskey;">
< /hbox>

I will explain the labels and accesskeys later although they are really simple, so if you dont understand much from the previous "code" start by ignoring anything, that has label or accesskey.
The preference attribute for menulist just says which preference is controlled by this dropdown menu, and in this case it's the forward headers preference mentioned previously. Then we have some menuitems also with labels.
And next a checkbox which represents the checkbox we have and it is binded to the preference remove headers.

Labels and accesskeys are simple the label of each item or menu, so for example
< label="&removeHeaders.label;"> means that the checkbox has the label of the value inside the variabel removeHeaders. The accesskey defines which hotkey gets you to this menuitem, checkbox, ... . As an example take a look at the previous image, you will see that the 'h' in forward headers is underlined: this means, that its accesskey is 'h', and the label for the whole menu is "forward headers".

I dont know why something like: label="forward headers" is not used, but in all the source code i checked this way was applied.

The labels and accesskeys are all stored in two files:

1.comm-central/mail/locales/en-US/chrome/messenger/preferences/compose.dtd
2.comm-central/suite/locales/en_US/chrome/mailnews/pref/pref-composing-messages.dtd

That is where i added all the labels in the following way:

< !ENTITY forwardHdr.label "Forward headers:">
< !ENTITY noHeaders.label "No Headers">
< !ENTITY minHeaders.label "Minimum Headers">
< !ENTITY normHeaders.label "Normal Headers">
< !ENTITY maxHeaders.label "All Headers">
< !ENTITY removeHeaders.label "Remove existing headers from message">
< !ENTITY removeHeaders.accesskey "X">

That is basically it. The last thing having variables in your actual code, that take the value of the preferences:

(the following code is from mimedraft.cpp)

PRInt32 show_headers;
prefBranch->GetIntPref("mail.forward_message_header", &show_headers);

PRBool removeHeaders = PR_FALSE;
prefBranch->GetBoolPref("mail.forward_remove_headers", &removeHeaders);

This means that show_headers takes the value of the preferences "mail.forward_message_header" and the bool removeHeaders takes the value of "mail.forward_remove_headers".

The design has been changed a bit to be able to use the "remove original headers" function without having to be in anonymous forwarding mode:

if(removeHeaders)
mime_remove_headers(body, headers, composeFormat, mailcharset);

Which means that if the checkbox is ticked, then the function mime_remove_headers is called, and all the headers from the body are removed, then we move on to inserting the headers:

switch (show_headers)
{
case 0:
mime_insert_micro_headers(body, headers, composeFormat, mailcharset);
break;
case 1:
mime_insert_normal_headers(body, headers, composeFormat, mailcharset);
break;
case 2:
mime_insert_all_headers(body, headers, composeFormat, mailcharset);
break;
case 3:
mime_insert_no_headers(body, headers, composeFormat, mailcharset);
break;
}

in case 0 - 2 some headers are inserted (i crtd none of those functions) and in case 3 my function "mime_insert_no_headers" is called, which i changed to the same state it was in in Bug Release 0.1, which is being an empty function.

I am done bugging!

Monday, 21 December 2009

BUGZ BUNNI 0.2

First, I must apologize for the title. And the next coming one, because you think this one is bad? Wait for the final one.

As mentioned in the post "Bug fix Me 0.1" my bug was about forwarding emails and removing the headers.

What I had done in release 0.1 was, simply not inserting any headers for newly created messages, old headers though remained the same.

In release 0.2 we simply remove existing headers. This is done by traversing the body, which saved in a single string, and remove the headers once we find one.

Of course this approach has a flaw, which is removing regular text (not a header) that has a similar format to the header format.



This picture is just awesum by the way. I dont know who the person in the picture is, but I search google images for the word "n00b" and it was the first picture in the results (of course without mozmoz).

Sunday, 13 December 2009

Bug Fix Me 0.1

OK, so I think I just finished release 0.1 for the first bug. It wasn't that hard. NOT! As for the coding you end up changing two lines or something, but the whole work is to actually find these two lines in the omareldeebillion lines of code of the TB source code.

When forwarding you would want to have the choice to include no headers at all. I picked this bug because personally, this is something that really bugs me (WOAH! No pun intended te-he). Having to remove all the headers from the message and so on... So, what I did is giving the ability to forward a message just as is, without having any annoying headers.

The solution or the actual code to have no headers is not as interesting as what I had to go through to get to that, so, I am going to share that with you rather than just the solution. Also, because the solution might look funniiiiiiiii xD (remember, that this is only the first release in a way).

Steps:

1., when forwarding a message, this is intuitively considered composing a new message, even though its not really a “new” message, but still → composing. Which should be – again intuitively – found under mailnews/compose/src/ and then under that I found the c++ file nsMsgCompose.cpp, which looks like a file, that might be useful to me considering my bug.

Link to nsMsgCompose.cpp:

http://mxr.mozilla.org/comm-central/source/mailnews/compose/src/nsMsgCompose.cpp

Searching this file for “forward” got me to the following few lines of code:

1567 nsresult nsMsgCompose::CreateMessage(const char * originalMsgURI, 1568                                      MSG_ComposeType type, 1569                                      nsIMsgCompFields * compFields) 1570 {

1705   // If we are forwarding inline, mime did already setup the compose fields therefore we should stop now

2100 }

which led me to the mime files.

2., Searching mxr for forward under mailnews/mime/src led to the file mimedrft.cpp, where the forward messages are created.

Link to mimedrft.cpp:

http://mxr.mozilla.org/comm-central/source/mailnews/mime/src/mimedrft.cpp

1138 mime_insert_forwarded_message_headers(char            **body, 1139                                       MimeHeaders     *headers, 1140                                       MSG_ComposeFormat composeFormat, 1141                                       char            *mailcharset) 1142 {  ...  1152  1153   switch (show_headers) 1154   { 1155   case 0: 1156     mime_insert_micro_headers(body, headers, composeFormat, mailcharset); 1157     break; 1158   default: 1159   case 1: 1160     mime_insert_normal_headers(body, headers, composeFormat, mailcharset); 1161     break; 1162   case 2: 1163     mime_insert_all_headers(body, headers, composeFormat, mailcharset); 1164     break; 1165   } 1166 } 

led The functions micro_headers, normal_headers and all_headers are the ones responsible for inserting headers into the forwarded message. But as you can notice this does not really work since the “default:” is put at line 1158 before the other cases, and – what can't be seen here - show_headers is initialized to 0, which means that only “mime_insert_micro_headers” is called anyways.

So, the two changes done to this code are:

  1. moving the “default:” to the end of the switch

  2. creating the function static void mime_insert_no_header() and adding it to the switch with “case 3:”

As for the function I created if you are looking for something really impressive now check out any of the following links:

http://www.youtube.com/watch?v=FFnLuqP0LfU

http://www.youtube.com/watch?v=A_hlVrFHE_A&feature=related

http://www.youtube.com/watch?v=yFl-WQAXMto&NR=1&feature=fvwp

http://www.youtube.com/watch?v=pjuoIeXFivw

http://www.youtube.com/watch?v=XnvbyXsbSs8

My function is not in any way impressive as the previous links, it is just an empty function, YES an empty function:

static void

mime_insert_no_headers()

{

}

while setting the show_headers integer to 3.

A more generic way to do this – this part could actually go under help needed under the bug wiki (when I create it te-he) – is to have a drop down menu on the forward stating whether you want to forward the email with minimal, normal, all or no headers, which then sets the show_headers to 0, 1, 2 or 3 accordingly.

An even MOAR generic approach is to be able to set from the preferences which headers you want in your forwarded emails. All the headers are:

Return-Path,

Received,

Message-ID,

Date,

From,

User-Agent,

MIME-Version,

To,

Subject,

Content-Type,

Content-Transfer-Encoding.

Thursday, 26 November 2009

Either They Decorated For Christmas Early

It has been a long time since my last blog post, but no one reads my blog anyways (except for some very cool ppl like shehabbi, mae, schlix, found a comment from shishtawi once - i guess - thumbs up!, and of course dr. fatma altough i think she reads my blog only because she has to). Ah, and i forgot to mention mina el n00b hehe :)

I actually saved this post as a draft like two weeks ago, but forgot to post it for some reason, I don't even remember what the post was about (of course I do, uh...).

So, for the mini-project we worked in a group of three people ahmed yasser shehab and me (yes, thats three ppl). And since our project ... our MINI-project was directly related to windows 7 we needed windows 7, which i did not have. Then, we needed a relatively new version of ubuntu (or any other linux distribution). And since i still had ubuntu 7.10 back then, almost nothing worked there, so i decided to go ubuntu 9.10. THE HORROR! no.. kidding. It's cute.
So, from the end like this (mel2akher kedda), nothing of the work we done for the mini-project was on my laptop, which leaves me with a thunderbirdless machine (y) <- this stands for thumbs up by the way. Now, i am trying to build thunderbird. This blog is about the problems i am facing with that or they're all dead. I remember at one of our labs - after realizing for the idontknowhowmuch-th time, that the desktops do not work - we decided to use our laptops to build stuffz, i think it was venkman that time. So, we had to put in the following command in order to use the proxy: export http_proxy="http://majid.el-din:myactualgucpasswordthatiwontsharewithyou@50.0.0.5:8080/" and of course we had to change the firefox settings to using the proxy. After this lab, when i got home i set the firefox connection back to "no proxy" and thought, that's it. Then, i tried to build thunderbird from the simple thunderbird build link: https://developer.mozilla.org/en/Simple_Thunderbird_build. first command: sudo apt-get build-dep thunderbird gave me: http://switch.dl.sourceforge.net/sourceforge/corefonts/andale32.exe Connecting to 50.0.0.5:8080... failed: Connection timed out. Giving up. I did not understand why the terminal was trying to connect to 50.0.0.5:8080. So i googled the error and got the following: Setting firefox to "no proxy" only applies the no proxy connection to firefox, any terminal based connection is still set to the oldest change from the terminal, so i echoed the proxy (echo $http_proxy) and YES! the proxy was still set to: http://majid.el-din:myactualgucpasswordthatiwontsharewithyou@50.0.0.5:8080/ So, i googled how to undo that, and found several ways: 1. unset http_proxy 2. export http_proxy="" Then, just to be safe go to System->Preferences->Network Proxy and make sure it is set to "Direct Internet Connection". And to be safest (imbaest) go to System->Administration->Synaptic Package Manager and there under Settings->Preferences->Network click "Direct Internet Connection". Now you should be good to go, NOTHING still refers to the 50.0.0.5:8080 proxy.

So, i ran the first command again:

sudo apt-get build-dep thunderbird

and got the following:

http://switch.dl.sourceforge.net/sourceforge/corefonts/andale32.exe
Connecting to 50.0.0.5:8080... failed: Connection timed out.
Giving up.

Scratch hed.

After a lot of googling that day the things most of the people on forums suggested for karmic was:

1. set up a local proxy and connect to it
2. (and i am quoting here) "I ended up doing a full system reinstall"

Since i did not want to do any of this i started experimenting with other commands. On the forums people were asking to try to run "sudo apt-get update", and if it runs the updates, then you should be good to go. So i did run the command and it worked and i thought it's all OK now and tried running the thunderbird command again => Connecting to 50.0.0.5:8080... failed: Connection timed out. Then, i started experimenting with other "sudo apt-get install" commands, MOST of them tried to connect to 50.0.0.5:8080 with fail of course. But some of the commands NOT trying to connect to 50.0.0.5:8080 gave me a glimpse of hope. And for the first time i decided to read the error messages in the terminal a bit, turns out the failure comes "Setting up ttf-mscorefonts-installer (3.0) ..." and the error message i got was:

http://downloads.sourceforge.net/corefonts/andale32.exe
Connecting to 50.0.0.5:8080... ^Cdpkg: error processing ttf-mscorefonts-installer (--configure):
subprocess installed post-installation script killed by signal (Interrupt)
Errors were encountered while processing:
ttf-mscorefonts-installer

(Still trying to connect to 50.0.0.5:8080 no idea why)

I ignored the proxy stuff and searched for the ttf-mscorefonts-installer, seems more people shared the same problem, the first thing i tried seemed to work (i get no error) which is removing the ttf-mscorefonts-installer from your system, since somehow the problem is that the package is there and the terminal is trying to read from it and i dont know what...., i didnt really continue reading there since it didnt make any sense, but i tried it anyway and it seemed to work.

This time after running:

sudo apt-get build-dep thunderbird

i got:

Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 6 not upgraded.

I don't know if this should happen or not, but i am not getting any errors so i am happi *smiley faices*

Wednesday, 28 October 2009

Hubbly Bubbly in the Skye!

The first paragraph is not in any way interesting or relevant, so please people just skip it.
So, i have four email addresses, my usual hotmail, my uni email and two other emails that i had created for trolling purposes. All accounts (except the uni account) share the same password because it is much easier to manage them that way. Clearly. The password i has, happened to be shorter than 8 characters, which is not acceptable for google accounts. Googley accounts need FORTIS!!! passwords, which consist at least of 8 characters. So basically i had to come up with a new password (which i forgot. Instantly.) just for this blog. I used one of the old email-addresses though, and i had forgotten which one i had used. So i had to try all my accounts with different 8-char passwords, till i gave up and tried hitting this "forgot your password?" link. It actually werx *thumbs up* and now i can be bloggingz agenz! woohoo! Actually i dont really want to anymore because this whole fuss (yes it was a fuss) made me loose my blogging appetite.. but uh... i has to. If you really read up to here, then i am sorry but that is your fault, i told you to skip this paragraph. I'll even make that bold now, so that no one can complain! Bolded up!

I know i should have updated my blog with this post like over 9000 days ago, but there was not really much time, and i doubt, that i have time now, but c'mon... blogging is fun. So, last week's assignment or mini-project was about processing.js, which is actually a very nice language, tool, ... whatever you want to call it. I am impressed, that you can create such cool interactive graphic windows using javascript (although it's not really javascript, but it's still cool though).

The application we (Ahmed-Yasser Fadl, Shehab El-Noury and me) did was displaying all the blogs as floating circles in a window. We gave it the name "Blogs on Blobs". The whole application was based on the mouse following window, that you all probably already know from the processingjs website, and we added a simple collision detection method also taken from the examples on the website.

More about the application:

There are as many bubbles or blobs as there are blogs, which is 29 in our case, i guess, the part about how to parse the names and links to the blogs should be found on Ahmed-Yasser's blog. since he did that part.
All blobs have labels on them. The blobs move randomly through space trying to avoid colliding with each other. The user can drag a random blob and move it around in space or can click it to be redirected to the blog of the corresponding blob.

In our code we defined a structure for a bubble which had the variables
int x and y - the current x and y coordinates
int nx and ny - the new x and y coordinates
float radius - radius of the bubble (depends on the length of the text displayed on the bubble)
String text - the text (or label) displayed on the bubble
int delay - the movement speed of the bubble (the higher the slower)
String link - the link to which the page is redirected when this bubble is clicked

Troublez wiz Bubblez:

The only problem - worth mentioning - we had was when putting the code together (using s.th. like Bespin would have been useful for that project, only Bespin does not work *smiley face*).

Ahmed-Yasser was responsible for parsing the links and the texts for the bubblez from the .xml file.
Shehab was responsible for displaying the text on the bubblez (and changing their position with the bubble).
I was responsible for dragging the blobs and the random movement of the bubblez when not being dragged.
Any other tasks not mentioned here were done together in a way, that no one could be considered the contributor for them (pure team werx!).

So, the problem i had to deal with was getting the text to work with the xml parsing. Our last step was putting the text on the bubblez and for some reason that did not work as expected. Although the problems we had, were pure n00b problems (mainly coming from skitz) they are worth being mentioned here.

1. In the method parsing the names and links for the bubbles, the text was stored in a "bubblez[i].title" variable (bubblez is an array of Bubble containing all bubblez) , which clearly does not exist and should be replaced by bubblez[i].text. One word about that: "N00B!"

2. In that very same function there was a variable "text" which somehow was recognized as a function (since a function text() exists) but with no valid arguments, since it was used as a variable. So this variable had to be changed to any other random name (e.g. "t"). And that made it all work.

Parsing Names/Links, Moving/Draggable Bubblez, Text/Links.

I think this must be the most boring post EVAR!!!1!!eleven!!!

Saturday, 24 October 2009

LINUX IS TEH OWNZ!!!

FIRST.. DEACTIVATE CR00Z QUONTROL.

Ok... so, we are working on the application for "processing.js". I am working on ubutnu and my very nice friend shehab is working on windows 7. We all know - as the computer scientists we are - that Linux OWNS all!

First thing, uh... originally i wanted to call this post "How to crash Ubuntu in 2 easy steps" but now i have something to add, and i'm not going to post two separate posts about the same thing, kind of.
Let's start with how to crash Ubuntu in 2 easy steps:
  1. press the "fn" key on your laptop - function key
  2. press left - to increase the brightness of the screen.
FREEZE!

Why? Because Linux is cool and rolls like that!

Another cool way to crash Ubuntu in 2 easy steps - although this one does not really work 100%.

  1. In mozilla firefox press "ctrl"
  2. next, press "t" - which opens and new tab... and crashes ubuntu sometimes. xD
Now, to the processing.js related linux stuff:
I had a VERY basic file, where i was trying to display some text in a window. But it just did not work. So i sent the code to shehab (Windows 7 FTW) to tell me what's wrong with the code. And you know what was wrong? Ubuntu. Code runs on windows 7 like *thumbs up* .. no make that *TWO thumbs up* and ... well doesnt really run that nicely on ubuntu. Say, does not run at all.

Now people could tell me, that it's not working because i had to h4x0r my way into ubuntu to make it work. But on windows i didnt have to h4x0r my way through anything. It just worx. Now i am on windows um... it's something unknown actually called "windows vortex" i like to call it "windows hello evandro" ;) it's a new breed (windows XP 3ala windows vista). Does not really matter what windows it is. The code works. :)

Windows for the win??

NOOOO!!!!

LINUX!!! LINUX!!! c'mon people.. we are computer scientist, if we are not the ones to use Linux, then who will?

I wish i had a camera so i could take a photo of myself giving Linux 4 thumbs up. But i guess i cant.

Monday, 19 October 2009

Ubiquity tips for the total n00b

Last week in the osc-class we started using ubiquity. So, yes! i iz teh total n00b! Personally, i would be VERY pleased if i would have found like steps or easy tips to guide the TN0 through ubiquity (I decided, that this is the abreviation of total n00b, could have been TN only but TN0 looks WAAAAY cooler, gives it a whole new cs feel).

I am not really equipped enough to guide TN0s through ubiquity since I am still a TN0, maybe an advanced one, but still. So, I think an easy way of doing this is for all to contribute.


CONTRIBUTE!! CONTRIBUTE!! CONTRIBUTE!!


The idea is, whenever you discover something in ubiquity (of course this could apply to any other program, but I’m still on ubiquity so, …), where you say “WOAH! How could I be such a TN0!!” just post it on your blog or we could have a wiki for it or wateva. The idea is TN0s would like it. I am pretty sure they would.

Remember, this is not about explaining the whole concept of ubiquity, it’s just explaining some simple functions a TN0 might not know.Of course there could be complicated stuff in it. But i would prefer starting with the simplest most basic things.

Initially, I wanted to call this post something like “10 hints for the ubiquity n00b” but since I am a n00b myself I don’t think I would be able to get 10 on my own, so, again.


CONTRIBUTE!! CONTRIBUTE!! CONTRIBUTE!!


My contribution to this could be simple commands such as:

- Utils.focusUrlInBrowser(“enter Url here”) and Utils.openUrlInBrowser(“enter Url here”): opens the url inserted between the double quotations.

- displayMessage(“enter msg here”): displays the inserted message as a mozilla firefox notification.

- CmdUtils.CreateCommand({…}): enables the developer to create a new command. The three dots represent what you actually write in the command. A command could be used to do almost anything. For more information just ask google.

- Adding arguments to your command: you can add arguments to your command to create dynamic commands, instead of having a command execute the same thing over and over again without taking any input from the user/developer. To add an argument you write “arguments: “ just like how you add name/s to the command, and then you enter the arguments you want.

As an example:

Arguments: [{role: “o_hai”, nountype: noun_arb_text}],

This creates an argument for the command with the identification “o_hai”, the type of this argument is noun_arb_text, which means that it is just arbitraty text. Of course those two can be changed.

To access this argument write:

arguments.o_hai.text or arguments.o_hai.html,

depending on what you want to do.


You might be wondering “why is this useful to me, how can I benefit from this?”. Well, you cant. You can only add something. For the TN0. C’mon people.



Do it for the n00bs! n00bs needz halpz! too you know.




by the way. mina metias is a n00b. :)

TO DO!

Since we all know that open source is all about "scratching ones personal itch" i thought i would start with that. I remember having had troubles with viewing the TO DO - list of the course. Even though finding the to do list is much easier than how it was in the first week, it would still be easier, if there was a ubiquity command that instantly - well.. not really instantly, but much faster than having to click your way through the wiki - sends you to the chosen to do list.

So, the only problem with that is, that the URLs to the TO DOs aren't really following a certain structure, which would make it easier for the developer. In other words as a developer you can't have a generic function that gives you the desired URL depending on a digit you enter (1 for the first week, 2 for the second, ... and so on). It all has to be written manually, which is still no problem, since we won't have more than 10 weeks, i guess. But still, i remember something being said about laziness in the CAB document - which i by the way did not find very impressive, but as a computer science student i think i have to worship it, just like ze germenz HAVE to hate Hitler, which is not the point by the way, but it just crossed my mind. Isnt that what blogging is all about? Rite?

To the command: you basically type the command with a number representing the week you want and VOILA! it send you directly to the desired TO DO page. Not very complicated, but useful. To me at least.

This is the code:

CmdUtils.CreateCommand({
names: ["g-osc-todo", "todo"],
author: { name: "Majid Serag El-Din", email: "majid.serag@gmail.com"},
description: "Sends you to the desired to do list.",
arguments: [{role: "number", nountype: noun_arb_text}],
preview: "Can haz give todo list??? kthx.",
execute: function do(arguments)
{
if(arguments.number.text == "1")
Utils.focusUrlInBrowser("http://se.bigbuddysociety.net/wiki/index.php?title=Introductory_Meeting#To_Do_List");
else
if(arguments.number.text == "2")
Utils.focusUrlInBrowser("http://se.bigbuddysociety.net/wiki/index.php?title=Second_Meeting_-_Revision_Control#To_Do_List");
else
if(arguments.number.text == "3")
Utils.focusUrlInBrowser("http://se.bigbuddysociety.net/wiki/index.php?title=Build_Automation#To_Do_List");

(this is not part of the code, but adding a new if-else for a new week could be done here!)

else
Utils.focusUrlInBrowser("http://se.bigbuddysociety.net/wiki/index.php?title=To-Do");
}
})

Of course the if-else region looks a bit fuzzy. I tried searching for a "switch" function instead of the ifs and i succeeded. not. The bad thing about this code is, that whenever there is a new to do week the URL to this page has to be if-elsed with a new number (the number of the current week), which is not really hard to do, it is just inserted in the area shown in the code above.

I would like to thank mkhouly (and his very nice friend omar roushdy) since i got the "Utils.focusUrlInBrowser" off of his blog. On his blog you will find special thanks to abdallah el guindy (or gindy) since he got it off his blog. So, i guess we'll thank abdallah here again, although i don't really get the difference between both: "Utils.focus - " and "Utils.openUrlInBrowser", so if someone could explain the difference it would be imba.

According to this link: http://ubiquity.mozilla.com/trac/ticket/230 "Utils.openUrlInBrowser" opens all URLs in the same tab. So if we replace all "Utils.focusUrlInBrowser"s by "Utils.open..." it should open them all in the same tab, which would not be bad, actually. If it would work.

Difference between open and focus. Anyone?

Two thumbs up.

Sunday, 18 October 2009

Blogging is imba!

So, let's start blogging.
This is me; just majik.