October Wrap-up

This is the wrap-up of this blog for October, 2007 [ "October 12 to October 31 ( 20 days )"].

1. Host and Blogging Software

  • My blog is shifted to Dreamhost on 11st October, 2007. Luckily, I got a lot of discounts from them because they were celebrating 10th Birthday at that time.
  • I started using the standalone WordPress from WordPress.org. ( The one that I used earlier is WordPress MU (WordPress Multi-User). )

2. Plugins

Which plugins are you using on your site?

3. Theme

Yeah. I’m using my modified version of “Unsleepable Widget-friendly” theme for now.

4. AdSense

This might be interesting topic for you all. I have started using the Adsense from the following service. I wanna share some of my experiences… I promise that I’m NOT going to use the most annoying ads in my blog. All ads will be placed on the sitebar or under the comment box . I hope that it would be okay for you. Frankly speaking, I’m not going to blog for money. I have no plan to make money with my blog.. Why ads here? Because as my blog is on self-host, there are some costs for it. I like to cover those things. And also, I would like to run some programming or blogging contests on my blog..

  • Google AdSense : I think Google Ads is the best adsense service on the net. They pay for impression, clicks and actions.
  • AuctionAds : This is also a nice ads service after Google Ads. I start using it last 10 or something.. I got 4703 impressions, 4 clicks and 1 referral. I got free $25 bucks for signing-up with them. I’m not very sure whether this promotion is still available or not. You may try here if you want.
  • Chitika : I think that Chitika is “Pay-per-action” service that didn’t work well from me. So, I have removed it.
  • BidVertiser : I signed-up on that site today. It allows you to sign-up as both advertiser and publisher.

If you are also using Ads on your blog, please share some information with me. Which Service are you using? How many impressions and clicks do you get for a day? How much have you earned? Thanks.

