Pokazywanie postów oznaczonych etykietą DRY. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą DRY. Pokaż wszystkie posty

niedziela, 31 marca 2013

Get-Date w PowerShell

Get-Date jest poleceniem wyświetlającym aktualną date i godzinę. Zamiast Get-Date możesz użyć [DateTime]::Now. Przy okazji muszę się przyznać, że zawsze mam problemy z formatem datetime dla Get-Date.

Co ciekawego można zrobić z Get-Date. Na przykład możesz sprawdzić jakie procesy działają dłużej niż dany okres czasu. Stwórzmy zmienną $1HourFromNow, która będzie trzymała date przed 1 godziną i wybierzmy wszystkie procesy, które jeszcze działają.
PS>$1HourFromNow = (get-date).AddHours(-1)
PS>Get-Process |where {$_.StartTime -ge $1HourFromNow }

Innym ciekawym skryptem jest wybranie wszystkich plików z danego katalogu, które w przeciągu ostatniego dnia był modyfikowane.
PS> $1DayFromNow = [DateTime]::Now.AddDays(-1)
PS>gci -recurse | where {$1DayFromNow -le $_.LastWriteTime }

wtorek, 19 marca 2013

Z Func do IEqualityComparer

Brakuje mi jednej klasy w BCL, która mogła by stworzyć obiekt implementujący IEqualityComparer z wyrażenia lambda . Ten temat był już wałkowany, ale pomimo tego napiszę czego mi brakuje i jakie jest zastosowanie.

Mamy klasę:
public class Value
{
    public int IntValue { get; set; }
    public string StringValue { get; set; }
    public override string ToString()
    {
        return IntValue + "_" + StringValue;
    }
}

Tworzymy comperer (klasa porównująca dwa obiekty), w którym podajemy funkcję zwracającą informację po jakim będziemy porównywać obiekty. Ta funkcja będzie nam potrzebne do tworzenia hash kodu.
public class KeyEqualityComparer<T> : IEqualityComparer<T>
{
    public Func<T, object> _keyToCompar { get; private set; }

    public KeyEqualityComparer(Func<T, object> keyToCompar)
    {
        _keyToCompar = keyToCompar;
    }

    public bool Equals(T x, T y)
    {
        return _keyToCompar(x).Equals(_keyToCompar(y));
    }

    public int GetHashCode(T obj)
    {
        return _keyToCompar(obj).GetHashCode();
    }
}

Aby przedstawić KeyEqualityComparer wystarczy wywołać następujący kod:
var list = new List<Value>
{
    new Value {IntValue = 1, StringValue = "One "},
    new Value {IntValue = 1, StringValue = "Two"}
};

var distinctList1 = list.Distinct(new KeyEqualityComparer<Value>(x =>x.IntValue));

Dodatkowo możemy stworzyć extension method:
public static IEqualityComparer<T> ToEqualityComparer<T>(this  Func<T, object> func)
{
    KeyEqualityComparer<T> equalityComparer = new KeyEqualityComparer<T>(func);
    return equalityComparer;
}

I wtedy możemy operować za pomocą wyrażeniu lambda:
Func<Value, object> keyToCompare = x => x.IntValue;
var distinctList = list.Distinct(keyToCompare.ToEqualityComparer());


piątek, 15 marca 2013

PowerShell w matematyce

PowerShell jest fantastycznym narzędziem do poprawienia swojej produktywności. Może przydać się w prostych zadaniach matematycznych.


Między innymi możesz w szybki sposób sprawdzić co zwraca dane wyrażenie matematyczne:
PS>19 * 17 / 13 + 11 - 7
28.8461538461538
Ale należy uważać, gdyż PS nie kieruje się matematyczną kolejnością wykonywana działań, dlatego poniżysz wynik jest inny niż spodziewany:
PS>2 + 2 * 2
6
PowerShell sprawdza jaka operacja jest na pierwszym miejscu oraz jaki jest typ pierwszej zmiennej. Wywołując wyrażenie 1+"2" mamy inny wynik niż wywołując "1"+2.
PS>1+ "2"
3

