ארכיון חודשי: מאי 2010

טיפ לעצמי: Jruby + Firebird Events

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

קוד הרובי:

#!/usr/bin/env jruby
require 'rubygems'
require 'java'
require 'date'

class Test
  def initialize
    @event_manager = org.firebirdsql.event.FBEventManager.new(Java::org.firebirdsql.gds.impl.GDSType.getType('PURE_JAVA'))
    @event_manager.setDatabase('/tmp/jtest.fdb')
    @event_manager.setUser('sysdba')
    @event_manager.setPassword('masterkey')
  end

  def run
    @event_manager.connect
    @event_manager.addEventListener('new_user', self)
    while (true)
      sleep(1)
    end
  end

  def eventOccurred(event)
    puts "[#{DateTime.now.to_s}] #{event.getEventName()}"
  end
end

test = Test.new
test.run

חשוב להבהיר כי למרות ש eventOccurred אינו חוקי כל כך ברובי, אבל הוא מאשר את זה בכל זאת, רק ה IDE שאני משתמש בו לא מאושר מזה כל כך 🙂

טיפ לעצמי: שימוש בjruby ו jdbc לעבודה עם firebird ו dbi

אני ממשיך בניסויים שלי עם jruby וכמובן FirebirdSQL. הרבה אנשים לא מבינים למה, אז התשובה היא פשוטה: אני מחפש כלים פשוטים, אמינים שעושים לי חיים קלים לתחזוקה ועבודה. השימוש ב JRuby הוא כאמור בגלל התמיכה שלו ב thread, אבל אם כבר משתמשים ב JVM, אז בואו נשתמש בזה איפה שאפשר להנות ממנו בכל מקום, ולכן השימוש שלי עם Firebird הוא באמצעות JDBC. בחרתי דווקא ב DBI ולא ב ActiveRecord בגלל שהתמיכה של ActiveRecord ב JDBC ממש לא עובדת לי כמו שצריך (ניסיתי עם עוד כמה מסדי נתונים), ואחרי יותר מידי שעות של מאבקים שבהם אפילו הצלחתי להרוס לגמרי את PosgreSQL (המסד נתונים הנוסף שניסיתי) בצורה שגם הסרה מלאהו התקנה מחודשת לא מתקנת, נשברתי ואני חוזר לעבוד עם DBI ו JDBC. כאן לקח לי מאוד מהר לגרום לדברים לעבוד כמו שצריך (פחות מ10 דקות במקום 8 שעות של אתמול והיום מאבק עם ActiveRecord).

הקוד לעבודה כאן מאוד קל ופשוט (אותו מסד נתונים כמו אתמול, רק היום אני משתמש כבר ב alias):

#!/usr/bin/env jruby

require 'rubygems'
require 'java'
require 'dbi'

dbh = DBI.connect('DBI:Jdbc:firebirdsql:localhost:jtest',
'sysdba', 'masterkey', 'driver' => 'org.firebirdsql.jdbc.FBDriver')

begin
  puts dbh.select_one "SELECT name FROM users"
ensure
  dbh.disconnect if (not dbh.nil? && dbh.connected?)
end

וכאמור זה עובד כבר מפעם הראשונה שניסיתי.

טיפ לעצמי: Firebird Events, Java, JayBird

אני עושה ניסויים עם JRuby. הבעיה שלי היא שאין לי ברובי תמיכה באירועים של Firebird ואין לי זמן ללמוד להוסיף את התמיכה הזו לרובי, ולכן אני מנסה ללמוד לעבוד עם האירועים של JayBird לג'אווה. השימוש שלי ב JRuby אם מישהו סתם רצה לדעת הוא דווקא בגלל הצורך שלי להשתמש בThreads, ולצערי ברובי 1.8 הם עדיין ירוקים, ולכן אני נאלץ לעבוד עם JRuby.

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

הקוד של מסד הנתונים לבדיקה: להמשיך לקרוא

פסקל להמונים

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

ללמוד לעבוד עם מחשב

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

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

1. מחובר לחשמל ולא מופעל

2. מחובר לחשמל ועובד

3. לא מחובר לחשמל ולא מכוון לעבוד

4. לא מחובר לחשמל ומוכון לעבוד

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

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

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

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

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

קבלת מספר MAC בלינוקס בצורה תכנותית

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

אני מכיר 2 דרכים: האחת להשתמש בספרייה בסגנון של libnet, והשנייה פשוטה יותר. החלטתי ליצור קוד quick and dirty שמדגים איך לעשות את הדרך הפשוטה יותר (הקוד כאן מוגש כקוד עבור לימוד בלבד, ולא נועד לשימוש אחר):

{$mode objfpc}
program get_mac;
uses sysutils;

const
  linux_path     = '/sys/class/net/%s/address';
  default_device = 'eth0';

var
  f       : textfile;
  device,
  path,
  addr    : string;

begin
  device := default_device;

  if (ParamCount = 1) then
   begin
    device := ParamStr(1);
   end;

  path := Format(linux_path,[device]);
  if Not FileExists(path) then
    begin
     writeln('Could not find the device: ', device);
     halt(1);
    end;

  AssignFile(f, path);
  reset(f);
  readln(f,addr);
  closefile(f);

  writeln(device, ' MAC Address: ', addr);
end.

מה קורה כאן בעצם ? תחת הספרייה של:

/sys/class/net

יושבים קישורים לכל device הקיים כרגע עבור תקשורת בלינוקס. תחת ספריית ה device, יש קובץ בשם address אשר מכיל את מספר הMAC של אותו device.

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

תרומת תרגום ללזרוס

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

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

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

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

של מי בכלל הפנגווין הזה ?

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

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

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

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

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

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

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

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