midp-build

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

The midp-build system is a generic build system for mobile java applications developed in Eclipse. it uses the Eclipse configuration files (.classpath files) to determine project dependency, build order and build classpath automatically.

it can build any MIDlet with very little configuration.

  • The system supports complex builds with multiple outputs, for example – it's possible to build for several products, configurations and devices in a single run.
  • The build fully support preprocessing of source code based on symbols that are defined per devices, products and configurations (or almost any combination of those).
  • The build allow fine customization of the properties contained in the JAD for each JAR+JAD pair generated.
  • The build supports signing of generated MIDlets automatically
  • The build supports including classpath resources in the generated JAR(s), and/or copying specific resources
  • The build supports local builds, based on files on the workspace (without changing them in any way).
  • The build fully supports CVS and have some untested support for SVN
  • The build supports multiple build configurations per Eclipse project (see conf.prefix)

הארדווינו הגיע

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

אז מה בחבילה?

  • ארדוינו מגה
  • לוח פרורי-לחם (מה שנקרא BreadCrumbs), וערמת מחברים
  • שקית מלאה בנגדים, LEDים, כפתורים,ג'אמפרים וכו'
  • כבל USB כחול ומגניב לחיבור הארדוינו למחשב

arduino

(התמונה לחיצה וסחיטה).

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

ככה נראית התוכנית בתוך סביבת הפיתוח:
screenshot-arduino-0015

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

מלחמת השועלים

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

המלחמה ממשיכה עוד קצת ומתוארת בפרוטרוט בבלוג של אדבלוק פלוס.

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

Swush

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

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

ניקח לדוגמא את פיסת הXML הבאה (קוד אמיתי מההגדרות של טומקט):

[code lang="xml"]
factory
org.apache.catalina.users.MemoryUserDatabaseFactory
pathname
conf/tomcat-users.xml

[/code]

הרבה מלל כדי להגיד שיש דבר כזה UserDatabase, ויש בתוכו שני זוגות Key-value, לא?
אפשר גם לציין את אותו מידע כך:
[code lang="java"]
ResourceParams{
UserDatabase{
factory : org.apache.catalina.users.MemoryUserDatabaseFactory
pathname : conf/tomcat-users.xml
}
}
[/code]
יותר קומפקטי ופחות פלצני.
השפה שבה השתמשתי בפעם השניה היא Swush, שפה שהגדרתי ומימשתי בסופ"ש.
Swush (סוו'ש בעברית, נראה לי שאני אדבוק באנגלית), תומכת בהערות בסגנון C/C++ וbash:
[code]
// C++ single line comment
/* C multi-
line comment*/
# Bash style comments
[/code]

בנוסף, סטרינגים בSwush לא מחייבים גרשיים, אבל אם משתמשים בגרשיים אפשר להגדיר סטרינגים עם רווחים ואפילו שורה-חדשה בתוכם.
[code]
string1

"another string"

"multi
line
string"
[/code]

המימוש שלי לSwush הוא בשפת ג'אווה, אבל בהחלט אפשרי שיהיו מימושים בשפות נוספות (בין אם שלי או של אנשים אחרים).
Swush תומך ברשימה פשוטה של מפתח-ערך, למשל:
[code lang="java"]
host : "locahost"
port : 8080
[/code]
ככה שאפשר בקלות רבה להחליף אותו קבצי properties של ג'אווה.

מבחינת הקוד, השתדלתי שהוא יהיה מה שיותר פשו לשימוש.
אפשר ליצור אובייקט Swush בכמה צורות:
[code lang="java"]
Swush fromFile = new Swush(new File(filename));

Swush fromString = Swush.constructFromString("swush:rocks","UTF-8");

Swush usingCode = new Swush();
usingCode.add(new Swush("key","value"));
usingCode.add(new Swush("node"));
usingCode.getChildren(1).add(new Swush("key2", "value2"));
[/code]

אחת הפונקציות המעניינות של המימוש שלי היא פונקציית select, שמחזירה רשימה של צמתים שמתאימים לקריטריות שצויין, לדוגמא – אם יש לנו קובץ Swush כזה:
[code lang="java"]
addressbook
{
max_size : 30

item
{
phone : 123
name : "The dude"
address : "Multi
Line address"
}

item
{
phone : 3454
name : "Another dude"
address : unknown
}
}
[/code]
ואנחנו רוצים לגשת לצמתים של הItem, נוכל לעשות משהו כזה:
[code lang="java"]
Swush swush = new Swush(new File(filename));
List matchs = swush.select("addressbook.item");
[/code]
הרשימה שחוזרת תכיל את שני הצמתים המתאימים (מסוג item שנמצאים בתוך addressbook).
Swush ממומשת עם Antlr, וההגדרה שלה מאוד פשוטה, אפשר להעביר אותה בכמה דיאגרמות:



Swush משוחררת ברשיון BSD, ואפשר להוריד אותה מפה.

hak5

כרגע ראיתי פרק של hak5, שעסק בDNS Tunneling כדי לגלוש בחינם במקומות עם WIFI סגור שמאפשרים DNS, וכן LinuxDNA – פרוייקט לאופטימיזציה של הקרנל של לינוקס עם ICC (הקומפיילר של אינטל).
אחלה תוכנית.
נראה לי שאני אתחיל לצפות בה באופן קבוע.

Ajax Terminal

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

ארדויינו

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

ארדויינו (Arduino) הוא לוח אלקטרוני ניתן לתכנות, שמיועד לאו דווקא לגיקים אלא גם לאמנים ומעצבים.
הלוח עצמו עולה כסף (לא יותר מדי, כ20 יורו לגרסא הבסיסית), אבל סביבת הפיתוח, התכנון של הלוח עצמו, העיצוב וכל השאר – הכל משוחרר ברשיונות חופשיים (GPL, LGPL וCC לפי הצורך).
הלוח קטן ואלגנטי:

אז למה זה טוב?
להמשיך לקרוא ארדויינו

TL2RSS – הגרסא הידידותית

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

החלטתי ועשיתי.

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

כדי שהדבר הזה יעבוד, TL2RSS צריך להתחזות למשתמש רגיל שמתחבר לטורנטליץ'. מכיוון שהדפדפן של המשתמש לא מתחבר לטורנטליץ' אלא לTL2RSS צריך לזייף את הReferrer ואת שדה הHost בבקשת הHTTP שנשלחת לטורנטליץ'.

עד כאן הכל טוב ויפה.  אבל הקפצ'ה סירבה לעבוד בטענה שהאתר לא מאושר לגשת אליה.
כמובן – הקפצ'ה באה מאתר אחר, api.recaptcha.com, והדפדפן של המשתמש מלשין שהמשתמש לא הגיע מטורנטליץ', הנבלה.

אז מה עושים?
משכתבים.
בכל מקום בדף הHTML של הלוגין החלפתי את api.recaptcha.com בlocalhost:8080/external:api.recaptcha.com  (כאשר localhost:port הם הפרטים הנכונים של השרת שעליו רצה TL2RSS).

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

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

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

שחררתי את כל השיפורים בגרסא 1.2.

הRSS של טורנטליץ' מעולם לא היה יציב כל כך.

TL2RSS חזרה לחיים

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

ואנא, אל תטרחו לבקש הזמנות לטורנט ליץ'. אין לי.