venerdì 29 giugno 2012

Leggere un file xml e creare una lista di HashMap di stringhe ordinata alfabeticamente

A partire da un semplice xml che raggruppa libri posso leggerlo e creare una lista di HashMap di libri ordinati per nome.
L'oggetto utilizzato per la lettura del xml in questo esempio è XmlResourceParser e il record utilizza attributi del xml per la memorizzazione dei dati.
Ovviamente si può cambiare l'ordinamento per prezzo o autore.
Di seguito il file xml e il metodo che ritorna la lista di libri.
<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <book name="First book" author="E.P." price="9.5"/>
    <book name="Second book" author="A.D." price="12.80"/>
    <book name="Third book" author="F.R." price="14"/>
</resources>
private final static String NAME = "name";
private final static String AUTHOR = "author";
private final static String PRICE = "price";

//...

private List<? extends Map<String,?>> createList() {
    ArrayList<Map<String,String>> lista = new ArrayList<Map<String,String>>();
    //books.xml ad esempio è il file nella directory res/xml del progetto
    XmlResourceParser xrp = getResources().getXml(R.xml.books);
    String author = "";
    String price = "";
    String name ="";
    try{
        xrp.next();  
        int eventType = xrp.getEventType();
   
        while (eventType != XmlResourceParser.END_DOCUMENT) {
            if(eventType == XmlPullParser.START_TAG) {
                String strBook = xrp.getName();
                if (strBook.equals("book")) {
                    name = xrp.getAttributeValue(null, "name");
                    author = xrp.getAttributeValue(null, "author");
                    price = xrp.getAttributeValue(null, "price");
                    Map<String,String> data = new HashMap<String,String>();
                    data.put(NAME,name);
                    data.put(AUTHOR,author);
                    data.put(PRICE,price);
                    lista.add(data);
                }      
            }
            eventType = xrp.next(); 
        }
    } 
    catch (XmlPullParserException e) {   
        } 
    catch (IOException e) {  
    } 
    finally {    
        xrp.close(); 
    }
    //Ordinamento per nome
    Collections.sort(lista, sDisplayNameComparator);    
    return lista;
} 
    
private final static Comparator<Map> sDisplayNameComparator =
 new Comparator<Map>() {     
    private final Collator collator = Collator.getInstance();  
    public int compare(Map map1, Map map2) {       
        return collator.compare(map1.get(NAME), map2.get(NAME)); 
    }   
 };

giovedì 28 giugno 2012

Caricamento dati in un BufferedReader da un ip locale/remoto con dialog "Loading..."

All'evento onCreate di una activity possiamo fare la richiesta ad un ip (ad esempio con asp, jsp, etc.) e alimentare una ArrayList di "Book", utile per un eventuale popolamento di un "SimpleAdapter".
private ArrayList<Map<String,String>> lista;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.test);
    loadData();
}
    
public void loadData(){
    try{
        new LoadingData().execute("");
    }catch(Exception e){
        //...
    }
}
    
private class LoadingData extends AsyncTask<String, Void, Void>{
    private ProgressDialog Dialog = new ProgressDialog(Main.this);  
    
    protected void onPreExecute() {   
        Dialog.setMessage("Loading...");   
        Dialog.show();   
    }  
    
    protected Void doInBackground(String... urls) {   
        lista = new ArrayList<Map<String,String>>();
        List<Book> listBook = new ArrayList<Book>();
        
        ArrayList<NameValuePair> nameValuePairs = 
new ArrayList<NameValuePair>();
        try {
            //esempio di parametro che si aspetta un file jsp o asp
            nameValuePairs.add(new BasicNameValuePair("action", "select"));
            
            HttpClient httpclient = new DefaultHttpClient();
            HttpParams params = httpclient.getParams();
            HttpConnectionParams.setConnectionTimeout(params, 5);
            HttpConnectionParams.setSoTimeout(params, 5);

            HttpPost httppost = new HttpPost("http://" + "192.168.xxx.xxx");
            httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
            //risposta della jsp o asp
            HttpResponse response = httpclient.execute(httppost);
            HttpEntity entity = response.getEntity();
            InputStream is = entity.getContent();
            
            BufferedReader reader = new BufferedReader(new 
InputStreamReader(is, "iso-8859-1"), 8);
            String line = null;
            Book Book;
            /*
            immaginando delle righe tipo: 
                I promessi sposi|9
                La divina commedia|10
                ...
            scorro i record e carico la lista
            */
            while ((line = reader.readLine()) != null) {
                 String[] result=line.split("\\|");
                 String desc =result[1];
                 String amount = result[2];
                 Book = new Book();
                 Book.setDescription(desc);
                 Book.setAmount(amount);
                 listBook.add(Book);
            }
            is.close();
        }
        catch (ClientProtocolException e)
        {    
        return null;
        }
        catch (IOException e)
        {  
        return null;
        }
        catch (Exception e)
        {  
        return null;
        }

        for (Book Book : listBook) {
            Map<String,String> data = new HashMap<String,String>();
            data.put(DESC,Book.getDescription());
            data.put(AMOUNT,Book.getAmount());
            lista.add(data);
        }
        
        return null;
    }
    
