Integracja Open Power Template 2.0 z KohanaPHP 2.2 / 2.3

posted on Styczeń 18th, 2009 ·

Open Power Template w wersji 2.0 ma się coraz lepiej. Niedawno wyszła jego pierwsza wersja beta. Wraz z wersją dev8 zdecydowałem się wykorzystać OPTv2 w produkcji, ponieważ składnia została już zamrożona – jeśli wierzyć zapewnienion Zyx’a ;-).

Odpowiedni moduł do integracji napisałem już wcześniej, jednak dopiero dzisiaj go publikuję. Tak samo, jak w przypadku modułu dla OPTv1, tak i dla OPTv2 składnia pozostaje zgodna z interfejsem oryginalnego View:

$view = new View('szablon.tpl');
$view->dynamic = 'And this is a dynamic.';
$view->render(TRUE);

Wybór silnika przetwarzania szablonów (natywny KohanaPHP lub OPT) dokonywany jest poprzez rozszerzenie szablonu. Wystarczy do nazwy szablonu dodać rozszerzenie OPT, aby właśnie OPT został użyty do wygenerowania widoku. Rozszerzenie można oczywiście określić w pliku konfiguracyjnym.

Moduł OPTv2:

Uwaga. W wersji OPT2-beta1 jest mały błąd – OPT wyrzuca błąd typu notice podczas przetwarzania szablonu. Drobiazg, ale KohanaPHP ma domyślnie takie ustawienie, że nawet notice uznawany jest jako błąd (zresztą słusznie). W związku z tym mój moduł używa domyślnie OPT2-dev8. Dla tych, którzy chcą używać OPT2-beta1:

  • usunąć katalog vendor/opt2
  • zmienić nazwę katalogu vendor/opt2-beta1 na vendor/opt2
  • zmienić error_reporting w pliku index.php na E_ALL ^ E_NOTICE

Stworzyłem też moduł obsługujący jednocześnie OPTv1 oraz OPTv2. Dla nowych użytkowników OPT nie jest on zalecany. Ja z niego korzystam, ponieważ szablony dla starszych modułów są napisane w składni OPTv1, zaś nowsze w OPTv2. Przepisać te dwieście plików do OPTv2? Nie, dziękuję. ;-)

Moduł OPTv1/v2:

→ 14 CommentsTags: PHP · Programowanie

Wprowadzenie do Smalltalka

posted on Styczeń 15th, 2009 ·

Niedawno, w ramach zajęć z przedmiotu Języki programowani na mojej uczelni miałem przyjemność poznać w pełni obiektowy język programowania Smalltalk.

Pierwsze wrażenie

Pierwszym akronimem, który rzucił się do głowy po kilku minutach patrzenia na przykład kodu napisanego w Smalltalku, był wtf ;-) Wszystko przez składnię. Od dziecka mamy tylko styczność z kodami podobnymi albo do Pascala (Ada, Python) albo do C (PHP, Java). Smalltalk raczy nas całkowicie odmienną składnią, zatem aby zacząć cokolwiek w nim pisać, trzeba spędzić trochę czasu na zrozumienie zasad. Zwłaszcza, że polski internet nie powie nam praktycznie niczego mądrego na temat składni Smalltalka.

Wielokat subclass: #Trojkat
        instanceVariableNames: ''
        classVariableNames: ''
        poolDictionaries: ''
        category: 'JezykiProgramowania'!

!Trojkat methodsFor: 'initialize-release'!

        initialize: bok
                "Tworzy trójkąt równoboczny o podanym boku"

                | h |
                h:=bok * 3 sqrt / 2.
                super initialize: 3 name: 'Trojkat'.
                wierzcholki at: 2 put: bok@0.
                wierzcholki at: 3 put: bok/2@h.
        !
!

| t |
t:=(Trojkat new) initialize: 10.

Wyjaśnienie składni

