DevOps – może mieć różne definicje, bo jest różnie rozumiany. Zwykle rozumiemy przez niego połączenie pracy człowieka, procesów i produktów, które umożliwiają dostarczanie wartości klientowi w procesie Continous Delivery. Czasami łatwiej jest powiedzieć, co nie jest DevOps. Przykładami takich czynności są tworzenie dokumentacji, modyfikacja ustawień firewall. Te czynności nie przynoszą klientowi bezpośrednich korzyści. Co innego utworzenie nowej funkcjonalności w aplikacji.
Observe, Orient, Decide, Act – pętla OODA – każdorazowo, przy każdej iteracji należy obserwować skutki poprzednich zmian, określać czy są one pożądane, decydować o kolejnych krokach i wykonywać je. Dzięki częstej ocenie pracy, można uniknąć błądzenia po niepoprawnych rozwiązaniach, na bieżąco korygować błędy i w efekcie szybciej dostarczyć wyniki dla klienta.
Continous Integration – proces ma na celu upewnienie się, że wprowadzone zmiany działają z innymi zmianami, wykonywanymi przez innych programistów, w tym również że są zgodne z wymogami security itp. Programista wysyłając swój kod może powodować konflikty, które powinny być szybko wykryte. Łatwiej je wykrywać, gdy często są wykonywane testy. Programista wykonuje małą zmianę, oprogramowanie jest budowane i testowane w automatyczny sposób.
Continous Delivery – Jest to implementacja logiki „Fail Fast” – jeśli coś ma się nie udać, albo ma nie dać wartości dla klienta, to lepiej jeśli zostanie to wykryte wcześniej. Zmiany wykonane w rozwiązaniu, dostarczamy klientowi tak szybko jak się da. Z jednej strony, klient nie musi długo czekać na rezultaty, z drugiej strony może szybko zareagować, jeśli coś jest nie tak.
Version Control – utrzymywanie jednego prawdziwego miejsca gdzie utrzymywany jest kod aplikacji. Ten kod może być podzielony na różne etapy pracy (branch), ale jeśli szukasz odpowiedniego miejsca skąd można pobrać kod źródłowy – idziesz tam. Version Control wspiera zachowanie historii wszystkich zmian, możliwość przeglądu wysyłanego kodu itp.
Agile – metodologia dzieląca pracę na mniejsze fragmenty „sprinty”, co pozwala na dopasowanie pracy do możliwości zespołu i śledzenie postępu
Monitoring – pozwala na zbieranie i analizę danych w Azure, która nastęnie może być wykorzystana do podejmowania dalszych decyzji w rozwoju oprogramowania, a operacyjnie pomaga w utrzymaniu dostępności usługi.
Cloud – umieszczanie usług w chmurze: prywatnej, publicznej lub hybrydowej.
IaaC – tworzenie i zarządzanie infrastruktury za pomocą kodu
Microservice – podział aplikacji na wiele małych usług, z których każda jest odpowiedzialna za niewielki fragment funkcjonalności. Jest to przeciwieństwo architektury monolitycznej
Containers – technika uruchamiania aplikacji wyizolowanej z systemu operacyjnego do postaci tzw. kontenera. Kontener powołuje się na konfigurację utworzoną wcześniej w innym kontenerze i dodaje do niego swoją warstwę funkcjonalności, np. funkcjonalności specyficznej aplikacji.
Migracja w stronę DevOps wymaga stworzenia wyspecjalizowanych zespołów, dopasowania procesów, stąd właśnie taka a nie inna definicja tego czym jest DevOps. Konflikty z istniejącymi procesami są jednak nieuniknione.
DevOps team musi definiować swoje cele, a do tego są potrzebne metryki: ile czasu spędza się na naprawie błędów, ile czasu spędza się na wykonaniu powtarzalnych czynności, ile czasu trwa stworzenie określonej funkcjonalności.
SERIAL generuje kolejne wartości, zazwyczaj używane jako identyfikator w tabelach. Np. tutaj kolumna id ma automatycznie nadawaną wartość:
CREATE TABLE t1
(id SERIAL,
name TEXT
);
a tutaj id trzeba podawać samodzielnie:
CREATE TABLE t2
(id INT,
name TEXT
);
Co zrobić, jeśli chcielibyśmy w zapytaniu SQL wykorzystać wartość, która została wygenerowana w kolejnym zapytaniu? Oto propozycja nr 1
Polecenie INSERT wstawia nowy rekord. Podczas tego wstawiania generowana jest nowa wartość id. Ta wartość jest zwracana przez klauzulę RETURNING. Żeby z tej wartości dalej skorzystać budujemy wyrażeni CTE (Common Table Expression), które wartości zwracane przez INSERT z RETURNING udostępnia w wirtualnej tablicy r. Idąc dalej można wykonać zapytanie do tabeli r, a wynik np. wykorzystać do wstawienia go do kolejnej tabeli t2:
WITH r AS
(INSERT INTO t1(name) VALUES('x323') RETURNING id, name)
INSERT INTO t2(id, name)
SELECT * FROM r;
A oto propozycja nr 2.
Polecenie insert generuje nową wartość w oparciu o sekwencję (tak właśnie działa typ SERIAL). Możemy wiec w kolejnym zapytaniu pobrać wartość z tej sekwencji poleceniem currval. Co istotne zadziała to nawet wtedy, jeśli w międzyczasie w innej sesji ktoś też wstawił rekord do tabeli t1 i wygenerował nową wartość:
INSERT INTO t1(name) VALUES('c');
SELECT * FROM t1 WHERE id = currval('t1_id_seq');
W PG Admin, po wybraniu polecenia „Restore database” pojawia się czasami komunikat o błędzie „Utility not found”
Co wtedy zrobić?
Należy w menu PGAdmin wybrać polecenie File >> Preferences
Dalej poszukaj w drzewku po lewej stronie odszukaj Paths >> Binary Paths
Teraz po prawej stronie okna, w dolnej części zatytyłowanej „PostgreSQL Binary Path” odszukaj numeru wersji, którą masz na swoim komputerze. (Uwaga – nie pomyl się. Jest tam też podobna tabelka zatytułowana „EDB Advanced Server Binary Path” – ale ta nas nie interesuje.
Teraz kliknij ikonę folderka i wskaż na katalog bin, w którym masz zainstalowany PostgreSQL. Najprawdopodobniej będzie to coś w tym stylu (uważaj zwłaszcza na numer wersji):
C:\Program Files\PostgreSQL\15\bin
Po wybraniu foldera, powyższy ekran powinien wyglądać tak:
Teraz zapisz zmiany „Save” i problem powinien być rozwiązany 🙂
A o co chodziło w tych krokach? W katalogu, który wskazaliśmy znajdują się programy narzędziowe PostgreSQL. Jeden z nich to program pg_restore, który służy do odtwarzania bazy danych. Z jakiegoś powodu ten parametr nie ustawia się automatycznie i wtedy… trzeba trochę pomóc. Teraz już wiesz co, jak i dlaczego 🙂
Od czasu do czasu dostaję pytanie o to, jak formatować napisy w Pythonie. Lubię w takim przypadku odsyłać do dokumentacji Pythona, dlatego, ku pamięci…
Co ona oznacza? Jakie inne opcje oprócz inline są możliwe do uruchomienia?
Odpowiedź w skrócie: rysując wykres, możesz go uzyskać w dodatkowym okienku, które otworzy się, kiedy ten wykres pokazujesz, ale można też umieścić wykres bezpośrednio w Notebooku. Opcje domyślne się zmieniają – w starszych notebookach wykresy domyślnie generowały sie w ekstra oknie, a w nowszych są wbudowywane w notebook.
Jeśli chcesz się pobawić i zobaczyć, jak inaczej można by generować wykresy uruchom:
I sorry za brak kompentencji hahah, ale nie znam znaczenia wszystkich tych opcji 🙂 Część z nich u mnie w ogóle nie działa 🙂
Ale wykonałem takie oto próby, które powinny pomóc w zrozumieniu, jak z tym pracować. Co bardzo ważne – kernel notebooka należy przed uruchomieniem tego kodu zrestartować, tak, aby ten kod uruchomił się jako pierwszy. Ten kod otworzy nowe okno:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib qt
# evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)
# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
Po restarcie i zmianie kodu na:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
# evenly sampled time at 200ms intervals
t = np.arange(0., 5., 0.2)
# red dashes, blue squares and green triangles
plt.plot(t, t, 'r--', t, t**2, 'bs', t, t**3, 'g^')
plt.show()
Wykres jest umieszczany poniżej komórki, w której kod został uruchomiony.
No i bardzo ważne – zależnie od narzędzia jakiego używasz (Spyder, Jupyter, VSC, …) coś może zadziałać, albo nie, bo komendy rozpoczynające się od % działają nisko na poziomie modułu, który modyfikują.
Jeśli jesteś zainteresowany szczegółami poczytaj tu: https://www.scaler.com/topics/matplotlib-inline/
Visual Studio Code pozwala na korzystanie ze środowisk wirtualnych tworzonych w Pythonie. Takie środowisko bywa czasami uparte i nie chce sie automatycznie uruchomić. Oto jak udało mi się skłonić VSC do automatycznego uruchamiania wybranego środowiska.
– otwórz nowy pusty folder (projekt)
– otwórz terminal i stwórz nowy environment
python -m venv myenv
– dodaj do projektu plik z kodem pythonowym (wystarczy żeby miał w sobie cokolwiek, np. print(’hello’))
– naciśnij Ctrl+Shift+P i wyszukaj w palecie polecenia „Select Python interpreter”
– wskaż na interpreter z utworzonego wcześniej environment (w podkatalogu myenv)
Teraz jeśli uruchomisz nowy terminal, to ten terminal automatycznie aktywuje środowisko myenv (uruchamiając terminal miej już otwarty plik .py)
Jeśli uruchomisz skrypt, VSC też aktywuje to środowisko.
Bywa, że chcesz, żeby w menu Windows pojawiła się nowa pozycja, której program instalacyjny sam z siebie nie zainstalował. W końcu menu, to tylko zbiór skrótów do programów, wydaje się więc, że powinno być możliwe dodanie tam czegokolwiek. I rzeczywiście!
Menu można modyfikować globalnie dla wszystkich użytkowników komputera poprzez modyfikacje w
C:\ProgramData\Microsoft\Windows\Start Menu
Jeśli masz problem ze znalezieniem tego miejsca, albo w następnych wersjach Microsoft miałby je umieścić gdzie indziej, to można sprawdzić lokalizację menu z PowerShella:
[Environment]::GetFolderPath('CommonStartMenu')
a korzystając z komendy:
ii "$([Environment]::GetFolderPath('CommonStartMenu'))"
można ten folder od razu otworzyć w windows explorer!
Menu dla użytkownika znajduje się w katalogu:
C:\Users\<username>\AppData\Roaming\Microsoft\Windows\Start Menu
Ścieżka do tego katalogu może być zwrócona przez polecenie PowerShell:
[Environment]::GetFolderPath('StartMenu')
a folder otworzysz w Windows Explorer korzystając z:
ii "$([Environment]::GetFolderPath('StartMenu'))"
Teraz pozostaje tylko umieszczać w tych katalogach podkatalogi, skróty do programów, a menu Windows będzie te zmiany prezentować.