Fx.Matrix

במסגרת העבודה שלי עשיתי מחקר קטן על איך לבצע אפקטים שיגרמו לצאת מהמבנה הריבועי ויאפשרו לשחק עם הצורה של האלמנט עוד קצת. אחרי מס’ חיפושים בגוגל מצאתי שהדפדפן ספארי תומך ב-CSS Transformations ושIE תמך בזה עוד מגרסאות מוקדמות יותר רק בשם אחר: Matrix filter (נתמך החל מ-IE 5.5).

אז גיליתי שתי אפשרויות:

  • הדרך של ספארי: להשתמש במאפיין transform אם אחת מהפונקציות הבאות: skew, rotate, translate, scale, perspective ועוד כמה. מוזילה הודיעו שהם גם יתמכו בזה החל מגרסה 3.1 של Firefox.
  • הדרך של IE: להשתמש במאפיין filter עם הרכיב: “DXImageTransform.Microsoft.Matrix”, שיכול לקבל מטריצה בגודל 2*2.

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

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

התוצאה היא מחלקת Fx.Matrix שהוספתי אותה לפרוייקט MUI, פרוייקט קוד פתוח שאני עובד עליו קצת פה וקצת שם שמספק רכיבי ממשק משתמש (UI) בעזרת MooTools. המחלקה תומכת בטרנספורמציות הבאות: scale, skewX, skewY, rotate, scaleNonUniform ו-rotateFromVector. אלו הטרנספורמציות היחידות שניתן לעשות גם ב-IE וגם ב-Safari/FF בגלל התמיכה של IE במטריצות רק בגודל 2*2, אז את שאר הפונקציות לא מימשתי - אבל זה נורא פשוט להוסיף אותן.

איך משתמשים במחלקה:

ראשית, יוצרים מופע של המחלקה:

var mfx = new Fx.Matrix(element, options) — all options are the options of Fx class.

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

mfx.set([[2,0], [0, 2]]);

המטריצה הזאת מייצגת את הפונקציה scale, כלומר, גודל האלמנט יגדל פי 2 לאורך ולרוחב.

דרך יותר מילולית וקריאה לעשות את הקוד היא להשתמש במערך האסוציאטיבי והסטאטי Functions שמכיל בתוכו את כל הפונקציות הנתמכות שתיארתי קודם:

mfx.set( Fx.Matrix.Functions.scale(2) );

בכדי ליצור יותר מטרנספורמציה אחת, ניתן להשתמש במתודה הסטטית prepare של Fx.Matrix שמקבלת את כל הפונקציות שאנחנו רוצים להשתמש בהן בתור אובייקט ליטרלי:

mfx.set( Fx.Matrix.prepare({
scale: [2],
rotate: [30] // 30 degrees
}) );

כל קריאה למתודה ’set’ שומרת את המטריצה שהועברה לתוך ה-Element Storage.

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

mfx.start( {
scale:[1, 2],
skewX: [40],
skewY: [50, 0]
});

 

המחלקה נבדקה בעזרת ה-demo בIE7/8, פיירפוקס 3.1 בטא 1 על Windows XP SP3 (מכונה וירטואלית) וספארי 3.1.2 על Windows Vista (במחשב בעבודה).

פוסט זה פורסם גם באנגלית בבלוג בבלוגיה של מיקרוסופט בתקווה ש-Ajaxian ימצאו אותו מספיק מעניין ויפרסמו אותו גם. את הפוסט פירסמתי גם ב-digg וב-dzone, אשמח מאוד אם תעזרו לקדם אותו ע”י לחיצה על הקישורים ולהצביע בעד הפוסט :)
אם אתם מכירים דרכים לבצע אפקטי 3D בעזרת מטריצה של 2*2, אתם מוצאים באג, דרך לייעל וכן, מצליחים לשלב את זה בתוך Fx.Morph, אשמח אם תתרמו את הקוד בחזרה לפרוייקט שלי.

תודה :)

הידד! סוףסוף אפשר לדבג ב-IE

