|
| Simon vs. OverMagten...[autonummerering]. Fra : Simon... |
Dato : 23-08-02 17:01 |
|
Hejsa,
Så er det sket igen.... jeg har et problem.. denne gang mener mine lærere
godt nok det ikke kan løses, men jeg ville nu spørge jer alligevel, da i for
det meste, lyder somom i ved mere end dem :)
hvis nu, jeg har en klasse med en main, og en klasse, fx. bil, og jeg gerne
vil have noget autonummerering på obj numrene, then how to do it ??:
main:
Bil bil.autoNummerering() = new Bil("750 hk", "blå");
kan man så ikke lave en metode i klassen Bil, der kan give mig noget
autonummerering, jeg var ude i noget lign. det her:
Bil:
private int nummer = 1;
private String hovedDel = new String("BilNr");
public String autoNummerering()
{
String report = new String(hovedDel);
report += nummer;
nummer++;
return report;
}
så ville jeg have mine obj, kom til at hede noget henad: "BilNr1",
"BilNr2"....
jeg kan godt se problemet i at jeg returnerer en String, som skal være
navnet, men kan det ikke afhjælpes ?
- hvis jeg ikke vil lægge mine objekter i et array... .?
Nu har jeg prøvet at finde en løsning i nogle dage før jeg spurgte mine
lærere, men nu synes jeg at være løbet ind i en mur.... en stor en.. kunne
ikke engang finde noget på google :((
1000 tak
mvh.Simon
| |
Michael Banzon (23-08-2002)
| Kommentar Fra : Michael Banzon |
Dato : 23-08-02 17:18 |
|
Jeg ved ikke lige helt...
Du kunne lave en klasse (nogenlunde) sådan her:
public class Bil {
public static int num;
private String s1;
private String s2;
private String nummer;
public Bil(String str1, String str2) {
s1 = str1;
s2 = str2;
nummer = new String("BilNr" + new Integer(num++).toString());
}
public static initBiler() {
num=1;
}
}
så skal du bare kalde Bil.initBiler() en enkelt gang, så er du klar til
at lave nye autonummererede Bil-objekter (der er muligvis nogle
Exceptions der skal catches??)...
jeg har ikke testet det, men mener at det burde virke?? hvad siger i
andre??
/ Michael
Simon... wrote:
> Hejsa,
>
> Så er det sket igen.... jeg har et problem.. denne gang mener mine lærere
> godt nok det ikke kan løses, men jeg ville nu spørge jer alligevel, da i for
> det meste, lyder somom i ved mere end dem :)
>
> hvis nu, jeg har en klasse med en main, og en klasse, fx. bil, og jeg gerne
> vil have noget autonummerering på obj numrene, then how to do it ??:
>
>
>
> main:
>
> Bil bil.autoNummerering() = new Bil("750 hk", "blå");
>
>
>
>
> kan man så ikke lave en metode i klassen Bil, der kan give mig noget
> autonummerering, jeg var ude i noget lign. det her:
>
>
>
>
> Bil:
>
> private int nummer = 1;
> private String hovedDel = new String("BilNr");
>
> public String autoNummerering()
> {
> String report = new String(hovedDel);
> report += nummer;
> nummer++;
>
> return report;
> }
>
>
>
>
> så ville jeg have mine obj, kom til at hede noget henad: "BilNr1",
> "BilNr2"....
>
> jeg kan godt se problemet i at jeg returnerer en String, som skal være
> navnet, men kan det ikke afhjælpes ?
> - hvis jeg ikke vil lægge mine objekter i et array... .?
>
>
> Nu har jeg prøvet at finde en løsning i nogle dage før jeg spurgte mine
> lærere, men nu synes jeg at være løbet ind i en mur.... en stor en.. kunne
> ikke engang finde noget på google :((
>
>
>
> 1000 tak
>
> mvh.Simon
>
>
>
>
| |
Ulrik Magnusson (23-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 23-08-02 18:01 |
|
"Simon..." wrote:
> Hejsa,
>
> Så er det sket igen.... jeg har et problem.. denne gang mener mine lærere
> godt nok det ikke kan løses, men jeg ville nu spørge jer alligevel, da i for
> det meste, lyder somom i ved mere end dem :)
>
> hvis nu, jeg har en klasse med en main, og en klasse, fx. bil, og jeg gerne
> vil have noget autonummerering på obj numrene, then how to do it ??:
>
> main:
>
> Bil bil.autoNummerering() = new Bil("750 hk", "blå");
>
> kan man så ikke lave en metode i klassen Bil, der kan give mig noget
> autonummerering, jeg var ude i noget lign. det her:
>
> Bil:
>
> private int nummer = 1;
> private String hovedDel = new String("BilNr");
>
> public String autoNummerering()
> {
> String report = new String(hovedDel);
> report += nummer;
> nummer++;
>
> return report;
> }
>
> så ville jeg have mine obj, kom til at hede noget henad: "BilNr1",
> "BilNr2"....
Måske noget i denne retning:
class Bil
{
private static int idCount = 1;//tæller på klassen
private int id = idCount++;// giv et id og inkrementer klassevariablen ved
konstruktion
private String name = "Bil nr. ";
Bil()
{
name += id;
}
String getName()
{
return name;
}
}
Spørgsmålet er så måske om
private int id = idCount++;// giv et id og inkrementer klassevariablen ved
konstruktion
er trådsikker?
Ulrik Magnusson
| |
Dennis B. Hansen (26-08-2002)
| Kommentar Fra : Dennis B. Hansen |
Dato : 26-08-02 10:08 |
|
Tjoo... Increment (optælling) af en int variable er trådsikker, så du
vil ikke få biler med samme numre. Altså med mindre du lukker
applikationen ned og starter den op igen, for både din (Ulrik) og
Michael Banzons løsning lider af samme problem; at de kun tæller op
for en applikations kørsel af gangen. Problemet kan dog hurtigt løses
ved at gemem "tælleren" i en fil/database.
Men det er også lige meget... Synes bare lige jeg ville sige lidt om
"static", da den statiske variabel ikke er forklaret i nogen af jeres
indlæg.
Static variable og metoder kaldes også "klasse variable/metoder", da
man kan operere med den uafhængigt af de enkelte instancer af klassen
(objekter). Det bevirker i begge eksempler at man kan lave en tæller
der holder styr på hvor mange objekter der er lavet af en klasse,
hvilket jo basalt set er det der er behov for i Simons spørgsmål.
Hygge
/Dennis
On Fri, 23 Aug 2002 19:00:49 +0200, Ulrik Magnusson <ulrikm@yahoo.com>
wrote:
>"Simon..." wrote:
>
>> Hejsa,
>>
>> Så er det sket igen.... jeg har et problem.. denne gang mener mine lærere
>> godt nok det ikke kan løses, men jeg ville nu spørge jer alligevel, da i for
>> det meste, lyder somom i ved mere end dem :)
>>
>> hvis nu, jeg har en klasse med en main, og en klasse, fx. bil, og jeg gerne
>> vil have noget autonummerering på obj numrene, then how to do it ??:
>>
>> main:
>>
>> Bil bil.autoNummerering() = new Bil("750 hk", "blå");
>>
>> kan man så ikke lave en metode i klassen Bil, der kan give mig noget
>> autonummerering, jeg var ude i noget lign. det her:
>>
>> Bil:
>>
>> private int nummer = 1;
>> private String hovedDel = new String("BilNr");
>>
>> public String autoNummerering()
>> {
>> String report = new String(hovedDel);
>> report += nummer;
>> nummer++;
>>
>> return report;
>> }
>>
>> så ville jeg have mine obj, kom til at hede noget henad: "BilNr1",
>> "BilNr2"....
>
>Måske noget i denne retning:
>
>class Bil
>{
> private static int idCount = 1;//tæller på klassen
> private int id = idCount++;// giv et id og inkrementer klassevariablen ved
>konstruktion
> private String name = "Bil nr. ";
> Bil()
> {
> name += id;
> }
> String getName()
> {
> return name;
> }
>}
>
>Spørgsmålet er så måske om
> private int id = idCount++;// giv et id og inkrementer klassevariablen ved
>konstruktion
> er trådsikker?
>
>Ulrik Magnusson
>
| |
Ulrik Magnusson (26-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 26-08-02 15:52 |
|
"Dennis B. Hansen" wrote:
> Tjoo... Increment (optælling) af en int variable er trådsikker, så du
> vil ikke få biler med samme numre.
inc er rigtignok trådsikker, men man skal jo have fat i variablen og
gemme den igen - så nej.
Ulrik Magnusson
| |
Ulrik Magnusson (26-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 26-08-02 15:57 |
|
Ulrik Magnusson wrote:
> "Dennis B. Hansen" wrote:
>
> > Tjoo... Increment (optælling) af en int variable er trådsikker, så du
> > vil ikke få biler med samme numre.
>
> inc er rigtignok trådsikker,
Sikke da noget sludder - increment er overhovedet ikke trådsikker.
Ulrik Magnusson
| |
Ulrik Magnusson (26-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 26-08-02 18:35 |
|
Ulrik Magnusson wrote:
> Ulrik Magnusson wrote:
>
> > "Dennis B. Hansen" wrote:
> >
> > > Tjoo... Increment (optælling) af en int variable er trådsikker, så du
> > > vil ikke få biler med samme numre.
> >
> > inc er rigtignok trådsikker,
>
> Sikke da noget sludder - increment er overhovedet ikke trådsikker.
Jeg diskuterer lige med mig selv.. Man kunne måske forestille sig
følgende (fejlagtige) konstruktion:
class a
{
private int member = 0;
void incMember()
{
int local = member;
synchronized( this )//meningsløs synkronisering, da "i++" er atomisk
{
local++;
}
this.member = local;
}
}
På den måde er increment måske trådsikker, men jeg kan ikke se
en situation hvor man ikke er nødt til at synkronisere omkring den
alligevel.
Ulrik Magnusson
| |
Jan Jonasen (26-08-2002)
| Kommentar Fra : Jan Jonasen |
Dato : 26-08-02 18:54 |
|
In article <3D6A66BD.A92815A5@yahoo.com>, Ulrik Magnusson
(ulrikm@yahoo.com) wrote:
> Jeg diskuterer lige med mig selv.. Man kunne måske forestille sig
> følgende (fejlagtige) konstruktion:
>
> class a
> {
> private int member = 0;
>
> void incMember()
> {
> int local = member;
> synchronized( this )//meningsløs synkronisering, da "i++" er atomisk
> {
> local++;
> }
> this.member = local;
> }
> }
>
> På den måde er increment måske trådsikker, men jeg kan ikke se
> en situation hvor man ikke er nødt til at synkronisere omkring den
> alligevel.
>
En mere elegant løsning ville være blot at erklære member som:
private volatile int member; //nul er default, spar 4 tastetryk
volatile garantere at man altid får seneste værdi, således ville en
eventuel getMember() metode ikke returnere en "forkert" værdi. JLS 2.0
8.3.2 forklare det bedre end jeg, ca. side 158.
--
Mvh/re Jan Jonasen
jonasen (at) it (dot) dk
If I wanted culture, I'd eat yogurt.
| |
Ulrik Magnusson (26-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 26-08-02 19:52 |
|
Jan Jonasen wrote:
> private volatile int member; //nul er default, spar 4 tastetryk
Min mistanke er umiddelbart at man har glemt at initialisere og jeg
begynder at spilde tid på at undersøge om det skulle have nogen
betydning.
Jeg ved ikke rigtig om volatile er en god idé (først og fremmest
er det lidt svært at gennemskue ):
volatile static int idCount = 0;
int id = idCount++; // er hele denne atomisk pga volatile eller er det
// udelukkende inkrementeringen af idCount?
T1: inkrementer idCount
T2: inkrementer idCount
T2: skriv id // med hvilken værdi?
T1: skriv id // med hvilken værdi?
Ulrik Magnusson
| |
Jan Jonasen (26-08-2002)
| Kommentar Fra : Jan Jonasen |
Dato : 26-08-02 21:17 |
|
In article <3D6A78D6.D30F700D@yahoo.com>, Ulrik Magnusson
(ulrikm@yahoo.com) wrote:
> Jeg ved ikke rigtig om volatile er en god idé (først og fremmest
> er det lidt svært at gennemskue ):
>
Tjo, men det vel mest fordi det sjældent bliver brugt, også af
undertegnede, da jeg ikke så ofte står i en situation, som kræver en 100%
atomisk counter.
> volatile static int idCount = 0;
> int id = idCount++; // er hele denne atomisk pga volatile eller er det
> // udelukkende inkrementeringen af idCount?
>
> T1: inkrementer idCount
> T2: inkrementer idCount
> T2: skriv id // med hvilken værdi?
> T1: skriv id // med hvilken værdi?
>
Vha. volatile kan operationen betragtes som atomisk, JLS benævner ikke ++
operatoren som atomisk i sig selv, men pga. volatile's mening vil ++ altid
blive udført på seneste (her største) værdi. Dette medføre at idCount vil
være korrekt selvom andre tråde måtte modificere denne, så vil du altid få
den største værdi på lige netop det tidspunkt dit id bliver sat.
--
Mvh/re Jan Jonasen
jonasen (at) it (dot) dk
If I wanted culture, I'd eat yogurt.
| |
Jan Jonasen (26-08-2002)
| Kommentar Fra : Jan Jonasen |
Dato : 26-08-02 21:17 |
|
In article <3D6A78D6.D30F700D@yahoo.com>, Ulrik Magnusson
(ulrikm@yahoo.com) wrote:
> Jeg ved ikke rigtig om volatile er en god idé (først og fremmest
> er det lidt svært at gennemskue ):
>
Tjo, men det vel mest fordi det sjældent bliver brugt, også af
undertegnede, da jeg ikke så ofte står i en situation, som kræver en 100%
atomisk counter.
> volatile static int idCount = 0;
> int id = idCount++; // er hele denne atomisk pga volatile eller er det
> // udelukkende inkrementeringen af idCount?
>
> T1: inkrementer idCount
> T2: inkrementer idCount
> T2: skriv id // med hvilken værdi?
> T1: skriv id // med hvilken værdi?
>
Vha. volatile kan operationen betragtes som atomisk, JLS benævner ikke ++
operatoren som atomisk i sig selv, men pga. volatile's mening vil ++ altid
blive udført på seneste (her største) værdi. Dette medføre at idCount vil
være korrekt selvom andre tråde måtte modificere denne, så vil du altid få
den største værdi på lige netop det tidspunkt dit id bliver sat.
--
Mvh/re Jan Jonasen
jonasen (at) it (dot) dk
If I wanted culture, I'd eat yogurt.
| |
Ulrik Magnusson (26-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 26-08-02 21:43 |
|
Jan Jonasen wrote:
> > volatile static int idCount = 0;
> > int id = idCount++; // er hele denne atomisk pga volatile eller er det
> > // udelukkende inkrementeringen af idCount?
> >
> > T1: inkrementer idCount
> > T2: inkrementer idCount
> > T2: skriv id // med hvilken værdi?
> > T1: skriv id // med hvilken værdi?
> >
> Vha. volatile kan operationen betragtes som atomisk, JLS benævner ikke ++
> operatoren som atomisk i sig selv, men pga. volatile's mening vil ++ altid
> blive udført på seneste (her største) værdi. Dette medføre at idCount vil
> være korrekt selvom andre tråde måtte modificere denne, så vil du altid få
> den største værdi på lige netop det tidspunkt dit id bliver sat.
og så er man vel alligevel nødt at synkronisere for ikke at få to biler
med samme id:
public class Bil
{
private static int idCount = 1;
private static Object classSync = new Object();
private int id;
private String name = "Bil nr. ";
public Bil()
{
synchronized( classSync )
{
id = idCount++;
}
name += id;
}
}
Ulrik Magnusson
| |
Morten (27-08-2002)
| Kommentar Fra : Morten |
Dato : 27-08-02 08:52 |
|
Ulrik Magnusson wrote:
>
> Jan Jonasen wrote:
>
>
>>>volatile static int idCount = 0;
>>>int id = idCount++; // er hele denne atomisk pga volatile eller er det
>>> // udelukkende inkrementeringen af idCount?
>>>
>>>T1: inkrementer idCount
>>>T2: inkrementer idCount
>>>T2: skriv id // med hvilken værdi?
>>>T1: skriv id // med hvilken værdi?
>>>
>>
>>Vha. volatile kan operationen betragtes som atomisk, JLS benævner ikke ++
>>operatoren som atomisk i sig selv, men pga. volatile's mening vil ++ altid
>>blive udført på seneste (her største) værdi. Dette medføre at idCount vil
>>være korrekt selvom andre tråde måtte modificere denne, så vil du altid få
>>den største værdi på lige netop det tidspunkt dit id bliver sat.
>
>
> og så er man vel alligevel nødt at synkronisere for ikke at få to biler
> med samme id:
>
> public class Bil
> {
> private static int idCount = 1;
> private static Object classSync = new Object();
>
> private int id;
> private String name = "Bil nr. ";
>
> public Bil()
> {
> synchronized( classSync )
> {
> id = idCount++;
> }
> name += id;
> }
> }
Du bør have din name += id inde i din synchronized block.
T1: id = X
T2: id = Y
T1: name += Y
T2: name += Y
Faren er ikke så meget om ++ på en integer er atomar (hvilken den er,
i modsætning til tilsvarende operation på en long), men at den
sammenhæng du bruger den i, er trådsikker.
Mvh Morten
| |
Ulrik Magnusson (27-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 27-08-02 14:27 |
|
Morten wrote:
>> public class Bil
>> {
>> private static int idCount = 1;
>> private static Object classSync = new Object();
>>
>> private int id;
>> private String name = "Bil nr. ";
>>
>> public Bil()
>> {
>> synchronized( classSync )
>> {
>> id = idCount++;
>> }
>> name += id;
>> }
>> }
>
> Du bør have din name += id inde i din synchronized block.
>
> T1: id = X
> T2: id = Y
> T1: name += Y
> T2: name += Y
Nej. Synkroniseringen skal udelukkende sikre at inkrementeringen og
overførselen fra klasse til instans foregår uden afbrydelse (dvs uden
at andre piller ved idCount imens). Ovenstående kan ikke ske, da 2 tråde
ikke kan være i samme konstruktor på samme tid (mao. T1.name/T1.id og
T2.name/T2.id refererer til name og id i 2 forskellige objekter).
Ulrik Magnusson
| |
Jan Jonasen (27-08-2002)
| Kommentar Fra : Jan Jonasen |
Dato : 27-08-02 17:54 |
|
In article <3D6A92E8.E3A6B263@yahoo.com>, Ulrik Magnusson
(ulrikm@yahoo.com) wrote:
> og så er man vel alligevel nødt at synkronisere for ikke at få to biler
> med samme id:
>
> public class Bil
> {
> private static int idCount = 1;
> private static Object classSync = new Object();
>
> private int id;
> private String name = "Bil nr. ";
>
> public Bil()
> {
> synchronized( classSync )
> {
> id = idCount++;
> }
> name += id;
> }
> }
>
Ikke med mindre du også ønsker Bil'er konstrueret i rækkefølge. Volatile
(på idCount) ville sikre id altid bliver forskellig.
--
Mvh/re Jan Jonasen
jonasen (at) it (dot) dk
If I wanted culture, I'd eat yogurt.
| |
Ulrik Magnusson (27-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 27-08-02 19:00 |
|
Jan Jonasen wrote:
> In article <3D6A92E8.E3A6B263@yahoo.com>, Ulrik Magnusson
> (ulrikm@yahoo.com) wrote:
> > og så er man vel alligevel nødt at synkronisere for ikke at få to biler
> > med samme id:
> >
> > public class Bil
> > {
> > private static int idCount = 1;
> > private static Object classSync = new Object();
> >
> > private int id;
> > private String name = "Bil nr. ";
> >
> > public Bil()
> > {
> > synchronized( classSync )
> > {
> > id = idCount++;
> > }
> > name += id;
> > }
> > }
> >
> Ikke med mindre du også ønsker Bil'er konstrueret i rækkefølge.
?? - hvordan skal "i rækkefølge" dog forstås?
> Volatile (på idCount) ville sikre id altid bliver forskellig.
Jeg mangler lidt argumentation - kan nedenstående ikke ske
og hvorfor ikke?
private static volatile int idCount = 0;
private int id = ++idCount;
T1: idCount = idCount + 1
T2: idCount = idCount + 1
T2: id = 2
T1: id = 2
Ulrik Magnusson
| |
Jan Jonasen (27-08-2002)
| Kommentar Fra : Jan Jonasen |
Dato : 27-08-02 21:05 |
|
In article <3D6BBE3D.CB655668@yahoo.com>, Ulrik Magnusson
(ulrikm@yahoo.com) wrote:
> ?? - hvordan skal "i rækkefølge" dog forstås?
>
På den måde at først til kommer først tilbage.
> Jeg mangler lidt argumentation - kan nedenstående ikke ske
> og hvorfor ikke?
>
> private static volatile int idCount = 0;
> private int id = ++idCount;
>
> T1: idCount = idCount + 1
> T2: idCount = idCount + 1
> T2: id = 2
> T1: id = 2
>
Af den simple grund at det netop er volatile's opgave at sørge for, at det
altid er seneste værdi der benyttes i en given variabel. (går ud fra
idCount skal erstattes med id) id vil med idCount i ovenstående tilfælde
altid blive unik, sådan er det bare Eksempel findes i JLS 8.3.1.4,
nemmere end min upædagogiske gengivelse.
--
Mvh/re Jan Jonasen
jonasen (at) it (dot) dk
If I wanted culture, I'd eat yogurt.
| |
Ulrik Magnusson (27-08-2002)
| Kommentar Fra : Ulrik Magnusson |
Dato : 27-08-02 21:34 |
|
Jan Jonasen wrote:
> In article <3D6BBE3D.CB655668@yahoo.com>, Ulrik Magnusson
> (ulrikm@yahoo.com) wrote:
> > ?? - hvordan skal "i rækkefølge" dog forstås?
> >
> På den måde at først til kommer først tilbage.
Men hvorfra og hvortil? Her et illustrerende forløb:
T1: kald super.konstruktor og find synkroniseringsobjekt
T2: kald super.konstruktor og find synkroniseringsobjekt
T2: sync blok: id = idCount++
T2: name += id
T2: konstruktion af bil færdig
T1: sync blok: id = idCount++
T1: name += id
T1: konstruktion af bil færdig
> > Jeg mangler lidt argumentation - kan nedenstående ikke ske
> > og hvorfor ikke?
> >
> > private static volatile int idCount = 0;
> > private int id = ++idCount;
> >
> > T1: idCount = idCount + 1
> > T2: idCount = idCount + 1
> > T2: id = 2
> > T1: id = 2
> >
> Af den simple grund at det netop er volatile's opgave at sørge for, at det
> altid er seneste værdi der benyttes i en given variabel. (går ud fra
> idCount skal erstattes med id) id vil med idCount i ovenstående tilfælde
> altid blive unik, sådan er det bare Eksempel findes i JLS 8.3.1.4,
> nemmere end min upædagogiske gengivelse.
JLS 8.3.1.4 snakker så vidt jeg kan se kun om opdatering af delte
variabler (idCount) - ikke om de udelte (id). Problemet er netop
opdateringen af id som ikke må ske med den samme værdi 2 gange.
(idCount skal _ikke_ erstattes af id - id tildeles den nyeste værdi af
idCount ved ovenstående forløb)
Ulrik Magnusson
| |
Trygleren (30-08-2002)
| Kommentar Fra : Trygleren |
Dato : 30-08-02 19:49 |
|
> så ville jeg have mine obj, kom til at hede noget henad: "BilNr1",
> "BilNr2"....
Så må du kalde dem det. Du kan ikke dynamisk navngive objekter ved
instansieringen. Sådan er det!
> jeg kan godt se problemet i at jeg returnerer en String, som skal være
> navnet, men kan det ikke afhjælpes ?
Nope. I hvert fald ikke sådan som jeg forstår dit problem.
> - hvis jeg ikke vil lægge mine objekter i et array... .?
Så må du have dem til at flyde rundt =)
> Nu har jeg prøvet at finde en løsning i nogle dage før jeg spurgte mine
> lærere, men nu synes jeg at være løbet ind i en mur.... en stor en.. kunne
> ikke engang finde noget på google :((
Det er fordi det ikke er muligt =)
> 1000 tak
>
> mvh.Simon
Sil'
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
"Sic gorgiamus allos subjectatos nunc"
Lars Winther
| |
|
|