lunedì 23 maggio 2016

Eseguire un file Python

Sia su Linux che su Windows è possibile eseguire un file scritto in Python con estensione ".py"
Il link di riferimento del sito ufficiale è http://www.python.org ma posso elencare alcuni semplici step.
Come primo step bisogna installare Python (vedere su http://www.python.org);
il secondo step, in Windows, è posizionarsi tramite command line sulla directory di Python (ad esempio c:\Python27) e digitare:
python nomefile.py
# oppure
python "c:\directory\nomefile.py"
# oppure andare sulla directory del nomefile.py e digitare
c:\Python27\python.exe nomefile.py
Tutto qui. Poi ovviamente si possono aggiungere opzioni a questo comando a seconda delle richieste del programma scritto in Python.
In ambiente Linux è molto più semplice specie nelle ultime versioni perchè lo hanno già installato, altrimenti per una vecchia distro bisognerà procedere all'installazione.
L'esecuzione è altrettanto semplice; andare sul percorso del nomefile.py e digitare:
python nomefile.py

venerdì 13 maggio 2016

Cercare una parola o espressione all'interno di un'altra espressione in SQL

In Microsoft SQL Server è possibile trovare una parola o un'espressione all'interno di un'altra espressione;
CHARINDEX(...,...,...) funzione utile ad esempio per eseguire aggiornamenti (update) o farsi restituire dei dati (select) a partire da alcuni caratteri non conoscendo l'intera parola.

Ad esempio, immaginando una tabella autori con alcuni campi (nome, cognome, città di residenza...) si possono modificare i nomi di alcuni elementi partendo da alcune parole.

-- Cambiare il nome in Alberto a tutti gli elementi con cognome che comprende
-- la parola Rossi e che non abbiano la residenza in una città con all'interno la parola Milano, esempi:

-- 'Mario Rossini', diventa, Alberto Rossini
-- 'Luca Marossi', diventa, Luca Marossi
UPDATE tab_autori SET nome='Alberto' where CHARINDEX('Rossi',cognome,1)>0

-- 'Mario Di Paoli' che vive a 'Romano d'Ezzelino' avrà il nome Marco
UPDATE tab_autori SET nome='Marco' where CHARINDEX('Paoli',cognome,1)>0 
 and CHARINDEX('Roma',citta_residenza,1)>0

giovedì 5 maggio 2016

WebService gratuiti per valute e Bitcoin con c#

Ero alla ricerca di alcuni WebService o API gratuite (difficili a trovarli, spesso 'api' a pagamento oppure previa registrazione) con cadenza giornaliera, per avere una tabella delle valute del database sempre aggiornata.
Quindi dovevo trovare importi in sterline, yen, dollari e soprattutto Bitcoin (avere una stima) pronti ad essere convertiti in Euro.
L'esempio seguente mostra come aggiornare le valute in una tabella (Tab_Valuta) calcolando poi il corrispettivo in Euro.
I link scelti per le valute e Bitcoin sono: http://www.ecb.europa.eu e https://cex.io
Navigando su questi siti si possono vedere meglio le modalità di richiamo dei vari servizi.
Altri link utili (ma bisogna registrarsi per lavorare con le API) sono https://it.bitstamp.net/ e https://btc-e.com/
N.B. Ho portato tutto in tipo stringa perchè possono esserci problemi con i decimali e quindi con il tipo internazionale delle valute scelto sul server.

class Program
{
static string dollar = "0";
static string gbp = "0";
static string yen = "0";
static string btc = "0";

static void Main(string[] args)
{
Conversion();
UpdateCurrency();
}

private static void UpdateCurrency()
{
  string SQL = "";
  if(Convert.ToDouble(dollaro)>0)
  SQL += "update Tab_Valuta set Cambio=cast('" + dollar + "' as numeric(18,5)) where id_valuta=1; ";

  if (Convert.ToDouble(sterlina) > 0)
  SQL += "update Tab_Valuta set Cambio=cast('" + gbp + "' as numeric(18,5)) where id_valuta=3; ";

  if (Convert.ToDouble(yen) > 0)
  SQL += "update Tab_Valuta set Cambio=cast('" + yen + "' as numeric(18,5)) where id_valuta=4;";

  if (Convert.ToDouble(btc) > 0)
  SQL += "update Tab_Valuta set Cambio=cast('" + btc + "' as numeric(18,5)) where id_valuta=5;";

  SqlConnection con = new SqlConnection();
  try
  {
    string dbConString = ConfigurationManager.ConnectionStrings["ConnectionDB"].ConnectionString;

    con.ConnectionString = dbConString;
    con.Open();
    SqlCommand cmd = new SqlCommand();
    cmd.Connection = con;
    cmd.CommandType = CommandType.Text;
    cmd.CommandText = SQL;
    cmd.ExecuteNonQuery();
  }
  catch (Exception ex)
  {
  }
  finally
  {
  con.Close();
  }
}

private static void Conversion()
{
XmlDocument doc = new XmlDocument();
try
{
  doc.Load("http://www.ecb.europa.eu/stats/eurofxref/eurofxref-daily.xml");

  //normal currency
  foreach (XmlNode node in doc.DocumentElement.ChildNodes)
  {
    foreach (XmlNode locNode in node)
    {
      if (locNode.Name.Equals("Cube"))
      {
        foreach (XmlNode locNode2 in locNode)
        {
            if (locNode2.Attributes["currency"].Value == "USD")
            {
            dollar = locNode2.Attributes["rate"].Value.Replace(",", ".");
            }
            if (locNode2.Attributes["currency"].Value == "GBP")
            {
            gbp = locNode2.Attributes["rate"].Value.Replace(",", ".");
            }
            if (locNode2.Attributes["currency"].Value == "JPY")
            {
            yen = locNode2.Attributes["rate"].Value.Replace(",", ".");
            }
        }
      }
    }
  }
}
catch (Exception ex)
{}

//Bitcoin
using (WebClient wc = new WebClient())
{
var json = wc.DownloadString("https://cex.io/api/last_price/BTC/EUR");
Price m = JsonConvert.DeserializeObject(json);
btc = Convert.ToString( 1 / Convert.ToDouble(m.LPrice));
}
}
}
class Price
{
[JsonProperty("lprice")]
public String LPrice { get; set; }
}

domenica 1 maggio 2016

Leggere un file di log al contrario in c#

In un'applicazione web in ambiente .Net è possibile leggere al contrario un file di log in formato testo (alimentato in modalità 'append'), ossia dalla fine all'inizio.
Può capitare che il file venga utilizzato da un altro processo, in questo esempio copio il file in un altro dello stesso tipo e lo apro per leggerlo.

//Create .aspx file; this is code-behind .cs

protected void Page_Load(object sender, EventArgs e)
{
 strLog = new StringBuilder("");
 try
 {
  //directory log on webapp
  string pathLogOriginale = Server.MapPath("~/logs/log.txt");

  //If the file used by another process, I copy the file and then I read it
  File.Copy(pathLogOriginale, Server.MapPath("~/logs/log_copy.txt"), true);
  string pathLog = Server.MapPath("~/logs/log_copy.txt");

  //example only 100 rows
  foreach (var line in File.ReadLines(pathLog).Reverse().Take(100)) //only the first 100 rows
 	strLog.Append(line+"<br><br>");

  /*
   * use string strLog in .aspx file in label object or text object
   */
 } 
 catch (Exception ex)
 {
 }
}