24 de diciembre de 2018

:: Estándar europeo sobre accesibilidad de sitios web y aplicaciones móviles

Publicado el estándar armonizado europeo sobre accesibilidad de sitios web y aplicaciones móviles (21/12/2018).

Este estándar se ha publicado en el Diario Oficial de la Unión Europea la Decisión de Ejecución (UE) 2018/2048 de la Comisión, de 20 de diciembre de 2018 , sobre la norma armonizada aplicable a los sitios web y a las aplicaciones para dispositivos móviles redactada en apoyo de la Directiva (UE) 2016/2102 del Parlamento Europeo y del Consejo. Es decir, la declaración como estándar armonizado de la norma "EN 301 549 V2.1.2 (2018-08). Requisitos de accesibilidad para los productos y servicios de las TIC"

Por lo tanto, desde hoy 21 de diciembre de 2018, el estándar a cumplir por las Administraciones Públicas españolas en sus sitios web es el EN 301 549 v2.1.2 (2018-08). En el caso de las aplicaciones móviles aplicará a partir del 23 de Junio de 2021.

Más información: https://goo.gl/shQCya

16 de noviembre de 2018

:: ¿Por qué deberíamos aprender Python?


Python es el lenguaje preferido por muchos desarrolladores por el énfasis que hace en la productividad y la legibilidad, especialmente cuando se compara con otros lenguajes como Java, PHP y C ++.

Profesionalmente, Python es ideal para el desarrollo web back-end, el análisis de datos, la inteligencia artificial y la computación científica. A continuación explicaremos las razones por las que es interesante aprender Python:



Lenguaje Popular

Actualmente, Python es el lenguaje más popular en TI. Es un lenguaje de programación general, interactivo, interpretado y de alto nivel. Python fue adoptado como un lenguaje de programación para casi todos los dominios de TI, incluyendo Pruebas de software, Desarrollo web, Big Data Hadoop, Computación en la nube, Ciencia de datos, AWS, VMware, OpenStack y Google Cloud.

Flexible y fácil de entender

Python fue diseñado para ser fácil de entender y divertido de usar. Puedes crear prototipos y herramientas rápidamente con Python. Por lo tanto, Python ha ganado popularidad por ser un lenguaje amigable para los principiantes. Además, al ser un lenguaje de muy alto nivel, Python se lee como en inglés, esto elimina una gran cantidad de estrés en el aprendizaje de la sintaxis de la codificación de los principiantes. Python nos libera de mucha de la complejidad en la programación, por lo que es muy fácil para los principiantes, ya que les permite centrarse en aprender conceptos de programación y no tener que preocuparse por demasiados detalles.

Grandes firmas apuestan por Python

Muchas grandes empresas como IBM, Yahoo, Google, Nokia, Disney, Mozilla, NASA y mucho más dependen en gran medida de Python. De hecho, Python es uno de los lenguajes preferidos de Google, siempre están contratando expertos y han creado muchos de sus productos populares con él.

Debido a que estas compañías utilizan Python, siempre están buscando profesionales con talento que hayan trabajado en Python. También podemos convertirnos en expertos en Python uniéndonos a Python Course. Siempre hay una demanda para los desarrolladores web de Python.

Python es flexible

Hay varias implementaciones robustas de Python integradas con otros lenguajes de programación.

  • CPython, una versión con C
  • Jython, o Python integrado con Java
  • IronPython, que está diseñado para ser compatible con .NET y C #
  • PyObjc, o Python escrito con los juegos de herramientas ObjectiveC
  • RubyPython, o Python combinado con Ruby

Python se utiliza en Ciencia de Datos

Sea cual sea el trabajo que estemos buscando, los datos formarán parte de este, incluidas las operaciones de TI, el desarrollo de software, el marketing, etc. En breve, las habilidades de análisis de datos serán tan importantes como las habilidades de codificación, y Python tiene una fuerte presencia en ambas áreas. Junto al lenguaje R, Python es el lenguaje más utilizado en la ciencia de datos moderna; de hecho, las publicaciones de Python superan en número a las publicaciones de R en el campo de la ciencia de datos. Las habilidades que adquiramos mientras aprendemos Python influirán en nuestra habilidades analíticas.

Recursos ilimitados y marco de pruebas

Un desarrollador de python, cuando lo necesite, puede acceder a una gran cantidad de recursos como manuales de referencia, libros, tutoriales, vídeos, foros, etc. Si un desarrollador tiene alguna duda o algún problema técnico, puede buscar ayuda de miles de miembros de la comunidad de Python en foros, Twitter, Facebook, sitios de preguntas y respuestas, prácticamente en todas partes.

Debido a que Python es un lenguaje de código abierto, siempre hay personas que intentan mejorarlo, actualizándolo con las tendencias actuales, presentando nuevas versiones del lenguaje.

