Categoria ‘Sviluppo’


Varietà di coding e di coding

Qualcuno sostiene che la programmazione è un arte e, in ultima analisi, non posso che essere d’accordo soprattutto quando si scovano soluzioni estremamente diverse per un medesimo problema. Per capire quanto sia vero questo, ecco come un’identica necessità nel medisimo linguaggio (Javascript) può essere risolta con approcci assolutamente diversi ed originali.

Left Pad zero

Un numero, ma il discorso è valido anche per una qualsiasi stringa, come 123 può essere riempito a sinistra – per pareggiarlo – con un certo numero di zeri, ad esempio: 00123. Questa necessità si presenta in varie occasioni e risulta utile per incolonnare – o comunque mostrare – un numero in maniera pulita, indicandone implicitamente il suo valore massimo. Nei videogame, ad esempio, il classico punteggio (lo score) viene spesso indicato con 001234, indicando che al massimo si arriverà a 999999. Ecco come lo stesso problema è stato risolto da vari sviluppatori:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
 * Left Pad String
 *
 * @from          http://snipplr.com/view/8423/left-pad-string/
 * @author-web    http://www.mechanicmatt.com/
 *
 * @param         num         - Striga da riempire
 * @param         totalChars  - Numero totale di caratteri, comprensivo degli "zeri"
 * @param         padWidth    - Carattere usato per riempire, default "0"
 */

function leadingZeros(num, totalChars, padWith) {
    num = num + "";
    padWith = (padWith) ? padWith : "0";
    if (num.length < totalChars) {
        while (num.length < totalChars) {
            num = padWith + num;
        }
    } else {}

    if (num.length > totalChars) { //if padWith was a multiple character string and num was overpadded
        num = num.substring((num.length - totalChars), totalChars);
    } else {}

    return num;
}
alert(leadingZeros("asdf", 10, "0"));

Questa soluzione è estremamente articolata, tuttavia permette di aggiungere un numero indefinito di 0 al numero num scegliendo anche il tipo di carattere da usare tramite padWidth, invece del default 0.
Decisamente originale, invece, questa soluzione:

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
 * string_pad
 *
 * @from        http://snipplr.com/view/700/stringpad/
 * @author      http://d.hatena.ne.jp/brazil/20060721/1153489937
 *
 * @param         str         - Striga da riempire
 * @param         len         - Numero totale di caratteri, comprensivo degli "zeri"
 * @param         ch          - Carattere usato per riempire
 */

function pad(str, len, ch){return new Array(len-(''+str).length+1).join(ch) + str}

alert(pad(56, 4, '0')); // 0056

Stesso risultato, con un approccio completamente diverso. Anche in questo caso abbiamo la possibilità di decidere il numero di caratteri padding tramite il parametro len e il tipo di carattere da usare tramite ch. Manca però l’uso del default previsto nella precedente funzione.
Quella che uso io, invece…:

1
2
3
4
5
6
7
8
9
10
11
12
/**
 * string_pad
 *
 * @author      Giovambattista Fazioli
 * @web         http://www.undolog.com
 *
 * @param         s           - Striga da riempire
 * @param         l           - Stringa che indica sia il carattere che la lunghezza
 *                              ad esempio "0000" = carattere "0" lunghezza 4
 */

function padding(s,l) { return( l.substr(0, (l.length-s.length) )+s ); }
alert( padding('123','0000') );

Se avete altre soluzioni interessanti non esitate a commentare :D

Continua...

Actionscript 3.0: MovieClip over MovieClip

Appena uno sviluppatore Flash/Actionscript si appresta a scrivere una funzione simile ad un tooltip, si scontra immediatamente con il problema della propagazione degli eventi tra MovieClip sovrapposti. Infatti se un MovieClip (B) si sovrappone ad un MovieClip (A) che risponde, ad esempio, ad un evento MouseEvent.Mouse_OVER, passando con il mouse sul MovieClip (B) più alto nessun evento verrà più intercettato dal MovieClip (A):

MovieClip over MovieClip

Continua...

Una classe countDown in Javascript

