giovedì 29 dicembre 2011

Stampare dei pentagrammi musicali


Stampare i vostri pentagrammi musicali personalizzati è possibile con pochi click accedendo a questo sito:
http://www.blanksheetmusic.net/

Registrandovi potrete utilizzare dei pentagrammi predefiniti e salvare i propri. Se pero' preferite salvare il vostro pentagramma come file su disco per utilizzarlo in seguito senza dover accedere ad Internet, allora potete seguire le poche operazioni descritte di seguito.
Per prima cosa occorre installare il software PdfCreator che virtualizza una stampante, quindi sarà sufficiente scegliere quest'ultimo device in fase di stampa per effettuare il salvataggio della stampa come file:
http://sourceforge.net/projects/pdfcreator/

Come suggerito dal sito blanksheetmusic si dovrà fare attenzione se il pentagramma e' stato orientanto in landscape, infatti in questo caso sara' necessario fare la stessa cosa con l'analoga proprieta' della stampante virtuale.

Infine, qualora fosse utile unire due pdf per avere un unico foglio per la stampa fronte retro vi suggerisco di usare questo sito che non necessita dell'installazione di alcun software.
http://www.pdfjoin.com/

Qui sotto potete scaricare alcuni pentagrammi creati utilizzando i passi descritti sopra:
Pentagrammma 1
Pentagrammma 2

martedì 26 aprile 2011

Installazione antenna tv per digitale terrestre

Qualche mese fa in seguito allo switchoff tv della mia regione ho dovuto per forza di cose dismettere il vecchio impianto tv analogico, ormai a pezzi, per installarne uno nuovo per il digitale terrestre.
Anche se sono un antennista dilettante proverò a condividere in questo post la mia esperienza.

Il primo consiglio è di guardare gli impianti nuovi dei vicini: la tipologia di antenne installante (UHF o VHF), se sono intallate con polarizzazione verticale o orizzontale e infine il loro orientamento.
Andando da un installatore o un venditore specializzato in antenne tv è possibile  farsi consigliare sul modello e, se siete fortunati, dicendogli dove verrà installato l'impianto anche i nomi dei trasmettitori.

Il sito di riferimento per capire quali antenne acquistare è: http://www.otgtv.it/
Aperto il sito selezionate la regione dove verrà eseguita l'installazione, la provincia e infine il comune. Qui occorre premere il pulsante 'elenco multiplexer' per visualizzare i gruppi di canali e le caratteristiche tecniche dei trasmettitori (canale, banda, frequenza, polarizzazione, sito dove si trova il trasmettitore).

Nel mio caso sono stato fortunato, ho trovato un negozio che mi ha saputo dire con precisione dove erano dislocati i due trasmettitori UHF, uno con polarizzazione verticale e uno con polarizzazione orizzontale; quello VHF era previsto per trasmettere la rai in hd, ma non ancora in funzione.
Guardando il sito dgtvi occorre capire quali tv nazionali vogliamo ricevere, quindi dobbiamo prendere nota del trasmettitore, della banda (UHF, VHF) e della polarizzazione (H, V).

Qualora si debbano installare due antenne UHF con la stessa polarizzazione (nel mio caso LA7 ad esempio era trasmessa da un terzo trasmettitore UHF), ma orientante differentemente, potrebbe essere il caso di preoccuparsi di come evitare che i canali di un'antenna vadano a interferire con quelli dell'altra. In questi casi potrebbe essere necessario aggiungere dei filtri passa banda per separare i canali/frequenze in modo da azzerare le interferenze; alcune centraline sono tarate in laboratorio per filtrare i canali in frequenza e in ampiezza (dB).
In ogni caso una volta deciso quali sono i trasmettitori, si dovrà acquistare tutto il necessario.
Facciamo l'ipotesi di avere bisogno di due antenne UHF, una V e una H, e di una VHF.
Nel mio caso non avevo a disposizione nel sottotetto la tensione 220 volt, quindi ho dovuto alimentare l'impianto dall'appartamento. In questi casi si deve acquistare una amplificatore da palo che faccia anche da miscelatore con tre ingressi UHF1, UHF2 e VHF (BIII) ed un'uscita; ai tre ingressi dovranno essere collegati i coax provenienti dalle tre antenne, mentre l'uscita sarà l'ingresso del derivatore. Quest'ultimo viene utilizzato per dividere il segnale multiplexato in modo tale da permettere le calate agli appartamenti.
Se alcune uscite del derivatore non vengono utilizzate si dovrà inserirvi una resistenza di chiusura da 75 ohm per evitare il propagarsi dei segnali di riflessione che potrebbero causare interferenze.
Invece dell'amplificatore da palo si poteva scegliere un multiplexer e amplificare le antenne utilizzando un amplificatore/alimentatore da mettere in casa, in questo caso però verrebbe amplificato anche il rumore propagatosi con il segnale tv fino all'amplificatore in casa. Problema evitato scegliendo un amplificatore da palo, che però dovremo alimentare utilizzando un semplice alimentatore tv da appartamento (e non un amplificatore!).
Una volta conclusa l'installazione si dovrà tarare l'amplificatore da palo regolando i dB in ingresso, può infatti accadere che abbassando il guadagno di un segnale (ex. UHF1) si aumenti la qualità di un altro segnale (ex UHF2), lasciando pressochè inalterata la qualità di quello su cui si è intervenuto. Durante l'installazione del mio impianto ad esempio mi è capitato di vedere squadrettare Iris, abbassando il guadagno dell'altra antenna sono riuscito a trovare un valido compromesso fino a risolvere il problema.
Anche l'orientamento delle antenne puo' influire sulla qualità complessiva dell'impianto tv, anche se questo dipende molto da come sono grandi i lobi del diagramma di radiazione dell'antenna, nel mio caso ad esempio anche muovendole di parecchi gradi non notavo alcuna variazione della qualità.
Alcuni amplificatori da palo hanno una circuiteria a diodi che consentono di alimentare l'impianto da piu' appartamenti.
La differenza tra partitore (o divisore) e derivatore (o deviatore) è che il primo viene utilizzato per fare le calate o linee di distribuzione. Il derivatore invece viene usato per distribuire il segnale verso le varie prese tv permettendo di continuare la discesa verso altri derivatori. I derivatori possono essere resistivi, con un comportamento identico per ogni frequenza, o direzionali, con una attenuazione che decresce con la frequenza compensado la perdita di segnale del coassiale.