Stats

  • PageViews : 17618 PageViews for 20 days ( it doesn’t include my own visits.)
  • Technorati Rank : 32,510 ( My rank dropped too much this month. My rank was 25,703 on 1st October. :( )
  • Google PageRank : 5 (I got it on 26th January this year. it has been nearly 1 year. I think the PR of my blog should has been dropped this time because this is fashion for now.. a lot of pro-bloggers are shouting about Google PR drops for their blogs.. )
  • Technorati Authority: 182
  • Bandwidth : 3.684 GB

Script#: C# to Javascript Converter

Have you heard about Script#? I heard about this toolkit last week even Nikhil started this project last year. I knew that there is a Java-to-Javascript converter called GWT (Google Web Toolkit) in Java World since long time back and I thought that it might be good if we, the C# developers, also have that kinda tools for ASP.NET web development. Now, the dream come true. Nikhil created Script# project that can convert the C# code to Javascript. I think it is pretty interesting (and strange ) tool and I wonder how Script# will convert the C# code to Javascript. Anyway, I started learning about Script# on last Friday. I’m gonna share what I have learnt about it so far. If you are already familiar with this tool, please share your thoughts about this tool. Thanks.

Introduction

Script# is a compiler that generate the Javascript instead of MSIL (Microsoft Intermediate Language) from C# sourcecode. Like GWT (Google Web Toolkit) that can convert the Java code to browser-compliant JavaScript and HTML, Script# is able to convert the C# codes to Javascript (either human-readable format or compact one). It is the best tool for those who hate to write the Javascript in HTML view.

Sourcecode Download : SSharp.zip

Example 1 : Getting Started with Script#

  • Download the ScriptSharp.zip from this link.
  • Extract it and double-click ScriptSharp.msi to install the Script# (You should note that Script# is currently available for Microsoft Visual Studio 2005. If you wanna use Script# with Visual Studio 2008, please check-out this post.)
  • Launch the Microsoft Visual Studio 2005 IDE and let’s create very sample Script# project
    Note: I recommended you to run the VS 2005 IDE as an administrator if you are using Windows Vista series.

  • Click “Script#-Enabled Web site” Project Template from “New Web Site” dialog (File>New>Web Site)
  • We will create one button named “clickMeButton” and the div called “greetingDIV” within
    tag.
    <div>
    <input type="button"  id="clickmeButton" value= "Click Me" />
    <br />
    <br />
    <div id="greetingDIV" class="divbox">
    Hello buddy!!
    </div>
    </div>
    

  • Go to the design-view and right-click on “Scriptlet” control as picture belowScript# - Scriptlet Control
  • Select “Edit C# Code” on content menu.
  • Paste the following code in Scriptlet Editor
    using System.DHTML;
    using ScriptFX;
    using ScriptFX.UI;public class MyScriptlet : IDisposable {private DOMEventHandler _clickHandler;
    
    private MyScriptlet(ScriptletArguments arguments) {
    _clickHandler = new DOMEventHandler(OnClickMeButton_Click);
    
    DOMElement clickMeButton = Document.GetElementById("clickmeButton");
    clickMeButton.AttachEvent("onclick", _clickHandler);
    }
    
    public static void Main(ScriptletArguments arguments) {
    MyScriptlet scriptlet = new MyScriptlet(arguments);
    
    }
    
    public void Dispose() {
    if (_clickHandler != null) {
    DOMElement okButton = Document.GetElementById("clickmeButton");
    okButton.DetachEvent("onclick", _clickHandler);
    _clickHandler = null;
    }
    }
    
    private void OnClickMeButton_Click() {
    DOMElement divGreeting = Document.GetElementById("greetingDIV");
    divGreeting.Style.Display = "block";
    }
    }
    

    Script# - Scriptlet Editor

  • Click “Save and Close” on Scriptlet Editor
  • Build the web application and Press “F5″ to run the application
  • (There is one button on the page.) Click this button.
  • “Hello Buddy!” message will be shown as picture below.Script# - Example 1

That’s.. You just created one script#-enabled webpage. Do you want to know what code Script# generated from your C# code? It’s easy. Just go to “View Source” and you will see the following script which is generated by Script#.

<script type="text/javascript">
//<![CDATA[
window.main = function main() {
Type.createNamespace('Scriptlet');

////////////////////////////////////////////////////////////////////////////////
// Scriptlet.MyScriptlet

Scriptlet.MyScriptlet = function Scriptlet_MyScriptlet(arguments) {
this._clickHandler = Delegate.create(this, this._onClickMeButton_Click);
var clickMeButton = $('clickmeButton');
clickMeButton.attachEvent('onclick', this._clickHandler);
}
Scriptlet.MyScriptlet.main = function Scriptlet_MyScriptlet$main(arguments) {
var scriptlet = new Scriptlet.MyScriptlet(arguments);
}
Scriptlet.MyScriptlet.prototype = {
_clickHandler: null,

dispose: function Scriptlet_MyScriptlet$dispose() {
if (this._clickHandler) {
var okButton = $('clickmeButton');
okButton.detachEvent('onclick', this._clickHandler);
this._clickHandler = null;
}
},

_onClickMeButton_Click: function Scriptlet_MyScriptlet$_onClickMeButton_Click() {
var divGreeting = $('greetingDIV');
divGreeting.style.display = 'block';
}
}

Scriptlet.MyScriptlet.createClass('Scriptlet.MyScriptlet', null, IDisposable);

// ---- Do not remove this footer ----
// Generated using Script# v0.4.2.0 (http://projects.nikhilk.net)
// -----------------------------------

ScriptFX.Application.current.run(Scriptlet.MyScriptlet);
}
ScriptHost.initialize([
'App_Scripts/ssfx.Core.js',
'App_Scripts/ssfx.UI.Forms.js'
]);
//]]>
</script>

Don’t you think that the generated Javascript code looks so similar to your C# code that you wrote in Scriptlet Editor? Yes. This is one of the advantages of using Script#. It can generate the human-readable Javascript that has the same structure as your C# code. If you are not sure how to write the object-oriented code in Javascript, you can just write the code in C# with the rich features such as IntelliSense, refactoring, compile-time and let Script# convert the C# code to the object-oriented Javascript code.

Note: The sample is already attached in this post. Please check-out “Example1.aspx” in zip file.

Okay. We’ve just done one sample with Script#. As the project is in very early stage, I notice that there are a few weak points and bugs in that project while I’m learning. And also, I’m kinda agreed with Dimitri Glazkov regarding on Script# project. (Check-out his post here.) Anyway, let’s learn more about Script# and we’ll see whether we should use it in real project or not.

Example 2 : Script# Ajax

  • Create the another Script#-enabled project
  • Add the “Generic Handler” to your project and name it “ExampleWebHandler.ashx”
  • Paste the following code in “ProcessRequest (HttpContext context)” function.
    context.Response.ContentType = "text/xml";
    context.Response.Write("Hi " + HttpUtility.HtmlEncode(context.Request.QueryString["name"]) + "!"); 

    Note: What this code does is that write the “Hi” after appending the name that came as a parameter in response.

  • Add one textbox to accept the user inputs, one button to invoke the server-side script and the div for displaying the result
    <div>
    Please Enter your name : &nbsp;&nbsp;
    <input type="text" id="nameTextBox" /> &nbsp;&nbsp;
    <input type="button" id="sayHiButton" value="Say Hi!!"/> <br /><br />
    <div id="result">
    </div>
    </div>
    
  • Add the argument to your scriptlet control. (Right-click on Scriptlet control and select “Edit” Arguments. then, Add one member (Name: name and Value: ExampleWebHandler.ashx?name={0}))

    Edit Arguments - ScriptletArgument Collection Editor

  • then, Click “OK” to close the “ScriptletArgument Collection Editor”
  • Paste the following code in “Scriptlet Editor”
    using System;
    using System.DHTML;
    using ScriptFX;
    using ScriptFX.UI;
    using ScriptFX.Net;
    
    public class MyScriptlet : IDisposable {
    
    private string _urlName;
    private DOMEventHandler _clickHandler;
    private XMLHttpRequest _request;
    DOMElement resultDIV = null;
    
    public static void Main(ScriptletArguments arguments) {
    MyScriptlet scriptlet = new MyScriptlet(arguments);
    }
    
    public void Dispose() {
    if (_clickHandler != null) {
    DOMElement okButton = Document.GetElementById("sayHiButton");
    okButton.DetachEvent("onclick", _clickHandler);
    _clickHandler = null;
    }
    if (_request != null) {
    _request.Onreadystatechange = (Callback)Delegate.Null;
    _request.Abort();
    _request = null;
    }
    }
    
    private MyScriptlet(ScriptletArguments arguments) {
    _urlName = arguments.name;
    
    _clickHandler = new DOMEventHandler(OnSayHiButton_Click);
    
    DOMElement clickMeButton = Document.GetElementById("sayHiButton");
    clickMeButton.AttachEvent("onclick", _clickHandler);
    }
    
    private void OnSayHiButton_Click() {
    InputElement nameTextBox = (InputElement)Document.GetElementById("nameTextBox");
    resultDIV = Document.GetElementById("result");
    resultDIV.Style.Display = "block";
    
    _request = new XMLHttpRequest();
    _request.Onreadystatechange = this.OnRequestComplete;
    _request.Open("GET", String.Format(_urlName, nameTextBox.Value.Escape()), /* async */ true);
    _request.Send(null);
    }
    
    private void OnRequestComplete() {
    if (_request.ReadyState == 4) {
    //if (_request.Status == 200) {
    _request.Onreadystatechange = (Callback)Delegate.Null;
    if (resultDIV != null) {
    resultDIV.ClassName ="divbox";
    resultDIV.InnerHTML = _request.ResponseText;
    }
    _request = null;
    // }
    }
    else {
    if (resultDIV != null) resultDIV.InnerHTML = @"<img src=""./images/indicator_technorati.gif"">";
    }
    }
    }
    

    Note: I assumed that you already have some ideas about Ajax before reading this article.

  • Build the application and run it. (You will see one textbox and one button as you have added on the page.)
  • Type the name you like
  • Click “Say Hi!” button. (You will see the result as below with the name that you enter.)

This demo is very sample that shows the way how to communicate between Script# code and the Server-side code. You can probably extends the web handler to get the more features as you need for your Script#-enabled application.

Debugging the Script#-enabled application

For IE Users, Go to “Debug->Windows->Script Explorer” or Press “Ctl+Alt+N” while you are running the project. You will see the list of script files that are included in page. Select the script file that you wanna debug and set the breakpoint. You know how to debug the Javascript with Visual Studio 2005, right?

For Firefox Users, Firebug is the best tool for debugging the Javascript.

Yeah. It is so sad to say that you are not able to debug the C# code that you wrote. Instead, you will be debugging the Javascript code which is generated by Script# compiler.. It makes you feel like debugging the MSIL code after writing the C# in IDE even the generated code is so much like the C# code that you wrote and human-readable but it is by-design so we can do nothing.

Conclusion

I’m gonna stop learning the Script# project for today. I’ll read about building the Script# library and Vista Sidebar Gadget and will post them in my blog. For the time being, I do have a few disappointments in using Script#. However, I will look more information about this project and I will share the conclusion with you.. If you are also learning this project like me, please let me know. We can probably discuss more about this project.. Thanks…

More Information about Script# ~

Widget Plugin – How to add the additional text-widgets for your sidebar?

The Text-widget is the most useful widget in Widget plugin. It allows you to place the HTML code or Javascript on your sidebar. In my blog, I have used a lot of text-widgets for showing links, feed count, adsense, license, stats and so on. As you were like me, you may probably need more text-widgets for your sidebar. Unfortunately, there are only 9 text-widgets available in your widget by default. How do we do to get the additional text-widgets more than 9?

The answer is simple. You need to make a few minor changes in the code of widget plugin. Don’t worry if you are not programmer. It is very simple and everybody can do it… I will show the steps how to change and what to change the source code of widget plugin. Actually, there are only 3 lines to change so you just follow all those steps carefully and get it done.. :) Don’t forget to backup your code.

