niedziela, 23 sierpnia 2015
Działanie mózgu podczas improwizacji
Już dawno nie improwizowałem żadnej scenki. Natrafiłem na filmik z TED o tym jak działa mózg podczas improwizacji grając na instrumencie czy rapując. Niestety, nie potrafię rapować czy grać na organkach, ale bardzo lubię i całkiem dobrze mi wychodzi improwizacja sceniczna.
sobota, 15 sierpnia 2015
Exportowanie praw dostępu w PS
Krótki kodzik, ale przydatny przy sprawdzaniu praw dostępu do plików. Chcesz wiedzieć jakie są uprawnienia - wystarczy, że uruchomisz ten PS skrypt, a on wygeneruje csv z uprawnieniami.
function Export-IOPermissions { [cmdletbinding()] param( [ValidateScript({Test-Path $_ -PathType 'Container'})] [string] $dir='.' , [ValidateNotNullOrEmpty()] [string] $outputcsv = '..\permissions.csv' , [ValidateNotNullOrEmpty()] [string] $Delimiter = ',' ) $prop = @('Path', 'Group', 'Owner', 'Sddl', 'PSChildName', 'AccessRightType', 'AccessRuleType', 'AreAccessRulesCanonical', 'AreAccessRulesProtected', 'AreAuditRulesCanonical', 'AreAuditRulesProtected', 'AuditRuleType', 'AccessToString', 'AuditToString') if( Test-path $outputcsv) { Remove-Item -path $outputcsv | out-null } gci -Recurse -path $dir | Get-Acl | select -Property $prop -Expand Access | Sort-Object -Property, Path, FileSystemRights, IdentityReference | Export-Csv -Path $outputcsv -Delimiter $Delimiter -NoTypeInformation -Force }
sobota, 8 sierpnia 2015
Pixar workplace
Uważam, że Pixar jest bardzo produktywną firmą, gdzie bardzo zdolni i kreatywni pracownicy mogą realizować piękne projekty. Zastanawiam się czy prace Pixar'a są takie dobre z powodu bardzo uzdolnionych ludzi czy z powodu stworzenia miejsca pracy (środowiska współpracy) dzięki którym pracownicy są bardziej kreatywni.
piątek, 7 sierpnia 2015
Posortowane pola obiektu w PS
Miałeś może do czynienia z obiektem w PS, który miał przynajmniej 30 pól?
Ciężko jest wyszukać wzrokiem pole wśród tych pól, jeżeli nazwy pól nie są posortowane.
Napisałem jednolinijkowca do sortowania properties'ów w obiekcie w PS.
Następnego dnia znów musiałem napisać tego samego jednolinijkowaca.
Nie zapisałem sobie i znów musiałem napisać tego jednolinijkowca.
Traktuje mój blog jak zestaw notatek, dla samego siebie niż dla innych :)
Poniżej jest ten jednolinijkowiec:
Ciężko jest wyszukać wzrokiem pole wśród tych pól, jeżeli nazwy pól nie są posortowane.
Napisałem jednolinijkowca do sortowania properties'ów w obiekcie w PS.
Następnego dnia znów musiałem napisać tego samego jednolinijkowaca.
Nie zapisałem sobie i znów musiałem napisać tego jednolinijkowca.
Traktuje mój blog jak zestaw notatek, dla samego siebie niż dla innych :)
Poniżej jest ten jednolinijkowiec:
$objWithProp = .. $objWithProp | Format-List ([string[]]($objWithProp | Get-Member -MemberType Property | %{ $_.Name } | Sort-Object))
środa, 5 sierpnia 2015
Tworzenie backup'u za pomocą scripter'a w PS
Ostatnio musiałem tworzyć skrypty do tworzenia bazy danych (od zera) w sql server. Kod zamieszczony jest na github'ie i projekt nazywa się BackupSqlServerPS. Projekt nazwałem backupem bo oprócz generowania t-sql skryptów do bazy danych to są tworzone skrypty do sql server jobów, zapisywane są logi z bazy i jobów, zapisywane są dane z tabel w formacie csv oraz tworzone są skrypty z danymi w zapytaniami "insert into values". Projekt jest w budowie. Jeszcze chciałbym dodać export użytkowników, execution planów, diagramów i assemblies oraz tworzenie bak'ów. Jeszcze dużo przede mną :)
Najważniejszą funkcją do backupów jest tworzenie scryptera. Z mechanizmu skryptera pewnie już korzystałeś
Za każdym razem jak w Sql Server Management Studio przez menu kontekstowe tworzysz zapytanie 'select ...', create, drop lub podobne to, to zapytanie jest tworzone przez scryptera.
Tak na prawdę skrypter to obiekt klasy Microsoft.SqlServer.Management.SMO.Scripter z pakietu Sqlserver Management Objects. Najwięcej problemów było przy ustawianiu opcji scriptera. Poniżej zamieściłem, krótki przykład tworzenia skryptów do tworzenia tabel w bazie danych. Oczywiście napisałem to w PS.
Na początku musisz załadować SMO:
Tworzymy obiekt reprezentujący server:
Tworzymy obiekt grający pierwsze skrzypce:
Teraz wyciągamy wszystkie obiekty z bazy danych
Skrypt główny, który robi wszystko ('śpiewa i tańczy') nazywa się backup-sqlserver.ps1
Oprócz tabel to tworzymy skrypty do Stored Procedures, widoków, user-defined functions oraz typów.
Po uruchomieniu skryptu będziemy mieli foldery w którym będą skrypty do tworzenia obiektów.
Najważniejszą funkcją do backupów jest tworzenie scryptera. Z mechanizmu skryptera pewnie już korzystałeś
Za każdym razem jak w Sql Server Management Studio przez menu kontekstowe tworzysz zapytanie 'select ...', create, drop lub podobne to, to zapytanie jest tworzone przez scryptera.
Tak na prawdę skrypter to obiekt klasy Microsoft.SqlServer.Management.SMO.Scripter z pakietu Sqlserver Management Objects. Najwięcej problemów było przy ustawianiu opcji scriptera. Poniżej zamieściłem, krótki przykład tworzenia skryptów do tworzenia tabel w bazie danych. Oczywiście napisałem to w PS.
Na początku musisz załadować SMO:
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.ConnectionInfo") [System.Reflection.Assembly]::LoadWithPartialName("Microsoft.SqlServer.SMO")
Tworzymy obiekt reprezentujący server:
$srvConn = new-object Microsoft.SqlServer.Management.Common.ServerConnection $srvConn.ServerInstance = 'localhost' $srvConn.Login = 'user' $srvConn.Password = 'passwd' $srv = New-Object Microsoft.SqlServer.Management.SMO.Server($srvConn)
Tworzymy obiekt grający pierwsze skrzypce:
$scripter = New-Object Microsoft.SqlServer.Management.SMO.Scripter($srv) $scripter.Options.IncludeDatabaseContext = $false $scripter.Options.WithDependencies = $false $scripter.Options.AllowSystemObjects = $false $scripter.Options.NoCommandTerminator = $false $scripter.Options.ScriptSchema = $true $scripter.Options.SchemaQualify = $true $scripter.Options.DriAll = $true
Teraz wyciągamy wszystkie obiekty z bazy danych
$db = $srv.Databases['database'] $tbl = $db.tables | ? {-not $_.IsSystemObject } foreach ($o in $tbl) { { $scripter.Options.FileName = $o.Name + ".sql" $scripter.Script($o) }Jeżeli będziemy tworzyć inserty z danymi to zamiast $scripter.Script($o) powinniśmy wywołać $scripter.EnumScript($o)
Skrypt główny, który robi wszystko ('śpiewa i tańczy') nazywa się backup-sqlserver.ps1
Oprócz tabel to tworzymy skrypty do Stored Procedures, widoków, user-defined functions oraz typów.
Po uruchomieniu skryptu będziemy mieli foldery w którym będą skrypty do tworzenia obiektów.
wtorek, 4 sierpnia 2015
Konwersja w sql serer
sobota, 1 sierpnia 2015
Pseudorekurencja w SqlServer
Już dawno nie miałem styczności z SqlServerem więc muszę sobie przypomnieć. Dla treningu zrobiłem zapytanie rekurencyjne (pseudorekurencje). Już taki skrypt wykonałem dla Oracla i muszę powiedzieć, że kod wygląda identycznie :)
Dla problemu liczby fibonacciego tworzymy CTE:
Arithmetic overflow error for type int, value = 2147483648.000000.
Możemy zmienić typ kolumny w zapytaniu. Do sprawdzenia typu pomocne nam będzie funkcja SQL_VARIANT_PROPERTY. Przykład wykorzystania takiej funkcji jest poniżej:
Dla problemu liczby fibonacciego tworzymy CTE:
WITH Fibonacci_cte AS ( SELECT 0 as PrevFibN, 1 as FibN, 1 as Nr UNION ALL SELECT FibN, PrevFibN + FibN, Nr+1 FROM Fibonacci_cte WHERE FibN < 1000000000 ) select * from Fibonacci_cteWynik zapytania wygląda tak: Dla problemu wieży Hanoi mamy model:
with Hanoi_cte AS ( select 1 as n, 1 as counts union all select n +1 as n, POWER(2, n+1) -1 as counts from Hanoi_cte where n < 30 ) select * from Hanoi_cteWyniki zapytania są poniżej: W tych przykładach dostaje często wyjątek związany z przekroczeniem dozwolonej wielkości dla typu kolumny (int).
Arithmetic overflow error for type int, value = 2147483648.000000.
Możemy zmienić typ kolumny w zapytaniu. Do sprawdzenia typu pomocne nam będzie funkcja SQL_VARIANT_PROPERTY. Przykład wykorzystania takiej funkcji jest poniżej:
select SQL_VARIANT_PROPERTY(POWER(CAST (2 as bigint), 2) , 'BaseType')Kiedy dodamy kastowanie do bigint to możemy już uzyskiwać większe liczby.
with Hanoi_cte AS ( select CAST (1 AS bigint) as n, CAST (1 AS bigint) as counts union all select n + 1 as n ,POWER(CAST (2 as bigint), n+1) -1 as counts from Hanoi_cte where counts < CAST(0x3FFFFFFFFFFFFFFF AS bigint) ) select * from Hanoi_cteAle i tak dla tego problemu możemy iterować do 63 rekordu - czy wiesz może dlaczego :) Tak samo dodałem kastowanie do bigint dla problemu fibonacciego:
WITH Fibonacci_cte AS ( SELECT CAST (0 as bigint) as PrevFibN, CAST(1 as bigint) as FibN, 1 as Nr UNION ALL SELECT FibN, PrevFibN +FibN, Nr+1 FROM Fibonacci_cte WHERE Nr < 92 ) select * from Fibonacci_cteA wyniki tego zapytania są poniżej:
Subskrybuj:
Posty (Atom)