Come continuare ad utilizzare una vecchia e costosa stampante non più compatibile con Windows 7/8/10

La stampante è uno di quei strumenti che cambi solo quando si rompe oppure… quando non è più compatibile con l’ultimo aggiornamento di Windows.

Ma spesso è frustrante dover cambiare una stampante solo perchè non più supportata dal nuovo sistema operativo, soprattutto se la stampante in questione possiede queste caratteristiche:

  1. funziona ed ha funzionato sempre benissimo
  2. è costata parecchio
  3. è di ottima qualità
  4. consuma poco inchiostro

Nel mio caso ho avuto a che fare con una stampante professionale da ufficio Develop 1650D. La stampante ha sempre funzionato egregiamente con WindowsXP, funzionava in alcuni casi ristretti su Windows7 ed un bel giorno ha smesso del tutto di funzionare dopo l’ultimo aggiornamento del suddetto sistema operativo.

529ef87ed1beb529d4026ee8ed4ab96c33430541

La stampante non ha porte Ethernet o Wifi. Ha una singola porta USB ed una porta parallela: ciò significa che deve essere collegata direttamente ad un computer.

Soluzione “semplice” è buttare la stampante da 2000 e rotti euro e comprarne una nuova: non ci piace.

 

Tentativo: utilizzo di un print server commerciale

Acquistare un printserver commerciale sembrerebbe la soluzione ottimale: il print server funge da ponte tra la stampante e la rete LAN dell’ufficio scavalcando del tutto il problema del sistema operativo.

71YFJAkgaTL._SL1280_

Purtroppo però tutti i print server in circolazione supportano solo alcuni modelli specifici di stampanti ed in genere solo quelle più recenti. Non era la soluzione ideale per questa stampante ma potrebbe esserlo per la vostra, quindi lo consiglio vivamente per evitare inutili grattacapi

 

Tentativo: Macchina XP dedicata e condivisione stampante

Una soluzione alternativa è collegare un PC WindowsXP direttamente alla stampante e condividerla in rete. Questa soluzione non ha funzionato in quanto, sebbene la stampante fosse perfettamente visibile in rete dagli altri PC Windows7, le stampe non partivano a causa dell’incompatibilità tra i driver XP  e i PC utilizzatori (Windows7).

 

Soluzione finale: print server ad-hoc

La soluzione è consistita nel disaccoppiare utenti Windows7 e stampante tramite l’utilizzo di una stampante virtuale PDF. Un PC WindowsXP dedicato gestisce la stampante reale via USB e al tempo stesso condivide in rete una stampante virtuale PDF. I PDF (le stampe degli utenti) vengono creati sul disco della macchina XP all’interno di una directory specifica che funge da coda di stampa. Un programma ad-hoc realizzato in .NET C# (printserver.exe) e residente nella macchina XP provvede a scodare i file PDF dalla directory e a stamparli sulla stampante reale.  Il programma è avviato automaticamente e non richiede alcun intervento manuale per funzionare.

Screen shot 2015-11-02 at 5.38.30 PM

Lato utente il meccanismo è del tutto trasparente: in rete è visibile solo la stampante virtuale. Ogni comando di stampa verso la stampante virtuale si traduce in una stampa vera e propria sulla Develop 1650D.

Screen shot 2015-11-02 at 5.38.15 PM

Il tutto realizzato su un comunissimo PC desktop privo di mouse, tastiera e schermo. L’unica cosa da ricordare è accendere il printserver la mattina prima di utilizzare la stampante!

printserver

 

Aspetti interessanti della soluzione

Allo stato attuale i PDF vengono scodati, stampati e quindi cancellati; Nessuno però vieta di copiare i PDF in una ulteriore cartella di backup in modo da mantenere uno storico digitale delle stampe.

E’ possibile estendere il meccanismo ad altre stampanti obsolete e collegarle tutte alla stessa macchina XP; l’unico limite è il numero di porte USB e parallele disponibili (di solito 4 o 6 USB e 1 o 2 parallele).

La stampante funzionerà anche con Windows 8, Windows 10 e anche sistemi Linux e Mac.

Clicca qui per andare alla pagina di download di printserver

Forza quattro per Android, MVC + SurfaceView

Ho realizzato una nuova app per Android: Forza quattro (in inglese connect4), il mitico gioco a turno dove vince chi riesce ad allineare per primo 4 o più pedine dello stesso colore.

