פינגווין עם כיפה

מאגר PPA גם ל "Luach"

Posted in עברית, קוד פתוח by moshewagner on יוני 20, 2010

עכשיו שלמדתי איך לעשות את זה, אני שמח להכריז על מאגר PPA חדש בשביל לוח-השנה-העברי-עם-זמני-היום שלי, בעל השם המדהים "Luach" . (כן, אשמח להצעות לשם יותר נחמד אם יש למישהו).

דף המאגר נמצא כאן

https://launchpad.net/~moshe-wagner/+archive/luach

מה שאומר שמוסיפים אותו לאובנטו עם הפקודה:
sudo add-apt-repository ppa:moshe-wagner/luach

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

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

מקווה שתהנו,
משה

למה אי אפשר להנות משני העולמות (או: למה KHTML אחרי הכל).

Posted in קוד פתוח, תורת אמת by moshewagner on יוני 14, 2010

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

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

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

ואלו התוצאות:

QT-Webkit:
Starting: 17:56:59
Done: 18:01:32

KHTML:
Starting: 18:04:46
Done: 18:04:56

אז נכון, גם ל KHTML לקח 10 (ואולי אפילו 11!) שניות. ועדיין, שימו לב שלקח פחות זמן לבנות את התוכנה מחדש כדי שתשתמש ב khtml, מאשר לפתוח את הספר עם webkit. לשיפוטכם.

—————–

ורק כדי לנחם קצת את האובונטואיסטים המאוכזבים, יותם הציע פקודה שתתקין את התוכנה עם (קצת) פחות תלויות.
sudo apt-get install –no-install-recommends orayta orayta-books

מקווה שהתנחמתם.

משה

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

גרסא חדשה ל"אורייתא"

Posted in כללי, עברית, קוד פתוח, תורת אמת by moshewagner on יוני 6, 2010

שלום לכולם,

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

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

מלבד שינוי השם, הגרסא כוללת, בין השאר, את השינויים העיקריים הבאים:

* התוכנה הרבה יותר יציבה

* מאגר אובונטו אמיתי, מאפשר התקנה בעזרת apt-get רגיל ועדכונים אוטומטיים.  בסוף האיימל יש הסבר איך להשתמש במאגר.

* סידור מחדש של הספרים. אשמח לשמוע מה דעתכם עליו.

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

* אייקון ומסך פתיחה חדשים (ושוב תודה ליהושע על כל ההשקעה).

* תיקוני באגים בהרבה תצוגות ספרים, ושיפור של הקוד.

תודה לכל מי שעזר בהוצאת הגרסא הזאת לאור:  אליעד קורנברג, דור דנקנר, וכמובן yoch melka  .

( גרסת חלונות אמורה להשתחרר בקרוב, אבל כרגע אין)

אני מקווה מאוד שתיהנו מהגרסא החדשה, ואשמח לקבל דיווחי באגים באיימל.

———————-

כדי להתקין את התוכנה באובונטו, דרך המאגר החדש:

ראשית יש להוסיף למאגרי התוכנה שלכם את המאגר של אורייתא, על ידי הרצת הפקודה:
sudo add-apt-repository ppa:moshe-wagner/orayta

ואחרי כן את הפקודה
sudo apt-get update
לעדכון המאגרים.

אחרי זה, תוכלו להריץ
sudo apt-get install orayta orayta-books
והתוכנה תותקן. תהנו.

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

http://ppa.launchpad.net/moshe-wagner/orayta/ubuntu

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

ZmanimPlasma

Posted in עברית, קוד פתוח by moshewagner on מרץ 28, 2010

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

נתחיל מתמונה של הדסקטופ שלי:

ZmanimPlasma on my desktop

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

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

אכן, לא משהו מרשים מדי, לא מסובך מדי – אבל בהחלט היה נחמד לכתוב אותו.

הקוד משתמש כמובן בספריית הזמנים של KosherJava עם העטיפה ל C++ שהזכרתי פה בעבר.

מי שמשום מה מעוניין, את הקוד ניתן לתפוס מכאן :

http://luach.googlecode.com/files/ZmanimPlasma-0.01.tar.gz

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

פסח שמח ובעיקר כשר לכולם,
משה

