piątek, 18 grudnia 2015

Benchmarki z webowych frameworków

Miesiąc temu wyszła 11 runda porównań frameworków webowych pod względem szybkości działania. Teraz już wiem dlaczego (dla celów wydajnościowych) wybiera się java nad c# oraz dlaczego niektóre projekty mają w back-end jvm, a od strony klienckiej jest .NET.

Wyselekcjonowałem tylko te frameworki, które zostały napisane w java i c#.
Wyniki są następujące:


Możesz sam wyselekcjonować te informacje jakie Cię interesują wchodząc na ten link.
Zastanawia się dlaczego Microsoft nie ma na celu zrobienia oddzielnej super szybkiej wersji aspnet'a dla celów komercyjnych. Pewnie wyrzuci się masę funkcjonalności związanymi z bezpieczeństwem, ale trudno.

Zawsze mi mówiono, że najlepsze frameworki powstają w środowiskach otwartych, tam gdzie za daną technologią stoją wielkie firmy - np. java i Oracle, go i google, c++ i producenci gier, objective-c i Apple, php i wikipedia, js i wszystkie strony :)

środa, 16 grudnia 2015

Dekompozycja projektu w R

Robiłem prezentacje i zastanawiałem się jak można zapisać cały projekt. Szukałem po sieci jakiś dobrych praktyk do dekompozycji plików. Ja wykombinowałem podział całego projektu na kilka plików:

Co w tych plikach jest? Zaczynając od początku:
Install.r - instalacja pakietów (ten skrypt wykonujemy tylko raz, aby pobrać paczki)
Functions.r - wszystkie funkcje
Load.r - ładowanie pakietów oraz przygotowywanie danych do prezentacji
Presentation.rpres - warstwa prezentacji, równie dobrze możne być to plik w Rmd czy z użyciem shiny (powód istnienia tego pliku jest TYLKO wyświetlanie tych danych jakie chcemy przedstawić, nie ma logiki biznesowej).
custom.css - customizacja warstwy prezentacji, czyli overridowane i dodatkowe css'y

I na końcu w folderze figures mam wszystkie zdjęcia.
Prezentacja o najpopularniejszych kryzysach ekonomicznych nie jest skończona. Jeszcze dużo chciałoby się dodać. Zaletą rpres jest to, że za każdym razem możemy mieć aktualne dane na prezentacji.
Poniżej rezultat wygenerowanej prezentacji:

wtorek, 13 października 2015

Program jak żarówka

Obejrzałem filmik dokumentalny o sztucznym wytwarzaniu rynku zbytu dla różnych produktów. Zastanawiam się czy można takie podejście zastosować do oprogramowania, które mogłoby działać jak lodówka, drukarka albo jak współczesna żarówka. Na przykład oprogramowanie może działać tylko przez 1000 godzin lub po danej liczbie uruchomień aplikacja będzie się zacinać. Klient takiej aplikacji będzie musiał zrobić update albo kupi nową wersję aplikacji (lub nowy sprzęt).

Po dłuższym zastanowieniu się to taki model biznesowy dla oprogramowania już występuje :)
W każdym razie, zapraszam do obejrzenia filmiku.



środa, 7 października 2015

Zmiana culture w bloku using

Bawiłem się kultura i potrzebuję kodu, który zostanie wywołany dla konkretnej kultury, a później wróci do poprzedniej kultury. Żeby to zrobić najprościej to należy użyć interfejsu IDisposable i tyle.
public class CultureContext : IDisposable
  {
      private CultureInfo contextCultureInfo = null;
 
      private CultureInfo exitCultureInfo = null;
 
 
   public CultureContext(CultureInfo ci)
   {
       exitCultureInfo = GetCulture();
       contextCultureInfo = ci;
       SetCulture(ci);
   }
 
   public void Dispose()
   {
       SetCulture(exitCultureInfo);
   }
 
      public virtual void SetCulture(CultureInfo ci)
      {
          Thread.CurrentThread.CurrentUICulture = ci;
          Thread.CurrentThread.CurrentCulture = ci;
      }
 
      public virtual CultureInfo GetCulture()
      {
          return Thread.CurrentThread.CurrentCulture;
      }
 
  }
