mercoledì 1 ottobre 2014

Problema con la stampa dei grafici tramite Chart del framework .Net

A volte non è possibile stampare con il browser Internet Explorer o Chrome o un altro ancora, una pagina web con dei grafici fatti con il componente Chart del framework .Net perchè alcune proprietà del componente non sono state settate correttamente in fase di sviluppo.
La proprietà da modificare è la "ImageStorageMode" portandola così ad utilizzare un file fisico.
Successivamente verrà settata la proprietà "ImageLocation" con il percorso del file (in questo caso si è creata una directory sul sito e si è dato un nome fittizio all'immagine che ogni volta verrà sovrascritta, volendo dal sito Microsoft è possible utilizzare un asintassi per poter scrivere ogni volta l'immagine in maniera sequenziale).

<asp:CHART id="Chart1"  runat="server" Palette="BrightPastel" BackColor="#D3DFF0" Height="580px" 
Width="560px" BorderlineDashStyle="Solid" BackGradientStyle="TopBottom" BorderWidth="2" ImageStorageMode="UseImageLocation" ImageLocation="~/TempImages/ChartW"
BorderColor="26, 59, 105" IsSoftShadows="False" >

venerdì 19 settembre 2014

Ricerca con Bing Api e c# da una pagina aspx di Microsoft .Net

Con queste semplice esempio è possibile utilizzare le Bing Api tramite c# ed eseguire una ricerca con Bing.
Si può creare ad esempio un pulsante che punti sul metodo e restituisca i risultati su di una listBox e una textBox per inserire la ricerca.
Per curiosità ho inserito nel webConfig l'inidirizzo e la chiave per connettersi a Bing, ma ciò non toglie che si può facilmente inserire nel sorgente c#.
Attualmente per utilizzare le Api di Bing bisogna creare un account Azure (disponibile anche gratuitamente) e farsi dare la chiave di accesso.

Nel file Web.Config inserire le due righe:
<add key="BingKey" value="1231231231231231231321231231231231231231231"/>
<add key="BingUrl" value="https://api.datamarket.azure.com/Bing/Search/"/>

Metodo da richiamare in c#
// Example for only English language research; null= all languages
BingSearch("rent car europe", "en-GB"); 

Codice di esempio da inserire per c#
string bingKey = ConfigurationManager.AppSettings["BingKey"].ToString();
string bingUrl = ConfigurationManager.AppSettings["BingUrl"].ToString();

public void BingSearch(string search_expression, string lang)
{
 try{
  var bingContainer = new Bing.BingSearchContainer(new Uri(bingUrl));
  var accountKey = bingKey;
  bingContainer.Credentials = new NetworkCredential(accountKey, accountKey);
 
  var searchQuery = bingContainer.Web(search_expression, null, null, lang.Equals("")?null:lang, null, null, null, null);
  var varResults = searchQuery.Execute();

  foreach (var result in varResults)
  {
   ....
  }
 }
 catch (Exception ex)
 {}
}

giovedì 11 settembre 2014

Nuovi caricamenti di foto su Dreamstime.com

Nei giorni scorsi ho effettuato altri caricamenti di foto sul miscrostock Dreamstime.com e molti hanno avuto un esito positivo nell'approvazione.
Sale dunque il rapporto approvazione/upload di un classico "non professionista" in fotografia.
Qui il mio portfolio.
New photos on my Dreamstime.com portfolio here.

venerdì 5 settembre 2014

Ottenere una pagina web o link con .Net c#

E' possibile ottenere una pagina web in diversi modi con gli elementi a disposizione del framework .Net di Microsoft.
In questi due esempi sono stati utilizzati linguaggio c#, la classe WebClient e la classe HttpWebRequest.
Nel primo esempio la classe WebClient con un semplice metodo ricerca il codice html a partire da un Url.
Nel secondo esempio ho creato un metodo e ho utilizzato la classe HttpWebRequest per la ricerca del codice html sempre a partire da un url/sito utilizzando un user agent di un browser.
Questo secondo esempio è stato creato perchè a volte alcuni siti inibiscono l'accesso e quindi la "cattura" del codice se si proviene con degli applicativi software o "Robot", ma lasciano entrare solamente "visitatori umani".
Viene in aiuto la classe HttpWebRequest con il parametro UserAgent da settare cosicchè l'applicativo potrà "diventare" un "visitatore umano" per questi tipi di siti.
Ma a volte la "cattura" del codice può impiegare più di un tempo previsto standard, per cui si dovranno impostare i vari timeout di risposta.

