sabato 10 novembre 2012
Installa Ruby on Rails su Debian per Passbook Server
per questa installazione si e' partiti da una Debian Testing netinstall perche' la versione Stable ha come pacchetti Ruby 1.8 mentre a me serve la versione piu' recente di Ruby (la 1.9) accoppiata al piu' recente Rails (3)
Esiste un Live Cd di TurnKey che propone un ambiente Ruby On Rails gia' configurato ma essendo un derivato da Debian Stable anche in questo caso si trovano pacchetti datati
Lo scopo finale e' quello di settare un ambiente di sviluppo/test per i Passbook di Apple
una volta installato il sistema in modalita' server (quindi niente ambiente desktop) si procede con
apt-get update
apt-get upgrade
apt-get install build-essential apache2 libapache2-mod-passenger
apt-get install rdoc ruby1.9.1-full
apt-get install ruby1.9.1-dev libopenssl-ruby rubygems1.8
gem install fastthread
apt-get install ruby-rails-3.2
gem install coffee-rails uglifier
con queste impostazioni si ha un ambiente di svliluppo generico che permette di usare gli esempi riportati a questo link
a questo punto si inizia a settare le dipendenze per il Passbook Server
gem install sinatra sequel sqlite3 rubyzip rack json terminal-table
si scompattano gli esempi Passbook che si trovano su Apple Developer e ci si posiziona nella directory ServerReference/pass_server e si lancia
gem install lib/sign_pass-1.0.0.gem
chmod 755 lib/pass_server_ctl
lib/pass_server_ctl -s
martedì 6 novembre 2012
Menuet Os
Un progetto interessante ma sostanzialmente inutile....un sistema operativo scritto interamente in Assembler con Fasm
Menuet OS si scarica da qui e l'immagine e' grande quanto un disco da 1.44 Mb
Per utilizzarla con QEmu si usa la seguente stringa
qemu -localtime -m 768 -fda M32-085B.IMG -L . -net user -net nic
la prima schermata e' per settare alcuni parametri della scheda video
e dopo si ha il desktop con alcune utility (a dire il vero molto scarne)
Menuet OS si scarica da qui e l'immagine e' grande quanto un disco da 1.44 Mb
Per utilizzarla con QEmu si usa la seguente stringa
qemu -localtime -m 768 -fda M32-085B.IMG -L . -net user -net nic
la prima schermata e' per settare alcuni parametri della scheda video
e dopo si ha il desktop con alcune utility (a dire il vero molto scarne)
lunedì 5 novembre 2012
Primi passi in Assembler su Linux
piu' che altro per divertimento ho provato a riscrivere qualcosa in assembler..era dai tempi del DOS e di Int 21h che non usavo piu' l'assembler
E' curioso ritrovare che anche Linux come Dos usa un interrupt (80h) per la gestione del sistema ed e' anche curioso di come si possano usare le chiamate alle funzioni C (in questo caso printf) dall'Assembler (di solito e' il linguaggio di piu' alto livello che sfrutta quello di livello piu' basso)
Tutti gli esempi sono compilati con nasm
Il primo esempio stampa una scritta a video usando l'Int 80h
Per la compilazione si devono dare i seguenti comandi
nasm -f elf32 scrivi.asm
ld -o scrivi scrivi.o
scrivi.asm
-------------------------------------------------------
global _start
section .text
_start:
mov eax,4
mov ebx,1
mov ecx,messaggio
mov edx,lunghezza
int 80h
mov eax,1
mov ebx,0
int 80h
section .data
messaggio: db 'Hello ',0x0a
lunghezza: equ $-messaggio
-------------------------------------------------------
come output si ha
Hello
Per il secondo esempio si usa invece la chiamata esterna printf per stampare il valore di una variabile
In questo caso la catena di compilazione e' differente per venire incontro alla chiamata esterna che e' risolta da gcc
nasm -f elf32 -l scrivi2.lst scrivi2.asm
gcc -o scrivi2 scrivi2.o
scrivi2.asm
-------------------------------------------------------
extern printf
section .text
global main
main:
push ebp
mov ebp,esp
push dword [a]
push dword formato
call printf
add esp,12
mov esp,ebp
pop ebp
mov eax,0
ret
section .data
a: dd 5
formato: db "a=%d",10,0
-------------------------------------------------------
come output si ha
a=5
Molto simile al precedente il terzo esempio mostra un ciclo
nasm -f elf32 -l scrivi3.lst scrivi3.asm
gcc -o scrivi3 scrivi3.o
scrivi3.asm
-------------------------------------------------------
extern printf
section .text
global main
main:
push ebp
mov ebp,esp
mov ebx,10
gira:
push ebx
push dword formato
call printf
dec ebx
jnz gira
mov esp,ebp
pop ebp
mov eax,0
ret
section .data
formato: db "ciclo=%d",10,0
-------------------------------------------------------
produce come output
ciclo=10
ciclo=9
ciclo=8
ciclo=7
ciclo=6
ciclo=5
ciclo=4
ciclo=3
ciclo=2
ciclo=1
Array a dimensione variabile in Android
Uno degli aspetti piu' divertenti dei linguaggi di programmazionee evoluti e' la possibilita' di gestire degli array a dimensione non predefinita (a partire dalla STL di C++)
In Java ed Android vi sono ben due possibilita' date dal formato Vector ed ArrayList
Nei due esempi gli array vengono popolati con i valori della funzione Seno.
Dal punto di vista operativo le differenze sono veramente minime.
Vettore
-------------------------------------------------------
v = new Vector<Float>();
for (int t=0;t<360;t++)
{
v.add((float) Math.sin(Math.toRadians(t)));
}
int length = v.size();
Log.d("lenght_t", Integer.toString(length));
-------------------------------------------------------
ArrayList
-------------------------------------------------------
al = new ArrayList<Float>();
for (int s=0;s<360;s++)
{
al.add((float) Math.sin(Math.toRadians(s)));
}
length_s = al.size();
Log.d("length_s", Integer.toString(length_s));
Iterator<Float> it = al.iterator();
while (it.hasNext()) {
System.out.println("Data is "+ it.next());
}
-------------------------------------------------------
In Java ed Android vi sono ben due possibilita' date dal formato Vector ed ArrayList
Nei due esempi gli array vengono popolati con i valori della funzione Seno.
Dal punto di vista operativo le differenze sono veramente minime.
- i metodi del Vector sono sincroni mentre gli ArrayList non sono sincroni
- i Vector sono thread-safe ma sono piu' lenti nell'aumentare le dimensioni
- ad ogni add Vector raddoppia le dimensioni disponibili mentre ArrayList aumenta le dimensioni di meta' della propria dimensione
Vettore
-------------------------------------------------------
v = new Vector<Float>();
for (int t=0;t<360;t++)
{
v.add((float) Math.sin(Math.toRadians(t)));
}
int length = v.size();
Log.d("lenght_t", Integer.toString(length));
-------------------------------------------------------
ArrayList
-------------------------------------------------------
al = new ArrayList<Float>();
for (int s=0;s<360;s++)
{
al.add((float) Math.sin(Math.toRadians(s)));
}
length_s = al.size();
Log.d("length_s", Integer.toString(length_s));
Iterator<Float> it = al.iterator();
while (it.hasNext()) {
System.out.println("Data is "+ it.next());
}
-------------------------------------------------------
domenica 4 novembre 2012
Personalizzare Nautilus
Una delle cose che non mi e' mai piaciuta di Nautilis e' l'interfaccia stile Explorer di Windows con la lista di una sola directory per ogni finestra...considero decisamente piu' funzionale l'interfaccia tipo Norton
In realta' con la 'sola pressione del tasto F3 si riesce ad avere una visione a due finestre affiancate
mentre con il tasto F9 si fa apparire e scomparire la colonna delle directory predefinite di destra (alla colonna delle directory predefinite si possono aggiungere elementi tramite il drag and drop)
venerdì 2 novembre 2012
Creare grafici con AChartEngine in Android
Un altro metodo per creare grafici con Android e' quello di impiegare la libreria AChartEngine
Il problema con questa libreria e' che sostanzialmente priva di esempi e non e' cosi' immediato usarla
Si possono trovare dei video tipo questo
ma se si prova a seguire l'esempio il programma genera sempre un'eccezione
il trucco e' che in modo preliminare si devono modificare project.properties e Manifest.xml cosi' come evidenziato in giallo
project.properties
------------------------------------------------
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-15
manifestmerger.enabled=true
------------------------------------------------
Manifest.xml
------------------------------------------------
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.graph2"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="org.achartengine.GraphicalActivity" />
</application>
</manifest>
------------------------------------------------
Dopo di cio' si puo' iniziare a scrivere il codice
Di fatto il grafico vive in una sua finestra per cui va lanciato mediante Intent
MainActivity
------------------------------------------------
package com.test.graph2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void lineGraphHandler (View view)
{
LineGraph line = new LineGraph();
Intent lineIntent = line.getIntent(this);
startActivity(lineIntent);
}
}
------------------------------------------------
Per il resto il codice per generazione del grafico e' piuttosto autoesplicativa
LineGraph.java
------------------------------------------------
package com.test.graph2;
import org.achartengine.ChartFactory;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.TimeSeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
public class LineGraph {
public Intent getIntent(Context context) {
// Our first data
int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // x values!
int[] y = { 30, 34, 45, 57, 77, 89, 100, 111 ,123 ,145 }; // y values!
TimeSeries series = new TimeSeries("Line1");
for( int i = 0; i < x.length; i++)
{
series.add(x[i], y[i]);
}
// Our second data
int[] x2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // x values!
int[] y2 = { 145, 123, 111, 100, 89, 77, 57, 45, 34, 30}; // y values!
TimeSeries series2 = new TimeSeries("Line2");
for( int i = 0; i < x2.length; i++)
{
series2.add(x2[i], y2[i]);
}
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(series);
dataset.addSeries(series2);
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(); // Holds a collection of XYSeriesRenderer and customizes the graph
XYSeriesRenderer renderer = new XYSeriesRenderer(); // This will be used to customize line 1
XYSeriesRenderer renderer2 = new XYSeriesRenderer(); // This will be used to customize line 2
mRenderer.addSeriesRenderer(renderer);
mRenderer.addSeriesRenderer(renderer2);
// Customization time for line 1!
renderer.setColor(Color.WHITE);
renderer.setPointStyle(PointStyle.SQUARE);
renderer.setFillPoints(true);
// Customization time for line 2!
renderer2.setColor(Color.YELLOW);
renderer2.setPointStyle(PointStyle.DIAMOND);
renderer2.setFillPoints(true);
Intent intent = ChartFactory.getLineChartIntent(context, dataset, mRenderer, "Line Graph Title");
return intent;
}
}
------------------------------------------------
Il problema con questa libreria e' che sostanzialmente priva di esempi e non e' cosi' immediato usarla
Si possono trovare dei video tipo questo
ma se si prova a seguire l'esempio il programma genera sempre un'eccezione
il trucco e' che in modo preliminare si devono modificare project.properties e Manifest.xml cosi' come evidenziato in giallo
project.properties
------------------------------------------------
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-15
manifestmerger.enabled=true
------------------------------------------------
Manifest.xml
------------------------------------------------
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.test.graph2"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="15" />
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/title_activity_main" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name="org.achartengine.GraphicalActivity" />
</application>
</manifest>
------------------------------------------------
Dopo di cio' si puo' iniziare a scrivere il codice
Di fatto il grafico vive in una sua finestra per cui va lanciato mediante Intent
MainActivity
------------------------------------------------
package com.test.graph2;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void lineGraphHandler (View view)
{
LineGraph line = new LineGraph();
Intent lineIntent = line.getIntent(this);
startActivity(lineIntent);
}
}
------------------------------------------------
Per il resto il codice per generazione del grafico e' piuttosto autoesplicativa
LineGraph.java
------------------------------------------------
package com.test.graph2;
import org.achartengine.ChartFactory;
import org.achartengine.chart.PointStyle;
import org.achartengine.model.TimeSeries;
import org.achartengine.model.XYMultipleSeriesDataset;
import org.achartengine.renderer.XYMultipleSeriesRenderer;
import org.achartengine.renderer.XYSeriesRenderer;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
public class LineGraph {
public Intent getIntent(Context context) {
// Our first data
int[] x = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // x values!
int[] y = { 30, 34, 45, 57, 77, 89, 100, 111 ,123 ,145 }; // y values!
TimeSeries series = new TimeSeries("Line1");
for( int i = 0; i < x.length; i++)
{
series.add(x[i], y[i]);
}
// Our second data
int[] x2 = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // x values!
int[] y2 = { 145, 123, 111, 100, 89, 77, 57, 45, 34, 30}; // y values!
TimeSeries series2 = new TimeSeries("Line2");
for( int i = 0; i < x2.length; i++)
{
series2.add(x2[i], y2[i]);
}
XYMultipleSeriesDataset dataset = new XYMultipleSeriesDataset();
dataset.addSeries(series);
dataset.addSeries(series2);
XYMultipleSeriesRenderer mRenderer = new XYMultipleSeriesRenderer(); // Holds a collection of XYSeriesRenderer and customizes the graph
XYSeriesRenderer renderer = new XYSeriesRenderer(); // This will be used to customize line 1
XYSeriesRenderer renderer2 = new XYSeriesRenderer(); // This will be used to customize line 2
mRenderer.addSeriesRenderer(renderer);
mRenderer.addSeriesRenderer(renderer2);
// Customization time for line 1!
renderer.setColor(Color.WHITE);
renderer.setPointStyle(PointStyle.SQUARE);
renderer.setFillPoints(true);
// Customization time for line 2!
renderer2.setColor(Color.YELLOW);
renderer2.setPointStyle(PointStyle.DIAMOND);
renderer2.setFillPoints(true);
Intent intent = ChartFactory.getLineChartIntent(context, dataset, mRenderer, "Line Graph Title");
return intent;
}
}
------------------------------------------------
Plugin Android per Eclipse
Al momento attuale esistono diversi plugin per Android o meglio diversi pacchetti
Scaricando il Google Plugin si ha oltre al necessario per sviluppare Android in Eclipse anche la possibilita' di scaricare l'SDK di Android e GWT ed AppEngine
Invece a questo link si trova il solo pacchetto ADT in cui e' presente il solo plugin Android per Eclipse. L'SDK dovra' essere scaricato a parte
Scaricando il Google Plugin si ha oltre al necessario per sviluppare Android in Eclipse anche la possibilita' di scaricare l'SDK di Android e GWT ed AppEngine
Invece a questo link si trova il solo pacchetto ADT in cui e' presente il solo plugin Android per Eclipse. L'SDK dovra' essere scaricato a parte
Iscriviti a:
Post (Atom)
Physics informed neural network Fukuzono
Visto che puro ML non funziona per le serie tempo di cui mi sto occupando ed le regressioni basate su formule analitiche mostrano dei limiti...

-
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...