jueves, 7 de septiembre de 2017

¿Qué Web soporta desde tu dispositivo?

¿Puedo confiar en las funciones de la Plataforma Web para crear mi aplicación? Una visión general de las APIs HTML5 de integración de dispositivos Enlace web:

lunes, 7 de agosto de 2017

Uso de temas de Bootswatch para Jhipster

Requiere una versión mayor a la 4 de JHipster y cuya definición sea AngularJS

Para tener temas Bootswatch en lugar del tema por defecto sólo tiene que sustituir el css bootstrap con el css del tema bootswatch. Sin embargo, si desea un conmutador de tema fresco para cambiar entre los temas de Bootswatch dinámicamente, a continuación, siga esta sugerencia.




Nota: reemplace ‘pscApp’ con el nombre generado de su aplicación.

Agrege los siguientes ficheros:

Controlador


Agrega el siguiente controlador como bootswatch.controller.js bajo la ruta webapp/app/components/bootswatch
(function() {
 'use strict';
 
    angular
        .module('pscApp')
        .controller('BootswatchController', BootswatchController);

    BootswatchController.$inject = ['$scope', 'BootSwatchService'];

 function BootswatchController ($scope, BootSwatchService) {

   /*Get the list of availabel bootswatch themes*/
   BootSwatchService.get().then(function(themes) {
    $scope.themes = themes.themes;
    $scope.themes.unshift({name:'Default',css:''});
    //$scope.themes.push({name:'Default',css:''});
   });
   
 }

})();

Servicio


Agrega el siguiente servicio como bootswatch.service.js bajo la ruta webapp/app/components/bootswatch
(function() {
 'use strict';
 
    angular
        .module('pscApp')
        .factory('BootSwatchService', BootSwatchService);

    BootSwatchService.$inject = ['$http'];

 function BootSwatchService ($http) {
  return {
   get: function() {
    
    return $.getJSON("https://bootswatch.com/api/3.json", function (data) {
      return data.themes;
    } );

   }
  };
 }
 
})();

Directiva


Agrega la siguiente directiva como bootswatch.directive.js bajo la ruta webapp/app/components/bootswatch
(function() {
 'use strict';
 
    angular
        .module('pscApp')
        .directive('jhSwitchTheme', jhSwitchTheme);

    function jhSwitchTheme () {
  /*Directive binds to anchor to update the bootswatch theme selected*/
  return {
   restrict: 'A',
   scope: {
    theme : '=jhSwitchTheme'
   },
   link: function (scope, element, attrs) {
    var currentTheme = $("#bootswatch-css").attr('title');
    if(scope.theme.name === currentTheme){
     element.parent().addClass("active");
    }

    element.on('click',function(){
     $("#bootswatch-css").attr("href", scope.theme.css);
     $(".theme-link").removeClass("active");
     element.parent().addClass("active");
    });
   }
  };
 }

})();

En el index.html:


Agregue lo siguiente al archivo index.html después de la tarea de construcción CSS vendor.css para que éstas no se minifiquen y compacten por tarea de compilación.

Añada en el header
    
    
 ...
    
    
 
 
    
    
    
    

Añada lo siguiente en el pie de página
        


Agrege los siguientes script tags en el fichero index.html manualmente. Si ‘gulp inject’ falla, recibirá errores de angular
    
 
 
 

jueves, 12 de enero de 2017

Agregar "Abrir con Notepad++" para el menú contextual del Explorador de Windows

Abrimos el cmd ( "Windows + R" y escribimos "cmd" ) con permiso de administrador  y copamos el siguiente código. Pulsamos intro y, "Listo".

Nota: Revisa el directorio (notepadPath) donde tienes instalado el programa notepad++. En mi caso particular, notepad se encuentra en la siguiente ruta C:\Program Files (x86)\npp.7.2\ 
 
@echo off
SET notepadPath=C:\Program Files (x86)\npp.7.2\notepad++.exe
 
