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.