Es el preferido para desarrollo web

La programación web con python ofrece muchas opciones, ya que python tiene una gran variedad de marcos para desarrollar sitios web. Los frameworks web que ofrece python son: Pylons, Django, Zope2, TurboGears, web.py, Grok, web2py, etc.

La codificación de un programa que lleva horas en PHP se puede hacer en minutos usando Python. Además, el código Python es mucho más rápido y estable. Luego viene Flask, otro framework web de Python, simple y construido para la personalización

Si bien la mayoría de los sitios web todavía se ejecutan en PHP, muchas aplicaciones web nuevas se están construyendo con Python. Python es más flexible; Se puede utilizar para proyectos pequeños, grandes, en línea y fuera de línea. Es el único lenguaje de scripting que necesitaremos para comenzar a diseñar nuestras propias aplicaciones y sitios web.


Fuente: https://www.javatips.net/blog/7-reasons-why-you-should-learn-python

26 de octubre de 2018

:: Acceso a versiones de una web. Web Archive

A veces necesitamos acceder a una versión de una web publicada para -por ejemplo- comprobar un diseño. Para llevar a cabo esta tarea, podríamos consultar la página cacheada por lo motores de búsqueda, o bien acceder a: https://web.archive.org

De esta manera, el portal guarda periódicamente un "snapshot" del portal, pudiendo acceder por las fechas registradas.


De la misma manera, en cualquier momento podemos indicar que deseamos generar un nuevo snapshot.

22 de octubre de 2018

:: Alfresco. Aspecto: "Enviado por email" (TIP)

Dentro de Alfresco, disponemos de una regla de contenido que nos permite añadir un aspecto a por ejemplo: todos los documentos que entren en esta carpeta.
De esta manera, para estos documentos, se les añadirán los siguientes campos de sólo lectura (no son editables):
  • De
  • Fecha de envío
  • Para
  • CC
  • Asunto
Si los documentos que subimos a nuestro Alfresco no son de tipo "eml", tendremos que generar un script que asigne la meta información oportuna. En el caso de que estemos utilizando la herramienta de importación: FileSystem Bulk Import, podríamos preparar un fichero de propiedades.
Si el fichero a subir se llama por ejemplo: "correo.html", nuestro fichero de propiedades deberíamos nombrarlo: "correo.html.metadata.properties".

El contenido de este último podría ser algo similar a lo siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
  <entry key="cm:originator">noreply@gmail.com</entry>
  <entry key="cm:addressee">netic360@gmail.com</entry>
  <!--<entry key="cm:addressees">Impresora multifunción</entry>-->
  <entry key="cm:subjectline">Aceptación presupuesto: IN1213421435</entry>
  <entry key="cm:sentdate">2018-01-01</entry>
  <entry key="cm:description">Documento de tipo correo electrónico</entry>
</properties>


15 de octubre de 2018

:: Alfresco. Configuración del buscador avanzado sobre un tipo de datos personalizado

Una vez tenemos definido un tipo personalizado de datos, por ejemplo: facturas con los siguientes campos:
-  Número de factura
- Año
- Fecha
- NIF
- Número de proveedor
- Concepto

y el buscador para este tipo de datos, es posible que necesitemos configurar este para que únicamente nos permita llevar a cabo búsquedas por unos determinados campos. Por ejemplo, para que nos permita buscar -únicamente- por el número de factura.

Para llevar cabo esta parametrización, debemos realizar las siguientes modificaciones:

En el fichero "share-config-custom.xml" ubicado en la carpeta: "tomcat/shared/classes/alfresco/web-extension" donde tenemos definido el formulario a mostrar para el tipo de datos personalizado, debemos definir el correspondiente que se mostrará en la búsqueda:

Si el formulario que tenemos definido para el tipo de datos siguiente:

<config evaluator="model-type" condition="fac:facturanetic360">
    <forms>
   <form>
   <field-visibility>
      <show id="fac:nfactura" />
      <show id="fac:anio" />
      <show id="fac:fecha" />
      <show id="fac:nif" />
      <show id="fac:nproveedor" />
      <show id="fac:concepto" />
    </field-visibility>
    <appearance>
    <set id="facturanetic360set" appearance="fieldset" label-id="set.fac_facturanetic360set"/>
    
    <field id="fac:nfactura" label-id="prop.fac_nfactura" set="facturanetic360set" />
    <field id="fac:anio" label-id="prop.fac_anio" set="facturanetic360set" />
    <field id="fac:fecha" label-id="prop.fac_fecha" set="facturanetic360set" />
    <field id="fac:nif" label-id="prop.fac_nif" set="facturanetic360set" />
    <field id="fac:nproveedor" label-id="prop.fac_nproveedor" set="facturanetic360set" />
    <field id="fac:concepto" label-id="prop.fac_concepto" set="facturanetic360set"/>
   </appearance>
   </form>
    </forms>
 </config>


