W końcu, wczoraj, mogłem przetestować, wydane już jakiś czas temu środowisko Gnome 3. Na początku muszę powiedzieć że jestem umiarkowanie zachwycony (a znający mnie wiedzą że unikam mocnych stwierdzeń)

Gnome 3 używagm z Ubuntu 11.04 z dodatkowym PPA (Gnome 3 w głównych repozytoriach Ubuntu ma się pojawić w 11.10). Sama instalacja nie była bezproblemowa, bo w dniu kiedy próbowałem zainstalować całość po raz pierwszy, w repozytorium zaistniał konflikt pakietów, uniemożliwiający instalację. Na szczęście następnego dnia problem został zażegnany.

Gnome 3 było już wielokrotnie opisywane przez mądrzejszych ode mnie, skupię się więc na wrażeniach i drobnostkach. Wrażenie jest takie: wszystkie inne widziane przeze mnie UI (Windows, Mac (-najnowsza wersja, nie widziałem, nie mogę się wypowiadać), KDE, Unity i wszelkie 'klasyczne okienka') mogą i powinny brać przykład z Gnome 3. To działa naprawdę fajnie i szybko, a przede wszystkim jest niesamowicie estetyczne. Widać że lata planowania i designu nie poszły na marne. Zawsze zazdrościłem bohaterom różnych filmów używających filmowych 'GUI'. Teraz już nie muszę, Gnome 3 niczym nie odstaje od pomysłów designerów 'GUI' do filmowych komputerów. No i działa.

Oczywiście, Gnome 3 ma też kilka wad. Są one jednak bardzo drobne i trzeba być dość pedantyczny aby na nie zwrócić uwagę. Dlatego pozwolę je sobie przemilczeć :)

Tak więc, słowem końcowym, w mej prywatnej skali fajności od 0 do 5, Gnome 3 przyznaję 6 :). Jeśli jeszcze go nie używałeś - polecam spróbować.

4 komentarze

