المحاضره الخامسه من مؤتمر JSCONf2009

09/07/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

jack moffitt at javascript conference 2009

وضع منطموا مؤتمر JavaScript confernce 2009 اليوم المحاضره الخامسه ، اعطاها Jack Moffit يناقش فيها مكتبه Strophe التى تمكنك من عمل تطبيقات تعتمد على بروتوكول XMPP بواسطه جافاسكربت ، هذا هو وصف المحاضره :

Grown tired of the AJAX buzzword blues? Jack Moffitt takes us on a whirlwind tour of Strophe for building beautiful XMPP based applications in pure JavaScript using Bidirectional-streams Over Synchronous HTTP (BOSH) which will most likely be the next evolution of web technologies. The focus concept is the “Real Time Web” and how to actually accomplish low latency rich data applications that put AJAX to shame. With Strophe you can leverage all the goodness of XMPP at the client side. It is a very exciting technology and great deep tech talk from the one of the geniuses behind the brand new Collecta.

اتمنى لكم و لنفسى مشاهده ممتعه :D .

الشرائح هنا ، و المحاضرات القديمه من المؤتمر هنا و هنا .

native JSON api

04/07/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

كما وضحت من قبل فى موضوع JSON ، ان النص JSON String الناتج من طلب السيرفر لابد من عمل eval له حتى ينتج عنه كائن object يمكننا الوصول إلى خواصه ، المشكله تكمن انه لو كان هذا ال JSON ناتج من مصدر غير موثوق منه او غير امن كما هو الحال فى جميع ال web services المتوافره ، يمكن ان يحتوى على self invoking anonymous function وظيفه مجهوله يتم تنفيذها تلقائيا يكون لها تحكم كامل فى الصفحه التى تستقبل هذا الرد من السيرفر ، يمكنها الوصول لل session cookie و الكتابه على الصفحه و تغير واجهه المستخدم و تنفيذ هجمات XSS و CSRF … الخ ، لذلك فإن خيار استخدام ال eval مع ال JSON String غير امن اطلاقا بالإضافه انه يؤثر على كفائه التطبيق لأن كل إستدعاء للوظيفه eval يؤدى إلى تشغيل مترجم الجافاسكربت من جديد .

لذلك دوجلاس كروكفورد مخترع ال JSON  قام بكتابه parser يقوم بإعراب نصوص ال JSON و ينتج عنها Object صالح للإستعمال او ينتج عنه error فى حاله وجد function ، يحتوى كوده على وظيفتين تحت الكائن JSON ، الوظيفه الاول parse تحول ال string إلى Object ، و الوظيفه الثانيه stringify تقوم بتحويل أى Object إلى نص JSON ، و اعتمدت على هذا ال parser غالبيه التطبيقات التى تتعامل مع صيغه البيانات JSON لأنه عالج مشكله الامان ، لكن مازل يفتقد الكفائه و السرعه و من هنا بدأت الحاجه إلى JSON api من المتصفحات نفسها .

تم معايره ال JSON api فى EcmaScript 3.1 على نفس الاسس التى كتب عليها ال parser الذى طوره دوجلاس كروكفورد مخترع ال JSON .

أول متصفح بدأ بتقديم native JSON api هو متصفح الفايرفوكس و لكنه قصر إستخدامه على مطورين ال extentions ، و بعد ذلك تم تقديم ال JSON api لمطورين الصفحات فى النسخه 3.5 الذى خرج من البيتا من بضعه ايام ، IE8 ايضا يدعم JSON api منذ ال beta 2 .

يحتوى الكائن JSON على وظيفتين الاولى parse تقوم بتحويل النص إلى كائن كما يوضح المثال البسيط التالى :

var JSONString = '{"name":"Mostafa Farghaly","age":21,"language":"JavaScript"}';
var JSONObject = JSON.parse( JSONString );
/* JSONObject
{
    name: "Mostafa Farghaly",
    age:21,
    language:"JavaScript"
}
*/
alert(JSONObject.name); //Mostafa Farghaly
alert(JSONObject.age); //22
alert(JSONObject.language); //JavaScript
 

الكود السابق قام بتحويل النص JSONString إلى كائن قابل للإستعمال JSONObject كما يوضح التعليق ، اما الوظيفه الثانيه Stringify فتقوم بتحويل الكائن إلى نص كما يوضح الكود البسيط التالى :

