.: HosiriS :.

Informatica e non solo

Archive for gennaio 2011

Installare Firefox 4.0 beta2 su Maverick Meerkat

Posted by hosiris su gennaio 31, 2011

Ormai se ne sente parlare di continuo e le aspettative sono tante: Firefox 4.0 promette tante migliorie rispetto alla tanta discussa 3.5!
Allora proviamolo… perchè aspettare oltre?
Aggiungiamo i repo ppa per le beta di mozilla:

$ sudo add-apt-repository ppa:ubuntu-mozilla-daily/ppa && sudo apt-get update
$ sudo apt-get install firefox-4.0

Una volta terminata l’installazione lo troveremo in Applicazioni->Internet->Minefield 4.0 Browser Web:

Potrete sicuramente ammirare la velocità di apertura (rispetto alla 3.5 sembra un razzo), anche se i consumi di memoria rimangono inalterati.
Ho trovato molto interessante la gestione dei componenti aggiuntivi:

Posso ritenermi soddisfatto, speriamo si mantenga questo livello.
Buon divertimento

Annunci

Posted in Informatica, Linux, Ubuntu | Leave a Comment »

Basta!!!

Posted by hosiris su gennaio 29, 2011

Il buon Blackout ha da sempre avuto la capacità di passarmi il libro giusto al momento giusto… e proprio ora, nel momento più buio mi consiglia di leggere Adesso Basta di Simone Perotti.
E’ un libro molto semplice, leggibile in pochi giorni, che racconta la metamorfosi che ha condotto l’autore ad una vita diversa e a lui più consona!

Vi lascio alcune frasi su cui sto riflettendo:

  • Ma il potere si è ulteriormente evoluto, ha imparato che la dittatura e il totalitarismo non servono più. Bastano i vetrini luccicanti del consumo, del potere economico, dei servizi, dei beni per tenere tutti sotto scacco, proni e incapaci di offendere.
  • Il potere si è molto raffinato dal dopoguerra, è diventato silenzioso, invisibile, cortese. I dittatori non servono quando la gente è già china sotto il mantello dorato del benessere. È già disposta a tutto pur di mantenere la propria condizione di privilegio, al prezzo della sua paura, soddisfatta dai suoi avanzamenti, incurante del costo esistenziale e sociale che tutto questo comporta.
  • Quando iniziamo a lavorare abbiamo talmente paura di fallire che affronteremmo qualunque ostacolo pur di farcela. Quando cerchiamo la nostra strada non badiamo al fatto che piova, che la città sia nel caos, che l’ufficio sia lontano da casa. Vogliamo solo riuscire, farci dire «bravo», dimostrarci di essere come tutti gli altri, niente di meno, semmai qualcosina di più.
  • A trent’anni ero orgoglioso di quello che avevo conquistato, e per di più ogni cosa sembrava andare sempre meglio… ma qualcosa, dentro, non andava del tutto. Ero soddisfatto ma pensavo continuamente a come fare per smettere di lavorare.
  • Guardate, non sono un viziato, non sorridete. Qui il problema non è dare maggiore o minore peso a una «semplice» partita di calcio. Il fatto è che quel giorno ho capito che quella finale non sarebbe tornata, e io non c’ero. Quello che non torna, merita rispetto. Come era già successo per la mia adolescenza.

Posted in Personal | 1 Comment »

Soggetto ad alto potenziale

Posted by hosiris su gennaio 27, 2011

