لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 02/25/23 في كل الموقع
-
1 نقطة
-
.هو انا ليه بستخدم العنصر sction ما دام اني ممكن استخدم العنصر divويعطي نفس النتيجة1 نقطة
-
لدي حساب توفير في البنك الاهلي المصري وطبعا عملة الحساب الجنية المصري ويوجد في رصيد الحساب ما يعادل سعر الدورة بالجنية المصري وبزيادة ولكن عندما اقوم بشراء الدورة يعطني خطأ ويقول فشل اتمام عملية الشراء مع العلم بطاقة الائتمان من نوع VISA ولا اعلم كيف يمكنني شراء الدورة1 نقطة
-
لدي هارد خارجي بنظام تشغيل Ubuntu و هارد الداخلي فيه نظام windows 10 هل يمكن إقلاع من الهارد الخارجي من دون ضرر على الهارد الداخلي ؟1 نقطة
-
كما في التعليق السابق وضح مصطفى طريقة إرسال بيانات إلى قاعدة البيانات SQLite ولكن row واحد لذلك إذا اردت إرسال العديد من الصفوف يمكنك استخدام loop كما في المثال التالي const sqlite3 = require('sqlite3').verbose(); let db = new sqlite3.Database('../db/sample.db'); let languages = ['C++', 'Python', 'Java', 'C#', 'Go']; //? ونغير الفاصل بين العناصر ل placeholders نجهز مصفوفة let placeholders = languages.map((language) => '(?)').join(','); let sql = 'INSERT INTO langs(name) VALUES ' + placeholders; db.run(sql, languages, function(err) { if (err) { return console.error(err.message); } console.log(`Rows inserted ${this.changes}`); }); db.close();1 نقطة
-
MathType هو برنامج يسمح لك بإنشاء وتحرير الصيغ الرياضية في مستندات الوورد والويب. يمكنك استخدام MathType مع PHP عن طريق استخدام البرمجة المباشرة للاتصال بالبرنامج وتوليد الصيغ الرياضية. لربط برنامج MathType بموقع مكتوب باستخدام PHP، يجب تنفيذ الخطوات التالية: 1- تأكد من أن برنامج MathType مثبت على جهاز الخادم الخاص بك. تنزيل إضافة mbstring: هي إضافة PHP مهمة تتيح العمل مع النصوص المتعددة البايت. يمكن تنزيلها عن طريق مدير حزم PHP أو بتثبيتها يدويًا. نسخ المجلد generic_wiris: هو المجلد الذي يحتوي على ملفات MathType الأساسية. يمكن العثور عليها في مجلدات الإضافة المثبتة لـ MathType. يجب نسخ هذا المجلد ووضعه في ال root الخاص بالخادم. تهيئة الملف configuration.ini: يحتوي هذا الملف على الإعدادات الأساسية لنظام MathType. يجب فتحه وضبط الإعدادات التي تريدها، مثل نوع الرسومات وحجم الخط ولغة العرض وغيرها. تهيئة صلاحيات المستخدم: يجب أن يكون للمستخدم صلاحيات تنفيذ لمحتويات المجلد generic_wiris/integration. هذا يمكن تحقيقه عن طريق تعيين الصلاحيات الصحيحة للملفات والمجلدات. 2- قم بإنشاء نموذج HTML يحتوي على مربع نص يحتوي على صيغة رياضية تريد إدراجها باستخدام MathType. في هذا المثال، نحن سنستخدم مكتبة jQuery للوصول إلى مربع النص وإرسال النص إلى برنامج MathType. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>MathType Demo</title> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script> <script type="text/javascript" src="http://localhost/mathtype/MathType.js"></script> </head> <body> <input type="text" id="mathInput" name="mathInput" /> <button onclick="sendToMathType()">Insert MathType Formula</button> <script> function sendToMathType() { var mathText = $('#mathInput').val(); if (mathText !== '') { var mathML = MathType.ConvertEquation(mathText, "MathML"); window.opener.InsertMathML(mathML); window.close(); } } </script> </body> </html> 3- تنفيذ الاتصال مع برنامج MathType باستخدام PHP. في هذه المرحلة، يتم إرسال النص من النموذج إلى PHP ومن ثم يتم إرساله إلى MathType للتحويل إلى صيغة MathML. <?php // تأكد من أن $mathInput هو اسم حقل نص الرياضيات في النموذج الخاص بك. $mathInput = $_POST['mathInput']; // قم بإرسال نص الرياضيات إلى MathType لتحويله إلى MathML. $url = 'http://localhost/mathtype/MTScript.php?equation=' . urlencode($mathInput) . '&format=MathML'; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); curl_close($ch); // يجب عرض نتيجة MathML على صفحة الويب باستخدام العلامة <math> المدعومة بالمتصفح. // يمكن استخدام النص المنتج لإنشاء العلامة <math> المطلوبة باستخدام PHP DOMDocument. $dom = new DOMDocument(); $dom->loadXML($result); $mathml = $dom->saveXML($dom->getElementsByTagName('math')->item(0)); // ثم قم بعرض النتيجة على صفحة الويب باستخدام علامة <math> في النموذج الخاص بك. echo '<div>' . $mathml . '</div>'; ?> يرجى ملاحظة أن الكود يستخدم cURL للاتصال بـ MathType على localhost. قم بتعديل عنوان URL في حال كان يتم استضافة MathType على مضيف آخر. بعد ذلك، يمكننا استخدام دالة urlencode لترميز الصيغة ليتم إرسالها بشكل صحيح في الطلب الذي سيتم إرساله لموقع مكتوب. وبعد ذلك، يمكن استخدام دالة file_get_contents لجلب النتيجة من موقع مكتوب، وفك ترميز النتيجة باستخدام دالة urldecode. وفيما يلي الكود الذي يقوم بإجراء كل هذه الخطوات: // تعريف الصيغة $formula = 'x^2 + y^2 = z^2'; // ترميز الصيغة $encoded_formula = urlencode($formula); // جلب النتيجة من موقع مكتوب $url = 'http://www.sitename.com/cgi-bin/mathtype.cgi?eq=' . $encoded_formula; $result = file_get_contents($url); // فك ترميز النتيجة $decoded_result = urldecode($result); // طباعة النتيجة echo $decoded_result; يمكن تغيير قيمة المتغير $formula إلى أي صيغة رياضية أخرى، وستتم معالجتها بنفس الطريقة. ويمكن أيضًا تعديل قيمة المتغير $url ليشير إلى الموقع الذي يتم فيه استضافة برنامج MathType.1 نقطة
-
يمكنك القيام بذلك باتباع الخطوات التالية: عليك تنزيل إضافة mbstring على السيرفر و تفعيلها. عليك نسخ المجلد generic_wiris من مجلدات الإضافة و وضعه في ال root للسيرفر الخاص بك، من ثم عليك فتح الملف generic_wiris/configuration.ini و ضبط الإعدادات التي تريدها. يجب أن يكون المستخدم على السيرفر له صلاحيات تنفيذ لمحتويات المجلد generic_wiris/integration.1 نقطة
-
الدالة findOdd تستقبل مصفوفة (Array) A وتقوم بإرجاع العدد الذي يحدث فيه تكرارات فردية. مثلاً إذا كانت المصفوفة A هي [1, 2, 3, 2, 3, 1, 3]، فإن الدالة ستعيد القيمة 3، لأن العدد 3 هو الوحيد الذي يتكرر في المصفوفة بتكرار فردي. الكود يبدأ بتعريف دالة جديدة تسمى count والتي تستقبل مصفوفة (Array) arr وقيمة val، وتقوم بإرجاع عدد مرات تكرار val في المصفوفة arr. وتستخدم الدالة filter لتصفية القيم التي تساوي val ومن ثم حساب طول المصفوفة الناتجة. بعد ذلك، يتم تعريف متغير target وتعيينه بقيمة الصفر. تمر الدالة forEach على كل عنصر في المصفوفة A، وتستخدم دالة count لحساب عدد مرات تكرار العنصر في المصفوفة A. ثم يتم فحص ما إذا كان هذا العدد فرديًا أم لا، وذلك باستخدام العملية الرياضية % للتحقق مما إذا كان العدد الذي يمثل تكرارات العنصر في المصفوفة زوجيًا أم لا. إذا كان عدد التكرارات فرديًا، يتم تعيين قيمة العنصر الموجود حاليًا في الدورة الحالية إلى المتغير target. أخيراً، تعيد الدالة قيمة المتغير target الذي يمثل العدد الذي يحدث فيه تكرارات فردية في المصفوفة. المثال السابق: في الدورة الأولى، سيتم حساب عدد مرات تكرار الرقم 1، الذي يساوي 2، لأن الرقم 1 يتكرر مرتين في المصفوفة A. في الدورة الثانية، سيتم حساب عدد مرات تكرار الرقم 2، الذي يساوي 2، لأن الرقم 2 يتكرر مرتين في المصفوفة A. في الدورة الثالثة، سيتم حساب عدد مرات تكرار الرقم 3، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A. في الدورة الرابعة، سيتم حساب عدد مرات تكرار الرقم 2 مرة أخرى، الذي يساوي 2، لأن الرقم 2 يتكرر مرتين في المصفوفة A. في الدورة الخامسة، سيتم حساب عدد مرات تكرار الرقم 3 مرة أخرى، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A. في الدورة السادسة، سيتم حساب عدد مرات تكرار الرقم 1 مرة أخرى، الذي يساوي 2، لأن الرقم 1 يتكرر مرتين في المصفوفة A. في الدورة السابعة، سيتم حساب عدد مرات تكرار الرقم 3 مرة أخرى، الذي يساوي 3، لأن الرقم 3 يتكرر ثلاث مرات في المصفوفة A. بعد ذلك، سيتم فحص ما إذا كان العدد الذي تم حساب تكراراته فرديًا أم لا باستخدام الشرط count(A, arrnum) % 2 !== 0، وإذا كانت الشرط صحيحة، فإن قيمة العدد الذي يمثل تكراراته ستتم تعيينها إلى المتغير target. أخيرًا، يتم إرجاع قيمة المتغير target الذي يمثل العدد الذي يحدث فيه تكرارات فردية في المصفوفة A. إذا قمت بتنفيذ الدالة findOdd([1, 2, 3, 2, 3, 1, 3])، فستعيد الدالة القيمة 3، لأن العدد 3 هو العدد الذي يتكرر في المصفوفة 3 مرات، وهو يحدث فيه تكرارات فردية.1 نقطة
-
يُستخدم تحويل فورييه المتقطع Discrete Fourier Transforms أو DFT بشكليه الحقيقي والمركّب لتحليل ترددات الإشارات المتقطعة والدورية. تحويل فورييه السريع Fast Fourier Transform أو FFT هو تطبيق خاص لتحويل فورييه المتقطع DFT، يتميّز بالسرعة ويناسب وحدات المعالجة المركزية الحديثة. تحويل فورييه السريع من الأساس 2 لعلّ أبسط طرق حساب تحويل فورييه السريع FFT وأشهرها هي خوارزمية التعشير الزمني من الأساس 2 أي Radix-2 Decimation in Time، وينبني عمل هذه الخوارزمية على تفكيك إشارة معيّنة ذات نطاق زمني مؤلف من N نقطة إلى N إشارة أحادية (أي ذات نطاق زمني مؤلف من نقطة واحدة). يمكن تفكيك الإشارة -أو التعشير الزمني decimation in time- عن طريق عكس بتّات المؤشّرات في مصفوفة بيانات النطاق الزمني، فإن كانت الإشارة مؤلفة من ستة عشر نقطة مثلًا، فستُبدّل العينة 1 (ترميزها الثنائي 0001) بالعينة 8 (ترميزها الثنائي 1000)، وتبديل العينة 2 (0010) بـ 4 (0100) وهكذا دواليك. يمكن إجراء مبادلة العينات Sample swapping باستخدام تقنية عكس البتات bit reverse، بيْد أنّ ذلك سيحدّ إمكانية استخدام خوارزمية Radix 2 FFT على الإشارات التي يمكن كتابة أطوالها وفق الصيغة N = 2 ^ M. تتطابق قيم الإشارات الأحادية داخل النطاق الزمني time domain مع قيمها في نطاق التردد frequency domain، لهذا لا تتطلب هذه المصفوفة المؤلّفة من نقاط النطاق الزمني المفكّكة أيّ تحويل لتصبح مصفوفة لترددات النطاق. بيْد أنّه يجب إعادة بناء النقاط الفردية، وعددها N كما تعلم ، إلى طيف ترددات مؤلف من N نقطة N-point frequency spectra. تُعدّ طريقة الفراشة أفضل طريقة لإعادة بناء طيف الترددات. تتجنّب خوارزمية تحويل فورييه السريع الحسابات الزائدة التي يُجريها تحويل فورييه المتقطع DFT، وذلك عبر استغلال التواتر الدوري periodicity لـ Wn ^ R. تستغرق عملية إعادة البناء الطيفي عدد log2 (N) مرحلة من مراحل حسابات الفراشة لتُعيد قيمة X [K]؛ أي بيانات نطاق التردد وفق الشكل الجبري. ولكي نحول الإحداثيات الجبرية إلى إحداثيات قطبية فإننا نحسب القيمة المطلقة التي تساوي: √(Re^2 + Im^2)، حيث يمثّل Re الجزء الحقيقي من العدد المركب، ويمثّل Im الجزء التخيلي. سيكون علينا إيضًا حساب وسيط العدد المركّب عبر الصيغة: tan-1 (Im / Re). حيث: N: عدد النقاط في تحويل فورييه السريع R: قيمة WN الحالية، وتعتمد على قيمة N و المرحلة الحالية من تحويل فورييه السريع وقيمة حسابات الفراشة في هذه المرحلة. يمثل الرسم البياني التالي مخطّط الفراشة لخوارزمية فورييه السريع الثُمانِي من الأساس 2 - أي eight point Radix 2 FFT- ولاحظ أن الإشارات المُدخلة رُتَِبت وفقًا لقيم التعشير الزمني المشار إليه سابقًا. يأخذ تحويل فورييه السريع أعدادًا مركّبة ويعيد أعدادًا مركّبة، فإن أردت تمرير إشارات حقيقية (أي تنتمي لمجموعة الأعداد الحقيقية R)، فيجب أن تعيّن الجزء التخيلي على القيمة 0، وتعطي للجزء الحقيقي قيمة الإشارة المُمرَّرة، أي x [n]. يمكن تحديد قيم Wn ^ R المستخدمة خلال أطوار إعادة البناء باستخدام معادلة أسّية موزونة exponential weighting equation. تُحدَِّد قيمة R (القوة الأسية الموزونة) المرحلة الحالية في عملية إعادة البناء الطيفية ومرحلة حسابات الفراشة. هذه شيفرة مكتوبة بلغة C / C++ لحساب تحويل فورييه السريع من الأساس 2. تعمل هذه الشيفرة مهما كان الحجم N، شرط أن يكون N قوة للعدد 2. هذه الطريقة أبطأ 3 مرات تقريبًا من أسرع تقديم لتحويل فورييه السريع، ولكنّها تقنية واعدة ويمكن تحسينها مستقبلًا، كما أنّها مناسبة لتعليم أساسيات خوارزمية تحويل فورييه السريع. #include <math.h> #define PI 3.1415926535897932384626433832795 // PI قيمة #define TWOPI 6.283185307179586476925286766559 // 2*PI قيمة // معامل التحويل من Degrees إلى Radians #define Deg2Rad 0.017453292519943295769236907684886 // معامل التحويل من Radians إلى Degrees #define Rad2Deg 57.295779513082320876798154814105 / #define log10_2 0.30102999566398119521373889472449 // Log10 of 2 #define log10_2_INV 3.3219280948873623478703194294948 // 1/Log10(2) // بنية لتمثيل الأعداد المركبة struct complex { public: double Re, Im; }; // تعيد true إن كان N قوة للعدد 2 bool isPwrTwo(int N, int *M) { // تمثل M عدد المراحل التي يجب إجراؤها، 2^M = N *M = (int)ceil(log10((double)N) * log10_2_INV); int NN = (int)pow(2.0, *M); // تحقق من أنّ N قوة للعدد 2 if ((NN != N) || (NN == 0)) return false; return true; } void rad2FFT(int N, complex *x, complex *DFT) { int M = 0; // تحقق من أنّه قوة للعدد 2، وإن كان خلاف ذلك فأنهِ البرنامج if (!isPwrTwo(N, &M)) throw "Rad2FFT(): N must be a power of 2 for Radix FFT"; // متغيرات صحيحة // لتخزين المسافة في الذاكرة بين حسابات الفراشة int BSep; // لتخزين المسافة بين الطرفين المتقابلين في حسابات الفراشة int BWidth; // المتماثلة التي ستُستخدم في هذه المرحلة Wn عدد قيم P يمثل المتغير int P; // في حلقة التكرار لإجراء كل الحسابات في هذه المرحلة j يُستخدم int j; // رقم المرحلة الحالية في تحليل فورييه السريع stage يمثل المتغير // في المجموعة M هناك int stage = 1; // الخاصة بالقيمة العليا DFT يمثَّل فهرس مصفوفة // في كل عملية من حسابات الفراشة int HiIndex; // يُستخدم في قلب القناع البتي unsigned int iaddr; // يُستخدم في التعشير الزمني int ii; int MM1 = M - 1; unsigned int i; int l; unsigned int nMax = (unsigned int)N; // يمثل TwoPi_N ثابتة لتخزين مدّة الحسابات = 2*PI / N double TwoPi_N = TWOPI / (double)N; double TwoPi_NP; // أعداد مركبة complex WN; // يمثل دالة الوزن الأسية وفق الشكل a + jb complex TEMP; // يُستخدم لتخزين نتائج حسابات الفراشة complex *pDFT = DFT; // مؤشر يشير إلى العنصر الأول في مصفوفة DFT complex *pLo; // مؤشّر يشير إلى lo / hi في حسابات الفراشة complex *pHi; complex *pX; // x[n] مؤشر إلى for (i = 0; i < nMax; i++, DFT++) { // حساب قيمة x[n] انطلاقا من العنوان *x والفهرس i pX = x + i; // DFT[n] إعادة تعيين عنوان جديد لـ ii = 0; iaddr = i; for (l = 0; l < M; l++) // ii وتخزين الناتج في i قلب بتات { if (iaddr & 0x01) // تحديد البتة الأقل أهمية ii += (1 << (MM1 - l)); iaddr >>= 1; operations for speed increase if (!iaddr) break; } DFT = pDFT + ii; DFT->Re = pX->Re; DFT->Im = pX->Im; // العدد التخيلي يساوي 0 دائما } for (stage = 1; stage <= M; stage++) { //تقسيم حسابات الفراشة إلى 2^stage BSep = (int)(pow(2, stage)); // قيم Wn المتماثلة في هذه المرحلة = N/Bsep P = N / BSep; // عرض المرحلة الحالية في حسابات الفراشة // (المسافة بين النقاط المتقابلة) BWidth = BSep / 2; TwoPi_NP = TwoPi_N*P; for (j = 0; j < BWidth; j++) { //حفظ الحسابات إن كان R = 0، حيث WN^0 = (1 + j0) if (j != 0) { //WN.Re = cos(TwoPi_NP*j) // (حساب Wn (الجزء الحقيقي والتخيلي WN.Re = cos(TwoPi_N*P*j); WN.Im = -sin(TwoPi_N*P*j); } for (HiIndex = j; HiIndex < N; HiIndex += BSep) { pHi = pDFT + HiIndex; // التأشير إلى القيمة العليا pLo = pHi + BWidth; // التأشير إلى القيمة السفلى if (j != 0) { //CMult(pLo, &WN, &TEMP); TEMP.Re = (pLo->Re * WN.Re) - (pLo->Im * WN.Im); TEMP.Im = (pLo->Re * WN.Im) + (pLo->Im * WN.Re); //CSub (pHi, &TEMP, pLo); pLo->Re = pHi->Re - TEMP.Re; pLo->Im = pHi->Im - TEMP.Im; //CAdd (pHi, &TEMP, pHi); pHi->Re = (pHi->Re + TEMP.Re); pHi->Im = (pHi->Im + TEMP.Im); } else { TEMP.Re = pLo->Re; TEMP.Im = pLo->Im; //CSub (pHi, &TEMP, pLo); pLo->Re = pHi->Re - TEMP.Re; pLo->Im = pHi->Im - TEMP.Im; //CAdd (pHi, &TEMP, pHi); pHi->Re = (pHi->Re + TEMP.Re); pHi->Im = (pHi->Im + TEMP.Im); } } } } pLo = 0; pHi = 0; pDFT = 0; DFT = 0; pX = 0; } تحويل فورييه السريع المعكوس من الأساس 2 يمكن الحصول على تحويل فورييه المعكوس عبر تعديل ناتج تحويل فورييه السريع العادي، ويمكن تحويل البيانات في نطاق الترددات frequency domain إلى النطاق الزمني time domain بالطريقة التالية: اعثر على مرافق العدد المركب لبيانات نطاق الترددات. طبّق تحويل فورييه السريع العادي على مرافق بيانات نطاق التردّد conjugated frequency domain data. اقسم كل مخرجات نتيجة تحويل فورييه السريع على N للحصول على القيمة الصحيحة للنطاق الزمني. احسب مرافق العدد المركب للعنصر الناتج عبر عكس المكوّن التخيلي لبيانات النطاق الزمني لجميع قيم n. ملاحظة: تُعدّ كل من بيانات نطاق التردد وبيانات النطاق الزمني متغيّراتٍ مركبة، وعادة ما يساوي المكونّ التخيلي للنطاق الزمني للإشارة التي تعقُب تحويل فورييه السريع المعكوس القيمة 0، وإلا فستُعد خطأ تقريبيًا وتُتجاهل. وإنّ زيادة دِقة المتغيرات من 32 بتّة عشرية 32-bit float إلى 64 بتّة مزدوجة 64-bit double أو إلى 128 بتّة مزدوجة سيقلّص أخطاء التقريب الناتجة عن تعاقب عدّة تحويلات فورييه سريعة. هذا تطبيق مكتوب بلغة C / C++: #include <math.h> #define PI 3.1415926535897932384626433832795 #define TWOPI 6.283185307179586476925286766559 #define Deg2Rad 0.017453292519943295769236907684886 #define Rad2Deg 57.295779513082320876798154814105 #define log10_2 0.30102999566398119521373889472449 // Log10 of 2 #define log10_2_INV 3.3219280948873623478703194294948 // 1/Log10(2) // بنية لتمثل الأعداد المركبة struct complex { public: double Re, Im; }; void rad2InverseFFT(int N, complex *x, complex *DFT) { // تمثل M عدد المراحل التي يجب إجراؤها، 2^M = N double Mx = (log10((double)N) / log10((double)2)); int a = (int)(ceil(pow(2.0, Mx))); int status = 0; if (a != N) { x = 0; DFT = 0; throw "rad2InverseFFT(): N must be a power of 2 for Radix 2 Inverse FFT"; } complex *pDFT = DFT; complex *pX = x; double NN = 1 / (double)N; // تعديل معامل تحويل فورييه السريع المعكوس for (int i = 0; i < N; i++, DFT++) DFT->Im *= -1; // حساب مرافق التردد الطيفي DFT = pDFT; rad2FFT(N, DFT, x); // حساب تحويل فورييه السريع العادي int i; complex* x; for ( i = 0, x = pX; i < N; i++, x++){ x->Re *= NN; // تقسيم النطاق الزمني على N لتصحيح السعة x->Im *= -1; // ImX تغيير إشارة } } ترجمة -بتصرّف- للفصل 55 من كتاب Algorithms Notes for Professionals. اقرأ أيضًا المقال السابق: خوارزميات للتعامل مع المصفوفات matrix algorithms المرجع الشامل إلى: تعلم الخوارزميات للمبتدئين خوارزميات البحث في النصوص أمثلة عن أنواع الخوارزميات خوارزميات الترتيب وأشهرها1 نقطة