Come avrei potuto non avere a che fare con Wordpress !? Provate un pò a dirmelo….il mitico CMS semplice da usare, gestire e facile da installare. Non ho mai parlato sul blog di wordpress, ne di quanto lo usi a lavoro..Tutti i giorni il caro inkiostro mi riempie sempre di nuovi e mirabolanti problemi da risolvere in wordpress, quindi mi sono fatto una discreta cultura.
Quello di cui volevo parlare è di come fare a rendere più chiara l’organizzazione dei custom field all’interno del pannello di amministrazione di wordpress, raggruppandoli semanticamente all’interno di un riquadro. Per intenderci dalla situazione in figura :
passare a questa:
Vediamo il codice php per realizzare quanto mostrato in figura:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| $box_dati_devme =
array(
"titolo" => array(
"name" => "titolo",
"std" => "",
"title" => "Titolo",
"description" => ""),
"url" => array(
"name" => "url",
"std" => "",
"title" => "URL",
"description" => ""),
"argomento" => array(
"name" => "argomento",
"std" => "",
"title" => "Argomento",
"description" => "")); |
Primo step: definire una variabile di tipo array in cui il primo elemento ha come chiave il nome del campo custom e come valore, un array che definisce il nome alcuni attributi del campo custom, nome, std, title e description.
1
2
3
4
5
6
7
8
9
10
11
| function box_dati_devme_boxes() {
global $post, $box_dati_devme;
echo '';
foreach($box_dati_devme as $meta_box) {
echo '';
echo '';
echo '';
echo '';
}
echo '<table style="width:99%"><tbody><tr><td class="left" style="width:25%;">'; $meta_box_value = get_post_meta($post->ID, $meta_box['name'], true); if($meta_box_value == "") $meta_box_value = $meta_box['std']; echo '<input type="hidden" name="'.$meta_box['name'].'_noncename" id="'.$meta_box['name'].'_noncename" value="'.wp_create_nonce( plugin_basename(__FILE__) ).'" />'; echo $meta_box['title']; echo '<br />'; echo '<label class="desc" style="font-size:10px;" for="'.$meta_box['name'].'_value">'.$meta_box['description'].'</label>'; echo '</td><td>'; echo '<textarea style="width:99%" rows="2" name="'.$meta_box['name'].'_value">'.$meta_box_value.'</textarea>'; echo '</td></tr></tbody></table>';
} |
Secondo step: definire una funziona in cui l’unica cosa da fare è aggiungere come variabile globale dopo $post il nome della variabile definita allo step uno e la stessa variabile come iteratore del foreach.
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
| function create_meta_box() {
global $theme_name;
if ( function_exists('box_dati_devme_boxes') ) {
add_meta_box('box_dati_devme', 'Boxe DevMe', 'box_dati_devme', 'post', 'normal', 'high');
}
}
function save_postdata( $post_id ) {
global $post, $box_dati_devme;
foreach($box_dati_devme as $meta_box) {
if ( !wp_verify_nonce( $_POST[$meta_box['name'].'_noncename'], plugin_basename(__FILE__) )) {
return $post_id;
}
if ( 'page' == $_POST['post_type'] ) {
if ( !current_user_can( 'edit_page', $post_id ))
return $post_id;
} else {
if ( !current_user_can( 'edit_post', $post_id ))
return $post_id;
}
$data = $_POST[$meta_box['name'].'_value'];
if(get_post_meta($post_id, $meta_box['name']) == "")
add_post_meta($post_id, $meta_box['name'], $data, true);
elseif($data != get_post_meta($post_id, $meta_box['name'], true))
update_post_meta($post_id, $meta_box['name'], $data);
elseif($data == "")
delete_post_meta($post_id, $meta_box['name'], get_post_meta($post_id, $meta_box['name'], true));
}
}
add_action('admin_menu', 'create_meta_box');
add_action('save_post', 'save_postdata'); |
Terzo step: nell’ultimo step ho racchiuso un pò di cose tutte assieme. Si definiscono 2 funzioni : la create_meta_box e la save_postdata. La prima viene richiamata dal framework di wordpress per creare il riquadro, contestualmente si definiscono il nome del riquadro che comparirà poi in pagine e si aggiunge il riferimento alla variabile definita nello step uno. La funzione save_postdata viene usata da wordpress per effettuare il salvataggio dei custom field inseriti al momento dell’inserimento e della modifica di un post. Infine si registrano le 2 funzioni php con le add_action di wordpress.
E’ chiaro che in presenza di pochi custom field si può procedere anche senza personalizzare il pannello; al contrario, con un centinaio di campi il tutto diviene più chiaro. Consiglio nel caso usiate questa soluzione, di definire la personalizzare dei campi all’interno di un file .php che terrete all’interno del tema che state usando, quindi importarlo all’interno del file function.php.
Prova il generatore qui.
Stay tuned.
Seconda parte dell’articolo su come scrivere programma che legge da un tag RFC e scrive su un tag RFC. Qui potete trovare quanto scritto sulla lettura da un tag NFC.
La parte che andremo ad analizzare prevede la scrittura di alcune informazioni su un tag NFC, attraverso l’interfaccia della nostra applicazione. Nello specifico andremo a scrivere i dati di un nuovo contatto della rubrica sul tag e successivamente potremo leggere quanto scritto con la funzionalità vista nell’articolo precedente.
Anche in questo caso la logica che sta dietro alla funzionalità è basata sugli eventi, in particolare, per la classe NFCWriter viene registrato un evento, il Tag Detection, che quanto catturato, esegue il codice contenuto al suo interno. Dall’interfaccia viene richiesto di inserire il testo da scrivere sul tag, si preme su OK e si avvicina il cellulare in prossimità del tag. A quel punto viene gestito l’evento che si preoccupa di stabilire una connessione con il tag NFC ed inviare.
Vediamo il codice che realizza quanto detto:
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
| public class NDEFWriter extends NDEFHandler {
Form previousScreen = null;
String fName = "No name";
public NDEFWriter(Form form) {
previousScreen = form;
}
public void targetDetectionMade(TargetProperties[] tProp) {
previousScreen.append("Target detected.\n");
if(tProp == null || tProp.length == 0) {
previousScreen.append("No TargetProperties found!\n");
}
NDEFTagConnection ndefTagConnection = null;
try {
previousScreen.append("Target mapping:"+tProp[0].getMapping()+"\n");
ndefTagConnection =NDEFUtil.getNDEFTAGConnection(tProp,previousScreen);
if(ndefTagConnection == null) {
previousScreen.append("Could not establish connection to card.\n");
return;
}
NDEFUtil.writeNDEFMessage(ndefTagConnection,previousScreen);
ndefTagConnection.close();
} catch (Exception e) {
if(ndefTagConnection != null) {
try {
ndefTagConnection.close();
} catch (IOException e1) {
previousScreen.append("Exception in closing connection:"+e1.toString());
}
}
previousScreen.append("Exception:\n"+e.toString()+"\n");
e.printStackTrace();
}
}
public String getFormattedName() {
return fName;
}
public void setFormattedName(String fName) {
this.fName = fName;
}
} |