1 esempio:
string htmlCode="";
string strUrlNew = "http://www.example.com";

using (WebClient client = new WebClient())
{
 htmlCode = client.DownloadString(strUrlNew);
}

2 esempio:
    
private string DownloadContentSite(string url)
{
 string htmlCode = "";
 Byte[] bytes;
 Uri absoluteUri = new Uri(url.Trim());
 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(absoluteUri);
 webRequest.Method = "GET";
 webRequest.AllowAutoRedirect = false;
 webRequest.Timeout = 60000;
 webRequest.ReadWriteTimeout = 60000;
 webRequest.Accept = "*/*";
 webRequest.UserAgent = "Mozilla/5.0 (Windows; U; MSIE 9.0; Windows NT 9.0; en-US)";
 using (WebResponse webResponse = webRequest.GetResponse())
 {
  string contentType = webResponse.ContentType;
  using (Stream stream = webResponse.GetResponseStream())
  {
   using (MemoryStream memoryStream = new MemoryStream())
   {
    Byte[] buffer = new Byte[0x1000];
    Int32 bytesRead;
    while ((bytesRead = stream.Read(buffer, 0, buffer.Length)) > 0)
    {
     memoryStream.Write(buffer, 0, bytesRead);
    }
    bytes = memoryStream.ToArray();
   }
  }
 }

 htmlCode = System.Text.Encoding.UTF8.GetString(bytes);

 return htmlCode;
}

domenica 31 agosto 2014

Ottenere unici item da una lista tipizzata in c#

A volte può capitare di avere una lista tipizzata popolata List<T> con molti valori, nell'esempio seguente la lista di "People", e si vuole escludere i valori duplicati.
In questo caso arriva in aiuto il metodo "Distinct()" del framework .Net che restituisce i valori univoci.
public class People
{
 public string Name;
 public string Surname;
 ...
}

List<People> listPeople = new List<People>();
People people = new People();
people.Name="A";
people.Surname="AAA";
listPeople.Add(people);
...
people = new People();
people.Name="A";
people.Surname="AAA";
listPeople.Add(people);
...
people = new People();
people.Name="B";
people.Surname="BBB";
listPeople.Add(people);
...
var uniquePeople = listPeople.Distinct();

venerdì 22 agosto 2014

Ricerca con Google Api e c# da una pagina aspx

Con queste semplici righe è possibile connettersi alle Google Api tramite c# ed eseguire una ricerca con Google.
Si può creare ad esempio un pulsante che punti sul metodo e restituisca i risultati su di una listBox, una textBox per inserire la ricerca.
Per curiosità ho inserito nel webConfig l'inidirizzo di Google, ma ciò non toglie che si può facilmente inserire nel sorgente c#.
Non dimenticarsi di scaricare la libreria Newtonsoft.Json.dll e inserirla nella directory "bin" dell'applicazione insieme con il file Newtonsoft.Json.xml

//Nel WebConfig inserire l'url delle Google Api
<configuration>
  <appSettings>
  <add key="GoogleUrl" value="http://ajax.googleapis.com/ajax/services/search/web?v=1.0&rsz=2&q={0}&hl={1}&start={2}"/>

  
//Creare ad esempio il Model
public class SearchResultData
{
 public string url;
 public string title;
 public string content;
 public FindingEngine engine;

 public enum FindingEngine { google };

 public SearchResultData(string url, string title, string content, FindingEngine engine)
 {
  this.url = url;
  this.title = title;
  this.content = content;
  this.engine = engine;
 }
}

//Nel sorgente della pagina aspx.cs inserire le seguenti righe 
public string googleUrl = ConfigurationManager.AppSettings["GoogleUrl"].ToString();
 
public List<SearchResultData> GoogleSearch(string search_expression, string lang)
    {
 var url_template = googleUrl;
 if (lang.Equals(""))
  lang = SpiderObj.Languages.Code.codeEN;
 Uri search_url;
 var results_list = new List<SearchResultData>();
 int[] offsets = { 0, 8, 16, 24, 32 };
 try{
  foreach (var offset in offsets)
  {
   search_url = new Uri(string.Format(url_template, search_expression, lang, offset));
   var page = new WebClient().DownloadString(search_url);
   JObject objJson = (JObject)JsonConvert.DeserializeObject(page);

   var results_query =
     from result in objJson["responseData"]["results"].Children()
     select new SearchResultData(
      url: result.Value<string>("url").ToString(),
      title: result.Value<string>("title").ToString(),
      content: result.Value<string>("content").ToString(),
      engine: SearchResultData.FindingEngine.google
      );

   foreach (var result in results_query)
    results_list.Add(result);
  }
 }
 catch (Exception ex)
 {
  log.Error(ex);
  throw new Exception("");
 }
 return results_list;
    }

