Michael Haephrati's Blog

a blog by Michael Haephrati

סיכום שנת 2011

כתבתי השנה באתרים רבים: Reader, XPlace, Code Project, Amiga.org, ישראבלוג, תפוז, Article Base, EFind, במה חדשה, מיקרוסופט ישראל, קפה דה מרקר, אנשים ומחשבים (פרסמתי מאמרים ישנים מהשנים 1992 ועד 1994), Authors,  E-Mago (שלוש שאלות), וגם טרמינל, WikiHow, SlideShare, אקדמיק, וMaker.

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

הקלות הבלתי נסבלת של פרסום מאמרים באינטרנט

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

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

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

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

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

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

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

והתשובה החד משמעית: “כן”!

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

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

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

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

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

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

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

כשפותחים את תוכנת Word, צריך להופיע tab בשם Developer.

במידה וזה אינו מופיע, יש לשנות את האפשרות הבאה:

ועכשיו נעבור לחלק הכיפי והוא התוכנה עצמה.

לוחצים על כפתור: Visual Basic ומופיע המסך הבא.

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

וכך זה נמשך…

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

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

ועכשיו נעבור לתוצאות.


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

מאת משה כחליל

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

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

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

ואם שאלתם היכן כל זה קרה, אז התשובה היא: פקיסטן.

וכאן אפשר לספר שאכן כן. זה קורה. זה אפשרי. יש מקום להפגיש את התחומים מלאכת יד ותיירות!

חזרתי הביתה עייף אך מרוצה ובעודי הולך בשביל המוליך על ביתי, התהדהד במוחי הקודח המשפט:

“כישלון הוא רק הזדמנות להתחיל מחדש בדרך נבונה יותר”.

ועד הפעם הבאה, להשתמע, משה.

או…

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

מאת משה כחליל

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

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

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

ולא שזה משנה אבל הכל מתרחש באנגולה.

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

חברים יקרים. קולגות. קוראים. מורי ורביי: זכרו תמיד את המשפט המפורסם

“נר קטן יכול להאיר חשכה גדולה. חשכה גדולה לא יכולה לכבות נר קטן”.

ועד הפעם הבאה, להשתמע, משה

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

והמייל אכן הגיע…

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

בתוך כך, הרימה הילדה את הכפפה ושכללה את תוכנת הVBA והתוצאה כבר הרבה יותר משוכללת: מאמרים שונים ומגוונים והכל ללא מגע יד אדם…

ולסיום רק בשביל הקוריוז כמה מאמרים שגירסה 2 של התוכנה מייצרת…

מאמר מהגירסה הראשונה:

דת ואסטרולוגיה על הקשר בינהם

מאת משה כחליל

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

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

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

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

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

חברים יקרים. קולגות. קוראים. מורי ורביי: זכרו תמיד את המשפט המפורסם

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

ועד הפעם הבאה, להשתמע, משה

ועכשיו לגירסה המשופרת שבתי הגאונה כתבה:

 המיתוס של סיזיפוס ופיזיקה -שטויות במיץ עגבניות?

מאת משה כחליל

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

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

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

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

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

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

“אם אתה רוצה את הקשת בענן, אתה צריך לסבול גם את הגשם”.

ועד הפעם הבאה, להשתמע, משה


לסיכום:

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


  • “משה כחליל” הנו דמות בדיונית אשר אין כל קשר בינה לבין אדם אמיתי כלשהו.

December 31, 2011 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , | Leave a comment

Developing Rashumon – the secrets

When I have devleoped Rashumon, there was no built in support for multi-lingual / bi-directional text and I had to develop such from scratch

Background

During 1989 to 1994 I have developed Rashumon, the first multi-lingual graphic word processor for the Amiga. Rashumon

