Programų kūrimo metodologija. Šis kursas galėtų būti prerekvizitas tiems kursams, kuriuose praktikos darbų metu studentai turi parašyti savo programas ar skriptus ir jas pritaikyti. Kursas dėstomas naudojant Linux kaip demonstracinę terpę (sistemą), ir studentai tuo pačiu įgys elementarios patirties dirbdami su šia sistema, bet išdėstyti principai bus pritaikomi bet kokioms operacinėms sistemoms, kalboms ar aplinkoms. Prerekvizitas – turėti patirtį rašant paprastas programas ir dirbant su kompiuteriais kokioje nors OS; žinoti kompiuterių architektūros pagrindus; žinoti bent vieną procedūrinę programavimo kalbą. Kurso turinys 1.Unix(R) istorija, dabartis ir paplitimas, architektūros principai (viena programa == viena funkcija, programų kompozicija, minimalus funkcionalumas branduolyje), šiuolaikinės Unix tipo sistemos: Linux, *BSD, Solaris, ... Laisvos/Atviro kodo ir nuosavybinės sistemos. Unix įtaka paplitusioms šiuolaikinėms sistemoms (MacOS X, DOS/Windows). Darbas Unix sistemoje: terminalas, prisistatymas (login), darbo pabaiga (logout). Geri slaptažodžiai. Komandų/komandinė eilutė (command line), pakvietimas (prompt), komandų interpretatorius (shell). Komanda ≡ programa. Komanda whoami. Komandų argumentai – failų vardai ir neprivalomi parametrai (options). Parametrų sintaksė, istoriniai variantai. Procesai. Komandų ir procesų sąveika: STDIN, STDOUT, jų nukreipimas, konvejeriai (Unix pipes). *x tipo sistemų trūkumai. 2. Komanda iš vidaus: komandos skeleto vavyzdys C ir Perl kalba. Unix failų sistema. Medis, šaknis, keliai (paths), absoliutūs ir santykiniai keliai. Failų vardai. Specialūs failų vardai: "/", ".", "..". Teksto apdorojimo komandos: echo, cat, tac, head, tail, sort, more, less, diff, cmp, comm. Jų komponavimas į konvejerius ir duomenų nukreipimas į failus bei iš jų. Failų sistemos komandos: cp, mv, rm, mkdir, rmdir, cd, ls, opushd, popd. Komandų aprašymai: --help parametras ir man komanda. (GNU info). Komandos anatomija: *x komandos pavyzdys C, Perl kalba. Komandų paieška: kelias PATH, shell aplinkos kintamieji (environment variables). 3. Specialūs komandų interpretatoriaus sh (shell) simboliai ("*", "?") ir jų išplėtimas. "Keisti" failų vardai ("-", " ", "...", vardai su tarpais ir kabutėmis, vardai su specialiaisiais interpretatoriaus sh simboliais) ir darbas su jais. Patogus darbas komandinėje eilutėje: Tabuliacijų išplėtimas, sutrumpinimai (~, ~name), istorija, sinonimai (alias). Gerai žinomi sinonimai (well-known aliases). Atsargumas su rm, cp ir mv komandomis. Teksto redaktoriai: ed, vi, nano, nedit (Nirvana editor), emacs. Komanda which. Komanda locate. Komanda find. Simbolinės nuorodos (symbolic links), komandos ln, cp -a, cp -r. Naudotojų teisės. Priėjimo prie failų teisės (file access rights). Vykdymo teisės. Vartotojų grupės. Komanda chmod. Unix ir tinklas: ssh, telnet, scp, rcp, rsync, wget/wput, ... Komandos find, xargs. Rekomendacijos patogiam darbų ir projektų organizavimui. 4.Filtrai. Komandos grep, tr, cut, paste. "Miniatiūrinės" programavimo kalbos filtrams: sed, awk, perl. Komandų interpretatorius sh (shell) – eilinė Unix programa. Interpretatoriaus skriptai (scenarijai, angl. scripts). 5.Interpretatorius – eilučių pakeitimo kalba (string substitution language) ir jos ypatybės. Savo skriptų ir mažų programų kūrimas. Aplinkos kintamieji (environmentvariables). Intrepretatoriaus sh programavimo kalba: kintamieji, parametrai, valdymo operatoriai (if, while, for, case, test, goto). Unix kaip programavimo aplinka: Programų rašymo apžvalga (priminimui): mašinos kodai, autokodai, asembleriai, makroprocesoriai, aukšto lygio programavimo kalbos. 6. Bendras programos kūrimo darbo ciklas: edit-compile-link-(test)-run. Šiuolaikinių interpretuojamų kalbų darbo ciklas: edit-compile+test-run. Kompiliatoriai (cc, gcc, g++, tcc, javac, g77, gfortran, ada, chill, fpc, ....), programų kompiliavimas ir surinkimas (compiling and linking), surinkimo valdymas: make, ant, Perl ir Python Makefiles. Programų automatinis konfigūravimas su automake ir autoconfigure. GNU Make kintamieji ir funkcijos. Make kalba. Aplinkos sukūrimas naudojant GNU Make. Integruotos terpės (Eclipse, Anjuta). IDE palyginimas su komandinės eilutės įrankiais. Elementarūs make-failai, taisyklės (rules), komandos, tikslai (targets), gerai žinomi tikslai (well-known targets). Savo programų kūrimas, diegimas, naudojimas. 7.Versijų kontrolė – kas tai yra, kam ji reikalinga. Versijų kontrolės sistemų ir programinės įrangos (PĮ) kūrimo procesų variantai: paskirstytas ir centralizuotas PĮ kūrimas ir versionavimas. Centralizuotos versijų kontrolės sistemos: RCS, Subversion, CVS. Paskirstytos (distributed) versijų kontrolės sistemos: BazaarNG (bzr), monotone, mercurial, opencm, git, arch. Komandos darbas su versijų kontrolės sistema Subversion: revizijos ir versijos, atsikėlimas (checkout), pakeitimų įkėlimas (checkin), suliejimas (merging), užraktai (locking), konfliktai (conflicts) ir jų sprendimas. Žurnaliniai įrašai (log records). Senų versijų atsikėlimas ir analizė, skirtumai (diff, annotate), senų ir mišrių revizijų surinkimas, paleidimas ir testavimas. 8.Unix administravimo pradmenys: sistemos administratorius root. Programų diegimas/pašalinimas (apt-get, emerge, rpm, yum, BSD ports). Naudotojų sukūrimas, pašalinimas, administravimas. Komandos useradd, userdel, usermod, chsh, chown, chgrp. Direktorija /etc. Saugumo abėcėlė. 9.Programų testavimas – kam jis reikalingas, ką jis duoda ir ko ne. Apskritai, kodėl testavimas veikia. Automatinis testų valdymas Make programa. Regresijos testai. Modulių testai, arba vienetiniai testai (unit tests), testavimo serveriai. Ekstremalus programavimas (XP, extreme programming); kūrimas, paremtas testais (test driven development). Testų padengtis (test coverage). Testavimo privalumai, trūkumai, galimybės ir galimybių ribos. 10.Masinių uždavinių sprendimas: shell wildcards (pakartojimui), komandos 'find', 'xargs', 'for i in ...', 'seq'; 'while' ir 'while read line < file'. Make su funkcijomis 'wildcard'. 11.Programų kūrimo organizavimo būdai, naudojant versijų kontrolės sistemas. Kamienas (trunk), šakos (branches). Darbas kamiene, darbas individualiose šakose. Šakų suliejimas su kamienu (branch merging). Suliejimo ir surinkimo organizavimo būdai: surinkimo eilė (merge queue), surinkimo serveris (merge server), programos surinkėjas (merge lieutenant/officer), pakeitimų išrankiojimas (cherry-picking). Suliejimų sekimas (merge tracking). 12.Programos laidų ciklo (release cycle) organizavimas, naudojant versijų kontrolės sistemas: versijos (versions), žymės (tags). 13.Programų formalus specifikavimas ir teisingumo įrodymas. Pradinės sąlygos (preconditions), pabaigos sąlygos (postconditions), invariantai (invariants). Formalūs (automatizuoti) įrodymai. Projektavimas, paremtas kontraktais, Eifelio programavimo kalboje (design by contract, Eiffel programming language). Formalių metodų privalumai, trūkumai, galimybės ir ribos. Susipažinimas su Z-notacija, Vienos mokykla. 14.Programų optimizavimas ir profiliavimas. 20/80 našumo taisyklė. Profiliavimo įrankiai: gprof/gmon. 15.Moksliniai (bioinformatiniai) skaičiavimai ir galimybė juos valdyti make-tipo sistemomis. Pradiniai failai, algoritmai, parametrai, rezultatų failai. Apibendrintas skaičiavimo procesas ir jo valdymas make pagalba. Integravimas su vizualiomis (visual, windows based) sistemomis. 16. *x ir tinklas: ssh, scp, rsync, wget/curl, links/lynks.