Wtedy zastosowanie kultury w bloku using jest proste:
using (new CultureContext(new CultureInfo("en-US")))
{
      ...
}
Im prostsze rozwiązanie tym lepsze :)

poniedziałek, 5 października 2015

Walidacja bibliotek jako krok w CI

Skąd wież, że masz poprawne informacje w biblioteczce (.dll)?
Skąd wież, że wszystkie biblioteki w projekcie mają taką samą wersję lub nazwę produktu?
Ja napisałem mały skrypcik do walidacji biblioteczek pod względem wersji. Poniżej jest skrypt:
function Test-AssemblyVersion
{
    param(
        [Parameter(
        Position=0, 
        Mandatory=$true, 
        ValueFromPipeline=$true,
        ValueFromPipelineByPropertyName=$true)
    ]
    [String]
    $filePath
    ,
    [Parameter(
        ValueFromPipeline=$false)
    ]
    [String]
    $ProductVersion
    ,
    [Parameter(
        ValueFromPipeline=$false)
    ]
    [String]
    $FileVersion
    )
    begin{
        $invIC= [System.StringComparison]::InvariantCultureIgnoreCase
    }
    process {
        $file = $_
        if(test-path $file)
        {
            $ass = [System.Reflection.Assembly]::LoadFile($file)
            $fvi = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($ass.Location)
            if( $ProductVersion.Equals($fvi.ProductVersion, $invIC) 
               -and  $FileVersion.Equals($fvi.FileVersion, $invIC) )
            {
                Write-Host "$file is ok."
            }
            else
            {
                throw "Wrong ProductVersion or  FileVersion in $file."
            }
        }
    }
}
Przykładowe wywołanie przedstawione jest poniżej:
gci -path .\MyProject\bin\ -recurse -filter 'MyProject.*.dll' | Test-AssemblyVersion -ProductVersion 2.1.0.0 -FileVersion 2.1.0.0
Można teraz dodać wywołanie i funkcję do jednego pliku i cały kod wyglądałby tak:
param(
[string]$ProductVersion, 
[string]$FileVersion
)
function Test-AssemblyVersion
{
    param(
        [Parameter(
        Position=0, 
        Mandatory=$true, 
        ValueFromPipeline=$true,
        ValueFromPipelineByPropertyName=$true)
    ]
    [ValidateNotNullOrEmpty()]
    [String]
    $filePath
    ,
    [Parameter(
        Position=1, 
        Mandatory=$true, 
        ValueFromPipeline=$false,
        ValueFromPipelineByPropertyName=$false)
    ]
    [ValidateNotNullOrEmpty()]
    [String]
    $ProductVersion
    ,
    [Parameter(
        Position=2, 
        Mandatory=$true, 
        ValueFromPipeline=$false,
        ValueFromPipelineByPropertyName=$false)
    ]
    [ValidateNotNullOrEmpty()]
    [String]
    $FileVersion
    )
    begin{
        $invIC= [System.StringComparison]::InvariantCultureIgnoreCase
    }
    process {
        $file = $_
        if(test-path $file)
        {
            $ass = [System.Reflection.Assembly]::LoadFile($file)
            $fvi = [System.Diagnostics.FileVersionInfo]::GetVersionInfo($ass.Location)
            if( $ProductVersion.Equals($fvi.ProductVersion, $invIC) -and  $FileVersion.Equals($fvi.FileVersion, $invIC) )
            {
                Write-Host "$File is ok. ProductVersion is $($fvi.ProductVersion) and FileVersion is $($fvi.FileVersion)"
            }
            else
            {
                throw "Wrong ProductVersion or  FileVersion in $file. ProductVersion is $($fvi.ProductVersion) and FileVersion is $($fvi.FileVersion)"
            }
        }
    }
}
$root  = ( gi  '..\..'  ).FullName
Write-host "Root is $root"
$OutputPackage = "$root\bin"
if(Test-path $OutputPackage)
{
    $fcraLib  = gci -path $OutputPackager -filter 'MyProject.*.dll' 
    if( $fcraLib)
    {
        $fcraLib | %{$_.Fullname} | Test-AssemblyVersion -ProductVersion $ProductVersion -FileVersion $FileVersion
    }
    else
    {
        throw "No dll files in dir: $OutputPackage "
    }
}
Teraz można ten skrypt podpiąć do TeamCity.