    protected void onPostExecute(Void unused) {   
        Dialog.dismiss();  
        //... eventuale popolamento di un SimpleAdapter
    }
} 

mercoledì 27 giugno 2012

Semplice chiusura di una form con messaggio di conferma.

Prima di chiudere una form di un progetto in c# (in questo caso la FormTest) si può creare un messaggio di "conferma chiusura" utilizzando l'evento "_FormClosing" in questo semplice modo.
private void FormTest_FormClosing(object sender, FormClosingEventArgs e)
{
    if (DialogResult.Yes != MessageBox.Show(
         "Are you sure you want to quit?",
         "Confirm quit",
          MessageBoxButtons.YesNo,
          MessageBoxIcon.Question))
    {
        e.Cancel = true;
    }
}

martedì 26 giugno 2012

Esportare un campo testo (RichText) in un file txt oppure rtf

Da un campo textBox in una form di un progetto in c# (in questo caso è "txtScript") possiamo esportare il proprio contenuto del campo in un file txt oppure rtf dopo aver aperto una form dialog e aver scelto la directory e il nome del file.
private void ExportScript()
{
try
{
    SaveFileDialog saveFileDialog = new SaveFileDialog();
    saveFileDialog.Title = "Export text";
    saveFileDialog.DefaultExt = ".txt";
    saveFileDialog.Filter = "Text file (*.txt;*.rtf)|*.txt;*.rft";
    saveFileDialog.InitialDirectory = "Projects";    //esempio
    saveFileDialog.FileName = "";
    string fileName = "";

    if (saveFileDialog.ShowDialog() == DialogResult.OK)
    {
        if (saveFileDialog.ShowDialog() != DialogResult.OK)
            return;
        else
            fileName = saveFileDialog.FileName;
    }
    else
    {
        return;
    }
    // sempre di tipo RichText!
    txtScript.SaveFile(fileName,RichTextBoxStreamType.RichText);
}
 catch (Exception ex)
 {
     log.Error(ex);
 }
}

lunedì 25 giugno 2012

Importare un file txt, rtf, doc, in un campo testo di una form.

In un oggetto di tipo textBox (denominato qui per esempio "txtScript") di una form possiamo importare del testo tramite c#.
Nell' esempio l'import è per un file di tipo txt, rtf oppure un documento Word.
private void ImportScript()
{
    try
    {
    string pathFile = "";
    string extensionFile;

    //Apertura finestra e scelta del file
    OpenFileDialog dlgOpen = new OpenFileDialog();

    dlgOpen.Title = "Import text";
    dlgOpen.DefaultExt = ".txt";
    dlgOpen.Filter = "Text file (*.txt;*.rtf;*.doc)|*.txt;*.rtf;*.doc";
    dlgOpen.ShowReadOnly = true;
    dlgOpen.InitialDirectory = pathSPS + "Projects";
    dlgOpen.Multiselect = false;

    if (dlgOpen.ShowDialog() == DialogResult.OK)
    {
        pathFile = dlgOpen.FileName;
        extensionFile = dlgOpen.SafeFileName.Substring(
dlgOpen.SafeFileName.Length - 4, 4);
    }
    else
        return;

    //documento con estensione .doc
    if (extensionFile.ToLower().Equals(".doc"))
    {
        {
            Word.ApplicationClass wordApp = new ApplicationClass();
            object file = pathFile;

            object nullobj = System.Reflection.Missing.Value;

            Word.Document docWord = wordApp.Documents.Open(

              ref file, ref nullobj, ref nullobj, ref nullobj,
              ref nullobj, ref nullobj, ref nullobj,
              ref nullobj, ref nullobj, ref nullobj,
              ref nullobj, ref nullobj, ref nullobj,
              ref nullobj, ref nullobj, ref nullobj);

            docWord.ActiveWindow.Selection.WholeStory();

            docWord.ActiveWindow.Selection.Copy();

            IDataObject data = Clipboard.GetDataObject();

            this.txtScript.Text = data.GetData(DataFormats.Text).ToString();

            docWord.Close(ref nullobj, ref nullobj, ref nullobj);
        }
    }
    //documento con estensione .txt
    else if (extensionFile.ToLower().Equals(".txt"))
    {
        using (System.IO.StreamReader sr =
 new System.IO.StreamReader(pathFile))
        {
            this.txtScript.Text = sr.ReadToEnd();
        }
    }
    //documento con estensione .rtf
    else if (extensionFile.ToLower().Equals(".rtf"))
    {
        using (System.IO.StreamReader sr =
 new System.IO.StreamReader(pathFile))
        {
            this.txtScript.Rtf = sr.ReadToEnd(); // di tipo Rtf!
        }
    }
    }
    catch (Exception ex)
    {
        log.Error(ex);
    }
} 

