<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
	<title>הבלוג של ארתיום :: תכנה חופשית</title>
	<link>http://art-blog.no-ip.info/newpress/blog</link>
	<description>בלוג על לינוקס, תוכנה חופשית, מוזיקה, סלסה, ומה לא!</description>
	<atom:link 
		href="http://art-blog.no-ip.info/newpress/blog/rss" 
		rel="self" type="application/rss+xml" />
	
		
		<item>
			<title>ל־CppCMS יש קהילה פעילה</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/241</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/241</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;בחודש חודשיים אחרונים אני רואה פעילות ערה מסביב ל־CppCMS. רשימת התפוצה הפכה להיות פעילה, דיווחי באגים מגיעים ואפילו&amp;hellip;&lt;/p&gt;

&lt;p&gt;לפני ימים אחדים קיבלתי מספר דיווחי באגים ותרגום של הבלוג הזה ל&lt;strong&gt;סינית&lt;/strong&gt;, כך שאם מישהו רוצה בלוג שמיליארד סינים יוכלו לקרוא אותו בלי ליצור עומסים, זאת לא בעיה ;-).&lt;/p&gt;

&lt;p&gt;האמת היא, אני שמח ש־CppCMS לאט־לאט צובר תאוצה והקהילה נבנית מסביבו.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/241"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>למה להמציא גלגל מחדש זה לא תמיד עובד טוב</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/240</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/240</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;לאחרונה אני מנסה להגר ל־CMake מ־autotools בפרויקט CppCMS בעיקר כדי להבטיח תמיכה טובה יותר בסביבת Windows ובפרט ב־MSVC מתישהו בעתיד.&lt;/p&gt;

&lt;p&gt;עשיתי כבר הרבה עובדה והענף הניסיוני עבר ל־CMake. אפילו לא מעט אנשים ברשימת התפוצה התלהבו מהעובדה שהמערכת תעבוד על CMake&amp;hellip; רבים חוץ ממני. אחרי שהתחלתי לעבוד אתה בצורה יותר עניינית הבנתי: היא באמת יותר מוצלחת בפיתוח ל־Windows מאשר autotools בעיקר בגלל שהיא קצת יותר גמישה בנושא ה־exports וכמובן התמיכה ב־MSVC.&lt;/p&gt;

&lt;p&gt;אבל פה בערך נגמר היתרון. עכשיו אני אתלונן על דברים שמעצבנים אותי:&lt;/p&gt;

&lt;p&gt;המהירות שאנשי CMake מתלהבים ממנה זאת גם עקב אכילס שלה. יש לזה מספר נקודות:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;ב־autotools הייתה הפרדה ברורה בין automake שמגדיר את מבנה הפרויקט לבין autoconf שמגדיר את קונפיגורציית הפלטפורמה. מצד אחד זה היה קצת מפריע אבל מצד שני זה היה מאוד נוח: הוספת קובץ חדש לא פרויקט לא דרשה הרצת configure מחדש מצד אחד, מצד שני כל שינוי בצורת הקונפיגורציה ביצע הרצת configure שלמה.&lt;/p&gt;

&lt;p&gt;לעומת זאת, CMake אף פעם לא מנקה את ה־Cache שלו (אלא אם אתה עושה את זה במפורש). מה שגורם לכך ששינויים בקונפיגורציה לא תמיד יבואו לידי ביטוי כי ב־cache שלו הוא זוכר משהו אחר (אולי בדיקה אחרת לא תקינה).&lt;/p&gt;

&lt;p&gt;מצד שני, אם אני מוחק CMakeCache ומעדכן את CMakeLists.txt הוא לא זוכר את הפרטרים המקורים שהרצתי אתו את cmake כמו &quot;איפה נמצאות הספריות או איזו אופציה שאני העברתי&quot;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;מנגנון מעקב אחרי התלויות של CMake לא בודק את הקובץ config.h משמע&amp;hellip; אם עשיתי שינויים בקונפיגורציה הקוד לא ייבנה מחדש. צריך להריץ make clean ו־make שוב! העיקר שיש להם cache חזק.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;הרבה מגנונים הקיימים לוקים בחסר או לא מתוכננים היבט. לדוגמה:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;משהו מאוד פופולרי כמו &lt;code&gt;AC_SEARCH_LIBS&lt;/code&gt; שמאפשר לך לבדוק אם פוקנציה מסוימת קיימת, אם כו אז אל תעשה דבר, חפש אותה בספריות. דוגמה קלאסית. pthreads, iconv, dlopen, socket שלפעמים מהווים חלק מהספרייה הסטנדרטית ולפעמים דורשים ספריות חיצוניות. אין פונקציונליות כזו בכלל.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;בדיקת sizeof היא בכלל פנינת CMake. יש לה מספר בעיות:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;היא נעשית ע&quot;י הרצת קוד מה שאומר היא לא תעבוד בקרוס־קומפילציה. כאשר ב־autotools עושים טריק מאוד יפה המאפשר לבצע בדיקה כזו ללא הרצת קוד אלא קומפילציה בלבד.&lt;/li&gt;
&lt;li&gt;היא לא מאפשרת להוסיף header כך שלא ניתן לבדוק sizeof של טיפוסים הנמצאים ב־includes לא סטנדרטיים.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;אין פונקציונליות דומה ל־&lt;code&gt;AC_ARG_ENABLE&lt;/code&gt; המאפשרת להציג רשימת הפרמטרים לקונפיגורציה והערות לגביהם &amp;ndash; קרי אין כלי כמו ‎./configure &amp;ndash;help שמאוד עוזר בהרבה מקרים.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;ועוד, ועוד, ועוד&amp;hellip; הבעיה היא שהם ממציאים גלגל מחדש; וכשעושים את זה, לא עושים את בצורה הטובה ביותר, מפספסים הרבה נקודות שרבים כבר חשבו עליהם קודם.&lt;/p&gt;