Tendremos que añadir el formulario para la búsqueda:

<form id="search">
   <field-visibility>
      <show id="fac:nfactura" />
    </field-visibility>
    <appearance>
    <set id="facturanetic360set" appearance="fieldset" label-id="set.fac_facturanetic360set"/>
    
    <field id="fac:nfactura" label-id="prop.fac_nfactura" set="facturanetic360set" />
   </appearance>
   </form>



Más información: https://community.alfresco.com/docs/DOC-6013-share-advanced-search

7 de octubre de 2018

:: "Gold plating" en gestión de proyectos

"Gold Plating" en gestión de proyectos o en gestión del tiempo en general, es un término utilizado para describir el error de trabajar en un proyecto o tarea más allá de su alcance.
Por ejemplo, después de haber obtenido los requisitos, el Project Manager o el desarrollador trabajan en mejoras sobre el producto, pensando que el cliente estará encantado de ver características adicionales o mejoradas, más allá de lo que nos había solicitado o este esperaba.
El cliente, podría no estar satisfecho con los resultados, y el esfuerzo extra del desarrollador sería inutil.

"Gold Plating" está también considerada una mala práctica por diferentes metodologías o mejores prácticas en la gestión de proyectos, como PMBOK o PRINCE2. En este caso, "Gold plating" significa añadir cualquier característica adicional no considerada en el alcance inicial (PMBOK) o descripción del producto (PRINCE2), en cualquier punto del proyecto.
Esto es debido a que introduce una nueva fuente de riesgos al plan original, tales como: pruebas adicionales, generación de documentación, costes o tiempos.
Sin embargo, "Gold plating" no impide añadir nuevas características al proyecto en cualquier momento, pero siempre ha de tenerse en cuenta el procedimiento oficial de cambios, e impacto del cambio en todas las áreas del proyecto.

1 de octubre de 2018

:: MantisBT. SYSTEM WARNING: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead

Después de obtener este tipo de mensaje en la instancia de MantiBT instalada: "SYSTEM WARNING: preg_replace(): The /e modifier is no longer supported, use preg_replace_callback instead", el problema se debía- en mi caso- al plugin: "Formateado MantisBT 1.0a".

Como solución a este tipo de mensajes, los pasos seguidos fueron acceder a la configuración de este y deshabilitar: "URL Processing".


Tras este cambio, parece que el problema se solucionó y ya no se muestran ese tipo de mensajes.

24 de septiembre de 2018

:: Alfresco. Búsqueda de carpetas (Tip)

En este caso, y a modo de recordatorio, un ejemplo de cómo podemos utilizar el buscador de Alfresco para acotar los resultados de acuerdo a nuestras necesidades.

Por ejemplo, para buscar las carpetas incluidas en nuestro Alfresco, que se llamen: "video" (que contengan este literal), la búsqueda a realizar, sería algo similar a esto:


TYPE:'cm:folder' video

De esta manera, de acuerdo al criterio de búsqueda especificado, los resultados devueltos podrían ser algo como lo mostrado a continuación:

17 de septiembre de 2018

:: Mails que se autodestruyen. GMail

En GMail es ahora posible enviar correos electrónicos con una fecha de caducidad, es decir, en una determinada fecha tras su envío, estos se eliminarán.

Para llevar a cabo la definición de este tipo de correos electrónicos, los pasos a seguir son los siguientes:

.- Pulsamos el botón: "Redactar" e insertamos la información necesaria: destinatario, asunto, descripción,...

.- Activamos el modo confidencial


.- Parametrizamos el modo confidencial, definiendo cuando "caducará" el correo electrónico.



.- Tras la definición de estos parámetros y tras su envío, este correo electrónico será auto-eliminado  transcurrida una semana

6 de septiembre de 2018

:: Alfresco. Importación de metadatos

Cuando llevamos a cabo una importación de documentos en Alfresco utilizando la herramienta: "Bulk FileSystem Import" necesitamos asociar una serie de metadatos a cada uno de los documentos.

Para este proceso de asociación de metadatos en la carga masiva de documentos, necesitaremos generar el fichero con la metainformación oportuna.

Si por ejemplo tenemos un fichero: "fichero-1.pdf" de tipo factura (el tipo de datos ya lo tendremos definido en nuestro Alfresco), para asociarles la metainformación, necesitaremos disponer de fichero .xml  que se llame: "fichero-1.pdf.metadata.properties.xml" con el siguiente contenidos


< ?xml version="1.0" encoding="UTF-8"?>
< !DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
< properties>
  < entry key="fact:proveedor">epson</entry>
  < entry key="fact:fecha">2018-05-18</entry>
  < entry key="fact:concepto">Impresora multifunción</entry>
  < entry key="fact:nif">0000000</entry>
  < entry key="fact:nfactura">152</entry>
  < entry key="cm:description">Documento de tipo factura.</entry>
< /properties>

Una vez tengamos todos los ficheros .xml preparados con la metainformación a asociar, accederemos a la herramienta "Bulk FileSystem Import" y especificaremos las rutas necesarias:

http://{Alfresco}/alfresco/service/bulkfsimport




31 de agosto de 2018

:: Alfresco. Creación de un "tenant"

¿Qué es Multitenant en Alfresco?
De una forma sencilla, podríamos decir que con una única instalación de Alfresco, podemos tener "alfrescos" independientes para nuestros clientes. Es decir, a partir de un único .war, tendremos distintos repositorios físicos independientes.



Creación de un tenant
Para definir un "tenant" en Alfresco, debemos seguir una serie de pasos que describiremos a continuación:
1.- Como usuario administrador, accederemos a la consola de administración
http://localhost:8383/alfresco/

Seleccionaremos la entrada denominada: "Alfresco Administration Console"



2.- En la consola de administración, seleccionamos la entrada: "Consola de  inquilino"


3.- Tras seleccionar esta entrada, nos mostrará la consola desde la que podemos llevar a cabo la creación del tenant.
Disponemos de un comando de ayuda: "help" el cual nos mostrará la sintaxis y operaciones que podemos llevar a cabo desde la consola

4.- Insertaremos la siguiente instrucción:
create netic360.com netic360$18

De esta manera, crearemos un tenant denominado: "netic360.com" con la clave de administración: "netic360$18)"


5.- Una vez creado este tenant, podemos ejecutar la instrucción: "show tenant" para comprobar que efectivamente se ha creado.


6.- Cerramos sesión y a continuación nos loguearemos en el tenant creado.
Las credenciales de acceso serán:
usuario: admin@netic360.com
clave: netic360$18


Sobre el nuevo tenant creado, trabajaremos con normalidad, creando sitios, definiendo reglas, tipos de contenidos, ....

Más información sobre MT en Alfresco y características no soportadas:
https://docs.alfresco.com/5.2/concepts/mt-not-implemented.html


27 de agosto de 2018

:: IIS 7 sobre Win7. Problemas

Hace poco perdí unas cuantas horas intentando averiguar qué es lo que le había pasado a mi Internet Information Services (IIS) porque había "desaparecido" el sitio: "Default Web Site".
A la hora de instalarlo de nuevo, me creaba un sitio denominado: "Site_1" y no me funcionaba, generando varios errores.

Describiremos -únicamente a modo de recordatorio- los pasos que seguí para solucionarlo:

1.- Accedemos a  "Activar o desactivar las características de Windows"

2.- En este punto procedemos a des-instalar "Internet Information Services" y lo que es más importante: "Servicio WAS (Windows Process Activation Service)", ya que sin des-instalar esta opción, en la re-instalación creaba de nuevo el sitio "Site_1" y no funcionaba.


3.- Tras des-instalar tendremos que reiniciar el equipo

4.- Una vez reiniciado, eliminaremos la carpeta: "Inetpub" (previamente haremos una copia de seguridad), y en Windows/system32/ eliminamos la carpeta "inetsrv".

5.- Posteriormente accederemos a "Activar o desactivar las características de Windows" y procederemos a instalar de nuevo IIS y WAS

6.- Reiniciamos de nuevo el equipo y tras acceder al "Administrador de Internet Information Services (IIS)" comprobaremos que se ha regenerado de nuevo el sitio web por defecto y todo parece que funciona con normalidad.



20 de agosto de 2018

:: Alfresco. Importación de metadatos con Bulk Filesystem Import Tool

Alfresco dispone de una herramienta para llevar a cabo la importación masiva de documentos, denominada: Bulk Filesystem Import Tool.

En esta herramienta debemos especificar la ruta origen (visible desde el servidor) y la ruta destino donde se ubicarán los documentos importados.
http://{servidor-alfresco}/alfresco/service/bulkfsimport



Además de los documentos, podemos preparar previamente una serie de ficheros de metadatos, denominados "shadow metadata files" que contendrán la metainformación de cada uno de ellos.

De esta manera, si por ejemplo los ficheros a importar son facturas y disponemos de esta metainformación, podemos generar un fichero xml asociado el fichero.

Como caso de prueba, disponemos de un tipo de datos personalizado, denominado: "factura" con los siguientes campos:
- Proveedor
- Fecha
- Concepto
- Nif
- Nº factura

