- I OpenACS For Everyone
- I.1 High level information: What is OpenACS?
- I.1.1 Overview
- I.1.2 OpenACS Release Notes
- I.2 OpenACS: robust web development framework
- I.2.1 Introduction
- I.2.2 Basic infrastructure
- I.2.3 Advanced infrastructure
- I.2.4 Domain level tools
- I.1 High level information: What is OpenACS?
- II Administrator's Guide
- II.2 Installation Overview
- II.2.1 Basic Steps
- II.2.2 Prerequisite Software
- II.3 Complete Installation
- II.3.1 Install a Unix-like system and supporting software
- II.3.2 Install Oracle 10g XE on debian
- II.3.2.1 Install Oracle 8.1.7
- II.3.3 Install PostgreSQL
- II.3.4 Install AOLserver 4
- II.3.5 Quick Install of OpenACS
- II.3.5.1 Complex Install OpenACS 5.3
- II.3.6 OpenACS Installation Guide for Windows2000
- II.3.7 OpenACS Installation Guide for Mac OS X
- II.4 Configuring a new OpenACS Site
- II.4.1 Installing OpenACS packages
- II.4.2 Mounting OpenACS packages
- II.4.3 Configuring an OpenACS package
- II.4.4 Setting Permissions on an OpenACS package
- II.4.5 How Do I?
- II.4.6 Configure OpenACS look and feel with templates
- II.5 Upgrading
- II.5.1 Overview
- II.5.2 Upgrading 4.5 or higher to 4.6.3
- II.5.3 Upgrading OpenACS 4.6.3 to 5.0
- II.5.4 Upgrading an OpenACS 5.0.0 or greater installation
- II.5.5 Upgrading the OpenACS files
- II.5.6 Upgrading Platform components
- II.6 Production Environments
- II.6.1 Starting and Stopping an OpenACS instance.
- II.6.2 AOLserver keepalive with inittab
- II.6.3 Running multiple services on one machine
- II.6.4 High Availability/High Performance Configurations
- II.6.5 Staged Deployment for Production Networks
- II.6.6 Installing SSL Support for an OpenACS service
- II.6.7 Set up Log Analysis Reports
- II.6.8 External uptime validation
- II.6.9 Diagnosing Performance Problems
- II.7 Database Management
- II.7.1 Running a PostgreSQL database on another server
- II.7.2 Deleting a tablespace
- II.7.3 Vacuum Postgres nightly
- II.8 Backup and Recovery
- II.8.1 Backup Strategy
- II.8.2 Manual backup and recovery
- II.8.3 Automated Backup
- II.8.4 Using CVS for backup-recovery
- II.A Install Red Hat 8/9
- II.B Install additional supporting software
- II.B.1 Unpack the OpenACS tarball
- II.B.2 Initialize CVS (OPTIONAL)
- II.B.3 Add PSGML commands to emacs init file (OPTIONAL)
- II.B.4 Install Daemontools (OPTIONAL)
- II.B.5 Install qmail (OPTIONAL)
- II.B.6 Install Analog web file analyzer
- II.B.7 Install nspam
- II.B.8 Install Full Text Search
- II.B.9 Install Full Text Search using Tsearch2
- II.B.10 Install Full Text Search using OpenFTS (deprecated see tsearch2)
- II.B.11 Install nsopenssl
- II.B.12 Install tclwebtest.
- II.B.13 Install PHP for use in AOLserver
- II.B.14 Install Squirrelmail for use as a webmail system for OpenACS
- II.B.15 Install PAM Radius for use as external authentication
- II.B.16 Install LDAP for use as external authentication
- II.B.17 Install AOLserver 3.3oacs1
- II.C Credits
- II.C.1 Where did this document come from?
- II.C.2 Linux Install Guides
- II.C.3 Security Information
- II.C.4 Resources
- II.2 Installation Overview
- III For OpenACS Package Developers
- III.9 Development Tutorial
- III.9.1 Creating an Application Package
- III.9.2 Setting Up Database Objects
- III.9.3 Creating Web Pages
- III.9.4 Debugging and Automated Testing
- III.10 Advanced Topics
- III.10.1 Write the Requirements and Design Specs
- III.10.2 Add the new package to CVS
- III.10.3 OpenACS Edit This Page Templates
- III.10.4 Adding Comments
- III.10.5 Admin Pages
- III.10.6 Categories
- III.10.7 Profile your code
- III.10.8 Prepare the package for distribution.
- III.10.9 Distributing upgrades of your package
- III.10.10 Notifications
- III.10.11 Hierarchical data
- III.10.12 Using .vuh files for pretty urls
- III.10.13 Laying out a page with CSS instead of tables
- III.10.14 Sending HTML email from your application
- III.10.15 Basic Caching
- III.10.16 Scheduled Procedures
- III.10.17 Enabling WYSIWYG
- III.10.18 Adding in parameters for your package
- III.10.19 Writing upgrade scripts
- III.10.20 Connect to a second database
- III.10.21 Future Topics
- III.11 Development Reference
- III.11.1 OpenACS Packages
- III.11.2 OpenACS Data Models and the Object System
- III.11.3 The Request Processor
- III.11.4 The OpenACS Database Access API
- III.11.5 Using Templates in OpenACS
- III.11.6 Groups, Context, Permissions
- III.11.7 Writing OpenACS Application Pages
- III.11.8 Parties in OpenACS
- III.11.9 OpenACS Permissions Tediously Explained
- III.11.10 Object Identity
- III.11.11 Programming with AOLserver
- III.11.12 Using Form Builder: building html forms dynamically
- III.12 Engineering Standards
- III.12.1 OpenACS Style Guide
- III.12.2 Release Version Numbering
- III.12.3 Constraint naming standard
- III.12.4 ACS File Naming and Formatting Standards
- III.12.5 PL/SQL Standards
- III.12.6 Variables
- III.12.7 Automated Testing
- III.13 CVS Guidelines
- III.13.1 Using CVS with OpenACS
- III.13.2 OpenACS CVS Concepts
- III.13.3 Contributing code back to OpenACS
- III.13.4 Additional Resources for CVS
- III.14 Documentation Standards
- III.14.1 OpenACS Documentation Guide
- III.14.2 Using PSGML mode in Emacs
- III.14.3 Using nXML mode in Emacs
- III.14.4 Detailed Design Documentation Template
- III.14.5 System/Application Requirements Template
- III.15 TCLWebtest
- III.16 Internationalization
- III.16.1 Internationalization and Localization Overview
- III.16.2 How Internationalization/Localization works in OpenACS
- III.16.4 Design Notes
- III.16.5 Translator's Guide
- III.D Using CVS with an OpenACS Site
- III.9 Development Tutorial
- IV For OpenACS Platform Developers
- IV.17 Kernel Documentation
- IV.17.1 Overview
- IV.17.2 Object Model Requirements
- IV.17.3 Object Model Design
- IV.17.4 Permissions Requirements
- IV.17.5 Permissions Design
- IV.17.6 Groups Requirements
- IV.17.7 Groups Design
- IV.17.8 Subsites Requirements
- IV.17.9 Subsites Design Document
- IV.17.10 Package Manager Requirements
- IV.17.11 Package Manager Design
- IV.17.12 Database Access API
- IV.17.13 OpenACS Internationalization Requirements
- IV.17.14 Security Requirements
- IV.17.15 Security Design
- IV.17.16 Security Notes
- IV.17.17 Request Processor Requirements
- IV.17.18 Request Processor Design
- IV.17.19 Documenting Tcl Files: Page Contracts and Libraries
- IV.17.20 Bootstrapping OpenACS
- IV.17.21 External Authentication Requirements
- IV.18 Releasing OpenACS
- IV.18.1 OpenACS Core and .LRN
- IV.18.2 How to Update the OpenACS.org repository
- IV.18.3 How to package and release an OpenACS Package
- IV.18.4 How to Update the translations
- IV.17 Kernel Documentation
- V Tcl for Web Nerds
- V.1 Tcl for Web Nerds Introduction
- V.2 Basic String Operations
- V.3 List Operations
- V.4 Pattern matching
- V.5 Array Operations
- V.6 Numbers
- V.7 Control Structure
- V.8 Scope, Upvar and Uplevel
- V.9 File Operations
- V.10 Eval
- V.11 Exec
- V.12 Tcl for Web Use
- V.13 OpenACS conventions for TCL
- V.14 Solutions
- VI SQL for Web Nerds
- VI.1 SQL Tutorial
- VI.1.1 SQL Tutorial
- VI.1.2 Answers
- VI.2 SQL for Web Nerds Introduction
- VI.3 Data modeling
- VI.3.1 The Discussion Forum -- philg's personal odyssey
- VI.3.2 Data Types (Oracle)
- VI.3.4 Tables
- VI.3.5 Constraints
- VI.4 Simple queries
- VI.5 More complex queries
- VI.6 Transactions
- VI.7 Triggers
- VI.8 Views
- VI.9 Style
- VI.10 Escaping to the procedural world
- VI.11 Trees
- VI.1 SQL Tutorial
V.9 File Operations
Tcl has a built-in interface for dealing with Unix files. The commands themselves are relatively straightforward, so we'll just explain them in a reference list below.
Reference
file atime filename
Returns as a decimal number the time that the file was last accessed.set access_time [file atime "index.adp"] ==> 916612934
file dirname filename
Returns the name of the parent directory of the file.set parent_dir [file dirname "~/home/dir/this.adp"] ==> ~/home/dir
file executable filename
Returns 1 if the file is executable, 0 otherwise.chmod 1111 billg-wealth.tcl
file executable billg-wealth.tcl ==> 1file exists filename
Returns 1 if the file exists, 0 otherwise.file exists billg-wealth.tc ==> 0 file exists billg-wealth.tcl ==> 1
file extension filename
Returns the file extension of the file (i.e. from the last dot to the end)file extension billg-wealth.tcl ==> .tcl
file isdirectory filename
Returns 1 if the file is a directory, 0 otherwise.file isdirectory . ==> 1 file isdirectory billg-wealth.tcl ==> 0
file isfile filename
Returns 1 if the file is not a directory, symbolic link, or device, 0 otherwise.file isfile billg-wealth.tcl ==> 1
file lstat filename variablename
Puts the results of thestat
command on linkname into variablename.ln -s billg-wealth.tcl temp.tcl file lstat temp.tcl temp ==> (array holding stat info)
file mtime filename
Returns the modify time of file as a decimal string.file modify billg-wealth.tcl ==> 915744902
file owned filename
Returns 1 if the current user owns the file, else 0.file owned billg-wealth.tcl ==> 1
file readable filename
Returns 1 if the file is readable, else 0.file readable billg-wealth.tcl ==> 1
file readlink filename
Returns the contents of the symbolic link named filename.ln -s file.txt file1.txt file readlink file1.txt ==> file.txt
file rootname filename
Returns all but the extension and the last . of the filename.file rootname billg-wealth.tcl ==> billg-wealth
file size filename
Returns the size in bytes of the file.file size billg-wealth.tcl ==> 774
file stat filename variablename
Returns the stat results about the file into the array named variablename. The elements of the variable array are: atime, ctime, dev, gid, ino, mode, mtime, nlink, size, type, and uid.file stat billg-wealth.tcl billg_info
set $billg_info(ctime) ==> 916615489file tail filename
Returns all of the characters after the last / in the filename.file tail ~/home/dir/subdir/file.txt ==> file.txt
file type filename
Returns the type identified of the filename arg, which can be one of the following: file, directory, characterSpecial, blockSpecial, fifo, link, or socket.file type billg-wealth.tcl ==> file
file writable filename
Returns 1 if the file is writable, 0 otherwise.file writable billg-wealth.tcl ==> 0
More: http://www.tcl.tk/man/tcl8.4/TclCmd/file.htm
Input/Output Commands
open filename ?access? ?permissions?
Returns a stream handle to open the file for the access specified with the permissions specified. Defaut values are read for the access required and the permissions are the same as the default permissions on a file. The access value options are r (read from existing file), r+ (read from and write to existing file), w (write over or create and write to file as necessary), w+ (read from and write to or create file as necessary), a (write to existing file; append data to it), a+ (read from and write to existing file; append data to it).
More: http://www.tcl.tk/man/tcl8.4/TclCmd/open.htmset my_stream [open /tmp/file.txt r]
puts ?-nonewline? ?stream? string
Write the string to the stream. Default is STDOUT.
More: http://www.tcl.tk/man/tcl8.4/TclCmd/puts.htmputs "Hello, world." ==> Hello, world.
gets stream ?varname?
Read a line from the stream. If a variable is specified, put the line into that variable.
More: http://www.tcl.tk/man/tcl8.4/TclCmd/gets.htmgets $my_stream line
read stream ?numbytes?
If numbytes is specified, read that many bytes of the stream. If not, read the whole stream.
More: http://www.tcl.tk/man/tcl8.4/TclCmd/read.htmset first_ten_bytes [read $my_stream 10]
read -nonewline stream
Read the whole stream and discard the last newline.set this_file_contents [read -nonewline $my_stream]
tell stream
Return the "seek offset." (See below for seek.)
More: http://www.tcl.tk/man/tcl8.4/TclCmd/tell.htmset seek_offset [tell $my_stream]
seek stream offset ?origin?
Set the seek offset. Origin is eitherstart, current, or end
.
More: http://www.tcl.tk/man/tcl8.4/TclCmd/seek.htmseek $my_stream offset end
eof stream
Returns 1 if you have reached the end of the stream; 0 otherwise.
More: http://www.tcl.tk/man/tcl8.4/TclCmd/eof.htmif {[eof $my_stream]} {
break
}flush stream
Write buffers of a stream
More: http://www.tcl.tk/man/tcl8.4/TclCmd/flush.htmflush $my_stream
close stream
Close the stream.
More: http://www.tcl.tk/man/tcl8.4/TclCmd/close.htmclose $my_stream
Exercises
1. Write a procedure to check the spelling of a word:
# spell :: filedescriptor X string -> boolean
proc spell {fd word} {...}
It should take a file descriptor, which refers to an opened dictionary file, and a string, which is the word to be checked, and it should return 1 if the word is spelled correctly, or 0 if not.
We define spelled correctly to mean that the word is listed in the dictionary file. We ignore the issues of plurals, etc: if the exact word is not found in the dictionary, it's misspelled.
We define a dictionary file to be any file that contains words, one per line, which is sorted in ASCII collating order. You may use the file /home/keith/web/tcl-course/words
for testing.
Hint: this proc is extremely easy to write. If you disagree, you're approaching it wrong.
2. Modify your spelling checker to output an identifying line number with each mispelled word. Your output for each line should be the line number, a tab, and the mispelled word.
Hint: this should add about two lines to your program.
---
based on Tcl for Web Nerds