19-octubre-2017
admin

Añadir texto a archivos STL para impresión 3D con Freecad

En páginas como por ejemplo Thingiverse hay numerosos archivos *.STL (Standard Triangle Language) que podemos descargar para imprimir en nuestras impresoras 3D. A continuación, voy a explicar como podríamos realizarles alguna modificación como puede ser añadirle un texto utilizando la herramienta Freecad.

En primer lugar hay que abrir el archivo stl con el freecad. Para ello con el freecad abiero vamos a File – Open y nos ponemos en el banco Part.
Ahora debemos pasar la pieza a solido para poder modificarla, así que con la pieza seleccionada vamos ejecutando por orden las siguientes acciones:
1 – Part – Create shape form mesh… (Nos pedira marcar una tolerancia, yo suelo poner siempre 0,1)
2 – Part – Convert to solid
3 – Part – Refine shape

Tras realizar esto, podremos comprobar como ahora ya se visualizan las caras, aristas y vertices de la figura. Por lo tanto, ya podremos trabajar sobre la figura.

Si quisieramos añadir un grabado de texto, una forma rápida podría ser seguir estos pasos:
1 – Pasamos al banco Draft
2 – Seleccionamos la acción ShapeString. Nos irá pidiendo una seríe de pasos a seguir:
2.1 – Seleccionar el punto donde comenzar a escribir.
2.2 – Introducir la cadena de texto que queremos grabar.
2.3 – Introducir la altura de la letra para ese texto.
2.4 – Introducir la separación entre las letras.
2.5 – Seleccionar el tipo de letra a utilizar. Puedes buscar una fuente que te guste por internet y descargarte el archivo *.ttf de ella. Para una prueba rápida puedes coger alguna que ya tenga el propio freecad en su instalación, yo suelo seleccionar para las pruebas: FreeCAD 0.16\bin\Lib\site-packages\matplotlib\mpl-data\fonts\ttf\Vera.ttf
3 – Vamos al banco Part y extruimos el texto sobre el eje en el que estemos trabajando.

Ahora ya tendriamos la figura y el texto listos para unirlos. Una forma de unirlos puede ser ir moviendo el texto a mano hasta que quede en la posición que queremos. Pero podriamos hacerlo de forma más elegante. Para ello:
1 – Seleccionamos simultáneamente primero la pieza y después el texto para realizar la accion Edit – Alignment…
2 – Nos saldrá la pantalla dividida en dos. Seleccionas varios puntos en la figura de la izquierda (que será el texto) y seleccionas otros tantos puntos en la figura de la derecha (que sera la pieza). Los puntos tienes que marcarlos en el mismo orden en ambas figuras y son para orientar a freecad donde colocar el texto.
3 – Por ultimo en la pantalla de la pieza hariamos click en el botón derecho del ratón y seleccionamos la opción align para que realice la operación.

18-octubre-2017
admin

Planificar el cambio de filamento durante la impresión 3D con la aplicación Cura.

La aplicación Cura nos permite planificar entre otras cosas cambio de filamento durante la impresión de una pieza en 3D. Esto puede ser muy útil cuando por ejemplo sabemos que se va a terminar el filamento o bien cuando queremos que la pieza quede impresa en varios colores.

Para ello en Cura hay que ir al menú extensiones – postprocesamiento – modificar GCode.

Planificar el cambio de filamento durante la impresión 3D con la aplicación Cura.

Esto nos va a abrir una pantalla desde la cuál podremos añadir de forma bastante amigable comandos para que se ejecuten. En la figura de debajo hemos seleccionado la opcion Pause at height. A la derecha vemos que nos salen unas casillas para rellenar:
– Pause height: la altura a la que queremos que haga la pausa (depende del punto donde queramos cambiar el filamento).
– Park print head x: posicion X a la que queremos que vaya el extrusor cuando hace la pausa (lo más cómodo es llevar el extrusor al x=0).
– Park print head y: posicion Y a la que queremos que vaya el extrusor cuando hace la pausa (lo más cómodo es llevar el extrusor al y=0).
– Retraction: cuantos milímetros queremos que se retraiga el filamento para extraerlo (por ejemplo, 50 mm).
– Extrude amount: cuantos milímetros queremos que expulse el extrusor (interesamente para que limpie el color anterior de la boquilla, 100 mm está bien).
– Redo layers: numero de capas intermedias que quieres q añada para facilitar la adhesión (en mi caso suelo poner 1 o ninguna).