var JSONObject = {
    "languages":[
        "JavaScript",
        "C++",
        "Python",
        "ruby"
    ]
};

var JSONString = JSON.stringify( JSONObject );
/* JSONString
'{"languages":["JavaScript","c++","python","ruby"]}'
*/

الكود السابق قام بتحويل الكائن JSON إلى النص JSONString يمكن إرساله إلى السيرفر او تخزينه فى قاعده البيانات كما تريد .

بالنسبه للمتصفحات التى لم تدعم native JSON api مثل opera و safari و المتصفحات القديمه يمكنك استخدام ال parser الذى برمجه douglas crockfrod مخترع ال JSON ، ستجده هنا ، و هو يحتوى على نفس الوظيفتين الى شرحتهم بالأعلى .

للمزيد :
Native JSON in IE8 مقال شامل أفضل من الموجود بموزيلا و يستفيض فى شرح parse و stringify
Using JSON in FireFox

JSDoc

02/07/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

هذا الموضوع يعتمد فى بعض اجزائه على ماتم شرحه فى سلسله جافاسكربت الموجهه بالكائنات .

JSDoc هى وسيله لتوثيق أكود الجافاسكربت عن طريق تعليقات ذات معنى كما سنرى لاحقا ، يتم اعراب هذه التعليقات و ينتج عنها توثيق -documentation- فى صوره صفحات HTML ، يمكنك انتاج التوثيق عن طريق استخدام معرب تم برمجته بلغه Perl بإسم JSDoc كما توضح هذه المقاله ، او انتاج التوثيق عن طريق محرر Aptana بضغطه زر و هذا ما سيتناوله هذا الموضوع .

لنفرض ان هناك function constructor لصنف Car يقبل ثلاث عبارات المصنع و الموديل و سنه التصنيع ، هذه العبارات ستكون بمثابه خصائص له كما يوضح الكود البسيط التالى :

function Car(make, model, year){
    this.make = make;
    this.model = model;
    this.year = year;
}

سوف اضيف تعليقات JSDoc داخل block comment بواسطه /**/ لكن عليك ملاحظه ان السطر الاول من التعليق لابد ان يحتوى على اتنين ** كما يوضح الكود البسيط التالى :

/**
* create new Car instance
*@class Car
*@constructor
*@param {String} make the maker of the car ex: BMW
*@param {String} model the model of the car ex: 5-series
*@param {String} year the year of manufacture ex: dd/mm/yyyy
*@return {Object}
*/

function Car(make, model, year){
    this.make = make;
    this.model = model;
    this.year = year;
};

داخل تعليق ال JSDoc الكثير من ال tags ، السطر الاول من التعليق يفيد بأن الوظيفه Car تقوم بإنشاء سيارات جديده ، السطر الثانى يفيد بأن هذه الوظيفه تمثل الصنف Car ، السطر الثالث يفيد بإن هذه الوظيفه constructor للصنف Car ، السطر الرابع داخل التعلق يفيد بأن ال constructor يقبل عباره إسمها make من نوع String و هى مصنع السياره مثل BMW ، و السطر الخامس من التعليق يفيد بأن ال constructor يقبل عباره بإسم model من نوع String و هى موديل السياره مثل الفئه الثالثه :D ، و السطر الثالث من التعليق يفيد بأن ال constructor يقبل عباره بإسم year من نوع String و هو تاريخ تصنيع السياره بصيغه dd/mm/yyyy ، اما السطر الاخير من التعليق يفيد بأن ال constructor ينتج عنه كائن Object جديد بالطبع من نوع Car .

إذا قمت بكتابه هذه التعليقات قبل الوظيفه Car ، فإن مجرد إستخدام هذه الكود فى محرر Aptana سينتج عنه Code assist يساعدك فى كتابه الكود كما الصوره التاليه :) :

JSDoc in aptana code assist

هناك tags اخرى كثير لتغطيه كل الجوانب التى يمتد اليها الكود التى تكتبه مثل ال encapsulation و العلاقه بين الاصناف و الوراثه و غيره ستجد قائمه كامله هنا .

يمكننا الزياده على المثال السابق بتوثيق الخصائص و الوظائف التى يمتلكها الصنف Car كما يوضح الكود البسيط التالى :

