Archive for Febbraio, 2007

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).

MySQL

Come usare le Stored Procedure in MySQL

Esattamente come una funzione in qualsiasi linguaggio di programmazione evita di riscrivere più volte le stesse cose, le Stored Procedure sono un ottimo metodo di ripetetere query complicate e parametrizzarle in modo da poterle riutilizzare in qualsiasi momento, e col vantaggio di non lavorare direttamente con stringhe SQL chilometriche.

Per creare una nuova Stored Procedure è necessario avere installato MySQL con versione maggiore o uguale alla 5.0 (le Stored Procedure sono state infatti introdotte proprio nella versione 5.0). Se si utilizza il MySQL Query Browser la creazione è abbastanza immediata:

Clic col tasto destro sul database in cui si vuole creare la procedura (Dalla versione 5.0.1 le Procedure sono assegnate a un Database specifico, nella versione 5.0 invece erano globali)

New Stored Procedure From QueryBrowser

Continue Reading »

.NET, C, Source Code

Accesso ottimizzato alle Bitmap

Se bisogna fare elaborazione delle immagini in c#, il metodo più immediato per un programmatore di accedere ai pixel di una Bitmap è quello di utilizzare i metodi SetPixel() e GetPixel() forniti dal .NET. Purtroppo il metodo più veloce per il programmatore, spesso non corrisponde al metodo più veloce per il programma: considerando che queste due funzioni sono MOLTO lente, se il vostro scopo è quello di analizzare tutti i pixel di un immagine o, ancora peggio, di fare elaborazione di tante immagini in sequenza, è fortemente sconsigliato utilizzarle. Per fortuna il c# è un linguaggio molto flessibile, che permette di fare cose ad altissimo livello ma che comunque ci lascia sempre la possibilità di scendere a basso livello quando è necessario.

In questo articolo per semplicità tratterò soltanto le immagini a 8bpp (8 bit per pixel), ovvero a 256 colori.

Per riuscire a lavorare con i dati di un immagine in maniera veloce la soluzione è solo una: utilizzare il puntatore ai dati dell’immagine! Lavorare con i puntatori ad immagini è un pò come lavorare con i puntatori a char (le stringhe in c++): Il puntatore punterà al primo indirizzo di memoria dei dati della bitmap, dove sarà contenuto il primo pixel. Incrementando il puntatore andremmo ottenendo via via i valori degli altri pixel.
Puntatore a bitmap
Continue Reading »

C, Source Code

Abstract Base Class in C++

I linguaggi di programmazione più orientati agli oggetti, come il Java o il C#, utilizzano la classe Object come classe base astratta da cui derivano automaticamente tutte le classi che vengono create. Nel c++ questo approccio è meno diretto, in quanto quando viene creata una classe questa non deriva da nessun’altra classe. Ciò permette al c++ di essere più ottimizzato e permette al programmatore di scegliere l’approccio che più preferisce all’interno del proprio progetto: Se questo è un progetto semplice si possono utilizzare le classi senza grandi problemi, altrimenti conviene crearsi una propria Abstract Base Class (per gli amici ABC) da cui derivare tutte le proprie classi.

Abstract Base Class

Continue Reading »

Next »