RSS
środa, 30 listopada 2011
Menu Project -> Add ASP.Net folder -> App_Data niedostępne

 

Tak się złożyło, że muszę odświeżyć starą znajomość z Visual Studio po dość długiej przerwie.
Przeglądając dostępne w sieci materiały trafiłem na tutorial MVC Music Store, który wydaje się obejmować, jeśli nie wszystkie, to większość elementów, które będą potrzebne do mojego małego projektu.

 


W pewnym momencie, wykonując kolejne kroki samouczka, konieczne jest utworzenie folderu danych dla lokalnej bazy danych - App_Data.

 


Wykorzystujemy w tym celu funkcję dostępna w menu Project -> Add ASP.Net folder -> App_Data. Przy pierwszym podejściu była ona niedostępna.



App_Data niedostepne



Tutorial o tym nigdzie nie wspomina, ale aby było możliwe dodanie tegoż folderu, konieczne jest wcześniejsze wybranie/wskazanie naszego projektu. Jeśli zaznaczony jest jakikolwiek inny plik, funkcja dodania nowego folder nie jest dostępna.



App_Data dostepne


wtorek, 29 listopada 2011
Warning: iPhone apps should include an arm6 architecture – Xcode 4.2 [Polish]

[1]


warning: iPhone apps should include an armv6 architecture (current ARCHS = "armv7")

iPhone/iPod Touch: application executable is missing a required architecture.  At least one of the following architecture(s) must be present: armv6 (-19033)



[2]


Xcode app submission warning

 

 

Z powyższymi błędami/ostrzeżeniami zetknąłem się przygotowując wersję release aplikacji. W pierwszym przypadku była to wersja pierwsza nowego programu, stworzonego od podstaw w Xcode 4.2. Ostrzeżenie pojawiało się już w momencie wykonywania release build-a. W drugim wypadku (zobacz powyższy screenshot) błąd pojawiał się dla nowej wersji aplikacji podczas weryfikacji Application Loader’em. Był to pierwszy build aplikacji w środowisku Xcode 4.2.



Oczywiście oba programy działały bezproblemowo podczas testów, kompilowane w wersji debug, zarówno na symulatorze jak i na urządzeniu.



Kłopoty opisane powyżej występują w Xcode 4.2.



Apple odchodzi powoli od architektury armv6. Powoli, gdyż architektura ta jest wykorzystywana w urządzeniach, które pojawiły się na rynku przed iOS 4.3. Jest to tak naprawdę większość iPhon’ów i iPad’ów i iPod’ów włączając w to iPhone’a 3G, 3GS, 4, iPad’a 3.2, iPad’a 4.2.



iOS 4.3 i nowsze obsługują obie architektury: armv6 i armv7.



Ze względu na starsze urządzenia architektura armv6 jest ciągle wymagana podczas wysyłania aplikacji do AppStore. Wyjątkiem jest sytuacja, w której armv7 jest ustawiona również dla parametru ‘Required Device Capabilities’.



Po tej krótkiej dygresji wróćmy do naszego ostrzeżenia. Aby go wyeliminować konieczna jest zmiana ustawień projektu.



Wybieramy nasz projekt, a następnie target i przechodzimy do zakładki Build Settings

 


Wyszukujemy parametr Architectures i z listy rozwijanej wybieramy Other...

 

Build Settings Architectures Other

 

Usuwamy istniejący wiersz 

 

Standard Architecture

 

i dodajemy dwa nowe armv6 i armv7

 

Architectures: armv6 and armv7

 

To powinno załatwić sprawę. Oczywiście powyższe kroki muszą być powtórzone dla wszystkich projektów/framework’ów wykorzystywanych przez aplikacje.



Warto również sprawdzić ustawienie ‘Build Active Architecture Only’ (powinno być one ustawione na ‘No’) oraz ustawienie ‘Required Device Capabilities’ (dla nowych projektów tworzonych w Xcode 4.2 wartość parametru ustawiana jest domyślnie na armv7) szczególnie, jeśli nasza aplikację tworzymy od podstaw w Xcode 4.2 i chcemy, aby działała również na starszych urządzeniach, pracujących używających armv6 jak na przykład iPhone 3G.



