מאגר PPA גם ל "Luach"
עכשיו שלמדתי איך לעשות את זה, אני שמח להכריז על מאגר PPA חדש בשביל לוח-השנה-העברי-עם-זמני-היום שלי, בעל השם המדהים "Luach" . (כן, אשמח להצעות לשם יותר נחמד אם יש למישהו).
דף המאגר נמצא כאן
https://launchpad.net/~moshe-wagner/+archive/luach
מה שאומר שמוסיפים אותו לאובנטו עם הפקודה:
sudo add-apt-repository ppa:moshe-wagner/luach
אגב, הלוח גם שופר הרבה לאחרונה, בעיקר מבחינת הקוד מבפנים, אבל לא רק.
בין השיפורים שעלולים לעניין את מי שלא מתכנן להסתכל בקוד, ניתן למנות את:
- הוספת זמני יציאת שבת
- תיקון כמה באגים עם כניסות שבת במקרים מוחדים (במוצ"ש למשל)
- גודל החלון מתנהג בצורה שפוייה עכשיו
מקווה שתהנו,
משה
למה אי אפשר להנות משני העולמות (או: למה KHTML אחרי הכל).
הרבה אנשים בפוסט הקודם התלוננו על התלות של "אורייתא" בספריות של 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
מקווה שהתנחמתם.
משה
אה, ולמי ששאל:
התקדמתי הרבה בצבא. עכשיו אני עושה את אותו כלום שעשיתי קודם בצורה הרבה יותר מקצועית ואחראית. תחשבו איזה הבדל יש בין חייל צעיר ולא מנוסה שמבזבז את זמנו לריק, לעומת חייל ותיק וממוקצע שעושה את זה. מזל שיש חיילים כמוני בצבא
גרסא חדשה ל"אורייתא"
שלום לכולם,
(אני מתנצל שזה פסוט מבולבל שהוא כולו העתק של מה ששלחתי לרשימת התפוצה של הפרוייקט, אבל אמצע הלילה עכשיו ואני לא יודע מה אני עושה)
לאחר הרבה מאמצים, אני שמח לבשר על שחרור גרסא ראשונה של הפרוייקט תחת השם "אורייתא", במקום "תורת אמת" כפי שהיה קודם.
מלבד שינוי השם, הגרסא כוללת, בין השאר, את השינויים העיקריים הבאים:
* התוכנה הרבה יותר יציבה
* מאגר אובונטו אמיתי, מאפשר התקנה בעזרת 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
אכן, הרבה זמן לא כתבתי, ואני מתנצל, וכל מיני כאלה וכו' וכו'. כדי לצאת ידי חובת תרוץ אציין שהתגייסתי מאז*, וזמני אינו בידי. אבל בכל זאת צריך לפרסם כמה דברים, מהסיבה שאני תמיד מדגיש – כדי שאני אזכור בעתיד מה למען ה' עשיתי אז. אז הנה:
נתחיל מתמונה של הדסקטופ שלי:
אכן, כפי שניתן לראות בבירור, מתחבא לו שם וויג'ט (יישומון?) קטן של זמני היום ההלכתיים.
הוא עושה בדיוק מה שחשבתם – מראה את זמני היום ההלכתיים על הדסקטופ. ניתן אפילו להגדיר לו איפה אתם ממוקמים בעולם (משפיע על הזמנים) – וזהו. תהנו.
אכן, לא משהו מרשים מדי, לא מסובך מדי – אבל בהחלט היה נחמד לכתוב אותו.
הקוד משתמש כמובן בספריית הזמנים של KosherJava עם העטיפה ל C++ שהזכרתי פה בעבר.
מי שמשום מה מעוניין, את הקוד ניתן לתפוס מכאן :
http://luach.googlecode.com/files/ZmanimPlasma-0.01.tar.gz
אולי בהמשך אני אפרט טיפה על כתיבת וויג'טים לפלסמה באופן כללי, אבל בקצרה – יוצרים תוכנת Qt ועם כמה שורות קסם הופכים אותו לוו'יגט. איך אומרים? סתכלו בקוד ותבינו.
פסח שמח ובעיקר כשר לכולם,
משה
* ולמי שתוהה – לא, אני ממש לא מתעסק במחשבים בצבא. אני יושב בצבא רגל על רגל עד שמגיעה השעה לחזור הביתה. למה? אל תשאלו אותי. לצ"הל פתרונים. אם זה כואב לכם ואתם רוצם לארגן לי פרוטקציות – בשמחה
Luach – (עוד) לוח שנה עברי
כתבתי כבר בעבר תוכנה קטנה להצגת זמני היום ההלכתיים, אבל לא אהבתי אותה מספיק כנראה, כי החלטתי שאני מעדיף את המתכונת של "קלוח" – לוח שנה שיש בו גם זמנים הלכתיים.
בנוסף, ממש לא אהבתי את השילוב Java + Swing.
מילא ג'אווה, אבל Swing שיגע אותי, שלא לדבר על כך שה Gui Builder של NetBeans לא אוהב layouts ושובר כל פעם מחדש את הצורה של החלון.
אז כשהחלטתי לכתוב כזה מחדש, היה ברור לי שאני לא כותב אותו בג'אווה, אלא עם הספרייה שאני אוהב – QT.
זה נתן לי כמובן להתבסס על libhdate, ואת הזמנים הוצאתי בדרך שתוארה כאן. לא מהיר – אבל עובד בסדר גמור.
זהו. כתבתי, נהניתי, היה נחמד, והנה איך שזה נראה:
זה כמובן לא גמור, אבל ראוי לשחרור ראשוני:
http://luach.googlecode.com
בנייה בלינוקס היא פשוטה:
make
ו-
make install
צריך ספריות פיתוח של qt ואת libhdate מותקן.
לגבי חלונות – זה יותר מורכב. בפוסט אחר בעז"ה.
תהנו,
משה
תוקן הבאג בגריז התאריך העברי לג'יימל
גם אני שמתי לב לבאג הקטן שהופיע, עם השנה החדשה, ב גריז של התאריך העברי בג'יימל.
למזלנו, התפנה קצת זמן למפתח של הגריז, והבאג תוקן.
אני לא יכול להבטיח שלא יהיו עוד באגים, אבל הם לפחות מתוקנים די מהר, אז זה בסדר
את הגריז המתוקן אפשר לתפוס כאן
http://userscripts.org/scripts/show/25518
תהנו, ושנה טובה,
משה
שימוש ב Fribidi ב C++
בהמשך לפוסט הקודם , אני מביא כאן דרך להשתמש בספרייה 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
עריכה: תקינתי את הטעות בקוד. תודה ארתיום.
Fribidi, ReportLab, ו pdf
לבקשת יואל , אני מפרסם כאן מבוא והסבר על שימוש ב fribidi, ו- pyfribidi, ובהזדמנות הזאת גם על הפאטצ' שכתבתי (אבל עוד לא נכנס
) ל-ReportLab.
זוכרים את זה שפעם כל אתר שני היה מראה עברית בכתב מראה, והאתרים שהיו מראים עברית נכון היו מועתקים לא נכון ל word?
זה קורה בגלל שבצורה טבעית, מחשבים מתייחסים לטקסט משמאל לימין.
למשל, אם נתאר את המחרוזת "שלום", כמערך, זה יראה כך:
ואז, כשהמחשב ינסה לכתוב אותה, קודם תגיע האות "ש", משמאלה "ל", וכו', ונקבל את הביטוי המפורסם "םולש".
בפורמטים יותר מתוחכמים, (כמו html של היום), אני מאמין שתיקנו את הבעייה בצורה יסודית, כך שהדפדפן, למשל, יודע שטקסט עברי באמת צריך להתחיל מימין לשמאל.
אבל עוד לפני זה, הפתרון הפשוט, הוא פשוט להפוך את הטקסט העברי. ככה, שבדוגמא שלנו, המחשב יחשוב שהאות הראשונה היא "ם", אחריה "ו", וכו'. ואז כשהמחשב ידפיס את זה משמאל לימין, זה יראה מושלם.
ומאחר ו pdf, שבו אנו עוסקים כרגע, הוא לא מהפורמטים היותר חכמים, זו האפשרות שמשתמשים בה שם.
ככה שאם אתם רואים מילה בעברית בקובץ pdf, דעו לכם שמבחינת הקובץ המילה הפוכה, אלא שלמראית עין זה מוצג נכון.
למאי נפקא מינה?
זו באמת לא בעייה גדולה, אבל מוכרחים להיות מודעים אליה. כשמחלצים טקסט מ pdf, חייבים לדעת שאם יש בו עברית היא תהיה הפוכה, ולהפוך אותה חזרה. כנ"ל כשיוצרים קובץ pdf.
רוב התוכנות הגדולות כבר מודעות לזה, ואכן אין בעייה.
אבל – יצא לי למשל להשתמש ב ReportLab ליצירת pdf, ומאחר ואף אחד לא היה מודע לבעייה, עברית יצאה הפוך.
שלחתי להם תיקון לבעייה , רק שזה כנראה לא בוער להם, אז זה לא נכנס. לי בינתיים התיקון מספיק.
כמובן, אי אפשר להפוך את הטקסט ידנית, שהרי אז אנגלית תהרס, ק"ו שטקסטים מעורבים לא ישרדו.
לכן, כאן נכנסת הספרייה (או התוכנה) fribidi לתמונה. בפשטות –
היינו, מימוש של התקן להצגת טקסטים דו-כיווניים.
זה אומר שהתוכנה מקבלת טקסט כלשהו, והופכת אך ורק את התווים שצריכים ללכת מימין לשמאל:
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? ומה הפתרון לבעייה?
זהו בערך. מקווה שהחכמתם; אם לא, אתה מוזמים לשלוח לי נאצות וכיו"ב באיימל.
שנה טובה,
גמר חתימה טובה,
משה
להכניס ל"בהפוכה" בהפוכה
נתקלתי ממש לא מזמן בתוכנה של אילן שביט, "בהפוכה" .
הרעיון מוכר, והתוכנה המקורית, "הפוך על הפוך" הייתה חביבה מאוד.
רק מה, המימוש פה היה הרבה פחות נוח.
בניגוד ל"הפוך על הפוך" שם הטקסט שסומן פשוט הוחלף בחדש, כאן התוכנה רק הכניסה ללוח של 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 עוד יהיה לחוץ אצלכם, ויקרה משהו שאתם לא בהכרח רוצים...

11 comments