Queste parole sono diventate il mio incubo!
Quale significato sia nascosto dietro quelle poche parole è a me sconosciuto, ma mi hanno sempre dato l’idea di qualcosa di buono.
Sempre! Fin quando, con un amico, abbiamo affrontato il discorso dei colloqui di lavoro che ho fatto presso le società in Italia. Ha visto il mio curriculum, si è fatto dire cosa rispondevo… intanto osservavo che nel suo viso si stava delineando un sorrisetto…
“Gianni, tu sei un soggetto ad alto potenziale”… porca miseria, non mi toccare… vuoi vedere che esplodo? “No, ma cosa hai capito, intendo che potresti fare tutto quello che vuoi.” :O
Ok, ammetto di essermi sentito preso per i fondelli!
“Però, Gianni, devi capire che non è sempre una cosa buona che una persona sia così versatile e così dinamica” :O
Con questa frase ho cominciato a non capire più niente!
“Quando una azienda legge il tuo curriculum non vede solo un ragazzo che ha molte skill e che può essere molto produttivo; vede anche un ragazzo che è pronto a cambiare aria se non ha interesse a stare con una azienda” :O

Certo che non ho capito proprio niente della vita!
Ero convinto che studiare, coltivare le passioni, accrescere la propria cultura potessere servirmi per dare al mondo qualcosa in più, niente di accezionale (non sono un genio e sono consapevole di non esserlo), ma anche solo il poter progettare una sedia ergonomica sarebbe stato interessante!
Invece, scopro che la realtà è molto diversa: se vuoi lasciare un segno in questa terra devi essere un ebete; le passioni sono il male!

Però quello che non capisco è un’altra cosa: perchè non ci avvisate prima?Inutile che fai mille cose, tanto le aziende non vedranno queste cose come un bene. Fanne solo una, specializzati su quello e basta!
Certo è che un po’ di amarezza potrebbe essermi permessa, le aziende non mi vogliono perchè sono un pericolo, ma svolgere un lavoro in cui devi fare click di continuo senza al necessità di ragionare a me sembra più una punizione!

Vabbè, piccolo altro sfogo! Inutile come sempre…

Posted in Personal | 2 Comments »

PHP-GTK2 su Ubuntu 10.10

Posted by hosiris su gennaio 25, 2011

Quando la fortuna bussa alla tua porta devi farti sempre trovare pronto, ed è per questo che, nell’ottica di non lasciarmi scappare nuove opportunità, sto cercando nuove tecniche per poter svolgere determinati lavori.
Qualche anno fa iniziai a seguire il progetto php-gtk perchè l’idea di poter utilizzare il php in ambienti stand-alone mi sembrava molto interessante. Poi per motivi di tempo non ho più seguito il lavoro che veniva svolto. Ritornando sul sito ho visto con molto piacere che si è arrivati ad una versione 2, e che il progetto sembra abbastanza maturo a tal punto da decidere di sviluppare qualche applicazione.
Ma cominciamo con l’installare la libreria.

Innanzi tutto è necessario soddisfare le dipendenze:

$ sudo apt-get install build-essential subversion php5-cli php5-dev libgtk2.0-dev libglade2-dev

Sarà necessaria anche l’estenzione Cairo per php:

$ cd ~/Scaricati
$ svn co http://svn.php.net/repository/pecl/cairo/trunk pecl-cairo
$ cd pecl-cairo
$ phpize
$ ./configure
$ make
$ sudo make install

per concludere l’installazione con successo sarà necessario apportare delle modifiche a delle macro:

$ cd /usr/share/aclocal
$ sudo cp libtool.m4 libtool.m4~backup
$ sudo chmod 777 libtool.m4
$ sudo cat lt~obsolete.m4 ltoptions.m4 ltsugar.m4 ltversion.m4 >>libtool.m4
$ sudo chmod 644 libtool.m4

Il miglior modo per installare php-gtk è quello di usare il repository svn al posto dei sorgenti scaricabili dal sito:

$ cd ~/Scaricati
$ svn co http://svn.php.net/repository/gtk/php-gtk/trunk php-gtk
$ cd php-gtk
$ ./buildconf
$ ./configure
$ make
$ sudo make install

Una volta terminata l’installazione, dovremmo compiere ulteriori operazioni.

Rimuoviamo il link simbolico che troviamo in /etc/php5/cli/

