Per chi utilizza come me un unico account gmail per gestire anche altri account utilizzando Mail.app, sa che c'è una cosa fastidiosa: rispondendo alle mail il mittente viene sempre impostato su gmail senza possibilità di sceglierne altri.
Anche se impostate gli altri account su Mail.app, se la mail è stata inviata al vostro account @libero.it e cliccate su Rispondi, il mittente verrà impostato sempre su gmail.
Per ovviare a questo problema basta andare in Preferenze -> Account sul vostro account gmail nel campo "Indirizzo e-mail" aggiungete gli altri vostri indirizzi separati da virgola.
Magicamente in questo modo facendo Rispondi verrà impostato il giusto mittente, cioè quello a cui era indirizzata la mail!!
Marco Patania
"Quelli che s'innamorano di pratica senza scienza son come il nocchiere, che entra in naviglio senza timone o bussola, che mai ha certezza dove si vada." L. da Vinci
martedì 15 gennaio 2013
giovedì 20 settembre 2012
WSDL array complex type to php associative array
I've a wsdl file with this complexType:
I write this function to convert above object to an associative array:
<complexType name="ArrayOfString">On my soap client I call soap server in this manner:
<complexContent>
<restriction base="soapenc:Array">
<attribute ref="soapenc:arrayType"
wsdl:arrayType="string[]"/>
</restriction>
</complexContent>
</complexType>
$client = new SoapClient('marco.wsdl', array('trace' => 1,'encoding'=>'ISO-8859-1'));My server function log this request:
$data['user']['usr_id'] = 8;
$data['user']['username'] = 'marco';
$data['event'] = 'delete';
$result = $client->__soapCall('notify', array($data));
SoapServer->notify: stdClass::__set_state(array(Php map my complexType to an object!
'item' =>
array (
0 =>
stdClass::__set_state(array(
'key' => 'user',
'value' =>
stdClass::__set_state(array(
'item' =>
array (
0 =>
stdClass::__set_state(array(
'key' => 'usr_id',
'value' => '8',
)),
1 =>
stdClass::__set_state(array(
'key' => 'username',
'value' => 'marco',
)),
),
)),
)),
1 =>
stdClass::__set_state(array(
'key' => 'event',
'value' => 'delete',
)),
),
))
I write this function to convert above object to an associative array:
function getArrayFromXSDObject($map) {And now the log output is:
if( !isset($map->item) || empty($map->item) )
return array();
$ary = array();
foreach($map->item as $obj) {
if(is_object($obj->value)) {
$ary[$obj->key] = $this->getArrayFromXSDObject($obj->value);
} else {
$ary[$obj->key] = $obj->value;
}
}
return $ary;
}
array (PS: if you want a very good library to handle SOAP and WSDL try to look at NuSOAP or any other, but NOT soap php module!
'user' =>
array (
'usr_id' => '8',
'username' => 'marco',
),
'event' => 'delete',
giovedì 23 agosto 2012
Comandi SSH che si bloccano misteriosamente
Come perdere una giornata per risalire ad un problema apparentemente incomprensibile.
La settimana scorsa ho cambiato il modem comprando un Netgear DGN2200 (che vi consiglio per la completezza, con possibilità di collegare un hardisk USB e uno dei pochi con pulsante per disattivare il WiFi).
Installato e funzionante. Tutto perfetto. Quasi.
Ieri mi collego ad una VPN di un cliente e ad alcuni server in ssh. Lancio qualche processo batch di analisi e trasferimento dati. Tutto bene, finchè non lancio un comando pericolosissimo :) :
Faccio alcune prove ricollegandomi, ed in pratica qualsiasi comando mandi in output più di qualche linea blocca tutto (more, tail ...).
Inizio il percorso di ricerca della fonte del problema.
1- Penso a qualche problema di rete o connessione, quindi provo a collegarmi con il cellulare 3G ed il problema non si presenta. Scartata
2- Avendo cambiato da poco l'operatore ADSL ed essendo passato a Telecom Alice mi viene in mente qualche filtro sulle vpn, ma provo a collegarmi ad un'altra vpn di un altro cliente e questa funziona benissimo. Scartata
3- Qualche parametro di configurazione particolare della VPN: allora confronto i file di configurazione e vedo che quella che funziona è TCP mentre quella che da problemi è UDP. BINGO
Nei meandri del mio cervelletto era rimasta una qualche nozione di "Reti di calcolatori" che mi ricordava qualche differenza nel trasporto dei pacchetti tra i due protocolli ed essendo il problema un interruzione senza messaggio, poteva benissimo essere qualche pacchetto corrotto. La conferma la trovo su wikipedia alla voce UDP :
Il valore impostato era 1456 bytes (WAN Setup del pannello di amministrazione), mentre il valore consigliato per le connessione adsl di tipo PPPoE, come Alice di Telecom, è 1492.
Impostato quel valore tutto ha funzionato a meraviglia!!
Mistero risolto!
La settimana scorsa ho cambiato il modem comprando un Netgear DGN2200 (che vi consiglio per la completezza, con possibilità di collegare un hardisk USB e uno dei pochi con pulsante per disattivare il WiFi).
Installato e funzionante. Tutto perfetto. Quasi.
Ieri mi collego ad una VPN di un cliente e ad alcuni server in ssh. Lancio qualche processo batch di analisi e trasferimento dati. Tutto bene, finchè non lancio un comando pericolosissimo :) :
ls -lMi visualizza 2 righe e poi si blocca senza alcun messaggio, neanche di timeout connessione interrotta.
Faccio alcune prove ricollegandomi, ed in pratica qualsiasi comando mandi in output più di qualche linea blocca tutto (more, tail ...).
Inizio il percorso di ricerca della fonte del problema.
1- Penso a qualche problema di rete o connessione, quindi provo a collegarmi con il cellulare 3G ed il problema non si presenta. Scartata
2- Avendo cambiato da poco l'operatore ADSL ed essendo passato a Telecom Alice mi viene in mente qualche filtro sulle vpn, ma provo a collegarmi ad un'altra vpn di un altro cliente e questa funziona benissimo. Scartata
3- Qualche parametro di configurazione particolare della VPN: allora confronto i file di configurazione e vedo che quella che funziona è TCP mentre quella che da problemi è UDP. BINGO
Nei meandri del mio cervelletto era rimasta una qualche nozione di "Reti di calcolatori" che mi ricordava qualche differenza nel trasporto dei pacchetti tra i due protocolli ed essendo il problema un interruzione senza messaggio, poteva benissimo essere qualche pacchetto corrotto. La conferma la trovo su wikipedia alla voce UDP :
A differenza del TCP, l'UDP è un protocollo di tipo connectionless, inoltre non gestisce il riordinamento dei pacchetti né la ritrasmissione di quelli persiTutto si fa più chiaro quando mi richiama un mio amico sistemista (Giancarlo) che dopo avergli spiegato la rava e la fava mi chiede il valore dell'MTU (Maximun Transmit Unit) del modem (PS: molti ingegneri rinominati che conosco non avrebbero ricollegato l'MTU con il trasporto dei pacchetti nemmeno dopo anni di analisi e Giancarlo non è ingegnere, ma si ingegna molto con passione)
Il valore impostato era 1456 bytes (WAN Setup del pannello di amministrazione), mentre il valore consigliato per le connessione adsl di tipo PPPoE, come Alice di Telecom, è 1492.
Impostato quel valore tutto ha funzionato a meraviglia!!
Mistero risolto!
giovedì 21 giugno 2012
Wordpress get_option on multisite
If you have a plugin and you want to get its global option (ie that are stored into wp_options table, if you are into a blog, get_option retrieve value from wp_$blogid_options) on multisite installation, you have two solution:
2. add filters for each option you want to retrieve:
- find and replace all get_option into plugin with my_get_option defined in this manner:
function my_get_option($key) {
if(is_multisite()) {
switch_to_blog(SITE_ID_CURRENT_SITE);
$option = get_option($key);
restore_current_blog();
return $option;
} else {
return get_option($key);
}}
2. add filters for each option you want to retrieve:
function myoption() {
if(is_multisite()) {
switch_to_blog(SITE_ID_CURRENT_SITE);
$option = get_option($key);
restore_current_blog();
return $option;
} else {
return get_option($key);
}
add_filter( 'pre_option_' . $key, 'myoption' );
mercoledì 20 giugno 2012
Batch Import blog on wordpress multisite
There is a bug that deny to import blog in batch mode with wpmu_create_blog or create_empty_blog.
If you try this code:
I tried this patch with Wordpress 3.1.4 and it works.
The file to modify is wp-includes/wpmu-functions.php adding this line after function wpmu_create_blog:
If you try this code:
define('WP_USE_THEMES', false);It creates only first blog, with relative table wp_$blog_id_terms/options ..., caused by this bug.
require_once('../wp-blog-header.php');
if(!defined('WP_IMPORTING')) define('WP_IMPORTING', true); // required to bypass control existing_user_email
foreach($toImport as $blog) {
$blog_id = wpmu_create_blog(
DOMAIN_CURRENT_SITE,
PATH_CURRENT_SITE . $blog['path'],
$blog['title'],
1,
'',
SITE_ID_CURRENT_SITE
);
}
I tried this patch with Wordpress 3.1.4 and it works.
The file to modify is wp-includes/wpmu-functions.php adding this line after function wpmu_create_blog:
global $wpdb, $wp_queries;and after switch_to_blog($blog_id); this code:
if($wp_queries){Same with create_empty_blog
$pattern = '/' . $wpdb->base_prefix . '(\d+)/';
$prefix = $wpdb->base_prefix . $blog_id;
$wp_queries = preg_replace($pattern,$prefix, $wp_queries);
}
lunedì 16 aprile 2012
PHP SimpleXML, empty node and CDATA
Php is a great language, but sometimes I come across these little carelessness or superficiality in implementing some of its core libraries.
UPDATE 21-04-2012: another problem is that I can't serialize SimpleXML object (ie in the session variable it generate this error "session_start() [function.session-start]: Node no longer exists")
Now the problem is how SimpleXML treat the empty node. If I've this php code:
The xml echoed change this:
Another problem is how SimpleXML manage CDATA, but you can use LIBXML_NOCDATA to force SimpleXML to store it like string, in this manner:
UPDATE 21-04-2012: another problem is that I can't serialize SimpleXML object (ie in the session variable it generate this error "session_start() [function.session-start]: Node no longer exists")
Now the problem is how SimpleXML treat the empty node. If I've this php code:
$xmlIdentify = <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<PatronIdentify>
<Username></Username>
<Password></Password>
<Msg></Msg>
</PatronIdentify>
EOF;
$identify = new SimpleXMLElement($xmlIdentify);
$identify->Username[0] = 'myusername';
$identify->Password[0] = 'mypwd';
echo $identify->asXML();
The xml echoed change this:
<Msg></Msg>to:
<Msg/>There is LIBXML_NOEMPTYTAG, a libxml option to change this behavior, but it works only with DOMDocument::save and DOMDocument::saveXML functions.
Another problem is how SimpleXML manage CDATA, but you can use LIBXML_NOCDATA to force SimpleXML to store it like string, in this manner:
$identify = new SimpleXMLElement($xmlIdentify, LIBXML_NOCDATA);Without this option you have to cast object to string, like this:
$username = (string) $identify->Username[0];If you need to combine two or more options, you can use pipe:
$identify = new SimpleXMLElement($xmlIdentify, LIBXML_NOEMPTYTAG | LIBXML_NOCDATA);

martedì 27 marzo 2012
Resoconto Codemotion 2012
Anche quest'anno ho avuto la fortuna di poter partecipare all'evento Codemotion 2012 a Roma ed ho assistito a diversi talk interessanti.
Ho notato un notevole aumento di partecipanti e spesso ho dovuto seguire i talk in piedi causa sovraffollamento.
Mi ha sorpreso l'aria frizzante che ho respirato in questi 2 giorni (non sto parlando ovviamente dell'aria all'interno dell'aule affollate, il cui odore vi lascio immaginare ;)) : molte aziende erano presenti con il loro "box" in cui lasciare il proprio curriculum e con molte era possibile fare subito un colloquio di lavoro. Per non parlare delle startup che presentavano i loro prodotti e le loro idee, alcune in cerca di sviluppatori o addirittura di co-fondatori!
Diverse offerte di lavoro e qualche disperato indossava una maglietta in cui elencava le figure professionali di cui aveva bisogno oppure con un cartello al collo con scritto "Cercasi sviluppatore ruby!" :D.
Poi c'era la sezione gaming in cui si poteva vedere come viene sviluppato un videogioco e chiedere informazioni a designer e sviluppatori.
Insomma una bella carica di positività che di questi tempi oramai è rara come la pioggia ;).
Prima del resoconto dei talk che ho seguito volevo elencare le cose che, secondo me, si potrebbero migliorare per il prossimo anno:
- In quasi tutti i talk alle domande finali molte persone incominciavano ad alzarsi ed uscire, impedendo di sentire sia le domande sia le risposte
- la rete wifi mi è sembrata sovraccarica, anche alcuni talk hanno accusato la lentezza della rete
Sono solo dettagli, perchè l'organizzazione ha comunque sfiorato l'eccellenza e non c'è che da fare i complimenti agli organizzatori!
Unica pecca non dovuta all'organizzazione: avevo invitato una mia amica, la cui azienda per cui lavora è in difficoltà, a portare i suoi CV e provare a fare qualche colloquio. Purtroppo ad uno di questi, con un'azienda multinazionale, il tipo ha fatto sfoggio della sua arroganza provandoci oltretutto spudoratamente. Certa stupidità maschile non finirà mai di stupirmi.
Veniamo al resoconto dei talk che ho seguito:
23 marzo
Da web a mobile...senza spargimenti di sangue di @mariocartia: carrellata dei tools di sviluppo per creare applicazioni web, purtroppo poco approfondita e non ha detto niente che già non conoscessi. Più indicata per studenti alle prime armi.
Dal modello relazionale al Grafo: cosa cambia? di @afocareta: introduzione dei database a grafo ben fatta che ha illustrato purtroppo solo i lati positivi, che comunque mi sono sembrati notevoli e mi ha incuriosito, approfondirò OrientDB il cui creatore oltretutto è italiano. Mi sarebbe piaciuto sapere in quali contesti sono perfettamente a suo agio e viceversa in quali riscontrano problemi questi tipi di database.
GIT Happens di @cirpo: questa è stato un di quei talk in cui senti tutto ciò che vorresti ti fosse detto sulla tecnologia in questione ;)
Bravo Alessandro a spiegare le problematiche incontrate con Git per chi proviene da Subversion et simili. Ed io mi sono ritrovato completamente nel racconto della sua storia :)
Get your code into the Cloud with OpenShift di Eric D. Schabell: presentazione interessante di questo prodotto cloud di Redhat per creare ambienti server belle e pronti in pochi click. E' un servizio simile ad Orchestra.io per PHP e Engineyard per Ruby in cui viene utilizzato git per il deploy automatico sul server, ma supporta molte più tecnologie: Java, Ruby, PHP, Perl e Python più alcuni database sql e nosql. Quello che non sono riuscito a capire sono i limiti della versione free (la mia comprensione dell'inglese è durata finchè ha utilizzato il microfono, poi per problemi audio se l'è tolto ed ho perso il filo :( ) ed anche sul sito non viene specificato molto. Mi pare adatta per creare facilmente server per prototipi o forse qualche demo.
Come partire da un'idea e trasformarla in un business di @FilippoToso: finalmente un talk di un programmatore "normale" che ha raccontato gli errori più comuni nel cercare di vendere i suoi prodotti software e le cose da fare per non sbagliare. Mi ci sono ritrovato molto nella sua presentazione e lui è molto bravo, non mi meraviglia il fatto che adesso lavori nel marketing ;)
24 marzo
Accesso e analisi di Open Data: come gestire l’anarchia dei formati di Banchero, Piccozzi, Minardi: sono arrivato che era già iniziata ed a parte qualche spunto interessante mi è sembrato che abbiano presentato più una tesi. Il problema dell'import dei dati eterogenei risolto con input umani sulla semantica dei dati mi pare scontato, e gli accenni di soluzioni in prolog erano troppo basilari. Comunque una buona introduzione all'argomento per chi ne è a digiuno.
Client-side MVC con Backbone.JS di @MicheleBertoli: anche questa è stato un talk ben fatto in cui è stata presentata questa libreria javascript che cerca di risolvere i problemi dei progetti medio grandi (separazione dei vari layer, gestione di model, tempating, routing) e Michele ha condotto benissimo introducendo nel modo giusto ogni aspetto. La proverò sicuramente.
Enter the App era with Ruby on Rails di @mattteocollina: la necessità di scrivere applicazioni REST oramai è all'ordine del giorno, quindi ero curioso di vedere la soluzione trovata da RoR. Matteo ha introdotto un po' l'argomento poi ha fatto vedere l'implementazione utilizzando Cucumber, un progetto interessante di BDD. Ben spiegato, forse un po' troppi wow ;), ma nella mia eterna indecisione tra python e ruby, questo talk mi ha quasi del tutto convinto nel dare una seria possibilità a ruby per il mio prossimo progetto.
Nel pomeriggio c'erano diversi talk interessanti, ma il venerdì sera avevo fatto i bagordi e dovendo fare 2 ore e mezzo di macchina sono partito all'ora di pranzo e spero di vederne i video online.
Con questo mio articolo spero di invogliare nuovi partecipanti per l'edizione 2013!!
Ci vediamo al prossimo Codemotion!

Iscriviti a:
Post (Atom)