sobota, 3 października 2015

Usuwanie .DS_Store poraz n-ty

Zawsze jak commituje moje repo to przez przypadek dodaje pliki .DS_Store. Już tysiące osób pisało jak rekurencyjnie usuwać takie pliki, to ja też napisze.

sudo find . -name ".DS_Store"  -type f -depth -exec rm {} \;




środa, 30 września 2015

Culture w PS

Ostatnio w projekcie jakieś cyrki pojawiały się. Postanowiłem troszkę porozglądać się po kulturze (formatowaniu dat) i napisałem skrypcik do wyświetlania daty dla wszystkich kultur.
Na początku potrzebujemy funkcję zwracającą listę kultur:
function Get-Culture
{
 [System.Globalization.CultureInfo]::GetCultures([System.Globalization.CultureTypes]::AllCultures) | %{ 
    try{
        [System.Globalization.CultureInfo]::CreateSpecificCulture($_.Name)
    }catch {}
}
}

Wywołąnie jest następujące:
$dt = Get-Date

Get-Culture 
| %{  New-Object PSObject -Property  @{Str = $dt.ToString($_); Name = $_.Name; DisplayName = $_.DisplayName}  } 
|  sort -Property Name
Teraz to można wyeksportować do pliku taki wynik. Poniżej zdjęcie jak wygląda rezultat wywołania w konsoli:



Przykłady jak będzie wyglądał LongDate, LongTime i ShortDate, ShortTime można sprawdzić pod tym linkiem

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:

piątek, 31 lipca 2015

Sposób na przeglądanie folderów w powolnej sieci

Jeżeli zdarzyło Ci się, że musiałeś poznać strukturę folderów w sieci, a połączenie było super wolne to, to rozwiązanie spodoba Ci się.
Wpadłem na nie dopiero pod koniec mojego poprzedniego projektu. Potrzebowałem informacji jak wygląda struktura folderów, nie potrzebowałem informacji o plikach, a połączenie było tak powolne, że krew mnie zalewała :)

Z pomocą przyszło do mnie polecenie xcopy:

xcopy /t /e  \\Shared\ c:\toCheck\

To polecenie kopiuje foldery z \\Shared\ do c:\toCheck\.
Działa bardzo szybko bo nie musi przetwarzać plików, a tylko info. o strukturze folderów.

niedziela, 26 lipca 2015

Jednolinijkowiec do czyszczenia projektu

Bierzesz Clean w VS i nie działa?
Nie wszystko usuwasz z binów.
Przyczyn może być wiele,
np. interakcja z inną aplikacją lub jak nasza aplikacja tworzy dodatkowe pliki w folderze bin.
Wtedy musisz usunąć wszystkie pliki w tym folderze.

Tutaj sprawdza się nasz jednolinijkowiec:
$path = "path_to_project"

