Hello our valued visitor, We present you the best web solutions and high quality graphic designs with a lot of features. just login to your account and enjoy ...

<none>

Hello our valued visitor, We present you the best web solutions and high quality graphic designs with a lot of features. just login to your account and enjoy ...

CAPTCHA
This question is for testing whether or not you are a human visitor and to prevent automated spam submissions.
9 + 4 =
Solve this simple math problem and enter the result. E.g. for 1+3, enter 4.

أخبار تكنلوجيا

رقم الخبر عنوان الخبر التفاصيل
35,820 صراع آخر يخوضه ترمب مع عصفوره الأزرق المفضل

"تويتر" والرئيس الأميركي مجدداً.. فمع احتدام التنافس في الانتخابات الرئاسية الأميركية، جولة جديدة من تبادل الاتهامات بين "تويتر" والرئيس دونالد ترمب.

وليس المشهد الانتخابي الأميركي فقط هو محور اهتمام العالم هذه الأيام، فللصراع بين "تويتر" والرئيس الأميركي، دونالد ترمب، جمهور ومتابعون وفصول ليست بجديدة.

فخلال الـ24 ساعة الماضية، حذر "تويتر" من 5 تغريدات للرئيس الأميركي ترمب، معتبراً أنها مضللة أو متنازع عليها.

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

استعجال ترمب في إعلان النتائج الانتخابية خطوة لم يرتكبها منافسه جو بايدن، المتهم بتلقي الدعم المعنوي من "تويتر".

وكان "تويتر" قد دخل في تحد مع تغريدات ترمب في شهر مايو الماضي، واختلف معه مرارا وتكرارا منذ ذلك الحين.

عطّل الموقع المفضل عند الرئيس الأميركي تغريداته أو منع التعليق عليها عدة مرات، بسبب شكاوى تتعلق بحقوق النشر أو انتهاكات لسياسة المنصة المتعلقة بالتهديد بالعنف.

كما أزال صورة غرّد بها الرئيس ترمب في 30 يونيو، بسبب شكوى من صحيفة "نيويورك تايمز" New York Times، زعمت فيها أن الصورة تعود ملكيتها لمصور يعمل لديها.

ووضع "تويتر" تغريدة من الرئيس ترمب خلف علامة تحذيرية في أواخر شهر مايو على خلفية الاحتجاجات على وفاة جورج فلويد.

وبانتظار الإعلان الرسمي عن النتائج من المرجح أن يتفاقم هذا الصراع في الأيام المقبلة، خاصة أن بوادر المواجهة في المحاكم بدأت تلوح في الأفق.

35,803 آبل تتيح طلب آيفون 12 برو ماكس وهوم بود ميني

بدأت شركة آبل اليوم الجمعة بقبول الطلبات الأولية لهاتفي (آيفون 12 برو ماكس) iPhone 12 Pro Max، و(آيفون 12 ميني) iPhone 12 Mini، بالإضافة إلى مكبر الصوت الذكي الجديد (هوم بود ميني) HomePod Mini التي سيُباع بسعر 99 دولارًا أمريكيًا.

وهذه هي السنة الأولى التي تطرح فيها شركة آبل أربعة طرز مختلفة من هاتف آيفون في الوقت نفسه، فأطلقت هاتفي (آيفون 12)، و(آيفون 12 برو) في شهر تشرين الأول/ أكتوبر الماضي، وهاتفي (آيفون 12 برو ماكس)، و(آيفون 12 ميني) في شهر تشرين الثاني/ نوفمبر الجاري. ويُعزى التأخير في إطلاق هاتف آيفون التقليدي من شهر أيلول/ سبتمبر إلى تشرين الأول/ أكتوبر إلى الانتشار المستمر للفيروس التاجي المستجد (كوفيد-19) COVID-19.

وانخفضت عائدات هواتف آيفون بنسبة 20.7 في المئة على أساس سنوي خلال الربع الأخير من السنة المالية لشركة آبل، ويرجع ذلك إلى حد كبير إلى أن أجهزة آيفون الجديدة لم تكن متاحة للشراء بعد. ولن يعرف المستثمرون مدى شعبية أحدث الأجهزة حتى يُعلن عن نتائج الربع الأول من العام المالي 2021.

ويبدأ سعر هاتف (آيفون 12 برو ماكس) من 1,099 دولارًا، وهو يمتاز بأكبر شاشة على الإطلاق في هواتف آيفون، ويتضمن بعض الميزات الإضافية مقارنةً بهاتف (آيفون 12 برو) الذي يبدأ سعره من 999 دولارًا أمريكيًا، مثل أداء الكاميرا المحسن في الإضاءة المنخفضة.

ويقدم هاتف (آيفون 12 ميني) العديد من الميزات نفسها التي يوفرها هاتف (آيفون 12) ولكن بحجم أصغر قد يجذب المزيد من الأشخاص الذين لا يريدون هاتفًا كبيرًا، ثم إنه الخيار الجديد الأقل تكلفة ويبدأ سعره من 699 دولارًا.

وبعد الحدث الذي نظمته شركة آبل في شهر تشرين الأول/ أكتوبر الماضي، قال بعض المحللين: إن شركة آبل أخفقت في شرح السبب الذي قد يدفع المستهلكين لشراء طُرز (برو) الأعلى سعرًا بدلًا من (آيفون 12) العادي.

ويعتقد أن مكبر الصوت الذكي الصغير الجديد (هوم بود ميني) قد يساعد آبل في المنافسة على نحو أكثر فعالية ضد شركتي أمازون، وجوجل في سوق السماعات الذكية. ولا يزال جهاز (هوم بود) الأصلي يُباع بسعر 299 دولارًا، أما الجهاز الجديد فسيُباع بسعر 99 دولارًا فقط، وهو السعر ذاته الذي تُباع به أجهزة، مثل: (إيكو) Echo من أمازون، و(نست) Nest من غوغل.

