لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 07/29/21 في كل الموقع
-
السلام عليكم لدي اكواد احدها يرسل اوامر لاظهار اشعارات الرسائل والاخر لاظهار الرسائل والتحديث التلقائي للصفحة والتحريك التلقائي للشريط الجانبي كيف يمكن دمج الاكواد معا سوف ارفق المشروع كاملا ايضا <script src="js/jquery-1.8.0.min.js"></script> <script src="js/jquery-3.1.0.min.js"></script> <script src="js/bootstrap-3.3.7.min.js"></script> <link rel="stylesheet" href="css/bootstrap.min.css" /> <script> var $j = jQuery.noConflict(); $j(document).ready(function(){ function load_unseen_notification(view = '') { $j.ajax({ url:"show_messages_menu.php", method:"POST", data:{view:view}, dataType:"json", success:function(data) { $j('.dropdown-menu').html(data.notification); if(data.unseen_notification > 0) { $j('.count').html(data.unseen_notification); } } }); } load_unseen_notification(); $j('#messages_form').on('submit', function(event){ event.preventDefault(); if($j('#username').val() != ''&& $j('#message').val() != '') { var form_data = $j(this).serialize(); $j.ajax({ url:"send_messages_form.php", method:"POST", data:form_data, success:function(data) { $j('#messages_form')[0].reset(); load_unseen_notification(); } }); } else { alert(" رسالة فارغة رجاءا اكتب شىء "); } }); $j(document).on('click', '.dropdown-toggle', function(){ $j('.count').html(''); load_unseen_notification('yes'); }); setInterval(function(){ load_unseen_notification();; }, 1000); }); </script> <script type="text/javascript"> var $j = jQuery.noConflict(); $j(document).ready(function(){ //##### Add record when Add Record Button is click ######### $j("#messages_form").submit(function(e) { e.preventDefault(); //build a post data structure var username = $j("#my_username").val(), message = $j("#my_message").val(); if (message == '') { alert(" رجاءا اكتب رسالة "); return false; } jQuery.ajax({ type: "POST", // Post / Get method url: "send_messages_form.php", //Where form data is sent on submission dataType: "text", // Data type, HTML, json etc. data: { username: username, message: message, }, //Form variables success: function(response) { $j("#norec").hide(); $j("#div_show_message").append(response); $j('#messages_form').trigger('reset'); }, error: function(xhr, ajaxOptions, thrownError) { alert(thrownError); } }); }); }); 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> project.rar1 نقطة
-
ما هي مزايا وعيوب كل منهما؟ من خلال ما رأيته ، يمكن أن يعمل أحدهما كبديل للآخر إذا لزم الأمر ، فهل يجب أن استخدام كليهما أم يجب أن ألتزم بواحد منهما فقط؟ هل سيؤثر أداء البرنامج على اختياري؟ أقوم ببعض التعلم الآلي machine learning باستخدام numpy ، لذلك هناك بالفعل الكثير من المصفوفات matrices، ولكن أيضًا الكثير من المتجهات vectors (المصفوفات arrays). import numpy as np mat = np.mat('4 3; 2 1') arr = np.array([[4, 3], [2, 1]])1 نقطة
-
أشعر بالفضول لمعرفة ما إذا كان هناك أي طريقة لطباعة numpy.arrays ، على سبيل المثال ، بطريقة مشابهة لهذه: [ 0.71 0.65 0.46 0.13 0.87 0.54 0.77 0.37 0.1 0.66 ] بدلًا من الطريقة العادية: array([0.71, 0.65, 0.46, 0.13, 0.87, 0.54, 0.77, 0.37, 0.1 , 0.66]) إذا كنت أرغب في طباعة مصفوفة الصفوف الصغيرة ، فإنها تطبع العديد من الكسور العشرية floats، غالبًا بتنسيق "علمي scientific" ، وهو أمر يصعب قراءته حتى بالنسبة للمصفوفات ذات الأبعاد القليلة. ومع ذلك ، يبدو أنه يجب طباعة numpy.array كنص >>> a = np.random.random(10) >>> a array([0.71244268, 0.65202232, 0.45514279, 0.12868502, 0.86755307, 0.54365432, 0.76884071, 0.37287693, 0.10350725, 0.66008725]) >>> str(a) '[0.71244268 0.65202232 0.45514279 0.12868502 0.86755307 0.54365432\n 0.76884071 0.37287693 0.10350725 0.66008725]' كيف يمكنني طباعة المصفوفة بالشكل السابق بدون تحويلها إلى نص؟ وكيف يمكنني التحكم في عدد الأرقام الموجودة بعد العلامة العشرية؟1 نقطة
-
هل هناك طريقة أو دالة في Numpy لإيجاد أقرب قيمة في المصفوفة؟ على سبيل المثال، لدي مصفوفة كالتالي: >>> import numpy as np >>> array = np.random.random(10) >>> array array([0.98547232, 0.72307097, 0.74612579, 0.92416426, 0.56989436, 0.44332925, 0.76635451, 0.54613872, 0.42633231, 0.72585823]) أريد دالة تعطيني أقرب قيمة في المصفوفة لرقم معين كالتالي: get_nearest(array, 5.0) # Output: 0.546138721 نقطة
-
اكتب برنامج يقوم بايجاد اكبر قيمة في المصفوفة، ويجمع الصفوف ويقوم بايجاد اكبر مجموع في الجمع. *ملحوظة:المستخدم يدخل القيم.1 نقطة
-
package Java; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); System.out.print("Enter 2D array size : "); int rows=sc.nextInt(); // قراءة عدد الصفوف int columns=sc.nextInt(); // قراءة عدد الأعمدة System.out.println("Enter array elements : "); int twoD[][]=new int[rows][columns]; // انشاء المصفوفة بالحجم الذي أدخله المستخدم // ملء المصفوفة بالعناصر for(int i=0; i<rows;i++) { for(int j=0; j<columns;j++) { twoD[i][j]=sc.nextInt(); // قراءة العدد و تخزينه في مكانه } } System.out.print("\nData you entered : \n"); for(int []x:twoD){ for(int y:x){ System.out.print(y+" "); } System.out.println(); } } } شكل المخرجات اذا ادخل ١اطبع A و٢اطبعB مثال Data print A B كيف اجعل البرنامج بهذا الشكل من المخرجات؟1 نقطة
-
لدي في لوحة التحكم كود جافا وبه زر حذف اريد عند الضغط عليه لا ينفذ الامر تلقائي بل يسال هل تريد الحذف ام لا <button style="margin-top:10px;" class="btn btn-danger" onclick="onclickDeleteUsers('${idUsers}');return false;"><i class="fa fa-trash-alt"></i></button> function onclickDeleteUsers(keyuser){ dbUsersSearch.child(keyuser).remove() .then(function() { alert("Remove succeeded."); location.reload(); }) .catch(function(error) { alert("Remove failed: " + error.message); }); }1 نقطة
-
السلام عليكم ورحمة الله وبركاتة, انا في الحقيقة لدي بعض المشاكل في أكواد الاشعارات بأستخدام لغة الكوتلن. في تطبيقي انا استخدم أداة "Time bicker" للمستخدم حتى يختار وقت معين وان اتى الوقت الذي قام بتحديدة يتم تفعيل الاشعار لتذكيرة بالصلاة, والحمدالله يعمل هذا النوع من الاشعار بشكل جيد. لكن أنا اريد اولا ان اضيف وقت افتراضي محدد قبل استخدام الـTime bicker ومفعل بشكل تلقائي حتى يرسل الاشعار الى المستخدم بنفس التوقيت الى ان يستخدم المستخدم اداة "Time bicker" لتغير موعد الاشعار. فمشكلتي هي: 1- كيف أضيف وقت افتراضي "default time" حتى يتم ارسال الاشعار الى المستخدم قبل ما يستخدم أداة time bicker حتى يتم ارسال الاشعار بتوقيت اخر اليه؟ 2- هل يجب علي استخدام shared preference حتى يعمل الاشعار بنفس التوقيت يوميا؟ أكون متشكر جدا الى اي شخص يعطيني اجابات اسئلتي او يلمح لي.. Android Manifast.xml <receiver android:name=".AthanBrodcasts.fajrBroadcastReceiver"/> My broadcast receiver class fajrBroadcastReceiver : BroadcastReceiver() { val CHANNEL_ID = "أذان الفجر" override fun onReceive(context: Context?, intent: Intent?) { val intent = Intent(context, MainActivity::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent : PendingIntent = PendingIntent.getActivity(context,0,intent,0) val builder = NotificationCompat.Builder(context!!, CHANNEL_ID) .setSmallIcon(R.drawable.ic_fajr_icon) .setContentTitle("صلاة الفجر قد حلت") .setContentText("بسم الله الرحمن الرحيم") .setPriority(NotificationCompat.PRIORITY_HIGH) .setDefaults(NotificationCompat.DEFAULT_ALL) .setContentIntent(pendingIntent) .setAutoCancel(true) with(NotificationManagerCompat.from(context)) { notify(123, builder.build()) } } } My Setting Activity private lateinit var picker : MaterialTimePicker private lateinit var calender : Calendar val CHANNEL_ID = "أذان الفجر" private lateinit var alarmManager: AlarmManager private lateinit var pendingIntent: PendingIntent fajrEditTxt.setOnClickListener { showTimePicker() } fajrSalah.setOnCheckedChangeListener { buttonView, isChecked -> if (isChecked){ }else{ } } private fun showTimePicker(){ val fajrtime = getSharedPreferences("saveSettingData", Context.MODE_PRIVATE) picker = MaterialTimePicker.Builder() .setTimeFormat(TimeFormat.CLOCK_12H) .setHour(fajrtime.getInt("fajrTimeHour", 0)) // I took it from a library I use .setMinute(fajrtime.getInt("fajrTimeMinutes",0)) // I took it from a library I use .setTitleText("حدد الموعد الذي تريدة") .build() picker.show(supportFragmentManager, "AdhanNotifacations") picker.addOnPositiveButtonClickListener { if(picker.hour > 12){ fajrEditTxt.setHint(String.format("%02d",picker.hour - 12) + ":" + String.format("%02d", picker.minute) + " PM") }else{ fajrEditTxt.setHint(String.format("%02d",picker.hour) + ":" + String.format("%02d", picker.minute) + " AM") } calender = Calendar.getInstance() calender[Calendar.HOUR_OF_DAY] = picker.hour calender[Calendar.MINUTE] = picker.minute calender[Calendar.SECOND] = 0 calender[Calendar.MILLISECOND] = 0 alarmFajr() } } private fun createNotificationChannel(){ val channelName = "مؤذن الفجر" val DESCRIPTION_TEXT = "أشعار لأذان الفجر" if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){ val name = channelName val description_text = DESCRIPTION_TEXT val importance = NotificationManager.IMPORTANCE_HIGH val channel = NotificationChannel(CHANNEL_ID, name, importance).apply { description = description_text } val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager notificationManager.createNotificationChannel(channel) } } fun alarmFajr(){ alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager val i = Intent(this, fajrBroadcastReceiver::class.java) pendingIntent = PendingIntent.getBroadcast(this, 0, i,0) alarmManager.setInexactRepeating( AlarmManager.RTC_WAKEUP, calender.timeInMillis, AlarmManager.INTERVAL_DAY, pendingIntent ) } >> نسخه من السؤال موجود في موقع Stack overflow استخدم جافا وكوتلن فقط1 نقطة
-
السلام عليكم كيف يمكننى ان احذف كل ال items فى axios كلها وليس مجرد item واحدة هل هذا الكود ينفع ؟ axios.delete (` url…… /deleteAll`) ام ماذا ؟1 نقطة
-
سلام عليكم ,, احد يعرف تطبيق او برنامج او اضافة يخليني افتح ملفات الPDF من الواتساب ويب او التيلقرام ويب او اي موقع بدون ما احمل ملف الPDF ؟1 نقطة
-
التابع count تم تعريفه للاستخدام مع القوائم ولكنه غير معرف من أجل المصفوفات ولهذا السبب ظهر لديك هذا الخطأ، والحل كالتالي، نقوم بتحويل المصفوفة إلى قائمة عن طريق الباني list ثم نطبق عليها التابع: a = np.arange(10) a=np.array([0, 11, 11, 3, 4, 11, 6, 7, 8, 9]) serach=11 list(a).count(serach) # 3 لكن هذه الطريقة يمكنك استخدامها فقط في حالة كانت مصفوفتك أحادية الأبعاد. أما في حالة كانت مصفوفتك متعددة الأبعاد فيمكنك اسخدام خدعتي السحرية لحل المشكلة، وهي استخدام التابع reshape لتحويل المصفوفة من مصفوفة متعددة الأبعاد ثم استخدام التايع count معها: a = np.arange(10) a=np.array([[8, 9],[8, 8]]) a=a.reshape(-1) serach=8 list(a).count(serach) # 3 ويمكنك استخدام التابع np.bincount(a) أيضاً بنفس الطريقة (هذا التايع أيضاً يقوم بحساب التكرار للمصفوفات أحادية الأبعاد فقط، وبالتالي نستخدم نفس التكتيك السابق لحل المشكلة) حيث يعيد لك تكرارات كل العناصر: a = np.arange(10) a=np.array([[8, 9],[8, 8]]) a=a.reshape(-1) print(a) # [8 9 8 8] serach=8 np.bincount(a) # array([0, 0, 0, 0, 0, 0, 0, 0, 3, 1], dtype=int64) إن مايميز هذا التابع هو سرعته الغير قابلة للمقارنة ببقية الطرق. وأيضاً يمكنك استخدام التابع Counter ينفس الأسلوب، حيث تعيد قاموس بكل قيمة وتكراراتها: a = np.arange(10) a=np.array([[8, 9],[8, 8]]) a=a.reshape(-1) print(a) # [8 9 8 8] from collections import Counter Counter(a) # Counter({8: 3, 9: 1}) وأيضاً يمكنك استخدام التابع count_nonzero : a = np.arange(10) a=np.array([[8, 9],[8, 8]]) np.count_nonzero(a == 8) # 8 a = np.zeros((3,2,2)) np.count_nonzero(a == 0) # 12 أو من خلال np.sum : a = np.array([3,4,5,5,6]) np.sum(a == 5) # 2 أو من خلال التابع unique ثم zip: a = np.array([3,4,5,5,6]) unique, counts = np.unique(a, return_counts=True) dict(zip(unique, counts)) # {3: 1, 4: 1, 5: 2, 6: 1} مايلي هو مقارنة في السرعة بين التحقيقات السابقة: choices = np.random.randint(0, 100, 10000) %timeit [ np.sum(choices == k) for k in range(min(choices), max(choices)+1) ] %timeit np.unique(choices, return_counts=True) %timeit np.bincount(choices, minlength=np.size(choices)) # الأفضل %timeit [ np.count_nonzero(choices == k) for k in range(min(choices), max(choices)+1) ] %timeit [ list((choices.reshape(-1))).count(k) for k in range(min(choices), max(choices)+1) ] %timeit Counter(((choices.reshape(-1)))) """ 8.04 ms ± 801 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 596 µs ± 88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) 44.5 µs ± 5.52 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) 5.02 ms ± 429 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) 390 ms ± 21.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each) 2.66 ms ± 166 µs per loop (mean ± std. dev. of 7 runs, 100 loops each) """1 نقطة
-
ترجع الدالة l.index(x) فهرس i بحيث i هو يمثل أول فهرس ظهرت فيه x في القائمة.. وبالتالي يمكننا أن نفترض وبشكل آمان أن دالة index () في Python يتم تنفيذها بحيث تتوقف بعد العثور على المطابقة الأولى، وهذا يؤدي إلى تحسين الأداء (تحسين زمن التنفيذ، حيث أنها تتوقف بعد عثورها على العنصر مباشرة بدل أن تكمل بدون فائدة).للعثور على عنصر يتوقف بعد التطابق الأول في مصفوفة NumPy ، استخدم المكرر ndenumerate: a = np.arange(10) a # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) next((idx for idx, val in np.ndenumerate(a) if val==3)) # 3 هناك وظائف أخرى في NumPy (argmax و where و nonzero) يمكن استخدامها للعثور على عنصر في مصفوفة، لكن جميعها لها عيب في المرور عبر المصفوفة بأكملها بحثاً عن جميع حالات التطابق، ولم يتم تحسينها للعثور على العنصر الأول فقط أي أول تطابق. لاحظ أيضاً أن where و nonzero يرجعان المصفوفات ، لذلك تحتاج إلى تحديد العنصر الأول للحصول على الفهرس. لاحظ المثال التالي: a = np.arange(10) a=np.array([0, 11, 2, 3, 4, 5, 6, 7, 8, 9]) np.argmax(a==11) # 1 np.where(a==11) # (array([1], dtype=int64),) np.nonzero(a==11) # (array([1], dtype=int64),) # وبالتالي يجب أن نكتب np.nonzero(a == 11)[0][0] # 1 np.where(a==11) [0][0]# 1 لذا فهذه الطريقة تعتبر أسرع خصوصاً عندما يكون العنصر الذي تبحث عنه موجوداً في بداية المصفوفة.1 نقطة
-
مرحبا, اتسائل اذا كان الموقع سريع جدا على السيرفر المحلي و بطيئ جدا عند رفعه في الاستضافة, هل هنا سبب بطئ الموقع فقط من الاستضافة ام ايضا من برمجة الموقع؟1 نقطة
-
مادام الموقع سريع في الإستضافى المحلية فالسبب رقم #1 لموقعك البطيء هو استضافة المواقع البطيئة قد يكون لديك موقع بطيء لأنك مستضاف على استضافة مجانية. أنت في خدمة استضافة منخفضة الجودة مع دعم ضعيف. أو يحتاج موقعك إلى حساب استضافة ذات مواصفات أعلى مع المزيد من الموارد مثل VPS. أو يمكن أن يكون سبب بطء الموقع الخاص بك مرتبط بقاعدة البيانات ، فكلما زادت المعلومات المحفوظة في قاعدة البيانات الخاصة بك وكلما زاد تعقيد موقعك ، زاد احتمال عدم تشغيل قاعدة البيانات بنفس الفعالية التي كانت عليها عند تشغيل الموقع لأول مرة. يمكن أن يكون امتلاك موقع ويب سرعته ضعيفة بمثابة كابوس إجمالي لأنه يمكن أن يؤثر على نجاحك كمالك أو مدون تجاري ، لذلك يجب أن تهدف إلى التعامل مع كل ما يسبب المشكلة في أسرع وقت ممكن. ولايمكن بأي حال من الأحوال أن تكون البرمجة هي سبب البطء مادام أنه يعمل بكفائة في الإستضافة المحلية.1 نقطة
-
لفرز عناصر مصفوفة هناك عدة طرق للقيام بذلك، أولها استخدام التابع argsort من نمباي، حيث يعيد مؤشرات أو فهارس من المصفوفة، هذه المؤشرات يمكننا استخدامها لترتيب مصفوفتنا، سأعطيك الآن مثال لكيفية الاستفادة من هذا. لتكن لدينا المصفوفة التالية: import numpy as np a = np.random.randint(70, size=(3, 3)) a """ array([[ 0, 33, 32], [53, 44, 4], [36, 34, 0]]) """ سنقوم أولاً باستعداء التابع argsort على العمود الأول من المصفوفة، وبالتالي ستحصل على هذه النتيجة: a[:, 0].argsort() # array([0, 2, 1], dtype=int64) يوضح الخرج أن أصغر قيمة في العمود الأول هي في الموضع 0 (رقم السطر الموجودة فيه). وهذا صحيح ، فأقل قيمة في العمود الأول للمصفوفة هي 0، أما ثاني قيمة من الخرج هي 2 وهذا يعني أن ثاني أصغر قيمة في العمود الأول موجودة في الموضع 2 أي القيمة الثالثة أي 36 وهذا صحيح. أما ثالث قيمة من الخرج فتشير إلى ثالث أصغر قيمة في العمود وهكذا..، لفرز المصفوفة ، نحتاج الآن إلى استخدام المؤشرات التي أعطانا إياها التابع argsort لإعادة ترتيب الصفوف في المصفوفة. ويمكننا القيام بذلك عبر إجراء بسيط يمكن القيام به في سطر واحد من التعليمات البرمجية. إذاً سنستخدم نتيجة argsort على أنها فهارس الصف وسنضع الناتجة في a (مصفوفتنا) ، على النحو التالي: a = a[a[:, 0].argsort()] a """ array([[ 0, 33, 32], [36, 34, 0], [53, 44, 4]]) """ كما ترى، تم ترتيب الصفوف الآن من الأقل إلى الأكبر وفقاً للعمود الأول. وللفرز في عمود مختلف، ما عليك سوى تغيير فهرس العمود. a = a[a[:, 1].argsort()] a """ array([[ 0, 33, 32], [53, 34, 0], [36, 44, 4]]) """ حسناً ماذا إذا أردت الفرز على أساس الأسطر؟! يمكن أيضاً فرز مصفوفة NumPy حسب قيم الصفوف. يتم تحقيق ذلك بنفس طريقة الفرز باستخدام الأعمدة. نحتاج فقط إلى تغيير مواضع الفهرسة. على سبيل المثال ، لنأخذ المصفوفة التالية، ثم نفرز الأعمدة حسب القيم في الصف الأول. للقيام بذلك ، ما عليك سوى تحريك الفهرس (0) إلى موضع الصف ونقل نتيجة الفرز التنظيمي إلى موضع العمود: import numpy as np a = np.random.randint(70, size=(3, 3)) a """ array([[44, 10, 23], [ 9, 32, 58], [67, 31, 39]]) """ a = a[:, a[0, :].argsort()] a """ array([[10, 23, 44], [32, 58, 9], [31, 39, 67]]) """ في بعض الأحيان يكون من الضروري الفرز على أكثر من عمود واحد. أحد الأمثلة على ذلك هو البيانات التي تحتوي على السنة والشهر واليوم والقيمة في أعمدة منفصلة. يمكن أن يتعامل ترتيب Argsort في NumPy مع فرز أعمدة متعددة باستخدام الوسيطة اللطيفة. لنبدأ بإنشاء مصفوفة من 4 أعمدة تمثل السنة والشهر واليوم والقيمة. arr = np.array([[2019, 2, 1, 40], [2021, 4, 1, 80], [2020, 3, 2, 22], [2018, 1, 3, 11], [2021, 3, 9, 79]]) """ array([[2018, 1, 3, 11], [2019, 2, 1, 40], [2020, 3, 2, 22], [2021, 3, 9, 79], [2021, 4, 1, 80]]) """ سنستخدم الآن argsort لفرز الأعمدة ، بدءاً من الأولوية الأقل. هذا يعني أننا إذا أردنا الفرز حسب السنة ، ثم الشهر ، ثم اليوم ، فنحن بحاجة إلى الفرز حسب اليوم أولاً ، ثم الشهر ، ثم العام. بالنسبة للكل ما عدا النوع الأول ، نحتاج إلى تحديد النوع على أنه "ترتيب مدمج" ، والذي سيحافظ على سياق الفرز السابق. وهذا موضح في التعليمات البرمجية التالية: # الفرز حسب اليوم arr = arr[arr[:, 2].argsort()] # حسب الششهر arr = arr[arr[:, 1].argsort(kind='mergesort')] # حسب السنة arr = arr[arr[:, 0].argsort(kind='mergesort')] يمكنك استخدام طرق أخرى أعقد أيضاً مثل استخدام lexsort من نمباي كما في المثال التالي: import numpy as np a = np.random.randint(70, size=(3, 3)) a """ array([[12, 11, 6], [25, 46, 64], [42, 41, 1]]) """ col=0 a[np.lexsort(([1,-1]*a[:,[1,col]]).T)] """ array([[42, 41, 1], [25, 46, 64], [12, 11, 6]]) """ أو يمكنك باستخدام الدالة sorted مع الوسيط لامدا، وتعيد قائمة (لذا قم بإعادة تحويل الخرج إلى نمباي): import numpy as np a = np.random.randint(70, size=(3, 3)) a """ array([[17, 46, 17], [39, 64, 54], [ 6, 19, 68]]) """ col=1 # العمود المراد الترتيب عليه a=sorted(a, key=lambda a_entry: a_entry[col]) np.array(a) """ [[ 6 19 68] [17 46 17] [39 64 54]] """ هذا كان كل ماقد يلزمك.1 نقطة
-
يمكنك استخدام الدالة nonzero كالتالي >>> t = array([1, 1, 1, 2, 2, 3, 8, 3, 8, 8]) >>> nonzero(t == 8) #لاحظ الشرط الموجود هنا (array([6, 8, 9]),)#للرقم 8 indexes ستجد هنا وجود جميع ال >>> nonzero(t == 8)[0][0] #index للوصول لأول 6 كما يمكنك استخدام حل بسيط مثل تحويل المصفوفة ل list ثم التحقق من العنصر l = [1,2,3,4,5] # Python list a = numpy.array(l) # NumPy إنشاء مصفوفة i = a.tolist().index(2) #ثم البحث عن الرقم 2 list تحويل المصفوفة ل print i1 نقطة
-
توجد العديد من الطرق التي يمكنك من خلالها تنفيذ المطلوب مثل الدوال في التعليقات السابقة أو يمكنك من خلال الدالة numpy.unique كالتالي a = numpy.array([0, 3, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 3, 4]) unique, counts = numpy.unique(a, return_counts=True) dict(zip(unique, counts)) #يحتوي على العنصر وعدد مرات التكرار dict لإنشاء # {0: 7, 1: 4, 2: 1, 3: 2, 4: 1} أو يمكنك استخدام الدالة collections.Counter import collections, numpy #collections لا تنسى استدعاء ال a = numpy.array([0, 3, 0, 1, 0, 1, 2, 1, 0, 0, 0, 0, 1, 3, 4]) collections.Counter(a) # Counter({0: 7, 1: 4, 3: 2, 2: 1, 4: 1})1 نقطة
-
يؤدي حساب تكرارات قيمة في مصفوفة NumPy إلى إرجاع تكرار القيمة في المصفوفة. على سبيل المثال ، في [1 ، 2 ، 3 ، 2 ، 1 ، 2] ، فإن 2 تظهر ثلاث مرات. استخدم ()np.count_nonzero لحساب عدد المرات التي تظهر بها قيمة معينة. ويمكن استدعائها كالتالي: np.count_nonzero(array == value) حيث تضع value بالرقم الذي تريد أن تبحث عن عدد مرات تكراره. كمثال يمكن انشاء المصفوفة التالية: arr = numpy.array([0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 1]) ثم نستدعى الدالة كالتالي: occurrences = np.count_nonzero(arr == 1) print(occurrences) يكون الناتج = 4. يمكنك كذلك البحث في مصفوفة من صفوف وأعمدة بأستخدام نفس الدالة كالتالي: np.count_nonzero(array == value, axis=n) حيث أن axis هو اما الصف أو العمود الذي نريد البحث فيه، فمثلا لو n=1 فسيقوم بحساب تكرارات القيمة في كل صف. واذا كانت n=0 فسيقوم بحساب تكرارات القيمة في كل عمود. مثال، دعنا ننشأ المصفوفة التالية: arr = numpy.array( [1, 2, 3, 2, 1, 2]) ثم نكتب الكود التالي: row_occurrences = np.count_nonzero(an_array == 2, axis=1) print(row_occurrences) ويكون الخرج من تشغيله كالتالي: [1 2]1 نقطة
-
لإيجاد الفهرس الخاص بقيمة معينه في numpy: نستطيع استخدام الدلة: numpy.where(boolArr) نستطيع أن نضع boolArr بالشرط الذي نريد تحقيقه، ففي المثال التالي نبحث عن الفهرس الخاص بالقيمة 15، ويقوم بارجاع list فيها كل الفهرس الخاص بكل مرة ظهرت فيها القيمة 15، ولايجاد أول مره كل ما عليك هو أختيار أول عنصر في الlist التي بها الفهرس: import numpy as np # أنشاء list بها عدة ارقام arr = np.array([11, 12, 13, 14, 15, 16, 17, 15, 11, 12, 14, 15, 16, 17]) # نطبع كل الفهرس الخاص بالرقم 15 result = np.where(arr == 15) print('Tuple of arrays returned : ', result) print("Elements with value 15 exists at following indices", result[0], sep='\n') ويكون الخرج كالتالي: Tuple of arrays returned : (array([ 4, 7, 11], dtype=int32),) Elements with value 15 exists at following indices [ 4 7 11] ولاختيار أول مره تظهر ظهر فيها الرقم 15: x_index = result[0]1 نقطة
-
ستحتاج إلى عرض المصفوفة الخاصة بك كمصفوفة بها حقول (مصفوفة منظمة). وتصبح الطريقة "الصحيحة" قبيحة تمامًا إذا لم تحدد في البداية المصفوفة بالحقول كمثال سريع ، لترتيبها وإرجاع نسخة منها: In [1]: import numpy as np In [2]: a = np.array([[1,2,3],[4,5,6],[0,0,1]]) In [3]: np.sort(a.view('i8,i8,i8'), order=['f1'], axis=0).view(np.int) Out[3]: array([[0, 0, 1], [1, 2, 3], [4, 5, 6]]) اما لترتيبها في نفس مكانها: In [6]: a.view('i8,i8,i8').sort(order=['f1'], axis=0) In [7]: a Out[7]: array([[0, 0, 1], [1, 2, 3], [4, 5, 6]]) الميزة الوحيدة لهذه الطريقة هي أن طريقة "الترتيب" هي قائمة بالحقول لترتيب البحث. على سبيل المثال ، يمكنك الفرز حسب العمود الثاني ، ثم العمود الثالث ، ثم العمود الأول من خلال تقديم الترتيب = ['f1' ، 'f2' ، 'f0'].1 نقطة
-
يمكن تطبيق التعليمة التالية للترتيب حسب العمود الثاني حيث تم تمرير الرقم 1 كدليل للعمود (0 دليل أول عمود) a[a[:, 1].argsort()] ويمكن أيضا باستخدام معامل lambda: a = sorted(a, key=lambda a_entry: a_entry[1]) حيث أن a_entry[1] تمثل الععود المراد الترتيب وفقه الدالة argsort تقوم بعمل ترتيب لمصفوفة numpy حسب الدليل الممر لها1 نقطة
-
يمكننا الاعتماد على معاملات المقارنة مع الدالة sum لعد العناصر التي تحقق شرطا معيناً، حيث أن أي شرط يتم تقييمه true سيعطي 1 و أي شرط false يعطي 0.. لكني نقوم بعد العناصر التي تساوي 1 ببساطة نضع الشرط: print(np.sum (arr == 1)) أو حتى بدون sum print(arr == 1) ولكي نعد ال0 بنفس الطريقة. سبب الخطأ أن مصفوفة numpy لا تملك الدالة count1 نقطة
-
أرى أنك نشرت المشكلة للمرة الثانية، ولا يوجد أحد يعلم كيفية تطبيق هذا الأمر.. أفضل طرحك للمشروع على موقع مستقل أو خمسات للبحث عن مبرمج له خبرة فيما تريده بالضبط. يمكنك طرح مشروع ومن ثم توظيف مبرمج بعد التفاوص معه واختياره.1 نقطة
-
يمكنك القيام بذلك من خلال التابع format في المكتبة locale كالتالي: import locale locale.format("%d", 123456789 , grouping=True)# '123,456,789' أو باستخدام التعابير المنطقية من مكتبة regex: import re re.sub("(\d)(?=(\d{3})+(?!\d))", r"\1,", "%d" % 123456789) # '123,456,789' أوكما أشار الأستاذ سمير في إجابته: x=123456789 '{:0,.2f}'.format(x) # '123,456,789.00' يمكنك أيضاً القيام بذلك بشكل يدوي من خلال التابع التالي: def sp(x): l = [] g = '%d' % x while g and g[-1].isdigit(): l.append(g[-3:]) g = g[:-3] return g + ','.join(reversed(l)) sp(123456789) # '123,456,789'1 نقطة
-
الطريقة WaitAll(): هي طريقة ستاتيكية تستدعى لأجل الصف، دخلها مصفوفة عناصر من النمط Task، مهمتها إيقاف الأب، مثلاً لو استدعيناها في ال mian سيتم إيقافه (ينتظر) حتى تنفيذ كل التاسكات الموجودة ضمن هذه المصفوفة فقط . مثال : هنا مثال عن الطريقة فقط ، باعتبار الصف Test صف يحوي طريقتين وهما MethodA تقوم بطباعة A خمسين مرة، والطريقة MethodB تطبع B خمسين مرة: var TaskA = new Task.Factory.StartNew(Test.MethodA); var TaskB = new Task.Factory.StartNew(Test.MethodB); Task [] stopmain = { TaskA , TaskB }; Task.WaitAll(stopmain); هنا سيتوقف ال main حتى يتم تنفيذ جميع ال task في المصفوفة stopmain. For (int i=0 ; i<50;i++){ console.WriteLine("Main");} الخرج : طباعة A و B خمسين مرة بشكل متداخل(ترتيب غير معلوم) ومن ثم طباعة Main خمسين مرة. الطريقة WaitAny() : هي أيضا طريقة ستاتيكية و تقبل مصفوفة تاسكات كسابقتها اذاً هي شبيها بالطريقة السابقة ولكن لو استدعيناها في ال main مثلاً لن تنتظر انتهاء كل التاسكات، بل تنتظر انتهاء أول task وعند اكتمال تنفيذ هذا التاسك يستأنف ال main العمل بالتوازي مع التاسكات الأخرى مع الملاحظة أن هذه الطريقة ترد قيمة وهي index يمثل موقع التاسك الذي انتهى من المصفوفة. مثال : var TaskA = new Task.Factory.StartNew(Test.MethodA); var TaskB = new Task.Factory.StartNew(Test.MethodB); Task [] stopmain = new Task[] { TaskA , TaskB }; Int id = Task.WaitAny(stopmain); هنا سيتوقف ال main حتى يتم تنفيذ إحدى تاسكات المصفوفة لا على التعيين و ترد هذه الطريقة ال index للتاسك الذي اكتمل تنفيذه أولاً إلى المتحول id ، حيث أن المصفوفة هنا تحوي عنصرين فال index إما 0 أو 1. For (int i=0 ; i<50;i++){ console.WriteLine("Main");} الخرج : طباعة A خمسين مرة و طباعة B خمسين مرة بترتيب غير معلوم ولكن طباعة الكلمة main لا تبدأ إلا بعد انتهاء طباعة إحدى العبارات "ِA" أو "B".1 نقطة
-
ببساطة ال destructor عبارة عن تابع لا يرد أية قيمة ولا يحوي على return ولا نمرر له أي وسيط. يتم تعريفه بأن نكتب ( اسم الصف مسبوق بالإشارة ~ ) ثم فتح قوسين فارغين، و من الممكن أن يحوي تعليمات أو أن لا يحوي. مثال : Class A{ Public : // تعريف باني افتراضي A() { cout<<"A"; } // destructor ~ A() { cout<<" Destructor is call " ; } } لكل صف يتم إنشاؤه يكون هناك destructor افتراضي (يتم تعريفه تلقائياً حتى ولو لم تقم بالتصريح عنه واستدعائه ). مثلاً في حال تم انشاء كائن ضمن دالة وتم تنفيذ محتوى هذه الدالة سيتم استدعاء التابع destructor (وببساطة سيتم حذف أي شيء تم تعريفه ضمن الدالة بعد أن تنفذ). يتم الاستفادة من التابع destructor عندما يكون ضمن الصف حقول معطيات ديناميكية مثل (مؤشرات ، مصفوفات ديناميكية ..إلخ) حيث أننا ضمن جسم التابع نقوم بتحرير المواقع المحجوزة من قبل هذه المتحولات الديناميكية عن طريق استخدام التعليمة delete. مثال : ليكن لدينا الصف dynamic يحتوي على المصفوفة الديناميكية A ،من النمط int و باني افتراضي للتهيئة بالصفر وطريقة لإدخال عناصر المصفوفة و هادم ( destructor). عندئذ يجب استخدام التعليمة delete في الهادم لتحرير المواقع المحجوزة من قبل المصفوفة الديناميكية. #include <iostream> using namespace std; class dynamic { private : int *A ; int size ; public : // البان الافتراضي dynamic (){ cout<<" constructor is called " ; size = 0; A=new int [0]; } //طريقة لادخال عناصر المصوفة void input(s){ size = s; A=new int [size]; for (int i=0;i<size;i++){ cin>>A[i]; } //هادم لتحرير الذاكرة ~dnamic() { Cout<< " destructor is called " ; Delete[]A; } }; int main() { dynamic d //غرض من الصف السابق int n; cin>>n ; //ادخال عدد العناصر d.input(n); return 0 ; } //الخرج constructor is called 5 1 2 55 57 69 destructor is called إذاً تم استدعاء التابع Destructor بعد الانتهاء من تنفيذ جميع تعليمات البرنامج الموضوعة ضمن ال main، ليقوم بتحرير المواقع المحجوزة.1 نقطة
-
الصف object هو جذر كل الصفوف في بايثون أو الأب لكل الصفوف base-class. في بايثون 3 لافرق في كتابة: class hi: pass hi.__bases__ #(<type 'object'>,) أو: class hi(object): pass hi.__bases__ # الخرج #(<type 'object'>,) فكلاهما يؤدي إلى إنشاء صف جديد مع تحديد الصف object كأب له كما تلاحظ من الخرج. أما في بايثون 2 (تحديداً من بعد 2.2) فإن تعريف الكلاس بالشكل: class hi(object): pass يؤدي إلى إنشاء صف جديد مع تحديد الصف object كأب له، ويسمى التعريف بهذا الشكل "new style class"، أي كما في بايثون 3. أما تعريفه بهذا الشكل: class hi: pass # انظر hi.__bases__ # الخرج () فهنا لايكون لدينا object كصف رئيسي. وتسمى بالطريقة الكلاسيكية."old style class". وطبعاً أنت ستهتم بالطريقة الجديدة فكلنا نتبع الطرق الأحدث. طبعاً في كل كم النمط القديم والحديث فإن ال staticmethod و classmethod تعملان بشكل طبيعي، property تعمل مع القراءة في النمط القديم لكنها تفشل مع ال intercept writes وأما __slots__ فتم تحسينها من حيث سرعة الوصول إلى ال attribute وأيضاً توفيرها للذاكرة.1 نقطة
-
إضافة للإجابات في الأعلى. سأتحدث عن مكتبة psutil كونها تعمل على مختلف أنظمة التشغيل، حيث توفر واجهة لاسترداد المعلومات حول العمليات الجارية واستخدام النظام (وحدة المعالجة المركزية والذاكرة). import psutil # استخدام المعالج print(psutil.cpu_percent()) # 15.3 # عرض نسبة استخدام الذاكرة print(psutil.virtual_memory().percent) # 71.1 # حساب المساحة المتوفرة من الذاكرة psutil.virtual_memory().available * 100 / psutil.virtual_memory().total # 28.76908537555775 # يمكنك عرض معلومات كاملة psutil.virtual_memory() # svmem(total=4169424896, available=1228451840, percent=70.5, used=2940973056, free=1228451840) ولمستخدمي لينوكس يمكنهم أيضاً استخدام مكتبة os: import os # استخدام المعالج cpu=str(round(float(os.popen('''grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage }' ''').readline()),2)) #print results print("usage :" + cpu) # استخدام الذاكرة # os.popen() # الحصول على كل معلومات الذاكرة total_memory, used_memory, free_memory = map( int, os.popen('free -t -m').readlines()[-1].split()[1:]) # استخدام الذاكرة print("RAM memory % used:", round((used_memory/total_memory) * 100, 2)) ويمكنك الحصول على معلومات مفصلة للتحليل ولعرض استخدام الذاكرة لكل سطر باستخدام وحدتي profile line_profiler وmemory_profiler بالطريقة التالية: اكتب برنامج python المراد اختباره ، والوظيفة المراد اختبارها وأضف أعلاها @ profile ، ثم احفظها كملف py. ثم ضع في سطر الأوامر commandline أو في محرر الأكواد: kernprof -l -v *.py ستتم طباعة تحليل الأداء وطباعة نتائج البرنامج. مثال، سنكتب تابع صغير ثم سنحفظه باسم ali.py @profile def com(): for i in range(10): print(i**4) if __name__=='__main__': com() ثم ضع في سطر الأوامر Command Line أو في محرر الأكواد. kernprof -l -v ali.py ''' Wrote profile results to test.py.lprof Timer unit: 1e-06 s Total time: 0.012405 s File: test.py Function: compute at line 1 Line # Hits Time Per Hit % Time Line Contents ============================================================== 1 @profile 2 def compute(): 3 101 74.0 0.7 0.6 for i in range(10): 4 100 12331.0 123.3 99.4 print(i**4) ''' Timer unit : وحدة الموقت ، ميكروثانية Total time :إجمالي وقت تشغيل الكود Time : زمن تشغيل السطر Hits: Number of runs % Time: النسبة المئوية لزمن تشغيل السطر ويمكنك استخدام بنفس الطريقة لكن نضع: python -m memory_profiler ali.py ''' Line # Mem usage Increment Line Contents ================================================ 2 39.08 MiB 39.08 MiB @profile(precision=2) 3 def compute(): 4 39.08 MiB 0.00 MiB for i in range(100): 5 39.08 MiB 0.00 MiB print(i**3) ''' Increment: زيادة الذاكرة أو نقصانها بعد تشغيل كل سطر من التعليمات البرمجية Mem usage: استخدام الذاكؤة لكل سطر يمكنك تثبيت المكتبات كالتالي: pip install line_profiler pip install memory_profiler1 نقطة
-
هناك عدة طرق من بينها الطرق التي ذكرها الزملاء في الأعلى، لكن إذا أردت إيجادها باستخدام نمباي يمكنك القيام بذلك كالتالي: import numpy as np np.r_[True, arr[1:] < arr[:-1]] & numpy.r_[arr[:-1] < arr[1:], True] لكن يجب أن تقوم بعملية smooth على مصفوفتك قبل ذلك باستخدام التابع convolve. مثال عن هذا التابع: np.convolve([1, 2, 3], [0, 1, 0.5]) #array([0. , 1. , 2.5, 4. , 1.5])1 نقطة
-
لتشكيل مصفوفة جديدة بطريقة تسمح لك بتحديد الخطوة وال shape، تمنحك Numpy طريقتين رئيسيتين لبناء منظار جديد "new view" لمخزن الذاكرة المؤقت "memory buffer" ، وذلك عن طريق تحديد سمات المصفوفة الأساسية مثل الخطوات "strides" بشكل مباشرة، هاتين الطريقتين هما: as_strided و ndarray. بشكل عام كلاهما يعتبران طرق خطيرة للاستخدام داخل الكود لأنه قد تنتج (((الكثير))) من الأخطاء أثناء استخدامه حتى ولو كنت مبرمجاً محترفاً، لذا لاينصح أبداً بهما إلا للضرورة القصوى. مثلاً في بعض المسائل الصعبة التي قد يسهل حلها عند التلاعب بشكل المصفوفة بهذه الطرق. قبل البدء ماهي ال strides؟ هو مقدار الخطوة، أو هو عدد البايتات اللازمة للانتقال إلى العنصر الثاني من المصفوفة.(ويشار له أيضاً بال axis) طبعاً في حالة المصوفوفة الثنائية نحدد الخطوة الأفقية والخطوة العمودية فمثلاً(16,4) تعني: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) # جهازي بخزن كل قيمة ب4 بايت هذا يعني أنه للانتقال من العنصر 1 إلى 2 نحتاج إلى 4 بايت وللانتقال من بداية البعد الأول [ 0, 1, 2, 3] في المصفوفة إلى البعد الثاني [ 4, 5, 6, 7] نحتاج إلى خطوة مقدارها 16 أي 4*4 أي عدد الأعمدة بحجم كل خطوة as_strided : في اللمثال التالي نقوم بإنشاء view باستخدام هذه الطريقة بشكل مكافئ تماماً ل reshape، ثم سأقوم بإنشاء مايكافئ x.reshape # أنشأنا عرضًا جديدًا لمخزن الذاكرة #x.reshape(3, 4) مايلي يكافئ import numpy as np from numpy.lib.stride_tricks import as_strided x = np.arange(12) #array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) print(x.strides) # أي نحتاج 8 بايتات للانتقال في الذاكرة من العنصر1 إلى 2 as_strided(x, shape=(3, 4), strides=(16, 4))# 16=x.strides*4 '''array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])''' #x.reshape(3, 4) مايلي يكافئ as_strided(x, shape=(3, 4), strides=(4, 16)) # لاحظ كيف أنه من خلال التلاعب بالخطوات يمكنني الحصول على ما أريد القدرات والفائدة الأساسية من as_strided تتجاوز ذلك، فالاستخدام الشائع منها هي ال “sliding window” وهو ما أشرت إليه بسؤالك "إنشاء مصفوفة من x بأبعاد (5,3)" إذاً ماهو ال strides المناسب للقيام بذلك؟ أولاً بالنسبة للأسطر، فالانتقال من عنصر لعنصر يتطلب x.strides أي 4 بايت على جهازي. ثانياً القفز على الأعمدة ( أي للنزول ) كم نحتاج؟ لو ان القيم في الأعمدة متتالية لكنا نحتاج فقط 4 بايت، مثلاً: array([[0, 1, 2, 3, 4], [1, 2, 3, 4, 5], [2, 3, 4, 5, 6]]) # ولو كان بالشكل التالي سنحتاج 4*2 array([[0, 1, 2, 3, 4], [2, 3, 4, 5, 6], [4, 5, 6, 7, 8]]) ولو كان بالشكل التالي لحتجنا 4*3 array([[ 0, 1, 2, 3, 4], [ 3, 4, 5, 6, 7], [ 6, 7, 8, 9, 10]]) #لمعرفتها x.strides حجم الخطوة يختلف من جهاز لآخر اسخدم التعليمة x = np.arange(1,12) as_strided(x, shape=(3, 5), strides=(x.strides*3, x.strides)) """ array([[ 1, 2, 3, 4, 5], [ 4, 5, 6, 7, 8], [ 7, 8, 9, 10, 11]]) """ إن الشيء الرائع فيها هو إنه يمكنك تشكيل مصفوفة أكبر حجماً من المصفوفة x ذاتها بدوم أن يتم استهلاك ذاكرة إضافية، أي أننا هنا احتجنا لتمثيل x في الذاكرة 11*4 =44 bytes ثم شكلنا مصفوفة جديدة منها بأبعاد 4,3 أي قد تظن أن الحجم التخزيني سيكون 4*3*4 لكن أنت مخطئ، سيكون 44 بايت أيضاً!! وذلك لأنها تتشارك البيانات. الآن يمكنك تشكيل تابع يعطيك الخرج بالحالة العامة، حيث نمرر له المصفوفة والطول والعرض: def strided_app(a, L, S ): nrows = ((a.size-L)//S)+1 n = a.strides[0] x=np.lib.stride_tricks.as_strided(a, shape=(nrows,L), strides=(S*n,n)) return x strided_app(x,5,3) """ array([[ 0, 1, 2, 3, 4], [ 3, 4, 5, 6, 7], [ 6, 7, 8, 9, 10]]) """ ndarray: يمكنك استخدامها بطريقة مشابهة كالتالي: np.ndarray(buffer=x.data, shape=(3, 5), strides=(12,4), dtype=int) كما يمكنك استخدام طرق عادية لتشكيل المطلوب باستخدام مفهوم ال broadcasting: def broadcasting_app(a, L, S ): nrows = ((a.size-L)//S)+1 x=a[S*np.arange(nrows)[:,None] + np.arange(L)] return x1 نقطة
-
1 نقطة
-
لاتوجد فروقات مهمة ، لكن هناك فرق في طريقة الاستخدام ، انظر للمثال : #include<bits/stdc++.h> using namespace std; int main() { int x=1; cout<<"The x value is:"<<" "<<x<<endl; printf("The x value is: %d",x); return 0; } // الخرج سوف يكون The x value is: 1 The x value is: 1 نلاحظ لا يوجد أي فرق بين الطريقتين من حيث قيمة الخرج,لكن الفرق هو بطريقة طباعة كل من cout و printf لكن ماذا تعني %d في printf؟ يجيب ان تخبر ال printf بنمط المتحول الذي بداخله وهذه الرموز تعبر عن نمط المتحولات %d=int %c=char %s=string %f=float ومن الضروري وضعه، بدونه لن يطبع قيمة المتحول. مثلا اذا كان الكود كالتالي: #include<bits/stdc++.h> using namespace std; int main() { float x=1.1; printf("The x value is:",x); return 0; } سيكون الخرج The x value is نلاحظ عدم طباعة اي قيمة والتصحيح هو: #include<bits/stdc++.h> using namespace std; int main() { float x=1.1; printf("The x value is: %f",x); return 0; }1 نقطة
-
لانجيب عن الأسئلة الامتحانية، إذا كان لديك أي سؤال برمجي أو مشكلة نحن جاهزون دوماً1 نقطة
-
عند إطلاقك لمنتج جديد، فإنّك تكرّس الكثير من الوقت والموارد لكسب المستخدمين، وذلك يشمل الإعلانات بأنواعها وتسويق المحتوى وترويجه عبر وسائل التواصل الاجتماعي وما إلى ذلك. ورغم كل هذا الجهد قد يكون معدل الاحتفاظ بالمستخدمين منخفضًا جدًا. وعندما يتعلّق الأمر بمنتج برمجي، تعتمد فرصتك الوحيدة لترك انطباع أوّل جيّد على عملية تهيئة فعّالة، حيث تساعد عملية التهيئة الجيّدة المستخدمين ليألفوا المنتج بسهولة. لنكتشف معًا عملية التهيئة من عناصرها إلى أهمّيتها وآليتها، ونناقش بعض أخطاء تهيئة تجربة المستخدم الشائعة التي تسبب خسارةً بأعداد المستخدمين وطرقًا لتجنبها، ثمً نتعمق في أساليب بحث الانغماس وبعض الممارسات لتطبيقها في عملية التهيئة. ماذا نقصد بتهيئة المستخدم؟ تهيئة المستخدم User Onboarding مصطلح شائع في العالم البرمجي، إلّا أنّ فهمه يختلف من شخص لآخر. حيث يجد البعض أنه يُعنى بتوجيه المستخدمين الجدد، ويرى البعض الآخر أنّه مجرد واجهات مستخدم تقدّم جولة سريعة، ويتذكر آخرون الواجهات القابلة للسحب التي تظهر عند تسجيل الدخول للمرة الأولى. تُعَد تهيئة المستخدِم عمليةً لتوجيه وبناء ألفة المستخدِمين الجدد بمنتج (كموقع أو تطبيق)، وتزويد المستخدِم بالإرشادات والمعلومات اللازمة للبدء، أي أنها عملية تحويل المستخدمين الجدد لمنتج إلى عملاء مخلصين. واجهة تهيئة مستخدم لتطبيق Slack أهمية تجربة التهيئة الفعالة User Onboarding Experience وفقًا لدراسة أجرتها Business Insider، يحتاج الشخص ثلاث ثوانٍ ليحدد إن كنت تعجبه أم لا، وخلال هذه المدة القصيرة يكوّن رأيه عنك بكلّ شيء تقريبًا بما في ذلك الذكاء والجدارة بالثقة. في العالم البرمجي يتّخذ المستخدِم قراره بطريقة مشابهة وذلك خلال عملية التهيئة، حيث تظهر عملية التهيئة عادة مرّة واحدة للمستخدم الجديد، وهي فرصتك الوحيدة لتظهر له ميزات منتجك الفريدة وتكسب ثقته. عندما يحمِّل المستخدمون تطبيقًا أو تسجيلًا للدخول إليه، فهم يأملون في أن المنتج سيجعل حياتهم أسهل بطريقة ما. لذا عليك جعلهم يشعرون بذلك عند استخدامهم له للمرة الأولى، وإلّا فإنهم يتخلّون عن المنتج وينسون وجوده. لعملية التهيئة تأثير مباشر على معدّل الاحتفاظ بالمستخدمين. حيث خفّض تطبيق Twine معدّل انسحاب المستخدمين من 65% إلى 30% عن طريق تجديد تجربة التهيئة. من الجيّد إضافة ميزات جديدة إلى منتجك، إلّا أنها تصبح عديمة الأهمية إن لم تُطلع المستخدمين عليها أو على طريقة استخدامها، وهذا نوع آخر من التهيئة يدعى التهيئة لميّزة Feature Onboarding. تعرض أداة ClickUp للشراكات وإدارة المشاريع فيديوهات تعليم مشوقة بعد تسجيل الدخول، وهي طريقة ممتعة لإطلاع المستخدم على ما يمكن أن يقدّم المنتج له دون عناء. عملية التهيئة يكمن الجزء المميز من تصميم تجربة تهيئة فعّالة في مصادفتها للمستخدم مرةً واحدةً فقط، وذلك بعد اتّخاذه قرارًا بتجربة المنتج، ولا فرصة ثانية؛ لذا يجب إظهار ميزات المنتج وإشراك المستخدِمين قبل شعورهم بالملل بسبب تعقيده. هناك بعض الأمور لأخذها بالحسبان أثناء تصميم تجربة تهيئة ناجحة. التعامل مع خطوة واحدة يجب أن تهتم عملية الإعداد بخطوة واحدة، مثل: اختيار اسم المستخدم، أو إدراج صورة شخصية، وما إلى ذلك. ومن الأمثلة الجيدة على ذلك، عملية التهيئة لـ Twitter، حيث تتناول اختيار الاهتمامات واقتراح بعض الحسابات للاطلاع على تغريدات مختلف الأشخاص في لمح البصر. الحفاظ على تفاعل المستخدمين من المهم الحفاظ على رغبة المستخدم بالعودة إلى المنتج بعد التنصيب الأوّلي له، وهذه إحدى ميّزات تطبيق SoundCloud حيث يَعرِض مباشرةً أفضل القوائم Top Charts، وموسيقى مميزة Featured music تحافظ على التفاعل مع المستخدمين وتدعوهم لاكتشاف المزيد. تعليم المستخدم بطريقة تفاعلية لا تكتفِ باستخدام الكلمات؛ بل دع المستخدِم يتفاعل مع المنتج، ويوظّف برنامج ماسح الصور PHotoScan لـ Google Photos ذلك، فهو مزوّد بعملية إرشادية لمسح الصورة الأولى وتحويلها إلى صيغة رقمية. ساعدهم بالوصول للحظة استنتاج لحظة الاستنتاج هي اللحظة التي يُدرك فيها المستخدِم قيمة منتجك، وتكمن أهميّتها ضمن عملية التهيئة خاصة في أنّه كلّما اختبر المستخدمون قيمة المنتج أسرع، زاد تنشيطهم سرعة وأُشرِكوا بشكل أفضل. عناصر A الثلاثة لعملية تهيئة ناجحة هناك ثلاثة عناصر مطلوبة لجعل عملية التهيئة ناجحة وفعالة (وجميعها تبدأ بحرف الألف أو A): إعداد Accommodating وتعني تزويد المستخدم بالأدوات التي يحتاجها لاستخدام منتجك. إطلاع Assimilating وتعني مساعدة المستخدمين ليفهموا الآلية التي يجب أن يعمل المنتج بها. إسراع Accelerating وتعني إظهار قيمة منتجك بطريقة أفضل وأسرع. عناصر التهيئة هناك ثلاثة عناصر أساسية لعملية تهيئة فعّالة: 1. إظهار ميزة أظهر تفرد منتجك هنا، سلّط الضوء على الميزات التنافسية واشرح حاجة المستخدمين لتطبيقك بوضوح وإيجاز. 2. التخصيص وهو مسؤول عن تخصيص منتجك تبعًا لاحتياجات المستخدِمين، مثل: اختيار التصنيفات، ومصادر الأخبار في تطبيق يعرض الأخبار. 3. التعليمات وهي مسؤولة عن تزويد المستخدمين بإرشادات لاستخدام إضافي للمنتج، مثل شرح كيفية تغيير الصورة الشخصية أو تعديل الاهتمامات لاحقًا. أخطاء شائعة في تجربة تهيئة المستخدم قد تسبب خسارة المستخدمين تؤثّر تجربة المستخدم مباشرةً على معدل خسارة المستخدمين، وهو المسؤول عن النجاح النهائي لمنتجك. فمعدل خسارة المستخدمين هو النسبة المئوية للمستخدمين الذين توقفوا عن استخدام منتجك خلال فترة زمنية محددة. بإمكانك حساب معدّل خسارة المستخدمين بقسمة عدد المستخدمين الذين خسرتهم خلال هذه الفترة على العدد الكلي. فعلى سبيل المثال، إذا بدأت ربع السنة بـ 500 مستخدم نشط وأنهيته بـ 250، فإن معدل خسارة المستخدمين هو 50% لأنك خسرت 50% من المستخدمين النشطين. لنناقش بعض الأخطاء الشائعة في تجربة تهيئة المستخدم التي قد تسبب خسارة في عدد المستخدمين. افتراض أنك تحتاج معرفة بالبرمجة لإنشاء عملية تهيئة يتجنّب العديد من مصممي تجربة المستخدم ومديري المشاريع إنشاء نوافذ تهيئة المستخدم بأنفسهم، وذلك فقط لافتراضهم بأن إنشاء مادة تفاعلية يحتاج معرفة برمجية كالترميز coding. إلّا أنّ نهج عدم الترميز no-code approach يساعد المستخدمين غير التقنيين على إنجاز مهام قد تتطلب ترميزًا عادة بدون الحاجة لذلك. تساعد أدوات تهيئة المستخدم الخارجية في إنشاء جولات إرشادية تفاعلية، ورسائل ضمن التطبيق، وقوائم المراجعة، وصفحات مساعدة ذاتية وأكثر من ذلك، كما تمكنّك من تحليل مخرجاتك وتقسيم المستخدمين إلى مجموعات وكل ذلك دون ترميز. الاعتقاد بأن التهيئة هي آخر ما يجب تصميمه غالبًا تكون التهيئة آخر ما يُضاف إلى المنتج قبل إطلاقه، وهي الانطباع الأول الذي يأخذه المستخدم لذا لا يجب أن نخطط له في اللحظات الأخيرة فقط. فكّر بعملية تهيئة المستخدمين لكل ميزة بمفردها أثناء تصميمها أو تطويرها، واكتب نسخة لواجهة المستخدم وأدوات التهيئة أثناء تصميم كل عنصر. استخدام عناصر غير قياسية بعض عناصر التصميم قياسية لكل الواجهات البرمجية، مثل الأزرار الخضراء لتفاعل إيجابي، والأسهم لليمين، واليسار للتقدّم والتراجع. قد يربك استخدام عناصر غير قياسية المستخدم ويقلل من تفاعله. التركيز على الميزات عوضا عن القيمة لا يفيد إظهار كل الميزات للمستخدمين بأي شكل، بل يجب أن تركّز التهيئة على مساعدة المستخدمين على إتمام الخطوات الصغيرة المهمّة التي تساعدهم على التقدّم. يقدّر المستخدمون قيمة تطبيقك عندما يمكنهم الوصول لأهدافهم بسرعة. عدم تقديم التوجيه مهما كانت واجهتك سهلة، فإن المستخدمين يحتاجون إرشادات في المرة الأولى. استخدم توجيهات صغيرة للترحيب بالمستخدمين أو بعض الأدوات لتقديم تلميحات، تسرّع هذه الطريقة عملية التعلّم للمستخدم، ولا تنسى أنّ عملية التهيئة تحدث داخل منصّتك وخارجها، لذا عليك التخطيط بنفس القدر عند تصميم مسار بريدك الإلكتروني. عدم الثناء على نجاح المستخدم يجب أن تثني على المستخدم عندما يُتم خطوة ذات معنى ضمن منتجك. استخدم رسالة نجاح مقنعةً أو مسليّة لبناء علاقة إيجابية مع المنتج. رسالة نجاح من موقع Mailchimp يُعَدّ تجنّب تلك الأخطاء أساسيًا لإنشاء تجربة تهيئة فعالة، حيث تساعد بعض الطرق على كشف وإصلاح هذه الأخطاء أثناء تطوير وتجربة المنتج، ومنها طريقة بحث الانغماس Immersion Research. تطبيق طريقة الانغماس Immersion Method في تهيئة تجربة المستخدم تتصرف في بحث الانغماس مثل مستخدم، وتنغمس في تجربة المنتج الذي تُنشئه بدل تعيين مستخدمين لذلك. بما أنّك لست ممثلًا لكل شريحة المستخدمين فإن بحث الانغماس ليس حلًّا سحريًّا ولا يمكنه أن يحل مكان اختبار الاستخدام التقليدي، لكنّه يبقى تقنيةً مفيدةً لزيادة تفهمك للمستخدِمين وتحديد المشاكل الحالية غير المعروفة. معرفتك بالمنتج أكثر من المستخدم بكثير، لكنك أيضًا تعرف الكثير عن سلوك المستخدم لكونك محترف بتجربة المستخدم، لذلك بإمكانك تصوّر الانطباعات الأولى عن منتجك من كلا المنظورين، ولديك فرصة فريدة لتحديد المشاكل التي قد تواجه المستخدمين الحقيقيين وإصلاحها. هذه طريقة سريعة للحصول على فهم أفضل لمستخدمي منتجك أو خدمتك وتجاربهم بالتهيئة. حيث يمكّنك بحث الانغماس من الإجابة بسرعة عن الأسئلة الآتية لتقييم كفاءة تهيئة تجربة المستخدم: كم يستغرق المستخدم لاتخاذ التفاعل الأول مع منتجك؟ ما الذي يستهلك المزيد من الوقت لإتمام خطوة محددة من التهيئة؟ ما الوقت الذي تحتاجه كل خطوة مفردة من التهيئة لإتمامها؟ ما الوقت الإجمالي المستهلك لإتمام التهيئة والبدء باستخدام المنتج؟ تجربة مستخدم من موقع Autopilot كيفية تطبيق تدريبات الانغماس Immersion Practices في عملية التهيئة تفيد هذه التقنية في الكشف المبكّر عن المشكلات المحتملة أثناء سير العمل، فيما يلي بعض الأساليب لتطبيق الانغماس في عملية التهيئة. جهّز قائمة أهداف: أنشئ قائمة بالأهداف التي ترغب بإنجازها مثل مستخدم يجرّب المنتج للمرة الأولى، ثمّ اعمل وفقًا لهذه القائمة في بيئة حقيقية، وحاول إتمامها في ظروف متعددة. دوّن الملاحظات: دوّن ملاحظات عن استخدامك للمنتج وانطباعك الأوّل عن الترحيب، وكل خطواتك لإتمام التهيئة، وانتبه للوقت المطلوب لإنهاء كل خطوة بظرف مختلف. استخدم المنتج ببساطة: لا يملك المستخدم فكرةً كافيةً عن ميزات منتجك أول مرة، لذا كن طبيعيًّا، استخدم المنتج كما تستخدم أي منتج آخر واكتشف إن كانت تهيئة تجربة المستخدم توضح ميزات المنتج وقيمته. ترجمة وبتصرّف للمقال Designing the User Onboarding Experience لصاحبه John Ozuysal.1 نقطة
-
مفاهيم البرمجة المشتركة في أغلب اللغات : الثوابت: هي عبارة عن متغيرات لكنها لا تتغير طيلة تنفيذ البرنامج و بمجرد وضع قيمة لا يمكنك تغييرها عكس المتغيرات التي تأخذ في كل وقت قيمة . المتغيرات: قيمة أو حجز قيمة في ذاكرة المعالج حتى يصبح من السهل تغيير هذا الجزء المحجوز في الذاكرة ، ويتم تخزين البيانات على هيئة بايت او مقدار مكون من ١٦ أو ٣٢ من قيم البايت والتي تحول من عدد ثنائي لما يقابلها من اعداد عشرية أو نصوص أو غير ذلك في مرحلة التحويل والتخزين المؤقت.حيث للمتغير نوع يختلف طريقة التعبير عنه بإختلاف اللغة مثلا في الجافا يتم تحديد النوع لرقم الصحيح ب int و الجافا سكربت ب var وتستخدم var مع جميع أنواع البيانات int x=1; //java var x=1 ;//java script الجمل الشرطية: الجمل الشرطية هي الطريقة التي تُمكّن الحاسوب من اتخاذ القرارات. الجمل الشرطية دائما تحتوي على الجزء if، الجزء الذي يُخبر التطبيق ماذا يفعل إذا كان الشرط صحيحاً. الجمل الشرطية أيضا تحتوي على جزء else، الذي يُخبر التطبيق ماذا يفعل إذا كان الشرط خاطئ. إذا أهملت الجزء else فإن تطبيقك لن يفعل شيء اذا كان الشرط خاطىء if ( condition ){ }else if ( condition ){ }else{ } الدوال: دالة تعني Function أو Method في اللغة الإنجليزية وهي كود جاهز يتنفذ فقط عندما تقوم بإستدعائه و عندما تكتب إسم الدالة فهذا يعني أنك تطلب من البرنامج تنفيذ هذه الدالة. مثال في لغة الجافا سكربت : حيث أن وظيفة هذه الدالة حساب مربع الرقم function square(number) { return number * number; } الحلقات التكرارية: هي عبارات برمجية تُستخدم من أجل تنفيذ أجزاء محددة من الشفرة البرمجية عدة مرات. فبدلاً من تكرار كتابة الشفرة 1000 مرة مثلاً فستكتبها مرة واحدة و تؤدي لك الحلقات التكرارية بقية المهمة من أجلك بعد أن تُحدد لها بعض المُتغيرات مثل عدد التكرارات أو متى تبدأ و متى تتوقف, ويوجد منها العديد من الأنواع يمكنك البحث عنها والتعرف عليها بشكل أوسع1 نقطة
-
المفاهيم الأساسية في أي لغة برمجة هي: Programming Environment المتغيرات variables الحلقات التكرارية loops الدوال و التوابع functions الجمل الشرطية و Decision Making "اتخاذ القرارت" قواعد اللغة الأساسية basic syntax أنواع البيانات Data types الكلمات المفتاحية Keywords الرموز الرياضية و المنصقية الأساسية مثل + و - و && و غيرها Basic Operators File I/O Numbers , Characters , Arrays, Strings بالإضافة إلى بعض المهارات في حل المشكلات و التفكير المنطقي و الخوارزميات.1 نقطة