BeOS
                                      ====

           Unix is the worst operating system; except for all others.
                               -- Berry Kercheval

          V roce 1990  Jean-Louis Gassée (známý dobroduh a spoluzakladatel
      Apple)   založil  novou  firmu  jménem  Be  s  cílem  vyvinout  nový
      a nezkažený počítač hodný 90. let spolu s novým operačním  systémem.
      Tento  romantický cíl se firmě  podařilo  splnit  tuším v roce 1997.
      BeBox  (jak se ten  ideální  počítač  jmenoval)  byl  vybaven  dvěma
      PowerPC  procesory  a  jinak  celkem  standardním  hardwarem  (IDE).
      Zajímavý byl zejména svou cenou.

          Firma Be ale postupovala  přibližně  stejnou  cestou  jako  její
      předchůdkyně - NeXt, a tak  do  dvou let  od  náročné  výroby  svého
      hardware   upustila.  Zůstal  pouze  operační   systém  BeOS,  který
      portovala na populárnější  platformy - Power Mac a Intel. Právě díky
      tomuto  portu  jsem si mohl BeOS  ošahat i na svém  počítači.  Musím
      říct, že jsem byl docela  potěšen  tím, co jsem viděl.  BeOS nejenom
      elegantně a user  friendly  vypadá,  ale zejména  programování v něm
      je  zajímavé a člověk má možnost si  odzkoušet  moderní  technologie
      a trendy v praxi.  Je  opravdu  zajímavé  opustit  70.  léta  UNIXu,
      80. léta X oken, 60. léta DOSu  (nevímjaká léta oken) a vydat se "do
      budoucnosti".

                             Trocha firemní politiky.
                             ========================

          Pokud si přečtete  firemní  články o BeOS,  zjistíte,  že dokola
      omílají následující vlastnosti svého výplodu:

      A true Preemtive Multitasking, Pervasively Multithreaded Operating
      System.

          Co  to je  preemtivní  multitásking  či  multithreading  ví  asi
      každý z  reklamní  kampaně  Windows95,  které  jej  konečně  alespoň
      částečně  implementují. Co to je  Pervasively  Multithreaded  mi ale
      vrtalo  hlavou.  Při  pohledu do slovníku se dozvíte, že pervasion =
      proniknutý, prostoupený.

          BeOS je opravdu  prostoupený  thready  (vlákny). V podstatě není
      možné napsat  program, který by nebyl multithreaded. Pokud například
      otevřete okno,  založí se automaticky  speciální  thread,  který jej
      obsluhuje. A proto se threadů v každém  programu urodí celá hromada.
      Například takový webowý browser má jeden hlavní thread, jeden thread
      starající se o DNS dotazy,  další  thread od každého  okna a u každé
      zobrazované  stránky jeden  thread  starající se o nahrávání a další
      o zobrazování. Po nabootování v systému běží celkově asi 160 threadů
      v 17 procesech (které se zde jmenují team)

          Autoři BeOS tvrdí, že právě díky tomu jejich aplikace umí využít
      více procesorů, a dokonce  tvrdí, že  thready  pomáhají i na  jednom
      procesoru a zlepšují odezvu systému.

          Právě  k této  vlastnosti  jsem  byl  skeptický.  Mé  zkušenosti
      s multithreadingem  z jádra v Linuxu  říkaly,  že  programování  pro
      thready je  komplikované,  že často  vznikají  race  condition  (kdy
      se  více  threadů  popere o jedno  místo v paměti  naráz a  výsledky
      jsou nepředpokládatelné) a dead locks (kdy  thready na sebe vzájemně
      čekají, až uvolní nějaký prostředek). Navíc thready přece jenom něco
      stojí, a tak se mi to zdálo jako zbytečné  mrhání prostředky a nervy
      programátorů.

          Po chvíli programování v BeOS ale mé obavy zmizely. U běžné BeOS
      aplikace se jednotlivé  prostředky příliš nesdílí a komunikují spolu
      pomocí zpráv, které v threadech  potíže  nedělají. Pokud se už přece
      jenom  rozhodnou u něco prát (bežně tato situace  vzniká u okna, kam
      často  kreslí více threadů a navíc na něj šahá systém), není problém
      přidat velkorysé zámky od celého objektu, a pak už člověk musí dávat
      pozor, aby prostředek  zamkl, než s ním začne dělat a potom  odemkl.
      Protože se takto zamyká  většiou  jenom jeden prostředek,  deadlocks
      nevznikají.

          I  z  uživatelského   hlediska  jsou  thready  příjemné.  Můžete
      se  například  hrabat v menu a  dialogech, i když  aplikace  pracuje
      (renderuje HTML, tiskne apod.)  Například u file manageru i načítání
      adresáře  je  zvláštní proces, a tak v případě,  že je  file  systém
      pomalý  (například po síti),  můžete  pracovat se soubory ještě před
      tím, než se celá adresář načte. Protože se využívá i čas, kdy jeden
      thread čeká na periferie, běží občas aplikace opravdu svižněji.

      Symetric multiprocesoring

          BeOS  podporuje  více  procesorů.  Právě  díky  threadům i jedna
      aplikace je dokáže využít.

      Object Oriented Design.

          Objekty  jsou  moderní,  a  tak  pronikly i do návrhu operačního
      systému.  V  terminologii  BeOS  znamenají zejména to, že standardní
      knihovna  je  v  C++  a  téměř  celé  API je objektové. To je docela
      příjemná   vlastnost   pro   komplexnejší   programy  a  uživatelské
      interface.  Mnoho  objektů  se používá znova a znova v nejrůznějších
      situacích,  a tak je vidět, že objekty mají něco do sebe. Jak to ale
      u  objektů  bývá,  nejsou  nejšikovnější  pro malé programy, a tak i
      hello  world  není  žádný drobeček. Navíc C++ je zrovna jazyk, který
      příliš nemiluju.

      Design for Real-Time Media and Communications.

          Protože BeOS vznikal v době multimedií, je navrhován tak, aby se
      v  něm  dobře  psaly  realtime  aplikace. Navíc obsahuje velmi pěkný
      systém  pro  prácí  s videem a zvukem, o kterém se zmíním později, a
      proto psaní multimediálních aplikací je v BeOS opravdu pěkné a výkon
      více než slušný.

          Zobrazování  musí  být také rychlé, a proto BeOS dovolí aplikaci
      přistupovat  přímo  do  videoram,  a  to  i  v okenním režimu (řekne
      aplikaci,  které  části okna jsou vidět). Samozřejmě má také podporu
      pro 3D accelerace.

      Simplicity

          BeOS  není  s  ničím  kompatibilní (I když to není úplně pravda,
      protože  podporuje POSIX), nemá v sobě žádně archaizmy, nepoužitelné
      API  překryté  použitelnými a další bastly objevující se ve starších
      systémech.  Proto  je  programování  v  něm  docela snadné. Podle mé
      zkušenosti  ale  ne zas až tolik. Některé části BeOS jsou hezké, ale
      jiné  se  moc  nevydařily  a  přinášejí  zbytečné  komplikace. Navíc
      některé  vymoženosti jsou zbytečně omezené a daly by se zobecnit. Be
      ale  zatím  má  odvahu porušovat kompatibilitu jednotlivých verzí, a
      tak autorům nic nebrání, aby je v dalších verzích předělali.

      Multithreaded 64Bit file system

          Multimedia  potřebují  velké soubory, a proto klasických 32 bitů
      (4.2TB)  přestává stačit, a tak je dobré podporovat i soubory větší.
      64 bitů už bohatě stačí.

          Filesystém v BeOS  je  také  optimalizovaný  proti  fragmentaci,
      používá logování, a proto je odolný vůči pádům  systému  (kterých si
      alespoň ve verzi 4 užijete víc než dost).

          Jednou z jeho velmi hezkých  vlastností je podpora pro databáze.
      Každý  soubor je v podstatě  adresářem  atributů  (atribut má jméno,
      typ a hodnotu).  Podobně jako u jména souboru lze pak vytvořit index
      pro  libovolý z atributů a pak podle  něj velmi  rychle  vyhledávat.
      Proto  například  program pro poštu může ukládat  jednotlivé  dopisy
      do souborů a nastavit jim atribut From podle odesilatele.  Vyhledání
      dopisů od daného  člověka je pak stejně  snadné  jako  najít  soubor
      s daným jménem.

          Tato  vlastnost  má mnoho  využití a často  zjednodušuje  život.
      Například  sytém u každého  souboru  ukládá mime typ a aplikace zase
      mají podporované  mime typy v jiných  atributech. Tak systém  snadno
      najde  podle mime typu aplikaci,  které patří, a aplikace není nutné
      nikam registrovat.

      MediaOS

          Operační  systém  splňující  výše  zmíněné  vlastnosti  komerční
      politika  firmy  nazývá  MediaOS a tvrdí, že je to  operační  systém
      vhodný pro dobu multimedií.

                             Jak to prakticky vypadá
                             =======================

          Teď už víme, o co  autorům šlo, a je čas  ukázat,  jak se jim to
      povedlo.

          O jádře BeOS toho příliš  nevím, vyjma toho, že používá  message
      passing  microkernel, a proto  se hned podíváme, jak se BeOS tváří k
      aplikacím.

      Zprvávy

          Nejprve  je  nutné pochopit, jak se posílají zprávy. Ty jsou pro
      celý  BeOS  nesmírně  důležité  a jsou velmi praktické, a proto se o
      nich zmíním podrobněji:

          Zpráva se vytváří pomocí třídy BMessage. Ta obsahuje typ, což je
      32 bitová unsigned hodnota, podle které se určuje, co zpráva znamená.
      Některé  typy  jsou  vyhrazené  pro systém a jiné si může  definovat
      uživatel. Docela zajímavý nápad je použítí multibyte  stringu. Pokud
      v GNU C napíšete 'ahoj', znamená to integerovou hodnotu odpovídající
      stringu  ahoj. Lze tedy na typy nahlížet jako na 4 písmenné stringy.
      Načež  platí  konvence, že systémové  typy obsahují  velká  písmena,
      číslice a podtržítka.  Pokud  tedy ve svých  typech  použijete  malá
      písmena, kolize nevznikne.

          Do BMessage  pak  lze  vkládat  snadno  jednotlivé  hodnoty.  Ty
      se zkládájí z identifikátoru,  což je string,  typu,  což je integer
      a hodnoty (to je cokoliv).  BMessage umí příjemně  vkládat  základní
      typy jako integer, pointer a lze přidávat  vkládače pro další. Proto
      například zprávu o souřadnicích myši můžete vytvořit takto:

      BMessage m('_mys');
      m.AddInt("x",x);
      m.AddInt("y",y);

          Pokud  zprávu  potřebujete   poslat,  zavoláte  metodu  Flatten,
      která ji převede na pole bajtů nezávislé na endianitě stroje. Zprávu
      lze pak odeslat a zase složit  zpátky.  Navíc se v BeOS bežně zprávy
      používají pro ukládání dat na disk a nejrůznější další účely.

          Do  zprávy  lze  položky postupně nabalovat, a tak si každá část
      může  uložit  co  potřebuje a jedna zpráva pak obsahuje data od více
      modulů.  Naopak  při  adresaci  se  často  používají  položky, které
      program po doručení odřízne a pošle dál podle následující.

      O  odesílání  zpráv  se  stará třída BMessenger, která dokáže poslat
      zprávy jak uvnitř aplikace, tak ven. Přijímá je třída BLooper, která
      si  v  konstruktoru zakládá zvláštní thread, který prochází postupně
      frontu  přišlých  zpráv a předává je cílovým objektům typu BHandler,
      které zprávy filtrují a volají obslužné rutiny.

          Celý  systém  vypadá  komplikovaně, ale člověk si na něj  rychle
      zvykne a pracuje se s ním pěkně.

      Start aplikace

          Život  aplikace  v  BeOS  není  žádná  legrace.  Každá  aplikace
      obsahuje  malou funkci main, kde vytvoří potomka třídy BApplication.
      Ta  zprostředkuje  spojení  s  application  serverem,  což je server
      starající se o zobrazování (jakési X Window :), pomocí třídy BRoster
      zaregistruje  aplikaci  mezi živé programy a založí nový thread, kde
      přijímá zprávy.

          Aplikace  je  nejdříve  ve  startovacím   stavu.   Když  je  vše
      zinicializováno,  odešle zprávu  B_READY_TO_RUN svému BLooperu. Když
      se objeví na obrazovce, posílá zprávu B_APP_ACTIVATED.

          Dále aplikace  ovládá zprávu  B_QUIT_REQUESTED, po které se celá
      ukončí a zprávu  B_ABOUT_REQUESTED,  kdy  zobrazí  okno s  informací
      o aplikaci.

          Po   svém   startu   také   aplikace   může   očekávat    zprávu
      B_ARGV_RECEIVED,   kde  ji  přijdou   parametry z příkazové   řádky.
      Zajímavé  je,  že  aplikaci  lze  také   nakonfigurovat  do  režimu,
      kdy se spustí  pouze  jednou.  Pokud  uživatel  znova  chce  spustit
      takovou  aplikaci,  odešle se pouze  další  zpráva  B_ARGV_RECEIVED.
      Trochu nepříjemné ale je, že když spustíte aplkaci v jednom adresáři
      a potom v jinem  adresáři s parametrem  souboru,  dostane sice jméno
      souboru, ale nedostane adresář, a tak jej nenajde.

          Na  podobném  principu  funguje  B_REFS_RECEIVED,  kde  aplikace
      obdrží odkazy na soubory, které byly dropnuty na její ikonu.

          Pro úplnost  ještě  uvedu  B_PULSE, což je časovač a aplikace si
      může objednat, aby jí pulsy chodily v daném intevalu.

          Zprávy   jsou   zpracovávány  podobně  pojmenovanými  handlery v
      BApplication,   které   můžete   předefinovat   (jsou  to  virtuální
      metody), a tak například zpracovat ARGV apod.

          Vypadá   to  komplikovaně,  komplikované  to  je,  ale  naštěstí
      jednodušší  programy  nemusí většinu handlerů přepisovat. Jednoduchý
      program, co vytvoří okno s tlačítkem, pak vypadá takto:


#include <Application.h>
#include <Application.h>
#include <stdio.h>

#define BUTTON_APP_SIG "application/x-vnd.Be-BasicButton"
// Toto je mime typ aplikace - v BeOS má každá aplikace svůj typ podle kterého
// se identifikuje

// Okno pro button. Sice jsem zatím okna nepopisoval, ale princip je
// jednoduchý. Všichna okna jsou potomkem třídy BWindow. Te se chová tak nějak
// jako BAplikace (zaloři si svůj thread a volá handlery). Ovládá ale navíc
// nekteré nové zprávy a konečně umí do sebe přidat BView object, do kterého
// lze kreslit.

class BTSButtonWindow : public BWindow
{
        public:
                BTSButtonWindow();
                virtual bool    QuitRequested();
                virtual void    MessageReceived(BMessage* message);
        private:
                BButton*        fButton;
};
#define BUTTON_MSG 'PRES'
// Typ zprávy, kterou button po zmáčnutí posílá
// Tady bych čekal malá písmena aby se zabránilo kolizím. Psali to ale velcí
// mistři z Be a tak jim do toho šahat nebudu :)

class BTSButtonApp: public BApplication
{
        public:
                BTSButtonApp();
                virtual void    ReadyToRun();
        private:
                BTSButtonWindow*        fWindow;
};

// Starý dobrý main startující aplikaci
main()
{
        BTSButtonApp* app = new BTSButtonApp();
        // vytvoříme aplikaci
        app->Run();
        // a odstartujeme to
        return(0);
}

// vytvoř aplikaci s danou signaturou
BTSButtonApp::BTSButtonApp():BApplication(BUTTON_APP_SIG)
{
}

// Toto se zavolá, až aplikace dostane zprávu ReadyToRun. Tuto zprávu pošle
// nový BLooper, který se založí po zavolání Run z mainu. Zde se aplikace
// odstartuje
void
BTSButtonApp::ReadyToRun()
{
        // Až se aplikace zinicializuje, vytvoř okno
        fWindow = new BTSButtonWindow();
        // A ukaž ho
        fWindow->Show();
}

// Pozice a velikost okna (left, top, right, bottom) a tlačítka v něm
const BRect kWindowFrame (100,100,300,300);
const BRect kButtonFrame (80, 90, 120, 110);
const char* kWindowName = "ButtonWindow";
const char* kButtonName = "Press";

BTSButtonWindow::BTSButtonWindow() :
        // vytvoří okno na dané pozici s daným názvem.
        BWindow(kWindowFrame, kWindowName, B_TITLED_WINDOW,
                        B_WILL_DRAW)
{
        // Vytvoří tlačítko a nastaví mu prázdnou zprávu typu BUTTON_MSG,
        // kterou má poslat až
        fButton = new BButton(kButtonFrame, kButtonName, kButtonName,
                                        new BMessage(BUTTON_MSG));
        // Umístí jej do okna
        AddChild(fButton);
}


// Pokud uživatel zmáčkne zavírací čudlík, okno dostane zprávu
// B_QUIT_REQUESTED. Ta se předá tomuto handleru. Ten chce uzavřít
// celou aplikaci a proto ji pošle ukončovací zprávu. Defaultní
// handler z BApplication ji konečně dorazí
bool
BTSButtonWindow::QuitRequested()
{
        be_app->PostMessage(B_QUIT_REQUESTED);
        // Defaultní handler z BWindow okno uzavře
        return BWindow::QuitRequested();
}

// Do tohoto filteru nerozpoznané zprávy.
void
BTSButtonWindow::MessageReceived(BMessage* message)
{
        static int numPresses = 0;
        switch(message->what)
        {
                // Button posíla BUTTON_MSG zprávu.
                case BUTTON_MSG:
                        char title[100];
                        sprintf(title, "Presses: %d", ++numPresses);
                        SetTitle(title);
                break;
                default:
                        // Ostatní zprávy se pošlou dalšímu filteru
                        BWindow::MessageReceived(message);
        }
}

          Jak  vidíte  aplikace, je přímočará ale  krátká  není. To je ale
      u objektů běžné. U větších aplikací pak tato práce navíc přinese své
      ovoce (někdy).

                                 Zajímavosti API
                                 ===============

          API BeOS je rozděleno do následujících častí:

      The Application Kit

          zde  jsou  již  zmíněné  třídy  BApplication, BMessage, BLooper,
      BMessenger,  BHandler  a  některé další (BClipboard apod.). Zajímavá
      vymoženost  je scriptování, pomocí kterého může jedna aplikace řídit
      druhou  standardním  protokolem.  Nepodařilo  se  mi jej ale pořádně
      prozkoumat  a  zjistit k čemu se používá, a tak netuším do jaké míry
      je použitelné.

      The Device Kit

          Api pro práci se seriovými  porty,  joystickem apod. Není přiliš
      zajímavé.

      The Game kit

          Jakýsi  ekvivalent  DirectX z Windows.  Jsou  zde  dvě  základní
      třídy  BDirectWindow a BWindowScreen.

          BDirectWindow  (potomek  BWindow),  zpřístupní  přímý přístup do
      videoram  v  okně (lze také použít ve fullscreen režimu). Použití je
      docela  jednoduché. Vytvoření je shodné s BWindow, a také lze použít
      jako normální okno. Navíc ale má handler zprávy DirectConnected, kde
      obdrží ukazatel do videoram, seznam čtverců, které jsou z okna vidět
      a  pár  dalších  informací.  Potom  už  může  vesele kreslit. Jediná
      komplikace  je,  že  DirectConnected  může přijít uprostřed kreslení
      (pokud  se  okno pohnulo apod.) a samozřejmě je nutné se domluvit na
      tom,  kdy  už  aplikace  vzala  tento  fakt  na vědomí. Mně ze zcela
      nepochopitelného  důvodu  se  toto  potvrzení  provádí  po  ukončení
      handleru.  Proto  je  nutné vytvořit zámek pro informace o bufferu a
      zamknout  jej  v  handleru a kreslící rutině. Pak ale může vzniknout
      deadlock (když se handler vyvolá uprostřed kreslení). Na kreslení je
      tedy nutné založit nový thread.

          BWindowScreen  má  také  větší  část  funkcí z BWindow.  Po  své
      inicializaci  ale  obejde  application  server  a  přistupuje  přímo
      na driver  videokarty.  Může  tedy  měnit  grafické  módy a používat
      accelerace. Jinak je ale použití téměř shodné s BDirectWindow.

      The Interface Kit

          User   interface   má   sice  silné  stránky  -  multithreading,
      antialiasované  fonty,  ale  je  podle  mého  názoru nejslabší částí
      BeOS, a proto se o něm zmíním jenom povrchně.

          Narozdíl od XWindow,  kde  lze  zakládat  okna v okně, u BeOS se
      zakládá pouze hlavní  okno. Okna v okně supluje třída BView a hlavní
      okno (obrazovku)  BScreen.  Dlouho jsem  přemýšlel nad důvodem  této
      komplikace a myslím, že to je kvůli threadům. Hlavní okno si zakládá
      automaticky  thread s BLooperem.  Nebylo by ale asi  únosné,  aby si
      takový thread založil každý čudlík (okno v okně).

          Opět  narozdíl od XWindow se BWindow se zakládá na pevně  daných
      souřadnicích a pevně  daných  rozměrech a nikdo  mu do  toho  nemůže
      mluvit. Díky tomu se v malých rozlišeních  zakládají okna tak, že se
      na obrazovku nevejdou a nelze si volit umísťování nových oken.

          Do okna se  vkládají  BView  objekty,  do kterých  lze  kreslit.
      Ty tvoří  stromovou  strukturu.  Opět ale narozdíl od XWindow  BView
      na stejné  úrovní musí být disjunktní,  jinak  kreslení a doručování
      zpráv do nich  má náhodné  výsledky  (jednou je na vrchu  to,  jindy
      ono).

          Zajímavá  je implementace resize okna v BeOS. BeOS mění velikost
      "živě",  tedy  okno  se rovnou vykresluje v jednotlivých velikostech
      (jako  v  OS/2).  Díky tomu je nutné implementovat BView tak, aby po
      resize  neblikala.  Navíc  se  u BView nastavují flagy, které strany
      okna  má sledovat. A tak se levý scrollbar nastaví tak, aby se držel
      pravého,  horního  a dolního okraje a po resize se posune přesně tak
      jak má.

          Nejslabší   částí  je  implementace  dialogů.  Jednotlivé  prvky
      (checkboxy  apod.)  jsou  implementovány  jako potomci BView. Jejich
      umístění  se  ale udává přímo pomocí souřadnic. To komplikuje život,
      protože  člověk  jednak  musí  udávat souřadnice přímo v programu, a
      také  nelze změnit velikost fontů (fonty v BeOS jsou tak malé, že je
      v  rozlišení  1024x768  a  vyšších  dost  nepoužitelný),  nebo délku
      stringů (třeba při překladu).

          Rozumné toolkity v XWindow fungují tak, že člověk napřed vytvoří
      jednotlivé prvky dialogy a potom dodá informace stylu "tuhle skupinu
      chci mít nad sebou, tyhle dvě skupiny vedle sebe a pod tím vším dole
      skupinu s tlačítkem OK a cancel".  Při  vytváření  dialogu se napřed
      vytvoří jednotlivé prvky a potom se jich packer  zeptá na doporučené
      rozměry,  určí podle toho jejich  umístění a velikost  okna a vše se
      vykreslí.

          To se snad zlepší v příštích verzích.

      The Kernel Kit

          Tato část  obsahuje  standardní sadu funkcí pro práci s thready,
      low level posílání zpráv, syncrhonizaci a přístup na hradware.

      The Mail Kit

          Obsahuje   BMailMessage,   což  je   potomek   BMessage a slouží
      k odesílání zpráv poštou.

      The Media Kit

          Media  kit je opravdu  povedený.  Jeho  úkolem je práce s videem
      a zvukem (ale i jinými medii).  Základním prvkem je BNode. Speciální
      BNode objety  (BufferProducer) data produkují  (například  nahrávají
      ze zvukovky) a další BNode (BufferConsumer) je přijímají  (například
      výstup na zvukovku).  Doprostřed lze ale vkládat i další  Nody. Nody
      lze nahrávat z disku  pomocí  Add-onů a třída  BMediaRoster se stará
      k nalezení add-onu pro dané fomráty.

          Pokud   tedy  aplikace  chce  například  přerát  zvuk  a  ukázat
      equalizer,  vytvoří  jednoduchou frontu, kde na začátek dá převáděcí
      node  ze  souboru do zvuku (správný konvertor najde BMediaRosterem),
      pak  zařadí  equalizer  a na konec zvukovku. Pak to vše odstartuje a
      data  potečou do equalizeru a z něj do zvukovky. Data se ukládají do
      BBufferu,  který  je  ve  sdílené  paměti, a proto všechno jde velmi
      rychle.  Navíc každý BBuffer má hlavičku s časem, a tak je zaručeno,
      že  equalizer  ukazuje práve ty data, co se zrovna přehrávají a nemá
      náskok. Až všechny Nody buffer uvolní, je recyklován.

          Časování  celé produkce je řízeno  pomocí  objektu  BTimeSource,
      který se může  lišit od systémového  času  (například u zvukovky  je
      dobré  použít  její  čas), a proto lze  vše  provozovat i v dávkovém
      režimu (kde consumer  například  encoduje  MPEG) a čas pak plyne tak
      rychle, jak to počítač  stíhá.  Navíc se určuje  latence  (zpoždění)
      celé  fronty, a  proto  se  buffery  neprodukují  zbytečně  dopředu.
      Rozlišuje se také čas produkce od času aktuálního. Producent vytváří
      buffery a nastavuje  jim  čas  produkce  (první  buffer  má  čas  0,
      druhý čas zvětšený o 1000000/framerated  atd.). Produkční čas se pak
      posune na čas normální, ve kterém se přehrává. Pomocí času  produkce
      lze producenta  požádat o seekovaní. Také lze vytvořit jiné prepočty
      a hrát  zrychleně,  zpomaleně  nebo  pozadu  (U MP3  je  to  opravdu
      legrace).

          Zvuková karta je implemntována  pomocí dvou nod - audio  mixeru,
      kam  lze  připojit  libovolný  počet  producerů a mixer  je  smixuje
      a přehraje a audio input (exkluzivní) sloužící pro nahrávání.

          Další zajímavou  vymožeností je možnost  přidat  kontrolovatelné
      parametry  k  nodám.  Audio  mixer  pak  exportuje   kontrolovatelné
      parametry  pro hlasitost  apod.  BeOS umí pro ně vyrobit  standardní
      dialogy  a změny   hodnot   ukládat  a opět   přehrávat,  a tak   to
      pravděpodobně lze použít i pro nahrávání produkce.

      Midi Kit

          Tato knihovna obsahuje funkce pro čtení, zápis a zpracování midi
      a docela kvalitní syntetizér.

      Network Kit

          Tato  část  se  mi  zdá  dost  nepovedená.  Knihovna  obsahuje v
      podstatě  normální  BSD  socket  API  pro  TCP/IP. Implementace není
      kompletní  a  není  tu žádná návaznost na ostatní objekty v systému,
      messagovací systém a další věci.

      OpenGL Kit

          Implementace  OpenGL  (standard pro 3D grafické  knihovny).  Umí
      kreslit jak do okna, tak na obrazovku pomocí WindowScreen.

      Support Kit

          Tato knihovna  obsahuje  třídu BArchivable pro ukládání  objektů
      na disk, BAutoLock  BLocker pro zámky,  BBlockCache pro implementaci
      jednoduché  userland cache (nejenom pro soubory), BList pro seznamy,
      BPossitionIO  pro  obecné  streamy  (soubory co mohou být  kdekoliv)
      a třídy jako  BMemoryIO pro soubory v paměti a BStopWatch pro měření
      času

      Storage Kit

          Práce  s  filesystémem. Implmentuje BPossitionIO node pro obecné
      streamy.  Jako  svého  potomka má potom BFile pro práci se souborem.
      Odkazy  na  soubory  se  většinou  neudávají  jako  string, ale jako
      entry_ref  struktura  obsahující  jméno,  inode  adresáře  a podobné
      informace. Zdá se mi to dost nepříjemné.

          Dále  knihovna  obsahuje  třídy  pro práci s atributy,  symlinky
      apod.

      Translation Kit

          Další zajímavá  knihovna  sloužící pro převod formátů.  Umožňuje
      psaní  add-onů  pro  převody, a tak  existuje  například add-on  pro
      převod tiffu do BeOSácké bitmapy a zpět. Díky tomu všechny  grafické
      programy v BeOS mohou snadno pracovat s tify. Po přidání translátoru
      pro  soubory  z  mého  XaoS  teď  můžu  prohlížet  fraktály  webovým
      browserem,  nahrávat  do kreslícího  programu  apod.  Knihovna  také
      implementuje  standard pro nastavování  parametrů převodu, a tak lze
      například volit kvalitu u jpeg obrázků.

          Data se translatorům předávají jako BPossitionIO stream, a proto
      lze převádět téměř cokoliv.

                                       Celkově
                                       =======

          Celkově je BeOS zajímavý, ale má i dost  problémů.  Programování
      v C++ mě docela  rozčiluje a kód je v něm dost dlouhý.  Také některé
      věci jsou v BeOS dost  nepříjemné  (například  práce se soubory přes
      reference,  nebo user  interface). Na některých  částech je podle mě
      vidět,  že je  navrhovali  různí  lidé, nebo že je přidali  později,
      a tak  chybí  návaznost  (MediaKit by mohl být  obecnější a nahradit
      část  StorageKitu a celý  TranlsationKit).  Také  stabilita  systému
      není nejlepší a při programování jsou rebooty  docela časté.  Přesto
      ale  celkově  stojí za to a je opravdu  zajímavá  zkušenost si v něm
      zaprogramovat.


            výheň