لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 06/06/22 في كل الموقع
-
لدي مجموعة من المنتجات بحاجة الى رفعها على المتجر في نظام تجارة إلكترونية استخدمت التالي <?php $file = fopen($path.'/assets/temp_files/'.$filename,"r"); $i = 1; while (($line = fgetcsv($file)) !== FALSE) { الان لدي مشكلة كيف اقرأ التصنيفات باللغة العربية عند رفع المنتجات عبر اكسل المشملة حاليا ان الحروف تاتي في شكل اسفهامات ؟؟؟؟؟؟؟؟؟ كلها2 نقاط
-
نحتاج دومًا إلى استخدام محرر النصوص للكثير من الأمور، منها تدوين الملاحظات أو كتابة شيفرة برنامج أو إجراء تعديل على ملف ضبط من إعدادات النظام وغيرها من الحالات التي يكثر فيها التعامل مع النصوص. تمتلك كل توزيعة لينكس برامج تحرير للنصوص مثبتة مسبقًا بغض النظر عن متطلبات المستخدم، مثل Gedit و Geany و Kate وغيرها التي تعد جميعها محررات حديثة مزودة بواجهة رسومية GUI، ولكن لا يفضل الجميع استخدام محرر نصوص بواجهة رسومية في جميع الحالات بل يُفضّل البعض استخدام محرر نصوص بواسطة سطر الأوامر، ويتيح نظام تشغيل لينكس هذا الخيار أيضًا حيث يوجد العديد من برامج تحرير النصوص التي يمكن استخدامها من سطر الأوامر ومن أشهرها برنامجي فيم Vim ونانو Nano، اللذان يستخدمان في سطر الأوامر CLI وهي اختصار Command Line Interface، يقدم كل منهما معظم الميزات الأساسية لمحرر النصوص ويوجد بعض الاختلافات فمثلًا يأتي نانو مدمجًا في معظم توزيعات لينكس، بينما يحتاج فيم في بعض التوزيعات إلى تثبيته يدويًا. لا يمكن اتخاذ القرار بشأن استخدام أي منهما إلا بعد التعرّف على تفاصيل وإمكانيات كل منهما وهو ما سنعرضه في هذا المقال. 1. مقدمة عن محرر النصوص فيم ومحرر النصوص نانو محرر النصوص فيم أُصدر فيم عام 1991 وهو نسخة محسّنة من محرر النصوص Vi الذي طُوّر عام 1976 لنظام التشغيل. يونكس Unix، ويُعرف فيم أيضًا باسم محرر نصوص المبرمِج، وذلك بسبب امتلاكه العديد من الميزات التي تساعد في تعديل ملفات البرنامج، ولا يعتبر فيم حكرًا على المبرمجين حيث يمكن استخدامه لكتابة وتحرير ملفات نصية عادية حتى مع امتلاكه إمكانيات متطورة. محرر النصوص GNU nano أما المحرر غنو نانو GNU nano ويُعرف اختصارًا باسم نانو Nano، فهو محرر نصوص بسيط يعمل بواسطة سطر الأوامر ويعتمد على يونكس Unix ومستوحى من بيكو Pico، حيث كان Pico جزءًا من مجموعة Pine للبريد الإلكتروني التي طورتها جامعة واشنطن في عام 1989 ولكن كان من الصعب تضمينه في توزيعات لينكس لعدم امتلاكه ترخيص GPL، لذا طُوِّر محرر النصوص نانو كبديل مجاني للمحرر Pico، كما عُرف نانو في البداية باسم tip ثم أعاد ريتشارد ستولمان Richard Stallman تسميته مباشرةً قبل أن يعلن نانو برنامجًا رسميًا من برامج GNU. أهم ما يميز هذا المحرر هو سهولة الاستخدام حيث يمكن لأي شخص استعماله وليس بالضرورة أن يكون مبرمجًا. 2. مزايا محرر فيم مقابل مزايا محرر نانو فيما يلي الاختلافات الرئيسية بين فيم ونانو. تُلخص الميزات الرئيسية لمحرر فيم بالميزات التالية: يتيح التراجع عن آخر خطوة Undo لعدة مرات التركيز على تركيب الجملة التعديل بواسطة سطر الأوامر إكمال اسم الملف تقسيم شاشة العمل والذاكرة التشعب استرداد العمل السابق سريع الأداء لاعتماده على تجزئة المهام أما الميزات الرئيسية لمحرر نانو، فتلخص بالميزات التالية: فتح ملفات متعددة معًا تصفح المستند بالاعتماد على الأسطر التراجع عن خطوة ما إعادة تنفيذ خطوة معينة تلوين التركيب النحوي للجملة ترقيم الأسطر نلاحظ بشكل عام أن فيم يوفر إمكانيات أكثر تقدمًا ومع ذلك يقدم كلاهما الميزات الأساسية لتحرير ملفات نصية مثل ضبط إحدى إعدادات النظام وملفات الشيفرات البرمجية. 3. استخدام محرر النصوص يعتبر فتح ملف موجود مسبقًا في كل من فيم أو نانو عملية سهلة وتتحقق من خلال كتابة اسم محرر النصوص المراد استخدامه (فيم أو نانو) متبوعًا بمسار الملف كما يلي: vim Documents/text.txt nano Documents/text.txt ولكن هناك ما هو أكثر بكثير من مجرد الوصول إلى ملف أو فتحه باستخدام محرر النصوص، فيما يلي قائمة ببعض نقاط للمقارنة بين فيم ونانو حول استخدام كل منهما: table { width: 100%; } thead { vertical-align: middle; text-align: center; } td, th { border: 1px solid #dddddd; text-align: right; padding: 8px; text-align: inherit; } tr:nth-child(even) { background-color: #dddddd; } نانو Nano فيم Vim سهل الاستخدام يعمل في عدة أوضاع Mode-driven سهل التعلم صعب التعلم مصمم بهدف إجراء تعديلات سريعة استرداد العمل السابق بسهولة تلوين التركيب النحوي للجملة دلالةً على وجود خطأ يوفر قدرات متقدمة الفرق الأساسي بين نانو وفيم هو أن الجمهور المستهدف مختلف تمامًا. استخدام فيم يعمل في أوضاع تحرير متعددة Mode-driven منها: الوضع العادي الوضع المرئي وضع الإدراج الكتابة بواسطة سطر الأوامر التحرير بواسطة سطر الأوامر يعمل فيم بشكل افتراضي في الوضع العادي، ويمكن ضبط فيم كأداة كتابة حتى مع كل الأوضاع، وتتصرف أزرار لوحة المفاتيح نفسها تصرفًا مختلفًا تبعًا للوضع المفعَّل، فمثلًا يمثل زر h على لوحة المفتاتيح الحرف h في وضع الكتابة ويتحول في الوضع العادي إلى زر حركة فيحرك مؤشر الكتابة إلى اليسار بمقدار حرف واحد، ويحرك الحرف l (حرف L صغير) مؤشر الكتابة إلى اليمين بمقدار حرف واحد، وينقل الحرف j مؤشر الكتابة إلى الأسفل بمقدار سطر، وينقل الحرف k مؤشر الكتابة إلى الأعلى بمقدار سطر، كما يمكن استخدام أزرار الأسهم للتنقل. أما المفاتيح الأكثر استخدامًا فهي: "w" و "b" و "e" وشرحها وفق التالي: "w": ينقل مؤشر الكتابة إلى الكلمة التالية، وإذا كان المؤشر موجودًا في بداية الكلمة فينقله إلى بداية الكلمة التالية "b": ينقل المؤشر إلى بداية الكلمة الموجودة على يسار الكلمة الحالية "e": ينقل المؤشر إلى نهاية الكلمة الموجودة على اليمين كما يمكن مزج الأرقام بهذه المفاتيح، مثال: يؤدي الضغط على "6w" إلى تحريك المؤشر بمقدار ست كلمات للأمام. التبديل بين الأوضاع المختلفة يتطلب الضغط على مفاتيح محددة مثل: "i": لتفعيل وضع الإدراج "CTRL + C": للعودة إلى الوضع العادي "wq:": لحفظ الملف وإغلاق النافذة كل ما سبق هو لمحة بسيطة عن فيم، لمعرفة المزيد يمكن استخدام الأمر vimtutor الذي يقدم معلومات عن الأوامر الأساسية للتعامل مع الملفات كحذف ملف ما أو تعديله أو حفظه وغيرها. استخدام GNU nano يمتلك نانو واجهة أساسية تفاعلية تحتوي على معلومات مهمة في أسفل النافذة تسهل عمل المستخدم عند تنفيذ الإجراءات الأساسية ولا يحتاج إلى الاستعانة بصفحة دليل المستخدم أو أي توثيق آخر. هذا هو السبب الأساسي في تفوق نانو على فيم من ناحية سهولة الاستخدام، ومع ذلك لا تزال بعض المصطلحات المستخدمة في نانو مصطلحات قديمة، مثال على ذلك أمر "Write Out" يعني اكتب التعديلات بدلًا من "Save" يعني احفظ التعديلات على الملف وأمر "Where Is" يعني أين كذا بدلًا من "Search" يعني ابحث عن كذا، لكنها لا تعتبر مشكلة كبيرة إذ من السهل التعود عليه. لا يتشابه نانو مع استخدام Notepad أو Gedit (برامج تمتلك واجهة رسومية)، حيث عادةً ما تكون تركيبة المفاتيح لإجراء عملية القص هي "Ctrl + X" في معظم برامج التحرير الحديثة ولكن تكون في نانو "Ctrl + K". يستخدم الرمز "^" للإشارة إلى استخدام مفتاح Ctrl كمفتاح تعديل ويستخدم كمجموعة مع المفاتيح المجاورة له. توجد أيضًا مجموعات مفاتيح والاختصارات مثل: Ctrl + F لتحريك المؤشر إلى الأمام Ctrl + B الانتقال إلى الخلف Ctrl + X للخروج Ctrl + O لحفظ الملف أو حفظ الملف باسم Alt + U للتراجع عن الإجراء الأخير Ctrl + ← كلمة واحدة للخلف Ctrl + → كلمة واحدة للأمام مما سبق، يناسب محرر نانو المبتدئين خصوصًا عندما يكون كل ما يحتاجه المستخدم هو تحرير ملف من حين لآخر. 4. سهولة التعلم نلاحظ مما سبق أن فيم يختلف عن محرر النصوص التقليدي وهذا هو السبب الأساسي لكونه برنامجًا صعب الممارسة في الفترة الأولى من تعلمه واستخدامه، بينما تعتبر إمكانيات فيم المتقدمة ميزة بالنسبة للمستخدمين ذوي الخبرة وخاصة من ناحية توفير الوقت. بناء على ذلك، إذا كان المستخدم مبرمجًا أو يقوم بتحرير العديد من الملفات بين الحين والآخر فاستخدام فيم كمحرر نصوص خاص به يعتبر الخيار الأنسب، بالمقابل يحتاج نانو إلى وقت أقل لتعلمه نظرًا لامتلاكه بعض التشابه مع محرر النصوص المعتمد على الواجهة الرسومية مثل Gedit أو Notepad. هل أستعمل فيم أم نانو؟ يتيح فيم تنفيذ مجموعة متنوعة من المهام وذلك بسبب تميزه بالمرونة، ولكن من الصعب الاعتياد على آلية عمله وأوضاعه بالنسبة للمستخدم العادي، بينما يعتبر التعامل مع نانو أسهل لأنه يتيح للمستخدم القيام بالتعديلات بوضوح وبساطة. غالبًا ما يوصى باستخدام محرر النصوص نانو في البداية، وعند الحاجة إلى مزيد من الميزات أو إنجاز المهام بشكل أسرع يمكن الانتقال إلى فيم. الأسئلة الشائعة حول فيم ونانو هل فيم أفضل من نانو؟ من الناحية التقنية نعم، ولكن إذا لم تكن هناك حاجة إلى ميزات إضافية فإن استخدام فيم سيشكل عبئًا على المستخدم. هل يستخدم المبرمجون فيم؟ نعم، يميل المبرمجون ومديرو الأنظمة إلى استخدام فيم بسبب إمكانياته المتقدمة. هل نانو أكثر شهرة؟ نعم، يعتبر نانو أكثر شهرة لكونه يأتي مدمجًا مع معظم توزيعات لينكس ويعتمد عليه معظم المستخدمين بينما فيم يستخدمه قلة من الناس. ترجمة -وبتصرف- للمقال Vim vs Nano: What Should You Choose? لصاحبه Pratham Patel. اقرأ أيضًا محررات النصوص المستعملة في تطوير مواقع الويب .تعرف على أساسيات Vim - الجزء الثاني1 نقطة
-
أنشأت علاقة واحد لأكثر بين الحصة والأستاذ وبعد إنشائي للحصة ألاحظ ظهورها في جدول الحصص لكن لاتظهر في الجدول الجديد الذي يحوي العلاقة بين الاستاذ والحصة لماذا ؟؟ ملف الحصة import Sequelize from 'sequelize'; const room =(sequelize,DataTypes)=>{ const Room =sequelize.define('room',{ Numberofroom:{ type:DataTypes.STRING, }, NameOfroom:{ type:DataTypes.STRING, }, QrCode:{ type:DataTypes.STRING, unique:true, }, date:{ type:DataTypes.DATE, } }); Room.associate = (models) => { Room.belongsToMany(models.User, { through: "ListClass" }); Room.belongsTo(models.Profile,{foreignKey: 'Lista'}); }; return Room; } export default room; ملف المستخدم من نوع أستاذ import Sequelize from 'sequelize'; const profile=(sequelize,DataTypes)=>{ const Profile = sequelize.define('profile',{ phone:{ type:DataTypes.INTEGER, }, university:{ type:DataTypes.STRING, }, country:{ type:DataTypes.STRING } }); Profile.associate=models=>{ Profile.belongsTo(models.User); Profile.hasMany(models.Room,{foreignKey: 'Lista'}); } return Profile; } export default profile;1 نقطة
-
بفرض أن لدي ثلاثة أصناف على النحو التالي: class A { // ... } class B { // ... } class C { // ... } هل يمكن عمل صنف جديد يقوم بوراثة كل التوابع الموجودة في هذه الأصناف معًا في PHP؟ أي عمل extends للأصناف A, B, C معًا لصنف جديد.1 نقطة
-
أرجو فتح ملف index.js والذهاب إلى السطر رقم 6 وكتابته على الشكل التالي sequelize.sync({force:true}) حيث أن الخاصية {force:true} ستقوم بمسح البيانات الموجودة في قاعدة البيانات وإعادة بناؤها مرة أخرى حتى يتم بناؤها بالعلاقة الصحيحة بين الحصة والمدرس, بعد أن تقوم بتشغيل الخادم ستلاحظ ظهور العلاقة في قاعدة البيانات في الجدول room حيث سيظهر لك الحقل الجديد profileId , بعد ذاك يمكنك مسح الخاصية force:true مرة أخرى حتى لا يتم مسح البيانات في كل مرة يتم تشغيل الخادم فيها بالتوفيق1 نقطة
-
1 نقطة
-
لا تبدوا فكرة وراثة أكثر من صنف منطقية بالنسبة للبرمجة كائنية التوجه. هل يمكن معرفة الغرض الأول من ذلك؟ ربما ستفضل استعمال السمات لاستخدام توابع متعددة من سمات متعددة. لاحظ المثال: trait A { public function method_from_a($s) { echo $s; } } trait B { public function method_from_b($s) { echo $s; } } trait C { public function method_from_c($s) { echo $s; } } class D { use A,B,C; } $d = new D; $d->method_from_a('from a'); $d->method_from_b('from b'); $d->method_from_c('from c'); بجانب ان الأمر غير مقيد، سيمكنك استعمال مالانهاية من السمات. ان كان الأمر مقيد بثلاث أصناف بالضبط فسيمكنك كفكرة تزييف هاته العملية عن طريق وراثة صنف A من صنف B ثم الاستعانة بالتابع السحري call_ لإستدعاء تابع ما ضمن صنف ثالث C. يكون ذلك بشكل مشابه: class B { public function called_from_b($str) { echo $str; } } class C { public function called_from_c($str) { echo $str; } } class A extends B { private $c; public function __construct() { $this->c = new C; } public function __call($method, $args) { $this->c->$method($args[0]); } } $a = new A; $a->called_from_b("abc"); $a->called_from_c("def"); حيث أن: A يرث B A يمتلك خاصية c هي كائن عن النموذج C في حالة استدعاء تابع غير موجود لا في B ولا في A سيتم الاستعانة بالتابع السحري call_ لارساله من C1 نقطة
-
الجدول الذي يحمل العلاقة بينهما ليس جدول lista وإنما هو نفسه جدول الrooms وهذا لأنها علاقة واحد إلى كثير, وفي علاقة الواحد إلى كثير يكون جدول الكثير هو الذي يحمل مفتاح العلاقة , لذا أرجو إزالة الخاصية foreignKey من العلاقة وإعادة إنشاء قاعدة البيانات ستلاحظة إنشاء جدول rooms يحمل بداخله مفتاح يُشير إلى الأستاذ الموجود في تلك الحصة1 نقطة
-
لقد قمت بإنشاء علاقة واحد إلى كثير بين room و profile وظهر مفتاح العلاقة في الجدول room لأن الطبيعي أن مفتاح العلاقة يظهر في جدول الواحد ولا يظهر في جدول الكثير ومن ثم قمت بإنشاء علاقة كثير إلى كثير بين الجدولين Room و users وقد تم إنشاء جدول ثالث ليحتوي العلاقة وقمت بتسميته بListClass وأرى في الصورة أن كل شئ يعمل بشكلٍ سليم , تقول أن الجدول الجديد الذي يحمل العلاقة بين user و Room لا يظهر فيه العلاقة , فهل يمكنك تصوير الجدول من الداخل؟1 نقطة
-
1 نقطة
-
1 نقطة
-
ما هو الافضل ك back-end php or python مع العلم اني تعلمت بايثون من قبل و من عليه فرص عمل اكثر و من هو الافضل في وقتنا الحالي1 نقطة
-
أردت جلب معلومات الحصص من قاعدة البيانات لكني أرى ظهور التاريخ كما هو في قتاعدة البيانات ماهو السبب وكيف أغيره ؟ ثانيا هو يجلب لي جميع الحصص المسجلة في قاعد البيانات وأنا أريد أن أجلب فقط الحصص التي أنشأها المستخدم الحالي للتطبيق كيف أفعل ذلك ؟ شيفرة عرض جميع الحصص import React ,{useEffect,useState} from 'react'; import {View,Text,StyleSheet,TouchableOpacity,FlatList,SafeAreaView} from 'react-native'; import List from './compononts/list'; import axios from '../config/axios'; import Loader from './compononts/Loader'; import Inbut from './compononts/Inbut'; import {GETROOMS_URL} from '../config/urls'; import AsyncStorage from '@react-native-async-storage/async-storage'; function ListRoom(){ const [isLoading ,setLoading]=useState(false); const [rooms ,setRooms]=useState([]); const [selectedRoom,setSelect]=useState(null); useEffect(()=>{ _getRooms(); },[]); _getRooms=()=>{ (async()=>{ setLoading(true); try{ const token =await AsyncStorage.getItem('accessToken'); axios.defaults.headers.common.Authorization=`JWT ${token}`; const response =await axios.get(GETROOMS_URL); setRooms(response.data); setLoading(false); }catch(e){ setLoading(false); } })(); } const renderItem = ({item})=>{ return ( <View style={stayles.container}> <List date={item.date} > </List> </View> ) } const KeyExrtactor=item=>item.id.toString(); return( <View style={stayles.container}> <Loader title="إحضار الحصص" loading={isLoading}></Loader> <SafeAreaView style={stayles.container}> {rooms.length !==0 ?( <FlatList data={rooms} renderItem={renderItem} KeyExrtactor={KeyExrtactor} > </FlatList> ):<Text>لا يوجد حصص</Text>} </SafeAreaView> </View> ) }; const stayles=StyleSheet.create({ container:{ flex:1, backgroundColor:'#E8EAED', } }) export default ListRoom; backend.rar1 نقطة
-
لحل مشكلة التاريخ لديك خيارين، الأول هو استخدام ال Date المبني بشكل افضراضي في js واستخدام الفورمات المخلتفة التي يقدمها للتواريخ لإظهاره بالشكل التي تريده، مثال : const d = new Date("التاريخ القادم من قاعدة البيانات"); let text = d.toLocaleDateString(); console.log(text); // 12/12/2012 حيث الوظيفة السابقة تعرض التاريخ بالشهر واليوم والسنة، وهنالك الـ ()toLocaleTimeString لعرض الوقت بالساعات والدقائق والثواني، وكذلك ()toLocaleString لعرض التاريخ مع الوقت. أو بإمكانك استخدام مكتبة جاهزة تتيح العديد من الوظائف الخاصة بعرض الوقت وهي : momentjs وتقوم بتنزيلها بالشكل : npm install moment --save ومن ثم استدعائها بالشكل : import moment from 'moment'; واستخدامها : moment().format('MMMM Do YYYY, h:mm:ss a'); // June 6th 2022, 9:49:49 am moment().format('dddd'); // Monday moment().format("MMM Do YY"); // Jun 6th 22 moment().format('YYYY [escaped] YYYY'); // 2022 escaped 2022 moment().format(); // 2022-06-06T09:50:06+03:00 بالنسبة للسؤال الثاني فالمشكلة هي من استدعاء البيانات من قاعدة البيانات فيجب إضافة شرط أن يكون اسم المستخدم يساوي اسم المستخدم التي تريد البيانات الخاصة به.1 نقطة
-
بجانب الطرق التي اقترحها المدرب سامح، يمكنك الاستفادة من طريقة النسخ المنظم أو المهيكل structured cloning عن طريق الوظيفة الجديدة structuredClone الموجودة في جافاسكربت كالتالي: var newObj = structuredClone(myObj); مثال: /*الكائن الأصلي*/ var myObj = {a: 1, b: 2, c: 3} /*نسخة عن الكائن*/ var newObj = structuredClone(myObj) /*استعراض النسخة أول الأمر*/ console.log(newObj) /*تغيير خاصية بالكائن الاصلي واعادة استعراض الكائنين*/ setTimeout(() => { myObj.a = 5 console.log(myObj , newObj) } ,2000) مثال عملي.1 نقطة
-
في هذه الحالة يجب استخدام طلبات AJAX، يمكن الاستفادة من الحدث change على حقل الإدخال لإرسال طلبات إلى الخادم للاستعلام عن القيمة الحالية كالتالي: <script> document.querySelector('input[name=code]').addEventListener('change', function(e) { const code = e.target.value; // إرسال طلب للاستعلام fetch(`/?code=${code}`) .then(res => res.text()) .then(nameExists => nameExists == 1 ? showError('الاسم مسجل مسبقًا')) : clearError(); }); function showError(message) { // .. HTML إظهار رسالة الخطأ ضمن } function clearError(){ // .. إخفاء رسالة الخطأ } </script> وضمن شيفرة php يمكن تلقي القيمة q من GET_ وإرسال رد إما ب 1 أو 0 ليعبر وجود الاسم مسبقًا أم لا (من الضروري طباعة النتيجة وإنهاء الطلب مباشرة لأنه طلب استعلام فقط )كالتالي: <?php if(isset($_GET['code']){ $code = $_GET['code']; $ser = $database->prepare("SELECT * FROM `test` WHERE CODE = $code"); $ser->execute(); echo count($ser->fetchAll()) > 0 ? "1" : "0"; // طباعة نتيجة الاستعلام exit(); // انهاء الطلب }1 نقطة
-
عملية التحقق تتم بالكامل بطرف الخادم، أي لا داعي لوجود شيفرة جافاسكريبت ضمن الصفحة، المشكلة لديك أن الشيفرة تتحقق من ووجود القيمة add في المصفوفة POST_$ وعلى أساسها تدرج سجل جديد ضمن قاعدة البيانات دون التحقق فيما إذا كان موجودًا من قبل، لحل المشكلة يجب نقل عملية التحقق إلى الأعلى قبل عملية الإدراج وتسجيل نتيجة عملية التحقق في حال فشلت في متغير ما يتم عرضه كرسالة للمستخدم أسفل النموذج كالتالي: <?php // محاولة إنشاء جديدة if(isset($_POST['add'])){ // نتحقق أولًا $code=$_POST['code']; $name=$_POST['name']; $ser = $database->prepare("SELECT * FROM `test` WHERE CODE = $code"); $ser->execute(); $error = null; if(count($ser->fetchAll()) > 0) { // نظهر خطأ $error = "الكود مسجل من قبل" . " " . $_POST['add'] ; } else { // نضيف سجل جديد $add=$database->prepare("INSERT INTO `test` (`id`, `code`, `name`) VALUES (NULL, $code, '$name')"); $add->execute(); } } ?> <form action="" method="POST"> <input onchange="search()" name="code" type="number" placeholder="ادخل الكود"> <input name="name" type="text" placeholder="ادخل الاسم"> <button name="add" type="submit">add اضافة</button> </form> <?php /* عرض رسالة الخطأ */ if($error) echo $error; ?>1 نقطة
-
يوجد العديد من الطرق التي تُمكنك من نسخ clone كائن بالكامل، من ضمن هذه الطرق: إستخدام JSON const clone = JSON.parse(JSON.stringify(myObj)); تفي هذه الطريقة بالغرض عند التعامل مع الكائنات البسيطة (التي لا تحتوي على توابع Methods)، ولكن سيظهر خطأ TypeError إذا كان الكائن myObj يحتوي على أي توابع Methods. طريقة Shallow Copy const shallowClone = { ...myObj }; تقوم هذه الطريقة بعمل نسخة سطحية من الكائن وتخزينها في المتغير الجديد، ولكن ستظل كل التوابع والخصائص تُشير إلى نفس الكائنات بدون تغير. إستعمال مكتبة jQuery مثل مكتبة lodash توفر jQuery التابع extend والذي يقوم بنسخ الكائن بشكل كامل أيضًا: var clone = $.extend(true, {}, myObj); ستعمال مكتبة Lodash توفر مكتبة lodash الكثير من التوابع للتعامل مع الكائنات بشكل عام، ومن ضمن هذه التوابع يوجد التابع clone والذي يوفر إمكانية نسخ كائن بالكامل بطريقة سهلة وبسيطة: var clone = _.clone(myObj); لا يوجد فرق بين طريقة shallow clone السابقة والتابع clone، ولكن توفر lodash أيضًا تابع باسم cloneDeep والذي يقوم بنسخ الكائن بالكامل وليس مجرد نسخ سطحي: var clone = _.cloneDeep(myObj);1 نقطة
-
لا تزال عقبة مناقشة وتحديد السعر من أهم مؤرّقات رواد العمل الحر حول العالم بمختلف مجالات عملهم وسنوات خبرتهم. لذا فنتحدث عن أهم الأفكار والحلول التي تساعدك في التفاوض وتحديد الأجرة بصورة أفضل. لا تقلل من أسعارك قد يبدو ذلك بديهيًا لكنه خطأ يستحق التنويه، تجنب البخس بقيمة عملك سواءً كنت مبتدئًا أم مخضرمًا في مجالك. يمكنك ببساطة محاولة تدوين مهاراتك وسنوات دراستك وخبرتك وإنجازاتك، ثم موازنة نفسك مع المحترفين في مجالك لتكتشف أنه ربما لديك من الخبرة ما يستحق أكثر مما كنت تعتقد. وفقًا لأحد رواد العمل الحر، يجب تحديد أجر أكبر بـ 30-40% من المعدل السنوي لأجور العمل التقليدي بالنسبة لمجال العمل نفسه. على سبيل المثال، إذا كان الموظف بمجال معين يتقاضى 12000$ سنويًا، فإن ساعة عمله تعادل ما يقارب 6$ بفرض أنه يعمل 40 ساعة أسبوعيًا، لذا فيجب تقاضي 8$/ساعة تقريبًا للعمل الحر بهذا المجال. قد تستغرب ذلك، لكن تذكر أن بعض البلدان تفرض على العاملين بنظام العمل الحر ضرائب توظيف ذاتي تزيد بنسبة 30% عن ضرائب العاملين بوظيفة شهرية ثابتة. لا ننكر أن مرونة العمل وحريته تستحق دفع هذه الضريبة المضافة، لكن يجب أخذها بالحسبان عند تحديد الأجر. الآن وقد أصبحت تدرك قيمة ما لديك، فكيف تتفاوض مع العميل حول السعر؟ تحدث عن مزايا عملك بلغة عميلك إذا كان عميلك من النوع الذي يهتم بالمردود المادي الذي سيجنيه من توظيفك، فاحرص على شرح التأثير الإيجابي لعملك على أرباح مشروعه، وحاول استخدام الأرقام والمعطيات التي تدل على ذلك مثل حساب عائدات الاستثمار ROI، وابدأ نقاشك معه حول الأجرة من هذه الفكرة؛ أما إذا كان العميل من النوع الذي يهتم بالتنمية المبكرة والتوسع في النشاط التجاري (كما هو الحال لدى جميع الشركات الناشئة المعتمدة على المخاطرة برأس المال)، فاشرح للعميل كيف سيساهم عملك في وصول الشركة إلى مستخدمين جدد وكيف ستجذب مستخدِمي الشركات المنافسة، وناقش معه ذلك من خلال رسوم بيانية واضحة. وفي حال كنت بصدد التفاوض حول عمل إبداعي مثل كتابة المحتوى أو التصوير أو التصميم الجرافيكي، فحاول الحديث عن أفكار مترابطة متعلقة بالموضوع الذي يريد عرضه لعملائه، واشرح كيف سيساهم عملك في تحسين مشروعه، ولتكن أفكارك متسلسلة ومنظمة أثناء الحوار. إذا لمست من عميلك أنه مستعد لدفع السعر الذي ترغب به لكنه يحتاج لضمانات من طرفك، فذكره بخبرتك المضمونة في المجال، وابدأ بمناقشة تفاصيل المشروع معه بكل جدية، واطرح عليه أسئلةً جوهريةً، مع إنشاء إطار زمنيًا لمراحل العمل وقدّر المدة التي ستستغرقها كل مرحلة وقدّر التكاليف والأتعاب لكل مرحلة وزدها قليلًا احتياطًا. في النهاية ستكون قد حسبت الميزانية المطلوبة وأجرة عملك وأثبتت أن لديك الخبرة الكافية وأنك تعلم جيدًا كيف تنجز العمل. اختر عملاء يقدرون قيمة عملك من تزكيات أو منصات عمل ضامنة من المسائل الشائعة التي تواجه رواد العمل الحر في أيامنا هذه أن الكثير من العملاء وحتى الشركات ذات الميزانية العالية يسعون لدفع أجور أقل مقابل الحصول على خدمات أكبر، ربما بسبب كثرة "اليد العاملة الرخيصة" عبر الإنترنت. ومع ذلك يجب ألا يكون ذلك مدعاةً لليأس، ففي النهاية لا بد أن يدرك العملاء حاجتهم لعمل عالي الجودة قادر على جذب الزبائن وتحقيق مبيعات. التزكية هي إحدى الأساليب التي يمكنك اتباعها لإيجاد عملاء يقدّرون جودة عملك، فإذا كنت تتناقش مع عميل جديد مثلًا، فيمكنك أن تطلب منه أن يتحدث مع عميلك السابق أو الحالي ليكفل له جودة عملك وأثره الإيجابي على مشروعه، إذ يقتنع العميل أكثر من عميل آخر والتجربة خير برهان، ولطالما كانت هذه الوسيلة فعالةً في جذب انتباه صاحب العمل وتعزيز الثقة والضمان. وفي حال إصرار العميل المرتقب على التقليل من قيمة عملك، فيجب هنا مواجهته بصورة مباشرة وإخباره أن بإمكانه دفع مبلغ قليل مقابل الخدمة المطلوبة، لكنه سيحصل على نتائج قليلة الجودة. قد يثير هذا الأسلوب القلق لدى صاحب العمل، لكنه ربما يحترم صراحتك وحرصك على مصلحته. عندما تبحث عن عمل جديد، حاول أن تبدأ من أصدقاء أصدقائك أو أصدقاء عملائك، واحرص على الانضمام إلى مجموعات العمل الحر التي تضم أشخاصًا من نفس مجال عملك، وبذلك تجد متنفَسًا لتبادل الحديث عن المشاكل التي تواجهك في عملك، فضلًا عن تبادل فرص العمل وبناء بيئة متكاملة موثوقة من المزكّين والعملاء. من الخيارات الأخرى المطروحة، الانضمام إلى منصات عمل حر تجذب العملاء لحرصها على اختيار أفضل العاملين وأكثرهم كفاءةً للعمل لديها، وبذلك يضمن العميل جودةً عاليةً من جهة، كما يضمن العامل الحر تقدير قيمة عمله واستيفاء أجر مقبول من جهة أخرى. لا تناقش السعر من أول لقاء سواءً كنت تتواصل مع عميلك على أرض الواقع أو عبر الإنترنت، يجب أن تأخذ بالحسبان أن الهدف من اللقاء الأول هو فهم غرض العميل وأهدافه وطبيعة العمل المطلوب، لذا لا تستعجل في التفاوض حول السعر، بل اجمع المعلومات اللازمة لتتمكن من فهم المهمة المطلوبة والمدة التي تستغرقها والمتطلبات اللازمة لتنفيذها، ثم بعد ذلك يمكنك تحديد السعر المناسب الذي عليك أن تطلبه وتفاوض (إن دعت الحاجة) للوصول إليه. عندما يحين موعد النقاش حول السعر، كن صريحًا وشفافًا، وفي حال تحديد الأجر بالساعة، فاتفق مع العميل قبل البدء على أقصى عدد من الساعات في الشهر يمكن أن يدفع لك أجرها، وذلك لكي تضمن ألا تعمل عملًا إضافيًا لن تحصل على أجرته، وتتجنب الوقوع في أزمة توسُّع المشروع بعد البدء بالعمل، حيث يحصل في كثير من الحالات أن يطلب منك العميل متابعة العمل مع زيادة أجرة المشروع وساعات العمل المتفق عليها في الشهر طالما أن الميزانية التي رصدها تغطي هذه المدة. من المفيد أن تكون الاتفاقية واضحةً من البداية لكي لا تتعارض مع أعمالك الأخرى خارج المشروع. سلط الضوء على إنجازاتك للتأكيد على كفاءتك إذا كنت قد حصلت على جائزة ما، فلا تنسَ مشاركة ذلك على موقعك الإلكتروني أو ملفك الشخصي لتثبت كفاءتك بصورة غير مباشرة، وتحدث بكل ثقة عن النتائج التي حققتها. احرص على عرض كل الإنجازات التي تحققها على الإنترنت من خلال ملف شخصي منظم يعكس خبرتك إما على موقعك الإلكتروني، أو على مدونتك أو في وسائل التواصل الاجتماعي، أو بإنشاء معرض لأعمالك. اختر الشروط المناسبة للعمل التطوعي إذا كنت بصدد العمل دون مقابل للحصول على خبرة أو لمساعدة صديق ما، فاحرص على اختيار عمل لديك الشغف والإيمان به والرغبة في تنفيذه. من ناحية أخرى، إذا عُرض عليك العمل مقابل أجر مادي رمزي بدلًا من التطوع الكامل، فاختر الحصول على خدمة من الطرف الآخر مقابل عملك وليس أجرًا رمزيًا، وذلك لكي لا يساء فهم الموضوع على أنك تعمل عملًا مأجورًا رخيص الثمن. تعامل باحترافية واترك انطباعات إيجابية هذه النصيحة تعزز فعليًا من قيمتك أكثر من كونها تعلمك أن تعرف قيمتك. عندما يفضل الناس العمل معك أكثر من منافسيك، فهذا يعني أنهم سيدفعون لك ما تستحق، لذا كن تعاملك معهم مُرضيًا ومريحًا. ضع نفسك مكان العميل لتعرف كيف يحب أن تتعامل معه، وحاول أن تخطط للمشروع بصورة استباقية لتكتشف العقبات التي يمكن أن تواجهك وتتجنب الوقوع فيها أو تجد حلولًا لها. كل ذلك يرجح كفة اختيارك للعمل أمام منافسيك ممن لديهم خبرة توازي خبرتك، لكنهم لم يدركوا أهمية الذكاء العاطفي الذي يُعَدّ اليوم ضرورةً ملحةً في بيئة العمل الحر. قد يبدو الحديث عن تقدير قيمة الذات موضوعًا إنشائيًا ولا يمكن تحديد معالمه، لكنه في الواقع يجب أن يكون مفهومًا ومحددًا بخطوات عملية واضحة وقابلة للتطبيق. ترجمة -وبتصرّف- للمقال How to set your rate and communicate your value as a freelancer لصاحبه Shannon Byrne. اقرأ أيضًا أبرز مشاكل العمل الحر والحلول المُقترحة لها كيف ومتى تقوم بإعادة التفاوض على أسعارك ككاتب مستقل النسخة الكاملة من كتاب: دليل المستقل والعامل عن بعد1 نقطة
-
لا يجب أن تستخدم المعامل == عند المقارنة في PHP خصوصًا عند مقارنة النصوص حيث ستحصل على نتيجة مختلفة عما تتوقعه، فعلى سبيل المثال كل العمليات التالية سوف تُعيد True: <?php echo "hi" == 0; // True echo 1 == '1'; // True echo '80000' == '8e4'; // True وذلك لأن PHP تقوم بتحويل أنواع القيم، ومن الأفضل إستخدام المعامل === بدلًا من == عند المقارنة بين قيمتين: <?php echo "hi" === 0; // False echo 1 === '1'; // False echo '80000' === '8e4'; // False1 نقطة
-
إن كان لديك عنوان URL مُخزن في متغير، فيمكنك تحليله وإستخراج query منه من خلال الدالة parse_url و parse_str بالشكل التالي: <?php $url = "https://www.example.com/search.php?q=myquery&abc=123"; // نستخرج الـ query من العنوان $query = parse_url($url, PHP_URL_QUERY); // q=myquery&abc=123 // نقوم بتحويل النص السابق إلى مصفوفة ترابطية key-value $queries = array(); parse_str($query, $queries); // يمكن إستخدام المصفوفة أو أحد المفاتيح منها بالشكل التالي echo $queries['abc']; // 123 echo $queries['q']; // myquery ملاحظة: بدءًا من الإصدار PHP 7.2 لا يُفضل استخدام الدالة parse_str() بدون المعامل الثاني لها، لأنها ستقوم في هذه الحالة بتحويل المفاتيح keys إلى متغيرات (q$ و abc$) ، وقد يقوم بعض المخترقين Hackers بإستغلال هذا الأمر في صالحهم ومحاولة إختراق الموقع. يمكنك الإطلاع على هذه المقالة لمزيد من المعلومات عن كلا الدالتين: أو من خلال موسوعة حسوب: الدالة parse_str() في PHP1 نقطة
-
لا يوجد رقم ثابت فالأمر يختلف من مسمى وظيفي لآخر (مطور واجهات أمامية Frontend، مطور تطبيقات، مطور وجهات خلفية Backend .. إلخ) كما أن الدخل الشهري للمبرمج يعتمد على الشركة التي يعمل بها أو المجهود الذي يقوم به (إذا كان يعمل كمستقل في أحد مواقع العمل الحر مثل خمسات أو مستقل) ويختلف هذا الأمر من دولة لآخر كذلك، على سبيل المثال قد يكون هناك شركة تدفع للمبرمج X دولار، وشركة أخرى تدفع الضعف لنفس المبرمج. أيضًا تُعد المميزات التي تقدمها الشركة للمبرمج عاملًا مهمًا في تحديد المرتب، فعلى سبيل المثال قد تحصل على مرتب كبير نسبيًا من أحد الشركات ولكن لا تحصل على أي تأمينات أو قد تعمل في بيئة سيئة نوعًا ما مما يجعل العمل في هذه الشركة صعبًا وغير مريح، وقد تقوم شركة أخرى بدفع مرتب متوسط لنفس المبرمج مع الحصول على بعض الإمتيازات الوظيفية مما يجعل العمل في هذه الشركة مريح ومربح للمبرمج كذلك في نفس الوقت، لذلك فإن الراتب الشهري ليس العامل الوحيد الذي يجب أن يُأخذ في الحسبان. هناك طريقة بسيطة يمكنك إستخدامها لحساب متوسط الدخل الشهري (في مواقع العمل الحر)، قم بالذهاب إلى أحد مواقع العمل الحر مثل مستقل على سبيل المثال، وقم بقراءة المشاريع المطلوبة ومتوسط العرض وميزانية كل مشروع، وقم بحساب عدد المشاريع التي يمكنك أن تقوم بها شهريًا، ومن خلال هذه الأرقام تستطيع تحديد متوسط الدخل الذي يمكنك الحصول عليه إن عملت كمستقل. وعندما تنهي أحد دورات حسوب سوف تحصل على العديد من النصائح والمساعدة أثناء فترة بحثك عن عمل، وأنا أقتبس هنا من صفحة الأسئلة الشائعة: الأمر الآخر هو أن أكاديمية حسوب تضمن لك استرداد استثمارك خلال 6 أشهر إن لم تحصل على عمل بعد إتمام الدورة: إن أردت العمل كمستقل، فستجد في قسم العمل الحر الكثير من المقالات المفيدة والنصائح والإرشادات التي ستمكنك من العمل كمستقل بشكل إحترافي1 نقطة