Planificar el cambio de filamento durante la impresión 3D con la aplicación Cura.

Nota: Probado que funciona correctamente en una Anet 8 con el firmware Skynet 2.3.1.

11-octubre-2017
admin

Impresión 3D: Añadir cambio de filamento y Restaurar firmware original.

En este videotutorial nos enseñan a realizar un cambio de filamento usando para ellos las extensiones (plugins) del programa Cura. Se puede hacer que la impresión se detenga a determinada altura y nos permita cambiar el filamento.

Y en este otro nos muestran como instalar el firmware de la Anet 8 para volver a su versión original.

6-octubre-2017
admin

Impresión 3D: Anet 8. Cabina.

Guia para meter tu anet 8 en una cabina hecha por ti mismo con 2 mesas lack de ikea.

Se coloca una mesa encima de otra, por la altura de la Anet 8 hay que añadir unos prolongadores de mesa de unos 10 cm. Hay que cerrar los laterales, en mi caso he usado unas tablas de contrachapado de 5mm de grosor y metacrilato de 3mm para los laterales (Atornillando el metacrilato al contrachapado). Para la puerta he utilizado metacrilato de 5 mm de grosor.

Sobre la mesa de abajo irá atornillada la base de la impresora, que en mi caso era una tabla de aglomerado de 1cm de grosor. Mientras, que sobre la mesa de arriba he colocado el soporte para la bobina del filamento, el soporte para el lcd y las cajas con los diferentes interruptores.

En la mesa de abajo se puede colocar una balda util para tener almacenados los filamentos.

Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8 Montando cabina para anet 8

Piezas para imprimir:
+ Prolongadores para la mesa: 1814763
+ Soporte para el LCD: 2005640
+ Guia para el filamento: 2137546
+ Guia para pasar los cables: 1740538 (wires.stl)
+ Soportes para balda inferior: 1639945
+ Manilla para la puerta: 12695
+ Filtro para salida de aire: 2105113
+ Caja para interruptor de fuente. 49542
+ Caja para interruptor de palanca. 1238650 (Utilizados para encender y apagar el ventilador añadido a la fuente y/o el de la placa)
+ Caja para interruptor de botón. 746157 (Utilizados para encender y apagar las luces led y/o el filtro del aire)

Piezas para comprar:
+ Cables
+ Leds para luz. 5 metros 300 unids SMD3528 DC 12 V de color blanco Aliexpress 2,15€
+ Filtro de carbono. pack de 10 de 12,8×18,8cm. Aliexpress 3,6€
+ Filtro HEPA. Pack de 5 de 64X45X12mm. Aliexpress 4,04€
+ Interruptores palanca. Pack de 5 de 3 pines. Aliexpress 1,22€
+ Interruptores de botón. Pack de 5 de 2 pines. Aliexpress 1,12€
+ Ventilador para el filtro del aire.

2-octubre-2017
admin

Impresión 3D: Anet 8. Montaje inicial y mejoras.

La Anet 8 se trata de una impresora bastante económica que da bastante buenos resultados. Permite imprimir tanto en PLA como ABS. Si bien, tal y como viene de fábrica, ya se puede imprimir con ella es necesario realizarle una serie de mejoras para ir obteniendo mejores resultados. Hay una gran comunidad en internet detrás de ella por lo que es muy fácil solucionar posibles problemas que puedan surgir.

A continuación se explica su funcionamiento y mejoras que se le pueden añadir para mejorar los resultados:

Montaje inicial
Por mi parte, realice el montaje de la impresora tal cual me venia de fábrica para ver que todo funcionaba correctamente. Y luego con ella imprimí las piezas necesarias para ir realizandole mejoras. Más adelante mostraré un listado con aquellas mejoras que finalmente he dejado puestas.

Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial Anet 8 - Montaje inicial

