الثلاثاء، 4 أغسطس 2020

كل ما يخص قسم نظم ومعلومات حيوية بكليات الحاسبات والمعلومات

 قسم نظم ومعلومات حيوية  bioinformatics

Sub-disciplines of Bioinformatics and skill-set needed for a ...

اولا: هنتعرف علي القسم وايه الفرق بينه وبين اقسام حاسبات عام

ثانيا: هنتعرف علي الشغل وسوق العمل

ثالثا: هنتعرف علي طريقة التقديم في القسم بعد ثانوية عامة

رابعا: المصاريف في جامعات مصر


في البداية الكلام ده بيشمل كل اقسام البايوانفورماتكس في كل جامعات مصر لكن يمكن ان يكون هناك اختلاف بسيط بين جامعة واخري
 

اولا: هنتعرف علي القسم وايه الفرق بينه وبين اقسام حاسبات عام

القسم خاص في جامعة حكومية،يعني انت داخل كلية حاسبات ومعلومات حكومي بس القسم بتاعك ليها مصاريف خاصة عن باقي اقسام الكلية زي كلية تجارة انجليزي القسم ده خاص ليه مصاريف زيادة عن تجارة عربي.

الهدف من القسم باختصار انك بتدرس الرياضة التطبيقية وعلم الاحصاء وعلم البيانات والبايولوجي وعلوم الحاسب علشان تقدر تربطهم ببعض وتقدر تعمل ابليكشن طبي .علي سبيل المثال ....ابليكشن طبي يقدر يعمل مقارنة بين مجموعة من الDNA بيطلع وجه التشابه والاختلاف بينهم وهكذا

الفرق بين قسم بايوانفورمتك وباقي اقسام الكلية من حيث المواد : من كلمة بايوانفورماتكس هتلاحظ انها بتتقسم جزيئن بايو علم الاحياء، انفورماتكس علم المعلومات والبيانات ، انت بتدرس اول سنتين معظم مواد جينرال او حاسبات عام زيك زي باقي الطلبة االلي دخلين من علمي رياضة تقريبا هيبقي فيه فرق بسيط بس في كام مادة مختلفة عنهم بعد اول سنتين انت هتختلف في موادك عن باقي اقسام العام (الطلبة اللي دخلين من  علمي رياضة )لكن برضه هيكون فيه مواد بسيطة مشتركة بينك وبين باقي اقسام العام بس التركيز الاكبر هيكون علي مواد البيولوجي
   

الفرق بين البايوانفورماتكس ، الميديكل انفورماتكس،  والبايوميديكال انفورماتكس   :

1- البايوانفورماتكس : باخنصار هو التعامل مع البيانات الحيوية المختلفة زي RNA , DNA , Proteins , Enzymes والعلاقة بين اليات التشغيل لتحقيق وظيفة بيولوجية .  

2- الميديكل انفورمتكس : ده بيهتم بالاجهزة الطبية وتطويرها .

3-البايوميديكال انفورماتكس: ده بيجمع بين البايوانفورمتكس والميديكل انفورمتكس يعني بيهتم بالاجهزة الطبية وتطويرها والسوفت وير اللي جوة الاجهزة .

 

ثانيا: الشغل وسوق العمل


 الاسئلة اللي بتدور في دماغ كل واحد دلوقت :
هل القسم ده ليه شغل كتير في مصر؟
هل ينفع اشتغل زي حاسبات عام ؟
القسم هياهلني لسوق العمل ؟

 اولا شغل القسم في مصر حاليا بداء يزيد وينتشر الشغل بيكون في مراكز البحوث ، الطب الشرعي ،شركات الادوية ،وزارة الصحة ،  المستشفيات الكبيرة زي 57357 لكن الشغل بره مصر متوفر جدا  وبمرتبات عالية جداا لكن انت كاخريج حاسبات ومعلومات ينفع تشتغل زي اي حد في الاقسام العامة لانك بتدرس كل اساسيات البرمجة زيك زيهم بالظبط غير الدراسة في الكلية عامتا معتمده علي التعليم الذاتي يعني الكلية بتعلمك اساسيات كل حاجة لكن انت بتتعلم الباقي مع نفسك والنت واليوتيوب مليان لكن الكلية مش هتاهلك لسوق العمل بشكل كافي سواء في قسم البايو او اي قسم تاني فلازم من اول سنة ليك في الكلية تتعود انك تتعلم من النت واليوتيوب علشان محدش في الكلية هيديك المعلومة كاملة...  يعني لو طلعت من الكلية ملقتش شغل  تبع القسم بتاعك او مش حابب القسم ومش حابب شغله تقدر تشتغل علي نفسك وتتعلم اي مجال تاني من مجالات البرمجة تكون انت بتحبها