brought some unique features:

  • Multiple Selection of text (selecting non continious parts of text simmultaneously)
  • Table generator
  • Multiple key maps support (up to 5 simultaneously)
  • Search and replace includes color, style and font filters
    Rashumon - Search / Replace
  • Multi-lingual string gadgets to be used for creating and renaming files, drawers, etc.
  • Imports and exports multilingual ASCII files from and to PC and MAC
  • Ultra fast screen updating and scrolling
  • IFF graphics support (import and export).
  • Direct access to each one of the 256 characters per each font.

Using the code

The code samples used in this article are taken from Rashumon source code, as can be examined by any C++ compiler, even though they were created for Amiga Aztec C compiler.

Points of Interest

Now days we tend to forget some of the complexeity which was part of coding 20 years ago, and today is built in as part of any Operating System SDK, among them: bi directional editing, text editing in general, scorlling text and word wrapping.

Developing a multi-lingual graphic word for the Amiga, back in 1989, required in fact, writing parts of what would be today, part of an Operating System, but was missing back then.

Developing Rashumon

The Amiga was and still is a great computer, with great capabilities, especially when it comes to sound and video. However, basic elements such as a File Browse dialog box was missing, not to mention any support for right to left languages.

Today, all operating systems contain the core elements required to support multi-lingual text editing. The text is stored by the order it was typed, and displayed backward, when it comes to a right to left language. This makes it simple and easy to edit and manipulate it, since the storage reflects to the logical order of the text flow. Back then, there was a need to develop such building block, and it was have made my word processor too slow, had I displayed the text differently than the way it is stored.

Instead, I wanted to develop a word wrapping engine of my own. Word Wrapping is the mechanism that allows breaking lines without breaking words. Unlike the old type writer, where you get to the end of the line, and sometime break a word at the middle, word processors are able to move the last typed word to the next line, in case there is not enough room for it in the current line.

That becomes even more complex when you have to deal with proportional fonts, where each character has its own width, and when you allow combining several fonts. All of the above was not part of a high level API, but required calculating the predicted length of a given text, in pixels, taking into calculation each character width based on the character and the font, attribute (bold, italics) and size used, along with the margins selected.

So even if we deal only one direction (left to right) of editing, it was still complicated to develop from scratch.

To being with, I wrote the routine to calculate a length of a given line:


int LLen=(mode==GRAPHICS)?ln->Len:(ln->CharLen=strlen(ln->Txt))*8;
As you can see, there is a simple scenario where “mode” isn’t “GRAPHICS”, then the length is calculated based on the number of characters multiplied by 8 (which is the length of each character when mono spaced font is used).

When it comes to editing bi directional text using proportional and multiple fonts, it is more complex even to insert a single character:

// This is a rountine for adding a single character, taken
from Rashumon source code
static put_char(wrap,chr)
BOOL wrap;
UBYTE chr;
{
       UBYTE c[2];
       BOOL update=FALSE;
       c[1]=;
       c[0]=chr;
       if(ENGLISH_H)
// Left to right text
       {
              if(chr>=‘a’
&& chr<=‘z’ &&
map[Header->format >> 11]<2) chr=ucase(chr);
              if(Header->Insert || !HCL->Txt[CR])
              {
                     if(!wrap &&
HCL->Len+font_width(HCL,CR)>HCL->MaxLen) return();
                     char_insert(HCL,c[0],CR);
                     HCL->CharLen++;
                     CR++;
                     HCL->Len+=font_width(HCL,CR-1);  
//
Here we add the additional size to the overall line
//
size in pixels
                     HCL->CursLen+=font_width(HCL,CR-1);
              }
              else /* OVERWRITE IN
ENGLISH */
              {
                     //
Now we treat Overwrite mode
                     HCL->Txt[CR]=c[0];
                     HCL->Format[CR]=Header->format;
                     if(c[0]==9)
                     {
                           SetFlag(HCL->Format[CR],TAB);
                           HCL->Txt[CR]=SPACE_CHR;
                           SetFlag(MD,TABS);
                     }
                     CR++;
                     calc_charlen(HCL);
                     calc_all(HCL);
                     Clear(HCL);
              }
       }
       else
       //
Hebrew ( or Right to Left) mode
       {
              if(!Header->Insert && CR)
              {
                     CR–;
                     HCL->CursLen-=font_width(HCL,CR+1);
                     HCL->Txt[CR]=c[0];
                     HCL->Format[CR]=Header->format;
                     if(c[0]==9)
                     {
                           SetFlag(HCL->Format[CR],TAB);
                           HCL->Txt[CR]=SPACE_CHR;
                           SetFlag(MD,TABS);
                     }
                     calc_all(HCL);
                     Clear(HCL);
              }
              else
              {
                     if(!wrap &&
HCL->Len+font_width(HCL,CR)>HCL->MaxLen) return();
                     char_insert(HCL,c[0],CR);
                     HCL->Len+=font_width(HCL,CR);
                     HCL->CharLen++;
              }
       }
       if(HCL->Mode
& TABS) calc_all(HCL);
       if(c[0]!=SPACE_CHR
&& fonts[Header->format >> 11]->tf_YSize>LH(HCL))
       {
              HCL->LineHeight=Header->LineHeight=fonts[Header->format
>> 11]->tf_YSize;
              HCL->BaseLine=Header->BaseLine=fonts[Header->format
>> 11]->tf_YSize-fonts[Header->format >> 11]->tf_Baseline;
              update=TRUE;
       }
       else
       if(c[0]==SPACE_CHR
&& HCL->prev && !(HCL->Mode & PAR) && wrap)
       {
              WrapLine(HCL->prev,!(update));
       }
       if(HCL->Len<=HCL->MaxLen
&& !(update))
       {
              showtext(HCL);
              SetCursor();
       }
       else
       if(wrap)
              FixLine(HCL,!update);
       if(update)
              update_lh(HCL,TRUE);
}

The next step was to perform word wrap to bi-directional lines. As I have explained, the lines were displayed as they were stored in memory. The text “abcאבג” was stored exactly like it looks. Rashumon used double byte characters, meaning that each character was stored using 2 bytes. That was before UNICODE was invented, so the first byte was sufficient to store any character in any language supported. At that time, ASCII characters were in two forms, one form used the values from 0 to 127 and the expanded form uses values 0 to 255. I used the expanded form, and had to decide where to place the right to left languages. 
There was no standard for right to left languages. IBM used places 128 to 154, but I found it problematic and chose the places starting of 224, which seems to be the right choice today, as it is identical to how right to left languages are represented today using Double Byte encoding.So if I open a floppy disk image from 1989 (.ADF file), all Rashumon Hebrew documents appear in the correct encoding. 
As for the 2nd byte, it was used to store the character color (3 types, meaning up to 8 colors), font attributes (BoldItalics and underline, or any combination between the 3), language (right to left or left to right) and the font, by pointing to an index of this font within a local list created from the entire list of fonts used per each document.
/* Line structure */
#define COLOR_BIT_1 1             /* 1  */
#define COLOR_BIT_2 2             /* 2  */
#define COLOR_BIT_3 4             /* 3  */
#define UNDL 8                    /* 4  */
#define BOLD 16                   /* 5  */
#define ITAL 32                   /* 6  */
#define SELECT 64          /* 7  */
#define LANG 128           /* 8  */
#define TAB 256                   /* 9  */
#define UNUSED_1 1024             /* 10 */
#define UNUSED_2 2048             /* 11 */
#define FONT_BIT_1 4096    /* 12 */
#define FONT_BIT_2 8192           /* 13 */
#define FONT_BIT_3 16384   /* 14 */
#define FONT_BIT_4 32768   /* 15 */
#define FONT_BIT_5 65536   /* 16 */


Key Mapping and Encoding

Key Mapping was used as an array of all characters per the places starting from “1” and to the end of the array.

Here is another part taken from Rashumon source code, where the keymaps are

defined:

/* HEBREW AND ENGLISH MAPS */
unsigned char regmap[] =
       “;1234567890-=\\
