piątek, 18 maja 2018

U źródeł Postgres'a. Building after Amnesia

Potrzebne  pakiety

apt install gcc 

apt install python-dev 
apt install libreadline-dev 
apt install zlib zlib-dev 
apt install libzzip-dev zziplib-bin zlib1g-dbg lib32z1 lib32z1-dev liblz1 liblz-dev liblz-dbg 
apt install libpq-dev 
apt install openssl-dev 
apt install libssl-dev 
apt install xml2 libxml2-dev libxml2-dbg libxml++2.6-dev libxml++2.6-2v5  
apt install xslt xslt-dev  
apt install libxslt1-dev 
apt install libsystemd-dev 
apt install tclsh-dev 
apt install tcl-devel-package 
apt install tcl-dev libtclcl1-dev  
apt install libperl-dev 


konfiguracja kompilacji


./configure --with-perl --with-python --with-tcl  --with-openssl --with-systemd --with-libxml --with-libxslt CFLAGS='-O2 -pipe'

Pierwsze uruchomienie

adduser postgres
mkdir /usr/local/pgsql/data
chown postgres /usr/local/pgsql/data
su - postgres
/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data
/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data >logfile 2>&1 &
/usr/local/pgsql/bin/createdb test
/usr/local/pgsql/bin/psql test


konfiguracja w dla widoczności w podsieci 
192.168.0.1-192.168.0.255 . md5 czyli password szyfrowany

# IPv4 local connections:
host    all             all             192.168.0.0/24           md5
dodatkowo dowcip w pliku postgresql.conf trzeba zmienić z localhost na *


# - Connection Settings -
listen_addresses = '*'          # what IP address(es) to listen on;
wskrzeszanie postgesa na dzień dobry przez zgrabny systemctl
tworzymy nowy plik touch /etc/systemd/system/postgresql.service
i prosty plik konfiguracyjny ...

[Unit]
Description=PostgreSQL database server
Documentation=man:postgres(1)

[Service]
Type=notify
User=postgres
ExecStart=/usr/local/pgsql/bin/postgres -D /usr/local/pgsql/data
ExecReload=/bin/kill -HUP $MAINPID
KillMode=mixed
KillSignal=SIGINT
TimeoutSec=0

[Install]
WantedBy=multi-user.target


środa, 16 maja 2018

NFS zdalny dysk on Linux

tak na szybko ...

  • najpierw potrzebne pakiety
apt-get install nfs-kernel-server nfs-common

dla klienta   tylko
apt-get install nfs-common


na przykładzie udostępnimy  katalog my_shared_space  z uprawnieniami nobudy

mkdir /home/my_shared_space
chown nobody:nogroup /home/my_shared_space
chmod 755 /home/my_shared_space
drugi udział to taki gdzie potrzebujemy dostęp taki jak root 


mkdir /var/www
chown root:root /var/www
chmod 755 /var/www
teraz konfigurujemy /etc/exports

/home/my_shared_space           192.168.0.101(rw,sync,no_subtree_check)
/var/www  192.168.0.101(rw,sync,fsid=0,crossmnt,no_subtree_check,no_root_squash)
-opcja no_root_squash pozwala na dostęp jak root.
aby zaktualizować serwer zmianami dokonanymi w  /etc/exports 
/etc/init.d/nfs-kernel-server restart

aby zasób /home/my_shared_space  był udostępniany dla wszystkich ip z przedziału 192.168.0.0 - 192.168.0.255
/home/my_shared_space 192.168.0.0/255.255.255.0 (rw,sync,no_subtree_check)
  • Po stronie klienta montujemy w łatwy sposób w dowolnym katalogu
mount 192.168.0.100:/home/my_shared_space /mnt/serwer_www/my_shared_space
mount 192.168.0.100:/var/www /var/serwer_www

poniedziałek, 24 lipca 2017

Każdorazowe zmartwychwstanie PostgreSql (init.d)


Na szybko :


Całkiem fajny plik konfiguracyjny w źródłach - nie trzeba pisać nowego.
/opt/source/postgresql-9.6.3/contrib/start-scripts$ vim linux

Starczy skopiować
# cp /opt/source/postgresql-9.6.3/contrib/start-scripts/linux /etc/init.d/postgres 