Para realizar el montaje completo hay numerosos videos por la red donde se muestra como realizarlo correctamente paso por paso. Un ejemplo sería Guia montaje Anet 8, recomiendo verlos enteros una primera vez antes de realizar el montaje.

Mejora 1: Anclajes para las correas
Te permite anclar tanto la correa del eje X como del Y de manera más cómoda. Son más fáciles de maniputar al no ser necesario el uso de las bridas.
Piezas para imprimir:
+ Eje X: 1666094
+ Eje Y: 1997647

Mejora 2: Añadir interruptor a la fuente y un ventilador auxiliar
El interruptor te permite encender y apagar la impresora y el ventilador ayudará a la refrigeración de la fuente.
Piezas para imprimir:
+ Interruptor: 1798604
+ Ventilador fuente: 1683098
Piezas para comprar:
+ Un interruptor de 3 pines 15A 250V. Ebay 1,43€
+ Un fusible para el interruptor (en mi caso no traia y tuve que comprarlo aparte). Pack de 10 fusibles de 10A de 5x25mm Aliexpress 3,32€
+ Un ventilador. Pack de 5 ventiladores de 12V de 2 pines y de 5 cm Aliexpress 3,04€

Mejora 3: Refuerzos para la estructura
Permite mejorar la estabilidad de la impresora para evitar vibraciones y hacerla menos endeble.
Piezas para imprimir:
+ Soportes para reducir el movimiento del eje X: 1872162 (
Anet_A8_Top_Left_Bracket_Leo.stl y Anet_A8_Top_Right_Bracket_Leo.stl)
+ Marco para el motor Y 1831038
+ Marco para la parte delantera de la base 1430727 (frame_brace_2.stl)
+ Sujecciones de la base 1771932 (Fix_M8_R1_no_screw.STL, hacen falta 6 y dos tornillos para cada uno. Permite fijar la impresora a una base. En mi caso una tabla de 50x50cm de aglomerado de 1,5 cm de grosor.)

Mejora 4: Tensores para las correas X e Y
Con el uso las correas tenderan a aflojarse. Estos tensores permiten mantener las correas tensas de manera más fácil, simplemente girando un tornillo.
Piezas para imprimir:
+ Tensor X: 1492411 (x_idler_tension.stl se necesita un tornillo con su tuerca)
+ Tensor Y: 1908554 (se necesitan tornillos y tuercas para unir las piezas de este tensor)

Mejora 5: Estabilizar varillas eje Z
Esta mejora es necesaria para eliminar el llamado «wobble».
Piezas para imprimir:
+ Anti-wobble parte superior varilla: 1858435
+ Anti-wobble parte inferior varilla: 1539675 (z_wobble.stl)
Piezas para comprar:
+ Rodamientos 608ZZ. Pack de 10 rodamientos 608ZZ Aliexpress 2,60€

Mejora 6: Anclaje cama caliente
Para hacer más cómodo el regulado de la cama con los tornillos de ésta es interesante añadirles estas tuercas. Además se recomienda rectificar los agujeros de la H para eliminar la rosca y que sean las palometas las que suban o bajen la cama (Ver video).
Piezas para imprimir:
+ Arandelas: 1261806
+ Tuercas: 2000216

Mejora 7: Mosfet y ventilador para refrigerar electrónica
Con el mosfet evitamos que la corriente destinada a alimentar la cama pase por la placa.
Piezas para imprimir:
+ Soporte para placa: 2000271 (placa+mosfet+raspberry.stl y tapa_pi_90_80_70_60_50.stl)
Piezas para comprar:
+ Mossfet. Aliexpress 8,07€
+ Ventilador para poner sobre la placa. Ver mejora 2.

Mejora 8: Ventilador de capa
Útil para enfriar el filamento rápidamente todo alrededor.
– Pieza: 1620630

