Postgres: Sprawdzanie aktywności na serwerze

2021-01-24

Każda poważna baza danych musi nie tylko w poprawny sposób zapisywać dane, ale także musi dawać administratorowi możliwość sprawddzania tej aktywności. W przypadku postgresa takim narzędziem jest widok

pg_stat_activity

Dzięki niemu zobaczysz kto skąd, a nawet po co , połączył sie do serwera. Narzędzie może być przydatne podczas śledzenia przyczyn zablokowanych sesji. W kolumnach tego widoku w szczególności można znaleźć opis zakładanych locków. Przy typowym zablokowaniu rekordu na wyłączność przez 2 użytkoników znajdziesz tu np. wpis:

LOCK, transaction_id

co oznacza, że transakcja została zablokowana przez inną transakcje. Pełny wykaz możliwych locków można znaleźć w dokumentacji:

https://www.postgresql.org/docs/9.6/monitoring-stats.html#WAIT-EVENT-TABLE

By Rafał Kraik in PostgreSQL

Visual Studio Code Editor – konfiguracja pod Python

2021-01-18

Jeden z popularniejszych obecnie edytorów kodu to Visual Studio Code Editor. Jego popularność wynika pewnie z tego, że jest niewielki (to zaleta) i można doinstalować do niego rozszerzenia, które powiększają/dodają nowe możliwości tego narzędzia. Np. w VSC można wygodnie pisać kod Pyhona po zainstalowaniu dodatku Python. Co więcej, takich dodatków jest wiele, ale akurat ten wydawany przez Microsoft jest najpopularniejszy. To tyle jeśli chodzi o marketing, tymczasem… po zainstalowaniu dodatków trzeba je nierzadko jeszcze dokonfigurować i o tym chcę tu właśnie napisać.

Załóżmy, że jest już zainstalowany Python i VSC oraz zainstalowano już dodatek Python. Aby rozpocząć pracę nad nowym projektem Pythona można w VSC wybrać polecenie File >> Open Folder. Projekty i związane z nimi ustawienia środowiska są zapisywane w wybranym katalogu, który początkowo może być pusty.

W tym katalogu można teraz utworzyć plik z rozszerzeniem .py tak aby był skojarzony z Pythonem. Czy to jednak wystarczy do tego aby VSC wiedział jak go uruchomić? Niestety niekoniecznie. W ustawieniach należy wskazać jaki interpreter ma być wykorzystywany podczas uruchamiania skryptu. Ma to sens zwłaszcza w przypadku, gdyby na komputerze było zainstalowanych więcej interpreterów, np. różne wersje pythona.

Po wpisaniu kodu, gdy chcesz go uruchomić, teoretycznie wystarczy kliknąć prawym przyciskiem myszy gdziekolwiek w obszarze edytora i wybrać Run file in editor:

W tym momecie może paść pytanie o wybór interpretera. Wskaż jeden z zainstalowanych wcześniej interpreterów Python.

Co jeszcze może pójść nie tak? Może się otworzyć okno terminala, krórym będzie CMD.EXE lup powershell.exe. Zazwyczaj preferujemy, żeby kod był uruchamiany we wbudowanym terminalu w okienku pod edytorem i żeby tym domyślnym terminalem był cmd.exe, a nie powershell.

Jeśli otwiera się specjalne okno, to przejdź do File >> Preferences >> Settings, przejdź do sekcji Features >> Terminal i odszukaj ustawienia Integrated: Windows Enable Conpty. Tą opcję należy wyłączyć. Spwoduje to, że nowe okno terninala nie będzie otwierane jako zewenętrzna niezależna aplikacjia, ale właśnie jako element VSC

Ze zmianą terminala na cmd lub python będzie prościej. Po uruchomieniu terminala (Terminal >> New terminal), w oknie w dolnej części można wybrać typ terminala. Tutaj widać, że zaznaczony jest cmd, ale można by zmienić terminal na powershell, lub wybrać domyślny terminal poprzez „select default profile”.

Lista domyślnych profili jest wyświetlana w górnej części:

Osobiście, chociaż jestem fanem PowerShella, to tutaj wolę pracować z cmd.

Jeśli chodzi o wybór interpretera Pythona, to można to zrobić klikając informację na pasku statusu:

Spowoduje to wyświetlenie w górnej części okna listy z dostępnymi interpreterami:

Jak więc widać, sporo ustawnień konfiguracyjnych jest koniec końców dokonywanych w liście w górnej części okna. To okno można otworzyć skrótami klawiaturowymi

CTR + SHIFT + P

lub

F1

Potem wystarczy wyszukać ustawienia wpisując fragment jego nazwy. Ponieważ ustawień jest sporo to będąc w File >> Preferences >> Settings można wyszukać ustawienia wpisując fragment jego nazwy, a potem… wybierając polecenie „Edit a setting json”, możesz podejrzeć definicję ustawienia w postaci JSON. Takie podejście dla programisty jest dość poręczne i daje duże możliwości kontroli nad narzędziem:

By Rafał Kraik in Python

Azure: Uruchamianie skryptu powershell na maszynie witrualnej poprzez extension

2020-12-22

W artykule

Azure: zdalna zmiana rejestru w celu zmiany opcji połączeń zdalnych

opisałem, jak zmodyfikować rejestr maszyny wirtualnej znajdującej się w Azure, w celu odblokowania możliwości połączenia do tej maszyny z komputerów bez uwierzytelnienia klienta. Z czasem jednak, ta metoda delikatnie się zmieniła. Teraz nie można już załadować bezpośrednio pliku skryptu do uruchomienia, tylko trzeba ten plik wybrać ze storage account. Dochodzi więc jeden dodatkowy krok – stworzenie storage account i przegranie tam pliku skryptu.

tak wygląda początkowe okno pobierania skryptu „extension”

Po kliknięciu „browse” należy wybrać storage account. Zakładając, że go nie masz, trzeba kliknąć „+Storage account”

Tutaj tworzysz storage account – najważniejsze to wymyślić unikalną nazwę i wybrać inne parametry – celuj w te tańsze 🙂

Dzięki temu można już wybrać storage account, ale…

jest on pusty. Trzeba najpierw założyć container. W tym celu kliknij „+Container”

Ten kontener można wybrać, ale…

… jeszcze nie ma na nim plików (skryptów), dlatego można kliknąć „upload” i załadować skrypt extension.

Ten skrypt należy następnie wybrać i taddam – jesteśmy w sumie w tym samym miejscu, co w poprzednim artykule!

Niestety takie ciagłe zmiany w Azure, to coś do czego musimy przywyknąć.

 

 

 

By Rafał Kraik in Azure

SQL – bląd przy restore TDP – Cannot load file or assembly

2020-12-22

Podczas odtwarzania bazy danych przy pomocy narzędzia Tivoli Data Protection pojawil się komunikat:

Failed – Error: RC: 1914
 ACO5422E Received the following from the MS SQL server: Could not load file or assembly 'Microsoft.SqlServer.Smo, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91′ or one of its dependencies. The system cannot find the file specified

No dobrze, ale to jakiego pliku konkretnie brakuje? Pliku wrpawdzie w komunikacie nie ma ale za to jest nazwa pbrakującego pakietu. Dobre i to! Smo to Shared Management Objects. SMO wchodzi w sklad pakietu SQL Features Pack wydawanego osobno dla kazdej wersji SQL. Komunikat mowi o wersji 12, czyli zgodnie z numeracją Mocrosoft SQL 2014. Można go pobrać stąd:

https://www.microsoft.com/en-us/download/details.aspx?id=42295

Ale i tak coś mi tu jeszcze spokoju nie daje. SQL na którym pracuję to SQL 2016. Baza, którą odtwarzam to 2012. Dlaczego mam instalować SMO 2014? Nie chcę śmiecić na serwerze z SQL 2016  instalajami z 2014. Dlatego zacząlem od 2016. Nie pomoglo. Potem zainstalowlem 2012. Nie pomoglo. No to w koncu uzylem 2014 – bingo! Na cale szczescie restarty nie byly potrzebne

Maly pakiet – 6-7 MB, a dal pomyśleć!

By Rafał Kraik in Błedy, SQL

PowerShell: Ustawianie zmiennej środowiskowej

2020-12-18

Niektóre aplikacje wymagają ustawienia zmiennych środowiskowych. W command line to nie problem:

SET FLASK_DEBUG=1

i gotowe! Jednak coraz częściej to PowerShell jest domyślnym shellem. Jak więc ustawić zmienną środowiskową w PowerShell?

[System.Environment]::SetEnvironmentVariable('FLASK_DEBUG', '1',[System.EnvironmentVariableTarget]::Process)

Nie jest to zbyt proste, ale:

  • [SystemEnvironment] pozwala odwołać się do programistycznej klasy, która odpowiada za zarządzanie środowiskiem
  • SetEnvironmentVariable – to metoda statyczna w/w klasy, która odpowiada za ustawienie zmiennej środowiskowej
    • pierwszy argument to nazwa zmiennej
    • drugi argument to jej wartość
    • trzeci argument określa zakres widoczności zmiennej. Mamy do wyboru Machine, User albo Process. Process stworzy zmienną tylko na skalę tego jednego procesu i jego procesów potomnych

Jak więc widać… trochę to bardziej skomplikowane. Dla uzupełnienia powiedzmy jeszcze jak ustawić zmienną środowiskową w BASH:

FLASK_DEBUG=1
export FLASK_DEBUG

Sprawdzenie zmiennych środowiskowych:

command line:

echo %FLASK_DEBUG%

PowerShell

$env:FLASK_DEBUG

BASH

echo $FLASK_DEBUG
By Rafał Kraik in Power Shell

Python: unikalne kombinacje z dwóch list (sztuczka start

2020-12-09

Załóżmy, że mamy listę portów lotniczych i zastanawiamy się, jakie można zbudować trasy między nimi:

ports = ['WAW', 'KRK', 'GDN', 'KTW', 'WMI', 'WRO', 'POZ', 'RZE', 'SZZ',
 'LUZ', 'BZG', 'LCJ', 'SZY', 'IEG', 'RDO']
 
routes = [ (start, stop) for start in ports for stop in ports]
print(routes)
print(len(routes))

W routes zostanie wygenerowanych 255 tras, ale niestety znajdą się w niej zbędne wartości. Będzie trasa WAW-WAW,  ale znajdą się też duplikaty WAW-KRK oraz KRK-WAW. Jak je wykluczyć? Zmieniając wyrażenie generujące wartości dostaniemy już tylko 210 wyników, ale wyeliminowaliśmy tylko trasy z tego samego miasta do tego samego miasta:

routes = [ (start, stop) for start in ports for stop in ports if start != stop]
print(routes)
print(len(routes))

No to idźmy dalej. Polecenie w tej postaci da o wiele lepszy wynik – 105 tras:

routes = [ (start, stop) for start in ports for stop in ports if start < stop]
print(routes)
print(len(routes))

Zapis start<stop jest nieco dziwny. Porównujemy napisy: A<B, B<C, C<D itd.  Tak jak lista obecności w dzienniku szkolnym. Ten znak ostrej nierówności to „sztuczka programistyczna”.  Skoro A jest mniejsze od B, to nasz wzór wykryje tylko połączenie A do B, ale połączenie B do A pominie, bo B nie jest mniejsze od A.

Programowanie to nie tylko instrukcje i kod. Programowanie to też sztuczki, które sprawiają, że ten sam problem da się rozwiązać na kilka(set) różnych sposobów – a my musimy tylko wybrać ten lepszy z pewnego punktu widzenia!

By Rafał Kraik in Python

Python: kolejność wyznaczania wartości logicznej

2020-12-09

Wyrażenia logiczne w Pythonie są wyznaczane od lewej do prawej. Jeśli więc masz w if wyrażenie logiczne expr1 and expr2, to expr2 będzie wyliczane tylko wtedy jeśli expr1 ma wartość True. Jest to całkiem oczywiste z punktu widzenia optymalizacji liczby wykonywanych obliczeń – gdyby expr1 już miało wartość False, to nie ma sensu wyliczać wartości dla expr2, bo ostateczna wartość dla expr1 and expr2 to False!

Jednak informacja o kolejności wyznaczania wartości jest istotna. Popatrz na ten przykład:

i = 0
box = ['ab','bcd','cde']


while len(box[i])>0 and i < len(box):
   print(box[i])
   i += 1

Uruchomienie skryptu skończy się błędem

IndexError: list index out of range

Dlaczego? Bo w pewnym momencie i będzie wynosiło 3 i odwołanie do box[i] nie ma sensu.  Jeśli jednak zmieni się kolejność warunków w while:

i = 0
box = ['ab','bcd','cde']


while i < len(box) and len(box[i])>0:
   print(box[i])
   i += 1

To nim odwołamy się do box[i], najpierw odbędzie się sprawdzenie, czy i<len(box). To wyrażenie zwróci wartość False, a co za tym idzie nie odbędzie się obliczanie dla prawej części wyrażenia and.

Sprytne!

 

By Rafał Kraik in Python