Confusión de Programación: Los inicios en C++

Hace 2 semanas y media un compañero de la universidad me presto una biblia de C++. Ese mismo fin de semana me puse a leer el librote y decidí probar el famosísimo “Hola Mundo”, aquí el programa:

#include<iostream.h>;
int main()
{
    cout << "Hola mundo, C++!" << endl;
    return 0;
}

Compilando y de pronto… zaz!!!

Línea 1.- #warning This file includes at least one deprecated or antiquated header.

Resulta ser que hay ciertos estándares que hay que seguir xD (aquí va otra paranoia mia tipo W3C), entonces busque algo de información al respecto y en efecto, ahora ya no lleva .h, ahora simplemente es #include<iostream> así que corregí y compilé nuevamente :D

Línea 4.- In function int main(): cout undeclared (first use this function)
Línea 4.- (Each undeclared identifier is reported only once for each function it appears in.): endl undeclared (first use this function)

Otra vez errores, ahora resulta ser de que cout, endl, cin, etc… necesitan declararse. Una de dos: dejar de programar en C++ por 2 años lo deja a uno bastante desactualizado ó nunca había usado un compilador que se basara en los estándares (en la prepa en la materia de programación estructurada usabamos borland y fueron cosas básicas las que aprendimos ;) ), aunque ya estoy pensando que pueden ser ambas razones pero bueno…

…investigando más sobre el tema encontré que para declararlos hay 3 formas distintas de hacer esto básicamente.

//primera forma[GLOBAL]:
#include<iostream>
using namespace std;
int main()
{
/*instrucciones*/
}

//segunda forma[DECLARANDO UNA POR UNA]:
#include<iostream>
using std::cout;
using std::cin;
using std::endl;
//using std::/*etc..*/;
int main()
{
/*instrucciones*/
}

//tercera forma[DECLARANDO AL MOMENTO DE USO]:
#include<iostream>
int main()
{
	int x;
	std::cout << "Teclee un numero: ";
	std::cin >> x;
	return 0;
}

En la primera forma le estas diciendo al compilador que declare todo lo contenido en el “namespace std” y esto puede causar conflictos al declarar accidentalmente una variable, clase o una función que tenga el mismo nombre que alguna en el “namespace std”, además de estar declarando todo el contenido del “namespace std” el cual posiblemente no llegues a ocupar por completo de modo que solo gastas recursos.

La segunda forma es la que usualmente recomiendan, ya que no declaras todo el contenido del “namspace std” si no solamente lo que usarás de él, sin embargo hasta cierto punto puede resultar poco práctico.

La tercera forma es la que uso yo, ya que de este modo por lo menos para mi queda más claro el código y además no es declarado de manera global, sino solamente donde es utilizado.

Ahora que ya corregi estos errores a compilar se ha dicho!!!

Aquí el nuevo código:

#include<iostream>
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	return 0;
}

Perfecto!!! ningún error, ¿a ver el ejecutable? :D

zazzzz!!!! ¿murió el ejecutable? ¿pero por qué se cerro? T_T . Nuevamente a Googlear…
otro tanto tiempo después…
solución!!! usar system(“pause”);, pues bien veamos si funciona correctamente, reescribimos el código…

#include<iostream>
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	system("pause");
	return 0;
}

Al compilar esto el programa se detiene y muestra en pantalla un mensaje que dice: “Presione una tecla para continuar…” Vemos que el resultado es el esperado, el programa hace una pausa y al presionar cualquier tecla va al return 0; y se termina el programa, pero… ¿qué tal si quiero personalizar el mensaje?

Esa pregunta para alguien que ya sabe C++ es algo trivial e incluso pensé que encontraría una solución a la vuelta de la web y aunque no fue así de rápido, fue buena idea preguntarme eso ya que googleando la instrucción system(“pause”); me encontré con que no era algo correcto usarla debido a que efectuaba varias acciones:

1. Suspende el programa.
2. Llama al sistema operativo.
3. Abre la consola ó símbolo del sistema (ms-dos) [vuelve a ejecutar el sistema operativo en un subproceso].
4. El sistema operativo debe encontrar el comando PAUSE.
5. Destina la memoria para ejecutar el comando.
6. Ejecuta el comando y espera la pulsación de alguna tecla.
7. Libera la memoria.
8. Sale del sistema operativo.
9. Reanuda el programa.

Además de esto, NO ES COMPATIBLE EN OTROS SISTEMAS OPERATIVOS, es necesario usar winBugs para que la instrucción funcione correctamente, así que en cuanto a portabilidad para compilarlo en otro sistema ni pensarlo, no es multiplataforma.

Investigando al respecto encontré algunas alternativas. Para C: getchar(). Para C++: cin.get(). Como estoy programando en C++ la segunda opción es la necesaria para hacer lo que deseo pero antes de utilizar esta otra instrucción decidí googlear un poco más para ver si había alguna otra alternativa para hacer una pausa y esto fue lo que encontré: getch()

Al tener estas 2 alternativas me dispuse a escribir las sentencias correspondientes, al recompilar el código hubo una diferencia notable pero pequeña entre ambas. El código:

//usando cin.get()
#include<iostream>
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	std::cin.get(); //usa std::
	return 0;
}

//usando getch()
#include<iostream>
#include<conio.h> //usa la librería conio.h
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	getch(); //fácil de escribir
	return 0;
}

Al usar cin.get() lo que pasó fue que escribía cualquier caracter y aparecía en pantalla, de modo que es necesario presionar enter para cerrar el programa.

Al usar getch() me di cuenta que cerraba el programa al presionar cualquier caracter, de modo que estaba a punto de elegir usar getch() pero al recordar que usaba una líbrería más me puse a googlear nuevamente y me encontré que conio.h no pertenece a la biblioteca estandar de ANSI C y tampoco a la de C++, en efecto como lo podrán ver en los siguientes links: Biblioteca estandar C++, Biblioteca estandar C.

Entonces aquí por comodidad pueden usar getch() aunque es MUY recomendable seguir los estándares ;) además así se evitan incluir una librería extra que por cierto no está en el compilador de GNU/Linux. Ahora con respecto a cin.get() hay situaciones en las que usar esto no funciona como se espera debido a que cuando se pide un dato al usuario este se almacena en el buffer y por tanto para hacer que funcione correctamente cin.get() hay que limpiar ese buffer, para ello se utiliza cin.sync()

Ahora el código final:

#include<iostream>
int main()
{
	std::cout << "Hola mundo, C++" << std::endl;
	std::cin.sync(); /* En este ejemplo no es necesario agregar esta línea de código, solo es una referencia de su uso */
	std::cin.get();
	return 0;
}

Y bien así es como se pone un Hola mundo en C++ xD , trivial ¿no? y a pesar de todo este rollote se me hace más bonito C++ que Visual Basic, amén.

Nota: soy ateo igual que dios, pero pronto me volveré googleista ya que respondio muchas de mis plegarias que fueron expuestas en este post.
Nota2: Si a alguien le sirvió de algo todo este rollo aquí explicado agradezcan a google (y a León!!! xD ).
Nota3: Yo soy León :P .
Nota4: Cualquier error ya sea de sintaxis o de cualquier otro tipo, duda o sugerencia favor de dejar un comentario al respecto.

Referencias: Google, Wikipedia y GIDNetwork

Diseño de la Web de León

Esta entrada ya se la había prometido a DarkQuickSilver así que aquí esta :D .

El theme original es de “Stephen Reinhardt”, lo único que hice fue agregarle algunas funciones y cambiarle algunos detalles simples ;)

Primero que nada tomé las medidas que necesitaba mediante Firebug, ya que esta herramienta me sirve mucho para cuando quiero checar algún aspecto en cualquier diseño web :D . Posteriormente chequé si se podía hacer líquido el diseño, prácticamente cualquier diseño se puede hacer líquido siempre y cuando no tenga imágenes ya que estas no se expanden proporcionalmente y aunque así fuera, se pixelean :P . Ya que vi todas las imágenes del theme me di cuenta que solo eran imágenes con repeat :D así que por lo tanto si cambiaba el tamaño de cualquier contenedor, las imágenes de fondo se mantendrían correctamente con respecto al ancho de los mismos contenedores. Posteriormente inserte algún texto (como por ejemplo “lorem ipsum”) en el sidebar y en los contenedores de las entradas, esto para probar cual es el ancho máximo legible y que medidas darle tanto al sidebar como al contenido. Mi monitor tiene una resolución de 1680x1050px así que tomando como base ese ancho calculé por tanteo un ancho máximo que por supuesto tampoco llena completamente en el wrap (también conocido como wrapper) en el cual están las entradas y el sidebar.

Después de elegir este punto máximo de ancho el cual fue de 1300px (CSS: max-width:1300px;), elegí un ancho máximo para el contenedor de las entradas 785px (CSS: max-width:785px;) y el contenedor del sidebar 350px (CSS:max-width:350px;) por tanto eso son los límites y cuando el ancho de pantalla tiende a 1300 va aumentando hasta llegar a este límite. Pero ¿a donde se han ido los otros 165 px? pues bueno intenté llenar lo más que pude el ancho sin que se vea ilegible, por ejemplo si tienes una pantalla con un ancho de 1000px y tienes texto que va de lado a lado simplemente te pierdes a la hora de leer ya que cada línea de texto es tan extensa que no sabes en cual continuar ;) asi que además de aprovechar al máximo el ancho, también lo distribuí de manera centrada dentro del ancho máximo total del contenedor llamado wrap, de modo que esos 165px estas entre las entradas y el sidebar como un aislante, un separador ya que pegando el sidebar al contenido de las entradas uno podría confundirse e incluso se vería amontonado. Además de que este espacio sirve como un compensador del espacio ya que al reducirse los anchos no son proporcionales y el sidebar por cuestión de estética deja de reducirse antes que el contenedor de entradas, es entonces cuando el espacio libre entra en acción, el contenedor de entradas sigue usando porcentajes, sin acercarse totalmente a su ancho mínimo, por tanto puede apoderarse del espacio libre de 165px del cual se ha venido apoderando a partir de que el ancho total del contenedor wrap es inferior a 1146.94px, el diseño no se alcanza a desbordar en ningún momento ya que deja de apoderarse de el ancho extra cuando llega a su ancho mínimo el contenedor wrap de 760px (CSS:min-width:760px;) y por tanto aunque reduzcas la resolución o el ancho de la ventana (medida la cual resultaría un poco ridícula a menos que estés en un celular) no se sale de este contenedor el sidebar :D ya que aún quedan 3px libres aproximadamente ;) . No lo hice con un ancho exacto de 800px ya que la barra de desplazamiento también quita algunos pixeles, no quita tanto como los 40px pero funcionan bien ;) .

Una vez con el esqueleto del diseño terminado solo falta cambiar algunos detallitos en cuanto a colores, bordes y el diseño opuesto al de color opaco, el cual consiste en una hoja de estilos idéntica a la primera excepto en los colores :D backgrounds, hovers, colors, anchors, divs, etc. Por cierto que el footer y el header tienen un ancho de 100% asi que no necesitan un ancho máximo ni mínimo ya que estos ya están dados por el wrap. Digamos que es como un resorte que cuando llega al mínimo no deja que lo que esta atrás y adelante de este se reduzcan más que el tamaño del mismo.

En el header incluí un javascript el cual fue fusil de otro sitio xD tuve que revisarlo y quitarle algunas cosas que no se usaba de ese script, yo no se mucho realmente de javascript y ese script usaba DOM y todo un rollo para hacer que funcione, es como un switch que te cambia el CSS default al alternativo ;) . Posteriormente hice en MS Paint un foquito prendido y uno apagado :D con las mismas medidas. Luego aplique el siguiente CSS:

div#dark {
cursor:pointer;
background:url(images/oscuro.gif) no-repeat fixed right bottom;
text-indent:-9999px;
overflow:hidden;
position:fixed;
z-index:9999;
padding:0;
margin:0;
bottom:0;
right:0;
width:30px !important;
height:62px !important;
}

div#dark:hover {
background:url(images/claro.gif) no-repeat fixed right bottom;
}

div#lite {
display:none;visibility:hidden
}

En el CSS para la plantilla blanca solo aplique igual en la misma dirección y en sentido opuesto :D

Posteriormente un pequeño script para que en los comentarios al dar click en las caritas se pongan en la caja de texto y finalmente las respectivas traducciones al theme ;) .

Con respecto al botón de no pinchar solo es una imagen fixed con CSS :) con un link a una página donde hay un contador. En “Esta Página” te proveen del código para tu botón para que lo coloques donde gustes sin embargo yo decidí que se desplazara con la página así que modifique un poquito el código. Y pues también tiene un pequeño error por allí ya que también debería de aparecer un mini-chat para que puedan dejar su comentario pero aparece como error 404 U_U .

Ese botoncito tiene un link con algunas variables que se envían en php y entonces el sitio toma la variable del sitio donde se pidió el botón y supongo que en una base de datos tienen el url de cada página y su respectiva cantidad de impresiones xD . Pero pues ya estoy pensando seriamente en quitarlo debido a que estamos regalandole dinero a los de acuerdate.net ya que cada que das click tiene anuncios de adsense y les cuenta la impresión XD .

Solo restaba validar el theme y corregir las etiquetas que no estuvieran correctamente cerradas ;) .

Mi banner (son 2 uno para el theme claro y otro para el oscuro) me lo hizo Illi.Pro jeje se lo pedi como un favor ya que no se mucho de Photoshop :P .

Espero esto haya aclarado tus dudas darkquicksilver ;) y espero el post sea de utilidad jeje :P .

Hay que echarle una leída a un manual de javascript por que esta dura la procrastinación :S .

Transición: 25% ;) Jeje avanzo digamos que más o menos rápido hasta ahora :P .

¿Cómo Descargar Vídeos y/o Audio de YouTube?

YouConvertIt es una herramienta online cuya función es convertir audio, vídeo, archivos comprimidos, imágenes y documentos (ya sea de texto, [x]html, scripts, etc.), pero además de estas funciones también podemos decargar vídeos de YouTube, Google Vídeo y Metacafe incluso si así lo deseamos podemos descargar solo el audio con esta gran herramienta ;) .

Para bajar vídeos de “YouTube, Google Vídeo ó Metacafe” das click en la pestaña “Convert Online Video“, posteriormente solo debes poner el URL del Vídeo en la caja de texto y dar click en “Download It”.

Y listo tendrás un link para la descarga en formato .flv (debes de tener un reproductor de archivos .flv para poder visualizar el vídeo):

Si quieres que te lo convierta en otro formato de vídeo o de audio procede escribiendo tu e-mail para que te envíen el link de descarga y posteriormente selecciona en que formato lo deseas, ya sea audio ó vídeo:

Posteriormente te saldrá un letrero de que el archivo ha sido descargado y lo estan convirtiendo al formato que deseas, el link de descarga será enviado a tu correo. Ahora solo queda esperar aproximadamente unos 10 minutos aproximádamente en lo que hace la conversión aunque también depende de que tan grande sea el vídeo que quieres descargar.

También puedes convertir archivos que tengas en tu computadora a diversos formatos ;) puedes enviar archivos a tus contactos y además de esto, también incluye una función para conversión de unidades :D .

Click Aquí Para Acceder a YouConvertIt

Bug en Windows Vista y XP: ¿Nombre de Dispositivo No Válido?

Me di cuenta de el bug cuando estaba editando el nombre de unas imágenes con extensión .gif y .png . 2 de ellas tenían el siguiente nombre: comm1.gif y comm2.gif . Lo que yo quería era ponerle otros nombres: com.gif y com2.gif respectivamente, así que cambie el del primero y para mi sorpresa al querer cambiar el segundo archivo al nombre de com2.gif me salió un letrero como el siguiente:

Eso se me hizo muy raro así que lo intente de nuevo e incluso actualice la carpeta para ver que no fuera algún error de que estuviera editando otro archivo etc. así que después de reintentar un par de veces me seguía saliendo el mismo letrero. Utilizando la laptop de mi hermana que también tiene Windows Vista me di cuenta de que no se podía editar tampoco el nombre de un archivo de texto (.txt) le intenté cambiar el nombre con números del 0 al 9 no se cambiaba. Volví a mi computadora y me dispuse a hacer el experimento con un archivo de texto y aquí tienen la evidencia:

YouTube Preview Image

En el vídeo le cambio el nombre al archivo varias veces, puede verse un poco mejor en pantalla completa, lo que pasa es que le reduce mucha calidad youtube pero creo que se alcanza a apreciar un poco.

Al parecer funciona tanto en archivos .gif como en archivos .txt y hasta en carpetas y archivos .docx . No se si exista alguna extensión que se salve de esto pero se me hace bastante raro…

De hecho intenté escapar de este letrero usando otro método, decidí subir un archivo “nombre.txt” a un servidor y luego en el servidor renombrarlo a “com1.txt”, posteriormente lo descargue y me decía que ya tenía un archivo con ese nombre:

Lo curioso es que yo tengo activadas las opciones para ver archivos ocultos y también de sistema, entonces se me hizo bastante raro que me respondiera eso ya que no existe ningún archivo con ese nombre en la carpeta de destino.

No sé exactamente si afecte de igual manera a todos los Windows o solo a ciertas versiones de Windows Vista, si alguien sabe el por que o se da cuenta de que también ocurre lo mismo en su versión de Windows deje un comentario al respecto, se le agradece de antemano.

Solo lo he probado en 2 computadoras:
-Una con Windows Vista Home Premium 32BIT SP1
-Otra con Windows Vista Home Basic 32BIT SP1

-Además un amigo llamado [sin nombre] testeo en Windows XP y me dijo que no le salía ningún letrero pero que simplemente no se podía poner ese nombre.
-También otro amigo llamado Cervantes testeo en Windows XP y me dijo lo mismo, que no le salía ningún letrero pero que se regresaba al nombre anterior del archivo, en este caso “come”. De cervantes me fio mas que de [sin nombre] debido a que este quiso que lo mencionara en el blog con ese apodo ¬¬ pero bueno, por si quieren matar a [sin nombre] juega tibia y se llama Haaman.

Dejen su comentario ;)

Actualización a Firefox 3.0.4

El 12 de Noviembre se ha publicado una nueva actualización para Firefox, se trata de la versión 3.0.4 y contiene las siguientes actualizaciones:

  • Solucionados varios problemas de seguridad.
  • Solucionados varios problemas de estabilidad.
  • Ya están disponibles las versiones oficiales de los idiomas islandés y tailandés.
  • Están disponibles para probar versiones beta de los siguientes idiomas: búlgaro, esperanto, estonio, letón, occitano y galés.
  • Actualizada la lista interna de Sufijos públicos.
  • Solucionado un problema en el que el panel de “Añadir marcador” tapaba la herramienta IME de introdución caracteres japoneses, coreanos, chinos e índicos. (bug 433340)
  • Activados nuevos certificados raíz EV. (bug 451305)
  • Arreglado un problema que provocaba que algunas contraseñas guardadas usando Firefox 3.0.2 no funcionaran correctamente. (bug 457358)
  • En algunas situaciones, Firefox no guardaba correctamente la configuración proxy para protocolos diferentes del HTTP. (bug 446536)
  • Para ver los cambios en publicaciones previas, lee las notas de versión de Firefox 3.0.3.

Los problemas de seguridad (4 vulnerabilidades críticas, 2 de impacto alto, 2 moderado y 1 bajo) los pueden ver en este link.

La lista de bugs este en este otro link.

Akismet: Estadísticas

Recientemente la actualización de Akismet trae estadísticas con gráficos para que puedas checarlas desde tu Dashboard (Tablero):

Una pequeña traducción de lo que dice abajo:

¿Qué diablos esta haciendo el jamón en mi blog? Yo soy vegetariano.

Al Spam la mayoría de la gente la conoce como los comentarios no deseados de comerciales en su blog, su contraparte la llamamos ham (jamón) para indicar comentarios legitimos. En el lado erroneo de Akismet, missed spam (spam omitido) es suficiente para autodescribirse, pero una false positive (falso positivo) es como se llama cuando nosotros incorrectamente identificamos un comentario legitimo como spam. (El cual con un poco de suerte sucede extremadamente rara vez) También, lo sentimos por el asunto vegetariano.

Lo que no se menciona es la función del Yummy Pie el cual es una gráfica de pastel:

Next Page »