piątek, 24 czerwca 2022

C vs Python

Postanowiłem porównać szybkość znajdowania liczb pierwszych w językach programowania C i Python najprostszym algorytmem sprawdzającym dzielniki badanej liczby.

Dla przypomnienia: Liczba pierwsza to liczba naturalna, która ma dokładnie dwa dzielniki naturalne - jedynkę i samą siebie. Wykaz początkowych liczb pierwszych: 2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271 itd. Liczby naturalne większe od 1, które nie są pierwsze, nazywa się liczbami złożonymi. Liczby 4 i 6 są więc przykładami liczb złożonych. Z podanych definicji wynika, że liczby 0 i 1 nie są ani pierwsze, ani złożone. Liczby pierwsze są stosowane w niektórych algorytmach kryptograficznych np. RSA.

Algorytm jest bardzo prosty: dla badanej liczby naturalnej n sprawdzamy, czy liczby naturalne należące do przedziału [2, ... ,  √n] są dzielnikami naszej liczby n. Jeżeli okazało by się, że któraś z tych liczb jest dzielnikiem naszej liczby n, oznacza to, że nasza liczba nie jest pierwsza.

Mój test polega na tym, że mierzony jest czas sprawdzenia 8 milionów liczb, czy są liczbami pierwszymi. Pierwszy program jest napisany w języku C:

#include <stdio.h>
#include <math.h>
#include <time.h>

#define FALSE 0
#define TRUE  1
  
int is_prime(int n) {
  if (n<2) {
    return FALSE;
  }
  else if (n==2) {
    return TRUE;
  }
  else {
    for (int i=2; i<=(int)ceil(sqrt(n)); i++) {
      if (n % i == 0) {
        return FALSE;
      }
    }
    return TRUE;
  }
}

int main() {
  int max = 8000000;
  time_t t1, t2;
  
  printf("Checking %d numbers. Please wait...\n", max);
  
  t1 = time(NULL);
  
  for(int i=1; i<=max; i++) {
    is_prime(i);
    //printf("%d   %d\n", i, is_prime(i));
  }
  
  t2 = time(NULL);
  printf("Done in %ld seconds.\n", t2-t1);
}

Program kompilujemy następująco:

gcc primes-search.c -o primes-search -lm

lub

cc primes-search.c -o primes-search -lm

Drugi program jest w języku Python 3:

import math
import time

def is_prime(n):
  if n < 2:
    return False
  elif n == 2:
    return True
  else:
    # range = 2..math.ceil(math.sqrt(n))
    for i in range(2, (int)(math.ceil(math.sqrt(n))) + 1):
      if n % i == 0:
        return False
    return True
    

max = 8000000

print("Checking %d numbers. Please wait..." % max)

t1 = time.time()

for i in range(1, max):
  is_prime(i)
  #print("%d   %d" % (i, is_prime(i)))
  
t2 = time.time()
print("Done in %d seconds." % (t2-t1))

Kody źródłowe są tutaj:

https://github.com/adamblaszczyk/primes-search__c_vs_python

Czasy wykonania programów:

LENOVO ThinkPad E440, Intel Core i3-4000M 2.4GHz - FreeBSD 13.0 64-bit

.c - 21 sekund

.py - 124 sekundy


poniedziałek, 7 marca 2022

X Window System


X Window System – środowisko okien graficznych stworzone w latach 80. XX wieku w laboratoriach MIT (pierwsze wydanie X1 w czerwcu 1984 roku). Jest stosowamy głównie w systemach Unix i Linux. Najnowszym wydaniem jest wersja 11. Często oprócz X Window System stosuje się też nazwę X, X11, X11R6 (dla implementacji X.Org w wersji 6) lub X11R7. Najpopularniejszymi implementacjami X Window System są X.Org oraz XFree86.

X Window System tworzy okna, na których program może tworzyć obraz, oraz zajmuje się obsługą urządzeń wejściowych (myszki, klawiatury). Serwer X może rysować tylko najprostsze obiekty (odcinki, wielokąty, elipsy, wyświetlać bitmapy, pojedyncze piksele), nie dostarcza natomiast żadnego interfejsu użytkownika, czyli przycisków, rozwijanych menu, pasków przewijania itp. Rysowaniem i obsługą tych elementów musi zająć się program, najczęściej jest to biblioteka widgetów. System X nie zajmuje się również obsługą okien, nie dostarcza żadnych wbudowanych mechanizmów do ich przesuwania, zmiany rozmiaru, zamykania i uruchamiania programów, nie rysuje także pasków tytułowych dla okien – tym wszystkim musi zająć się osobny program, tzw. menedżer okien (Window Manager) lub jeszcze bardziej coś rozbudowanego tzn. środowisko graficzne (Desktop Environment).

Opcjonalnie można jeszcze doinstalować menedżera logowania (display manager lub login manager), bo bez niego X Window System odpala się w kontekście użytkownika, który zalogował się do konsoli tekstowej.

X Window System działa w architekturze klient-serwer, co oznacza, że składa się z dwóch elementów:
- serwera, zajmującego się wyświetlaniem grafiki oraz obsługą myszy i klawiatury,
- klienta, czyli oprogramowania żądającego od serwera zmian zawartości okna.
Nie ma znaczenia, czy oba elementy systemu działają na tym samym komputerze, czy na dwóch różnych maszynach. Jedna maszyna może wykonywać program, druga może wyświetlać wynik działania programu.

Wszystkie poniższe komendy były wydawane w systemie operacyjnym FreeBSD.

Instalacja X Window System - X.Org:

# pkg install xorg

Istnieją różne metody uruchomienia X-ów oraz aplikacji graficznych. Oto najbardziej prymitywna:

# X

lub

# Xorg

Uzyskamy czysty X Window System bez żadnego menedżera okien (czarny/szary ekran z kursorem myszy) - aplikacje odpalają się bez ramki, nie można zmieniać ich rozmiaru oraz przesuwać (ale działają!). Aplikacje odpalamy z dowolnej konsoli tekstowej np. [Ctrl+Alt+F2] w następujący sposób:

# xcalc -display :0

Można również odpalić czysty X Window System razem z terminalem xterm za pomocą polecenia:

# xinit

W systemie FreeBSD można uruchomić X Window System razem z domyślnym menedżerem okien TWM za pomocą poniższej komendy:

# startx

Mamy już zapewnioną obsługę okien.

Inne menedżery okien (lub całe środowiska graficzne) trzeba doinstalować. Na przykład FVWM:

# pkg install fvwm

Po instalacji menedżera okien FVWM, edytujemy plik ~/.xinitrc. Dodajemy wpis:

exec fvwm

Podsumowując, polecenie startx domyślnie uruchamia menedżera okien TWM lub inny menedżer okien (Window Manager) lub środowisko graficzne (Desktop Environment), gdy mamy odpowiedni wpis w pliku ~/.xinitrc.

Należało by wspomnieć, że rozbudowane środowiska graficzne np. XFCE, Gnome do prawidłowej pracy wymagają też odpowiednich wpisów w pliku /etc/rc.conf.

Przydatne "X-owe" programy, których nie trzeba doinstalowywać:

xcalc - kalkulator
xterm - terminal
xclock - zegar
xkill - zamyka okno graficzne (klienta)

Na koniec tego artykułu polecam książkę online: X Window System User's Guide.

czwartek, 26 marca 2020

FreeBSD - instalacja X-ów i menedżera okien Enlightenment


Menedżer okien Enlightenment do swojego działania potrzebuje środowiska X Window System (X.Org - serwer X-ów).

Po pierwsze aktualizujemy listę pakietów:

# pkg update

oraz aktualizujemy wszystkie zainstalowane pakiety:

# pkg upgrade

Następnie instalujemy X Window System:

# pkg install xorg

Po instalacji X.Org warto sprawdzić, czy środowisko X Window startuje:

# startx

Zamykamy X-y i instalujemy Enlightenment Window Manager:

# pkg install enlightenment

Po instalacji menedżera okien Enlightenment, edytujemy plik ~/.xinitrc. Dodajemy wpis:

exec enlightenment_start

Odpalamy środowisko graficzne (a dokładniej menedżera okien):

# startx

Przy pierwszym uruchomieniu Enlightenment pojawi się kreator, w którym wybieramy język, układ klawiatury, wielkość czcionek w okienkach itp.

Gdy już nasze X-y i menedżer okien działają, można instalować dodatkowe programy np.:

# pkg install firefox

# pkg install libreoffice

# pkg install gimp

Wszystko o dostępnych pakietach oprogramowania dla FreeBSD możemy się dowiedzieć na stronie FreshPorts .

piątek, 16 sierpnia 2019

Pożyteczne (techniczne) linki

Poniżej umieszczam trochę pożytecznych linków, z których czasami korzystam.

DistroWatch.com - dokładny przegląd dystrybucji Linuksa i BSD:
https://distrowatch.com/

