lunedì 25 luglio 2016

Android and iOS source code on sellmyapp.com

Oltre 4000 visite per le mie app in vendita su www.sellmyapp.com
Ecco il portfolio da dove poter scaricare il codice sorgente relativo a ciascuna applicazione sia su Android che iOS: https://www.sellmyapp.com/author/mg1975/

venerdì 10 giugno 2016

Aggiornamento portfolio su dreamstime.com

Aggiornamento del mio portfolio su dreamstime.com: sono state accettate altre foto scattate a Praga nel 2016, eccone alcuni esempi:







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)
 {
 }
}

martedì 26 aprile 2016

Whois API e Free WebService

Ero alla ricerca di api gratuite da utilizzare in un progetto web in ambiente Microsoft .Net e ho trovato questi domini che ne offrono a limitate condizioni.
Praticamente a partire da un url si ottengono informazioni come il proprietario, la scadenza del sito, la localizzazione del server ed altre ancora.
Quindi con un po' di c# e richiamando alcuni web service sono riuscito ad inserire facilmente a catturare questi tipi di dati che normalmente vengono restituiti in formato xml.
Ecco alcuni esempi:
- dal sito www.checkdomain.com utilizzo http://www.checkdomain.com/cgi-bin/checkdomain.pl?domain=

- dal sito www.uwhois.com integro in c# con:
string whoisServer="www.uwhois.com";
TcpClient tcpClinetWhois = new TcpClient(whoisServer, 43);
NetworkStream networkStreamWhois = tcpClinetWhois.GetStream();
BufferedStream bufferedStreamWhois = new BufferedStream(networkStreamWhois);
StreamWriter streamWriter = new StreamWriter(bufferedStreamWhois);
streamWriter.WriteLine(url);
streamWriter.Flush();
StreamReader streamReaderReceive = new StreamReader(bufferedStreamWhois);
while (!streamReaderReceive.EndOfStream)
{
//...
}
- dal sito who.godaddy.com utilizzo https://who.godaddy.com/whoisstd.aspx?domain=
ad esempio:
string whoisServer="who.godaddy.com";
Uri absoluteUri = new Uri(whoisServer + url);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(absoluteUri);
- dal sito www.whoisxmlapi.com utilizzo https://www.whoisxmlapi.com/whois-api-doc.php (navigando nel sito è possibile trovare codice per linguaggio c#)

lunedì 18 aprile 2016

Test sicurezza sito web e OWASP

Navigando alla ricerca di soluzioni o best-practice per siti web in ambiente .Net oppure Java, mi sono imbattuto su questo link molto interessante.
Link:http://webresourcesdepot.com/10-free-web-application-security-testing-tools
Questi tools come Netsparker (demo gratutita e pagamento), Watcher (gratuito) permettono di individuare bug o problemi di sicurezza ampiamente descritti e dettagliati da OWASP (Open Web Application Security Project).
I tools descritti vanno bene anche se i siti da analizzare si trovano su rete intranet.

giovedì 31 marzo 2016

GeoChart con c# e Google

In un progetto in ambiente .Net sono facilmente integrabili alcune rappresentazioni geografiche offerte dal servizio Google GeoChart.
Ecco un esempio con linguaggio c# dove vengono rappresentati dei valori per ciascuna nazione in un contesto mondiale.
Questo è il link al servizio offerto da Google: https://developers.google.com/chart/interactive/docs/gallery/geochart#displaying-proportional-markers
Con poche righe di codice html si può scegliere una rappresentazione per Paese, per tutto il mondo oppure per area (ad esempio europea).

//nel sorgente javascript in html
var data = google.visualization.arrayToDataTable( <%=dataChartCountry%>);

//in c#
public string dataChartCountry= "";

int countObj=10;
int countSeq=0;
dataChartCountry = "[['Country', 'Num'],";

foreach (CountryNum countryNum in listCountry)
{
 ++countSeq;
 if (countSeq == countObj)
  dataChartCountry += "['" + countryNum.x + "'," + countryNum.y + "]";
 else
  dataChartCountry += "['" + countryNum.x + "'," + countryNum.y + "],";
}
dataChartCountry += "]";

lunedì 25 gennaio 2016

Nuove foto su dreamstime.com

Continuano le approvazioni su dreamstime.com delle mie foto scattate a Roma e non solo.
Eccone una:
Particular of statues of famaous Trevi Fountain in Rome, Italy http://www.dreamstime.com/stock-photo-statues-trevi-fountain-rome-particular-famaous-italy-image65346196 #ancient #antique #architectural