N/ { print $0 }' $PROJ.time;; 98 f) awk '/OFF/ { print $0 }' $PROJ.time;; 99 *) echo "\n ** Wrong command, try again **";; 100 esac 101 done;; 102 *) echo "\n ** Wrong command, try again **";; 103 esac 104 done PREMENNYE SREDY VYPOLNENIYA PROJ Soderzhit tekushchee imya proekta PROJ2 Soderzhit vremennoe imya proekta, vvedennoe pol'zovatelem RSP Soderzhit komandu vybora iz menyu OPISANIE ZACHEM NAM NUZHEN timelog? Vremya - dragocennyj tovar. Ego vsegda ne hvataet, i esli uzh ono ispol'zovano, to ego nikogda bol'she nel'zya vernut'. My hotim byt' uve- reny, chto nashe vremya ispol'zuetsya plodotvorno. My mozhem i dolzhny soz- dat' instrumental'nye sredstva, kotorye pomogut nam upravlyat' nashim vremenem i fiksirovat' ego. My dolzhny rassmotret' sleduyushchie voprosy: nad kakimi proektami my rabotaem, v techenie kakogo vremeni my nad nimi rabotaem (t.e. nachalo i okonchanie), i kakuyu eshche informaciyu nam nuzhno hranit'. Kak raz pochti vse eti funkcii podderzhivayutsya programmoj timelog. My napisali dovol'no dlinnuyu programmu, no zametim, chto na samom dele rabota nad etim sredstvom ne okonchena. Predlagaemyj komandnyj fajl timelog podgotavlivaet vas k rabote s sistemoj upravleniya vremenem. Vam nuzhno vstavit' vash sobstvennyj tekst dlya vydachi otchetov, osnovan- nyh na statistike vremeni. CHTO DELAET timelog? Timelog otnositsya k ves'ma vazhnoj oblasti, svyazannoj s fiksaciej vremeni i upravleniem vremenem. Otmetim, chto kolichestvo uchetnyh svede- nij, kotorye mozhno sozdat', prosmotret' i obrabotat', ogranicheno tol'- ko dostupnym prostranstvom fajlovoj pamyati. Timelog - eto polnost'yu upravlyaemyj s pomoshch'yu menyu interfejs. Sistemy s menyu v UNIX - eto nechto novoe, oni imeyut svoi preimushchestva i nedostatki. Odnim iz preimushchestv yavlyaetsya to, chto vsya rabota nad dan- nymi vypolnyaetsya programmno, a ne vruchnuyu. Krome togo, kazhduyu funkciyu naglyadno vidno i legko vybrat'. Vam net neobhodimosti zapominat' opcii i imena fajlov, dostatochno prosto nazhat' odnu klavishu dlya vypolneniya dejstviya. Nedostatkom yavlyaetsya to, chto menyu rabotayut medlennee, chem ruchnoj interfejs (t.e. prosto nabor i neposredstvennoe vypolnenie komand). |to ochen' vazhnoe zamechanie, no my dolzhny takzhe pomnit', chto programmy dolzhny byt' prostymi v ispol'zovanii, prostymi dlya modifikacii i vy- polnyat' mnozhestvo melochej, svyazannyh s kakoj-libo ideej ili oblast'yu naznacheniya. Poterya mashinnogo vremeni chashche vsego luchshe, chem poterya vre- meni cheloveka! Drugoj nedostatok - dlya togo chtoby dobrat'sya do oprede- lennoj funkcii, vy dolzhny projti cherez neskol'ko urovnej menyu. Naprimer, chtoby napechatat' otchet, vy dolzhny vyzvat' timelog, vyb- rat' menyu statistiki, zatem vybrat' nuzhnyj vam otchet. Zdes' tri urov- nya, a pri nalichii utility vy mogli by vsego odnoj komandoj skazat' "report report_file". Dlya utilit, vypolnyayushchih odnu funkciyu, nalichie odnoj komandy s neskol'kimi opciyami dovol'no effektivno. Takoj podhod primenyaetsya v bol'shinstve komandnyh fajlov interpretatora shell. No kogda u vas est' mnozhustvo nebol'shih zadach, vypolnyaemyh nad gruppoj ob®ektov, menyu bo- lee udobny. Nekotorye sistemy predostavlyayut interfejs, upravlyaemyj kak menyu, tak i komandami. |to ustraivaet bol'shij krug pol'zovatelej i pozvolyaet izbezhat' bol'shinstva nedostatkov, upomyanutyh vyshe. Konechno, pri takom podhode neminuemy nekotorye izderzhki i programma stanovitsya bolee dlinnoj. Pri vyzove timelog na ekran vyvoditsya nachal'noe menyu, kak pokaza- no nizhe. --------------------- | | Thu, Jun 19 21:32:12 | | Time Logger | ----------- Project: | s) Select a project file | c) Create a new project file | l) List current project files | v) View the project file | n) Turn billing on | f) Turn billing off | r) Report statistics | | enter response (s,c,l,v,n,f,r,): V levom verhnem uglu pokazan den' nedeli i data. V pravom verhnem uglu pokazano vremya. |to real'noe vremya, i ono obnovlyaetsya pri kazhdom vyzove menyu. Imya menyu "Time Logger" (registrator vremeni). "Report statistics" (soobshchit' statistiku) vyzyvaet poyavlenie podchinennogo me- nyu. Stroka, v kotoroj napisano "Project:" (proekt), pokazyvaet, chto tekushchee imya proekta nulevoe. Dlya togo chtoby rabotat' nad proektom, vy sperva dolzhny sozdat' fajl proekta ili vybrat' ego, esli on uzhe su- shchestvuet. Vse dejstviya, vypolnyaemye posle etogo, otnosyatsya k tekushchemu fajlu proekta. Pervyj punkt menyu s prednaznachen dlya vybora fajla proekta. Posle vybora etogo punkta vyvoditsya soobshchenie: --------------------------- | | Enter project name ( for exit): | Vvedite imya proekta ( dlya vyhoda): Vy mozhete vvesti lyubuyu tekstovuyu stroku v kachestve imeni proekta ili, esli vam ne nuzhna eta opciya, nazhat' klavishu vozvrata karetki dlya blagopoluchnogo vyhoda. Esli vy ne pomnite imena proektov, vy mozhete ispol'zovat' opciyu l, poyasnyaemuyu nizhe. Posle vvoda imeni sushchestvuyushchego proekta, tekushchemu imeni proekta (kotoroe pechataetsya sprava vverhu v kazhdom menyu) prisvaivaetsya imya etogo fajla. Sleduyushchej yavlyaetsya opciya c dlya sozdaniya fajla proekta. Kak uzhe otmechalos', eto dolzhno byt' pervym, chto vy delaete, nachinaya rabotat' s utilitoj timelog, no posle etogo vy obychno vybiraete sushchestvuyushchie faj- ly. Kogda vy vybrali opciyu c, pechataetsya sleduyushchee priglashenie: --------------------------- | | Enter the new project name ( to exit): | Vvedite imya novogo proekta ( dlya vyhoda): Zdes' nuzhno vvodit' to zhe samoe, chto i pri vybore proekta. Dlya vyhoda nazhmite vozvrat karetki. Posle vvoda imeni tekushchee imya proekta izmenyaetsya, sozdaetsya fajl proekta, zapominaetsya vremya, i fajl zagru- zhaetsya ishodnoj informaciej. Sleduyushchaya opciya l prednaznachena dlya vydachi spiska imen fajlov proektov. Poskol'ku kazhdyj proekt yavlyaetsya fajlom, otobrazhaetsya spisok v vide, obychnom dlya komandy ls. Tem ne menee, bud'te vnimatel'ny. Spisok nel'zya poluchit' pryamo komandoj ls. Imena izmeneny dlya zashchity ot naivnyh. Kazhdyj fajl proekta hranitsya na diske v formate "project. time". CHast' project v kazhdom fajle otlichaetsya i predstavlyaet soboj imya, vve- dennoe v opcii sozdaniya. Vse fajly imeyut suffiks .time. Kogda vyvo- ditsya spisok, prefiks .time otbrasyvaetsya, tak chto imena fajlov yavlya- yutsya prosto proektami, kotorye vy vveli v opcii vybora proekta. Zdes' vse rabotaet, no vy dolzhny pomnit', chto esli vy zahotite prosmotret' fajly vremen vruchnuyu, to imena ne budut temi zhe samymi. Esli net nika- kih fajlov proektov, to ob etom vyvoditsya soobshchenie. Sleduyushchej opciej yavlyaetsya v dlya prosmotra fajla proekta. Fajlom, kotoryj vy sobiraetes' prosmotret', yavlyaetsya tekushchij fajl proekta. Ego imya vyvoditsya v menyu sprava ot slova "Project:". Esli ne poyavilos' ni- kakogo imeni, vy dolzhny sperva sozdat' novyj proekt ili vybrat' su- shchestvuyushchij. Fajl proekta vyvoditsya na ekran komandoj UNIX more. Sleduyushchej opciej yavlyaetsya opciya n dlya vklyucheniya podscheta vremeni. |to oznachaet nachalo zapisi novogo seansa raboty nad proektom. Proverya- etsya imya proekta, chtoby vyyasnit', byl li vybran fajl proekta. Esli net, vyvoditsya soobshchenie o tom, chto nuzhno eto sdelat'. Zatem proverya- etsya, byl li fajl proekta otklyuchen predydushchej operaciej. Esli da, to registrator vremeni mozhet byt' vklyuchen. Vy ne mozhete vklyuchit' ego dvazhdy. Vy dolzhny otklyuchit' ego, zatem vklyuchit' i t.d. Sleduyushchaya opciya f otklyuchaet podschet vremeni dlya fajla proekta. Tekushchee imya proekta sravnivaetsya s nulevym, i esli eto tak, to vyvo- ditsya sootvetstvuyushchee soobshchenie. Zatem proveryaetsya, byl li predvari- tel'no vklyuchen podschet vremeni dlya etogo fajla. Esli byl, to v fajl proekta dobavlyaetsya zapis' o vyklyuchenii podscheta. Poslednej opciej yavlyaetsya r dlya otcheta i statistiki. Posle ee vy- bora na ekran vyvoditsya podchinennoe menyu: ----------------------- | | Statistics | ---------- Project: | a) Accumulative time totals | n) All times on | f) All times off | | enter response (a,n,f,): Kak upominalos' ranee, eto menyu na samom dele ne realizovano. Neskol'ko komand-zaglushek pozvolyayut etomu menyu funkcionirovat', no v etom meste vy mozhete nastroit' otchety po vashim trebovaniyam. Obratite vnimanie, chto imya proekta takzhe vyvoditsya v etom menyu. |to imya zatem dostupno dlya lyubyh funkcij, pomeshchennyh v dannoe menyu. PRIMERY 1. c,l,v |to pervyj nabor komand pri pervonachal'nom zapuske. Opciya c - punkt menyu dlya sozdaniya fajla proekta. Komanda l vyvodit spisok vseh imen fajlov proektov, a v prosmatrivaet ishodnye dannye, nahodyashchiesya v fajle proekta. 2. n,n Takaya posledovatel'nost' illyustriruet proverku na oshibki vnutri programmy. Snachala vklyuchaetsya podschet vremeni dlya tekushchego fajla pro- ekta, a zatem on vklyuchaetsya opyat'. Timelog raspoznaet eto i soobshchaet, chto vy dolzhny otklyuchit' podschet pered tem, kak snova vklyuchit' ego. 3. s,junk |ta posledovatel'nost' takzhe illyustriruet proverku oshibok. Pyta- emsya vybrat' novoe imya fajla proekta. Imya fajla junk (kotorogo vy ne imeete). Timelog proveryaet, sushchestvuet li fajl registracii vremeni s imenem junk. Esli net, vyvoditsya soobshchenie o tom, chto vy dolzhny vyb- rat' pravil'noe imya fajla proekta. POYASNENIYA V etom komandnom fajle mnogo teksta, no zamysel ne ochen' slozhen. Stroka 4 inicializiruet peremennuyu PROJ nulevym znacheniem. PROJ - eto peremennaya, kotoraya soderzhit imya proekta, otobrazhaemoe v menyu. V nachale raboty my dolzhny byt' uvereny, chto eta peremennaya ustanovlena v nul'. Stroki 6-104 - eto ogromnyj beskonechnyj cikl while, kotoryj vy- polnyaet rabotu vsej programmy. Poskol'ku eto beskonechnyj cikl, my mo- zhem vyjti iz nego libo operatorom break, (vvodya obychnye simvoly prery- vaniya), libo s pomoshch'yu komandy vyhoda. V stroke 8 pozicionnym parametram prisvaivaetsya rezul'tat komandy date. Postupaya takim obrazom, my mozhem zatem legko obrashchat'sya k kazhdo- mu polyu bez vydeleniya ego komandoj cut - shell vypolnyaet za nas sin- taksicheskij razbor polej. My mozhem ssylat'sya na polya daty v vide $1, $2 i t.d. Stroki 9-23 vyvodyat na ekran glavnoe menyu. Verhnyaya stroka obrashcha- etsya k dannym iz komandy date. $1, $2 i $3 predstavlyayut soboj den' ne- deli, mesyac i chislo. $4 - eto vremya. Pered tem kak komanda echo vyvo- dit tekstovye stroki, eti peremennye raskryvayutsya takim obrazom, chto oni poyavlyayutsya v menyu. Esli peremennaya PROJ ravna nulyu, to nichego ne pechataetsya v kachestve imeni tekushchego proekta. Simvoly \c v konce og- romnogo operatora echo ustanavlivayut kursor posle priglasheniya v etoj zhe stroke, tak chto my gotovy prinimat' vvodimye pol'zovatelem simvoly. Posle pechati menyu v peremennuyu RSP chitaetsya otvet v stroke 25. Zatem nastupaet chered ogromnogo operatora case (stroki 27-103), koto- ryj soderzhit vetku dlya kazhdoj komandy. V stroke 28 proveryaetsya, ne byl li otvet vsego lish' vozvratom ka- retki, ukazyvayushchim, chto pol'zovatel' hochet vyjti. Esli byl, to cikl while zavershaetsya posredstvom komandy break i programma zakanchivaet rabotu. Inogda vozvrat karetki - bolee zhelatel'nyj metod vyhoda, chem ko- manda exit interpretatora shell. V konechnom itoge eta komanda shell privodit k vypolneniyu programm exit i _exit Si -interfejsa. Vypolnenie vyzova exit v Si inogda privodit k neozhidannym pobochnym effektam, v to vremya kak normal'noe vypolnenie teksta programmy do konca ne daet ta- kih zhe rezul'tatov. Odnazhdy my stolknulis' s takoj problemoj pri ispol'zovanii ESC -posledovatel'nostej dlya izmeneniya cveta na cvetnom monitore. Kogda programma zavershalas' normal'no, cvet ne pereustanav- livalsya. Odnako kogda byl sdelan sistemnyj vyzov exit, pechatalis' ne- kotorye ESC-posledovatel'nosti, chto pereustanavlivalo otdel'nye chasti ekrana. Ochen' stranno! Stroki 29-38 upravlyayut funkciej vybora proekta. Imya proekta zap- rashivaetsya i chitaetsya v peremennuyu PROJ2. PROJ2 ispol'zovana dlya vre- mennogo hraneniya etogo znacheniya. Esli byl vveden vozvrat karetki, ope- rator continue privodit k sleduyushchej iteracii vneshnego cikla while. |to pozvolyaet pol'zovatelyu prekratit' vypolnenie etoj funkcii pri oshiboch- nom vvode, ostavayas' vse zhe v timelog. Esli vvod byl nepustym, fajl proekta proveryaetsya na sushchestvovanie i na nalichie v nem dannyh. Esli fajl ne sushchestvuet, pol'zovatelya prosyat ukazat' vernoe imya proekta. Esli imya fajla pravil'noe, to peremennoj PROJ prisvaivaetsya znachenie PROJ2. Tol'ko posle togo, kak komandnyj fajl s uverennost'yu znaet, chto imya, vvedennoe pol'zovatelem, dopustimo, ono naznachaetsya v kachestve tekushchego imeni proekta. |to predohranyaet ot poteri vybora tekushchego proekta iz-za oshibki pol'zovatelya. Teper' PROJ vyvoditsya v menyu na ek- ran. Komanda sozdaniya obrabatyvaetsya strokami 39-50. Snova zaprashiva- etsya imya i proveryaetsya, ne ravno li ono nulyu. Esli imya bylo vvedeno, to proveryaetsya, sushchestvuet li uzhe takoj fajl. My ne hotim snova sozda- vat' i zatirat' uzhe imeyushchijsya fajl. Fajl sozdaetsya v stroke 50. V etot fajl vyvodyatsya otmetka o vremeni ego inicializacii i nachal'noe soobshche- nie o tom, chto podschet vremeni otklyuchen. Opciya vyvoda spiska vypolnyaetsya v strokah 51-53. Vyvoditsya zago- lovok, a zatem komanda ls ispol'zuetsya dlya generacii spiska. Esli net fajlov nuzhnogo nam tipa, to komanda ls vozvrashchaet status, otlichnyj ot nulya, tem samym vklyuchaetsya operator ||. V sushchnosti etot fokus shell daet nam vstroennyj operator if-then, kotoryj mozhet ispol'zovat' re- zul'taty predydushchej komandy. Esli vypolnenie komandy ls neudachno (t.e. ne najdeny podhodyashchie fajly), eto soobshchenie ob oshibke otbrasyvaetsya (ne vyvoditsya) i vypolnyaetsya operator echo. Komanda echo soobshchaet, chto net fajlov, chtoby vy znali ob etom. Vsyakij vyhod komandy ls propuskaetsya cherez komandu sed dlya otb- rasyvaniya rasshireniya imeni fajla .time. Dlya sohraneniya mesta i dlya udobstva pol'zovatelya my hotim tol'ko posmotret' i napechatat' imena proektov, a ne imena fajlov. Odnako, my hotim hranit' imena fajlov v special'nom vnutrennem formate tak, chtoby my mogli proshche obrabatyvat' ih i podderzhivat' unikal'nye imena. Komanda prosmotra vypolnyaetsya v strokah 54-60. Tekushchij fajl pro- ekta proveryaetsya na to, bylo li vybrano imya. Esli net, glavnoe menyu vyvoditsya snova. V protivnom sluchae pechataetsya stroka iz chertochek, vy- voditsya komandoj more fajl proekta i pechataetsya eshche odna stroka cherto- chek dlya obramleniya vyvedennoj informacii. Vy mozhete udivit'sya, pochemu pervym simvolom operatora echo yavlyaetsya dvoetochie (:). |to nekotoryj kazus, poskol'ku, esli vy popytaetes' otobrazit' simvol chertochki (-) v kachestve pervogo simvola, to operator echo "podumaet", chto eto pustaya opciya i ne vyvedet ee na ekran. Vy prosto dolzhny postavit' v pervoj pozicii kakoj-to nepustoj simvol, otlichnyj ot chertochki. Vklyuchenie podscheta vremeni vypolnyaetsya v strokah 61-70. Tekushchee imya proekta proveryaetsya na to, bylo li ono vybrano. Esli da, to prove- ryaetsya, byl li otklyuchen fajl proekta. My vypolnyaem eto, ispol'zuya ko- mandu tail dlya vydeleniya poslednej stroki fajla, zatem peredaem po konvejeru etu stroku komande cut, gde my izmenyaem simvol-razdelitel' na simvol : i otrezaem pervoe pole. Esli v etom pole nahodyatsya simvoly OFF, vse v poryadke. Posle etogo stroka 69 vyvodit na ekran soobshchenie dlya pol'zovatelya, a stroka 70 vstavlyaet v fajl proekta stroku ON, za kotoroj sleduet tekushchaya data. Tem samym fajl otmechaetsya kak vklyuchen- nyj. Podschet vremeni nachalsya. Esli eta operaciya uzhe byla vklyuchena, my soobshchaem ob etom pol'zovatelyu i vyhodim iz dannoj operacii menyu. Stroki 71-80 obrabatyvayut otklyuchenie podscheta vremeni. Zdes' poch- ti vse identichno tekstu programmy, kotoryj vklyuchaet etu operaciyu, tol'ko esli tam bylo slovo "on", to zdes' slovo "off". Stroki 81-101 obrabatyvayut podchinennoe menyu vydachi otchetov i sta- tistiki. Kak vidite, ekrannoe menyu splanirovano takim zhe obrazom: cikl while, pechat' menyu, chtenie otveta, vypolnenie operatora case v zavisi- mosti ot vybrannoj komandy i t.d. Komanda r podobna glavnomu menyu, tol'ko sokrashchena dlya togo, chtoby pomestit'sya vnutri operatora case. Vy takzhe mozhete zametit', chto v strokah 96-99 vypolnyaetsya ne ochen' mnogo obrabotki. |to to mesto, gde vy dolzhny vypolnit' nekotoruyu rabotu. Stroka 102 vypolnyaet obrabotku oshibok pri lyubom nevernom vvode. Pechataetsya soobshchenie ob oshibke, operator case vyhodit na sleduyushchuyu iteraciyu cikla while, i vse nachinaetsya snachala. MODIFIKACII Osnovnoj vozmozhnost'yu dlya modifikacii yavlyaetsya dobavlenie fakti- cheskoj obrabotki informacii o vremeni. Odin iz podhodov k etomu - zap- rosit' pochasovoj tarif vremeni v moment sozdaniya fajla proekta (esli schitat', chto vy rabotaete na takih osnovaniyah). |tot tarif mozhet hra- nit'sya pervym punktom v fajle proekta. Sleduyushchie dve stroki mogut byt' otvedeny dlya "scheta po tekushchemu seansu" i "obshchego scheta" sootvetstven- no. Kogda podschet vremeni raboty nad proektom otklyuchaetsya, mozhno proa- nalizirovat' tekushchee sistemnoe vremya i nachal'noe vremya podscheta i za- tem pereschitat' v minuty (dlya uproshcheniya arifmetiki) s ispol'zovaniem komandy expr (ili, vozmozhno, awk). Zatem eto znachenie mozhno umnozhit' na hranimyj v fajle tarif vremeni, a rezul'tat sohranit' v zapisi o tekushchem seanse raboty i DOBAVITX k sovokupnoj obshchej zapisi. ----------------------------------------------------- IMYA: today ------------------------------------------------------ today Pechat' kalendarya s podsvechennoj segodnyashnej datoj NAZNACHENIE Modificiruet vyvod utility cal dlya pechati segodnyashnej daty in- versnym cvetom. FORMAT VYZOVA today PRIMER VYZOVA today Pechataet kalendar' na etot mesyac s podsvechennoj segodnyashnej datoj TEKST PROGRAMMY today 1 : 2 # @(#) today v1.0 Calendar with today highlighted Author: Russ Sage 2a Kalendar' s podsvetkoj segodnyashnego dnya 4 SYSV=n 6 set `date` 8 if [ "$SYSV" = "y" ] 9 then RVR=`tput smso` 10 BLNK=`tput blink` 11 NORM=`tput rmso` 12 cal ${2} ${6} | sed "s/${3}/${RVR}${BLNK}${3}${NORM} /g" -e "s/^/ /" 13 else RVR="^[[7m" # termcap so 14 NORM="^[[0m" # termcap se 15 cal ${2} ${6} | sed -e "s/ ${3}/ ${RVR}${3}${NORM} /" -e "s/^/ /" 16 fi PEREMENNYE SREDY VYPOLNENIYA RVR Upravlyayushchij simvol inversnogo otobrazheniya dlya vashego terminala BLNK Upravlyayushchij simvol mercaniya dlya vashego terminala, esli takovoj imeetsya NORM Upravlyayushchij simvol dlya vozvrata terminala v obychnyj rezhim OPISANIE ZACHEM NAM NUZHEN today? Vsegda priyatno imet' instrumental'nye sredstva, predostavlyayushchie nam informaciyu o nashej srede. Tip informacii, kotoryj my zdes' rassmatrivaem - eto modificirovannyj vyvod kalendarya. Standartnaya ko- manda cal vyvodit dni mesyaca, no ne soobshchaet vam, kakoj den' segodnya. Kak my eto uznaem? My dolzhny zapustit' komandu date dlya opredeleniya tekushchego dnya. Dovol'no trivial'naya zadacha, odnako nashe reshenie mozhet dat' nekotoruyu cennuyu grafiku, kotoraya mozhet dobavit' dejstvitel'no poleznuyu informaciyu k kalendaryu. Dlya vypolneniya takoj modifikacii nam neobhodimo vypolnit' postob- rabotku rezul'tata komandy cal. Poskol'ku ne vse terminaly obladayut odinakovymi vozmozhnostyami, eta programma dolzhna byt' prisposoblena k vashej mashine. CHTO DELAET today? Today - eto postprocessor dlya komandy cal, kotoryj delaet ee re- zul'tat bolee informativnym i graficheski naglyadnym. Vypolnenie modifi- kacii komandy cal zavisit ot togo, v kakoj sisteme vy rabotaete. Esli vy v sisteme UNIX System V (versiya 2 ili starshe), to u vas est' utili- ta terminfo. Terminfo yavlyaetsya zamenoj dlya fajla termcap i postavlya- etsya s neskol'kimi utilitami, kotorye vozvrashchayut znacheniya s informaci- ej o PRIEMY PROFESSIONALXNOJ RABOTY V UNIX nal'nyh harakteristik. Esli vash komp'yuter rabotaet ne s sistemoj System V, to vam neobhodimo nemnogo poissledovat' tip vashih konkretnyh terminalov i vnesti poluchennye znacheniya v vashu programmu. Vsya istoriya s utilitami termcap i terminfo illyustriruet evolyuciyu raboty v srede UNIX. UNIX s samyh pervyh dnej stremilsya byt' nezavisi- mym ot tipov ustrojstv. Pervym shagom yavilos' ispol'zovanie fajlov ust- rojstv i drajverov. Sleduyushchim shagom byl fajl termcap, kotoryj pre- dostavil edinoobraznyj sposob polucheniya informacii o terminalah. Poslednim etapom yavlyaetsya utilita terminfo, predostavlyayushchaya etu infor- maciyu takim sposobom, kotoryj luchshe obespechivaet funkcional'nyj dostup iz programm. Poskol'ku v predelah komandnogo fajla ne tak legko opredelit', s kakoj sistemoj rabotaet vash komp'yuter, ispol'zovana peremennaya SYSV. |tu peremennuyu mozhno izmenit' pri pomoshchi redaktora, poetomu today mo- zhet rabotat' v raznyh sistemah. Sposobami vyyasneniya sistemy mogli by sluzhit' programma uname, sushchestvovanie opredelennyh shell-programm v kataloge /bin ili kakoj-nibud' sistemnyj fajl, soderzhashchij nomer versii. Po umolchaniyu peremennaya SYSV ustanovlena tak, chtoby utilita today rabotala NE v sisteme System V. S etim svyazano sushchestvovanie fragmenta programmy, kotoryj nuzhno izmenyat' vruchnuyu. Kak vy mozhete samostoyatel'no poluchit' informaciyu o terminale? Kazhdyj terminal imeet svoi specificheskie osobennosti. Vse terminaly harakterizuyutsya v osnovnom fajlom opisaniya terminala termcap. V etom fajle kazhdaya harakteristika daetsya pod svoim imenem vmeste s apparat- nym kodom etoj funkcii. Takim obrazom, my mozhem, naprimer, redaktorom vi zaglyanut' v termcap i uvidet', kak upravlyat' terminalom, na kotorom my rabotaem. Fajl termcap sil'no zashifrovan i zagadochen. Po dannomu voprosu ne ochen' mnogo dokumentacii, chto porozhdaet mnozhestvo eksperi- mentov i oshibok. Peremennymi, kotorye nas interesuyut, yavlyayutsya "so" dlya vydeleniya informacii (inversnyj rezhim) i "se" dlya zaversheniya vydeleniya (obychnyj rezhim), a takzhe rezhim mercaniya, esli on est' u vashego terminala. Termcap, pohozhe, ne soderzhit informaciyu o tom, kak vklyuchit' rezhim mer- caniya, poetomu vam, veroyatno, nuzhno budet dlya etogo posmotret' doku- mentaciyu na terminal. V sisteme System V (versiya 2) komanda tput vozv- rashchaet sootvetstvuyushchee znachenie. Po umolchaniyu v today vypolneny ustanovki dlya ANSI terminala, yav- lyayushchegosya konsol'nym v sisteme XENIX. |ti kody byli vruchnuyu izvlecheny iz fajla /etc/termcap i vstavleny v tekst programmy. Esli vashi kody otlichayutsya, vy dolzhny vyyasnit' ih. Obratite vnimanie, chto v fajle /etc/termcap simvol ESCAPE predstavlen kak \E. |to ne goditsya dlya today, i vy dolzhny izmenit' takoe predstavlenie na nastoyashchij ESCAPE. Poskol'ku ESCAPE yavlyaetsya simvolom vyhoda iz rezhima vvoda v redaktore vi, vy dolzhny ispol'zovat' komandu control-V v etom redaktore dlya vvo- da upravlyayushchih simvolov. Posledovatel'nost' control-V vyzyvaet pechat' simvola ^, a ESCAPE - pechat' simvola [. Takim obrazom, real'naya koman- da vhoda v inversnyj rezhim v redaktore vi predstavlena posledovatel'- nost'yu ^[[7m. |ta komanda vklyuchaet simvoly ^[ v kachestve ESCAPE i za- tem obychnye simvoly [7m dlya izmeneniya rezhima. Teper', kogda harakteristiki terminala uchteny, cel' utility today - vydelit' tekushchij den' kalendarya v inversnom vide, a vse ostal'noe ostavit' v obychnom vide. |to delaetsya putem peredachi po konvejeru vy- hoda komandy cal komande sed. Utilita sed nahodit chislo v vyhodnyh dannyh i podstavlyaet special'nuyu graficheskuyu ESC-posledovatel'nost'. Poskol'ku vash terminal ispol'zuet special'nye simvoly dlya izmeneniya rezhima, vy ne uvidite ih vydachi na ekran. Dannaya programma ne imeet opcij ili kakogo-to osobogo vhoda. Ona raspechatyvaet kalendar' s otmechennym segodnyashnim dnem. POYASNENIYA V stroke 4 vypolnyaetsya inicializaciya peremennoj SYSV znacheniem "n". |to zastavlyaet programmu perehodit' k osoboj oblasti, v kotoroj zhestko zakodirovany upravlyayushchie kody terminala, opredelennye vruchnuyu. Esli vy rabotaete s poslednimi versiyami sistemy System V, to vam nuzh- no, chtoby eta peremennaya imela znachenie "y". V stroke 6 pozicionnym parametram prisvaivaetsya rezul'tat komandy date. My obratimsya k etim znacheniyam pozzhe. Stroki 8-16 - eto ostal'naya chast' programmy. Oni predstavlyayut so- boj odin operator if-then-else. Stroki 9-12 podderzhivayut prinyatyj v System V metod tput dlya polucheniya harakteristik terminala, a stroki 13-15 upravlyayut ruchnym sposobom ih polucheniya. V oboih sluchayah peremennym shell prisvaivayutsya ESC-posledovatel'- nosti. |ti znacheniya ispol'zuyutsya pozzhe. V oboih sluchayah vypolnyaetsya vyzov komandy cal s ispol'zovaniem znachenij mesyaca i goda, poluchennyh ot komandy date. |tot obraz kalendarya propuskaetsya po konvejeru cherez utilitu sed, kotoraya ishchet ukazannyj den' "segodnya", takzhe poluchennyj ot komandy date. Kogda etot den' najden, sed zamenyaet cifry dnya na posledovatel'nost' vklyucheniya inversnogo rezhima, posledovatel'nost' vklyucheniya rezhima mercaniya, esli on est', i simvoly dnya, a zatem posle- dovatel'nost' vozvrata v obychnyj rezhim raboty terminala. Poslednyaya ko- manda sed zapolnyaet probelami nachalo stroki dlya razmeshcheniya ee v centre ekrana. UPRAVLENIE DELOPROIZVODSTVOM Mnogo rabochego vremeni tratitsya na zapominanie vazhnoj informacii, takoj kak delovye vstrechi, adresa, nomera telefonov, raspisaniya, uchet- nye svedeniya o proektah i tak dalee. Bol'shinstvo iz takoj informacii mozhet byt' sohraneno v sisteme UNIX v vide prostyh strukturirovannyh tekstovyh fajlov, kotorymi mozhno manipulirovat' s pomoshch'yu sootvetstvu- yushchih sredstv. Avtomatizaciya etoj oblasti mozhet osvobodit' mnogo vreme- ni dlya vypolneniya "nastoyashchej" raboty. Hotya moshchnye kommercheskie programmy dlya sohraneniya takoj informa- cii imeyutsya v srede MS-DOS, eti programmy ne imeyut shirokogo rasprost- raneniya v UNIX. CHasto u vas net neobhodimosti v otdel'noj bol'shoj programme dlya vypolneniya takih rabot v UNIX. UNIX obespechivaet horoshij kompromiss mezhdu legkimi v primenenii, no ne gibkimi kommercheskimi programmami i programmirovaniem na moshchnyh, no neprostyh v ispol'zova- nii tradicionnyh yazykah programmirovaniya. Vozmozhnosti yazyka shell plyus bogatyj assortiment vstroennyh komand UNIX dayut moshchnyj, gibkij i SRAV- NITELXNO prostoj v ispol'zovanii kompromiss. V dannom razdele my predstavlyaem shirokij nabor sredstv upravleniya lichnoj informaciej, ko- torye vy mozhete prisposobit' dlya svoih nuzhd. Dlya shutki nachnem s programmy po imeni jargon - generatora tehni- cheskih terminov, konstruiruyushchego zamyslovatye frazy. S ego pomoshch'yu mozhno udivlyat' lyudej tem, kak mnogo vy znaete, ili nachat' pribyl'nuyu vtoruyu kar'eru v kachestve sostavitelya reklamy. Kombinirovanie slov po- rozhdaet sotni fraz. Zatem my rassmotrim programmu phone. Phone - eto komandnyj fajl, upravlyaemyj s pomoshch'yu menyu, kotoryj podderzhivaet bazu telefonnyh nome- rov i soputstvuyushchej informacii. Ona svodit voedino raznoobraznye aspekty soprovozhdeniya bazy dannyh i obsluzhivaniya zaprosov k nej. Poslednee instrumental'noe sredstvo nazyvaetsya office. |to uprav- lyaemaya pri pomoshchi menyu utilita, kotoraya daet odnoklavishnyj dostup ko vsem funkciyam deloproizvodstva. Syuda otnosyatsya pochta, novosti, kalen- dar', nomera telefonov i avtomaticheskie napominaniya. ------------------------------------------------------- IMYA: jargon ------------------------------------------------------- NAZNACHENIE Komp'yuterizovannaya versiya starogo nastol'nogo generatora tehni- cheskih terminov. FORMAT VYZOVA jargon PRIMER VYZOVA jargon Esli vvesti 125 v otvet na zapros, to na vyhode 125 poluchitsya fraza Total Monitored Concept TEKST PROGRAMMY jargon 1 : 2 # @(#) jargon v1.0 Technical jargon generator Author: Russ Sage 2a Generator tehnicheskogo zhargona 4 echo "\n\t\tThe Jargon Generator" 5 while : 6 do 7 echo "\nEnter a 3 digit number (000-999), ? , or : \c" 8 read NUM 10 case $NUM in 11 "") exit;; 12 \?) cat < /dev/ null || 27 { echo "\nNot a valid number, try again "; continue; };; 28 *) echo "\nInvalid input, try again" 29 continue;; 30 esac 32 N1=`echo $NUM|cut -c1` 33 N2=`echo $NUM|cut -c2` 34 N3=`echo $NUM|cut -c3` 35 SEN="" 37 case $N1 in 38 0) SEN="${SEN}Integrated ";; 39 1) SEN="${SEN}Total ";; 40 2) SEN="${SEN}Systematized ";; 41 3) SEN="${SEN}Parallel ";; 42 4) SEN="${SEN}Functional ";; 43 5) SEN="${SEN}Responsive ";; 44 6) SEN="${SEN}Optional ";; 45 7) SEN="${SEN}Synchronized ";; 46 8) SEN="${SEN}Compatible ";; 47 9) SEN="${SEN}Balanced ";; 48 esac 50 case $N2 in 51 0) SEN="${SEN}Management ";; 52 1) SEN="${SEN}Organizational ";; 53 2) SEN="${SEN}Monitored ";; 54 3) SEN="${SEN}Reciprocal ";; 55 4) SEN="${SEN}Digital ";; 56 5) SEN="${SEN}Logistical ";; 57 6) SEN="${SEN}Transitional ";; 58 7) SEN="${SEN}Incremental ";; 59 8) SEN="${SEN}Operational ";; 60 9) SEN="${SEN}Third-Generation ";; 61 esac 63 case $N3 in 64 0) SEN="${SEN}Options";; 65 1) SEN="${SEN}Flexibility";; 66 2) SEN="${SEN}Capability";; 67 3) SEN="${SEN}Mobility";; 68 4) SEN="${SEN}Programming";; 69 5) SEN="${SEN}Concept";; 70 6) SEN="${SEN}Time-Phase";; 71 7) SEN="${SEN}Projection";; 72 8) SEN="${SEN}Hardware";; 73 9) SEN="${SEN}Contingency";; 74 esac 76 echo "\n\"$SEN\"" 77 done PEREMENNYE SREDY VYPOLNENIYA N1 Pervaya cifra chisla N2 Vtoraya cifra chisla N3 Tret'ya cifra chisla NUM CHislo, vvedennoe pol'zovatelem s klaviatury SEN Predlozhenie, poluchennoe iz najdennyh slov OPISANIE ZACHEM NAM NUZHEN jargon? V nashem skorostnom, zapolnennom tehnikoj mire na nas okazyvaetsya bol'shoe davlenie s cel'yu polucheniya kakih-to rezul'tatov. K sozhaleniyu, bystrota sovremennoj tehniki otnositsya k vypolneniyu programm, a ne k ih sozdaniyu. Kogda my sdelali vsego lish' tret'yu chast' programmy, a uzhe pora ee pred®yavlyat' na rynok - kak my mozhem sozdat' vpechatlenie, chto nash produkt delaet bol'she, chem na samom dele? Neobhodimo nemnogo pustit' pyl' v glaza zakazchiku. Puskanie pyli sostoit iz fraz, kotorye vyglyadyat i zvuchat vpechatlyayushche. Pri strogoj proverke my mozhem uvidet', chto fraza sostavlena iz nastoyashchih anglijskih slov, znachenie kotoryh mozhno posmotret' v slovare. |ta fraza v celom sovershenno bessmyslenna, no esli nam povezet, to chitatel' etogo ne zametit! Odnim iz prostyh sposobov polucheniya takih veshchej yavlyaetsya nalichie tablicy vzaimozamenyaemyh slov, kotorye mozhno ispol'zovat' dlya sostav- leniya predlozhenij. Esli u vas sistema BSD, to vy mozhete zapustit' jargon vmeste s programmoj fortune, kotoraya imitiruet sluchajnye podar- ki sud'by. Mudrost' vekov mozhet prinadlezhat' vam! CHTO DELAET jargon? Jargon - eto instrument dlya generacii fraz, sostoyashchih iz tehni- cheskih terminov. Stroitsya fraza, kotoraya yavlyaetsya kombinaciej treh slov. Pervye dva slova yavlyayutsya prilagatel'nymi, ispol'zuemymi dlya opisaniya tret'ego slova, imeni sushchestvitel'nogo. Kazhdoe slovo vybira- etsya iz stolbca, soderzhashchego desyat' vozmozhnyh slov. Imenno eto pridaet programme jargon ee tvorcheskie sposobnosti. Ona mozhet ob®edinyat' slovo iz odnogo stolbca s lyubym slovom iz drugogo stolbca dlya postroeniya mnogih poleznyh fraz. Esli vy hotite uvidet' vsyu tablicu slov, vvedite simvol ?. Vot primer tablicy: ----------------------------- | | The Jargon Generator | | Enter a 3 digit number (000-999), ?, or : ? | | 0. Integrated 0. Management 0. Options | 1. Total 1. Organizational 1. Flexibility | 2. Systematized 2. Monitored 2. Capability | 3. Parallel 3. Reciprocal 3. Mobility | 4. Functional 4. Digital 4. Programming | 5. Responsive 5. Logistical 5. Concept | 6. Optional 6. Transitional 6. Time-Phase | 7. Synchronized 7. Incremental 7. Projection | 8. Compatible 8. Operational 8. Hardware | 9. Balanced 9. Third-Generation 9. Contingency | Imeetsya tri vozmozhnyh varianta vvoda. Vy mozhete vvesti trehznach- noe chislo, znak voprosa dlya pechati tablicy ili vozvrat karetki dlya vy- hoda iz programmy. Proveryaetsya, yavlyaetsya li stroka iz treh cifr do- pustimym chislom. Esli vse v poryadke, to vvedennoe chislo razbivaetsya na tri sostavlyayushchie ego cifry. Kazhdaya cifra ispol'zuetsya kak klyuch poiska v massive iz desyati slov dlya polucheniya kuska predlozheniya. Zatem vse slova ob®edinyayutsya dlya formirovaniya zhargonnoj frazy. Posle etogo vam vydaetsya zapros na dal'nejshij vvod. Esli vy vveli znak voprosa, pechataetsya tablica slov, kak pokazano v predydushchem primere, i vam snova vydaetsya zapros. Esli byl vveden tol'ko vozvrat karetki, to cikl, vydavavshij zaprosy, zavershaetsya i za- kanchivaetsya vypolnenie programmy. Vnutri samoj programmy vypolnyaetsya tol'ko proverka na oshibki. Programma jargon organizovana analogichno programme, upravlyaemoj s po- moshch'yu menyu, odnako nikakogo menyu net. |to prosto cikl, kotoryj vypol- nyaetsya do teh por, poka ne budet nazhat vozvrat karetki. PRIMERY 1. $ jargon 898 Otkryvaetsya sekret, chto u menya personal'nyj komp'yuter 898, to est' Compatible Third-Generation Hardware (sovmestimaya apparatura tret'ego pokoleniya). 2. $ jargon 187 Okazyvaetsya eto Total Operational Projection (vseob®emlyushchij raz- rabatyvaemyj proekt). POYASNENIYA Stroka 4 pechataet zagolovok pri nachal'nom zapuske programmy. Otobrazhaetsya vozvrat karetki, dve tabulyacii i soobshchenie. Stroki 5-77 predstavlyayut soboj odin bol'shoj beskonechnyj cikl while. V nem imeetsya vsego odna tochka vyhoda, nahodyashchayasya vnutri ope- ratora case. Stroka 7 vyvodit priglashenie, a stroka 8 chitaet vvodimyj otvet v peremennuyu NUM. Stroki 10-30 yavlyayutsya operatorom case, kotoryj proveryaet informa- ciyu, vvedennuyu s klaviatury. Esli byl vveden tol'ko vozvrat karetki, stroka 11 rassmatrivaet eto kak nulevoj vvod. V etom sluchae vypolnya- etsya vyhod iz programmy. |to i est' normal'naya tochka vyhoda. Vvod voprositel'nogo znaka sootvetstvuet stroke 12. Obratite vni- manie, chto znak voprosa ekranirovan. |to vypolneno po toj prichine, chto simvol ? imeet dlya shell special'noe znachenie. On ispol'zuetsya kak predstavitel' lyubogo odinochnogo simvola pri porozhdenii imeni fajla. Dlya togo, chtoby sdelat' znak voprosa obychnym simvolom, my dolzhny ekra- nirovat' ego dlya otmeny special'nogo znacheniya. V strokah 12-24 komanda cat poluchaet tekst iz posleduyushchego frag- menta samoj programmy. Takogo roda fajl inogda nazyvayut "vstroennym dokumentom". Vozmozhnost' obrabotki vstroennogo dokumenta aktiviruetsya posledovatel'nost'yu simvolov <<. Slovo, kotoroe sleduet za nej, yavlya- etsya priznakom nachala-okonchaniya, v dannom sluchae EOF. Posle togo, kak tekst budet vyveden na ekran, stroka 25 prodolzhaet vypolnenie sleduyu- shchej iteracii vneshnego cikla while. Poputno otmetim: dlya togo, chtoby uvidet', kak shell upravlyaet vstroennymi dokumentamm, posmotrite vo vremya raboty komandnogo fajla katalog /tmp. V nem nahoditsya fajl s imenem "shXXXX", gde XXXX - iden- tifikator shell, sozdavshego etot fajl. Ves' vstroennyj dokument celi- kom pomeshchaetsya v etot vremennyj fajl. Zatem shell vypolnyaet peread- resaciyu svoego vhoda na etot vremennyj fajl. Dovol'no prostoj metod. Stroka 26 sootvetstvuet vsem sluchayam vvoda, kogda imeetsya tri simvola. |ti simvoly mogut byt' bukvami i/ili ciframi. V etom meste shell eshche ne znaet, est' li tam bukvy. Dlya proverki togo, chto vse vve- dennye simvoly yavlyayutsya ciframi, my dolzhny ispol'zovat' komandu expr, vypolnyayushchuyu dopolnitel'nyj analiz. Operator expr ukazyvaet, chto nuzhno sravnit' stroku NUM s posledovatel'nost'yu "nachalo stroki, cifra, cif- ra, cifra, konec stroki". Esli sopostavlenie uspeshno, expr vozvrashchaet status uspeshnogo vozvrata i programma idet dal'she. Poskol'ku expr vozvrashchaet chislo sovpavshih simvolov, etot rezul'tat dolzhen byt' pere- napravlen v katalog /dev/null. Esli sravnenie zavershilos' neudachej, aktiviziruetsya operator || (my uzhe videli takogo roda upravlyayushchuyu strukturu ranee), kotoryj pecha- taet soobshchenie ob oshibke i vyzyvaet sleduyushchuyu iteraciyu cikla while. Takoj sintaksis predstavlyaet soboj to zhe samoe, chto i operator if-then-else. Poskol'ku za simvolami || mozhet sledovat' spisok komand, to vnutr' prostyh razdelitelej spiska {} mozhno vstavit' bolee odnoj komandy. Bud'te vnimatel'ny. Esli otsutstvuyut simvoly-razdeliteli, to operator continue vypolnitsya kak posle soobshcheniya ob oshibke, TAK I pri uspeshnom vypolnenii komandy expr. |to mozhet zastavit' vas zanimat'sya otladkoj, poka vy ne obnaruzhite, chto zhe proizoshlo na samom dele. Tochno takuyu zhe proverku chisla mozhno bylo by vypolnit' s pomoshch'yu operatora case. Sintaksis byl by takim zhe, za isklyucheniem zacepochnyh simvolov ^ i $. SHablon dlya operatora case vyglyadel by tak: [0-9][0-9][0-9] statement;; YA ispol'zoval operator expr dlya togo, chtoby pokazat', kakim obra- zom expr mozhet byt' ispol'zovan dlya vypolneniya takogo roda proverki. Lyuboj drugoj vvod perehvatyvaetsya v stroke 28 putem proverki na sovpadenie s universal'nym simvolom-zamenitelem *. Vyvoditsya soobshchenie ob oshibke, i operator continue vyzyvaet sleduyushchuyu iteraciyu cikla while, kotoryj zaprashivaet novyj vvod. Obratite vnimanie, kak shell rassmatrivaet stroki. Komanda test fakticheski vypolnyaet sravnenie znacheniya stroki. Nesmotrya na to, chto komande test(1) posvyashchena svoya stranica spravochnogo rukovodstva, ona yavlyaetsya vstroennoj funkciej shell. Esli pri vyzove komandy test ispol'zovan sintaksis =, !=, to dva argumenta rassmatrivayutsya kak stroki. No esli v komande test ispol'zuetsya sintaksis vida -lt, -eq, to proizvoditsya sravnenie dvuh argumentov-strok kak chisel i vypolnya- etsya ih chislovaya obrabotka. |ti dva razlichnyh rezhima nel'zya smeshivat', t.e. nel'zya sravnivat' stroki pri pomoshchi chislovogo operatora, naprimer str1 -eq str2. V strokah 32-34 kazhdaya cifra vyrezaetsya iz chisla i pomeshchaetsya v svoyu sobstvennuyu peremennuyu. Zatem eti peremennye ispol'zuyutsya v ka- chestve indeksa v operatore case, kotoryj soderzhit magicheskie slova. Stroka 35 inicializiruet peremennuyu SEN dlya sbora predlozheniya. (Pred- varitel'noe zamechanie pered tem, kak my nachnem poluchat' pis'ma ot rev- nitelej chistoty grammatiki - da, my znaem, chto to, chto my generiruem, yavlyaetsya frazoj, a ne nastoyashchim predlozheniem, poskol'ku otsutstvuet glagol.) Nachinaem my s pustogo predlozheniya i dobavlyaem k nemu kazhdyj raz po odnomu slovu. Stroki 37-48 predstavlyayut soboj pervyj operator case. Operator case beret znachenie peremennoj N1 i dobavlyaet slovo s takim nomerom k predlozheniyu. Na samom dele net neobhodimosti vklyuchat' znachenie pere- mennoj SEN v pravuyu chast' prisvaivaniya, poskol'ku eshche nichego net. Od- nako eto delaet tekst programmy bolee gibkim, esli my reshim predvari- tel'no sgenerirovat' pervonachal'noe predlozhenie nekotorymi drugimi sredstvami. Analogichnye operatory case obrabatyvayut dve sleduyushchie cif- ry. Poluchennoe predlozhenie vyvoditsya v stroke 76 posle togo, kak naj- deny vse slova. Vy mogli by skazat', chto vsya eta shtuka predstavlyaet soboj 754 podvig, ili Synchronized Logistical Programming (Sinhronizi- rovannoe logicheskoe programmirovanie). MODIFIKACII Mozhno nemnogo poigrat'sya s etoj programmoj. Vy mogli by poluchat' sluchajnoe chislo, zavisyashchee ot tekushchego sistemnogo vremeni (ispol'zuya izvlechenie i komandu expr