يُذكر أن أجهزة (آيفون 12 برو ماكس)، و(آيفون 12 ميني) ستصل إلى المتاجر اعتبارًا من 13 تشرين الثاني/ نوفمبر الجاري، في حين سيصل مكبر الصوت الذكي (هوم بود ميني) HomePod Mini إلى المتاجر اعتبارًا من 16 تشرين الثاني/ نوفمبر الجاري.

35,802 ما وراء الطبيعة: نتفلكس Netflix توفر أول مسلسل مصري من إنتاجها للمشاهدة

هذا المقال تم نشره بواسطة صدى التقنية صدى التقنية
رابط المقال ما وراء الطبيعة: نتفلكس Netflix توفر أول مسلسل مصري من إنتاجها للمشاهدة

وفرت نتفلكس Netflix حلقات الموسم الأول من مسلسل ما وراء الطبيعة للمشاهدة للمستخدمين عالميا، ويعتبر مسلسل الرعب والخيال العلمي ما وراء الطبيعة أول مسلسل مصري من إنتاج الشركة العالمية الرائدة في بث المحتوى الترفيهي عبر الإنترنت، وهو المسلسل المستوحى من روايات الكاتب المصري الراحل أحمد خالد توفيق التي تحمل نفس الاسم، والتي تعتبر من أكثر الروايات مبيعا، كما أنها من الروايات التي أثرت على ملايين الشباب في مصر خلال مرحلة الطفولة. 

6 حلقات مستوحاة من الأساطير في السلسلة الأصلية 

ويشمل الموسم الأول من مسلسل ما وراء الطبيعة من إنتاج نتفلكس على 6 حلقات، تبدأ بـ “أسطورة البيت” وتنتهي بحلقة “أسطورة العودة للبيت”، كما تضم حلقات مثل “أسطورة الجاثوم” و “أسطورة النداهة”، وتقدم كل حلقة قصة مستقلة بذاتها مستوحاة من واحدة من الأساطير في سلسلة الروايات الأصلية، لكن جميع الحلقات مترابطة من خلال عنصر واحد مشترك وهو “بيت الخضراوي”. 

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

ما وراء الطبيعة هو أول مسلسل مصري يتضمن أوصافا صوتية ومكتوبة لذوي الإعاقة

ويتوفر مسلسل Paranormal الآن للمشاهدة عبر نتفلكس في 190 دولة حول العالم، كما يتوفر بأكثر من 32 لغة مختلفة، وقالت نتفلكس أنها ستوفر دبلجة المسلسل بـ 9 لغات مختلفة تشمل الإنجليزية والإسبانية والفرنسية والتركية والألمانية، كما قالت أن المسلسل سيكون أول مسلسل مصري يتضمن أوصافا صوتية ومكتوبة لذوي الإعاقة.

انتقادات للمخرج بعد نشر قواعد لمشاهدة المسلسل 

وكان عمر سلامة مخرج ومؤلف مسلسل Paranormal المصري الأول من إنتاج نتفلكس قد أثار الجدل على الشبكات الاجتماعية، وذلك بعد أن نشر ما يشبه قواعد للمشاهدين عليهم الالتزام بها عند مشاهدة المسلسل، والتي تضمنت قواعد غريبة مثل عدم الأكل في أثناء المشاهدة وضرورة المشاهدة على شاشة كبيرة أو من خلال التلفزيون وليس الهاتف أو التابلت، وهو ما نتج عنه موجه من الانتقادات والسخرية من المخرج، بالإضافة لتدقيق من المشاهدين لتصيد الأخطاء بعد عرض المسلسل. 

هذا المقال تم نشره بواسطة صدى التقنية صدى التقنية
رابط المقال ما وراء الطبيعة: نتفلكس Netflix توفر أول مسلسل مصري من إنتاجها للمشاهدة

35,772 تويتر توقف حساب ستيف بانون مستشار ترامب السابق بعد التحريض على العنف

هذا المقال تم نشره بواسطة صدى التقنية صدى التقنية
رابط المقال تويتر توقف حساب ستيف بانون مستشار ترامب السابق بعد التحريض على العنف

أوقفت تويتر Twitter اليوم حساب ستيف بانون المستشار السابق للرئيس الأمريكي الحالي دونالد ترامب، وذلك بعد التحريض على العنف تجاه الدكتور أنتوني فاوتشي الذي يقود إجراءات مكافحة تفشي وباء كوفيد-19 في الولايات المتحدة وكريستوفر وراي رئيس مكتب التحقيقات الفيدرالي، حيث طالب ستيف بانون بقطع رأس كليهما في مقطع فيديو نشره عبر حساباته على فيسبوك وتويتر ويوتيوب.

وأدعى بانون فوز الرئيس دونالد ترامب في انتخابات الرئاسة الأمريكية 2020، على رغم من تقدم منافسه جو بايدن مرشح الحزب الديمقراطي في السباق نحو البيت الأبيض، وقال أنه يجب أن يقيل كل من فاوتشي وراي، ثم تمادى بانون ودعا لقطع رؤوس البروقراطيين مثل الدكتور فاوتشي وكريستوفر راي.

حرض ستيف بانون على العنف تجاه الدكتور أنتوني فاوتشي  

وبث بانون الفيديو على صفحته على فيسبوك واستمر لمدة حوالي 10 ساعات تقريبا، ليشاهده حوالي 200 الف مستخدم قبل أن تزيله فيسبوك، مشيرا إلى أنه يخالف سياسات فيسبوك ضد العنف والتحريض، كما أزالت يوتيوب الفيديو لانتهاكه سياساتها، وقالت تويتر أنها علقت حساب ستيف بانون نهائيا لتمجيد العنف والتحريض عليه، وحظرت منصة الرسائل الإخبارية عبر البريد الإلكتروني Mailchimp أيضا حساب Bannon لانتهاكه شروط الخدمة، وهو ما من شأنه الحد من قدرة مستشار الرئيس الأمريكي دونالد ترامب في الترويج لرسائله والوصول إلى المؤيدين. 

