Posts Tagged ‘programmare’

Check if an Android’s service is running with java api

Published by Alessandro Musacchio on February 26th, 2012 - in Android, Java

Developing some Android app happen to know whether a service is active or not, for example I needed to know if the service was launched by my apps or not when I open the app, to see the start button or stop button for the service.

Let’s see how it could be a function that will work for us:

private boolean isMyServiceRunning() {
      ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
      for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
          if ("com.example.MyService".equals(service.service.getClassName())) {
               return true;
          }
      }
      return false;
}

In place of the string: com.example.MyService we put the string identifying the service that interests us.

It’s easy?! ;-)

Sapreste scrivere un “Hello World” senza punto e virgola?!?

Published by Alessandro Musacchio on August 13th, 2010 - in Programmazione

La domanda è: sapreste scrivere un programma che stampa la famosa stringa “Ciao Mondo”  in C senza usare mennemo un punto e virgola?!?!

Clicca qui per la soluzione!

Tags:

Calcoli con virgola, precisi e finanziari in Java

Published by Alessandro Musacchio on April 24th, 2010 - in Java

Se nella nostra applicazione Java dobbiamo fare calcoli in cui abbiamo numeri con la virgola, tipo calcoli scientifici e calcoli finanziari non dobbiamo utilizzare mai i tipi di dato a virgola mobile come float e double in quanto la loro rappresentazione in binario non riesce ad essere precisa e quindi presenta piccoli problemi di arrotondamento. Ad esempio, non esiste una rappresentazione precisa nel sistema decimale di 1/3 come non esiste una rappresentazione precisa di 1/10 in binario..

Vediamo un esempio:

/**
 * @author Alessandro Musacchio
 *
 */
public class Numeri {
	public static void main(String[] args) {
		double a = 2.0000001d;
		double b = 1.0000001d;
		System.out.print("Calcolo con i double: ");
		System.out.println(a - b);
		float af = 2.0000001f;
		float bf = 1.0000001f;
		System.out.print("Calcolo con i float: ");
		System.out.println(af - bf);
	}
}

Il risultato che danno entrambi i calcoli se eseguiti su un PC sono errati in quanto l’unico risultato ammisibile è: 1 senza alcun arrotondamento!

Vediamo ora come Java con gli ogetti BigDecimal ci permette di fare calcoli con la “massima” precisione:

import java.math.BigDecimal;
/**
 * @author Alessandro Musacchio
 *
 */
public class Numeri {
	public static void main(String[] args) {
		BigDecimal aBD = new BigDecimal("2.0000001");
		BigDecimal bBD = new BigDecimal("1.0000001");
		System.out.print("Calcolo con i BigDecimal: ");
		System.out.println(aBD.subtract(bBD));
	}
}

Eseguendo questo pezzo di codice invece vedremo il risultato esatto!

Tags: ,

Spostamenti su una matrice in Java

Published by Alessandro Musacchio on April 20th, 2010 - in Java

Un piccolo esempio di rappresentazione di un movimento su una matrice, l’esempio è puramente esemplificativo..
Per realizzare un’applicazione con un’interfaccia grafica utilizzeremo poi i KeyListener per catturare gli eventi dei tasti freccia ed il paintComponent per stampare a video il movimento, e rappresenteremo gli oggetti con una classe ad-hock tipo “Omino” :)

import java.util.Scanner;
 
/**
 * Semplice classe che implementa una matrice con
 * un solo omino presente su di essa che si muove
 * nelle direzioni
 * nord : tasto 2
 * sud : tasto 3
 * est : tasto 4
 * ovest : tasto 1
 * uscita : tasto 0
 */
 
/**
 * @author Alessandro Musacchio
 *
 */
public class Matrice {
 
	private int[][] matrice;
	private int posX;
	private int posY;
	private int dim;
 
	public Matrice(int dim) {
		this.matrice = new int[dim][dim];
		this.dim = dim;
		this.posX = 0;
		this.posY = 0;
		// Setto la posizione iniziale da cui parte l'omino
		this.matrice[posY][posX] = 1;
	}
 
	public int[][] getMatrice() {
		return matrice;
	}
 
	public boolean muoviDestra() {
		// Controllo se sono al bordo
		if (posX+1 == dim) return false;
		// Mi muovo
		this.matrice[posY][posX] = 0; // Lascio il posto attuale
		this.posX++; // Modifico le coordinate
		this.matrice[posY][posX] = 1; // Occupo il nuovo posto
		return true;
	}
 
	public boolean muoviSinistra() {
		// Controllo se sono al bordo
		if (posX-1 == -1) return false;
		// Mi muovo
		this.matrice[posY][posX] = 0; // Lascio il posto attuale
		this.posX--; // Modifico le coordinate
		this.matrice[posY][posX] = 1; // Occupo il nuovo posto
		return true;
	}
 
	public boolean muoviSu() {
		// Controllo se sono al bordo
		if (posY-1 == -1) return false;
		// Mi muovo
		this.matrice[posY][posX] = 0; // Lascio il posto attuale
		this.posY--; // Modifico le coordinate
		this.matrice[posY][posX] = 1; // Occupo il nuovo posto
		return true;
	}
 
	public boolean muoviGiu() {
		// Controllo se sono al bordo
		if (posY+1 == dim) return false;
		// Mi muovo
		this.matrice[posY][posX] = 0; // Lascio il posto attuale
		this.posY++; // Modifico le coordinate
		this.matrice[posY][posX] = 1; // Occupo il nuovo posto
		return true;
	}
 
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Matrice mappa = new Matrice(10);
		Scanner sc = new Scanner(System.in);
		int val = 0;
		do {
			val = sc.nextInt();
			if (val == 1) {
				if (mappa.muoviSinistra()) {
					System.out.println("Mosso Sinistra");
				} else {
					System.out.println("Sei al bordo");
				}
			}
			if (val == 2) {
				if (mappa.muoviSu()) {
					System.out.println("Mosso Su");
				} else {
					System.out.println("Sei al bordo");
				}
			}
			if (val == 3) {
				if (mappa.muoviGiu()) {
					System.out.println("Mosso Giù");
				} else {
					System.out.println("Sei al bordo");
				}
			}
			if (val == 4) {
				if (mappa.muoviDestra()) {
					System.out.println("Mosso Destra");
				} else {
					System.out.println("Sei al bordo");
				}
			}
		} while (val != 0);
	}
}
Tags: ,

Significato di Trunk, Branches e Tags

Published by Alessandro Musacchio on April 5th, 2010 - in Programmazione

A tutti noi sarà capitato di leggere un pò di codice sorgente in un progetto Open Source?! Magari la prima volta sorge spontanea la domanda del perchè e di cosa siano la cartelle Trunk,Branches e Tags..

Bene.. Iniziamo col spiegare il termine Trunk..

Trunk sta per “Tronco” ed è la cartella dove nasce e si sviluppa il codice sorgente del software..

Branches sta per “Rami” ed è la cartella dei rami, ovvero dei progetti che partendo da tronco si staccano e si evolvono a se, a volte finiscono per ricongiungersi al tronco..

Infine i Tags, sono delle “Etichette” che servono a dare un nome ad una certa revisione del codice, esempio Alpha, Beta ecc..

Tags:

Parser html con JavaCC

Published by Alessandro Musacchio on September 25th, 2009 - in Programmazione

Vi presento un piccolo esempio di come si può scrivere facilmente un parser LL1 in java con il tool JavaCC.
Il seguente codice è solo a scopo didattico, ovviamente non riconosce tutti i costrutti del linguaggio html ma rende l’ idea della semplicità di realizzazione di un parser.

options { IGNORE_CASE = true; } 
PARSER_BEGIN(parserHTML)
public class parserHTML {
		public static void main(String[] args)
		throws ParseException, TokenMgrError, java.io.FileNotFoundException{
			parserHTML parser = new parserHTML(new java.io.FileInputStream("input.txt"));
			parser.Start();
		}
	}
PARSER_END(parserHTML)
 
 
 
