PDA

Ver la versión completa : [Ayuda] Programación WEB: CGI, JS, HTML, comunicarlos entre e ellos, alternativas...



3L_S4N70
26/11/2009, 17:40
Hola gente:

Veréis, ando metido en un proyectito (el PFC) en el que me encuentro ante la posibilidad de utilizar una interfaz web para darle un aspecto gráfico a algo que de otra manera debiera hacer por consola (o con un cliente gráfico externo, realizado con "otro lenguaje"). El caso es que mis andanzas en el mundo de la programación web han empezado hace dos días, y aún no tengo claro qué sería lo mejor para mi proyecto. Os explico, y si podéis, me dáis alguna idea, pauta, ejemplo, código utilizable... yo que sé.

Tengo un robotito a controlar desde un router corriendo OpenWRT. Sobre OpenWRT está corriendo Player (http://playerstage.sourceforge.net/). El tema está en que tiene una filosofía cliente-servidor, el servidor corre sobre el router, y quiero hacer que el cliente corra sobre él también, pero no sé cómo hacer que se comunique con el navegador. Tengo algo funcionando con CGIs e idea de cómo tirar hacia allí, pero recargando la página web continuamente. Me gustaría hacer algo que recibiese y enviase datos a - del cliente de - a la página web, y poder interactuar, todo ello de manera "dinámica", quiero decir, sin que esté continuamente recargándose la página.

Lo que he mirado para saber cómo va un poco es CGI (utilizo shell scripting, dudo que pueda meterle intérprete de Perl por temas de espacio, y quizá lo acabe haciendo en C, ya veré), HTML (no sabía prácticamente nada de él) y JavaScript (cosas molonas permite), pero no veo la manera de comunicarlos, ni de hacer cosas que me sean realmente útiles.

Siento el tostoncillo, que además seguro que tira a alguno hacia atrás, pero os agradezco infinito vuestra ayudica.

Saludos

Nathrezim
26/11/2009, 17:53
Hola gente:

Veréis, ando metido en un proyectito (el PFC) en el que me encuentro ante la posibilidad de utilizar una interfaz web para darle un aspecto gráfico a algo que de otra manera debiera hacer por consola (o con un cliente gráfico externo, realizado con "otro lenguaje"). El caso es que mis andanzas en el mundo de la programación web han empezado hace dos días, y aún no tengo claro qué sería lo mejor para mi proyecto. Os explico, y si podéis, me dáis alguna idea, pauta, ejemplo, código utilizable... yo que sé.

Tengo un robotito a controlar desde un router corriendo OpenWRT. Sobre OpenWRT está corriendo Player (http://playerstage.sourceforge.net/). El tema está en que tiene una filosofía cliente-servidor, el servidor corre sobre el router, y quiero hacer que el cliente corra sobre él también, pero no sé cómo hacer que se comunique con el navegador. Tengo algo funcionando con CGIs e idea de cómo tirar hacia allí, pero recargando la página web continuamente. Me gustaría hacer algo que recibiese y enviase datos a - del cliente de - a la página web, y poder interactuar, todo ello de manera "dinámica", quiero decir, sin que esté continuamente recargándose la página.

Lo que he mirado para saber cómo va un poco es CGI (utilizo shell scripting, dudo que pueda meterle intérprete de Perl por temas de espacio, y quizá lo acabe haciendo en C, ya veré), HTML (no sabía prácticamente nada de él) y JavaScript (cosas molonas permite), pero no veo la manera de comunicarlos, ni de hacer cosas que me sean realmente útiles.

Siento el tostoncillo, que además seguro que tira a alguno hacia atrás, pero os agradezco infinito vuestra ayudica.

Saludos

¿Has probado con AJAX? seguro que se puede hacer lo que quieres.

Si quieres seguir con la recarga de la página puedes jugar con el timeout del navegador y secuestrar la petición http y contestar o bien cuando tengas información nueva que mostrar o contestar con la misma página justo antes del time out del navegador, por supuesto la pagina tiene que autorecargarse siempre pero te ahorras un montón de recargas. Yo estuve haciendo algo parecido para teléfonos móviles, que no tienen AJAX y por eso lo desarrollamos de esta manera, pero en mi caso lo hacía en Java.

^MiSaTo^
26/11/2009, 18:52
Venía a decir lo mismo, usa AJAX. Sino a las malas PHP.
Java yo lo descartaría porque tendrás que instalar tomcat o similar.

Nathrezim
26/11/2009, 19:35
Venía a decir lo mismo, usa AJAX. Sino a las malas PHP.
Java yo lo descartaría porque tendrás que instalar tomcat o similar.

Pero no necesitas Java para nada, con tener una librería capaz de crear hilos de ejecución vale cualquier lenguaje, lo único que tienes que hacer es parar el hilo que sirve la petición bien hasta que salte un timeout o hasta que reciba el evento de que ha cambiado la página y entonces crear la página con la info que vayas a mostrar y mandarla.

Que quede claro que esto es una ñapa, si el navegador que vas a utilizar no soporta AJAX o bien estas tan pillado de tiempo que no puedes aprenderlo te puede sacar del apuro.

^MiSaTo^
26/11/2009, 19:43
Pero no necesitas Java para nada, con tener una librería capaz de crear hilos de ejecución vale cualquier lenguaje, lo único que tienes que hacer es parar el hilo que sirve la petición bien hasta que salte un timeout o hasta que reciba el evento de que ha cambiado la página y entonces crear la página con la info que vayas a mostrar y mandarla.

Que quede claro que esto es una ñapa, si el navegador que vas a utilizar no soporta AJAX o bien estas tan pillado de tiempo que no puedes aprenderlo te puede sacar del apuro.

Pero si yo no he dicho que necesite java, más bien al contrario xDDDDDDD
Lo decía porque él lo dijo en su primer post ;)

Nathrezim
26/11/2009, 19:53
Pero si yo no he dicho que necesite java, más bien al contrario xDDDDDDD
Lo decía porque él lo dijo en su primer post ;)

Teniendo que correr sobre un router es posible que ni siquiera haya máquina Java compilada para él y si la hubiera no creo que corriera mucho :brindis:

En phyton heredando de httpServer seguro que se hace rápido.

^MiSaTo^
26/11/2009, 20:03
Teniendo que correr sobre un router es posible que ni siquiera haya máquina Java compilada para él y si la hubiera no creo que corriera mucho :brindis:

En phyton heredando de httpServer seguro que se hace rápido.

pues por eso le recomendé AJAX o php ;)

^MiSaTo^
26/11/2009, 20:38
O AJAX con PHP, que de ahi que le dijera en el mensaje que primero lea sobre como funciona HTTP y las peticiones básicas GET y POST (para entender bien AJAX), y saber si OpenWRT soporta PHP, es una combinación muy rápida y versátil, a parte de tener documentación en mil sitios.

completamente de acuerdo :brindis:

3L_S4N70
26/11/2009, 21:05
Hola peña, gracias por vuestros comentarios. Veamos, así rápido, Python no me cabe. Respecto a PHP, se puede meter, pero tendría que ver si me cabe (diría que sí, pero tengo que mirarlo con detenimiento).
Miraré por tanto el tema del PHP.
Respecto al Ajax, no lo conocía, ¿necesita algo en el servidor, o viene a ser PHP? No me aclaro mucho.

De todas maneras, tengo que echarle luego un vistazo con detenimiento al tema de PHP, pero seguiré atento a vuestros comentarios.

De nuevo, mil gracias.

xzakox
26/11/2009, 21:36
La cuestión del AJAX es que el intercambio de datos entre cliente (el navegador donde se ejecuta el javascript y hace de interfaz) y el servidor (programado en lo que quieras), es a través de XML, y claro, ahi te meterias en generar XML para el intercambio de datos, que bueno, desde C, hay librerias bastante buenas, pero igual es mucho lio para lo que necesitas.
Igual simplemente con javascript y unas peticiones de sockets a tu servidor de datos del robot... ya te valdria, algo mas "custom" y simple.
Pero bueno, la verdad es que si puedes hacerlo con AJAX, te ahorras mucho curro, ya que los componentes visuales (lo que quieras para tu interfaz), tienes a montones libres en internet, y documentación ni te cuento..

akualung
26/11/2009, 21:39
AJAX es una tecnología para recargar porciones de páginas usando peticiones asincronas, y refrescando solo el fragmento necesario, todo funciona en base a JavaScript, la gracia está en que aparentemente, sin abandonar la página principal de tu aplicacion web, puedes estar refrescando continuamente la información que muestra cualquier elemento (normalmente DIVs), el servidor web es independiente de esta tecnología, el que debe soportarlo es el navegador cliente.

Si no quieres perder mucho tiempo profundizando en el tema (totalmente recomendable aprenderlo por el simple hecho de saber como rula), puedes bajarte la libreria prototype.js y tienes funcionando una página con soporte AJAX en 2 minutos.

Perdón a todos por la "intrusión", jeje. Una pregunta, civantoz. Exactamente qué significa eso de "petición asíncrona"? alguna vez, en mi último curro, usé algo de ajax (cosas muy concretas que ya tenian ellos hechas para su framework y básicamente yo solo tenia que copiar y pegar y adaptarlo un pelín). Pero nunca acabé de entender lo de asíncrono (obviamente, sé lo que significa la palabra, pero no el contexto en el que la usan).

Y complementando tu explicación, si no lo entendí mal: una vez tienes los datos que has pedido al servidor mediante ajax, con el javascript modificas el dom de la página html y actualizas la/s etiqueta/s que sea necesario con esos datos. Y todo sin que la página se tenga que recargar. Viene a ser eso, no?

akualung
26/11/2009, 23:16
Pues yo por asíncrono entiendo que no es directa la relación de cargas completas de la página (entendiendo como carga completa la petición, por norma general un GET, al "index" que imprime todo el contenido desde el principio, por poner un ejemplo), con el número de peticiones que se hacen de fondo para actualizar los elementos que esta contiene durante su funcionamiento normal. Es lo mismo que he dicho antes pero con otras palabras, no se si te aclaro mucho con esto, sino lo vuelvo a intentar :confused:

Antes venía a ser como una linea de tiempo en la que una peticion consistia en una impresion completa de la página. 1 - 1
Ahora una sola impresión completa en el tiempo, permite multiples peticiones de fondo, que actualizan solo porciones de la página. 1 - N. Y aquí es donde interviene la modificación al vuelo del DOM, por parte de tu navegador una vez obtenido el resultado de la petición asíncrona.

<->

Encontré el diagrama que se suele usar en toda introducción AJAX xD

http://www.webtaller.com/images/contenidos/articulos/usabilidad_ajax1.png

Vamos, que con ajax las peticiones de datos al servidor van un poco como "en paralelo" a la actividad del usuario, de modo que puedes seguir interactuando, mientras que con el anterior modelo, para cada petición que hacias, te tenias que esperar a que el servidor te sirviera de nuevo la página con las modificaciones necesarias, no?

3L_S4N70
27/11/2009, 01:51
Mi gozo en un pozo, entre el programa del robot y las librerías que necesita (y aligerando cosas que no uso, y que sé que no uso, que hay cosas que desconozco qué son, y prefiero no tocar) me falta bastante espacio para poder meter PHP dentro de La Fonera.
¿Existe la posibilidad de conseguir un efecto similar sólo con JS y CGI? ¿O quizá con alguna otra posibilidad que pase por no tener que instalar o meter nada en el servidor?

Mañana le echaré un último vistazo a ver si me puedo hacer un firmware bien limpito, pero lo dudo (repito que hay numerosas que desconozco qué son, y lo que es peor, otras que deduzco qué son, pero que desconozco si puedo prescindir de ellas).

Buenas noches

Nathrezim
27/11/2009, 08:57
Mi gozo en un pozo, entre el programa del robot y las librerías que necesita (y aligerando cosas que no uso, y que sé que no uso, que hay cosas que desconozco qué son, y prefiero no tocar) me falta bastante espacio para poder meter PHP dentro de La Fonera.
¿Existe la posibilidad de conseguir un efecto similar sólo con JS y CGI? ¿O quizá con alguna otra posibilidad que pase por no tener que instalar o meter nada en el servidor?

Mañana le echaré un último vistazo a ver si me puedo hacer un firmware bien limpito, pero lo dudo (repito que hay numerosas que desconozco qué son, y lo que es peor, otras que deduzco qué son, pero que desconozco si puedo prescindir de ellas).

Buenas noches

Puedes hacerlo sin PHP, con dos scripts, el primero que te devuelva la página estática con el código javascript y lo que no vaya a cambiar, el segundo que te devuelva únicamente los datos que vayan a cambiar del robot formateados en html.

Básicamente tendrías que mandar el siguiente código JavaScript con la petición de la página, dento de la etiqueta head:



<script language="JavaScript">
// Documento JavaScript
// Esta función cargará las paginas
function llamarasincrono (url, id_contenedor)
{
var pagina_requerida = false;
if (window.XMLHttpRequest)
{
// Si es Mozilla, Safari etc
pagina_requerida = new XMLHttpRequest ();
} else if (window.ActiveXObject)
{
// pero si es IE
try
{
pagina_requerida = new ActiveXObject ("Msxml2.XMLHTTP");
}
catch (e)
{
// en caso que sea una versión antigua
try
{
pagina_requerida = new ActiveXObject ("Microsoft.XMLHTTP");
}
catch (e)
{
}
}
}
else
return false;
pagina_requerida.onreadystatechange = function ()
{
// función de respuesta
cargarpagina (pagina_requerida, id_contenedor);
}
pagina_requerida.open ('GET', url, true); // asignamos los métodos open y send
pagina_requerida.send (null);
}
// todo es correcto y ha llegado el momento de poner la información requerida
// en su sitio en la pagina xhtml
function cargarpagina (pagina_requerida, id_contenedor)
{
if (pagina_requerida.readyState == 4 && (pagina_requerida.status == 200 || window.location.href.indexOf ("http") == - 1))
document.getElementById (id_contenedor).innerHTML = pagina_requerida.responseText;
}

</script>


La página debe llamar a la funcion llamarasincrono todo el rato, así que tendrías que usar la función setInterval que llama a otra función cada x milisegundos, la url con la que llamas a la funcion llamarasincrono debe ser la url que devuelve los datos que cambian del robot formateados en html y el id_contenedor es el valor que le hayas dado al atributo id de una etiqueta div del body que devuelvas también con la página estática principal. En teoría debería funcionar y cargarte dentro de ese DIV lo que te devuelva el script de los datos que cambian del robot.

Nathrezim
27/11/2009, 10:00
De hecho está completamente desaconsejado el uso de innerHtml porque no está dentro del estándar, pero para tener algo rápido funcionando sin tener que aprender librerías y demás te saca del apuro, sin tener que pelearte con el DOM. Seguro que con el infierno de controlar al robot no le sobra mucho tiempo libre :brindis:.

Y por cierto, te recomiendo que para desarrollar web lo hagas con firefox y el complemento firebug o con Opera y dragonfly, te ahorrarás muchos quebraderos de cabeza cuando algo no funcione ya que pueden debuguear JavaScript.

xzakox
27/11/2009, 10:07
Pues ya entonces si que se me ocurre usar JAVA. Haces un applet que implemente los controles y los datos que tiene que mostrar, y simplemente abres sockets al router en los puertos que quieras (te programas tu un par de servicios en C muy sencillos, supongo que lo que pretendes será mandar ordenes al robot, y recibir datos del mismo, pues un par de hilos, uno escuchando por las ordenes, y otro esperando que le pidan datos y haces el intercambio usando texto plano, más sencillo imposible). Desde el applet java (que se ejecuta en el navegador del cliente), abres esos sockets e intercambias información, le mandas los comandos y le pides las respuestas.
Asi desde el router solo tienes que servir una página estática con el applet empotrado, y ese par de rutinas en C que se programan en una tarde.
Eso se podría hacer también en Javascript, aunque (creo, que no controlo mucho JS), que JS no tiene sockets nativos, pero si que hay librerias que los implementan. Sería otra solución, sin usar AJAX, simplemente intercambiando los datos en texto plano desde javascript a los servidores que te comenté antes que te programes en C, y modificar la página con el JS (puedes ver ejemplos simples de modificar páginas con JS en los típicos rollover con imágenes y cosas asi).
Ya nos cuentas. :-)

Aiken
27/11/2009, 11:20
AJAX o bien estas tan pillado de tiempo que no puedes aprenderlo

tardas menos en aprender AJAX (5min) que en pensar como hacer cualquier otra ñapa ;)

Aiken

< - >

La cuestión del AJAX es que el intercambio de datos entre cliente (el navegador donde se ejecuta el javascript y hace de interfaz) y el servidor (programado en lo que quieras), es a través de XML,

xml? sera tu libreria, porque lo que es ajax, a el le da igual, el pasa por http lo que tu le pongas, como si le pones un print de tu variable y ya esta.

Aiken

< - >

Pues yo por asíncrono entiendo que no es directa la relación de cargas completas de la página



asincrono es porque tu haces la peticion, y luego defines una funcion (handler) que se ejecutara cuando termine de recibirse los datos sea eso cuando sea, tu programa seguira ejecutando lo siguiente sin esperar, y cuando los datos esten listos te ejecutara el handler que le hayas puesto.

Aiken

< - >

¿Existe la posibilidad de conseguir un efecto similar sólo con JS y CGI?

pero que quieres decir con CGI? un cgi simplemente es un programita que tiene que estar programado en algun lenguaje, que lenguaje es el que tienes?