$ sudo rm /etc/php5/cli/conf.d
$ sudo mkdir /etc/php5/cli/conf.d
$ sudo cp /etc/php5/conf.d/*.ini /etc/php5/cli/conf.d/

Ora dobbiamo aggiungere le estensioni al php.ini.
Aggiungiamo le seguenti linee al php.ini, nella sezione “Dynamic Extensions”

; /etc/php5/cli/php.ini
extension=php_gtk2.so
extension=cairo.so

Salvate ed uscite.
Per vedere se l’installazione è andata a buon fine eseguite un esempio:

$ php ~/Scaricati/php-gtk/demos/phpgtk2-demo.php

Ed è tutto, buon divertimento.

Posted in Informatica, Linux, Ubuntu | 2 Comments »

CakePHP e Google Map v3

Posted by hosiris su gennaio 23, 2011

Ho già descritto come usare Google Maps tramite CakePHP, ma l’articolo che avevo linkato usava la versione 2 di gmap.
Viste le funzionalità aggiuntive della v3 ho continuato a cercare nuove soluzioni, giungendo a questo link.
Anche in questo post viene descritto l’uso di un helper. Ma il codice non svolgeva quello di cui avevo bisogno, quindi sono stato costretto ad aggiungere un pezzo di codice ottenendo il seguente helper:

//app/view/helper/google_map_v3.php
<?php
/*
   CakePHP Google Map V3 - Helper to CakePHP framework that integrates a Google Map in your view
   using Google Maps API V3.
  Copyright (c) 2010 Marc Fernandez Girones: info@marcfg.com
  MIT LICENSE:
  Permission is hereby granted, free of charge, to any person obtaining a copy
  of this software and associated documentation files (the "Software"), to deal
  in the Software without restriction, including without limitation the rights
  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  copies of the Software, and to permit persons to whom the Software is
  furnished to do so, subject to the following conditions:
  
  The above copyright notice and this permission notice shall be included in
  all copies or substantial portions of the Software.
  
  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  THE SOFTWARE.
  MarcFG : http://www.marcfg.com
  
  @author   Marc Fernandez Girones <info@marcfg.com>
  @version   1.0
  @license   OPPL
  
  Date     May 13, 2010
  USAGE:
  
  In your CONTROLLER:
    var $helpers = array('GoogleMapV3');  Add the helper
   In your VIEW:
     To add a map that localizes you:
       echo $googleMapV3->map();
    
     OR
    
     You can also pass to the function a variable with any of the followings options and change the default parameters
       $mapOptions= array(
        'width'=>'800px',        //Width of the map
        'height'=>'800px',        //Height of the map
        'zoom'=>7,            //Zoom
        'type'=>'HYBRID',         //Type of map (ROADMAP, SATELLITE, HYBRID or TERRAIN)
        'latitude'=>40.69847032728747,  //Default latitude if the browser doesn't support localization or you don't want localization
        'longitude'=>-1.9514422416687,  //Default longitude if the browser doesn't support localization or you don't want localization
        'localize'=>true,        //Boolean to localize your position or not
        'marker'=>true,          //Boolean to put a marker in the position or not
        'markerIcon'=>'http://google-maps-icons.googlecode.com/files/home.png',  //Default icon of the marker
        'infoWindow'=>true,        //Boolean to show an information window when you click the marker or not
        'windowText'=>'My Position'    //Default text inside the information window
      );
      echo $googleMapV3->map($mapOptions); To add a map that localizes you
    
    To add a marker:
       echo $googleMapV3->addMarker(array('latitude'=>40.69847,'longitude'=>-73.9514));
      
     OR
    
     You can also pass to the function a variable with any of the followings options and change the default parameters
    $markerOptions= array(
      'id'=>1                //Id of the marker
      'latitude'=>40.69847032728747,    //Latitude of the marker
      'longitude'=>-1.9514422416687,    //Longitude of the marker
      'markerIcon'=>'http://google-maps-icons.googlecode.com/files/home.png', //Custom icon
      'shadowIcon'=>'http://google-maps-icons.googlecode.com/files/home.png', //Custom shadow
      'infoWindow'=>true,          //Boolean to show an information window when you click the marker or not
      'windowText'=>'Marker'        //Default text inside the information window
    );
    
   This helper uses the latest Google API V3 so you don't need to provide or get any Google API Key
*/
class GoogleMapV3Helper extends Helper {
  
  //DEFAULT MAP OPTIONS (function map())
  var $defaultWidth="800px";//Width of the map
  var $defaultHeight="800px";//Height of the map
  var $defaultZoom=6;//Default zoom
  var $defaultType='HYBRID';//Type of map (ROADMAP, SATELLITE, HYBRID or TERRAIN)
  var $defaultLatitude=40.69847032728747;//Default latitude if the browser doesn't support localization or you don't want localization
  var $defaultLongitude=-73.9514422416687;//Default longitude if the browser doesn't support localization or you don't want localization
  var $defaultLocalize=true;//Boolean to localize your position or not
  var $defaultMarker=true;//Boolean to put a marker in the position or not
  var $defaultMarkerIcon='http://google-maps-icons.googlecode.com/files/home.png'; //Default icon of the marker
  var $defaultInfoWindow=true;//Boolean to show an information window when you click the marker or not
  var $defaultWindowText='My Position';//Default text inside the information window
    
  //DEFAULT MARKER OPTIONS (function addMarker())
  var $defaultInfoWindowM=true;//Boolean to show an information window when you click the marker or not
  var $defaultWindowTextM=' ';//Default text inside the information window
  
  
/**
   * Function map
   *
   * This method generates a tag called map_canvas and insert
   * a google maps.
   *
   * Pass an array with the options listed above in order to customize it
   *
   * @author Marc Fernandez <info (at) marcfg (dot) com>
   * @param array $options - options array
   * @return string - will return all the javascript script to generate the map
   *
   */  
  function map($options=null){
    if($options!=null) extract($options);
    if(!isset($width))     $width=$this->defaultWidth;
    if(!isset($height))   $height=$this->defaultHeight;  
    if(!isset($zoom))     $zoom=$this->defaultZoom;      
    if(!isset($type))     $type=$this->defaultType;    
    if(!isset($latitude))   $latitude=$this->defaultLatitude;  
    if(!isset($longitude))   $longitude=$this->defaultLongitude;
    if(!isset($localize))   $localize=$this->defaultLocalize;    
    if(!isset($marker))   $marker=$this->defaultMarker;    
    if(!isset($markerIcon)) $markerIcon=$this->defaultMarkerIcon;  
    if(!isset($infoWindow)) $infoWindow=$this->defaultInfoWindow;  
    if(!isset($windowText)) $windowText=$this->defaultWindowText;  
    
    echo '<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=true"></script>';
    echo '<script type="text/javascript" src="http://code.google.com/apis/gears/gears_init.js"></script>';
    $map = "<div id=\"map_canvas\" style=\"width:".$width."; height:".$height."\"></div>";
    $map .= "
    <script>
      var noLocation = new google.maps.LatLng(".$latitude.", ".$longitude.");
      var initialLocation;
      var browserSupportFlag = new Boolean();
      var map;      
      var geocoder = new google.maps.Geocoder();
      var myOptions = {
       zoom: ".$zoom.",
       mapTypeId: google.maps.MapTypeId.".$type."
      };
      map = new google.maps.Map(document.getElementById(\"map_canvas\"), myOptions);
    ";
    if($localize) $map .= "localize();"; else $map .= "map.setCenter(noLocation);";
    $map .= "
      function localize(){
        if(navigator.geolocation) { // Try W3C Geolocation method (Preferred)
          browserSupportFlag = true;
          navigator.geolocation.getCurrentPosition(function(position) {
           initialLocation = new google.maps.LatLng(position.coords.latitude,position.coords.longitude);
           map.setCenter(initialLocation);";
           if($marker) $map .= "setMarker(initialLocation);";
              
          $map .= "}, function() {
           handleNoGeolocation(browserSupportFlag);
          });
          
        } else if (google.gears) { // Try Google Gears Geolocation
          browserSupportFlag = true;
          var geo = google.gears.factory.create('beta.geolocation');
          geo.getCurrentPosition(function(position) {
           initialLocation = new google.maps.LatLng(position.latitude,position.longitude);
           map.setCenter(initialLocation);";
           if($marker) $map .= "setMarker(initialLocation);";    
        
          $map .= "}, function() {
           handleNoGeolocation(browserSupportFlag);
          });
        } else {
          // Browser doesn't support Geolocation
          browserSupportFlag = false;
          handleNoGeolocation(browserSupportFlag);
        }
      }
      
      function handleNoGeolocation(errorFlag) {
        if (errorFlag == true) {
         initialLocation = noLocation;
         contentString = \"Error: The Geolocation service failed.\";
        } else {
         initialLocation = noLocation;
         contentString = \"Error: Your browser doesn't support geolocation.\";
        }
        map.setCenter(initialLocation);
        map.setZoom(3);
      }";
      $map .= "
      function setMarker(position){
        var contentString = '".$windowText."';
        var image = '".$markerIcon."';
        var infowindow = new google.maps.InfoWindow({
          content: contentString
        });
        var marker = new google.maps.Marker({
          position: position,
          map: map,
          icon: image,
          title:\"My Position\"
        });";
       if($infoWindow){
         $map .= "google.maps.event.addListener(marker, 'click', function() {
                infowindow.open(map,marker);
              });";
       }
       $map .= "}";
    $map .= "</script>";
    return $map;
  }
  
  
  /**
   * Function addMarker
   *
   * This method puts a marker in the google map generated with the function map
   *
   * Pass an array with the options listed above in order to customize it
   *
   * @author Marc Fernandez <info (at) marcfg (dot) com>
   * @param array $options - options array
   * @return string - will return all the javascript script to add the marker to the map
   *
   */
  function addMarker($options){
    if($options==null) return null;
    extract($options);
    if(!isset($id)) $id=rand();
    if(!isset($infoWindow)) $infoWindow=$this->defaultInfoWindowM;
    if(!isset($windowText)) $windowText=$this->defaultWindowTextM;
    if(!isset($latitude) || $latitude==null || !isset($longitude) || $longitude==null){
      /*
       * This section manage position by geocoding address
       *
       * @author Giovanni Ruta <ruta.giovanni@gmail.com>
       * @licence GPL
       *
       * USE - in you view
       * $markerOptions = array(
       *        'address'=>$address,
       *        'city'=>$city,
       *        'number'=>$number
       * );
       * $gmap->addMarker($markerOptions);
       */
      if(!isset($address) || $address==null || !isset($city) || $city==null || !isset($number) || $number==null){
        return null;
      }else{
        $marker = " <script>";
        if(isset($markerIcon)) $marker .= "var image = '".$markerIcon."';";
        if(isset($shadowIcon)) $marker .= "var shadowImage = '".$shadowIcon."';";
        $marker .= "
          geocoder.geocode({ 'address': '".$address." ".$number.", ".$city."'}, function(results, status){
            if (status == google.maps.GeocoderStatus.OK){
              var marker".$id." = new google.maps.Marker({
                map: map,
                position: results[0].geometry.location,";
                if(isset($markerIcon)) $marker .= "icon: image,";
                if(isset($shadowIcon)) $marker .= "shadow: shadowImage,";
        $marker .= "
              });
            } else {
            }
          });";
        $marker .= "</script>";
      }
      /*
       * End for geocoding options
       */
    } else {
      if (!preg_match("/[-+]?\b[0-9]*\.?[0-9]+\b/", $latitude) || !preg_match("/[-+]?\b[0-9]*\.?[0-9]+\b/", $longitude)) return null;    
      $marker = "<script>";
      if(isset($markerIcon)) $marker .= "var image = '".$markerIcon."';";
      if(isset($shadowIcon)) $marker .= "var shadowImage = '".$shadowIcon."';";
      $marker .= "var myLatLng = new google.maps.LatLng(".$latitude.", ".$longitude.");
            var marker".$id." = new google.maps.Marker({
              position: myLatLng,
              map: map,";
              if(isset($markerIcon)) $marker .= "icon: image,";
              if(isset($shadowIcon)) $marker .= "shadow: shadowImage,";
      $marker .= "
            });";
      $marker .= "
        var contentString = '".$windowText."';
        var infowindow".$id." = new google.maps.InfoWindow({
          content: contentString
        });";
      if($infoWindow){
           $marker .= "google.maps.event.addListener(marker".$id.", 'click', function() {
                  infowindow".$id.".open(map,marker".$id.");
                });";
      }
      $marker .= "</script>";
    }
    return $marker;
  }
}
?>

