mercoledì 30 marzo 2011

PHP - get_virtualdir

Funzione che ritorna la virtual directory dell'url:

function get_virtualdir($url = null)
{
if ($url === null) $url = $_SERVER["URL"];
$vdir = $url;
if (($pos = strpos($url, "/")) !== FALSE)
{
$vdir = ($pos == 0 ? substr($url, 1, strpos($url, "/", 1) - 1) : substr($url, 0, strpos($url, "/", 0)));
}
return $vdir;
}


Esempio:

echo "vdir: ".get_virtualdir();


e possibile passare come parametro l'url, esempio:

echo "vdir: ".get_virtualdir("/virtualdirectory/module.php");

martedì 22 marzo 2011

PHP - FastCGI timeout

Script PHP particolarmente 'pesanti' possono andare in timeout ed interrompersi. Se si sta usando FastCGI e IIS7 (disponibile con Windows 7) è possibile aumentare questo timeout lanciando un comando dos e modificando il php.ini.

Aprire una console dos ed eseguire il seguente comando:

%windir%\system32\inetsrv\appcmd set config -section:system.webServer/fastCgi /[fullPath='C:\php\php-cgi.exe'].activityTimeout:600


modificare il parametro fullPath in modo da assegnargli il percorso di installazione del motore php (C:\php\php-cgi.exe) e il parametro activityTimeout assegnadovi un valore numerico che esprime i secondi (600, per avere un timeout di 10 minuti).

Quindi è possibile verificare che il timeout sia stato impostato correttamente semplicemente eseguendo il seguente comando:


%windir%\system32\inetsrv\appcmd list config -section:system.webServer/fastCgi


il quale nell'xml visualizzato dovremmo vedere il timeout di 600 secondi:

<system.webserver>
<fastcgi>
<application activitytimeout="600" fullpath="C:\php\php-cgi.exe">
<environmentvariables>
</environmentvariables>
</application>
</fastcgi>
</system.webserver>


Infine dobbiamo modificare il php.ini per eviare l'expire della pagina php è quindi la visualizzazione di una pagina bianca, per fare questo è sufficiente modificare il parametro max_execution_time.


max_execution_time = 600 ; Maximum execution time of each script, in seconds



NB: durante l'installazione di Drupal ho dovuto fare quanto descritto per poter terminarne il setup.

SQLServer - istruzione POWER

Recentemente mi e' capitato di dover cercare in una tabella "users" di SQLServer gli utenti con delle autorizzazioni specifiche (esempio 3 e 4).

Ad esempio,
la tabella users potrebbe essere cosi' configurata:

id int: id utente
name varchar(255): nome utente
auth int: autorizzazione


...e con il seguente contenuto:

idnameauth
1Mario3(00001000)
2Luigi4(00010000)
3Toad5(00100000)

In questi casi e' da evitare la select di tutti i record (select * from users) e il successivo controllo dei singoli bit via codice.
La soluzione invece piu' razionale prevede una select in grado di estrarre i soli record che hanno i bit che ci interessano impostati a 1.

In questi casi lo statement POWER e' l'istruzione che fa al caso nostro e la seguente istruzione sql e' quella che ci serve:

SELECT id, name, auth FROM users WHERE (POWER(2, ISNULL(auth, 0)) & 24 != 0)


Una volta eseguita visualizzera' il seguente risultato:

idnameauth
1Mario3
2Luigi4

Istruzioni per creare la tabella:
CREATE TABLE [dbo].[users]( [id] [int] IDENTITY(1,1) NOT NULL, [name] [varchar](50) NOT NULL, [auth] [int] NULL, CONSTRAINT [PK_users] PRIMARY KEY CLUSTERED ( [id] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY]

LeadingZero - aggiungere degli zeri in testa ad una stringa

Questa funzione aggiunge degli zeri "0" in testa ad un stringa fino al raggiungimento di una lunghezza prefissata:


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Push "12345"
; Push 8
; Call LeadingZero
; Pop $0
; DetailPrint "result: $0" ; 00012345
Function LeadingZero
Exch $R2 ; zero
Exch
Exch $R1 ; number
Push $R0 ; result
Exch 2
Push $R3
StrCpy $R0 $R1

Loop:
StrLen $R3 $R0
${If} $R3 >= $R2
GoTo Exit
${ElseIf} $R3 > 32 ; exit if is more of 32 len
GoTo Exit
${EndIf}
StrCpy $R0 "0$R0"
GoTo Loop

Exit:
Pop $R3
Pop $R2
Pop $R1
Exch $R0
FunctionEnd

!macro LeadingZero Res Num Zero
Push "${Num}"
Push "${Zero}"
Call LeadingZero
Pop "${Res}"
!macroend

!define LeadingZero "!insertmacro LeadingZero"

venerdì 18 marzo 2011

Editare un pdf

Cosa fare quando ci viene chiesto di scaricare un modulo pdf di compilarlo e di spedirlo via email. Ma questo una volta aperto con Acrobat Reader non ci permette di fare alcuna modifica?

Non ho ne stampante e ne scanner, che fare?
In questi casi Open Office ha un'estensione gratuita che si chiama PDF Import, questa una volta installata permette di convertire un pdf nel formato odt (word di openoffice).

Quindi quello che dobbiamo fare e' installare l'ultima versione di OpenOffice e procedere con l'installazione dell'estensione pdfimport.

Questi sono i link:
OpenOffice: OpenOffice
PDF Import: PDF Import extension

A questo punto non ci rimane che importare il pdf che apparira' in Draw (Word di OpenOffice) come un documento editabile, una volta modificato sara' possibile salvarlo nuovamente come pdf!