Jeśli ktoś chce dowiedzieć się sie czegoś więcej o architekturze ARM proszę zajrzeć tutaj: http://en.wikipedia.org/wiki/ARM_architecture


niedziela, 27 listopada 2011
Programowanie na iPhone - Wykonywanie połączeń telefonicznych w iOS z poziomu kodu

Jeśli chcemy zainicjować połączenie telefoniczne z poziomu kodu możemy to zrobić na przykład tak:



[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://+48123456789"]];



 

Wykonanie komendy spowoduje pojawienie się standardowego okienka nawiązywania połączenia iPhonea.

 No to dzwonimy

Rzeczą, o której często zapominamy jest to, iż numer wysyłany do metody URLWithString nie może zawierać niedozwolonych w numerach znaków włączając w to znaki odstępu. Przykładowo, próba wykonania poniższego kodu zakończy się niepowodzeniem:



[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"tel://+48 123 456 789"]];



Sam np.: zawsze usuwam puste znaki (white spaces) przed próba wykonania połączenia:

NSString *newPhoneNo = [[myString componentsSeparatedByCharactersInSet: [NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString: @""];



Pełna procedura wygląda następująco:

-(void) makePhoneCallWithNumber:(NSString *)number {
    
    NSString *phoneNoWithProtocol = [NSString stringWithFormat:@"tel:%@", 
       [[number componentsSeparatedByCharactersInSet: 
       [NSCharacterSet whitespaceCharacterSet]] componentsJoinedByString: @""]];
    
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNoWithProtocol]];

}

 

 

Tutaj możecie pobrać kompletny przykładowy projekt, którym możesz dzwonić pod wprowadzony wcześniej numer.


   No to dzwonimy      No to dzwonimy  
No to dzwonimy
wtorek, 15 listopada 2011
Lokalizacja aplikacji iPhone (Xcode 4.2) - pliki startowe - Default.png / Default@2x.png

 


Razem z innymi elementami aplikacji chciałem zlokalizować ekran startowy. Ze względu na jego charakter i sposób ładowania się aplikacji miało to sens. Sposób postępowania ilustrują poniższe kroki:



1. w Xcode wybieram plik Default.png,


2. wybieramy File Inspector i dodajemy nowy język - patrz screenshoot poniżej. W tym momencie Xcode tworzy dla nas odpowiedni folder (o ile takowy jeszcze nie istnieje np.: es.lproj i kopiuje do niego aktualny plik Default.png/Default@2x.png,




Lokalizacja pliku Default.png

 

 

3. korzystając z narzędzia Finder zmieniamy domyślny plik startowy na jego zlokalizowana wersję.



Wszystkie kroki powtarzamy dla pliku w wysokiej rozdzielczości - Default@2x.png.

 


Teoretycznie w tym momencie aplikacja powinna poprawnie rozpoznawać i wykorzystywać nasze nowe, zlokalizowane pliki, tak się jednak niestety nie dzieje (nie zadziałało to w moim przypadku). Bez względu na ustawiony język ciągle wykorzystywany był plik domyślny.



Rozwiązać problem pomógł mi ten wpis na stackoverflow (kroki postępowania opisałem również poniżej):



1. usuń aplikację z symulatora (tak dla pewności),


2. usuń wszystkie zlokalizowane wersje plików Default.png/Deafult@2x.png (Uwaga! konieczne jest usunięcie fizyczne plików, a nie jedynie referencji do nich.),


3. z menu Product wybierz Clean / Clean Project Folders - druga opcja pojawia sie po wciśnięciu klawisza Alt, osobiście wybrałem opcję drugą, ale obie powinny zadziałać,


4. jeśli foldery lokalizacyjne nie są założone to utwórz je (np. es.lproj) i skopiuj do nich zlokalizowane pliki Default.png i Default@2x.png,


5. z poziomu Xcode wykonaj RMB* -> Add Files to „PROJECT NAME”...


6. wybierz zlokalizowany plik z właściwego folderu np. z es.lproj,


7. koniecznie zaznacz opcję  „Copy items into destination group’s folder...”

 

Lokalizacja pliku Default.png

 


8. powtórz kroki 5 – 7 dla wszystkich zlokalizowanych plików Default.png / Default@2x.png.

Problem dotyczy jedynie plików startowych. Zlokalizowane stringi działają bez żadnych dodatkowych operacji.



Lokalizacja i dalsze prace nad aplikacją wspierającą wiele języków nie jest zadaniem łatwym i pewnie jeszcze do zagadnienia powrócę.



Uwaga: Zaraz po dodaniu nowych plików Default*.png, podczas tworzenia nowego build-a Xcode zaczął generować ostrzeżenie o powtórzonych wpisach zasobów wchodzących w skład kompilacji.

Warning: Multiple build commands for output file /Users/mort/Library/Developer/Xcode/DerivedData/MyApp-hdpyzchbdvabwsgxujmcjhsukpah/Build/Products/Debug-iphonesimulator/MyApp.app/Default.png

 


Sposób postępowania z problemem opisałem tutaj:

http://notatkiprogramisty.blox.pl/2011/11/Problem-z-Xcode-Warning-Multiple-build-commands.html


* RMB - Right Mouse Button :)