نصيحة :ياريت تدخل القسم علشان انت حابه او حابب البرمجة عموما او عندك استعداد انك تتعلمها حتي لو متعرفش عنها حاجة خالص
 الفكرة انك لو داخل وعايز تتعلم هتقدر تثبت نفسك في الكلية لكن لو داخلها وانت مش حاببها وداخلها استخصار مجموع بلاش تدخلها علشان هتتعب فيها ...بالمناسبة الكلية حلوة جدا والمواد بتاعتها حلوة وممتعة في دراستها بس انت حبها واجتهد فيها ..وشغلها حلو جدا ومتوفر في كل حته (ده بالنسبة للاقسام العامة او اي مجال انت عايز تتعلمه مع نفسك سواء اندرويد, ويب ....الخ ،لاني زي مقولت فوق المجالات دي الطلبه بتتعلمها بنفسها سواء كورسات بره او من النت وانت بما انك واخد الاساسيات في الكلية زي طلبة عام تقدر برضو تتعلمها بعيد عن الكلية وتشتغل بيها ) مش مهم انت في قسم ايه المهم انك حتي لو مش حابب القسم بتاعك تقدر تشتغل في حاجة تاني مع نفسك والكلام ده هتفهمو اول متدخل الكلية

ثالثا :التقديم في الكلية

التقديم بيكو ن كالاتي
اولا الكلية مش هتنزلك في التنسيق لانك علمي علوم 
بعد مالنتيجة بتظهر انت بتقدم في اي كلية في التنسيق حسب مجموعك بعد ما تتقبل في كلية معينة بتروح المبني الاداري في الجامعة اللي اتقبلت فيها وتعمل طلب تحويل من الكلية اللي اتقبلت فيها الي القسم الخاص (نظم معلومات حيوية)

 في كلية الحاسبات والمعلومات وبعد كده ورقك بيتحول للكلية وفيه جامعات بتعمل تنسيق داخلي   وبيختارو الطلبة علي حسب العدد اللي هما عيزينه والطلبة اللي بتقبلو بيبعتولهم ، وفيه جامعات مبتعملش تنسيق داخلي وبيقبلو اللي جايبين مجموع حاسبات عادي .

رابعا مصاريف الكلية :

 :ودي مصاريف الجامعات السنة اللي فاتت

جامعة المنوفية 12الف في السنة
جامعة كفر الشيخ 18 الف في السنة
جامعة المنيا 13 الف في السنة
جامعة القاهرة 30 الف في السنة
جامعة اسيوط 22 الف في السنة
جامعة المنصورة 18 الف في السنة
جامعة عين شمس 30 الف في السنة
#تحياتي
محمود سيد يوسف
طالب بكلية الحاسبات والمعلومات قسم المعلوماتية الحيوية جامعة اسيوط

What are the best blogs about bioinformatics? - Quora

الأحد، 5 أبريل 2020

شاهد بالتفاصيل السبب وراء انتشار فيروس كـــــورونــــا من الصين لجميع دو...

رابط التقرير في جريدة The New York Times علي مدونة أينشتاين مصر



أخبار سيئة بخصوص البروتين الملفوف داخل جينوم فيروس كورونا تبعا لجريدة نيويورك تايمز الامريكية
Bad News Wrapped in Protein: Inside the Coronavirus Genome
----------------------------------------------------------------------------------------
A virus is “simply a piece of bad news wrapped up in protein,” the biologists Jean and Peter Medawar wrote in 1977.
In January, scientists deciphered a piece of very bad news: the genome of SARS-CoV-2, the virus that causes Covid-19. The sample came from a 41-year-old man who worked at the seafood market in Wuhan where the first cluster of cases appeared.
Researchers are now racing to make sense of this viral recipe, which could inspire drugs, vaccines and other tools to fight the ongoing pandemic.
-------------------------------------------------------------------------------------
A String of RNA:- (أينشتاين مصر)
Viruses must hijack living cells to replicate and spread. When the coronavirus finds a suitable cell, it injects a strand of RNA that contains the entire coronavirus genome.
--------------------------------------------------------------------------------------
The genome of the new coronavirus is less than 30,000 “letters” long. (The human genome is over 3 billion.) Scientists have identified genes for as many as 29 proteins, which carry out a range of jobs from making copies of the coronavirus to suppressing the body’s immune responses.
The first sequence of RNA letters reads:
auuaaagguuuauaccuucccagguaacaaaccaaccaacuuucgaucucuuguagaucuguucucuaaacgaacuuuaaaaucuguguggcugucacucggcugcaugcuuagugcacucacgcaguauaauuaauaacuaauuacugucguugacaggacacgaguaacucgucuaucuucugcaggcugcuuacgguuucguccguguugcagccgaucaucagcacaucuagguuucguccgggugugaccgaaagguaag
This sequence recruits machinery inside the infected cell to read the RNA letters — a, c, g and u — and translate them into coronavirus proteins.
----------------------------------------------------------------------------------------
The full coronavirus genome and the proteins it encodes are shown below.
A Chain of Proteins · ORF1ab
The first viral protein created inside the infected cell is actually a chain of 16 proteins joined together. Two of these proteins act like scissors, snipping the links between the different proteins and freeing them to do their jobs.
--------------------------------------------------------------------------------------
You can continue reading on the link below

الأحد، 22 مارس 2020

