Artykuły:

  • data publikacji: 14.12.2008

    Jak poprawnie osadzić Flasha w kodzie (X)HTML strony?

    kategoria: Flash, Skrypty client-side, XHTML/CSS autor: m1chu

    Jak poprawnie osadzić Flasha w kodzie (X)HTML strony?

    Walidacja kodu jest istotna. Nieważne czy powodem jest chęć wyszlifowania w sobie dobrych nawyków, czy po prostu zwykła i naturalna potrzeba poprawienia napisanego przez siebie kodu. Co jednak jeżeli tworzysz stronę wg. przyjętych w specyfikacji zasad, z dumą chcesz umieścić na niej odnośnik potwierdzający poprawność kodu zawierającego animację Flash i nagle spotka Cię niemiła niespodzianka? I wszystko poprzez krążące po zaułkach Internetu niepoprawne konstrukcje osadzania wcześniej wymienionej technologii...

    W jaki sposób poprawnie implementować Flash? Jakich zastępczych metod można używać? Co jest sprawcą tego, że z reguły nasz kod jest nieprawidłowy? Ten artykuł odpowie Ci na wszystkie powyższe pytania...

    Internet źródłem nieprawidłowego rozwiązania...

    Pomimo tego, że treści dostępne w kanonach sieci są podatne na "proces edukacji" i powoli zmieniają swoją zawartość na coraz to bardziej prawidłową, to nadal można znaleźć wiele wyników wyszukiwań które są rozwiązaniami błędnymi. Tak jest także z tematyką poruszaną w tym wpisie.

    <embed type="application/x-shockwave-flash"
            width="1024"
            height="768"
            src="flash.swf"
            quality="high"
            bgcolor="#ffffff">
            <noembed>
            Przeglądarka nie obsługuje znacznika "embed", animacja Flash nie zostanie wyświetlona!
            </noembed>
    </embed>

    Oto przykład jednej z nieprawidłowych solucji. Problemem jest tu znacznik embed który nie jest, ani częścią specyfikacji HTML4, ani XHTML1.x, a jedynie naleciałością wprowadzoną kiedyś przez programistów Netscape Navigatora. Ponieważ jednak jest on wspomagany także przez przeglądarki takie jak Opera, Firefox, Safari, czy Internet Explorer przyjęło się pospolicie użytkowanie powyższego, nieprawidłowego rozwiązania (a wszystko za sprawą nieszczęsnego, kapitalistycznego marketingu w postaci bezmyślnego kopiowania danego artykułu ze strony na stronę i czerpania z tego korzyści). Niekiedy można napotkać także poradę w której embed znajduje się w tagu object, które w takim połączeniu jest także błędne.

    Ciut teorii: embed - jest znacznikiem wykorzystywanym do wstawiania obiektów typu plugin do kodu strony. Niezgodny z specyfikacją HTML4 i XHTML1. Obsługiwany jednak przez Firefoksa 1.0+, Mozille 0.6+, Operę 3.0+, Safari, Netscape Navigatora 1.0+ i Internet Explorera 3.0+. Obsługuje atrybuty class, dir, hidden, hspace, id, lang, name, pluginpage, src i style. Używany często wraz z noembed (także niezgodnym z w.w. specyfikacjami) którego zawartość wyświetlana jest w momencie kiedy przeglądarka nie obsługuje embed.

    Przykład:

    <embed src="stream.mp3" type="audio/mp3" style="width: 640px; height: 480px;">
            <noembed>
            Tekst dla przeglądarek nie obsługujących "embed".
            </noembed>
    </embed>

    W wyniku, po wykonaniu walidacji otrzymamy kilka błędów związanych z użyciem właśnie tego, nieprawidłowego tagu.

    niepoprawność metody z embed

    Osadźmy więc poprawnie...

    Jeżeli chcemy kierować się zaleceniami specyfikacji to musimy skupić się jedynie na znacznikach object z zaaplikowanymi wewnątrz sparametryzowanymi tagami param (metoda nazwana Flash Satay). Od tego momentu embed przechodzi w niepamięć, bo tak naprawdę wszystko co dzięki niemu mogliśmy osiągnąć, będziemy mogli stworzyć także poprzez naszą nową formułę.

    Kilka słów wyjaśnienia o głównym obiekcie naszych zainteresowań: object - pozwala na wstawienie do dokumentu obiektu multimedialnego. Zaimplementowany w przeglądarkach Firefox 0.1+, Opera 4.0+, Mozilla 0.6+, Safari, Netscape Navigator 6.0+ i Internet Explorer 3.0+. Służy za zamiennik m.in. dla niepoprawnych bgsound, czy embed. Znacznik ten jest częścią specyfikacji HTML 4.01 Strict/Transitional/Frameset, XHTML 1.0 Strict/Transitional/Frameset oraz XHTML 1.1. Obsługuje atrybuty takie jak: accesskey, archive, class, classid, codebase, codetype, data, dir, id, lang / xml:lang, name, style, title, type i xmlns.

    Przykład:

    <!-- próba załadowania pliku MOV typu QuickTime -->
    <object data="katalog/film.mov" type="video/quicktime" style="width: 640px; height: 480px;">
            <!-- jeżeli plik MOV nie będzie mógłbyć załadowany zostanie podjęta próba załadowania w jego miejsce grafiki o rozszerzeniu PNG -->
            <object data="katalog/alternatywa.png" type="image/png" style="width: 640px; height: 480px;">
                    <p>
                            Tekst wyświetlany w wypadku nie załadowania jakiegokolwiek z zasobów dwóch powyższych znaczników.
                    </p>
            </object>
    </object>

    Tak więc, aby wkomponować w naszą stronę obiekt Flash musimy określić co najmniej typ tego obiektu (type), plik źródłowy (data) i ostylować jego wymiary (style). Z podanej listy typów MIME dostrzegamy, że pożądanym przez nas jest application/x-shockwave-flash. Należy zwrócić uwagę na fakt, że nie korzystamy w ostatnim przypadku bezpośrednio z parametrów height oraz width, a idąc z duchem czasu wykorzystujemy po prostu możliwości wewnętrznego arkusza stylów.

    Teoretycznie o parametryzacji: param - pozwala na wprowadzenie parametrów do obiektów (object) i apletów (przestarzale za pomocą applet, bądź aktualnie także za pomocą object). Każdy z takowych parametrów musi być ustawiony w osobnym znaczniku param. Jest zgodny z dokumentacją HTML 4.01 Strict/Transitional/Frameset, XHTML 1.0 Strict/Transitional/Frameset oraz XHTML 1.1, a także obsługiwany w przeglądarkach Firefox 0.1+, Opera 4.0+, Mozilla 0.6+, Netscape Navigator 6.0+ i Internet Explorer 3.0+. Obsługuje atrybuty takie jak: id, name, value oraz xmlns (tylko dla XHTML).

    Przykład dla XHTML 1.0:

    <!-- próba załadowania pliku MPG -->
    <object data="katalog/film.mpg" type="video/mpeg" style="width: 640px; height: 480px;">
            <param name="autoplay" value="true" />
            <param name="pluginspage" value="http://www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer/" />
            <!-- jeżeli plik MPG nie będzie mógłbyć załadowany zostanie podjęta próba załadowania w jego miejsce filmu w postaci MOV -->
            <object data="katalog/film.mov" type="video/quicktime" style="width: 640px; height: 480px;" title="Filmik alternatywny!">
                    <param name="autoplay" value="true" />
                    <param name="pluginspage" value="http://quicktime.apple.com/" />
                    <p>
                            Tekst wyświetlany w wypadku nie załadowania jakiegokolwiek z zasobów dwóch powyższych znaczników.
                    </p>
            </object>
    </object>

    Przykład HTML:

    <!-- próba załadowania pliku MPG -->
    <object data="katalog/film.mpg" type="video/mpeg" style="width: 640px; height: 480px;">
            <param name="autoplay" value="true">
            <param name="pluginspage" value="http://www.microsoft.com/Windows/Downloads/Contents/Products/MediaPlayer/">
            <!-- jeżeli plik MPG nie będzie mógłbyć załadowany zostanie podjęta próba załadowania w jego miejsce filmu w postaci MOV -->
            <object data="katalog/film.mov" type="video/quicktime" style="width: 640px; height: 480px;" title="Filmik alternatywny!">
                    <param name="autoplay" value="true">
                    <param name="pluginspage" value="http://quicktime.apple.com/">
                    <p>
                            Tekst wyświetlany w wypadku nie załadowania jakiegokolwiek z zasobów dwóch powyższych znaczników.
                    </p>
            </object>
    </object>

    Aby mieć pewność, że każda nowoczesna przeglądarka będzie poprawnie egzekwować tą metodą powinniśmy użyć dodatkowo kilku nazw parametrów. W naszym przypadku będą to kolejno ścieżka wraz z nazwą pliku animacji Flash (movie), a także jakość (quality). Nie są to oczywiście wszystkie dostępne własności. Przede wszystkim wśród nich możemy wyróżnić:

    • play przyjmujące wartość true (domyślne) / false określające, czy animacja ma być odtwarzana wraz z załadowaniem strony.
    • loop przyjmujące także wartość true (domyślne) / false określające, czy animacja ma być wyświetlana ponownie w pętli po zakończeniu poprzedniego odtwarzania.
    • bgcolor przyjmujące wartość #rrggbb i określające (szesnastkowo) kolor tła.
    • menu przyjmujące wartości true (menu z dodatkowymi funkcjami) / false.
    • quality przyjmujące wartości best (najlepsza jakość wraz z Anti-Aliasingiem dla wszystkich elementów), high (występuje Anti-Aliasing, ale wygładzanie jest tylko w przypadku statyczności elementów), autohigh (w przypadku spadku wydajności usuwa Anti-Aliasing w celu zachowania poziomu szybkości animacji), medium (podobnie jak w poprzednim przypadku, ale bez wygładzania), low (najsłabsza jakość bez A-A) i autolow (Anti-Aliasing włączany jest dopiero w przypadku kiedy pozwalają na to zasoby w takim stopniu, aby nie pojawił się znaczy spadek poziomu prędkości działania animacji).
    • scale przyjmujące wartości exactfit (klip dopasowany jest do podanych wymiarów), noborder (dopasowuje proporcjonalnie skalując animację do obszaru) i showall (wyświetla w podanym obszarze bez zmian w proporcjach).
    • allowscriptaccess nadaje prawa do wykonywania skryptów od szóstej wersji Flasha. Mianowicie: always zezwala na wykonywanie wszystkich skryptów, never nie zezwala, a samedomain pozwala tylko na te dostępne w obrębie poruszanej się domeny.

    Ponieważ, jak już pewnie zauważyliście wewnątrz najbardziej zagnieżdżonego znacznika object można (lecz oczywiście nie trzeba!) umieścić po jego parametrach alternatywnie wyświetlany kod to w naszym przykładzie wyświetlimy w takim wypadku grafikę o takich samych rozmiarach.

    <object type="application/x-shockwave-flash"
            data="skompilowany_flash.swf"
            style="width: 1024px; height: 768px;">
            <param name="movie"
                    value="skompilowany_flash.swf" />
            <param name="quality"
                    value="best" />
            <img src="zastepcza_grafika.png"
                    style="width: 1024px; height: 768px;"
                    alt="Brak pluginu Flash" />
    </object>

    Powyższy przykład będzie poprawny dla kodu XHTML. Dla czystego HTML-a należy formę zminimalizowaną parametrów oraz opcjonalnej grafiki ( />) zamienić na tradycyjną, bądź w ogóle tych znaczników nie zamykać.

    Zapraszam do przejrzenia przykładu implementacji metody.

    Poprawny rezultat po użyciu object i param

    Rozwiązanie problemów z ładowaniem dużych plików

    W wypadku klipów o sporej wadze powyższa metoda ma jeden mankament. Dopóki plik nie zostanie w całości załadowany animacja nie zostanie odtworzona.

    Można temu zapobiec tworząc prosty loader, także korzystając z Flasha. Tworząc nowy dokument (rozmiary mogą być minimalne, np. 10x10px) wystarczy w jego pierwszej klatce dodać następujący kod ActionScript:

    var fileName = _root.path;
    if ( -1 == fileName.indexOf("%25") && fileName != "" )
    {
            _root.loadMovie(fileName + ".swf", 0);
    }

    Przy eksporcie do pliku wymagane jest, aby dokonywać go korzystając z ActionScript 1.0 (AS), a w opcji Local playback security: należy wybrać Access local files only. Archiwum z plikiem źródłowym i wynikowym znajduje się tutaj.

    Dla nowszych AS, na przykład trójki powyższy przykład nie zadziała. Należy posłużyć się za to klasą Loader.

    var path:String = new String();
    path = ( root.loaderInfo.parameters.path ? root.loaderInfo.parameters.path : "" );
    if ( -1 == path.indexOf("%25") && path != "" )
    {
            var loader:Loader = new Loader();
            loader.load(new URLRequest(path + ".swf"));
            addChild(loader);
    }

    Na koniec zostaje jeszcze jedna zmiana do wykonania. W znaczniku object oraz w jego parametrach należy zmienić ścieżki do pliku na loader.swf?path=skompilowany_flash (bez rozszerzenia). Oczywiście w tym wypadku obydwa pliki muszą znajdować się w jednym i tym samym katalogu.

    <object type="application/x-shockwave-flash"
            data="loader.swf?path=skompilowany_flash"
            style="width: 1024px; height: 768px;">
            <param name="movie"
                    value="loader.swf?path=skompilowany_flash" />
            <param name="quality"
                    value="best" />
            <img src="zastepcza_grafika.png"
                    style="width: 1024px; height: 768px;"
                    alt="Brak pluginu Flash" />
    </object>

    Zastępcze sposoby oparte na JavaScriptcie i komentarzach warunkowych...

    Jeżeli Twoim audytorium mają być osoby korzystające z czytników ekranowych (JAWS) to cały mój wywód poszedł na marne, bo po prostu nie zadziała. Nie zostawię Was jednak na lodzie. Wystarczy skorzystać z jednego z poniższych rozwiązań.

    Pierwsze, SWFObject 2.1 ogranicza się do pobrania pliku klasy, wprowadzenia opcjonalnych zmiennych i wywołania metody wraz z argumentami która przypisze wynik do elementu o odpowiednim ID. Niestety wymaga włączonej obsługi JavaScript w przeglądarce użytkownika. Pełnej dokumentacji można zasięgnąć tutaj.

    <head>
    [...]
    <script type="text/javascript" src="swfobject.js"></script>
    <!-- parametry swfobject.embedSWF: plik, ID_bloku, szerokosc, wysokosc, minimalna_wersja_flasha [, odnośnik_do_ekspresowej_instalacji, zmienne_flasha, parametry, atrybuty ]; -->
    <script type="text/javascript">
            var flashvars = false;
            var attributes = {
                    id: "flashContent"
            }
            var params = {
                    menu: "false",
                    quality: "medium"
            };
            swfobject.embedSWF("skompilowany_flash.swf", "zawartosc", "640", "480", "8.0.0.0", false, flashvars, params, attributes);
    </script>
    [...]
    </head>
    <body>
    <div id="zawartosc">
            Alternatywny tekst.
    </div>
    </body>

    Na podobnej zasadzie działa Unobtrusive Flash Objects. Została ona jednak oficjalnie uznana za przestarzałą na rzecz wcześniej opisanego rozwiązania.

    Drugi sposób zagnieżdżania oparty jest na ukrytych komentarzach warunkowych. Nested Objects, bo o nim mowa pozwala na określenie jakie przeglądarki nie powinny korzystać z kluczowego w tym wpisie sposobu. W przykładzie przeglądarki IE nie będą mogły używać rozwiązania opartego na Flash Satay.

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"
            codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0"
            style="width: 1024px; height: 768px;">
            <param name="movie" value="skompilowany_flash.swf" />
            <param name="quality" value="high" />
            <!-- poczatek: kod z tego bloku nie zostanie wykonany w przegladarkach IE -->
            <!--[if !IE]><!-->
            <object data="skompilowany_flash.swf"
                    type="application/x-shockwave-flash"
                    style="width: 1024px; height: 768px;">
            <param name="quality" value="high" />
            <param name="pluginurl" value="http://www.macromedia.com/go/getflashplayer" />
            <!--<![endif]-->
            <!-- koniec -->
            <img src="zastepcza_grafika.png"
                    style="width: 1024px; height: 768px;"
                    alt="Brak pluginu Flash" />
            <!-- poczatek: kod z tego bloku nie zostanie wykonany w przegladarkach IE -->
            <!--[if !IE]><!-->
            </object>
            <!--<![endif]-->
            <!-- koniec -->
    </object>

    Oczywiście odpowiednio modyfikując ujęte w kodzie komentarze warunkowe możemy manipulować tym która przeglądarka, które rozwiązanie będzie mogła stosować.

    Podsumowując...

    Na pewno buszując po otchłaniach Internetu spotkalibyście jeszcze kilka innych, mniej lub bardziej profesjonalnych rozwiązań. Pomimo, że te które tym razem zaprezentowałem działały bez większego zająknięcia na Operze 9.62, Firefoksie 3.0.4, Safari 3.2, a nawet na diabelnie niepokornym Internet Explorerze 7 to chociażby dla pogłębienia swojej wiedzy warto się zainteresować pozostałymi metodami.

    Oczywiście wykorzystanie object i param nie musi tylko i wyłącznie służyć do obsługi Flasha. Operowanie na filmach, muzyce, czy grafice to tylko przykłady możliwości tych znaczników. Wystarczy poeksperymentować i zapamiętać jedną rzecz... embed od dziś odchodzi w niepamięć...

    copyright © 2008, m1chu

    udostępnione na licencji CC dla vivee.info i m1chu.eu

    Udostępnij ten artykuł:
    • Print
    • Digg
    • del.icio.us
    • Facebook
    • Mixx
    • Google Bookmarks
    • Gwar
    • RSS
    • Technorati
    • Twitter
    • Wykop

  • 22 Responses to “Jak poprawnie osadzić Flasha w kodzie (X)HTML strony?”

    1. Damian pisze:

      Dobry artykuł. Gratuluje

      Poprawcie proszę wyświetlanie kodu w treści wpisu bo bez okularów ciężko coś tu przeczytać ;)

    2. palmiak pisze:

      A w czym konkretnie jest problem? Mówię jako kret zupełny. Uprzedzam z góry, żeby moje kompetencje jako ślepca nie zostały podważone.

    3. m1chu pisze:

      Może o to, że nie ma kolorowania składni dla HTML/XHTML? :>

    4. agressiva pisze:

      Jak dla mnie wszystko jest ok, krój wyraźny, kolory w kodzie są (czarno-czerwono-niebieskie). Osobiscie nie mam zadnych uwag co do wyswietlania zawartosci wpisow, mimo, że tez jestem kretem :)

    5. Damian pisze:

      Okazało się, że to chrom tak głupio tylko to wyświetla.

    6. agressiva pisze:

      Rzeczywiscie, Chrome zmniejsza wielkosc liter.

    7. m1chu pisze:

      Teraz już jest ok :D

    8. palmiak pisze:

      TurboPtysiu czy podanie linka miało coś znaczyć?

      M1chu – gratuluję, żeś na webhostingu wylądował. Coś tylko widzę teksty tam się krzaczą w wielu miejscach, szczególnie po fragmentach kodu dalej zostaje szeryfowa.

    9. m1chu pisze:

      Właśnie, też chciałbym wiedzieć co ten link ma znaczyć?

      Żeby nie było. Jest to treść syndykowana automatycznie na WH z mojego bloga. Więc nie mam wpływu na to jak zostaną one tam wyświetlone, bo nie umieszczam ich tam “ręcznie” :D Za gratulację dziękuje, pomimo że jeszcze nic tam nie napisałem praktycznie (prócz jednego wpisu) ;]

    10. Gremlin pisze:

      Dziękuje, artykuł wyczerpujący, fajnie napisany- na pewno się przyda.

    11. m1chu pisze:

      Proszę bardzo, cała przyjemność po mojej stronie. Zapewniam, że znajdziesz na Vivee o wiele więcej ciekawych tematów, i teraz, i w przyszłości. Dlatego zapraszam do subskrybowania nowości :]

    12. Gremlin pisze:

      Czytam na twitterze :D zapraszam do siebie ;)

    13. TurboPtyś pisze:

      mój błąd, nie wiedziałem, że wh jest agregatorem treści z internetu, myślałem, że mają oni swój sztab blogerów i że może jakiś plagiat sobie ktoś urządza, …ale już rozumiem

      artykuł bardzo fajny i przejrzyście napisany

      a odnośnie serwisu, to w ostatnim czasie jakoś mało nowych artykułów się pojawia,
      życzę wam jak najlepiej i wierzę, że będzie dobrze bo odpowiada mi forma serwisu

      heya

    14. agressiva pisze:

      TurboPtyś – gdybysmy nie pracowali i nie studiowali to na pewno byłoby więcej rzeczy, ale musimy pogodzić ze sobą wiele aspektów szarego życia i robimy co mozemy żeby na vivee co jakis czas pojawiało się coś ciekawego.

    15. m1chu pisze:

      TurboPtyś, ukazując rąbka tajemnicy – osoba podpisana pod treścią na WH i tutaj to ta sama osoba. Ja :D

    16. JaRo pisze:

      A taki myk należy dodać w przypadku flasha bez tła.

      <param name="wmode" value="transparent"/>
    17. Marcin pisze:

      A mam takie pytanie odnośnie IE n-tej wersji 6. Przy osadzeniu za pomocą SWFObject 2 pojawia się szara ramka. Musiałem więc skorzystać z wycofanej SWFObject 1, i wtedy ramki nie bylo. Czy ktos zetknal sie z tym problemem?
      Dla mnie to żaden problem, ale niektórzy korzystają tylko z “jedynej słusznej przeglądarki” ;/

    18. [...] osadzić Flasha w kodzie (X)HTML strony? | Vivee – wordpress, webmastering, grafika i fotografia vivee.info/…prawnie-osadzic-flasha-w-… Pokaż reakcje /* */ inne strony z tej witryny + obserwuj co [...]

    19. Józek pisze:

      Witam. Długo czytałem wszystko co jest tu zamieszczone i mam małe pytanko.
      Jak zmienić stronkę, która jest we fleszu na HTML.
      Czy istnieje taka opcja. Oto moja strona http://www.video-foto-kris.pl
      Wyczytałem gdzieś, że można stworzyć stronę w HTML nie różniącą się od tej we FLESZU. Podobno umieszczona tam treść jest dla GOOGLE a konkretnie dla robota. Ma służyć głównie do pozycjonowania i z tego co wyczytałem ma za zadanie wyświetlać się dla tych potencjalnych klientów, którzy nie będą w stanie otworzyć tej we fleszu.
      Będę wdzięczny za informacje.
      Pozdrawiam.
      Józek

    20. adrianmazurek pisze:

      Bardzo dobry artykuł!

    21. hotelpalermo pisze:

      Awesome things here. I am very happy to look your article. Thank you so much and I’m looking forward to touch you. Will you kindly drop me a mail?

    Leave a Reply

Komentarze

Kategorie

Top 10

  • CMSy Artykuły dotyczące różnego rodzaju systemów zarządzania treścią CMS.
  • Flash Podstawowe informacje pomocne przy tworzeniu animacji w Adobe Flash.
  • Fotografia Samouczki dotyczące nie tylko robienia zdjęć ale też ich cyfrowej obróbki.
  • Grafika Ogólnie pojęta grafika komputerowa, od inspiracji, po tworzenie layoutów oraz mniejszych form graficznych.
  • Inne tutoriale wordpressowe Wszystkie inne zagadnienia dotyczące WordPressa.
  • Inspiracje Inspirujące materiały graficzne z dziedziny projektowania stron www, projektów DTP, digital painting, itp.
  • Obróbka zdjęć Techniki retuszu fotografii cyfrowych.
  • Rysunek Tworzenie rysowanych ilustracji w Adobe Photoshop.
  • Skóry do Wordpressa Darmowe oraz płatne – najlepsze skóry do WordPressa.
  • Skrypty client-side
  • Skrypty server-side
  • Tutoriale
  • Webdesign Tutoriale z zakresu projektowania stron www i grafiki użytkowej na rzecz internetu.
  • Wieczór z Open Source
  • Wordpress Ulubieniec naszej publiczności CMS WordPress: nowości, tricki, wtyczki, skóry i wszystko to co może przydać się przy korzystaniu z tego systemu.
  • Wtyczki do Wordpressa Recenzje oraz instrukcje najbardziej popularnych i najbardziej niezbędnych pluginów do WordPressa.
  • XHTML/CSS Ciekawostki z dziedziny kodowania stron www: XHTML, CSS, jQuery.

Najnowsze newsy

Wieczór z Open Source 2010

Jak co roku WSINF organizuje konferencję Wieczór z Open Source.
Chciałbym zaprosić was na tegoroczna konferencję Wieczór z Open Source 2010! Czytaj dalej

Grafart.org i WACOM zapraszają na konkursy!

Witam!

Myślę, że czas najwyższy nadmienić, że za niedługi czas zostanie zorganizowany pierwszy z trzech konkursów, w których główną nagrodą będą tablety firmy WACOM!
Za miejsca drugie oraz trzecie nagrodami będą kubki i koszulki firmy WACOM oraz magazyny graficzne PSD PHOTOSHOP oraz COMPUTERARTS.
Czytaj dalej

Zapraszamy na forum graficzne Graffika.pl

Każda osoba interesująca się grafiką komputerową ma czasami ochotę porozmawiać o swoich pracach, posłuchać rad, krytyki i pochwał innych osób. Idealnym miejscem na realizowanie takich potrzeb jest forum graficzne Graffika.pl.
Czytaj dalej

Polecane strony

  • No bookmarks avaliable.