Note: Widget.php is located under wp-includes if you are using Wordpess 2.3. (Why not in plugins folder? Because the widget plugin is natively supported by wordpress started from version 2.3. ) To edit this file, you have to download this file to your local machine and have to upload it back after editing. You can’t use the plugin editor to edit this file.

Steps to follow ~

  1. Download widget.php file to your local machine and open it with your favorite text editor
  2. Find “wp_widget_text_setup” function. Change “9″ to “the number of text widgets you want” in this line “if ( $number > 9 ) $number = 9;”

  3. Find the “wp_widget_text_register” function. Change “9″ to “the number of text widgets you want” in this line “if ( $number > 9 ) $number = 9;” and “for ($i = 1; $i <= 9; $i++)”

     

  4. Find “wp_widget_text_page” function. Change 10 to the number which is one higher than the number of text-widget you want in this line “<?php for ( $i = 1; $i < 10; ++$i )”. (For example, if you want 20 text widgets, set 21 in that line. )

     

Finally, you can upload this file to your host after editing.. (Thanks to “Syntax” for this post. I got those steps from his post in wp.org forum. ). That’s all about adding the extra text-widgets. Let me know if you have any problem with those steps that I mentioned in this post. Thanks.

Reference ~

Links ~

Unsleepable “Widget-friendly” Theme for self-host wordpress bloggers