* ולמי שתוהה – לא, אני ממש לא מתעסק במחשבים בצבא. אני יושב בצבא רגל על רגל עד שמגיעה השעה לחזור הביתה. למה? אל תשאלו אותי. לצ"הל פתרונים. אם זה כואב לכם ואתם רוצם לארגן לי פרוטקציות – בשמחה :-)

קימפול libhdate לחלונות עם NLS

Posted in עברית, קוד פתוח by moshewagner on אוקטובר 13, 2009

הלוח, שבדיוק כתבתי, מתבסס על libhdate.

כמיטב המסורת, libhdate תומך ב NLS, קרי – Native Language Support. או בתרגום חופשי – "תמיכה בשפת המשתמש". זה אומר שמשתמש שהלוקאל שלו אנגלי ירצה מן הסתם לקבל מ libhdate ערך אנגלי, ולהפך, משתמש עם לוקאל עברי ירצה פלט בעברית.

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

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

hdmoshe@debian:~$ hdate
Tuesday, 13 October 2009, 25 Tishrei 5770
moshe@debian:~$ LC_ALL=he_IL hdate
שלישי, 13 אוקטובר 2009, כ"ה תשרי התש"ע

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

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

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

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

א' לא מסובך. מתקינים gettext for windows, ושלום על ישראל. את החלק השני שלו נעשה אחרי ב'.

איך עושים את ב'?

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

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

./configure --host=i586-mingw32msvc --prefix=/path/for/win/version

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

דא עקא, שאם ננסה לעשות את אותו דבר עכשיו עם libhdate, נקבל:

...
checking for iconv... no, consider installing GNU libiconv
checking for GNU gettext in libintl... no
checking whether to use NLS... no

בגלל שחסר לנו, כפי שהזכרנו, את libiconv ו libintl.

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

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

הדגש הוא על הקבצים libintl.h, libintl.dll.a ו- libintl.lib .
צריך למקם אותם איפשהו, אני למשל מיקמתי אותם תחת:

/usr/winlib/libintl

עכשיו שיש לנו את gettext (עם libintl) ו libiconv , צריך רק ליידע את configure.
שיטוט באניטרנט העלה את האפשרות של שימוש ב env, ולכן הפקודה יצאה כך:

env CPPFLAGS="-I/usr/winlib/iconv/include -I/usr/winlib/libintl" LDFLAGS="-lintl -L/usr/winlib/iconv/lib -L/usr/winlib/linintl" ./configure --host=i586-mingw32msvc --prefix=/usr/winlib/libhdate

ואכן:

checking for GNU gettext in libc... no
checking for iconv... yes
checking for working iconv... guessing yes
checking how to link with libiconv... /usr/winlib/iconv/lib/libiconv.dll.a -L/usr/winlib/iconv/lib
checking for GNU gettext in libintl... yes
checking whether to use NLS... yes

הידד!
אבל לפני שאנחנו רצים לבנות את libhdate, כדאי לתקן את המקום שבו הוא מחפש את המילון, כדי שיתאים גם לחלונות.
אם נפתח את קובץ ה makefile שבתקייה src ידנית, נגלה לחרדתנו את הקביעה:

... -DPACKAGE_LOCALE_DIR=\"/usr/winlib/libhdate/share/locale\"

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

-DPACKAGE_LOCALE_DIR=\".\"  

זה אומר שהמילון יחופש במיקום של התוכנה, ובמקרה שלנו, תחת

he/LC_MESSAGES/libhdate.mo

מהתקייה שבה התוכנה שלנו.

זהו, עכשיו נבנה את libhdate, נתקין, ואת כל מה שיצא, נעתיק איפשהו לחלונות.

עכשיו צריך לעדכן את קובץ ה pro של Luach, כך שהקטע הבא יתאים למיקום של libhdate:

 win32 { 
    LIBS += -lintl \
        -LC:\libhdate\lib
    INCLUDEPATH += C:\libhdate\include
}

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

נותר לנו עדיין להעתיק את קובץ התרגום (libhdate.mo), אל התקייה he\LC_MESSAGES שממוקמת איפה שהבינארי שנוצר לנו נמצא.

זהו. אם הכל הלך כמו שצריך – התוכנה אמורה לקבל עברית כשהיא משתמשת ב libhdate. אם לא – באסה. נסו שוב.

בהצלחה,
משה

Luach – (עוד) לוח שנה עברי