Non ho fatto altro che aggiungere una piccola porzione di codice alla funzione “addMarker()” hce permette di aggiungere i marker anche se non si hanno a disposizione le coordinate.
Il funzionamento è semplice: dopo aver richiamato l’helper nel controller

var $helpers = array('GoogleMapV3');

sarà sufficiente aggiungere il seguente codice nella vista

$mapOptions= array(
        'width'=>'800px',
        'height'=>'800px',
        'zoom'=>6,
        'type'=>'TERRAIN',
        'localize'=>false,
        'latitude'=>40.69847032728747,
        'longitude'=>12.9514422416687,
        'marker'=>false,
        'markerIcon'=>'http://google-maps-icons.googlecode.com/files/home.png',
        'infoWindow'=>true,
        'windowText'=>''
    );
echo $googleMapV3->map($mapOptions);

Ammirate la vostra Italia
Buon divertimento

Posted in CakePHP, CMS&MVC, Programmazione | Leave a Comment »

Accedere a vecchi sistemi tramite telnet

Posted by hosiris su gennaio 21, 2011

Vi siete mai chiesti come ci si sentiva a lavorare su vecchie macchine? Io sempre!
Ma come fare? Non sempre si ha la possibilità di trovare macchine antiche (le società si guardano bene di conservare roba obsoleta)…
Il buon Blackout è venuto prontamente in mio soccorso condividendo il seguente link: museum.dyne.org.

