• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 20:30
CEST 02:30
KST 09:30
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
[ASL22] Finals Preview: Sweet Victory!9[ASL22] Ro4 Preview: Mirror Mirror6[ASL22] Ro8 Preview: Within Reach5[ASL22] Ro8 Preview: In A Tizzy11[ASL22] Ro16 Preview: Holy Diver5
Community News
Evil Geniuses - shutting down10ISSL (IntoTheTV x SOOP SC2 League): Premier5Weekly Cups (October 12-18): 5.0.17 era begins1[$1250] International ShieldBattery League53Weekly Cups (October 5-11): Farewell to 5.0.164
StarCraft 2
General
REPORT: StarCraft 2: Remastered In Development No more SC2 streamers on team liquid? Evil Geniuses - shutting down How do you feel about the mass reverts in the 5.0.17 PTR? Weekly Cups (October 12-18): 5.0.17 era begins
Tourneys
RSL goes to London! 2026 Offline Finals Nov 21-22 ISSL (IntoTheTV x SOOP SC2 League): Premier Sparkling Tuna Cup - Weekly Open Tournament ScienceCraft (October 24-25) - Live Event WORTEX Challenger Series — Open SC2 LAN in Budapes
Strategy
[H] ZvP Mid-Late Game: Stalkers Collossi HT
Custom Maps
[G] How to playtest arcade maps [A] Nemrods 1/4 players [M] (2) Sweltering Sands [M] (2) Frigid Storage
External Content
Mutation # 548 Shining Bright The PondCast: SC2 News & Results Mutation # 547 Temple Of Terror Mutation # 546 Catch the Train
Brood War
General
Do we even care about balance? Rollback Netcode in Brood War BW General Discussion Young Players Tournament Announced by SOOP SCHNAIL now supports Remastered
Tourneys
[ASL22] Grand Finals [$1250] International ShieldBattery League [Megathread] Daily Proleagues [BSL23] RO24 Group Stage
Strategy
Cliff Jump Revisited (1 in a 1000 strategy) Simple Questions, Simple Answers Replay Review Process - What do you do?
Other Games
General Games
General RTS Discussion Thread Nintendo Switch Thread Stormgate/Frost Giant Megathread Armies of Exigo - YesYes? Dawn of War IV
Dota 2
Dota 2 Champions League Season 3 Begins April 25!
League of Legends
[TL LoL EUW IHs] Teemo shall perish
Heroes of the Storm
Heroes of the Storm 2.0
Hearthstone
Deck construction bug
TL Mafia
TL Mafia Community Thread
Community
General
US Politics Mega-thread Russo-Ukrainian War Thread The Chess Thread Artificial Intelligence Thread Canadian Politics Mega-thread
Fan Clubs
Serral Fan Club
Media & Entertainment
Anime Discussion Thread Movie Discussion! [Manga] One Piece
Sports
Football (Soccer) Thread TeamLiquid Health and Fitness Initiative For 2023 MLB/Baseball 2023
World Cup 2022
Tech Support
Computer Build, Upgrade & Buying Resource Thread
TL Community
Recent Gifted Posts
Blogs
How Much Genes Contribute to…
TrAiDoS
ShieldBattery on Mac
Kraekkling
[ASL22] Ro4 Day1 Ticket Giv…
bITt.mAN
38 yo Retired SWE loo…
PurE)Rabbit-SF
Can Bots Beat Pros?? Starcr…
namkraft
Customize Sidebar...

Website Feedback

Closed Threads



Active: 8700 users

The Big Programming Thread - Page 131