Si no me equivoco, AJAX son simplemente peticiones http, lo puedes apuntar contra cualquier cosa que se ejecute en un servidor web y devuelva un resultado por http.

Aiken

< - >


Sería otra solución, sin usar AJAX, simplemente intercambiando los datos en texto plano desde javascript a los servidores

puedes usar ajax y pasar los datos en texto plano sin problemas. ajax no requiere nada en el servidor (bueno si un servidor http). ajax es simplemente una libreria en el cliente, que hace llamadas standard http.

Aiken

3L_S4N70
27/11/2009, 13:34
Bueno, veamos, no sé si me aclaro mucho. ¿AJAX requiere tener algo más lejos que soporte CGI en el servidor? Pensé que también requería que el servidor soportase PHP (lo cuál pensando en el dibujo que puso civantoz, no tendría mucha lógica, parece ser todo por parte del cliente).

EDITO: Esto me pasa por leer demasiado rápido, ya he visto que Aiken ha dicho que sólo se requiere por parte del cliente algo adicional.


Respecto a lo del CGI, estaba usando shell scripting (sé que también puedo usar C y Perl, aunque este último me mata otra vez teniendo que instalar cosas en un espacio tan reducido), porque leí que se usaba para comunicar así en profano programas en el servidor con la web. Máso menos de serie, antes de intentar instalar todo lo de PHP que necesita (no terminé, no cupo todo) y con el programa servidor para controlar el robot (los clientes ocupan poquito, y tendría que meter sólo tres o cuatro) tengo unos 2'9 megas de espacio libre. Sobra para meter una web pequeñita, pero si tengo que instalar más cosas, j0dido voy.

Respecto a hacerme un servidor web, el que lleva el bicho de serie, el busybox, lo que es el paquete, ocupa 300K, que no creo que varíe mucho en la máquina, concretamente, recién mirado, el binario ocupa 530.1K, así que no sé si conseguría algo que ocupase menos (que igual sí, sácame del error si acaso).
Respecto al tema de aligerar la imagen de cositas ya lo veo más chungo, porque hay numerosas cosas que no sé si son prescindibles.

Un saludo

xzakox
27/11/2009, 14:18
puedes usar ajax y pasar los datos en texto plano sin problemas. ajax no requiere nada en el servidor (bueno si un servidor http). ajax es simplemente una libreria en el cliente, que hace llamadas standard http.

Aiken

Tienes razón, cuando me puse a mirar AJAX, estaban los puristas de que si se llama AJAX (Asyncronous Javascript and XML), pues el intercambio de datos debe ser en XML, que si no, es AJA xD
Y me quedé con eso, pero si, el XmlHttpRequest le puedes devolver cualquier contenido, texto plano incluido, asi que puede ser lo más sencillo de hacer. Haces peticiones con AJA(x) xD a tus cgi's programados en lo que quieras, que te devuelvan los datos en texto plano y con ellos modificas datos en el xhtml original de la página.
Creo que va a ser lo más rápido, no creo que te cueste más que un dia o dos de ir mirando material de referencia si no sabes javascript.
Mirate esta docu:
http://www.librosweb.es/ajax/
Puedes pasar al capitulo 7 y ver como funciona para que te hagas una idea.

3L_S4N70
27/11/2009, 16:18
Bueno, comento cosas:

Gracias xzakox por el libro ese, ya me alcaro un poquito mejor, aunque tendré que mirarlo con más detenimiento, y experimentar más, pero creo que me soluciona la papeleta por la parte del cliente bastante bien (yo juraría que sí, pero si quien sabe me lo corrobora, con el AJAX puedo perfectamente coger un mosaico de imágenes y actualizarlas en tiempo real, ¿no? Osea, la idea sería por ejemplo lo que ven los sensores de seguimiento de una línea, ponerlo blanco o negro según me diga el programita del robot).

Respecto al servidor web propio, si paso de PHP, no me hace falta (aunque para aprender y para futuros proyectos mola mogollón, seguiré investigando), y seguiré tirando de busybox. El tema es que el que me has pasado como ejemplo del blog ese, civantoz, funciona a las mil maravillas, salvo un detalle: el navegador de symbian60 no es capaz de conectarse con él, salta un error (no he probado más que el mozilla en linux y éste, no está mal, tasa de éxito del 50%, y seguro que el explorer también funciona).

Por tanto, creo que, como decía, tendría la parte del cliente solucionada más o menos (no cantéis victoria, seguro que os doy más el c0ñazo, jeje), pero me encuentro ante otro mundo para mi: ¿cómo comunico el programa que corre en linux con lo que sirvo? ¿Qué utilizo? ¿Alguna función "rara" a utilizar, o tirar de printf en el cliente del robot, y desde otra cosa cojo eso y se lo mando a la web? La verdad, ando un poquito perdido aquí también, así que agradecería infinito vuestra ayudita (y ya siento que realmente sea un poco offtopic, porque no sería programación web propiamente dicha).

Un saludo

xzakox
27/11/2009, 17:06
¿Que datos tienes que intercambiar entre el interfaz y el robot (ordenes, datos de sensores, etc)?

3L_S4N70
27/11/2009, 17:12
Pues mira, el cliente puede enviar los datos como quiera, lo único que tengo que hacer es llamar a las funciones concretas para que se comunique con el servidor. Los datos a recibir pueden ser, por ejemplo, distancia al obstáculo más cercano según el sensor tal. Los datos a enviar, en el caso del programita que le quiero hacer para control en tiempo real (lo interesante es hacer un programa autónomo y monitorizarlo, pero queda más vistoso el control, así que hago de todo, y todos contentos, jaja) serían sencillamente avanzar, retroceder, girar y parar, o sólo avanzar, retroceder y girar, y hacerlo durante un tiempo X, o algo similar (lo tengo que pensar aún cuando vea el cacharro sobre el hardware real).

Vamos, básicamente creo que me valdría con pasar cadenas de texto, o incluso números.

La otra idea que había barajado, pero que no sé si es tan posible, es la de integrar un CGI y un cliente en el mismo programita.

Bueno, arrójame luz, jeje.

xzakox
27/11/2009, 17:37
Claro... es que si es control a tiempo real, no se yo si AJAX será lo mejor, estaríamos hablando de mantener un flujo de datos constante entre cliente y servidor (esto lo digo especulando sobre lo que quieres hacer)...
Mmmm, pues no sé, la ver, el tema es: una máquina empotrada corriendo linux (con busybox) que controla el hardware externo del robot (a través de?), y tienes un programa corriendo capaz de comunicarse con este hardware externo (recibir datos y enviar ordenes de control).
Ahora necesitas un interfaz para controlarlo y recibir información, y quieres que sea a través de web.
¿Correcto? Bien, además... ¿el robot necesita ser controlado por más de un interfaz al mismo tiempo?
Bueno, igualmente, yo creo que implementaria un sistema sencillo.
- Programa de control de hardware del robot, se comunica con el hardware del robot (sensores, motores, etc) y además escucha conexiones en cierto puerto.
- Página estática de control del robot, que sirva un applet java.
- Applet java donde realmente está el interfaz. Este incluye los controles y los visores de datos del robot. Este applet cuando quieras darle una orden al robot, pulsando en un control (botones o lo que sea), mete la orden en una lista de ordenes a enviar. Luego por otro lado, en un thread diferente por ejemplo, se van abriendo sockets hacia el robot (la ip la puedes obtener por varios métodos), en el puerto que está escuchando el primer programa en el router claro. Envia la siguente orden de control de la lista, en texto plano, ej "25:CONTROL:IZQ", el programa que está corriendo en el router, parsea ese texto recibido, ve que es una orden de control con un ID (25), la ejecuta (mueve los motores por ejemplo) y devuelve un "25:OK" indicando que se completó esa operación. El applet java analiza el texto recibido, ve que la operación 25 se completó, pues la quita de la lista a realizar. Si no recibe respuesta, (defines un timeout), o si da error, se vuelve a intentar (yo la meteria al final de la lista, para que pueda hacer otras cosas mientras, no vaya a fallar solo una pieza del hard, y quedarse en bucle intentando eso todo el tiempo).
Luego por otro lado, cada cierto tiempo (ahi ya lo que necesites para mantener actualizados los datos), vas metiendo en la lista ordenes pidiendo información, por ejemplo 48:INFO:sensor1, a lo que el robot responderia con un 48:875 por ejemplo, que podrias mostrar en el control correspondiente.

No se, en mi cabeza tengo claro este diseño, no se si se entiende bien. Además podrias añadir otro ID extra para que varios clientes puedan enviar/recibir info al mismo tiempo y solo hagan caso a las respuestas con ese ID, etc.

Venga, más ideas, que me mola leer lo que harían otros, se aprende un montón xD

3L_S4N70
27/11/2009, 17:46
Bueno, a ver, el servidor (de lo que es el robot) se comunica hacia el cliente por sockets (de ahí que quiera hacer algo en plan que se vea cómo va dentro, y luego para hacer clientes adicionales, hacerlos externos corriendo en el ordenador o máquina que sea del que se conecte), y con el HW del robot por puerto serie (protocolo ARCOS).

Problema: las librerías que manejo de comunicación entre el servdiro y el cliente (del robot) están en C (y C++ y Python) y claro, yo estoy usando C, así que al no tener librerías de JAVA, tendría que hacer en JAVA el que se comunica con el cliente y con el navegador, y en C el cliente en sí. Por otra parte, creo que no tiene máuqina JAVA el router, y con el servidor del robot, tampoco espacio.

Y por último, no me haría falta recibir ACK desde el cliente (creo yo), sólo con recibir el dato a representar, o enviarle la acción a realizar, valdría (que se encargue ARCOS de hacerlo todo). No sé si se ve por dónde voy. Si hace falta que especifique algo más, yo especifico, jeje.

Un saludete

xzakox
27/11/2009, 18:07
B
Problema: las librerías que manejo de comunicación entre el servdiro y el cliente (del robot) están en C (y C++ y Python) y claro, yo estoy usando C, así que al no tener librerías de JAVA, tendría que hacer en JAVA el que se comunica con el cliente y con el navegador, y en C el cliente en sí. Por otra parte, creo que no tiene máuqina JAVA el router, y con el servidor del robot, tampoco espacio.


Las applets java se ejecutan en el navegador del cliente, no en el servidor, tu solo tienes que hacer una página web estática con el applet empotrado, el navegador se lo descarga y lo ejecuta el.
Y luego intercambias datos a través de sockets, no tienes porque usar ninguna libreria.
No se si me explico:




HW-Robot <-- ARCOS --> ROUTER <--- SOCKETS ---> APPLET (en navegador)

3L_S4N70
28/11/2009, 02:28
Creo que te pillo más o menos. El tema está en que eso requiere máquinones, ¿no? Quiero decir, un móvil con symbian, o peor, un móvil con un navegador J2ME, no van a poder correr eso, ¿no? Es un mal menor, no es requisito (de hecho, la propia interfaz web es cosa mía, así que lo que haga, bien estará).

Por otra parte, aún necesitaría la historia de como hacer que el router envíe esos datos (o eso, o no me he enterado del todo de tu solución).

Buenas noches

3L_S4N70
01/12/2009, 23:19
Estoy de vuelta.
Tras darle vueltas y vueltas al tema, me he decantado por la opción siguiente:
En el servidor (el router) los programas cliente los he puesto como CGI (aunque también pudiera haberlos llamado desde un CGI), por lo que los ejecutaré al realizar algun evento (supongo que pondré un botón, es lo que estoy utilizando para las pruebas).
Por la parte de la web, me decanto por AJAX, pero estoy muy verde. Es por ello que vengo de nuevo a pedir ayuda (aún estoy a tiempo de utilizar otro método, pero éste me parece el más universal, para abarcar al máximo de navegadores y plataformas, y sin tener que instalar más cosas en La Fonera, como por ejemplo, php).

Veamos, al lío: ¿cómo puedo hacer que me aparezcan en "tiempo real" los printf que me escupe el CGI? Lo máximo que he conseguido es que me escupa el primero, y cuando hago cascar al programa servidor, me escupe todas las demas. La idea también es utilizar los printf's para hacer un gráfico, vamos, para actuar sobre imágenes en función de los datos escupidos (por ejemplo, si me escupe el estado de dos sensores en la parte inferior para ver si es negro o reflectante el suelo, hacer una especie de dibujo de lo que está viend el bicho en ese momento). ¿Eso es posible? Yo creo que sí, pero no estoy ya seguro de nada, no termino de aclararme bien, jaja.

Se agradece vuestra ayuda. Un saludo

< - >
Ehm, un :arriba:eillo, que necesito un cable.

3L_S4N70
02/12/2009, 16:12
Hola civantoz.
Mil gracias por los enlaces. Lo único, no termino de comprender mucho cómo usarlo. También te agradecería que me explicases con una explicación para profanos lo que me has contado en tu último post. Yo seguiré leyendo para ir aclarándome.

Un saludo

Nathrezim
02/12/2009, 19:13
Buenas, lo primero que tienes que hacer es descargarte la biblioteca y almacenarla en el servidor, además debes servirla como fichero estático para que puedas acceder a ella desde una URL.

Para poder llamar a la biblioteca desde una página web que sirvas primero tienes que "enlazar" esa biblioteca, para hacerlo dentro del head tienes que tener una etiqueta tal que así:


<script language="JavaScript" src ="prototype.js"> </script>

Donde el valor de src es el recurso donde sirves la biblioteca.

Luego solamente tienes que usar la biblioteca como te ha dicho Civantoz, asegúrate que la URL que le pasas como parámetro al updater es la que enlaza al shell script que devuelve los datos dinámicos, por que lo estabas haciendo en shell script no?.

3L_S4N70
02/12/2009, 20:08
No, al final me decanté por utilizar los CGI en C, por eso de que compilo el programilla cliente como CGI, aunque quizá utilice algo de shell por ahí, no sé.
El tema respecto a "include" ese de AJAX es que no sé muy bien qué utilizar, y tampoco me aclaro muy bien con lo que me comentó civantoz respecto al index y esas cosillas. Lo malo es que llevo menos de una semana con ello, y tampoco he podido dedicarle un tiempo excesivo, por lo que no termino de enterarme muy bien por dónde me da el aire con todo el tinglado.

3L_S4N70
03/12/2009, 16:30
Jajaja, Robotin feliz. Oye civantoz, muchas gracias por el ejemplo, pero tengo aún dos pequeños problemas. Uno es el tema de cómo coger los datos del CGI, que en principio me va a enviar como printf, y como me los escupe a capó, no sé qué narices hacer con ellos.
El otro, y más grave en este mismo instante, es que el tema de los alert lo tengo más que mascadito (en cuanto me aprendí lo del alert, a cada prueba alert que te crió, un cachondeo, jaja) pero mi problema es que no sé cómo actualizar de manera automática y dinámica una porción de una página web, es decir, por ejemplo, que me escupa los printf a la manera que lo haría la consola. Es lo que me está volviendo loco, sé (o al menos creo) que con eso ya podré escupirlos tal cual, o utilizarlos para escupir imágenes en función de lo que ponga, etc.

Agradezco cualquier consejo, sugerencia, idea, ayuda que me brindéis, aunque entiendo que estéis ya un poquito hasta la p0lla (con perdón) de mis dudas.



EDITO: Se me olvidaba comentar que como no puedo usar PHP, porque no me cabe en el servidor, sencillamente el index lo he llamado de index.php a index.html. También he cambiado las rutas para que pensa todo desde el directorio raíz, y no de la carpeta test.




< - >



Actualización: Ya he conseguido cambiar algo dinámicamente, pero sigo siendo incapaz de cambiar lo que quisiera.

Ya sé cómo se cambia el título de la página dinámicamente con el PeriodicalUpdater de Ajax (del prototypes, vaya), pero estoy empezando a creer que lo que yo quiero hacer no es posible, o no como lo estoy enfoncando:

- tener por ejemplo el título y el cuerpo de la página,

- y cambiar sólo datos en el cuerpo y dejar el título intacto,

- que estos datos cambien segun cambie su origen (por ejemplo, en un random, cada vez que el número aleatorio cambie, sea representado),

- y sin necesidad de recargar la página completa.

- Y a poder ser sin utilizar "frames", que no rulan en navegadores de móviles.

¿Me he columpiado mucho? ¿Puede alguien pararme que como me columpie más me doy la vuelta completa? Bueno, ya desvarío, y no saco mucho en claro.

xzakox
03/12/2009, 17:10
Mira por ejemplo, haciendolo muy sencillo, despues de importar el prototype.js te creas un periodicalUpdate tal que asi:


new Ajax.PeriodicalUpdater('sensor1data', '/sensor1data.cgi', {
method: 'get', frequency: 3, decay: 1
});
Que cada 3 segundos (el decay es multiplicador del retraso, ta en la documentacion) hace una petición a la url "/sensor1data.cgi" y actualiza el objeto del DOM llamado "sensor1data" con la respuesta que le devuelva la peticion.

Entonces en tu html, defines un por ejemplo :


Sensor1: <span id="sensor1data"></span>
Y el periodicalUpdater te añadiria el texto de la respuesta entre esos tags cada dos segundos.

Sencillo no?

Todo eso basado en las peticiones que hace el JavaScript, no necesitas actualizar.
Por supuesto nada de frames, no es que no los soporten los navegadores de móviles, es que deberian ser erradicados (de hecho lo están en las nuevas versiones de xhtml) xD