وتأتي تعليقات Bannon في الوقت الذي استخدم فيه مؤيدو الرئيس ترامب خطابا عنيفا لدعم مزاعم ترامب التي لا أساس لها من الصحة بشأن تزوير الانتخابات، حسب CNN، ودعا دونالد ترامب جونيور في تغريدة عبر حسابه في تويتر والده بشن حرب شاملة بشأن الانتخابات، كما كرر ترامب الابن عدة مزاعم لا أساس لها من الصحة تقوض نزاهة الانتخابات في تغريدة وصفها تويتر بأنها مضللة. 

وكانت تيك توك TikTok قد حذفت الوسوم التي تروج لمعلومات مضللة عن الانتخابات الأمريكية 2020، كما حذفت فيسبوك أيضا مؤخرا الوسوم التي تنشر نظريات مؤامرة حول الانتخابات، وقيدت تويتر تغريدات الرئيس الأمريكي دونالد ترامب التي تتضمن معلومات مضللة حول الانتخابات، وذلك لضمان عدم انتشارها عبر تويتر.

هذا المقال تم نشره بواسطة صدى التقنية صدى التقنية
رابط المقال تويتر توقف حساب ستيف بانون مستشار ترامب السابق بعد التحريض على العنف

35,771 بناء تطبيقات ذات صفحة واحدة باستخدام التوجيه Routing في Vue.js

سنتعلّم في هذا الدرس:

  • بناء هيكل التطبيق والتعرّف على أجزاءه الرئيسية.
  • تحويل التطبيق الموجود في الدرس السابق إلى تطبيق SPA.

سنتعلّم في هذا الدرس كيفية بناء تطبيقات تعتمد على صفحة واحدة فقط (Single Page Applications) أو اختصارًا SPA. توفّر Vue.js هذه الإمكانية من خلال مكتبة اسمها vue-router تسمح بتعريف مسارات داخلية ضمن التطبيق بهدف دعم مفهوم SPA. وتطبيقات SPA هي تطبيقات ويب عادية، لكنّها تختلف عن التطبيقات الكلاسيكية في أنّ الانتقال من صفحة إلى أخرى ضمن الموقع لا يحتاج إلى إعادة تحميل كامل الصفحة بما تحويه من ملفات شيفرة نصية وصور وغيرها من أصول الموقع. فالذي يحدث في تطبيقات SPA هو أنّ جميع الواجهات المفترض وجودها في الموقع ستكون معرّفة مسبقًا ومحمّلة إلى حاسوب المستخدم، فيعمل تطبيق SPA فقط على استبدال واجهة مكان واجهة أخرى دون الحاجة إلى تحميل الصفحة كاملةً من الخادوم.

يرتبط هذا الدرس ارتباطًا وثيقًا بالدرس السابق لأنّه سيعمل على تحويل التطبيق المعتمد في الدرس السابق إلى تطبيق يدعم SPA لذلك أنصحك بمراجعة الدرس السابق قبل الاستمرار في هذا الدرس. على أية حال، أرجو أن يكون هذا الدرس ممتعًا ومفيدًا.

بناء هيكل التطبيق والتعرّف على أجزاءه الرئيسية

بنينا في الدرس السابق تطبيق تجريبي بسيط، هدفه التواصل مع قاعدة بيانات موجودة على الـ Firebase، ولعلّك تذكر، أنّني قد أشرت في ذلك الدرس إلى أنّ الأسلوب الذي اتبعناه في بناء ذلك التطبيق لم يكن عمليًّا بسبب أنّنا قد "حشرنا" جميع وظائف التطبيق ضمن واجهة واحدة وهذا أمر غير عملي بالطبع. حان الآن إصلاح ذلك العيب وذلك باستخدام تقنية SPA. سنحوّل جميع وظائف التطبيق السابق إلى تطبيق جديد سنبنيه في هذا الدرس.

لنبدأ بإنشاء هيكل التطبيق الجديد بتنفيذ الأمر التالي ضمن موجّه الأوامر:

vue create vue-spa

لكي ننجز مفهوم SPA في تطبيقنا هذا، سنستخدام تقنية التوجيه (Routing) التي عن طريق المكتبة vue-router كما أشرنا قبل قليل. استخدم الأمر التالي لتنصيب المكتبة vue-router:

npm install vue-router

افتح مجلّد التطبيق باستخدام Visual Studio Code ثم احذف الملف HelloWorld.vue. سنحتاج إلى إنشاء مجموعة جديدة من الملفات والمجلّدات من أجل هذا التطبيق. انقر الآن بزر الفأرة الأيمن على المجلّد src واختر New Folder لإنشاء مجلّد جديد سمّه views. سنستخدم هذا المجلّد لتخزين الواجهات المختلفة للتطبيق الخاص بنا. أنشئ ضمن المجلّد views الذي أنشأناه توًّا الملفات التالية: AddUser.vue و EditUser.vue و AllUsers.vue و Home.vue. أنشئ أيضًا الملف routes.js ضمن المجلّد src. الملف routes.js سيحتوي على مسارات العناوين الداخلية التي سنستخدمها ضمن التطبيق.

ستحصل بالنتيجة على البنية التالية من الملفات:

تحويل التطبيق الموجود في الدرس السابق إلى تطبيق SPA

لكي نبدأ باستخدام التوجيه، يجب أولًا أن نستورد المكتبة vue-router عن طريق عبارة الاستيراد التالية:

import VueRouter from "vue-router";

سنضع هذه العبارة (وبشكل مختلف عما اعتدنا عليه) ضمن الملف routes.js وسأوضّح سبب ذلك بعد قليل. انظر الآن إلى محتويات الملف routes.js:

import Vue from "vue"; import VueRouter from "vue-router"; import Home from "./views/Home"; import AddUser from "./views/AddUser"; import EditUser from "./views/EditUser"; import AllUsers from "./views/AllUsers"; Vue.use(VueRouter); const routes = [ { path: "/", name: "Home", component: Home }, { path: "/AddUser", name: "AddUser", component: AddUser }, { path: "/EditUser", name: "EditUser", component: EditUser }, { path: "/AllUsers", name: "AllUsers", component: AllUsers }, ]; const router = new VueRouter({ routes }); export default router;

