<?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>ייסורי בינאום ולוקליזציה בשנת 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...</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>דברים שלא נאמרים על Boost.</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/225</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/225</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;או ליתר דיוק, לא מודגשים לגביו.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://boost.org&quot;&gt;http://boost.org&lt;/a&gt; היא אחת הספריות הפופולריות ביותר ב־C++‎, היא מהווה ל־C++‎ מה ש־JDK מהווה ל־Java, מה ש־RTL ו־‏FCL מהווים ל־FreePascal, היא מה ש־Python Standard Library מהווה ל־Python.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;תמיכה ב־Threads.&lt;/li&gt;
&lt;li&gt;עבודה עם socketים.&lt;/li&gt;
&lt;li&gt;כלי עיבוד טקסט.&lt;/li&gt;
&lt;li&gt;ביטויים רגולריים.&lt;/li&gt;
&lt;li&gt;עבודה עם זיכרון משותף.&lt;/li&gt;
&lt;li&gt;ועוד.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;היום, היא בהחלט מהווה דה־פקטו סטנדרט בתחום C++‎, כך שחלקים גדולים ממנה כבר נכנסו ל־STL הבא של C++‎.&lt;/p&gt;

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

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/225"&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/218</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/218</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;הכנתי שאלון קצת שמאפשר לכם לבדוק&amp;hellip; האם אתם מוכנים לכתיבת תכנה שתהיה מוכנה להתאמה לתרבויות שונות?&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;אני רוצה לייצג מחרוזת, כ־&lt;code&gt;char *some_text&lt;/code&gt;. מהו המידע שחסר לי?&lt;/li&gt;
&lt;li&gt;יש לי מחרוזת &lt;code&gt;wchar_t *text&lt;/code&gt; או &lt;code&gt;String text&lt;/code&gt; ב־Java, אני רוצה לקחת את התו הראשון שלה:

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt; wchar_t c=text[0]; // C
 Char c=text.charAt(0); // Java
&lt;/pre&gt;

האם זהו קוד נכון?&lt;/li&gt;
&lt;li&gt;אני כותב את הקוד הבא:

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt; if n==1:
     print translate(&quot;You have one aplle&quot;)
 else:
     print translate(&quot;You have %d apples&quot;) % n
&lt;/pre&gt;

 מה לא בסדר בקוד הזה?&lt;/li&gt;
&lt;li&gt;מה לא בסדר בקוד הבא:

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