rem add it for all file types
@reg add "HKEY_CLASSES_ROOT\*\shell\Open with notepad++"         /t REG_SZ /v "" /d "Open with notepad++"   /f
@reg add "HKEY_CLASSES_ROOT\*\shell\Open with notepad++"         /t REG_EXPAND_SZ /v "Icon" /d "%notepadPath%,0" /f
@reg add "HKEY_CLASSES_ROOT\*\shell\Open with notepad++\command" /t REG_SZ /v "" /d "%notepadPath% %1" /f 

rem add it for folders
@reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with notepad++" /t REG_SZ /v "" /d "Open with notepad++" /f
@reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with notepad++" /t REG_EXPAND_SZ /v "Icon" /d "%notepadPath%,0" /f
@reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with notepad++\command" /t REG_SZ /v "" /d "%notepadPath% %1" /f
pause

A modo de ejemplo vamos a hacerlo lo mismo para Brackets, para ver que es aplicable para todos los programas.

@echo off
SET st2Path=C:\Program Files (x86)\Brackets\Brackets.exe
 
rem add it for all file types
@reg add "HKEY_CLASSES_ROOT\*\shell\Open with Brackets"         /t REG_SZ /v "" /d "Open with Brackets"   /f
@reg add "HKEY_CLASSES_ROOT\*\shell\Open with Brackets"         /t REG_EXPAND_SZ /v "Icon" /d "%st2Path%,0" /f
@reg add "HKEY_CLASSES_ROOT\*\shell\Open Brackets\command" /t REG_SZ /v "" /d "%st2Path% \"%1\"" /f 

rem add it for folders
@reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with Brackets" /t REG_SZ /v "" /d "Open with Brackets" /f
@reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with Brackets" /t REG_EXPAND_SZ /v "Icon" /d "%st2Path%,0" /f
@reg add "HKEY_CLASSES_ROOT\Folder\shell\Open with Brackets\command" /t REG_SZ /v "" /d "%st2Path% \"%1\"" /f
pause

jueves, 21 de julio de 2016

Aumentar la velocidad de la instrucción DELETE para Oracle

El uso de hints puede ayudarte a aumentar la velocidad de una instrucción. El hint PARALLEL no fuerza la ejecución en paralelo, pero puede modificar el grado de parallelismo de una tabla para que ORACLE use este coste aproximado.


  • Si el tiempo de tardanza se produce durante la búsqueda de candidatos a borrar, entonces puedes usar los siguientes hints para ayudar a agilizar:

Para Full Table Scan

delete /*+ parallel(a,4) full(a) */
from cam_tab_meta a
where db_name like 'cam01'

Para Index Fast Full Scan

delete /*+ parallel_index(a,4) index_ffs(a) */
from cam_tab_meta a
where db_name like 'cam01'


  • Si el tiempo de tardanza pasa en la etapa de eliminar filas, entonces se puede utilizar DML paralelo que se encuentra desactivado por defecto, por lo que se debe primero activar dml:

Enable Parallel dml

alter session enable parallel dml;

delete /*+ parallel(a,4) full(a) */
  from cam_tab_meta a
 where db_name like 'cam01'

martes, 17 de noviembre de 2015

Eliminar varias lineas del log o de un fichero de texto para mejorar la lectura

Si tienes un fichero Log y deseas eliminar varias lineas para leer mejor el fichero, te enseñare un truco para trabajarlo con Notepad++

  1. Ir al Menú: Buscar / Buscar, pestaña Mark.
    • Activar el checkbox Marcar Línea. Si lo necesitamos, usamos expresiones regulares o pedimos que diferencia las mayúsculas de las minúsculas.
  2. Pulsar el botón Buscar todo
Notepad Mark


Una vez marcadas las lineas podemos eliminar las marcas:
  1. Menú: Buscar / Marcador / Borrar lineas marcas
O podemos invertir la selección y borrar las marcadas. Todo a gusto del consumidor!
  1. Menú: Buscar Marcador Invertir marcadores
  2. Menú: Buscar Marcador Borrar lineas marcas


