Programovací jazyk TCL (20)

29. 11. 2005
Doba čtení: 9 minut

Sdílet

V závěrečném pokračování seriálu o programovacím jazyku Tcl si řekneme základní informace o rozsáhlé knihovně Tcllib, která obsahuje velké množství modulů usnadňujících každodenní programátorskou práci. Také si ukážeme použití knihovny Snack, jež slouží pro práci se zvukem (přehrávání, mixování apod.) a také k ovládání zvukových zařízení.

Obsah

1. Knihovna Tcllib
2. Rutiny pro kódování a dekódování dat, práce se souborovými formáty
3. Komunikační protokoly
4. Matematické funkce a operace
5. Knihovna Snack
6. Práce se zvukovými zařízeními
7. Nahrávání a přehrávání zvuků
8. Mixování

1. Knihovna Tcllib

Knihovna Tcllib se skládá z poměrně velkého množství modulů, které při správném použití usnadňují tvorbu různě orientovaných aplikací. Jedná se například o moduly řešící kódování a dekódování dat, moduly pro načítání a ukládání dat do různých souborových formátů, implementaci komunikačních protokolů (postavených nad rodinou protokolů TCP/IP), pokročilé matematické funkce apod. Některé z těchto modulů si popíšeme v následujících třech kapitolách.

2. Rutiny pro kódování a dekódování dat, práce se souborovými formáty

Základy práce se soubory pomocí interních funkcí Tcl jsme si ukázali ve čtvrtém pokračování tohoto seriálu – zde popsané funkce (open, close, read, gets, puts a format) by sice pro běžnou práci měly dostačovat, v praxi se však setkáváme s nutností kódování a dekódování dat a práci se standardními i nestandardními souborovými formáty. Proto jsou v Tcllib dostupné i moduly, které se soubory pracují na „vyšší úrovni“ (tvoří nad základními funkcemi z Tcl další vrstvu).

base64

Modul base64 slouží ke kódování textových i binárních dat do řetězce, který obsahuje pouze 64 tisknutelných znaků kódu ASCII (viz RFC 1341). Je možná i zpětná konverze řetězce uloženého v tomto kódování na binární data. Tento modul je možné využít například při zpracování e-mailových zpráv, které jsou při přenosu kódovány právě podle base64. Převod do base64 se provede příkazem:

package require base64
base64::encode parametry data 

Zpětný převod zajistí příkaz:

package require base64
base64::decode řetězec 

Všimněte si, že se před jménem obou příkazů nachází řetězec base64::. Tento řetězec je možné chápat jako jméno třídy, ze které voláme její statické metody encode a decode (místo „tečkové“ notace se zde používá „čtyřtečková notace“).

uuencode

Modul uuencode je v mnohém podobný předchozímu modulu. I zde se převádí binární data na textovou podobu, zde však metodou, která je kompatibilní s utilitami uuencode a uudecode. V tomto modulu jsou dostupné metody:

package require uuencode
uuencode::encode
uuencode::decode 

s podobným významem jako v předchozím modulu. Kromě textových dat je možné pracovat i přímo se soubory.

csv

Tento modul slouží k práci se soubory uloženými ve formátu CSV – Comma Separated Values. V tomto formátu se pro účely přenosu ukládají jak tabulky z databází, tak i údaje z tabulkových procesorů (alternativou jsou například soubory, kde jsou položky odděleny tabulátory). Modul csv nabízí použití jak standardního CSV formátu, tak i formátu používaného Microsoftími produkty. Rozdíl mezi těmito formáty spočívá v odlišné interpretaci dvou znaků "" – v jednom případě se jedná o řetězec obsahující pouze jednu uvozovku, ve druhém případě o prázdný řetězec.

asn

Pomocí modulu asn je možné pracovat se strukturovanými daty uloženými v binární podobě podle standardu ASN.1 – Abstract Syntax Notation. Bližší informace o tomto formátu jsou uvedeny například v článku Analogie ASN.1. Modul asn obsahuje metody pro získání hodnot základních i rozšířených datových typů: řetězců, celočíselných hodnot, pravdivostních hodnot apod.

html

Tento modul obsahuje značné množství metod, které slouží ke generování značek v HTML formátu. Místo programového vytváření HTML kódu je tak možný i deklarativní způsob zápisu stránky. Kromě metod tvořících značky pro základní formátování je možné vytvářet i tabulky (z polí či seznamů) a formuláře.

htmlparse

Modul htmlparse zpracovává řetězec, který by měl být ve formátu shodném s HTML. V tomto řetězci jsou postupně hledány značky HTML a pro každou značku je zavolán uživatelem specifikovaný příkaz. Parser dále automaticky rozpozná (a z dalšího zpracování vynechá) úvodní deklaraci „DOCTYPE“ a poznámky zapsané pomocí HTML značek.

inifile