3L_S4N70
04/12/2009, 15:46
Hola gente, voy cazando el tema este. Ahora bien, sigo teniendo un problemilla: con la que uso ahora, es decir, el programa cliente como CGI, si utilizo el periodical updater tal cual me proponéis, sólo puedo actualizar una variable, y no varias. El tema además está en que a mi no me interesa lanzar el CGI cada vez, ya que la idea es que quede ejecutándose de manera "residente", por lo que no hay que llamarlo cada vez, ya está. Entonces, ¿cómo narices lo enfoco? Podría ser lanzando un shell script como CGI que me coja el valor de tal variable que diga el programita cliente, pero desconozco cómo, y si acaso se puede, hacer eso.

Voy a seguir jugando con el tema.

3L_S4N70
04/12/2009, 16:13
Vale, entonces, ¿sería posible de alguna manera coger los datos que me envía una aplicación corriendo en el servidor de continuo? Quizá, con algo lanzado con el periodical updater. Quizá con un evento producido por la variación de tal variable por parte del programa. Sinceramente, no sé cómo enfocarlo, no sé si es posible lo que quiero con los recursos limitados de los que dispongo.

3L_S4N70
05/12/2009, 17:49
Sinceramente, no sé si serviría, tengo que meterme con JAVA, y después ya seré capaz de saber si sirve, jeje.
Fuera coña, mil gracias.

No obstante, en la línea que estoy siguiendo, me pregunto una cosa, para gurús de Linux: ¿Es posible comunicar un proceso que está corriendo en el servidor con un shell script al que se le llama de vez en cuando? ¿Osea, pedirle el valor de una variable, o algo por el estilo? Con ello podría conseguir tener el cliente corriendo continuamente, y con el periodical updater llamar al (o a los) CGI hecho con shell scripting, y que me actualice tal variable, y tal.

Si no es posible esto que comento, tiraré hacia otro lado (osea, lo que comenta civantoz, dejar comunicación abierta con JAVA) En el caso de lo del JAVA, ¿necesito instalar algo en el servidor?

Gracias

^MiSaTo^
05/12/2009, 18:01
Si no es posible esto que comento, tiraré hacia otro lado (osea, lo que comenta civantoz, dejar comunicación abierta con JAVA) En el caso de lo del JAVA, ¿necesito instalar algo en el servidor?

Gracias

Necesitas tomcat, o JBoss, o el que sea, pero no te vale con un apache a pelo. Si vas a usar tomcat necesitas también el conector con el apache.
Es un poco infiernillo que funcione bien al principio, te aviso. Si quieres te echo una manilla con eso que de eso si se xD

3L_S4N70
06/12/2009, 13:51
Necesitas tomcat, o JBoss, o el que sea, pero no te vale con un apache a pelo. Si vas a usar tomcat necesitas también el conector con el apache.
Es un poco infiernillo que funcione bien al principio, te aviso. Si quieres te echo una manilla con eso que de eso si se xD

Gracias por la proposición de ayuda. Bua, el problema es que el servidor anda muy mal de espacio, por eso preguntaba lo de tener que meter algo en el servidor, que no podría. Tengo menos de 3 megas para todo el tema web, 3'5 megas si quito el Busybox (el servidor que lleva) para meter otro.

Por otro lado, no sé cómo se hace, lo tengo un poco difuso y lejano, pero, ¿no hay algo llamado algo así como tuberías, que permitan abrir un canal entre un programita corriendo en la máquina, y cualquier otra cosa? Por ejemplo, que otro programa, o un shell script, o a pelo desde la consola a mano, y permita recoger un dato o cosas así. No sé, hablo de un recuerdo difuso que tengo, pero es que no sabría ni cómo buscar si quiera, jaja.

Un saludo.

xzakox
06/12/2009, 20:41
No a ver, no necesitas JBOSS ni Tomcat para correr applets joer, eso es pa aplicaciones web java que se ejecutan en el server, lo que necesitas es programar el applet (que puede abrir sockets tcp sin problema) y conectarlo por sockets tcp a un programita hecho en C en el router que mande esos datos cuando el applet se conecte con él.

^MiSaTo^
06/12/2009, 20:54
No a ver, no necesitas JBOSS ni Tomcat para correr applets joer, eso es pa aplicaciones web java que se ejecutan en el server, lo que necesitas es programar el applet (que puede abrir sockets tcp sin problema) y conectarlo por sockets tcp a un programita hecho en C en el router que mande esos datos cuando el applet se conecte con él.

Se me ha ido la olla xDD Si va a programar un applet entonces claro que no hace falta.
Esque pensé que iba a hacer algo con jsp o similar ;)

3L_S4N70
08/12/2009, 11:47
Vale, definitivamente estoy perdido en esto último. Si hago algo en JAVA, ¿sencillamente lo escribo, sin tener que compilarlo, y ello se ejecuta en la máquina cliente, o tiene aue hacerese para el S.O. concreto, y compilarlo y tal?

Estoy buscando la manera de conseguir ese efecto pero dentro del servidor, para servir una web lo más tonta posible. Lo único que se me ha ocurrido es redireccionar cositas a ficheros, y de ficheros con un shell script como CGI leer tales ficheros y coger los datos para usarlos en la web, cogiéndolos por ejemplo periodicamente con el periodical updater. ¿Qué os parece? ¿Alguna manera menos marrana? ¿Esto funcionará (aún me estoy empapando de redirecciones y comandos que me lo hagan posible)? ¿Sugerencias?

Bueno ahí quedan esas dos líneas de investigación.

Un saludo

3L_S4N70
09/12/2009, 17:06
J0der, no hay manera, no avanzo nada con las tuberías y los cgi's. Estoy considerando dejar lo de la web...

Si a alguien se le ocurre una manera más o menos sencilla y más o menos rápida de conseguir algo similar a lo que voy buscando, le agradeceré infinito la idea. Mi único problemón es la falta de espacio para instalar más cosas (por ejemplo, PHP) en el router.

Mil gracias.

3L_S4N70
09/12/2009, 20:21
Bueno, pues entonces intentaré pasar al tema JAVA. No era mi idea inicial, pero bueno, si me sirve más o menos, quizá pueda tirar por ahí. De todas maneras, ¿alguien ha probado alguna vez el tema de sockets con Javascript? Es que me da la sensación de que sea más embolado que hacerlo con JAVA, pero más compatible (o quizá no).

Después por el otro lado no tendría más que conectarme con la apliación hecha en C. Eso sí quiero preguntar primero: ¿dependería de la IP el socket? Quiero decir, me gustaría la posibilidad de servir la página como una URL (quizá con un sevicio no-ip) y por tanto, sería interesante no depender de tener que andar metiendo la IP desde la app JAVA (o JS o como acabe siendo según el párrafo anterior), sino que la cogiese automáticamente (porque ya sabe desde dónde es servida). No sé si me he explicado.

Un saludo

3L_S4N70
09/12/2009, 20:55
Gracias por tu respuesta. La diferencia la veo, sólo que con Javascript no tiene que aceptar nada el cliente, y además es lo que más o menos voy entendiendo, jeje.

Has sido claro, y entiendo todo lo que me comentas (salvo lo del NAT, pero no estoy especialmente puesto en redes, así que llegado el momento, ya veré si hago el tinglado de ponerlo accesible al mundo o sólo con conexión ADHOC, que me será mucho más fácil...)

El problema que veo es que los applets hay que compilarlos para convertirlos en class, y que puedan ser interpretados en el navegador, ¿no? Osease, eso requiere que me instale un entorno JAVA, lo cuál me complica un poco la historia. Corrígeme si me equivoco, please.

3L_S4N70
09/12/2009, 21:24
Lo del NAT lo tengo ya verde, jeje. Pero será cuestión de juguetear un poco.

Para lo del JAVA, entonces hago llamamiento a algún gurú del tema.

Muchas gracias civantoz.

3L_S4N70
12/12/2009, 13:01
Reenfocando: puedo usar la fuerza bruta de un PC. He hablando con mi tutor, y me ha sugerido utilizar un PC para gobernarlos a todos (XD), luego la Web puede correr sobre un bestiajo (comparado con el router, casi un 386 es un bestiajo, jeje), por lo que puedo utilizar los recursos que existan para ello. Además, eso creo yo que me permitiría tener la Web bastante estándar, dejando recaer todo el trabajo sobre el servidor (que ahora es un PC), y por tanto pudiendo hacer que la gran mayoría de navegadores (incluidos los móviles) puediesen acceder a los bichejos (serían varios conectados al servidor).


Las ideas que tengo:

- cada routercillo corre con su servidor del robot (el Player, que corre sobre un puerto, y al que uno se conecta) con el puerto predefinido, y por tanto, para elegir cada robot, se elige igual por un número, pero eso quiere decir que estás lanzando en el PC el cliente con el puerto tal, ¿me explico? (Y ahora sí, tendré que tirar del NAT que me comentabas sí o sí, civantoz)

- Después, cada programa tendría su visión gráfica (como voy a poner ejemplos, el que quiera hacerse un nuevo programa, que se programa su parte visual también). Con visión gráfica me refiero, por ejemplo, en un siguelíneas, lo que ve cada sensor. Si a alguien se le ocurre hacer esto de una manera más sencilla para "expandir" que por favor me la comunique.


De momento, con eso voy. La sugerencia del profesor, es usar PHP, que ya me lo habíais sugerido antes, y ahora cabe. Si a alguien se le ocurre alguna cosilla mejor, ahora que puedo explayarme, que lo diga, o calle para siempre.

Creo que no me dejo nada en el tintero de momento (aunque me da la sensación de que se me olvida algo, pero no sé qué, de lo que tengo apuntado, ná. Ya volveré a llorar un poco más cuando me acuerde).


Venga, mil gracias por ir aguantándome en esta andada. Saludos

3L_S4N70
14/12/2009, 12:18
Vale, vuelvo a la carga. La idea de xzakox con el JAVA y los sockets es viable, pero falla en el detalle de que es menos compatible con navegadores "humildes" (ahora que si no hay otra solución, que les den a los navegadores humildes).

Mi idea es a ver de qué manera puedo hacer algo similar, pero que en lugar de ocurrir en el cliente (navegador) ocurra en el servidor (que como ya comenté, ya no es el router, ahora es un PC). Es decir, el router corre el servidor del programa Player (el de robótica). En el PC servidor web corre el cliente del programa Player, que se comunica con el propio programa servidor (o como sea), y este a su vez sirve una web. A través de internet esa página es servida, sencilla, pero que integra el control y el mostrado de datos del robot (trabajo sucio hecho por el servidor web).

No sé si me explicao, si no, lo vuelvo a contar, jeje.

Un saludo y gracias

xzakox
14/12/2009, 12:25
Si, perfectamente, pero igualmente tienes el mismo problema.
Si desde la web quieres mostrar los datos en tiempo real, que se actualizen solos, pues necesitas algo más que lo que programes del lado del servidor (ya que el servidor puede hacer la p0lla en verso, pero necesita que le hagas una petición para mostrartelo). Asi que igualmente tendrias que meter javascript(ajax) en la web. Asi que en navegadores muy humildes (móviles normales?) olvidate de que funcione.
Pero a ver, es el tema, estás hablando de una aplicación web de control de un robot en tiempo real, normal que las especificaciones del cliente sean las necesarias a la tarea.
Si quisieras poder controlarlo desde un móvil, podrias aparte programar una app en j2me que se conecte directamente con sockets y demás al robot.

3L_S4N70
14/12/2009, 12:33
Sí, ya habñia caído en eso. Con navegadores más humildes me voy a cosas pequeñas pero potentes, navegadores de Symbian, iPhone y/o Android.

No obstante, si hay que pasar de ellos, se pasa, no me produce pena, esto es para lo que es (como bien dices).

Yo contaba con la idea de utilizar el PeriodicalUpdater para actualizar los datos en la web (o alguna idea del estilo), de tal manera que sigue quedando poco pesada (con respecto a utilizar JAVA). El problema que tengo es para actualizar tales datos, que no sé cómo hacerlo. Un CGI con el PeriodicalUpdater sólo actualiza una variable. Quizá pueda poner varios CGIs para varias variables (esto habría que verlo) pero surge otro problema: al menos en el router, si con un CGI llamaba a un shell script que a su vez llamaba al programita, el CGI esperaba a que todo acabase (o esa sensación me daba). Total, que la página se quedaba todo el rato cargando. ¿Se ve por dónde voy? Eso es lo que más me frustró en su momento. Alternativas a eso, o eso bien hecho (lo más probable es que algo hiciera mal).

3L_S4N70
14/12/2009, 13:20
Seguramente el problema sea que no conozco todo el potencial del CGI. El tema es que yo tengo el cliente (del robot) en C, que me escupe printf's, con información relevante e irrelevante (vamos, cosas como conectando, que son de relevancia relativa, y cosas como distancia = 10, que son más relevantes). Lo que no termino de ver es cómo narices le pido esos datos, ni tan siquiera cómo lanzar el programa cliente sin que me deje la página clavada esperando que termine el programa.
Venga, decidme ahora: estás haciendo esto mal, tendrías que haberte leído esto otro, etc. que me lo merezco XD Pero es que no sé muy bien por donde tirar.

3L_S4N70
15/12/2009, 11:05
Dos cosillas, la una entiendo que más sencilla, aunque se me escapa: en el CGI, ¿he de definir aquello que le puedo pedir (si está hecho en C) como parámetros que le pueden ser enviados? ¿Y si es en shell o Perl?

Esta última pregunta va en relación a lo siguiente: veo lo del CGI para la petición o envío de las variables que sean (bueno, para el envío, le tengo que dar una pensada), pero el problema está en que el CGI tiene una vida efímera, dura lo que tarda en dar el dato pedido o lo que sea, luego no puede ser el programa cliente, que ha de estar corriendo todo el rato. Entonces, ¿cómo envío/recibo datos entre el CGI y el cliente programado en C?

Gracias por el ejemplo.

< - >
Hago un pequeño :arriba:, porque lo que me da verdaderos quebraderos de cabeza es el cómo comunicar los datos del cliente (del programa de robótica) programado en C con la web servida (todo en el servidor mejor que en el cliente, osea, sin usar sockets y JAVA).

Un saludo y gracias de antemano

xzakox
15/12/2009, 14:18
Te voy a poner un ejemplo de Ajax completo, pa que veas un poco como iria.

Primero el CGI, pa linux, en C, muy simple:



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

int main() {
time_t mi_time;

mi_time = time(NULL);

printf("Content-Type: text/plain;charset=us-ascii\n\n");
printf("Hora actual: %s", ctime(&mi_time));

return 0;
}
Lo compilas con gcc -o prueba prueba.c y metes el binario "prueba" en tu /cgi-bin y puedes probar que funcione haciendo peticiones al server en /cgi-bin/prueba
Como ves, para ver la hora actualizada, tienes que ir haciendo peticiones (recargando la página). Bien , esto es lo que javascript y Ajax, nos van a ayudar a hacer.

