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 :)
piątek, 18 grudnia 2015
ś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:
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, 15 grudnia 2015
Kowboj danych w R
Ostatnio zrobiłem sobie test "jakiego typu Data Scientist'em jestem". Wyszło mi, że jestem kowbojem danych :)
Link do testu jest tutaj.
Link do testu jest tutaj.
środa, 21 października 2015
Historia informatyki
W tygodniu obejrzałem super prezentację dla młodych informatyków. Bardzo polecam do obejrzenia. Cenię sobie tą prezentację z powodu przedstawienia historii informatyki.
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.
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:
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.0Moż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:
Przykłady jak będzie wyglądał LongDate, LongTime i ShortDate, ShortTime można sprawdzić pod tym linkiem
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 NameTeraz 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:
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:
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:
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.
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:
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:
Przykład działania funkcji na komputerze lokalnym wygląda tak:
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 :)
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ę:
A później wywołujesz komendę do ubijania procesu:
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.
Przykład z SQLem wygląda tak:
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 :)
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
Kiedy będziemy chcieli dodać skorelowane zmienne to wynik symulacji jest poniżej:
Poniżej zamieszkam ściągi do Rki:
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:
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:
Dajmy na to, że mamy tabele A z liczbami parzystymi:
SELECT LEVEL * 2 AS n FROM DUAL CONNECT BY LEVEL <= 100oraz tabele B z liczbami podzielnymi przez 3:
SELECT LEVEL * 3 AS n FROM DUAL CONNECT BY LEVEL <= 100Teraz 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' :)
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:
Takie proste, a tak upraszcza życie :)
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.
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:
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:
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+.
Subskrybuj:
Posty (Atom)