venerdì 22 giugno 2012

Invio email da un app android

Come posso inviare un email da un app? Semplice, queste poche righe permettono di aprire il client predefinito e di inviare un email con Oggetto e Testo già predefinito.
Ricordarsi di inserire nel Manifest il permesso per l'accesso a internet!
Intent email = new Intent(Intent.ACTION_SEND);
//ACTION_SENTTO invece di ACTION_SEND per ottenere la lista dei client di posta elettronica
email.putExtra(Intent.EXTRA_TEXT, "Hello world!");  
email.putExtra(Intent.EXTRA_SUBJECT, "Greetings");      
email.setType("text/plain");
//email.setType("text/html"); //eventualmente
//email.setType("message/rfc822"); //eventualmente
startActivity(email);
E nel Manifest inserire:
<uses-permission android:name="android.permission.INTERNET"> </uses-permission>

giovedì 21 giugno 2012

Inserimento dati su db

Questo esempio rappresenta l'inserimento del valore "test" all'interno della tabella "tbl_example" tramite classi java su android.
....
DataDbHelper dh;
String someThing = "test";
try{
 dh = new DataDbHelper(Main.this);
 dh.insertExample(someThing);
 dh.closeDb();
}
catch(Exception e){
//something
}
....

public class DataDbHelper {
private SQLiteDatabase db;  
private SQLiteStatement insertStmt; 
private static final String TABLE_EXAMPLE = "tbl_example";
private static final String FIELD_CODE_ID = "id";
private static final String FIELD_EXAMPLE = "fld_example";
private static final String INSERT_SQL = "insert into "  
        + TABLE_EXAMPLE + " ("+FIELD_EXAMPLE+") values (?)"; 
 
 public DataDbHelper(Context context) {  
  this.context = context;  
  OpenHelper openHelper = new OpenHelper(this.context); 
  this.db = openHelper.getWritableDatabase(); 
 }

 public void insertExample(String someThing) {  
  try { 
   this.insertStmt = this.db.compileStatement(INSERT_SQL); 
   this.insertStmt.bindString(1, someThing);  
   this.insertStmt.executeInsert();
  }
  catch(Exception e){}
  finally {                  
   if (this.insertStmt !=null) this.insertStmt.close();    
  }
 }    

 private static class OpenHelper extends SQLiteOpenHelper {  
    OpenHelper(Context context) {  
       super(context, DATABASE_NAME, null, DATABASE_VERSION);  
    }  

    public void onCreate(SQLiteDatabase db) {  
       db.execSQL("CREATE TABLE " + TABLE_EXAMPLE+ 
         " ("+FIELD_CODE_ID+" INTEGER PRIMARY KEY, "+
         FIELD_EXAMPLE+" TEXT)");  
    }  

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
     try{
     //something
     }catch(SQLException e){
      //something
     }
    }  
 }  
}

mercoledì 20 giugno 2012

Generazione di messaggi personalizzati

In questo esempio riesco a generare un messaggio a video a seconda dell'errore che puo' generare il programma.
Ma non è detto che non lo possa fare per un messaggio di avvertimento o operazione effettuata con successo.
Creo la classe per generare l'errore.
public class Message
{
    public static string GetMessaggio(string chiave, params object[] args)
    {
     return string.Format((string)System.Web.HttpContext.GetGlobalResourceObject("MessageEN", chiave), args); //se ad esempio ho i messaggi in inglese
        //return string.Format((string)System.Web.HttpContext.GetGlobalResourceObject("MessageIT", chiave), args); //se ad esempio ho i messaggi in italiano
  //return string.Format((string)System.Web.HttpContext.GetGlobalResourceObject("MessageRU", chiave), args); //se ad esempio ho i messaggi in russo
    }
}
Inserisco il punto dove potebbe verificarsi l'errore.
try
{
   //...istruzioni
}
catch (Exception ex)
{
 lbMsg.Text = Message.GetMessaggio("INSERT_KO");
 //...istruzioni
}
Creo le variabili nel file "MessageEN" sotto la directory "App_GlobalResources" del progetto, settandole con i messaggi che voglio far apparire a video; in questo caso in inglese, ma posso
creare un altro file con messaggi in altra lingua mantenendo le variabili.
Nell'App_GlobalResources inserisco la voce "INSERT_KO" e attribuisco il messaggio.
...
<data name="INSERT_KO" xml:space="preserve">
 <value>The operation failed. Contact support.</value>
</data>
...

martedì 19 giugno 2012

Apertura di una form in un progetto client c#

L'esempio seguente propone di aprire la form "FrmNotes" in un progetto client, controllando che un'altra form dello stesso nome sia attiva.
Successivamente, se la nuova form "FrmNotes" si apre correttamente, il campo "TxtName" sarà valorizzato con il testo "Hello world!".
FrmNotes frmNotes = new FrmNotes();
foreach (Form frmTest in System.Windows.Forms.Application.OpenForms)
 if (frmTest is FrmNotes)
  return;
frmNotes.Show();
frmNotes.Controls["TxtName"].Text = "Hello world!";

Il "Save as..." in un progetto client in c#

Richiamando questo metodo, in un applicazione client in c#, è possibile aprire la famosa mascherina del "Save as..." e salvare l'oggetto che si sta eseguendo (documento txt in questo caso, musica...) con un nome differente su di un percorso predefinito.
public void SaveProjectAs(){
 string pathExample = "c:\\";
 string projectNameBefore = "Example";
 string projectNameAfter;
 try
 {
  SaveFileDialog saveFileDialog = new SaveFileDialog();
  saveFileDialog.Title = "Save project as...";
  saveFileDialog.DefaultExt = ".txt";
  saveFileDialog.Filter = "Project (*.txt)|*.txt";
  saveFileDialog.InitialDirectory = pathExample + "Projects";
  saveFileDialog.FileName = "Copy of " + projectNameBefore;
  if (saveFileDialog.ShowDialog() == DialogResult.OK)
   projectNameAfter = saveFileDialog.FileName;
  else
   return;
  File.Copy(projectNameBefore, projectNameAfter, true);
 }
 catch (Exception ex)
 {
  MessageBox.Show("Error: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
 }
}

lunedì 18 giugno 2012

Ordinamento di un xml per attributo

In questo esempio riesco a farmi restituire un xml con il nodo "COMPANY/EMPLOYEE" ordinato per attributo "user".
<COMPANY>
 <EMPLOYEE user="1" d1="1" d2="" d3="3"/>
 <EMPLOYEE user="2" d1="3" d2="" d3="4"/>
 <EMPLOYEE user="3" d1="2" d2="" d3="14"/>
</COMPANY>

...
XmlNodeReader newReader = Utility.SortXml(oXmlDocument, "COMPANY", "COMPANY/NAME", "@user");
...
public static XmlNodeReader SortXml(XmlDocument oXmlSort, string rootXml, string nodeSort, string attrSort)
{
 try
 {
  XmlDocument myXmlNew = new XmlDocument();
  MemoryStream memStream = new MemoryStream();
  oXmlSort.Save(memStream);
  memStream.Position = 0;
  XmlDocument doc = new XmlDocument();
  doc.Load(memStream);
  XPathNavigator nav = doc.CreateNavigator();
  XPathExpression exp = nav.Compile(nodeSort);
  XPathExpression sortExpr = nav.Compile(attrSort);
  exp.AddSort(sortExpr, new IntegerComparer());
  XmlElement rootNode = myXmlNew.CreateElement(rootXml);
  myXmlNew.AppendChild(rootNode);
  XPathNodeIterator links = nav.Select(exp);
  while (links.MoveNext())
  {
   XmlNode xmlNode = ((System.Xml.IHasXmlNode)links.Current).GetNode();
   rootNode.AppendChild(myXmlNew.ImportNode(xmlNode, true));
  }
  XmlNodeReader noderReader = new XmlNodeReader(myXmlNew);
  return noderReader;
 }
 catch (Exception ex)
 {
  throw new Exception(ex.Message);
 }
}

Lettura dati da database

L'esempio rappresenta una lettura dati da un database (ms access) e la scrittura del valore a video.
<%
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Provider = "Microsoft.Jet.OLEDB.4.0"
objConn.Open Server.MapPath("data/dbtest.mdb")
Set rs1 = Server.CreateObject("ADODB.Recordset")
rs1.open "select psw from tbl_login where name='" + nameLogin + "'", objConn
Do While Not rs1.EOF
    descRs = rs1("psw")
    Response.write descRs
    rs1.MoveNext
Loop
objConn.Close
Set objConn = Nothing
Set rs1 = Nothing    
%> 

Lettura dati con store-procedure

Con questo piccolo esempio di store-procedure vorrei che dalla tabella "tbl_course" venissero selezionati tutti i nomi passati in "inName" e fosse aggiornato il giorno d'esame "dayExam" con il valore 1.
In effetti potevo optare per una semplice "update...set" ma la reale procedura che ho utilizzato aveva al suo interno più parametri in input e la query era pìù complessa in ambiente Oracle.
CREATE OR REPLACE PROCEDURE OWN_NAME.proc_name(
    inName IN varchar2) 
is
selectCursor    sys_refcursor;
rowToUpdate     own_name.tbl_course%ROWTYPE;
begin
 open selectCursor for
  SELECT own_name.tbl_course.*
  FROM own_name.tbl_course
  WHERE tbl_course.inName = proc_name.inName;
 LOOP
  fetch selectCursor into rowToUpdate;
  exit when selectCursor%NOTFOUND;
   update  own_name.tbl_course set dayExam = 1
   where   own_name.tbl_course.id = rowToUpdate.id;
 END LOOP;
 close selectCursor;
end;

Scrittura di una stringa su file

In questo esempio la scrittura di una stringa su file avviene con valore 8, ossia per scrittura del valore alla fine del file. Ma il valore può anche essere 2 per sovrascrittura dell'intero contenuto.
<%
dim oFs, oTextFile
Set oFs = server.createobject("Scripting.FileSystemObject")
Set oTextFile = oFs.OpenTextFile("C:\Test.txt", 8, True)
oTextFile.Write "Hello world!"
oTextFile.Close
Set oTextFile = nothing
Set oFS = nothing
%>

sabato 16 giugno 2012

Inserimento dati in un database ms access da una pagina asp

Come posso inserire alcuni valori di una pagina web in un database tramite file asp?
In questo esempio che si puo' includere in file asp ottengo informazioni da campi testo in una pagina web, creo una connessione al database e inserisco i dati nel db, infine chiudo la connessione.
<%
'ottengo i dati da form
descr = request.form("description")
amount = request.form("amount")
datains = request.form("datains")
user = request.form("user")

'creo la connessione con il giusto provider
Set objConn = Server.CreateObject("ADODB.Connection")
objConn.Provider="Microsoft.Jet.OLEDB.4.0"
objConn.Open Server.MapPath("data/dbtest.mdb")

'inserisco i dati
objConn.execute("INSERT INTO tbl_example (description, amount, datains, userid) values ('" & descr & "'," & amount & ",'" & datains & "','" & user & "')")

'chiudo la connessione
objConn.Close
Set objConn = Nothing
%>

Creare un xml e validarlo con xsd, poi scriverlo su file oppure su una stringa

Si puo' creare un xml in java, validarlo e scrivere il tutto su di un file o una stringa?
Si, eccone un esempio che si può integrare in un metodo (in questo caso ritornerà un tipo String).
Prima creo la root e i nodi del xml, procedo con la sua validazione tramite xsd e scrivo il tutto in un file.
String stringXml = "";

try{
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    DocumentBuilder parser = factory.newDocumentBuilder();
  
    Document doc = parser.newDocument();
    Element childElement = null;
   
    Element root = doc.createElementNS("http://blablabla", "ns1:example");
    doc.appendChild(root);
    root.setAttribute("xmlns", "http://...");
    root.setAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance");
    root.setAttribute("xsi:schemaLocation", "http://blablabla C:\\xsd\\example.xsd");
   
    childElement = doc.createElement("destinazione");
            childElement.setAttribute("ufficio","blablabla");
    root.appendChild(childElement);
   
    //... eventuali altri childElement
   
    /* validazione xml con xsd */
    SchemaFactory factorySchema =
        SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
    File schemaLocation = new File("c:\\xsd\\example.xsd");
    Schema schema = factorySchema.newSchema(schemaLocation);
    Validator validator = schema.newValidator();
    DOMSource source = new DOMSource(doc);
   
    validator.validate(source);
    TransformerFactory transformerFactory = TransformerFactory.newInstance();
    Transformer transformer = transformerFactory.newTransformer();
    transformer.setOutputProperty(OutputKeys.INDENT,"yes");
   
    /* scrive l'xml sul file */
    File fileXml = new File("c:\\test\\test.xml");
    StreamResult resultFile =  new StreamResult(fileXml);
    transformer.transform(source, resultFile);
   
    /* oppure scrive sulla stringa */
    StringWriter writer = new StringWriter();
    StreamResult result = new StreamResult(writer);
    transformer.transform(source, result);
    stringXml = writer.toString();
   

}catch(Exception e){
  throw new Exception(e.getMessage());
}

return stringXml;

Query varie in sql: concatenazione, group by e inner join

Riporto alcune query che ho utilizzato in vari progetti collegandomi ad un database Oracle.

1 - concatenazione di campi sql
select ID_TIPO_PRATICA||'@'||ID_SERVIZIO||','||TIPO_DOC,DESCRIZIONE 
from TBL_EXAMPLE order by 2

2 - Numero di studenti maschi e femmine
SELECT Sesso, COUNT(*)
FROM Studente
GROUP BY Sesso

3 - Città in cui abitano almeno 3 studenti e il numero di studenti relativo
SELECT Città, COUNT(*)
FROM Studente
GROUP BY Città
HAVING COUNT(*)>=3

4 - Se prendo i campi da due tabelle e ho l'id uguale allora:
SELECT     dbo.Customers.CompanyName, dbo.Employees.FirstName
FROM         dbo.Customers INNER JOIN
dbo.Employees ON dbo.Customers.id = dbo.Employees.id

giovedì 14 giugno 2012

Testi utilizzati per la certificazione Linux LPI 1° livello

Oltre a numerose informazioni gratuite per lo studio di linux che si possono trovare sul web, seminari, scuola, università, per passare gli esami 101 e 102 della certificazione LPI ho acquistato nel 2010 i seguenti testi in lingua inglese specifici per questo tipo di esami.
LPI Linux Certification in a Nutshell 3rd Edition
Author: Adam Haeder, Stephen Addison Schneiter, Bruno Gomes Pessanha, James Stanger
ISBN:978-0-596-80487-9

Linux Professional Institute Certification Exams 101 and 102
Ross Brunson 
ISBN-13: 978-0789731272

LPIC-1: Linux Professional Institute Certification Study Guide: (Exams 101 and 102), 2nd Edition
Roderick W. Smith
ISBN: 978-0-470-40483-6

Leggere e scrivere da file anche con caratteri cirillici su app android

In una mia app volevo leggere o inserire dati utilizzando anche il carattere cirillico (caratteri russi per intenderci).
Ahihahihahi quanto ho penato, ma alla fine è andata.
Di seguito lascio gli script che ho utilizzato:
Codice per la lettura:

StringBuilder text = new StringBuilder() ;
try { 
 FileInputStream fis = openFileInput("example.txt");
 BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
 String line="";    
 while ((line = br.readLine()) != null) {  
  text.append(line);   
  text.append('\n');    
 }
 br.close();
} catch (FileNotFoundException e) {
 //...
} 
catch (IOException e) {
 //...
} 
 
Codice per la scrittura:
try{
 String sdCard = Environment.getExternalStorageDirectory().toString();
 File file = new File(sdCard, "example.txt");
 FileOutputStream fosCard;

 if(file.exists())
  fosCard = new FileOutputStream(file,false);
 else
  fosCard = new FileOutputStream(file);
 Writer out = new BufferedWriter(new OutputStreamWriter(fosCard, "UTF-8"));
 List<? extends Map<String,?>> listDataCard = createItems(idTypeBook);
 for (Map<String, ?> map : listDataCard) {
  Book book = createItemBook((String)map.get(ID_KEY));
  out.append(createItemBookForFile(book).toString());//scrittura sul file
 }
 out.flush();
 out.close();
}
catch (FileNotFoundException e) {
 //...
}
catch (java.io.IOException e) {
 //...
} 

Inserimento di un pulsante PayPal in un app android.

Dopo aver scaricato dal sito PayPal il pacchetto jar da includere nel progetto e aver configurato correttamente i parametri di PayPal nel manifest,
ho creato il pulsante per la "donazione" all'interno dell'activity.
Di seguito il codice che ho integrato nell'activity:

public class Infopaypal extends Activity {

 public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       
        LinearLayout layoutSimplePayment = new LinearLayout(this);
        layoutSimplePayment.setLayoutParams(new LayoutParams(
                        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
        layoutSimplePayment.setOrientation(LinearLayout.VERTICAL);
       
        PackageInfo pInfo = null;
  try {
   pInfo = getPackageManager().getPackageInfo(getPackageName(), PackageManager.GET_META_DATA);
  } catch (NameNotFoundException e) {} 
        try{
   PayPal pp = PayPal.initWithAppID(this, "APP-00000000000000000",
       PayPal.ENV_LIVE);//ottenere id da paypal

   CheckoutButton launchSimplePayment = pp.getCheckoutButton(this,
       PayPal.BUTTON_194x37, CheckoutButton.TEXT_DONATE);
    
   launchSimplePayment.setOnClickListener(new OnClickListener() {
    public void onClick(View view) {
     PayPalPayment payment = new PayPalPayment();
     payment.setSubtotal(new BigDecimal("1.00"));
     payment.setCurrencyType("EUR");
     payment.setRecipient("blablabla@blabla.it");//cambiare in propria email
     payment.setPaymentType(PayPal.PAYMENT_TYPE_GOODS);
     Intent checkoutIntent = PayPal.getInstance().checkout(payment, Infopaypal.this);
     startActivityForResult(checkoutIntent, 1);
    }
   });
   layoutSimplePayment.addView(valuePPal);
   layoutSimplePayment.addView(launchSimplePayment);
        }catch (Exception e) {} 
       
        setContentView(layoutSimplePayment);
 }
 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
  String message = "";

  switch(resultCode) {
       case Activity.RESULT_OK:
           //Il pagamento è stato effettuato
           message = "Operation ok";
           break;
       case Activity.RESULT_CANCELED:
           // Il pagamento è stato cancellato dall’utente
        message = "Operation cancelled";
           break;
       case PayPalActivity.RESULT_FAILURE:
           // Il pagamento non è stato effettuato a causa di errore
           String errorMessage = data.getStringExtra(PayPalActivity.EXTRA_ERROR_MESSAGE);
           message = errorMessage;
    }
    Toast.makeText(Infopaypal.this, message, Toast.LENGTH_SHORT).show();
 } }

Caricamento di una guida in formato html

Una guida all'interno di un app android la si puo' fare come vuole, io ho scelto di farla con file formato html.
Sempre nella speranza che possano essere utili queste poche righe di codice, posto qui il codice di esempio specifico per guide fatte in 3 lingue:

public class Help extends Activity {
 private WebView browser;

 @Override
 protected void onCreate(Bundle icicle) {
  super.onCreate(icicle);
  setContentView(R.layout.browserhelp);
  browser=(WebView)findViewById(R.id.webkit);
  browser.setWebViewClient(new Callback());
  loadHelp();
 }

 private void loadHelp() {
  // la lingua di default in questo caso ricade sull'inglese
  Locale locale = Locale.getDefault();
  if(locale.getLanguage().equals(Locale.ITALIAN.getLanguage()))
   browser.loadUrl("file:///android_asset/guide-it.html");
  else if(locale.getLanguage().equals("ru"))
   browser.loadUrl("file:///android_asset/guide-ru.html");
  else
   browser.loadUrl("file:///android_asset/guide-en.html");
 }
 private class Callback extends WebViewClient {
  public boolean shouldOverrideUrlLoading(WebView view, String url) {
   loadHelp();
   return(true);
  }
 }
}

Problemino griglia c# e ms excel

Lavorando su di un progetto abbastanza complesso mi sono scrontrato con un problemino sulla visualizzazione di griglie di dati su di un foglio MS Excel.
Dovevo inserire assolutamente questo primo metodo, altrimenti non andava proprio!
Ambiente: MS VS 2005 .net 2.0 aspx
/// <summary>
/// Questo metodo deve essere presente per un bug del framework .net 2.0
/// </summary>
/// <param name="control"></param>
public override void VerifyRenderingInServerForm(Control control)
{
return;
}

Poi ho tranquillamente popolato il foglio excel con la griglia di dati.
protected void Export_Click(object sender, EventArgs e)
{
try
{
Button button = (Button)sender;
HiddenField fieldId = (HiddenField)button.Parent.Parent.FindControl("Field_Id");

string yearMonth = fieldId.Value;
int lastDayMonth = DateTime.DaysInMonth(Convert.ToInt16(yearMonth.Substring(0, 4)), Convert.ToInt16(yearMonth.Substring(4, 2)));
StringWriter stringWrite = new StringWriter();
HtmlTextWriter htmlTextWriter = new HtmlTextWriter(stringWrite);

htmlTextWriter.WriteLine("TITOLO DI ESEMPIO");
htmlTextWriter.WriteBreak();
htmlTextWriter.WriteBreak();
htmlTextWriter.WriteFullBeginTag("table border='1'");
htmlTextWriter.WriteFullBeginTag("tr");
htmlTextWriter.WriteFullBeginTag("td bgcolor='#BFCEEE' align='left'");
htmlTextWriter.WriteLine(" " + ConvertyearMonth(yearMonth));
htmlTextWriter.WriteEndTag("td");
htmlTextWriter.WriteEndTag("tr");
htmlTextWriter.WriteFullBeginTag("tr");
htmlTextWriter.WriteFullBeginTag("td");

GridView gridView = (GridView)button.Parent.Parent.FindControl("GridView1");
gridView.HeaderStyle.ForeColor = Color.Black;
gridView.RowStyle.ForeColor = Color.Black;
gridView.BorderWidth = Unit.Pixel(1);
int numRows = gridView.Rows.Count;

for (int i = 1; i < 32; i++)
{
if (i <= lastDayMonth)
{
if (Utility.Holiday(yearMonth.Substring(0, 4), yearMonth.Substring(4, 2), Convert.ToString(i)))
{
gridView.Columns[i+1 ].HeaderStyle.BackColor = Color.FromArgb(255, 119, 112);
gridView.Columns[i+1 ].HeaderStyle.ForeColor = Color.Black;
for (int j = 0; j < numRows; j++)
{
gridView.Rows[j].Cells[i+1 ].BackColor = Color.FromArgb(255, 119, 112);
}
}
}
}

gridView.RenderControl(htmlTextWriter);

htmlTextWriter.WriteEndTag("td");
htmlTextWriter.WriteEndTag("tr");
htmlTextWriter.WriteEndTag("table");

htmlTextWriter.WriteBreak();
htmlTextWriter.WriteFullBeginTag("table border='1'");
htmlTextWriter.WriteFullBeginTag("tr");
htmlTextWriter.WriteFullBeginTag("td");

GridView gridView2 = (GridView)button.Parent.Parent.FindControl("GridView2");
gridView.HeaderStyle.ForeColor = Color.Black;
gridView2.HeaderStyle.Height = Unit.Pixel(0);
gridView2.RowStyle.ForeColor = Color.Black;
gridView2.Width = Unit.Pixel(300);
gridView2.BorderWidth = Unit.Pixel(1);
gridView2.RenderControl(htmlTextWriter);

htmlTextWriter.WriteEndTag("td");
htmlTextWriter.WriteEndTag("tr");
htmlTextWriter.WriteEndTag("table");

HttpResponse response = HttpContext.Current.Response;
response.Clear();
response.Charset = "";
response.Buffer = true;
response.AddHeader("content-disposition", "attachment; filename=esempio.xls");
response.ContentType = "application/vnd.ms-excel";
response.Write(stringWrite.ToString());
response.End();
}
catch (Exception ex)
{
log.Error(ex);
}

}

Verifica di un giorno festivo in c#

Spero possa servire questo piccolo metodo per verificare se un giorno dell'anno è festivo oppure no; ovviamente si possono aggiungere altre festività, qui sono riportate le più conosciute (sabato e domenica compresi).
Ambiente MS VS 2005 .net 2.0 aspx

/// <summary>
/// Verifica se il giorno della data è un festivo
/// </summary>
/// <param name="anno">Anno a 4 cifre</param>
/// <param name="mese">Mese a 2 cifre</param>
/// <param name="giorno">Giorno a 2 cifre</param>
/// <returns>Vero o Falso</returns>
public bool Holiday(int anno, int mese, int giorno)
{
DateTime dt;
try
{
dt = new DateTime(anno, mese, giorno);
if (DayOfWeek.Saturday.Equals(dt.DayOfWeek))
return true;

if (DayOfWeek.Sunday.Equals(dt.DayOfWeek))
return true;

/*capodanno*/
if (giorno == 1 && mese == 1)
return true;

/*6 gennaio epifania*/
if (giorno == 6 && mese == 1)
return true;

/*25 aprile*/
if (giorno == 25 && mese == 4)
return true;

/*1 maggio*/
if (giorno == 1 && mese == 5)
return true;

/*29 giugno s.pietro e paolo*/
if (giorno == 29 && mese == 6)
return true;

/*15 agosto*/
if (giorno == 15 && mese == 8)
return true;

/*2 giugno*/
if (giorno == 2 && mese == 6)
return true;

/*2 novembre*/
if (giorno == 2 && mese == 11)
return true;

/*8 dicembre*/
if (giorno == 8 && mese == 12)
return true;

/*natale*/
if (giorno == 25 && mese == 12)
return true;

/*s stefano*/
if (giorno == 26 && mese == 12)
return true;

return false;
}
catch (Exception ex)
{
log.Error(ex);
}
}

mercoledì 13 giugno 2012

Caricamento di un oggetto nel browser

Un giorno mi sono imbattuto nel problema di visualizzare nel browser alcuni file con diverse estensioni.
Questi content-type di ritorno li ho sicuramente provati e vanno bene.
Ambiente MS VS 2005 .net 2.0 aspx IE
/// <summary>
/// extensionFile a 4 caratteri.
/// </summary>
/// <param name="extensionFile"></param>
/// <returns></returns>
public static string LoadContentType(string extensionFile)
{
 string contentType = "";
 switch (extensionFile)
 {           
  case ".vsd":
   contentType = "application/vnd.visio";
   break;
  case ".asf":
   contentType = "video/x-ms-asf";
   break;
  case ".txt":
   contentType = "text/plain";
   break;
  case ".avi":
   contentType = "video/avi";
   break;
  case ".doc":
   contentType = "application/msword";
   break;
  case ".zip":
   contentType = "application/zip";
   break;
  case ".xls":
   contentType = "application/vnd.ms-excel";
   break;
  case ".gif":
   contentType = "image/gif";
   break;
  case "jpeg":
   contentType = "image/jpeg";
   break;
  case ".jpg":
   contentType = "image/jpeg";
   break;
  case ".wav":
   contentType = "audio/wav";
   break;
  case ".mp3":
   contentType = "audio/mpeg3";
   break;
  case "mpeg":
   contentType = "video/mpeg";
   break;
  case ".rtf":
   contentType = "application/rtf";
   break;
  case "html":
   contentType = "text/html";
   break;
  case ".asp":
   contentType = "text/asp";
   break;
  case ".pdf":
   contentType = "application/pdf";
   break;
  case ".ppt":
   contentType = "application/vnd.ms-powerpoint";
   break;
  case ".mpp":
   contentType = "application/vnd.ms-project";
   break;
  default:
   contentType = "application/octet-stream";
   break;
 }
 return contentType;
}

lunedì 11 giugno 2012

App Android

Ho sviluppato alcune applicazioni per il sistema operativo Android, spaziando da semplici giochi ad applicazioni utili sia nel campo dell'informatica che delle lingue.
Sono presenti sul market dal 2010 e alcune sono gratuite altre a pagamento; le prime in alcuni casi non sono altro che versioni demo di quelle a pagamento.

E' possibile trovarle anche su altri market, ma lascio il link al mio nome sul market ufficiale di Android che le raggruppa in una lista completa: mie app su Android Market

Microstock per vendita foto online

Ultimamente ho deciso di pubblicare alcune delle foto scattate in giro per il mondo su alcuni dei più gettonati microstock internazionali.
Il mio livello è amatoriale, gli scatti che propongo sono a 360 gradi e non hanno quindi un unico soggetto.

Perché lo sto facendo? Mi piace, competo con l’accettazione o meno degli scatti da parte del team di professionisti dei microstock, e se riesco ad averne un profitto perché no.
Vuol dire che posso continuare, posso migliorare, perché a qualcuno piace o ritiene utile il mio lavoro.

Dreamstime.com, questo è il link al mio profilo: mie foto su Dreamstime

Buona visione!