اول امبارح كانت ليلة الاسراء والمعراج
الليلة الي ربنا فرض فيها الصلاه تكون هي ليلة منع الصلاة في المساجد
الي اين وصل بنا الحال
اللهم ارفع مقتك وغضبك عنا 😔🤲🤲🤲
#كــــورونـــــــا
#خليك_في_بيتك

السبت، 14 مارس 2020

Chinese hospitals discharge 36,117 recovered patients of coronavirus infection

A recovered patient (R) waves to medical staff of the temporary hospital in Wuhan, central China's Hubei Province, Feb. 26, 2020.(Xinhua/Shen Bohan)
BEIJING, Feb. 28 (Xinhua) -- A total of 36,117 patients infected with the novel coronavirus had been discharged from hospital after recovery by the end of Thursday, Chinese health authority said Friday.
Thursday saw 3,622 people walk out of hospital after recovery, the National Health Commission said in its daily report.
By the end of Thursday, a total of 78,824 confirmed cases of novel coronavirus infection had been reported in 31 provincial-level regions on Chinese mainland, and 2,788 people had died of the disease.

 #أينشتاين_مصر
#Mahmoud Alyosify


المصادر (Sources)

الثلاثاء، 3 مارس 2020

العمليات الحسابية على الأعداد العشرية لغة python (أينشتاين مصر)

تمثّل الأرقام العشرية ذات الفاصلة العائمة float في الحاسوب باستخدام كسور النظام الثنائي binary (الأساس 2)، فعلى سبيل المثال، الكسر العشري 0.125 يمتلك القيمة 1/10 + 2/100 + 5/1000، وبنفس الطريقة يمتلك الكسر الثنائي 0.001 القيمة 0/2 + 0/4 + 1/8.

يمتلك هذا الكسران القيمة ذاتها، ولكن الفرق الوحيد بينهما هو أنّ الأول مكتوب بواسطة التمثيل الكسري ذي الأساس 10، أما الثاني فممثل بالأساس 2.

ولكن لا يمكن تمثيل معظم الكسور العشرية ككسور ثنائية مضبوطة، ونتيجة لذلك، فإنّ الأعداد العشرية ذات الفاصلة العائمة تقرّب بواسطة الأعداد الثنائية ذات الفاصلة العائمة المخزّنة في جهاز الحاسوب.

من اليسير بادئ الأمر فهم المشكلة في النظام العشري، فالكسر 1/3 على سبيل المثال يمكن تقريبه ككسر عشري إلى 0.3 أو أفضل من ذلك إلى 0.33 أو أفضل من ذلك إلى 0.333 وهكذا.

مهما كان عدد الأرقام التي ستضيفها فإنّ النتيجة لن تكون مساوية بالضبط للكسر 1/3، ولكن التقريب سيكون أفضل في كلّ مرة.

وبنفس الطريقة، مهما كان عدد الأرقام الثنائية التي سترغب في استخدامها، لا يمكن تمثيل القيمة 0.1 بدقة ككسر في النظام الثنائي، فقيمة الكسر 1/10 في هذا النظام هي:

0.0001100110011001100110011001100110011001100110011‎...‎

يمكنك التوقف عند أيّ عدد من البتات، وستحصل على قيمة مقرّبة للعدد. تقرّب معظم أجهزة الحاسوب الحالية الأعداد العشرية ذات الفاصلة العائمة باستخدام كسر ثنائي يكون فيه البسط أول 53 بتاً تبدأ من البت الأكثر أهمية، والمقام كأُسّ للعد 2. وفي حالة العدد 1/10 يكون الكسر الثنائي هو:  ‎3602879701896397 / 2 ** 55‎ وهي نتيجة مقاربة جدًّا للقيمة الحقيقية للكسر 1/10.

لا يشعر معظم المستخدمين بعملية التقريب هذه بسبب طريقة عرض القيم، إذ تطبع بايثون فقط قيمة عشرية تقريبية للقيمة العشرية الحقيقية الخاصة بعملية التقريب الثنائية والمخزّنة في الحاسوب. وفي معظم الأجهزة، لو طبعت بايثون القيمة العشرية الحقيقية للتقريب الثنائي المخزّن للرقم 0.1، فإن النتيجة ستكون:

>>> 0.1 0.1000000000000000055511151231257827021181583404541015625

هذا الكم الكبير من الأعداد ليس مفيدًا في نظر الكثير من الناس؛ لذا تتحكم بايثون في عدد الأرقام وذلك بعرض القيمة المقرّبة فقط:

>>> 1 / 10 0.1

تذكّر دائمًا أنّه وعلى الرغم من أن القيم المطبوعة تبدو مثل القيمة الحقيقية للكسر 1/10، إلا أنّ القيمة الحقيقية المخزّنة في الحاسوب هي أقرب تمثيل للكسر الثنائي.

إلى جانب ما سبق، هناك العديد من الأرقام العشرية المختلفة التي تتشارك مع بعضها نفس الكسر الثنائي المقرّب، فعلى سبيل المثال تقرّب الأعداد 0.1 و 0.10000000000000001 و .1000000000000000055511151231257827021181583404541015625 عن طريق الكسر ‎3602879701896397 / 2 ** 55‎. ولما كانت الأرقام السابقة جميعها تتشارك في نفس مقدار التقريب، يمكن لأيّ منها أن يعطي النتيجة True عند اختبارها باستخدام التعبير: eval(repr(x)) == x.