niedziela, 13 listopada 2011
Programowanie na iPhone - Wczytywanie UIWebView

UIWebView ma swoje wady, nie przeczę, ale mimo wszystko jest obiektem bardzo użytecznym. Jedną z najbardziej irytujących mnie rzeczy jest fakt, iż zazwyczaj użytkownik aplikacji widzi to, w jaki sposób renderowana jest nasza zawartość HTML. Dzieje się tak nawet w sytuacji, gdy korzystamy z bardzo szybkiego łącza, a nawet wtedy, gdy ładowany plik, jest plikiem lokalnym. Prowadzi to oczywiście do ‘bad user experience’ :)



Prostym sposobem na rozwiązanie problemu jest ustawienie właściwości hidden obiektu UIWebView na YES przed ładowaniem zawartości, a następnie jej zmiana na NO po zakończeniu renderowania pliku HTML.



Aby to zaimplementować musimy ustawić nasz view controller, jako delegata obiektu UIWebView i obsłużyć metodę webViewDidFinishLoad ustawiając w niej właśnie właściwość hidden na NO.



- (void) webViewDidFinishLoad:(UIWebView *)webView;



Jak to implementujemy w praktyce?



Załóżmy za nasz view controller obsługuje dwa widoki:

 

  1. UIWebView
  2. widok pomocniczy – służący nam za tło

 


W zdarzeniu viewWillAppear naszego kontrolera uaktywniamy/wyświetlamy znacznik ładowania zawartości, może być to prosty napis „Proszę czekać...”



W metodzie webViewDidFinishLoad nasz znacznik ładowania jest ukrywany/usuwany z widoku i pokazywana jest zawartość UIWebView (hidden = NO).



Kolor tła naszego widoku pomocniczego (2) z reguły odpowiada kolorowi tła ładowanej zawartości HTML. Sprawia to, że cała zmiana wygląda płynniej. Oczywiście przejście z jednego widoku w drugi można zaimplementować na wiele rożnych sposobów, wszystko tak naprawdę zależy, z jaką aplikacją pracujemy.




Uwaga:

 

  1. Metoda webViewDidFinishLoad może zostać wywołana kilkakrotnie w momencie, gdy ładowany zawartość HTML korzysta z ramek.
  2. UIWebView jest obiektem pamięciożernym, pamiętać, więc trzeba o jego zwalnianiu w momencie otrzymania ostrzeżenia o kończącej się pamięci (didReceiveMemoryWarning).



piątek, 11 listopada 2011
PowerBuilder 12.5
International Sybase User Group  

PowerBuilder 12.5 jest wreszcie dostępny, jako benefit dla członków ISUG (subskrypcja zieloną lub złota). Udostępniana licencja jest licencją jednoroczna z opcją przedłużenia, pod warunkiem oczywiście, że pozostajemy członkami ISUG. Rozszerza ona licencję pakietu trial, który można pobrać bezpośrednio ze stron Sybase.



Polecam!


środa, 09 listopada 2011
Programowanie na iPhone - Makra UIColor

Poniżej znajdziecie kilka użytecznych makr upraszczających nieco zabawę z kolorami w iOS. Będą one szczególnie przydatne osobom przyzwyczajonym do modelu RGB. Ja osobiście korzystam z dwóch poniższych:

 

#define RGB(r, g, b) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:1]

 

