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ć.

23/09/2013

Moje spojrzenie na DevDay 2013

Home

Przez długi czas stałym punktem w moim kalendarzu była konferencja MTS, ale w pewnym momencie zaczęła mnie nóżyć. Zrobiłem sobie przerwę i rok temu spróbowałem jeszcze raz, ale podobało mi się jeszcze mniej niż wcześniej. Wtedy usłyszałem o organizowanej w Krakowie konferencji DevDay. W sieci zebrała ona doskonałe opinie, więc w tym roku postanowiłem ją odwiedzić i o tym będzie ten post.

Kilka słów wstępu

DevDay organizowane są przez firmę ABB, ale poza logiem na identyfikatorach oraz niewielkich plakatów rozstawionych tu i tam firma w ogóle nie narzuca się uczestnikom. Generalnie charakter konferencji jest mało komercyjny i to wielki plus. Mnie co prawda odrobinę drażniło, że co chwilę ktoś robił zdjęcia np.: podczas rozmowy z prelegentami ale coś za coś, ABB też coś chciało mieć za wyłożenie pieniędzy :)

Organizacyjnie nie mam żadnych zarzutów, poza kolejką do obiadu, ale to drobnostka. Zresztą nie byłem jeszcze na konferencji, na której udało się to naprawdę dobrze zorganizować. Ekipa organizacyjna spisała się w 100%.

Z organizacyjnych rzeczy bardzo spodobało mi się kontrolowanie czasu, czyli pokazywanie prelegentom kartki z informacją ile jeszcze mogą mówić. Fajny był też system oceny sesji. Przy wychodzeniu z sali do dyspozycji miało się karteczkę czerwoną - nie podobało mi się, żółtą - było średnio i zieloną - podobało mi się. System może mało precyzyjny ale prosty, szybki i nie wymagający wypełniania żadnych ankiet.

Mój przewodnik po sesjach

Sesja początkowo

Pierwsza sesja miała być podobno krótka, ciekawa i motywująca. Prelegent porównał programowanie do biegania. Moim zdaniem wyszło niestety średnio (szczególnie na tle innych prezentacji) było krótko, ale niezbyt ciekawie i niezbyt motywująco.

Ocena: Na pograniczu żółtej i czerwonej karteczki.

"Back to basics: the mess we've made of our fundamental data types"
Jon Skeet

Przed prezentacją nie wiedziałem czego się po niej spodziewać. O prelegencie wiedziałem, że to łebski koleś, legenda StackOverflow, ale nie kojarzyłem go jako prelegenta. Temat też trochę budził moje podejrzenia, bo co można powiedzieć o podstawowych typach danych.

Jak się okazuje można i to jeszcze w jaki sposób. Prezentacja była poprowadzona we wspaniały sposób, z humorem, do tego była ciekawa i można było z niej dużo wynieść. Spróbujcie na przykład odwrócić ciąg znaków zapisany w zmiennej s na poniższym przykładzie:

var s = "Les Misérables".Normalize(NormalizationForm.FormD);

Ocena: Bardzo zielona karteczka.

"Scaling agile"
Dariusz Dziuk

Jedyny Polak w gronie prelegentów. Mówił o organizacji pracy w szwedzkiej firmie Spofity, która udostępnia utwory muzyczne prawie za darmo. W tej chwili zatrudnia kilkuset pracowników technicznych. Podzieleni są na kilkuosobowe zespoły, które są trochę takimi małymi firma tj.: same wybierają sobie narzędzia, sposób pracy, są wielo-platformowe, czyli jeśli pracują nad jakąś nową funkcjonalnością to mają ją dostarczyć na wszystkie platformy np.: Android'a i iOS. A drugim nadrzędnym celem Spotify oprócz zarabiania pieniędzy jest uszczęśliwiania pracowników :)

Prezentacja została poprowadzona bardzo sprawnie, ale bez porywów, momentami mi się dłużyła. Nietypowe (dla mnie na plus) było wprowadzenie podczas, którego Dariusz opowiedział kilka słów o historii Jazz'u.

Ocena: Żółta karteczka.

"SPA Made Breezy"
Tiberiu Covaci

Najbardziej techniczna sesja na jakiej byłem dotyczą tworzenia aplikacja SPA (ang. Single Page Application) przy pomocy Breeze.js oraz MVC. Trochę nie wyszedł pokaz możliwości biblioteki na żywo, co jednak nie zraziło prelegenta (tutaj widać obycie i doświadczenie).

Mi sesja nie przypadła do gustu, może dlatego, że na co dzień nie programuję aplikacji WWW, a może dlatego, że ostatnimi czasy prezentację, w których przewija się dużo kodu pisanego na żywo do mnie nie trafiają.

Ocena: Na pograniczu żółtej i czerwonej karteczki.

"Building Startups and Minimum Viable Products"
Ben Hall

Lekka, bardzo fajnie poprowadzona sesja dotycząca startup'ów, a prelegent wiedział o czym mówił, bo ma dwa na swoim koncie, a teraz pracuje dla firmy, która wyszykuje obiecujące firmy i w nie inwestuje. Ben zwrócił uwagę, że startując ze swoim pomysłem przede wszystkim trzeba mieć pasję, a najlepiej bardzo dużo pasji. Jego zdaniem na początek  należy unikać pisania kodu, jak najwięcej wykorzystywać istniejące rozwiązania, skupić się na dostarczeniu wartości, a nie na jakości kodu czy pisaniu testów jednostkowych. Dobry wynik dla firmy inwestującej w startup'y to podobno 30%, czyli jeśli 3 inwestycje na 10 zaczną na siebie zarabiać to jest dobrze.

Ocena: Zielona karteczka.

"Full-text search with Lucene and neat things you can do with it"
Itamar Syn-Hershko

