<?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>bb242.log &#187; java</title>
	<atom:link href="http://www.bb242.de/tag/java/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bb242.de</link>
	<description>Fahrtenbuch des Schreckens</description>
	<lastBuildDate>Fri, 02 Dec 2011 09:20:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.3</generator>
		<item>
		<title>I hate hibernate!</title>
		<link>http://www.bb242.de/2008/05/07/i-hate-hibernate/</link>
		<comments>http://www.bb242.de/2008/05/07/i-hate-hibernate/#comments</comments>
		<pubDate>Wed, 07 May 2008 13:56:07 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[fuck]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.bb242.de/?p=339</guid>
		<description><![CDATA[Every day another hibernate fuckup! And it is not (only) my poor understanding of it! It&#8217;s the unsufficient documentation. It&#8217;s the bad written book. It&#8217;s the arrogance of the hibernate team members in their forum. It&#8217;s the way they handle bugs. It&#8217;s their inconsistence with these two totally separated query-languages. It&#8217;s their proxy-fuckup. And i&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>Every day another hibernate fuckup! And it is not (only) my poor understanding of it! It&#8217;s the <a href="http://www.hibernate.org/hib_docs/v3/reference/en/html_single/" target="_blank">unsufficient documentation</a>. <a href="http://www.amazon.com/review/R2291104FF5VAK?ASIN=1932394885&amp;nodeID=" target="_blank">It&#8217;s the bad written book</a>. It&#8217;s the <a href="http://forum.hibernate.org/viewtopic.php?p=2273553" target="_blank">arrogance</a> of the hibernate team members in their forum. It&#8217;s the way they handle <a href="http://opensource.atlassian.com/projects/hibernate/secure/IssueNavigator.jspa?reset=true&amp;&amp;type=1&amp;priority=1&amp;priority=2&amp;priority=3&amp;status=1&amp;sorter/field=issuekey&amp;sorter/order=DESC&amp;sorter/field=priority&amp;sorter/order=DESC" target="_blank">bugs</a>. It&#8217;s their inconsistence with these two totally separated query-languages. <a href="http://www.bb242.de/2008/04/02/how-to-live-with-hibernate-proxies/" target="_self">It&#8217;s their proxy-fuckup</a>. And i&#8217;m not alone with that perception&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2008/05/07/i-hate-hibernate/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>How to use Apache POI HSSF &#8211; some hints</title>
		<link>http://www.bb242.de/2008/04/18/how-to-use-apache-poi-hssf-some-hints/</link>
		<comments>http://www.bb242.de/2008/04/18/how-to-use-apache-poi-hssf-some-hints/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 14:12:08 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[HSSF]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[POI]]></category>
		<category><![CDATA[Spring]]></category>

		<guid isPermaLink="false">http://www.bb242.de/?p=325</guid>
		<description><![CDATA[Apache POI is a java library which allows to build Office-Documents. POI stands for &#8220;Poor obsfuscation interface&#8221; and is a good description. Nonetheless it&#8217;s the only lib I know which allows you to produce what most customers still don&#8217;t want to miss: MS Excel sheets and Docs. In the following post, I want to list [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://http//poi.apache.org/" target="_blank">Apache POI</a> is a java library which allows to build Office-Documents. POI stands for &#8220;Poor obsfuscation interface&#8221; and is a good description. Nonetheless it&#8217;s the only lib I know which allows you to produce what most customers still don&#8217;t want to miss: MS Excel sheets and Docs. In the following post, I want to list some hints I found in the last weeks when working on excel sheets:</p>
<p>- Cellstyles don&#8217;t work like normal objects: if you use a cellstyle for a cell and AFTERWARDS changes the style to use it for some other cell, you will find only the latter style in the resulting document</p>
<p>- Don&#8217;t mix up font definition and borders: Use the HSSFRegionUtil.setBorderXXX() for borders. This methods puts a border around the given region preserving the style (font) defined before. Keep in mind, that you have to use the method AFTER you defined the cell with a certain style.</p>
<p>- if you use Springs AbstractExcelView, do not just implement the  excel-building code in a subclass of it. Build an abstraction layer between the Spring view and the building code to avoid dependencies to HttpRequest and HttpResponse. Otherwise testing will be painful. I defined an AbstractDocumentBuildView extending the AbstractExcelView that defines an abstract method which passes only the Workbook and the data to the implementing subclasses.</p>
<p>- Make a big list of constants defining the column/row-structure and labels!</p>
<p>- It is not possible to make &#8220;autofilters&#8221; so far! Just don&#8217;t try it.</p>
<p>- To put a dataFormat of your choice in a cell, use  cellStyle.setDataFormat(<a href="http://poi.apache.org/apidocs/org/apache/poi/hssf/usermodel/HSSFDataFormat.html" target="_blank">HSSFDataFormat</a>.getBuiltinFormat(xxx));</p>
<p>- HSSF is short for &#8220;Horrible SpreadSheet Format&#8221; (not kiddin&#8217;!). So just try to take it easy &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2008/04/18/how-to-use-apache-poi-hssf-some-hints/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Http-Get and encoding &#8211; the technical stone age</title>
		<link>http://www.bb242.de/2008/04/03/http-get-and-encoding-the-technical-stone-age/</link>
		<comments>http://www.bb242.de/2008/04/03/http-get-and-encoding-the-technical-stone-age/#comments</comments>
		<pubDate>Thu, 03 Apr 2008 18:31:06 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[http-get]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[jetty]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[umlaut]]></category>
		<category><![CDATA[unicode]]></category>

		<guid isPermaLink="false">http://www.bb242.de/?p=317</guid>
		<description><![CDATA[Every day another fuckup. Today it was encoding. Somehow our excel exports did not work for cities with umlauts. MUST be an encoding thing. Interesting: It did work pretty well on Jetty, but good ol&#8217; Tomcat throwed me broken characters in my servletrequest. I tried javascript escape and the result was that it didn&#8217;t even [...]]]></description>
			<content:encoded><![CDATA[<p>Every day another fuckup. Today it was encoding. Somehow our excel exports did not work for cities with umlauts. MUST be an encoding thing. Interesting: It did work pretty well on Jetty, but good ol&#8217; Tomcat throwed me broken characters in my servletrequest.</p>
<p>I tried javascript escape and the result was that it didn&#8217;t even work in Jetty anymore. So after proper reading (<a href="http://jira.codehaus.org/browse/JETTY-113" target="_blank">http://jira.codehaus.org/browse/JETTY-113</a>, <a href="http://jetty.mortbay.org/jetty5/faq/faq_s_900-Content_t_International.html" target="_blank">http://jetty.mortbay.org/jetty5/faq/faq_s_900-Content_t_International.html</a>), I accepted that you just CANNOT put umlauts in a get-request. You are able to escape it, but there is apparently no standard how the server retranslates it. But how to do it? First idea was to post it. Post uses the given encoding and all is fine. And why not doin&#8217; it ajaxian? Well, because it just doesn&#8217;t work.  The server is building the document and returns the binary data, but what do I do then? Tried putting it in a new document, but it just doesn&#8217;t work. After a few hours and some thousand curses, I ended up writing a hidden html-form, which looks really ugly, being the ONLY handwritten form in the whole javascript-driven application.</p>
<p>In short:</p>
<p>Never try to use special characters in Http-Get!</p>
<p>Forget using ajax to retrieve a file!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2008/04/03/http-get-and-encoding-the-technical-stone-age/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to live with hibernate proxies</title>
		<link>http://www.bb242.de/2008/04/02/how-to-live-with-hibernate-proxies/</link>
		<comments>http://www.bb242.de/2008/04/02/how-to-live-with-hibernate-proxies/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 15:26:51 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[cglib proxy]]></category>
		<category><![CDATA[Hibernate]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[materialize]]></category>

		<guid isPermaLink="false">http://www.bb242.de/?p=315</guid>
		<description><![CDATA[Stumbled over the fucking hibernate-CGlib-Proxies again. So here is what I found out and what helped me a lot: If you load an object via the load()-method hibernate returns a proxy by default. As long as you don&#8217;t access any primitive property this thing won&#8217;t materialize. No prob, you might think and in most circumstances [...]]]></description>
			<content:encoded><![CDATA[<p>Stumbled over the fucking hibernate-CGlib-Proxies again. So here is what I found out and what helped me a lot:</p>
<p>If you load an object via the load()-method hibernate returns a proxy by default. As long as you don&#8217;t access any primitive property this thing won&#8217;t materialize. No prob, you might think and in most circumstances it isn&#8217;t. But consider this example:</p>
<p>class Plan {</p>
<p>// Cascade-type all, fetch lazy<br />
private Plan lastVersion;<br />
private boolean active</p>
<p>public Plan(Plan lastVersion){<br />
if (lastVersion != null){<br />
lastVersion.active = false;<br />
}<br />
this.active = true;<br />
}<br />
}</p>
<p>I don&#8217;t want to expose a public setter here to ensure the integrity of my versioning. Now the fuck-up:</p>
<p>Let&#8217;s say I get the current Plan from my Client and want to save it, the following code seems pretty straight forward:</p>
<p>// transactionmanaged service-method</p>
<p>Plan lastVersion = getHibernateTemplate().load(Plan.class, 4)</p>
<p>Plan currentPlan = new Plan(lastVersion);</p>
<p>getHibernateTemplate().saveOrUpdate(currentPlan);</p>
<p>BUT (as you might have guessed) this doesn&#8217;t work. At the end I do have two entries in my db both marked as active. Why that?  lastVersion is a cglib-Proxy and hibernate does not recognize any changes that are not done by the setter. A possible workaround would be a private setter in the plan class, but somehow not even this is recognized by hibernate. So what are our options? One is to change the fetchmode of the lastversion. But doing so means sucking all previous versions from db when loading. Same happens when you mark the class @Proxy(lazy=false) as its a recursive structure. Played around with access types a while but that doesn&#8217;t have any influence. Finally I found out, that if you work with the &#8220;real&#8221; object instead of the proxy, it all works fine. To do so, you have to use the method get() instead of load(). Get() makes the db call instantly and returns a materialized object. In difference to the eager-fetchmode, all containing subtypes remain proxies.</p>
<p>That all leads to the questions, how we can make a clean separation between the ORM-Layer and our business-objects with hibernate. It&#8217;s just not transparent, when we got hibernate-specific-behaving objects flyin&#8217; around in our domain-layer. And well, I don&#8217;t really have an answer on that&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2008/04/02/how-to-live-with-hibernate-proxies/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Alle Jahre wieder &#8211; Datumsprobleme beim Programmieren</title>
		<link>http://www.bb242.de/2008/01/02/alle-jahre-wieder-datumsprobleme-beim-programmieren/</link>
		<comments>http://www.bb242.de/2008/01/02/alle-jahre-wieder-datumsprobleme-beim-programmieren/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 13:20:42 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Osterberechnung]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2008/01/02/alle-jahre-wieder-datumsprobleme-beim-programmieren/</guid>
		<description><![CDATA[Es hätte so schön sein können. Da kommt man im neuen Jahr in das noch spärlich besetzte Büro und will in Frieden arbeiten. Und dann das: Ein Test crasht, weil das Osterdatum nicht richtig berechnet werden kann. Super&#8230; Hier das Snippet nach der Korrektur: int g = year % 19; // Golden number -1 int [...]]]></description>
			<content:encoded><![CDATA[<p>Es hätte so schön sein können. Da kommt man im neuen Jahr in das noch spärlich besetzte Büro und will in Frieden arbeiten. Und dann das: Ein Test crasht, weil das Osterdatum nicht richtig berechnet werden kann. Super&#8230;</p>
<p>Hier das Snippet nach der Korrektur:</p>
<p><code style="text-align:left"><br />
int g = year % 19;                                                // Golden number -1<br />
int c = year / 100;                                                // Century -1<br />
int h = (c - c / 4 - (8 * c + 13) / 25 + 19 * g + 15) % 30;<br />
int i = h - (h / 28) * (1 - (29 / (h + 1)) * ((21 - g) / 11));    // Anzahl Tage von 21.3. bis Vollmond vor Ostern<br />
int j = (year + year / 4 + i + 2 - c + c / 4) % 7;                // Wochentag des Vollmondes vor Ostern<br />
int l = i - j;                                                    // Anzahl Tage vom 21. bis Sonntag vor/an Ostern<br />
</code><code style="text-align:left"><br />
int month = 3 + (l + 40) / 44;<br />
int day = l + 28 - 31 * ( month / 4 ) ;<br />
</code><code style="text-align:left"><br />
return new DateTime(year, month, day, 0, 0, 0, 0, GregorianChronology.getInstance());<br />
</code></p>
<p>Die Formel stammt hierher:</p>
<p><a href="http://www.tondering.dk/claus/cal/node3.html#SECTION003130000000000000000" target="_blank">http://www.tondering.dk/claus/cal/node3.html#SECTION003130000000000000000</a></p>
<p>Aber bloss keine Klammer verändern!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2008/01/02/alle-jahre-wieder-datumsprobleme-beim-programmieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Berechnungen mit Fließkommazahlen</title>
		<link>http://www.bb242.de/2007/11/08/berechnungen-mit-flieskommazahlen/</link>
		<comments>http://www.bb242.de/2007/11/08/berechnungen-mit-flieskommazahlen/#comments</comments>
		<pubDate>Thu, 08 Nov 2007 11:39:40 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[BigDecimal]]></category>
		<category><![CDATA[Calculation]]></category>
		<category><![CDATA[Double]]></category>
		<category><![CDATA[Float]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/11/08/berechnungen-mit-flieskommazahlen/</guid>
		<description><![CDATA[Dringend anzuraten ist die Lektüre dieses Artikels: http://epramono.blogspot.com/2005/01/double-vs-bigdecimal.html Zusammengefasst: Wann immer man Berechnungen mit Kommazahlen macht, ist BigDecimal zu nutzen!!]]></description>
			<content:encoded><![CDATA[<p>Dringend anzuraten ist die Lektüre dieses Artikels:</p>
<p><a href="http://epramono.blogspot.com/2005/01/double-vs-bigdecimal.html" target="_blank">http://epramono.blogspot.com/2005/01/double-vs-bigdecimal.html</a></p>
<p>Zusammengefasst: Wann immer man Berechnungen mit Kommazahlen macht, ist BigDecimal zu nutzen!!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/11/08/berechnungen-mit-flieskommazahlen/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Schöner coden &#8211; einige Grundregeln</title>
		<link>http://www.bb242.de/2007/10/29/schoner-coden-einige-grundregeln/</link>
		<comments>http://www.bb242.de/2007/10/29/schoner-coden-einige-grundregeln/#comments</comments>
		<pubDate>Mon, 29 Oct 2007 19:05:00 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[beautiful code]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/10/29/schoner-coden-einige-grundregeln/</guid>
		<description><![CDATA[Im Rahmen meiner Arbeit bin ich immer wieder mit Code konfrontiert, der zwar super funktioniert, aber schöner und einfacher gestaltet werden könnte. Ich will an dieser Stelle mal einige Dinge sammeln, die hier weiterhelfen können. Vergleiche von Strings mit Konstanten schlecht: if (!string.equals(KONSTANTE){.. Problem: Nullpointer-Exception bei Null-String medium: if (string != null &#38;&#38; !string.equals(KONSTANTE){ ... [...]]]></description>
			<content:encoded><![CDATA[<p>Im Rahmen meiner Arbeit bin ich immer wieder mit Code konfrontiert, der zwar super funktioniert, aber schöner und einfacher gestaltet werden könnte. Ich will an dieser Stelle mal einige Dinge sammeln, die hier weiterhelfen können.</p>
<p>Vergleiche von Strings mit Konstanten</p>
<p>schlecht:</p>
<p><code>if (!string.equals(KONSTANTE){..</code></p>
<p>Problem: Nullpointer-Exception bei Null-String</p>
<p>medium:</p>
<p><code>if (string != null &amp;&amp; !string.equals(KONSTANTE){ ...</code></p>
<p>schöner:</p>
<p><code>if (!KONSTANTE.equals(string){ ...</code></p>
<p>In dieser Schreibweise wird die Nullprüfung unnötig. <code>"".equals(null)</code> gibt false zurück und verursacht keine Nullpointer-Exception.</p>
<p>Vergleiche mit Leerstring</p>
<p>schlecht:</p>
<p><code>eingabe.equals("")</code></p>
<p>Problem: siehe oben</p>
<p>medium:</p>
<p><code>"".equals(eingabe)</code></p>
<p>Problem: Es wird nicht beachtet, dass eingabe auch &#8221;  &#8221; sein kann.</p>
<p>medium/schlecht:</p>
<p><code>"".equals(eingabe.trim())</code></p>
<p>Problem: Hier rennt man wieder in eine Nullpointer, wenn eingabe null ist.</p>
<p>schön:</p>
<p><code>StringUtils.isEmpty(eingabe)</code></p>
<p>StringUtils ist eine Klasse aus den apache.commons und deckt alle Anforderungen in diesem Zusammenhang ab:</p>
<p><code>isEmpty (null)  == true</code></p>
<p><code>isEmpty("") == true</code></p>
<p><code>isEmpty("   ") == true</code></p>
<p><code>isEmpty ("something") == false</code></p>
<p>Analog ist mit Booleans zu verfahren. Hier gibt einem BooleanUtils entsprechende Hilfestellung. Aber Achtung: <code>BooleanUtils.isFalse(null)</code>  == false  und <code>BooleanUtils.isTrue(null)</code> == false!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/10/29/schoner-coden-einige-grundregeln/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PDFs konkateniert als HttpResponse zurückgeben</title>
		<link>http://www.bb242.de/2007/10/18/pdfs-konkateniert-als-httpresponse-zuruckgeben/</link>
		<comments>http://www.bb242.de/2007/10/18/pdfs-konkateniert-als-httpresponse-zuruckgeben/#comments</comments>
		<pubDate>Thu, 18 Oct 2007 14:14:59 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[concatenation]]></category>
		<category><![CDATA[iText]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[PDF]]></category>
		<category><![CDATA[Servlet]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/10/18/pdfs-konkateniert-als-httpresponse-zuruckgeben/</guid>
		<description><![CDATA[Um irgendwas mit PDF zu machen, bietet sich die Bibliothek iText an. Die API finde ich persönlich nicht sonderlich schön, aber man hat ja keine Wahl&#8230; Hier ein Snippet, wie man ganze PDF-Dokumente konkateniert und dann als ein PDF ausgibt. Es gibt sicherlich schönere Lösungen. Comments sind immer willkommen. Nachteilig ist hier vor allem die [...]]]></description>
			<content:encoded><![CDATA[<p>       Um irgendwas mit <abbr title="Portable Document Format">PDF</abbr> zu machen, bietet sich die Bibliothek <a href="http://www.lowagie.com/iText/" target="_blank">iText</a> an. Die <a href="http://itext.ugent.be/library/api/" target="_blank"><abbr title="Application Programming Interface">API</abbr></a> finde ich persönlich nicht sonderlich schön, aber man hat ja keine Wahl&#8230;</p>
<p>Hier ein Snippet, wie man ganze PDF-Dokumente konkateniert und dann als ein PDF ausgibt. Es gibt sicherlich schönere Lösungen. Comments sind immer willkommen. Nachteilig ist hier vor allem die Benutzung von byte[]. Je nach konkretem Anwendungsfall sollte man besser auf Streams umsteigen.</p>
<p><code>public doGet(HttpServleRequest request, HttpServletResponse response){</code></p>
<p><code>    byte[][] files = ...;</code></p>
<p>&#8230;</p>
<p><code>    String fileName = "myfile.pdf";</code><br />
<code><br />
response.setHeader("Pragma", "public");<br />
response.setHeader("Cache-control", "must-revalidate");<br />
response.setContentType("application/pdf");<br />
response.setHeader("Content-Disposition", "filename=" + fileName);</code></p>
<p><code>    Document document = new Document();</code></p>
<p><code>    PdfCopy copy = new PdfCopy(document, response.getOutputStream());<br />
document.open();<br />
for (int i = 0; i &lt; files.length; i++) {<br />
PdfReader reader = new PdfReader(files[i]);<br />
int pageNum = reader.getNumberOfPages();<br />
for (int j = 1; j &lt;= pageNum; j++) {<br />
copy.addPage(copy.getImportedPage(reader, j));<br />
}<br />
}<br />
document.close();</code></p>
<p>}</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/10/18/pdfs-konkateniert-als-httpresponse-zuruckgeben/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Checkliste Java-Projekte</title>
		<link>http://www.bb242.de/2007/09/24/checkliste-java-projekte/</link>
		<comments>http://www.bb242.de/2007/09/24/checkliste-java-projekte/#comments</comments>
		<pubDate>Mon, 24 Sep 2007 14:33:44 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/09/24/checkliste-java-projekte/</guid>
		<description><![CDATA[1. &#8230; 12. JRE-Kompatibilität Kommen beim Kompilieren Warnings? Ist dies der Fall, ist zu überprüfen, ob als &#8220;deprecated&#8221; gesetzte Klassen oder Methoden verwendet wurden. Es gibt einen ganzen Haufen Anwendungen, die mit JDK 1.5 einfach nicht mehr funktionieren, da verwendete Klassen oder Methoden nicht mehr von java.lang (oder anderen APIs) unterstützt werden. Fallen in einer [...]]]></description>
			<content:encoded><![CDATA[<p>1. &#8230;</p>
<p>12. <abbr title="Java Runtime Environment">JRE</abbr>-Kompatibilität</p>
<p>Kommen beim Kompilieren Warnings? Ist dies der Fall, ist zu überprüfen, ob als &#8220;deprecated&#8221; gesetzte Klassen oder Methoden verwendet wurden. Es gibt einen ganzen Haufen Anwendungen, die mit <abbr title="Java Development Kit">JDK</abbr> 1.5 einfach nicht mehr funktionieren, da verwendete Klassen oder Methoden nicht mehr von java.lang (oder anderen <abbr title="Application Programming Interface">API</abbr>s) unterstützt werden. Fallen in einer Version Elemente weg, so sind diese in älteren Versionen schon als deprecated gekennzeichnet.</p>
<p>1.6 Projektplanung</p>
<p>In jedem Projektplan ist Zeit zum Refactoren und zur Verbesserung der Performance einzuplanen. Nichts ist schlimmer, als in einem &#8211; natürlich auch wieder enorm zeitkritischen &#8211; Projekt in den erodierten Sourcen rumwühlen zu müssen und nach und nach immer unwartbareren Code zu pflegen.</p>
<p>14. Testing<br />
14.56 Zufallsgeneratoren überprüfen<br />
Zu testen:<br />
verschiedene Seeds in hintereinander generierten Random-Objekten? Initialisiert man mehrere Random-Objekte hintereinander, z.B in einer Schleife, tut es ein einfaches <samp>new Randon(System.currentTimeMillis())</samp> nicht mehr. Auf schnellen Rechnern führt das zu einem gleichen Verhalten der Randoms. Eine Lösung ist die Verwendung eines zusätzlichen Randoms zur Initialisierung.</p>
<p>23. Systemintegration</p>
<p>&#8230;</p>
<p>23.5 Speicherbedarf untersuchen</p>
<p>..</p>
<p>23.6 Garbage-Collection untersuchen</p>
<p>Bei der Systemintegration im Produktiv-, wie auch im Testsystem ist das Verhalten des Garbage-Collectors zu  untersuchen.</p>
<p>Die <abbr title="Java Virtual Machine">JVM</abbr> kann dazu mit den Parametern <kbd>-gc:verbose</kbd> und <kbd>-XX:+PrintGCDetails</kbd> gestartet werden.</p>
<p>Eine weitere interessante Perspektive gibt die Auswertung von jstat:</p>
<p><kbd>jps</kbd> zeigt alle vm-Ids der laufenden Virtual Machines. Befehl ist Teil vom <abbr title="Software Development Kit">SDK</abbr>. vm-Id ist typischerweise die pid.</p>
<p><kbd>jstat - [-t] [-h &lt;lines&gt;] &lt;vmid&gt; [&lt;interval&gt; [&lt;count&gt;]]</kbd><br />
Beispiel: <samp>jstat -gcutil -h3 99999 250 200</samp></p>
<p>Ein Tool, dass die Informationen zum Verhalten des Garbage Collector visualisiert, ist <kbd>visualgc</kbd>. Hier läßt sich auch der Grund für die Garbage Collection sehen: War es ein System.gc() oder gab es bessere Gründe? Das Tool ist nicht in der JDK 1.5 enthalten, kann aber bei Sun heruntergeladen werden.</p>
<p>Es sollte  auch ein Auge auf die Auslastung des Perm-Spaces geworfen werden.  Dieser ist unabhängig vom Gesamtheap. Die Größe läßt sich mit <kbd>-XX:PermSize=..MB </kbd>und <kbd>-XX:MaxPermSize=..MB</kbd> steuern. Im Default sollte die JVM 64<abbr title="Megabyte">MB</abbr> reservieren, der aber unter mysteriösen Umständen auch schrumpfen kann. Ich bin mir nicht ganz sicher, ob es sich dabei um ein normales Vergrößern des Virtual Spaces ( nicht allozierter, aber reservierter Speicher) handelt. Setzt man die Größe mit <kbd>-XX:PermSize</kbd> scheint die Größe sich aber nicht zu verändern.</p>
<p>Bei Serveranwendungen ist es wichtig, das Verhältnis von Young zu Tenured Space zu untersuchen. Finden zuviele Young collections statt? In einer größeren Serveranwendung kann man u.U. eine Ratio von 1:2 festlegen ( <kbd>-XX:NewRatio=2</kbd>) (Young 1 : 2 Tenured) .</p>
<p>Im Client-Teil einer Anwendung reichen die default-Einstellungen meist aus.</p>
<ul>
<li>visualgc <a href="http://java.sun.com/performance/jvmstat/" title="sun visualgc download page" target="_blank">download</a> <a href="http://java.sun.com/performance/jvmstat/visualgc.html" title="Sun visualgc documentation page" target="_blank">doc</a></li>
<li><a href="http://java.sun.com/docs/hotspot/gc1.4.2/" title="Dokumentation der Garbage Collectoren bei Sun" target="_blank">Dokumentation der Garbage Collectoren bei Sun</a></li>
<li><a href="http://java.sun.com/j2se/1.5.0/docs/tooldocs/share/jstat.html" title="Sun jstat documentation" target="_blank">jstat doku bei Sun</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/09/24/checkliste-java-projekte/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Velocity condensed</title>
		<link>http://www.bb242.de/2007/07/18/einfuhrung-velocity/</link>
		<comments>http://www.bb242.de/2007/07/18/einfuhrung-velocity/#comments</comments>
		<pubDate>Wed, 18 Jul 2007 14:05:31 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[templating]]></category>
		<category><![CDATA[velocity]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/07/18/einfuhrung-velocity/</guid>
		<description><![CDATA[Velocity ist keine Fahrradstadt, sondern ein Java-basiertes Templatesystem, dass eine Trennung zwischen Java-Code und Oberflächenbeschreibung erlaubt. Die Velocity Template Language (VTL) erlaubt den Aufruf von an anderer Stelle in Java implementierten Objekten und Methoden. Velocity geht über den reinen Einsatz auf Webpages hinaus. Auch SQL (u.v.m.) läßt sich damit zusammenbauen. Nach vergleichsweise langer Suche habe [...]]]></description>
			<content:encoded><![CDATA[<p>Velocity ist keine Fahrradstadt, sondern ein Java-basiertes Templatesystem, dass eine Trennung zwischen Java-Code und Oberflächenbeschreibung erlaubt. Die Velocity Template Language (VTL) erlaubt den Aufruf von an anderer Stelle in Java implementierten Objekten und Methoden. Velocity geht über den reinen Einsatz auf Webpages hinaus. Auch SQL (u.v.m.) läßt sich damit zusammenbauen.</p>
<p>Nach vergleichsweise langer Suche habe ich eine gute <a href="http://velocity.apache.org/engine/devel/user-guide.html" title="How-to-Seite" target="_blank">How-to-Seite</a> gefunden, aus der ich im Folgenden das Wesentliche wiedergebe.</p>
<p>Sprachsyntax:</p>
<p>- jede Anweisung beginnt mit #, Referenzen mit $</p>
<p>-Variablen werden mit $ gekennzeichnet, sie können im HTML-Code oder im Java-Code definiert und initialisiert werden: #set ( $a = &#8220;bla&#8221;), Variablen beginnen mit Buchstaben, so dass die Angabe $2.40 nicht als Variable interpretiert wird.</p>
<p>- Escaping mit \</p>
<p>-Strings: &#8221; &#8220;, wenn sowohl statischer Text, als auch zu interpretierende Variablen, &#8216; &#8216; wenn as-is.</p>
<p>- Comment: ## (single line),  #* *# (multiline), #** *# (documentation)</p>
<p>-drei Typen von Referenzen: variables ($var), properties($object.Property ruft, wenn vorhanden die Methode getProperty() auf &#8211; nicht verwechseln mit Instanzvariable! Auf diese kann nicht ohne Getter zugegriffen werden), methods ($object.eatThis( &#8220;banana&#8221;) ), wobei die Übergabe zwischen Java und Velocity immer über Strings läuft</p>
<p>- werden Properties verwendet, gibt bestimmte Lookup-Rules um auf die richtige Methode zu kommen</p>
<p>- ist eine Referenz zum Zeitpunkt der Ausführung nicht definiert, wird die Referenz als Klartext ausgegeben. Um stattdessen blank auszugeben, ist ein ! zu notieren: $!justDontPrintMeIfNull</p>
<p>- die zu den Referenzen angegebene Schreibweise ist die shorthand-Schreibweise. Wenn nötig, kann der Ausdruck mit geschweiften Klammern versehen werden: $!{object.doFormal()}</p>
<p>- Escapen mit \</p>
<p>-Anweisungen: beginnen immer mit #, lassen sich auch über {} schreiben: #{if}</p>
<p>-#set: zum Wertzuweisen: #set ( $var = XXX)  mit XXX als Property, Methodenrückgabe, Variable, Array ( [ "b", "c"]), Map ({&#8220;a&#8221; : &#8220;appel&#8221;, &#8220;b&#8221; : &#8220;banane&#8221;}), arithmetischer Ausdruck</p>
<p>- Standardmäßig kann KEIN null zugewiesen werden! Die Referenz bleibt erhalten!</p>
<p>-Konditionen: #if #ifelse #else #end(!)</p>
<p>-Evaluierung im #if: $var ist true, wenn boolean und true ODER $var ist nicht boolean und nicht null</p>
<p>- == kann zum Vergleich von Strings, Numbers oder Objects verwendet werden</p>
<p>- logische Operatoren &amp;&amp;, || und ! äquivalent zu Java</p>
<p>-#foreach( $thingie in $things) #end</p>
<p>- interne Variable für die Nummer des Schleifendurchlaufs: $velocityCount startet bei 1</p>
<p>- #include (&#8220;bla.txt&#8221;) : ungerendertes Einbauen, #parse (&#8220;vtlText.txt&#8221;) : rendern und einbauen; Dateien müssen unter TEMPLATE_ROOT liegen</p>
<p>-#stop. Stoppt die Velocity-Interpretation, zu Debugging-Zwecken sinnvoll.</p>
<p>Soviel zu Velocity condensed. Es gibt auch die Möglichkeit Macros zu schreiben (Velocimacros). Darauf möchte ich an dieser Stelle nicht weiter eingehen. In oben verlinktem How-to wird darauf näher eingegangen.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/07/18/einfuhrung-velocity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Best practices: SQL-Repositories</title>
		<link>http://www.bb242.de/2007/07/17/best-practices-sql-repositories/</link>
		<comments>http://www.bb242.de/2007/07/17/best-practices-sql-repositories/#comments</comments>
		<pubDate>Tue, 17 Jul 2007 09:48:01 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[sql]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/07/17/best-practices-sql-repositories/</guid>
		<description><![CDATA[Nachdem ich mich nun schon zum x-ten Mal durch Logfiles wühle, mal eine kleine Anregung: Werden die SQL-Statements einer Anwendung zentral in einer Datei gehalten (SQL-Repository/Statement-Repository), lohnt es sich, zu jedem Statement einen SQL-Kommentar aufzunehmen: Was macht das Statement und aus welchem Kontext wird es aufgerufen? Diese Kommentare werden typischerweise im Log gezeigt und vereinfachen [...]]]></description>
			<content:encoded><![CDATA[<p>Nachdem ich mich nun schon zum x-ten Mal durch Logfiles wühle, mal eine kleine Anregung: Werden die <abbr title="Structured Query Language">SQL</abbr>-Statements einer Anwendung zentral in einer Datei gehalten (SQL-Repository/Statement-Repository), lohnt es sich, zu jedem Statement einen SQL-Kommentar aufzunehmen: Was macht das Statement und aus welchem Kontext wird es aufgerufen? Diese Kommentare werden typischerweise im Log gezeigt und vereinfachen die Analyse enorm. Gleichzeitig sinkt die Fehlerwahrscheinlichkeit bei Korrekturen durch allgemeines Verständnis. Was für das Anwendungsprogramm gilt, muss auch für Statements gelten: DOKU OR DIE!</p>
<p>Bei Statements empfiehlt sich die Kommentierung mit &#8220;/*&#8221; und  &#8220;*/&#8221;, da der gebräuchlichere Einzellenkommentar mit &#8220;- -&#8221; ein blockweises Auskommentieren in <abbr title="eXtensible Markup Language">XML</abbr>-Dateien verhindert.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/07/17/best-practices-sql-repositories/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java Webstart (JWS) Remote debugging</title>
		<link>http://www.bb242.de/2007/06/25/java-webstart-jws-remote-debugging/</link>
		<comments>http://www.bb242.de/2007/06/25/java-webstart-jws-remote-debugging/#comments</comments>
		<pubDate>Mon, 25 Jun 2007 11:06:25 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[debugging]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[webstart]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/06/25/java-webstart-jws-remote-debugging/</guid>
		<description><![CDATA[Nach blöder Rumprobiererei habe ich endlich eine Remote Debugging connection hinbekommen. Hintergrund: Entwicklungsrechner mit Windows, Probleme unter Linux. Der Umstand, dass es sich um ein Webstart-App handelt, macht es noch ein bißchen kniffliger. Nach der Konsultation von einigen Foren und Blogs hab ich es jetzt geschafft: Auf dem Linuxrechner läuft die JVM im Debug-Modus und [...]]]></description>
			<content:encoded><![CDATA[<p>Nach blöder Rumprobiererei habe ich endlich eine Remote Debugging connection hinbekommen. Hintergrund: Entwicklungsrechner mit Windows, Probleme unter Linux. Der Umstand, dass es sich um ein Webstart-App handelt, macht es noch ein bißchen kniffliger. Nach der Konsultation von einigen Foren und Blogs hab ich es jetzt geschafft: Auf dem Linuxrechner läuft die <abbr title="Java Virtual Machine">JVM</abbr> im Debug-Modus und mit dem unter Windows installierten Eclipse kann ich (fast) debuggen, als wäre es eine aus Eclipse gestartete Anwendung. Voraussetzung ist natürlich, dass man den Sourcecode zur Verfügung hat. Reverse-Engineering mittels JODE funktioniert nur teilweise sauber. Ein weiterer -leider einschneidender- Nachteil ist der, dass die Variablenwerte nicht auslesbar sind. Es ist also sinnvoll, den Code mit entsprechend vielen Log-Statements zu instrumentieren, die über die Java-Konsole ausgelesen werden können.</p>
<p>Mein Vorgehen:</p>
<p>1. Die <abbr title="Virtual Machine">VM</abbr> muss mit bestimmten Flags gestartet werden. Dazu bietet sich die Umgebungsvariable JAVAWS_VM_ARGS an. Funktioniert hat es mit folgenden Parametern:</p>
<p><kbd>-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8888</kbd></p>
<p>Diese Konfiguration führt dazu, dass die VM auf Port 8888 hört. Firewalls sind ggf. auszuschalten bzw. zu konfigurieren. In einigen Foren habe ich gelesen, man müsse noch einen Servernamen angeben, wenn es sich nicht um localhost handelt. Das stimmt nicht.</p>
<p>2. Dann habe ich mir die bei einem vorherigen Start heruntergeladene <abbr title="Java Network Launching Protocol">JNLP</abbr>-Datei geschnappt und lokal gestartet: <kbd>javaws xxx.jnlp</kbd>. Die Konsolenausgaben geben ein gewisses Feedback, ob alles geklappt hat. Unter Windows ging das bei mir übrigens nicht. Da meckert er, er könne die Main-Class nicht finden. Warum? Keine Ahnung&#8230; U.U. muss die JNLP-Datei noch ein bißchen überarbeitet werden.</p>
<p>3. Zum Test auf dem Linux-Rechner den Debugger starten: <kbd>jdb -attach localhost:8888</kbd>. Hier ist es wichtig, den Servernamen mitanzugeben, sogar wenn es sich um localhost handelt.  Gelingt ein Connect ist alles in Butter. Gelingt er nicht: Viel Spass beim Wühlen im Netz.</p>
<p>4. Im Eclipse auf dem Windows-Rechner: Findet sich im, über &#8220;Debug&#8230;&#8221; geöffneten Menü im linken Teil ein Eintrag: &#8220;Remote Java Application&#8221;. Davon eine neue anlegen. Im Dialog den Port (8888) angeben und den Linux-Rechner eintragen (bei mir tat es nur die IP-Adresse). Projekt auswählen, Connection Type &#8220;Standard (Socket Attach)&#8221;. Alle anderen Einstellungen sind okay.</p>
<p>5. Bei gestarteter Linux-VM diese Konfiguration starten und fertig ist die Kiste. Es läßt sich debuggen wie gewohnt.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/06/25/java-webstart-jws-remote-debugging/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Der Unterschied zwischen nichts und nichts</title>
		<link>http://www.bb242.de/2007/04/27/der-unterschied-zwischen-nichts-und-nichts/</link>
		<comments>http://www.bb242.de/2007/04/27/der-unterschied-zwischen-nichts-und-nichts/#comments</comments>
		<pubDate>Fri, 27 Apr 2007 13:14:59 +0000</pubDate>
		<dc:creator>protokollfuehrer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[oracle]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/04/27/der-unterschied-zwischen-nichts-und-nichts/</guid>
		<description><![CDATA[Oracle bietet die schöne Funktion trim(), die Leerzeichen wegschneidet. Aber zum Teufel! irgendwie hat meine Abfrageklausel trim(table.field) &#60;&#62; '' NIE ein Ergebnis gebracht. Egal, ob field (ein char(10)-Feld) leer war oder nicht. Die Lösung: trim() verwandelt leere Strings (z.B. ' ') in null und nicht wie beispielsweise in Java in den Leerstring "". Auch '' [...]]]></description>
			<content:encoded><![CDATA[<p>Oracle bietet die schöne Funktion trim(), die Leerzeichen wegschneidet. Aber zum Teufel! irgendwie hat meine Abfrageklausel <code>trim(table.field) &lt;&gt; ''</code> NIE ein Ergebnis gebracht. Egal, ob <code>field</code> (ein char(10)-Feld) leer war oder nicht.<br />
Die Lösung: <code>trim()</code> verwandelt leere Strings (z.B. <code>'    '</code>) in <code>null</code> und nicht wie beispielsweise in Java in den Leerstring <code>""</code>. Auch <code>''</code> sieht Oracle als <code>null</code>. Und so ist <code>null</code> nie verschieden von <code>null</code>.</p>
<p>Mir war vorher noch nie aufgefallen, wie schwer es sein kann, DB-Admins von der Sinnhaftigkeit der Unterscheidung zwischen null und Leerstring zu überzeugen.  Naja, Datenbanken sind halt selten objektorientiert.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/04/27/der-unterschied-zwischen-nichts-und-nichts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ant Styles</title>
		<link>http://www.bb242.de/2007/03/13/ant-styles/</link>
		<comments>http://www.bb242.de/2007/03/13/ant-styles/#comments</comments>
		<pubDate>Tue, 13 Mar 2007 18:01:46 +0000</pubDate>
		<dc:creator>kOensen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[ant]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2007/03/13/ant-styles/</guid>
		<description><![CDATA[<pre>

<propertyregex property="jars.path.appxml" input="${jars.path.property}" regexp="([^\.]*)(dist\\apps\\myapp\.ear\\)([^\.]*)(\.jar)" replace="   &#60;module&#62;&#13;      &#60;java&#62;\3\4&#60;/java&#62;&#13;   &#60;/module&#62;&#13;" casesensitive="false" />

        <!-- Copy application.xml and use the correct jars -->
        <copy file="${apps.dir}/myapp.ear/META-INF/application.xml" toFile="${dist.dir}/myapp.ear/META-INF/application.xml">
            <filterset>
                <filter token="jars" value="${jars.path.appxml}" />
            </filterset>
        </copy>

</pre>]]></description>
			<content:encoded><![CDATA[<p>Heute bin ich in einem unserer Ant-Build-Skripte über etwas sehr Nettes gestolpert. In einer Config-Datei steht bei uns <code>@jars@</code>. Das läßt sich mit zur Build-Zeit ganz bequem dynamisch ersetzen. Z.B. durch eine Liste von Jars in einem speziellen Verzeichnis, wie im unteren Beispiel.</p>
<pre>&lt;propertyregex property="jars.path.appxml"
               input="${jars.path.property}"
               regexp="([^\\.]*)(dist\\\\apps\\\\myapp\\.ear\\\\)([^\\.]*)(\\.jar)"
               replace="&amp;&lt;module&amp;&gt; &amp;&lt;java&amp;&gt;\3\4&amp;&lt;/java&amp;&gt; &amp;&lt;/module&amp;&gt;"
               casesensitive="false" /&gt;

&lt;!-- Copy application.xml and use the correct jars --&gt;
&lt;copy file="${apps.dir}/myapp.ear/META-INF/application.xml"
      toFile="${dist.dir}/myapp.ear/META-INF/application.xml"&gt;
  &lt;filterset&gt;
    &lt;filter token="jars"
            value="${jars.path.appxml}" /&gt;
  &lt;/filterset&gt;
&lt;/copy&gt;</pre>
<p>Mehr dazu hier: <a href="http://ant.apache.org/manual/CoreTypes/filterset.html" title="http://ant.apache.org/manual/CoreTypes/filterset.html">http://ant.apache.org/manual/CoreTypes/filterset.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2007/03/13/ant-styles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Find the Bug</title>
		<link>http://www.bb242.de/2006/12/10/find-the-bug/</link>
		<comments>http://www.bb242.de/2006/12/10/find-the-bug/#comments</comments>
		<pubDate>Sun, 10 Dec 2006 17:27:13 +0000</pubDate>
		<dc:creator>kOensen</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2006/12/10/find-the-bug/</guid>
		<description><![CDATA[Gestern habe ich ein bißchen rumgehackt und bin mal wieder in den selben Fehler gerannt. Hier mal als Knobelaufgabe für alle Nerds: Ausschnitt aus einer Java-Methode: int bereich = 11; int probSum = 3; Random r1 = new Random(42); Random r2 = new Random(23); for (int i = 0; i &#60; 17 ; i++) { [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern habe ich ein bißchen rumgehackt und bin mal wieder in den selben Fehler gerannt. Hier mal als Knobelaufgabe für alle Nerds:</p>
<p>Ausschnitt aus einer Java-Methode:</p>
<p><!-- Alle Primzahlen wurden nur zur Verwirrung eingefuegt/--> <code style="text-align: left"> int bereich = 11;<br />
int probSum = 3;<br />
Random r1 = new Random(42);<br />
Random r2 = new Random(23);<br />
for (int i = 0; i &lt; 17 ; i++) {<br />
probSum = (Math.abs(r1.nextInt()) + Math.abs(r2.nextInt())) % bereich;<br />
System.out.println(probSum);<br />
} </code></p>
<p>Ausgabe z.B:</p>
<p>2</p>
<p><code style="text-align: left">12</code></p>
<p>-4</p>
<p>&#8230;</p>
<p>Quizfrage: Wie kann es sein, dass probSum nach dieser Zuweisung eine negative Zahl ist?????</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2006/12/10/find-the-bug/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Java für Mütter I</title>
		<link>http://www.bb242.de/2006/09/12/java-fur-mutter-i/</link>
		<comments>http://www.bb242.de/2006/09/12/java-fur-mutter-i/#comments</comments>
		<pubDate>Mon, 11 Sep 2006 22:57:01 +0000</pubDate>
		<dc:creator>kOensen</dc:creator>
				<category><![CDATA[Java-Tutorial]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.bb242.de/2006/12/12/java-fur-mutter-i/</guid>
		<description><![CDATA[Einleitung Also: Was ist Java? Java ist eine Insel in Indonesien, die für ihren wohlschmeckenden Kaffee bekannt ist. Gleichzeitig ist Java auch eine Programmiersprache. Und obgleich einige Ähnlichkeiten zwischen dem Insel- und dem Programmierleben bestehen, gibt es doch einige kleinere Unterschiede, die ich im Folgenden an die Mutter bringen will. Die Sprache Java ist eine [...]]]></description>
			<content:encoded><![CDATA[<p>Einleitung</p>
<p>Also: Was ist Java? Java ist eine Insel in Indonesien, die für ihren wohlschmeckenden Kaffee bekannt ist. Gleichzeitig ist Java auch eine Programmiersprache. Und obgleich einige Ähnlichkeiten zwischen dem Insel- und dem Programmierleben bestehen, gibt es doch einige kleinere Unterschiede, die ich im Folgenden an die Mutter bringen will.<br />
Die Sprache Java ist eine sogenannte &#8220;Objektorientierte Programmiersprache&#8221;. Das sagt einem zu Beginn genauso viel wie &#8220;Merapi&#8221; (ein Vulkan auf der Insel).<br />
Was es wirklich heißt, wird sich im Laufe meines Tutorials herausstellen. Es richtet sich, wie bereits mehrfach erwähnt, an Mütter. Das soll heißen, an Leute, die von Programmieren eigentlich keine Ahnung haben. Ich will hier also nur die Grundlagen vermitteln und keinen Einstieg in professionelle Software-Entwicklung verschaffen. Ich schaffe mir doch keine unnötige Konkurrenz, oder?</p>
<p>Teil 1: Grundschul-Informatik<br />
Jeder kennt Computer. Da laufen Programme drauf. Entweder man hat solche schon mal installiert, oder man ist deutlich zu unfähig, um dieses Tutorial durchzuarbeiten. Vielleich sollte man dann lieber die Zeit im <a href="http://www.computerbild.de">Kindergarten</a> verbringen. Aber was ist ein Programm genau? Ein Programm ist ein Text, in dem man dem Computer Anweisungen gibt, irgendetwas zu machen. Das sind Rechenbefehle oder Speicher- und Ladebefehle, oder auch irgendwelche grafischen Ausgaben, wie Fenster oder Meldungen. Eine Programmiersprache legt fest, WIE man die Befehle formuliert. Wenn man einen korrekt formulierten Programmier-Text hat, kann ein anderes Programm diesen &#8220;Code&#8221; lesen und den Computer dazu bringen, die gewünschten Sachen zu machen. Es gibt also quasi einen Übersetzer von dem, was man schreibt, in das, was der Computer versteht. Dieser Übersetzer heißt je nach Sprachtyp &#8220;Interpreter&#8221; oder &#8220;Compiler&#8221; und erlaubt, eine (relativ) einfach Kommunikation mit dem Computer. Man kann auch selbst mit dem Computer sprechen. Aber dessen Sprache ist sehr unschön. Er versteht nämlich nur Nullen und Einsen und die sprechen wenige Leute fließend. Fehler verzeiht er auch überhaupt nicht gerne.<br />
Java ist also nicht nur eine Programmiersprache, sondern gleichzeitig auch ein Programm: ein Übersetzerprogramm (&#8220;javac&#8221;) und ein Ausführungsprogramm (&#8220;java&#8221;). Um also irgendetwas programmieren zu können, müssen wir erstmal was installieren. Die Installation ist genau wie bei anderen Programmen auch: Runterladen. Öffnen. Ganz oft auf OK drücken.  Step by Step:<br />
1. Hier <a href="http://java.sun.com/javase/downloads/index.jsp"><abbr title="Java Development Kit">JDK</abbr> 6</a> herunterladen: Lizenzbedingungen akzeptieren und &#8220;windows offline installation, multi language&#8221; anklicken. Da es sich um 50 Megabyte handelt reicht hier kein normales Modem.</p>
<p>2.  Heruntergeladene Datei öffnen. Accept-&gt;Next-&gt;Warten-&gt;Next-&gt;Finish-&gt;Read me schließen.</p>
<p>Jetzt haben wir das Grundwerkzeug. Um einfacher Code zu schreiben, ist es auch gut, sich ein kleines Programmierschreib-Programm zu verwenden. Ein solches ist SciTE. Das installieren wir auch mal. Wenn wir das geschafft haben, können wir gleich mit dem ersten Programm starten.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bb242.de/2006/09/12/java-fur-mutter-i/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

