Inviare notifiche Prowl utilizzando CURL

27 08 2009

Prowl e’ un progetto interessante: un sistema di notifiche push per iPhone che si interfaccia col piu’ famoso sistema di notifica Growl (per Mac e Windows).

Prowl fornisce anche una serie di API, utili per mandare notifiche Push agli iPhone registrati. Viene fornito anche uno script di esempio in Perl.

Io preferisco una soluzione piu’ ’scarna’ ma immediata: utilizzando CURL e’ possibili inviare una notifica con una sola riga di codice:


curl -X POST -d"apikey=APIKEY" -d"application=Test" -d"event=Messaggio" -d"message=Test" https://prowl.weks.net/publicapi/add

sostituite naturalmente la parola APIKEY con la vostra chiave API, reperibile a Questo Indirizzo.





Dreamhost: personalizzare php.ini

22 03 2009

Suggerimento rapidorapido pescato dal forum di supporto di Dreamhost.

Nel caso si abbia la necessità di personalizzare il PHP.INI, ad esempio (come è servito a me) per aumentare il timeout di uno script, la procedura è questa:

  1. Se non presente, creare una directory ‘cgi-bin’ all’interno della directory che ospita il dominio (mkdir ~/domain.com/cgi-bin/)
  2. Nella home del proprio utente, creare un file (php_update.sh) contenente il seguente script:
    #/bin/sh
    
    CGIFILE="$HOME/dominio.com/cgi-bin/php.cgi"
    INIFILE="$HOME/dominio.com/cgi-bin/php.ini"
    
    cp /usr/local/bin/php "$CGIFILE"
    cp /etc/php/php.ini "$INIFILE"
    
    perl -p -i -e '
    s/.*post_max_size.*/post_max_size = 100M/;
    s/.*upload_max_filesize.*/upload_max_filesize = 100M/;
    s/.*max_execution_time.*/max_execution_time = 600/;
    s/.*memory_limit.*/memory_limit = 90M/;
    ' "$INIFILE"
    
  3. Renderlo eseguibile (chmod +x php_update.sh) ed eseguirlo (./php_update.sh).
  4. Aggiornare il file .htaccess nella root del sito (o crearlo se non presente) e aggiungere la riga seguente: “AddHandler php-cgi .php” (senza i “)
  5. Aggiungere lo script al crontab in modo da farlo eseguire a scadenza settimanale, in modo da mantenere la propria copia locale di php.ini aggiornata con quello principale.




Gita al Genius Bar

17 03 2009

genius-barIeri, improvvisamente e inaspettatamente dopo 7 mesi di servizio ineccepibile,  il mio iPhone ha deciso di trasformarsi in un iPod Touch: l’audio delle telefonate misteriosamente sparito (dallo speaker interno, dal vivavoce, dalle cuffie e dall’auticolare BT), presente invece in tutte le altre funzionalita’.

Dopo aver provato reset vari, ripristino e riti voodo desisto e chiamo il servizio clienti Apple (199 120 800).
Vengo accolto da una signorina che, senza nemmeno dirmi ‘buongiorno’ mi chiede numero di serie dell’iPhone, nome, cognome, indirizzo email, numero di cellulare e numero di scarpe: avuti i dati diventa improvvisamente gentile e mi chiede di illustarle il problema.

Le spiego il malfunzionamento e lei mi mette davanti a 2 scelte: prenotare il ritiro da parte di un corriere del telefono e riceverlo riparato entro 5 giorni oppure (essendo a Roma) prenotare un appuntamento al Genius Bar nell’AppleStore del centro commerciale Roma Est.

Scelgo la seconda e la sera, uscito dall’ufficio, mi sciroppo una ventina di chilometri per raggiungere il centro commerciale.

L’AppleStore come al solito e’ talmente pieno di gente da dover quasi sgomitare per raggiungere il GeniusBar, dietro le casse: gente che, oltre a osservare-toccare-provare i prodotti, inaspettatamente per il periodo economico non proprio felice COMPRA. :-)

Mi accoglie Paolo, ‘Apple Specialist’ al quale spiego nuovamente il problema: prende in consegna l’iphone, lo scruta con un un oggetto simile a un otoscopio (forse per verificare i famosi sensori di umidita’?), fa un paio di telefonate di prova e poi conclude con un laconico “Ok, non funziona, te lo cambio.“.