Prezentacja była nie tyle o Lucene, co o rozproszonym serwerze przeszukiwania pełnotekstowego opartym o Lucene. Lekka techniczna sesja, z wprowadzeniem dla początkujących. Słyszałem głosy, że temat prezentacji sugerował co innego i było za dużo o rzeczach podstawowych, ale mi sesja się podobała, bo odświeżyłem sobie wiedzę.

Ocena: Zielona karteczka.

"The Architecture of StackOverflow"
Marco Cecconi

Portalu StackOverflow chyba nikomu nie należy przedstawiać. Na tym samym silniku stoi ponad 100 innych serwisów typu Q&A, a sam portal StackOverflow jest w czołówce najczęściej odwiedzanych stron na świecie. Wbrew pozorom do obsługi tego wszystkiego wystarczy 11 serwerów WWW, 4 serwery bazodanowe i dwa serwery cache'ujące używające technologii Redist. Każdy serwer bazodanowy ma ponad 300GB pamięci, tak aby pomieściła się cała baza danych.

Kod aplikacji podzielony jest raptem na kilka projektów (całość to ok. 100 tyś linii kodu). Testów jednostkowych jest bardzo mało, bo użytkowników jest tak dużo, że wszelkie błędy wykrywane są bardzo szybko. Ewentualne poprawki można dostarczyć w kilka minut. Co z tym związane, w wielu miejscach użyto klas statycznych, bo i tak nie będą mock'owane, a przede wszystkim ma być prosto. Zespół StackOverflow nie zastanawia się też na przejściem do chmury, czy użyciem bazy NoSQL, ponieważ wszystko działa dobrze tak jak jest. Lubię takie zdrowie podejście do tematu.

Prezenter skończył mówić z 15-20 minut przed czasem, ale pozostałą część sesji zajęły pytania z publiczności.

Ocena: Na pograniczu żółtej i zielonej karteczki ale bliżej zielonej.

"The software journeyman's guide to being homeless and jobless."
Rob Ashton

Kolejna genialna sesja. Rob pokazał niesamowity warsztat, a mówił o tym jak rok temu zrezygnował z pracy w korporacji bo miał dosyć, a pieniędzy i tak nie miał na co wydawać. Od tego czasu podróżuje po świecie z jedną walizką i pracuje tam gdzie dostanie lokum oraz bilet lotniczy. Teraz jest w Belgii i, jak sam mówi, to strasznie nudne miejsce, w Izraelu pracował nad RavenDB, w międzyczasie zaliczył wypadek samochodowy, kodował w Closure w czasie koncertu Eurowizji itd. A tak w ogóle trochę mu się śpieszyło bo chciał napić się piwa :)

Mi bardzo spodobało się też podsumowanie, w którym Rob powiedział coś w stylu (bardzo luźną parafraza) "No tak, ale ja nie mam żony, dzieci czy innych zobowiązań, a więc mi jest łatwiej. Wy też jednak możecie coś zrobić, zmienić pracę na ciekawszą, blogować, występować na konferencjach, uczyć się nowych rzeczy, dzielić się wiedzą..."

Ocena: Bardzo zielona karteczka.

Sesja końcowa

Sesja końcowa to dużo powiedziane, bo trwała małe kilkanaście minut. Nie zabrakło zasłużonych podziękowań dla prelegentów oraz dla ekipy obsługującej konferencję. Była też fala, poważnie, taka jaką widuje się na meczach piłkarskich oraz pamiątkowe zdjęcie :)

Ocena: Bardzo zielona karteczka

Podsumowanie

W dwóch słowach Było super! i już szykuję się na przyszły rok. Przyznam, że od strony technicznej dużo się nie nauczyłem, ale zdobyłem dużo miękkiej wiedzy i zastrzyk pozytywnej energii.

18/09/2013

Indeksy, LIKE oraz =

Home

Prosta zagadka. Rozważmy następującą tabelą z dwoma kolumnami:
CREATE TABLE Test
(
   ID Int IDENTITY(1,1) PRIMARY KEY,
   Name CHAR(10)
)

CREATE INDEX IX_TEST_NAME ON dbo.Test (Name)
Teraz na wejściu dostajemy pewien ciąg znaków i przechowujemy go w zmiennej:
DECLARE @Variable CHAR(10);
SET @Variable = '1234567890';
Chcemy znaleźć wszystkie te rekordy, dla których N pierwszych znaków w kolumnie Name jest takie samo jak N pierwszych znaków w zadanym ciągu. Można to zrobić tak (N=3):
SELECT * FROM dbo.Test WHERE  LEFT(Name, 3) = LEFT(@Variable, 3)
Albo tak:
SELECT * FROM dbo.Test WHERE Name LIKE LEFT(@Variable, 3)+'%'
Oba zapytania dadzą ten sam wynik ale jedno z nich będzie zdecydowanie szybsze (dla dużej ilości danych) niż drugie. Które?

W tym przypadku użycie LIKE okazuje się lepszym wyborem. Dlaczego? W pierwszym zapytaniu zostanie użyty INDEX SCAN (czyli de facto odczytane zostaną wszystkie wiersze z tabeli), a w drugim  INDEX SEEK. Dzieje się tak gdyż w pierwszym zapytaniu użyto funkcji LEFT (może to być dowolna inna funkcja) na kolumnie, na której nałożony jest indeks.

Do problemu można też podejść w inny sposób czyli stworzyć indeks na kolumnie wyliczanej tj.:
ALTER TABLE dbo.Test ADD NAME2 AS LEFT(Name, 3)
CREATE INDEX IX_TEST_NAME2 ON dbo.Test(Name2, Name)
W takiej sytuacji pierwsze z pokazanych zapytań (te z operatorem =) również użyje operacji INDEX SEEK.