Od zarania dziejów ludzie zastanawiali się jak ominąć problem wzajemnych zależności w C++. No może nie do końca od zarania dziejów i raczej nie wszyscy ludzie - ale to był problem "od zawsze"
Najpopularniejszym rozwiązaniem jest zadeklarowanie jednej klasy przed drugą:
Ostatnio bawię się w rozwijanie własnego systemu operacyjnego. Wspaniała sprawa jeśli ktoś myśli, że wszystko wie ;)
W trakcie wyszło na jaw, że muszę zaimplementować synchronizowany zbiór (dokładniej rzecz biorąc - nieużywanych stron). Ale czekanie na mutexie nie wydaje się optymalną strategią. Poszukałem więc algorytmów lock-free. Na początek przyszedł stos.
Jak ważne jest reguralne używanie tego narzędzia:
% git count-objects
67 objects, 268 kilobytes
% git gc
Counting objects: 2418, done.
Compressing objects: 100% (969/969), done.
Writing objects: 100% (2418/2418), done.
Total 2418 (delta 1426), reused 2343 (delta 1371)
% git count-objects
78 objects, 312 kilobytes
Od dawna (ponad miesiąc) nie pisałem - może czas zamieścić coś
Pisałem dla zabawy GC i natrafiłem na problem - ciekawi jak zostały rozwiązane u innych (zaznaczam - całą wiedzę jaką na ten temat posiadam biorę z sieci. Jeśli w tym tekście są jakieś głupoty to bardzo przepraszam i proszę o wskazanie ich - ja się dopiero uczę). Mamy 3 obiekty: A, B i C. A korzysta z B, B z C a C z A. W jakiej kolejności wykonać destruktory?
Mimo że Subversion miało być lekiem na całe zło - szczególnie spowodowane przez CVS - to niestety nim nie jest. Nowoczesne systemy kontroli wersji mają wiele zalet. Dodatkowo nigdy nie spotkałem w nich błędów. W ostatnim moim projekcie mimo 34 rewizji(w tym 5 bezsensownych by obejść błąd SVN) błędy występowały kilkukrotnie.
Do popularnie wyskakujących błędów SVN u mnie należy 'SVN: out of data'. Co dziwniejsze operuje na file://, więc żadnych różnic czasowych nie powinno być. Jestem jedynym użytkownikiem tego repozytorium - zresztą wykonywałem przy tym svn update.
Czyli dlaczego autotools są najgorsze ale lepszych nie ma.
Autotoolsy jakie są każdy widzi. Są niezbyt łatwe do nauczenia się, ciężkie, sprawdzają masę niepotrzebnych rzeczy (np. czy to nie jest egzotyczny system, który miał 1 użyszkodnika pięć lat temu ;) ). Jednak mają kilka, niezastąpionych cech:
./configure && make && sudo make installChciałem zrobić check-in online. Lot był w British Airways a osoba której robiłem check-in miała nieszczęście mieć w nazwisko składające się z 21 znaków (maksymalnie może być 20). Próbowałem na różne sposoby - tylko litery (bez myślnika tak jak przysłali przez SMTP), tylko pierwszych 20 znaków. Nawet (nie wiem czy to legalne, ale nic mnie to nie obchodzi) zmieniłem firebugiem limit do 21 - ale wciąż pokazywało, że złe nazwisko. Oczywiście w końcu został przekroczony limit i zablokowało możliwość.
Oczywiście nigdzie nie jest napisane co w takiej sytłacji robić. Nigdzie nie znalazłem możliwości skontaktowania się w sprawie strony (tylko i wyłącznie w sprawie lotniska/lotu itp.). Linia telefoniczna, na którą chciałem zadzwonić, działa 9-17 od poniedziałku do piątku... też bym tak chciał - uczących się nie obowiązuje prawo pracy jeśli chodzi o naukę ;). W FAQ'u też nie ma odpowiedzi. Ktoś zna sposób na przyszłość?
Chciałem zobaczyć jak teraz robi się tzw. tray icon. Okazało się że w około 15 linijkach pythona mozna to zrobić(razem z 'Quit'):
Umieściłem wersję 0.0.1 na lauchpadzie. W międzyczasie wyszło kilka wydań. Obecne są dwa milestony nazwane roboczo 0.0.10 i 0.0.15. Kłopot polega na tym, że zbliża się wersja 0.0.5 która, jak wszystko się uda, będzie zawierała wszystkie wymagania dotyczące 0.0.10.
Ostatnio programuje w Ruby używając Railsów. Próbuje trochę metaprogramować - używając czegoś podobnego do scaffoldu.
Trafiłem ostatnio na ciekawą stronę (mniejsza z tym jaką). Admin dał tylko kilka prób na zalogowanie się na forum (Tak... Na pewno wszyscy mażą żeby włamać się na moje konto...), żeby pobrać plik(nie dało się bez rejestracji). Potem konto jest zablokowane na 15 minut - w teorii. W każdym razie po pół godziny nie dało się zalogować. Stworzyłem nowe konto, loguje się i... plik który godzinę wcześniej ściągał się wyparował.
Najciekawsze jednak jest to, że webmaster słyszał wprawdzie o zasadach bezpieczeństwa ale o szyfrowaniu już nie.
Często się mówi, że tabela jest wyklęta. To nie prawda - tabela powinna być wyklęta jako sposób projektowania stron/formularzy a nie jako sposób prezentacji danych, który w sposób naturalny są tabelami. Idąc tym tropem W3C zabroniło stosowaniaznacznika <form> w <tbody> i <tr>.
Wszystko by było w porządku, gdyby nie przyszło mi do głowy zaprezentować danych jako tabela. Na razie wszystko gra. Wpadłem na prosty pomysł - zastosowanie ostatniego pola jako pola dodawania nowego rekordu:
Usłyszałem, że Netbeans (6.0), które IMHO rozwija się znacznie szybciej niż eclipse, ma wsparcie dla Ruby on Rails. Postanowiłem przekonać się na własne oczy...
Gcj nie tolerował flag -Os -march=pentium-m -mmmx -msse -msse2 -mfpmath=sse -pipe -momit-leaf-frame-pointer -ggdb. Skompilował się jednak z -O0 -ggdb. Na razie sprawdzam, co w budowie przeszkadza dodając flagi po koleji (trochę to trwa, ale optymalizacja jest wysoce wskazana...).
Żeby poprawić sobie humor ponarzekam na wolne IDE. Przedewszystkim na to, że zbytnio skupiają się na jednym języku. Zgodzę się, że filozofia "rób jedną rzecz dobrze" jest potrzebna ale nie wtedy gdy musimy połączyć kod w dwóch językach.
Tyle mówi się o RoR jednak IMHO należałoby także wspomnieć osobno o sercu - ActiveRecord.
Dzięki jQuery. Jest również o połowę krótszy.
Przesiadam się na JQuery. Niestety nie miałem czasu przetestować. Z góry przepraszam, jeśli coś nie będzie działało (właśnie się ładuje a ja przechodzę w stan hibernacji
Szukam dobrego frameworku AJAX. Który?
Subclipse (instalowane kilkakrotnie z strony domowej) nie chcę działać - nie znajduje swoich klas (eclipse wie, że jest to zainstalowane, a nie uruchamia).
Piszę kod w Javie:
W Javie 1.5 mamy lepiej
A czy nie prościej by było to opisać jako:
private Listener listener = new proxyListener();
@ProxyCollection(listeners)
private class proxyListener implements Listener {}
private Set<Listener> listeners;
Nie upieram się przy znaku at(już wykorzystanym), może to być & lub $ (którego i tak nie można wykorzystać). Oczywiście wszystko na poziomie kompilacji...
Czy ktoś może powiedzieć, jak podobny kod wygląda w ruby(tzn. weduk filozofii ruby i w ruby)?
Mam szczęście być na wakacjach. Niestety jestem uzależniony od jedynego słusznego systemu operacyjnego z jego przeglądarką.
Instalowanie i ściąganie środowiska pracy trochę zajmuje. Może kupię po prostu pendrive i zainstaluję:
Czy 512 MB wystarczy?
Zbudowałem eclipse 3.2. Trwało to prawie 48 h, ale warto było - działa jak rakieta, można spokojnie pracować. Zajmuje chyba też dużo mniej pamięci. Nie wiem czy to zasługa nowej wersji, czy gcj.
Przy okazji pobiłem rekord zajęcia pamięci ponad 350% (tzn. 100% = 512 MB, a 1,3 GB (lub więcej) siedziało na swapie):
Ostatnio kupiłem sobie książkę o Java 1.5 Tiger (na temat nowości).
Doszedłem do wniosków, że większość z tego, co wprowadzili, było w C++ (czy nawet w C) i... zostawało przez programistów Java od czci i wiary (typy generyczne, printf) albo w ogóle pominięte (enum). Część to transportacja z .Net różnych rzeczy (adnotacje, for/in).
Java uległa 'skomplikowaniu' przez co... łatwiej się pisze(bezpieczniejsze typowanie, wyłączenie warringów, łatwiejsze formatowanie stringów...).
Pozdrawiam.
Zależało mi na na włączeniu do QT 4.0 możliwości robienia prania i gotowania, ale zdecydowaliśmy, że te funkcje warto pozostawić do rozważenia dla przyszłych wersji
Gnome nie zrobiłby tego w gtk+ - utworzyłby projekt ghome z bibliotekami np. gwash i gcook, co pozwoliłoby utrzymać spójność i prostotę przy dodawaniu nowych możliwości.
Oto krótka znajomość z anjutą:
Spróbuje z CVS. I gnome dziwi się, że potrzebuje developerów?
Oprogramowanie obiektowe jest 'super'. Do wszystkiego(przykład PHP) dodaje się obiekty. Czy jednak aby zawsze jest to słuszna droga?
Nie da się zaprzeczyć, że w kilku dziedzinach jest to słuszne podejście(GUI), ale czy jednak zawsze?
Oprócz sprawdzania typów(w kompilatorach innych niż gcc) co zyskaliśmy?
int fd w uniksach nie zawsze jest plikiem.Często mówi się o programowaniu modułowym, gdzie zmiana jednego elementu wpływa na drugi. Odpowiedzią na to jest tylko to, że można porównywać zły kod modułowy z dobrym kodem obiektowym. W programowaniu funkcyjnym mamy tak hermetyczne funkcje, że nie mogą one nic zmieniać poza.
Zupełnie też nieznanym, ale dosyć ciekawym podejściem, jest programowanie logiczne. Połączenie tego z obiektami zaowocowałoby jakimś gniotem lub językiem UF.
Wymagania dla Idealnego IDE:
Po kolei punkty. Bez pkg-config dosyć trudno obsługiwać biblioteki Gnome(dodano np. Cairo w zależności Gtk i już kompilacja się sypie). Lubię tworzyć biblioteki a nie binarki all-in-one. Gtk ładnie skomponuje się w Gnomie, czego nie można powiedzieć o QT(jest Gtk-Qt a nie ma QTK ). W GObject jest trochę mechanicznej pracy(_GET_TYPE ect.), którą można zautomatyzować. Na koniec - większość ludzi jest przyzwyczajona do ./configure && make && su - -c 'make install'.
W Anjucie(2) nie odkryłem dobrego sposobu tworzenia bibliotel. W KDevelop nie znalazłem pkg-config, gtk+, gobject. Za powiadomienia będę wdzięczny.