Forum Index > General Forum
Post a Reply
Prev 1 129 130 131 132 133 1032 Next
Thread Rules
1. This is not a "do my homework for me" thread. If you have specific questions, ask, but don't post an assignment or homework problem and expect an exact solution.
2. No recruiting for your cockamamie projects (you won't replace facebook with 3 dudes you found on the internet and $20)
3. If you can't articulate why a language is bad, don't start slinging shit about it. Just remember that nothing is worse than making CSS IE6 compatible.
4. Use [code] tags to format code blocks.
MisterD
Profile Blog Joined June 2010
Germany1338 Posts
April 04 2012 21:52 GMT
#2601
Post your code and/or a stacktrace of the exception that you get when executing it, otherwise we can't do anything but shooting blind. The "linking" mentioned above in java simply consists of setting up your classloaders correctly, that's usually done by just specifying a classpath for the jvm when executing, which is usually a directory which contains package folders and class files (or a jar file which is basically the same folder, just zipped). So make sure your classpath is correct (e.g. "java -cp bin package.MainClass" or something like that), then it should find your inner classes class file. (if that's the problem, i don't know if it is due to the mentioned lack of a stacktrace ;P)
Gold isn't everything in life... you need wood, too!
berated-
Profile Blog Joined February 2007
United States1134 Posts
Last Edited: 2012-04-04 22:45:12
April 04 2012 22:33 GMT
#2602
On April 05 2012 02:27 Millitron wrote:
Show nested quote +
On April 04 2012 22:56 darkness wrote:
I use Java nested class, but it doesn't work on Linux although I get a file similar to: mainclass$innerclass.class (the problem is the inner class isn't executed)
There is no problem on Windows though. Any suggestions?

Read up on how your Linux JVM handles inner classes. I suspect its a linking issue though.

Anyways, I got a question TL. I'm working on a fairly large project in Java, and I'm using Eclipse. My problem is that each version only changes a couple of methods in each class, so I like to collapse the ones that I'm not working on. But, since each version gets its own project, Eclipse seems to forget what methods I've collapsed, and displays them all, and its getting annoying to have to manually collapse them all every time I start a new version. Is there any way to make it remember this kind of thing between projects?


I'm don't know of how to solve your problem as you describe it, but why does each version get its on project? Sounds like you need to be using some kind of version control to do your versioning, not eclipse.

Edit: The reason I point this out is because if you did that, the current version you are working on could always stay in one project. Therefore, you wouldn't be switching projects constantly and losing your preferences. You would still be able to go back to previous version if you really needed to by checking out the previous version into a new project.

Or you could see if this solution is still valid
Millitron
Profile Blog Joined August 2010
United States2611 Posts
April 04 2012 23:33 GMT
#2603
On April 05 2012 07:33 berated- wrote:
Show nested quote +
On April 05 2012 02:27 Millitron wrote:
On April 04 2012 22:56 darkness wrote:
I use Java nested class, but it doesn't work on Linux although I get a file similar to: mainclass$innerclass.class (the problem is the inner class isn't executed)
There is no problem on Windows though. Any suggestions?

Read up on how your Linux JVM handles inner classes. I suspect its a linking issue though.

Anyways, I got a question TL. I'm working on a fairly large project in Java, and I'm using Eclipse. My problem is that each version only changes a couple of methods in each class, so I like to collapse the ones that I'm not working on. But, since each version gets its own project, Eclipse seems to forget what methods I've collapsed, and displays them all, and its getting annoying to have to manually collapse them all every time I start a new version. Is there any way to make it remember this kind of thing between projects?


I'm don't know of how to solve your problem as you describe it, but why does each version get its on project? Sounds like you need to be using some kind of version control to do your versioning, not eclipse.

Edit: The reason I point this out is because if you did that, the current version you are working on could always stay in one project. Therefore, you wouldn't be switching projects constantly and losing your preferences. You would still be able to go back to previous version if you really needed to by checking out the previous version into a new project.

Or you could see if this solution is still valid

Well, its not a real, for-sale project. Its part of a course I'm taking. Each lab assignment adds a feature to the program made in the previous lab, so they all build off of each other. The thing is, they all get their own project so I can be sure I'm running the main method from the current version, and not a previous one.

Anyways, the solution you suggested works well enough for me. Thanks!
Who called in the fleet?
Shield
Profile Blog Joined August 2009
Bulgaria4824 Posts
Last Edited: 2012-04-05 11:14:41
April 05 2012 11:09 GMT
#2604
Well, I have 2 inner classes within an outer class, but only the last one isn't executed. I'm starting to hate Java on Linux. :/
Edit: I may give my code on PM if anyone wants to try to solve my problem.
MisterD
Profile Blog Joined June 2010
Germany1338 Posts
Last Edited: 2012-04-05 11:57:49
April 05 2012 11:56 GMT
#2605
On April 05 2012 20:09 darkness wrote:
Well, I have 2 inner classes within an outer class, but only the last one isn't executed. I'm starting to hate Java on Linux. :/
Edit: I may give my code on PM if anyone wants to try to solve my problem.

what do you even mean by "executing a class"? the only way to "execute" a class is to use it as main class which will execute it's main method, but you can't just execute a class itself and you can only always have one main class, not multiple. Try to explain your problem properly and if you have no clue how to do that, pm me your stuff and maybe i can then understand what you mean Oo
Gold isn't everything in life... you need wood, too!
Shield
Profile Blog Joined August 2009
Bulgaria4824 Posts
April 05 2012 14:18 GMT
#2606
On April 05 2012 20:56 MisterD wrote:
Show nested quote +
On April 05 2012 20:09 darkness wrote:
Well, I have 2 inner classes within an outer class, but only the last one isn't executed. I'm starting to hate Java on Linux. :/
Edit: I may give my code on PM if anyone wants to try to solve my problem.

what do you even mean by "executing a class"? the only way to "execute" a class is to use it as main class which will execute it's main method, but you can't just execute a class itself and you can only always have one main class, not multiple. Try to explain your problem properly and if you have no clue how to do that, pm me your stuff and maybe i can then understand what you mean Oo


I meant that both inner classes are called in main(), but the 2nd one doesn't start for some reason. I get no errors.
GaiaCaT
Profile Joined June 2011
35 Posts
April 05 2012 15:48 GMT
#2607
On April 05 2012 23:18 darkness wrote:
I meant that both inner classes are called in main(), but the 2nd one doesn't start for some reason. I get no errors.

Could you post your code/pseudocode, or upload it to pastebin.com?
I am still not sure what you mean by calling inner classes.
You don't call them, you create an instance of inner classes, either through an instance of the outer class:
+ Show Spoiler +
outerClass myOuterClass = new outerClass();
outerClass.innerClass myInnerClass = myOuterClass.new innerClass();
myInnerClass.innerMethod();

public class outerClass {
//outerClass field(s)

//outerClass constructor(s)
public outerClass() {
}

//outerClass method(s)
public void outerMethod() {
}

public class innerClass {
//innerClass field(s)

//innerClass constructor(s)
public innerClass() {
}

//innerClass method(s)
public void innerMethod() {
}
}
}


Or through the constructors or methods of outerClass:
+ Show Spoiler +
outerClass myOuterClass = new outerClass();

public class outerClass {
//outerClass field(s)

//outerClass constructor(s)
public outerClass() {
innerClass myInnerClass = new innerClass();
myInnerClass.innerMethod();
}

//outerClass method(s)
public void outerMethod() {
}

public class innerClass {
//innerClass field(s)

//innerClass constructor(s)
public innerClass() {
}

//innerClass method(s)
public void innerMethod() {
}
}
}
MisterD
Profile Blog Joined June 2010
Germany1338 Posts
April 05 2012 16:05 GMT
#2608
On April 05 2012 23:18 darkness wrote:
Show nested quote +
On April 05 2012 20:56 MisterD wrote:
On April 05 2012 20:09 darkness wrote:
Well, I have 2 inner classes within an outer class, but only the last one isn't executed. I'm starting to hate Java on Linux. :/
Edit: I may give my code on PM if anyone wants to try to solve my problem.

what do you even mean by "executing a class"? the only way to "execute" a class is to use it as main class which will execute it's main method, but you can't just execute a class itself and you can only always have one main class, not multiple. Try to explain your problem properly and if you have no clue how to do that, pm me your stuff and maybe i can then understand what you mean Oo


I meant that both inner classes are called in main(), but the 2nd one doesn't start for some reason. I get no errors.



have you done something like this?
class OuterClass{
public static void main(String args[]) {
InnerClass1.main();
InnerClass2.main();
}
}

Because if that's the case, i assume your issue is this: Your main methods contain endless loops or at least run for a long time. Therefore, only one of them will seem to start initially, because the call InnerClass2.main(); will only be executed after InnerClass1.main(); _finished_. If you want to run them parallel, you will have to use threads.

