Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - DarK_FirefoX

#1
Hola, soy un viejo dinosaurio registrado hace más de una decada, si bien no he interactuado mucho hace unos cuantos años ya, vengo entrando hace unos días y me surge la siguiente interrogante:

¿Está muriendo el foro?

No me malinterpreten, se que hay actividad, pero no veo mucha actividad relacionada con todo el propósito del mismo, la programación, temas de seguridad, etc. No se que habrá pasado a lo largo de los años, o si los que son más experimentados han optado por no participar y solo interactuan miembros más jóvenes sin tanta experiencia, miembros que están de paso buscando algo en específico.

Espero mi pregunta no ofenda a nadie, al contrario, pregunto desde el punto de vista constructivo y pensando que se puede hacer algo para volver a los años de gloria de este foro donde se encontraban respuestas a preguntas de todo tipo y contenido de calidad.

Gracias por su atención,

Salu2s a todos
#2
Hola. Estoy decidiendome por una nueva laptop. He encontrado una oferta en bestbuy:

Dell - Laptop Inspiron de 17.3 "- Intel Core i7-1065g7 - 16GB ram ddr4- ssd de 256GB - hdd de 1TB - Negro

A un precio de 730$ (220 de descuento) y me pasa que no he visto ninguna evaluación comparativa o comentarios sobre los nuevos procesadores Intel Core i7-1065g7 con Intel iris plus como gráficos integrados.

Asi que. Me encantaría su opinión sobre esta oferta? ¿Son este nuevo procesador y gráficos confiables? ¿Es una buena computadora para programar (visual studio, matlab, etc)?

Gracias por adelantado

PD: esta laptop no tiene pantalla FullHd, solo hd + .. Y realmente no me importa. Lo usaré para programar e investigación (no para juegos, ni transmisión, ni películas, ni renderización)
#3
Hola!, tengo una duda, estoy probando hacer cosas con las librerías que utiliza .NET (desde C#) para trabajar con las redes. La cuestión es que me encuentro un poco atascado, porque necesito hacer una especie de SCAN en la red, sea inalahámbrica o cableada, para obtener la dirección IP de los dispositivos conectados a ella y su dirección MAC. El problema surge porque estoy casi seguro de que no "quiero" hacerlo haciendo PINGs porque puede demorarse un poco (incluso si lo hago multithread), además creo que no todos los dispositivos responden al PING (¿o sí?),

¿existe otra forma de hacerlo?.

Intenté utilizando:

arp -a

Pero no obtengo todos los dispositivos, quizás porque no se encuentren aún en la tabla ARP (no se si estoy en lo correcto)

Por otro lado, para que tengan una idea, un software que prácticamente realiza esta tarea es "Wireless Network Watcher" de nirsoft

Espero alguien pueda ayudarme o darme alguna idea de como solucionar mi problema.

Salu2s
#4
Buenas!

Por razones ajenas a mi voluntad! (porque es por necesidad) Detalles en los que no voy a adentrarme ahora he tenido que verme en la "tediosa" (pero interesante tarea) de instalar un triple-boot en mi maquina de escritorio:

Windows XP SP3 (WHAAAAT)
Windows 10 Pro
Ubuntu 14.04 LTS





Ahora, la cuestión es la siguiente, una vez instalado Windows XP (mientras lo instalaba deje las particiones necesarias en el mismo HDD para luego instalar Windows 10 y posteriormente Ubuntu) procedí a instalar Windows 10. Hasta ahí todo perfecto. Cuando termino la instalación de Windows 10 hice pruebas y me da la opción de escoger que sistema operativo quiero iniciar mediante el "bootloader" de Windows 10, el cual para seleccionar Windows XP (Versión de windows anteriores) reinicia la PC y despues es que lo hace. Pero lo hace. Perfecto.

Ahora, me dispuse a instalar Ubuntu 14.04 en otra partición que había creado destinada a eso, pero una vez en el sistema de instalación de Ubuntu, me dice que no reconoce ningun sistema operativo (BAFFF), entonces voy a "Mas opciones" para crear la partición manualmente. Creo una partición en el espacio restante del disco e instalo Ubuntu ahi, no estaba seguro si el GRUB me iba reconocer las particiones de Windows, pero lo hizo.

Solo me muestra:

CitarUbuntu
.
.
Windows Recovery Environment

Ahora para iniciar Windows XP/10 debo ir a esta última, y carga el "bootloader" de Windows 10 y me da a escoger, lo cual si selecciono Windows XP, me reinicia, debo volver a seleccionar en el GRUB y entonces es que entra.

Doy gracias de que todo funciona, pero lo que quiero saber es, si puedo y, como hacer para que desde el GRUB me salgan las opciones de Windows XP y Windows 10 separadas y a la vez pueda escoger indistintamente sin reiniciar la PC a la hora de escoger Windows XP.

Espero me puedan dar una mano con esto, es la primera vez que hago "triple-boot" pero realmente lo necesito.

Gracias!
Salu2s

PS: Disculpen si el tema esta largo, pero no tenia otra forma de explicar a fondo la situación, gracias por tomarse la molestia de leerlo.

PS2: No se si está en el subforo adecuado, sino muévanlo, gracias.




Añado:

De alguna manera, después de:

sudo apt-get update
sudo apt-get dist-upgrade


El sistema hace un:

update-grub

automático, ahora en el GRUB al iniciar el sistema me aparece:

CitarUbuntu
..
..
Windows Recovery Environment
Windows 8

El Windows 8 da un problema con el bootloader, o sea, no carga y sale pantalla azul diciendo que hubo un problema, aunque no estoy seguro, puede ser a raiz de que conecte dos HDD que utilizo como esclavo, que quizás tengan alguna sobra de MBR de Windows 8 instalado que el GRUB lo reconoció.

Igual sigo con mi pregunta anterior, como modifico el GRUB para resolver mi problema inicial y como quito la entrada de Windows 8

Salu2s
#5
Hardware / ¿GTX 960 ó R9 380?
4 Enero 2016, 15:11 PM
Bueno, estoy pensando en comprar una tarjeta gráfica y estoy pensando entre alguna de estas dos, me gustaría saber cual de las dos me recomendarían:

GIGABYTE G1 Gaming GeForce GTX 960 DirectX 12 GV-N960G1 GAMING-4GD (rev. 1.1) 4G

ó

SAPPHIRE NITRO Radeon R9 380 DirectX 12 100384NT4GOC-2L 4GB 256-Bit GDDR5 PCI Express 3.0 x16 HDCP Ready Dual-X OC Version w/ backplate (UEFI) Video Card

Gracias de antemano,

Salu2s
#6
Trabajando en Matlab R2010a.

Tengo el siguiente problema. Tengo una interfaz gráfica con varios componentes. Entre ellos tengo un edit y un axes.

Lo que estoy tratando de hacer es controlar que lo único que se escriba en el edit sean números. Lo hago con una función y funciona bien. Una vez que el edit pierde el foco o se presiona ENTER si el dato entrado es un numero se realiza una función y sino se muestra un msgbox (modal).

Ahora, quiero aclarar que tengo una función llamada mousedraw, que se encarga de permitir al usuario dibujar con el mouse en el axes. Utilizando los eventos: buttondownfcn, windowbuttonmotionfcn y windowbuttonupfcn.

Aquí el código:

Código (matlab) [Seleccionar]
function mousedraw(handles)

A=handles.axesToDrawOn; % axesToDrawOn es el handle al axes



set(A,'buttondownfcn',{@start_pencil, handles})



function start_pencil(src,eventdata, handles)

cla(handles.axesToDrawOn);

coords=get(src,'currentpoint'); %scomo este es el callback del axes, src=gca

x=coords(1,1,1);

y=coords(1,2,1);



global lineCoords;

newPoint = [coords(1,1,1) coords(1,2,1)];

lineCoords = newPoint;



r=line(x, y, 'color', [0 .5 1], 'LineWidth', 2, 'hittest', 'off'); %Poniendo hittset off nos permite dibujar una linea que comience encima de una linea que ya este dibujada



set(gcf,'windowbuttonmotionfcn',{@continue_pencil,r})

set(gcf,'windowbuttonupfcn',@done_pencil)



function continue_pencil(src,eventdata,r)

%src es ahora el handle del figure, y no del axes, por lo tanto necesitamos usar gca.

coords=get(gca,'currentpoint'); %esto actualiza cada vez que mueva el mouse

x=coords(1,1,1);

y=coords(1,2,1);



global lineCoords;



newPoint = [coords(1,1,1) coords(1,2,1)];

D = [lineCoords; newPoint];

lineCoords = D;



%obtener las coordenadas de la linea existente y agregarle las nuevas

lastx=get(r,'xdata');

lasty=get(r,'ydata');

newx=[lastx x];

newy=[lasty y];

set(r,'xdata',newx,'ydata',newy);



function done_pencil(src,evendata)



%Desactiva la función e movimiento

global lineCoords

set(gcf,'windowbuttonmotionfcn','')

set(gcf,'windowbuttonupfcn','')


Mi problema es que si la manera en que el edit perdió el foco es haciendo un click sobre el axes, como que se queda colgado el evento buttondownfcn, pues se reconoce que lo entrado no es válido (osea, no es un número), se muestra el errordlg, pero al hacer click en aceptar, pues como que se ejecuto el evento y se comenzó a dibujar desde que se hizo click en el axes para hacer al edit perder el foco, y entonces esta dibujando con el mouse levantado, sin hacer click.

Espero que me haya explicado bien, sino que alguien me diga y explico mejor.

Gracias de antemano.

PD: El callback del edit es el siguiente:

Código (matlab) [Seleccionar]
function xMinEdit_Callback(hObject, eventdata, handles)

Val=get(hObject,'String');



if(isnan(IsNumber(Val)))

   set(hObject, 'String', handles.xMin);

else

   NewVal=str2num(Val);

   handles.xMin=NewVal;



   axis([handles.xMin,handles.xMax,handles.yMin,handles.yMax]);

end

guidata(hObject, handles);



function [varargout] = IsNumber( x )

num=str2num(x);



if (isempty(num)==0)

   varargout{1}=num;

else

   varargout{1} = NaN;

   errordlg('Debes insertar un numero', 'Error de entrada', 'modal');

end
end


Salu2s
#7
Hola, estoy de nuevo por acá con problemas de Hardware y solicitando su ayuda/orientación.

La cuestión es que tengo una Memoria Flash, casi nueva, la cual por un problema de desconexión sin extracción segura (en Windows en un puerto USB 3.0) dejo de funcionar.

La memoria es una ADATA C008 / 16GB. (La memoria es USB 2.0)

Pues la cuestión es que luego del mal manejo según lo que dije me decía que la memoria no tenia formato, que si quería formatearla. Intenté formatearla, resignado a que hubiera perdido el formato (pues los datos no eran imprescindibles), pero para mi sorpresa no me dejo formatearla, pues decia que "No se pudo finalizar el formato".

Intente formatearla desde el Explorador de Windows, Desde el Administrador de Discos y nada.

En el administrador de discos me salía que tenia formato RAW. Al cual no le puedo hacer chkdsk. La cuestión es que luego, al desconectarla y conectarla de nuevo apareció algo completamente diferente, pues la reconoce (en el Administrador de Discos) pero dice "No hay medios". Tiene una letra asignada, pero no sale en el Explorador de Windows. Al darle propiedades:

CitarNombre: XXXXXXXX U176CONTROLLER USB Device

En la pestaña "Volúmenes":

CitarDisco: Disco 1
Tipo: Extraible (G:)
Estado: No hay medios
Estilo de partición: No aplicable
Capacidad: 0MB
Espacio sin asignar: 0MB
Espacio reservado: 0MB

Utilizando DISKPART desde la consola:

Al hacer "list disk" me devuelve que tengo:

CitarDisco 5 - No Hay Medios - (Tamaño) 0B - (Disp) 0B

Hago:

"select disk 5"

Devuelve:

CitarEl disco 5 es ahora el disco seleccionado.

Al hacer "detail disk"

CitarXXXXXXXX U176CONTROLLER USB Device
Id. de disco: 00000000
Tipo: USB
Estado: No hay medios
Ruta: 0
Destino: 0
Id. de LUN: 0
Ruta de la ubicación: UNAVAILABLE
Estado de solo lectura actual: No
Solo lectura: No
Disco de arranque: No
Disco de archivo de paginación: No
Disco de archivo de hibernación: No
Disco de volcado: No
Disco de clúster: No

No hay volúmenes.

¿Necesito saber a que se debe esto?
¿Se puede reparar? ¿Como puedo repararlo?

Muchas gracias de antemano por sus respuestas.

Salu2s
#8
A ver, no se si a alguno de ustedes le ha pasado lo mismo, pero quería comentarles mi sugerencia a ver que opinan.

Muchas de las personas que se registran nuevos en el foro, vienen con dudas sobre cosas de programación y publican un trozo de código sin usar ninguna etiqueta, y en el mejor de los casos utilizan la etiqueta code, una cosa que se vuelve extremadamente tedioso de leer (y mucho menos entender), esto provoca reacciones como.

CitarUtiliza las etiquetas GeSHi
CitarDeberías leer las reglas, si vas a utilizar código utiliza las etiquetas GeSHi

En lo personal no me molesto en leer el código hasta que el usuario modifique el mensaje y las ponga entre las GeSHi o algún moderador lo haga.

Mi sugerencia es para ayudar a promover y a evitar el NO uso de estás maravillosas etiquetas:

¿Si existe la posibilidad de modificar la plantilla del foro para la página "post.html" del SMF de tal manera de que se haga un énfasis en el ComboBox de GeSHi de alguna forma o con un mensaje indicando que se debe utilizar estas etiquetas para publicar código en algún lenguaje de programación?

Espero sus opiniones.

Salu2s
#9
Vengo hoy con una duda para ver si me pueden guiar en la dirección correcta.

Estoy haciendo unas prueba y necesito usando .NET habilitar y deshabilitar un adaptador de red.

Hasta ahora, utilizando la clase NetworkInterface dentro de System.Net.NetworkInformation.

Hice esto para obtener los nombres de los adaptadores y su dirección MAC (registrados en Windows)

Código (csharp) [Seleccionar]
public static List<string> GetDevices()
{
 List<string> nDevicesList = new List<string>();

 foreach (NetworkInterface nic in NetworkInterface.GetAllNetworkInterfaces())
 {
   PhysicalAddress address = nic.GetPhysicalAddress();

   if((nic.NetworkInterfaceType != NetworkInterfaceType.Tunnel) && !string.IsNullOrEmpty(address.ToString()))
     nDevicesList.Add("Mac: {0} NetAdapter: {1}", address.ToString(), nic.Description);
 }

return nDevicesList;

}


Hasta ahí todo bien.

El problema ahora es que quiero poder seleccionar un adaptador y hacerle como un Reset, o sea, deshabilitarlo y luego habilitarlo.

Después de buscar información, me encontré con una manera de hacerlo utilizando la clase WMI -> Win32_NetworkAdapter, que además de estar deprecada, para los sistemas operativos Windows 2003, Windows XP, Windows 2000 y Windows NT 4.0 no tiene disponible los métodos Enable y Disable.

Lo cual no me será factible para esos SO.

Como alternativa a esta clase deprecada está la MSFT_NetAdapter pero tampoco, pues el menor cliente soportado es Windows 8.

También estuve leyendo sobre una forma de hacerlo utilizando netsh e hice esto:

Código (csharp) [Seleccionar]
static void Enable(string interfaceName)
       {
           ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface set interface \"" + interfaceName + "\" enable");
           Process p = new Process();
           p.StartInfo = psi;
           p.Start();
       }

       static void Disable(string interfaceName)
       {
           ProcessStartInfo psi = new ProcessStartInfo("netsh", "interface set interface \"" + interfaceName + "\" disable");
           Process p = new Process();
           p.StartInfo = psi;
           p.Start();
       }


