K57

EKSKURSIOON BOTANIKAAEDA*0
--------------------------

*0) viib läbi botaanik (nohik)

..kui liikuda edasi Taylori radu pidi, siis kohtume awk 'd kohe pärast sed 'i. Awk oli mitu korda ümber kirjutatud ning seda tehti aina keerulisemaks: mawk, nawk, gawk. Siis oli välja ilmunud Perl, mis on juba väga nutikas, kuid selle eest saab sellega teha kõike, mida varem kirjutati tr, sed, awk abil. Kasutan seda tänuga Unicode'i (Mutf8::all), hoolega läbikammitud regulaaravaldiste pärast, ning kõige selle eest mis kõike neid ühendab: lakoonilisus (kood on uskumatult lühike võrreldes Windowsi ajastu keeltereaga).

Algne tr ei toeta Unicode'i, olemas on Heirloom (2015), FreeBSD (v.10+) ning Linux CoreUtilsi arenguplaan (aastaks 2099+, kogu plaan aga meenutab kosmoselaeva piloodi dialoogi galaktikavahelise prostituudiga:)

  - I supported unification.
  - Did ya?
  - Well, I don't suppose you're the only whore that did.

  Firefly, 2012, s01e08, 00:28:40

Kuid jah, mis teeb koodi nii lühikeseks? See on nagu võõrkeele õppimine. Jada 0, 1 -> tähed -> sõnad -> fraasid -> .. "на смерть поэта"*1 on absoluutselt mittetöötav. Olles sellega umbes 100 aastat silmitsi seisnud, kõik hakkasid mustrite abil (terved kõne- või koodifragmendid) neuraalvõrke (neural network, nii aju kui ka masinintellekt) koolitama.
------
* 1) M. Lermontov, minu arvates geniaalselt kirjutatud.

Mustritega on keerulisem kirjutada, märksõnaks on siin "trenn", vaata siit:

  https://www.youtube.com/watch?v=z410eauCnHc
  https://github.com/Zulko/pianoputer  Python

Lisaks on üks hea "mõtle mustritega" teemaline mäng: DOS opsüsteemiile mõeldud (1989) algses mängus oli tegelikult "out of control" mustrite komplekt, mille pärast see mulle tuligi meelde.

  https://www.dosbox.com/
  https://www.myabandonware.com/game/blockout-ly#download.
  
Kuid on ka javascripti kloon, vajaliku taset (laiendatud) valitakse combo's (BlockSet: Basic, FlatFun, *EXTENDED*):

  https://www.youtube.com/watch?v=Wo2b4--pI60
  https://github.com/yongchaofan/jsBlockout

  git clone https://github.com/yongchaofan/jsBlockout

mängida brauseris (mängu alustamiseks klõpsake klaasile),

Noh ja, ma armusin Awk'sse mitte ainult probleemi lahenduse lühiduse pärast, vaid ka õpiku lühiduse tõttu (35 lehekülge, proovisin seda teie jaoks google abil eesti keelde tõlkida, kuid see tõlge osutus nii vastikuks, et ei suuda seda kätega parandada). Ja kas siis laiskusest kirjutada õpetust nullist või vastumeelsusest teid sinna minevikku lohistada (https://elmar.elu24.ee/6480052/kuuskummend-viis), otsustasin nii: kes on huvitatud -- lugege originaali (lisatud), kes mitte -- õpime koos powerhelli, rust 'i, .. microsoft smallbasic'ut:).. -- Ma küll ei saa moetrendidest nooremaks, võib olla virtuaalselt .. Lugesin kuidas 90-aastane proua teismelisena Second Life'is 5 aastat edukalt esines*2.
------
*2) https://secondlife.fandom.com/wiki/Main_Page


# Eriti olulised "mustrid"
-------------------------

  0. Tekstifaili mõiste. rida tähenduses "line" (alates ^ kuni $) aga mitte "string". Mitme realine rida:) ehk multiline string. 
  
  1. Väljad nagu sõnade vahelised osad reas:
  
      nagu [ \t], kuid mitte nagu [ \t\r\n\f]
        {"space", "tab", "carriage return", "new line", "form feed"}
      
  2. Tekstifaili töötlemise skeem -
  
      BEGIN {} 
      {} # LOOP
      END {}
      
  3. "Väga globaalsed" konstandid (skriptist väljastpoolt saadud andmed)
       ARGC ARGV FILENAME NR FNR NF $0 $1..$9
      
  4. Ümberlülitamised. a) väga ajutised (ainult siin ja praegu),
     Toon näite sh-kujul, mis on samuti eriti kasulik "pattern":
  
       while read -r line; do echo "$line"; done < file.txt
       
     ning b) ajutised (skripti täitmise ajal või kuni selgesõnalise
     tühistamiseni. Algses tekstis on neid viis*5: FS OFS RS ORS OFMT,
     veel on ARGC ARGV FILENAME NR FNR NF, nende väärtust awk paneb ise
     paika.
       
     Roostepõlvkond (Rust-generation) valib "väga ajutise", kuna on lihtne unustada, et midagi oli muudetud, ja kuna peate ise kirjutama stack'i (pinumälu, paraku oma kätega või tuleb kohe kasutada Perli*7):
     
        push($FS,@stack); FS='\n';
        ..
        $FS=pop(@stack) *6 *7.

------
*4) Владимир Маслов. Введение в Perl.

  http://lib.ru/PERL/russperl5/perl.txt