&lt;p&gt;אני מקווה שיום אחד autotools ידעו לתמוך גם ב־MSVC בסה&quot;כ זה לא אמור להיות מי יודע מה מסובך&amp;hellip; ICU משתמשים ב־autotools יחד עם MSVC בצורה מוצלחת למידי (למעשה הבעיה היא אפילו לא automake ו־autoconf הם דווקא איכשהו עובדים עם הקומפיילר, (הוא מסתבר כן תומך בהרבה דגלונים הרגילים כמו &quot;‎-o -I&quot; ועוד) הבעיה היא בעיקר libtool.&lt;/p&gt;

&lt;p&gt;במילים אחרות&amp;hellip; אם אתם לא מתכוונים לתמוך ב־MSVC תתרחקו מ־CMake, אבל ממש תתרחקו ממנו.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/240"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>תכירו Boost.Locale</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/239</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/239</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;אחרי תהיות עמוקות על תמיכה בלוקליזציה ב־C++‎, הבנתי שלא ניתן יהיה ללכת איתה רחוק. לקחתי ICU והתחלתי לעטוף אותו בסביבה ידידותית לתכנות C++‎ מודרני.&lt;/p&gt;

&lt;p&gt;אחרי הרבה עבודה הבנתי&amp;hellip; כל מה שאני עושה יהיה שימושי הרבה מעבר ל־CppCMS ולכן החלטתי להכין ספריה נפרדת שמטפלת בלוקליזציה במטרה לשלב אותה ב־Boost. כך נולד Boost.Locale שנותנת כלים פשוטים וחזקים לעבודה עם לוקליזציה.&lt;/p&gt;

&lt;p&gt;דוגמה פשוטה שתבהיר את החשיבותה ועוצמתה. הנה קטע קוד שמציג למשל את תאריך המאמר באתר:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;out &amp;lt;&amp;lt; format(translate(&quot;{1}, posted  at {2,date} on {2,time} by {3}&quot;))
          % title % date % author;
&lt;/pre&gt;

&lt;p&gt;ועכשיו המתרגם יכול לתרגם את המשפט לצורה הבאה:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&quot;{1}, פורסם ב{2,locale=he_IL@calendar=hebrew,date} ‏(לועזי {2,date}) ב־{2,time} ע&quot;י {3}&quot;&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;מה קרה כאן? התצוגה באנגלית תהיה&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;‎Some article was published at 11/8/2009 on 10:30 PM by somebody&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;כאשר התצוגה בעברית תהיה&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;מאמר מסוים פורסם בכ&quot;א בחשון התש&quot;ע (לועזי 08/11/2009) ב־22:30 ע&quot;י מישהו&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;למעשה, בלי שימוש ב־libhdate, בלי לעבוד קשה מידי, קיבלתי אפשרות להציג את התאריך העברי והלועזי לפי הלוקל העברי, רק בגלל ש־ICU תומך בלוח־השנה העברי.&lt;/p&gt;

&lt;p&gt;למעשה, עבזרת Boost.Locale ניתן לעשות המון דברים בצורה פשוטה. למשל:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;cout &amp;lt;&amp;lt; as::spellout &amp;lt;&amp;lt; 123 &amp;lt;&amp;lt;endl;
&lt;/pre&gt;

&lt;p&gt;יידפיס בלוקל עברי&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;מאה עשרים ושלוש&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;יאפשר לחלק מילה &quot;שָלוֹם&quot; לארבעה תווים בהתחשב בניקוד: &quot;שָ&quot;, &quot;ל&quot;, &quot;וֹ&quot; ו־&quot;ם&quot; ועוד. למיין טקסט בצורה נכונה ועוד עשרות פעולות חשובות שניתנות ע&quot;י ICU רק בצורה נוחה וטבעית ל־C++‎.&lt;/p&gt;

&lt;p&gt;תכירו Boost.Locale:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;תיעוד &lt;a href=&quot;http://cppcms.sourceforge.net/boost_locale/docs/&quot;&gt;http://cppcms.sourceforge.net/boost_locale/docs/&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;תיעוד מפורט של פונקציות ומחלקות: &lt;a href=&quot;http://cppcms.sourceforge.net/boost_locale/docs/doxy/html/&quot;&gt;http://cppcms.sourceforge.net/boost_locale/docs/doxy/html/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;קוד מקור (דרך svn)‏ &lt;a href=&quot;https://cppcms.svn.sourceforge.net/svnroot/cppcms/boost_locale/trunk&quot;&gt;https://cppcms.svn.sourceforge.net/svnroot/cppcms/boost_locale/trunk&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;תהנו, אשמח גם לתגובות.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/239"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>על תמיכה בלוקליזציה ב־C++‎ ועל תקן שבור</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/238</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/238</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;ככל שעובד הזמן אנחנו מתקרבים יותר ויותר לתקן C++‎ החדש שבהחלט מעשיר את השפה בהרבה כלים חיוניים &amp;ndash; הן מבחינת ליבת השפה והן לבחינת הספריה הסטנדרטית.&lt;/p&gt;

&lt;p&gt;אבל נשאר מקום אחד שבו C++0x כמעט ולא נגע, אפילו שהתקן שבור לחלוטין &amp;ndash; לוקליזציה&amp;hellip;&lt;/p&gt;

&lt;p&gt;לצורך הדגמה בואו נכתוב תכנה טרוייואלית שמדפיסה מספר לקובץ טקסט number.txt:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;fstream&amp;gt;
#include &amp;lt;locale&amp;gt;


int main()
{
        // Set global locale to system default;
        std::locale::global(std::locale(&quot;&quot;));

        // open file &quot;number.txt&quot;
        std::ofstream number(&quot;number.txt&quot;);

        // write a number to file and close it
        number&amp;lt;&amp;lt;13456&amp;lt;&amp;lt;std::endl;
}
&lt;/pre&gt;

&lt;p&gt;תכנה פשוטה אפילו טריוויאלית. עכשיו בואו נעשה אותו דבר ב־C.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;locale.h&amp;gt;

int main()
{
        setlocale(LC_ALL,&quot;&quot;);
        FILE *f=fopen(&quot;number.txt&quot;,&quot;w&quot;);
        fprintf(f,&quot;%'i\n&quot;,13456);
        fclose(f);
        return 0;
}
&lt;/pre&gt;

&lt;p&gt;גם פשוט ביותר.&lt;/p&gt;

&lt;p&gt;בואו נריץ את התכנות כאשר הלוקל הוא &lt;code&gt;en_US.UTF-8&lt;/code&gt;&amp;hellip; ונקבל בקובץ number.txt את המספר: 13,456, עכשיו נעשה אותו דבר, רק נגדיר לוקל נפוץ אחר &lt;code&gt;ru_RU.UTF-8‏&lt;/code&gt;: כך &lt;code&gt;LC_ALL=ru_RU.UTF-8 ./a.out&lt;/code&gt; ונקבל:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt; ‎13&amp;lt;?&amp;gt;456
&lt;/pre&gt;

&lt;p&gt;כאשר אם נריץ תכנה ב־C נקבל דווקא משהו נכון: ‎13 456&lt;/p&gt;

&lt;p&gt;אופס&amp;hellip; מה קרה כאן? כשאני עושה את אותו הדבר דרך C ודרך C++‎ אני מקבל תוצאה שונה, יותר מזה, הפלט של תכנה שכתובה ב־C++‎ מצביעה על טקסט UTF-8 לא תקין! (אפשר לבדוק בקלות עם iconv).&lt;/p&gt;

&lt;p&gt;מה בעצם קראה כאן?&lt;/p&gt;

&lt;p&gt;לפי הגדרות הלוקל הרוסי. התו שמפריד בין אלפים ומאות הוא תו U2002 &amp;ndash; ‏ EN SPACE &amp;ndash; סוג של רווח שונה מרווח ASCII רגיל U0020. כלומר בגלל שמדובר בתו Unicode שהוא לא בתחום ASCII הוא צריך להיות מקודד כמחרוזת ארוכה מבית 1.&lt;/p&gt;

&lt;p&gt;אז למה ספריית C מתמודדת יפה מאוד עם בעיה זו וספריית C++‎ לא?&lt;/p&gt;

&lt;p&gt;עכשיו בואו נסתכל בהגדרות הסביבה להצגת מספרים: המחלקה &lt;a href=&quot;http://www.cplusplus.com/reference/std/locale/numpunct/&quot;&gt;‏std::numpunct&lt;char&gt;‎&lt;/a&gt; מייצגת את סימון ההפרדה &lt;a href=&quot;http://www.cplusplus.com/reference/std/locale/numpunct/thousands_sep/&quot;&gt;thousands_sep‏&lt;/a&gt; כבית בודד! לכן אין שום סיכוי לייצג תו Unicode U2002, לעומת זאת, ספריית C, &lt;a href=&quot;http://linux.die.net/man/7/locale&quot;&gt;מייצגת&lt;/a&gt; את סימון ההפרדה כמחרוזת ולא כתו בודד. מכאן, אין שום בעיה לייצר מספרים.&lt;/p&gt;

&lt;p&gt;זאת הייתה דוגמה של בעיוה הטריוויאלית לשחזור. קיימים עוד בעיות עקרוניות רבות כאלה בתקן לוקליזציה הקיים ב־C++‎ היום. חבל שהוועדה שמטפלת ב־C++0x כלל לא התייחסת לנושא זה &amp;mdash; אולי הגיע זמן להעלות את הנושא?&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/238"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>ייסורי בינאום ולוקליזציה בשנת 2009</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/237</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/237</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;מה יותר פשוט מאשר להציג תאריך ושעה בהתאם למקובל באיזור? בארה&quot;ב תכתוב ‎6/15/2008 8:30 PM ובישראל תכתוב 15/6/2008 20:30. לא מסובך, נכון? כמובן ‎&lt;a href=&quot;http://www.cplusplus.com/reference/clibrary/ctime/strftime/&quot;&gt;strftime&lt;/a&gt;‎ עושה את העבודה הנאמנה בצורה טובה. אכן, יש אופציות ‎&quot;%x&quot;‎ ו־‎&quot;%X&quot;‎ להצגת תאריך ושעה בהתאם ללוקל מקומי.&lt;/p&gt;

&lt;p&gt;עכשיו בואו נעשה את הדרך ההפוכה: יש לנו טופס HTML בו אנחנו רוצים להציג תאריך ולתת למשתמש אפשרות לערוך אותו? במילים אחרות אני רוצה אופציה של פענוח תאריך ושעה לפי התבנית המקובלת לאיזור ובשפה הספציפיים&amp;hellip; ואכן, יש פונקציה הפוכה ל־strftime ‏&amp;mdash; strptime. שעושה את העבודה ההפוכה.&lt;/p&gt;

&lt;p&gt;כמובן גם ב־C++‎ יש מקבילות &lt;code&gt;std::facet&lt;/code&gt; מסוג: &lt;code&gt;std::time_put&lt;/code&gt; ו־&lt;code&gt;std::time_get&lt;/code&gt; עושות את העבודה וגם מאפשרות להשתמש ביותר מ־locale אחד בתהליך, שמאפשר, למשל לייצר טקסט שונה למשתמשים שונים בחוטים שונים. ב־C ובשירותי מערכת ההפעלה הסטנדרטיים אין כלי כזה, יש רק &lt;code&gt;strftime_l&lt;/code&gt; ו־&lt;code&gt;strptime_l&lt;/code&gt; הלא מתועדים ולא מוגדרים לפי סטנדרט שעושים את העבודה.&lt;/p&gt;

&lt;p&gt;מכאן, הכל פשוט&amp;hellip; על הנייר. במציאות המצב הרבה יותר מסובך:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;הגדרות סטנדרט C++‎ של &lt;code&gt;std::time_get&lt;/code&gt; מכילות באג לוגי שמקשה מאוד על יצירת כלים לפענוח תאריך ושעה בצורה נכונה וגם כשעובדים, הם עושים זאת בצורה חלקית &amp;mdash; כי אין מקבילה של strptime המלאה של C.&lt;/li&gt;
&lt;li&gt;גם API של C, מסתבר כלא תמיד עובד כמו שצריך.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;לצורך ההשוואה, בניתי תכנה פשוטה, שמייצרת מחרוזת עם תאריך ושעה בעזרת כלֵי C,‏ C++‎ וספריית ICU. ולאחר מכן מפענחת אותה אם אותם הכלים. בדקתי את זה עבור מספר לוקלים. בטבלה למטה מוצגים: לוקל, שעה ותאריך כפי שמייוצרים ע&quot;י כלים שונים והפענוח של אותם תאריך ושעה המוצגים בפורמט בינלאומי.&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;    en_US.UTF-8
    strftime        10/05/2009 11:36:38 PM to 2009-10-05 23:36:38
    std::facet      10/05/2009 11:36:38 PM to 2009-10-05 00:00:00
    icu::DateFormat Oct 5, 2009 11:36:38 PM to 2009-10-05 23:36:38
    he_IL.UTF-8
    strftime        05/10/09 23:36:38 to 2009-10-05 23:36:38
    std::facet      05/10/09 23:36:38 to 1909-10-05 23:36:38
    icu::DateFormat 23:36:38 05/10/2009 to 2009-10-05 23:36:38
    de_DE.UTF-8
    strftime        05.10.2009 23:36:38 to 2009-10-05 23:36:38
    std::facet      05.10.2009 23:36:38 to 2009-10-05 23:36:38
    icu::DateFormat 05.10.2009 23:36:38 to 2009-10-05 23:36:38
    en_GB.UTF-8
    strftime        05/10/09 23:36:38 to 2009-10-05 23:36:38
    std::facet      05/10/09 23:36:38 to 1909-10-05 23:36:38
    icu::DateFormat 5 Oct 2009 23:36:38 to 2009-10-05 23:36:38
    ja_JP.UTF-8
    strftime        2009年10月05日 23時36分38秒 to 2009-10-05 23:36:38
    std::facet      2009年10月05日 23時36分38秒 to 2009-10-05 23:36:38
    icu::DateFormat 2009/10/05 23:36:38 to 2009-10-05 23:36:38
    ar_EG.UTF-8
    strftime        05 أكت, 2009 IST 11:36:38  to 2009-10-05 00:00:00
    std::facet      05 أكت, 2009 IST 11:36:38  to 2009-10-05 11:36:38
    icu::DateFormat ٠٥/١٠/٢٠٠٩ ١١:٣٦:٣٨ م to 2009-10-05 23:36:38
    tr_TR.UTF-8
    strftime        05-10-2009 23:36:38 to 2009-10-05 23:36:38
    std::facet      05-10-2009 23:36:38 to 2009-10-05 23:36:38
    icu::DateFormat 05.Eki.2009 23:36:38 to 2009-10-05 23:36:38
    ru_RU.UTF-8
    strftime        05.10.2009 23:36:38 to 2009-10-05 23:36:38
    std::facet      05.10.2009 23:36:38 to 2009-10-05 23:36:38
    icu::DateFormat 05.10.2009 23:36:38 to 2009-10-05 23:36:38
    zh_CN.UTF-8
    strftime        2009年10月05日 23时36分38秒 to 2009-10-05 23:36:38
    std::facet      2009年10月05日 23时36分38秒 to 2009-10-05 23:36:38
    icu::DateFormat 2009-10-5 下午11:36:38 to 2009-10-05 23:36:38
&lt;/pre&gt;

&lt;p&gt;כפי שניתן לראות:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;std::facet לא מתמודד עם שעון של 12 שעות המכיל ציון AM/PM.‏&lt;/li&gt;
&lt;li&gt;std::facet לא מוסוגל לשחזר שנה בעזרת שתי ספרות בלבד וזורק אותנו משנת 2009 ל־1909 ב־2 מתוך 9 דוגמאות.&lt;/li&gt;
&lt;li&gt;strptime לא מצליח לשחזר שעה בכלל ו־std::facet וטועה ב־12 שעות בלוקל מצרי.יש לציין שזה באג בייצוג locale כי הפורמט המוגדר הוא ‎&quot;%Z %I:%M:%S&quot;‎ במקום ‎&quot;%p %I:%M:%S&quot;‎ &amp;mdash; להציג איזור זמן במקום סימון AM/PM המתאים (م).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;במילים אחרות&amp;hellip; מימוש של std::facet גרוע, יש בעיות בייצוג locale באופן כללי.&lt;/p&gt;

&lt;p&gt;עצוב שזה המצב בשנת 2009&amp;hellip;&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/237"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>נפלאות ה־Comet בשרתי האינטרנט המודרניים...</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/236</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/236</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;כפי שפרסמתי לאחרונה, אני עובד על תמיכה ב־Comet או HTTP Push ב־CppCMS. כאשר הכוונה לאפשרות שרת האינטרנט ליידע את הלקוח על אירוע חדש, למשל: &quot;הגיעה מסר מידי חדש, או מחיר המניה השתנה&quot; &amp;ndash; למעשה להעביר אירועים ללקוח בזמן אמת.&lt;/p&gt;

&lt;p&gt;כיצד התהליך מתבצע? הלקוח פונה לשרת עם בקשת HTTP לקבל עדכונים; והשרת, במקום לענות באופן מידי ממתין ומחזיק את הקשר פתוח. כאשר מגיע האירוע החדש, כמו עדכון מחיר המניה או הודעה חדש מחבר, התשובה נשלחת והתליך חוזר.&lt;/p&gt;

&lt;p&gt;לא מי יודע מה מסובך כמובן זה גם תלוי ביכולת השרת להחזיק קשר HTTP פתוח למשך הרבה זמן.&lt;/p&gt;

&lt;p&gt;אבל, מה קורה אם הלקוח סוגר את הקשר לפני שהוא מקבל תשובה? בבקשות HTTP רגילות זה אירוע נדיר והיישום בצד השרת יכול בקלות &quot;להתעלם&quot; ממצב כזה. ביישומי Comet זה שונה: מספיק שמישהו נכנס לאתר שמחכה לדף שמבצע בקשה מסוג זה ויוצא ממנו, הקשר לקבלת עדכונים ייסגר.&lt;/p&gt;

&lt;p&gt;אבל מה יישום Comet אמור לעשות? תחשבו שמספר הבקשות HTTP שנסגרות לפני דיווח על אירוע מסוים יכול להיות הרבה יותר גדול ממספר התגובות הרלוונטיות בפועל. אז יישום תקין צריך לזהות ניתוקים כאלה, ולמחוק אותם מ&quot;רשימת התפוצה שלו&quot;.&lt;/p&gt;

&lt;p&gt;אבל מה? יישום ה־Comet בד&quot;כ לא מדבר ישירות עם הלקוח בעזרת HTTP אלא מדבר עם שרת web בעזרת פרוטוקול סטנדרטי כמו FastCGI או SCGI. לכן, תפקידו של השרת הוא לדווח ליישום על כך שהלקוח סגר את הקשר. למעשה פרוטוקול FastCGI מגדיר במפורש דרך להפסיק בקשה מסויימת ע&quot;י סגירת ה־socket או שליחת בקשה מיוחדת &quot;Abord Request&quot;, כנ&quot;ל ניתן לבצע בעזרת scgi ע&quot;י ניתוק ה־socket.&lt;/p&gt;

&lt;p&gt;פשוט? כן. האם זה קורה בפועל? לא ממש.&lt;/p&gt;

&lt;p&gt;אחרי שמימשתי מערכת ניתוק הקשר ובדקתי אותה על שרת http פנימי, החלטתי לבדוק את ההתנהגות של שרתי web אמתיים: Lighttpd,‏ Nginx ו־Apache2. מה שגיליתי היה ממש לא נעים: למעט Nginx אף שרת לא מדווח על ניתוק הקשר לא מעל FastCGI ולא מעל SCGI.&lt;/p&gt;

&lt;p&gt;לצורך דוגמה פשוטה, אני יצרתי חיבור ומיד סגרתי אותו, כך עשיתי עשר פעם.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nginx הוא היחיד דיווח על כך ליישום FastCGI באופן מידי ואפשר לי לטפל בלקוח ש&quot;נעלם&quot;&lt;/li&gt;
&lt;li&gt;Apache דיווח רק אחרי timeout ארוך של כדקה הן ב־FastCGI והן ב־SCGI.‏&lt;/li&gt;
&lt;li&gt;lighttpd בכלל שכח מזה והחזיק קשרים פתוחים כל הזמן &amp;ndash; יותר מזה בירידה, הוא התלונן על כך שהיישום שלי &quot;נעלם&quot; ולא ענה לבקשת השרת (שאין לו כבר למי להעביר אותה).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;בקיצור&amp;hellip; זה היה מאוד מאכזב. אני הייתי מוכן לקבל את זה מ־Apache שידוע כשרת שלא נועד לטפל בהרבה קשרים פתוחים, אבל Lighty? &lt;a href=&quot;http://redmine.lighttpd.net/issues/2058&quot;&gt;פתחתי על זה באג&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;מזל שמימשתי שרת HTTP פנימי בעצמי.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/236"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>CppCMS פוגש Comet</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/234</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/234</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;פרסמתי &lt;a href=&quot;http://art-blog.no-ip.info/cppcms/blog/post/47&quot;&gt;כאן&lt;/a&gt; כתבה על טכנולוגיית &lt;a href=&quot;http://en.wikipedia.org/wiki/Comet_(programming)&quot;&gt;Comet&lt;/a&gt; (או Server Push) הנתמכת בגרסה הבאה של CppCMS.&lt;/p&gt;

&lt;p&gt;הצגתי כדוגמה קלאסית: מימוש של יישום Chat, בצד הלקוח ובצד השרת, בכ־50 שורות קוד בכל אחד מהם, עם שימוש ב־XHR Long Polling.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/234"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>חדשות CppCMS...</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/233</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/233</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;לאחרונה אני עובד בענף ה־refactoring של CppCMS ומבצע שינויים גדולים. אביא כאן סקירה קצרה של השינוי שכבר נמצאות בגרסה ניסיונית:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;אחד השינויים הגדולים והחשובים זה להיפתר מכל התלויות המיותרות או מגבילות.
אחרי שכל השינויים יסתיימו, התלויות היחידות שיישארו הן גרסה עדכנית של Boost
ו־Python לצורכי הפיתוח בלבד.&lt;/p&gt;

&lt;p&gt;חלק מהספריות הוסרו בגלל אי תאימות לדרישות החדשות:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;libfcgi ירד כי ה־API שלו לא מאפשר גישה א־סינכרונית, במקומו, מימשתי את
הפרוטוקול בעצמי על בסיס Boost.Asio.&lt;/li&gt;
&lt;li&gt;ספריית CgiCC ירדה בגלל האיכות הירודה שלה וחוסר יכולת סבירה לתקשר עם המפתח
של אותה הספרייה הבעייתית.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;כך שבגרסה הבאה, תהיה לי אפשרות להכין debים ו־rpmים בקלות&amp;hellip;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;עד היום, פיתוח מול CppCMS דרש שימוש בשרת חיצוני, למרות שיש לי סקריפט
הפעלה אוטומטית של lighttpd, ‏nginx ו־Apache, עכשיו מימשתי שרתי HTTP פנימי פשוט
שמקל על הפיתוח ובנוסף, עתיד יקל על שיבוץ התשתית ביישומים שדורשים ממשק
web ובמערכות משובצות מחשב.&lt;/p&gt;

&lt;p&gt;כך שכיום, CppCMS החדש תומך בשלושה ממשקים FastCGI,‏ SCGI ו־HTTP.‏&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;התווספה תמיכה מסודרת בלוקליזציה עם שימוש ב־std::locale, כך שתצוגת התאריכים,
מספרים, מחרוזות וכד' יתבצעו בהתאם למקובל באותה שפה.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;בגלל שימוש מקיף ב־Boost &amp;ndash; ספריה בלתי תלויה בפלטפורמה, אני סוף־סוף אוכל
להכריז על Windows כפלטפורמה שנתמכת באופן (חצי) רשמי.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;יש עוד הרבה עבודת אינטגרציה של רכיבים שיצאו באופן זמני, כמו ניהול sessions, שינויים ב־cache, שכתוב תמיכה בטפסים ועוד.&lt;/p&gt;

&lt;p&gt;אבל לאט־לאט ההשפעה של השינויים הארכיטקטוניים מתחילים להתבהר.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/233"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>לתמוך או לא לתמוך, זאת השאלה (ב־Win32)?</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/229</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/229</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;כפי שפרסמתי ב&lt;a href=&quot;http://art-blog.no-ip.info/cppcms/blog/post/44&quot;&gt;עבר&lt;/a&gt;, אני עובד על שינויים בפנימיים עמוקים ב־CppCMS שבין השאר יאפשרו:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;תמיכה באירועי צד השרת או Comet.&lt;/li&gt;
&lt;li&gt;תמיכה בבינאום ולורקליזציה.&lt;/li&gt;
&lt;li&gt;תמיכה ב־ABI לאחור.&lt;/li&gt;
&lt;li&gt;ניקיון יסודי של קוד תוך הקטנה משמעותית בשימוש בספריות צד ג'.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;בגלל שאני עושה שינויים כל־כך מהותיים, חשבתי, אולי להוסיף גם תמיכה בעוד פלטפורמה בנוסף לתמיכה ב־Linux,‏ FreeBSD,‏ Solaris ו־Cygwin&amp;hellip; להוסיף תמיכה ב־Windows.&lt;/p&gt;

&lt;p&gt;זה באמת, לא אמור להיות עד כדי כך מסובך, יצא לי כבר פעם לבנות CppCMS עבור Mingw (כמובן נאלצתי לוותר על חלק גדול מהמודולים).&lt;/p&gt;

&lt;p&gt;אבל, בין לבנות משהו שרץ עד לפלטפורמת פיתוח אמתית יש תהום.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/229"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>כתובת הייתה על הקיר - לקראת ההצבעה בכנסת על חוק המאגר הביומטרי </title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/228</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/228</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;לא, שלא תבינו אותי לא נכון, אני ממש לא בעד &lt;a href=&quot;http://no2bio.org/home/&quot;&gt;הקמת המאגר הביומטרי&lt;/a&gt; שיש לו המון השלכות שליליות. אני עדיין מקווה שהחוק כפישהו לא יעבור&amp;hellip;&lt;/p&gt;

&lt;p&gt;כל מה רציתי לומר: &quot;&lt;em&gt;הכתובת מזמן הייתה על הקיר&lt;/em&gt;&quot;&lt;/p&gt;

&lt;p&gt;יש בעיה הרבה יותר עמוקה מהמאגר הביומטרי, הוא בסה&quot;כ עוד שלב איבוד הפרטיות שחל בעולם כולו. רק שהפעם ממשלה החליטה לקחת בו חלק&amp;hellip; זה היגיוני, עם בכל־כך הרבה מקומות נהנים מהמאגרים הביומרטיים, אז למה שהממשלה לא תיקח?&lt;/p&gt;

&lt;p&gt;נתחיל, הנה &lt;a href=&quot;http://www.nrg.co.il/online/1/ART1/921/251.html&quot;&gt;ציטוט&lt;/a&gt; של ח&quot;כ שטרית שהופיע ב־nrg.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;בשדה התעופה יש מאגר [טבעות אצבעות] של 700 אלף איש&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;והנה כמה &lt;a href=&quot;http://www.facebook.com/press/info.php?statistics&quot;&gt;ציטוטים&lt;/a&gt; מאתר Facebook המפורסם:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;More than 1 billion photos uploaded to the site each month&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;והנה הציטוט של מ&lt;a href=&quot;http://blog.shemesh.biz/?p=708&quot;&gt;הכתבה&lt;/a&gt; של שחר שמש:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;ארגון פשע שם מצלמה מעל דלת כניסה לבית בושת. כל מי שנכנס מצולם, תווי פניו משמשים לזיהויו במאגר הביומטרי, מאגר משרד הפנים (שכבר דלף) משמש כדי לבדוק האם הוא נשוי, ואם כן, מה היא כתובתו. אם הוא לא לקוח קבוע, כשבוע לאחר הביקור בבית הבושת דופק אדם בנימוס על דלתו, מגיש לו מעטפה חתומה עם תמונות, ודרישת תשלום.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;ובואו נסכם:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;האם מישהו הכריח אותם לתת תביעת אצבע השדה התעופה כדי לזרז את תהליך המעבר הביקורת? אף אחד&amp;hellip;&lt;/li&gt;
&lt;li&gt;האם מישהו הכריח אותם ליצור מאגר ביומטרי ענק של תווי פנים ההופכים את הזיהוי לקל ע&quot;י תיוג מסודר? אף אחד&amp;hellip;&lt;/li&gt;
&lt;li&gt;מישהו הכריח אותם לפרסם את מצבם האישי ב&lt;a href=&quot;http://www.facebook.com/&quot;&gt;מאגר הביומטר&lt;/a&gt; הגדול בעולם? אף אחד&amp;hellip;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;אז אם נחליף את המילה &quot;המאגר הביומרטי&quot; ב־facebook או מאגר טביעות האצבעות הממשלתי במאגר שנמצא בשדה התעופה, מה ישתנה? שום דבר!&lt;/p&gt;

&lt;p&gt;אז האם הבעיה היא החוק? או הבעיה היא הייתה עוד הרבה לפני? מפתיע, עד כמה הבעיה שתיארתי &lt;a href=&quot;http://art-blog.no-ip.info/newpress/blog/post/220&quot;&gt;כאן&lt;/a&gt; לפני מספר חודשים צצה פתאום כשהכנסת החליטה &quot;לטפל&quot; בה.&lt;/p&gt;

&lt;p&gt;לא, הבעיה היא לא החוק (אם כי אין לו הצדקה); האם באמת, פריצה למאגר והצלבת נתונים תהיה יותר קלה מהשגת מידע פרטי ביותר שכבר היום &lt;a href=&quot;http://benhamo.org/wp/?p=1585&quot;&gt;ניתן לעשות בקלות&lt;/a&gt;?&lt;/p&gt;

&lt;p&gt;הבעיה היא אנחנו. אנחנו כבר מזמן ויתרנו בעצמנו על כל הפרטיות שלנו בעידן הדיגיטלי. כדי לראות את התמונות של חברים שלנו אנחנו פותחים חשבון ב־facebook עם התמונות המתויגות שלנו, כדי לעבור מהר בשדה התעופה אנחנו נותנים את טביעת האצבע שלנו, כדי לקבל הנחות בסופר אנחנו נותנים המון פרטים ולמעשה מאפשרים לעקוב אחרי הרגלי הצריכה שלנו.&lt;/p&gt;

&lt;p&gt;למעשה, לא צריך לחוקק חוקים&amp;hellip; פשוט כדי לחיות בחברה המודרנית, אנחנו מוותרים על הפרטיות והאנונימיות שלנו, כי זה מה שהסביבה דורשת והחברה כבר קיבלה את זה; ואם אתה לא מוכן לקבל את זה אתה תהיה כבשה שחורה.&lt;/p&gt;

&lt;p&gt;אז מה לעשות? לוותר?&lt;/p&gt;

&lt;p&gt;לא, אני מקווה שחוק המאגר הביומטרי כפישהו לא יעבור, כי ממש לא בא לי לתת טביעת אצבעות שלי לאף אחד (אפילו לצה&quot;ל, אבל שם לא הייתה לי כל־כך ברירה). מה שהרבה יותר חשוב להעלות מודעות הציבור, כי לא צריך חוקים, לא צריך דליפות כדי לאסוף מידה שרובנו נותנים כל־כך בקלות.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/228"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
	
</channel>
</rss>
