Azure: Nie działa wyzwalanie triggera w logic app z event hub

2020-04-25

Co może póść nie tak, kiedy idziesz krok po kroku zgodnie z łopatologiczną instrukcją z helpa Microsoft? Poprawna odpowiedź to wszystko albo nic.

https://docs.microsoft.com/en-us/azure/event-grid/monitor-virtual-machine-changes-event-grid-logic-app

Miałem dziwny przypadek, bo w jednej subskrypcji ta metoda zadziałała, a w innej nie. Porównałem kod logic app zapisany w formacie JSON linijka po linijce i był taki sam. O co więc chodzi?

Rzut oka na „overview” applikacji wykazywał, że trigger wcale sie nie uruchomił. Trigger z kolei był oparty o event hub. Najprawdopodobniej więc to coś nie tak z event hub. Właściwie ten wniosek, to już 90% rozwiązania.

Jak to jest ładnie opisane tutaj: https://toonvanhoutte.wordpress.com/2019/01/08/logic-apps-event-grid-trigger-not-firing/

należało:

  • wejść do swojej subskrypcji
  • przejść do zakładki „Resource provider”
  • i odszukać na liście EventGrid
  • jeśli w statusie zobaczysz wartość „Not Registered”, to znalazłeś przyczynę!
  • zaznacz linijkę i kliknij register

 

Za radą z artykułu, wróciłem jeszcze do aplikacji i ją wyłączyłem (Disable) i włączyłem (Enable). Gotowe. Przy najbliższej okazji trigger się odpalił i aplikacja zadziałała tak jak należało 🙂

 

By Rafał Kraik in Azure

Klasa „4 i” LO nr 2 Opole 1988-1992 – 4i Liceum Ogólnokształcące w Opolu

2020-04-14

Cześć! Chodziłaś do tej klasy? Liceum Ogólnokształcące nr 2 w Opolu – klasa 4i w latach 1988-1992? Daj mi znać. Zorganizowaliśmy się lata po studiach, ale nadal się szukamy. Odezwij się do mnie i dołącz do wesołego grona. Brakuje nam Ciebie. Nie zastanawiaj się tylko pisz:

Dzięki!

Rafał

By Rafał Kraik in SQL

Python: Pandas: Formatowanie kolumn – metoda to_string i parametr formatters

2020-04-10

Dane to dane i kiedy przetwarzasz je w data frame, to generalnie nie należy się przejmować wyglądem tych danych. Jednak od czasu do czasu chcesz zadbać również o to jak te dane mają wyglądać.

Oto dataframe:

import pandas

d = {'col1': [1, 22, 333, 4444], 'col2': [4, 55, 666, 7777]}
df = pd.DataFrame(d)
df

Data Frame ma metodę to_string, a metoda to_string przyjmuje parametr formatter, który wpływa na sposób wyświetlania danych:

formatters={"col1": "{:,.2f}".format, "col2": "{:,.2f}".format}

print(df.to_string(formatters = formatters))

A co jeśli data frame zawiera dane napisowe – string? Te polecenia skonwertują nasz data frame do tekstu:

df = df.applymap(str)
df
df.dtypes

Tu przy pomocy parametru formatters określasz, że kolumna col1 ma być wyrównana do lewej strony i napis ma być umieszczony na 10 znakach, a col2 ma być wyrównany do prawej i też na 10 znakach:

formatters={"col1": "{:<10}".format, "col2": "{:>10}".format}
print(df.to_string(formatters = formatters))
By Rafał Kraik in Python

Python: Usuwanie duplikatów z listy

2020-04-04

Tak stworzymy sobie listę, w której niektóre wyrazy się powtarzają:

text='''
Industrial Light & Magic: In this case, you find Python
used in the production process for scripting complex,
computer graphic-intensive films. Originally, Industrial
Light & Magic relied on Unix shell scripting, but it was
found that this solution just couldn't do the job. Python
was compared to other languages, such as Tcl and Perl, and
chosen because it's an easier-to-learn language that the
organization can implement incrementally. In addition, Python
can be embedded within a larger software system as a scripting
language, even if the system is written in a language such as
C/C++. It turns out that Python can successfully interact with
these other languages in situations in which some languages can't.
'''
words = text.replace("\n"," ").split(' ')

Żeby sprawdzić jakie słowa się powtarzały możesz wywołać

sorted(words)

Jest tu dużo powtarzających się wartości. Oprócz listy jest też w Pythonie obiekt set (zbiór). O ile w liście kolejność jest istotna i elementy się powtarzają, to w secie kolejności nie ma i obiekty się nie powtarzają. Taką set robi się prosto:

set(words)

Ów set można znowu skonwertować do listy:

list(set(words))

 

Taka przekonwertowana lista nie zawiera już elementów powtarzających się

By Rafał Kraik in Python

Azure: Zmiana nazwy grupy zasobów

2020-03-29

W ramach testów utworzyłem ResourceGroup i z chwilowego braku fantacji nazwałem tę grupę ppp… Szczęśliwie się okazało, że  eksperymenty się udały i właściwie moje rozwiązanie mogłoby zostać tak jak jest, gdyby tylko nie ta głupia nazwa resource group…

Niestety nie ma możliwości zmiany nazwy grupy zasobów. Jest jednak trick 😉 Można utworzyć nową grupę zasobów, a następnie przenieść obiekty z feralnej grupy do nowo utworzonej grupy.

Jeśli wykonując to zadanie, nie chcesz zbyt dużo klikać, można skorzystać z powershella:

Get-AzResource -ResourceGroupName ppp | Move-AzResource -DestinationResourceGroupName OneDriveMailNotification_RG

Confirm
Are you sure you want to move these resources to the resource group
'/subscriptions/b0f2c2f3-c0ba-4f9b-b2ec-462472fdc456/resourceGroups/OneDriveMailNotification_RG' the resources:

/subscriptions/b0f2***56/resourceGroups/ppp/providers/Microsoft.Web/connections/onedrive
/subscriptions/b0f2***56/resourceGroups/ppp/providers/Microsoft.Web/connections/googledrive
/subscriptions/b0f2***56/resourceGroups/ppp/providers/Microsoft.Web/connections/gmail
/subscriptions/b0f2***56/resourceGroups/ppp/providers/Microsoft.Storage/storageAccounts/storageaccountppp8475
/subscriptions/b0f2***56/resourceGroups/ppp/providers/Microsoft.Logic/workflows/ProcessOrder
[Y] Yes [N] No [S] Suspend [?] Help (default is "Y"): y

WYkonanie nie było błyskawiczne, a wręcz myślałem, że coś się zawiesiło, ale koniec obiekty zostały poprawnie przeniesione. Teraz mogę rzeczywiście zrobić porządek 🙂

By Rafał Kraik in Azure

SQL Server: problem z odtworzeniem bazy z in memory

2020-03-15

Podczas odtwarzania bazy WideWorldImporters pojawiał się błąd, a właściwie cała seria błędów:

  • An error occurred during recovery, preventing the database 'WideWorldImporters’ (7:0) from restarting. Diagnose the recovery errors and fix them, or restore from a known good backup. If errors are not corrected or expected, contact Technical Support.
  • [WARNING] ALTER or DROP TABLE could not clean up root row within 10 seconds.
  • [ERROR] HkHostRecoverDatabaseHelper::ReportAndRaiseFailure(): Database ID: [7] 'WideWorldImporters’. Failed to load XTP checkpoint. Error code: 0x82000018. (sql\ntdbms\hekaton\sqlhost\sqlmin\hkhostdb.cpp:5740)
  • restoreHkDatabase: DbId 7, Msg 41316, Level 16, State 0, Restore operation failed for database 'WideWorldImporters’ with internal error code '0x82000031′.
  • [ERROR] HkRtRestoreDatabase(): Recovery failed with error 0x82000031 on database 7. This error will be mapped to 'HK_E_RESTORE_ABORTED’ (0x82000018). (sql\ntdbms\hekaton\runtime\src\hkruntime.cpp:5505)
  • The code generation directory cannot be created or set up correctly.
  • Creation of directory \\?\F:\data\xtp failed for reason 3.
  • [INFO] HkCkptLoadInternalEx(): Database ID: [7]. Root file: {3E231B6B-9EF1-4AE3-A1DB-BD01DC866DD9}, watermark: 40, RecoveryLsn: 00000272:00005EC4:0002, RecoveryCheckpointId: 4, RecoveryCheckpointTimestamp: 0xb

Czytaj dalej »

By Rafał Kraik in SQL

Python: typy mutable, immutable i metoda copy()

2020-03-09

W Pythonie występują typy mutable i immutable.

Immutable – niezmienne – typy takie jak int, float, bool, str. Zmienna wskazuje na komórkę w pamięci, ale kiedy do tej zmiennej wstawiasz nową wartość, to dla zmiennej rezerwuje się nową komórkę i tam przechowuje się jej wartość. Funkcja id() pozwala zmieniać adres tej komórki. W skrypcie poniżej początkowo i oraz new_i wskazują na tą samą wartość komórki, ale potem, po zmianie i, funkcja id() zwraca inne wartości dla każdej zmiennej. Immutable – wartość komórki pamięci się nie zmienia

i = 0
new_i = i

print(id(i), id(new_i)) 
i = 10

print(i, new_i)
print(id(i), id(new_i))

Mutable – zmienne – typy takie jak listy, zbiory, słowniki. Zmienna wskazuje na pewne miejsce w pamięci. Jeśli zmienia się wartość zmiennej (np. dodaje element do listy), to adres komórki zostaje ten sam, ale zmienia się zawartość struktury pamięciowej. Tutaj box i new_box, to właściwie to samo. Funkcja id() zwraca dokładnie ten sam identyfikator. Jeśli do box dodasz nowy element, to pojawi on się też w new_box. Mutable – wartość komórki pamięci się zmienia:

box = ['ab','bcd','cde']
new_box = box

print(id(box), id(new_box))
box.append('fgh')

print(box, new_box)
print(id(box), id(new_box))

Takie działanie typów mutable bywa niekiedy niepożądane i dlatego mamy do dyspozycji funkcję copy(). Ta metoda bierze oryginalny obiekt z pamięci i kopuje go w inne miejsce w pamięci, tworząc nową zmienną. Funkcja id() wywoływana dla zmiennej utworzonej poprzez copy() zwróci inną wartość, a co za tym idzie oba obiekty są różnymi obiektami i można je modyfikować niezależnie:

box = ['ab','bcd','cde']
another_box = box.copy()

print(id(box), id(another_box))
box.append('klm')

print(box, another_box)
print(id(box), id(another_box))
By Rafał Kraik in Python