Niektórzy wiedzą, że jestem już w zaawansowanym stadium osobistego projektu żartobliwie nazwanego "JAVATAR", który polega na poznaniu JAVA w stopniu pozwalającym, na napisanie przeciętnej aplikacji. Co prawda mam już niewielkie opóźnienie, ale nie i tym będzie dzisiejszy wpis.
W czasie nauki C++ często zauważałem jak wychwalano obiekty. Rzeczywiście, często ułatwiają prace, ponieważ operowanie na nich jest "wygodniejsze i bardziej intuicyjne". Podejrzewam, że ten pogląd bierze się stąd, że programista pod jedną nazwą ma dostęp do funkcji, zwanych metodami i danych. Mi, osobiście, się to jednak nie podoba, ponieważ daje złudny obraz obiektu, jako danych i kodu w jednym miejscu. W rzeczywistości jednak są to stare, dobre funkcje z wskaźnikiem na stukture w pierwszym, niewidocznym dla programisry argumencie. Myśle, że fakt, iż kod nie jest bezpośrednio połączony z danymi, jest istotny, jednak często nasi nauczyciele, nie ważne czy to są ludzie, czy kursy lub książki, "zapominają" nas o tym poinformować. Może przyczyną takiego stanu rzeczy jest to, że cała magia OOP nagle znika? Doświadczony programista zaraz by zwrócił uwagę na "przewspaniałą" możliwość dziedziczenia. Niestety, to tylko doklejanie kolejnych pòl do struktury i wywołanie metody o innej nazwie. Przeciążone funkcje też nie są magiczne, suma(int, double) to sumaid, a suma(int, int) to sumaii. Nie, nie twierdze, że obiektowość jest zła czy nie potrzeba, ponieważ z pewnością ułatwia zarządzanie zasobami ludzkimi i kodem projektu. Na kilku spotkaniach ustalane są podstawowe obiekty, ich interfejsy, oraz zależności, a później można przejść do tego, do czego programiści są stworzeni, czyli do klepania kodu w własnym zakresie. Do tego system szablonów skutecznie ułatwia pisanie uniwersalnych i łatwiejszych w zarządzaniu, więc też utrzymaniu, projektów.
Kazdy się z pewnością domyśla, że im mniejszy jest kod (mniej ma linijek), tym łatwiej nim zarządzać, jednak twórcy JAVA chyba o tym zapomnieli. Samo OOP wymaga napisania dodatkowego kodu dla każdej z klas i zachowując "dobre maniery" programowania obiektowego (np. dodawanie set i get dla zmiennych do których użytkownik ma określony dostęp) okazuje się, że kod, który powinien zajmować 2kB, nagle zajmuje 6 kB. W przypadku większych projektów pewnie tak tego nie widać, ale nawet przy założeniu, że kod urośnie o 30% mnie przeraża. Nie chodzi mi tutaj o to, że kod musi być przeciskany przez wolne łącza lub zajmuje dużo miejsca na dysku, zawsze może być skompresowany, ale o to, że programista, który dołącza się do projektu musi przeczytać prawie o 1/3 kodu więcej, by ogarnąć całość programu i systemy nim rządzące. W rzeczywistości jest to duża strata czasu, na którą pewnie niektórzy się nie godzą i nie czytają całego kodu, więc z pod ich palców wychodzą znaczki, które robią to, co już ktoś inny napisał. Kod jeszcze bardziej puchnie, a gdy taka sytuacja się zdarza to już po krótkim czasie dochodzi się do tego, że trzeba przepisać kod. Jednak komu chce się przepisać aplikacje, która ma miliard linii kodu? Dla firmy jest to nie do pomyślenia, ponieważ zatrzymuje rozwój całej aplikacji, stwarza nowe miejsce dla błędów i nie gwarantuje, że stare się nie powtórzą.
Całkiem inną rzeczą, która mnie w JAVA irytuje jest to, że nie ma szablonów funkcji, ani, sądząc po podstawowym api JAVA, żadnych mechanizmów pozwalających na wykorzystanie tego samego kodu w nieco innej sytuacji. Powstae niezdrowa sytuacja, w której trzeba przeciążyć funkcje dla każdego typu podstawowego osobno. Jest to szczególnie denerwujące gdy w naszej obsłudze któregoś z typów wkradnie się malutki błąd, którego zauważenie często zajmuje sporo czasu. Jeszcze musi być odzielna wersja dla obiektów... Nagle oskazuje się, że niepotrzebnie trzeba napisać o połowę więcej kodu.
W JAVA nie da się też przeciążać operatorów, co w przypadku np. BigDecimals. Nie dość że jest bardzo nieintuicyjne, to jeszcze sprawia, że kod jest mniej przejrzysty i bardziej zagmatwany. Człowiek widząc "a > b" szybciej zorientuje się o co chodzi niż składnia wywołująca "compareTo", której szczerze jeszcze nie rozumiem...
Pokazywanie postów oznaczonych etykietą informatyka. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą informatyka. Pokaż wszystkie posty
2010-07-30
2008-08-12
[BASH]Skrypt do robienia backupów MySQL'a.
Zamieszczam tutaj skrypt mojego autorstwa do robienia kopii zapasowych baz danych w MySQL'u. Pozdrowienia dla TQM, który to dał mi pomysł by stworzyć taki skrypt.
Skrypt pobiera 3 argumenty. Pierwszym z nich jest ścieżka do katalogu gdzie mają zostać zrobione kopie zapasowe. Drugi argument to użytkownik do bazy danych. Trzeci, jego hasło. W podanym katalogu, który podamy w pierwszym argumencie jest tworzony następny, którego nazwą jest aktualna data według formatu ROK-MIESIĄC-DZIEŃ. Następnie w tym katalogu są tworzone pliki, o nazwach takich, jak konkretne bazy danych. Po stworzeniu wszystkich baz, ich kopie są kompresowane za pomocą programu gzip. Polecam równiez program bzip2, jednak TQM odradził, ponieważ według niego bzip2 za długo kompresuje.
Skrypt pobiera 3 argumenty. Pierwszym z nich jest ścieżka do katalogu gdzie mają zostać zrobione kopie zapasowe. Drugi argument to użytkownik do bazy danych. Trzeci, jego hasło. W podanym katalogu, który podamy w pierwszym argumencie jest tworzony następny, którego nazwą jest aktualna data według formatu ROK-MIESIĄC-DZIEŃ. Następnie w tym katalogu są tworzone pliki, o nazwach takich, jak konkretne bazy danych. Po stworzeniu wszystkich baz, ich kopie są kompresowane za pomocą programu gzip. Polecam równiez program bzip2, jednak TQM odradził, ponieważ według niego bzip2 za długo kompresuje.
#!/bin/bash
echo "Backup databases by Nikow."
#Pobranie danych inicjujacych.
BACKUPSDIR=$1
USER=$2
PASS=$3
DATA=`date +"%Y-%m-%d"`
#Katalogi
if [ ! -d $BACKUPSDIR ]
then
echo "Katalog ${BACKUPSDIR} istnieje."
mkdir -v $BACKUPSDIR
if [ "$?" != "0" ]
then
echo "ERROR!"
exit 1
fi
fi
mkdir ${BACKUPSDIR}/${DATA} >& /dev/null
cd ${BACKUPSDIR}/${DATA}
#Wyciaganie baz.
BAZY=`echo "show databases;" | /usr/bin/mysql --silent -u${USER} -p${PASS}`
#Dump
for BAZA in $BAZY; do
echo "Zrzucanie bazy ${BAZA}..."
/usr/bin/mysqldump --add-drop-database --add-drop-table \
--complete-insert --create-options \
--single-transaction -u${USER} -p${PASS} \
${BAZA} > ${BAZA}.sql
done;
#Kompresja
echo "Kompresja baz..."
nice -15 gzip -9v *
echo "KONIEC!"
2008-06-29
FireWall, część pierwsza.
Dzisiejsza notka jest o iptables. Iptables to narzędzie ustawiające netfilter, czyli taki Firewall wbudowany w jądro Linuksa. Moim zdaniem jest to najlepszy Firewall, ponieważ jest lekki i skuteczny. Pamiętając o mniej obeznanych z zabezpieczeniami czytelnikach wytłumaczę na początek co to jest Firewall.
Firewall (czyli po polsku "Ściana ogniowa" lub "Ściana ognia") albo jak kto woli zapora sieciowa to jeden z podstawowych sposobów zabezpieczenia sieci przed niechcianymi osobnikami. Nie możemy oczywiście brać tego dosłownie i rozlewać naokoło naszej maszyny benzyny by później ją podpalić, po pierwsze, mogło by to uszkodzić maszynę, po drugie, mogło by to zniszczyć pobliskie przedmioty, a po trzecie, trzeba byłoby takie coś często odnawiać, a benzyna jest coraz droższa. Firewall to urządzenie (firewall sprzętowy) lub program (firewall programowy), który blokuje niechciany ruch. Jakiego ruchu możemy nie chcieć? Na przykład, możemy chcieć stworzyć sobie serwer FTP, ale tylko dostępny dla ludzi z sieci lokalnej (LAN), wtedy za pomocą 1 regułki dajemy dostęp do naszego serwera tylko dla danego zakresu IP, w którym mieści się nasza lokalna sieć. Gdy ktoś z zewnątrz będzie chciał się z nami połączyć, po prostu jego pakiet, nie dojdzie do usługi na naszym serwerze, przez co serwer nie odpowie.
Wiemy jak działa firewall, teraz zobaczymy jak stworzyć prosty FireWall. Dla przykładu, chcemy ograniczyć dostęp do usługi naszego serwera, tylko do naszego komputera. Jaka to może być usługa? Dla przykładu SSH, który standardowo słucha na porcie 22. Piszemy:
iptables -A INPUT -s ! 192.168.1.11 -p tcp -dport 22 -j DROP
W miejsce 192.168.1.11 wstawiamy swój adres IP, ten podany tutaj, to mój realny IP wewnętrzny. Teraz, załóżmy ktoś włamał się na komputer Kasi, która ma IP 192.168.1.10 i próbuje zalogować się na nasz serwer. Włamywacz nie będzie mógł się połączyć z naszym komputerem, ponieważ jądro Linuksa zobaczy że adres komputera próbującego połączyć się na port 22 nie jest równy adresowi 192.168.1.11, w rezultacie zgodnie z powyższą regułką, wszystkie pakiety od tego hosta zostaną upuszczone. Usługa nawet nie będzie "wiedziała" o próbie połączenia z danego adresu. Usługa nie wie również, że tylko z jednego IP można się z nią połączyć, co bardzo ułatwia nam konfigurowanie lub testowanie jakichś usług, które mogły by zostać wykorzystany w zły sposób. Jednym z takich złych sposobów jest wykorzystanie naszego jeszcze nie skonfigurowanego serwera poczty, do rozsyłania niechcianych wiadomości.
Jak widzisz, FireWall jest bardzo przydatny, a w następnej części dowiesz się, jak samemu stworzyć proste regułki FireWall'a, które pozwolą Ci zabezpieczyć swoją lokalną sieć. Zachęcam do komentowania.
Firewall (czyli po polsku "Ściana ogniowa" lub "Ściana ognia") albo jak kto woli zapora sieciowa to jeden z podstawowych sposobów zabezpieczenia sieci przed niechcianymi osobnikami. Nie możemy oczywiście brać tego dosłownie i rozlewać naokoło naszej maszyny benzyny by później ją podpalić, po pierwsze, mogło by to uszkodzić maszynę, po drugie, mogło by to zniszczyć pobliskie przedmioty, a po trzecie, trzeba byłoby takie coś często odnawiać, a benzyna jest coraz droższa. Firewall to urządzenie (firewall sprzętowy) lub program (firewall programowy), który blokuje niechciany ruch. Jakiego ruchu możemy nie chcieć? Na przykład, możemy chcieć stworzyć sobie serwer FTP, ale tylko dostępny dla ludzi z sieci lokalnej (LAN), wtedy za pomocą 1 regułki dajemy dostęp do naszego serwera tylko dla danego zakresu IP, w którym mieści się nasza lokalna sieć. Gdy ktoś z zewnątrz będzie chciał się z nami połączyć, po prostu jego pakiet, nie dojdzie do usługi na naszym serwerze, przez co serwer nie odpowie.
Wiemy jak działa firewall, teraz zobaczymy jak stworzyć prosty FireWall. Dla przykładu, chcemy ograniczyć dostęp do usługi naszego serwera, tylko do naszego komputera. Jaka to może być usługa? Dla przykładu SSH, który standardowo słucha na porcie 22. Piszemy:
iptables -A INPUT -s ! 192.168.1.11 -p tcp -dport 22 -j DROP
W miejsce 192.168.1.11 wstawiamy swój adres IP, ten podany tutaj, to mój realny IP wewnętrzny. Teraz, załóżmy ktoś włamał się na komputer Kasi, która ma IP 192.168.1.10 i próbuje zalogować się na nasz serwer. Włamywacz nie będzie mógł się połączyć z naszym komputerem, ponieważ jądro Linuksa zobaczy że adres komputera próbującego połączyć się na port 22 nie jest równy adresowi 192.168.1.11, w rezultacie zgodnie z powyższą regułką, wszystkie pakiety od tego hosta zostaną upuszczone. Usługa nawet nie będzie "wiedziała" o próbie połączenia z danego adresu. Usługa nie wie również, że tylko z jednego IP można się z nią połączyć, co bardzo ułatwia nam konfigurowanie lub testowanie jakichś usług, które mogły by zostać wykorzystany w zły sposób. Jednym z takich złych sposobów jest wykorzystanie naszego jeszcze nie skonfigurowanego serwera poczty, do rozsyłania niechcianych wiadomości.
Jak widzisz, FireWall jest bardzo przydatny, a w następnej części dowiesz się, jak samemu stworzyć proste regułki FireWall'a, które pozwolą Ci zabezpieczyć swoją lokalną sieć. Zachęcam do komentowania.
2008-05-11
Co mnie boli w C, czyli to co mi daje Assembler, a nie ma tego w C.
Dzisiaj opiszę co jest moją bolączką w C. Co mnie denerwuje, ponieważ mam to w assemblerze, a w C już nie...
Pierwszą rzeczą której nie mogę wybaczyć C to brak stosu. Programowanie bez możliwości odrzucenia czegoś w każdej chwili, by parę funkcji dalej to ściągnąć, jest dla mnie nie wygodne. Co prawda, mogę zrobić kolejną zmienną, ale według mnie, nie jest to tak wygodne, jak wklepanie "push eax". Dlatego w niektórych programach, pisze swój, sztuczny stos. Zaletą, a jednocześnie wadą sztucznego stosu jest brak wywołań funkcji, w assemblerze zawsze mogło mi się odwidzieć wykonywanie danej funkcji i wrócić 3 funkcje wcześniej. Rzadko się przydaje i można użyć goto, chociaż "jmp" lepszy.
Druga rzecz której wręcz nie mogę podarować C, to brak systemu wykrywania przepełnień, który oferuje sam procesor x86! To co mam pod jednym mnenonikiem "jc" lub "jo" (zależnie czy przebicie ma być dla liczby ze znakiem, czy bez), muszę zastępować odzielną funkcją lub procedurą.
Trzecia rzecz, która dotkneła mnie w czasie własnej implementacji wielkich liczb, brak czegoś takiego jak mnemonik "adc". Jak on działa? Jeśli przy ostatnim dodawaniu, nastąpiło przeniesienie (więc 1 się nie zmieściło) to ma dodać ten 1 przy następnym dodawaniu. Jeśli użyjemy zwykłego add, +1 nie zostanie dodany. Kiedy to się przydaje? Kiedy działamy na liczbach większych niż największe naszego procesora. Dla przykładu, na liczbach 128bitowych. W czasach teraźniejszych można już użyć rozszerzenia procesora, ale dalej nie mamy 1KiB zmiennych (chociaż po co aż tak duża? Może jeśli chcemy wyrazić odległość ziemia słońce w cm? Myślę, że ta odległość jest mniejsza od 2**1024 cm).
Czy brak dostępu do niektórych rzeczy był wart większej przenośności? Odpowiedź na to pytanie, pozostawiam wam drodzy Czytelnicy.
Pierwszą rzeczą której nie mogę wybaczyć C to brak stosu. Programowanie bez możliwości odrzucenia czegoś w każdej chwili, by parę funkcji dalej to ściągnąć, jest dla mnie nie wygodne. Co prawda, mogę zrobić kolejną zmienną, ale według mnie, nie jest to tak wygodne, jak wklepanie "push eax". Dlatego w niektórych programach, pisze swój, sztuczny stos. Zaletą, a jednocześnie wadą sztucznego stosu jest brak wywołań funkcji, w assemblerze zawsze mogło mi się odwidzieć wykonywanie danej funkcji i wrócić 3 funkcje wcześniej. Rzadko się przydaje i można użyć goto, chociaż "jmp" lepszy.
Druga rzecz której wręcz nie mogę podarować C, to brak systemu wykrywania przepełnień, który oferuje sam procesor x86! To co mam pod jednym mnenonikiem "jc" lub "jo" (zależnie czy przebicie ma być dla liczby ze znakiem, czy bez), muszę zastępować odzielną funkcją lub procedurą.
Trzecia rzecz, która dotkneła mnie w czasie własnej implementacji wielkich liczb, brak czegoś takiego jak mnemonik "adc". Jak on działa? Jeśli przy ostatnim dodawaniu, nastąpiło przeniesienie (więc 1 się nie zmieściło) to ma dodać ten 1 przy następnym dodawaniu. Jeśli użyjemy zwykłego add, +1 nie zostanie dodany. Kiedy to się przydaje? Kiedy działamy na liczbach większych niż największe naszego procesora. Dla przykładu, na liczbach 128bitowych. W czasach teraźniejszych można już użyć rozszerzenia procesora, ale dalej nie mamy 1KiB zmiennych (chociaż po co aż tak duża? Może jeśli chcemy wyrazić odległość ziemia słońce w cm? Myślę, że ta odległość jest mniejsza od 2**1024 cm).
Czy brak dostępu do niektórych rzeczy był wart większej przenośności? Odpowiedź na to pytanie, pozostawiam wam drodzy Czytelnicy.
2008-05-10
Czy programy napisane w assemblerze są lepsze od tych w C?
Słyszałem wiele opinni na ten temat. Ostatnio nawet ktoś wykłócał się co jest lepsze. O tym, że assebler nie może zostać zapomniany świadczy mój prosty test. Test został przeprowadzony na małym programie, wypisującym aktualny timestamp.
Na początek, wytłumaczenie dla nie informatycznych. Timestamp to ilość sekund, które mineły od 1 stycznia 1970 00:00:00 (tzw, początek ery uniksa, EPOCH) do chwili obecnej. Na podstawie tej wartości, oblicza się daty w komputerach z systemem operacyjnym z rodziny Unix, w Windows'ach jest chyba podobnie, ale u nich, czas liczony jest chyba od innej daty. Wiąże się to z pewnym problemem, ponieważ 19 stycznia 2038 03:14:07 czasu UTC, licznik się przekręci. Dobra, przejdżmy do wyników testów.
Pierw porównajmy wielkości programów. Na sam początek pójdzie statycznie skompilowany program wypisujący timestamp o kodzie zajmującym jedyne 91 bajtów:
Kod myśle banalny, wypisz aktualny timestamp jako liczbę i wypisz znak nowej lini. A więc ten kod zajmuje 550959 bajtów, co daje w zaokrągleniu 551KB (538KiB). Teraz raczej unika się kompilowania statycznego, więc ten sam kod, skompilowałem dynamicznie, wynik od razu rzuca się w oczy, ponieważ jest to tylko 6399, co daje w zaokrągleniu 6KB (6KiB). Powalająca różnica, prawda? Teraz przyszedł czas na assemblera. Kod w assemblerze będzie "nieco dłuższy" ponieważ zajmuje 449kb, ale z pomocą kursu Pana Bogdana Drozdowskiego powstał naprawdę szybko. Oto kod:
Kod nie jest maksymalnie wydajny, by nie powiedzieć, że wypisywanie zostało napisane na "odwal się". Tutaj proszę o uwagę, całość zajmuje jedyne 868 bajtów, czyli poniżej 1KB! Ale to nie jedyny test jaki przeprowadziłem, pora na...
...czasy wykonania programów! Czasy będę liczył za pomocą Linuksowego narzędzia time, więc można przyjąć, że będą wiarodajne, choć jeśli ktoś chce przeprowadzić własne testy, ma kody wyżej. Na pierwszy ogień idzie timestamp wykonany w C kompilowany statycznie. Po wielu wywołaniach programu, miałem wciąż te same wyniki:
real 0m0.019s
user 0m0.000s
sys 0m0.000s
więc uważam, że można im zaufać. Pierwszy wskaźnik pokazuje ile wykonywał się kod, 0.019 sekundy to naprawdę mało. Użytkownik nic nie wprowadzał, więc jego inwencja trwała zero i system uwinął się w poniżej 0.001 sekundy. Kolejny test, program w C skompilowany dynamicznie.
real 0m0.036s
user 0m0.000s
sys 0m0.000s
Jak widać, działał o 0.017 sekundy dłużej. Można sie było tego spodziewać, teraz kolej testu timestamp'u napisanego w assemblerze:
real 0m0.001s
user 0m0.000s
sys 0m0.004s
Tutaj widzimy system pracował dłużej, a jest to spowodowane wielokrotnym wywoływaniem przerwania wypisywania, ale po jednym znaku, C pierw wszystko formatowało, wrzucało do swojego buffora, a dopiero później wypisywało, przez co jądro miało mniej roboty, to samo mogłem zrobić w assemblerze, ale nie chciało mi się pisać dłużej kodu. Wyniki są jednoznaczne, program w assemblerze wykonał się w 0.005 sekundy.
Jeśli assembler jest taki mały i szybki, to dlaczego nie pisać w nim każdego programu? Assembler jest bardzo nie przenośny, algorytm napisany na PC, trzeba będzie przepisać, by można było go odpalić na mikrofalówce. C ma tutaj wielką przewagę, bo raz dobrze napisany algorytm, będzie działał na wielu platformach. Drugim argumentem przemawiającym przeciw assemblerowi, jest fakt że źródła programu napisanego w nim, są o wiele dłuższe niż w C(w naszym przypadku o okolo 80%). Istnieje też opinia, że w assemblerze się trudniej pisze, chociaż ja się z nią nie zgadzam, według mnie, jest on łatwiejszy, ale może to być złudzenie, ponieważ przez to że kody są w nim dłuższe, mogłem po prostu lepiej nauczyć się programować w tym języku.
Osąd, który z wyżej przedstawionych języków jest lepszy, pozostawiam wam, drodzy czytelnicy.
Na początek, wytłumaczenie dla nie informatycznych. Timestamp to ilość sekund, które mineły od 1 stycznia 1970 00:00:00 (tzw, początek ery uniksa, EPOCH) do chwili obecnej. Na podstawie tej wartości, oblicza się daty w komputerach z systemem operacyjnym z rodziny Unix, w Windows'ach jest chyba podobnie, ale u nich, czas liczony jest chyba od innej daty. Wiąże się to z pewnym problemem, ponieważ 19 stycznia 2038 03:14:07 czasu UTC, licznik się przekręci. Dobra, przejdżmy do wyników testów.
Pierw porównajmy wielkości programów. Na sam początek pójdzie statycznie skompilowany program wypisujący timestamp o kodzie zajmującym jedyne 91 bajtów:
#include<stdio.h>
#include<time.h>
int main(){
printf("%d\n", time(NULL));
return 0;
}
Kod myśle banalny, wypisz aktualny timestamp jako liczbę i wypisz znak nowej lini. A więc ten kod zajmuje 550959 bajtów, co daje w zaokrągleniu 551KB (538KiB). Teraz raczej unika się kompilowania statycznego, więc ten sam kod, skompilowałem dynamicznie, wynik od razu rzuca się w oczy, ponieważ jest to tylko 6399, co daje w zaokrągleniu 6KB (6KiB). Powalająca różnica, prawda? Teraz przyszedł czas na assemblera. Kod w assemblerze będzie "nieco dłuższy" ponieważ zajmuje 449kb, ale z pomocą kursu Pana Bogdana Drozdowskiego powstał naprawdę szybko. Oto kod:
global _start
section .text
_start:
mov eax, 0dh
xor ebx, ebx
int 80h
;przygotowanie do itoa
mov esi, 1
mov ecx, 10
itoa:
xor edx, edx
div ecx
or dl, '0'
mov [buff+esi], dl
inc esi
test eax, eax
jnz itoa
wypisz2:
mov ecx, buff
mov eax, 4
mov ebx, 1
add ecx, esi
mov edx, 1
int 80h
dec esi
jnz wypisz2
mov eax, 4
mov ebx, 1
mov ecx, buff
mov edx, 1
int 80h
exit:
mov eax, 1
int 80h
section .data
buff times 11 db 10
Kod nie jest maksymalnie wydajny, by nie powiedzieć, że wypisywanie zostało napisane na "odwal się". Tutaj proszę o uwagę, całość zajmuje jedyne 868 bajtów, czyli poniżej 1KB! Ale to nie jedyny test jaki przeprowadziłem, pora na...
...czasy wykonania programów! Czasy będę liczył za pomocą Linuksowego narzędzia time, więc można przyjąć, że będą wiarodajne, choć jeśli ktoś chce przeprowadzić własne testy, ma kody wyżej. Na pierwszy ogień idzie timestamp wykonany w C kompilowany statycznie. Po wielu wywołaniach programu, miałem wciąż te same wyniki:
real 0m0.019s
user 0m0.000s
sys 0m0.000s
więc uważam, że można im zaufać. Pierwszy wskaźnik pokazuje ile wykonywał się kod, 0.019 sekundy to naprawdę mało. Użytkownik nic nie wprowadzał, więc jego inwencja trwała zero i system uwinął się w poniżej 0.001 sekundy. Kolejny test, program w C skompilowany dynamicznie.
real 0m0.036s
user 0m0.000s
sys 0m0.000s
Jak widać, działał o 0.017 sekundy dłużej. Można sie było tego spodziewać, teraz kolej testu timestamp'u napisanego w assemblerze:
real 0m0.001s
user 0m0.000s
sys 0m0.004s
Tutaj widzimy system pracował dłużej, a jest to spowodowane wielokrotnym wywoływaniem przerwania wypisywania, ale po jednym znaku, C pierw wszystko formatowało, wrzucało do swojego buffora, a dopiero później wypisywało, przez co jądro miało mniej roboty, to samo mogłem zrobić w assemblerze, ale nie chciało mi się pisać dłużej kodu. Wyniki są jednoznaczne, program w assemblerze wykonał się w 0.005 sekundy.
Jeśli assembler jest taki mały i szybki, to dlaczego nie pisać w nim każdego programu? Assembler jest bardzo nie przenośny, algorytm napisany na PC, trzeba będzie przepisać, by można było go odpalić na mikrofalówce. C ma tutaj wielką przewagę, bo raz dobrze napisany algorytm, będzie działał na wielu platformach. Drugim argumentem przemawiającym przeciw assemblerowi, jest fakt że źródła programu napisanego w nim, są o wiele dłuższe niż w C(w naszym przypadku o okolo 80%). Istnieje też opinia, że w assemblerze się trudniej pisze, chociaż ja się z nią nie zgadzam, według mnie, jest on łatwiejszy, ale może to być złudzenie, ponieważ przez to że kody są w nim dłuższe, mogłem po prostu lepiej nauczyć się programować w tym języku.
Osąd, który z wyżej przedstawionych języków jest lepszy, pozostawiam wam, drodzy czytelnicy.
2008-04-04
Superkomputery
Wczoraj w Centrum Informatycznym Trójmiejskiej Akademii Sieci Komputerowej (TASK) został uruchomiony najszybszy superkomputer w Europie Środkowo-Wschodniej - Galera. W uroczystości wziął udział sa, Paul S. Otellini, prezes i dyrektor generalny firmy Intel Corporation. Jest to duma Trójmiasta, ale czy opłacalna?
Moim zdaniem nie. Uważam że lepszy efekt uzyskaliby gdyby zastosowali parę zwykłych komputerów z debianem na pokładzie połączonych w klaster. Po pierwsze, te komputery mogły by być używane przez cały czas do wyznaczonych im obliczeń, a od czasu do czasu, jakiś student mógłby po prostu z niego skorzystać by odczytać pocztę, co więcej, w takim układzie by można było podpiąć inne komputery, co by zwiększyło moc obliczeniową. Grupa zwykłych komputerów też jest łatwiejsza, a co za tym idzie, tańsze w konserwacji, i to nie o jakieś 10-15% tylko o jakieś 80%! Do takiej super maszyny mało kogo dopuszczą, a by jakiś kod został tam uruchomiony, najprawdopodobniej cały sztab ludzi będzie musiał wyrazić zgodę. Następnym moim argumentem jest fakt, że uszkodzenie jednego takiego zwykłego komputera, nie zakłóci pracy innych, lub zrobi to, ale w małym stopniu. Jeśli superkomputer zostanie uszkodzony, dla bezpieczeństwa jego reszty, nie może wogóle pracować, więc strata mocy obliczeniowej wynosi 100%! Ponad to taki superkomputer potrzebuje specjalnego pomieszczenia dla siebie, drogiego chłodzenia i sztabu ludzi zawsze gotowych by do niego przyjechać by coś ustawić. Zwykłe komputery mogą być rozmieszczone w różnych częściach akademii, przez co wystarczyło by zwykłe chłodzenie, które by dostały "w zestawie". Z stratami energetycznymi chyba nie ma zbyt dużej różnicy, chociaż chłodzenie takiego superkompa może naprawdę dużo ciągnąć...
Podsumowując, zakup superkomputera moim zdaniem nie był trafnym pomysłem, ale są też dobre strony, Polska ma się czym pochwalić... Ale kto by słuchał zwykłego gimnazjalisty...
Moim zdaniem nie. Uważam że lepszy efekt uzyskaliby gdyby zastosowali parę zwykłych komputerów z debianem na pokładzie połączonych w klaster. Po pierwsze, te komputery mogły by być używane przez cały czas do wyznaczonych im obliczeń, a od czasu do czasu, jakiś student mógłby po prostu z niego skorzystać by odczytać pocztę, co więcej, w takim układzie by można było podpiąć inne komputery, co by zwiększyło moc obliczeniową. Grupa zwykłych komputerów też jest łatwiejsza, a co za tym idzie, tańsze w konserwacji, i to nie o jakieś 10-15% tylko o jakieś 80%! Do takiej super maszyny mało kogo dopuszczą, a by jakiś kod został tam uruchomiony, najprawdopodobniej cały sztab ludzi będzie musiał wyrazić zgodę. Następnym moim argumentem jest fakt, że uszkodzenie jednego takiego zwykłego komputera, nie zakłóci pracy innych, lub zrobi to, ale w małym stopniu. Jeśli superkomputer zostanie uszkodzony, dla bezpieczeństwa jego reszty, nie może wogóle pracować, więc strata mocy obliczeniowej wynosi 100%! Ponad to taki superkomputer potrzebuje specjalnego pomieszczenia dla siebie, drogiego chłodzenia i sztabu ludzi zawsze gotowych by do niego przyjechać by coś ustawić. Zwykłe komputery mogą być rozmieszczone w różnych częściach akademii, przez co wystarczyło by zwykłe chłodzenie, które by dostały "w zestawie". Z stratami energetycznymi chyba nie ma zbyt dużej różnicy, chociaż chłodzenie takiego superkompa może naprawdę dużo ciągnąć...
Podsumowując, zakup superkomputera moim zdaniem nie był trafnym pomysłem, ale są też dobre strony, Polska ma się czym pochwalić... Ale kto by słuchał zwykłego gimnazjalisty...
2008-04-03
SW50Y29kZS5wbmcKCg==
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
RZADPHJOF3zqMQohDBt0oGYBtKTjvxEI8gx77+Sl
Dbtbga+Nm3BtfNftNcjup2Iv1W/ZdLQe12sT6QUC
4c5WXUAsAdPEny2DCGMHVzoKcBdiqYkseqgQDIPo
Oq4fDl+k+LrvDFenFF7R85N8P5GDP+LpCIaRYt+J
x42qyJ6dIA5669IIfDI66kqGTaP5M8J27q17g3BI
5zf2s1BpFwSpoNtc6BQxORFWZwhPz2rMEZKmnHj3
UfL2LDFBl3ntcc6EDVuUNK5jUEuAMb1yhPvsKX/r
paMa5gvCcjF6UIiwVt2ADb7tow9R4taYs+ygFp7N
/JWJtCB8DYdXQGgDFevobVgTnkWqXwW5p5vbdCy5
GaXPTdFVEFvfPra/A+atT0nqwnIs2wWi/hSXqr0j
uAnXxk24Nr5rhOICVPJcGV8mzN/JE72LrxLGqKSz
ilQcH25ehzOVAHud/1bmb12nB7nZn1wG5VSyZzAs
p9WG/tSGURURfT9g56UYv6whbNWuNKDdnI5EPkY4
6y5rO2GyHeaEt6Qy4a9Is9vRsYKdML5NWIR5t7Iq
YRuMl4mwTGq3ZG8S5kmTr8p4U8OZ8NsiwZOtVFUy
HhBuHhLeNoJZJJQJJ1etYpGDDSfCKeqXIoGHLo7H
0pqGewKaCTsRreya6nq2DeZs7Fs9QOw4VOPTsIB8
fsJfI7luQ9W6yjJcAMl1G6tWfM9Clp+dFis0j2J8
ZZj4DK4uARv8KeFPfMR3DdfGlwlLezZU4LuE1fme
9LuEcS0zebKI9CUvilgTbDwdMZkC1jTnXxikZK9D
cCT9fSzpSVtjXxm2lpZE2IKN3mP8ISlc2csYZlLR
AUmlkY8J706oKw6zMkIX89LGEZWaxj8d9Y+EBZPP
VwosBNW4x4RbObOXHvlVImHDek2EgxfRkXPfjt3s
VSwxL9eG+INHNTw38B7JeiaM94ef0Rm8tGSm4YNz
EIxm1L0k/Fok0hEs+fqW/r/JzXgOLCwx9Egk6Ig2
EJCvCKuYyGZmee9Z42cJz/yduKIpWjlcQYOheIjY
iOvsPk4OlgkP0X+abnpNWFzEeook+iARdi1Jixq+
hEN06jjmn4HcgnCRl64AUg3HIBuToupDhxQy0YSh
Y3OJCv73FHhaoexK+Odq+HK4CdfGTbg2EuEw6eEH
kHUJdmQZ1AsgWc2ssv+oGNKAtvwVaU4uA9nHbCBX
R44MtJR2EpNL0Kw21NaGbrTa2yEkzNGX0C7nMxal
X7nR848Yffp3LGdI4Qd+NT1xQ5hdSoE3jOYA/hJh
6ZZzoxeEr5c2x7PWvKhhdREfae44wsDE4xp21zCa
p+wHHQ3J2qF7NIpxkXmM12ir3sBNuDZuwrVxE66N
HyXshlFPMwYvjTQszC8ywP4SiXCjvjMr9DQC4Z7J
L+T5KYLJCL2G9vgS2cwPFoeP6cWC3WnDh7tGAsmA
WWSg9OT3kn6WOpI+1JXex0SYq/mCHCqbRcFpeyFx
SSIxBptOzafAzmbCXsKcIxwgHL2NF0Fq1lrH8HXb
iISfPq6B7ABlyW0t/Wz6Ahme4s9z5cwQCE9mZ5xr
GZfiOLzi1vdwoYd9DDfh2rgJ18ZNuDYmwhcZ7HuF
TNh26i95HEYmrK6k4TzBJBJXUhie4HcJx9mPUd25
7hs4q2FSJReLQ14RM8JRH75gXpQ5VjUcoy6vEhm6
g33C6icIx2j5FzHof41M2CST/kWU/18jEw5Wc5qJ
/QutxI/gJlwbN+HauAnXxu8Sdv2xBZ7/Gquu+fqY
dc0XcmQ8wdriuDxmNt3j94/mLcb1pjFnJc4m+8q6
ojtYmUhx3XWnNFeMK46/DGcqz6FSOZhN/gXdbQ1n
fThiXCV0Xfz4U8IjrVwQk6Rs5irmH+IqhG1YcOHR
5MrriYRjcyP0Nwij8Nr1XEW/yhZ8GcIxARMQooEU
jKjhLKzegw3ZMOiup0y8OK2+1/2rpV+qYWol4sc3
MvGdwe9qa7+Cm3Bt3IRr4yZcG5Ew16P+JRMJNYnf
ciwa5n9qAiASru9XLOLMzoTTcjrWj2BuxmzEQSOS
o7e2H7pzdueTRC3vIBOOq71kdTesxRCddrNtH6M4
4WA0L8itzY9zQ0OiyFs9icRq8ZR2J93POcLLVGuy
k6B89yF9Fq3OYSXNGwADQQ9ahdxItFSk0oznS08v
HUuJfjK5jQldpIZZikrds7v8oyl9eViKpcIkFVRT
JEzKTPY4e+9jwpMpR3/tvFIncmpV6/IUYZXXKDlP
GCUpLbsxN+rk4uMkprfkGOHNtOU54W+ArbzZryq1
SU9+r4a/Qxj5PM2ivqjUdr3n24QjXFh99MkR6+Z6
cewV9WH5bOcVCT/FTbg2fpZwP/xGrGgmzJ44kS6F
XMO/4QedD2hXJ+yKZGuaXAZbwnmeTDDm+pOu0jKx
cNmLFAm7HTMua5mnHgIaNaeoBswJh/y/S519zA4m
cbKGDBMlrNAZYRd1JfkwY+2pGrKPa1imj7VKZO1m
9aMZYdPm6ZQ1CKf1hGLQYZ6qt6MJb0yfHcLQSoio
gO4Qjr67c4NDNk2TnUUof05Y5Rds6VgMuXSi9Xhu
XEGNxs8jlOfaOl/bGi8JWz+ErM6RVZwBGCQoOBFP
rg3tWDfzZqsFYb6xNR6a6t/rkOM7YHKbszaB7Jzj
axmujli1NuU5WmZuWtfwxH71XL+p8kj664KAhcmn
70+/+BEdbcJNuDZuwrVBhC3mY9d5NcFLIzkKvP+l
YFEMFLW/FHuJvY+rPwFQligkKaetMZUJn9b2AiJh
00TCQ4f/acqFiovyKb6jgHwEMJFKVEkizAYRA+0O
qHgfoagRqsBYNnF8/ICK9xFssyd0D7Wf7sE860gY
LSRqJeoR9v1iIhkF08ZsmosLvXiuMcoZPmvXsO/T
GiUzm06tTMijhFmr3EpvLk7YNWZmcah1JqF3CTvo
OIIJoBTTUdEftO7IJSwLEBbMzGw6Ns+5+zbhr0A0
YjaAdK6Gv4Kl8JrwDEVeJYigxgsR9jYMgobmIaou
cdB0I3Ndtx2kCvhrffjt3vqvCb+Nm3Bt3IRrIxJm
mPjyd2y6YHL8FGHMkPIb0hFZoqFf3dmsCkYGugY0
TPyC8Xmd78Oi6jHBaCHYIjKXCLeKKT/Xh2MEVIFL
JJR5STJhs9Sb2OS0KwVVlrBdOc6i+VGu5Ugr8sW8
j8t0tlziHs05R+Ph2duUWokWFxHxWyO0HGHD0wKV
yNGkVeTjVZdxi0+uGgmDkmo2hMtGfYg2qewxWDRe
YcxhtCpf/Mm7PnUcfktYlBwgZJnVlB3WTlaRPzhB
NsmwimN1/aAlTkikYAxbsmnuB8rSfYiwfEn4G9DJ
KzxZn7Ed+kAkvgFFwusWL11wbfskgQlPSvm+AtGH
6gt58m2MAzo+JfbvNR753uF/T/hN3IRr43cJu9/I
IjlPJlBSWa+HHN3aiN+QjsjSoCtU1r2ULOJZjISx
eh9qoek6Fqdn9Z9OA3RMFQwWVYkwGzo96J7nyWFq
ps2/1K6foVCqpqwPB8ITrXWw22kvo2NkBxUm/GBi
TQnC5tl5kv4eSey/Irxwe5X145qU1CS4DBS1+3Ex
lcXcwEOEaVVI6avWcJMyCU3emGk9ijgM8rr3msbW
xHJcomANB3+yCwsDibnFMYv+9QdT3KYjBEtPZVXD
XIGFJ1HVhqaDYzDChz2iCp5QNrfpHHs7QnnSJYLS
byXWR40Ez6wxkenSBSo/q+H6EDwZbpNXPMqwfSPF
7fcIZ1ciXTIvptKGD0lkDrD5vsbzJK34EUn8DRVt
hptwbdyEayMT/g2LbqZLnJ0H8y1MM2XKJNiojkQ4
ZcSoCFska98bhOMD+DhHX8no1omwpfA9q9H+ZEml
0lpllfNjb5sJi4SXIixYiIkU2ywj6+mLH7aEoinp
awZWYUh80qj3bQ3zMeHd+o3qTpDuqJI/X5ZgJhJU
ANsOQhQizPjSaAwGHg8XpyY1T6t6JjorwjNP375I
nCGsFoZtDGiMN+GPTpad2uExEfbPZPjz2ROKTCS7
IMx2TNEXlt3U0wUeMUaAUwqjYSDBllZ2GBhPUxrd
p62pChHaO4SXlh07RHiC/JDPSxhuNiIx1bB/s4a/
AMuWL110kROJeX6aF6boF9XLkPmo5wrlbejwVxyp
covo+OcDVr+rD/8KbsK1cROujfXo5eUxKT+/Edw6
eULH2hMAC2Hu43jnPCffvZLRRUJP547FVJ6VcUyU
JiFZ31naQ9dzXQddK1dKvytBqszIxzO319L5aVa5
Pd4l/MEpzwjztSd0z8t4hrBl3shyhJNIPHZ7bfLT
vFtdw6M230pJEhjDCUxS3fYlPr90ike76oFInE/k
6qKlOenD67Sgs6C7h6ZoJhzmhG44FhOJ6GxeRFQ/
uoB/Yuzmdhhs2j2O0w+R7vxTwuw54Vlq2yOEU3Az
Zs9VOFAlPU5z63GFodCqzQbVPvM7rgjvtUlvEF6n
By4P94JwfEnci7xNs9uoyzd1TI9fEpXGf/C4hzP5
v65e9h2OcXRdXMeq8zILWIgmimuuPOr7f1cf/hXc
hGvjJlwbkbAb1F+tkPcmsvJz3SWll8jKT1skg0l9
fJFwEa/XlnDoGLtOy2Hoh7DiYhFjzPAiNTLpw0HZ
MKs1FifN+izUWNKmS160R16kEldqzQdnDWvlexIJ
kdTVtScUA/bkObKI+eQ8zMmKRdI6HF0f8jahK0Fh
sCQ+6rC0xI4pOiccH/+e6/Y83xRhtzYyFpeZi2FM
7LRW47NjMU51Z1tj3pVpoo1eZrp8SnhpL+0Qhj3h
Iaxzt4abKDNkk7LZYsjsRJjvEX5s2SVPqI8NWnRE
9ZRTpQse/jJDx8wvHYvnavgLUCM16pEUPyTDO6PW
3yPsHkVUM62wE7TobyTgYSINWMm6hNfFn8XWFP0N
jWeGm3Bt3IRr42cJW/U0DcV1kD2hzXt+uj9DJtxW
T5tTZiXoTJj7hUEg6W9Jj7kpE1E9Ocd5CEtLpl3s
+Mt5zFVb1AiNA/bJkMnj9uVGV9hYJIV0dspMqe/9
a8/IR1caD8QPO9/ZPn6XIPbO0dZZtWWRCPGyH8wX
O0y4JbeGmkVPPw+inbTQeZB1IiRGcgUvNX2hChI2
W47Pg17K9rAAAAF6SURBVGjzDzuXzEyY22TUho+o
8JccIZwCfflbhBeSmWVYpPmvVPsqDasUGQ8jhFbi
7RqWDwhnxJY3ELXl+HrVbAg/EFu5/bEVifoITfsn
hBfdwdcViIEci7KLy8RiILUNU1JwxLTrkp8Rd9sQ
SLFI1vEbGs8MN+HauAnXxs8S1qyg2lATM8fib4S3
JsLcNKJgP1wPiXBrmqdJTM7DlVGk0gj8qBrqBvXQ
DQrXUZclSp9DlTVCY66VsktwzGHDam+nkQthlQk7
5os8ta8RVpFw54Z+AKnD0ENcA6bXMQ7RapJFrnBA
x5D/gIW2Fg5TSsUfXyU8zlNFPrWK1P6PGWHH8iLx
dQjjPOR8AfVKgRcPf0wjP2kyWzXCdtftvlPDcpWz
U833rN9c29leD1KLwnyhlejfIJy/p+GRjUjUh9pG
YryqYfGnhB0NrS1oueBoZikOl9GwkKYfIAeNY5rC
xhU2H3rou68SjjibpOk3dMoZbsK1cROujZtwbfwH
3YuhnCG2M+sAAAAASUVORK5CYII=
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
Dbtbga+Nm3BtfNftNcjup2Iv1W/ZdLQe12sT6QUC
4c5WXUAsAdPEny2DCGMHVzoKcBdiqYkseqgQDIPo
Oq4fDl+k+LrvDFenFF7R85N8P5GDP+LpCIaRYt+J
x42qyJ6dIA5669IIfDI66kqGTaP5M8J27q17g3BI
5zf2s1BpFwSpoNtc6BQxORFWZwhPz2rMEZKmnHj3
UfL2LDFBl3ntcc6EDVuUNK5jUEuAMb1yhPvsKX/r
paMa5gvCcjF6UIiwVt2ADb7tow9R4taYs+ygFp7N
/JWJtCB8DYdXQGgDFevobVgTnkWqXwW5p5vbdCy5
GaXPTdFVEFvfPra/A+atT0nqwnIs2wWi/hSXqr0j
uAnXxk24Nr5rhOICVPJcGV8mzN/JE72LrxLGqKSz
ilQcH25ehzOVAHud/1bmb12nB7nZn1wG5VSyZzAs
p9WG/tSGURURfT9g56UYv6whbNWuNKDdnI5EPkY4
6y5rO2GyHeaEt6Qy4a9Is9vRsYKdML5NWIR5t7Iq
YRuMl4mwTGq3ZG8S5kmTr8p4U8OZ8NsiwZOtVFUy
HhBuHhLeNoJZJJQJJ1etYpGDDSfCKeqXIoGHLo7H
0pqGewKaCTsRreya6nq2DeZs7Fs9QOw4VOPTsIB8
fsJfI7luQ9W6yjJcAMl1G6tWfM9Clp+dFis0j2J8
ZZj4DK4uARv8KeFPfMR3DdfGlwlLezZU4LuE1fme
9LuEcS0zebKI9CUvilgTbDwdMZkC1jTnXxikZK9D
cCT9fSzpSVtjXxm2lpZE2IKN3mP8ISlc2csYZlLR
AUmlkY8J706oKw6zMkIX89LGEZWaxj8d9Y+EBZPP
VwosBNW4x4RbObOXHvlVImHDek2EgxfRkXPfjt3s
VSwxL9eG+INHNTw38B7JeiaM94ef0Rm8tGSm4YNz
EIxm1L0k/Fok0hEs+fqW/r/JzXgOLCwx9Egk6Ig2
EJCvCKuYyGZmee9Z42cJz/yduKIpWjlcQYOheIjY
iOvsPk4OlgkP0X+abnpNWFzEeook+iARdi1Jixq+
hEN06jjmn4HcgnCRl64AUg3HIBuToupDhxQy0YSh
Y3OJCv73FHhaoexK+Odq+HK4CdfGTbg2EuEw6eEH
kHUJdmQZ1AsgWc2ssv+oGNKAtvwVaU4uA9nHbCBX
R44MtJR2EpNL0Kw21NaGbrTa2yEkzNGX0C7nMxal
X7nR848Yffp3LGdI4Qd+NT1xQ5hdSoE3jOYA/hJh
6ZZzoxeEr5c2x7PWvKhhdREfae44wsDE4xp21zCa
p+wHHQ3J2qF7NIpxkXmM12ir3sBNuDZuwrVxE66N
HyXshlFPMwYvjTQszC8ywP4SiXCjvjMr9DQC4Z7J
L+T5KYLJCL2G9vgS2cwPFoeP6cWC3WnDh7tGAsmA
WWSg9OT3kn6WOpI+1JXex0SYq/mCHCqbRcFpeyFx
SSIxBptOzafAzmbCXsKcIxwgHL2NF0Fq1lrH8HXb
iISfPq6B7ABlyW0t/Wz6Ahme4s9z5cwQCE9mZ5xr
GZfiOLzi1vdwoYd9DDfh2rgJ18ZNuDYmwhcZ7HuF
TNh26i95HEYmrK6k4TzBJBJXUhie4HcJx9mPUd25
7hs4q2FSJReLQ14RM8JRH75gXpQ5VjUcoy6vEhm6
g33C6icIx2j5FzHof41M2CST/kWU/18jEw5Wc5qJ
/QutxI/gJlwbN+HauAnXxu8Sdv2xBZ7/Gquu+fqY
dc0XcmQ8wdriuDxmNt3j94/mLcb1pjFnJc4m+8q6
ojtYmUhx3XWnNFeMK46/DGcqz6FSOZhN/gXdbQ1n
fThiXCV0Xfz4U8IjrVwQk6Rs5irmH+IqhG1YcOHR
5MrriYRjcyP0Nwij8Nr1XEW/yhZ8GcIxARMQooEU
jKjhLKzegw3ZMOiup0y8OK2+1/2rpV+qYWol4sc3
MvGdwe9qa7+Cm3Bt3IRr4yZcG5Ew16P+JRMJNYnf
ciwa5n9qAiASru9XLOLMzoTTcjrWj2BuxmzEQSOS
o7e2H7pzdueTRC3vIBOOq71kdTesxRCddrNtH6M4
4WA0L8itzY9zQ0OiyFs9icRq8ZR2J93POcLLVGuy
k6B89yF9Fq3OYSXNGwADQQ9ahdxItFSk0oznS08v
HUuJfjK5jQldpIZZikrds7v8oyl9eViKpcIkFVRT
JEzKTPY4e+9jwpMpR3/tvFIncmpV6/IUYZXXKDlP
GCUpLbsxN+rk4uMkprfkGOHNtOU54W+ArbzZryq1
SU9+r4a/Qxj5PM2ivqjUdr3n24QjXFh99MkR6+Z6
cewV9WH5bOcVCT/FTbg2fpZwP/xGrGgmzJ44kS6F
XMO/4QedD2hXJ+yKZGuaXAZbwnmeTDDm+pOu0jKx
cNmLFAm7HTMua5mnHgIaNaeoBswJh/y/S519zA4m
cbKGDBMlrNAZYRd1JfkwY+2pGrKPa1imj7VKZO1m
9aMZYdPm6ZQ1CKf1hGLQYZ6qt6MJb0yfHcLQSoio
gO4Qjr67c4NDNk2TnUUof05Y5Rds6VgMuXSi9Xhu
XEGNxs8jlOfaOl/bGi8JWz+ErM6RVZwBGCQoOBFP
rg3tWDfzZqsFYb6xNR6a6t/rkOM7YHKbszaB7Jzj
axmujli1NuU5WmZuWtfwxH71XL+p8kj664KAhcmn
70+/+BEdbcJNuDZuwrVBhC3mY9d5NcFLIzkKvP+l
YFEMFLW/FHuJvY+rPwFQligkKaetMZUJn9b2AiJh
00TCQ4f/acqFiovyKb6jgHwEMJFKVEkizAYRA+0O
qHgfoagRqsBYNnF8/ICK9xFssyd0D7Wf7sE860gY
LSRqJeoR9v1iIhkF08ZsmosLvXiuMcoZPmvXsO/T
GiUzm06tTMijhFmr3EpvLk7YNWZmcah1JqF3CTvo
OIIJoBTTUdEftO7IJSwLEBbMzGw6Ns+5+zbhr0A0
YjaAdK6Gv4Kl8JrwDEVeJYigxgsR9jYMgobmIaou
cdB0I3Ndtx2kCvhrffjt3vqvCb+Nm3Bt3IRrIxJm
mPjyd2y6YHL8FGHMkPIb0hFZoqFf3dmsCkYGugY0
TPyC8Xmd78Oi6jHBaCHYIjKXCLeKKT/Xh2MEVIFL
JJR5STJhs9Sb2OS0KwVVlrBdOc6i+VGu5Ugr8sW8
j8t0tlziHs05R+Ph2duUWokWFxHxWyO0HGHD0wKV
yNGkVeTjVZdxi0+uGgmDkmo2hMtGfYg2qewxWDRe
YcxhtCpf/Mm7PnUcfktYlBwgZJnVlB3WTlaRPzhB
NsmwimN1/aAlTkikYAxbsmnuB8rSfYiwfEn4G9DJ
KzxZn7Ed+kAkvgFFwusWL11wbfskgQlPSvm+AtGH
6gt58m2MAzo+JfbvNR753uF/T/hN3IRr43cJu9/I
IjlPJlBSWa+HHN3aiN+QjsjSoCtU1r2ULOJZjISx
eh9qoek6Fqdn9Z9OA3RMFQwWVYkwGzo96J7nyWFq
ps2/1K6foVCqpqwPB8ITrXWw22kvo2NkBxUm/GBi
TQnC5tl5kv4eSey/Irxwe5X145qU1CS4DBS1+3Ex
lcXcwEOEaVVI6avWcJMyCU3emGk9ijgM8rr3msbW
xHJcomANB3+yCwsDibnFMYv+9QdT3KYjBEtPZVXD
XIGFJ1HVhqaDYzDChz2iCp5QNrfpHHs7QnnSJYLS
byXWR40Ez6wxkenSBSo/q+H6EDwZbpNXPMqwfSPF
7fcIZ1ciXTIvptKGD0lkDrD5vsbzJK34EUn8DRVt
hptwbdyEayMT/g2LbqZLnJ0H8y1MM2XKJNiojkQ4
ZcSoCFska98bhOMD+DhHX8no1omwpfA9q9H+ZEml
0lpllfNjb5sJi4SXIixYiIkU2ywj6+mLH7aEoinp
awZWYUh80qj3bQ3zMeHd+o3qTpDuqJI/X5ZgJhJU
ANsOQhQizPjSaAwGHg8XpyY1T6t6JjorwjNP375I
nCGsFoZtDGiMN+GPTpad2uExEfbPZPjz2ROKTCS7
IMx2TNEXlt3U0wUeMUaAUwqjYSDBllZ2GBhPUxrd
p62pChHaO4SXlh07RHiC/JDPSxhuNiIx1bB/s4a/
AMuWL110kROJeX6aF6boF9XLkPmo5wrlbejwVxyp
covo+OcDVr+rD/8KbsK1cROujfXo5eUxKT+/Edw6
eULH2hMAC2Hu43jnPCffvZLRRUJP547FVJ6VcUyU
JiFZ31naQ9dzXQddK1dKvytBqszIxzO319L5aVa5
Pd4l/MEpzwjztSd0z8t4hrBl3shyhJNIPHZ7bfLT
vFtdw6M230pJEhjDCUxS3fYlPr90ike76oFInE/k
6qKlOenD67Sgs6C7h6ZoJhzmhG44FhOJ6GxeRFQ/
uoB/Yuzmdhhs2j2O0w+R7vxTwuw54Vlq2yOEU3Az
Zs9VOFAlPU5z63GFodCqzQbVPvM7rgjvtUlvEF6n
By4P94JwfEnci7xNs9uoyzd1TI9fEpXGf/C4hzP5
v65e9h2OcXRdXMeq8zILWIgmimuuPOr7f1cf/hXc
hGvjJlwbkbAb1F+tkPcmsvJz3SWll8jKT1skg0l9
fJFwEa/XlnDoGLtOy2Hoh7DiYhFjzPAiNTLpw0HZ
MKs1FifN+izUWNKmS160R16kEldqzQdnDWvlexIJ
kdTVtScUA/bkObKI+eQ8zMmKRdI6HF0f8jahK0Fh
sCQ+6rC0xI4pOiccH/+e6/Y83xRhtzYyFpeZi2FM
7LRW47NjMU51Z1tj3pVpoo1eZrp8SnhpL+0Qhj3h
Iaxzt4abKDNkk7LZYsjsRJjvEX5s2SVPqI8NWnRE
9ZRTpQse/jJDx8wvHYvnavgLUCM16pEUPyTDO6PW
3yPsHkVUM62wE7TobyTgYSINWMm6hNfFn8XWFP0N
jWeGm3Bt3IRr42cJW/U0DcV1kD2hzXt+uj9DJtxW
T5tTZiXoTJj7hUEg6W9Jj7kpE1E9Ocd5CEtLpl3s
+Mt5zFVb1AiNA/bJkMnj9uVGV9hYJIV0dspMqe/9
a8/IR1caD8QPO9/ZPn6XIPbO0dZZtWWRCPGyH8wX
O0y4JbeGmkVPPw+inbTQeZB1IiRGcgUvNX2hChI2
W47Pg17K9rAAAAF6SURBVGjzDzuXzEyY22TUho+o
8JccIZwCfflbhBeSmWVYpPmvVPsqDasUGQ8jhFbi
7RqWDwhnxJY3ELXl+HrVbAg/EFu5/bEVifoITfsn
hBfdwdcViIEci7KLy8RiILUNU1JwxLTrkp8Rd9sQ
SLFI1vEbGs8MN+HauAnXxs8S1qyg2lATM8fib4S3
JsLcNKJgP1wPiXBrmqdJTM7DlVGk0gj8qBrqBvXQ
DQrXUZclSp9DlTVCY66VsktwzGHDam+nkQthlQk7
5os8ta8RVpFw54Z+AKnD0ENcA6bXMQ7RapJFrnBA
x5D/gIW2Fg5TSsUfXyU8zlNFPrWK1P6PGWHH8iLx
dQjjPOR8AfVKgRcPf0wjP2kyWzXCdtftvlPDcpWz
U833rN9c29leD1KLwnyhlejfIJy/p+GRjUjUh9pG
YryqYfGnhB0NrS1oueBoZikOl9GwkKYfIAeNY5rC
xhU2H3rou68SjjibpOk3dMoZbsK1cROujZtwbfwH
3YuhnCG2M+sAAAAASUVORK5CYII=
2008-03-25
Debian GNU/LINUX | KDE | Rezygnacja z GG
Przez te święta zrealizowałem tylko 10% moich zamierzeń... Zdążyłem przetestować debiana, gentoo, slackware i archa. Na początek pare słów o debianie:
Debian GNU/Linux to wolna dystrybucja linksowa, rozwijana przez ochotników na całym świecie. Według przeróżnych opinii Debian jest dystrybucją bardzo stabilną i łatwą w aktualizacji, ja się z tym nie zgadzam. Co prawda wersja Etch jest stabilna, ale oprogramowanie na nią jest co tu dużo mówić stare. Wersja Lenny jest nieco świeższa, ale i dużo mniej stabilna, KDE z tej wersji robi ciągle różne psikusy (wywraca się Konqueror itd). Najświeższa wersja, Sid jest bardzo często aktualizowana, ale jest bardzo niestabilna... Debian stawiając na prostotę ściąga wiele dodatkowych rzeczy, które zajmują sporo miejsca na dysku, chociaż sytuacja z RAM'em wygląda wiele lepiej niż jest to na GNOME. Ponad to KDE ma wiele zabawek, takich jak KTurtle który pozwala na zabawę za pomocą Logo (to taki prosty język programowania który służy do sterowania żółwikiem, który maluje). Debiana polecam początkującym użytkownikom, ponieważ jego instalacja (i późniejsze zarządzanie nim) oraz obsługa jest prosta, od początku mamy środowisko graficzne (oczywiście możemy z niego zrezygnować) i ma dobre polskie manuale, które bardzo ułatwiają zapoznanie się z nim. Oczywiście piękne konfiguratorki pozwalają prawie wszystko wyklikać...
KDE to środowisko które po długim bytowaniu na GNOME bardzo przypadło mi do gustu, pomijając fakt że na debianie w wersji lenny konqueror ma czasami wypadki. Pracuje się na nim wygodnie i ma ładne bajerki w debianowym standardzie. Brakuje mi tutaj tylko monitora systemu takiego jak ma gnome. Prawie wszystkie programy w KDE mogą być ulokowane w trayu, co według mnie bardzo umila prace z wieloma programami na raz i programami które mają czekać na jakieś zdarzenie (np. przyjście maila :) ). W menu na początku trudno się odnaleźć, ponieważ mamy tam sporo pozycji. Na szczęście po paru odnalezieniach szukanego programu zapamiętujemy jego pozycję i w dodatku w pasku mamy listę najczęściej używanych przez nas programów. Programy są ładnie ze sobą połączone i ładnie ze sobą współgrają. Standardowe gry przykują nas na jakiś czas, gdy akurat będziemy coś robić, co będzie zjadało dużo zasobów, albo w oczekiwaniu na ściągnięcie się jakiegoś pliku.
Na koniec ważna informacja, z GG już nie korzystam i nie zamierzam do niego wracać. Numer już nie należy do mnie, więc jeśli ktoś by z niego do was pisał, to najprawdopodobniej nie będę to ja. Jeśli macie jakąś sprawę to piszcie maila, jeśli to wam nie odpowiada, zaopatrzcie się w jakiś komunikator z obsługą jabbera. Albo złapcie mnie na IRC'u.
Debian GNU/Linux to wolna dystrybucja linksowa, rozwijana przez ochotników na całym świecie. Według przeróżnych opinii Debian jest dystrybucją bardzo stabilną i łatwą w aktualizacji, ja się z tym nie zgadzam. Co prawda wersja Etch jest stabilna, ale oprogramowanie na nią jest co tu dużo mówić stare. Wersja Lenny jest nieco świeższa, ale i dużo mniej stabilna, KDE z tej wersji robi ciągle różne psikusy (wywraca się Konqueror itd). Najświeższa wersja, Sid jest bardzo często aktualizowana, ale jest bardzo niestabilna... Debian stawiając na prostotę ściąga wiele dodatkowych rzeczy, które zajmują sporo miejsca na dysku, chociaż sytuacja z RAM'em wygląda wiele lepiej niż jest to na GNOME. Ponad to KDE ma wiele zabawek, takich jak KTurtle który pozwala na zabawę za pomocą Logo (to taki prosty język programowania który służy do sterowania żółwikiem, który maluje). Debiana polecam początkującym użytkownikom, ponieważ jego instalacja (i późniejsze zarządzanie nim) oraz obsługa jest prosta, od początku mamy środowisko graficzne (oczywiście możemy z niego zrezygnować) i ma dobre polskie manuale, które bardzo ułatwiają zapoznanie się z nim. Oczywiście piękne konfiguratorki pozwalają prawie wszystko wyklikać...
KDE to środowisko które po długim bytowaniu na GNOME bardzo przypadło mi do gustu, pomijając fakt że na debianie w wersji lenny konqueror ma czasami wypadki. Pracuje się na nim wygodnie i ma ładne bajerki w debianowym standardzie. Brakuje mi tutaj tylko monitora systemu takiego jak ma gnome. Prawie wszystkie programy w KDE mogą być ulokowane w trayu, co według mnie bardzo umila prace z wieloma programami na raz i programami które mają czekać na jakieś zdarzenie (np. przyjście maila :) ). W menu na początku trudno się odnaleźć, ponieważ mamy tam sporo pozycji. Na szczęście po paru odnalezieniach szukanego programu zapamiętujemy jego pozycję i w dodatku w pasku mamy listę najczęściej używanych przez nas programów. Programy są ładnie ze sobą połączone i ładnie ze sobą współgrają. Standardowe gry przykują nas na jakiś czas, gdy akurat będziemy coś robić, co będzie zjadało dużo zasobów, albo w oczekiwaniu na ściągnięcie się jakiegoś pliku.
Na koniec ważna informacja, z GG już nie korzystam i nie zamierzam do niego wracać. Numer już nie należy do mnie, więc jeśli ktoś by z niego do was pisał, to najprawdopodobniej nie będę to ja. Jeśli macie jakąś sprawę to piszcie maila, jeśli to wam nie odpowiada, zaopatrzcie się w jakiś komunikator z obsługą jabbera. Albo złapcie mnie na IRC'u.
2008-03-18
Ile trzeba odczekać po ściągnięciu pliku na rapidshare?-Sprostowanie
Heh... Po waszym odzewie na GG postanowiłem sprostować niektóre fakty dotyczące mojej ostatniej notki.
Po pierwsze, czas oczekiwania liczony jest od ZAKOŃCZENIA ściągania.
Po drugie, rozmiar jest liczony używając miary SI zamiast IEC 60027-2, co wprowadza małe zamieszanie. Czym się różnią te miary? Proszę o zapoznanie się z tym i tym artykułem na wikipedii.
Przepraszam za nieścisłości i dzięki wielkie za szybką reakcje.
Po pierwsze, czas oczekiwania liczony jest od ZAKOŃCZENIA ściągania.
Po drugie, rozmiar jest liczony używając miary SI zamiast IEC 60027-2, co wprowadza małe zamieszanie. Czym się różnią te miary? Proszę o zapoznanie się z tym i tym artykułem na wikipedii.
Przepraszam za nieścisłości i dzięki wielkie za szybką reakcje.
Ile trzeba odczekać po ściągnięciu pliku na rapidshare?
Odpowiedź wydaje się jasna, "Około 100 minut!", ale nie jest do końca prawidłowa. Po ściągnięciu wielu plików zaczełem prowadzić statystyki, które pozwoliły mi odgadnąć sposób w jaki rapidshare oblicza czas, jaki musisz odczekać.
Plików które wzieły udział w statystykach było 25. Po pierwszych dziesięciu plikach byłem już pewien, ale jak to zawsze bywa trzeba przeprowadzić jeszcze testy. Zapisywałem wszystko, długość pliku, nazwe, ile go ściągałem, ile musiałem poczekać i o jakiej porze. Nazwa pliku i pora ściągania nie ma żadnego wpływu na długość przerwy między kolejnymi plikami. Dla rapidshare liczy się chyba tylko długość pliku, tzn. jego rozmiar. Podejrzewam że RS zaokrągla rozmiar do megabajtów i każdy megabajt to minuta. Więc jeśli ściągneliśmy plik o wielkości 99MB to musimy czekać 99 minut, jeśli zaś ściągniemy plik o wielkości 7MB musimy czekać 7 minut.
Notka krótka , ponieważ temat jest krótki, przecież liczy się treść nie długość, prawda?
Plików które wzieły udział w statystykach było 25. Po pierwszych dziesięciu plikach byłem już pewien, ale jak to zawsze bywa trzeba przeprowadzić jeszcze testy. Zapisywałem wszystko, długość pliku, nazwe, ile go ściągałem, ile musiałem poczekać i o jakiej porze. Nazwa pliku i pora ściągania nie ma żadnego wpływu na długość przerwy między kolejnymi plikami. Dla rapidshare liczy się chyba tylko długość pliku, tzn. jego rozmiar. Podejrzewam że RS zaokrągla rozmiar do megabajtów i każdy megabajt to minuta. Więc jeśli ściągneliśmy plik o wielkości 99MB to musimy czekać 99 minut, jeśli zaś ściągniemy plik o wielkości 7MB musimy czekać 7 minut.
Notka krótka , ponieważ temat jest krótki, przecież liczy się treść nie długość, prawda?
2008-02-26
GPG-Czyli ochrona danych: Wprowadzenie.
Czy wiesz, że zanim twój mail lub każda inna wiadomość przechodzi ona przez średnio 30 komputerów? Na każdym z tych komputerów może czyhać jakiś zły ktoś, kto chce twoje hasełko lub fotkę. No może czeka na coś większego, np. kod jakiegoś programu, dane o twojej firmie, czy cokolwiek by się za ciebie podać by coś uzyskać. Możesz też chcieć ukryć jakieś dane przed rodzinką. Załóżmy że prowadzisz sennik lub dziennik, czy jakieś coś innego intymnego. Nie chcesz by ktoś to przeczytał, co zrobić?
Zaszyfrować! Tak. Szyfrowanie to najlepszy sposób na zabezpieczenie danych przed niechcianymi odbiorcami. Załóżmy, masz bazę danych z danymi osobowymi wielu ludzi. Nie mówię tutaj o takim gigancie jak nasza-klasa, ale wyciek danych tych 1000 osób też może być nie miły. Czym łatwo przesłać jakieś dane? Z rapidshare może każdy ściągnąć, więc to raczej nie jest dobry pomysł, nawet gdy archiwum jest zabezpieczone hasłem. Do skrzynki adresata na pewno mniej osób trzecich będzie miało dostęp. Ale jak wcześniej wspomniałem mail przechodzi przez wiele serwerów. A co powiesz na hasło które jest u ciebie o długości min 1024b-4096b? Takie hasło jest zabezpieczone twoim krótszym hasełkiem. Teraz jeszcze jeden myk. Ty masz swoje DWA hasłą. Prywatne i publiczne. Publiczne rozdajesz każdemu i każdy daje swoje tobie. Dane zakodowane jednym z kluczy można rozszyfrować tylko drugim. Nie ma problemu, ty kodujesz wiadomości do każdego innym kluczem, więc nawet gdy ktoś wykradnie jeden prywatny klucz jeden osoby, reszta dalej ze sobą bezpiecznie może prowadzić rozmowy. No dobrze, ale jeśli chcę wysłać dany plik Kasi, Basi, Markowi i Lukowi? Muszę każdy plik kodować oddzielnie i oddzielnie wysyłać? Odpowiedź brzmi NIE. Możesz zakodować jedną grupę danych wieloma kluczami, co pozwoli je "otworzyć" wieloma kluczami.
Ktoś mógł się włamać Kasi na maila! Teraz znając twój klucz publiczny może do Ciebie wysłać maila jako Kasia. Cały system szlag trafił? Odpowiedź brzmi NIE. Jest coś takiego jak podpis cyfrowy. Podpis cyfrowy jest jak twój własnoręczny podpis, bardzo trudny do podrobienia, mimo że jest cyfrowy. Sama zaszyfrowana wiadomość od Kasi nie świadczy że to wysłała Kasia, ale jak już wiadomość jest podpisana, to możemy być na 99.97% pewni że to Kasia do nas napisała. Jak już wcześniej wspomniałem cyfrowy podpis zastępuje normalny, odręczny. Normalnie moglibyśmy poznać naszego "rozmówcę" po charakterze pisma, ale to by nam nie dało stuprocentowej pewności że to On napisał. Na dobrą sprawę nawet jeśli rozmawiasz z kimś "oko w oko" też nie masz stuprocentowej pewności że to On, twój rozmówca może mieć brata bliźniaka lub klona, skąd wiesz że rząd USA lub Rosja już nie opracowali sposobu na klonowanie ludzi?
Zainteresowany? W następnej notce planuję opisać jak obsłużyć program GPG. Dla dociekliwych i niecierpliwych póki co odsyłam do wujka google. A skąd masz pewność że to Nikow napisał tą notatkę? ]:->
Zaszyfrować! Tak. Szyfrowanie to najlepszy sposób na zabezpieczenie danych przed niechcianymi odbiorcami. Załóżmy, masz bazę danych z danymi osobowymi wielu ludzi. Nie mówię tutaj o takim gigancie jak nasza-klasa, ale wyciek danych tych 1000 osób też może być nie miły. Czym łatwo przesłać jakieś dane? Z rapidshare może każdy ściągnąć, więc to raczej nie jest dobry pomysł, nawet gdy archiwum jest zabezpieczone hasłem. Do skrzynki adresata na pewno mniej osób trzecich będzie miało dostęp. Ale jak wcześniej wspomniałem mail przechodzi przez wiele serwerów. A co powiesz na hasło które jest u ciebie o długości min 1024b-4096b? Takie hasło jest zabezpieczone twoim krótszym hasełkiem. Teraz jeszcze jeden myk. Ty masz swoje DWA hasłą. Prywatne i publiczne. Publiczne rozdajesz każdemu i każdy daje swoje tobie. Dane zakodowane jednym z kluczy można rozszyfrować tylko drugim. Nie ma problemu, ty kodujesz wiadomości do każdego innym kluczem, więc nawet gdy ktoś wykradnie jeden prywatny klucz jeden osoby, reszta dalej ze sobą bezpiecznie może prowadzić rozmowy. No dobrze, ale jeśli chcę wysłać dany plik Kasi, Basi, Markowi i Lukowi? Muszę każdy plik kodować oddzielnie i oddzielnie wysyłać? Odpowiedź brzmi NIE. Możesz zakodować jedną grupę danych wieloma kluczami, co pozwoli je "otworzyć" wieloma kluczami.
Ktoś mógł się włamać Kasi na maila! Teraz znając twój klucz publiczny może do Ciebie wysłać maila jako Kasia. Cały system szlag trafił? Odpowiedź brzmi NIE. Jest coś takiego jak podpis cyfrowy. Podpis cyfrowy jest jak twój własnoręczny podpis, bardzo trudny do podrobienia, mimo że jest cyfrowy. Sama zaszyfrowana wiadomość od Kasi nie świadczy że to wysłała Kasia, ale jak już wiadomość jest podpisana, to możemy być na 99.97% pewni że to Kasia do nas napisała. Jak już wcześniej wspomniałem cyfrowy podpis zastępuje normalny, odręczny. Normalnie moglibyśmy poznać naszego "rozmówcę" po charakterze pisma, ale to by nam nie dało stuprocentowej pewności że to On napisał. Na dobrą sprawę nawet jeśli rozmawiasz z kimś "oko w oko" też nie masz stuprocentowej pewności że to On, twój rozmówca może mieć brata bliźniaka lub klona, skąd wiesz że rząd USA lub Rosja już nie opracowali sposobu na klonowanie ludzi?
Zainteresowany? W następnej notce planuję opisać jak obsłużyć program GPG. Dla dociekliwych i niecierpliwych póki co odsyłam do wujka google. A skąd masz pewność że to Nikow napisał tą notatkę? ]:->
2008-02-09
Programowanie, czyli układanie programu z klocków.
Programowanie jest jak układanie budowli z klocków. Budując coś z klocków pierw myślisz jakie to coś ma być. Później szukasz odpowiednich klocków i tworzysz. Tak samo jest z programowaniem, pierw myślimy co ma robić nasz program, później jak ma to zrobić, a na końcu tworzymy to. Większość programów to duże budowle, więc różne części tych budowli tworzą różni ludzie. Nie zawsze to co zbudowało wiele osób współgra ze sobą, więc trzeba to przerabiać. Często do różnych zestawów są dołączone instrukcje, co jak poskładać, przypominają one pierwsze algorytmy które poznaje raczkujący programista.
Pewnie zaprzeczysz, ale spójrz na język maszynowy. Jest on ograniczony do paruset rozkazów, z których jest zbudowana twoja ulubiona gra komputerowa, twój ulubiony program, przeglądarka... To odpowiednie połączenie tych małych klocuszków sprawia, że te kolosy, które nie raz mają ponad gigabajt, działają jak należy. Dla porównania mój najdłuższy samodzielny kod w assemblerze, nie ważył nawet jednego megabajta(przy pisaniu systemu operacyjnego pomagało mi parę osób, za co bardzo im dziękuje). Tysiące linii kodu i megabajty danych, które są bardzo podobne, a jednocześnie tak różne...
Kolejnym przykładem jest C. C to niby język wysokiego poziomu, ale według mnie to taki mniej wygodny nieco bardziej przenośny assembler. Mimo swojej świetności, nie obsługuje wszystkich rozkazów procesora, nie, nie chodzi mi o te najnowsze, te stare też nie są dostępne bez wstawki asemblerowej. Chodzi mi tutaj o "jo" i "jc". Tutaj też mamy gotowe funkcje, zmienne, warunki, ale czego się spodziewać po klockach stworzonych z mniejszych klocków? Oczywiście z dostarczonych klocków możemy stworzyć nowe klocki, bo po co składać od nowa 10 razy wierze, jak można wykorzystać ten sam projekt wiele razy?
C++ czyli wady C i parę dodatkowych... Tutaj dostajemy możliwość posegregowania naszej twórczości. Oczywiście możemy tej możliwości nie używać, ale jest ona bardzo wygodna gdy ktoś buduje z nami. Nie musimy wiedzieć jak jego konstrukcja działa w środku, wystarczy że wiemy jak tego używać. Przecież po co Ci wiedzieć jak Ździsu zbudował rakietę, jeśli ty tylko chcesz dla niej zbudować hangar?
Python. Budujesz coś z konstrukcji. Ktoś coś zbudował w C, a Ty teraz budujesz z tego coś lepszego, ale nie wiesz tak naprawdę co jest w środku. Możesz zmieniać nazwy prawie wszystkiemu, przecież po co pisać KoparkaJasiaIKrysi, jeśli można napisać koparka? Dodatkowo do pudełka na dane same się dostosowują do zawartości. Jeśli zapomnimy czegoś posrzątać, zrobi to za nas niania. Nasze klocki są bardzo przenośne :)
Może światem komputerów nie rządzi zdecydowany bit, tylko dziecięce klocki?
Pewnie zaprzeczysz, ale spójrz na język maszynowy. Jest on ograniczony do paruset rozkazów, z których jest zbudowana twoja ulubiona gra komputerowa, twój ulubiony program, przeglądarka... To odpowiednie połączenie tych małych klocuszków sprawia, że te kolosy, które nie raz mają ponad gigabajt, działają jak należy. Dla porównania mój najdłuższy samodzielny kod w assemblerze, nie ważył nawet jednego megabajta(przy pisaniu systemu operacyjnego pomagało mi parę osób, za co bardzo im dziękuje). Tysiące linii kodu i megabajty danych, które są bardzo podobne, a jednocześnie tak różne...
Kolejnym przykładem jest C. C to niby język wysokiego poziomu, ale według mnie to taki mniej wygodny nieco bardziej przenośny assembler. Mimo swojej świetności, nie obsługuje wszystkich rozkazów procesora, nie, nie chodzi mi o te najnowsze, te stare też nie są dostępne bez wstawki asemblerowej. Chodzi mi tutaj o "jo" i "jc". Tutaj też mamy gotowe funkcje, zmienne, warunki, ale czego się spodziewać po klockach stworzonych z mniejszych klocków? Oczywiście z dostarczonych klocków możemy stworzyć nowe klocki, bo po co składać od nowa 10 razy wierze, jak można wykorzystać ten sam projekt wiele razy?
C++ czyli wady C i parę dodatkowych... Tutaj dostajemy możliwość posegregowania naszej twórczości. Oczywiście możemy tej możliwości nie używać, ale jest ona bardzo wygodna gdy ktoś buduje z nami. Nie musimy wiedzieć jak jego konstrukcja działa w środku, wystarczy że wiemy jak tego używać. Przecież po co Ci wiedzieć jak Ździsu zbudował rakietę, jeśli ty tylko chcesz dla niej zbudować hangar?
Python. Budujesz coś z konstrukcji. Ktoś coś zbudował w C, a Ty teraz budujesz z tego coś lepszego, ale nie wiesz tak naprawdę co jest w środku. Możesz zmieniać nazwy prawie wszystkiemu, przecież po co pisać KoparkaJasiaIKrysi, jeśli można napisać koparka? Dodatkowo do pudełka na dane same się dostosowują do zawartości. Jeśli zapomnimy czegoś posrzątać, zrobi to za nas niania. Nasze klocki są bardzo przenośne :)
Może światem komputerów nie rządzi zdecydowany bit, tylko dziecięce klocki?
2008-02-04
Język angielski
Twoim ojczystym językiem jest zapewne Polski. Polski jest językiem trudniejszym od angielskiego, co już pewnie nie raz słyszałeś. Jednak dopóki sam nie spróbujesz czegoś przeczytać w tym języku nie przekonamy się o tym. Oczywiście pierw będzie Ci trudno, będziesz powoli domyślał się o co w tym chodzi i często będziesz zaglądał do słownika.
Oczywiście nie nakazuje Ci zaglądać do słownika papierkowego, ponieważ czasami odnalezienie danego słowa może się nie udać lub zająć dużo czasu. IMHO najlepszym słownikiem angielsko-polskim i nie tylko jest ling.pl, który korzysta z wielu słowników na raz. Oprócz zwykłego znaczenia danego słowa, często są podane przykłady jego użycia, co daje jakiś wgląd w sposób używania danego słowa.
Jak się uczyć? Oczywiście podstawy musisz zgłębić w sposób normalny, ale uczenie się słówek na pamięć już jest IMHO złym pomysłem. O wiele ciekawsze wydaje mi się czytanie książki w języku angielskim, albo jakiegoś opowiadania. Na początku nie musisz znać wszystkich słówek, chodzi tylko o to byś rozumiał mniej więcej akcję. Z czasem będziesz rozumiał coraz więcej i więcej. Zaglądając do słownika poznasz słowa.
Gdy już będziesz rozumiał co nie co po angielsku, możesz zacząć się uczyć z materiałów o wybranej przez ciebie tematyce. Ale pamiętaj że twój angielski jeszcze nie jest świetny, więc będzie Ci trudno się uczyć z materiałów przeładowanych różnymi pojęciami technicznymi, kodami itd. Wtedy dobrą metodą jest próba przekładu tekstu zdanie po zdaniu i zapisywanie przetłumaczonego do jakiegoś edytora tekstowego. Masz z tego trzy korzyści. Pierwszą z nich jest fakt że będzie Ci łatwiej zrozumieć ten przełożony tekst i łatwiej będzie Ci wyszukać interesujących Cię informacji w przyszłości. Druga korzyść to to że możesz udostępnić ten przetłumaczony tekst na jakiejś stronie, blogu, na jakimś forum lub gdziekolwiek indziej dla kolejnych ludzi, jeśli będziesz często zamieszczał takie tłumaczenia, możesz zdobyć pewnego rodzaju sławę. Trzecią korzyścią jest to że więcej zapamiętasz, przecież nie dość że przeczytasz, to jeszcze będziesz musiał to zrozumieć i napisać.
Dlaczego angielski jest taki ważny? Przede wszystkim dlatego że większość nowych szanujących się ekspertów z danej dziedziny piszę po angielsku. Nie to że nie są patriotami, albo że jest taka moda, po prostu teraz każdy uczy się angielskiego, więc każdy w jakimś stopniu go rozumie. Idąc dalej tym tokiem myślenia, w czasach gdy pobieramy dane z każdego serwera na świecie, lepiej pisać językiem który zrozumie szersze grono. Wtedy też łatwiej o tłumaczy, przecież nie jeden polak zna angielski, ba, każdy informatyk musi znać, to samo z niemcem, francuzem, portugalczykiem, rosjaninem itd...
Po co to napisałem i dlaczego wrzuciłem do wszystkich etykiet? Pierw zacznę od etykiet, angielski jest w każdej dziedzinie mojego życia, taka jest prawda, jestem informatykiem i bez angielskiego nie ma rusz. Tak samo jest z elektroniką, wszystkie nowinki dobrze jest przyjmować z pierwszej ręki, a najczęściej są one wydawane po angielsku. :) Ta notka powstała pewnie dlatego że nie napisałem dla pana od angielskiego wypracowania, tak się dowiadywałem które zadanie, że i tak się nie dowiedziałem.
PS: Z niemieckiego nic nie kapuje, kto mi da korki za free? :/
Oczywiście nie nakazuje Ci zaglądać do słownika papierkowego, ponieważ czasami odnalezienie danego słowa może się nie udać lub zająć dużo czasu. IMHO najlepszym słownikiem angielsko-polskim i nie tylko jest ling.pl, który korzysta z wielu słowników na raz. Oprócz zwykłego znaczenia danego słowa, często są podane przykłady jego użycia, co daje jakiś wgląd w sposób używania danego słowa.
Jak się uczyć? Oczywiście podstawy musisz zgłębić w sposób normalny, ale uczenie się słówek na pamięć już jest IMHO złym pomysłem. O wiele ciekawsze wydaje mi się czytanie książki w języku angielskim, albo jakiegoś opowiadania. Na początku nie musisz znać wszystkich słówek, chodzi tylko o to byś rozumiał mniej więcej akcję. Z czasem będziesz rozumiał coraz więcej i więcej. Zaglądając do słownika poznasz słowa.
Gdy już będziesz rozumiał co nie co po angielsku, możesz zacząć się uczyć z materiałów o wybranej przez ciebie tematyce. Ale pamiętaj że twój angielski jeszcze nie jest świetny, więc będzie Ci trudno się uczyć z materiałów przeładowanych różnymi pojęciami technicznymi, kodami itd. Wtedy dobrą metodą jest próba przekładu tekstu zdanie po zdaniu i zapisywanie przetłumaczonego do jakiegoś edytora tekstowego. Masz z tego trzy korzyści. Pierwszą z nich jest fakt że będzie Ci łatwiej zrozumieć ten przełożony tekst i łatwiej będzie Ci wyszukać interesujących Cię informacji w przyszłości. Druga korzyść to to że możesz udostępnić ten przetłumaczony tekst na jakiejś stronie, blogu, na jakimś forum lub gdziekolwiek indziej dla kolejnych ludzi, jeśli będziesz często zamieszczał takie tłumaczenia, możesz zdobyć pewnego rodzaju sławę. Trzecią korzyścią jest to że więcej zapamiętasz, przecież nie dość że przeczytasz, to jeszcze będziesz musiał to zrozumieć i napisać.
Dlaczego angielski jest taki ważny? Przede wszystkim dlatego że większość nowych szanujących się ekspertów z danej dziedziny piszę po angielsku. Nie to że nie są patriotami, albo że jest taka moda, po prostu teraz każdy uczy się angielskiego, więc każdy w jakimś stopniu go rozumie. Idąc dalej tym tokiem myślenia, w czasach gdy pobieramy dane z każdego serwera na świecie, lepiej pisać językiem który zrozumie szersze grono. Wtedy też łatwiej o tłumaczy, przecież nie jeden polak zna angielski, ba, każdy informatyk musi znać, to samo z niemcem, francuzem, portugalczykiem, rosjaninem itd...
Po co to napisałem i dlaczego wrzuciłem do wszystkich etykiet? Pierw zacznę od etykiet, angielski jest w każdej dziedzinie mojego życia, taka jest prawda, jestem informatykiem i bez angielskiego nie ma rusz. Tak samo jest z elektroniką, wszystkie nowinki dobrze jest przyjmować z pierwszej ręki, a najczęściej są one wydawane po angielsku. :) Ta notka powstała pewnie dlatego że nie napisałem dla pana od angielskiego wypracowania, tak się dowiadywałem które zadanie, że i tak się nie dowiedziałem.
PS: Z niemieckiego nic nie kapuje, kto mi da korki za free? :/
2008-02-02
Iran całkowicie odcięty od sieci, czy szykuje się wojna?
Grupa Flag ogłosiła że wczoraj został przecięty trzeci, czyli ostatni, optyczny kabel podmorski o nazwie Falcon. Pierwszy został przecięty kabel SEA-ME-WE4 o 23:30 w środę, a drugi kabel Flag Telecom o 2:30 w czwartek.
Awaria pokazała jaką kruchą strukturą jest internet. Wystarczy poprzerywać kable na dnie oceanów i większość sieci jest niedostępna. Nagle cała między sieć polega tylko na falach, co powoduje jej przeciążenie. Przeciążona sieć się zapycha i dostęp gdziekolwiek graniczy z cudem. Wtedy jedynym dobrym środkiem przekazu danych będą radioamatorzy, którzy jak zawszę pokażą swoją potęgę, gdy dojdzie do katastrofy. O telewizji cyfrowej nie będzie można nawet mówić, zostaną tylko analogówki. Na całym świecie zapanowałby chaos!
Przerwanie jednego kabla można uznać za przypadek. Przerwanie dwóch kabli za zbieg okoliczności, przecież mówi się "Nieszczęścia chodzą parami.". Trzeci kabel dwie myśli, albo to naprawdę bardzo nieszczęśliwy zbieg okoliczności, albo ktoś chcę odciąć Iran od sieci. Trzeci kabel tylko poparł moje domysły że coś niedobrego się szykuje. Zacząłem przeszukiwać sieć.
Pierw przeprowadziłem parę własnych testów próbując wejść na parę stron z ".ir". Udało się wejść na ich strony, ale opóźnienie i ilość zgubionych pakietów nie napawała optymizmem. Najważniejsze jest że połączenie działa. Zawsze można odciąć prywatnych użytkowników oraz firmy i zostawić sieć dla najbardziej potrzebujących placówek.
Kolejnym dowodem na to że to całe zdarzenie to nie przypadek jest zniknięcie od stycznia 2008r łodzi podwodnej klasy Seawolf, USS Jimmy Carter z macierzystej bazy Kitsa/Bangor. Co było takiego szczególnego w tej łodzi? Łódź ta została wyposażona w sprzęt, który pozwala na przecinanie kabli i wpinanie się w nie, powodując zakłócenia, pierwotnie miało to zakłócać podsłuchy, ale kto wie jak to może zostać wykorzystane teraz? US Navy oczywiście zaprzecza tym pogłoską, ale Oni zaprzeczają wszystkiemu co złe... Społeczność Google Earth poszukuje tego okrętu.
Oficjalnie sądzi się że to statek ciągnący za sobą opuszczoną kotwicę pozrywał te kable transmisyjne. Ale po tym co wyczytałem z wikipedii kable są kompozytową konstrukcją stali i polietylenu, więc raczej byle kotwica ich nie uszkodzi.
Źródło: www.webhosting.pl
PS: Pamiętacie sprawę z Irakiem?
Awaria pokazała jaką kruchą strukturą jest internet. Wystarczy poprzerywać kable na dnie oceanów i większość sieci jest niedostępna. Nagle cała między sieć polega tylko na falach, co powoduje jej przeciążenie. Przeciążona sieć się zapycha i dostęp gdziekolwiek graniczy z cudem. Wtedy jedynym dobrym środkiem przekazu danych będą radioamatorzy, którzy jak zawszę pokażą swoją potęgę, gdy dojdzie do katastrofy. O telewizji cyfrowej nie będzie można nawet mówić, zostaną tylko analogówki. Na całym świecie zapanowałby chaos!
Przerwanie jednego kabla można uznać za przypadek. Przerwanie dwóch kabli za zbieg okoliczności, przecież mówi się "Nieszczęścia chodzą parami.". Trzeci kabel dwie myśli, albo to naprawdę bardzo nieszczęśliwy zbieg okoliczności, albo ktoś chcę odciąć Iran od sieci. Trzeci kabel tylko poparł moje domysły że coś niedobrego się szykuje. Zacząłem przeszukiwać sieć.
Pierw przeprowadziłem parę własnych testów próbując wejść na parę stron z ".ir". Udało się wejść na ich strony, ale opóźnienie i ilość zgubionych pakietów nie napawała optymizmem. Najważniejsze jest że połączenie działa. Zawsze można odciąć prywatnych użytkowników oraz firmy i zostawić sieć dla najbardziej potrzebujących placówek.
Kolejnym dowodem na to że to całe zdarzenie to nie przypadek jest zniknięcie od stycznia 2008r łodzi podwodnej klasy Seawolf, USS Jimmy Carter z macierzystej bazy Kitsa/Bangor. Co było takiego szczególnego w tej łodzi? Łódź ta została wyposażona w sprzęt, który pozwala na przecinanie kabli i wpinanie się w nie, powodując zakłócenia, pierwotnie miało to zakłócać podsłuchy, ale kto wie jak to może zostać wykorzystane teraz? US Navy oczywiście zaprzecza tym pogłoską, ale Oni zaprzeczają wszystkiemu co złe... Społeczność Google Earth poszukuje tego okrętu.
Oficjalnie sądzi się że to statek ciągnący za sobą opuszczoną kotwicę pozrywał te kable transmisyjne. Ale po tym co wyczytałem z wikipedii kable są kompozytową konstrukcją stali i polietylenu, więc raczej byle kotwica ich nie uszkodzi.
Źródło: www.webhosting.pl
PS: Pamiętacie sprawę z Irakiem?
2008-01-28
Hasła
"Hasła są jak majtki. Nie zostawiaj ich w miejscu, w którym inni mogą je zobaczyć, zmieniaj je regularnie... i lepiej nikomu nie pożyczaj."-Skądś z sieci...
Ta notatka będzie o hasłach. Czy uważasz że masz dobre hasło? Mam nadzieje że ta notka pozwoli Ci takie stworzyć.
hasło powinno być co jakiś czas wymieniane, jeśli to hasło do czegoś ważnego, to wtedy wymieniamy je często, gdy jest to hasło do czegoś co możemy utracić, nie musimy wymieniać haseł. Nasze hasło powinno mieć co najmniej 8 znaków i powinno się składać z dużych i małych liter, cyfr oraz znaków specjalnych. Jedynym miejscem gdzie możesz sobie zapisać twoje hasło jest głowa, wszelkie hasła na kartkach, w telefonach i w innych miejscach mogą zostać podglądnięte. Nie podawaj go pod żadnym pozorem, nawet żonie, przyjaciółce, przyjacielowi, mężowi, bratu, siostrze, psu, kotu itd... NIKOMU! Twoje hasło możesz tylko ty znać!
No ale możemy wyznawać zasadę "Dobry system, nie jest zły." i tworzyć kolejne hasła według systemu. Sprawdzonym systemem jest podawanie jako hasło jakiegoś przedmiotu z otoczenia, z tym że zamiast dawać odpowiednie literki dajemy o jedną wyżej, niżej lub po bokach. Dla przykładu "klawiatura" będzie wyglądała w ten sposób "ioq28q574q", proste, lecz skuteczne hasło, do tego możemy dodać w co drugim znaku shift i uzyskamy "iOq@8Q5&4Q", to hasło jest bardzo trudne do złamania...
Innym systemem, nastawionym głównie na długość hasła są cytaty z różnych książek. Mogą być to zdania, wersy, kolumny, części zdań. Książki też mogą być bardzo różne. Ten sposób można oczywiście połączyć z poprzednim systemem.
Kolejny system to odwracanie tekstu. Po prostu wybiera się jakieś słowo i odwraca.
Spotkałem się z dodawaniem jakiś znaków między literki. Oczywiście ten sposób można połączyć z poprzednimi tworząc naprawdę potężne hasło.
Mam nadzieje że ta notatka pomoże wam stworzyć lepsze hasła. Jeśli macie jakiś system tworzenia haseł, poproszę o wpisywanie go do komentarzy. W ten sposób stworzymy system do tworzenia naprawdę potężnych haseł :)
Ta notatka będzie o hasłach. Czy uważasz że masz dobre hasło? Mam nadzieje że ta notka pozwoli Ci takie stworzyć.
hasło powinno być co jakiś czas wymieniane, jeśli to hasło do czegoś ważnego, to wtedy wymieniamy je często, gdy jest to hasło do czegoś co możemy utracić, nie musimy wymieniać haseł. Nasze hasło powinno mieć co najmniej 8 znaków i powinno się składać z dużych i małych liter, cyfr oraz znaków specjalnych. Jedynym miejscem gdzie możesz sobie zapisać twoje hasło jest głowa, wszelkie hasła na kartkach, w telefonach i w innych miejscach mogą zostać podglądnięte. Nie podawaj go pod żadnym pozorem, nawet żonie, przyjaciółce, przyjacielowi, mężowi, bratu, siostrze, psu, kotu itd... NIKOMU! Twoje hasło możesz tylko ty znać!
No ale możemy wyznawać zasadę "Dobry system, nie jest zły." i tworzyć kolejne hasła według systemu. Sprawdzonym systemem jest podawanie jako hasło jakiegoś przedmiotu z otoczenia, z tym że zamiast dawać odpowiednie literki dajemy o jedną wyżej, niżej lub po bokach. Dla przykładu "klawiatura" będzie wyglądała w ten sposób "ioq28q574q", proste, lecz skuteczne hasło, do tego możemy dodać w co drugim znaku shift i uzyskamy "iOq@8Q5&4Q", to hasło jest bardzo trudne do złamania...
Innym systemem, nastawionym głównie na długość hasła są cytaty z różnych książek. Mogą być to zdania, wersy, kolumny, części zdań. Książki też mogą być bardzo różne. Ten sposób można oczywiście połączyć z poprzednim systemem.
Kolejny system to odwracanie tekstu. Po prostu wybiera się jakieś słowo i odwraca.
Spotkałem się z dodawaniem jakiś znaków między literki. Oczywiście ten sposób można połączyć z poprzednimi tworząc naprawdę potężne hasło.
Mam nadzieje że ta notatka pomoże wam stworzyć lepsze hasła. Jeśli macie jakiś system tworzenia haseł, poproszę o wpisywanie go do komentarzy. W ten sposób stworzymy system do tworzenia naprawdę potężnych haseł :)
2008-01-27
Dane milionów polaków jednak są bezpieczne.
Na stronie hacking.pl przedstawiono ten artykuł. Postanowiłem sprawdzić czy to prawda. Napisałem skrypt w Pythonie, który pobierał kolejne dane z kont i zapisywał do bazy danych. Trochę mi zajęło napisanie takiego skryptu. Przyszedł czas na test. Pobrałem pierwsze 3 tysiące kont. Wszystko wydawało się ładnie pięknie ściągać, zero errorów (nie licząc paru timeout'ów). Postanowiłem rzucić okiem na rekordy, w celu przeprowadzenia statystyk.
Popatrzyłem na imiona i nazwiska, już coś było nie tak("Martyna Kowalski"), ale nie zrażając się spojrzałem na nicki. Siwy, łysy, gruby, mała, żaba. I te nicki w kółko, przez 3000 rekordów. Raczej wątpię w to że wszyscy Polacy używają tylko 5 nicków...
W mojej głowie zrodziło się więc pytanie, czy 7 z 8 milionów użytkowników serwisu NK to konta nie należące do nikogo? Czy zostanę sławny??? Postanowiłem nie zwlekać, spojrzałem na jeden z zapisanych profili. Numerek się zgadzał, ale dane znowu były inne. Przeładowałem stronę, dane znów się zmieniły. Postanowiłem założyć nowe konto. Na wszelki wypadek zresetowałem neostradę, by zmienić IP i pozbyłem się ciasteczek. Odwiedziłem ten sam profil, dane się znów zmieniły. Przeładowałem stronę... Są te same! O! I nick inny niż te wyżej wymienione!
No niestety, dzisiaj nie zostanę sławny... Jeszcze nie dziś... Może jutro? Pojutrze?
"Tak, czy siak, nie ważne i tak..."
Popatrzyłem na imiona i nazwiska, już coś było nie tak("Martyna Kowalski"), ale nie zrażając się spojrzałem na nicki. Siwy, łysy, gruby, mała, żaba. I te nicki w kółko, przez 3000 rekordów. Raczej wątpię w to że wszyscy Polacy używają tylko 5 nicków...
W mojej głowie zrodziło się więc pytanie, czy 7 z 8 milionów użytkowników serwisu NK to konta nie należące do nikogo? Czy zostanę sławny??? Postanowiłem nie zwlekać, spojrzałem na jeden z zapisanych profili. Numerek się zgadzał, ale dane znowu były inne. Przeładowałem stronę, dane znów się zmieniły. Postanowiłem założyć nowe konto. Na wszelki wypadek zresetowałem neostradę, by zmienić IP i pozbyłem się ciasteczek. Odwiedziłem ten sam profil, dane się znów zmieniły. Przeładowałem stronę... Są te same! O! I nick inny niż te wyżej wymienione!
No niestety, dzisiaj nie zostanę sławny... Jeszcze nie dziś... Może jutro? Pojutrze?
"Tak, czy siak, nie ważne i tak..."
2008-01-24
Co to jest Python?
W grudniu 1989r, pewien holenderski programista, Guido van Rossum, szukał amatorskiego projektu programistycznego, który zająłby go w tygodniu przed świętami. Zdecydował się napisać interpreter nowego języka skryptowego, który przemawiałby do hakerów Unixa i C. Jako wielki fan Latającego cyrku Monty Pythona wybrał dla niego nazwę Python.
Tak zrodziła się potęga, powstał nowy interpretowany i interaktywny język programowania, posiadający w pełni dynamiczny system typów oraz automatyczne zarządzanie pamięcią. Python jest projektem Open Source, zarządzany przez organizację Python Software Fundation. Aktualnie Python dostępny jest pod platformy takie jak: Windows, Linux/Unix, Mac OS X, OS/2, Amiga, Palm Handhelds i telefony komórkowe Nokia. Ponadto został przeportowany pod Java oraz pod platformę .NET. Uważam że potwierdzeniem jakości tego języka jest fakt że jest on wykorzystywany w wyszukiwarce Google oraz w NASA.
Ponadto nie wymusza jednego stylu programowania, ponadto typy są sprawdzane dynamicznie, a do zarządzania pamięcią używa się garbage collection(czyli zbieranie nieużytków). Choć w jego popularyzacji kładzie się nacisk na różnice w stosunku do Perla, Python jest pod wieloma względami do niego podobny. Jednakże projektanci Pythona odrzucili złożoną składnię Perla na rzecz bardziej oszczędnej i IMHO bardziej czytelnej. Mimo że Python jest czasem klasyfikowany jako język skryptowy, wykorzystuje się go do tworzenia dużych projektów jak serwer aplikacji Zope czy system wymiany plików Mojo Nation.
Mam nadzieje że teraz już masz ogólny zarys Pythona. Notatka powstała na podstawie wikipedii, więc wszelkie podobieństwa z nią nie są przypadkowe...
PS: Dziękuje anonimowi za komentarz, który pozwoli mi się poprawić. Oby takich więcej! ;)
Tak zrodziła się potęga, powstał nowy interpretowany i interaktywny język programowania, posiadający w pełni dynamiczny system typów oraz automatyczne zarządzanie pamięcią. Python jest projektem Open Source, zarządzany przez organizację Python Software Fundation. Aktualnie Python dostępny jest pod platformy takie jak: Windows, Linux/Unix, Mac OS X, OS/2, Amiga, Palm Handhelds i telefony komórkowe Nokia. Ponadto został przeportowany pod Java oraz pod platformę .NET. Uważam że potwierdzeniem jakości tego języka jest fakt że jest on wykorzystywany w wyszukiwarce Google oraz w NASA.
Ponadto nie wymusza jednego stylu programowania, ponadto typy są sprawdzane dynamicznie, a do zarządzania pamięcią używa się garbage collection(czyli zbieranie nieużytków). Choć w jego popularyzacji kładzie się nacisk na różnice w stosunku do Perla, Python jest pod wieloma względami do niego podobny. Jednakże projektanci Pythona odrzucili złożoną składnię Perla na rzecz bardziej oszczędnej i IMHO bardziej czytelnej. Mimo że Python jest czasem klasyfikowany jako język skryptowy, wykorzystuje się go do tworzenia dużych projektów jak serwer aplikacji Zope czy system wymiany plików Mojo Nation.
Mam nadzieje że teraz już masz ogólny zarys Pythona. Notatka powstała na podstawie wikipedii, więc wszelkie podobieństwa z nią nie są przypadkowe...
PS: Dziękuje anonimowi za komentarz, który pozwoli mi się poprawić. Oby takich więcej! ;)
2008-01-21
System binarny
System binarny zwany też dwójkowym, jest systemem "ojczystym" każdego dzisiejszego komputera. Najprawdopodobniej dlatego że ogranicza się do dwóch stanów, albo jest napięcie albo go nie ma. Co prawda w pierwszych komputerach próbowano używać dziesiątkowego(decymalnego/arabskiego) systemu liczbowego, ale trudna implementacja spowodowała przejście do systemu binarnego, który jest na pozór trudniejszy. Ten pozór tworzy fakt że jesteśmy przyzwyczajeni do systemu decymalnego. Dobra przejdźmy do rzeczy...
W systemie binarnym operujemy dwoma cyframi, 1 i 0, a więc mamy podstawę 2. Tego dowiedziałeś się z poprzedniej notki. Na początku przedstawię jak zamienić liczbę decymalną na binarną. Weźmy jakąś liczbę, no załóżmy mój numer GG. :) Pierw przedstawię przykład, a później go wytłumaczę.
Teraz zapiszmy naszą resztę od dołu, tzn. wspak. Wyszło więc 100001010101010101001011b. Hmm... A więc dobra... No to tak, co zrobiliśmy?
Mieliśmy liczbę wyjściową, nazwijmy ją sobie x, miała ona wartość 8738123. Dzieliliśmy ją przez 2 dopóki x nie było równe 0, a resztę zapisywaliśmy. x miało wartość naszego ostatniego wyniku. Mam nadzieje że rozumiesz.
Teraz spróbujmy naszą pięknie długą liczbę binarną odmienić na taką, jaka była na początku. Są dwie metody które są bardzo popularne, jedna się opiera na matmie, druga jest metodą tabelkową. Pierw przedstawię metodę tabelkową. Robimy sobie tabelkę, coś takiego:
1024 512 256 128 64 32 16 8 4 2 1
Później piszemy sobie naszą liczbę binarną pod kolejnymi liczbami i uzyskujemy liczbę dziesiętną, spróbuj sam poszerzyć tą tabelkę i tym sposobem przekształcić mój nrGG z systemu binarnego na system decymalny. Ja teraz przedstawię drugą metodę, ta metoda potrzebuje więcej liczenia, ale łatwiej ją wbudować w program.
100001010101010101001011b=
1*2**0+1*2**1+0*2**2+1*2**3+0*2**4+0*2**5+1*2**6+0*2**7+1*2**8+0*2**9+
1*2**10+0*2**11+1*2**12+0*2**13+1*2**14+0*2**15+1*2**16+0*2**17+1*2**18+
0*2**19+0*2**20+0*2**21+0*2**22+1*2**23=
1*2**0+1*2**1+1*2**3+1*2**6+1*2**8+1*2**10+1*2**12+1*2**14+1*2**16+1*2**18+
1*2**23=8738123
Dobra, a więc co my tutaj zrobiliśmy? Po pierwsze odwróciliśmy znowu naszą liczbę binarną. Teraz po prostu mnożymy każdą cyfrę naszej liczby binarnej z potęgą liczby dwa o wykładniku równym numerowi pozycji od lewej strony licząc od zera. Pierw podałem liczbę binarną, później działanie zgodne z poprzednim zdaniem. Kolejnym działaniem jest tym samym działaniem tylko że wyciełem cyfry 0 liczby binarnej. Na końcu jest ofc wynik.
Dla poćwiczenia spróbuj zamienić tą metodą na liczby decymalne:
101b
1011b
101101b
10011001b
10101010b
Metodą tabelkową:
10101b
10001b
101010101b
100010001b
10000b
Oraz zamień na liczby binarne:
11
2
1993
2008
2116
9345
2012
643
352
234
101
Odpowiedzi zostały zakodowane za pomocą base64 którego dekoder znajdziesz tutaj.
T2Rwb3dpZWR6aSBkbyB6YWRhbmlhIDE6
DQo1DQoxMQ0KNDUNCjE1Mw0KMTcwDQ
pPZHBvd2llZHppIGRvIHphZGFuaWEgMjoN
CjIxDQoxNw0KMzQxDQoyNzMNCjE2DQpP
ZHBvd2llZHppIGRvIHphZGFuaWEgMzoNCj
EwMTFiDQoxMGINCjExMTExMDAxMDAxYg
0KMTExMTEwMTEwMDBiDQoxMDAwMDEw
MDAxMDBiDQoxMDAxMDAxMDAwMDAwM
WINCjExMTExMDExMTAwYg0KMTAxMDAw
MDAxMWINCjEwMTEwMDAwMGINCjExMTA
xMDEwYg0KMTEwMDEwMWI=
W systemie binarnym operujemy dwoma cyframi, 1 i 0, a więc mamy podstawę 2. Tego dowiedziałeś się z poprzedniej notki. Na początku przedstawię jak zamienić liczbę decymalną na binarną. Weźmy jakąś liczbę, no załóżmy mój numer GG. :) Pierw przedstawię przykład, a później go wytłumaczę.
| Dzialanie | Reszta |
| 8738123/2=4369061 | 1 |
| 4369061/2=2184530 | 1 |
| 2184530/2=1092265 | 0 |
| 1092265/2=546132 | 1 |
| 546132/2=273066 | 0 |
| 273066/2=136533 | 0 |
| 136533/2=68266 | 1 |
| 68266/2=34133 | 0 |
| 34133/2=17066 | 1 |
| 17066/2=8533 | 0 |
| 8533/2=4266 | 1 |
| 4266/2=2133 | 0 |
| 2133/2=1066 | 1 |
| 1066/2=533 | 0 |
| 533/2=266 | 1 |
| 266/2=133 | 0 |
| 133/2=66 | 1 |
| 66/2=33 | 0 |
| 33/2=16 | 1 |
| 16/2=8 | 0 |
| 8/2=4 | 0 |
| 4/2=2 | 0 |
| 2/2=1 | 0 |
| 1/2=0 | 1 |
Teraz zapiszmy naszą resztę od dołu, tzn. wspak. Wyszło więc 100001010101010101001011b. Hmm... A więc dobra... No to tak, co zrobiliśmy?
Mieliśmy liczbę wyjściową, nazwijmy ją sobie x, miała ona wartość 8738123. Dzieliliśmy ją przez 2 dopóki x nie było równe 0, a resztę zapisywaliśmy. x miało wartość naszego ostatniego wyniku. Mam nadzieje że rozumiesz.
Teraz spróbujmy naszą pięknie długą liczbę binarną odmienić na taką, jaka była na początku. Są dwie metody które są bardzo popularne, jedna się opiera na matmie, druga jest metodą tabelkową. Pierw przedstawię metodę tabelkową. Robimy sobie tabelkę, coś takiego:
1024 512 256 128 64 32 16 8 4 2 1
Później piszemy sobie naszą liczbę binarną pod kolejnymi liczbami i uzyskujemy liczbę dziesiętną, spróbuj sam poszerzyć tą tabelkę i tym sposobem przekształcić mój nrGG z systemu binarnego na system decymalny. Ja teraz przedstawię drugą metodę, ta metoda potrzebuje więcej liczenia, ale łatwiej ją wbudować w program.
100001010101010101001011b=
1*2**0+1*2**1+0*2**2+1*2**3+0*2**4+0*2**5+1*2**6+0*2**7+1*2**8+0*2**9+
1*2**10+0*2**11+1*2**12+0*2**13+1*2**14+0*2**15+1*2**16+0*2**17+1*2**18+
0*2**19+0*2**20+0*2**21+0*2**22+1*2**23=
1*2**0+1*2**1+1*2**3+1*2**6+1*2**8+1*2**10+1*2**12+1*2**14+1*2**16+1*2**18+
1*2**23=8738123
Dobra, a więc co my tutaj zrobiliśmy? Po pierwsze odwróciliśmy znowu naszą liczbę binarną. Teraz po prostu mnożymy każdą cyfrę naszej liczby binarnej z potęgą liczby dwa o wykładniku równym numerowi pozycji od lewej strony licząc od zera. Pierw podałem liczbę binarną, później działanie zgodne z poprzednim zdaniem. Kolejnym działaniem jest tym samym działaniem tylko że wyciełem cyfry 0 liczby binarnej. Na końcu jest ofc wynik.
Dla poćwiczenia spróbuj zamienić tą metodą na liczby decymalne:
101b
1011b
101101b
10011001b
10101010b
Metodą tabelkową:
10101b
10001b
101010101b
100010001b
10000b
Oraz zamień na liczby binarne:
11
2
1993
2008
2116
9345
2012
643
352
234
101
Odpowiedzi zostały zakodowane za pomocą base64 którego dekoder znajdziesz tutaj.
T2Rwb3dpZWR6aSBkbyB6YWRhbmlhIDE6
DQo1DQoxMQ0KNDUNCjE1Mw0KMTcwDQ
pPZHBvd2llZHppIGRvIHphZGFuaWEgMjoN
CjIxDQoxNw0KMzQxDQoyNzMNCjE2DQpP
ZHBvd2llZHppIGRvIHphZGFuaWEgMzoNCj
EwMTFiDQoxMGINCjExMTExMDAxMDAxYg
0KMTExMTEwMTEwMDBiDQoxMDAwMDEw
MDAxMDBiDQoxMDAxMDAxMDAwMDAwM
WINCjExMTExMDExMTAwYg0KMTAxMDAw
MDAxMWINCjEwMTEwMDAwMGINCjExMTA
xMDEwYg0KMTEwMDEwMWI=
2008-01-20
Bajt a bit | Zalążek systemu binarnego
Kolejna osoba napisała do mnie z pytaniem, dlaczego jej neostrada 1Mb/s ściąga tylko 128KB/s. By nie musieć tłumaczyć następnym dopytującym się o to osobą postanowiłem tej osobie odpowiedzieć na moim świeżo założonym blogu. Trzeba się nim pochwalić, nie?
Musisz wiedzieć że b to nie to samo co B. Małe b oznacza bit, a duże B to bajt. Czym się różni bajt od bitu oprócz nazwy? Wielkością. Na jeden bajt składa się 8bitów. 1bit może przybrać tylko dwie wartości, 1 lub 0. Bajt ma 256 wartości(łącznie z zerem!). Wynika to z faktu że 2**8=256. Dwie gwiazdki oznaczają potęgowanie. Teraz spójrz na jednostki. K to skrót od kilo czyli razy 1000, ale komputery liczą w systemie binarnym, przez co musisz zapamiętać by pomnożyć twoją wartość przez 1024. Dlaczego tak jest? Ponieważ mnożnik dla K to 2**10. Jeśli jest M przed jest to mega-jednostka np. megabajt, jego mnożnik to 2**20, kolejne mnożniki jednostek to giga, tera, peta, eksa, zetta, jotta. Skrótem tych mnożników jest 1 litera jej nazwy, przemieniona na dużą.
To jest nasz wstęp do obliczeń. Na początku sprowadzimy obie jednostki do takich samych. W 128KB nic nie trzeba zmieniać, za to 1Mbit trzeba pomnożyć przez 1024 by "zejść" do kilobajtów i podzielić przez 8 by zmienić bity na bajty. Uzyskaliśmy coś takiego:
1Mb=1024Kb
1024Kb/8=128KB
Dla ciekawych wytłumaczę jeszcze skąd się wzięło 2**8. Przygotuj 4 monety. Każda moneta ma 2 strony, orzełka i reszkę, są to nasze wartości. Oczywiście, możesz się jeszcze kłócić że jest krawędź, ale ona tylko Ci przysporzy liczenia, więc jej nie zauważamy. Weź jedną
monetę. Ile ona ma przyjąć wartości? Zgadza się dwie(pamiętaj że nie widzimy krawędzi). Weź jeszcze jedną. Mimo że sama moneta ma 2 wartości, 2 monety już mogą mieć 4 wartości. Weź jeszcze jedną monetę. Policz ile mogą różnych wartości wyrazić. Powinno wyjść 8(czyli 2**3). Weźmy kolejną, znowu liczymy. Powinno wyjść 16(czyli 2**4). Teraz sobie oznacz orzełka jako 1 i reszkę jako 0. Twoje monety zamieniły się w tej chwili w bity! Z pewnością nie będziesz miał problemu z ułożeniem monet w taki sposób by stworzyć wartości 0 lub 1. Problem może się pojawić dla większych wartości. Bo jak wyrazić wartość 3? Ustaw monety tak:
reszka, reszka, orzeł, reszka
Wyszło Ci 0010. To będzie 2. Teraz co zrobić by wyrazić 4? Wystarczy odwrócić reszkę. Później dla piątki odwracamy orzełki i reszkę za naszym ostatnim orzełkiem dotychczasowym orzełkiem
również odwracamy. Teraz powtarzamy ten proces dla kolejnych liczb.
Musisz wiedzieć że b to nie to samo co B. Małe b oznacza bit, a duże B to bajt. Czym się różni bajt od bitu oprócz nazwy? Wielkością. Na jeden bajt składa się 8bitów. 1bit może przybrać tylko dwie wartości, 1 lub 0. Bajt ma 256 wartości(łącznie z zerem!). Wynika to z faktu że 2**8=256. Dwie gwiazdki oznaczają potęgowanie. Teraz spójrz na jednostki. K to skrót od kilo czyli razy 1000, ale komputery liczą w systemie binarnym, przez co musisz zapamiętać by pomnożyć twoją wartość przez 1024. Dlaczego tak jest? Ponieważ mnożnik dla K to 2**10. Jeśli jest M przed jest to mega-jednostka np. megabajt, jego mnożnik to 2**20, kolejne mnożniki jednostek to giga, tera, peta, eksa, zetta, jotta. Skrótem tych mnożników jest 1 litera jej nazwy, przemieniona na dużą.
To jest nasz wstęp do obliczeń. Na początku sprowadzimy obie jednostki do takich samych. W 128KB nic nie trzeba zmieniać, za to 1Mbit trzeba pomnożyć przez 1024 by "zejść" do kilobajtów i podzielić przez 8 by zmienić bity na bajty. Uzyskaliśmy coś takiego:
1Mb=1024Kb
1024Kb/8=128KB
Dla ciekawych wytłumaczę jeszcze skąd się wzięło 2**8. Przygotuj 4 monety. Każda moneta ma 2 strony, orzełka i reszkę, są to nasze wartości. Oczywiście, możesz się jeszcze kłócić że jest krawędź, ale ona tylko Ci przysporzy liczenia, więc jej nie zauważamy. Weź jedną
monetę. Ile ona ma przyjąć wartości? Zgadza się dwie(pamiętaj że nie widzimy krawędzi). Weź jeszcze jedną. Mimo że sama moneta ma 2 wartości, 2 monety już mogą mieć 4 wartości. Weź jeszcze jedną monetę. Policz ile mogą różnych wartości wyrazić. Powinno wyjść 8(czyli 2**3). Weźmy kolejną, znowu liczymy. Powinno wyjść 16(czyli 2**4). Teraz sobie oznacz orzełka jako 1 i reszkę jako 0. Twoje monety zamieniły się w tej chwili w bity! Z pewnością nie będziesz miał problemu z ułożeniem monet w taki sposób by stworzyć wartości 0 lub 1. Problem może się pojawić dla większych wartości. Bo jak wyrazić wartość 3? Ustaw monety tak:
reszka, reszka, orzeł, reszka
Wyszło Ci 0010. To będzie 2. Teraz co zrobić by wyrazić 4? Wystarczy odwrócić reszkę. Później dla piątki odwracamy orzełki i reszkę za naszym ostatnim orzełkiem dotychczasowym orzełkiem
również odwracamy. Teraz powtarzamy ten proces dla kolejnych liczb.
- 0000
- 0001
- 0010
- 0011
- 0100
- 0101
- 0110
- 0111
- 1000
- 1001
- 1010
- 1011
- 1100
Subskrybuj:
Posty (Atom)