Z góry ostrzegam, iż moje wyjaśnienie składni na pewno nie jest kompletne, ani w 100% poprawne. Przedstawiam tylko własne doświadczenia z poskramiania składni Smalltalka. Przepraszam za słownictwo, które będą używał. Nie będzie ono specyficzne dla Smalltalka, tylko języków spokrewnionych z C++ i Javą.

Poloneza czas zacząć. Zadeklarujmy klasę wielokąt dziedziczącą po klasie bazowej Object.

Object subclass: #Wielokat
        instanceVariableNames: 'wierzcholki nazwa '
        classVariableNames: ''
        poolDictionaries: ''
        category: 'JezykiProgramowania'
!

instanceVariableNames definiuje nazwy wszystkich tzw. „zmiennych wystąpienia”, skądinąd znanych jako properties. classVariableNames odnosi się do zmiennych klasowych, znanych z języka C++ jako statyczne.

Mamy klasę, więc pora na konstruktor.

!Wielokat methodsFor: 'initialize-release'!

    initialize: liczbaWierzcholkow name: nowaNazwa
        "konstruktor tworzy nowy obiekt wielokąta"

        nazwa:=nowaNazwa.
        wierzcholki:=Array new: liczbaWierzcholkow.
        wierzcholki at: 1 put: 0@0.
    !

!

Do metod typu „initialize-release” zaliczają się konstruktory i destruktory. Tajemnicze wykrzykniki zamykają nam sekcje (i czasem też otwierają). Wcięcia kody wykonałem w taki sposób, aby łatwo zrozumieć działanie wykrzyknika. Przypomina on tutaj działanie { i } z języka C. Każde wyrażenie jest zakończone kropką, co jest ekwiwalentem średnika w językach podobnych do C. Poprzez „initialize: liczbaWierzcholkow name: nowaNazwa” zadeklarowaliśmy nową metodę, która przyjmuje dwa parametry – „initialize” oraz „name”. Ciąg znaków w cudzysłowach to komentarz. Dalej napotykamy na „wierzcholki:=Array new: liczbaWierzcholkow”. Tworzymy nowy obiekt typu Array o określonej wielkości. W pierwszym elemencie tablicy umieszczamy współrzędne x oraz y wierzchołka (x@y). W Javie byśmy napisali wierzcholki[0] = new Point(0, 0).

!Wielokat methodsFor: 'accessing'!

    nazwa
        "Podaje nazwę wielokąta"
        ^nazwa
    !

    nazwa: nowa_nazwa
        "Ustawia nazwę wielokąta"
        nazwa:=nowa_nazwa
    !

!

Metody typu „accessing” to metody dające dostęp do domyślnie prywatnych zmiennych wystąpienia (properties). Metoda „nazwa” bez parametrów zwraca nam nazwę figury – wartości zwracamy operatorem ^. Dodanie parametru przy wywołaniu metody „nazwa” spowoduje ustawienie nowej nazwy.

Mamy już klasę figura, pora więc stworzyć trójkąt, która dziedziczy implementację po wielokącie.

Wielokat subclass: #Trojkat
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'JezykiProgramowania'
!

!Trojkat methodsFor: 'initialize-release'!

    initialize: bok
        "Tworzy trójkąt równoboczny o podanym boku"

        | h |
        h:=bok * 3 sqrt / 2.

        super initialize: 3 name: 'Trojkat'.
        wierzcholki at: 2 put: bok@0.
        wierzcholki at: 3 put: bok/2@h.
    !

!

Zapis | h | oznacza deklarację zmiennej lokalnej o nazwie „h”. Nie jest to niestety obliczenie wartości bezwzględnej z liczby h ;)

!Trojkat methodsFor: 'actions'!

    pole
        "Liczy pole trójkąta równobocznego"
        ^(wierzcholki at: 2) x squared * (3 sqrt) / 4.
    !
!

Metody typu „actions”, to wszystkie typowe metody, które wykonują dla nas jakieś czynności i zwracają jakiś wynik. Zapis liczba squared w Smalltalku oznacza to samo, co liczba.squared() w językach C-podobnych.