Cheat.sh - ściągawka do komend Unix/Linux i języków programowania:

Explain Linux Commands - wpisujemy pełną komendę np. ps -aux i dostajemy pełne wyjaśnienie, co robi komenda oraz jej parametry:

What is my IP - mój publiczny i prywatny adres IP:
https://www.cleancss.com/what-is-my-ip/

Default Router Settings - domyślne nazwy i hasła użytkowników oraz adresy IP routerów, modemów, kamer IP i innych urządzeń sieciowych:
https://www.cleancss.com/router-default/

BezKompilatora.pl - ciekawy blog o Linuksie:
https://www.bezkompilatora.pl/

Crontab Guru - edytor (kreator) tabeli crontab dla harmonogramu zadań cron:
https://crontab.guru/

repl.it - kompilatory online dla różnych języków programowania:
https://repl.it/

Circuit Simulator - symulator układów elektronicznych w przeglądarce:
http://lushprojects.com/circuitjs/

Crypto-IT : Protokoły TCP/IP - opis TCP/IP:
http://www.crypto-it.net/pl/teoria/protokoly-tcp-ip.html

Codecademy - kursy online z języków programowania:
https://www.codecademy.com/

Rosetta Code - różne zadania programistyczne w bardzo wielu językach programowania:
http://www.rosettacode.org/wiki/Category:Programming_Tasks
np. najprostszy program Hello World napisany w ponad 400 różnych językach programowania:
http://www.rosettacode.org/wiki/Hello_world/Text

SS64 - opis komend wiersza poleceń dla systemów Linux, macOS i Windows oraz opis poleceń i funkcji dla SQL, VBS i PowerShell:
https://ss64.com/

VirusTotal - można sobie online przeskanować plik za pomocą różnych silników antywirusowych:
https://www.virustotal.com

WolframAlpha - strona ta formułuje odpowiedź na pytanie zadane w języku naturalnym, wykonuje obliczenia, przedstawia dane statystyczne, rozwiązuje równania itp.:
https://www.wolframalpha.com/

ark.intel.com - specyfikacje produktów Intela:
https://ark.intel.com

FORBOT - elektronika, Arduino, Raspberry Pi, kursy:
https://forbot.pl/blog/

BlogIT by Artur Dębski - pożyteczne notatki z różnych dziedzin IT:
http://blogit.one.pl/news_cats.php

Kalkulator IP - na podstawie adresu IP i maski oblicza adres sieci, adres rozgłoszeniowy oraz ilość hostów w sieci:
https://42.pl/ipcalc/

--- Na koniec moje dwa ulubione na dzień dzisiejszy systemy operacyjne ---

FreeBSD:
https://www.freebsd.org/
https://www.freshports.org/
https://pl.wikipedia.org/wiki/FreeBSD

Linux Mint:
https://www.linuxmint.com/
https://pl.wikipedia.org/wiki/Linux_Mint

czwartek, 18 lipca 2019

FreeBSD 12.0 - instalacja systemu

FreeBSD jest darmowym systemem operacyjnym z rodziny Unix (nie jest to kolejna dystrybucja Linuksa!) dostępnym z pełnym kodem źródłowym. System jest zgodny z normą POSIX i jest dostępny na wiele architektur sprzętowych (nawet na takie urządzenia jak Raspberry Pi). FreeBSD korzysta z opartego na źródłach systemu pakietowania znanego jako porty oraz prekompilowanych pakietów binarnych z domyślnymi opcjami dla wszystkich aktualnie obsługiwanych wersji i architektur sprzętowych FreeBSD.

Wersję instalacyjną systemu na różne architektury sprzętowe można ściągnąć z oficjalnej strony https://www.freebsd.org/

No to zaczynamy instalację:



Na początku wybieramy układ klawiatury:



Podajemy nazwę hosta w sieci:



Wybieramy opcjonalne komponenty. Warto zaznaczyć ports, żeby móc później instalować programy z pakietów zawierających kody źródłowe, tzw. portów:



Następnie tworzymy partycję na dysku przeznaczoną na system FreeBSD. Mamy do wyboru dwa systemy plików - UFS (Unix File System) oraz ZFS, który jest szybszy, ale trudniejszy w konfiguracji. Ja wybrałem UFS (w rzeczywistości jest to nowszy UFS2):



Następnie mamy wybór, czy utworzyć partycję zajmującą cały dysk twardy (Entire Disk), czy tylko część dysku (Partition - gdy chcemy później zainstalować inny dodatkowy system np. Linux):



Kolejnym krokiem, jest wybranie schematu partycjonowania np. MBR lub GPT:



Wyskoczy podsumowanie o utworzonych partycjach i systemach plików. Wybieramy Finish:



Rozpocznie się proces instalacji plików całej dystrybucji FreeBSD:




Po zainstalowaniu wszystkich plików, należy ustalić hasło root-a:



Przystępujemy do konfiguracji karty sieciowej:







Wybieramy strefę czasową:







Wybieramy usługi (demony), które będą działać w naszym systemie:



Wybieramy dodatkowe opcje związane z bezpieczeństwem systemu:



Zakładamy dodatkowych użytkowników. Nie jest to konieczne, ale wskazane ze względów bezpieczeństwa systemu (lepiej pracować na koncie zwykłego użytkownika). W konsoli, w standardowych menedżerach okien i w niektórych środowiskach graficznych możemy logować się użytkownikiem root, ale np. połączenie środowiska graficznego KDE Plasma z menedżerem logowania SDDM nie pozwala na logowanie się do systemu użytkownikiem root:




Koniec instalacji. Warto jeszcze doinstalować podręcznik FreeBSD w naszym języku:




Możemy opuścić instalator i uruchomić ponownie komputer:





Przy pierwszym uruchomieniu systemu FreeBSD warto zaktualizować listę pakietów:

# pkg update


oraz zaktualizować wszystkie zainstalowane pakiety:

# pkg upgrade


Oprogramowanie instalujemy za pomocą polecenia pkg install, np. Midnight Commander instalujemy tak:

# pkg install mc


Programy możemy też instalować za pomocą portów, ale to zagadnienie i ogólny opis systemu (w tym plików konfiguracyjnych) to już temat na odrębny artykuł.

Warto też doinstalować X Window System (X.org - serwer X-ów) oraz środowisko graficzne np. Xfce, GNOME, KDE Plasma, Lumina itd. Jednak jest to też temat na osobny artykuł.

Przydatne linki:
- oficjalna strona FreeBSD - https://www.freebsd.org/
- oficjalne forum FreeBSD - https://forums.freebsd.org/
- wszystko o pakietach i portach - https://www.freshports.org/

wtorek, 12 lutego 2019

Docker

Docker jest narzędziem, które pozwala umieścić program oraz jego zależności w lekkim, przenośnym wirtualnym kontenerze, który można uruchomić na prawie każdym hoście z systemem Linux.

Docker zastępuje tradycyjną wirtualizację przez stosowanie czegoś co nazywa się konteneryzacją. Każdy kontener posiada wydzielony obszar pamięci, odrębny interfejs sieciowy z własnym adresem IP oraz wydzielony obszar na dysku, na którym znajduje się zainstalowany obraz systemu operacyjnego i wszystkich zależności (bibliotek) potrzebnych do działania aplikacji (uruchamiane są tylko procesy niezbędne do działania aplikacji).

Porównanie kontenerów i standardowej wirtualizacji:



Źródło: https://www.docker.com/resources/what-container

Najważniejsze pojęcia:

Demon - główny silnik Dockera (proces dockerd) - odpala nasze kontenery z aplikacjami.

Klient - aplikacja CLI o nazwie docker, komunikuje się z demonem.

Obraz - jest szablonem dla kontenera. Obrazy znajdują się w rejestrze np. https://hub.docker.com/ albo w lokalnym cache. Są tylko do odczytu.

Rejestr - miejsce do przechowywania obrazów. Oficjalny rejestr dockera to: https://hub.docker.com/

Kontener - to uruchomiona instancja danego obrazu, jest warstwą zapisywalną.

Docker jest wielowarstwowy: Kernel > Obraz > Kontener

Instalacja Dockera

Docker do pracy wymaga linuksowego kernela, więc można go uruchomić na większości dystrybucji systemu Linux. Działa też pod Windows 10 Pro i Enterprise 64-bit, wykorzystując wirtualizację Hyper-V. Można też odpalić maszynę wirtualną z Dockerem pod macOS.

Przykład instalacji dla Ubuntu 18.04 64-bit:

sudo apt install docker.io

Aby można było uruchamiać kontenery, trzeba dodać użytkownika do grupy docker:

sudo usermod -aG docker $USER

Sprawdzenie, czy Docker działa

Trzeba ściągnąć obraz hello-world z oficjalnego repozytorium:

docker run hello-world

