![]() ![]() |
ARCHIV |
||||||||
![]() ![]() ![]() ![]() ![]() ![]() |
|
a A | h H | o O | j J |
mem
Magie začíná. V druhé části, tedy ve funkci main
, vytváříme pole těchto struktur. Pole má 4 prvky a každý prvek zabírá v paměti 2 znaky (byty). Přetypováním tohoto pole na pole bytů získáme zase pole o čtyřech prvcích. První byte ukazuje na první znak první struktury, druhý na druhy znak první struktury, třetí na první znak druhé struktury a čtvrtý na druhý znak druhé struktury. Ale protože potřebujeme zapsat všechny prvky v poli mem
, musíme metodě write
předat jako druhý parametr velikost jedné datové struktury. Metoda write
pak bude správně číst data z paměti od adresy proměnné mem
po adresu mem + mem.length * sizeof(Data)
.
sizeof
, věřte, že vrací velikost typu v bytech.uint8
.read a write
je bohužel velmi zavádějící chyba. Metody se opravdu chovají tak, jak jsem popsal, což si lze snadno ověřit studiem vygenerovaného C souboru.Než takový soubor otevřeme, je vhodné ho například otestovat, zda existuje. Někdy navíc potřebujeme se souborem dělat další „systémové“ věci. Kopírovat ho, vytvářet, měnit jeho parametry, získat jeho cestu atd. K tomu slouží třída File
z balíčku gio
. V minulém díle jsem naznačil cosi o dalších vala knihovnách – balíčcích. S těmi se budeme postupně setkávat, dnes použijeme první z nich. Něž k tomu však dojde, malinko odbočím.
Dalo by se říci, že balíček je synonymum pro knihovnu. Je třeba ale mít na paměti, že tomu tak vždy nemusí být. Autor dotyčného vapi (vala api) balíčku, může za jeden takový balíček schovat podporu několika souvisejících knihoven, nebo obráceně, jednu knihovnu rozdělit do několika balíčků. Standardní vala balíček odpovídá balíčku definovaného přes pkg-config
. Pkg-config je nástroj, který vrátí potřebné informace pro kompilování a linkování s danou knihovnou. Tento nástroj využívá celá rodina GNOME knihoven, od té nejspodnější – GLib, až po tu nejvyšší - GNOME. A možná nejen díky tomu, že podporuje i závislosti, nebo kontrolu verzí, existuje podpora pkg-configu napříč celým open-source světem. Jedna knihovna, má často několik samostatných balíčků, a tak do budoucna budu vždy uvádět pouze balíček, a případně i celou knihovnu, ze které balíček je.
Nyní už si můžeme ukázat malý kód na testování přítomnosti souboru.
public static int main (string[] args) {
// vytvoření třídy jedním z konstruktorů:
File file = File.new_for_path ("ctime.txt");
if (file.query_exists ()) { // kontrola zda soubor existuje
stdout.printf ("Soubor '%s' existuje\n", file.get_path());
} else { // nebo nikoli
stdout.printf ("Soubor 'ctime.txt' neexistuje\n");
}
return 0;
}
Uvedený příklad kompilujeme, je však nutné uvést balíček gio
, jež obsahuje třídu File
:
~$ valac file_exist.vala --pkg=gio-2.0
Co se vlastně v programu děje? Nejprve vytvoříme objekt file
, podobně jako v případě FileStream
, jednou ze statických metod. Třída File
má několik statických metod pro vytváření svých instancí, my vytváříme objekt z názvu souboru včetně cesty, konkrétně z relativní cesty. No a proč neuvádím namespace ? Protože balíček gio
patří do rodiny GLib knihoven, a tak používá GLib
namespace, který jak už jsme si řekli, je standardně integrován do všech vala programů.
Zbytek kódu testuje, zda soubor existuje, a pokud existuje, je vypsána celá jeho cesta. To znamená, že relativní cesta je doplněna o aktuální adresář, ve kterém se program pouští, a tedy ve kterém se soubor ctime.txt
nachází.
Třída File
obsahuje mnoho zajímavých metod, některé dokonce rovnou otvírají soubory pro čtení nebo zápis. Jsou to například metody append_to, crate, read
nebo jejich asynchroní modifikace. Tyto metody vrací objekty, které reprezentují opravdové soubory. Nejde však o FileStream
ale o InputStream, OutputStream
nebo IOStream
, který je zastřešuje, nikoli však objektově (oba objekty jsou vlastnostmi).
Tyto třídy jsou též součástí gio
balíčku, dědí z třídy GLib.Object
a tedy dědí i její vlastnosti jako je ref_count
nebo signal notify
. Všechny zmíněné třídy z gio
balíčku již pracují s výjimkami.
public static int main (string[] args) {
// Vytvoří třídu file, nikoli soubor test.log
File file = File.new_for_path ("test.log");
try { // v bloku může nastat výjimka
// až zde se vytvoří soubor test.log, pokud ovšem neexistuje
FileOutputStream os = file.append_to (FileCreateFlags.NONE);
// objekt string, má vlastnost data, která je čirou náhodou uint8[]
os.write ("Další nový řádek\n".data);
// odchycení výjimky GLib.Error
} catch (Error e) { // odchycení výjimky
stdout.printf ("Error: %s\n", e.message);
return 1;
}
return 0;
}
Jak je v ukázce uvedeno, vytvoření objektu file
rozhodně nevytváří žádný soubor. To je mimo jiné také důvod proč tato třída nemá žádnou metodu close
. Zato jeho metoda append
, již soubor vytváří, parametrem mu říkáme zda má soubor vytvořit přístupný všem, nebo jen uživateli, pod nímž je program spuštěn. O to jak se to děje na různých systémech se starat nemusíme, na každém to znamená něco jiného. Většina knihoven, které budeme používat a na kterých je Vala, resp, GTK, potažmo GNOME postaveno, obsahuje jistou míru abstrakce, díky níž nemusíte větvit program podle toho, na jakém systému byl spuštěn.
Třída FileOutputStream
má mimo jiných metodu write
, které se stejně jako v případě FileStream
předává pole čísel – bytů. A čirou náhodou objekt string
, i když je to objekt spíše abstraktní, obsahuje vlastnost data
, která se nám hodí. A ani zde soubor nezavíráme, i když nám to třída FileOutputStream
dovoluje. I zde platí že ztráta reference na objekt vyvolá destruktor, a ten se o vše postará sám. Ve vygenerovaném C souboru již žádné volání close
nenajdete, to proto, že jde o potomky třídy GLib.Object
a u nich se i v čistém C volá „destruktor“ funkcí g_object_unref
. To mimo jiné znamená, že tuto funkcionalitu mají třídy z gio
balíčku i ve své čisté C podobě.
K výjimkám se ještě dostaneme, proto jejich popis zatím vynechám a kód řádně otestujeme. Zkompilujeme, dvakrát spustíme, změníme práva výstupního souboru, a ověříme, že opravdu došlo k chybě.
~$ valac append_to_log.vala –pkg=gio-2.0
~$ ./append_to_log
~$ ./append_to_log
~$ chmod u-w test.log
~$ ./append_to_log
Balíček gio
toho však obsahuje daleko víc, než jen pár tříd pro práci se soubory. Umí pracovat i s disky, sockety, sítí, nebo třeba s uživatelským nastavením aplikace. Pokud budete potřebovat nějaký balíček, pomocí nějž byste otvírali soubory ze sítě, gio
je ten, který hledáte. Vedle gio
balíčku existuje ještě gio-unix
, ten obsahuje třídy, jenž využijete jen na unixových systémech (unix socket nebo disková přípojná místa).
Od příštího dílu již začneme probírat grafické rozhraní GTK+. Je toho celkem dost, tak doufám že se máte na co těšit. Na úplný závěr ještě zmíním, že gio
je součástí GLib knihovny (je distribuován pohromadě), tedy zatím používáme to, co je pro Valu nejzákladnější vybavení.
knihovna GLib
Vala dokumentace ke GLib.FileStream
knihovna GIO
Vala dokumentace gio balíčku
pkg-config
Příručka programu pkg-configl
Nejsou žádné diskuzní příspěvky u dané položky. Příspívat do diskuze mohou pouze registrovaní uživatelé. |
28.11.2018 23:56 /František Kučera
Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz
22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera
Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák
LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera
Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz
20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera
Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera
Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
31.7.2023 14:13 /
Linda Graham
iPhone Services
30.11.2022 9:32 /
Kyle McDermott
Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš
Re: zavináč
2.12.2018 23:56 /
František Kučera
Sraz
5.10.2018 17:12 /
Jakub Kuljovsky
Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?