קטגוריה: Perl

לאן פרל נעלמה אצלי ?

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

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

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

...
require 'zlib'
...
Zlib::GzipReader.open(file).each do |line|
...
end
...

הקוד עצמו לקח לי משהו כמו 40 שורות קוד בגלל שעשיתי את זה בדרך הקריאה, כולל אפשרות לדבג את הנעשה בקוד, ולא בדרך הקצרה לכתיבה (אשר היתה הופכת את זה בערך ל15-20 שורות קוד).

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

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

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

My Database-free Application lecture

Today I gave a lecture about database-free applications.

Most people who first read the title, thought that "oh you probably write to memory or disk or something", yet the lecture is not about storing data, but on one approach of designing systems to work.

It is a completely different thing, yet I find that many people can't see it, they are looking for the "catch".

This post was written prior to the actual lecture itself (a day before in fact 🙂 ), so I can't tell if my lecture was good enough or not, but you have my slide notes, and the whole lecture (using html5 and reveal.js -> firefox or chrome recommended), so take a look and tell me yourself 🙂

Working with Shared Libraries in Perl

Here are my slides for a lecture I gave at Perl mongers:

In case you'll download the slides, you'll also have my notes inside.
Enjoy 🙂

regular expression על קצה הפוסט – חלק ראשון

עולם המתכנתים מתחלק לשלושה חלקים:

  1. אלו אשר משתמשים ב Regex‏
  2. אלו אשר שמעו על Regex‏
  3. אלו שחושבים שאני מקלל אותם כרגע

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

Regular Expression או Regex כקיצור, זו למעשה שפה המאפשרת לתאר תבנית מסויימת של טקסט שרוצים למצוא או לשנות.

ישנן הרבה מימושים לשפה, כאשר כל מימוש מספק יכולות שונות – בעיקר תוספות למימוש הבסיסי ביותר. אחת הידועות ביותר נקראת Perl Compatible Regular Expression או PCRE בקיצור .אך התקן הבסיסי ביותר שיש עבור השפה, בכלל שייכת לPOSIX.

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

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

למשל, במידה ואנחנו בהכרח יודעים כי המחרוזת תראה כך:

Hello World

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

^([\w]+)\s([\w]+)$

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

עוד יום שלישי ה13

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

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

זהירות, הקוד קצר מידי, בייחוד אם משווים לC

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

עבודה עם /dev/random ו /dev/urandom

ישנם בעולם ה POSIX – בעיקר במערכות יוניקס 2 devices אשר מאפשרים לנו לקבל מספר כלשהו שיהיה בסיס לחישוב רנדומאלי (seed). ההבדל העיקרי בניהם הוא ש random הוא blocking, כלומר עד אשר לא אקבל תשובה אשאר "תקוע". בעוד ש urandom חוזר מייד, ולפעמים יביא מידע פחות איכותי (כלומר פחות רנדומאלי) לשימוש.

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

זריקת חריגה (חלק שלישי)

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

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

  • raise
  • fail

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

המתודות יכולות לקבל עד 3 פרמטרים (רק הפרמטר הראשון הוא חובה):

  1. מחלקה של החריגה שאותה רוצים "לזרוק"
  2. מחרוזת שרוצים להציג
  3. את ה stack שרוצים להציג, בשביל להראות מאיפה התרחשה החריגה

התחביר המינימאלי שנראה הוא כזה:

raise ArgumentError

ותחביר בשימוש מלא יראה בצורה הבאה: להמשיך לקרוא

Strawberry Perl תומך ב DBD-Interbase

מריוס פופה פרסם סרטון ווידאו (מאוד מצחיק לדעתי :)) וגם הסבר בFirebirdnews כיצד אפשר להשתמש בגרסאות הפיתוח האחרונות של DBD-Interbase בייחד עם Strawberry Perl, כך אפשר להנות גם מעבודה עם Firebird גם בWindows כאשר משתמשים בגרסה הזו של פרל ל windows.

0.1+0.2 = ?

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

0.1+0.2

מה תהיה התוצאה ?

התשובה היא שזה תלוי.

במה זה תלוי ? ובכן זה תלוי במהדר/מפרש, וזה תלוי בסטנדרט שאותו מפרש/מהדר משתמש בו.

למעשה השפה היחידה עם 2 מהדרים שניסיתי שנתנה את התשובה 0.3 היתה פסקל על FPC (אין לי דלפי לנסות עליו).

מבחינת מסדי נתונים כל מה שניסיתי (שזה Firebird, MySQL, PosgreSQL) כולם נתנו תשובה זהה לFPC.

שאר השפות החליטו שמדובר בתוצאה של 0.30000000000000004

מהם שאר השפות ?

ובכן

C (gcc), Perl, Ruby, Python, Javascrupt (Firefox), PHP

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

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

הבנתי סוף כל סוף

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

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

ואז קראתי את המאמר הבא שמסביר כמה נקודות על רובי לאנשי פיתון ופתאום הבנתי !

אפשר לסכם את הדברים באמצעות כתיבת השורה

import self

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