SKIP: {" "}
SKIP: {"\n" | "\r" | "\r\n" |"\t"}
SKIP: {"<!--": INCOMMENTO}
<INCOMMENTO>
SKIP:{"-->":DEFAULT | <~[]>}
TOKEN: {
		<PAGINAAPERTA: "<html>">
	|	<PAGINACHIUSA: "</html>">
	|	<TESTAAPERTA: "<head>">
	|	<TESTACHIUSA: "</head>">
	|	<TITOLOAPERTO: "<title>">
	|	<TITOLOCHIUSO: "</title>">
	|	<CORPOAPERTO: "<body>">
	|	<CORPOCHIUSO: "</body>">
	|	<FORMATTAZIONEAPERTA: "<b>">
	|	<FORMATTAZIONECHIUSA: "</b>">
	|	<PARAGRAFOAPERTO: "<p>">
	|	<PARAGRAFOCHIUSO: "</p>">
	|	<METAAPERTO: "<meta>">
	|	<CHIAVEMETA: "http-equiv">
	|	<METACHIUSO: "</meta>">
	|	<STILEAPERTO: "<style">
	|	<CHIAVESTILE: "text/css">
	|	<STILECHIUSO: "</style>">
	|	<COLLEGAMENTOAPERTO: "<a">
	|	<COLLEGAMENTOCHIUSO: "</a>">
	|	<INPUTAPERTO: "<input">
	|	<CHIAVE: "type" | "id" | "name">
	|	<CHIAVEINPUT: "checkbox" | "radio" | "submit">
	|	<CHIAVECOLLEGAMENTO: "href" | "title">
	|	<ACUTACHIUSA: ">">
	|	<NUOVALINEA: "<br>">
	|	<FORMAPERTO: "<form>">
	|	<FORMCHIUSO: "</form>">
	|	<UGUALE: "=">
	|	<VIRGOLETTE: "\"">
	|	<HAPERTA: "<h1>">
	|	<HCHIUSA: "</h1>">
	|	<TABELLAAPERTA: "<table>">
	|	<TABELLACHIUSA: "</table>">
	|	<RIGAAPERTA: "<tr>">
	|	<RIGACHIUSA: "</tr>">
	|	<CELLAAPERTA: "<td>">
	|	<CELLACHIUSA: "</td>">
	|	<CARATTERE: ["$","A"-"Z","_",",",".","a"-"z","0"-"9"]>
}
 
 
 
 
void Start():
{}
{
	<PAGINAAPERTA>
	testa()
	corpo()
	<PAGINACHIUSA>
	|
	{System.out.println("FILE VUOTO");}
}
 
 
void testa():
{}
{
	(
	<TESTAAPERTA>
	corpotesta()
	<TESTACHIUSA>
	)
	|
	{System.out.println("testa epsilon");}
}
 
void corpotesta():
{}
{
	(
		<TITOLOAPERTO>
		stringa()
		<TITOLOCHIUSO>
		corpotesta()
	)
	|
	(
		<METAAPERTO>
		<CHIAVEMETA>
		<UGUALE>
		<VIRGOLETTE>
		stringa()
		<VIRGOLETTE>
		<METACHIUSO>
		corpotesta()
	)
	|
	(
		<STILEAPERTO>
		<CHIAVE>
		<UGUALE>
		<VIRGOLETTE>
		<CHIAVESTILE>
		<VIRGOLETTE>
		<ACUTACHIUSA>
		stringa()
		<STILECHIUSO>
		corpotesta()
	)
	|	
	{System.out.println("corpotesta epsilon");}
}
 
void stringa():
{}
{
	(
		(<CARATTERE>)*
		(<NUOVALINEA>)*
	)
	|
	{System.out.println("stringa epsilon");}	
}
 
 
void corpo():
{}
{
	<CORPOAPERTO>
	contenuto()
	<CORPOCHIUSO>
	(<NUOVALINEA>)*
	|  	
	{System.out.println("corpo epsilon");}
 
}
 
 
void contenuto():
{}
{
	(	
		<HAPERTA>
		stringa()
		<HCHIUSA>
		contenuto()
	)	
	|
	(
		<PARAGRAFOAPERTO>
		contenuto()
		<PARAGRAFOCHIUSO>
		contenuto()
	)
	|
	(
		<COLLEGAMENTOAPERTO>
		(
			<CHIAVECOLLEGAMENTO>
			<UGUALE>
			<VIRGOLETTE>
			stringa()
			<VIRGOLETTE>
		)*
		<ACUTACHIUSA>
		stringa()
		<COLLEGAMENTOCHIUSO>
		contenuto()
	)
	|
	(
		<NUOVALINEA>
		contenuto()
	)
	|
	(
		<FORMAPERTO>
		contenuto()
		<FORMCHIUSO>
		contenuto()
	)
	|
	(
		<INPUTAPERTO>
		(
		<CHIAVE>
		<UGUALE>
		<VIRGOLETTE>
		<CHIAVEINPUT>
		<VIRGOLETTE>
		)+
		<ACUTACHIUSA>
		contenuto()
	)
	|
	(
	<CARATTERE>
	stringa()
	contenuto()
	)
	|
	(
	<FORMATTAZIONEAPERTA>
	stringa()
	<FORMATTAZIONECHIUSA>
	contenuto()
	)
	|
	(
		<TABELLAAPERTA>
		(
			<RIGAAPERTA>
			(
				<CELLAAPERTA>
				stringa()
				<CELLACHIUSA>
			)*
			<RIGACHIUSA>
		)*
		<TABELLACHIUSA>
		contenuto()
	)
	|
	{System.out.println("contenuto epsilon");} 
}
Tags: ,