Si el documento (factura) se llama "fichero 1.pdf" tendremos que generar un fichero xml nombrado: "fichero 1.pdf.metadata.properties.xml". Este fichero xml contendrá la siguiente información:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
  <entry key="fact:proveedor">epson</entry>
  <entry key="fact:fecha">2018-05-18</entry>
  <entry key="fact:concepto">Impresora multifunción</entry>
  <entry key="fact:nif">0000000</entry>
  <entry key="fact:nfactura">152</entry>
  <entry key="cm:description">Documento de tipo factura.</entry>
</properties>


Una vez finalizada la importación de los ficheros, tendremos en Alfresco la información asociada a estos:

Más información: https://github.com/pmonks/alfresco-bulk-import/wiki/Preparing-the-Source-Content

13 de agosto de 2018

:: JsBarCore. Librería para generar códigos de barras

En ocasiones, para nuestros desarrollos, necesitamos generar códigos de barras, por lo que podemos tener en cuenta esta librería javascript: JsBarCode.

Un ejemplo de uso de la misma podría ser el siguiente:

En primer lugar debemos descargar la librería y referenciarla en nuestro código:
http://lindell.me/JsBarcode/#download


<html>
<head>
 <script src="JsBarcode.all.min.js"></script>
</head>
<body>
 <svg id="barcode"></svg>
 <script>
  JsBarcode("#barcode", "Hi world!");
 </script>
</body>
</html>


6 de agosto de 2018

:: Liferay. Crear nuevos tipos de contenido

Cuando estamos creando un contenido y lo categorizamos, los tipos que  nos aparecen son por ejemplo: Contenido web o Noticias


A modo de prueba de concepto, crearemos en Liferay un nuevo tipo de contenido web.Para ello, los pasos a seguir son los siguientes:

1.- En el fichero portal-ext.properties modificaremos la linea siguiente, añadiendo los nuevos tipos de contenido necesarios:
journal.article.types=general,news,  contracts, blogs

2.- Modificaremos los literales de traducción oportunos, editando los ficheros de idiomas necesarios

3.- Tras reiniciar el servicio, podremos ver los nuevos tipos de contenido


1 de agosto de 2018

::Alfresco. Algunas tablas útiles

En posts anteriores describimos cómo podíamos extraer el modelo de datos que está por detrás de Alfresco, siempre y cuando tengamos acceso a la base de datos.

En ocasiones, puede resultar de utilidad realizar alguna consulta directa sobre determinadas tablas, para obtener información detallada. Algunas de las tablas interesantes a tener en cuenta son las siguientes:

alf_store: Contiene información sobre los almacenes disponibles en Alfresco

alf_node: Contiene información sobre los distintos nodos de Alfresco; hay que recordar que en Alfresco todo está representado por nodos

alf_qname: Contiene los nombres de los tipos de propiedades

alf_node_properties: Contiene información sobre las propiedades de los modelos de datos de Alfresco (documentos, carpetas, usuarios,...)


25 de julio de 2018

:: Evitar indexación por parte de los motores de búsqueda

Para evitar la indexación de nuestro portal web por parte de los motores de búsqueda podemos llevar a cabo distintas tareas:

robots.txt
Generar un fichero robots.txt con el siguiente contenido:

User-Agent: *
Disallow: /

Metaetiqueta
En el tema, podríamos insertar la siguiente metaetiqueta

<meta name="robots" content="noindex, nofollow" />


httpd.conf
En el fichero http.conf localizaremos la línea siguiente

Options Includes Indexes FollowSymLinks MultiViews


Eliminamos el literal: "Indexes"
Reiniciaremos el Apache

.htaccess
En el fichero .htaccess añadiremos la siguiente línea:

Header set X-Robots-Tag "noindex, nofollow"


También podemos añadir la línea siguiente:

Options -Indexes


Todos estos cambios deberemos revertirlos en el momento de la publicación del portal web.

20 de julio de 2018

:: CMIS. Documentos de una determinada carpeta

Como prueba de concepto, necesitamos obtener los documentos de una determinada carpeta mediante una consulta CMIS:

SELECT cmis:objectId, cmis:name FROM cmis:document  WHERE 

CONTAINS('PATH:"//app:company_home/st:sites/cm:netic360/cm:documentLibrary/cm:Facturas/*"')


Podemos hacer uso de CMIS Workbench:
http://chemistry.apache.org/java/developing/tools/dev-tools-workbench.html

Información adicional sobre la especificación CMIS:
http://docs.oasis-open.org/cmis/CMIS/v1.1/CMIS-v1.1.html#x1-110001r109

16 de julio de 2018

:: Alfresco. Crear documento desde plantilla con un número incremental

Como prueba de concepto, queremos que los usuarios creen documentos a partir de una plantilla, y que estos tengan el mismo nombre y un código numérico (incremental), indicando el número de documento.