في الإصدارات السابقة من بايثون يختار المحثّ والدالة الداخلية repr() العدد الذي يمتلك 17 رقمًا معنويًّا، وهو 0.10000000000000001 .

أما في الإصدار 3.1 وما بعده فقد أصبحت اللغة (وفي معظم أنظمة التشغيل) قادرة على اختيار أقصر النتائج وستعرض العدد 0.1 فقط.

لاحظ أنّ سبب المشكلة عائد إلى طبيعة الأعداد الثنائية ذات الفاصلة العائمة، وهي ليست عيبًا في بايثون ولا في شيفرتك البرمجية، وستلاحظ وجود هذه المشكلة في جميع اللغات البرمجية التي تدعم العمليات الحسابية على الأعداد ذات الفاصلة العائمة في جهازك، على أنّ بعض اللغات لا تعرض بصورة افتراضية الفروقات بين الأعداد، أو لا تعرضها في كل أشكال المخرجات.

يمكن الحصول على مخرجات أوضح عن طريق تنسيق السلسلة النصية لإظهار عدد محدّد من الأعداد المعنوية:

>>> format(math.pi, '.12g')  # يعطي 12 عددًا معنويًّا '3.14159265359' >>> format(math.pi, '.2f')   # يعطي عددين بعد الفاصلة العشرية '3.14' >>> repr(math.pi) '3.141592653589793'

من الضروري الانتباه إلى أنّ ما يحدث في الواقع هو وهم نظري، فما يجري هو عملية تقريب للعدد المعروض من قبل الحاسوب فقط.  وقد يؤدي ذلك إلى الوقوع في وهم آخر، فعلى سبيل المثال، لما كان العدد 0.1 لا يساوي بالضبط 1/10 فإن جمع 0.1 مع نفسها مرتين قد لا يعطي الناتج 0.3 بالضبط:

>>> .1 + .1 + .1 == .3 False

كذلك لا يمكن للعدد 0.1 أن يصل إلى القيمة المضبوطة للكسر 1/10 كما لا يمكن للعدد 0.3 أن يصل إلى القيمة المضبوطة للكسر 3/10، وهكذا فإنّ التقريب المسبق باستخدام الدالة round() لن يجدي نفعًا:

>>> round(.1, 1) + round(.1, 1) + round(.1, 1) == round(.3, 1) False

صحيح أنّ الأعداد لا يمكن تقريبها إلى القيمة المضبوطة، ولكن تكون الدالة round()‎ مفيدة لإجراء التقريب اللاحق، وبهذا يصبح بالإمكان مقارنة الأعداد ذات القيم غير الدقيقة بعضها ببعض:

>>> round(.1 + .1 + .1, 10) == round(.3, 10) True

هناك الكثير من المفاجئات المماثلة التي تظهر عند التعامل مع الأعداد الثنائية ذات الفاصلة العائمة. يناقش القسم أخطاء التمثيل أدناه مشكلة العدد 0.1 بالتفصيل.

ومع ذلك يجب عدم الإفراط في الخوف من التعامل مع الأعداد الثنائية ذات الفاصلة العائمة، فالأخطاء التي تظهر في العمليات التي تجري على هذه الأعداد ناتجة من طريقة تعامل الحاسوب مع هذه الأرقام، وفي معظم الأجهزة تكون نسبة الأخطاء جزءًا من ‎2**53‎ لكل عملية، وهذا المقدار كافٍ في معظم الحالات، ولكن يجب الانتباه إلى أنّ العمليات التي تجري على الأعداد ليست عشرية وأنّ كلّ عملية حسابية ستعاني من خطأ جديد في التقريب.

قد تظهر الحاجة إلى تجنّب هذه الأخطاء في التطبيقات التي تعالج حالات مرضية، ولكن في معظم الحالات الأخرى يكفي ببساطة تقريب الأعداد المعروضة في النتيجة النهائية إلى عدد الأرقام المطلوبة أو المتوقعة. وعادة ما يكفي استخدام الدالة str()‎، وللتحكم في هذه الدالة بصورة أكبر يمكنك مراجعة محدّدات التنسيق في تابع str.format() في فصل تنسيق السلاسل النصية.

إن كانت هناك حاجة إلى تمثيل الأرقام العشرية بدقّة فيمكن استخدام وحدة decimal والتي تتضمن عمليات حسابية مناسبة للتطبيقات المحاسبية والتطبيقات التي تتطلب دقّة عالية جدًّا.

تتضمّن الوحدة fractions كذلك عمليات حسابية دقيقة بالاعتماد على الأعداد الكسرية (rational numbers) وبذلك يمكن تمثيل العدد 1/3 مثلًا بدقّة.

