Author Archive

Source Code, php

Immagine Random in php

Se volete visualizzare nel vostro sito un immagine casuale, un ottimo modo di fare questo è attraverso uno script php.
Un modo semplice di visualizzare un immagine casuale in php è quello di fare qualcosa del tipo: genera un numero casuale, se questo è 1 allora manda in eco l’immagine 1, se questo è 2 manda in eco l’immagine 2 etc… Il problema di questo metodo è che l’output prodotto non è un immagine ma del codice html con il tag img. Ecchissenefrega, tanto alla fine l’immagine casuale viene comunque disegnata, direte voi! Certo, ma in alcuni casi è necessario che il codice php generi direttamente un immagine, e che quindi dirigendo il browser all’indirizzo della pagina php venga visualizzata l’immagine senza che ci sia nessun sorgente HTML della pagina. A me per esempio è servito per specificare delle immagini random che vengono richiamate dal foglio di stile del sito: il css non può interpretare il php visto che è letto in locale dal browser, quindi l’immagine a cui punta il css deve essere una vera e propria immagine, altrimenti questa non verrà visualizzata.
Bando alle ciance quindi.
Un esempio di immagine casuale è quella qui sotto :)
Immagine random

Preferite i cani, il gatto o il criceto molto fortunato? :D (refresh per randomizzare un’altra immagine)
Continue Reading »

.NET, C

Errore Designer Visual Studio

Piccolo post per un problema del Visual Studio .NET 2005 riscontrato oggi a lavoro, che spero possa aiutare qualcuno con lo stesso problema.

Mentre lavoravo su un progetto, aprendo un form che includeva al suo interno diversi User Control creati da me mi è comparsa una schermata simile alla seguente al posto del Designer:

One or more errors encountered while loading the designer. The errors are listed below. Some errors can be fixed by rebuilding your project, while others may require code changes.

Non potevo più editare il form nel designer, ma stranamente il codice veniva compilato ed eseguito correttamente. Provando a fare Clean Solution e Build Solution l’errore permaneva. Ho provato quindi a controllare il codice generato dal designer, temendo che avesse combinato qualche disastro, ma neanche qui niente di strano. Quando iniziavo a temere il peggio, cercando su internet con un mio collega abbiamo trovato la soluzione: bisogna cancellare le directory /bin e /obj del progetto e fare il rebuild del progetto per fare tornare le cose alla normalità. Ho sempre reputato il Visual Studio un ottimo prodotto, ma questo bug è abbastanza antipatico: mi ha fatto perdere un pò di tempo e adesso mi si ripropone in continuazione, costringendomi a cancellare le directory da Explorer e a rifare il rebuild… :f7:

Non capisco sinceramente perchè facendo il Clean Solution più il Build Solution la cosa non si risolva da sola, visto che in teoria il compito del rebuild dovrebbe essere proprio quello di cancellare tutti i file temporanei creati!

C, MySQL, php

Ottenere una stringa pulita SQL

Il post seguente fa parte del progetto SQLStringBuilder. Per le ultime versioni del codice sorgente si consiglia di prelevare il codice dal CVS.

Se dobbiamo lavorare con delle stringhe SQL in un ambiente in cui la sicurezza è fondamentale, non possiamo assolutamente permetterci di mandare in pasto al MySQL stringhe senza prima averle ripulite per bene. Quella che può sembrare un esagerazione di un programmatore pazzo invece si reputa un enorme falla di sicurezza se non implementata
Se per esempio diamo in pasto la seguente SQL al db: string sql = "INSERT INTO table VALUES('" + textBoxNomeCliente.Text + "')";

dove textBoxNomeCliente è il text box riempito dall’utente, i rischi di sicurezza sono praticamente enormi. Cosa succederebbe se per esempio il cliente nel textbox scrivesse:

Ti sto per fottere il DB...'); DROP TABLE "tabellaConDatiImportantissimi"; INSERT INTO table VALUES('ti ho fottuto il DB haha!

La query in pratica diventerebbe:

INSERT INTO table VALUES('Ti sto per fottere il DB...'); DROP TABLE "tabellaConDatiImportantissimi"; INSERT INTO table VALUES('ti ho fottuto il DB haha!')

Bello vero?? In pratica l’utente malintenzionato può facilmente eseguire tutte le query che vuole, in questo caso cancellando completamente una tabella.
Continue Reading »

C

Metodi deprecati