Come potete vedere non è molto difficile realizzare un programma Java che sfrutti le potenzialità fornite dalla tecnologia NFC, tutta sta a conoscere un pò le API messe a disposizione dalla Nokia. Tutto il resto è Java, gestione degli eventi, ereditarietà, interfacce, etc etc. Un vero (buon) programmatore Java non troverà alcuna difficoltà a realizzare la maggior parte delle funzionalità.
Questo è tutto.
Il codice completo per far girare l’esempio lo trovato nelle SDK del Nokia 6131 NFC è necessario la registrazione sul sito per poter effettuare il download. Dopo di che cercate nella cartella examples.
Stay tuned. yo.
Tempo fa in questo post ho scritto come realizzare un programma starter per Symbian serie 8, cioè un launcher di un’applicazione al boot del cellulare. Oggi invece volevo farvi vedere l’analogo su serie 9, la nuova serie di Symbian installata su molti dei cellulari Nokia attualmente in commercio. Premesso che al momento del post precedente la documentazione sull’argomento non era molta, oggi invece esistono molti siti dove è possibile trovare informazioni sull’argomenti, a partire dallo wiki della nokia dove c’è praticamente tutto, per finire sulla pagine di google
.
Ma siccome le risorse in italiano non sono mai abbastanza allora volevo illustrare comunque la soluzione
A differenza della precedente versione con Symbian 9 è possibile realizzare l’autostart di un’applicazione usando il meccanismo dello "Startup Management List API" consultabile qui. L’idea di base di questa gestione consiste nel definire un file di risorse attribuendogli come nome l’UID del package che contiene l’applicazione. Tale file conterrà al suo interno alcuni dati di configurazione al fine di poter eseguire l’applicazione indicata all’avvio del programma. Vediamo in cosa consistono questi dati di configurazione:
1
2
3
4
5
6
| #include <startupitem.rh>
RESOURCE STARTUP_ITEM_INFO devme
{
executable_name = "!:\\sys\\bin\\devme.exe";
recovery = EStartupItemExPolicyNone;
} |
Bene. Subito una piccola precisazione. Come vedete il valore di executable_name coincide con un path, quello di installazione dell’applicazione. Ha all’inizio un punto esclamativo che sta ad indicare la destinazione intesa come unità di installazione. Chi ha installato un’applicazione per symbian sa che ad un certo punto viene chiesto di indicare la destinazione su cui installare il programma, se la memoria del telefono o eventuali memorie esterne. Ecco il ! riferisce quella destinazione. Se si vuole, ad esempio, imporre l’installazione sulla memoria del telefono il ! verrà sostituito con C.
Come vedete i dati di configurazione sono pochi e il commento viene da se.
Prossimo step consiste nell’aggiungere il riferimento del file appena creato all’interno del file di configurazione .mmp.
1
2
| START RESOURCE ..\DATA\APP_UID.rss
END |
Ed infine aggiungere le informazioni di configurazione nel file .pkg.
1
| "$(EPOCROOT)Epoc32\data\z\private\101f875a\import\apps\APP_UID.rsc" -"c:\private\101f875a\import\[APP_UID].rsc" |
Dove la prima parte della riga di configurazione indica il percorso delle SDK che si stanno utilizzando per la build corrente. Nel mio caso siccome sto usando Carbide come IDE posso utilizzare le variabili d’ambiente che mette a disposizione. Da notare che, mentre per un qualunque altro programma posso usare il ! per indicare la destinazione, per quanto riguarda l’autostart su serie 9 devo indicare C come destinazione…non solo, in aggiunta l’intero percorso dove vengono memorizzati questi tipi di file "C:\private\101f875a\import\".
Stay tuned, a presto.
Oggi ho visto in tv un servizio che parlava su come usare il proprio cellulare per effettuare piccoli pagamenti, il cosidetto telefonino/bancomat. Il funzionamento si basa sulla tecnologia Near Field Communication, ovvero un’evoluzione dell’ RFID la tecnologia che permette di far comunicare due dispositivi portanto in prossimità l’uno dell’altro. In questo articolo pubblicato sulle pagine di devme poco tempo fa, reperibile qui si parla di questa tecnologia, in particolare è possibile utilizzare il telefonino come fosse bancomato, nella modalità touch-to-pay: "avvicinando il cellulare sarà possibile utilizzarlo come una carta di credito. Le informazioni sensibili della carta sono memorizzate al suo interno in un elemento chiamato secure element. In sostanza funziona come una carta di credito senza contatto.E’ possibile visualizzare le informazioni informative classiche delle proprie transazioni".
Nello specifico in linea di principio basta scrivere i dati del proprio bancomat all’interno del cosidetto secure element e a quel punto sarà possibile, avvicinando il cellulare in prossimità di un dispositivo capace di leggere tag NFC, effettuare un’addebito sul proprio conto corrente. Pensateci, quale migliore comodità !!
Bene, analizziamo ora più da vicino, in un esempio molto semplice, come scrivere un programma che legge da un tag NFC e scrive su un tag NFC. Il programma è scritto in Java, l’IDE che utilizziamo per fare il test è Eclipse sul quale installeremo il plugin eclipseme che permette di sviluppare applicazione utilizzando le librerie J2ME.
Partiamo quindi lo scrivere la nostra midlet, DevMeNFCMidlet:
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
| public class DevMeNFCMidlet extends MIDlet {
Display display;
MainList list;
String[] actions = new String[]{"Read","Write","Show contacts"};
Image[] images = null;
protected void startApp() throws MIDletStateChangeException {
display = Display.getDisplay(this);
list = new MainList("Select action to do:", List.EXCLUSIVE,actions,images,this,null);
display.setCurrent(list);
}
protected void pauseApp() {}
public void destroyApp(boolean arg0) throws MIDletStateChangeException {
notifyDestroyed();
}
/**
* Helper method to change the current displayable
*
*/
public void setToDisplay(Displayable dspl) {
display.setCurrent(dspl);
}
} |
Nel caso vi foste persi qualcosa sulle Midlet Java, in breve, è un’applicazione che gira su sistemi su cui è presente la J2ME Virtual Machine. Per creare una Midlet è sufficente estendere la propria classe con la classe Midlet, messa a disposizione dal Wireless Toolkit. L’estensione impone l’implementazione di alcuni metodi dal momento che la classe Midlet è una classe astratta. Il metodo StartApp() viene richiamato al momento del lancio dell’applicazione e nel nostro caso crea una lista con 3 opzioni: Read, Write e Show Contacts. La nostra applicazione legge da un tag NFC virtuale, emulato per intenderci e scrive sullo stesso tag. L’emulazione viene messa a disposizione dalle librerie opzionali, Contactless Communication API scaricabili dal sito della nokia, che sarà dunque necessario rendere disponibili all’interno del progetto in eclipse. Lanciando l’applicazione avremo:

Ciò che si vede è l’interfaccia dell’emulatore con la midlet caricata e pronta per essere eseguita. L’emulatore sostanzialmente è un cellulare, nello specifico il nokia 6131 che possiede al suo interno un tag NFC con le relative librerie. Per avviare l’applicazione è sufficente cliccare il bottone (sul cellulare) in corrispondenza della voce Select.
L’applicazione come detto mostra il menù con 3 voce selezionabili, in particolare se selezioniamo l’opzione Read saremo in grado di leggere da un tag NFC un certo contenuto. Nella nostra simulazione, i tag NFC sono virtuali e vengono mostrati sulla destra nell’interfaccia dell’emulatore. Alcuni di questi sono attivi, connessi altri disconnessi. Per effettuare una simulazione di lettura trasciniamo il tag NFC attivo all’interno del cellulare come mostrato in figura. A quel punto il contenuto del tag viene mostrato all’interno del telefono.
Ma diamo un occhiata al codice che realizza la funzionalità. L’idea che sta dietro alla logica è molto semplice. Si registra la classe del Reader per un determinato evento, ovvero per l’evento Tag Detection. Rilevato il tag viene richiamato un metodo della classe che stabilisce una connessione con il tag e legge il messaggio inviato dal tag. Il contenuto del messagio viene visualizzato sul display del cellulare. Di seguito incollo il codice della classe Reader.
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
| public class NDEFReader extends NDEFHandler {
Form previousScreen = null;
public NDEFReader(Form form) {
super();
previousScreen = form;
}
public void targetDetectionMade(TargetProperties[] tProp) {
previousScreen.append("Target detected.\n");
if(tProp == null || tProp.length == 0) {
previousScreen.append("No TargetProperties found!\n");
}
NDEFTagConnection ndefConnection = null;
try {
previousScreen.append("Target mapping:"+tProp[0].getMapping()+"\n");
ndefConnection =NDEFUtil.getNDEFTAGConnection(tProp,previousScreen);
if(ndefConnection == null) {
previousScreen.append("Could not establish connection to card.\n");
return;
}
NDEFUtil.readNDEFMessage(ndefConnection,previousScreen);
ndefConnection.close();
} catch (Exception e) {
if(ndefConnection != null) {
try {
ndefConnection.close();
} catch (IOException e1) {
previousScreen.append("Exception in closing connection:"+e1.toString());
}
}
previousScreen.append("Exception:\n"+e.toString()+"\n");
e.printStackTrace();
}
}
public String getFormattedName() {
return null;
}
public void setFormattedName(String fName) {}
} |
Il metodo targetDetectionMade realizza tutto quello che è stato detto nel paragrafo precedente. Per quanto riguarda il resto del codice rimando ai prossimi articoli. Stay tuned! yo