#define RGBA(r, g, b, a) [UIColor colorWithRed:r/255.0 green:g/255.0 blue:b/255.0 alpha:a]

 

Korzystamy z nich następująco:

 

//kod bez makra
self.tableView.backgroundColor = 
     [UIColor colorWithRed:138/255.0 green:43/255.0 blue:226/255.0 alpha:1];

 

//kod z makrem
self.tableView.backgroundColor = RGB(138, 43, 226);

 

//kod bez makra
self.tableView.backgroundColor = 
     [UIColor colorWithRed:138/255.0 green:43/255.0 blue:226/255.0 alpha:0.5];

 

//kod z makrem
self.tableView.backgroundColor = RGBA(138, 43, 226, 0.5);

 

     Makro UIColor - Alpha 1    

0x8A2BE2 - Alpha 1

     Makro UIColor - Alpha 0.5    

0x8A2BE2 - Alpha 0.5

 

Osobom, które wolą pracować z kolorami zapisanymi w postaci szesnastkowej np: 0x8A2BE2 polecam poniższe makro, napisane przez Rona Sweeney:

 

#define UIColorFromRGB(rgbValue) [UIColor \
    colorWithRed:((float)((rgbValue & 0xFF0000) >> 16))/255.0 \
    green:((float)((rgbValue & 0xFF00) >> 8))/255.0 \    
    blue:((float)(rgbValue & 0xFF))/255.0 alpha:1.0]

 

//sposób użycia
self.tableView.backgroundColor = UIColorFromRGB(0x8A2BE2);

 

Link do źródła: https://gist.github.com/631616

poniedziałek, 07 listopada 2011
Zmienne kontekstowe sesji i triggery (Oracle)
Najprawdopodobniej w ‘żyjącym’ (produkcyjnym) systemie każdy z nas od czasu do czasu musi poprawić jakieś dane. Błędy zdażają się w kodzie, podczas wdrażania nowych wersji aplikacji, a najczęściej to sami użytkownicy znajdują sprytne sposoby na obejście dodanych walidacji danych. Dziś pokażę jak poprawić dane, których czas modyfikacji śledzony jest z poziomu triggera bez wpływu na datę i czas modifikacji danych (przykład na pewno wyjaśni to lepiej :)...
niedziela, 06 listopada 2011
Problem z Xcode - Warning: Multiple build commands for output file

Pracując nad jednym z projektów iOS, po jednej z kolejnych modyfikacji plików Default.png / Default@2x.png podczas kompilacji zaczęło pojawiać się sie poniższe ostrzeżenie:
 

Warning: Multiple build commands for output file /Users/mort/Library/Developer/Xcode/DerivedData/MyApp-hdpyzchbdvabwsgxujmcjhsukpah/Build/Products/Debug-iphonesimulator/MyApp.app/Default@2x.png

 
Ponieważ staramy się sie wszelkie ostrzeżenia traktować jak błędy ten też trzeba było rozwiązać. W tym wypadku szybki rzut oka na pliki, które wchodzą w skład bundle wyjaśniły problem (zobacz poniższy screen).


 

Warning: Multiple build commands for output file



Xcode musiał sie w pewnym momencie pogubić i dwukrotnie dodał do listy plik Default@2s.png. Usuniecie go rozwiązuje sprawę.


Otwieramy zatem Target > Build Phases i kasujemy niepotrzebny wpis.


sobota, 05 listopada 2011
Something special for long autumn and winter evenings – PowerBuilder Tetris [English]
Someone told me once that PowerBuilder is dying and you can’t do anything useful with it anymore. This is not true of course. I won’t write about all the new features offered by the latest and greatest PowerBuilder, if you’re interested check out the Sybase/SAP PowerBuilder’s product page. What I’d like to show today is a game written in PowerBuilder. It’s based on the original DOS Tetris I used to play when I was still young and beautiful* :). It looks alike, counts points alike and usually ugly yellow L is even uglier now ;) But in spite of small bugs and irritating L the game is really playable. Try it yourself! Click ...CZYTAJ DALEJ... below to read on.
 
1 , 2
Tagi




PowerBuilder Tetris
D - Tetris



Programowanie iOS

C# ToolBox

SQL / TSQL / PLSQL ToolBox

Linux / Unix ToolBox





Zaprzyjaznione Strony

Sprite Bandits

Cake Time