PS>"1" + 2 
"12"
Śmieszną możliwością PS jest sposób mnożenia stringa:)
PS>"z" * 5 + "...."
zzzzz....
Jak będziesz potrzebował przeliterować od 1 do 10 to wystarczy zapisać 1..10 (poniżej przykład)
PS>write-host (1..10) -NoNewLine -separator " _ "
1 _ 2 _ 3 _ 4 _ 5 _ 6 _ 7 _ 8 _ 9 _ 10
Taki zapis jest znany z innych języków. Pierwszy raz zobaczyłem taki sposób inicjalizacji w Matlabie. Dodawanie zakresów jest też bardzo intuicyjne. Aby przeiterować od -5 do 5 bez zera to wystarczy zapisać:
PS>write-host ( -5..-1 + 1..5 ) -NoNewLine -separator " _ "
-5 _ -4 _ -3 _ -2 _ -1 _ 1 _ 2 _ 3 _ 4 _ 5
Do tego masz możliwości użycia klasy [math], która posiada najważniejsze funkcje matematyczne:
PS> [math] | Get-Member -Static 
I tak możemy w szybki sposób obliczyć procent składany
PS> $initialInvestment * [math]::pow(1+$interestRate, $times) 
PS> 1000 * [math]::pow(1+0.05, 2)
1102,5
Natomiast, aby obliczyć na jaki procent w skali roku zwróciła się inwestycja wystarczy napisać:
PS>[math]::pow($value/$initialInvestment,1/$times) - 1
PS>[math]::pow(1102/1000,1/2) - 1
0,0497618777608568
Co jest bardzo ciekawe w PS to możliwość operacji na jednostkach pamięci.
PS> 1MB
1048576

PS> 9MB
9437184

PS> 1TB
1099511627776
Możesz przedstawić wielkość jednostki pamięci w innej jednostce, na przykład w postaci megabajtów:
PS>1TB / 1MB
1048576
Czasami taki zapis pomaga przy obliczaniu zajmowanej przestrzeni na dysku.
PS>"{0:n3}"-f ((gwmi win32_logicaldisk -Filter "DeviceID='C:'").freespace/1GB)
Uważam, że PowerShell jest narzędziem matematycznym do bardzo prostych zadań. PS nigdy nie będzie (nigdy nie mów NIGDY) narzędziem dla matematyków, ale w pracy administratora fantastycznie się sprawdza jako proste narzędzie matematyczne.

środa, 6 marca 2013

Zmiana rozmiaru zdjęć za pomocą PowerShell

Czy masz może bardzo dużo zdjęć w jednym katalogu, musisz zmienić rozmiar tych zdjęć i za każdym razem uruchamiasz program graficzny, aby zmienić rozmiar zdjęcia??
Ja akurat tak miałem wiele razy :)
Jeśli coś powtarzasz wielokrotnie to postaraj się zautomatyzować tą czynność. Poniżej jest skrypt, który zmienia rozmiar zdjęcia.
function Resize-Image {
[CmdletBinding()]
Param(
     [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)] 
     [System.io.FileInfo] $filepath,
     [int] $width=100,
     [int] $height=100,
     [string]$prefix="rs_"
)

PROCESS{
        $filePathFullName = $filepath.FullName
        if( Test-Path $filePathFullName)
        {
            $destName = $prefix+$filepath.name
            $destPath = Join-Path -path  $filepath.DirectoryName $destName
            
            import-bitmap $filePathFullName | resize-bitmap -Width $width -Height $height | export-bitmap  -Path $destPath 
            Write-Host "Resizing into $destPath"
                   
        }
        else {
            Write-Host "Path not found."
            }
        }
}
Przykład użycia jest przedstawiony poniżej:
gci -filter *.bmp |  Resize-Image 

Ten skrypt może u ciebie nie działać, bo prawdopodobnie nie masz PowerShell Community Extensions. Skrypt korzysta z poleceń import-bitmap,resize-bitmap i export-bitmap, które znajdują się w PSCX. Aby zainstalować PSCX, to wystarczy pobrać paczkę ze strony internetowej. Rozpakować do jednej z lokalizacji zawartej w zmiennej $Env:PSModulePath. A na końcu wywołać poniższy skrypt:
Import-Module Pscx -arg ~\PSCX\Pscx.UserPreferences.ps1
Get-Module

Mam nadzieję, że skrypt się przyda :)

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" 
}

}

sobota, 29 grudnia 2012

Kopiowania kodu bez svn

Jeżeli masz kod źródłowy, który jest podpięty pod system kontroli wersji (svn) to ciężko jest skopiować tylko sam kod bez plików do kontroli wersji. Za pomocą PowerShell można to osiągnąć znacznie szybciej niż ręcznie wykonując kopiowanie .
function Copy-File-Exclude-Svn {
Param(
    [string] $sourceLocation=".",
    [string] $destinationClocation=".\No_SVN"
)
$files = gci -force  -exclude *.svn-base,".svn",".gitignore"  $sourceLocation  | ? {  $_.PSIsContainer -and $_.Length -lt 230 } | gci -recurse

$files | foreach {
        $fileEnding = $_.FullName.Replace($sourceLocation, "");
        $firstItem = $_.FullName;
        $secondItem = $destinationClocation  + $fileEnding ;
        Write-Host "Copy from $firstItem to $secondItem";
        Copy-Item $firstItem $secondItem;
    }
}


Wywołanie kopiowania plików wygląda następująco:
Copy-File-Exclude-Svn 
-sourceLocation "C:\Source\Project1" 
-destinationClocation ""C:\Source\Project1_without_svn"


środa, 12 grudnia 2012

Jak przyspieszyć kodowanie cz.4 (testy sparametryzowane)

To, co mi się najbardziej podoba w NUnit to 'sparametryzowane testy'. Najlepiej na przykładzie będę mógł pokazać ci piękno tego rozwiązania. Dajmy na to, że mamy klasę z 'skomplikowaną' logiką.
public class Sum
{
 public int Value1 { get; set; }
 public int Value2 { get; set; }

 public int Result
 {
    get { return Value1 + Value2; }
 }
}
Klasa Sum w polu Result zwraca sumę pól Value1 i Value2. Użycie tej klasy wygląda następująco:
var sum =  new Sum { Value1 = value1, Value2 = value2 };
sum.Result;
Stwórzmy do niego test sprawdzający działanie przykładowych liczb, dodawanie elementu neutralnego (zero) oraz dodawanie liczby przeciwnej.
        [Test]
        public void It_should_return_sum_3()
        {
            int value1 = 1;
            int value2 = 2;
            var sum = new Sum { Value1 = value1, Value2 = value2 };
            Assert.AreEqual(3, sum.Result);
        }

        [Test]
        public void It_should_return_0_because_number_of_opposing()
        {
            int value1 = 1;
            int value2 = -1;
            var sum = new Sum { Value1 = value1, Value2 = value2 };
            Assert.AreEqual(0, sum.Result);
        }

        [Test]
        public void It_should_return_0_because_adding_neutral_nuber()
        {
            int value1 = 2;
            int value2 = 0;
            var sum = new Sum { Value1 = value1, Value2 = value2 };
            Assert.AreEqual(2, sum.Result);
        }
Mamy 3 metody, które testują 3 różne przypadki. Od razu widać, że kod się powtarza, więc chcemy zredukować powtarzający się kod w tych testach. Możemy zastosować atrybut TestCase. W tym atrybucie podajemy wartości obiektów z jakimi ma być wywołana metoda. Przykład jest poniżej:
        [TestCase(1, 2, 3)]
        [TestCase(2, 0, 2)]
        [TestCase(1, -1, 0, TestName = "Because number of opposing")]
        public void It_should_return_sum(int value1, int value2, int expected)
        {
            var sum = new Sum { Value1 = value1, Value2 = value2 };
            Assert.AreEqual(expected, sum.Result);
        }
Dokładnie to mi się najbardziej podoba w NUnit. Mamy przetestowane 3 różne przypadki użycia i napisało się tylko jedną metodę. W tej metodzie 2 pierwsze argumenty atrybutu są jako dane wejściowe naszej operacji, a 3 argument jest jako wynik tej operacji. Dla poszczególnych przypadków testowych (TestCase), można jeszcze określić nazwę testu, opis, jaki wyjątek ma być wyrzucony oraz jaka wartość ma być zwracana przez tą metody. Możemy wykorzystać ten ostatni parametr.

        [TestCase(1, 2, Result = 3)]
        [TestCase(1, -1, Result = 0, TestName = "It should return 0")]
        [TestCase(2, 0, Result = 2, TestName = "Adding zero")]
        public int It_should_return_sum2(int value1, int value2)
        {
            var sum = new Sum { Value1 = value1, Value2 = value2 };
            return sum.Result;
        }
Przekształcenie bardzo przypomina 'normalną' (bez aserci) metodę, ale z atrybutami. Mam diaboliczny pomysł. Parametr Result możemy dodać do normalnej metod statycznej. W taki sposób można mieć kod implementacyjny i testy w jednym projekcie - it's crazy.

    public class SumFactory
    {
        [TestCase(1, 2,  Result = 3)]
        [TestCase(1, -1, Result = 0, TestName = "It should return 0")]
        [TestCase(2, 0,  Result = 2, TestName = "Adding zero")]
        public int Sum(int value1, int value2)
        {
            return value1 + value2;
        }
    }
To jest pierwszy przykład jak możemy wykorzystać TestCase - drugi przykład jest dla TestFixture. Napiszmy generyczną klasę, która będzie dodać 2 zmienne:

    public class GenericSum<T>
    {
        public T Value1 { get; set; }
        public T Value2 { get; set; }

        public T SumValue
        {
            get { return (dynamic)Value1 + (dynamic)Value2; }
        }
    }
I chcielibyśmy przetestować dodawanie domyślnych wartości dla zmiennych typu int i double.
    [TestFixture(typeof(int))]
    [TestFixture(typeof(double))]
    public class GenericTestNUnit<T>
    {
        [Test]
        public void It_should_return_default_value()
        {
            var sum = new GenericSum<T> { Value1 = default(T), Value2 = default(T)};
            Assert.AreEqual(default(T), sum.SumValue);
        }
    }
Argument w atrybucie TestFixture odnosi się do typu T. Takie sparametryzowane testy mają zastosowanie w testowaniu klas dziedziczących.

    public abstract class AsBiOperation
    {
        public int Value1 { get; set; }
        public int Value2 { get; set; }
        public abstract int Result { get; }
    }
    public class SumOperation : AsBiOperation
    {
        public override int Result
        {
            get { return Value1 + Value2; }
        }
    }
    public class MultiplicationOperation : AsBiOperation
    {
        public override int Result
        {
            get { return Value1*Value2; }
        }
    }
Do stworzonej klasy abstrakcyjną i napiszemy test dla wszystkich klas dziedziczących po niej. Dodatkowo mamy możliwość wprowadzenia przykładowych wartości.

    [TestFixture(1,2,3,     TypeArgs = new[] { typeof(SumOperation)} )]
    [TestFixture(0, 0,0,    TypeArgs = new[] { typeof(SumOperation) })]
    [TestFixture(-1, 1, 0,  TypeArgs = new[] { typeof(SumOperation) })]

    [TestFixture(1, 0, 0,   TypeArgs = new[] { typeof(MultiplicationOperation) })]
    [TestFixture(1, 5, 5,   TypeArgs = new[] { typeof(MultiplicationOperation) })]
    [TestFixture(5, 5, 25,  TypeArgs = new[] { typeof(MultiplicationOperation) })]    
    public class AsBiOperationTests<T>
        where T:AsBiOperation, new()
    {
        T operation;
        int _value2;
        int _value1;
        int _result;

        public AsBiOperationTests(int value1, int value2, int result)
        {
            _result = result;
            _value1 = value1;
            _value2 = value2;
        }

        [SetUp]
        public void SetUp()
        {
            operation = new T();
        }


        [Test]
        public void It_should_calculate()
        {
            operation.Value1 = _value1;
            operation.Value2 = _value2;
            Assert.AreEqual(_result,operation.Result);
        }
        
    }

Testy sparametryzowane to fantastyczne rozwiązanie, aby mniej kodować, mieć większe pokrycie kodu i móc więcej przetestować przypadków. Bardzo żałuje, że w MSTest jeszcze nie ma takiego featura (chociaż nie bezpośrednio). Jednak mam nadzieję, że w bliskiej przyszłości coś się z tym zmieni. Oprócz NUnit'a sparametryzowane test są w MBUnit.

środa, 23 maja 2012

Starter.bat

Każdego dni rozpoczynam pracę od uruchamiania tych samych programów, przeglądania tych samych stron, czytania tej samej poczty. Aby zautomatyzować proces klikania po wszystkich ikonkach i wpisywania tych samych nazw, stworzyłem mały .bat plik



Poniżej przedstawiam skrypt w pliku Starter.bat:
:: uruchamia pocztę outlook i zaznacza kalendarz
start outlook.exe /select outlook:calendar

:: wchodzi na strony za pomocą domyślnej przeglądarki
start http://arekonsoftware.blogspot.com  
start https://mail.google.com/mail/#inbox 

:: startuje aplikacje (devenv to visual studio)
start devenv  "C:\Users\I\Documents\Visual Studio 11\Projects\MyBigSolution.sln" /projectconfig Debug 

:: otwiera plik
start /D "C:\Users\I\Documents\" ToDo.xls  

Skrypt zawiera przykładowe programy do uruchomienia. Największą zaletą takiego skryptu jest prostota. Za pomocą polecenia start uruchamiamy daną aplikację. Wiem, że ta technika nie jest czymś odkrywczym, ale dla mnie taki mały pliczek pozwala mi na zautomatyzowanie powtarzalnych czynności. Ta technika jest przydatna, jeżeli masz więcej niż 5 aplikacji do uruchomienia.


środa, 7 marca 2012

Jak przyspieszyć kodowanie cz.3 ( AroLibraries )

Od ponad 2 lat rozwijam projekt (AroLibraries) w którym zapisuje wszystkie metody rozszerzalne ( extension methods ).


AroLibraries to biblioteka zawierająca rozwiązania, które są pomocne przy wytworzeniu oprogramowania. Jednym z podstawowych rozwiązań to wykorzystanie rozszerzonych metod. Takie rozwiązanie pozwala na: - ukrycie części implementacji - czytelniejszą składnię - wielokrotne wykorzystanie tego samego kodu
Zamiast za każdym razem pisząc:
    Bitmap image = new Bitmap("picture.bmp");
    Stream memoryStream = new MemoryStream();
    image.Save(memoryStream, ImageFormat.Bmp);
    byte[] bytes = new byte[memoryStream.Length];
    memoryStream.Position = 0;
    memoryStream.Read(bytes, 0, (int)memoryStream.Length);
    
    memoryStream.Close();
    var binary = new Binary(bytes);
   return binary;

Możemy zapisać w formie:
    Bitmap image = new Bitmap("picture.bmp");
    image.ToBinary();
Kod z wykorzystaniem extension methods jest zdecydowanie czytelniejszy. Poniżej przedstawiam parę ciekawszych rozwiązań za pomocą AroLibraries:
9.8F . IsBetween(9, 10); 
//określa czy liczba 9.8 jest w przedziale 9 i 10

DateTime.Now.IsWeekend(); 
// sprawdza czy dzisiaj jest weekend

DateTime.Now.ToSecondsFromEpoch(); 
// data w formacie Epoch

DateTime.Now.EqualsToHour(new DateTime(1986, 03, 29, 12, 0, 0));  
//sprawdza czy teraz jest ta sama godzina

"4AAB7F67-A898-442a-884A-364411D584EC".IsValidGuid();
 //sprawdza czy string jest w formacie GUDI

"mymail@zzzzzzz.com". IsValidEmailAddress(); 
//sprawdza czy string jest w formacie e-maila

string words = "Some words about Library";
words.Reverse(); 
// odwraca string  ("yrarbiL tuoba sdrow emoS")

words.GetRightSideOfString(13); 
// zwraca prawą stronę stinga "about Library"

words.CountWords(); 
//liczy wyrazy

words.ReplaceOnce("a",""); 
//zamienia tylko pierwsze wystąpienie w tekście

words.ToMd5(); 
//zwraca skrót MD5 z tekstu


new Exception("0", new Exception("1", new Exception("2", new Exception("3"))))
. GetMostInner(); 
//zwraca najbardziej wewnętrzny wyjątek  (Exception nr "3")

var numbers = 1.IterateTo(10);
//iteruje od 1 do 9 

numbers.IndexOf(6); 
//zwraca index liczby 6
numbers.Repeat(2, true); 
//{1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9}

numbers.Repeat(2, false); 
// {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9}

numbers.Shuffle();
 //miesza elementy

numbers.Swap(1,2); 
//zamienia miejscami element nr 1 z elementem nr 2

numbers.ToString(";");
 // zwraca string elementów oddzielonymi średnikiem ( "1; 2; 3; 4; 5; 6; 7; 8; 9")


9.In(numbers); 
//sprawdza czy liczba 9 jest w danej kolekcji

9.ToMonthName("Styczeń");
 //zwraca nazwę miesiąca

'a'.IsVowel(); 
//sprawdza czy jest samogłoską

var persons = new[]
{
new Person {
           FirstName = "Arek", 
           LastName = "XYZ",
           Age = 26},
};
persons.ToDataTable();    
// zmienia kolekcje w tabelę

persons.OrderBy(x => x.Age); 
//sortuje po danym polu


Bitmap image = new Bitmap("picture.bmp");
image.ToBinary();  
//konwersja do typu Binary

image.SaveJpeg("pic.jpg"); 
//zapisuje do formatu jpeg

image.Fill(Color.Black);
 //zwraca obrazek cały pomalowany na czarno

image.IsPixelInImage(-1, 100); 
// sprawdza czy można pobrać pixel o podanych współrzędnych  

image.GetPixels(); 
// zwraca wszystkie kolory na obrazku

image.ToByte(); 
//konwersja do byte[]

image.ToByte().OpenBytesAsFile(".bmp"); 
// otwiera plik w zewnętrznym edytorze


TextBox tb= new TextBox();
tb.WriteLine("Text"); 
//pisze po textboxie

DirectoryInfo di= new DirectoryInfo("c:");
di.GetDirectorySize(); 
//zwraca wielkość katalogu

Stream stream= GetStream();
stream.SaveToFile("Text.txt"); 
//zapisuje stream do pliku

Stream textStream= new MemoryStream();
stream.CopyStreamTo(textStream); 
//kopiuje do nowego źródła
           

XmlNode node = GetXmlNode();
node.ToXElement(); 
//zwraca XElement

Projekt jeszcze nie jest w pełni stworzony. W przyszłości będę chciał stworzyć do niego testy jednostkowe. Liczne extension methods można znaleźć pod tym linkiem, a kod źródłowy projektu można pobrać z portalu codeplex.

poniedziałek, 27 lutego 2012

Jak przyspieszyć kodowanie cz.2



Już wcześniej pisałem o jednym ze sposobów przyspieszenia pisana kodu, a tym razem powiem więcej o Zen-Coding. Jest to silnik umożliwiający automatyczne generowanie kodu używanego w językach bazujących na SGML. Zapisując nazwy i specjalne symbole można w prosty sposób wygenerować wiele linijek kodu. Możliwości Zen-Codingu przedstawia poniższy filmik:



Jest dodatek do Visual Studio, a opis można znaleźć pod tym adresem.
Resharpera też można wzbogacić poprzez plugin. Lista innych programów jest przedstawiona na stronie Wikipedii

sobota, 3 września 2011

Jak przyspieszyć kodowanie cz.1

Pisząc aplikacje wielokrotnie powtarzam te same zwroty, nazwy zmiennych oraz instrukcje. Jednym z podstawowych narzędzi jakie pomagają mi w pisaniu aplikacji jest CodeSnippet.



Co to takiego?
Jest to mechanizm, który sam uzupełnia kod za Ciebie.
NP:
Dla każdego eventa Page_Load masz do napisania metodę, która będzie działać tylko w stanie debagowania. Wybierając z listy odpowiednie słowo, Visual Studio utworzy potrzebny kod.


Jedynie co Ci pozostanie to zmiana nazwy metody.


Możesz sam tworzyć CodeSnippety, aby kod był dopasowany do Twoich potrzeb.


Poniżej filmik przedstawia MyCodeSnippets w akcji:

sobota, 16 lipca 2011

Oldies na PowerShellu

Kiedyś pisałem o programie Oldies, który usuwa stare pliki. Przez przypadek znalazłem odpowiednik tej funkcjonalności zaimplementowanej za pomocą PowerShella. Więcej informacji pod tym linkiem:
PowerShell script to delete files older than certain days - Ying Li at myITforum.com

piątek, 17 czerwca 2011

Oldies

Wcześniej pisałem o moim pulpicie.Ale co robię jak mam za dużo starych plików w archiwum. No cóż... skoro nie są już potrzebne powinno się je usunąć. A skąd wiem, że nie będę ich używał. Z prostej zależności, – jeżeli przez pół roku nie używałem tych plików to prawdopodobnie w przyszłości też nie będę używał. Od tej reguły są wyjątki takie jak zdjęcia, muzyka czy specjalne dokumenty. Nie wiem ile to razy w folderze trzymało się pliku i zawsze się miało się nadzieję, że jeszcze się przydadzą.


Specjalnie do takiego dylematu napisałem małą aplikacje konsolową, która usuwa stare pliki. Aplikacje nazywa się Oldies i można pobrać z codeplex.. Wystarczy wpisać jak stare pliki ma znaleźć (np: pliki, które maja więcej niż 20 dni i 1 miesiąc) oraz jaką operację należy wykonać na nich. Możemy usunąć, wyświetlić w kolejności od najstarszego pliku lub przenieś do folderu Oldies. Aplikacja jest na szybko napisana i jest bardzo prosta w obsłudze.



Jeżeli tak jak ja masz folder o nazwie Download lub staff, w którym znajdują się przeróżne stare rzeczy, o których nie wiesz nawet, po co były Ci potrzebne, to Oldies pozwoli ci na 'oczyszczenie' problemu. Napisałem Oldies.exe, bo pozwoliło mi to mieć kontrole nad niepotrzebnymi rzeczami.

Oldies

czwartek, 23 września 2010

AroLibraries

Pisząc kod bardzo często powtarzam tą samą sentencje kodu.
Wraz w c#3.0 pojawiły się extension methods, które ukrywają kod.
Standardowy przykład to zastosowanie konwersji z typu string na int.

string valueString="1";
int valueInt;
int.TryParse(valueString, out valueInt); // valueInt == 1


to zapisujemy w postaci:
string valueString="1";
valueString.ToInt(); // == 1

Kiedy nie podoba mi się zapis:
if(boolVariable == flase )

((details["Node"] as TreeNode).Parent as TreeNodeExt).Name

Przerabiam na bardziej czytelny:
if(boolVariable.IsFalse())

details["Node"] .As<TreeNode>()
.Parent .As<TreeNodeExt>() .Name

Ale to kwestia gustu :)

Extension methods mają duże zastosowanie w LINQ to Object
NP:
Aby mieć informacje o wszystkich plikach na dysku o podanym rozszerzeniu należy napisać troszkę kodu:

static void Main(string[] args)
{
string path = @"D:\";
DirectoryInfo dr = new DirectoryInfo(path);
FileCollection = new List<FileInfo>();
FillFilesInDirectories(dr);
}

private static List<FileInfo> FileCollection = null;
private static void FillFilesInDirectories(DirectoryInfo dir)
{
var dirs = dir.GetDirectories();
foreach (var vDir in dirs)
{
FileCollection.AddRange(vDir.GetFiles());
FillFilesInDirectories(vDir);
}
}



Lub za pomocą LINQ:

static void Main(string[] args)
{
string path = @"D:\";
var FileCollection = new DirectoryInfo(path)
.GetDirectories()
.SelectRecursive(x => x.GetDirectories()) //Rekurencja
.SelectMany(x => x.GetFiles()); //Pobieramy Pliki
}


Od razu widać, że kod w LINQu jest bardziej czytelny.

Projekt rozszerzający możliwości Extension Methods można pobrać ze strony AroLibraries