W językach obiektowych opartych o składnie nawiasów klamrowych (C++, C#, Java, ...) mamy zasadniczo trzy możliwości regulowania dostępu do składników klasy: private, protected oraz public. Niektóre języki dorzucają jeszcze inne (np. internal w C#), ale te trzy to podstawa.

Dla przypomnienia: public to elelment klasy dostępny dla wszystkich, także spoza klasy. Private to element prywatny, dostępny tylko w klasie, a protected to prawie to samo co private, z tym że jest dostępny dla klas pochodnych.

Mam propozycję, aby dodać jeszcze jeden regulator w tym zakresie.

Pisząc kawałek kodu zdałem sobie sprawę, że przydatna może być deklaracja, która ogranicza dostęp do elementu klasy, tylko do konkretnego obiektu - tzn. tylko obiekt A (i jego metody) mogą uzyskać dostęp do tak zadeklarowanego elementu A.a. Inne obiekty tej samej klasy, nie mogą uzyskać takiego dostępu. Taki instance-private.

Zalety takiego rozwiązania, to dodatkowy stopień hermetyzacji oraz potencjalne możliwości optymalizacji kodu dla kompilatora, oparte o dokładnej wiedzy kiedy następuje dostęp do składnika klasy.

Jakie są wasz opinie? A może są języki które mają tego typu mechanizm, o których nie wiem?

20 komentarzy

Leonard Pottering, nie dość że zepsuł dźwięk pod linuksem, to teraz bierze się za zepsucie procesu startowania systemu (i wielu innych rzeczy), w formie nowej usługi zarządzającej startem systemu: systemd.

Celem projektu, jest stworzenie usługi która pozwoli jeszcze bardziej przyśpieszyć start systemu. Bierze kilka idei z Upstarta (którego jednak Leonard określa, jako z gruntu źle zaprojektowanego), dodaje kilka innych, wziętych między innymi a launchd (usługi startowej w MacOS X) i jeszcze parę innych pomysłów.

Co jest takiego ciekawego w systemd? Odpowiedź krótka: poza opisanymi wyżej cechami, systemd, podczas uruchamiania systemu (oraz później) działa podobnie jak inetd, lecz sposób działania inetd, rozciąga na startowanie usług systemowych.

Odpowiedź dłuższa: największą bolączką startu systemu (i czasu jaki to zajmuje) jest fakt że startowanie jednych usług czeka na inne. Wszystko (prawie) czeka na syslogd, jedni czekają na avachi, inni na cups, itd. Oczekiwanie jest to realizowane poprzez sprawdzania istnienia konretnych socketów (np.: /var/run/cups/cups.sock). To co robi systemd to tworzenie tych socketów przed wystartowaniem usług, a później, w momencie próby pierwszego skorzystania z nich - wystartowanie odpowiedniej usługi i przekazanie jej zadania (to samo można zrobić przez DBus, i na to systemd jest także przygotowany).

Co to daje? Po pierwsze: nie musimy opisywać zależności pomiędzy usługami (co jest bolączką innych usług startowych np. Upstarta). Zależności niejako 'wykluwają' nam się w trakcie. Po drugie: podczas startu systemu możemy uruchamiać wszystko 'równocześnie' - dzięki czemu zmniejszymy wzajemne oczekiwanie na siebie różnych usług a przez to lepiej wysycimy IO.

Oprócz tego, systemd robi wszystko to, co potrafi Upstart, oraz tradycyjny sysvinit. Dodatkowo w planach jest też zarządzani sesją (czyli coś co robi dziś gnome-session lub kde-session.

Wszystkim zainteresowanym, chcącym skrytykować, polecam przeczytanie oryginalnego artykułu, jest długi, lecz bardzo treściwy.

48 komentarzy

Kompilatorów C jest dookoła pod dostatkiem, C++ nieco mniej, ale też sporo. Co czyni jeden lepszy od innego?

Prędkość wygenerowanego kodu? Prędkość generowania kodu?

Nie, w dzisiejszych czasach, są to sprawy raczej pomijalne (poza oczywistymi wyjątkami). Są jednak inne, równie ważne cech które należy wziąć pod uwagę przy wyborze kompilatora.

Od kiedy używam gcc - zawsze nieco irytowały mnie komunikaty błędów kompilatora (wynikające z popełnionych przeze mnie błędów składni). Oto jednak nadszedł Clang, który sprawą zajął się na poważnie: niedowiarkom polecam przeczytanie http://blog.llvm.org/2010/04/amazing-feats-of-clang-error-recovery.html. Jak dla mnie bomba, i nie wiem jak wy, ale ja się przesiadam i rozpoczynam cichy lobbing dookoła :)

6 komentarzy

Ponieważ do mojego monitora (Samsung Syncmaster 971P) producent nie zapewnia profilu ICC, przy pomocy pożyczonego (dzięki Konrad) kalibratora stworzyłem sobie takowy.

I tu mam zagwozdkę: czy można zmusić Xy do jego używania? W poszczególnych programach (Gimp, Inkscape) można, ale czy globalnie, w Xach można? Pobieżne szukanie Googli nic mi nie dało, więc prośba - jeśli ktoś coś wie - poproszę o informację.

P.S. Rzecz jasna, jeśli uda mi się to uzyskać - umieszczę tu opis.

5 komentarzy

Przeglądając podprojekty Gnome, wpadłem na BillRemindera. Wejdźcie tam, kliknijcie w Download i.... fajne nie? Ciekawe tylko jak z dostępnością takiego rozwiązania dla czytników dla niewidomych. Ale ogólnie, mnie się spodobał taki patent.

11 komentarzy

Patrząc dziś na w miarę zwykłego, Linuksowego desktopa, widać spore zatrzęsienie maszyn wirtualnych. Jest Perl, Python, Java, Mono, Flash, Ruby, PHP... jeśli coś pominąłem to nawet dobrze.

Zaletą Open Source jest różnorodność, ale nie przesadzajmy. Wymieniłem kilka maszyn wirtualnych. Normalny użytkownik w jednym momencie ma w użyciu powiedzmy dwie, trzy. Mnie się zdarza mieć wszystkie (wymienione). Oznacza to, że potrzebuję mieć w pamięci biblioteki, dynamiczne rekompilatory i inne takie dziwne narzędzia od sześciu różnych maszyn wirtualnych przez co okazuje się że 2GB pamięci to wcale nie jest dużo.

To czego potrzeba, to Uniwersalna Maszyna Wirtualna, zdolna do uruchomienia wszystkiego co nam się zamarzy. Robi się kroki w tym kierunku: pod JVM mamy JPythona, pod CLR mamy całkiem sporo języków (ale zasadniczo muszą być 'koncesjonowane'), Parrot (VM dla Perla 6) obsługuje już naprawdę wiele języków. To czego brakuje, to złożenia tego wszystkiego do kupy, najlepiej w formie eksperymentalnej dystrybucji Linuksa. To napewno nie będzie działać od razu idealnie, ale myślę że potencjalne zyski są tego warte, bo jak widzę że zjada mi kolejne 100MB pamięci na jakąś pierdółkę to krew mnie powoli zalewa. Zapewne nie będzie to proste, stworzyć VM idealnie nadającą się do wszystkiego. Nic nie szkodzi jednak spróbować.

Nie jestem specjalistą od VM, ale wielkie nadzieje pokładam w Parrocie. Projekt ciekawy, zobaczymy co z tego wyniknie.

25 komentarzy

Załóżmy następujący problem: jesteśmy integratorem rozwiązań (czyli nie jesteśmy autorem bazy i oprogramowania które jej używa - nie mamy kodu źródłowego a musimy pewne funkcjonalności dorobić). Mamy tabele A, B i C. Musimy stworzyć trigger wykonujący pewne operacje (w przypadku dodania wierszy) na A i B w zależności od C. Powiązania pomiędzy tabelami mamy takie jeden do wielu z A do B i jeden do wielu z B do C. Schemat taki, w realnym świecie, często jest używany do modelowania dokumentów, czyli A to wiersz nagłówka dokumentu, B to wiersze dokumentu, C to jakieś dodatkowe dane.

Problem polega na tym, że taki trigger jest zasadniczo niewykonalny, szczególnie w sytuacji gdy wpisy w C odnośnie B mogą, ale nie muszą istnieć. W realnym świecie: do systemu dodawany jest dokument (A), a trigger w zależności od C, musi zmodyfikować wiersze dokumentu (B).

Rozwiązaniem takiego problemu, mogłyby być triggrery transakcji. Rozwiązanie które wpadło mi do głowy pod prysznicem, a po którego po krótkim goglowaniu nigdzie nie znalazłem.

Założeniem całego rozwiązania jest to, że dokument jest dodawany w transakcji. Robi tak chyba każdy rozsądny system, tak więc jest to jak najbardziej rozsądne założenie. Trigger transakcji, byłby to rodzaj triggera wykonujący się po zakończeniu transakcji, Oczywiście, aby sprawa miała sens, musimy dodać jeszcze parę sprawa:

  • Transakcja musi być identyfikowalna, np. poprzez nazwę, przykładowa składnia: BEGIN TRANSACTION DodanieDokumentu
  • Dla ułatwienia życia, powinna być wcześnie zadeklarowana w systemie (zwykła rejestracja używanej nazwy transakcji).
  • Trigger transakcji musi być jej częścią, z możliwością wywołania rollbacka lub commita.
To chyba wszystko co niezbędne, cała reszta to już lukier. Czyli:
  1. powinna istnieć dodawania triggera na BEFORE i AFTER transakcji
  2. przy triggerze AFTER, powinna być możliwość dodawania triggrea ON COMMIT, ON ROLLBACK, z możliwośćią zmiany stanu końcowego transakcji (czyli, transakcja chce się rollbackować, ale my ja commitujemy)
  3. powinna istnieć możliwość przekazywania informacji z transakcji do triggera, np. trigger powinien widzieć stworzone w transakcji zmienne i/lub tabele tymczasowe

W praktyce, mogłoby to wyglądać następująco: oryginalny developer definiuje transakcje, i dokumentuje (dla integratorów) że transakcja tworzy tabele tymczasową w której przekazuje wszystkie niezbędne IDki. Integrator w swoim triggerze może wykorzystać tę tabelę i dokonać zmian w momencie gdy wszystkie niezbędne operacje dotyczące dokumentu są już wykonane.

Jeśli ktoś widział tego typu rozwiązanie gdziekolwiek, będzie supr jak się tym podzieli :)

P.S. Oczywiście sens to ma największy kiedy mamy zagnieżdżone transakcje, ale bez zagnieżdżonych też.

23 komentarze

Deweloperzy Debiana dołożyli do dystrybuowanej przez siebie wersji OpenSSL dziurę która powodowała że klucze kryptograficzne tworzone przez ich oprogramowanie są łatwe do odgadnięcia.

Co najlepsze, deweloperzy ci myśleli że poprawiają błąd w oryginalnych bibliotekach.

Gromy się na nich za to posypały.

Mnie się wydaje że wina leży jednak po stronie deweloperów OpenSSL a nie Debiana. Dlaczego?

Dziura o której mowa, opiera się o nieinicjowanie fragmentu pamięci. Oryginalne OpenSSL wykorzystuje to że jej zawartość jest pseudolosowa. Debianowcy poprawili to, inicjując ten fragment pamięci. Zrobili to, ponieważ używanie niezaincjalizowanej pamięci jest źródłem wielu błędów i w 99.999999% przypadków błędem popełnionym przez programistę. Ba, niektóre języki nie pozwalają używać niezaicjalizowanych zmiennych (C#) właśnie dlatego że to częsty (i zazwyczaj trudny do znalezienia) błąd. Istnieją specjalne programy analizujące kody źródłowe w celu wyłapania właśnie takich błędów.

Dlatego deweloperzy OpenSSLa bezwzględnie powinni dodać w kodzie odpowiednie komentarze krzyczące głośno: TO NIE BŁĄD, MY TO ROBIMY SPECJALNIE. To że tego nie zrobili to ciężki grzech, zaniedbanie i normalnie brak słów.

Oczywiście deweloperzy Debiana też zawinili. Taka poprawka powinna zostać popchnięta do deweloperów OpenSSL, aby ci mogli ją włączyć do własnego kodu, lub (w tym przypadku) odrzucić i wytłumaczyć co i jak. Tym niemniej jest to przewinienie znacznie mniejszego kalibru od tego co zrobili deweloperzy OpenSSL.

Parafrazując pewnego znanego łysola: KOMENTARZE, KOMENTARZE, KOMENTARZE!!!

5 komentarzy

Miałem dziś możliwość przetestowania PulseAudio w dwóch, dość nietypowych aspektach: poprzez sieć oraz pod Windows XP. Wniosek: to działa :)

Uruchomiłem kilka aplikacji pod Linuksem, a dźwięk wydobywał się ze stojącej obok maszyny Windowsowej (powód był prosty - do maszyny windowsowej były podłączone znacznie lepsze głośniki, a ich przełączenie to by była niezła zabawa). Wszystko działało w miarę bez zarzutu, jedynym problemem było przerywanie dźwięku kiedy maszyna Windowsowa dostawała obciążenie, ale dało się to załatwić zwiększając priorytet procesu PulseAudio na tej maszynie.

Ogólne wrażenie: bardzo pozytywne.

9 komentarzy

Gdzie DD to 'Domowy Deweloper'. Wiele osób pisze sobie różne rzeczy w domu. Mniejsze większe, nieistotne. Chyba każdy chociaż trochę doświadczony deweloper zna zalety systemów kontroli wersji. Problem w tym, że są one nieco kłopotliwe w użyciu - trzeba konfigurować serwer, dbać żeby działał, był dostępny, itp. Dla osoby niezorientowanej, konfiguracja CVSa czy SVNa może być cokolwiek problematyczna (tak, przyznaję się nie chciało mnie się czytać dokumentacji :P).

Takim właśnie deweloperom, chciałbym polecić ni mniej ni więcej tylko GITa, stworzonego przez Linusa Torvaldsa (znanego nieco szerzej z Linuksa, słyszeliście pewnie ;)), a obecnie rozwijanego przez zespół pod dowództwem Junio C Hamano

