lunes, 29 de marzo de 2010

Medir el tiempo de una rutina en PHP

0

Hace una semana comentaba como poder medir el tiempo de una rutina con c/c++, principalmente con el fin de optimizar nuestro código.

Hoy muestro como hacer lo mismo en PHP:

$A = microtime(true);
for($i = 0; $i < 1000000; ++$i)
{
    /* Nuestro código */
}
$B = microtime(true);
$t = ($B - $A);
echo("Duracion: ".$t." segundos.");

Muy fácil, tomamos el valor del reloj antes del for,tomamos nuevamente el valor del reloj después del for y finalmente calculamos la diferencia de tiempos (final - inicial), el resultado es el numero de segundos que tarda en realizarse nuestro código 1000000 veces.

Sitúa tu rutina dentro de un bucle si dura poco, ya que si el resultado de la medición es de pocos milisegundos no nos sirve, mejor que dure unos segundos. Omite el bucle del código de ejemplo si ya dura de por si un tiempo apreciable.

Comparte o puntua esta publicación ▼

miércoles, 24 de marzo de 2010

CSS Tabs al estilo de Windows 7

2
En este post podéis ver como crear pestañas casi idénticas a las de Windows 7, usando CSS y un poco de Javascript.
Podría haberlo hecho sin javascript pero para no complicarme mucho y hacerlo compatible con la mayoría de los navegadores lo he usado, ya que para crear un mismo efecto de pestañas sin javascript, solo css, habría que usar el selector :target, el cual solo es compatible en algunos de los navegadores mas modernos.

El html:

<div class="tabs-wrap">
 <ul class="tabs">
  <li><a href="#A">Tab A</a></li>
  <li><a href="#B">Tab B</a></li>
  <li><a href="#C">Tab C</a></li>
  <li><a href="#D">Tab D</a></li>
 </ul>
 <div id="A" class="panel">Text....A</div>
 <div id="B" class="panel">Text....B</div>
 <div id="C" class="panel">Text....C</div>
 <div id="D" class="panel">Text....D</p>
</div>
El html del es muy simple, lo justo, una lista para las pestañas y unos divs que se mostraran cuando este seleccionada cada pestaña.

El css

body{
 padding:2em 4em;
 background-color: #F0F0F0;
 font-family:"Segoe UI", "Lucida Sans Unicode", "Lucida Grande", sans-serif;
 font-size:.9em;
}
h1{
 font-family:"Palatino Linotype", "Book Antiqua", Palatino, serif;
 text-shadow: 1px 1px 1px #FFF;
}
a{
 text-decoration: underline;
 color:#00F;
}
.panel {
 border:1px solid #898C95;
 background-color:#FFF;
 padding:5px;
 clear: both;
}
.panel p {
 margin:10px;
}
.tabs{
 list-style:none;
 padding:0 2px;
 margin:0;
}
.tabs li{
 float: left;
 margin:2px 0 0 0;
    padding:0;
 background-color:#EBEBEB;
 background-image: -moz-linear-gradient(top, #F2F2F2, #CFCFCF);
 background-image:-webkit-gradient(linear,0% 0%, 0% 100%,from(#F2F2F2),to(#CFCFCF),color-stop(.5,#EBEBEB),color-stop(.5,#DDDDDD));
 filter:  progid:DXImageTransform.Microsoft.gradient(startColorstr='#F2F2F2', endColorstr='#CFCFCF');
   -ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorstr='#F2F2F2', endColorstr='#CFCFCF')";
 border:1px solid #898C95;
 border-bottom-width:0;
 position:relative;
 overflow:visible;
}
.tabs li a{
 display:block;
 text-decoration:none;
 color:#000;
 border:1px solid #FFF;
 border-bottom: none;
 padding:1px 4px;
 margin:0;
}
.tabs li:hover{
 background-color:#D9F0FC;
 background-image: -moz-linear-gradient(top, #EAF6FD, #A7D9F5);
 background-image:-webkit-gradient(linear,0% 0%,0% 100%,from(#EAF6FD),to(#A7D9F5),color-stop(.5,#D9F0FC),color-stop(.5,#BEE6FD));
 filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#EAF6FD', endColorstr='#A7D9F5');
   -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr='#EAF6FD', endColorstr='#A7D9F5')";
 border-color: #3C7FB1;
 outline:none;
}
.tabs li.selected{
  filter: none;
    -ms-filter: none;
 background-color:#FFF;
 background-image: none;
 border:1px solid #898C95;
 border-bottom: none;
 margin:0 -2px -1px;
 z-index:1001;
}
.tabs li.selected a{
 padding:2px 6px 3px;
}
El css requiere bastantes mas explicaciones. Para dar un aspecto mas parecido utilizo la fuente "Segoe UI" para todo el body.
Para crear las pestañas utilizo una lista ul. Cada elemento de la lista lo hago flotar a la izquierda para que se sitúen en horizontal. Para el fondo de las pestañas utilizo gradients (en navegadores con webkit se ve perfecto, idéntico al Windows 7). En las pestañas seleccionadas le aplico -2px de margen y aumento el padding para que "se expanda" o se amplie y se coloque encima de las demás.
Comparte o puntua esta publicación ▼

sábado, 20 de marzo de 2010

Reduce el tamaño de los ejecutables

0
Para reducir el tamaño de archivos ejecutables, comúnmente *.exe y *.dll, existen multitud de herramientas que lo permiten, pero mi preferida es UPX.
UPX es una herramienta de compresión de ejecutables, muy utilizada, muy rápida, con un alto nivel de compresión y que ademas es gratuita.
Los ejecutables ocuparan menos de la mitad en la mayoría de los casos o incluso mucho menos, fíjate en la imagen, Photoshop.exe pasa de 49.650KB a 9.449KB , pero no todo es de oro, he oído tardaran mas en abrirse, ya que creo que necesitan descomprimirse en tiempo de ejecución, pero yo personalmente nunca note nada.
Esta disponible en modo consola para Windows, linux, ...
Yo, para tener el UPX siempre accesible de forma rápida, como se ve en la captura de arriba, cree dos accesos directos, uno de ellos con el parámetro -d que sirve para descomprimir y los metí en la carpeta sendTo.
Comparte o puntua esta publicación ▼

jueves, 18 de marzo de 2010

Benchmark de rutinas en c

0

Cuando tenemos un programa funcionalmente terminado, lo ideal es optimizarlo para que no solo funcione correctamente, sino para que también sea rápido.

Lo mejor para estos casos es ver el tiempo que tarda la CPU en realizar una rutina o función de tu programa y ver si mejora (disminuye) al "optimizarlo".

#include <stdio.h>
#include <time.h>

int main()
{
    clock_t A, B;              // Tiempo inicial y final (en ciclos)
    double t;                  // Tiempo en segundos
    int i;

    A = clock();               // Marcamos el inicio
    for (i=0; i<10000; i++)
    {
        /* Código a optimizar */
    };
    B = clock();               // Marcamos el final

    t = (double)(B - A) / CLOCKS_PER_SEC;
    printf("%.16g ms\n", t * 1000.0);

    return 0;
}

Como puedes ver uso un bucle para que se la ejecución de cierto código se repita muchas veces multiplicando el tiempo por 10000 en el caso del ejemplo y así sea mas precisa medición y apreciable la diferencia de tiempo. Ademas no recomiendo mediciones de menos de unos segundo, ya que pierde precisión.

Yo siempre he usado este método para medir tiempos, basándome en el siguiente código de ejemplo que cogí de la MSDN:

// crt_clock.c
/* This example prompts for how long
 * the program is to run and then continuously
 * displays the elapsed time for that period.
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

void sleep( clock_t wait );

int main( void )
{
    long    i = 6000000L;
    clock_t start, finish;
    double  duration;

    /* Delay for a specified time. */
    printf( "Delay for three seconds\n" );
    sleep( (clock_t)3 * CLOCKS_PER_SEC );
    printf( "Done!\n" );

    /* Measure the duration of an event. */
    printf( "Time to do %ld empty loops is ", i );
    start = clock();
    while ( i-- );
    finish = clock();
    duration = (double)(finish - start) / CLOCKS_PER_SEC;
    printf( "%2.4f seconds\n", duration );
}

/* Pauses for a specified number of milliseconds. */
void sleep( clock_t wait )
{
    clock_t goal;
    goal = wait + clock();
    while ( goal > clock() );
}

Para Linux visita esta pagina que me acabo de encontrar, a parte de explicar todo esto con mas detalle publica maneras de hacerlo en Linux.

Comparte o puntua esta publicación ▼

miércoles, 10 de marzo de 2010

Apagar todas las pantallas a la vez

0
Cuando tengo que levantarme un rato del ordenador, por ejemplo para ir a cenar, suelo apagar el monitor, pero esta tarea puede ser fastidiosa cuando tienes varias pantallas (imagínate tener que buscar y pulsar el botón power de 3 o mas pantallas para apagarlas y luego otra vez para encenderlas), yo, cuando empece a usar 2 pantallas fue lo que mas note, sobretodo por que el botón de encendido de una pantalla me quedaba oculto detrás de la otra. Así que para quienes tengan un problema parecido al mio o no quieran pulsar tantos botones de encendido os dejo mi solución al problema.
Lo que hice fue crear un programa que enviara una señal a Windows para que apague las pantallas:
#include <windows.h>

#define MONITOR_ON -1
#define MONITOR_OFF 2
#define MONITOR_STANBY 1

int main()
{
  SendMessage(HWND_BROADCAST, WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
}
o "simplemente":
#include <windows.h>
int main(){ SendMessage((HWND)0xFFFF,274,0xF170,2); }

Si lo compiláis por vuestra cuenta recomiendo que configuréis el IDE o compilador para que no salga la consola, ya que queda bastante feo.
También podéis descargar el que yo compilé de aqui (no desconfiéis, es el que yo uso).
El ejecutable lo guarde en archivos de programa y configure una tecla multimedia para que se abra cuando la toco. Si tu teclado no tiene teclas multimedia, puede utilizar una tecla de método abreviado o colocar el programa o un acceso directo en el escritorio.
Ahora solo tengo que pulsar una tecla multimedia cuando quiero apagar todas las pantallas y con mover el ratón o tocar cualquier tecla ya se encienden, sin tener los problemas que os decía al principio del post.
Comparte o puntua esta publicación ▼

lunes, 8 de marzo de 2010

Teclas de métodos abreviados

0
Para quien no lo sepa o para quien no pueda disfrutar de las teclas multimedia, en Windows, en las propiedades de cualquier acceso directo existe la posibilidad de incluir una tecla de método abreviado o "hotkey", es decir, una tecla o combinación de teclas que al ser pulsadas en cualquier momento, ejecuta el acceso directo.
Nunca vi a nadie usarlas, yo nunca las usé, y no por que no me gusten sino por que nunca me acuerdo de usarlas. Pueden ser realmente útiles si nos acostumbramos a usarlas, pero lo que mas nos "impide" usarlas es que seguramente no nos acordemos de que tecla elegimos para cierta aplicación, o que a la hora de querer abrir un programa no nos acordemos de que teníamos la "tecla abreviada".
Por lo general la combinación sera CTRL + ALT + [Letra], ya que no permite usar teclas de la A a la Z sueltas, ni CTRL + [Letra], ALT + [Letra] ni WIN + [Letra], pero si deja usar, aunque yo no las recomiendo, números (del teclado numérico de la derecha), +, -, *, / y las teclas F1-F12. No las recomiendo usar por que si en cualquier momento queremos escribir, por ejemplo, 3*5 en vez de escribirnoslo nos ejecutaría las aplicaciones asociadas a esas teclas.
¡¡Acuérdate de configurar y usar las teclas de métodos abreviados, ya que te ahorrara mucho tiempo!!
Comparte o puntua esta publicación ▼

Como configurar las teclas multimedia

6
Hoy en día la mayoría de los teclados incluyen lo que se llaman teclas multimedia que suelen estar en la parte superior, encima de las teclas F1,F2,...,F12,..., son muy útiles pero creo que se usan poquísimo, principalmente por que no estamos acostumbrandos a usarlas (yo ya he conseguido acostumbrarme a usar la tecla de abrir la calculadora) y por que a veces sirven para cosas que no nos resulta es útil, por lo que aunque tengamos una tecla para abrir MyPC, seguiremos usando el ratón, moviéndolo de un lado para otro de la pantalla buscando el programa que queremos abrir sin acordarnos de que pulsando una tecla esta todo hecho.
Para cambiar la funcionalidad de las teclas sin tener que instalar ningún programa, en Windows XP podéis usar TweakUI solo tenemos que entrar en el registro (pulsa WIN+R y ejecuta regedit) y situate en: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\AppKey
Veras que "dentro" de AppKey hay carpetas claves, a cada una le corresponde una tecla, o a cada tecla le corresponde una clave con su numero (las que no están creadas puedes crearlas).

Con esta tabla creo que ya sabrás que numero le corresponde a cada tecla y su acción por defecto:
1 APPCOMMAND_BROWSER_BACKWARD Navigate backward.
2 APPCOMMAND_BROWSER_FORWARD Navigate forward.
3 APPCOMMAND_BROWSER_REFRESH Refresh page.
4 APPCOMMAND_BROWSER_STOP Stop download.
5 APPCOMMAND_BROWSER_SEARCH Open search.
6 APPCOMMAND_BROWSER_FAVORITES Open favorites.
7 APPCOMMAND_BROWSER_HOME Navigate home.
8 APPCOMMAND_VOLUME_MUTE Mute the volume.
9 APPCOMMAND_VOLUME_DOWN Lower the volume.
10 APPCOMMAND_VOLUME_UP Raise the volume.
11 APPCOMMAND_MEDIA_NEXTTRACK Go to next track.
12 APPCOMMAND_MEDIA_PREVIOUSTRACK Go to previous track.
13 APPCOMMAND_MEDIA_STOP Stop playback.
14 APPCOMMAND_MEDIA_PLAY_PAUSE Play or pause playback.
15 APPCOMMAND_LAUNCH_MAIL Open mail.
16 APPCOMMAND_LAUNCH_MEDIA_SELECT Go to Media Select mode.
17 APPCOMMAND_LAUNCH_APP1 Start App1.
18 APPCOMMAND_LAUNCH_APP2 Start App2.
19 APPCOMMAND_BASS_DOWN Decrease the bass.
20 APPCOMMAND_BASS_BOOST Toggle the bass boost on and off.
21 APPCOMMAND_BASS_UP Increase the bass.
22 APPCOMMAND_TREBLE_DOWN Decrease the treble.
23 APPCOMMAND_TREBLE_UP Increase the treble.
24 APPCOMMAND_MICROPHONE_VOLUME_MUTE Mute the microphone.
25 APPCOMMAND_MICROPHONE_VOLUME_DOWN Increase microphone volume.
26 APPCOMMAND_MICROPHONE_VOLUME_UP Decrease microphone volume.
27 APPCOMMAND_HELP Open the Help dialog.
28 APPCOMMAND_FIND Open the Find dialog.
29 APPCOMMAND_NEW Create a new window.
30 APPCOMMAND_OPEN Open a window.
31 APPCOMMAND_CLOSE Close the window (not the application).
32 APPCOMMAND_SAVE Save current document.
33 APPCOMMAND_PRINT Print current document.
34 APPCOMMAND_UNDO Undo last action.
35 APPCOMMAND_COPY Copy the selection.
35 APPCOMMAND_REDO Redo last action.
37 APPCOMMAND_CUT Cut the selection.
38 APPCOMMAND_PASTE Paste
39 APPCOMMAND_REPLY_TO_MAIL Reply to a mail message.
40 APPCOMMAND_FORWARD_MAIL Forward a mail message.
41 APPCOMMAND_SEND_MAIL Send a mail message.
42 APPCOMMAND_SPELL_CHECK Initiate a spell check.
43 APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE Toggles between two modes of speech input: dictation and command/control (giving commands to an application or accessing menus).
44 APPCOMMAND_MIC_ON_OFF_TOGGLE Toggle the microphone.
45 APPCOMMAND_CORRECTION_LIST Brings up the correction list when a word is incorrectly identified during speech input.
Una vez escogida las teclas o tecla hay que añadir un nuevo valor de cadena dentro de la clave de la tecla (1, 2, ..., 44, 45) con una de los siguientes tres posibles nombres:

  1. ShellExecute: para ejecutar cualquier archivo (*.exe también), por ejemplo "regedit.exe" para tener una tecla que nos abra el editor de registro.
  2. Association: para ejecutar el programa asociado a cierta extensión o protocolo, por ejemplo ".txt" o "http".
  3. RegisteredApp: para ejecutar programas registrados en el sistema operativo, "mail" por ejemplo.
Y ya esta todo lo necesario, solo unas aclaraciones:
  • Las teclas a partir de la 23 solo valen en S.O posteriores al XP (incluido) y suelen ser menos comunes, seguramente uséis las 20 primeras
  • Hay aplicaciones que "capturan" estas teclas para uso propio, impidiendo que llegue al "explorer", por ejemplo, si tienes el navegador abierto es posible que la función de las teclas 1 y 2 (Navigate backward & forward) funcionen como el navegador indique y no como nosotros configuramos.
  • Creo que no se puede personalizar las teclas del volumen, Mute, Play, Stop, Siguiente, Anterior de esta manera.
La tabla mas o menos la he copiado de aqui
Comparte o puntua esta publicación ▼

sábado, 6 de marzo de 2010

Cambiar el servicio de búsqueda de tipos de archivo

0
Cada vez que intentamos abrir un archivo desconocido para Windows aparece una ventanita preguntando si queremos abrir el archivo con un programa ya instalado o usar el servicio web para buscar un programa.
Si seleccionamos usar el servicio web [...] por defecto nos abre una pagina de Microsoft que no suele aportar mucha información.
Para quienes quieran cambiar el servicio solo tiene que abrir el editor de registro pulsando:
WIN + R
Y escribe regedit.exe Una vez dentro del editor de registro sitúate en la carpeta clave de HKEY_LOCAL_MACHINE:
\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Associations
Y modifica el valor "Application" cambiando su contenido por "http://www.fileinfo.com/extension/%s" o por la web o servicio que tu prefieras, %s sera sustituido por la extensión del archivo.
**Funciona en Windows 7, vista, XP y seguramente en todos a partir del 2000.
Comparte o puntua esta publicación ▼

viernes, 5 de marzo de 2010

Minimiza el tamaño de los PNGs

0
PNG fue creado para sustituir al formato GIF, pero nunca me convenció del todo ya que suele ocupar bastante mas que el gif, por lo que en la mayoría de los casos solía optar por gif como formato de imágenes e iconos para la web.
Pues bien, descubro que muchas imágenes en png ocupan mas por que están mal comprimidas, es decir, algunos editores gráficos (como el Photoshop, segun la wikipedia) guardan estas imágenes poco o mal comprimidas.
Usando la utilidad que os muestro a continuación se solventa este problema, ocupando en la mayoría de los casos menos que el formato gif y ademas con mejor calidad, recuerdo que png es un formato de compresión de imágenes sin perdida, que no esta limitado a 256 colores como gif, y ademas tiene la posibilidad de incluir canal apha. Solo queda que los png animados se popularicen entre los navegadores.
PNGmin es el nombre que le e dado a la carpeta con todos los archivos necesarios (PNGOUT, OptiPNG, DeflOpt y AdvDef), os recomiendo que la copiéis en archivos de programa, aunque da igual donde este, solo lo decía por mantener un orden.
Si quieres hacer como yo y poder comprimir una imagen de una forma mas rapida, usando el menu "enviar a" como se ve en la imagen, sigue estos pasos.
  1. Pon la carpeta PNGmin en Archivos de programa o un lugar donde no la borres o la cambies
  2. Crea un acceso directo a "PNGmin.bat"
  3. Guárdalo en la carpeta "SendTo"
  4. Cámbiale el icono al acceso directo para verlo mejor.

** Solo vale para una imagen, si tienes seleccionadas 10 solo te comprimirá la primera.

Actualizado: Se ha modificado el programa para solventar la ultima limitación ** Ir

Comparte o puntua esta publicación ▼

jueves, 4 de marzo de 2010

HTMLayout, usa HTML en tus aplicaciones

3
El otro día me dió por instalar el Avast!, un antivirus gratuito, y mirando el típico "Acerca de..." leí en los créditos que usaba HTMLayout, e inmediatamente me puse a buscar que era eso, pues ya me imaginaba lo que podía ser y quería saber si yo también podía usarlo.
Y efectivamente, entre en su web y me descargué las demos y la sdk. Al ver las demos me sorprendió muchísimo sus posibilidades, ya que no solo era una dll que te permitía usar HTML en la interfaz de tus aplicaciones, sino que tambien css3 y unas cuantas cosas mas.
Segun dicen en su web: (Traducido)
HTMLayout es un motor de renderizado HTML ligero y rápido que te permite utilizar los archivos HTML como "skins" para tus aplicaciones.
...tiene tiempos de preparación muy cortos y su tiempo de inicio es cero.
tiene HTML y CSS mejorado para tareas de diseño. Unidades%% y fondos ampliables
Distribución de tamaño pequeño: se trata de htmlayout.dll 600KB sin comprimir.
Aunque esto ultimo no es del todo cierto, a mi me ocupa 825KB, y se trata de una dll comprimida con upx, descomprimida son unos 2.5 MB si no recuerdo mal.
A y es compatible con windows Vista y 7:

Comparte o puntua esta publicación ▼

miércoles, 3 de marzo de 2010

Resumen Febrero 2010

0
El mes de febrero a sido un mes con bastantes cambios, principalmente el tema, que ya esta cerca de la versión final, tuvo modificaciones constantes principalmente los 15 primeros días.
Antes: (Visto desde Internet Explorer 6)
bueno en realidad se veía mucho mejor, con sombras, bordes redondeados y algún que otro degradado en el Google Chrome.
Ahora:
Al cambiar el tema se me olvido poner el script de Google Analitics y yo preguntándome por que no tenia visitas, espero que no me vuelva a pasar.
17 es el numero de posts publicados en Febrero,  ¿no esta mal no?,  e intentare para este mes mejorar, no solo en número sino en calidad.
Tengo que cambiar el código del programa que resuelve sistemas de ecuaciones por uno mejorado que todavía no esta listo pero en breves lo cambiare.
En cuanto al post del programa que dibuja fractales, ya esta disponible la descarga del ejecutable de ejemplo pero no el código fuente, ya que estoy haciendo una nueva versión.
Creo que no hay nada mas que decir de Febrero 2010
Comparte o puntua esta publicación ▼

Donde esta la carpeta "SendTo" en Windows 7-8?

11

En Windows Xp era bastante fácil encontrar la carpeta "SendTo", carpeta que contiene todos los elementos del menú "Enviar a" cada vez que hacemos click con el botón derecho sobre un archivo.

Esta carpeta tan útil esta mas escondida en el Windows 7 y seguramente en el "Vista".

En XP la ruta de la carpeta era:

C:\documents and settings\'USUARIO'\sendto

En Windows 7 y 8 solo hace falta poner en la barra de direcciones:

shell:sendto

Esto nos lleva automáticamente a C:\Users\'USUARIO'\AppData\Roaming\Microsoft\Windows\SendTo

** 'USUARIO' debe ser sustituido.


Otras direcciones interesantes

shell:startup para ir a la carpeta Inicio en la que puedes meter accesos directos a programas que quieres que se inicien con Windows.

shell:quick launch para ir a la carpeta C:\Users\USUARIO\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch.

Comparte o puntua esta publicación ▼