13-marzo-2016
admin

WordPress: “Briefly Unavailable for Scheduled Maintenance”

Este error puede aparecer en WordPress en el momento que falla alguna actualización, ya sea del propio wordpress o de un plugin.

Al realizar las actualizaciónes Wordpres crea un archivo en el llamado .maintenance (en la raiz del sitio). Este archivo es el encargado de mostrar el mensaje: “Briefly Unavailable for Scheduled Maintenance”. De tal forma que muestra ese mensaje en tu sitio en lugar de mostrar los errores de PHP mientras se produce la actualización de los archivos necesarios.

Una vez finalizada la actualización, el archivo se borra automáticamente. Si por lo que sea la actualización falla y ese archivo no llega a borrarse se debe borrar a mano. De otro modo sacará constantemente el mensaje de error. Una vez borrado es recomendable ejecutar las actualización que ha fallado para que la aplique correctamente.

25-febrero-2016
admin

Borrado de documentos en Alfresco

Por un lado hay que tener en cuenta que los documentos en alfresco no se borran realmente hasta que el usuario que los ha borrado o el administrador vacia la papelera de reciclaje. Ésta se vacia en la sección User Profile.

Por otro lado se debe tener en cuenta que lo que se hace es un borrado lógico. De tal forma que aunque no podamos verlos desde el interfaz de Alfresco, no se han borrado físicamente del disco. Se mantienen dentro del contentstore en estado huérfano ya que no quedan referencias a él en la base de datos.

Ahora bien, en Alfresco se ejecutan una serie de procesos automáticos de mantenimiento. Se definen en el fichero scheduled-jobs-context.xml que se apoya en el repository.properties para configurarse (localizables ambos en /Alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/). Entre ellos nos encontramos con:

contentStoreCleanerTrigger: es el encargado de lanzar el bean contentStoreCleaner (definido en el content-services-context.xml) que se encarga de borrar los contenidos huérfanos del contentstore. Por defecto se ejecuta a las 4:00 AM cada día (0 0 4 * * ?). El parámetro system.content.orphanProtectDays establece el número mínimo de días que el contenido debe ser huérfano antes de poder eliminarlo, el valor predeterminado es de 14 días. Es decir, el documento permanecera 14 días en estado huérfano en el contentstore hasta que por fin la tarea Cleaner lo pase al contentstore.deleted.

Nota 1: Si la propiedad system.content.eagerOrphanCleanup está a true los documentos se moverán al directorio contentstore.deleted sin necesidad de la ejecución del contentStoreCleaner.

Nota 2: El contentstore.deleted es responsabilidad del administrador de borrarlo para liberar espacio.

Scheduled jobs
Content store configuration

10-febrero-2016
admin

Logging en python

Ejemplo de configuración de log para python. Se utiliza un fichero de configuracion llamado logging.conf, donde se definen dos manejadores uno a nivel de consola StreamHandler y otro a nivel de fichero FileHandler.
StreamHandler: Escribirá en la salida estandar del sistema las trazas con nivel INFO.
FileHandler: Escribirá en un fichero llamado Result_Operations.log las trazas con nivel DEBUG.
En ambos se formatean los mensajes para que sólo muestre el contenido del mensaje.

from logging import config
....
logging.config.fileConfig('logging.conf')
logger = logging.getLogger('root')

logger.debug("mensaje para el FileHandler")
logger.info("mensaje para ambos")

logging.conf

[loggers]
keys=root

[handlers]
keys=FileHandler,consoleHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=FileHandler,consoleHandler

[handler_FileHandler]
class=FileHandler
level=DEBUG
formatter=simpleFormatter
args=("Result_Operations.log",)

[handler_consoleHandler]
class=StreamHandler
level=INFO
formatter=simpleFormatter
args=(sys.stdout,)

[formatter_simpleFormatter]
format= %(message)s
datefmt=

Documentación oficial logging python
Documentación de los tipos de manejadores

5-febrero-2016
admin

SyntaxError: Non-ASCII character ‘\xe9’

En python para definir la codificación del archivo se puede colocar al inicio del archivo la siguiente línea de código.

# -*- coding: utf-8 -*-

De esta forma se solucionan los errores del tipo: Non-ASCII character ‘\xe9’

Más info PEP 0263 — Defining Python Source Code Encodings.

21-enero-2016
admin

Modificar el tamaño de una imagen y añadir una marca de agua en python

Pillow es una variante (o fork) de la popular librería PIL (Python Image Library) que permite procesar con facilidad imágenes con Python 2.x/3.x.

Permite consultar información básica de una imagen como su tamaño, el formato que tiene, el tipo de imagen (bits/pixel, BN/color, etc.), es posible cambiar su tamaño, recortar un área, girar, aplicar filtros y efectos, convertir el tipo de imagen y su formato, etc.

