venerdì 21 aprile 2017

Spectrum ZX128 con emulatore Speecy


https://fms.komkon.org/Speccy/


Shift Sinistro + freccia cursore per scendere e selezionare 48 BASIC. Enter per selezionare


A questo punto si entra nella schermata del Basic...che non dice assolutamente niente
Dal menu Hardware si imposta Input Device come CapsShift+Cursor e si scrive il numero di riga
per esempio 10 ed il cursore si attende un  comando lampeggiando una K..si preme quindi la combinazione CapsShift+P (che corrisponde sull'emulatore a Shift Sinistro+P) e viene mostrato il comando PRINT con il cursore passato ad L lampeggiante perche' si aspetta il parametro del comando PRINT



CTRL+P per scrivere gli apici e poi si scrive la stringa desiderata ed invio. Dal buffer in fondo allo schermo la riga di comando viene spostata nel listato


Per mandare in esecuzione a questo punto  Shift sinistro + R per RUN ed enter per confermare


per correggere qualche errore si osserva che nel listato una riga e' caratterizzata da un segno di maggiore accanto al numero di riga; con le frecce alto e basso si vede che il segno di maggiore di sposta di riga. Una volta individuata la giusta riga si preme EDIT Shift Sinistro + 1 e la riga entra nel buffer di editing in basso

Al contrario del C64 su Spectrum non esiste differenza tra modalita' testo e modalita' grafica. Si possono inserire le primitive grafiche su uno schermo di dimensioni 255x 175

La cosa curiosa e' il motivo per il quale sul C64 si poteva scrivere per esteso i comandi mentre in ZX i comandi erano scritti mediante una combinazione di tasti: ZX in pratica demandava all'utente la tokenizzazione dei comandi, ovvero il primo passo che dal listato conduce all'esecuzione di un programma


giovedì 13 aprile 2017

ISS 2017

Inizia la bella stagione e come tradizione si aspetta il passaggio della ISS


Tra le altre cose questa e' stato un transito discendente al limite del terminatore con una elevazione quasi zenitale

ISS e' il piccolo puntino luminoso nel cielo nero. Ingrandire per una migliore osservazione



mercoledì 12 aprile 2017

Android Wear 2.0

Finalmente e' arrivato l'aggiornamento di Android Wear 2 sul mio LG R...e' quindi tempo di provare le nuove applicazioni per Android Wear che non hanno piu' bisogno dell'app companion sul telefono


Ho quindi preso un vecchio progetto (Aptic Metronome) di Wear 1 per adattarlo ad Wear 2
E' sufficiente in Android Studio crea un progetto per solo Android Wear con un targetSDKVersion pari a 25 (anche la minSDKVersion deve corrispondere a 25 per il solo Android Wear)

Per istruire il Play Store che l'apk non ha un app companion in AndroidManifest.xml e' necessario indicare

<meta-data    android:name="com.google.android.wearable.standalone"
android:value="true" /> 

Fatto cio' il progetto e' compatibile per l'upload su PlayStore. La preparazione su PlayStore e' identica a quella di Wear 1 con la conseguente revisione da parte di Google

martedì 11 aprile 2017

mercoledì 5 aprile 2017

Richieste HTTP su Android

Il problema da affrontare questa volta e' quello di creare un client http su Android per popolare i dati di un file csv che risiede su un server http.
La pagina Php sul server e' molto semplice e riceve dati latitudine/longitudine per scriverli su un file csv
--------------------------------
<?php
$lat = $_GET['lat'];
$lon = $_GET['lon'];
print $lat;
$list = array (
    array($lat, $lon)
);
$fp = fopen('file.csv', 'a+');
foreach ($list as $fields) {
    fputcsv($fp, $fields);
}
fclose($fp);
?>
--------------------------------

Non avevo fatto mai prove di client http su Android. Sono partito dalla libreria OkHttp, piu' che altro perche' erano disponibili molti esempi
Al primo tentativo sono incappato nell'errore android.os.NetworkOnMainThreadException. 
Cio' indica che il codice non puo' essere eseguito nel MainThread..ho provato a spostare il tutto in un Service ma stesso problema...alla fine la soluzione era quello di creare un AsyncTask...un po' contorto

Sul sito Developer di Android viene suggerito di utilizzare come client Http la libreria Volley.
Ok proviamoci...inserendo in  gradle la dipendenza a

compile'com.android.volley:volley:1.0.0'

viene generato un errore che Android Studio non riesce risolvere la libreria. Per farla breve ho scaricato da questo indirizzo http://api.androidhive.info/volley/volley.jar il file Jar e lo ho aggiunto alle librerie di Android Studio. Tutto Ok.

A questo punto si deve modificare il file Manifest.xml per l'accesso ad Internet

<uses-permission android:name="android.permission.INTERNET" />

--------------------------------
public class MainActivity extends AppCompatActivity {
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RequestQueue queue = Volley.newRequestQueue(this);
        String url ="http://c1p81.xxxxxxxxx.org/test/csv.php?lat=32.1";
        // Request a string response from the provided URL.        StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                new Response.Listener<String>() {
                    @Override                    public void onResponse(String response) {
                        Log.d("Debug","Risposta: "+ response.substring(0,4));
                    }
                }, new Response.ErrorListener() {
            @Override            public void onErrorResponse(VolleyError error) {
                Log.d("Debug","Errore");
            }
        });
        queue.add(stringRequest);
    }

}
--------------------------------

se si inserisce invece un pulsante con un OnClick Listener si deve modificare la parte di codice in giallo pena generare un errore di incompatible types: <anonymous OnClickListener> cannot be converted to Context

---------------------------------
public class MainActivity extends AppCompatActivity {
    private Button pulsante;

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

        pulsante = (Button) findViewById(R.id.button);
        pulsante.setOnClickListener(new View.OnClickListener() {
            @Override            public void onClick(View view) {
                RequestQueue queue = Volley.newRequestQueue(MainActivity.this);
                String url ="http://c1p81.xxxxxxxxx.org/test/csv.php?lat=32.1";
                // Request a string response from the provided URL.                StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
                        new Response.Listener<String>() {
                            @Override                            public void onResponse(String response) {
                                Log.d("Debug","Risposta: "+ response.substring(0,4));
                            }
                        }, new Response.ErrorListener() {
                    @Override                    public void onErrorResponse(VolleyError error) {
                        Log.d("Debug","Errore");
                    }
                });
                queue.add(stringRequest);
            }
        });


    }

}

Esperimenti di micropalentologia

Aggiornamento:

utilizzando una foto da microscopio elettronico (dotata di scala di riferimento)

Catapsydrax dissimilis
sono riuscito ad avere una stima degli ingrandimenti che il microscopio USB fornisce con la lente aggiuntiva. Pur la difficolta' di conversione tra pixel e dpi della stampante sembra che il sistema fornisca un ingrandimento massimo stimato attorno ai 100x
------------------------------------------------------------

In previsione di una lezione ad una classe di seconda elementare sulla geologia, volevo fare vedere che il mondo dei fossili non inizia e finisce con i dinosauri ma che si sono anche animali molto piccoli ed interessanti come i foraminiferi




Per rendere la lezione interattiva avevo quindi la necessita' di trovare un microscopio con oculare USB per poi collegarlo ad un proiettore..non volevo spendere molto per un oggetto che mi sarebbe servito forse solo per 10 minuti e cosi' su Amazon ho trovato questo oggetto, microscopio USB dichiarato con ingrandimento da 50x a 800x





Era abbastanza chiaro che gli ingrandimenti dichiarati erano fasulli ma il costo di 13 euro (in offerta) mi ha convinto a provare. Inoltre c'e' da dire che la ghiera girevoli di fatto funziona come un fuoco e non come uno zoom..il massimo ingrandimento si ottiene quando la parte trasparente in plastica appoggia sul piano del campione. Le dimensioni delle immagini sono di 640x426 pixels quindi inferiori alla VGA.



Per le sezioni sottili i risultati non sono male...basta mettere il microscopio in verticale ed appoggiare il vetrino ed i risultati sono indicati nelle immagini sottostanti




selezionando invece i foraminiferi dai preparati (e quindi tridimensionali) i risultati sono peggiori ed e' difficile vedere la morfologia


ho provato a migliorare le cose. Ho preso una lente da filatelia ed la ho frapposta tra il campione ed il microscopio...quindi il campione appoggiato su un piano, la lente da filatelia sopra ed appooggiata sulla lente il microscopio. In questo modo si deve spengere i led del microscopio perche' rifletttono sulla lente e ho messo una sorgente di luce trasversale


A questo punto le cose sono decisamente migliorate




Non si tratta di uno strumento professionale ma considerando che e' costato meno di 15 euro non e' poi cosi' male