If you are a fan of Unsleepable theme, you may download the widget-friendly version of that theme here. If you wanna know more about this modified theme, please take a look the FAQ below.

Download : Unsleepable Widget-friendly Theme

Unsleepable Widgetized

What is Unsleepable “Widget-friendly” Theme ?

Unsleepable “Widget-friendly” theme is the modified version of Unsleepable Theme created by Ben Gray for wordpress.org. As this theme is widgetized, you will be able to customize the sidebars of your blog in very simple way. If you are moving your blog (which is using “Unsleepable” theme) from wordpress.com to self-host, you may probably wanna download this theme.

Why did you want to modify this theme?

Actually, there are some differences between the “Unsleepable” theme from wordpress and the original “Unsleepable” theme created by Ben Gray. When I moved my blog to Dreamhost, I downloaded the original theme and started using it for my blog.. Unfortunately, the original theme is not widget-friendly and not like the one that I used in wordpress.com. So, I modified the way I like. :)

What changes did you make?

Here is the list of changes that I made ~

  • Make it “widget-friendly” : This is the main reason why I modify this theme. It helps people to customize the sidebar of their blogs in very easy way.. just drag and drop.. and done!
  • Show the title of blog instead of “Unsleepable” theme : The original image looks good but the name of our blogs is not “Unsleepable”.
  • Make a lit bit wider : According to the stats report of my blog, the most of visitors are 1024×768 resolution so I make this theme a lit bit wider.
  • Remove “Social bookmarking” : As I widgetize this theme, the images for social bookmarking are no longer available.
  • Remove “Live Search”
  • Remove “BottomBlock”
  • Remove “two logos” from footer
  • UPDATED on 20th Oct, 07 : Enabled the comment for page. (The original theme doesn’t show the comment for pages by default. )
  • UPDATED on 20th Oct, 07 : The UI for K2 Option has been removed.

