ארכיון חודשי: מרץ 2009

עבודה עם HTTParty

גיליתי טיפ ומודול רובי מאוד מעניין. שם המודול הוא HTTParty. ואני אכתוב כן את הטיפ שרובי על מסילות כתב עם שינוי קטן.

הטיפ מראה איך לממש 2 דברים:

  1. עבודה עם HTTParty
  2. השני הוא הדגמה איך לתרגם טקסטים בצורה פשוטה תוך שימוש ב Google Translate.
1 #!/usr/bin/env ruby
2
3 require 'rubygems'
4 require 'httparty'
5
6 class GoogleApi
7   include HTTParty
8   base_uri 'ajax.googleapis.com'
9
10   def self.translate(string="", to="", from="iw")
11     get("/ajax/services/language/translate", :query => {:langpair => "#{from}|#{to}", :q => string, :v => 1.0})
12   end
13 end
14
15 GoogleApi.translate("שלום עולם", "en")

השתמשנו ב GoogleApi.translate בשביל לבצע תרגום בשבילנו. התוצאה שזה נתן היא זו:

{"responseData"=>{"translatedText"=>"Hello World"}, "responseDetails"=>nil, "responseStatus"=>200}

כמו שאפשר לראות, מאוד פשוט לבצע פעולות REST עם HTTParty ולקבל תוצאות.

את התיעוד עבור Google Translate ניתן למצוא כאן.

ביצוע Binding שמי במסדי נתונים

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

קודם כל מהו bind ? ובכן bind זו דרך להוסיף תוכן חיצוני לשאילתות שלנו, כאשר מסד הנתונים יודע להבין שמדובר בערך חיצוני ולכן הוא מבצע פעולת escaping על המידע בשביל שלא יתרחש sql inection.

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

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

Rails 2.3

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

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

השינוי העיקרי של Rails 2.3 הוא בכך שהעבירו כמעט כל רכיב REST ב Rails לעבוד עם Rack במקום השימוש במודול ה CGI הרגיל. זה מתחיל מ script/server אשר עכשיו יכול להתממשק לכל רכיב Rack בעצם, אבל זה הרבה יותר מזה, כי גם ה dispatcher וגם העבודה עם עוגיות ו session עברו להשתמש ב Rack. העבירו הרבה רכיבים להיות תוכניות תיווך (middleware) , מעבודה על הנעילות דרך ActiveRecord (הכלי שמספק לנו ORM) וזה חילחל עד לכל הרכיבים שמתעסקים בrender כדוגמת עבודה עם XML, JSON, HTML וכו'. להמשיך לקרוא

Why I find MySQL to be so bad

MySQL is the most used Open Source database engine. I have personally used it for almost 10 years. I worked with versions 3.x, 4.x and 5.x of MySQL, but I also used other database engines, some of them handling the same "data-set size" as MySQL, while others have been smaller databases (mostly Desktop based databases such as SQLite, MS-Access and Paradox).

This is the first part of my complaint about MySQL and why I dislike it. להמשיך לקרוא

השוואה בין PosgreSQL לבין Firebird SQL

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

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

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

את ההשוואה ניתן למצוא כאן.

Rack

כאשר עובדים עם HTTP דינמי, ישנם כמה דרכים לבצע את אותם המשימות.

דרך ראשונה היא ליישם את CGI (או את FastCGI או את scgi וכו'), דרך שנייה היא לספק כלים טבעיים בשפת התכנות לעשות את אותו הדבר בדיוק. גם רובי וגם פיתון מספקים כלים טבעיים בשפה בשביל לדבר ב HTTP.

ברובי יש לנו את הכלי שנקרא Rack.

הדוגמא הפשוטה ביותר לעבוד איתו היא בצורה הבאה: להמשיך לקרוא

missing feature in all* package managers

One of the most needed feature that I find missing in packge managers (dpkg, rpm, pacman, gem**, cpan, fppkg etc) is the ability to install more than one version of a package, and create an alternative entry for it or a script that knows how to handle the execution of different versions.

Why do I require such feature you must ask yourself (or want to ask me) ? well lets imagine the following scenario:

You are working on a program with a specific version of a library/tool/compiler/something, and in the next few months, a new version of that thing will arrive, and for now there are beta and rc's on that thing. You wish to make sure that your program works with the new version, but you do not want to move to a new unstable version, or you wish to continue support older versions.

The idea I have will help us work better in such cases. The renaming of a package name does not always helps in such cases (installing in the same directories, conflict of things that they both provide etc..), however knowingly managing different version of the same thing, can help us overcome such issues, and still have the result that we wish to have.

What do you think ?

* All package managers known to me (and me alone)

** gem does support installing multiple versions, but not the way I want it.

הקרב של מריוס

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

לאחרונה החליט מריוס לקרוא תיגר על 2 דברים:

  1. עבודה עם Internet Explorer
  2. עבודה עם Windows בכלל

מריוס החליט לשלב בין 2 המאבקים וכתב 2 פוסטים בנושא.

כלכלת הקוד הפתוח

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

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

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

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

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

עוד פעם בעיות עם MySQL

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

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

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

כאן מתחילה הבעיה. ניסיתי לשחזר את טבלאות של MySQL, ולמזלי עשיתי גיבוי ב3 רמות: להמשיך לקרוא