Mejora 9: Aislante térmico para extrusor y cama caliente
Muy útil para conseguir una calentamiento más rapido y tener menos consumo eléctrico. En el caso de la cama permite evitar el «warping».
Para la cama caliente, se necesita.
+ Una lámina de corcho para colocar en la parte inferior de la cama.
+ Cinta kapton para pegar el corcho a la cama.
+ Además, vamos a añadir en la parte superior de cama un cristal corriente o de borosilicato. Se puede sujetar a la cama con unas pinzas. A la hora de imprimir si usamos laca para sujetar las piezas al cristal quedarán fuertemente pegadas, evitando que se estropee la impresion. Para despegar, basta con esperar a que se enfríe la base. El cristal se puede limpiar con agua despues de realizar varias impresiones. (Yo utilizo laca Nelly normal).
Nota: En este video se muestra como podemos aislar la cama caliente.
Para el extrusor, se necesita:
+ Cinta kapton
+ Lana de roca
Nota: explicación de como se haría.
Piezas para comprar:
+ Lámina de corcho. Pack 4 láminas de 42x32cm Ikea 4,99€
+ Cristal de borosilicato. Aliexpress 7,04€
+ Pinzas de sujección
+ Laca nelly
+ Cinta kapton. Aliexpress 1,69€
+ Lana de roca. Pack de 10 tacos de 50x50x50mm Ebay 4,20€

Mejora 10 A: Final de carrera Z
Necesario para facilitar el calibrado del eje Z en el caso de poner un sensor de autonivelado (mejora 10 B).
Piezas para imprimir:
+ Final de carrera: 1776429 (se necesitan tornillos y tuercas)

Mejora 10 B: Sensor capacitivo para autonivelado
Este sensor permite que la impresora realice el calibrado del eje Z de forma automática.
Piezas para imprimir:
+ Soporte: 1907394 (Para el LJC18A3-H-Z/BX seria el modelo Sensor_Bracket_18mm_Leo.stl)
Piezas para comprar:
+ Sensor capacitivo LJC18A3-H-Z/BX. Aliexpress 5,35€

Para poder realizar su configuración recomiendo ver este video y visitar esta web.

Mejora 11: Guia y filtro para el filamento
Permite evitar que el filamento se enrede y que llegue sin motas de polvo al extrusor.
Piezas para imprimir:
+ Guia para el filamento: 1764285
+ Soporte para la bobina de filamento: 1624641 (Añadi las piezas SpoolHolder51_FDPlast_BOLT.stl y SpoolHolder51.5_FDPlast_NUT.stl al soporte que ya trae la impresora)
+ Filtro para el filamento: 1099978
Piezas para comprar:
+ Tubo de teflon para para el filamento desde el filtro al extrusor. Aliexpress 1€

Otras mejoras
– Utilizar conectores faston para toda la electrónica
– Problema con el conector de la cama caliente. Video

30-agosto-2017
admin

Instalar ROM (Lineage OS) en Samsung Galaxy 3 mini con TWRP

Lineage OS consiste en un sistema operativo de código abierto para teléfonos y tabletas Android. A continuación se explicaran los pasos a seguir para instalarlo en un Samsung Galaxy 3 mini con el TWRP.

1 – Copiar a la tarjeta externa del movil los 3 archivos siguientes.
– ROM del lineage OS, por ejemplo: lineage-14.1-20170108-UNOFFICIAL-golden.zip
– Las aplicaciones gapps: open_gapps-arm-7.1-micro-20170210.zip
– App solución de problemas de teclado: AOSP Keyboard Swype.zip

2 – Se debe tener instalado ya en el móvil el TWRP.

3 – Apagamos el movil y lo encendemos en modo recovery (para se pulsan simultáneamente las teclas volumen arriba, home, on/off realizará 3 reinicios hasta que por fin arranque el TWRP)


4 – Comprobar en la sección install que estan los tres archivos

5 – Vamos a WIPE >> ADVANCED WIPE >> seleccionamos las primeras 5 opciones >> deslizamos la barra de abajo para que limpie el equipo. Importante no seleccionar la sexta opción para la tarjeta externa.

6 – Volvemos de nuevo a la sección de install, seleccionamos la rom y luego deslizamos la barra de abajo.

7 – Cuando termine (tarda varios minutos) damos con el botón de atrás y hacemos lo mismo con las gapps.

8 – Repetimos lo mismo con AOPS Keyboard para solucionar los problemas del teclado.