أوضحنا قبل قليل، أنّ وظيفة الملف routes.js هي تعريف مسارات العناوين الداخلية التي سنستخدمها ضمن التطبيق. لننظر الآن إلى القسم الخاص بتعليمات الاستيراد:

import Vue from "vue"; import VueRouter from "vue-router"; import Home from "./views/Home"; import AddUser from "./views/AddUser"; import EditUser from "./views/EditUser"; import AllUsers from "./views/AllUsers";

أعتقد أنّ أوّل تعليمتين واضحتين. بالنسبة للتعليمات الأربع الأخرى، فهي لاستيراد الواجهات التي سنستخدمها في التطبيق. هذه الواجهات هي بطبيعة الحال مكوّنات (لأنّها موجودة ضمن ملفات تحمل الامتداد vue).

بعد ذلك نُخبر Vue.js أن يستخدم التوجيه من خلال التعليمة التالية:

Vue.use(VueRouter);

وبعد ذلك نصل إلى القسم الخاص بتعريف المسارات:

const routes = [ { path: "/", name: "Home", component: Home }, { path: "/AddUser", name: "AddUser", component: AddUser }, { path: "/EditUser", name: "EditUser", component: EditUser }, { path: "/AllUsers", name: "AllUsers", component: AllUsers }, ];

لاحظ معي أننا نضع المسارات التي سنستخدمها في التطبيق ضمن مصفوفة اسمها routes. كل عنصر من هذه المصفوفة عبارة عن كائن له الحقول: path و name و component. انظر مثلًا إلى الكائن الأوّل من هذه المصفوفة:

{ path: "/", name: "Home", component: Home }

يمثّل هذا الكائن المسار الخاص بالصفحة الرئيسية للتطبيق. فهو يُعرّف المسار الخاص بها ليكون / ويمثّل الصفحة الرئيسية في تطبيقات الويب عادة. أي يمكن الوصول إلى هذه الواجهة من خلال الرابط التالي:

http://www.yourdomain.com/#/

أمّا اسم هذا المسار فهو Home (من الممكن أن نصل إلى أي مسار من خلال اسمه كما سنرى لاحقًا في هذا الدرس). بالنسبة للواجهة التي سترتبط بهذا المسار فهي Home (انظر إلى تعليمة الاستيراد الخاصة بالواجهة Home.vue).

بالنسبة لباقي المسارات فتعمل بنفس الأسلوب تمامًا، فإذا أخذنا مثلًا المسار الثاني فنجد أنّ المسار الذي يُشير إليه هو ‎/AddUser أي أنّنا نستطيع الوصول إليه عن طريق رابط مماثل لما يلي:

http://www.yourdomain.com/#/AddUser

نأتي إلى القسم التالي في الشيفرة البرمجية السابقة، حيث سنعرّف متغيّر جديد اسمه router ونسند إليه كائن جديد يمثّل الموجّه الذي سيدير عمليّات التوجيه ضمن التطبيق:

const router = new VueRouter({ routes });

لاحظ كيف مرّرنا المصفوفة التي عرفنا ضمنها المسارات توًّا إلى VueRouter (وهو معرّف ضمن إحدى تعليمات الاستيراد). وأخيرًا نضع التعليمة المسؤولة عن تصدير الموجّه router خارج هذا الملف.

لننتقل الآن إلى الملف main.js:

import Vue from 'vue' import App from './App.vue' import router from './routes.js' import "bootstrap/dist/css/bootstrap.min.css"; import VueResource from 'vue-resource'; import VueSimpleAlert from "vue-simple-alert"; Vue.config.productionTip = false Vue.use(VueResource); Vue.use(VueSimpleAlert); new Vue({ router, render: h => h(App), }).$mount('#app')

نستورد ضمن هذا الملف المكتبات التي سنحتاجها ضمن التطبيق. أعتقد أنّ أوّل تعليمتي استيراد واضحتين أيضًا. بالنسبة للتعليمة الثالثة، فهنا نستورد الموجّه router التي بنيناه مسبقًا ضمن الملف routes.js، أمّا بالنسبة للتعليمات الثلاث الباقية فهي على الترتيب:

  • استيراد مكتبة Bootstrap للتنسيق.
  • استيراد المكتبة vue-resource للاتصال بالخواديم البعيدة، والتي تعاملنا معها في الدرس السابق.
  • استيراد مكتبة جديدة اسمها vue-simple-alert لم نتعامل معها مسبقًا. والهدف منها عرض رسائل ذات تنسيق جميل للمستخدم، سنتعلّم بعد قليل كيفية التعامل معها.

ستحتاج بالتأكيد إلى تنصيب المكتبة vue-simple-alert بتنفيذ الأمر التالي ضمن موجّه الأوامر:

npm install vue-simple-alert

لاحظ الآن التعليمتين التاليتين:

Vue.use(VueResource); Vue.use(VueSimpleAlert);

هاتين التعليمتين لإخبار Vue.js أن يستخدم الكائنين: VueResource و VueSimpleAlert. نأتي الآن إلى آخر تعليمة ضمن هذا الملف:

new Vue({ router, render: h => h(App), }).$mount('#app')

التعليمة السابقة مألوفة، وقد استخدمنا مثلها مرارًا، ولكن لاحظ معي هنا كيف أضفت كائن الموجّه router إليها. هذه الإضافة ضرورية، ولن يعمل التوجيه في التطبيق ما لم نضف كائن الموجّه بهذه الصورة.

سنستعرض فيما يلي الملف App.vue بالإضافة إلى ملفات واجهات التطبيق.

الملف App.vue

ستكون محتويات هذا الملف على الشكل التالي:

<template> <div id="app"> <nav id="nav"> <p class="logo-place">Vue.js Remote Server (Enhanced)</p> <ul class="nav-links"> <li class="links"> <router-link to="/">Home</router-link> </li> <li class="links"> <router-link to="/AddUser">Add User</router-link> </li> <li class="links"> <router-link to="/AllUsers">All User</router-link> </li> </ul> </nav> <router-view></router-view> </div> </template> <script> export default { name: "App", components: {}, }; </script> <style> #nav { display: flex; margin-bottom: 24px; } #nav a { font-weight: bold; color: #2c3e50; text-decoration: none; margin-right:12px; } #nav a.router-link-active { color: #ab26ab; } .nav-links { padding-right: 20px; list-style: none; display: flex; margin:21px 0 0 0; } .links-hover { text-decoration: underline; } .logo-place { font-size: 20px; color: purple; font-weight: bold; margin:16px 0 0 16px; } </style>

هناك أمران جديدان سنتحدث عنهما بالنسبة لهذا الملف. لاحظ أولًا وجود وسم جديد اسمه router-view. في الحقيقة أنّ هذا الوسم ما هو إلّا مكوّن موجود ضمن المكتبة vue-router، ووظيفته تحديد مكان إدراج واجهات التطبيق المختلفة ضمن الصفحة الرئيسية. لأّن تطبيقات SPA كما أشرنا من قبل، لا تتطلب إعادة تحميل الصفحة بالكامل عندما يريد المستخدم الانتقال إلى واجهة مختلفة.

الأمر الآخر هو وجود وسم جديد آخر وهو router-link وهو مكوّن أيضًا ضمن نفس المكتبة. وظيفة هذا المكوّن توليد عنصر ارتباط تشعبي <a> بحيث ينتقل إلى إحدى الواجهات المعرّفة ضمنه. فمثلًا لاحظ معي المكوّن router-link التالي التي أخذته من الشيفرة السابقة:

<router-link to="/AddUser">Add User</router-link>

نجد من المقطع السابق وجود السمة to و هي مسؤولة عن تحديد المسار (Path) الذي سيُوجَّه إليه المستخدم عند نقر هذا الرابط. في المثال السابق سيُوجَّه المستخدم إلى المسار الكامل التالي:

http://www.yourdomain.com/#/AddUser

وذلك بسبب وجود ‎ /AddUser كقيمة للسمة to.

الملف Home.vue

وهو ملف الصفحة الرئيسية في التطبيق وستكون محتوياته على الشكل التالي:

<template> <div class="container"> <div class="row"> <div class="col-6 offset-2"> <h1>Welcome in our website!</h1> </div> </div> <div class="row" style="margin-top:30px;"> <div class="card" style="width: 18rem;"> <div class="card-body"> <h5 class="card-title">ِAdd User</h5> <p class="card-text">Add a new user to the Firebase experimental website.</p> <router-link class="btn btn-primary" to="/AddUser">Add a user</router-link> </div> </div> <div class="card" style="width: 18rem; margin-left:18px;"> <div class="card-body"> <h5 class="card-title">All User</h5> <p class="card-text">Display all users info from the Firebase experimental website.</p> <router-link class="btn btn-primary" to="/AllUsers">Get all users</router-link> </div> </div> </div> </div> </template> <script> export default { name: "Home", }; </script>

لا يوجد في الشيفرة السابقة أي جديد، سوى أنّك تمتلك الحق في إضافة أصناف تنسيقية إلى المكوّن router-link كما في:

<router-link class="btn btn-primary" to="/AddUser">Add a user</router-link>

ستبدو هذه الواجهة على النحو التالي:

الملف AddUser.vue

يحتوي هذا الملف على الواجهة المسؤولة عن إضافة مستخدم جديد. انظر معي إلى الشيفرة البرمجية الخاصّة به:

<template> <div class="container"> <div class="row"> <div class="col-6 offset-2"> <h1>Add User</h1> </div> </div> <div class="row"> <div class="col-6 offset-2"> <div class="container"> <div class="row"> <div class="col-12"> <div class="form-group"> <label>Username</label> <input type="text" class="form-control" v-model="user.username" /> </div> <div class="form-group"> <label>First name</label> <input type="text" class="form-control" v-model="user.firstname" /> </div> <div class="form-group"> <label>Last name</label> <input type="text" class="form-control" v-model="user.lastname" /> </div> </div> </div> </div> <button class="btn btn-primary float-left" style="margin-left:12px;" @click="postUser()">Add</button> </div> </div> </div> </template> <script> export default { name: "AddUser", methods: { postUser() { this.$http .post("https://vue-remote-servers.firebaseio.com/users.json", this.user) .then( () => { this.user.username = ""; this.user.firstname = ""; this.user.lastname = ""; this.$alert("A new user is added.", "Operation Succeeded", "success"); }, (error) => { console.log(error); } ); }, }, data() { return { user: { username: "", firstname: "", lastname: "", }, }; }, }; </script> <style scoped> .row { margin-top: 8px; } </style>

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

على أية حال توجد ميزة جديدة استُخدِمت ضمن هذه الواجهة، وهي رسالة ستُعرَض للمستخدم في حال نجاح عملية الإضافة إلى قاعدة بيانات Firebase:

this.$alert("A new user is added.", "Operation Succeeded", "success");

كما كان من الممكن إضافة رسالة شبيهة بالرسالة السابقة في حال فشلت عملية الإضافة للمستخدم (لم أُضف مثل هذه الرسالة إلى الشيفرة السابقة). التابع ‎ $alert موجود ضمن المكتبة vue-simple-alert وظيفته كما هو واضح، هو في عرض رسالة منسّقة للمستخدم. بالنسبة لمثالنا هذا، سنعرض رسالة تُخبر المستخدم بأنّ عملية إضافة بيانات المستخدم إلى قاعدة بيانات Firebase قد تمت بنجاح. يمثّل الوسيط الأوّل للتابع ‎ $alert الرسالة التي نريد عرضها، أما الوسيط الثاني فهو عنوان صندوق الرسالة، أمّا الوسيط الثالث فهو نوع الرسالة وهي في حالتنا هذه success. توجد أنواع أخرى للرسائل التي يمكن للتابع ‎ $alert عرضها مثل success و error. للاطلاع على المزيد من الوثائق المتعلّقة بهذه المكتبة يمكنك زيارة الصفحة الرسمية لها.

ستبدو هذه الواجهة على النحو التالي:

الملف AllUsers.vue

