<?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>שפת C, פקודות goto, ניהול משאבים ומה שביניהם.</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/179</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/179</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;לאחרונה, התפתח &lt;a href=&quot;http://www.whatsup.org.il/forum/47523&quot;&gt;דיון מעניין&lt;/a&gt; ב־WhatsUp שהפתח מהצגה של דוגמת הקוד הקטנה, שמשתמשת ב־goto. אחת הסיבות ל&quot;רעש&quot; מסביב לקוד הזה, היא העובדה מפקודות goto &lt;a href=&quot;http://en.wikipedia.org/wiki/Goto#Criticism_of_goto_usage&quot;&gt;נחשבת למסוכנת ומזיקה&lt;/a&gt;. אבל, כידוע, בעולם שלנו לא הכל שחור לבן.&lt;/p&gt;

&lt;p&gt;בשפות ללא destructorים כמו Java זה מאוד מקובל להשתמש בקטעי־try/finally לניהול משאבים. לדוגמה:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void function()
{
    resource r1,r2;
    try {
        r1.allocate()
        if(error1) throw;
        r2.allocate()
        if(error2) throw;
        do_something;
        if(error3) throw;
    }
    finally {
        r1.free();
        r2.free();
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;למעשה, throw מקפיץ אותך לקטע finally שמאפשר שחרור מסודר של משאבים שלא מנוהלים ב־gc. עכשיו בואו נסתכל בקוד הבא:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;void function()
{
    resource r1,r2;
    {
        r1.allocate()
        if(error1) goto filally;
        r2.allocate()
        if(error2) goto filally;
        do_something;
        if(error3) goto filally;
    }
    finally: {
        r1.free();
        r2.free();
    }
}
&lt;/code&gt;&lt;/pre&gt;

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

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

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/179"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>לוותר על gc או לוותר על destructor?</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/178</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/178</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;היום, יש נטייה להשתמש בכל שפה אפשרית ב־GC &amp;ndash; כי היא פותרת המון בעיות בניהול זיכרון. כמעט כל השפות פופולריות (למעט C/C++/Pascal) מממשות אותה בצורה זו או אחרת.&lt;/p&gt;

&lt;p&gt;כמעט כולם (למעט CPython,‏ Perl ו־vala) משתמשות בשיטה של &quot;בדיקת נגישות&quot; (Reachability). בשיטה זו מנוע GC פועל אחת לזמן מה, מחפש כל מופעי אובייקטים שאינם נגישים יותר ומוחק אותם.&lt;/p&gt;

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

&lt;p&gt;שימוש ב־GC שיטה הראשונה פותרת את בעיית ניהול הזיכרון, יחד עם זו היא מציבה בעיה הגדולה אחרת: destructors או finalizers &amp;mdash; מתודות שמבצעות &quot;מחיקה&quot; של האובייקט, הופכות לכמעט ולא רלוונטיות. כי אי אפשר לדעת מתי ישוחרר האובייקט. כלומר ב־Java, C#, IronPython, PHP, D וכמעט כל שפות אחרות שמשתמשות בשיטה הזו, destructors הם חסרי משמעות.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/178"&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/176</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/176</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;אחת הגישות המודרניות בפיתוח תכנה היא: &lt;/p&gt;

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

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

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

&lt;p&gt;גם צורך בהעסקת כוח אדם מיומן היא משמעותית. כידוע, לא כל המתכנתים שווים. למשל, &lt;a href=&quot;http://www.indeed.com/&quot;&gt;לפי  נתוני indeed‏&lt;/a&gt; ההבדל בין משכורת מפתח C++‎ לבין משכורת מפתח PHP או Asp.Net יכול להגיע עד פי־1.5&amp;ndash;2.&lt;/p&gt;

&lt;p&gt;השאלה היא, אם העיקרון הזה נכון והאם כדאי לצצד לו?&lt;/p&gt;

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

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/176"&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/175</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/175</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;&lt;a href=&quot;http://sijp.no-ip.info&quot;&gt;שלומי ישראל&lt;/a&gt; (הידוע כ־sijp) &lt;a href=&quot;http://sijp.no-ip.info/node/269&quot;&gt;העביר לי משימה&lt;/a&gt; לכתוב בנושא &quot;תולדות הבלוג שלי&quot;. בד&quot;כ אני לא מתפתה להשתתף בשרשורי משימות כאלה, אבל הפעם, החלטתי שהנושא מספיק מעניין.&lt;/p&gt;

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

&lt;p&gt;התכנון המקורי היה להתרכז בשני נושאים:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://art-blog.no-ip.info/newpress/blog/cat/2&quot;&gt;סלסה וריקוד&lt;/a&gt; ולהחליף &lt;a href=&quot;http://art-blog.no-ip.info/newpress/blog/page/7&quot;&gt;פרסום כתבות&lt;/a&gt; באתר &lt;a href=&quot;http://www.lamusica.co.il&quot;&gt;LaMusica.co.il‏&lt;/a&gt;‏ בכתיבה בבלוג שלי.&lt;/li&gt;
&lt;li&gt;להתחיל לכתוב בנושא תכנה חופשית&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;לצערי, הנושא הראשון, בסופו של דבר, הסתכם במספר מצומצם של כתבות, כך שהבלוג הפך לבלוג מחשבים כמעט טהור; ובסביבות אוקטובר 2007, הוא זכה להיכנס ל־&lt;a href=&quot;http://planet.linux.org.il/&quot;&gt;planet.linux.org.il‏&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;במקביל התחלתי לפתח טכנולוגיית web חדשה &amp;mdash; &lt;a href=&quot;http://art-blog.no-ip.info/newpress/blog/cat/25&quot;&gt;‏CppCMS‏&lt;/a&gt;; ובדצמבר 2007, פתחתי &lt;a href=&quot;http://art-blog.no-ip.info/cppcms/blog&quot;&gt;בלוג נוסף באנגלית&lt;/a&gt;, שהיה אמור לשמש אותי לשתי מטרות:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;בניית פלטפורמת הניסוי של הטכנולוגיה החדשה&lt;/li&gt;
&lt;li&gt;פרסום מידע אודות CppCMS לקהל שלא מדבר בעברית.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;יחד עם התקדמות הפרויקט, מערכת הבלוגים הפכה ליותר ויותר בשלה. במאי 2008 החלטתי &lt;a href=&quot;http://art-blog.no-ip.info/newpress/blog/post/135&quot;&gt;להיפרד מוורדפרס&lt;/a&gt; ולהחליפו במערכת החדשה. מאד הבלוג הזה רץ על טהרת C++‎.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/175"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>הפתעה לא נעימה מ־MySQL.</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/174</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/174</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;אני יודע ש־MySQL זה לא בסיס נתונים מושלם, בעל מיליון ואחד פיצ'רים מעולים הדרושים לכל בסיס נתונים ארגוני. אבל יש לו יתרון אחר גדול&amp;hellip; הוא מהיר מאוד, &lt;a href=&quot;http://art-blog.no-ip.info/cppcms/blog/post/13&quot;&gt;הרבה יותר מהיר&lt;/a&gt; מ־PostgreSQL ו־Sqlite3 (לפחות לפי הניסיון שלי).&lt;/p&gt;

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

&lt;p&gt;חופש על &quot;mysql shrink database&quot; הביא אותי להבנה: לא ניתן לעשות כיווץ לטבלאות InnoDB, אלא אם &lt;a href=&quot;http://dev.mysql.com/doc/refman/5.0/en/multiple-tablespaces.html&quot;&gt;אתה מגדיר&lt;/a&gt;  ב־my.cnf, שכל טבלה תנוהל בקובץ נפרד‏:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[mysqld]
innodb_file_per_table
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;אבל איך לכווץ בסיסי נתונים קיימים? לא ניתן! אפשר לשמור dump של אותו בסיס נתונים. לשנות הגדרות mysql, למחוק את הקובץ ibdata1 באופן ידני ולייבא את הנתונים מקובץ קיים מחדש.&lt;/p&gt;

&lt;p&gt;לאחר מכן, פעולה כמו:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;optimize table xyz;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;פשוט תעבדו לך, מחיקת בסיס נתונים תגרום למחיקת המידע מדיסק ואפילו delete from xyz;‎ תגרום לריקון הקובץ! למזלי, לא היו לי בסיסי נתונים יקרים (הכל היה לצורך ניסויים), כך שיכולתי פשוט למחוק אותם ולוותר על תהליך dump. עם כל זה המצב היה מאוד מאכזב:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;מדוע הטבלאות לא מופרדות לקבצים שונים מלכתחילה?&lt;/li&gt;
&lt;li&gt;מדוע Debian לא דאגו לעשות את ההגדרות האלו כברירת מחדל?&lt;/li&gt;
&lt;li&gt;מי בכלל צריך לנהל מידע של &lt;strong&gt;כל&lt;/strong&gt; בסיסי נתונים אפשריים בקובץ &lt;strong&gt;יחיד&lt;/strong&gt;? לא צריך להסביר מדוע זה מסוכן.&lt;/li&gt;
&lt;/ol&gt;


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

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

&lt;p&gt;כמובן, הדבר הראשון שמריצים במצב כזה apt-get clean שבד&quot;כ משחרר אצלי כמה עשרות MB של מקום פנוי. אבל לאחר הפעולה הפשוטה הזו עדייו נשארו רק 150MB זמינים.&lt;/p&gt;

&lt;p&gt;אחד הדברים האחרונים שהתקנתי לאחרונה היה tomcat5.5 לצורכי ניסוי. מחקתי אותו ואת כל התלויות שלו. עדיין המצב לא היה מזהיר במיוחד. הדבר הראשון שהחלטתי לבדוק זה איזה חבילות הן הגדולות ביותר. Google תוך חיפוש קצר הביא אותי לפקודה:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dpkg-query -W -f='${Installed-Size;10}\t${Package}\n' | sort -n
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;חשבתי, שהדברים הכבדים יהיו apache, mysql או כל מיני דברים מוסבכים אחרים שהתקנתי&amp;hellip; אבל לא. זה היה הפלט (השורות האחרונות):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; 69496      mingw32
 73428      valgrind
 76728      tetex-base
 82328      eclipse-platform-gcj
129740      openoffice.org-core
164304      openclipart-png
167892      ghc6
186672      openclipart-svg
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;חבילות כמו valgrind, tetex ו־OpenOffice ואפילו mingw32 משמשות אותי לעתים קרובות, כך שברור שהן יישארו.&lt;/p&gt;

&lt;p&gt;openclipart די שימושי&amp;hellip; אם כי במקרה הצורך אפשר לוותר עליו.&lt;/p&gt;

&lt;p&gt;אבל: ghc6 &amp;ndash; ‏Haskell? התקנתי אותו פעם, קמפלתי איתו משהו וזה פחות או יותר כל השימוש שהיה לי בו. eclipse? מעולם לא חשבתי שהוא מפלצת עד כדי כך! פעם התקנתי אותו, ניסיתי לעבוד איתו אבל די וויתרתי עליו כי הוא היה נורא כבד. והדבר הזה (+תלויות) תופס כל־כך הרבה מקום! אחרי שמחתי את שני הכלים האלה ואת התלויות שלהם, קיבלתי בחזרה כ־600MB&amp;hellip;&lt;/p&gt;

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

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/173"&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/172</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/172</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;למרות ש־CppCMS מצטיינת בביצועים גבוהים במיוחד, עדיין מגיע הרגע, בו צריך לבצע ביזור המערכת לצורך שיפור ביצועים. המערכת נבנתה מלכתחילה במחשבה שהיא תצטרך לרוץ על מספר מחשבים נפרדים, אבל היה חסר רכיב משמעותי אחרון &amp;mdash; מערכת Cache מבוזרת.&lt;/p&gt;

&lt;p&gt;עד היום CppCMS באה עם שתי אופציות של Cache‏ &amp;mdash; משותף לחוטים של אותו תהליך (threaded) ומשותף לתהליכים שנוצרו ע&quot;י מנגנון prefork (‏fork cache). לא היה ניתן לשתף Cache בין שני מחשבים שונים. לא הייתה בעיה &lt;em&gt;עיקרונית&lt;/em&gt; להוסיף אותו, למעט העדר זמן הפיתוח.&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;http://art-blog.no-ip.info/newpress/blog/post/171&quot;&gt;ההכרות שלי&lt;/a&gt; עם ספריית &lt;a href=&quot;http://tenermerx.com/Asio/&quot;&gt;Boost.Asio‏&lt;/a&gt; פישטה את התהליכים בצורה משמעותית ואפשרה לי לממש את המודול החדש במהירות.&lt;/p&gt;

&lt;p&gt;למעשה, המודול החדש מאוד דומה בתפקידו ל־&lt;a href=&quot;http://www.danga.com/memcached/&quot;&gt;memcached‏&lt;/a&gt; למעט שיפור קטן ומשמעותי: תמיכה ב־triggerים או אפשרות לנקות ערכים מסוימים לפי הדרישה.&lt;/p&gt;

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

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

&lt;p&gt;המודול מופעל ע&quot;י שורת קונפיגורציה cache.backend=&quot;tcp&quot;‎ ושני פרמטרים נוספים cache.ports ו־cache.ips המגדירים את רשימת הפורטים וכתובות ה־IP עליהם מאזינים שרתי ה־cache המבוזרים.&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/172"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>פיתוח יישומי רשת ב־C++‎ או הצצה ל־Boost.Asio.</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/171</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/171</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;במאמר זה, אביא סקירה קצרה של ספריית &lt;a href=&quot;http://www.boost.org/doc/libs/1_36_0/doc/html/boost_asio.html&quot;&gt;Boost.Asio‏&lt;/a&gt;‏ &amp;ndash; ספרייה לפיתוח יישומי תקשורת ב־C++‎ בצורה מהירה, יעילה ונוחה. ההכרות שלי איתה התחילה, דווקא מצורכי העבודה. אחרי זמן קצת, הבנתי שהיא מאוד נוחה ואפילו תהיה שימושית עבור CppCMS. למעשה, הספרייה הזו, אפשרה לי לעטוף את ספריית ה־cache של CppCMS ולהפוך אותה למבוזרת &amp;mdash; לבנות פתרון בסגנון memcached &amp;mdash; תוך מספר שעות בלבד.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;גרסת Boost.Asio: היא חלק מ־Boost החל מגרסתו 1.35.&lt;/li&gt;
&lt;li&gt;גרסת Asio עצמאית, שדורשת Boost גרסה 1.33 ומעלה &amp;mdash; מאפשרת לעשות שדרוג של ספרייה ללא תלות בגרסת Boost.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;אחד המאפיינים המעניינים שלה היא העובדה, שהספרייה &lt;em&gt;כולה&lt;/em&gt; כתובה על בסיס Template Metaprogramming ומהווה אוסף קובצי־&quot;‎.hpp&quot; בלבד.&lt;/p&gt;

&lt;h4&gt; &quot;בעיית עשרת אלפים קשרים&quot; או &quot;למה צריך ספריות כאלה בכלל?&quot;&lt;/h4&gt;

&lt;p&gt;מעבר לעובדה ש־&lt;a href=&quot;http://en.wikipedia.org/wiki/Berkeley_sockets&quot;&gt;Berkeley Sockets API‏&lt;/a&gt; די מסובך, עדין ושונה במערכות הפעלה שונות &amp;mdash; כבר סיבה מספיק טובה לבנות מעטפת עבורו &amp;mdash; אני אתרכז דווקא במשהו אחר, כתיבת יישומים יעילים.&lt;/p&gt;

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

&lt;p&gt;יש מספר גישות לבניית השרת:&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/171"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>מתיאוריה למציאות, או עד כמה UTF-16 באמת בעייתי</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/170</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/170</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;בהמשך ל&lt;a href=&quot;http://art-blog.no-ip.info/newpress/blog/post/169&quot;&gt;פוסט הקודם&lt;/a&gt;, החלטתי לעשות סקירה קצרה: &quot;האם באמת תכנות שכתובות עם utf-16 לא עובדות כמו שצריך עם קידודים כפולים ומה קורה עם תכנות שמשתמשות בייצוג פנימי ב־utf-8/utf-32?&quot;&lt;/p&gt;

&lt;p&gt;לקחתי תו &lt;span style=&quot;font-size:150%&quot;&gt;&quot;𠂊&quot;&lt;/span&gt; או U+2008A וניסיתי להציג אותו ביישומים שונים מבוססים על toolkitים שונים. התו הזה מתייחס ל־&lt;a href=&quot;http://en.wikipedia.org/wiki/Template:Unicode_chart_CJK_Unified_Ideographs_Extension_B&quot;&gt;CJK Unified Ideographs Extension B‏&lt;/a&gt; ולא לא יכול להיות מיוצג ב־utf-16 בעזרת איבר אחד (שני בתים) אלא דורש צירוף של שני איברים (ארבעה בתים).  אם אתם לא רואים את התו הזה, או רואים אותו כריבוע בדפדפן שלכם, אפשר להתקין גופן חופשי: AR PL ShanHeiSun Uni, בעלי דביאן יכולים להתקין חבילה ttf-arphic-uming.‏ חייב לציין, אין מי מושג מה התו או המילה האלה אומרים, כך שמתנצל מראש.&lt;/p&gt;

&lt;p&gt;קודם כל: היישומים שעובדים עם utf-16 שהתמודדו אתו בצורה יפה ונכונה (או פשוט לא מצאתי באגים ב־2 דקות ששיחקתי איתם) הם:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OpenOffice שעובד עם icu (אם כי, אני לא בטוח שהוא משתמש בו בייצוג פנימי)&lt;/li&gt;
&lt;li&gt;Microsoft Word עבד ללא בעיות ועובד עם Windows API המבוסס על utf16‏.&lt;/li&gt;
&lt;li&gt;FreeMind שכתוב ב־Java הצליח להציג את התו ולערוך טקסט בצורה מסודרת. (Java משתמשת ב־utf-16 במחרוזות שלה).&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;אבל פה פחות או יותר נגמרו היישומים שעובדים עם utf-16 וגם מסתדרים עם התו הבעייתי. נתחיל:&lt;/p&gt;

			&lt;p&gt;
			&lt;a href="/newpress/blog/post/170"&gt;המשך...&lt;/a&gt;
			&lt;/p&gt;
			&lt;/div&gt;
			</description>
		</item>
		
		<item>
			<title>UTF-8, UTF-16, Unicode וכל מה שביניהם.</title>
			<link>http://art-blog.no-ip.info/newpress/blog/post/169</link>
			<guid>http://art-blog.no-ip.info/newpress/blog/post/169</guid>
			<description>
			&lt;div style=&quot;direction:rtl&quot;&gt;
			&lt;p&gt;היו היה בית, בתקופה של תחילת עידן המחשבים הוא היה מסוגל לשמור תו בודד. אבל אנושות הלכה והתפתח ויום אחד התברר שהוא לא מספיק. יש צרפתים, יש רוסים, יש סינים ולא ניתן לדחוף את הכל התווים הידועים לבית אחד מסכן. אז התאספו אנשים חכמים ובסוף שנות ה־80 &amp;mdash; תחילת 90 החליטו לבנות תקן אחיד שיכסה את כל השפות האפשריות &amp;mdash; Unicode.&lt;/p&gt;

&lt;p&gt;האנשים האלה חשבו וחישבו ששני בתים יספיקו לכסות את כל השפות אפשריות. כך נולד קידוד של Unicode בשני בתים. בתחילת ה־90, יצרתי UNIX הגדולים גם חשבו ובנו UTF-8 שכדי להבטיח תאימות לאחור עם כל התכנה הקיימת &amp;mdash; כך נולד קידוד בעל אורך משתנה.&lt;/p&gt;

&lt;p&gt;עבר הזמן, יצרני תכנה שונים הולכו בשני כיוונים: אחד להציג כל תו בשני בתים והשני להמשיך להשתמש ב־ANSI C String ולעבוד עם תווים בעלי ייצוג באורך שונה. אבל, באמצע שנות ה־90 כבר היה ברור ששני בתים לא יספיקו כדי לכסות את כל השפות האפשריות. ולכן התקן הורחב כך שהוא כלל ערכים מ־0 ועד ל־0x10FFFF.&lt;/p&gt;

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