לאחרונה הגיעה לאוזני הידיעה ש-Virtual Box  תוכנת הוירטואליזציה בקוד פתוח מבית סאן יודעת לקרוא קבצי VHD, פורמט שמתאים ל-Virtual PC של MS. אצתי להתקין את התוכנה ולבדוק את IE8 Beta 2 בעזרת ה-Evaluation Copy ש-MS מספקים. מלבד דרייברים ועברית שהייתי צריך להתקין באופן עצמאי הכל עבד חלק (כשניסיתי בויסטה לא היה צורך גם להתקין דרייבים ועברית, זה שאב את כל המידע ממערכת ה-Host לדעתי).

התחלתי לחקור את IE8, והדבר הראשון שחיפשתי היה את ה-Developer Tools שלו, לראות אם שידרגו. הפכו אותו לכמעט פיירבאג רק בנוסח MS. הכוונה היא לממשק שדיי דומה ל-Visual Studio שלהם, המאפיינים ה-CSSים וה-HTMLים מופיעים בטבלאות בצד ימין ובצד שמאל יש את עץ הDOM.

ב-Developer Tools החדש יש Javascript Console שמאפשר לשלוח הודעות (info, log ושאר החברים) לקונסול לצרכי דיבוג, וכן קולט שגיאות JavaScript ואזהרות, מהשגיאה ניתן להגיע לשורה המקורית בקובץ ולא לעסוק בניחושים כמו שמדבגים ב-IE6/7. כמו כן יש JavaScript Debugger הכולל תמיכה ב-Breakpoints, Watch וכו’. אני לרוב לא משתמש בדיבאגר כשאני עובד עם JS (רק מסתכל באיזה שורה או מסתכל על ה-Stack Trace). כך שאשמח אם מישהו יוכל לדווח עד כמה הדיבאגר טוב.

תכונה שנורא נורא נורא עוזרת זה האפשרות של להחליף את ה”מנוע” שאיתו הדפדפן עובד - אפשר לבחור אם לרוץ בתור IE8 במצב רגיל או לפי הגדרות ה-Compabilty של הדפדפן או לרוץ בתור IE7. יתר על כן אפשר לשנות את אופן הפירוש אם הוא לפי Quirks Mode או לפי Standard Mode. אם למשל נגדיר את מנוע הפירוש ל-IE7 ואת אופן הפירוש ל-Quirks Mode הדף בעצם מרונדר כאילו משתמשים ב-IE6 - אבל יחי ההבדל הקטן (/גדול) עכשיו ניתן לדבג JavaScript בצורה נורמלית ונוחה הרבה יותר.

ה-Developer Toolbar  כולל גם כל מיני כלים שקיימים בהרחבה-Developer Tool bar לפיירפוקס כמו outline, resize window וכו’.

מה שזה לא כולל זה לראות מה הוריד הדפדפן בדומה לטאב NET של Firebug או בדומה ל-Network Performance ב-Google Chrome.
ל-IE8 יש לחצן ליד שורת הכתובת שמאפשר לעבור ל-Compabilty View, משמע, אם האתר נראה שבור בעקבות השדרוג של הדפדפן אז ניתן להגדיר לדפדפן להשתמש ב”מנוע” של IE7 במקום. ההגדרות נשמרות.
MS בהחלט בכיוון הנכון, אבל הם ממשיכים לפגר מאחור.

ולסיכום אין על FireGod (קישור ל-Firebug).

Google Chrome - הדפדפן של גוגל

גוגל פירסמו היום קומיקס (38 עמודים) שמתאר את היכולות של הדפדפן שלהם Google Chrome שנמצא בפיתוח וישוחרר בקוד פתוח.

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

להמשך קריאה »

נוטשים מאחור את IE6?

IE6, דפדפן בן 7 שנים שחי עד היום אולי סוףסוף מתחיל לגסוס. הוצאת IE7 לא ריסקה אותו לחלוטין ואנחנו בוני האתרים נשארנו מאוכזבים עוד יותר, לא רק שצריך לתמוך ב-IE7 צריך גם לתמוך אחורה ל-IE6 שכן עדיין יש לו כ-30% משתמשים בעוד של-IE7 יש כ-20% משתמשים. (עפ w3counter.com).

לאחרונה נשמעות קריאות ומוצהרות הצהרות מאתרים, חברות ומהמשתמשים עצמם!

להמשך קריאה »

Zend_Controller, מצגת + טכניקה שפיתחתי

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

Zend_Controller הוא חלק מרכיב ה-MVC של Zend Framework, תפקידו כשמו הוא לשמש בתור ה-Controller, כל הפעולות עוברות דרכו, הוא מכוון את האפליקציה ממקום למקום. אם אנחנו רוצים לדרג במערכת דירוג פריטים, אנחנו ניגש לאובייקט מסוג Controller , לדוגמא, ItemController  ונקרא למתודה vote. שם תתבצע כל הפעולות מול המודל (DB, Web Service וכו̵ ;) ואז יעביר אותנו לרכיב התצוגה (VIEW) או ל-action אחר.
זה על קצה המזלג. לעוד אני מציע לקרוא בויקיפדיה ולחפש בגוגל MVC. ולראות את המצגת הבאה.
על הטכניקה שפיתחתי הקשורה ב-Zend Framework תוכלו לקרוא במאמר שכתבתי ופרסמתי ב-Zend DevZone, הטכניקה מאפשרת להעביר QueryString ו-Form Data דרך הפרמטרים של הפונקציה  במקום לגשת כל פעם לקרוא ל-getParam/getAllParams.

המצגת:

VirtualHosts ב-Apache על פורטים שונים.

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

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

כך נראה הפתרון:

 

Listen 81
<VirtualHost 127.0.0.1:81>
ServerAdmin temp@temp.com
DocumentRoot “/home/nir/sites/MyNewSite/”
ServerName www.newsiteport81.com
</VirtualHost>

את השורות האלו ניתן להוסיף ישירות ל-httpd.conf או אם אתם באובונטו אז ל-etc/apache2/sites-available/default/, ונראה לי אני לא בטוח אבל גם ע”י פתיחת קובץ חדש בתיקייה זו זה אפשרי.

שימו לב לשורה המודגשת, השורה שחסרה לי בשנה האחרונה וגרמה לכמה בעיות מעצבנות.

טיפ ב-PHP, ומחשבות על JScript 5.7

הטיפ ב-PHP:

ע”י שימוש בפקודה הבאה בלינוקס ניתן למצוא את כל הקבצים שיש בהם parse errors במידה ויש לכם פרוייקט גדול:

find /path/to/code -name *.php | xargs -n1 php -l

תודה ל-Ilia Alshanetsky שפרסם בבלוג של Chris Shiflett במסגרת PHP Advant Calendar (היום ה-17)
בנוסף, תצפו לפוסט שיפורסם בימים הקרובים (אולי עוד היום) על Zend_Controller (יפורסם באנגלית ובעברית).JScript 5.7

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

מצגות מומלצות לצפייה (PHP ו-MySQL)

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

המצגות שהכי אהבתי:
Content Indexing With Zend_Search_Lucene של שחר אברון
MySQL Performance Coding From Soup to Nuts של Jay Pipes.
High Performance PHP & MySQL Scaling Techniques של אלי וויט (Elli White)
Zend Framework MVC Quick Start של Matthew Weier O’Phinney

מצגת שלא אהבתי:
Time = Money של Deric Rethans מ-eZ - המצגת יכולה להיות מעניינת אבל היא בנויה בצורה שלא נוח לקרוא אותה, הנושא שלה קצת בומבסטי - הייתי בטוח שמדובר במצגת על ניהול נכון של זמן בפרוייקט (טוב מאוד עבור פרילנסרים) ולא על דרכים ופונקציות לטיפול בתאריכים ו-Timezones שונים. אני מניח שהייתי יוצא מההרצאה באמצע (או שלא מתוך נימוס).
צפייה מהנה :-).

מפגש פורום PHP

פורום PHP בתפוז ערך אתמול מפגש פורום בחברת Zend, מתברר שהמפגש פורום הקטן שלנו הפך למשהו גדול יותר, לא אגיד גרנדיוזי, אבל נכחו בסביבות ה-30 איש - מפגש מאוד מכובד, שכלל גם את קבוצת משתמשי PHP ישראל. המפגש כלל כיבוד קל, הרצאה על העבר, ההווה והעתיד של PHP וכן תחרות נושאת פרסים, שעבדיכם הנאמן לא זכה בה בפרס מכורך עצלנותו והרצון להכיר יותר טוב אנשים שנכחו שם. הארגון של המפגש היה טוב, תודה לחברת Zend על האירוח, הייתי מצפה שיהיה שלט שכתוב עליו Zend בגדול על הבניין שלהם שהם עובדים בו, אבל לא, אין. אז לקח לי יותר זמן למצוא אותו - אני לא איזורי P: .
היה לי הכבוד:
לפגוש את קוקי מנסטר,נדב, וזיו פרי (Fat Fish) מהפורום.
לפגוש שוב את נדב, גליה, מיטל שנכחו גם בהרצאה על JS שנערכה לפני כחודשים וחצי באוניברסיטת ת”א (שנדב העביר).
להכיר את תומר כהן ממוזילה, אריק “מתבטא” בכבודו ובעצמו, ליאור קפלן מלינמגזין.
ועוד מספר אנשים מהתחום שאיני יודע את שמם ואני מצטער על זה ;)

תמונות מהמפגש
ליאור קפלן מדבר על המפגש

PHP ו-Ruby על Servlet Containers

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

JRuby, פרוייקט ששם לעצמו מטרה לאפשר הרצת Ruby על ה-JVM, שיחרר לפני כמה זמן גרסת stable ראשונה production ready.
Rails עובד בצורה טובה מאוד עם JRuby - כלומר ניתן להשתמש ב-RoR ו-Ruby על כל Servlet Container (כמו Tomcat, Resin, Jetty).
מבחינת יעילות ל-JRuby יש יתרון דיי גדול על המימוש המקומפל של Ruby, אבל בהרצת Rails משום מה המימוש המקומפל מנצח. Ola Bini, אחד מהמפתחים של JRuby דיווח על כך וממשיך לבדוק איך ניתן לייעל את JRuby גם כך ש-Rails ירוץ עם ביצועים טובים.

בנוסף, לאחרונה פורסם ב-InfoQ ובמס’ בלוגים על פרוייקט Quercus, פרוייקט ששם לעצמו מטרה לאפשר הרצת PHP על JVM. הפרוייקט הוא תת-פרוייקט של Resin, אחד מה-Servlets Containers שקיימים בשוק, אבל ניתן להריץ אותו על Tomcat וכנראה שגם על אחרים. הפרוייקט נותן מימוש מלא של PHP5 (ושל מס’ מודולים של PHP גם כן). פרוייקטים גדולים כמו MediaWiki, WordPress, PHPBB ועוד, רצים באופן מושלם (לטענת Resin) ובלי שום בעיות.

יש גם את פרוייקט Jython הוותיק שמאפשר הרצת Python על ה-JVM, אבל כאן אין לי בכלל להרחיב.

מה זה אומר מבחינת מפתחי PHP ו-Ruby? שיתכן ויהיה לנו הרבה יותר מקומות ואפשרויות להשתלב בתעשייה בעקבות כך שניתן להשתמש בשפות אלו על טכנולוגייה שמצליחה מאוד בתחום ה-Enterprise בארץ ובעולם. בנוסף, יש באפשרותינו להשתמש בפתרונות מצליחים ב-JAVA מתוך PHP/Ruby מבלי שיהיה צורך בפרוייקט המרה. לדוגמא, ניתן להשתמש ב-iBatis של JAVA מתוך PHP וכו’.

מעניין אם זה אפשרי - להשתמש במחלקה שכתבנו ב-Ruby (נגיד Standalone ActiveRecord) מתוך PHP בעזרת הרצתם על Servlet Container שמאפשר גם JRuby וגם PHP.