يحتوي هذا الملف على الواجهة الخاصة بعرض بيانات المستخدمين الذين سبق إضافتهم إلى قاعدة بيانات Firebase. انظر إلى الشيفرة البرمجيّة الخاصة به:

<template> <div class="container"> <div class="row"> <h2>All Users</h2> <button style="margin-left:16px;" class="btn btn-primary" @click="getData()">Retrieve</button> </div> <hr /> <div class="row" v-for="usr in users" v-bind:key="usr.username"> <div class="col-2">{{usr.username}}</div> <div class="col-4">{{usr.firstname}} {{usr.lastname}}</div> <div class="col-1"> <router-link :to="{name: 'EditUser', params: {user:usr}}">Edit</router-link> </div> </div> </div> </template> <script> export default { data() { return { user: { username: "", firstname: "", lastname: "", }, users: [], }; }, methods: { getData: function () { this.$http .get("https://vue-remote-servers.firebaseio.com/users.json") .then((response) => { return response.json(); }) .then((data) => { const tmpArray = []; for (let key in data) { let withId = data[key]; withId.id = key; tmpArray.push(data[key]); } this.users = tmpArray; }); }, }, }; </script> <style scoped> .row{ margin-top:8px; } </style>

مرة أخرى، لا تختلف الشيفرة البرمجية الموجودة هنا عن تلك التي كانت موجودة في الدرس السابق. فعندما ينتقل المستخدم لهذه الواجهة وينقر على الزر Retrieve، ستُحدّث الواجهة بحيث تعرض جميع المستخدمين المخزنين حاليًا ضمن قاعدة بيانات Firebase. بعد عرض هؤلاء المستخدمين، ستلاحظ وجود رابط اسمه Edit يظهر بجوار كل مستخدم. عند نقر هذا الزر سينقلك التطبيق إلى واجهة تحرير بيانات المستخدم EditUser لإجراء التعديلات المطلوبة عليه.

ولكنّ السؤال هنا، كيف ستتمكّن الواجهة EditUser من معرفة المستخدم المطلوب تحرير بياناته؟ الجواب هو في المكوّن router-link الموجود ضمن هذه الواجهة AllUsers. انظر معي إلى الاستخدام الجديد للمكوّن router-link:

<router-link :to="{name: 'EditUser', params: {user:usr}}">Edit</router-link>

استخدمنا في المقطع السابق السمة to بشكل مختلف عن استخدامنا لها في الواجهات السابقة. لاحظ أولًا كيف وضعت نقطتين رأسيتين قبل كلمة to مباشرةً (وهما ضروريتان في هذه الحالة)، ثم أسندت إلى السمة ‎ :to كائن وليس نص عادي كما فعلنا من قبل:

{name: 'EditUser', params: {user:usr}}

هذا الكائن لديه مفتاحين. الأول هو name ويمتلك القيمة 'EditUser'، ويمثّل اسم الواجهة التي نريد الانتقال إليها عندما ينقر المستخدم هذا الرابط. لاحظ أنّني قلت "اسم" وليس "مسار"، أي أنّ الاسم الذي نكتبه هنا يحب أن يكون موافقًا للقيمة name التي كانت موجودة ضمن ملف المسارات routes.js عندما عرفنا تلك المسارات إذا كنت تذكر.

بالنسبة للمفتاح الثاني فهو params وهو مسؤول عن تمرير أية وسائط نرغبها إلى الواجهة التي نريد الانتقال إليها. في حالتنا هذه نرغب بتمرير بيانات المستخدم المراد تحريرها بشكل كامل. طريقة التمرير مفيدة للغاية، لاحظ كيف مرّرنا كائن جديد للمفتاح params يحتوي هذا الكائن في حالتنا هذه، على مفتاح وحيد اسمه user ونسند له القيمة usr التي تُعتبر كائنًا مستقلًا بحد ذاته يحتوي على بيانات المستخدم المراد تحرير بياناته. أي أنّ {user:usr} عبارة عن ثنائية تحوي اسم الوسيط user مع القيمة المرتبطة به usr.

يمكن بالطبع تمرير أكثر من وسيط إلى الواجهة بالأسلوب السابق، وذلك بوضعها بجوار بعضها على شكل مفاتيح متعاقبة كما يلي:

params: {key1:val1, key2:val2, ...}

ستبدو الواجهة AllUsers على النحو التالي:

الملف EditUser.vue

في هذه الواجهة يمكننا تعديل بيانات المستخدم، بالإضافة إلى إمكانية حذف بيانات هذا المستخدم بشكل كلّي من قاعدة البيانات (هذه ميزة جديدة لم تكن مُضافة مسبقًا في الدرس السابق).

إليك الشيفرة البرمجية الخاصة بهذا الملف:

<template> <div class="container"> <div class="row"> <div class="col-6 offset-2"> <h1>Edit User</h1> </div> </div> <div class="row"> <div class="col-6 offset-2"> <div class="container"> <div class="row"> <div class="col-12"> <div class="form-group"> <label>Username</label> <input type="text" class="form-control" v-model="user.username" /> </div> <div class="form-group"> <label>First name</label> <input type="text" class="form-control" v-model="user.firstname" /> </div> <div class="form-group"> <label>Last name</label> <input type="text" class="form-control" v-model="user.lastname" /> </div> </div> </div> </div> <button class="btn btn-primary float-left" style="margin-left:12px;" @click="putUser()">Save</button> <button class="btn btn-danger float-right" style="margin-right:12px;" @click="deleteUser()" >Delete</button> </div> </div> </div> </template> <script> export default { name: "EditUser", methods: { putUser() { this.$http .put( "https://vue-remote-servers.firebaseio.com/users/" + this.$route.params.user.id + ".json", this.user ) .then( () => { this.$alert( "The user is updated.", "Operation Succeeded", "success" ); }, (error) => { console.log(error); } ); }, deleteUser() { this.$confirm("Are you sure you want to delete the user?").then(() => { this.$http .delete( "https://vue-remote-servers.firebaseio.com/users/" + this.$route.params.user.id + ".json" ) .then( () => { this.$router.push('AllUsers'); }, (error) => { console.log(error); } ); }); }, }, computed: { user() { return this.$route.params.user; }, }, }; </script> <style scoped> .row { margin-top: 8px; } </style>