إن كنت ممّن يستخدمون الأرقام ذات الفاصلة العائمة بكثرة فيجدر بك إلقاء نظرة على حزمة Numerical Python أو الحزم الأخرى الخاصّة بالعمليات الحسابية والإحصائية والتي يوفّرها مشروع SciPy.

تقدّم بايثون بعض الأدوات التي تساعد في الحالات النادرة التي ترغب فيها بمعرفة القيمة المضبوطة للعدد العشري. يمكن استخدام التابع as_integer_ratio()‎ لعرض قيمة العدد العشري على هيئة كسر عشري:

>>> x = 3.14159 >>> x.as_integer_ratio() (3537115888337719, 1125899906842624)

ولمّا كانت النسبة دقيقة، فبالإمكان استخدامها لإعادة إنشاء القيمة الأصلية:

>>> x == 3537115888337719 / 1125899906842624 True

يعرض التابع hex() العدد العشري بصيغة ست عشرية (الأساس 16) ويعطي القيمة المضبوطة والمخزّنة بواسطة الحاسب:

>>> x.hex() '0x1.921f9f01b866ep+1'

يمكن استخدام التمثيل الست عشري هذا لإعادة بناء القيمة العشرية ذاتها باستخدام التابع fromhex():

>>> x == float.fromhex('0x1.921f9f01b866ep+1') True

طرائق التمثيل هذه دقيقة؛ لذا يمكن الاعتماد عليها في نقل القيم إصدارات مختلفة من بايثون (بغض النظر عن منصّة التشغيل) أو تبادل البيانات مع لغات البرمجة الأخرى التي تدعم التنسيق ذاته (مثل Java و C++‎). الدالة math.fsum()‎ مفيدة أيضًا؛ إذ أنّها تخفّف مقدار الدقة المفقودة أثناء إجراء عمليات الجمع. تتابع هذه الدالة الأعداد المفقودة عند إضافة قيم جديد إلى المجموع الكلي. يساعد هذا الأمر على تقليل الأخطاء الإجمالية إذ لا تتجمع الأخطاء إلى درجة تؤدي إلى التأثير على الناتج النهائي:

>>> sum([0.1] * 10) == 1.0 False >>> math.fsum([0.1] * 10) == 1.0 True

أخطاء التمثيل

يوضح هذا القسم مشكلة العدد 0.1 بالتفصيل، ويعرض الطريقة التي يمكنك اتباعها لإجراء تحليل دقيق للحالات المشابهة، ويفترض هذا القسم أن يكون لديك إلمام بسيط بطريق تمثيل الأعداد الثنائية ذات الفاصلة العائمة.

أخطاء التمثيل ناتجة من عدم إمكانية تمثيل بعض (في الواقع معظم) الكسور العشرية ككسور ثنائية (الأساس 2). وهذا هو السبب الرئيسي الذي يجعل بايثون (أو Perl، و C، و C++‎، و Java، و Fortran وغيرها الكثير) لا تعرض القيمة الدقيقة للأعداد العشرية كما هو متوقع.

السبب في ذلك أنّ الكسر 1/10 غير قابل للتمثيل الدقيق باستخدام الكسور الثنائية، وتستخدم معظم الأجهزة المعيار IEEE-754 لإجراء العمليات الحسابية على الأعداد ذات الفاصلة العائمة، وتحوّل معظم المنصّات الأعداد العشرية في بايثون حسب المعيار IEEE-754 "double precision"‎. يتضمّن هذا المعيار 53 بتًّا من الدقة، وعند إدخال العدد 0.1 إلى الحاسوب فإنّه يحاول تحويل هذا العدد إلى أقرب كسر ممكن يحمل الصيغة J/2**N، و J هو عدد صحيح يتضمن 53 بتًّا بالضبط. 

تعاد كتابة:

1 / 10 ~= J / (2**N)

إلى:

J ~= 2**N / 10

وإن أخذنا بنظر الاعتبار أنّ J يمتلك 53 بتًّا بالضبط (أكبر من أو يساوي ‎2**52 ولكن أصغر من ‎2**53‎) فإنّ أفضل قيمة تأخذها N هي 56:

>>> 2**52 <=  2**56 // 10  < 2**53 True

بمعنى أن 56 هي القيمة الوحيدة التي يمكن أن تأخذها N بحيث تمتلك J بالضبط 53 بتًّا. وهكذا تصبح أفضل قيمة يمكن أن تأخذها J هي القيمة المقرّبة للناتج:

>>> q, r = divmod(2**56, 10) >>> r 6

ولمّا كان الباقي أكبر من 5، فإنّ أفضل تقريب يكون للقيمة الأعلى:

>>> q+1 7205759403792794

وهكذا يصبح أفضل تقريب للكسر 1/10 في المعيار ‎754 double precision هو:

7205759403792794 / 2 ** 56

وبتقسيم البسط والمقام على 2 يختصر الكسر إلى:

3602879701896397 / 2 ** 55

لاحظ أنّه التقريب كان للقيمة الأعلى، وهذا يعني أنّ الرقم الذي حصلنا عليه أكبر بقليل من القيمة الحقيقية للكسر 1/10، وإن لم نجرِ عملية التقريب فإنّ الحاصل سيكون أصغر قليلًا من القيمة الحقيقية للكسر 1/10. ولا يمكن بأيّ حالٍ من الأحوال أن نحصل بالضبط على القيمة الحقيقية. وهكذا لا يمكن للحاسوب أن يرى الكسر 1/10، وما يراه هو الكسر الذي حصلنا عليها في أعلاه، وأفضل تقريب مبني على المعيار السابق هو:

>>> 0.1 * 2 ** 55 3602879701896397.0

وإن ضربنا ذلك الكسر بالقيمة ‎10**55‎ فيمكننا حينئذٍ مشاهدة القيمة مع 55 مرتبة عشرية:

>>> 3602879701896397 * 10 ** 55 // 2 ** 55 1000000000000000055511151231257827021181583404541015625

وهذا يعني أنّ الرقم الحقيقي المخزّن في الحاسوب مساوٍ للقيمة العشرية:

0.1000000000000000055511151231257827021181583404541015625

لا تعرض معظم اللغات البرمجية (وبضمنها الإصدارات القديمة من بايثون) القيمة العشرية كاملة، بل تقرّبها إلى 17 عدد معنوي:

>>> format(0.1, '.17f') '0.10000000000000001'

تجعل وحدتا fraction و decimal عمليات الحساب هذه أسهل بكثير:

>>> from decimal import Decimal >>> from fractions import Fraction >>> Fraction.from_float(0.1) Fraction(3602879701896397, 36028797018963968) >>> (0.1).as_integer_ratio() (3602879701896397, 36028797018963968) >>> Decimal.from_float(0.1) Decimal('0.1000000000000000055511151231257827021181583404541015625') >>> format(Decimal.from_float(0.1), '.17') '0.10000000000000001'

هل تستطيع معرفة عدد الخانات برقم معين

الاثنين، 2 مارس 2020

فيروس كــــورونا المستجد

فيروس #كـــــورونا المتســجد

هي فصيلة كبيرة من الفيروسات التي قد تسبب المرض للحيوان والإنسان. وتسبب لدى البشر حالات عدوى الجهاز التنفسي التي تتراوح حدتها من نزلات البرد الشائعة إلى الأمراض الأشد وخامة مثل متلازمة الشرق الأوسط التنفسية والمتلازمة التنفسية الحادة الوخيمة (سارس)، وآخرها فيروس كورونا المستجد، وهو مرض معدٍ لم يتم اكتشاف علاج له بعد

#أينشتاين_مصر

#Einshten_Mahmoud_Alyosify

مقدمة في دراسة الاحياء الجزء الاول(BIO 111) Introduction to Biology

الاثنين، 24 فبراير 2020


لو أخذنا مثال للبنية أو struct بحيث أننا نصمم لعبة قتالية بسيطة، طبعا هذه اللعبة فيها شخصيات مقاتلة، لها عدة صفات تهمنا في اللعبة، مثلا إحداثيات الموقع الحالية على الخارطة، عداد الصحة والذي يقل كلما زادت الإصابات، والفريق الذي ينتمي إليه. يمكن بالتأكيد إيجاد خصائص أخرى نحتاجها، ولكن وللتوضيح سنكتفي بهذه الصفات.
ما هي القيم التي سنحتاجها، الإحداثي السيني لموقعه (عدد صحيحي، موجب أو سالب)، الإحداثي الصادي لموقعه(عدد صحيح موجب أو سالب)، صحته (بالنسبة المئوية 1-100)، والفريق الذي ينتمي إليه (0 للفريق الأول و1 للفريق الثاني).
إذا فإن الشيفرة لهذا البناء قد تبدو كالآتي :
typedef struct
{ 
int Xposition; 
int Yposition; 
int health; 
bool team; 
} warrior ;
ويمكن وضع هذا التعريف بالبنية في أي مكان في شيفرة المصدر بشرط أن يسبق أي استخدام لهذا البناء.
الآن لنتخيل برنامج بسيط، نهدف من خلاله توضيح الفكرة
TODO: شرح استخدام الـ struct والمؤشرات لعمل linked list. نقاط القوة الضعف في الـ linked list ومتى يمكن استخدامها، مع تطبيق بسيط.
Structure أو البناء أو البنية هو مفهوم مفيد جدا في البرمجة، وهو يعتبر أحد الأسس التي أدت إلى ولادة البرمجة الكائنية التوجه. ويستخدم لجمع مجموعة من المتغيرات المختلفة المتعلقة بشيء ما معا، فعلى سبيل المثال، لو كان برنامجنا يسعى لبناء وتخزين ملفات طلبة المدارس، فما هي مجموعة المتغيرات التي نتحدث عنها، وما هو الشيء الذي نتحدث عنه.
إن الشيء الذي نتحدث عنه في مثل هذه الحالة هو الطالب، بالطبع ليس هناك في المدارس طالب واحد، ولكن وحدة البناء ستكون الطالب ، وعندها يمكننا تكرار هذه الوحدة بأي عدد نشاء من المرات. أما المتغيرات فهي قد تكون اسم الطالب مثلا! تاريخ ميلاده! علاماته...إلخ.
لو أردنا أن نجعل البرنامج يتعامل مع طالب مثلا دون استخدام وحدة البناء Struct ، وأردنا أن نتحدث عن سنة ميلاده ومجموع علاماته واسمه الأول فقط!! قد يكون شكل الإعلان عن هؤلاء الطلبية ربما كالآتي :
  • ملاحظة:إرساء قيم الاسم مكتوبة بشكل مبسط لأغراض التوضيح ، وهذه ليست الطريقة الصحيحة لعملها.