Jak wyskoczy tekst Hello from Docker!, tzn. że kontener z obrazem hello-world uruchomił się prawidłowo.

Przykłady działania

Uruchomienie kontenera z najnowszym interpreterem języka Python:

docker run -it python

-i : uruchamia instancję kontenera w trybie interaktywnym
-t : przypisuje instancję kontenera do bieżącej konsoli (tty)

Uruchomienie kontenera z Pythonem 2.7:

docker run -it python:2.7

Kontener z Alpine Linux (lekki system Linux):

docker run -it alpine
docker run -it alpine /bin/sh
docker run alpine ls -l

Kontener z grami bsd-games (np. adventure, backgammon, battlestar, boggle, cribbage, go-fish, hunt, mille, quiz, trek, worm):

docker run -it --rm cricket/hangman hangman

--rm : usuwa kontener po zakończeniu

Aplikacja webowa:

docker run --name stsi -d -p 85:80/tcp dockersamples/static-site

--name : zdefiniowana przez użytkownika przyjazna nazwa kontenera
-d : detached mode, proces działa w tle, konsola dostępna
-p 85:80/tcp : przekierowanie portu 80/tcp kontenera na 85/tcp hosta (można odpalić w przeglądarce stronę testową http://ip_hosta:85 )
-P : przekierowanie portów kontenera na losowe wysokie porty hosta

docker port stsi
- można sprawdzić, które porty są mapowane z kontenera stsi na host

Przydatne komendy polecenia docker

docker images - lista obrazów w lokalnym cache komputera
docker info - szczegółowe informacje o Dockerze (ilość obrazów, kontenerów itp.)
docker kill - ubija działający kontener
docker port - lista mapowanych portów TCP i UDP z kontenera na host
docker ps - lista działających kontenerów
docker pull - ściąga obraz do lokalnego cache
docker push - wysyła obraz do repozytorium
docker rm - usuwa kontenery z dysku
docker rmi - usuwa obrazy z dysku
docker run - uruchamia kontener (komendę w kontenerze); jeżeli nie ma obrazu, to go ściąga (docker pull)
docker search - szuka obrazów w repozytorium
docker top - pokazuje uruchomione procesy w kontenerze
docker version - informacja o wersji Dockera
docker build - budowanie własnego obrazu kontenera

Budowanie własnego obrazu kontenera z pliku Dockerfile

W tym przykładzie zbudujemy własny kontener z obrazem Pythona 3.4 i uruchomionym programem primes_print.py, który wypisuje na ekranie liczby pierwsze.

Kod źródłowy programu w Pythonie:
https://github.com/adamblaszczyk/code-snippets/blob/master/python/primes_print.py

Tworzymy plik Dockerfile służący do budowania obrazu:

FROM python:3.4
ADD primes_print.py /
CMD python primes_print.py

Jest to przepis na budowanie obrazu:
FROM - oznacza bazowy obraz,
ADD - dodaje pliki do obrazu,
CMD - polecenie odpalane przy starcie kontenera (instancji zbudowanego obrazu).

Budujemy obraz (wykorzystując Dockerfile) na bazie obrazu python:3.4 z oficjalnego repozytorium Docker Hub:

docker build --tag=primes .

--tag : nazwa_obrazu(:wersja)

Uruchamiamy naszą instancję (kontener) nowo zbudowanego obrazu:

docker run -it --rm primes

Na tym zakończę wstęp do Dockera. Postaram się jeszcze coś o nim napisać.

wtorek, 6 czerwca 2017

Hyper-V - chwilowe wyłączenie hipernadzorcy

Hyper-V to oprogramowanie służące do wirtualizacji (hypervisor) działające na systemach serwerowych Microsoftu (od Windows Server 2008) oraz także na desktopach (od Windows 8 Pro).

Hyper-V jest uruchamiany podczas startu systemu Windows i czasami istnieje potrzeba chwilowego go wyłączenia (np. gdy mamy problemy z innym hypervisorem takim jak VirtualBox).

Funkcję Hyper-V wyłączamy narzędziem bcdedit (Boot Configuration Data) z linii poleceń cmd:

1. Uruchamiamy wiersz poleceń cmd z uprawnieniami administratora.
2. Wydajemy polecenie:

bcdedit /set hypervisorlaunchtype off

3. Restartujemy komputer.

Powrót do Hyper-V:

1. Uruchamiamy wiersz poleceń cmd z uprawnieniami administratora.
2. Wydajemy polecenie:

bcdedit /set hypervisorlaunchtype auto

3. Restartujemy komputer.