<?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/category/%d7%9b%d7%9c%d7%9c%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;איך עובד oAuth 2.0? דוגמא מFacebook API&#8236;</title>		<link>http://www.j2ee.co.il/%d7%90%d7%99%d7%9a-%d7%a2%d7%95%d7%91%d7%93-oauth-2-0-%d7%93%d7%95%d7%92%d7%9e%d7%90-%d7%9efacebook-api/</link>
		<comments>http://www.j2ee.co.il/%d7%90%d7%99%d7%9a-%d7%a2%d7%95%d7%91%d7%93-oauth-2-0-%d7%93%d7%95%d7%92%d7%9e%d7%90-%d7%9efacebook-api/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 09:46:29 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>

		<guid isPermaLink="false">http://www.j2ee.co.il/?p=167</guid>
		<description><![CDATA[&#8235;אתרים שונים מספקים API חיצוני על מנת לאפשר למפתחים לכתוב אפליקציות ותוכנות המתממשקות לאתר. הידועים שבהם: פייסבוק, גוגל, טוויטר וכו' מאפשרות למפתחים חיצוניים לגשת לפרופיל של המשתמש הרשום, לבצע פעולות בשמו, לקבל מידע, לבצע עדכונים וכו'. על מנת לנהל את ההתממשקות וההרשאות של משתמשי הAPI נעשה שימוש במנגנון אישור בשם oAuth. במאמר זה נסקור את [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>אתרים שונים מספקים API חיצוני על מנת לאפשר למפתחים לכתוב אפליקציות ותוכנות המתממשקות לאתר. הידועים שבהם: פייסבוק, גוגל, טוויטר וכו' מאפשרות למפתחים חיצוניים לגשת לפרופיל של המשתמש הרשום, לבצע פעולות בשמו, לקבל מידע, לבצע עדכונים וכו'. על מנת לנהל את ההתממשקות וההרשאות של משתמשי הAPI נעשה שימוש במנגנון אישור בשם oAuth. במאמר זה נסקור את הטכניקה הזו ואת היישום שלה בפועל בAPI של Facebook. נושא זה הכרחי כמעט לכל Facebook Application Developer ולמעשה לכל מי שרוצה לפתח אפליקצייה לפייסבוק או אתרים דומים (גוגל, טוויטר ועוד).</p>
<p>כאשר אפליקציה כלשהי פונה לפייסבוק ומבקשת לבצע פעולה על פרופיל של משתמש, פייסבוק צריכים להבטיח שהמשתמש אישר את הפעולה. הדרך הפשוטה ביותר זה שהAPI יעביר את המשתמש והסיסמה של המשתמש וכך פייסבוק יידעו שהאתר מורשה. כמובן שזה מחייב שהאתר החיצוני (משתמש הAPI) יבקש את המשתמש והסיסמה של משתמש הפייסבוק. זה גורר בעיית אבטחה חמורה שכן הסיסמה נשמרת באתר חיצוני, האתר יכול עם הסיסמה הזו לבצע כל פעולה שירצה, הסיסמה עלולה להיות לא מוגנת וכו'.</p>
<p dir="RTL">הדרך לפתרון שמציע oAuth עובד בצורה הבאה:</p>
<p dir="RTL">מפתחי האתר כותבים אפליקציית פייסבוק ריקה (ללא תוכן). באפליקציה זו מגדירים את הדברים הבאים:</p>
<ul>
<li>אילו הרשאות האפליקציה מבקשת מהמשתמש? (צפייה, עדכון, וכו')</li>
<li>הדומיין של האתר mydomain.com</li>
</ul>
<p dir="RTL">כשהמשתמש רוצה לאפשר לאתר שימוש בAPI, האתר מפעיל לינק בדפדפן במבנה הבא:</p>
<p>https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&#038;redirect_uri=YOUR_URL&#038;scope=email,read_stream</p>
<p dir="RTL">הפעלת הלינק הזה על ידי הדפדפן (redirect פשוט) תעלה למשתמש את המסך כניסה לפייסבוק:</p>
<p><img src="http://developers.facebook.com/attachment/auth_login.png" alt="" /></p>
<p dir="RTL">מסך זה  חשוב מאוד, הוא מאפשר את הlogin לFacebook כך שהאימות נעשה בין המשתמש לפייסבוק אבל בשום שלב המשתמש לא מוסר את הפרטים שלו לאתר החיצוני.</p>
<p dir="RTL">לאחר האימות, פייסבוק יבקש מהמשתמש לאשר את התקנת האפליקציה בפרופיל. מסך זה יציג למשתמש את ההרשאות שהאפליקציה מבקשת כפי שהוגדרו בלינק, והמשתמש יוכל להחליט אם לאשר או לדחות.</p>
<p><img src="http://developers.facebook.com/attachment/auth_authz.png" alt="" /></p>
<p dir="RTL">כעת פייסבוק יודע שהמשתמש אישר לאתר לבצע פעולות מסויימות.</p>
<p dir="RTL">במידה והמשתמש אישר את האפליקציה, פייסבוק יעשו redirect לכתובת שצויינה בבקשה המקורית (הועבר כפרמטר בURL). הURL שפייסבוק שולח יכלול פרמטר בשם code. עם הפרמטר הזה נפנה לפייסבוק על מנת לקבל את הaccess_token, שהוא הקוד הסופי שמאפשר קריאות API לפייסבוק.</p>
<p dir="RTL">https://graph.facebook.com/oauth/access_token?client_id=YOUR_APP_ID&amp;redirect_uri=YOUR_URL&amp;client_secret=YOUR_APP_SECRET&amp;code=THE_CODE_FROM_ABOVE</p>
<p dir="RTL">פייסבוק יאשר את הקוד וישלח לכתובת שמצויינת בredirect_uri את התשובה: access_token שייראה בערך כך:</p>
<p><img src="http://developers.facebook.com/attachment/auth_token.png" alt="" /></p>
<p dir="RTL">הקוד הזה ישמש אותנו לקריאות API. כל קריאת API (מבוססת REST) מאפשרת שירשור של הaccess_token כפרמטר. כך אנו יכולים לבצע קריאות לפייסבוק ופעולות על משתמש מסויים, לאחר שאישר אותנו מבלי לבקש פרטי משתמש. פייסבוק יאפשרו פעולות רק מתוך הדומיין שהוגדר באפליקציה כדי למנוע מצבים בסגנון cross site scripting. הaccess_token תקף למשך הזמן שהוגדר לו. אפשר גם ליצור token שאינו פג לעולם, תלוי בהגדרות.</p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%90%d7%99%d7%9a-%d7%a2%d7%95%d7%91%d7%93-oauth-2-0-%d7%93%d7%95%d7%92%d7%9e%d7%90-%d7%9efacebook-api/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8235;בניית פרוייקט עם Spring MVC, Hibernate, Maven&#8236;</title>		<link>http://www.j2ee.co.il/%d7%91%d7%a0%d7%99%d7%99%d7%aa-%d7%a4%d7%a8%d7%95%d7%99%d7%99%d7%a7%d7%98-%d7%a2%d7%9d-spring-mvc-hibernate-maven/</link>
		<comments>http://www.j2ee.co.il/%d7%91%d7%a0%d7%99%d7%99%d7%aa-%d7%a4%d7%a8%d7%95%d7%99%d7%99%d7%a7%d7%98-%d7%a2%d7%9d-spring-mvc-hibernate-maven/#comments</comments>
		<pubDate>Wed, 30 Nov 2011 08:41:28 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>

		<guid isPermaLink="false">http://www.j2ee.co.il/?p=160</guid>
		<description><![CDATA[&#8235;בפוסט זה אדגים כיצד לבנות פרוייקט end-to-end בטכנולוגיות: Spring MVC, Hibernate קומפילציה באמצעות Maven והרצה כWAR על Tomcat או כל שרת אפליקציות ג'אווה אחר. הפרוייקט יכלול בסיס נתונים MySQL עם טבלה השומרת פרטי לקוחות, דף JSP שמציג נתונים מהטבלה, שרות REST מבוסס Spring MVC לקבלה ושליחת נתונים ופעולות מול הDatabase באמצעות Hibernate. ראשית נקים את [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>בפוסט זה אדגים כיצד לבנות פרוייקט end-to-end בטכנולוגיות: Spring MVC, Hibernate קומפילציה באמצעות Maven והרצה כWAR על Tomcat או כל שרת אפליקציות ג'אווה אחר. הפרוייקט יכלול בסיס נתונים MySQL עם טבלה השומרת פרטי לקוחות, דף JSP שמציג נתונים מהטבלה, שרות REST מבוסס Spring MVC לקבלה ושליחת נתונים ופעולות מול הDatabase באמצעות Hibernate.</p>
<p>ראשית נקים את התשתיות באמצעות הגדרת הpom.xml של הMaven. למען הנוחות, הפרוייקט יכלול מודול יחיד עם כל הקוד. מומלץ לפצל פרוייקטים אמיתיים למספר מודולים כמו: persistence, dao, web וכו'.</p>
<p>לגרסה האנגלית: <a href="http://megasoft.co.il/index.php?option=com_content&amp;view=article&amp;id=19:maven-spring-hibernate-web-tutorial&amp;catid=2:uncategorised&amp;Itemid=150">Maven, Spring, Hibernate Web Tutorial</a></p>
<p>להלן הקוד של הpom.xml:</p>
<pre class="brush: xml;">

&lt;!--?xml version=&quot;1.0&quot;?--&gt;
&lt;project xsi:schemalocation=&quot;http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd&quot; xmlns=&quot;http://maven.apache.org/POM/4.0.0&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot;&gt;
    &lt;modelversion&gt;4.0.0&lt;/modelversion&gt;

    &lt;repositories&gt;
        &lt;repository&gt;
            &lt;id&gt;jboss-public-repository-group&lt;/id&gt;
            &lt;name&gt;JBoss Public Repository Group&lt;/name&gt;
            &lt;url&gt;https://repository.jboss.org/nexus/content/repositories/releases/&lt;/url&gt;
        &lt;/repository&gt;

        &lt;repository&gt;
            &lt;id&gt;SpringSource Enterprise Bundle Repository – External Bundle Milestones&lt;/id&gt;
            &lt;url&gt;http://repository.springsource.com/maven/bundles/milestone&lt;/url&gt;
        &lt;/repository&gt;
        &lt;repository&gt;
            &lt;id&gt;SpringSource Enterprise Bundle Repository – SpringSource Bundle Releases&lt;/id&gt;
            &lt;url&gt;http://repository.springsource.com/maven/bundles/release&lt;/url&gt;
        &lt;/repository&gt;
        &lt;repository&gt;
            &lt;id&gt;SpringSource Enterprise Bundle Repository – External Bundle Releases&lt;/id&gt;
            &lt;url&gt;http://repository.springsource.com/maven/bundles/external&lt;/url&gt;
        &lt;/repository&gt;

        &lt;repository&gt;
            &lt;id&gt;Maven&lt;/id&gt;
            &lt;url&gt;http://repo1.maven.org/maven2/&lt;/url&gt;
        &lt;/repository&gt;

    &lt;/repositories&gt;

    &lt;groupid&gt;il.co.megasoft&lt;/groupid&gt;
    &lt;artifactid&gt;spring-seminar&lt;/artifactid&gt;
    &lt;packaging&gt;war&lt;/packaging&gt;
    &lt;version&gt;app&lt;/version&gt;
    &lt;name&gt;spring-seminar&lt;/name&gt;
    &lt;url&gt;http://maven.apache.org&lt;/url&gt;
    &lt;properties&gt;
        &lt;maven.compiler.source&gt;1.5&lt;/maven.compiler.source&gt;
        &lt;maven.compiler.target&gt;1.5&lt;/maven.compiler.target&gt;
        &lt;webappdirectory&gt;${project.build.directory}/${project.build.finalName}&lt;/webappdirectory&gt;
        &lt;project.build.sourceencoding&gt;UTF-8&lt;/project.build.sourceencoding&gt;
        &lt;hibernate.version&gt;3.6.0.Final&lt;/hibernate.version&gt;
        &lt;org.springframework.version&gt;3.0.5.RELEASE&lt;/org.springframework.version&gt;
    &lt;/properties&gt;
    &lt;dependencies&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;junit&lt;/groupid&gt;
            &lt;artifactid&gt;junit&lt;/artifactid&gt;
            &lt;version&gt;4.8.1&lt;/version&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.apache.openejb&lt;/groupid&gt;
            &lt;artifactid&gt;commons-dbcp-all&lt;/artifactid&gt;
            &lt;version&gt;1.3&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;taglibs&lt;/groupid&gt;
            &lt;artifactid&gt;standard&lt;/artifactid&gt;
            &lt;version&gt;1.1.2&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;javax.servlet&lt;/groupid&gt;
            &lt;artifactid&gt;jstl&lt;/artifactid&gt;
            &lt;version&gt;1.1.2&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;net.sf.ehcache&lt;/groupid&gt;
            &lt;artifactid&gt;ehcache&lt;/artifactid&gt;
            &lt;version&gt;[2.0.0,]&lt;/version&gt;
            &lt;type&gt;pom&lt;/type&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.hibernate&lt;/groupid&gt;
            &lt;artifactid&gt;hibernate-c3p0&lt;/artifactid&gt;
            &lt;version&gt;3.3.1.GA&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;com.google.gwt&lt;/groupid&gt;
            &lt;artifactid&gt;gwt-servlet&lt;/artifactid&gt;
            &lt;version&gt;2.2.0&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;com.google.gwt&lt;/groupid&gt;
            &lt;artifactid&gt;gwt-user&lt;/artifactid&gt;
            &lt;version&gt;2.2.0&lt;/version&gt;
            &lt;scope&gt;provided&lt;/scope&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;commons-lang&lt;/groupid&gt;
            &lt;artifactid&gt;commons-lang&lt;/artifactid&gt;
            &lt;version&gt;2.6&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.hibernate&lt;/groupid&gt;
            &lt;artifactid&gt;hibernate-core&lt;/artifactid&gt;
            &lt;version&gt;${hibernate.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.hibernate&lt;/groupid&gt;
            &lt;artifactid&gt;hibernate-entitymanager&lt;/artifactid&gt;
            &lt;version&gt;${hibernate.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.hibernate&lt;/groupid&gt;
            &lt;artifactid&gt;hibernate-validator&lt;/artifactid&gt;
            &lt;version&gt;4.1.0.Final&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;mysql&lt;/groupid&gt;
            &lt;artifactid&gt;mysql-connector-java&lt;/artifactid&gt;
            &lt;version&gt;5.1.16&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-context&lt;/artifactid&gt;
            &lt;version&gt;3.0.0.RELEASE&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
            &lt;exclusions&gt;
                &lt;exclusion&gt;
                    &lt;groupid&gt;commons-logging&lt;/groupid&gt;
                    &lt;artifactid&gt;commons-logging&lt;/artifactid&gt;
                &lt;/exclusion&gt;
            &lt;/exclusions&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.slf4j&lt;/groupid&gt;
            &lt;artifactid&gt;jcl-over-slf4j&lt;/artifactid&gt;
            &lt;version&gt;1.5.8&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.slf4j&lt;/groupid&gt;
            &lt;artifactid&gt;slf4j-api&lt;/artifactid&gt;
            &lt;version&gt;1.5.8&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.slf4j&lt;/groupid&gt;
            &lt;artifactid&gt;slf4j-log4j12&lt;/artifactid&gt;
            &lt;version&gt;1.5.8&lt;/version&gt;
            &lt;scope&gt;runtime&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;log4j&lt;/groupid&gt;
            &lt;artifactid&gt;log4j&lt;/artifactid&gt;
            &lt;version&gt;1.2.14&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;!-- Hibernate uses slf4j for logging, for our purposes here use the simple
            backend --&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.slf4j&lt;/groupid&gt;
            &lt;artifactid&gt;slf4j-simple&lt;/artifactid&gt;
            &lt;version&gt;1.5.3&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;!-- Hibernate gives you a choice of bytecode providers between cglib and
            javassist --&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;javassist&lt;/groupid&gt;
            &lt;artifactid&gt;javassist&lt;/artifactid&gt;
            &lt;version&gt;3.8.0.GA&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;javax.transaction&lt;/groupid&gt;
            &lt;artifactid&gt;jta&lt;/artifactid&gt;
            &lt;version&gt;1.1&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;javax.transaction&lt;/groupid&gt;
            &lt;artifactid&gt;transaction-api&lt;/artifactid&gt;
            &lt;version&gt;1.1&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-core&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-beans&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-aop&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-context&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;org.springframework.oxm&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;org.springframework.web.servlet&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-context-support&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;com.google.collections&lt;/groupid&gt;
            &lt;artifactid&gt;google-collections&lt;/artifactid&gt;
            &lt;version&gt;1.0-rc4&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-tx&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-jdbc&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-orm&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-web&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-webmvc&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework&lt;/groupid&gt;
            &lt;artifactid&gt;spring-test&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
            &lt;scope&gt;test&lt;/scope&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework.security&lt;/groupid&gt;
            &lt;artifactid&gt;spring-security-parent&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
            &lt;type&gt;pom&lt;/type&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework.security&lt;/groupid&gt;
            &lt;artifactid&gt;spring-security-config&lt;/artifactid&gt;
            &lt;version&gt;${org.springframework.version}&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.springframework.security&lt;/groupid&gt;
            &lt;artifactid&gt;org.springframework.security.web&lt;/artifactid&gt;
            &lt;version&gt;3.0.3.RELEASE&lt;/version&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;commons-fileupload&lt;/groupid&gt;
            &lt;artifactid&gt;commons-fileupload&lt;/artifactid&gt;
            &lt;version&gt;1.2.2&lt;/version&gt;
            &lt;type&gt;jar&lt;/type&gt;
            &lt;scope&gt;compile&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;commons-io&lt;/groupid&gt;
            &lt;artifactid&gt;commons-io&lt;/artifactid&gt;
            &lt;version&gt;1.4&lt;/version&gt;
            &lt;type&gt;jar&lt;/type&gt;
            &lt;scope&gt;compile&lt;/scope&gt;
        &lt;/dependency&gt;
        &lt;dependency&gt;
            &lt;groupid&gt;org.apache.poi&lt;/groupid&gt;
            &lt;artifactid&gt;poi&lt;/artifactid&gt;
            &lt;version&gt;3.8-beta3&lt;/version&gt;
            &lt;type&gt;jar&lt;/type&gt;
            &lt;scope&gt;compile&lt;/scope&gt;
        &lt;/dependency&gt;

        &lt;dependency&gt;
            &lt;groupid&gt;org.apache.poi&lt;/groupid&gt;
            &lt;artifactid&gt;poi&lt;/artifactid&gt;
            &lt;version&gt;3.8-beta4&lt;/version&gt;
            &lt;type&gt;jar&lt;/type&gt;
            &lt;scope&gt;compile&lt;/scope&gt;
        &lt;/dependency&gt;
    &lt;/dependencies&gt;

    &lt;build&gt;
        &lt;plugins&gt;
            &lt;plugin&gt;
                &lt;groupid&gt;org.apache.maven.plugins&lt;/groupid&gt;
                &lt;artifactid&gt;maven-war-plugin&lt;/artifactid&gt;
                &lt;version&gt;2.1.1&lt;/version&gt;
                &lt;executions&gt;
                    &lt;execution&gt;
                        &lt;phase&gt;compile&lt;/phase&gt;
                        &lt;goals&gt;
                            &lt;goal&gt;exploded&lt;/goal&gt;
                        &lt;/goals&gt;
                    &lt;/execution&gt;
                &lt;/executions&gt;
                &lt;configuration&gt;
                    &lt;webappdirectory&gt;${webappDirectory}&lt;/webappdirectory&gt;
                    &lt;warsourcedirectory&gt;WebContent&lt;/warsourcedirectory&gt;
                &lt;/configuration&gt;
            &lt;/plugin&gt;
        &lt;/plugins&gt;
    &lt;/build&gt;
&lt;/project&gt;
</pre>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%91%d7%a0%d7%99%d7%99%d7%aa-%d7%a4%d7%a8%d7%95%d7%99%d7%99%d7%a7%d7%98-%d7%a2%d7%9d-spring-mvc-hibernate-maven/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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;שמירה על סדר מיון בFLEX DataGrid&#8236;</title>		<link>http://www.j2ee.co.il/%d7%a9%d7%9e%d7%99%d7%a8%d7%94-%d7%a2%d7%9c-%d7%a1%d7%93%d7%a8-%d7%9e%d7%99%d7%95%d7%9f-%d7%91flex-datagrid/</link>
		<comments>http://www.j2ee.co.il/%d7%a9%d7%9e%d7%99%d7%a8%d7%94-%d7%a2%d7%9c-%d7%a1%d7%93%d7%a8-%d7%9e%d7%99%d7%95%d7%9f-%d7%91flex-datagrid/#comments</comments>
		<pubDate>Thu, 16 Sep 2010 08:00:09 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>

		<guid isPermaLink="false">http://www.j2ee.co.il/?p=135</guid>
		<description><![CDATA[&#8235;בעייה מעצבנת שקוראת בDataGrid של פלקס. כאשר ממיינים לפי עמודה ולאחר מכן מחליפים את הDataProvider, הסדר לא נשמר. כלומר המיון מתבצע רק בלחיצה על הכותרת אבל לא מתבצע שוב כשהprivder משתנה (מוחלף ליתר דיוק). כדי לעקוף זאת, כתבתי class נחמד שיורש מDataGrid ומטפל בבעייה. להלן הקוד: package il.co.j2ee.samples { import mx.controls.DataGrid; import mx.events.CollectionEvent; import mx.events.DataGridEvent; [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>בעייה מעצבנת שקוראת בDataGrid של פלקס. כאשר ממיינים לפי עמודה ולאחר מכן מחליפים את הDataProvider, הסדר לא נשמר. כלומר המיון מתבצע רק בלחיצה על הכותרת אבל לא מתבצע שוב כשהprivder משתנה (מוחלף ליתר דיוק). כדי לעקוף זאת, כתבתי class נחמד שיורש מDataGrid ומטפל בבעייה. להלן הקוד:</p>
<pre class="brush: as3;">

package il.co.j2ee.samples {
import mx.controls.DataGrid;
import mx.events.CollectionEvent;
import mx.events.DataGridEvent;
import mx.events.FlexEvent;

public class SortedDataGrid extends DataGrid {
 private var lastSortingEvent:DataGridEvent;

 public function SortedDataGrid() {
 super();
 addEventListener(&quot;headerRelease&quot;, onHeaderRelease);
 }

 public override function set dataProvider(data:Object):void{
 super.dataProvider = data;
 addEventListener(CollectionEvent.COLLECTION_CHANGE, onDataChange);
 }

 private function onHeaderRelease(event:DataGridEvent):void{
 lastSortingEvent = event;
 }

 private function onDataChange(event:CollectionEvent):void{
 if (lastSortingEvent){
 dispatchEvent(lastSortingEvent);
 }
 }

}
}
</pre>
<p><strong>כך זה נראה במקור:</strong></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="438" height="286" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.j2ee.co.il/sample/datagrid.swf" /><embed type="application/x-shockwave-flash" width="438" height="286" src="http://www.j2ee.co.il/sample/datagrid.swf"></embed></object></p>
<p><strong>וכך לאחר השימוש בSortedDataGrid:</strong></p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="446" height="282" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://www.j2ee.co.il/sample/dataGridSorted.swf" /><embed type="application/x-shockwave-flash" width="446" height="282" src="http://www.j2ee.co.il/sample/dataGridSorted.swf"></embed></object></p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%a9%d7%9e%d7%99%d7%a8%d7%94-%d7%a2%d7%9c-%d7%a1%d7%93%d7%a8-%d7%9e%d7%99%d7%95%d7%9f-%d7%91flex-datagrid/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8235;שליטה על כפתורי הדפדפן (Browser) בFLEX&#8236;</title>		<link>http://www.j2ee.co.il/%d7%a9%d7%9c%d7%99%d7%98%d7%94-%d7%a2%d7%9c-%d7%9b%d7%a4%d7%aa%d7%95%d7%a8%d7%99-%d7%94%d7%93%d7%a4%d7%93%d7%a4%d7%9f-browser-%d7%91flex/</link>
		<comments>http://www.j2ee.co.il/%d7%a9%d7%9c%d7%99%d7%98%d7%94-%d7%a2%d7%9c-%d7%9b%d7%a4%d7%aa%d7%95%d7%a8%d7%99-%d7%94%d7%93%d7%a4%d7%93%d7%a4%d7%9f-browser-%d7%91flex/#comments</comments>
		<pubDate>Wed, 15 Sep 2010 06:30:58 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>
		<category><![CDATA[Browser]]></category>
		<category><![CDATA[FLEX]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[wrapper]]></category>
		<category><![CDATA[ג'אווה סקריפט]]></category>
		<category><![CDATA[דפדפן]]></category>
		<category><![CDATA[פלקס]]></category>

		<guid isPermaLink="false">http://www.j2ee.co.il/?p=123</guid>
		<description><![CDATA[&#8235;לעיתים, יש צורך למנוע מהמשתמש לצאת מהאפליקציה בו הוא נמצא או להזהיר אותו כשהוא עומד לעזוב את הדף. הבעיה שבפלקס דברים רבים נשמרים בClient ומשתמשים לא תמיד מודעים לכך שסגירת הדפדפן עלול להביא לאיבוד מידע. הקוד הבא מדגים כיצד ניתן להזהיר את המשתמש בעת לחיצה על Back, Forward, Refresh או סגירת הדפדפן (או הלשונית). הקוד [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p>לעיתים, יש צורך למנוע מהמשתמש לצאת מהאפליקציה בו הוא נמצא או להזהיר אותו כשהוא עומד לעזוב את הדף. הבעיה שבפלקס דברים רבים נשמרים בClient ומשתמשים לא תמיד מודעים לכך שסגירת הדפדפן עלול להביא לאיבוד מידע. הקוד הבא מדגים כיצד ניתן להזהיר את המשתמש בעת לחיצה על Back, Forward, Refresh או סגירת הדפדפן (או הלשונית).</p>
<p>הקוד מבוסס ג'אווה סקריפט (JS) ויכול לשמש גם באפליקציות WEB רגילות.</p>
<p>הערה: הקוד נבדק ונמצא תומך על הדפדפנים הבאים:</p>
<ul>
<li>IE 7 ומעלה</li>
<li>FireFox</li>
<li>Chrome</li>
</ul>
<p>קוד הJavaScript שיש לכלול בדף שעוטף את הSWF:</p>
<pre style="text-align: right;">
<pre class="brush: jscript;">

&lt;script type=&quot;text/javascript&quot;&gt;
 var url = window.location;
 window.onhashchange = locationHashChanged;

 window.onbeforeunload = function(){
 return &quot;All unsaved changes will be lost&quot;
 }

 function locationHashChanged(){
 var currentUrl = window.location.href;
 if (currentUrl.indexOf('#c') == -1){
 var answer = confirm(&quot;Are you sure you want to leave this page? All unsave changes will be lost&quot;);
 if (answer){
 history.go(-1);
 }
 else{
 window.location = url+&quot;#c&quot;;
 }
 }
 }

 &lt;/script&gt;
</pre>
<p> <strong>דוגמא מלאה אפשר <span style="color: #0000ff;"><a href="http://www.j2ee.co.il/sample/wrapper.html">לראות כאן</a></span></strong></pre>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%a9%d7%9c%d7%99%d7%98%d7%94-%d7%a2%d7%9c-%d7%9b%d7%a4%d7%aa%d7%95%d7%a8%d7%99-%d7%94%d7%93%d7%a4%d7%93%d7%a4%d7%9f-browser-%d7%91flex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8235;סוד ההצלחה של ABAP ושל SAP ERP&#8236;</title>		<link>http://www.j2ee.co.il/%d7%a1%d7%95%d7%93-%d7%94%d7%94%d7%a6%d7%9c%d7%97%d7%94-%d7%a9%d7%9c-abap-%d7%95%d7%a9%d7%9c-sap-erp/</link>
		<comments>http://www.j2ee.co.il/%d7%a1%d7%95%d7%93-%d7%94%d7%94%d7%a6%d7%9c%d7%97%d7%94-%d7%a9%d7%9c-abap-%d7%95%d7%a9%d7%9c-sap-erp/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 19:29:14 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>
		<category><![CDATA[ABAP]]></category>
		<category><![CDATA[ERP]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[SE80]]></category>
		<category><![CDATA[פיתוח]]></category>
		<category><![CDATA[תכנות]]></category>

		<guid isPermaLink="false">http://www.shefertech.com/?p=112</guid>
		<description><![CDATA[&#8235;מה זה ABAP? ABAP הינה שפה פנימית של חברת SAP המשמשת לפיתוח אפליקציות עסקיות בתוך מערכת הERP. השפה משמשת אך ורק בתוך מערכת הSAP ואי אפשר לכתוב תוכניות ABAP מחוץ למערכות SAP. השפה פותחה בשנות ה80 ונחשבת מיושנת מבחינת סינטקס (מזכירה קצת את קובול). כבר שנים מתכנתים רבים נוטים לזלזל בשפה ולחשוב עליה כמיושנת. למי [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><h2 dir="rtl">מה זה ABAP?</h2>
<p dir="rtl"><a href="http://www.sdn.sap.com/irj/sdn/abap?rid=/webcontent/uuid/90e7556d-ed76-2910-1592-b6af816225cc">ABAP</a> הינה שפה פנימית של חברת <a href="http://www.sap.com">SAP </a>המשמשת לפיתוח אפליקציות עסקיות בתוך מערכת הERP. השפה משמשת אך ורק בתוך מערכת הSAP ואי אפשר לכתוב תוכניות ABAP מחוץ למערכות SAP. השפה פותחה בשנות ה80 ונחשבת מיושנת מבחינת סינטקס (מזכירה קצת את קובול).</p>
<p dir="rtl">כבר שנים מתכנתים רבים נוטים לזלזל בשפה ולחשוב עליה כמיושנת. למי שרגיל לכתוב בשפות בסגנון C כמו: C,C++,Java,C# קשה להתרגל לפקודות ולסינטקס השונה. בנוסף, העובדה שרק לאחרונה נוספה תמיכה בOOP ושרק מעטים משתמשים באופציה זו הינה עוד פקטור שהופך את השפה לפרימיטיבית.</p>
<p dir="rtl">מצד שני, הלקוחות עובדים שנים רבות עם השפה ומרוצים ממנה באופן כללי. למעשה היא נותנת מענה מצוין לכתיבת אפליקציות עסקיות והתוצאות מהירות וטובות יותר מאשר בכל שפה אחרת כולל פלטפורמות מודרניות כמו Java או .NET מה הופך את ABAP לכזה סיפור הצלחה? כיצד קרה שמרבית הטרנזקציות העסקיות בעולם עוברות דרך שפה זו ובעולם ממשיכים לפתח בה ללא הפסקה? להלן 7 סיבות להצלחת השפה</p>
<h2 dir="rtl">אינטגרציה מלאה</h2>
<p dir="rtl">כשמתכנת כותב בשפה כלשהי הוא משתמש בכמה מוצרי תוכנה: שרת אפליקציות, סביבת פיתוח, סביבת הרצה, בסיס נתונים, מערכת ניהול גרסאות ולעיתים עוד כמה תוכנות. האינטגרציה בין התוכנות השונות גם כשהן מגיעות מאותו ספק (מיקרוסופט למשל) גוזלת זמן ומשאבים. ABAP רצה בתוך מערכת הSAP כך שאין צורך אפילו בסביבת פיתוח (הקליינט של SAP הוא הסביבת פיתוח). נכנסים למערכת, טוענים את התוכנית ומתחילים לקודד.</p>
<h2 dir="rtl">אין הפרדה בין השכבות</h2>
<p dir="rtl">כיוון שהDB הוא חלק ממערכת הSAP, וכך גם הקליינט, אין למעשה הפרדה בין שכבת הUI לשכבת הדאטה וללוגיקה. בABAP אין מודלים של <a href="http://www.enode.com/x/markup/tutorial/mvc.html">MVC</a> ואין <a href="http://en.wikipedia.org/wiki/Object-relational_mapping">ORM</a> או שכבות <a href="http://en.wikipedia.org/wiki/Data_access_layer">DAL</a>. אתה רוצה לכתוב לטבלה? השפה עצמה &quot;מכירה&quot; את כל הטבלאות והמבנים של המערכת ואין צורך להתחבר דרך ממשק כלשהו כפי שנעשה בדוט נט (<a href="http://msdn.microsoft.com/en-us/library/h43ks021(VS.71).aspx">ADO</a>) או בג'אווה (<a href="http://java.sun.com/javase/technologies/database/">JDCB</a>). הGUI הוא אחיד ורץ בקליינט של SAP. לא צריך לדאוג לתמיכה בדפדפנים או להתנהגות של אלמנטים שונים בHTML.</p>
<h2 dir="rtl">אין Client-Server</h2>
<p dir="rtl">טוב, זה לא שבאמת את קליינט סרבר אבל מבחינת המתכנת אין משמעות למה שרץ בצד השרת ומה רץ בצד הקליינט. חיברת ListBox לרשימה עם 40,000 פריטים? אין בעיה. SAP תדאג להציג את זה בצורה האופטימלית עם או בלי דפדוף והכל ינגן כמו שצריך.</p>
<p dir="rtl">אין שפות סקריפט שרצות בדפדפן, אין ניהול של sessions וcookies ולא צריך לדאוג לstate של התוכנית.</p>
<h2 dir="rtl">אין ריבוי משתמשים</h2>
<p dir="rtl">כמובן שיש ריבוי משתמשים אבל מבחינת המתכנת הוא רץ ב&quot;עולם&quot; משלו והוא מסתכל רק על המשתמש שכרגע logged in.</p>
<h2 dir="rtl">מוגבלות זה כוח</h2>
<p dir="rtl">בABAP אין ספריות native. אי אפשר לפתח API בABAP שיתממשק לפייסבוק וישלח הודעות לטוויטר. השפה נועדה רק לתוכניות עסקיות וככזו היא מוגבלת לסט הפקודות שSAP מספקת. החיסרון הוא שאי אפשר למשל לפתח רכיבי UI חדשים ותוכניות SAP תמיד ייראו באותו סגנון. מצד שני, מי בכלל צריך את זה? למה שמנהל לוגיסטי ירצה פתאום לשלב את חדשות מזג האוויר של Yahoo בתוך אפליקציית ניהול המחסנים שלו? המסכים הסטנדרטים מספקים כל מה שצריך בשביל העבודה והעובדה שאין אפשרות להכניס טכנולוגיות מבחוץ (למעט קוד ABAP אחר) מבטיחים יציבות ופשטות.</p>
<h2 dir="rtl">תכנות פרוצדוראלי</h2>
<p dir="rtl">מסיבה כלשהי, כנראה שלמוח האנושי יותר קל לחשוב בצורה של פרוצדורות/פונקציות מאשר בצורה של OO ואובייקטים. אני נתקל במיישמים רבים שמדברים על טבלאות ושדות והפעלה של פונקציות אבל כשמדברים איתם על הורשה לא מבינים מה רוצים מהם. אמנם כיום יש OO ABAP אבל רוב תוכניות הABAP כתובות בצורה המסורתית של פונקציות וזה בסדר גמור. היישויות בABAP הם לרוב מבנים שקיימים בתוך מערכת הSAP ודומות לstruct שמכיל נתונים אך לא פונקציות. הפונקציות בABAP יכולות לקבל טבלאות כפרמטרים ולהחזיר טבלאות בהתאם אך הפונקציות לא שייכות לישויות עצמן כמו בOO.</p>
<h2 dir="rtl">סטנדרטים קשוחים לניהול קוד</h2>
<p dir="rtl">מערכות SAP דורשות סטנדרטים קבועים בכל מה שקשור לשמות של פונקציות ועצמים, מתחמי שמות (name spaces), חבילות, ספריות וכו'. מהבחינה הזו, למתכנת ABAP אין חופש פעולה מבחינת הארכיטקטורה. הכל מוגדר מראש ורק צריך לממש את הפונקציונליות עצמה. המטרה היא להתמקד בקוד העסקי ולא במבנה הקוד והחלוקה שלו.</p>
<p dir="rtl">בנוסף, כל ניהול הגרסאות, העברה בין סביבות (DEV, QA, PROD) נעשות במתודולוגיה קבועה שמוטמעת בתוך המערכת. אי אפשר להעביר &quot;פרוייקט&quot; על דיסק און קי ולהעלות לשרת כמו בשפות אחרות.</p>
<p dir="rtl">לסיכום, על מנת לכתוב תוכנית ABAP מספיק להכיר את הפקודות של השפה, את הנהלים של כתיבת ABAP וכמה אלמנטים של UI. מי שתוהה איך המתכנת אמור להכיר את מאות אלפי האובייקטים (המכונים Business Object), היישויות במערכת והטבלאות אז גם לזה יש פתרון: מיישם ERP. תפקידו של המיישם להכיר את המודול הרלוונטי מכל הכיוונים והוא זה שמגדיר ומאפיין למתכנת לאילו אובייקטים לכתוב ואת מהלך התוכנית. למתכנת נשאר רק לממש את הקוד מה שמסביר למה מהנדסי תוכנה לא אוהבים ABAP&#8230;</p>
<h2 dir="rtl">כך נראית סביבת הפיתוח</h2>
<div class="wp-caption aligncenter" style="width: 700px"><img title="SAP ABAP Workbench" src="http://www.shefertech.com/images/SAP_DEVELOPMENT_ENV.JPG" alt="SAP ABAP Workbench" width="690" height="831" /><p class="wp-caption-text">SAP ABAP Workbench</p></div>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%a1%d7%95%d7%93-%d7%94%d7%94%d7%a6%d7%9c%d7%97%d7%94-%d7%a9%d7%9c-abap-%d7%95%d7%a9%d7%9c-sap-erp/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%90%d7%99%d7%9a-%d7%9c%d7%a2%d7%91%d7%95%d7%a8-%d7%9e%d7%91%d7%97%d7%9f-%d7%95%d7%a8%d7%90%d7%99%d7%95%d7%9f-%d7%9e%d7%a7%d7%a6%d7%95%d7%a2%d7%99-%d7%91%d7%97%d7%91%d7%a8%d7%aa-%d7%94%d7%99-%d7%98/</link>
		<comments>http://www.j2ee.co.il/%d7%90%d7%99%d7%9a-%d7%9c%d7%a2%d7%91%d7%95%d7%a8-%d7%9e%d7%91%d7%97%d7%9f-%d7%95%d7%a8%d7%90%d7%99%d7%95%d7%9f-%d7%9e%d7%a7%d7%a6%d7%95%d7%a2%d7%99-%d7%91%d7%97%d7%91%d7%a8%d7%aa-%d7%94%d7%99-%d7%98/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 10:28:40 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[Java]]></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://www.shefertech.com/?p=86</guid>
		<description><![CDATA[&#8235;בין אם אתה שכיר ובין אם אתה פרילנסר עצמאי, הרבה פעמים תדרש לעבור מבחן מקצועי בתיכנות כדי לקבל את המשרה הנחשקת. להלן קובץ המלצות וכללים להצלחה במבחן קצועי בחברות הי-טק בתחום התוכנה. השלב הראשון בהצלחה במבחן מקצועי בהי-טק מתחיל הרבה לפני המבחן. על מנת להגיע כמה שיותר מוכן, על המועמד לברר כמה שיותר פרטים אודות [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p dir="rtl">בין אם אתה שכיר ובין אם אתה פרילנסר עצמאי, הרבה פעמים תדרש לעבור מבחן מקצועי בתיכנות כדי לקבל את המשרה הנחשקת. להלן קובץ המלצות וכללים להצלחה במבחן קצועי בחברות הי-טק בתחום התוכנה.</p>
<p dir="rtl">השלב הראשון בהצלחה במבחן מקצועי בהי-טק מתחיל הרבה לפני המבחן. על מנת להגיע כמה שיותר מוכן, על המועמד לברר כמה שיותר פרטים אודות המצפה לו ולהתכונן בהתאם. במידה וזומנת למבחן מקצועי, הנה השאלות שכדאי לשאול את נציג הגיוס:</p>
<ol>
<li>כמה זמן יארך המבחן?</li>
<li>מי מעביר את המבחן?</li>
<li>האם המבחן הוא בעל פה במתכונת של ראיון, מבחן על דף או מבחן על מחשב?</li>
<li>מהם נושאי המבחן בכלליות?</li>
</ol>
<p dir="rtl">לא תמיד יתקבלו תשובות לכל השאלות. בעוד שמשך זמן המבחן הוא מידע שכמעט תמיד יימסר למועמד, הרי שנושאי המבחן הרבה פעמים יישארו חסויים. למרות זאת, יש חברות רבות שיגידו בכלליות מהם נושאי המבחן כגון: ג'אווה, הגיון, נושאי ידע כלליים וכו'.</p>
<p dir="rtl">ככלל, קיימים שלושה סוגים עיקריים של מבחנים:</p>
<ul>
<li>מבחן בעל פה מול מראיין</li>
<li>כתיבת משימת קוד</li>
<li>קובץ של שאלות בדרך כלל אמריקאי</li>
</ul>
<p dir="rtl">כעת נסקור כל אחד מסוגי הבחינות ונראה כיצד יש להתכונן אליהם ומה צריך לעשות כדי לעבור אותם בהצלחה.</p>
<h2 dir="rtl">מבחן בעל פה מול מראיין</h2>
<p dir="rtl">במקרה זה, המבחן נערך ע&quot;י מראיין אחד או יותר ששואל שאלות והמועמד מסביר בעל פה את התשובות. הראיון תמיד ייפתח בשאלה: &quot;ספר לי על משהו מעניין שכתבת&quot;. לשאלה זו משקל חשוב ביותר בראיון והתשובה עליה במידה רבה קובעת את המשך התהליך. לכן חשוב מאוד להכין נושא שאפשר לדבר עליו בראיון. הנושא יכול להיות פרוייקט, פיצ'ר, מחקר, פתרון באג מסובך, אפילו פיתוח הדגמה (POC) או Design. צריך להיות מסוגל להציג את הנושא בלא יותר מ10 דקות בהנחה שלפניך מתכנת מקצועי שמעולם לא ראה את הפרוייקט. להלן הדגשים לבחירה והכנת נושא לראיון:</p>
<h3 dir="rtl">דבר על משהו שאתה שולט בו ב100%</h3>
<p dir="rtl">היה בטוח שתשאל על הפרוייקט שאלות שונות עד כדי התעמקות בפרטים הקטנים. כעקרון, אין בעיה להציג משהו שלא פיתחת מאפס אלא שמישהו אחר פיתחת ואתה תחזקת או תקנת בו באגים (כדאי לציין זאת באגביות). זכור שגם המראיין רגיל לעבודה בצוות וברור לו שלא תמיד פיתחת הכל בעצמך. עם זאת, יש להקפיד לדבר על משהו שאתה שולט בו לפרטי פרטים ומכיר את הקוד והארכיטקטורה היטב.</p>
<h3 dir="rtl">בחר נושא עם מימוש מעניין שאפשר לפתח סביבו דיון</h3>
<p dir="rtl">הצגת הודעת משתמש על המסך הוא לא משהו משמעותי למשל. עליך לבחור משהו שיכלול טכנולוגיה מעניינת, מימוש מורכב ורצוי בעל מאפיינים קלאסים כגון MVC, ירושה ותכנון OOP מורכב, שימוש מיוחד בטכנולוגיה. נושאים מעולים לדיון יהיו: פתרון של בעיית ביצועים, מימוש של Caching, Clustering, וכו', ארכיטקטורת שכבות כלשהי: DAO, ORM, אלגוריתמים כמו: עצי משחק, מכונות מצבים, פתרונות באמצעות תורת הגרפים, בעיות Multi Threading וסינכרון.</p>
<h3 dir="rtl">לא לדבר על דברים שהמראיין לא מסוגל לפתח סביבם שיחה</h3>
<p dir="rtl">מטרת ההצגה של הפרוייקט הוא לפתח שיחה ולראות כיצד המועמד פותר בעיות, עד כמה הוא מבין את הנושא ומה יכולת הידע והניתוח שלו. לכן יש להקפיד לא להציג משהו שהמראיין לא יכול לקלוט בכמה דקות כמו שימוש בטכנולוגיה ובארכיטקטורה שלא מוכרת בתעשייה. בעבר נתקלתי במועמד שתיאר את העבודה שלו: &quot;השתמשנו בSDC על מנת להתממשק לEWK וזאת על ידי התחברות בפרוטוקול RTM&quot;. אלו כמובן טכנולוגיות שפותחו באופן פנימי בחברה אבל לי כמראיין חיצוני זה לא אמר כלום. יש להקפיד לדבר במונחים וטרמינולוגיה שמוכרים לכולם ולא להשתמש בקודים פנימיים אליהם הורגלת בעבודתך הקודמת.</p>
<h3 dir="rtl">בחר משהו מהניסיון הרלוונטי ביותר</h3>
<p dir="rtl">במידה ובעברך עבדת שנתיים בצבא ולאחר מכן 5 שנים במיקרוסופט היה בטוח שהמראיין מעוניין לשמוע על ניסיונך במיקרוסופט אפילו אם פיתחת דברים הרבה יותר מאתגרים בצבא. אם עבדת שנתיים בחברה למשחקי מחשב ושנתיים בחברה לפיתוח אתרים ואתה מועמד לחברה שמפתחת משחקי מחשב, יש כמובן להציג משהו מהניסיון שלך כמפתח משחקים. כנ&quot;ל לגבי שפות תיכנות וטכנולוגיות. נסה להבין מה בקו&quot;ח שלך משך את החברה לזמן אותך והכן פרוייקט לראיון שמתאים לפרופיל החברה.</p>
<h3 dir="rtl">הכן פרוייקט לגיבוי</h3>
<p dir="rtl">לעיתים, המראיין לא יביע התעניינות במה שאתה מציג ותתבקש לדבר על משהו אחר. כדאי להכין גיבוי למקרה כזה ורצוי שהפרוייקט יהיה בעל אופי שונה מהראשון.</p>
<h3 dir="rtl">מה לגבי שאר השאלות?</h3>
<p dir="rtl">לשאר השאלות קשה מאוד להתכונן כיוון שכל מראיין נוהג לשאול שאלות אחרות. דפוס שחוזר על עצמו הם שאלות קצרות באלגוריתמים פשוטים יחסית בעיקר סביב מבני נתונים. כדאי מאוד לחזור על הנושאים: רשימות מקושרות, עצים בינאריים, מערכים (מיון, חיפוש, מחיקה וכו'). במקרים רבים תינתן שאלה של 5-10 דקות בפתרון בעיה סביב הנושאים הללו כגון: פונקציה שממיינת מערך (כדאי לציין שיש כמה שיטות מיון), מציאת רשימה מקושרת מעגלית, הדפסת עץ בינארי עם ובלי רקורסיה וכו'. כדאי גם להכיר את רמות הסיבוכיות וההבדלים בין המבנים והאלגוריתמים השונים.</p>
<h2 dir="rtl">כתיבת משימת קוד</h2>
<p dir="rtl">מבחנים אלו מעמתים את המועמד עם משימה שדומה באופייה לעבודה אמיתית. המטרה היא לראות כיצד המועמד מתמודד עם בעיה תכנותית, איזה סוג של פתרון הוא מציע, ומה רמת כתיבת הקוד. ברוב המקרים המבחן יתבצע על סביבת פיתוח סטנדרטית ומוכרת עם גישה לאינטרנט (אם כי לא תמיד) על מנת לדמות את המציאות היומיומית בחברה.</p>
<h3 dir="rtl">הכנה מוקדמת</h3>
<p dir="rtl">ברוב המקרים תידרש לכתוב תוכנית console שמשתמשת בקלט פלט סטנדרטי בשורת פקודה. מעבר לזה רוב המימוש יכלול את רכיבי השפה הבסיסיים: מערכים, מבני נתונים, ניתוח Strings, וכו'. כדאי לחזור על דברים בסיסיים שאולי שכחת על מנת שלא לבזבז זמן יקר: פתיחת פרוייקט חדש בסביבת הפיתוח, פקודות קלט פלט למסך, הגדרת קלאסים מסוגים שונים: interface, abstract, החבילות המכילות את מבני הנתונים הנפוצים   (List, Hash) ועוד. עוד נושא קריטי להצלחה במבחן הוא: Design Patterns. DP הוא נושא שיחסית קל ללמוד ולזכור ומאידך שימוש נכון בDP משאיר רושם טוב ומקצועי. כדאי מאוד להכיר את התבניות של הGOF ולדעת איך להשתמש בהן.</p>
<h3 dir="rtl">להלן דגשים למבחן בכתיבת קוד:</h3>
<h3 dir="rtl">אל תתעכב על קריאת האפיון ואל תרד לפרטים</h3>
<p dir="rtl">הרבה פעמים האפיון יתפרס על כמה עמודים באנגלית ולקרוא אותו עד הסוף ולהבין אותו באופן מלא יכול לקחת 15-20 דקות. זהו זמן יקר בהתחשב בעובדה שרוב המבחנים אורכים כשעתיים (זמן מוגבל). כדאי לקרוא ברפרוף ולעבור לדוגמאות (בדרך כלל מופיעות במסמך) ולהבין בגדול מה מצפים. אף אחד לא יפסול אותך כי המבחן הדפיס &quot;hello moshe&quot; במקום &quot;&quot;hello david.</p>
<h3 dir="rtl">הקדש 10 דקות לתכנון הפתרון</h3>
<p dir="rtl">מומלץ לסרטט את הפתרון על דף נפרד. להגדיר את המחלקות העיקריות והירושה, את המופעים העיקריים של האובייקטים והיחסים בינהם.</p>
<p dir="rtl"><strong>לעולם תתחיל מהגדרת כל המחלקות והפונקציות</strong></p>
<p dir="rtl">יש להתחיל בהגדרת המחלקות והפונקציות ורק אחר כך לממש אותן. הסיבה היא שבמקרים רבים גם אם לא סיימת את כל המבחן (לפעמים אפילו לא מצפים ממך לסיים הכל), עדיין תוכל להציג את המבנה, הישויות, התכנון והמתודות השונות למרות שלא הכל מומש.</p>
<h3 dir="rtl">סטנדרטים מומלצים</h3>
<p dir="rtl">חלק גדול מהמבחן הוא לבדוק האם המועמד משתמשת בBest Practices ובשיטות מקובלות ועד כמה הקוד שלו איכותי.</p>
<h4 dir="rtl">שמות מחלקות, משתנים, ומתודות</h4>
<p dir="rtl">יש להקפיד על שמות בסטנדרט מקובל. מועמד שיקרא למשתנים שלו: a,b,c במקום: customer, person, manager יאבד נקודות במהירות. כנ&quot;ל לגבי שימוש נכון באותיות גדולות וקטנות כפי שמקובל בשפה הרלוונטית.</p>
<h4 dir="rtl">תיעוד</h4>
<p dir="rtl">לא כדאי להקדיש זמן לתיעוד. בדרך כלל הבוחן לא יסתכל על זה וזה גוזל זמן יקר. אפשר לכתוב הערה במקומות בהם הקוד מסתבך או לפני פונקציה שלא ברור למה היא נועדה. ברוב המקרים מספיק לתת שמות הגיוניים למשתנים ולפונקציות.</p>
<h4 dir="rtl">שימוש מושכל בפולימורפיזם</h4>
<p style="text-align: right;" dir="rtl">בג'אווה למשל, אפשר ליצור רשימה בכל אחת מהדרכים הבאות:</p>
<p style="text-align: left;" dir="ltr">ArrayList list = new ArrayList ();</p>
<p style="text-align: left;" dir="ltr">List list = new ArrayList();</p>
<p style="text-align: left;" dir="ltr">List&lt;String&gt; list = new ArrayList&lt;String&gt;();</p>
<p dir="rtl">על אף שהתוצאה בשלושת המקרים תהיה זהה המקרה השלישי הוא הנכון ביותר. הרשימה מוגדרת כList שהינו interface כך שניתן להחליף את המימוש בקלות (למשל לLinkedList). הרשימה היא type safe כך שמובטח שתכיל רק אובייקטים מסוג String.</p>
<h4 dir="rtl">שימוש נכון בלולאות</h4>
<p dir="rtl">נניח ויש לנו את הרשימה מהדוגמא הקודמת. כיצד נדפיס את אברי הרשימה?</p>
<p style="text-align: left;" dir="ltr">For (int i=0; i&lt;list.size(); i++)</p>
<p style="text-align: left;" dir="ltr">System.out.println(list.get(i)):</p>
<p style="text-align: left;" dir="ltr">(for String s : list)</p>
<p style="text-align: left;" dir="ltr">System.out.println(list.get(i)):</p>
<p style="text-align: left;" dir="rtl">כדאי להכיר את הלולאה for each (החל מג'אווה 1.5) ולהשתמש בה כשאפשר.</p>
<h3 dir="rtl">Design Patterns מומלצים</h3>
<p dir="rtl">סטטיסטית, כמעט כל מרואיין שנשאל אילו DP הוא מכיר יענה Singleton או Factory. כדי להראות מקצועיות כדאי להכיר עוד כמה DP מלבד השניים המוכרים הללו. במבחנים המקצועיים יש כמה DP שיכולים להיות שימושיים, ואילו אחרים בדרך כלל לא יהיו רלוונטים. נהוג לחלק את רשימת הDP של הGOF לשלושה תתי רשימות: Creational Patterns, Structural Patterns, Behavioral Patterns. הStructural כמעט ולא רלוונטים למבחנים כיוון שבדרך כלל בשעתיים אי אפשר להגיע לרמות OO שמתאימות לדפוסים אלה. למעט Composite שכדאי להכיר כי בהרבה מבחנים מבקשים להגדיר מבנה בצורת עץ היררכי כלשהו.</p>
<p dir="rtl">הCreational מתאימים במקצת אם כי לרוב אין צורך בהם שוב בגלל שהקוד מצומצם למספר קטן של קלאסים.</p>
<p dir="rtl">הBehavioral הם המתאימים ביותר ורצוי לשנן אותם ולהשתמש בהם בעת הצורך.</p>
<h2 dir="rtl">מבחן אמריקאי</h2>
<p dir="rtl">לרוב קשה להתכונן למבחן אמריקאי כיוון שאין לדעת אילו נושאים יופיעו ועל מה יהיה המיקוד. אבל ישנו דפוס שחוזר על עצמו לעיתים קרובות וכדאי להגיע מוכן אליו. כיוון שבכל תחום בעולם ההי-טק קיימים מאות טכנולוגיות שונות, ספריות, API, פלטפורמות וחבילות תוכנה אין כל כך טעם לבחון מועמד על טכנולוגיה מסויימת כיוון שקיים סיכוי טוב שאותו מועמד לא השתמש בטכנולוגיה זו ולכן לא יידע לענות על השאלות מה שלא מעיד על הידע והיכולות האמיתיות שלו. לכן נהוג לקחת את המכנה המשותף הנמוך ביותר שמצופה מכל מועמד להכיר וזה בדרך כלל החוקים של שפת התיכנות עצמה ונושאים סביב הליבה של הטכנולוגיה. הנושאים הנפוצים ביותר הנשאלים הם על: OOP וחוקי ירושה, פולימורפיזם, Up casting, down Casting, בעיות סינכרוניזציה וmulti Threading, מבני נתונים בסיסיים (רשימות, עצים בינארים), מערכים ומחרוזות, העברת פרמטרים By Value וby Reference, טיפול בexceptions כולל חוקי ההיררכיה, שאלות על פונקציות שונות במחלקות String וobject (רלוונטי לג'אווה ולדוט נט), Reflection, שימוש בbreak וcontinue ועוד.</p>
<p dir="rtl">בין הנושאים המתקדמים יותר אפשר למצוא: כוונון של הGC, JVM/CLR, סוגים שונים של Collections ודרך התנהגותם, מילות שמורות בשפה שנדיר להשתמש בהם, דקויות בין טיפוסי משתנים והמרות (int, long, double, float, char).</p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%90%d7%99%d7%9a-%d7%9c%d7%a2%d7%91%d7%95%d7%a8-%d7%9e%d7%91%d7%97%d7%9f-%d7%95%d7%a8%d7%90%d7%99%d7%95%d7%9f-%d7%9e%d7%a7%d7%a6%d7%95%d7%a2%d7%99-%d7%91%d7%97%d7%91%d7%a8%d7%aa-%d7%94%d7%99-%d7%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8235;כללים לפיתוח אבטיפוס, הדגמה (Demo), ובדיקת התכנות (POC)&#8236;</title>		<link>http://www.j2ee.co.il/%d7%9b%d7%9c%d7%9c%d7%99%d7%9d-%d7%9c%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%90%d7%91%d7%98%d7%99%d7%a4%d7%95%d7%a1-%d7%94%d7%93%d7%92%d7%9e%d7%94-demo-%d7%95%d7%91%d7%93%d7%99%d7%a7%d7%aa-%d7%94%d7%aa/</link>
		<comments>http://www.j2ee.co.il/%d7%9b%d7%9c%d7%9c%d7%99%d7%9d-%d7%9c%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%90%d7%91%d7%98%d7%99%d7%a4%d7%95%d7%a1-%d7%94%d7%93%d7%92%d7%9e%d7%94-demo-%d7%95%d7%91%d7%93%d7%99%d7%a7%d7%aa-%d7%94%d7%aa/#comments</comments>
		<pubDate>Sun, 16 Aug 2009 04:26:40 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[מאמרים טכנולוגיים]]></category>

		<guid isPermaLink="false">http://www.shefertech.com/?p=81</guid>
		<description><![CDATA[&#8235;לאחרונה התחלתי לפתח אבטיפוס לרעיון מסויים למיזם חדש. מדובר על מוצר בתחום המערכות מידע ואני צריך הדגמה שתוכל להמחיש את הרעיון ולהוכיח היתכנות. משהו שאפשר להציג ללקוחות ולמשקיעים ואולי גם לשותפים פוטנציאליים. כיוון שזו לא הפעם הראשונה שאני כותב POC החלטתי לכתוב על זה פוסט בו אפרט כללים וטיפים לכתיבה נכונה. קוד גנרי או פתרון [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p dir="rtl">לאחרונה התחלתי לפתח אבטיפוס לרעיון מסויים למיזם חדש. מדובר על מוצר בתחום המערכות מידע ואני צריך הדגמה שתוכל להמחיש את הרעיון ולהוכיח היתכנות. משהו שאפשר להציג ללקוחות ולמשקיעים ואולי גם לשותפים פוטנציאליים. כיוון שזו לא הפעם הראשונה שאני כותב POC החלטתי לכתוב על זה פוסט בו אפרט כללים וטיפים לכתיבה נכונה.</p>
<p dir="rtl">קוד גנרי או פתרון זמני?</p>
<p dir="rtl">הנושא הראשון שצריך להחליט עליו הוא האם לפתח גרסה שתהווה בסיס למוצר המלא או שמא לפתח גרסה מינימלית שתעבור שכתוב? במחשבה ראשונה חבל לכתוב פעמיים ואם כבר מפתחים אבטיפוס עדיף להשקיע בו כדי לחסוך אחר כך. אך לדעתי זו לא גישה נכונה. להלן הסיבות למה לא להתייחס לאבטיפוס כפלטפורמה למוצר שלם:</p>
<ul>
<li>לפיתוח אבטיפוס יש מטרה מסויימת. בדרך כלל זה להצגה בפני משקיעים או לקוחות. לרוב אנחנו לחוצים בזמן ובמשאבים ורצוי להתמקד במטרה. המטרה היא להגיע להדגמה שעובדת בצורה סבירה בתסריט מסויים. כל דבר מעבר לזה רק יעכב ויסית אותנו מהמטרה כך שעדיף לזנוח את המאמצים להפוך את ההדגמה לפלטפורמה להמשך.</li>
<li>לאחר סקר שוק מעמיק ולאחר כתיבת האפיונים הרבה פעמים מתגלה שמה שחשבנו בהתחלה הוא לא מה שנממש בסוף. חבל להשקיע זמן ומאמץ בפיתוח כשבסוף המוצר ייראה אחרת לגמרי.</li>
</ul>
<p dir="rtl">כמובן שיש לבחון כל מקרה לגופו. יש מצבים בהם כדאי לפתח &quot;כמו שצריך&quot; במיוחד כאשר בטוחים בתצורה הסופית ואין ספק לגבי המשך הדרך.</p>
<h2 dir="rtl">להתמקד במינימום ההכרחי</h2>
<p dir="rtl">כלל האצבע שמנחה את פיתוח האבטיפוס הוא התמקדות במטרה קצרת טווח. יש לזכור שהפיתוח יימשך תקופה קצרה, יעבדו עליו מספר מועט של אנשים (לפעמים זה רק אתה), ואין כוונות לתחזק אותו בעתיד. הנה טבלת ההמלצות לפיתוח אבטיפוס:</p>
<table dir="rtl" border="1" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td width="129" valign="top">
<p dir="rtl"><strong>רכיב</strong></p>
</td>
<td width="439" valign="top">
<p dir="rtl"><strong>המלצה</strong></p>
</td>
</tr>
<tr>
<td width="129" valign="top">
<p dir="rtl">הערות בקוד</p>
</td>
<td width="439" valign="top">
<p dir="rtl">רק במקרים   בהם יש כתיבה יוצאת דופן שעלולה להיות לא מובנת</p>
</td>
</tr>
<tr>
<td width="129" valign="top">
<p dir="rtl">Log</p>
</td>
<td width="439" valign="top">
<p dir="rtl">אין צורך.   המוצר ממילא לא ירוץ בProduction והוא פשוט מספיק כדי לדבאג במקרה הצורך</p>
</td>
</tr>
<tr>
<td width="129" valign="top">
<p dir="rtl">Unit Tests</p>
</td>
<td width="439" valign="top">
<p dir="rtl">לאנשי הTDD ברור שצריך. לאחרים – מומלץ בדיקות פשוטות בלי Mocks ושאר סביבות מתוחכמות</p>
</td>
</tr>
<tr>
<td width="129" valign="top">
<p dir="rtl">Integration Tests</p>
</td>
<td width="439" valign="top">
<p dir="rtl">אין צורך</p>
</td>
</tr>
<tr>
<td width="129" valign="top">
<p dir="rtl">שימוש בFrameworks</p>
</td>
<td width="439" valign="top">
<p dir="rtl">האם להתשמש   בפריימורקים כמו SPRING או Hibernate או שמא להסתפק בקוד &quot;רגיל&quot;? במידה ואתה בקיא לחלוטין   בסביבה מסויימת והיא יכולה לחסוך זמן בפיתוח זה מומלץ. לעומת זאת, פריימוורק   שמתכוונים ללמוד ולהתשמש בו במוצר הסופי לא כדאי להתעכב איתו עבור הPOC.</p>
</td>
</tr>
<tr>
<td width="129" valign="top">
<p dir="rtl">משתנים Hard coded</p>
</td>
<td width="439" valign="top">
<p dir="rtl">לא צריך   להשאיר דברים hard coded כמו מחזרוזות בתוך פונקציות. עדיף להוציא הכל למשתני const. מצד שני אין צורך להוציא דברים החוצה (XML, DB, קובץ) אפשר לשנות את הקוד במידה ורוצים   לערוך משהו</p>
</td>
</tr>
<tr>
<td width="129" valign="top">
<p dir="rtl">OOP</p>
</td>
<td width="439" valign="top">
<p dir="rtl">כללי כתיבה   נכונה: חלוקה למחלקות, שכבות, וכו'. אין צורך להשתמש בDP מורכבים או בירושה מוגזמת. יש לזכור שהקוד כנראה יתפרס על פני   מחלקות מועטות</p>
</td>
</tr>
</tbody>
</table>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%9b%d7%9c%d7%9c%d7%99%d7%9d-%d7%9c%d7%a4%d7%99%d7%aa%d7%95%d7%97-%d7%90%d7%91%d7%98%d7%99%d7%a4%d7%95%d7%a1-%d7%94%d7%93%d7%92%d7%9e%d7%94-demo-%d7%95%d7%91%d7%93%d7%99%d7%a7%d7%aa-%d7%94%d7%aa/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8235;אודות הבלוג הזה &#8211; מי אני&#8236;</title>		<link>http://www.j2ee.co.il/%d7%90%d7%95%d7%93%d7%95%d7%aa-%d7%94%d7%91%d7%9c%d7%95%d7%92-%d7%94%d7%96%d7%94-%d7%9e%d7%99-%d7%90%d7%a0%d7%99/</link>
		<comments>http://www.j2ee.co.il/%d7%90%d7%95%d7%93%d7%95%d7%aa-%d7%94%d7%91%d7%9c%d7%95%d7%92-%d7%94%d7%96%d7%94-%d7%9e%d7%99-%d7%90%d7%a0%d7%99/#comments</comments>
		<pubDate>Sun, 21 Jun 2009 05:01:23 +0000</pubDate>
		<dc:creator>&#8235;admin&#8236;</dc:creator>				<category><![CDATA[כללי]]></category>
		<category><![CDATA[EJB]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[Informatica]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[JSP]]></category>
		<category><![CDATA[NetWeaver]]></category>
		<category><![CDATA[Portal]]></category>
		<category><![CDATA[SAP]]></category>
		<category><![CDATA[Servlets]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[SWING]]></category>

		<guid isPermaLink="false">http://d26156.u27.oyo.co.il/?p=25</guid>
		<description><![CDATA[&#8235;מאז היותי ילד אני מתכנת בשפות שונות. בשנים האחרונות עסקתי בעבודות ובפרוייקטים רבים בתחום פיתוח תוכנה: החל מחברות ענק כמו SAP ואינפורמטיקה, דרך סטאטראפים כמו GigaSpaces ועד חברות תעשיתיות שונות כמו בתי זיקוק, פז ונטפים. תחום ההתמחות שלי הוא כל מה שקשור לטכנולוגיות ג'אווה: J2EE, EJB, JSP, Servles, JDBC, JNI, RMI, Spring, Hibernate, JSF, SWING. [...]&#8236;]]></description>			<content:encoded><![CDATA[<div dir="rtl"><p><img class="size-full wp-image-42 alignright" title="shlomo_schwarcz" src="http://www.shefertech.com/wp-content/uploads/2009/06/shlomo_schwarcz1.jpg" alt="shlomo_schwarcz" /></p>
<p>מאז היותי ילד אני מתכנת בשפות שונות. בשנים האחרונות עסקתי בעבודות ובפרוייקטים רבים בתחום פיתוח תוכנה: החל מחברות ענק כמו <a href="http://www.sap.com/about/company/saplabs/israel/index.epx">SAP </a>ו<a href="http://www.informatica.com">אינפורמטיקה</a>, דרך סטאטראפים כמו <a href="http://www.gigaspaces.com">GigaSpaces</a> ועד חברות תעשיתיות שונות כמו <a href="http://www.orl.co.il/">בתי זיקוק</a>, <a href="http://www.paz.co.il/">פז</a> <a href="http://www.netafim.co.il/">ונטפים</a>. תחום ההתמחות שלי הוא כל מה שקשור לטכנולוגיות ג'אווה: J2EE, EJB, JSP, Servles, JDBC, JNI, RMI, Spring, Hibernate, JSF, SWING. בנוסף עסקתי רבות גם בתחומי הסאפ השונים ובעיקר בNetWeaver, SAP Portal, WebDynpro, Visual Composer ושאר טכנולוגיות ג'אוואיות של SAP. וכמובן כדי להשלים את התמונה גם .C++, NET, C#, ASP מוכרים לי היטב.</p>
<p>עם השנים גיבשתי תובנות מעניינות על המקצוע אותם אני מתכוון לשתף עם קוראי הבלוג. בנוסף, אפרסם פה קודים ופרוייקטי קוד פתוח שאני כותב בזמני החופשי ומקרים מעניינים שאני נתקל בהם בזמן העבודה.</p>
<p>לסיום, אני פונה אליכם הקוראים. אני תמיד פתוח ליוזמות ורעיונות, שיתופי פעולה, מיזמים, סטארטאפים, שירותי יעוץ ועוד. אתם תמיד מוזמנים לפנות אליי עם כל רעיון או הצעה.</p>
<p>נשתמע,<br />
שלמה שוורץ<br />
<a href="mailto:shlomo@shefertech.com">shlomo@shefertech.com</a></p>
</div>]]></content:encoded>			<wfw:commentRss>http://www.j2ee.co.il/%d7%90%d7%95%d7%93%d7%95%d7%aa-%d7%94%d7%91%d7%9c%d7%95%d7%92-%d7%94%d7%96%d7%94-%d7%9e%d7%99-%d7%90%d7%a0%d7%99/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