viernes, 23 de octubre de 2015

Estimaciones de Software

El error más común de los analistas y programadores de software es estimar de menos. Sabemos que esto ocurre en otras ingenierías (quién no ha oído algún amigo al que le costó el doble de lo previsto la construcción de una casa inicialmente, quién no ha leído de proyectos de autopistas, puentes, grandes represas, que han terminado costando varias veces más de lo presupuestado…), pero parece ser que el caso del software es más sencillo.

¿Sabes conducir un coche o una moto? Alguna vez te has planteado: ¿Cuánto tiempo te lleva ir de Madrid a Moscú (ida y vuelta)? ¿Cuánto gastarás en combustible? Si tu jefe te dice que estés esta tarde en Moscú para una reunión: ¿Llegarás a tiempo? Estoy completamente seguro que te preguntarás lo mismo que nos preguntamos todos: Tipo de Transporte, Medios de Transporte, Costes, Guías, Mapas… Y qué sucede si además tu jefe te dice que solamente dispones de una moto para ahorrar costes! y adicionalmente sin GPS, sin mapas... Y a la final recibes una moto de bajo cilindraje (una vespa).

Estoy seguro que proyectos de informática en los que trabajaras, y que se plantean este tipo de situaciones, encontrarán la misma respuesta en el momento de estimar la construcción y puesta en marcha de un software. AL AZAR Y QUE DIOS NOS PILLE CONFESADOS!

jueves, 25 de junio de 2015

Trazas en el log de webservices


El siguiente código te permitirá imprimir en el log las trazas de entrada y salida de un servicio web:

Si usas JDK 7 en adelante:

 static {
        System.setProperty("com.sun.xml.ws.transport.http.client.HttpTransportPipe.dump", "true");
        System.setProperty("com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.dump", "true");
        System.setProperty("com.sun.xml.ws.transport.http.HttpAdapter.dump", "true");
        System.setProperty("com.sun.xml.internal.ws.transport.http.HttpAdapter.dump", "true");
    }

Si es anterior, puedes usar un Handler:

LogMessageSOAPHandler.java

package com.ws.handler;

import java.util.Collections;
import java.util.Iterator;
import java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.MimeHeader;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.ws.util.XMLFormatUtil;

public class LogMessageSOAPHandler implements SOAPHandler {

    private static final Logger LOGGER = LoggerFactory.getLogger(LogMessageSOAPHandler.class);

    private String getMessageEncoding(SOAPMessage msg) {
        String encoding = "UTF-8";
        try {
            if (msg.getProperty(SOAPMessage.CHARACTER_SET_ENCODING) != null) {
                encoding = msg.getProperty(SOAPMessage.CHARACTER_SET_ENCODING).toString();
            }
        } catch (SOAPException e) {
            LOGGER.warn("Error when trying to obtain encoding character from SoapMessage, set {} by default", encoding, e);
        }
        return encoding;
    }

    private void logSoapMessage(SOAPMessageContext context) {
        String headerTrace = "[SOAP MESSAGE]:";
        boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);
        if (outbound) {
            LOGGER.debug("{} Direction=outbound", headerTrace);
        } else {
            LOGGER.debug("{} Direction=inbound", headerTrace);
        }

        SOAPMessage msg = context.getMessage();
        if (msg == null) {
            LOGGER.warn("{} Message is null", headerTrace);
            return;
        }

        LOGGER.debug("{} Mime Headers: ", headerTrace);
        // infer generytype
        @SuppressWarnings("unchecked")
        Iterator allHeaders = msg.getMimeHeaders().getAllHeaders();
        while (allHeaders.hasNext()) {
            MimeHeader mh = allHeaders.next();
            String mime = new StringBuffer().append("name=").append(mh.getName()).append(", value=").append(mh.getValue()).toString();
            LOGGER.debug(mime);
        }