Vedrete un semplice wiki con una lista di indirizzi ip e sistemi operativi, ma l’idea geniale è la possibilità di accedere tramite ssh o telnet alle macchine e quindi di poterle provare.

Che aspettate?

Mille ringraziamenti alla comunità GrayHats.

Posted in Informatica | Leave a Comment »

Installare Nessus su Maverick Meerkat

Posted by hosiris su gennaio 19, 2011

Se avete cominciato a gestire un vostro server casalingo, che magari vi dia la possibilità di offrirvi dei servi anche attraverso internet vi sarete sicuratemente posti il problema di come capire a quali pericoli potreste incorrere… ma dove prendere gli strumenti necessari?
Nessus è un prodotto che ci permette di creare dei test ad hoc per capire che falle presenta il nostro sistema.
Cominciamo a scaricare il pacchetto da qui selezionandolo dalla lista degli OS compatibile. L’installazione è molto semplice (è sufficiente un doppio click sul file scaricato) e la configurazione non è da meno.
Terminata l’installazione andiamo nel terminale e procediamo con la creazione di un utente per Nessus attraverso il comando:

$ /opt/nessus/sbin/nessus-adduser

Rispondiamo a tutte le domande e dopo procediamo con la registrazione sul sito (gratuita), al termine del quale riceveremo una mail con un codice di attivazione. Ritorniamo sul terminale e digitiamo:

$ /opt/nessus/bin/nessus-fetch register <KEY>

Terminate queste operazioni dovremo avviare il servizio:

$ sudo /etc/init.d/nessusd start

Per poter accedere alle funzionalità dell’applicazione, tramite browser, accederemo alla pagina https://localhost:8834. Saremo subito avvisati che il certificato non può essere controllato, comunque creaimo una eccezione che ci permetterà di accedere alla pagina web:

Per l’utilizzo vi rimando alla ottima documentazione scaricabile dal sito.

Buon divertimento

Posted in Linux, Sicurezza, Sistemi | 12 Comments »

Leggere filesystem GNU/Linux tramite Windows

Posted by hosiris su gennaio 17, 2011

E chi lo ha detto che non si può? Il mondo open è bello per questo, c’è una persona in difficoltà? Ci sarà sempre qualcuno capace di dare una soluzione.
Per il problema specifico ci sono tante soluzioni, ma quella che ho trovato più affidabile è ext2fsd.
E’ un semplicissimo programmino che vi darà la possibilità di recuperare i dati memorizzati su hard disk formattati con FS come ext2 o ext3!

Posted in Informatica, Linux, Windows | Leave a Comment »

Unico form per gestire molti model con CakePHP

Posted by hosiris su gennaio 15, 2011

Queste ultime settimane mi hanno visto impegnato nel cercare una soluzione al seguente problema: avendo due form, come posso ridurre al minimo il numero di click per effettuare degli inserimenti sequenziali?
Ho provato di tutto, dai redirect ad Ajax… fin quando ho avuto la semplice idea di unire i due form in unico.
CakePHP fornisce un metodo (saveAll()) che ci permette di effettuare salvataggi su più model, come in una transazione… purtroppo quando lavoriamo con relazioni HABTM questa soluzione non funziona.
Come risolvere allora? La soluzione arriva da un altro metodo: requestAction() che ci permette di fare richieste a controller diversi da quello attuale. Ma passiamo alla pratica; riprendiamo le nostre tabelle users e groups e facciamo in modo che il form di inserimento users contenga anche il form per il group.
Apriamo la vista per l’azione add ed inseriamo il seguente:

<?php echo $this->Form->create('User');?>
  <fieldset>
    <legend><?php __('Add User'); ?></legend>
  <?php
    echo $this->Form->input('name');
    echo $this->Form->input('Group');
    echo $this->Form->input('AddGroup',array('type'=>'checkbox','label'=>'Aggiungi Gruppo'));
    ?><fieldset><?php
    echo $this->Form->input('Group.name');
    ?></fieldset><?php
  ?>
  </fieldset>
<?php echo $this->Form->end(__('Submit', true));?>

Abbiamo aggiunto una checkbox ed un campo di input. Lo scopo è quello di far scegliere all’utente se voler aggiungere un ulteriore gruppo oppure usare quelli esistenti. Allora nel controller dobbiamo inserire una if e la chiamata all’azione del controller groups:

function add() {
  if (!empty($this->data)) {
    /*
     * Nel caso si decida di aggiungere un nuovo gruppo l'if sarà vero
     */
    if($this->data['User']['AddGroup']){
      // Salvo i dati che mi servono in una variabile di sessione
      $this->Session->write('groupname',$this->data['Group']['name'];
      // Eseguo la richiesta
      $groups = $this->requestAction(array('controller'=>'groups','action'=>'savefrom'));
      // Aggiungo l'id dell'ultimo gruppo inserito nell'array di inserimento dell'user
      $this->data['Group']['Group']['0'] = $this->Session->read('idgroup');
    }
    /*
     * Eseguo il normale inserimento dell'user
     */
    $this->User->create();
    if ($this->User->save($this->data)) {
      $this->flash(__('User saved.', true), array('action' => 'index'));
    } else {
    }
  }
  $groups = $this->User->Group->find('list');
  $this->set(compact('groups'));
}

A questo punto dobbiamo creare l’azione savefrom nel controller groups. Questa action non farà altro che leggere la variabile di sessione generata, effettuare l’inserimento e restituire l’ultimo id inserito:

function savefrom(){
  $data['Group']['name']=$this->Sessione->read('groupname');
  $this->Group->save($data);
  $this->Session->write('idgroup',$this->Group->getLastInsertId());
}

Et voilà… il gioco è fatto! Adesso è sufficiente aggiungere un effetto javascript che faccia apparire il “sottoform” solo dopo aver spuntato il box di aggiunta.
Sono sicuro che è la soluzione meno elegante esistente, ma questo è quello che il mio cervelletto ha prodotto! Se qualcuno vuole proporre soluzioni migliori renderebbe un grosso favore alla società.

PS: Grazie ad Allanon per la dritta sulla funzione 😀

Posted in CakePHP, CMS&MVC, Programmazione | Leave a Comment »

Differenze informatiche: quando i media non ci azzeccano mai

Posted by hosiris su gennaio 13, 2011

Tempo fa avevo promesso che avrei scritto un post in cui descrivevo i concetti di White Hat e Black Hat e siccome mantengo sempre le promesse direi di cominciare il nostro viaggio…

Comincerei subito a definire dei sinonimi per i termini sopracitati: un White Hat è quello che viene chiamato Hacker, mentre un Black Hat è quello che fa scrivere tante notizie ai giornalisti (Cracker).
Quindi comincerei subito con le precisazioni: quando i TG sparano a zero su sti maledetti Hacker che fanno danno ovunque per la rete… stanno dicendo una balla perchè un Hacker non fa e non vuole fare danni, ma ia Cracker si 😀
Proprio come in una guerra tra bene e male i White Hats (o Hacker etici) sono esperti di qualsiasi sistema svolgono ogni attività al fine di aumentarne la sicurezza, mentre i Black Hats, esperti quanto i primi, vogliono sfruttare ogni falla a proprio vantaggio!
Voglio farvi notare come abbia puntualizzato il fatto che siano esperti: il 90% di chi si professa Hacker non lo è (un vero Hacker non si vanta di esserlo, ma i fatto lo rendono tale); questi finti-Hacker passano il tempo a leggere notiziucole dove capita, sanno poco di quello che fanno, e non apportano migliorie alla comunità. Anche un Black Hat fa qualcosa di buono, perchè costringe le società a migliorare ogni sistema… ma quelli che chiameremo Lamer non servono a niente. Tipicamente il comportamente di un Lamer è il seguente: mi piace l’informatica; ogni mio amico mi chiama per avere supporto; sono espertissimo di informatica perchè odio windows ed uso linux (ma cos’è questo sed di cui parlate tanto? :P); siccome sono esperto allora sono un hacker… ah si devo attaccare almeno una banca per dimostrarlo… faccio una ricerca su Google… ah ecco tal dei tali ha fatto un programma (mannaggia è per windows… ma perchè devo usare linux se i programmi già fatti sono per windows?) che accede agli account di posta dei dipendenti delle banche :O bello proviamolo… ecco che il nostro piccolo Lamer è diventato uno Script Kiddies cioè colui che non sa minimamente con cosa sta giocando, ma che lo fa perchè… bo… di certo non diventerà famoso… di certo non verrà assunto da qualche mega società.. di certo finirà in carcere!

In questo panorama sempre in continua lotta, emergono altre figure. La filosofia di base è che non esiste solo il bianco ed il nero, ma tutta una serie di tonalità che va da un estremo all’altro; hanno una visione fuzzy dell’universo: parliamo di Grey Hats.
Con questa filosofia un gruppo di ragazzi ha pensato di costituire una associazione (GrayHats) tramite cui poter svolgere attività utili alla società (magari si riesce a migliorare un po’ questo mondo), senza dimenticare l’enorme amore per l’informatica.
Magari siete anche voi degli amanti della tecnologia (non per forza esperti, una ulteriore filosofia potrebbe indicare la conoscenza di un gruppo di persone decisamente superiore a quella del singolo) allora potreste farvi un giretto sul portale di questa associazione, leggerne le motivazioni e magari essere presi dal desiderio di far parte di questo gruppo 😀

Per oggi è tutto, buon divertimento!

Posted in GrayHats, Informatica | 1 Comment »