Car.prototype = {
    /**
    * the maker of the car
    *@property make
    *@type {String}
    */
    make:null,
    /**
    * the model of the car
    *@property model
    *@type {String}
    */
    model:null,
    /**
    *the year of manufacture
    *@property year
    *@type {String}
    */
    year:null
    /**
    *start the car and return true, otherwise return false if it can't
    *may be the fuel is empty
    *@method start
    *@memberOf {Car}
    *@return {boolean}
    */
    start:function(){
        //start method code goes here
    }
}

التعليقات السابقه تثوم بتوثيق الخصائص make و model و year و توثق الوظيفه start ، و بالطبع ستظهر التغييرات فى ال code assist فى Aptana كما توضح الصوره التاليه :

JSDoc in aptana2

إذا قمت بالضغط على زر generate HTML docs الموجود فى شريط الادوات اعلى المحرر Aptana كما توضح الصوره التاليه :

jsDoc documentation creation button

سينتج عنه توثيق HTML فى نفس مسار التطبيق كما توضح الصوره التاليه ، لكنه ليس بجوده التوثيق الذى سينتجه المعرب المكتوب ب Perl الذى اشرت اليه فى اول الموضوع

generated JSDoc documentation from Aptana studio

جميع اطر العمل المشهوره مثل jQuery و Prototype و YUI و ExtJS … الخ موثقه عن طريق JSDoc و جاهز للإستخدام فى Aptana ، و ستجد ان ال code assist فى Aptana يحتوى على توثيق لكل هذه الاطر ، اعتقد انه حان الوقت ان تكتب توثيقك بنفسك لأنه سيساعدك و سيساعد غيرك عند إستخدام ما تكتبه من اكواد ، ووعد على :D ان اوثق اى كود اكتبه فى المدونه من الان ب JSDoc .

بالمناسبه أيضا هناك مشروع من Yahoo لتوثيق اكواد الجافاسكربت يعد بأنه أفضل من JSDoc بكثير و يقوم بتوليد التوثيق HTML من خلال Interpreter برمجه Python ، لم اطلع عليه حتى الان لكن يمكنك رؤيته من هنا .

المحاضره الرابعه من مؤتمر JSCONF2009

01/07/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

john resig the javascript conference

وضع منظموا مؤتمر JavaScript Conference 2009 المحاضره الرابعه بعد ثلاث محاضرات اشرت إليها فى هذا الموضوع ، المحاضره الرابعه على جزئين يمكنك تحميلها من هنا ، اعطى المحاضره John resig مطور jQuery و تناول فيها قياس و تحسين كفاءه تطبيقات جافاسكربت و ال benchmarking و ال testing و برمجه العاب الانترنت و ناقش مشروعه Testswarm الجديد الذى يعتبر بمثابه Bittorrent لكن لإستخدام المستخدمين لعمل testing لتطبيقات الجافاسكربت او اطر عملها ، هذه الصوره توضح اختبار اطار العمل prototype على متصفحات جميع المستخدمين المتصلين ب testSwarm ، شرائح المؤتمر كلها اشرت اليها فى موضوع سابق .

JavaScript threading

29/06/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

مقدمه
انشاء Worker جديد
انهاء عمل worker قديم
بعض القيود المفروضه على worker
الكائن navigator
إستيراد الملفات من داخل ال worker
التعامل مع أخطاء ال worker

مقدمه

تطبيقات الجافاسكربت ذات طبيعه single threaded اى ان التطبيق كله يعمل داخل thread واحد فقط فى ال CPU ، يتم تنفيذ اوامر التطبيق بنظام queue حيث يبدأ تنفيذ السطر الاول ثم الثانى حتى ينتهى التطبيق عند السطر الاخير ، و هذا يؤدى الى ان التطبيقات التى تستهلك كميه كبيره من الذاكره – نتيجه اجراء الكثير من العمليات و الحسابات المعقده -ينتهى بها المطاف إلى تجميد واجهه المستخدم UI freezing او انتهاء التطبيق .
خذ عندك مثلا هذه الوظيفه التى تقوم بحساب fibonacci number ، رقم فيبوناتشى هو مجموع رقمى فيبوناتشى للرقمين الذين يسبقوه مع العلم ان رقم فيبوناتشى ل 0 يساوى 0 ، و رقم فيبوناتشى ل 1 = 1 :

