viernes, 6 de febrero de 2015

Consumir un WebService JSON desde JavaScript con Ajax

En muchas ocasiones se nos hace necesario, desde una página HTML, realizar la llamada a un webservice para obtener una serie de resultados. Una buena forma de conseguir esto es utilizar Ajax. Existen múltiples formas de realizar la llamada, y en este post indicaremos simplemente una de ellas. Espero que os sea de utilidad.
<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <title>Test consumir WebService</title>
  <script src="http://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

  <script type="text/javascript">
    // Procesar resultados del webservice
    function webServiceResult(data)
    {
      $("#resultado_json").empty();    

      $("#resultado_json").append("Nombre: "+data.name+"<br>");
      $("#resultado_json").append("Pais: "+data.sys.country+"<br>");
      $("#resultado_json").append("Longitud: "+data.coord.lon+"<br>");
      $("#resultado_json").append("Latitud: "+data.coord.lat+"<br>");
      $("#resultado_json").append("Tiempo: "+data.weather[0].main+"<br>");
      $("#resultado_json").append("&nbsp;&nbsp;"+data.weather[0].description+"<br>");
      $("#resultado_json").append("Humedad: "+data.main.humidity+"<br>");
      var tmin = Math.round(10*(data.main.temp_min -273.15)) / 10;
      var tmax = Math.round(10*(data.main.temp_max -273.15)) / 10 ;
      $("#resultado_json").append("Temp. minima: "+tmin+"<br>");
      $("#resultado_json").append("Temp. maxima: "+tmax+"<br>");
    }
      
    // Llamada al webservice
    function callWebService()
    {
      try
      { 
        $.ajax({
          url: "http://api.openweathermap.org/data/2.5/weather",
          data:
          {
              q: "Cordoba,es",
          },
          type: "get",
          async: true,
          contentType: "text/json; charset=utf-8",
          dataType: "jsonp",        
          success: function(msg) { webServiceResult(msg) },
          error: function(jqXmlHttpRequest, textStatus, errorThrown) { alert("Error leyendo datos."); }
        });
      } 
      catch (err) 
      {
        alert(err);
      }
    }
  </script>
  
</head>

<body>

<button type="button" onclick="javascript:callWebService();">Llamar a WS</button>

<div id="resultado_json"></div>

</body>
</html>
Un ejemplo más elaborado, e incluso cargando los datos a consultar desde un fichero JSON, se puede consultar aqui.

Consumir un WebService XML desde .NET

En esta entrada publicamos una función que nos permite consumir un webservice XML y pasarlo a un DataTable, de forma que podamos trabajar con los datos de manera muy sencilla. La función es la siguiente:
Public Shared Function GetDataTable_WebServiceXML(opcion As String, listaParametros As String) As Data.DataTable
  Try
    Dim url As String = "http://url.com/WebService.asmx/GetOpcion"
    url += "?nombre=" + opcion + "&parametros=" + listaParametros

    Dim request As HttpWebRequest
    Dim response As HttpWebResponse = Nothing
    Dim ds As New Data.DataSet

    request = DirectCast(WebRequest.Create(url), HttpWebRequest)
    response = DirectCast(request.GetResponse(), HttpWebResponse)
    ds.ReadXml(response.GetResponseStream())

    If ds.Tables.Count > 0 Then
      Return ds.Tables(0)
    Else
      Return New Data.DataTable
    End If

  Catch ex As Exception
    Throw New Exception(ex.Message)
  End Try
End Function
Con el código de esta pequeña función, obtendremos un datatable con los resultados obtenidos. Si fuera necesario podríamos modificarla para devolver un DataSet o directamente el contenido del XML.

Log sencillo en .NET

En muchas ocasiones tenemos la necesidad de hacer un seguimiento de procesos en tiempo de ejecución, bien para depurar errores, bien para dejar un registro de lo ocurrido, o por cualquier otra necesidad. Para conseguir esto, habitualmente se utilizan ficheros logs.

Esta entrada muestra como crear un log muy básico y sencillo (no se da menos) para nuestras aplicaciones .NET. Se trata de un procedimiento muy simple y nada sofisticado, pero que nos puede servir de punto de partida para, por ejemplo, crear una clase de log personalizada, o para extenderlo según nuestras necesidades. Manos a la obra:

En VB
Public Shared Sub Log(texto As String)
  Dim fichero_log As New IO.StreamWriter(System.AppDomain.CurrentDomain.BaseDirectory + "/seguimiento.log", True)
  fichero_log.WriteLine(texto)
  fichero_log.Flush()
  fichero_log.Close()
