miércoles, 29 de abril de 2015

impresión raw lenta en windows 7 usando spooler de windows

Este tema me ha dado verdaderos quebraderos de cabeza y no he podido solucionarlo con información de ningún otro lugar. Me gustaría compartirlo por si alguien se encuentra con el mismo problema:

Hemos detectado que en windows 7 la impresión se vuelve muy lenta cuando llamamos reiteradamente a la función para escribir cada linea de impresión es decir algo como:

WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 1');
WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 2');
WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 3');
WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 4');
WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 5');
...

mientras que si nuestro codigo fuese algo como ...

WriteRawDataToPrinter('MI_IMPRESORA', 'LINEA 1 LINEA 2 LINEA 3 LINEA 4 LINEA 5' );

nuestra impresión no sería lenta. Se debe al hecho de 'generar un documento' para linea y su correspondiente gasto de acceso.

Esta misma forma de proceder en windows 8 no produce lentitud alguna. (Supongo que lo gestiona el spooler de windows 8)


codigo fuente de ejemplo: delphi

uses
 Winspool

------------------------------

function Tform1.WriteRawDataToPrinter(PrinterName: String; Str: String): Boolean;
var
  PrinterHandle: THandle;
  DocInfo: TDocInfo1;
  i: Integer;
  B: Byte;
  Escritos: DWORD;