Główą zaletą GITa z punktu widzenia DD, jest fakt że nie potrzebuje serwera. Całość infrastruktura kontroli wersji jest utrzymywana bezpośrednio w miejscu gdzie stworzymy nasze repozytorium poleceniem git init.

Jak już utworzyliśmy nasze repozytorium, trzeba dodać do niego pliki. Zrobi to dla nas komenda git add .. Kiedy nasze pliki osiągną zadowalający nasz stan - możemy je 'pchnąć' używając komendy git commit

I to jest zasadniczo wszystko. Jak widać nie musieliśmy nic konfigurować. Po prostu tworzymy repozytorium i z niego korzystamy. Oczywiście to nie wszystko co potrafi GIT. Potrafi on o wiele więcej. Szczególnie polecany jest dla pracy grupowej, wieloosobowej z używaniem wielu gałęzi, łączeniem ich, itp. W końcu, GIT został stworzony na potrzeby jednego z największych projektów open source - jądra Linuxa. Więc jeśli w pracy męczą cię CVSem czy SVNem - zaprzyjaźnij się z GITem. Potem spróbuj przekonać szefa, przedstawiając mu potencjalne korzyści. Jakie? Może lepiej opowiedzą o tym twórcy GITa: tu i tu.

P.S. Taki mały side note: przy okazji poznawania GITa doszedłem do wniosku że dopiero przy tym projekcie objawił się w pełni geniusz inżynierski Linusa. Linux jako taki nie jest aż takim (w kontekście roli którą pełni w nim Linus) wyzwaniem. Po GITcie widać że Linus ma naprawdę bardzo dużo materii szarej :)

