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:
$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:
[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

W moje ręce trafiła grafika pokazująca konwersje danych pomiędzy różnymi typami danych w sql serverze. Grafikę znalazłem na stronie msdn i można ją pobrać w postaci PDF.


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:
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_cte

Wynik 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_cte  

Wyniki 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_cte  

Ale 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_cte
A wyniki tego zapytania są poniżej: