أهم أقسام المدونة

الصفحات

الجمعة، 29 نوفمبر 2013

كتاب خرافة داروين


كتاب:
خرافة داروين: حينما تتحول الصدفة إلى علم!!
نسف نظرية داروين باستخدام الرياضيات والبرمجة 




بقلم:
م. محمد حمدي غانم 

للتحميل:
أو
 


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

كما أن الكتاب يوضّح التناظر بين بنية الحاسوب وأنظمة تشغيله من جهة، وبين المخلوقات الحية وشفرة DNA التي تبني أجسادها وتتحكم في وظائفها من جهة أخرى.

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

 

المحتويات

 

·    تمهيد: الداروينية: من سببية العلم، إلى عشوائية الصدفة

- الداروينية القديمة، والتطور بالانتخاب الطبيعي

- الداروينية الجديدة، والتطور بالطفرات

 

·      أبدع حاسب وأبدع نظام تشغيل

1. الإنسان يطوّر، لكن لا يخلق

2. لغة الكيمياء

3. تطبيقات برمجية ونظام تشغيل

4. الدقّة حيث لا مجال للعبث

5. مصانع عالية التقنية

6. فبأيّ حديث بعده يؤمنون؟

7. وللرياضيات كلمة

8. برنامج لمحاكاة إلقاء العملة المعدنية

9. إنهم يعبدون الصدفة!

10. رواية الحصن الرقمى: دان براون يخدعك!

11. برنامج لرسم الموناليزا بالصدفة!

12. برنامج لتوليد الكلمات والنصوص عشوائيا

13. التدخل البشري في إنتاج أول صبغ وراثي صناعي

14. إنتاج البشر

15. البعث والحساب علميا

16. لكن لماذا يكفرون؟

17. البحث عن الضلال

18. نحن نأكل البشر

19. من نحن؟

20. البرامج الحية

 

·      الحلقات المفقودة في الداروينية الفقيدة!.. هيا نفند نظرية داروين في خمسة أسئلة!

1- كيف ظهرت الحلقات الوسيطة بالصدفة؟

2- لماذا ما تزال الحلقات المفقودة مفقودة حتى الآن؟

3- لماذا انقرضت الحلقات الوسيطة أصلا؟

4- لماذا لا تتطور حلقات وسيطة جديدة في عالمنا اليوم؟

5- أين هي حفريات المحاولات التطورية الفاشلة؟

- الخاتمة: الداروينية علم أم دين؟!

 

·    ناندينو كمبورس

 

·    التصميم الذكي Intelligent Design

 

·    مطرودون: لا يُسمح بالذكاء! Expelled: No intelligence allowed

- المقطع الأول من الفيلم الوثائقي Expelled

- المقطع الثاني من الفيلم الوثائقي Expelled

- المقطع الثالث من الفيلم الوثائقي Expelled

- المقطع الرابع من الفيلم الوثائقي Expelled

- المقطع الخامس من الفيلم الوثائقي Expelled

- المقطع السادس من الفيلم الوثائقي Expelled

- المقطع السابع من الفيلم الوثائقي Expelled

- المقطع الثامن من الفيلم الوثائقي Expelled

- المقطع التاسع من الفيلم الوثائقي Expelled

- المقطع العاشر من الفيلم الوثائقي Expelled

 

 

 

 

 

الأربعاء، 27 نوفمبر 2013

استخدام فئة التفقيط


استخدام فئة التفقيط 


 

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


نريد الآن معرفة كيفية التعامل مع الفئة NumericToLiteral.

هذه الفئة تمتلك وسيلة واحدة مشتركة Shared يمكن استدعاؤها من اسم الفئة مباشرة، وهي الوسيلة Convert.. والمثال التالي يريك كيف تحول الرقم 225 إلى تمثيله النصي:

Dim LiteralNo = NumericToLiteral.Convert(225)

MsgBox(LiteralNo)

