RSS
poniedziałek, 08 sierpnia 2011
Mac OS 10.6 - Hibernacja
Niedawno, z przyczyn niezależnych, musiałem przeinstalować system mojego Mac'a (Snow Leopard 10.6.x). Był to mój pierwszy raz i niestety każdego dnia dowiaduje się co przeoczyłem. Jedną z takich rzeczy były aliasy, z mojego pliku .bash_profile (cały plik s.... trafił), stworzone do ustawiania trybu hibernacji systemy.
wtorek, 19 lipca 2011
Szybkie kopiowanie struktury tabeli

Korzystając z prostej konstrukcji CREATE TABLE AS SELECT możemy szybko skopiować strukturę interesującej nas tabeli.

 

CREATE TABLE NEW_TABLE
AS
   (SELECT   *
      FROM   SOURCE_TABLE
     WHERE   1 = 0)

 

Wynikiem wykonania powyższego polecenia będzie nowa tabela NEW_TABLE będąca kopią tabeli źródłowej SOURCE_TABLE. Użyta klauzula WHERE powoduje że skopiowana zostanie jedynie struktura tabeli a nie jej zawartość.

 

Oczywiście czasami zawartość też może być interesująca. Ja na przykład korzystam z takiego rozwiązania, oczywiście odpowiednio modyfikując klauzulę WHERE :), aby kontrolować zawartość tabel tymczasowych na rożnych etapach przetwarzania podczas testów integracyjnych.

 

Myślę, że sposób tan znany jest większości administratorów i programistów Oracle, ale i tak uważam, iż jest to warte zanotowania :)

Tagi: oracle Sql
20:32, m0rt1m3r
Link Komentarze (1) »
środa, 13 lipca 2011
Zmienne zmienne :)

Dziś będzie praktycznie bez kodu.

 

Testując jedną z aplikacji zauważyłem, iż moje zmienne zostały 'zoptymalizowane' i niestety nie mogę podejrzeć ich wartości podczas debugowania:

 

NSDouble *var;

 

Rozwiązaniem okazuje się być oznaczenie zmiennej jako volatile.

volatile NSDouble *var;

 

Modyfikator typu - volatile - mówi kompilatorowi, że wartość danej zmiennej ulegnie zmianie (nice :) i aby jej nie optymalizował poprzez np. umieszczenie w rejestrze.

 

To samo można uzyskać nie wprost, ustawiąjac flagę kompilacji –O0, co wydaje się być lepszym rozwiązaniem. Sam, korzystam własnie z tej flagi w wersjach debug aplikacji, jednakże w tym wypadku testowany był końcowy build - release.

 

UWAGA! Flaga –O0 nie powinna być stosowana dla kodu release!

 

Mam nadzieje, że komuś notatka ta rownież się przyda.

piątek, 24 czerwca 2011
Video z WWDC 2011 nareszcie dostępne!

W końcu to, na co wszyscy czekaliśmy (no a przynajmiej wszyscy ci, którzy interesują się iOS-em i technologiami Apple)! Firma z Cupertino udostępniła dziś nagrania video sesji konferencji WWDC 2011, która odbyła się w San Francisco w dniach 6-10 czerwca.

 

Nagrania można obejrzeć/pobrac tutaj (link otwiera się w nowym oknie).

 

Polecam!

czwartek, 23 czerwca 2011
Wykorzystanie stałych z pakietów w zapytaniach SQL
Definiowanie i wykorzystanie stałych, przynajmniej ja, uważam za dobra praktykę. Zdecydowanie lepsza niż wprowadzanie tej samej, często nieoczywistej, wartości w 20+ rożnych miejscach. Czasami zachodzi także konieczność wykorzystania tych wartości w zapytaniach SQL. Możemy oczywiście dla każdej z nich zdefiniować odpowiednie funkcje publiczne i w większości przypadków sprawdza sie to świetnie co jednak gdy mamy takich stałych kilkadziesiąt? Pakiet i jego specyfikacja rozrosłyby nam się niepotrzebnie.
piątek, 17 czerwca 2011
Programowanie iPhone - iOS/iPhone - "recovery" save

 

Czyli cos o applicationWillTerminate, applicationWillResignActive i applicationDidEnterBackground

 

W malej aplikacji, nad którą pracuje, chciałem mieć pewność, że dane wprowadzane przez użytkownika będą zawsze poprawnie zapisane, nawet w wypadku, gdy wciśnie on przypadkowo przycisk Home, bądź, gdy system z jakiegokolwiek innego powodu zakończy jej działanie.

 

Ze względu na specyfikę iPhone-a, nasz program może zostać przerwany w każdej chwili, dlatego staram się sie utrwalać jego stan w miarę regularnie. Podstawowa metodę zapisującą dane zaimplementowałem w zdarzeniu viewWillDissapear. Rozwiązanie takie nie sprawdzi sie niestety w sytuacji, gdy działanie aplikacji zostanie niespodziewanie przerwane, w momencie, gdy użytkownik wprowadza dane.

 