9 – Ya podemos reiniciar el equipo en Reboot System. El móvil tardará un rato en iniciarse pero si todo ha ido bien debería arrancar el nuevo sistema.

Documentación de Lineage Os

23-agosto-2017
admin

Instalar Team Win Recovery Project (TWRP) en Samsung Galaxy S3 mini

El Win Recovery Project se trata de un software para Android que permite sustituir el recovery de fábrica por el suyo modificado y muchísimo más completo. Permite la instalación ROMs personalizadas entre otras funcionalidades.

Para instalarlo en un Samsung Galaxy 3 mini podemos seguir los siguientes pasos:

1 – Instalar drivers de samsung en nuestro pc. Podemos descargarlo de SAMSUNG_USB_Driver_for_Mobile_Phones.

2 – Descomprimir el programa Odin v3.07

3 – Una vez descomprimido lo ejecutamos como administrador. Odin3 v3.07.exe

4 – Dejamos únicamente seleccionada la opcion F. Reset Time.

5 – Seleccionamos con el botón PDA el archivo GT-I8190_TWRP_3.0.2-1.tar.md5

6 – Una vez preparada la parte del PC procedemos a apagar el telefono. Y lo encendemos en modo downloading ( para ello se deben pulsar simultáneamente las tablas volumen abajo, home, on/off).

7 – Cuando arranque pulsamos la tecla de volumen arriba para ir a la pantalla de downloading y conectamos el movil al pc.

8 – Esperar hasta que lo reconozca en Odin. Cuando eso pase en el log de odin saldrá Added! y ya podremos darle a Sart.

9 – Una vez finalizado el proceso del paso 8 desconectamos y apagamos el movil. (Para apagarlo basta con mantener presionado el boton de on/off varios segundos)

10 – Ahora para arrancar el TWRP sólo tenemos que iniciar el movil en modo recovery (mantener pulsadas las teclas volumen arriba, home, inicio)

Documentación Oficial TWRP

17-agosto-2017
admin

Agrupaciones en consultas con javax.persistence.criteria.CriteriaBuilder

Vamos a poner un par de ejemplos de uso del CriteriaBuilder en JPA para poder hacer consultas usando JpaSpecificationExecutor e incluso usar agrupaciones con groupBy.

Se van a ir poniendo las diferentes clases desde el Entity hasta el Service:

Entity de la tabla cuenta con un par de campos.

@Entity(name="cuentaEntity")
@Table(name="CUENTA")
public class CuentaEntity implements Serializable {
     @Id
     private Integer id;
     @Column(name="balance")
     private Integer balance;
     @Column(name="empresa")
     private String empresa;
     @Column(name="fecha")
     @Temporal(TemporalType.TIMESTAMP)
     private Date fecha;

     //getter setter
}

Su correspondiente JPAMetalModelEntityProcessor, la vamos a utilizar para las consultas.

@Generated(value = "org.hibernate.jpamodelgen.JPAMetalModelEntityProcessor")
@StaticMetamodel(CuentaEntity.class)
public abstract class CuentaEntity_ {
	public static volatile SingularAttribute< CuentaEntity, Integer> id;
	public static volatile SingularAttribute< CuentaEntity, Integer> balance;
	public static volatile SingularAttribute< CuentaEntity, String> empresa;
	public static volatile SingularAttribute< CuentaEntity, Date> fecha;
}

Un clase repositorio. Hay que hacer que herede tanto de la JpaRepository como del JpaSpecificationExecutor.

@Repository
public interface CuentaRepository extends JpaRepository< CuentaEntity, Integer>, 
                                         JpaSpecificationExecutor< CuentaEntity> {
	
}

Creamos nuestra clase criteria donde meteremos las especificaciones de las querys. Se añaden unos ejemplos de condicionales

public class CuentaCriteria implements Serializable{
     private Integer id;
     private Integer balance;
     private String empresa;
     private Date fecha;

     ......

