<?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>Groschengedanken zu Software &#187; java</title>
	<atom:link href="http://aysx.de/eingroschen/?feed=rss2&#038;tag=java" rel="self" type="application/rss+xml" />
	<link>http://aysx.de/eingroschen</link>
	<description>... und vielleicht auch dem ganzen Rest</description>
	<lastBuildDate>Tue, 18 Jun 2019 17:59:37 +0000</lastBuildDate>
	<language>de-DE</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.2.38</generator>
	<item>
		<title>Resume Next &#8211; in java</title>
		<link>http://aysx.de/eingroschen/?p=581</link>
		<comments>http://aysx.de/eingroschen/?p=581#comments</comments>
		<pubDate>Mon, 09 Feb 2015 18:40:43 +0000</pubDate>
		<dc:creator><![CDATA[matthias]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[ExceptionHandling]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://aysx.de/eingroschen/?p=581</guid>
		<description><![CDATA[Summary Lotus Script has a nice feature for exception handling called &#8220;resume next&#8221;. Java is missing this feature. This article shows an OOP way to implement it when looping an array. The Task Imagine you have a class UrlsContentCollector. You &#8230; <a href="http://aysx.de/eingroschen/?p=581">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Summary</p>
<p>Lotus Script has a nice feature for exception handling called <a title="manpage resume next" href="http://www-12.lotus.com/ldd/doc/domino_notes/Rnext/help6_designer.nsf/f4b82fbb75e942a6852566ac0037f284/072fcc7d8dec465185256c54004c3e8d?OpenDocument">&#8220;resume next&#8221;</a>. Java is missing this feature. This article shows an OOP way to implement it when looping an array.</p>
<p>The Task</p>
<p>Imagine you have a class <code>UrlsContentCollector</code>. You provide an <code><a href="http://docs.oracle.com/javase/7/docs/api/java/net/URL.html">URL</a>[]</code> and the collector gives you all the content of the given urls in one big chunk. What is your idea about handling exceptions here? Consider this: One of your applications named &#8220;Nippi&#8221; using the <code>UrlsContentCollector</code> is picky about the content. This application will produce bogus results, if there is any error in fetching the content e.g. one of the given urls is unreachable. There is another application called &#8220;Bob&#8221;. &#8220;Bob&#8221; is a little indifferent. One url unreachable? What the heck! Write a log entry and go on.</p>
<p>On the one hand you need to throw exceptions because of &#8220;Nippi&#8221;. But this will disturb &#8220;Bob&#8221;. &#8220;Bob&#8221; can decide to ignore the exceptions but it cannot get back to the point where the exceptions was raised to continue processing the list of urls.</p>
<p>Do you think about implementing <code>UrlsContentCollector</code> twice? A &#8220;noisy&#8221; implementation and a &#8220;quiet&#8221; one? Using <a title="oracle's tutorial about reflections" href="http://docs.oracle.com/javase/tutorial/reflect/">reflections</a> and if-blocks in order to decide what to do? I think there is a better way. Or two.</p>
<p>The Clients Decide</p>
<p>&#8220;Nippi&#8221; and &#8220;Bob&#8221; both use <code>UrlsContentCollector</code>, let&#8217;s call them clients. My idea is this: The <code>UrlsContentCollector</code> does not throw an exception but it notifies the client of the exception. In response the client tells the <code>UrlsContentCollector</code> wether to stop processing or not.</p>
<p>This is easy! Notification is done via a pattern called &#8220;<a title="Wikipedia about Observer pattern" href="http://en.wikipedia.org/wiki/Observer_pattern">observer</a>&#8220;. Its interface needs a method with an exception as parameter and a boolean in its answer. &#8220;Nippi&#8221; and &#8220;Bob&#8221; use the <code>ExceptionObserver</code>. Being notified they react differently. <code>UrlsContentCollector</code> has a chance to resume if the client wants it to.</p>
<p>Your Exception</p>
<p>&#8220;Nippi&#8221; and &#8220;Bob&#8221; do not care about which item caused the problem. &#8220;Bob&#8221;&#8216;s attitude is &#8220;Stop bothering me with details &#8211; just go on&#8221;. If &#8220;Nippi&#8221; and &#8220;Bob&#8221; take a little bit more of a care, then there is an other possibility. Let&#8217;s imagine that <code>UrlsContentCollector</code> takes an array of URLs and a starting position i to process the array from i to the end. Further imagine your own exception class <code>ListprocessingInterruptedException</code>. <code>UrlsContentCollector</code> throws a <code>ListprocessingInterruptedException</code> containing the current position processed. The client catching the exception knows where to start over and <code>UrlsContentCollector</code> gives the opportunity to do so.</p>
<p>Conclusion</p>
<p><code>ExceptionObserver</code> is easy to implement and easy to use. There is no duplicated code necessary here. The classes are loosly coupled. Three reasons why this is a good idea. Maybe this idea is against the odds. This is not the usual way to handle exceptions in java. But as a proverb puts it: &#8220;You have to swim against the tide if you want to get to the spring.&#8221;</p>
<p>Creating my own exception has an advantage over using the observer pattern. I.e. exception handling is not mixed with other kinds of behaviour. Notably it is not easily confused. As a proverb puts it: &#8220;If you are in Rome do as the Romans&#8221;. It&#8217;s easy to implement, it is <a title="Wikipedia about Do not repeat yourself" href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself">DRY</a>, it is loosly coupled.</p>
<p><a title="Source Code Resume Next" href="http://www.aysx.de/eingroschen/ResumeNext.jar">You can get some bare bones uncommented source code.</a></p>
<p>Howto decide? Convention rulz cleverness.</p>
]]></content:encoded>
			<wfw:commentRss>http://aysx.de/eingroschen/?feed=rss2&#038;p=581</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passwort-Generator</title>
		<link>http://aysx.de/eingroschen/?p=364</link>
		<comments>http://aysx.de/eingroschen/?p=364#comments</comments>
		<pubDate>Wed, 16 Jul 2014 05:20:30 +0000</pubDate>
		<dc:creator><![CDATA[matthias]]></dc:creator>
				<category><![CDATA[Allgemein]]></category>
		<category><![CDATA[Aufgabe]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[Lotus Notes]]></category>
		<category><![CDATA[Quelltext]]></category>

		<guid isPermaLink="false">http://aysx.de/eingroschen/?p=364</guid>
		<description><![CDATA[&#8220;Matthias&#8221;, sagte mein Chef, &#8220;wir brauchen mal eben einen Passwort-Generator&#8221; und schickte mir diese Anforderungen [crayon-6a09b38cf41ce152433331/] Das ist nicht schwer, oder? Die Kommentare im Java-Quelltext sind etwas ausführlicher als für mich üblich, weil ich hoffe, es allgemein unterhaltsam zu machen. &#8230; <a href="http://aysx.de/eingroschen/?p=364">Weiterlesen <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>&#8220;Matthias&#8221;, sagte mein Chef, &#8220;wir brauchen mal eben einen Passwort-Generator&#8221; und schickte mir diese Anforderungen</p>
<p></p><pre class="crayon-plain-tag">Zw. 8 - 14 Zeichen lang
Start und Ende KEIN Sonderzeichen
Mind. 2 Sonderzeichen
Mind. 2 Großbuchstaben
Mind. 2 Kleinbuchstaben
Mind. 2 Ziffern</pre><p> </p>
<p>Das ist nicht schwer, oder? Die Kommentare im Java-Quelltext sind etwas ausführlicher als für mich üblich, weil ich hoffe, es allgemein unterhaltsam zu machen. LotusScript ist unkommentiert &#8211; quick&#8217;n&#8217;dirty.</p>
<p>Der gezeigte Java-Quelltext entstand, nachdem ich die Aufgabe in LotusScript erledigt hatte. Die Variante in Java gefällt mir, weil sie deutlich zeigt, welche Anforderungen erfüllt werden. Der Quelltext in Java ist viel länger &#8211; das kann man als Nachteil werten. Aber er ist flexibler &#8211; dem LotusScript-Code kann man wegen der Starrheit keinen Vorwurf machen, denn schließlich musste es fertig werden.</p>
<p>Im grossen und ganzen beruhen beide auf derselben Idee, man erkennt viele Ähnlichkeiten, beispielsweise Definition der Menge auszuwählender Zeichen, beispielsweise zufallsgeleitetes finden einer freien Position.</p>
<p><a href="http://aysx.de/eingroschen/PasswordGenerator.jar">WordPress erlaubt es mir nicht, jar-Dateien hochzuladen. What a crap! Anyway, hier ist der Quelltext.</a> Du willst diesen Code benutzen? Erzeuge ein PasswordGenerator-Objekt und rufe getPassword auf. Deadsimple.</p>
<p>Im folgenden die wichtigsten Klassen.</p>
<p>PasswordGenerator</p><pre class="crayon-plain-tag">package de.aysx.pwgen;

import java.util.Random;

import de.aysx.pwgen.common.Auffueller;
import de.aysx.pwgen.common.Bedingungserfueller;
import de.aysx.pwgen.impl.AuffuellerAlleZeichen;
import de.aysx.pwgen.impl.AuffuellerGross;
import de.aysx.pwgen.impl.AuffuellerKlein;
import de.aysx.pwgen.impl.AuffuellerSZ;
import de.aysx.pwgen.impl.AuffuellerZiffer;
import de.aysx.pwgen.impl.KeinSZamAnfang;
import de.aysx.pwgen.impl.KeinSZamEnde;

/**
 * Einstiegspunkt für das Verständnis des PasswordGenerator-Projekts.
 * Diese Klasse wird benutzt, um ein Passwort zu generieren.
 * 
 * Kontrolliert, wie das Passwort erzeugt wird.
 * Steuert die Erzeuger-Klassen, steckt sie passend zusammen.
 *
 */
public class PasswordGenerator {

    /**
     * Minimale Länge des Passworts.&lt;br&gt;
     * Wenn man es noch flexibler möchte, dann macht man aus diesem Wert eine
     * Variable. Für's erste ist es eine Konstante.
     * 
     */
    public static final int MIN = 8;
    
    /**
     * Maximale Länge des Passworts.&lt;br&gt;
     * s.a. MIN.
     */
    public static final int MAX = 14;

    /**
     * 
     * @return ein zufälliges Password, das den Anforderungen entspricht.
     */
    public String getPassword() 
    {
        int lange = zufallsLaenge(); // Eine Zahl zwischen MIN und MAX.
        int egal = 0; // Wird für die syntaktische Korrektheit benötigt.

        /* Diese Variable enthält die Zeichen des Passworts. Noch ist 
         * sie leer.
        */
        char[] c = new char[lange];
        
        /* Hier spiegelt sich deutlich die Anforderung wider, welche Zeichen 
         * enthalten sein sollen und wieviele jeweils.
         * SZ steht für "Sonderzeichen".
         */
        Auffueller fueller =
                new AuffuellerKlein     ( 2,
                new AuffuellerSZ        ( 2,
                new AuffuellerZiffer    ( 2,
                new AuffuellerGross     ( 2,
                /* Wenn das PW mehr als 8 Zeichen hat, dann wird der restliche
                         Freiraum mit beliebigen Zeichen aufgefüllt. Die 
                         Anzahl ist "egal", weil ein AuffuellerAlleZeichen
                         dafür sorgt, dass alle restlichen freien Positionen 
                         belegt werden. */
                new AuffuellerAlleZeichen ( egal, null )))));

        /* Ein weiterer Teil der Anforderung - deutlich sichtbar mit
         * wenig Phantasie.
         */
        Bedingungserfueller bed =
                new KeinSZamAnfang  (
                new KeinSZamEnde    (null));

        // Passwort erzeugen, Variable c verändern; Obacht: Output-Parameter.
        fueller.fuelle ( c );
        bed.pruefenKorrigierenWeitergeben ( c, 0, c.length - 1 );

        // Rückgabewert aufbereiten;
        String erg = "";
        for (int i = 0; i &lt; c.length; i++) {
            erg += new Character(c[i]);
        }
        
        // Fertig. Der uninteressierte Leser kann hier aufhören.
        return erg;
    }

    /**
     * @return eine Zahl zwischen MIN und MAX;
     */
    private int zufallsLaenge() {
        int erg = 0;
        Random r = new Random();
        erg = MIN + r.nextInt(MAX - MIN + 1);
        return erg;
    }
}</pre><p> </p>
<p>Konstanten</p><pre class="crayon-plain-tag">/**
 * Konstanten im Projekt PasswordGenerator.
 */
public class Constants
{
    /* Auf Wunsch sind einige Zeichen nicht enthalten. */
    public static final String SONDERZEICHEN = "!§$%&amp;/()=}][{-_.:,;&lt;&gt;"; 

    /* Kleinbuchstaben */
    public static final String KLEINBUCHSTABEN = "abcdefghijklmnopqrstuvwxyz"; 

    /* Grossbuchstaben */
    public static final String GROSSBUCHSTABEN = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    /* Ziffern */
    public static final String ZIFFERN = "0123456789";
	
}</pre><p></p>
<p>Auffueller</p><pre class="crayon-plain-tag">package de.aysx.pwgen.common;

import java.util.Random;

/**
 * Fuellt ein Char[] mit der angegebenen Anzahl von Zeichen.&lt;br&gt;
 * Danach wird der nächste Auffueller aufgerufen, wenn einer vorhanden ist.&lt;br&gt;
 * &lt;br&gt;
 * Die unterschiedlichen konkreten Ausprägungen dieser Klasse leisten 
 * wesentlich eins: Sie stellen eine jeweils passende Menge von Zeichen zur
 * Verfügung, aus der mittels Zufallsgenerator eine bestimmte Anzahl ausgewählt
 * wird.&lt;br&gt;
 * Beispiel: AuffuellerGross ( 2, ...) kennt alle Grossbuchstaben und wählt
 * aus dieser Menge zwei Buchstaben aus.
 */
public abstract class Auffueller {

    public Auffueller(int zeichenAnzahl, Auffueller next) {
        setAnzahl(zeichenAnzahl);
        setNext(next);
    }

    /**
     * Aus welcher Zeichenklassen sollen Zeichen gezogen werden? Aus dieser!
     */
    public abstract String getZeichenklasse();

    /**
     * Wieviele Zeichen sollen gezogen werden? So viele!
     */
    public int getAnzahl() {
        return anzahl;
    }

    /** 
     * Diskutieren: Soll dieser Member immutable sein?
     * s.a. http://en.wikipedia.org/wiki/Immutable
     */
    public void setAnzahl(int i) {
        anzahl = i;
    }
    
    private int anzahl;

    /**
     * Ein Auffueller kann einen anderen Auffueller dekorieren, so dass zuerst
     * das eine getan wird und dann der nächste Auffueller das nächste tut usw.
     * bis zum Ende der Kette.
     * 
     * @return Den dekorierten Auffueller.
     */
    public Auffueller getNext() {
        return nextAuffueller;
    }

    /** 
     * TODO: Immutable?
     */
    public void setNext(Auffueller a) {
        nextAuffueller = a;
    }
    
    private Auffueller nextAuffueller;

    /**
     * TODO Beachten Konstraints, z.B. Laenge des Arrays &gt;= getAnzahl, z.B.
     * Anzahl der freien Plätze im Array &gt;= getAnzahl. Erstmal gehe ich davon
     * aus, dass schon alles gutgeht. Dieser Code ist noch provisorisch.&lt;br&gt;
     * 
     * @param c das zu fuellende Array
     * @return ein char[], das entsprechend diesem Auffueller und seinen
     *         dekorierten Auffuellern bearbeitet wurde.
     */
    public char[] fuelle ( char[] c )
    {
        for (int i = 0; i &lt; getAnzahl(); i++) {
            c [ getLeerePosZufaellig ( c )] = getZufallschar ();
        }

        /* Wie Yoda ich spreche, weil oft zum Vorteil es ist in LotusScript
         * und abgefärbt das hat. http://de.wikipedia.org/wiki/Yoda_Conditions
         */
        if (null != getNext()) {
            getNext().fuelle(c);
        }

        return c;
    }

    /**
     * @return Ein Zeichen, das zufällig aus der Menge der hier bekannten
     * Zeichen ausgewählt wird.
     */
    public char getZufallschar ()
    {
        Random random = new Random ();
        int max = getZeichenklasse ().length ();
        int pos = random.nextInt ( max );
        char erg = getZeichenklasse ().charAt( pos );
        return erg;
    }

    /**
     * Im LotusScript findet sich eine andere Implmentierung und die
     * Idee zum folgenden Allgorithmus.
     *
     * @param c Das zu füllende Array.
     * @return Eine zufällig ausgewählte leere Stelle in c.
     */
    private int getLeerePosZufaellig ( char[] c )
    {
        int erg = 0;
        
        /* Anzahl Leerstelle ermitteln. */
        int anzahlLeer = 0;
        for ( int i = 0; i < c.length; i++ ){
            if ( 0 == c[i]){
                anzahlLeer ++;
            }
        }
        
        /* Mapping Leerstelle zu Index. */
        int[] auswahl = new int [ anzahlLeer ];
        int k = 0;
        for ( int i = 0; i < c.length; i++ ){
            if ( 0 == c[i]){
                auswahl [k] = i;
                k ++;
            }
        }
        
        /* Zufaellig auswaehlen und Zurueck-mapping. */
        Random r = new Random ();
        erg = r.nextInt ( anzahlLeer );
        return auswahl [erg];
    }
}</pre><p> </p>
<p>Bedingungserfueller</p><pre class="crayon-plain-tag">package de.aysx.pwgen.common;

/**
 * Prüft, ob ein Char[] einer bestimmten Bedingung genügt.&lt;br&gt;
 * Wenn es der Bedingung nicht genügt, dann werden Zeichen getauscht, so
 * dass die Bedingung erfüllt ist.&lt;br&gt;
 * Nachdem die Bedingung erfüllt ist, wird das zu prüfende Array an den
 * nächsten Bedingungsprüfer weitergegeben (Dekorator-Pattern).
 * 
 */
public abstract class Bedingungserfueller
{
    private Bedingungserfueller next;

    /**
     * @return Der nächste Bedingungserfüller. Darf null sein.
     */
    public Bedingungserfueller getNext ()
    {
            return next;
    }

    public void setNext ( Bedingungserfueller next )
    {
            this.next = next;
    }

    public Bedingungserfueller ( Bedingungserfueller next )
    {
            this.next = next;
    }

    /**
     * Diese Methode prüft, ob die jeweils zu implementierende Bedingung erfüllt
     * ist. Falls nicht, wird korrigiert. Und wenn es einen nächsten 
     * Bedingungserfüller gibt, dann wird er aufgerufen.
     * 
     * @param c das zu prüfende Array
     * @param vonPos Die Stelle, von der an das Array geprüft und verändert 
     * werden soll. Wenn ich z.B. einen Erste-Stelle-Prüfer habe, und der hat die erste
     * Stelle korrigiert, dann muss verhindert werden, dass die Korrektur verändert
     * wird. Das erreiche ich, indem der vonPos einen passenden Wert hat.
     * 
     * @param bisPos Die Stelle, bis zu der das Array geprüft und verändert
     * werden soll. Gegenstück zu vonPos.
     * 
     * @return ein korrigiertes Array.
     *
     * TODO Methode umbenennen, weil "Weitergeben" redundant ist.
     */
    public abstract char[] pruefenKorrigierenWeitergeben ( char[] c, int vonPos, int bisPos );
	
}</pre><p> </p>
<p>Die konkreten Implementierungen von Auffueller und Bedingserfueller finden sich in der jar-Datei.</p>
<p>Und nun zu etwas ganz anderem: Ein Password-Generator in LotusScript. Entstanden ist er nach einer Skizze an der Tafel. So sind einige Grobheiten enthalten, Beispiel die Variablen S, T, G, K, Z, die zugehörenden *unten und *oben und deren Initialisierung. Die Java-Implementierung hat davon &#8220;gelernt&#8221;. Änderungen werden an diesem Quelltext nicht mehr vorgenommen: Er funktioniert, ist ausreichend schnell und leserlich, so daß auch die Kollegen ihn warten können. Mission erfüllt.</p><pre class="crayon-plain-tag">'++LotusScript Development Environment:2:5:(Options):0:74
%REM
	Library RandomPassword
	Created 10.07.2014 by
	Description: Comments for Library
%END REM
Option Public
Option Declare


'++LotusScript Development Environment:2:5:(Forward):0:1
Declare Sub Initialize
Declare Function pickZufallUndEntferne ( stringArray As Variant ) As String
Declare Function ArrayToString (  stringArray As Variant ) As String
Declare Function findeLeerePosZufaellig ( stringArray As Variant ) As Integer
Declare Function berechnePassword As String

'++LotusScript Development Environment:2:5:(Declarations):0:10
Dim S As String
Dim Sunten As Integer
Dim Soben As Integer

Dim T As String
Dim Tunten As Integer
Dim Toben As Integer

Dim G As String
Dim Gunten As Integer
Dim Goben As Integer

Dim K As String
Dim Kunten As Integer
Dim Koben As Integer

Dim Z As String
Dim Zunten As Integer
Dim Zoben As Integer

Dim sonder (1 To 2 ) As String
Dim gkz (1 To 6 ) As String

Dim Laenge_min As Integer
Dim Laenge_max As Integer
Dim Laenge_akt As Integer

'++LotusScript Development Environment:2:2:Initialize:1:10
Sub Initialize
	' ---------------------------------------------------------------------------------------
	' init Konstanten
	' ---------------------------------------------------------------------------------------
	S = "!§$%&amp;/()=*'_:;,.-&lt;&gt;"
	Sunten = 1
	Soben = Len ( S )
	
	T = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	Tunten = 1
	Toben = Len ( T )
	
	G = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
	Gunten = 1
	Goben = Len ( G )
	
	K = "abcdefghijklmnopqrstuvwxyz"
	Kunten = 1
	Koben = Len ( K )
	
	Z = "0123456789"
	Zunten = 1
	Zoben = Len ( Z )
	
	Laenge_min = 8
	Laenge_max = 14
	Laenge_akt = ( Laenge_max - Laenge_min )*Rnd() + Laenge_min
	
	' ---------------------------------------------------------------------------------------
	' init Variablen
	' ---------------------------------------------------------------------------------------
	
	Dim i As Integer
	i = 0
	Dim tmp As Integer
	
	For i = 1 To 2
		tmp = ( Soben - Sunten )*Rnd() + Sunten
		sonder ( i ) =  Mid ( S, tmp, 1 )
	Next
	
	For i = 1 To 2
		tmp = ( Goben - Gunten )*Rnd() + Gunten
		gkz ( i ) =  Mid ( G, tmp, 1 )	
	Next
	
	For i = 3 To 4
		tmp = ( Koben - Kunten )*Rnd() + Kunten
		gkz ( i ) =  Mid ( K, tmp, 1 )	
	Next
	
	For i = 5 To 6
		tmp = ( Zoben - Zunten )*Rnd() + Zunten
		gkz ( i ) =  Mid ( Z, tmp, 1 )		
	Next
	
	Dim erg As String
	erg = ArrayToString ( sonder )
	erg = erg + ArrayToString ( gkz )
End Sub

'++LotusScript Development Environment:2:1:pickZufallUndEntferne:5:8
%REM
	Function pickZufallUndEntferne
	Description: Comments for Function
%END REM
Function pickZufallUndEntferne ( stringArray As Variant ) As String
	Dim max As Integer
	max = UBound( stringArray )
	
	Dim tmp As Integer
	tmp = ( max - 1 ) * Rnd() + 1
	
	Dim erg As String
	erg = stringArray ( tmp ) 
	
	While ( erg = "" )
		tmp = ( max - 1 ) * Rnd() + 1
		erg = stringArray ( tmp ) 
	Wend
	
	stringArray (tmp) = ""
	pickZufallUndEntferne = erg
End Function

'++LotusScript Development Environment:2:1:ArrayToString:2:8

Function ArrayToString (  stringArray As Variant ) As String
	Dim erg As String
	erg = ""
	ForAll x In stringArray
		erg = erg + x
	End ForAll
	ArrayToString = erg
End Function

'++LotusScript Development Environment:2:1:findeLeerePosZufaellig:5:8
%REM
	Function findeLeerePosZufaellig
	Description: Bedenke, dass es lange dauert in einem grossen 
        Array, das nur noch eine Leerstelle hat, die freie Stelle so zu "finden".
        Vorschlag, Skizze: Sei n Anzahl Leerstellen und es gebe ein 
        Mapping für 0 <= i <= n für den Index der Leerstelle. Berechne k als Zufallszahl 
        zwischen 0 und n-1 und ermittle durch das Mapping den gesuchten Index.
%END REM
Function findeLeerePosZufaellig ( stringArray As Variant ) As Integer
	Dim erg As Integer
	erg = 0
	
	Dim s As String
	s = stringArray ( erg )
	
 	Dim max As Integer
 	max = UBound( stringArray )
	
 	While ( s &lt;&gt; "" )
            erg = ( max - 1 ) * Rnd() + 1
 	    s = stringArray ( erg )
 	Wend
	
	 findeLeerePosZufaellig = erg
End Function

'++LotusScript Development Environment:2:1:berechnePassword:5:8
%REM
	Function berechnePassword
	Description: Comments for Function
%END REM
Function berechnePassword As String
	Call Initialize()
	Dim erg () As String
	ReDim erg ( Laenge_akt ) As String 
	
        ' Kein SZ am Anfang und Ende.
	erg (0) = pickZufallUndEntferne ( gkz )
	erg ( Laenge_akt-1 ) = pickZufallUndEntferne ( gkz )
	
	Dim rndPos As Integer
	
        ' Grossbuchstaben, Kleinbuchstaben und Ziffern verteilen.
	ForAll x In gkz
		If Not ( x = "" ) Then 
			rndPos = findeLeerePosZufaellig( erg )
			erg ( rndPos ) = x
		End If
	End ForAll
	
        ' Sonderzeichen verteilen.
	ForAll x In sonder
		rndPos = findeLeerePosZufaellig( erg )
		erg ( rndPos ) = x
	End ForAll
	
	' Nun enthaelt erg 8 nicht-leere Zeichen.
	' Die Leerstellen fuellen mit Zufallsstelle aus T.
	ForAll x In erg
		If ( x = "" ) Then
			rndPos = ( Toben - Tunten )*Rnd() + Tunten
			x = Mid ( T, rndPos, 1 )
		End If 
	End ForAll
	
	berechnePassword = ArrayToString( erg )
End Function</pre><p> </p>
<p>Im LotusScript hat man einen guten Überblick über den gesamten konkreten Algorithmus, in Java erkennt man nur Umrisse. Die Java-Klassen kann ich an anderer Stelle wiederverwenden a) falls so etwas wieder gebraucht wird &#8211; mit der Perspektive &#8220;nie&#8221; und b) falls ich mich daran erinnere, dass die genau passenden Klassen genau hier zu finden sind. Das LotusScript ist &#8220;nur&#8221; als ganzes wiederverwendbar. Nur weil es nicht objektorientiert ist, heisst das nicht, dass es schlecht ist. Just because you&#8217;re paranoid it don&#8217;t mean they&#8217;re not after you. Have a nice day.</p>
]]></content:encoded>
			<wfw:commentRss>http://aysx.de/eingroschen/?feed=rss2&#038;p=364</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