function fibonacci(n){
    if(n==0 || n==1){
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

إذا قمت بمحاوله إيجاد رقم فيبوناتشى للرقم 11 فإن الوظيفه fibonacci سوف تستدعى نفسها اكثر من 400 مره وسينتهى الامر إلى تجميد واجهه المستخدم حتى ينتهى من حساب الرقم ، او رساله تخبرك بأن تقوم بإلغاء تنفيذ هذا التطبيق إن قمت بحساب رقم فيبوناتشى لرقم كبير مثل 100 :D .

لكن الامر الان اصبح مختلف بعد تقديم Worker api فى Google geras الذى تم معايرته من قبل WHATWG و تم ادراجه فى متصفح FireFox 3.5 و Safari 4 و Chrome 2 و تطبيقات سطح المكتب التى يتم برمجتها ب AIR 2.0 او titanium و تطبيقات الموبايل التى يتم برمجتها ب titanium mobile و ايضا يمكنك استخدامه فى برمجه امتدادات الفايرفوكس و بإنتظار IE و Opear ، الان تطبيقات الجافاسكربت يمكننها انشاء threads لتقليل الحمل من على ال thread الرئيسى ، حيث يمكنك الان تشغيل ملفات جافاسكربت فى thread خلفى -background thread- لن يؤثر على ال thread الرئيسى ، و يمكن ايضا لل background thread انشاء threads اخرى لتعاونه فى انجاز عمله ، حيث يتم الاتصال بين ال threads المختلفه عن طريق الحدث onmessage و الوظيفه postMessage كما سنرى لاحقا ، يمكن لل threads المختلفه تبادل الرسائل فى صوره نصوص او اعداد او قيم منطقيه او JSON لكن لابد ان لا يحتوى على function او cyclical reference .

انشاء worker جديد

يمكنك انشاء thread خلفى بمنتهى البساطه عن طريق تمرير مسار ملف الجافاسكربت الذى سيعمل فى thread خلفى Worker constructor كما يوضح الكود البسيط التالى :

var myWorker = new Worker("fibbonaci.js");

عن طريق السطر السابق سيعمل ملف fibonacci.js داخل thread منفصل لحساب رقم فيبوناتشى بدون تجميد واجهه المستخدم او التأثير على كفائه ال thread الرئيسى ، و من خلال تسجيل مستمع لحدث onmessage ل myWorker يمكننا تلقى رسائل من ال thread الخاص ب fibonacci.js كما يوضح الكود البسيط التالى :

var myWorker = new Worker("fibbonaci.js");
myWorker.onmessage = function(event){
    alert(event.data);
};

داخل داله مستمع الحدث onmessage الخاصيه data للكائن event تشير إلى البيانات التى يرسلها ال thread الخلفى ، يمكننا ارسال رساله إلى ال thread الخاص ب fibonacci.js عن طريق الوظيفه postMessage كما يوضح الكود البسيط التالى :

var myWorker = new Worker("fibbonaci.js");
myWorker.onmessage = function(event){
    alert(event.data);
};
myWorker.postMessage(11);

السطر الاول فى الكود السابق يقوم بإنشاء thread جديد للملف fibonacci.js ، و السطر الثانى يسجل مستمع لحدث message لتلقى اى رساله يرسلها ال thread الخاص ب fibonacci.js ، اما السطر الرابع و الاخير يقوم بإرسال القيمه 11 إلى ال thread الخاص ب fibonacci.js حتى يقوم بالعمل عليها ، اى حساب رقم فيبوناتشى للرقم 11 فى ال thread منفصل .

الكود داخل fibonacci.js يقوم بالإستماع للحدث message و عندما يتلقى رساله برقم ما ، يقوم بحساب رقم الفيبوناتشى له و ارساله عن طريق الوظيفه postMessage إلى ال thread الرئيسى كما يوضح الكود البسيط التالى :

/* inside fibonacci.js file */
onmessage = function(event){
    var num = parseInt(event.data); // get the message as integer
    var fibNum = fibonacci(num); // get the fibonacci number
    postMessage(fibNum); // post the result to the main thread
}
function fibonacci(n){
    if(n==0 || n==1){
        return n;
    } else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}
/* end of fibonacci.js file */

عندما يستقبل رساله يستخرج منها الرقم من خلال event.data ثم يحصل على رقم فيبوناتشى عن تمرير الرقم إلى وظيفه fibonacci و فى النهايه يقوم بإرسال النتيجه إلى ال thread الرئيسى عن طريق postMessage .

القاعده العامه هى ان ال thread يقوم بإرساله رسائل إلى thread اخر عن طريق الوظيفه postMessage و يقوم بإستقبال رسائل ال threads الاخرى من خلال مستمع الحدث onmessage .

إنهاء عمل worker قديم

اذا كنت تريد ايقاف عمل worker تم انشاءه من قبل ، قم بإستدعاء الوظيفه terminate الخاصه بهذا ال worker ، حيث سيتم قتل ال thread الخاص به بدون اكمال عمله مباشره كما يوضح الكود البسيط التالى:

myWorker.terminate(); // close and kill myWorker thread

بعض القيود المفروضه على worker

الكود الذى يعمل فى thread جديد عن طريق worker لايمكنه الوصول إلى ال DOM ، اذا كان هناك تطبيق يقوم بتعديل ال DOM فإن هذه العمليه لابد ان يتولاها ال thread الرئيسى ، ال thread الفرعى عليه العمليات المعقده فقط ، يمكن لل thread الفرعى استخدام ال XMLHttpRequest لإجراء اتصالات اجاكس لكنه لا يستطيع الوصول إلى XMLResponse او channel ، لا يمكن لل thread الفرعى ارسال function او cyclic reference إلى ال thread الرئيسى ، يتم تحويل البيانات تلقائيا إلى صيغه JSON بعد تنقيحها ، و يمكنك ايضا استخدام setTimeout و clearTimeout و setInterval و clearInterval .

الكائن navigator

يمكنك الوصول إلى الكائن navigator من داخل ال thread الفرعى للحصول على معلومات عن المتصفح ، يحتوى الكائن navigator على اربع خواص :

navigator.appName
navigator.appVersion
navigator.platform
navigator.userAgent

إستيراد الملفات من داخل ال worker

يمكنك اسيراد ملفات الجافاسكربت من داخل ال worker عن طريق استخدام وظيفه imortScripts التى تقبل مسار الملفات التى تريد استيرادها ، يتم تحميل الملفات بأى ترتيب لكن يتم تنفيذها بالترتيب الذى تريد عند تمريرها للوظيفه كما يوضح الكود البسيط التالى :

importScripts(); // imports nothing
importScripts("foo.js"); // imports one file
importScripts("foo.js", "bar.js"); // imports two files

التعامل مع أخطاء ال worker

عندما يحدث خطأ فى ال worker سيتم استدعاء مستمع الحدث الخاص ب onerror المرتبط به و سيتم تمرير لمستمع الحدث الكائن event الذى يحتوى على 3 خصائص تحتوى على معلومات عن الخطأ و هى message و filename و lineno ، يمكن منع الخطأ من خلال الوظيفه preventDefault كما يوضح الكود التالى :

var myWorker = new Worker("worker.js");
myWorker.onerror = function(event){
    event.message; // human readable error message
    event.lineno; // error line number
    event.filename; // file name at which error occurs
    event.preventDefault(); // prevent error propagation
}

للمزيد

هذا ليس كل شىء هناك الكثير من الكائنات لم يغطيها هذا المقال ، مواصفات worker api لن تكتمل و يمكن تغيرها او زياده ميزات اخرى فى المتصفحات ، هناك ايضا بعض الكائنات لم يتم ادراجها مثل SharedWorker و DedicatedWorker و غيره ، يمكنك قراءه مواصفات ال web workers كامله من هنا ، بالإضافه إلى مقاله usinng web workers من موزيلا ، و هذه التدوينه من مدونه mozilla developers center .

محاضره upcoming changes to JavaScript

22/06/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

ecmascript 5 changes upcoming to javascript

اعطى 3 من مهندسى جوجل محاضره بعنوان EcmaScript5 , Upcoming changes to JavaScript ، تناولت المحاضره التغيرات التى ستطرأ على اللغه فى خلال سنه ان شاء الله بعدما اتفق مصنعوا المتصفحات ادراج مواصفات EmaScript5 الجديده ، يمكنك تحميل المحاضره من هنا ، و يمكنك تحميل الشرائح من هنا .

ما هى قصه EcmaScript 5 ؟

بعدما تيقن مصنعوا انه يستحيل ادراج مواصفات EcmaScript 4 فى جافاسكربت حاليا ، لأنها تقلب اللغه رأسا على عقب مقارنه بالوضع الحالى كما انها ضخمه جداااا و ليست backward compatible ، قاموا بإنشاء مجموعه جديده لتحديد مواصفات EcmaScript 3.1 تحتاجها فعلا اللغه بوضعها الحالى بحيث تكون backward compatible و يسهل ادراجها فى وقت قصير بعدما انتهوا من المواصفات و بعد وقت كبير من المناقشات انتهوا إلى مواصفات اطلقوا عليها EcmaScript 5 ، اتفق صناع المتصفحات على ادراجها و هى حاليا فى مرحله التنقيح ، كتب john resig مطور مكتبه jQuery تدوينتين يناقش بهم بعض مزايا EcmaScript 5 الجديده هنا و هنا . او يمكنك قراءه المواصفات كامله من هنا .

خارج النص : يمكنك الان متابعه ما اقوم به يوميا من خلال حسابى على twitter .

3 محاضرات من مؤتمر JSCONF2009

20/06/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

بدأ منظموا مؤتمر JavaScript conference 2009 بوضع محاضرات المؤتمر بمعدل محاضره واحد اسبوعيا ، المحاضره الاولى اعطاها Francisco Tolmasky يناقش فيه Objective-J و Cappuchino 0.7 و nib2cib ، اما المحاضره التانيه اعطاها Peter Heigens من فريق اطار عمل DoJo بعنوان Patterns for lovers of JavaScript ، اما المحاضره الثالثه أعطاها Brian leRoux يناقش فيها كيفيه استخدم جافاسكربت لبرمجه تطبيقات موبايل ل iphone و blackberry و google android و غيره ، اتمنى لكم و لنفسى مشاهده ممتعه :D فى انتظار باقى المحاضرات ، الشرائح متوفره من الموضوع السابق .

محاضره speed up your JavaScript

20/06/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

أعطى Nicholas c.zakas مؤلف كتاب Pro JavaScript for web developers محاضره بعنوان Speed up your JavaScript بجوجل ، ناقش فيها العديد من التكنيكات لزياده كفاءه تطبيقات الجافاسكربت من واقع عمله ك front end engineer بشركه ياهو ، يمكنكم مشاهده و تحميل المحاضره من هنا ، و يمكنكم تحميل الشرائح من هنا ، اتمنى لكم و لنفسى مشاهده ممتعه :D .

محاضره YUI3 design goals and architecture

13/05/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

YUI3 design architecture and goals

أعطى Satyen Desai الذى يعمل software engineer  بفريق YUI بياهو محاضره بعنوان YUI3 design goals and architecture يناقش فيها اهداف تصميم النسخه 3 من YUI و القرارات التى اتخذوها فى كتابه المكتبه و بعض الميزات الجديده للمكتبه -المحاضره تم رفعها اليوم-، يمكنك تحميل المحاضره فيديو من هنا ، و يمكنك تحميل الشرائح من هنا ، اتمنى لكم و لنفسى مشاهدهد ممتعه :) .

شرائح مؤتمر JSCONF 2009

13/05/2009 by mostafa farghaly

السلام عليكم و رحمه الله تعالى و بركاته

اقيم مؤتمر JavaScript Conference 2009 الشهر الماضى فى 24و25 ابريل فى واشنطن و طبعا اتكلم فيه زينه مبرمجين الجافاسكربت، و حتى الان لم يضع موقع المؤتمر أى شرائح او فيديو او حتى بودكاست صوتى ، لكن الشرائح موجوده على SlideShare نتيجه البحث عن كلمه jsconf يمكنك الاطلاع عليها من هنا -التحميل يطلب منك التسجيل- ، فى انتظار الفيديو او البودكاست الصوتى .
خارج النص : انا مش بكتب كتير اليومين دول عشان فتره الامتحانات ، و مش عايز انقطع عن التدوين ، كل كم يوم هكتب موضوع ان شاء الله ، ادعولى بالتوفيق يا ناس .