Para instalar la librería basta con ejecutar el comando.

 pip install Pillow

Un ejemplo de uso puede ser:

import PIL
from PIL import Image

img = Image.open("C:\\foto.jpg")
img = img.resize((500, 500), Image.ANTIALIAS)

imgAgua= Image.open("C:\\agua.jpg")
img.paste(imgAgua, (25, 25))

img.save("C:\\imagenFinal.jpg")

En el ejemplo se abre la imagen foto.jpg para redimensionarla a un ancho y alto de 500px.
Además, se le añade encima una imagen agua.jpg en las coordenadas 25,25 a modo de marca de agua o firma.

Documentación: Link1, Link2

15-enero-2016
admin

Máquinas virtuales de Bitmani para desarrollo web

Bitnami es una biblioteca de aplicaciones de servidor populares y entornos de desarrollo que se pueden instalar con un solo clic. Es tan sencillo como descargarse una máquina virtual ya preparada para VMware o Virtual Box con los servidores que deseemos. Además, luego le puedes ir añadiendo módulos que vayas necesitando.

A continuación se muestra una guía de comandos rápida de uso para montar un servidor Tomcat con java 1.7 y nodejs.

Arrancar y parar Tomcat
-----------------------
	Todos los servicios se arrancan y paran de la siguiente forma:
		sudo /opt/bitnami/ctlscript.sh status
		sudo /opt/bitnami/ctlscript.sh start tomcat
		sudo /opt/bitnami/ctlscript.sh stop tomcat
		sudo /opt/bitnami/ctlscript.sh restart tomcat

Cambiar el teclado inglés
-------------------------
	Por defecto la máquina virtual viene configurada con teclado en inglés. 
	Para cambiarlo sería:
		sudo dpkg-reconfigure keyboard-configuration

Activar SSH
-----------
	Por defecto el servicio ssh viene desactivado. Se puede activar así:
		sudo mv /etc/init/ssh.conf.back /etc/init/ssh.conf
		sudo start ssh

Configuración de red en VMware
------------------------------
	Tarjetas de red con el VMware Bridge Protocol desactivado.
	Tarjetas de red con ip y dns automático.
	Network Adapter de la máquina virtual en modo brighed.
	
Configurar la red manualmente.
------------------------------
    Hay que editar el archivo interfaces, por ejemplo así:

	1- Editamos la interface de la tarjeta de red. En este caso la eth0 
		vi /etc/network/interfaces 
		
		Dentro del archivo debes buscar:
		auto eth0
		iface eth0 inet dhcp
		
		y sustituirlo por lo que corresponda en cada caso:

		auto eth0
		iface eth0 inet static
		address 192.168.1.40
		netmask 255.255.255.0
		gateway 192.168.1.1
		network 192.168.1.0
		broadcast 192.168.1.255
	
    2- Ahora editamos los DNS:
		vi /etc/resolv.conf
		
		nameserver = 8.8.8.8
		nameserver = 8.8.4.4 
	
	3- Por ultimo reiniciamos el servicio de red:
		/etc/init.d/networking restart 
		
Cambiar la jdk
--------------
	Descargar la deseada, en este caso queremos pasar de la 1.8 que nos traia 
	la máquina a la 1.7 así que descargamos al 1.7 de aquí
		http://www.oracle.com/technetwork/es/java/javase/downloads/jre7-downloads-1880261.html
		
	Lo más rápido es reemplazar el directorio /opt/bitnami/java por el nuevo. 
	Se puede hacer por consola tal que así:
		sudo mv /opt/bitnami/java /opt/bitnami/java8
		sudo mv /tmp/java /opt/bitnami/java
		sudo chown -R root /opt/bitnami/java	  (cambiar el usuario)
		sudo chown -R :root /opt/bitnami/java	(Cambiar el grupo)
		sudo chmod -R 777 /opt/bitnami/java
	
Añadir un módulo nuevo (Ej: nodejs)
-----------------------------------
	Descargarse de la página el *.run 
		https://bitnami.com/stack/nodejs/installer#linux
	Se puede utilizar para ello el comando wget si se quiere.
		wget https://bitnami.com/..................../bitnami-nodejs-5.4.0-0-linux.run
	
	Darle permisos:
		chmod 755 bitnami-nodejs-5.4.0-0-linux.run
		
	Ejecutarlo y seguir los pasos de instalación
		sudo /bitnami-nodejs-5.4.0-0-linux.run

Apagar la máquina virtual
-------------------------
	sudo poweroff


DOC:
https://wiki.bitnami.com/Virtual_Appliances_Quick_Start_Guide


https://bitnami.com/stack/tomcat/virtual-machine

10-enero-2016
admin

Como utilizar el Osmdroid Tile Packager

Se puede utilizar el Tile Packager para descargar las tiles que luego se utilizarán en las aplicaciones android. De tal forma que una aplicación que utilice Osmdroid funcione offline (sin conexión a internet).

Modo de ejecución:

set classpath=osmdroid-android-3.0.3.jar;osmdroid-packager-3.0.3.jar;
              slf4j-android-1.5.8.jar;sqlitejdbc-v056.jar

java org.andnav2.osm.mtp.OSMMapTilePackager 
    -u http://tile.openstreetmap.org/%d/%d/%d.png -t Mapnik 
    -d haarlem.zip -zmax 18 -n 52.4244 -s 52.3388 -e 4.6746 -w 4.5949

-u http://tile.openstreetmap.org/%d/%d/%d.png Patrón para obtener los tiles.
-t Mapnik Directorio temporal para la descarga. Debe ser el nombre del renderer si pretende usar el zip directamente en osmdroid.
-d haarlem.zip Archivo zip creado al finalizar.
-zmax 18 Nivel de zoom máximo para la descarga de tiles.
-n 52.4244 Coordenada norte.
-s 52.3388 Coordenada sur.
-e 4.6746 Coordenada este.
-w 4.5949 Coordenada oeste.

Documentación Oficial

7-enero-2016
admin

Ver ficheros abiertos en Windows 7

Para ver que ficheros hay abiertos y que proceso es el que los tiene abiertos se puede utilizar la aplicación Process Explorer.

Muy interesante cuando estamos desarrollando para comprobar de una forma cómoda que se están cerrando bien todas las conexiones con los ficheros. Lo he probado con Windows 7.

Link

4-enero-2016
admin

Picasso: Librería para manejar imágenes en Android

Picasso es una de las muchas librerías disponibles para la carga de imágenes en tu aplicación android. Con una simple línea de codigo como por ejemplo:

Picasso.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

Te evita el trabajo que conlleva realizar la carga de la imagen de manera manual: memoria automática, almacenamiento en cache, transformaciones complejas usando el mínimo de memoria, …

//Ejemplo de transformación:
Picasso.with(context).load(url).resize(50, 50).centerCrop().into(imageView)
//Ejemplo añadiendo una imagen por defecto por si falla la descarga:
Picasso.with(this).load("http://www.host.com/imagen.jpg")
      .error(R.drawable.error)
      .fit().transform(new RoundedTransformation()).into(imageView);
//dependencia Maven
< dependency>
  < groupId>com.squareup.picasso< /groupId>
  < artifactId>picasso< /artifactId>
  < version>2.5.2< /version>
< /dependency>

Documentación Oficial

27-diciembre-2015
admin

Interface Parcelable en Android

Esta interface se usa en Android para poder pasar objetos entre las Activities. A continuación se muestra un ejemplo de uso paso por paso:

Paso 1/ Crear una clase que implemente el interface Parcelable

public class User implements Parcelable{
	private String id;
	private String name;
	private String direccion;
        //La clase Comentario también debería un objeto Parcelable
	private List< Comentario> comments;

        ....getters y setters....
}

Paso 2/ Implementar los métodos describeContents y writeToParcel

	@Override
	public int describeContents() {
		return 0;
	}
	@Override
	public void writeToParcel(Parcel dest, int flags) {
		dest.writeString(this.id); 
		dest.writeString(this.name);
		dest.writeString(this.direccion);
		dest.writeTypedList(this.comments);
	}

Paso 3/ Implementar un campo static llamado CREATOR

	public static final Parcelable.Creator< User> CREATOR = 
                                  new Parcelable.Creator< User>() {
	    @Override
	    public User createFromParcel(Parcel source) {
	        return new User(source);
	    }
	 
	    @Override
	    public User[] newArray(int size) {
	        return new User[size];
	    }
	 
	};


	private User(Parcel source) {
                // los campos se deben leer en el mismo orden que se han
                // escrito en writeToParcel
		this.id = source.readString();
		this.name = source.readString();
		this.direccion = source.readString();
		if (comments == null) {
			comments = new LinkedList< Comentario>();
		}
		source.readTypedList(comments, Comentario.CREATOR);
	}

Paso 4/ Para utilizarlo sería

//Al lanzar la nueva actividad se metería el objeto parcelable
Intent intent = new Intent(this, OtherActivity.class);
intent.putExtra("variableUser", user); //user sería un objeto User
startActivity(intent);
//en el create de la actividad lanzada se extraería
public class OtherActivity extends Activity {
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_second);
 
         User datos = getIntent().getParcelableExtra("variableUser");
     }
     ....
}

Documentación Oficial

Páginas:«1...9101112131415...30»

Categorias

Linkedin