mercoledì 2 luglio 2014

Nota su copyright: linguaggi di programmazione, esempi e non solo

Mi è capitato di ricevere email su aggiunta di linguaggi di programmazione ed esempi non solo sul blog, ma anche su di una mia app "Code" presente sul market Android.
Purtroppo non tutti i creatori di linguaggi di programmazione rilasciano codice ed esempi in libera diffusione, ma applicano delle regole di copyright.
Ovviamente non posso leggere tutte le regole perchè sono numerosissime, ma credo sempre di agire in buon senso e fare il possibile.
Se però, come scrivo normalmente nelle app, venissero violate delle norme su contenuti o proprietà di alcuni linguaggi o imperfezioni di scrittura, posso provvedere alla rimozione o risoluzione dell'anomalia.
Mi è capitato anche di ricevere un'email doveva veniva richiesta la rimozione di alcune mie app in alcune nazioni perchè avevo utilizzato una parola o meglio l'associazione di più parole che violavano la proprietà intellettuale di chi aveva utilizzato le stesse per altri scopi (il tutto documentato ovviamente).
Che dire, a me è sembrata una po' esagerata la storia, giusta richiesta ma un po' esagerata.
Comunque ho provveduto alla rimozione delle app in alcune nazioni e rinominate le stesse app riutilizzandole in altri paesi.
Saggio consiglio: occhio ai nomi che usate!

martedì 24 giugno 2014

Upload di file multipli in .Net con c#

Con poche righe di codice è possibile eseguire upload di file multipli in un sito web su piattaforma .Net con linguaggio c#.
E' molto importante ricordare nel "form" la proprietà enctype="multipart/form-data" e nell'oggetto "input" la proprietà multiple="multiple"
Nell'esempio è presente la parte client/html (Default.aspx), il codice associato (Default.aspx.cs) e le immagini d'aiuto.

Default.aspx
<asp:%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>asp:
<asp:html xmlns="http://www.w3.org/1999/xhtml">asp:
<asp:head runat="server">asp:
    <asp:title>asp:<asp:/title>asp:
<asp:/head>asp:
<asp:body>asp:
    <asp:form id="form1" runat="server" enctype="multipart/form-data"  method="post" >asp:
        <asp:table cellpadding="2" cellspacing="1" width="740px">asp:
            <asp:tr>asp:
                <asp:td width="120px">asp:
                    <asp:input type="file" id="File1" multiple="multiple" name="File1" runat="server" />asp:
                <asp:/td>asp:
            <asp:/tr>asp:
            <asp:tr>asp:
                <asp:td align="left">asp:
                    <asp:asp:Button id="Manual" Text="Upload" runat="server" OnClick="Upload_Click"  />asp:
                <asp:/td>asp:
            <asp:/tr>asp:
            <asp:tr>asp:
                <asp:td colspan="4">asp:
                    <asp:asp:ListBox ID="list_message" name="list_message" runat="server" width="600px" Height="200px">asp:<asp:/asp:ListBox>asp:
                <asp:/td>asp:
            <asp:/tr>asp:
        <asp:/table>asp:
    <asp:/form>asp:
<asp:/body>asp:
<asp:/html>asp:
Default.aspx.cs
public partial class _Default : System.Web.UI.Page
{
    string pathFileUploaded = "c:\\temp\\";

    protected void Page_Load(object sender, EventArgs e)
    {}
 
    protected void Upload_Click(object sender, System.EventArgs e)
    {
        if ((File1.PostedFile != null) && (File1.PostedFile.ContentLength >asp: 0))
        {
            HttpFileCollection uploadedFiles = Request.Files;
            for (int i = 0; i <asp: uploadedFiles.Count; i++)
            {
                HttpPostedFile userPostedFile = uploadedFiles[i];
                try
                {
                    if (userPostedFile.ContentLength >asp: 0)
                    {
                        string fn = System.IO.Path.GetFileName(userPostedFile.FileName);
                        try
                        {
                            userPostedFile.SaveAs(pathFileUploaded + fn);
                            list_message.Items.Add(userPostedFile.FileName + " inviato.");
                        }
                        catch (Exception ex)
                        {
                           list_message.Items.Add("Errore: " + ex.Message);
                        }
                    }
                }
                catch (Exception Ex)
                {
                   list_message.Items.Add("Errore: " + Ex.Message);
                }
            }
        }
        else
        {
            list_message.Items.Add("Selezionare almeno 1 file.");
        }
    }
}