Piccolo post per una cosa facile e veloce: Se volete che in c# un metodo sia visto dall’Intellisense come deprecato (non come depravato :f7: ) basta aggiungere l’attributo Obsolete all’intestazione del metodo.

[Obsolete("Questo metodo non si dovrebbe usare! ")]
public void MetodoDepravato()
{
MessageBox.Show(”Sono un metodo depravato! Sbav, sbav…”);
}

stop

Il bello di dichiarare un metodo come deprecato è che durante la compilazione verrete avvertiti con un Warning o addirittura con un Error se dichiarate l’attributo con il parametro true alla fine:

[Obsolete("Questo metodo non si può usare. Utilizzare Metodo2()", true)]
public void Metodo1()
{  ….  }
public void Metodo2()
{  ….  }

News, Windows

Vista miope

Dopo Vista 3.1, continuo con le mie impressioni veloci su Windows Vista. C’è da premettere che non ho avuto moltissimo tempo per provarlo (in totale avrò fatto un paio di sessioni di circa un ora e mezzo l’una su un pc a casa di amici), ma bisogna anche ribadire che se nel giro di quel poco tempo ho trovato tutte queste magagne, Vista non è poi un sistema operativo così perfetto!! :D
Punto 1: Integrazione con i nuovi controlli

Windows-vista-Wordpad-con-grafica-schifosa

Vista ha i controlli più belli e luminosi, ma nonostante questo tra i programmi di base inclusi nel sistema operativo non tutti sono perfettamente integrati! Nell’immagine si vede benissimo come il Firefox risulti molto più integrato del Wordpad, che in teoria dovrebbe essere stato compilato per girare alla perfezione su Windows Vista!! Il Notepad è più integrato, ma è rimasto lo stesso di Windows 95, con la funzione “A capo automatico” disattivata di default… :f7:

Punto 2: Giochi succhia-RAM

Chess.exe occupa 100MB di RAMVista ha preinstallato un gioco di scacchi veramente grazioso con una grafica 3D molto carina. Il problema è che questo semplicissimo gioco di scacchi, già all’apertura occupa cento MB di RAM!!! Ci saranno una dozzina di modelli 3D caricati da massimo 50KB l’uno, più tre texture da massimo 400 KB l’uno, perchè caspita deve occupare 100 MB di RAM? A quanto pare l’ottimizzazione alla M$ è un optional! Che schifo!! :f1:

Tra l’altro ho provato a perdere una partita, e spunta subito una schermata in primo piano che dice “HAI PERSO, SCARSONE, MWHAHAHHAA”, che non fa vedere che cavolo è successo alla fine della partita, senza dare la possibilità all’utente che ha perso di studiare la posizione finale della scacchiera… bah…

Punto 3: l’Aero non decolla

Continue Reading »

C, MySQL

Convertire un oggetto DateTime C# in un campo SQL

Il post seguente fa parte del progetto SQLStringBuilder. Per le ultime versioni del codice sorgente si consiglia di prelevare il codice dal CVS.

Per costruire una stringa SQL in cui dobbiamo inserire un campo di tipo data, la soluzione più ovvia sembra quella di prendere l’oggetto DateTime in cui è contenuta la data e convertirlo in stringa, dopodichè aggiungere questo valore alla condizione della stringa della query SQL:

DateTime date = DateTime.Now;
string sql = "INSERT INTO tableWithDate VALUES(1, "+ date.ToString() + ")";

Purtroppo DateTime.ToString() ci ritorna una stringa del tipo 23/02/2007 19.00.49, mentre il MySQL vuole passata una stringa del tipo 2007-02-23 19:00:49, quindi il pezzo di codice precedente, se eseguito, ci restituirebbe un bell’errore MySQL.
Il semplicissimo metodo statico qui di seguito permette di convertire un oggetto DateTime in stringa in modo da essere accettato dal MySQL:

public static string GetSQLDate(DateTime date)
{
string sql;
sql = date.Year.ToString() + "-" + date.Month.ToString() + "-" + date.Day.ToString() + " "
+ date.Hour.ToString() + ":" + date.Minute.ToString() + ":" + date.Second.ToString();
return sql;
} 

Io ho inserito il metodo all’interno di una classe di utilità, che ho chiamato per l’appunto Utils, quindi la query iniziale diventerà:

string sql = "INSERT INTO tableWithDate VALUES(1, "+ Utils.GetSQLDate(date) + ")";

C, MySQL

Salvare un Blob MySQL in C#

Il post seguente fa parte del progetto SQLStringBuilder. Per le ultime versioni del codice sorgente si consiglia di prelevare il codice dal CVS.