     public static Specification< CuentaEntity> search(final CuentaCriteria cri){
	return new Specification< CuentaEntity>(){

	        @Override
		public Predicate toPredicate(Root< CuentaEntity> root, 
                                 CriteriaQuery< ?> criQuery, CriteriaBuilder criBuilder) {
				
			List< Predicate> predicates = new ArrayList< Predicate>();

			//el nombre de la empresa sea igual al que se pasa en CuentaCriteria. Si no está vacia.
			if( !StringUtils.isEmpty( cri.getEmpresa())){
				predicates.add( criBuilder.like(root.get(CuentaEntity_.empresa), cri.getEmpresa()) );
			}

			//la fecha debe ser igual a la que se pasa en CuentaCriteria. Si no está vacia.
			if( !StringUtils.isEmpty( cri.getFecha())){
				predicates.add( criBuilder.equal(root.get(StatementEntity_.fecha),cri.getFecha()) );
			}

			//podemos añadir tambien una condicion de tipo OR ( id = 0 OR id = 1). 
			List< Predicate> predOr = new ArrayList< Predicate>();
			predOr.add( criBuilder.equal(root.get(CuentaEntity_.id), 0) );
			predOr.add( criBuilder.equal(root.get(CuentaEntity_.id), 1) );
			predicates.add( criBuilder.or(predOr.toArray(new Predicate[predOr.size()]) ) );
	
			//Si tubieramos un objeto Embeddable u otro tipo de objeto podriamos acceder 
			//a las propiedades de ese objeto
			//predicates.add( criBuilder.like(root.get("OBJETO").get("CAMPO_OBJETO"), "qqqqqq") );
				
			..............

		        //Concatenamos todos los predicados como ands
			return criBuilder.and(predicates.toArray(new Predicate[predicates.size()]));
		}
	};
     }
}

Interfaz con nuestro servicio con unos métodos de prueba.

public interface CuentaService{
	public Page< CuentaEntity> find(CuentaCriteria criteria, Pageable pageable);
	public List< Object[]> findGroupBy(CuentaCriteria criteria);
	public Long count(CuentaCriteria criteria);
        .........
}

Y su implementación:

@Component("cuentaService")
@Transactional
public class CuentaServiceImpl implements CuentaService {

	@PersistenceContext
        EntityManager em; 
		
	@Autowired
	private CuentaRepository cuentaRepository;
	
	//En este método permite realizar una consulta que devuelve el listado de todas las cuentas que
	//lo cumplen. Las condiciones de la consulta se le pasan con CuentaCriteria.search(criteria).
	//No devolverá todos los elementos al pasarle un objeto Pageable para paginación.
	public Page< CuentaEntity> find(CuentaCriteria criteria, Pageable pageable){
		return cuentaRepository.findAll( CuentaCriteria.search(criteria), pageable);
	}

	//En este método deveulve la cuenta de la consulta anterior. Las condiciones de la consulta
	//se le pasan con CuentaCriteria.search(criteria).
	public Long count(StatementCriteria criteria){
		return this.statementRepository.count( StatementCriteria.search(criteria) );
	}
	
	//El groupBy no funciona bien si se mete en StatementCriteria.search(criteria), eso es porque
	//aunque hagas un multiselect() con sólo los elementos que quieres sacar en la consulta te lo va 
	//a sobreescribir por el select().
	//Una posible solución sería hacerlo como se hace en este método.
	public List< Object[]> findGroupBy(CuentaCriteria criteria){
		CriteriaBuilder cb = em.getCriteriaBuilder();
		CriteriaQuery cq = cb.createQuery();
		Root root = cq.from(StatementEntity.class);
				
		//declaramos el multiselect con las columnas a devolver
		cq.multiselect(
                       //fecha mayor
                       cb.greatest( root.get(CuentaEntity_.fecha).as(java.util.Date.class) ),
                       //fecha menor
                       cb.least( root.get(CuentaEntity_.fecha).as(java.util.Date.class) ),
                       //balance mayor
                       cb.max( root.get(CuentaEntity_.balance) ),
                       //balance menor
                       cb.min( root.get(CuentaEntity_.balance) ),
                       //media del balance
                       cb.avg( root.get(CuentaEntity_.balance) ),
                       //suma del balance total
                       cb.sum( root.get(CuentaEntity_.balance).as(java.lang.Integer.class) ),
                       //suma del balance siempre que sea mayor de cero, es decir, positivo
                       cb.sum( cb.selectCase()  
				.when(cb.greaterThan(root.get(CuentaEntity_.balance), 0), 
                                           root.get(CuentaEntity_.balance)    ).otherwise(0)),
     
                       //contador con todas las filas agrupadas
                       cb.count( root.get(CuentaEntity_.id) )
		);
                //aplicamos todas la condiciones de consulta al where
		cq.where(  CuentaCriteria.search(criteria).toPredicate(root, cq, cb)  );

                //le decimos que agrupe por el nombre de las empresas
		cq.groupBy( root.get( CuentaEntity_.empresa) );
		  
		Query query = em.createQuery(cq);

                //Por último lo podemos retornar como una lista de objetos
		return (List< Object[]>)query.getResultList();
	}	
}
2-agosto-2017
admin