Nel mio caso ho usato:
amplificatore da palo televes 5370 (http://www.televes.com/italiano/noticias/pdf/5370_5377_ITA.pdf)
derivatore offel digit p4-12 costituito da un ingesso IN, quattro uscite derivate DER e di un'uscita passante OUT (http://www.tierresrl.it/pag/it/pdf/offel.pdf).


Siti alcuni costruttori di materiale per impianti televisivi:
http://www.televes.com
http://www.offel.it/
http://www.fracarro.it/


derivatore
amplificatore da palo



Per approfondire sulle antenne:
http://www.inftube.com/tecnica/telecomunicazioni/LE-ANTENNE-Caratteristiche-del13388.php

Frequenze divise per banda VHF o UHF:
VHF:
    47 e 68 MHz, per la banda I (canali A e B);
    81 e 88 MHz, per il canale C;
    174 e 230 MHz, per la banda III (canali da D a H1).

UHF:
    da 470 a 606 MHz, per la banda IV (canali da 21 a 37);
    da 606 a 862 MHz, per la banda V (canali da 39 a 69).

Tabella di conversione canale/frequenza:
Canale Frequenza MHZ Banda
D/E5 175,25 VHF 3
E6 182,25 VHF 3
E 183,75 VHF 3
E7 189,25 VHF 3
F 192,25 VHF 3
E8 196,25 VHF 3
G 201,25 VHF 3
E9 203,25 VHF 3
H/E10 210,25 VHF 3
H1/E11 217,25 VHF 3
H2/E12 224,25 VHF 3
21 471,25 UHF 4
22 479,25 UHF 4
23 487,25 UHF 4
24 495,25 UHF 4
25 503,25 UHF 4
26 511,25 UHF 4
27 519,25 UHF 4
28 527,25 UHF 4
29 535,25 UHF 4
30 543,25 UHF 4
31 551,25 UHF 4
32 559,25 UHF 4
33 567,25 UHF 4
34 575,25 UHF 4
35 583,25 UHF 4
36 591,25 UHF 4
37 599,25 UHF 5
38 607,25 UHF 5
39 615,25 UHF 5
40 623,25 UHF 5
41 631,25 UHF 5
42 639,25 UHF 5
43 647,25 UHF 5
44 655,25 UHF 5
45 663,25 UHF 5
46 671,25 UHF 5
47 679,25 UHF 5
48 687,25 UHF 5
49 695,25 UHF 5
50 703,25 UHF 5
51 711,25 UHF 5
52 719,25 UHF 5
53 727,25 UHF 5
54 735,25 UHF 5
55 743,25 UHF 5
56 751,25 UHF 5
57 759,25 UHF 5
58 767,25 UHF 5
59 775,25 UHF 5
60 783,25 UHF 5
61 791,25 UHF 5
62 799,25 UHF 5
63 807,25 UHF 5
64 815,25 UHF 5
65 823,25 UHF 5
66 831,25 UHF 5
67 839,25 UHF 5
68 847,25 UHF 5
69 855,25 UHF 5

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!

mercoledì 12 gennaio 2011

Conversione numerica da/a qualsiasi base

Riporto il codice autocostruito per NSIS al fine di eseguire delle conversioni numeriche da base decimale a qualsiasi altra base compresa tra 2 e 36.


Function DecToBX
Exch $R2 ; base
Exch
Exch $R1 ; number
Push $R0
Exch 2
Push $R3
StrCpy $R0 "" ; result

Loop:
System::Int64Op $R1 % $R2
Pop $R3

StrCpy $R3 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" 1 $R3
StrCpy $R0 "$R3$R0"

System::Int64Op $R1 / $R2
Pop $R1

StrCmp $R1 0 0 Loop

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

!macro DecToBX Res Num Base
Push "${Num}"
Push "${Base}"
Call DecToBX
Pop "${Res}"
!macroend

!define DecToBX "!insertmacro DecToBX"


Di seguito il codice per fare l'operazione inversa, ovvero convertire un numero da qualsiasi base numerica in decimale:


Function BXToDec
Exch $R2 ; base
Exch
Exch $R1 ; number
Push $R0 ; result
Exch 2
Push $R3
StrCpy $R0 0

Loop:
StrCpy $R3 $R1 1 0
${IndexOf} $R3 "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" $R3
System::Int64Op $R0 * $R2
Pop $R0 ; vale -1 in caso di errore
System::Int64Op $R0 + $R3
Pop $R0
StrCpy $R1 $R1 "" 1
StrCmp $R1 "" 0 Loop

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

!macro BXToDec Res Num Base
Push "${Num}"
Push "${Base}"
Call BXToDec
Pop "${Res}"
!macroend

!define BXToDec "!insertmacro BXToDec"


La funzione BXToDec fa uso della macro IndexOf il cui codice si puo' recuperare dal seguente link: IndexOf source code

Esempio di utilizzo:

${DecToBX} $R0 0xF58DE 36 ; return LK2M
DetailPrint "result: $R0"

${BXToDec} $R0 "LK2M" 36 ; return 1005790 (0xF58DE)
DetailPrint "result: $R0"


Incrociano le due funzioni e' possibile fare una conversione da qualsiasi base numerica, ad esempio da base 16 a base 36:

${BXToDec} $R0 "F58DE" 16 ; return 1005790
${DecToBX} $R0 $R0 36 ; return LK2M
DetailPrint "result: $R0"


Entrambe le funzione non fanno alcun controllo sui parametri, ad esempio che la base sia nel range compreso tra 2 e 36.

Per verificare il risultato potete usare questo link: http://www.translatorscafe.com/cafe/units-converter/numbers/calculator/decimal-to-base-36

martedì 11 gennaio 2011

Aggiungere il supporto SourceSafe a PhpED

Deciso! Metto tutto su SourceSafe cosi' non mi rompo piu' le scatole a sincronizzare le modifiche dei sorgenti php. Il problema e' riuscire ad integrare SS con PhpED, l'ide che al momento e' in cima ai miei preferiti, anche se c'e' stato qualche vano tentativo di passare ad Eclipse.

Accedere alle variabili di ambiente di Windows e aggiungere alla PATH delle "Enviroment Variables -> System Variable" il percorso di installazione di SourceSafe, dove all'interno del folder dovra' essere presente il comando ss.exe:
C:\Program Files (x86)\Microsoft Visual SourceSafe;

Sempre nelle "Enviroment Variables -> System Variable" di Windows creare la voce SSDIR ed assegnarvi il percorso del file "srcsafe.ini", nel mio caso si trovava su un server in rete, quindi nel mio caso ho fovuto assegnarvi un indirizzo di questo tipo:
\\server_sourcesafe\Progetti\VSS

NB: e' possibile che prima di utilizzare PhpED per fare il CheckOut/CheckIn dei file di progetto si debba accedere alla cartella (SSDIR) via file system inserendo le credenziali se richieste.

Una volta preparate le due variabili di ambiente non ci rimane che aggiungere le voci di menu all'interno di PhpED:
- Selezionare Tools -> Settings -> Integration
- Premere il pulsante Add Menu, quindi editare il nome che si vuole dare alla nuova voce di menu contestuale. Per il checkout ho utilizzato "Check Out".
- Selezionare la voce di menu "Check Out" e premere Edit, quindi selezionare la voce Shell nella 'Execute with' e inserire come command line:
ss Checkout "$/SourceSafeProjectPath@RelFName@" -GL@Path@, dove '$/SourceSafeProjectPath' si riferisce al path del progetto in SS (valore adiacente alla label 'name' nelle proprieta' del progetto SS)
- Infine nelle opzioni selezionare 'Show this command in Workplace popup' e 'for files'

Proseguire aggiungendo le altre voci di menu "Check In" e "Undo Check Out" ripetendo i passi precedenti e evendo cura di modificare il comando di shell a seconda dei casi.
Qui sotto sono brevemente elencati i comandi SourceSafe in base alle funzionalita':

Check Out
ss Checkout "$/SourceSafeProjectPath@RelFName@" -GL@Path@

Check In
ss Checkin "$/SourceSafeProjectPath@RelFName@" -GL@Path@ -C

Undo Check Out
ss Undocheckout "$/SourceSafeProjectPath@RelFName@" -GL@Path@


Per conoscere i comandi riconosciuti da ss.exe fare riferimento al seguente link:
http://msdn.microsoft.com/en-us/library/003ssz4z%28v=vs.80%29.aspx

Mentre per le variabili contestuali utilizzabili nelle macro di PhpED, aprire l'help e andare alla seguente pagina:
Contents -> Customized PhpED -> Type of handlers and macros