mercoledì 13 agosto 2014

Amazon EC2 Cambiare chiave .pem (key pair) per un'istanza

Potrebbe capitare di dover accedere a un’istanza Amazon EC2 spenta da tempo, da un PC dove non è presente la chiave ssh .pem.
In questi casi conviene creare una nuova chiave e associarla alla vecchia istanza.

Per creare una nuova chiave non é un problema, si può fare facilmente da pannello di controllo di Amazon, andando su Key Pairs.

Per quanto riguarda l’associazione con l’istanza é leggermente più complicato.

  • La prima cosa da fare é spegnere, non terminare, solo stoppare l’istanza EC2 alla quale si vuole associare la nuova chiave.
  • Staccare il volume associato.
  • Creare e lanciare una nuova istanza EC2, automaticamente collegata alla nuova chiave, quella che si vuole collegare alla vecchia istanza.
  • Collegare il vecchio volume alla nuova istanza creata, come /dev/xvdf (oppure /dev/sdf).
  • Ora é necessario entrare, con la chiave, dentro la nuova istanza creata, per esempio, posizionandosi con il terminale nella cartella dove é salvata la chiave: ssh -l ubuntu -i chiave.pem 111.111.111.111

  • Una volta dentro bisognerà montare il vecchio disco, quello che abbiamo collegato come /dev/xvdf.
  • Per fare una cosa del genere controllare i dischi con sudo fdisk -l se non dovessero esistere, creare le cartelle sudo mkdir /mnt/tmp e poi per montare sudo mount /dev/xvdf /mnt/tmp.

  • A questo punto non rimane che copiare la nuova chiave nel vecchio disco, quindi cp ~/.ssh/authorized_keys /mnt/tmp/home/ubuntu/.ssh/authorized_keys
  • A questo punto logout, uscire da ssh.
  • Terminare la nuova istanza.
  • Staccare il vecchio volume dalla nuova istanza appena terminata.
  • Attaccare il vecchio volume alla vecchia istanza come /dev/sda1
  • Lanciare la vecchia istanza e autenticarsi con la nuova chiave.




martedì 29 luglio 2014

Symfony2, aggiungere una funzione DQL per ottenere la differenza tra due date utilizzando il motore MySql.

Può essere utile calcolare la differenza tra due date  direttamente nelle nostre query SQL.

Utilizzando Symfony2 e Doctrine, e possibile aggiungere la funzione DQL in questo modo:

doctrine-project


Creiamo il file Acme/DemoBundle/DQL/DateDiff.php

  
<?php

namespace Acme\AdminBundle\DQL;

use Doctrine\ORM\Query\AST\Functions\FunctionNode;
use Doctrine\ORM\Query\Lexer;


/**
 * DateDiffFunction ::= "DATEDIFF" "(" ArithmeticPrimary "," ArithmeticPrimary ")"
 */
class DateDiff extends FunctionNode
{
    // (1)
    public $firstDateExpression = null;
    public $secondDateExpression = null;

    public function parse(\Doctrine\ORM\Query\Parser $parser)
    {
        $parser->match(Lexer::T_IDENTIFIER); // (2)
        $parser->match(Lexer::T_OPEN_PARENTHESIS); // (3)
        $this->firstDateExpression = $parser->ArithmeticPrimary(); // (4)
        $parser->match(Lexer::T_COMMA); // (5)
        $this->secondDateExpression = $parser->ArithmeticPrimary(); // (6)
        $parser->match(Lexer::T_CLOSE_PARENTHESIS); // (3)
    }

    public function getSql(\Doctrine\ORM\Query\SqlWalker $sqlWalker)
    {
        return 'DATEDIFF(' .
            $this->firstDateExpression->dispatch($sqlWalker) . ', ' .
            $this->secondDateExpression->dispatch($sqlWalker) .
        ')'; // (7)
    }
}

A questo punto é necessario registrare la funzione nel file app/config/config.yml

    orm:
        / ... /
        dql:
            datetime_functions:
                datediff:     Acme\DemoBundle\DQL\DateDiff
A questo punto sarà possibile scrivere query del genere:
SELECT p FROM DoctrineExtensions\Query\BlogPost p WHERE DATEDIFF(CURRENT_TIME(), p.created) < 7


... o del genere ;) ...

  $repository = $this->getDoctrine()
      ->getRepository('AcmeDemoBundle:Ads');

  $query = $repository->createQueryBuilder('a')
      ->where('a.idUser = :idUser')
      ->andWhere('DATEDIFF(a.datejob, CURRENT_DATE()) >= 1')
      ->setParameter('idUser', $this->getUser()->getId())
      ->getQuery();

  $ads = $query->getResult();

venerdì 25 luglio 2014

TVUNDERGROUND.org.ru TVU.org.ru restricted access to registered users

To access to the site tvunderground you need to register and log in.

The register page is this one.

Once you have registered, just log in and everything will continue to work as usual.


WARNING! The data to access to the forum are different from the data to access to the website

Utilizzando FosUserBundle il ruolo ROLE_USER non viene salvato nel database

Può capitare di dover attribuire dei ruoli differenti per ogni utente in un progetto Symfony2.

Se si utilizza FosUserBundle, il ruolo ROLE_USER sarà attribuito di default a tutti gli utenti e non sarà possibile salvarlo nel database.

Se si scrive qualcosa del genere
$user->addRole('ROLE_USER');

Il risultato sarà quello di avere un array vuoto nel database.

