Statistiche facebook per un url

Come recuperare informazioni circa:

  • quanta gente ha condiviso un link?
  • quanta gente ha fatto clic su “mi piace”?
  • quanta gente ha commentato un url?
  • quanta gente ha cliccato su un url condiviso?

è sufficiente accedere ad un url come questo:

http://api.facebook.com/restserver.php?method=links.getStats&urls=http://www.google.com

il cui formato di risposta è questo:

<?xml version="1.0" encoding="UTF-8"?>
 <links_getStats_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://api.facebook.com/1.0/ http://api.facebook.com/1.0/facebook.xsd" list="true">
   <link_stat>
     <url>http://www.google.com</url>
     <share_count>292957</share_count>
     <like_count>151683</like_count>
     <comment_count>176116</comment_count>
     <total_count>620756</total_count>
     <click_count>265614</click_count>
     <normalized_url>http://www.google.com/</normalized_url>
     <comments_fbid>381702034999</comments_fbid>
   </link_stat>
 </links_getStats_response>

dichiarazione della classe per un oggetto in PHP

Per convenzione quando un oggetto non e’ istanziato in modo esplicito in questo modo:

$oggetto = new Classe();

è possibile dichiarare il tipo di un oggetto con:

/* @var $oggetto Classe */

Così facendo oltre ad avere del codice autodocumentato si mette nelle condizioni il vostro editor (Eclipse o Zend studio … ) di capire il tipo del dato e quindi attivare le varie funzionalità come autocompletamento, accesso ai metodi eccetera.
Questa convenzione è valida in tutti i file php, quindi per esempio anche nei partial e/o template di symfony dove si perde il concetto di tipizzazione degli oggetti.

Abilitare la visualizzazione degli errori in PHP

Mi segno qui, come appunto, due istruzioni semplici che attivano la notifica dettagliata degli errori in PHP:

<?php
error_reporting(E_ALL);
ini_set("display_errors", 1); 

Riconoscimento volto con opencv in python

Riconoscimento del volto tramite una Webcam con opencv (python)

opencv, riconoscimento volto

opencv, riconoscimento volto

from opencv import cv as opencv
from opencv import highgui
import sys

print "Inizializzazione webcam"
camera = highgui.cvCreateCameraCapture(-1)
if (camera):
  print "Camera inizializzata"
else:
  sys.exit("Camera NON inizializzata")

im = highgui.cvQueryFrame(camera)
if (im):
  print "Acquisizione FRAME"
else:
  sys.exit("Errore acquisizione FRAME da webcam")

filexml ="haarcascade_frontalface_default.xml"
print "Caricamento file xml:"+filexml
cascade = opencv.cvLoadHaarClassifierCascade(filexml, opencv.cvSize(1,1))
if (cascade):
  print "Caricato"
else:
  sys.exit("Non caricato")
storage = opencv.cvCreateMemStorage(0)
loop = True
while(loop):
  frame = highgui.cvQueryFrame(camera)
  if (frame == None):
    break;
  grayscale = opencv.cvCreateImage(opencv.cvSize(frame.width, frame.height), 8, 1)
  opencv.cvCvtColor(frame, grayscale, opencv.CV_BGR2GRAY)

  faces = opencv.cvHaarDetectObjects(grayscale, cascade, storage, 1.2, 2,opencv.CV_HAAR_DO_CANNY_PRUNING, opencv.cvSize(50,50))
  if faces:
    #print 'face detected!'
    for face in faces:
      opencv.cvRectangle(grayscale, opencv.cvPoint( int(face.x), int(face.y)),
                         opencv.cvPoint(int(face.x + face.width), int(face.y + face.height)),
                         opencv.CV_RGB(127, 255, 0), 2) # RGB #7FFF00 width=2
  highgui.cvShowImage("Finestra", grayscale)
  char = highgui.cvWaitKey(33)
  if (char != -1):
    if (ord(char) == 27):
      loop = False
highgui.cvDestroyWindow("Finestra")

Magento, chiamare un metodo di un block da un template

Da un template, per chiamare un metodo definito nel Block corrispondente è sufficiente utilizzare la parola chiave $this.

Per esempio nel block: Page/Block/Html/Header.php è definito il metodo getWelcome(). Dalla relativa view: template/page/html/header.phtml è possibile invocare il metodo con l’istruzione:

<?php echo $this->getWelcome()?>

Per invocare quello stesso metodo da un file template differente è possibile ricorrere all’utilizzo di getBlockClassName().

Dal file template istanziare il blocco:

$className = Mage::getConfig()->getBlockClassName('page/html_header');
$block = new $className();

In questo modo è possibile chiamare il metodo getWelcome sull’oggetto $block:

<?php echo $block->getWelcome()?>

Magento, cambiare lo stato degli ordini

Esigenza: cambiare lo stato di un ordine in Magento.

Caso specifico: cambiare lo stato di un ordine da “canceled” a “processing“.

Dal pannello di amministrazione non è possbile in quanto per un ordine in stato canceled non esiste l’azione per un cambio di stato “processing”.

