• الإعلانات

    • فيصل الحربي

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

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

Khaled Alshaya

المشرفون
  • عدد المشاركات

    2,052
  • تاريخ الانضمام

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

مشاركه بواسطة Khaled Alshaya


  1. السلام عليكم,

     

    جربتها قليلاً رغم أني لم أعمل عليها بشكل مكثف. مشكلتي الوحيدة معها و مع cpp netlib و مع جميع المكتبات التي توفر asynchronous model أنها تعتمد على الـ callbacks رغم أن الـ coroutines أسهل بكثير في كتابة منطق البرامج. أعلم أن هناك عدة مكتبات, و لكن توفير الـ coroutines في اللغة أمر آخر في غاية الأهمية. رغم كل ذلك فأنا أجدها سلسة في الاستخدام كمنصة, و Javascript هي لغة معروفة بالنسبة لي أصلاً, بالتالي لن تجد صعوبة في البداية بها.

     

    تحياتي...

    1

  2. بغض النظر عن اللغة أو التقنية التي ستعمل بها, لا تعمل في شيء لست (محترفاً) فيه, لكي تترك انطباعاً جيداً لدى الشخص الذي تقدم له عملك. الاحترافية هنا بمعناها العملي, و ليس الفخري, أي أنك يمكن أن تعمل مباشرة مع الاستعانة بالله في تعلم التفاصيل المطلوبة لإكمال المشروع.

     

    منصة Net. تعمل على mono و هي عابرة للمنصات بشكل أو بآخر, ربما ليست الأفضل في هذا المجال و لكن الأمر ممكن بكل بساطة. يمكنك تجربة لغة Go فهي جميلة في مجال الويب و توفر الكثير مما لا يتوفر في اللغات الديناميكية.

     

    تحياتي,

    0

  3. بالإضافة لأني لا أستطيع إنشاء خادم شخصي لأضع عليه تطبيقاتي بسبب سوء خدمة الإنترنت مقارناً بأسعارها المرتفعة هنا أيضاً ناهيك عن الأعطال المتكررة , وتأجير أو شراء خادم خارجي مكلف .

    فعلاً؟ يمكنك الحصول مقابل 10$ على خادم المواصفات التالية:

    1GB Memory
    1 Core
    30GB SSD Disk
    2TB Transfer
     
    2

  4. أهلاً أخي بسام, أمامك عدة خيارات, و كل خيار له مميزاته و سلبياته.

     

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

     

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

     

    الطريقة الثالثة, أن تسمح بالاستخدام الشخصي فقط غير التجاري و كمثال على هذا الأمر رخصة Affero GNU Public License و هذه الرخصة غير معتمدة حسب علمي كرخصة حرة, و لكنه أسلوب متبع في مشاريع شهيرة كمكتبة iText.

     

    عموماً, الفائدة التي ستجنيها في كل الأحوال عند استخدام رخصة حرة, هو أن تبني المشروع سيكون أسرع بكل تأكيد مما لو كانت الرخصة تجارية بحتة, عدا عن التحسينات التي ستأتي من مجتمع المطورين الذين قاموا بتبني مشروعك. لاحظ أن أي جهة جادة في استخدام مشروعك لن تعبث بالمشروع من أجل توفير القليل من المال, و لكنها ستبحث عن شخص خبير بالمشروع لتركيبه و التدريب عليه و هكذا. الفكرة أنك المطور الأصلي للمشروع و بالتالي فإنك ستكون المرشح الأقوى في هذه الحالة كـ consultant أو freelancer للعمل على تطبيق المشروع لدى تلك الجهة.

     

    تحياتي,

    3

  5. و عليكم السلام,

     

    أخي هل قمت بتعريبه يدوياً؟ مهمة شاقة جداً, ماذا عن الإصدارات اللاحقة؟

     

    قم بتحميل Bootstrap و nodejs. ثم قم بتحميل R2 عن طريق npm. بعدها قم بتحويل أي style sheet تريدها بكل سهولة.

     

    و هذا موقع صممته لتجربة النتيجة, و كانت أكثر من رائعة : )

    Free Syria ID

     

    تحياتي,

    0

  6. يبدو أنني كنت مخطئاً، الـinvalidation يحصل في حاويات أخرى كـvector. أما الـmap والـset فلا يحدث فيها.

     

    أخي لاحظ أنه في حالة أي عملية تقوم بتعديل الشجرة, في حالة الـ Containers الجديدة من Google فإن الـ Iterators تعتبر غير صالحة بعد تلك العملية. السبب بسيط, هو أن كل Node في الـ B-Tree تحمل أكثر من قيمة و بالتالي فإنه من غير الممكن (عملياً) تحديد أي Node تم تعديلها و بالتالي أي مجموعة قيمة تم تعديلها و بالتالي لا يمكن ضمان صلاحية الـ Iterators بعد هكذا عملية.

     

    هناك مكتبة من Boost من أحد مؤسسيها في الحقيقة تقترح إضافة B-Tree Containers و لكن للـ Disk-Based و لكن لم يتم ضمها بعد, يمكنك الاطلاع عليها من هنا: https://github.com/Beman/Boost-Btree

     

    تحياتي...

    2

  7. عبارة عن declaration لدالة اسمها b و تعيد كائن من نوع a. أما عن الـ parameters لهذه الدالة فهي عبارة عن دالة أيضاً, تعيد كائن من نوع a و لا تستقبل parameters :)

    يسمى هذا الـ most vexing parse لأن هناك ambiguity في تفسير هذا السطر, و المواصفات القياسية تحدد التفسير المذكور على أنه التفسير القياسي.

    1

  8. عندما تتكلم عن هندسة البرمجيات فأنت تتكلم عن مبرمج محترف ومحلل قواعد بيانات محترف وإداري ايضا محترف وامور اخرى

    هندسة البرمجيات في معظم الجامعات عبارة عن نسخة مخففة من علوم الحاسب مع بعض المواد الإنشائية التي لا يمكن أن تكتسب عن طريق الدراسة و إنما عن طريق التجربة و الخبرة في العمل ^_^

    0

  9. السلام عليكم...

    مقال أقل ما يقال عنه أنه من السهل الممتنع, قرأت المقال عدة مرات و بحثت كثيراً حتى استوعب النقاط التي يتكلم عنها المقال. ملخص المقال, هو الحديث عن انحراف الـ nix* عن الـ elegance الذي بنيت عليه أساساً بضياعها في متاهات ما أسمي hacking مغالطة, و الحقيقة أنها ليست الـ hacking الذي بني عليها النظام و لكن كتابة الكود دون جودة في التصميم مما أدى إلى ترهلات كبيرة في النظام و الأدوات الأساسية القائمة عليه.

    A Generation Lost in the Bazaar

    3

  10. اين البرنامج يا اخوان

    هذا مثال باستخدام Cpp11, فقط قم بتغيير numbers_count لتنتج العدد الذي تريده من الأعداد العشوائية. استخدمت g++ 7.1 لترجمة البرنامج:

    #include <cstdint>
    #include <cstddef>
    #include <fstream>
    #include <iomanip>
    #include <random>

    int main(){
    // specify the min/max range of the vouchers we want to generate
    const std::uint64_t min = 0x0ul, max = 0xfffffffffffful;
    // specify how many vouchers we want to generate, and the width
    // of the vouchers when represented in text
    const std::size_t numbers_count = 1000000, field_width = 12;
    std::random_device seed;
    std::mt19937_64 engine(seed());
    std::uniform_int_distribution<std::uint64_t> range(min, max);
    auto rnd = [&](){ return range(engine); };
    std::ofstream output("output.txt");
    output << std::hex << std::setfill('0');
    for(std::size_t i = 0; i < numbers_count; ++i)
    output << std::setw(field_width) << rnd() << '\n';
    }

    0

  11. لنحسب عدد الاحتمالات ببساطة:

    |solution space| = 16^12 = 281474976710656

    for each solution, we have 12 digits.

    Lets assume that each digit is represented with one byte only for simplicity.

    solution space size = 281474976710656 * 12 Bytes

    = 3377699720527872 Bytes

    = 3298534883328 KiB

    = 3221225472 MiB

    = 3145728 GiB

    أود أن أرى من لديه ثلاثة ملايين GiB لتخزين كل الاحتمالات :sad:

    إن كان المطلوب هو إنتاج عينات عشوائية من هذا المجال, فالموضوع يتم ببساطة عن طريق uniform distributed random number في الحالة البسيطة إن كانت جميع الاحتمالات متساوية في الأهمية. أما محاولة إنتاجها و تخزين كل الاحتمالات, فهو أمر غير ممكن على الأقل بالتكنلوجيا المتوفرة.

    4

  12. السلام عليكم و رحمة الله و بركاته,

    لا أعتقد أن هناك مبرمج لم يسمع عن Vim و Emacs, و عن "أسطورية" هذين المحررين. في الماضي, قمت بتجربة Emacs و لكني لسبب ما لم أكمل الطريق, رغم إعجابي بـ Emacs الذي رأيت فيه إمكانيات هائلة. أما Vim فقد لازمتني عقدة كرهه حتى وقت ليس بالبعيد. كنت أسأل نفسي, بعد تجربته لعدة مرات و محاولة تعلم هذه الأسطورة التي كنت أرى فيها كذبة كبرى في عصر المحررات الحديثة كـ ++Notepad و Textmate و Sublimetext و خلافه, كيف سأعيش في عصر الثمانينات؟! منذ عدة أشهر, أخذت على نفسي عهداً بأن "أتعلم" Vim, حتى لو كلفني ذلك وقتاً كثيراً و لم يكن الأمر حب استطلاع هذه المرة. قمت بتحميل A Byte of Vim و بدأت القراءة و التطبيق. و الحق يقال, أنك لا يمكنك تعلم Vim, و إنما يجب أن يصبح "عادة". عانيت معاناة كبيرة في الأسابيع الأولى, و فجأة عندما عدت للمحررات المتقدمة السالف ذكرها (الحقيقة, المحررات البدائية) ظهر جلياً السبب الذي يجعل الـ Vimmers لا يستغنون عن Vim. هناك الكثيرون ممكن يعتقدون أن Vim محرر أسطوري لأنه يعتمد على لوحة المفاتيح في فعل كل شيء, و لكن هذا أمر خاطئ بكل تأكيد. الذي يجعل Vim محرراً أسطورياً هو فلسفته في تعريف ماهية "النصوص" text!

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

    في المرفقات, ستجد ملف vimrc الذي يقوم بتخصيص Vim. الغريب في الموضوع أني لم أجد شخصان يستخدمان نفس التخصيصات! و لكن يتم نشرها على سبيل الاستفادة بين الـ Vimmers. و هناك أيضاً theme أعجبني جداً مرفق أيضاً!

    هل هناك من يستخدم هذا المحرر الأسطوري في منتدانا؟ ما رأيكم فيه؟ و منذ متى تستخدمه؟ و لأي أغراض تستخدمه؟

    تحياتي...

    vimmer.zip

    8

  13. السلام عليكم, و رمضان مبارك علينا و عليكم :)

    إذا كنت تعرف ماهي الـ Shortest Path Problem فلابد أن تشاهد هذا الفيديو لأنه مذهل حقاً, كيف خلق الله عز و جل القدرة لهذا الكائن أن يتمدد و يكتشف أقصر الطرق. شاهد الفديو ابتداءً من ساعة و ثلاثة دقائق و خمسون ثانية 1:03:50

    http://www.youtube.com/watch?v=sNAxrpzc6ws

    6

  14. من الطبيعي أن يكون هناك تطوير وترقية دائماً لكن المشكلة لو توقع المبرمج ذلك من البداية وقبل طلبه فماذا عليه أن يفعل؟ لو خصص قاعدة البيانات فإن عليه أن يطورها فيما بعد، ولو عممها وجعلها غاية في المرونة لخفف عنه لاحقاً ولكن مع صعوبة كبيرة في البرمجة والتصميم لأول مرة..

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

    الحل في هذه الحالة ليس بناء كل شيء من الصفر و لكن عمل تخصيص لـ ERP إن كان عميلك بهذا الحجم, أو العملاء حسب قولك. إضافة إلى ذلك, لا يمكن لمبرمج واحد القيام بما تريده, أعمل كـ SAP Developer و هناك جيش من محللي النظم بيننا و بين العملاء :)

    0

  15. تحذير! أنا لست الشخص الأفضل للحديث عن تصميم قواعد البيانات و لكن هذا ما لدي. الذي تواجهه أحد ثلاثة أمور برأيي المتواضع.

    الأول, هو الخلط بين "متطلبات" العميل و بين تصميم النظام. بمعنى, أن المتطلبات يمكن أن تنفذ بأكثر من طريقة, و بجعل النظام مرناً يتم استيعاب المتغيرات في التعديلات دون الحاجة إلى تعديل التصميم نفسه. مثلاً, قد يطلب العميل نوعين من المستخدمين: مدير و موظف, و لكل منهما صلاحيات معينة. قد تصمم جدول للمدراء و جدول للموظفين. في هذه الحالة لو أضفنا نوعاً آخر من المستخدمين كالمشرفين الذي تقع صلاحياتهم بين المدراء و الموظفين فستحتاج إلى تعديل قاعدة البيانات إضافة إلى منطق البرنامج. و لكن لو كان لديك جدول للمستخدمين و جدول للصلاحيات, إضافة أنواع جديدة من المستخدمين و ربطها بالصلاحيات لا يستدعي تعديل تصميم البرنامج و لا قاعدة البيانات.

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

    الأخير, أن تكون البيانات التي لديك لا تتبع هيكلية ثابتة تقريباً و هذا ممكن فعلاً و لكني أشك أن هذه الحالة تنطبق على البيانات التي ذكرتها. في هذه الحالة قواعد البيانات العلائقية ليست الحل الأنسب و هناك حلول أفضل.

    تحياتي...

    2