Bien, te bajas la libreria prototype.js (http://www.prototypejs.org/assets/2008/9/29/prototype-1.6.0.3.js), la renombras como prototype.js (por comodidad) y la metes en tu /var/www.
Ahora creas una página html en /var/www con este contenido:


<html>
<head>
<title> prueba ajax </title>
<script type="text/javascript" src="prototype.js"></script>
<script type="text/javascript">
new Ajax.PeriodicalUpdater('lahora', '/cgi-bin/prueba', {
method: 'get',
frequency: 1,
decay: 1
});
</script>

</head>

<body>
<h1> WOOOO Ajax Pino!!</h1>

<p> La hora actual es: </p>

<div id="lahora">
</div>

<p> Esto es la p00llah! </p>
</body>
</html>
Prueba a cargar la web. Ueee un reloj Ajax, IMPRESIONANTE! xD

Bien, el asunto está en el script, que crea un PeriodicalUpdater de prototype, que lo que hace es cada cierto tiempo (le decimos un segundo con el parámetro frecuency), hace una petición al servidor en la url que le pasamos (el cgi), y actualiza un objeto del DOM, con la respuesta que recibe del servidor, en este caso, le decimos que actualize el objeto 'mihora', que hemos definido en el html con un div de id="mihora", con el contenido de la petición a /cgi-bin/prueba, nuestro CGI compiladito.
Asi que el Ajax, va haciendo peticiones cada segundo al servidor, y actualiza el DOM del documento cargado autómaticamente.

Creo que puedes tirar por ahi, solo necesitas o bien hacer varios CGI's para cada cosa (que le pidan datos/manden ordenes al robot), o bien hacer uno que acepte parámetros en la petición.
Hay por ahi un montón de tutoriales de CGI en C que te pueden orientar en esto.

3L_S4N70
15/12/2009, 14:51
Hola xzakox.
Mil gracias por el ejemplo, y a riesgo de que me mandes a la mierda, ese es el punto exacto en el que me encuentro estancado hace una semana. Hice un ejemplito que venía a hacer lo mismo, darme la hora, y actualizarse cada segundo con el PeriodicalUpdater.

Mi problema va en el sentido en que un CGI se ejecuta sólo cuando lo llamas, y "para" la web hasta que termina de ejecutarse. Sin embargo, en la parte del robot, que también utiliza una configuración cliente/servidor, el cliente, que es el programa con el que quiero interactuar (y para el que sólo puedo utilizar C, C++ o Python), debe conectarse al servidor del robot, y mantenerse conectado a éste. Por tanto, no puedo hacerlo con un CGI.

Es por ello que mi pregunta va orientada hacia el hecho de comunicar el cliente y supongo que el CGI, para que éste último con su efímera vida le pida los datos al primero, y los actualice para utilizarlos en la web.

Gracias de antemano.

3L_S4N70
15/12/2009, 15:34
Vaya por Dios, ¿no hay nada que haga algo similar pero dentro del servidor? Si hago tanto el CGI como el cliente en C, algo que comunique procesos corriendo en la misma máquina. No sé, alguna cosilla así.

PharaOnyx
15/12/2009, 15:55
Vaya por Dios, ¿no hay nada que haga algo similar pero dentro del servidor? Si hago tanto el CGI como el cliente en C, algo que comunique procesos corriendo en la misma máquina. No sé, alguna cosilla así.
¿PHP no te vale? (no, no me he leído el resto del hilo x'D)

Saludos, Alex

3L_S4N70
15/12/2009, 16:59
Bueno, vale, ya me he aclarado alguna cosilla.

Respecto a lo que dice PharaOnyx, sí, PHP me lo permitiría, creo. Lo había olvidado porque lo descarté obviando el dato actual de que podía usar un PC como servidor, donde me cabe PHP (no como en La Fonera y su limitado espacio).

Respecto a lo que yo quería, hacerlo de la parte del servidor, encontré la manera. Veamos, os comento lo que me joroba de primeras, Player utiliza una configuración de cliente/servidor, pero sólo proporciona oficialmente librerías para C, C++ y Python. Esto está muy bien para hacer clientes dedicados, pero si se quiere hacer vía Web, estaría genial que proporcionasen cositas en Java, JS, o incluso genérico, ya que podrían hacerse los clientes incluso en HTML (con AJAX o las florituras necesarias) sin tener que meterse en los follones que me estoy metiendo yo.
Dicho esto, lo que he encontrado: mkfifo. Me permite hacer una tubería entre procesos. La idea que tengo es hacer una tubería (o varias) de estas desde el cliente (Player), y leerla(s) desde el CGI correspondiente, también programado en C. Algún gurú de Linux que opine o critique el concepto (¿quizá sea momento de abrir un hilo paralelo sobre temas de Linux?).

Un saludo, espero vuestros comentarios, y os mantendré informados cuando me frustre porque no rula.

PharaOnyx
15/12/2009, 22:59
Bueno, vale, ya me he aclarado alguna cosilla.

Respecto a lo que dice PharaOnyx, sí, PHP me lo permitiría, creo. Lo había olvidado porque lo descarté obviando el dato actual de que podía usar un PC como servidor, donde me cabe PHP (no como en La Fonera y su limitado espacio).

Respecto a lo que yo quería, hacerlo de la parte del servidor, encontré la manera. Veamos, os comento lo que me joroba de primeras, Player utiliza una configuración de cliente/servidor, pero sólo proporciona oficialmente librerías para C, C++ y Python. Esto está muy bien para hacer clientes dedicados, pero si se quiere hacer vía Web, estaría genial que proporcionasen cositas en Java, JS, o incluso genérico, ya que podrían hacerse los clientes incluso en HTML (con AJAX o las florituras necesarias) sin tener que meterse en los follones que me estoy metiendo yo.
Dicho esto, lo que he encontrado: mkfifo. Me permite hacer una tubería entre procesos. La idea que tengo es hacer una tubería (o varias) de estas desde el cliente (Player), y leerla(s) desde el CGI correspondiente, también programado en C. Algún gurú de Linux que opine o critique el concepto (¿quizá sea momento de abrir un hilo paralelo sobre temas de Linux?).

Un saludo, espero vuestros comentarios, y os mantendré informados cuando me frustre porque no rula.
Iba a comentar una cosa acerca de librería C y extensiones en tiempo de ejecución para PHP, pero mejor me voy a leer el hilo entero primero x'D

Basándome en ese último post que has puesto, podrías hacer un cliente en AJAX (JavaScript) que se comunique con tu CGI (en PHP), llamando éste a la librería C del chisme en cuestión (extensión en tiempo de ejecución)

Saludos, Alex

pd: cuando me lea el hilo entero edito el post con lo que sea :lol:

3L_S4N70
16/12/2009, 16:01
Jajaja, pues a pesar de los fregaos en los que me veis metido, Ingeniería Electrónica. Sólo que soy de los que piensan que centrarse únicamente en una disciplina no es tan enriquecedor como tocar un poquito de otras. Ayuda también al entendimiento interdisciplinar, que es el presente y más aún el futuro.

PharaOnyx, fáceme un favor, amplíame un poco tu última respuesta, sobre todo eso de comunicar la librería en C y el CGI, extensión en tiempo de ejecución.

Un saludo

PharaOnyx
16/12/2009, 16:38
PharaOnyx, fáceme un favor, amplíame un poco tu última respuesta, sobre todo eso de comunicar la librería en C y el CGI, extensión en tiempo de ejecución.
Yo es que ando un poco perdido con lo que quieres hacer, la verdad x'D

Esta situación es la que yo entiendo:
- una persona se mete en una página web (html)
- esa página web llama a un cgi (php, perl, python, shell scripting)
- ese cgi llama a un cliente hecho en C (c, obviamente x'D)
- ese cliente usa una librería en C para comunicarse con el robot

Si haces el CGI en PHP puedes hacer una extensión en tiempo de ejecución para usar directamente la librería C, es decir, pasar olímpicamente del cliente ese y poder utilizar la funcionalidad de la librería C desde PHP, como si fueran funciones nativas de PHP. Por esta página (http://www.thewhyandthehow.com/building-custom-php-extensions/) explican cómo va el tema. Puede parecer complicado al principio, pero la gran parte de los pasos son automáticos

O si la librería esa tiene soporte para Python, pues un mod_python para Apache y santas pascuas :9

Saludos, Alex

Nathrezim
16/12/2009, 17:01
Bueno, vale, ya me he aclarado alguna cosilla.

Respecto a lo que dice PharaOnyx, sí, PHP me lo permitiría, creo. Lo había olvidado porque lo descarté obviando el dato actual de que podía usar un PC como servidor, donde me cabe PHP (no como en La Fonera y su limitado espacio).

Respecto a lo que yo quería, hacerlo de la parte del servidor, encontré la manera. Veamos, os comento lo que me joroba de primeras, Player utiliza una configuración de cliente/servidor, pero sólo proporciona oficialmente librerías para C, C++ y Python. Esto está muy bien para hacer clientes dedicados, pero si se quiere hacer vía Web, estaría genial que proporcionasen cositas en Java, JS, o incluso genérico, ya que podrían hacerse los clientes incluso en HTML (con AJAX o las florituras necesarias) sin tener que meterse en los follones que me estoy metiendo yo.
Dicho esto, lo que he encontrado: mkfifo. Me permite hacer una tubería entre procesos. La idea que tengo es hacer una tubería (o varias) de estas desde el cliente (Player), y leerla(s) desde el CGI correspondiente, también programado en C. Algún gurú de Linux que opine o critique el concepto (¿quizá sea momento de abrir un hilo paralelo sobre temas de Linux?).

Un saludo, espero vuestros comentarios, y os mantendré informados cuando me frustre porque no rula.

A lo mejor con sockets en C te es más fácil que andar comunicando procesos con mecanismos del S.O. Así tendrías el cliente que escucha a su vez en un puerto determinado en la IP de loopback(127.0.0.1) y el CGI que hace peticiones a esa IP y puerto para mandar o leer datos.

A parte de ser más fácil que las tuberías es más portable al tener librerías de sockets en todos los S.O.

3L_S4N70
16/12/2009, 17:40
@PharaOnyx: ya le estoy echando un vistazo a eso del C en PHP, suena interesante, aunque creo que es demasiado fregado. Además, ahora que vuelvo a ver posibilidades en integrarlo dentro del robot, voy a ver si puedo pasar de cosas que no me quepan como el PHP. No obstante, apreció tu sugerencia, la tendré en cuenta para futuras cosillas (y para conocimiento personal).

@Natzrezim: No lo había considerado, y lo tenía delante de mis narices. De todas maneras, si consigo correrlo sobre el robot (en el router), cliente y servidor correrían sobre la misma máquina, en un puerto determinado en el que estaría escuchando el servidor, y por tanto con la IP de loopback. No debiera existir ningún problema en que el cliente y el CGI se comuniquen en la misma IP en un puerto distinto, ¿verdad?

Voy a ir mirándo lo de los sockets también.

3L_S4N70
03/03/2010, 12:30
Hola gente, os vengo a plantear otra duda: ¿es posible cargar imágenes en una web en relación a lo que te dice un cgi? Tengo un cgi que recibe información de lo que ve el robot (que tiene dos sensores que le sirven para ver si lleva debajo una línea negra o no) y ahora mismo tengo puesto que me dé una salida tal que así (si por ejemplo ve algo en el lado derecho):
_|__|_o_|_

La idea sería eso mismo, pero en lugar de ascii art (llamar q esto ascii art es ser pretencioso, ¿verdad? Jaja); que sea alternando entre dos imágenes, una que sea un cuadro negro, y otra un cuadro blanco. El cgi lo llamo con el Ajax.PeriodicalUpdater que me sugeristéis, con una frecuencia de 10 milisegundos (lo soporta de lujo, yo que pensé que bajar mucho de un segundo lo mataría), y con "get".

Pues eso, a ver si alguien me hace ver un poco la luz, o al menos me guía hacia dónde ir.

Gracias de antemano

xzakox
03/03/2010, 13:26
Pues si, con javascript es bastante sencillo.
Defines un <div id="imagen_cambiante"> donde iria la imagen y nada, luego en ajax recibirias ese texto como dices con el periodical updater, pues lo analizarias para ver que imagen mostrar y luego solo tendrias que hacer algo asi:

if (condicion de la imagen1) {
document.getElementById("imagen_cambiante").innerHTML = "<img src="imagen1.png">";
} else {
document.getElementById("imagen_cambiante").innerHTML = "<img src="imagen2.png">";
}

Algo asi.

3L_S4N70
03/03/2010, 14:28
Gracias xzakox, parece sencillo, luego lo pruebo y si acaso te vuelvo a consultar.

Un saludo

Gammenon
03/03/2010, 14:40
Tira de AJAX, que es javascript. Esto se ejecutara en el navegador, y periodicamente tendra que consultar si hay datos nuevos en el servidor. En el servidor con un fichero php podras crear el xml o lo que sea que trague el AJAX y mostrarlo en pantalla. El chat de gmail por ejemplo lo hace asi.

Puedes usar jQuery, una libreria de javascript, que te facilitara este tema.

3L_S4N70
03/03/2010, 15:01
Gracias Gammenon, le echaré un vistazp al jQuery, aunque la verdad, como lo que necesito es bastante sencillo y poca cosa, tiraré a pelo.

Respecto al PHP, el servidor no tiene espacio sufieciente para meterselo (es una Fonera, un router con muy poquita flash) y como la idea es mantener sencillez y costes bajos, debo prescindir de ponerle un lector de tarjetas de memoria, que sí que me daría el espacio suficiente, y más.

Lo dicho, gracias

Gammenon
03/03/2010, 15:04
Si tan limitado estas, mejor que pases del navegador y te montas un programilla (incluso en consola) que se comunique mediante sockets con el servidor. Si son pocos datos y no hace falta mucha sofisticacion, no necesitas mas :)

3L_S4N70
03/03/2010, 15:08
Ya, en consola está tirado, me conecto por SSH, o si no, desde cualquier máquina que tenga las librerías necesarias para programar clientes para el programa en concreto que corre el servidor. El tema está en que quería dar más facilidad de manejo, haciendo prescindible todo salvo un navegador, de ahí que vaya así. Estoy limitado para instalarme cosas como el soporte PHP (no cabe, ya lo probé), pero alguna imagencilla sí que me cabe. De momento como digo ya tengo un servidor web escupiendo carácteres ascii, pero quería algo más visible.

Bueno, luego, cuando pueda probarlo, os informo. No obstante, cualquier otra sugerencia la podéis seguir dejando aquí.

Un saludo famigos.

3L_S4N70
06/03/2010, 15:55
Pues si, con javascript es bastante sencillo.
Defines un <div id="imagen_cambiante"> donde iria la imagen y nada, luego en ajax recibirias ese texto como dices con el periodical updater, pues lo analizarias para ver que imagen mostrar y luego solo tendrias que hacer algo asi:

if (condicion de la imagen1) {
document.getElementById("imagen_cambiante").innerHTML = "<img src="imagen1.png">";
} else {
document.getElementById("imagen_cambiante").innerHTML = "<img src="imagen2.png">";
}

Algo asi.

Tengo un problema, ¿cómo defino lo que se actualiza con periodicalupdater, para que la condición lo cace?
Si lo defino como var, sin inicializar, y lo veo con alert, me dice que vale undefined. Si le doy un valor (al hacer var), por ejemplo, el que quiero que evalúe en la condición, siempre vale eso, y la condición siempre se cumple.

Tengo algo así:

imagen: <div id="imagen_cambiante"></div>

<script type="text/javascript">
var caca;
new Ajax.PeriodicalUpdater('caca', '/cgi_bin/fifos.cgi', {
method: 'get', frequency: 0.01, decay: 1,
evalScripts: true,
}):

alert(caca);

if (caca == "_|_o_|_o_|_") {
document.getElementById("imagen_cambiante").innerHTML = "<img src="ghost1.png">";
} else {
document.getElementById("imagen_cambiante").innerHTML = "<img src="ghost.png">";
}
</script>

He hecho pruebas mil, pero creo que sencillamente no sé definir la variable a evaluar en la condición para que la actualice periodicalupdater.

Mil gracias de antemano

Gammenon
06/03/2010, 17:26
Aqui


new Ajax.PeriodicalUpdater('caca', '/cgi_bin/fifos.cgi', {
method: 'get', frequency: 0.01, decay: 1,
evalScripts: true,
}):

Para empezar cambia ":" por ";" :)

Con Ajax.PeriodicalUpdater actualizas un container, osea un elemento HTML como puede ser un div, no una variable javascript. Prueba a cambiar 'caca' por 'imagen_cambiante' en la llamada a Ajax.PeriodicalUpdater ;)

3L_S4N70
08/03/2010, 00:52
Para empezar cambia ":" por ";" :)


No te fíes, lo he transcrito del portátil al sobremesa, y me he colado :D




Con Ajax.PeriodicalUpdater actualizas un container, osea un elemento HTML como puede ser un div, no una variable javascript. Prueba a cambiar 'caca' por 'imagen_cambiante' en la llamada a Ajax.PeriodicalUpdater ;)

El tema está en que imagen cambiante es un png, no un texto, no creo que pueda hacer eso. Pero en esa línea, ¿no hay algún elemento, que no sea visible, en HTML, al que poder asignarle el cambio?

¿El if está bien colocado ahí?

Un saludo y mil gracias

Gammenon
08/03/2010, 10:28
Si es cambiar un tag <img> cada cierto tiempo, quizas no necesites ajax y con ir cambiando el atributo "src" del tag te sirva. Usa setInterval() para llamar a una funcion cada tantos milisegundos y dentro de esta funcion cambia el tag src del img. Algo asi:




function updateImg()
{
var img = document.getElementById('dynamicImg');
img.src = '[aqui va la url]';
}

En alguna parte:

setInterval(updateImg, 100); // Cada 100 milisegundos se llamara a updateImg()

Y en otra parte del html:

<img id='dynamicImg' />



No se si funcionara porque igual la cache del navegador hara que no se cargue el nuevo src. Si te pasa esto prueba a fijar antes el src = '', y si esto no te va quizas tengas que destruir y crear el <img> sobre la marcha, que no es dificil. Tambien puedes probar a desactivar la cache del navegador :)

3L_S4N70
08/03/2010, 14:31
Si es cambiar un tag <img> cada cierto tiempo, quizas no necesites ajax y con ir cambiando el atributo "src" del tag te sirva. Usa setInterval() para llamar a una funcion cada tantos milisegundos y dentro de esta funcion cambia el tag src del img. Algo asi:

No se si funcionara porque igual la cache del navegador hara que no se cargue el nuevo src. Si te pasa esto prueba a fijar antes el src = '', y si esto no te va quizas tengas que destruir y crear el <img> sobre la marcha, que no es dificil. Tambien puedes probar a desactivar la cache del navegador :)

Muchas gracias por el ejemplo, pero no me vale, porque yo requiero cambiarlo en función del valor devuelto al llamar a un CGI.
Además, para el tema de la caché, pereferiría que cualquier movida la hiciese el servidor (o la web tal cual), sin requerir que el cliente desde el navegador haga nada más allá de llamar a la página.

Estoy con lo siguiente, pero creo que no tiene ningún sentido, o sí, no soy muy ducho en el tema:




imagen: <div id="imagen_cambiante"></div>
<var id="variable"></var>

<script type="text/javascript">
document.getElementById('variable').style.visibili ty='hidden';

new Ajax.PeriodicalUpdater('variable', '/cgi_bin/fifos.cgi', {
method: 'get', frequency: 0.01, decay: 1,
evalScripts: true,
});

if (variable == "_|_o_|_o_|_") {
document.getElementById("imagen_cambiante").innerH TML = "<img src="ghost1.png">";
} else {
document.getElementById("imagen_cambiante").innerH TML = "<img src="ghost.png">";
}
</script>



¿Cómo puedo hacerlo? Es que la verdad, estoy bloqueado.

Gammenon
08/03/2010, 14:38
Lo del cache seria una opcion del navegador

Que es eso de <var>? Eso no existe en html, hasta donde yo se :-|

