הוליווד פורצת

"אקדח במערכה הראשונה ימשיך לירות כל הסרט אין סוף כדורים פחות אחד"
אני

חלק כללי

אחד הדברים שתמיד מצחיקים אותי בסרטים, זה לראות איך פעולת מחשב כדוגמת העברת כספים, ביצוע brute force וכו', מתבצעת שם.
אנחנו לעולם לא נראה פעולות אטומיות (כדוגמת הצורה שמסדי נתונים עובדים), אלא נראה כי סופרים לאחור (או קדימה) עד שכל הסכום עבר. כאילו פיזית מישהו לוקח מטבע למטבע, וסופר אותו בשביל להעביר למקום אחר.

כבר בעבר הזכרתי את נושא הCSI עם חיקוי העבודה של שלומי ישראלי, ועד כמה זה מגוכח.

Brute Force הוא שם המייצג גישה האומרת "בואו ננסה כל אפשרות ברשימה עד שנצליח או שנגמרו האפשרויות".

בBrute Force אשר מתבצע בסרטים, נראה ריצה על מספר ידוע מראש של ספרות (ואולי [אף] תווים), וגם הם בסדר עולה/יורד או ממש מנסים להציג מערכת פסודו ראנדומאלית. "המהדרי"ן", יפרקו את זה ל"ביטים" או "בתים" (תלוי מה הם מנסים להציג), ויציגו כל דבר כזה ב"קופסא" משל עצמה, כאילו החיפוש הוא על ביט/בית.
זה מצחיק כי אם עדיין אין לי מושג ירוק מה קורה שם, איך אפשר לדעת אם הביט/בית נכון ? רק אם יש לי מידע מוצפן, אוכל לכתוב משהו שינסה לפתוח את הקידוד, אבל זה לא זהה כמו מציאת סיסמה במערכת מרוחקת.

אז החלטתי ליצור תוכנה כזו, רק מעט יותר מציאותית (ממש במעט) אשר תספק תחושה הוליוודית של ביצוע brute force. שימו לב כמה קוד הייתי צריך לעשות בשביל לגרום לזה להראות כמו בהוליווד (לפחות ברעיון, אם לא בממשק)

העניין הוא, כי לא משנה כמה פשוט לרוץ רק על מספרים, עדיין מספר כדוגמת 123456789 לקח אצלי על המחשב קרוב ל5 שעות ריצה של התוכנה !

החלטתי שככול שאורך המספר קטן יותר, התוכנה תציג כאילו לוקח זמן רב יותר לרוץ על כל ערך מספרי, ובכך לתת לכם תחושת מתח גבוהה יותר. הרי בשביל זה שילמתם כרטיס, לא ?!

קצת הסבר טכני של הקוד

בעת כתיבת הקוד, גיליתי פיטצ'ר מאוד מעניין בלזרוס, אשר אינו קיים בדלפי. הפיטצ'ר איפשר לי לכתוב קוד שלא עושה blocking למערכת, אבל גם ללא צורך בכתיבת Thread חדש בעצמי.

היכולת הזו נבנתה בגישה שהיא חוצה פלטפורמות ובניגוד ל Windows ששם יש "כלי" ב API שמבצע את זה, כאן בעצם גם בסביבות אשר אינן תומכות בAPI כזה, הגישה עובדת.

לפני שאכנס לאיך זה מבוצע, צריך להבין בעצם איך מרבית סביבות גרפיות בעולם התכנות עובדות – על ידי לולאה אחת אין סופית (עד הבקשה להפסיק את הלולאה -> "יציאה" מהתוכנה), וקבלת "אירועים" כלשהם, אשר נרשמים בגישה של "מי צריך לדעת", ורשימה של "אני רוצה לדעת כאשר קורה איקס", והחיבור בניהם. זה כל מה שהלולאה עושה בעצם.

זה נכון ל Qt, GTK ועוד המון ספריות ומערכות גרפיות, כולל תכנות ב Windows.

התפיסה של LCL גם עובדת בצורה הזו,  ולכן הקוד שהשתמשתי בו, עושה סוג של "תרגיל" מסויים, ורושם את עצמו כאירוע במעגל הזה, במקום כמשהו אחר. מאחורי הקלעים, הקוד רץ בתוך Thread כלשהו שקיים בכל מקרה עבור התוכנה שלנו, אך אנחנו לא מנהלים אותו בעצמנו.

הקוד שהשתמשתי בו הוא Application.QueueAsyncCall. המתודה כאמור מאפשרת לרוץ בצורה "לא חוסמת" עושה את מה שתארתי למעלה, והיא נראת כך:

Application.QueueAsyncCall(@Counter, pass.Value);

כאן אני רושם את הריצה של Counter כ Callback אבל היא לא תחסום לי את שאר השימושיות בתוכנה, ולכן במידה ותלחצו על המקש ESC תתקבל לכם פניה האם לעצור את הריצה ובמידה ובחרנו לעצור, אז הריצה באמת תיפסק.
שימו לב, שהיות ומדובר בהדגמה, חסר חלק קוד אשר גורם לכך כי רק לחיצה על מקש ה ESC במצב הריצה עצמו יציג את הפניה, וכרגע הוא תמיד יעשה עבורינו Prompt.

ריצה נעימה

2 מחשבות על “הוליווד פורצת

להשאיר תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s