Did Ben Gray, the original author of this theme, know about your modified theme?

Yes. Of course. I have informed him and got his permission to make my modified theme downloadable. (Thanks a lot, Ben.)

What would you like to say about your modified theme?

Well, Thank you so much for reading my blog and downloading this theme. I would like to say “sorry” if my modification is not so good. (I’m not PHP guys and I know nothing about WordPress APIs. ).

Feel free to let me know if you have any comment or suggestion. If you like this theme, thanks to “Ben”.

Firebug Tutorial : Section 4 – Net, CSS and DOM tabs

This is the last post of Firebug tutorial series. I’m going to explain about Net panel, CSS panel and DOM panel in this tutorial. As there are not so much things to say about that, I’m gonna write up about all three panels in one post.

#1. Net Panel

Net Panel - Firebug

The Net Panel can be used for measuring the performance of your webpage. It shows very useful informations about how long your webpage takes to load, the size and loading time of each and every files (i.e: image files, css, js file and so on.) of your webpage. if you are looking for the way to improve the performance of your webpage, you just need to check the NET panel after loading your page and see which files took so long to load.

1.1. What is Net panel showing?

Let’s take a lot what kinda information NET panel shows for you. There are four columns in NET panel.

  1. Name of files : The first column at the left-side shows the name of each and every files that are included in your webpage.
  2. Base URL : The second column shows the base URL of each file. If you are using some files from other sites (eg: linking image from other site, putting ads in your blog ) then the different URL(s) will be shown in this column.
  3. Size : The third column shows the size of each file.
  4. Loading Time : The last column shows the loading time of each file and whether those files are loaded from cache or not. It also show the status of each file in different colors as below. ( Thanks to Jack Sleight for the explanation of color and its description )
    1. Green : Loading the file from server.
    2. Dark Grey : Request sent to server, file loaded from server
    3. Light Grey: Request sent to server, “Not Modified” received, file loaded from the cache.
    4. No bar for the file: No request sent to server, file loaded from cache

You should also note that the list of files showing in the Net panel are sorted based on the order of how Firefox loaded those files.

1.2. HTTP Headers

The Net panel shows the HTTP headers of every request/response messages so you can easily find out the interesting information like the parameters that are passed to server, the type of webserver, cookies and etc.

HTTP Header

1.3. Filter the requests by type

If there are a lot of requests shown in Net panel, you can filter all of those requests based on the type of requests. For example, If you like to check the requests for image only then you can click the button called “Images” on toolbar to filter the requests for images.

1.4. Full path of files and Image Preview

If you move your cursor on the name of file (at the first column of Net panel), it will show you the full path of the file as a clickable link. If it is an image file then the actual image will be shown as a preview in Net panel. (Please check-out the pic below.)

Summary about Net panel

  • It shows the headers for request/response messages for all kind of requests
  • It can be used for XMLHttpRequest monitoring ( The Console panel does this too. You may check “Tracing XmlHttpRequest object” in this tutorial. )
  • It sorts the files based on how Firefox loaded those files.
  • It shows the loading time, the size of each and every files.
  • It shows a particular file is loaded from server or cache.
  • Net panel is a packet sniffer. ( not like YSlow which is a DOM crawler.)

Well. that’s all about Net panel. What do you think? Please leave a comment if you have any suggestion or comment.

#2. CSS Panel

The CSS panel allows you to view/edit the stylesheet of your page. It is just very simple panel and doesn’t have so much feature in it.

2.1. List of CSS files

To see all CSS files of your page, just click the button (“michaelsync.net” for my case) beside “Edit” button. Then, the content menu will be shown and all CSS files will be listed on that menu. So, you can simply click any CSS file that you wanna view.

2.2 Normal Mode Vs Editable Mode of CSS Panel

Like HTML tab, it has normal mode and editable mode. If you click “Edit” button on the toolbar of CSS panel, it will become the editable mode.