Nel post 3D CountDown con FIVe3D (vedi anche How I Did It: scrivere un countdown in Flash), veniva proposta una classe per la creazione di un oggetto CountDown in Actionscript, eccone una versione simile in Javascript:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
 * CountDown Class
 *
 * @author        Giovambattista Fazioli
 * @email         g.fazioli@undolog.com
 * @web           http://www.undolog.com
 *
 * @param    dd   (string) 'month day, year'
 *
 */

function countDown( dd ) {
    // init target time
    var target            = new Date( dd );
    this.targetTime        = target.getTime();
   
    /**
     * refresh countdown
     */

    this.refresh = function() {
        var today                 = new Date();
        var currentTime           = today.getTime();
        // time left
        this._leftMilliseconds    = (this.targetTime - currentTime);
        this._leftSeconds         = Math.floor( this._leftMilliseconds / 1000 );
        this._leftMinutes         = Math.floor( this._leftSeconds / 60 );
        this._leftHours           = Math.floor( this._leftMinutes / 60 );
        // no module
        this.leftDays             = Math.floor( this._leftHours / 24 );
        // for print
        this.leftMilliseconds     = this._leftMilliseconds % 1000;
        this.leftSeconds          = this._leftSeconds % 60;
        this.leftMinutes          = this._leftMinutes % 60;
        this.leftHours            = this._leftHours % 24;
    }
    this.refresh();
}

Esempio

1
2
3
var cd = new countDown( '1 1, 2009' );
// mostra quanti giorni, ore, minuti, secondi e millisecondi al primo gennaio 2009
document.write( cd.leftDays + "," + cd.leftHours + "," + cd.leftMinutes + "," + cd.leftSeconds + "," + cd.leftMilliseconds );

Continua...

Very short trick: export con data da PHPMyAdmin

Quando si effettua un export da PHPMyAdmin è possibile preimpostare il campo “Nome file template”, nella sezione “Salva con nome…”, in modo tale che aggiunga in automatico la data del giorno. Normalmente questo campo è preimpostato a __DB__, che rappresenta il nome del database. Inserendo ad esempio __DB__-%Y%m%d otteremo il nome del nostro database seguito dall’anno, mese e giorno correnti: miodb-20081010

Continua...

Very short trick: avoid error message in PHP

Se non vogliamo che una funzione PHP emetta un qualsiasi errore o warning, basta inserire prima della chiamata alla funzione il carattere chiocciola – o at – (@):

1
2
3
4
// invece di usare la forma canonica
$res = miaFunc();
// è possibile usare
$res = @miaFunc();

Continua...

WordPress: come scrivere un reply to comment usando jQuery

Recentemente Cristiano Fino ha rilasciato un utile Plugin per WordPress in grado di aggiugere due link ad ogni commento di un post (forse ne avete uno simile installato, visto che nella directory di WordPress.org ne ho travati un paio, tuttavia essendo un software italiano sarebbe il caso di onorare l’ottimo lavoro fatto da Cristiano). Questi Link (reply & quote) permettono di rispondere e/o quotare l’autore di un commento, eseguendo quella noiosa operazione di inserire il carattere at (@) per indicare a chi ci si rivolge. In questo tutorial voglio illustrare – per gli utenti medio-esperti – il modo di aggiugere queste due funzionalità “a mano”, senza ricorrere all’istallazione di nessun Plugin. Inoltre sfrutterò le capacità di jQuery per la parte in Javascript. La tecnica che espongo è la medesima che ho usato per introdurre questa funzionalità in questo blog.

Nota: l’uso di un plugin è la miglior soluzione per chi tende a modificare spesso il proprio template WordPress o, al limite, ha in previsione di farlo. Questo tutorial vuole solo mostrare come eseguire interventi mirati all’interno del codice WordPress ed è dedicato ai più curiosi.

Modifica del file comments.php

La prima modifica che apportiamo è quella di inserire i link “reply” e “quote” all’interno di ogni commento. Per fare questo editiamo il file comments.php situato nella cartella del nostro tema. Questo file contiene tutte le istruzioni che consentono di visualizzare i commenti alla fine di un post. La sezione che ci interessa (che può variare leggermente da tema a tema) è il loop di creazione dei vari commenti, riconoscibile da:

Continua...

Adobe Creative Suite 4: Roma 21 ottobre 2008

Adobe Creative Suite 4: Roma 21 ottobre 2008

Adobe è lieta di invitarti agli eventi di lancio della nuova Adobe Creative Suite 4. Ti aspettiamo a Roma il 21 Ottobre e a Milano il 30 Ottobre. Per tutti i dettagli dell’incontro vai al minisito dedicato agli eventi CS4! In omaggio per tutti i partecipanti la t-shirt CS4!

Io cercherò di esserci… soprattutto per la maglietta :)

Continua...

Very short trick: PHP auto echo

In PHP è possibile usare una forma abbreviata, o contratta, per visualizzare variabili o ritorni di funzioni:

1
2
3
4
5
6
7
8
// al posto di
<?php echo $miavar ?>
// è possibile scrivere
<?=$miavar?>
// al posto di
<?php echo miaFunc() ?>
// è possibile scrivere
<?=miaFunc()?>

Continua...

Skypemote versione Adobe AIR

Download Install Skypemote Adobe AIR Version

Questa è la prima release, la 0.8 (allineata con la versione online), di Skype Emotions Editor – Skypemote – in versione Adobe AIR. Per adesso le funzionalità sono le medisime della versione online, con il vantaggio di essere un’applicazione desktop, installabile quindi su Windows, Mac e Linux.
Prima dell’installazione ricordatevi di aggiornare e/o installare per la prima volta le runtime di Adobe AIR, se non l’avete già fatto in precedenza.

Download

Potete scaricare Air Skypemote da Google Code.

Continua...

Actionscript 3.0 for beginners: lesson #3

Continuiamo l’analisi dell’esempio del gioco Tic Tac Toe, presentato in Actionscript 3.0 for beginners: lesson #2. Eravamo arrivati alla funzione che crea la griglia di gioco:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
 * Disegno graficamente la griglia (3x3) a video
 *
 * @param        void
 * @return       void
 * @private
 */

private function createGrid():void {
    // puntatore temporaneo ad uno oggetto MovieClip
    // nota: qui si sarebbe potuto usare anche un oggetto Sprite
    // ma in questo caso mi serve di poter estendere l'oggetto
    // aggiungendo alcune proproetà personali. L'oggetto Sprite
    // è una classe chiusa e quindi non estendibile runtime, mentre
    // la classe MovieClip è una classe dinamica e quindi rende
    // possibile l'aggiunta di proprietà runtime
    var tm:MovieClip, i:uint = 0;
    // aggiungo in uno schema 3x3 i MovieClip
    for(; i < 9; i++) {
        tm                    = new MovieClip();
        addChild( tm );
        tm.x                  = OFFSETX+( (i%3)*(PLAYER_WIDTH+PLAYER_OFFSET) )
        tm.y                  = OFFSETY+Math.floor(i/3)*(PLAYER_HEIGHT+PLAYER_OFFSET)
        tm._index             = i;
        drawPlayer( tm, 0 );
    }
    // disegno le 2 linee veriticali e le 2 orizzontali
    with( this.graphics ) {
        lineStyle(6,0x666666);
        moveTo(OFFSETX,OFFSETY+(PLAYER_HEIGHT+15));
        lineTo(OFFSETX+( (PLAYER_WIDTH+20)*3 ),OFFSETY+(PLAYER_HEIGHT+15));
        moveTo(OFFSETX,OFFSETY+(PLAYER_HEIGHT+20)*2);
        lineTo(OFFSETX+( (PLAYER_WIDTH+20)*3 ),OFFSETY+(PLAYER_HEIGHT+20)*2);
        moveTo(OFFSETX+(PLAYER_WIDTH+15),OFFSETY);
        lineTo(OFFSETX+(PLAYER_WIDTH+15),OFFSETY+( (PLAYER_HEIGHT+20)*3 ));
        moveTo(OFFSETX+(PLAYER_WIDTH+20)*2,OFFSETY);
        lineTo(OFFSETX+(PLAYER_WIDTH+20)*2,OFFSETY+( (PLAYER_HEIGHT+20)*3 ));
    }
}

Continua...



Stop SOPA