
Wycofywanie zmian w Subversion można podzielić na dwie kategorie. Pierwsza to wycofywanie zmian lokalnych, jeszcze przed wysłaniem do repozytorium. Druga to odwracanie zmian już zatwierdzonych.
Wycofywanie lokalne
Anulowanie zmian w kopii lokalnej jest w miarę proste i intuicyjne. Wykorzystujemy tutaj podpolecenie revert, po którym podajemy nazwę pliku lub maskę. Opcją którą właściwie trzeba znać jest -R, która włącza wycofywanie rekursywne. Przykłady:
Anulowanie zmian w pliku ‘playground’:
svn revert playground
Anulowanie wszystkich zmian w projekcie (uruchamiane w głównego katalogu):
svn revert -R *
Wycofywanie zmian z repozytorium
W Subversion de facto nie da się wycofać zmiany już zatwierdzonej. Zamiast tego można jednak zatwierdzić zmiany odwrotne do wprowadzonych. Efekt będzie taki jak zamierzony, jednak „wadliwe” zmiany zostaną w historii. Dlatego konieczne jest tutaj użycie podpolecenia merge a nie revert, które, patrząc na nazwę, wydawało by się bardziej intuicyjne.
Jak statyczne zmienne działają?
Wielu z nas jest przyzwyczajonych do tego, że elementy oznaczone jako statyczne to coś co występuje tylko w klasach. Jednak słówka static można również użyć w zwykłej funkcji do oznaczenia zmiennej. Czym się różni zwykła zmienna od statycznej?
Wartość statycznej zmiennej jest inicjowana za pierwszym wywołaniem funkcji i zapamiętywana pomiędzy jej kolejnymi wywołaniami. Czyli zachowuje się zupełnie podobnie do klasowych zmiennych statycznych, tyle że nie za bardzo jest do niej dostęp z zewnątrz.
Gdzie to się może przydać?
1. Licznik wywołań funkcji.
Sztandarowym przykładem wykorzystania statycznych zmiennych w funkcji jest licznik jej wywołań, raczej rzadko wykorzystywany w praktyce.
function say_hello_and_count_yourself() { static $counter = 0; echo "Hello! I've already said this ".$counter++." time(s)."; }
Prawie miesiąc temu zapraszałem Was na różne wydarzenia związane z JavaScriptem, które miały odbyć się tej jesieni. W dwóch z nich miałem brać udział jako uczestnik – to jest na DevMeetingach w Poznaniu i Krakowie. Poznań mamy już za sobą, a w Krakowie nastąpi mała zmiana – zamiast uczestnikiem, będę prowadzącym.
Ekipa organizująca szkolenia zwróciła się do mnie z prośbą, bym zastąpił Davida, któremu wypadły pilne sprawy. Nie mogłem odmówić i zabrałem się za przygotowania. Czego możecie się spodziewać? Na pewno szkolenie będzie kręciło się w okół Node’a i middle-endu. W związku z obserwacjami dotyczącymi problemów, jakie z SSJS mieli uczestnicy warszawskiego meetingu, postaram się wyjaśnić, jak organizować kod, radzić sobie z asynchronicznością, czy pisać przenośne moduły w standardzie CommonJS. Poruszę więc kwestię odmiennych charakterystyk przeglądarkowego i serwerowego JavaScriptu. Wstęp ten przyda się do zadań praktycznych, które tak jak na pozostałych jesiennych meetingach będą kluczowym elementem Krakowskiego szkolenia.
Rejestracja jest darmowa i jeszcze otwarta. Do zobaczenia w Krakowie :)
JavaScript na jesień 2011
Nieubłaganie zbliżamy się do końca lata, a na pewno letniej pogody. Warto więc zaplanować sobie kilka indoorowych imprez. Oto moje propozycje:
DevMeetings – hot topics

Na początku lata ekipa z DevMeetings zorganizowała trzydniowy DevCamp, na którym wykrystalizowały się trzy ciekawe backendowe tematy. Teraz nadszedł czas, aby przyjrzeć im się dokładniej. I tak odbędą się po kolei:
Co lepiej wiedzieć o JavaScriptcie cz.2.: hoisting, deklaracje funkcji i wyrażenia funkcyjne
W poprzednim artykule pokazałem czym się różni zasięg blokowy od funkcyjnego, jakie problemy może spowodować ten drugi i jakie są plany na przyszłość. Wspomniałem też o zasięgu statycznym, czyli o domknięciach.
W tym artykule chciałbym wyjaśnić czym jest hoisting i porównać deklaracje funkcji (function declarations) z wyrażeniami funkcyjnymi (function expressions). Zauważyłem, że są to tematy obce wielu programistom JavaScript i myślę, że o ile test z poprzedniego artykułu wielu z Was nie powinien sprawić problemu, o tyle poniższy ma szansę być małym zaskoczeniem. Taką mam przynajmniej nadzieję :).
Źródła z których korzystałem, umieściłem na końcu wpisu.
Sprawdź się!
Spróbuj rozpoznać co wydrukuje każde wywołanie console.log. Skrypt z wszystkimi pytaniami, wraz z odpowiedziami wrzuciłem na Gista.