martedì 17 giugno 2014

Esempio di creazione file con VBScript

Tramite l'utilizzo dell'oggetto "FileSystem" in VBScript è possibile creare dei file su di una directory e inserire all'interno di essi del contenuto.
In questo esempio vengono creati 2 file xml.
Come lanciarlo? Semplice: creare un file sul desktop chiamato ad esempio "customers.vbs" ed editarlo; inserire queste righe; salvare e fare doppio click sul file appena creato.
Verranno creati due file sul percorso "C:\" (cambiare eventualmente il percorso di destinazione).

Dim xml
Dim oFS, oTextStream, fileName
dim i

For nfile=1 to 2 'It writes 2 file
 fileName="C:\\customers_" & nfile & ".xml"
 Set oFS = CreateObject("Scripting.FileSystemObject")
 If oFS.FileExists(fileName) = True Then 
  Set aFile = oFS.GetFile(fileName)
  aFile.Delete
 end if
 set oFS = NOTHING

 xml=""
 
 xml=xml+""
 For i=1 to 10 'It writes 10 elements
   xml=xml+" "
 next
 xml=xml+""

 set oFS = CreateObject("Scripting.FileSystemObject")
 set oTextStream  = oFS.OpenTextFile(fileName, 8, True)
 oTextStream.WriteLine(xml)
 oTextStream.Close
 set oTextStream  = NOTHING
 set oFS = NOTHING
 xml=""

next

WSCript.Echo "OK Done"
WScript.Quit

mercoledì 11 giugno 2014

Cambio password di un utente con sql in MySQL

Con la riga di comando di mysql o da un client browser che punti su di un database MySQL è possibile cambiare la password ad un utente.
Ovviamente l'utenza abilitata alla shell mysql deve avere privilegi di amministratore (tipicamente l'utenza root).
Ad esempio sulla shell mysql, il comando per cambiare la password in 'mypassword' all utente 'root' del host 'localhost' è la seguente:

UPDATE mysql.user SET Password=PASSWORD('mypassword') WHERE User='root' AND Host='localhost';

martedì 10 giugno 2014

Nuove foto su Dreamstime

Ultimamente ho inviato diverse foto, fatte diversi anni fa e anche recenti, sul microstock Dreamstime e quasi tutte sono state approvate, uaooo questo è un buon segno per il fatto che con il tempo miglioro sempre di più nel fare foto e sistemare i colori.
Eh si ci vuole pazienza, passione, e con il tempo si fa esperienza; questo è il mio portfolio.
Se volete registrarvi questo è il link da utilizzare; avendo me come riferimento, qualche suggerimento ve lo posso dare ... ricordo che sono un amatore, non professionista;-)

"Dear Mauro Giordano, Congratulations, your images have been approved"...sound excellent! New photos on my Dreamstime portfolio here

domenica 8 giugno 2014

Una piccola app Android "su misura"?

Volete un piccola app Android "su misura" che faccia al caso vostro? Scrivetemi un email a "mau_gio[at]email.it" proponendo il contesto, tempo a disposizione, solo app oppure anche il codice e il budget a disposizione.

Do you want a small Android app "custom" for you? Write me an email to "mau_gio[at]email.it" proposing the context, time available and if you need only app or also the code, the available budget.

giovedì 5 giugno 2014

Power Pivot di Microsoft come strumento di analisi

Uno strumento molto buono che ho utilizzato in fase di analisi e post-rilascio di un software gestionale, è senza dubbio Power Pivot di Microsoft.
Ha qualche limitazione ovviamente ma è buono per interfacciarsi con un solo click con SqlServer dalla versione 2008 oppure MS Access e ricavare qualche statistica.
Lo considero un ottimo strumento di base per creare tabelle, grafici a partire da "script sql" creati manualmente o da viste presenti su database e avere dati aggiornati senza dover ricorrere a tools particolari.
È installabile come plugin di Microsoft Excel dalla versione 2010, bisogna solamente scaricare la versione più idonea (32/64 bit, inglese/italiano, Excel 2010/2013...), chiudere Excel, installare il software e far ripartire Excel.
Nelle immagini successive è rappresentato il plugin correttamente installato.

Excel plugin Power Pivot

Excel plugin Power Pivot

lunedì 2 giugno 2014

Inserimento testo su più righe contemporaneamente con Notepad++