12 komentarzy

Kiedy tylko pojawiają się informacje na temat PulseAudio, od razu podnoszą się głosy "Ale po co", "Ale jest przecież OSS", "Ale jest przecież ALSA", "Ale jest przecież Gstreamer", itd. itp. Osoby które tak mówią, nie rozumieją niestety jak powinno przebiegać (i czasami przebiega) przetwarzanie dźwięku w nowoczesnych systemach operacyjnych.

Ponieważ jeden obraz mówi więcej niż tysiąc słów, a ja jestem leniwy, zacznijmy od prostego schematu:

Obrazek

Obrazek ten przedstawia chyba najlepszy sposób przepływu informacji. To czego w nim brakuje, to sprzętu po stronie lewej i użytkownika po stronie prawej. Jeśli zrozumiemy o co w nim chodzi, to już (mam nadzieję) nie będzie w przyszłości głupich (nielogicznych) pytań. No to lecimy. Od prawej.

Nasz Zwykły Użytkownik (ZU) klika sobie w swojej ulubionej aplikacji na przycisk PLAY, aby odtworzyć swoją ulubioną, w pełni legalną, empetrójkę. Aplikacja, komunikuje się biblioteką multimedialną, i w największym uproszczeniu mówi: odtwórz TĄ empetrójkę.

Warstwa multimedialna bierze empetrójkę i dekoduje ją, tzn, przetwarza skompresowaną postać na postać nieskompresowaną. Postać nieskompresowana jest następnie przesyłana o serwera dźwięku.

Serwer dźwięku bierze to co dostał, i robi z tym kilka rzeczy. Jeżeli sprzęt nie obsługuje formatu dźwięku w którym został on dostarczony, przekształca go na format obsługiwany przez sprzęt. Dodatkowo, jeżeli sprzęt nie potrafi samodzielnie miksować kilku źródeł, robi to właśnie serwer dźwięku. Do tego, serwer dźwięku może dodać jakieś efekty specjalne takie jak zmianę głośności, echo, pogłosy, cokolwiek się użytkownikowi spodoba. Następnie przekazuje to do warstwy sterowników.

Warstwa sterowników bierze to co dostała i po prostu przesyła to do sprzętu. Jej jedynym zadaniem powinno być przedstawienie możliwości sprzętu w sposób jednoznaczny dla serwera dźwięku.

Oczywiście, to jest uproszczony schemat. Wiele aplikacji (np. gry) może opuścić warstwę multimedialną, bo czasami jej wykorzystanie nie ma sensu.

Dlaczego tak?

Bo tak :). Ale poważniej. Taka architektura daje nam wiele korzyści i może być naprawdę szybka. Nie jest to jedyna tego typu architektura, w sieciach jest podobnie. Faktyczny model TCP/IP to bodaj pięć warstw (albo cztery, nie pamiętam dokładnie), a idealny model teoretyczny ISO-OSI zakłada do siedmiu. I to działa, do tego całkiem szybko.