عند تنفيذ هذا الكود، ستعرض الرسالة النص:

(مئتان وخمسة وعشرون)

ملاحظات:

1- أقصى عدد تتعامل معه هذه الفئة هو 9,223,372,036,854,775,807.. والتمثيل النصي له هو:

(تسعة كوينتيليونات، ومئتان وثلاثة وعشرون كدريليونا، وثلاثمئة واثنان وسبعون تريليونا، وستة وثلاثون مليارا، وثمانمئة وأربعة وخمسون مليونا، وسبعمئة وخمسة وسبعون ألفا، وثمانمئة وسبعة)

حيث إن:

الاثنين، 25 نوفمبر 2013

تحويل الأعداد إلى الصيغة الحرفية (التفقيط)


س: هل يمكن برمجيا، تحويل العدد من الصيغة الرقمية (مثل 225) إلى الصيغة الحرفية (مثل مئتان واثنان وعشرون) لاستخدامها في التفقيط؟ 

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

إليكم كود الفئة، وسأشرح لكم كيفية استخدامها في موضوع لاحق بإذن الله:

السبت، 23 نوفمبر 2013

حكاية البحر 1


(اضغط الصورة لتكبيرها)
لقراءة القصيدة كاملة:
للاستماع لإلقائي للقصيدة:

 

 

الخميس، 21 نوفمبر 2013

الإشارة إلى عمود في DataGridView


عند التعامل مع خانة في جدول العرض DatagridView أنصحك ألا تستخدم رقم العمود للإشارة إلى الخانة مثل:

DatagridView1.Rows(0).Cells(1).Value = "Ahmed"

لأنك قد تغير موضع العمود بعد ذلك أو تضيف أعمدة أخرى قبله تؤدي على تغيير ترقيمه، مما يضع عليك عبء إعادة تغير كل الأكواد التي تحتوي على أرقام الأعمدة.

أنصحك أيضا ألا تستخدم اسم العمود للإشارة إلى الخانة مثل:

DatagridView1.Rows(0).Cells("StudentName").Value = "Ahmed"

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

إذن فما أنسب حل؟

أسهل حل لهذا الأمر، هو منح الأعمدة عند تعريفها في جدول العرض أسماء برمجية واضحة (مثل ColStudentName)، واستخدام الخاصية Index الخاصة بكائن العمود للحصول على رقمه للإشارة إلى الخانة من خلاله مثل:

DatagridView1.Rows(0).Cells(ColStudentName.Index).Value = "Ahmed"

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

الأربعاء، 20 نوفمبر 2013

حين التقينا 1


(اضغط الصورة لتكبيرها)

لقراءة القصيدة كاملة:
لتحميل ديوان "دلال الورد":

الاثنين، 18 نوفمبر 2013

القاسية1


(اضغط الصورة لتكبيرها)

لقراءة القصيدة كاملة:
للاستماع لإلقائي للقصيدة:
لتحميل ديوان "دلال الورد":
 

 

 

التضارب في ربط البيانات


س: أستخدم ربط البيانات DataBindings لربط التاريخ الذي تعرضه الأداة DateTimePicker بمصدر ربط BindingSource.. لكن مشكلة غريبة تحدث عند تغيير التاريخ في الأداة DateTimePicker والانتقال إلى أداة أخرى على النافذة وتغيير قيمتها ثم ضغط الزر Tab لمغادرتها، ففي هذه اللحظة يعود التاريخ الذي تعرضه الأداة DateTimePicker إلى قيمته الأصلية قبل التغيير!.. فكيف يمكن حل هذه المشكلة؟

 

ج: من الواضح أن كائن ربط البيانات Binding Object لم ينقل التاريخ الجديد الذي تم اختياره في الأداة DateTimePicker إلى كائن مصدر الربط BindingSource عند مغادرة الأداة، وأن تغيير قيمة الأداة الأخرى ثم مغادرتها أدى إلى تحديث بيانات مصدر الربط، فقام بدوره بتحديث التاريخ في الأداة DateTimePicker فعاد إلى قيمته الأولى!