Logrotate

Logrotate permite rotar a los archivos de LOG de nuestras aplicaciones. El logrotate se trata de un servicio que se ejecuta de forma autónoma, si queremos comprobar su funcionamiento basta con ejecutar la siguiente instrucción:

    logrotate -vf /etc/logrotate.conf

Es en ese fichero donde se establece la configuración base para cualquier log que deseemos rotar. Vamos a poner un ejemplo de configuración para un aplicación de Node.js donde se utiliza Forever. Para ello:

Añadimos en /etc/logrotate.conf la configuración

/home/admin/.forever/*.log {
     daily       # how often to rotate
     rotate 10     # max num of log files to keep
     missingok     # don’t panic if the log file doesn’t exist
     notifempty    # ignore empty files
     compress      # compress rotated log file with gzip
     sharedscripts # no idea what it does, but it’s in all examples
     copytruncate  # needed for forever to work properly
     dateext       # adds date to filename
     dateformat %Y-%m-%d.
}

Tras añadirlo iniciamos el logrotate

     sudo logrotate -s /var/log/logstatus /etc/logrotate.conf

Podeis comprobar que los logs se están tratando asi:

     tail -f /var/log/logstatus



Documentación logrotate

14-julio-2017
admin

Objeto JSON en javascript: JSON.stringify vs JSON.parse

El objeto JSON contiene los métodos necesarios para analizar el JavaScript Object Notation (JSON) y, a su vez, convertir valores a JSON. A continuación se esponen los métodos de los que consta:

JSON.parse(text[, reviver])
Convierte una cadena de texto en un objeto de javascript.

Parámetros
text: La cadena que convertirá a JSON. Vea el objeto JSON para una descripción de la sintaxis JSON.
reviver (Opcional): Función que sobreescribe cómo se transforma el valor producido por el parsing.

Retorna el objeto que se corresponde con el texto JSON entregado.

JSON.parse('{"p": 5}', function (key, value) {
    if(key === "") return value;     
    return value * 2;             
});                           
// { p: 10 }



JSON.stringify(valor[, remplazo [, espacio]])
Convierte un valor dado en javascript a una cadena JSON.

Parámetros
valor: El valor que será convertido a una cadena JSON.
función de remplazo (Opcional): Es una función que altera el comportamiento del proceso de conversión a cadena de texto, o un array de objetos String o Number que representan una lista de elementos validos que se incluyen en la cadena JSON.
espacio (Opcional): Es un objeto de tipo String o Number que es usado para insertar un espacio en blanco dentro de la cadena de salida JSON para su mejor comprensión. Si es un número, se entiende que representa el numero de espacios a agregar; este numero tiene un limite de 10 espacios; numeros menores que 1 inplican que no se utiliza espacio alguno. Si es un cadena (sólo los 10 primeros caracteres son tomados en cuenta), esta es usada como espacios en blanco. Si este parámetro no se define o este es nulo no se agrega ningun espacio.

Retorna un string JSON representando el valor dado.

function replacer(key, value) {
  // Filtrando propiedades 
  if (typeof value === "string") {
    return undefined;
  }
  return value;
}

var foo = {foundation: "Mozilla", model: "box", week: 45, transport: "car", month: 7}; 
var jsonString = JSON.stringify(foo, replacer);
// '{"week":45, "month":7}'

Fuente Json

Páginas:«1234567...25»

Categorias

Linkedin