Tento modul slouží k práci se soubory ini, které jsou používány v mnoha aplikacích (nejenom) na platformě Microsoft Windows. V těchto jednoduše strukturovaných souborech se nachází pojmenované sekce a v každé sekci neomezený počet párů „jméno=hodnota“. Údaje je možné jak číst, tak i zapisovat.

md4

Tento modul slouží k vytvoření hash kódu řetězce či binárních dat podle normy MD4. Výsledkem je 128-bitový hash kód, který je možné získat jak v binárním, tak i hexadecimálním tvaru. Při použití tohoto modulu je zapotřebí dát pozor na to, že výstup v hexadecimálním tvaru je složen z řady 32 hexadecimálních číslic – to může způsobovat problémy některým utilitám, které očekávají, že vždy dvojice hexadecimálních číslic je od ostatních oddělena mezerou.

md5

Modul md5 slouží k tvorbě hash kódů podle algoritmu popsaného v RFC 1321. Formát výstupu je stejný jako u předchozího modulu – buď binární tvar nebo tvar hexadecimální.

md5crypt

Modul md5crypt je možné použít na vytvoření hash kódu původně nezakryptované­ho hesla.

sha1

Tento modul slouží, podobně jako moduly md4 a md5, k vytvoření podpisu (hash kódu) řetězce či binárních dat podle algoritmu SHA1. Místo 128-bitového kódu je však použito 160 bitů a i samotný algoritmus je upraven tak, aby odolal některým kryptoanalytickým technikám.

crc16

Jedná se o poměrně jednoduchý modul sloužící k vytvoření šestnáctibitového kontrolního součtu (metodou CRC) vstupních dat. Kromě vlastních dat je možné specifikovat i inicializační hodnotu, která se zapisuje do zpracovávaného polynomu. Ve většině aplikací CRC je použita nulová hodnota, tj. 0×0000.

crc32

Tento modul je možné použít pro výpočet dvaatřicetibitového kontrolního součtu (metodou CRC). Zajímavé je, že API tohoto modulu je odlišné od modulu crc16.

sum

Modul sum slouží ke spočtení kontrolního součtu algoritmem kompatibilním s utilitou sum (viz man sum). Kromě řetězce je možné pracovat i se soubory.

des

Tento modul umožňuje šifrovat a dešifrovat data pomocí dnes již postaršího šifrovacího standardu DES – Data Encryption Standard.

rc4

Implementace proudového šifrovacího algoritmu RC4.

jpeg

Název tohoto modulu může být matoucí. Nejedná se totiž o modul řešící kódování či dekódovaní dat podle standardu JFIF, ale o metody sloužící k získání dalších informací o uloženém obrázku. Zejména se jedná o získání náhledu na obrázek, rozměrů obrázku, ale také o práci s dnes velmi často používaným formátem EXIF (informace dodané elektronikou digitálních fotoaparátů). Také je zde poskytnuta metoda, která ze souboru JPEG odstraní všechny metainformace.

png

Tento modul slouží ke zpracování metainformací z dnes velmi populárního rastrového formátu PNG – Portable Network Graphics.

tar

Modul, který je možné použít pro práci se soubory (a k nim příslušejícími informacemi) uloženými v tarballech.

3. Komunikační protokoly

Další moduly z knihovny Tcllib slouží ke zjednodušení práce s různými komunikačními protokoly.

comm

Jednoduchý a přitom velmi mocný modul řešící komunikaci se vzdáleně běžící aplikací. K dispozici je několik příkazů, které je možné aplikaci zaslat, veškerá komunikace probíhá přes sockety. Je přitom možné komunikovat i mezi aplikacemi běžícími na různých operačních systémech.

dns

Klient pro Internetovskou službu DNS – Domain Name Service. Přenosy jsou implicitně uskutečňovány pomocí TCP, je však možné (například pro dosažení vyšší rychlosti) použít i UDP, ovšem za podpory knihovny TclUDP.

tcllib_ip

Několik příkazů pracujících s IP adresami typu IPv4 i IPv5.

ftp

Příkazy, pomocí nichž je možné vystupovat jako klient při komunikaci pomocí protokolu pro přenos souborů FTP – File Transfer Protocol.

ftpd

Serverová část řešící komunikaci pomocí protokolu FTP.

irc

Příkazy pro komunikaci pomocí protokolu IRC – Internet Relay Chat.

ldap

Klientská část příkazů pro komunikaci se servery pomocí protokolu LDAP – většinou se jedná o získávání informací o osobách či rolích uložených dle organizační struktury nějaké organizace.

nntp

Klientská část příkazů umožňujících práci s protokolem NNTP.

pop3

Klientská část příkazů umožňujících práci s protokolem POP3. Používá se například při vytváření specializovaných e-mailových klientů, nebo v jednodušších programech, které pouze vylistují hlavičky zpráv.

pop3d

Serverová část příkazů umožňujících práci s protokolem POP3.

smtp

Klientská část příkazů umožňujících práci s protokolem SMTP – Simple Mail Transfer Protocol. Vhodné například při zasílání zpráv o chybách aplikace na e-mail jejího správce.