Para ello, los pasos a seguir son los siguientes:

.- La plantilla del documento la copiaremos en: ""
De esta manera, a nuestros usuarios les aparecerá la opción de seleccionar la plantilla oportuna, en la opción: "Crear documento a partir de plantilla"

.- Sobre la carpeta contenedora, definiremos una regla de contenido que al crear o entrar documentos ejecute un script

.- El contenido del script: "rename_doc.js" podría ser algo similar a esto:

var folder=document.parent;
var documents=folder.children;
var docNumber=documents.length;

document.name=document.name+"_"+docNumber+".docx";
document.properties["cm:title"]=document.name+"_"+docNumber+".docx";
document.properties["cm:description"]="DocNumber: "+docNumber;
document.save();


9 de julio de 2018

:: Emmet. Plugin para Notepad++

Emmet es un plugin que nos ahorrará tiempo de codificación ya que nos permitirá- a partir de expresiones- generar el código correspondiente.

Por ejemplo, si en notepad++ escribimos: "html:5" y pulsamos la combinación de teclas asociada, Emmet nos convertirá este código en:

<!doctype html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <title>Document</title>
</head>
<body>
 
</body>
</html>


Para instalar este plugin, debemos llevar a cabo los siguientes pasos:

1.- Instalar "python script", para lo que seleccionaremos la opción de menú: "Plugins>Plugin Manager>Show Plugin Manager" y buscaremos "Python script" y procederemos a su instalación

2.- Descargaremos el plugin "Emmet" de la página oficial: https://emmet.io/download/

3.- El plugin descargado lo descomprimimos en la carpeta "plugins" de nuestra instalación de Notepad++

4.- Podemos comprobar las teclas asignadas para la ejecución de este plugin, para lo que seleccionaremos: "Configuración > Enlaces directos >"
En el cuadro de dialogo, seleccionaremos la pestaña: "Plugins commands" y buscaremos los denominados:
Expand abbreviation
Wrap with abbreviation

De esta manera, tras escribir el código y pulsar la combinación de teclas asociadas a Expand abbreviation (por ejemplo: Ctrl+Shift+Enter) el código se tranformará en lo que corresponda.

Más información sobre la sintaxis a utilizar: https://docs.emmet.io/cheat-sheet/

4 de julio de 2018

:: Alfresco. Evitar el autocompletado de contraseñas en la página de login

Como prueba de concepto vamos a crear una página de login personalizada, para lo que seguiremos los pasos que describiremos a continuación.

1.- Localizamos el fichero: "login.get.html.ftl" ubicado en: "\tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\guest"

2.- Copiamos el fichero anterior a la siguiente ubicación: "\tomcat\shared\classes\alfresco\web-extension\site-webscripts\org\alfresco\components\guest"
En caso de que alguna de las carpetas no exista, será necesario crearlas.

3.- Sobre este fichero, llevaremos a cabo las modificaciones necesarias


<@markup id="form">
         <form id="${el}-form" accept-charset="UTF-8" method="post" action="${loginUrl}" class="form-fields login ${edition}" autocomplete="off">
            <@markup id="fields">
            <input type="hidden" id="${el}-success" name="success" value="${successUrl?replace("@","%40")?html}"/>
            <input type="hidden" name="failure" value="${failureUrl?replace("@","%40")?html}"/>
            <div class="form-field">
               <label for="${el}-username">${msg("label.username")}</label><br/>
               <input type="text" id="${el}-username" name="username" maxlength="255" value="<#if lastUsername??>${lastUsername?html}</#if>" />
            </div>
            <div class="form-field">
               <label for="${el}-password">${msg("label.password")}</label><br/>
               <input type="password" id="${el}-password" name="password" maxlength="255" />
            </div>
   <div class="form-field">
    <input type="checkbox" id="showpassword" onclick="showPassword('${el}-password')"/>
    <label for="showpassword"> Mostrar clave</label><br/>
   </div>
            </@markup>
            <@markup id="buttons">
            <div class="form-field">
               <input type="submit" id="${el}-submit" class="login-button" value="${msg("button.login")}"/>
            </div>
            </@markup>
         </form>
      </@markup>


Tras reiniciar el servicio de Alfresco, como formulario de login se mostrará este que hemos modificado.


Información adicional: https://developer.mozilla.org/en-US/docs/Web/Security/Securing_your_site/Turning_off_form_autocompletion

29 de junio de 2018

:: Alfresco. Añadir check para mostrar la clave en el login

Es habitual -en muchos formularios de control de acceso (login)- que exista la posibilidad de que el usuario marque un check para mostrar la clave que ha insertado.
De esta manera, describiremos a continuación cómo podemos implementar esta característica.

1.- Localizamos el fichero: "login.get.html.ftl" ubicado en: "tomcat\webapps\share\WEB-INF\classes\alfresco\site-webscripts\org\alfresco\components\guest"


2.- Copiamos el fichero anterior en la siguiente ubicación: "\tomcat\shared\classes\alfresco\web-extension\site-webscripts\org\alfresco\components\guest"
En caso de que no exista alguna de las carpetas, será necesario crearlas.


3.- En el fichero que hemos copiado, llevamos a cabo las siguientes modificaciones:
Añadimos el check que nos permitirá mostrar la clave insertada.

<@markup id="form">
         <form id="${el}-form" accept-charset="UTF-8" method="post" action="${loginUrl}" class="form-fields login ${edition}">
            <@markup id="fields">
            <input type="hidden" id="${el}-success" name="success" value="${successUrl?replace("@","%40")?html}"/>
            <input type="hidden" name="failure" value="${failureUrl?replace("@","%40")?html}"/>
            <div class="form-field">
               <label for="${el}-username">${msg("label.username")}</label><br/>
               <input type="text" id="${el}-username" name="username" maxlength="255" value="<#if lastUsername??>${lastUsername?html}</#if>" />
            </div>
            <div class="form-field">
               <label for="${el}-password">${msg("label.password")}</label><br/>
               <input type="password" id="${el}-password" name="password" maxlength="255" />
            </div>
   <div class="form-field">
    <input type="checkbox" id="showpassword" onclick="showPassword('${el}-password')"/>
    <label for="showpassword"> Mostrar clave</label><br/>
   </div>
            </@markup>
            <@markup id="buttons">
            <div class="form-field">
               <input type="submit" id="${el}-submit" class="login-button" value="${msg("button.login")}"/>
            </div>
            </@markup>
         </form>
      </@markup>

Añadiremos el checkbo y mensaje correspondiente.

4.- En este mismo fichero, insertamos la función javascript encargada de mostrar o no la clave insertada por el usuario.

function showPassword(id)
   {
    var elemento = document.getElementById(id);
    if (elemento.type === "password") {
     elemento.type = "text";
    } else {
     elemento.type = "password";
    }
   }



Tras reiniciar el servicio de Alfresco, nos aparecerá el formulario de login modificado, con la posibilidad de mostrar o no la clave.

25 de junio de 2018

:: Alfresco. Crear página de login

La prueba de concepto que vamos a realizar consistirá en crear una página de login personalizada, para nuestro gestor documental Alfresco. En nuestro caso, para la versión: 5.2.


Los pasos a seguir son los descritos a continuación:

1.- En el fichero "share-config-custom.xml" ubicado en: "tomcat\shared\classes\alfresco\web-extension" añadimos las siguientes líneas


<alfresco-config>
    <config evaluator="string-compare" condition="WebFramework">
    <web-framework>
    <defaults>
    <page-type>
       <id>login</id>
       <page-instance-id>netic360-login</page-instance-id>
    </page-type>
    </defaults>
    </web-framework>
    </config>
 </alfresco-config>


2.- En la siguiente ubicación: "tomcat\shared\classes\alfresco\web-extension\site-data\pages" crearemos un fichero al que podemos llamar: "netic360-login.xml" con el siguiente contenido:


<page>
   <template-instance>netic360-login</template-instance>
   <authentication>none</authentication>
</page>


El nivel de autenticación de la página que hemos creado debe ser: "None" para que podamos acceder, ya que de lo contrario, se le solicitaría al usuario un login previo.

3.- En la siguiente ubicación: "tomcat\shared\classes\alfresco\web-extension\site-data\template-instances" crearemos un fichero al que denominaremos: "netic360-login.xml" con el siguiente contenido:


<template-instance>
   <template-type>netic360/netic360-login</template-type>
</template-instance>


4.- En la siguiente ubicación: "tomcat\shared\classes\alfresco\web-extension\templates\netic360" crearemos un fichero al que denominaremos: "netic360-login.ftl" con el siguiente contenido:


<html>
   <head>
      <title>NeTIC360 Login</title>
   </head>
   <body>
      <h2>NeTIC360 Login</h2>  
      <form id="loginform" accept-charset="UTF-8" method="post" action="${url.context}/page/dologin">
         Username: <input type="text" id="username" name="username"/><br>
         Password: <input type="password" id="password" name="password"/><br>
         <input type="submit" id="btn-login" />
      </form>
   </body>
</html>


Reiniciaremos el servicio de Alfresco y accederemos al gestor documental para comprobar el nuevo login.

20 de junio de 2018

:: Alfresco. Modificar el ancho de la columna "Mis ficheros"

Como prueba de concepto, necesitamos modificar el ancho de la columna de la izquierda donde aparece el menú, en el apartado: "Mis ficheros"


Para llevar a cabo este cambio (Alfresco 5.2), buscaremos el siguiente fichero:

"\tomcat\webapps\share\WEB-INF\classes\alfresco\templates\org\alfresco\myfiles.ftl"


<script type="text/javascript">//<![CDATA[</p>
<p>
new Alfresco.widget.Resizer("Repository").setOptions({</p>
<p>
initialWidth: 225  <= Valor a modificar</p>
<p>
});</p>
<p>
//]]></script>



De todas formas se podría sobrescribir este comportamiento con una nueva plantilla ".ftl" siguiendo las buenas prácticas (carpeta "\tomcat\shared").

15 de junio de 2018

:: Operadores de Google. Un repaso

A la hora de realizar búsquedas en Google podemos hacer uso de determinados operadores que pueden sernos de utilidad.

site:dominio
Nos muestra todas las páginas indexadas para un dominio especificado

site:dominio filetype:pdf
Nos muestra los documentos pdf indexados, para un dominio especificado

allintexto:texto
Busca una cadena de texto dentro un dominio especificado

allintitle:texto
Busca una cadena de texto dentro del título de una página web

allinurl:texto
Busca una cadena de texto dentro de la url

inurl:texto
Buscar una dena de texto en la url

author:texto
Busca contenido cuyo author es el especificado

cache:dominio
Nos muestra la relación de páginas que se encuentran indexadas en la caché

link:dominio
Busca enlaces que apunten al dominio especificado

related:dominio
Nos muestra todas las páginas relacionadas con el dominio especificado

Más información: https://www.exploit-db.com/google-hacking-database/

10 de junio de 2018

:: Alfresco. Script para asignar un workflow

La prueba de concepto consiste en asociar un workflow de revisión a los documentos que se suben a una determinada carpeta.
Para ello, sobre esta carpeta, definiremos una regla de contenido de forma que se ejecute el script especificado.

El contenido del script "crear_workflow.js" podría ser algo similar a lo siguiente:


function createAdvancedWorkflow(docNode) {
   logger.system.out("Dentro de la función");
   var workflow = actions.create("start-workflow");
   workflow.parameters.workflowName = "activiti$activitiReview";
   logger.system.out("workflow:"+workflow);
   workflow.parameters["bpm:workflowDescription"] = "Revisa por favor este documento: "+docNode.name;
   logger.system.out("Descripcion");
   workflow.parameters["bpm:assignee"] = people.getPerson("usr1"); // TODO: not hard coded, this is testing
   logger.system.out("Asignado");

   //var futureDate = new Date();
   //futureDate.setDate(futureDate.getDate() + 3);
   //workflow.parameters["bpm:workflowDueDate"] = futureDate; 
   logger.system.out("Antes de salir");
   workflow.execute(docNode);
}

function main() {
       var docNode = search.findNode(document.nodeRef); 
       var name = document.name;
       logger.system.out("Documento:"+name);

       createAdvancedWorkflow(docNode);

}
main();


4 de junio de 2018

:: Alfresco .Consultar los grupos a los que pertenece un usuario (Tip)

Una forma sencilla de obtener los grupos a los que pertenece un usuario de Alfresco, es realizando la siguiente llamada:




http://localhost:8181/alfresco/s/api/people/USUARIO?groups=true

Tendremos que sustituir el literal: "USUARIO" por el nombre de usuario que deseemos consultar.

La respuesta que obtendremos será algo similar a lo siguiente:

{
 "url": "\/alfresco\/s\/api\/people\/usr3",
 "userName": "usr3",
 "enabled": true,
 "firstName": "usr3",
 "lastName": "",
 "jobtitle": null,
 "organization": null,
 "organizationId": null, 
 "location": null,
 "telephone": null,
 "mobile": null,
 "email": "gis@asac.as",
 "companyaddress1": null,
 "companyaddress2": null,
 "companyaddress3": null,
 "companypostcode": null,
 "companytelephone": null,
 "companyfax": null,
 "companyemail": null,
 "skype": null,
 "instantmsg": null,
 "userStatus": null,
 "userStatusTime": null,
 "googleusername": null,
 "quota": -1,
 "sizeCurrent": 0,
 "emailFeedDisabled": false,
 "persondescription": null,
 "authorizationStatus": null,
 "isDeleted": false,
 "isAdminAuthority": false
,
 "capabilities":
 {
  "isAdmin":
  false
    ,"isMutable":
  true
    ,"isGuest":
  false
   },
 "groups": [
 {
  "itemName": "GROUP_Contabilidad",
  "displayName": "Contabilidad"
 }],
 "immutability":
 {
 }
}


:: Cookies de nuestra página web. ¿Para qué sirve cada una?

A menudo una pregunta que nos hacen es qué cookies se están utilizando en mi página y para qué sirven. Para ver las cookies, podemos selecci...