Abdulraheem Barghouthi
-
المساهمات
182 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
2
إجابات الأسئلة
-
إجابة Abdulraheem Barghouthi سؤال في مشكلة في جلب بيانات من firebase في اندرويد كانت الإجابة المقبولة
لحل المشكلة يرجى حذف الـfor loop ليكون الكود كالتالي:
if(seatch_bar.getText().toString().equals("")){ camperSiteModel.clear(); CamperSiteModel camperSiteModel1 = dataSnapshot.getValue(CamperSiteModel.class); camperSiteModel.add(camperSiteModel1); camperSiteAdapter.notifyDataSetChanged(); } هكذا سيتم جلب البيانات حسب المودل CamperSiteModal.class
-
إجابة Abdulraheem Barghouthi سؤال في مشكلة في الاتصال بقواعد البيانات MySQL في اندرويد كانت الإجابة المقبولة
المشكلة تحصل بسبب هذا السطر:
con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/testandroid?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=GMT","root",""); حيث أنك قمت بتعريف عنوان خادم قواعد البيانات بـ localhost وهذا غير صحيح للأسباب التالية:
في حال كنت تشغل التطبيق على المحاكي فإن العنوان localhost يعود على المحاكي وليس خادم قواعد البيانات. أما اذا كنت تشغل التطبيق على جهاز حقيقي فإن العنوان localhost يعود على الجهاز نفسه وليس خادم قواعد البيانات. لحل المشكلة يرجى إستبدال localhost بالـip الخاص بخادم قواعد البيانات على الشبكة المحلية مثلاً : 192.168.1.105
-
إجابة Abdulraheem Barghouthi سؤال في كيفية الحصول على الارباح من مواقع خمسات وتحويلها الى البطاقة الائتمانية كانت الإجابة المقبولة
حتى لو كان حسابك البنكي بالدولار سيتم التحويل للعملة المحلية لبلدك.
المشكلة في التحويل المباشر لحسابك البنكي هي أن الpaypal لا تعرض لك أي تفاصيل عن أسعارها الخاصة بالتحويل بين العملات.
أما في حال السحب لبطاقة الvisa يتم خصم 1% من المبلغ وطبعا يمكنك سحب المبلغ كما هو بالدولار وبدون تحويله.
-
إجابة Abdulraheem Barghouthi سؤال في كيفية تغير حساب console.firebase كانت الإجابة المقبولة
يمكنك إضافة بريد إلكتروني جديد للمشروع وتعيينه كمالك من خلال الخطوات التالية:
نضغط على الاعدادات ومن ثم نختار users and permissions كما هو موضح في الصورة التالية:
نضيف بريد إلكتروني جديد ونقوم بتعيينه كمالك من خلال إختيار Owner:
-
إجابة Abdulraheem Barghouthi سؤال في مشكلة في كتابة ملفات في جافا كانت الإجابة المقبولة
الخطأ يفيد بأن العملية لا يمكن تنفيذها بسبب عدم وجود صلاحيات للقيام بذلك.
تأكد من فتحك للبرنامج بصلاحيات مدير، يفضل أيضاً عدم حفظ البرنامج في مجلدات حساسة مثل C:\\ أو C:\\program files
أرفق لك صورة لنتائج تشغيل الكود الخاص بك حيث أنه يعمل على أكمل وجه:
-
إجابة Abdulraheem Barghouthi سؤال في مشكلة في Client-Server بلغة جافا كانت الإجابة المقبولة
المشكلة تحدث بسبب كتابتك للأكواد الخاصة بإتصال الـclient في داخل الـloop وبعد ذلك لم تقم بإغلاق الإتصال من خلال close.
لحل المشكلة يرجى نقل الكود التالي في قسم الـclient إلى خارج الـwhile loop:
Socket s=new Socket(host,port); PrintWriter output=new PrintWriter(s.getOutputStream()); BufferedReader insok = new BufferedReader(new InputStreamReader(s.getInputStream())); ليكون الكود الكامل لقسم الـclient كالتالي:
public class TestClient{ public static void main(String args[]){ try{ String host=""+args[0]; int port=Integer.parseInt(args[1]); BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); String lettura=input.readLine(); Socket s=new Socket(host,port); PrintWriter output=new PrintWriter(s.getOutputStream()); BufferedReader insok = new BufferedReader(new InputStreamReader(s.getInputStream())); while(!lettura.equals("good")){ output.println(lettura); output.flush(); String lettsock=insok.readLine(); System.out.println(lettsock); lettura=input.readLine(); } input.close(); } catch(Exception ex){ System.out.println(ex); System.exit(3); } } }
-
إجابة Abdulraheem Barghouthi سؤال في يحدث خطأ عند اظهار snackbar في flutter كانت الإجابة المقبولة
تحدث هذه المشكلة بسبب إرفاقك للـcontext الذي قام بإنشاء الـscaffold بدلاً من إرفاق context ضمن الـscaffold.
يمكن حل المشكلة من خلال إحدى الطرق التالية:
الطريقة الأولى: إضافة Builder بحيث يعطينا context ضمن الـscaffold ومن ثم نقوم بإرفاقه للـ scaffold.of: body: Builder( Builder: (context){ //نضع هنا كل العناصر المراد عرضها لتأخذ الـ //context //الخاص بالـ //scaffold } ); إليك الكود الكامل بعد التعديل:
import 'package:flutter/material.dart'; void main() => runApp(MyHomePage()); class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'test', theme: ThemeData( primarySwatch: Colors.cyan, ), home: Page1(), ); } } class Page1 extends StatelessWidget { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('page1'), ), body:Builder( builder: (context) => Center( //*** child: RaisedButton( color: Colors.cyan, textColor: Colors.white, onPressed: (){ Scaffold.of(context).showSnackBar(SnackBar(content: Text('Hey there'))); }, child: Text('show snackbar'), ), ) ), ); } } الطريقة الثانية: حفظ الـscaffold في GlobalKey الذي سيلزمنا في إظهار الـsnackbar. class Page1 extends StatelessWidget { final GlobalKey<ScaffoldState> _myScaffold = new GlobalKey(); //… } بعد تعريف GlobalKey نقوم بتعيينه في خصائص الـScaffold:
Scaffold( key: _myScaffold, //... ); الآن يمكننا إظهار الـsnackbar بدون الحاجة للـcontext من خلال الـGlobalKey:
_myScaffold.currentState.showSnackBar(SnackBar(content:Text('Hey there'),)); مرفق الكود الكامل بعد التعديل:
import 'package:flutter/material.dart'; void main() => runApp(MyHomePage()); class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( title: 'test', theme: ThemeData( primarySwatch: Colors.cyan, ), home: Page1(), ); } } class Page1 extends StatelessWidget { final GlobalKey<ScaffoldState> _myScaffold = new GlobalKey(); @override Widget build(BuildContext context) { return Scaffold( key: _myScaffold, appBar: AppBar( title: Text('page1'), ), body:Center( child: RaisedButton( color: Colors.cyan, textColor: Colors.white, onPressed: (){ _myScaffold.currentState.showSnackBar(SnackBar(content:Text('Hey there'),)); }, child: Text('show snackbar'), ), ), ); } }
-
إجابة Abdulraheem Barghouthi سؤال في مشكلة في تبديل العناصر في flutter كانت الإجابة المقبولة
لو وضعت stateless widgets في الـList واعطيتهم أرقام مباشرة كالتالي:
List<Widget> myList = [ Text(‘1’), Text(‘2’) ]; لسار كل شيء كما تريد لكنك قمت بإستخدام stateful widgets بدون تعيين key لها وبالتالي لن يتم التعرف على التغيير الحاصل في الـList الخاصة بك.
لكن لماذا تم التعرف على هذا التغير عندما تم إستخدام عناصر من نوع stateless ؟
لأن القيمة النصية للعنصر مرتبطة بالعنصر نفسه أي لا يوجد لها حالة كما هو الحال في stateful widgets الذي تحتفظ بالقيمة النصية في الحالة الخاصة بها.
إذاً لحل المشكلة يجب إضافة key فريد لكل العناصر المراد التبديل بينها بحيث يتم التفريق بين تلك العناصر حسب الـkey.
يجب أولا أن نهيئ الـ constructor الخاص بـ MyRandomWidget ليستقبل key ويقوم بتمريره للـsuper:
class MyRandomWidget extends StatefulWidget { MyRandomWidget({Key key}) : super(key: key); //….باقي الكود } بعد تهيئة الـconstructor نقوم بتمرير UniqueKey (مفتاح فريد يتم توليده عشوائياً ) عند تعريف العناصر في داخل الـList ليصبح الكود كالتالي:
List<Widget> tiles = [ MyRandomWidget(key: UniqueKey()), //إضافة معرف فريد للعنصر MyRandomWidget(key: UniqueKey()),//إضافة معرف فريد للعنصر ]; الآن وبعد إسناد معرف فريد لكل عنصر سيعمل كل شيء على يرام.
مرفق الملف بعد التعديل.
main.dart
-
إجابة Abdulraheem Barghouthi سؤال في هل موقع Pinterest لديه حقوق الطبع والنشر كانت الإجابة المقبولة
حسب سياسية الإستخدام الخاصة بموقع Pinterest فإنه لا يمتلك الصور التي يتم نشرها من قبل المستخدمين بل هي لمالك/ناشر الصور فقط.
لإستخدام الصور في أي أغراض أُخرى يجب أخذ إذن مسبق من مالك حقوق النشر للصورة حيث يمكن أن يكون المستخدم الذي قام نشرها.
في النهاية يمكنك نشر ما تريد إلا في حال تقدم أحد ما بطلب حذف الصورة الخاصة بك مع إثبات ملكيته لحقوق النشر الخاصة بالصورة.
-
إجابة Abdulraheem Barghouthi سؤال في الفرق بين stateless و stateful في flutter كانت الإجابة المقبولة
لفهم الفرق بين أنواع الـwidgets علينا أولاً فهم ماهيتها ومكوناتها.
كل عنصر يظهر للمستخدم هو عبارة عن widget مثل نص، صورة، حقل إدخال...الخ.
حيث يصف الـwidget سلوك وشكل العنصر في الشاشة، على سبيل المثال عند إضافة نص ومحاذاته في المنتصف نستخدم الـtext widget و الـcenter widget كالتالي:
Center(// widget1 child: Text('hello',style:TextStyle(color:Colors.black)), // widget2 ) لاحظ أن الـ widget هو object يصف ويحدد شكل العنصر في الشاشة.
بعد فهم ماهية الـwidget سنفرق بين الـstateless widget والـstateful widget.
stateful widget: هو عبارة عن عنصر يحتوي على حالة أي يمكن حفظ بيانات فيه ويمكنه تغييرها وإعادة بناء/رسم نفسه أثناء التشغيل عن طريق الدالة setState.
مثال عليه: class FavoriteWidget extends StatefulWidget { //القسم الأول الخاص بالعنصر @override _FavoriteWidgetState createState() => _FavoriteWidgetState(); } class _FavoriteWidgetState extends State<FavoriteWidget> { // القسم الثاني الخاص بحالة العنصر String msg = “hello”; // يمكن تعريف متغيرات وتغيير قيمتها أثناء تشغيل التطبيق @override Widget build(BuildContext context) { // الدالة الخاصة ببناء شكل العنصر return Text(‘$msg’); // نرجع نصاً يحمل قيمة المتغير المعرف مسبقاً } } stateless widget: هو عنصر ليس لديه حالة ولا يمكن تغيير بياناته أثناء تشغيل التطبيق إلا عن طريق إعادة تعريفه مرة أُخرى ببيانات مختلفة.
مثال عليه: class MyWidget extends StatelessWidget { // يتكون من قسم واحد فقط خاص بالعنصر وليس له حالة final String msg = “hello”; // لاحظ تعريف المتغير يجب أن يكون نهائي ولا يمكن تغييره أثناء التشغيل @override Widget build(BuildContext context) { // دالة بناء شكل العنصر return Text(‘$msg’); } } إذاً نستخدم stateful مع العناصر التي تعتمد على بيانات متغيرة وتحتاج لإعادة رسم نفسها على الشاشة أثناء التشغيل.
ونستخدم stateless في العناصر الثابتة التي لا نحتاج لتغييرها أو التعديل عليها أثناء التشغيل.
-
إجابة Abdulraheem Barghouthi سؤال في مشكلة في ربط github في vs code كانت الإجابة المقبولة
رسالة الخطأ تقول أنه لا يمكن العثور على git في جهازك، إذا كان الـgit غير منصب فيجب تحميله وتنصيبه ومن ثم متابعة الشرح التالي.
أما كان الـgit منصباً يجب عليك إضافته في الـenvironment variables لكي يعثر عليه الـVS Code، تابعي الخطوات التالية:
نضغط على قائمة إبدأ ونكتب في حقل البحث " environment variables " ثم نضغط عليها كما هو موضح في الصورة التالية
نقوم بالضغط على زر environment variables
تحت قسم user variables نضغط على Path
نقوم بإضافة المسار الخاص ببرنامج git المنصب على جهازك " C:\Program Files\Git\bin "
نضغط ok لحفظ التعديلات ومن ثم نعيد تشغيل الـVS Code. -
إجابة Abdulraheem Barghouthi سؤال في ظهور الزر باللون الابيض في أندرويد استوديو كانت الإجابة المقبولة
لمعرفة مكان الخطأ بالضبط يجب إرفاق كود الـactivity كاملاً بالإضافة للـDrawable الذي تحاول إضافته للـButton.
على كل حال يمكنك إضافة Drawable للـButton من خلال الخاصية android:drawableLeft كما في المثال التالي:
android:drawableLeft="@android:drawable/arrow_up_float" حيث سيتم إضافة سهم ليسار الـButton.
كما يمكنك تغيير لون الـButton من خلال الخاصية app:backgroundTint
app:backgroundTint="#87F" في النهاية ستكون الـButton كالتالي:
-
إجابة Abdulraheem Barghouthi سؤال في بطئ وعدم استجابة واجهة المستخدم في تطبيق flutter كانت الإجابة المقبولة
البطئ وعدم الإستجابة ناتج عن معالجة 500 تعليق وبالتالي إجهاد الـmain thread الخاصة بالتطبيق ومنعه من الإستجابة والتفاعل مع المستخدم خلال معالجته للتعليقات، بدلا من ذلك يجب تنفيذ العمليات التي تستغرق وقتاً في المعالجة في Thread أُخرى معزولة كلياً لكي لا تؤثر على عناصر الواجهة الخاصة بالتطبيق.
توفر لغة دارت الدالة compute التي تمكنك من تنفيذ دالة ما بمعزل عن الـ main thread الرئيسية ومن ثم إرجاع قيمة.
إليك الشكل العام للدالة compute مع التوضيح:
var data = compute(function, argument);// تأخذ معاملان وهما إسم الدالة التي تريد تنفيذها //و المعامل الذي نريد إضافته للدالة //نحفظ البيانات التي ترجعها الدالة //compute //في المتغير //data static myFunc(String response){ // يجب ان تكون الدالة static //هنا نقوم بتنفيذ العمليات التي تستغرق وقتاً طويلاً بحيث لا تؤثر على اداء التطبيق } إليك الكود بعد تعديله وإضافة تحويل البيانات في thread أخرى معزولة عن الـmain thread :
import 'dart:convert'; import 'dart:io'; import 'dart:isolate'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:http/http.dart' as http; void main() { runApp(MyApp()); } class MyApp extends StatelessWidget { @override Widget build(BuildContext context) { return MaterialApp( theme: ThemeData( primarySwatch: Colors.blue, visualDensity: VisualDensity.adaptivePlatformDensity, ), home: MyHomePage(title: 'Flutter Demo Home Page'), ); } } class MyHomePage extends StatefulWidget { MyHomePage({Key key, this.title}) : super(key: key); final String title; @override _MyHomePageState createState() => _MyHomePageState(); } class _MyHomePageState extends State<MyHomePage> { @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar( title: Text('Hello'), ), body:FutureBuilder( future: getData(), builder: (context,AsyncSnapshot<List> snapshot){ print('try'); if(snapshot.hasData){ return ListView.builder( itemCount: snapshot.data.length, itemBuilder: (context,i){ return ListTile(title: Text('comment:${snapshot.data[i]['body']}')); }); } else{ return Center(child: CircularProgressIndicator()); } } ), ); } Future<List> getData() async{ var response = await http.get('https://jsonplaceholder.typicode.com/comments'); // جلب البيانات //List mapList = jsonDecode(response.body); return compute(responseToJson,response.body); // نقوم بتحويل البيانات في الخلفية وليس في //thread الرئيسية //الخاصة بالتطبيق } static List responseToJson(String body){ // يجب أن تكون الدالة الذي تنفذها // compute //من نوع //static // او global return jsonDecode(body); } }
-
إجابة Abdulraheem Barghouthi سؤال في المساعدة في كتابة كود برمجي لـCloud Function مع مشروع Flutter كانت الإجابة المقبولة
لتنفيذ فكرتك يلزمك تهيئة وإضافة عدة أمور غير الـFCM، تابع الخطوات التالية:
تهيئة وإستخدام FCM في تطبيقك ( تم الشرح من قبل الأخ بلال ) لإتاحة إستقبال التنبيهات في تطبيقك. تهيئة وإستخدام الـCloud Functions من خلال إضافتها كخاصية لمشروعك على الـFirebase Console، حيث أنها عبارة عن إطار عمل لا مركزي ولا يعتمد على السيرفر يوفر لك كتابة Functions وتنفيذها مباشرة عبر Http request أو بالإعتماد على أحداث أخرى تتعلق بمشروعك المنشئ على Firebase Console. الأحداث الذي نحتاجها في هذا المشروع هو حدث إضافة البيانات في قاعدة البيانات، أي أننا سنقوم بكتابة Function معينة يتم تنفيذها عند إضافة أي شيء في قاعدة البيانات. تحميل وتثبيت NodeJS وهو عبارة عن بيئة تشغيل خاصة بالـJavascript حيث سنحتاجه لتثبيت حزم تساعدنا في كتابة ورفع كود الـFunction للـCloud. تثبيت الحزمة Firebase CLI من خلال تنفيذ الأمر التالي في سطر الأوامر: npm install -g firebase-tools ستحتاج أيضاً لتسجيل الدخول بإستخدام حساب Google الخاص بك، لمعلومات إضافية يرجى مراجعة التعليمات من الموقع الرسمي.
بعد ذلك يمكنك كتابة كود javascript أو typescript كـFunction يتم تنفيذها عند وقوع الحدث التي تريد،ومن ثم إختبار ورفع الكود.
بعد إنهاء الخطوات أعلاه نحصل على بيئة عمل مهيئة لكتابة الكود ورفعه للـfirebase cloud. لكن قبل كتابة الكود سنقوم بالتعرف على أربعة أحداث ( events ) خاصة بقواعد البيانات حيث سنستخدمها في مشروعنا وهي:
onCreate : ينفذ هذا الحدث عند إنشاء Document جديدة في قاعدة البيانات. onUpdate : ينفذ هذا الحدث عند التعديل على Document ما. onDelete : ينفذ هذا الحدث عند حذف Document ما. onWrite : ينفذ هذا الحدث عند تنفيذ الأحداث onCreate ، onUpdate أو onDelete. بعد التعرف على مختلف الأحداث الخاصة بالبيانات هيا بنا لنكتب الكود الذي ينفذ كود معين عند إضافة Document جديدة في قاعدة البيانات:
exports.CreateDoc = functions.firestore .document('myDocs/{docID}') // المسار الذي تريد تتبعه .onCreate((snap, context) => { //الكود الذي تود تنفيذه }); بعد كتابة الكود نقوم برفعه للـFirebase Cloud عن طريق الأمر التالي في سطر الأوامر:
firebase deploy --only functions
-
إجابة Abdulraheem Barghouthi سؤال في ترتيب عناصر المصفوفة تصاعديا باستخدام خوارزمية الفرز الفقاعي كانت الإجابة المقبولة
لنفرض أن لدينا المصفوفة التالية ونريد أن نرتبها تصاعديا بإستخدام خوارزمية الفرز الفقاعي:
[ 5, 10, 11 , 2, 1 ]
خطوات حل المشكلة:
1. سنبدأ من أول عنصر في المصفوفة ونقارنه مع العنصر الذي يليه، في حال أن العنصر الأول أكبر من العنصر الثاني نقوم بتبديل العناصر.
هل 1 أكبر من 2 ؟ لا إذا نكمل المقارنة للعناصر التالية.
2. هل العنصر الثاني ( 2 ) أكبر من العنصر الثالث ( 11 ) ؟ لا
3. هل العنصر 3 ( 11 ) أكبر من العنصر 4 ( 10 ) ؟ نعم، إذا نقوم بتبديل العناصر حيث ستكون المصفوفة بعد التبديل كالتالي:
[ 5, 11, 10 , 2, 1 ]
4. هل العنصر 4 ( 11 ) أكبر من العنصر 5 ( 5)؟ نعم، إذا نقوم بتبديل العناصر مرة أخرى بحيث تصبح المصفوفة:
[11, 5, 10 , 2, 1 ]
عندما نصل إلى نهاية المصفوفة تنتهي الجولة الأولى في ترتيب العناصر، هيا نبدأ الجولة الثانية بحيث نبدأ المقارنة من العنصر الثاني في المصفوفة ( 2 ) وصولا للرابع ( 5 ).
لاحظي أننا إستثنينا العنصر الأول والأخير في الجولة الثانية من المقارنة.
نبدأ الجولة الثانية:
1. هل العنصر الثاني ( 2 ) أكبر من العنصر الثالث ( 10 ) لا، إذا نكمل المقارنة.
2. هل العنصر الثالث ( 10 ) أكبر من العنصر الرابع ( 5 ) نعم، إذا نبدل العناصر حيث تصبح المصفوفة كالتالي:
[11, 10, 5 , 2, 1 ]
وهكذا نكون قد حصلنا على مصفوفة مرتبة تصاعديا.
مرفق صور توضيحية لعملية الفرز الفقاعي.
-
إجابة Abdulraheem Barghouthi سؤال في هل اغير تخصصي من مترجم الى مبرمج؟ كانت الإجابة المقبولة
جواب هذا السؤال لديك أنت!
سأجيب على سؤالك بسؤال آخر:
ما الذي يلفت إنتباهك ويثير فضولك أكثر مجال الويب أم التطبيقات ؟
في حال عرفت الإجابة فأنا أقول لك هذا هو المجال المناسب لك.
أما في حال عدم معرفتك للإجابة فالأفضل أن تقرأ عدة مقالات عن المجالين لتعرف ما المجال المناسب لك.
ملاحظة: لا يجب ربط إجابتك بمدى الطلب على مجال معيين، فالمجاليين يتقاطعان في الكثير من الأمور ويعتمد إحداهما على الآخر، على سبيل المثال عند إنشاء تطبيق في مجال التجارة الإلكترونية بالتأكيد ستحتاج إلى لوحة تحكم (موقع ) يمكنك من تحديث/إضافة/حذف المنتجات التي تظهر في التطبيق.
-
إجابة Abdulraheem Barghouthi سؤال في ما هي المهارات اللازم تعلمها واكتسابها لفتح شركة صغيرة كانت الإجابة المقبولة
بما أن هدفك هو شركة خاصة يجب أن تكون لديك خلفية جيدة في علوم الحاسوب والتصميم بشكل عام، لكن التركيز سيكون على الجوانب الإدارية وتقوية مهاراتك في هذا المجال لأنك في النهاية لن تقوم بالتدريس وإنما ستدير الشركة.
كمدير للشركة يهمك أن تتطلع على آلية عمل وأساس التقنيات الحديثة في مختلف المجالات التالية:
التقنيات المستخدمة في تطوير الويب: HTML5, CSS3, Javascript, Jquery, bootstrap بالإضافة إلى إحدى أُطر العمل هذه ( Angular,React,Vue )، و PHP أو Python كـBackend. التقنيات المستخدمة في تطوير تطبيقات الهواتف الذكية: Android: لغة جافا أو Kotlin. IOS : لغة Objective C أو Swift. (Cross-Platform (IOS & Android :وهي تطبيقات يتم تطويرها بالإعتماد على إطار عمل واحد فقط أي إنشاء كود واحد فقط للتطبيقين، ومن أشهر أُطر العمل: إطار العمل Flutter المطور من قبل Google و ReactNative المطور من قبل فيسبوك. التقنيات المستخدمة في تطوير تطبيقات سطح المكتب: Java من خلال Swing. Python من خلال إطار العمل TKinter. لغة C#. تنويه: ليس عليك أن تتقن كل هذه اللغات والتقنيات بل الغاية هي أن تعرف أساسها وآلية عملها ويمكن أن تكفيك المعلومات النظرية.
كما يجب تطوير مناهج دراسية واضحة للدورات التي تود طرحها، لأن التعليم لا يحتاج إلى خبير فقط بل يحتاج إلى أسلوب بسيط في إيصال المعلومة للمتلقي.
لا يلزمك سوى تعلم أساسيات التصميم بإستخدام Adobe X D أو أي برنامج آخر ضمن مجال الـUX Design و التقنيات الخاصة بتطوير صفحات الويب ( الواجهات الأمامية Front-End ) وهي : HTML5, CSS3, Javascript, Bootstrap. ومن ثم التدرب على مشاريع وهمية من وحي خيالك ومحاولة تقليد تصميمات عالمية لتقوية نفسك في المجال.
بعد ذلك يمكنك الإنخراط في سوق العمل عبر منصة مستقل للعمل الحر كـFront-end Developer.