gci -path $path -Recurse  
 | ? {$_.FullName.Contains("\bin\Debug\") 
   -or $_.FullName.Contains("\bin\Release\") } 
 | Remove-Item​

środa, 22 lipca 2015

Zmapowane dyski sieciowe

Na komputerach zdalnych mam zmapowane dyski sieciowy i czasami muszę przesłać ścieżkę.
Poniższa funkcja w PS zwróci Ci wszystkie zmapowane dyski:

function Get-NetworkDrive([string]$ln = "Z", [switch]$all, [string[]]$computername='.') {
if($all) {
    gwmi  -Class Win32_NetworkConnection  -computername  $computername 
    }
else {
    gwmi  -Class Win32_NetworkConnection  -Filter "LocalName like `'$ln%`'"  -computername $computername 
    }
}

Przykład działania funkcji na komputerze lokalnym wygląda tak:
Get-NetworkDrive P

środa, 15 lipca 2015

ApressOpen

Wydawnictwo Apress udostępniło książki do pobrania w wersji elektronicznej (format PDF, ePub oraz MOBI) za darmo.
Książki można kupić przez ten link:
http://www.apress.com/apressopen
Teraz to trzeba będzie się brać za czytanie :)

wtorek, 14 lipca 2015

Zabijanie zawieszonego serwisu

Zawieszony serwis to zły serwis. Nie można go stopować ani zrestartować.
Jedyne co nam pozostało to ubicie serwisu.

To rozwiązanie znalazłem z tej strony
Właśnie takiego prostego rozwiązania szukałem.

Najpierw wyświetlasz informację o serwisie, który zawiesił się:
sc queryex $service_name$
Zapisujesz identyfikator procesu (PID)

A później wywołujesz komendę do ubijania procesu:
taskkill /f /pid $pid$

niedziela, 12 lipca 2015

Zapytanie w jednej linijce w PS

Mam dla Ciebie szybki trick z PS.
Czasami muszę wysłać zapytanie w SQL w jednej linijce, ale w edytorze mam w wielu linijkach ( dla przejrzystości).
Poniżej jest template jak łatwo można napisać konwerter tekstu wielolinijkowego na tekst jednolinijkowy.

@"
     ...       
                
"@  -replace "`n|`r|\s+", " " | clip 
​

Przykład z SQLem wygląda tak:
@"
   SELECT 
       col1,
       col2,
       col3,
   FROM myTable
   Where 1=1
   Order by col1
                    
                
"@  -replace "`n|`r|\s+", " " | clip 
​

W tajemnicy powiem Ci, że możesz zastosować ten template nie tylko do SQL, ale również do innych języków np. do PowerShella :)

czwartek, 2 lipca 2015

Jestem zachwycony Rką

Zacząłem się uczyć Rkę i jestem zachwycony tym językiem (platformą).
Naprawdę fajne rzeczy można zrobić. Np. do symulowania procesu Wienera

D2_Wiener <- function() {
     dev.new(width = 10, height = 4)
     par(mfrow = c(1, 3), oma = c(0, 0, 2, 0))
     for(i in 1:3) {
         W1 <- cumsum(rnorm(100000))
         W2 <- cumsum(rnorm(100000))
         plot(W1,W2, type= "l", ylab = "", xlab = "")
     }
     mtext("2-dimensional Wiener-processes with no correlation",
     outer = TRUE, cex = 1.5, line = -1)
}​


Kiedy będziemy chcieli dodać skorelowane zmienne to wynik symulacji jest poniżej:
Correlated_Wiener <- function(cor) {
     dev.new(width = 10, height = 4)
     par(mfrow = c(1, 3), oma = c(0, 0, 2, 0))
     for(i in 1:3) {
         W1 <- cumsum(rnorm(100000))
         W2 <- cumsum(rnorm(100000))
         W3 <- cor * W1 + sqrt(1 - cor^2) * W2
         plot(W1, W3, type= "l", ylab = "", xlab = "")
     }
     mtext(paste("2-dimensional Wiener-processes (",cor," correlation)",
     sep = ""), outer = TRUE, cex = 1.5, line = -1)
}




Poniżej zamieszkam ściągi do Rki:

środa, 24 czerwca 2015

8 filmików o high frequency trading

Jestem po lekturach o HFT i jestem zdania, że bardzo trudno jest rozpocząć swoją przygodę z budowaniem infrastruktury do 'walki' na giełdzie. Co jednak nie zmienia mojego głodu na poszerzenie tej wiedzy i zdobycia doświadczenia w tym zakresie :)

Poniżej przedstawiam Ci najciekawsze filmiki o HFT.
























I filmik, który mówi o HFT od strony kuchni:



piątek, 29 maja 2015

Rozdzielanie argumentów cmd w PS

