wtorek, 25 stycznia 2011

This client is too old to work with working copy...

Trochę ponad rok temu podczas pracy z NetBeansem i SVNem, często witał mnie taki oto komunikat:

This client is too old to work with working copy ; please get a newer Subversion client

Ostatnio podobnym komunikatem uraczył mnie Eclipse...

Sprawę już omawiałem na blogu (http://wojtek-m.blogspot.com/2009/12/netbeans-i-subversion_20.html), ale wtedy nie poznałem przyczyny takiego zachowania. Teraz starczyło mi na to cierpliwości...

niedziela, 23 stycznia 2011

Jak sprawdzić wersję Oracle

Często, kiedy mamy środowisko testowe składające się z wielu baz danych Oracle (których wersje na dodatek lubią się często zmieniać), to możemy natrafić na problem - z jaką wersją Oracle jesteśmy aktualnie połączeni?

Oczywiście SQL*Plus poda nam wersję silnika bazy w momencie połączenia z nią - ale kiedy korzystamy z innego narzędzia, np. Oracle SQL Developer albo nie chcemy się łączyć ponownie, to...

czwartek, 20 stycznia 2011

Referencja NULL w C++

Jedną z głównych różnic między wskaźnikami a referencjami w C++ jest fakt, iż referencja nie może wskazywać na NULL. Ta, jasne.

Faktycznie, standard ISO 14882 stwierdza (rozdział 8.3.2, punkt 4):
"A reference shall be initialized to refer to a valid object or function. [Note: in particular, a null reference cannot exist in a well-defined program, because the only way to create such a reference would be to bind it to the “object” obtained by dereferencing a null pointer, which causes undefined behavior."

Ale standard sobie, a implementacje sobie, więc to "only way" wcale nie jest takie only :) Podwińcie rękawy i zasłońcie oczy, bo pięknie to tu nie będzie ;)

poniedziałek, 17 stycznia 2011

Metoda equals, LSP i Twoje IDE

Jeżeli chodzi o metodę equals(Object obj) w Javie, to wiadomo jedno - wcale nie jest taka trywialna do napisania, zwłaszcza że jednocześnie trzeba pamiętać o hashCode(). Na szczęście nowoczesne IDE takie jak Eclipse czy NetBeans potrafią same wygenerować poprawną parę tych metod. Ale czy aby na pewno?

Przypomnijmy sobie czego Sun (ups, Oracle) wymaga jako "kontraktu" metody equals (http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Object.html#equals%28java.lang.Object%29):

1. Powinna to być relacja równoważności, czyli musi być:
a) zwrotna: x musi być równe x,
b) symetryczna: jeżeli x=y, to y=x,
c) przechodnia: jeżeli x=y i y=z, to x=z

2. Musi być spójna, tzn. ta sama para x i y musi zawsze dawać ten sam wynik.

3. I musi też zachodzić: x != null

Przesłaniając metodę equals trzeba pamiętać o wszystkich pięciu warunkach - na szczęście naszej pamięci przychodzą na pomoc nowoczesne IDE :)

czwartek, 7 października 2010

Social Circle Googla

Blog powróci w pełnej krasie w najbliższym czasie :) Ale kiedy pojawia się ważna kwestia, to post pojawia się od razu! :)

Ostatnio rozmawialiśmy w gronie znajomych o tym, że Google ma zbyt dużą wiedzę na nasz temat. Wie czego szukamy, wie co oglądamy, wie co piszemy w dokumentach (jeżeli używamy Google Docs), wie do kogo jak często i jakie maile piszemy (ach ten GMail) - bardzo przydatna wiedza jeżeli jest się firmą utrzymującą się z reklam.

Już teraz czuję się nieswojo, kiedy obok czytanego maila mam reklamy kontekstowe dopasowane do zawartości czytanej wiadomości. Wiem, że "przeczytał" to automat itd. - ale niesmak pozostaje.

Rozmawiając doszliśmy do wniosku, że gdyby Google połączył to co wie z informacjami z różnych portali społecznościowych, to wiedziałby o danym użytkowniku internetu WSZYSTKO.

I tak, piszę tego posta, bo właśnie pojawiło się takie rozwiązanie - Social Circle. Oczywiście BETA.

wtorek, 28 września 2010

SimpleDateFormat i wielowątkowość

Nie wszyscy zdają sobie sprawę, że standardowa w Javie klasa SimpleDateFormat z pakietu java.text nie jest bezpieczna ze względu na wątki. W sumie mało kto zdaje sobie z tego sprawę.

Bardzo często można spotkać w projektach Javy EE podobne linijki kodu:

Date date = GlobalConst.DATE_FMT.parse(datestring);

To, że potrzebna jest nam kontrola wielowątkowości pokaże następujący prosty przykład:

poniedziałek, 27 września 2010

Office 2007 - zmiana skrótów klawiszowych

Niektórzy z nas mają "przyjemność" pracować z Microsoft Office 2007 w wersji językowej innej niż polska. Wszystko jest fajnie, ale zdarza się, że Ctrl+B nie pogrubia tekstu ;) Np. w niemieckiej wersji pakietu Office służy do tego skrót klawiszowy Ctrl+Shift+F (a właściwie Strg+Umschalt+F) - od Fettdruck.

Niestety mam okazję pracować z Officem dopasowanym do języka Goethego ;) Skróty klawiszowe wyglądają w nim tak:

Ctrl+Shift+F - pogrubienie
Ctrl+Shift+K - kursywa
Ctrl+Shift+U - podkreślenie

Jak wrócić do starych, dobrych, jakże polskich Ctrl+B, Ctrl+I i Ctrl+U? ;) Jak zmienić te skróty klawiszowe? :)

środa, 22 września 2010

Growbox

Dzisiaj gierka zręcznościowo-logiczna ;)

Sterujemy kwadratem, a naszym zadaniem jest pożarcie wszystkich kropek na planszy. Uwaga - apetyt (a raczej nasz kwadrat) rośnie w miarę jedzenia, więc główny problem polega na wymyśleniu jak się nie zaklinować w labiryncie ;)

Prosta, relaksująca gra :)

poniedziałek, 20 września 2010

"Failed to load Main-Class ..." i NetBeans

Ostatnio pracując z malutkim projektem w NetBeans w pewnym momencie świeżo zbudowany plik JAR uraczył mnie komunikatem:

Failed to load Main-Class manifest attribute

Po krótkim guglaniu dowiedziałem się, że najczęściej taki komunikat dostają osoby, które do pisania programów wykorzystują tylko javac i cat i zapominają umieścić w pliku JAR plik manifest.mf. Proponowane rozwiązanie: użyj jakiegoś IDE, takiego jak Eclipse. Taaaa....

W JARze budowanym przez NetBeansa znajdował się wspomniany plik manifest.mf, ale nie mówił on która klasa w pliku jest główną. Przyczyną takiego błędu w tym IDE jest utworzenie projektu "class library", a nie "java application" - tak brzmi oficjalna wersja. Ale przecież 10 minut temu to jeszcze działało i było założone jako "java application".

Co ciekawe, pod samym NetBeansem cały projekt się uruchamiał, miał wybraną klasę główną itd., itp. Co poszło nie tak?

wtorek, 14 września 2010

Farbrausch & Vacuum - fr-049: of spirits taken

Dawno nie było demosceny na blogu :) Dzisiaj zamiast poligonów, shaderów i grafiki 3D upchanej w 64kB klimatyczna produkcja w komiksowym stylu.

"of spirits taken" to zaproszenie na Breakpoint 2006. Podobnie jak przy innych zaproszeniach (np. "Masagin", czyli zaproszenie na nvision 08) Farbrausch porzuca typowo demoscenowo-programistyczne techniki na rzecz klasycznej animacji.

poniedziałek, 13 września 2010

Dzień Programisty

Tak, co roku będę składał życzenia ;)

Bo w sumie co roku pojawia się coś nowego :) Np. dzisiaj książki informatyczne w Helionie z okazji 256. dnia roku można kupić z 20% rabatem ;)

Dobra, ale dlaczego piszę o tym temacie ponownie? Ponieważ od zeszłego roku Dzień Programisty to oficjalne święto w Rosji. Tak, oficjalne.

sobota, 11 września 2010

Shift 3

Dzisiaj kolejna gra logiczna z serii Shift.

Rozpoczynając rozgrywkę można całkiem słusznie mieć uczucie deja vu - pierwsze, treningowe poziomy są wręcz identyczne jak w części pierwszej - oczywiście do pewnego momentu...

środa, 8 września 2010

Operator indeksowania w C++

Czyli praktyczne zastosowanie tego, co już wiemy o const ;)

Załóżmy że potrzebujemy przeciążyć operator indeksowania (czyli []) dla swojej klasy. Weźmy na warsztat prosty przykład, bez żadnych szablonów itd.:

class MyArray
{
public:
  explicit MyArray(const int size) : arr_size(size)
  {
    p_arr = new double[arr_size];
  }

  ~MyArray()
  {
    if (p_arr)
    {
      delete [] p_arr;
    }
  }

  // i także konstruktor kopiujący i operator przypisania ...

private:
  double* p_arr;
  const int arr_size;
};


Chcemy móc korzystać z operatora [] do wyciągania elementów tablicy - dopisujemy więc w części publicznej klasy:

double operator[](const int idx)
{
  if (idx >= 0 && idx < arr_size)
  {
    return p_arr[idx];
  }
  throw std::invalid_argument("idx");
}


Problem pojawia się kiedy chcemy wykorzystać naszą klasę w następującym kodzie:

MyArray m = MyArray(5);
m[0] = 3.14;


Bum, błąd kompilacji. Gdzie jest nasz błąd?

poniedziałek, 6 września 2010

Słynne gitary domowej produkcji

Niektórzy sławni gitarzyści sami zbudowali swoje instrumenty - często gitary te stały się sławne, podobnie jak właściciel. Przyjrzyjmy się paru egzemplarzom - oto odliczanie TOP 3.

3. Gitary Rona Jorzombka

Ron Jarzombek to średnio-znany gitarzysta, popularny głównie w kręgach słuchaczy metalu progresywn-technicznego - dzięki zespołom Watchtower i Spastic Ink. Ron zasługuje na uwagę nie tylko dzięki umiejętnościom technicznym, ale też dlatego, że sam buduje swoje gitary, wykorzystując części z innych instrumentów.

Na specjalną uwagę zasługuje poniższa gitara:


Dlaczego? Kiedy Ron jechał w trasę koncertową do Japonii mógł zabrać dwie sztuki bagażu. Miał parę możliwości spakowania się:

1. Wziąć swoją główną gitarę, jako drugą walizkę ciuchy, ale nie mieć zapasowej gitary.
2. Zabrać dwie gitary i grać nago.
3. Wymyślić coś innego.

Instrument ze zdjęcia powyżej to efekt właśnie punktu 3. Gitara ta została przystosowana do szybkiego montażu i demontażu, a dzięki niewielkiemu korpusowi mogła jechać w walizce razem z ciuchami.

Więcej o gitarach Rona: http://www.ronjarzombek.com/gtrs.html

sobota, 4 września 2010

Java i http://

Kiedy usłyszałem pytanie z pewnej rozmowy kwalifikacyjnej stwierdziłem: "to jest totalnie jutro na moim blogu" :)

Pytanie jest proste: czy poniższy kod napisany w Javie się skompiluje?

public class HttpTest {
  public static void main(String[] args) {
    System.out.println("Hi!");
    http://www.java.com
    System.out.println("Hello!");
  }
}


Pogrubiona linijka to ta, której tak naprawdę dotyczy pytanie ;)

czwartek, 2 września 2010

Sling Jumper

Jeżeli ktoś lubi dopracowane graficznie i dźwiękowo gry, to dzisiaj propozycja nie dla niego ;)

Sling Jumper fajerwerków nie oferuje, za to wciągającą rozrywkę na pewno ;) Sterujemy kulką, która odbijając się od umieszczonych na planszy "proc" musi złapać wszystkie wymagane monety i dotknąć zielonej kulki ;)

wtorek, 31 sierpnia 2010

Czek na jednego heksadolara

