Páginas

2019/05/03

MsiInv o cómo obtener información del software instalado en tu ordenador (en Windows)

Pues como dice el título, si quieres saber realmente qué software tienes instalado en tu computadora con el sistema operativo Windows, recomiendo utilizar el programa MsiInv (msiinv.exe) alojado aquí

Es un programa de consola que obtiene una información muy exacta de todos los programas, patches, actualizaciones, juegos, y demás utilidades que puedas tener instaladas.

Para saber cómo funciona puedes echar un vistazo a los siguientes enlaces:



2018/12/19

console.log() de javascript y substitución de texto

Siempre que he querido mostrar varias variables en una misma sentencia console.log() lo hacía de la siguiente forma:

console.log("Nombre:" + nombre + ", Apellido: " + apellido);

Es decir, concatenaba las variables con el texto.

Pues bien, acabo de descubrir que console.log() acepta la inclusión de parámetros para substituir un texto como lo hace el lenguaje C, esto es:

console.log("Nombre: %s, Apellido: %s", nombre, apellido);

También se acepta esta forma:

console.log(`Nombre: ${nombre}, Apellido: ${apellido}`, nombre, apellido);

[ nótese que se incluye el caracter ` para delimitar el texto, no sirven comillas simples ('') o dobles ("") ]

También es posible utilizar %d para números (que devuelve 0 si no lo son), y f% para números con notación decimal.


<script>
var nombre="Carl";
var apellido="Sagan";

var num1 = 56.6545;
var num2 = 57;

console.log("Nombre: %s, Apellido: %s", nombre, apellido);
// Resultado: Nombre: Carl, Apellido: Sagan

console.log(`Nombre: ${nombre}, Apellido: ${apellido}`);
// Resultado: Nombre: Carl, Apellido: Sagan

console.log('Nombre: %d, Apellido: %d', nombre, apellido);
// Resultado: Nombre: 0, Apellido: 0

console.log("num1: %d, num2: %d", num1, num2);
// Resultado: num1: 56, num2: 57

console.log("num1: %f, num2: %d", num1, num2);
// Resultado: num1: 56.6545, num2: 57

</script>

2018/05/25

PATCH y actualizaciones parciales en ASP.NET Core

Por actualización parcial me refiero a la actualización de algunas campos o propiedades de un objeto. La actualización por PUT reemplaza toda la información escribiendo campos vacíos cuando no se pasa contenido. Es decir, PUT actualiza el recurso pasado en su totalidad mientras que PATCH solamente actualiza los campos pasados en la llamada.

Con PUT se necesita pasar todos los campos que el recurso contenga, de otra forma los campos no pasados se consideran vacíos o nulos.

PATCH es útil para actualizar un campo sin tener que hacer un GET antes, ahorrando así una llamada, pero no quiere decir que sea una recomendación que tenga que utilizarse siempre ya que hay que recordar que todo depende del Contexto.

El método PATCH es particular. Es un método que consta de otras operaciones según la forma de actualización parcial que queramos, así pues tenemos las siguientes operaciones ('op'):

add, remove, replace, copy, move, test

P.ej.

{ "op": "replace", "path": "/helados/1/sabor", "value": "Chocolate" }

{ "op": "add", "path": "/helados/2", "value": { "name": "Dracula Chocolate" } }

{ "op": "remove", "path": "/helados/0" }

{ "op": "replace", "path": "/helados/1/sabor", "value": "Vainilla" }

{ "op": "copy", "from": "/helados/1", "path": "/superhelado" }

{ "op": "move", "from": "/helados", "path": "/mejoreshelados" }

{ "op": "test", "path": "/helados/name", "value": "Vainilla" } //para saber si existe
 
 
Estos ejemplos están escritos en formato JSON y es la forma con la que se trabajará con el Nuget Asp.Net Core JsonPatch (que debemos añadir a nuestro proyecto)
Existen otras librerías como Ramone, JsonPatch, Starcounter, Nancy.JsonPatch, Manatee.Json



1) Creamos nuestro método en ASP.NET Core
 
 [HttpPatch("{id:int}")]
 [EnableCors("MiPoliticaCORS")]
 public async Task<IActionResult> Patch(int id, [FromBody]JsonPatchDocument<Video> patch)
 {
   if (!ModelState.IsValid)
   {
    return BadRequest(ModelState);
   }

   Video videoBBDD = _context.Videos.AsNoTracking().SingleOrDefault(c => c.Id == id);

   if (videoBBDD == null) return NotFound();

   if (id != videoBBDD.Id)
   {
    return BadRequest();
   }

   if (!VideoExists(id))
   {
    return NotFound();
   }

   patch.ApplyTo(videoBBDD, ModelState);  //Importante este paso

   try
   {
    _context.Videos.Update(videoBBDD);
    await _context.SaveChangesAsync();
   }
   catch (DbUpdateConcurrencyException ex)
   {
     ....
   }

   return Ok();
 }



Destacar:
 - En la declaración de argumentos utilizamos JsonPatchDocument<Video>
 - Usar el método .ApplyTo()
 
En este caso quería actualizar un campo dado en el formato JSON que se 
ha visto en una fila de una BBDD de videos.


2) Pruebas del método PATCH con jQuery

(sí, ya sé que puedo hacerlo con Angular, XMLHttpRequest(), etc, etc. )

        
        var sendJsonData = [{
            "op": "replace", "path": "/name", "value": "valorCambioConPatch"
        }];
       
        console.log("JSON.stringify:", JSON.stringify(sendJsonData));

        $.ajax({
            type: 'PATCH',
            contentType: "application/json; charset=utf-8",
            headers: [{ 'Access-Control-Allow-Origin': 'http://localhost' }, 
                      { 'Access-Control-Allow-Methods': 'PATCH' } ],
            url: "http://...../api/videos/1",
            dataType: "json",
            data: JSON.stringify(sendJsonData),
            success: function (response) {
             console.log('Success: ', response);
            },
            error: function (jqXHR, textStatus, errorThrown){
             console.log("textStatus:",textStatus);
             console.log("errorThrown:",errorThrown);
            }
            }).done(function hecho(){
              console.log('Hecho.');
            });


Destacar:
- Importantísimo que en este caso sendJsonData sea un array. Hay que pasar un Array, 
  no me funcionó hasta que no lo contemplé.
- 'op' es la operación a realizar como hemos visto, en este caso quiero cambiar un valor 
   por otro pues utilizo replace
- 'path', no es una ruta de un sistema de ficheros, sino el campo del objeto BBDD que quiero cambiar (también me ha funcionado sin slash '/' 
pero en todos los sitios que he leído lo incluye)
- 'value', es el nuevo valor que quiero establecer


Referencias y páginas que me han ayudado:

- JsonPatch.com   
- http://benfoster.io/blog/aspnet-core-json-patch-partial-api-updates
- https://michael-mckenna.com/how-to-add-json-patch-support-to-asp-net-web-api/
- https://kimsereyblog.blogspot.com.es/2017/11/implement-patch-on-asp-net-core-with.html
- https://docs.angularjs.org/api/ng/service/$http#patch
 
 
 
 
Notas finales

"PATCH is neither safe nor idempotent." (https://tools.ietf.org/html/rfc5789#section-9.1)

es decir, PATCH no es seguro, entiendiendo como no seguro el tratamiento de colisiones 
al acceder al mismo tiempo sobre un mismo recurso

Collisions from multiple PATCH requests may be more dangerous than
   PUT collisions because some patch formats need to operate from a
   known base-point or else they will corrupt the resource.
Y continua...
"Clients using this kind of patch application SHOULD use a conditional request
   such that the request will fail if the resource has been updated
   since the client last accessed the resource."
"...The server MUST apply the entire set of changes atomically and never
   provide (e.g., in response to a GET during this operation) a
   partially modified representation."
Luego se sigue comentando problemas con el caché, para sentenciar ...
"There is no guarantee that a resource can be modified with PATCH..."
"Clients need to choose when to use PATCH rather than PUT."
 
Así pues, y después de lo leído, antes de utilizar PATCH hay que saber qué se hace.
 
Más referencias:
http://wahlnetwork.com/2015/07/13/patch/
https://tools.ietf.org/html/rfc5789#section-9.1

SyntaxHighlighter


Suelo utilizar este complemento para poder visualizar código formateado en este blog. El problema es que cada vez que cambio de Tema se desconfigura todo y tengo que volver a buscar información de cómo se instala.

Así pues para eso escribo esta entrada y los pasos a seguir son:

1) Ir a Tema | Editar HTML

2) Escribir estas líneas antes del </head>

<link href="https://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shCore.css" rel="stylesheet" type="text/css"> 
<link ref="https://agorbatchev.typepad.com/pub/sh/3_0_83/styles/shThemeDefault.css" rel="stylesheet" type="text/css"> 

<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shCore.js" type="text/javascript"></script> 
<script rc="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushCSharp.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushCss.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushJava.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushJScript.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushPhp.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushPython.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushRuby.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushSql.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushVb.js" type="text/javascript"></script> 
<script src="https://agorbatchev.typepad.com/pub/sh/3_0_83/scripts/shBrushXml.js" type="text/javascript"></script> 

<script type="text/javascript">
 SyntaxHighlighter.all();
</script>


Siendo el resultado:


 

 



 

 

 

 

 

 

 

 

 

 

 




2018/05/16

Autentificación y autorización en Apache (a grosso modo)

Autentificación en Apache2

Caso práctico: se quiere establecer seguridad para que solamente algunos usuarios puedan acceder a un fichero alojado en un servidor Apache2.

Antes de nada decir que las diferencias entre Autentificación/Autenticación, y Autorización son:

  • Autentificación: verificar si la persona o entidad que se intenta conectar o acceder a un sistema es quien dice ser.
  •  Autorización: acción por el que se concede permiso a una persona o entidad a realizar otras acciones (lectura, modificación, escritura…) sobre un recurso de un servidor.


Se pedía dos formas de acceder a la lectura de un fichero en el servidor:

     1) En forma de autentificación en el sitio web pasando nombre de usuario y password
     2) Verificar que la URL pasada para consultar el recurso posee un ‘token’ o clave en esta URL en forma de texto.



1)     Autentificación en web

Para este caso tenemos que hacer lo siguiente:

a)
            sudo htpasswd –c /etc/apache2/.htpasswd nombreusuario

A continuación nos pedirá el password y este se guardará en el archivo .htpasswd

Podemos verlo con el comando:

      cat /etc/apache2/.htpasswd

b)

      sudo vi /etc/apache2/sites-enabled/000-default.conf

Añadir:

<VirtualHost *:80>
<Directory "/var/www/html/mipagina/">
   AuthType Basic
   AuthName "Restricted Content"
   AuthUserFile /etc/apache2/.htpasswd
   Require valid-user
</Directory>
</VirtualHost>

Lo que aquí configuramos es la forma de autentificación y dónde están las contraseñas alojadas para poder validad el usuario

Luego reiniciar el servidor Apache:

sudo service apache2 restart

Si accedemos a la URL nos aparecerá la siguiente imagen de autentificación:



También decir que podríamos acceder de la siguiente forma para que se 'logueara' directamente:

http://userName:password@direccionIP/pagina.html




      2)      Autorización mediante una palabra pasada por parámetro a una URL

En este caso se pidió que se le pasará la palabra ‘token=nombreequipo’ del modo http://direccionIP/pagina.html?token=nombreequipo

      a)      Módulo rewrite

    Para esto utilicé el módulo rewrite que está incluido en  
    /etc/apache2/mods-available/rewrite.load

    Para activarlo hay que ejecutarlo siguiente:
   sudo a2enmod rewrite
   service apache2 restart

      b)      Fichero .htaccess

          Añadí el fichero .htaccess dentro de /var/www/html/miproyecto

     RewriteEngine On
     RewriteCond ${REQUEST_FILENAME} -f
     RewriteCond ${REQUEST_FILENAME} !-d
     RewriteCond %{REQUEST_URI} \.html$ [NC]
     RewriteCond %{QUERY_STRING} !^token=nombreequipo [NC]

     RewriteRule . /403.html

     [NC] es un flag que indica que puede escribirse tanto en mayúsculas como en mínusculas (No Case Sensitive, es decir, que no distinga mayúscula y minúsculas)

             La primera línea activa el módulo Rewrite, la segunda es que el fichero pasado en la url sea  efectivamente un fichero, la tercera es que no sea un directorio, la cuarta que la url acabe en .html, y la quinta línea, es que el parámetro pasado contenga la frase “token=nombreequipo”. Si alguna de estas condiciones no se cumplen, el servidor nos redirige a la página 403.html

             Para poder utilizar .htaccess hace falta establecer en apache2.conf dentro de la sección <Directory> la sentencia "AllowOverride All"
  

     <Directory /var/www/html/miproyecto/>
Options –Indexes
Options FollowSymLinks
AllowOverride All
Require all granted
     </Directory>

           Options –Indexes bloquea el listado de ficheros de la raíz cuando intentamos acceder al directorio padre del proyecto.

2018/05/10

Pasos para hacer un Upload de 100 Megabytes bajo Nginx y ASP.NET Core 2


Pasos para hacer un Upload de 100 Megabytes bajo Nginx y ASP.NET Core 2

(y que no nos salga el error "413 Payload Too Large" (Kestrel) o  "413 Request Entity Too Large" (Nginx) )


Paso 1: Modificar nuestro web.config

<configuration>
  <system.web>
     <httpRuntime maxRequestLength="102400" /><!-- 100 MB in kilobytes -->
  </system.web>
  <system.webServer>

   ...
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="102428800" /> <!--100 MB in bytes -->
     </requestFiltering>
  </security>

...
 </system.webServer>


Paso 2: Modificar nuestra configuración de Nginx

En mi caso tengo una configuración propia en /etc/nginx/sites-enabled/proyecto.conf
pero también es factible modificar /etc/nginx/nginx.conf

Añadiendo
client_max_body_size 100M; #si lo establecemos a 0 no hay límite.
dentro de la sección location / {} ,y server {..}, aunque también he leído que  haría falta en http {...} de nginx.conf

En mi caso yo lo he establecido en location y en server, y me ha funcionado.

Acordarse de luego hacer un nginx -s reload o service nginx reload


Paso 3: Modificar el comportamiento Kestrel

Este paso no aparece en todos los sitios y es esencial.

Nos vamos a Program.cs 

.UseKestrel(options=>
 {
   options.Limits.MaxRequestBodySize = 102428800; //100 Megas en bytes
 })





2018/04/25

Publicar un proyecto ASP.NET Core con todas sus dependencias

Si después de publicar un proyecto ASP.NET Core te han faltado librerías .dll que están reflejadas en el fichero proyecto.deps.json, y no quieres ir copiando una a una, tienes que añadir la siguiente línea a tu fichero .csproj del proyecto:

 <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
  <PublishWithAspNetCoreTargetManifest>false</PublishWithAspNetCoreTargetManifest>
  </PropertyGroup>


Enlace:
https://www.benday.com/2018/02/23/force-dotnet-publish-to-publish-dependencies-using-publishwithaspnetcoretargetmanifest/


2018/04/12

Error 404 después de publicar con ASP .NET Core

Si después de publicar, alojar todo correctamente en tu IIS y al acceder a tu web API no se muestra nada y compruebas que está devolviendo un error 404 (recurso no encontrado), comprueba que la cadena conexión a la base de datos es correcta y tiene los permisos adecuados.

En mi caso, la cadena de conexión que la tenía escrita en appsettings.json no le había incluído el usuario, despiste mío.

2018/03/23

Cómo publicar un proyecto web de ASP.Net Core 2 en Ubuntu

1) Estando en un directorio del proyecto bajo Windows, publicamos de esta forma:

    dotnet publish -r ubuntu.16.10-x64 -o C:\Proyectos\ProyectoPublish

    C:\Proyectos\ProyectoPublish es la ruta de destino donde publicaremos.


2) Copiamos la publicación y la movemos a la carpeta Ubuntu /var/www/ProyectoPublish


3) Ponemos en marcha el proyecto publicado:

  a) Dentro de la ruta donde está el proyecto publicado (/var/www/ProyectoPublish/), ejecutar

     dotnet nombreProyecto.dll
   
     (Si no tenemos dotnet instalado mirar la siguiente página https://docs.microsoft.com/es-es/dotnet/core/linux-prerequisites?tabs=netcore2x )
   
  b) Entrar en

        http://localhost:5000/

Primera toma de contacto con ASP.NET Core 2

Quisiera compartir algunos apuntes que he anotado a medida que avanzaba en mi primer proyecto con ASP .NET Core 2:

* Si queremos aumentar el tiempo que necesita una petición en su ejecución:

  Solución: Ir al web.config y modificar o añadir la propiedad requestTimeout. En el siguiente ejemplo hasta 10 minutos:



* Añadir funciones de logueo (registro en logs)

 
 Solución: en el web.config añadir:

 stdoutLogEnabled="true" stdoutLogFile=".\logs\stdout"

Importante: Los logs no se escriben si no existe la carpeta \logs . Hay que crear esta carpeta.


* Si se produce este error:
   
    This assembly was expected to be in the local runtime store as the application was published using the following target manifest files:
    aspnetcore-store-2.0.6.xml 



Se puede arreglar añadiendo esto en el archivo .csproj del proyecto
   


 * Si se produce este error:

Development environment should not be enabled in deployed applications ...   
   
    Debemos añadir estas líneas al web.config del proyecto publicado:

Esto ocurre porque la aplicación tiene algún error que necesita mostrar.

* Si se produce el siguiente error:

Unable to resolve service for type 'Microsoft.AspNetCore.Http.IHttpContextAccessor'


Añadiremos en el fichero Startup.cs:


2017/11/28

IIS deja de funcionar después de instalar actualización Windows 10

En la mayoría de las páginas que visitaba se daba la solución de reinstalar el módulo IIS URL Rewrite como indica en esta página: https://weblog.west-wind.com/posts/2015/jul/05/windows-10-upgrade-and-iis-503-errors 

Pero mi problema no era éste pues mi IIS no disponía de este módulo. 

Revisé el Visor de Sucesos o EventLog de mi sistema. En el apartado Registros de Windows | Aplicación, me encontré con este error: 

Error IIS-W3SVC-WP 2307

Busqué en la web por “IIS-W3SVC-WP error 2307” pero a pesar de ello, el problema no era el mismo: lo que leía no contemplaba la palabra ‘<EMPTY>’ que a mí me aparecía y en estas páginas no.
 Después de otorgar permisos a varias carpetas, reinstalar IIS Express, activar y desactivar características de Windows, e intentar otras soluciones más, encontré la siguiente que funcionó y espero que a ti, que has llegado hasta aquí, también te sirva: 

(antes de nada te aconsejo exportar las configuraciones que tengas en IIS como indica aquí: http://www.microsoftpro.nl/2011/01/27/exporting-and-importing-sites-and-app-pools-from-iis-7-and-7-5/

1) Para el IIS desde una consola de comandos y escribe iisreset /stop 

2) Borra el contenido de la carpeta c:\inetpub\temp\appPools, pero no la propia appPools pues es un directorio necesario. 

3) Pon en marcha otra vez IIS con iisreset /start 


Y ya debería funcionar todo. 

Yo tuve un problema adicional y es que uno de mis Sitios no llegaba a arrancar y solamente se me mostraba la sección de Administración con dos iconos (el Editor de Configuración y el Instalador de Plataforma Web). 

Me fijé que le faltaba un enlace (a la derecha Modificar Sitio | Enlaces…). Agregué el puerto 80 y solucionado.

2017/04/25

Configurar el IDE Atom a través de un proxy corporativo


Esta es la configuración que a mí me funcionó para configurar el IDE Atom mediante un proxy corporativo:


apm config set https-proxy = "http://(usuario sin dominio):password@direcciónIPProxy:8080"

apm config set proxy = "http://(usuario sin dominio):password@direcciónIPProxy:8080"


apm config set strict-ssl false



Saludos.

2017/03/18

Frecuencia de palabras de un texto usando Ruby (desde un archivo de texto)

2013/08/18

Instalar Rails 4.0.0 con Ruby 2.0.0 en Windows

Esta es la mejor forma que he podido probar:

1) Instala Ruby y DevKit. Descárgalos desde http://rubyinstaller.org/downloads/

2) Para instalar DevKit:
  • Extraelo en un directorio
  • Ejecuta ruby dk.rb init en consola
  • Modifica el archivo config.yml añadiendo dónde se encuentra el directorio en el que se ha instalado Ruby, en mi caso añadí la línea siguiente:
             '- C:\Ruby200-x64' (el guión inicial es importante y hay que añadirlo también)
  • Ejecuta ruby dk.rb install


3) gem install rails --version 4.0.0 

4) gem update y gem update --system , para actualizar las gemas

5) gem cleanup , para limpiar versiones de gemas antiguas

   = ejecución en consola

No Rakefile found (looking for: rakefile, Rakefile, rakefile.rb, Rakefile.rb)

Soluciones para arreglar este problema:

1. Dentro de la carpeta C:\Ruby200-x64\bin están los archivos rake y rake.bat. Muévelos a otra carpeta y ejecuta gem install rake

2. (opcional) Ahora ve al directorio de tu proyecto, si tienes uno,  y actualiza sus dependencias con bundle update

En mi caso, el problema es que el proyecto usaba rake v9 y al actualizarlo no me dejaba por tema de permisos de acceso. A pesar de tener rake.bat me salía este error (No Rakefile found), así opté por esta solución un poco 'radical' como es mover los archivos del mismo Rails (pero sin borrarlos por si acaso).

Al final se actualizó tanto rake a la versión 10 como todo el proyecto.

2013/05/17

Frecuencia de palabras de un texto usando Ruby (desde un archivo PDF)

Para aprender un idioma no cabe duda que primero hay que adquirir un buen vocabulario.
Estudié alemán en la universidad durante un semestre y siempre he echado de menos profundizar un poco más.
Se me presentó la duda de qué palabras eran más comunes en una lengua (dejando de lado las preposiciones) y en caso de ampliar mi vocabulario en una lengua extranjera porqué no ir aprendiendo aquellas que con más frecuencia aparecen en su literatura.

Así pues he escrito este script en Ruby que lee un pdf y extrae las frecuencias de repetición de sus palabras.
Nota: Se necesita instalar la gema pdf-reader (https://github.com/yob/pdf-reader)


2013/05/02

Limpiar la lista de impresión de forma efectiva en Windows

Para esas impresiones que se quedan en cola y a pesar de 'Cancelar todos los documentos' o cancelar un solo documento, apagar la impresora o mirar si el cable de USB está en su posición siguen apareciendo, podemos utilizar este último y útil recurso:

1) Ejecutar 'Símbolo del sistema' como administrador (botón derecho -> menú contextual). Es decir ejecutar una ventana de comando en modo administrador.

2) Escribir las siguientes líneas paso a paso:


net stop spooler
del %systemroot%\system32\spool\printers\*.shd
del %systemroot%\system32\spool\printers\*.spl
net start spooler


Referencia:
http://support.microsoft.com/kb/946737

2013/02/18

Más cursos de formación

He terminado dos cursos de formación realizados con BDI , esta vez han sido 'Curso de Zend Framework 2'  y 'Curso Java EE y Frameworks MVC'.

* En el curso de Zend Framework 2 hemos dado:

  • Capítulo 1: Introducción a la estructura de Zend
  • Capítulo 2: Los módulos
  • Capítulo 3: Layout, Eventos y Servicios
  • Capítulo 4: Formularios y validaciones
  • Capítulo 5: Capa Modelo (Base de Datos)
  • Capítulo 6: Autenticación y Sesiones
  • Capítulo 7: Permisos Acl
  • Capítulo 8: Interacción con Ajax


 * El curso de Java EE y Frameworks MVC:

  • Arquitectura Multicapa de Java EE / j2ee
  • Herramientas que componen Java EE
  • Cómo obtener e instalar el software
  • Servidores de Aplicación
  • Modelo de aplicación j2ee
  • Tipos de Contenedores
  • Java Servlets
  • JSP y JSTL
  • Arquitectura MVC (Modelo, Vista y Controlador)
  • Framework Struts 2
    • JSP & JSTL / Struts Tags
    • El controlador de Struts Actions Support
    • Las acciones de Struts
    • El bean del formulario
    • Controladores Multi-action (Wildcard Mappings)
    • Tipos de Results
    • Formularios y Validación
    • Interceptando un requests – con Interceptor interface
    • Inyección de dependencia de parámetros del request a un POJO
    • Manejo de Sesiones HTTP desde ActionContext
    • Struts 2 CRUD – Preparable
    • Soporte i18n
    • Soporte a DAO
    • Struts2 con Hibernate
  • Spring Framework 3.0
    • Inyección de dependencias IOC
    • El Contenedor
    • Los beans
    • Autowiring – anotaciones
    • JSP & JSTL
    • ‘Plain-old’ JSPs versus JSTL
    • Librerías de Tag para Formularios
    • Tipos de Controllers
    • Handler mappings
    • Formularios y Validación
    • Interceptando un requests – con HandlerInterceptor interface
    • Manejo de Sesiones HTTP (SessionUtility)
    • Soporte a DAO
    • Modelo implementando JDBC
    • ORM Hibernate.
    • Configurando SessionFactory
    • El Hibernate Mapping
    • El HibernateTemplate
    • El Hibernate Dao Support
  • Servidor de Aplicaciones y EJB3
    • Introducción
    • Conceptos Generales.
    • Tipos de EJB.
    • Ciclo de vida de un EJB
    • EJB con estado v/s sin estado
    • ¿Qué es un bean de sesión?
    • EJB3 con GlassFish y JBoss
    • Interfaces Locales y Remotas
    • EJB Local vs Remoto.
    • Desplegar un EJB en el Servidor.
    • JAP – API de persistencia de entidades Java
    • Entidades y Anotaciones.
    • Campos y propiedades persistentes.
    • Claves Primarias en entidades.
    • Manejando entidades.
    • Persistencia en el componente EJB.
    • Lenguaje de Consulta de Persistencia Java.
    • JAP y Hibernate 3.
    • Implementando DAO con JAP (Modelo)
  • Configurando Hibernate CFG
  • La clase HibernateUtil
  • El Hibernate Mapping
  • Mapping anotados – Hibernate
  • Introducción EJB 3.0
  • JPA (Java Persistence API)
  • Mapping anotados – Java Api Persistencia (JAP)
(Temario extenso)

2012/11/12

Libro Head First Object Oriented Analysis and Design



 Acabo de terminar de leer el libro Head First Object-Oriented Analysis & Design

. Es un libro extenso de 600 páginas que abarca y resume los pasos para hacer 'great software' inlcuyendo los principios de diseño de orientación a objetos (muchos de ellos sacados de Bertrand Meyer y Robert C.Martin), la recogida de buenos requerimientos desde el cliente, los escenarios, los diagramas de uso, los casos de uso y características (Use Case Driven Development y Feature Driven Development), el 'domain analysis', características de la arquitectura de software, testeos y el Test Driven, programar por contrato y el 'Defensive Programming'.

Gracias a su amplitud se centra en muchos temas pero tal vez se echa en falta más concreción en algunos aspectos. De todas formas es un libro que recomiendo bien para repasar conceptos, bien para aprenderlos.

Es un libro muy afín como todos los de la serie Head First de O'Reilly.  Son libros pocos comunes en cuanto a la explicación de su contenido, lleno de imágenes, gráficos y situaciones corrientes lo que le hace ser un libro de aprendizaje ameno y rápido.

2012/10/31

Curso 'Programación Android para Móviles'

Gracias a BDI Formación por el curso 'Programación Android para Móviles' que, aunque introductorio, ha sido extenso y completo, abarcando los temas de Layouts (lineales, relativos y tablas), Menús, las Activity, los Intents, almacenamiento y Bases de Datos, y la interacción con Google Maps.
Un saludo.

MsiInv o cómo obtener información del software instalado en tu ordenador (en Windows)

Pues como dice el título, si quieres saber realmente qué software tienes instalado en tu computadora con el sistema operativo Windows, recom...