char firstName[15];
int birthYear;
int grades;
.
.
.
firstName="Ahmad";
birthYear="1995";
grades=84;
ماذا لو كان هناك 30 طالبا؟ طبعا، يمكن استخدام المصفوفات مثلا ، بالشكل الآتي:
char firstName[30][15];
int birthYear[30];
int grades[30];
.
.
.
for (int i =0; i <30 ; i++)
{
firstName[i]=FN;
birthYear[i]=Y;
grades[i]=G;
}
وبكلمات أخرى ، فإن ما يتم هو البحث عن الاسم Hanna في مصفوفة الأسماء، فنجد مثلا أن موقعه هو الموقع رقم 5 مثلا في مصفوفة الأسماء، ولمعرفة سنة ميلاده، فإننا سنبحث عن القيمةالموجودة في الموقع الخامس من مصفوفة أعوام الميلاد! وهكذا...
ألن يكون من الأفضل أن نرسي قيمة لاسم الطالب ، وبعدها وبسهولة نرسي قيمة لتاريخ ميلاده وأخرى لعلاماته، كل ذلك بمعاملة بناء من نوع طالب بمعلومات فرعيه عنه، بدلا من العديد من المصفوفات التي عليك تتبعها بشكل منفصل؟ ... إلخ. إذا شعرت أن هذا الحل هو الأنسب ، فما عليك إلا استخدام بناء أو Struct للطالب. وإليك مثال ذلك:
struct student
{
char firstName[15];
int birthYear;
int grades;
} student1;
.
.
.
student1.firstname="Ahmad";
student1.birthyear=1995;
student1.grades=85;
أما عند التعامل مع عدد كبير من الطلبة ، فإن الأمور ستكون أبسط، فبدلا من بناء مصفوفة بعدد الطلاب لأسماءهم ، وأخرى لسنوات ميلادهم وأخرى لعلاماتهم، فإن إنشاء مصفوفة واحدة من نوع طلاب سيكون أسهل، أبسط، وأوضح! إليك المثال الآتي:
typedef struct
{
char firstName[15];
int birthYear;
int grades;
} student;
.
.
.
student studentList[30];
.
.
.
for (int i =0; i <30 ; i++)
{
studentList[i].firstName=FN;
studentList[i].birthYear=Y;
studentList[i].grades=G;
}
بالأضافة إلى سهلولتها في البرمجة فانها أيضاً أكثر كفاءة من حيث سرعة تنفيذ البرنامج حيث انك عادة ما نطلب اسم الطالي مع ميلاده, وليس اسمين لطالبين وتاريخي ميلاد متتابعين. فعند استخدام المصفوفات المنفصلة سيكون هناك عبيء كبير في الوصول إلى الأماكن المختلفة من الذاكرة، وهذه فائدة اخر للبنيات.
المصفوفة هي مساحة من الذاكرة تحجز سكشككشلاءمز\ْلإنشاء مصفوفة فيها الحرف الأول من كل يوم من أيام الأسبوع فستكون
char week[7] = "SMTWTFS"
وستكون الخانة
week[0] = 'S'
بمعنى أنه تم حجز مساحة من الذاكرة مكونة في هذه الحالة من 7 مواقع تخزين، وتم وضع حرف من الحروف السبعة في كل موقع، وفي الموقع رقم صفر (خانة البداية) على سبيل المثال ، سنجد الحرف 'S'.

مفاهيم عامة عن الذاكرة, طبيعة المصفوفات في الذاكرة, مقدمة عن المؤشرات.[edit]

.
.
.

مقدمة عن المؤشرات[edit]