L’idea è quella di fare questo cambio di stato da codice.

Ovviamente non è possibile cambiare il valore dell’attributo status sul model Sales. Questo perchè il cambio di stato di un ordine implica anche altre operazioni. Per fare questo quindi occorre

  • individuare l’ordine su cui modificare lo stato;
  • se l’ordine esiste ed è nello stato che ci si aspetta possiamo procedere con la modifica
  • per la modifica utilizzare il metodo setState e NON setStatus.

Ecco il codice

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);
require_once(dirname(__FILE__) . '/../app/Mage.php');
Mage::app(0);
ini_set('display_errors', 1);
error_reporting(E_ALL);
//configurazione
define("_LOG_TARGET", 1); // 0 disabilitato, 1 echo, 2 log di magento;
define("_LOG_FILE", "updateOrder.log"); // file di log;
/*
 * stati disponibili
 * Mage_Sales_Model_Order::STATE_NEW         = 'new';
 * Mage_Sales_Model_Order::STATE_PROCESSING  = 'processing';
 * Mage_Sales_Model_Order::STATE_COMPLETE    = 'complete';
 * Mage_Sales_Model_Order::STATE_CLOSED      = 'closed';
 * Mage_Sales_Model_Order::STATE_CANCELED    = 'canceled';
 * Mage_Sales_Model_Order::STATE_HOLDED      = 'holded';
 */
define("_STATUS_FROM", Mage_Sales_Model_Order::STATE_CANCELED); // stato 
define("_STATUS_TO", Mage_Sales_Model_Order::STATE_PROCESSING); // stato target
define("_REALLY_UPDATE", false); // stato di parenza

$idOrdine = "123456";

function mylog($message) {
 if (_LOG_TARGET == 1) {
 echo "$message\n";
 } else if (_LOG_TARGET == 2) {
 Mage::log($message, null, _LOG_FILE);
 }
}

mylog("Inizio");
mylog("Carico ID ORDINE:".$idOrdine);
try {
$ordine = Mage::getModel('sales/order')->load($idOrdine);
if ($ordine && $ordine->getIncrementId() != "") {
 mylog("Caricato ORDINE :".$ordine->getIncrementId());
 mylog("         STATO  :".$ordine->getStatus());
 mylog("         CREATO :".$ordine->getCreatedAt());

 mylog("CONTROLLI STATO :");
 mylog("         CHECK  :controllo se stato è uguale a :"._STATUS_FROM);
 if ($ordine->getStatus() == _STATUS_FROM) {
 mylog("         CHECK  :stato ordine (".$ordine->getStatus().") uguale a ". _STATUS_FROM);
 if (_REALLY_UPDATE) {
 mylog("MODIFICA ORDINE :");
 mylog("         UPDATE :Procedo alla modifica. Stato destinazione: ". _STATUS_TO);
 $ordine->setState(_STATUS_TO, true)->save();
 } else {
 mylog("MODIFICA ORDINE :non effettuata per via della configurazione _REALLY_UPDATE");

 }
 } else {
 mylog("stato ordine (".$ordine->getStatus().") DIVERSO da ". _STATUS_FROM);

 }

} else {
 mylog("Ordine non trovato");

}
} catch (Exception $e) {
 myLog("Errore, ".$e->getMessage());
}

mylog("Fine");

?>

Symfony migrations e tabella migration_version

Se si utilizza Symfony e Doctrine si ha a disposizione la funzionalità di migrazione dello schema del database.
Nel caso in cui abbiate appena modificato il file schema.yml è possibile registrare le differenze tra lo schema appena modificato e il model attualmente in uso. Per fare questo eseguire il comando:

php symfony doctrine:generate-migrations-diff

Nella directory lib/migration/doctrine viene creato il file con le informazioni per lo “switch” tra la versione attuale del model e quello del nuovo schema (un file per ogni versione).
Per poter migrare all’ultima versione:

php symfony doctrine:migrate

Per poter migrare ad una versione precisa:

php symfony doctrine:migrate 25

Symfony per poter capire quale è la versione corrente dello schema, utilizza una tabella migration_version con un campo version.
Supponete di adottare questa funzionalità di migration dopo che il vostro sito e’ andato in produzione. Una esecuzione del comando doctrine:migrate comporta la ricreazione del database con tutte le tabelle. Per poter “agganciare” lo schema in produzione ad una precisa versione occorre creare la tabella migration_version e quindi inserire un record con il numero di versione. In questo caso di esempio il numero di versione definito è 24. Eseguire un doctrine:migrate 25 significa in questo caso apportare le sole modifiche allo schema relative al passaggio dalla versione 24 alla 25. Senza la tabella migration_version sarebbero stati eseguiti tutti gli step (dallo 0) fino ad arrivare alla versione 25.

CREATE TABLE IF NOT EXISTS `migration_version` (
  `version` int(11) default NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

INSERT INTO `migration_version` (`version`) VALUES
(24);
%d blogger hanno fatto clic su Mi Piace per questo: