Categoria ‘Sviluppo’


WordPress: usare gli shortcodes

Dalla versione 2.5 di WordPress (meglio 2.5.1) sono disponibili i cosidetti shortcodes, una procedura che permette di creare delle callback, o meglio degli hook, quando nel testo del nostro post viene trovata una stringa formattata con le parentesi quadre tipo [id_shortcode]. Prima della release 2.5 di WordPress gli shortcodes erano implementati manualmente (vedi Napolux), ora è possibile sfruttarli con più semplicità e per gli usi più disparati.

Continua...

WordPress: eliminare i post duplicati nei loop multipli

L’utilissima funzione query_posts() o l’oggetto WP_Query (che poi sono fondamentalmente la stessa cosa) di WordPress permette di ottenere una lista di post impostando numerosi parametri di ricerca (vedi Very short snippet: visualizzare una lista di post per categoria o tag). Proprio a causa della sua versatilità nella ricerca dei post può capitare che usando la funzione due o più volte di seguito si ottengano dei “duplicati”.

Continua...

XCode 3.1.3: ripristinare le SDK 2.2.1

Ai soli sviluppatori registrati è già stata rilasciata una nuova versione delle SDK per Apple iPhone, è quindi giunto il momento di installare le SDK 3.0 aggiornando così l’intero ambiente di sviluppo: XCode alla versione 3.1.3. Se avete già effettuato l’upgrade vi sarete accorti che creando un nuovo progetto sembrano scomparse le vecchie SDK 2.2.1 (comprese le altre).

xcode313

In realtà è tutto presente sulla nostra macchina, basta infatti eseguire una semplice procedura per ripristinare magicamente tutte le nostre SDK precedenti, così da provare la nostra applicazione per Apple iPhone sia con le SDK 3.0 che con le precedenti versioni 2.2.1 e minori. Selezionate il progetto, aprite il menu contestuale e selezionate Get Info:

xcode131menu

Nella finestra che si aprirà, nella prima scheda General, in basso selezionate Base SDK for All Configurations e ripristinate le SDK 2.2.1 (o quello che volete).

xcode313info

Fatto questo, magicamente, il menu di XCode rivisualizzerà tutte le SDK compresa la 3.0

xcode313ok

Continua...

Very short snippet: WordPress, prossimamente sul vostro blog

WordPress, come quasi tutti saprete, permette di pubblicare un post “post-datato” (ottimo gioco di parole). In pratica il post viene memorizzato con una data che deve ancora arrivare. Questo permette a molti blogger di “schedulare” (programmare) la pubblicazione di post senza preoccuparsi di essere fisicamente presenti in console per la pubblicazione vera e propria. Inoltre permette di mantenere la pubblicazione di post costante anche quando siamo in vacanza.

Continua...

Job in saidmade: cercasi programmatore

Saidmade srl, nonostante il momento apparentemente di crisi, offre una grande opportunità ai giovani appassionati di informatica. L’offerta di lavoro è concreta, indirizzata a tutti coloro che desiderano svolgere l’attività di sviluppatore, una professione che richiede passione e grande volontà, spesso sottovalutata soprattutto qui in Italia. La società di cui sono socio, quindi, è alla ricerca di un programmatore/programmatrice Junior con i seguenti requisiti:

  • Età compresa fra i 18 e i 27 anni e una buona dose di creatività
  • Conoscenza di base della programmazione e soprattutto del linguaggio ANSI-C

Volontà di acquisire conoscenza su:

  • Programmazione OO
  • PHP
  • Javascript
  • Adobe Actionscript
  • C++ / Objective-C

Costituisce, inoltre, titolo preferenziale la conoscenza d:

  • XHTML / CSS
  • WordPress

Se il vostro profilo e il vostro interesse trovano riscontro in quanto detto sopra, inviate la vostra proposta di condidatura a: info@saidmade.com

Continua...

Eclipse, Aptana: upload file tramite tastiera

L’IDE Aptana è disponibile anche come Plugin per Eclipse. Una delle caratteristiche più apprezzate di questo ambiente è l’ottima gestione del FTP e la sincronizzazione dei file/progetti locali con il remoto. In particolare esiste uno script che permette di inviare il codice attualmente nella finestra di editor al server remoto, tramite la combinazione dei tasti CONTROL+SHIFT+U o COMMAND+SHIFT+U su Mac OS (la stessa combinazione è usata in Adobe Dreamweaver). In alcune installazioni (ad esempio la mia su Mac OS, Eclipse e Aptana com Plugin) tale combinazione sembra assente e, se cercate di rintracciarla nelle Preferences > General > Keys non troverete – misteriosamente – nulla! Il problema, tuttavia, è facilmente risolvibile e dipende dalla sovrapposizione di un’altra impostazione. Risulta, infatti, che la combinazione dei tasti sopra citati è impostata per default su un’altra funzione: Shows Occurrences in File Quick Menu. Quindi basta aprire il pannello delle Preferences > General > Keys e cercare shows occ..:

eclipseprefs

Rimuivere il “binding”, cioè l’associazione con lo shortcut da tastiera, e tutto funzionerà!

Continua...

iPhone: tutti i font di sistema

L’Apple iPhone mette a disposizione un numero limitato di Font agli sviluppatori. La lista dei font disponibili è facilmente ottenibile da codice, come vedremo. Se volete usare un vostro font, ad esempio includendolo nelle risorse, la cosa è un pochino più articolata e conivolge anche la questione delle licenze (diritti) sui font “embeddati”… ne riparleremo in seguito. Tornando invece ai font ufficiali presenti nell’Apple iPhone questi sono (cliccate sull’immagine per ingrandire):

iphonefonts

L’SDK di Apple iPhone permette di accedere a degli speciali font di sistema. Questi sono identificati da particolari costanti e sono:

1
2
3
UIFont *myBoldFont   = [UIFont boldSystemFontOfSize:12.0];
UIFont *mySystemFont = [UIFont SystemFontOfSize:12.0];
UIFont *myItalicFont = [UIFont italicSystemFontOfSize:12.0];

Se volete invece ottenere un puntatore ad uno odei font mostrati nell’immagine di sopra basta usare:

1
UIFont *myCustomFont = [UIFont fontWithName:@"Helvetica-Bold" size:22.0];

Come avrete notato la gestione del font è particolare; oltre alla famiglia (Helvetica, Courier, etc…) bisogna specificare il tipo (bold, italic, etc…). In pratica, quindi, un font deve essere fornito di queste caratteristiche. L’Helvetica, ad esempio, è presente con:

1
2
3
4
Helvetica
Helvetica-Bold
Helvetica-Oblique
Helvetica-BoldOblique

Se volete visualizzare direttamente i vostri font sull’iPhone, ecco qualche linea di codice utile:

1
2
3
4
5
6
7
8
9
10
11
12
NSArray *listOfFonts = [[NSArray alloc] initWithArray:[UIFont familyNames]];
NSArray *subFontTypes;

for (int i=0; i<[listOfFonts count]; i++) {
    NSLog(@"Font Family: %@", [listOfFonts objectAtIndex:i]);
    subFontTypes = [[NSArray alloc] initWithArray:[UIFont fontNamesForFamilyName:[listOfFonts objectAtIndex:i]]];
    for (int j=0; j<[subFontTypes count]; j++) {
        NSLog(@"+----->Type: %@", [subFontTypes objectAtIndex:j]);
    }
    [subFontTypes release];
}
[listOfFonts release];

Con le SDK 2.2.1, sul mio simulatore, ho ottenuto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
Font Family: Courier
+----->Type: Courier
+----->Type: Courier-BoldOblique
+----->Type: Courier-Oblique
+----->Type: Courier-Bold
Font Family: AppleGothic
+----->Type: AppleGothic
Font Family: Arial
+----->Type: ArialMT
+----->Type: Arial-BoldMT
+----->Type: Arial-BoldItalicMT
+----->Type: Arial-ItalicMT
Font Family: STHeiti TC
+----->Type: STHeitiTC-Light
+----->Type: STHeitiTC-Medium
Font Family: Hiragino Kaku Gothic ProN
+----->Type: HiraKakuProN-W6
+----->Type: HiraKakuProN-W3
Font Family: Courier New
+----->Type: CourierNewPS-BoldMT
+----->Type: CourierNewPS-ItalicMT
+----->Type: CourierNewPS-BoldItalicMT
+----->Type: CourierNewPSMT
Font Family: Zapfino
+----->Type: Zapfino
Font Family: Arial Unicode MS
+----->Type: ArialUnicodeMS
Font Family: STHeiti SC
+----->Type: STHeitiSC-Medium
+----->Type: STHeitiSC-Light
Font Family: American Typewriter
+----->Type: AmericanTypewriter
+----->Type: AmericanTypewriter-Bold
Font Family: Helvetica
+----->Type: Helvetica-Oblique
+----->Type: Helvetica-BoldOblique
+----->Type: Helvetica
+----->Type: Helvetica-Bold
Font Family: Marker Felt
+----->Type: MarkerFelt-Thin
Font Family: Helvetica Neue
+----->Type: HelveticaNeue
+----->Type: HelveticaNeue-Bold
Font Family: DB LCD Temp
+----->Type: DBLCDTempBlack
Font Family: Verdana
+----->Type: Verdana-Bold
+----->Type: Verdana-BoldItalic
+----->Type: Verdana
+----->Type: Verdana-Italic
Font Family: Times New Roman
+----->Type: TimesNewRomanPSMT
+----->Type: TimesNewRomanPS-BoldMT
+----->Type: TimesNewRomanPS-BoldItalicMT
+----->Type: TimesNewRomanPS-ItalicMT
Font Family: Georgia
+----->Type: Georgia-Bold
+----->Type: Georgia
+----->Type: Georgia-BoldItalic
+----->Type: Georgia-Italic
Font Family: STHeiti J
+----->Type: STHeitiJ-Medium
+----->Type: STHeitiJ-Light
Font Family: Arial Rounded MT Bold
+----->Type: ArialRoundedMTBold
Font Family: Trebuchet MS
+----->Type: TrebuchetMS-Italic
+----->Type: TrebuchetMS
+----->Type: Trebuchet-BoldItalic
+----->Type: TrebuchetMS-Bold
Font Family: STHeiti K
+----->Type: STHeitiK-Medium
+----->Type: STHeitiK-Light

Continua...

Come eliminare NSLog() dai sorgenti XCode

<a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_Functions/Reference/reference.html#//apple_ref/c/func/NSLog">NSLog()</a> è una funzione utilissima durante le fasi iniziali di un progetto, per il testing e il debug di un’applicazione per Apple iPhone o, più in generale, in ambiente XCode. Essendo appunto una funzione, esattamente come le altre, la sua presenza si farà sentire anche quando rilasceremo (release) il nostro eseguibile. Diventa quindi necessario rimuovere, in qualche modo, tutte le righe di NSLog() dal nostro codice, sia perchè non più necessarie, sia perchè le chiamate a NSLog() potrebbero influire sulle performance della nostra applicazione, soprattutto se abbiamo inserito NSLog() all’interno di loop.

Escludiamo subito la soluzione del “cerca” ed “elimina”; perchè un domani ci potrebbero servire nuovamente. Escludiamo anche la soluzione del “cerca” e “commenta”, scomoda per lo stesso motivo di prima. Fortunatamente una soluzione pulita, semplice e corretta la troviamo sfruttando le istruzioni condizionali del compilatore. Quello che faremo, in pratica, e dire al compilatore di escludere – se si verifica una determinata condizione – durante la compilazione del nostro sorgente le righe che contengono NSLog().

Le direttive di compilazioni e le istruzioni condizionali del compilatore, sono uno strumento molto potente e diffuso. Chi proviene dallo sviluppo ANSI-C le conosce sicuramente molto bene e le avrà utilizzte in moltissime situazioni. La particolarità di queste “istruzioni” risiede nel fatto, sopra accennato, di essere viste dal compilatore e non dall’eseguibile. Questa loro caratteristica le rende utili in moltissimi casi e permette di risolvere problematiche altrimenti assai fastidiose.

Vediamo subito un esempio di codice che, come preannunciato, permette di “eliminare” dalla compilazione parti di codice, nel nostro caso NSLog():

1
2
3
4
5
6
#define ACTIVE_NSLOG 1
// se la costante ACTIVE_NSLOG è definita compila
// il blocco di codice compreso tra #ifdef e #endif
#ifdef ACTIVE_NSLOG
    NSLog( @" ... bla bla" );
#endif

Le istruzioni condizionali del compilatore fanno parte della stessa famiglia della #define; anch’esse, infatti, sono precedute dal carattere “cancelletto” (#). Nell’esempio mostrato abbiamo definito una costante ACTIVE_NSLOG; le successive righe di codice dicono al compilatore di “includere” la riga NSLog() solo se ACTIVE_NSLOG è definito. Se abbiamo avuto la cura, durante la stesura del nostro codice, di inserire le chiamate a NSLog() all’interno del blocco #ifdef ... #endif, basterà eliminare la definizione della costante ACTIVE_NSLOG per far sparire, alla prossima compilazione, tutti i nostri NSLog().

Una soluzione migliore e definitiva

Vediamo adesso come impostare l’ambiente XCode per migliorare ancor di più ciò che abbiamo fatto sopra! Prima di tutto scegliamo un nome di costante che useremo nei nostri progetti per escludere dalla compilazione NSLog(). Potete scegliere il nome che più vi piace, da DEBUG a MIO_DEBUG o quello che preferite. Aprite il vostro progetto, nuovo o vecchio. Inserite tutti gli NSLog() all’interno del blocco (o di un blocco):

1
2
3
#ifdef MIO_DEBUG
    NSLog( @" ... bla bla" );
#endif

Selezionate il file principale del vostro progetto, cliccate con il tasto destro e scegliete la voce Get Info.

getinfo

Si aprira la finestra con le informazioni sul progetto:

userdefine

Selezionate la scheda Build, verificate di essere in configurazione Debug (è questa la chicca), andate nella sezione User-Defined e aggiungete, tramite il bottone in basso a sinistra, un nuovo campo chiamato OTHER_CFLAGS. A questo assegnamoli il valore -DMIO_DEBUG=1. La sintassi è -D{mia define}=1.

Questa procedura ha due vantaggi:

  1. Non dobbiamo inserire nel codice la #define MIO_DEBUG 1, ma lo facciamo tramite le informazioni sul progetto. Quindi, quando andremo a compilare la versione di rilascio (quella senza gli NSLog()) non dobbiamo ricordarci di eliminare la riga #define MIO_DEBUG 1
  2. La costante è definita in relazione alla configurazione, nel nostro caso Debug. Quindi, passando alla configurazione di rilascio (release) la costante sarà assente e le righe con NSLog() non verranno compilate

Conclusioni

La procedura sopra descritta può essere utile in una moltidutine di altri casi che, con NSLog(), non hanno nulla a che fare. Le istruzioni condizionali del compilatore possono aiutarci in una vastissima gamma di contesti. Spesso sono utilizzate dai programmatori per determinare il tipo di sistema operativo, la versione, il target, la presenza di processori matematici, mantenendo uno stesso “identico” sorgente.

Per capirci, come esempio, possiamo utilizzre la nostra costante MIO_DEBUG anche per intervenire in altre zone del codice:

1
2
3
4
5
6
7
8
9
10
// se sono in debug vinco la partita
// con uno score di 100 invece che di 10000 :)
#ifdef MIO_DEBUG
    if( score == 100 )
#else
    if( score == 10000 )
#endif
    {
        [self haiVinto];
    }

Per completare, ecco alcuni esempi e varianti:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// più in generale esiste la
#if espressione
// simile alle if tradizionali, quindi con una espressione completa

// verifica se è definita una costante
#ifdef costante

// verifica se NON è definita una costante
#ifndef costante

// else
#else

// chiusura del blocco
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ad esempio...
#define DEBUG 1
#define MIA_ALTRA_COSTANTE 5
 
...
#if DEBUG
  // compila questo
#else
  // altrimenti compila quest'altro
#endif
 
#if MIA_ALTRA_COSTANTE > 4
  NSLog(@"...");
#endif
1
2
3
4
#ifndef INCLUDE_MIO_FILE
    #define INCLUDE_MIO_FILE
    #include "mio_file.h"
#endif

Continua...

iPhone FirstApp: indovina il numero – parte 1

Il primo sorgente che mi è passato tra le mani era scritto in Basic e consisteva in poche righe di codice, per me illuminanti. Era un semplice giochino che generava un numero casuale da 1 a 10 e, tramite l’input da tastiera, verificava che il numero inserito era maggione, minore o uguale al numero casuale. Nonostante la sua rozza semplicità rimane, per me, uno dei migliori esempi – semplici, divertenti e pratici – per spiegare a chi non sa nulla di programmazione cosa s’intenda effettivamente per “programma per computer”. Così ho pensato di riproporlo per Apple iPhone, magari aiuterà qualcuno…

Continua...

Objective-C: conversione dei tipi

Con alcuni linguaggi ad alto livello, come Javascript o PHP, dove i dati non sono tipizzati o comunque possono non esserlo, siamo “viziati” nel confrontare o trasformare interi e stringhe e vice versa, il tutto nascosto o manipolato dall’interprete (o compilatore). Ad esempio in Javascript esistono funzioni di “forzatura” (come parseInt() ad esempio) necessarie in particolari casi. Tuttavia in altre circostanze trattiamo gli interi senza preoccuparci di particolari conversioni (esplicite), come ad esempio:

1
2
3
var mioNumero = 5;
// ...
alert( "Il valore di mioNumero è " + mioNumero );

In Objective-C, invece, il tipo dato è importante e la conversione di tipo dev’essere esplicita. Oltra al casting (meglio typecasting) ci possiamo avvalere di funzioni e funzionalità specifiche per la conversione di tipo. Ad esempio ecco come convertire un intero in stringa:

1
2
3
4
int mioNumero = 5;
NSString *miaStringa = [NSString stringWithFormat:@"%d", mioNumero];
//
NSLog(@"miaStringa=%@ mioNumero=%i", miaStringa, mioNumero);

Al contrario, ecco come convertire una stringa in intero:

1
2
3
4
NSString *miaStringa = @"128";
int mioNumero = [miaStringa integerValue];
//
NSLog(@"miaStringa=%@ mioNumero=%i", miaStringa, mioNumero);

Continua...



Stop SOPA