Przy okazji należy też zwrócić uwagę na priorytety operatorów. W Smalltalku nie działają one zgodnie z regułami matematyki, lecz w ogólnym przypadku od lewej do prawej (gwoli ścisłości – istnieją jakieś priorytety, jednak nie wiadomo mi zbyt wiele na ich temat).

Nie jest to jednak nielogiczne. Bierze się to stąd, że dodawanie również jest metodą. liczba:=2 + 3 * 4 można by przełożyć taki pseudokod: liczba = 2.dodaj(3); liczba = liczba.pomnoz(4);.

Zapis 3 sqrt nakazuje liczbie 3 obliczenie swojego pierwiastka i zwrócenie go. Widać więc, iż „zwykły int” jest również obiektem. Zapis (wierzcholki at: 2) x oznacza nic innego, tylko wierzcholki[1].x. Zrozumienie tego zapisu zajęło mi prawie godzinę ;-)

Teraz dodajmy działania na naszym trojkącie.

!Trojkat methodsFor: 'arithmetic'!

    + figura
        "Dodaje dwie figury w sensie pola"

        | p b |

        p:=self pole + figura pole.
        b:= (4 / 3 * p * (3 sqrt)) sqrt.

        ^(Trojkat new) initialize: b.
    !

    - figura
        "Odejmuje dwie figury w sensie pola"

        | p b |

        p:=self pole - figura pole.

        (p < 0)
            ifTrue:
            [
                p:=figura pole - self pole.
                ^(Trojkat new) initialize: (4 / 3 * p * (3 sqrt)) sqrt.
            ]
            ifFalse:
            [
                ^(Trojkat new) initialize: (4 / 3 * p * (3 sqrt)) sqrt.
            ]
    !

Metody typu „arithmetic” stanowią przeciążenie operatorów arytmetycznych funkcji – dodawania, odejmowania, mnożenia, dzielenia i pewnie innych, których istnienia nie jestem świadom ;) Nie wiem, czy operatory porównania (np. „<”) to również operatory arytmetyczne, czy może inne, ale je również da się przeciążyć. Zapisem (p < 0) nakazujemy obiektowi p porównać się z liczbą 0 (która też jest obiektem). Następnie w zależności od wyniku porównania wykonujemy odpowiednie czynności. W moim przykładzie nie chcę zwracać ujemnej wartości, w związku z czym liczę nową wartość p, odejmując tym razem liczbę mniejszą od większej.

Wypadałoby powiedzieć trochę więcej na temat bloków kodu. Blok kodu zamknięty pomiędzy znaki [ oraz ] to specjalna klasa o nazwie BlockClosure. Dzięki niej można uzyskać współbieżność, jeśli na końcu bloku dodamy słowo kluczowe fork. Tak mówi teoria i pan profesor na wykładzie, jednak mi nie udało się uzyskać tego ;) Pewnie zbyt mało próbowałem albo wykonuję jakiś błąd syntaktyczny.

Dokończmy działania na trójkącie i pokażmy, czy program żyje.

    * figura
        "Mnoży dwie figury w sensie pola"

        | p |

        p:=self pole * figura pole.
        ^(Trojkat new) initialize: (4 / 3 * p * (3 sqrt)) sqrt.
    !

    / figura
        "Dzieli dwie figury w sensie pola"

        | p |

        (figura pole = 0)
            ifTrue:
            [
                ^0.
            ]
            ifFalse:
            [
                p:=self pole / figura pole.
                ^(Trojkat new) initialize: (4 / 3 * p * (3 sqrt)) sqrt.
            ]
    !
!

| t |
t:=(Trojkat new) initialize: 10.
Transcript show: ('Powinno wyjsc cos kolo 43') printString; cr.
Transcript show: (t pole) printString.

