Mastering Os/2 Threads

Total Page:16

File Type:pdf, Size:1020Kb

Mastering Os/2 Threads EXPERT ADVICE OS/2 NOTEBOOK • Douglas A. Hamilton MASTERING OS/2 THREADS OS/2's unique style of lightweight multitasking taxes developers and rewards users on't make me wait! When I select Print, insert a new value into a spreadsheet, or resize a D desktop publishing window, I don't want to be ignored while the appli­ cation grinds away. None of us likes to wait, and applications designers have heard that message. So spreadsheets today come with background recalc features, for exam­ ple. But these features have taken forever to arrive, and they still aren't universally provided. If everyone knows what the problem is, why don't they just go ahead and fix it? The answer is that background any­ thing under DOS or Windows has to be custom-made. OS/2 is the first and only normal OS/2 or Unix processes, the sys­ Threads run inside processes, which widely distributed system to provide a tem can create and switch among them in turn run inside screens. The progres­ specific mechanism for dealing with quickly. Because they share memory, sion from threads outward to screens en­ problems of this class without building tasks enjoy high-bandwidth communica­ tails more and more "fire-walling" on everything from scratch. OS/2 lets a de­ tion. the part of OS/2. signer cleave off compute- or I/O-bound The idea isn't completely new. Re­ But the most important distinction is activities as separately scheduled threads searchers in the Unix community, par­ that while processes and screens are nor­ and thereby ensure crisp user interaction ticularly at the Carnegie Mellon Univer­ mally used for sharing the processor be­ at all times. sity Mach project, have talked about tween applications, threads are uniquely lightweight processes for several years. a way of sharing the processor inside an Modes of Concurrency But OS/2 is the first commonly available application. That means more responsive When I talk about threads, I'm talking system to implement this strategy. single-user applications and, just as im­ about concurrency: doing more than one A thread is a simple flow of control portant, high-performance server appli­ thing at a time. The whole idea is to avoid within a process. Its state consists of an cations. Distributed databases that man­ having a processor sit idle when it could instruction pointer, a stack, a register age transactions using threads, rather be doing something useful, and to be set, its priority, and certain types of than entire processes, can be highly effi­ sure that what it is doing is most im­ semaphores. Everything else-memory cient. portant. (i.e., instructions and data), file descrip­ Key factors that determine the perfor~ tors, even the current disk and direc­ Where Are the Applications? mance of a concurrency mechanism are tory-is shared with the other threads in So now I'm back to almost the same the time required to create and switch be­ the process. Threads, like interrupt rou­ question: If everyone knows what the tween tasks and the ease with which tines, require the designer to identify problem is, and if OS/2 provides the tasks can share information. Because critical sections and implement resource­ means of solving it, why don't you see threads carry less state information than sharing protocols. continued ILLUSTRATION: BETH KROMMES © 1990 SEPTEMBER 1990 • BYTE 101 OS/2 NOTEBOOK OS/2 NOTEBOOK many great multithreaded OS/2 applica­ thread is a dispatchable element used by books show how to write a multithreaded tions? MS OS/2 to track execution cycles of the program. From discussions I see on BIX To start, building a multithreaded ap­ processor." Three years later, that still and elsewhere, most developers seem to plication takes a tremendous amount of doesn't tell me anything. be gaining the familiarity and exp()rience hard work. Elaborate handshaking is re­ Then came the infamous MTDYNA they need. quired to ensure that threads don't tram­ .DOC. At first, you couldn't use the C OS/2 2.0 promises a new, improved ple over each other. Everything has to be library if you wanted to use threads, be­ semaphore application programming in­ reentrant, compiled with the right op­ cause the library routines weren't reen­ terface that's touted as easier to use, al­ tions, and linked with the right libraries. trant. In the spring of 1988, a new release though I'm skeptical. In my experience, Any shared resources have to be sema­ of the C compiler brought the multi­ it's not the semaphore primitives that are phored, and all that semaphoring has to threaded library and headers and a 1039- at fault, it's that semaphores are inher­ be carefully constructed to avoid race line read-me file, MTDYNA.DOC, bur­ ently tricky. Race conditions are just conditions anywhere that could result in ied on one of the disks. For two years, plain tough to avoid and even tougher to "deadly embrace." If the term deadly that was the only official documentation debug. embrace is a bit fuzzy, trust me, writing for most of us. I see nothing that changes that. Some your first multithreaded application will Other roadblocks have been the con­ version 2.0 changes appear to be more give you a good visceral feel for it. stantly changing "musical header files." musical headers. For example, the so­ Whenever a thread needs to "own" I know I've not been alone in just dread­ called FS (fast, safe) semaphores intro­ something, you have to invent a mecha­ ing each new SDK or Toolkit release. duced with great fanfare last year are nism for the purpose. For example, when Each one seemed to bring a new set of gone. What possible reason could there building the Hamilton C shell, a highly seemingly gratuitous changes to all the have been to introduce these semaphores multithreaded command processor for names defined in the headers. First it at all if they were going to be eliminated OS/2, I had to come up with a way for a was all uppercase, then mixed case; first so quickly? thread to maintain the notion of a current English, then Hungarian. Each release But the biggest impediments to seeing directory. It would hardly have been meant nothing would compile until I'd all those great multithreaded applica­ acceptable if a script running quietly in made all the same gratuitous changes to tions now and through the rest of the year the background could suddenly, without all my own source code. will be nontechnical. If sales of OS/2 warning, change the foreground current continue at current levels, don't expect directory. Building a high-performance Least Common Denominator much. mechanism to re-create a current direc­ The other big reason that there aren't Still, there's hope. Although Windows tory notion for each thread turned out to many great multithreaded applications is 3.0 will likely give all of us in the OS/2 be a challenging project. that once you write one, it's not portable. community gas pains, it may ultimately Debugging can be a real treat. Since Conversely, if you're porting something be the best thing that could happen to the kernel's decisions about what thread in from another environment, you don't OS/2. If you have the hardware to run gets to run next depend on what segments just add threads and stir. To really use Windows 3.0 acceptably, OS/2 should are loaded, setting a breakpoint can (by threads, you have to weave them pretty run fine also. OS/2 2.0 will make the mi­ forcing a segment to be loaded) cause a tightly into the fabric of your product. gration easier. I have one DOS box right different execution order. Here's the And let's face it: It's one thing to be non­ now, and, for me, it's one too many, con­ software analog of the hardware bug that portable if you're selling to an installed sidering how often I bother with it. But I disappears when you put the scope probe base of 50 million users, and quite an­ admit even I was strangely captivated to on it. other to a base of only 300,000. see multiple DOS applications like good Not surprisingly, most of the first old Lotus 1-2-3 running in Presentation Not for the Faint of Heart wave of applications for OS/2 have been Manager windows under OS/2 2.0. When I began working on the C shell in ports from DOS or Windows. Micro­ Ultimately, competitive pressures will the summer of 1987, I worried a lot about soft's own Word 5.0 and Excel are two grow as more users and developers learn possible competitors doing the same very disappointing but typical examples just what can be done with threads. Un­ thing (i.e., building Unix-style tools for of programs that do absolutely nothing to like breakfast cereal, where you can eat OS/2). It seemed like an obvious need, take advantage of OS/2. Neither Word the whole box and still have no idea and I knew others were equally capable nor Excel will do background printing; whether it's any good for you, most folks of writing such things. But mostly, that Excel doesn't even let you move its win­ figure out pretty quickly whether new didn't happen. I wondered why. dow around while it prints. software is any good for them.
Recommended publications
  • Shell Scripting with Bash
    Introduction to Shell Scripting with Bash Charles Jahnke Research Computing Services Information Services & Technology Topics for Today ● Introductions ● Basic Terminology ● How to get help ● Command-line vs. Scripting ● Variables ● Handling Arguments ● Standard I/O, Pipes, and Redirection ● Control Structures (loops and If statements) ● SCC Job Submission Example Research Computing Services Research Computing Services (RCS) A group within Information Services & Technology at Boston University provides computing, storage, and visualization resources and services to support research that has specialized or highly intensive computation, storage, bandwidth, or graphics requirements. Three Primary Services: ● Research Computation ● Research Visualization ● Research Consulting and Training Breadth of Research on the Shared Computing Cluster (SCC) Me ● Research Facilitator and Administrator ● Background in biomedical engineering, bioinformatics, and IT systems ● Offices on both CRC and BUMC ○ Most of our staff on the Charles River Campus, some dedicated to BUMC ● Contact: [email protected] You ● Who has experience programming? ● Using Linux? ● Using the Shared Computing Cluster (SCC)? Basic Terminology The Command-line The line on which commands are typed and passed to the shell. Username Hostname Current Directory [username@scc1 ~]$ Prompt Command Line (input) The Shell ● The interface between the user and the operating system ● Program that interprets and executes input ● Provides: ○ Built-in commands ○ Programming control structures ○ Environment
    [Show full text]
  • C Shell Scripts File Permissions a Simple Spelling Checker Command
    Cshell scripts Asimple spelling checker mylatex1.csh #!/bin/csh #!/bin/csh tr -cs "[:alpha:]" "[\n*]" < $1 \ latex file.tex |tr"[:upper:]" "[:lower:]" \ dvips -f file.dvi > file.ps |sort -u > tempfile rm file.aux file.dvi file.log comm -23 tempfile /usr/share/dict/words rm tempfile mylatex2.csh #!/bin/csh Put one word per line \ |convert everything to lowercase \ latex $1.tex |sor t the words,remove duplicates and write the result to ’tempfile’. dvips -f $1.dvi > $1.ps rm $1.aux $1.dvi $1.log Pr int those words in ’tempfile’ that are not in the dictionary. Remove the temporar y file. Graham Kemp,Chalmers University of Technology Graham Kemp,Chalmers University of Technology File permissions Command substitution in a script ls -l To include the output from one command within the command line for another command, enclose the command whose output is to be included rwxrwx rwx within ‘backquotes‘. For example: rwxr -xr -x #!/bin/csh 111101101 echo Date and time is: date echo 1111 011 012 = 7558 echo "Your username is:" ‘whoami‘ echo "Your current directory is:" ‘pwd‘ chmod 755 file.sh chmod u+x file.sh chmod -R a+rX . Graham Kemp,Chalmers University of Technology Graham Kemp,Chalmers University of Technology Editing several files at once (1) sed scripts Suppose wewant to change ‘‘cie’’to‘‘cei’’inall files in the current grep href publications.html \ director y whose name ends with ‘‘.tex’’. |sed ’s/[ˆ"]*"//’ \ |sed ’s/".*//’ #!/bin/csh Instead of giving a single editing command on the command line,wecan ls *.tex | sed ’s/.*/sed s\/cie\/cei\/g & > &tmp/’ > s1 create a script file containing a sequence of editing commands.
    [Show full text]
  • Shell Script & Advance Features of Shell Programming
    Kirti Kaushik et al, International Journal of Computer Science and Mobile Computing, Vol.4 Issue.4, April- 2015, pg. 458-462 Available Online at www.ijcsmc.com International Journal of Computer Science and Mobile Computing A Monthly Journal of Computer Science and Information Technology ISSN 2320–088X IJCSMC, Vol. 4, Issue. 4, April 2015, pg.458 – 462 RESEARCH ARTICLE Shell Script & Advance Features of Shell Programming Kirti Kaushik* Roll No.15903, CS, Department of Computer science, Dronacharya College of Engineering, Gurgaon-123506, India Email: [email protected] Jyoti Yadav Roll No. 15040, CS, Department of Applied Computer science, Dronacharya College of Engineering, Gurgaon-123506, India Email: [email protected] Kriti Bhatia Roll No. 15048, CS, Department of Applied Computer science, Dronacharya College of Engineering, Gurgaon-123506, India Email: [email protected] Abstract-- In this research paper, the idea of shell scripting and writing computer programs is examined and different parts of shell programming are likewise contemplated. A shell script is a PC system intended to be controlled by the UNIX shell which is a charge line translator. The different tongues of shell scripts are thought to be scripting dialects. Regular operations performed by shell scripts incorporate document control, program execution, and printing content. A shell script can give an advantageous variety ofa framework order where unique environment settings, charge alternatives, or post-transforming apply naturally, yet in a manner that permits the new script to still go about as a completely typical UNIX summon. The real ideas like Programming in the Borne and C-shell, in which it would be clarified that how shell programming could be possible in Borne and C-shell.
    [Show full text]
  • Examining the Hamilton C Shell
    EXAMINING ROO M Examining the Hamilton C Shell Unix power for OS/2 Scott Richman tarting OS/2 for the first time was, file system), long filenames, and threads. in the background and the server will for me, like unlocking a Ferarri, Additionally, the Shell supports large be kept busy. sitting behind its wheel and find­ command lines and pipes (up to 64K) ing a Yugo's dash. What a disap­ and includes faster and more powerful Supporting Procedures pointment. Sure, the engine and utilities than those supplied with OS/2. Script programmers can create C Shell suspensionS were first rate, but the con­ This is more than Unix - this is a pow­ procedures, which are more like func­ trols were minimal, the clutch was stiff, erful requirement for development un­ tions: They accept a parameter list and and the pedals were nonresponsive! der OS/2. The ability to execute C shells return a value. These procedures are OS/2 comes with great stuff, but CMD simultaneously in different Presenta­ compiled into C Shell memory and are .EXE, the default command-line pro­ tion Manager (PM) text windows con­ then executed as new shell commands. cessor, is poor compared to the pow­ verts your PC into a flexible workstation. Procedures can greatly extend the erfuloperating system beneath. CMD.EXE The Hamilton C Shell comes with power and flexibility of your environ­ appears to be a port of the MS-DOS many programs and shell scripts. To ment. COMMAND.COM and lacks the major install the Shell, you simply copy the As an example, consider ZCW.CSH features of a serious front end.
    [Show full text]
  • Bash Guide for Beginners
    Bash Guide for Beginners Machtelt Garrels Garrels BVBA <tille wants no spam _at_ garrels dot be> Version 1.11 Last updated 20081227 Edition Bash Guide for Beginners Table of Contents Introduction.........................................................................................................................................................1 1. Why this guide?...................................................................................................................................1 2. Who should read this book?.................................................................................................................1 3. New versions, translations and availability.........................................................................................2 4. Revision History..................................................................................................................................2 5. Contributions.......................................................................................................................................3 6. Feedback..............................................................................................................................................3 7. Copyright information.........................................................................................................................3 8. What do you need?...............................................................................................................................4 9. Conventions used in this
    [Show full text]
  • Unix and Linux System Administration and Shell Programming
    Unix and Linux System Administration and Shell Programming Unix and Linux System Administration and Shell Programming version 56 of August 12, 2014 Copyright © 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012, 2013, 2014 Milo This book includes material from the http://www.osdata.com/ website and the text book on computer programming. Distributed on the honor system. Print and read free for personal, non-profit, and/or educational purposes. If you like the book, you are encouraged to send a donation (U.S dollars) to Milo, PO Box 5237, Balboa Island, California, USA 92662. This is a work in progress. For the most up to date version, visit the website http://www.osdata.com/ and http://www.osdata.com/programming/shell/unixbook.pdf — Please add links from your website or Facebook page. Professors and Teachers: Feel free to take a copy of this PDF and make it available to your class (possibly through your academic website). This way everyone in your class will have the same copy (with the same page numbers) despite my continual updates. Please try to avoid posting it to the public internet (to avoid old copies confusing things) and take it down when the class ends. You can post the same or a newer version for each succeeding class. Please remove old copies after the class ends to prevent confusing the search engines. You can contact me with a specific version number and class end date and I will put it on my website. version 56 page 1 Unix and Linux System Administration and Shell Programming Unix and Linux Administration and Shell Programming chapter 0 This book looks at Unix (and Linux) shell programming and system administration.
    [Show full text]
  • Introduction to Shell Programming Using Bash Part I
    Introduction to shell programming using bash Part I Deniz Savas and Michael Griffiths 2005-2011 Corporate Information and Computing Services The University of Sheffield Email [email protected] [email protected] Presentation Outline • Introduction • Why use shell programs • Basics of shell programming • Using variables and parameters • User Input during shell script execution • Arithmetical operations on shell variables • Aliases • Debugging shell scripts • References Introduction • What is ‘shell’ ? • Why write shell programs? • Types of shell What is ‘shell’ ? • Provides an Interface to the UNIX Operating System • It is a command interpreter – Built on top of the kernel – Enables users to run services provided by the UNIX OS • In its simplest form a series of commands in a file is a shell program that saves having to retype commands to perform common tasks. • Shell provides a secure interface between the user and the ‘kernel’ of the operating system. Why write shell programs? • Run tasks customised for different systems. Variety of environment variables such as the operating system version and type can be detected within a script and necessary action taken to enable correct operation of a program. • Create the primary user interface for a variety of programming tasks. For example- to start up a package with a selection of options. • Write programs for controlling the routinely performed jobs run on a system. For example- to take backups when the system is idle. • Write job scripts for submission to a job-scheduler such as the sun- grid-engine. For example- to run your own programs in batch mode. Types of Unix shells • sh Bourne Shell (Original Shell) (Steven Bourne of AT&T) • csh C-Shell (C-like Syntax)(Bill Joy of Univ.
    [Show full text]
  • Unix Shell Programming – by Dinesh Kumar S
    1 Unix Shell Programming – by Dinesh Kumar S PDF by http://www.k2pdf.com Contents Chapters Topic Page no. Chapter 1 Introduction 3 Chapter 2 SSH Client 4 Chapter 3 Unix Shells 8 Chapter 4 Text Editors 11 Chapter 5 A Beginning to Shell Scripting 19 Chapter 6 Operators 33 Chapter 7 Variables Manipulation (Advance) 39 Chapter 8 Conditional Statements 43 Chapter 9 Looping Statements 47 Chapter 10 Control Statements 74 Chapter 11 Functions 79 2 Unix Shell Programming – by Dinesh Kumar S Chapter 1 Introduction Linux : It is an operating system based on UNIX . Kernel : It is the backbone of Linux OS, which is used to manage resources of Linux OS like memory, I/O, software, hardware management processes. User Shell Script Kernel PC h/w User writes script. Script contains instructions. Kernel interprets the instruction in machine language. As per the instruction kernel controls the PC hardware. Shell script : It’s a collection of OS commands or instructions. Advantages of Shell Script : Script is always a platform independent. Performance will be faster than programming languages. Very easy to debug. 3 Unix Shell Programming – by Dinesh Kumar S Chapter 2 SSH Client Secure Shell (or) SSH is a network protocol that is used to exchange or share information between two different networks. This is used on Linux & UNIX systems to access SHELL accounts. All the information exchanged/transmitted between networks is encrypted . It uses public key cryptography to authenticate remote computer user. Free Serial, Telnet, and SSH client Putty Tera Term Putty : It is a terminal emulator application which acts as client for SSH, Telnet, rLogin.
    [Show full text]
  • An Introduction to the C Shell
    -- -- An Introduction to the C shell William Joy (revised for 4.3BSD by Mark Seiden) Computer Science Division Department of Electrical Engineering and Computer Science University of California, Berkeley Berkeley, California 94720 ABSTRACT Csh is a newcommand language interpreter for UNIX†systems. It incorporates good features of other shells and a history mechanism similar to the redo of INTERLISP. While incorporating manyfeatures of other shells which makewriting shell programs (shell scripts) easier,most of the features unique to csh are designed more for the interac- tive UNIX user. UNIX users who have read a general introduction to the system will find a valuable basic explanation of the shell here. Simple terminal interaction with csh is possible after reading just the first section of this document. The second section describes the shell’s capabilities which you can explore after you have begun to become acquainted with the shell. Later sections introduce features which are useful, but not necessary for all users of the shell. Additional information includes an appendix listing special characters of the shell and a glossary of terms and commands introduced in this manual. Introduction A shell is a command language interpreter. Csh is the name of one particular command interpreter on UNIX.The primary purpose of csh is to translate command lines typed at a terminal into system actions, such as invocation of other programs. Csh is a user program just likeany you might write. Hopefully, csh will be a very useful program for you in interacting with the UNIX system. In addition to this document, you will want to refer to a copyofthe UNIX User Reference Manual.
    [Show full text]
  • Chapter 5. Writing Your Own Shell
    Chapter 5. Writing Your Own Shell You really understand something until you program it. ­­GRR Introduction Last chapter covered how to use a shell program using UNIX commands. The shell is a program that interacts with the user through a terminal or takes the input from a file and executes a sequence of commands that are passed to the Operating System. In this chapter you are going to learn how to write your own shell program. Shell Programs A shell program is an application that allows interacting with the computer. In a shell the user can run programs and also redirect the input to come from a file and output to come from a file. Shells also provide programming constructions such as if, for, while, functions, variables etc. Additionally, shell programs offer features such as line editing, history, file completion, wildcards, environment variable expansion, and programing constructions. Here is a list of the most popular shell programs in UNIX: sh Shell Program. The original shell program in UNIX. csh C Shell. An improved version of sh. tcsh A version of Csh that has line editing. ksh Korn Shell. The father of all advanced shells. bash The GNU shell. Takes the best of all shell programs. It is currently the most common shell program. In addition to command­line shells, there are also Graphical Shells such as the Windows Desktop, MacOS Finder, or Linux Gnome and KDE that simplify theDraft use of computers for most of the users. However, these graphical shells are not substitute to command line shells for power users who want to execute complex sequences of commands repeatedly or with parameters not available in the friendly, but limited graphical dialogs and controls.
    [Show full text]
  • Linux Shell Scripting Tutorial V2.0
    Linux Shell Scripting Tutorial v2.0 Written by Vivek Gite <[email protected]> and Edited By Various Contributors PDF generated using the open source mwlib toolkit. See http://code.pediapress.com/ for more information. PDF generated at: Mon, 31 May 2010 07:27:26 CET Contents Articles Linux Shell Scripting Tutorial - A Beginner's handbook:About 1 Chapter 1: Quick Introduction to Linux 4 What Is Linux 4 Who created Linux 5 Where can I download Linux 6 How do I Install Linux 6 Linux usage in everyday life 7 What is Linux Kernel 7 What is Linux Shell 8 Unix philosophy 11 But how do you use the shell 12 What is a Shell Script or shell scripting 13 Why shell scripting 14 Chapter 1 Challenges 16 Chapter 2: Getting Started With Shell Programming 17 The bash shell 17 Shell commands 19 The role of shells in the Linux environment 21 Other standard shells 23 Hello, World! Tutorial 25 Shebang 27 Shell Comments 29 Setting up permissions on a script 30 Execute a script 31 Debug a script 32 Chapter 2 Challenges 33 Chapter 3:The Shell Variables and Environment 34 Variables in shell 34 Assign values to shell variables 38 Default shell variables value 40 Rules for Naming variable name 41 Display the value of shell variables 42 Quoting 46 The export statement 49 Unset shell and environment variables 50 Getting User Input Via Keyboard 50 Perform arithmetic operations 54 Create an integer variable 56 Create the constants variable 57 Bash variable existence check 58 Customize the bash shell environments 59 Recalling command history 63 Path name expansion 65 Create and use aliases 67 The tilde expansion 69 Startup scripts 70 Using aliases 72 Changing bash prompt 73 Setting shell options 77 Setting system wide shell options 82 Chapter 3 Challenges 83 Chapter 4: Conditionals Execution (Decision Making) 84 Bash structured language constructs 84 Test command 86 If structures to execute code based on a condition 87 If.
    [Show full text]
  • Shell Scripting
    Shell Scripting Alexander B. Pacheco LTS Research Computing Outline 1 Introduction Types of Shell Variables File Permissions Input and Output 2 Shell Scripting Getting Started with Writing Simple Scripts Arithmetic Operations Flow Control Arrays Command Line Arguments Functions 3 Unix Utilities grep sed 4 awk programming 5 Wrap Up 2 / 76 Introduction Introduction What is a SHELL The command line interface is the primary interface to Linux/Unix operating systems. Shells are how command-line interfaces are implemented in Linux/Unix. Each shell has varying capabilities and features and the user should choose the shell that best suits their needs. The shell is simply an application running on top of the kernel and provides a powerful interface to the system. her Softwa Ot re Shell Kernel rdwa a r e H 4 / 76 Types of Shell sh : Bourne Shell Developed by Stephen Bourne at AT&T Bell Labs csh : C Shell Developed by Bill Joy at University of California, Berkeley ksh : Korn Shell Developed by David Korn at AT&T Bell Labs backward-compatible with the Bourne shell and includes many features of the C shell bash : Bourne Again Shell Developed by Brian Fox for the GNU Project as a free software replacement for the Bourne shell (sh). Default Shell on Linux and Mac OSX The name is also descriptive of what it did, bashing together the features of sh, csh and ksh tcsh : TENEX C Shell Developed by Ken Greer at Carnegie Mellon University It is essentially the C shell with programmable command line completion, command-line editing, and a few other features.
    [Show full text]