• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

Mr.B

الخبراء المعتمدون
  • عدد المشاركات

    656
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل شيء نشر بواسطة Mr.B

  1. مؤشر لمصفوفة دوال

    يمكنك تعريف الدالة كنوع هكذا: return_type (*)(parameter_list) وإذا أردت استخدامها في متغير: return_type (*name)(parameter_list) وإذا كان المتغير مصفوفة: return_type (*name[])(parameter_list) مثال: #include <stdio.h> static int func1(const char *s) {   return printf("func1: %s\n", s); } static int func2(const char *s) {   return printf("func2: %s\n", s); } int main(void) {   static int (*array[])(const char *) = {func1, func2};   array[0]("A");   array[1]("B");   return 0; }
  2. هناك طريقتين قياسية للتواصل مع قواعد البيانات في جافا، الأولى أن تستخدم JDBC، وهي طريقة low-level، مناسبة إذا كان تطبيقك صغير وليس معقد (سيبقى هكذا) وتخطط لاستخدام قاعدة بيانات واحدة، تسمح لك بتنفيذ استعلامات مباشرة على قاعدة البيانات، كل ماحتاجه هو مزود JDBC لقاعدة البيانات التي تستخدمها، مثلاً لـMySQL ستحتاج mysql-connector-java. الثانية هي أن تستخدم JPA، وهي ORM ولها لغة استعلام خاصة JPQL (تستخدم غالباً JDBC داخلياً)، ميزتها أنها أقل كود وأنظف، وتغلف العديد من قواعد البيانات، بالإضافة لاستفادك من الـtype safety ، لو أردت استخدام PostgreSQL بدلاً من MySQL، فكل ماتحتاج إليه هو تغيير الـconnector من MySQL JDBC إلى PostgreSQL JDBC مع تغيير بعض الإعدادات، لكنها صعب إعدادها في البداية وتحتاج وقت للتعلم. كلاً من JDBC و JPA مجرد مواصفات لها أكثر من تطبيق implementation لهذه المواصفات، في حال أردت استخدام JBDC فكل ماتحتاج إليه هو الـDriver مثل mysql-connector-java، أما لـJPA فأنت بحاجة لـJDBC و JPA implementation مثل Hibernate أو EclipseLink. ستجد في المرفقات مثالين أحدهما لـJDBC والثاني لـJPA. samples.zip
  3. مشكلة javac is not recognized

    طريقتك في الترجمة في الصورة صحيحة، javac Rawan.java للترجمة و java Rawan لتنفيذ البرنامج، لكن يظهر أن تستخدمين package وهذا شيء دعيه لاحقاً، فقط أزيلي السطر package وضعي في الملف Rawan.java فقط: public class Rawan { public static void main(String[] args) { System.out.println("Hello world!"); } }  
  4. مشكلة javac is not recognized

    أنت فعلاً بحاجة لوضع مجلد البرنامج في متغير النظام PATH كي تتمكن من استخدام الأدوات والبرامج في ذلك المجلد في أي مكان دون الحاجة للإشارة لمسارها الكامل أو التواجد في مجلد الأداة. لكن المسار الذي وضعته هو مسار بيئة تشغيل جافا Java Runtime Environment (JRE) الازمة لتشغيل برامج جافا، بينما البرنامج\المترجم javac جزء من بيئة تطوير جافا Java Development Kit (JDK) الخاصة بالتطوير لجافا (المبرمج يحتاج الأولى والثانية، والمستخدم يحتاج الأولى فقط). تأكد أنك ثبت JDK، ثم ضع مسار مجلد bin الخاص ببيئة التطوير في متغيرات النظام كما عملت، هذا المسار تحدده أثناء التثبيت عادة C:\Program Files\Java\jdkX.X.X_XX\bin حيث أن X.X.X_XX هي إصدار JDK لديك، ثم أعد تشغيل سطر الأوامر ليعاد تحميل متغيرات النظام.
  5. accept هي من تسبب لك التوقف الملاحظ في خيط المعالجة الرئيسي main thread، حيث ستوقف خيط المعالجة حتى تستقبل اتصال، والمشكلة ستحدث كذلك مع recv و send، حيث ستسبب الأولى بإيقاف الخيط الى أن تستقبل شيء أو ينهي ارسال البيانات في الثانية، الواجهة الرسومية تحتاج أن لايتوقف خيط المعالجة التي تعمل به كي تتمكن من معالجة الأحداث في mainloop والا ستتجمد الواجهة. يلزمك إعادة هيكلة البرنامج بحيث تفصل الخادم في خيط معالجة فرعي وتترك معالجة أحداث الواجهة الرسومية في خيط المعالجة الرئيسي، مثال سريع: from tkinter import * import socket import threading port = 6000 host = "" class ChatServer(threading.Thread): def __init__(self): super().__init__() def run(self): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind((host, port)) sock.listen(5) while True: print('Waiting for incoming connections') clnt, address = sock.accept() print('Accepted a connection from {}, closing'.format(address)) ... clnt.close() chatServer = ChatServer() # Child thread chatServer.start() root = Tk() # Main thread root.mainloop()  
  6. يمكنك أن تبدأ من "بدهيات استعلامات SQL مع قواعد بيانات Sqlite"، فقط انتبه أن بعض الاستعلامات الواردة بالصفحة تحتوي أرقام مثل ٣٠، قم بتحويلها عند كتابتها إلى 30 وإلا فستعطيك syntax error. يمكنك أيضاً البحث عن "قواعد البيانات العلائقية" كمفهوم عام، ستجد هذه السلسلة الجميلة عنها، ومصادر أكثر باللغة الإنجليزية، يمكنك تطبيق معظم المفاهيم والاستعلامات التي تجدها على SQLite.
  7. SQLite ليست لغة بل قاعدة بيانات علائقية (تستخدم العلاقات) صغيرة جداً ولاتحتاج خادم حيث تخزن البيانات في ملف ومكتوبة بلغة C، ميزتها هي قابليتها للتضمين في برامج أخرى، فايرفوكس مثلاً يستخدمها لتخزين ملفات الكوكيز والصفحات التي زرتها والمفضلات، لكنها لاتصلح للتطبيقات التي يستخدمها عدد كبير من المستخدمين في نفس اللحظة مثل تطبيقات الويب، هناك في المقابل قواعد بيانات أخرى ثقيلة على شكل خادم مثل MySQL موجهة للتطبيقات التي يستخدمها عدد كبير من المستخدمين. تأتي SQLite على هيئة برنامج منفصل، وعلى هيئة مكتبة قابلة للتضمين في برامج أخرى مثل C/C++ و بايثون وغيرها، وبايثون تضمّن SQLite كوحدة من وحدات المكتبة القياسية، أي أنه لاتوجد هناك إلا SQLite واحدة. ماتكتبه بين الأقواس مثل SELECT ... و INSERT ... تسمى لغة SQL، وهي لغة قياسية تستخدمها معظم قواعد البيانات العلائقية (مع بعض الإختلافات البسيطة)، لو تعلمتها وفهمت مبادئ قواعد البيانات العلائقية يمكنك العمل على أي قاعدة بيانات من نفس النوع.
  8. لايوجد فرق في الواقع بين C# و VB.NET سوى في اللغة كواجهة، أما الخلفية متطابقة تماماً، كلاهما يترجمان لنفس الـCIL bytecode ويستخدمان نفس إطار الـ.NET ونفس المكتبات، فأي شيء يمكنك عمله بـC# يمكن عمله بـVB.NET، المسألة عائدة في النهاية للتفضيل الشخصي. لكن معرفة لو بسيطة بـC# ضرورية لأي مبرمج .NET، فكما رأيت أن كثير من أكواد الـ.NET والمكتبات مكتوبة بـC#، لذا معرفتك بها ستفيدك في فهم الأكواد وترجمتها إلى مايقابلها في VB.NET، وهي -على الأقل بالنسبة لي- سهلة وأقل إسهاب من VB.NET ويمكنك تعلمها بسرعة لو خصصت بعض الوقت في تعلمها، أفترض أنك قطعت الشوط الأطول في تعلم إطار الـ.NET.
  9. هذه عادة وظيفة مراقب نظام الملفات file system watcher، معظم الأنظمة توفر API خاصة بها لمراقبة والتنبيه حول التغييرات في نظام الملفات، هناك مكتبة بايثون متعددة المنصات اسمها Watchdog، لم يسبق أن جربتها لكن حسب وصفها فهي توفر ماتريد، ستجد هنا الوثائق مع مثال بسيط.
  10. محاكاة خاصية امتصاص اللون في الرسام

    لاتوجد دالة أو مكون مخصص لهذا الغرض، لكن يمكنك عملها عن طريق تخزين الصورة المعروضة في كائن BufferedImage يمثل الـbackbuffer وعندما تريد رسم شيء ترسمه في تلك الصورة المخزنة أولاً ثم تعرضه على النافذة، عند النقر على النافذة حدد موقع النقر x, y، ثم اقرأ قيمة البكسل المقابل في صورة المخزنة باستخدام BufferedImage#getRGB مثلاً والتي تعطيك مركبات الـrgb، للحصول على المركبات منفردة استخدم الفئة Color: Color color = new Color(backbuffer.getRGB(x, y)); int r = color.getRed(); int g = color.getGreen(); int b = color.getBlue(); خذ في الإعتبار أنك قد تحتاج للتحويل من إحداثيات الشاشة لإحداثيات الصورة في حال لم تكن متطابقة. ملاحظة جانبية: إذا كان برنامجك محرر صور، ربما تقرأ عن الـaffine transformations وعن الفئة AffineTransform، قد يكون فهمها صعب في البداية لكنها سيسهل عليك عملك خصوصاً التحويل بين الإحداثيات.
  11. ما فائدة المتقلبة اي "volatile"

    volatile تستخدم لمنع مترجم الـC# أو مترجم الـJIT من إجراء أي تحسين optimization قد يؤدي لعدم القراءة أو الكتابة للمتغير مباشرة في الذاكرة، مثلاً هنا: using System; using System.Threading; namespace ConsoleApplication { internal class Program { private static void Main() { var test = new Test(); new Thread(() => { Thread.Sleep(1000); test.Continue = false; }).Start(); Console.WriteLine("Entering loop"); while (true) { if (test.Continue == false) break; } Console.WriteLine("Leaving loop"); } internal class Test { public bool Continue = true; } } } هناك خيط معالجة فرعي ينتظر لثانية ثم يغير قيمة Continue إلى false، خيط المعالجة الرئيسي يستمر في حلقة تكرار طالما أن Continue = true ثم يخرج من حلقة التكرار إذا تغيرت قيمة Continue إلى false. هذا المفترض، إلا أنه عند بناء البرنامج في وضع الـRelease (تفعل التحسينات)، قد يقوم مترجم الـJIT خطأ بتحسين حلقة التكرار بحيث يحذف جملة if إلى مايكافئ: while (true) { } بحيث تستمر حلقة التكرار للأبد، أي أن البرنامج لم يعد يقرأ القيمة من الذاكرة بل أصبح إما يقرأ من مكان آخر كمسجل المعالج أو لم يعد يقرأ القيمة أصلاً، عندي حسن الكود للتالي: 02B504B8 movzx eax,byte ptr [eax+4] while (true) { if (test.Continue == false) 02B504BC test eax,eax #### ليس لها أي فائدة عند العودة لها مرة أخرى while (true) { if (test.Continue == false) 02B504BE jne 02B504BC #### eax قفزة للتعليمة السابقة دون أي تعليمة قد تغير قيمة المسجل break; } Console.WriteLine("Leaving loop"); 02B504C0 mov ecx,dword ptr ds:[3DB22A8h] أي أنه عملياً حذف جملة if ولم يعد يقرأ القيمة Continue، هذا التحسين معقول لو أن هناك فقط خيط معالجة واحد، فلا يوجد شيء قد يغير قيمة Continue في خيط المعالجة الرئيسي، والمترجم يقوم بالتحسين وفق هذه الفرضية فلايوجد شيء عند تحليله للبرنامج يشير لعكس هذا. لتفادي مثل هذا النوع من التحسينات نحتاج لاستخدام volatile مع Continue هكذا: ... public volatile bool Continue = true; ... لمنع المترجم من عمل أي تحسين يخص هذا المتغير قد يؤدي لتلك النتيجة غير المرغوبة. انتبه أن volatile نادر جداً أن تستخدم، فأي بيانات يتم الوصول لها من أكثر من خيط معالجة عرضة لحالة تسمى التسابق race condition، وجود volatile لن يحميك منها فهي ليست وسيلة مزامنة، هنا مثلاً لدينا خيطان معالجة يقوم كلاً منهما بزيادة Value بواحد: using System; using System.Threading; namespace ConsoleApplication { internal class Program { private static void Main() { var test = new Test(); var thread = new Thread(() => { for (var i = 0; i < 1000000; ++i) { test.Value += 1; } }); thread.Start(); for (var i = 0; i < 1000000; ++i) { test.Value += 1; } thread.Join(); Console.WriteLine(test.Value); // 2000000 ?! } internal class Test { public volatile int Value; } } } النتيجة المتوقعة أن تكون قيمة Value = 2000000، إلا أنك غالباً ستجد قيم عشوائية مختلفة بسبب حالة التسابق، وجود volatile لن يغير شيء، تحتاج دوماً لمزامنة الوصول للمتغير المشترك الذي تقرأه وتكتب له أكثر من خيط معالجة سواء باستخدام مثلاً قفل lock على المتغير test، أو استخدام دوال عائلة Interlocked لمثل هذه الحالة البسيطة: using System; using System.Threading; namespace ConsoleApplication { internal class Program { private static void Main() { var test = new Test(); var thread = new Thread(() => { for (var i = 0; i < 1000000; ++i) { Interlocked.Increment(ref test.Value); // atomic test.Value += 1 } }); thread.Start(); for (var i = 0; i < 1000000; ++i) { Interlocked.Increment(ref test.Value); // atomic test.Value += 1 } thread.Join(); Console.WriteLine(test.Value); // = 2000000 } internal class Test { public int Value; } } } عند استخدام أدوات المزامنة تلك فلا حاجة إلى volatile، لأنها تضمن أن المتغير يقرأ ويكتب مباشرة في الذاكرة. المثال الأول باستخدام القفل: using System; using System.Threading; namespace ConsoleApplication { internal class Program { private static void Main() { var test = new Test(); new Thread(() => { Thread.Sleep(1000); lock (test) { test.Continue = false; } }).Start(); Console.WriteLine("Entering loop"); while (true) { lock (test) { if (test.Continue == false) break; } } Console.WriteLine("Leaving loop"); } internal class Test { public bool Continue = true; } } }  
  12. لم يسبق لي الاطلاع إلا على Linear Algebra and Its Applications، وهو كتاب ممتاز في الجبر الخطي وأعتقد أنه سيكون الكتاب المعتمد في مادة رياضيات بنفس الإسم، الكتب الباقية لم أطلع عليها. حالياً قبل دخولك الجامعة لست بحاجة لهذه الكتب بهذا المستوى من التعمق، لأنك ستدرس هذه المواضيع في الجامعة من الصفر، لكن المبادئ الأساسية في الرياضيات ستفترض الخطة الدراسية أن مادرسته في المتوسطة والثانوية قد غطاها، لذا كتاب مثل No bullshit guide to math and physics أعتقد أنه مناسب لمراجعة هذه المفاهيم. بالمناسبة، غالباً لن تدرس نظرية الإعداد في مادة رياضيات مستقلة في بكالوريوس علوم الحاسب سوى كجزء من مادة عن أمن المعلومات، ستدرس خلالها مقدمة بسيطة لنظرية الأعداد ربما في محاضرة أو محاضرتين فقط لفهم بعض الموضوعات في التشفير.
  13. في الجامعة ستدرس مواد رياضيات مثل التكامل والتفاضل (مثل التي درستها في الثانوية لكنها بتعمق أكبر)، المعادلات التفاضلية، الهندسة التحليلية والجبر الخطي، يفترض أن تعرف أساسيات الرياضيات مثل مفاهيم الدوال، والجبر، وأساسيات الهندسة، هناك عدة كتب تغطي هذه الأشياء لكن معظمها مراجع وتحتاج وقت طويل لتغطيتها. أعتقد أن كتاب No bullshit guide to math and physics سيعجبك، كتاب مختصر وتأسيسي، يغطي معظم المواضيع التي تحتاجها في بدايتك في الجامعة، فقط ألق نظرة على جدول المحتويات، جزء من الكتاب فيزياء حيث ستفيدك في معرفة كيف تطبق المفاهيم الرياضية خصوصاً التكامل والتفاضل.
  14. صورة الرام ذات الأعمدة صورة تجريدية خلف عدة مستويات من التجريد، ليست الرام الحقيقية بل غرضها التبسيط، لكن البرامج لاتعرف هذه التفاصيل ولايهمها وتتعامل معها كما لو كانت فعلاً تشبه تلك الصور. فيزيائياً، تختلف الرام بحسب نوعها، مثلاً الـDRAM الأرخص والشائعة في الذواكر تستخدم مكثف لتخزين البت، والـSRAM تستخدم inverters، هذه الأخيرة سريعة ولكنها غالية ولاتستخدم حالياً للذاكرة الرئيسية، بل يقتصر استخدامها تقريباً على الذواكر الصغيرة والسريعة ككاش المعالج، كلها تكون على شكل مصفوفة N×M من البتات مع decoder يحدد مكان البيانات. الطريقة والنمط الذي يقرأ به المعالج الذاكرة يختلف حسب المعالج، لكن المعالج عندما يقرأ من الذاكرة فإنه يقرأها بحجم ثابت، اقرأ هنا عن محاذاة البيانات في الذاكرة. معظم الأنظمة الحديثة تستخدم الذاكرة التخيلية (عدى الأنظمة القديمة مثل دوس)، فالعنوان رقم صفر لايشترط أن يكون العنوان صفر في الذاكرة الفيزيائية، لكن برنامجك لن يعرف الفرق والفضل عائد لوحدة في المعالج تسمى وحدة إدارة الذاكرة MMU تقوم بتحويل تلك العناوين التخيلية لمايقابلها في الذاكرة الفيزيائية (يوفر المعالج دعم الذاكرة التخيلية ويتولى نظام التشغيل إدارتها). لها عدة فوائد، منها أنها تسمح بالوصول لعناوين أكبر من عناوين الذاكرة الفيزيائية، ذاكرتي الفيزيائية مثلاً 32GB، أي أن أقصى عنوان حقيقي هو 0x7ffffffff، لكن عند عرض ذاكرة برنامج باستخدام VMMap أرى عناوين أكبر بكثير: فائدة أخرى للذاكرة التخيلية أن البرنامج يعتقد أن معظم الذاكرة مخصصة له كما لو كان الوحيد وذلك لعزل البرامج عن بعض وكي لايخرب برنامج ذاكرة غيره من البرامج أو النظام، لو شغلت نسختين من هذا البرنامج: #include <stdio.h> int main() { int n = 111; printf("%p = %d\n", (void*)&n, n); (void)getc(stdin); return 0; } في أحدهما n=111 والثانية n=222 وتركتهما يعملان في نفس الوقت دون إغلاق أي منهما، سترى شيء مثل: كلا البرنامجين يشيران لنفس العنوان 0x000000000062fe4c ولكن بقيم مختلفة وهذا مستحيل لو كانا فعلاً يشيران لنفس العنوان الفيزيائي، السبب عائد للذاكرة التخيلية، فقد لايكون أيهما يشير حتى للعنوان 0x000000000062fe4c الفيزيائي. هناك تفاصيل أخرى أهملتها توضيحها يأخذ وقت، لكن هذه التفاصيل لاتهم البرامج كما قلت، ولن يعرف البرنامج بوجودها أصلاً.
  15. لايمكن عمل هذا، أي ملف قابل للقراءة فهو ضمنياً قابل للنسخ لأي وسيط يقبل الكتابة.
  16. cd اختصار لـchange directory أي "غير المسار للمجلد"، تكتب cd ثم تتبعها بمسار "لمجلد" وليس ملف (المجلد يحتوي الملفات). أنت لديك ملف اسمه helloworld.java (تأكد أنه فعلاً java وليس txt)، حسب الصورة فهذا الملف في مجلد سطح المكتب، بينما الأمر الذي تكتبه يشير لمجلد اسمه helloworld على سطح المكتب. إما أن تنشيء مجلد على سطح المكتب اسمه helloworld وتضع helloworld.java داخله، أو توجه مباشرة لسطح المكتب: cd "C:\Users\Gaza Free\Desktop" القوسين "" حول مسار المجلد مطلوبة هنا لأن هناك فراغ بين Gaza و Free، بدونها ستقرأ cd فقط حتى كلمة Gaza.
  17. "أرجو المساعدة في C# Keywords"

    unsafe تشير لأن الـblock ( سواءً دالة أو جزء من الكود {}) يحتوي على مؤشر يمكّن من الوصول المباشر للذاكرة، لا تستطيع استخدام المؤشرات بدون استخدام unsafe وبدون بناء البرنامج ككل باستخدام unsafe، لماذا تستخدم المؤشرات هذه مسألة أخرى تهم فئة محدودة من مبرمجين C# الذين يريدون التواصل مع كود مكتوب بـC/C++ مثلاً وليس كل مبرمجين C#. أما fixed فستخدم كي لايقوم جامع القمامة بتحريك مكان البيانات التي يشير لها المؤشر مع أنواع معينة وهي داخل الـblock المعلّم بـfixed، فجامع القمامة قد يقوم بتحرير الكائنات وإعادة ترتيبها في الذاكرة لتقليل مشكلة الـfragmentation، فلو حصل هذا وتغير مكان الكائن في الذاكرة فالمؤشر سيشير لبيانات غير صالحة.
  18. كيف اعرف اسم دولة زائر موقعي

    هذه API لخدمة أخرى ليست نفسها التي أعطيتك إياها (وهي مضمونة حسب تجربتي)، لم يسبق لي التعامل مع الـAPI التي تستخدمها، لكن كون الكود يعمل فلا يبدو لي أن هناك خطأ لديك، قد تكون الـAPI نفسها غير دقيقة.
  19. كيف اعرف اسم دولة زائر موقعي

    هناك خدمة GeoLite2 من MaxMind، حيث تقدم قاعدة بيانات مجانية تحدث أول ثلاثاء من كل شهر لأسماء الدول وعناوين الـIP الخاصة بها، مع API للـ.NET. يمكنك تحميل قاعدة البيانات من صفحة التحميلات، انزل للأسفل عند GeoLite2 Country، حمل قاعدة البيانات وفك الضغط عنها وضعها في مشروعك في فجيول ستديو، اضغط على قاعدة البيانات في الـsolution explorer، ومن Properties عدل Copy to Output Directory إلى Copy if newer كي تنسخ قاعدة البيانات لملف الـbin، ثم ثبت المكتبة الخاصة بها من NuGet باستخدام: Install-Package MaxMind.GeoIP2 -Pre تحتاج أن تعرف قارئ البيانات مرة واحدة في أي فئة (thread-safe): private static readonly DatabaseReader CountriesDatabaseReader = new DatabaseReader("GeoLite2-Country.mmdb"); يمكنك الآن الاستعلام عن أي IP: var countryResponse = CountriesDatabaseReader.Country("172.217.19.67"); Debug.WriteLine($"ISO code : '{countryResponse.Country.IsoCode}'"); Debug.WriteLine($" Name : '{countryResponse.Country.Name}'"); عناوين الـIP تتغير لذا تحتاج لتحديث قاعدة البيانات بين فترة وفترة (لديهم خدمة ويب لاتحتاج التحديث لكنها مدفوعة).
  20. offset تستخدم إذا كان بإمكانك تحديد العنوان أثناء الترجمة كما في حالة المتغيرات العامة، لكن عندك world و hello متغيرات محلية، إما أن تجعلها متغيرات عامة: #include<Windows.h> char hello[] = "Hello"; char world[] = "world"; int main(){ MessageBox(0, L"", L"", 0); FARPROC Ms = GetProcAddress(GetModuleHandle(L"user32.dll"), "MessageBoxA"); __asm { push 0 mov eax, offset world push eax mov eax, offset hello push eax push 0 call Ms } } أو تستخدم lea إذا كنت تريد إبقاءهما محلية: #include<Windows.h> int main(){ MessageBox(0, L"", L"", 0); FARPROC Ms = GetProcAddress(GetModuleHandle(L"user32.dll"), "MessageBoxA"); char hello[] = "Hello"; char world[] = "world"; __asm { push 0 lea eax, world push eax lea eax, hello push eax push 0 call Ms } } أيضاً لابد من حذف تعلميات التنظيف pop لأن MessageBoxA تستخدم طريقة stdcall في الإستدعاء وهنا المستدعى عليه مسؤولية تنظيف المكدس وليس أنت المستدعي.
  21. لا تسمى if ولا #if دوال، الأولى جزء من تصريح if statement (الـif نفسها كلمة محجوزة reserved word) والثانية توجيه للمعالج المسبق preprocessor directive، تسمى # هاش أو رمز الرقم أو الشباك، وليست شارب ♯. المترجم في C/C++ في أبسط صورة يمكن أن يقوم بالترجمة على مرحلتين (الواقع أكثر تعقيد)، مرحلة المعالجة المسبقة ومرحلة الترجمة الفعلية، حيث يأخذ المترجم البرنامج الذي تعطيه إياه ويمرره أولاً للمعالج المسبق الذي يفهم التوجيهات التي تبدأ بـ#، بعدما ينفذ المعالج المسبق هذه التوجيهات، سينتج ملف جديد وهو ماستتم ترجمته في النهاية. فمثلاً لو كتبت: #define NUM 1 int main() { #if 0   puts("ABC"); #endif   return NUM } سيحولها المعالج المسبق إلى مايشبه: int main() {   return 1 } لاحظ أن NUM استبدلت بـ1 وأزيلت puts، وهذا ماستتم ترجمته في النهاية، أي أن التوجيهات ليست سوى لغة مصغرة لتحويل ملف البرنامج قبل أن يترجم. يمكن أن تستخدم #define مثلاً لتعريف الثوابت مثل π، و #if تستخدم مثلاً إذا أردت لجزء معين من الكود وظيفته الـdebugging أن يزال عندما تريد نشر البرنامج، هذه فقط بعض الاستخدامات. لكن لايمكن أن تستخدم if بدل #if أو العكس، فكلاً منهما يستخدم لغرض مختلف. اطلع على كتاب لغة C الشامل الصفحة 185، ستجد فصل عن المعالجة المسبقة.
  22. السلام عليكم ورحمة الله وبركاته   في المرفقات عينتين لفيروس Gauss و Flame. العينين نادرة وبصراحة تعبت وأنا أدور عنها إلى أن حصلتها في منتدى ايراني.   الملفات غير محمية بكلمة مرور. جميعها ملفات dll، لكي تصاب يلزمك تحميل المكتبة للذاكرة.   محتوياتها: Trojan.Win32.Gauss-a---         3/14/2013   4:29 PM     194560 2Trojan-Spy.Win32.Gauss.smdk-a---         3/14/2013   4:29 PM     393216 2Trojan-Spy.Win32.Gauss.winshell-a---         3/14/2013   4:29 PM     236544 2Trojan-Spy.Win32.Gauss.wmi-a---         3/14/2013   4:29 PM     409600 3Trojan-Spy.Win32.Gauss.winshell-a---         3/14/2013   4:29 PM      94208 Trojan-Spy.Win32.Gauss.devwiz-a---         3/14/2013   4:29 PM     270336 Trojan-Spy.Win32.Gauss.lanhlp-a---         3/14/2013   4:29 PM     194560 Trojan-Spy.Win32.Gauss.smdk-a---         3/14/2013   4:29 PM     172032 Trojan-Spy.Win32.Gauss.windig-a---         3/14/2013   4:29 PM     397312 Trojan-Spy.Win32.Gauss.winshell-a---         3/14/2013   4:29 PM     237056 Trojan-Spy.Win32.Gauss.wmiWorm.Win32.Flame-a---         5/28/2012   4:19 PM     643072 advnetcfg.ocx-a---         5/28/2012   4:19 PM    1721856 msglu32.ocx-a---         5/28/2012   4:19 PM    6166528 mssecmgr.ocx-a---         5/28/2012   4:19 PM     827392 nteps32.ocx-a---         5/29/2012   2:21 PM     160768 soapr32.ocxبالنسبة لـGauss فسيساعدك هذا التحليل في استكشافه ومعرفة غرض تلك المكونات: Gauss: Abnormal Distribution وأما Flame فهذا التحليل أكثر تفصيل: sKyWIper (a.k.a. Flame a.k.a. Flamer): A complex malware for targeted attacks   في securelist تحليلات كثيرة لهما ربما تود الإطلاع عليها.   بالتوفيق Trojan.Win32.Gauss.7z Worm.Win32.Flame.7z
  23. ماتريده اسمه الزيادة الآلية auto-increment حيث تزيد قاعدة البيانات قيمة حقل تحدده بمقدار معين مع كل إضافة -مثلاً 1-، موجود تقريباً في كل قواعد البيانات، في sql server اسمه IDENTITY، انظر للمثال من الصفحة (العدد الأول المرر لـIDENTITY يمثل قيمة id_num في أول صف يضاف، والثاني يمثل مقدار الزيادة على القيمة السابقة): CREATE TABLE new_employees (  id_num int IDENTITY(1,1),  fname varchar (20),  minit char(1),  lname varchar(30) ); INSERT new_employees    (fname, minit, lname) VALUES    ('Karin', 'F', 'Josephs');
  24. صيغ الملفات المشهورة مثل png و jpeg معقدة ولاتخزن البكسلات بتلك البساطة، معظم تلك الصيغ مضغوطة وتستخدم طرق مثل الـindexing لتقليل الحجم، لو قررت أن تكتب decoder يحولها الصورة إلى مصفوفة بكسلات، ستجد أن جزئية تحميل الصورة ستتجاوز حجم برنامجك، هناك مكتبات جاهزة ومجانية حتى للمشاريع التجارية مثل libpng و libjpeg يمكنك استخدامها. إذا كان مشروعك بسيط كمشروع مادة، فالأسهل لك أن تستخدم صيغة بسيطة مثل PBM، صيغة صور نصية وسهل التعامل معها، لن تكلفك أكثر من 20 سطر لتحميل الصورة، لكن لاتدعم كل البرامج التحويل لها، أظن أن gimp يدعمها. P1 # Comment 4 2 1 0 0 0 0 1 1 0 إذا بدأت بـP1، فهي صورة 1-bit، الأبيض 1 وأسود 0، في السطر الثاني (سطر # تعليق) يمثل العدد الأول عدد الأعمدة والعدد الثاني عدد الأسطر، والأسطر الباقية بيانات البكسل (اضربها في 255 إذا أردت جعلها بين 0-255)، وإذا كان برنامجك يستخدم RGB، فكرر القيمة بعد الضرب 3 مرات (أي الأبيض R=255,G=255,B=255 والأسود R=0,G=0,B=0). إذا بدأت بـP2 فهي صورة رمادية، السطر الثالث في مثال الويكي يمثل أعلى قيمة للون، لتحويل اللون إلى لون في المدى 0-255 فاقسم اللون على أعلى قيمة واضربه في 255، مثلاً لو كانت أعلى قيمة 15 وكانت قيمة البكسل 7 فسيصبح: int(7/15 * 255) = 119 إذا بدأت الصورة بـP3 فهي مثل P2 إلا أن البكسل الواحد سيأخذ 3 أرقام لمركبات الـRGB (صورة ملونة). انتبه أن نهايات الأسطر ليس لها أهمية سوى أنها تحدد نهايات أسطر التعليقات فقط، يمكنك ازالتها وكتابة الصورة على سطر كما في المثال الأخير في الويكي.
  25. arabic font problem in JavaFx

    هذه bug في javafx نفسها، سبق أن أبلغ عنها هنا و هنا.