Czek na jednego heksadolara (czyli $2,56) można otrzymać bardzo prosto - wystarczy znaleźć dowolnego rodzaju błąd w jednej z książek Donalda Knutha. Cenne uwagi warte są 1/8 heksadolara.

Znaleziony błąd może być błędem rzeczowym, historycznym lub jedynie błędem typograficznym czy literówką. Nieważne - pierwsza osoba która znajdzie taki błąd dostanie 2 dolary i 56 centów nagrody. Don Knuth wypisał już czeków na ponad 20 tysięcy dolarów, jednak mało który został zrealizowany, ponieważ:

"Szczytem inteligencji jest znalezienie błędu w książce Knutha.
Szczytem głupoty jest zrealizowanie otrzymanego czeku na $2,56."

niedziela, 29 sierpnia 2010

Wszystko co musisz wiedzieć o const w C++

const w C++ to jeden z najczęstszych modyfikatorów. Jest z nim związane wiele "ciekawostek" i niuansów, więc dzisiaj ten temat w pełni przemielimy ;)

const jak sama nazwa wskazuje służy w oryginalnym zamyśle do definiowania stałych. Maniacy C pewnie nadal używają #define, ale normalni ludzie napiszą w C++:

const int INFINITY = 2000000000;

nad #define INFINITY 2000000000; konstrukcja ta ma jedną, znaczącą przewagę - typ. Dzięki temu, że kompilator wie, że to int, może nas w porę ostrzec o jakiejś głupocie. Ale ludzie od C++ nie byliby sobą, gdyby const miało tylko takie jedno, proste znaczenie.

sobota, 28 sierpnia 2010

Word i C# - cz. I

Dzisiaj trochę na temat automatyzacji Worda za użyciem platformy .NET. Powiedzmy, że nasz program ma automatycznie generować dyplomy uznania dla uczniów. Mają one powstawać na bazie dokumentu-szablonu w formacie Worda 2003. W szablonie miejsca, które mają zostać automatycznie zamienione na dane uczniów są zaznaczone specjalnymi znacznikami, takimi jak np. %UCZEN%. Dzisiaj będzie o "brzydkim" rozwiązaniu takiego zadania ;)

Brzydkie jest korzystanie z obiektów COM samo w sobie. Platforma .NET dostarcza ułatwienie do korzystania z takich obiektów - Interop (od interoperability). Nasz program dzięki korzystaniu z obiektów COM nie będzie działał na plikach "doc" - on będzie działał na samym Wordzie - uruchomi go, skopiuje szablon odpowiednią liczbę razy za każdym razem odpowiednio podmieniając znaczniki, dodając podziały stron i wypluwając wszystkie dyplomy jako jeden dokument. OK, to zaczynamy.

Najpierw trzeba dodać referencję do odpowiedniego komponentu COM - w "Add reference" i zakładce "COM" wybieramy "Microsoft Word Object Library". U mnie jest to wersja 12 (Word 2007), ale z Wordem 2003 też nie będzie problemów ;)

Dodany komponent siedzi w przestrzeni nazw Microsoft.Office.Interop.Word. Aby nie trzeba było pisać zawsze tak długiego kwalifikatora warto wykorzystać using - tylko że ta przestrzeń zawiera mnóstwo klas, których nazwy mogą kolidować np. z Interopem dla Excela (jeżeli go używamy). Dlatego najlepiej skrócić po prostu kwalifikator do samego Word:

using Word = Microsoft.Office.Interop.Word;

środa, 25 sierpnia 2010

Zork

Czyli legendarna "tekstówka" z lat 80-tych w wersji on-line, dokładnie taka jak oryginał.

Oryginalny "Zork" powstawał w latach 1977-1979 na MIT na komputerze PDP-10, oczywiście raczej nie jako projekt badawczy. Autorzy tej gry odeszli z MIT i założyli spółkę Infocom. W latach 80-tych wydali "Zork" jako trylogię, portując grę z PDP-10 na zyskujące na popularności mikrokomputery - Apple II, Commodore 64, różne Atari, TRS-80 oraz IBM PC. Trylogia z czasem rozrosła się do serii 14 gier, z których późniejsze były już przygodówkami "graficznymi".