10 minuti dopo esco dall’apple store con un iPhone nuovo (leggi ‘rigenerato’), senza graffi e per di piu’ con la batteria sicuramente in uno stato migliore del precedente.

Che dire? Lode a Apple per l’ottima assistenza che, non smettero’ mai di dirlo, e’ fra le motivazioni che giustificano pienamente i prezzi nettamente piu’ alti rispetto alla concorrenza.





Google, finalmente il supporto nativo per la sincronizzazione di Contatti e Calendari su iPhone

9 02 2009

Google ha finalmente  introdotto la possibilità di sincronizzare ‘OverTheAir’ contatti e calendari del proprio account su iPhone, senza utilizzare servizi come NuevaSync.

Su questa pagina tutti i dettagli sulla configurazione.





Migrare un DataBase da MySQL a MS SQLServer 2000

3 02 2009

La domanda su come fare mi è stata posta oggi in ufficio, e la risposta non posso che prenderla dalla pagina dedicata su TechNet:

Di seguito viene riportata una procedura per configurare Microsoft SQL Server al fine di migrare il database MySQL.

1. Installare il supporto MyODBC, disponibile all’indirizzo http://www.mysql.com/

2. Durante l’installazione viene visualizzata la finestra di dialogo seguente:


      Configurare le impostazioni ODBC utilizzando le informazioni seguenti:
      Windows DSN name: test
      Description: Database di prova
      MySQL Database: test
      Server: seawolf.microsoft.com
      User: cgunn
      Password: my_password
      Port: 3306
      Nel caso delle impostazioni precedenti, il nome specificato nel campo “Windows DSN name” deve essere univoco nel computer che esegue la connessione, l’impostazione relativa al server può essere un nome di dominio completo (assicurarsi che sia disponibile un sistema di risoluzione dei nomi, per esempio tramite DNS) oppure un indirizzo IP.

    3. Quindi eseguire l’Importazione/Esportazione guidata DTS. Dal gruppo di programmi Microsoft SQL Server selezionare Importazione ed esportazione dati. Verrà visualizzata la finestra di dialogo seguente.

        Fare clic su Avanti, quindi proseguire con il passaggio successivo.

      4. Fornire le informazioni necessarie sull’origine dei dati: queste informazioni devono essere MySQL come origine dei dati ODBC e test come DSN del sistema. Quindi, fornire le credenziali di accesso, il nome utente e la password mostrati nella successiva finestra di dialogo, infine fare clic su Avanti.

        5. Fornire i dettagli della connessione di destinazione, come mostrato nella finestra di dialogo seguente, quindi fare clic su Avanti.

          6. La finestra di dialogo Copia tabella o query consente di selezionare gli oggetti del database dall’origine, in questo caso MySQL. Selezionare Copia tabelle e viste dal database di origine. È opportuno rammentare che MySQL non supporta le viste pertanto, selezionando questa opzione, verranno copiati solo gli oggetti tabella, come mostrato di seguito. Fare clic su Avanti per continuare.

            7. Verrà visualizzata la finestra di dialogo Seleziona tabelle e viste di origine, in cui è possibile selezionare le tabelle di origine e quelle di destinazione.

              8. Fare clic sul pulsante con i trattini per eseguire la trasformazione dei dati, come mostrato nella finestra di dialogo seguente Mapping e trasformazioni di colonna.

                  In questa finestra di dialogo vengono abbinati i tipi di dati di origine e di destinazione e vengono selezionati i campi di dati Null. Al termine, fare clic su OK.
                  Verrà visualizzata la finestra di dialogo Salva, pianifica e replica pacchetto, che consente di pianificare la migrazione fuori degli orari di punta e di salvare il pacchetto DTS in percorsi e formati diversi.

                9. La finestra di dialogo Salva pacchetto DTS fornisce due tipi di password per il pacchetto DTS. La prima password è quella del proprietario e consente di proteggere tutte le informazioni sugli utenti e sulle password incluse nel pacchetto, mentre la password dell’utente consente di eseguire il pacchetto e impedisce qualsiasi esecuzione non autorizzata, come mostrato di seguito. Fare clic su Avanti per continuare.

                  10. Infine, la finestra di dialogo Completamento della Importazione/Esportazione guidata DTS riepiloga le opzioni selezionate nella procedura guidata.

                      Fare clic su Fine per iniziare la migrazione dei dati.

                    11. La finestra di dialogo Esecuzione pacchetto visualizza lo stato di ogni attività mentre viene eseguita. Un segno di spunta verde indica il completamento di un’attività. Se l’esecuzione di un’attività non riesce e l’errore interrompe il processo, verrà visualizzata una finestra che riporta le informazioni sull’errore.





                      .NET: effettuare query SQL su DataTable in memoria

                      2 02 2009

                      Scenario: realizzazione di un sistema di ‘aggregazione dati’ in grado di caricare in memoria dati da fonti diverse (Db SQLServer/Oracle/MySQL, files Excel, Db Access) ed utilizzarli per realizzare semplici ‘reports’.

                      Riempire di dati le DataTables e’ cosa da poco, aggregarle all’interno di un DataSet e’ ancora piu’ semplice, comincia a saltar fuori qualche difficolta’ quando arriva il momento di permettere agli utenti di  ‘interrogare’ il DataSet utilizzando una sintassi ‘SQL-Like’: soluzione ottima per l’utente finale con una minima infarinatura di Structured Query Language, difficile da realizzare senza scomodare LINQ e il Framework 3.5.

                      Per fortuna ci viene incontro Emmet Gray, ottimo programmatore che ha realizzato una classe che implementa un engine SQL minimale utilizzabile sui DataSet: SQL_Engine.

                      L’utilizzo di tale classe e’ straordinariamente semplice: una volta riempito il nostro DataSet con le tabelle contenenti i dati da interrogare, basta instanziare l’oggetto passando al constructor il dataset

                      
                      Dim sc As New SQL_Engine.SelectCommand(ds)
                      

                      e richiamare il metodo ‘Execute’ (passando come parametro la query da eseguire) , che si occupera di restituire una DataTable contenente i risultati

                      
                      Dim dt As DataTable = sc.Execute(query)
                      




                      iUI, framework per interfacce web compatibili con iPhone

                      8 01 2009

                      Leggo questa richiesta nei commenti di un post dedicato a BloggerSync:

                      [...] realizzare una pagine navigabile con iphone, è solo un probelma di dimensioni e css.. ??
                      Puoi indicarmi qualche risorsa in merito per imparare qualcosa ? [...]

                      Ultimamente sto realizzando delle semplici Web Applications per iPhone e sto utilizzando iUI, un framework che, con un uso intensivo di Javascript punta alla realizzazione di applicazioni web con look&feel assolutamente simile a quello delle applicazioni ’stand-alone’.

                      L’utilizzo e’ estremamente semplice, la documentazione e gli esempi presenti aiutano non poco: buon divertimento!

                      http://code.google.com/p/iui/





                      Leopard su iBook G4: Safari 3.2.1 e CPU al 100%?

                      22 12 2008

                      Ho installato Leopard sul mio iBook G4 gia’ da qualche tempo, senza riscontrare nessun problema.

                      Tuttavia, dopo l’ultimo aggiornamento di Safari (che ha portato il browser alla versione 3.2.1) ho iniziato a notare un fastidioso comportamento: dopo qualche minuto di utilizzo, il browser di mamma Apple iniziava a impegnare il processore in maniera anomala, bloccando nel contempo anche la navigazione. L’unico modo per risolvere il blocco si riduceva a una ‘chiusura forzata’ e al restart del browser.

                      Dopo alcune prove, sono riuscito a restringere la ricerca del problema alle nuove funzionalita’ introdotte in questa ultima versione, e in particolare al ‘filtro anti-phishing’ (nella tab ‘Sicurezza’ delle preferenze di Safari):

                      immagine-1

                      Disabilitando questa utile funzionalita’ (che ho potuto verificare dare problemi anche su altre macchine con processore PowerPC, mentre funziona senza alcun intoppo sul mio MacMini Intel) Safari ricomincia a funzionare senza blocchi.

                      In attesa del prossimo aggiornamento di Safari…:-)





                      PHP Snippets: copiare ricorsivamente una directory

                      15 12 2008
                      
                      function full_copy( $source, $target )
                          {
                              if ( is_dir( $source ) )
                              {
                                  @mkdir( $target );
                      
                                  $d = dir( $source );
                      
                                  while ( FALSE !== ( $entry = $d->read() ) )
                                  {
                                      if ( $entry == '.' || $entry == '..' )
                                      {
                                          continue;
                                      }
                      
                                      $Entry = $source . '/' . $entry;           
                                      if ( is_dir( $Entry ) )
                                      {
                                          full_copy( $Entry, $target . '/' . $entry );
                                          continue;
                                      }
                                      copy( $Entry, $target . '/' . $entry );
                                  }
                      
                                  $d->close();
                              }else
                              {
                                  copy( $source, $target );
                              }
                          }
                      




                      PHP Snippets: ridimensionare immagini jpeg ed estrarne il thumbnail exif

                      8 12 2008

                      FileName: thumb.php

                      
                      < ?php 
                      
                      $im      = $_GET['im'];
                      $maxsize = $_GET['maxsize'];
                      
                      if ($maxsize == '') {
                          $image = exif_thumbnail($im, $width, $height, $type);
                      
                          if ($image) {
                              header('Content-type: ' .image_type_to_mime_type($type));
                              print $image;
                          }
                          else {
                              print 'No thumbnail available';
                          }    
                      
                      } else {
                      
                      $filename = $im;
                      
                      $width  = $maxsize;
                      $height = $maxsize;
                      
                      header('Content-type: image/jpeg');
                      
                      list($width_orig, $height_orig) = getimagesize($filename);
                      
                      if ($width && ($width_orig < $height_orig)) {
                          $width = ($height / $height_orig) * $width_orig;
                      } else {
                          $height = ($width / $width_orig) * $height_orig;
                      }
                      
                      $image_p = imagecreatetruecolor($width, $height);
                      $image   = imagecreatefromjpeg($filename);
                      imagecopyresampled($image_p, $image, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
                      
                      imagejpeg($image_p);
                      imagedestroy($image);
                      imageDestroy($image_p);
                      }
                      ?>
                      

                      utilizzo:

                      thumb.php?im=uploads/immagine.jpg&maxsize=100

                      ridimensiona l’immagine con il lato maggiore non superiore a 100 pixels.

                      Se non viene specificata la dimensione massima, viene estratto (se disponibile) il thumbnail Exif contenuto nel file Jpeg (metodo molto più veloce nel caso di immagini di un certo peso).





                      PHP Snippets: calcolare l’occupazione su disco di una directory

                      2 12 2008
                      
                      function diskspace($dir)
                      {
                         $s = stat($dir);
                         $space = $s["size"];
                         if (is_dir($dir))
                         {
                           $dh = opendir($dir);
                           while (($file = readdir($dh)) !== false)
                             if ($file != "." and $file != "..")
                               $space += dskspace($dir."/".$file);
                           closedir($dh);
                         }
                         return $space;
                      }
                      

                      restituisce le dimensioni in bytes della directory specificata, comprese eventuali sotto-directory.





                      Film-gratis.IT: film in streaming gratuiti finalmente in modo legale?

                      26 11 2008

                      Film-gratis e’ un portale realizzato dalla nota casa editrice Edizioni Master, che permette agli utenti registrati la visione di film in streaming, in maniera completamente legale.

                      Cito il sito:

                      Film-Gratis è un’iniziativa di Edizioni Master nata per consentire la fruizione gratuita e legale dei titoli cinematografici provenienti dalle principali etichette di settore.

                      Al contrario di ciò che si scarica da molte reti di file sharing, infatti, i film contenuti in Film-Gratis non infrangono la Normativa corrente sul diritto d’autore.
                      Ognuno di essi, infatti, è frutto di accordi con la major che lo produce e la sua riproduzione e trasmissione è autorizzata dalla SIAE.

                      I vantaggi sono molteplici.

                      Innanzitutto, non si hanno problemi con la Legge
                      È tutto assolutamente legale e non si corre il rischio di incappare in pesanti sanzioni.

                       

                      Ancora, si evitano problemi di sicurezza, malware e phishing, tipici di molti siti non autorizzati il cui fine è solo quello di raggirare l’utente senza offrire alcunchè.

                      Dulcis in fundo, è tutto gratuito.
                      Accomodati pure in sala, il biglietto lo paghiamo noi!

                      Veramente una bella iniziativa, speriamo duri! Una sola (grande) pecca: tutti i contenuti sono protetti da DRM e visualizzabili solo su Windows Media Player, escludendo quindi tutti i sistemi non Microsoft.





                      The 7 Deadly Linux Commands

                      26 11 2008

                      Per la serie “Come far del male alla propria LinuxBox”.
                      Simpatici i 7 ‘comandi mortali’, ancora piu’ interessanti i numerosi commenti al post: TECH SOURCE FROM BOHOL: The 7 Deadly Linux Commands





                      BloggerSync, layout compatibile con iPhone

                      14 11 2008

                      bloggersyncVisto l’interesse nato attorno a BloggerSync (le statistiche degli accessi mi hanno stupito), ho deciso di rilasciare un piccolo aggiornamento, correggendo un paio di bugs e adattando il (semplicissimo) layout dell’applicazione alla visualizzazione con iPhone.

                      Essendo già sviluppato in maniera ‘verticale’, l’unica modifica necessaria per renderlo fruibile comodamente col melafonino consiste nel ‘forzare’ il livello di zoom di default, in modo da centrare la webapp nello schermo senza successivi ridimensionamenti a colpi di dita, utilizzando il metatag ‘viewport’:

                      
                      <meta name="viewport" content="width=480" />
                      

                      inoltre è una buona pratica il realizzare un foglio di stile dedicato a Safari Mobile (adattando ad esempio i fonts allo schermo di dimensioni ridotte) includendolo in questo modo:

                      	<link media="only screen and (max-device-width: 480px)"  href="css_iphone.css" type="text/css" rel="stylesheet" />
                      

                      photoCosì facendo tutti i device con uno schermo di dimensione superiore ai 480 pixel (iPhone in modalità ‘landscape’) ignoreranno il caricamento del CSS dedicato all’iPhone.





                      Windows non si avvia dopo la rimozione di user32.dll da parte di AVG

                      10 11 2008

                      Dando uno sguardo alle keyword con le quali il mio blog viene raggiunto, mi accorgo che in parecchi sono rimasti vittime di un ‘falso positivo’ dell’antivirus AVG che, dopo un aggiornamento rilasciato nella notte tra sabato e domenica, riconosceva il file User32.dll (su sistemi non aggiornati all’ultimissimo ‘patch level’) come infetto da un trojan e lo rimuoveva senza troppi scrupoli.

                      La mancanza di tale file, indispensabile a windows, non permetteva successivamente di avviare il PC.

                      La soluzione è semplice, e la trovo su SpippolAzione:

                      [...] potete ripristinare il file avviando con il cd di installazione di Windows XP, o quello di Vista ed avviare la console di ripristino, oppure potte usare una distribuzione linux sufficente recente da riuscire a scrivere sui dischi NTFS, una Ubuntu 8.04 o 8.10 o simili andranno benissimo.

                      Una volta avviata la console di ripristino o la distribuzione linux troverete una copia del file cancellato perfettamente utilizzabile in c:\windows\system32\DLLcache, dovete solo rimetterla in c:\windows\system32 e riavviare.

                      Talvolta (a me è capitato), dopo aver ripristinato il file è possibile trovarsi nuovamente impossibilitati ad avviare il sistema, questa volta con l’errore

                      “Si è verificato un problema e Windows è stato arrestato per impedire danni al computer. Informazioni tecniche: STOP: c0000135 {Impossibile individuare un componente} Impossibile avviare l’applicazione specificata. Winsrv non è stato trovato. Una nuova installazione dell’applicazione potrebbe risolvere il problema.”

                      E anche questa volta la soluzione è stata prontamente pubblicata su SpippolAzione:

                      Questo e’ dovuto al fatto che, non si capisce per quale motivo, il file preso dalla DLLcache non gli andava bene.

                      Questo c000015 è un vecchio errore che usciva fuori quando si installava il service pack 2 di XP quando nel computer era presente un ben preciso malware, ma non è il nostro caso.

                      Ho risolto con il solito sistema, rimettendo a posto user32.dll, ma non quella presente nella DLLcache ma quello che ho trovato nella cartella C:\WINDOWS\$NtUninstallKB925902$

                      ATTENZIONE: potrebbe non andare bene per tutti, dipende dai livelli di service pack e aggiornamenti che avete nel pc, comunque se da prompt dos vi spostate in c:\windows e fate un

                      dir usr32.dll /s

                      vedrete dove trovare le varie copie di user32.dll, quindi provate a copiarli uno per uno in c:\windows\system32 e riavviare.