Prototype debe tener otra manera de llamar a ajax de forma que te devuelva un string que puedas tratar en javascript, y en funcion de ello cargar una imagen u otra.

^MiSaTo^
08/03/2010, 14:39
Muchas gracias por el ejemplo, pero no me vale, porque yo requiero cambiarlo en función del valor devuelto al llamar a un CGI.
Además, para el tema de la caché, pereferiría que cualquier movida la hiciese el servidor (o la web tal cual), sin requerir que el cliente desde el navegador haga nada más allá de llamar a la página.

Estoy con lo siguiente, pero creo que no tiene ningún sentido, o sí, no soy muy ducho en el tema:





¿Cómo puedo hacerlo? Es que la verdad, estoy bloqueado.

Perdona que me meta pero por lo que acabo de leer sobre esa función de PeriodicalUpdater lo que hace es actualizar un div con lo que devuelve al script al que llamas. Bueno en ese caso a lo mejor puedes hacer que el cgi devuelva directamente el código HTML.
Yo esque lo que haría es, si usas JQuery por ejemplo, hacer la llamada AJAX y en el callback comprobar el valor de esa variable qe te devuelve el CGI y cambiar la imagen en consecuencia.
Pero por lo que leo sobre la función que usas tú ahora mismo, creo que es más rebuscado ya que actualiza un div. (corregidme si me equivoco porque no he usado prototype más que para 2 cosas)

EDIT: que digo yo que por qué usas prototype cuando puedes hacer una llamada normal de ajax y con el setInterval ponerle cada cuanto quieres que se llame. Después ya puedes tocar lo que sea con lo que te devuelva esa llamada ;)

3L_S4N70
08/03/2010, 14:44
Lo del cache seria una opcion del navegador

Que es eso de <var>? Eso no existe en html, hasta donde yo se :-|

Prototype debe tener otra manera de llamar a ajax de forma que te devuelva un string que puedas tratar en javascript, y en funcion de ello cargar una imagen u otra.

No sé, lo de var lo he sacado de aquí: http://www.htmlquick.com/es/reference/tags.html


Perdona que me meta pero por lo que acabo de leer sobre esa función de PeriodicalUpdater lo que hace es actualizar un div con lo que devuelve al script al que llamas. Bueno en ese caso a lo mejor puedes hacer que el cgi devuelva directamente el código HTML.
Yo esque lo que haría es, si usas JQuery por ejemplo, hacer la llamada AJAX y en el callback comprobar el valor de esa variable qe te devuelve el CGI y cambiar la imagen en consecuencia.
Pero por lo que leo sobre la función que usas tú ahora mismo, creo que es más rebuscado ya que actualiza un div. (corregidme si me equivoco porque no he usado prototype más que para 2 cosas)

Voy a mirarme otra vez eso del jQuery, a ver si saco algo en claro. La verdad, lo que yo haga puede ser rebuscado, porque estoy aprendiendo de esto sobre la marcha, e intento aplicar las cosillas que voy viendo, pero que pueden no ser la mejor opción (hasta el punto de que pueden no ser solución sino fuente de más problemas, como me da a mi que es lo que estoy intentando hacer).

Un ejemplillo para saber por donde tirar te lo agradecería infinito. :brindis:

^MiSaTo^
08/03/2010, 14:48
No sé, lo de var lo he sacado de aquí: http://www.htmlquick.com/es/reference/tags.html



Voy a mirarme otra vez eso del jQuery, a ver si saco algo en claro. La verdad, lo que yo haga puede ser rebuscado, porque estoy aprendiendo de esto sobre la marcha, e intento aplicar las cosillas que voy viendo, pero que pueden no ser la mejor opción (hasta el punto de que pueden no ser solución sino fuente de más problemas, como me da a mi que es lo que estoy intentando hacer).

Un ejemplillo para saber por donde tirar te lo agradecería infinito. :brindis:

Yo creo que lo mejor es que no uses frameworks si no sabes como van porque al final es mucho más rebuscado ;) Me refiero, si no usas ya prototype o JQuery, hazte una llamada ajax normal y con setInterval le dices la frecuencia de actualización. Después de la llamada tratas ya el resultado como quieras con JS normal y corriente.
Si necesitas ayuda házmelo saber. Puedes mirarte esto (http://www.w3schools.com/Ajax/Default.Asp) que es un tutorial basiquillo de Ajax ;)

PD: no queria ofenderte con mi otro post, solo que veo que a lo mejor las soluciones que te dan son un poco más rebuscadas que lo que tú quieres hacer ;)

Gammenon
08/03/2010, 14:48
Aqui un ejemplillo:




$.ajax({
type:'POST',
url: '/cgi_bin/fifos.cgi',
dataType: 'text',
error: function(XMLHttpRequest, textStatus, exceptionObj)
{
if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}
},
success: function(text)
{
if (text == "_|_o_|_o_|_") {
document.getElementById("imagen_cambiante").innerH TML = "<img src="ghost1.png">";
} else {
document.getElementById("imagen_cambiante").innerH TML = "<img src="ghost.png">";
}
}
});



No lo he probado, pero seria algo asi

^MiSaTo^
08/03/2010, 14:55
Si finalmente decides usar JQuery aquí (http://api.jquery.com/jQuery.ajax/) tienes la documentación oficial con ejemplos de cómo hacer llamadas ajax.
Yo, ya te digo, haría una llamada normal, usaría el window.setInterval y después actualizaría la imagen. A no ser que ya conozcas JQuery y como funciona ;)

3L_S4N70
08/03/2010, 14:58
Yo creo que lo mejor es que no uses frameworks si no sabes como van porque al final es mucho más rebuscado ;) Me refiero, si no usas ya prototype o JQuery, hazte una llamada ajax normal y con setInterval le dices la frecuencia de actualización. Después de la llamada tratas ya el resultado como quieras con JS normal y corriente.
Si necesitas ayuda házmelo saber. Puedes mirarte esto (http://www.w3schools.com/Ajax/Default.Asp) que es un tutorial basiquillo de Ajax ;)

PD: no queria ofenderte con mi otro post, solo que veo que a lo mejor las soluciones que te dan son un poco más rebuscadas que lo que tú quieres hacer ;)

¿Ofenderme? ¿Por qué? No seas boba. Si sé que me estoy haciendo la picha un lío, pero es que desconozco casi por completo las opciones que tengo para esto.


Aqui un ejemplillo:
No lo he probado, pero seria algo asi

Si te soy sincero, me deja anonadado ese ejemplo: ¿eso dónde iría? Deduzco que en un fichero aparte, ¿o iría pegado en el html? Me siento mal porque me da la sensación de estar pidiendo que me lo déis hecho, que no es mi intención.

^MiSaTo^
08/03/2010, 15:01
¿Ofenderme? ¿Por qué? No seas boba. Si sé que me estoy haciendo la picha un lío, pero es que desconozco casi por completo las opciones que tengo para esto.



Si te soy sincero, me deja anonadado ese ejemplo: ¿eso dónde iría? Deduzco que en un fichero aparte, ¿o iría pegado en el html? Me siento mal porque me da la sensación de estar pidiendo que me lo déis hecho, que no es mi intención.

Cualquiera de los ejemplos que ves, tendrían que ir en el html entre los tags <script type="text/javascript"></script>
Y no te sientas mal hombre, aquí estamos para ayudar no? :brindis:

Gammenon
08/03/2010, 15:09
¿Ofenderme? ¿Por qué? No seas boba. Si sé que me estoy haciendo la picha un lío, pero es que desconozco casi por completo las opciones que tengo para esto.



Si te soy sincero, me deja anonadado ese ejemplo: ¿eso dónde iría? Deduzco que en un fichero aparte, ¿o iría pegado en el html? Me siento mal porque me da la sensación de estar pidiendo que me lo déis hecho, que no es mi intención.

La cosa web tiene estas porquerias, que hay que hacer mil movidas para que empiece a parecerse a una aplicacion de escritorio de hace 20 años para aqui XD Por mi no te preocupes y pregunta lo que quieras.

Lo que te he puesto puede ir en una funcion llamada updateImg(), que iria como ha dicho masato en los tags <script></script>. Aqui tienes el esqueleto completo:




<html>

<script type="text/javascript" src="jquery.js"></script>
<script>

// Movida de jQuery que hace que lo que definas dentro se ejecute al cargarse la pagina
$(document).ready(function()
{
// Indicamos que updateImg se llame cada 100 ms
window.setInterval(updateImg, 100);
}

function updateImg()
{
// Lo que te he puesto del ajax con jQuery
}

</script>

<body>

<!-- Aqui cosas de html -->

</body
</html>

^MiSaTo^
08/03/2010, 15:11
La cosa web tiene estas porquerias, que hay que hacer mil movidas para que empiece a parecerse a una aplicacion de escritorio de hace 20 años para aqui XD Por mi no te preocupes y pregunta lo que quieras.

Lo que te he puesto puede ir en una funcion llamada updateImg(), que iria como ha dicho masato en los tags <script></script>. Aqui tienes el esqueleto completo:




<html>

<script type="text/javascript" src="jquery.js"></script>
<script>

// Movida de jQuery que hace que lo que definas dentro se ejecute al cargarse la pagina
$(document).ready(function()
{
// Indicamos que updateImg se llame cada 100 ms
window.setInterval(updateImg, 100);
}

function updateImg()
{
// Lo que te he puesto del ajax con jQuery
}

</script>

<body>

<!-- Aqui cosas de html -->

</body
</html>


por qué abres 2 veces el tag script? ;)

Gammenon
08/03/2010, 15:12
por qué abres 2 veces el tag script? ;)

Me gusta que cada "include" vaya en su propia linea :)

3L_S4N70
08/03/2010, 15:27
Definitivamente soy un poco merluzo con la programación web. A ver, tengo esto, pero no va, ¿me he comido algo?



<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Robotin feliz</title>
</head>

<script type="text/javascript" src="/cgi_bin/jquery.js">
$(document).ready(function()
{
window.serInterval(updateImg, 10);
}

function updateImg()
{
$.ajax({
type:'POST',
url:'/cgi_bin/fifos.cgi',
dataType: 'text',
error: function(XMLHttpRequest, textStatus ,exceprionObj)
{
if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}
},
success: function(text)
{
if(text == "_|_o_|_o_|_ "){
document.getElementById("imagen_cambiante").innerHTML = "<img src ='ghost1.png'>";
} else {
document.getElementById("imagen_cambiante").innerHTML = "<img src ='ghost.png'>";
}
}
}
}
</script>

<body>
<div id="cabecera">
Cabecera.

</div>
<div id="cuerpo">
Datos.<br>

<form action='/cgi-bin/mio.cgi' method="POST">
<input type="submit" value="prueba">
</form>

imagen: <div id="imagen_cambiante"></div>

</div>
</body>

</html>


Qué cruz, ¿por qué me meteré en estos fregaos?

Gammenon
08/03/2010, 15:28
No es window.serInterval(updateImg, 10); sino setInterval, set XD

Aparte que si no te funciona, ve poniendo alerts por ahi, en plan alert("hasta aqui he llagado"); Vamos que sepas hasta donde llega el codigo

3L_S4N70
08/03/2010, 15:30
La madre que me parió. Bien, voy a tirar de alerts, que así a saco, y sin el "ser" :D sigue sin hacer ná.

Gammenon
08/03/2010, 15:33
La madre que me parió. Bien, voy a tirar de alerts, que así a saco, y sin el "ser" :D sigue sin hacer ná.

Primero prueba si el codigo inicial se ejecuta, luego si la funcion que se tiene que ejecutar a intervalos y asi sucesivamente. Por cierto el innerHTML (en el foro lo has puesto con un espacio en la palabra HTML) creo que no es muy estandar y no se si tu navegador lo soportara.

3L_S4N70
08/03/2010, 15:38
El innerHTML en las pruebas que estoy haciendo, desde un Firefox en Ubuntu, se lo traga bien.

El tema está en que no sé hacer funcionar esto que me has dicho. No entiendo a qué te refieres con el código inicial. Ah, ¿te refieres a lo que se debe ejecutar cuando se inicia la página? Osea, ¿donde se hace el setInterval? En tal caso, no funciona, porque le he endosado un alert ahí, y no me dice nada la muy maleducada :D

Gammenon
08/03/2010, 15:39
El innerHTML en las pruebas que estoy haciendo, desde un Firefox en Ubuntu, se lo traga bien.

El tema está en que no sé hacer funcionar esto que me has dicho. No entiendo a qué te refieres con el código inicial. Ah, ¿te refieres a lo que se debe ejecutar cuando se inicia la página? Osea, ¿donde se hace el setInterval? En tal caso, no funciona, porque le he endosado un alert ahí, y no me dice nada la muy maleducada :D

Efectivamente tienes que ir probando asi. Comprueba si la ruta del jquery.js es la correcta, lo puedes comprobar escribiendolo en la barra de direcciones a ver si te aparece el contenido de ese fichero .js

^MiSaTo^
08/03/2010, 15:40
Definitivamente soy un poco merluzo con la programación web. A ver, tengo esto, pero no va, ¿me he comido algo?



Qué cruz, ¿por qué me meteré en estos fregaos?

El document.ready lo tienes mal cerrado. Sería así:

$(document).ready(function(){
window.setInterval(updateImg, 10);
});

Por eso no te actualiza con el setInterval ;)

EDIT: fíjate que detrás de la llave va un paréntesis y el punto y coma. ready es una función, si te fijas al hacer la llamada abres paréntesis pero al final no lo habías cerrado.
Ya te dije que JQuery igual te era más rebuscado xD

Gammenon
08/03/2010, 15:43
El document.ready lo tienes mal cerrado. Sería así:

$(document).ready(function(){
window.setInterval(updateImg, 10);
});

Por eso no te actualiza con el setInterval ;)

Fallo mio, que solo he copiado la parte principal y no la funcion entera :o

3L_S4N70
08/03/2010, 15:58
El document.ready lo tienes mal cerrado. Sería así:

$(document).ready(function(){
window.setInterval(updateImg, 10);
});

Por eso no te actualiza con el setInterval ;)

EDIT: fíjate que detrás de la llave va un paréntesis y el punto y coma. ready es una función, si te fijas al hacer la llamada abres paréntesis pero al final no lo habías cerrado.
Ya te dije que JQuery igual te era más rebuscado xD

Ya, la verdad es que es un follón, pero es que realmente no tengo ningún arma más que las que me digáis vosotros por aquí, porque me he mirado otras cosillas, pero no me aclaro nada.

Bueno, he apañado ese fallico, pero aún así pasa de mi. He hecho algún cambio más, de rutas y tal, pero ni por asomo parece ir:



<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="prototype.js"></script>
<title>Robotin feliz</title>
</head>

<script type="text/javascript" src="jquery.js">

alert("hola");

$(document).ready(function()
{
alert("hola1");
window.setInterval(updateImg, 10);
});