smtpd

Serverová část příkazů umožňujících práci s protokolem SMTP.

4. Matematické funkce a operace

Tcl je pro vyčíslení matematických výrazů možné použít příkaz eval. Ten výrazy vyhodnocuje podobně, jako je tomu v programovacím jazyku C (včetně práce s datovými typy). Pro složitější matematické operace jsou však možnosti tohoto příkazu nedostatečné a právě zde nastupuje sada modulů dostupných z knihovny Tcl:

  1. math::bigfloat – práce s hodnotami uloženými ve formátu pohyblivé řádové čárky o (teoreticky) libovolné přesnosti a rozsahu
  2. math::bignum – práce s celočíselnými hodnotami o (teoreticky) libovolném rozsahu
  3. math::fourier – diskrétní Fourierova transformace (DFT) a rychlá Fourierova transformace (FFT) – používá se například při zpracování zvuku nebo obrazu
  4. math::statistics – různé statistické funkce a metody
  5. math::linearal­gebra – lineární algebra (resp. její základ)
  6. math::geometry – vybrané operace řešící například vzdálenost bodu od úsečky, délku polyčáry apod.
  7. math::interpo­late – různé metody interpolace (lineární, Lagrangeova, spline funkce …)
  8. math::complex­numbers – práce v komplexní rovině (včetně komplexních operátorů a funkcí)
  9. math::calculus – výpočet hodnot určitých integrálů různými metodami

5. Knihovna Snack

Knihovna Snack podporuje práci se zvukovými zařízeními, samozřejmě včetně základních operací: nahrávání a přehrávání zvukových stop. V dalších kapitolách si ukážeme základ práce s touto knihovnou.

6. Práce se zvukovými zařízeními

Práci se zvukovými zařízeními zajišťuje třída snack::audio spolu se svými metodami. Příkaz snack::audio inputDevices vrátí seznam se všemi vstupními zvukovými zařízeními, obdobně příkaz snack::audio outputDevices vrátí výstupní zařízení. Výběr zařízení zajistí příkazy snack::audio selectInput a snack::audio selectOutput. Přehrávání zvuků je možné řídit pomocí příkazů snack::audio play, snack::audio pause a snack::audio stop.
K vybranému zařízení je možné zjišťovat jeho konfiguraci a stav pomocí příkazů snack::audio rates, snack::audio active, snack::audio playLatency a snack::audio play_gain.

7. Nahrávání a přehrávání zvuků

O nahrávání a přehrávání zvuků se starají metody ze třídy snack::sound. Kromě toho je možné pomocí této třídy o přehrávaných datech získat další informace, například výkonové spektrum (metoda powerSpectrum). Následující fragment kódu po svém spuštění nahraje z disku soubor „cheers.wav“, vypíše o něm základní informace (typ souboru, vzorkovací frekvence) a posléze soubor přehraje příkazem play (lze načítat soubory typu WAV, AU, SND, AIFF, SD, SMP, CSL, RAW a MP3, k dispozici je i rozšíření pro OGG).

package require snack
snack::sound pokus -load "cheers.wav"
pokus info
pokus play 

V některých případech je vhodné, aby byla aplikaci vrácena informace, že je přehrávání zvuku ukončeno. To je možné zařídit tak, že se v příkazu pro spuštění přehrávání pomocí volby -command specifikuje callback funkce zavolaná po dokončení přehrání. Tento postup je ukázán v dalším příkladu:

package require snack
snack::sound pokus -load "cheers.wav"
pokus play -command {puts konec} 

Kromě přehrávání je možné zvuky různým způsobem upravovat (stříhat, přidávat, odebírat atd.) a také uložit na disk v některém z podporovaných formátů. V současnosti je možné vytvářet zvukové soubory typů WAV, AU, SND, AIFF, SMP, CSL a RAW.

bitcoin_skoleni

8. Mixování

Nastavení mixování zvuků (resp. zařízení, které mixování zvuků provádí) se děje pomocí metod dostupných ze třídy snack::mixer. Základem je příkaz snack::mixer devices, který vrátí seznam zvukových zařízení a snack::mixer inputs, který vrací seznam vstupů, které je možné směšovat. Jedno ze zařízení je možné vybrat jako implicitní příkazem snack::mixer select jméno_zařízení. Dále je možné zjistit dostupné vstupní linky příkazem snack::mixer lines. Každá linka může být složena z několika kanálů, ty přečte příkaz snack::mixer channels název_linky – většinou je dostupný pravý a levý kanál.

Dostupné výstupní porty se získají příkazem snack::mixer outputs – opět se jedná o seznam. Posledním důležitým příkazem je snack::mixer volume, pomocí kterého je možné zjistit hlasitost jednotlivých linek nebo jejich kanálů (pravého a levého). Také je možné provést navázání jedné či dvou proměnných na hlasitost – tyto proměnné budou měněny na nastavenou úroveň hlasitosti, nikoli však automaticky, ale po příkazu snack::mixer update.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.