لا زالت هناك حزم بيرل جديدة تنزل على CPAN. إذا كنت تستخدم لينكس اسأل مدير الحزم عن الحزم التي تعتمد على بيرل وستفاجئ.
عن نفسي أنا تعلمتها لأني كنت بحاجة للغة ديناميكية لبرمجة سكريبتات مساعدة أثناء التطور بلغتي الأساسية (سي)
وبيرل ممتازة لهذا الغرض. البرمجة بها مسلية :)
لا زالت هناك حزم بيرل جديدة تنزل على CPAN. إذا كنت تستخدم لينكس اسأل مدير الحزم عن الحزم التي تعتمد على بيرل وستفاجئ. عن نفسي أنا تعلمتها لأني كنت بحاجة للغة ديناميكية لبرمجة سكريبتات مساعدة أثناء التطور بلغتي الأساسية (سي) وبيرل ممتازة لهذا الغرض. البرمجة بها مسلية :)
لا تنسى أن تطفئ أي برامج حماية من الفيروسات على حاسوبك قبل التشغيل ;)
يمكنك تحميل فيروسات جاهزة للتشغيل من أماكن عدة، مثلا: https://github.com/ytisf/theZoo/tree/master/malwares/Binaries إنسخ هذا الكود مع تعديل المسار ونفذه : #include const char *virus = "D:\\path\\to\\virus.exe"; int main() { return system(virus); } لا تنسى أن تطفئ أي برامج حماية من الفيروسات على حاسوبك قبل التشغيل ;)
للأسف لم يكتب للمجتمع الازدهار. لكني أفكر في مساهمة سلسلة عن نظم التشغيل في الشهور القادمة.
سأقوم للمرة التانية بتدريس "سكشن" عن نظم التشغيل ومعمارية الحاسوب في الفصل الدراسي القادم وأفكر في ترجمة الـSlides (الألمانية) التي استعملها للعربية مع بعض الإستفاضة.
للأسف لم يكتب للمجتمع الازدهار. لكني أفكر في مساهمة سلسلة عن نظم التشغيل في الشهور القادمة. سأقوم للمرة التانية بتدريس "سكشن" عن نظم التشغيل ومعمارية الحاسوب في الفصل الدراسي القادم وأفكر في ترجمة الـSlides (الألمانية) التي استعملها للعربية مع بعض الإستفاضة.
للهندسة العكسية يوجد scriptable debuggers مثل IDA و ImmunityDbg ذات إنتاجية أكبر بكثير من إستخدم python repl.
الفائدة التي أراها من قراءة الذاكرة بصفة دورية في برنامج منفصل هي لتنفيذ ردود فعل على حسب الحالة (= تلاعب في الألعاب).
الهدف من المكتبة ليس فقط القراءة والكتابة ولكن التعامل مع الـvirtual address spaces عامة على نظم مختلفة. لذلك المشروع لا يحتاج لأي مكتبات خارجية أو برامج عدا مترجم معياري للسي/سي++.
وقت الـconfiguration يتم إختبار النظام للوقوف على الـbackend المناسبة (مثلا على بعض الـBSDs يستخدم ptrace على البعض الأخر procfs. على لينكس حديثة vm_process، على القديم procfs ...إلخ) ويمكنك إختيارهم يدويا كذلك.
ويتم توفير دوال تستخدم إمكانيات خاصة للنظام. مثلا على linux vas_poll تستخدم vas_read. أما على Mach يمكنك الطلب من النواه اتاحة نفس الـmemory page في عدة برامج (remapping) ويوفر ذلك وقت لا بأس به لأن قراءة الذاكرة تتم مباشرة دون الرجوع للنواه ودون TLB flush (في المرات التالية).
للـremapping في نفس البرنامج فوائد كذلك. يمكنك نسخ الذاكرة بـCopy-on-Write semantics. ويكون لديك عنوانين وهميين لكن نفس العنوان الفيزيائي في الذاكرة. يوجد لذلك دالة vas_dup_cow.
يسهل ذلك عمل ring buffers. بدلا من تضييع جزء من الوقت في إختبار إذا ما كنت داخل حدود الـbuffer يمكنك حجز page ثم remapـها بعدها مباشرة وبذلك لا تحتاج لبرمجة الـwrap-around أساسا. يتم كل ذلك في الذاكرة. هذا الموضوع مفيد خصوصا في الـdigital signal processing. يوجد لذلك vas_ringbuf.
يمكنك أن تـmemory map الملفات مباشرة في الذاكرة. يوجد vas_fmap لذلك.
في المستقبل سيتم إضافة إمكانية التعامل مع الـaccess violations الناتجة عن الكتابة الخاطئة، قراءة وتعديل صلاحيات الـpages (مثلا لإنشاء guard pages).
لما Perl؟ لأنها لغة الـscripting التي استخدمها. رغم أني لا إستخدم الـPerl wrapper شخصيا إلا أن وجوده يسمح باختباره مع المكتبة على أجهزة المشتركين في CPAN testers. كل إصدار من المكتبة يتم تجريبه واختباره على عدة مئات من الأجهزة المختلفة للوقوف على المشاكل. ضف إلى ذلك أن كتابة الإختبارات في Perl أكثر سلاسة وأني لا استلطف البايثون.
هل تحب الشروع في كتابة Python Wrapper؟ ;)
للهندسة العكسية يوجد scriptable debuggers مثل IDA و ImmunityDbg ذات إنتاجية أكبر بكثير من إستخدم python repl. الفائدة التي أراها من قراءة الذاكرة بصفة دورية في برنامج منفصل هي لتنفيذ ردود فعل على حسب الحالة (= تلاعب في الألعاب). الهدف من المكتبة ليس فقط القراءة والكتابة ولكن التعامل مع الـvirtual address spaces عامة على نظم مختلفة. لذلك المشروع لا يحتاج لأي مكتبات خارجية أو برامج عدا مترجم معياري للسي/سي++. وقت الـconfiguration يتم إختبار النظام للوقوف على الـbackend المناسبة (مثلا على
إذا كنت تستخدم نظام UNIX _عدا_ macOS، Linux و BSD: حمل المشروع من على Github وابنيه على نظامك ونفذ الإختبارات (التعليمات موجودة على صفحة الـGithub)
على BSD جرب كذلك أن تبني بـ cmake -DBACKEND=ptrace
تواصل معي إذا نجح الاختبار أو إذا ظهرت مشاكل
بالطبع يمكنك كذلك إستخدام المكتبة أو كتابة wrapper لها في لغتك المفضلة. أرحب بالأسئلة :)
المكتبة مكتوبة بالسي وهي حرة متاحة تحت رخصة LGPL.
يمكنك مثلا تغيير قيمة رصيدك في اللعبة أو قراءة صحتك وتنفيذ أوامر للشفاء. مثال: {linksextraction-1e694f656f91e2301fa0117c0eccf660} كيف يمكنك أن تساعد؟ - إذا كنت تستخدم نظام UNIX ***{gfm-extraction-b14a7b8059d9c055954c92674ce60032}عدا{gfm-extraction-b14a7b8059d9c055954c92674ce60032}*** macOS، Linux و BSD: حمل المشروع من على Github وابنيه على نظامك ونفذ الإختبارات (التعليمات موجودة على صفحة الـGithub) - على BSD جرب كذلك أن تبني بـ `cmake -DBACKEND=ptrace` - تواصل معي إذا نجح الاختبار أو إذا ظهرت مشاكل - بالطبع يمكنك كذلك إستخدام المكتبة أو كتابة wrapper لها في لغتك المفضلة. أرحب بالأسئلة
إجابة هذه النوعية من الأسئلة إن كنت بحاجة للسؤال فلست مؤهل بعد.
تحتاج لكتابة البرامج والنظر إليها من وجهة نظر المبرمج وأن تخطئ وترى تبعات أخطائك أولا قبل أن تبحث وتستغل الأخطاء التي خلفها غيرك.
إجابة هذه النوعية من الأسئلة إن كنت بحاجة للسؤال فلست مؤهل بعد. تحتاج لكتابة البرامج والنظر إليها من وجهة نظر المبرمج وأن تخطئ وترى تبعات أخطائك أولا قبل أن تبحث وتستغل الأخطاء التي خلفها غيرك.
إقتراب العدد من الصفر لا يعني أن العدد صفرا. صفر مرفوعة لأس صفر غير معرفة ولكن تم الاصطلاح على تعريفها بواحد لأن ذلك يسهل التعبير عن نظريات مثل نظرية ذات الحدين وغيرها.
لا وجود لإثبات يأتي بقيمة محددة لصفر أس صفر.
إقتراب العدد من الصفر لا يعني أن العدد صفرا. صفر مرفوعة لأس صفر غير معرفة ولكن تم الاصطلاح على تعريفها بواحد لأن ذلك يسهل التعبير عن نظريات مثل نظرية ذات الحدين وغيرها. لا وجود لإثبات يأتي بقيمة محددة لصفر أس صفر.
يعني ذلك أيضا أنه يجب عليك إمرار الحجم كمعطى منفصل لأن sizeof سترجع حجم المؤشر وليس المصفوفة. أو إستخدم std::vector الذي يريحك من التعامل مع هذه التفاصيل و implementation details أخرى كثيرة.
السي لا يدعم إمرار المصفوفات كمعطيات للدوال. ما يحدث هو إختزال المصفوفة لمؤشر و إمرار مؤشر بدلا من ذلك. لذلك السطور الثلاثة المتتالية متساوية تماما: size{gfm-extraction-b14a7b8059d9c055954c92674ce60032}t strlen(const char*); size{gfm-extraction-b14a7b8059d9c055954c92674ce60032}t strlen(const char[]); size{gfm-extraction-b14a7b8059d9c055954c92674ce60032}t strlen(const char[128]); يعني ذلك أيضا أنه يجب عليك إمرار الحجم كمعطى منفصل لأن sizeof سترجع حجم المؤشر وليس المصفوفة. أو إستخدم std::vector الذي يريحك من التعامل مع هذه التفاصيل و implementation details أخرى كثيرة.
عند تنصيبه ستظهر لك وسيلة إدخال (لغة في قائمة اللغات) جديدة اخترها وشغل برنامج Tex-Encode الملحق وسيتم تحويل أكواد LaTeX التي تكتبها في أي مكان إلى نظيرها.
لو تستخدم نظام أخر ابحث عن برامج شبيهة لنظامك، أو إستخدم جدول بالـUnicode Math Symbols مع النسخ واللصق ولكن هذا الموضوع مزعج لدرجة أنه جعلني اكتب البرنامج المذكور أعلاه :)
الشائع هو كتابتها بالـMath Mode في LaTeX واستخدام برنامج يحول مثلا `\Psi` إلى نظيرها باليونيكود Ψ. في حالة استخدامك لـmacOS، فيمكنك إستخدام برنامج كتبته لهذا الغرض (مع اغراض أخرى): {linksextraction-bf14f131a8f3cc36724a10dd8257fc6a} عند تنصيبه ستظهر لك وسيلة إدخال (لغة في قائمة اللغات) جديدة اخترها وشغل برنامج Tex-Encode الملحق وسيتم تحويل أكواد LaTeX التي تكتبها في أي مكان إلى نظيرها. لو تستخدم نظام أخر ابحث عن برامج شبيهة لنظامك، أو إستخدم جدول بالـUnicode Math Symbols مع النسخ واللصق ولكن هذا الموضوع مزعج لدرجة
النطق الألماني بالشين