function updateImg()
{
$.ajax({
type:'POST',
url:'/cgi-bin/fifos.cgi',
dataType: 'text',
/* error: function(XMLHttpRequest, textStatus ,exceprionObj)
{
if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}
},*/
success: function(text)
{
if(text == "_|_o_|_o_|_ "){
document.getElementById("imagen_cambiante").innerHTML = "<img src ='ghost1.png'>";
} else {
document.getElementById("imagen_cambiante").innerHTML = "<img src ='ghost.png'>";
}
}
}
}

</script>

<body>

<div id="cabecera">
Cabecera.

</div>
<div id="cuerpo">
Datos.<br>

<form action='/cgi-bin/mio.cgi' method="POST">
<input type="submit" value="prueba">
</form>

imagen: <div id="imagen_cambiante"></div>

</div>
</body>

</html>

Gammenon
08/03/2010, 16:00
Te sale el hola1?

3L_S4N70
08/03/2010, 16:01
No sale ni el hola a secas.

^MiSaTo^
08/03/2010, 16:05
Ya, la verdad es que es un follón, pero es que realmente no tengo ningún arma más que las que me digáis vosotros por aquí, porque me he mirado otras cosillas, pero no me aclaro nada.

Bueno, he apañado ese fallico, pero aún así pasa de mi. He hecho algún cambio más, de rutas y tal, pero ni por asomo parece ir:



<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="prototype.js"></script>
<title>Robotin feliz</title>
</head>

<script type="text/javascript" src="jquery.js">

alert("hola");

$(document).ready(function()
{
alert("hola1");
window.setInterval(updateImg, 10);
});

function updateImg()
{
$.ajax({
type:'POST',
url:'/cgi-bin/fifos.cgi',
dataType: 'text',
/* error: function(XMLHttpRequest, textStatus ,exceprionObj)
{
if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}
},*/
success: function(text)
{
if(text == "_|_o_|_o_|_ "){
document.getElementById("imagen_cambiante").innerHTML = "<img src ='ghost1.png'>";
} else {
document.getElementById("imagen_cambiante").innerHTML = "<img src ='ghost.png'>";
}
}
}
}

</script>

<body>

<div id="cabecera">
Cabecera.

</div>
<div id="cuerpo">
Datos.<br>

<form action='/cgi-bin/mio.cgi' method="POST">
<input type="submit" value="prueba">
</form>

imagen: <div id="imagen_cambiante"></div>

</div>
</body>

</html>


Vamos por partes...
primero, prueba a incluir la librería jquery tal como incluyes la de prototype porque lo que has puesto creo que no es muy correcto.

Prueba esto primero:


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script type="text/javascript" src="jquery.js"></script>
<title>Robotin feliz</title>


<script type="text/javascript">

$(document).ready(function()
{
alert("hola1");
});
</script>
</head>
<body>
<!-- aqui lo que sea, da igual como si lo dejas en blanco ahora mismo pa probar -->
</body>
</html>


Yo siempre prefiero poner los scripts de JS en el head, pero tb es correcto ponerlo en el body.

Gammenon
08/03/2010, 16:09
Cierra el tag script y cierra tambien la llamada a ajax. Asumo que tienes jquery.js en el mismo sitio que el fichero html. Por cierto, pon el tag <html> antes que "<head>". Aqui tienes la version corregida:



<html>

<script type="text/javascript" src="jquery.js"></script>
<script>

alert("hola");

$(document).ready(function()
{
alert("hola1");
window.setInterval(updateImg, 10);
});

function updateImg()
{
$.ajax({
type:'POST',
url:'/cgi-bin/fifos.cgi',
dataType: 'text',
/* error: function(XMLHttpRequest, textStatus ,exceprionObj)
{
if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}
},*/
success: function(text)
{
if(text == "_|_o_|_o_|_ "){
document.getElementById("imagen_cambiante").innerHTML = "<img src ='ghost1.png'>";
} else {
document.getElementById("imagen_cambiante").innerHTML = "<img src ='ghost.png'>";
}
}
});
}

</script>

<body>

<div id="cabecera">
Cabecera.

</div>
<div id="cuerpo">
Datos.<br>

<form action='/cgi-bin/mio.cgi' method="POST">
<input type="submit" value="prueba">
</form>

imagen: <div id="imagen_cambiante"></div>

</div>
</body>

</html>

3L_S4N70
08/03/2010, 16:10
Vale, gracias, la cosa empieza a marchar...

Si dejo comentada toda la función updateImg, me hace los dos alerts de lujo. En el momento que la descomento, ya no me hace ninguno.

EDITO: Sí, jquery la he movido de cgi-bin donde la tenía antes, a la misma carpeta que el html. Y sí, la etiqueta de html la tenía puesta, sólo que me he colado y no la he copiado antes aquí :D
El caso es que no va si descomento updateImg.

Gammenon
08/03/2010, 16:12
Tienes bien cerrado con "});" la llamada a ajax?

3L_S4N70
08/03/2010, 16:14
Tienes bien cerrado con "});" la llamada a ajax?

Grandeee, era eso, ya no casca. Pasa de mi y no me muestra la imagen, pero ya me hace los alert de antes. Voy a ver si veo por qué no me escupe las imágenes.

Gammenon
08/03/2010, 16:16
Grandeee, era eso, ya no casca. Pasa de mi y no me muestra la imagen, pero ya me hace los alert de antes. Voy a ver si veo por qué no me escupe las imágenes.

Dentro del ajax pon lo que recibes del servidor con un alert, asi ya aislas que es un problema de asignar la imagen dentro del div. Eso si, pon que las llamadas sean cada 1000 ms o asi, que sino no podras cerrar la pagina ni actualizarla XD

3L_S4N70
08/03/2010, 16:23
Hasta ahora, me sale a veces (supongo que siempre, pero un tiempo ínfimo) el dibujito al principio, y después se queda en blanco. Como curiosidad también decir que lo del img src tralará no funcionaba como lo tenía, con comillas dobles fuera y simples dentro, sino así: '<img src ="ghost.png">'. Qué cosa más rara.

¿Dónde meto el alert? No sé si es que lo meto mal (he probado en todos lados), o es que lo de AJAX no chuta.

Gammenon
08/03/2010, 16:33
Mete un alert tal que asi:




success: function(text)
{
alert("respuesta: " + text);
},


Esto va en lo del ajax, modifica lo que va dentro de "success" para que incluya ese alert. Asi sabras que te esta enviando el servidor realmente, o si es esta ejecutando esa parte ;)

3L_S4N70
08/03/2010, 16:41
Pues entonces me hace saber que pasa de esa parte.

Le he endosado un alert con text al error (se lo he metido como parámetro, detrás de exceptionObj), y me dice que undefined siempre. Osea, se ejecuta siempre error, ¿quiere decir eso que no me lanza fifos.cgi?

EDITO: fifos.cgi es un simple cat a una tubería, que a su vez ve cambiado su contenido por un programita que corre en el servidor.

Gammenon
08/03/2010, 16:43
Puedes comprobar en el servidor si recibe llamadas? Lo del error que comentas no lo entiendo, si puedes poner el codigo...

3L_S4N70
08/03/2010, 16:51
Puedes comprobar en el servidor si recibe llamadas? Lo del error que comentas no lo entiendo, si puedes poner el codigo...

El servidor es él mismo, estoy en localhost todo el rato.

Lo que digo de la función error es lo siguiente:



$.ajax({
type: 'POST',
url: '/cgi-bin/fifos.cgi',
dataType: 'text',
error: function(XMLHttpRequest, textStatus, exceptionObj, text)
{
/* if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}*/
// alert("vaya, que fallo: " + text);
},
success: function(text)
{
/*if(text == "_|_o_|_o_|_ "){
document.getElementById("imagen_cambiante").innerHTML = '<img src ="ghost1.png">';
} else {
document.getElementById("imagen_cambiante").innerHTML = '<img src ="ghost.png">';
}*/
alert("respuesta: " + text);
}
});


Este es el contenido de fifos.cgi (lo que está comentado es porque antes lo usaba para escupirlo tal cual, y no para tratarlo como condición):



#!/bin/sh

#echo "Content-type: text/html"
#echo

#echo "<html><body>"

cat tuberia

#echo "</body></html>"


"tuberia" es una fifo a la que le mando la cadena de caracteres tal cuál a comparar para escupir la imagen que sea, desde un programita corriendo en el mismo servidor.

Gammenon
08/03/2010, 16:58
Y el text de "error: function(XMLHttpRequest, textStatus, exceptionObj, text)" te lo has inventado tu? Asi es normal que siempre sea undefined, jquery nunca va a poner nada en esa variable. Aqui tienes la documentacion de cada funcion: http://api.jquery.com/jQuery.ajax/ donde te aparecen los parametros que admite cada callback.

Entonces, siempre te salta el alert de "vaya, que fallo"? Si es asi prueba a cambiar el valor de dataType por "html" en vez de "text".

En tu caso en concreto creo que tu servidor deberia enviar solamente un string pelado, porque no necesitas html ni nada estructurado, simplemente un string u otro, no?

3L_S4N70
08/03/2010, 17:09
Y el text de "error: function(XMLHttpRequest, textStatus, exceptionObj, text)" te lo has inventado tu? Asi es normal que siempre sea undefined, jquery nunca va a poner nada en esa variable. Aqui tienes la documentacion de cada funcion: http://api.jquery.com/jQuery.ajax/ donde te aparecen los parametros que admite cada callback.

Entonces, siempre te salta el alert de "vaya, que fallo"? Si es asi prueba a cambiar el valor de dataType por "html" en vez de "text".

En tu caso en concreto creo que tu servidor deberia enviar solamente un string pelado, porque no necesitas html ni nada estructurado, simplemente un string u otro, no?

Sí, me lo he inventado yo :lamer: Era por probar.

Con html tampoco va.

Y sí, siempre saltaba el "vaya que fallo". He deducido que el if de error tendrá que ser cierto cuando textStatus == 'error', y no distinto, para que escupa el error, ¿no? (Es más curiosidad que otra cosa).

Y respecto a lo que recibo, en la tubería me deja un string, que yo cojo con el cat del cgi, y comparo. Para probar sólo estoy comprobando con una posibilidad, pero son cuatro posibilidades en realidad (cinco si tengo en cuenta una de error). Pero vamos, sí, la idea es el recibir ese string, y utilizarlo para comprarlo y lanzar una u otra imagen. Lo que recibo con el cat es tal cual lo que comparo, el tema está en que parece que no conecta bien, ¿quiere decir eso que no lanza el cgi?

Gammenon
08/03/2010, 17:13
Prueba a hacer alert() de los parametros de error.

Lo de comparar lo que de si es 'error' o no era una movida que puse pero no me acuerdo por que, puedes quitarlo.

3L_S4N70
08/03/2010, 17:22
Prueba a hacer alert() de los parametros de error.

Lo de comparar lo que de si es 'error' o no era una movida que puse pero no me acuerdo por que, puedes quitarlo.

He puesto esto:



error: function(XMLHttpRequest, textStatus, exceptionObj)
{
if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}
alert("XMLHttpRequest: " + XMLHttpRequest);
alert("textStatus: " + textStatus);
alert("exceptionObj: " + exceptionObj);
},


Y me responde:

XMLHttpRequest: [object XMLHttpRequest]

textStatus: error

exceptionObj: undefined

Gammenon
08/03/2010, 17:25
Prueba con XMLHttpRequest.responseText o XMLHttpRequest.responseHTML en los alert. Tambien puedes probar a ver si el servidor va o no poniendo su url directamente en la barra de direcciones, a ver que te dice...

3L_S4N70
08/03/2010, 17:32
Tanto con datatype: text como con datatype: html, XMLHttpRequest.responseText me dice:


XMLHttpRequest.responseText: <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>500 Internal Server Error</title>
</head><body>
<h1>Internal Server Error</h1>
<p>The server encountered an internal error or
misconfiguration and was unable to complete
your request.</p>
<p>Please contact the server administrator,
webmaster@localhost and inform them of the time the error occurred,
and anything you might have done that may have
caused the error.</p>
<p>More information about this error may be available
in the server error log.</p>
<hr>
<address>Apache/2.2.12 (Ubuntu) Server at 127.0.0.1 Port 80</address>
</body></html>


Y XMLHttpRequest.responseHTML me dice:

undefined

Gammenon
08/03/2010, 17:34
Pues ya ves, es un error del servidor, el 500: http://www.checkupdown.com/status/E500.html

Has probado metiendo la direccion del servidor en la barra de direcciones del navegador?

3L_S4N70
08/03/2010, 18:00
Mil gracias por vuestra ayudita. Ya llegué al error: estaba en fifos.cgi. Ahora ha quedado así:



#!/bin/sh

echo "Content-type: text/html"
echo

#echo "<html><body>"

cat tuberia

#echo "</body></html>"


Y ya puedo comparar lo recibido para hacer cambiar la imagen.

Así que ahora, a rizar el rizo, para aclararme y mejorar un poquito esto:
- ¿Alternativa a "innerHTML", algo más estándar?
- ¿Qué significa el signo $, tanto antes de "(document)" como antes de ".ajax"? O por qué se pone, o para qué vale.
- Por último, las funciones error y success (nombres que supongo que sencillamente se les dan para identificarlas), ¿llevan como parámetros aquellos que harán que se entre en ellas si cambian?

Mil gracias de nuevo

^MiSaTo^
08/03/2010, 18:03
Mil gracias por vuestra ayudita. Ya llegué al error: estaba en fifos.cgi. Ahora ha quedado así:



#!/bin/sh

echo "Content-type: text/html"
echo

#echo "<html><body>"

cat tuberia

#echo "</body></html>"


Y ya puedo comparar lo recibido para hacer cambiar la imagen.

Así que ahora, a rizar el rizo, para aclararme y mejorar un poquito esto:
- ¿Alternativa a "innerHTML", algo más estándar?
- ¿Qué significa el signo $, tanto antes de "(document)" como antes de ".ajax"? O por qué se pone, o para qué vale.
- Por último, las funciones error y success (nombres que supongo que sencillamente se les dan para identificarlas), ¿llevan como parámetros aquellos que harán que se entre en ellas si cambian?

Mil gracias de nuevo
1) no hay alternativa al innerHTML en tu caso (creo)
2) el $ indica que es una "variable" de JQuery (bueno no exactamente eso, pero es como accedes a los elementos del documento y las funciones desde JQuery)
3) no termino de entender esta pregunta, pero mírate el link de la documentación que te di más arriba, ahí vienen los parámetros

Gammenon
08/03/2010, 18:05
Mil gracias por vuestra ayudita. Ya llegué al error: estaba en fifos.cgi. Ahora ha quedado así:



#!/bin/sh

echo "Content-type: text/html"
echo

#echo "<html><body>"

cat tuberia

#echo "</body></html>"


Y ya puedo comparar lo recibido para hacer cambiar la imagen.

Así que ahora, a rizar el rizo, para aclararme y mejorar un poquito esto:
- ¿Alternativa a "innerHTML", algo más estándar?
- ¿Qué significa el signo $, tanto antes de "(document)" como antes de ".ajax"? O por qué se pone, o para qué vale.
- Por último, las funciones error y success (nombres que supongo que sencillamente se les dan para identificarlas), ¿llevan como parámetros aquellos que harán que se entre en ellas si cambian?

Mil gracias de nuevo

- Puedes usar jquery otra vez, y hacer $('#imagen').attr('src', 'url de la image'); Asi de sencillo, suponiendo que 'imagen' sea la id del elemento <img>
- El signo $ es un truco que tiene jQuery para acceder a sus muchas funciones. Es un "sintactic sugar", facilita la escritura del codigo.
- Cuando llamas a ajax lo que le estas pasando es una tabla relacional. Cuando jquery obtiene la respuesta de ajax, segun lo que haya llegado llama a la funcion que le has pasado con el identificador "error" o "success". Lo de los parametros no entiendo, eso esta definido por jquery y asi deben ser.

3L_S4N70
08/03/2010, 18:10
Gracias a los dos.
Le echaré un vistazo a lo del atributo de la imagen, si no me aclaro, ya te preguntaré.

Lo de la función pensé que los nombres eran opcionales, que se podía poner cualquiera, y que los parámetros eran los que hacian que se ejecutase una u otra función, si cambiaban (y si no cambiaban, no se entraba en tal función). Soy electrónico, y pensaba que sería como en VHDL (vamos, la lista de sensibilidad), pero deduzco por vuestras respuestas que no, jeje.

Un saludo, y de nuevo mil gracias, ha costado, pero ha salido, y os lo debo en este caso a vosotros dos, que habéis estado toda la tarde ayudándome (sobretodo a Gammenon, que parecía esto un chat :brindis:)

Gammenon
08/03/2010, 18:12
Bueno, las gracias y tal estan bien, pero cuando se habla aqui de pasta? Eh eh? Que esto no es de gratis, eh! [wei]

3L_S4N70
08/03/2010, 18:43
Calla, es cierto, estaríamos hablando de un gritón de dólares, ¿no? :D

Oye, he utilizado eso que me has dicho de $("#imagen_cambiante"), etc., que no funcionaba con "imagen_cambiante" definida como esta (div), pero si definida como img. La duda es: ¿esto es más estándar que innerHTML? Caso afirmativo, genial, porque va "deluxe".

Un saludo :brindis:

Gammenon
08/03/2010, 18:45
Calla, es cierto, estaríamos hablando de un gritón de dólares, ¿no? :D

Oye, he utilizado eso que me has dicho de $("#imagen_cambiante"), etc., que no funcionaba con "imagen_cambiante" definida como esta (div), pero si definida como img. La duda es: ¿esto es más estándar que innerHTML? Caso afirmativo, genial, porque va "deluxe".

Un saludo :brindis:

Si, jquery se encarga de hacer las cosas de forma estandar segun el navegador donde esta corriendo.

Con el div es normal que no te vaya, ya que "src" es un atributo de img, no de div. Lo que estas haciendo es cambiar un atributo de un elemento html con id "imagen_cambiante", que es diferente a lo que estabas haciendo antes, que era cambiar el contenido interno de un elemento.

3L_S4N70
08/03/2010, 18:55
Si, jquery se encarga de hacer las cosas de forma estandar segun el navegador donde esta corriendo.

Con el div es normal que no te vaya, ya que "src" es un atributo de img, no de div. Lo que estas haciendo es cambiar un atributo de un elemento html con id "imagen_cambiante", que es diferente a lo que estabas haciendo antes, que era cambiar el contenido interno de un elemento.

Aaaaaaamigo, ya comprendo, ok. Pues entonces normal que me apareciese el típico dibujito de que no encuentra la imagen.

Pues lo dicho, esto ahora va bastante bien, a ver con qué movida me encuentro para la siguiente ronda de dudas, jeje.

:brindis:

3L_S4N70
17/03/2010, 15:54
Hola gente, vuelvo a la carga: quiero enviar datos a un CGI, y no sé cómo hacerlo, y no me entero mirándome la docu de jQuery. Mirad, ésta es la función que tengo (ni caso al success, que es lo que no sé hacer):



function move()
{
$.ajax({
type: 'POST',
url: '/cgi-bin/mover.cgi',
dataType: 'text',
error: function(XMLHttpRequest, textStatus, exceptionObj)
{
alert("error");
if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}
},
success: function(text)
{
$("#text") = "1";
}
});
}


En el CGI tengo:



#!/bin/sh

echo "Content-type: text/html"
echo

echo $1 >> tuberia


La idea es meterlo a la fifo con nombre tubería, para ser tratado desde un programita. Sospecho que el problema es únicamente que no sé mandar los datos al CGI, pero creo que el CGI está bien, ¿no?


Y aprovechando el momento, más dudas. Tengo lo siguiente, para mandar un valor sencillamente con ponerlo donde indico, valdría, ¿no? (Para ser lo recibido por el CGI, etc):



<td width="50" rowspan="2"><a onclick="move(AQUI);" title="Probando, probando.........."><img src="negro.png" /></a></td>