0/’-˜€ˆ…”
[] 123(tm)ƒ‚‹‘‰‡ŒŠ”,  456 †’„Ž-š•. .789 “;
unsigned char engmap[] =
       “`1234567890-=\\
0qwertyuiop[] 123asdfghjkl;’  456
zxcvbnm,./ .789 “
;
unsigned char shiftmap[] =
       “~!@#$%^&*()_+|
0QWERTYUIOP{} 123ASDFGHJKL:\”  456
ZXCVBNM<>? .789 “
;
unsigned char shiftrus[] =
       “~!@#$%^&*()_+|
0°¶
±³¸´¨(r)¯{} 123 ²£¥¦§(c)׫:\”  456 ¹·¢µ¡­¬<>? .789 “;
unsigned char rusmap[] =
       “`1234567890-=\\
0
׀ײִׁ׃״װָ־ֿ[] 123ְֳֵֶַֹֺֻׂ;’  456 ׳ֲױֱּֽ,./ .789 “;

As you can see, “regmap” is the Hebrew encoding, “engmap” is for the Latin text, “shiftmap” is for the characters typed with SHIFT button, and there was also a keymap for Russian (and later on, one for Arabic as well, thanks to John Hajjer, from Chicago, who spent a lot of time to help me release an Arabic version).
Switching between the two directions was made using a unique ruller with two versions: left to right and right to left:
Pressing the arrow, changed the direction of editing.

Scrolling Text

Even obvious things such as scrolling had to be invented back then. That includes determining how many lines of text to display, based on the current window size (Amiga windows had the ability to be resized by the end user, as well as maximized and minimized), displaying a scroll bar, and calculating the size of the scroll bar’s gauge which should be proportional to the possible movement and the available scroll.
scroll(ln,lines)
struct Line *ln;
int
lines;
{
       register
SHORT distance,
                     top=TOP,
                     bot=BOT;
#if
DEBUG
       printf(“BEFORE: top=%ld (%ld <> TOP=%ld) “,
                     Header->top->num,
                     Header->top->y,TOP+Header->shift);
       printf(“bottom=%ld (%ld <> BOT=%ld)\n”,
                     Header->bottom->num,
                     Header->bottom->y+LH(Header->bottom),BOT+Header->shift);
#endif
       if(lines>0)
       {
              distance=Header->bottom->next->y+LH(Header->bottom->next)-Header->shift-Header->Height;
              Header->shift+=distance;
              while(Header->top->y<Header->shift)
                     Header->top=Header->top->next;
              Header->bottom=Header->bottom->next;
       }
       else
       {
              distance=-(Header->shift-Header->top->prev->y);
              Header->shift+=distance;
              Header->top=Header->top->prev;
              while(Header->bottom->y+LH(Header->bottom)>Header->Height+Header->shift)
                     Header->bottom=Header->bottom->prev;
       }
       if(distance<100)
              ScrollRaster(rp,0,distance,0,TOP,640,BOT);
       else
              calc_top_bottom(TRUE,0,0);
#if
DEBUG
       printf(“AFTER: top=%ld (%ld <> TOP=%ld) “,
                     Header->top->num,
                     Header->top->y,TOP+Header->shift);
       printf(“bottom=%ld (%ld <> BOT=%ld)\n”,
                     Header->bottom->num,
                     Header->bottom->y+LH(Header->bottom),BOT+Header->shift);
#endif
}

Word Wrapping Bi-Directional Text

But now let’s go back to the bi-directional text word wrap. Basically, the algorithm, developed by me along with Tamer Even –Zohar, and her husband Nimrod, was based on examining a given line and if it is longer than the size between the two margins (calculating the line width in pixels, taking into calculation each character, based on it’s independent attributes), we should remove the last word from it, and then check again the new length, and so on, until the line is within the width of the margins. The first question to ask is where is the “last” word? If it is a right to left paragraph, the last word will appear first, in the buffer.

In such case, I used the following function, which in fact measured the size (in pixels) of the first word in a given buffer. The following routines are based on mono space font, which is complicated enough…