Klasa Trascript służy do wypisywania danych na konsolę. Może wygląda troszkę dziwacznie, no ale cóż zrobić. cr odpowiada za znak nowej linii.

Mam nadzieję, że moje amatorskie wprowadzenie do Smalltalka pomoże komuś przełamać pierwsze lody przy poznawaniu tego ciekawego języka.

Odwiedź również:

→ 3 CommentsTags: Programowanie · Ynne

Dokumentacja off-line KohanaPHP

posted on Styczeń 4th, 2009 ·

Jako że developerzy frameworka KohanaPHP nie udostępniają nigdzie paczki z dokumentacją off-line, postanowiłem sam wykonać zrzut dokumentacji. Tłumaczą to faktem, że dokumentacja jeszcze nie jest ukończona… Patrząc na tempo, w jakim uzupełniają dokumentację raczej nigdy nie będzie :)

  1. kohanaphp-offline-documentation-2009-jan.7z
  2. kohanaphp-offline-documentation-2009-jan.tar.bz2
  3. kohanaphp-offline-documentation-2009-jan.tar.gz
  4. kohanaphp-offline-documentation-2009-jan.zip

Umieszczam też dokumentację w wersji on-line. Zdarza się, że czasami dokumentacja bezpośrednio z ich serwera nie działa (przeciążenia?). Może komuś się przyda:

→ 2 CommentsTags: PHP

OPTv2 tak samo wydajny, jak OPTv1

posted on Listopad 24th, 2008 ·

Kilka dni temu Zyx zakomunikował światu, iż Open Power Template został prawie ukończony. Wydana została ostatnia wersja developerska (2.0.0-dev8). Jeśli wierzyć zapewnieniom Zyxa, zostało mu już tylko napisać kilkaset testów PHPUnit. Wtedy będzie wiadomo, czy 2.0.0-dev8 stanie się finalną wersją, czy wyszły na jaw jakieś błędy ;)

Gdy Zyx pracuje, Nowaker zastanawia się nad wydajnością nowego OPT. Jak wiadomo, OPTv2 jest zgodny ze składnią XML. Chcąc nie chcąc, przetwarzanie XML-a jest zawsze wolniejsze… Ale nie w OPTv2 :) W tym przypadku Zyx dość solidnie zoptymalizował algorytmy przetwarzania szablonów XML-owych.

Wykonałem dwa krótkie testy wydajności na Apache Benchmark (ab -n 1000 -c 10). Pierwszy zawierał tylko jedną zmienną, drugi zawierał dziesięć prostych sekcji. Na jedno wywołanie skryptu PHP generowanych było 30 szablonów – w moich aplikacjach zdarza mi się parsować taką ilość szablonów w trakcie jednego wywołania skryptu. Wyniki:

OPTv1 OPTv2
Test 1 65.27 68.79
Test 2 31.36 30.32

Jak widać, OPTv2 jest prawie tak samo wydajny, jak OPTv1. Różnica między nimi wynosi maksymalnie 5%. Co ciekawe, szablon z sekcjami wykonał się nieco szybciej na OPTv2. Gratuluję :)

Ten mini-benchmark wykonałem z czystej ciekawości. Nawet 3 rzędy gorszy wynik OPTv2 nie zniechęciłby mnie z korzystania z tej biblioteki. Jestem zdecydowanym zwolennikiem pisania kodu na wyższym poziomie abstrakcji, co pozwala skupić się na wydajnym pisaniu kodu, bez zastanawiania się nad sprawami drugorzędnymi.

Odwiedź również:

P.S. Proszę nie sugerować się taką małą ilością żądań na sekundę. Domowy serwer to wiekowy blaszak.

→ 2 CommentsTags: Programowanie · XML

Integracja Open Power Template 1.x z KohanaPHP 2.2

posted on Listopad 6th, 2008 ·

Integracja Open Power Template 1.x z KohanaPHP 2.2