Oggi mi si è posto davanti il problema di salvare un campo blob in un database MySQL utilizzando c# come linguaggio. La soluzione è stata abbastanza semplice, ma può risultare ostico trovarla per chi non è avezzo con il C#.

Il Blob è un campo binario dove vengono salvati dati, e per passare questi dati binari all’interno di una stringa SQL testuale dobbiamo convertire i dati binari in una rappresentazione esadecimale e poi inserirli nella SQL.

Binary data

Il risultato sarà qualcosa del genere:

INSERT INTO tableWithBlob VALUES(1,0xab425fa52d3e13);

Dove 0x…. sono i nostri dati binari.

Innanzitutto dobbiamo convertire la struttura dati da salvare nel database in un array di byte (byte[]), o comunque dobbiamo poter accedere a tutti i byte della struttura.
Continue Reading »

C, Windows

Timer in c++

Per utilizzare un timer in c++ su Windows bisogna invocare il metodo SetTimer(), definito in windows.h.

UINT_PTR SetTimer(
// handle alla finestra associata al timer
HWND hWnd,
// ID che vogliamo associare al timer
UINT_PTR nIDEvent,
// tempo del timer in millisecondi
UINT uElapse,
// metodo da invocare allo scattare del timer
TIMERPROC lpTimerFunc
);

L’argomento hWnd è un handle alla finestra associata al timer: per semplicità inizialmente lo impostiamo a NULL.

La funzione ritorna sempre un uint che indica l’ID del timer creato. Se hWnd è NULL il secondo parametro verrà ignorato e non possiamo associare direttamente un ID al timer; l’ID ci verrà ritornato dalla funzione, e se questo è diverso da zero allora il timer è stato creato con successo. Se invece hWnd non è nullo, l’ID del timer verrà assegnato con il parametro nIDEvent.

Aggiungiamo quindi una variabile globale dove salviamo l’ID del timer creato:

uint m_timerID;

Continue Reading »

Site, Wordpress

Installare più blog Wordpress sullo stesso server

Se volete che il vostro blog sia diviso in due o più sezioni fortemente separate l’una dall’altra (per esempio, nel mio caso un blog personale e un blog di programmazione) le soluzioni possibili sono essenzialmente due:

  • Dividere il blog in categorie e nella home page fare selezionare le categorie. Un ottimo esempio di questo stile è il sito di gls.
    Doppio blog wordpress con categorie
    Pro: Unica installazione di Wordpress
    Contro: Stesso tema per le diverse sezioni del blog (Come fatto notare da Maya in un commento, bastava personalizzare il css per ogni categoria.
    Contro: Difficile organizzare ogni blog in sottocategorie (a questo punto mi aspetto qualche altro commento che mi smentisca!! :D)
  • Fare due installazioni separate di wordpress in due cartelle diverse.
    Doppio blog wordpress con doppia installazione
    Pro: Possibilità di diversificare la grafica delle sezioni
    Contro: Un installazione di Wordpress (con relativi files e database) per ogni sezione

Continue Reading »

Wordpress, php

Problema con i commenti utilizzando il tema Redoable

Mavero su un commento mi segnala che ha avuto problemi con i commenti utilizzando il tema Redoable. Siccome anche io ho avuto un problema simile, faccio questo post nella speranza che possa essere utile ad altra gente per risolvere questo problema. Mavero segnala che quando utilizza il tema al posto dei commenti viene visualizzata la scritta “COMMENTS ARE CURRENTLY CLOSED”. Nel mio caso invece qualsiasi commento cliccassi, mi venivano semrpe visualizzati i commenti al primo post nel blog. Non so se il problema è lo stesso, ma scrivo comunque qui la soluzione.

Bisogna aprire il file single.php e modificare le righe finali del file in modo da trasformarle da così

</div>
<div id=”rightcolumn”>
<?php get_sidebar(); ?>
</div>
<div class=”clear”></div>
</div> <!– .content –>
<?php comments_template(); ?>
<?php get_footer(); ?>

a così:

</div>
<?php comments_template(); ?>
<div id=”rightcolumn”>
<?php get_sidebar(); ?>
</div>
<div class=”clear”></div>
</div> <!– .content –>
<?php get_footer(); ?>

Non so per quale arcano motivo, ma chiamando comments_template() dopo get_sidebar() i commenti non venivano visualizzati correttamente (almeno nel mio caso).

« Prev - Next »