but then again, just shooting blind because you don't post any actual information on what you are doing. And now i'm done with shooting blind, so if you want further replies, post your stuff.
Gold isn't everything in life... you need wood, too!
Shield
Profile Blog Joined August 2009
Bulgaria4824 Posts
Last Edited: 2012-04-05 17:43:27
April 05 2012 16:45 GMT
#2609
Sorry for being vague, but it's an assignment for university, so I have to be extra careful with sharing my code.
Anyway, I've fixed my problem. A value wasn't properly updated only on Linux, so it didn't go through if {}.
Here is a bit of code to show you what I mean:
+ Show Spoiler +


public class OuterClass {
// Variables
public static int value = 0;
public final static int maxValue = 10; // say 10 for example

public static synchronized void increase {
//code here
}

public static syncrhonized void decrease {
//code here
}

public static synchronized int getValue {
return value;
}

// Inner class 1
public static class InnerClass extends Thread {
public void run() {
//code which modifies value
}
}

// Inner class 2
public static class InnerClassTwo extends Thread {
public void run() {
// this is what fixed the problem
getValue();
// this is what fixed the problem

if (value >= 1) {
...
}
}


//main method
...
}



TLDR: value changes were unknown to the 2nd (inner) class, it was always zero for it. However, that problem existed only on Linux jdk 1.6. Windows and FreeBSD proved to be fine.

P.S. I'm aware there are some syntax and identation errors, but you get the point.
GaiaCaT
Profile Joined June 2011
35 Posts
April 05 2012 18:26 GMT
#2610
On April 06 2012 01:45 darkness wrote:
However, that problem existed only on Linux jdk 1.6. Windows and FreeBSD proved to be fine.

I don't think this is a bug.
You need to synchronize reads/gets too, otherwise you're not guaranteed to retrieve the most recent value.
The reason Windows and FreeBSD seems to work is likely because they update value "fast enough" for the 2nd thread to pick up, unlike Linux which is still using a cached value.
If the first thread finishes its job too fast and causes the second thread to terminate, the second thread might never get access to an updated value.
This would explain why your if-block never fires unless you call getValue() before the if-block.

Might want to use this instead:
if (getValue() >= 1) {
}

If 2nd thread only ever reads value, you could also consider just declaring value as volatile which should ensure any reads will return the most recent write.
CecilSunkure
Profile Blog Joined May 2010
United States2829 Posts
April 05 2012 20:23 GMT
#2611
Wrote a pretty interesting article on binary collision: link. Pretty simple collision that's useful for platforming games
Shield
Profile Blog Joined August 2009
Bulgaria4824 Posts
Last Edited: 2012-04-05 23:52:19
April 05 2012 23:51 GMT
#2612
On April 06 2012 03:26 GaiaCaT wrote:
Show nested quote +
On April 06 2012 01:45 darkness wrote:
However, that problem existed only on Linux jdk 1.6. Windows and FreeBSD proved to be fine.

I don't think this is a bug.
You need to synchronize reads/gets too, otherwise you're not guaranteed to retrieve the most recent value.
The reason Windows and FreeBSD seems to work is likely because they update value "fast enough" for the 2nd thread to pick up, unlike Linux which is still using a cached value.
If the first thread finishes its job too fast and causes the second thread to terminate, the second thread might never get access to an updated value.
This would explain why your if-block never fires unless you call getValue() before the if-block.

Might want to use this instead:
if (getValue() >= 1) {
}

If 2nd thread only ever reads value, you could also consider just declaring value as volatile which should ensure any reads will return the most recent write.


It sounds logical. Btw, a friend of mine has installed Ubuntu as virtual machine and there was no problem. Could we say it's also up to JDK and/or kernel version?
GaiaCaT
Profile Joined June 2011
35 Posts
April 06 2012 01:11 GMT
#2613
This is well beyond my expertise...
But as far as I know, it could be architecture, kernel, JVM, and maybe even CPU load and core-dependant.
The current implementation does not enforce any synchronization of variables accessed through unsynchronized reads.
That means a JVM could as example keep a variable cached for 10 seconds and it would still be within standards because you're supposed to read from within a synchronized method/block or declare the variable as volatile if you want the most up-to-date value.
tec27
Profile Blog Joined June 2004
United States3724 Posts
April 06 2012 03:56 GMT
#2614
On April 06 2012 08:51 darkness wrote:
Show nested quote +
On April 06 2012 03:26 GaiaCaT wrote:
On April 06 2012 01:45 darkness wrote:
However, that problem existed only on Linux jdk 1.6. Windows and FreeBSD proved to be fine.

I don't think this is a bug.
You need to synchronize reads/gets too, otherwise you're not guaranteed to retrieve the most recent value.
The reason Windows and FreeBSD seems to work is likely because they update value "fast enough" for the 2nd thread to pick up, unlike Linux which is still using a cached value.
If the first thread finishes its job too fast and causes the second thread to terminate, the second thread might never get access to an updated value.
This would explain why your if-block never fires unless you call getValue() before the if-block.

Might want to use this instead:
if (getValue() >= 1) {
}

If 2nd thread only ever reads value, you could also consider just declaring value as volatile which should ensure any reads will return the most recent write.


It sounds logical. Btw, a friend of mine has installed Ubuntu as virtual machine and there was no problem. Could we say it's also up to JDK and/or kernel version?

Its a race condition, so the output is indeterminant on any architecture. The reason calling getValue() fixes it is because its a synchronized method, which forces the thread to lock until the object is available (not being used in another synchronized method call). Say you have thread 1 increment the value, and thread 2 output it, the events are essentially:

Thread 1
  • Retrieve Value
  • Increment Value
  • Store Value

Thread 2
  • Retrieve Value
  • Output Value


Now, since you're running those actions in separate threads, its completely up to the OS scheduler as to when they will take place. Assuming a starting value of 5, they might interleave like:
T1 - Retrieve [local = value = 5]
T1 - Increment [local = 6]
T1 - Store [value = 6]
T2 - Retrieve [local = value = 6]
T2 - Output [6]
(this is an okay/desired outcome)

Or like:
T1 - Retrieve [local = value = 5]
T1 - Increment [local = 6]
T2 - Retrieve [local = value = 5]
T1 - Store [value = 6]
T2 - Output [5]
(this is one of the ways to get to your 'buggy' state)

There are a bunch more possible orderings, but I think you get the point Anyway, what the 'synchronized' keyword does is basically turn the methods into atomic actions, so that they can't interleave per object. So if one thread calls the Retrieve method on an object, no other object can, for instance, call the Set method at the same time for that object. Thus, when your 'fixed' program runs, its highly likely (but NOT 100% sure, it still has a race condition ) that the increment step will run before the print one. IE:

T1 - Retrieve (OBJECT LOCKED) [local = value = 5]
T2 - Retrieve (object is locked, thread blocks until object is available)
T1 - Increment [local = 6]
T1 - Store (OBJECT UNLOCKED) [value = 6]
T2 - Continues with Retrieve [local = value = 6]
T2 - Output [6]

But as you can see, this ordering still depends on what thing gets the lock first. You can do some things to make sure they lock in the right order, but this problem is also better solved by just not threading
Can you jam with the console cowboys in cyberspace?
MrHoon *
Profile Blog Joined April 2008
10183 Posts
April 06 2012 04:03 GMT
#2615
man i wish i can trade my korean language for programming
dats racist
Chaosvuistje
Profile Joined April 2010
Netherlands2581 Posts
April 06 2012 08:07 GMT
#2616
On April 06 2012 13:03 MrHoon wrote:
man i wish i can trade my korean language for programming


I'd say that programming languages are a fair bit easier to understand than the syntax of Korean. Then again, it all depends on where you are born. But really, syntax is much easier for computer languages than regular languages.
IMlemon
Profile Blog Joined May 2008
Lithuania296 Posts
April 06 2012 08:12 GMT
#2617
Syntax is by far the easiest part of programming and can be learned in a few days by everyone. Using that syntax to create working solutions to problems is the hard part.
My future's so bright, I gotta wear shades.
Weson
Profile Blog Joined December 2010
Iceland1032 Posts
Last Edited: 2012-04-07 00:42:26
April 07 2012 00:40 GMT
#2618
Anyone know a good site or anything where you can learn ASP.NET with C#? Just started a class and we're working in Visual Studio Web Developer. I got a book but it's more of a reference book rather than a learning book.
"!@€#" - as some guy said
alwinuz
Profile Joined September 2011
Netherlands77 Posts
April 07 2012 15:25 GMT
#2619
On April 07 2012 09:40 Weson wrote:
Anyone know a good site or anything where you can learn ASP.NET with C#? Just started a class and we're working in Visual Studio Web Developer. I got a book but it's more of a reference book rather than a learning book.

What part of ASP.net are you focusing on? For example, I think MVC is much easier than Web Forms.

There's lots of training articles and videos at the official site: http://www.asp.net/mvc
Ultraliskhero
Profile Joined April 2010
Canada249 Posts
April 07 2012 22:16 GMT
#2620
Hi guys, I have a quick question.

I'm doing file i/o using C on a linux environment, and I am wondering if there is a way to delete the contents of an entire file that was opened earlier without closing the file.

Basicly, I first opened an existing file using the "r+" mode for fopen(), then I'm reading the file until EOF, and then I want to delete the contents of the file and write to it again starting from the begining. However, I cannot simply close the file and reopen it using the "w" mode for fopen() because I have the file locked using flock(), and I do not want to close (unlock) the file before I finish doing all the operations on it.

Thanks.
Prev 1 129 130 131 132 133 1032 Next
Please log in or register to reply.
Live Events Refresh
Next event in 10h 30m
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
ViBE167
StarCraft: Brood War
Rain 1908
GuemChi 1568
Artosis 639
ProTech151
Dota 2
NeuroSwarm204
PGG 180
League of Legends
Doublelift5657
Super Smash Bros
hungrybox582
Other Games
summit1g6887
shahzam511
JimRising 356
C9.Mang0236
Maynarde90
Trikslyr51
Organizations
Other Games
gamesdonequick620
BasetradeTV206
[ Show 12 non-featured ]
StarCraft 2
• EnkiAlexander 51
• davetesta32
• AfreecaTV YouTube
• intothetv
• Kozan
• IndyKCrew
• Migwel
StarCraft: Brood War
• BSLYoutube
• STPLYoutube
• ZZZeroYoutube
Other Games
• Scarra1096
• imaqtpie896
Upcoming Events
IntoTheTV X SOOP
10h 30m
Reynor vs Zoun
Neeb vs Rogue
OSC
22h 30m
FEL
2 days
Patches Events
2 days
AI Arena Tournament
2 days
FEL
3 days
Sparkling Tuna Cup
3 days
Replay Cast
3 days
WardiTV Weekly
4 days
IntoTheTV X SOOP
5 days
ByuN vs Lambo
MaxPax vs Bunny
[ Show More ]
PiGosaur Cup
5 days
The PondCast
6 days
Kung Fu Cup
6 days
Liquipedia Results

Completed

Proleague 2026-10-20
Blizzard Classic Cup 2026
HCC Season 3

Ongoing

Acropolis #5
IPSL Winter 2026-27
KCM Race Survival 2026 Season 4
Acropolis #5 - GSC
1win Private Club #2
Thunderpick World Champ. '26
ESL Pro League Season 24
Stake Ranked Episode 4
1win Private Club #1
Logitech G Play Connect 2026
SL StarSeries Fall 2026
FISSURE Playground #3
BLAST Open Fall 2026
Esports World Cup 2026

Upcoming

BSL Season 23
SC4ALL II: Brood War
BSL 23: Non-Korean Championship
HSC XXX
Stellar Fest 2: Lunar Cup
SC4ALL II: StarCraft II
Kung Fu Cup 2026 Grand Finals
RSL Offline Finals
eXTREMESLAND 2026
PGL Major Singapore 2026
Stake Ranked Episode 6
BLAST Rivals Fall 2026
IEM Beijing 2026
Stake Ranked Episode 5
PGL Masters Bucharest 2026
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2026 TLnet. All Rights Reserved.