من ملاحظاتي، فإن هذا الخطأ يحدث في الأدوات المرتبطة بمصدر ربط، عندما تكتب كودا في حدث تغير قيمة الأداة (مثل الحدث DateTimePicker.ValueChanged) تقوم فيه بتحديث قيم أدوات أخرى مرتبطة بنفس مصدر الربط.. هنا يحدث التضارب، لأن أداة اختيار التاريخ لم تنقل قيمتها الجديدة لمصدر الربط، بينما قامت بتغيير قيم أدوات أخرى حدّثت بيانات مصدر الربط الذي ما زال لا يرى إلا القيمة القديمة للتاريخ!.. لهذا يمكن أن يتكرر مثل هذا الخطأ في أدوات أخرى مثل NumericUpDown وغيرها.

ولحل هذه المشكلة، يجب ألا تكتب أي كود في حدث تغير قيمة الأداة ValueChanged.. أحيانا لا يكون الحل ممكنا، لهذا يمكنك استخدام حل أفضل، وهو إجبار كائن الربط على إرسال التاريخ الجديد إلى مصدر الربط بعد تغييره مباشرة.. أسهل طريقة لفعل هذا هي جعل القيمة تنتقل بمجرد تغير الخاصية DateTimePicker.Value بدلا من نقل القيمة بعد إجازة البيانات Validation (وهو التصرف الافتراضي لكائن الربط).. إذا كنت تستخدم الكود في عملية الربط، فعدله ليكون كالتالي:

DateTimePicker1.DataBindings.Add(New Binding(

         "Value", BindingSource1, "Date", True,

          DataSourceUpdateMode.OnPropertyChanged))

أما إذا كنت تستخدم نافذة الخصائص، فحدد الأداة DateTimePicker1 على النافذة، واضغط F4 لعرض نافذة الخصائص، وفيها أسدل الخصائص الفرعية للعنصر (DataBindings) واضغط الزر الموجود في خانة العنصر (Advanced)، وفي النافذة التي ستظهر اختر الخاصية Value من قائمة الخصائص، ومن القائمة المنسدلة المعنونة بـ Data Source Update Mode اختر القيمة OnPropertyChanged، واضغط OK.

بهذه الطريقة سينتقل التاريخ من الأداة DateTimePicker إلى مصدر الربط بمجرد حدوث التغيير، ودون انتظار مغادرة الأداة، مما سيمنع أية أخطاء غير متوقعة كالخطأ المذكور.

 

ملحوظة:

نقل التاريخ إلى مصدر الربط فور اختيار المستخدم له، يعتبر تصرفا جيدا عليك باتباعه دائما، فأنت لا تحتاج إلى إجازة البيانات Validation هنا فلا يمكن للمستخدم أن يكتب قيمة خاطئة في الأداة DateTimePicker، خاصة إذا ضبطت قيمتي الخاصيتين MinDate و MaxDate لمنعه من اختيار أي تاريخ خارج نطاق التواريخ المناسب لوظيفة برنامجك.

 

 

 

الأحد، 17 نوفمبر 2013

عنوان النافذة


س: صواب أم خطأ (للصف الثالث الإعدادي):

في النموذج Form عند تغير النص في الخاصية Text يظهر في شريط المهام.

 

ج: صواب.. الخاصية Text الخاصة بالنموذج تتحكم في العنوان الذي يظهر على شريط النافذة.. وعنوان النافذة هو أيضا النص الذي يظهر على شريط المهام Taskbar لهذه النافذة.

مربع النص متعدد الأسطر


س: صواب أم خطأ (للصف الثالث الإعدادي):

في الأداة Textbox، عند تغير الخاصية MultiLine إلى القيمة True يجعل حجم الأداة يتغير تلقائيا.

 