Pół roku temu zamieściłem sposób na integrację systemu szablonów Open Power Template z frameworkiem KohanaPHP. Po pewnym czasie doszedłem jednak do wniosku, iż moje rozwiązanie jest lamerskie ;) Oto zamieszczam moduł integrujący Kohanę z OPT w taki sposób, że z szablonów korzystamy zupełnie tak samo, jak z View.

$view = new View('test.tpl'); $view->dynamic = 'And this is a dynamic.'; $view->render(TRUE);

Wybór silnika przetwarzania szablonów (natywny KohanaPHP lub OPT) dokonywany jest poprzez rozszerzenie szablonu. Wystarczy do nazwy szablonu dodać rozszerzenie .tpl, aby to OPT został użyty do wygenerowania widoku.

Moduł OPT v.1 dla Kohany w skrócie:

  • Takie samo API, jak w View.
  • Dobór silnika przetwarzania szablonów po rozszerzeniu.
  • Kaskadowość systemu plików – szablony mogą się znajdować w różnych katalogach.

Zapraszam do pobierania i korzystania. Moduł został udostępniony na licencji BSD.

→ 6 CommentsTags: PHP

Ratuj Tybet! (c) Bluszcz

posted on Sierpień 11th, 2008 ·

W związku z trwającą właśnie Olimpiadą w Pekinie postanowiłem jeść mniej cukierków. Wierzę, że dzięki tej manifestacji obrony życia, Chiny zaczną respektować prawa człowieka.

Ten wpis jest nawiązaniem do wpisu Bluszcza, który postanowił wyłączyć jeden z większych serwerów Jabbera (jabberpl.org) w Polsce na czas Igrzysk. Gratuluję rozwagi!

→ 3 CommentsTags: Internet

Kohana 2.2 nadchodzi

posted on Sierpień 7th, 2008 ·

Jutro, tj. 8.08.08 zostanie wydana wersja 2.2 frameworka Kohana. Prace nad wersją 2.2 trwały około pół roku. Trudno powiedzieć, by był to czas stracony. Świadczy o tym dużo commitów na SVN i nowa funkcjonalność.

 

Jedną z nowych rzeczy jest napisany całkowicie od nowa ORM (object-relational mapper). Poprzednia wersja miała „nienaprawialny” błąd, który powodował, że nie można było ograniczyć ilości pobieranych pól z powiązanych tabel relacji many to many. Ponadto zoptymalizowano nazwy metod – dotychczas większość metod była wywoływane przez powolne __call().

 

Będąc przy temacie wydajności, to Kohana 2.2 przyśpiesza ze względu na tzw. „internal cache”. Od teraz wszystkie pliki konfiguracyjne są serializowane, przez co nie trzeba ich ładować po kolei. Zwracam tutaj uwagę na kaskadowość systemy plików Kohany, tzn. że najpierw plik konfiguracyjny jest szukany w application/config, potem w modules/config, a na końcu w system/config. W większym projekcie wykorzystuje się często więcej niż 20 plików konfiguracyjnych, a szukanie plików na dysku zabiera cenne sekundy. Co więcej, rezultaty metody find_file() również są umieszczane w pamięci podręcznej. Tymi optymalizacjami Kohana przyśpieszyła trzykrotnie na moim domowym komputerze.

 

Wszystkich zainteresowanych tym, co nowe w Kohana 2.2 odsyłam na bugtrackera projektu.

→ 2 CommentsTags: PHP

Skalowalność systemu na wielu procesorach

posted on Czerwiec 24th, 2008 ·

Na rynku procesorów dla komputerów klasy PC swoje miejsce już dawno znalazły procesory tzw. dwurdzeniowe, a procesory czterordzeniowe stają się coraz tańsze. Procesor wielordzeniowy to de facto układ kilku oddzielnych procesorów o współdzielonej magistrali. Rodzi się pytanie, czy procesor n-rdzeniowy wykona szereg operacji n razy szybciej niż jeden procesor. Jak łatwo się domyśleć, odpowiedź brzmi “nie, jest wykona”.

