لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 08/01/21 في كل الموقع
-
أظن أنه ينبغي عليك أولا معرفة المميزات التي قد تستفيد منها في تعلمك لسكراتش , ثم سيمكنك الحكم إن كان تعلم ذلك واجبا أم لا بالنسبة لك , رغم أن تعلمه يقترح و يفضل . لنقل أن من بعض مميزاته الاتي : هدفه : حيث أن تعلم سكراتش سيقوم بتبسيط تعاملك مع منطق لغات البرمجة و يجعل ذلك مألوفا بشكل كبير . تعلمه : تعلم سكراتش سهل و ممتع نوعا ما , أي أن طريق تعلمه لن يكون مملا بعض الشيء. يطور مهاراتك : واحدة من أهم أهداف سكراتش هي في تطوير مهاراتك في إدارة المشاريع و تسييرها . يطور منطقك : كما أنه سيساعدك بشكل كبير في تطوير المهارات التحليلية و المنطقية لديك . ممتع و تفاعلي : إستعماله مجاني و ذو واجهة تفاعلية .2 نقاط
-
أحاول إضافة الشهادة وتعديل الاتصال إلى اتصال آمن https، وقمت باتباع الخطوات المذكورة في التوثيق الرسمي ل node.js: var https = require('https'); var fs = require('fs'); var options = { key: fs.readFileSync('test/test-key.pem'), cert: fs.readFileSync('test/test-cert.pem') }; https.createServer(options, function (req, res) { res.writeHead(200); res.end("hi"); }).listen(3000); والآن عندما أقوم بتجربة الرابط من خلال curl مع وضع https:// تظهر لي العبارة " hi " أما عندما أقوم بوضع http يظهر لي الخطأ التالي: curl: (52) Empty reply from server كيف يمكنني إضافة وسيط معيّن لتحويل الاتصال من http إلى https بشكل تلقائي؟2 نقاط
-
يمكنك تحريك الشريط الجانبي للأسفل تماما مباشرة بعد نجاح عملية تحميل أية رسائل جديدة و إضافتها إلى الوثيقة . أي إلى الدالة appendMessage . قد لا نحتاج الدالة getMessages في هاته العملية . أي أننا لا يجب أن نرغم المستخدم أن يكون الشريط الجانبي في أسفله تماما و دوما , و إنما أن يتم عمل التحريك التلقائي للشريط الجانبي بعد كل تضمين لعنصر رسالة جديد , و ذلك لعرضها . أي أن الشيفرة الخاصة بالعملية ستتبع المنطق التالي : const messages = document.getElementById('div_show_message'); function appendMessage() { const message = document.getElementsByClassName('message')[0]; const newMessage = message.cloneNode(true); messages.appendChild(newMessage); scrollToBottom(); } function scrollToBottom() { messages.scrollTop = messages.scrollHeight; } scrollToBottom();2 نقاط
-
السلام عليكم من خلال الكود التالي يمكن تحديث محتوى هذا ال div من خلال ملف خارجي display.php <div id="load_posts"></div> <script> setInterval(function(){ //setInterval() method execute on every interval until called clearInterval() $('#load_posts').load("display.php").fadeIn("slow"); //load() method fetch data from fetch.php page }, 1000); </script> لكن كيف يمكن فعل ذلك إذا كان المحتوى موجود داخل ال div نفسة وليس ملف خارجي ؟؟؟1 نقطة
-
مرحبا صممت لعبة بسيطة عند الضغط على احدى الخلايا تظهر رسالة alert تظهر رقما عشوائيا وهنا وضعت شرت اذا ضغط على احدى الخلايا وكان الناتج اكبر من او يساوي 8 تظهر رسالة انت فزت وان كان اقل تظهر انت خسرت المشكلة انه حتى عندما يكون الناتج اكبر من او يساةي 8 تظهر رسالة انت خاسر اتمنى الاجابة على سؤالي اين الخطأ في شيفرة الجافا سكربت وشكراً جزيلاً <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="css/bootstrap.css"> <style> .container{ background-color: rgb(148, 148, 148); } .col{ background-color: coral; border-bottom: 10px solid rgb(148, 148, 148); border-left: 5px solid rgb(148, 148, 148); } .col:hover{ background-color: white; } </style> </head> <body> <div class="container"> <div class="row"> <div class="col" onclick="ik()"> Column </div> <div class="col" onclick="ik()"> Column </div> <div class="col" onclick="ik()"> Column </div> <div class="col" onclick="ik()"> Column </div> </div> <div class="row"> <div class="col" onclick="ik()"> Column </div> <div class="col" onclick="ik()"> Column </div> <div class="col" onclick="ik()"> Column </div> <div class="col" onclick="ik()"> Column </div> </div> </div> <!--ranking the line code very Important here ... this ranking Important--> <script src="js/jquery-3.5.1.slim.min.js"></script> <script src="js/popper.min.js"></script> <script src="js/bootstrap.js"></script> <script> function ik(){ var y = document.getElementsByClassName("col"); var t = alert("this is column" + "=" + Math.round(Math.random() * 10)); if(y >= 8){ alert("YOU WON"); } else{ alert("YOU LOST"); } } </script> </body> </html> هذا هو الملف index.html1 نقطة
-
1 نقطة
-
مرحباً .. المعذرة إن كان هذا السؤال قد طرح سابقاً عندي آلاف من ملفات الـ Mockup بصيغة psd ممكن أحد المتخصصين أو الخبراء يرشدني لكيفية استخدام ملفات الـ Mockup بصيغة psd على نظام أبنتو (Ubuntu) التشغيلي لا اريد تثبيت Photoshop على جهازي برنامج Gimp و Inkscape مثبتان على الجهاز شكرا لكم1 نقطة
-
لدي مصفوفتان Numpy بسيطتان أحادي البعد one-dimensional. حاولت أن أقوم بربطهم باستخدام التابع numpy.concatenate كالتالي: >>> import numpy as np >>> a = np.array([1, 2, 3]) >>> b = np.array([4, 5]) >>> np.concatenate(a, b) لكنني تلقيت هذا الخطأ التالي: TypeError: only integer scalar arrays can be converted to a scalar index لماذا يظهر هذا الخطأ؟ وكيف يمكنني ربط المصفوفتان معًا؟1 نقطة
-
في الكود البسيط التالي، كلتا الداتين ترجعان نفس النتيجة: >>> import numpy as np >>> y = np.array(((1,2,3),(4,5,6),(7,8,9))) >>> y.flatten() array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> y.ravel() array([1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> ما الفرق بين الدالتين flatten و ravel؟ وفي حالة عدم وجود فرق بينهما، ما هي الحاجة إلى وظيفتين مختلفتين تؤديان نفس الوظيفة؟1 نقطة
-
أعرف ان الصورة عبارة عن مصفوفة كبيرة من القيم التي تعبر عن لون كل بيكسل Pixel، ولدي مصفوفة Numpy تحتوي على قيم تعبر عن ألوان كل بيكسل في الصورة. كيف يمكنني إستخراجها في شكل صورة؟ بأي تنسيق (png ، jpeg ، bmp ...). هل توجد مكتبة جاهزة تقوم بهذا الأمر؟1 نقطة
-
سأعطيك بعض الملاحظات: y هي عبارة عن مصفوفة تحوي جميع العناصر التي لها class يساوي col أي جميع الأسطر لديك للوصول لسطر محدد استخدم محدد المصفوفة [ i ] أي هكذا document.getElementsByClassName("col")[0] أي للوصول للعنصر الذي تم النقر عليه يجب تمرير المعرف ضمن الدالة ()ik عند الاستدعاء <div class="col" onclick="ik(0)"> .. </div> <script> function ik(id) { let element = document.getElementsByClassName("col")[id] } </script> الشرط غير محقق لأنك لا تقارن قيمة عددية مع الرقم 8 حسب الفكرة في الصفحة لا تحتاج y لايمكن تخزين العنصر alert في متغير فهو undefined علينا تخزين القيمة التي يولدها التابع العشوائي في متغير ثم نستعمله نفسه في alert ثم اختبار الشرط <script> function ik() { // var y = document.getElementsByClassName("col"); var t = Math.round(Math.random() * 10) alert('this is column' + '=' + t) if (t >= 8) { alert('YOU WON') } else { alert('YOU LOST') } } </script>1 نقطة
-
أقوم باستخدام إطار العمل express وأرغب بإعادة توجيه المستخدم إلى قالب عدم العثور على الصفحة أو 404. فهل هنالك تابع محدد أو مسار يمكنني استخدامه في express.js لتحقيق ذلك؟1 نقطة
-
يوجد معاملات أساسية مع كل طلب أو مسار في إطار العمل express.js وهما req , res : app.get('/test/:data', function(req, res){ res.send('data: ' + req.params.data); }); ماهي وظيفة هذه المعاملات؟ وهل يمكنني تغيير اسمائها إلى شيء آخر؟ وهل استخدامها معاً ضروري أو يمكن الاستغناء عنها في هذا التابع function ؟1 نقطة
-
بالتأكيد تحتاج الى تعلم هياكل البيانات أو data structure، والاصح في الترتيب هو أن تتعلم data structure اولا ثم تتعلم الخارزميات لانها ستسهلها عليك. كذلك فان تصميم الخوارزميات يتطلب معرفة مسبقة ب data structure وذلك لانك بالتاكيد تحتاجها في التصميم، كمثال اذا اردت تصميم خوارزمية تعتمد على المصفوفات فيجب أن تعرف ماهية المصفوصة وكيف تخزن فيها البيانات وذلك لتتحكم في امكانياتها، وهكذا في كل أنواع البيانات. عندما تكمل تعلمها بدقة سترى الفرق في كيف أن تصميم الخوارزميات أصبح اسهل و أوضح.1 نقطة
-
بمجرد اشتراكك في أي دورة من دورات أكاديمية حسوب، فهذا يعني عمل اتفاق بينك و بين الأكاديمية، وينص الاتفاق على جميع الفقرات و الوعود الموجودة في شروحات الدورات، وهي استرداد قيمة الاستثمار و المتابعة بعد الدورة من قبل مختصي الاكاديمية وغيرها.. أرجو مراجعة ماتقدمه الأكاديمية من شروحات في صفحة كل دورة منها، وهذا ما تلتزم الأكاديمية بتقدمه لطلابها، وبحالة استرداد الأموال، يكفي فتح تذكرة من خلال مركز مساعدة حسوب وسيتم إعادة أموالك، طبعا عليك تقديم التذكرة قبل مرور 6 أشهر على تاريخ تخرجك منها. رابط: مركز مساعدة حسوب1 نقطة
-
السلام عليكم اريد ان اقوم بجلب الاندكس الخاص بال item المعروض هذا هو كودى const [index, setIndex] = useState(0); <FlatList ref={refContainer} data={introScreenData} keyExtractor={(item, index) => item.id.toString()} style={styles.flatList} renderItem={({item, index}) => ( <IntroScreenCard image={item.image} id={item.id} title={item.title} subTitle={item.subTitle} /> واريد ان اقوم بتحيث الاندكس فى كل مرة اقومفيها بعمل scroll1 نقطة
-
يمكنك القيام بذلك بعدة طرق، منها: يمكنك الحصوب عليه حسابيًا عن طريق ال scroll view offset إذا كنت تعرف ال layout الخاص بكل عنصر <FlatList ref={refContainer} data={introScreenData} keyExtractor={(item, index) => item.id.toString()} style={styles.flatList} onScroll={(e)=>{ let offset = e.nativeEvent.contentOffset.y; let index = parseInt(offset / height); // cell هنا هو ارتفاع ال height console.log("now index is " + index) setIndex(index) }} renderItem={({item, index}) => ( <IntroScreenCard image={item.image} id={item.id} title={item.title} subTitle={item.subTitle}) } /> -- لا تنسى طرح ال layout الخاص بال header إذا كان لديك header أو يمكنك استخدام الطريقة التالية: <FlatList ref={refContainer} data={introScreenData} keyExtractor={(item, index) => item.id.toString()} style={styles.flatList} renderItem={({item, index}) => { console.log(index); setIndex(index) return ( <IntroScreenCard image={item.image} id={item.id} title={item.title} subTitle={item.subTitle} ) } } />1 نقطة
-
في دورة تطوير واجهات المستخدم ستتعلم التالي : HTML CSS JAVASCRIPT وبإستخدام هذه اللغات ستتمكن من صنع واجهات المستخدم سؤال قد يدور على بالك ... ماهي واجهات المستخدم ؟ واجهات المستخدم او كما تعرف UI على أنها العناصر المرئية مثل الأزرار والأيقونات وغيرها، والتي تمكن الشخص من التفاعل مع الموقع أو التطبيق. ببساطة، هي أي شيء قد يتفاعل معه المستخدم عند استخدام الموقع وللإجابة على سؤالك هل تكفي دورة تطوير واجهات المستخدم لبناء موقع الكتروني؟ بإختصار لا بناء مواقع الكتروني كامل يحتاج منك ايضاً معرفة بـ Back End وذلك حتى تتمكن للإتصال بالسيرفر وتخزين وقراءة البيانات وهذا ما لا تشمل عليه هذه الدورة لذلك في حال اردت تعلم كيفية بناء موقع كامل فبعد اكمال دورة تطوير واجهات المستخدم ستحتاج ايضاً اخذ واحدة من الدورتين التاليتن : دورة تطوير تطبقات الويب بإستخدام لغة PHP دورة تطوير تطبيقات الويب بإستخدام لغة Ruby1 نقطة
-
req هو كائن يحتوي على معلومات حول طلب HTTP الذي أثار الحدث. استجابة للطلب ، يمكنك استخدام res لإعادة إرسال استجابة HTTP المطلوبة, يمكن تسمية هذه المعلمات بأي شيء. لنفترض انه لدينا هذا المسار app.get('/Hello.json', function(request, response) { }); سيكون المتغير request كائن لديه هذه الخصائص على سبيل المثال: request.url: والذي سيكون "/Hello.json" عند طلب هذا الإجراء المحدد request.method: والذي سيكون "GET" في هذه الحالة ، ومن هنا يأتي استدعاء app.get (). request.headers: مصفوفة من HTTP headers ، تحتوي على عناصر مثل request.headers.accept ، والتي يمكنك استخدامها لتحديد نوع المتصفح الذي قدم الطلب ، ونوع الاستجابات التي يمكنه التعامل معها ، وما إذا كان قادر على فهم ضغط HTTP أم لا ، إلخ. request.query: مصفوفة من معاملات سلسلة طلب البحث ، إن وجدت, على سبيل المثال /Hello.json?foo=bar request.query.foo يحتوي على السلسلة "bar". للرد على هذا الطلب ، يمكنك استخدام كائن response لبناء ردك كالمثال الآتي app.get('/Hello.json', function(request, response) { response.contentType('application/json'); var users = [ { name: 'Mohammed', age: '20' }, { name: 'Ali', age: '19' }, { name: 'Sami', age: '18' } ]; var usersJSON = JSON.stringify(users); response.send(usersJSON); });1 نقطة
-
يمكنك بشكل افتراضي تعريف الاتصال على أنه http بدلاً من https ثم تنفيذ إعادة التوجيه إلى https عند زيارة أي مسار ضمن التطبيق فتصبح بالشكل التالي: var http = express(); http.get('*', function(req, res) { res.redirect('https://' + req.headers.host + req.url); }) http.listen(3000); أو يمكنك بدلاً من الحصول على اسم النطاق والمسار بشكل ديناميكي ضمن الكود، كتابته بشكل يدوي كالتالي: res.redirect('https://test.com' + req.url); وعندها قد ترغب بإضافة الحماية اللازمة لمنع سرقة ملفات تعريف الارتباط أثناء اتصال http مع الخادم، فيمكنك إضافة التالي إلى الكود لديك: const session = require('cookie-session'); app.use( session({ secret: "secretSession", httpOnly: true, secure: true }) ); وعندها سيتم منع المتصفح من الوصول إلى ملفات تعريف الارتباط، وسيتم إرسالها فقط عند اتصال من نوع https لأننا وضعنا قيمة secure: true كما يوجد طريقة أخرى مختصرة يمكنك تنفيذها من خلال استخدام الوسيط trust proxy بالشكل التالي: app.enable('trust proxy') app.use((req, res, next) => { req.secure ? next() : res.redirect('https://' + req.headers.host + req.url) }) فيتم اختبار في حال كان الاتصال آمن سيتم تخديم المسارات وإلا سيتم التحويل إلى https ببساطة.1 نقطة
-
تتم إضافة المسار التالي في الأسفل بعد كتابة جميع المسارات الموجودة في مشروعك، وفي حال تمت زيارة مسار غير موجود يتم الدخول إلى هذا المسار ومعالجة الخطأ 404: app.get('*', function(req, res){ res.status(404).send('not found'); }); أما من ناحية إرسال الخطأ، فيوجد عدة طرق وهي كالتالي: app.use(function(req, res, next) { res.status(404); // الرد بإرسال صفحة HTML if (req.accepts('html')) { res.render('404', { url: req.url }); return; } // إرسال الرد بصيغة JSON if (req.accepts('json')) { res.json({ error: 'Not found' }); return; } // إرسال الرد بصيغة نصية res.type('txt').send('Not found'); }); أما في حال أردت إرسال الخطأ 404 بعد معالجة معيّنة ضمن تابع ما أو متحكّم خاص، يمكنك إرسال الخطأ مباشرةً ضمن التابع من خلال: res.status(404).send('not found') وعندها يمكنك استقبال هذا الخطأ من طرف المستخدم وتنفيذ إعادة التوجيه من طرف المستخدم بدلاً من الخادم.1 نقطة
-
يجب عليك أولا تحديد جميع المسارات الخاصة بالمشروع وفي النهاية تضيف المسار 404 كالتالي app.get('*', function(req, res){ res.status(404).send('404'); }); على سبيل المثال var express = require('express'), app = express.createServer(); app.use(express.static(__dirname + '/public')); app.get('/', function(req, res){ res.send('hello world'); }); app.get('*', function(req, res){ res.send('404', 404); }); app.listen(3000, '127.0.0.1');1 نقطة
-
كل الأدوات المساعدة حاليا لها قبول وطلب كبير من كبرى الشركات كل مع عليك فعله هو الاختيار ومراعاة بعض العوامل لتسهيل رحلتك من بينها : 1- اذا كان لديك علم ب لغة البرمجة dart ستكون رحلتك في تعلم flutter سهلة بعض الشيء خصوصا وان القائم على تطويره العملاق google ولدى flutter بالفعل مجتمع كبير على الانترنت من المطورين الموهوبين وأيضا ازدياد الاقبال على تطوير التطبيقات بواسطته 2- اذا كان لديك علم ب JavaScript ستكون رحلتك في تعلم React-native سهلة بعض الشيء خاصة اذا كنت قد استخدمت مكتبة React لتطبيقات الويب من قبل خصوصا وان القائم على تطويره العملاق Facebook ولدى React-native بالفعل مجتمع كبير جدا على الانترنت من المطورين الموهوبين كما ان من بين اكثر التطبيقات شهرة تستخدمه مثل Discord و skype والعديد ... 3-ايونك نفس شيء ينطبق على مدى علمك ب JavaScript لقد زاد اقبال الشركات على التطبيقات الهايبرد وصار لها قبول وطلب في السوق خاصة وان بعض الشركات الكبرى تستعمل تطبيقات هايبر 4- خيار التطوير native يبقى الاختيار الأكثر طلبا على ما يبدو والانسب لقدرة وكفاءة التطبيقات المطورة باستخدامه مشكلته الوحيدة انك يستهلك الوقت وسيتعين انشاء تطبيق بلغة لأنظمة Android واخر بلغة لأنظمة IOS اللغات البرمجية المستخدمة لتطوير تطبيقات Android native هي Kotlin و java اللغات البرمجية المستخدمة لتطوير تطبيقات IOS native هي swift و Objective-C1 نقطة
-
إذا كان هناك مصفوفة ثنائية البعد مثلاً أو أكثر يجب استخدام دالة لتحويلها ل مصفوفة أحادية البعد وكما في التعليقات السابقة تم استخدام الدالة flatten ولكن يمكننا استخدام الدالة ravel حيث تعتبر اسرع من الدالة flatten وترجع reference من المصفوفة الأصلية لذلك سيكون الحل كالتالي import numpy lst = [[1,2,3], [4,5,6]] newArray = numpy.array(lst) newArray.ravel().tolist()1 نقطة
-
تستخدم الدالة tolist من اجل تحويل المصفوفة في هيئة numpy الي list، انظر المثال التالي لتحويل مصفوفة احادية الي list: a = np.uint32([1, 2]) a_list = list(a) a_list >>[1, 2] type(a_list[0]) >><class 'numpy.uint32'> a_tolist = a.tolist() a_tolist >>[1, 2] type(a_tolist[0]) >><class 'int'> كذلك تستخدم tolist لتحويل مصفوفات ثناية الأبعاد مثل المثال التالي: a = np.array([[1, 2], [3, 4]]) list(a) >> [array([1, 2]), array([3, 4])] a.tolist() >> [[1, 2], [3, 4]]1 نقطة
-
يمكن استخدام الدالة tolist لتحويل مصفوفة numpy إلى list : np.array([[1,2,3],[1,2,3]]).tolist() => [[1, 2, 3], [1, 2, 3]] أو استخدم flatten : list(a.flatten()) هذه الدالة تحول المصفوفة لمصفوفة من بعد واحد، ما يسمح بتحويلها لقائمة مباشرة1 نقطة
-
تعرف ال matrix والتي جمعها matrices على انها المصفوفة ثنائية الأبعاد، والتي التي تحتوي على صفوف وأعمدة فقط، أنظر المثال التالي: >>> import numpy as np >>> a = np.array([[2,3], [4,5]]) >>> >>> y = np.asmatrix(a) >>> >>> a[0,0] = 5 >>> >>> y matrix([[5, 3], [4, 5]]) أما عن np.array فهي شكل اكثر شمولا عن np.mat، حيث أنها لا تقف فقط عند المصفوفات ثنائية الأبعاد وانما تدعم كل ألابعاد N-dimensional. np.array([[1, 2], [3, 4]]) array([[1, 2], [3, 4]]) كما انها أسهل في التعامل وتوفر أمكانيات اكثر للتعامل مع المصفوفات، في الكود التالي بعض العمليات التي توفرها numpy.array import numpy # Two matrices are initialized by value x = numpy.array([[1, 2], [4, 5]]) y = numpy.array([[7, 8], [9, 10]]) # جمع مصفوفتين print ("Addition of two matrices: ") print (numpy.add(x,y)) # subtract()طرح مصفوفتين print ("Subtraction of two matrices : ") print (numpy.subtract(x,y)) # divide()قسمة مصفوفتين print ("Matrix Division : ") print (numpy.divide(x,y)) print ("Multiplication of two matrices: ") print (numpy.multiply(x,y)) print ("The product of two matrices : ") print (numpy.dot(x,y)) print ("square root is : ") print (numpy.sqrt(x)) print ("The summation of elements : ") print (numpy.sum(y)) print ("The column wise summation : ") print (numpy.sum(y,axis=0)) print ("The row wise summation: ") print (numpy.sum(y,axis=1)) # using "T" عكس المصفوفة print ("Matrix transposition : ") print (x.T) ويكون الخرج كالتالي: Addition of two matrices: [[ 8 10] [13 15]] Subtraction of two matrices : [[-6 -6] [-5 -5]] Matrix Division : [[0.14285714 0.25 ] [0.44444444 0.5 ]] Multiplication of two matrices: [[ 7 16] [36 50]] The product of two matrices : [[25 28] [73 82]] square root is : [[1. 1.41421356] [2. 2.23606798]] The summation of elements : 34 The column wise summation : [16 18] The row wise summation: [15 19] Matrix transposition : [[1 4] [2 5]]1 نقطة
-
بالنسبة لسؤالك فإنه ينقسم الي جزئين أساسين: اذا أردت طباعة المصفوفة بدون فواصل، فهناك حلان: الاول أن تقوم فقط باستخدام أمر print دون أي شئ أخر، وذلك لانه هناك اختلاف بين شكل المصفوفة المخزنه في الذاكرة والتي تظهر عند استدعائها باستخدام كتابة اسمها كما في المثال التالي: a = np.random.random(10) >>> a array([0.71244268, 0.65202232, 0.45514279, 0.12868502, 0.86755307, 0.54365432, 0.76884071, 0.37287693, 0.10350725, 0.66008725]) وذلك لانه يقوم بطباعتها بالشكل المخزن في الذاكرة،أما اذا اردت طباعتها من دون فواصل، فقط أستخدم print كالتالي: a = np.random.random(10) >>> print(a) array([0.71244268 0.65202232 0.45514279 0.12868502 0.86755307 0.54365432 0.76884071 0.37287693 0.10350725 0.66008725]) الطريقة الثانية هي استخدام الامر print مع اعطاءه بعض الخصائص الاضافية كالتالي: print(*data, sep='') حيث أن sep يوضع بعدها الشكل الذي تريد أن تقوم بفصل العناصر به، فهنا وضعنا علامات تنصيص بينها فارغ أي أنه الفواصل بين عناصر المصفوفة هي الفراغ space. بالنسبة للتحكم بدقة الاخراج أو الدقة، فيمكنك تحديد عدد الارقام العشرية التي تريد ظهورها عن طريق: np.set_printoptions(precision=2) حيث أن الرقم بعد precision يوضح عددالاربام العشرية التي تريد ظهورها في النواتج.1 نقطة
-
تكون Numpy matrices ثنائية الأبعاد حصراً، بينما تكون المصفوفات المعقدة (ndarrays) أي ذات N أبعاد. وكائنات Matrix هي صف فرعي من ndarray ، لذلك فهي ترث جميع ال attributes والتوابع من ndarrays. إن الميزة الرئيسية ل Numpy matrices أنها توفر طريقة مريحة لضرب المصفوفات، أما بالنسبة لمصفوفات نمباي فإنه بدءاً من Python 3.5 أصبحت نمباي تدعم ضرب المصفوفات بطريقة مريحة عن طريق استخدام المعامل "@"، انظر: import numpy as np x = np.mat('2 2; 0 3') print(x) """ [[2 2] [0 3]] """ y = np.mat('4 1; 4 2') print(y) """ [[4 1] [4 2]] """ print(x*y) """ [[16 6] [12 6]] """ #ndarray استخدام نمباي import numpy as np x = np.array([[2,2], [0 ,3]]) print(x) """ [[2 2] [0 3]] """ y = np.array([[4, 1], [4, 2]]) print(y) """ [[4 1] [4 2]] """ print(x@y) # print(np.dot(x,y)) أو """ [[16 6] [12 6]] """ أيضاً كلاهما يدعمان العامل .T لحساب منقول المصفوفة "transpose" لكن كائنات mat لديها ميزات إضافية مثل حساب معكوس مصفوفة وال Conjugate transpose, x = np.array([[2,2], [0 ,3]]) a = np.mat('4 3; 2 1') print(x.T) print(a.T) print(a.H) #mat خاصة ب # Conjugate transpose print(a.I) #mat خاصة ب # inverse """ [[2 0] [2 3]] [[4 2] [3 1]] [[4 2] [3 1]] [[-0.5 1.5] [ 1. -2. ]] """ ومن ناحية استخدام العامل ** : # nd a = np.array([[4, 3], [2, 1]]) c = np.array([[4, 3], [2, 1]]) print(a@b) """[[13 20] [ 5 8]]""" print(a**2) """[[16 9] [ 4 1]]""" print(c**2) """ [[16 9] [ 4 1]] """ #matrix a = np.mat('4 3; 2 1') a**a """ [[16 9] [ 4 1]] """ هناك توابع أخرى مثل np.ravel لكنها غير مهمة. الميزة الرئيسية للمصفوفات matrix هي أنها أكثر عمومية من المصفوفات ثنائية الأبعاد. لكن عليك استخدام ndarray في حالة كانت البيانات ثلاثية الأبعاد أو أكثر، وليس كائن matrix.وطبعاً قد يكون المزج بينهما خلال بناء الكود فكرة سيئة أو متعبة لأنه يجب عليك ملاحقة المتغيرات والتدقيق منهم لكي لايعيد لك ناتج الضرب نتيجة غير متوقعة. وبشكل عام يمكنك الاعتماد كلياً على ndarray لكنك ستفقد بعض التوابع أو ال notation الموجودة في mat وغير الموجودة في nd. وأخيراً يمكنك التحويل بينهما من خلال np.asarray و np.asmatrix: # ndarrays a = np.array([[4, 3], [2, 1]]) np.asmatrix (a) """ matrix([[4, 3], [2, 1]]) """1 نقطة
-
انظر ببساطة: array = np.random.random(11) print(array) """ [0.68454984 0.29564049 0.43585867 0.08240091 0.64254513 0.6644243 0.19431044 0.8343987 0.80227567 0.3568269 0.73074224] """ # أما array = np.random.random(11) array """ array([0.68454984, 0.29564049, 0.43585867, 0.08240091, 0.64254513, 0.6644243 , 0.19431044, 0.8343987 , 0.80227567, 0.3568269 , 0.73074224]) """ أي عندما نستخدم التعليمة print سيظهر الخرج كما تريده، أما يالنسبة للتحكم بدقة الإخراج لل floatting point فيمكنك استخدام set_printoptions واستخدام الوسيطة precision وتحديد العدد الذي تريد إظهاره: import numpy as np array = np.random.random(11) print(array) """ [0.44945536 0.56544673 0.82679165 0.41418793 0.465158 0.34722955 0.75272122 0.01321709 0.24561376 0.86812281 0.761384 ] """ np.set_printoptions(precision=3) print(array) """ [0.449 0.565 0.827 0.414 0.465 0.347 0.753 0.013 0.246 0.868 0.761] """1 نقطة
-
لطباعة مصفوفة بدون الفواصل، استخدم الطريقة التالية: data = [7, 7, 7, 7] print(*data, sep='') حيث أن المعامل sep هو الفاصل بين مخرجات الطباعة. وإن استخدمت قائمة في بايثون، يمكن استخدام: print(str(listData).strip('[]').replace('\'', '')) حيث نتخلص من الأقواس و الفواصل.1 نقطة
-
حسب التوثيق الرسمي، سيتم حذف matrices في الإصدارات التالية من Numpy : الرابط: numpy.matrix.html بالأصل، matrices محدودة كمصفوفة ثنائية الأبعاد 2-dimensional، أما array فهي تدعم مصفوفات متعددة الأبعاد N-dimensional.. كانت أفضلية np.mat هي في تحقيق جداء المصفوفات، ولكنه أصبح متاحا بعد تحديث python +3.5 و numpy +1.10 حيث أصبح يمكن عمل جداء مصفوفات باستخدم A @ B a = np.array([[4, 3], [2, 1]]) b = np.array([[1, 2], [3, 4]]) print(a@b)1 نقطة
-
توجد وظيفة جديدة في الساحة التقنية، قد لا تكون جديدةً بالمعنى الحرفي للكلمة، ولكنها بالتأكيد تظهر بوتيرة متزايدة، فالعديد من عمالقة التقنية، مثل: Google، وAmazon، وDropbox، وPaypal، يبحثون عن كُتّاب لتجربة المستخدِم UX Writers. قد يبدو الأمر وكأنه صيحة عابرة هادئة لاضجيج لها، لكن كُتّاب تجربة المستخدِم سيكونون جزءًا مهمًا من الأسلوب الذي نصمم به تجارب المستخدِم من الآن فصاعدًا. أحب متابعة إعلانات الوظائف التي تطلبها الشركات في مدينتي، فقط لأرى ما هي الأولوية التي تعطيها شركات التقنية الكبرى. ففي عام 2016، رأيت عددًا كبيرًا من الإعلانات من شركات، مثل: Amazon، وGoogle، وبعض الشركات الأصغر حجمًا في عالم التقنية، وكلها تبحث عن كُتّاب لتجربة المستخدِم. كوني كاتبًا صادف مجال الكتابة لتجربة المستخدِم منذ عدة سنوات، فقد كنت متحمسًا لأن المؤسسات والشركات قد أخيرًا أدركت أن الكتابة التسويقية لا يجب أن تكون حكرًا فقط على أخصائي التسويق. لقد مرت بفكري كل الكتابة الخاصة بواجهة المستخدِم والدعوة إلى الإجراء -وهو أسلوب تسويقي على الويب يهدف إلى دعوة المستخدِم لإتمام فعل تسويقي معيّن-، وكل المقاطع النصية الصغيرة التي عملت عليها على مرّ السنين مع العديد من الفُرق والأشخاص، كل ذلك جعلني أشعر بالرضا لأن زمن كُتّاب تجربة المستخدم قد حان. لكن بعد ذلك أدركت أنّ كتابة تجربة المستخدم هي أكثر من مجرد كتابة، إذ أن واقع تصميم تجربة المستخدم اليوم هو أنّ تجاربنا مع التقنية أصبحت أكثر اندماجًا مع حياتنا بسلاسة أكثر. فاليوم يمكنك التحدث إلى الآلات لطلب البقالة -على الأقل حيث أعيش بسياتل أمريكا-. حيث نطلب من روبوت مبرمَج على الهاتف التحقق من أرصدة حساباتنا البنكية، كما يمكننا تشغيل لعبة فيديو عن طريق الطلب من XBox. وفي الواقع الافتراضي Virtual Reality حيث لا يمكننا لمس أي شيء، فيمكن لأصواتنا أن تفعل ما قد لا تستطيع أيدينا القيام به. هناك قدر متزايد من التداخل بين واجهات المستخدم الرسومية GUI وواجهات المستخدم الصوتية VUI، مما يستلزم مجموعة مهارات جديدة، مثل تمتُّع محترفي تجربة المستخدِم بفهم عميق للتصميم المحكي Narrative design، والتصميم التخاطبي Conversational design. دعنا نلقي نظرةً على ماهية الكتابة لتجربة المستخدِم (وما هي ليست كذلك)، وما الذي تبحث عنه الشركات في هؤلاء الكُتّاب، وأفضل الممارسات العامة في هذا المجال. ما هي الكتابة لتجربة المستخدم؟ لقد أمضيت الأشهر القليلة الماضية أشعر بفضول عميق حول هذا الدور الناشئ لكاتب تجربة المستخدِم؛ لقد كنت أجمع توصيفات وظيفية، وأجري مقابلات مع كتّاب حاليين لتجربة المستخدم، في محاولة فهمها وأنا سعيد بما تعلمت. استنادًا إلى بحثي حول التوصيفات الوظيفية وحديثي مع كُتاب تجربة المستخدم الذين يعملون في الميدان، فقد وجدت أنّ كتابة تجربة المستخدم هي -في أبسط صورها- عملية الكتابة عن نقاط التواصل التي تَظهر للمستخدِم ليتفاعل مع التقنية التي يستخدمها. بحيث لا تمثل هذه الكتابة صوت الشركة الصانعة فحسب، بل يجب أيضًا أن تكون مراعيةً ومفيدةً للمستخدم. في الماضي، على سبيل المثال، قرر أحد كُتّاب تجربة المستخدم الجيدين -الذي لم يكن عمله الأساسي كاتبًا لتجربة مستخدم، بل ربما كان ماهرًا في الأمر فحسب- أنه عندما يرسل المستخدم رسالةً إخباريةً جماعية باستخدام بريد MailChimp وهو البريد الإلكتروني الخاص بالتسويق، فمن المحتمل أن يكون في حالة من القلق البسيط من إمكانية عدم نجاح الأمر. ولجعل المستخدمين يشعرون بالثقة بشأن نجاح عملية الإرسال، فقد صمم فريق MailChimp رسالة نجاح تُهنئ المستخدم بنجاح إرسال ما أرسله للتو بدلًا من مجرد الإبلاغ عن حالة الارسال التقليدية. بعد البحث في بضع عشرات من التوصيفات الوظيفية لمنصب كاتب تجربة المستخدم، فستكون ثمة بعض المسؤوليات المشتركة فيما بينها بالتأكيد، ومنها: البحث يبدو أن كُتّاب تجربة المستخدم هم أعضاء بارزون في فريق تصميم تجربة المستخدم في جميع المجالات، ومن المتوقع أن يُجْروا أو يشاركوا في الأبحاث المتعلقة بالمستخدم والجمهور، على أساس جزء من عملية التصميم التي تركز على المستخدم. في ما يلي مثال من وصف وظيفي لأحد الشركات التقنية: الكتابة طبعا لا ينبغي أن يكون هذا مفاجئًا، لكن الكتابة أمر أساسي جدًا لعمل كاتب تجربة المستخدم، ونحن لا نقصد عندما تقول عن نفسك "يقول لي الناس إنني كاتب جيد جدًا". نحن نقصد عندما تقول "يخبرني الناس أنني كاتب عظيم، ويمكنني شرح كل كلمة من اختياراتي وأدافع عنها حتى الموت". تشير جوجل إلى فريق كُتاب تجربة المستخدم الخاص بها باسم "صانعو الكلمات المناوبون" نسبةً إلى الأطباء المناوبين في المشافي. وإليك مثال عن التوصيف الوظيفي لكاتب تجربة المستخدم في إعلانات أمازون: التعاون لست متأكدًا من أنني سأعد هذا الأمر مهمًا جدًا لهذا العمل، ولكن معظم التوصيفات الوظيفية تستدعي التعاون بين الفرق كونه مسؤوليةً مهمةً في كتابة تجربة المستخدِم. من المحتمل ألا يكون هذا الأمر مفاجئًا لأي شخص عمل مثل كاتب مخضرم في أي مجال كان، لكن بالنسبة لي أعتقد أنّ لكل شخص رأي في الكلمات التي يكتبها. وفيما يلي مثال من إحدى إعلانات التوظيف: هناك أيضًا بعض المسؤوليات التي قد تظهر فجأةً هنا وهناك، ولكنها من غير المتوقع أن تواجهها دائمًا، وهي تشمل ما يأتي: بناء وتنفيذ استراتيجية التحرير. بناء وتنفيذ استراتيجية المحتوى. أن تكتب كتابةً تسويقية. كتابة مواد تدريبية سهلة الاستخدام. من خلال جميع التوصيفات الوظيفية التي درستها، يبدو أنّ هذه المسؤوليات الأخرى غير المرتبطة بمهام كاتب تجربة المستخدِم تظهر لعدد من الأسباب. وقد يكون أحد هذه الأسباب هو أنّ الشركات لا تستطيع تبرير توظيف شخص يكتب عن واجهة المستخدم فقط، وتبحث بدلًا من ذلك عن فريق متعدِّد الوظائف ليمكنها من خلاله ضرب عصفورين بحجر واحد، إذا جاز التعبير؛ في حين قد يكون السبب الآخر هو الافتقار إلى فهم المهارات التي تنطوي عليها الكتابة بالموازنة مع استراتيجية المحتوى، والكتابة موازنةً مع الخبرة التحريرية، وما إلى ذلك. وفي كلتا الحالتين، فمن الواضح أنه من الأفضل أن تكون متعدِّد المهارات لتنال فرصةً في التوظيف. من المهم أيضًا التفريق بين كتّاب تجربة المستخدم وبين الكتاب الآخرين. وبما أنه لا يوجد الكثير من التدريبات الأكاديمية لتعلم كتابة تجربة المستخدم، فمن المحتمل أن يكون كاتب تجربة المستخدم الجيد متعدد الوظائف. ومع ذلك، فلا ينبغي الخلط بين مهام كاتب تجربة المستخدِم والمهام التالية: الكاتب التقني: الذي يكتب عن التقنية بهدف التوضيح والتدقيق، وليس بهدف الكتابة عن التجربة. اخصائي استراتيجية المحتوى: الذي يخطط للمحتوى على نطاق واسع، وليس بالضرورة من يكتبه. مهندس المعلومات: الذي يركز على هياكل وتصنيفات المعلومات المستدامة، ويبنيها. أخصائي التسويق: الذي يركز على الاستراتيجيات والحملات التي تهدف إلى جذب أشخاص جدد إلى منتج أو خدمة ما. ما الذي تبحث عنه الشركات في كتاب تجربة المستخدم؟ حسنًا، نحن الآن نعرف مهام كُتّاب تجربة المستخدم، ولماذا سيصبح هذا الدور مهمًا باستمرار. دعنا نلقي نظرةً على بعض الصفات الشاملة التي تبحث عنها الشركات في كُتّاب تجربة المستخدم الطموحين. مستوى تعليمي في مجالات التواصل يُعَدّ هذا الأمر تقريبًا مطلبًا عالميًا. حيث تبحث الشركات التي توظف كُتّاب تجربة المستخدم عن أشخاص تلقوا تدريبًا رسميًا في الصحافة، والكتابة الفنية، والكتابة الإبداعية، وفن التواصل، والعلاقات العامة، بمعنى أي شيء يتعلق على نحو مباشر بالكتابة.يُعَدّ هذا تحولًا مثيرًا للاهتمام بالنسبة لمصممي تجربة المستخدم التقليديين، حيث يُتوقع منهم فهمًا بديهيًا لكيفية تصميم التواصل الفعال بدلاً من تصميم واجهات المستخدم وحسب. لقد قابلت مجموعةً من كتّاب تجربة المستخدم على مدار العام الماضي، وكان لديهم إما خلفية تحريرية خاصة، مثل امرأة التقيت بها سابقًا كانت تعمل محررة علوم لـدى موسوعة مايكروسوفت الشهيرة Microsoft Encarta؛ أو خلفية صحفية مثل أحد الكُتّاب لدى Google UX، والذي كان صحفيًا تقنيًا فيما سبق. قدرات كتابية مذهلة وإثبات ذلك تبحث الشركات التي تُجري المقابلات لتوظيف كاتب تجربة المستخدِم عن الكُتاب الذين يمكنهم شرح اختياراتهم كما يفعل المصممون عند عملهم؛ أي إذا اختار الكاتب كلمةً ما في كتابته، فيجب أن يكون قادرًا على تبرير اختياره، بحيث يدعم ذلك بالأبحاث عن سبب كون هذه الكلمة اختيارًا أفضل من الأخرى. سأستخدم رسالة نجاح عملية الإرسال في خدمة MailChimp مثالًا لذلك، ربما سُئل هذا الكاتب في وقت ما، "لماذا استخدمت تعبير High five - كفك!"، وهو تعبير يعبِّر عن الاحتفال عوضًا عن "رسالتك الإخبارية في طريقها"؟ وربما أجاب هذا الكاتب بشيء ،مثل: "حسنًا، لأنه في بحثنا المتعلِّق بالمستخدم، اكتشفنا أن المستخدِمين غالبًا ما يكونون قلقين بدرجة معتدلة وغير متأكدين مما أرسلوه للتو، وبالنظر إلى أسلوب عملنا في شبكات التواصل الاجتماعي، فإن تعبير High five هو أكثر ملاءمةً لجعلهم يشعرون بمزيد من الثقة فيما أنجزوه للتو". هذا مثال افتراضي، لكنه يوضِّح وجهة نظري. أي إذا أجرى كاتب تجربة المستخدم مقابلة توظيف مع شركة ما، فيجب أن يتوقع أن يُطلب منه بصورة صريحة تبرير اختياراته للكلمات والتعابير التي استخدمها، سواءً كانت في مقطع نصي طويل، أو كلمة واحدة في شريط الانتقال. المرونة وروح المبادرة يُعَدّ عمل كاتب تجربة المستخدِم أمرًا حديثًا، وربما لم توضحه العديد من الشركات حتى الآن. وهو الأمر الذي يدفعنا إلى قول أنه يتعين على كتّاب تجربة المستخدم التحلي بالشجاعة، والعمل بطريقة متكيفة في بيئة رشيقة، وربما قد يتعين عليهم تحديد مسؤوليات أدوارهم بأنفسهم، وإنجاز مهام متعددة الوظائف قد لا ترتبط بصورة وثيقة بمجالهم، مثل: إنشاء مخطط شبكي Wireframe لموقع ويب ما، أو تطوير إرشادات صوتية، أو تخطيط استراتيجيات التحرير، وعليهم أن يفعلوا ذلك على نحو فعّال. بعبارة أخرى، يسير كتّاب تجربة المستخدم في بيئة لا يوجد فيها شيء مؤكد، لذلك يتعين عليهم أن يكونوا قادرين على أداء وظائفهم على نحو جيد، مع دفاعهم عن أهمية دورهم في عملية تصميم تجربة المستخدم. ترجمة وبتصرّف للمقال ?What is UX Writing لصاحبته Kristina Bjoran.1 نقطة
-
أصبحت واجهات REST البرمجية أكثر انتشارًا بين المطوّرين، نظرًا لأنها توفّر واجهة بسيطة، موحّدة وواضحة لخدمات الطرف الثالث third-party مثل Twitter، MailChimp وGitHub. ومع ازدياد شهرة واجهة ووردبريس البرمجية (المتوفرة عبر إضافة) فإن الوقت قد حان لنتعلم حول واجهة HTTP البرمجية في ووردبريس، وكيفية عملها واستخداماتها. ما هي واجهة HTTP في ووردبريس؟ لن يكون من المستغرب القول بأنها طريقة لإرسال واستقبال الرسائل بواسطة HTTP – لغة شبكة الويب. حيث يقوم المتصفح بإرسال واستقبال الرسائل طوال الوقت وبهذا الشكل يتم استقبال صفحات الويب. ويمكن من خلال واجهة REST البرمجية، يمكن باستخدام رسائل HTTP القيام بأشياء أكثر كتعديل منشور، حذف حساب مستخدم أو نشر وصفة جديدة على موقعك. لهذا السبب تعتبر واجهة ووردبريس البرمجية مهمة جدًا، فهي تسمح بفصل التطبيق من جهة المستخدم عن النواة البرمجية الخاصة بووردبريس. ولاستخدامها، تحتاج أن تكون معتادًا على إرسال طلبات HTTP واستقبال الأجوبة، وهذا هو أساس عمل واجهة HTTP البرمجية. وهناك العديد من الطرق لإرسال طلبات HTTP، حيث توفّر واجهة HTTP البرمجية طريقة موحّدة باستخدام مجموعة من التوابع المساعدة والتي سنطّلع عليها بعد قليل. طرق HTTP ومصادرها ترتكز HTTP حول الطرق methods (تسمّى أحيانًا بالأفعال verbs) والمصادر resources. تحدّد المصادر العنصر الذي سيتم تنفيذ العملية عليه، وتحدّد الطريقة نوع العملية التي سيتم تنفيذها. ويعتبر العنوان URL هو المصدر الذي يشير إلى الغرض على شبكة الويب، كمنشور على سبيل المثال. وتوجد العديد من الطرق، لكن الأهم فيها هي GET, POST, PUT و DELETE. ولا بد أن لديك الكثير من الخبرة مع GET فهذه الطريقة هي المستخدمة في الحصول على المصادر، فمثلًا عند استعراض مقال في المتصفح يتم إرسال طلب GET إلى عنوان المقال وليكن مثلًا https://premium.wpmudev.org/blog/using-the-wordpress-http-api/. أما طلبات PUT فتستخدم لتعديل المصادر، وتستخدم طلبات POST لإنشاء مصادر جديدة، وتستخدم طلبات DELETE لحذف مصادر موجودة مسبقًا. ولو كان لدى موقع WPMU DEV واجهة REST برمجية، فربما كان من الممكن أن يقوم المدير بإرسال طلب DELETE لحذف المقال على الرابط https://premium.wpmudev.org/blog/wordpress-http-api، وهذا الأمر مفيد جدًا للمواقع الكبيرة التي تملك برامج إدارة على الهواتف الذكية. مثال عن طلب HTTP بسيط للقيام بإرسال طلب GET بسيط على سبيل التجربة، سنقوم باستخدام التابع wp_remote_get() الذي يملك مُعاملين، المُعامل الأول هو رابط المصدر، والمُعامل الثاني هو مصفوفة اختيارية optional من الخيارات التي من الممكن استخدامها لتحديد بعض التفاصيل. $test = wp_remote_get( 'http://google.com' ); echo "<pre>"; var_dump($test); echo "</pre>"; يقوم المثال السابق بجلب الصفحة الرئيسية لموقع جوجل، ومن ثم يتم طباعة محتوى المتغير test الذي يحوي على جواب الطلب الذي أرسله موقع جوجل – حيث يمكن رؤية جميع العناصر التي يحتويها. تحتوي الترويسات headers على المزيد من المعلومات عن كل رسالة. وقد تطلب منك بعض واجهات REST البرمجية أن تقوم بإرسال معلومات محددة في الترويسات عندما ترسل الطلب. يحتوي الجواب response على رمز الحالة status code وعبارة قد تكون معروفة بالنسبة لك كأخطاء 404، أو خطأ في معالجة الطلب 500 أو تحويل من النوع 301 أو 302. يحتوي موقع W3.org على جميع رموز أخطاء HTTP المعرّفة والمشروحة، ويعتبر مصدرًا مفيدًا إن احتجت أن تعرف ما يعني أي خطأ. بإمكانك أيضا الاطّلاع على هذا المقال على أكاديمية حسوب لتعرف المزيد حول هذه الرّموز: رموز الإجابة في HTTP يحتوي الجسم body على الجواب وهو المكان الذي تحتاج أن تنظر إليه بحثًا عن النتيجة المطلوبة. في حالة المثال السابق، فإننا نحصل على وسوم HTML التي تشكّل الصفحة الرئيسية، ولكن عند التعامل مع واجهات REST البرمجية فمن الشائع أن نحصل على نص بصيغة JSON. وعادة ما تطلب الواجهات البرمجية APIs أن يتم إضافة نص محدّد إلى الجسم عند إرسال طلبات أيضًا. يحتوي قسم cookies على أي كعكات تم استلامها مع الرسالة. كما ترى، فإن إرسال طلب باستخدام واجهة HTTP البرمجية أمر بسيط جدًا. ما يجعل العمل مع HTTP معقّد نوعًا ما هو أن واجهات REST البرمجية قد تكون حساسة جدًا لصيغة البيانات المدخلة (وهو أمر جيّد) لذا فإن تجاوزت سطرًا عند دراسة توثيق الواجهة البرمجية قد ينتهي بك الأمر ببرمجية لا تعمل كما ترغب. العمل مع الواجهات البرمجية أعتقد بأنه من الآمن القول بأن معظمكم سيستخدم HTTP للتعامل مع واجهات REST البرمجية في شبكة الويب، وفي هذه الحالة سنحتاج لاستخدام المعامل الثاني لتحديد بعض الأمور، كالاستيثاق وتجنب بعض الأخطاء الشائعة. لنبدأ بمثال بسيط – استعادة البيانات من لوحة Pinterest. تتطلب جميع الواجهات البرمجية الجيّدة تنفيذ عملية استيثاق للتعريف عن المستخدم الذي يرسل الطلب، لكنّنا سنغش قليلًا في هذا المثال باستخدام مولّد رموز الأمان الخاص بـ Pinterest. بعد إكمال الاستيثاق ستحصل على رمز أمان يمكن استخدامه في المثال التالي، حيث سنقوم بإنشاء طلب لجلب وعرض قائمة بمنشورات Pinterest. $request = wp_remote_get( 'https://api.pinterest.com/v1/boards/marticz/home-office/pins/?access_token=<your access token>' ); $pins = json_decode( $request['body'], true ); if( !empty( $pins['data'] ) ) { echo '<ul>'; foreach( $pins['data'] as $pin ) { echo '<li><a href="' . $pin['url'] . '">' . $pin['note']. '</a></li>'; } echo '</ul>'; } لو قمنا بنسخ المثال السابق ولصقه في صفحة content-page.php في قالب Twenty Fifteen لتجربته فإن النتيجة هو الحصول على لائحة بالمنشورات من لوحة Pinterest حول المكاتب الشخصية في المنزل. لا تنس أن تستبدل <your access token> في المثال السابق برمز الأمان الذي حصلت عليه. يقوم السطر الثاني في المثال بفك ترميز جسم الجواب من JSON إلى شكله الأساسي كمصفوفة ونقوم بإنشاء حلقة loop تقوم بطباعة محتوى عنصر المصفوفة $pins['data']. الاستيثاق يقع العديد من الأشخاص في عثرات في هذه المرحلة لأنها تتطلب خطوة إضافية على الأقل وربما بعض الترويسات الإضافية أيضًا. ولننظر إلى واجهة تويتر البرمجية على سبيل المثال، وتحديدًا إلى الاستيثاق الخاص بالتطبيقات، الذي يمكنك استخدامه لاستيثاق تطبيقك مع تويتر. قراءة التوثيق إن أول خطأ قد يتم ارتكابه هو عدم قراءة التوثيق بشكل جيّد. ولو كنت مبرمجًا متمرسًا في واجهات REST البرمجية فيمكنك القفز مباشرة إلى الجزء حول الاستيثاق، ولو فعلت هذا فقد لا تنتبه إلى سطر يقول: وإهمال هذا الشرط سيؤدي إلى فشل حتمًا في الحصول على نتيجة، على الرغم من أن كل شيء آخر مطبّق بشكل كامل، لذا حتى توفّر على نفسك الحاجة لمراجعة شفرة برنامجك، تأكد من قراءة التوثيق بشكل جيّد وكامل. إضافة ترويسات ومعاملات أخرى بعد اتباع التوجيهات في التوثيق حرفيًّا، قمت بإنشاء طلب POST، ينبغي أن يؤدي إلى توليد رمز أمان للوصول من أجلي، ويبدو الكود على الشكل: $key = base64_encode( urlencode( "n8KP16uvGZA6xvFTtb8IAA:i4pmOV0duXJv7TyF5IvyFdh5wDIqfJOovKjs92ei878" ) ); $request = wp_remote_post('https://api.twitter.com/oauth2/token', array( 'headers' => array( 'Authorization' => 'Basic ' . $key, 'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8' ), 'body' => 'grant_type=client_credentials', 'httpversion' => '1.1' )); $token = json_decode( $request['body'] ); echo "<pre>"; var_dump($token); echo "</pre>"; إن الخطوة الأولى هو ترميز رمز أمان الوصول والكلمة السرّية بصيغة URL encoding. قمت أيضًا بإضافة ترويستين، واحدة ترويسة استيثاق تحوي على بيانات الوصول. أما الترويسة الثانية فهي ترويسة نوع المحتوى content type، والتي يطلب توثيق تويتر إضافتها. إضافة لما سبق، قمت بملء جسم الطلب تمامًا كما ذكرت الملاحظة السابقة حول grant_type=client_credentials وتم إضافة إصدار HTTP كما يطلب توثيق تويتر أيضًا. سيحتوي الجواب بالإضافة للعديد من المعلومات الأخرى على رمز أمان الوصول في جسم الجواب، وسنحتاج لرمز الأمان هذا في جميع الطلبات اللاحقة المرسلة إلى الواجهة البرمجية الخاصة بتويتر. تخزين رمز أمان الوصول إن رمز الأمان صالح لبعض الوقت، ويعتبر طلبه مجدّدًا هدرًا غير ضروري عند تحميل كل صفحة أو عندما يحتاج تطبيقك أن يقوم بعملية ما وسيؤدي إلى استهلاك عدد الطلبات المسموح بسرعة. يمكن في ووردبريس استخدام عابرة transient لتخزين قيمة رمز الأمان ومن ثم استخدام العابرة عند كل طلب لاحق للواجهة البرمجية. $token = get_transient( 'twitter_access_token' ); $token = ( empty( $token ) ) ? get_twitter_access_token() : $token; $request = wp_remote_get('https://api.twitter.com/1.1/followers/ids.json?screen_name=danielpataki&count=5', array( 'headers' => array( 'Authorization' => 'Bearer ' . $token, 'Content-Type' => 'application/x-www-form-urlencoded;charset=UTF-8' ), 'httpversion' => '1.1' )); $token = json_decode( $request['body'] ); سيؤدي إرسال الطلب السابق إلى واجهة تويتر البرمجية إلى عرض 5 من متابعيّ على تويتر (قائمة بسيطة لأرقام حساباتهم Ids). وكما يظهر في المثال السابق، فإنني أقوم بجلب القيمة التي خزّنتها في العابرة فإن لم تكن موجودة سأقوم باستدعاء التابع get_twitter_access_token() للحصول على رمز أمان جديد ومن ثم إضافته إلى العابرة كي أستخدمه في الطلبات اللاحقة. تجدر الإشارة إلى أن هذه الطريقة تهدف فقط إلى إظهار آلية التنفيذ وليست أفضل طريقة للتنفيذ، وكسيناريو أبسط كنت لأقوم بوضع جميع العبارات الشرطية IFs داخل التابع get_twitter_access_token() الذي سيقوم بتنفيذ جميع الشيفرة السابقة ضمنيًا. التوابع المساعدة في واجهة HTTP البرمجية الآن وبعد أن حصلنا على لمحة جيدة حول هدف المقال، دعونا نلق نظرة على التوابع التي ستساعدك في واجهة HTTP البرمجية في ووردبريس. هناك 4 توابع يمكن بواسطتها تنفيذ طلبات: wp_remote_get() wp_remote_post() wp_remote_head() wp_remote_request() ومن الواضح تمامًا وظيفة كل تابع، أما التابع الأخير wp_remote_request() فهو تابع عام يمكنك استخدامه مع أي طريقة HTTP method. أما التوابع الخمسة التالية فتسمح لك بالحصول على جواب على الطلب بسهولة باستخدام توابع قياسية عوضًا عن الخوض في التعامل مع المصفوفات وعناصرها. wp_remote_retrieve_body() wp_remote_retrieve_header() wp_remote_retrieve_headers() wp_remote_retrieve_response_code() wp_remote_retrieve_response_message() أيضًا يبين اسم كل تابع الهدف الوظيفي له بسهولة، وينصح عند الإمكان باستخدام هذه التوابع عوضًا عن التعامل مع المصفوفات يدويًا، حيث ستسمح هذه الطريقة الموحّدة لمطوّرين آخرين بفهم البرمجية بسهولة واستخدام الخطافات hooks إن أصبحت متاحة في المستقبل. الخلاصة كما ترى فإن التعامل مع واجهة REST البرمجية سهل باستخدام واجهة HTTP البرمجية في ووردبريس وبعض توابع ووردبريس كالعبّارات. أنصح بشدّة تجربة هذا الأمر لأن عملية التطوير في ووردبريس تسير بثقة باتجاه العالم المُقاد باستخدام الواجهات البرمجية وعليك أن تقفز إلى الموكب قبل فوات الأوان. إن كان لديك المزيد من الأسئلة حول استخدام واجهة HTTP البرمجية أو لديك بعض الأفكار حول كيفية استخدامها، فلا تتردد بمناقشة الأمر في قسم التعليقات في الأسفل. ترجمة -وبتصرّف- للمقال How to Use the WordPress HTTP API لصاحبه Daniel Pataki.1 نقطة