ج: خطأ.. عند جعل مربع النص متعدد الأسطر، يصير بإمكان المبرمج تغيير ارتفاعه كما يشاء.. أما عندما يكون مفرد السطر (MultiLine = False) فإنه يأخذ ارتفاعا تلقائيا يناسب ارتفاع السطر المكتوب فيه (كما يحدده حجم الخط).. لهذا لو حاول المبرمج تغيير ارتفاعه فإنه لا يستطيع.

السبت، 16 نوفمبر 2013

محو القيمة من الأداة NumericUpDown


س: في الأداة NumericUpDown، إذا مسح المستخدم الرقم المكتوب بضغط الزر Delete، تعرض الأداة نصا فارغا، ولا يظهر فيها أي رقم، بينما تظل الخاصية Value محتفظة بنفس قيمتها القديمة، ولا تعيد صفرا.. فكيف يمكن حل هذه المشكلة؟

 

ج: يمكن حل هذه المشكلة باستخدام الحدث TextChanged.. هذا الحدث موجود ضمن أحداث الأداة رقم أنه لا يظهر مع باقي الأحداث في قائمة الإكمال التلقائي أو قائمة الأحداث في محرر الكود.. نفس الأمر يحدث أيضا مع الخاصية Text، فرغم أن الأداة تمتلكها، فهي تخفيها لتدفعك إلى استخدام الخاصية Value.. كل ما سنفعله هو:

- استخدام الحدث TextChanged لفحص قيمة الخاصية Text، فإن كانت فارغة، فسنضع في الخاصية Value أصغر قيمة تسمح الأداة بعرضها (لا تضع صفرا مباشرة، فقد يكون أصغر من القيمة الصغرى ويحدث خطأ).

- من المهم أيضا أن نضع نفس القيمة في الخاصية Text، فلو كانت الأداة تعرض أصغر قيمة قبل أن يحذفها المستخدم، وحاولت وضعها مرة أخرى في الخاصية Value (التي ما زالت تحتفظ بنفس القيمة فعلا) فلن تفعل الأداة شيئا باعتبار أن الخاصية لم تتغير، ولن يظهر الرقم مرة أخرى في مربع النص الخاص بالأداة، لهذا علينا وضعه بأنفسنا.

- أخيرا، سنحدد النص المكتوب في الأداة.. ونظرا لأن الأداة لا تمتلك الوسيلة SelectAll، ولا تمتلك الخاصيتين SelectionStart و SelectionLength، فسنستخدم الصيغة الثالثة من الوسيلة Select التي تستقبل موضع بداية النص المراد تحديده، وطول التحديد.

هذا هو الكود:

Private Sub NumericUpDown1_TextChanged(sender As Object, e As EventArgs) Handles NumericUpDown1.TextChanged

    If NumericUpDown1.Text = "" Then

        NumericUpDown1.Value = NumericUpDown1.Minimum

        NumericUpDown1.Text = NumericUpDown1.Minimum

        NumericUpDown1.Select(0, NumericUpDown1.Text.Length)

    End If

End Sub

الجمعة، 15 نوفمبر 2013

دلال الورد1



(اضغط الصورة لتكبيرها)

لقراءة القصيدة كاملة:


للاستماع لإلقائي للقصيدة:


 لتحميل ديوان "دلال الورد":


 

الخميس، 14 نوفمبر 2013

استخدام فئة طباعة التقرير (نسخة سي شارب)


استخدام فئة طباعة التقرير (نسخة سي شارب)

 

في الموضوع السابق وضعت لكم نسخة سي شارب من الفئة ReportPrinter، التي تستخدم لطباعة التقرير مباشرة بدون عرضه أولا في الأداة ReportViewer.

نريد الآن أن نرى كيف يمكننا استخدام هذه الفئة.

