- SableCC
- A free parser that generates Java source code.
- sandbox
- Java applets run in a womb provided by the web browser that
offers them services, and prevents them from doing anything
naughty such as file i/o or talking to strangers (servers other
than the one the Applet was loaded from). The analogy of applets
being like children lead to calling the environment they run in
the "sandbox". See
womb, Applet, security, digital signatures, javakey, signtool,
signcode.
- saving face
- See face saving.
- SAX
- A proposed protocol to replace FTP for file transfer. It uses
far fewer acks so generates less network congestion, and less
delay. It's key features are never throwing away good packets
received and restart after a disconnect.
- scaffold
- Scaffolds are an a feature of my home brew Abundance language.
The Java equivalent would be something like a cross between a scrollpane
and a layout manager. Here are some uses:
Display the previous ten year's financial history, three years at
a time. Show each year in two rows, with the months Jan - June on
the top row and July to Dec on the bottom. Each each Month cell,
show 4 different values. In Abundance to handle this problem you
write a scaffold function to describe the pattern and you write
the code to display the data for one cell. From then on
everything else is automatic to deal with scrolling. You just
concentrate on keeping the data correct in the backing array or
file.
Another scaffold application would be if you want to display data
in a circle, say decorating the numerals of a clock. Again you
write the code to display one cell, and write a scaffold function
to describe the shape. From then on all is automatic.
The shapes you can draw are limited purely by your mathematicaly
ingenuity. They don't have to be in the least symmetric.
I am winging it a bit here, but here is roughly what an Abundance
4-line scaffold function written in Java would look like:
/*
* Scaffold to draw cells in groups of 2 rows of 6 cells at a time.
* Represents a year's data with Jan-Jun on top and Jul-Dec on the
* Bottom. Will scroll through the data stored in an array, holding
* as many years as you want, one month per cell.
*/
public class TwoRowsSixCols implements Scaffold
{
private static final int cellWidthInPixels = 30;
private static final int cellHeightInPixels = 50;
/**
* Compute where other cells in the Scaffold
* should be positioned
* relative to the first one on the screen.
*
* @param i which cell needs to be placed,
* first one on screen is index 0,
* not necessarily the first one in the backing array.
*
* @return the relative x,y position
* of where the ith cell should go
* relative to the base cell on the screen.
*/
public static Point shape ( int i )
{
int gridRow = i / 6;
int gridCol = i % 6;
return new Point ( gridCol * cellWidthInPixels, gridRow * cellHeightInPixels );
} // end shape
/**
* How many cells are visible on the screen at a time?
*
* @return number of cells visible.
*/
public static int cellsVisible ( )
{
return 12; // 2 rows by 6 columns
} // end cellsVisible
/**
* Adjust which element of the array gets to go
* in the first cell on screen.
*
* @param candidateEltForFirstCell
* the array element index we are proposing putting in the
* the first cell position on screen.
*
* @param mustDisplayElt
* An array element index that
* must fit on the display, usually near the centre.
*
* @return our revised suggestion for
* which element to display in the first slot.
*/
public static int adjust( int candidateEltForFirstCell, int mustDisplayElt)
{
// In a simple scaffold we just
// return candidateForEltFirstCell,
// but we want to make sure that only January data
// (in an array slot evenly divisible by 12)
// ever goes in the first cell slot on the screen.
if ( candidateEltForFirstCell % 12 == 0 ) return candidateEltForFirstCell;
// We could pick a smaller or larger value than
// the candidate, but whichever we pick,
// we must ensure mustDisplayElt
// will still fit on the screen.
int smallerCandidateElt = (candidateEltForFirstCell) / 12) * 12;
int biggerCandidateElt = smallerCandidateElt + 12;
if ( mustDisplayElt >= biggerCandidateElt )
{
return biggerCandidateElt;
}
else
{
return smallerCandidateElt;
} // end if
} // end adjust
} // end class TwoRowsSixCols
- schema
- In SQL, schema refers to DDL the Data Definition Language.
More generally it refers to the way data are stored in a database, including
persistent object databases.
- SCID
- Source Code In Database. New generation
source code editor/browsers will store Java source code in structured form
in a database. This will allow them great flexibility in the way it is
displayed, collapsing or expanding detail. See SCID in my list of student projects.
- scope
- Java class variables have four possible levels of visibility to other classes:
public, protected, default (sometimes called friendly or package scope),
and private. All local variables can be seen only within the block they
are declared. There are no global variables. See public, protected, package,
private.
- script
- Instead of typing a long sequence to identify yourself to the computer
you call, you teach your computer to do it for you automatically. There
is quite a bit more to it than simply recording your keystrokes. You must
take into account the timing, all the variations in what the other computer
might say to you, and recovering from errors. You will almost certainly
need the assistance of a expert to write some scripts for you.
- Scriptic
- An experimental extension to Java for parallel programming. It simplifies
the construction of threaded programs, user interfaces and discrete event
simulations. Starting a thread becomes as simple as placing statements
between {* and *}. Available from Delftware.
- scripting languages
- Scripting languages lets you invoke various Java utilities and do
simple calculations. Some Java-based platform independent scripting
languages have been devised such as Pnuts, FESI, JavaScript and Bean
SHell.
- scrollbar
- region on the screen the user can scroll vertically or horizontally or
both.
- SCSI
- Small Computer System Interface. A way of hooking
up disks, tapes, scanners, cd-roms etc. to a small computer. SCSI shines
over IDE when you have a server with many disks running at once, since
it allows overlapped operation of many different devices. The other advantage
is the ability to hang many devices on the same controller card. There
are several flavours of SCSI, with more in the works:
type |
bits |
pins |
async
MHz |
sync
MHz |
cable
meters |
raw
throughput
Mbytes/sec |
SCSI |
8 |
50 |
4 |
5 |
6 |
5 |
SCSI-2 |
8 |
50 |
8 |
10 |
3 |
10 |
wide SCSI-2 |
16 |
68 |
8 |
10 |
3 |
20 |
differential SCSI-2 |
16 |
68 |
8 |
10 |
25 |
20 |
Fast20 aka Ultra |
16 |
68 |
8 |
20 |
3 |
40 |
Actual speed is 1/3 to 2/3 of the theoretical raw speed depending on the
mix of controllers and drives. Each device on the SCSI bus must be assigned
a unique ID, usually set with jumpers or a thumbwheel, though plug &
play is coming along. The controller is always 7. The priority pecking
order is 7, 6, 5, 4, 3, 2, 1, 0, 15, 14, 13, 12, 11, 10, 9, 8.
- search engines
- Search engines help you find material on the web. They are free. They
make their money by showing you ads while you search.
Name |
URL |
Notes |
800go |
www.800go.com |
neé
Magellan |
Altavista |
www.altavista.com |
Very large
database -- indexes everything on the web pages, not just the keywords.
Tends to overwhelm. Has a free personal version called Discovery for
searching your own hard disks. |
Dogpile |
www.dogpile.com |
Works by asking
other search engines in parallel to look. |
Excite |
www.excite.com |
Slightly cleverer
at putting most important hits first better than Altavista. Excite
the company is buyng up other search Engine companies such as Magellan.
Excite also sells search engines to sites that want an index just of their
site. |
Hotbot |
www.hotbot.com |
Homes in on the
most important hits first better than other search engines. |
Infoseek |
www.infoseek.com |
Tends to be
more up to date |
LookSmart |
www.looksmart.com |
|
Lycos |
www.lycos.com |
Grandfather of all
search engines. |
Netscape |
www.netscape.com |
This page lets you find other search engines rapidly. |
WebCrawler |
www.webcrawler.com |
originally owned by AOL. |
Yahoo |
www.yahoo.com |
Has an organised
library-like directory structure, not just keyword search. |
- security
- Java has features to prevent applets downloaded off the web from doing
any deliberate damage. It also has features to prevent ordinary applications
from inadvertently doing damage. One other aspect of security are digital
signatures so that you can ensure an Applet came unmodified from a reputable
source.
There are many digital signing and encryption protocols. Here
is a summary based on a table on page 218 of Simson Garfinkle's and
Gene Spafford's O'Reilly book with a shark on the cover, Web
Security & Commerce (ISBN: 1-56592-269-7).
System |
What is
it? |
Algorithms |
Provides |
DNSSEC |
Secure Domain Name System |
RSA, MD5 |
Authentication, integrity |
IPsec and IPv6 |
Low-level protocol for encrypting IP packets |
Diffie-Hellman and others |
Confidentiality (optional), authentication, integrity |
JCE |
Java Cryptographic Extension API from Sun |
RSA (signature and encryption), RC2, RC5, SHA-0, SHA-1, MD5,
DES, ECB, CBC, IDEA, Blowfish, Twofish. |
Allows Java to encrypt and sign files |
Kerberos |
Network security service for securing higher-level
applications |
DES |
Email passwords, Telnet logins, Confidentiality, authentication |
PCT |
Protocol for encrypting TCP, IP transmissions. |
RSA, MDS, RCZ, RC4, and others |
Confidentiality, authentication, integrity,
nonrepudiation |
PGP |
Application program for encrypting electronic mail |
IDEA, RSA, MD5 |
Email signing and encryption, File encryption, Confidentiality, authentication, integrity,
nonrepudiation |
S-HTTP |
Protocol for encrypting HTTP requests and responses |
RSA, DES, and others |
Confidentiality, authentication, integrity, nonrepudiation;
however, it's obsolete |
S/MIME |
Format for encrypting electronic mail |
User-specified |
E-mail signing and encryption, Confidentiality, authentication, integrity,
nonrepudiation |
SET and CyberCash |
Protocols for sending secure payment instructions over the
Internet |
RSA, MDS, RC2 |
Confidentiality of credit card numbers, but nothing else;
integrity of entire message; authentication of buyer and seller;
nonrepudiation of transactions |
SSH |
Encrypted remote terminal |
RSA, Diffie-Hellman, DES, Triple-DES, Blowfish, and others |
Telnet encryption and login, Confidentiality, authentication |
SSL v3 |
Protocol for encrypting TCP/IP transmissions |
RSA, RCZ, RC4, MD5, and others |
Website commerce, compression, Confidentiality, authentication, integrity, nonrepudiation |
TLS 1 |
Protocol for
encrypting TCP/IP transmissions |
a 128-bit improvement on
SSL v3. Handles all the SSL v3 protocols including RSA, RCZ, RC4
and MD5. |
Opera browser, Website commerce, compression,
Confidentiality, authentication, integrity, nonrepudiation |
You can test your
browser for security to find out if your browser is secretly
blabbing your email address to every website it visits.
See Blowfish, MD5, PGP, SET, SHA-1, SHL, SSH, SSL, X.509 v3,
certificate, digital signing, sandbox.
- semaphore
- A classical technique for protecting critical sections of code from being
simultaneously executed by more than one thread. A semaphore is a generalisation
of a monitor. A monitor allows only one thread to lock an object at once.
A semaphore allows N. The process of grabbing a semaphore for semi-exclusive
use is called "downing" the semaphore because they are implemented
with a countdown integer that decrements for each lock and increments for
each unlock. If a semaphore is fully occupied, new threads wanting to use
it will wait until some thread releases its lock by "upping". the
semaphore. See monitor, mutex, synchronized. For a semaphore to work, the
check for full, and the decrement must be done all in one atomic uninterruptible
instruction. The JVM monitor instructions provide the needed hardware support
to simulate semaphores. See monitor, Condition variable, synchronize.
- separate
- A congenital genetic defect carried my the majority of most
Java programmers prevents them from spelling the word
separate correctly.
- serial port
- hardware to which you may attach a modem, serial printer or other RS-232C
device. Java does not currently officially support such a device.
Serial port support is coming in the JDK 1.2. You can read up on how it
will work in a
JavaWorld article or see what Sun has to say about
the Java Communications API 2.0.
Central Data has created the PortIO interface and an
implementation for their EtherLite ® serial/parallel cards.
The source code is in the public domain to make it easy to port
to other hardware or platforms. Solutions Consulting also
has a SerialPort class that does not need special hardware. Take
a look at Trent Jarvi's
RXTX which comes free with source code for Linux, Irix,
SunOS, and other Unixes. See the glossary
of serial communication terminology. See essay on RS232C, EOS
overview,
Oberon Software, JavaWorld
article.
At Gamelan, there is a shareware
library by Markus Bauer
(from Germany) that does serial comm.
Kevin Timm and Mark are working on an WIN/OS2/Linux
serialport class.
Finally, Sun themselves have created a Java
Communication's API which defines a platform-independent way to do serial
port communication. You can get it from JavaSoft.
- serialisation
- see serialization.
- serialization
- Java has no way of writing a complete object to a file, or of
sending it over a communications channel. It has to be taken
apart with application code, and sent as a series of primitives,
then reassembled at the other end. Serialized objects contain the
data but not the code for the class methods. It gets most
complicated when there are references to other objects inside
each object. Starting with JDK 1.1 there is a scheme called
Java Object Serialisation that uses ObjectInputStream and
ObjectOutputStream. Cynthia Jeness did an excellent presentation
at the Java Colorado Software Summit in Keystone on
serialisation. Her extensive lecture
notes are available online.
Serialised objects are very large. They contain the UTF-encoded classnames
(usually 16-bit length + 7-bit ASCII), each field name, each field type.
There is also a 64-bit class serial number. For example, a String type
is encoded rather verbosely as "java.lang.String". Data are in
binary, not Unicode or ASCII. There is some cleverness. If a string is
referenced several times by an object or by objects it points to, the UTF
string literal value appears only once. Similarly the description of the
structure of an object appears only once in the ObjectOutputStream, not
once per writeObject call.
Serialisation works by depth first recursion. This manages to avoid
any forward references in the object stream. Referenced objects are embedded
in the middle of the referencing object. There are also backward references
encoded as 00 78 xx xx, where xx xx is the relative object number.
While the lack of forward references simplifies decoding, the problem
with this scheme is, you can overflow the stack if, for example, you serialized
the head of a linked list with 1000 elements. Recursion requires about
50 times as much RAM stack space as the objects you are serialising. Another
problem is there are no markers in the stream to warn of user-defined object
formats. This means you can't use general purpose tools to examine streams.
Tools would have to know the private formats, even to read the standard
parts.
If your object A references C, and B also references C, and you write
out both A and B, there will be only one copy of C in the object stream,
even if C changed between the writeObject calls to write out A and B. You
have to use the sledgehammer ObjectOutputStream.reset() which discards
all knowledge of the previous stream output (including Class descriptions)
to ensure a second copy of C.
You can roll your own serialisation by writing readObject and writeObject
to format the raw data contents, or by writing readExternal and writeExternal,
that take over the versioning and labelling functions as well. defaultWriteObject
has at its disposal a native introspection tool that lets it see even private
methods, and reflect to pick out the fields and references. JavaSoft has
written a spec on serialisation that you should probably read if you want
to do anything fancier than invoke the default writeObject method. See
marshal, persistence, I/O.
- servlet
- an application designed to run on a server in the womb of a
permanently resident CGI mother program written in Java that provides
services for it, much the way an Applet runs in the womb of a Web
browser. You can download
the standard servlet extension API.
See this tutorial
and sample code collection.
See this tutorial on Servlet
Essentials.
See this book
Java Servlet Programming (ISBN: 1-56592-391-X) by Jason Hunter,
William Crawford and Paula Ferguson (Editor).
See my list of ISP vendors who
will host servlets and/or JDBC. See CGI, Jrun, cookie, womb,
Acme, Cascade, ExpressO, James, Java Web Server, JavaHTTPD,
Jeeves, Jigsaw, vqserver.
- session
- In dbAnywhere a session refers to the dbAnywhere connection. See connection.
See dbAnywhere.
- SET
- Mastercard and Visa's under-development protocol for sending
encrypted credit card numbers over the net. What makes it
interesting in that the merchant never gets to know your credit
card number -- only the bank does. This will cut out most credit
card fraud.
- setVisible
- setVisible(Boolean) controls whether a component and its children
are displayed on the screen. setVisible(false/true)() hides/reveals
a component by marking it as invisible/visible, allowing it to be painted
again on the next painting cycle. hide() and show() are now
deprecated. If the component is not already marked invisible/visible, show
calls invalidate() which invalidates the component and the chain
of parents since there is now more/less screen real estate in the parent
container and the positions of the siblings must be adjusted to (flow into
the freed space)/(squeeze in this new component). setVisible has
no effect on the visible flags of the children. Unlike some GUI programming
systems, when you parent.setVisible(true) you don't disturb any
of the children's visible = false flags, and the hidden children will stay
hidden, even when you again reveal the parent. While you are composing
a Frame you usually would temporarily setVisible(false), waiting
until all the components are added, before allowing any validate/repaints
to be triggered, then setVisible(true) when you were ready for your
masterwork to be revealed. setVisible will schedule a repaint if
the status changed from invisible to visible. When they are first created,
Windows, Panels and Frames are invisible and other components are visible.
See also repaint, validate, invalidate, hide, show.
- SHA-1
- Secure Hash Algorithm 1, a
message-digest algorithm developed by NIST the National
Institute of Standards and Technology and
NSA the National Security Agency. SHA-1
produces an 160-bit message digest used for creating unforgeable
digital signatures. The algorithm is slower than MD5, but the
message digest is larger, which makes it more resistant to brute
force attacks, which choose messages at random in an attempt to
generate the same message digest. SHA-1 is also used to digitally
sign jar files. PGP uses SHA-1 for digitally signing email. See
MD5, certificate, digital signing, manifest, PGP.
- shadow
- When a subclass has a variable by the same name as one of its superclasses
we call that shadowing. Be warned. The rules for inheritance for variables
are quite different than for methods. Be careful. The rules for figuring
out exactly which version of a variable get invoked are baroque. See also
override, overload.
-
shBoom
- a 32 bit dual-stack microprocessor closer to the JVM virtual machine than
most microprocessors. It uses the same sort of postfix stack operands.
Chuck Moore, the creator of Forth,
designed the shBoom chip.
- ShellSort
- Basically, you have a list of numbers to sort, and a set of
separation distances: a1, a2, ... an,
where ai > a(i+1). First you compare pairs of
numbers ai apart and swap as necessary. Then, you compare pairs
a2 apart, swapping as necessary, etc. until you compare and
swap immediately adjacent values. The efficiency of the sort will of
course depend on a good choice for the values a1 through
an. ShellSort source code
download. See sort, RadixSort, HeapSort, QuickSort.
- Shockwave
- Macromedia's Applet plug in for Netscape. It is a competitor to Java.
- shopping cart
- software for online shopping on the Internet such as Giaco's.
Rodney Myer also did one in
JavaScript called Shop@ssistant. See WebShop.
- show
- Show unhides a component by marking it as visible, allowing it to be painted
again on the next painting cycle. "show" is deprecated. With JDK 1.1 you
are supposed to use setVisible(true); See setVisible, hide.
- shroud
- To mechanically replace all variable and method names with
random meaningless names. This makes it harder to reverse
engineer class files. You can use free mangler part of the EspressoGrinder
compiler, with the option "-obfuscate". Some work on
the source code, and others on the class files. See Creama, Jobe,
JavaCC, HoseMocha, HashJava, Monmouth, JShrink, klassMaster,
Metamata Toolsuite, ObfuscatePro, SourceGuard, Visblock,
decompile, disassemble.
- SIFI
- Separating Interface From
Implementation. In C++ you specify how to use your program
in a separate file (*.hpp) from where you define how the code
works (*.cpp). In Java you put all the information in one file
(*.java), but JavaDOC splits it out for you, and the compiler
uses the separate *.class file headers to figure out how code
should be called. Ironically, Java actually provides much greater
isolation for how a method is called from how it is implemented,
since in Java, the absolute offsets are not computed until the
program is run. In C++ they are computed at compile/link time.
This isolation means Java does not need to recompile as
frequently, e.g. when a private method is added to some class the
caller uses.
- sigh
- A word used in comp.lang.java.* Internet postings as the ultimate insult.
One addicted to use of the sigh insult is under the delusion that others
disagree with him only because others are too stupid to understand his
deathless prose. see yawn.
- signature
- Java has a way of compactly encoding the types of each parameter and the
return type on a given method. This string is called the method's "signature".
- signcode
- The DOS-only application used to sign applets to let them bypass the
security restrictions of the Internet Explorer's sandbox. Here are its parameters:
signcode -prog ProgramFile -spc credentialsFile -pvk privateKeyFile
-name opusName -info opusInfo -gui -nocerts -provider
cryptoProviderName -providerType n { -commercial | -individual }
{ -sha | md5 }
See javakey,
signtool, digital signatures, sandbox.
- signed applets
- A technique of adding a digital signature to an Applet to
prove that it came from a particular trusted author. Signed
applets can be given more privileges that ordinary applets. See
Daniel Griscom's cookbook
essay on how to digitally sign Applets for Netscape,
Microsoft Internet Explorer and the Sun Java Plug-in. Also see Ted Landry's
FAQ on signing. For this to work there needs to be a chain of
trusted authorities and automatic verification of public keys
with those authorities. Any boob can create a signed Applet with
some valid signature. Further, even a trusted author can write
buggy code. See my essay based on Steven
C. Den Beste's work. See Applet, jar, javakey, signtool, digital
signatures, sandbox.
- signtool
- The application used to sign applets to get them bypass the
security restrictions of the Navigator's sandbox. The fool thing
won't just sign an existing jar file. You have to take your
existing jar apart into separate files, sign it, and let it
recreate the jar file. You will need a batch script something
like this:
rem Expand existing jar file into
rem a new empty directory tree called signdir.
rem WZunzip is the WinZip/PkZip command line utility
rem that handles long filenames.
WZunzip setclock.jar -d signdir
rem delete existing jar file
del setclock.jar
rem Sign everything in the new directory and recompress.
rem The following should all be on one line.
rem All switches must come before the directory.
signtool -k"roedy" -c9 -Z"setclock.jar" -d"D:\Program Files\Netscape\Users\roedy" signdir
See the
signtool docs for an explanation of the command line
switches. One nice thing the -G switch will do is let you create
a temporary signing id that is not backed by a certificate
signing authority, but that lets you get on with coding while you
wait for your real one to arrive.
In your Java code you also need to request permission for the
various classes of sandbox security violations (sometimes called
system targets,
capabilities or privileges) that you require like this:
import netscape.security.PrivilegeManager;
try
{
PrivilegeManager.enablePrivilege( "UniversalConnect" );
}
catch ( netscape.security.ForbiddenTargetException e )
{
}
The permission only lasts until the method that requested permission exits.
Happily when you ask a second time for permission, the security manager will
not pester the user with a dialog box.
Make sure your compile-time classpath includes the Netscape
security classes in:
\program files\netscape\communicator\program\java\classes\java40.jar.
Netscape will automatically provide these classes at run time.
Don't put them in your jar.
getResource does not work. You must use
getResourceAsStream. Further, for some Satanic reason,
the folk at Netscape decided that resources must have one of a
magic list of extensions.
See javakey, signcode, digital signatures, sandbox.
- Simplicity
- a Java IDE. See IDE.
- single dispatch
- The OO term for overriding, allowing different methods to be used depending
on the type of a single object. See multiple dispatch.
- singleton
- Singletons are the design pattern when you want only one instance of a
class created. You make the constructor private, and give access to the
instantiated object via a static instance method that creates the
object if it has not been created already. The advantages of this
technique over using class variables and methods are:
- You can change your mind later and allow multiple instances without
rewriting all your code.
- You can override methods. With static methods, no overriding is possible.
- If you never use the singleton object, it never gets created, saving RAM.
See design pattern
.
- SiteSurfer
- A search engine written in Java designed to handle a single
site. It does not require the co-operation of the host ISP to
use.
- sizeof
- Java does not have a sizeof like that in C/C++. All primitive types have
a standard size, so you don't really need one. There are no pad alignment
bytes.
type |
size
in
bytes |
boolean |
1 |
byte |
1 |
char |
2 |
short |
2 |
int |
4 |
long |
8 |
float |
4 |
double |
8 |
object reference |
4 |
return address |
4 |
- slick edit
- A $300US visual editor for Java that tidies source code. I use it. I
like it. I just wish it were cheaper so more people would enjoy it.
- SLIP
- Serial Line Interface Protocol. Protocol for
dialling up an Internet provider. It lets you simultaneously browse remote
machines while file transfers go on in the background. It is being supplanted
by the more internally complex, but easier to use, PPP.
- Smalltalk
- An object-oriented language, terser, simpler and more mature
than Java, with excellent development tools. It lacks the
write-once run-everywhere standard byte code of Java and the
marketing hype. Read more about it in:
Here are some Smalltalk environments you might want to consider:
Here are some other links to get you started:
- SmartJ
- Crystalline Solutions' (Jonathan Revusky's) tool for launching class
files as if they were EXE files under Windows and NT. SmartJ automatically
finds a JVM to run on and automatically set up a CLASSPATH. It is much
less picky about the input it accepts than java.exe.
SmartJ allows you to switch between JDK 1.1 and 1.2 without messing with
any environment variables. It's just SmartJ -12 Myclass or
SmartJ -11 Myclass. Also, by default, it tells you what JVM
you're using and what the CLASSPATH is, which may help you avoid confusion
about what JVM and/or build you are currently testing.
SmartJ makes the CLASSPATH mess much more manageable. In fact, SmartJ
pretty much eliminates the need for a CLASSPATH environment variable,
since it transparently sets up a valid CLASSPATH every time you launch a
java class. After installing SmartJ, .class files can be launched by a
double-click in the Windows explorer, whether they are set up on the
CLASSPATH or not!
SmartJC is a replacement for Javac that has the extra feature that you can
also give it one or more directories as an argument. It recompiles all
out-of-date source files in a directory and its subdirectories. Before
invoking the compiler, it looks at all the source files and, based on the
package they are in, it sets up a valid CLASSPATH. So again, you don't
need a CLASSPATH set up. In fact, SmartJC in many cases will eliminate the
need to use any complicated make or build tools.
See CLASSPATH, java.exe.
- smooth animation
- See double buffering.
- SMTP
- Simple Mail Transfer Protocol. The
protocol most commonly used for sending mail to a server. There is
an undocumented class for sending mail: sun.net.smtp. You use it
like this:
SmtpClient c = new SmtpClient(server);
c.from(sender);
c.to(recipient);
PrintStream p = c.startMessage();
p.println( "" );
p.println( "Subject: Test of SMTP Server" );
p.println( "" );
p.println( "Hi" );
c.closeServer();
See POP3, JavaMail, GoodHost, MassMail, Hacksaw.
- SNMP
- Simple Network Management Protocol. See Alex
Kowalenko's implementation.
- SNTP
- Simple Network Time Protocol. See
NTP.
- socket
- In TCP/IP each computer has a name, such as roedy.mindprod.com.
However, various TCP/IP programs could be running on that computer. Each gets a
assigned a number called a socket. The HTTP server would usually be
assigned 80. DbAnywhere is usually 8889. This way you can specify which
service on the local or remote machine you want to connect with. The
socket is specified like this: roedy.mindprod.com:8889.
- SoftLogic
- A Russian company that will write programs on contract inexpensively.
- solver
- a program such as the ILOG
Solver, that seeks the optimal solution to a problem given constraints.
The C++ based ILOG Solver is aimed at job shop and flow shop scheduling,
transportation and logistics planning, timetabling, predictive personnel
policy management, staff allocation and rostering, configuration, placement,
network routing and frequency allocation. Such problems often involve complex
constraints and extremely large search spaces. See global optimisation.
- SOM
- System Object Model ?? IBM's technique for objects to communicate with
each other. See ORB.
- sort
- Putting items in ascending or descending order by key fields. The
English language meaning of sort is simply to categorise, e.g. to put all
your bills into folders by category, e.g. all the electric bills together,
all the phone bills together. An internal sort is done strictly in RAM. An
external sort uses hard disk temporary files. A sort is stable if it naturally preserves existing
order when you have duplicate keys. If you want existing order preserved
and you are using an unstable sort, you must add an extra sequence number
key to your records and use that as a secondary tie-breaking key.
Here are some sorts: NIST,
CSUSB.
In the JDK 1.2 there are built in sorts. I wrote four sorts available with
source: HeapSort, QuickSort, RadixSort and ShellSort.
In the following table, speed is measured relative to RadixSort on a
10,000 item set of 5-character random keys of the form A9999 where
RadixSort is arbitrarily assigned 100. Bigger is better.
Sort |
speed |
stable? |
notes |
RadixSort |
100 |
yes |
Good for very large sorts, takes same time per item no matter how many
items. Ordinary sorts take more time per item as the number of items goes
up. More complicated Compare routine to write. Likes short keys. If you
double the length of the key the sort time doubles. |
QuickSort |
46 |
no |
Likes random data to sort. Order in the
data can cause it to take a very long time to sort. Not good on very small
sorts. |
HeapSort |
42 |
no |
Works best when data are
almost already sorted. |
ShellSort |
37 |
no |
Small and quick-loading.
Good for small sorts under 2000 items. |
- sound
- Here are some places where you can find canned sounds:
Wavplace, SoundAmerica, pcug, or
Cybercinema.
see AU, beep, JMF, wav, IMF, MIDI, Soundbite, sound-on-the-fly.
-
Soundbite
- A program to record sounds from within Netscape Navigator.
- Soundex
- A technique devised by Donald Knuth for filing names by the way they
are pronounced rather than the way they are spelled. You generate a
phonetic key from the name and index by that.
- Source Collections
- See Collections of Source.
- SourceAgain
- A decompiler. See decompiler, disassembler.
- SourceGuard
- A shrouder. See shroud.
- space
- "Space" is modem jargon for "a binary zero". In the days
of the telegraph, Morse used an on/off one/zero code. Pens at the receiving
end made marks and spaces on a moving piece of paper. Sending a one made
a mark. Sending a zero made a space. Though we now use ASCII, a simpler
and less efficient code that Morse's, we still use the old terminology.
- SPAM
- Monty Python did a skit where they said the word "SPAM" so
many times you wanted to run screaming from the room. SPAM is either junk
e-mail or junk postings in a newsgroup. Typically it is an advertisement
for some product or scam totally unrelated to the newsgroup, e.g.
pornography in the comp.lang.java newsgroups. People try various tactics
to avoid getting on the spammer's hit lists. For the most part they just
annoy or block legitimate correspondents. Eventually we will invent legal
or technical countermeasures, but for now it is just a fact of life like
mosquitos on a camping trip.
- SPASM
- Stolen Postfix Assembler. Roedy Green's
rip off of the Laxen and Perry 16-bit Postfix assembler for 32-bit
operations on the Intel 8086 and follow on chips that emulate it part of
the BBL Forth compiler. See BBL, ORGASM.
- sponsor
- Somebody who not only refrains from using free coupons to the movies, but
also who buys tickets for all her friends.
- springs and struts
- Vibe's replacement technique for layouts that automatically adjusts the
size and position of the components to fit the amount of screen real estate
provided. Instead of writing code, you visually connect components with
fixed length struts, natural length struts and variable length springs.
Natural sizes are important because they define what the width and height
naturally are for a widget as well as the minimum distance between widgets.
For example, on Windows 95 the natural size of a button is 75x23 while
on Motif it is 80x25. By using a natural size, the developer does not have
to worry about such details. Fixed length struts can be used to control
absolute positioning and also the minimum size of various components. See
Vibe.
- sprintf
- See printf.
- Squeak
- A language evolving out of SmallTalk-80. Along with Eiffel,
Dylan and Sather, it is one of the most fertile grounds for new
language ideas.
- SQL
- Standard Query Language, a platform independent relational database
query language. Accessed via JDBC in Java. I have collected a list of SQL vendors including prices. SQL and
relational databases were pioneered by Codd and C.J. Date. Date's 1996
book,
The Guide to the SQL Standard (ISBN: 0-201-96426-0) is
considered the best on understanding the SQL "standard".
In SQL you request sets of records with statements like this to show just
the name, city and state of people in Massachusetts.
SELECT last_name, first_name, city,
state
FROM contacts
WHERE state = 'MA'
ORDER BY last_name;
There is some slick syntax like BETWEEN and IN for writing terser
WHERE clauses. You can also summarise data with queries like this to
get the count of people in each state (not bothering with states with
one or fewer people.)
SELECT state, count(*)
FROM contacts
WHERE age > 18
GROUP BY state
HAVING COUNT(*) > 1
ORDER BY state;
There is some slick syntax like BETWEEN and IN for writing terser
WHERE clauses. LIKE 'Mc'; gives you wildcard matching.
To change individual fields is a bit tedious. You must compose
ASCII sentences. You can't just hand over the modified record in
binary. You must tell it precisely which fields changed and how to
find the record that needs changing again.
UPDATE contacts
SET last_name='Brown',
state='WA'
WHERE acct=2103 AND
state='MA';
By adding AND state="MA"
you ensure no recent changes have been made by someone else. The
syntax for adding new records is quite different from that for
updating. If you left off the WHERE clause, every record in the table
would be updated!
INSERT INTO contacts(last_name,
first_name, city, state)
VALUES('Brown','James','Seattle','WA');
With INSERT, you have to supply all the must enter fields. For
bulk insertions, there is the LOAD TABLE command that accepts a file
of comma and apostrophe delimited data.
LOAD INTO TABLE contacts FROM
'C:\temp\contacts.txt'
Delete is straightforward. Be careful. If you forget the WHERE clause,
every record in the table will be deleted!
DELETE FROM contacts
WHERE acct=2103;
SQL looks quite simple, but is suprisingly powerful. It will let you
look up by fields which are not indexed. It will let you change the
primary key in a record. It will let you change individual fields in a
record without disturbing the others. SQL has its own procedural language
to write triggers, code that is automatically run before or after various
database events.
SQL uses quite different string literal conventions from Java. Strings
are surrounded in (') not ("). Embedded (') are written ('') [two single quotes in a row] not
(") not (\') and embedded (") are left plain as ("). These conventions also apply to data
imported into SQL as comma-delimited Strings. It gets really hairy
creating string literals in Java to be fed to SQL since you have two
layers of quoting. First you compose the string to get it right for SQL,
then you apply the Java quoting conventions. You also have to be aware of
the SQL quoting conventions when you dynamically compose SQL statements in
Java or when you feed data to SQL from Java. None of this would be necessary if
SQL had a method interface instead of an ASCII sentence interface.
SQL uses = both for assignment and comparison unlike Java with uses = for
assignment and == for comparison. If you load your triggers individually
they work. If you try to load them in batches, SQL gets confused about
terminating semicolons. You can view your triggers with:
SELECT * FROM SYS.SYSTRIGGERS;
SQL uses CASE/WHEN/ELSE instead of SWITCH/CASE/DEFAULT. Its these
little differences that often trip you up and leave you
scratching your head. It is missing features you would expect
such as descending sorts and the ability to traverse forward and
back in result sets.
See the list of Java friendly
ISPs that will support servlets/JDBC/SQL.
See foreign key, JDBC, ODBC, JSQL, Jeevan, ORDBMS.
- SSI
- Server Side Includes. A technique that
makes it much easier to maintain boilerplate text that appears in
many different web pages. With the Apache server, if you turn
server side includes on, and name your documents *.shtml instead
of *.html you can embed code like this in your HTML:
<!--#include
virtual="/includes/copyright.txt"-->
On an NT server, the filename needs to be *.stm instead of *.htm,
the syntax is nearly identical:
<!--#include
file="/includes/assoc.htm"-->
On Novell you can use any extension you like, including *.html.
You could use either of the above two methods.
Essentially the difference is in the assumptions that each system
makes as to what the root level is. On the UNIX system if you use
"file=" it starts at the root of the system's
filesystem, in NT it starts at the root of the logical server's
filesystem. On Novell, it starts at the current directory.
Here is a list of things you might say in SSI, and what they
would generate when used in this document, using the Novell
Server my ISP has. If you are viewing this document locally, you
won't see any effects. You need to be viewing through an SSI
server.
SSI Embedded Command |
Visible
Effect |
Purpose |
<!--#COUNT
FILE="jglosss.cnt"--> |
|
hit counter, stored in filename specified. |
<!--#CONFIG TIMEFMT="%Y-%m-%d
%H:%M"--> |
|
configures the format of SSI timestamps to ISO standard
yyyy-mm-dd hh:mm |
<!--#FLASTMOD
FILE="jglosss.html"--> |
|
display date given file was last modified. |
<!--#FSIZE
FILE="jglosss.html"--> |
|
display the size of the given file. |
<!--#ECHO VAR="DOCUMENT_NAME"--> |
|
The document file name |
<!--#ECHO
VAR="DOCUMENT_URI"--> |
|
The document Universal Resource Identifier (the path) |
<!--#ECHO
VAR="DATE_LOCAL"--> |
|
The current date and time |
<!--#ECHO
VAR="DATE_GMT"--> |
|
The current Greenwich Mean Time date and time |
<!--#ECHO
VAR="LAST_MODIFIED"--> |
|
The date and time the document was last modified |
<!--#ECHO
VAR="REMOTE_ADDR"--> |
|
The IP address of the user requesting the document |
<!--#ECHO
VAR="SERVER_SOFTWARE"--> |
|
The name and version of the Web server software |
<!--#ECHO
VAR="SERVER_NAME"--> |
|
The local hostname of the Web Server |
<!--#ECHO
VAR="SERVER_PORT"--> |
|
The TCP port on which the Web server is listening for HTTP
requests (the default is 80) |
<!--#ECHO
VAR="REMOTE_HOST"--> |
|
The hostname of the computer requesting the document |
<!--#ECHO
VAR="AUTH_TYPE"--> |
|
The method used to authenticate user requests. |
<!--#ECHO VAR="HTTP_USER_AGENT"--> |
|
The name of the browser requesting the document |
See HTML.
- SSL
- Secure Sockets Layer protocol used
communicate over an encrypted connection, and to authenticate
none, one or both of the participants. There are two versions SSL
version 2 (SSL v2) and SSL version 3 (SSL v3). SSL v3 is more
flexible and safer than SSL v2. It works by the website sending
its X.509 v3 certificate containing its public key to your
browser. That allows session keys to be exchanged to encrypt the
following traffic. See HTTPS. The nice feature about SSL is that
it can use different lengths of key for different purposes. This
allows it to get around the foolish US laws that restrict long
keys for privacy but allow them for identification and data
integrity checking. SSL will still work even if the client does
not have a certificate. SSL encryption software for export is
limited by a foolish U.S. law to 512-bit public keys and 40-bit
private keys, even though the knowledge to build such software is
freely available globally. See TLS, HTTPS.
- StarOffice
- An office suite written entirely in Java, compatible with
Microsoft Office. The personal version is free, a 65 MB download.
It is an enormous amount of software. However, it very spritely,
faster than MS Office.
- start
- method that restarts your Applet after a stop, especially animations. In
contrast with init, start may be called many times in the life of an Applet.
start is also run after the init. See also init, stop, main.
- start bit
- Modems send letters of the alphabet as series of eight zeroes and ones.
The modem always precedes each character with a zero. The transition to
zero helps resynchronize the clock of the receiving modem so it can sample
at the exact centre of each incoming bit. Modems idle by sending ones (marking).
The zero (space) bit signifies the start of a character. For more information
on start bits see the essay on essay on RS232C.
- starting
- See getting started.
- state
- See design patterns.
- Statement
- In JDBC, you can pass an SQL query or command in a "Statement" object.
A "PreparedStatement" object is a Statement that also supports passing
parameters to the query. A "CallableStatement" is a PreparedStatement that
also supports retrieving output parameters back from the query.
- static
- Refers to a method or variable that is not attached to a particular
object, but rather to the class as a whole. Static final is Javanese for
"constant". Static methods work without any this
object. Static methods are limited to calling other static methods in the
class and to using only static instance variables. They can call instance
methods only if they use their own objects -- not rely on this. See
constant, class variable, class method, instance variable, instance
method.
- Stingray Software
- makers of a library of tree and grid controls.
- STL
- Standard Template Library. A library of C++ container classes based on
red-black trees. Soon something equivalent should exist for Java.
- stoked
- excited
- stop
- method that temporarily shuts down your Applet -- particularly animations.
See also start, exit.
- stop bit
- In the old days of the Teletype, modems had to idle while the mechanical
print cylinder shifted to the next position ready to type. The modem appended
one or two ones on the end of each character to mark time. Today modems
still tack on at least one stop bit, but for a different reason. The one
bit ensures there will be a noticeable difference (transition from one
to zero) when the zero start bit for the next character is sent. For more
information on stop bits see the essay on RS232C.
- strategy
- See design patterns.
- StreamTokenizer
- java.io.StreamTokenizer breaks up the ASCII text in a file into chunks
at delimiters and hands them to you one at a time, preconverted to a binary
double for numerics. See this StreamTokenizer
code example. Watch the American spelling. See StringTokenizer.
- StreamWorks
- A scheme like ReadAudio to allow a radio station to broadcast
digitally to the planet using the Internet. See RealAudio.
- String
- Strings are quite different from C++. You can't change the characters in
a string. To look at individual characters, you need to use charAt(). Strings
in Java are 16-bit Unicode. To edit strings, you need to use a StringBuffer
object. For manipulating 8-bit characters, you want an array of bytes --
byte[]. See stringWidth.
- StringTokenizer
- java.util.StringTokenizer breaks up Strings into chunks at delimiters
and hands them to you one at a time. See this StringTokenizer code example.
Watch the American spelling. See StreamTokenizer.
- stringWidth
- You can't talk about the length of a string in pixels without specifying
the font. To calculate the string's width you need code something like this:
Font font = getFont();
FontMetrics metrics = getFontMetrics(font);
int width = metrics.stringWidth(theString);
- struts and springs
- See springs and struts, Vibe.
- StructureBuilder
- A code generating tool written in 100% pure Java that lets you
edit code either as source or visually, and the other representation
automatically changes to match. $495.
- student projects
- I have written an essay describing quite a few student programming
projects. Some are quite simple, some very advanced. You are welcome to
the ideas.
- Styx
- AT&T/Lucent's new communication protocol. See Dis, Inferno, Limbo,
Plan 9.
- subclass
- You create a new Dalmatian subclass by deriving it from (i.e. extending)
a base/superclass Dog. Even though the subclass Dalmatian typically has
more methods in it than the original Dog base/super class, we still call
Dalmatian a subclass of Dog.
- subnet mask
- IPs are 32 bit binary numbers usually written as a decimal
dotted quad, e.g. 216.66.157.8. There is some additional
structure in the number, called the net, subnet and hostnumber.
Usually an ISP would manage an entire net. There is a
variable number of bits for each field. Depending on how big a
fish your ISP is, he would have a class A, B or C license. Class
A would let him support 16,777,214 hosts, B 65,534 hosts and C
254 hosts online at one time.
Class |
Range |
Default Mask |
Class A |
1 .. 127 |
255.0.0.0 |
Class B |
128 .. 191 |
255.255.0.0 |
Class C |
192 .. 223 |
255.255.255.0 |
The subnet mask is a binary number expressed as a dotted quad to
help determine how the IP number is composed.
Consider the IP number 7.123.56.89 and its corresponding subnet
mask: 255.240.0.0. We can tell from the prefix 7 that this is
part of a class A licence block -- the 7.xxx.xxx.xxx series. Thus
the net portion is the first 8 bits. If we write the subnet mask
in binary we get: 11111111.11110000.00000000.00000000. There are
20 bits (indicated by the zeros) reserved for host number. This
would allow 1,048,574 different possible host addresses (not
1,048,576 because the addresses consisting of all zeros and all
ones are reserved.) and 4 bits for subnet addresses i.e. 14
possible subnets + 2 reserved.
Consider the IP number 190.123.56.89 and its corresponding subnet
mask: 255.255.192.0. We can tell from the prefix 190 that this is
part of a class B licence block -- the 190.123.xxx.xxx series.
Thus the net portion is the first 16 bits. If we write the subnet
mask in binary we get: 11111111.11111111.11000000.00000000. There
are 14 bits reserved for host number. This would allow 16,382
different possible host addresses and 2 bits for subnet addresses
i.e. i.e. 2 possible subnets + 2 reserved.
Consider the IP number 204.50.123.56 and its subnet mask
255.255.255.0. We can tell from the prefix 204 that this is part
of a class C licence block, -- the 204.50.123.xxx series. The the
net portion is the first 24 bits. If we write the subnet mask in
binary we get: 11111111.11111111.11111111.00000000. There are 8
bits reserved for host number. This would allow 254 different
possible host addresses and no bits for a subnet addresses. The
ISP is keeping this class C licence group as one subnet.
Just to add to the confusion, a big ISP might own several
contiguous class C licenses. He can then combine them and create
subnets bigger than 254 hosts. So you will sometimes see a Class
B-style subnet mask like 255.255.192.0 being used on a Class C
licence address.
See IP.
- subroutine
- In Java functions that return nothing are called "void methods".
- substr
- String.substr(int start, int end) is Java's way of making a copy of a piece
of a string. Java is different from most other languages in that you specify
the end point, not the length of the substring. The offsets are 0-based,
i.e. the first character of the string is character 0. To further confuse
you, the end points one character past the end of the string. It
is perhaps best to think of it this way. Imagine little vertical bars separating
the characters of the string, with a bar on the beginning and end of the
string as well. You feed substr the start and end vertical bar numbers
that enclose the substring you want.
_0_1_2_3_4_
|h|e|l|l|o|
0_1_2_3_4_5
"hello".substr(1,3) == "el"
Substr is clever. It does not make a deep copy of the substring the
way most languages do. It just creates a pointer into the original immutable
string. This can be confusing if you are low-level debugging since you
will see the whole string. There have been reports of a bug in Microsoft's
implementation of substr.
- Sumatra
Satellite
- a data retrieval tool for accounting information. Runs standalone or in
a browser and over the Internet if you want. I mention this app because
it has a polish not normally seen in Java.
-
Sun
- The company that started Java off. Now child companies
SunSoft, SunTest and JavaSoft are carrying on the work. Sun
sponsors University sites called SunSites. There are a set of
undocumented classes, sun.*, that include FocusingTextField,
HorizBagLayout, OrientableFlowLayout, Base64, uuEncode, CRC16,
FIFO and LIFO queues, Sort, Timer, FTPClient. NttpClient,
SmtpClient, HttpClient, plus dozens more. To send email check
this list of
addresses.
- SunSite
- A web site at any of a number of universities sponsored by Sun Microsystems.
- SunSoft
- The business unit of Sun Microsystems that has the charter for
technologies using Java or targeting the Java marketplace, like the Java
WorkShop development environment. I'm not sure but I the JavaSoft name is
being used much more frequently than SunSoft. SunSoft may now just refer
to the online store.
- SunTest
- SunTest is the Java test automation unit of Sun Microsystems.
- super
- When you override a method, you can still get the original method by using
super.ThatMethod(). You can only go back one level.
- Super Highway
- a proposed network of high speed dedicated phone links that will transmit
at 625,000,000 bits per second.
- SuperCede
- Asymetrix's flash JVM compiler for Windows-95. It caches the
native code for reuse rather than freshly compiling it each time
the class is loaded the way a JIT does. SuperCede also includes a
RAD IDE. Coming versions will support Active X and database.
SuperCede has been sold to Instantiations, the Jove people.
- superclass
- You derive a new subclass Dalmatian from the base/super class Dog. Even
though Dog typically has fewer accessible methods than Dalmatian, we still
call Dog the superclass.
- Swift
- Swift is an equation editor and viewer written in Java. It is meant to
be used to place equations in HTML pages. The viewer is written as an Applet
and it is used to view the equation. The editor is written as a Java application
and runs standalone. It has a GUI along the lines of the Microsoft Equation
Editor in Word.
-
Swing
- Sun's set of lightweight GUI components that give much fancier screen displays
than the raw AWT. Since they are written in pure Java, they run the same
on all platforms, unlike the AWT. They are part of the JFC. They support
pluggable look and feel -- not by using the native platform's facilities
but by roughly emulating them. This means you can get any supported look
and feel on any platform. The disadvantage of lightweight components is
slower execution. The advantage is uniform behaviour on all platforms.
See AFC, IFC, JFC.
- Symantec
- The makers of Café a Java IDE. Visual Café adds a visual
layout tool to write code. Pro and Database edition include SQL database
functionality. See Visual Café Pro, Visual Café Database
Development Edition.
- SymMath
- Class library, provides classes for symbolic derivation and evaluation
of a mathematical expression.
- synchronized
- a crucial method that must not be executed by two threads
simultaneously. Note the American spelling that all Java terms use.
According to David Holmes, a
synchronized non-static method locks the object to which the method
belongs, on entry to the method and unlocks it on exit (well if it already
owns the lock - they are reentrant - it actually increases and decreases
the lock count respectively). A statement: synchronized(foo){ ...
} locks the object foo on entry to the statement and unlocks
it on exit (or increases/decreases the count if its already owned). A
synchronized non-static method is syntactic shorthand for enclosing the
whole body of the method in synchronized(this){ ... }.
Only one thread at a time can own the lock for any given object. Thus
if more than one thread tries to enter a section of code for which the
lock must be acquired then only one thread will get the lock and all other
threads will block. Note however that a thread can still execute a non-synchronized
method or block of code even if the object is locked.
To protect access to static variables you must lock the class object
- which is what a synchronized static method does. Alternatively in any
method you can obtain a lock on the class object explicitly using synchronised(getClass()){
... }
When multiple threads are waiting to acquire the lock on an object the
order in which the lock is assigned to a waiting thread is not defined.
See monitor, mutex, semaphore.
- synchronous
- Serious high speed data transfers use synchronous modems. These send whole
messages at a time. This way the overhead of start and stop bits can be
dispensed with. Instead a few synchronizing characters are glued to the
front of each message to help synchronize the clocks of the two modems.
In addition synchronizing characters or special bit patterns are inserted
in the middle of messages from time to time. They use patterns that could
never represent data.
- syntax
- I have composed a cheat sheet
summarising the Java syntax. The syntax is the grammar of the Java
language, where you put your () {} and other punctuation.
- system properties
- see properties.