Y por ultimo, y ya metiéndome más en tema programación que en tema Web, me gustaría poder desde un CGI (a poder ser, hecho en shell) parar y arrancar procesos que estén en el servidor. Entiendo que lanzarlos es sencillo, al igual que en la consola, pero pararlos, ahora mismo lo hago a lo bestia en la consola, con un Ctrl+C, ¿cómo podría hacerlo desde CGI, a poder ser, más elegantemente? ¿Tendría que ponerle algo al programa, para que con tal argumento mientras se está ejecutando, se pare, o qué? Vamos, quizá hacerlo más interactivo, y conseguir además interactuar con el CGI, y no sólo a mano.

Un saludo y mil gracias

Gammenon
17/03/2010, 16:39
Los datos se envian con el campo "data" en la llamada a ajax(). Pon data en la misma lista que "type" o "url", tal que asi mas o menos:




type: 'POST',
url: '/cgi-bin/mover.cgi',
dataType: 'text',
data: {'valor1' : 10, 'valor2' : 'hola'},



Efectivamente podrias coger el parametro de move() y meterlo en la tabla que pasas por "data".

Lo otro ni idea :P

3L_S4N70
17/03/2010, 18:12
De lujo, gracias por las dos respuestas, civantoz y Gammenon, voy a probar lo que me decís. Si tengo problemas para los que no encuentre la solución, os pediré otro cable (sí, soy un pesado, pero es que me venís de lujo, :D)

Un saludo

< - >

Los datos se envian con el campo "data" en la llamada a ajax(). Pon data en la misma lista que "type" o "url", tal que asi mas o menos:




type: 'POST',
url: '/cgi-bin/mover.cgi',
dataType: 'text',
data: {'valor1' : 10, 'valor2' : 'hola'},



Efectivamente podrias coger el parametro de move() y meterlo en la tabla que pasas por "data".

Lo otro ni idea :P

Ehm, bien, no sé hacerlo. A ver, ¿cómo le paso el parámetro a move()? He puesto algo así:


onclick="move('direccion:1');"


Y también he probado sin poner el nombre de la variable, pero no veo en ningún sitio un ejemplo.

Asímismo, supongo que lo siguiente está bien:



data: {'direccion': 0},

Para darle un valor por defecto.

Pero en success, ¿cómo lo trato? He probado lo siguiente, pero ya no sé si el problema viene de atrás o lo que está mal es esto:



success: function(text)
{
direccion = "1";
}



Depende que programas sean, si son cosas siguiendo algún estandar normalmente tendrán un pidfile, que no es mas que un fichero almacenado normalmente en algun lugar del directorio /var que contiene el pid del programa en cuestión, asi que se abre, se lee el pid, y se le casca un kill, otra forma es hacer el script un poquito más largo, ejecutar ps, buscar el pid a través del nombre del programa, y mandarle un kill al pid encontrado, todo de pende de la implementación original del proceso. Si el proceso es tuyo, optaría por hacer lo del pidfile por comodidad xD

Lo del pidfile me ha cautivado, pero no encuentro en /var el pidfile del proceso que lanzo. Me temo que me tendré que tirar al script con un ps y tal y cual (de todas maneras, aunque más largo, será algo más "estándar", ¿no?).

Aunque también quería explorar la vía que no sé si existe de alguna función que permita hacer eso mismo, meterle algún caracter o lo que sea y "matar" el programa. Osea, un Ctrl+C pero admitido por el programa desde dentro (y si no, le endosaré algun if con lo recibido por la tubería, y un retrun si recibo tal cosa, y a cascarla).

xzakox
17/03/2010, 18:23
Que te parece esto:


#!/bin/bash
mipid=`pidof /bin/bash $0`
echo $mipid > script1.pid
sleep 60


Ahi tienes un script que guarda su pid en el archivo "script1.pid"
Lo puedes leer desde donde quieras y lanzarle un kill :-)

Gammenon
17/03/2010, 18:27
En la funcion success tratas la respuesta del servidor, no lo que tu envias. Lo que tu envias es lo que pones dentro de data. Para hacer que la funcion pille el parametro solo tienes que poner el nombre del parametro como C, pero sin el tipo:




function move(param1, param2)
{
$.ajax(
...

data: {'parametro1' : param1, 'parametro2' : param2},
...

);
}



Obviamente con los puntos suspensivos indico que ahi va el codigo que ya tienes.

Respecto a pasarle los parametros a move, puedes hacerlo asi:



onclick='move("p1", 10)'


Ahi como param1 le paso un string y para param2 un entero

3L_S4N70
17/03/2010, 19:00
Que te parece esto:


#!/bin/bash
mipid=`pidof /bin/bash $0`
echo $mipid > script1.pid
sleep 60


Ahi tienes un script que guarda su pid en el archivo "script1.pid"
Lo puedes leer desde donde quieras y lanzarle un kill :-)

Está genial ese script, pero no es lo que busco exactamente (que no digo que no pueda venirme de lujo más adelante). Busco más bien algo que me dé el pid (si voy por esos derroteros) del programita que lance por medio de un script (un CGI). La idea es poner botones, y lanzar por medio de cada uno un CGI (en shell scripting), que a su vez lance un programita. Pero que además esos scripts, si es necesario, maten un programa que está corriendo antes de lanzar uno nuevo. No sé si me explico.

< - >

En la funcion success tratas la respuesta del servidor, no lo que tu envias. Lo que tu envias es lo que pones dentro de data. Para hacer que la funcion pille el parametro solo tienes que poner el nombre del parametro como C, pero sin el tipo:




function move(param1, param2)
{
$.ajax(
...

data: {'parametro1' : param1, 'parametro2' : param2},
...

);
}



Obviamente con los puntos suspensivos indico que ahi va el codigo que ya tienes.

Respecto a pasarle los parametros a move, puedes hacerlo asi:



onclick='move("p1", 10)'


Ahi como param1 le paso un string y para param2 un entero

Nada, no sé qué hago mal, mira:

Mando el parámetro:


<td width="50" rowspan="2"><a onclick='move(1);' title="Probando, probando.........."><img src="negro.png" /></a></td>


Llamo al CGI con el parámetro:


$.ajax({
type: 'POST',
url: '/cgi-bin/mover.cgi',
dataType: 'text',
data: {'direccion': 0},
error: function(XMLHttpRequest, textStatus, exceptionObj)
{
alert("error");
if(textStatus != 'error')
{
alert('Error al conectarse con el servidor: ' + XMLHttpRequest.responseText);
}
},
success: function(text)
{
}
});


Y lo mando a la fifo con el script (es mover.cgi)


#!/bin/sh

echo "Content-type: text/html"
echo

echo $1 >> tuberia


El resultado es que siempre me escupe el valor 10 a la tubería (en ASCII, "line feed").

Si en su lugar, para probar, pongo $0, me escupe mucha morralla, que probablemente se corresponda con el nombre del script, luego deduzco que el problema debe de estar en que el parámetro no llega al CGI, ya que haciendo un alert en success con el nombre del parámetro, me dice que vale 1 (luego funciona, pues es lo que onclick le dice que vale).

No sé qué pasa.

Gammenon
17/03/2010, 19:06
Cuando haces data: {"param1" : 100}, le estas indicando que existe un valor en la cabecera llamado "param1" que vale 100. Lo que pasa es que tu los coges en crudo con tu cgi, y ahi yo no te puedo ayudar. Simplemente te diria que hicieses $param1 = $_POST["param1"]; en tu php pero... XD

Aparte, por lo que veo no tienes en cuenta el parametro pasado a move en ninguna parte.

3L_S4N70
17/03/2010, 19:16
Cuando haces data: {"param1" : 100}, le estas indicando que existe un valor en la cabecera llamado "param1" que vale 100. Lo que pasa es que tu los coges en crudo con tu cgi, y ahi yo no te puedo ayudar. Simplemente te diria que hicieses $param1 = $_POST["param1"]; en tu php pero... XD

Aparte, por lo que veo no tienes en cuenta el parametro pasado a move en ninguna parte.

El tema está en que no uso php...
Además, lo que me mosquea es que si le digo que me coja por ejemplo $#, me manda un uno, que efectivamente es el número de parámetros. Y si le digo $0, me salta la sarta de basura, que se corresponderá con el nombre del script. Entonces deduzco que por alguna razón, no llega el valor al CGI.

Y no, la verdad es que yo lo que quiero hacer es meter el valor del parámetro al CGI. Si quisiese tocarlo por ejemplo en success, y después lo que obtviese, enviarlo al CGI, ¿sería posible? Es más una curiosidad.

Gammenon
17/03/2010, 20:14
El tema está en que no uso php...
Además, lo que me mosquea es que si le digo que me coja por ejemplo $#, me manda un uno, que efectivamente es el número de parámetros. Y si le digo $0, me salta la sarta de basura, que se corresponderá con el nombre del script. Entonces deduzco que por alguna razón, no llega el valor al CGI.

Y no, la verdad es que yo lo que quiero hacer es meter el valor del parámetro al CGI. Si quisiese tocarlo por ejemplo en success, y después lo que obtviese, enviarlo al CGI, ¿sería posible? Es más una curiosidad.

Ya, ese el problema, no se como se hace en el CGI el tema de obtener los parametros del POST. Respecto a lo ultimo que preguntas, cuando haces la llamada ajax envias unos datos por POST al CGI, y este al responder te envia algo que miras en la funcion success. Ese es todo el flujo. Si quieres comunicarte con el servidor, debes hacer un POST (o un GET) y este te responde, pero no es posible que el servidor llame directamente al cliente, solo actua bajo demanda del mismo.

3L_S4N70
17/03/2010, 20:27
Ya, ese el problema, no se como se hace en el CGI el tema de obtener los parametros del POST. Respecto a lo ultimo que preguntas, cuando haces la llamada ajax envias unos datos por POST al CGI, y este al responder te envia algo que miras en la funcion success. Ese es todo el flujo. Si quieres comunicarte con el servidor, debes hacer un POST (o un GET) y este te responde, pero no es posible que el servidor llame directamente al cliente, solo actua bajo demanda del mismo.

Bien, el tema está en qué datos le envío por POST. De momento, sé que no le estoy enviando nada (acabo de dejarlo sin parámetros y veo que me sigue marcando 1 como número de parámetros, luego no influye). ¿Cómo le envío datos con POST? Ahora mismo lo único que hago es llamarle, pero no le mando nada.

Gammenon
17/03/2010, 20:55
Los datos los envias con la tabla "data" de la llamada ajax, como te he indicado antes. Ahi van los datos en forma de nombre -> valor. Lo que puedes hacer es usar firefox con la extension firebug y ahi veras realmente lo que le envias al servidor y tambien lo que te devuelve.

3L_S4N70
18/03/2010, 01:30
Bueno, ya tengo lo de los parámetros. Tenía problemas a la hora de tratarlos, porque resulta que si van con nombre, el CGI no los coge con $1, $2... Y no me deja mandarlos al programa en C. Pero mandados tal que (...).cgi?"+variable y dándole a variable el valor que necesito, funciona.
Muchas gracias, Gammenon, por dirigirme hacia ese camino, que me ha venido de lujo.

Mañana me meteré con los pid de los programas para lanzarlos y cepillármelos a voluntad desde el cgi.

Buenas noches.

Gammenon
18/03/2010, 08:29
Bueno, ya tengo lo de los parámetros. Tenía problemas a la hora de tratarlos, porque resulta que si van con nombre, el CGI no los coge con $1, $2... Y no me deja mandarlos al programa en C. Pero mandados tal que (...).cgi?"+variable y dándole a variable el valor que necesito, funciona.
Muchas gracias, Gammenon, por dirigirme hacia ese camino, que me ha venido de lujo.

Mañana me meteré con los pid de los programas para lanzarlos y cepillármelos a voluntad desde el cgi.

Buenas noches.

Has hecho ha sido un GET en vez de un POST. Cambiando ese parametro en el ajax te deberia servir el mismo codigo, con el "data" ese y todo :)

3L_S4N70
18/03/2010, 10:58
Has hecho ha sido un GET en vez de un POST. Cambiando ese parametro en el ajax te deberia servir el mismo codigo, con el "data" ese y todo :)

Ya, eso pensé, pero como lo de data me obliga por ejemplo a mandar {'direccion': 0} (que se parecerá entonces a algo como: (...).cgi?direccion=0) en lugar de lo que parece que al CGI le interesa, que viene a ser lo mismo, pero sin direccion, osea, (...).cgi?0.
Lo más mosqueante es que con el firebug observo esos envíos, y con data, con el POST, cada vez que lo llamo me escupe el valor por defecto, aunque luego en success ya me coja el valor que mando a través de move(10), por ejemplo. Es decir, yo miro lo que manda vía firebug, que me direccion=0, y luego el alert(direccion) que tengo en success me dice: 10. Eso es lo que me mata también.

Osea, tendría que por una parte poder mandar el dato sin nombre, o saber como tratarlo en el CGI con nombre; y por otra parte saber cómo (si es posible) enviar con POST el valor que le digo, y no el de defecto. Al margen de eso, el resto está conseguido :D

Un saludo

Gammenon
18/03/2010, 11:00
Enviar por POST es facil, es como te hemos comentado antes. Pillarlo por CGI ni dea. Pero vamos, si con GET te va usa eso y punto :)

3L_S4N70
18/03/2010, 11:04
Enviar por POST es facil, es como te hemos comentado antes. Pillarlo por CGI ni dea. Pero vamos, si con GET te va usa eso y punto :)

Ok, gracias Gammenon. Le echaré otra pensada a ver si lo consigo poner más decentemente, y si no, así se quedará. Es que según lo veo, me da la sensación de que lo que cambio es el nombre del parámetro que envío en lugar del valor del parámetro en sí... corrígeme si me equivoco.

Un saludo

Gammenon
18/03/2010, 11:09
Ok, gracias Gammenon. Le echaré otra pensada a ver si lo consigo poner más decentemente, y si no, así se quedará. Es que según lo veo, me da la sensación de que lo que cambio es el nombre del parámetro que envío en lugar del valor del parámetro en sí... corrígeme si me equivoco.

Un saludo

No te entiendo muy bien. En que parte del codigo dices que tienes esta duda?

3L_S4N70
18/03/2010, 11:12
No te entiendo muy bien. En que parte del codigo dices que tienes esta duda?

En la diferencia entre que con:

tarari.cgi?direccion=0

no me coge el 0 ni nada el CGI mediante $1, y que con:

tarari.cgi?0

me lo coge de lujo.


Y bueno, lo otro que me sigue mosqueando, por qué narices no me cogerá el valor actualizado con POST, y sí con GET (haciéndolo a través del data en ambos casos).

Gammenon
18/03/2010, 11:14
Tendras que mirarte la documentacion para saber como esta el tema de los parametros en el CGI ese que usas (esta en Perl?).

jQuery deberia tratar igual el "data" que le pasas, ya seas POST o GET, o eso recuerdo :-|

3L_S4N70
18/03/2010, 16:02
Tendras que mirarte la documentacion para saber como esta el tema de los parametros en el CGI ese que usas (esta en Perl?).

jQuery deberia tratar igual el "data" que le pasas, ya seas POST o GET, o eso recuerdo :-|

El CGI está script de shell, nada de complicaciones, jeje.
Bien, voy a mirarme la docu, si no veo nada claro, lo comento.

Un saludo, y gracias

