Con il cielo invernale diventa tutto piu' facile
Il punto piu' luminoso e' Giove mentre in basso leggermente verso destra Aldebaran
Ripresa fatta con una fotocamera compatta digitale con tempo di esposizione di circa 10 secondi (e senza treppiede)
domenica 30 dicembre 2012
venerdì 28 dicembre 2012
Recuperare foto da SD
Scattando foto puo' capitare di cancellare una schedina SD con foto ancora non salvate sul altri supporti
A questo punto risulta utili PhotoRec, un programma multipiattaforma ed a linea di comando, che e' tanto brutto da vedersi quanto efficace nel risultato
una sola avvertenza: le foto salvate vengono messe in una sottodirectory del tipo recup_dir.1
A questo punto risulta utili PhotoRec, un programma multipiattaforma ed a linea di comando, che e' tanto brutto da vedersi quanto efficace nel risultato
una sola avvertenza: le foto salvate vengono messe in una sottodirectory del tipo recup_dir.1
Correzione Nord Magnetico/Geografico su Android
All'interno delle Api del sistema operativo di Android ci sono anche delle funzioni abbastanza inusuali (per un linguaggio di programmazione standard), in particolare c'e' la possibilita' di effettuare il calcolo della declinazione magnetica ovvero della differenza tra la direzione del Nord magnetico e del Nord geografico
In Italia tale differenza e' abbastanza modesta e si puo' trascurare per praticamente tutte le attivita' amatoriali ma in alcuni paesi e' molto influente sulle misure
Per il calcolo della declinazione magnetica Android si basa sul modello matematico rintracciabile a questo link http://www.ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml dove viene fornita anche cartografia a scala mondiale e software per ambiente desktop per il calcolo
Come si osserva per il calcolo e' necessario conoscere la posizione del luogo (in latitudine, longitudine ed altezza) e la data di osservazione; dati questi parametri il modello matematico fornisce la declinazione
Per implementare la funzione anche in Android si deve quindi attivare sia il SensorManager (per la bussola) che il LocationManager (per la posizione)...la data viene assunta quella del telefono
Di seguito si riporta un esempio completo di applicazione Android con correzione di Nord Magnetico/Geografico (la parte di codice che gestisce il Gps e' stata ripresa da qui)
ads
activity_compass.xml
----------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Compass" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginTop="35dp"
android:gravity="right"
android:text="n/a"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/TextView01"
android:layout_marginTop="29dp"
android:layout_toRightOf="@+id/textView3"
android:gravity="right"
android:text="n/a"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/TextView01"
android:layout_alignBottom="@+id/TextView01"
android:layout_alignParentLeft="true"
android:text="Azimuth Magn.North:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/TextView03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView1"
android:layout_alignBottom="@+id/textView1"
android:layout_alignParentLeft="true"
android:text="Magnetic Declination:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/TextView04"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView2"
android:layout_alignBottom="@+id/textView2"
android:layout_alignParentLeft="true"
android:text="Azimuth True North:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginTop="34dp"
android:gravity="right"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true"
android:text="--------"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView3"
android:layout_centerHorizontal="true"
android:text="Waiting Gps Signal"
android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>
----------------------------------------
Compass Manifest
----------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.compass"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.compass.Compass"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
----------------------------------------
Compass.java
----------------------------------------
package com.example.compass;
import java.text.DecimalFormat;
import java.util.List;
import android.hardware.GeomagneticField;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
public class Compass extends Activity implements LocationListener{
private boolean sersorrunning;
private SensorManager mySensorManager;
private TextView azimuth;
private double lat;
private double lon;
private double alt;
private TextView az_corr;
private TextView gps;
private LocationManager lm;
private StringBuilder sb;
static final String tag = "Main"; // for Log
int noOfFixes = 0;
private TextView true_north;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compass);
azimuth = (TextView) findViewById(R.id.TextView01);
az_corr = (TextView) findViewById(R.id.textView1);
true_north = (TextView) findViewById(R.id.textView2);
gps = (TextView) findViewById(R.id.textView4);
mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
@SuppressWarnings("deprecation")
List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if(mySensors.size() > 0){
mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
sersorrunning = true;
//Toast.makeText(this, "Start ORIENTATION Sensor", Toast.LENGTH_LONG).show();
}
else{
//Toast.makeText(this, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show();
sersorrunning = false;
finish();
}
}
protected void onResume() {
/*
* onResume is is always called after onStart, even if the app hasn't been
* paused
*
* add location listener and request updates every 1000ms or 10m
*/
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10f, this);
super.onResume();
}
@Override
protected void onPause() {
/* GPS, as it turns out, consumes battery like crazy */
lm.removeUpdates(this);
super.onPause();
}
@Override
public void onLocationChanged(Location location) {
Log.v(tag, "Location Changed");
sb = new StringBuilder(512);
noOfFixes++;
/* display some of the data in the TextView */
sb.append("No. of Fixes: ");
sb.append(noOfFixes);
sb.append('\n');
sb.append('\n');
sb.append("Londitude: ");
sb.append(location.getLongitude());
sb.append('\n');
sb.append("Latitude: ");
sb.append(location.getLatitude());
sb.append('\n');
sb.append("Altitiude: ");
sb.append(location.getAltitude());
sb.append('\n');
sb.append("Accuracy: ");
sb.append(location.getAccuracy());
sb.append('\n');
sb.append("Timestamp: ");
sb.append(location.getTime());
sb.append('\n');
lat = location.getLatitude();
lon = location.getLongitude();
alt = location.getAltitude();
gps.setText(sb.toString());
}
@Override
public void onProviderDisabled(String provider) {
/* this is called if/when the GPS is disabled in settings */
Log.v(tag, "Disabled");
/* bring up the GPS settings */
Intent intent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
@Override
public void onProviderEnabled(String provider) {
Log.v(tag, "Enabled");
//Toast.makeText(this, "GPS Enabled", Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
/* This is called when the GPS status alters */
switch (status) {
case LocationProvider.OUT_OF_SERVICE:
Log.v(tag, "Status Changed: Out of Service");
//Toast.makeText(this, "Status Changed: Out of Service",
//Toast.LENGTH_SHORT).show();
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.v(tag, "Status Changed: Temporarily Unavailable");
//Toast.makeText(this, "Status Changed: Temporarily Unavailable",
//Toast.LENGTH_SHORT).show();
break;
case LocationProvider.AVAILABLE:
Log.v(tag, "Status Changed: Available");
//Toast.makeText(this, "Status Changed: Available",
//Toast.LENGTH_SHORT).show();
break;
}
}
@Override
protected void onStop() {
/* may as well just finish since saving the state is not important for this toy app */
finish();
super.onStop();
}
private SensorEventListener mySensorEventListener = new SensorEventListener(){
private float declinazione;
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
DecimalFormat df = new DecimalFormat("##.##");
azimuth.setText(df.format(event.values[0]));
GeomagneticField geoField = new GeomagneticField(
Double.valueOf(lat).floatValue(),
Double.valueOf(lon).floatValue(),
Double.valueOf(alt).floatValue(),
System.currentTimeMillis() );
if (noOfFixes > 0)
{
declinazione = geoField.getDeclination();
az_corr.setText(df.format(declinazione));
true_north.setText(df.format(event.values[0]+declinazione));
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if(sersorrunning){
mySensorManager.unregisterListener(mySensorEventListener);
}
}
}
In Italia tale differenza e' abbastanza modesta e si puo' trascurare per praticamente tutte le attivita' amatoriali ma in alcuni paesi e' molto influente sulle misure
Per il calcolo della declinazione magnetica Android si basa sul modello matematico rintracciabile a questo link http://www.ngdc.noaa.gov/geomag/WMM/DoDWMM.shtml dove viene fornita anche cartografia a scala mondiale e software per ambiente desktop per il calcolo
Come si osserva per il calcolo e' necessario conoscere la posizione del luogo (in latitudine, longitudine ed altezza) e la data di osservazione; dati questi parametri il modello matematico fornisce la declinazione
Per implementare la funzione anche in Android si deve quindi attivare sia il SensorManager (per la bussola) che il LocationManager (per la posizione)...la data viene assunta quella del telefono
Di seguito si riporta un esempio completo di applicazione Android con correzione di Nord Magnetico/Geografico (la parte di codice che gestisce il Gps e' stata ripresa da qui)
ads
activity_compass.xml
----------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".Compass" >
<TextView
android:id="@+id/textView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_alignParentRight="true"
android:layout_below="@+id/textView1"
android:layout_marginTop="35dp"
android:gravity="right"
android:text="n/a"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_below="@+id/TextView01"
android:layout_marginTop="29dp"
android:layout_toRightOf="@+id/textView3"
android:gravity="right"
android:text="n/a"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/TextView02"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/TextView01"
android:layout_alignBottom="@+id/TextView01"
android:layout_alignParentLeft="true"
android:text="Azimuth Magn.North:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/TextView03"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView1"
android:layout_alignBottom="@+id/textView1"
android:layout_alignParentLeft="true"
android:text="Magnetic Declination:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/TextView04"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBaseline="@+id/textView2"
android:layout_alignBottom="@+id/textView2"
android:layout_alignParentLeft="true"
android:text="Azimuth True North:"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/TextView01"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignLeft="@+id/textView1"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginTop="34dp"
android:gravity="right"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/textView3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView2"
android:layout_centerHorizontal="true"
android:text="--------"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/textView4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/textView3"
android:layout_centerHorizontal="true"
android:text="Waiting Gps Signal"
android:textAppearance="?android:attr/textAppearanceSmall" />
</RelativeLayout>
----------------------------------------
Compass Manifest
----------------------------------------
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.compass"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="16" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.compass.Compass"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
----------------------------------------
Compass.java
----------------------------------------
package com.example.compass;
import java.text.DecimalFormat;
import java.util.List;
import android.hardware.GeomagneticField;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.location.LocationProvider;
import android.os.Bundle;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.widget.TextView;
public class Compass extends Activity implements LocationListener{
private boolean sersorrunning;
private SensorManager mySensorManager;
private TextView azimuth;
private double lat;
private double lon;
private double alt;
private TextView az_corr;
private TextView gps;
private LocationManager lm;
private StringBuilder sb;
static final String tag = "Main"; // for Log
int noOfFixes = 0;
private TextView true_north;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_compass);
azimuth = (TextView) findViewById(R.id.TextView01);
az_corr = (TextView) findViewById(R.id.textView1);
true_north = (TextView) findViewById(R.id.textView2);
gps = (TextView) findViewById(R.id.textView4);
mySensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
lm = (LocationManager) getSystemService(LOCATION_SERVICE);
@SuppressWarnings("deprecation")
List<Sensor> mySensors = mySensorManager.getSensorList(Sensor.TYPE_ORIENTATION);
if(mySensors.size() > 0){
mySensorManager.registerListener(mySensorEventListener, mySensors.get(0), SensorManager.SENSOR_DELAY_NORMAL);
sersorrunning = true;
//Toast.makeText(this, "Start ORIENTATION Sensor", Toast.LENGTH_LONG).show();
}
else{
//Toast.makeText(this, "No ORIENTATION Sensor", Toast.LENGTH_LONG).show();
sersorrunning = false;
finish();
}
}
protected void onResume() {
/*
* onResume is is always called after onStart, even if the app hasn't been
* paused
*
* add location listener and request updates every 1000ms or 10m
*/
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10f, this);
super.onResume();
}
@Override
protected void onPause() {
/* GPS, as it turns out, consumes battery like crazy */
lm.removeUpdates(this);
super.onPause();
}
@Override
public void onLocationChanged(Location location) {
Log.v(tag, "Location Changed");
sb = new StringBuilder(512);
noOfFixes++;
/* display some of the data in the TextView */
sb.append("No. of Fixes: ");
sb.append(noOfFixes);
sb.append('\n');
sb.append('\n');
sb.append("Londitude: ");
sb.append(location.getLongitude());
sb.append('\n');
sb.append("Latitude: ");
sb.append(location.getLatitude());
sb.append('\n');
sb.append("Altitiude: ");
sb.append(location.getAltitude());
sb.append('\n');
sb.append("Accuracy: ");
sb.append(location.getAccuracy());
sb.append('\n');
sb.append("Timestamp: ");
sb.append(location.getTime());
sb.append('\n');
lat = location.getLatitude();
lon = location.getLongitude();
alt = location.getAltitude();
gps.setText(sb.toString());
}
@Override
public void onProviderDisabled(String provider) {
/* this is called if/when the GPS is disabled in settings */
Log.v(tag, "Disabled");
/* bring up the GPS settings */
Intent intent = new Intent(
android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivity(intent);
}
@Override
public void onProviderEnabled(String provider) {
Log.v(tag, "Enabled");
//Toast.makeText(this, "GPS Enabled", Toast.LENGTH_SHORT).show();
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
/* This is called when the GPS status alters */
switch (status) {
case LocationProvider.OUT_OF_SERVICE:
Log.v(tag, "Status Changed: Out of Service");
//Toast.makeText(this, "Status Changed: Out of Service",
//Toast.LENGTH_SHORT).show();
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Log.v(tag, "Status Changed: Temporarily Unavailable");
//Toast.makeText(this, "Status Changed: Temporarily Unavailable",
//Toast.LENGTH_SHORT).show();
break;
case LocationProvider.AVAILABLE:
Log.v(tag, "Status Changed: Available");
//Toast.makeText(this, "Status Changed: Available",
//Toast.LENGTH_SHORT).show();
break;
}
}
@Override
protected void onStop() {
/* may as well just finish since saving the state is not important for this toy app */
finish();
super.onStop();
}
private SensorEventListener mySensorEventListener = new SensorEventListener(){
private float declinazione;
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
DecimalFormat df = new DecimalFormat("##.##");
azimuth.setText(df.format(event.values[0]));
GeomagneticField geoField = new GeomagneticField(
Double.valueOf(lat).floatValue(),
Double.valueOf(lon).floatValue(),
Double.valueOf(alt).floatValue(),
System.currentTimeMillis() );
if (noOfFixes > 0)
{
declinazione = geoField.getDeclination();
az_corr.setText(df.format(declinazione));
true_north.setText(df.format(event.values[0]+declinazione));
}
}
};
@Override
protected void onDestroy() {
super.onDestroy();
if(sersorrunning){
mySensorManager.unregisterListener(mySensorEventListener);
}
}
}
Errore APN su Android 4.0.4
Ogni tanto qualcuno, sapendo che hai qualche esperienza di informatica, ti lascia da configurare qualche nuovo giocattolo elettronico....E SEI NEI GUAI.
Perche' una semplice configurazione da 2 minuti diventa un incubo di ricerche su newsgroup ed altro per almeno un paio di giorni...questo e' l'esempio dell'errore 36050 di Android 4.0.4
L'aggeggio da configurare era un modello di fascia bassa AIWA MID-7040T-3G , un tablet da 7 pollici completamente in plastica che non e' nemmeno malissimo salvo avere i soliti problemi di ricezione del WiFi.
Il tablet in dettaglio e' dotato del modulo 3G per cui mi era stato chiesto di configurare la connessione ad Internet via cellulare
La procedura, dopo aver inserito la SIM (che e' stata correttamente riconosciuta), prevede la creazione del giusto APN partendo da Settings/Altro
Cliccare su Nomi Punti di Accesso
Cliccare in alto a destra ed aggiungere un nuovo APN. Come si vede la lista e' vuota
In questa schermata si possono aggiungere i parametri necessari (nel caso specifico la SIM e' di Wind)
----------------------------------------
Name: wind
APN: internet.wind
Proxy: not set
Port: not set
Username: not set
Password: not set
Server: not set
MMSC: http://mms.wind.it
MMS Proxy: 212.245.244.100
MMS Port: 8080
MCC: 222
MNC: 88
APN Type: not set
----------------------------------------
e qui arriva il problema. Non esiste il pulsante di salvataggio delle nuove impostazioni e l'unica opzione e' uscire senza salvare!!
Se si cerca di registrare la SIM sulla rete cellulare questa viene correttamente associata ma ovviamente non riesce a navigare
Perche' una semplice configurazione da 2 minuti diventa un incubo di ricerche su newsgroup ed altro per almeno un paio di giorni...questo e' l'esempio dell'errore 36050 di Android 4.0.4
L'aggeggio da configurare era un modello di fascia bassa AIWA MID-7040T-3G , un tablet da 7 pollici completamente in plastica che non e' nemmeno malissimo salvo avere i soliti problemi di ricezione del WiFi.
Il tablet in dettaglio e' dotato del modulo 3G per cui mi era stato chiesto di configurare la connessione ad Internet via cellulare
La procedura, dopo aver inserito la SIM (che e' stata correttamente riconosciuta), prevede la creazione del giusto APN partendo da Settings/Altro
Cliccare su Nomi Punti di Accesso
Cliccare in alto a destra ed aggiungere un nuovo APN. Come si vede la lista e' vuota
In questa schermata si possono aggiungere i parametri necessari (nel caso specifico la SIM e' di Wind)
----------------------------------------
Name: wind
APN: internet.wind
Proxy: not set
Port: not set
Username: not set
Password: not set
Server: not set
MMSC: http://mms.wind.it
MMS Proxy: 212.245.244.100
MMS Port: 8080
MCC: 222
MNC: 88
APN Type: not set
----------------------------------------
e qui arriva il problema. Non esiste il pulsante di salvataggio delle nuove impostazioni e l'unica opzione e' uscire senza salvare!!
Se si cerca di registrare la SIM sulla rete cellulare questa viene correttamente associata ma ovviamente non riesce a navigare
giovedì 27 dicembre 2012
R e Proxy Server
Questo post esce un po' dai soliti argomenti...
Per motivi di lavoro mi sono trovato a dover effettuare una analisi geostatistica su un set di dati ed ho impiegato R. Nella installazione di default di R la libreria gstat non e' compresa e quindi deve essere scaricata come modulo aggiuntivo...peccato che la rete lavorativa e' dietro ad un proxy server
per poterlo attraversare (la soluzione e' per Windows) si deve avviare dalla riga di comando R con il comando RGui seguito dalle impostazioni del proxy
rgui http_proxy=http://mioproxy:8080
nel caso di Linux R riconosce la variabile di ambiente HTTP_PROXY e se impostata la utilizza per cui non e' necessario aggiungere alcun parametro alla riga di lancio
Per motivi di lavoro mi sono trovato a dover effettuare una analisi geostatistica su un set di dati ed ho impiegato R. Nella installazione di default di R la libreria gstat non e' compresa e quindi deve essere scaricata come modulo aggiuntivo...peccato che la rete lavorativa e' dietro ad un proxy server
per poterlo attraversare (la soluzione e' per Windows) si deve avviare dalla riga di comando R con il comando RGui seguito dalle impostazioni del proxy
rgui http_proxy=http://mioproxy:8080
nel caso di Linux R riconosce la variabile di ambiente HTTP_PROXY e se impostata la utilizza per cui non e' necessario aggiungere alcun parametro alla riga di lancio
venerdì 21 dicembre 2012
FreeDos in VirtualBox
Sempre piu' spesso mi capita di dover ritirare fuori dei vecchi programmi in Dos che al momento si rifiutano di girare sui moderni Windows
A questo punto (avevo gia' provato con Qemu) e' il turno di VirtualBox di far girare Freedos
Per prima cosa i settaggi di base
Ram 32 Mb
Disco fisso 200 Mb
Cd l'immagine di FreeDos 1.1
attenzione a come si imposta la scheda di rete virtuale. Per l'uso successivo e' meglio scegliere Bridged
la prima cosa da fare una volta avviata e' creare il disco C (opzione 2)
scegliendo poi "Create Dos Partition/Create Primary Dos Partition" ed Esc fino al reboot della macchina
Una volta ripartita la macchina virutale si sceglie l'opzione 1 "Install to HardDisk"
ci sara' una serie di errori di bad sector .. non c'e' da preoccuparsi
una volta riconquistato il controllo si formatta il disco fisso virtuale
si inizia l'installazione e si continua ad andare avanti fino alla scelta dei moduli in cui si aggiungono quelli net e gui
L'installazione di base e' terminata ma c'e' un ulteriore passo da fare. Non esistono le Guest Additions per Dos per cui per inserire dei programmi o dei file nella macchina virtuali questi devono essere fatti passare attraverso la rete virtuale via FTP per cui si procede alla configurazione della rete stessa e del server FTP
Per abilitare la rete virtuale si deve editare il file autoexec.bat
rimuovendo il REM all'inizio della riga che ha LH PCNTPK e rimuovendo il REM all'inizio della riga che ha DHCP (se si ha un DHCP server attivo)
Per configurare il Server Ftp si copia il file di configurazione
copy C:\FDOS\DOC\MTCP\SAMPLE.CFG C:\FDOS\MTCP.CFG
e si edita
edit C:\fdos\mtcp.cfg
cambiando i parametri
MTU 1472
e rimuovendo i REM dalle righe seguenti
ftpsrv_password_file c:\ftppass.txt
ftpsrv_log_file c:\ftpsrv.log
FTPSRV_FILEBUFFER_SIZE 16
FTPSRV_TCPBUFFER_SIZE 16
FTPSRV_PACKETS_PER_POLL 2
a questo punto si crea il file c:\ftppass.txt
edit c:\ftppass.txt
mettendo una riga come segue
luca password [none] [any] all
A questo punto (avevo gia' provato con Qemu) e' il turno di VirtualBox di far girare Freedos
Per prima cosa i settaggi di base
Ram 32 Mb
Disco fisso 200 Mb
Cd l'immagine di FreeDos 1.1
attenzione a come si imposta la scheda di rete virtuale. Per l'uso successivo e' meglio scegliere Bridged
la prima cosa da fare una volta avviata e' creare il disco C (opzione 2)
scegliendo poi "Create Dos Partition/Create Primary Dos Partition" ed Esc fino al reboot della macchina
Una volta ripartita la macchina virutale si sceglie l'opzione 1 "Install to HardDisk"
ci sara' una serie di errori di bad sector .. non c'e' da preoccuparsi
una volta riconquistato il controllo si formatta il disco fisso virtuale
si inizia l'installazione e si continua ad andare avanti fino alla scelta dei moduli in cui si aggiungono quelli net e gui
L'installazione di base e' terminata ma c'e' un ulteriore passo da fare. Non esistono le Guest Additions per Dos per cui per inserire dei programmi o dei file nella macchina virtuali questi devono essere fatti passare attraverso la rete virtuale via FTP per cui si procede alla configurazione della rete stessa e del server FTP
Per abilitare la rete virtuale si deve editare il file autoexec.bat
rimuovendo il REM all'inizio della riga che ha LH PCNTPK e rimuovendo il REM all'inizio della riga che ha DHCP (se si ha un DHCP server attivo)
Per configurare il Server Ftp si copia il file di configurazione
copy C:\FDOS\DOC\MTCP\SAMPLE.CFG C:\FDOS\MTCP.CFG
e si edita
edit C:\fdos\mtcp.cfg
cambiando i parametri
MTU 1472
e rimuovendo i REM dalle righe seguenti
ftpsrv_password_file c:\ftppass.txt
ftpsrv_log_file c:\ftpsrv.log
FTPSRV_FILEBUFFER_SIZE 16
FTPSRV_TCPBUFFER_SIZE 16
FTPSRV_PACKETS_PER_POLL 2
a questo punto si crea il file c:\ftppass.txt
edit c:\ftppass.txt
mettendo una riga come segue
luca password [none] [any] all
nb: i campi sono separati da un tabulatore
il server Ftp si lancia con il comando
ftpsrv
e dovrebbe apparire una schermata come la seguente
con Filezilla si puo' quindi interagire con il server (in questo caso all'indirizzo 10.200.3.94)
e dopo tanta fatica si puo' usare il programma DOS di cui si aveva bisogno
giovedì 20 dicembre 2012
Android Emulator e Http Proxy
La navigazione di Internet all'interno dell'emulatore e' di default abilitata ma nel caso sia presente un proxy_http si deve avvisare l'emulatore della corretta configurazione
Il metodo piu' semplice e' lanciare l'emulatore da riga di comando (il comando si trova nella sottodirectory tools dell'SDK) con la seguente riga
emulator -avd nome_avd -http-proxy http://mioproxy:8080
di seguito due esempi di navigazione tramite proxy
Il metodo piu' semplice e' lanciare l'emulatore da riga di comando (il comando si trova nella sottodirectory tools dell'SDK) con la seguente riga
emulator -avd nome_avd -http-proxy http://mioproxy:8080
di seguito due esempi di navigazione tramite proxy
mercoledì 19 dicembre 2012
Embed HTML5 in Android
E' possibile sfruttare l'HTML5 anche per creare applicazioni Android
La tecnica consiste nel creare una pagina con una WevView e farla puntare ad una pagina HTML5
Di seguito i file necessari per il progetto (in cui e' stato usato il generatore di insieme di Mandelbrot in HTML5 visto nei precedenti post)
Attenzione : il browser di default di Android non e' pienamente compatibile con Android per cui alcune pagine HTML5 semplicemente non funzionano (vedi l'esempio di GUI con HTML5 presentato nei post precedenti)
activity_main.xml
-------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
-------------------------------------
MainActivity.java
-------------------------------------
package com.web.html5;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView html5 = (WebView) findViewById(R.id.webView1);
html5.getSettings().setJavaScriptEnabled(true);
html5.setWebChromeClient(new WebChromeClient());
html5.loadUrl("file:///android_asset/www/index.html");
}
}
-------------------------------------
index.html
la pagina index.html deve essere inserita in asset/www/ quindi dentro alla directory asset
si deve creare il folder www e poi creare il file index.html. Dentro Eclipse, facendo doppio clic sul file html, il file viene visulizzato all'interno di un browser e quindi non e' editabile, si deve invece scegliere Apri con
-------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body { margin: 0; font-size: 2em; background-color: white; }
#quit { background-color: gray; color: white; font-weight: bold; display: block; text-align: right; }
</style>
<script type="text/javascript">
window.onload = function()
{
var canvas = document.getElementById("esempio");
if (canvas.getContext) {
var context = canvas.getContext("2d");
var re_min = -2.0;
var im_min = -1.2;
var re_max = 1.0;
var im_max = 1.2;
var iterazioni = 255;
var r;
var a,b;
var x,y,x_new,y_new;
var test;
var k,j,i;
var SCREEN_HEIGHT = 320;
var SCREEN_WIDTH = 400;
var re_factor = (re_max-re_min);
var im_factor = (im_max-im_min);
for (var i=0;i<SCREEN_HEIGHT;i++)
{
for (var j=0;j<SCREEN_WIDTH;j++)
{
a = re_min+(j*re_factor/SCREEN_WIDTH);
b = im_min+(i*im_factor/SCREEN_HEIGHT);
x = 0;
y = 0;
test = 0;
for (var k=0;k<iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
r = k%2;
if (r == 1)
{
context.beginPath();
context.fillRect(i,j,1,1);
context.stroke();
}
break;
}
x = x_new;
y = y_new;
}
}
}
}
}
</script>
</head>
<body>
<canvas id="esempio" height="400" width="800">
Il Browser non supporta HTML5.
<!-- Utile per inserire informazioni di default -->
</canvas>
</body>
</html>
La tecnica consiste nel creare una pagina con una WevView e farla puntare ad una pagina HTML5
Di seguito i file necessari per il progetto (in cui e' stato usato il generatore di insieme di Mandelbrot in HTML5 visto nei precedenti post)
Attenzione : il browser di default di Android non e' pienamente compatibile con Android per cui alcune pagine HTML5 semplicemente non funzionano (vedi l'esempio di GUI con HTML5 presentato nei post precedenti)
activity_main.xml
-------------------------------------
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<WebView
android:id="@+id/webView1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
</RelativeLayout>
-------------------------------------
MainActivity.java
-------------------------------------
package com.web.html5;
import android.os.Bundle;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.Menu;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
@SuppressLint("SetJavaScriptEnabled")
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView html5 = (WebView) findViewById(R.id.webView1);
html5.getSettings().setJavaScriptEnabled(true);
html5.setWebChromeClient(new WebChromeClient());
html5.loadUrl("file:///android_asset/www/index.html");
}
}
-------------------------------------
index.html
la pagina index.html deve essere inserita in asset/www/ quindi dentro alla directory asset
si deve creare il folder www e poi creare il file index.html. Dentro Eclipse, facendo doppio clic sul file html, il file viene visulizzato all'interno di un browser e quindi non e' editabile, si deve invece scegliere Apri con
-------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body { margin: 0; font-size: 2em; background-color: white; }
#quit { background-color: gray; color: white; font-weight: bold; display: block; text-align: right; }
</style>
<script type="text/javascript">
window.onload = function()
{
var canvas = document.getElementById("esempio");
if (canvas.getContext) {
var context = canvas.getContext("2d");
var re_min = -2.0;
var im_min = -1.2;
var re_max = 1.0;
var im_max = 1.2;
var iterazioni = 255;
var r;
var a,b;
var x,y,x_new,y_new;
var test;
var k,j,i;
var SCREEN_HEIGHT = 320;
var SCREEN_WIDTH = 400;
var re_factor = (re_max-re_min);
var im_factor = (im_max-im_min);
for (var i=0;i<SCREEN_HEIGHT;i++)
{
for (var j=0;j<SCREEN_WIDTH;j++)
{
a = re_min+(j*re_factor/SCREEN_WIDTH);
b = im_min+(i*im_factor/SCREEN_HEIGHT);
x = 0;
y = 0;
test = 0;
for (var k=0;k<iterazioni;k++)
{
x_new = (x*x)-(y*y)+a;
y_new = (2*x*y)+b;
if (((x_new*x_new)+(y_new*y_new))>4)
{
r = k%2;
if (r == 1)
{
context.beginPath();
context.fillRect(i,j,1,1);
context.stroke();
}
break;
}
x = x_new;
y = y_new;
}
}
}
}
}
</script>
</head>
<body>
<canvas id="esempio" height="400" width="800">
Il Browser non supporta HTML5.
<!-- Utile per inserire informazioni di default -->
</canvas>
</body>
</html>
Test HTML5 su vari browser
Browser di Android 4.0.2 |
HTML5 ancora non e' uno standard ed i browser hanno una capacita' di interpretazione del linguaggio molto differente. Di seguito una prova del test di html5test.com su piattaforma Android e PC
Come si vede Opera su Android surclassa il browser del sistema operativo mentre per l'ambiente Desktop il migliore (in modo abbastanza prevedibile) Chrome. E' anche evidente la progressione di miglioramenti nelle varie versioni di Android
Opera su Android
|
Browser di Android 2.2 |
Browser di Android 2.3 |
Chrome 23 su Windows Xp |
Firefox 16 su Windows XP |
martedì 18 dicembre 2012
Pico TTS vs Ivona TTS
Il motore Text To Speech di default per Android e' Pico ma esistono molte soluzioni alternative; particolarmente interessante e' Ivona TTS che ha una qualita' del parlato nettamente superiore e meno metalliche di Pico.
Il motore Ivona puo' essere scaricato gratuitamente da Google Play ed ha come unico difetto una occupazione di circa 10 volte superiore rispetto a quella di Pico
Di seguito due esempi in italiano
Il motore Ivona puo' essere scaricato gratuitamente da Google Play ed ha come unico difetto una occupazione di circa 10 volte superiore rispetto a quella di Pico
Di seguito due esempi in italiano
Ivona TTS
Esempio GUI con HTML5
Seguendo la strada gia' impostata tempo fa ecco un esempio di come realizzare l'esempio GUI con HTML 5
L'impaginazione e' bruttina ma il tutto funziona
-----------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body { margin: 0; font-size: 2em; background-color: white; }
#quit { background-color: gray; color: white; font-weight: bold; display: block; text-align: right; }
.containter{width: 150px; margin: 0 auto;}
.containter div{width: 150px;margin: 0 auto;}
</style>
<script type="text/javascript">
function showValue(newValue)
{
document.getElementById("range").innerHTML=newValue;
document.getElementById("progress").value=newValue;
}
</script>
</head>
<body>
<div class="containter">
<div>
<input type="range" min="0" max="100" onchange="showValue(this.value)" /></input>
</div>
<div>
<span id="range">50</span>
</div>
<div>
<progress id="progress" value="50" max="100">50%</progress>
</div>
</div>
</body>
</html>
L'impaginazione e' bruttina ma il tutto funziona
-----------------------------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body { margin: 0; font-size: 2em; background-color: white; }
#quit { background-color: gray; color: white; font-weight: bold; display: block; text-align: right; }
.containter{width: 150px; margin: 0 auto;}
.containter div{width: 150px;margin: 0 auto;}
</style>
<script type="text/javascript">
function showValue(newValue)
{
document.getElementById("range").innerHTML=newValue;
document.getElementById("progress").value=newValue;
}
</script>
</head>
<body>
<div class="containter">
<div>
<input type="range" min="0" max="100" onchange="showValue(this.value)" /></input>
</div>
<div>
<span id="range">50</span>
</div>
<div>
<progress id="progress" value="50" max="100">50%</progress>
</div>
</div>
</body>
</html>
Disegnare pixel in HTML5
In HTML5 non esiste una funzione per disegnare un pixel al di sopra di un Canvas per cui si deve ricorrere ad un paio di trucchi come
- creare una linea di lunghezza 1
- creare un rettangolo di lato 1
-------------------------
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style type="text/css">
body { margin: 0; font-size: 2em; background-color: white; }
#quit { background-color: gray; color: white; font-weight: bold; display: block; text-align: right; }
</style>
<script type="text/javascript">
window.onload = function()
{
var canvas = document.getElementById("esempio");
if (canvas.getContext) {
var context = canvas.getContext("2d");
//linea di lunghezza 1
context.beginPath();
context.moveTo(200,200);
context.lineTo(201,201);
context.stroke();
//rettangolo di lunghezza 1
context.beginPath();
context.fillRect(100,100,1,1);
context.stroke();
}
document.getElementById("quit").onmousedown = function()
{
Qt.quit();
};
toggleElement();
}
</script>
</head>
<body>
<a id="quit">X</a>
<canvas id="esempio" height="200" width="350">
<!-- Utile per inserire informazioni di default -->
</canvas>
</body>
</html>
-------------------------Attenzione: se si fa girare il programma sembra che non si visualizza niente, si deve fare molta attenzione perche' i pixel sono ovviamente molto piccoli sui monitor moderni
Iscriviti a:
Post (Atom)
Debugger integrato ESP32S3
Aggiornamento In realta' il Jtag USB funziona anche sui moduli cinesi Il problema risiede nell'ID USB della porta Jtag. Nel modulo...
-
In questo post viene indicato come creare uno scatterplot dinamico basato da dati ripresi da un file csv (nel dettaglio il file csv e' c...
-
La scheda ESP32-2432S028R monta un Esp Dev Module con uno schermo TFT a driver ILI9341 di 320x240 pixels 16 bit colore.Il sito di riferiment...
-
Questo post e' a seguito di quanto gia' visto nella precedente prova Lo scopo e' sempre il solito: creare un sistema che permet...