Posted in Uncategorized, עברית, קוד פתוח by moshewagner on אוקטובר 12, 2009

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

בנוסף, ממש לא אהבתי את השילוב Java + Swing.
מילא ג'אווה, אבל Swing שיגע אותי, שלא לדבר על כך שה Gui Builder של NetBeans לא אוהב layouts ושובר כל פעם מחדש את הצורה של החלון.

אז כשהחלטתי לכתוב כזה מחדש, היה ברור לי שאני לא כותב אותו בג'אווה, אלא עם הספרייה שאני אוהב – QT.

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

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

תמונת מסך

זה כמובן לא גמור, אבל ראוי לשחרור ראשוני:
http://luach.googlecode.com

בנייה בלינוקס היא פשוטה:

qmake
make
ו-
make install

צריך ספריות פיתוח של qt ואת libhdate מותקן.

לגבי חלונות – זה יותר מורכב. בפוסט אחר בעז"ה.

תהנו,
משה

תוקן הבאג בגריז התאריך העברי לג'יימל

Posted in כללי, עברית, קוד פתוח by moshewagner on ספטמבר 29, 2009

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

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

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

את הגריז המתוקן אפשר לתפוס כאן

http://userscripts.org/scripts/show/25518

תהנו, ושנה טובה,
משה

שימוש ב Fribidi ב C++

Posted in עברית, קוד פתוח by moshewagner on ספטמבר 24, 2009

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

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

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

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

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

בכל אופן, הנה הקוד. (גיליתי איך לשים קוד ב wordpress סוף סוף! יש!!! )

//(Doesn't actually go here, but I needed to attach it to the code)
#include <fribidi.h>

// Returns a corrected single line Bidi string from the given line
// (Using fribidi's functions)

// WARNING: If the allocation isn't enough it will crash.
//  But I seems safe now.
string LineToBidiText(string line)
{
    string out="";

    //FriBidi C string holding the originall text (that is probably with logicall hebrew)
    FriBidiChar *logical = NULL;
    //FriBidi C string for the output text (that should be visual hebrew)
    FriBidiChar *visual = NULL;

    //C string holding the originall text (not nnecessarily as unicode)
    char *ip = NULL;
    //C string for the output text
    char *op = NULL;

    //Size to allocate for the char arrays
    int size = line.size() + 2;

    //Allocate memory:
    //It's probably way too much, but at least it's not too little
    logical = new FriBidiChar[size * 3];
    visual = new FriBidiChar[size * 3];
    ip = new char[size * 3];
    op = new char[size * 3];

    FriBidiCharType base;
    size_t len, orig_len;

    //A bool type to see if conversion succeded
    fribidi_boolean log2vis;

    //Holds information telling fribidi to use UTF-8
    FriBidiCharSet char_set_num;
    char_set_num = fribidi_parse_charset ("UTF-8");

    //Copy the given string into the ip string
    strcpy(ip, line.c_str());

    //Find length of originall text
    orig_len = len = strlen( ip );

    //Insert ip to logical as unicode (and find it's size now)
    len = fribidi_charset_to_unicode (char_set_num, ip, len, logical);

    base = FRIBIDI_TYPE_ON;
    //Convert logical text to visual
    log2vis = fribidi_log2vis (logical, len, &base, /* output: */ visual, NULL, NULL, NULL);

    //If convertion was successful
    if(log2vis)
    {
        //Remove bidi marks (that we don't need) from the output text
        len = fribidi_remove_bidi_marks (visual, len, NULL, NULL, NULL);

        //Convert unicode string back to the encoding the input string was in
        fribidi_unicode_to_charset ( char_set_num, visual, len ,op);

        //Insert the output string into the output QString
        out = op;
    }

    //Free allocated memory
    delete [] visual;
    delete [] logical;
    delete [] ip;
    delete [] op;

    return out;
}

כמובן שאת הקוד צריך לקמפל עם הפניה לקובץ ה Include ולספרייה, למשל:

g++ fribidi.cpp -I/usr/include/fribidi -lfribidi

עריכה: תקינתי את הטעות בקוד. תודה ארתיום.

Tagged with: , , ,

Fribidi, ReportLab, ו pdf

Posted in עברית, קוד פתוח by moshewagner on ספטמבר 23, 2009

לבקשת יואל , אני מפרסם כאן מבוא והסבר על שימוש ב fribidi, ו- pyfribidi, ובהזדמנות הזאת גם על הפאטצ' שכתבתי (אבל עוד לא נכנס :-( ) ל-ReportLab.

זוכרים את זה שפעם כל אתר שני היה מראה עברית בכתב מראה, והאתרים שהיו מראים עברית נכון היו מועתקים לא נכון ל word?

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

c_str[0] = "ש", c_str[1] = "ל", c_str[2] = "ו" ,c_str[3]= "ם"

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

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

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

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

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

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

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

לכן, כאן נכנסת הספרייה (או התוכנה) fribidi לתמונה. בפשטות –

"GNU FriBidi is an implementation of the Unicode Bidirectional Algorithm (bidi). "

היינו, מימוש של התקן להצגת טקסטים דו-כיווניים.

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


moshe@debian:~$ echo תירבע and English | fribidi
and English עברית

כל כך פשוט.

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


moshe@debian:~$ echo תירבע and English. | fribidi --ltr
עברית and English.
moshe@debian:~$ echo תירבע and English. | fribidi --rtl
.and English עברית

זה בערך מכסה את הבסיס לגבי fribidi עצמו. עוד אפשרויות אפשר למצוא ב man page שלו.

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


moshe@debian:~$ python
...
>>> str = "עברית and English!"
>>> print (str)
עברית and English!
>>> import pyfribidi
>>> direction = pyfribidi.LTR
>>> str = pyfribidi.log2vis(str, direction)
>>> print (str)
תירבע and English!

שיעורי בית לקוראים:
מה יקרה יותר כאשר יותר משורה אחת עוברת דרך fribidi? ומה הפתרון לבעייה?

זהו בערך. מקווה שהחכמתם; אם לא, אתה מוזמים לשלוח לי נאצות וכיו"ב באיימל.

שנה טובה,
גמר חתימה טובה,
משה

להכניס ל"בהפוכה" בהפוכה

Posted in כללי, עברית, קוד פתוח by moshewagner on ספטמבר 10, 2009

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

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

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

איך עשיתי את זה?

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

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

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

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

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

השנייה, יחסית נחמדה, אותה אני אציג פה. הרשיון GPLv2 :

#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os

Heb2Eng= {u'א':'t',u'ב':'c',u'ג':'d',u'ד':'s',u'ה':'v',u'ו':'u',u'ז':'z',u'ח':'j',u'ט':'y',u'י':'h',u'כ':'f',u'ל':'k',u'מ':'n',u'נ':'b',u'ס':'x',u'ע':'g',u'פ':'p',u'צ':'m',u'ק':'e',u'ר':'r',u'ש':'a',u'ת':',','/':'q',".":'q',u'ף':';',u'ץ':'.','.':'/',"'":'w',u'ם':'o',u'ך':'l',u'ן':'i'}

#Get clipboard contents
s = os.popen('xsel').read()
s = s.strip()

#See if it's all Hebrew or English, no mixed texts should be allowed!
try:
s.decode('ascii')
lang="English"
except UnicodeDecodeError:
#TODO: Make sure there's no English in here, or the results will be wrong
lang="Hebrew"

if lang=="Hebrew":
#Convert to english chars
unicodeWord = unicode(s, "utf-8" )
s = ""
for c in unicodeWord:
try:
s = s + Heb2Eng[unicode(c)]
except:
s = s + c

#Switch to English, (but allow to switch back to Hebrew!):
os.system('setxkbmap -layout us')
os.system('setxkbmap -layout us,il')

elif lang=="English":
s = s.lower()

#Switch to Hebrew, (but allow to switch back to English!):
os.system('setxkbmap -layout il')
os.system('setxkbmap -layout il,us')

#Simply type the text
os.system('xvkbd -text "' + s + '"')
#Totally restore the keyboard, might be needless here
os.system('setxkbmap us,il')

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

משה

נ.ב. שימו לב לא לשים לזה קיצור מקשים שמשמש גם קיצור לדברים אחרים, למשל Crtl + משהו, כי אז כשהמחשב יקליד לכם V, מן הסתם ה Ctrl עוד יהיה לחוץ אצלכם, ויקרה משהו שאתם לא בהכרח רוצים... :-)

הרשמה

קבל כל פוסט חדש ישירות לתיבת הדואר הנכנס.