لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 07/31/21 في كل الموقع
-
لدي مشروع مبني باستخدام إطار العمل express في node.js ولدي أيضاً خوارزمية معيّنة ضمن بايثون أرغب باستخدامها على البيانات التي يتم الحصول عليها من خلال كود node.js هل هنالك طريقة لاستدعاء بعض التوابع من كود بايثون إلى node.js؟ وكيف سيتم تمرير المعطيات والنتائج بينهما؟2 نقاط
-
من أسهل الطرق هو استخدام child_process في node.js ثم يمكنك الوصول إلى مسار الكود في بايثون مع إمكانية تمرير المتغيرات بشكل مصفوفة بالشكل التالي: const spawn = require("child_process").spawn; const pythonCode = spawn('python',["..../pathhere/script.py", args1, args2, ...]); ثم يجب التأكد من تضمين أو (import sys) ضمن كود بايثون لديك وعندها ستتمكن من الوصول إلى قيم المتغيرات التي تم تمريرها من node.js بالشكل التالي: sys.argv[1] ....إلخ. أما لإرسال البيانات مجدداً من بايثون إلى node.js يمكنك إضافة التالي إلى الكود في بايثون: print(dataToSendBack) sys.stdout.flush() ثم يمكن لطرف node.js استقبال البيانات بالشكل التالي: pythonCode.stdout.on('data', (data) => { .... }); كما يمكنك استخدام الحزمة python-shell ويتم تحميلها بالشكل التالي: npm install python-shell ثم يتم استدعاء ملفات بايثون: const PythonShell = require('python-shell').PythonShell; PythonShell.run('script.py', null, function (err) { if (err) throw err; console.log('done'); }); ويتم تمرير المتغيرات من خلالها بهذا الشكل: var options = { mode: 'text', pythonPath: 'path/here/', pythonOptions: ['-u'], scriptPath: 'path/to/script', args: ['v1', 'v2', 'v3'] }; PythonShell.run('script.py', options, function (err, result) { if (err) throw err; console.log('test results: %j', result); }); كما يوجد بعض الحزم المشتركة مثل حزمة zerorpc التي يمكنك تضمينها في كل من كود الجافاسكريبت في node.js وكود بايثون واستخدامها في كلا الطرفين على منفذ واحد مما قد يسهّل آلية العمل خصوصاً في حال تبادل البيانات بشكل مكرر بين كل من الطرفين، بالشكل التالي: ضمن كود الجافاسكريبت: //في طرف node.js var zerorpc = require("zerorpc"); var client = new zerorpc.Client(); client.connect("tcp://127.0.0.1:3000"); client.invoke("hello world", "RPC", function(error, res, more) { console.log(res); }); ضمن بايثون: import zerorpc class HelloRPC(object): def hello(self, name): return "Hello there: , %s" % name t = zerorpc.Server(HelloRPC()) t.bind("tcp://0.0.0.0:3000") t.run()2 نقاط
-
انا شاب طموح احب اتعلم كثير الان بعد دورة تطوير واجهات المستخدم اقدر ابني مواقع الكترونيه, هل تنصحوني فيه ؟ اتمنى يكون فيه كبون خصم (انا طالب ثانوي): شكرآ لكم1 نقطة
-
إن دورة تطوير واجهات المستخدم، تمح لك ببناء واجهات المواقع أي كل مايظهر للمستخدم و تهتم بالتفاصيل الخاصة بالعرض بشكل كبير وتؤمن فهم كافة الخيارات و الأدوات اللازمة ليظهر الموقع بالشكل المطلوب للمستخدم وبأحسن أداء (زمن تحميل الصفحة) و توافقيتها مع الشاشات المختلفة. بناء المواقع الالكترونية يحتاج معظم الأحيان للبرمجة الخلفية Back-End أي معالجة طلبات العميل(مستخدم الموقع) بعد النقر على زر ما أو عمل أي تعديل في واجهات الموقع، ليتم تعديل البيانات في قاعدة البيانات و إعادة مشاركتها مع باقي المستخدمين للموقع. أي لبناء موقع متكامل تحتاج لتعلم كل من Front-End (واجهات المستخدم) و Back-End (برمجة الموقع وقواعد البيانات) ودورة تطوير واجهات المستخدم مسؤولة عن Front-End فقط. ولتعلم Back-End لاحقاً تحتاج لتعلمها لوحدك. إن كنت ترغب بعمل موقع متكامل يفضل التسجيل إما في دورة جافاسكربت أو PHP (لا يركزان على الواجهات الأمامية لكنها مشروحة بطريقة جيدة) وهنا سيكون الموقع ديناميكيا يمكنك من حفظ بيانات في القاعدة و تعديلها كموقع حقيقي.1 نقطة
-
يمكن إعادة تشكيل مصفوفة عددية matrix إلى متجهvector باستخدام التابع reshape مع المدخل -1. لكني لا أعرف ما تعنيه -1 هنا. على سبيل المثال: >>> import numpy as np >>> a = np.matrix([[1, 2, 3, 4], [5, 6, 7, 8]]) >>> b = np.reshape(a, -1) >>> a matrix([[1, 2, 3, 4], [5, 6, 7, 8]]) >>> b matrix([[1, 2, 3, 4, 5, 6, 7, 8]]) >>> لا أعرف ماذا يعني -1 هنا؟1 نقطة
-
كيفية تحويل مصفوفة numpy تحتوي على أرقام عشرية إلى مصفوفة integer؟ على سبيل المثال لدي المصفوفة التالية: import numpy as np arr = np.array([[1.0, 2.1], [3.2, 4.3]]) كيف أقوم بتحويلها إلى المصفوفة التالية: array([[1, 2], [3, 4]])1 نقطة
-
عند إنشاء DataFrame في مكتبة Pandas من خلال مصفوفة Numpy، كيف أحدد عمود الفهرس index ورؤوس الأعمدة headers؟ على سبيل المثال، لدي مصفوفة Numpy تتكون من قائمة من القوائم list of lists، تمثل مصفوفة ثنائية الأبعاد مع تسميات الصفوف وأسماء الأعمدة كما هو موضح أدناه: data = np.array([ ['', 'Col1', 'Col2'], ['Row1', 1, 2], ['Row2', 3, 4] ]) أرغب في أن يحتوي DataFrame الناتج على Row1 و Row2 كقيم الفهرس ، و Col1 و Col2 كقيم رؤوس الأعمدة headers كيف يمكنني جعل النتيجة تصبح بهذا الشكل؟ Col1 Col2 Row1 1 2 Row2 3 41 نقطة
-
السلام عليكم الكود التالي يجعل الشريط الجانبي يتحرك تلقائيا لاسفل في الشات لكن إذا اردنا العودة لأعلى لمشاهدة الرسائل القديمة لا نستطيع لان الشريط الجانبي يتحرك لاسفل دائما كيف يمكن اتاحة تحريك الشريط لاعلى ولا يتحرك لاسفل تلقائيا الا اذا وصلت رسالة جديدة او تم اعادة تحميل الصفحة تماما كما في الشاتات المتعارف عليها <script> const messages = document.getElementById('div_show_message'); function appendMessage() { const message = document.getElementsByClassName('message')[0]; const newMessage = message.cloneNode(true); messages.appendChild(newMessage); } function getMessages() { shouldScroll = messages.scrollTop + messages.clientHeight === messages.scrollHeight; if (!shouldScroll) { scrollToBottom(); } } function scrollToBottom() { messages.scrollTop = messages.scrollHeight; } scrollToBottom(); setInterval(getMessages, 1000); </script>1 نقطة
-
وحدة python-shell من extrabacon هي وسيلة بسيطة لتشغيل أكواد بايثون من Node.js مع تواصل عملية داخلية أساسية ولكن فعالة ومعالجة الأخطاء بشكل أفضل. التثبيت: بإستخدام npm: npm install python-shell أو ب yarn yarn add python-shell تشغيل كود بايثون بسيط const PythonShell = require('python-shell').PythonShell; PythonShell.run('my_script.py', null, function (err) { if (err) throw err; console.log('finished'); }); تشغيل نص Python بالمُدخلات والخيارات: const PythonShell = require('python-shell').PythonShell; var options = { mode: 'text', pythonPath: 'path/to/python', pythonOptions: ['-u'], scriptPath: 'path/to/my/scripts', args: ['value1', 'value2', 'value3'] }; PythonShell.run('my_script.py', options, function (err, results) { if (err) throw err; /* المتغير * results * هو عبارة عن مصفوفة تحتوي الرسائل التي تم تجميعها من التنفيذ */ console.log('results: %j', results); }); للحصول على مزيد من المعلومات وكود المصدر ، تحقق من التوثيق الرسمي1 نقطة
-
كأساليب لتعلم الخوارزميات، تعتبر pseudo code و Flowchart هما أهم الطرق لتعلمها وتطبيقها خاصه pseudo code، ولكن هذا ليس كافيا للتعلم والتمكن، فهذة فقط مجرد أدوات. اذا أتممت تعلم تلك الطريقتين فأنت الان تستطيع كتابة وتصميم الخوارزمية، أما عن تطبيقها وهو الجزء الأهم، فيجب عليك أن تعتاد وتتدرب عليها. حاول أن تختار أي لغة برمجة تشاء،مثل بايثون أو c وطبق عليها فعليا الخوارزميات التي تقوم بتصميمها، وبذلك تكون قد حولت ال pseudo code الي كود فعلي. هناك الكثير من المواقع التي توفر تدريبا على الخوارزميات منها hacker rank وهو الاشهر على الاطلاق، قم بالتدريب كثيرا فهذا أفضل من استمرار التعلم فقط.1 نقطة
-
1 نقطة
-
1 نقطة
-
يبدو أن زر num lock كان مطفا لدي فلم يكتب الرقم margin-left: 10px; مثلا 10 بكسل، الأرقام موضوعة ضمن عنصر span وهي في قائمة ul لذلك نستهدف هذه العناصر بعمل هوامش خارجية margin بقيمة نريدها 10 كناسبة مثلا.. أعد المحاولة، شكرا لك1 نقطة
-
الاسكريبت دا لا احتجة لانك بعتلي سكريبت اخر وقد عمل شكرا جدا لحضرتك علي وقوفك معايا1 نقطة
-
حسنا، @media only screen and (max-width: 600px) { ::-webkit-scrollbar { width: 0; /* Remove scrollbar space */ background: transparent; /* Optional: just make scrollbar invisible */ } }1 نقطة
-
من خلال شيفرة css: Hide scroll bar شاشة صغيرة: @media only screen and (max-width: 600px) { body { overflow: hidden; } } بشكل عام: body { overflow: hidden; /* Hide scrollbars */ } /* Hide scrollbar for Chrome, Safari and Opera */ body::-webkit-scrollbar { display: none; } /* Hide scrollbar for IE and Edge */ body { -ms-overflow-style: none; } html { overflow: scroll; overflow-x: hidden; } ::-webkit-scrollbar { width: 0; /* Remove scrollbar space */ background: transparent; /* Optional: just make scrollbar invisible */ } إن لم تعمل الخاصية الأولى أضف لها من الجزء الآخر (المهم أن تكون ضمن العنصر media)1 نقطة
-
يوجد عدة طرق لإرسال الصفحات من خلال node.js ومنها استخدام محرك القوالب jade من خلال إنشاء الملف index.jade ضمن المجلّد الذي يحوي صفحات الموقع لديك pages وإضافة الكود التالي: include plain.html ثم وفي نفس المجلّد نجعل الصفحة plain.html تحوي كود HTML الخاص بهذه الصفحة بهذا الشكل: <!DOCTYPE html> ... وأخيراً في كود node.js من طرف الخادم نستطيع تمرير هذه الصفحة بالشكل التالي: res.render(index) ومع تحديث نسخة express.js بدءً من النسخة الثالثة، أصبح بإمكانك استخدام المحرّك ejs من خلال تحميل الحزمة التالية: npm install ejs --save وتمرير الصفحات بالشكل التالي: app.set('views', __dirname + '/pages'); app.engine('html', require('ejs').renderFile); أما في نسخة express 3.4 ومافوق يمكنك استخدام المحرّك ejs يالشكل التالي: app.set('view engine', 'ejs'); app.get('/home', function (req, res) { res.render('home.html'); });1 نقطة
-
يوجد عدّة طرق لتمرير المتغيرات عبر مسارات التوجيه في node.js والأفضل بينها هو عن طريق query string أي في المسار مباشرةً من خلال إضافة العلامة ? إلى المسار ووضع اسم المتغيّر وقيمته. ولكن عندها يجب عليك التأكد من أن قيم هذه المتغيرات سيتم ترميزها وفك ترميزها بالشكل الصحيح ( encodeURIComponent ) لأنه لا يمكنك كتابة أي نص ترغب به وتقوم بإضافته بشكل مباشر إلى الرابط. فيصبح الكود بالشكل التالي: app.port('/test', function(req, res) { var string = encodeURIComponent('نضع هنا القيم المراد تمريرها'); res.redirect('/?check=' + string); }); وبعد ذلك، يمكنك الحصول على قيم هذه المتغيرات من خلال التابع req.query بالشكل التالي: app.get('/', function(req, res) { var testValues = req.query.check; ..... }); كما يمكنك استخدام الحزمة url الموجودة في node.js لسهولة إنشاء query string في حال كان لديك أكثر من قيمة يجب أن تقوم بتمريرها من خلال التابع url.format بالشكل التالي: const url = require('url'); app.post('/test', function(req, res) { res.redirect(url.format({ pathname:"/", query: { "variable1": 1, "variable2": 2, "check":"test value" } })); }); وفي حال كنت تستخدم نسخة من node.js أعلى من النسخة السابعة، يمكنك استخدام الحزمة queryString بهذا الشكل: const querystring = require('querystring'); app.post('/test', function(req, res) { const query = querystring.stringify({ "variable1": 1, "variable2": 2, "check":"test value" }); res.redirect('/?' + query); }); كما يوجد طرق أخرى لتحقيق ذلك من خلال استخدام الجلسات sessions أو req.flash ولكن في النسخ الحديثة من إطار عمل express من الممكن أن تحتاج استخدام حزم أخرى إضافية لتحقيق ذلك من خلالها.1 نقطة
-
يمكنك تجربة الرابط التالي: http://localhost:5000/main.css أما في حال أردت وجود /styles في الرابط، فيجب أن تقوم بتعديل الكود لديك ليصبح بالشكل التالي: app.use("/styles", express.static(__dirname + '/styles')); فمع عدم ذكر أي مسار في كود app.use ستتم الاستجابة إلى المسار الرئيسي لمجلّد مشروعك دون أي إضافات.1 نقطة
-
1 نقطة
-
إن كنت تملك هاتف أندرويد، قم بوصله عن طريق usb (وفي الهاتف عليك تفعيل خيارات المطورين ثم usb debugging وضع تصحيح usb) أنا أفضل الهاتف الحقيقي (لأن الأخطاء لا تظهر جميعها على المحاكي) + أداء التطبيق على الهاتف أفضل * يمكن وصل هاتف أندرويد عن طريق wifi من خلال إضافة لأندرويد استديو (يتطلب وصل usb ونفس الخطوة السابقة) اسمها wifi على ما اذكر.. bluestack: عليك إضافة: sdk\platform-tools لمتغيرات البيئة في ويندوز environment variables path\to\\Android\sdk\platform-tools تأكد من المسار على حاسوبك: ثم نفذ الأمر في cmd: adb connect localhost:5555 تشغيل Android Studio.. احتمال أن تحتاج في BlueStack emulator لتفعيل خيار Android DEBUG Bridge Blustacks settings > Preferences > Check Enable Android Debug Bridge (ADB) ثم أعد تشغيل المحاكي ثم تشغيل Android Studio1 نقطة
-
نحتاج لعمل back-end عندما نريد حفظ معلومات المستخدمين أو نريد نوفير خاصية مشاركة هذه البيانات بين المستخدمين أنفسهم، حيث سيتم عندها حفظ معلومات المستخدمين في قاعدة بيانات مشتركة، وهذا يسمح لأي حساب في المشروع بأن يصل للبيانات (حسب صلاحيته). يمكن عمل تطبيقات للهواتف المحمولة فقط بالواجهات الرسومة المتاحة لكل منها، كما يمكن تخزين البيانات البسيطة ضمن التطبيق نفسه (حسب تكنولوجيات البرمجة) مثلا في أندرويد و فلاتر متاح shared preference وهي تسمح بتخيزن سلاسل نصية وأرقام و أي نوع بيانات وإمكانية استرجاعها حتى بعد إغلاق التطبيق (تبقى محفوظة في ذاكرة الهاتف) ويمكن أيضا استخدام قواعد بيانات ضمن التطبيق مثل sqlite (نسخة مخففة من sql) تعمل على الهواتف. تختلف الضرورة لتوافر قاعدة بيانات ومخدم حسب توجه التطبيق.1 نقطة
-
بالتأكيد يمكن ذلك، فلا يتم إنشاء جزء الـ Backend إلا عند الحاجة إليه في أوقات معينة مثل الحاجة لعمل نظام لإدار المستخدمين أو لتخزين البيانات .. إلخ، وتوجد الكثير من التطبيقات التي لا تحتاج إلى Backend لأنها تعمل في الأساس بدون إتصال بالإنترنت، في الغالب تكون هذه التطبيقات بسيطة للغاية، كما توجد طرق أخرى لعمل تطبيقات بدون Backend من خلال إستخدام خدمات مثل Firebase والتي يتم إسعمالها بكثرة لتخزين البيانات أو عمل نظام إستيثاق Authentication دون الحاجة إلى خادم ويب أو عمل تطبيق Backend. توجد العديد من التقنيات التي يتم إسخدامها لعمل تطبيقات الجوال من خلال لغات الويب HTML, CSS, JavaScript مثل Cordova و React Native يمكنك الإطلاع على هذه المقالة لتتعرف أكثر على React Native "مدخل إلى React Native"، كما يوجد الكثير من المقالات العربية التي تشرح Cordova: إطار العمل أباتشي كوردوفا ApacheCordova نظرة عامة عن تطوير تطبيقات الأجهزة المحمولة عبر كوردوفا أنشئ تطبيقك الأول في Cordova1 نقطة
-
بالنسبة لتشغيل التطبيقات على bluestacks، قم بتشغيل المحاكي أولا ثم تشغيل أندرويد استديو (اغلقه إن كان يعمل) ثم بعد تشغيله سيظهر المحاكي في قائمة التشغيل run مثل اي محاكي او جهاز فيزيائي حقيقي. إن لم تظهر معك أخبرني لنقوم بعمل تعديلات مطلوبة..1 نقطة
-
من أجل تسجيل غرض من الصف البعيد في مسجل RMI باسم ما، نستطيع استخدام الطريقة bind والطريقة rebind ولكن الفرق الأساسي بينهما هو أن rebind تستخدم حتى لوكان الاسم موجود مسبقاً (تكتب فوقه)، لكن عندها سيتم إتلاف عملية ال binding السابقة واستبدالها بالجديدة (أي تحذف القديمة وتضع الجديدة) بينما bind لايمكنها القيام بذلك حيث تقوم برمي استثناء في حال كان الاسم موجود بالفعل AlreadyBoundException ومن حيث الاستخدام فالطريقتين السابقتين متشابهتين، كلاهما تأخذان متحولين ( اسم ما للغرض ، الغرض البعيد). نقوم أولا بإنشاء مسجل RMI من خلال استدعاء الطريقة الستاتيكية creatRegistry الموجودة ضمن الصف LocateRegistry، ونحجز له بورت هنا مثلاً (1999): Registry r = LocateRegistry.createRegistry(1999); ثم نأخذ غرض وليكن rb من الصف البعيد ( RemoteObject مثلاً) ونقوم بتسجيله في مسجل RMI بالاسم ("object1") عبر استدعاء إحدى الطريقتين: r.bind("object1", rb); r.rebind("object1", rb);1 نقطة
-
يحدد العنصر <a> ارتباطاً تشعبياً "hyperlink"، يتم استخدامه للربط والانتقال من صفحة إلى أخرى. وأهم واصفة فيه هي href التي من خلالها نحدد الوجهة"عنوان URL". أما لتحديد المكان الذي سيتم فيه فتح الصفحة فنستخدم الواصفة target كالتالي. فتح صفحة الرابط في نافذة أو علامة تبويب جديدة، نستخدم target=_blank: <a href="xyz.html" target="_blank"> Link </a> في نفس الإطار الذي تم النقر فوقه (هذا هو الشكل الافتراضي): <a href="xyz.html" target="_self"> Link </a> في الإطار الأب "parent frame": <a href="xyz.html" target="_parent"> Link </a> في كامل جسم النافذة "full body": <a href="xyz.html" target="_top"> Link </a> في إطار مسمى: <a href="xyz.html" target="framename"> Link </a>1 نقطة
-
عندما تكون الصورة غير متلائمة مع التنسيق وتريد تغيير حجمها، فيمكنك القيام بذلك في HTML. من أبسط الطرق لتغيير حجم صورة في HTML استخدام سمات الطول والعرض height و width في العنصر img. حيث يمكنك من خلالهما أن تحدد ارتفاع وعرض الصورة. على سبيل المثال الصورة التالية حجمها 960*640 : يمكننا عرضها بارتفاع 500 بكسل وعرض 400 بكسل: <img src="https://ik.imagekit.io/ikmedia/women-dress-2.jpg" width="400" height="500" /> إذا كان الارتفاع والعرض المطلوبان للصورة لا يتطابقان مع الأبعاد الفعلية للصورة، فسيقوم المتصفح بتقليص أو توسيع الصورة تلقائياً. وتختلف عملية التوسيع أو التقليص حسب الخوارزمية التي يستخدمها المتصفح. لكن يجب أن تعلم أن عملية تغيير حجم الصورة له جوانب سلبية على جودة الصورة وعرضها (حيث يسبب بطئ في عرضها) وطبعاً هناك حلول أخرى لذلك مثل استخدام "ImageKit.io" لتغيير حجم الصورة بشكل ديناميكي اعتماداً على معاملات URL (يمكنك البحث في الموضوع فهو مهم جداً). انظر مثلاً: https://ik.imagekit.io/ikmedia/woman.jpg للحصول على صورة بعرض 200 بكسل، سنضيف معامل استعلام tr بقيمة w-200 كما هو موضح أدناه: https://ik.imagekit.io/ikmedia/woman.jpg?tr=w-2001 نقطة
-
قبل كل شيء المتوسط المتحرك في علم الإحصاء، المتوسط المتحرك (MA) هو عملية حسابية تُستخدم لتحليل نقاط البيانات (العينات) عن طريق إنشاء سلسلة من المتوسطات لمجموعات فرعية مختلفة من مجموعة البيانات الكاملة. ويستخدم في عالم الأموال، حيث أن المتوسط المتحرك (MA) هو مؤشر سهم يستخدم بشكل شائع في التحليل التقني. والسبب في حساب المتوسط المتحرك للسهم هو المساعدة في تسهيل بيانات السعر عن طريق إنشاء متوسط سعر محدث باستمرار. ومن خلال حساب المتوسط المتحرك ، يتم تخفيف آثار التقلبات العشوائية قصيرة الأجل على سعر السهم خلال إطار زمني محدد. لن أخوض في تفاصيله الممتعة أكثر. له نوعان، Simple Moving Average: أبسط شكل من أشكال المتوسط المتحرك ، والمعروف باسم المتوسط المتحرك البسيط (SMA) ، يتم حسابه بأخذ المتوسط الحسابي لمجموعة معينة من القيم. بمعنى آخر ، يتم جمع مجموعة من الأرقام - أو الأسعار في المجال المالي - معًا ثم تقسيمها على عدد الأسعار في المجموعة. (وهو النوع الأكثر استخداماً) SMA=(A1+A2+..+AN)/n A:nهي المتوسط في الفترة N: عدد الفترات الزمنية Exponential Moving Average (EMA): يعطي وزناً أكبر للأسعار الحديثة في محاولة لجعله أكثر استجابة للمعلومات الجديدة. لحساب المتوسط المتحرك الأسي: EMAt=[Vt×S/(1+d)]+EMAy×[1−S/(1+d)] EMAt: لليوم Vt: هي القيمة لليوم EMAy: للأمس S: التنعيم d:عدد الأيام الآن كيف نطبقه في بايثون: 1.الطريقة الأولى: قم بإنشاء قائمة فارغة تحتوي على المتوسطات المتحركة. قم بالمرور على القائمة الأصلية باستخدام حلقة while. في كل تكرار ، استخدم فهرسة القائمة للحصول على النافذة الحالية. استخدم sum(iterable) / w_s ثم أضف هذه النتيجة إلى قائمة المتوسطات المتحركة: li = [6, 7, 10, 12] # حجم النافذة w_s = 3 i = 0 moving_averages = [] j=len(li) - w_s + 1 while i < j: this_window = li[i : i + w_s] window_avg = sum(this_window) / w_s moving_averages.append(window_avg) i += 1 print(moving_averages) 2. من أجل القوائم الكبيرة تقدم باندا طريقة فعالة هي pandas.Series(data) لتحويل القائمة إلى pandas.Series object. ثم استدعي pandas.Series.rolling (window_size) للحصول على كائن يحتوي كل نافذة، ثم استدعي pandas.Series.mean لإيجاد المتوسط لكل نافذة : li = [6, 7, 10, 12] w_s = 3 pd = pd.Series(li) windows = pd.rolling(w_s) moving_averages = windows.mean() # pandas.Series.tolist() لتحويلها لقائمة moving_averages_list = moving_averages.tolist() # حذف القيم Nan w = moving_averages_list[w_s - 1:] print(w) 3.باستخدام نمباي: 4. والطريقة الأكثر سرعة هي استخدام uniform_filter1d من scipy فهي أسرع بنحو 50 مرة من np.convolve و 2-5 مرات من cumsum : from scipy.ndimage.filters import uniform_filter1d import numpy N = 1000 x = numpy.random.random(100000) y = uniform_filter1d(x, size=N) لاحظ: %timeit y1 = np.convolve(x, np.ones((N,))/N, mode='same') 100 loops, best of 3: 9.28 ms per loop %timeit y2 = uniform_filter1d(x, size=N) 10000 loops, best of 3: 191 µs per loop إليك التحقيقات الثلاثة التي ذكرتها: import numpy as np import scipy.ndimage.filters as ndif from __future__ import division #cumsum استخدام def running_mean_cumsum(x, N): cumsum = np.cumsum(np.insert(x, 0, 0)) return (cumsum[N:] - cumsum[:-N]) / float(N) #convolve استخدام def running_mean_convolve(x, N): return np.convolve(x, np.ones(N) / float(N), 'valid') #uniform_filter1d وأخيراً def running_mean_uniform_filter1d(x, N): return ndif.uniform_filter1d(x, N, mode='constant', origin=-(N//2))[:-(N-1)]1 نقطة
-
السبب الرئيسي لاستخدام NaN بدلاً من None هو أنه يمكن تخزينه باستخدام نوع float64 لـ numpy ، بدلاً من نوع object الأقل كفاءة. حيث أن عملية تخزينه على شكل object سوف يجعله غير قابل للتعامل مع عمليات نمباي . بينما NaN يمكن استخدامها كقيمة عددية في العمليات الحسابية وأيضاً في العمليات التي يمكن تطبيقها باستخدام مكتبة نمباي.1 نقطة
-
نعم هناك فرق وكل نوع منهما يستخدم مع أنواع محددة. حيث إن عملية الفلترة تهدف لإزالة الضجيج من صورة ما، وهناك نوعين أساسيين للضجيج: ضجيج خطي وضجيج غير خطي .ولكل نوع منهما طريقة لإزالته فالخطي تتم إزالته بمرشحات خطية مثل ال mean filter أو gaussian filter واللاخطي بمرشحات لاخطية مثل median filter و max filter و min filter. لذا فإن أول مرحلة هي معرفة أو دراسة نوع الضجيج حيث نقوم بحساب ال 𝑥̅, 𝑆𝑇𝐷 ومقارنة قيمتهما، حيث أن المتوسط الحسابي للصورة 𝑥̅، والانحراف المعياري للصورة STD. وهنا نميز حالتان، الأولى عندما تكون قيمة الانحراف المعياري قريبة من قيمة المتوسط الحسابي وهذا يعني أن: 1.الصورة لديها تفاصيل كثيرة (كميات كبيرة من المعلومات) 2. في هذه الحالة نعتبر الانحراف المعياري واقع في جوار المتوسط الحسابي. 3.قيمة النحراف المعياري لا تعبر عن نسبة الخطأ في الصورة لوجود قيم كبيرة مقارنة بقيم أخرى أي أن لدينا حالة تسمى "Extrime values". أما الحالة الثانية عندما تكون قيمة الانحراف المعياري أكبر بكثير من المتوسط الحسابي وهنا يكون لدينا: 1.تفاصيل قليلة في الصورة. 2. قيمة الانحراف المعياري تعبر عن نسبة الخطأ في الصورة وتباعد قيمها عن بعضها. 3. بيانياً تأخذ شكل أسنان المنشار أو بمعنى آخر تكون قيم ال intensity value متقاربة. ثم علينا معرفة فيما إذا كانت الصورة تتبع توزيعاً غاوصياً أم لا، وعلى هذين الأساسين يتم تحديد نوع الضجيج. فالضجيج الخطي هو توزع غير طبيعي بحيث يوجد قيم داخل القبّة (داخل الجرس) و قيم خارجها وبحيث يكون 𝑥̅≅𝑆𝑇𝐷 ،وشكله عبارة عن اهتراءات بالصورة أو تكون الحواف غير واضحة، وتتم إزالته بفلاتر خطية و هي عملية تسمى بال Smothing أو blurring أي التنعيم ويستخدم عادة لإزالة الضجيج الغاوصي من الصورة (ضجيج مجهول السبب وهو عبارة عن سويات رمادية تضاف إلى الصور وتسلك سلوك تابع غاوص في توزعها وتأثيره كتنميش في الصورة أو اهتراءات كما ذكرت). أما الضجيج اللاخطي فهو توزع غير طبيعي بحيث تكون كل القيم خارج تابع الجرس وبحيث يكون 𝑥̅≫𝑆𝑇𝐷 ،وشكله عبارة عن نقاط بيضاء (نقاط فاتحة) في محيط داكن أو سوداء (في محيط فاتح) متوزعة على الصورة ولهذا السبب يسمى بضجيج الملح و الفلفل salt&pepper، وتتم إزالته بفلاتر غير خطية. يمكنك البحث على جوجل لترى أمثلة عن هذين النوعين من الضجيج، فقط قم بكتابة Salt & pepper noise و Gaussian noise1 نقطة
-
اعتقد أنه يمكنك استخدام os.path.realpath كالتالي : import os dir_path = os.path.dirname(os.path.realpath(__file__))1 نقطة
-
أولاً يجب أن تعلم أن أي كائن يمكننا المرور عليه بحلقة" looped over" هو كائن قابل للتكرار "iterable". على سبيل المثال ، كائن القائمة قابل للتكرار وكذلك كائن str. وللتأكد فيما إذا كان كائن ما قابل للتكرار في بايثون أم لا فهناك عدة طرق: أولها التابع __iter__ : s = 'Ali' if hasattr(s, '__iter__'): print(f'{s} is iterable') else: print(f'{s} is not iterable') # الخرج # Ali is iterable أو يمكنك تجربة __contains__ حيث تعتمد فكرتها على اختبار فيما إذا كان ال object يقبل المعامل in أو لا: hasattr(obj, '__contains__') # hasattr("adccads", '__contains__') True أو بنفس الفكرة مع التابع len: hasattr([8,2], "__len__") # True الطريقة الثانية هي بجعل مولد يحاول المرور على الكائن فإذا أخفق لن يكون قابل للتكرار : s="Ali" def iterable(a): try: (x for x in a) return True except TypeError: return False iterable(s) # True الطريقة الثالثة تعتمد على اختبار فيما إذا كان الكائن يمثل instance من الصف Iterable : from collections.abc import Iterable s = 'Ali' if isinstance(s, Iterable): print(f"{s} is iterable") else: print(f"{s} is not iterable") # Ali is iterable هناك طريقة أخرى خطرت لي وهي أن كل الكائنات القابلة للتكرار تمتلك التابع __getitem__ في ال dict الخاص بها: def is_attr(arg): return '__getitem__' in dir(arg) is_attr([5,8]) #True يمكنك أيضاً استخدام التابع iter لأنه في Python، المكرر هو أي كائن يدعم بروتوكول المكرر. جزء من هذا البروتوكول هو أن الكائن يجب أن يحتوي على طريقة __iter __ تقوم بإرجاع كائن المكرر لذالك أيضاً هنا نستطيع التحايل في استخدامها للاختبار : name = "ِAli" try: iter(name) print("{} is iterable".format(name)) except TypeError: print("{} is not iterable".format(name))1 نقطة
-
في جافا: package javaapplication19; import java.util.*; public class JavaApplication19 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); // إدخال عدد الأسطر وعدد الأعمدة int rows=sc.nextInt(); int cols=sc.nextInt(); // تعريف مصفوفة من الأعداد الصحيحة int arr[][]=new int[rows][cols]; // إدخال العناصر for(int i=0; i<rows;i++) { for(int j=0; j<cols;j++) { arr[i][j]=sc.nextInt(); } } int sumC=0,sumR=0; // مجموع كل سطر for(int i = 0; i < cols; i++){ sumR=0; for(int j = 0; j < rows; j++){ sumR = sumR + arr[i][j]; } System.out.println("row"+(i+1)+": " + sumR); } // مجموع كل عمود for(int i = 0; i < cols; i++){ sumC=0; for(int j = 0; j < rows; j++){ sumC = sumC + arr[j][i]; } System.out.println("column"+(i+1)+": " + sumC); } } } بايثون: #تعرف مصفوفة import numpy as np # إدخال عدد الأسطر فقط r=int(input()) # إدخال عناصر المصفوفة arr = [list(map(int,input().split())) for i in range(r)] # حساب مجموع عناصر كل عمود for i in range(0, r): sum_ = 0; for j in range(0, c): sum_ = sum_ + arr[j][i]; print(" column"+str(i+1)+": " + str(sum_)); print("\n") # حساب مجموع عناصر كل صف for i in range(0, r): sum_ = 0; for j in range(0, c): sum_ = sum_ + arr[i][j]; print(" row"+str(i+1)+": " + str(sum_)); هناك طرق أخرى للإدخال في بايثون لكنني أخترت لك طريقتي التي كنت استخدمها (وهي الأفضل) في مسابقات البرمجة التنافسية وعلى موقع CodeForces لكن انتبه، هنا يكون إدخال عناصر المصفوفة بشكل مختلف قليلاً حيث يتم الإدخال سطر سطر ولهذا السبب لم نطلب إدخال عدد الأعمدة.أي مثلاُ حددنا 3 أسطر وبالتالي ندخل قيم كامل السطر الأول دفعة واحدة ونفصل بينهم بفراغات، أي مثلاً: 1 2 3 ثم نضغط enter ثم 5 6 4 ثم Enter ثم 4 6 6 ثم Enter وبالتالي نكون أدخلنا مصفوفة ب 3 أسطر و 3 أعمدة.1 نقطة
-
في بايثون: #تعرف مصفوفة import numpy as np arr =np.array([[8, 2, 7],[0, 4, 1],[1, 9, 0]]) # حساب عدد الأسطر والأعمدة في المصفوفة r,c=arr.shape # حساب مجموع عناصر كل عمود for i in range(0, r): sum_ = 0; for j in range(0, c): sum_ = sum_ + arr[j][i]; print(" column"+str(i+1)+": " + str(sum_)); print("\n") # حساب مجموع عناصر كل صف for i in range(0, r): sum_ = 0; for j in range(0, c): sum_ = sum_ + arr[i][j]; print(" row"+str(i+1)+": " + str(sum_)); """ column1: 9 column2: 15 column3: 8 row1: 17 row2: 5 row3: 10 """ جافا: public class javaapplication1 { public static void main(String[] args) { int r, c; // تعريف المصفوفة int arr[][] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; // مجموع كل عمود for(int i = 0; i < cols; i++){ for(int j = 0; j < rows; j++){ sumC = sumC + a[j][i]; } System.out.println(" column"+(i+1)+": " + sumC); } // مجموع كل سطر int sumC=0,sumR=0; for(int i = 0; i < arr.length; i++){ for(int j = 0; j < arr[0].length; j++){ sumR = sumR + a[i][j]; } System.out.println(" row"+(i+1)+": " + sumR); } } } وفي ++C وباقي اللغات يكون بنفس الطريقة1 نقطة
-
إن مصمم الرسوميات فنان مبدع، يحوّل أفكاره وأفكار عملائه إلى تحفة فنية تهدف إلى إيصال الفكرة الرئيسية إلى الجمهور بأسلوب فني وطريقة سلسة ليتردد صداها بين الناس. ويستثمر المصمم الألوان والخطوط وجميع العناصر الرسومية في سبيل ولادة تحفته الفنية وبلورتها. ويعد عنصر النص واحدًا من أهم العناصر الرسومية وأكثرها تأثيرًا، وهو فن جميل مميز يخلّد الأفكار في عقول الناس أكثر من أي عنصر آخر. لذلك يجب فهم ومعرفة القواعد الأساسية في العمل على هذا العنصر لتحقيق الاستفادة القصوى من قوته وتأثيره. ما هو عنصر النص أو أسلوب الطباعة التيبوغرافي؟ التيبوغرافي Typography هو فن حقيقي يتضمن ترتيب الكلمات والحروف بطرق وأساليب معينة بغية إحداث التأثير وإيصال الرسالة للناس. ويضيف المصمم النص إلى أي تصميم عند الحاجة لإضافة محتوى خاص مع المحافظة على جمالية وأسلوب التصميم العام، ويعد العنصر الحسم في إنشاء وتصميم أي علامة تجارية، لأنه يمثّل الهوية الأبرز للعلامة التجارية والتي ستساهم في نجاحها واستمراريتها ورسوخها في أذهان الناس. كما يعد العنصر الأهم في تصميم صفحات الويب والكتيبات والمنشورات الإعلانية، حيث يساهم الاستخدام الصحيح والمميز لهذا العنصر في تحقيق نقلة نوعية للعلامة التجارية وتمكين تأثيرها على الجمهور، بينما على الجانب الآخر سيسبب الاستخدام الخاطئ والتصميم السيئ إلى نفور الجمهور منها وعدم قبوله لأفكارها ورسائلها. المبادئ الأساسية لفن تصميم النصوص كما لتصميم الرسوميات مبادئ أساسية يجب مراعاتها واستخدامها استخدامًا صحيحًا لتحقيق الفائدة الأكبر من التصميم وإيصال الرسالة للجمهور، فإن فن تصميم النصوص له مبادئ يجب الانتباه لها ومراعاتها واستخدامها لتحقيق الاستفادة القصوى من تأثير النص والمحتوى على المشاهدين، ويتشارك فن النصوص عدة مبادئ مع تصميم الرسوميات. المحارف والخطوط Typeface and Fonts: يجب الانتباه جيدًا عند انتقاء نوعية الخط المستخدم بحيث يجب أن تكون مميزة للعلامة التجارية أو للهدف من التصميم، ويجب أن نستخدم عائلة الخط ذاتها في التصاميم المتعددة للهدف ذاته مثل تصميم الهوية البصرية لعلامة تجارية وتصميم المنشورات الترويجية على مواقع التواصل الاجتماعي، مع مراعاة وزن الخط وتأثيره النفسي على القارئ حيث يختلف تأثير الخط الثخين عن سواه على سبيل المثال، ويمكن استخدام خطوط من عائلات خطية مختلفة شريطة التوافق فيما بينها. وللعلم فقط فالمحرف هو نوعية الخط فقط مثل Arial والخط هو تفصيل نوعية الخط مثل Arial Bold 12point. انسيابية السطور Leading: وهي المسافة بين السطور بحيث يجب أن تكون موحدة وغالبًا ما تكون بارتفاع أعلى من ارتفاع خط النص نفسه. التتابع Letter Spacing: وهي المسافة الموجودة بين الكلمات في النصوص العربية وبين الحروف ذاتها في النصوص اللاتينية. طول سطر النص Line length: وهو الطول المستخدم لكل سطر في النص، فلا يجب أن يكون ممتدًا من بين حافتي التصميم ولا أن يكوّن من النص عمودًا نحيفًا. الهرمية Hierarchical: وهو نفس المبدأ الخاص بالتصميم ولكنه يتعلق هنا بالنص فقط، حيث يجب ترتيب النصوص بحسب الأهمية فيكون النص الأهم هو الأثقل من ناحية الوزن البصري مثل أن يكون أكبر حجمًا وأبرز لونًا وأثخن وغير ذلك، ثم النص الذي يليه من حيث الأهمية يجب أن يكون أخف من ناحية الوزن البصري، ثم الذي يليه وهكذا. اللون Color: يساعد على زيادة بروز النص وتأثيره مع الانتباه لقواعد الألوان وتطبيق أسسه الصحيحة على النص. المحاذاة Alignment: هو التأثير الأبرز في تحسين جماليات تصميم النصوص ويجب تطبيق المحاذاة على محور معين ضمن التصميم بطريقة مدروسة. التباين Contrast: لا يتعلق الأمر هنا بتباين ألوان النص مع محيطه أو مع بقية النصوص فقط، بل ويتعلق بتباين الأحجام والمسافات والمواقع أيضًا. أنواع الخطوط يوجد العديد من أنواع الخطوط المستخدمة في كتابة المحتوى وتصميم الرسوميات، وتتميز الحضارات المختلفة بفنون الكتابة اليدوية بحيث تتباهى بخطوطها الأصيلة المخطوطة يدويًّا وتعتبرها فنًا أصيلًا يمثّل ثقافة وماضي ومستقبل تلك الحضارة. إلا أنه فن يحتاج موهبة وتدريبًا وعملًا دؤوبًا حتى يصل الدارس فيه إلى مستوى الخطاط المتمكن، ويعد الخط العربي من أبرز فنون الكتابة اليدوية في التاريخ، حيث تزينت به المخطوطات والتصاميم المعمارية المختلفة، وإضافته إلى التصاميم الرسومية العربية يضيف جمالًا وطابعًا خاصًا لأي تصميم وخصوصًا في الشعارات والمنشورات الإعلانية. لكن فن الخط العربي اليدوي موهبة لا يتمتع بها الكثيرون، لذلك سنعتمد أكثر على الخطوط المصممة الجاهزة التي نستخدمها في الكتابة ضمن أجهزة الحاسوب وهي ما يطلق عليه مصطلح (الخطوط المحوسبة Computerized fonts)، ويوجد من هذه الخطوط أنواع وتختلف باختلاف اللغة المستخدمة أيضًا. الخطوط العربية تتألف الخطوط العربية من أنواع أساسية تتفرع عنها بقية الخطوط المعروفة وهي كثيرة ومن أهمها الكوفي، الثلث، النسخ، الفارسي، الديواني، الرقعة، المغربي والحر وغيرها الكثير، وسنتعرّف تاليًا على أهمها. الخط الكوفي: من أقدم الخطوط في بلاد العرب، ويمثل مظهرًا من مظاهر جمال الفنون العربية، وقد تسابق الكُتَاب في تطويره والتفنن في زخرفة حروفه، وله عشرات الأنواع المتفرعة عنه بما قد يتجاوز الخمسين نوعًا، من بينها البسيط، الفاطمي، الإيراني، المورّق، المزخرف، المعماري والكوفي المربع. هذه صور تمثل بعضًا من أنواع هذا الخط. وهنا بعض الخطوط الحاسوبية المشتقة من الخط الكوفي. خط الثلث: خط الثلث هو أصل الخطوط العربية وأجملها وأصعبها، استخدم في تزيين الجوامع والمحاريب والقباب وبدايات المصاحف، كما استخدم في عناوين الكتب، وأسماء الصحف والمجلات. وهذه بعض الخطوط الحاسوبية المشتقة من خط الثلث. خط النسخ: استخدم في كتابة المصحف الشريف بعد الخط الكوفي، ويتميز عن خط الثلث بأنه أكثر قاعدية وأقل صعوبة، فحروفه أصغر وأبسط في طريقة الكتابة، وهو أوضح في القراءة والكتابة. يعد الأكثر استخدامًا حاليًا في عالمنا المعاصر، بعد أن كتبت به المصاحف، كما اعتمدته دور النشر في كتابة نصوص الكتب والمخطوطات والمطبوعات، والصحف والمجلات، والكتابة الرقمية عبر برامج الحاسوب وصفحات الإنترنت. وهذه بعض الخطوط الحاسوبية المشتقة من خط النسخ. الديواني: يتميّز باستدارة حروفه وبمرونة التقاء الحروف وتلاصقها، فهو خط لين مطواع، وسهل الاستخدام. قام الأتراك بتطوير هذا الخط في عهد السلطان محمد الفاتح ووضعت قواعده بعد فتح القسطنطينية ببضع سنوات. وهذه بعض الخطوط الحاسوبية المشتقة من الخط الديواني. الفارسي: عُرف هذا الخط عند العرب بالخط الفارسي نسبةً للفرس وعرف عند الأتراك بخط التعليق وهو الخط الرئيسي في الهند وإيران وباكستان وأفغانستان. ويتميز بأن خطوطه ليست مستقيمة فكل الحروف بها انحناءات. وهذا خط حاسوبي مشتق من الخط الفارسي. الرقعة: يعد من أبسط الخطوط وأقلها تقييدًا فلا يوجد به الكثير من التحسينات الشكلية والتزيين، ولا الكثير من الميلان والتدوير، وهو من أحدث أنواع الخطوط العربية، ابتكره العثمانيون، ويتميز بالاستقامة والبساطة وسهولة الكتابة والقراءة والبعد عن التعقيد، وحروف هذا الخط قصيرة، وتستهلك مساحة صغيرة موازنة بأنواع الخطوط الأخرى. ونتيجة لهذه السمات فهو خط عملي واضح في كتابة اللافتات والدعاية والإعلان واستعمله الناشرون في كتابة عناوين الكتب والصحف والمجلات. وهذه بعض الخطوط الحاسوبية المشتقة من خط الرقعة. المغربي: انتشر الخط المغربي في شمالي أفريقيا، وله عدة أنواع وهي الكوفي المغربي، الثلث المغربي، المبسوط، المجوهر والمسند. وهذه بعض الخطوط الحاسوبية المشتقة من الخط المغربي. الحر: هو خط حديث لا يخضع لقواعد محددة، وإنما يخضع لذوق ورؤية كل خطاط أو مصمم، وقد قام بعض الخطاطين العرب بوضع قواعد للخط الحر، فيما تحفّظ آخرون على هذه القواعد باعتبار الخط حرًّا ولا يخضع لقواعد. يلجأ العديد من مصممي الإعلانات لاستخدام الخط الحر في تصميم شعارات الشركات لما له من جمالية ومرونة في تشكيل الشعار وتطويع حروفه لتشكيل لوحة فنية معبرة عن مضمون الشعار. وهذه بعض الخطوط الحاسوبية المشتقة من الخط الحر. الخطوط اللاتينية وهي الخطوط المستخدمة في اللغات الغربية مثل الإنجليزية والفرنسية وغيرها، ولهذه الخطوط أنواع أساسية يطلق عليها اسم عائلات الخطوط ويُشتق منها العديد من الخطوط، ومن أهم هذه الخطوط Serif وSans Serif وSlab Serif وScript وDecorative. Serif: تعد خطوط Serif تقليدية وسهلة القراءة للغاية، لذا فهي عادةً أفضل نوع من الخطوط لاستخدامها للعناوين والتصاميم الكبيرة، وهي شائعة لتصاميم شعارات العلامات التجارية، إلا أن ذلك لا ينطبق دائمًا على شاشات الهاتف المحمول. وكلمة Serif تعني تلك الأجزاء النافرة من الحروف بينما Sans Serif تعني عدم وجود تلك الأجزاء. استُخدم هذا النوع من الخطوط بما في ذلك جميع الخطوط التابعة لعائلته في العناوين و في شعارات علامات تجارية شهيرة مثل هاربرز بازار Harper’s Bazaar ومجلة إيللي Elle Magazine وجيورجيو أرماني Giorgio Armani. ومن أشهر الخطوط التابعة لعائلة Serif خطوط Garamond، Baskerville وDidot. بعض من خطوط Serif. Sans Serif: تزايدت شعبية هذه الخطوط بصورة كبيرة في السنوات الأخيرة، وتتميز بالشخصية الرئيسية دون أي حدود نهائية زخرفية. يُنظر إلى هذه الأنواع من الخطوط على أنها من أكثر خيارات الخطوط وضوحًا وبساطة وحداثة، وتعد أفضل خط يمكن استخدامه لقراءة النص على الشاشات. يسهل على الأجهزة عرض خطوطها الواضحة والحادة، وتظهر بوضوح على الشاشة البيضاء الساطعة. وقد استخدمت هذه العائلة من الخطوط مجموعة من العلامات التجارية الشهيرة أمثال تارجت Target وباناسونيك Panasonic وجيب Jeep وتويوتا Toyota، كما بدّلت جوجل Google شعارها من خط Serif إلى خط من Sans Serif عام 2015. من أشهر خطوط هذه العائلة Futura، Graphik، Circular و GT Americ. بعض من خطوط Sans Serif. Slab Serif: وهي فرع من عائلة خطوط Serif الشاملة التي تحدثنا عنها سابقًا. إلا أنها مربعة ومتكتّلة بشكل أكبر من خطوط Serif التقليدية، كما أنها أثخن وأكثر حداثة وتعد خيارًا جيدًا للعلامات التجارية التي تتميز بالجرأة والدرامية، ومن هذه العلامات التجارية هوندا Honda، سوني Sony وفولفو Volvo. ومن أشهر الخطوط التي تنتمي لهذه العائلة Sentinel، Adelle، Shift و Bodoni Egyptian. بعض من خطوط Slab Serif. Script: هو خط يتميز بالرسمية والشكليات ويحاكي الكتابة بخط اليد إلى حد ما. ويتوفر منه خطوط ذات ميزات متنوعة من الخيالي والمتطور إلى العصري والمريح. يعد من أقل الخطوط استخدامًا في التصاميم كونه لا يناسب النصوص الطويلة، لكنه جيد إلى حد ما في العناوين والشعارات. ومن أشهر العلامات التي تستخدم هذه النوعية من الخطوط إنستغرام Instagram، بي إنترست Pinterest، كوكاكولا Coca-Cola وكاديلاك Cadillac. ومن أشهر الخطوط التي تنتمي لهذه العائلة Southern Aire، Milles، French Script و Billenia. بعض من خطوط Script. Decorative: وتعني الخطوط الزخرفية، وهي مميزة في التصاميم الزخرفية والفنية أكثر مما تستخدم في النصوص والعناوين، وتستخدم في الشعارات والمنشورات الإعلانية كنوع من التزيين، وغالبًا ما تكون من أكبر عناصر التصميم لإبراز زخارفها. لها نمطان منتشران وهما النمط القديم التاريخي والحديث المستقبلي. ومن أشهر الشعارات التي استخدمت هذه الخطوط تويز آر أس Toys R Us، ليجو Lego وفانتا Fanta. ومن أشهر خطوط هذه العائلة Helios وThe Roseberry وMotters و Xaviera. بعض من خطوط Decorative. قواعد تصميم النص وتتضمن التطبيق العملي لمبادئ تصميم النص مع الإشارة إلى أهم ما يجب اتباعه في عملية التصميم. التقنين Kerning ويقصد بهذا المصطلح ضبط المسافة بين الحروف، قد يبدو لك أن هذا الأمر مستبعد للنصوص العربية ومنتشر في النصوص اللاتينية، هذا صحيح نسبيًا، ولكن أحيانًا قد يضيف المصمم إطالات غير ضرورية على النص ظنًّا منه أنه يملأ مساحة التصميم بطريقة جميلة إلا أنه فعليًّا يدمّر التصميم، فكلمة (دليل) المكتوبة بهذه الطريقة أجمل بكثير من الطريقة التالية (د لـــيــــــــــل) وخصوصًا ضمن التصاميم الفنية، كما أن بعض المصممين لا ينتبهون لتفاصيل دقيقة وهم في عجالة من أمرهم مثل مسألة المسافة الفاصلة بين الحروف والتي يتم ضبطها من أدوات النصوص في برامج التصميم المختلفة، وهذه أمثلة عن ما نتحدث عنه. انعدام التقنين عبر زيادة التباعد في الحروف يؤدي إلى تصميم سيء وطبعًا تبقى مسألة مراعاة التقنين في النصوص العربية نادرة الحدوث إذا ما قارنّاه بالنصوص اللاتينية، حيث تستخدم الحروف المنفصلة في الكتابة وهو ما يسبب مشاكل كثيرة في ضبط التقنين، فيجب مراعاة المسافة بين الحروف بدقة وتوازن. خبراء التصميم يصرّون أنه لا يجب أن نعتمد على التقنين الآلي لبرامج التصميم المختلفة وأنه يجب علينا تقنين النصوص بأنفسنا وخصوصًا لنصوص العناوين والنصوص كبيرة الحجم، لأن مشاكل التقنين تبرز واضحة بها أكثر من النصوص صغيرة الحجم. يمكنك أن تدرّب نفسك على التقنين الصحيح من خلال موقع KERNTYPE والذي يمنح درجات تقديرية لقاء صحة عملية التقنين التي تنفذها. صورة توضح النص بدون ومع تقنين – الصورة من مدونة خطوط أدوبي التواصل بين الخطوط Font Communication إن أسوأ ما يقوم به المصمم لاختيار الخطوط المناسبة للتصميم هو البحث العشوائي أو استعراض كافة الخطوط في مكتبة الخطوط المتوفرة على حاسوبه، لأن ذلك سيبعثر أفكاره ويشتت تركيزه على الاختيار الصحيح للخطوط خصوصًا إن كان يعمل على تصميم يتضمن أكثر من نص منفصل وعليه اختيار نوعية خط لكل نص. في هذه الحالة يجب التركيز على أن تكون الخطوط من نمط متماثل، مثل أن تكون من نفس عائلة الخطوط كالخطوط المغربية أو الكوفية، أو أن تكون من نفس أسلوب الخط كخطوط قديمة تاريخية أو خطوط عصرية، وهو ما يحقق التواصل بين الخطوط ويبقي التصميم متناسقًا ومتجانسًا. في الصورتين التاليتين مثالين عن الاختيار السيء والاختيار الصحيح لنمط الخطوط. لاحظ الخط المستخدم في العنوان غير ملائم لمعنى النص وغير متناسق مع الخط المستخدم في العنوان الثاني الخطوط هنا ملائمة للمحتوى ومتناسقة مع بعضها بالنسبة لكلا العنوانين تطبيق المحاذاة Alignment المحاذاة من المبادئ المهمة في تصميم الرسوميات وفي قواعد استخدام النص وأسلوب الطباعة في التصميم. تطبيقه بطريقة صحيحة ينتج جمالية ومثالية في التصميم، وعدم تطبيقه يؤدي إلى تصميم غير مريح. يجب تطبيق المحاذاة على محور محدد من قبل المصمم مهما كان اتجاه هذا المحور أو زاوية ميلانه. في المثالين التاليين تظهر لنا أهمية تطبيق المحاذاة على النصوص في التصميم. تطبيق المحاذاة بطريقة صحيحة منح تصميم النص أناقة وجمالية وراحة للنظر عدم تطبيق المحاذاة أساءت للتصميم ككل وأصبح غير مريح للنظر تطبيق مبدأ الهرمية Hierarchy سبق وأن تحدثنا عن هذا المبدأ مرارًا وهو الذي يؤدي إلى توجيه المشاهد ضمن مساحة التصميم من الأهم إلى الأقل أهمية، ولعل أكثر ما ينطبق عليه هذا المبدأ هو عنصر النص، حيث يجب أن يكون العنوان الرئيسي هو الأكثر بروزًا وظهورًا وجذبًا للانتباه لأنه الأهم بين باقي النصوص، ثم تتالى بقية النصوص في الحجم والموضع من حيث الأهمية. لاحظ التدرج من حيث الأهمية من العنوان الرئيسي بالتتالي. أهمية الحجم Size من العوامل المهمة لنجاح تصميم ما لغرض ترويجي وإعلاني جذب انتباه المشاهد على الفور، ففي أفضل الأحوال لديك ثانية أو ثانيتين لجذب انتباه شخص ما في عالم الطباعة، إذا فاتتك هذه الفرصة، فقد فقدت عميلك المحتمل. في المثال التالي صممت إعلانًا ترويجيًا بنمطين، الأول في الأعلى بدون مراعاة مسألة الحجم، حيث كان النص بالكامل بنفس الحجم، ولمعرفة مضمون رسالة التصميم يجب عليك قراءة كامل المحتوى، فلو كان المحتوى أطول فإن هناك احتمالًا كبيرًا أن يصاب العميل بالملل ويغادر دون المتابعة وبذلك لن تصله الرسالة. ركّزت في التصميم الثاني في الأسفل على زيادة حجم النص الأهم وهو (الربح) والذي يجذب اهتمام المشاهد على الفور ويفهم الرسالة بدون قراءة كامل المحتوى، إلا أن جذب الاهتمام هذا، سيجبر المشاهد على قراءة كامل المحتوى رغبة منه في معرفة التفاصيل وعندها تصله الرسالة كاملة. لاحظ المثال في الأعلى غير مثير للاهتمام بينما في المثال الثاني في الأسفل الأمر مختلف مع أن المحتوى متطابق تمامًا. التركيز في الفقرات النصية Emphasis عندما تصمم موقعًا على الويب أو نشرة إعلانية تتضمن نصوصًا طويلة أو فقرات نصية كبيرة نسبيًا، يجب أن نتجنب حالة الملل التي قد يشعر بها القارئ نتيجة طول الفقرة ومن ثم حالة هروب القارئ بسبب الملل وعدم إكماله القراءة وبالتالي عدم وصول الرسالة كاملة وصحيحة إليه. لذلك يجب إحداث بعض التعزيزات على النص من خلال التركيز على النقاط المهمة ضمن النص، ويمكن إحداث ذلك عبر زيادة وزن الخط (ثخين) أو إمالته أو حتى تغيير لونه، وبذلك نحقق التركيز وجذب الاهتمام ونبعد الملل عن القارئ. في المثال التالي استخدمت النص ذاته مرتين، في الأولى لم أطبق التركيز ضمن النص، بينما استخدمت التركيز في الثانية والذي يبدو أكثر إثارة للاهتمام، ويشد القارئ إلى متابعة قراءته عكس الأولى. لاحظ أن النص العلوي ممل وغير مثير للاهتمام بعكس السفلي – النص مقتبس من ويكيبيديا تجنب المسافات الزائدة Distances قد يلجأ بعض المصممين أثناء كتابة نص فقرة إعلانية أو منشور إعلاني إلى فكرة توسيع المسافات بين الكلمات لملء مساحة التصميم، خصوصًا إذا كان النص قليلًا ولا يكفي لملء مساحة التصميم. يعد هذا الأمر خطأً كبيرًا، إياك والوقوع فيه، إذ ينم ذلك عن قلة معرفة وخبرة في التصميم ويجعل المنشور أو الإعلان رديء المنظر. إن كان لديك نقص في المحتوى وتوجد مساحة فارغة ضمن التصميم فاستغل تلك المساحة بخلفية ملونة أو صورة أو عنصر رسومي، فذلك أفضل ويُشعر المشاهد للنص بالراحة أكثر. لاحظ النص العلوي غير مريح للنظر وللقراءة معًا ويشعرك بالغرابة – النص مقتبس من ويكيبيديا تجنب الأرامل النصية والأيتام النصية هذان المصطلحان مستخدمان بكثرة في الأوساط الغربية وتحديدًا بين المصممين وكتّاب المحتوى. ما المقصود بهذين المصطلحين؟ عندما تكتب فقرة ما في التصميم ثم تنتهي المساحة المحددة طوليًّا لكتابة الفقرة مثل مربع نصي أو ما شابه وتضطر للمتابعة بالكتابة عبر الانتقال لعمود نصي أو مربع نصي جديد، ويكون هناك سطر أو سطرين فقط في المساحة النصية الجديدة، فهذه تسمى بالأرامل النصية. وعندما تكون هذه الفقرة الزائدة مجرد كلمة أو كلمتان، فهذه تسمى بالأيتام النصية. وتجنب هذه الحالتين بسيط، إما عبر التلاعب بالنص نفسه أو بالمسافة النصية كزيادة العرض قليلًا أو زيادة الطول إن أمكن، أو التلاعب بحجم النص بمقدار قليل، إلى أن تختفي هذه الظاهرة وتحل المشكلة. لاحظ الأيتام النصية (1) في الصفحة اليسرى والأرامل النصية في اليمنى (2) وهو ما يجب تجنبه. تجنب الأخطاء الإملائية واللغوية أهم ما يجب أن ننتبه له نحن معشر المصممين في التصاميم ذات المحتوى الكثيف نسبيًا حتى وإن كان سطرًا واحدًا، هو الانتباه إلى الأخطاء الإملائية واللغوية، لأن ذلك قد ينسف تصميمك كله في حال الوقوع في خطأ من هذا النوع وخصوصًا في اللغة العربية. لذلك يجب أن نهتم بثقافتنا اللغوية وأن نتابع دومًا كل المعلومات المتعلقة باللغة العربية وقواعدها مثل أنواع الجمل والأزمنة والهمزات والجمع والتثنية وقواعد التشكيل المختلفة وغيرها. لاحظ الفرق الشاسع بين الإعلانين من حيث التدقيق اللغوي، أنت بالتأكيد لن تتقبل الإعلان الأول بسلاسة. خاتمة لاحظنا كيف أن النص وأسلوب الطباعة له تأثير هائل على جودة التصميم وإيصال الرسالة بأفضل طريقة ممكنة إلى الجمهور، ولكن حتى نتمكن من استخدام عنصر النص وأسلوب الطباعة بالطريقة الأمثل لتحقيق الهدف علينا مراعاة مبادئ وقواعد استخدامها، وتجنب المحاذير والأخطاء التي قد تؤدي إلى عكس النتيجة المرجوة من الإعلان، بحيث تؤدي إلى نفور الجمهور بدلًا من جذبهم وإثارة اهتمامهم بالتصميم وإيصال الرسالة. مع ذلك فإن مراعاة القواعد وتطبيق المبادئ وتجنب الأخطاء ليس صعبًا ومن اليسير القيام بذلك بمجرد التركيز قليلًا على هذه القواعد والمبادئ.1 نقطة