< - >
Por alguna extraña, extrañísima razón (extraña para mi :D) no le gusta que le pase parámetros con nombre (vease post: http://www.gp32spain.com/foros/showpost.php?p=1048107&postcount=159).
El caso es que si, por ejemplo, le pongo:

echo $SERVER_SOFTWARE >> tuberia

En tuberia me escupe Apache/...tralará...; pero con:

echo $1

sólo me escupe el dato si está pasado directamente sin nombre, sólo valor.

Vamos, como decía, no soy capaz de tratar los datos si los envío con data, pero sí si los envío a lo bestia con .cgi?valor ; y no veo en la documentación ni en Internet nada que me escalrezca la duda (es más, pongo las palabras clave en el buscador, y cada vez por tres me aparece mi propio hilo, jajaja).

Un saludo

Gammenon
18/03/2010, 17:30
Ni idea tron, de CGI no tengo ni repajolera idea :(

3L_S4N70
18/03/2010, 19:26
Ni idea tron, de CGI no tengo ni repajolera idea :(

No te preocupes, lo que tengo ya funciona bastante bien, aunque si viene alguien que sepa solucionar la duda, aunque sea sólo por el placer de aprender... :D

Un saludo

3L_S4N70
23/03/2010, 12:10
Vuelvo a la carga con otra pequeña duda: ¿es posible, mediante botón por ejemplo, lanzar un programa del servidor? Sé que los cgi's no dejan de ser programas en el servidor lanzados de esa manera, pero tienen duración limitada, y a mi me gustaría por ejemplo lanzar el programita (del que tomo los datos con las fifos) mediante un botón, y que esté funcionando hasta que no presione otro botón de parada.
No sé si es viable (más que viable, sencillito) o es mucha complicación (caso en el que tiraré en el caso real por un script que se ejecute al inicio del sistema, o algo por el estilo).

Un saludo

Gammenon
23/03/2010, 12:15
Vuelvo a la carga con otra pequeña duda: ¿es posible, mediante botón por ejemplo, lanzar un programa del servidor? Sé que los cgi's no dejan de ser programas en el servidor lanzados de esa manera, pero tienen duración limitada, y a mi me gustaría por ejemplo lanzar el programita (del que tomo los datos con las fifos) mediante un botón, y que esté funcionando hasta que no presione otro botón de parada.
No sé si es viable (más que viable, sencillito) o es mucha complicación (caso en el que tiraré en el caso real por un script que se ejecute al inicio del sistema, o algo por el estilo).

Un saludo

Podrias hacer una llamada ajax cuando pulsas el boton, y cuando llegue esta llamada al servidor que este lance un proceso. Luego cuando le das otra vez al boton haces otra llamada ajax y el servidor mata ese proceso. Es posible hacer esto en el servidor?

3L_S4N70
23/03/2010, 12:17
Podrias hacer una llamada ajax cuando pulsas el boton, y cuando llegue esta llamada al servidor que este lance un proceso. Luego cuando le das otra vez al boton haces otra llamada ajax y el servidor mata ese proceso. Es posible hacer esto en el servidor?

Bueno, por sencillez y claridad, igual tiro a hacerlo con dos botones (aunque ahora que lo has mencionado, cambiando el texto que aparece en el botón suena atractivo... jaja).

No sé a qué te refieres con la pregunta: "Es posible hacer esto en el servidor?"

Gammenon
23/03/2010, 12:21
Me refiero a que desde el servidor puedes lanzar una aplicacion que esta funcionando un rato (independientemente de lo que haga el proceso del servidor mismo) y luego cuando toque que el servidor lo mate. Supongo que si, no?

Lo de usar 1 o 2 botones es lo de menos, simplemente codifica de forma diferente las dos llamadas ajax para que puedas identificarlas en el servidor y listo :)

3L_S4N70
23/03/2010, 12:27
Me refiero a que desde el servidor puedes lanzar una aplicacion que esta funcionando un rato (independientemente de lo que haga el proceso del servidor mismo) y luego cuando toque que el servidor lo mate. Supongo que si, no?


Sí, sin ningún problema. Ahora de momento lo hago a capón, lanzo los programas, y ya interactúo con ellos desde la web.



Lo de usar 1 o 2 botones es lo de menos, simplemente codifica de forma diferente las dos llamadas ajax para que puedas identificarlas en el servidor y listo :)

Ya bueno, es más tema estético :D

¿Me podrías comentar un poco cómo hacer lo que comentas aquí?:


Podrias hacer una llamada ajax cuando pulsas el boton, y cuando llegue esta llamada al servidor que este lance un proceso.

Osea, cómo hacer que la llamada lance el proceso, vaya. De momento lo que he hecho ha sido con botones (submit) en formularios con action con valor la url del script cgi que llama al programa, pero al ser un cgi, estoy en el problema que comentaba.

Gammenon
23/03/2010, 12:29
Al final puedes enviar datos codificados en la url al servidor? Si es asi codifica ahi el tema. Si es -1 lanza el proceso, si es -2 lo matas, etc. Algo asi

3L_S4N70
23/03/2010, 12:34
Al final puedes enviar datos codificados en la url al servidor? Si es asi codifica ahi el tema. Si es -1 lanza el proceso, si es -2 lo matas, etc. Algo asi

Supongo a que te refieres a si puedo comunicarme con el servidor vía cgi, ¿no? Sí, puedo, aunque hay un pero.
Lo que hago es lanzar la aplicación que lee de una tubería y escribe sobre otra (para tener comunicación bidireccional), y es en tales tuberías en las que vuelco la información a través del cgi. Mi idea era prescindir de tuberías para lanzar la aplicación en primera instancia, es decir, que teniendo el sistema recién iniciado, no sea necesario tener una aplicación esperando leer la tubería para lanzar el programa.
No obstante, si me dices que no hay otra manera, tiraré por ese camino.

Un saludo

Gammenon
23/03/2010, 12:37
Yo la parte de la que se un poco es de la web, hace muchisimo que no toco las tuberias asi que de esa parte ni idea :)

3L_S4N70
23/03/2010, 12:38
Yo la parte de la que se un poco es de la web, hace muchisimo que no toco las tuberias asi que de esa parte ni idea :)

Jaja, ok. Muchas gracias.

Pues salvo que alguien me pare los pies y me diga que ande voy, voy a mirar lo que me has sugerido.

Un saludo

Gammenon
23/03/2010, 13:10
Por cierto tio, cuando tengas todo en macha queremos fotos, capturas o lo que sea del tinglado, eh? XD

3L_S4N70
23/03/2010, 13:29
Por cierto tio, cuando tengas todo en macha queremos fotos, capturas o lo que sea del tinglado, eh? XD

Jaja, la verdad es que os lo debo. Cuando esté, igual hago un video-captura del sistema rulando.

3L_S4N70
25/03/2010, 20:39
I need some help, again.

Veamos, quiero subir archivos a un servidor, vía html, y como mucho, tirando de javascript y de CGI's en shell. ¿Es viable? Por más que leo, todo tira por JSP, por ASP.net, por PHP... CGI's en python, en C, en Perl... Pero nada, lo que yo quiero nada de nada.

Mil gracias de antemano.

Gammenon
25/03/2010, 20:51
Desde html tendras que hacer un <form> con un <input> con type=file. Esto tiene el problema que el usuario debe escoger el fichero (no se puede hacer mediante programacion por temas de seguridad) y tendras que hacer un "submit" de ese formulario. Esto significa que la pagina tendra que recargarse, pero segun como lo tengas no te importara. El lado del CGI ni idea, aunque supongo que se podra.

3L_S4N70
25/03/2010, 21:00
Desde html tendras que hacer un <form> con un <input> con type=file. Esto tiene el problema que el usuario debe escoger el fichero (no se puede hacer mediante programacion por temas de seguridad) y tendras que hacer un "submit" de ese formulario. Esto significa que la pagina tendra que recargarse, pero segun como lo tengas no te importara. El lado del CGI ni idea, aunque supongo que se podra.

Gracias tío. Ando bien jorobado con el CGI, porque no sé cómo hacerlo.

Y el caso es que he encontrado una manera de pasar los parámetros al CGI por nombre (con $QUERY_STRING) aunque tengo el problema de que tengo que separarlo del nombre y del igual, pero si me hace falta, ya tengo manera de hacerlo (al margen de ese problemilla).

Ahora, con el input type="file" tengo otro problemilla, parece ser que me manda sólo el nombre del archivo, y no la ruta absoluta (la cojo con el CGI, le hago un echo $QUERY_STRING y me dice: UPLOAD=andaypara.c).

3L_S4N70
30/03/2010, 19:20
Que alguien me eche un cable con PHP. A ver, me he hecho un script sencillito con http://www.4coders.com/index.php?modulo=contenido&op=detalle&tipo=c&id=63
Me he instalado PHP5 (en un PC) y el caso es que me casca un Error 500 como la copa de un pino.
No sé si me falta algo en el script php, me falta algo en el sistema, algo que activar en el servidor... Estoy pez pez.

Agradezco vuestra ayuda. Un saludo

Gammenon
30/03/2010, 19:23
***** ya te echaba de menos! XD

Para tener un servidor web con PHP te recomiendo que te instales el WAMP, te viene todo en un instalador y cuando lo tienes en marcha tienes la garantia que todo esta en orden, tanto apache, mysql como php. A ti te interesa el tema de apache + php. Puedes instalarlo?

juanvvc
30/03/2010, 19:27
el caso es que me casca un Error 500 como la copa de un pino.

Error 500 significa error dentro del servidor. Vamos, que el código PHP ni siquiera ha acabado de ejecutarse. Seguramente tendrás un error sintáctico en el código.

Mira en los logs del servidor web que te dirán la línea exacta donde tienes el error. Si usas Linux y Apache están en /var/log/apache2/error.log o si usas Lighttpd, en /var/log/lighttpd/error.log

Si usas Windows y/o otro servidor, tendrás que mirar en las instrucciones :)

3L_S4N70
31/03/2010, 01:01
***** ya te echaba de menos! XD

Jajaja, qué grande.


Para tener un servidor web con PHP te recomiendo que te instales el WAMP, te viene todo en un instalador y cuando lo tienes en marcha tienes la garantia que todo esta en orden, tanto apache, mysql como php. A ti te interesa el tema de apache + php. Puedes instalarlo?
Ahora estoy con una parte en un PC, para servir una página más general en la que poder subir archivos, y desde la que dar acceso a las páginas alojadas en los servidores de los robots (andaos que no acabe alojado todo lo web en el PC servidor). Tengo instalado Apache (apache2), y hoy he instalado php5. Pero el caso es que como no conozco los enrevesados caminos del PHP, no sé cómo hacer el script, si debe llevar algún encabezado o qué, ni que archviso aparte del .php debe de haber en el servidor (al margen claro del propio PHP instalado).

Miraré el WAMP ese, pero después de probar a ver si lo echo a andar como está.


Error 500 significa error dentro del servidor. Vamos, que el código PHP ni siquiera ha acabado de ejecutarse. Seguramente tendrás un error sintáctico en el código.

Mira en los logs del servidor web que te dirán la línea exacta donde tienes el error. Si usas Linux y Apache están en /var/log/apache2/error.log o si usas Lighttpd, en /var/log/lighttpd/error.log

Si usas Windows y/o otro servidor, tendrás que mirar en las instrucciones :)

Uso Apache sobre Ubuntu, me miraré a ver el error.log. Lo que sea, lo comento (si es que no acabometiéndole el WAMP y dejándome de historias).

Un saludete

< - >
Bueno, me huele a fallo en el script:

Desde error.log
[Tue Mar 30 21:44:18 2010] [error] (8)Exec format error: exec of '/var/www/cgi-bin/recibe.php' failed
[Tue Mar 30 21:44:18 2010] [error] [client 127.0.0.1] Premature end of script headers: recibe.php, referer: http://127.0.0.1/

¿Alguien me puede dejar algún ejemplo de script PHP compelto? Para ver qué debo poner y tal para que se lo trague (o bueno, si véis que el fallo puede ser otro, me decís).

Gracias.

< - >
Señores, no hay manera, no lo veo, no soy capaz de echarlo a andar. Tras mil perrerías, el error no cambia (aunque sí la hora y la fecha :D)

Agradezco cualquier orientación.

Un saludete

^MiSaTo^
31/03/2010, 01:03
Jajaja, qué grande.

Ahora estoy con una parte en un PC, para servir una página más general en la que poder subir archivos, y desde la que dar acceso a las páginas alojadas en los servidores de los robots (andaos que no acabe alojado todo lo web en el PC servidor). Tengo instalado Apache (apache2), y hoy he instalado php5. Pero el caso es que como no conozco los enrevesados caminos del PHP, no sé cómo hacer el script, si debe llevar algún encabezado o qué, ni que archviso aparte del .php debe de haber en el servidor (al margen claro del propio PHP instalado).

Miraré el WAMP ese, pero después de probar a ver si lo echo a andar como está.



Uso Apache sobre Ubuntu, me miraré a ver el error.log. Lo que sea, lo comento (si es que no acabometiéndole el WAMP y dejándome de historias).

Un saludete

< - >
Bueno, me huele a fallo en el script:

Desde error.log
[Tue Mar 30 21:44:18 2010] [error] (8)Exec format error: exec of '/var/www/cgi-bin/recibe.php' failed
[Tue Mar 30 21:44:18 2010] [error] [client 127.0.0.1] Premature end of script headers: recibe.php, referer: http://127.0.0.1/

¿Alguien me puede dejar algún ejemplo de script PHP compelto? Para ver qué debo poner y tal para que se lo trague (o bueno, si véis que el fallo puede ser otro, me decís).

Gracias.

< - >
Señores, no hay manera, no lo veo, no soy capaz de echarlo a andar. Tras mil perrerías, el error no cambia (aunque sí la hora y la fecha :D)

Agradezco cualquier orientación.

Un saludete

Puedes pegar tu script en pastebin o por aquí?

3L_S4N70
31/03/2010, 01:37
Puedes pegar tu script en pastebin o por aquí?

Vergüenza me da, porque ya es una mierda, y he concluido que no sé hacer un script.

Venía a ser algo así en las últimas pruebas (que escupa algo antes de seguir con cosas más avanzadas):

<?php

echo "hola";

?>


Lo que no sé es si eso he de ponerlo a pelo, o con los correspondientes <html> y <body> delante y /detrás. He probado con ambas, y me dice lo mismo. Estoy columpiándome de una manera que no tiene comparación, ¿verdad?

Gammenon
31/03/2010, 08:49
Ese script parace que es correcto. Si estas usando ubuntu, te recomiendo el xamp (el wampp es para windows: windows+apache+mysql+php, la x de xamp como habras deducido es de linuX). Asi el tema de la configuracion apache <--> php lo tienes ya hecho :)

^MiSaTo^
31/03/2010, 10:02
Vergüenza me da, porque ya es una mierda, y he concluido que no sé hacer un script.

Venía a ser algo así en las últimas pruebas (que escupa algo antes de seguir con cosas más avanzadas):

<?php

echo "hola";

?>


Lo que no sé es si eso he de ponerlo a pelo, o con los correspondientes <html> y <body> delante y /detrás. He probado con ambas, y me dice lo mismo. Estoy columpiándome de una manera que no tiene comparación, ¿verdad?

En ese caso es tema del server web. Tienes instalado php y el módulo de apache para php? (que no recuerdo ahora mismo apache-mod-php o algo así, pon php en el apt-get).
Yo no te recomiendo XAMPP (antes se llamaba LAMP o lo he soñado?) porque sinceramente prefiero controlar las cosas yo y configurar Apache + PHP + MySQL es una tontada XD Sólo es instalarlos via apt-get y los módulos correspondientes y fin de la historia.

Uncanny
31/03/2010, 12:09
Bueno, me huele a fallo en el script:

Desde error.log
[Tue Mar 30 21:44:18 2010] [error] (8)Exec format error: exec of '/var/www/cgi-bin/recibe.php' failed
[Tue Mar 30 21:44:18 2010] [error] [client 127.0.0.1] Premature end of script headers: recibe.php, referer: http://127.0.0.1/

No me he podido leer todo el hilo, pero ¿donde estás guardando ese script PHP? por la salida del error diría que en el subdirectorio para GGIs, ¿has probado guardarlo en el directorio configurado como DocumentRoot (/var/www/ posiblemente, mira la config de apache)? Si lo que pretendes es usar scripts PHP como GGIs deberías instalar PHP como binario GGI y no como modulo de Apache, si lo tienes así, y si tienes el directorio de CGI-BIN correctamente configurado, posiblemente te falte en la config de Apache ciertas directivas:


AddHandler cgi-script .php
AddType text/html .php


Más info: http://www.devside.net/articles/php


Yo no te recomiendo XAMPP (antes se llamaba LAMP o lo he soñado?) porque sinceramente prefiero controlar las cosas yo y configurar Apache + PHP + MySQL es una tontada XD Sólo es instalarlos via apt-get y los módulos correspondientes y fin de la historia.Pues si, XAMPP es mejor usarlo solo en Windows, en Linux es preferible hacer uso del sistema de paquetería de la distro en cuestión, que en el caso de Ubuntu y Debian está bien surtido, eso o compilartelo todo tu mismo (que es lo que suelo hacer yo, por temas de optimización y control).

Ah, y si, estás en lo correcto, antes el XAMPP para Linux (http://www.apachefriends.org/en/xampp-linux.html) lo llamaban LAMPP, pero lo cambiaron para evitar confusiones (LAMPP != LAMP)

3L_S4N70
03/04/2010, 22:53
Hola de nuevo. Mil gracias a los tres por vuestras respuestas.
Al final venía a ser lo que me dijo Misato, me hacía falta instalar el módulo php para el Apache (un poco despistado ya fui, jaja), es decir, el libapache2-mod-php5.

Ojito porque por error instale una cosa llamada phpMyAdmin, que es para MySQL, y a poco la lío, mil problemas para desinstalar y toda la pesca, pero ya lo tengo.

Ahora os quiero plantear una duda que tengo. Mirad, cuando ejecuto el script php correpsondiente, subo un archivo a la carpeta que le indico del servidor, y me aparece la información (que le indique por ejemplo a través de "echo") en una nueva página. Mi idea es subir un archivo .c, que automáticamente sea compilado, y que por ejemplo aparezca el "output" de la compilación (quiero decir, los errores o "warnings") en una caja de texto como en la que se escirben los post en el foro (pero de las que no s pueden modificar, supongo que eso será sencillamente darle los atributos pertinentes), y a su vez cargue una página (desde la que se podrá decir a la máquina que ejecute el programa compilado, desde otro script) si ha habido éxito, o vuelva atrás si ha habido error (esto podría ser por medio de un botón de siguiente en función de error o no en el programa).

Bien, mi mayor problema ahora es cómo hacer que directamente compile el programa subido (osea, lanzar otro script automáticamente); aunque me viene a la cabeza que seguramente me dé problemas el tema de coger el nombre del .c para compilar en el script, o saber si me ha dado error o no al compilar para que permita cargar el programa o no (aunque supongo que esto último también puedo hacerlo con dos botones y dejarme de historias, ya comprobaré si hay programa o no).

No sé si me he explicado muy bien.

Mil gracias de antemano.

< - >
Bien, me he enzarzado con ello, y a mi manera, ya tengo la compilación del archivo .c y la generación de un archivo de errores; todo desde el botón de enviar el archivo para subirlo. Paso siguiente: que me abra una página html con el informe de errores (si lo hubiera) y de posibilidad de volver atrás a poder subir otro archivo, o hacia alante y ya permita cargarlo, etc.
Me da la sensación de que el hecho de que al cambiar de página se acuerde del nombre del archivo compilado va a ser un asunto, así que salvo que me lo indiquéis de otra manera, lo haré con selección manual.

Un saludo