/* returns the len of the first word in s */
#define BLNK(c)      ((c)==‘ ‘ || (c)==‘\n’)
first_wordlen(s,margin,blnks1,blnks2)
char
*s;
int
margin, *blnks1, *blnks2;
{
  register
int i, j;
/*     for
(i=strlen(s)-1; BLNK(s[i]) && i; i–);
       if
((strlen(s)-(i+1))>1)  s[i+2] = ”;
*/
       for
(i=margin; BLNK(s[i]) && s[i]; i++);
       *blnks1 = i;
       for
(; !(BLNK(s[i])) && s[i]; i++);
       for
(j=i; BLNK(s[j]) && s[i]; j++);
       *blnks2 = j-i;
       return(i);
}

If the line is a left to right one, a different function was used:
last_wordlen(s,blnks1,blnks2,maxlen)
char
*s;
int
*blnks1, *blnks2, maxlen;
{
  register
int i, j;
       if
(!strlen(s)) return(0);
       for
(i=strlen(s)-1; BLNK(s[i]) && i; i–);
       if
(i==0) return(0);
       *blnks1 =
(strlen(s)-(i+1));
       for
(i=min(maxlen,strlen(s)-1); BLNK(s[i]) && i; i–);
       for
(; !(BLNK(s[i])) && i; i–);
       for
(j=i; BLNK(s[j]) && j; j–);
       i++;
       *blnks2 = i – j;
       return(strlen(s)
– i);
}

Of course we do not only remove the last word from a line, but also place back the first word of the next line, when there is space available (for example, if the first word in the current line is deleted, and space becomes available), so another building block would be placing the next word (from the beginning of the next line) back to the end of the current line.
/* copies first word of length len & trailing blanks
blnks fron s2 to s1 */
copy_first(s1,s2,len,blnks)
char
*s1,*s2;
int
len,blnks;
{
       append(s2,s1,strlen(s1)+len+(blnks
? 1 : 0));
       delete1(s2,0,len+(blnks ?
1 : 0));
}

In Rashumon, the paragraph direction of text was automatically calculated by examining the encoding of each character in each line, and determining which direction is dominant. While brainstorming with Tamar Even Zohar and her husband Nimrod, we came to know that even space ” ” character can have a direction, and we had to decide if we wish to have Hebrew space character in addition to the Latin one. Well, this requirement became a “must”, as it is needed to word wrap paragraphs with multiple languages combined. For example: 

This is an example of a paragraph with opposed direction languages. זו דוגמה לפסקה עם שילוב של שתי שפות עם כיוונים מנוגדים” 
The following clip demonstrate how bi-directional text is edited by Rashumon.
Now, if you make change the margins, which word will “jump” to the next line, or “jump” back to the current line? The only way to determine that, is by knowing the direction of each character (either right to left or left to right), including special characters such as tabs, spaces, commas, etc. Rashumon can still be downloaded from Aminet at this link.
An Article about Rashumon (UK)

Further reading

My Blog (Hebrew)
My Blog (English)

December 10, 2011 Posted by | Uncategorized | , , , , , , , | Leave a comment

Articles from 1992

במהלך השנים 1992 ועד 1994 כתבתי טור קבוע ב”אנשים ומחשבים“, והנה מספר כתבות.

אפריל 1992

יוני 1992

יולי 1992

ספטמבר 1992

אוקטובר 1992

דצמבר 1992

ינואר 1993

מרץ 1993

מרץ 1993

אפריל 1993

דצמבר 1993

ינואר 1994

December 6, 2011 Posted by | Uncategorized | , , , , , | Leave a comment

The problem with today’s Internet

The Internet is boring. You browse the news. See a new funny kitten at YouTube, or update your status, but unlike, say, taking a journey to Antarctica or even just taking a walk in the neighborhood, the Internet is missing something…

The Internet is great when you are searching for something, but what if you don’t know exactly know what you are searching for?