Lo cual no se si lo habré programado bien, pero no me funcionó (ni en Windows 8.1 ni en Windows XP SP2)

Luego me encontré con una clase en CodeProject:

http://www.codeproject.com/Articles/21503/Hardware-Helper-Library-for-C

La cual lista todos los dispositivos en el administrador de dispositivos (solo funciona en Windows XP), utilizando hooks a nivel de sistema. Esta clase esta pensada pensada para recibir notificaciones de los eventos de añadir y quitar dispositivos, y tiene la funcionalidad de habilitarlos o desahibilitarlos.

Nota: Esta clase tiene un poco de unamanged code con el cual no estoy familiarizado (aún)

Imagino que puedo hacer un cross-reference con el método que hice para saber los adaptadores de red y solo capturar esos utilizando esta clase, pero todavía me queda el problema de que debo tener código para distintas versiones de Windows.

¿Que debería hacer?
¿Hacer código para distintas versiones de Windows?
¿Existe alguna vía de habilitar/deshabilitar los adaptadores de red de alguna manera que funcione en todos los SO? (me da a que no, pero quizás me puedan corroborar o refutar mi idea?

Agradezco cualquier sugerencia/idea/crítica.

Salu2s

Edito:
PD: También sé que está la utilidad devcon.exe, pero quiero evitar esto por ahora.
#10
Mi problema se resume en el título del tema. Tengo un HDD que me dio problemas y después de analizarlo me soltó que tenía sectores defectuosos.

Mi idea, después de intentos fallidos de repararlos en caso de que fueran errores magnéticos (utilizando el HDD Regenerator), fue crear una partición donde estuvieran recogidos los sectores malos, pero al ver el mapa de los sectores defectuosos me di cuenta que era casi imposible hacerlo manualmente, pues estaban dispersos por todo el disco.

Por lo tanto recurrí (después de investigar) a una aplicación que me crea las particiones automáticamente en los bloques saludables, lo que me arrojo una partición extendida con alrededor de 40 particiones lógicas, pero entre partición saludable y partición saludable, hay espacio no asignados (unallocated spaces).

Mi pregunta es:

¿Puedo unir estás particiones saludables en una (o en varias) de manera tal que pueda reducir el número de particiones?

El principal dilema (problema que yo veo) es que estás particiones saludables no están adyacentes, o sea:

[PARTICIÓN BUENA] [ESPACIO NO ASIGNADO] [PARTICIÓN BUENA] [ESPACIO NO ASIGNADO] .... [PARTICIÓN BUENA] [ESPACIO NO ASIGNADO]

Espero que me puedan ayudar, o al menos dar alguna idea de que puedo hacer (o de que no puedo hacer)

Salu2s

PD: Supongo que lo puse en el sub-foro adecuado, sino, que alguien lo mueva, pensé ponerlo en Hardware, pero no creo que sea de hardware, sino más bien de software, pense ponerlo en Windows, pero puedo trabajar en esto desde Linux. En fin.  :silbar:
#11
La cuestión es la siguiente, tengo un hotspot wifi donde se conectan bastantes dispositivos y para acceder a Internet tienen que poner nombre de usuario y contraseña. Lo que necesito saber cuales de estos dispositivos conectados tiene acceso Internet, o sea, cuales de ellos ya han introducido el usuario y contraseña y pueden navegar. Escaneando la red obtengo IP y dirección MAC, pero ¿Cómo puedo saber cual de estos ya tiene acceso a Internet?

Salu2s y Gracias de antemano
#12
Hace rato me viene rondando la cabeza esta duda.

Saben que cuando te registras en algún sitio o algún foro, generalmente te solicitan la activación vía email enviándote un correo con un vínculo que debes seguir para activar satisfactoriamente tu cuenta. La cuestión es que me he encontrado en situaciones en que te envían en ese correo tus datos de registro, o sea:

CitarEres "fulanitoDeTal" y tu contraseña es "contraseñablahblah", debes seguir este .....

Mi pregunta es la siguiente:

¿Esto no hace que tu contraseña esté expuesta? ¿Acaso no se supone que cifren tu contraseña en la base de datos? ¿Por que te la envían por correo antes de cifrarla?

Salu2s

PD: No estoy seguro del todo si este tema está en el sub-foro adecuado.
#13
Estaba hoy por la noche pensando en el tiempo que llevo siendo usuario del foro y me puse a pensar ¿Cuál fue mi primer mensaje/tema en el foro? No me acordaba  ;D Es que también mi primer mensaje data de hace 9 años. Entonces

¿Cuál fue su primer mensaje/tema en el foro?

Bueno, mi primer mensaje fue:

CitarSugerencias y dudas sobre el Foro / PODIAN PONER UN FORO DE PROGRAMACION EN DELPHI en: 2 Noviembre 2006, 15:01

Hola, Mi nombre es Armando,
espero que el compañero Brujo lea este mensaje,

BIEN ME GUSTARIA que hicieran un foro de Delphi, ya que para buscar info sobre delphi hay que rebuscar cantidad

PD: El foro es uno de los mejores que he visitado en mi vida

;D  ;D Sobre todo la PD está muy linda.

Añado: Jaja, y lo que más me molesta de mi tema es que incumplo normas del foro: Las mayúsculas! xD Y además escribo mal el nombre de elbrujo. xD

Salu2s
#14
Hola, tengo este problemita que quizás sea sencillo pero me gustaría que me ayudaran.

Tengo un router TP-LINK
Tengo una laptop
Tengo un smartphone

Utlizando la tarjeta WiFi de mi laptop me conecto a una red a la cual tengo acceso a internet.

Mi objetivo utilizar la WiFi de mi smartphone para conectarme a internet en el.

Mi idea es compartir la conexion wifi de mi laptop a través del router y utilizar el smartphone para conectarme al router y tener internet en el smartphone.

El problema es que no se como lograr esto.

Espero me puedan ayudar con esto.

PD: He compartido a la conexión a través de un cable directamente a la pc de escritorio y funciona perfecto utilizando ICS de Windows y obteniendo dirección de IP en la pc de escritorio a través de DHCP. Tengo en la laptop Windows XP

Salu2s y gracias de antemano
#15
Foro Libre / ¿Que opinan de los sueños?
27 Mayo 2015, 15:05 PM
Pues simplemente, quería saber que opinan otras personas de los sueños. Realmente no he encontrado información de los sueños que me convenza.

CitarLos sueños son manifestaciones mentales de imágenes, sonidos, pensamientos y sensaciones en un individuo durmiente, y normalmente relacionadas con la realidad.

CitarSoñar es un proceso mental involuntario en el que se produce una reelaboración de la información almacenada en la memoria, generalmente relacionada con experiencias vividas por el soñante el día anterior.

Entiendo más o menos el concepto, pero ¿Tendrán significado los sueños? ¿Representarán miedos o aspiraciones? ¿Deseos?

La verdad muchas de las personas que conozco y he podido preguntarle, me dicen que normalmente no sueñan (que debe ser que no recuerdan), pero en lo personal sueño casi todos los días (y recuerdo vívidamente). Y lo más interesante es que sueño con cosas raras e inverosímiles.

Vengo teniendo un sueño recurrente hace varios meses ya, donde estoy fuera de casa y cuando llego a mi edificio y tomo el ascensor, siempre me deja en un piso que no es, cuando tomo las escaleras y supuestamente debo llegar a mi apartamento, resulta que me he pasado dos pisos. Intentando abrir la puerta de mi apartamento (donde no hay nadie) siento ruidos en el interior, veo las ventanas abriéndose solas, las luces encenderse. Todo esto se repite constantemente. Lo raro es que no hay nadie adentro. A veces cuando trato de abrir la puerta se abre y puedo entrar para no ver a nadie, otras siento una fuerza tratando de halar la puerta en dirección contraria a mi, una fuerza que no es hecha por nadie.

En resumen, me gustaría saber ¿Que opinan de los sueños? ¿Que creen que pueden representar los sueños?

Salu2s

Nota: Citas de Wikipedia
#16
Esto es algo que me venía rondando la cabeza hace rato. Quería saber, pues estuve buscando, si existe y conocen de algun add-on de LaTeX para foros SMF. Sería un add-on bastante interesante al foro, aunque el foro no está tan orientado a las matemáticas, muchas veces es necesarío introducir fórmulas y hay que subir imágenes. Entonces si tienes que explicar un proceso tiens que subir muchas imágenes lo cual se hace tedioso.

No se si esto será útiles para muchos, pero es algo que queria decir a ver que opinan los demás.

Salu2s
#17
Librería de Códigos - C#

Me he decido a crear este tema con el objetivo de ayudar a las personas a las cuales les pueda ser útil estos códigos. Mi idea es ir posteando códigos que de una manera u otra son útiles para personas que estén aprendiendo a programar en C# y tengan alguna duda. No hay otra manera de explicarlo así que voy a comenzar:

1 - Hallar el máximo número entero de un array de enteros

Aquí introducimos como parámetro al método un array de enteros llamando "numeros", aquí estará la colección de numeros en la cual queremos buscar el máximo (Dígase máximo al número más grande). Para que entiendan:

int.MinValue es una constante dentro de la clase Int32 que representa el menor valor posible representable por un entero. Este valor es: -2,147,483,648. Por lo tanto, cualquier entero representable con el tipo de dato int, será mayor o igual que la constante MinValue.
Lo que hacemos es recorrer el array de int números y vamos indexando y comprobando cada posición del array con la variable maximo (int.MinValue en un principio), en caso de que el número sea mayor le asignamos a esa variable el valor en la posición i del array (o sea, la que se está comprobando) y seguimos recorriendo el array hasta que se hayan comprobado todos los elementos del array. Luego, la variable maximo tendrá almacenado el valor máximo del array. Lo que hacemos es devolverlo.

Código (csharp) [Seleccionar]
public static int Maximo(int[] numeros)
       {
           int maximo = int.MinValue;
           for (int i = 0; i < numeros.Length; i++)
           {
               if (numeros[i] > maximo)
                   maximo = numeros[i];
           }
           return maximo;
       }





2 - Hallar el segundo mayor elemento en un array de enteros

La idea es parecida a como hallar el mayor elemento, de hecho, lo que se va a hacer es recorer el array e ir buscando el mayor elemento, pero cuando se encuentre uno mayor del que ya se encontró, ese que ya se había encontrado se va a guardar en otra variable. Entonces vamos a tener dos variables, una "mayor" y otra "sMayor" (segundo mayor). La idea es el que se encuentre se pone en la variable mayor y lo que estaba en la variable mayor se pone en la variable sMayor. De esta manera vamos llevando control de las dos variables. Hay que tener en cuenta que la comparación se realiza primero si el elemento indexado es mayor que "mayor", sino, hay que comprobar si es mayor que "sMayor" pues puede darse el caso que existan elementos entre las dos una vez después que se haya asignado los valores una vez y este elemento vendría a ser el segundo mayor.
Una vez recorrido todo el array solo resta devolver la variable "sMayor"

Código (csharp) [Seleccionar]
public static int SegundoMayor(int[] numeros)
       {
           int mayor = int.MinValue;
           int sMayor = int.MinValue;
           for (int i = 0; i < numeros.Length; i++)
           {
               if (numeros[i] > mayor)
               {
                   sMayor = mayor;
                   mayor = numeros[i];
               }
               else if (numeros[i] > sMayor)
                   sMayor = numeros[i];
           }
           return sMayor;
       }





3 - Invertir los elementos de un array

Invertir los elementos viene siendo como hacer un Reverse (Invertir el orden de los elementos del array). Voy a exponer como hacerlo de dos maneras, que es prácticamente lo mismo con la diferencia que en un método modificamos el mismo array y en el otro devolvemos un array nuevo.

Modificando el mismo array

Aquí, recibimos como parámetro de entrada un array (en este caso es un array de int, esto puede servir para otros tipos de datos, o incluso se podría haber hecho genérico, lo expongo con int para simplificar). Básicamente vamos a recorrer el array hasta la mitad, utilizando la facilidad de indexar un array podemos cambiar los valores. Pues el primer elemento del array sería 0 y el último a.Length -1. Lo que utilizando la variable i del ciclo, podemos ir aumentando y disminuyendo a la vez de una forma desde afuera hacia adentro y haciendo lo que se conoce como Swap (intercambio) en esos elementos. Si nos damos cuenta el último elemento siempre nos vamos a referir como a[a.Length-1-i], puesto que i va aumentando ese valor va a ir reduciéndose. Por lo tanto el objetivo es: Cambiar el primero con el último, el segundo con el penúltimo, y así sucesivamente. Este método es void, puesto que no devolvemos nada, solamente trabajamos sobre el mismo array.

Nota: Para hacer el Swap lo que hacemos es crear una variable temporal donde asignamos uno de los valores, luego en esta variable que ya guardamos, ponemos el otro elemento a intercambiar, por último, el elemento que guardamos en la variable temporal se lo asignamos a la variable de donde sacamos el valor a intercambiar.

Código (csharp) [Seleccionar]
public static void InvierteV(int[] a)
       {
           for (int i = 0; i < a.Length / 2; i++)
           {
               int temp = a[i]; //Asignamos valor a la variable temporal
               a[i] = a[a.Length - 1 - i]; //Copiamos el valor de la parte trasera del array a la frontal
               a[a.Length - 1 - i] = temp; //Copiamos el valor guardado en la variable temporal a la parte trasera del array
           }
       }


Devolviendo un nuevo array

Código (csharp) [Seleccionar]
public static int[] InvierteN(int[] a)
       {
           int[] newInt = new int[a.Length];

           //Copiamos los elementos del array al nuevo array
           for (int i = 0; i < a.Length; i++)
               newInt[i] = a[i];

           for (int i = 0; i < newInt.Length/2; i++)
           {
               int temp = newInt[i]; //Asignamos valor a la variable temporal
               newInt[i] = newInt[newInt.Length - 1-i]; //Copiamos el valor de la parte trasera del array a la frontal
               newInt[newInt.Length - 1-i] = temp; //Copiamos el valor guardado en la variable temporal a la parte trasera del array
           }
           return newInt;
       }


Esta forma funciona casi idéntico, solo que hacemos primero una copia del array en un array nuevo con la misma longitud y los mismos valores, para luego trabajar sobre este array y después devolverlo tras realizarle el proceso de invertir los elementos explicados en la forma anterior.

Nota: El proceso de crear la copia del array lo hago inicializando un array de la misma longitud que el que entra como parámetro y recorriendo este array y copiando los valores a este nuevo array. Quería destacar que para hacer la copia del array podíamos usar el método Array.Copy(), pasándole el array desde donde se quiere copiar, el array a donde se va a copiar y la cantidad de elementos a copiar, en este caso todos. Hubiera sido algo así:

Código (csharp) [Seleccionar]
Array.Copy(a, newInt, a.Length);

De esta forma nos hubiéramos ahorrado el primer ciclo del método (aunque en términos de eficiencia es prácticamente lo mismo)




4 - EsPrimo

Básicamente esto es algo bastante utilizado, aunque esta manera de implementarlo es "sencilla" a simple vista, puede ser un proceso extremadamente largo para números muy grandes.

Código (csharp) [Seleccionar]
public static bool EsPrimo(int a)
       {
          int raizDelNumero = (int)Math.Sqrt(a);
           for (int i = 2; i <= raizDelNumero; i++)
               if (a % i == 0)
                   return false;
           return true;
       }


Lo que hacemos es calcular la raiz del numero y guardarla en una variable. Utilizamos el metodo .Sqrt dentro de la clase Math. El cuál calcula la raíz cuadrada de un número. Este método devuelve un double, por eso le hacemos un cast a int (cast es una conversión forzada a un tipo de datos). El objetivo del método es recorrer todos los números desde 2 hasta la raíz del número y ver si alguno de esos números divide al número (o sea, deja resto 0 con el número). En caso de que alguno de esos números divida al número, implica que el número no es primo. Si el ciclo termina sin devolver false, entonces devolvemos true pues el numero es primo.





Bueno, aquí les dejo los cuatro primeros, luego sigo añadiendo más de acuerdo al tiempo que tenga libre. Si alguien quiere aportar sean libres de hacerlo. Esto son cosas sencillas, pero que para personas que están aprendiendo pueden ser muy útiles. Recuerden, si añaden, comentar los códigos y/o explicarlos.

Salu2s

#18
Estaba haciendo unas pruebas con javascript y me surgió el siguiente problema/duda.

Tengo un archivo llamado "simple.js" con el siguiente código:

Código (javascript) [Seleccionar]
document.getElementById("applecode").innerText="cherries";

Y tengo un documento "index.html" con el siguiente código:

Código (html4strict) [Seleccionar]

<!DOCTYPE HTML>
<html>

<head>
<title>Example</title>
</head>

<body>

<p>
I like <code id="applecode">apples</code> and oranges.
</p>

<!-- Aqui cargo el script externo de simple.js -->
<script src="simple.js"></script>
</body>
</html>


Estoy claro que al hacer esta llamada al script se ejecutará una vez que carge los elementos HTML anteriores a el (por estar detrás de los elemenos). También probe utilizando el attributo defer y colocando la llamada al script dentro de las etiquetas HEAD

El problema es que en Mozila Firefox no me cambia el valor de la propiedad innerText para el elemento con el ID seleccionada. Lo raro, para mí, es que en Google Chrome si lo cambia.

¿A que se debe esto? ¿Estoy haciendo algo mal?
#19
El problema es el siguiente:

Bootstrap v.3.0.3 trae consigo un plug-in llamado bootstrap-tooltip, que lo que hace es mostrar un pequeño globo para mostrar alguna información al pararse encima de algun componente, estoy tratando de mostrarlo encima de un botón.

Verán, tengo el siguiente código:

Código (html4strict) [Seleccionar]
<form action='action.php' method='post'>
<div>
<button class='btn btn-danger btn-sm' type='submit' name='message_delete_submit' data-toggle='tooltip' data-placement='right' title='¿Eliminar? No se puede deshacer'>
<span class='glyphicon glyphicon-trash'></span>
</button>
</div>


Pero, el tooltip no se muestra con los efectos del plug-in.

Ahora, según la documentación de Bootstrap v.3.0.3 sobre el plug-in:

Citar
Opt-in functionality

For performance reasons, the Tooltip and Popover data-apis are opt-in, meaning you must initialize them yourself.

CitarFuncionalidad opcional

Por razones de rendimiento, Las data-apis de Tooltip and Popover son opcionales, lo cuál significa que usted debe inicializarlas

Ahora, mi pregunta ¿Como la inicializo?

Entonces, me encontré con una cosa en el código fuente de la documentación, en donde ponen la demostración de los ToolTips, incluyen los componentes dentro de:

Código (html4strict) [Seleccionar]
<div class="tooltip-demo">
</div>


Entonces buscando, vi que ellos utilizan un archivo application.js, que según los comentarios que tiene, dice que no se debe utilizar este archivo, es solo para la documentación de ellos. Pero ahi encontré esto(entre otras cosas):

Código (javascript) [Seleccionar]
// tooltip demo
   $('.tooltip-demo').tooltip({
     selector: "[data-toggle=tooltip]",
     container: "body"
   })

$('.tooltip-test').tooltip()


En resumen. Esto significa que lo están inicializando? Hay que inicializarlo desde un archivo .js o script? Como lo puedo hacer?

Aclaro, que incluyendo ese archivo (application.js) en mi página y utilizando la clase "tooltip-demo", si funciona. Pero quiero saber como inicializarlo.

Espero puedan ayudarme, traté de explicarme lo mejor posible, pero si tienen alguna duda sobre lo que pregunto me lo dicen.

Gracias de antemano.

Modifico:

Después de mucho rato probando cosas y buscando, di con la solución. Resulta que tengo que, como bien dice la documentación de Bootstrap, inicializarlo. Creo que ellos no lo activan por defecto para evitar el manejo de eventos del mouse en todos los elementos.

Pues la manera de inicializarlo que utilicé fue la siguiente.

Código (html4strict) [Seleccionar]
<script type="text/javascript">
   $(function () {
       $('body').tooltip({
           selector: 'a[rel="tooltip"], [data-toggle="tooltip"]'
       });
   });
</script>


Donde utilizo como selector para que funcione el atributo [rel = tooltip] para las etiquetas a y el [data-toggle = tooltip] para otros componentes.

Salu2s
#20
Algo que quería señalar porque andaba dando vueltas por las configuraciones de mi perfil. Y entonces quise marcar este CheckBox que dice "No mostrar las firmas de otros usuarios" en el apartado "Configuración de Apariencia y Diseño", y en fin que guardé las configuraciones y sigue mostrándome las firmas.
¿Por qué sucede esto? Estuve pensando que sería cuestión de privilegios, pero de ser así, no debería de darme esa opción.

Me explican?

PD:  Estoy usando el tema por defecto
#21
PHP / [DUDA] Manejar timestamp
3 Abril 2015, 17:41 PM
Tengo una duda que no logro ver como resolver.

Explico, tengo una tabla en una base de datos MySQL donde tengo un campo de tipo timestamp, cuyo valor para DEFAULT es CURRENT_TIMESTAMP. Todo bien hasta ahora, ahi se almacena un valor así: 2015-03-31 14:21:00.

El problema es que quiero usar eso por decirlo de alguna manera para mostrarlo como una fecha, digámos que quiero de ahi saber(separar) el día, mes, año y la hora para luego mostrarla como una fecha así: Martes 31 de Marzo de 2015 a las 14:21:00.

Digámos que tengo:

Código (php) [Seleccionar]

$row = $result->fetch_assoc();
$message_date = $row['message_date']; //Aquí tengo el valor 'timestamp'


Pero, esto no me devuelve un valor numérico correcto, creo que me lo devuelve en forma de string (según var_dump())

Por lo tanto al utilizar la función:

Código (php) [Seleccionar]
echo date("Y", $message_date);

CitarNotice: A non well formed numeric value encountered in F:\System\Archivos de programa\XAMPP\htdocs\questions\functions\users.php on line 216

1970

Donde 1970 es el valor que muestra. Por lo que puedo decir que me falta hacerle algo a la variable $message_date. Intente utilizando

Código (php) [Seleccionar]
echo date("Y", (int)$message_date);

Me quita la Notificación, pero sigue dando 1970

Voy a crear una función que tendrá unos arrays con los meses y días, pero necesito saber como manipular correctamente este "timestamp" de MySQL en PHP.

Alguien me puede ayudar. Saludos

PD: Tengo PHP/5.4.7

Modifico: Estaba pensando y me surgió la siguiente pregunta: ¿Sería mejor cambiar el tipo de dato del campo en la tabla a DateTime?
#22
Hola! Vengo hoy con una pregunta, pues vengo rompiendome la cabeza hace rato e incluso he probado diferentes cosas. Espero puedan ayudarme

Verán. Tengo un laptop con Windows XP SP2, en la cual tengo una tarjeta de red inalámbrica Broadcom BCM4311 802.11g Wireless Network Adapter. Lo que pasa es que quiero cambiarle la Dirección MAC.

He probado con MacMakeup, Win 7 MAC Address Changer, netcut, e incluso desde la configuración del dispositivo de red (Dirección MAC administrada localmente) y no se cambia. Será que a mi dispositivo no le puedo cambiar la dirección MAC?

Si alguien me puede ayudar, estaría agradecido!
#23
PHP / [Resuelto] [DUDA] Yield en php
30 Marzo 2015, 22:30 PM
Hola, tengo una pregunta sobre el uso de yield en PHP/5.4.7

Tengo el siguiente código:

Código (php) [Seleccionar]


function get_users_messages_iterator($user_data)
{
global $connection;

$query = "SELECT * FROM messages";
$result = $connection->query($query);

$row = array();

while($row = $result->fetch_assoc())
{
yield $row; //esto se puede hacer?
}
}



entonces tengo esta otra función desde la cual llamo a la función anterior:

Código (php) [Seleccionar]
function get_users_messages($user_data)
{
$messages = get_users_messages_iterator($user_data);
foreach ($messages as $key => $value) {
echo $value;
}
}


Pero esto me dá el siguiente error:

CitarParse error: syntax error, unexpected '$row' (T_VARIABLE) in F:\System\Archivos de programa\XAMPP\htdocs\questions\functions\users.php on line 192

No se si lo que estoy haciendo está bien, vale destacar que es la primera vez que utilizo el yield en PHP, se como funciona, pero quizás no me estoy dando cuenta de algo. No se porque me da ese error el parser, espero me puedan ayudar.

Gracias

Añado: Incluso este ejemplo básico que veo en la documentación de php no funciona, me dá el mismo error  :-\

Código (php) [Seleccionar]
<?php
function gen_one_to_three() {
    for (
$i 1$i <= 3$i++) {
        
// Observe que $i es preservado entre yields
        
yield $i;
    }
}

$generator gen_one_to_three();
foreach (
$generator as $value) {
    echo 
"$value\n";
}
?>
#24
PHP / [Resuelto] [DUDA] Strict Standards
16 Marzo 2015, 23:30 PM
Exacto, tengo una duda, pues tengo un script que quiero lograr entender pero me da el siguiente error al cargar la página. Y no se que se está haciendo mal aquí:

Este es el error:

CitarStrict Standards: Non-static method SESmarty::getInstance() should not be called statically in F:\System\Archivos de programa\XAMPP\htdocs\script\header.php on line 35

en esa linea de ese archivo esta el siguiente código:

Código (php) [Seleccionar]
// INITIATE SMARTY
include "include/class_smarty.php";
$smarty =& SESmarty::getInstance();


ahora ese método se llama desde el archivo "class_smarty.php" en el cual tiene este código:

Código (php) [Seleccionar]
class SESmarty extends Smarty
{
//...
//...
//Más código
//..
//..

//Entonces está es la funcion que se está llamando desde el otro archivo

function &getInstance()
{
   static $instance;
   
   if( is_null($instance) )
   {
     $instance = new SESmarty();
   }
   
   return $instance;
}



Espero me puedan ayudar a ver que es lo que pasa porque no tengo ni idea.

Gracias de antemano!

PD: Esto me pasa con muchas llamadas de funciones que tienen más o menos el mismo estilo de llamarlas. ¿Tendré que configurar algo en apache o php?
PD: Tengo instalado XAMPP!!
#25
Tengo la siguiente duda. Tengo instalado el Visual Studio 2013 Ultimate, y le instalé todo lo que viene con el. Llevo bastante tiempo programando en C#, pero hace poco me adentré en ASP.NET y ahora estoy estudiando algunas cosas donde necesito usar SQL Server. Aqui va mi pregunta.

¿Necesito instalar algo adicional o con Visual Studio 2013 Ultimate ya viene una version compacta de SQL Server?, pues el trae una versión para IIS (que se levanta sola una vez que compilo) pero no se como levantar la de SQL Server si la tiene. Estuve leyendo en la ayuda, pero hablan de SQL Server Management Studio, pero igual no se levantarlo.
Espero puedan ayudarme. Gracias de antemano

PD: Si no entienden lo que necesito, me dicen y reformulo la pregunta

Modifico: Lo que tengo instalado es Visual Studio 2013 Ultimate, es que me equivoque con el numero
#26
Tutorial: Uso del componente PictureBox para efectos gráficos en una aplicación de Windows en C#

0. Introducción

El presente tutorial tiene como objetivo presentar a través de la creación de una sencilla aplicación de C# los conceptos básicos sobre el uso de efectos gráficos bidimensionales en aplicaciones de Windows. Quizás esto no sea de mucha utilidad para muchos, pero cuando comenzaba a aprender Windows Forms, esto me fue muy útil.

A continuación presento un resumen las técnicas y habilidades que se abordan en este tutorial:


  • Organización de componentes visuales en un Windows Form usando las líneas de guía.

  • Utilización de la propiedad Image del componente PictureBox para mostrar imágenes de archivo.

  • Utilización del evento Paint del componente PictureBox para dibujar libremente en su superficie.

  • Uso de los tipos Graphics, Brush, Pen, Color, y el método FillRectangle() de la clase Graphics para generar efectos gráficos.

  • Utilización del tipo Enum para definir enumeraciones.

A continuación presento una serie de habilidades que se presuponen dominadas por ti y que son requeridas para entender completamente el contenido de este tutorial:


  • Declaración y uso de tipos básicos y arrays.

  • Implementación de métodos.

  • Uso de propiedades y eventos.

  • Creación de controles visuales en un Windows Form.

  • Uso de ciclos,  condicionales y en general de técnicas básicas de programación.

1. Diseño del formulario

La aplicación que queremos diseñar mostrará un único formulario con una rejilla y una serie de controles que permitirán cambiar la apariencia de dicha rejilla. Al hacer clic sobre la rejilla esta dibujará una de dos imágenes dependiendo del botón presionado.

Una vista preliminar de nuestro formulario en pleno funcionamiento sería la siguiente:



Comencemos entonces a ubicar los controles que necesitaremos sobre el formulario.

Para seguir un estilo facil de entender, usaremos para cada control un prefijo de tres o cuatro letras según el tipo del control seguido por un nombre que nos indique la función de cada instancia en nuestro formulario. Además, es una buena práctica usar identificadores en inglés por ser el idioma más generalizado entre los programadores del planeta.

Entonces, para nuestro formulario, usaremos el nombre frmDrawing, el prefijo indica que es una instancia de un control Windows Form, y el nombre indica que es un formulario cuya función fundamental está de alguna forma relacionada con el dibujado.

Generalmente los videojuegos dibujan sobre toda la pantalla, esto llama "Full Screen Mode", algo así como modo a pantalla completa. Sin embargo, la mayoría de los videojuegos permiten también ser visualizados en una ventana de Windows. Esta ventana, como regla general tiene un tamaño cuya relación de aspecto es 4:3, y con mucha frecuencia es uno de los valores de resolución de escritorio que se pueden seleccionar en monitores que no son de pantalla ancha: 640x480, 800x600, 1024x768 píxeles, etc. Para seguir con esta línea asignaremos a la propiedad Size de nuestro formulario el valor 640;480.

Cambiemos ahora el titulo de nuestro formulario. Hacemos esto cambiando su propiedad Text que es de tipo string a PictureBox Tutorial. La mayoría de los controles visuales tienen una propiedad Text que de alguna forma está relacionada con el texto que estos controles muestran.

También queremos que el usuario no pueda cambiar el tamaño de nuestro formulario ni maximizarlo. Esto se logra poniendo la propiedad FormBorderStyle a FixedSingle y la propiedad MaximizeBox a False. Finalmente, para evitar efectos visuales no deseados cada vez que repintemos el formulario, pongamos su propiedad DoubleBuffered a True.

Ahora vamos a ubicar en el formulario un control PictureBox. Se puede encontrar fácilmente en Cuadro de herramientas (ToolBox). Renombrémoslo a pboxGrid indicando que de cierta forma representará una rejilla.

El PictureBox es un control que permite mostrar una imagen en su interior. Pero lo más interesante es que a través de un evento, podemos dibujar libremente en su interior usando la propiedad Graphics y personalizar de esta forma el contenido que queremos mostrar.

Como queremos pintar una especie de rejilla, vamos a hacer que nuestro PictureBox sea cuadrado, por lo tanto en su propiedad Size pondremos 400;400. Ahora ubiquémoslo acercando su extremo derecho e inferior a la esquina correspondiente del formulario hasta que aparezcan las líneas de guía. De esta forma se pueden ubicar controles visuales en un formulario guardando uniformidad en el espaciado entre estos.



Vamos a poner ahora su propiedad BorderStyle a FixedSingle para que los bordes sean visibles aun cuando no haya nada dibujado en su interior.

Ahora vamos a ubicar los controles restantes. Comenzamos por dos controles GroupBox que colocaremos a la derecha. Los llamaremos gboxGrid y gboxImage y sus textos serán Rejilla e Imágenes respectivamente.

Coloquemos el primero alineado con la parte superior del PictureBox y de un ancho tal que cubra el espacio delimitado por el PictureBox y el borde del formulario. Démosle un largo (propiedad Width) de 137. Coloquemos el segundo alineado entre la parte inferior del primero, la parte izquierda del PictureBox, y los bordes del formulario.

La imagen siguiente muestra este procedimiento:



Los GroupBox no son más que contenedores, es decir, controles que pueden contener otros controles en su interior y que se usan generalmente para organizar el formulario. Lo importante de los contenedores es que algunas de sus propiedades visuales influyen sobre sus "hijos". Por ejemplo, la propiedad Location de cualquier control se refiere a la posición con respecto al borde superior izquierdo del contenedor más inmediato que lo contiene. En este sentido el formulario es el contenedor de más externo. De ahora en adelante, cuando vayamos a colocar controles en cualquier parte del formulario, asumiré que ya sabes como ubicarlos de forma que estén correctamente alineados, siguiendo los procedimientos mencionados hasta ahora.

Una propiedad que nos puede ser de utilidad una vez que hayamos ubicado correctamente nuestros controles es Locked que impedirá que movamos accidentalmente un control si su valor es True. Cuando el formulario está lleno de controles es bastante sencillo equivocarse al seleccionar un control y se puede volver caótico si no están bloqueados en su sitio. Bloqueemos entonces al PictureBox y a los dos GroupBox. De ahora en adelante cada vez que terminemos de ubicar un control en su sitio, asumiré que lo bloquearás (poniendo su propiedad Locked a True) para evitar futuros errores.

Como ya conocemos los procedimientos para ubicar controles, para ubicar los controles restantes simplemente escribiré el tipo, el nombre, y las propiedades que haya que asignar de la siguiente forma.

En el formulario, encima del PictureBox, agreguemos un Label (Name = lblTitle; Text = Haga clic en la rejilla para pintar en las cuadriculas con las imágenes seleccionadas.).

En el GroupBox de arriba, agreguemos los siguientes controles en el orden que se indica y correctamente alineados:

Label (Name = lblCount; Text = Cuadros por línea:)

NumericUpDown (Name = nudCount; Minimun = 2; Maximun = 20; Value = 10)

Label (Name = lblColorLine; Text = Color de línea:)

Panel (Name = pnlColorLine; Size = 30;20)

Label (Name = lblColorBack; Text = Color de fondo:)

Panel (Name = pnlColorBack; Size = 30;20)

Button (Name = btnRestart; Text = Reiniciar rejilla).

Los controles Panel también son contenedores. De hecho son los contenedores más sencillos. Pero en esta ocasión los vamos a usar exclusivamente para mostrar un color en su interior. Esto lo haremos cambiando sus propiedades BackColor a Black y White respectivamente. También sus propiedades BorderStyle a FixedSingle.

Al finalizar, su formulario debe verse así



En el GroupBox inferior vamos a agregar dos GroupBox más con las siguientes propiedades:

GroupBox (Name = gboxLeft; Text = Clic izquierdo)

GroupBox (Name = gboxRight; Text = Clic derecho)

Dentro de cada uno de estos nuevos GroupBox vamos a agregar un control PictureBox con las siguientes propiedades respectivamente:

PictureBox (Name = pboxLeft; BorderStyle = FixedSingle)

PictureBox (Name = pboxRight; BorderStyle = FixedSingle)

Recuerde bloquear todos sus controles (¿Lo habías olvidado?). Su formulario debería verse ahora así:



La propiedad Image de un PictureBox nos permite establecer una imagen de archivo como contenido del control. Lo que queremos hacer ahora es permitir al usuario elegir dicha imagen. Para esto vamos a agregar un control no visual llamado OpenFileDialog. El hecho de que sea un componente no visual hará que aparezca un icono en la parte inferior de la ventana de diseño en vez de un control sobre el formulario. Cambiemos su nombre a odlgImage.

Este componente nos permite mostrar un cuadro de diálogo similar al que aparece cuando queremos abrir un archivo desde cualquier aplicación (como Bloc de Notas) y obtener la dirección del o los archivos seleccionados por el usuario. La propiedad Filter de tipo string nos permitirá elegir que tipos de archivos permitiremos que sean seleccionables. Cambiemos su valor a: Archivos de imagen (*.jpg, *.png, *.bmp, *.gif)|*.JPG; *.PNG; *.BMP; *.GIF|Todos los archivos (*.*)|*.*. Este es un formato usado por el OpenFileDialog para especificar las extensiones válidas. Primero escribimos el texto que será visible para el usuario y separado por una barra vertical (|) las extensiones para dicha selección, separadas por punto y coma ( ; ) si es más de una, y así para cada opción que queramos brindar.

Cambiemos la propiedad Title a Seleccione un archivo de imagen. Este es el texto que será el título del cuadro de diálogo cuando se ejecute.

Agreguemos para finalizar otro cuadro de diálogo, esta vez uno que nos permitirá seleccionar un color, para usarlos más adelante. Sus propiedades:

ColorDialog (Name = cdlgColor).

2. Diseño e implementación de la lógica de la aplicación

Bien, al fin hemos llegado a la parte que más nos gusta: el código.  Después de pasar tanto tiempo diseñando la interfaz grafica de nuestra aplicación, ahora queremos que haga algo ¿no? Empecemos por listar las variables de instancia que vamos a necesitar y hacer un bosquejo de los métodos y algoritmos que tendremos que implementar.

El objetivo de nuestra aplicación es que el usuario pueda personalizar las propiedades de la rejilla que simularemos, y elegir dos imágenes de tal forma que al hacer clic izquierdo sobre una casilla vacía aparezca allí una imagen, y con clic derecho otra. Si la casilla está llena queremos intercambiar la imagen que está puesta si es diferente a la queremos poner o quitarla si es igual. Aunque no parezca algo muy útil, sirve para explicar el trabajo con estos tipos de componentes y el dibujado sobre componentes en Windows Forms, además con un poquito de imaginación se pueden hacer cosas más interesantes.

Vamos a necesitar por el momento dos variables de instancia: una para almacenar la cantidad de casillas que queremos y otra para almacenar los valores de cada casilla. La primera evidentemente será un entero, y la segunda un array. ¿De qué tipo? Podemos hacerlo de enteros, y asumir 0 para casillas blancas, 1 para casillas en las que se hizo clic izquierdo y 2 para clic derecho. Ciertamente funciona, sin embargo, para alguien que no sepa que significan estos valores, el código puede resultar algo confuso, y entonces tendríamos que poner comentarios explicando todo esto, etc. ¿Qué se puede hacer para evitar esto? Usaremos una cosa muy sencilla pero muy útil llamado Enum.

Código (csharp) [Seleccionar]
enum GridData { Blank, Left, Right }

De esta manera, una variable de tipo GridData nos permitirá conocer y asignar sin temor a ambiguedades dichos valores. Entonces nuestro array deberá ser de este tipo. Agreguemos entonces las siguientes líneas justo debajo del constructor de nuestro formulario:

Código (csharp) [Seleccionar]
enum GridData { Blank, Left, Right } //Valores que puede adoptar una casilla de la rejilla.

int count; //Cantidad de casillas que se dibujaran por linea

GridData[,] grid; //Array para almacenar los valores de la rejilla.


En tu implementación, una enumeración usa por defecto valores enteros, de forma que Blank = 0, Left = 1, Right = 2. Por lo tanto, al crear nuestro arreglo, automáticamente  todos sus elementos de inicializan a 0, es decir, a Blank, que es justamente lo que queremos.

Para asignar un valor a una variable de un tipo de enumeración de hace de la siguiente manera:

Código (csharp) [Seleccionar]
grid[i, j] = GridData.Blank;

Ahora vamos a usar nuestros cuadros de diálogo para permitir al usuario cambiar tanto las imágenes como los colores de la rejilla. Empecemos por las imágenes.

Note que el control PictureBox tiene una propiedad ImageLocation de tipo string que al ser asignada con una ubicación válida en el disco duro de una imagen, la asigna a la propiedad Image. Esto es justamente lo que necesitamos. Queremos entonces que al hacer doble clic sobre el PictureBox correspondiente, se abra el cuadro de diálogo y se asigne su ubicación a la imagen. Vayamos entonces al evento DoubleClick de nuestro control PictureBox llamado pboxLeft y hagamos doble clic para ir directamente al código.

Tenemos el siguiente código autogenerado para nosotros:

Código (csharp) [Seleccionar]
private void pboxLeft_DoubleClick(object sender, EventArgs e)
{

}


Veamos los argumentos. El primer argumento representa a la instancia que lanzó el evento. El segundo argumento no nos interesa por ahora. Lo interesante es que podemos asignar este mismo método a ambos controles PictureBox e incluso saber cual de ellos fue el que lanzó el evento, para asignar la imagen al control correcto.

Para esto, debemos conocer que en C# existe la palabra clave as que, en pocas palabras, hace conversiones entre tipos por referencia compatibles. Es decir, se parece mucho a un casting, aunque tiene algunas diferencias notables. Por ahora, conformémonos con saber que nos permitirá convertir la variable sender de tipo object en una variable de tipo PictureBox, ya que sabemos que efectivamente fue un PictureBox quien lanzó este evento.

Agreguemos la línea:

Código (csharp) [Seleccionar]
if (odlgImage.ShowDialog() == DialogResult.OK)
    (sender as PictureBox).ImageLocation = odlgImage.FileName;


Aquí no estamos haciendo nada nuevo, simplemente lanzando el método ShowDialog() y comprobando su valor de retorno (de tipo DialogResult que, dicho sea de paso, también es una enumeración) que en caso de ser OK indica que el usuario seleccionó un archivo y presionó el botón Abrir, para entonces asignar el valor de la propiedad FileName (que contiene la dirección completa del archivo, cortesía del OpenFileDialog) a la propiedad ImageLocation del PictureBox adecuado.

Ahora seleccionamos el PictureBox llamado pboxRight y en su evento DoubleClick le asignamos el método que acabamos de escribir.

Ya podemos probar nuestra aplicación y ver que efectivamente asigna a cada PictureBox la imagen seleccionada.

Sin embargo, tenemos un problema: si seleccionamos una imagen demasiado grande como para caber en el control, será recortada. En vez de esto, lo que queremos es que la imagen se reduzca de tamaño hasta caber en el control, pero sin deformarse. Esto lo logramos cambiando la propiedad SizeMode a Zoom.

Para seleccionar los colores de cada Panel vamos a escribir un método similar en el evento Click de uno de ellos y asignárselo al otro. Debido a la semejanza con el método anterior, lo pongo a continuación sin más preámbulo:

Código (csharp) [Seleccionar]
private void pnlColorLine_Click(object sender, EventArgs e)
{
if (cdlgColor.ShowDialog() == DialogResult.OK)
    (sender as Panel).BackColor = cdlgColor.Color;
}


Solamente agregar que las propiedades Color y BackColor de tipo Color de ambos controles sirven para representar el color seleccionado por el usuario en el diálogo y el color de fondo del control.

Si probamos la aplicación ahora veremos que podemos cambiar el color de los controles Panel haciendo clic sobre ellos.

Ahora vamos a implementar el método que asiganará los valores a nuestras variables de instancia, y que además será el llamado al hacer clic sobre el botón btnRestart:

Código (csharp) [Seleccionar]
private void RestartGrid()
{
    count = (int)nudCount.Value;
    grid = new GridData[count, count];
    pboxGrid.Refresh();
}


Aquí solo queremos agregar que el método Refresh() de cualquier control visual lo que hace es volver a pintar el control, y es llamado automáticamente cada vez que es necesario (por ejemplo, al cambiar el tamaño o posición de la ventana).

Finalmente, en los eventos Click del botón bntRestart, y Load del formulario agregamos la línea:

Código (csharp) [Seleccionar]
RestartGrid();

Hemos terminado con esta sección, así que ha llegado la hora de pintar.

3. Dibujado sobre el PictureBox

Para pintar sobre nuestro PictureBox, en específico sobre la instancia pboxGrid, vamos a implementar un método para su evento Paint, que es el evento lanzado cada vez que hay que pintar el contenido del control (por ejemplo, al llamar al método Refresh()).

Veamos los argumentos del método:

Código (csharp) [Seleccionar]
private void pboxGrid_Paint(object sender, PaintEventArgs e)
{

}


Ahora nos centraremos en el argumento e de tipo PaintEventArgs que contiene información que nos será muy útil sobre este evento. Por ejemplo, la propiedad Graphics de este argumento es de tipo Graphics, que es el tipo que encapsula los métodos y propiedades más comunes para efectos de gráficos bidimensionales, y representa en este caso el área dentro del PictureBox disponible para dibujar.

Lo primero que haremos será pintar el fondo. Para eso escribiremos las siguientes líneas:

Código (csharp) [Seleccionar]
SolidBrush b = new SolidBrush(pnlColorBack.BackColor);
e.Graphics.FillRectangle(b, e.ClipRectangle);


El tipo SolidBrush representa un objeto usado para rellenar, por eso esta sobrecarga de su constructor recibe un argumento de tipo Color. Es algo así como la representación de una brocha. El método FillRectangle() por su parte lo que hace es rellenar un rectángulo con una brocha determinada. En este caso usamos nuestra brocha ya creada, y la propiedad ClipRectangle que nos devuelve el rectángulo que representa el área que tenemos disponible para pintar, que es justamente lo que necesitamos colorear.

Ahora vamos a hacer las líneas. Si para rellenar necesitábamos una brocha, para hacer las líneas ¿que necesitamos? Evidentemente, un pincel. Crearemos un pincel con la siguiente línea:

Código (csharp) [Seleccionar]
Pen p = new Pen(pnlColorLine.BackColor, 1);

Esta sobrecarga del constructor recibe un color y un entero para el ancho del pincel.

Para hacer líneas tenemos el método DrawLine() del cual usaremos una sobrecarga que recibe cuatro valores enteros, las coordenadas x e y iniciales y las coordenadas  x e y finales. Por tanto, lo que haremos será hacer un ciclo, calculando cada vez la posición de la nueva línea. ¿Cuántas líneas necesitamos? Bueno, si tenemos count cuadrículas, y tenemos las dos lineas de cada borde, necesitamos count – 1 líneas intermedias, ¿verdad? Además el ancho de cada línea será:

Código (csharp) [Seleccionar]
int width = pboxGrid.Width / count;

Y nuestro ciclo tendrá entonces la forma:

Código (csharp) [Seleccionar]
for (int i = 1; i < count; i++)
{
   . . . .
}


Ahora podemos escribir las sentencias que dibujarán nuestras líneas dentro del ciclo. Como sabemos, la primera posición es (0;0), por eso restamos 1 a la posición en cada línea para contrarrestar el hecho de que el primer pixel tenga posición 0.

Código (csharp) [Seleccionar]
     
{
    e.Graphics.DrawLine(p, i * width - 1, 0, i * width - 1, pboxGrid.Height);
    e.Graphics.DrawLine(p, 0, i * width - 1, pboxGrid.Width,  i * width - 1);
}


Aquí no hemos hecho nada más que calcular la posición de cada línea según su ordinalidad (dada por la variable i de control del ciclo) y dibujar una línea usando el método ya explicado DrawLine().

Ahora solo nos queda dibujar la imagen correspondiente en cada casilla según el valor de dicha casilla. Pero antes de dibujar las imágenes, vamos a asegurarnos que el usuario haya seleccionado una imagen para cada valor. Por eso encapsulamos todo en un gran if para evitarnos referencias nulas.

Código (csharp) [Seleccionar]

if (pboxLeft.Image != null && pboxRight.Image != null)
{
   for (int i = 0; i < count; i++)
      for (int j = 0; j < count; j++)
          switch (grid[i, j])
          {
            . . . .
          }
}


Estos son los ciclos clásicos usados para recorrer una matriz bidimensional, y el switch lo usaremos para elegir que imagen dibujar según el valor del elemento de la matriz.

Para dibujar una imagen usaremos el método DrawImage() de la clase Graphics, en particular una sobrecarga que nos permite especificar la posición de la imagen, y sus dimensiones, lo cuál en última instancia nos pemitirá redimensionar nuestra imagen al tamaño deseado:

Código (csharp) [Seleccionar]

case GridData.Left:
     e.Graphics.DrawImage(pboxLeft.Image, i * width, j * width, width - 1, width - 1);
     break;
case GridData.Right:
     e.Graphics.DrawImage(pboxRight.Image, i * width, j * width, width - 1, width - 1);
     break;


El primer argumento es la imagen deseada, y los restantes representan como ya dijimos las coordenadas x e y de la esquina superior izquierda de la imagen, y sus dimensiones. Como las casillas son de ancho width y las líneas son de ancho 1 entonces nuestras imágenes tienen que ser de ancho width1.

Al terminar esta sección ya conocemos lo suficiente para dibujar sobre un PictureBox, sin embargo, al correr nuestra aplicación no sucede nada más que el dibujado de la rejilla. Esto se debe a que aún necesitamos implementar que sucederá al hacer clic sobre la rejilla.

4. Uso del mouse en el evento MouseClick

Bien, por último, vamos a implementar el método que responderá al evento MouseClick de pboxGrid. Este evento es lanzado al hacer click con el mouse, y lo preferimos al evento Click porque nos provee de información relacionada con las coordenadas y los botones pulsados del mouse.

Como siempre, la signatura del método autogenerado:

Código (csharp) [Seleccionar]
private void pboxGrid_MouseClick(object sender, MouseEventArgs e)
{

}


El argumento e de tipo MouseEventsArgs nos provee de toda la información que necesitaremos relacionada con el mouse. Por ejemplo, la posicion X e Y del click y los botones pulsados. Comencemos por declarar esta variable que nos servirá para decidir que valor poner en el elemento adecuado del array:

Código (csharp) [Seleccionar]
GridData data = GridData.Blank;

Ahora necesitamos calcular que posición ocupa en el array la posición del clic del mouse, determinada por las propiedades X e Y de e

Código (csharp) [Seleccionar]
int i = e.X * count / pboxGrid.Width;
int j = e.Y * count / pboxGrid.Height;


Esto es sencillamente un poco de álgebra básica. La coordenada en píxeles es a la longitud de la rejilla, como la posición del array (casilla elegida) es a la cantidad de casillas.

Ahora elegimos el valor de data según el botón del mouse que se haya pulsado. Esta información viene en la propiedad Button y es casualmente un tipo de enumeración.

Código (csharp) [Seleccionar]

switch (e.Button)
{
   case MouseButtons.Left:
        data = GridData.Left;
        break;
   case MouseButtons.Right:
        data = GridData.Right;
        break;
}


Por último, asignamos el valor de data a la posición del array, según el valor que ya estuviera allí, usando el arhiconocido operador ternario:

Código (csharp) [Seleccionar]
grid[i, j] = (grid[i, j] == data) ? GridData.Blank : data;

Y... repintamos el PictureBox.

Código (csharp) [Seleccionar]
pboxGrid.Refresh();

Ahora sí nuestra aplicación está completa. Podemos correrla y comprobar que hace exactamente lo que queremos.

5. Conclusiones

Espero sinceramente que este tutorial haya sido de utilidad. Quedan muchísimos métodos y propiedades dentro de la clase Graphics con los que jugar. Lo demás es ponerle imaginación y no cohibirse a la hora de "meter un dedo" donde quiera que queramos husmear, pues a veces, es la única forma de dominar el arte de la programación.
#27
Hola, necesito ayuda para poder entrar al BIOS de un Tablet Samsung GT-P8510. Lo que necesito es cambiarle el Boot Order (orden de boot) para ordenarle que haga boot desde el puerto USB pues necesito instalar otro SO (pues viene con el Windows RT y solo puedo instalar aplicaciones desde la tienda). He probado con cualquier combinacion de teclas del tablet...y nada. Incluso le puse un teclado USB y probé con F2, F12, del, backspace, esc, enter. y nada. Primero pensaba que el teclado USB no lo reconocia en el POST TIME, pero si aprieto CTRL+ALT+DEL se reinicia, o sea, parece que sirve. Por favor si alguien sabe como que me diga. Gracias de antemano.

PD: Busque en el manual del dispositivo y no me dice nada, pero ya saben que los manuales oficiales no comentan mucho sobre esto.
#28
Hola

Tengo unas duditas, existe alguna manera de Modificar el driver de una tarjeta NVidia GeForce Go 6150 para Windows Vista x64 para que funcione en Windows 8. Porque parece ser que solo existen los drivers para esa gráfica para Windows Vista.

Igual si alguien sabe si existe el driver en cuestión para Windows 8, diganme el link, porque ya me he cansado de buscar y no lo encuentro. Espero que me puedan ayudar.

PD: La Pc es una HP Pavilion Entertainment PC dv6000

Gracias
#29
Tal y como dice el titulo del post. necesito que me ayuden o me expliquen como puedo instalarle UBUNTU a una PowerBook G4 que tiene instalado Mac OS X 10.4.11 ¨Tiger¨y si se puede hacer sin ningún tipo de problema con el reconocimiento de los dispositivos por parte de Ubuntu. o sea si reconoce los drivers automáticamente sin tener que bajarlos desde internet...

Saludos y espero me puedan ayudar

PD: Esta PowerBook es un poco viejita....1.5 Ghz PowerPC g4 y 1.25 DB DDR SDRAM
#30
Hola, salu2s, stoy haciendo una aplicacion para crear y editar iconos, y tengo una duda. Como puedo cojer un Bitmap (el de .NET) y exportarlo a un archivo .ICO.?

Por ahora tengo dos variantes pero ninguna de las dos me sirve, veran por que

1ra variante:
El bitmap se llama "file" y ya tiene todos los pixeles coloreados con la informacion de mi icono... lo guardo asi

file.Save("C:\\icono.ico", System.Drawing.Imaging.ImageFormat.Icon);

pero esto me lo guarda y se ve bien el icono de ese archivo,pero no lo puedo poner como icono de una carpeta, veran porque. Porque un icono contiene varios formatos de distintos tamanos. En este caso yo solo quiero ponerle un solo tamano pero que lo reconozca, en este caso 16x16 y que soporte un formato 32bits ARGB (con ALPHA).

2da variante: (el bitmap es "file")

FileStream f = new FileStream("C:\\icono.ico", FileMode.Create);
IntPtr hIcon = file.GetHicon();
System.Drawing.Icon iconizer = System.Drawing.Icon.FromHandle(hIcon);
iconizer.Save(f);

En esta variante, si le anade el formato correspondiente al tamano del icono (16x16), pero con 4bits por pixel (vaya, que sin color). no se ve transparencia, de hecho se ve todo negro.

O sea como puedo hacer esto bien...repito la pregunta...

Como puedo desde un BITMAP guardar un .ICO para que tenga un formato especifico (uno solo Ej: 16x16 o 32x32) pero que tenga 32Bits por pixel y ARGB (ALPHA)???

Espero me puedan ayudar...gracias

PD: Disculpenme por las tildes y las ennes, ah....y por el codigo que no me funciona el GeSHi
#31
Hola, tengo un router TP-LINK y quiero que no me transmita la señal. Osea que si una laptop busca una señal wi-fi. que no la encuentre. Ya marque la plequita de Ocultar la señal del aire, perro lo sige mostrando. ¿que podría hacer?  Salu2s y gracias de antemano.
#32
Hola, tengo un pequeño problema en C#, tengo que dar solucion a un problema donde me entran un numero n tal que n esta entre 0 y 10000, no es divisible por 2 ni por 5. Tengo que ir dividiendo 1/n y ver si es divisible si no divido 11/n y si no 111/n hasta xCantidadDe1/n hasta que sea divisible por n. Luego debo devolver la cantidad de 1s. Lo que me pasa es que si el numero de uno es muy grande se me sale del rango de cualquier tipo de datos de .NET. Probe con string, pero igual tengo que Parsearlo.

Aqui les dejo el codigo que tengo hecho, si pueden corregirme y ayudarme y explicarme les estaria agradecidos.

Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            while (true)
            {
                string numero = Console.ReadLine();
                string ones = "1";
                double a = double.Parse(numero);
                if (a == 0) break;
                while (double.Parse(ones) % a != 0)
                {
                    ones += "1";
                }
                Console.WriteLine(ones.Length);
            }
        }
    }
}