كما سبق أن ذكرت، فإن استخدام هذه الفئة سهل للغاية، حيث يمكن أن نطبع التقرير بسطر واحد:

ReportPrinter.Print(Report);

لكن ما يحتاج لبعض الإيضاح، هو كيفية الحصول على كائن التقرير Report الذي سنقوم بطباعته.

مبدئيا، يجب أن تكون قد أنشأت تقريرا في المشروع.. سنفترض أن هذا التقرير اسمه Report1.rdlc وأن المشروع اسمه Project1.. هذا التقرير يتم دمجه في موارد الملف التنفيذ للمشروع Resources، لهذا يمكن الإشارة إلى المورد الخاص به بالاسم Project1.Report1.rdlc.. هذا الاسم سنرسله إلى الخاصية ReportEmbeddedResource الخاصة بكائن التقرير المحلي LocalReport.. كالتالي:

LocalReport Report = new LocalReport();

Report.ReportEmbeddedResource = "Project1.Report1.rdlc";

نحتاج أيضا إلى إمداد التقرير بمصدر ربط البيانات BindingSource الذي سيستخدمه لعرض البيانات.. سنفترض أن التقرير يستخدم في تصميمه مجموعة بيانات اسمها DataSet1.. وأننا نستخدم في المشروع مصدر ربط بيانات اسمه BindingSource1 وضعنا فيه بالفعل البيانات التي نريد طباعتها.. هكذا يتم ربط التقرير بمصدر ربط البيانات:

ReportDataSource ReportDs = new ReportDataSource();

ReportDs.Name = "DataSet1";

ReportDs.Value = BindingSource1;

Report.DataSources.Add(ReportDs);

الآن صار التقرير جاهزا للطباعة:

ReportPrinter.Print(Report);

 

وحتى تريح نفسك من تكرار هذا الكود، يمكنك أن تضيف هذه الدالة إلى الفئة ReportPrinter:

public static void Print(string ReportEmbeddedResource,

           string DataSetName, BindingSource BindingSource)

{

     LocalReport Report = new LocalReport();

     Report.ReportEmbeddedResource = ReportEmbeddedResource;

     ReportDataSource ReportDs = new ReportDataSource(

                                           DataSetName, BindingSource);

     Report.DataSources.Add(ReportDs);

     ReportPrinter.Print(Report);

}

الآن يمكنك طباعة التقرير بسطر واحد من الكود كالتالي:

ReportPrinter.Print("Project1.Report1.rdlc", "DataSet1", BindingSource1);

 

ملاحظات:

1- الوسيلة الأخيرة التي أضفناها إلى الفئة ReportPrinter تستخدم مورد من موارد المشروع.. لهذا يجب أن تكون الفئة ReportPrinter موجودة داخل نفس المشروع.. أما إذا وضعت هذه الفئة في مشروع آخر (مثل مكتبة ربط dll)، فلن تعمل الوسيلة Print في صيغتها الأخيرة لأنها لن تستطيع الوصول إلى موارد مشروع آخر، وفي هذه الحالة عليك تهيئة التقرير وإرساله إلى الصيغة الأخرى من الوسيلة Print التي تستقبل معاملا من النوع LocalReport.

2- هذه الطريقة للطباعة المباشرة تستخدم الطابعة الافتراضية المعرّفة على جهاز المستخدم، وتستخدم إعدادات الطباعة الافتراضية وخصائص الورق المعرّفة في التقرير نفسه.. لهذا تأكد من ضبط هذه الخصائص في التقرير.

3- الطباعة المباشرة لا تغني عن منح المستخدم إمكانية معاينة التقرير قبل طباعته، لهذا يجب أن تضع زرا للمعاينة يعرض التقرير في الأداة ReportViewer، فهي تتيح للمستخدم أيضا التحكم في إعدادات الطباعة، كما أن الطباعة من خلالها تتيح للمستخدم اختيار الطابعة التي يريدها.