RSS
wtorek, 29 maja 2012
Programowanie iPhone / iOS - aplikacja lista zadań - ToDo - cześć 4 (SQLite)
Dzisiejsza cześć będzie dość krótka. Przedstawię bardzo zwięźle SQLite, a następnie, korzystając z linii komend utworzymy prosta bazę danych dla naszej aplikacji. Pokażę również wtyczkę do przeglądarki FireFox, którą można wykorzystać w tym samym celu. W części kolejnej natomiast, zajmiemy się już właściwym jej wykorzystaniem w naszym programie. Zapraszam do lektury...
wtorek, 22 maja 2012
(Re) instalacja Mac OS Snow Leopard (The installation failed)

Po niemal dwóch latach nieustannego eksperymentowania z systemem postanowiłem zainstalować go od początku. Straciłem na to, dość niespodziewanie, kilka godzin. Po reinstalacji systemu nie mogłem go zaktualizować ani ‘instalować’ na nim niemal żadnych aplikacji z archiwów *.dmg (Apple Disk Image) . Wszelkie próby kończyły się poniższym błędem.



(Re) instalacja Mac OS Snow Leopard (The installation failed)


Ponieważ moja instalacja nie była wykonana w sposób standardowy, początkowo myślałem, że gdzieś popełniłem błąd. Przy kolejnej próbie, już standardowej instalacji, problem nie zniknął.



Wszystkie pliki *.dmg uruchamiałem z niedawno zakupionego serwera NAS, pierwsze podejrzenie padło na niego. Po pobraniu zbiorczej aktualizacji systemu 10.6.8 ze stron Apple i jej poprawnej instalacji, utwierdziłem się tylko w tym przekonaniu. Zacząłem więc pobierać kolejne aplikacje, ale kolejne próby instalacji, podobnie jak poprzednio, kończyły się niepowodzeniem (uff... to nie mój NAS jest problemem :).



Przyszedł zatem czas na szukanie informacji o problemach z instalacja konkretnych aplikacji. W końcu natrafiłem na ten link (Uaktualnienie instalatora oprogramowania Apple 1.0
To uaktualnienie rozwiązuje problem, który może uniemożliwiać instalowanie niektórego oprogramowania Apple. To uaktualnienie jest zalecane dla wszystkich użytkowników systemu Mac OS X 10.6.8).



Po ściągnięciu i instalacji opisanej tam łatki wszystkie problemy zniknęły.



Jeśli wiec masz problemy z ‘instalacja’ aplikacji dostarczanych, jako pliki *.dmg zacznij od zainstalowania powyższej łatki.




piątek, 11 maja 2012
Oracle RAC i 'losowe' sekwencje

 

Przenieśliśmy właśnie naszą developerską bazę danych do środowiska Oracle RAC.
Testując jedną z aplikacji zaobserwowałem 'dziwne' zachowanie sekwencji. Wystarczy zerknąć na poniższe screenshoty i dane w pierwszym i ostatnim wierszu (przykładowo, jest ich tam więcej :).


Sekwencje i Oracle RAC

 

Wyniki wykonanego zapytania posortowane są malejąco po kolumnie logcreated (wartość domyślna aktualny time stamp). Wartości w kolumnie logid wypełniane są wartościami sekwencji:



CREATE SEQUENCE LOGID;



Co w rezultacie, po uwzględnieniu wartości domyślnych bazy Oracle, prowadzi do:



CREATE SEQUENCE LOGID
  START WITH 1
  MAXVALUE 999999999999999999999999999
  MINVALUE 1
  NOCYCLE
  CACHE 20
  NOORDER;



Niestety nasze zespół QA zawiódł na całej linii. Nie powinien on dopuścić do stworzenia takiej sekwencji, ale to zupełnie inna historia :).



Jak widać, wartości w kolumnie logid wyglądają na przydzielane losowo. Początkowo myślałem, że to bug w moim kodzie, ponieważ byłem na etapie modyfikacji jednej z powiązanych funkcjonalności programu. Problemem są tu jednak wartości domyślne Oracle wykorzystywane przy tworzeniu sekwencji. Domyślnie sekwencje są nieposortowane i cache-owane jest 20 kolejnych wartości.



W środowisku RAC, każdy z węzłów ma swój własny cache dla sekwencji, co może prowadzić, jak w powyższym przykładzie do wartości ‘losowo wyglądających' numerów sekwencji.



Wszystko to jest dobrze udokumentowane i absolutnie nie twierdze ze to błąd bazy, raczej niedopatrzenie ze mojej strony :) [osobiście uważam, że domyślnie sekwencje powinny być tworzone jako posortowane].



Brak poprawnej kolejności wydaje mi się nieintuicyjny szczególnie, gdy w tabeli posiadamy również znacznik czasu utworzenia rekordu. Może też prowadzić do trudnych do zdiagnozowania błędów w aplikacji. W moim wypadku prowadziło to do wyświetlania niewłaściwych danych dla użytkownika.

Wykorzystywałem max(logid) oraz sortowanie malejące po tejże kolumnie dla odpowiednio pobrania ostatnio wykonanej czynności i wyświetlenia w kolejności chronologicznej (desc) historii operacji (wiadomo... sortowanie po wartości typu numerycznego jest zawsze szybsze, niż to po dacie, dlatego też, wybór mój padł na tę właśnie kolumnę a nie na kolumnę logcreated).



W moim wypadku zdecydowałem się na zmodyfikowanie sekwencji tak, aby nie korzystały z cache:

 

ALTER SEQUENCE LOGIDNO NOCACHE;



Na razie wszystko jest ok, nie testowałem jedynie wydajności tego rozwiązania w porównaniu do posortowanej, cache-owanej sekwencji.

 

Jeśli polegasz na kolejności sekwencji musisz zwrócić uwagę na to jak dokładnie tworzysz swoją sekwencje.



wtorek, 08 maja 2012
Programowanie iPhone / iOS - aplikacja Lista Zadań - ToDo - część 3
Zgodnie z zapowiedzią w tej części będziemy dalej rozbudowywać nasz program Listę Zadań - ToDo. Wprowadzimy dodatkowy kontroler Tab Bar, na pierwszej pozycji umieszczając to, co stworzyliśmy dotychczas - listę zadań do wykonania, na drugiej listę zadań wykonanych. Naszym użytkownikom umożliwimy również usuwanie jednym przyciskiem wszystkich zadań oznaczonych jako wykonane. Do potwierdzenia wyboru wykorzystamy Alert View. Zapraszam...
Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time