1 00:00:00,000 --> 00:00:02,500 [MUSIC PLAYING] 2 00:00:02,500 --> 00:00:49,539 3 00:00:49,539 --> 00:00:52,580 [MUSIC - FERGIE & Q TIP & GOONROCK, "A LITTLE PARTY NEVER KILLED NOBODY"] 4 00:00:52,580 --> 00:00:54,746 FERGIE & Q-TIP & GOONROCK: (SINGING) ليلة واحدة فقط، 5 00:00:54,746 --> 00:00:57,837 هي كل ما لدينا، ليلة واحدة فقط، هي كل كل ما لدينا، ليلة واحدة فقط ، هي كل ما 6 00:00:57,837 --> 00:00:59,538 لدينا، ليلة واحدة فقط، هي كل ما لدينا. 7 00:00:59,538 --> 00:01:03,340 حفلة صغيرة لم تقتل أحدًا. 8 00:01:03,340 --> 00:01:05,972 لذلك سنرقص حتى ننسى، ننسى، ننسى. 9 00:01:05,972 --> 00:01:10,346 امم، حفلة صغيرة لم تقتل أحدًا. 10 00:01:10,346 --> 00:01:13,535 هنا الآن، هنا الآن، هي كل ما لدينا. سكيتن-بود-أوب-بوب. 11 00:01:13,535 --> 00:01:16,020 [MUSIC - FERGIE & Q TIP & 12 00:01:16,020 --> 00:01:28,776 GOONROCK, "A LITTLE PARTY NEVER KILLED NOBODY"] 13 00:01:28,776 --> 00:01:32,145 (SINGING) حفلة صغيرة لم تقتل أحدًا. 14 00:01:32,145 --> 00:01:34,000 لذلك سنرقص حتى ننسى. 15 00:01:34,000 --> 00:01:35,500 هيا بنا. 16 00:01:35,500 --> 00:01:39,680 حفلة صغيرة لم تقتل أحدًا. 17 00:01:39,680 --> 00:01:42,312 هنا الآن، هي كل ما لدينا. 18 00:01:42,312 --> 00:01:46,780 أوه، حفلة صغيرة لم تقتل أحدًا. 19 00:01:46,780 --> 00:01:50,591 لذلك سنرقص حتى ننسى. 20 00:01:50,591 --> 00:01:53,573 حفلة صغيرة لم تقتل أحدًا. 21 00:01:53,573 --> 00:01:57,549 22 00:01:57,549 --> 00:02:00,034 [MUSIC - FERGIE & Q TIP & 23 00:02:00,034 --> 00:02:17,926 GOONROCK, "A LITTLE PARTY NEVER KILLED NOBODY"] 24 00:02:17,926 --> 00:02:20,411 الدمية: [SNORING] 25 00:02:20,411 --> 00:02:23,396 26 00:02:23,396 --> 00:02:24,850 ديفيد ج. مالان: حسنًا. 27 00:02:24,850 --> 00:02:27,940 هذه هي دورة CS50، وهذه هي المحاضرة 8. 28 00:02:27,940 --> 00:02:31,150 وتلك كانت نظرة على ما يُسمى بالهاكاثون الخاص بدورة CS50، هذا التقليد السنوي 29 00:02:31,150 --> 00:02:35,440 الذي ننهي به الفصل الدراسي تقريبًا والذي سيبدأ حوالي الساعة 7:00 مساءً هنا 30 00:02:35,440 --> 00:02:39,820 في كامبريدج، وسينتهي حوالي الساعة 7 صباحًا من اليوم التالي في كامبريدج. 31 00:02:39,820 --> 00:02:42,460 ويتخلل الأمسية قدر لا بأس به من العمل 32 00:02:42,460 --> 00:02:44,680 على المشاريع النهائية، وهو الهدف الأسمى من الأمسية 33 00:02:44,680 --> 00:02:46,510 لمنح الطلاب، بيئة أكاديمية 34 00:02:46,510 --> 00:02:48,730 واجتماعية وتعاونية للغاية حيث يتناولون 35 00:02:48,730 --> 00:02:50,410 إنجازاتهم النهائية في الدورة. 36 00:02:50,410 --> 00:02:53,830 ولكن أيضًا، كما لاحظتم سيكون هناك القليل من اللهو، والطعام 37 00:02:53,830 --> 00:02:58,210 من مطاعم فيليبز، عادةً، حوالي الساعة 9:00 مساءً، وقليلاً من دومينوز بيتزا 38 00:02:58,210 --> 00:02:59,200 حوالي الساعة 1:00 صباحًا. 39 00:02:59,200 --> 00:03:01,910 وبالنسبة لهؤلاء الذين ما زالوا صامدين كالدمية هناك، 40 00:03:01,910 --> 00:03:05,650 سندعوكم إلى وجبة الإفطار في IHOP إذا ما تزال لديكم الطاقة. 41 00:03:05,650 --> 00:03:08,950 بعد ذلك، سنتواجد فيما يُسمى بمعرض CS50، ذروة كل شيء 42 00:03:08,950 --> 00:03:10,000 قمتم به في دورة CS50. 43 00:03:10,000 --> 00:03:11,890 والمزيد حول ذلك في الأسابيع القادمة. 44 00:03:11,890 --> 00:03:15,199 لن أسترسل وأضجركم بكثرة الكلام، ما الذي تحدّثنا عنه في هذه الأسابيع القليلة الماضية؟ 45 00:03:15,199 --> 00:03:17,240 حسنًا، تذكرون أنه، على مدار الأسبوعين الماضيين، 46 00:03:17,240 --> 00:03:19,000 قمنا بتقديم ​​برمجة الويب. 47 00:03:19,000 --> 00:03:22,221 وفي الآونة الأخيرة، حاولنا ربط العديد من الموضوعات معًا 48 00:03:22,221 --> 00:03:23,220 من الأسابيع القليلة الماضية. 49 00:03:23,220 --> 00:03:27,439 HTML وCSS وJavaScript، ومن ثم Python، ثم إطار عمل آخر، 50 00:03:27,439 --> 00:03:29,230 جزء آخر من البرامج يُسمى Flask والذي 51 00:03:29,230 --> 00:03:32,860 جعل إنشاء تطبيقات قائمة على الويب تحديدًا أمرًا سهلاً وممكنًا بشكل أكبر. 52 00:03:32,860 --> 00:03:35,290 والمثال الأبسط لذلك الأسبوع الماضي، تذكرون، 53 00:03:35,290 --> 00:03:36,850 بدا إلى حد ما شيئًا كهذا. 54 00:03:36,850 --> 00:03:40,200 وقمتم في هذا الأسبوع الماضي مع المشاكل في أوجه التشابه والاستقصاء، 55 00:03:40,200 --> 00:03:42,940 ببناء تطبيقاتكم القائمة على الويب. 56 00:03:42,940 --> 00:03:45,100 لكنها لا تحتوي إلى حد ما على جميع الأجزاء 57 00:03:45,100 --> 00:03:47,860 التي قد ترغبون في تجمعيها في تطبيق قائم على الويب. 58 00:03:47,860 --> 00:03:50,061 ولذلك فاليوم، سنملأ تلك الفراغات النهائية. 59 00:03:50,061 --> 00:03:52,810 لكن تذكرون أننا نحاول وضع أُطُر لهذه التطبيقات، ليس 60 00:03:52,810 --> 00:03:55,540 كأشياء منفردة أو فقط أدوات قمتم بإنشائها، ولكن كجزء 61 00:03:55,540 --> 00:03:57,337 من نموذج شائع أو منهجية. 62 00:03:57,337 --> 00:03:59,920 وبالفعل، عندما تتعلمون علوم الكمبيوتر وهندسة 63 00:03:59,920 --> 00:04:03,040 البرمجيات، ستبدؤون ملاحظة الأنماط في البرامج، 64 00:04:03,040 --> 00:04:04,570 في التعليمة البرمجية التي تكتبونها. 65 00:04:04,570 --> 00:04:07,361 ويميل الأشخاص إلى تبنّي هذه الأنماط لأنها توفر لكم الوقت. 66 00:04:07,361 --> 00:04:09,890 ومن ثم يمكن لأي شخص أن يتحدث اللغة نفسها، إذا جاز التعبير. 67 00:04:09,890 --> 00:04:14,305 إذن كان MVC هو الاختصار الذي قدمناه الأسبوع الماضي، النموذج والعرض ووحدة التحكم. 68 00:04:14,305 --> 00:04:16,180 وهذا فقط يتحدث إلى هذا النموذج حيث 69 00:04:16,180 --> 00:04:19,720 قمتم بتنظيم نوع معين من تعليمة برمجية في ملف واحد، وأنواع معينة من تعليمة برمجية أخرى 70 00:04:19,720 --> 00:04:20,600 وملف آخر. 71 00:04:20,600 --> 00:04:22,840 إذن تنتقل تعليمة Python البرمجية الخاصة بكم إلى application.py. 72 00:04:22,840 --> 00:04:27,290 تنتقل HTML إلى ملفات HTML الخاصة بكم، وCSS إلى ملفات CSS الخاصة بكم، وهكذا. 73 00:04:27,290 --> 00:04:30,550 ولكن ما لم يكن لدينا في الأسبوع الماضي هو هذا الشيء هنا، بالفعل. 74 00:04:30,550 --> 00:04:32,860 يشير النموذج إلى بياناتكم بشكل عام. 75 00:04:32,860 --> 00:04:35,650 وبينما كان الاستقصاء، الذي يعدّ هو مشكلتكم الأخيرة، 76 00:04:35,650 --> 00:04:38,800 يحتوي على بيانات، عبارة عن ملف CSV يمكن القول إنه عبارة عن نموذج، 77 00:04:38,800 --> 00:04:40,420 إلا أن CSV ليس معبرًا للغاية. 78 00:04:40,420 --> 00:04:45,321 يمكنكم فقط كتابة الصفوف إلى حد كبير إلى ملف نصي، لا يختلف عن جدول البيانات. 79 00:04:45,321 --> 00:04:46,570 لكن لا يمكنكم حقًا الاستعلام عنها. 80 00:04:46,570 --> 00:04:48,636 لا يمكنكم إدراجها أو حذفها بسهولة. 81 00:04:48,636 --> 00:04:51,010 يجب أن تعيدوا إلى حد كبير بناء الملف بالكامل. 82 00:04:51,010 --> 00:04:53,440 وبالفعل، هذا بالضبط ما فعلته سابقًا. 83 00:04:53,440 --> 00:04:57,700 كان أول تطبيق قائم على الويب كتبتُه في السنة الثانية أو السنة الثالثة 84 00:04:57,700 --> 00:04:59,530 الجامعية هو موقع الويب الداخلي للطلاب الجدد. 85 00:04:59,530 --> 00:05:04,120 وكل ما كان متاحًا لي، من الناحية التقنية والنظرية، 86 00:05:04,120 --> 00:05:05,044 هو ملفات CSV. 87 00:05:05,044 --> 00:05:07,960 لم تكن لديّ أي فكرة عن قواعد البيانات، لم أدرك كيف يمكنها 88 00:05:07,960 --> 00:05:08,920 أن تجعل حياتي أسهل بكثير. 89 00:05:08,920 --> 00:05:12,010 لذلك قمتُ بتخزين جميع البيانات خلف هذه الروابط هنا تحديدًا 90 00:05:12,010 --> 00:05:13,690 في ملفات نصية بسيطة للغاية. 91 00:05:13,690 --> 00:05:16,270 لكن اليوم، سنمنحكم قوة أكبر بكثير. 92 00:05:16,270 --> 00:05:19,060 وبشكل خاص، إذا كنتم قادمين إلى الصف مهتمين بأمر 93 00:05:19,060 --> 00:05:22,810 تطبيق CS في حقول أخرى في الطب أو الفنون 94 00:05:22,810 --> 00:05:25,270 أو أي عالم يوجد به بيانات، بشكل خاص، 95 00:05:25,270 --> 00:05:27,640 في STEM وعلوم البيانات وما شابه ذلك، فأدركوا 96 00:05:27,640 --> 00:05:32,590 أن SQL أصبحت بالفعل تلك اللغة القوية بشكل لا يصدق 97 00:05:32,590 --> 00:05:35,680 التي نحل المشاكل بها في تلك المجالات ومجالات كثيرة جدًا. 98 00:05:35,680 --> 00:05:38,050 وفي النهاية، ستكون البنية الخاصة بكم، في هذا الأسبوع القادم-- 99 00:05:38,050 --> 00:05:41,380 وهي آخر مجموعة مشاكل CS50 لديكم-- 100 00:05:41,380 --> 00:05:44,080 التي وصلتم الآن إلى ذروتها تقريبًا-- هي CD50 101 00:05:44,080 --> 00:05:46,990 Finance، وهو تطبيق قائم على الويب يمكنكم بواسطته شراء الأسهم، 102 00:05:46,990 --> 00:05:49,279 أو "شراء" الأسهم وبيعها. 103 00:05:49,279 --> 00:05:51,820 ولذا ما ستقومون به في الأسبوع القادم هو كتابة تعليمة برمجية 104 00:05:51,820 --> 00:05:54,970 تنفذ تطبيق ويب يشبه هذا حيث 105 00:05:54,970 --> 00:05:58,270 سيكون بمقدوركم أنتم والمستخدمين لديكم التسجيل للحصول على حساب، 106 00:05:58,270 --> 00:05:59,620 وتسجيل الدخول إلى ذلك الحساب. 107 00:05:59,620 --> 00:06:03,370 سيتم منحكم إياه مجانًا، وذلك بفضلنا، 10000 دولار افتراضية. 108 00:06:03,370 --> 00:06:06,790 ومن ثم يمكنكم المضي قدمًا وشراء الأسهم وبيعها عبر الرمز الخاص بها 109 00:06:06,790 --> 00:06:08,030 باستخدام هذا التطبيق. 110 00:06:08,030 --> 00:06:10,620 إذن على سبيل المثال، إذا مضيتُ قدمًا وقمتُ بتسجيل نفسي هنا. 111 00:06:10,620 --> 00:06:14,425 لنقل، اسم المستخدم مالان، كلمة المرور 12345-- 112 00:06:14,425 --> 00:06:15,850 لا يجب أن أقول ذلك. 113 00:06:15,850 --> 00:06:17,530 وأمضي قدمًا وأقوم بالتسجيل هنا. 114 00:06:17,530 --> 00:06:20,805 سترون ذلك، بشكل افتراضي، حصلتُ على 10 آلاف دولار المجانية هذه كنقود افتراضية. 115 00:06:20,805 --> 00:06:22,930 أتعلمون ماذا، سأمضي قدمًا وأشتري بنفسي 116 00:06:22,930 --> 00:06:26,500 سهمًا ربما من Netflix، ورمزها هو NFLX. 117 00:06:26,500 --> 00:06:28,570 سأمضي قدمًا وأحاول شراء سهم واحد. 118 00:06:28,570 --> 00:06:29,230 ها هو ذا. 119 00:06:29,230 --> 00:06:34,240 والآن سترون أنه، فقط ليست لديّ نقود قليلة متبقية، حوالي 9600 دولار أمريكي، 120 00:06:34,240 --> 00:06:35,710 الآن أمتلك سهمًا. 121 00:06:35,710 --> 00:06:38,470 وإذا قمنا بإعادة تحميل ذلك على مدار المحاضرة، بصراحة، 122 00:06:38,470 --> 00:06:40,630 قد يرتفع السعر قليلاً أو ينخفض قليلاً 123 00:06:40,630 --> 00:06:42,740 لأن تطبيق الويب هذا الذي ستقومون بإنشائه 124 00:06:42,740 --> 00:06:46,750 سيتحدّث أيضًا إلى API، وهي واجهة برمجة التطبيقات-- 125 00:06:46,750 --> 00:06:50,020 إذن بعض مواقع ويب الجهة الخارجية التي توفر لكم بيانات الأسهم. 126 00:06:50,020 --> 00:06:52,060 لذلك تطلبون منها السعر الحالي للسهم. 127 00:06:52,060 --> 00:06:54,640 تمنحنكم إجابة بتنسيق JSON، إذا كنتم 128 00:06:54,640 --> 00:06:56,260 تذكرون مناقشتنا القصيرة حول ذلك. 129 00:06:56,260 --> 00:06:58,799 وستقومون بدمجها، في النهاية، في هذه الواجهة. 130 00:06:58,799 --> 00:07:01,090 إذن سيكون ذلك تتويجًا لكثير من الأفكار 131 00:07:01,090 --> 00:07:03,381 والكتل البنائية التي قد قمتم بتجربتها. 132 00:07:03,381 --> 00:07:06,020 لكننا نحتاج إلى بعض الأجزاء النهائية اليوم. 133 00:07:06,020 --> 00:07:10,120 إذن أولاً وقبل كل شيء ، عندما قمتُ بالتسجيل في هذا الموقع، وقمتُ بإنشاء حساب. 134 00:07:10,120 --> 00:07:12,200 وبالفعل، يمكنني المضي قدمًا وتسجيل الخروج الآن. 135 00:07:12,200 --> 00:07:14,320 وإذا مضيتُ قدمًا وقمتُ بتسجيل الدخول مجددًا-- 136 00:07:14,320 --> 00:07:19,870 إذا لم يسرق أحد كلمة المرور الخاصة بي حتى الآن، يمكنني رؤية حسابي وحسابي فقط. 137 00:07:19,870 --> 00:07:22,390 لكننا لم نرَ بعد أي آلية في التعليمة البرمجية 138 00:07:22,390 --> 00:07:25,390 حيث يمكنكم تنفيذ فكرة تسجيل الدخول هذه، أليس كذلك؟ 139 00:07:25,390 --> 00:07:30,370 ما هو المنطق الأساسي الذي يعرف من خلاله موقع ويب أنكم تقومون بتسجيل الدخول 140 00:07:30,370 --> 00:07:32,409 أو أنكم لا تقومون بتسجيل الدخول، أليس كذلك؟ 141 00:07:32,409 --> 00:07:34,700 بوضوح، عندما انتقلتُ إلى هذا الموقع منذ لحظات، 142 00:07:34,700 --> 00:07:38,320 طلب مني تسجيل الدخول لأنني لم أكن لأنني قمتُ بتسجيل الخروج. 143 00:07:38,320 --> 00:07:39,620 لكن كيف عرف ذلك؟ 144 00:07:39,620 --> 00:07:43,750 والآن بعد أن قمتُ بتسجيل الدخول، كيف يعرف أنه يمكنني النقر فوق "علامة اقتباس" 145 00:07:43,750 --> 00:07:47,710 للحصول فقط على علامة اقتباس السهم أو "شراء" فقط لشراء سهم أو "بيعه." 146 00:07:47,710 --> 00:07:51,880 لماذا لا يطلب مني كل مرة أن أنقر فوق رابط تسجيل الدخول مجددًا 147 00:07:51,880 --> 00:07:54,580 باستخدام اسم المستخدم أو كلمة المرور الخاصة بي؟ 148 00:07:54,580 --> 00:07:55,360 ما هو رأيكم؟ 149 00:07:55,360 --> 00:07:57,730 الجمهور: أليست ملفات تعريف الارتباط الصغيرة التي 150 00:07:57,730 --> 00:08:01,570 تحفظ البيانات داخل ذاكرة التخزين المؤقت الخاصة بمتصفحك وتتيح له معرفة ما يحدث. 151 00:08:01,570 --> 00:08:02,110 ديفيد ج. مالان: أجل، ملفات تعريف الارتباط-- 152 00:08:02,110 --> 00:08:04,520 الملفات الصغيرة التي يتم حفظها بواسطة مواقع الويب على جهاز الكمبيوتر الخاص بكم. 153 00:08:04,520 --> 00:08:07,228 الآن احتمالات هي، من المحتمل أن الجميع تقريبًا هنا قد سمعوا بشكل ما، 154 00:08:07,228 --> 00:08:08,680 أن ملفات تعريف الارتباط-- سيئة. 155 00:08:08,680 --> 00:08:11,031 ربما سيئة، تخترق الخصوصية، صحيح؟ 156 00:08:11,031 --> 00:08:11,530 حسنًا. 157 00:08:11,530 --> 00:08:12,940 صحيح جدًا. 158 00:08:12,940 --> 00:08:15,820 ولكن لن يعمل معظم ما على الويب بدونها. 159 00:08:15,820 --> 00:08:20,170 إذن شخص آخر، ما الذي تعرفونه عن ماهية ملف تعريف ارتباط؟ 160 00:08:20,170 --> 00:08:21,040 ما هو ملف تعريف الارتباط؟ 161 00:08:21,040 --> 00:08:22,940 الجمهور: يحفظ معلوماتك بشكل أساسي 162 00:08:22,940 --> 00:08:24,782 وبذلك لا يجب أن تضعها في كل مرة. 163 00:08:24,782 --> 00:08:25,657 ديفيد ج. مالان: أجل. 164 00:08:25,657 --> 00:08:28,550 إنه يحفظ معلوماتكم وبذلك لا يجب أن تضعوها في كل مرة. 165 00:08:28,550 --> 00:08:31,270 إذن في أبسط أشكاله، هو بالضبط مزيج من تلك الإجابات. 166 00:08:31,270 --> 00:08:33,280 حيث عندما أقوم بتسجيل الدخول إلى موقع ويب، يمكنكم 167 00:08:33,280 --> 00:08:37,000 أن تخيلوا أن موقع الويب فقط يتذكر اسم المستخدم وكلمة المرور 168 00:08:37,000 --> 00:08:40,270 فقط عن طريق حفظهم في ملف صغير على جهاز Mac أو جهاز الكمبيوتر الشخصي 169 00:08:40,270 --> 00:08:41,980 بحيث في المرة القادمة التي أزور فيها صفحة ويب، 170 00:08:41,980 --> 00:08:44,974 تقوم فقط بإرسالها تلقائيًا من أجلي، وبذلك لا يجب أن 171 00:08:44,974 --> 00:08:46,390 أكتبها مرارًا وتكرارًا. 172 00:08:46,390 --> 00:08:47,890 الآن دعونا نعثر على خطأ في ذلك. 173 00:08:47,890 --> 00:08:53,967 يبدو أنه سينجح، ولكن ما هو الجانب السلبي من هذا التنفيذ الساذج؟ 174 00:08:53,967 --> 00:08:55,300 ما الذي تعتقدونه بشكل بديهي؟ 175 00:08:55,300 --> 00:08:56,810 الجمهور: البيانات فقط موجودة هناك؟ 176 00:08:56,810 --> 00:08:58,893 ديفيد ج. مالان: البيانات فقط موجودة هناك، أليس كذلك؟ 177 00:08:58,893 --> 00:09:03,542 لديّ أشخاص في المكتب أو في المنزل أو في المكتبة 178 00:09:03,542 --> 00:09:06,250 قد لا أريد فقط أن يتمكنوا من الانتقال إلى جهاز الكمبيوتر ذلك 179 00:09:06,250 --> 00:09:08,937 ورؤية هذا الملف النصي الصغير فقط الموجود على جهاز الكمبيوتر الخاص بي. 180 00:09:08,937 --> 00:09:11,770 لأنه بعد ذلك يمكنهم تسجيل الدخول إلى حسابي عن طريق البحث فقط. 181 00:09:11,770 --> 00:09:13,136 لذلك يبدو الأمر مزعجًا إلى حد ما. 182 00:09:13,136 --> 00:09:15,010 في الواقع، هذا أحد تهديدات ملفات تعريف الارتباط. 183 00:09:15,010 --> 00:09:17,950 إذن يتضح أن ملفات تعريف الارتباط أو مواقع الويب لا تميل إلى القيام بذلك، على الأقل، 184 00:09:17,950 --> 00:09:19,480 إذا تم تنفيذها بشكل جيد. 185 00:09:19,480 --> 00:09:24,070 وبدلاً من ذلك تقوم فقط بوضع رقم عشوائي كبير بالفعل على محرك الأقراص الصلبة 186 00:09:24,070 --> 00:09:26,170 أو في ذاكرة الوصول العشوائي أو ذاكرة الكمبيوتر الخاص بكم. 187 00:09:26,170 --> 00:09:30,100 إذن 1234567-- على سبيل المثال، رقم كبير بالفعل ربما مع حروف وأرقام 188 00:09:30,100 --> 00:09:33,550 ربما بعض علامات الترقيم التي تحدّد هويتي بشكل فريد. 189 00:09:33,550 --> 00:09:37,330 وبعد ذلك، في أي وقت أنقر فوق رابط على موقع الويب هذا نفسه، 190 00:09:37,330 --> 00:09:39,707 بعد تسجيل الدخول، فإن متصفحي، بفضل HTTP-- 191 00:09:39,707 --> 00:09:42,790 اللغة التي تتحدث بها المتصفحات والخوادم التي ناقشناها منذ بضعة 192 00:09:42,790 --> 00:09:43,289 أسابيع-- 193 00:09:43,289 --> 00:09:46,420 فقط يقوم بإرسال ذلك الرقم العشوائي الكبير نفسه بطريقة سحرية 194 00:09:46,420 --> 00:09:48,490 إلى الخادم مرارًا وتكرارًا. 195 00:09:48,490 --> 00:09:52,300 وطالما أن الخادم يتذكر أن هذا الرقم العشوائي الكبير يتوافق 196 00:09:52,300 --> 00:09:56,590 مع اسم المستخدم مالان، فيمكنه معرفة أي حساب ليقوم بعرضه. 197 00:09:56,590 --> 00:09:58,130 ولماذا هو رقم عشوائي كبير؟ 198 00:09:58,130 --> 00:10:03,160 لمَ هو ليس فقط كلمة المرور الخاصة بي أو اسم المستخدم الخاص بي؟ 199 00:10:03,160 --> 00:10:05,440 لماذا أقترح أنه سيكون رقمًا عشوائيًا كبيرًا؟ 200 00:10:05,440 --> 00:10:09,660 الجمهور: في بعض الأحيان يمكن أن يخمنه الأشخاص فقط باستخدام مُنشئ عشوائي. 201 00:10:09,660 --> 00:10:10,660 ديفيد ج. مالان: بالضبط. 202 00:10:10,660 --> 00:10:14,050 في علم الكمبيوتر، العشوائية هي ذلك المكوّن القويّ بشكل لا يصدق. 203 00:10:14,050 --> 00:10:16,780 إذا اخترتم كلمة كبيرة بما فيه الكفاية أو سلسلة كبيرة بما فيه الكفاية 204 00:10:16,780 --> 00:10:20,914 أو جملة، فإن احتمالية أن يتمكّن خصم عشوائي، أو شخص سيئ 205 00:10:20,914 --> 00:10:23,080 على الإنترنت، من تخمين أو يحاول 206 00:10:23,080 --> 00:10:26,944 تخمين أن هذه القيمة منخفضة جدًا فقط، ولن يحدث ذلك في الواقع فقط 207 00:10:26,944 --> 00:10:29,110 في حياتكم من الناحية الإحصائية. 208 00:10:29,110 --> 00:10:31,000 وبذلك تمنحنا هذه العشوائية تلك القدرة. 209 00:10:31,000 --> 00:10:33,310 ولذا يمكنكم التفكير في ذلك بشكل مجازي في العالم الحقيقي 210 00:10:33,310 --> 00:10:34,450 كأنه ختم يدّ. 211 00:10:34,450 --> 00:10:38,020 إذا ذهبتم من قبل إلى منتزه ترفيهي أو حانة 212 00:10:38,020 --> 00:10:40,270 أو نادي حيث يجب أن تظهروا هوياتكم الشخصية أو يجب أن 213 00:10:40,270 --> 00:10:42,820 تدفعوا ثمن التذكرة للدخول، أحيانًا يقومون 214 00:10:42,820 --> 00:10:45,881 بختم أيديكم باستخدام حبر مرئي أو غير مرئي. 215 00:10:45,881 --> 00:10:48,130 وهذا إلى حد كبير لأجل الكفاءة بحيث، بعد ذلك، 216 00:10:48,130 --> 00:10:50,421 عندما تكونون في المنتزه الترفيهي، يمكنكم الخروج والدخول. 217 00:10:50,421 --> 00:10:52,169 ولا يجب أن تعيدوا الدفع أو تعيدوا الختم. 218 00:10:52,169 --> 00:10:55,210 إذا كنتم في الحانة أو النادي، فلا يجب أن تظهروا هوياتكم الشخصية. 219 00:10:55,210 --> 00:10:57,820 يمكنهم التحقق مرة واحدة، ومن ثم بفعالية أكبر يتيحون لكم الدخول والخروج 220 00:10:57,820 --> 00:10:58,480 كما تشاؤون. 221 00:10:58,480 --> 00:11:01,021 لأنكم فقط تظهرون أيديكم أو ختم اليد 222 00:11:01,021 --> 00:11:04,900 الافتراضي هذا للحارس أو حارس البوابة في تلك الأماكن. 223 00:11:04,900 --> 00:11:06,600 إذن تكون ملفات تعريف الارتباط بالضبط هكذا. 224 00:11:06,600 --> 00:11:09,850 بدون علمنا طوال هذا الوقت، في أي وقت تقوم بزيارة موقع ويب قمتَ 225 00:11:09,850 --> 00:11:13,030 بتسجيل الدخول فيه، فإن متصفحك يقوم سرًا ولكن بشكل مفيد 226 00:11:13,030 --> 00:11:17,350 بتقديم ختم اليد إلى ذلك الخادم لتذكيره مَن تكون. 227 00:11:17,350 --> 00:11:21,560 أو بالأحرى، ليس حقًا مَن تكون، ولكن هذا الرقم العشوائي الكبير 228 00:11:21,560 --> 00:11:25,690 بحيث إذا كان الخادم يتذكر إلى مَن ينتمي هذا الرقم، 229 00:11:25,690 --> 00:11:28,750 فيمكنه معرفة صاحب الحساب ليقوم بإظهاره لاحقًا. 230 00:11:28,750 --> 00:11:32,770 لذا لجعل الأمر محدّد أكثر، إذا سحبتُ بالفعل بعض أمثلة HTTP 231 00:11:32,770 --> 00:11:35,390 التي ألقينا نظرة عليها في الماضي، دعونا نفكر في ذلك في السياق. 232 00:11:35,390 --> 00:11:37,973 إذن من المحتمل أن معظمكم هنا قد استخدموا Gmail في مرحلة ما. 233 00:11:37,973 --> 00:11:40,160 وتقومون بتسجيل الدخول بشكل عام عبر صفحة مثل هذه. 234 00:11:40,160 --> 00:11:42,670 لذلك قد يكون حدوث ذلك أمرًا نادرًا لأنه لا يُطلب منكم في 235 00:11:42,670 --> 00:11:46,210 كثير من الأحيان تسجيل الدخول إلى البريد الإلكتروني بسبب-- مفاجأة، مفاجأة-- وجود ملفات تعريف الارتباط 236 00:11:46,210 --> 00:11:47,690 من Google على جهاز الكمبيوتر الخاص بكم. 237 00:11:47,690 --> 00:11:49,190 ولكن دعونا نرى من أين تأتي تلك. 238 00:11:49,190 --> 00:11:54,290 إذن عندما تقومون بطلب Google أو gmail.com، قد ترسلون، في ظرف افتراضي، 239 00:11:54,290 --> 00:11:57,150 إذا جاز التعبير، من جهاز Mac أو الكمبيوتر الشخصي لديكم إلى الخادم، رسالة كهذه. 240 00:11:57,150 --> 00:11:58,900 لمَن لم يرى هذا من قبل، هذا 241 00:11:58,900 --> 00:12:01,900 ما يرسله متصفحك بالفعل إلى الخادم من أجل 242 00:12:01,900 --> 00:12:03,817 طلب صفحة رئيسية من gmail.com. 243 00:12:03,817 --> 00:12:05,650 الآن، سأقوم بتبسيط ذلك قليلاً 244 00:12:05,650 --> 00:12:07,233 لوجود مجموعة من عمليات إعادة التوجيه-- 245 00:12:07,233 --> 00:12:11,380 تتضمن برتوكولات HTTP 302 و301 وهذا ليس أمرًا مثيرًا للاهتمام اليوم. 246 00:12:11,380 --> 00:12:14,170 لذلك دعونا نفترض أن Gmail يستجيب على الفور. 247 00:12:14,170 --> 00:12:17,620 عادة، ما يستجيب Gmail بهذا، يقول 200 حسنًا. 248 00:12:17,620 --> 00:12:18,760 ها هي صفحة تسجيل الدخول. 249 00:12:18,760 --> 00:12:22,120 وها هي صفحة ويب بتنسيق نص/html. 250 00:12:22,120 --> 00:12:24,940 ولكن بمجرد تسجيلكم الدخول، فإن ما يقوم به Gmail الخاص بكم في الواقع 251 00:12:24,940 --> 00:12:26,530 هو إرسال ذلك أيضًا. 252 00:12:26,530 --> 00:12:31,030 تذكرون أننا نسمي هذه الأشياء رؤوس HTTP-- 253 00:12:31,030 --> 00:12:35,590 أزواج قيمة رئيسية مفصولة بنقطتين يتم إرسالها بشكل شبه سرى من المتصفح 254 00:12:35,590 --> 00:12:37,630 إلى الخادم ومن الخادم إلى المتصفح. 255 00:12:37,630 --> 00:12:41,390 الآن، نحن كمطوِّرين أكثر تطورًا يمكننا رؤية هذه الأمور، أليس كذلك؟ 256 00:12:41,390 --> 00:12:44,050 يمكنكم فتح علامة تبويب شبكة Chrome والبدء في التدقيق. 257 00:12:44,050 --> 00:12:45,790 وهي ليست سرية في حد ذاتها. 258 00:12:45,790 --> 00:12:47,800 فقط لا يعرف معظم الأشخاص أنها هناك. 259 00:12:47,800 --> 00:12:50,050 وما يقوم به Google والشركات الأخرى هو 260 00:12:50,050 --> 00:12:54,820 أنها حرفيًا تقوم بإرسال رأس تُسمى تعيين ملف تعريف الارتباط، القيمة التي منها 261 00:12:54,820 --> 00:12:59,170 تلك القيمة العشوائية الكبيرة التي قررها الخادم من أجلكم. 262 00:12:59,170 --> 00:13:03,070 متصفحكم، لنفتراض أنه يتحدث HTTP بشكل صحيح، 263 00:13:03,070 --> 00:13:06,340 يجب أن يحفظ تلك القيمة لاحقًا في RAM، ذاكرة الوصول العشوائي لجهاز الكمبيوتر، 264 00:13:06,340 --> 00:13:07,510 أو على محرك الأقراص الصلبة. 265 00:13:07,510 --> 00:13:12,070 ومن ثم يجب أن ترسلوا كل نقرة أخرى تقومون بها على gmail.com، 266 00:13:12,070 --> 00:13:16,510 ليس فقط رؤوس مثل هذه، ولكن يجب أن ترسلوا الرأس المقابلة-- 267 00:13:16,510 --> 00:13:18,940 مجرد ملف تعريف الارتباط، وليست مجموعة ملفات تعريف الارتباط، بل ملف تعريف الارتباط، وهو 268 00:13:18,940 --> 00:13:20,920 عرض تقديمي لختم اليدّ هذا. 269 00:13:20,920 --> 00:13:24,460 وبالتالي في كل مرة تنقرون فيها فوق صفحة على Gmail، أو Facebook، 270 00:13:24,460 --> 00:13:26,800 أو أي موقع ويب تقريبًا قمتم بتسجيل الدخول فيه. 271 00:13:26,800 --> 00:13:29,090 تم وضع ملفات تعريف الارتباط هذه على جهاز الكمبيوتر الخاص بكم. 272 00:13:29,090 --> 00:13:31,510 الآن مؤخرًا، في كل من أوروبا وفي الولايات المتحدة، 273 00:13:31,510 --> 00:13:34,360 تم تمرير القوانين التي تضغط على نحو متزايد 274 00:13:34,360 --> 00:13:37,870 على الشركات التي تعمل دوليًا لتقديم 275 00:13:37,870 --> 00:13:40,080 معلومات قائمة على ملفات تعريف الارتباط لكم، أليس كذلك؟ 276 00:13:40,080 --> 00:13:41,830 تحصلون على هذه القوائم المنبثقة الصغيرة بشكل متزايد. 277 00:13:41,830 --> 00:13:44,830 وتحصلون عليها منذ سنوات في أوروبا لنقل، 278 00:13:44,830 --> 00:13:47,110 هل يمكننا وضع ملفات تعريف الارتباط على جهاز الكمبيوتر؟ 279 00:13:47,110 --> 00:13:49,510 إذن بالنظر إلى كل هذا، ما الذي يمكن أن يحدث إذا قلتم 280 00:13:49,510 --> 00:13:51,370 لا، لا توجد ملفات تعريف الارتباط على جهاز الكمبيوتر؟ 281 00:13:51,370 --> 00:13:53,006 الجمهور: يجب تسجيل الدخول في كل مرة. 282 00:13:53,006 --> 00:13:55,630 ديفيد ج. مالان: يجب أن تقوموا بتسجيل الدخول في كل مرة، أليس كذلك؟ 283 00:13:55,630 --> 00:13:59,560 إذا قمتم بإزالة ميزة HTTP الأساسية هذه، سيتدهور العديد من تقسيمات 284 00:13:59,560 --> 00:14:03,160 الويب، أو تجربة المستخدم بشكل ملحوظ. 285 00:14:03,160 --> 00:14:06,710 الآن الجانب الآخر هو أن ملفات تعريف الارتباط يمكن استخدامها، ليس فقط للاستخدام الجيد، إذا جاز التعبير، 286 00:14:06,710 --> 00:14:07,460 ولكن للاستخدام الضار أيضًا. 287 00:14:07,460 --> 00:14:10,293 يتضح أنه توجد إعلانات كثيرة على الإنترنت، بالطبع. 288 00:14:10,293 --> 00:14:13,300 وهذا ما يحرك العديد من الإيرادات التي تجعل كل شيء ممكن. 289 00:14:13,300 --> 00:14:17,800 عادة ما تأتي هذه الإعلانات من علامات الصور في HTML الخاصة بكم أو علامات النص 290 00:14:17,800 --> 00:14:20,200 أو بعض علامات HTML التي رأيناها في الفصل الدراسي. 291 00:14:20,200 --> 00:14:23,560 لكنها تنتقل إلى خوادم تابعة لجهة خارجية، somewhereelse.com. 292 00:14:23,560 --> 00:14:27,250 وتنشأ المشكلة بملفات تعريف الارتباط عندما يتم السماح لتلك الجهات الخارجية 293 00:14:27,250 --> 00:14:29,770 بوضع ملفات تعريف الارتباط على جهاز الكمبيوتر الخاص بكم. 294 00:14:29,770 --> 00:14:32,347 لأنه إذا انتقلتم إلى Google، وانتقلتم إلى Facebook، 295 00:14:32,347 --> 00:14:34,180 وإلى Twitter-- مجموعة مواقع الويب. 296 00:14:34,180 --> 00:14:37,540 لنفترض أن لدى جميعها بعض الوسطاء الذين يقومون بالإعلان عن خدمة والإعلان 297 00:14:37,540 --> 00:14:38,860 على كل مواقع الويب هذه. 298 00:14:38,860 --> 00:14:41,560 هؤلاء الوسطاء، إذا جاز التعبير، لأن 299 00:14:41,560 --> 00:14:46,990 لديهم إعلاناتهم، وبالتالي، رؤوس HTTP الخاصة بهم على هذا الموقع، 300 00:14:46,990 --> 00:14:49,990 وهذا الموقع، وهذا الموقع، هناك جهات خارجية كبيرة 301 00:14:49,990 --> 00:14:52,900 هناك-- العديد منها تعلن عن شبكات-- تعرف كل مكان 302 00:14:52,900 --> 00:14:57,100 تنتقلون إليه أيها الشباب لأنها ترى ملف تعريف الارتباط الخاص بكم الذي يظهر 303 00:14:57,100 --> 00:14:58,960 من عدة مواقع أخرى مختلفة. 304 00:14:58,960 --> 00:15:03,009 ولذا هنا توجد ملفات تعريف الارتباط، ليس علم الكمبيوتر، الهندسة الفذّة، 305 00:15:03,009 --> 00:15:05,050 ولكنها في الحقيقة تشكل تهديدًا لخصوصية الفرد لأنه 306 00:15:05,050 --> 00:15:08,080 يمكن استخدامها بسهولة للتعقب. 307 00:15:08,080 --> 00:15:11,830 وبصراحة، AT&T وVerizon، كملاحظة جانبية، واجهتا المتاعب-- 308 00:15:11,830 --> 00:15:13,420 لا يعرف عدد كافي من الأشخاص ذلك-- 309 00:15:13,420 --> 00:15:18,550 قبل بضعة أعوام عندما بدأوا بشكل قسري، بضخ، رؤوس HTTP 310 00:15:18,550 --> 00:15:22,000 إضافية متشابهة في جوهرها مع هذه لنقل جميع بيانات الهواتف الخلوية للأشخاص-- 311 00:15:22,000 --> 00:15:25,180 بذلك لا توجد أشياء يمكنكم رفضها بشكل قطعي من البداية. 312 00:15:25,180 --> 00:15:28,060 لأن هذه كانت طريقة للمعلنين ولأنفسهم 313 00:15:28,060 --> 00:15:29,360 ليتمكّنوا من تعقب المستخدمين. 314 00:15:29,360 --> 00:15:33,220 إذن رؤوس HTTP هذه التي تقوم عليها ملفات تعريف الارتباط 315 00:15:33,220 --> 00:15:35,965 قوية جدًا، ولكنها أيضًا مزعجة للغاية. 316 00:15:35,965 --> 00:15:38,590 والآن فقط نبدأ برؤية، على الصعيد الاجتماعي والسياسي، 317 00:15:38,590 --> 00:15:42,340 تراجع الإقبال على هذه الآلية البسيطة التي، آمل، أننا كمطوِّري علم الكمبيوتر 318 00:15:42,340 --> 00:15:46,640 نفهم فقط آلياتها وبالتالي، الآثار الآن. 319 00:15:46,640 --> 00:15:48,820 إذن دعونا نرى ذلك في سياق، على سبيل المثال. 320 00:15:48,820 --> 00:15:53,740 دعوني أمضي قدمًا وأفتح مثالاً صغيرًا نسبيًا في CS50 IDE. 321 00:15:53,740 --> 00:15:56,800 بالنسبة لمَن لم يعتادوا على ذلك، CS50 IDE هو تطبيق قائم على الويب 322 00:15:56,800 --> 00:15:59,110 يمكنكم عبره كتابة برامج في السحابة، 323 00:15:59,110 --> 00:16:01,210 فقط باستخدام أي متصفح على جهاز Mac أو الكمبيوتر الشخصي. 324 00:16:01,210 --> 00:16:03,460 سأمضي قدمًا إلى حسابي هنا. 325 00:16:03,460 --> 00:16:05,920 سأقوم بالانتقال إلى المتجر. 326 00:16:05,920 --> 00:16:08,980 وسأنتقل إلى دليل القوالب 327 00:16:08,980 --> 00:16:11,050 وأعرض هذا المثال هنا الذي يحتوي على بعض الملفات. 328 00:16:11,050 --> 00:16:13,050 سيبدو هذا مألوفًا للطلاب في الغرفة. 329 00:16:13,050 --> 00:16:15,320 Application.py هو تطبيق قائم على الويب. 330 00:16:15,320 --> 00:16:17,900 ومن ثم لدينا بعض ملفات القوالب، إذا جاز التعبير. 331 00:16:17,900 --> 00:16:21,130 في النافذة الطرفية الخاصة بي هنا، سأمضي قدمًا، وفقط باستخدام لوحة المفاتيح الخاصة بي، 332 00:16:21,130 --> 00:16:25,400 سأنتقل إلى هذا الدليل المُسمى المتجر في source8، وهو متاح على الإنترنت. 333 00:16:25,400 --> 00:16:28,960 سأمضي قدمًا وأقوم بتشغيل flask، والذي، بالنسبة لمَن لم يعتادوا الأمر، 334 00:16:28,960 --> 00:16:31,420 هو الأمر الذي يمكنكم عبره بدء خادم ويب 335 00:16:31,420 --> 00:16:34,190 والبدء بتشغيل تطبيق قائم على الويب. 336 00:16:34,190 --> 00:16:39,100 إذن لديّ ذلك الآن، سأمضي قدمًا وأقوم بزيارة عنوان URL بالضبط هنا. 337 00:16:39,100 --> 00:16:43,804 وسنرى متجر ويب بسيط نسبيًا وقبيح للغاية. 338 00:16:43,804 --> 00:16:45,220 دعوني أمضي قدمًا وأقوم بالتكبير قليلاً. 339 00:16:45,220 --> 00:16:48,460 ويتيح ليّ متجر الويب هذا شراء ثلاثة أشياء-- foos، وbars، 340 00:16:48,460 --> 00:16:50,170 وbazes، أيًا كانت تلك. 341 00:16:50,170 --> 00:16:53,230 وهذه موقع يشبه التجارة الإلكترونية البسيطة للغاية 342 00:16:53,230 --> 00:16:56,810 حيث يجب أن أكتب فقط كمية foos، وbars، وbazes التي أريدها. 343 00:16:56,810 --> 00:16:58,610 ومن ثم يمكنني المضي قدمًا وشراؤها. 344 00:16:58,610 --> 00:17:02,800 إذن سأمضي قدمًا وأقول، أعطني foo واحدة، ماذا عن صفر bars، 345 00:17:02,800 --> 00:17:04,599 واثنتين من baze. 346 00:17:04,599 --> 00:17:06,700 وسأمضي قدمًا وأنقر فوق شراء. 347 00:17:06,700 --> 00:17:08,619 والآن سترون عربة التسوق الخاصة بي. 348 00:17:08,619 --> 00:17:10,540 ولكن إذا تابعتُ التسوق، سترون أنه 349 00:17:10,540 --> 00:17:13,640 يقوم بإعادة التعيين، تمامًا كما لو كنتم تتصفحون Amazon أو أي موقع ويب آخر. 350 00:17:13,640 --> 00:17:15,710 ولكن إذا كنتم تريدون التحقق من عربة التسوق مجددًا، 351 00:17:15,710 --> 00:17:17,765 لاحظوا أنه تذكر ما كنتُ أبحث عنه. 352 00:17:17,765 --> 00:17:18,890 وفي الواقع، أتعلمون ماذا؟ 353 00:17:18,890 --> 00:17:20,250 سأمضي قدمًا وأقوم بإغلاق النافذة. 354 00:17:20,250 --> 00:17:20,869 عذرًا. 355 00:17:20,869 --> 00:17:22,520 لقد فقدتُ الموقع بالفعل. 356 00:17:22,520 --> 00:17:23,599 ولكن أتعلمون ماذا؟ 357 00:17:23,599 --> 00:17:27,349 إذا رجعتُ إلى عنوان URL هذا وأعدتُ فتحه، أرى واجهة المتجر. 358 00:17:27,349 --> 00:17:30,500 ولكن إذا قمتُ بعرض عربة التسوق الخاصة بي، لقد تذكر حالتي. 359 00:17:30,500 --> 00:17:32,550 لذلك لاحظوا الآن قوة ملفات تعريف الارتباط. 360 00:17:32,550 --> 00:17:35,390 إنها لا تتذكر مَن تكون من ختم اليدّ فقط. 361 00:17:35,390 --> 00:17:39,080 ولكن الآن يمكنكم تذكر أي شيء عن هذا المستخدم الذي تريدونه، أليس كذلك؟ 362 00:17:39,080 --> 00:17:43,100 عربة التسوق على Amazon أو أي موقع ويب هو أفضل مثال على ذلك 363 00:17:43,100 --> 00:17:46,640 لأنه سيكون أمرًا فظيعًا، فظيعًا، فظيعًا بالنسبة إلى تجربة المستخدم أو UX 364 00:17:46,640 --> 00:17:48,530 إذا قمتم في كل مرة بالنقر فوق الرابط، وفقدتم 365 00:17:48,530 --> 00:17:52,010 محتويات عربة التسوق الخاصة بكم لأن الموقع نسي مَن تكونوا. 366 00:17:52,010 --> 00:17:54,410 إذن هذه ميزة جذابة للتذكر. 367 00:17:54,410 --> 00:17:57,020 وملفات تعريف الارتباط الخاصة بها التي تقوم بتنفيذ هذه الميزة أيضًا. 368 00:17:57,020 --> 00:18:00,440 لأنه بشكل عام، ما يحدث باستخدام ملفات تعريف الارتباط هو ذلك. 369 00:18:00,440 --> 00:18:03,920 عندما تقومون بتعيين ملف تعريف ارتباط باستخدام رأس تعيين ملف تعريف الذي 370 00:18:03,920 --> 00:18:07,550 بدا مثل هذا، هناك زوج قيمة رئيسية 371 00:18:07,550 --> 00:18:11,240 على اليمين والذي يمكن أن نسميه جلسة، وهو يحتوي على قيمة. 372 00:18:11,240 --> 00:18:12,710 القيمة هي ختم اليدّ. 373 00:18:12,710 --> 00:18:16,410 الجلسة مجرد مصطلح فني يشير إلى هذا التجريد 374 00:18:16,410 --> 00:18:18,410 الذي يمكنكم التفكير فيه حقًا كعربة تسوق. 375 00:18:18,410 --> 00:18:21,660 ولكن لا يجب أن تقوموا بأي شيء باستخدام التسوق الفعلي أو التجارة الإلكترونية. 376 00:18:21,660 --> 00:18:24,830 إنه مجرد وعاء يمكنكم تخزين الأشياء فيه. 377 00:18:24,830 --> 00:18:29,450 إذن هذا يقوم بإخبار الموقع أن قيمة الجلسة الخاصة بي، ختم اليد الخاص بي 378 00:18:29,450 --> 00:18:32,840 هو 12345-- وهو رقم عشوائي كبير بالفعل. 379 00:18:32,840 --> 00:18:35,060 ثم يمكن أن يقول الموقع، أتعلمون ماذا؟ 380 00:18:35,060 --> 00:18:37,730 سأقوم بتخزين وعاء من أجلكم. 381 00:18:37,730 --> 00:18:40,490 دعونا نسميه قاموس Python، أو dict من أجلكم، 382 00:18:40,490 --> 00:18:42,810 بداخله يمكنني وضع أي شيء أريده. 383 00:18:42,810 --> 00:18:46,040 ولذا في الواقع، عندما تنتقلون إلى عربة تسوق كهذه، 384 00:18:46,040 --> 00:18:48,290 ما الذي يقوم به الخادم بالفعل؟ 385 00:18:48,290 --> 00:18:52,652 حسنًا، عندما يرى ختم اليدّ الخاص بك، ويدرك أنه، أوه، أنت المستخدم 1234567. 386 00:18:52,652 --> 00:18:55,010 أوه، هذا اسم المستخدم مالان. 387 00:18:55,010 --> 00:18:57,830 دعوني أمضي قدمًا وأسحب القاموس، Python dict 388 00:18:57,830 --> 00:19:00,830 من الذاكرة، أو حتى من ملف CSV إذا أردتم، 389 00:19:00,830 --> 00:19:03,470 وأعرض لكم محتويات عربة التسوق الخاصة بكم. 390 00:19:03,470 --> 00:19:06,710 وفي الوقت نفسه، شخص آخر، يقوم براين بزيارة الموقع نفسه بالضبط 391 00:19:06,710 --> 00:19:08,030 ويُسجِّل الدخول فيه باستخدام حسابه. 392 00:19:08,030 --> 00:19:10,550 يقوم بتقديم ختم يدّ مختلف، بشكل افتراضي. 393 00:19:10,550 --> 00:19:13,460 وبالتالي يمكن أن يبحث موقع الويب عن قاموس مختلف 394 00:19:13,460 --> 00:19:16,430 ويعرض لبراين محتويات مختلفة من عربة التسوق الخاصة به. 395 00:19:16,430 --> 00:19:18,390 والأمر نفسه لكل شخص في هذه الغرفة. 396 00:19:18,390 --> 00:19:19,850 إذن هذه الآلية البسيطة-- 397 00:19:19,850 --> 00:19:21,180 أعني، فكّروا في القوة. 398 00:19:21,180 --> 00:19:24,770 هذه مجرد قيمة نص غبية key:value. 399 00:19:24,770 --> 00:19:28,730 وبسبب كل ذلك تأتي جميع قدرات الويب الآن. 400 00:19:28,730 --> 00:19:31,070 ولن نلقي نظرة بشكل تفصيلي للغاية على التعليمة البرمجية هنا، 401 00:19:31,070 --> 00:19:32,990 لكن دعوني أعرض مقتطفًا واحدًا منها. 402 00:19:32,990 --> 00:19:37,850 إذا انتقلتُ إلى application.py، فإن السحر الذي يجعل ذلك ممكنًا في flask 403 00:19:37,850 --> 00:19:40,362 هو فقط استيراد هذه الميزة الإضافية. 404 00:19:40,362 --> 00:19:42,320 ستتذكرون، من المشكلات القليلة الماضية 405 00:19:42,320 --> 00:19:45,110 التي عملتم عليها، تقومون باستيراد بعض الأشياء من flask-- 406 00:19:45,110 --> 00:19:47,740 وتقديم قالب، وإعادة التوجيه، والطلب. 407 00:19:47,740 --> 00:19:49,760 حسنًا، إذا قمتم بإضافة جلسة إلى تلك القائمة، والتي 408 00:19:49,760 --> 00:19:53,750 هي تجريد التعليمة البرمجية لفكرة ختم اليدّ هذه، ما يمكنكم القيام به الآن 409 00:19:53,750 --> 00:19:54,450 هو ذلك. 410 00:19:54,450 --> 00:19:56,600 دعوني أقوم بالتمرير إلى الجزء الهام هنا. 411 00:19:56,600 --> 00:19:59,390 ولاحظوا أنه يمكنكم تنفيذ سطور التعليمة البرمجية الآن، 412 00:19:59,390 --> 00:20:03,830 وبالنسبة لمشكلة CS50 finance المقبلة، سطور تعليمة برمجية كهذه. 413 00:20:03,830 --> 00:20:07,220 الجلسة هي قاموس Python، أو dict فقط. 414 00:20:07,220 --> 00:20:09,530 يمكنكم فهرستها باستخدام أي كلمة-- 415 00:20:09,530 --> 00:20:13,670 foo، أو bar، أو baz، تمامًا كما يمكنكم ذلك باستخدام القواميس بشكل عام أكثر. 416 00:20:13,670 --> 00:20:15,927 ويمكنكم تخزين أي شيء تريدونه فيها. 417 00:20:15,927 --> 00:20:17,510 في حالتي، أريد تخزين رقم-- 418 00:20:17,510 --> 00:20:20,540 0 foos، أو 1 foo، أو 2 foos أو أيًا كان. 419 00:20:20,540 --> 00:20:24,650 إذن يمكنني ببساطة التحويل إلى int، عنصر أشكال طلب 420 00:20:24,650 --> 00:20:25,609 المستخدم، أيًا كان ذلك. 421 00:20:25,609 --> 00:20:28,316 ولن أتطرق إلى بعض التعليمة البرمجية في الأعلى لأنها فقط 422 00:20:28,316 --> 00:20:29,510 تقوم بتعيين الشيء بالكامل. 423 00:20:29,510 --> 00:20:31,670 لكن السطر الجديد من التعليمة البرمجية، الميزة الجديدة 424 00:20:31,670 --> 00:20:35,180 التي ستمكننا الآن من بناء شيء مثل موقع تداول الأسهم 425 00:20:35,180 --> 00:20:37,670 على الويب وهو ببساطة هذا السطر هنا. 426 00:20:37,670 --> 00:20:40,640 نظرًا لما يمكنكم القيام به أيضًا لتذكر أن المستخدم قام بتسجيل الدخول، 427 00:20:40,640 --> 00:20:43,370 فقط امضوا قدمًا وقوموا بتخزين في هذه التي تُسمى بالجلسة، 428 00:20:43,370 --> 00:20:45,027 قيمة، مثل، صحيح. 429 00:20:45,027 --> 00:20:48,110 وإذا كانت القيمة صحيحة هناك، فيمكنكم استنتاج أن الشخص قام بتسجيل الدخول. 430 00:20:48,110 --> 00:20:52,670 وإذا لم تكن هناك هذه القيمة في القاموس، فلم يقم بتسجيل الدخول. 431 00:20:52,670 --> 00:20:55,880 ومن ثم سنقوم بإرشادكم بشكل أكبر قليلاً في مجموعة المشاكل التالية 432 00:20:55,880 --> 00:20:57,710 باستخدام مقدمة CS50 Finance هذه. 433 00:20:57,710 --> 00:20:59,540 وسنكتب بعض التعليمة البرمجية التي تعالج تسجيل الدخول، 434 00:20:59,540 --> 00:21:01,490 وبذلك يمكنكم رؤية كيفية القيام بذلك من خلال المثال. 435 00:21:01,490 --> 00:21:03,530 لكن الأمر سيكون متروكًا لكم بعد ذلك للبدء 436 00:21:03,530 --> 00:21:07,100 بتذكُر الأسهم قام المستخدم باستخدام 437 00:21:07,100 --> 00:21:11,120 الجلسات في الواقع للإبقاء على حقيقة قيامه بتسجيل الدخول بالفعل. 438 00:21:11,120 --> 00:21:11,620 حسنًا. 439 00:21:11,620 --> 00:21:13,550 إذن كان ذلك كثيرًا في مرة واحدة. 440 00:21:13,550 --> 00:21:17,360 ولكن أي أسئلة حول ملفات تعريف الارتباط والميزة التي تقدمها، 441 00:21:17,360 --> 00:21:19,916 هذه الأشياء التي تُسمى بالجلسات؟ 442 00:21:19,916 --> 00:21:20,730 أي شيء على الإطلاق؟ 443 00:21:20,730 --> 00:21:22,366 أجل؟ 444 00:21:22,366 --> 00:21:25,467 الجمهور: هل يتم حفظ الجلسة من جانب المستخدم أم الخادم؟ 445 00:21:25,467 --> 00:21:28,300 ديفيد ج. مالان: هل يتم حفظ الجلسة من جانب المستخدم أم الخادم؟ 446 00:21:28,300 --> 00:21:29,390 سؤال جيد حقًا. 447 00:21:29,390 --> 00:21:31,720 ويمكن أن تكون الإجابة على حسب. 448 00:21:31,720 --> 00:21:35,600 يمكنك التخزين في عميل المستخدم، على متصفحه. 449 00:21:35,600 --> 00:21:41,107 وكما اقترح الرجل الفاضل هنا، أنه يمكنك من الناحية النظرية تخزين اسم المستخدم 450 00:21:41,107 --> 00:21:43,690 وكلمة المرور الخاصة به حرفيًا-- ربما اقترحتُ ذلك في وقت سابق-- 451 00:21:43,690 --> 00:21:44,439 على جهاز الكمبيوتر الخاص به. 452 00:21:44,439 --> 00:21:47,200 وهذا أمر سيء للأسباب التي ذكرناها سابقًا. 453 00:21:47,200 --> 00:21:50,320 ولكن يمكنكم أيضًا تخزين محتويات عربة التسوق الخاصة به، foos، وbars، 454 00:21:50,320 --> 00:21:50,950 وbazes. 455 00:21:50,950 --> 00:21:53,320 هذا ليس أمرًا مزعجًا تمامًا كتخزين كلمة المرور الخاصة به. 456 00:21:53,320 --> 00:21:56,028 ولكن إذا كنتم تقومون بشراء أشياء لا تريدون أن يعرف عنها الأشخاص حقًا، 457 00:21:56,028 --> 00:21:56,980 فذلك يكون أمرًا مزعجًا. 458 00:21:56,980 --> 00:21:58,063 لذلك ربما يمكننا فعل ما هو أفضل. 459 00:21:58,063 --> 00:22:00,430 والأفضل غالبًا، هو تخزينها على الخادم. 460 00:22:00,430 --> 00:22:02,230 إذن سيقوم موقع الويب المُصمم جيدًا عادة 461 00:22:02,230 --> 00:22:07,270 بتخزين هذه القيمة العشوائية الكبيرة فقط، ختم اليدّ، على جهاز Mac أو الكمبيوتر الشخصي. 462 00:22:07,270 --> 00:22:10,030 ومن ثم يتم تخزين جميع الأشياء المثيرة للاهتمام وربما الحساسة 463 00:22:10,030 --> 00:22:14,230 في قاعدة البيانات أو في ملف CSV أو فقط في ذاكرة الوصول العشوائي للخادم أو في الذاكرة 464 00:22:14,230 --> 00:22:15,760 كما في المتغير الشامل. 465 00:22:15,760 --> 00:22:16,910 سؤال جيد. 466 00:22:16,910 --> 00:22:19,520 أي أسئلة أخرى؟ 467 00:22:19,520 --> 00:22:21,145 أي أسئلة أخرى؟ 468 00:22:21,145 --> 00:22:22,390 لا. 469 00:22:22,390 --> 00:22:23,150 حسنًا. 470 00:22:23,150 --> 00:22:25,670 إذن هذه المشكلة قد حُلّت. 471 00:22:25,670 --> 00:22:28,280 نعلم الآن أنه يمكننا تنفيذ أشكال تسجيل الدخول. 472 00:22:28,280 --> 00:22:30,930 ونعلم أنه يمكننا تذكّر هؤلاء الأشخاص الذين قاموا بتسجيل الدخول. 473 00:22:30,930 --> 00:22:33,210 إذن دعونا فقط نقوم بتحديد أن ذلك ممكن الآن. 474 00:22:33,210 --> 00:22:36,350 ولكن على مدار الأسبوعين الماضيين، لم يكن الوصول إلى أشياء كملفات CSV، 475 00:22:36,350 --> 00:22:41,120 القيم المفصولة بفاصلة، والتي 476 00:22:41,120 --> 00:22:43,910 تقوم بإنشاء وهم جداول بيانات Google وExcel 477 00:22:43,910 --> 00:22:46,220 وApple Numbers مثل الأعمدة والصفوف أمرًا قويًا بشكل لا يصدق. 478 00:22:46,220 --> 00:22:46,790 لماذا؟ 479 00:22:46,790 --> 00:22:49,331 حسنًا، إنه بحث خطي إلى حد كبير عن كل شيء، أليس كذلك؟ 480 00:22:49,331 --> 00:22:52,370 ملف CSV هو عبارة عن مجرد صفوف وصفوف وصفوف وصفوف من البيانات. 481 00:22:52,370 --> 00:22:54,500 وإذا كنتم تريدون البحث عن أي شيء في ذلك 482 00:22:54,500 --> 00:22:57,540 الملف، على النحو الذي ربما كنتم تريدونه لتنفيذ الاستقصاء الخاص بكم، 483 00:22:57,540 --> 00:22:58,460 كيف يمكنكم العثور عليه؟ 484 00:22:58,460 --> 00:23:00,470 حسنًا، تقومون بفتح الملف باستخدام Open. 485 00:23:00,470 --> 00:23:04,040 ربما تستخدمون تكرار حلقي من النوع for وتقومون بتكرار كل سطر 486 00:23:04,040 --> 00:23:06,440 للبحث عن بعض القيم، ومن ثم تقومون بإغلاق الملف. 487 00:23:06,440 --> 00:23:07,489 هذا هو حرف O كبير من n. 488 00:23:07,489 --> 00:23:10,280 وفي أسوأ الحالات، الأمر الذي يهمكم يكون في النهاية. 489 00:23:10,280 --> 00:23:11,810 وهو ليس فعّالاً للغاية. 490 00:23:11,810 --> 00:23:14,180 الآن، يمكنكم إلحاق الملفات بشكل فعّال للغاية. 491 00:23:14,180 --> 00:23:17,390 تذكرون عندما فتحنا الملفات باستخدامعلامة اقتباس وعلامة إنهاء الاقتباس، "إ" لوضع الإلحاق. 492 00:23:17,390 --> 00:23:20,180 فعلنا ذلك باستخدام مثال موجز، بدلاً من "ك" للكتابة. 493 00:23:20,180 --> 00:23:23,630 حصلتم على مساعدة نظام التشغيل ووصلتم إلى الملف 494 00:23:23,630 --> 00:23:25,610 في الأسفل، وهو فعّال أكثر. 495 00:23:25,610 --> 00:23:28,460 ولكن لا يمكنكم إدراج الأشياء في المنتصف بفاعلية عالية. 496 00:23:28,460 --> 00:23:30,200 لا يمكنكم حذف الأشياء بسهولة. 497 00:23:30,200 --> 00:23:33,650 بالنسبة إلى تلك الأنواع من السيناريوهات، يجب عليكم حرفيًا، فتح الملف، 498 00:23:33,650 --> 00:23:36,590 قراءة كل شيء، ثم كتابة أجزاء منه 499 00:23:36,590 --> 00:23:38,870 أو إضافة شيء إليه أثناء قيامكم بالكتابة. 500 00:23:38,870 --> 00:23:41,420 وهكذا أدرك الأشخاص منذ سنوات، حسنًا، هذا أمر غبي. 501 00:23:41,420 --> 00:23:43,460 نحن البشر جميعًا في العالم نكتب باستمرار 502 00:23:43,460 --> 00:23:46,610 تعليمة برمجية لفتح الملفات، وتغييرها، وحفظها. 503 00:23:46,610 --> 00:23:50,502 لمَ لا يقوم بعض منا بعمل أفضل لتنفيذ هذه الميزة، 504 00:23:50,502 --> 00:23:51,710 ثم مشاركتها مع العالم؟ 505 00:23:51,710 --> 00:23:53,930 وهكذا تم إنشاء قواعد البيانات، بشكل فعّال. 506 00:23:53,930 --> 00:23:56,900 وهذه الأيام، هناك عدة أنواع مختلفة من قواعد البيانات-- 507 00:23:56,900 --> 00:23:59,900 قد تكونوا على دراية باستخدام الأدوات، برنامج تجاري مثل Oracle، 508 00:23:59,900 --> 00:24:02,240 أو خادم SQL، أو Microsoft Access. 509 00:24:02,240 --> 00:24:05,420 وفي العالم مفتوح المصدر، هناك Postgres وMySQL، 510 00:24:05,420 --> 00:24:07,040 وSQLite وغيرها. 511 00:24:07,040 --> 00:24:09,710 والعديد منها، حيث هذه الأسماء تشير إلى، 512 00:24:09,710 --> 00:24:13,310 استخدام لغة خاصة تُسمى SQL، لغة الاستعلامات المركبة، وهي 513 00:24:13,310 --> 00:24:15,020 آخر لغة سنقوم بتقديمها 514 00:24:15,020 --> 00:24:17,960 لكم في دورة CS50 ما لم تختاروا بأنفسكم شيئًا آخر 515 00:24:17,960 --> 00:24:19,160 في المشاريع النهائية. 516 00:24:19,160 --> 00:24:22,820 ولكن باستخدام SQL، يمكنكم تحديد البيانات من قاعدة البيانات، 517 00:24:22,820 --> 00:24:25,070 وإدراجها، وحذفها، وتحديثها. 518 00:24:25,070 --> 00:24:28,220 جميع الأشياء التي يمكنكم فعلها بالتأكيد باستخدام Python وملفات CSV، 519 00:24:28,220 --> 00:24:32,790 ستكون كتابة سطور تلك التعليمة البرمجية بأنفسكم أمرًا مملاً للغاية فقط. 520 00:24:32,790 --> 00:24:34,490 إذن ما هو النموذج العقلي المناسب؟ 521 00:24:34,490 --> 00:24:37,577 هنا، أزعم، وجود قاعدة بيانات بشكل أساسي. 522 00:24:37,577 --> 00:24:39,410 على سبيل المثال من المحتمل أن معظم الحاضرين في هذه الغرفة 523 00:24:39,410 --> 00:24:41,618 استخدموا جداول بيانات Google، وإذا لم تفعلوا ذلك، فعلى الأرجح 524 00:24:41,618 --> 00:24:43,890 Excel أو ربما أرقام Apple. 525 00:24:43,890 --> 00:24:45,650 إذن هذه هي جداول البيانات. 526 00:24:45,650 --> 00:24:49,320 وهي في الأساس ما يمكنكم تسميته بقاعدة بيانات ارتباطية. 527 00:24:49,320 --> 00:24:51,320 ارتباطية-- تشير إلى وجود علاقات 528 00:24:51,320 --> 00:24:54,290 بين البيانات المختلفة في الصفوف والأعمدة المُقرَّرة من قِبلكم 529 00:24:54,290 --> 00:24:55,310 أو أيًا مَن قام بإعدادها. 530 00:24:55,310 --> 00:24:57,050 وهذا هو جدول البيانات بالطبع. 531 00:24:57,050 --> 00:25:00,980 ويحتوي على صفوف حيث تنتقل بياناتكم الفعلية. 532 00:25:00,980 --> 00:25:04,760 والأعمدة-- وما هو جدير بالذكر بشأن الأعمدة؟ 533 00:25:04,760 --> 00:25:06,950 ما الذي يكون القيام به أمرًا تقليديًا باستخدام الأعمدة، 534 00:25:06,950 --> 00:25:08,210 على وجه الخصوص في هذا الصف الأول؟ 535 00:25:08,210 --> 00:25:09,182 الجمهور: الرؤوس. 536 00:25:09,182 --> 00:25:10,960 ديفيد ج. مالان: نعم، وضع بعض من قيم الرؤوس، أليس كذلك؟ 537 00:25:10,960 --> 00:25:12,820 يمكنكم بالتأكيد وضعها على اليسار. 538 00:25:12,820 --> 00:25:14,890 إنه مجرد تفضيل بشري، على ما يبدو، للقراءة من أعلى 539 00:25:14,890 --> 00:25:17,200 إلى أسفل بدلاً من اليسار على طول الطريق إلى اليمين. 540 00:25:17,200 --> 00:25:20,170 إذن قمنا منذ سنوات فقط بتبنّي التقاليد حيث تمثل الأعمدة الخاصة بكم 541 00:25:20,170 --> 00:25:24,580 أنواعًا مختلفة من البيانات، وتمثل الصفوف قيمًا مختلفة 542 00:25:24,580 --> 00:25:27,710 لهذه الحقول أو لهذه الأعمدة، إذا جاز التعبير. 543 00:25:27,710 --> 00:25:30,100 إذن إذا أردتم تخزين جدول بيانات القيم 544 00:25:30,100 --> 00:25:33,400 لمجموعة من الطلاب في الصف الدراسي أو في الجامعة، 545 00:25:33,400 --> 00:25:37,120 قد يكون أحد الأعمدة عبارة عن رقم معرّف، مثل معرّف هارفارد أو معرّف يال. 546 00:25:37,120 --> 00:25:40,900 وقد يكون عمود آخر عبارة عن أسمائهم، وعناوين بريدهم الإلكتروني، وأرقام هواتفهم، وأعمارهم، 547 00:25:40,900 --> 00:25:41,470 وما إلى ذلك. 548 00:25:41,470 --> 00:25:42,970 ويمكنكم فقط وضع كل ذلك. 549 00:25:42,970 --> 00:25:46,420 يمكنكم جعلها جميلة وكتابة الجزء العلوي بالخط الغامق وتنظيم الأشياء وفرزها. 550 00:25:46,420 --> 00:25:49,179 لكن في مرحلة ما، لا تكون هذه هي الأداة المناسبة تمامًا. 551 00:25:49,179 --> 00:25:51,220 وفي الواقع، واجهتُ ذلك الأمر في الدراسات العليا منذ 552 00:25:51,220 --> 00:25:53,262 سنوات حيث كنتُ أقوم بتحليل مجموعات كبيرة من البيانات. 553 00:25:53,262 --> 00:25:55,720 وكان النقر المزدوج فوق ملف CSV فقط، وفتحه في Excel، 554 00:25:55,720 --> 00:25:58,570 ومعالجته فقط والإجابة على أسئلة البيانات التي كانت لديّ 555 00:25:58,570 --> 00:25:59,820 أمرًا مناسبًا تمامًا. 556 00:25:59,820 --> 00:26:06,370 ولكن في الماضي، كان Excel يحتوي على حد قدره 65536 صف. 557 00:26:06,370 --> 00:26:08,020 هذا يبدو عددًا كبيرًا-- 558 00:26:08,020 --> 00:26:12,130 وهذا يمثل 2 إلى القوة 16، إذا كنتم تستدعون المرجع هناك. 559 00:26:12,130 --> 00:26:15,450 وهكذا قرر البشر منذ سنوات في Microsoft، أن هذا يكفي. 560 00:26:15,450 --> 00:26:16,720 وبصراحة، كان الأمر كذلك. 561 00:26:16,720 --> 00:26:18,820 لأنه حتى في آلاف الصفوف، على سبيل المثال، 562 00:26:18,820 --> 00:26:22,960 أصبح جهاز Mac الخاص بي غير صالح للاستخدام بسبب استخدام مساحة كبيرة من الذاكرة فقط. 563 00:26:22,960 --> 00:26:25,590 لذلك كان ذلك مجرد حد غير عملي على أي حال. 564 00:26:25,590 --> 00:26:27,340 ولكن في مرحلة ما، قد تريدون تخزين 565 00:26:27,340 --> 00:26:33,670 65537 صفًا من البيانات أو مئات الآلاف من الصفوف أو الملايين من الصفوف 566 00:26:33,670 --> 00:26:34,420 أو حتى أكثر. 567 00:26:34,420 --> 00:26:36,711 أعني، هناك العديد من مواقع الويب، Google وFacebook 568 00:26:36,711 --> 00:26:38,350 وغيرها التي تفعل ذلك بالتأكيد. 569 00:26:38,350 --> 00:26:41,060 لا يمكنكم فقط استخدام برنامج على جهاز Mac أو الكمبيوتر الشخصي لديكم بعد الآن. 570 00:26:41,060 --> 00:26:42,700 تحتاجون إلى استخدام برنامج رائع أكثر. 571 00:26:42,700 --> 00:26:46,150 لكن هذا البرنامج الرائع غالبًا ما يزال يعمل بالطريقة نفسها. 572 00:26:46,150 --> 00:26:49,780 لديكم ملف رئيسي واحد يُسمى جدول البيانات في عالمنا البشري. 573 00:26:49,780 --> 00:26:52,932 ولكن في عالم الخوادم، قد تسمونه بقاعدة بيانات بدلاً من ذلك. 574 00:26:52,932 --> 00:26:54,640 وفي حين أنه في عالمنا البشري، قد تكون 575 00:26:54,640 --> 00:26:58,150 لدينا أشياء تُسمى أوراق أو جداول بيانات فردية ضمن الملف الأكبر، 576 00:26:58,150 --> 00:27:00,740 في قاعدة بيانات، ستكون لديكم أشياء تُسمى جداول. 577 00:27:00,740 --> 00:27:03,580 لكنها بالضبط الشيء نفسه باستخدام الصفوف والأعمدة. 578 00:27:03,580 --> 00:27:05,620 وبذلك عندما نريد تخزين البيانات بالفعل، 579 00:27:05,620 --> 00:27:08,289 يمكننا بالفعل تخزينها بهذه الطرق بالضبط. 580 00:27:08,289 --> 00:27:09,580 إذن دعوني أمضي قدمًا وأفعل هذا. 581 00:27:09,580 --> 00:27:13,060 دعوني أمضي قدمًا وأفتح جداول بيانات Google فقط 582 00:27:13,060 --> 00:27:15,450 بصفتها ممثل قاعدة بيانات. 583 00:27:15,450 --> 00:27:18,520 ودعوني أمضي قدمًا وأقوم بإنشاء ملف جديد هنا. 584 00:27:18,520 --> 00:27:23,740 إذن جدول بيانات جديد-- وبذلك يمكننا فقط تمثيل أشياء مثل الطلاب. 585 00:27:23,740 --> 00:27:25,630 وسأقوم بتسمية جدول البيانات هذا بالطلاب. 586 00:27:25,630 --> 00:27:29,381 وسأقوم هنا بوضع أرقام هويتهم الشخصية وأسمائهم، وما هي 587 00:27:29,381 --> 00:27:31,630 بعض الحقول الأخرى التي تحدثتُ عنها وتتبادر إلى أذهانكم؟ 588 00:27:31,630 --> 00:27:32,424 الجمهور: البريد الإلكتروني. 589 00:27:32,424 --> 00:27:33,340 ديفيد ج. مالان: البريد الإلكتروني. 590 00:27:33,340 --> 00:27:34,240 الجمهور: السكن. 591 00:27:34,240 --> 00:27:34,880 ديفيد ج. مالان: كررها مرة أخرى. 592 00:27:34,880 --> 00:27:35,620 الجمهور: السكن. 593 00:27:35,620 --> 00:27:35,990 ديفيد ج. مالان: السكن. 594 00:27:35,990 --> 00:27:36,842 جيد. 595 00:27:36,842 --> 00:27:38,810 الجمهور: الرياضات والأمور التي يريدون القيام بها. 596 00:27:38,810 --> 00:27:39,601 ديفيد ج. مالان: حسنًا. 597 00:27:39,601 --> 00:27:41,250 إذن الرياضات التي يريدون القيام بها، بالتأكيد. 598 00:27:41,250 --> 00:27:44,040 هذا جيد-- يبدو طويلاً إلى حد ما. 599 00:27:44,040 --> 00:27:45,202 ماذا أيضًا؟ 600 00:27:45,202 --> 00:27:46,620 الجمهور: عام التخرج. 601 00:27:46,620 --> 00:27:48,600 ديفيد ج. مالان: عام التخرج، العمر، حسنًا، جيد. 602 00:27:48,600 --> 00:27:52,805 إذن عام التخرج، العمر، التركيز-- 603 00:27:52,805 --> 00:27:55,680 حسنًا، وربما يمكننا المتابعة، ويزداد الجدول اتساعًا فقط. 604 00:27:55,680 --> 00:27:59,400 وهذه هي الأعمدة، إذا صح التعبير، أو الحقول في قاعدة البيانات. 605 00:27:59,400 --> 00:28:03,030 وبصراحة، يمكنني تسمية ذلك إذا أردتُ حقًا أن يكون مُرتبًا هنا، 606 00:28:03,030 --> 00:28:04,440 ويمكنني أن أسمي ذلك بالطلاب. 607 00:28:04,440 --> 00:28:04,800 وأتعلمون ماذا؟ 608 00:28:04,800 --> 00:28:07,260 ربما يجب أن أسمي ذلك بالجامعة وليس بالطلاب. 609 00:28:07,260 --> 00:28:10,740 لأنني قد أريد الحصول على علامة تبويب أخرى هنا سنسميها بشكل استباقي 610 00:28:10,740 --> 00:28:12,540 باسم، لنقل، الكلية. 611 00:28:12,540 --> 00:28:15,419 وربما يكون لدى الكلية أرقام هوية، ولديها أسماء، 612 00:28:15,419 --> 00:28:17,460 ولديها أقسام على الأرجح، على سبيل المثال. 613 00:28:17,460 --> 00:28:20,590 ولديها بريد إلكتروني أيضًا على الأرجح وهكذا. 614 00:28:20,590 --> 00:28:22,510 إذن رقم الهاتف هو أمر آخر. 615 00:28:22,510 --> 00:28:25,200 لكنني ربما أريد تجميع هذه الأنواع المختلفة من 616 00:28:25,200 --> 00:28:27,286 البيانات في جداول بيانات مختلفة لأنها 617 00:28:27,286 --> 00:28:28,410 مختلفة عن بعضها البعض إلى حد ما. 618 00:28:28,410 --> 00:28:31,680 قد يكون هناك بعض التداخل، ولكنها تكون مميزة داخل أوراق مختلفة. 619 00:28:31,680 --> 00:28:34,089 في عالم قاعدة البيانات، تقومون بالشيء نفسه بالضبط، 620 00:28:34,089 --> 00:28:35,880 باستثناء أنكم تسمون كل شيء بقاعدة بيانات، 621 00:28:35,880 --> 00:28:38,670 ويمكنكم تسمية هذه الأشياء بالجداول للتوضيح. 622 00:28:38,670 --> 00:28:41,850 لكن الأهم من ذلك، باستخدام قاعدة بيانات حقيقية، إذا جاز التعبير، 623 00:28:41,850 --> 00:28:45,120 يجب أن تكونوا استباقيين أكثر بشأن إخبار قاعدة البيانات 624 00:28:45,120 --> 00:28:46,680 أي أنواع البيانات التي تريدون تخزينها. 625 00:28:46,680 --> 00:28:49,138 الآن، هؤلاء الذين استخدموا جداول بيانات Google وأرقام 626 00:28:49,138 --> 00:28:52,620 apple وExcel يعلمون أنه يمكنكم الانتقال إلى قائمة التنسيق أو قائمة البيانات 627 00:28:52,620 --> 00:28:55,380 أو أيًا كان، ويمكنكم عرض الأشياء في أماكن نقاط عشرية مختلفة. 628 00:28:55,380 --> 00:28:56,970 يمكنكم تحويل الأشياء إلى نسب مئوية. 629 00:28:56,970 --> 00:28:58,410 ويمكنكم تنسيق البيانات. 630 00:28:58,410 --> 00:29:01,170 ولكن لا يميل ذلك إلى أن يكون له أي تأثير وظيفي على بياناتكم. 631 00:29:01,170 --> 00:29:03,940 إنه تفصيل جمالي فقط، على سبيل المثال، مدى كبر أو صغر 632 00:29:03,940 --> 00:29:07,690 الأرقام التي تريدون عرضها في الأعمدة والخلايا الخاصة بكم. 633 00:29:07,690 --> 00:29:10,830 ولكن باستخدام قواعد البيانات، يمكنكم في الواقع تقديم تلميحات هامة 634 00:29:10,830 --> 00:29:15,960 إلى قاعدة البيانات التي ستساعد قاعدة البيانات هذه في تخزين البيانات والعثور عليها من أجلكم 635 00:29:15,960 --> 00:29:17,670 بشكل أكثر كفاءة. 636 00:29:17,670 --> 00:29:20,580 على سبيل المثال، هناك قائمة مُطولة من أنواع البيانات 637 00:29:20,580 --> 00:29:22,440 التي لدينا حق الوصول إليها في SQL. 638 00:29:22,440 --> 00:29:26,220 إذن SQL هي اللغة التي باستخدامها يمكننا الاستعلام عن قاعدة بيانات. 639 00:29:26,220 --> 00:29:30,150 بصراحة، في شيء مثل جدوال بيانات Google وMicrosoft Excel، 640 00:29:30,150 --> 00:29:31,080 كيف يمكنكم العثور على البيانات؟ 641 00:29:31,080 --> 00:29:34,680 سنقوم عادة بالضغط على Command-F أو Control-F، وستقومون بالبحث عنها. 642 00:29:34,680 --> 00:29:35,910 هذا ليس أمرًا برمجيًا للغاية. 643 00:29:35,910 --> 00:29:37,230 يمكنكم القيام بذلك باستخدام وحدات ماكرو وما شابه ذلك. 644 00:29:37,230 --> 00:29:38,396 وسنقوم بذلك باستخدام تعليمة برمجية. 645 00:29:38,396 --> 00:29:41,160 ولكن باستخدام SQL، يجب أن تتخذوا بعض القرارات أولاً. 646 00:29:41,160 --> 00:29:45,229 تدعم SQL بضعة أنواع مختلفة من البيانات، على الأقل، في أحد أشكالها. 647 00:29:45,229 --> 00:29:47,520 إذن يتضح أنه توجد منافسة كبيرة هناك. 648 00:29:47,520 --> 00:29:49,890 SQL هي لغة عامة. 649 00:29:49,890 --> 00:29:52,260 ولكن قد توصّلت شركات مختلفة ومجموعات غير ربحية مختلفة 650 00:29:52,260 --> 00:29:54,090 إلى لهجاتهم الخاصة. 651 00:29:54,090 --> 00:29:56,340 لذا تشبه إلى حد كبير ما قد نتحدّث عنه نحن البشر-- 652 00:29:56,340 --> 00:29:57,757 قد تتحدث مجموعات منا باللغة الإسبانية. 653 00:29:57,757 --> 00:30:00,381 حسنًا، هناك اختلافات متنوعة باللغة الأسبانية، بخلاف 654 00:30:00,381 --> 00:30:01,830 العديد، والعديد، والعديد من اللغات الأخرى. 655 00:30:01,830 --> 00:30:03,621 وهكذا بالمثل، في عالم البرمجة، 656 00:30:03,621 --> 00:30:06,038 نظرًا لوجود مجموعة فرعية شائعة من الكلمات في لغة إلى حد ما. 657 00:30:06,038 --> 00:30:08,079 ولكن بعد ذلك ربما قد قامت شركات مختلفة وأشخاص 658 00:30:08,079 --> 00:30:11,220 مختلفون بإضافة ميزاتهم الخاصة وطرحها فقط لأنهم يعتقدون 659 00:30:11,220 --> 00:30:13,170 أن ذلك أفضل لحالات استخدامهم. 660 00:30:13,170 --> 00:30:19,080 إذن في SQLite، وهي تقنية قاعدة البيانات التي سنستخدمها في CS50 IDE، 661 00:30:19,080 --> 00:30:21,930 ويستخدم Android هذه، وهي شائعة للغاية في سياقات أخرى 662 00:30:21,930 --> 00:30:23,520 أيضًا، IOS كذلك-- 663 00:30:23,520 --> 00:30:25,200 إنها تحتوي فقط على بعض الأنواع من البيانات. 664 00:30:25,200 --> 00:30:29,100 البيانات الثنائية الكبيرة، من كل الأشياء، العدد الصحيح، والرقمي، والحقيقي، والنص. 665 00:30:29,100 --> 00:30:30,100 الآن ماذا يعني ذلك؟ 666 00:30:30,100 --> 00:30:33,058 حسنًا، يتضح أنه يعني أشياء مختلفة باستخدام قواعد بيانات مختلفة. 667 00:30:33,058 --> 00:30:36,080 في قاعدة بيانات شائعة أخرى، تُسمى Postgres أو PostgreSQL. 668 00:30:36,080 --> 00:30:38,782 هذه لغة شائعة للغاية لمواقع الويب عالية الأداء. 669 00:30:38,782 --> 00:30:40,740 إذن إذا كنتم تحاولون إنشاء أعمال تجارية، فأنتم 670 00:30:40,740 --> 00:30:43,573 تحاولون إنشاء تطبيق يتم استخدامه من قِبل الجميع في الحرم الجامعي، بشكل عام، 671 00:30:43,573 --> 00:30:46,800 ستستخدمون تقنية أفضل من SQLite، وهي، حسب التعريف، 672 00:30:46,800 --> 00:30:47,580 خفيفة الوزن. 673 00:30:47,580 --> 00:30:49,230 وستفعلون شيئًا مثل Postgres. 674 00:30:49,230 --> 00:30:52,650 وهكذا سنقدم لكم هاتين اللهجتين على طول الطريق 675 00:30:52,650 --> 00:30:55,440 لأنه تتيح كل واحدة منها لنا القيام بأشياء مختلفة 676 00:30:55,440 --> 00:30:57,340 بدرجة دقة مختلفة. 677 00:30:57,340 --> 00:31:01,290 إذن في SQL، دعونا نزعم، حتى على الرغم من أنه تبسيط، 678 00:31:01,290 --> 00:31:02,910 أن هناك على الأقل هذه الأنواع من البيانات. 679 00:31:02,910 --> 00:31:06,090 عند تحديد نوع البيانات المراد تخزينه في جدول قاعدة بياناتكم، 680 00:31:06,090 --> 00:31:09,655 يجب أن تحددوا، ليس فقط ما يُسمى، على سبيل المثال بالمعرّف، والاسم، والبريد الإلكتروني، 681 00:31:09,655 --> 00:31:10,155 والسكن. 682 00:31:10,155 --> 00:31:12,474 يجب أن تحددوا أي نوع من البيانات هو. 683 00:31:12,474 --> 00:31:13,890 إذن لدينا دائرة مفرغة إلى حد ما. 684 00:31:13,890 --> 00:31:17,124 لأن آخر مرة فعلنا فيها ذلك كانت في أي لغة؟ 685 00:31:17,124 --> 00:31:17,930 C. 686 00:31:17,930 --> 00:31:20,710 إذن تفعلون ذلك في SQL أيضًا، ولكنها لا تتصيد الأخطاء. 687 00:31:20,710 --> 00:31:22,490 إنها ستحسّن الأداء في الواقع. 688 00:31:22,490 --> 00:31:25,180 إذن هذه لمساعدتكم في الحصول على تلك البيانات بشكل أكثر كفاءة. 689 00:31:25,180 --> 00:31:28,280 لأنه كلما عرف الخادم، وقاعدة البيانات، بياناتكم، 690 00:31:28,280 --> 00:31:30,460 كان بإمكانهما العثور عليها بسرعة وبشكل أساسي. 691 00:31:30,460 --> 00:31:32,680 إذن في عالم قواعد البيانات، يجب 692 00:31:32,680 --> 00:31:35,500 أن تقرروا بشكل عام، ليس فقط لتخزين عدد صحيح، ولكن 693 00:31:35,500 --> 00:31:38,290 int صغير من العدد الصحيح، أو int كبير. 694 00:31:38,290 --> 00:31:42,700 وبشكل عام، على الأقل في معظم قواعد البيانات، قد تكون هذه وحدتي بايت. 695 00:31:42,700 --> 00:31:43,870 قد تكون هذه 4 وحدات بايت. 696 00:31:43,870 --> 00:31:45,220 قد تكون هذه 8 وحدات بايت. 697 00:31:45,220 --> 00:31:47,020 إذن دعونا نثير إعجاب الحضور هنا. 698 00:31:47,020 --> 00:31:50,110 إذا كان لديكم عدد صحيح قدره 32 وحدة بت، أو 4 وحدات بايت، 699 00:31:50,110 --> 00:31:54,600 ما هو أكبر عدد صحيح يمكنكم تخزينه في قاعدة بياناتكم؟ 700 00:31:54,600 --> 00:31:56,960 (WHISPERS) 4 مليار. 701 00:31:56,960 --> 00:31:58,130 شخص واحد من فضلكم، مثير للإعجاب. 702 00:31:58,130 --> 00:31:59,200 الجمهور: 4 مليار. 703 00:31:59,200 --> 00:32:01,200 ديفيد ج. مالان: 4 مليار صحيح تمامًا. 704 00:32:01,200 --> 00:32:04,430 وقد تكون 4 مليار من القيم الإيجابية، أو ربما 2 مليار فقط 705 00:32:04,430 --> 00:32:08,220 إذا كنتم تريدون أيضًا أن يكون لديكم 2 مليار أو ما يقارب ذلك من الأرقام السلبية أيضًا. 706 00:32:08,220 --> 00:32:13,520 يستخدم int الكبير 64 وحدة بت، وهذا يُعد كبيرًا، كبيرًا جدًا فقط. 707 00:32:13,520 --> 00:32:15,420 وint ضئيل أو int صغير بدلاً من ذلك-- 708 00:32:15,420 --> 00:32:18,610 يوجد أيضًا int صغير في بعض اللهجات-- int صغير هو وحدتا بايت فقط، 709 00:32:18,610 --> 00:32:24,700 وهو يحسب في الواقع شيئًا كبيرًا كـ 65535، كما أشرتُ في وقت سابق. 710 00:32:24,700 --> 00:32:25,980 إذن تحتاجون إلى اتخاذ القرار فقط. 711 00:32:25,980 --> 00:32:29,340 الآن، لماذا ستختارون واحد أو الآخر، بينما يمكنكم فقط استخدام int كبير 712 00:32:29,340 --> 00:32:31,570 وتخزين أرقام صغيرة وأرقام كبيرة على حد سواء؟ 713 00:32:31,570 --> 00:32:35,190 حسنًا، لماذا قد لا ترغبون ببساطة في جعل جميع قيم الأعداد الصحيحة 714 00:32:35,190 --> 00:32:37,050 في قاعدة بياناتكم أعدادًا صحيحة كبيرة. 715 00:32:37,050 --> 00:32:39,660 إنه أمر بسيط-- أعطني مساحة بالقدر الذي أريده. 716 00:32:39,660 --> 00:32:41,420 الجمهور: ستستخدم الذاكرة. 717 00:32:41,420 --> 00:32:41,550 ديفيد ج. مالان: أجل. 718 00:32:41,550 --> 00:32:43,590 أنتم تستخدمون الذاكرة دون داعٍ، أليس كذلك؟ 719 00:32:43,590 --> 00:32:45,650 لماذا تستخدمون الذاكرة بقدر أكبر مما تحتاجون إليه؟ 720 00:32:45,650 --> 00:32:48,220 الآن، بشكل مثير للجدل-- يا إلهي، الذاكرة رخيصة جدًا هذه الأيام. 721 00:32:48,220 --> 00:32:49,930 أصبحت أجهزة الكمبيوتر أكبر وأسرع. 722 00:32:49,930 --> 00:32:52,000 لذا في بعض السياقات، ليست مشكلة كبيرة. 723 00:32:52,000 --> 00:32:56,130 ولكن إذا كانت لديكم بيانات كثيرة، وكل صف من صفوفكم في قاعدة بيانات 724 00:32:56,130 --> 00:32:59,950 أكبر بمقدار وحدتي بايت مما هو ضروري، ولديكم مليون واحد من الصفوف، 725 00:32:59,950 --> 00:33:03,910 فهذه أعداد هائلة من وحدات البايت التي تهدرونها 726 00:33:03,910 --> 00:33:04,410 وتلقونها. 727 00:33:04,410 --> 00:33:07,284 لذلك يجب أن تفكروا قليلاً في أنواع البيانات هذه. 728 00:33:07,284 --> 00:33:09,000 بالطبع، أنتم لا تريدون أن تكون صغيرة للغاية، 729 00:33:09,000 --> 00:33:11,940 لأنكم، إذا استخدمتم int صغير أو ربما عددًا صحيحًا، 730 00:33:11,940 --> 00:33:17,160 ولكن إذا كان العمل يسير بشكل جيد جدًا لدرجة أن لديكم أكثر من 4 مليار مستخدم أو 4 مليار من الصفوف 731 00:33:17,160 --> 00:33:21,330 أو 4 مليار من قيم foo وbar وbaze التي تم بيعها، 732 00:33:21,330 --> 00:33:24,520 وهذا بالتأكيد الذي يحدث ببيانات Google وFacebook في العالم، 733 00:33:24,520 --> 00:33:30,450 من الأفضل أن تبدأوا باستخدام 64 وحدة بت لتمثيل قيم فريدة بدلاً من 734 00:33:30,450 --> 00:33:30,990 32 فقط. 735 00:33:30,990 --> 00:33:32,280 لأنه في نهاية المطاف، ستنفد منكم. 736 00:33:32,280 --> 00:33:32,946 حسنًا، ماذا أيضًا؟ 737 00:33:32,946 --> 00:33:36,757 بالإضافة إلى القيم الصحيحة في SQL، قد ترغبون في استخدام قيم كسرية حقيقية. 738 00:33:36,757 --> 00:33:39,090 هذه أرقام حقيقية تحتوي على نقاط عشرية. 739 00:33:39,090 --> 00:33:41,280 هذا تمامًا مثل لغة C. إنها تُسمى بشيء مختلف قليلاً. 740 00:33:41,280 --> 00:33:43,750 وبشكل مزعج، تستخدم كلمتين في هذه الحالة. 741 00:33:43,750 --> 00:33:46,920 ولكن الرقم الحقيقي هو قيمة قدرها 32 وحدة بت وهي قيمة كسرية 742 00:33:46,920 --> 00:33:49,430 حقيقية، مثل float في C، والدقة المزدوجة 743 00:33:49,430 --> 00:33:51,540 مثل تلك المزدوجة في لغة C، وهي 64 وحدة بت. 744 00:33:51,540 --> 00:33:54,480 ويتيح هذا لكم فقط الحصول على تحكم دقيق أكثر 745 00:33:54,480 --> 00:33:56,220 في النقطة العشرية كما رأينا. 746 00:33:56,220 --> 00:33:59,130 لأنه بالطبع، لا يمكنكم تمثيل الأرقام بشكل دقيق 747 00:33:59,130 --> 00:34:02,640 بسبب عدم الدقة، كما رأينا في Python وC. 748 00:34:02,640 --> 00:34:05,970 رقمي هي كلمة شاملة لمجموعة من الأشياء المتعلقة بالأرقام 749 00:34:05,970 --> 00:34:08,460 وهي ليست أعدادًا صحيحة أو حقيقية بالضرورة. 750 00:34:08,460 --> 00:34:11,429 قيمة صحيحة أو خاطئة، ومنطقية، التواريخ إذا كنتم تريدون 751 00:34:11,429 --> 00:34:14,610 تخزينها حرفيًا، مثل، سنة، سنة، سنة، سنة، شرطة، شهر، شهر، 752 00:34:14,610 --> 00:34:17,634 شرطة، يوم، يوم بتنسيق الكمبيوتر القياسي، 753 00:34:17,634 --> 00:34:19,800 على الرغم من اختلاف الثقافات البشرية في كيفية كتابة ذلك. 754 00:34:19,800 --> 00:34:23,190 التاريخ والوقت إذا كنتم تريدون أن يكون لديكم تاريخ ووقت بعده-- 755 00:34:23,190 --> 00:34:26,070 كلمة رقمي في الواقع هي حل للمشكلة. 756 00:34:26,070 --> 00:34:29,010 يتضح أنه، في النهاية، بعد كل هذا الوقت، 757 00:34:29,010 --> 00:34:33,210 لدينا آلية مدمجة لتخزين الأرقام بدقة. 758 00:34:33,210 --> 00:34:35,969 وهذا توقيته مثالي لأنه، في CS50 Finance، عندما 759 00:34:35,969 --> 00:34:39,239 تتعاملون مع النقود، إذا لم تقوموا عن طريق الخطأ 760 00:34:39,239 --> 00:34:43,170 بتقريب مقدار الأموال التي يملكها شخص ما إما أقل أو 761 00:34:43,170 --> 00:34:43,949 أكثر قليلاً. 762 00:34:43,949 --> 00:34:47,639 ربما يوجد منكم مَن لديه تجمع على وجه الخصوص، لأنه، بالعودة إلى بعض الأفلام في الماضي، 763 00:34:47,639 --> 00:34:50,460 إذا رأيتم فيلم سوبرمان 3، 764 00:34:50,460 --> 00:34:53,730 فهذه هي الكيفية التي تم صنع بعض المال بها عن طريق إزالة السنتات 765 00:34:53,730 --> 00:34:56,760 من أنظمة الكمبيوتر، وبشكل معتدل أكثر، Office Space. 766 00:34:56,760 --> 00:35:00,960 قام Office Space بذلك أيضًا-- خدعة كبيرة في محاولة تقريب هذه السنتات. 767 00:35:00,960 --> 00:35:04,650 حسنًا، إذا كنتم تستخدمون التقنية واللغة الصحيحتين، باستخدام SQL، 768 00:35:04,650 --> 00:35:08,460 يمكنكم بالفعل تحديد نوع بيانات رقمي، يشبه قيمة كسرية حقيقية، 769 00:35:08,460 --> 00:35:11,940 ولكنكم تحددون، بشكل أساسي، العدد الإجمالي للأرقام 770 00:35:11,940 --> 00:35:15,790 التي تريدون معالجتها والعدد الذي يجب أن يكون بعد النقطة العشرية منها. 771 00:35:15,790 --> 00:35:17,850 لذا من الشائع في أسواق الأسهم المالية استخدام 772 00:35:17,850 --> 00:35:19,480 أربع نقاط عشرية من الدقة. 773 00:35:19,480 --> 00:35:22,260 لذا ليست فقط السنتات إلى مكان العشرات والمئات، 774 00:35:22,260 --> 00:35:24,570 ولكن إلى مكان الآلاف والعشرة آلاف، 775 00:35:24,570 --> 00:35:28,126 يمكنكم الآن تحديد ذلك باستخدام قيمة أربعة من الدقة. 776 00:35:28,126 --> 00:35:30,000 ولا داعي للقلق بشأن أخطاء هذا التقريب 777 00:35:30,000 --> 00:35:32,370 التي تحدثنا عنها من قبل. 778 00:35:32,370 --> 00:35:34,230 الطوابع الزمنية والوقت-- فقط كم من الوقت 779 00:35:34,230 --> 00:35:38,130 قد مر منذ التاريخ والتاريخ والوقت يتوفران لكم أيضًا في SQL. 780 00:35:38,130 --> 00:35:40,920 ثم أخيرًا هنا، القيم النصية-- 781 00:35:40,920 --> 00:35:43,260 يتضح أن لديكم خيار القيم عندما يتعلق الأمر 782 00:35:43,260 --> 00:35:46,690 بتحديد عدد الأحرف التي تستخدمونها لتخزين بياناتكم. 783 00:35:46,690 --> 00:35:49,780 يمكنكم استخدام char، كما هو الحال في C باستخدام مصفوفة، 784 00:35:49,780 --> 00:35:53,170 يجب أن تقرروا مسبقًا لسلسلة كم عدد وحدات البايت التي ستستخدمونها. 785 00:35:53,170 --> 00:35:55,380 وإذا قلتم char 8، فستحصلون على 8 وحدات بايت. 786 00:35:55,380 --> 00:35:59,160 وإذا كان الاسم هو مالان، م-ا-ل-ا-ن، فأنتم تهدرون 3 وحدات بايت، 787 00:35:59,160 --> 00:36:01,940 أو إذا قمنا بإنهائها، 2 من وحدات البايت تلك. 788 00:36:01,940 --> 00:36:05,490 لكن تقدم SQL حلاً أعطته لنا Python أيضًا. 789 00:36:05,490 --> 00:36:09,300 Varchar كما يوحي الاسم-- يتيح لكم عدد متغير من الأحرف 790 00:36:09,300 --> 00:36:11,410 تحديد الحد الأعلى فقط. 791 00:36:11,410 --> 00:36:14,550 لذا إذا كنتم تعرفون أنه سيُطلق على أحد الأعمدة الخاصة بكم الاسم. 792 00:36:14,550 --> 00:36:17,490 وقد يكون اسم شخص ما هو م-ا-ل-ا-ن-- على سبيل المثال خمسة أحرف، 793 00:36:17,490 --> 00:36:21,060 أو ربما أكثر بالتأكيد بالنسبة للأشخاص الذين لديهم ألقاب أطول وهي الأسماء الأولى، 794 00:36:21,060 --> 00:36:23,940 يمكنكم قول varchar 100. 795 00:36:23,940 --> 00:36:26,170 وهذا هو الحد الأعلى لمقدار طوله. 796 00:36:26,170 --> 00:36:27,570 لكن ستكون قاعدة البيانات ذكية. 797 00:36:27,570 --> 00:36:30,240 إذا كنتم تحتاجون فقط إلى خمسة أحرف أو 5 وحدات بايت، 798 00:36:30,240 --> 00:36:32,790 فلن تهدر 95 حرفًا آخر من أجلكم. 799 00:36:32,790 --> 00:36:35,080 وسيتحسن ذلك من أجلكم. 800 00:36:35,080 --> 00:36:38,220 ومن ثم النص في النهاية، إذا أردتم تخزين عشرات الآلاف، 801 00:36:38,220 --> 00:36:41,610 مثل فقرات أو صفحات النص، فهذه أكبر من varchar 802 00:36:41,610 --> 00:36:44,310 حيث لا تريدون بالضرورة حدًا أعلى تم تحديده بصورة جيدة. 803 00:36:44,310 --> 00:36:46,350 تريدون فقط جزءًا جيدًا من الذاكرة. 804 00:36:46,350 --> 00:36:47,860 ولكن توجد آثار هنا. 805 00:36:47,860 --> 00:36:52,380 وبسرعة فقط، يبدو أن char وvarchar ليستا تكميليتين. 806 00:36:52,380 --> 00:36:54,185 يبدو أن char فقط غير ضرورية. 807 00:36:54,185 --> 00:36:56,210 لماذا تضعوا أنفسكم في موقف حرج وتقولوا 808 00:36:56,210 --> 00:36:58,850 أعطني 8 وحدات بايت فقط بينما يمكنكم فقط قول، أوه، أعطني 809 00:36:58,850 --> 00:37:02,550 ما يصل إلى 100 وحدة بت، وهل يمكنك، كخادم قاعدة البيانات، 810 00:37:02,550 --> 00:37:05,330 اكتشاف عدد وحدات البايت التي استخدمها بالفعل؟ 811 00:37:05,330 --> 00:37:07,040 لمَ يوجد هذان النوعان من البيانات؟ 812 00:37:07,040 --> 00:37:07,190 أجل؟ 813 00:37:07,190 --> 00:37:07,660 الجمهور: الوقت. 814 00:37:07,660 --> 00:37:08,640 ديفيد ج. مالان: الوقت. 815 00:37:08,640 --> 00:37:10,796 الجمهور: سيكون أطول لتشغيله. 816 00:37:10,796 --> 00:37:11,670 ديفيد ج. مالان: أجل. 817 00:37:11,670 --> 00:37:12,860 لذا الوقت دقيق. 818 00:37:12,860 --> 00:37:16,370 قد يستغرق استخدام نوع بيانات واحد أو آخر وقتًا أطول. 819 00:37:16,370 --> 00:37:17,900 كيف يمكن أن يحدث هذا؟ 820 00:37:17,900 --> 00:37:21,020 حسنًا، إذا كنت قد حصلتم على قيمة مثل char حيث تحددون 821 00:37:21,020 --> 00:37:23,660 عددًا دقيقًا من الأحرف مثل 8. 822 00:37:23,660 --> 00:37:26,840 إذا فكرتم بشأن الأعمدة في جداول بيانات Google وExcel، 823 00:37:26,840 --> 00:37:30,930 فكل واحد من هذه الأعمدة، تلك الخلايا هي بالضبط نفس العرض، أليس كذلك؟ 824 00:37:30,930 --> 00:37:33,590 إنها 8 وحدات بايت، 8 وحدات بايت مجددًا. 825 00:37:33,590 --> 00:37:37,520 وبمجرد حصولك على تعويضات ثابتة تمامًا-- 826 00:37:37,520 --> 00:37:42,770 هذا هو البايت 0، وهذا هو البايت 8، وهذا هو البايت 16، وهذا هو البايت 24، وهذا هو البايت 32، 827 00:37:42,770 --> 00:37:45,050 وما إلى ذلك، يمكنكم إعادة تقديم القدرة 828 00:37:45,050 --> 00:37:46,800 التي كانت لدينا في C باستخدام المصفوفات. 829 00:37:46,800 --> 00:37:50,400 يمكنكم الوصول بشكل عشوائي لتقوموا بعمليات حسابية بسيطة جدًا- الضرب، 830 00:37:50,400 --> 00:37:54,680 والجمع، والطرح، يمكنكم الانتقال إلى أي عنصر في عمود 831 00:37:54,680 --> 00:37:58,190 إذا كان يستخدم نفس عدد وحدات البايت لكل خلية. 832 00:37:58,190 --> 00:38:04,329 ولكن باستخدام varchar، إذا احتجتم إلى خلايا ضيقة صغيرة وخلايا واسعة، 833 00:38:04,329 --> 00:38:06,620 فستحصلون على ما يُطلق عليه مصفوفة غير متناسقة حيث 834 00:38:06,620 --> 00:38:08,670 أحد جانبيها، الجانب الأيسر، إذا جاز التعبير، 835 00:38:08,670 --> 00:38:10,295 سوف يكون صلبًا ومستقيمًا جدًا. 836 00:38:10,295 --> 00:38:14,480 لكن الجانب الآخر يختلف النوع حسب طول الكلمة في هذا العمود. 837 00:38:14,480 --> 00:38:17,870 ولوجهة نظركة بشأن الوقت، سيستغرق جهاز الكمبيوتر وقتًا أكبر 838 00:38:17,870 --> 00:38:19,730 للبحث في حقل varchar. 839 00:38:19,730 --> 00:38:22,070 لأنه لا يمكن فقط الانتقال إلى العنصر الثالث. 840 00:38:22,070 --> 00:38:24,005 يجب أن تبحثوا عنها جميعًا. 841 00:38:24,005 --> 00:38:26,630 ولكن لحسن الحظ، في نهاية اليوم، لا تقوم قواعد البيانات بذلك. 842 00:38:26,630 --> 00:38:28,421 انها لا تتحول فقط إلى البحث الخطي. 843 00:38:28,421 --> 00:38:31,520 تتحول ملفات CSV، لأغراضنا، إلى البحث الخطي. 844 00:38:31,520 --> 00:38:35,420 إن السحر والملكية الفكرية والخلطة السرية، إذا جاز التعبير، 845 00:38:35,420 --> 00:38:36,620 التي تنتقل إلى قواعد البيانات-- 846 00:38:36,620 --> 00:38:40,520 خادم Oracle SQL، وMicrosoft Access، وPostgres، وMySQL، وSQLite، 847 00:38:40,520 --> 00:38:45,020 هي التي قررها علماء الكمبيوتر الأذكياء حقًا لتنفيذ خوارزميات 848 00:38:45,020 --> 00:38:47,660 وبنيات بيانات رائعة، غالباً قائمة على الشجرة-- 849 00:38:47,660 --> 00:38:50,060 إذا كنتم تتذكرون مناقشتنا بشأن الأشجار الثنائية 850 00:38:50,060 --> 00:38:54,590 أو المحاولات على جداول علامات التجزئة وبنيات البيانات الرائعة تلك-- لقد 851 00:38:54,590 --> 00:38:57,170 أعدّوا هذه الأنواع من بنيات البيانات والتصميمات 852 00:38:57,170 --> 00:38:58,850 في برامج قواعد البيانات الخاصة بهم. 853 00:38:58,850 --> 00:39:01,680 لقد جعلوها متاحة مجانًا أو متاحة تجاريًا. 854 00:39:01,680 --> 00:39:04,610 وهكذا أصبح لدينا الآن فقط تجريد يُسمى قاعدة بيانات 855 00:39:04,610 --> 00:39:07,670 يمكننا تخزين البيانات وقراءتها وتحديثها وكتابتها، 856 00:39:07,670 --> 00:39:10,430 وتغييرها بسرعة فقط دون الحاجة إلى تنفيذ كل هذه الأشياء 857 00:39:10,430 --> 00:39:12,899 على مستوى منخفض بأنفسنا. 858 00:39:12,899 --> 00:39:15,440 ولذا هذا ما ستقدمه لنا قاعدة البيانات في النهاية. 859 00:39:15,440 --> 00:39:18,690 ولكن يجب أن نمتلك حق الوصول إلى قاعدة بيانات للقيام بذلك. 860 00:39:18,690 --> 00:39:21,260 ونحتاج إلى أن نقرر أولاً مساعدة 861 00:39:21,260 --> 00:39:27,350 قاعدة البيانات من خلال إخبارها بما يجب تخزينه وكيفية تخزينه كنوع. 862 00:39:27,350 --> 00:39:28,850 لذا لمَ لا نفعل هذا؟ 863 00:39:28,850 --> 00:39:33,060 دعوني أمضي قدمًا وأقوم بذلك بالضبط باستخدام بضعة أمثلة. 864 00:39:33,060 --> 00:39:36,220 دعوني أمضي قدمًا وأفتح CS50 IDE مجددًا، 865 00:39:36,220 --> 00:39:38,210 بيئة البرمجة القائمة على الويب الخاصة بنا. 866 00:39:38,210 --> 00:39:42,152 ودعوني أنتقل إلى النافذة الطرفية. 867 00:39:42,152 --> 00:39:45,110 لذلك بالنسبة لمَن لم يعتادوا الأمر، فإن النافذة الطرفية هي فقط تلك النافذة بالأبيض والأسود 868 00:39:45,110 --> 00:39:47,722 أو هذه النافذة بالأبيض والأزرق حيث يمكنكم كتابة الأوامر. 869 00:39:47,722 --> 00:39:50,180 بدلًا من الإشارة والنقر والنقر المزدوج فوق أشياء، 870 00:39:50,180 --> 00:39:52,179 يمكنكم القيام فقط بالأشياء نصيًا في هذه النافذة. 871 00:39:52,179 --> 00:39:54,710 ويتضح أنه في عالم SQLite، 872 00:39:54,710 --> 00:39:58,850 يمكننا بالفعل استخدام أمر يُسمى SQLite3، 873 00:39:58,850 --> 00:40:01,050 والذي يتيح لنا إنشاء قاعدة بيانات. 874 00:40:01,050 --> 00:40:03,710 لذلك في عالمنا البشري، بالنسبة إلى ملفات CSV، لاحظتم كيف يمكننا، في تعليمة برمجية، 875 00:40:03,710 --> 00:40:05,084 فقط إنشاء صفوف وأعمدة. 876 00:40:05,084 --> 00:40:07,286 يمكنكم كتابتها حرفيًا في مربع النص. 877 00:40:07,286 --> 00:40:12,330 SQLite هي تقنية قاعدة بيانات تستخدم التنسيق الثنائي، الأصفار والواحدات. 878 00:40:12,330 --> 00:40:15,140 وبالتالي يجب أن تقوموا بالفعل بتخزين بياناتكم بشكل مختلف 879 00:40:15,140 --> 00:40:16,140 باستخدام برنامج. 880 00:40:16,140 --> 00:40:22,070 لذلك إذا كنتم تريدون إنشاء ملف يُسمى، على سبيل المثال، froshims.db، 881 00:40:22,070 --> 00:40:25,070 يمكنني أن أقول حرفيًا SQLite ثلاثة froshims.db، 882 00:40:25,070 --> 00:40:26,450 ومن ثم أنا في هذا البرنامج. 883 00:40:26,450 --> 00:40:29,872 هذا برنامج قائم على نص يمكنني من خلاله إنشاء الصفوف والأعمدة. 884 00:40:29,872 --> 00:40:32,580 وهذا، من خلال المصمم سيكون غامضًا قليلاً للحظة. 885 00:40:32,580 --> 00:40:34,080 سيبدو هذا مشفرًا قليلاً. 886 00:40:34,080 --> 00:40:37,140 ولكن إذا أردتُ المضي قدمًا وإنشاء جدول، مثل جدول البيانات هنا، 887 00:40:37,140 --> 00:40:39,350 سأكتب حرفيًا نوع CREATE TABLE. 888 00:40:39,350 --> 00:40:41,720 سأستدعي المسجَّلين هذا تمامًا كما في الأسبوع الماضي 889 00:40:41,720 --> 00:40:43,490 عندما كنا ننظر في أمثلة froshims. 890 00:40:43,490 --> 00:40:45,239 ويحتوي برنامج الرياضة الداخلي للطلاب الجدد 891 00:40:45,239 --> 00:40:47,210 على طلاب يقومون بالتسجيل للرياضية. 892 00:40:47,210 --> 00:40:49,190 ﻟذا سيكون لدي ﺟدول المسجَّلين هنا. 893 00:40:49,190 --> 00:40:51,770 سأمضي قدمًا الآن وأحدّد أنني أريد 894 00:40:51,770 --> 00:40:56,930 بضعة أعمدة لجدول قاعدة البيانات هذا، أحد الأعمدة أريد أن أُطلق عليه المعرّف، 895 00:40:56,930 --> 00:40:59,990 وعمود ثاني أريد أن أسميه اسمًا، وثالث أريد أن أسميه سكن. 896 00:40:59,990 --> 00:41:01,386 لذا سأحتفظ- عذرًا. 897 00:41:01,386 --> 00:41:02,510 لم أقصد الضغط على Enter. 898 00:41:02,510 --> 00:41:03,770 دعوني فقط أنظف هذا. 899 00:41:03,770 --> 00:41:07,130 لذا الآن لدي ثلاثة أعمدة والمعرّف، والاسم، والسكن. 900 00:41:07,130 --> 00:41:09,170 وإذا كنتُ سأضغط على Enter، من الناحية النظرية، 901 00:41:09,170 --> 00:41:10,350 فيجب أن يتم إنشاء قاعدة بيانات. 902 00:41:10,350 --> 00:41:13,058 لن تكون بيانية مثل جداول بيانات Google أو Excel، 903 00:41:13,058 --> 00:41:16,850 ولكنها ستكون موجودة في IDE في ملف يُسمى froshims.db. 904 00:41:16,850 --> 00:41:18,170 ولكن لا يمكنني فقط الضغط على Enter بعد. 905 00:41:18,170 --> 00:41:20,247 لأنه يجب أن أخبر قاعدة البيانات أكثر قليلاً. 906 00:41:20,247 --> 00:41:21,830 أنا أحتاج إلى إخبارها بذلك، أتعلمون ماذا؟ 907 00:41:21,830 --> 00:41:24,560 من المحتمل أنه يجب أن تكون قيمة المعرّف الخاص بي عددًا صحيحًا. 908 00:41:24,560 --> 00:41:25,310 أتعلمون ما الأمر؟ 909 00:41:25,310 --> 00:41:31,280 من المحتمل أنه يجب أن يكون اسمي char، أو varchar؟ 910 00:41:31,280 --> 00:41:33,921 ما الذي يجب أن يتم تخزين اسم الطالب عليه؟ 911 00:41:33,921 --> 00:41:34,670 الجمهور: varchar. 912 00:41:34,670 --> 00:41:36,050 ديفيد ج. مالان: Varchar، حسنًا؟ 913 00:41:36,050 --> 00:41:38,050 إذن varchar لأنها ستختلف، أليس كذلك؟ 914 00:41:38,050 --> 00:41:39,400 إذا أمكنكم التفكير في مجموعات من أصدقائكم، 915 00:41:39,400 --> 00:41:41,185 فربما تكون لديهم أسماء قصيرة أو أسماء طويلة. 916 00:41:41,185 --> 00:41:42,310 حسنًا، ما هو الحد الأعلى؟ 917 00:41:42,310 --> 00:41:46,810 ما هو مدى طول أطول اسم من أسماء أصدقائكم؟ 918 00:41:46,810 --> 00:41:47,630 الجمهور: 50. 919 00:41:47,630 --> 00:41:48,510 ديفيد ج. مالان: 16؟ 920 00:41:48,510 --> 00:41:49,390 حسنًا. 921 00:41:49,390 --> 00:41:54,218 هل يوجد أي أحد هنا اسمه، الأول والأخير، أطول من 16؟ 922 00:41:54,218 --> 00:41:55,542 الجمهور: إنه 50، معذرة. 923 00:41:55,542 --> 00:41:56,500 ديفيد ج. مالان: أوه، 50. 924 00:41:56,500 --> 00:41:56,999 معذرة. 925 00:41:56,999 --> 00:41:58,355 اعتقدتُ، أنني سمعتُ 16. 926 00:41:58,355 --> 00:42:00,730 لأنكم لن تتمكّنول من التسجيل في froshims 927 00:42:00,730 --> 00:42:02,479 لأنه سيتم اقتطاع قاعدة البيانات. 928 00:42:02,479 --> 00:42:05,830 وكملاحظة جانبية، إذا انتقلتم من قبل إلى موقع ويب وحاولتم الكتابة في حقل 929 00:42:05,830 --> 00:42:08,740 شكل وتوقفت لوحة المفاتيح عن العمل 930 00:42:08,740 --> 00:42:12,100 أو قمتم بكتابة كلمة طويلة أو فقرة، ومن ثم ضغطتم على Enter، 931 00:42:12,100 --> 00:42:15,550 فاختفى بعض مما كتبتم، حسنًا، لأن قاعدة البيانات على الأرجح 932 00:42:15,550 --> 00:42:17,110 يمكنها تخزين العديد من وحدات البايت فقط. 933 00:42:17,110 --> 00:42:20,014 وبصراحة، هذا يحدث غالبًا في منتديات خدمة العملاء، أليس كذلك؟ 934 00:42:20,014 --> 00:42:22,930 لا يريدون حقًا أن تقوموا بالإسهاب مع فريق دعم 935 00:42:22,930 --> 00:42:23,430 العملاء. 936 00:42:23,430 --> 00:42:26,020 سيقومون بإخفاء طول الحقل الذي تكتبون فيه. 937 00:42:26,020 --> 00:42:27,860 وسيفعلون ذلك أيضًا على قاعدة البيانات، 938 00:42:27,860 --> 00:42:29,710 ولكن من المحتمل أيضًا أنهم لأسباب شخصية عملية، 939 00:42:29,710 --> 00:42:32,418 لا يريدون قراءة شكوى كبيرة بهذا الحجم كذلك. 940 00:42:32,418 --> 00:42:36,208 إذن 50--هل يوجد أي شخص اسمه أطول من 50 حرفًا؟ 941 00:42:36,208 --> 00:42:37,939 الجمهور: [INAUDIBLE] 942 00:42:37,939 --> 00:42:39,480 ديفيد ج. مالان: نعم، ليست أسماء عديدة. 943 00:42:39,480 --> 00:42:40,340 ولكن أتعلمون ماذا؟ 944 00:42:40,340 --> 00:42:42,230 لدينا تقنية للإجابة عن ذلك. 945 00:42:42,230 --> 00:42:46,110 أطول اسم في العالم-- 946 00:42:46,110 --> 00:42:46,940 وهو ذلك الرجل. 947 00:42:46,940 --> 00:42:49,400 من المحتمل أن تكون موسوعة غينيس للأرقام القياسية محقة. 948 00:42:49,400 --> 00:42:56,210 إذن اسمه هو بارنابي مارمادوك ألويسيوس بنغي كوبويب دارتانيان إغبرت 949 00:42:56,210 --> 00:43:02,420 فيلكس غاسبر هامبرت إغناطيوس غايدن كاسبر ليروي ماكسيمليان نيدي أوبياغلو 950 00:43:02,420 --> 00:43:08,420 بيبين كيليام روزنكرانز سيكستون تيدي يوبوود فيفاتما وايلاند آزيلون ياردلي 951 00:43:08,420 --> 00:43:10,400 زكاري أوسنسكاي. 952 00:43:10,400 --> 00:43:13,720 ومن الواضح أنه يُسمى نيك أيضًا. 953 00:43:13,720 --> 00:43:14,930 لكن لا بأس. 954 00:43:14,930 --> 00:43:16,550 دعوني أمضي قدمًا وأظلل ذلك. 955 00:43:16,550 --> 00:43:18,530 ويمكنني عدّ ذلك يدويًا. 956 00:43:18,530 --> 00:43:22,112 ولكنني متأكد من قيام شخص ما بإنشاء موقع ويب لعدّ الأحرف في سلسلة. 957 00:43:22,112 --> 00:43:23,320 ها نحن ذا، lettercount.com. 958 00:43:23,320 --> 00:43:25,340 حسنًا. 959 00:43:25,340 --> 00:43:28,760 دعونا نمضي قدمًا ونلصق ذلك، نعدّ الأحرف، 225-- 960 00:43:28,760 --> 00:43:32,780 إذن لن يتم تسجيل نيك ما لم تقوموا فقط بتدعيم 16 أو 50. 961 00:43:32,780 --> 00:43:34,969 يبدو أننا بحاجة إلى 225 على الأقل. 962 00:43:34,969 --> 00:43:37,010 إذن في مرحلة ما، يجب أن تتخذوا قرارًا. 963 00:43:37,010 --> 00:43:38,930 وبصراحة، لا يكون الأمر واضحًا دائمًا. 964 00:43:38,930 --> 00:43:42,370 يجب أن تحددوا أن varchar سيكون-- آه، يمكن أن يكون 16، 965 00:43:42,370 --> 00:43:44,510 يمكن أن يكون 50، يمكن أن يكون 225. 966 00:43:44,510 --> 00:43:46,010 ولكن أتعلمون ماذا؟ إذا كان لديه أطفال-- 967 00:43:46,010 --> 00:43:50,240 إذن دعونا فقط نقوم بالتقريب قليلاً ونسميه varchar 255، بصراحة، 968 00:43:50,240 --> 00:43:52,050 فقط لأنه كان تقليدًا. 969 00:43:52,050 --> 00:43:54,860 إذن في وقت سابق من اليوم، كان 255 يميل إلى أن يكون الحد الأقصى من الطول 970 00:43:54,860 --> 00:43:56,510 لهذا الحقل في قواعد البيانات القديمة. 971 00:43:56,510 --> 00:43:59,786 وهذه تبدو مساحة كافية على الأقل للتلاعب بالأسماء على الأرجح. 972 00:43:59,786 --> 00:44:01,910 ولكن يجب أن تتخذوا قرارًا تحكيميًا في مرحلة ما. 973 00:44:01,910 --> 00:44:05,189 يمكننا تجاهل المشكلة بقول 1000 حرف. 974 00:44:05,189 --> 00:44:06,980 ولكن إذا لم يحدث هذا مطلقًا حقًا، 975 00:44:06,980 --> 00:44:09,438 وعلى الأرجح تقومون بإهدار المساحة، فعلى الأرجح لا يجب. 976 00:44:09,438 --> 00:44:12,920 لأنه على الرغم من أنه الحد الأعلى، فأنتم تضحون بشيء مثل الوقت، 977 00:44:12,920 --> 00:44:15,440 على الأرجح، للبحث عن ذلك الحقل إذا كنتم فقط 978 00:44:15,440 --> 00:44:19,130 تقومون بإخبار قاعدة البيانات بأنها ستصبح أكبر مما ستكون 979 00:44:19,130 --> 00:44:19,670 عليه بالفعل. 980 00:44:19,670 --> 00:44:22,430 يجب أن تكون واضحة أكثر. 981 00:44:22,430 --> 00:44:23,360 إذن ماذا عن السكن؟ 982 00:44:23,360 --> 00:44:25,050 يا إلهي، يجب أن نقوم بذلك مجددًا الآن. 983 00:44:25,050 --> 00:44:27,260 كيف نفعل ذلك باستخدام السكن؟ 984 00:44:27,260 --> 00:44:30,260 ما هو المدى الأطول لسكن أو منزل في الحرم الجامعي؟ 985 00:44:30,260 --> 00:44:32,590 الجمهور: [INAUDIBLE] 986 00:44:32,590 --> 00:44:36,720 ديفيد ج. مالان: أنا، على سبيل المثال، حسنًا [INAUDIBLE]،، منزل ربما. 987 00:44:36,720 --> 00:44:40,450 ولكن بصراحة، في مرحلة ما، لا يهم الأمر كثيرًا. 988 00:44:40,450 --> 00:44:42,002 لكن كونه متناسقًا هو ما يهم. 989 00:44:42,002 --> 00:44:42,960 إنها مسألة أسلوب. 990 00:44:42,960 --> 00:44:44,100 إنها مسألة تصميم. 991 00:44:44,100 --> 00:44:46,950 في مرحلة ما، لا يجب أن تتصيدوا أخطاء كل قيمة صغيرة. 992 00:44:46,950 --> 00:44:49,033 ولكن ربما يجب أن تختاروا قيمة معقولة 993 00:44:49,033 --> 00:44:52,330 يمكنكم تبريرها لرفيق سكن أو لزميل أو زميل تدريس. 994 00:44:52,330 --> 00:44:55,410 ومن ثم لنقل هذا يبدو كافيًا دون أن يكون بشكل مفرط في الواقع. 995 00:44:55,410 --> 00:44:58,470 ويوجد شيء واحد أخير سأفعله هنا هو فقط 996 00:44:58,470 --> 00:45:00,120 إنهاء فكرتي بفاصلة منقوطة. 997 00:45:00,120 --> 00:45:01,640 أعتذر، لقد عادت. 998 00:45:01,640 --> 00:45:05,244 ولكن في نهاية نقطة بدايتي هنا، إذا لم أقم بارتكاب أي أخطاء مطبعية، 999 00:45:05,244 --> 00:45:06,660 وسأمضي قدمًا وأضغط على Enter. 1000 00:45:06,660 --> 00:45:08,100 يبدو أن لا شيء يحدث. 1001 00:45:08,100 --> 00:45:11,550 وبشكل ساخر، في دورة CS50، في البرمجة، لا يحدث عادة 1002 00:45:11,550 --> 00:45:14,640 أي شيء جيد لأن ذلك يعني عدم حدوث أخطاء. 1003 00:45:14,640 --> 00:45:17,130 إذا قمتُ، في SQLite، بكتابة المخطط، يمكنني في الواقع 1004 00:45:17,130 --> 00:45:20,880 رؤية إرتجاع الجدول الذي قمتُ بإنشائه للتو. 1005 00:45:20,880 --> 00:45:23,940 ولكن الأهم من ذلك، يمكنني البدء في إدخال البيانات في هذا. 1006 00:45:23,940 --> 00:45:25,950 الآن لسوء الحظ، إنها ليست بيانية حتى الآن. 1007 00:45:25,950 --> 00:45:29,370 ولكن إذا أردتُ إدراج بيانات في هذا، يمكنني القيام بذلك. 1008 00:45:29,370 --> 00:45:33,090 أدرج في المسجَّلين-- حسنًا، ما الذي تريدون إدراجه؟ 1009 00:45:33,090 --> 00:45:36,390 أريد المضي قدمًا وإدراج معرّف، واسم، وسكن. 1010 00:45:36,390 --> 00:45:37,530 حسنًا، بأي قيم؟ 1011 00:45:37,530 --> 00:45:38,940 حسنًا، بهذه القيم-- 1012 00:45:38,940 --> 00:45:41,250 سيكون المعرّف-- سيكون المُسجَّل الأول هو 1. 1013 00:45:41,250 --> 00:45:43,260 سيكون براين أول شخص يتم تسجيله. 1014 00:45:43,260 --> 00:45:44,952 وسكنه، براين أين كنت تعيش؟ 1015 00:45:44,952 --> 00:45:46,560 براين: بالخارج في بيني بايكر. 1016 00:45:46,560 --> 00:45:48,290 ديفيد ج. مالان: بيني بايكر. 1017 00:45:48,290 --> 00:45:48,840 إذن هذا جيد. 1018 00:45:48,840 --> 00:45:51,240 قد يكون ذلك قريبًا من أربع مرات كذلك. 1019 00:45:51,240 --> 00:45:53,160 لذا سأمضي قدمًا وأقوم بذلك. 1020 00:45:53,160 --> 00:45:55,680 ها هو مثال على عبارة SQL. 1021 00:45:55,680 --> 00:45:58,380 CREATE TABLE هو فعل أو تعبير واحد يمكنك استخدامه. 1022 00:45:58,380 --> 00:45:59,910 INSERT INTO فعل آخر. 1023 00:45:59,910 --> 00:46:03,930 تقومون بتحديد اسم الجدول، وحقول الجدول، ومن ثم القيم. 1024 00:46:03,930 --> 00:46:07,680 والآن أقوم بالتكبير فقط لتوضيح ما هي أوامر SQL 1025 00:46:07,680 --> 00:46:11,175 وما هي الكلمات فقط في الواقع، التي اخترتُها، كمطوِّر. 1026 00:46:11,175 --> 00:46:12,300 ولكنه مجرد تقليد. 1027 00:46:12,300 --> 00:46:15,510 من المحتمل أن تكون هذه الكلمات المكتوبة بالأحرف الكبيرة بأحرف صغيرة في معظم السياقات أيضًا. 1028 00:46:15,510 --> 00:46:18,000 لكنها تساعد الأشياء، على ما أعتقد بشكل مرئي، في التمييز. 1029 00:46:18,000 --> 00:46:19,109 الآن سأمضي قدمًا وأقم بالإدخال. 1030 00:46:19,109 --> 00:46:20,150 يبدو أن لا شيء يحدث. 1031 00:46:20,150 --> 00:46:21,400 ربما هذا شيء جيد. 1032 00:46:21,400 --> 00:46:23,070 دعونا نمضي قدمًا ونقوم بتسجيل شخص آخر. 1033 00:46:23,070 --> 00:46:24,480 سأكون المسجَّل الثاني. 1034 00:46:24,480 --> 00:46:27,450 لذا ربما ديفيد من ماثيوز. 1035 00:46:27,450 --> 00:46:29,670 إذن ماثيوز هنا، Enter. 1036 00:46:29,670 --> 00:46:32,940 والآن، إذا أردتُ تحديد جميع الطلاب في قاعدة البيانات، 1037 00:46:32,940 --> 00:46:35,460 يمكنني المضي قدمًا وقول تحديد من-- 1038 00:46:35,460 --> 00:46:36,390 أو أتعلمون ماذا؟ 1039 00:46:36,390 --> 00:46:39,900 دعونا نختار كل شيء كما هو معروف في لغات كثيرة من خلال نجمة، 1040 00:46:39,900 --> 00:46:44,010 من المسجَّلين فاصلة منقوطة enter، ولدينا ذلك هناك. 1041 00:46:44,010 --> 00:46:46,780 إنها قاعدة بيانات خفيفة الوزن وبسيطة وصغيرة جدًا إلى حد ما. 1042 00:46:46,780 --> 00:46:49,380 ولكن هناك صفوف وأعمدة كثيرة تشبه إلى حد كبير جداول بيانات Excel 1043 00:46:49,380 --> 00:46:51,690 وGoogle التي ستضعها من أجلي. 1044 00:46:51,690 --> 00:46:53,350 لكنها تصبح أفضل من هذا. 1045 00:46:53,350 --> 00:46:57,390 لنفترض أنني أريد البحث في قاعدة البيانات هذه عن جميع الطلاب 1046 00:46:57,390 --> 00:46:58,744 المسجَّلين من ماثيوز. 1047 00:46:58,744 --> 00:47:00,660 ولنفترض أن الوقت يمر وأن العديد من الطلاب 1048 00:47:00,660 --> 00:47:02,370 يسجّلون حقًا في forshims. 1049 00:47:02,370 --> 00:47:03,930 يمكنني تصفية هذه البيانات في الواقع. 1050 00:47:03,930 --> 00:47:09,510 يمكنني أن أفعل شيئًا مثل تحديد نجمة من المسجَّلين حيث 1051 00:47:09,510 --> 00:47:12,810 سكن يساوي علامة اقتباس وعلامة إنهاء الاقتباس، "ماثيوز." 1052 00:47:12,810 --> 00:47:16,610 ولذا يمكنني تصفيتها، والضغط على Enter، والآن استرجعتُ صفًا واحدًا فقط. 1053 00:47:16,610 --> 00:47:18,360 وإذا بدأ عقلك في التساؤل-- 1054 00:47:18,360 --> 00:47:21,129 مدهش، إذا كان بإمكاني تقديم Python أو JavaScript في هذا، 1055 00:47:21,129 --> 00:47:22,170 أتعرفون ما يمكنني فعله؟ 1056 00:47:22,170 --> 00:47:25,650 ربما يمكنني العودة، وليس هذا وهذا الجدول القائم على ASCII، وجدول 1057 00:47:25,650 --> 00:47:26,250 النص هذا. 1058 00:47:26,250 --> 00:47:28,966 ربما يمكنني استعادة قائمة صفوف فعلية 1059 00:47:28,966 --> 00:47:31,090 حتى أتمكن بالفعل من القيام بشيء ما باستخدام هذه البيانات. 1060 00:47:31,090 --> 00:47:32,470 وهذا، في الواقع، حيث سنمضي في هذا. 1061 00:47:32,470 --> 00:47:34,950 لذا إذا أردتُ تحديد شخص آخر، فقد أتمكن من القيام اممم-- 1062 00:47:34,950 --> 00:47:39,600 ربما تحديد الاسم فقط من المسجَّلين 1063 00:47:39,600 --> 00:47:41,850 حيث سكنه يساوي "ماثيوز." 1064 00:47:41,850 --> 00:47:43,980 إذا كنتُ أهتم فقط بمعرفة مَن تم تسجيله، 1065 00:47:43,980 --> 00:47:46,420 يمكنني القيام بذلك وتقليصه إلى بيانات أقل. 1066 00:47:46,420 --> 00:47:49,230 لذلك بالفعل، في هذه الأوامر القليلة فقط، 1067 00:47:49,230 --> 00:47:52,140 يمكنني التعبير عن دالات أكثر مما يمكنكم القيام به باستخدام ملف CSV. 1068 00:47:52,140 --> 00:47:54,510 للقيام بهذا وCSV، كان يجب أن تكتبوا جميع 1069 00:47:54,510 --> 00:47:56,700 هذه السطور من تعليمات Python البرمجية بأنفسكم. 1070 00:47:56,700 --> 00:47:57,690 ماذا لو انتقل براين؟ 1071 00:47:57,690 --> 00:47:59,610 لذا، لم يعجب براين بسكن الطلاب بالفعل، 1072 00:47:59,610 --> 00:48:02,280 لذا سنمضي قدمًا ونستمر في تحديث المسجَّلين 1073 00:48:02,280 --> 00:48:05,225 وتعيين السكن يساوي-- إلى أين تريد الانتقال؟ 1074 00:48:05,225 --> 00:48:05,850 براين: Canaday. 1075 00:48:05,850 --> 00:48:09,210 ديفيد ج. مالان: "Canaday" حيث-- 1076 00:48:09,210 --> 00:48:10,835 يمكنني القيام بذلك بطرق قليلة. 1077 00:48:10,835 --> 00:48:11,710 ما هو حدسك؟ 1078 00:48:11,710 --> 00:48:14,160 كيف يمكنني تحديد برين و براين فقط-- 1079 00:48:14,160 --> 00:48:16,890 لا أريد الانتقال إلى Canaday. 1080 00:48:16,890 --> 00:48:18,120 كيف يمكننا نقل براين فقط؟ 1081 00:48:18,120 --> 00:48:19,495 الجمهور: [INAUDIBLE] 1082 00:48:19,495 --> 00:48:20,370 ديفيد ج. مالان: أجل. 1083 00:48:20,370 --> 00:48:24,930 ربما يمكننا أن نقول أن الاسم يساوي علامة اقتباس وعلامة إنهاء الاقتباس "براين" وEnter. 1084 00:48:24,930 --> 00:48:27,540 يعجبني هذا، لكن سيجد شخص ما خطأ في هذا إذا أمكنك ذلك. 1085 00:48:27,540 --> 00:48:28,691 الجمهور: شخصان باسم براين. 1086 00:48:28,691 --> 00:48:31,440 ديفبد ج. مالان: إذا كان هناك شخصان باسم يراين، سننقلهما 1087 00:48:31,440 --> 00:48:32,356 سننقل الثلاثة أشخاص. 1088 00:48:32,356 --> 00:48:35,120 لذلك ربما يكون أفضل، بصراحة، أن نقول، مم، 1089 00:48:35,120 --> 00:48:37,680 دعونا نقول فقط أن المعرّف يساوي 1. 1090 00:48:37,680 --> 00:48:40,819 الآن، بالطبع، أحتاج إلى رقم بطاقة هوية هارفرد الخاص ببراين أو أي شيء. 1091 00:48:40,819 --> 00:48:42,360 لكن هذا سيكون أكثر دقة. 1092 00:48:42,360 --> 00:48:45,690 لأن الافتراض هنا هو أن العمود الموجود في أقصى اليسار أو حقل المعرّف، 1093 00:48:45,690 --> 00:48:50,520 حسب التقليد البشري، يجب أن يكون فريدًا بحيث يعرّف 1094 00:48:50,520 --> 00:48:52,710 المساحة بشكل فريد حتى يمكننا الحصول على أكبر عدد ممكن من الأشخاص باسم براين كما نريد، 1095 00:48:52,710 --> 00:48:54,210 لكن لن يختلط علينا الأمر بشأنهم. 1096 00:48:54,210 --> 00:48:56,950 إذا مضيتُ قدمًا وضغطتُ فوق Enter الآن، فلن يحدث شيء. 1097 00:48:56,950 --> 00:49:02,280 ولكن إذا قمتُ بتحديد نجمة من المسجَّلين مرة أخرى، وضغطتُ فوق Enter، لاحظوا الآن، 1098 00:49:02,280 --> 00:49:04,584 تم نقل براين بالفعل إلى Canaday. 1099 00:49:04,584 --> 00:49:06,000 لذا هناك الكثير من الأشياء الأخرى. 1100 00:49:06,000 --> 00:49:06,875 براين، أتعرف ماذا؟ 1101 00:49:06,875 --> 00:49:09,060 أنت لستَ جيدًا جدًا في الرياضة لقد اكتمل الفريق. 1102 00:49:09,060 --> 00:49:13,890 لذا سيتم حذفك من المسجَّلين حيث المعرّف يساوي 1. 1103 00:49:13,890 --> 00:49:18,810 والآن إذا حدّدنا نجمة من المسجَّلين، لقد تبقيتُ أنا فقط. 1104 00:49:18,810 --> 00:49:20,130 لكن تم نقل براين أيضًا. 1105 00:49:20,130 --> 00:49:23,800 لذا لدينا القدرة على إدراج وتحديد وتحديث وحذف، 1106 00:49:23,800 --> 00:49:25,920 وإنشاء، كل ذلك أثناء التصفية. 1107 00:49:25,920 --> 00:49:28,710 ونحن فقط بدأنا في سكراتش بالسطح هنا لما هو ممكن. 1108 00:49:28,710 --> 00:49:31,670 لأنه يتضح أنه، يمكننا تخزين الكثير من البيانات في قواعد البيانات هذه. 1109 00:49:31,670 --> 00:49:33,539 جميع طلابنا، جميع مَن في الكلية-- 1110 00:49:33,539 --> 00:49:35,330 إذا كنتم شركة، يمكنكم البدء بتخزين 1111 00:49:35,330 --> 00:49:37,970 جميع المنتجات في قاعدة بياناتكم، جميع الطلبات، 1112 00:49:37,970 --> 00:49:39,050 جميع العملاء. 1113 00:49:39,050 --> 00:49:42,216 ولكن بمجرد أن تبدأ بالسير في هذا الطريق، حسنًا ، يا إلهي، ما هو العميل؟ 1114 00:49:42,216 --> 00:49:46,400 لدى العملاء أسماء وأرقام الهوية وربما عناوين البريد الإلكتروني 1115 00:49:46,400 --> 00:49:47,390 والعناوين البريدية. 1116 00:49:47,390 --> 00:49:48,860 ستصبح هذه الأمور فوضوية-- أرقام هواتف، 1117 00:49:48,860 --> 00:49:50,600 تشبه الأعداد الصحيحة إلى حد ما، لكن ليس تمامًا. 1118 00:49:50,600 --> 00:49:53,030 لذلك هناك العديد من الأسئلة التي ما نزال نحتاج إلى الإجابة عليها. 1119 00:49:53,030 --> 00:49:55,940 ولكن يبدو أنه حان الوقت لبعض الفاكهة وبعض الكعك. 1120 00:49:55,940 --> 00:49:58,390 لذا لمَ لا نمضي قدمًا ونأخذ استراحة لمدة خمس دقائق، ونقوم بتشغيل بعض الموسيقى. 1121 00:49:58,390 --> 00:50:00,014 إذا احتاج الآباء إلى المغادرة، فلا بأس بذلك. 1122 00:50:00,014 --> 00:50:02,540 وسنراكم هنا بعد خمس دقائق أو عدة دقائق. 1123 00:50:02,540 --> 00:50:03,320 حسنًا. 1124 00:50:03,320 --> 00:50:03,950 حسنًا لقد عدنا. 1125 00:50:03,950 --> 00:50:06,710 وكنا قد توقفنا بالضبط هنا حيث نستخدم 1126 00:50:06,710 --> 00:50:10,880 SQLite3، الإصدار 3 من أمر SQLite، وهو 1127 00:50:10,880 --> 00:50:14,360 مجرد واجهة نصية للتقنية 1128 00:50:14,360 --> 00:50:16,280 التي يجب أن نفكر فيها على أنها SQLite. 1129 00:50:16,280 --> 00:50:18,980 SQLite مثير للاهتمام وخفيف الوزن بمعنى أنه ليس خادمًا، 1130 00:50:18,980 --> 00:50:22,010 إنه ليس برنامجًا خياليًا يجب أن تقوم بتشغيله. 1131 00:50:22,010 --> 00:50:25,850 إنه يخزِّن حرفيًا جميع البيانات الخاصة بك في ملف، ولكن، حسب التقليد، 1132 00:50:25,850 --> 00:50:28,970 ينتهي بـ .db أو ربما .sqlite. 1133 00:50:28,970 --> 00:50:31,570 ولكنه مجرد ملف ثنائي، أصفار وواحدات. 1134 00:50:31,570 --> 00:50:34,320 إنه ليس نصًا يمكنك فتحه باستخدام Excel أو شيء من هذا القبيل. 1135 00:50:34,320 --> 00:50:35,510 لذا إنه ليس CSV. 1136 00:50:35,510 --> 00:50:37,110 لذا يتم تخزينه في ملف. 1137 00:50:37,110 --> 00:50:40,520 هذا يعني أنك لا تحتاجون إلى خبرة خاصة 1138 00:50:40,520 --> 00:50:41,990 في إعداد خادم قاعدة البيانات. 1139 00:50:41,990 --> 00:50:45,590 لا تحتاجون إلى الذاكرة والبرامج لتشغيله على جهاز الكمبيوتر بالفعل. 1140 00:50:45,590 --> 00:50:47,990 يمكنكم تخزين كل شيء محليًا، ولكنكم ستدفعون الثمن. 1141 00:50:47,990 --> 00:50:51,440 لأنه تذكرون من مناقشاتنا السابقة، كانت الأقراص بطيئة. 1142 00:50:51,440 --> 00:50:53,390 وإذا كنتم تقومون بتخزين بياناتكم على القرص، 1143 00:50:53,390 --> 00:50:56,240 فلن تكون بنفس سرعة تخزينها في ذاكرة الوصول العشوائي فقط. 1144 00:50:56,240 --> 00:50:59,180 وهذا هو السبب وراء وجود تقنيات أخرى مثل Postgres وMySQL وMicrosoft Access 1145 00:50:59,180 --> 00:51:03,080 وخادم SQL وOracle. 1146 00:51:03,080 --> 00:51:07,040 تلك منتجات رائعة حيث يقوم شخص ما حرفيًا بالنقر المزدوج فوق رمز 1147 00:51:07,040 --> 00:51:09,260 أو تشغيل أمر يقوم بتشغيل برنامج 1148 00:51:09,260 --> 00:51:13,400 يظل يعمل في ذاكرة الكمبيوتر ويعطيك أداء أفضل. 1149 00:51:13,400 --> 00:51:15,650 ولكن بالنسبة لأغراضنا، SQLite من الناحية الموضوعية مفيد. 1150 00:51:15,650 --> 00:51:18,320 ولكننا سنستمر في طرح الأسئلة حول أنواع البيانات 1151 00:51:18,320 --> 00:51:22,610 لأن SQLite تدعم أنواع البيانات الرائجة أكثر مثل تلك الموجودة في Postgres 1152 00:51:22,610 --> 00:51:26,960 وخادم SQL، وMySQL، وOracle، وهذه هي الأمور المكتوبة بالأدوات الصغيرة 1153 00:51:26,960 --> 00:51:28,160 التي قدمناها قبل قليل. 1154 00:51:28,160 --> 00:51:30,290 لكن بصراحة، سيصبح هذا مملاً بسرعة. 1155 00:51:30,290 --> 00:51:34,520 حتى أنا نادرًا ما أتذكر بالضبط الصيغة الصحيحة عند إنشاء الجداول، 1156 00:51:34,520 --> 00:51:36,230 الترتيب الذي يجب أن يتم عليه كل شيء. 1157 00:51:36,230 --> 00:51:39,117 لذلك أميل إلى استخدام واجهة المستخدم الرسومية أو GUI بنفسي. 1158 00:51:39,117 --> 00:51:40,700 وهناك الكثير من الأدوات هناك. 1159 00:51:40,700 --> 00:51:43,150 ولكننا قمنا بإنشاء واحدة مجانية ومفتوحة المصدر CS50 IDE 1160 00:51:43,150 --> 00:51:47,670 التي تجعل تحرير جداول SQL الخاصة بك أسهل قليلاً. 1161 00:51:47,670 --> 00:51:52,430 لذا سأمضي قدمًا وأخرج من SQLite. 1162 00:51:52,430 --> 00:51:54,282 وسأمضي قدمًا إلى هنا. 1163 00:51:54,282 --> 00:51:56,240 وستلاحظون أن لدينا جميع الملفات من اليوم بما في ذلك، 1164 00:51:56,240 --> 00:51:59,870 الملف الأخير، froshims.db. 1165 00:51:59,870 --> 00:52:02,810 هذا هو الملف الذي قمتُ بإنشائه باستخدام SQLite3. 1166 00:52:02,810 --> 00:52:05,750 ولكن إذا قمتُ بالنقر المزدوج فوقه عند استخدام CS50 IDE، 1167 00:52:05,750 --> 00:52:08,930 فسيقوم بفتح برنامج يُسمى phpLiteAdmin. 1168 00:52:08,930 --> 00:52:11,420 يصادف أنه تتم مكتوبته بلغة أخرى تُسمى PHP، 1169 00:52:11,420 --> 00:52:14,750 ولا علاقة لها بقواعد البيانات، فقط اسم المنتج هنا. 1170 00:52:14,750 --> 00:52:18,620 لكنها أداة تستخدم جداول HTML البسيطة جدًا، 1171 00:52:18,620 --> 00:52:22,842 تمنحنا فقط واجهة مستخدم رسومية على نفس الدالة بالضبط. 1172 00:52:22,842 --> 00:52:24,800 وبشكل شخصي، أجد هذا أسهل في الاستخدام. 1173 00:52:24,800 --> 00:52:26,550 ومن الناحية الموضوعية، سيكون الأمر أفضل 1174 00:52:26,550 --> 00:52:30,480 لأنه سيعرض لنا أنواع البيانات المتاحة لجدولنا. 1175 00:52:30,480 --> 00:52:33,620 لذا على سبيل المثال، لاحظوا هنا-- هناك الكثير على الشاشة. 1176 00:52:33,620 --> 00:52:36,560 لكن الكثير من هذا مجرد تفاصيل غير مثيرة للاهتمام. 1177 00:52:36,560 --> 00:52:39,830 لكن لاحظوا هنا، أرى جدولاً يسمى المُسجَّلون. 1178 00:52:39,830 --> 00:52:41,150 ومن ثم يمكنني تصفحه. 1179 00:52:41,150 --> 00:52:42,320 يمكنني رؤية بنيته. 1180 00:52:42,320 --> 00:52:45,040 يمكنني تنفيذ SQL يدويًا عن طريق كتابتها. 1181 00:52:45,040 --> 00:52:46,040 يمكنني البحث عنها، إدراج. 1182 00:52:46,040 --> 00:52:47,514 يمكنني أن أقوم بمجموعة أشياء بها. 1183 00:52:47,514 --> 00:52:50,180 هذا هو السبب في أن واجهة المستخدم الرسومية هذه مناسبة فقط. 1184 00:52:50,180 --> 00:52:51,888 دعوني أمضي قدمًا وأضغط فوق المُسجَّلون. 1185 00:52:51,888 --> 00:52:57,050 وبشكل افتراضي، سترون علامات التبويب هذه الآن، تصفح، وبنية، وSQL، 1186 00:52:57,050 --> 00:52:58,040 ومن ثم مجموعة علامات أخرى. 1187 00:52:58,040 --> 00:52:59,360 ولاحظوا هنا. 1188 00:52:59,360 --> 00:53:02,630 سترون الصف الوحيد والمُسجَّل الوحيد الذي يبقى بالفعل. 1189 00:53:02,630 --> 00:53:07,910 لأنه عندما غادرنا آخر مرة، أزلنا براين بشكل قسري من الفريق. 1190 00:53:07,910 --> 00:53:10,220 لذا لنفترض أنني أريد المضي قدمًا وإضافة المزيد من الصفوف 1191 00:53:10,220 --> 00:53:11,360 فقط من أجل المناقشة. 1192 00:53:11,360 --> 00:53:12,680 يمكنني فقط القيام بذلك يدويًا هنا. 1193 00:53:12,680 --> 00:53:16,400 يمكنني الانتقال إلى هنا ويمكنني القول، لنفترض أن اللاعب الثالث 1194 00:53:16,400 --> 00:53:19,670 سيكون فيرونيكا. 1195 00:53:19,670 --> 00:53:22,860 أعتقد أنها كانت أيضًا في ماثيوز لذا يمكنني كتابة ذلك هنا. 1196 00:53:22,860 --> 00:53:24,680 ويمكنني فقط المضي قدمًا والنقر على إدراج. 1197 00:53:24,680 --> 00:53:28,310 ولكن ما هو لطيف بشأن phpLiteAdmin هو أنه لن يقوم فقط 1198 00:53:28,310 --> 00:53:31,130 بإدراج الصفوف من أجلكم، بل سيعرض لكم التعليمة 1199 00:53:31,130 --> 00:53:34,590 sQLite البرمجية التي يمكنكم القيام بها بأنفسكم. 1200 00:53:34,590 --> 00:53:37,550 لذا فهذا تعزيز بصري لطيف لهذا الأمر نفسه بالضبط. 1201 00:53:37,550 --> 00:53:40,130 وستلاحظون أنها تستخدم علامات اقتباس مزدوجة بدلاً من علامات الاقتباس الفردية الخاصة بي من قبل. 1202 00:53:40,130 --> 00:53:42,213 إنها قابلة للتبادل أحيانًا، لكن ليس بشكل دائم. 1203 00:53:42,213 --> 00:53:44,780 لذا هي طريقة رائعة فقط لتعلم كيفية القيام بذلك بالفعل 1204 00:53:44,780 --> 00:53:48,110 باستخدام تعليمة SQL البرمجية الصحيحة لذا لن تقوموا بتبسيطها 1205 00:53:48,110 --> 00:53:48,860 باستخدام واجهة المستخدم الرسومية. 1206 00:53:48,860 --> 00:53:49,280 ولكن أتعرفون ماذا؟ 1207 00:53:49,280 --> 00:53:49,970 لنقم بذلك. 1208 00:53:49,970 --> 00:53:52,970 سأمضي قدمًا وأبدأ لأنني 1209 00:53:52,970 --> 00:53:54,660 أريد اتخاذ قرارات أفضل. 1210 00:53:54,660 --> 00:53:57,409 سأمضي قدمًا، حرفيًا، وأنقر بزر الماوس الأيمن أو أنقر بزر التحكم فوق هذا، 1211 00:53:57,409 --> 00:53:59,030 وأحذف froshims.db. 1212 00:53:59,030 --> 00:54:01,230 ودعونا بالفعل نبدأ من سكراتش. 1213 00:54:01,230 --> 00:54:03,850 الآن في السابق عندما قمتُ بهذا، كان بإمكاني المضي قدمًا، 1214 00:54:03,850 --> 00:54:08,900 في النافذة الطرفية الخاصة بي، وإنهاء SQLite3 وبعد ذلك، ما كان ذلك؟ 1215 00:54:08,900 --> 00:54:11,510 Froshims.db وأقوم بإنشاء الملف. 1216 00:54:11,510 --> 00:54:13,760 في الوقت الحالي، سأمضي قدمًا فقط في الواقع وأنقر فوق 1217 00:54:13,760 --> 00:54:16,280 ملف يُسمى بهذا الاسم، وهو أمر بسيط 1218 00:54:16,280 --> 00:54:18,680 يقوم بإنشاؤه حرفيًا، لكنه لا يضع أي شيء فيه، 1219 00:54:18,680 --> 00:54:20,109 لذا لدي ملف فارغ. 1220 00:54:20,109 --> 00:54:21,900 وسترون أنه انبث مجددًا فقط على 1221 00:54:21,900 --> 00:54:23,600 الجانب الأيسر، وهو مفيد. 1222 00:54:23,600 --> 00:54:27,110 والآن يمكنني النقر بشكل مزدوج فوق هذا الإصدار منه، وهو لا يحتوي على أي شيء بعد. 1223 00:54:27,110 --> 00:54:28,460 وها قد عدتُ إلى phpLiteAdmin. 1224 00:54:28,460 --> 00:54:30,800 لكن لاحظوا أنه لا يوجد جدول في قاعدة البيانات. 1225 00:54:30,800 --> 00:54:33,230 لذا لنبدأ في طرح بعض الأسئلة الصعبة 1226 00:54:33,230 --> 00:54:36,860 بالفعل حول كيفية إنشاء البيانات في قاعدة البيانات. 1227 00:54:36,860 --> 00:54:40,490 لذا دعوني أمضي قدمًا وأنتقل إلى هذا الحقل هنا-- وأقوم بإنشاء 1228 00:54:40,490 --> 00:54:42,680 جدول جديد على قاعدة البيانات froshims. 1229 00:54:42,680 --> 00:54:44,570 سأمضي قدمًا وأطلق عليه المُسجَّلون مجددًا. 1230 00:54:44,570 --> 00:54:46,640 لكن كم عدد الحقول؟ 1231 00:54:46,640 --> 00:54:50,990 لذا دعونا نحدّد المعرّف، والاسم، والسكن، ماذا أيضًا؟ 1232 00:54:50,990 --> 00:54:53,080 البريد الإلكتروني سمعتُه في وقت سابق. 1233 00:54:53,080 --> 00:54:54,512 العمر سمعتُه في وقت سابق. 1234 00:54:54,512 --> 00:54:55,970 الجمهور: الرياضة التي تريد الانضمام إليها. 1235 00:54:55,970 --> 00:54:56,245 ديفيد ج. مالان: معذرة. 1236 00:54:56,245 --> 00:54:57,770 لذا الرياضة التي تريد-- عذرًا-- 1237 00:54:57,770 --> 00:54:59,082 الرياضة التي تريد الانضمام إليها. 1238 00:54:59,082 --> 00:55:01,040 حسنًا. ستة حقول، ستة حقول، دعونا نكمل ذلك. 1239 00:55:01,040 --> 00:55:01,910 إذن، في الواقع، أتعرفون ماذا؟ 1240 00:55:01,910 --> 00:55:02,451 سبعة حقول. 1241 00:55:02,451 --> 00:55:03,930 أريد أرقام الهواتف أيضًا هذه المرة. 1242 00:55:03,930 --> 00:55:05,390 لذا دعوني أمضي قُدمًا وأضغط فوق Go. 1243 00:55:05,390 --> 00:55:08,737 والآن سترون فقط طريقة GUI لطلب جميع الإجابات 1244 00:55:08,737 --> 00:55:10,070 على الأسئلة نفسها منكم كما كان الأمر من قبل. 1245 00:55:10,070 --> 00:55:10,940 وربما هذا أكثر وضوحًا. 1246 00:55:10,940 --> 00:55:11,690 وربما لا. 1247 00:55:11,690 --> 00:55:14,270 لكن لا يوجد بديل عن حفظ 1248 00:55:14,270 --> 00:55:15,920 ما تحتاج أن تكون عليه الأوامر بالضبط. 1249 00:55:15,920 --> 00:55:19,580 لذا من الأعلى إلى الأسفل، في ما يلي جميع الحقول التي أحتاج إلى اتخاذ قرار بشأنها. 1250 00:55:19,580 --> 00:55:22,537 بشكل ساخر، الحقول هي مجرد كلمة مرادفة للأعمدة. 1251 00:55:22,537 --> 00:55:24,620 ومع ذلك، يتم حاليًا وضع أعمدتي في صفوف، 1252 00:55:24,620 --> 00:55:26,580 ولكن هذه مجرد مشكلة في واجهة المستخدم. 1253 00:55:26,580 --> 00:55:28,130 لذا دعوني أمضي قدمًا وأقرر. 1254 00:55:28,130 --> 00:55:32,360 حسب التقليد، يكون حقلي الأول دائمًا المعرّف أو ربما يجب أن يكون كذلك. 1255 00:55:32,360 --> 00:55:35,290 وسنرى لماذا هذا قوي وقليل فقط. 1256 00:55:35,290 --> 00:55:38,341 يجب أن يكون نوع البيانات لذلك، حسب التقليد، عددًا صحيحًا، 1257 00:55:38,341 --> 00:55:40,340 ما لم يكن لديكم الكثير من البيانات مثل Facebook، 1258 00:55:40,340 --> 00:55:42,180 ومن ثم قد يكون العدد الصحيح الكبير منطقيًا أكثر. 1259 00:55:42,180 --> 00:55:43,970 ولكن لاحظوا أن هذه القائمة المنسدلة تعطينا في الواقع 1260 00:55:43,970 --> 00:55:47,070 قائمة لطيفة من الخيارات كما كان الأمر من قبل. 1261 00:55:47,070 --> 00:55:50,060 وسترون في النص باللون الرمادي، الفئة، 1262 00:55:50,060 --> 00:55:53,690 أو بمصطلحات منمقة، تقارب هذه الأنواع المختلفة في SQLite 1263 00:55:53,690 --> 00:55:55,940 وفي الكلمات المكتوبة بالأسود وبأحرف صغيرة،سترون 1264 00:55:55,940 --> 00:56:00,165 نوع البيانات الفعلي المدعوم من قِبل قواعد بيانات شائعة كبيرة مثل Postgres 1265 00:56:00,165 --> 00:56:02,290 التي قد ترغبون في استخدامها لمشاريعكم النهائية. 1266 00:56:02,290 --> 00:56:03,998 في الواقع، نحن نضع هذه الأمور بعين الاعتبار 1267 00:56:03,998 --> 00:56:07,492 لكي تستخدموا هذه في المشاريع النهائية في السحابة، وليس في CS50 IDE، 1268 00:56:07,492 --> 00:56:09,200 ولكن في الواقع للحصول على اسم المجال الخاص بكم 1269 00:56:09,200 --> 00:56:11,939 ووضع موقع الويب الخاص بكم، إذا قمتم بتطبيق ويب، هناك. 1270 00:56:11,939 --> 00:56:13,730 لذا هنا، لدينا كل الأنواع المتاحة. 1271 00:56:13,730 --> 00:56:17,700 وأسفل العدد الصحيح، سأمضي قدمًا وأختار حرفيًا عدد صحيح للمعرّف الخاص بي. 1272 00:56:17,700 --> 00:56:18,200 حسنًا. 1273 00:56:18,200 --> 00:56:19,707 التالي، أمضي قدمًا وأقوم بالتصغير. 1274 00:56:19,707 --> 00:56:21,540 دعوني أمضي قدمًا وأختار اسم طالب. 1275 00:56:21,540 --> 00:56:24,755 قبل أن نفعل ذلك هل قررنا بشأن char أو varchar؟ 1276 00:56:24,755 --> 00:56:25,645 الجمهور: varchar. 1277 00:56:25,645 --> 00:56:26,840 ديفيد ج. مالان: حسنًا، varchar، وبأي حجم؟ 1278 00:56:26,840 --> 00:56:27,672 الجمهور: 255. 1279 00:56:27,672 --> 00:56:28,700 ديفيد ج. مالان: 255. 1280 00:56:28,700 --> 00:56:31,230 لذا فإن واجهة المستخدم هنا تسمح لي فقط بكتابتها. 1281 00:56:31,230 --> 00:56:34,220 وبالتالي فإن الصيغة تختلف قليلاً لأنها GUI، ولكن 255. 1282 00:56:34,220 --> 00:56:35,290 لكن أتعرفون ماذا؟ 1283 00:56:35,290 --> 00:56:37,100 كان الحقل الأخير هو السكن. 1284 00:56:37,100 --> 00:56:39,020 هذا أيضًا، أعتقد أننا قلنا varchar. 1285 00:56:39,020 --> 00:56:40,130 لذا دعوني أختار ذلك. 1286 00:56:40,130 --> 00:56:42,300 و255، على الرغم من أن هذا أحد الأمور الخلافية بشكل كبير قليلاً. 1287 00:56:42,300 --> 00:56:45,260 لستُ متأكدًا ما هو الرقم الصحيح، لذا في حالة عدم وضوح الأمر، 1288 00:56:45,260 --> 00:56:48,690 سأقوم فقط بتوحيد القيمة نفسها دون أن تكون مهدرة للغاية. 1289 00:56:48,690 --> 00:56:51,440 لكن لاحظوا أن هناك بعض الأسئلة هنا لم نحدّد إجابتها بعد. 1290 00:56:51,440 --> 00:56:54,074 لكن أشار تحولنا المثالي في وقت سابق إلى هذا. 1291 00:56:54,074 --> 00:56:56,240 يتضح أنكم، تحتاجون إلى اتخاذ بعض القرارات الأخرى 1292 00:56:56,240 --> 00:56:57,920 عند تصميم قاعدة بيانات. 1293 00:56:57,920 --> 00:57:01,070 إذا كنتم تعرفون مسبقًا أن أحد الحقول 1294 00:57:01,070 --> 00:57:04,350 هو الجزء الأساسي من البيانات لتحديد المستخدمين بشكل فريد، 1295 00:57:04,350 --> 00:57:06,350 فهذا هو ما يسمى بمفتاح أساسي-- 1296 00:57:06,350 --> 00:57:11,300 العمود أو الحقول التي، تضمن، تحديد المستخدمين بشكل فريد. 1297 00:57:11,300 --> 00:57:14,720 لذا إذا كان لديكم شخصين باسم براين، فإن كل واحد منهما سيكون له معرّفه الخاص. 1298 00:57:14,720 --> 00:57:18,860 لذلك، هو مفتاحك الأساسي، وليس حقل الاسم براين. 1299 00:57:18,860 --> 00:57:22,130 لذلك سأقوم بإخبار قاعدة البيانات، هذا هو المفتاح الأساسي. 1300 00:57:22,130 --> 00:57:24,590 وستساعدني في تتبع هذا الطابع الفريد. 1301 00:57:24,590 --> 00:57:26,750 علاوة على ذلك، هذه ميزة خيالية. 1302 00:57:26,750 --> 00:57:29,150 قبل ذلك، كنت أقول بشكل يدوي وتعسفي جدًا 1303 00:57:29,150 --> 00:57:32,720 أن براين سيكون رقم 1، سأكون رقم 2، وستكون فيرونيكا رقم 3. 1304 00:57:32,720 --> 00:57:33,482 هذا مُمل. 1305 00:57:33,482 --> 00:57:35,940 على سبيل المثال، يجب أن يكون الكمبيوتر قادرًا على حل هذه المشكلة من أجلي. 1306 00:57:35,940 --> 00:57:38,210 لا أريد أن أفكر في ما هو رقم الفكرة. 1307 00:57:38,210 --> 00:57:39,930 يمكنكم زيادة الحقل تلقائيًا. 1308 00:57:39,930 --> 00:57:43,130 لذا، إذا قمتُ بالفعل بفحص هذا المربع، فإن SQL 1309 00:57:43,130 --> 00:57:46,520 ستقوم بكتابة فقط زائد-زائد، زائد-زائد حقل الفكرة في كل مرة 1310 00:57:46,520 --> 00:57:48,230 وسأدرج اسم جديد وسكن جديد. 1311 00:57:48,230 --> 00:57:50,930 لستُ مضطرًا حتى إلى أن أتحمّل عناء تحديد المعرّف بعد الآن. 1312 00:57:50,930 --> 00:57:53,180 الآن هناك عمود آخر هنا، ليس فارغًا، 1313 00:57:53,180 --> 00:57:55,790 حيث يمكنكم تحديد أن هذا العمود يجب ألا يكون فارغًا أبدًا. 1314 00:57:55,790 --> 00:57:59,090 وهذا أمر هام لأنه إذا كنتم تقومون بإنشاء موقع ويب يحتوي على بيانات هامة 1315 00:57:59,090 --> 00:58:01,010 يجب أن تكون لديكم من المستخدمين-- مثل، 1316 00:58:01,010 --> 00:58:04,970 لن يعمل تطبيقك بدون اسم المستخدم الخاص بالمستخدم أو كلمة المرور الخاصة به 1317 00:58:04,970 --> 00:58:06,180 أو عنوان بريده الإلكتروني-- 1318 00:58:06,180 --> 00:58:07,460 يمكنكم أن تقولوا ليس فارغًا. 1319 00:58:07,460 --> 00:58:10,520 وستضمن قاعدة البيانات الخاصة بكم أنه لا يمكنكم حتى 1320 00:58:10,520 --> 00:58:15,200 إدراج صف في قاعدة البيانات هذه ما لم تعطوا قيمة لهذا الحقل. 1321 00:58:15,200 --> 00:58:17,140 لذا يساعدكم على حمايتكم من أنفسكم. 1322 00:58:17,140 --> 00:58:18,890 لأنه يمكنكم بالتأكيد تنفيذ ذلك 1323 00:58:18,890 --> 00:58:20,930 منطقيًا في Python أو في أي لغة. 1324 00:58:20,930 --> 00:58:24,950 لكن قاعدة البيانات هي تحدي نهائي أيضًا. 1325 00:58:24,950 --> 00:58:27,230 القيمة الافتراضية ليست منطقية بالفعل هنا. 1326 00:58:27,230 --> 00:58:30,170 ولكن بالنسبة لأنواع معينة من الحقول، يمكنكم قول، قاعدة البيانات، 1327 00:58:30,170 --> 00:58:33,702 أدرجي الوقت الحالي أو التاريخ الحالي من أجلي؟ 1328 00:58:33,702 --> 00:58:34,910 الآن، لماذا قد تريدون ذلك؟ 1329 00:58:34,910 --> 00:58:39,004 لماذا التاريخ والوقت بشكل افتراضي؟ 1330 00:58:39,004 --> 00:58:40,045 لماذا قد يكون ذلك مفيدًا؟ 1331 00:58:40,045 --> 00:58:41,671 الجمهور: متى تم إنشاء الحساب؟ 1332 00:58:41,671 --> 00:58:44,253 ديفيد ج. مالان: عندما تم إنشاء الحساب، عندما اشتروا 1333 00:58:44,253 --> 00:58:46,720 foo، عندما نقلوا شريطًا-- أي عدد من الأسباب. 1334 00:58:46,720 --> 00:58:48,550 قد ترغبون فقط في معرفة، ما هو الوقت الآن؟ 1335 00:58:48,550 --> 00:58:49,750 لكن لا يجب أن تكتبوا التعليمة البرمحية لذلك. 1336 00:58:49,750 --> 00:58:51,750 يمكن أن تجيب قاعدة البيانات على هذه الأسئلة من أجلكم. 1337 00:58:51,750 --> 00:58:55,360 إذن، فقط الكثير من الدالات التي حصلنا عليها، بالطبع، باستخدام ملفات CSV فقط. 1338 00:58:55,360 --> 00:58:57,760 إذن الاسم، هل يجب أن يكون مفتاحًا أساسيًا؟ 1339 00:58:57,760 --> 00:58:58,386 لا. 1340 00:58:58,386 --> 00:59:00,010 وإلا لا يمكننا الحصول على شخصين باسم براين. 1341 00:59:00,010 --> 00:59:02,620 وبشكل عام، سيكون مفتاحكم الأساسي حقلًا واحدًا، على الرغم من ذلك، 1342 00:59:02,620 --> 00:59:05,329 يمكنك من الناحية النظرية إنشاء أعمدة مشتركة إذا كنتم تريدون ذلك. 1343 00:59:05,329 --> 00:59:06,870 لكن بشكل عام، سيكون عمود واحد. 1344 00:59:06,870 --> 00:59:10,140 هل يجب علينا زيادة براين تلقائيًا-- لذلك، على سبيل المثال، حسنًا-- 1345 00:59:10,140 --> 00:59:14,030 مثل براين28، أو براين2، أو براين3، وما إلى ذلك؟ 1346 00:59:14,030 --> 00:59:14,530 لا. 1347 00:59:14,530 --> 00:59:15,613 لا يبدو منطقيًا حقًا. 1348 00:59:15,613 --> 00:59:16,570 ليس فارغًا؟ 1349 00:59:16,570 --> 00:59:17,290 من المحتمل. 1350 00:59:17,290 --> 00:59:19,894 أريد كل أسماء الطلاب الجدد حتى نعرف 1351 00:59:19,894 --> 00:59:21,310 مَن يقوم بالتسجيل للرياضة. 1352 00:59:21,310 --> 00:59:22,200 والسكن؟ 1353 00:59:22,200 --> 00:59:22,960 أجل، ليس فارغًا. 1354 00:59:22,960 --> 00:59:24,700 لكن أوه، حالة حرجة-- 1355 00:59:24,700 --> 00:59:27,589 هل يمكن أن يفكر أي شخص في حالة حرجة حيث من المحتمل 1356 00:59:27,589 --> 00:59:28,880 أن يكون السكن نوعًا ما فارغًا؟ 1357 00:59:28,880 --> 00:59:29,592 الجمهور: خارج الحرم الجامعي. 1358 00:59:29,592 --> 00:59:31,330 ديفيد ج. مالان: إنهم يتنقلون، وهم خارج الحرم الجامعي-- 1359 00:59:31,330 --> 00:59:32,440 إنهم ليسوا طلابًا كُثر. 1360 00:59:32,440 --> 00:59:35,570 ولكن إذا كان لديكم 1٪، 5٪ من الطلاب الذين يعيشون خارج الحرم الجامعي، 1361 00:59:35,570 --> 00:59:37,150 فهذا هو سؤال التصميم الآن. 1362 00:59:37,150 --> 00:59:39,749 وقد زرنا جميعًا على الأرجح بعض مواقع الويب 1363 00:59:39,749 --> 00:59:42,040 حيث لا يمكنكم ملء النموذج بالطريقة الصحيحة 1364 00:59:42,040 --> 00:59:44,707 لأنكم لا تلبون معاييرهم أو توقعاتهم. 1365 00:59:44,707 --> 00:59:46,790 وهذا فقط بسبب قرار التصميم السيئ. 1366 00:59:46,790 --> 00:59:49,077 لذلك دعونا نتيح له أن يكون فارغًا فقط في هذه الحالة. 1367 00:59:49,077 --> 00:59:49,660 الآن ماذا أيضًا؟ 1368 00:59:49,660 --> 00:59:52,600 قلنا رقم الهاتف عندما اقترحتُ ذلك. 1369 00:59:52,600 --> 00:59:55,760 يا إلهي، لا يوجد نوع رقم الهاتف. 1370 00:59:55,760 --> 00:59:58,800 إذن ما الذي تريدون إنهائه؟ 1371 00:59:58,800 --> 01:00:00,122 الجمهور: [INAUDIBLE] 1372 01:00:00,122 --> 01:00:01,205 ديفيد ج. مالان: معذرة؟ 1373 01:00:01,205 --> 01:00:02,871 الجمهور: [INAUDIBLE] varchar. 1374 01:00:02,871 --> 01:00:03,870 ديفيد ج. مالان: Varchar. 1375 01:00:03,870 --> 01:00:04,369 حسنًا. 1376 01:00:04,369 --> 01:00:08,340 حتى نتمكن من اختيار varchar وربما استخدام 10 أو حتى 10 أرقام في الولايات المتحدة، 1377 01:00:08,340 --> 01:00:12,910 على الأقل، على الرغم من، ربما، على سبيل المثال، 12 باستخدام علامات التجزئة، أو 13 باستخدام الأقواس، 1378 01:00:12,910 --> 01:00:13,410 أو-- 1379 01:00:13,410 --> 01:00:14,150 الجمهور: [INAUDIBLE] 1380 01:00:14,150 --> 01:00:14,650 ديفيد ج. مالان: ما هذا؟ 1381 01:00:14,650 --> 01:00:15,906 الجمهور: [INAUDIBLE] 1382 01:00:15,906 --> 01:00:17,280 ديفيد ج. مالان: أسمع همهمة. 1383 01:00:17,280 --> 01:00:17,840 معذرة. 1384 01:00:17,840 --> 01:00:18,900 الجمهور: int صغير. 1385 01:00:18,900 --> 01:00:20,880 ديفيد ج. مالان: int صغير ومعاملته فقط 1386 01:00:20,880 --> 01:00:22,770 كرقم، ربما يمكن أن ينجح هذا أيضًا. 1387 01:00:22,770 --> 01:00:24,000 بديل آخر؟ 1388 01:00:24,000 --> 01:00:24,660 أي شيء آخر؟ 1389 01:00:24,660 --> 01:00:27,750 الجمهور: [INAUDIBLE] الدقة. 1390 01:00:27,750 --> 01:00:29,910 ديفيد ج. مالان: الدقة-- لذا رقم محدد. 1391 01:00:29,910 --> 01:00:34,015 الجمهور: [INAUDIBLE] تأكد من حصولك على الرقم الصحيح. 1392 01:00:34,015 --> 01:00:34,890 ديفيد مالان: جيد. 1393 01:00:34,890 --> 01:00:35,970 لذا ليس حدسًا سيئًا. 1394 01:00:35,970 --> 01:00:39,314 ولكن يتضح أنه باستخدام نوع البيانات الرقمية، حيث تحدّدون معيارًا 1395 01:00:39,314 --> 01:00:41,730 كما أطلقنا عليه-- العدد الإجمالي للأرقام في الدقة-- 1396 01:00:41,730 --> 01:00:44,820 والذي يُقصد به عمومًا قيم النقاط العائمة-- 1397 01:00:44,820 --> 01:00:46,440 أي الأرقام الحقيقية ذات النقاط العشرية. 1398 01:00:46,440 --> 01:00:49,650 لأنه على الرغم من أنكم تحددون حدًا أقصى، 1399 01:00:49,650 --> 01:00:51,470 فأنتم لا تحتاجون إلى تلك الأرقام الكثيرة. 1400 01:00:51,470 --> 01:00:52,201 إنه مجرد حد أقصى. 1401 01:00:52,201 --> 01:00:52,700 أجل؟ 1402 01:00:52,700 --> 01:00:56,510 الجمهور: أعتقد أن إعطائه-- 1403 01:00:56,510 --> 01:00:59,960 سيكون القيام بنوع من chars تصميمًا سيئًا لأنه 1404 01:00:59,960 --> 01:01:03,250 يمكنكم إدخال قيم غير رقمية بعد ذلك. 1405 01:01:03,250 --> 01:01:04,490 ديفيد ج. مالان: أجل. 1406 01:01:04,490 --> 01:01:07,280 يمكننا أن نجد الخطأ، أعتقد أنه، في هاتين الفكرتين، على الرغم من أن 1407 01:01:07,280 --> 01:01:07,904 كلا الفكرتين معقولتان. 1408 01:01:07,904 --> 01:01:10,220 إذا سمحتم باستخدام char أو varchar، يمكنني كتابة 1409 01:01:10,220 --> 01:01:13,639 على سبيل المثال foo أو bar أو baz وليس رقمًا. 1410 01:01:13,639 --> 01:01:14,930 لذلك ربما يجب أن نكتب int. 1411 01:01:14,930 --> 01:01:16,970 ولكن هل يمكن أن يفكر أي شخص في مثال مضاد 1412 01:01:16,970 --> 01:01:17,990 لمَ لا يجب أن تستخدموا عددًا صحيحًا؟ 1413 01:01:17,990 --> 01:01:20,281 الجمهور: لقد حصل على طول متغير له، أليس كذلك؟ 1414 01:01:20,281 --> 01:01:21,927 لذا ستحصل على أي رقم-- 1415 01:01:21,927 --> 01:01:23,260 ديفيد ج. مالان: طول المتغير. 1416 01:01:23,260 --> 01:01:25,989 لكن إذا قمنا بالفعل بإجراء العملية الحسابية، ربما 65، 1417 01:01:25,989 --> 01:01:27,530 ربما-- توجد وحدات بايت كافية هناك. 1418 01:01:27,530 --> 01:01:30,405 يمكننا استخدام int كبير، وهذا يعطينا رقم هاتف طويل حقًا. 1419 01:01:30,405 --> 01:01:32,130 لذا ربما يكون هناك حد أقصى معقول. 1420 01:01:32,130 --> 01:01:32,630 أجل؟ 1421 01:01:32,630 --> 01:01:38,034 الجمهور: دعنا نقل [INAUDIBLE] بين [INAUDIBLE] عدد صحيح. 1422 01:01:38,034 --> 01:01:39,700 ديفيد ج. مالان: الشُرط والأقواس. 1423 01:01:39,700 --> 01:01:41,658 يجب أن نقرر، هل نريد دعم ذلك؟ 1424 01:01:41,658 --> 01:01:45,290 وبصراحة، ربما نعيش جميعًا في الولايات المتحدة الآن، معظمنا 1425 01:01:45,290 --> 01:01:45,790 هنا. 1426 01:01:45,790 --> 01:01:49,150 ولكن عند إجراء مكالمة محلية في بعض المناطق، على سبيل المثال، تكتبون 0 أولاً. 1427 01:01:49,150 --> 01:01:51,080 وقد يكتب بعض الأشخاص 0 كرقمهم. 1428 01:01:51,080 --> 01:01:53,410 ولكن ما الذي سيحدث إذا كتبتم 0 في حقل عدد صحيح؟ 1429 01:01:53,410 --> 01:01:54,640 الجمهور: ستتجاهله. 1430 01:01:54,640 --> 01:01:56,120 ديفيد ج. مالان: ستقومون بتجاهله. 1431 01:01:56,120 --> 01:01:57,370 لذا الآن توجد هذه الحالة الحرجة. 1432 01:01:57,370 --> 01:01:57,940 إذن اللعنة. 1433 01:01:57,940 --> 01:02:00,314 على سبيل المثال، من الواضح أنه لا توجد طريقة لحل هذه المشكلة. 1434 01:02:00,314 --> 01:02:01,630 إذن ما هو الأفضل؟ 1435 01:02:01,630 --> 01:02:04,150 يجب أن نتوصل إلى حل وسط وأن نقبل فقط 1436 01:02:04,150 --> 01:02:06,220 أنه يجب حل هذا باستخدام تعليمة برمجية. 1437 01:02:06,220 --> 01:02:07,810 الجمهور: Varchar. 1438 01:02:07,810 --> 01:02:08,810 ديفيد ج. مالان: Varchar؟ 1439 01:02:08,810 --> 01:02:09,309 حسنًا. 1440 01:02:09,309 --> 01:02:10,740 إذن varchars أو char. 1441 01:02:10,740 --> 01:02:11,240 حسنًا. 1442 01:02:11,240 --> 01:02:13,220 إذن ربما دعونا نعمل على تبسيط المشكلة. 1443 01:02:13,220 --> 01:02:16,190 لا يمكن لأي شخص خارج الولايات المتحدة أن ينضم إلى رياضة داخلية جديدة. 1444 01:02:16,190 --> 01:02:17,330 هذا يُبسّط الأمر. 1445 01:02:17,330 --> 01:02:20,952 لأنه إذا كنا ندعم فقط أرقام الهواتف في الولايات المتحدة، يمكننا الآن أن نقول 10 أرقام. 1446 01:02:20,952 --> 01:02:22,160 وإذا قلنا ذلك، أتعرفون ماذا؟ 1447 01:02:22,160 --> 01:02:24,243 لا تهمني الشُرط أو الأقواس. 1448 01:02:24,243 --> 01:02:27,830 يمكنني استخدام تعليمة برمجية أو JavaScript أو Python، للتخلص من الصيغة. 1449 01:02:27,830 --> 01:02:29,810 ويمكنني فقط تخزين 10 أرقام. 1450 01:02:29,810 --> 01:02:32,060 ربما char 10 كافية-- 1451 01:02:32,060 --> 01:02:35,680 3 لرمز المنطقة، ثم باقي الرقم، سبعة أرقام جميعها 1452 01:02:35,680 --> 01:02:36,180 فيه. 1453 01:02:36,180 --> 01:02:37,805 لكن قد تجدون خطأ في هذا أيضًا. 1454 01:02:37,805 --> 01:02:41,510 ونحن بالفعل نعزل الطلاب الدوليين في الحرم الجامعي. 1455 01:02:41,510 --> 01:02:43,812 لكن مجددًا، هذه مجرد قرارات تصميم غير واضحة. 1456 01:02:43,812 --> 01:02:45,770 ولذا نحن هنا، في نهاية الفصل الدراسي. 1457 01:02:45,770 --> 01:02:47,060 ليست لدينا دائمًا إجابات جيدة. 1458 01:02:47,060 --> 01:02:48,680 ولن يتفق الأشخاص المنطقيون بشأن ذلك. 1459 01:02:48,680 --> 01:02:52,490 لكن دعوني أبسط الافتراضات ونستخدم فقط الأرقام الأمريكية، 10 أرقام، 1460 01:02:52,490 --> 01:02:56,270 وثقوا بأنني سأستخدم التعليمة البرمجية في Python أو أي لغة أخرى 1461 01:02:56,270 --> 01:02:59,400 للتخلص من الصيغة، وعلامات الترقيم وأي شيء 1462 01:02:59,400 --> 01:03:01,190 كالأقواس والشُرط. 1463 01:03:01,190 --> 01:03:04,234 وسأتأكد من أن الشخص لم يكتب أي حرف من الأحرف الأبجدية. 1464 01:03:04,234 --> 01:03:05,150 يمكنني القيام بذلك في التعليمة البرمجية. 1465 01:03:05,150 --> 01:03:10,410 وأنتم تعلمون أنه يمكننا فعل ذلك حتى في JavaScript عندما يقدم الشخص شكلاً. 1466 01:03:10,410 --> 01:03:12,860 دعونا ننتقل إلى النهاية، الرياضة، ماذا كانت الرياضة-- 1467 01:03:12,860 --> 01:03:15,485 الجمهور: الرياضة التي يريدون القيام بها. 1468 01:03:15,485 --> 01:03:17,360 ديفيد ج. مالان: الرياضة التي قد يريدون القيام بها. 1469 01:03:17,360 --> 01:03:20,240 إذن هذا مثال جيد، لا يجب أن تكون لديكم مسافات 1470 01:03:20,240 --> 01:03:25,010 في اسم الحقل، لذا التقليد سيكون الرياضة_هم_ حقًا أو ربما 1471 01:03:25,010 --> 01:03:28,301 أو دعونا نطلق عليها فقط الرياضة في هذه الحالة. 1472 01:03:28,301 --> 01:03:29,300 سنعود إلى ذلك. 1473 01:03:29,300 --> 01:03:31,660 أعتقد أن لدينا فكرتان أخرتان. 1474 01:03:31,660 --> 01:03:32,620 رقم الهاتف. 1475 01:03:32,620 --> 01:03:33,460 الجمهور: البريد الإلكتروني. 1476 01:03:33,460 --> 01:03:33,980 ديفيد ج. مالان: البريد الإلكتروني. 1477 01:03:33,980 --> 01:03:34,330 جسنًا. 1478 01:03:34,330 --> 01:03:35,090 البريد الإلكتروني فكرة جيدة. 1479 01:03:35,090 --> 01:03:36,089 ما الذي يجب أن يكون عليه ذلك؟ 1480 01:03:36,089 --> 01:03:38,480 لا يوجد نوع بريد إلكتروني، لسوء الحظ، على الرغم من وجود 1481 01:03:38,480 --> 01:03:41,490 hTML، نوع مدخل للبريد الإلكتروني. 1482 01:03:41,490 --> 01:03:42,240 الجمهور: Varchar. 1483 01:03:42,240 --> 01:03:42,710 ديفيد ج. مالان: ما هذا؟ 1484 01:03:42,710 --> 01:03:43,790 الجمهور: Varchar. 1485 01:03:43,790 --> 01:03:46,540 ديفيد ج. مالان: حسنًا، أشعر أننا ربما بحاجة إلى varchar هنا. 1486 01:03:46,540 --> 01:03:50,480 ولكنه هنا، غير واضح قليلاً، ما هو أطول عنوان بريد إلكتروني في العالم؟ 1487 01:03:50,480 --> 01:03:52,550 ربما عنوان بريد نيك الإلكتروني؟ 1488 01:03:52,550 --> 01:03:53,835 إذن لا أعرف. 1489 01:03:53,835 --> 01:03:56,210 ولكن دعونا نختار حدًا أعلى معقولاً يمكننا ربما أن نعتاد 1490 01:03:56,210 --> 01:03:58,230 عليه كمجموعة. 1491 01:03:58,230 --> 01:04:00,380 ولنرى-- أي شيء آخر هنا؟ 1492 01:04:00,380 --> 01:04:00,880 لا؟ 1493 01:04:00,880 --> 01:04:01,220 حسنًا. 1494 01:04:01,220 --> 01:04:02,428 هل كان هناك حقلاً إضافيًا آخر؟ 1495 01:04:02,428 --> 01:04:03,740 الجمهور: عام التخرج. 1496 01:04:03,740 --> 01:04:04,650 ديفيد ج. مالان: أوه، التخرج-- أوه، العمر. 1497 01:04:04,650 --> 01:04:05,400 لنأخذ العمر. 1498 01:04:05,400 --> 01:04:08,220 إذن العمر-- أخيرًا، شيء بسيط. 1499 01:04:08,220 --> 01:04:09,627 ما الذي تريدون أن يكون عليه هذا؟ 1500 01:04:09,627 --> 01:04:10,460 الجمهور: int صغير. 1501 01:04:10,460 --> 01:04:13,070 ديفيد ج. مالان: int صغير، حسنًا. 1502 01:04:13,070 --> 01:04:18,584 لن ندعم الأشخاص الذين تزيد أعمارهم عن 65535 عامًا. 1503 01:04:18,584 --> 01:04:20,625 على الرغم من ذلك هل يرغب شخص ما في إيجاد خطأ في هذه الفكرة؟ 1504 01:04:20,625 --> 01:04:25,750 1505 01:04:25,750 --> 01:04:29,050 يمكنني القول، لا توجد إجابة واحدة صحيحة لأي من هذه الأسئلة. 1506 01:04:29,050 --> 01:04:30,850 الجمهور: تحتاج إلى شهر. 1507 01:04:30,850 --> 01:04:32,230 ديفيد ج. مالان: شهر-- 1508 01:04:32,230 --> 01:04:33,680 أوه، على حسب. 1509 01:04:33,680 --> 01:04:34,397 هل نريد شهرًا؟ 1510 01:04:34,397 --> 01:04:35,022 الجمهور: أجل. 1511 01:04:35,022 --> 01:04:36,950 قد نحتاج إلى [INAUDIBLE]. 1512 01:04:36,950 --> 01:04:41,780 الجمهور: --ثم تحتاج إلى التاريخ، السنة. 1513 01:04:41,780 --> 01:04:44,080 ديفيد ج. مالان: إذن أنتم تفترضون أننا نريد تاريخ الميلاد. 1514 01:04:44,080 --> 01:04:45,520 أعتقد أنني أطلقتُ عليه العمر. 1515 01:04:45,520 --> 01:04:46,920 إذن ربما هذه هي المشكلة. 1516 01:04:46,920 --> 01:04:49,090 على سبيل المثال، إذا كان العمر، فسيكون int الصغير جيد. 1517 01:04:49,090 --> 01:04:51,146 على سبيل المثال، يمكن أن يكون عمرك 0 سنة أو 65000 سنة. 1518 01:04:51,146 --> 01:04:52,020 لدينا نطاق جيد. 1519 01:04:52,020 --> 01:04:54,284 الجمهور: يدور كل شيء حول العمر، تاريخ الميلاد. 1520 01:04:54,284 --> 01:04:56,200 ديفيد ج. مالان: إذا كان العمر، فأعتقد أننا على ما يرام. 1521 01:04:56,200 --> 01:04:59,890 لكنني أعتقد أنك تشير إلى نقطة جيدة، وهي ربما لماذا نريد 1522 01:04:59,890 --> 01:05:02,516 تخزين تاريخ الميلاد وليس العمر؟ 1523 01:05:02,516 --> 01:05:03,391 الجمهور: [INAUDIBLE] 1524 01:05:03,391 --> 01:05:04,265 ديفيد ج. مالان: أجل. 1525 01:05:04,265 --> 01:05:06,460 يتغير هذا الشيء دائمًا، بخلاف ذلك، أليس كذلك؟ 1526 01:05:06,460 --> 01:05:09,190 على سبيل المثال، سأضطر إلى تحديث قاعدة بياناتي غدًا ومن ثم 1527 01:05:09,190 --> 01:05:12,250 في اليوم التالي، ناهيك عن كل ساعة أو كل دقيقة فقط 1528 01:05:12,250 --> 01:05:14,200 لأن أعمار المستخدمين تتغير. 1529 01:05:14,200 --> 01:05:15,580 يبدو هذا سخيفًا. 1530 01:05:15,580 --> 01:05:17,530 دعوني، بدلاً من ذلك، أحدّد قيمة-- 1531 01:05:17,530 --> 01:05:20,470 لتقوم بشيء مثل تاريخ الميلاد. 1532 01:05:20,470 --> 01:05:23,020 تاريخ الميلاد-- ربما يحدد شيئًا غير int. 1533 01:05:23,020 --> 01:05:25,780 لكن دعونا بالفعل نستخدم حقل التاريخ. 1534 01:05:25,780 --> 01:05:28,210 يمكننا تخزين الوقت إذا كنا مهتمين حقًا بالوقت الذي 1535 01:05:28,210 --> 01:05:29,910 ولدوا فيه في يوم معين. 1536 01:05:29,910 --> 01:05:34,300 ولكن هنا، يمكنني أن أقول أن التاريخ سيكون أفضل قليلاً، لأنني أعرف الآن 1537 01:05:34,300 --> 01:05:37,480 في Python وJavaScript وحتى C، يمكنني أن أقوم بالقليل من العمليات الحسابية. 1538 01:05:37,480 --> 01:05:40,520 وإذا كنتُ أعرف أنهم ولدوا في هذا اليوم والشهر والسنة، 1539 01:05:40,520 --> 01:05:43,810 حسنًا، سأطرح ذلك فقط من اليوم والشهر والسنة الحاليين 1540 01:05:43,810 --> 01:05:47,020 وأكتشف كم هو عمرهم بالأيام أو السنوات-- لذا من المحتمل أنه أفضل قرار 1541 01:05:47,020 --> 01:05:48,620 تصميم هناك. 1542 01:05:48,620 --> 01:05:50,590 لكن يجب أن نوحد الشكل. 1543 01:05:50,590 --> 01:05:53,080 لا يمكننا السماح فقط لأشخاص من الولايات المتحدة وأوروبا وآسيا 1544 01:05:53,080 --> 01:05:54,780 اختيار أشكالهم الخاصة جميعًا. 1545 01:05:54,780 --> 01:05:57,880 تقوم SQL بتوحيد هذا-- سنة، سنة، سنة، سنة شرطة 1546 01:05:57,880 --> 01:05:59,920 شهر، شهر شرطة يوم، يوم. 1547 01:05:59,920 --> 01:06:02,480 وهذه هي قيمة وجود هذه الأنواع من البيانات مجددًا. 1548 01:06:02,480 --> 01:06:02,980 حسنًا. 1549 01:06:02,980 --> 01:06:05,277 إذن ماذا عن الرياضة-- آخر حقل؟ 1550 01:06:05,277 --> 01:06:06,770 الجمهور: Varchar. 1551 01:06:06,770 --> 01:06:08,530 ديفيد ج. مالان: Varchar، حسنًا. 1552 01:06:08,530 --> 01:06:12,242 ما هو أطول عدد من الكلمات في الرياضة؟ 1553 01:06:12,242 --> 01:06:14,950 الجمهور: لم أقل قد تريد القيام بها، لذا يمكن الوقوف هناك، 1554 01:06:14,950 --> 01:06:17,780 لكن ربما يجعل 255 الأمر منطقيًا أكثر. 1555 01:06:17,780 --> 01:06:20,610 ديفيد ج. مالان: ربما ما لم يكونوا رياضيين جدًا. 1556 01:06:20,610 --> 01:06:21,370 أجل. 1557 01:06:21,370 --> 01:06:22,510 هنا أيضًا لا أعلم. 1558 01:06:22,510 --> 01:06:24,910 ولكن فقط من أجل تقديم الاحتمالات، 1559 01:06:24,910 --> 01:06:27,797 عندما تعتقدون أن الشخص قد يكون إيضاحيًا قليلاً 1560 01:06:27,797 --> 01:06:30,130 ويكتب في الواقع فقرة عن جميع الألعاب الرياضية التي ينضم إليها 1561 01:06:30,130 --> 01:06:33,815 أو أي شيء أو حتى أكبر من فقرة، يكون النص أكبر. 1562 01:06:33,815 --> 01:06:35,440 الرياضة، ربما هذه ليست كلمة مقنعة. 1563 01:06:35,440 --> 01:06:36,790 وسأغيرها مجددًا إلى varchar. 1564 01:06:36,790 --> 01:06:38,830 ولكن إذا كتب شخص ما مقالاً في كليته 1565 01:06:38,830 --> 01:06:41,640 عن التطبيق المشترك، أو إذا كنتم 1566 01:06:41,640 --> 01:06:44,890 تطلبون من أشخاص لصق سيرهم الذاتية، أو ما شابه ذلك، فقد ترغبون في استخدام النص. 1567 01:06:44,890 --> 01:06:47,050 لأنه ليس لدي أي فكرة عن عدد الكلمات التي سيحصل عليها شخص ما. 1568 01:06:47,050 --> 01:06:49,030 يتيح لكم النص تخزين المزيد من البيانات. 1569 01:06:49,030 --> 01:06:50,710 لكنه يخزنها بشكل مختلف قليلاً. 1570 01:06:50,710 --> 01:06:53,770 إنه يميل إلى تخزينها ليس في العمود، ولكن باستخدام المؤشرات. 1571 01:06:53,770 --> 01:06:56,380 إذا كنتم تتذكرون منذ بضعة أسابيع، فإنه يستخدم المعادل 1572 01:06:56,380 --> 01:06:59,710 لذلك لتخزينها هناك، ويستغرق الوصول إليها وقتًا أطول قليلاً. 1573 01:06:59,710 --> 01:07:01,420 لذا مجددًا، هناك فقط مقايضة هنا. 1574 01:07:01,420 --> 01:07:04,357 إذن يمكننا القيام بإنشاء varchar 255-- 1575 01:07:04,357 --> 01:07:05,440 يجعلني متوترًا قليلاً. 1576 01:07:05,440 --> 01:07:08,130 لذلك سأنتقل إلى قيمة مشتركة أخرى. 1577 01:07:08,130 --> 01:07:11,455 1024، إنها قوة 2، ولكن لا توجد إجابة واحدة صحيحة هنا. 1578 01:07:11,455 --> 01:07:14,080 لكن قرارات التصميم غير الواضحة هذه التي يجب أن نتخذها. 1579 01:07:14,080 --> 01:07:16,650 إذا لم ارتكب أي أخطاء هنا، فسأمضي 1580 01:07:16,650 --> 01:07:18,820 قدمًا وأنقر فوق Create، وأوه-- 1581 01:07:18,820 --> 01:07:20,360 تم إنشاء جدول. 1582 01:07:20,360 --> 01:07:23,660 يمكنكم الآن رؤية جميع البيانات التي تم إنشاؤها هناك. 1583 01:07:23,660 --> 01:07:28,787 وها هي ذا، إذا عدتُ إلى froshims، وعدتُ إلى جدول المسجَّلين، 1584 01:07:28,787 --> 01:07:31,120 لا يمكنني تصفح ذلك فقط-- حيث لا يوجد أي شيء هناك حتى الآن. 1585 01:07:31,120 --> 01:07:34,450 يمكنني النظر في البنية ورؤية جميع تلك القيم نفسها 1586 01:07:34,450 --> 01:07:36,070 وتحرير بعضها مثل إعادة التسمية. 1587 01:07:36,070 --> 01:07:37,900 لكن لا يمكنكم تشويهها بالكامل. 1588 01:07:37,900 --> 01:07:40,750 ربما يجب أن تبدأوا من جديد إذا قمتم بإجراء تغييرات كثيرة جدًا. 1589 01:07:40,750 --> 01:07:41,500 حسنًا. 1590 01:07:41,500 --> 01:07:42,790 هل توجد أي أسئلة حول هذا؟ 1591 01:07:42,790 --> 01:07:43,290 أجل؟ 1592 01:07:43,290 --> 01:07:46,706 الجمهور: لماذا تستخدم 1024 بدلاً من 1023؟ 1593 01:07:46,706 --> 01:07:49,060 ديفيد ج. مالان: أو، لماذا أستخدم 1024 بدلاً من 1023. 1594 01:07:49,060 --> 01:07:52,990 عادة، عند اختيار-- أوه، التقليد. 1595 01:07:52,990 --> 01:07:54,330 لا يمكنني تبرير هذا. 1596 01:07:54,330 --> 01:07:58,060 255 كان الحد الأقصى لأنني أعتقد أن إحدى وحدات البايت كانت محفوظة لقيمة ما، 1597 01:07:58,060 --> 01:07:59,310 من الناحية التاريخية. 1598 01:07:59,310 --> 01:08:00,700 لكن هذا ليس صحيحًا بالفعل. 1599 01:08:00,700 --> 01:08:03,580 تم رفع هذا الحد، وليس هناك سبب وجيه. 1600 01:08:03,580 --> 01:08:07,130 الجمهور: كان يمكنك استخدام 255. 1601 01:08:07,130 --> 01:08:08,420 ديفيد ج. مالان: هذه الأيام، أجل. 1602 01:08:08,420 --> 01:08:11,134 منذ سنوات، 255 كان حد فعلي. 1603 01:08:11,134 --> 01:08:12,050 وهكذا تم تبنيه. 1604 01:08:12,050 --> 01:08:12,800 الآن، لا أعلم. 1605 01:08:12,800 --> 01:08:14,300 لقد اخترتُ فقط قوة 2 في كثير من الأحيان. 1606 01:08:14,300 --> 01:08:18,770 وبعد ذلك، سيكون الانتقال إلى 2048، و4096، وما إلى ذلك، ليس فقط. 1607 01:08:18,770 --> 01:08:19,660 أجل؟ 1608 01:08:19,660 --> 01:08:22,385 الحمهور: ما الفرق بين varchar وchar؟ 1609 01:08:22,385 --> 01:08:22,830 ديفيد ج. مالان: Varchar-- 1610 01:08:22,830 --> 01:08:24,856 ما الفرق بين varchar وchar؟ 1611 01:08:24,856 --> 01:08:30,319 تستخدم Char عددًا ثابتًا من وحدات البايت بغض النظر عن عددها الذي تستخدمونه، 1612 01:08:30,319 --> 01:08:33,020 وميزتها هي الأعمدة الخاصة بكم، من الناحية النظرية، 1613 01:08:33,020 --> 01:08:36,529 وهي مستقيمة تمامًا على الحافة اليسرى، والحافة اليمنى، مما يعني 1614 01:08:36,529 --> 01:08:39,890 أنه يمكنكم الوصول بشكل عشوائي لأن كل خلية هي عدد ثابت 1615 01:08:39,890 --> 01:08:41,689 من وحدات البايت من الباقي. 1616 01:08:41,689 --> 01:08:44,729 تستخدم Varchar مصفوفة رثة، كما يطلق عليها، 1617 01:08:44,729 --> 01:08:48,540 حيث يكون جانب واحد، الجانب الأيمن أقصر أو أطول في خلايا مختلفة. 1618 01:08:48,540 --> 01:08:51,050 لذا لا يوجد سوى الحد الأقصى للطول على كل من هذه الخلايا. 1619 01:08:51,050 --> 01:08:53,029 ولكن البحث عنه قد يكون أبطأ كنتيجة لذلك 1620 01:08:53,029 --> 01:08:55,100 لأنه لا يمكنكم الانتقال من خلية إلى خلية. 1621 01:08:55,100 --> 01:08:57,765 يجب أن تتبعوا أطوال تلك الأشياء. 1622 01:08:57,765 --> 01:08:58,640 هذه مقايضة. 1623 01:08:58,640 --> 01:08:59,242 أجل؟ 1624 01:08:59,242 --> 01:09:02,658 الجمهور: إذا كنتَ [INAUDIBLE] التعليم، فكيف يمكنك إضافته؟ 1625 01:09:02,658 --> 01:09:05,930 ديفيد ج. مالان: أوه، إذا أردتُ إضافة حقل تعليم الآن وتعديل 1626 01:09:05,930 --> 01:09:06,740 الجدول-- 1627 01:09:06,740 --> 01:09:09,979 إذا أدركتم بعد فوات الأوان، أوه، على سبيل المثال، أنا بحاجة إلى إضافة شيء إلى هذا، 1628 01:09:09,979 --> 01:09:13,710 في أداة واجهة المستخدم الرسومية، يمكننا إضافة حقل واحد في نهاية الجدول، 1629 01:09:13,710 --> 01:09:14,210 حرفيًا. 1630 01:09:14,210 --> 01:09:15,210 لذا لنقم بذلك. 1631 01:09:15,210 --> 01:09:16,460 دعوني أمضي قدمًا وأضغط على Go. 1632 01:09:16,460 --> 01:09:19,069 سأطالب بشكل متشابه، ولكن أصغر. 1633 01:09:19,069 --> 01:09:21,689 يمكنني المضي قدمًا وكتابة شيء مثل التعليم. 1634 01:09:21,689 --> 01:09:24,680 دعوني أقترح هذا varchar، ربما 255، 1635 01:09:24,680 --> 01:09:26,300 على الرغم من أنه يمكننا أن نخوض هذا النقاش أيضًا. 1636 01:09:26,300 --> 01:09:29,180 سأمضي قدمًا وأقول أضف حقولاً. 1637 01:09:29,180 --> 01:09:32,162 والآن لاحظوا أنه تم تغيير الجدول بنجاح. 1638 01:09:32,162 --> 01:09:34,370 في الواقع، لأي سبب من الأسباب، إنه لا يعرض لي 1639 01:09:34,370 --> 01:09:35,911 التعليمة البرمجية لهذا الأمر المعين. 1640 01:09:35,911 --> 01:09:39,104 ولكن هناك حرفيًا أمر ALTER في SQL 1641 01:09:39,104 --> 01:09:40,520 الذي يتيح لكم تغييره. 1642 01:09:40,520 --> 01:09:42,740 وإذا عدتُ إلى البنية الآن، سترى أن هناك 1643 01:09:42,740 --> 01:09:46,590 عمودًا آخر يُسمى التعليم يظهر بشكل ساخر 1644 01:09:46,590 --> 01:09:47,330 هنا كصف. 1645 01:09:47,330 --> 01:09:47,913 أجل؟ 1646 01:09:47,913 --> 01:09:50,520 الجمهور: هل يُعد ترتيب الأعمدة أمرًا مهمًا؟ 1647 01:09:50,520 --> 01:09:51,020 ديفيد ج. مالان: سؤال جيد. 1648 01:09:51,020 --> 01:09:52,609 هل يُعد ترتيب الأعمدة أمرًا مهمًا؟ 1649 01:09:52,609 --> 01:09:54,200 بشكل أساسي، لا يهم. 1650 01:09:54,200 --> 01:09:56,780 حسب التقليد، عادة ما تضعون المعرّف أولاً. 1651 01:09:56,780 --> 01:10:00,110 وبعد ذلك، سأقوم، بشكل شخصي، حسب التصميم، بوضع أهم الحقول التالية 1652 01:10:00,110 --> 01:10:02,000 مثل الاسم الذي يبدو أنه هو الاختيار الصحيح، 1653 01:10:02,000 --> 01:10:04,250 وربما يبدو أن البريد الإلكتروني هو الاختيار الصحيح، لقد فكرتُ في الأمر 1654 01:10:04,250 --> 01:10:05,870 في وقت متأخر قليلاً هذه المرة. 1655 01:10:05,870 --> 01:10:09,890 ليس من السهل إعادة ترتيب الأشياء في SQLite، ولكن يمكنكم ذلك في قواعد البيانات الأخرى. 1656 01:10:09,890 --> 01:10:12,200 لذا هناك، إنه تقليد بشري بشكل أكبر. 1657 01:10:12,200 --> 01:10:12,700 أجل؟ 1658 01:10:12,700 --> 01:10:16,082 الجمهور: هل هو تقليد أن تكون لديك كلمة رئيسية واحدة، 1659 01:10:16,082 --> 01:10:17,210 أو هل يمكن أن تكون لديك عدة كلمات رئيسية؟ 1660 01:10:17,210 --> 01:10:17,720 ديفيد ج. مالان: سؤال جيد. 1661 01:10:17,720 --> 01:10:20,886 هل هو تقليد أن تكون لديك كلمة رئيسية واحدة، أو هل يمكن أن تكون لديك عدة كلمات رئيسية؟ 1662 01:10:20,886 --> 01:10:22,910 حسب التعريف، يمكنكم فقط الحصول على كلمة واحدة. 1663 01:10:22,910 --> 01:10:26,670 ولكن يمكن أن تغطي هذه الكلمة الرئيسية عدة أعمدة. 1664 01:10:26,670 --> 01:10:29,480 لذلك لم نرَ حالة استخدام لهذا حتى الآن. 1665 01:10:29,480 --> 01:10:31,940 لكن هناك سيناريوهات حيث ستريدون قول، 1666 01:10:31,940 --> 01:10:35,580 أريد أن أضمن أن هذين العمودين معًا فريدان من نوعهما، 1667 01:10:35,580 --> 01:10:37,520 ولكن ليس كل واحد بمفرده فريدًا. 1668 01:10:37,520 --> 01:10:39,830 لكننا لن نصادف ذلك حتى الآن. 1669 01:10:39,830 --> 01:10:41,330 أي أسئلة أخرى، أجل؟ 1670 01:10:41,330 --> 01:10:43,250 الجمهور: ماذا لو أضفتَ التعليم 1671 01:10:43,250 --> 01:10:46,459 بعد أن بدأتَ بقاعدة البيانات، وكان ذلك حقلاً ليس فارغًا؟ 1672 01:10:46,459 --> 01:10:48,000 ديفيد ج. مالان: سؤال جيد حقًا. 1673 01:10:48,000 --> 01:10:52,880 ماذا لو أضفتَ التعليم بعد أن يكون لديك بالفعل بيانات حقيقية هناك، 1674 01:10:52,880 --> 01:10:55,040 ولكنك حددتَ أنها ليست فارغة، وهذا أمر مثير للمشاكل. 1675 01:10:55,040 --> 01:10:57,860 لأنه ما هي الخلفيات التعليمية للأشخاص السابقين؟ 1676 01:10:57,860 --> 01:11:00,276 عادة، ما يمكن أن تفعله قاعدة البيانات هو إما رفضه، 1677 01:11:00,276 --> 01:11:02,660 أو أنها ستضع فقط "سلسلة فارغة"، علامة اقتباس وعلامة إنهاء الاقتباس. 1678 01:11:02,660 --> 01:11:05,368 لذلك لا يعد ذلك من الناحية الفنية فارغًا، ولكن لا يوجد أي شيء في الواقع هناك. 1679 01:11:05,368 --> 01:11:07,250 إنها مجرد سلسلة من طول 0. 1680 01:11:07,250 --> 01:11:08,610 سؤال جيد حقًا. 1681 01:11:08,610 --> 01:11:09,110 حسنًا. 1682 01:11:09,110 --> 01:11:12,080 إذن، ما الذي يمكننا فعله الآن إنه قوي قليلاً؟ 1683 01:11:12,080 --> 01:11:15,032 حسنًا، دعوني أمضي قدمًا وأقوم بإدراج بعض البيانات بسرعة هنا. 1684 01:11:15,032 --> 01:11:16,490 سأحتفظ بمعظمها فارغًا. 1685 01:11:16,490 --> 01:11:16,970 لكن أتعرفون ماذا؟ 1686 01:11:16,970 --> 01:11:18,511 أنا لن أزعج نفسي باستخدام المعرّف. 1687 01:11:18,511 --> 01:11:20,520 براين لقد عدتَ إلى الفريق. 1688 01:11:20,520 --> 01:11:22,820 لنمضي قدمًا وندرج براين. 1689 01:11:22,820 --> 01:11:25,040 دعونا نمضي قدمًا الآن إلى المسجَّلين مجددًا. 1690 01:11:25,040 --> 01:11:28,250 لنمضي قدمًا ونضيف فيرونيكا مجددًا. 1691 01:11:28,250 --> 01:11:30,380 لذا أنا أقوم بإدراج بضعة صفوف يدويًا. 1692 01:11:30,380 --> 01:11:33,250 ومجددًا، لاحظوا أنه يُنفِّذ كل هذا من أجلي 1693 01:11:33,250 --> 01:11:35,000 دون أن أزعج نفسي بكتابته. 1694 01:11:35,000 --> 01:11:36,200 لكن يمكنني ذلك بالفعل. 1695 01:11:36,200 --> 01:11:38,450 في الواقع، فقط للقياس الجيد، دعونا نقوم بشيء آخر يدويًا. 1696 01:11:38,450 --> 01:11:41,780 إذا قمتُ بالنقر فوق علامة تبويب SQL، فلاحظوا أنه يمكنني الحصول على اقتراح افتراضي هنا. 1697 01:11:41,780 --> 01:11:44,210 هذه هي الصيغة التي يمكنكم من خلالها تحديد كل شيء. 1698 01:11:44,210 --> 01:11:47,810 أو يمكنني فقط كتابة إدراج في المسجَّلين. 1699 01:11:47,810 --> 01:11:49,680 ولكن الآن، إذا أردتُ فقط إدراج اسم، 1700 01:11:49,680 --> 01:11:51,440 لا يجب أن أقوم بكل هذه الأعمدة. 1701 01:11:51,440 --> 01:11:54,650 يمكنني فقط قول امضي قدمًا وأدرج هنا، إيرين، على سبيل المثال، 1702 01:11:54,650 --> 01:11:57,650 فاصلة منقوطة، وقم بالتصغير وانقر فوق Go. 1703 01:11:57,650 --> 01:11:58,970 يبدو أن هذا ينجح. 1704 01:11:58,970 --> 01:12:01,980 إذا عدتُ للمتصفح الآن، فإن إيرين موجود هناك أيضًا. 1705 01:12:01,980 --> 01:12:03,230 لكنكم سترون الاختلاف. 1706 01:12:03,230 --> 01:12:06,230 كان الاستعلام الذي يتم إنشاؤه تلقائيًا بواسطة واجهة المستخدم الرسومية 1707 01:12:06,230 --> 01:12:11,070 يدرج بالكاد علامة اقتباس وعلامة إنهاء الاقتباس، وهو ما يُطلق عليه سلسلة فارغة من الطول 0. 1708 01:12:11,070 --> 01:12:13,880 قمتُ، عن طريق تجاهل ذكر تلك الأعمدة، 1709 01:12:13,880 --> 01:12:15,470 بإدراج فارغ عن عمد. 1710 01:12:15,470 --> 01:12:17,761 لذا بصراحة، أصبحت قاعدة بياناتي فوضوية قليلاً هنا. 1711 01:12:17,761 --> 01:12:21,385 لذلك لا تستخدموا phpLiteAdminا بشكل عام أو واجهة المستخدم الرسومية لإدراج البيانات. 1712 01:12:21,385 --> 01:12:23,510 قد تستخدمونه لإنشاء الجداول الخاصة بكم بطريقة مناسبة 1713 01:12:23,510 --> 01:12:25,252 والحصول على التطبيق بالفعل. 1714 01:12:25,252 --> 01:12:27,210 ولكن ستكتبون التعليمة البرمجية في النهاية. 1715 01:12:27,210 --> 01:12:28,490 وهذا هو الاتجاه الذي سنتبعه. 1716 01:12:28,490 --> 01:12:30,200 وسأمضي قدمًا وأقوم بإدراج شخص إضافي واحد. 1717 01:12:30,200 --> 01:12:32,900 أوه، لقد نسيتُ أنني لستُ في الفريق على الإطلاق لأننا بدأنا من جديد. 1718 01:12:32,900 --> 01:12:36,020 لذا دعوني أضع نفسي في الفريق، ديفيد. 1719 01:12:36,020 --> 01:12:38,780 ودعوني أمضي قدمًا وأنقر فوق INSERT، وأعود إلى المسجَّلين، 1720 01:12:38,780 --> 01:12:40,070 والآن سترون أنه يوجد أربعة منا. 1721 01:12:40,070 --> 01:12:42,770 تغير المعرّف الخاص بي لأنهم قاموا بالإدراج في ترتيبات مختلفة. 1722 01:12:42,770 --> 01:12:46,727 ولكن لاحظوا أن كل الزيادة التلقائية قد حدثت بطريقة سحرية من أجلي. 1723 01:12:46,727 --> 01:12:49,310 وهذا أمر مفيد لأنه لا يجب أن أفكر في ذلك. 1724 01:12:49,310 --> 01:12:51,360 ومَن يهتم بما هو المعرّف الخاص بي. 1725 01:12:51,360 --> 01:12:55,470 أنا فقط أحتاج إلى، في كثير من الحالات، في قاعدة بيانات، معرّف فريد. 1726 01:12:55,470 --> 01:12:58,850 لذا الآن دعونا في الواقع نكتب بعض من التعليمة البرمجية، أليس كذلك؟ 1727 01:12:58,850 --> 01:13:00,807 حتى الآن لم نفعل أي شيء مفيد. 1728 01:13:00,807 --> 01:13:03,140 لقد عرضنا لكم هذه النافذة بالأبيض والأسود حيث يمكنكم 1729 01:13:03,140 --> 01:13:05,330 التحديد في بعض بيانات التحديث. 1730 01:13:05,330 --> 01:13:08,240 لكن هذا لا يحل أي مشاكل نعرفها حتى الآن. 1731 01:13:08,240 --> 01:13:10,000 لدينا هذه الواجهة الرسومية القائمة على الويب 1732 01:13:10,000 --> 01:13:13,217 والتي يمكنكم من خلالها إنشاء الجداول وإضافة البيانات، ولكن مَن يهتم؟ 1733 01:13:13,217 --> 01:13:14,800 نحن نحاول حل المشاكل الفعلية. 1734 01:13:14,800 --> 01:13:16,591 وكانت المشاكل في وقت متأخر لإنشاء 1735 01:13:16,591 --> 01:13:19,450 البرامج التي ستحل أي عدد من المشاكل البشرية 1736 01:13:19,450 --> 01:13:21,580 مثل خدمة المستخدمين وعرض النتائج 1737 01:13:21,580 --> 01:13:23,170 أو العثور على أوجه التشابه في الوثائق. 1738 01:13:23,170 --> 01:13:26,230 لذا لنفترض أن المشكلة المطروحة الآن هي في الواقع لبناء شيء مثل 1739 01:13:26,230 --> 01:13:30,220 موقع froshims على الويب والسماح للطلاب بالتسجيل ومن ثم معرفة 1740 01:13:30,220 --> 01:13:31,190 مَن تم تسجيله. 1741 01:13:31,190 --> 01:13:34,930 حسنًا، في الماضي، كنتُ كسولاً إلى حد ما، لنقص المعرفة الفنية، 1742 01:13:34,930 --> 01:13:38,830 فقط إرسال بريد إلكتروني بالمسجَّلين إلى المراقب أو RA الذي كان 1743 01:13:38,830 --> 01:13:40,840 يدير برنامج الرياضة الداخلي. 1744 01:13:40,840 --> 01:13:43,750 ولكن-- بدأتُ في وقت لاحق وضعه في ملفات CSV. 1745 01:13:43,750 --> 01:13:48,460 لنفترض الآن، الإصدار 3، بعد 20 عامًا، أريد التخزين في قاعدة بيانات فعلية. 1746 01:13:48,460 --> 01:13:51,310 كيف يمكنني فعل ذلك ومن ثم رؤية النتائج؟ 1747 01:13:51,310 --> 01:13:54,820 حسنًا، دعوني أنتقل إلى IDE مجددًا وأفتح، 1748 01:13:54,820 --> 01:14:00,640 على سبيل المثال، ملف جديد وسأمضي قدمًا وأطلق عليه lecture.py. 1749 01:14:00,640 --> 01:14:04,240 ولنفترض أنني أريد فقط أن أكتب برنامج Python بسيط يمكنكم من خلاله 1750 01:14:04,240 --> 01:14:06,340 تحديد البيانات من قاعدة البيانات. 1751 01:14:06,340 --> 01:14:08,240 إذن يتضح أنه يمكنني القيام ببضعة أشياء هنا. 1752 01:14:08,240 --> 01:14:14,110 أولاً وقبل كل شيء، دعوني أمضي قدمًا وأقوم، لنقل، من CS50، 1753 01:14:14,110 --> 01:14:17,470 لقد قمتُ سابقًا بأشياء مثل استيراد get_string وget_int 1754 01:14:17,470 --> 01:14:18,370 وما إلى ذلك. 1755 01:14:18,370 --> 01:14:22,390 يتضح أن مكتبة CS50 الخاصة بلغة Python تدعم أيضًا SQL. 1756 01:14:22,390 --> 01:14:24,430 وستعطينا دالة تُسمى 1757 01:14:24,430 --> 01:14:29,960 EXECUTE تتيح لكم تنفيذ أي أمر SQL، ولكن في تعليمة Python البرمجية. 1758 01:14:29,960 --> 01:14:33,370 لذا بدلاً من سحب SQLite3 بنفسي 1759 01:14:33,370 --> 01:14:36,320 أو الانتقال إلى واجهة المستخدم الرسومية phpLiteAdmin، 1760 01:14:36,320 --> 01:14:40,300 يمكنني كتابة التعليمة البرمجية التي تتحدث مباشرة إلى froshims.db، 1761 01:14:40,300 --> 01:14:44,540 وإزالة جميع تلك الأدوات تمامًا، وكتابة التعليمة البرمجية الآن فقط. 1762 01:14:44,540 --> 01:14:45,400 إذن كيف يُمكنني فعل هذا؟ 1763 01:14:45,400 --> 01:14:47,691 سأعلن عن متغير يُسمى db لقاعدة البيانات. 1764 01:14:47,691 --> 01:14:49,430 إذن يمكنني تسميته بأي اسم أريده. 1765 01:14:49,430 --> 01:14:51,670 وسأمضي قدمًا وأطلب دالة SQL هذه. 1766 01:14:51,670 --> 01:14:55,000 وسأقوم بالتمرير في سلسلة تبدو غير تقليدية إلى حد ما كوسيطة، 1767 01:14:55,000 --> 01:14:57,100 ولكنه تقليد قياسي، لنقول ما هي 1768 01:14:57,100 --> 01:14:59,120 تقنية قواعد البيانات التي تريدون استخدامها؟ 1769 01:14:59,120 --> 01:15:02,620 بعد ذلك، تقومون بكتابة نقطتين، خط مائل، خط مائل، خط مائل-- إذن إنها ثلاثة خطوط مائلة، 1770 01:15:02,620 --> 01:15:04,330 وليس الاثنان المعتادان في عنوان URL. 1771 01:15:04,330 --> 01:15:09,940 وسأقوم بتحديد froshims.db. 1772 01:15:09,940 --> 01:15:12,250 سيعطيني هذا الآن متغير Python الذي يُسمى 1773 01:15:12,250 --> 01:15:16,570 قاعدة البيانات التي تشبه مدخل، إذا صح التعبير، في ملف قاعدة البيانات هذا 1774 01:15:16,570 --> 01:15:20,650 الذي يمكنني إرسال SELECTs وINSERTs وDELETEs وUPDATEs إليه. 1775 01:15:20,650 --> 01:15:21,670 كيف يمكنني فعل هذ؟ 1776 01:15:21,670 --> 01:15:23,980 حسنًا، إذا كنتُ في النهاية، أريد تنفيذ 1777 01:15:23,980 --> 01:15:30,050 المعادل من تحديد نجمة من المسجَّلين، كيف يمكنني فعل ذلك؟ 1778 01:15:30,050 --> 01:15:32,020 حسنًا، أنا فقط محرر نص، أليس كذلك؟ 1779 01:15:32,020 --> 01:15:33,190 هذه هي CS50 IDE. 1780 01:15:33,190 --> 01:15:34,390 أنا فقط أكتب نصًا. 1781 01:15:34,390 --> 01:15:38,200 وعلاوة على ذلك، أنا أكتب نصًا في ملف Python، وهذه ليست Python. 1782 01:15:38,200 --> 01:15:42,280 وبالفعل، فإن IDE تحتوي على x الأحمر الصغير هذا الذي يقول، امم-امم، لا يمكنني القيام بذلك. 1783 01:15:42,280 --> 01:15:47,290 ولكن يمكنني تمرير تعليمة SQL البرمجية كمدخل لدالة Python 1784 01:15:47,290 --> 01:15:49,360 والسماح لهذه الدالة بالتحدث إلى قاعدة البيانات. 1785 01:15:49,360 --> 01:15:52,360 وبالفعل، هذا ما سنحصل عليه هنا من مكتبة CS50. 1786 01:15:52,360 --> 01:15:53,350 سأمضي قدمًا وأفعل هذا. 1787 01:15:53,350 --> 01:15:54,010 أتعلمون ماذا؟ 1788 01:15:54,010 --> 01:16:00,070 الوصول إلى قاعدة البيانات وتعليمة SQL البرمجية التالية EXECUTE، 1789 01:16:00,070 --> 01:16:03,770 علامة اقتباس وعلامة إنهاء الاقتباس، "التي" تغلق الأقواس. 1790 01:16:03,770 --> 01:16:07,705 الآن، ما هو خيار الإرجاع حسب التقليد؟ 1791 01:16:07,705 --> 01:16:09,200 ما الذي يجب أن أعيده؟ 1792 01:16:09,200 --> 01:16:14,020 حسنًا، في SQLite3، رأينا فقط جدولاً قائم على النص بشكل جيد 1793 01:16:14,020 --> 01:16:17,170 بسطور وخطوط مائلة تبدو كجدول، ولكنه كان مجرد نص. 1794 01:16:17,170 --> 01:16:20,939 phpLiteAdmin، رأينا بالفعل جداول HTML عندما كنتُ أتصفح قاعدة البيانات. 1795 01:16:20,939 --> 01:16:23,230 واقترحتُ ذلك شفهيًا قبل قليل، أتعرفون ماذا؟ 1796 01:16:23,230 --> 01:16:26,620 إذا كنتُ سأقوم بإرجاع كل هذه البيانات في التعليمة البرمجية، فما هو نوع البيانات 1797 01:16:26,620 --> 01:16:27,696 الذي أريده لنفسي كـ؟ 1798 01:16:27,696 --> 01:16:30,818 1799 01:16:30,818 --> 01:16:31,990 الصفوف. 1800 01:16:31,990 --> 01:16:33,610 أُريد صفوفًا من جدول. 1801 01:16:33,610 --> 01:16:35,560 اعرض لي جميع الطلاب الذين قاموا بالتسجيل. 1802 01:16:35,560 --> 01:16:37,600 ما هي بنية البيانات التي تبدو ملائمة في Python؟ 1803 01:16:37,600 --> 01:16:38,286 الجمهور: القائمة. 1804 01:16:38,286 --> 01:16:39,994 ديفيد ج. مالان: أجل، مجرد قائمة، أليس كذلك؟ 1805 01:16:39,994 --> 01:16:42,070 قائمة مُرتَبة من الصف الأول إلى الصف الأخير. 1806 01:16:42,070 --> 01:16:45,412 لذلك سنطلق على ذلك قائمة أو مصفوفة، كما كان في لغة C. لذا أتعرفون ماذا؟ 1807 01:16:45,412 --> 01:16:46,870 سأفترض أن هذا صحيح. 1808 01:16:46,870 --> 01:16:49,495 وإذا قرأتُ الوثائق، فسأجد أنها صحيحة. 1809 01:16:49,495 --> 01:16:53,290 دالة EXCUTE في CS50، إذا قمتم بتحديدها، فستقوم بإرجاع قائمة صفوف من أجلكم. 1810 01:16:53,290 --> 01:16:55,520 قد تحتوي على 0 من الصفوف إذا لم تكن هناك تطابقات. 1811 01:16:55,520 --> 01:16:58,500 ولكن قد تحتوي على 1000 صف إذا كانت هناك تطابقات كثيرة. 1812 01:16:58,500 --> 01:17:01,610 سأقوم بتخزين تلك النتائج، أينما كانت، في مصفوفة الصفوف الخاصة بي. 1813 01:17:01,610 --> 01:17:05,680 الآن، لنفترض أنني أريد طباعة مَن قام بالتسجيل في قاعدة بياناتي 1814 01:17:05,680 --> 01:17:07,929 من أي موقع froshims موجود. 1815 01:17:07,929 --> 01:17:09,970 أفترض أن الطلاب قاموا بالتسجيل على الويب. 1816 01:17:09,970 --> 01:17:12,700 الآن أنا فقط مراقب أو RA أحاول في الواقع 1817 01:17:12,700 --> 01:17:15,110 التلاعب بالبيانات والقيام بشيء ما بها. 1818 01:17:15,110 --> 01:17:15,940 إذن ما الذي يمكنني فعله؟ 1819 01:17:15,940 --> 01:17:18,700 حسنًا، بالنسبة إلى صف من الصفوف، ما الذي أريد فعله؟ 1820 01:17:18,700 --> 01:17:23,290 دعوني فقط أمضي قدمًا وأطبع مَن تم تسجيله. 1821 01:17:23,290 --> 01:17:26,150 إذن مَن تم تسجيله. 1822 01:17:26,150 --> 01:17:27,820 حسنًا، كيف يمكنني إدخال هذا؟ 1823 01:17:27,820 --> 01:17:29,710 حسنًا، هناك عدة طرق للقيام بذلك. 1824 01:17:29,710 --> 01:17:30,830 دعونا نرى. 1825 01:17:30,830 --> 01:17:34,600 أولاً، يمكنني استخدام صيغة العنصر النائب للطباعة. 1826 01:17:34,600 --> 01:17:36,340 ومن ثم أريد طباعة الصف. 1827 01:17:36,340 --> 01:17:38,880 ولكن ما الذي أريده من هذا الصف؟ 1828 01:17:38,880 --> 01:17:42,483 ما هي الأعمدة في أي صف في قاعدة البيانات هذه؟ 1829 01:17:42,483 --> 01:17:44,850 الجمهور: [INAUDIBLE] 1830 01:17:44,850 --> 01:17:47,481 ديفيد ج. مالان: معرّف واسم وسكن ورقم هاتف ورياضة. 1831 01:17:47,481 --> 01:17:50,730 حسنًا، يتضح أنه، سيتم تسليمها إليك كقواميس Python 1832 01:17:50,730 --> 01:17:52,090 أو بنيات dict. 1833 01:17:52,090 --> 01:17:54,780 لذا يمكنني فقط أن أقول صف علامة اقتباس وعلامة إنهاء الاقتباس، "اسم" هنا. 1834 01:17:54,780 --> 01:17:58,390 وسأستخدم علامة اقتباس واحدة فقط لجعل ما يحدث هنا واضحًا أكثر. 1835 01:17:58,390 --> 01:17:59,940 ثم أنا أحتاج إلى إجراء إصلاح واحد. 1836 01:17:59,940 --> 01:18:00,660 كيف يمكنني-- 1837 01:18:00,660 --> 01:18:01,500 الجمهور: F. 1838 01:18:01,500 --> 01:18:03,150 ديفيد ج. مالان: --F لسلسلة التنسيق. 1839 01:18:03,150 --> 01:18:04,380 لذلك تبدو مشفرة قليلاً. 1840 01:18:04,380 --> 01:18:05,880 لكن هذه فقط أشياء Python الآن. 1841 01:18:05,880 --> 01:18:07,290 الشيء الوحيد الجديد هو SQL. 1842 01:18:07,290 --> 01:18:10,520 ولكن إذا حدّدنا أن SQL، عند استخدام دالة التنفيذ هذه، 1843 01:18:10,520 --> 01:18:14,340 ستقدم لكم قائمة من الصفوف، كل منها 1844 01:18:14,340 --> 01:18:17,190 عبارة عن قاموس بحيث يمكنكم الحصول عليه في هذا العمود أو هذا العمود-- 1845 01:18:17,190 --> 01:18:18,690 المعرّف، أو الاسم، أو السكن-- 1846 01:18:18,690 --> 01:18:21,480 يبدو هذا الآن تقاربًا جميلاً في هذا الأسبوع-- 1847 01:18:21,480 --> 01:18:23,280 الآن، مع الأسبوعين الماضيين. 1848 01:18:23,280 --> 01:18:24,750 إذن دعوني أمضي قدمًا وأحفظ ذلك. 1849 01:18:24,750 --> 01:18:28,110 دعوني أمضي قدمًا وأعرض وحدة التحكم الخاصة بي، لذا أنا لدي نافذة طرفية. 1850 01:18:28,110 --> 01:18:31,392 ودعوني أمضي قدمًا وأقوم بتشغيل Python من lecture.py. 1851 01:18:31,392 --> 01:18:33,930 وفي غضون لحظات، إذا عقدتُ أصابعي، 1852 01:18:33,930 --> 01:18:37,026 آمل أن أرى مَن قام بالتسجيل. 1853 01:18:37,026 --> 01:18:38,340 مدهش. 1854 01:18:38,340 --> 01:18:39,600 لقد رأيت مَن تم تسجيله. 1855 01:18:39,600 --> 01:18:42,630 الآن يوجد سطر مخرج واحد لم أتوقعه، وهو هذا السطر فقط. 1856 01:18:42,630 --> 01:18:44,838 تُصبح هذه المكتبة مفيدة فقط من الناحية الموضوعية. 1857 01:18:44,838 --> 01:18:47,940 إنها تعرض لي كل أمر أرسلتُه إلى قاعدة البيانات. 1858 01:18:47,940 --> 01:18:50,190 ولكن سترون أن ذاك وذاك مُسجل. 1859 01:18:50,190 --> 01:18:51,490 إذن هذا مثير للاهتمام إلى حد ما. 1860 01:18:51,490 --> 01:18:53,031 إنه برنامج غبي إلى حد ما، أليس كذلك؟ 1861 01:18:53,031 --> 01:18:55,410 لأن معظم المراقبين لن يقوموا باختراق 1862 01:18:55,410 --> 01:18:58,039 froshims باستخدام نافذة طرفية وتشغيل نصوص Python. 1863 01:18:58,039 --> 01:19:00,330 من المحتمل أنهم سيرغبون في القيام بذلك عبر صفحة ويب 1864 01:19:00,330 --> 01:19:01,920 ليروا بالفعل مَن هو مُسجل. 1865 01:19:01,920 --> 01:19:04,770 ولكن إذا كانت لدينا القدرة في تعليمة Python البرمجية للقيام بذلك، على سبيل المثال، 1866 01:19:04,770 --> 01:19:08,910 التكرار، ما الذي يمكنني فعله بدلاً من من مجرد الطباعة على الشاشة؟ 1867 01:19:08,910 --> 01:19:12,630 ما الذي يمكنني طباعته للأسبوع الماضي ولمجموعة المشاكل السابقة؟ 1868 01:19:12,630 --> 01:19:14,070 يمكنني طباعة HTML، أليس كذلك؟ 1869 01:19:14,070 --> 01:19:16,069 على سبيل المثال، جميع الطلاب الذين سجلوا، يشعرون إلى حد ما 1870 01:19:16,069 --> 01:19:18,240 بأنها فرصة لقائمة غير مرتبة 1871 01:19:18,240 --> 01:19:20,610 أو قائمة مرتبة أو جدول أو أيًا كان. 1872 01:19:20,610 --> 01:19:22,080 يمكنكم الآن إنشاء HTML. 1873 01:19:22,080 --> 01:19:23,290 إذن دعوني أقوم بهذا. 1874 01:19:23,290 --> 01:19:27,270 دعوني أنتقل بالفعل إلى مثال قمتُ به مسبقًا. 1875 01:19:27,270 --> 01:19:30,330 ماذا لو مضيتُ قدمًا وفتحتُ layout.html. 1876 01:19:30,330 --> 01:19:33,210 ها هو تخطيط بسيط لتطبيق ويب باستخدام Flask. 1877 01:19:33,210 --> 01:19:35,430 بالنسبة لهؤلاء الذين ليسوا على دراية به، هذه HTML تقريبًا 1878 01:19:35,430 --> 01:19:39,750 بالإضافة إلى تقنية تُسمى Jinja، والتي تُعد تقنية قائمة على الويب لإنشاء 1879 01:19:39,750 --> 01:19:40,980 مواقع الويب بشكل ديناميكي. 1880 01:19:40,980 --> 01:19:43,770 من الواضح أن بنية هذه الصفحة هي ما تهمنا. 1881 01:19:43,770 --> 01:19:44,550 أتعلمون ما الأمر؟ 1882 01:19:44,550 --> 01:19:47,320 أراهن أنه يمكنني القيام ببعض المنطق هناك بالضبط. 1883 01:19:47,320 --> 01:19:48,780 إذن دعوني أمضي قدمًا وأفعل هذا. 1884 01:19:48,780 --> 01:19:52,960 دعوني أمضي قدمًا وأقوم بإنشاء، لنقل، ملف جديد. 1885 01:19:52,960 --> 01:19:55,871 دعونا نُسمي هذا application.py. 1886 01:19:55,871 --> 01:19:57,870 سأمضي قدمًا، توفيرًا للوقت فقط، 1887 01:19:57,870 --> 01:20:01,290 وأقوم بالقليل من النسخ واللصق لأوفر القيام ببعض ضغطات المفاتيح. 1888 01:20:01,290 --> 01:20:03,510 إذن، ها هو تطبيق ويب بسيط للغاية. 1889 01:20:03,510 --> 01:20:05,100 وسيكون هذا ما أفعله. 1890 01:20:05,100 --> 01:20:08,970 لذا إذا انتقلتُ هنا إلى القوالب، دعوني أفتح index.html-- 1891 01:20:08,970 --> 01:20:11,190 ودعوني أنتقل إلى هنا. 1892 01:20:11,190 --> 01:20:12,760 إذن خلاصة القول-- 1893 01:20:12,760 --> 01:20:14,800 ها هو ما يقودنا إليه هذا. 1894 01:20:14,800 --> 01:20:19,150 ماذا لو قمتُ بدلاً من ذلك بإنشاء قائمة غير مرتبة باستخدام تعليمة برمجية من الأسبوع الماضي، 1895 01:20:19,150 --> 01:20:21,930 لكنني أستخدم التكرار الحلقي من النوع for هنا داخل تطبيق الويب الخاص بي 1896 01:20:21,930 --> 01:20:25,430 في الواقع بدلاً من استخدام ملف lecture.py بسيط فقط. 1897 01:20:25,430 --> 01:20:27,690 حسنًا، تذكرون أنه يمكنني أن أفعل شيء كهذا. 1898 01:20:27,690 --> 01:20:29,340 يمكنني أن أحصل على تكرار Jinja حلقي. 1899 01:20:29,340 --> 01:20:32,640 إذن يمكنني قول شيء كهذا for row في rows. 1900 01:20:32,640 --> 01:20:35,790 ومن ثم، هنا بالأسفل، يمكنني القول بشكل استباقي شيء 1901 01:20:35,790 --> 01:20:40,140 مثل andfor، وهذه كانت الصيغة الغريبة الخاصة بنا من الأسبوع الماضي. 1902 01:20:40,140 --> 01:20:42,570 ومن ثم، هنا، يمكنني فقط إنشاء عنصر قائمة. 1903 01:20:42,570 --> 01:20:47,260 ومن ثم، إذا أردتُ عرض مَن قام بالتسجيل، فما الذي أكتبه هنا؟ 1904 01:20:47,260 --> 01:20:51,805 شيء بين هذه الأقواس المتعرجة إذا كان كل صف يُمثل مُسجَّل؟ 1905 01:20:51,805 --> 01:20:53,200 الجمهور: صف. 1906 01:20:53,200 --> 01:20:55,904 دايفيد مالان: اسم الصف مُسجل. 1907 01:20:55,904 --> 01:20:57,320 يمكنني القيام بشيء من هذا القبيل. 1908 01:20:57,320 --> 01:21:00,130 إذن الفكرة نفسها، أقوم بتغليفه فقط بالقليل من HTML. 1909 01:21:00,130 --> 01:21:02,819 الآن دعوني أنتقل إلى ملف application.py لأنني 1910 01:21:02,819 --> 01:21:04,360 سأضطر إلى ملء بعض الفراغات. 1911 01:21:04,360 --> 01:21:05,970 ودعوني أرى، كيف يمكنني القيام بذلك؟ 1912 01:21:05,970 --> 01:21:08,860 حسنًا، في النهاية، أريد إرجاع نتيجة تقديم 1913 01:21:08,860 --> 01:21:11,350 قالب يُسمى index.html. 1914 01:21:11,350 --> 01:21:13,710 للذين ليسوا على دراية بهذا، هذا فقط سطر من التعليمة البرمجية 1915 01:21:13,710 --> 01:21:16,180 يقول اعرض هذا الملف للمستخدم. 1916 01:21:16,180 --> 01:21:18,760 لكنني لا أريد فقط أن أعرض له الملف كما هو. 1917 01:21:18,760 --> 01:21:20,290 لكن دعونا على الأقل نحصل على هذا الإعداد. 1918 01:21:20,290 --> 01:21:25,340 أنا قلق من أنه قد لا يعمل بعد لأنني أحتاج إلى الحصول على البيانات الفعلية. 1919 01:21:25,340 --> 01:21:27,510 إذن كيف يمكنني الحصول على جميع الصفوف للمُسجَّلين لديّ؟ 1920 01:21:27,510 --> 01:21:31,390 حسنًا، يمكنني أن أفعل هذا صفوف يساوي db.execute. 1921 01:21:31,390 --> 01:21:36,470 ويمكنني أن أمضي قدمًا وأكتب تحديد نجمة من المُسجَّلين وأقوم بتخزين ذلك هناك. 1922 01:21:36,470 --> 01:21:39,989 يُطلق على هذا الملف froshims.db والذي قمتُ بإنشائه مُسبقًا. 1923 01:21:39,989 --> 01:21:42,280 وكل الأشياء الأخرى هي أشياء Flask فقط من الأسبوع الماضي. 1924 01:21:42,280 --> 01:21:43,190 لا شيء آخر جديد. 1925 01:21:43,190 --> 01:21:45,880 الشيء الوحيد الجديد هو هذا السطر هنا، 1926 01:21:45,880 --> 01:21:49,690 وهذا السطر هنا، والآن هذا السطر هنا حيث 1927 01:21:49,690 --> 01:21:53,200 أستخدم SQL داخل استدعاء Python عبر تمريره 1928 01:21:53,200 --> 01:21:55,450 كوسيطة إلى دالة تُسمى EXECUTE. 1929 01:21:55,450 --> 01:21:58,310 كيف يمكنني تمرير الصفوف إلى index.html؟ 1930 01:21:58,310 --> 01:21:59,290 الجمهور: [INAUDIBLE] 1931 01:21:59,290 --> 01:22:02,070 دايفيد ج. مالان: نعم، على سبيل المثال صفوف تساوي صفوف وهو التقليد الذي تبنّيناه. 1932 01:22:02,070 --> 01:22:03,900 يمكنكم تسميه أي شيء تريدونه، x يساوي y، 1933 01:22:03,900 --> 01:22:05,650 ولكن هذا مباشر أكثر قليلاً. 1934 01:22:05,650 --> 01:22:08,858 إذن هذا ما سنقوله، مرحبًا، قاعدة البيانات، قومي بإحضار جميع الصفوف من المُسجَّلين لديّ، 1935 01:22:08,858 --> 01:22:12,390 ثم تقديم قالب index.html، والتمرير في هذه الصفوف. 1936 01:22:12,390 --> 01:22:19,130 والآن، إذا حبستُ أنفاسى وقمتُ بتشغيل flask، لا توجد أخطاء في الصيغة. 1937 01:22:19,130 --> 01:22:21,590 إذا مضيتُ قدمًا وقمتُ بزيارة هذا هنا وفتحتُ-- 1938 01:22:21,590 --> 01:22:25,490 اللعنة-- علامة التبويب، أرى خطأ داخلي في الخادم. 1939 01:22:25,490 --> 01:22:28,080 إذن لحظة نتعلم منها، يا قوم. 1940 01:22:28,080 --> 01:22:31,590 دعونا نعود إلى نافذة المتصفح تلك هنا ونرى ما حدث. 1941 01:22:31,590 --> 01:22:32,090 حسنًا. 1942 01:22:32,090 --> 01:22:35,000 خطأ في صيغة القالب-- إذن خطأ غبي جدًا. 1943 01:22:35,000 --> 01:22:38,726 يبدو أنني توقعتُ قوسًا مربعًا بدلاً من قوس متعرج. 1944 01:22:38,726 --> 01:22:39,350 هذا قابل للإصلاح. 1945 01:22:39,350 --> 01:22:41,190 دعوني أنتقل إلى index.html. 1946 01:22:41,190 --> 01:22:43,070 وأوه، لم أُنهي فكرتي. 1947 01:22:43,070 --> 01:22:46,130 إذن هذا بعض من إحباطات البرمجة لهؤلاء 1948 01:22:46,130 --> 01:22:47,760 الذين يرون هذا لأول مرة. 1949 01:22:47,760 --> 01:22:48,950 دعوني أقوم بحفظ ذلك. 1950 01:22:48,950 --> 01:22:53,000 دعوني أعود إلى المتصفح هنا، وسنقوم فقط بإعادة التحميل. 1951 01:22:53,000 --> 01:22:56,600 يا إلهي، ها هي ذا، الآن لديّ صفحة ويب 1952 01:22:56,600 --> 01:22:58,640 التي يمكنكم عبرها رؤية مَن قام بالتسجيل. 1953 01:22:58,640 --> 01:22:59,390 لكن أتعرفون ماذا؟ 1954 01:22:59,390 --> 01:23:00,710 يمكننا جعل هذا قوي أكثر. 1955 01:23:00,710 --> 01:23:03,540 تذكرون أننا كنا نعبث باستخدام HTTP لبعض الوقت. 1956 01:23:03,540 --> 01:23:05,630 وإذا كان هذا هو عنوان URL الذي أصل إليه، فتذكّروا 1957 01:23:05,630 --> 01:23:08,580 أننا عبثنا بإعادة تنفيذ دالة البحث. 1958 01:23:08,580 --> 01:23:11,990 حسنًا، ماذا لو كنتُ أريد دعم بحث كهذا حتى يمكنني فقط زيارة q 1959 01:23:11,990 --> 01:23:15,650 يساوي ومن ثم البحث عن أسماء أشخاص، لنقل، براين 1960 01:23:15,650 --> 01:23:17,540 ورؤية عدد المُسجَّلين باسم براين. 1961 01:23:17,540 --> 01:23:19,500 هل يمكننا إضافة دعم لشيء مثل هذا؟ 1962 01:23:19,500 --> 01:23:20,030 حسنًا، ربما. 1963 01:23:20,030 --> 01:23:23,810 دعوني أعود إلى IDE، إلى application.py. 1964 01:23:23,810 --> 01:23:26,180 ودعوني أمضي قدمًا وأقول شيئًا من هذا القبيل. 1965 01:23:26,180 --> 01:23:32,420 q يساوي request.args احصل على q لرؤية ما إذا كان أي شيء موجود هناك بالفعل. 1966 01:23:32,420 --> 01:23:35,040 ثم دعوني أمضي قدمًا وأفعل هذا. 1967 01:23:35,040 --> 01:23:39,200 تحديد نجمة من المُسجَّلين حيث-- 1968 01:23:39,200 --> 01:23:41,360 دعوني أرى-- q حيث ماذا؟ 1969 01:23:41,360 --> 01:23:43,910 الاسم يساوي q. 1970 01:23:43,910 --> 01:23:45,020 لكنني أحتاج إلى عنصر نائب. 1971 01:23:45,020 --> 01:23:46,560 إذن ربما يجب أن أفعل هذا. 1972 01:23:46,560 --> 01:23:48,630 وبمجرد أن أفعل هذا، أحتاج إلى ماذا؟ 1973 01:23:48,630 --> 01:23:50,240 F لسلسلة تنسيق. 1974 01:23:50,240 --> 01:23:53,780 إذن يمكنني فقط إنشاء، وبشكل سريع، أمر SQL 1975 01:23:53,780 --> 01:23:56,270 الذي يمكنه إدخال قيمة q بين تلك الأقواس 1976 01:23:56,270 --> 01:23:59,540 المتعرجة للتعبير عن منطق تحديد جميع 1977 01:23:59,540 --> 01:24:03,200 المُسجَّلين حيث أسماؤهم تساوي براين أو فيرونيكا 1978 01:24:03,200 --> 01:24:04,910 أو اسم أي شخص كتبتُه. 1979 01:24:04,910 --> 01:24:06,960 دعوني أعود إلى المتصفح هنا. 1980 01:24:06,960 --> 01:24:10,190 دعوني أنتقل وأفعل شيء من هذا القبيل الآن. 1981 01:24:10,190 --> 01:24:13,850 علامة استفهام q يساوي براين-- سأعقد أصابعي كما فعلتُ من قبل. 1982 01:24:13,850 --> 01:24:14,480 اللعنة. 1983 01:24:14,480 --> 01:24:15,090 حسنًا. 1984 01:24:15,090 --> 01:24:18,320 وما هو الخطأ الذي قمتُ به هنا؟ 1985 01:24:18,320 --> 01:24:22,080 1986 01:24:22,080 --> 01:24:24,210 ما هو الخطأ الذي قمتُ به هنا؟ 1987 01:24:24,210 --> 01:24:26,280 هذا دقيق. 1988 01:24:26,280 --> 01:24:29,922 ونحن نرى هذا لأول مرة. 1989 01:24:29,922 --> 01:24:32,694 يعتقد أنه يوجد عمود يُسمى براين. 1990 01:24:32,694 --> 01:24:33,860 لكن لماذا يعتقد ذلك؟ 1991 01:24:33,860 --> 01:24:36,650 حسنًا، ما قمتُ به بفعالية تم إرساله في هذا. 1992 01:24:36,650 --> 01:24:38,960 لا تُعد براين كلمة رئيسية في SQL. 1993 01:24:38,960 --> 01:24:42,650 ولأنها سلسلة فعلية التي أقوم بمقارنتها معها، 1994 01:24:42,650 --> 01:24:45,110 ما أحتاج فعله في الواقع هو هذا. 1995 01:24:45,110 --> 01:24:48,980 وإلا ستعتقد SQLite أنه كاسم العمود أو شيء ما 1996 01:24:48,980 --> 01:24:51,620 قمتُ بإنشائه مُسبقًا إذن يجب أن نصلح ذلك. 1997 01:24:51,620 --> 01:24:52,440 لكن لا مشكلة. 1998 01:24:52,440 --> 01:24:53,780 يمكنني وضع علامات الاقتباس هناك. 1999 01:24:53,780 --> 01:24:57,320 ولكن على الأرجح يجب أن أضع q هناك في علامات الاقتباس. 2000 01:24:57,320 --> 01:25:01,590 دعوني أحفظ هذا، وأعود إلى المتصفح، وأُعيد تحميله. 2001 01:25:01,590 --> 01:25:02,330 وها نحن ذا. 2002 01:25:02,330 --> 01:25:04,546 الآن لدينا وظيفة لبراين. 2003 01:25:04,546 --> 01:25:06,920 إذن باستخدام هذه الكتلة البنائية الأساسية، ما الذي قمنا به؟ 2004 01:25:06,920 --> 01:25:09,470 حسنًا، في SQL، لدينا العديد من الأوامر تحت تصرفنا-- 2005 01:25:09,470 --> 01:25:12,560 إنشاء جدول، والذي يصبح بصراحة أمرًا مملاً عند كتابته. 2006 01:25:12,560 --> 01:25:15,980 أنا أميل إلى استخدام phpLiteAdmin وتوصيتها فقط لإنشاء الجدول الخاص بكم 2007 01:25:15,980 --> 01:25:16,820 وجعله يعمل. 2008 01:25:16,820 --> 01:25:21,380 ولكن يمكنكم بالتأكيد يدويًا، باستخدام SQLite3 أو phpLiteAdmin، إدراج معلومات، 2009 01:25:21,380 --> 01:25:24,440 أو تحديثها، أو حذفها، أو تحديدها 2010 01:25:24,440 --> 01:25:25,925 بمجرد أن تكون بالفعل في قاعدة البيانات. 2011 01:25:25,925 --> 01:25:27,050 وذلك قوي جدًا. 2012 01:25:27,050 --> 01:25:31,070 ولكن بمجرد القيام بذلك، يمكنكم الآن استخدام الصيغة الجديدة نفسها، تلك اللغة الجديدة 2013 01:25:31,070 --> 01:25:35,270 SQL، وتمريرها كمدخل باستخدام "سلسلة" إلى دالة EXECUTE لدينا، 2014 01:25:35,270 --> 01:25:39,080 والآن ابدأوا بسحب أي بيانات تريدونها من قاعدة بياناتكم. 2015 01:25:39,080 --> 01:25:41,629 الأسبوع الماضي، باستخدام ملفات CSV، إذا أردتم القيام بذلك، 2016 01:25:41,629 --> 01:25:44,420 كان يجب أن تفتحوا ملف CSV، واستخدام تكرار حلقي من النوع for للتكراره، 2017 01:25:44,420 --> 01:25:47,490 والبحث في كل عمود وصف عن بياناتكم، ثم تمريرها. 2018 01:25:47,490 --> 01:25:48,205 وهذا جيد. 2019 01:25:48,205 --> 01:25:48,830 هذا صحيح. 2020 01:25:48,830 --> 01:25:49,910 هذا ليس سيئًا. 2021 01:25:49,910 --> 01:25:50,639 لكنه مُمل. 2022 01:25:50,639 --> 01:25:52,680 وتعيدون اختراع العجلة مرارًا وتكرارًا. 2023 01:25:52,680 --> 01:25:56,000 ولا يوجد تصفية مُدمجة فيه كما توجد في SQL نفسها. 2024 01:25:56,000 --> 01:25:58,730 إذن لديكم الآن أداة أكثر تطورًا 2025 01:25:58,730 --> 01:26:04,470 في مجموعة الأدوات الخاصة بكم، إذا جاز التعبير يمكنكم عبرها حل ذلك النوع نفسه من المشاكل. 2026 01:26:04,470 --> 01:26:08,432 إذن أي أسئلة على هذه التقنية؟ 2027 01:26:08,432 --> 01:26:09,400 حسنًا. 2028 01:26:09,400 --> 01:26:13,897 حسنًا، دعونا ننظر إلى قاعدة بيانات أكبر ونرى إلى أين قد يؤدي بنا هذا الأمر؟ 2029 01:26:13,897 --> 01:26:15,730 إذن إذا انتقلتم إلى موقع الدورة على الويب، فسترون 2030 01:26:15,730 --> 01:26:19,464 قاعدة بيانات أكبر وهي في الواقع متاحة في تنسيقات متعددة، SQLite، 2031 01:26:19,464 --> 01:26:21,880 والتي سنراها في غضون لحظات، ولكن أيضًا جداول بيانات Google. 2032 01:26:21,880 --> 01:26:23,921 لأنها بصراحة، جيدة أكثر عند النظر 2033 01:26:23,921 --> 01:26:26,560 في الصفوف والأعمدة في GUI مما هو عليه، بالضرورة، 2034 01:26:26,560 --> 01:26:28,430 بالملف نفسه. 2035 01:26:28,430 --> 01:26:31,330 إذن يُصادف أن هذا نموذج قاعدة بيانات مجانية ومفتوحة المصدر. 2036 01:26:31,330 --> 01:26:35,260 على سبيل المثال، أخذ شخص ما، منذ سنوات، قاعدة بيانات iTunes الفعلية الخاصة به-- 2037 01:26:35,260 --> 01:26:37,750 كل الموسيقى التي اشتراها، كتب برنامجًا 2038 01:26:37,750 --> 01:26:40,450 لتحليل تنسيق ملف Apple في iTunes 2039 01:26:40,450 --> 01:26:43,090 واستخرج جميع البيانات التي يبدو أنه تم تخزينها عنه، 2040 01:26:43,090 --> 01:26:46,240 أعتقد كانت القصة، وجعلها فقط متاحة للعامة كنموذج 2041 01:26:46,240 --> 01:26:49,930 قاعدة بيانات للطلاب والمدرسين لاستخدامها فقط لمعالجة البيانات. 2042 01:26:49,930 --> 01:26:52,060 لكن الأمر المثير للاهتمام هو أن قاعدة البيانات هذه 2043 01:26:52,060 --> 01:26:55,870 تُثبت بعض المبادئ الأخرى التي لم نتطرق إليها حقًا. 2044 01:26:55,870 --> 01:27:01,610 على سبيل المثال، إذا كنتُ سأخزِّن، مرارًا وتكرارًا، 2045 01:27:01,610 --> 01:27:04,810 جميع هؤلاء الطلاب الذين يسجّلون في froshims، 2046 01:27:04,810 --> 01:27:07,840 ما الذي ترونه في حقول معينة؟ 2047 01:27:07,840 --> 01:27:11,080 حسنًا، كنتُ كسولاً قليلاً، ولم أحمّل نفسي عناء كتابة سكن الجميع. 2048 01:27:11,080 --> 01:27:14,049 لكن لنفترض أن المئات من الطلاب قد سجّلوا في froshims. 2049 01:27:14,049 --> 01:27:16,840 سيكون الكثير منهم من ماثيوز، بعضهم من بيني بايكر، 2050 01:27:16,840 --> 01:27:20,890 بعضهم من Candaday، وبعضهم من ويلد، ومجموعات المباني الأخرى في الحرم الجامعي. 2051 01:27:20,890 --> 01:27:22,810 يصبح الأمر سخيفًا قليلاً عندما 2052 01:27:22,810 --> 01:27:25,450 ترون ماثيوز، ماثيوز، ماثيوز، 2053 01:27:25,450 --> 01:27:27,520 متكررة كثيرًا-- مثل، 100 مرة أو أكثر. 2054 01:27:27,520 --> 01:27:30,670 إذا كان هناك 1600 طالب جديد، يوجد الكثير من الأطفال في ماثيوز. 2055 01:27:30,670 --> 01:27:35,289 ذلك عدد كبير من وحدات البايت ليتم تخزينه م-ا-ث-ي-و-- 2056 01:27:35,289 --> 01:27:35,830 لا أعرف. 2057 01:27:35,830 --> 01:27:36,600 هذا ليس مهمًا. 2058 01:27:36,600 --> 01:27:37,933 لا يهم كيف تتم تهجئتها. 2059 01:27:37,933 --> 01:27:41,380 ذلك عدد كبير من وحدات البايت ليتم تخزينه بالفعل في قاعدة بياناتكم مرارًا 2060 01:27:41,380 --> 01:27:42,127 وتكرارًا. 2061 01:27:42,127 --> 01:27:43,960 يبدو الأمر كما لو يجب أن تكون هناك فرصة 2062 01:27:43,960 --> 01:27:45,610 لفصل القواسم المشتركة. 2063 01:27:45,610 --> 01:27:48,610 وما يفعله الأشخاص عبر قواعد البيانات هو، بمجرد التعرف على نمط 2064 01:27:48,610 --> 01:27:52,390 متكرر للبيانات، والسلاسل نفسها مرارًا وتكرارًا، أتعلمون ماذا؟ 2065 01:27:52,390 --> 01:27:54,220 بدلاً من استخدام-- الآن التهجئة تهم-- 2066 01:27:54,220 --> 01:27:58,120 م-ا-ث-ي-و-ز-- وهي ست وحدات بايت. 2067 01:27:58,120 --> 01:28:05,860 أو ب-ي-ن-ي-ب-ا-ي-ك-ر، وهي تسع وحدات، لدينا الكثير من وحدات البايت المستخدمة 2068 01:28:05,860 --> 01:28:08,110 مرارًا وتكرارًا لتخزين جميع هذه المساكن. 2069 01:28:08,110 --> 01:28:08,693 أتعلمون ماذا؟ 2070 01:28:08,693 --> 01:28:10,690 ما هو أفضل من 9 أو 6 وحدات بايت؟ 2071 01:28:10,690 --> 01:28:13,870 دعونا فقط نستخدم int، أو دعونا نستخدم int صغير-- 2072 01:28:13,870 --> 01:28:16,850 وحدتين أو 4 وحدات بايت لتمثيل المساكن. 2073 01:28:16,850 --> 01:28:20,320 إذن بدلاً من تخزين ماثيوز، دعونا فقط نُخزِّن الرقم 8. 2074 01:28:20,320 --> 01:28:23,800 وبدلاً من بيني بايكر، دعونا نُخزِّن الرقم 9 فقط، وبالتالي، 2075 01:28:23,800 --> 01:28:27,190 باستخدام بعض وحدات البايت، ولكن عدد أقل، وبالتالي، 2076 01:28:27,190 --> 01:28:29,030 حفظ وحدات بايت على المدى الطويل. 2077 01:28:29,030 --> 01:28:32,680 إذن ما تُثبته قاعدة البيانات هذه هو بالضبط ذلك المبدأ. 2078 01:28:32,680 --> 01:28:36,880 بالتأكيد، عندما يتعلق الأمر بالموسيقى، حيث يمتلك الفنانون ألبومات عديدة 2079 01:28:36,880 --> 01:28:39,280 ولديهم أغاني كثيرة، من المحتمل أن 2080 01:28:39,280 --> 01:28:42,430 تخزين اسم الألبوم في قاعدة بيانات موسيقية أمرًا سخيفًا قليلاً 2081 01:28:42,430 --> 01:28:44,740 مرارًا وتكرارًا لـ 10 أو 12 2082 01:28:44,740 --> 01:28:47,530 أو 20 أغنية أو مقطع موسيقي في هذا الألبوم الخاص. 2083 01:28:47,530 --> 01:28:49,450 إذن ما فعله هذا الشخص هو هذا. 2084 01:28:49,450 --> 01:28:51,480 لاحظوا هنا، لدينا مجموعة كاملة من الأوراق. 2085 01:28:51,480 --> 01:28:53,890 أو فيما يتعلق بقاعدة البيانات، ستكون هذه جداول. 2086 01:28:53,890 --> 01:28:56,050 ولاحظوا أن هذه الجداول تحتوي على أعمدة. 2087 01:28:56,050 --> 01:28:58,060 ولاحظوا أن هذه الأعمدة هي معرّف الألبوم، 2088 01:28:58,060 --> 01:29:01,240 في جدول الألبوم، ومعرّف الألبوم وعنوانه. 2089 01:29:01,240 --> 01:29:06,070 ولكن لاحظوا ما فعله بذكاء شديد باستخدام هذا الحقل، معرّف الفنان. 2090 01:29:06,070 --> 01:29:09,550 يمتلك الفنانون أو المطربون الكثير من الأغاني بأسمائهم، في نهاية المطاف. 2091 01:29:09,550 --> 01:29:11,560 ولذا قام بتعيين قيمة فريدة لكل أغانيهم، 2092 01:29:11,560 --> 01:29:13,960 أو قامت Apple بذلك، في iTunes بشكل غير ظاهر. 2093 01:29:13,960 --> 01:29:17,260 إذن، كيف أعرف ما هو اسم هذا الفنان؟ 2094 01:29:17,260 --> 01:29:18,910 كيف يمكنكم اكتشاف ذلك؟ 2095 01:29:18,910 --> 01:29:23,120 هذا ليس مثيرًا للاهتمام بالنسبة لنا كبشر لنعرف، أوه، الرقم الثاني من معرّف الفنان. 2096 01:29:23,120 --> 01:29:24,490 هذا فقط-- ما هذا؟ 2097 01:29:24,490 --> 01:29:26,010 الجمهور: أنت بحاجة إلى جدول آخر للفنانين. 2098 01:29:26,010 --> 01:29:26,890 ديفيد ج. مالان: أجل. 2099 01:29:26,890 --> 01:29:29,270 نحتاج إلى جدول آخر للفنانين، وهذا صحيح هنا. 2100 01:29:29,270 --> 01:29:30,686 إذن دعوني أمضي قدمًا وأنظر هناك. 2101 01:29:30,686 --> 01:29:34,120 إذن إذا أردتُ أن أرى-- دعونا نرى، "Let there be rock،" الفنان رقم 1. 2102 01:29:34,120 --> 01:29:35,650 دعونا ننتقل إلى جدول الفنانين. 2103 01:29:35,650 --> 01:29:39,400 ويتضح أن، فرقة AC/DC، هي مَن قامت بغناء تلك الأغنية. 2104 01:29:39,400 --> 01:29:43,294 الآن أضفنا خطوة هنا، والتي ربما تستغرق بعض الوقت. 2105 01:29:43,294 --> 01:29:46,210 لكنها ستوفر مساحة على المدى الطويل إذا لم أُخزِّن أسماء 2106 01:29:46,210 --> 01:29:48,730 طويلة للفنانين-- على الرغم من أن AC/DC ليس اسمًا طويلاً جدًا-- 2107 01:29:48,730 --> 01:29:49,960 مرارًا وتكرارًا. 2108 01:29:49,960 --> 01:29:51,042 الآن، أيهما أفضل؟ 2109 01:29:51,042 --> 01:29:52,000 حسنًا، إنها مقايضة. 2110 01:29:52,000 --> 01:29:55,360 هل اعتدتم بشكل كبير علي إهدار المساحة وتخزين كل شيء معًا؟ 2111 01:29:55,360 --> 01:29:59,230 أو أنكم تفضلون توفير مساحة وفقط قضاء وقت أكثر قليلاً 2112 01:29:59,230 --> 01:30:01,010 في جمع البيانات مرة أخرى معًا؟ 2113 01:30:01,010 --> 01:30:03,100 ولكن سيصبح الأمر بالفعل مُزعجًا إذا، الآن، 2114 01:30:03,100 --> 01:30:06,040 إذا أردتُ إنشاء موقع ويب يعرض لي أسماء الأغاني 2115 01:30:06,040 --> 01:30:08,509 التي لديّ في قاعدة بيانات ومطربي تلك الأغاني، 2116 01:30:08,509 --> 01:30:11,800 ناهيك عن الألبومات، والأكثر من ذلك، عناوين المقاطع الموسيقية، وهكذا. 2117 01:30:11,800 --> 01:30:13,750 يبدو أن هناك ثلاثة استعلامات، أليس كذلك؟ 2118 01:30:13,750 --> 01:30:18,140 على سبيل المثال تحديد الألبوم، تحديد الفنان، تحديد العناوين-- 2119 01:30:18,140 --> 01:30:18,640 لكن لا. 2120 01:30:18,640 --> 01:30:21,670 باستخدام SQL، يمكنكم طي ذلك تمامًا. 2121 01:30:21,670 --> 01:30:24,110 لأنه لاحظوا، في هذا الجدول هنا، الفنان، 2122 01:30:24,110 --> 01:30:27,506 يوجد عمود يُسمى معرّف الفنان وهو عبارة عن أرقام. 2123 01:30:27,506 --> 01:30:29,380 ولاحظوا، إذا كنتم تتخيلون هذا، فإن 2124 01:30:29,380 --> 01:30:32,200 هذا يشبه أطراف الأصابع هنا-- دعونا نقترح بشكل مجازي-- 2125 01:30:32,200 --> 01:30:33,970 تمثيل معرّف الفنان. 2126 01:30:33,970 --> 01:30:38,200 إذا انتقلتُ إلى الألبوم الآن، لاحظوا أن لدينا معرّف الألبوم وعنوانه، 2127 01:30:38,200 --> 01:30:40,630 لكن لدينا أيضًا معرّف الفنان. 2128 01:30:40,630 --> 01:30:47,590 إذن إذا تخيلتم هذين الجدولين يتقاسمان هذا العمود المشترك، ماذا لو 2129 01:30:47,590 --> 01:30:50,410 قمنا بتجميعهما معًا هكذا، ليتطابق أحدهما 2130 01:30:50,410 --> 01:30:53,050 على اليسار، والآخر على اليمين، وبالتالي نعيد بناء 2131 01:30:53,050 --> 01:30:55,600 كل المعلومات وتكرارها حسب 2132 01:30:55,600 --> 01:30:59,340 الحاجة لكي أجد الألبوم والعنوان والفنان فقط. 2133 01:30:59,340 --> 01:31:00,910 حسنًا، كيف يمكنني التعبير عن ذلك؟ 2134 01:31:00,910 --> 01:31:05,680 حسنًا، دعوني أمضي قدمًا في CS50 IDE حيث لديّ نسخة من هذا الملف. 2135 01:31:05,680 --> 01:31:12,420 دعوني أغلق كل علامات التبويب من وقت سابق وأنتقل إلى هذا الملف الذي يُسمى lecture.db. 2136 01:31:12,420 --> 01:31:18,680 وفي lecture.db، في phpLiteAdmin، سنرى جميع هذه الجداول نفسها. 2137 01:31:18,680 --> 01:31:20,960 وقمتُ حرفيًا فقط باستيرادها إلى SQLite. 2138 01:31:20,960 --> 01:31:22,460 سترون جميع هذه الجداول نفسها. 2139 01:31:22,460 --> 01:31:23,919 يمكننا تصفح الألبوم تمامًا كما فعلنا من قبل. 2140 01:31:23,919 --> 01:31:26,126 ونرى فقط تنسيقًا مختلفًا للبيانات نفسها. 2141 01:31:26,126 --> 01:31:28,160 إنها البيانات نفسها من جدول بيانات Google، 2142 01:31:28,160 --> 01:31:29,760 وهو سهل الاستخدام بشكل كبير فقط. 2143 01:31:29,760 --> 01:31:31,650 ودعوني أمضي قدمًا وأفعل هذا. 2144 01:31:31,650 --> 01:31:35,960 يمكنني، بالطبع، تحدي نجمة من الألبوم 2145 01:31:35,960 --> 01:31:43,250 حيث معرّف الفنان لدينا يساوي 1 للحصول على جميع ألبومات AC/DC. 2146 01:31:43,250 --> 01:31:44,500 وبالفعل، هنا، لديّ اثنتان. 2147 01:31:44,500 --> 01:31:48,107 لدى هؤلاء أغنية For those about to rock، We salute you، وLet there be rock. 2148 01:31:48,107 --> 01:31:48,690 لديهم اثنتان. 2149 01:31:48,690 --> 01:31:52,850 ولكن لاحظوا، تحتوي الصفوف التي حصلت عليها فقط على أي معلومات؟ 2150 01:31:52,850 --> 01:31:56,330 عنوان معرّف الألبوم، ومعرّف الفنان. 2151 01:31:56,330 --> 01:31:59,600 أعرف فقط، كشخص، أن أوه، هذه هي ألبومات AC/DC. 2152 01:31:59,600 --> 01:32:03,080 ولكن ماذا لو أردتُ أن أعرف، حسنًا، أرى أن معرّف الفنان هو 1. 2153 01:32:03,080 --> 01:32:05,870 إذن حسنًا، جيد، دعوني أفتح علامة تبويب أخرى هنا. 2154 01:32:05,870 --> 01:32:12,570 والآن دعوني أقوم بتحديد نجمة من الفنان حيث معرّف الفنان يساوي 1. 2155 01:32:12,570 --> 01:32:16,010 ولذا إذا أردتُ أن أعرف شيئًا عن ذلك الفنان-- دعوني أمضي قدمًا 2156 01:32:16,010 --> 01:32:19,767 وأقوم بالتصغير، وأنقر فوق Go، وحسنًا-- الآن لقد حصلتُ على AC/DC. 2157 01:32:19,767 --> 01:32:20,600 حسنًا، هذا رائع. 2158 01:32:20,600 --> 01:32:23,760 الآن لديّ نتيجتان، مجموعتان من الصفوف. 2159 01:32:23,760 --> 01:32:24,560 هذا غبي. 2160 01:32:24,560 --> 01:32:28,160 الآن، سأقوم بإنشاء ذلك لنفسي فقط عن طريق الحصول على قيمتي إرجاع. 2161 01:32:28,160 --> 01:32:29,660 يمكنني استدعاء db EXECUTE مرتين. 2162 01:32:29,660 --> 01:32:31,400 لكن هناك طريقة أفضل. 2163 01:32:31,400 --> 01:32:35,479 يتضح أن، SQL تتيح لكم جمع الجداول فقط باستخدام SQL نفسها. 2164 01:32:35,479 --> 01:32:37,020 إذن سأمضي قدمًا وأفعل هذا. 2165 01:32:37,020 --> 01:32:40,910 سأمضي قدمًا وأقوم بتحديد نجمة من الألبوم، 2166 01:32:40,910 --> 01:32:47,770 ولكن أيضًا من الفنان حيث Album.Artistid-- 2167 01:32:47,770 --> 01:32:49,160 دعوني أنتقل إلى اليمين-- 2168 01:32:49,160 --> 01:32:53,030 يساوي Artist.Artistid. 2169 01:32:53,030 --> 01:32:56,760 إذن لاحظوا أنني أقول حدّد كل شيء من جدولين، 2170 01:32:56,760 --> 01:33:00,830 ولكن فقط قم بذلك حيث تحتوي جداول الألبوم، عمود معرّف 2171 01:33:00,830 --> 01:33:05,902 الفنان على نفس القيمة كجداول الفنان أي عمود معرّف الفنان. 2172 01:33:05,902 --> 01:33:08,360 هذا يشبه تجميع أصابعي معًا، بشكل مجازي، 2173 01:33:08,360 --> 01:33:10,730 للبحث عن هذا العمود المشترك. 2174 01:33:10,730 --> 01:33:15,750 إذا مضيتُ قدمًا، ونقرتُ فوق Go، رائع، انظروا ما الذي قمتُ بإنشائه للتو. 2175 01:33:15,750 --> 01:33:19,610 إنها معلومات كثيرة، ولكن لديّ معرّف الألبوم وعنوانه، 2176 01:33:19,610 --> 01:33:24,320 لديّ معرّف الفنانين، ولكن أيضًا لديّ اسم ذلك الفنان. 2177 01:33:24,320 --> 01:33:28,270 إذن إذا كنتم الآن تتذكرون تعليمة Python البرمجية، 2178 01:33:28,270 --> 01:33:30,860 أوه، يمكنني الآن الحصول على مجموعة كاملة من الصفوف التي تحتوي 2179 01:33:30,860 --> 01:33:32,570 كل شيء يهمني مرة واحدة. 2180 01:33:32,570 --> 01:33:34,220 لا أحتاج إلى إجراء عمليتي تحديد استعلامات. 2181 01:33:34,220 --> 01:33:36,170 يمكنني تجميع هذه الجداول بهذه الطريقة. 2182 01:33:36,170 --> 01:33:37,700 وأنا أستخدم كلمة تجميع بشكل متعمد. 2183 01:33:37,700 --> 01:33:40,770 يتضح أنه توجد طريقة أخرى للتعبير عن هذا الشيء نفسه. 2184 01:33:40,770 --> 01:33:44,390 بدلاً من استخدام صيغة الفاصلة تلك، قد ترون هذا أيضًا، 2185 01:33:44,390 --> 01:33:56,075 تحديد نجمة من الفنان تجميع الألبوم على Artist.Artistid يساوي-- 2186 01:33:56,075 --> 01:33:57,260 دعوني أقوم بالتمرير-- 2187 01:33:57,260 --> 01:33:59,477 Album.Artistid. 2188 01:33:59,477 --> 01:34:01,310 سيكون لهذا التأثير نفسه بالضبط، 2189 01:34:01,310 --> 01:34:04,268 ولكن قد تجدون فقط أنه يبدو بديهيًا أكثر لكم. 2190 01:34:04,268 --> 01:34:07,752 حدّد كل شيء من نتيجة تجميع هذين الجدولين. 2191 01:34:07,752 --> 01:34:08,960 كيف تريدون تجميعهما؟ 2192 01:34:08,960 --> 01:34:12,606 حسنًا، قم بتجميعهما على هذا يساوي ذلك-- 2193 01:34:12,606 --> 01:34:14,480 مجرد طريقة أخرى للتعبير عن الفكرة نفسها. 2194 01:34:14,480 --> 01:34:17,180 وإذا قمتُ بالنقر فوق Go، فسأحصل على المعلومات نفسها. 2195 01:34:17,180 --> 01:34:20,420 إذن في نهاية المطاف، باستخدام التجميعات هل لدينا القدرة على إعادة تجميع البيانات. 2196 01:34:20,420 --> 01:34:24,290 إذن من ناحية، هذا فقط تدريب جيد على تطبيع قاعدة البيانات لديكم. 2197 01:34:24,290 --> 01:34:27,560 تحديد الأعمدة التي تحتوي على الكثير جدًا من التكرارات، وفقط 2198 01:34:27,560 --> 01:34:29,510 تخزين تلك المعلومات مرة واحدة. 2199 01:34:29,510 --> 01:34:31,790 على سبيل المثال، CS50 Finance، إذا كنتم تدعمون 2200 01:34:31,790 --> 01:34:36,170 العديد من المستخدمين المختلفين، في كل مرة يشتري فيها مالان أو براين أو فيرونيكا سهمًا، 2201 01:34:36,170 --> 01:34:38,660 يبدو الأمر سخيفًا قليلاً لتخزين مالان 2202 01:34:38,660 --> 01:34:42,830 أو براين أو فيرونيكا بجانب Netflix، الرمز، وعدد الأسهم 2203 01:34:42,830 --> 01:34:43,790 التي اشتراها أحدنا. 2204 01:34:43,790 --> 01:34:45,640 لأن مالان، مالان، مالان، مالان 2205 01:34:45,640 --> 01:34:46,750 ستظهر جميعها في قاعدة البيانات. 2206 01:34:46,750 --> 01:34:49,716 وماذا لو قمتُ بتغيير اسم المستخدم لديّ أو اسمي أو أصبح أي شخص متزوج 2207 01:34:49,716 --> 01:34:50,840 وبالتالي، يتغير؟ 2208 01:34:50,840 --> 01:34:53,006 مثلاًَ، لماذا تخلقون تلك الفوضى لأنفسكم؟ 2209 01:34:53,006 --> 01:34:57,860 بدلاً من ذلك، أعطوني أنا وبراين وفيرونيكا وكل شخص آخر معرّفًا فريدًا. 2210 01:34:57,860 --> 01:35:03,350 وعندما يقومون بشراء شيء ما، فقط قوموا بتخزين معرّف المستخدم أو العميل الخاص بهم 2211 01:35:03,350 --> 01:35:07,280 أو أيًا كانت الطريقة التي تريدون أن تفكروا بها في ذلك، تمامًا مثل معرّف الألبوم ومعرّف الفنان. 2212 01:35:07,280 --> 01:35:10,370 ولذا تطبيع قاعدة البيانات يدور حول إيجاد تلك القواسم المشتركة 2213 01:35:10,370 --> 01:35:12,470 ونقل البيانات إلى الجدول الخاص بها. 2214 01:35:12,470 --> 01:35:14,640 وإذا كنتم تهتمون بإعادة تجميعها، فقط استخدموا 2215 01:35:14,640 --> 01:35:18,300 SQL لإعادة إنشاء عرض البيانات ذلك، إذا جاز التعبير. 2216 01:35:18,300 --> 01:35:21,020 إذن ما الذي يمكننا فعله هنا أيضًا؟ 2217 01:35:21,020 --> 01:35:24,200 يتضح أن في SQL يوجد، ليس فقط مفاتيح أساسية، 2218 01:35:24,200 --> 01:35:27,320 ولكن توجد أيضًا قيود فريدة في بعض قواعد البيانات حيث يمكنكم تحديد، 2219 01:35:27,320 --> 01:35:29,940 هذا ليس المفتاح الأساسي الخاص بي، ولكنني أريده أن يكون فريدًا. 2220 01:35:29,940 --> 01:35:32,220 يمكنكم أن تحددوا أنه يجب فهرسة شيء ما. 2221 01:35:32,220 --> 01:35:35,510 إذن يتّضح أنه، إذا كنتم فقط تعرفون أنه يوجد حقل في قاعدة بياناتكم 2222 01:35:35,510 --> 01:35:38,180 التي تريدون أن تتمكّنوا من البحث فيه بفعالية كبيرة، 2223 01:35:38,180 --> 01:35:39,776 يُمكنكم فهرستها مُسبقًا. 2224 01:35:39,776 --> 01:35:42,650 وسترون أو ستتمكّنوا من فعل ذلك إذا أردتم ذلك في المشاريع النهائية 2225 01:35:42,650 --> 01:35:44,970 أو حتى لمجموعة المشاكل القادمة إذا كنتم تريدون ذلك. 2226 01:35:44,970 --> 01:35:47,660 لكن ما يُمكّنه هذا هو استعلامات مثل هذه. 2227 01:35:47,660 --> 01:35:50,900 إذا أردتُ أن أمضي قدمًا وأبحث عن، على سبيل المثال-- 2228 01:35:50,900 --> 01:35:53,560 2229 01:35:53,560 --> 01:35:55,490 ما الذي سيكون مثالاً جيدًا؟ 2230 01:35:55,490 --> 01:35:56,090 الروك. 2231 01:35:56,090 --> 01:35:57,560 أنا مهتم بموسيقى الروك. 2232 01:35:57,560 --> 01:36:00,740 لذا إذا أردتُ أن أنتقل إلى علامة تبويب SQL هنا. 2233 01:36:00,740 --> 01:36:02,150 يمكنني قول شيء من هذا القبيل. 2234 01:36:02,150 --> 01:36:07,460 تحديد نجمة من الألبوم حيث الاسم لا يساوي، 2235 01:36:07,460 --> 01:36:11,510 ولكن حيث الاسم مثل ومن ثم سأقول "موسيقى الروك." 2236 01:36:11,510 --> 01:36:14,550 ولكن إذا أردتُ أن يأتي أي عدد من الأحرف قبل هذه الكلمة، 2237 01:36:14,550 --> 01:36:15,724 يمكنني استخدام علامة النسبة المئوية. 2238 01:36:15,724 --> 01:36:18,390 وإذا جاء أي عدد من الأحرف بعدها، يمكنني استخدام علامة النسبة المئوية. 2239 01:36:18,390 --> 01:36:19,431 هذه مثل أحرف البدل. 2240 01:36:19,431 --> 01:36:21,240 في معظم اللغات، ستستخدمون نجمة. 2241 01:36:21,240 --> 01:36:23,280 في SQL، تستخدمون علامات النسبة المئوية. 2242 01:36:23,280 --> 01:36:24,640 لكنها تعني الأمر نفسه. 2243 01:36:24,640 --> 01:36:27,840 وإذا مضيتُ قدمًا وقلتُ go، الآن أعود-- 2244 01:36:27,840 --> 01:36:32,340 أوه، أحصل على، حصلتُ على المحاضرة الخاطئة، الألبوم، أوه، أعتقد أن ما أردتُه هو عنوان. 2245 01:36:32,340 --> 01:36:33,720 دعوني أحاول ذلك مجددًا، عذرًا-- 2246 01:36:33,720 --> 01:36:36,780 حيث العنوان مثل "الروك"-- 2247 01:36:36,780 --> 01:36:38,250 دعوني أمضي قدمًا وأنقر فوق Go. 2248 01:36:38,250 --> 01:36:41,970 وها هي ذا، الألبومات جميعها في قاعدة البيانات التي 2249 01:36:41,970 --> 01:36:43,430 تحتوي على كلمة روك. 2250 01:36:43,430 --> 01:36:48,120 الآن، كملاحظة جانبية، يحتوي هذا الجدول على الكثير من الألبومات. 2251 01:36:48,120 --> 01:36:49,800 وبصراحة، إنه صغير بما يكفي. 2252 01:36:49,800 --> 01:36:51,930 إنه يحتوي على مئات الصفوف، ربما بضعة آلاف من الصفوف. 2253 01:36:51,930 --> 01:36:55,410 لن يلاحظ أي واحد منا نحن البشر مدى بُطء البحث الخطي حقًا. 2254 01:36:55,410 --> 01:36:58,050 لكن إذا بدأتم بالحصول على آلاف الصفوف، أو عشرات الآلاف 2255 01:36:58,050 --> 01:37:01,050 من الصفوف، أو ملايين الصفوف، بدون فهرس 2256 01:37:01,050 --> 01:37:04,230 هذا يعني أن البحث عن شيء مثل روك سيبدأ في الأعلى 2257 01:37:04,230 --> 01:37:07,770 والبحث في كل حقل على طول الطريق إلى الأسفل، حرف O كبير من n. 2258 01:37:07,770 --> 01:37:09,720 بدلاً من ذلك إذا أخبرتم قاعدة البيانات، أعلم أنني 2259 01:37:09,720 --> 01:37:13,200 سأبحث في هذا العمود كثيرًا، من فضلك قم بفهرسته من أجلي، 2260 01:37:13,200 --> 01:37:14,450 ها هي الخلطة السرية. 2261 01:37:14,450 --> 01:37:17,700 SQLite، وOracle، وMicrosoft Access، وما إلى ذلك، فهم 2262 01:37:17,700 --> 01:37:19,650 سيقومون، باستخدام الملكية الفكرية الخاصة بهم، 2263 01:37:19,650 --> 01:37:22,830 بإنشاء بعض بنيات البيانات الرائعة-- أشجار، أو جداول علامة تجزئة، 2264 01:37:22,830 --> 01:37:30,390 أو أي شيء في الذاكرة، وتخزين البيانات لكم بطريقة غير مرئية في هذا التنسيق 2265 01:37:30,390 --> 01:37:33,840 إذن، عندما تطرحون سؤالاً على سبيل المثال، اعرض لي جميع الألبومات مثل روك، 2266 01:37:33,840 --> 01:37:37,800 يمكنها أن تجيب بشكل أسرع بكثير من الإجابة الخطية. 2267 01:37:37,800 --> 01:37:41,020 وهذا أيضًا هو ما تحصلون عليه باستخدام SQL وليس باستخدام ملفات CSV. 2268 01:37:41,020 --> 01:37:43,717 تُعد ملفات CSV، حسب طبيعتها، خطية فقط. 2269 01:37:43,717 --> 01:37:44,550 إذن يمكننا فعل ما هو أفضل. 2270 01:37:44,550 --> 01:37:46,980 لكنكم، كمبرمجين، يجب أن تساعدوا قاعدة البيانات 2271 01:37:46,980 --> 01:37:49,540 وتعطوها بالفعل تلك التلميحات، ليست فقط الأنواع، 2272 01:37:49,540 --> 01:37:50,600 ولكن تلميحات أيضًا كهذه. 2273 01:37:50,600 --> 01:37:52,410 وكملاحظة جانبية، هناك أيضًا فكرة المفاتيح الخارجية 2274 01:37:52,410 --> 01:37:55,260 حيث، إذا أردتم حقًا قفل أشياء، فيمكنكم تحديد ذلك، 2275 01:37:55,260 --> 01:37:58,570 إذا رأيتم ذلك من قبل في معرّف الألبوم في جدول آخر، 2276 01:37:58,570 --> 01:38:00,930 إذا كانت الكلمة الرئيسية في جدول الألبومات، 2277 01:38:00,930 --> 01:38:04,080 حسب التعريف، في الجدول الآخر، ستتم تسميتها كلمة رئيسية خارجية. 2278 01:38:04,080 --> 01:38:06,120 لأنه بالفعل لا تنتمي إلى هناك، لكنها 2279 01:38:06,120 --> 01:38:08,370 تشير إلى عمود في مكان آخر. 2280 01:38:08,370 --> 01:38:10,519 إذن توجد تقنيات ومفردات كثيرة. 2281 01:38:10,519 --> 01:38:12,060 ونرحب بكم لتتعمقوا في الأمر أكثر. 2282 01:38:12,060 --> 01:38:13,890 والاحتمالات هي، أن الكثير منكم سيفعل ذلك في المشاريع النهائية، 2283 01:38:13,890 --> 01:38:16,410 حسب طبيعة الرغبة في ميزات معينة، من بينها، حتى 2284 01:38:16,410 --> 01:38:18,840 تلك التي رأيناها مثل الزيادة التلقائية وليس فارغ. 2285 01:38:18,840 --> 01:38:21,000 كملاحظة جانبية أيضًا، حتى SQL تحتوي على دالات. 2286 01:38:21,000 --> 01:38:22,830 وبالنسبة إلى علماء البيانات والإحصائيين 2287 01:38:22,830 --> 01:38:26,100 إنها مفيدة للغاية لتتمكّنوا فقط من القيام بعملية حسابية وتلخيص البيانات مباشرة 2288 01:38:26,100 --> 01:38:29,760 داخل SQL دون كتابة تعليمة Python البرمجية أو R أو أي شيء آخر. 2289 01:38:29,760 --> 01:38:32,460 يتم الإنشاء في SQLite وقواعد البيانات الأخرى هي 2290 01:38:32,460 --> 01:38:34,860 دالات مثل هذه للمتوسط، وحساب أشياء، والحصول على 2291 01:38:34,860 --> 01:38:36,690 الحد الأدنى، والأقصى، والمجموع، وهكذا-- 2292 01:38:36,690 --> 01:38:39,640 تحصلون على كل هذا مجانًا باستخدام قواعد البيانات متعددة. 2293 01:38:39,640 --> 01:38:43,000 كل ما يتطلبه الأمر في سياق Python هو سطر كهذا. 2294 01:38:43,000 --> 01:38:47,220 لكن، لكن، لكن توجد بعض المشاكل. 2295 01:38:47,220 --> 01:38:51,030 ودعونا ننهي الأمر من خلال إلقاء نظرة على مشكلتين من المشاكل والتهديدات الأساسية التي 2296 01:38:51,030 --> 01:38:52,410 لا يتم تقديرها بالفعل في كثير من الأحيان. 2297 01:38:52,410 --> 01:38:56,940 في الواقع، علينا إصلاح ثغرة خطيرة جدًا قمتُ بتقديمها 2298 01:38:56,940 --> 01:38:58,740 في تعليمتي البرمجية في وقت سابق. 2299 01:38:58,740 --> 01:39:01,050 ولكن أولاً، ما يُسمى بشرط التعارُض. 2300 01:39:01,050 --> 01:39:04,650 في الاستقصاء-- أو بالأحرى، دعونا نرى-- 2301 01:39:04,650 --> 01:39:08,910 لنفترض أننا رجعنا بالذاكرة إلى بداية الفصل الدراسي، حيث قام معظمكم 2302 01:39:08,910 --> 01:39:11,820 بالتسجيل على حساب GitHub للمرة الأولى. 2303 01:39:11,820 --> 01:39:13,470 وانتقلتم إلى github.com/signup. 2304 01:39:13,470 --> 01:39:15,420 بالنسبة لمَن ليسوا على دراية به، GitHub هو موقع ويب 2305 01:39:15,420 --> 01:39:17,550 حيث يمكنكم حفظ وتخزين برمجة التعليمة البرمجية التي قمتم بكتابتها 2306 01:39:17,550 --> 01:39:19,174 وتريدون التعاون مع الآخرين عليها. 2307 01:39:19,174 --> 01:39:20,470 واخترتم اسم مستخدم. 2308 01:39:20,470 --> 01:39:24,630 ودعوني أمضي قدمًا وأحاول اختيار اسم مستخدم، على سبيل المثال، jharvard 2309 01:39:24,630 --> 01:39:25,890 لجون هارفارد. 2310 01:39:25,890 --> 01:39:28,830 لاحظوا أن الموقع على الفور قال أن اسم المستخدم موجود. 2311 01:39:28,830 --> 01:39:30,120 حسنًا، هذا مفيد. 2312 01:39:30,120 --> 01:39:33,119 ومن المحتمل أنه يمكنكم تخمين كيف يتم هذا الأمر-- ربما بعض JavaScript، 2313 01:39:33,119 --> 01:39:35,580 باستخدام AJAX، والتحدث إلى الخادم، والحصول على الاستجابة، 2314 01:39:35,580 --> 01:39:37,740 وتغيير HTML أو CSS أو أيًا كانت. 2315 01:39:37,740 --> 01:39:39,960 قد يستغرق ربط كل ذلك معًا بعض الوقت. 2316 01:39:39,960 --> 01:39:42,070 لكن هذا ما يحدث على الأرجح. 2317 01:39:42,070 --> 01:39:49,140 إذن دعوني أُجرب اسم مستخدم طويل وعشوائي جدًا غير موجود. 2318 01:39:49,140 --> 01:39:51,240 مهلاً، إنه متوفر. 2319 01:39:51,240 --> 01:39:54,290 ولكن من المحتمل أنه ليس أمرًا جيدًا لكي أقوم ببث هذا على الإنترنت. 2320 01:39:54,290 --> 01:39:57,290 لأنه إذا انتظرتُ طويلاً بما فيه الكفاية، أراهن أن شخص ما يمكنه، للتسلية، 2321 01:39:57,290 --> 01:39:59,940 فقط التسجيل بهذا، ناهيك عن أي شخص في هذه الغرفة. 2322 01:39:59,940 --> 01:40:02,650 ولكنك أخبرتني للتو أنه متوفر. 2323 01:40:02,650 --> 01:40:03,150 جيد جدًا. 2324 01:40:03,150 --> 01:40:03,985 أنا متحمس جدًا. 2325 01:40:03,985 --> 01:40:04,860 لقد حصلتُ على اسم المستخدم الخاص بي. 2326 01:40:04,860 --> 01:40:07,220 دعوني أمضي قدمًا وأكتب عنوان بريدي الإلكتروني، 2327 01:40:07,220 --> 01:40:11,100 malan@harvard.edu، كلمة المرور الخاصة بي، 12345-- يستغرق الأمر بضع لحظات هناك. 2328 01:40:11,100 --> 01:40:12,540 التحقّق من حسابي وهكذا. 2329 01:40:12,540 --> 01:40:13,890 ثم أنقر فوق Submit. 2330 01:40:13,890 --> 01:40:18,690 لنفترض أنه تم إخباري، بشكل مؤقت، معذرةً، اسم المستخدم هذا موجود بالفعل. 2331 01:40:18,690 --> 01:40:20,700 هل يمكن أن يحدث ذلك؟ 2332 01:40:20,700 --> 01:40:23,400 نعم، إذا حاول أحدكم أن يعبث معي الآن، 2333 01:40:23,400 --> 01:40:26,430 فقد تقومون بالتسجيل باسم المستخدم ذلك وتسبقوني 2334 01:40:26,430 --> 01:40:29,040 لذا عندما أضغط على الانضمام، أحصل على خطأ. 2335 01:40:29,040 --> 01:40:33,006 هذا هو تعريف شرط التعارض حيث يوجد شخصان أو مستخدمان 2336 01:40:33,006 --> 01:40:34,380 أو جهازا كمبيوتر أو مُؤشرا ترابط-- 2337 01:40:34,380 --> 01:40:37,140 إذا أردنا بالفعل تذكّر مناقشتنا عن مؤشرات الترابط في سكراتش-- 2338 01:40:37,140 --> 01:40:40,950 إنهما يحاولان القيام بالشيء نفسه في الوقت نفسه تقريبًا. 2339 01:40:40,950 --> 01:40:44,070 وإذا كان هذان الشيئان، مؤشرات ترابط أو أشخاص، 2340 01:40:44,070 --> 01:40:47,040 يتحققان من حالة المتغير، وهي طريقة رائعة لقول 2341 01:40:47,040 --> 01:40:50,320 هل اسم المستخدم متوفر، ويحصل كلاهما على إجابات. 2342 01:40:50,320 --> 01:40:52,480 لكن بعد ذلك، بعد بضعة أجزاء من الثانية لاحقًا، 2343 01:40:52,480 --> 01:40:56,490 يتخذون قرارًا بناءً على تلك المعلومات، توجد نافذة للوقت، 2344 01:40:56,490 --> 01:40:58,800 إما أجزاء من الثانية أو حتى ثواني أو دقائق، 2345 01:40:58,800 --> 01:41:01,330 حيث يمكن أن تتغير، بالطبع، حالة ذلك المتغير. 2346 01:41:01,330 --> 01:41:03,454 إذن إذا قمتم أنتم أيضًا، حرفيًا، الآن على جهاز الكمبيوتر المحمول، 2347 01:41:03,454 --> 01:41:07,460 بكتابة اسم المستخدم الطويل جدًا ذلك، من المحتمل أنه سيتم إخبارنا جميعًا، ضوء أخضر، 2348 01:41:07,460 --> 01:41:08,730 أنه متوفر. 2349 01:41:08,730 --> 01:41:11,010 لكن سيحصل عليه واحد منا فقط بالفعل. 2350 01:41:11,010 --> 01:41:12,980 وذلك بسبب شرط التعارض. 2351 01:41:12,980 --> 01:41:16,130 حرفيًا، قد يتعارض جميعنا في التسجيل لتلك القيمة. 2352 01:41:16,130 --> 01:41:19,340 و عندما يمكن للحالة أن تتغير تحدث أشياء بين ذلك. 2353 01:41:19,340 --> 01:41:21,620 هذا أمر سيء لأنه يجعل البيانات لديكم 2354 01:41:21,620 --> 01:41:25,700 مُعرضة للتغيرات عبر شخص لا تقصدونه بالضرورة. 2355 01:41:25,700 --> 01:41:28,070 أو إذا لم تكن قاعدة البيانات ذكية، فربما 2356 01:41:28,070 --> 01:41:29,799 سيكون بإمكانكم القيام بأشياء سيئة بشكل خاص. 2357 01:41:29,799 --> 01:41:31,340 تُعد أجهزة الصراف الآلي مثال متعارف عليه لهذا. 2358 01:41:31,340 --> 01:41:35,849 إذا كان لديكم خصم ضار يحاول تسجيل الدخول إلى حسابين مصرفيين في وقت واحد 2359 01:41:35,849 --> 01:41:39,140 أو جهازين ماديين في وقت واحد، إما عبر بطاقتين أو حسابين وجهازي 2360 01:41:39,140 --> 01:41:42,080 كمبيوتر محمول، يمكنكم تخيُل أنهما سيحاولان اسقتطاع، على سبيل المثال، 2361 01:41:42,080 --> 01:41:45,080 مئة دولار من الحساب نفسه على الفور. 2362 01:41:45,080 --> 01:41:48,200 لأن تخيلوا موقع الويب الخاص بالبنك تم تنفيذه بشكل سيئ. 2363 01:41:48,200 --> 01:41:51,380 يتحقق من رصيد حساب المستخدم الذي سجّل الدخول. 2364 01:41:51,380 --> 01:41:52,520 هل لديك مئة دولار؟ 2365 01:41:52,520 --> 01:41:56,360 إذا كانت الإجابة نعم، ربما سيقول كلا موقعي الويب نعم، 2366 01:41:56,360 --> 01:41:57,620 يمكنك استقطاع مئة دولار. 2367 01:41:57,620 --> 01:42:00,141 تضغط على Enter وها هي ذا، تستقطع مئة دولار. 2368 01:42:00,141 --> 01:42:03,140 يحصل المستخدم عليها بطريقة ما لأنه تم نقلها إلى حساب آخر. 2369 01:42:03,140 --> 01:42:06,660 لكن يعتقد البنك أنه فعل ذلك مرة واحدة فقط، يستقطع 100 $، 2370 01:42:06,660 --> 01:42:10,850 ولكنك قد رحلت للتو ومعك 200 $ لأنك اتخذت قرار بناءً 2371 01:42:10,850 --> 01:42:13,400 على الإجابة نفسها في مؤشري ترابط مختلفين 2372 01:42:13,400 --> 01:42:16,050 أو برنامجين مختلفين أو جهازي كمبيوتر مختلفين. 2373 01:42:16,050 --> 01:42:18,590 إذن خلاصة القول، يمكن لهذا أن يحدث في العالم الحقيقي حتى. 2374 01:42:18,590 --> 01:42:22,280 كان هذا مثال قد تعلمته من المُرشد الخاص بي منذ سنوات. 2375 01:42:22,280 --> 01:42:25,460 لنفترض أنكم ورفقاء سكنكم لديكم ثلاجة صغيرة في السكن. 2376 01:42:25,460 --> 01:42:29,190 وأنكم معتادون، بالطبع، على شرب الكثير من الحليب. 2377 01:42:29,190 --> 01:42:32,090 وإذن نفد الحليب من الثلاجة. 2378 01:42:32,090 --> 01:42:34,280 وتعود إلى المسكن، أول رفيق سكن بعد المحاضرات. 2379 01:42:34,280 --> 01:42:36,424 وتُدرك، أوه، أنا حقًا بحاجة مشروب حليب. 2380 01:42:36,424 --> 01:42:37,590 وإذن تتفقد الثلاجة. 2381 01:42:37,590 --> 01:42:38,320 لا يوجد شيء هناك. 2382 01:42:38,320 --> 01:42:41,090 إذن تغلق الثلاجة، وتدخل مباشرةً، وتنتقل إلى CVS، 2383 01:42:41,090 --> 01:42:43,100 وتقف في الصف لشراء بعض الحليب. 2384 01:42:43,100 --> 01:42:45,230 في الوقت نفسه، يأتي رفيقك إلى السكن. 2385 01:42:45,230 --> 01:42:47,237 أيضًا، هو حقًا بحاجة مشروب من الحليب. 2386 01:42:47,237 --> 01:42:49,070 إذن يتحقق من حالة المتغير. 2387 01:42:49,070 --> 01:42:50,510 تبًا، لا يوجد حليب. 2388 01:42:50,510 --> 01:42:54,230 يغلق الثلاجة، ثم يذهب على سبيل المثال إلى Tommy's Convenience أو أي مكان آخر 2389 01:42:54,230 --> 01:42:56,150 قريب ويقف في الصف لبعض الحليب. 2390 01:42:56,150 --> 01:42:58,730 بالطبع، بعد ذلك يصل كلاكما للمسكن في نهاية المطاف. 2391 01:42:58,730 --> 01:43:00,140 والآن ما الذي يحدث؟ 2392 01:43:00,140 --> 01:43:01,910 اللعنة، الآن لديكم ضعف كمية الحليب. 2393 01:43:01,910 --> 01:43:04,220 ويفسد الحليب بسرعة. 2394 01:43:04,220 --> 01:43:06,095 إذن الآن هذه مشكلة، مشكلة سيئة للغاية. 2395 01:43:06,095 --> 01:43:08,900 لديكم ضعف كمية الحليب عن التي بإمكانكم شربها. 2396 01:43:08,900 --> 01:43:11,764 ولكن ما هو أصل تلك المشكلة بشكل أساسي؟ 2397 01:43:11,764 --> 01:43:13,180 الجمهور: شيء ما نفد عندك. 2398 01:43:13,180 --> 01:43:14,345 ديفيد ج. مالان: شيء ما نفد عندك، لكن-- 2399 01:43:14,345 --> 01:43:15,230 الجمهور: أنت بحاجة إليه. 2400 01:43:15,230 --> 01:43:16,070 ديفيد ج. مالان: --أنت بحاجة إليه. 2401 01:43:16,070 --> 01:43:17,705 لكن لماذا انتهى بي الأمر باثنين؟ 2402 01:43:17,705 --> 01:43:18,825 الجمهور: لا يوجد علم. 2403 01:43:18,825 --> 01:43:20,450 ديفيد ج. مالان: لا يوجد علم، أليس كذلك؟ 2404 01:43:20,450 --> 01:43:21,474 لا توجد إشارة. 2405 01:43:21,474 --> 01:43:22,640 لا يوجد مشاركة الحالة. 2406 01:43:22,640 --> 01:43:24,500 كلاكما قمتما بفحص قيمة المتغير، 2407 01:43:24,500 --> 01:43:26,000 اتخذتما قرار بشكل مستقل بناءً عليه. 2408 01:43:26,000 --> 01:43:28,850 لكن تغيرت حالة ذلك المتغير لأحدكم. 2409 01:43:28,850 --> 01:43:31,760 لأنه عندما أتى أحدكم إلى المسكن، الشخص الذي أتى لاحقًا، اللعنة، مثلاً، 2410 01:43:31,760 --> 01:43:33,710 قد تم بالفعل إعادة تعبئة الحليب. 2411 01:43:33,710 --> 01:43:34,880 إذن كيف يمكنكم حل هذا؟ 2412 01:43:34,880 --> 01:43:37,227 في العالم الحقيقي، كيف يمكنكم تجنب هذه المشكلة؟ 2413 01:43:37,227 --> 01:43:39,310 أنت فقط، الشخص، الذي لا يقضي أبدًا طلبات رفيقه في السكن. 2414 01:43:39,310 --> 01:43:42,787 الجمهور: يقول المغنطيس الذي وضعته على الثلاجة اشتري هذا. 2415 01:43:42,787 --> 01:43:43,870 ديفيد ج. مالان: مغنطيس-- نعم. 2416 01:43:43,870 --> 01:43:45,615 قائمة تسوق، صحيح-- ذهبتُ لشراء الحليب-- 2417 01:43:45,615 --> 01:43:46,490 أوقفتوه عن الشراء. 2418 01:43:46,490 --> 01:43:47,990 دائمًا اتركوا ملاحظة، أليس كذلك؟ 2419 01:43:47,990 --> 01:43:50,240 يمكنكم تبليغ تلك المعلومة. 2420 01:43:50,240 --> 01:43:53,090 يمكنكم وبشكل أكبر قفل الثلاجة، أليس كذلك؟ 2421 01:43:53,090 --> 01:43:55,760 قفل الشيء، وإذن لا يمكن لرفيقكم في السكن 2422 01:43:55,760 --> 01:43:59,540 أن يفحص حالة الثلاجة في غيابكم، وبالتالي، 2423 01:43:59,540 --> 01:44:01,040 لا يجعلنا عُرضة لهذا. 2424 01:44:01,040 --> 01:44:02,915 وأستخدم كلمة قفل بشكل متعمد لأن، 2425 01:44:02,915 --> 01:44:04,670 في قواعد البيانات، ذلك هو كيف يتم حل هذا. 2426 01:44:04,670 --> 01:44:07,070 هناك ميزة في قواعد البيانات تُسمى أقفال. 2427 01:44:07,070 --> 01:44:09,590 أو تُسمى الإصدارات الأكثر روعة من هذا المُعاملات، 2428 01:44:09,590 --> 01:44:12,540 حيث يمكنكم ضمان شيء يُسمى آلية الرجوع، 2429 01:44:12,540 --> 01:44:16,910 حيث تعني آلية الرجوع أنه يمكنكم القيام بأشياء متعددة على التوالي 2430 01:44:16,910 --> 01:44:18,470 دون أن تتم مقاطعتكم. 2431 01:44:18,470 --> 01:44:22,580 إذن في حالة البنك، من الممكن، عبر SQL، باستخدام القليل من 2432 01:44:22,580 --> 01:44:25,807 الصيغ الأكثر روعة والتي لن نتعمق فيها اليوم لحل هذه المشكلة بقول، 2433 01:44:25,807 --> 01:44:26,390 أتعلمون ماذا؟ 2434 01:44:26,390 --> 01:44:28,310 ابدأ في المعاملة التالية. 2435 01:44:28,310 --> 01:44:31,550 تحقق من حالة الحساب المصرفي، استقطع هذا المبلغ من المال، 2436 01:44:31,550 --> 01:44:33,080 والآن التزم بالنتائج. 2437 01:44:33,080 --> 01:44:36,380 وبينما أفعل ذلك، امنع أي شخص من الدخول. 2438 01:44:36,380 --> 01:44:39,650 لا تدع أي عميل آخر أو أي مستخدم آخر 2439 01:44:39,650 --> 01:44:43,700 أن يفعل بالضبط تلك المعلومات التي تمس البيانات نفسها حتى انتهي. 2440 01:44:43,700 --> 01:44:45,727 باختصار-- تدفعون ثمن، ربما. 2441 01:44:45,727 --> 01:44:48,560 حرفيًا تمنعون رفيقكم في السكن من الوصول إلى الثلاجة، 2442 01:44:48,560 --> 01:44:49,393 وهذا مزعج. 2443 01:44:49,393 --> 01:44:52,010 أو تمنعون العملاء الآخرين من القيام بمعاملات. 2444 01:44:52,010 --> 01:44:55,250 إذن آمل أن يكون الكمبيوتر سريعًا في هذا، وأنكم تقومون بالتسوق بسرعة. 2445 01:44:55,250 --> 01:44:58,370 ولكن قد ضمنتم على الأقل أن لديكم آلية الرجوع. 2446 01:44:58,370 --> 01:45:01,970 لا يمكن إدراج أي عملية في تسلسل العمليات الخاص بكم 2447 01:45:01,970 --> 01:45:05,820 عبر رفيقكم في السكن أو كمبيوتر آخر أو مؤشر ترابط. 2448 01:45:05,820 --> 01:45:08,810 إذن فهذه مشكلة مع قواعد البيانات سنقوم باختصارها فقط. 2449 01:45:08,810 --> 01:45:11,157 ويُمكن لـ GitHub أن يحل هذا، كيف؟ 2450 01:45:11,157 --> 01:45:12,740 حسنًا، بعدم الاهتمام، من المحتمل. 2451 01:45:12,740 --> 01:45:14,630 لا أعرف ما الذي سيحدث إذا حاول العديد منّا. 2452 01:45:14,630 --> 01:45:18,440 أخمّن أنها ستعطي فقط n ناقص 1 منا رسالة خطأ تقول، معذرةً، 2453 01:45:18,440 --> 01:45:20,012 لم يعد اسم المستخدم هذا متوفرًا. 2454 01:45:20,012 --> 01:45:20,720 فكّروا في هذا. 2455 01:45:20,720 --> 01:45:22,220 إذا اشتريتم مُسبقًا تذاكر طيران، فهذه 2456 01:45:22,220 --> 01:45:23,790 مشكلة محلولة في تلك الصناعة. 2457 01:45:23,790 --> 01:45:25,040 سيكون هذا مزعج جدًا. 2458 01:45:25,040 --> 01:45:27,620 إذا فقط قضيتم ساعة من البحث المُرهِق عن سعر 2459 01:45:27,620 --> 01:45:29,937 جيد لتذكرة طائرة، تبدأون في البحث 2460 01:45:29,937 --> 01:45:31,520 بعد إضافتها إلى عربة التسوق الخاصة بكم. 2461 01:45:31,520 --> 01:45:34,561 وبعد خمس دقائق، بعد إدخال الاسم وعنوان البريد الإلكتروني ورقم بطاقة الائتمان 2462 01:45:34,561 --> 01:45:36,140 الخاصين بكم، لم تعد التذكرة موجودة. 2463 01:45:36,140 --> 01:45:37,400 إذن ما الذي تفعله الخطوط الجوية؟ 2464 01:45:37,400 --> 01:45:39,270 في كثير من الأحيان يمنحونكم نافذة لمدة خمس دقائق. 2465 01:45:39,270 --> 01:45:41,390 وتعرض لكم بعض مواقع الويب الأروع الساعة قائلة، 2466 01:45:41,390 --> 01:45:43,340 نضمن هذا للخمس دقائق القادمة. 2467 01:45:43,340 --> 01:45:46,970 قد تفعل الفنادق هذا أيضًا حيث يقومون بقفل الثلاجة لكم 2468 01:45:46,970 --> 01:45:49,280 عبر تغيير قاعدة البيانات بطريقة ما ليقولوا، امم-امم. 2469 01:45:49,280 --> 01:45:52,820 لا يمكن لأي شخص آخر شراء هذه التذكرة أو هذه الحجرة للخمس دقائق القادمة، 2470 01:45:52,820 --> 01:45:54,890 وهذا ما يُشبه إلى حد كبير الملاحظة أو القفل. 2471 01:45:54,890 --> 01:45:57,980 إذن هذه النوع من الأشياء موجود في كل مكان حولنا. 2472 01:45:57,980 --> 01:46:02,870 لكن دعونا ننظر إلى مثال أخير الذي يُعد أسوأ تهديد على الإطلاق وهو هذا. 2473 01:46:02,870 --> 01:46:06,320 في السابق، سمحتُ لنفسي بالبحث بالاسم. 2474 01:46:06,320 --> 01:46:10,164 إذن q يساوي Brian أو q يساوي David أو Veronica أو ما شابه. 2475 01:46:10,164 --> 01:46:11,830 وماذا فعلتُ بتلك المعلومة؟ 2476 01:46:11,830 --> 01:46:14,280 حسنًا، إذا عدنا إلى IDE ونظرنا في الواقع 2477 01:46:14,280 --> 01:46:20,250 إلى ذلك الملف في application.py، قمتُ بتنسيقه ببساطة باستخدام سلسلة F 2478 01:46:20,250 --> 01:46:22,630 داخل سلسلة SQL هذه. 2479 01:46:22,630 --> 01:46:25,680 ولكن ماذا إذا كان المستخدمين لديّ ضارّين قليلاً؟ 2480 01:46:25,680 --> 01:46:28,660 ولنفترض أن شخصًا ما لا يريد فقط البحث عن Brian. 2481 01:46:28,660 --> 01:46:29,410 لكن أتعلمون ماذا؟ 2482 01:46:29,410 --> 01:46:37,350 لنفترض أنه يفعل شيئًا على سبيل المثال، إن الاستعلام لديّ هو حذف من المُسجلين حيث-- 2483 01:46:37,350 --> 01:46:40,560 عذرًا براين-- اسم يساوي Brian-- 2484 01:46:40,560 --> 01:46:42,130 شيئًا من هذا القبيل. 2485 01:46:42,130 --> 01:46:46,380 الآن، هذا غير صالح في هذه اللحظة، لأن هذه السلسلة، 2486 01:46:46,380 --> 01:46:48,650 بينما يُسمَح لي بالتأكيد كتابتها، 2487 01:46:48,650 --> 01:46:53,077 سيتم إدخالها في التعليمة البرمجية لديّ، لكن منطقيًا في المكان الخطأ. 2488 01:46:53,077 --> 01:46:56,160 على سبيل المثال، سأبحث عن اسم شخص ما يُسمى "حذف من المُسجلين 2489 01:46:56,160 --> 01:46:58,326 حيث اسم يساوي Brian،" وهذا فقط سخيف. 2490 01:46:58,326 --> 01:47:00,240 سيقوم بإرجاع 0 من النتائج. 2491 01:47:00,240 --> 01:47:04,210 لكن ماذا إذا قمتُ بشيء من هذا القبيل حيث أقول 2492 01:47:04,210 --> 01:47:08,790 Brian أو حذف من المُسجلين عندما أُنهي 2493 01:47:08,790 --> 01:47:12,660 فكرة المبرمج ثم أبدأ بفكرة جديدة خاصة بي. 2494 01:47:12,660 --> 01:47:16,020 أو طريقة أخرى للقيام بهذا هي استخدام فاصلة منقوطة وهي صيغة خاصة، شيء من 2495 01:47:16,020 --> 01:47:16,890 هذا القبيل. 2496 01:47:16,890 --> 01:47:21,300 باختصار، يمكنني استنباط مدخل بشري ضار والذي 2497 01:47:21,300 --> 01:47:24,540 يُنهي فكرة المبرمج ويقوم بإرجاع صفر من الصفوف، لكن بالمناسبة، 2498 01:47:24,540 --> 01:47:28,710 أيضًا يقوم بتسلل استعلام مخادع إضافي في قاعدة البيانات. 2499 01:47:28,710 --> 01:47:31,410 هذا ما يُعرف بحقنة هجوم SQL. 2500 01:47:31,410 --> 01:47:37,350 وإذا كتبتم بشكل ساذج وسيئ جدًا، وغير صحيح تعليمة برمجية مثلما 2501 01:47:37,350 --> 01:47:39,630 فعلت-- لاتفعلوا ذلك أبدًا-- 2502 01:47:39,630 --> 01:47:42,180 ستكونون مُعرضين لهذا الهجوم بالضبط 2503 01:47:42,180 --> 01:47:46,644 لأنكم تقوموا بإدخال مدخل المستخدم بشكل أعمى في سلسلة 2504 01:47:46,644 --> 01:47:48,310 ثم تقومون بتمريره إلى قاعدة بيانات. 2505 01:47:48,310 --> 01:47:52,410 هذا هو الخطأ الأساسي في الكثير من التطبيقات، واللغات 2506 01:47:52,410 --> 01:47:54,960 حين يجب عليكم عدم الثقة بالمستخدمين لديكم. 2507 01:47:54,960 --> 01:47:57,300 لا يهم إذا كان هذا فقط للطلاب في الحرم الجامعي 2508 01:47:57,300 --> 01:47:58,883 أو فقط لكم ولأصدقائكم. 2509 01:47:58,883 --> 01:48:01,419 لا تثقوا أبدًا، أبدًا في مدخل المستخدمين لأنه إما سيُخطئ 2510 01:48:01,419 --> 01:48:03,960 أحدهم في كتابة شيء ما ثم سينحرف شيئًا ما، 2511 01:48:03,960 --> 01:48:06,180 أو أن لديكم شخص سيء يحاول 2512 01:48:06,180 --> 01:48:08,310 اختراق موقع الويب أو التطبيق الخاص بكم 2513 01:48:08,310 --> 01:48:10,230 عبر تجربة هذه الأنواع من الأوامر. 2514 01:48:10,230 --> 01:48:13,020 وعليكم دائمًا كتابة تعليمة برمجية بشكل دفاعي. 2515 01:48:13,020 --> 01:48:13,980 إذن كيف يُمكنكم فعل هذا؟ 2516 01:48:13,980 --> 01:48:15,330 يوجد بضعة طرق. 2517 01:48:15,330 --> 01:48:17,730 ولكن يتّضح أن، الأمر الخطير حول شيء 2518 01:48:17,730 --> 01:48:21,370 مثل الذي كتبته هي الفاصلة المنقوطة، على سبيل المثال، 2519 01:48:21,370 --> 01:48:24,040 وهي علامات الاقتباس فوق "elsewhere." 2520 01:48:24,040 --> 01:48:28,486 إذن الشيء الأكثر أمانًا لنفعله هو، بغض النظر عما يكتبه المستخدم، إلغاء الأشياء. 2521 01:48:28,486 --> 01:48:29,610 يمكنكم استخدام صيغة خاصة. 2522 01:48:29,610 --> 01:48:32,940 رأينا هذا في C-- بشكل عام، وضع خط مائل عكسي أمام شيء مما يعني، 2523 01:48:32,940 --> 01:48:35,280 لا تدعونه يحتفظ بسلوكه الافتراضي. 2524 01:48:35,280 --> 01:48:36,780 بدلاً من ذلك، عاملوه بشكل خاص. 2525 01:48:36,780 --> 01:48:38,640 إذن يمكنكم استخدام تعليمة برمجية خاصة في Python 2526 01:48:38,640 --> 01:48:41,640 التي تقول فقط قوموا بإزالة أي حروف غير صالحة، أو استبدال أشياء. 2527 01:48:41,640 --> 01:48:44,610 بصراحة، قد كنتم على الأرجح في موقع ويب حيث قد قيل لكم، 2528 01:48:44,610 --> 01:48:47,160 معذرةً، لا يمكنك استخدام هذا الحرف في كلمة المرور الخاصة بك. 2529 01:48:47,160 --> 01:48:49,260 أو معذرةً، لا يمكنك استخدام ذلك في اسم المستخدم الخاص بك. 2530 01:48:49,260 --> 01:48:49,980 هذا فقط غبي. 2531 01:48:49,980 --> 01:48:51,840 مثل، ذلك نهج كسول لهذا. 2532 01:48:51,840 --> 01:48:54,060 لا يوجد سبب لمنع المستخدمين من كتابة 2533 01:48:54,060 --> 01:48:57,750 أي حروف بلوحة المفاتيح لكلمة المرور الخاصة بهم وربما حتى 2534 01:48:57,750 --> 01:48:58,620 اسم المستخدم الخاص بهم. 2535 01:48:58,620 --> 01:49:01,203 هذه نوعًا ما طريقة كسولة للتصدي لهذا بقول، 2536 01:49:01,203 --> 01:49:03,480 امم-امم، لا أثق بأي علامة نسبة مئوية، أو أي فواصل منقوطة، 2537 01:49:03,480 --> 01:49:05,370 أو أي شرطات، أو أي فواصل عليا. 2538 01:49:05,370 --> 01:49:07,172 بدلاً من ذلك، فقط قوموا بإلغاء أشياء. 2539 01:49:07,172 --> 01:49:08,880 ولكن هذا سخيف لنا جميعًا في هذه الغرفة 2540 01:49:08,880 --> 01:49:13,320 كتابة التعليمة البرمجية الخاصة بنا من أجل إلغاء مدخل المستخدمين أو تنقيته، كما تُسمى، 2541 01:49:13,320 --> 01:49:16,200 أو تعقيمه، كما تُسمى-- الأشياء نفسها. 2542 01:49:16,200 --> 01:49:17,850 لمَ لا نستخدم فقط مكتبة؟ 2543 01:49:17,850 --> 01:49:19,560 الآن، يوجد العديد من المكتبات هناك. 2544 01:49:19,560 --> 01:49:21,601 المكتبة التي نستخدمها في الوقت الحالي هي CS50. 2545 01:49:21,601 --> 01:49:24,570 وتقوم دالة EXECUTE بهذا لأجلنا. 2546 01:49:24,570 --> 01:49:28,110 بدلاً من استخدام سلاسل F، التي لا يجب استخدامها هكذا. 2547 01:49:28,110 --> 01:49:29,970 بدلاً من ذلك يجب عليكم القيام بهذا. 2548 01:49:29,970 --> 01:49:33,060 إذا أردتم إدخال قيمة عنصر نائب إلى استعلام SQL، 2549 01:49:33,060 --> 01:49:35,970 تستخدمون حرفياً تقليد قياسي، والذي تبنيناه أيضًا، 2550 01:49:35,970 --> 01:49:39,222 حيث يمكنكم فقط وضع اسم متغير، لكن مع وجود نقطتين أمامه. 2551 01:49:39,222 --> 01:49:40,180 ويمكن أن يكون أي شيء. 2552 01:49:40,180 --> 01:49:40,710 يمكن أن يكون q. 2553 01:49:40,710 --> 01:49:41,310 يمكن أن يكون x. 2554 01:49:41,310 --> 01:49:42,210 لا يهم. 2555 01:49:42,210 --> 01:49:44,310 لكنكم تريدون فقط إدخال قيمة ما هناك. 2556 01:49:44,310 --> 01:49:46,560 إذن سأُطلق عليها اسم، حسب التقليد. 2557 01:49:46,560 --> 01:49:49,440 ثم تقومون بإنهاء الاقتباس لديكم وإنهاء الفكرة. 2558 01:49:49,440 --> 01:49:55,110 ثم امضوا قدمًا وقوموا بتمرير القيمة الفعلية، اسم يساوي q. 2559 01:49:55,110 --> 01:49:58,590 والآن قمتم بإنشاء، بشكل ديناميكي، 2560 01:49:58,590 --> 01:50:01,590 سلسلة SQL عبر عنصر نائب وهو ليس 2561 01:50:01,590 --> 01:50:03,870 قوس متعرج عنصر نائب الخاص بـ Python. 2562 01:50:03,870 --> 01:50:07,800 هذا تقليد خاص في SQL حيث تقولون قم بإدخال قيمة هنا. 2563 01:50:07,800 --> 01:50:08,600 أي قيمة؟ 2564 01:50:08,600 --> 01:50:13,680 سنقوم بإدخال قيمة الأسماء، q، أيًّا كان ما كتبه الإنسان. 2565 01:50:13,680 --> 01:50:16,350 وما ستفعله دالة execute لأجلكم 2566 01:50:16,350 --> 01:50:19,110 هو الخط المائل العكسي والإلغاء الرائعين 2567 01:50:19,110 --> 01:50:21,432 وستحميكم من بيانات المستخدم. 2568 01:50:21,432 --> 01:50:22,890 وهذه هي مدى بساطة الأمر حقًا. 2569 01:50:22,890 --> 01:50:24,570 لا يجب أن تكون مكتبة CS50. 2570 01:50:24,570 --> 01:50:28,920 هذا أمر شائع جدًا في جميع اللغات، ولكن عدد قليل جدًا من الأشخاص يعرفون ذلك 2571 01:50:28,920 --> 01:50:29,674 ويستخدمونه. 2572 01:50:29,674 --> 01:50:32,340 إذن معظم الوقت تقرأون عن اختراق بعض قواعد البيانات 2573 01:50:32,340 --> 01:50:34,350 أو عن سرقة بياناتكم، فذلك بسبب 2574 01:50:34,350 --> 01:50:37,170 سهو غبي من ذلك القبيل. 2575 01:50:37,170 --> 01:50:40,020 إذن، استخدموا فقط مكتبات وقوموا بإلغاء مدخل المستخدمين. 2576 01:50:40,020 --> 01:50:41,610 يمكننا أن نرى هذا الآن بشكل ملموس أكثر. 2577 01:50:41,610 --> 01:50:43,980 قد قام الطلاب الجامعيين جميعهم في الغرفة بالتأكيد 2578 01:50:43,980 --> 01:50:46,684 بتسجيل الدخول، إما على موقع الويب الخاص بييل أو بهارفارد، 2579 01:50:46,684 --> 01:50:48,600 الذي يبدو إلى حد ما شيئًا كهذا هنا. 2580 01:50:48,600 --> 01:50:50,470 تتم مطالبتكم باسم تسجيل الدخول وكلمة المرور الخاصة بكم، 2581 01:50:50,470 --> 01:50:52,050 أو Harvard key الخاص بكم أو ما شابه. 2582 01:50:52,050 --> 01:50:54,750 حسنًا، كيف يصبح هذا مؤثر بقيم فعلية؟ 2583 01:50:54,750 --> 01:50:56,520 إذا كنت سأكتب عنوان البريد الإلكتروني لديّ-- 2584 01:50:56,520 --> 01:50:59,920 ولكن صيغة غريبة مثل هذه-- دعونا ننظر إلى مثال. 2585 01:50:59,920 --> 01:51:03,390 علامة اقتباس Or علامة اقتباس 1 وعلامة إنهاء الاقتباس يساوي علامة اقتباس 1. 2586 01:51:03,390 --> 01:51:04,800 لاحظوا أنها ليست موزونة. 2587 01:51:04,800 --> 01:51:07,400 ينقصها علامة اقتباس هنا، وأخرى هنا. 2588 01:51:07,400 --> 01:51:10,920 لأن الافتراض هو أنه ربما تكون هارفارد مُعرضة لهذا. 2589 01:51:10,920 --> 01:51:12,240 لا أعتقد أنها كذلك. 2590 01:51:12,240 --> 01:51:15,200 لكن لنفترض أن التعليمة البرمجية التي تقوم بتشغيل Harvard key 2591 01:51:15,200 --> 01:51:18,660 وصفحة تسجيل الدخول إلى هارفارد تبدو نوعًا ما كهذه. 2592 01:51:18,660 --> 01:51:19,440 هذا سيء. 2593 01:51:19,440 --> 01:51:22,160 هذا أمر خطير لأنهم فقط يستخدمون سلاسل f أو سلاسل 2594 01:51:22,160 --> 01:51:24,826 تنسيق، والتي ستقوم فقط بإدخال أي شيء هناك بشكل أعمى. 2595 01:51:24,826 --> 01:51:28,140 2596 01:51:28,140 --> 01:51:31,192 إذن إذا سمحت للإنسان أن يكتب شيء مُشفر مثل ذلك، 2597 01:51:31,192 --> 01:51:32,650 لاحظوا ما حدث منطقيًا. 2598 01:51:32,650 --> 01:51:36,470 حيث اسم المستخدم يساوي me at example email provider.com وكلمة المرور 2599 01:51:36,470 --> 01:51:41,330 يساوي علامة اقتباس وعلامة إنهاء الاقتباس، إذن فارغة، أو 1 يساوي 1. 2600 01:51:41,330 --> 01:51:43,070 ولماذا 1 يساوي 1؟ 2601 01:51:43,070 --> 01:51:46,460 إذا رجعتُ، لاحظوا أنه يوجد هنا علامة اقتباس وهنا. 2602 01:51:46,460 --> 01:51:49,910 والسبب في أنني لم أُنهي علامة الاقتباس الثانية هنا أو الأخرى 2603 01:51:49,910 --> 01:51:52,670 هنا هو لأنني أفترض، كشخص سيء، 2604 01:51:52,670 --> 01:51:55,550 أعتقد أن هارفارد ستقوم فقط بإدخال المدخل الخاص بي بشكل أعمى 2605 01:51:55,550 --> 01:51:57,810 في علامة اقتباس واحدة خاصة بها. 2606 01:51:57,810 --> 01:51:59,990 بالتالي، يمكنني إنهاء فكرتهم بشكل سخيف. 2607 01:51:59,990 --> 01:52:01,520 لكن لاحظوا، منطقيًا، ما الذي يحدث. 2608 01:52:01,520 --> 01:52:05,480 حدد المستخدمين جميعهم من قاعدة البيانات حيث اسم المستخدم هو me at example email 2609 01:52:05,480 --> 01:52:07,340 provider وكلمة المرور فارغة. 2610 01:52:07,340 --> 01:52:09,890 أو 1 يساوي 1. 2611 01:52:09,890 --> 01:52:12,170 حسنًا، متى 1 يساوي 1؟ 2612 01:52:12,170 --> 01:52:13,680 دائمًا. 2613 01:52:13,680 --> 01:52:16,310 إذن فإن هذا سيقوم بإرجاع المستخدمين دائمًا من قاعدة البيانات، 2614 01:52:16,310 --> 01:52:20,840 ومن المفترض، بالتالي، يسمح لي بتسجيل الدخول كواحدًا من هؤلاء المستخدمين-- 2615 01:52:20,840 --> 01:52:23,480 إذن الأمر بسيط بشكل لا يصدق للتصدي لهذا. 2616 01:52:23,480 --> 01:52:28,130 فقط استخدموا صيغة العنصر النائب ولا تثقوا بمدخل المستخدمين وقوموا بتعقيمه. 2617 01:52:28,130 --> 01:52:31,670 إن الصيغة في SQL ومكتبة CS50 بسيطة تمامًا مع تلك النقطتين. 2618 01:52:31,670 --> 01:52:34,220 ولكن في مكتبات أخرى، قد تكون نفسها تمامًا. 2619 01:52:34,220 --> 01:52:37,130 إذن أنتم الآن جميعًا، الحضور والطلاب على حدٍ سواء، 2620 01:52:37,130 --> 01:52:39,800 بدأتم في فئة صغيرة من الناس 2621 01:52:39,800 --> 01:52:42,069 في العالم الذي يفهم فكاهة العباقرة بشكل خاص. 2622 01:52:42,069 --> 01:52:45,110 قد تلاحظون هذا الميم الذي انتقل عبر الإنترنت منذ سنوات عديدة 2623 01:52:45,110 --> 01:52:48,710 وحتى الآن حيث قرر شخص ما إما بشكل ضار أو فكاهي 2624 01:52:48,710 --> 01:52:53,770 أن يرسم هذا على لوحة الرخصة الخاصة به. 2625 01:52:53,770 --> 01:52:55,351 دعونا نقوم بالتكبير. 2626 01:52:55,351 --> 01:52:57,806 لما قد يفعل شخص ما هذا؟ 2627 01:52:57,806 --> 01:53:00,452 2628 01:53:00,452 --> 01:53:01,243 الجمهور: ماسحات ضوئية. 2629 01:53:01,243 --> 01:53:02,750 ديفيد ج. مالان: ماسحات ضوئية، نعم. 2630 01:53:02,750 --> 01:53:04,967 تتلاشي مقرّات محصلي الضرائب، على الأقل في الولايات المتحدة. 2631 01:53:04,967 --> 01:53:08,300 وبدلاً من ذلك لديهم كاميرات أو قارئات تقوم بمسح مقدمة سيارتكم 2632 01:53:08,300 --> 01:53:12,110 وتحاول إجراء OCR بشكل ضوئي، التعرف الضوئي على الحروف، 2633 01:53:12,110 --> 01:53:13,340 على لوحة الرخصة الخاصة بكم. 2634 01:53:13,340 --> 01:53:15,911 والافتراض هنا هو، ربما في بعض البلديات، 2635 01:53:15,911 --> 01:53:18,410 هناك بعض التعليمات البرمجية المكتوبة بشكل سيء حيث يتم بشكل أعمى إدخال 2636 01:53:18,410 --> 01:53:20,910 لوحة الرخصة الخاصة بكم في التعليمات البرمجية لديهم. 2637 01:53:20,910 --> 01:53:23,977 آملين أن تنهوا الفكرة حيث ZU 0666-- 2638 01:53:23,977 --> 01:53:26,060 أيًّا كان ذلك، فإنه جزء من لوحة الرخصة-- 2639 01:53:26,060 --> 01:53:30,425 لكن فاصلة منقوطة جدول إسقاط قاعدة البيانات نقطة نقطة نقطة. 2640 01:53:30,425 --> 01:53:33,050 ولم ننظر حتى إلى ذلك لأن كلمة إسقاط مبالغ فيها جدًا. 2641 01:53:33,050 --> 01:53:35,870 تقوم حرفيًا بحذف قاعدة البيانات نفسها. 2642 01:53:35,870 --> 01:53:41,960 ولكن هذه طريقة لطيفة للإعفاء من الضرائب. 2643 01:53:41,960 --> 01:53:45,470 وأكثر شيء متعارف عليه على الأرجح، XKCD وهو كارتون شائع جدًا يصدر بشكل متسلسل. 2644 01:53:45,470 --> 01:53:47,300 يستهدف العباقرة بشكل خاص. 2645 01:53:47,300 --> 01:53:53,057 وربما ستفهمون هذه الدعابة الآن كذلك بين دوائر CS. 2646 01:53:53,057 --> 01:53:55,298 [LAUGHING] 2647 01:53:55,298 --> 01:54:04,516 2648 01:54:04,516 --> 01:54:06,656 يمكنني سماع الضحك في كل مكان. 2649 01:54:06,656 --> 01:54:08,780 إذن من الآن فصاعدًا، إذا لم تأخذوا شيء آخر، 2650 01:54:08,780 --> 01:54:11,840 تذكروا جداول بوبي الصغيرة مع pset. 2651 01:54:11,840 --> 01:54:14,112 في النهاية، هل ستقومون في الواقع بتنفيذ CS50 Finance 2652 01:54:14,112 --> 01:54:15,320 وجمع هذه الأفكار جميعها. 2653 01:54:15,320 --> 01:54:17,528 شكرًا جزيلاً لانضمام الحضور جميعهم. 2654 01:54:17,528 --> 01:54:18,830 وسنراكم في المرة القادمة. 2655 01:54:18,830 --> 01:54:21,580 [APPLAUSE]