Salu2s..:Gracias de antemano.
#33
Estoy creando en C# el juego del Othello (Reversi) y estoy realizando la Class Library (Lógica) y necesito una ayudita con los metodos y las propiedades... Primero si alguien me explica como utilizar vectores para buscar en un array bidimensional (array[,]) las fichas contrarias y las similares.

Nota: Por ahora estoy creando jugar Humano vs Humano

PD: Si tienen un codigo ya me lo pueden pasar....

Salu2s ;)
#34
Hola tengo un problema, tengo acumulado una pila de temas en mi zona "Mostrar nuevas respuestas a tus mensajes" porque son muy viejas y bueno, lo que pasa es que cuando toco el boton "Marcar Leidos" para que desaparezcan todas me sale esto

CitarForbidden

You don't have permission to access /markasread.html;sa=unreadreplies;topics=162515-137518-183401-212733-214082-178670-185296-149204-49887-127642-198717-215273-179710-213892-205072-197455-209541-314520-207969-216997-217452-217654-216276-217494-217398-217010-217615-217552-217676-217634-217642-217522-217478-217358-217511-217519-217496-217509-216698-215696-217219-217102-215655-208171-214656;sesc=8e66c92a7b040d8e154e24aa171dc6b6 on this server.
Apache Server at foro.elhacker.net Port 80

¿porque no me funciona?
#35
Dudas Generales / [Duda] Lógica
25 Octubre 2011, 03:52 AM
Saludos, Estoy estudiando Ciencias de la Computacion y tengo una asignatura que se llama Lógica, y estoy dando Algebra de conjuntos, Relaciones Binarias, Funciones, etc. Pero tengo que hacer demostraciones. Si alguien me pudiera explicar con sus palabras los metodos de demostracion llamados

Via Directa, Contrareciproco y Reduccion al Absurdo.

Nota: Tengo bibliografia pero la explicación esta un poco tediosa, agradecería un poco entendible
#36
Hardware / Duda sobre compatibilidad del FSB
7 Agosto 2011, 20:36 PM
Buenas a todos, tengo una duda
Si una motherboard tiene un FSB a 533 Mhz y le pongo un micro con el bus a 800 Mhz ¿funcionará?

PD:
Motherboard: Asus P5GD1-HVM
Micro instalado: Celeron D 331 2.66 Ghz - 256 Kb L2

y quiero ponerle un Pentium a 2.8 HT pero con el bus a 800
#37
Hola, he estado posteando hace ya un rato....y hace 1 dia me estoy dando cuenta de que los mensajes o tardan en subir o no se cuenta lo que posteo...
Me refiero a la cuenta de los mensajes que aparecen abajo de mi nick no se actualiza o algo...
.pasa algo? si a alguien le pasa que lo diga....

Salu2s
#38
1. El fenómeno del correo electrónico
Hace unos 10 años, el correo electrónico no se conocía fuera de los círculos técnicos o académicos. Hace tan sólo cinco años, la comunicación interna por medio del correo electrónico no era nada habitual en las empresas. Hoy en día, el correo electrónico se encuentra en todas partes, tanto en los círculos profesionales como en los particulares.

En el ambiente laboral, el correo electrónico se ha expandido de tal modo que amenaza con hacer desaparecer cualquier otra forma de comunicación interna. La razón de esta rápida proliferación es obvia: el mismo mensaje se puede enviar simultáneamente a todas las personas interesadas; se puede atender el correo electrónico en cualquier rato libre, ya sean las tres de la tarde o las tres de la madrugada; además, combina la inmediatez de la comunicación oral con la permanencia de la comunicación escrita.

Sin embargo, en ocasiones el correo electrónico puede suponer una pesada carga. No hay más que preguntar a cualquier persona que llega a su oficina un lunes por la mañana y se encuentra 135 mensajes en su buzón de correo electrónico. Resulta tan fácil enviar un mensaje a cualquier persona de la empresa que nos encontramos con que una gran cantidad de mensajes son difíciles de leer y de responder, están mal redactados, o simplemente son irrelevantes para el receptor.

En esta unidad didáctica le proporcionamos algunas pautas para asegurarse de que el mensaje está bien redactado, resulta fácil de leer y de responder y es siempre de interés. También proporcionamos algunos consejos para combatir la saturación de nuestro buzón de correo electrónico.

Consideraremos tres temas básicos:

-La elaboración del mensaje

-La respuesta a un mensaje

-La reducción de la saturación del buzón

2. Cómo elaborar un mensaje de correo electrónico
Al escribir un mensaje de correo electrónico nos haremos las mismas preguntas que nos hacemos ante cualquier otro tipo de comunicación:

-¿Cuál es el motivo del mensaje?

-¿Quiénes son los destinatarios del mensaje?

-¿Qué queremos obtener de ellos?

-¿Por qué deben estar de acuerdo con nosotros?


Recuerde.- No hay que olvidar que el correo electrónico, si bien consigue la inmediatez de la comunicación oral, también presenta la permanencia de la comunicación por escrito. No hay que escribir nada en un mensaje que no incluiríamos en un memorándum.


El motivo del mensaje.- Dada la facilidad de envío del correo electrónico, resulta fácil caer en la trampa de enviar mensajes sin pararse a pensar si son importantes o no, o a quién no. Esto lleva a pérdidas de tiempo, tanto a nosotros como al receptor del mensaje, en el caso de que el mensaje no hubiera debido enviarse en absoluto.

Por otro lado, una frase de título resulta mucho más importante en un correo electrónico que en cualquier otro tipo de comunicación. El título le permitirá al receptor reconocer el tema del mensaje y decidir si abre ese mensaje de inmediato o bien si abre cualquier otro de su buzón de correo.


Recuerde.- Una frase de título electrónica es aquélla que resume de manera telegráfica el tema y el contenido del mensaje.

3. Los destinatarios
Una de las grandes ventajas del correo electrónico es la facilidad para enviar un mensaje a varias personas simultáneamente. Sin embargo, esta ventaja no está exenta de riegos. No hay que caer en la tentación de enviar mensajes a una persona simplemente porque resulte fácil hacerlo. Debemos considerar primero si todas las personas de nuestra lista de correo necesitan de verdad la información contenida en el mensaje. De este modo, lograremos evitar saturar el buzón de correo de los demás con mensajes irrelevantes, y evitaremos saturar nuestro propio buzón con las respuestas que no necesitaban recibir esa información.

No hay que dar por hecho que los destinatarios han leído nuestro mensaje, sobre todo si lo hemos enviado a varias personas. Al igual que nosotros nos saltamos algunos mensajes, debemos pensar que los demás hacen lo mismo. Si adoptamos la costumbre de enviar los mensajes únicamente a aquellas personas a quienes les interesa de verdad, los receptores de nuestros mensajes terminarán por darse cuenta de que nuestros mensajes merecen la pena ser leídos en cuanto se reciban.


Recuerde.- La lista de correo, o lista de distribución, es la lista de las personas a quienes se envía el mensaje.

Siempre hay que recordar que si nosotros no sabemos lo que queremos de los destinatarios del mensaje, es poco probable que ellos lo sepan, con lo cual nuestro mensaje les supondrá una pérdida de tiempo. Por tanto, es importante que seamos concretos acerca de lo que esperamos que cada destinatario haga con la información que le enviamos.

Asimismo, no debemos dar por hecho que los receptores harán lo que nosotros pretendemos que hagan. Si les pedimos alguna actuación, debemos solicitar la confirmación de que han leído el mensaje y de que están de acuerdo con hacer lo que se les pide.


Recuerde.- Hay que tener mucho cuidado al enviar gráficos por correo electrónico. Algunos programas de correo electrónico transforman los caracteres de los gráficos, modificando considerablemente su aspecto.

4. La redacción del mensaje
Imaginemos que somos el vicepresidente de una empresa, y que hemos programado una reunión para discutir el aumento de gastos en varios departamentos y el modo de reducir esos gastos.

A la reunión deben asistir tres jefes de departamento, los que tienen exceso de gastos. Otros dos jefes de departamento asistirán para aprender y compartir diferentes modos de reducción de gastos, pero en su caso la asistencia no es obligatoria. El mensaje que podríamos enviar para convocar la reunión sería parecido a éste:

____________________________________

Para: Todos los jefes de departamento

De: El vicepresidente de la división

Asunto: Reunión para tratar sobre el exceso de gastos

Se celebrará una reunión, obligatoria para los jefes de los departamentos A, B y C, el 2 de junio de 14.00 a 16.00 horas en la Sala 1 con el objeto de discutir el exceso de gasto observado en esos departamentos. Los demás jefes de departamento pueden asistir a la reunión, o enviar a algún representante, para compartir ideas que conduzcan a la reducción de gastos. Pero en su caso, la asistencia no es obligatoria. Se ruega confirmación de la asistencia por correo electrónico.
____________________________________

Si bien este mensaje incluye la información necesaria, resulta ser menos eficaz de lo que podría. Empleando unos pocos minutos más se podrían enviar mensajes por separado a los dos grupos de jefes de departamento. El primer mensaje podría ser así:
___________________________________

Para: Los jefes de los departamentos A, B y C

De: El vicepresidente de la división

Asunto: Reunión obligatoria sobre el exceso de gastos

Se ruega confirmación, mediante la respuesta a este mensaje, de la asistencia a la reunión obligatoria para discutir el exceso de gastos en sus departamentos y el modo de reducirlo.

Fecha: 2 de junio

Hora: de 14.00 a 16.00
____________________________________

Este es el segundo mensaje que podría escribir:
____________________________________

Para: Los jefes de los departamentos D y E

De: El vicepresidente de la división

Asunto: Reunión voluntaria sobre la reducción de gastos

Voy a celebrar una reunión con los jefes de los departamentos A, B y C para discutir los excesivos gastos producidos en dichos departamentos y el modo de reducirlos. Puede que encuentren interesante la asistencia a nuestra reunión; si es así pueden participar en ella, o enviar a algún representante para que asista a la última hora de la reunión, momento en que se discutirán los medios para reducir gastos. Los detalles de la reunión son:

Fecha: 2 de junio

Hora: 14.00 a 16.00

Lugar: Sala de conferencias 1
____________________________________

En el segundo ejemplo, la petición es mucho más clara que en el mensaje original.


Consejo.- Si queremos utilizar diferentes caracteres y tipos de letra para hacer que nuestro mensaje resalte, podemos escribirlo con algún programa de tratamiento de textos y enviarlo como documento adjunto.

5. La respuesta a un correo electrónico
Existen varias pautas a seguir para responder a un correo electrónico que ahorrarán tiempo y evitarán la saturación del buzón de correo, tanto del nuestro como del de los destinatarios del mensaje.

-Sólo hay que responder cuando se necesite una respuesta. Por ejemplo, si nos han enviado una información que vamos a necesitar para un documento en el que estamos trabajando, no será necesario responder al mensaje. El hecho de que esa información aparezca en nuestro documento ya indica que lo hemos recibido y que hemos hecho uso de la información que contenía.

-Para responder a un correo electrónico del que somos uno de los muchos receptores, no debemos enviar una respuesta a todos los nombres de la lista de correo. En muchos casos, sólo unos cuantos necesitarán conocer la respuesta. Al enviar el mensaje sólo a las personas a las que les pueda interesar, conseguiremos evitar saturar el buzón de correo de los demás.

-Tras varias idas y venidas del mensaje, el título ya no hará referencia a la información contenida en el mismo. En ese caso, debemos cambiar el título por otro más adecuado.

-La mayoría de los programas de correo electrónico adjuntan el mensaje original a la respuesta. Sin embargo, podemos, y debemos, eliminar las partes del mensaje original que no sean relevantes para nuestra respuesta. Con ello acortaremos el mensaje.

-Aunque no tenemos que incluir todo el mensaje original, sí deben aparecer todas las frases que sean relevantes para la respuesta de modo que los destinatarios tengan claro siempre a qué estamos contestando exactamente. No podemos dar por hecho que todos los destinatarios se acuerdan del mensaje original.

-Para las respuestas breves, debemos usar el título para enunciarlas, aunque luego las incluyamos en el mensaje, ya que muchas personas abren los mensajes sin leer su título.

6. Cómo reducir la saturación en su buzón
La mayoría de los elementos vistos hasta ahora hacen referencia a la manera de asegurar que nuestro mensaje no sature el buzón de correo de los receptores. Desgraciadamente, esto no resuelve de forma inmediata el problema de la saturación de nuestro propio buzón de correo. Aunque una gran parte de esa saturación sólo se consigue controlar cambiando las costumbres de las personas en cuanto al envío de mensajes, podemos hacer unas cuantas cosas por nuestra cuenta para "limpiar" nuestro buzón y gestionar nuestro correo electrónico de manera más eficaz.

La herramienta más eficaz de que disponemos es la opción de ordenar los mensajes entrantes, presente en la mayoría de los programas de correo electrónico. Esta posibilidad de ordenamiento nos permite:

-Ordenar los mensajes según su origen. Por ejemplo, podemos agrupar los mensajes de nuestros superiores por un lado, y los de nuestros subordinados por otro. Si se emplea el mismo correo electrónico para asuntos profesionales y para asuntos familiares, se pueden separar los mensajes de índole profesional de los de índole personal o familiar.

-Ordenar los mensajes según el tema de los mismos. Imaginemos que recibimos habitualmente mensajes concernientes a dos proyectos diferentes, y que esos mensajes provienen de la misma persona. La solución será ordenar estos mensajes por tema, y no por su origen.

-Copiar los mensajes según su contenido.


Consejo.- Cuando enviamos periódicamente un mensaje a alguien sobre un mismo tema, debemos procurar uniformizar los mensajes para que sean rápidamente reconocibles.

Además de reorganizar el buzón de correo electrónico con el fin de mejorar nuestra eficacia en el manejo del correo entrante, existen dos cosas que podemos hacer para reducir el volumen de mensajes recibidos:

-Podemos pedir a a las personas que los envían que nos eliminen de la lista de correo de los mensajes que no resulten relevantes para nosotros.

7. Recapitulación
El correo electrónico se ha convertido en el principal método de comunicación en la mayoría de las oficinas. Con el correo electrónico también han llegado los problemas, entre ellos el envío masivo de mensajes y una disminución en el cuidado del estiloy de la estructura de esos mensajes, lo que lleva a la proliferación de documentos mal redactados. Sin embargo, si utilizamos la información presentada en esta lección, podemos estar seguros de utilizar todas las capacidades que nos proporciona una herramienta como el correo electrónico.


Recuerde.- Repasemos algunos de los aspectos

-Al igual que haríamos con cualquier otro tipo de comunicación escrita, antes de enviar un mensaje por correo debemos pensar en nuestro propósito.

-Hay que decidir qué personas necesitan recibir la información contenida en el mensaje, y estructurarlo del modo más adecuado.

-Debemos utilizar nuestro programa de correo electrónico para ordenar nuestros mensajes, y así poderlos controlar de modo más efectivo.

Este manual esta hecho para aquellos que se quieran guiar por el, en lo personal respondo si me viene en gana, y escribo como me viene en gana...siempre y cuando no sea nada oficial eso si....

Salu2s, espero lo encuentren interesante
#39
Primero, voy a suponer que saben diseñar, entonces más o menos podrian tener su página conformada. Yo les voy a explicar la siguiente estructura

upload.html[tiene el formulario para especificar el fichero a subir]
upload.php [contiene el script para subir la imagen, luego de procesada la imagen, va a mostrar una vista en miniatura de la imagen, y los vinculos: directo y foro]
imagenes.php [sirve para ver las imagenes subidas al servidor, utiliza el fichero maxFileBrowser.class.php]
maxFileBrowser.class.php [contiene el script que permite ver las imagenes subidas, muestra una vista en minatura de la imagen y los vinculos: directo y foro, este script no fue creado por mi, disculpenme no recuerdo de que página lo descarge]

upload.html
Código (html) [Seleccionar]
<form method="post" action="upload.php" enctype="multipart/form-data">
                  <p>
                    <input name="userfile[]" type="file" >
                    <br>
                    <br>
                   
                    <input type="submit" value="Subir!!!" >
                  </p>
              </form>


Expliación: Este es el formulario que utiliza el metodo POST* para enviar la imagen al fichero upload.php para que este la suba al servidor.




upload.php
Código (php) [Seleccionar]
<?php
   
for($i=0;$i<sizeof($userfile);$i++)
   { 
     if(!
$userfile_size[$i])
         continue;
 
     
$UPLOAD fopen$userfile[$i], "r" );
     
$contents fread$UPLOAD,$userfile_size[$i]);      
     
fclose$UPLOAD );  
     
$SAVEFILE fopen("upload//".$userfile_name[$i], "wb" );
     
fwrite$SAVEFILE$contents,$userfile_size[$i] ); 
 echo "UploadImage ha recibido la Imágen <b>$userfile_name[$i]</b>";  
 echo "<br>";
 echo "<table width='200' border='1'>
  <tr>
    <td colspan='2'>Vinculos</td>
  </tr>
  <tr>
    <td><b>Directo:</b></td>
    <td><a target='_blank' href='http://192.168.1.2/imageupload/upload/
$userfile_name[$i]'>http://192.168.1.2/imageupload/upload/$userfile_name[$i]</a></td>
  </tr>
  <tr>
    <td><b>Foro:</b></td>
    <td><font color='#FF0000'>[img]http://192.168.1.2/imageupload/upload/
$userfile_name[$i][/img]</font></td>
  </tr>
</table>"
;   
     
fclose$SAVEFILE );       
  }    
  
  
?>


Expliación: Este Script sube el fichero al servidor a una carpeta llamada upload, que vamos a crear nosotros dentro de la carpeta de nuestro sitio. Luego te muestra los vinculos directo y foro para referirnos a nuestra imagen.




imagenes.php
Código (php) [Seleccionar]
<?php
    
require_once("maxFileBrowser.class.php");
    
$fileBrowser = new maxFileBrowser();
    
$fileBrowser->displayDir(getcwd());
?>


Expliación: Hace llamada a las funciones del fichero maxFileBrowser.class.php, para ejecutarlas en esta página. Este código lo insertamos donde queremos mostrar las imagenes. En si lo que hace es mostrar el contenido de una carpeta, en este caso la carpeta upload




maxFileBrowser.class.php
Código (php) [Seleccionar]
<?php
class maxFileBrowser {
   var 
$fileList;
   var 
$dirList;   
   var 
$dateFormat 'd-m-Y H:i:s';

function 
displayDir($path='.'){
   
$path 'upload//';     
   
$this->showDirSelector($path); 
   
$dn=dirname($path);
   
$sp strrpos($dn,DIRECTORY_SEPARATOR);
   
$up substr($path0$sp);   
   if (
$handle = @opendir($path))
   {
       echo 
"<table class='fileList'>";
       echo 
"<tr><th width='25'></th><th>Nombre         </th>
 <th width='100'>Tama&ntilde;o</th>
 <th width='300'>Fecha que se subio</th>
     </tr>"
;
       echo 
"<tr><td></td><td colspan='4'></td></tr>";
        
       while (
false !== ($file readdir($handle)))
       {
           if (
$file != "." && $file != "..")
           {
               
$fName $file;
               
$file $path.DIRECTORY_SEPARATOR.$file;
               if(
is_file($file)) {
                  
$this->fileList[] = $file;
               } elseif (
is_dir($file)) {
                   
$this->dirList[] = $file;
               }
           }
       }
       
       
$i 0;
       if (
sizeof($this->dirList) > 0){
          
sort($this->dirList);  
          foreach (
$this->dirList as $dir) {
              
$size filesize($dir);
              
$perm substr(sprintf('%o'fileperms($dir)), -4);
              if (
function_exists('mime_content_type'))
                  
$type mime_content_type($dir);
              else 
                  
$type filetype($dir);       
              
$date date ($this->dateFormatfilemtime($dir));;
              
$name basename($dir);
              if (
$i++%2) echo "<tr>";
              else echo 
"<tr class='tr2'>";
              echo 
"<td><img src='style/images/file.gif' alt='File' /></td><td class='fname'><img src='http://192.168.1.2/imageupload/upload/$name' width='100' height='100' alt='NO IMAGEN' /><a href='http://192.168.1.2/imageupload/upload/$name' target='_blank'>$name</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>".$size." Bytes</a></td><td>$date</td>
  <tr colspan='4'><td colspan='4'><b>Foro: </b><br><font color='blue'>[img]http://192.168.1.2/imageupload/upload/"
.$name."[/img]<br><b></font>Directo: <font color='blue'><br></b>http://192.168.1.2/imageupload/upload/".$name."</font><br><br><a href='#top'><img src='go_up.gif'><br><br></td></tr></tr></tr";
          }
       }

       if (
sizeof($this->fileList) > 0){
          
sort($this->fileList);  
          foreach (
$this->fileList as $file) {
              
$size number_format(filesize($file), 0' '' ');
              
$perm substr(sprintf('%o'fileperms($file)), -4);
              if (
function_exists('mime_content_type'))
                  
$type mime_content_type($file);
              else 
                  
$type filetype($file);       
              
$date date ($this->dateFormatfilemtime($file));
              
$name basename($file);
              
              if (
$i++%2) echo "<tr>";
              else echo 
"<tr class='tr2'>";
              echo 
"<td><img src='style/images/file.gif' alt='File' /></td><td class='fname'><img src='http://192.168.1.2/imageupload/upload/$name' width='100' height='100' alt='NO IMAGEN' /><a href='http://192.168.1.2/imageupload/upload/$name' target='_blank'>$name</a>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td><td>".$size." Bytes</a></td><td>$date</td>
  <tr colspan='4'><td colspan='4'><b>Foro: </b><br><font color='blue'>[img]http://192.168.1.2/imageupload/upload/"
.$name."[/img]<br><b></font>Directo: <font color='blue'><br></b>http://192.168.1.2/imageupload/upload/".$name."</font><br><br><a href='#top'><img src='go_up.gif'><br><br></td></tr></tr></tr>";
          }
       }
       
       
closedir($handle);
       echo 
"</table>";
   }


}

function 
showDirSelector($actpath='.'){
?>
   
<?php
}
   
function 
getActualPath(){
    if (isset(
$_POST['submitBtn'])){
        
$dir = isset($_POST['path']) ? trim($_POST['path']) : getcwd();
    } else if (isset(
$_GET['path'])) {
        
$dir = isset($_GET['path']) ? trim($_GET['path']) : getcwd();
    } else {
        
$dir getcwd();
    }

    if (!
file_exists($dir)) $dir getcwd();
    
    return 
$dir;
}
}
?>


Expliación: Comprueba los ficheros de una carpeta en este caso upload, y los va a mostrar en la página a la que se le hizo referencia a este Script, en este caso imagenes.php, las muestra como una lista con la vista en miniatura, el nombre, la fecha que se subio, el tamaño, y los vinculos directo y foro

TÉRMINOS
Metodos GET Y POST:
En HTML, se pueden especificar dos métodos de envíos de formularios. Los mismos son establecidos a través de la propiedad METHOD que es un atributo de los formularios HTML.

POST: Cuando se envía un formulario a un script PHP, las variables de dicho formulario pasan a estar automáticamente disponibles en el script gracias a PHP. Estas variables tienen el nombre del campo del formulario, o sea si el campo de entrada de texto se llama nombre, la variable sera $nombre.

GET: Usando un formulario GET es similar excepto en el uso de variables predefinidas, que en este caso serán del tipo GET. GET también se usa con QUERY_STRING (la información despues del símbolo '?' en una URL). Por ejemplo http://www.example.com/test.php?id=3 contiene datos GET que son accesibles con $_GET['id'].

NOTA:
http://192.168.1.2/imageupload/upload/:
En todos donde aprezca esta ruta...debe ser cambiada por la ruta de la carpeta donde estan tus páginas. O sea 192.168.1.2 seria tu IP, imageupload: la carpeta de las páginas, y upload: la carpeta para subir las imagenes.

Espero este tuto les ayude en algo....

Salu2s

DarK_FirefoX
#40
Bueno propongo un concurso de firmas y lo haremos por grupos de 4 concursantes pasando para la siguiente fase solo 2 de cada grupo, o sea 4, y se forma otro grupo, Se hace otra firma, y compiten, se vuelve a votar, y luego quedan 2, estos 2 tienen que hacer otra firma para competir, y se vota por ellos a ver quien gana.

Los eliminados debe seguir votando

NOTA: Las firmas van acerca de tu nick...

Concursantes:
USUARIO             FIRMA ENTREGADA
DarK_FirefoX         [Si]
Shell Killer             [Si]
Yasme710             [Si]
Furious Dami         [Si]
Artikbot                [No]
Ashran                  [Si]
Xerok1!                 [Si]
hadess_inf              [Si]

Esperando:
Las firmas por Privado. La entrega me la mandan por privados con las direcciones yo las subire el dia de las votaciones. Me envian la Imagen posteada, y el link.

ENVIENME LAS FIRMAS
FECHA LIMITE PARA LA ENTREGA: 20 de junio del 2008


SOLO FALTAN 1 USUARIOS

Reglas:
Las dimensiones de la firma es: 370 x 140 pixel aproximadamente (puede ser un poco mas o menos)

En el concurso hay 8 concursantes, se postearan las 8 firmas en grupos de a 4, entonces los usuarios del concurso votaran de la siguiente manera.
En la primera fase solo votan por los de su grupo, luego los eliminados DEBEN votar en la segunda fase

1. Tal Usuario (Recibe 10 Pts)
2. Tal Usuario (Recibe 8 Pts)
3. Tal Usuario (Recibe 5 Pts)

Los demas usuarios reciben 1 Punto.

Solo se le esta permitido votar a los concursantes, los cuales no pueden votar por si mismo, pero cuando votan se les añade un Punto a ellos mismos, porque aparecen como ultimo lugar en su votación.

VAMOS A ENVIAR LAS FIRMAS A MI.......

#41
Bien, voy a hace un manual para aquellas personas que deseen crear un GuestBook(libro de visitas) en sus páginas.... o sirve para dejar comentarios acerca de un articulo..

Modifico gracias a ^Arkangel^:
El guestbook es vulnerable a ataques Html Injection (entre otras cosas), la cual es una tecnica de Deface bastante conocida, la solución sería eliminar el uso del html en el guestbook. Esto solo muestra el funcionamiento básico y sencillo de un Guestbook

Bien este GuestBook, es muy sencillo, asi que si tienen alguna otra Ide pueden ayudar.....

Sientanse libre de modificarlo o distribuirlo.

guestbook.php


<html>
<head>
      <title></title>
</head>
<body>
  <center>
   <font face="Arial" size="2">
      <form action="comentar.php" name="form" method="POST">
            Name: <input type="text" name="txt_name"><br>
            E-mail: (no se muestra) <input type="text" name="txt_mail"><br><br>
            Comment:<br><textarea rows="10" name="txt_comment"></textarea><br>
            <input type="submit" value="submit">
      </form>
   </font>
</center>


<?php
/* Este es el Script para mostrar los comentarios que estan en la BD */
/* Nos conectamos a la base de datos (debemos cambiar esta info por la de nuestro servidor web */
/* localhost por tu servidor | userlocal por tu usuario | userlocal por el password del usuario */  
mysql_connect('localhost','userlocal','userlocal');

/* questbook es la base de datos, la estamos seleccionando aqui */
mysql_select_db("questbook");

/* seleccionamos todos los campos dentro de la tabla guests */
$sql="select * from guests";

/* Enviamos la consulta al servidor y mostramos error en caso de error */
$resultmysql_query($sql) or die(mysql_error());

/* Comprobamos si la tabla esta vacia..... y si esta vacia mostramos el mensaje escrito */
if(mysql_num_rows($result)==0) die("No hay registros para mostrar");

/* Desplegamos cada uno de los registros dentro de una tabla */  
echo "<table border=1 cellpadding=4 cellspacing=0>";

/*Priemro los encabezados, es decir los nombres de las columnas*/
 
echo "<tr>
         <th colspan=5> Lista de Usuarios </th>
       <tr>
         <th> ID </th><th> Nombre</th> <th> Comment </th>
        
      </tr>"
;

/*Y ahora muestro debajo de los nombres de las columnas todos los registros  */
while($row=mysql_fetch_array($result))
{
 echo 
"<tr>
         <td> 
$row[autoID] </td>
         <td> 
$row[name] </td>
         <td> 
$row[COMMENT] </td>
  
      </tr>"
;
}
echo 
"</table>";

?>


</body>
</html>


En la página guestbook.php encontramos el siguiente código
<form action="comentar.php" name="form" method="POST">
            Name: <input type="text" name="txt_name"><br>
            E-mail: (no se muestra) <input type="text" name="txt_mail"><br><br>
            Comment:<br><textarea rows="10" name="txt_comment"></textarea><br>
            <input type="submit" value="submit">
      </form>

     
Este código no es más que el formulario que envia la informacion al script que va a enviar la información a la Base De Datos... si dean cuenta en la propiedad action esta definida para comentar.php y estamos utilizando el metodo POST, para en enviarlo como variables.
     
comentar.php


<?php
/* Nos conectamos a la base de datos (debemos cambiar esta info por la de nuestro servidor web */
mysql_connect('localhost','userlocal','userlocal');

/* questbook es la base de datos, la estamos seleccionando aqui */
mysql_select_db("questbook");

/* Pasamos los campos del formularios a Variables... */
$name $_POST["txt_name"];

/* Aqui comprobamos si el Nombre tiene mas de 0 caracteres */
$len strlen($name);
if (
$len 0)
{
 
$mail $_POST["txt_mail"];
 
$comment $_POST["txt_comment"];

/* Insertamos los datos de las variables a la Base de datos..... */
 
$query "INSERT INTO guests (autoID, name, mail, comment) VALUES (NULL, '$name', '$mail', '$comment')";
 
mysql_query($query) or die(mysql_error());
}
?>


<html>
<head>
</head>
<body>
<SCRIPT LANGUAGE="javascript">
/* Redireccionamos el navegador al formulario */
location.href = "guestbook.php";
</SCRIPT>
</body>
#42
Hola, la cuestion es la siguiente, soy un gran fanatico de este juego de la Blizzard. Me gustaria acceder a algun servidor de Battle.net por Internet, resulta que mi conexion es a traves de un proxy, por mas que lo intente no puedo acceder, me dice que no estoy conectado a internet, como puedo hacer para esto

PD: Ya intente con el proxifier y no funciona
#43
PHP / Necesito dejar comentarios !!!
23 Marzo 2008, 08:48 AM
hola a todos, espero puedan ayudarme, tengo un sitio echo por mi, y le cree un sistema de registro y inicio de sesion de usuarios usando cookies, y todo funciona bien, ahora, quiero que cuando este iniciada la sesión los usuarios tengan la posibilidad de dejar comentarios en las paginas que se pueda dejar comentarios.
Espero puedan ayudarme.....

Saludos
#44
Estoy seguro k alguno de ustedes a visto series manga, y saben que en los openings le ponen como un karaoke con las letras de als canciones rellenandos en colores con la cancion.
Me gustaria saber como se hace eso, para un video que estoy haciendo con cortos de mi escuela, y una cancion.

Saludos
#45
Juegos y Consolas / Para Jugadores de StarCraft
17 Noviembre 2006, 23:55 PM
Hola Mi nombre es Armando y soy un gran fan del StarCraft, un juego que revoluciono el mundo de los juegos.

Mi idea es la siguiente, quisiera que todos a los que le guste ekl StarCraft que postearan aqui sus sugerencias para los novatos y Avanzados jugadores, estrategias, vinculos a paginas de StarCraft, etc. Todo lo que sepan del mismo

Bueno, quiero decirles que juego Terran, y que cuando quieran jugamos.

Salu2