*5) Awk -- A Pattern Scanning and Processing Language Programmer's Manual. Alfred V. Aho. Brian W. Kernighan. Peter J. Weinberger. September 30, 2015

  http://doc.cat-v.org/unix/v8/awktut.pdf
        
*6) Stacks are wonderful..

  http://www.troubleshooters.com/codecorn/awk/index.htm
      
*7) Perl | Arrays (push, pop, shift, unshift)

  https://www.geeksforgeeks.org/perl-arrays-push-pop-shift-unshift/

Näide
```
  $ echo -e '\n' | perl -ne '
  BEGIN { push(@a,123); } 
  END { print pop(@a), "\n";}'
```
  123

veel näide
```
  $ echo -e 'one\ntwo\nthree' | \
    perl -pe 'BEGIN {print "v\n";} {;} END {print "^\n";}'
```
või
```
  $ echo -e 'one\ntwo\nthree' | \
    perl -ne 'BEGIN {print "v\n";} {print;} END {print "^\n";}'
```
  v
  one
  two
  three
  ^


# Idioomid, paradigmad, maailma eeter ja maailmaruumi kumerus
-------------------------------------------------------------

Kõige keerulisemaid "pattern" 'e või mõttemustreid (siin tõlge “muster” toimib nii nagu peaks) nimetatakse paradigmadeks. Nad on nii suured, et selle nimel kirjutatakse või vähemalt õpitakse uusi keeli. "Nendest" peate saama seda kasutada (aga muidu juhtub mis?):

  positsioonilised ja nimetatud parameetrid.
  vaikeväärtused (argumendi väärtused (avar = 0), muutujate nimed ($_))
  '' "" `` (literaal, asenda väärtused, arvuta*9*10)
  signatuurid, funktsioonide ja operaatorite overloading.
  ahne või laiskus (greedy või lazy modifikaatorid, lazy evaluation)
  makrod ja inline- funktsioonid
  sulgurid ja lambdafunktsioonid (closures and lambdas)
  nimeruum (namespace, kõik mõisted toimivad ainult kontekstis)
  scalar and list content (perl)
  muutuja lugemine või kirjutamine (X=$V, kuid V=1, *sh keelte pere)
  andmetüübid (skalaar, array/queue/stack, tuple, list, hash, tree)
  vigade käsitlemine funktsioonist tagastamisega (return ERR_CODE)
  vigade käsitlemine "OnError" sektsioonis
  vigade käsitlemine erandite abil (try catch throw)
  objektorienteeritud programmeerimine
    (klass ja objekt, pärilus kapseldamine polümorfism)
  aspektid ja üldine programmeerimine (stl, generics)
  smart pointers, references, garbage collection)
  RAII (ressursside hankimine on initsialiseerimine)
  nähtavus, eluiga, omand, laenuvõtmine ja traitid*11

nagu näha, botaaniku jaoks tõeline paradiis.
------
* 9) expr on arhailine. kasuta $(())

  https://unix.stackexchange.com/questions/286209/using-expr

* 10) "Esiteks interpoleeritakse stringi ja käivitatakse seejärel süsteemikäsuna." -- Kas sa arvad, et me räägime siin interpoleerimisest? Üldse mitte, kuid raamatu*4 piires selle sõna tähendus ei muutu, st.: kui rida sisaldab ülesannet lugeda muutujate väärtusi ($var), siis seda ka tehakse. Näide (sh keeles):

  $ DDD="date"
  $ echo `$DDD`
  Sun May 3 12:48:22 EEST 2020

*11) Understanding Rust: ownership, borrowing, lifetimes

  https://medium.com/@bugaevc
    /understanding-rust-ownership-borrowing-lifetimes-ff9ee9f79a9c


Harjutused (Alpine)
-------------------

Your reply should contain:

   script source in UTF8 text format
   script output in UTF8 text format

1. Using /etc/password, show users who use real shell to login (ash, sh, bash, csh, ksh, zsh..)

command:

  # script1
  
output:

  root      /bin/ash
  opilane   /bin/bash
  
2. Using /etc/group, show users who belong to more than one group.

command:

  # script2
  
output:

  root     adm,bin,daemon,root,sys,..
  ..
  opilane  abuild,opilane

3. Using /etc/shadow, show users who must login with password

command:

  # script3
  
output:

  root
  opilane

4. Using /etc/shadow, explain (decrypt) record for apache user

command:

  $ script4 apache
  apache:!:18380:0:99999:7:::
  
output:

  Username : ???
  Password : ??? 
  Lastchanged : ??? 
  Minimum : ???
  Maximum : ???
  Warn : ???
  Inactive : ???
  Expire : ???