int main()
{
        time_t now_t=time(NULL);
        struct tm *now=localtime(&amp;amp;now_t);
        char str_time[32];
        strftime(str_time,sizeof(str_time),&quot;%d/%m/%y&quot;,now);
        printf(&quot;Today is %s\n&quot;,str_time);
        return 0;
}
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;מהו גודל הזכרון הנדרש לשמירת תו unicode בודד?&lt;/li&gt;
&lt;li&gt;מהו גודל של wchar_t? (למתכנתי C++/C)‏?&lt;/li&gt;
&lt;li&gt;מהי גודל של תו unicode בשפת התכנות שאתה אוהב?&lt;/li&gt;
&lt;li&gt;מהו קידוד של מחרוזת (unicode) בשפת התכנות/toolkit שאתה אוהב?&lt;/li&gt;
&lt;li&gt;מה הבדל בין utf-8,‏ utf-16, ‏utf-32?‏&lt;/li&gt;
&lt;li&gt;מהו אורך התו הארוך ביותר ב־utf8?‏&lt;/li&gt;
&lt;li&gt;בניתי ספרייה עם שתי פונקציות בלבד. מה לא בסדר בקוד הבא (שתי בעיות לפחות)?

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;extern Char32 to_upper_char(Char32);
void to_upper(String str)
{
        for(int i=0;i&amp;lt;str.size();i++)
                str[i]=to_upper(str[i]);
}
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;מה לא בסדר בקוד הבא:

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;def print_error_message(message):
    print translate(&quot;Error occured: &quot;)+&quot;“&quot;+translate(message)+&quot;”&quot;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;מה לא בסדר בקוד הזה:

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;&amp;lt;?php $rtl_langs=array(&quot;he&quot;,&quot;ar&quot;,&quot;pa&quot;); ?&amp;gt;
...
&amp;lt;div &amp;lt;?php if(in_array($lang,$rtl_langs) echo 'dir=&quot;rtl&quot;'; ?&amp;gt; &amp;gt;
...
&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;אני רוצה לחתוך את הטקסט בצורה יפה, כך שזה לא ייחתך באמצע המילה: מה לא בסדר בקוד הבא:

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;// Cut nice pice of text
wstring cut_nicely(wstring const &amp;amp;orig,int n)
{
   if(orig.size()&amp;lt;=n) return orig;
   return orig.substr(orig.find_first_of(L&quot; \r\n\t\f&quot;,n));
}
&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;


			&lt;p&gt;
			&lt;a href="/newpress/blog/post/218"&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/212</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/212</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;כשבניתי CppCMS תמיד לקחתי בחשבון ששרת יחיד לא תמיד יוכל להבטיח ביצועים מספיק טובים של שירות web עמוס. לכן, תמיד בתכנון המערכת, לקחתי בחשבון את האפשרויות של scale up.&lt;/p&gt;

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

&lt;p&gt;לאחרונה הצלחתי להשיג גישה זמנית לרשת מחשבים חזקים במיוחד: Intel עם 4 ליבות שרצים ב־2.4GHz ו־4GB של זכרון. כך יכולתי לבדוק את מנגנון ה־cache המבוזר בעובד מעל TCP/IP ולהבין כמה אני מפסיק כתוצאה מביזור:&lt;/p&gt;

&lt;pre name=&quot;code&quot; class=&quot;cpp&quot; &gt;#   Local  Distributed
1   5,500   5,500
2  11,500   9,500
3  15,200  13,500
&lt;/pre&gt;

&lt;p&gt;הטבלה מציגה את מספר הדפים בשניה שהמערכת wiki שבניתי מסוגלת לספק תחת הנחה של פגיעה 100% ב־cache (בגלל אילוצי הגישה לא יכולתי לשנות את הפרמטר). מספר השרתים הוא בין 1 ל־3 ומנגנוני ה־cache הם: cache המקומי הלא־מסונכון ו־cache המבוזר המסונכרן באופן מלא.&lt;/p&gt;

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

&lt;p&gt;יש לציין שהצלחתי למלא כמחצית מרוחב הפס של רשת 1GBit.&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;כששדרגתי Breezy ל־Dapper השדרוג נתקע באמצע ומצאתי מערכת לא שמישה, בלי חיבור לאינטרנט, אם כי בסוף הצלחתי להחלץ מזה.&lt;/li&gt;
&lt;li&gt;כששדרגתי Sarge ל־Etch בגלל התנגשויות חצי מהחבילות הוסרו כולל Office ו־Gnome והייתי צריך להחזירם באופן ידני, שלא לדבר על כמה פעולות אחרות שהיה צריך לעשות.&lt;/li&gt;
&lt;li&gt;שדרוג ל־Lenny היה לפי הכתוב&amp;hellip; פשוט לשדרג.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;קודם כל עברתי על &lt;a href=&quot;http://debian.org/releases/stable/amd64/release-notes/ch-upgrading.en.html&quot;&gt;הוראות שדרוג&lt;/a&gt;. מי שחושב ש־apt-get dist-upgrade ועושה את העבודה טועה!&lt;/p&gt;

&lt;p&gt;תהליך שאפשר לסכם אותו בקצרה בשני שלבים:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;שדרוג aptitude לחדש.&lt;/li&gt;
&lt;li&gt;ביצוע aptitude dist-upgrade.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;אם לא תלכו כך לא תצליחו, חייבים קודם את ה־aptitude החדש.&lt;/p&gt;

&lt;p&gt;בנוסף לבעיות הרגילות בשדרוג, היו לי עוד כמה נקודות לציון:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;היה לי רק 1G פנוי במחיצת / שלא הקל על התהליך&lt;/li&gt;
&lt;li&gt;אני משתמש גרסת vserver של הקרנל, כך שעבורו אין דרייבר nvidia כחבילה.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;נתחיל בסיפור&lt;/p&gt;

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

&lt;h3&gt; רקע&lt;/h3&gt;

&lt;p&gt;אף אחד לא אוהב Vendor Lock In אפילו עם מדובר במשהו טוב כמו GCC או Linux. לכן, אני מוודא כי CppCMS ירוץ גם על BSD וגם על Solaris. אבל עם קומפיילר היו לי קצת יותר בעיות. יש מעט מאוד קומפיילרים טובים והנפוץ בין כולם הוא כמובן GCC.&lt;/p&gt;

&lt;p&gt;הרבה זמן היו לי תהיות לגבי זה, אפילו ניסיתי להתקין SUN Studio על OpenSolaris ב־Virtual Box, אבל&amp;hellip; בינתיים Solaris לא מתנהג יפה אפילו עם GCC. &lt;/p&gt;

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

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/210"&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/209</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/209</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;בעיות ביצועים של מערכות web יכולות להופיע לא רק עקב עומסים כבדים אלא גם בגלל &lt;a href=&quot;http://stackoverflow.com/questions/480233&quot;&gt;מערכות מוגבלות&lt;/a&gt;. פה שפות מקומפלות כמו C/C++/Pascal‎ יכולות לתת מענה מצוין. אבל כרגיל חסרים כלים: Klone זה לא הרבה יותר ממשהו דמוי PHP ברק C.‏‏ Wt הוא בנוי כמו GUI.‏ Pascal? מישהו בכלל זוכר שפה כזו ;).&lt;/p&gt;

&lt;p&gt;לכן CppCMS יתמוך גם בצרכים של מערכות משובצות מחשב והן:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;צמצום תלויות למינימום.&lt;/li&gt;
&lt;li&gt;עבודה מהירה.&lt;/li&gt;
&lt;li&gt;גודל קובץ ריצה מינימלי.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;לכן, לקחתי CppCMS ועשיתי לו ניתוח &amp;mdash; זרקתי את כל מנגנוני ה־cache, ביטלתי דחיסת zlib ובכל צמצמתי תלות ב־boost::iostreams, העפתי מודי עבודה מיותרים ב־embedded.&lt;/p&gt;

&lt;p&gt;בנוסף, אם המפתח רוצה לבנות גרסת cgi אז בכלל, העפתי את כל הקוד שמטפל ב־thread-pool וכמובן גם בפרוטוקולים כמו scgi/fcgi. ובכן, התכנה הצטמצמה לגודל של 500Kb בלבד. שזה כ־10%&amp;ndash;20% מגודל משערך PHP אופייני.&lt;/p&gt;

&lt;p&gt;ובכך שוחררה גרסת CppCMS 0.0.4 שכוללת תמיכה במערכות משובצות מחשב.&lt;/p&gt;

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