Jak pracowałeś z aplikacjami konsolowymi z gigantyczną liczba argumentów to za pewne dostawałeś oczopląsu - ja tak miałem. Mam mały skrypcik do rozwiązania tego problemu:
function Split-Args
{
    param(
    [ValidatenotNullOrEmpty()]
    [string]$argStr
    )
    [hashtable]$arg =@{}

    [regex]::Matches($argStr, '-.+') | %{
        [string]$value = $_.Groups[0].Value
        [string]$first, $second = $value.Split([char[]]@(' ','=',':'),2)
        $first = $first.Replace('-','')
        $arg[$first] = $second
    }

    return $arg.GetEnumerator() | sort  Name
}
Wywołanie jest następujące:
Split-Args "-unzip=true -zippedFile zipfile1.ZIP -unzipFolder .\unzips.temp\ --date sysdate -year:2014 ​"
Przyjemniej szuka się parametrów posortowanych po kluczu w kilku linijkach niż w jednej lini:



środa, 27 maja 2015

A\B U B\A

Dlaczego taki dziwny tytuł - dla ćwiczeń chciałem sobie napisać zapytanie wyświetlające różnicę między tabelą A i B.

Dajmy na to, że mamy tabele A z liczbami parzystymi:
 SELECT  LEVEL * 2  AS n  
            FROM DUAL
            CONNECT BY LEVEL <= 100

oraz tabele B z liczbami podzielnymi przez 3:
SELECT  LEVEL * 3  AS n  
            FROM DUAL
            CONNECT BY LEVEL <= 100

Teraz spróbujemy wyciągnąć różnice między tablą A i B. Całe zapytanie wygląda następująco:
WITH 
A AS
    (
         SELECT  LEVEL * 2  AS n  
            FROM DUAL
            CONNECT BY LEVEL <= 100
       
    ),  
B AS
     (
         SELECT  LEVEL * 3  AS n  
            FROM DUAL
            CONNECT BY LEVEL <= 100
       )
    

(SELECT 'a' tab ,n FROM A
MINUS
SELECT 'a' tab ,n FROM B)
UNION ALL
(SELECT 'b' tab ,n FROM B
MINUS
SELECT 'b' tab ,n FROM A)
ORDER by n 
;

Wynik takiego zapytania jest przedstawiony poniżej:

środa, 20 maja 2015

Autosys JILs i notepad++

Troszkę mam do czynienia z autosysem i bardzo nie lubię pracować z JILami. JILe (Job Information Language) to taki język, który opisuje proces lub paczkę procesów (Box). Przykład jak wygląda jil to można zobaczyć tutaj pod 8-m punkcie
lub tutaj.
Dodałem repo. z podświetleniem dla JILów. Repo jest tutaj. Dla takiego jila mamy takie podświetlenie:




Instrukcja jak zainstalować language file jest tutaj.
Uruchamiasz Notepad++ i w zakładce View idziesz na User Defined Language

Podświetlenie powinno być już zainstalowane. Możesz sprawdzić czy jest wpis z rozszerzeniem jil w pliku %APPDATA%\Notepad++\userDefineLang.xml​. W zakładkach języków powinieneś widzieć zmianę ( jak nie to uruchom jeszcze raz notepadd++).

Lista dostępnych podświetleń dla notepad++ możesz znaleźć pod tym linkiem.
Projekt pochodził z tego repozytorium.
Dzisiaj mam bardzo dużo 'tutaj' :)

sobota, 9 maja 2015

For loop dla msbuild

Jak będziesz chciał uruchomić kilka razy dany proces to możesz wykorzystać polecenia for. Ja tak muszę z budowaniem projektów w .NETcie. Musze 2 razy uruchomić msbuild'a. Niektóre projekty nie maja referencji do innych projektów w solucji, ale do zbudowanych bibliotek w specjalnym folderze. Problem też może być jak jedno budowanie projektu potrzebuje dużo czasu (dajmy na to 25 minut) i w każdym momencie może wystąpić błąd.

Polecenie do dwukrotnego budowania jest poniżej:
for /L %n in (1,1,2) do ( msbuild myProject.sln /m )​

Takie proste, a tak upraszcza życie :)

poniedziałek, 4 maja 2015

Kontrolowanie uwagi

Dzisiaj obejrzałem filmik o kontrolowaniu uwagi przez złodzieja.Wcześniej pisałem o sztuczce z kolorami, która również nawiązuje do kontrolowania uwagi.
Troszkę mnie to przeraża jak łatwo jest oszukać nasz umysł.


Zapraszam do obejrzenia.



wtorek, 21 kwietnia 2015

