Python: wycięcie z napisu tekstu w cudzysłowiu

2018-05-08

Załóżmy, że masz taki tekst:

message = 'Document "cv.doc" was printed on printer: XEROX'

z tego napisu chcesz wyciąć  tylko nazwę dokumentu cv.doc. Można by to zrobić posługując się zwykłymi poleceniami pracującymi na napisach, ale nie jest to zbyt wygodne rozwiązanie – trzeba się sporo przy tym napracować, a na dodatek kod będzie nieczytelny, trudny do poprawy i niewydajny.

Za to z pomocą mogą przyjść wyrażenia regularne, np

\"(.*)\"
  • Kropka to dowolny znak
  • * oznacza dowolną ilość wystąpień tego znaku
  • Nawiasy służą do grupowania
  • \” – oznacza dopasoanie/wyszukiwaniecudzysłowiów

Żeby skorzystać z wyrażeń regularnych zaimportuj moduł re a potem funką findall wyszukaj wystąpień podnapisów zawartych w tekście

import re
matches = re.findall(r'\"(.*)\"',message)
for m in matches:
     print(m)

 

 

By Rafał Kraik in Python

Python: Różnica między == a „is”

2018-05-08

Można mieć wątpliwości w jaki sposób porównywać ze sobą wartości, bo dostępne są dwie podobne instrukcje:

  • operator porównania wartości zmiennych ==

oraz

  • operator porównania zmiennych „is”

Najpierw zobaczmy sytuację kiedy oba operatory zwrócą te same wyniki:

a = 'mouse'
b = 'mouse'

#sprawdzam czy a == b
print (a==b)

#sprawdzam czy a i b to ta sama zmienna (operator is)
print (a is b)

#is sprawdza czy 2 zmienne są identyczne - identyfikator zmiennej zwraca funkcja id()
print(id(a),id(b))

W tym przypadku operator == i is zadziałał tak samo, a wywołane na końcu funkcje id() zwracają taką samą liczbę. Co się jednak stanie jeśli zmienimy skrypt o tak:

a = 'mouse'
b = 'mous'
b+='e'

#sprawdzam czy a == b
print (a==b)

#sprawdzam czy a i b to ta sama zmienna (operator is)
print (a is b)

#is sprawdza czy 2 zmienne są identyczne - identyfikator zmiennej zwraca funkcja id()
print(id(a),id(b))

No cóż. Teraz różnice już są! Operator == nadal zwraca True, bo w zmiennej a i b jest taka sama wartość. Jednak porównanie operatorem is zwraca False. Dlaczego? Bo a i b to różne zmienne, które wskazują w różne miejsca w pamięci. Widać to kiedy funkcja id zwraca różne identyfikatory dla tych zmiennych

Podsumowujac

== bada czy wartości zmiennych są sobie równe. Ten operator powinien być używany do testowania czy wartości zmiennych są sobie równe różne itp

is jest bardziej zaawasowanym operatorem. Sprawdza on, czy dwie zmienne wskazują w to samo miejsce w pamięci, czyli innymi słowy czy te dwie zmienne są takie same.

By Rafał Kraik in Python

SQL: Service Broker: Diagnozowanie

2018-05-05

Service Broker jest dość trudny do zdiagnozowania. Mam wrażenie, że jak działa  to jest dobrze, a jak nie działa, to… nie działa i jest niedobrze.

Na całe szczęście, nawet jeśli początkowe metody zawiodą, to jest jeszcze szansa wypatrzenia jakiegoś problemu przy pomocy Profilera.

Zazwyczaj zaczynam od zaznaczenia wszystkiego w grupie broker. I tak np. dzięki zdarzeniu

Broker: Message Undeliverable

udało mi się złapać błąd:

This message could not be delivered because the security context could not be retrieved.

Hmm, ale co to oznacza? Skoro mowa jest o security context to należałoby przejrzeć dostępne certyfikaty, loginy, uprawnienia itp. Przydatna może się okazać druga sesja profilera, w której skorzystamy ze zdarzeń z grupy Security Audit.  Jest tu kilka zdarzeń swiązanych z brokerem. W moim przypadku udało się złapać:

Audit BrokerConversation

Certificate not found

No to jestem w domu! Brakowało certyfikatu!

By Rafał Kraik in SQL

SQL: Instalacja w oparciu o plik INI

2018-04-30

Często (prawie zawsze) używam właśnie tej metody instalacji SQL. Jeśli jednak w instalacji pojawia się coś nowego, czego do tej pory nie isntalowałem, to plik ini należy w odpowiedni sposób zaktualizować. Nazwy parametrów są zgodne z parametrami, które można przekazaywać do pliku setup.exe i są one omówione w tym artykule:

https://docs.microsoft.com/en-us/sql/database-engine/install-windows/install-sql-server-from-the-command-prompt?view=sql-server-2017

By Rafał Kraik in SQL

Import i export danych binarnych do tabel i zmiennych SQL

2018-03-31

Masz plik na dysku ze zdjęciem lub certyfikatem lub czymkolwiek innym. Plik jest binarny. Jak go wstawić do zmiennej lub do tabeli?

USE tempdb
GO

CREATE TABLE MyBinary(Blob VARBINARY(MAX))
GO

DECLARE @Data VARBINARY(MAX)
 SET @Data = (SELECT BulkColumn FROM Openrowset( Bulk 'C:\temp\MyCertificate.cer', Single_Blob) as img)
INSERT MyBinary VALUES(@Data)
GO

W moim przypadku chciałem korzystać z tak zaimportowanego certyfikatu w skrypcie, żeby uruchamiając skrypt na danym systemie nie trzeba było kopiować żadnych dodatkowych plików na czas instalacji. Innymi słowy chciałem mieć zmienną binarną zadeklarowaną w skrypcie. Moja „sztuczka” polegała na wyeksportowaniu danych tabeli MyBinatry i odpowiedniej modyfikacji skryptu. W tym celu:

  • Kliknij prawą myszką na bazie danych i wybierze Tasks >> Generate Scripts
  • W kreatorze zaznacz tylko tabelę MyBinary
  • W następnym oknie kreatora kliknij Advanced i zmień „Schema only” na „Data only”
  • W wygenerowanym skrypcie znajdzie się dłuuuuga wartość, która jest reprezentacją kolumny binarnej
Teraz udało mi się więc napisać fragment skryptu w  postaci (część binarna jest dla skrócenia wycięta):

DECLARE @DataCert VARBINARY(MAX)
SET @DataCert = (0x308...129)

No dobrze. A jak teraz tego rodzaju zmienną zapisać w postaci pliku binaranego z powrotem na dysku? Skorzystamy z funkcji OLE, które zazwyczaj ze względu na wymogi bezpieczeństwa są wyłaczone, dlatego skrypt najpierw sprawdzi czy opcja ‚Ole Automation Procedures’ jest wyłączona, zapamięta to, włączy jeśli trzeba, a na końcu przywróci oryginalne ustawienia. Środkowa część skryptu to kilka kolejnych kroków, które należy wykonać aby dane zapisać na dysku:

DECLARE @DataCert VARBINARY(MAX)
SET @DataCert = (0x308...129)

DECLARE @certPath varchar(50) = 'C:\temp\MyCertificate.cer'
DECLARE @handle int

EXEC sp_OACreate 'ADODB.Stream', @handle OUTPUT; 
EXEC sp_OASetProperty @handle, 'Type', 1; 
EXEC sp_OAMethod @handle, 'Open'; 
EXEC sp_OAMethod @handle, 'Write', NULL, @DataCert; 
EXEC sp_OAMethod @handle, 'SaveToFile', NULL, @certPath, 2; 
EXEC sp_OAMethod @handle, 'Close'; 
EXEC sp_OADestroy @handle; 

IF @initialOLEAutomationOption = 0 
BEGIN
 EXEC sp_configure 'Ole Automation Procedures', 0
 RECONFIGURE WITH OVERRIDE
END

 

By Rafał Kraik in SQL

Powershell: Jak sprawdzić kiedy w clustrze wystąpił failover

2018-03-26

Jedna prosta komenda:

Get-winEvent -ComputerName $env:COMPUTERNAME -filterHashTable @{logname =’Microsoft-Windows-FailoverClustering/Operational’; id=1641}| ft -AutoSize -Wrap

Właściwie każdy wie, że takie zdarzenia trafiają do loga. Spryt  polcecenia polega na wyfiltrowaniu tylko tych zdarzeń, które rzeczywiście są potrzebne.

By Rafał Kraik in Power Shell

SQL: Extended Events vs Profiler

2018-03-25

Microsoft już dawno temu poinformował o tym, że Profiler nie będzie dalej rozwijany i zaprosił do korzystania z extended events. Rzeczywiście extendend events mają o wiele wiecej możliwości monitorowania aktywności systemu i dodatkowo robią to znacznie wydajniej. Gdyby ktoś jednak nadal nie był przekonany co do stosowania extended events, to może ten wykres go przekona… ?

Wykres prezentuje ilość zdarzeń, które mogą być monitorowane przy pomocy extended events i przy pomocy profilera. Podczas gdy  ilość extended events od wersji 2008 powiększyła się 4-krotnie, ilość zdarzeń dla profilera stoi na poziomie 180!

By Rafał Kraik in SQL 2016