W wypadku dźwięku, główną zaletą jest separacja. Programista aplikacji czy bibliotek, nie musi się martwić o możliwości sprzętu. Przez co nie musi zapewniać u siebie dla przykładu konwersji pomiędzy różnymi formatami dźwięku (a mogą być różne częstotliwości, zapis ze znakiem i bez znaku, skala logarytmiczna lub liniowa...) którą bardzo łatwo zrobić... ŹLE. Przykładem jak tego nie robić jest alsowy dmix :).

W tym modelu, prawie cały ciężar zrobienia łatwych (no, niekoniecznie ;)) rzeczy dobrze spada na serwer dźwięku. Jedno miejsce. Cała ta separacja daje też dodatkowe korzyści. PulseAudio w założeniu jest wielosystemowe, tak więc programista używając go zapewnia swojemu programowi przenośność pomiędzy systemami/platformami za darmo.

Jak widać mamy sporo potencjalnych korzyści. Oczywiście, są też zagrożenia. Podstawowym zagrożeniem jest fakt, że jeżeli serwer dźwięku będzie kiepsko napisany, to całość zacznie się sypać. Tak jest dla przykładu z Esound, który może był dobry kiedyś, ale na dzień dzisiejszy nie nadaje się już prawie do niczego. Patrząc jednak na developerów PulseAudio, widać że znają się na rzeczy i co najważniejsze: potrafią przyznać się do błędu.

Tak więc, proszę już nie pytać "ale OSS, ALSA, (whatever)". Tak ma być, a wymyślili to ludzie którzy naprawdę wiedzą co robią.

48 komentarzy

Z dźwiękiem w Linuksie nie jest specjalnie dobrze. Nie chodzi mi o obsługę sprzętu - to co możemy dostać w sklepie jest zazwyczaj obsługiwane (schody zaczynają się przy niektórych bardziej profesjonalnych rozwiązaniach). Burdel panuje niestety od strony oprogramowania.

Od strony jądra mamy dwa podsystemy: ALSA i OSS. OSS jest rozwiązaniem w miarę uniwersalnym (w świecie Unixowym), lecz Linuksie jest przestarzały. ALSA zaś jest rozwiązaniem czysto Linuksowym. Oprócz tego mamy różne soundservery: Esd, aRts, Jack, NAS. Jakby tego było mało mamy kilka różnych bibliotek programistycznych do tego wszystkiego. Wszystkie systemy są ze sobą w różny sposób powiązane. Mamy kilka niezależnych frameworków multimedialnych (Gstreamer, Xine, Mplayer, Phonon). Żadne z tych rozwiązań nie nadaje się do wszystkich zastosowań, żadne nie daje użytkownikom dokładnie tego co chcą, mają różne funkcjonalności. No ale, przede wszystkim: o co w tym wszystkim chodzi?

Najniższą warstwą tego bałaganu jest podsystem jądra. Zapewnia on podstawowy dostęp do urządzeń dźwiękowych podłączonych do naszego komputera.

Następnie mamy serwer dźwięku. Serwer dźwięku pośredniczy pomiędzy aplikacjami a warstwą jądra. Zapewnia on różnorodną funkcjonalność (o tym dalej), a najważniejszą z nich jest miksowanie kanałów: jeśli nasz sprzęt (tzn. chipset muzyczny) nie umożliwia równoczesnego odtwarzania dźwięków z kilku źródeł, to właśnie zadanie spada na serwer dźwięku.

Nad tym mamy wspólna warstwę bibliotek, frameworków i aplikacji. Wspólną z punktu widzenia tej notki, dlatego nie będę się nią więcej zajmował.

O wadach podsystemów jądra (ALSA i OSS) już pisałem. Teraz coś o serwerach dźwięku.

ESD (Enlightened Sound Daemon) to chyba najstarsza część, obecnie, jak sugeruje nazwa ;) jest rozwijany przez projekt Gnome. Rozwijany to może za duże słowo. ESD jako taki ma palmę pierwszeństwa, a główną jego zasługą jest pokazanie jak serwer dźwięku pracować nie powinien. Głównym powodem powstania ESD było odgrywanie dźwięków interfejsu użytkownika. To zadanie wykonuje nawet nieźle, lecz zupełnie nie nadaje się i nie radzi sobie z dźwiękiem który ma być odtwarzany w czasie rzeczywistym, z niskimi opóźnieniami. Multimedia jeszcze sobie dają z nim radę, lecz gry czy VoIP już nie. Tak więc ESD raczej zwija się, niż rozwija.

aRts to serwer stworzony na potrzeby projektu KDE. Od lat nie rozwijany, porzucony i zarzucony. Wymieniłem go tylko z obowiązku wbicia szpili miłośnikom KDE: tak im też się niektóre rzeczy nie udają ;)

Jack to całkiem dobry serwer. Niestety jest przeznaczony głównie dla profesjonalistów (tzn. nie informatyków profesjonalistów, ale osoby zajmujące się dźwiękiem profesjonalnie). W związku z tym czasami zachowuje się on "dziwnie" z punktu widzenia zwykłych użytkowników, a jego konfiguracją można straszyć już nawet wyrośniętych przyszczersów ;) Tym nie mniej jest to dobry produkt - ale nie na desktop.