Normal Mode

  • Advantages
    • It shows the highlighted CSS syntax so looks nice.
    • It allows you to edit the attribute of CSS class.
    • It autocompletes as you type against the list of possible values for the property you are editing
    • It allows you to disable a particular style on the fly.
  • Disadvantages
    • You can’t create new CSS class in this view.
    • It is difficult to remove one or more CSS class(es) from the file

Editable Mode

  • Advantages
    • You got the full control of your CSS file so that you can edit/remove the CSS class as many as you want. You will feel like writing in notepad.
  • Disadvantages
    • You will lost all syntaxhighlighting or autocomplete feature of CSS panel.

#3. DOM panel

It shows all default DOM properties, functions, constants, the user-defined properties and user-defined function.This panel is not very helpful (at least for me) except one thing. If you wanna find out how many function or properties included your scripts, you may probably want to use this panel to find out about that.

Let’s write one short script as below in plain HTML file.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title>Untitled Page</title>
<script type="text/javascript">
function Car(){
this.Gear = 5;
this.Start = function(){
console.log("Please put my car a lit bit!");
return false;
}
}
</script>
</head>
<body>
</body>
</html>

And then, save it as htm file. Open it in Firefox and then check the DOM tab. You will see the result as the picture below. “Car()” is a function that you just wrote in JS, isn’t it?

Okay. That’s all about DOM tab. This is the feature what DOM tab has so far….

My tutorials for Firebug is ended here. I hope that you all do enjoy reading all of my tutorials. Actually, I’m not teaching you about Firebug. I’m just sharing the way I understand about Firebug and I believe that you found it useful. Any feedback are welcome as usual. Feel free to let me know if you have any suggestion or comment.

One more thing is that Yahoo is releasing the Firefox addon called YSlow integreated with Firebug. This tool is also a performance measuring tool like Net panel. YSlow used to determine the performance of webpage based on 13 rules. I’m currently learning about those rules and doing some experiments. I will post about this in details very soon.. Please keep on watching my blog….

Thanks for reading. Have a nice day!!
Michael Sync
 Hey! don’t forget to give the feedback about my tutorials.. Here is the index.. Thanks..

Firebug Tutorials

Jokes: MUTHU

Hahahaha

MUTHU & THE INTERVIEWER
Interviewer : What is your birth date?
Muthu : 13th October
Interviewer : Which year?
Muthu : … EVERY YEAR

MUTHU & HIS MANAGER
Manager asked to Muthu at an interview….
Can you spell a word that has more than 100 letters in it?
Muthu replied: P-O-S-T-B-O- X

MUTHU & LONDON TRIP
After returning back from a foreign trip, Muthu asked his wife, Do I look like a foreigner?
Wife : No! Why?
Muthu : In London, a lady asked me, “Are you a foreigner?”.. that’s why …
Wife : SHOCKED!

MUTHU & TOURIST
One tourist from U.S.A. asked to Muthu whether any great man born in this village or not ..
and Muthu said .. “No sir, only babies were born here .. ”

MUTHU & HIS EXPERIMENT
Muthu was doing experiment with cockroach.
First he cut it’s one leg and told WALK. WALK. Cockroach walked.
Then he cut it’s second leg and told the same.
Cockroach walked. Then cut the third leg and did the same.
At last he cut it’s fourth leg and ordered it walk! But cockroach didn’t walk.
Suddenly Muthu said loudly, “I found it. If we cut cockroach’s four legs, it becomes deaf.
Muthu become a saint!

MUTHU & DRIVER
When Muthu was travelling with his wife in a motorised tricycle, the driver adjusted mirror.
Muthu shouted, “You are trying to see my wife ?
Sit back. I will drive.

MUTHU GOES TO HOTEL
Muthu went in a hotel.
To wash hands he went to the washbasin.
There he started washing the basin.
Seeing this, the manager asked what was he doing.
Muthu pointed towards the board “WASH BASIN”

MUTHU & INTERVIEWER – FINAL PART
Interviewer : Just imagine your in 20th floor in a building, it caught fire and how will you escape ?
Muthu : It’s simple.. I will just stop my imagination .. :)

Oh .. i forgot . the funniest part ..
On a political rally Muthu was arrested. Why ????????????
Because, a woman journalist walking with a badge wrote “PRESS” on her right chest … and he did it ! :)

Have Fun! :)