Starczy skopiować dodać uprawnienia i zmienić właściciela
root@debianServer:/etc/init.d# chmod u+x postgres  
root@debianServer:/etc/init.d# chown root:root postgres

Aktualizujemy poziomy uruchomień
update-rc.d postgres defaults

sobota, 29 kwietnia 2017

Klucznika brak , po ssh chodzę jak rak

Łączenie się do innych hostów po ssh , bez ciągłego podawania hasła. 

  • W pierwszej kolejności generujemy parę kluczy (prywatny i publiczny)
Oczywiście najlepiej rsa.

 ssh-keygen -t rsa

Generating public/private rsa key pair.

Enter file in which to save the key (/home/(user)/.ssh/id_rsa):
(możesz podać ścieżkę albo zadowolić się domyślną )
Enter passphrase (empty for no passphrase):  nie podawaj -enter
Enter same passphrase again:  nie podawaj -enter
Your identification has been saved in /home/adam/.ssh/id_rsa.

Your public key has been saved in /home/(user)/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:bla bla bla ...
The key's randomart image is:
bla bla bla 

  • Tworzymy ukryty katalog .ssh w katalogu użytkownika o tej samej nazwie, którym się będziemy łączyć /home/(user)/.ssh
  • możemy "ręcznie" albo jednym poleceniem
    ssh -p port user@host  mkdir -p .ssh  
    Dodajemy zawartość klucza publicznego do pliku .ssh/authorized_keys' na hoście do którego chcemy się łączyć.
    Można "ręcznie" albo jednym poleceniem :
    cat ~/.ssh/id_rsa.pub | ssh -p port (user)@host 'cat >> .ssh/authorized_keys'
  • możemy teraz sprawdzić 
  • ssh -p port user@host

Słyszę kiedy chcesz wejść

Czyli powiadom mnie, kiedy ktoś próbował się zalogować i mu się to nie udało

Na wstępie logowanie do linuxa to pam 

W pliku /etc/pam.d/common-auth możemy dokładnie określić co ma się dziać w trakcie autoryzacji.


#przeskocz 2 jeżeli się udało jeżeli autoryzacja się powiodła, jeśli nie to  wykonuj po kolei dalej rozkazy 
auth    [success=2 default=ignore]      pam_unix.so nullok_secure  
# 2 instrukcje i mamy też pierwszą która loguje , dodatkowo jest ustawiona na debug i wykonuje jakiś program
auth    optional                      pam_exec.so log=/etc/logfile.x  debug seteuid /etc/pam.d/onfail_sh
# koniec zabawy wypad
auth    requisite                       pam_deny.so

# i tutaj właśnie szczęśliwie wylądowaliśmy z podskoku o 2 pola. Po poprawnym zalogowaniu success=2 
auth    required                        pam_permit.so


Niektóre z zmiennych, które są dodane w trakcie próby logowania i użycie

echo "test -2  $PAM_RUSER $PAM_RHOST, $PAM_RUSER, $PAM_SERVICE, $PAM_TTY, $PAM_USER and $PAM_TYPE" >> /etc/pam.d/log.txt

Windows in linux

Okna w linuksie 

Coś nie bywałego. Powinni tego zabronić .

Proste  użycie komendy dzięki, którym możemy nieco ożywić powłokę basha.
Czyli wyświetlić okno, checkboxy itp...


dialog --yesno "Zastrzelić cię ?" 5 60

--msgbox "Zastrzelę cię !" 5 60

--msgbox " Jesteś tak nudną osobą, że nawet telemarketer do ciebie nie chce dzwonić." 5 60

dialog  --title "Czym cie tu zastrzelić ?" --radiolist "Wybierz coś sobie" 10 60 12 1 "pistolet" "on"  2 "Bazuka" "off" 3 "CKM" "on"


dialog --separate-output   --checklist "Zastrzelić cię ?" 10 60 12 tag1 item1 1  tag2 item2 2

środa, 24 lutego 2016

Pomaluj mój świat, czyli spersonalizowane theme dla aplikacji w Gtk

Czy miewasz czasami odczycie że twoje życie jest nudne?
Dni płyną nieustanie tak samo, a świat się zlewa w bezkształtną szarą bryłę ?

Nie wszyscy lubią linuxa? : hci ćabej

