دراسة حالة: تحديث تلقائي لبرنامج عن طريق النت

السلام عليكم ورحمه الله

في اﻹسبوع الماضي جائتني فكرة فقمت بتنفيذها في نفس اليوم، وهي إمكانية تحديث برنامج تجاري أعمل عليه عن طريق النت بدلاً من الذهاب إلى الزبون وتعديله يدوياً.

وكانت المشكلة اﻷكبر هي عندما أقوم بإصدار نسخة جديدة من البرنامج ثم أقوم بالذهاب للزبائن، فأكتشف أن هناك مشكلة حدثت بسبب التعديلات، أو أن هناك مشكلة قديمة لم يبلغوا عنها، فأضطر إلى فتح اللابتوب وتعديل المشكلة في مقر الزبون أو أحياناً أرجع إلى البيت بسرعة لأقوم بعلاج المشكلة ثم الذهاب باكراً في اليوم الثاني لإعطائهم النسخة الجديدة. وفي كلا الحالتين فإن هذه الطريقة مزعجة، ولا تناسب زيادة الزبائن. فكان الحل أن يكون التحديث عن طريق النت.

بعد بداية إكتمال الفكرة شرعت في التنفيذ، وقد بدأت باﻷشياء اﻷصعب، وهي تحميل نسخة من النت، فقمت أولاً بقراءة فصل برمجة الشبكات في كتاب Lazarus the complete reference وهو يستخدم Synapse وهي مكتبة لم استخدمها مع بروتوكول http، في السابق كُنت استخدم LNet، لكن هذه المرة قررت استخدام هذه المكتبة الجديدة.

نجحت أول محاولات لتحميل ملف من اﻹنترنت، وكانت المشكلة الثانية هي فك ملف مضغوط. في البداية قررت استخدام أدوات نظام التشغيل في فك الضغط مثل unzip في لينكس، ونجح اﻷمر في بيئة لينكس، إلا أني لم أجد مثل هذا اﻷمر في بيئة وندوز، إلا بتنزيل بعض البرنامج من النت مثل 7zip، لكن هذه طريقة غير صحيحة في أن أزيد إعتماد البرنامج على برامج أخرى لا توجد بصورة قياسية في بيئة وندوز. واكتشفت أن هذا الحل (إعتماد على أشياء معتمدة على نظام التشغيل) هو حل غير عملي. فوجدت مكتبة لفك الملفات المضغوطة، وهي لاتعتمد على نظام التشغيل، ويكون الحل في هذه الحالة من داخل البرنامج.

الفكرة تكمن في القيام بوضع ملف في اﻹنترنت به رقم نسخة البرنامج الموضوعة في النت، وعند تشغيل البرنامج يكون للمستخدم خيار أن يبحث عن نسخة جديدة من البرنامج:

فيقوم اﻹجراء بقراءة ملف نصي به فقط رقم النسخة، ويقوم بمقارنتها بنسخة البرنامج الحالية، فإذا وجد أن النسخة الموجودة في النت أحدث يُظهر زر لتحميل النسخة الجديدة. وبعد التحميل، يقوم البرنامج بتشغيل برنامج آخر ثم يقوم بإغلاق نفسه للسماحية بإحلال النسخة الجديدة مكان القديمة، ثم يقوم البرنامج الثاني بفك الملف المضغوط ثم تشغيل النسخة الجديدة.

بعدها ذهبت للزبون لتثبيت هذه النسخة التي تحتوي على تحديث عن طريق النت، وأخبرتهم أن يقوموا بتحديث البرنامج بصورة دورية، كل إسبوع مثلاً، وإذا كانت هُناك مشكلة فيمكنهم إبلاغي لعلاجها مباشرة ثم وضع نسخة جديدة في اﻹنترنت.

هذه الطريقة مع بساطتها إلا أن لها أثر كبير في إدارة النسخ الجديدة والتحديث وعلاج المشاكل في البرنامج بدون اﻹنزعاج بالتوزيع أو تذمر الزبائن بسبب عدم الحل السريع لبعض المشاكل في السابق.