المؤشرات أو pointers هي نوع من المتغيرات يستخدم للإشارة إلى موقع ما في الذاكرة عن طريق حفظ موقعه. إذا فالمؤشرات تحمل قيمة يعتمد حجمها على تصميم الحاسوب وحجم الذاكرة التي يدعمها ، فتكون في العادة 2 أو 4 بايت. وتستخدم المؤشرات للإشارة إلى قيم متغيرات أخرى في العادة أو للتحرك الحرية في ذاكرة البرنامج، ومن الجدير بالذكر أن النظام لا يمنعك من الإعلان عن مؤشر يشير إلى موقع خارج برنامجك، ولكن بمجرد محاولة إستخدامه للقراءة أو الكتابة، فإن النظام يرجع خطأ يؤدي إلى إنهاء البرنامج، وهو ما يعرف بأخطاء Segmentation error. ولهذا السبب يكره البعض إستخدامها وذلك لسهولة الوقوع في الخطأ أثناء إستخدامها، ولكن عدم إستخدامها قد يمنعك من القيام بالكثير من الأشياء المثيرة اثناء البرمجة بلغة C++.
وكون المؤشرات تشير إلى موقع في الذاكرة ، فذلك يعني أن جميع المؤشرات بغض النظر عن نوعها (ولكن بالطبع على ذات التصميم من الحواسيب) لها ذات الحجم، فلماذا إذا هناك أنواع مختلفة من المؤشرات؟
إن تغير نوع المؤشر يساعد في التحرك في الذاكرة بخطوات تتناسب مع نوع المتغير الذي تشير إليه هذه المؤشرات، بكلمات أخرى ، إذا كنت تشير بمؤشر مخصص للإشارة إلى char، فإن كل خطوة تحركها بإستخدام عملية الزيادة ++ مثلا تغير من موقع إشارة المؤشر ببايت واحد فقط، وذلك لأن الحروف من نوع char تحتل بايتا واحدا كل مرة، في حين أنك لو استخدمت مؤشرا مخصص للإشارة إلى عدد صحيح int بحجم 4 بايت، فإن كل خطوة زيادة للمؤشر بعملية ++ ستحركه اربعة بايت.

الإعلان عن المؤشرات[edit]

للإعلان عن المؤشرات ، كل ما عليك القيام به هو تحديد نوع المتغير الذي سيشير إليه المؤشر واسم ذلك المؤشر فمثلا:
char *aPointer;
int x=5, *xptr;
هو جزء من برنامج، السطر الأول فيه يعلن عن مؤشر مخصص للإشارة عن متغير من نوع حروف char ، أما السطر الثاني ففيه إعلان عن متغير من نوع عدد صحيح int وبعدها مؤشر مخصص للإشارة على متغير من نوع int.
لاحظ من المثال أنه لتحديد ان الإعلان عن مؤشر من نوع ما ، ما عليك سوى الإعلان عنه كأي متغير من النوع الذي سيتم الإشارة إليه ثم إضافة النجمة * قبل اسم المؤشر. لاحظ ان المؤشران المعلن عنهما أعلاه لم يتم تحديد قيمهما للإشارة إلى أي متغير، ولكن هذا لا يعني أنهما لا يحملان قيمة، فهما يحملان قيمة مجهولة بالنسبة لنا، وعلى الأغلب ، فإن إستخدامهما مباشرة بعد الإعلان عنهما بهذه الصورة سيؤدي إلى Segmentation fault، أي خطأ في الإشارة إلى موقع الذاكرة لأنهما وعلى الأغلب سيكونان حاملان لقيم تشير وبشكل عشوائي لمواقع ما في الذاكرة على الأغلب خارج نطاق برنامجنا.

  • يجب ان يذكر تعريف الدالة نوع القيمة الراجعة (أي نوع البيانات التي ترجعه الدالة، مثال: دالة تستخدم لتقريب إلى أقرب عدد صحيح سترجع بيانات من نوع "عدد صحيح" أو int، ودالة تستخدم لإسترجاع تاريخ ميلاد طالب سيذكر تعريفها بأنها ترجع بيانات من نوع "تاريخ يوم").
  • تمرير المتغيرات بحسب القيمة أو بالإشارة (بالمرجعية) (Reference).
  • المتغيرات التي تم تعريفها ضمن نطاق الدالة ، لا تخرج عنها ولا يمكن الوصول إليها من خارج الدالة، والقيم التي تمرر للدالة لا يعدل عليها، إلا في حال تم تمريرها بالمرجعية By Reference

الدوال[edit]

functions أو الدوال، هي كتابة جزء من الشيفرة بشكل يسمح بإستخدامها بشكل متكرر دون إعادة كتابة كامل العمليات، وذلك بشكل شبيه بالدوال الرياضية التي تربط المدخلات بقيم المخرجات.

الإعلان عن الدوال[edit]

يجب الإعلان عن الدوال قبل إستخدامها، وكتابة الدالة بالكامل قبل إستخدامها يعوض عن الإعلان عنها، ولكن من المتبع والمتعارف عليه بشكل واسع الإعلان عن الدوال أولا، ويكون الإعلان عن الدالة بذكر نوع القيمة المرجعة واسم الدالة ونوع المدخلات متوعا بفاصلة منقوطة، فمثلا:
char pos (char *,int) ;
هو إعلان عن دالة اسمها pos، وترجع قيمة حرف (رمز) و لها مدخلتين، أحدها مؤشر على حرف (رمز) والآخر عدد صحيح.

طريقة الكتابة[edit]

تكتب الدوال بعدة أجزاء هي:
  • نوع القيمة المرجعة.
  • اسم الدالة
  • المدخلات
  • الشيفرة الفعلية
مثال:
int squre (int x)
{
int y =  x * x;
return y 
}

 سمعت مقولة بتقول لو عاوز تستثمر واستثمارك يتنجح استمثر في المكياج او في المطاعم فالناس مش هتبطل تاكل ولا الستات هيبطلوا يحطوا مكياج 😂 ففي ...