End Sub
En C#
public static void Log(string msg)
{
  if (msg.Length > 0)
  {
    using (StreamWriter sw = File.AppendText(System.AppDomain.CurrentDomain.BaseDirectory+"\\seguimiento.log"))
    {
      sw.WriteLine("[{0} {1}] {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), msg);
      sw.Flush();
    }
  }
} 

Registros de SQL hacia XML/JSON

Nuestra aplicación de gestión en la empresa está desarrollada en .NET y utilizando base de datos SQL Server. Se trata de una aplicación de escritorio, y debido a ciertas necesidades, hemos construido un WebService para hacer disponibles ciertos datos desde el exterior, para que sean consumidos por la web de eCliente y por varias apps.

Hemos configurado el webservice para que devuelva los datos en el formato deseado, XML o JSON, así quien lo consuma podrá elegir cómo quiere los datos. En eCliente utilizamos .NET, por lo que se hace más sencillo obtener los resultados en un XML (directamente creamos un DataSet a partir de él se hace mucho más fácil su gestión), y en las apps lo consumimos con JSON.

En ambos casos nos hemos encontrado con un problema: tenemos registros que tienen caracteres que, bien hacen que se rompan el XML, o bien el HTML, debido a que contienen caracteres no permitidos para estos formatos.

Para evitar este problema, hemos creado una función escalar en SQL Server que nos reemplaza los caracteres no deseados para que el XML/JSON sea correcto. La función es la siguiente:
USE [BaseDatos]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[CampoToHTML] (@texto varchar(256)) returns varchar(max)
begin
   declare @resul varchar(max)
   set @resul = @texto
   set @resul = REPLACE(@resul, char(34), char(39))
   set @resul = REPLACE(@resul, 'ñ' COLLATE Latin1_General_CS_AS,'n')
   set @resul = REPLACE(@resul, 'á' COLLATE Latin1_General_CS_AS,'a')
   set @resul = REPLACE(@resul, 'é' COLLATE Latin1_General_CS_AS,'e')
   set @resul = REPLACE(@resul, 'í' COLLATE Latin1_General_CS_AS,'i')
   set @resul = REPLACE(@resul, 'ó' COLLATE Latin1_General_CS_AS,'o' )
   set @resul = REPLACE(@resul, 'ú' COLLATE Latin1_General_CS_AS,'u')
   set @resul = REPLACE(@resul, 'Ñ' COLLATE Latin1_General_CS_AS,'N')
   set @resul = REPLACE(@resul, 'Á' COLLATE Latin1_General_CS_AS,'A')
   set @resul = REPLACE(@resul, 'É' COLLATE Latin1_General_CS_AS,'E')
   set @resul = REPLACE(@resul, 'Í' COLLATE Latin1_General_CS_AS,'I')
   set @resul = REPLACE(@resul, 'Ó' COLLATE Latin1_General_CS_AS,'O')
   set @resul = REPLACE(@resul, 'Ú' COLLATE Latin1_General_CS_AS,'U')
   set @resul = REPLACE(@resul, '&' COLLATE Latin1_General_CS_AS,'y')
   return @resul
END
De esta forma, la consulta SQL la haríamos de la siguiente forma:
SELECT id,dbo.CampoToHTML(apellidos) FROM Clientes
Esto es todo.

Consumir un webservice desde PHP (XML/JSON)

Cuando trabajamos con PHP, es muy habitual encontrarnos con la necesidad de realizar la llamada a un webservice para obtener una serie de resultados para después trabajar con ellos. Existen múltiples formas de conseguir esto, y en este post vamos a mostrar dos posibilidades muy sencillas para conseguirlo. Mostraremos dos ejemplos, uno que recibe los resultados en formato XML y otro en formato JSON. Una vez recibidos los resultados, recorremos la información obtenida para mostrarla por pantalla.

Si el webservice devuelve resultados en XML
<?php
  // Llamada al WebService
  $client = new SoapClient("http://www.webservicex.net/country.asmx?WSDL");
  $result = $client->GetCountries();
  $xml = $result->GetCountriesResult;

  // procesar xml
  $xml = simplexml_load_string($xml);
  foreach($xml->Table as $table) 
  {
    $output .= "<p>$table->Name</p>";
  }
  print_r($output);
?>

Si el webservice devuelve resultados en JSON
<?php
// Función para llamar al webservice y devolver el resultado en un array
function callWebService($method)
{
  $url ='http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo';
  $json = file_get_contents($url);
  $array = json_decode($json,true);
  return $array;
}
Esa misma función puede optimizarse en una sóla línea:
function callWebService($method)
{
  return json_decode(file_get_contents('http://api.geonames.org/citiesJSON?north=44.1&south=-9.9&east=-22.4&west=55.2&lang=de&username=demo'),true);;
}
La llamada podría se la siguiente:
$resul = callWebService();
foreach($resul['geonames'] as $city)
{
    $cities .= '<p>'.$city['name'].'</p>';    
}
print_r ($cities);

Espero os sea de utilidad. Si deseas obtener más información, puedes consultar la documentación de php.

lunes, 2 de febrero de 2015

Instalación de un SSD en Windows: Optimizando el rendimiento

Los discos de estado sólido o SSD son una gran alternativa para mejorar el rendimiento de un ordenador. Estos discos tienen un acceso mucho más rápido que un disco mecánico tradicional, y mejoran sustancialmente la carga de los programas. Debido a su tamaño actual, lo recomendable es utilizar un disco SSD para el sistema operativo y las instalaciones de software, y un disco mecánico más grande para el almacenamiento de información.

El precio de los SSD es cada vez más asequible, a la vez que mejoran sus prestaciones. Recientemente he adquirido el Crucial MX 1000 de 256 Gb. Una vez instalado un SSD (para sacarle el máximo rendimiento es recomendable una conexión SATA3, aunque en SATA2 también mejoran la velocidad de acceso de una forma más que notable), debido a que disponen de un ciclo de escrituras limitado, es conveniente para alargar su vida realizar una serie de procesos. Estos son los pasos recomendables si utilizas Windows:

Configuración previa

Lo primero que hay que hacer, sino está así ya que suele ser lo habitual, es configurar la Bios de la placa base para que emplee el sistema de transmisión de datos AHCI en lugar del tradicional IDE. Ello es debido a que el estándar IDE es bastante más lento (133 MB/s) que las velocidades máximas de transmisión que se alcanzan con los actuales con los actuales SATA 2 (300 MB/s) y SATA 3 (600 MB/s), con lo que se estaría reduciendo considerablemente el rendimiento de la unidad.

Otro dato a tener en cuenta es el alineamiento de los sectores del SSD. A pesar que los discos duros mecánicos tradicionalmente emplean un alineamiento de 512 bytes por sector, los SSD emplean un alineamiento de 4 kB por sector. Por ello, es recomendable particionar y formatear la unidad antes de instalarle el sistema operativo, dado que estos valores no se podrán modificar con el mismo ya instalado.

Configuración del disco sólido

Una vez realizada la instalación de Windows 7, procederemos a realizar los siguientes cambios:

Desactivar hibernación.
A no ser que realmente queráis que vuestro sistema pueda hibernar, si se tiene un SSD es conveniente desactivar esta característica de Windows dado que supone un gasto innecesario de ciclos de escritura en estas unidades, ya que cada vez que el sistema entra en este estado, toda la información almacenada en la RAM se escribe el la unidad que almacena el sistema operativo. Para hacer ésto, lo primero es entrar en el Panel de Control de Windows e ir la la sección de Sistema. Una vez dentro, ir a Opciones de energía. Ahí, pulsar sobre la opción "ostrar planes adicionales. Seleccionar Alto rendimiento, y Cambiar configuración del plan, que sale a su derecha. En la opción Poner el disco en supensión, debería aparecer Nunca.

Desactivar superfetch.
Superfetch es una característica de Windows que precarga los programas de uso más habitual en la memoria de Windows para así acelerar su ejecución. Dada la rapidez de acceso que tienen los discos SSD, no es necesario tener esta característica activada, liberarando además espacio en RAM. Para desactivar esta característica, hacer click con el botón derecho sobre el icono de Equipo en el escritorio y seleccionar Administrar. En la ventana que se abre, seleccionaremos Servicios. Buscamos la entrada Superfetch, se le hace doble click y se deshabilita el inicio.

Desactivar la caché de escritura
La caché de escritura mejora considerablemente el rendimiento de los discos duros mecánicos, pero en algunos modelos de estado sólido (los que llevan controladoras SandForce) no sirve de nada, por lo que es mejor desactivarla. Para ello, hacer click con el botón derecho de ratón en la unidad C y seleccionar Propiedades. Ir a la pestaña Hardware. Seleccionar la unidad SSD pulsar el botón de Propiedades. En la ventana que aparece seleccionar Deshabilitar la caché de escritura.

Desacativar la indexación de la unidad
La indexación permite a Windows conocer en todo momento dónde se han guardado los archivos en la superficie del disco duro. En el caso de los discos mecánicos es muy útil pero en los discos sólidos no tiene sentido por su forma de funcionamiento (no hay que mover las cabezas lectoras), así que puede desactivarse. Como en el paso anterior, haremos click con el botón derecho del ratón sobre el icono de la unidad C y seleccionamos Propiedades. En la ventana que se abra, quitaremos el tick de selección en Permitir que los archivos de esta unidad tengan el contenido indizado además de las propiedades de archivo.

Windows pedirá confirmación, seleccionar la opción de carpeta, subcarpetas y ficheros. Cuando salga la ventana de permisos restringidos, simplemente le damos a Continuar. Si sale una ventana de error, pulsar Ignorar todo. Este proceso tardará un tiempo y una vez finalizado, la desindexación está terminada.

Desactivar desfragmentador
Windows lleva activado de serie un desfragmentador cuya función es mantener los discos en estado óptimo y que se ejecuta cada vez que el disco está inactivo. Dado que el desfragmentador crea una tarea en que los datos se mueven dentro del propio disco, con sus correspondientes ciclos de lectura y escritura, no nos interesa tenerlo activado en una unidad de estado sólido.Además, en un SSD el acceso no es secuencial. Para desactivar la desfragmentación volvemos a entrar en las caraterísticas del disco y seleccionamos la pestaña de Herramientas. En ella, seleccionamos Defragmentar ahora. En la ventana que aparecerá, seleccionamos la opción del programador y allí lo desactivamos.

Ojo que al hacer ésto desactivamos esta programación para todos los discos duros, así que deberemos de estar al tanto por nuestra cuenta de su estado.

Con estos pasos tan sencillos habremos configurado correctamente nuestra unidad de estado sólido y conseguiremos que su vida útil sea más prolongada.

Fuente: Dodeka.

domingo, 1 de febrero de 2015

Plugins para Sublime Text

Si trabajos con SublimeText, éste puede extenderse con plugins para hacernos la vida más fácil. En este post hablaremos de dos plugins muy interesantes.

Para poder instalar estos plugins, haremos uso de "Package control". Tenemos las instrucciones de instalación en esta página. Básicamente abrimos la consola de SublimeText (View-Show console) y pegamos el texto que se nos indica en la página de instalación. Reiniciamos SublimeText y ya tenemos instalado este plugin.

SublimeCodeIntel (intellisense)
Este plugin sirve para que cuando vamos escribiendo (según el lenguaje en el que estemos programando), SublimeText nos vaya mostrando las distintas posibilidades existentes (digamos que es un auto-completar para nuestro código fuente, al estilo de VisualStudio). Por ejemplo, si estamos editando un CSS, y dentro de body escribimos b, se nos sugiere una lista de posibles valores que empiezan por la letra b (background,bottom, border,...). Conforme vayamos escribiendo, se nos irá filtrando la lista a las posibilidades que tenemos. De esta manera, además de ahorrar tiempo, evitaremos errores de escritura y nos evita tener que aprender de memoria todas las posibilidades.


El plugin se llama SublimeCodeIntel,y su instalación es muy sencilla:
  • Abrir SublimeText y ejecutar la paleta de comandos (Ctrl+Mayus+P).
  • Seleccionar "Package control: Install Package"
  • En la lista resultante, seleccionar SublimeCodeIntel. Esperamos a que se instale y reiniciamos SublimeText.
La ventaja de este método es que siempre obtendremos la última versión del plugin. Más información sobre este plugin se puede encontrar en su página oficial.

Emmet
Emmet es un plugin para crear estructuras html con muy pocas pulsaciones de teclado. Para ello se siguen una serie de reglas que se pueden consultar en la página oficial.

Su instalación se consigue, una vez instalado Package Control como se indica más arriba, mediante los siguientes sencillos pasos:
  • Abrir SublimeText y ejecutar la paleta de comandos (Ctrl+Mayus+P).
  • Seleccionar "Package control: Install Package"
  • En la lista resultante, seleccionar Emmet. Esperamos a que se instale y reiniciamos SublimeText.
Esto es todo.

 

Copyright @ 2015 Tosblama