יום רביעי, 11 במאי 2011

תמונות שחור-לבן

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




 1 use strict;
 2 use warnings;
 3 use Image::Magick;
 4 use File::Basename;
 5 
 6 my $path = '.' || shift;
 7 foreach my $png (glob("$path/*.png")) {
 8   my $basename = fileparse($png, '.png');
 9   my $bw_name  = "$basename-bw.png";
10   my $image    = Image::Magick->new;
11 
12   $image->Read($png);
13   $image->Quantize(colorspace =>'gray');
14   $image->Write($bw_name);
15 }
16 

יום שלישי, 10 במאי 2011

כשהפטיש לא מתאים למסמר

 כשכל מה שיש זה פטיש, כל בעייה נראית כמו מסמר.

אחד הכללים הידועים בתכנות הוא לבחור את שפת התכנות או הטכנולוגיה הנכונה למשימה. משחק לפייסבוק עדיף לכתוב בפלאש, אך אתר אינפורמטיבי עדיף לכתוב ב html5/javascript. כשרוצים להגיע לתוצאה מהירה עדיף להתרחק מג'אווה או C++.
כלל זה תקף גם בבחירת הגישה לעבודה כשמתחילים פרויקט. הגישה מורכבת מאוסף ההחלטות שקיבלנו ונקבל לגבי הפרויקט והיא שתביא אותנו לקו הסיום בזמן. להלן שלושה סוגים של פטישים והשימוש הנכון בהם.

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


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

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

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

יום שני, 9 במאי 2011

ציונים

לא מזמן יצא לי להעביר קורס שהסתיים בפרויקט עם ציון. הכללים של פרויקט עם ציון הם פשוטים, יש לך כיתה של 24 תלמידים, יש התפלגות ציונים נורמלית פחות או יותר שצריך להגיע אליה, ויש חומר שצריך להעביר. כל קבוצה של 2-3 תלמידים פותרת את אותו הפרויקט, מקבלים ציונים על עבודתם ובסוף מקבלים תעודה יפה עם הציון. עד לפה החלק הקל.

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

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


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

תודה לכל מי שהיה בקורס ההוא וקורא. הייתם אחלה. עכשיו חזרו לעבוד.

פרל ? מישהו עדיין עובד בזה ?

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

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



 1 use strict;
 2 use warnings;
 3 use Dancer;
 4 
 5 my $proj_path = '~/src/project';
 6 
 7 post '/commit' => sub {
 8   system("hg pull -R $proj_path /.. >> $proj_path/hg.log");
 9   system("hg update -R $proj_path /.. >> $proj_path/hg.log");
10   return 0;
11 };
12 
13 dance;


הפעלה של התוכנית פותחת שרת ווב על פורט 3000 (אפשר לשחק עם plackup כדי לשנות את סוג השרת והפורט), שמאזין לבקשות פוסט על הנתיב /commit. כעת, הגדרתי את ביטבקט לשלוח פוסט לנתיב:
http://myhostname.com:3000/commit
מכאן והלאה, בכל קומיט ביטבקט מעדכן את השרת, שמבצע משיכה של העדכונים ועדכון הקבצים עליו.

מה חשוב לי בשפת תכנות

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

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

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

גמישות השפה והתאמה לכלל DRY. כלל ידוע בתכנות הוא שלכתוב דבר פעמיים זו טעות (Don't Repeat Yourself). הראציונל הוא פשוט, כשמגיעים לבצע שינוי בקוד צריך להיות ברור איפה משנים, ועדיף שזה יהיה בכמה שפחות מקומות. לדוגמא, העובדה שבג'אווה אנו לא צריכים לכתוב את חתימת המתודות בשני קבצים שונים, הופכת אותה לשפה עדיפה על פני C++.

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

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

חידוש האתר

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

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

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

כיום אפשר להגיד שהאתר גדל הרבה מעבר לתוכנית המקורית, עם תכנים שישבו בערבוביה באנגלית ובעברית וקושי לנווט. לא לגמרי הצלחתי להבין את מערכת תבניות העיצוב של ג'ומלה והיתה תחושה שהמאמץ לשמור על אתר נקי לא שווה את הרווח שאני מקבל מהפלטפורמה.
האתר החדש נכתב בדרופל עם הבנה ברורה של מה יהיה בו, איך התכנים יהיו מסודרים ומה המקום של כל דבר. דרופל היא מערכת ניהול תוכן מצוינת המאפשרת שליטה טובה על מראה האתר, ארגון התכנים שבו ושאר פינוקים. מספר דברים שהיו חסרים לי בג'ומלה וכעת אני מאוד מרוצה מהם: סיווג פריטי תוכן לפי נושאים או אוספים של נושאים, עיצוב ספציפי לעמודים לפי סוג התוכן, מערכת תפריטים נוחה בהרבה ותוסף DHTML לתפריט צד נפתח באופן דינמי.

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