Piero V.

Panda3D e Broadcast

Tempo fa avevo cercato di creare la parte di networking per un videogioco che utilizza il motore Panda3D.

I giochi hanno bisogno di aggiornare velocissimamente le posizioni degli altri giocatori e tutti gli altri dati, perciò si usa UDP, un protocollo che è molto più veloce del TCP perché non fa controlli per vedere se sono arrivati i dati (e perciò è anche meno affidabile, ma non importa per un videogioco).

Una delle caratteristiche più belle di UDP è anche quella di poter fare il “broadcasting” di rete, ovvero mandare a tutti i client di una rete un pacchetto in una certa porta. Questa caratteristica può essere usata per esempio per fare la lista dei server a cui connettersi.

Panda3D teoricamente offre una funzione chiamata set_broadcast nella classe NetAddress, però non funziona, né in Python, né in C++. O almeno, non da sola.

In Python alla fine avevo lasciato perdere, però in C++ invece volevo sistemarla. Non riuscivo proprio a capire come fare, così ho cercato e ho visto che in generale bisogna dire al sistema operativo che la socket deve poter eseguire il broadcast.

Il set_broadcast sembra poterlo fare, ma se in realtà guardiamo il codice è solo una scorciatoia per inserire come indirizzo IP 255.255.255.255 necessario per fare appunto il broadcast ma non sufficiente.

Spulciando un po’ il codice ho trovato che serve abilitare il broadcast alla socket. Ed ecco come fare.

Quando creiamo la socket dal manager, otteniamo un puntatore alla connessione. Un metodo di quest’istanza è il get_socket, che normalmente restituirebbe un’istanza di Socket_IP, tuttavia questa classe non ha il metodo che ci serve. Allora dobbiamo “trasformarla” in una Socket_UDP, tramite il casting. Allora in quella possiamo chiamare il SetToBroadCast() e per magia il tutto funzionerà.

Tradotto in codice 😉 :

	Socket_UDP * sock = (Socket_UDP *)connection->get_socket();
	sock->SetToBroadCast();

connection è la connessione creata tramite il QueuedConnectionManager.

Una volta aggiunto questo come per magia il tutto funzionerà 😊

Somiglianze dei linguaggi di programmazione

I linguaggi di programmazione sono delle vere e proprie lingue e come esse hanno la caratteristica di avere punti in comune.

Ieri, dopo la mia brutta esperienza con i PIC, ho cercato di portare un software fatto in PIC Basic in C per Arduino.

Di basic non avevo mai preso nulla in mano, invece il C so più o meno la struttura del linguaggio e fare i classici programmini banali ma non lo so approfonditamente, o almeno senza guida.

Devo dire che però è stato abbastanza facile portare quel codice ad Arduino: grazie alle conoscenze di PHP e di Javascript mi trovo molto bene in C perché come struttura stretta del linguaggio sono abbastanza comuni. Forse il mio unico problema sono le variabili nei programmi compilati. Anche la mia gavetta in Pascal mi è stata utile: il PIC Basic è molto simile al Pascal, quindi di parentesi non ce n’è neanche l’ombra e quindi, per esempio, gli IF utilizzano l’ENDIF un po’ come nel bascal IF ... THEN BEGIN... END.

Inoltre le funzioni che si possono eseguire sui micro controllori sono in un numero abbastanza ristretto e spesso tra un linguaggio e l’altro cambia solo il modo in cui sono scritte (bitClean al posto di CLEANBIT).

Perciò fidatevi quando vi dico di imparare bene un linguaggio di programmazione se ne volete imparare di altri perché poi ciò che sapete già vi può aiutare ad imparare più velocemente altro, come è un po’ in generale e non solo in programmazione.

Brainstorming su... PHP

La gente che conosco che si mette a programmare in PHP si lamenta dell’assenza delle guide valide in italiano…

In realtà non servono libroni per capire questo linguaggio… ma un po’ di introduzione generale fa sempre bene.

Cos’è PHP?

Stabiliamolo subito: “PHP è un linguaggio di programmazione di alto livello interpretato”.

Linguaggio di programmazione: semplifichiamo dicendo che il PHP è un insieme di istruzioni da eseguire.

Di alto livello: il livello in programmazione indica quanto il codice è comprensibile dagli umani: un livello alto vuol dire che è facilmente comprensibile (PHP, C++ etc…) mentre di basso livello vuol dire che è difficile da capire (Assembly etc…).

Interpretato: PHP non ha una fase di “compilazione”, cioè da PHP non si ricava un eseguibile che può essere fatto girare da solo sulla macchina, bensì PHP ha bisogno di un software chiamato interprete, che legge il PHP e lo esegue.

In realtà esistono dei compilatori, ma non è l’uso “ufficiale” di PHP.

Cosa non è PHP?

È importante capire anche cosa non è PHP.

PHP non è HTML: il PHP può mandare in output l’HTML, però come ogni linguaggio di programmazione è un linguaggio che, una volta eseguito, manda in output ciò per cui è programmato, e non il suo sorgente. … [Leggi il resto]

Cosa sono gli hook

Spesso quando parlo dello sviluppo dei plugin di Flatoress o in generale dello sviluppo di un sito web dico sempre qualcosa riguardante gli hook, che però non sono un concetto noto a tutti, perciò ho deciso di fare questo post di spiegazione.

Innanzitutto un programma o uno script possono essere divisi in blocchi (più o meno grandi), come inizializzazione, preparazione del contenuto, output del contenuto, chiusura delle risorse utilizzate (connessioni al database etc…).

Lo scopo degli hook è di poter inserire dinamicamente una porzione di codice (per esempio una funzione) in questi blocchi, infatti hook in italiano vuol dire gancio. Talvolta gli hook possono anche sostituire i comportamenti di default di un programma.

Gli hook sono praticamente ciò che rende un programma estendibile.

Per esempio grazie agli hook si può commutare da un sistema di indirizzi che si basa su variabili GET ad un sistema di indirizzi basato sul mod_rewrite più SEO-compatibile: si inserisce una funzione che all’inizializzazione dei parametri “raccoglie” gli URL riscritti e poi si usa un altro hook per creare i link.

Usano gli hook anche grandi progetti come Wordpress o Dokuwiki.

Le caratteristiche pratiche dal punto di vista della programmazione degli hook sono:

  • presenza di funzioni che permettono di aggiungerli, modificarli, rimuoverli o eseguirli
  • un sistema di priorità per eseguire delle porzioni di codice prima o dopo di altre
  • la possibilità di essere chiamati molte volte
  • la possibilità di poterne creare di nuovi dinamicamente

Un primordiale sistema di hook è abbastanza semplice da implementare: è una lista di callback da eseguire. Perciò, per esempio, basta creare un array multidimensionale: nel primo array si inserisce la priorità per chiave e il valore un array con il nome delle funzioni da chiamare (per esempio, in PHP tramite call_user_func).

Spero di essere stato il più chiaro possibile, altrimenti fatemelo sapere via commento.