In a real life scenario, you might sometime just go out, take a walk, wonder around and find yourself at a small bookshop down the street. An Internet scenario would be: you Google “bookshops” and follow a link… so, today’s Internet experience is much like being blindfolded. You start from somewhere and then when you want to move on, you need the assistance (of a search engine or knowing the web site address) to jump (or to be carried) from where you are right now, directly to your next destination. Since you are blindfolded, you miss the experience of actually going from one place to another, and can’t decide half the way, to stop just because you something else you like.

Since you just jump from one site to another, as there aren’t any distances, it is like if traveling from Los Angeles to New Zealand would feel the same as traveling to San Francisco. Your user experience is a direct result of the place you are visiting, which makes sense, but it lacks other factors such as the length of the journey and how easy or exhausting was it getting there.

So, on one hand, the Internet makes it too easy to jump from one place to another, and on the other hand, it is impossible to actually make the route between the two web sites, experiencing an actual journey, with exciting places along the way.

The Missing Link

The missing ingredient

So what is this ingredient that the Internet is missing? Well, you can call it spatial orientation.

When you go to a journey, you pass along your route many places, some of which are more interesting and some of them are less. If you ask what is common to the places you pass, say, two places: one of them is not worth looking at, while the other is so interesting that you decide to spend there several hours or days.

The answer is that they are both there.  So to reflect the term “there” to the Internet, you need to create a space similar to the real world.

No. I am not talking about a new virtual reality game… “Virtual” is something that is not real, but the Internet is real. It doesn’t have to become an alternative “real world”, but should become a new and unique world (or universe).

Some of the attributes in our world are arbitrary but in fact, that’s what makes our word exciting, unpredictable and constantly revolving. Many things you experience happen “by accident”. You meet someone by accident. You discover a beautiful place by accident.

To go back to the bookshop example, when you found this small bookshop along your route, you didn’t have to Google “Books”. It was just there.

There were many attempts to add a “space” dimension as an attribute to the Internet, but in most cases, the space was a direct reflection of geo data taken from the real world. Google Street View allows you to travel as if you were really travelling.

But the Internet deserves its own existence; it deserves its own space. It is great to simulate traveling, flying, driving a car and meeting people in your area, but wouldn’t it be even greater to really travel through the Internet, as a reality, and not as a simulation of another reality?

To make it happen, we need to arbitrarily assign a place in the space to web sites, (which can be based on first comes first served basis), but with the ability to “physically” move from one place to another, similarly as taking a walk.

Traveling through the Internet

Mapping the Internet into a new and unique space, with distances, paths and its own spatial orientation, will unleash the real potential of the Internet. Think of it that way: why are we so dependent on search engines (i.e. Google …)? Why can’t we just travel through the Internet?

Creation of such space must start by assigning it arbitrated attributes, which will later become more meaningful. It will be similar to populating the earth millions years ago, compared to today, where there is a significant difference between living (or visiting) in one place compared to another, or finding a house at the center of a city compared to the suburbs.

Further, there should be more than one way to travel. Not just Googling, but having the endless potential option of just wondering around. As a result, the Internet experience will bring you to visit places you haven’t planned to visit in the first place. This will include, visiting places just because they are located near another place you were looking for in the first place, and the term “located near” will need to be implemented using a new mapping system and not to reflect any existing geographical system imported from the real world.

That will give the Internet what it deserve – its own existence as a cosmos.

Of course, as we would all be thrilled to be able to just jump from LA to New Zealand a split of a second, the old ways to experience the Internet will still be available, and will be used like before, but it is time to add this missing ingredient to the Internet so it becomes a standalone universe.

Additional directions

The universe which is encapsulated within the existence of the Internet has a lot in common with our own universe, which brings ideas such as filling the lack of spatial orientation, but there is also great potential for attributes which can’t be part of our own world, such as, time travel.

Travelling through the Internet can be filtered to a certain time or a time range (for example, the 20th century). If browsing the Internet can become an experience similar to travelling and exploring new worlds, such filer can make this experience a travel through time with a time machine.

New business models

In addition, a verity of means of transportation will be available to Internet traveler that not only will stop the restrictive dependency on search engines, but will also bring the option to choose how to travel. This will create new business models: Fast; Slow; Direct; or having many stops along the route. Speaking about the new business models, today all internet related business models are based on the visitation, and there is a new opportunity here to create new business models based on the actual travel from one web site to another. Based on such models, typically, a web site’s audience would be by default your neighborhood, (radius around you) and as such, can be provided for free, while charges might occur when it comes to a longer journey based on the Internet distance which reflects to the new way the Internet will be mapped.

The Neighborhood

By adding spatial orientation to the Internet, and by gathering web sites and pages into places, similar to neighborhoods, towns, states, countries and continents, a typical “Internet town” will have web sites of different nature residing next to another. Such sites may be a book store, a travel agency (the “commercial area” of our town), several personal blogs (the “residential area” of our town), museums, news agencies, etc. which will all share the same neighborhood. The real people and organizations behind these web sites, even though the web sites will be mapped to the same town, can be from around the world. Unlike ventures which aim to relate activity over the web to geographic locations, for example, in order to tell the end user who is in his or her area (friends, restaurants, etc.), this idea is about allowing the Internet to have its own geographic domain, with places, distances, and the ability to travel and explore them, regardless of where you are in the real world.

So such town will have these sites next to each other as a result of “supply and demand”. At first, the entire universe will be free to settle, and like the old explorers, people will have the opportunity to settle at any place and establish communities next to other people and companies, but the heterogeneity which is the core idea in this article, will bring all kind of ventures, business and people to the same community.

In the real world, one can open a barbershop next to an Internet café or a coffee shop, even though they have nothing in common except for arbitrarily reside next to each other. Residing next to each other without sharing the same content, ISP, audience, country of origin and even language… all of these shouldn’t prevent these web sites to reside in the same Internet neighborhood.

The ability to have web sites “close to” or “next to” another with the ability to provide end users the experience of wondering around and travelling through the Internet with less dependency on search engines is basically what today’s Internet is missing.

November 30, 2011 Posted by | Uncategorized | , , , , , | Leave a comment

Inventing the AmigaHASP

During 1989, while developing Rashumon, I found myself looking for a copy protection solution for Amiga software but there wasn’t any. The Amiga had a very non standard Parallel port, which made it impossible to just adopt a copy protection dongle from other platforms, and there was a need to develop a completely new system.

Hardware based copy protection systems are based on a hardware device which interact with the computer using the port assigned to it. Back then (1989), the USB wasn’t invented yet, and the Parallel port was used. The Parallel port was the port used for printers for many years, and therefore any dongle would need to have “pass through” connector allowing the printer to be connected to it, instead to the port directly.

Hardware based copy protection requires interaction with the device through most of the connector pins, being able to read each pin’s value, and to change each pin’s value from 0 to 1 and vice versa. The Amiga didn’t provide any API to do so, which made me look for undocumented features, and code directly to the hardware instead of using any existing SDK.

With the help of Shimon Groper, the founder of EliaShim, I have made many attempts to create a dongle compatible with the unique and undocumented hardware. I used to go from Tel-Aviv to Haifa, and after several hours, leave with a box, covered with many wires in all colors, which was supposed to be the prototype… Eventually I found the way to implement the first Amiga based copy protection dongle and instead of buying bulk dongles from Aladdin, I have accepted the kind offer of Yankee Margalit, their founder and CEO, to by the Amiga product from my small software house (HarmonySoft), and after a short period of negotiation, Aladdin paid me $12,000 and my product became the AmigaHASP.

An Italian magazine published an article about the AmigaHASP:

As part of the deal, I have trained the technical people from Aladdin about programming the Amiga, and even gave them Amiga books and magazines. We have announced the new product, and if Commodore wouldn’t have gone out of business, short after, the AmigaHASP would have probably been useful for many Amiga based software houses. I can tell from my own experience, that it was used for Rashumon, the multi lingual graphic word processor I have developed.

See also:

http://myoldmac.wordpress.com/1993/09/21/%D7%90%D7%9C%D7%90%D7%93%D7%99%D7%9F-%D7%9E%D7%9B%D7%99%D7%A8%D7%AA-%D7%94%D7%96%D7%9B%D7%95%D7%99%D7%95%D7%AA-%D7%A2%D7%9C-%D7%94amigahasp/

http://myoldmac.wordpress.com/1994/03/25/letter-to-a-dealer-regarding-amiga-600-and-amigahasp-which-i-sold-to-aladdin/

http://www.articlesbase.com/software-articles/rashumon-word-processor-4976638.html

November 17, 2011 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , | Leave a comment

11/11/11 11:11

I wanted to write or do something on the 11/11/11 at 11:11 but had a meeting, so I created a small application and signed it at 16:16 instead…

I am using VeriSign Code Signing certificate and the date / time are taken from http://timestamp.verisign.com/scripts/timstamp.dll, which showed 16:19…

I recently have been using Visual Basic 6.0 for such 3 minutes applications, as I think VB6 is the Swiss Army Knife for such tasks. MSDN subscribers can any Microsoft product, including discontinued ones (say, Windows 3.11) , can be downloaded from their web site.

November 11, 2011 Posted by | Uncategorized | , , , , , , , | Leave a comment

Rashumon user manual (Hebrew)

Rashumon User Manual Chapter 1 (PDF version)

February 21, 2011 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Article about networks


http://rashumon.com/

November 25, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

BrainTrain

A software to train your memory. Written in Visual C++ on 2000

November 21, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

An article I wrote – Computers and Music

On 1986 I published my first professional article about using computers to compose music.
It was published in People and Computers, “32 Bit” magazine.

Amiga and Music

Amiga and Music - by Michael Haephrati


Amiga and Music

Amiga and Music - part 2

November 13, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

DataTune by Michael Haephrati

DataTune was developed as part of a venture named Target Data. I have developed a data cleansing software named DataTune and performed data cleansing projects to many organizations, among them:


* Standards Institution of Israel http://www.sii.org.il/14-he/SII.aspx
* The Israeli Export Institution http://www.export.gov.il/
* Elite http://www.strauss-group.com/elitehebrew
* Del Engineering http://del.co.il/
* Microsoft Israel http://www.microsoft.co.il
* People and Computers http://www.pc.co.il

DataTune

November 11, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

AmigaHASP

AmigaHASP was developed as an independant product to protect Rashumon, my word processor. Eventually sold the entire product to Aladdin.

November 11, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Amigos Dec-1993

Amigos Dec-1993

Amigos Dec-1993, People and Computers Magazine

November 10, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Who’s Who 1992 – Haephrati

A page from the book, Who’s Who in Israeli Business, 1992

Who's who in Israeli Business - 1992

Haephrati at Who's who in Israeli Business - 1992

November 9, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Ministry of Education cerificate

Certificate TN/0013 for Rashumon, after being tested by Dr. Amnon Til, for the Israeli Ministry of Education.
Certificate from Ministry of Education for Rashumon

November 9, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Rashumon – a new word processor

An article published at Amiga World on May 1994.

developed by Michael Haephrati

Rashumon - by Michael Haephrati

http://rashumon.com/

November 9, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Rashumon – Word Processor – Yedioth 1991

A new word processor for Amiga computers, by Commodore, has launched.
The word processor, Rashumon, was developed by HarmonySoft, and it has the ability to read out loud the text (currently only in English).
It is a multi-lingual word processor which enables typing and editing in various languages, using miltiple fonts and colors. The typed documents are printed exactly as shown on screen, like with Macintosh computers. 8 colors can be used simultaneously, chosen from 4096 available colors. Text can be highlighted in Bold, Italics and underline.

Rashumon, word processor by Michael Haephrati

Rashumon - Article at Yedioth 1991

November 9, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Rashumon ad

Rashumon Ad (1989)

פרסומת לתוכנת רשומון

February 28, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Rashumon video

February 16, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Rashumon – UK article

February 16, 2010 Posted by | Uncategorized | , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment