نحن في عالم فيه سيارات مختلفة تناسب أشخاص مختلفين بأذواق مختلفة واحتياجات مختلفة. لا يوجد سيارة واحدة تناسب أذواق واحتياجات كل الناس. كذلك السيارات الكهربائية لا تناسب كل الناس. السيارات الكهربائية تمتاز بأن مداها أقصر من سيارات البنزين وتحتاج وقت طويل (بالساعات) حتى تمتلئ بالكامل.
قد تناسبك السيارة الكهربائية في الحالات التالية:
مناسبة كسيارة ثانية: لديك سيارة أخرى في البيت أو الأسرة. مثلا سيارة للأب وسيارة أخرى للأم.
الرحلات اليومي ضمن مدى السيارة بحيث كل يوم تستيقظ من النوم والسيارة مشحونة بالكامل
الأردن بلد صغير ويتركز السكان في عمان والزرقاء وإربد والمسافات بينها ضمن مدى السيارة
أغلب الناس في الأردن لا تزيد رحلاتها اليومية عن مدى السيارة.
لديك شقة في عمارة لكن يمكنك تمديد نقطة شحن داخل مصف/كراج العمارة
نقطة لصالح السيارات الكهربائية لو كان مصف السيارات في مكان العمل فيه نقطة كهرباء
ميزات السيارات الكهربائية
في الأردن هناك جمارك عالية على سيارات البنزين بالمقابل هناك معاملة تفضيلية (لكنها متناقصة) لسيارات الكهرباء. لذا هناك فارق كبير في السعر لصالح السيارات الكهربائية.
بخصوص مقارنة سعر البنزين والكهرباء فالموضوع معقد جدا لأن هناك نظام شرائح تصاعدية وبالتالي كلفة الكهرباء تعتمد على المسافة التي تقطعها شهريا. هناك ساعة كهرباء مخصصة لشحن السيارة سعر الكهرباء فيها ثابت (عداد خدمات خاص بالسيارة الكهربائية). أو يمكنك تركيب طاقة شمسية (العاكس/الإنفيرتر المنزلي باستطاعة 4 ك.و مع عدد من الألواح تناسب ذلك تولد يوميا حوالي 30 ك.و.س وشهريا 800 ك.و.س إلى 900 ك.وس وهو ما يكفيك لمسافة 150 كم يوميا و أكثر من 4 آلاف كم شهريا).
السيارات الكهربائية أبسط من سيارات الاحتراق فهي تتكون من بطارية ومحرك كهربائي وانفيرتر. لا تحتاج غيار زيت. المكابح لا تتآكل وتعمر طويلا لأنها تعتمد على الكبح من خلال إعادة توليد الطاقة regenerative breaking. ,غالبا لا تحتوي جير / صندوق تروس بالمعنى المتعارف عليه (يمكن أن تقول انه صندوق تروس بترس واحد أو بنسبة ثابتة). الغيار العكس يكون بعكس القطبية أو الموجة. ويمكن للمحرك أن يسير بسرعات مختلفة دون الحاجة لنقلات بين نسب مختلفة من التروس.
الصيانة التي تحتاجها السيارة قد تكون في المتستهلكات مثل:
الإطارات ويفضل أن تكون نوع موفر للطاقة low rolling resistance
المكابح
فلتر المكيف
غاز المكيف
سائل التبريد (أحيانا يوجد أكثر من مطرة) وربما غطاء الرديتر
أنوع مداخل الشحن
هناك عدة مداخل شحن للسيارات المختلفة بل لنفس السيارة لكن الموردة لبلدان مختلفة.
مدخل تشاديمو CHAdeMO الخاص بسيارة نيسان ليف وهو منتشر في اليابان ومهدد بالإنقراض في بقية العالم.
مدخل Type 1 ويسمى أيضا SAE J1772 المنتشر في السيارات وارد أمريكا وهو يدعم 1 فاز فقط ولا يدعم 3 فاز.
مدخل Type 2 ويسمى أيضا SAE J3068 ويسمى أيضا Mennekes على اسم الشركة التي صممته وهو المدخل الوحيد المعتمد رسميا في أوروبا وهو مستخدم في كوريا أيضا. وهو يدعم 1 فاز وأيضا بعض السيارات تدعم شحن سريع AC عبر 3 فاز. وهو أيضا مدخل سيارات تسلا وارد أوروبا والدول التي تعتمد المعايير الأوروبية.
المدخل الصيني GB/T وهو من حيث الشكل يشبه Type 2 لكن يكون طرف المركبة أنثى والوصلة ذكر بعكس Type 2 الأوروبي.
مدخل كومبو 1 Combo1 أو CCS Type 1 أو CCS1 وهو نفسه Type 1 السابق لكن مع إضافة ميزة الشحن السريع DC من خلال دائرتين بهما قطبي التيار المستمر DC أسفل المقابس العادي.
مدخل كومبو Combo2 2 أو CCS Type 2 أو CCS2 وهو نفسه Type 2 السابق لكن مع إضافة ميزة الشحن السريع DC
المدخل الصيني السريع DC أو GB/T DC
مدخل تسلا الخاص وهو مستخدم في الولايات المتحدة وكندا.
يعني سيارة أوروبية مخصصة للبيع في أمريكا ستحمل مقبس أمريكي. وسيارة أمريكية مخصصة للبيع في أوروبا ستحمل مدخل أوروبي وهكذا. الصورة أدناه لنفس السيارة وهي تسلا مودل 3 وارد بلدان مختلفة.
السيارات المختلفة يمكنها أن تشحن بسرعات مختلفة بل نفس الموديل من السيارات من نفس السنة (شفروليه في هذا المثال) يوجد منه نسختين trim levels واحدة بمدخل type 1 دون شحن سريع والأخرى كومبو ccs1 تدعم dc سريع (وتكون أغلى ب 500 دولار مثلا). الصورة أدناه لسيارة VW e-Golf فوق يمين المدخل الأمريكي كومبو 1. فوق يسار المدخل الأوروبي. تحت المدخل الأوروبي كومبو 2
الموضوع بين الانواع ذات السرعة الواحدة يكون غالبا شكلي ويمكن شراء موائم adapter يحول بينهما لكن لا يمكن أن جعل سيارة لا تدعم الشحن السريع dc أو 3 فاز ac أن تجعلها تدعمه عبر موائم adapter.
أنواع الشواحن وسرعاتها
تقاس سعة البطارية بوحدة كيلو واط ساعة (ك.و.س) وسرعة الشحن بوحدة كيلو واط (ك.و). والكيلو واط هو حاصل ضرب الفولتية بالأمبير تقسيم ألف (دون تقسم ألف تكون واط) مثلا شاحن بسرعة 8 أمبير على كهرباء منزلية 240 فولت يكون الناتج 1.9 ك.و وهكذا.
المستوى الاول Level 1: وهو الذي يمكنك وضعه في أي مقبس منزلي عادي لأن بطيء جدا ولا يسحب تيار (أمبير) عالي. وبالتلي لا يحتاج أي دارات حماية إضافية لأن الحماية المنزلية كافية وهو يعمل ضمنها. وهنا نحن نحن نتحدث عن 15 أمبير كحد أقصى على 120 فولت (الأمريكي) يعني لا نتجاوز سرعة 2 كيلو واط.
المستوى الثاني Level 2: وهو يعمل على 1 فاز (يعني 240 فولت) مثل الموجود في المنازل لكن على تيارات عالية ويحتوي دارات حماية إضافية. تيار 16 أمبير (بسرعة 3.7 كيلو واط) على مقبس غاطس أو 32 أمبير على مقبس صناعي Blue Commando فتصل سرعته إلى 7 كيلو واط. وحيث أن له مقبس فإن هذا النواع من الشواحن متنقل ويمكن حمله في السيارة
المستوى الثالث Level 3: يعمل على تيار متناوب 3 فاز (مثل الموجود في المصانع أو المؤسسات) وتصل سرعته إلى 50 كيلو واط لكن أغلب هذا النوع يعمل على سرعة 20 كيلو واط. وهذا النوع من الشواحن غير متنقل بل يكون مثبت بالجدار أو بالأرض.
المستوى الرابع Level 4: الشحن السريع dc وهو بسرعات قد تزيد عن 150 ك.و
هذه صورة نقطة شحن منزلية 1 فاز تظهر صندوق وقواطع عالية الحاسية ومقبس عادي ومقبس صناعي أزرق Blue Commando وعلى هذا المقبس تم توصيل الشاحن. يمكن لنقطة مثل هذه أن تشحن بسرعة 32 أمبير في 240 فولت يعني 7.6 كيلو واط.
يجب تركيب نقاط الشحن من قبل مختصين في المجال لأن الكهربائي العادي أكثر شيء تعامل معاه هو مدفأة (صوبة).
هذه صورة تظهر شاحن 3 فاز كل فاز بسرعة 32 أمبير يعني بسرعة 22 كيلو واط.
هذه صورة شاحن تسلا الأوروبي سوبر تشارجر (مثل الموجود في محطات الوقود) ويظهر فيه أن الدائرتين الخاصة بفاز 2 و 3 موجود بها نحاس بعكس الشاحن المنزلي 1 فاز.
هذه صورة وصلة للطوارئ تحتوي من جهة مقبس صناعي (للشاحن) ومن الجهة الأخرى فيش عادي مع ملقط "تمساح" للتأريض
أين تشحن سيارتك؟
أغلب الناس عندما تعود لبيتها تضع السيارة على الشاحن لتشحن طوال الليل ثم تكون صباحا بكامل شحنها وجاهزة للإنطلاق هذه هو الخيار الأكثر انتشارا والاوفر (في الغالب). وإن كنت محظوظا وكان لديك شاحن في مصف السيارات في مكان عملك فهذه نقطة إضافية. أيضا هناك بعض المولات ومراكز التسوق توفر شوحن مجانية أو عند استعمال خدمة الاصطفاف.
لكن في المسافات البعيدة أو عند اللزوم أو عند السفر بين المدن يمكنك الشحن في بعض محطات الوقود والأماكن المخصصة يمكنك استعراضها عبر تطبيق شحنات أو PlugShare لكن تأكد من:
ترشيح النتائج على نوع مدخل السيارة الخاص بك
إضافة قابس الحائط wall و القابس الصناعي الأزرق blue commando
الاتصال بهم للتأكد من أنه يعمل وليس معطل أو قيد الصيانة...إلخ.
العوامل المؤثرة في مدى السيارة
مدى السيارة المعروض شاشة السيارة مجرد تقدير، ويختلف طريقة حسابه من سيارة لأخرى بعضها تعطي تقديرات أطول من اللازم وبعضها أقصر من اللازم. مدى السيارة يتغير حسب عدة ظروف أهمها
ميلان الشارع: صعود أم هبوط. الصعود يستهلك الكثير من الكهرباء بعكس الهبوط ليس ذلك فحسب بل إنه يعيد توليد الكهرباء
وزن السيارة وحمولتها (سواء عدد أشخاص أو بضاعة) خصوصا في المطالع أو عند التسارع.
التكييف والتدفئة وتدفئة المقاعد.
الهواء في الإطارات ونوع الإطارات (يفضل أن تكون low rolling resistance)
تفعيل نمط توفير الطاقة وكمية الطاقة المعاد توليدها regenerative
أسلوب الشخص في القيادة ("الدعسة") مثلا التسارع العنيف يستهلك كهرباء أكثر.
شركات السيارات المختلفة تستخدم طرق مختلفة لتقدير المدى لذا لما تعلن شركة عن مدى سيارة يصل إلى كذا وكذا لا تستخدم هذا الرقم في المقارنة. مثلا لا تقل هذه السيارة مداها اطول ب 20% من تلك السيارة من سركة بناءا على الأرقام التي تعلنها الشركة الصانع لأن الشركات المختلفة تقدرها في ظروف مختلفة. حتى يمكنك المقارنة عليك:
استعمال تقديرات من جهة محايدة تقارنهما في نفس الظروف (ملصق الاتحاد الأوروبي أو وكالة البيئة الأمريكية EPA...)
استعمال سعة البطارية بوحدة ك.و.س وليس المسافة بالكيلو متر للمقارنة (لكن مع عدم تجاهل أثر الفرق في وزن السيارات وفعاليتها).
يتم تقدير المسافة التي قد تقطعها السيارة عبر حساب سعة السيارة بوحدة ك.و.س وحساب معدل الصرف بوحدة كم / ك.و.س (يعني كل ك.و.س كام كيلو متر يسير) نضرب الرقمين ببعض فنحصل على مدى السيارة بوحدة الكيلومتر. مثلا سيارة حجم بطاريتها 26 ك.وس وبمعدل 5 كم لكل ك.و.س يكون مداها 26×5 ويساوي 130 كم.
الصورة أعلاه مأخوذة من داخل غطاء السيارة الامامي (غطاء الماتور) تظهر الملصق الرسمي وفيه معلومات السيارة ومنها نوع البطارية وهو ليثيوم Li-ion وحجمها 360 فولت ضرب 74 Ah ويساوي 26.6 ك.و.س ومداها الرسمي هو 144 كم في المدينة و 125 كم خارجي و 135 بالمتوسط (الأرقام التي تحتها هي مداها لما تكون الحرارة 7 تحت الصفر). ونعم سيارات الكهرباء تمشي مسافة أطول داخلي.
نسبة صحة البطارية State of Health أو SoH
جميع البطاريات تتراجع قدرتها على الاحتفاظ بالطاقة مع تقدمها في العمر وهي ظاهرة تعرف باسم تراجع أو نزول البطارية Battery Degradation. وتستخدم نسبة SoH للدلالة على صحة البطارية وهي النسبة في مقدرة البطارية على الاحتفاظ بالشحنة مقارنة بحالتها الأصلية يعني لما نقول قيمته 90% يعني أنها فقدت 10% من قدرتها على الاحتفاظ بالشحنة (فلو كانت سعتها 26 ك.و.س تكون كأنها خسرت 2.6 كيلو وكأنه بقي 23.4 كيلو واط ساعة).
يظهر على شاشة سيارة نيسان ليف 12 شَرطة تسمى بار تبين مقدار ال SoH لو كانت مستاوية يكون تقديرها 6 بار (من أصل 12) يعني 50% و9 بار تعني 75% لكنها ليست متساوية (أول شرطة 15% ثم تصير 6.25% وهكذا حسب جدول معين) لهذا يفضل قياس ال SoH بشكل دقيق واعتبار البار مجرد مؤشر تقديري.
الملفت في هذه الصورة السابقة أن السيارة مشحونة بالكامل ومع ذلك مداها فقط 56 كم وذلك لأنها خسرت ثلث مداها بسبب تراجع البطارية الذي تحدثنا عنه. بحسب بحث أمريكي فإن بطارية سيارة نيسان ليف تتراجع أكثر 25% بعد أقل من 50 ألف كم (تقريبا تخسر ربع بطاريتها خلال سنتين) وهذا التراجع ثابت وممنهج وسواء على الشحن السريع أو على الشحن البطيء.
هناك عدة عوامل مؤثرة في تراجع سعة البطارية منها أن البطارية لها عدد ثابت من دورات الشحن والتفريغ (يعني من 0% إلى 100%) حسب جودة الصناعة والكيمياء المستخدم والتراكيز ...إلخ للتوضيح هذا جدول صادر عن شركة أبل يظهر عدد دورات الشحن والتفريغ لبعض منتجات تلك الشركة
لاحظ أن الموديلات القديمة كانت لا تتجاوز ال 300 دورة شحن وتفريغ بينما الموديلات الحديثة تتجاوز 1000 دورة!
وهذا يقودنا إلى نقطتين مؤثرتين في عمر البطارية وهما صناعة البطارية وطريقة استخدامها (هل يتم شحنها من الصفر وتفريغها بالكامل كل يوم). في التقرير أدناه من بطارية سيارة فقدت أكثر من نصف قدرتها نلاحظ أن عدد دورات الشحن الكاملة يزيد عن 8 آلاف دورة وخلالها مر على هذه البطارية أكثر 23 ألف كيلو واط ساعة.
للمقارنة هذا تقرير مشابه لبطارية أفضل حالا
لاحظ أن عدد دورات الشحن الكاملة Full charges لم يتجاوز 126 دورة مع أنه مر على هذه البطارية 34 ألف كيلو واط ساعة يعني خلال عمر هذه البطارية تم شحنها أكثر من الأولى وكان يتم شحنها وتفريغها بسرعات أكثر من الأولى ومع ذلك لم تتراجع صحتها لأن عدد الدورات الكاملة أقل بكثير. الشاهد من الصورتين هو أن عدد دورات الشحن والتفريغ الكاملة عامل مهم جدا وحاسم في تراجع البطارية.
أغلب السيارات تحتوي منظومة لإدارة الشحن فهي تطلب منك أن تشحن قبل أن تصل السيارة للصفر تماما بل يكون هناك هوامش بين ماهو ظاهر للمستخدم usable state of charge وبين ما هو حقيقي real state of charge. لكن بعض الناس تصر على قيادة السيارة بعد ظهور التنبيه أنها نفذت.
تبريد البطارية
التبريد غير الفاعل Passive cooling (يعني لا تبذل طاقة) أو التبريد الجوي Ambient Cooling وهو طريقة مقعرة كي نقول أنه لا يوجد تبريد من الأساس. هذا هو أسوأ نوع تبريد وهو كالمستخدم في تبريد الجوال/الموبايل حيث هناك قطعة معدنية تسمى المصرف الحراري Heat Sink (ألمنيوم في الرخيص ونحاس في الغالي) توصل الحرارة لمسافة أبعد من الجسم الملاصق لها على أمل أن يحملها الجو المحيط بها. وحيث أن البطارية في محيط مغلق تماما sealed وليس هناك فتحات Vents وحيث أنها تشحن وهي في مكانها وليس وهي تسير وبالتالي لا يوجد تيارات من الهواء تتحرك لتحمل هذه الحرارة. من الأمثلة على هذا النوع سيارة نيسان ليف
التبريد الفاعل Active Cooling وهنا يتم بذل طاقة في حمل الحرارة والتبريد
التبريد عبر مروحة وهو يسمى التبريد الهوائي الفاعل Active Air Cooling كالموجود في سيارة Ioniq (حتى ما قبل موديل 2020 ذات ال 38 ك.وس)
التبريد المائي Active Liquid Cooling حيث هناك نظام من رديتر وأنابيب بها سائل تبريد (أنتي-فريز أو coolant) ومضخة ومروحة وهو أفضل من الذي قبله وهو الموجود في سيارة هونداي كونا ذات البطارية 64 ك.و.س والمدى الذي يتجاوز 400 كم.
التبريد عبر المكيف كما في سيارات سامسونج
أشكال خلايا البطاريات
هناك 3 أشكال أساسية لكل منها حسنات وسيئات.
منصة السيارة Platform
بعض السيارات مثل تسلا هي بالأصل مصممة من الصفر لتكون سيارة كهربائية. هكذا سيارات تكون لها منصتها الخاصة. مثل هذه السيارات غالبا ما تمتاز
صندوق أمامي به مساحة تخزين front trunk
صندوق خلفي واسع أيضا
مركز وزن منخفض low center of gravity حيث تكون البطارية موزعة على طول أرضية السيارة (داخليا كأنها بطارية العادية AA لكنها مصفوفة بقرب بعضها) الصورة التالية لبطاريات باناسونيك التي تستخدمها تسلا والصورة التي بعدها كيف تتجمع في أرضية السيارة
بالمقابل السيارات الكهربائية المطورة من منصة مشتركة مع سيارة بنزين أو هايبرد تكون مساحة التخزين في الصندوق الخلفي محدودة حيث تشغل البطارية غالبا جزء من مساحة الصندوق الخلفي وما تحت الكرسي الخلفي وتزيد من الحمل على المحاور الخلفية. ويكون توزيع المكونات في الصندوق الأمامي قريب من سيارة البنزين. هذه بطارية أيونيك 2017
وهذه بطارية رينو فلونس / سامسونج sm3 ze
المساحة المتبقية
على الجانب الأخر وجود نسخة بنزين من نفس السيارة يعني وفرة في قطع الغيار (مثل قطع "البودي" كالباب مثلا) مثال ذلك سيارة الأيونيك إذ أن منها نسخة كهربائية ونسخة هايبرد كذلك كيا نيرو.
عند شراء سيارة
الكيلومترات المقطعومة ومقارنتها بآخر قراءة في بلد السيارة
صفة الاستخدام (شخصي أم تاجير سياحي أم عمومي ..إلخ)
التحقق من الاستدعاءات "ريكول" recall. بعض السيارات ثبت وجود مشاكل في عدة دفعات منها ولم تحل بالحديث البرمجي لذا طلب الشركة استرجاع تلك السيارات للقيام بصيانة ويكون ذلك بإدخال رقم الشاصي VIN في موقع الدولة التي وردت منها السيارة (وليس الدولة التي صنعتها) أيضا تظهر هذه المعلومة في التقارير (مثل تقرير كارسير)
سيارة ليس عليها استدعاء
سيارة عليها استدعاء وقامت بعمله
سيارة عليها استدعاء ولم تقم بعمله:هنا عليك أن تقوم بالصيانة هنا (وغالبا حلى حسابك وليس على حساب الشركة)
الاستدعاءات قد تكون متعلقة أن البطارية تشتعل من تلقاء نفسها وقد تكون أشياء بسيطة يمكن إصلاحها بسهولة. الاستدعءات قد تكون إلزامية وقد تكون طوعية (كتسوية لتفادي الإدانة في المحكمة)
هذه المقالة ليست نصيحة طبية. النصائح الطبية تأخذها من طبيبك الذي عاينك ويتابع حالتك وليس من مقالات على الإنترنت.
هذه المقالة لا تدعوا للإمتناع عن تلقي المطاعيم / اللقاحات هي مجرد تحميص لأرقام وإحصائيات.
مقدمة
في هذه المقالة سنأخذ الدراسة التي عرضت على FDA وأقر بسببها فايزر. اخترنا هذه الدراسة نموذجا لكن ما ذكر حولها ينطبق على غيرها. سنأخذ الدراسة ونمحصها ونبين أوجه العيوب فيها من ناحية علمية إحصائية بحتة. إن كنت تقرأ المقالة هنا لأجل نظريات المؤامرة فاستعد كي يخيب ظنك. لن تجد هراء شبكات الجيل الخامس والشريحة والزومبي هنا.
سأحاول أن أبيسط الأشياء تبسيط مخل حتى يفهم المقالة أوسع شريحة ممكنة وليس فقط المختصين لكني سأضع المصطلحات بالإنجليزية والمصادر والروابط لأهل الاختصاص.
مغالطات يجب تجنبها
لنتذكر ولا ننس أننا نتحدث عن منتج لشركة ربحية (بل اللوبي الخاص بها أكبر من مجموع لوبي شركات السلاح والبترول مجتمعين). نحن لا نتحدث عن جمعيات خيرية. ولما يكون هناك ثغرة في الدراسة مع وجود جيش جرار من العلماء عند هذه الشركات وميزانيات بالمليارات فإنه من المرجح أن هذه الثغرة مقصودة وليست هفوة والهدف منها تعزيز أفضلية منتجاتهم وأرباحهم (وهناك أبحاث تثبت هذا ويسمى success bias وهذه قصة أخرى)
كون الحليب مفيد فهذا لا يعني أنه لما أطلب منك فحصه إن كان صالح للاستهلاك لا ترد علي أن الكل يعلم أن الحليب مفيد! فهو قد يكون منتهي الصلاحية أو به حمى مالطية ...إلخ.
1. استدرار العواطف والشخصنة: مثلا الناس ستموت بسبب هكذا مقالات. وأنت ماذا تفهم مقابل كل العلماء الذين قالوا أنه كذا وكذا
2. الاستدلال الدائري والمصادرة على المطلوب.
3. الاحتكام إلى سلطة: منظمة الصحة قالت كذا. ال FDA قالت كذا..إلخ.
الدراسة المقصودة وما حوالها
حتى لا يكون الموضوع مفتوح وغير محصور اخترت دراسة واحدة وهي الدراسة التي قدمتها فايزر لأخذ موافقة ال FDA. لكن العيوب ليست محصورة في هذه الدراسة وإنما وضعتها كنموذج. الدراسة متاحة على موقع FDA الرسمي على هذا الرابط وهي عبارة عن ملخص من 92 صفحة. إلى جانب عدة بيانات press release صادرة عن موقع الشركة الرسمي هي
Polack, Fernando P., et al. "Safety and efficacy of the BNT162b2 mRNA Covid-19 vaccine." New England Journal of Medicine (2020). DOI: 10.1056/NEJMoa2034577
الدراسة باختصار تمت على 44 ألف شخص تقريبا نصفهم أخذ اللقاح والنصف الآخر أخذ الوهمي placebo وهذه المجموعة تسمى المجموعة الضابطة control group. تم رصد 162 إصابة في المجموعة الضابطة مقابل 8 حالات فقط في المجموعة التي أخذت اللقاح وبالتالي كانت الفعالية 95% في منع الإصابة. تم اختيار العينة من أشخاص بين 16 سنة إلى 85 سنة (أغلبهم بين 16 سنة و55 سنة). المشاركين بالدراسة لم يسبق لهم الإصابة. وهناك تفصيل للتوزيع الإثنتي (أبيض أسود) والعمري وذكر وأثنى ...إلخ ورصد للآاثار الجانبية المسجلة خلال الدراسة كصداع وموضع الحقن وخلافه.
منهج الدراسة والتجارب
قبل أن تعمل دراسة يكون عندك فرضية تريد اختبار صحتها من خلال تصميم تجربة لها نتائج قابلة للرصد تدعم الفرضية أو تنفيها (يعني قبل أن تعمل الدراسة تقول إذا حصل كذا فهذا الفرضية صح وإلا فالفرضية خطأ). صحة الفرضية تعتبر موضع شك وتمحيص. الفرضية هنا هي أن مطعوم فايزر يعطي حصانة. إن افتراض أن المطاعيم تعمل كجزء من التجربة هو مغالطة سافرة. يجب أن تتم التجربة بافتراض عدم التسليم بصحة الفرضية المطلوب إثباتها او نفيها. لا يجوز تقول بما أن الحليب مفيد فإن هذه العينة من الحليب صالحة للاستهلاك البشري وخالية من الحمى المالطية دون أن تعمل الفحص المخبري وترصد أنها بالفعل كذلك.
في أي دراسة يكون هناك ما يسمى بالضبط control (ومنه المجموعة الضابطة control group) وهو الأساس الذي تقاس العينة مقارنة به وهو نوعان الضبط الإيجابي positive control والضبط السلبي negative control. فإن كانت التجربة هي لكشف الحموضة عبر ورقة كشاف عبادالشمس الزرقاء التي تتحول إلى حمراء في الوسط الحمضي فإننا نحتاج إلى ضبط إيجابي وهو شيء نعلم أنه حمض (عصير ليمون مثلا) وضبط سلبي شيء نعلم أنه ليس حمض (محلول صابون الجلي مثلا) ثم العينة محل الدراسة. فقبل النظر لنتيجة العينة ننظر للضبط الإيجابي والسلبي هل أعطى النتيجة المتوقعة نكمل التجربة وننظر للعينة محل الدراسة. وإلا نعتبر التجربة فاسدة والكشاف فاسد وممنوع ننظر للنتيجة بغض النظر سلبا أو إيجابا ولا معنى لقياس رقم ال pH إن كان الضبط فاسدا.
كذلك الحال في فحص الحمل السريع. فهناك خطان الخط الضابط C وخط الفحص T. الضبط في هذا الفحص هو ضبط إيجابي Positive Control يعني يجب أن يظهر هذا الخط حتى يكون للنتيجة معنى إذا لم يظهر هذا الخط تعتبر التجربة فاسدة ولا يجوز قراءة النتيجة بغض النظر هل هي حامل أم لا.
ثبات الفعالية في ظروف الانتشار والانحسار
ما الفائدة من سترة رصاص تحميك بشرط أن لا تخوض المعركة؟ ما الفائدة من تأمين يغطي السيارة في حال لم تمشي على الطريق؟ ما الفائدة من لقاح يحميك فقط في حالة عدم تفشي المرض؟ لهذا تعرف الفعالية كنسبة مقارنة مع المجموعة الضابطة. يعني لو كان عندنا لقاح تم اختباره في مرحلة تفشي سيحصل عدد قليل من الإصابات في المجموعتين مثلا 25 إصابة في مجموعة المطعوم مقابل 500 إصابة في مجموعة الضبط. ولو تم اختباره في مرحلة تفشي لكان لدينا 250 إصابة في مجموعة المطعوم مقابل 5000 إصابة في مجموعة الضبط. في الحالتين النسبة ثابتة وهي 95%. إذا لم تكن ثابتة وكانت تنشط في الانحسار فإنها حماية ظرفية غير حقيقية.
تحسب الفعالية في منع الإصابة efficacy في مجموعتين من نفس العدد عبر المعادلة التالية فرق الإصابات بين المطعم وغير المحصن (الضبط السلبي) مقسوم على عدد المصابين في المجموعة غير المحصنة.
في المثالي الخيالي السابق 500 - 25 = 475 نقسمه على 500 ضرب 100% ويساوي 95%
ولو كان في وقت تفشي أكثر ب 10 مرات سيكون 5000 - 250 = 4750 تقسيم 5000 ضرب 100% ويساوي 95%.
ثغرات الدراسة
أين الإصابات في المجموعة الضابطة؟
نحن في تجربة لرصد الحصانة التي يولدها المطعوم ولدينا مجموعة ضابطة سلبية (يعني ليس لديها حصانة) حتى تكون التجربة سليمة يجب أن نرى عدد كبير من الإصابات في هذه المجموعة وإلا فإن التجربة فاسدة. تماما مثل فحص الحمل لما لا يظهر الخط. أو مثل ورقة كشف الحمض حيث لا يجوز تقرأ رقم pH إن لم تعمل على المجموعتين الضابطة الإيجيابية والسلبية.
لدينا مجموعة من 22 ألف شخص في المجموعة الضابطة لا يملكون أي نوع من الحصانة لا تعافي ولا مطعوم ظهر فيهم 162 حالة فقط (يعني كانوا محصنين بنسبة 99.3% بدون مطعوم والإصابة هي حوالي 7 بالألف فقط). هؤلاء لو كانوا عينة عشوائية من مجتمع وقت التفشي لظهر فيهم حوالي 20% إصابات (نسبة الإيجابي وقت التفشي) يعني أكثر من 4400 حالة إصابة ولو كانوا في مجتمع وقت التفشي بنسبة إيجابي 5% لوجدنا فيها 1100 إصابة. الفرق بينهما وبين 0.7% كبير جدا وغير مقبول.
وللتذكير المجتمع يكون التشخيص فيه أقل من الحقيقي under-diagnosed لأن هناك مصابين لكنهم لا يفحصون. بعكس التجربة ففي التجربة يكون هناك فرط في التشخيص over-diagnosed يعني لا يوجد مصابين لكن لم يتم تشخيصهم ومع ذلك ظهر فقط 7 بالألف. وكان 99.3% من المجموعة محصنين دون حصانة؟
هل نحن ندرس فيروس غير معدي؟ هل التجربة تمت في حجر صحي ولم تخالط أحد؟ هل هناك تلاعب cherry-picking؟ أيا كان السبب فإن التجربة فاسدة ورقم الفعالية المرصود ليس له أي معنى. تماما مثل رقم pH في ورقة كشاف الحمض التي فشلت في ال control.
لتقريب الصورة لنتخيل أننا نقيّم سترة واقية للرصاص فعملنا تجربة وألبسنا 22 ألف دمية سترة واقية و 22 ألف دمية ألبسناهم سترة قماشية placebo وقمنا بإطلاق النار ثم احصينا كام رصاصة اخترقت السترة وأصابت الدمية فكان لدينا 162 دمية مصابة ممن تلبس سترة قماش من بين 22 ألف دمية! هذا هراء مالذي حمى هذه الدمى؟ هل الرصاص فشنك؟ أم هل كنت تصوب في الهواء؟ أيا كان السبب التجربة فاسدة.
في صفحة 15 من الدراسة على موقع FDA مذكور الشروط التي تؤهل شخص كي يتم اختياره للانضمام للدراسة ومنها أقتبس
Eligibility in Phase 2/3 included higher risk for acquiring COVID-19 in the investigator’s judgment, due to ... or exposure, such as: ... history of smoking ... Resident in a long-term facility .... Occupation with high risk of SARS-CoV-2 exposure (eg, healthcare, emergency response)
يعني إن كنت معرض للمخالطة كأن تكون طبيب فإنك مستبعد. هم يشترطون عدم وجود تعرض للمرض exposure الذي المفروض يختبروا مدى الحماية منه دون التعرض له. كأنك تختبر سترة واقي رصاص دون أن تعرض الدمية للرصاص. هل يعقل أن تختبر الزجاج المضاد للكسر دون تعريضه لمحاولة كسر؟ انظر كيف يختبرون سيارة مضادة للرصاص في هذا الفيديو
عدم ثبات الفعالية مع الانتشار والانحسار
المفروض أن نسبة فعالية أي لقاح هي نسبة robust لا تتأثر بالإنتشار والإنحسار كونها تحسب كنسبة ولأن اللقاح المفروض أنه هو سبب الإنحسار وليس مجرد شيء تزامن مع الإنحسار ولم يكن سببا فيه. كما ذكرنا أعلاه لو تمت تجربة لقاح فعاليته 95% وقت انتشار فحصلت 5 آلاف إصابة مقابل 250 إصابة أو تمت تجربته في وقت انحسار بإصابات أقل ب 10 أضعاف 500 إصابة مقابل 25 إصابة النسبة في الحالتين واحدة وهي 95%.
مر بالعالم عدة موجات كورونا لعلها 4 موجات كلها إنحسرت قبل اختراع المطاعيم وذلك بسبب السعة الحاملة في معادلة logistic growth with carrying capacity قبل اختراع المطعوم (سبب الإنحسارات السابقة هو أن الحالات النشطة المعدية لكثرة عددها كل واحد منها محاط بمصابين آخرين أو متعافين وليس معرضين للإصابة فيبدأ الإنحسار).
عند سؤال جونسون اند جونسون لماذا فعالية مطعومهم ٦٦٪ مقارنة بفايزر ٩٥٪ قالوا هذا لا يعني ان فايزر يحمي أكثر لكن ظروف التجربة فلو عملناها في ظروف انحسار مشابهة لحصلنا نسبة أعلى (انظر هذا الفيديو). هذا الكلام مناقض لتعريف الفعالية efficacy كصفة ثابتة للمطعوم مستقلة لأنها نسبة (كما سبق وذكرنا في فقرة عن ذلك أعلاه). فعالية المطعوم يجب أن تكون صفة جوهرية له وليست صفة عارضة. التحصين يجب أن يكون ناتج عن المطعوم وليس نتيجة عرضية لشيء ظرفي تزامن مع التجربة. ويجب تحييد أي عامل خارجي.
قد يقول قائل هذه مبررات جونسون وهما مطعومان منفصلان. وهنا نرد محل الاستشهاد في كلامهم ليس عن هذه الماركة أو تلك أو هذا المنتج أو ذاك بل السؤال هل هم قاسوا الفعالية الجوهرية للحصانة الناتجة عن المطعوم أم قاسوا شيء عرضي ظرفي. والجواب أنهم مجمعون أنه ظرفي (يعني ليست علاقة سببية بدليل تغيرها بتغير الظروف).
نعود لفايزر تقول الشركة في موقعها الرسمي press release الذي وضعنا رابطه أعلاه هذه الفقرة
Primary efficacy analysis demonstrates BNT162b2 to be 95% effective against COVID-19 beginning 28 days after the first dose;
الترجمة: فعاليته بعد 28 يوم من الجرعة الأولى وصلت إلى 95%. هل هذا صحيح ومطابق للواقع الذي رصدنا؟ هل فعلا يمنع الإصابة بمقدار 95% بعد الجرعة الأولى؟ طبعا هذا هراء نحن نعرف الكثير من الناس أصيبوا بعد الجرعة الأولى. لاحقا الإعلام كان يقول طبيعي لأن الحصانة لا تكتمل إلا بالجرعة الثانية لكن الدراسة على موقع الشركة تقول 95% فعالية بعد الجرعة الاولى! هل كانوا يكسبون الوقت؟ الموضوع ليس "شعور" إذ أن هناك دراسة مقارنة تمت في بريطانيا وجدت أن فعالية فايزر هي 61% بعد 28 يوم وليس 95% أقتبس
When vaccination status was assessed in individuals testing positive for SARS-CoV-2 (44,590; 28%) compared with those testing negative (112,340; 72%), a protective effect was seen in Pfizer/BioNTech BNT162b2 recipients 10–13 days after vaccination, reaching 61% effectiveness after 28 days. For those who received the AstraZeneca vaccine (ChAdOx1-S), protective effects emerged 14–20 days after vaccination, reaching 60% effectiveness after 28 days. -- DOI: 10.1136/bmj.n1088
هناك 44 ألف إصابة (الثلث تقريبا) فيمن أخذ المطعوم! هل هذا يشبه 95% حماية بالنسبة لك؟ قد يقول قائل حماية 60% أفضل من لا شيء. هنا نقول نحن الآن لا نتحدث هل هي 60% أم 95% نحن نسأل هي حماية جوهرية سببية أم عارضة (لسبب خارجي). والجواب طالما تتغير بتغير الظروف فهي عارضة وليست سببية. وهذا يدل أن الدراسة معيبة. إذا جمعنا هذه النقطة مع النقطة التي قبلها سنعلم أنه عند حدوث تفشي فإن هذا اللقاح لن يحمينا (كون الحماية فيه عرضية تابعة للإنحسار دون أن تكون هي سببا فيه).
لفت انتباهي العبارة التالية في الدراسة: أن فعالية المطعوم Vaccine Efficacy أكبر من 30% حسب beta-binomial model
VE of BNT162b2 is >30% using a beta-binomial model,
السؤال ماذا يقصدون أكبر من 30% يعني مثلا 30.1% أم 99%؟ ولماذا الغموض؟ وأين الرقم الدقيق؟
أين الضبط الإيجابي؟ هل اللقاح أفضل من التعافي؟ وما مقدار ذلك؟
كما قلنا الضبط نوعين أيجابي وسلبي. تماما كما نحتاج لضبط سلبي أي أن نقارن المطعمين مع من لايملك حصانة (مطعوم وهمي placebo) نحتاج أن نقارن حصانة المطعوم بحصانة المتعافي. هل مناعة المتعافي أقل أم أكثر؟ أم لعلها أدوم أم أسرع تلاشيا؟ كان يفترض أن يكون 22 ألف متعافي كي تكتمل الصورة. كما في فحص الحمل لما لا يظهر خط الضبط الإيجابي يجعل التجربة فاسدة ونتيجتها لا معنى لها. نعم هذا ليس جزء الممارسات المتبعة حاليا لكن السؤال لماذا ليس من الممارسات المتبعة مع أنه من أساسيات تصميم التجارب! لأنه ببساطة يتعارض مع مصلحة شركات الأدوية في المبيعات. المتعافي هو منافس مجاني للمنتج الذي تم تصميم التجربة لتسويقه. بالنسبة لهم هو ضياع زبون محتمل. بزنس قذر وليس علم. لا يوجد مبرر علمي واحد لعدم وجود الضبط الإيجابي في التجربة.
وحيث أنه مرت عدة موجات (ثلاثة أو أربعة) قبل بدء التطعيم فهناك عدد كبير من المتعافين في كل المجتمعات. لو كنا في أول موجة سيقولون بأننا لن نصل لنسبة كافية من الحصانة الطبيعية إلا بعد حصول عدد كبير من الوفيات. لكن ونحن في الموجة الرابعة (عالميا) فهذا يعني هذه الحصانة حقيقة موجودة مسبقا قبل المطاعيم وليست شيء نحاول السعي للحصول عليه.
من المعروف من خبرة البشر مع الأمراض السارية القديمة أن مناعة المطاعيم أقل فعالية من التعافي وأنها تحتاج جرعات تعزيز وأنها ليست مناعة دائمة. مثلا من يصاب بحصبة أو جدري يأخذ مناعة مدى الحياة لكن من يأخذ المطعوم يحتاج جرعات تعزيز وقد يصاب بالمرض.
أما تفسير ذلك فنحتاج نعرف باختصار (بسيط ومخل) كيف يعمل جهاز المناعة. جهاز المناعة يقوم بهجمات دفاعية لا تستهدف المرض على التعيين مثل رفع الحرارة والعاصفة المناعية هنا يقتل خلايا الجسم السليمة المحيطة بالمرض. يقتل الأخضر واليابس ويراهن أن خلايا الجسم أكثر بكثير من الدخيل الجديد فلو هاجم كل المنطقة بالبراميل المتفجرة فإنه سيقضي على الدخيل مضحيا ببعض ما حوله. وفي هذه الأثناء يكون يعمل على تطوير مضاد "تفصيل" أجسام مضادة تناسب هذا الوباء الدخيل بالذات مثل القناص تتعرف على الوباء دون غيره وتلتصق به. وجود الأجسام المضادة لا يعني أن الجسم كسب المعركة لكنه يعني أنه قام بردة فعل. هو مثل قيام المضادات الأرضية بالعمل على التصدي لغارة جوية لكنه لا يخبرك من انتصر وهل تمكن بالفعل من اسقاط طائرات العدو. هو ردة فعل بغض النظر ناجحة أم لا. مثلا مريض الإيدز لديه أجسام مضادة للإيدز لكن هذا لا يعني أنه هزم المرض. وهناك آلية مناعة تسمى خلايا الذاكرة memory cells حيث يقوم الجسم بعمل مخزون مستقبلي أو خطة مستقبلية للتصدي لهجمات مشابهة. يعني لو حصل هجوم مستقبلي فإنه لن يتنظر طويلا في تطوير الأجسام المضادة لأنه احتفظ بالقالب أو الخطة أو مخزون لهذه الأجسام المضادة. وهذه المراحل الثلاثة التي تحدثنا عنها تعمل بهذا الترتيب. يعني قد تكفي العاصفة المناعية في التصدي للمرض قبل انتاج الأجسام المضادة وقد ينتج الجسم أجسام مضادة ولا يحتفظ بخلايا ذاكرة. فالجسم لا يحتفظ بمخزون مستقبلي من ذخيرة ال memory cells لكل دخيل. فقط الدخلاء الشرسين. لذا لما يكون عندك دخيل ضعيف غير قاتل (مثل المطعوم) لماذا سيقوم الجسم بإعداد ترسانة مستقبلية للتصدي له؟
غياب الضبط الإيجابي يجعل الإجراءات التشجيعية المتبعة لأخذ اللقاحات في أغلب الدول مثل اشتراط التطعيم للسفر أو للتصاريح وعدم تطبيقها على المتعافين إجراءات دون سند علمي. ببساطة لا يوجد مندوب مبيعات يسمسر من المتعافين.
لو كان هناك ضبط إيجابي وتبين أن التعافي أفضل من اللقاح بنسبة 95% أو بالعكس وحيث أننا جربنا التعافي في أرض الواقعفإنه يمككنا ضبط توقعاتنا حيث أننا مررنا بموجات سابقة حصل فيها انحسار نتيجة التعافي. إنعدام الضبط الإيجابي يجعلنا عاجزين عن تقديم توقعات مستندة لأساس علمي بل مجرد أمنيات دون أي أساس علمي.
حذف/استبعاد نتائج آلاف الأشخاص من الدراسة دون إبداء الأسباب
التجربة بدأت بحوال 44 ألف شخص وهذا مذكور جدول صفحة 13 أن المرحلة الثالثة دخلها 44 ألف مشارك (يتم التعبير عنه N~44k في ملف الدراسة). كانوا حوالي 43252 ثم زادوهم ليصبحوا 43448 وهناك كلام عن إضافة 360 شخص دون توضيح لماذا تم إضافة هؤلاء الناس وعلى أي أساس. لكن ما هو أغرب هو أنه لغرض تجربة الجرعة الثانية تم استبعاد حوالي 6 آلاف إلى 8 آلاف شخص من التجربة. في ال press release الثاني العدد المذكور هو 36,523 وفي دراسة FDA الجدول صفحة 33 العدد هو 37,796 شخص والكلمة المستخدمة هي enrolled (يعني تم اختيارهم) وهناك أيضا كلمة unblinded. الموضوع مريب جدا. علما أن هذا غير متعلق بالمنسحبين اختياريا من الدراسة وعددهم بحسب جدول ص 33 حوالي مئتين وهو رقم قليل مقارنة بال 8 آلاف شخص.
لاحظ أن رقم التجربة واحد وهو C4591001 يعني تجربة ال 44 ألف مشارك هي نفسها تجربة 38 ألف مشارك وليس تجربة أخرى
الأشخاص الموضح أسباب انسحابهم بالعشرات إلى حوالي المئة. من ضمن تلك الأسباب حدوث انتكاسة للشخص Adverse event وعددهم فيمن أخذ اللقاح 20 وفيمن لم يأخذه 12 في مرحلة والثانية 8 فيمن أخذه مقابل 5 فيمن لم يأخذه. وهناك وفاتان حصلتا في المجموعة التي أخذت المطعوم. يعني بلغة بسيطة لما حد صار معاه انتكاسة وصلت درجة الوفاة سجلوها انسحاب ولم يسجلوها ضمن النتائج.
المصيبة الأكبر لا تكمن في المئتي منسحب بل في ال 8 آلاف الذين تم استبعادهم بشكل غامض. يعني لديك 44 ألف شخص بعد 21 يوم المفروض تعطيهم الجرعة الثانية اختارت الشركة أن تدخل في الدراسة enroll عدد 36 ألف منهم وتخفي نتائج 8 آلاف شخص.
لما تخرج النتائج بمئة إصابة مقابل 8 إصابات من أصل 44 ألف فإن إخفاء 8 آلاف نتيجة بالتأكيد يمكنها قلب النتيجة تماما. ولو تم احتساب الوفيات المنسحبة ضمن فعالية المطعوم سيكون دون أي فعالية تذكر. وقبل أن تقول أنه تم الانسحاب والحذف من المجموعتين أقول لك لكنه unblinded يعني كانوا يعملون أيهم من مجموعة اللقاح وأيهم من المجموعة الوهمية.
الدراسة ذات ال 44 ألف مشارك هي نفسها الدراسة ذات ال 36 ألف مشارك.ما حصل هو أن 36 ألف من أصل 44 ألف تم إشراكهم enrolled في المرحلة الثانية والثالثة وهناك 8 آلاف تم استباعدهم.
هل كانت تجربة معماة فعلا؟ وما أهمية ذلك؟
تناقلت وكالات الأنباء عناوين فيها عبارات تكييل المديح لهذه الدراسة كونها double-blind randomized placebo-controlled trial وكما شاهدنا أعلاه كل تلك العبارات سقطت. لكن ما معنى double blind؟ وكيف يؤثر سقوط هذه الصفة على موثوقية الدراسة؟ باختصار أن الشخص المتطوع في الدراسة يجب أن لا يعلم إن كان في أي مجموعة هل هو في مجموعة الوهمي أم مجموعة المطعوم (وذلك لتحييد عامل النفسية). كذلك الباحثين ممن يباشر جمع البيانات observer-blinded يجب أن لا يعلموا من من الأشخاص في أي من تلك المجموعات وذلك لتحييد عامل التحييز. بالنسبة لهم الشخص رقم 1467 أخذ الحقنة الحمراء والشخص رقم 27897 أخذ الحقنة الزرقاء. لكنه لا يعلم أيهما أخذ المطعوم. العاملين هم موظفين في الشركة ويأخذون رواتبهم وترقياتهم منها ومن مصلحتها ومصلحتهم ظهور نتائج فعالية مبالغ فيها أو مزيفة.
فك التعمية مذكور في press release
To date, the Data Monitoring Committee for the study has not reported any serious safety concerns related to the vaccine. A review of unblinded reactogenicity data from the final analysis which consisted of a randomized subset of at least 8,000 participants 18 years and older in the phase 2/3 study demonstrates that the vaccine was well tolerated, with most solicited adverse events resolving shortly after vaccination.
وأيضا في صفحة 16 و 17 من الدراسة
The Phase 2/3 portion of the study remains blinded to Sponsor and site personnel who are responsible for the ongoing conduct of the study, with regard to individual participants’ randomization. Safety evaluation by the study team remains blinded until a decision is made to unblind the entire study. A separate (from study conduct) small unblinded submissions team is responsible for regulatory submissions including the EUA application data analysis and submission.... When a COVID-19 vaccine is available under an EUA, placebo recipients who choose not to remain in the ongoing study will need to be unblinded to determine whether they received BNT162b2 or placebo,
يعني المستبعدين والمنسحبين كانوا unblinded. طيب لماذا تحديد فني الموقع blinded to site personnel؟ يعني مثلا اللي مسماه الوظيفي غير هيك لم تكن blinded لهم ؟ ما الضامن أن ال 8 آلاف unblinded لن يؤثروا على النتيجة؟ وما الضامن عدم وجود تواصل بين المسؤولين عن تنظيم الأمان safety regulations لم يتواصلوا مع "فني الموقع" اللي المفروض أنه blinded؟
ربما أكون أسأت التقدير أو الفهم في هذه الفقرات لكن الموضوع برمته مريب على أقل تقدير فعبارة observer blinded أشمل من blinded to site personnel وليس عندي ما يدفعني لافتراض حسن النية هنا.
الكيل بمكيالين
في صفحة 78 من الدراسة نجد الشروق التي اعتمدوها في تعريف الإصابة إلى جانب فحص إيجابي PCR/NAAT وهي أن يكون هناك واحد أكثر من الأعراض التالية: .... واحد أو أكثر من التشخيصات الإكلينيكية التالية: معدل نفس أكثر من ... معدل نبض أكثر من ... اكسجين أقل من 93% ... مستوى PaO2/FiO2 أقل من 300 ...إلخ...
السؤال عند إثارة الرعب في الناس يتم اعتماد الفحص وحيدا ويقال تم تسجيل كذا حالة كورونا لكن عند تقييم فعالية المطعوم تم تقييد تسجيل الإصابة بظهور واحد أو أكثر من علامات إكلينية محددة. بمعنى الإيجابي الذي لا يعاني من شيء لا يحتسب إصابة ما لم يظهر عليه أحد تلك العلامات المحددة. علما أنها علامات سهلة القياس وغير مكلفة ولا تأخذ وقت (عد النفس أو النبض أو حتى قياس مستوى الاكسجين الذي يمكن قياسه عبر الساعات الذكية أو عبر مجس يوضع على طرف الإصبع).
كما نعلم الكورونا مرض نسبة الوفاة منه (حسب أرقام الأردن) حوالي 1% وحوالي 10% يحتاجون رعاية ثم يشفون أما 90% فيشفون دون رعاية. احتساب أوعدم احتساب الحالات الطفيفة mild cases يقلب الأرقام بالكامل لأن أغلب الإصابات طفيفة mild.
في مقالة سابقة عن الدوال اللامتزامنة تحدثت عن هذا المفهوم وكيف يمكنه المساهمة في تشغيل عدة مهمات في نفس الوقت. وقلت أننا بحاجة لمقالة نبين فيها كيف نتحقق من أن الدوال تعمل معا بالتوازي وكيف نستخدم ال contextlib.asynccontextmanager وما هي عيوب الدوالي اللامتزامنة وكيف نتجنبها. يجب أن تقرأ المقالة السابقة قبل هذه المقالة.
محاكاة عدة طلبات
لنحاكي عملية وصول عدة طلبات متزامنة للخادم. كل طلب سيقوم باستعلام ما في قاعدة بيانات بعيدة وهذا يستغرق بين 100 ميلي-ثانية إلى 200 ميلي-ثانية (بمتوسط 150). في هذه المحاكاة معالجة كل طلب سيعمل غفوة عشوائية بذلك المقدار. كل طلب سيكون له رقم متسلسل يطبع عبارة "دخول المهمة رقم كذا" ثم يأخذ الغفوة ثم يطبع "الخروج من المهمة رقم كذا".
import time
import random
import asyncio
async def rndsleep(msg):
print(">>> entering ", msg)
seconds = random.randrange(100, 200)/1000.0
await asyncio.sleep(seconds)
print("<<< leaving ", msg)
async def myloop(n):
await asyncio.sleep(0.1)
for i in range(n):
task = asyncio.create_task(rndsleep(i))
yield task
دعونا نرى ماذا سيحصل
إضافة تقنيات جديدة لا يحل المشاكل
لو قمنا بتنفيذ 20 مهمة كل منها 150 ميلي-ثانية بالمتوسط بشكل متسلسل فإنه سيستغرق حوالي 20 * 0.150 ويساوي 3 ثوان. كذلك فإنه لن يبدأ المهمة رقم 2 إلا بعد أن ينهي مهمة رقم 1. وهنا لا يوجد أي فائدة.
بالمقابل لو بدأت المهمة التالية قبل أن تنتهي المهمة الأولى وكان الوقت المستغرق لانهاء كل المهمات أقل من مجموعها منفردة فإننا هنا نرى فعالية في معالجة عدة مهمات في نفس الوقت
دعونا من الكلام ولننظر للكود
async def main():
t0 = time.time()
async for task in myloop(20):
await task
print("took ", time.time()-t0, " seconds")
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
أعلاه فإننا نلاحظ أن المهمات تم تنفيذها بالتسلسل واحدة ثم ينتظر حتى تتم ثم يشغل التي تليها وأنه أخذ في تنفيذ 20 منها 3 ثوان تقريبا (أي أنها كانت تعمل بالتسلسل وليس بالتوازي)
الحل
نحن في المثال السابق كنا نشغل المهمة ثم مباشرة ننتظرها await قبل أن تبدأ المهمة التالية بالعمل. ماذا لو كومنا كل المهمات ثم في قائمة ثم انتظرنا هذه القائمة كما في هذا المثال
async def main():
t0 = time.time()
tasks = []
async for task in myloop(20):
tasks.append(task)
await asyncio.gather(*tasks)
print("took ", time.time()-t0, " seconds")
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
ونلاحظ أن المهمات كلها دخلت بالعمل معا حتى قبل أن تنتهي أول واحدة منهم وأن الوقت الإجمالي كان قريب من من زمن مهمة واحدة.
وقعنا في الفخ
في المثال السابق قمنا بتشغيل كل المهمات دفعة واحدة. تخيل لو أنها طلبات لموقع ولدينا عدد كبير من الاتصالات كل عملية تعمل استعلام على قاعدة البيانات وتعالج كمية كبيرة من البيانات وكل هذه البيانات موجودة في الذاكرة دفعة واحدة دون أي حد. ربما علينا أن نضع بعض المكابح حتى نضع سقف بحيث لا تنموا المهمات بحيث تلتهم كامل موارد الجهاز.
كيف وماذا نراقب؟
نحتاج أن نعد كم عملنا. كام واحدة نجحت وكام واحدة فشلت. وكلما دخلنا نزيد الميزان وكلما خرجنا نطرح من الميزان. إذا اشتغلت 3 مهمات فإن الميزان يزاد 3 مرات ثم ان نتهت واحدة يطرح واحد من الميزان ليصبح 2. الميزان يمثل طول طابور المراجعين أو عدد المهمات في الانتظار.
هذا الكود يسمى contextmanager ويستعمل عبر with. في المثال الأول كانت أقصى قيمة للميزان هي 1 والثاني كانت 20. ولو كان عندنا ملايين المهمات ستكون الطريقة الأولى 1 والثانية كلهم. وكلاهما سيء. واحدة تنفذهم بتسلسل وواحدة تنفذهم كلهم (إلى ما لا نهاية).
تعرف إلى الحواجز semaphore
الحاجز asyncio.Semaphore هو مجرد عداد يبدأ برقم ما نمرره له عند استهلاله مثلا 5 هذا الرقم يمثل عدد الموارد المتاحة. كلما طلب أحدهم حجزه يتم طرح واحد من العداد وعندما يحرره أحدهم يجمع له واحد. عند حجزه عدة مرات دفعة واحدة إلى أن يصل إلى الصفر. بمجرد أن يصل للصفر فإنه لا يعود فورا كما كان يعمل بل يتوقف ويأخذ غفوة إلى أن يتم تحرير عدد من الموارد ويعود الرقم ليصير موجبا. مثلا لدينا 20 مهمة تم تشغيلها معا. كل مهمة منها تطلب حجز هذا الحاجز الذي بدأ ب 5 فإنه سينفذ أول 5 مهمات ذات الأرقام 0 و 1 و 2 و 3 و 4 ثم يأخذ غوة حتى تنتهي بعض هذه المهمات.
sem = asyncio.Semaphore(5)
stats = Stats()
async def rndsleep(msg):
async with sem:
with stats.context():
print("››› entering ", msg)
seconds = random.randrange(100, 200)/1000.0
await asyncio.sleep(seconds)
print("‹‹‹ leaving ", msg)
هنا حددنا قيمة العداد ب 5 يعني أقصى طول لطابور الانتظار هو 5. ولن تمر المهمة رقم 6 إلا بعد انتهاء أي مهمة من المهمات التي قبلها. هذا يعني أن ال 20 مهمة ستعمل كل 5 معا كأنها موزعة في 4 دفعات. وستستغرق 4 ضرب طول المجموعة الواحدة والتي هي 0.200 يعني أقل من ثانية بقليل. المثال متوفر هنا
دفعات غير مرتبة من خلال asyncio.as_completed
هذه الدالة تأخذ قائمة من المهمات وتعيد generator يمكن السير عبر for لكن ليس بالترتيب بل تعيد أيهما تكتمل أولا. يعني لو اول مهمة تستغرق 200 ميلي-ثانية والثانية 120 والثالثة 130 فإنه تعيد الثانية ثم الثالثة ثم الأولى. كلما اكتملت واحدة تعيدها بغض النظر عن ترتيبها.
async def unordered_bulks(size, aiterable):
tasks = set()
async for task in aiterable:
tasks.add(task)
if len(tasks)>=size:
for coro in asyncio.as_completed(tasks):
yield coro
tasks.clear()
if len(tasks):
for coro in asyncio.as_completed(tasks):
yield coro
tasks.clear()
هذه الدالة التي عرفناها تأخذ حجم الدفعة ومتوالية async generator (حتى لو كانت لا نهائية) وتشغلها لما يتجمع عنها حجم الدفعة المطلوبة وتعيدها واحدة واحدة لما تكتمل
نتعامل في لغات البرمجة مع أحداث تأخذ وقت وفي هذا الوقت لا يكون المعالج يعمل شيء. مثلا لما نقرأ من ملف أو نكتب في ملف أو لما نرسل استعلام لخادوم قاعدة بيانات بعيد وننتظر الرد أو لما نرسل طلب إلى واجهة برمجية بعيدة API وفي هذه الأثناء بعد إرسال الاستعلام أو الطلب ننتظر الرد. وبدل أن تكون الخدمة معطلة تنتظر الرد يمكنها استغلال الوقت الضائع في الإنتظار في معالجة طلبات أخرى. قديما كان النموذج الوحيد للتعامل مع أكثر من عملية في نفس الوقت هو تعدد العمليات وتعدد خيوط المعالجة (multi-process و multi-thread) سواء كل طلب جديد في عملية أو مسار جديد منفصل أو بعمل pool مجهز مسبقا وتحويل الطلبات عليه عبر طابور queue. لكن هذين النموذجين لا يناسبان هذه الحالة التي شرحناها لأن عنق الزجاج هنا ليس المعالج نحن في هذه الأمثلة لا ننتظر حسابات معينة فنريد نواة معالج أخرى تحسب بينما الأولى مشغولة في الحسابات الأولى. نحن فعليا ننتظر. ننتظر IO. سواء كان disk io أو network io. ومن هنا ظهرت عائلة من اللغات أو من العبارات الخاصة في اللغات التي تمكنك من معالجة أكثل من طلب ضمن عملية واحدة دون الحاجة لتعدد العمليات وطبعا الشرط الوحيد هنا أن لا تكون هذه الطلبات عبارة عن حسابات cpu intensive بل تكون io intensive هذه العائلة تسمى asyncio أو event driven.
وأيضا نتعامل في مع استعلامات لقواعد بيانات تعيد عدد كبير من النتائج. لنفرض أن لدي قاعدة بيانات فيها سجلات مليون طالب وأريد جلبها وعمل شيء معين عليها وليس من المنطق وضع المليون سجل في الذاكرة رام كلهم دفعة واحدة. توفر قواعد البيانات شيء يسمى cursor وتوفر لغات البرمجيات أدوات للتعامل مع تدفق سيالات البيانات التي تأتي تباعا تسمى generators. أو لنفرض أن لدي ملف نصي به مليون سطر وأريد أقصر أو أطول سطر في الملف. لا داع لرفع الملف كله في الذاكرة رام. كل ما يلزمني هو سطر واحد وكلما انتقلت للسطر التالي نسيت الذي قبله.
مع الأسف الكثير من المبرمجين لا يحسنون التعامل هذه المفاهيم وكثيرا ما يضعون الكثير من البيانات في الذاكرة رام أو يضيعون الموارد بحجز عدد كبير جدا من العمليات processes لم يكن لها داع أو مبرر. لذا صممت تمرين أوضح في هذه المفاهيم.
التمرين
من فترة نشرت "تمرين" بلغة جافاسكربت أو asyncio في بايثون 3. لدينا متوالية معلينة ولنقل متوالية فبوناتشي التي تبدأ ب 1 ثم 1 ثم مجموع آخر رقمين وهي لا تنتهي. هكذا 1 ثم 1 ثم 2 ثم 3 ثم 5 ثم 8 ثم 13 ...إلخ نريد دالة تعيد أرقام متسلسلة فبوناتشي واحدا واحدا لكنه ينتظر 10 ميليثانية بين الرقم والرقم اللي بعده (في محاكاة لكونه يرجع من استدعاء بعيد API call). ونريد عمل دالة تعيدها في صورة حزم bulks من حجم معين مثلا حجمها 10 عناصر. يعني تعيد أول 10 عناصر ثم ثاني 10 عناصر في المتسلسلة ثم اللي بعدهم ثم اللي بعدها ويجب أن تقبل أي متسلسلة نعطيها إياها (وليس بالضرورة فبوناتشي). ثم نريد عمل برنامج يطبع أول ثلاث حزم.
المطلوب تكون فبوناشي دالة منفصلة حتى نستبدلها بمتوالية أخرى مثلا تعيد 1 ثم 2 مكرر مرتين ثم 3 مكرر 3 مرات ثم 4 مكرر 4 مرات هكذا 1, 2, 2 , 3,3,3 , 4,4,4,4 ... وطبعا نريد 10 ميلي-ثانية بين كل رقمين.
جميع المحددات هنا مثل ال 10 ميلي-ثانية وال 10 عناصر وال 3 حزم يجب أن تكون متغيرات يمكن تمريرها sleep_ms و bulk_size و iteration_count
الحل المطلوب يجب أن لا يبتلع الرام ولا يتسبب في فيضان stack overflow
الهدف من التمرين
تم تصميم التمرين بحيث تكون المتوالية لا نهائية فمن تعود أن يضعها كلها في الرام لا ينجح. وتم إضافة غفوة 10 ميلي-ثانية بين كل رقمين لتحاكي إرسال طلب وانتظار نتيجته ثم عمل شيء عليه مثل تحديث الواجهة. مثل طلبات AJAX في الواجهة الأمامية أو مثل استعلامات قواعد البيانات في الواجهة الخلفية (يعني الموضوع هذا يهم مطوري ال frontend و ال backend على السواء).
بعض المشاكل الشائعة
تسلسل التنفيذ
من عمل في الواجهة الأمامية لا بد وأنه يذكر مشكلة تشبه هذه
يقوم بعملية تأخذ وقت (اطلب مورد ما لا-تزامني مثلا طلب AJAX أو رفع أو تنزيل صورة)
هنا قمنا باسدعاء واجهة برمجية API للسؤال عن تفاصيل المستخدم ذي المعرف 123 ثم طبعنا اسم ذلك المستخدم لكن الفخ أننا طبعنا اسم المستخدم قبل أن يصل الرد على الاستدعاء. صحيح أن عبارة طباعة الاسم مكتوبة في الكود بعد ارسال الاستدعاء لكنها ستنفذ بعد إرساله وليس بعد عودة الرد بالنتيجة.
الفيض overflow
الكثير من الناس متعودين على كتابة فبوناتشي بطريقة الاستدعاء الذاتي. يعمل دالة تأخذ رقم الذي هو ترتيب العدد المطلوب وتعيد نتيجة جمعه من الاثنين اللي قبله.
function fibonacci(n) {
if (n<=2) return 1;
return fibonacci(n-1)+fibonacci(n-2);
}
لكن هذا يؤدي إلى فيض مثلا عند حساب fibonacci للعدد 100 فإننا نستدعيها لل 99 و 98 وهما بدورهما يستدعيان 98 و 97 وأيضا 97 و 96. كلما دخلنا في دالة فإنها تعمل تحجز مساحة من المكدس stack push (تحفظ كل المتغيرات المحلية وتحجز مكان للقيمة المعادة وعنوان العودة) وكلما خرجنا من دالة فإنها تحرر تلك المساحة وتعيد القيمة. لكن ما يحصل في هكذا دالة أن الدالة التي استدعيناها هي الأخرى تستدعي ولما تعود فإنها لا تحررها بل تنتظر عودة الدالة على الطرف الآخر من عملية الجمع. أي أن تحرير المكدس يتأخر ويظل يتراكم حتى يبتلع كل الذاكرة.
أحد الحلول لتجنب ذلك هي التذكر memoization بمعنى أن الدالة الأولى تحسب معها كل ما قبلها وتتذكره فلما نأتي للطرف الآخر في عملية الجمع تكون النتيجة محسوبة مسبقا. لكن هذا الحل غير عملي لأنها متوالية لا نهائية وأيضا هذه الدالة لا تحتاج إلا آخر رقمين كي تجمعمها يعني لما توصل لل 100 يلزمك 99 و 98 ولما تطلع إلى 101 يلزمك 100 و 99 ولا يلزمك تذكر الأرقام من 1 إلى 98 كلها مساحة مهدورة لا داع لتذكرها. الفرق جوهري وكبير لأن الاحتفاظ برقمين يعتبر ال O هو 1 في ال space complexity أما الاحتفاظ بكل ما سبق يعتبر O هو n وشتان بينهما.
مفاهيم مرتبطة بالحل
المولدات Generators
لو فتحنا جافاسكربت تفاعلية (سواء نود أو في المتصفح) وكتبنا الأسطر
لاحظ أن a تمثل حالة بينية و b تمثل الرقم التالي في متوالية فبوناشي ولا يوجد استهلاك غير مبرر للذاكرة رام. لكن كيف نصيغ هذه المتوالية اللانهائية في شكل دالة؟ الجواب باستعمال المولدات generators وهي دوال تعرف عبر وضع علامة نجمة على اسمها وتستخدم yield مكان return لإعادة كل قيمة جديدة. هي لا تعيد قائمة list ولا منظومة array لكن ما تعيده هو كائن يتصرف بطريقة مشابهة هي أنه iterable أي يمكن عمل حلقة تكرارية تدور على محتوياته. لكن الجميل فيها أنه لا يحتفظ بها كلها في الذاكرة. فكلما يعيد رقم ينسى الذي قبله.
def fibonacci():
a=1
b=1
yield a
yield b
while(True):
a, b = b, a+b
yield b
# interactive shell
>>> gen=fibonacci()
>>> next(gen)
1
>>> next(gen)
1
>>> next(gen)
2
>>> next(gen)
3
>>> next(gen)
5
>>> next(gen)
8
>>> next(gen)
13
>>> next(gen)
21
>>> next(gen)
34
البعض قد يظن أن موضوع yield هو مجرد "سكر صياغة". بالعكس تماما الموضوع جدا مهم حيث أننا داخل دالة والدالة لا تزال تعمل. تعيد قيمة وتظل تعمل دون استدعاء جديد. وتعمل بتسلسل سهل الفهم. لا يوجد فيضان stack overflow ولا يوجد استهلاك غير مبرر للذاكرة.
الدوال اللامتزامنة async function
لنعد إلى مثال ال ajax ولنتخيل أنه عوضا عن استقبال callback اسمه success والدخول في جحيم callback hell لنتخيل أنه يعيد كائن من نوع وعد Promise وهو يستقر على رد الخادوم عندما يصل. هذا كود وهمي بلغة جافاسكربت لتوضيح المفهوم
async function main() {
let user = null;
user = await get_ajax_user_promise(123);
console.log(user.name);
}
main();
الفارق هنا أننا نبرمج بطريقة متسلسلة مفهومة السطر الأول ثم السطر الثاني وهكذا. ال control flow البسيط لا يشتت أفكارنا بين ما سيحصل لما يأتي الرد من الخادوم للاستدعاء ajax وتنفيذ السطر التالي قبل وصول الرد كما كان الحال في جحيم ال callback hell. تخيل معي أننا نريد تنفيذ شيء ما do_something بعد انتظار عدد من أجزاء الثانية ms عبر setTimeout التي تنفذ ال callback بعد الوقت المطلوب. ونريد ذلك 3 مرات. سينتج معنا جحيم callback hell يسميه البعض سرب الحمام.
ربما لمن قدم من بايثون 2 قد يرى هذا تعقيد لا داع له إذ أن الدالة ستعمل تماما لو استعملنا time.sleep وبدون await. الفرق الجوهري هنا أن await تنقل التحكم من الدالة التي نحن فيها وتعيد التحكم للحلقة الرئيسية event loop وهي بذلك تحررها كي تفعل أشياء أخرى في هذا الوقت بعكس sleep التي ستحجب البرنامج block في هذه الأثناء ولا تتيحه كي يفعل أشياء أخرى. لنتخل أن لدينا موظف في دائرة الأحوال استقبل أول مراجع وطلب منه تعبئة النموذج في الوقت الذي يقوم فيه المراجع بالبحث عن قلم وملئ النموذج يكون الموظف يعمل مع مراجع آخر مثلا ويطبع له الوثيقة وبينما الطابعة تطبع الوثيقة يأتي مراجع ثالث ...إلخ وقارنه مع موظف ينتظر المراجع الاول حتى يمكمل كامل معاملته ثم يبدأ بالمراجع الثاني وهكذا. هذا الفرق بين الموظف السوبرمان الذي والموظف الإنسان الطبيعي هو الفرق بين الدوال التقلدية والدوال اللامتزامنة. وأهم تطبيق لها هو عمل خوادم تعالج أكثر من طلب في نفس الوقت. بينما أول طلب يعمل استدعاء لقاعدة البيانات وقبل أن تعود النتائج يتعامل الخادم مع طلب ثاني وهو ما يلبث أن يطلب فتح ملف على القرص وبينما الملف يتم قراءته يتعامل الخادم مع طلب ثالث وهكذا.
كنت أود أن أتحدث عن كيف تتحقق من أن الكود يعمل بالتوازي ويمكنه بالفعل تشغيل أكثر من طلب معا. وكيفية استعمال ال contextlib.asynccontextmanager في بايثون. وما هي عيوب الدوالة اللامتزامنة وكيف تجنب هذه العيوب. لكني سأترك كل هذا لمقالة لأخرى لأن هذه المقالة صارت أطول مما كنت أتوقع.