Brakujące dni w Oraclu

Któryś raz piszę to samo zapytanie, więc postanowiłem zapisać to rozwiązanie na blogu. Może Ci się przyda - mi na pewno :)

Przypuśćmy, że masz tabelę (o nazwie tableWithDate), która ma kolumnę z datą (dateToCheck). Ładujesz dane i zapisujesz dzień na które dane zostały załadowane. Na końcu ładowania danych powinieneś mieć wypełnioną tabelę z dla każdego dnia od 1 stycznia 2014. Chciałbyś sprawdzić dla jakich dni nie zostały załadowane dane.

Pomocne nam będą funkcje do operowania na dacie. Same zapytanie wygląda następująco:

WITH dates as (
    SELECT TRUNC(to_date('1/1/2014','DD/MM/YYYY')) -1 +  LEVEL AS d
    FROM DUAL
    CONNECT BY LEVEL <= 365
    )

SELECT  
d As "Date", 
to_char(d, 'DDD') As "DayOfYear",
to_char(d, 'Day') as "DayOfWeek", 
to_char(d, 'WW') As "WeekOfYear",
to_char(d, 'Month') As "MonthName", 
to_char(d, 'RM') As "Roman" ,
to_char(d, 'Q') As "Quarter"

FROM dates d
where  NOT  EXISTS (
    SELECT  tab.dateToCheck
    from tableWithDate tab
    where to_char(d.d, 'YYYYMMDD')  = to_char(tab.dateToCheck, 'YYYYMMDD')
    group by tab.dateToCheck
)
ORDER BY d
;
Do wyświetlenia daty pomocna nam będzie funkcja to_char z formatowaniem. Jeżeli nie będziemy mieli załadowanych danych to wynik zapytania będzie wyglądał następująco:
Jeżeli załadujemy dane i w śród tych danych nie będzie danych dla dni: 1-3 i 6 listopada, to tak będzie wyglądał wynik zapytania:


niedziela, 19 kwietnia 2015

Ig Nobel za badanie krów


Zrobiłem prezentację o Ig Noblu.


Nagroda była za wyciągnięcie dwóch wielkich wniosków:
1) Im krowa dłużej leży, tym wzrasta jej prawdopodobieństwo wstania
2) Kiedy już wstanie, to nie wiadomo kiedy znowu położy się




sobota, 18 kwietnia 2015

Jesteśmy producentami danych

Wcześniej pisałem o danych zbieranych przez firmy telekomunikacyjne oraz dyrektywie z 2006 roku, a tym razem filmik dokumentalny o światowych firmach, które zbierają dane.



Co ciekawe ten filmik był wcześniej pod innym linkiem - może youtube (czyli google) zablokowało ten filmik :)


O danych zbieranych przez firmy zaczęło się głośniej mówić, gdy Edward Snowden opublikował informację o 'tajemniczej umowie' między wielkimi korporacjami o rządem USA.

Poniżej filmik przedstawiający problem w przyjemny sposób i "dick-pics program":


Wydaje mi się, o bezpieczeństwie powinno się mówić w kontekście "dick-pics program". Czy rząd i NSA mogą go widzieć i komu będą to udostępniać.

A tutaj jeden z pierwszych wywiadów z Snowdenem:

Jestem po COMPTIA Security+


Zdałem egzamin z bezpieczeństwa. Szczerze powiedziawszy myślałem, że będzie łatwiejszy, między innymi nie wiedziałem o tym, że jest symulacja konfiguracji kerberosa do autoryzacji przez WiFi czy projektowanie bezpiecznej sieci w firmie.






Poniżej zamieszczam ściągawkę. Na pierwszej są najważniejsze terminy używane w bezpieczeństwie, a na drugiej jest lista portów (tak, nr portów są wymagane na egzaminie).










Również posiadam certyfikat z bezpieczeństwa z Microsoft. Co prawda jest to jeden z podstawowych egzaminów (seria egzaminów MTA), ale bardzo sobie go cenię, gdyż pozwolił mi uporządkować wiedzę z bezpieczeństwa. Z tego co pamiętam to nie była wymagana symulacja, tak jak przy CompTIA Sec+.