07/11/2013

Metody rozszerzające w .NET 2.0

Home

.NET 2.0 to stara rzecz, ale wciąż z różnych powodów używana, na przykład dlatego, że klient nie chce zainstalować nowej wersji platformy na maszynach wszystkich użytkowników systemu. A co, jeśli pomimo tego wymarzy się nam użycie na przykład LINQ to Objects? Metody takie jak Select, Take itd. łatwo zaimplementować samemu, ale bez extensions methods ich użycie nie będzie takie przyjemne.

Zastanówmy się, co z tym robić. Metody rozszerzające obsługiwane są począwszy od .NET w wersji 3.5. Wiemy też, że mając kompilator dla .NET w wersji X możemy skompilować projekt dla .NET w wersji Y jeśli Y <= X. Do tego dodajmy, że extensions methods są mechanizmem czasu kompilacji i jako takie są niezależne od wersji platformy. Idąc tym tokiem rozumowania powinno być możliwe ich wykorzystanie w projektach używających .NET 2.0 o ile do kompilacji użyjemy nowszego kompilatora. Szybki eksperyment, czyli próba zdefiniowania metody rozszerzającej dla projektu używającego .NET 2.0 pokaże jednak, że coś jest nie tak i otrzymamy taki błąd kompilacji:

Cannot define a new extension method because the compiler required type 'System.Runtime.CompilerServices.ExtensionAttribute' cannot be found. Are you missing a reference?

Nie wszystko jednak stracone. Okazuje się, że wystarczy zdefiniować w projekcie następujący atrybut aby kompilacja zakończyła się powodzeniem:
namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)]
    public sealed class ExtensionAttribute : Attribute { }
}
Trochę to brzydkie, ale możemy cieszyć się metodami rozszerzającymi w projektach korzystających ze starej wersji platformy. Atrybut ten jest potrzebny, ponieważ kompilator wykorzystuje go do oznaczenia metod tak, aby było wiadomo, które metody z różnych bibliotek są metodami rozszerzającymi.

Sztuczkę tą wykorzystują projekty takie jak LINQ for .NET 2.0 lub LinqBridge

01/11/2013

Nowy laptop + SharpKeys

Home

Od kilku tygodni jestem posiadaczem laptopa MSI GE60 2OE-043XPL-128SSD. Czas pokaże więcej, ale w tej chwili poza kilkoma mniejszymi rzeczami jestem zadowolony z dokonanego wyboru. Jednym z takich niedociągnięć jest umieszczenie przycisku "\" pomiędzy spacją, a przyciskiem "Alt". Powodowało to, że notorycznie wciskałem ten pierwszy, kiedy chciałem wpisać polskie litery diakrytyczne. Z pomocą przyszedł mi program SharpKeys. Kilka chwil i udało mi się zmapować kłopotliwy przycisk "\" (który znajduje się również w innym miejscu klawiatury) na "Alt". SharpKeys to program, którego używa się raz i potem się do niego wraca, ale z pewnością potrafi poprawić komfort pracy.

Czy recenzja laptopa MSI GE60 2OE-043XPL-128SSD będzie dla Was interesująca?

16/10/2013

MiKTeX i menadżer pakietów

Home

Częścią MiKTeX'a (implementacja TeX/LaTeX dla Windows'a) jest Menadżer pakietów, który pozwala znaleźć i zainstalować potrzebne nam pakiety, a są ich setki. Co więcej menadżer ten odpala się automatycznie w czasie komplikacji, w momencie kiedy kompilator znajdzie brakujący pakiety, a więc nawet nie musimy dokładnie wiedzieć czego nam brakuje.

Domyślne ustawienia tego narzędzia mogą jednak sprawić kłopoty. Otóż, jeśli tego nie zmienimy, wybrane pakiety będą ściągane z losowo wybranej lokalizacji. Co w tym złego? Otóż, ustawienie to powoduje, że Menadżer pakietów ordynarnie przestaje działać bez żadnego komunikatu o błędzie. Na systemie Windows 7 zachowanie to zaobserwowałem tylko przy automatycznym ściąganiu pakietów. W Windows 8.1 Menadżer pakietów w ogóle nie chciał mi działać.

Nie wiem od czego to dokładnie zależy, ale rozwiązanie jest w każdym razie proste, wystarczy wskazać konkretną lokalizację zamiast losowej. W Menu Start wybieramy MiKTeX X.Y\Maintenance\Settings, następnie zakładkę Packages, klikamy przycisk Change, zaznaczamy opcję Packages should be installed from the Internet i na koniec wybieramy konkretną lokalizację i zatwierdzamy.

28/09/2013

Szybkie tworzenie tabel w TeX/LaTeX

Home

TeX/LaTeX jest potężnym środowiskiem pracy ale ma to swoją cenę. Między innymi niektóre rzeczy robi się w dużo trudniejszy sposób niż w programach takich jak Word czy Excel. Dobrym przykładem jest tworzenie tabel. W TeX/LaTeX trzeba się napracować i wpisać odpowiednią sekwencję poleceń formatujących. Przy małych tabelach można jeszcze zagryźć zęby, ale przy dużych wielokolumnowych zbiorach danych szkoda nerwów. Ja akurat potrzebował przenieść kilka tabel z dokumentu Word do swojego artykułu.

Najpierw skopiowałem, więc tabele z Word'a do Excel'a, a potem skorzystałem z dodatku do Excel'a o nazwie Excel2LaTeX, który dodaje w zakładce Dodatki dwa polecenia: Convert table to LaTex oraz Convert all stored tables to LaTex. Wystarczy zaznaczyć interesujący nas zestaw komórek, wybrać polecenie, a potem wkleić wygenerowaną tabelę do dokumentu *.tex. Ja jeszcze dodatkowo musiałem zaimportować brakujący pakiet tj.: \usepackage{booktabs}.

Polecam też ten artykuł, w którym autor zebrał kilka sposób te wyeksportowanie tabel z programu Excel to TeX/LaTeX.

Unable to locate trace definition file...

Home

Jakiś czas temu w celu wykrycia przyczyny zakleszczenia (ang. deadlock) musiałem przeanalizować plik Trace File nagrany przez SQL Server Profile. Niestety przy próbie jego otworzenia pojawiły się problemy ponieważ plik został nagrany przy pomocy starszej wersji oprogramowania (10.50.0) niż moja (10.50.2550):



Nie miałem dostępu do maszyny, na której został nagrany log, a więc nie mogłem postąpić zgodnie z radą zawartą w komunikacie. Nie chciałem też tracić czasu i szukać kogoś kto wie gdzie dokładnie ten log został nagrany. Utworzyłem więc kopię pliku Microsoft SQL Server TraceDefinition 10.50.2550.xml i nazwałem ją Microsoft SQL Server TraceDefinition 10.50.0.xml.

Po tej zmianie kolejna próba otwarcia pliku z logiem powiodła się. Nie wiem jakie są różnice pomiędzy wersją 10.50.2550, a 10.50.0 ale ta prosta sztuczka wystarczyła aby odnaleźć przyczynę błędu i ją usunąć. Możliwe, że przy większym rozjechaniu się wersji to podejście nie zadziała ale zawsze warto spróbować.