        try {
            LOGGER.debug("{} \n {}", headerTrace, XMLFormatUtil.prettyFormat(msg, 2, getMessageEncoding(msg)));
        } catch (Exception e) {
            LOGGER.warn("Error trying to trace soap message", e);
        }

    }

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        logSoapMessage(context);
        return true;
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        logSoapMessage(context);
        return true;
    }

    @Override
    public void close(MessageContext context) {
        // Do nothing because this handler use to print inboud or outbound
        // message
    }

    @Override
    public Set getHeaders() {
        return Collections.emptySet();
    }
}
(PARA CLIENTE)
LogHandlerResolver.java


package com.ws.handler;

import java.util.ArrayList;
import java.util.List;

import javax.xml.ws.handler.Handler;
import javax.xml.ws.handler.HandlerResolver;
import javax.xml.ws.handler.PortInfo;


public class LogHandlerResolver implements HandlerResolver {


    @SuppressWarnings("rawtypes")
    @Override
    public List getHandlerChain(PortInfo portInfo) {
        List handlerChain = new ArrayList();
        // Add log web service
        handlerChain.add(new LogMessageSOAPHandler());
        return handlerChain;
    }

}

(PARA SERVIDOR)
handler-chain.xml
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<javaee:handler-chains xmlns:javaee="http://java.sun.com/xml/ns/javaee" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <javaee:handler-chain>
  <javaee:handler>
   <!-- log soap message on publisher service -->
   <javaee:handler-class>com.inetpsa.ped.manager.ws.handler.LogMessageSOAPHandler</javaee:handler-class>
  </javaee:handler>
 </javaee:handler-chain>
</javaee:handler-chains>


Codigo Servidor:
package com.ws.ressources;

import javax.inject.Inject;
import javax.jws.HandlerChain;
import javax.jws.WebService;
import javax.xml.ws.soap.Addressing;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Addressing(enabled = true, required = false)
@WebService(targetNamespace = "http://xml.ws.com/ReferentielFabrication", endpointInterface = "com.gen.resources.DemandeAlerteServicePortType", serviceName = "DemandeAlerteService", portName = "DemandeAlerteServiceHttpPort")
@HandlerChain(file = "handler-chain.xml")
public class DemandeAlerteWebServiceImpl implements
DemandeAlerteServicePortType {

private static final Logger LOGGER = LoggerFactory.getLogger(DemandeAlerteWebServiceImpl.class);

@Inject
public AlerteService alerteService;

@Override
public ReponseAlerteType alerte(DemandeAlerteType demandeale)
throws ServiceException_Exception {

}

}
Codigo Cliente:
public void callWebService() throws Exception {

// call webservice
WebServiceClient webServiceClient = AbonnementCalendrierService2.class.getAnnotation(WebServiceClient.class);
URL wsdlURL = AbonnementCalendrierService2.class.getClassLoader()
.getResource(WSDL_FILE_PATH);
AbonnementCalendrierService2 client = new AbonnementCalendrierService2(
wsdlURL, new QName(webServiceClient.targetNamespace(),
webServiceClient.name()));

// Add log xml ws message
client.setHandlerResolver(new PedLogHandlerResolver());

// Add WS-Addressing
AddressingFeature addressingfeature = new AddressingFeature();

AbonnementCalendrierService2PortType port = client.getAbonnementCalendrierService2HttpPort(addressingfeature);

if (IS_HTTP_TRANSPORT) {

((BindingProvider) port).getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, uriHttpService);

LOGGER.debug("Sending soap message to {}", uriHttpService);
} else {

((BindingProvider) port).getRequestContext().put(
BindingProvider.ENDPOINT_ADDRESS_PROPERTY, uriJmsService);

// Add a port to the Service
client.addPort(new QName(webServiceClient.targetNamespace(),
webServiceClient.name()),
SOAP_JMS_SPECIFICATION_TRANSPORTID, uriJmsService);

LOGGER.debug("Sending soap message to {}", uriJmsService);
}

NotificationAbonnementType2 notificationAbonnement2 = new NotificationAbonnementType2();
notificationAbonnement2.setDateMAJ("12/01/2001");
port.abonnement(notificationAbonnement2);

}