بعد تجربة هذه الطريقة وتجربة مكتبة Synapse قمت بإضافة أمثلة لها في كتاب الخطوة الثانية مع أوبجكت باسكال في فصل برمجة الشبكات بإعتبارها طريقة أسهل خصوصاً في التعامل مع صفحات الويب وبروتوكول HTTP.

وهذا جزء من كود البحث عن نسخة جديدة:

procedure TfmUpdate.bbSearchClick(Sender: TObject);
var
  Version: string;
  ResMsg: string;
  ThereIsaNewVersion: Boolean;
begin
  if GetNewVersion(fNewFileName, Version, ResMsg, ThereisaNewVersion) then
  begin
    if ThereisaNewVersion then
    begin
      stNewVersion.Caption:= Version;
      stNewVersion.Font.Color:= clGreen;
      stNewVersion.Font.Style:= [fsBold];
      bbDownload.Visible:= True;
    end
    else
    begin
      stNewVersion.Caption:= 'لاتوجد نسخة جديدة';
      stNewVersion.Font.Color:= clBlue;
      bbDownload.Visible:= False;
    end;
  end
  else
  if pos('not found', LowerCase(ResMsg)) > 0 then
  begin
    stNewVersion.Caption:= 'تعذر البحث عن نسخة جديدة' ;
    stNewVersion.Font.Color:= clMaroon;
    bbDownload.Visible:= False;
  end
  else
    ShowMessage('حدثت مشكلة في اﻹتصال باﻹنترنت' + #10 + ResMsg);

end;

قام اﻷخ زاهر بتجربة التحديث ونصحني بإستخدام الـ Threads وذلك لأنم مكتبة Synapse تقوم بتجميد البرنامج عند تحميل ملف من النت مثلاً، وهي طريقة تُسمى blocking ، والـ Thread يجعل البرنامج غير مجمد أثناء هذه العملية.
قمت اليوم بتجربتها ثم تطبيقها بنجاح في البرنامج.

وهذا كود تحميل الملف من اﻹنترنت:

procedure THTTPDownload.Execute;
var
  http: THTTPSend;
  List: TStringList;
begin
  try
    http:= THTTPSend.Create;

    with fmUpdate do
    if cxProxy.Checked then
    begin
      http.ProxyHost:= edProxy.Text;
      http.ProxyPort:= edPort.Text;
      http.ProxyUser:= edUser.Text;
      http.ProxyPass:= edPassword.Text;
    end;

    fSuccess:= http.HTTPMethod('GET', fURL);
    if fSuccess then
    if http.Document.Size > 10000 then  // Actual file has been downloaded
      http.Document.SaveToFile(ExtractFilePath(ParamStr(0)) + fFileName + '.zip')
    else
    begin // Error HTML response
      List:= TStringList.Create;
      List.LoadFromStream(http.Document);
      fSuccess:= False;
      fErrorMessage:= List.Text;
      List.Free;
    end;

    http.Free

  except
  on e: exception do
  begin
    fSuccess:= False;
    fErrorMessage:= e.Message;
  end;
  end;

end;
Advertisements

6 أفكار على ”دراسة حالة: تحديث تلقائي لبرنامج عن طريق النت

  1. السلام عليكم و رحمة الله و بركاته استاذنا الموقر
    شكرا فعلا معلومات قيمة و اسلوب مميز
    لذي بعض الاسئلة ان سمحت
    1- التحديث الذي تقصده هنا هو تحميل نسخة جديدة او اضافة ترقيعات فقط ( معالجة خطأ ما أو اضافة خاصية )
    2- كيف يمكنني الحصول على الكتاب الذي ذكرته Lazarus the complete reference
    3- و لدي سؤال خارج عن الموضوع يشغل بالي في هذه الاونة الا وهو ما الذي يجعل مترجم فري باسكال اسرع مقارنة بلغات برمجة اخرى
    و كل الشكر موصول اليك
    تحياتي الخالصة أخي

  2. أنا لا احتاج إلى الترقية عبر الانترنت
    1 – اغلب زبائني ليس لديهم انترنيت
    2 – من لديه يستطيع تنزيل نسخة و عمل setup بسهولة
    3 – على الشبكات لا يفضل اتاحة ذلك إلى المستخدمين العاديين بعمل ذلك (في حال تمكنه من الوصول للانترنت)، ربما احدهم قام بالتحديث و الآخر لا، فيحصل تعارض.

  3. التحديث الذي أقصده هنا هو تحديث كامل للنسخة، وهي عبارة عن ملف تنفيذي واحد، أيضاً يمكن بنفس اﻹسلوب تحميل ملفات أخرى بدون أي تعديل في الكود، مثلاً كُتيب دليل المستخدم تكون نسخة معدلة مصاحبة للملف التنفيذي.
    الكتاب قُمت بطلبه عن طريق اﻹنترنت، وتم إرساله بالبريد:
    http://www.blaisepascal.eu/index.php?actie=./subscribers/lazarusbookinfoEnglish

    مترجم فري باسكال أسرع من مترجم السي بسبب أنه يقوم فقط بإعادة ترجمة وربط الملفات التي تم تغييرها، وليس كمترجم لغة سي وسي++ الذي في كل مرة يقوم بترمجة كافة ملفات المشروع حتى لو لم تُعدل.

  4. في حالة إحتمال أن يكون هُناك تعارض أقوم بالذهاب بنفسي لعمل التعديل (وغالباً يكون مصاحب له تعديل في قاعدة البيانات)
    أما غالب التعديلات فهي لا تؤثر أن يكون هناك نسخة قديمة أو جديدة من البرنامج، مثل تغيير في تقرير، أو فورم كان ينتج عنه Access Violation، أو حتى إضافة شاشات جديدة معتمدة على نفس هيكل البيانات الموجود.

    بعد سنة إن شاء الله يمكن أن نحكم على هذه الميزة بنجاحها أو فشلها، وهي اﻵن قيد التجربة، وتزامنت هذه الميزة مع زيادة سعر المحروقات في البلاد، لذلك فهي ميزة – إذا نجحت – سوف تقلل بالنسبة لي أثر هذه الزيادة إن شاء الله.

  5. فكرةٌ جميلةٌ و عمليةٌ للغاية.
    أري أن البرنامج عبارةٌ عن ملفٍ تنفيذيٍ واحدٍ فقط لذا فأنت تحتاج إلي رقم إصدارةٍ واحد. أظن أنه لو كان البرنامج له ملفاتٍ متعددةٍ و كبيرة الحجم فربما تكون الحاجة إلي ملف XML يحوي بيانات الأجزاء و الملفات المختلفة حتي يتم تحميل الجزء الذي تغير فقط.

  6. اليوم قُمت بإضافة كُتيب المستخدم في شكل PDF، فبذلك أصبحت التعديلات عبارة عن ملفين، لكن بما أن التحديث هو عبارة عن ملف مضغوط، فلايهم عدد الملفات، ولا تحتاج تغيير. لكن المشكلة أن زيادة الملفات ينتجح عنها بطيء في عملية التحديث.

اترك رد

إملأ الحقول أدناه بالمعلومات المناسبة أو إضغط على إحدى الأيقونات لتسجيل الدخول:

WordPress.com Logo

أنت تعلق بإستخدام حساب WordPress.com. تسجيل خروج   / تغيير )

صورة تويتر

أنت تعلق بإستخدام حساب Twitter. تسجيل خروج   / تغيير )

Facebook photo

أنت تعلق بإستخدام حساب Facebook. تسجيل خروج   / تغيير )

Google+ photo

أنت تعلق بإستخدام حساب Google+. تسجيل خروج   / تغيير )

Connecting to %s