התגובות שלי בפורום
-
מאתתגובות
-
דניאל קמשתתף
כותרת: יש לי הרגשה שמבשלים פה איזה סוס טרויאני…
קודם שאלות על כיבוי מחשב, אח"כ על פסיקות של מסך כחול…מישהו פה כנראה ממש רוצה לשגע את החברים שלו..
בכל מקרה, המסך הכחול המפורסם לא נוצר בעקבות פסיקה ספציפית, אלא מגוון פסיקות מעבד. חלוקה באפס, Page faults, GPFs וכו´.
דניאל קמשתתףכותרת: תשתמש בExitWindowsEx
זה זהה לאופן שבו סוגרים את חלונות משפה עילית…
דחוף את הפרמטרים למחסנית ובצע קריאה לExitWindowsEx.
כמובן שאם אתה בחלונות NT/2K/XP אתה צריך לוודא שיש לך הרשאות לעשות זאת( על ידי קריאה לAdjustTokenPrivileges)
הכל כתוב בMSDN.דניאל קמשתתףכותרת: תגובה לזהר
טוב, אני לא ממש מתכוון להתחיל להתווכח איתך על הדברים שאמרת, בין השאר כי זה ויכוח שנגמר לפני שבועות, וחבל לפתוח אותו שוב."אתה יודע סי, אתה יודע כל שפה" – ממש, אבל ממש לא נכון. מצטער, יש כל כך הרבה רעיונות וסגנונות תכנות שלא רואים אותם בכלל בסי. לכיוון אחד – סי מול אסמבלר למשל, כשאתה כותב קוד בסי, אתה לא ממש דואג ליעילות שלו, מה גם שלא תמיד אתה יודע איך לדאוג ליעילות שלו. אתה משתמש בהמון המון קוד שלא שלך(כל הספריות הסטנדרטיות / לא סטנדרטיות), ויש המון המון אספקטים של כתיבת התוכנה, שאתה בכלל לא נוגע בהם.
ולכיוון ההפוך – סי מול C++. כל העקרונות של תכנות מונחה עצמים: תרושה, ריכוזיות, פולימורפיזם, אף אחד מהם לא בא לידי ביטוי בקוד סי. אני לא אכנס פה ליתרונות / חסרונות של קוד מונחה עצמים, אבל בכל מקרה, זאת תפיסה שבכלל לא מתעסקים איתה בתכנות בסי, ובהחלט צריך לשנות את האופן חשיבה שלך, כשאתה עובר לשפה כמו C++.
אגב, באיזה בית ספר אתה לומד???
די נדיר למצוא בתי ספר שמלמדים סי, הלא כן?דניאל קמשתתףכותרת: על הפנים…
היה ממש קשה…
את המקבילית לא הוכחתי… חשבתי אולי לנסות משהו עם טריגו, או אולי מעגלים חוסמים(הרי עם זוויות שוות נשענות על אותו קטע, אפשר להגיד שהמעגלים שחוסמים את את שני המשולשים שנוצרים שווים).גם ישבתי בסוף, ליד חבורת אנשים שהחליטו שיהיה ממש מגניב לדבר כל המבחן.. היה אחד שממש הוציא טלפון באמצע, ודיבר עם חבר שלו תוך כדי המבחן, ככה שזה די הרס לי את הריכוז(אבל שטויות, אני לא מחפש תירוצים עכשיו)
לא נורא, העיקר הספורט. היה כיף.
פעם הבאה שאני אשב באולם הזה, אני מקווה להצליח יותר טובדניאל קמשתתףכותרת: נחמד, לא חשבתי על זה…
למרות שאני לא בטוח שזה מותר במסגרת השאלה. ההגדרה היא שכל גמד איננו יודע מה צבע הכובע שלו. עם הם מתחלפים בכובעים, אז זה כאילו הוא הוריד אותו מהראש והסתכל עליו.בכל מקרה, את שתי החידות אפשר לפתור גם אם המכשף הטיל עליהם כישוף, כך שהם לא יכולים להוריד את הקובע, עד שהם לא משלימים את המשימה שהוטלה עליהם.
רמז לשאלה השניה:
במקום כחול ואדום, תחשבו 1 ו 0.דניאל קמשתתףכותרת: לולו, בדוק שוב את התשובה שלך, ותחסוך את הכינויים
דניאל קמשתתףכותרת: בן אדם, מאיפה אתה מניח שלא יודעים מתמטיקה??
בגלל בן אדם אחד ששאל לגבי נוסחאות של מעגל? אני בטוח שמרבית האנשים פה יודעים אותם.
אם באמת קראת קצת בפורום, היית רואה שיש פה בין השאר דיונים וחידות לא רק בתחומי תכנות, אלא גם כאלה שכוללים המון מתמטיקההרבה פעמים ברמה על-תיכונית(סטטיסטיקה, תורת המספרים, חדו"א וכו´)
עם כל הכבוד לך, הערות כאלה ממש לא מקובלות עלי. מה גם שאתה אפילו לא יודע בן כמה מי שכתב את ההודעה הזאת. התחרות פתוחה לגילאים 15-18, ואני זוכר אפילו תחרות שאליה הגיע אפילו בן 14.דניאל קמשתתףכותרת: מה ז"א לא צורכת מחסנית?
מה לגבי הCall stack? איך תדע לאן לחזור בקוד אחרי שהפונקציה מסיימת?דניאל קמשתתףכותרת: אופטימיזציה בחומרה
ממש אבל ממש לא הגזמה… דווקא עושים את זה הרבה. הזכרת גרפיקה – בהחלט תחום שבו מנצלים את זה. במקום שהמעבד יבצע את כל החישובים, הכרטיס מסך, מבצע את כל החישובים האלה, וגם הרבה הרבה יותר מהר.ציודי תקשורת – Router / Switch, שצריכים לקלוט המון מידע דרך הרשת, לבצע איזה חישוב עליו(לאן לשלוח, איזה שדות לשנות), פועלים הרבה הרבה יותר מהיר מאשר מערכת של מחשב + כרטיס רשת יכול לפעול.
ואחרון חביב, נושא שאני אישית מאוד מחבב – קריפטוגרפיה. אותם אלגוריתמים שלוקחים טקסט נחמד, טקסט יפה, טקסט מושלם, והופכים אותו לסדרה של ג´יבריש, שאף אחד מלבד המיועד יוכל לקרוא… ובכן, על ידי בניית חומרה מיוחדת שתבצע את החישובים ותותאם במיוחד לחישובים של המעבד הזה(חומרה שמבצעת חזקה מודלרית למשל, עבור הצפנות RSA), אפשר להאיץ פי כמה וכמה מונים את קצב המידע שאפשר להצפין. ואכן, כבר היום משווקים כרטיסי רשת (דוגמת ה3COM + מעבד 3XP), שמצפינים את המידע אותו הם שולחים, מה שמתבצע הרבה יותר מהר מאשר אם המידע היה מוצפן במחשב, ורק אז נשלח לכרטיס רשת.
ומה אנחנו צריכים לחשוב על זה? כרגע, לא צריכים. אנחנו מתכנתים, לא מהנדסי חשמל. אבל אם מישהו אי פעם יחליט ללמוד הנדסת חשמל, או שהוא ינהל פרויקט, שבו ייצרו גם חומרה, אז זה בהחלט נושא שחשוב להכיר ולהבין.
אולי בצבא ייצא למישהו לעבוד זה(ואז זה רלוונטי יותר מתמיד)… אני יכול לחשוב על אלפי נושאים שבהם צריך חישובים מהירים בצבא, השאלה היא מי עובד על זה, לדעתי רק עתודאים…דניאל קמשתתףכותרת: אחלה דוגמה…
נתקלתי במקרה דומה לפני איזה חצי שנה(גם של העתקת פונקציה לאזור זכרון – רק במקרה הזה ערכתי את הקוד של הפונקציה תוך כדי ריצה, כדי לתת לו מצביע לבלוק נתונים שהקצתי עבורו. לא יכולתי להתשתמש במחסנית אגב, כי לא אני קראתי לפונקציה החדשה(עשיתי Subclassing לפונקציית GetMessage בתוך תהליך אחר, באמצעות WriteProcessMemory).בכלל, כמעט בכל נקודה בתוכנית שבה אתה מתייחס לקוד כאל משהו בזכרון, ולא סתם רצף שורות שבאופן פלא מתבצעות על המעבד, אז אסמבלי תופס איזה שהוא חלק מזה.
אבל האמת? חשוב לדעת אסמבלי(לפחות ברמה מסוימת), גם אם אתה אף פעם לא תגע ממש בקוד אסמבלי: למשל את זה שפקודה כמו if או for גורמת לקפיצות בקוד מה שמשפיע הביצועים של המעבד(כל הקטע של Pipeline וprefetching).
או אפילו בנושא הרקורסיות – כמה זכרון צריך בשביל פונקציה רקורסיבית(ולמה פונקציה רקורסיבית לא יכולה לקרוא לעצמה עד אין סוף…), ויש עוד המון דוגמאות, סתם שלפתי את השניים הראשונים שהצלחתי לחשוב עליהם.דניאל קמשתתףכותרת: ליוני, ההבדל בין האלגוריתמים
האלגוריתם שלך הרבה יותר חסכוני בקריאות לADD – על כל איבר מלבד הראשון מתבצע פעולת ADD בודדת. לעומת זאת האלגוריתם של רומי(Thewizard) משתמש ב3 קריאות לADD על כל איבר. עם זאת, בשיטה שלך חסרון אחד מאוד גדול – גודל המספרים בהם ניתן להשתמש. מאחר וכל האיברים באותו גודל(נניח 16 סיביות ), הם יכולים להכיל רק טווח ערכים מסוים. בסוף הלולאה על כל האיברים באלגוריתם שלך, האיבר הראשון למעשה יכיל את ההפך מסכום כל המספרים. המערך יכול להכיל עד אלף מספרים, מכאן שהאלגוריתם שלך מגביל את הערך הממוצע של כל האיברים במערך לתחום 32 עד מינוס 32.
טווח הערכים באלגוריתם של רומי גדול בהרבה(ערך ממוצע של 20,000 למשל הוא סביר בהחלט).זאת הייתה שעת "קטילת אלגוריתם של מישהו, לטובת אלגוריתם של חבר שלך", כפי ששודרה לכם על ידי דניאל. אנא התחברו לשידור בשבוע הבא, באותו היום ובאותה שעה.
שני האלגוריתמים אחלה, כל אחד מתאים לסדרת תנאים שונים.דניאל קמשתתףכותרת: רומי, אחי, הכל טוב?
חחח, עכשיו אתה עונה לי עוד לפני שאני כתבתי את התגובה שלי…
לא, אני לא אומר שלא צריך לנהל ויכוח על איזה שפת תכנות. דווקא נראה לי ששווה לעשות שרשור(או thread, איך שתרצו) על זה.לצערי אינני יכול להעיד מספיק על פסקל, משום מה הגעתי למסקנה ששפה שמלמדים אותה בכיתה ז´ לא ממש שווה התייחסות רבה. אתה לא רואה אותי כותב בלוגו, נכון?(אני כבר מדמיין את ההבעת פרצוף שלך אחרי ההערה הזאת).
ואם כבר העלת את זה, אז הדיון פה הוא לא C מול פסקל, אלא High level מול low level… היתרונות והחסרונות בשניהם די ברורים – כוח מול פיתוח מהיר.. אני אישית אוהב שזה יהיה כמה שיותר Low Level, שאני ממש ארגיש את המעבד רועד כשאני מריץ את הקוד שלי.
ברור שאי אפשר לכתוב הכל באסמבלר(טוב, אפשר, אפילו היה על זה ויכוח לפני כמה שנים פה בפורום), אבל C מספק לי די הרבה כוח, ורק כשבאמת צריך, יורדים לאסמבלר.עוד דבר שנאמר פה, כמה חברות תוכנה רציניות באמת משתמשות בPascal ודלפי? איזה סוגי מוצרים הם מייצרים? אם הקטע שלכם זה באמת לפתח בסיסי נתונים ומערכות לנהל אותם – סבבה, אפשר גם בVB, אבל כשמגיעים לכל מיני דברים כמו עבודה מול חומרה, או פרוטוקולי תקשורת לסוגיהם, שבהם צריך להתעסק עם כל מיני מבני נתונים מוזרים ומסובכים בזכרון, סי בהחלט עושה את העובדה למאוד פשוטה ונוחה. אגב, אני לא ממש רוצה לגעת בשאלת הביצועים של אלגוריתמים, למי שהביצועים ממש ממש חשובים לו, הוא יכתוב באסמבלר, ואם זה באמת באמת באמת חשוב לו (כמו האלגוריתמים לגילוי מפתחות הצפנה במחשבי הNSA, אז הוא יצור מימוש בחומרה לאלגוריתם, שמהיר פי כמה מאות מאשר כל יישום בתוכנה).
אבל עזבו אתכם מהשפות האלה. כולם לעבור לPYTHON!
Python is an interpreted, interactive, object-oriented programming language. It incorporates modules, exceptions, dynamic typing, very high level dynamic data types, and classes. Python combines remarkable power with very clear syntax. It has interfaces to many system calls and libraries, as well as to various window systems, and is extensible in C or C++. It is also usable as an extension language for applications that need a programmable interface. Finally, Python is portable: it runs on many brands of UNIX, on the Mac, and on PCs under MS-DOS, Windows, Windows NT, and OS/2.
ובשבילך רומי: Python is OSI Certified Open Sourceאפשר לבקש יותר???
דניאל קמשתתףכותרת: איך מחשב מחשב אינטגרל
המחשב יודע למצוא קירוב של ערך האינטגרל, בהתאם לחוק הקובע ששטח הגרף מתחת לפונקציה הוא למעשה ערכו של האינטגרל.
מה שהמחשב עושה למעשה, זה מחלק את השטח שמתחת לגרף להרבה הרבה קטעים, כאשר כל פעם מתקדמים קצת לאורך ציר האיקס. ככל שהקטעים הללו קטנים יותר, ניתן להתייחס אליהם כאל טרפזים – וטרפז אנו הרי יודעים לחשב את שטחו – גובה כפול ממוצע הבסיסים, כאשר הגובה הוא למעשה ההתקדמות לאורך ציר האיקס, והבסיסים הם ערכי הפונקציה בשתי הנקודות הרלוונטיות.(אגב, את כל זה מלמדים בשיעורי פיסיקה בתיכון, כדי להימנע משימוש באינטגרלים, על מנת ללמד פיזיקה גם לכאלה בלי רקע מתמטי של 5 יח´).
בכל מקרה, למה שלא תחפש באינטרנט קצת על Simpsons rule, או Integral approximation?
דניאל קמשתתףכותרת: סיביות זה לא קשור לשפה…
זה קשור למספרים בינאריים – ייצוג של מספר באמצעות הספרות 0 ו 1 בלבד. "סיבית"(bit) זה ספרה בודדת בתוך מספר בינארי.הסבר הכי בנאלי על מספרים בינאריים:
http://home.swbell.net/ruthven/robotics/binary.html
הסבר טוב וקצת יותר מעמיק(כולל פעולות מתמטיות ולוגיות על מספרים בינריים, אבל עם טיפה שטויות על שפת אסמבלי
http://webster.cs.ucr.edu/Page_AoAWin/HTML/DataRepresentation.html
http://webster.cs.ucr.edu/Page_AoAWin/HTML/DataRepresentationa2.html
http://webster.cs.ucr.edu/Page_AoAWin/HTML/DataRepresentationa3.html
http://webster.cs.ucr.edu/Page_AoAWin/HTML/DataRepresentationa4.htmlנכון, הקטע קוד שלי היה בסי…
בכל מקרה, הוא מתבסס על העובדה שאם ניקח מספר כלשהוא, ונבצע פעולת AND(בסי מסמנים עם &) לוגי עם המספר מינוס אחד, למעשה נהפוך את הסיבית )הראשונה מצד ימין ששווה 1 ל אפס.למשל:
19 = 10011
18 = 10010
18&19 = 1001020 = 10100
19 = 10011
19&20 = 10000אז כל שצריך לעשות, זה לבצע את הפעולה הנ"ל כדי לכבות סיבית אחר סיבית.
דניאל קמשתתףכותרת: מה עושים בשביל שני האחרונים
אפשר פשוט להשתמש בשני הראשונים…
פשוט להסתכל על המערך כעל מאין מעגל…
את הלפני אחרון נאפס בעזרת הראשון והאחרון, את האחרון בעזרת השניים הראשונים…אגב, בנוגע לבדיקת הסיביות – אפשר ב O(1) אם מנצלים את זה שהביטוי
a&a-1 למעשה מאפס את הסיבית הראשונה שדלוקה מצד ימין, לכן הבדיקה יכולה להיות:
if( (a&=a-1) != 0 &&
(a&=a-1) != 0 &&
(a&=a-1) == 0 )
(אין ברירה – תעתיקו לnotepad כדי לראות את זה נורמלי). -
מאתתגובות