{}

 A seconda delle proprie necessità converrà aggiungere un nuovo ruolo, qualcosa del genere

$user->addRole('ROLE_CLIENT');

 oppure lasciare il database vuoto, consapevoli del fatto che il ruolo ROLE_USER é stato comunque aggiunto.

mercoledì 23 luglio 2014

Soft delete con Symfony2

Può capitare di dover implementare un sistema di soft delete nella propria applicazione web.

Niente di più semplice con queste estensioni di doctrine.

Per installare il bundle basta seguire le istruzioni.

Una volta installato é necessario modificare in questo modo la configurazione di doctrine nel file # app/config/config.yml
# Doctrine Configuration
doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "%database_name%"
        user:     "%database_user%"
        password: "%database_password%"
        charset:  UTF8
    orm:
        auto_generate_proxy_classes: "%kernel.debug%"
        auto_mapping: true
        filters:
            softdeleteable:
                class: Gedmo\SoftDeleteable\Filter\SoftDeleteableFilter
                enabled: true

Solo le ultime 4 righe sono da aggiungere, le altre dovrebbero essere già presenti nel file di configurazione.


Sempre nel file # app/config/config.yml aggiungiamo le righe:

stof_doctrine_extensions:
    orm:
        default:
            softdeleteable: true

Ora non ci rimane che andare a modificare l'entity per la quale vogliamo utilizzare il soft delete.

Apriamo il file dell'entity, ad esempio # src/Acme/UserBundle/Entity/User.php.

Aggiungiamo prima della classe
use Gedmo\Mapping\Annotation as Gedmo;

La riga seguente invece va inserita tra i commenti, sempre prima della classe

 /*
 * @Gedmo\SoftDeleteable(fieldName="deletedAt")
 */

come ultima cosa aggiungiamo il campo che farà la differenza tra un record cancellato e uno ancora in uso.

    /**
     * @var \DateTime $deletedAt
     *
     * @ORM\Column(name="deleted_at", type="datetime", nullable=true)
     */
    private $deletedAt;


La classe dovrebbe essere più o meno così



namespace Acme\UserBundle\Entity;
use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Gedmo\Mapping\Annotation as Gedmo; 
/**
 * @Gedmo\SoftDeleteable(fieldName="deletedAt")
 * @ORM\Entity
 * @ORM\Table(name="fos_user")
 */
class User extends BaseUser
{
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
    /**
     * @var \DateTime $deletedAt
     *
     * @ORM\Column(name="deleted_at", type="datetime", nullable=true)
     */
    private $deletedAt; 

    public function __construct()
    {
        parent::__construct();
        // your own logic
    }


     
Il sistema fa tutto da solo, non c'é bisogno di modificare nient'altro, né le chiamate per cancellare le entity ->remove($user) né le query per selezionare i dati. Tra l'altro, se sono presenti delle relazioni tra tabelle (scritte correttamente) e se le query sono scritte bene, viene aggiornato tutto automaticamente.

lunedì 14 luglio 2014

Modificare o aggiungere codice CSS in una sola pagina di Wordpress

Come fare se si vuole modificare il codice CSS solo in una pagina di wordpress?
Per esempio, abbiamo un testo, e solo in quella pagina vogliamo modificarne la dimensione.

Basta aggiungere il seguente codice al file functions.php del tema Wordpress che stiamo utilizzando.
Per fare questo si puó accedere direttamente all'editor dal pannello di controllo, non c'è bisogno di andare a editare i file a mano.

Il codice da inserire è questo:

add_action('admin_menu', 'custom_css_hooks');
 add_action('save_post', 'save_custom_css');
 add_action('wp_head','insert_custom_css');
 function custom_css_hooks() {
 add_meta_box('custom_css', 'Custom CSS', 'custom_css_input', 'post', 'normal', 'high');
 add_meta_box('custom_css', 'Custom CSS', 'custom_css_input', 'page', 'normal', 'high');
 }
 function custom_css_input() {
 global $post;
 echo '<input type="hidden" name="custom_css_noncename" id="custom_css_noncename" value="'.wp_create_nonce('custom-css').'" />';
 echo '<textarea name="custom_css" id="custom_css" rows="5" cols="30" style="width:100%;">'.get_post_meta($post->ID,'_custom_css',true).'</textarea>';
 }
 function save_custom_css($post_id) {
 if (!wp_verify_nonce($_POST['custom_css_noncename'], 'custom-css')) return $post_id;
 if (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) return $post_id;
 $custom_css = $_POST['custom_css'];
 update_post_meta($post_id, '_custom_css', $custom_css);
 }
 function insert_custom_css() {
 if (is_page() || is_single()) {
 if (have_posts()) : while (have_posts()) : the_post();
 echo '<style type="text/css">'.get_post_meta(get_the_ID(), '_custom_css', true).'</style>';
 endwhile; endif;
 rewind_posts();
 }
 }

Una volta salvato il file con la modifica, comparirà nel pannello di editor della pagina una finestrella per inserire il codice css.

giovedì 10 luglio 2014

Recuperare variabili GET con twig

Ipotizziamo di dover recuperare una variabile inviata con tramite GET con Twig.
In realtà non si capisce perchè uno debba fare una cosa del genere, vista la potenza delle rotte di symfony, ma non si sa mai.

Quindi ipotizziamo un indirizzo del genere con tanto di variabile GET annessa.

www.miosito.com/pagina/?nomeVariabile=123

Per recuperare il valore della variabile con twig basterà

{{ app.request.query.get('nomeVariabile') }}