Programmare Lego mindstorms NTX in C/C++

Published by Alessandro Musacchio on September 17th, 2009 - in C++, Programmazione

Pur non avendo lo stupendo robot della Lego, il Mindstorms NTX, mi interessa la sua programmazione, a molti piace programmarlo in Java con il firmware LeJos, ma oggi ho trovato un programmatore che si diverde con il caro vecchio C/C++ e direi che ha fatto un interessantissima versione del robot per risolvere il Sudoku con la penna, in pratica il robot impugna la penna, inizia a scannerizzare il foglio e poi lo completa colonna per colonna.

Sul suo sito si possono trovare le istruzioni per la realizzazione e il codice sorgente di questo robot e di quello che risolve il cubo di rubik.

Creare processi batch in Java

Published by Alessandro Musacchio on September 17th, 2009 - in Database, Java, PL/SQL

In questo post vedremo come creare un processo batch in java che eseguirà una semplice query nel database Oracle 10g attraveso il driver JDBC:ODBC.

import java.sql.*;
import java.util.logging.Level;
import java.util.logging.Logger;
 
/**
 *
 * @author Alessandro Musacchio
 */
public class Main {
 
    public static void main(String[] args) {
        Connection con = null;
        Statement st = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");
 
            con = DriverManager.getConnection("jdbc:oracle:thin:user/password@localhost:1521:XE");
            String query = "update UTILITA set AVVIOTRIGGER=1";
            st = con.createStatement();
            st.addBatch(query);
            st.executeBatch();
 
 
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }finally {
            if( st != null)
                st.close();
            if( con != null)
                con.close();
       }
    }
}

Schedulare un azione su Database Oracle 10g

Published by Alessandro Musacchio on September 17th, 2009 - in Database, PL/SQL, Programmazione

Vi mostrerò un esempio su come pianificare un azione, sia essa l’ esecuzione di una procedura, sia essa l’ avvio di un trigger ecc..
Oracle 10g, offre uno scheduler interno che permette di pianificare una particolare azione SQL alla data e allora stabilita, eventualmente anche ogni giorno.
Nell’ esempio sottostante vedremo come si crea e che cosa può fare:

BEGIN
  DBMS_SCHEDULER.create_job (
    job_name        => 'avviotrigger',
    job_type        => 'PLSQL_BLOCK',
    job_action      => 'BEGIN update UTILITA set AVVIOTRIGGER=1; END;',
    start_date      => SYSTIMESTAMP,
    repeat_interval => 'freq=daily; byhour=0;byminute=0;bysecond=0',
    end_date        => NULL,
    enabled         => TRUE,
    comments        => 'Inseriamo un commento');
END;

Come potete vedere niente di più semplice da implementare, abbiamo achedulato un azione (update UTILITA set AVVIOTRIGGER=1) che a partire dall’ istante in cui inseriamo il comando, ogni giorno e per sempre a mezzanotte eseguirà la query di update.

Funzione di login in PL/SQL

Published by Alessandro Musacchio on September 13th, 2009 - in PL/SQL

Esempio di una funzione che si occupa di validare la login, in base all’ user e alla password ricevute.
Come si può facilmente vedere al funzione esegue una query per recuperare dal database la password in base all’ user ricevuta e verificare se la password nel database è uguale a quella ricevuta, se così fosse ritorna il valore intero 1 altromenti il valore intero 0.

CREATE OR REPLACE FUNCTION  "CHECKLOGIN" ( user_p varchar2, pass_p varchar2 ) RETURN NUMBER IS
  y NUMBER:=0;
pwd varchar2(30);
BEGIN
SELECT password INTO pwd FROM servizioonline WHERE username=user_p;
  IF pwd=pass_p THEN
      y:= 1;
  END IF;
  RETURN y;
END;
© 2010-2012 AlessandroMusacchio.it

Create your own free site