NAS to serwer sieciowy. Tzn, uruchamiamy odtwarzacz na jednej maszynie, słuchamy na drugiej. Tą funkcję wypełnia całkiem dobrze, ale niewiele ponadto.

Dla obowiązku wspomnę tu jeszcze o ALSA, która posiada pewne elementy serwera dźwięku - lecz jest przeznaczona tylko dla Linuksa, co ją niestety dyskwalifikuje w roli uniwersalnego rozwiązania.

Zakładam że inteligentni czytelnicy domyślają się, że mam zamiar omówić to coś nowego, co ma być remedium na te problemy. I owszem :)

PulseAudio to nowy, dynamicznie rozwijający się serwer dźwięku, który trafi do następnego wydania Ubuntu (tak Livio, wiem że w Fedorze już jest ;)). Twórcy Pulse, wyciągnęli wnioski z błędów popełnionych przez starsze projekty, i postanowili rozwiązać problem raz a dobrze.

Na początek zaznaczę tylko że Pulse jest ciągle we wczesnej fazie. Większość rzeczy już działa, niektóre jeszcze nie, no i to tu to tam znajdzie się jakiś błąd.

Najważniejsza w PulseAudio jest szybkość. Ludzkie odbieranie dźwięku ma to do siebie, że (np. w przeciwieństwie do video) nie toleruje opóźnień czy przerw. Dlatego wszędzie gdzie można, Pulse stara się minimalizować opóźnienie (latency) dźwięku, czyli czas od kiedy aplikacja wydaje komendę 'graj' do momentu kiedy słyszymy dźwięk w głośnikach.

Drugą najważniejszą rzeczą jest konfiguracja, a raczej jej brak. Pulse ma po prostu działać, mimo naprawdę potężnych możliwości. W bardzo prosty sposób, od razu możemy użyć głośników na USB które przed momentem podłączyliśmy. Bezproblemowo możemy połączyć dwie karty muzyczne w jedną. Możemy przesłać nasz dźwięk przez sieć do głośników innego komputera. Wszystko kilkoma kliknięciami myszki. O takich rzeczach jak automatycznie ściszanie odtwarzaczy muzycznych w chwili gdy dzwoni VoIP, zapamiętywania ustawień każdej aplikacji, regulacji głośności per aplikację czy też wsparcia dla blutootcha już nawet nie wspomnę ;)

Trzecią cechą jest kompatybilność. Pulse za założenia ma działać na wszystkim, a wszystko ma działać na Pulse. Tak więc nie ważne czy Windows, czy FreeBSD czy Linux czy Solaris, Pulse ma na tym zadziałać. Nieważne czy aplikacja ma obsługę ALSA, OSS czy Jacka, czy NAS, czy ESD, czy też natywnie PulseAudio, ma działać.

Wszystko to ładnie brzmi prawda? Fakty jednak świadczą na korzyść PulseAudio. Jak już napisałem - rozwija się bardzo dynamicznie i na dzień dzisiejszy developerzy Pulse deklarują że 95% istniejącego, Unixowego oprogramowania zadziała ich serwerem. Myślę że są nazbyt skromni ;). Ze swojego doświadczenia mogę powiedzieć że z PulseAudio działa praktycznie wszystko, a problemy sprawiają tylko naprawdę bardzo egzotyczne, jednostkowe wypadki. Zaś co do odwiecznego problemu latency mogę powiedzieć że dokonano tu naprawdę dobrej roboty :)

No, a jak ktoś się zapyta: po co to wszystko? To ja odpowiem: głupie pytanie ;) Proponuję wypróbować, bo PulseAudio niewątpliwie pojawi się niedługo w dystrybucji której używasz. Może nawet już jest :)

25 komentarzy

Najnowszy Compiz (a przynajmniej ten w tym momencie spaczkowany w Gutsym) ma błąd, powodujący że po uruchomieniu zjada sukcesywnie całą pamięć aż do wywrotki (przy okazji mocno zamulający system, mimo że zużycie CPU na to nie wskazuje). Powodem tego...

...jest brak pliku /usr/share/compiz/ccp.xml. Wystarczy go tam wrzucić i po problemie. Oto przykładowa zawartość:

<?xml version="1.0" encoding="UTF-8"?>
<compiz>
        <plugin name="ccp">
                <short>CCP</short
                <long>Compizconfig Settings Plugins</long>
    </plugin>
</compiz>

P.S. Dodatkowym objawem problemu jest ciągłe powtarzanie linijki:

A handler is already registered for the path starting with path[0] = "org"

w logu (~/.xsession-errors).

9 komentarzy

Twórcy WINE ciężko pracują nad tym, aby możliwe stało się uruchamianie programów zabezpieczonych przez SafeDisc.

Analiza problemu wykazała co następuje: SafeDisc ładuje pewne podstawowe biblioteki systemowe (kernel32.dll, user32.dll, gdi32.dll), a następnie dokonuje analizy heurystycznej początku kodu każdej z oferowanych przez nie funkcji. Dlaczego? Powód jest prosty. Crackerzy łamiąc gry, najczęściej omijają zabezpieczenia poprzez wstawienie instrukcji skoku w odpowiednie miejsce, w ten sposób omijając standardowy kod. To właśnie próbuje wykryć analiza SafeDisc.

Problem polega na tym, że kod, standardowo generowany przez najczęściej używany do kompilowania WINE kompilator gcc ma formę która powoduje że SafeDisc uznaje go za "pirata" i nie pozwala na uruchomienie gry.

Rozwiązań tego problemu jest kilka, jedne lepsze inne gorsze. To co jednak zwraca uwagę, to fakt, że jeśli Microsoft kiedyś zmieni kod wejściowy swoich bibliotek, to może okazać się że wszystkie gry pozabezpieczane przez SafeDisc przestaną z dnia na dzień działać. Znając politykę Microsoftu, i sposób w jaki zapewnia wsteczną kompatybilność swoich systemów, wątpię aby tak się stało, ale wyobrażam sobie zgrzyt zębów deweloperów Microsoftu kiedy zobaczyli co robi SafeDisc, i jakie to ma konsekwencje.

BrainDead, po prostu BrainDead. 0xFEEDFACE.

P. S. Z dobrych wiadomości: w końcu wznowiono WWN

7 komentarzy

Pamiętaj informatyku (niepotrzebne skreślić) młody: zanim zrobisz zrzut ekranu, wyłącz wygładzanie podpikselowe :)

Mamy wygładzanie podpikselowe, ładnie dostosowane do naszej matrycy LCD. Robimy zrzut ekranu, i oglądamy na innej matrycy. Co widzimy? Obraz dziwnie się rozmywa, szczególnie litery. To efekt tego że matryca na której wyświetlamy obrazek ma inną kolejność subpikseli, a jej użytkownik ładnie dostoswoał sobie wyświetlanie do jej możliwości/cech. Dlatego pamiętajcie: przed zrobieniem zrzut ekranu do publikacji na stronie, wyłączajcie rozmycie podpikselowe.

P.S. Nie jestem bez grzechu, zdarzyło mi się popełnić

P.S. 2. Nie umieszczam przykładowych zrzutów, bo kto wie jak u was się wyświetlą.

P.S. 3. Dodatkowe efekty specjale może dawać Cairo.

23 komentarze

Subiektywny, bo szukałem środowiska dającego mi dość dokładnie określona funkcjonalność.

To jest:

  • wsparcie dla języka C
  • wsparcie dla projektów z buildysytemem opartym na autoconf/automake
  • wsparcie dla projektów budowanych z użyciem pkg-config

(de facto szukałem sobie dobrego środowiska dla Paska TVN24 i innego prywatnego projektu)

Zacznijmy więc od początku... każde wymienione środowisko starałem się zbadać w miarę dokładnie, wliczając wtyczki i tym podobne.

Anjuta - środowisko dedykowane GTK+ i GNOME, zintegrowane z Glade. Niestety, strasznie niestabilne, no i wsparcia dla projektów autoconf/automake nie zauważyłem

Gedit - zasadniczo 'notatnik' dla Gnome. Po dodaniu paru wtyczek staje sie całkiem znośnym środowiskiem developerskim. Buduje się ręcznie (terminal w panelu). Na razie właśnie jego używam.

Monodevelop - niestety, wsparcia dla C nie stwierdziłem. Autotools też nie.

Eclipse - wspierana przez IBM potężna kobyła, zorientowana na Javę, sporo wtyczek i tym podobnych. Niestety, brak wsparcia dla autotools.

NetBeans - produkowany przez SUNa, też potężna kobyła, zorientowana głównie na Jave. Po zainstalowaniu wtyczek, ma niezłe wsparcie dla C oraz projektów autotoolsowych. Ale nie uprzedzajmy faktów ;) (ponownie je przetestuję jak wyjdzie wersja 6.0)

Kdevelop - środowisko developerskie zorientowane na KDE. Spore rozmiarami, z zadziwiająco dobrym wparciem dla GTK+ ;). Świetnie wspiera C, a projekty Autotoolsowe maja naprawdę świetne wsparcie. Zasadniczo mój wybór, tylko muszę się z nim lepiej zapoznać.

Pfff.... Ominąłem VI(M)a z powodu wrodzonego wstrętu (używam tylko jeżeli nie mam innego wyboru). Emacsa nawet nie dotykałem bo combosy za trudne ;)

Hmm... coś jeszcze sprawdzić?

19 komentarzy

Czasami zdarza się, że od sieci odgradza nas nie dość że faszystowski, to upierdliwy firewall. No ale na wszystko są sposoby.

Obecnie wkurza mnie firewall który całkowicie odcina od sieci, dający tylko HTTP proxy. Do tego proxy ma wycięte pewne adresy (i kategorie). Youtuba jeszcze mogę przeżyć, ale free.fr już mi brakuje. Do tego ograniczenia wielkości ściąganych plików, blokada addons.mozilla.org i inne kwiatki

Wziąłem się więc do przebijania. W moim rozwiązaniu potrzebny jest serwer gdzieś w sieci, do którego mamy nieograniczony dostęp. Oto dlaczego.