الشيء الذي أود التركيز عليه من الشيفرة السابقة هو كيفية استلام الوسائط الممرّرة لهذه الواجهة من الواجهة الخاصة بعرض بيانات جميع المستخدمين AllUsers ومن ثمّ تعبئة هذه البيانات ضمن حقول البيانات المناسبة لها، ليتمكّن المستخدم من تعديلها إن أحب. أنشأت لهذا الغرض خاصية محسوبة اسمها user إليك الشيفرة البرمجية الخاصة بها:

user() { return this.$route.params.user; }

تحتوي هذه الخاصية المحسوبة على تعليمة برمجية واحدة ترُجع الوسيط الذي مرّرناه من الواجهة AllUsers قبل قليل:

this.$route.params.user

الوسيط هو user كما أسميناه ضمن الواجهة AllUsers، يحتوي هذا الوسيط على بيانات المستخدم username و firstname و lastname كما وردت من الواجهة AllUsers. هذا الوسيط موجود ضمن المفتاح params كما هو واضح، والموجود بدوره ضمن الكائن ‎ $route (الموجود ضمن المكتبة vue-router). وبما أنّ الخاصية user محسوبة فإنّ البيانات المستخلصة منها ستُعمّم مباشرة على الحقول الثلاثة الموجودة ضمن الواجهة EditUser كما يلي:

<div class="col-12"> <div class="form-group"> <label>Username</label> <input type="text" class="form-control" v-model="user.username" /> </div> <div class="form-group"> <label>First name</label> <input type="text" class="form-control" v-model="user.firstname" /> </div> <div class="form-group"> <label>Last name</label> <input type="text" class="form-control" v-model="user.lastname" /> </div> </div>

أود أيضًا التحدث عن التابع ‎ $confirm الموجود ضمن المكتبة vue-simple-alert ووظيفته تخييرك بين أمرين. استخدمت التابع ‎ $confirm ضمن التابع deleteUser وذلك لكي نطلب من المستخدم تأكيد أنّه يريد حذف المستخدم الحالي من قاعدة البيانات. انظر الشيفرة البرمجية للتابع deleteUser:

this.$confirm("Are you sure you want to delete the user?").then(() => { this.$http .delete( "https://vue-remote-servers.firebaseio.com/users/" + this.$route.params.user.id + ".json" ) .then( () => { this.$router.push('AllUsers'); }, (error) => { console.log(error); } ); });

في حال تمت الموافقة على حذف المستخدم الحالي، سيُنفَّذ تابع السهم المُمرّر لتابع then الأوّل. يحتوي تابع السهم هذا على الشيفرة البرمجية التي ستحذف بيانات المستخدم من قاعدة بيانات Firebase وهي مألوفة وتشبه أخواتها من المقاطع البرمجية الأخرى المسؤولة عن التعامل مع قاعدة بيانات Firebase. لاحظ أنّنا ننفّذ تابع then آخر يحتوي على تعليمة برمجيّة أخرى وظيفتها تحويل المستخدم إلى الواجهة AllUsers بعد الانتهاء من حذف المستخدم الحالي.انظر لهذه التعليمة:

this.$router.push('AllUsers');

هذا هو الأسلوب المتبع للانتقال بين الواجهات بشكل برمجي، وذلك عن طريق استخدام التابع push من الكائن ‎ $router، حيث نمرّر "اسم" الواجهة التي نرغب بالانتقال إليها كوسيط للتابع push.

ختامًا

تناولنا في هذا الدرس مقدّمة إلى التوجيه في Vue.js. في الحقيقة يُعتبر هذا الموضوع كبيرًا بعض الشيء وله جوانب متعدّدة غطينا في هذا الدرس الأساسي منها. في حال احتجت إلى التوسّع في هذا الموضوع مستقبلًا، فأعتقد أنّ خير رفيق لك، سيكون الوثائق الرسمية للتوجيه على هذا الموقع. أقترح عليك بعد قراءة هذا الدرس أن تحاول تجريب بناء تطبيقات بسيطة تعتمد على التوجيه، لكي تعتاد على هذه التقنية.

35,738 واتساب يعلن خاصية جديدة ينتظرها مستخدموه منذ مدة! هل أرسلت يوما رسالة مرت عليها عدة أيام وندمت عليها ورغبت في محو أي آثر لها؟.. تطبيق ”واتساب" أوجد لك الحل حيث يضيف خاصية جديدة لـ ”محو آثر" أية رسائل سابقة. فكيف تعمل الخاصية الجديدة؟
35,737 خوفاً من السلطات.. هل يحجب تطبيق تيك توك الصيني أخبار الإيغور؟ تلاحق العديد من الاتهامات تطبيق "تيك توك" الصيني الشهير، يتعلق بعضها بقيام التطبيق بحجب المواد المتعلقة بقضية مسلمي الإيغور. فبماذا اعترفت مسؤولة بالتطبيق في جلسة استماع بالبرلمان البريطاني حول الأمر؟  
35,736 فيسبوك تحذف شبكات حسابات "زائفة" في 8 دول.. إحداها للإخوان

قالت شركة فيسبوك، اليوم الجمعة، إنها فككت 7 شبكات منفصلة من الحسابات والصفحات الزائفة على منصتها كانت تنشط في إيران وأفغانستان ومصر وتركيا والمغرب وميانمار وجورجيا وأوكرانيا، وذلك بسبب "سلوك زائف منسق".

وأعلنت الشركة المالكة لموقع التواصل الاجتماعي أنها أغلقت هذه الشبكات، وذلك في إطار تقريرها الشهري عن "السلوك الزائف المنسق"، والذي أشار أيضا إلى إزالة قرابة 8000 صفحة ضالعة في حملات مضللة حول العالم في أكتوبر.

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

وكان أفراد على صلة بجماعة الإخوان المسلمين المصرية، التي تدير شبكات من المجموعات في الشرق الأوسط، يتولون تشغيل إحدى شبكات الحسابات والصفحات على فيسبوك من مصر وتركيا والمغرب. واستهدفت الصفحات دولا بالمنطقة بمحتوى متصل بالإرهاب، حسبما أكدت فيسبوك.

وتوصلت فيسبوك إلى أن شبكتين "زائفتين" في جورجيا تنشران محتوى سياسيا، وقالت إن إحداهما يشغلها أفراد مرتبطون بحزبين سياسيين.

وفي أوكرانيا وميانمار، كشفت الشركة العملاقة في مجال التواصل الاجتماعي أن شركات علاقات عامة كانت تدير حملات تضليل مماثلة نيابة عن أحزاب سياسية.

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

35,735 سوني تمنع توسعة مساحة التخزين في ‏PS5‎‏ عند الإطلاق

أكدت شركة "سوني" لموقع "ذا فيرج" The Verge أن مالكي منصة الألعاب الجديدة "بلاي ستيشن5" PlayStation 5 لن يتمكنوا من توسعة مساحة التخزين الخاصة بالمنصة عند الإطلاق.

وفي حين تتميز منصة "بلاي ستيشن 5" بفتحة داخلية مخصصة يمكنها أن تناسب نظرياً محركات أقراص الحالة الصلبة M.2 SSD القياسية، ويمكن الوصول إليها بسهولة، إلا أنه يبدو أن الفتحة ستُعطل عند الإطلاق. وقالت "سوني" لموقع "ذا فيرج" التقني إن "الفتحة محجوزة لتحديث مستقبلي".

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

وقال سيرني حينها: "سيكون أمراً رائعاً إذا حدث ذلك عند الإطلاق، ولكن من المحتمل أن يتم ذلك بعد الإطلاق بقليل، لذا يرجى تأجيل شراء محركات M.2 SSD حتى تسمعوا منا" أي جديد في هذا السياق.

أما عن سبب التأخر في الدعم، فقد أوضح سيرني أنه ليست كل محركات أقراص M.2 SSD سريعة بما يكفي لمواكبة منصة "بلاي ستيشن 5"، وليست رقيقة بما يكفي لتلائم حاوية أقراص SSD، وليست متوافقة مع وحدة التحكم الخاصة بالمنصة من "سوني". لكن الشركة وعدت بإجراء اختبار التوافق في أواخر العام الحالي للتأكد.

وقال سيرني إن محركات أقراص الحالة الصلبة الجاهزة تحتاج إلى تقديم أكثر من 5.5 جيغابايت في الثانية من عرض النطاق الترددي عبر اتصال PCIe Gen4، وأن لا يكون لديها مبدد حراري كبير جداً لكي تناسب حاوية أقراص SSD الخاصة بالمنصة.

يذكر أن منصة "بلاي ستيشن 5" تدعم أقراص التخزين الخارجية عبر منفذ USB، وقد أكدت "سوني" أن هذا الدعم متوفر اعتباراً من اليوم الأول للإطلاق.

وأخيراً قال سيرني: "إنها طريقة جيدة لإضافة الكثير من ألعاب "بلاي ستيشن 4" إلى منصة "بلاي ستيشن 5" لأنها لا تحتاج إلى السرعة التي يمكن أن توفرها أقراص SSD".

35,734 واتساب Whatsapp تتيح ميزة إرسال الأموال والدفع عبر الرسائل في الهند

هذا المقال تم نشره بواسطة صدى التقنية صدى التقنية
رابط المقال واتساب Whatsapp تتيح ميزة إرسال الأموال والدفع عبر الرسائل في الهند

أعلنت Whatsapp رسميا عن توفير ميزة واتساب باي لإرسال الأموال عبر تطبيقها مباشرة للمستخدمين في جميع أنحاء الهند، وهو ما تقول واتساب أنه يوفر طريقة آمنة لتحويل الأموال بنفس سهولة إرسال رسالة أو صورة لصديق، وتتيح الخدمة الجديدة واتساب باي للمستخدمين الدفع مقابل الشراء على سبيل المثال دون الحاجة للدفع النقدي أو الاعتماد على البنوك المحلية. 

وقالت واتساب أنها طورت ميزة الدفع عبر التطبيق بالشراكة مع مؤسسة المدفوعات الوطنية في الهند، وأن ميزة واتساب باي متكاملة مع أكثر من 160 بنكا في الهند، وهو ما يساعد الهند في خطتها لزيادة سهولة استخدام المدفوعات الرقمية ودعم الشمول المالي. 

تتطلب ميزة واتساب الجديدة للدفع مباشرة من خلال التطبيق وإرسال الأموال في الهند وجود حساب مصرفي

وتتطلب ميزة واتساب الجديدة للدفع مباشرة من خلال التطبيق وإرسال الأموال في الهند وجود حساب مصرفي وبطاقة خصم من أحد البنوك الهندية، وأكدت فيسبوك أن مستخدمي واتساب يمكنهم تحويل الأموال لأي شخص يستخدم تطبيقا يدعم واجهة الدفع الموحدة UPI في الهند، وهو النظام الذي يسهل تحويل الأموال بين الحسابات المصرفية. 

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

وكانت شركة فيسبوك التي تمتلك تطبيق Whatsapp قد أطلقت ميزة إرسال الأموال اعتمادا على خدمتها Facebook Pay في البرازيل في وقت سابق من هذا العام 2020، لكن البنك المركزي البرازيلي أوقف الميزة بعد حوالي أسبوع من إطلاق فيسبوك لها،  في بيان أن القرار يأتي لضمان المنافسة في سوق خدمات الدفع، مع تقييم المخاطر المحتملة على خدمات الدفع المتوفرة في البرازيل والتحقق من توافق واتساب مع القوانين.

هذا المقال تم نشره بواسطة صدى التقنية صدى التقنية
رابط المقال واتساب Whatsapp تتيح ميزة إرسال الأموال والدفع عبر الرسائل في الهند

الصفحات

أنت هنا