שולחן עבודה מורחב בלינוקס

כבר כמה שנים שאני שומע אבטחות של תמיכה במסכים מורחב. אפילו ראיתי את התצוגה המקורית של קית’ פא’קארד בזמנו שבה הפיצ’ר הזה הודגם. שמחתי, כי יש לי בדיוק את אותו כרטיס מסך שיש לו. בתכ’לס: ראיתי גרסאות של קרנלים, xorg ועוד באות והולכות ולמעט אבטחה יפה, לא קיבלתי הרבה. איזה שורת פקודה xrandr שעם קצת מזל לפעמים עובדת, תלוי באיך אתה מסדר את החלונות. אבל לא הדבר האמיתי.

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

וכל זה על KDE 4.4 לא יודע עם איזה xorg ועם קרנל 2.6.32. ולא נגעתי בשורת פקודה כלל, הכל מהממשק הגרפי עם אפקטים מופעלים, ועובד כמו שאני מצפה, כמו שזה עבד בחלונות 2000…  (אני חייב פוסט על ארצ’, ואני חייב פוסט על המחשב והתמיכה שלי בלינוקס). 

עכשיו אני יכול לעבוד, ובמקביל להסתכל על ה־Road Runner (וגם להסתכל על  הפרצוף של האנשים כשהם מאים לדבר איתי… מסתבר שלרב האוכלוסיה יש בעייה להישאר מפוקס כשהרוד ראנר מעיף אבן על הקויוטי). מצחיק…

Share Button

דחיית חישובים בעקבות קלט משתמש

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

מה עושים? דוחים את מלאכת החישוב, ומבצעים אתה מקסימום 4 פעמים בשנייה (או כל מספר אחר, לא נתווכח על קבוע). הפתרון המוצג כאן ממומש ב-Qt4, אבל גוגל משתמשים ברעיון הזה ב-Google Suggest ב-JavaScript.

foo::foo(){
  QTimer selectionTimer;
  selectionTimer.setSingleShot(true);
  selectionTimer.setInterval(200);
  connect(&m_selectionTimer,SIGNAL(timeout()),this,SLOT(doLongCalculations()));
} 
void foo::on_keypress() // on keyboard pressed, or something if (m_selectionTimer.isActive()) m_selectionTimer.stop(); }
void foo::doLongCalculations(){ // whatever you want to do }

הקוד הזה נראה מסובל, כי משהו שנעשה במקום אחד כרגע יש לו שלושה מקומות בקוד שהוא מופיע בו, אבל נצד שני, אנחנו יכולים להבטיח שהחישובים ה”כבדים” יבוצעו מקסימום 4 פעמים בשנייה. האם המשתמש ישים לב לשינוי? האם היה לנו חישובים מיותרים?

אני קבעתי את ה-timer ל-200 msec כי פרק זמן מעל 300msec זה זמן התגובה המירבי שאפשר לתת בממשק משתמש לפני שמישהו יחשוב שהתוכנית איטית. אם נשים זמן ארוך יותר התוכנית “תיראה איטית” למשתמש, וקצר יותר לא ממש עזרנו לעצמינו.

נראה שתכנות אסינכרוני הוא פתרון טוב לבעיות התגובתיות של יישומים. מסרבל את הקוד, אבל התוכנה נראית ממש “מהירה”, כאשר לא ממש שיפרתי את הקוד, אלא בסך הכל לא הגבלתי את ה-event loop באירועים ארוכים מדי.

Share Button

איך לגרום למארח שלך לזרוק אותך

אז רציתי לקבל shell על השרת שלי.. ואי אפשר כי אני ב־shared hosting… אז מה עושים? כותבים קוד שמפעיל קוד על השרת ומציג על החלון, לא מסובך.

אני בודק אצלי במחשב עובד פצצות. אני מעלה לאתר פה, וזה לא עובד לסירוגין. תלוי בשם הקובץ שאני נותן. אני נותן לחבר שעובד בחברת בניית אתרים מקצועית לבדוק את זה על שרת שלהם ופתאום ה־ftp נסגר לגמרי…

לפי דעתי המארחים יש להם הגנות כגד דברים כאלו, כדי שמשמתמשים זדוניים לא יהרסו את השרת (לא אנשים כמוני שמנסים לכופף את המערכת). בכל מיקרה, מי שרוצה הקוד זמין מכאן: ttp://cucomania.dynalias.com/diego/diego.php.txt

מבחינתי – GPL כי “השאלתי קוד” ממישהו. לא מעניין אותי. לא, אין לי עותק נוסף שלו. מחקתי את זה, בגלל הזמבביר ההוא שחושב את מה שהוא חושב.

Share Button