Jest na to sposób !
Programy pisane w Gtk mają możliwość personalizowania stylów, motywów (theme)  dla określonej aplikacji.
Oznacza to, że twój program może mieć inny motyw graficzny, niż ten ustawiony domyślnie w systemie.

Nic tak dobrze nie przemawia jak przykład obrazkowy. Stylista w obroty weźmie eclipsa.


  • Po zainstalowaniu w ubuntu 15.10 wygląda tak: 

...i niestety posiada kilka niezbyt fajnych rzeczy.
przede wszystkim smużenie scrollbar'a.

Jako że jesteśmy zdesperowani szarym życiem, chcemy pokolorować naszego eclipse'a.  Możemy sami jak,ktoś potrafi, albo  skorzystać z pracy innych .
Wskakujemy na stronę http://gnome-look.org/content/show.php/Mint-X-SF?content=165536
albo ogólne http://gnome-look.org/index.php?xcontentmode=100. Celowo wybieram Gtk2.x żeby wyeliminować smużenie w eclipsie.

tworzę skrypt
runEclipse.sh
ustawiam odpowiednie lokalne zmienne środowiskowe


#!/bin/bash
export SWT_GTK3=0
export GTK2_RC_FILES=/home/adam/source/theme/Mint-X-16PF/gtk-2.0/gtkrc
./eclipse


 SWT_GTK3=0 mówi nam że nie chcemy używać GTK3 
 GTK2_RC_FILES =ścieżka do głównego pliku z motywem.
efekt:

 eclipse w stylu mint :)

No to może jeszcze inaczej ...
http://gnome-look.org/content/show.php/Romaxx?content=163479

środa, 1 kwietnia 2015

Ftp i podróże w czasie

Ftp i podróże w czasie 

Zdarza się że wysyłamy coś na zdalne repozytorium FTP.
Jedyne co nam nie odpowiada to czas w jakim żeśmy to wysłali. 
Chcielibyśmy aby data modyfikacji i zapisu była np z wczoraj. 
Jak można to zrobić.

Skorzystać z konsolowego klienta FTP np standardowego w linuksie.
  • Zalogować się na zdalny FTP  ftp ftp.katalogi.pl
  • przechodzimy poleceniami cd do właściwego katalogu 
  • Poleceniem SITE przechodzimy w rozszerzony tryb poleceń 
  • Poleceniem UTIME testdir 20050101123000 20050101123000 20050101123000 UTC zmieniamy czas dostępu, czas modyfikacji , czas utworzenia katalogu testdir na 2005-01-01 12:30:00
kompletny przykład:
site UTIME takiplik.to 20150331122000 20150331122000 20150331122000 UTC

Prosimy się rozsiąść wygodnie i życzymy przyjemnej podróży w czasie 

czwartek, 14 sierpnia 2014

Postgresql - typy enum, oraz przydatna funkcja do agregacji

Potrzeba typów wyliczeniowych w bazie danych pojawia się praktycznie w każdej strukturze danych.

Typ enum w bazie Postgresql pełni nieocenioną funkcję w zapisie danych typu wyliczeniowego:
  • Zalety: 
    • pozwala na znaczne ograniczenie rozmiaru kolumny
    • zapewnia czytelność danych w kolumnie
    • skutkuje wzrostem wydajności
    • automatyczna kontrola  dozwolonych danych z zestawu 
    • dla poprawnie zbudowanego zbioru (kolejność), można stosować wszystkie operatory porównania (< , >,= ,itd...) 
  • Wady:
    • NIE MOŻNA W PROSTY SPOSÓB USUWAĆ JUŻ ZAPISANYCH WARTOŚCI W ZBIORZE ENUM
    • mogą wystąpić problemy przy przenoszeniu struktury do innej bazy danych.
 Oczywiście można stworzyć alternatywnie rozwiązania:


W tabeli podstawowej wpisywać wartości, które zajmują możliwie mało miejsca i dla łatwej czytelności danych, łączyć się z dodatkową tabelą "słownikiem"
  • Zalety: 
    • tabela podstawowa zajmuje mniej miejsca 
    • ułatwione czytanie danych
    • struktura jest bardziej przenośna,
  • Wady:
    • spada wydajność spowodowana łączeniem z tabelą odnośników
    • brak automatycznej kontroli nad wpisywanymi wartościami do kolumny (trzeba dodać ograniczenia)
Można również wpisywać dane do kolumny w formie stringów 
  • Zalety: 
    • nie trzeba łączyć się z tabelą odnośników 
  • Wady:
    • powoduje kompletnie niepotrzebny wzrost ilości zapisywanych danych 
    • jak w pierwszym przykładzie, brak automatycznej kontroli nad wpisywanymi wartościami do kolumny (trzeba dodać ograniczenia )
    • w przypadku wartości char powoduje dodatkowy wzrost zajmowanego miejsca , z kolei typ varchar,  może skutkować zmniejszeniem szybkości odczytu danych z powodu obliczania dodatkowego offseta.


Do stworzenia typu wyliczeniowego korzystamy z zapytania SQL:
CREATE TYPE mood AS ENUM ('sad', 'ok', 'happy');
Porównania
SELECT * FROM person WHERE current_mood > 'sad';
zwraca rekordy które zawierają 'ok', 'happy'.

Dodawanie  do zestawu
ALTER TYPE mood ADD VALUE 'excited' BEFORE 'happy';

Często rodzi się potrzeba, żeby sprawdzić jakie wartości  może przyjmować dany typ.
Można to zrobić zapytaniem SQL na 2 sposoby:
Prostszy
select enum_range(null::mood) 

Nieco bardziej skomplikowany  :) , ale za to daje wgląd w strukturę
SELECT n.nspname AS "schema", t.typname, e.enumlabel
FROM   pg_catalog.pg_type t
JOIN   pg_catalog.pg_namespace n ON n.oid = t.typnamespace
JOIN   pg_catalog.pg_enum e ON t.oid = e.enumtypid 
WHERE  t.typname = 'mood'
GROUP  BY 1,2,3;
 otrzymujemy
"public";"mood";"excited"
"public";"mood";"happy"
"public";"mood";"ok"
"public";"mood";"sad"
Dane te nie są prezentowane dla nas w atrakcyjny sposób , tym bardziej, gdybyśmy zrezygnowali z warunku WHERE

Z pomocą przychodzi nam funkcja agregująca  string_agg
SELECT n.nspname AS "schema", t.typname,      string_agg(     e.enumlabel, '|' ORDER BY e.enumsortorder) AS enum_labels FROM   pg_catalog.pg_type t JOIN   pg_catalog.pg_namespace n ON n.oid = t.typnamespace JOIN   pg_catalog.pg_enum e ON t.oid = e.enumtypid  WHERE  t.typname = 'mood' GROUP  BY 1,2;
zwraca
 "public";"mood";"sad|ok|excited|happy"
Dane  są prezentowane w zwartej formie z zachowaniem kolejności zestawu ,dzięki ORDER BY e.enumsortorder

Możliwa, lecz kłopotliwa zmiana typu . Związana z koniecznością aktualizacji danych w kolumnie.
CREATE TYPE test AS enum('a', 'b');
CREATE TABLE foo (bar test);
INSERT INTO foo VALUES ('a'), ('b');
ALTER TABLE foo ALTER COLUMN bar TYPE varchar;
DROP TYPE test;
CREATE TYPE test as enum('a', 'b', 'c');
ALTER TABLE foo ALTER COLUMN bar TYPE test USING CASE WHEN bar = ANY (enum_range(null::test)::varchar[]) THEN bar::test WHEN bar = ANY ('{convert, these, values}'::varchar[]) THEN 'c'::test ELSE NULL END;

wtorek, 12 sierpnia 2014

Jak przywrócić pełną szybkość pendrive'a w linksie.

Jak przywrócić pełną szybkość pendrive'a w linksie.

 Zdarza się niestety w naszym ukochanym linuksie, że podczas używania pendrive'a prędkość zapisu i odczytu jest koszmarnie niska , czyli około 1MB/s.
Co się stało ? Otóż nasz nasz pendrive mimo że podłączony do gniazda USB 2.0  działa jak podłączony z prędkością USB 1.0.

Co zrobić:

  1. odmontować nośnik wymienny 
  2. w terminalu wpisać sudo modprobe ehci_hcd
  3. zamontować pendrive ponowne 
  4. Można się cieszyć ponownie pełną prędkością.


U źródeł Postgres'a. Building after Amnesia

Potrzebne  pakiety apt install gcc  apt install python-dev  apt install libreadline-dev  apt install zlib zlib-dev  apt install libzzi...