Windows: Język na ekranie logowania

2021-02-10

Coraz częściej pracujemy w środowiskach międzynarodowych. Standardem jest używanie języka angielskiego, ale… jeśli na biurku masz klawiaturę francuską, czy niemiecką, to nic dziwnego, że administratorzy konfigurują do wykorzystania również inne „egzotyczne” układy.

W takim przypadku z pewnością chcemy dodać język angielski. Trzeba to zrobić w kilku miejscach:

  • Panel sterowania >> język (language) – dodaj język i wybierz kolejność stosowania języków
  • Z boku kliknij na „Advanced” i wypełnij odpowiednio pola

  • Kliknij „Apply language settings to the welcome screen”, a potem w oknie Region na zakładce Administrative:
  • Wybierz Change system locale i zmień język, tak jak chcesz
  • Kliknij też Copy settings

  • zaznacz „Welcome screen” i „New user accounts”
  • Pozamykaj okna i zrestartuj system

Niestety po wszystkim, nadal może sie okazać, że domyślny język wprowadzania danych na ekranie logowania to np. Francuski. W takim przypadku:

  • Uruchom gpedit.msc, przejdź do:
    Local Policy >> Computer Configuration >> Administrative Templates >> System >> Locale Services
    i zmień wartość w „Disallow copying of user input methods to the system account for Sign-in” na Enabled

W moim przypadku, dopiero to ostatnie ustawienie po restarcie spowodowało wyświetlenie języka angielskiego i angielskiej klawiatury na ekranie logowania

 

By Rafał Kraik in Helpdesk

Python: args i kwargs

2021-02-08

Python jest fajny, bo jest dynamiczny. Napiszesz sobie funkcję, a potem ni z tego ni z owego można ją wywoływać na wiele sposobów. Popatrz na ten przykład:

Proste? No pewnie, że proste! Funkcja ma dwa argumenty i wywołujemy ją z dwoma argumentami i już!

Ale może by tak, mając listę dwóch elementów przekazać ją do tej funkcji? Może funkcja będzie na tyle sprytna, żeby zrozumieć o co chodzi? Niestety będzie błąd:

… ale gdyby tak, przed listą dodać gwiazdkę, to Python „wyłuska z listy jej elementy i przekaże je do funkcji:

Wow! Dobre!

No a jeśli nie mamy listy argumentów, tylko słownik? I jeśli jeszcze w tym słowniku elementy są „przypadkowo” nazwane tak, jak argumenty testowanej funkcji? Przy pierwszym podejściu – niestety klapa:

Ale my już wiemy, jak sobie z tym poradzić:

Jedna gwiazdka jakoś już pomogła, niestety, pewnie wolelibyśmy nie zobaczyć w wyniku funkcji nazw kluczy, tylko ich wartości! Z pomocą przyjdą dwie gwiazdki, które konwertują słownik na nazwane wartości przekazywane do funkcji:

I to już działa idealnie. Funkcja domyśliła się, co to jest arg_1 mimo tego, że ta wartość w słowniku była dopiero na drugim miejscu.

Fajnie, ale te „chwyty” można też wykorzystać definiując funkcję:

Kiedy chcesz, aby funkcja mogła przyjąć dowolną liczbę parametrów przekazywanych po prostu przez pozycję, to wystarczy zadeklarować argumenty jako  *args. W ciele funkcji można wtedy skorzystać ze zmiennej args, która jest listą.  Bardzo to elastyczne!

Jeśli z kolei chcesz, aby funkcja miała przyjmować dowolną liczbę argumentów ze słownika, to argument poprzedź dwoma gwiazdkami. Zazwyczaj ten parametr nazywamy kwargs (key-word argument):

Teraz do funkcji można przekazywać dowolną liczbę nazwanych parametrów, a funkcja w sprytny sposób zobaczy je jako słownik. To użytkownik wywołując funkcję sam decyduje o tym, jak mają się nazywać argumenty widoczne w funkcji.

Obie te metody można zresztą połączyć i zbudować funkcję tak:

Jak widać funkcję można teraz wywoływać z argumentami określanymi przez pozycję i nazwę, albo tylko przez nazwę albo tylko przez pozycję.

Oj przyda się na pewno!

By Rafał Kraik in Python

PANDAS: odwołanie do wiersza, czy do wartości?

2021-01-27

W Pandas, seria danych to po prostu ciąg wartości. Wartość numer 2 to po prostu element prostego typu. Bardzo podobnie na pierwszy rzut oka wygląda jednokolumnowy DataFrame, ale… pewne różnice są:

Tak powstaje seria danych – dla „zmyłki” indeksem jest kolumna numbers:

oto wynik:

A tak wygląda to, jeśli utworzymy DataFrame, który ma jedną kolumnę i indeks zdefiniowany w oparciu o numbers:

wynik jest na pierwszy rzut oka podobny:

Duże różnice pojawią się jednak przy odwołaniu do konkretnej pozycji:

a dla DataFrame:

By Rafał Kraik in Python

Postgres: Role i SUPERUSER

2021-01-24

Żeby uzyskać dostęp do PostgreSQL, to należy mieć dostęp do tzw. Login role (dawniej user). Jeśli taka rola jest oznaczona jako superuser, to ta rola uzyskuje nieograniczone uprawnienia do serwera bazy danych. Podczas instalacji serwera, taka rola jest tworzona automatycznie i nazywa się postgres. Role mogą też służyć do nadawania uprawnień nie nadając bezpośrednio dostępu do serwera. Role można w sobie zagnieżdżać. Rola, której członkiem są inne role nosi nazwę group role, a jeśli ta rola pozwala też na korzystanie z serwera to jest to group login name. W sumie logiczne 😊

Poniższa komenda tworzy rolę camila z dodatkowym uprawnieniem do tworzenia nowych baz danych

CREATE ROLE camila LOGIN PASSWORD ‚Passw0rd’ VALID UNTIL ‚infinity’ CREATEDB;

Słowo superuser dodane na końcu polecenia powoduje, że użytkownik staje się pełnoprawnym i „wszechmocnym” administratorem

CREATE ROLE adm_dagmara LOGIN PASSWORD ‚P@ssw0rd’ VALID UNTIL ‚2030-01-01 00:00’ SUPERUSER;

Jeśli rola nie ma służyć do logowania, to należy opuścić słowo LOGIN. Dodane tutaj INHERIT powoduje, że inne role dodane jako członkowie do toli adm_security będą dziedziczyć jej uprawnienia. Ta opcja jest w zasadzie domyślna, więc nie trzeba jej wpisywać jawnie.

CREATE ROLE adm_security INHERIT;

Grant pozwala dodać jedną rolę do innej roli jako członka. W ten sposób camila otrzyma wszystkie przywileje roli adm_security (bez ewentualnego przywileju superuser, bo ten jako jedyny nie podlega dziedziczeniu)

GRANT adm_security TO camila;

Do nadawania przywilejów dla ról należy posłużyć się poleceniem ALTER ROLE

ALTER ROLE adm_security SUPERUSER;

Kiedy użytkownik należy do roli, to może się przełączyć w tą rolę korzystając z SET ROLE

SET ROLE adm_security;

Po wykonaniu takich przełączeń można na bieżąco sprawdzać w jakiej tożsamości w danej chwili się pracuje. Stąd też można odwołać się do zmiennych session_user i current_user. Session_user określa nazwę roli jaka została wykorzystana do początkowego połączenia do serwera, zaś current_user to nazwa tożsamości w jakiej w danej chwili znajduje się użytkownik

SELECT session_user, current_user;

Dodatkowo superuser ma prawo wykonywać polecenie SET SESSION AUTHORIZATION, które  zmieni nawet wpis dotyczący roli używanej na początku do zainicjowania połączenia

SET SESSION AUTHORIZATION ROLE adm_security;

Poprzez przełączanie się miedzy rolami może dojść do… przekrętów. Camila będąc członkiem roli adm_security może zmienić swoją rolę na adm_security. Niestety nie dziedziczy w ten sposób przywileju superuser. Jednak rola adm_security ma przywilej superuser, więc może teraz zmienić swoje konto camila nadając mu uprawnienie superuser. Od tej pory może już robić wszystko!

By Rafał Kraik in PostgreSQL

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