begin
  Result:= FALSE;
  if OpenPrinter(PChar(PrinterName), PrinterHandle, nil) then
  try
    FillChar(DocInfo,Sizeof(DocInfo),#0);
    with DocInfo do
    begin
      pDocName:= PChar('Printer Test');
      pOutputFile:= nil;
      pDataType:= 'RAW';
    end;
    if StartDocPrinter(PrinterHandle, 1, @DocInfo) <> 0 then
    try
      if StartPagePrinter(PrinterHandle) then
      try      

        WritePrinter(PrinterHandle, PChar(Str), Length(Str), Escritos);      
        Result:= TRUE;
      finally
        EndPagePrinter(PrinterHandle);
      end;
    finally
      EndDocPrinter(PrinterHandle);
    end;
  finally
    ClosePrinter(PrinterHandle);
  end;
end;

lunes, 27 de abril de 2015

Herramientas para optimizar tu página o aplicación web

https://developers.google.com/speed/pagespeed/


Usa la opción:

- Introduce tu url (¡¡OJO!! En un servidor en internet. No vale tu servidor local).
- Pulsa analizar
- Espera los resultados e intenta corregirlos

Esta herramientas permite la opción de descargar los ficheros de tu sitio web optimizado para mejorar la entrega. Optimiza imágenes, css y javascript.


Combinar CSS Externos

Cada archivo CSS, que está utilizando tu sitio web, añade tiempo a la velocidad de carga de la página.
A veces esto es inevitable, sin embargo, en la mayoría de los casos se pueden combinar dos o más archivos CSS usando la conocida técnica de “copiar y pegar”.
Al código CSS no le importa dónde está o en qué cantidad de archivos se encuentre.
A menudo, una de las razones por que las que tienes varios archivos CSS, es porque el diseñador de tu página ha encontrado que es más fácil trabajar con archivos separados.


Combinando archivos CSS aceleras la carga de tu página.
Combinando archivos CSS aceleras la carga de tu página.
Un archivo CSS, que contiene toda la información de tus archivos CSS combinados, funcionará igual de bien y mejorará la velocidad de tu página. Combinando todo el CSS en un archivo se reduce considerablemente la cantidad de tiempo que tarda en cargar la página web ya que se reduce la cantidad de recursos que el navegador tiene que cargar antes de mostrar la página.
¿Cómo combinar CSS?
A menudo se puede simplemente copiar y pegar el contenido de cada archivo CSS para hacer un archivo principal CSS. Tendrás muchos archivos CSS que están siendo cargados y puedes crear un nuevo archivo CSS que contenga todo el contenido de los otros.
Con este método, se mantendrá todos tus viejos archivos CSS a salvo y nombrados correctamente por si tienes que utilizarlos de nuevo.
A continuación, actualiza el código HTML con el nombre del nuevo archivo y elimina todas las declaraciones a los archivos antiguos.
Otra forma de hacerlo es tener dos o tres archivos CSS y simplemente añadir el contenido de un archivo en otro ya existente. Por ejemplo, puedes tener un archivo CSS llamado “main.css” y otro llamado “sidebar.css” que están declarados en el código HTML. Para combinarlos, puedes copiar el contenido de “sidebar.css” y pegarlo el contenido de “main.css.”
Una vez que hayas hecho esto, quita la declaración a “sidebar.css” del HTML. Ahora tienes un solo archivo CSS en lugar de los dos que tenía que cargar el navegador antes de mostrar la página web. Tu página web ahora cargará más rápido.

fuente: http://www.googleessimple.com/combinar-css-externo.html

Optimizar la entrega de CSS

La entrega de CSS simplemente significa “la forma en que el CSS ocurre en una página web”. El CSS se puede utilizar de muchas maneras en una página web y aún funciona. Puesto que hay muchas maneras de usarlo, existen muchas configuraciones diferentes de CSS. El CSS debe ayudar a tu página web a hacerla más rápida, no a ralentizarla.
La forma en la que el CSS se utiliza en una página web ha sido “abrumadoramente” determinante para los diseñadores, no para los propietarios de sitios web. Así que el diseñador de páginas web realiza un código CSS impecable y bien escrito y lo distribuye en varios archivos diferentes para mayor claridad.
 
Optimiza la entrega de CSS en tu página web.
Optimiza la entrega de CSS en tu página web.
Piensan, con mucho mérito: “he hecho un trabajo increíble”. Esto es lo que les han enseñado. Lamentablemente esta y otras prácticas terminan destruyendo el rendimiento de las páginas web.
Gracias a este tipo de prácticas, te podrás dar cuenta de que los diseñadores web han comenzado a realizar códigos que ayuden a los usuarios, trabajando lo más rápido posible. Sin embargo es probable que tengas código CSS que esté perjudicando tu sitio web en lugar de ayudarlo.
Un ejemplo de una “entrega de CSS optimizado”.
Desde la página de documentación de Google, y en la página de vídeos de PageSpeed Insights, recomiendan 4 técnicas para tener una buena configuración CSS:
  • No más de una hoja de estilos CSS externa.
  • Instrucciones CSS cortas en las etiquetas de estilo para el contenido superior de la página.
  • No hacer llamadas (@import) de CSS.
  • No agregar líneas CSS en el código HTML en elementos como DIV’s o H1’s.
 
Ejemplo de CSS optimizado en una página web.
Ejemplo de CSS optimizado en una página web.
Si estás familiarizado con estas diferentes técnicas CSS puedes utilizar la herramienta de PageSpeed Insights para obtener una visión general de cómo tu página Web o blog utilizan CSS. Si no lo estás, no te preocupes, te lo explicaré cada uno a continuación (que es menos confuso de lo que parece, lo prometo).
Muchas personas hacen caso omiso cuando escuchan que Google aconseja “hacer páginas para los usuarios, no para los motores de búsqueda“. Parece un poco irreal que quieran seguir este consejo ya que después de todo estás haciendo una página web para ser visto en los motores de búsqueda. Pero antes de hacer caso omiso vamos a ver qué quieren decir con esto.
1. Archivos CSS externos.
Los archivos CSS externos son, principalmente, la forma en que el CSS se utiliza en las páginas web y muy probablemente la forma en la que usas tus CSS. En la sección “head”, del código HTML, habrá una línea de código que se parece a esto:
1<link rel="stylesheet" type="text/css" href="http://www.tusitio.com/style.css" media="screen" />
Este código llama a tu archivo CSS y son llamados “externos” porque las instrucciones CSS se encuentran en un archivo separado de tu HTML. Tener un archivo CSS externo es, de hecho, una forma para manejar tus CSS y la ventaja que tiene es que el navegador los guarda en su caché. El problema comienza cuando tienes varios de estos archivos. Desafortunadamente, esto ocurre muy a menudo en WordPress y otros CMS.
Si tienes más de un archivo CSS estos deben ser combinados en un solo archivo.
Cuando tienes varios archivos CSS externos, el navegador tiene que descargar cada uno antes de que pueda descargar tu página.
Esto causa muchas “idas y vueltas” para descargar todos los archivos CSS y se traduce en una página web lenta. Esto se puede cambiar fácilmente mediante la combinación de todos los archivos CSS en un solo archivo.
 
Combinar archivos CSS en uno sólo acelera la carga de tu página web.
Combinar archivos CSS en uno sólo acelera la carga de tu página web.
Para saber más a fondo como combinar estos archivos puedes ver el artículo combinar CSS externo.
2. CSS en línea.
CSS en línea son las instrucciones CSS que se incluyen en la cabecera del propio documento HTML.
La principal ventaja de este método es que no hay ningún archivo adicional (externo) que se tenga que cargar antes de que se muestre la página web. Esta ventaja sólo es factible si las instrucciones CSS son pocas. Si el CSS es grande entonces no es un buen método.
El método CSS en línea se lleva a cabo mediante la colocación de las instrucciones dentro de las etiquetas de estilo como se muestra a continuación:
 
Usar CSS en línea para el contenido superior de la página.
Usar CSS en línea para el contenido superior de la página.
1<style>
2Las instrucciones CSS van aquí
3</style>
Este método puede realmente acelerar la carga de las páginas en los navegadores. Para conocer más a fondo el uso de este método puedes ver el artículo ¿cómo usar CSS en línea?.
3. No uses “@import” para cargar archivos CSS.
El método @import es cuando los archivos CSS externos cargan otros CSS externos con el comando @import en lugar de vincularlos como se mencionó anteriormente.
Este método hace que el archivo CSS o los archivos llamados carguen más lento ya que sólo se pueden descargar de uno en uno utilizando este método. El código es algo como esto:
1@import url("style.css");
Estas llamadas realmente afectan la velocidad de la página web, y muchos diseñadores lo hacen todavía, por lo que deberías comprobar si tú también lo haces.
 
El uso de @import ralentiza la carga de tu página web.
El uso de @import ralentiza la carga de tu página web.
Para conocer más a fondo el uso de este método puedes ver el artículo evitar el uso de @import.
4. No agregues CSS en los elementos HTML.
Es muy común agregar estilos en los elementos HTML, de hecho, suelo hacerlo todo el tiempo.
En las directrices de PageSpeed Insights de Google, en el apartado “optimizar la entrega de CSS“, Google dice que no debemos hacer esto.
Dice que esto hará que el navegador responda más lento y que no va a ser bueno aplicar esta técnica en nuestro código ya que va en contra de la política de seguridad de contenido del W3C que es un protocolo de seguridad que bloqueará cualquier estilo en los elementos por defecto. Un ejemplo de este método puede ser:
 
No agregues CSS en los elementos HTML de tu contenido.
No agregues CSS en los elementos HTML de tu contenido.
1<p style="float:left;"> or
2<div style="color:#fff;">
Conclusión:
Como puedes ver hay muchas maneras de utilizar CSS en las páginas web pero la conclusión es que tenemos que limpiar el código y optimizar la entrega de CSS para asegurar que nuestras páginas se carguen más rápido.
Las recomendaciones son las siguientes:
  • Combina las hojas de estilo CSS externos.
  • Añade instrucciones CSS cortas a la cabecera.
  • No uses la instrucción @import para importar CSS.
  • No uses CSS en elementos HTML dentro del contenido.
Fuente: http://www.googleessimple.com/combinar-css-externo.html

sábado, 25 de abril de 2015

Huawei Ascend p6 activar modo desarrollador depuracion usb

En el terminal Huawei Ascend p6 esta opción aparece oculta por defecto para mostrarla debemos seguir los siguientes pasos:

 Entramos a la opción "Config" y nos dirigimos hacia la sección "Acerca del telefono", a la cual accedemos, una vez dentro, donde dice numero de compilación, deberemos tocar esa opción 4 o 7 veces, y nos mostrara un mensaje diciendo "felicidades, ya es un desarrollador".
vamos atrás y encontramos un menú que antes no aparecía, el cual es "opciones de desarrollo" entramos en ella y tocamos la opción que dice "depuración usb" y destildamos la opción que dice "verificar aplicaciones vía usb".


Fuente: https://es.answers.yahoo.com/question/index?qid=20140124161036AAgUEAx

miércoles, 22 de abril de 2015

Cambiar la url del navegador sin recargar la página usando javascript o angular js

Yo lo he solucionado para angular Js que es el caso que me atañe, pero la solución pasa por javascript así que bastaría con usar la sentencia:

var objetoEstado;
window.history.pushState(objetoEstado, "titulo web",  "https://jesusmgcia.blogspot.com");

Documentación oficial:

Manipulando el historial del navegador


El objeto DOM window proporciona acceso al historial del browser a través del objeto history . Esto expone métodos útiles y propiedades que te permiten  avanzar y retroceder a través del historial del usuario, asi como, --Iniciando con HTML5-- manipular el contenido del historial de la pila.

Viajando a través de la historia

Retroceder y avanzar a traves del historial del usuario es realizado utilizando los métodos back()forward(), y go().

Moviendose hacia adelante y hacia atrás

Para moverte hacia atrás, solo debes hacer:
window.history.back();
Esto actuará exactamente como si el usuario hiciera clic en el botón "atrás" en la barra de herramientas del browser.
De manera similar, puedes moverte hacia adelante (como si el usuario hiciera clic en en el botón "adelante"), de esta forma:
window.history.forward();

Moverse a un punto específico del historial

Puedes usar el método go() para cargar una página desde el historial de la sesión, identificada por su poscición relativa a la página actual  (Iniciando con la página actual, por supuesto, relativa al índice 0).
Para moverse atráz una página (el equivalente a un llamado a back()):
window.history.go(-1);
Para moverse una página hacia adelante, como si llamaras forward():
window.history.go(1);
De manera similar, puedes avanzar 2 páginas pasándo 2, y así sucesivamente.
Puedes obtener el número de páginas en el historial de la pila mirando el valor de la propiedad length:
var numberOfEntries = window.history.length;
Nota: Internet Explorer admite el paso de cadenas de URL como parámetro para go(); esto no es estándar y no está implementado en Gecko.

Añadiendo y modificando historial de entradas

HTML5 introdujo los métodos history.pushState() e history.replaceState(), los cuales te permiten añadir y modificar entradas de historial, respectivamente. Estos métodos trabajan en conjunto con el evento window.onpopstate .

Ejemplo

Suponga que http://mozilla.org/foo.html ejecuta el siguiente JavaScript:
var stateObj = { foo: "bar" };
history.pushState(stateObj, "page 2", "bar.html");
Esto causará que la barra de URL muestre http://mozilla.org/bar.html, pero no provocará que el navegador carge load.bar ni tampoco que se verifique si bar.html existe.
Suponga ahora que el usuario navega hacia http://google.com, y despúes hace clic en Atrás.  En este punto, la barra de URL mostraráhttp://mozilla.org/bar.html, y la página tendrá un evento popstate cuyo state object contiene una copia de stateObj. La página en si se verá como foo.html, aunque la página podria modificar su contenido durante el evento popstate event.
Si hacemos clic en "atrás" nuevamente, la URL cambiará a http://mozilla.org/foo.html, y el documento generará otro evento popstate event, esta vez con un state object nulo. Aquí también, ir atrás no cambia el contenido del documento con respecto al paso anterior, aunque el documento permite actualizar su contenido manualmente después de recibir el evento popstate.

El método pushState()

pushState() toma tres parámetros: un objeto estado, un título (el cual es normalmente ignorado), y (opcionalmente) una URL.  Vamos a examinar cada uno de estos tres parametros en más detalle:
  • object estado —  El objeto estado es un objeto JavaScript el cual esta asociado con la nueva entrada asociada al historial creada por pushState(). Cada vez que el usuario navega hacia un nuevo estado, un evento popstate event se dispara, y la propiedad state del evento contiene una copia del historial de entradas del objeto estado.
    El objeto estado puede ser cualquier cosa que puedas pasar a JSON.stringify.  Porque Firefox guarda los objetos estado en el disco del usuario, entonces puede ser restaurado después de que el usuario reinicie su navegador, imponemos  un tamaño límite de 640K caracteres en representacion JSON  de un objeto estado. Si pasas un objeto estado cuya representación es más larga que esto a pushState(), el método arrojará una excepción. Si necesitas más espacio, te recomendaos usar sessionStorage y/o localStorage.
  • título — Firefox frecuentemente ignora este parámetro, aunque podriá usarse en el futuro. Pasar una cadena de caracteres vacia aqui podría asegurar en un futuro estar a salvo en contra a futuros cambios en este método. Alternativamente podrías pasar un título corto del estado hacia el cual te estas moviendo.
  • URL — El nuevo historial de entradas  URL está dado por este parámetro. Note que el browser no permitirá cargar esta URL después de llamar apushState(),  pero podría intentar cargar la URL más tarde, por ejemplo, después de que el usuario reinicie su navegador.  La nueva URL no necesita ser absoluta; si es relativ, es resuelta relativamente a la actual URL.  La nueva URL debe ser del mismo origen de la actual URL; de otra forma, pushState()no lanzará una excepción. Este parámetro es opcional; si no se especifica, se sitúa a la URL actual del documento.
En un sentido, llamar pushState() es similar a asignar window.location = "#foo",en tanto que también se va a crear y activar otra entrada al historial asociada con el documento actual. Pero pushState() tiene las siguientes ventajas:
  • La nueva URL puede ser cualquier URL en el mismo origen de la actual URL. En contraste, asignar window.location te mantiene en el mismo documentsolamente si modificas unicamente el hash.
  • Tu no tienes que cambiar la URL si no deseas. En contraste, asignar window.location = "#foo"; solamente crea una nueva entrada en el historial si el hash actual no es #foo.
  • Puedes asociar datos arbitrarios con tu nuevo historial de entrada. Con el enfoque hash-based, tu necesitas codificar todos datos relevantes dentro de una cadena de caracteres corta.
Note que pushState() nunca provoca un evento hashchange para ser notificado, inclusive si la nueva URL difiere de la antigua URL únicamente en su hash.

El método replaceState()

history.replaceState() trabaja exactamente igual a history.pushState() excepto que replaceState() modifica la entrada al historial actual en lugar de crear una nueva.
replaceState() es particularmente útil si deseas actualizar el objeto estado o la URL del la actual entrada al historial en respuesta a alguna acción del usuario.

El evento popstate

Un evento popstate es dirigido a la ventana cada vez que la entrada al historial cambia. Si la entrada al historial es activada y fué creada por un llamado apushState o afectada por una llamada a replaceState, la propiedad state del evento popstate contiene una copia del historial de entradas del objeto estado.

Jesús Moreno - Ingeniero Ténico Informático - consultor Informático

Hola, soy Jesús Moreno Ingeniero Técnico Informático en sistemas por la US y propietario de éste blog. Mi trabajo en los ultimos años se ...