Z pomocą przychodzą nam oczywiście metody dostępne w obiekcie aplikacji: applicationWillTerminate, applicationWillResignActive oraz applicationDidEnterBackground. Niestety UIViewControler żadnej z tych metod nie posiada, nie jest tez automatycznie informowany o zajściu któregokolwiek z tych zdarzeń. Aby to rozwiązać musimy wykorzystać mechanizm powiadomień (notifications).

 

Rozwiązanie, które zaimplementowałem i które proponuje, polega na zarejestrowaniu naszego kontrolera w centrum powiadomień (notification centre) tak, aby był on informowany o zajściu któregokolwiek ze wspomnianych zdarzeń. Możemy zrobić to podczas ładowania naszego widoku w metodzie viewDidLoad w następujący sposób:

 

//Rejestracja jako obserwator zdarzenia UIApplicationWillTerminateNotification
[[NSNotificationCenter defaultCenter]
                       addObserver:self
                          selector:@selector(applicationWillTerminate:)
                              name:UIApplicationWillTerminateNotification
                            object:[UIApplication sharedApplication]]; 

 

//Rejestracja jako obserwator zdarzenia UIApplicationWillResignActiveNotification
[[NSNotificationCenter defaultCenter]
                       addObserver:self
                          selector:@selector(applicationWillResignActive:)
                              name:UIApplicationWillResignActiveNotification
                            object:[UIApplication sharedApplication]]; 

 

//Rejestracja jako obserwator zdarzenia UIApplicationDidEnterBackgroundNotification
//Uwaga! Zdarzenie dostepne jedynie iOS 4.0 + . Proba rejestracji zdarzenie w systemie < iOS 4.0 spowoduje crash aplikacji.
[[NSNotificationCenter defaultCenter]
                       addObserver:self
                          selector:@selector(applicationDidEnterBackground:)
                              name:UIApplicationDidEnterBackgroundNotification
                            object:[UIApplication sharedApplication]]; 

 

Następnym krokiem jest zaimplementowanie odpowiednich metod:

 

- (void) applicationWillResignActive:(UIApplication *)application {
    NSLog(@"Application will resign active...");
    //...nasz kod...
}

 

- (void) applicationWillTerminate:(UIApplication *)application {
    NSLog(@"Application will terminate...");
    //...nasz kod...
}

 

- (void) applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"Application did enter background...");
    //...nasz kod...
}

 

W nowszym systemie (iOS 4.0+) metoda applicationWillTerminate nie jest z reguły wywoływana. Zamiast niej wywoływana jest metoda applicationWillResignActive a następnie applicationDidEnterBackground i nasz program zaczyna działać w tle. W iOS 4.0+ to właśnie ta ostatnia metoda powinna być używana do zwolnienia wykorzystywanych zasobów oraz zapisania stanu aplikacji, w tym danych wprowadzanych przez użytkownika. Oczywiście applicationWillTerminate może być wywołana nawet w nowszym systemie w sytuacji, gdy musi on, z jakiegoś powodu zatrzymać masz program, lub gdy użytkownik zdecyduje sie na jego ręczne usuniecie z listy aplikacji działających 'w tle'.

 

To również ta metoda jest wywoływana w momencie przerwania aplikacji w starszych systemach iOS.

 

System daje nam około 5-ciu sekund na wykonanie wszystkiego, w przeciwnym razie może on usunąć nasz proces z pamięci przed jego zakończeniem. Możemy także zażądać dodatkowego czasu na wykonanie wszystkiego wykorzystując metodę beginBackgroundTaskWithExpirationHandler po dodatkowe szczegóły zapraszam do lektury UIApplicationDelegate Protocol Reference (link otworzy sie w nowym oknie).

środa, 15 czerwca 2011
Witam niedzielnych, i nie tylko, programistów :)

 

Juz od paru miesięcy myślałem o założeniu bloga, który jednocześnie byłby czymś w rodzaju 'notatnikia'.


Ileż to razy zdarzało mi sie natknąć na jakiś problem, czasami przyznam trywialny, rozwiązać go, postanawiając jednocześnie, że gdzie to zanotuje, ale albo robiłem to na przysłowiowej serwetce albo po prostu ta chwila 'natchnienia' mijała i nic z pisania nie wychodziło.

Dziś postanowiłem to zmienić, a właściwie to wczoraj :)

Jeśli chodzi o tematykę to, jak nietrudno odgadnąć, Bedzie on o programowaniu,
o technologiach, które wykorzystuje (nie tylko w niedziele) miedzy innymi o Oraclu,
narzędziu PowerBuilder (używa tego ktoś jeszcze?) i trochę o iOS. Będę próbował pokazywać tu
praktyczne rozwiązania rzeczywistych problemów, które niekoniecznie musza być optymalne, najlepsze, ale na 100% działają.

Pamiętajcie, że sam ciągle się uczę i liczę tu na wasza pomoc :)

Zapraszam do lektury i dzielenia sie własnymi doświadczeniami / tipsami.

21:31, m0rt1m3r
Link Dodaj komentarz »
1 ... 16
 
Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time