Realizzata per sperimentare il rendering SurfaceView+Canvas e il pattern MVC in ambiente Android.

device-2015-10-03-112816

device-2015-09-06-160459

 

E’ possibile giocare contro lo smartphone selezionando uno dei 32 livelli di difficoltà. L’intelligenza artificiale è basata sull’algoritmo minimax con alcune ottimizzazioni per renderlo più veloce:

Il gioco include:

  • Effetti sonori tramite SoundPool
  • Musica di sottofondo tramite classe MediaPlayer
  • Rendering software tramite SurfaceView e Canvas (su thread separato, come spiegato qui)
  • Effetto caduta dei gettoni

Lo trovate qui in google play!

googleplay

L’ambiente Android si sa, è fortemente event-driven. L’approccio tramite pattern classico MVC è comunque fattibile: ho mappato il pattern alle seguenti componenti Android (non necessariamente la soluzione migliore!):

  • Model: sostanzialmente lo stato della scacchiera, un array bidimensionale.
  • View: classe SurfaceView che legge i dati dal modello e fa il rendering su schermo
  • Controller: activity Android che legge l’input utente e coordina Model e View assieme (più una terza classe Sound responsabile della musica ed effetti sonori).

20150913_170934

L’applicazione nel suo complesso richiede 3 thread: quello principale dell’activity stessa (UI), quello dentro la classe View che legge lo stato di gioco e aggiorna lo schermo e l’ultimo quello che incorpora l’algoritmo minimax per la scelta della mossa da parte del computer.

La caduta dei gettoni è realizzata con la classica equazione del moto uniformemente accelerato: s = 1/2 * g * t^2 dove t è il tempo espresso in tick millisecondi e g è l’accelerazione espressa in pixel / ms /ms.

Creare uno splash screen in Android

Gli splash screen sono utilizzati per mostrare all’utente del testo o delle immagini statiche prima ancora del completo caricamento dell’applicazione, soprattutto quando il caricamento richiede alcuni secondi. Senza un buon splash screen l’utente vede semplicemente uno schermo nero: più di 4-5 secondi di nero possono far desistere l’utente dal continuare ad aspettare!

Di solito uno splash screen è semplicemente una immagine a tutto schermo che mostra il nome dell’applicazione, il logo, del testo o, nelle versioni più evolute, una barra di caricamento.

popular_apps_splash_screens

Realizzare uno splash screen in Android è abbastanza semplice.

Creiamo una nuova blank activity, chiamiamola ad esempio “start”:

Screen shot 2015-07-19 at 1.59.12 PM

Possiamo cambiare il colore dello sfondo, aggiungere qualsiasi immagine e/o testo preferiamo.

Impostiamo ora l’activity come activity principale. Sarà la prima ad essere lanciata all’avvio dell’applicazione. A tal fine modifichiamo il manifest.xml in questo modo:


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="gianluca.connect4" >

    <application android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity android:name=".start"
            android:label="@string/app_name" >
            <intent -filter>
                <action android:name="android.intent.action.MAIN"></action>
                <category android:name="android.intent.category.LAUNCHER"></category>
            </intent>
        </activity>
    </application>
</manifest>

Ridefiniamo ora il metodo onCreate() nel sorgente start.java in questo modo:

public class start extends Activity
{
    int timeout = 2000;

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);

        new Handler().postDelayed(new Runnable()
        {
            @Override
            public void run()
            {
                Intent i = new Intent(start.this, main.class);
                startActivity(i);
                finish();
            }
        }, timeout);
    }
}

Praticamente non facciamo altro che creare un nuovo oggetto Runnable (un nuovo thread) e ne posticipiamo l’esecuzione a 2 secondi dall’evento onCreate(). L’intent che andiamo a creare chiamerà l’activity main che nel nostro caso è la prossima schermata dell’applicazione.

Avviando l’applicazione vedremo lo splash screen per 2 secondi, poi verrà lanciata l’activity main.
Il tempo di attesa impostato per lo splash screen può essere sfruttato in vari modi:

  • Caricare oggetti locali particolarmente pesanti (immagini, file audio etc..)
  • Accedere a risorse in rete e scaricare dati da backend remoti
  • Avviare, riavviare, disabilitare device locali (wifi, bluetooth etc..)
  • Nessuna operazione particolare, solo mostrare il nome dell’app, i contatti etc..