Con l'editor Notepadd++ è possibile inserire del testo su più righe in maniera molto semplice.
Supponiamo di avere tre righe, come nell'esempio successiv,o e di inserire la frase "Inserimento di un testo contemporaneamente su più righe";
ora con il cursore ci posizioniamo sul primo carattere della prima riga, premiamo i tasti "Shift-Alt" e tasto "freccia giù"; a questo punto si vedranno 3 cursori lampeggiare; rilasciamo i tasti e scriviamo la frase.
Automaticamente verrà scritta sulle tre righe come nella figura successiva.
Premere il pulsante "Esc" oppure cliccare con il mouse sullo schermo per uscire dall'automatismo.

Notepad++ inserimento di più righe

Notepad++ inserimento di più righe

mercoledì 28 maggio 2014

Plugin di Notepad++

Uno dei migliori editor di testo gratuito e multi-lingua (italiano compreso) è senz'altro Notepad++: semplice, leggero e pieno di risorse.
Per l'installazione di un plugin si può ricorrere al "plugin manager" (come mostrato in figura) oppure andare a caricare il file dll del plugin sotto la directory di installazione del programma "...\Notepad++\plugins".
A questo punto chiudere e riaprire Notepad++ e il plugin apparirà sotto il menu "Plugins".
Vorrei segnalare il plugin "DSpellCheck" che permette di avere un correttore ortografico mentre si digita del testo. È facilmente configurabile e una volta selezionata o scaricata la lingua da utilizzare il plugin è già pronto all'uso.
Nella figura successiva sono presenti alcuni plugin che ho installato e utilizzo frequentemente, ma basta cercare nella rete per ottenerne tanti oppure quelli disponibili nel"plugin manager"; questo un link di riferimento.






lunedì 26 maggio 2014

Importazione dati da file con sql di MySql

È possibile creare o importare dati (creare un database, import dei dati con insert e update...) in MySql a partire da un file, semplicemente digitando un comando dalla shell di MySql.
Entrare sulla shell o riga di comando con l'utenza di amministratore (tipicamente "root") e si avrà il prompt di tipo "mysql >"
La shell è raggiungibile anche tramite comando "mysql -u root -ppassword" lanciato da dos (in ambiente Windows dopo essersi posizionati sotto la directory di "mysql\bin").
A questo punto, immaginando che il file risieda sul percorso "c:\", digitare sulla riga il comando "source c:file.sql;" (o in alcuni casi "source c:\file.sql;" e premere "INVIO".
Si vedrà agganciare il file ed eseguire il codice al suo interno.
Importante è avere i privilegi di amministratore e digitare bene il path del file.

venerdì 16 maggio 2014

Cryptstory e gli aneddoti cifrati

È online sul market Android di Google la mia nuova app Cryptstory: storie, aneddoti, frasi famose da decifrare raccolte in un'unica app.
E' il classico sistema degli aneddoti cifrati: ai numeri bisogna associare delle lettere così da formare la storia completa. Sarà possibile scrivere una storia personale con al massimo 300 caratteri.
Ogni app di Cryptstory è scritta in una sola lingua, quindi per installare versioni in lingue differenti bisognerà installare altre app:
esempio Cryptstory IT, Cryptstory EN ... disponibili a breve sul market Android.

lunedì 5 maggio 2014

Il codice di una mia app in vendita!

Finalmente il codice di una mia app Free Word in vendita su chupamobile.com
Eccolo qui
E' una versione leggermente diversa da quella presente sul Market Android perchè non ha la possibilità di collegarsi alla classifica online e non ha i banner pubblicitari che scorrono in basso allo schermo.
Per il resto funziona perfettamente ed è possibile customizzarla.

Ora su sellmyapp.com

sabato 29 marzo 2014

Aggiornamento Quiz 1.9.8

Nuovo aggiornamento per Quiz, la mia app Android, riguarda la correzione di alcune domane e risposte; inoltre sono state aggiunte le statistiche nella prima schermata.
Cliccando sull'iconcina accanto al nome delle statistiche è possibile caricare la classifica online.

giovedì 30 gennaio 2014

Quiz: 100.000 download!

E con oggi si festeggiano i 100.000 download della mia app Quiz!
Grazie a tutti e ancora buon divertimento!

lunedì 6 gennaio 2014

Aggiornamento Code v. 2.3.2

In linea un aggiornamento per Code, la mia app Android, riguarda l'ottimizzazione per diversi device.
Il layout è stato migliorato per dispositivi come tablet 10, tablet 7 e altri ancora, con versione android superiore alla 4.