Oprogramowanie nie jest idealne i nie jest przystosowane do obsługi wielu procesorów. Większość wykorzystywanych przez nas algorytmów ma charakter sekwencyjny, tzn. aby wykonać następny krok, trzeba zakończyć poprzedni. Nawet gdy programista poprawi algorytm tak, aby korzystał z wszystkich procesorów, nigdy nie osiągnie stuprocentowej skuteczności. W praktyce, ta część programu, której nie daje się zrównoleglić wynosi co najmniej 10%. Czy więc procesor 100-rdzeniowy jest tylko 10% wolniejszy od 100 osobnych procesorów? Kolejny raz odpowiadam “nie”.

Gene Amdahl sformułował prawo dotyczące wyznaczania maksymalnego przyśpieszenia programu równoległego w środowisku wieloprocesorowym.

Wzór na przyśpieszenie n to liczba procesorów, a s to procent części sekwencyjnej programu.

Wzór interpretujemy w taki sposób, że zawsze istnieje nierównoległa część programu, w której trzeba oczekiwać na wynik poprzedniej operacji. Niemożliwe staje się więc wtedy przekazanie kolejnego rozkazu innemu procesorowi.

Poniżej przedstawiam teoretyczne przyśpieszenie programu w stosunku do systemu jednoprocesorowego na systemach o różnej ilości procesorów. Wartość dla nieskończenie wielu procesorów została obliczona z granicy funkcji. Testuję kilka programów o różnym procencie zrównoleglenia. Wartość liczbowa wyraża przyśpieszenie w stosunku do systemu 1-procesorowego.

% sekwencyjności 15% 10% 5% 0,1%
1 procesor 1 1 1 1
2 procesory 1,7 1,8 1,9 2
4 procesory 2,8 3,1 3,5 4
8 procesorów 3,9 4,7 5,9 7,9
20 procesorów 5,2 6,9 10,3 19,6
100 procesorów 6,3 9,2 16,8 91
nieskończenie wiele 6,7 10 20 1000

Jak widać, potencjalnie niewielki procent kodu, który nie daje się wykonać równolegle ma bardzo poważne skutki w wydajności programu na większej ilości procesorów. Nawet 99,9% równoległości programu spowoduje teoretycznie wzrost szybkości maksymalnie tysiąckrotnie.

Popatrzmy teraz na benchmark, aby odnieść te teoretyczne obliczenia do rzeczywistości. Bierzemy pod uwagę procesory Phenom X3 8750 oraz Phenom X4 9750. Są one idealne do tego porównania, ponieważ różnią się tylko i wyłącznie ilością rdzeni, podczas gdy częstotliwość taktowania, czy ilość pamięci podręcznej jest taka sama.

Benchmark WinRAR

Jak widać, w żadnym z testów procesor trzyrdzeniowy nie jest półtora razy szybszy od dwurdzeniowego, choć potencjalnie tego byśmy oczekiwali. Jest to potwierdzenie, że rzeczywiście programy testujące nie są do końca równoległe. Przy okazji oceniłem program WinRAR, aby określić, w jakim stopniu algorytm kompresujący jest napisany równolegle. Wynik to ok. 90%.

W teście nie brałem pod uwagę strat wydajności wynikających z konstrukcji sprzętu, np. zapychania się magistrali między procesorami, problemów z zachowaniem spójności danych w poszczególnych L1 cache z pamięcią RAM, czy podziałem wątków na procesory (system operacyjny).

Powiązane:

→ 2 CommentsTags: Programowanie · Ynne

Bezpieczeństwo SSH to walka, więc ulepsz sshd_config dla szatana!

posted on Czerwiec 17th, 2008 ·

Bardzo wiele serwerów korzysta z protokołu SSH do udostępniania powłoki. Wszyscy wiedzą, że jest to protokół bardzo bezpieczny. Mniej osób zdaje sobie sprawę z tego, że najsłabszym ogniwem w systemie zabezpieczeń systemów jest użytkownik i jego hasło. Postaram się przedstawić kilka prostych sztuczek jak uczynić SSH chociaż trochę bezpieczniejszym.

1. Domyślny port, na którym działa SSH to 22. Dobrym pomysłem jest przenieść SSH na port powyżej 1024. Unikniemy w ten sposób znakomitą większość ataków, jaką są ataki słownikowe. W większości są to niegroźne próby zalogowania się przy użyciu haseł pobranych ze słownika. Jednak gdyby jakimś cudem hasło, któregoś z użytkowników znalazło się w takim słowniku sytuacja przestałaby być mało groźna. Alternatywnym rozwiązaniem jest stosowanie skryptów, które przeglądają logi i po kilku nieudanych próbach zalogowania dodają do firewalla regułkę blokująca adres IP atakującego. Osobiście korzystałem jedynie z Bruteblocka, który działa na FreeBSD i można go sobie zainstalować z portów.

2. Kolejną ważną rzeczą jest niepozwolenie na logowanie się przez SSH superużytkownikowi (root). Musimy zatem dopilnować, aby opcja PermitRootLogin była ustawiona na no. Logujemy się wówczas na zwykłego użytkownika, a prawa roota uzyskujemy poprzez użycie komendy su lub sudo. Należy dopilnować, aby użytkownik, z którego chcemy mieć możliwość użycia komendy su znalazł się w odpowiedniej grupie – najczęściej jest to grupa wheel.

Można również w konfigu demona SSH wyszczególnić, jacy użytkownicy mają prawo do logowania się przez SSH:

AllowUsers nowaker kwiat admin

3. Domyślnie demon SSH pozwala na logowanie się przy użyciu protokołów w wersji 1 oraz 2. Wersja 1 jest mniej bezpieczna dlatego powinniśmy zezwalać na używanie tylko wersji 2:

Protocol 2

4. Dobrym pomysłem jest również zezwalanie na łączenie się jedynie z określonych adresów IP. Można tego dokonać poprzez odpowiednie regułki do firewalli lub poprzez użycie tzw. wrapperów TCP. W takim przypadku korzystamy z pliku /etc/hosts.deny i uzupełniamy go wg uznania.Warto również zastanowić się nad limitowaniem ilości połączeń SSH w jednostce czasu za pomocą firewalla.

W ten oto sposób przedstawiłem kilka bardzo prostych sposobów na minimalne zwiększenie bezpieczeństwa naszego demona SSH. Nie jest to może instrukcja typu kopiuj-wklej, aczkolwiek przy odrobinie chęci każdy początkujący administrator powinien sobie z tym poradzić.

Dzięki dla kwiata, administratora FreeBSD na serwerze Panic.PL za kilka poprawek merytorycznych :)

P.S. Tytuł wpisu stanowi nawiązanie do wpisu na zdzichuBG’u ;)

→ 3 CommentsTags: Systemy operacyjne

Cztery pulpity w Windows XP i nie tylko – Microsoft PowerToys

posted on Czerwiec 15th, 2008 ·

KDE i Gnome mają obsługę wirtualnych pulpitów już od dawna, podczas gdy najnowszy Windows jeszcze tego nie ma. Podczas przełączania za pomocą ALT+TAB widzimy tylko ikony poszczególnych programów, zamiast podglądu okna programu. I wiele innych… Okazuje się jednak, iż na stronie Microsoftu udostępniona jest seria tzw. PowerToys dla Windows XP, które usprawniają codzienną pracę z systemem.

Poniżej podaję listę “mocnych zabawek”, z których skorzystałem wraz z linkiem do ściągnięcia. Resztę dodatków (14) znajdziecie pod tym adresem. Ściągnięcie nie wymaga żadnych potwierdzeń legalności systemu.

Virtual Desktop Manager w akcji: Cztery pulpity

→ 5 CommentsTags: Systemy operacyjne