<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#8235;שלמה שוורץ - ארכיטקט ומפתח תוכנה&#187; Java/J2EE, FLEX, SAP Portal, JBoss, Spring, Hibernate&#8236;</title>	<atom:link href="http://www.j2ee.co.il/tag/%d7%a2%d7%a6%d7%9e%d7%90%d7%99/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.j2ee.co.il</link>
	<description>&#8235;מערכות Java, J2EE, FLEX, ActionScript, SAP, C++, C#, Oracle&#8236;</description>	<lastBuildDate>Tue, 06 Dec 2011 09:46:35 +0000</lastBuildDate>
	<language>he</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>&#8235;העדפותיי האישיות לחבילת הג&#039;אווה המושלמת&#8236;</title>		<link>http://www.j2ee.co.il/%d7%94%d7%a2%d7%93%d7%a4%d7%95%d7%aa%d7%99%d7%99-%d7%94%d7%90%d7%99%d7%a9%d7%99%d7%95%d7%aa-%d7%9c%d7%97%d7%91%d7%99%d7%9c%d7%aa-%d7%94%d7%92%d7%90%d7%95%d7%95%d7%94-%d7%94%d7%9e%d7%95%d7%a9%d7%9c/</link>
		<comments>http://www.j2ee.co.il/%d7%94%d7%a2%d7%93%d7%a4%d7%95%d7%aa%d7%99%d7%99-%d7%94%d7%90%d7%99%d7%a9%d7%99%d7%95%d7%aa-%d7%9c%d7%97%d7%91%d7%99%d7%9c%d7%aa-%d7%94%d7%92%d7%90%d7%95%d7%95%d7%94-%d7%94%d7%9e%d7%95%d7%a9%d7%9c/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 19:31:50 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[FLEX]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Servlets]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[ג'אווה]]></category>
		<category><![CDATA[יועץ]]></category>
		<category><![CDATA[עצמאי]]></category>
		<category><![CDATA[פלקס]]></category>
		<category><![CDATA[פרילנסר]]></category>

		<guid isPermaLink="false">http://www.j2ee.co.il/?p=145</guid>
		<description><![CDATA[&#8235;אז מה הjava stack המועדף עליי? במהלך עבודתי כיועץ JAVA פרילנסר עצמאי, אני מתבקש לעיתים קרובות להמליץ על טכנולוגיות ג'אווה מתאימות לפרויקט מסויים. בג'אווה בניגוד לטכנולוגיות של מיקרוסופט כמו דוט נט, יש מגוון עצום של אפשרויות בבואינו לבחור סביבות עבודה. לכל שכבה באפליקציה יש אינספור פריימוורקים, ספריות וAPI, חלקם הגדול בקוד פתוח ואחרות מסחריות. כל [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p><!-- p { margin-bottom: 0.08in; text-align: right; } --></p>
<h2 style="margin-bottom: 0in;">אז מה ה<span style="font-family: Liberation Serif,serif;">java stack </span>המועדף עליי?</h2>
<p style="margin-bottom: 0in;" align="RIGHT">במהלך עבודתי כיועץ JAVA פרילנסר עצמאי, אני מתבקש לעיתים קרובות להמליץ על טכנולוגיות ג'אווה מתאימות לפרויקט מסויים. בג<span style="font-family: Liberation Serif,serif;">'</span>אווה בניגוד לטכנולוגיות של מיקרוסופט כמו דוט נט<span style="font-family: Liberation Serif,serif;">, </span>יש מגוון עצום של אפשרויות בבואינו לבחור סביבות עבודה<span style="font-family: Liberation Serif,serif;">. </span>לכל שכבה באפליקציה יש אינספור פריימוורקים<span style="font-family: Liberation Serif,serif;">, </span>ספריות ו<span style="font-family: Liberation Serif,serif;">API, </span>חלקם הגדול בקוד פתוח ואחרות מסחריות<span style="font-family: Liberation Serif,serif;">. </span>כל ארכיטקט ויועץ בוחר ב<span style="font-family: Liberation Serif,serif;">STACK </span>האהוב עליו בהתאם להעדפותיו האישיות וכמובן בהתחשב בדרישות הפרוייקט וביכולות המוצרים השונים<span style="font-family: Liberation Serif,serif;">. </span>בפוסט זה אפרוס את ההעדפות האישיות שלי שמתאימות למרבית הפרוייקטים אם כי זה כמובן משתנה בהתאם לצרכי הלקוח<span style="font-family: Liberation Serif,serif;">.</span></p>
<p style="margin-bottom: 0in;" align="RIGHT">
<h2 style="margin-bottom: 0in;">תצורה כללית <span style="font-family: Liberation Serif,serif;">Best of bread – Non J2EE</span></h2>
<p style="margin-bottom: 0in;" align="RIGHT"><span style="font-family: Liberation Serif,serif;">J2EE </span>היא טכנולוגיה טובה אבל במקרים רבים מדובר ב<span style="font-family: Liberation Serif,serif;">over kill </span>והיא עמוסה פיצ<span style="font-family: Liberation Serif,serif;">'</span>רים ושכבות שלא נמצאות בשימוש ומכבידות על המערכת<span style="font-family: Liberation Serif,serif;">. </span>השימוש ב<span style="font-family: Liberation Serif,serif;">session Beans </span>למשל כשהרבה פעמים אין צורך בכך ובכלל ה<span style="font-family: Liberation Serif,serif;">EJB Container </span>המסורבל כאשר הפונקציונליות היחידה שבאמת צריך היא <span style="font-family: Liberation Serif,serif;">JPA </span>שאפשר לקבל גם ללא <span style="font-family: Liberation Serif,serif;">EJB (</span>באמצעות <span style="font-family: Liberation Serif,serif;">Hibernate </span>למשל<span style="font-family: Liberation Serif,serif;">). </span>בנוסף<span style="font-family: Liberation Serif,serif;">, </span>ב<span style="font-family: Liberation Serif,serif;">J2EE </span>יש נטייה להצמד לשרת של יצרן מסויים ודי מהר מתחילים להשתמש בפיצ<span style="font-family: Liberation Serif,serif;">'</span>רים היחודיים לאותו מוצר<span style="font-family: Liberation Serif,serif;">. </span>זה גורם לאפליקציה להיות <span style="font-family: Liberation Serif,serif;">Non Portable </span>כשרוצים לעבור לשרת אחר<span style="font-family: Liberation Serif,serif;">. </span>פעמים רבות נתקלתי בפרוייקטים שרצים מעל <span style="font-family: Liberation Serif,serif;">J2EE </span>כשהשרת משמש ללא יותר מאשר <span style="font-family: Liberation Serif,serif;">Servlet Container. </span>הפלטפורמה של <span style="font-family: Liberation Serif,serif;">JEE </span>מסבך דברים פשוטים<span style="font-family: Liberation Serif,serif;">: WAR </span>פשוט הופך ל<span style="font-family: Liberation Serif,serif;">EAR </span>מורכב<span style="font-family: Liberation Serif,serif;">, Deployment Descriptiors </span>מיותרים בחלק מהגרסאות<span style="font-family: Liberation Serif,serif;">, </span>ובגלל שהשרתים בדרך כלל תפורים מראש קשה להחליף מודול ספציפי במקרה הצורך <span style="font-family: Liberation Serif,serif;">(</span>למשל לשדרג לגרסה חדשה יותר<span style="font-family: Liberation Serif,serif;">). </span>לדעתי כדאי להמנע ככל שאפשר משימוש</p>
<h2 style="margin-bottom: 0in;"><span style="font-family: Liberation Serif,serif;">Application Server – Apache Tomcat</span></h2>
<p style="margin-bottom: 0in;" align="RIGHT">שרת האפליקציות ו<span style="font-family: Liberation Serif,serif;">Servlet Container </span>הנפוץ בעולם<span style="font-family: Liberation Serif,serif;">. </span>היחיד שיכול אולי להתחרות בו הוא <span style="font-family: Liberation Serif,serif;">Jetty </span>אבל התיעוד הרב<span style="font-family: Liberation Serif,serif;">, </span>וותק רב השנים<span style="font-family: Liberation Serif,serif;">, </span>האינטגרציה הטבעית עם שרת <span style="font-family: Liberation Serif,serif;">Apache </span>כשרת <span style="font-family: Liberation Serif,serif;">WEB, </span>והאמינות של ארגון <span style="font-family: Liberation Serif,serif;">Apache </span>הופכים אותו לאופציה הטובה ביותר<span style="font-family: Liberation Serif,serif;">.</span></p>
<h2 style="margin-bottom: 0in;"><span style="font-family: Liberation Serif,serif;">ORM Persistence – Hibernate JPA Annotations</span></h2>
<p style="margin-bottom: 0in;" align="RIGHT">למרות שעדיין יש ארגונים המפתחים ב<span style="font-family: Liberation Serif,serif;">hibernate </span>בתוצרה הישנה קרי<span style="font-family: Liberation Serif,serif;">, </span>שימוש ב<span style="font-family: Liberation Serif,serif;">XML </span>על מנת להגדיר את המיפוי בין המחלקות לטבלאות<span style="font-family: Liberation Serif,serif;">, </span>השימוש ב<span style="font-family: Liberation Serif,serif;">JPA annotations </span>מהווה יתרון מכמה סיבות<span style="font-family: Liberation Serif,serif;">: </span>ראשית זה מאפשר מעבר ל<span style="font-family: Liberation Serif,serif;">EJB </span>במידה ורוצים בעתיד להעביר את האפליקציה ל<span style="font-family: Liberation Serif,serif;">JEE. </span>שנית<span style="font-family: Liberation Serif,serif;">, </span>הקוד הרבה יותר קריא וברור כשמעל לכל <span style="font-family: Liberation Serif,serif;">Property </span>בקוד מופיע הגדרות המיפוי שלו<span style="font-family: Liberation Serif,serif;">. </span>כמו כן זה מוריד את הצורך לתחזק <span style="font-family: Liberation Serif,serif;">XML </span>שבמקרים רבים הופך להיות ארוך ומסורבל<span style="font-family: Liberation Serif,serif;">.</span></p>
<h2 style="margin-bottom: 0in;"><span style="font-family: Liberation Serif,serif;">Dependency Injection – SPRING</span></h2>
<p style="margin-bottom: 0in;" align="RIGHT">במקומות רבים מוותרים לגמרי על השימוש ב<span style="font-family: Liberation Serif,serif;">DI </span>וב<span style="font-family: Liberation Serif,serif;">SPRING </span>בפרט אבל לדעתי זהו פיצ<span style="font-family: Liberation Serif,serif;">'</span>ר חשוב שמייעל ומפשט את הקוד בצורה משמעותית<span style="font-family: Liberation Serif,serif;">. </span>הבחירה שלי ב<span style="font-family: Liberation Serif,serif;">SPRING </span>ולא בפריימוורקים אחרים כגון <span style="font-family: Liberation Serif,serif;">Google Guise </span>היא ש<span style="font-family: Liberation Serif,serif;">SPRING </span>הוא הרבה יותר מרק <span style="font-family: Liberation Serif,serif;">DI. </span>במקרה הצורך אפשר למצוא מענה טוב לכמעט כל טכנולוגיית ג<span style="font-family: Liberation Serif,serif;">'</span>אווה קיימת<span style="font-family: Liberation Serif,serif;">: JMS, JPA, Security, RMI, Web Service, </span>מימוש טוב ל<span style="font-family: Liberation Serif,serif;">AOP </span>ועוד ועוד<span style="font-family: Liberation Serif,serif;">. </span>היופי ב<span style="font-family: Liberation Serif,serif;">SPRING </span>הוא היותו מבוסס על <span style="font-family: Liberation Serif,serif;">POJO </span>כך שתמיד קל להבין איך דברים עובדים והכי חשוב<span style="font-family: Liberation Serif,serif;">: </span>אפשר לשלוט בכמות ה<span style="font-family: Liberation Serif,serif;">SPRING </span>שמשתמשים בו בקוד<span style="font-family: Liberation Serif,serif;">. </span>החל משימוש מועט רק ב<span style="font-family: Liberation Serif,serif;">DI </span>וכלה באפליקציית <span style="font-family: Liberation Serif,serif;">SPRING </span>מלאה כולל <span style="font-family: Liberation Serif,serif;">MVC </span>ושאר הפיצ<span style="font-family: Liberation Serif,serif;">'</span>רים שהפריימוורק הענק הזה מציע<span style="font-family: Liberation Serif,serif;">.</span></p>
<h2 style="margin-bottom: 0in; font-style: normal; text-decoration: none;"><span style="font-family: Liberation Serif,serif;">UI – Rich Client with <a href="http://www.adobe.com/products/flex/">Adobe Flex</a></span></h2>
<p style="margin-bottom: 0in; font-style: normal; text-decoration: none;" align="RIGHT">זה אמנם לא ג<span style="font-family: Liberation Serif,serif;">'</span>אווה ולא <span style="font-family: Liberation Serif,serif;">WEB </span>קלאסי אבל כיום אין תחליף לפלקס וליכולות שהוא מציע באפליקציות שדורשות קליינט מורכב וברמה גבוהה<span style="font-family: Liberation Serif,serif;">. </span>יש כמה בעיות ב<span style="font-family: Liberation Serif,serif;">UI </span>רגיל מבוסס <span style="font-family: Liberation Serif,serif;">HTML </span>ו<span style="font-family: Liberation Serif,serif;">AJAX: </span>ראשית הקליינט לא אמין<span style="font-family: Liberation Serif,serif;">. Exception </span>יכול לגרום לכל הדף לעוף מבלי יכולת שחזור<span style="font-family: Liberation Serif,serif;">, </span>ניתוק זמני מהשרת גורם לעיתים קרובות לאיבוד מידע<span style="font-family: Liberation Serif,serif;">, </span>בעיית תאימות בין דפדפנים<span style="font-family: Liberation Serif,serif;">, </span>קושי לפתח אלמנטים גרפיים מורכבים<span style="font-family: Liberation Serif,serif;">, </span>ועוד<span style="font-family: Liberation Serif,serif;">. </span>שורש הבעייה בממשקי <span style="font-family: Liberation Serif,serif;">WEB </span>נעוץ בעובדה שהממשק  בסופו של דבר בנוי על <span style="font-family: Liberation Serif,serif;">HTML. </span>הבעייה ששפה זו מלבד היותה מיושנת<span style="font-family: Liberation Serif,serif;">, </span>יועדה במקור ליצירת מסמכים עשירים ולא לממשקי משתמש<span style="font-family: Liberation Serif,serif;">. </span>אין גרפיקה ווקטורית<span style="font-family: Liberation Serif,serif;">, </span>אין קומפוננטות <span style="font-family: Liberation Serif,serif;">UI </span>נפוצות כמו <span style="font-family: Liberation Serif,serif;">Tree </span>והקומפוננטות הקיימות מספקות פונקציונליות שמתאימה למסמך ולא לאפליקציה<span style="font-family: Liberation Serif,serif;">. </span>קחו למשל את <span style="font-family: Liberation Serif,serif;">Table, </span>על מנת שהוא ייראה כמו טבלה מודרנית עם אפשרות להזזת עמודות<span style="font-family: Liberation Serif,serif;">, </span>מיונים<span style="font-family: Liberation Serif,serif;">, </span>פילטרים וכו<span style="font-family: Liberation Serif,serif;">' </span>צריך לכתוב קוד רב ובדרך כלל להשתמש בכלל באלמנטים אחרים כמו <span style="font-family: Liberation Serif,serif;">DIV </span>ולא ב<span style="font-family: Liberation Serif,serif;">TABLE </span>של <span style="font-family: Liberation Serif,serif;">HTML. </span>הפריימוורקים הרבים הקיימים מבוססים על קוד <span style="font-family: Liberation Serif,serif;">JavaScript </span>שמבצע מניפולציות על אלמנטים ב<span style="font-family: Liberation Serif,serif;">HTML </span>ו<span style="font-family: Liberation Serif,serif;">&quot;</span>אונסים<span style="font-family: Liberation Serif,serif;">&quot; </span>אותם כך שייראו כמו <span style="font-family: Liberation Serif,serif;">UI </span>נורמלי<span style="font-family: Liberation Serif,serif;">. </span>הדבר היחיד שיכול לשנות את התמונה הוא <span style="font-family: Liberation Serif,serif;">HTML5 </span>אבל יש עוד דרך ארוכה עד שנוכל להשתמש בתקן זה<span style="font-family: Liberation Serif,serif;">. </span>ראשית צריך שהתקן יסגר ויתמך בכל הדפדפנים<span style="font-family: Liberation Serif,serif;">, </span>אחר כך צריך שחברות יפתחו ספריות קומפוננטות מבוססות <span style="font-family: Liberation Serif,serif;">HTML5. </span>ה<span style="font-family: Liberation Serif,serif;">canvas </span>כנראה יספק בסיס מתאים אבל מישהו צריך לפתח ולפרסם פקדים שיהיה ניתן לעבוד איתם<span style="font-family: Liberation Serif,serif;">. </span>כך שבנתיים מבחינת טכנולוגיות זמינות ובוגרות <span style="font-family: Liberation Serif,serif;">FLEX </span>היא האופציה הטובה ביותר לפיתוח מהיר של ממשקים גרפיים עשירים<span style="font-family: Liberation Serif,serif;">.</span></p>
<p style="margin-bottom: 0in; font-style: normal; text-decoration: none;" align="RIGHT">
<p style="margin-bottom: 0in; font-style: normal; text-decoration: none;" align="RIGHT">
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%94%d7%a2%d7%93%d7%a4%d7%95%d7%aa%d7%99%d7%99-%d7%94%d7%90%d7%99%d7%a9%d7%99%d7%95%d7%aa-%d7%9c%d7%97%d7%91%d7%99%d7%9c%d7%aa-%d7%94%d7%92%d7%90%d7%95%d7%95%d7%94-%d7%94%d7%9e%d7%95%d7%a9%d7%9c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8235;העברת טופס לXML מAdobe Flex ActionScript3 לJava ובחזרה&#8236;</title>		<link>http://www.j2ee.co.il/%d7%94%d7%a2%d7%91%d7%a8%d7%aa-%d7%98%d7%95%d7%a4%d7%a1-%d7%9cxml-%d7%9eadobe-flex-actionscript3-%d7%9cjava-%d7%95%d7%91%d7%97%d7%96%d7%a8%d7%94/</link>
		<comments>http://www.j2ee.co.il/%d7%94%d7%a2%d7%91%d7%a8%d7%aa-%d7%98%d7%95%d7%a4%d7%a1-%d7%9cxml-%d7%9eadobe-flex-actionscript3-%d7%9cjava-%d7%95%d7%91%d7%97%d7%96%d7%a8%d7%94/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 20:10:50 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>
		<category><![CDATA[פרויקטי קוד פתוח שפיתחתי]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[Adobe Flex]]></category>
		<category><![CDATA[Bean]]></category>
		<category><![CDATA[HTTP]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[Web Service]]></category>
		<category><![CDATA[XML]]></category>
		<category><![CDATA[יועץ]]></category>
		<category><![CDATA[מתכנת]]></category>
		<category><![CDATA[עצמאי]]></category>
		<category><![CDATA[פרילנסר]]></category>

		<guid isPermaLink="false">http://www.shefertech.com/?p=97</guid>
		<description><![CDATA[&#8235;כמתכנת FLEX פרילנסר עצמאי, מצאתי מקרים בהם הלקוח לא עובד בFramework מסודר לתקשורת Client-Server. במקרים כאלה לעיתים יש צורך לעשות Serialize לטופס ולהפוך אותו לפורמט גנרי כמו XML על מנת לשלוח אותו לשרת כלשהו (למשל J2EE Server) ע&#34;י פרוטוקול כמו HTTP או SOAP Web Service. הנה פונקציה פשוטה שכתבתי שלוקחת טופס FLEX, מבצעת עליו סריקה [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>כמתכנת FLEX פרילנסר עצמאי, מצאתי מקרים בהם הלקוח לא עובד בFramework מסודר לתקשורת Client-Server. במקרים כאלה לעיתים יש צורך לעשות Serialize לטופס ולהפוך אותו לפורמט גנרי כמו XML על מנת לשלוח אותו לשרת כלשהו (למשל J2EE Server) ע&quot;י פרוטוקול כמו HTTP או SOAP Web Service. הנה פונקציה פשוטה שכתבתי שלוקחת טופס FLEX, מבצעת עליו סריקה רקורסיבית ושולפת את כל השדות שלו (TextInput) ומחזירה XML עם רשימת השדות והערכים שלהם.<br />
כמו כן מצורף קוד בג'אווה שלוקח XML כזה והופך אותו לJava Bean ובמידה ובBean יש properties תואמים הם יקבלו את ערכי השדות. יש גם פונקציה הפוכה שלוקחת XML וממלאת את השדות בטופס FLEX.</p>
<p>יש להוסיף את הספריות האלה לקוד:</p>
<pre class="brush: as3;">
	import flash.utils.Dictionary;
	import mx.controls.TextInput;
	import mx.core.Container;
</pre>
<p>הנה הפונקציה (למעשה שתי פונקציות) שלוקחת טופס ומחזירה XML:</p>
<pre class="brush: as3;">
		public static function viewToXml(className:String, view:Container):String{
			var xml:XML = &lt;bean class={className}&gt;&lt;/bean&gt;;
			var xmlFinal:XML = addControlsToXml(xml, view);
			return '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;' + xmlFinal;
		}

		private static function addControlsToXml(xml:XML, view:Container):XML{
			var controls:Array = view.getChildren();
			for (var i:int; i&lt;controls.length; i++){
				if (controls[i] is TextInput){
					var component:TextInput = controls[i] as TextInput;
					var child:XML = &lt;property name={component.id}&gt;{component.text}&lt;/property&gt;;
					xml.appendChild(child);
				}
				if (controls[i] is Container){
					addControlsToXml(xml, controls[i] as Container);
				}
			}
			return xml;
		}
</pre>
<p>והפונקציה שמקבלת XML וממלאת את הטופס בהתאם:</p>
<pre class="brush: as3;">
		private static function xmlToView(props:Dictionary, view:Container):void{
			var controls:Array = view.getChildren();
			for (var i:int; i&lt;controls.length; i++){
				if (controls[i] is TextInput){
					var component:TextInput = controls[i] as TextInput;
					if (props[component.id] != null){
						component.text = props[component.id];
					}
				}
				if (controls[i] is Container){
					xmlToView(props, controls[i] as Container);
				}
			}
		}
</pre>
<p>ועכשיו לקוד בג'אווה. תצטרכו להוסיף את הספריות הבאות:</p>
<pre class="brush: java;">
import java.io.ByteArrayInputStream;
import java.io.StringWriter;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.Map;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathFactory;

import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
</pre>
<p>קבלת XML והפיכתו לJava Bean:</p>
<pre class="brush: java;">
	public static Object xmlToBean(String xmlStr){
		DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = null;
		try {
			documentBuilder = documentBuilderFactory.newDocumentBuilder();
			Document doc = documentBuilder.parse(new ByteArrayInputStream(xmlStr.getBytes(&quot;UTF-8&quot;)));
			XPath xpath = XPathFactory.newInstance().newXPath();
			Node bean = (Node)xpath.evaluate(&quot;//bean&quot;, doc, XPathConstants.NODE);
			if (bean != null){
				NamedNodeMap attributes = bean.getAttributes();
				Node cls = attributes.getNamedItem(&quot;class&quot;);
				String clsName = cls.getNodeValue();
				Object obj = Class.forName(clsName).newInstance();
				NodeList props = (NodeList)xpath.evaluate(&quot;//property&quot;, doc, XPathConstants.NODESET);
				Class cl = obj.getClass();
				for (int i=0; i&lt;props.getLength(); i++){
					String propName = props.item(i).getAttributes().getNamedItem(&quot;name&quot;).getNodeValue();
					String propValue = props.item(i).getTextContent();
					String ch = propName.substring(0, 1).toUpperCase();
					String methodName = &quot;set&quot; + ch + propName.substring(1);
					Method[] methods = cl.getMethods();
					for (Method method : methods){
						if (method.getName().equals(methodName)){
							Class[] paramTypes = method.getParameterTypes();
							for (Class param : paramTypes){
								if (param.getName().equals(&quot;java.lang.String&quot;)){
									method.invoke(obj, propValue);
								}
								else if(param.getName().equals(&quot;int&quot;)){
									method.invoke(obj, Integer.valueOf(propValue));
								}
								else if(param.getName().equals(&quot;long&quot;)){
									method.invoke(obj, Long.valueOf(propValue));
								}
							}
						}
					}
				}
				return obj;
			}
		} catch (Exception e) {
			log.error(e);
		}
		return null;
	}
</pre>
<p>והחלק האחרון: לקחת Java Bean ולהפוך אותו לXML:</p>
<pre class="brush: java;">
	public static String beanToXml(Object obj){
			DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
			DocumentBuilder documentBuilder = null;
			try {
				documentBuilder = documentBuilderFactory.newDocumentBuilder();
			} catch (ParserConfigurationException e) {
				log.error(e);
			}
			Document doc = documentBuilder.newDocument();
			Element rootElement = doc.createElement(&quot;bean&quot;);
			rootElement.setAttribute(&quot;class&quot;, obj.getClass().getName());
			Method[] getters = obj.getClass().getMethods();
			for (Method getter : getters){
					if (getter.getName().indexOf(&quot;get&quot;) == 0)
					if (getter.getParameterTypes().length == 0)
					if (!getter.getName().equals(&quot;getClass&quot;)){
						StringBuffer prop = new StringBuffer(getter.getName().substring(3));
						String ch = prop.substring(0, 1).toLowerCase();
						prop.replace(0, 1, ch);

						Element propElement = doc.createElement(&quot;property&quot;);
						propElement.setAttribute(&quot;name&quot;, prop.toString());
						try {
							propElement.setTextContent(getter.invoke(obj).toString());
						} catch (Exception e) {
							e.printStackTrace();
						}
						rootElement.appendChild(propElement);
					}
			}
			doc.appendChild(rootElement);

			StringWriter stw = new StringWriter();
            Transformer serializer;
			try {
				serializer = TransformerFactory.newInstance().newTransformer();
				serializer.transform(new DOMSource(doc), new StreamResult(stw));
			} catch (Exception e) {
				log.error(e);
			}
            return stw.toString();
	}
</pre>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%94%d7%a2%d7%91%d7%a8%d7%aa-%d7%98%d7%95%d7%a4%d7%a1-%d7%9cxml-%d7%9eadobe-flex-actionscript3-%d7%9cjava-%d7%95%d7%91%d7%97%d7%96%d7%a8%d7%94/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8235;מפתח פרילנסר: עשה ואל תעשה בעבודה מול לקוח&#8236;</title>		<link>http://www.j2ee.co.il/%d7%a2%d7%a9%d7%94-%d7%95%d7%90%d7%9c-%d7%aa%d7%a2%d7%a9%d7%94-%d7%91%d7%a2%d7%91%d7%95%d7%93%d7%94-%d7%9e%d7%95%d7%9c-%d7%9c%d7%a7%d7%95%d7%97/</link>
		<comments>http://www.j2ee.co.il/%d7%a2%d7%a9%d7%94-%d7%95%d7%90%d7%9c-%d7%aa%d7%a2%d7%a9%d7%94-%d7%91%d7%a2%d7%91%d7%95%d7%93%d7%94-%d7%9e%d7%95%d7%9c-%d7%9c%d7%a7%d7%95%d7%97/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 07:25:48 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[מאמרים טכנולוגיים]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JBoss]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[אפיון]]></category>
		<category><![CDATA[יועץ]]></category>
		<category><![CDATA[לקוחות]]></category>
		<category><![CDATA[עצמאי]]></category>
		<category><![CDATA[פיתוח]]></category>
		<category><![CDATA[פרילנסר]]></category>
		<category><![CDATA[פרילנסרים]]></category>
		<category><![CDATA[תוכנה]]></category>
		<category><![CDATA[תיכנות]]></category>

		<guid isPermaLink="false">http://d26156.u27.oyo.co.il/?p=36</guid>
		<description><![CDATA[&#8235;להבין את צרכי הלקוח אחד הדברים החשובים לפרילנסר בתחום הפיתוח הוא להבין את צרכי הלקוח. הרבה פעמים דברים שלא היו מתקבלים בחברות טכנולוגיות מקובלים אצל הלקוחות. לקוח אחד ביקש להתממשק מול מערכת הERP שלו כך שכל עדכון בERP בטבלה מסויימת יעדכן אוטומטית את האפליקציה שלו. האופן שבו הוא עשה את זה היה שהERP הנפיק אחת [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p><strong>להבין את צרכי הלקוח</strong><br />
אחד הדברים החשובים לפרילנסר בתחום הפיתוח הוא להבין את צרכי הלקוח. הרבה פעמים דברים שלא היו מתקבלים בחברות טכנולוגיות מקובלים אצל הלקוחות. לקוח אחד ביקש להתממשק מול מערכת הERP שלו כך שכל עדכון בERP בטבלה מסויימת יעדכן אוטומטית את האפליקציה שלו. האופן שבו הוא עשה את זה היה שהERP הנפיק אחת לשעה קובץ טקסט עם רשימת השינויים ושמר אותה בתיקיה משותפת. באפליקציה החיצונית היה Timer שפעם בשעה קרא את הקובץ וייבא את הנתונים. היועצים הציעו להחליף את המערכת בטענה שזו שיטה גרועה. הם המליצו על SOA, Web Services שימוש במוצרי תווכה שונים ושרתי אינטגרציה. אבל לשאלה הפשוטה של הלקוח לאף אחד לא היה מענה: מה רע במצב הקיים?</p>
<p><strong>(לא) להיצמד רק למה שמכירים</strong><br />
פרילנסרים ועצמאים רבים נוהגים לפתח בטכנולוגיות שהם מכירים ואוהבים. הרבה פעמים אני מזהה &quot;טביעת אצבע&quot; של מפתח שנצמד לסביבה מסויימת. איש מקצוע אמיתי מסוגל תעלות מעל ההעדפות האישיות שלו ולתכנן את הפתרון הטוב ביותר ללקוח בהתבסס על הכלים והטכנולוגיות המתאימות ביותר. אין סיבה לבחור בדוט נט כשאפשר לפתח אתר תוכן בPHP עם פלטפורמת ניהול תוכן מוכנה במהירות רבה יותר ובעלויות נמוכות יותר.</p>
<p><strong>הכנסת טכנולוגיות מגוונות מדי לארגון</strong><br />
עוד בעיה נפוצה היא שיועצים עצמאים נוטים למצוא את הכלי המתאים ביותר לפתרון הספציפי מבלי להתחשב באסטרטגית הIT של הארגון. בחברה מסויימת היה ERP של SAP, כמה אפליקציות דוט נט, בסיס נתונים של אורקל ופורטל ארגוני של SAP Portal. כשהם ביקשו לפתח אפליקציה תפעולית מסויימת, הקבלן בחר בOracle JDeveloper על שרתי Oracle IAS לפיתוח התוכנה. התוכנה היתה תוכנה קטנה ששרתה צורך מסויים והבעיה נוצרה כשבארגון &quot;צמח&quot; לפתע סט שרתי חדשים, סביבת פיתוח, ופלטפורמה שצריך לתחזק. זה דרש הקצאה של כוח אדם, יועצים, חומרה ורשיונות תוכנה רק בשביל אותה אפליקציה. אז אומנם הפיתוח הראשוני היה מהיר אבל התחזוקה רבת השנים שלא לדבר על שינויים ותיקונים גררו את הלקוח להוצאות כבדות ומיותרות. הפתרון הנכון היה לבחור באחת הפלטפורמות שנמצאות כבר בארגון ולפתח על בסיסה.</p>
<p><strong>עומס טכנולוגיות – Over Kill</strong><br />
בעיה נוספת שמאפיינת בעיקר את הפרילנסרים חובבי הטכנולוגיות והגאדג'טים הוא שימוש מופרז בכלים מתוחכמים שבסופו של יום לא מספקים ערך מוסף ללקוח או אפילו פוגעים בו. הרבה פעמים מתכנתים רוצים להשתמש בטכנולוגיות המשוכללות והנוצצות ביותר כשמספיק משהו הרבה יותר בסיסי. למשל, שימוש נפוץ בשרתי JBoss ובJ2EE מנפחים פרוייקט ג'אווה כשהרבה פעמים כל מה שצריך הוא Servlet Container כמו Tomcat בשילוב עם Hibernate. אין טעם להשתמש בשרת אפליקציות כבד אם לא מתכוונים לנצל את הפונקציונליות שלו.</p>
<p><strong>יותר מדי גנריות</strong><br />
נושא שמאפיין במיוחד פרילנסרים שהגיעו מחברות הי-טק ועברו לשוק הIT והאנטרפרייז. בחברות הי-טק בדרך כלל מפתחים מוצרים ופלטפורמות שמיועדים למגוון גדול של לקוחות. לכן מקפידים לשמור על גמישות מקסימאלית, יכולת הרחבה, ומוצר שניתן להכניס בו שינויים עתידיים. הרבה פעמים זה גורר דיזיין מסובך שכולל רמות הפשטה והפרדה בין השכבות השונות. צריך לזכור שבשורה התחתונה הלקוח רוצה אפליקציה עובדת ורוב הסיכויים שהוא ישאיר אותה כפי שהיא ל7-8 שנים הבאות. אין טעם לפתח מודולים ושכבות מעבר לסטנדרטים המקובלים (MVC וכו'). גם אם בסוף יהיה צורך להכניס שינויים, תמיד אפשר להתאים את הקוד והסיכוי לא שווה את הסיכון (או את הבזבוז ליתר דיוק).</p>
<p><strong>הצמדות לאפיון</strong><br />
לקוחות מצפים מהיועצים החיצוניים להגדיל ראש באופן סביר ומידתי. בדרך כלל כשניגשים לפתח מערכת מידע בארגון גדול, מקבלים אפיון מפורט לפי סטנדרטים קבועים. במהלך הפיתוח כמעט תמיד מתגלים טעויות באפיון: מסכים לא הגיוניים, מידע חסר, פיצ'רים חסרים. הדרך הנכונה לטפל בנושאים הללו היא להעלות אותם ולא להתעלם מהם. צריך לזכור שאת האפיונים כותבים מנתחי מערכות שלא תמיד רואים את התמונה המלאה בעת שלב התכנון. גם נתקלים ברעיון שיכול לחסוך זמן, או בדרכים לשיפור כדאי להעלות אותם.</p>
<p><strong>יצירתיות יתר</strong><br />
מאידך, מתכנתים עצמאים רבים אוהבים לעבוד באופן עצמאי כשהם קובעים בעצמם איך יראה המוצר המוגמר. זו טעות. הרבה פעמים אני נתקל במשפטים כמו &quot;אל תדאג, אני יודע בדיוק מה אתה צריך זה ייראה סוף הדרך&quot;. צריך לזכור שמה שנראה הגיוני למתכנת לא בהכרח מתאים למשתמשי הקצה שבדרך כלל הם בעלי רקע שונה. אפילו אנשי מערכות המידע בתוך הארגון (הלקוח) לא תמיד מצליח להוציא מוצר שמתאים למשתמשים אבל לפחות הוא קרוב יותר לשטח מאשר המפתח.</p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%a2%d7%a9%d7%94-%d7%95%d7%90%d7%9c-%d7%aa%d7%a2%d7%a9%d7%94-%d7%91%d7%a2%d7%91%d7%95%d7%93%d7%94-%d7%9e%d7%95%d7%9c-%d7%9c%d7%a7%d7%95%d7%97/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8235;אודות שלמה שוורץ&#8236;</title>		<link>http://www.j2ee.co.il/%d7%90%d7%95%d7%93%d7%95%d7%aa-%d7%a9%d7%9c%d7%9e%d7%94-%d7%a9%d7%95%d7%95%d7%a8%d7%a5/</link>
		<comments>http://www.j2ee.co.il/%d7%90%d7%95%d7%93%d7%95%d7%aa-%d7%a9%d7%9c%d7%9e%d7%94-%d7%a9%d7%95%d7%95%d7%a8%d7%a5/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 19:25:35 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[ActionScript]]></category>
		<category><![CDATA[FLEX]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[NetWeaver]]></category>
		<category><![CDATA[Portal]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[אודות]]></category>
		<category><![CDATA[ארכיטקט]]></category>
		<category><![CDATA[ג'אווה]]></category>
		<category><![CDATA[יועץ]]></category>
		<category><![CDATA[מפתח]]></category>
		<category><![CDATA[מתכנת]]></category>
		<category><![CDATA[סאפ]]></category>
		<category><![CDATA[עצמאי]]></category>
		<category><![CDATA[פרילנסר]]></category>
		<category><![CDATA[שלמה שוורץ]]></category>

		<guid isPermaLink="false">http://d26156.u27.oyo.co.il/?p=8</guid>
		<description><![CDATA[&#8235;בגיל 10 אבא שלי הביא הביתה את המחשב הראשון שלנו. זה היה אפל 2 עם מסך CRT שחור לבן (ירוק ליתר דיוק). למדתי לתכנת עליו בביסיק ומאז היה לי ברור שבעתיד אעסוק בתחום. בגיל התיכון התחלתי לתכנת ברצינות, בהתחלה בפסקל ואחר כך בC ובC++. היה זה בגיל 16 שמכרתי את התוכנה הראשונה שלי: פיתחתי תוכנת [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p><img class="size-full wp-image-46 alignright" title="shlomo_schwarcz" src="http://www.shefertech.com/wp-content/uploads/2009/06/shlomo_schwarcz1.jpg" alt="shlomo_schwarcz" /></p>
<p>בגיל 10 אבא שלי הביא הביתה את המחשב הראשון שלנו. זה היה אפל 2 עם מסך CRT שחור לבן (ירוק ליתר דיוק). למדתי לתכנת עליו בביסיק ומאז היה לי ברור שבעתיד אעסוק בתחום. בגיל התיכון התחלתי לתכנת ברצינות, בהתחלה בפסקל ואחר כך בC ובC++. היה זה בגיל 16 שמכרתי את התוכנה הראשונה שלי: פיתחתי תוכנת ניהול עבור חברת הובלות קטנה. הקוד נכתב בC על קומפיילר של בורלנד לwindows. הממשק נכתב בWIN16 API ורץ על Windows 3.11. האמצעים היו פרימיטיבים: ברוב הבתים לא היה אינטרנט נגיש ואת רוב התיכנות נאלצתי ללמוד מכמה ספרים ומקבצי הHELP שהגיעו עם הקומפיילר. לא ידעתי מה זה דאטהבייס וכל המידע נשמר בקבצי ASCII על הדיסק. התוכנה השתמשה ברשימות מקושרות ועצים בינארים כדי לאחסן את הרשומות בזיכרון וכל זאת על מחשב 486 מוגבל יחסית. אבל זה עבד, ואפילו עבד טוב.</p>
<p>לאחר הצבא התחלתי לעבוד בחברת סטראטאפ קטנה בשם טופטיר. זמן קצר לאחר מכן החברה נמכרה לSAP ב400 מליון דולר והמשכתי לעבוד בסאפ למעלה מ4 שנים. כשעזבתי את סאפ, הקמתי עסק משלי בשם &quot;שפר מערכות&quot; (ומכאן השם של האתר הזה) ועבדתי כמתכנת ויועץ פרילנסר עצמאי עבור ארגונים שונים. בין לקוחותיי: בתי הזיקוק, פז, הנוער העובד והלומד, GigaSpaces, מכללת אינטרביט, ועוד. לאחר מכן הצטרפתי לחברת דנשיר מערכות על מנת להקים את חטיבת הJava והNetWeaver ועמדתי בראש הקבוצה למעלה משנה כשאנחנו מבצעים פרוייקטים עבור חברות שונות: נטפים, בתי זיקוק, אוניברסיטת חיפה, מירס, תעשייה אווירית, CNW ועוד. התחנה הבאה היתה חברת אינפורמטיקה שם מלאתי תפקיד של מתכנת בכיר &#8211; Principle Software Engineer.</p>
<p>ב2010 הקמתי חברת <a href="http://megasoft.co.il">מגהסופט </a>ומאז אני מכהן כמנכ&quot;ל וכמובן ממשיך לפתח ולכתוב קוד במסגרת החברה. <a href="http://megasoft.co.il">MegaSoft </a>עוסקת בפיתוח עבור ארגונים, חברות הי-טק וסטארטאפים במגוון תחומים ובעיקר בג'אווה, Flex, מובייל ופלטפורמות קוד פתוח.</p>
<p>חוץ מזה אני תמיד מחפש את ההרפתקה הבאה ואשמח לקבל פניות, הצעות, הערות והארות.</p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%90%d7%95%d7%93%d7%95%d7%aa-%d7%a9%d7%9c%d7%9e%d7%94-%d7%a9%d7%95%d7%95%d7%a8%d7%a5/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

