sobota, 16 lutego 2013

Mam dość SVN

Mam dość SVN

Usuwam go i już.
gci c:\ -include .svn -Recurse -Force | 
   Remove-Item -Recurse -Force

poniedziałek, 28 stycznia 2013

Algorytmy w finansach

Były już matematyczny Ted o wyszukiwarce wolframalpha, to teraz filmik TED z branży finansowej. Filmik przedstawia jak w dzisiejszych czasach w "prosty" sposób analizuje się całą giełdę oraz dlaczego firmy chcą być blisko giełdy.











sobota, 19 stycznia 2013

Dzielenie listy na części (chunk)

Tyle razy już pisałem metodę dzielącą listę (IEnumerable) na części, że postanowiłem zamieścić kod od razu na blogu. Przypuszczam, że jeszcze niejeden raz będę musiał napisać ten sam kod.
public const int MaxHandles =64;
public static IEnumerable<IEnumerable<T>> DivideIntoChunks<T>(IEnumerable<T> iEnumerable )
{
  return iEnumerable
  .Select((x, i) => new { Index = i, Value = x })
  .GroupBy(x => x.Index / MaxHandles)
  .Select(x1 => x1.Select(x2 => x2.Value))
  ;
}

To jeszcze zamieszczę testy:
[TestCase(1, 1, 1)]
[TestCase(64, 1, 64)]
[TestCase(65, 2, 64)]
[TestCase(128, 2, 64)]
[TestCase(129, 3, 64)]
[TestCase(0, 0, 0)]
public void It_should_divide_into_chunks(int listNumber, int numberOfChunks, int firstChunkCount)
{
 var list = Enumerable.Repeat(1, listNumber);
 var listOfChunks = Generator.DivideIntoChunks(list);
 Assert.AreEqual(numberOfChuncks, listOfChunks.Count());
 Assert.AreEqual(firstChunkCount, listOfChunks.First().Count());
 Assert.AreEqual(listNumber, listOfChunks.SelectMany(x => x).Count());
}




niedziela, 13 stycznia 2013

Czyszczenie kolejek MSMQ w PowerShell

Parę razy musiałem wyczyścić kolejki w MSQM. Standardowe ręcznie usuwanie i tworzenie kolejkę jest bardzo pracochłonne. Po paru takich powtórzonych czynnościach, postanowiłem napisać skrypt w PS. Skrypt wykorzystuje bibliotekę System.Messaging.


[Reflection.Assembly]::LoadWithPartialName("System.Messaging")

$michineName = $env:COMPUTERNAME

$queueNames =  [System.Messaging.MessageQueue]::GetPrivateQueuesByMachine($michineName) | 
% {".\" + $_.QueueName} 

$queueNames  = $queueNames  |  
?{ $_ -like "*my.special*"}

$queueNames | 
foreach {
 [System.Messaging.MessageQueue]::Delete($_);
 [System.Messaging.MessageQueue]::Create($_, [bool]1) ;
 }

Krótki opis co robi skrypt:
1. Ładuje referencje do biblioteki Messaging
2. Pobiera nazwę komputera
3. Pobiera listę prywatnych kolejek i zwraca ich nazwy
4. Wybiera kolejki mające w nazwie "my.special"
5. Iteruje po wszystkich znalezionych kolejkach
6. Usuwa kolejkę
7. Tworzy transakcyjną kolejkę

Próbowałem zmienić proces usuwania i dodawania tej samej kolejki na pojedynczy proces czyszczenia kolejki, ale natrafiałem na pewne ograniczenia :/ Nie miałem wystarczającej ilości czasu, aby zamienić ten skrypt. Gdybyś znal inne sposoby na czyszczenie kolejek MSMQ to napisz w komentarzu.

sobota, 5 stycznia 2013

Porównanie 2 repozytoriów

Czy natrafiłeś na taka sytuacje, ze musiałeś porównać 2 repozytoria??
Mi parę razy się tak zdarzyło, a dokładnie musiałem porównać 2 wersje tego samego projektu. Przygotowałem skrypt, który pobiera z pierwszego repozytorium wszystkie pliki .cs, .sln i .user i porównuje je z plikiem w drugim repozytorium. Jako aplikacja do porównania plików wybrałem KDiff3. Poniżej przedstawiam skrypt w PowerShell:
function Compare-Repo {

Param(
     
     [string] $firstlocation = "C:\sourcecodes\ProjectX_ver1",
     [string] $secondLocation = "C:\sourcecodes\ProjectX_ver2",
     [int] $takeFileNumber =10
)


$fileExtension = @(".cs", ".sln", ".user")
$appToCompare = "C:\Programs\KDiff3\kdiff3.exe" 
#



$itemsFirstlocation  = gci -recurse  -Path $firstlocation  |
 where { ! $_.PSIsContainer -and $fileExtension -contains $_.Extension.ToLower()}

$itemsFirstlocation = $itemsFirstlocation | 
select -first $takeFileNumber

$itemsFirstlocation | foreach {

        $fileEnding = $_.FullName.Replace($firstlocation,"");
        $firstItem = $_.FullName;

        $secondItem = $secondLocation  + $fileEnding ;
        if(Test-Path($secondItem))
        {
            Write-Host "Comparing file $firstItem with $secondItem";

            & $appToCompare $firstItem $secondItem 
            #Run compare app
        }
    }
}

Więcej o KDiff3 można poczytać w obszernej dokumentacji.

niedziela, 30 grudnia 2012

Konwersja z bmp na jpeg w PowerShell

Kiedy masz dużo plików graficznych w bmp, warto jest zastanowić się nad zmiana formatu na jpeg. Pliki mają mniejszy rozmiar, a nie tracą tak bardzo na kompresji. Napisałem skrypt do konwertowania plików z jednego formatu na drugi. Wystarczy w kodzie wyselekcjonować pliki, które są bmp i w potoku wpisać nazwę funkcji:
gci -filter *.bmp | Convert-Jpeg

Poniżej cała implementacja funkcji zamieniająca bmp na jpeg:
[Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null

function Convert-Jpeg {
[CmdletBinding()]
Param(
     [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)] 
     [System.io.FileInfo] $filepath
)

BEGIN {
     Write-Host "Converting Bitmaps to Jpegs" 
     $fileConvertedCounter= 0
}

PROCESS{
        $filePathFullName = $filepath.FullName
        if( Test-Path $filePathFullName)
        {
            $image  = [System.Drawing.Image]::FromFile($filepath.FullName)
            $bitmap = new-object System.Drawing.Bitmap($image)
            $newFileName = ($filePathFullName -replace '([^.]).bmp','$1') + ".jpg"
            $bitmap.Save($newFileName, ([system.drawing.imaging.imageformat]::jpeg))
            $fileConvertedCounter++
            Write-Host "Converted $filePathFullName into $newFileName"
            $bitmap.Dispose()
            $image.Dispose()        
        }else {
            Write-Host "Path not found."
        }
}

END{
    Write-Host "It was $fileConvertedCounter converted files" 
}

}

Ugly strings

Mam super pomysł jak ograniczyć pisanie kodu z duża ilością rozrzuconych tekstów. Wystarczy ustawić kolor czcionki w tekst edytorze na string tak, aby od razu tekst rzucał się w oczy :)


Efekt takiej zmiany wygląda okropnie :)



Taka czcionka wymusza na użytkowniku tworzenie regionów ze stałymi stringami w jednym miejscu albo wydzielenie tego tekstu do osobnego zasobu (klasy albo resourca).