Proxy które mnie tak irytuje, przepuszcza jedynie ruch na portach 80 i 443. Dla nieznających się: 80 to standardowe HTTP, 443 to HTTPS.

W moim rozwiązaniu, posłużyłem się portem 443. Ponieważ nie mam na serwerze żadnej usługi chodzącej na nim, po prostu przekonfigurowałem serwer SSH aby chodził na tym porcie.

I... to już praktycznie wszystko. Jeżeli tylko proxy przepuszcza ruch po 443, to jesteśmy w domu, i możemy zrobić co chcemy. No ale kontynuujmy.

Na serwerze instalujemy Squida. Squid to proxy HTTP. Domyślna konfiguracja zazwyczaj jest dla nas wystarczająco dobra. Co najwyżej zmieńmy adres IP i port na którym Squid ma słuchać. IP ustawmy na 127.0.0.1, port na... dowolny powyżej 1000, np. 1234.

Dalej, posłużymy się programem Putty. Nie ważne czy pod Linuksa czy pod Windows. Pomoże on nam stworzyć niezbędne tunele.

Odpalamy Putty, i konfigurujemy połączenie do naszego serwera (pamiętajmy o porcie:

zrzut1

Następnie, przechodzimy do ustawień proxy:

zrzut2

Teraz, rozwijamy SSH i wybieramy Tunnels (w source port wpisujemy port który przydzieliliśmy Squidowi):

zrzut3

Możemy jeszcze włączyć opcję 'pingowania' co jakiś czas serwera, jeśli nie ma ruchu (żeby proxy nas nie rozłączyło), ale to już znajdźcie sobie sami :P. Zapisujemy ustawienia, odpalamy i logujemy się.

Teraz otwieramy naszą ulubioną przeglądarkę internetową, i ustawiamy proxy w następujący sposób:

zrzut4

No i teraz, wszystko co będziemy w przeglądarce otwierać, będzie naszym tunelem przechodzić do Squida na serwerze, i dalej w świat. Lokalne proxy zupełnie nie będzie wiedziało co się dzieje, bo wszystko jest szyfrowane, i jedyne co zaobserwuje to ruch w sieci.

Rozwiązanie niby kompletne, ale można je polepszyć. Po co cały ruch puszczać przez zdalny serwer, skoro lokalne proxy też trochę puszcza. Niestety, przeglądarki internetowe oferują tylko niewielką konfigurację proxy (1 proxy i lista wykluczeń). Jeżeli jednak jesteśmy użytkownikami Firefoxa, możemy skorzystać z dodatku FoxyProxy, który pozwala wybierać proxy na podstawie adresu URL. Konfigurujemy je tak, że cały ruch domyślnie idzie przez lokalne proxy, a jeżeli zauważamy że coś jest blokowane, to puszczamy to w regułę od tunelu. No ale to już zadanie domowe dla czytelnika :)

P.S. Pamiętaj - żeby to działało, musisz mieć odpalonego Putty z tunelem.

11 komentarzy

Tym razem szybki bugfix release :)

Do poprzedniego wydania zakradło się kilka błędów które były na tyle istotne, że oto jest bugfix release. Podziękowania tradycyjnie dla Białego za pomoc i wsparcie :)

Poprawione bugi:

  • poprawka domyślne akcje panelu, SHIFT-lpm, ALT-lpm, itp.
  • poprawka niezapisywanie ustawień wybranych czcionek
  • poprawka literówka przy kompilacji pod starszym gtk
  • poprawka wysypywanie się przy zbyt dużej czcionce

Źródło, paczka dla Ubuntu Gutsy i386. Jeśli ktoś przekompiluje dla innego systemu/platformy, proszę podesłać, zamieszczę.

Zapraszam do używania/testowania!

17 komentarzy

Instalator sterowników Nvidii dla Linuksa zawiera błąd, który może spowodować błędną instalację.

Błąd objawia się w przypadku jeżeli w dowolnym podkatalogu /usr (lub /usr/lib, dokładnie nie sprawdziłem) posiadamy dowiązanie symboliczne do /tmp. Na początku instalacji, instalator rozpakowuje się do katalogu w /tmp. Później, podczas instalacji, program instalacyjny wyszukuje w systemie plików ewentualne stare/konfliktujące wersje i je usuwa. Ponieważ nie zważa specjalnie na dowiązania symboliczne, w tym momencie usuwa swoje własne pliki. Później mamy już tylko malownicze komunikaty błędów o nieznalezieniu niezbędnego pliku.

Rozwiązania tego problemu są dwa:

  1. na czas instalacji usunąć z /usr (i podkatalogów) dowiązania do /tmp (te zastosowałem i u mnie zadziałało
  2. rozpakować instalator samodzielnie i uruchamiać z samodzielnie rozpakowanej kopii (z tym miałem problemy, ale to raczej przypadłość mojego systemu, jednak nie mogę ręczyć że to poprawnie zadziała

P.S. Zgłosiłem błąd na forum Nvidii, oczywiście. Już nawet odpowiedzieli.

4 komentarze

Creative Commons License Powered by Jogger.PL and Tarski · Ported by alberht (ze zmianami)