MV Coders on fire

elkaoD

#141 #150 pues yo mantengo que la lista de nicks no necesita de mutex porque sólo la gestiona un hilo: el de entrada al servidor. No hay ningún otro hilo que acceda concurrentemente a la lista de nicks (excepto para enviarla a los clientes en sus respectivos hilos, en cuyo caso, siendo inmutable, no se necesitan mutex.)

Si la lista es mutable, desde luego que se necesitan mutex... pero creo que las listas son inmutables por defecto en casi todos los lenguajes, ¿no? (a lo mejor simplemente estoy demasiado acostumbrado a trabajar en funcional últimamente...)

Ojo, esto sólo en la arquitectura que hay en mi cabeza. Supongo que te lo puedes montar perfectamente para que sí necesites mutexes. En mi idea no distingo entre usuario logueado y sin loguear (excepto que los logueados tienen un nick asociado y sí se imprimen.) Si usas una lista de nicks en sí misma, entonces sí necesitas mutex para que el hilo cliente notifique que la conexión se debe añadir a la lista de logueados.

B

Propongo dar dos semanas para este. No es taaan trivial (o al menos una semana a partir de ahora).

Que diga #1.

m3l0

algún tutorial sobre sockets para c++?

Khanser

Bueno, pues si quereis alargamos el Sprint al día 7. No problem. Más tarde actualizo #1 con la info del kata

Gantorys

He hecho el de los números romanos en C (no conocía este post). Creo que funciona bien.

Números romanos en C
elkaoD

Por circunstancias de la vida he hecho el de los números romanos de nuevo, ahora en Clojure y con una aproximación distinta. ¡OJO! Es code golf así que no se lee una mierda xD

Números romanos en Clojure

EDIT:
Y lo mismo pero al revés:

Romanos a entero en Clojure (code golf total)
1 2 respuestas
B

#156: Eres un perroflauta de la programación, ahí lo dejo xDDD

B

Alguien me puede echar una mano con expresiones regulares?

#159: Vale gracias, si quiero sacar texto entre dos caracteres, cómo puedo hacer?

Por ejemplo, en el caso de N:Nick:NewNick. Imagínate que quiero sacar Nick y NewNick, es posible?

2 respuestas
EnZo

#158 Loco es un maquina. Y yo me defiendo un poco. Pregunta.

1 respuesta
A

#158 Lo importante es saber en qué lenguaje quieres hacerlo. En C++ es relativamente sencillo usando la librería boost y la función split.

std::string entrada( "Nick:NewNick" );
std::vector<std::string> partes;
boost::split ( partes, entrada, boost::is_any_of( ":" ));

En otros lenguajes que manejan más directamente expresiones regulares te será más sencillo hacer todo esto.

Venga, un saludo! :)

1 respuesta
B

#160: Gracias por contestar, estoy con java y tengo que usar las regex.

Por ejemplo, para comprobar lo de N:Nick:Newnick:

clientMessage.matches("N:.*:.*")

#162: Menudo retrasado soy

Si de hecho es lo que solía usar, pero estaba empecinado en utilizar las regex para ambas cosas. Como si hubiera alguna forma de pasar un scanner y que te fuera eliminando lo que no te interesaba.

Cabezonería. Gracias.

2 respuestas
A

#161 pero no entiendo qué quieres hacer. Si tienes una expresión regular que sigue determinado patrón, pero quieres dividirla tienes que hacer tú ese proceso de división, porque la expresión regular no conoce esa información, sino la estructura de las cadenas que conforman el conjunto generable.
Si quieres hacer un split tienes que usar los que ya hay y adaptarlos a tu gusto.

En la web de Java he encontrado esto, que lo mismo te interesa:
Using the split(String) Method

The split method is a great tool for gathering the text that lies on either side of the pattern that's been matched. As shown below in SplitDemo.java, the split method could extract the words "one two three four five" from the string "one:two:three:four:five":

import java.util.regex.Pattern;
import java.util.regex.Matcher;

public class SplitDemo {

private static final String REGEX = ":";
private static final String INPUT =
    "one:two:three:four:five";

public static void main(String[] args) {
    Pattern p = Pattern.compile(REGEX);
    String[] items = p.split(INPUT);
    for(String s : items) {
        System.out.println(s);
    }
}

}
OUTPUT:

one
two
three
four
five

1 respuesta
EnZo

#161 Yo tambien tenia pensado usar alguna funcion tipo split para separar los parametros de cada instruccion. De todas formas la regexp que tendrias que usar sería algo así:

/N:([^:]+):([^:]+)/
Isotoperd

Split parece mas comodo para lo que quieres hacer, los filtras eliminando todos los ":" y luego ya lo controlas como quieras.

B

¿Cómo vais?

Yo he empezado esta tarde y aunque no estoy muy convencido acerca de algunas decisiones de diseño, poco a poco va yendo la cosa. Espero acabar con algo de tiempo para mejorar el proyecto.

De momento solo tengo login, cambio de nick, mensaje a canal y lista de usuarios. Supongo que para la semana implementaré el resto. Usaré varios códigos de error que quizás no coincidan con los vuestros pero bueno, eso puede cambiarse.

1 respuesta
LOc0

Viendo el código de #156 me siento un poco como:

spoiler

Salu2 ;)

eisenfaust

Yo creo que el code golf en cuanto te sales de C o Perl pierde toda la gracia xD

1 respuesta
EnZo

#165 Cuando dices login te refieres a conectarte?
Y en cuanto a los codigos de error si hay algunos generales compartelos y vamos haciendo la lista de codigos de error entre todos.

Nucklear

Yo como no quiero el trabajo hecho voy a hacerlo como pienso que se debe y si sale una p**a mierda, me corregis y lo repito.

EDIT:

DUDA: ¿Como vais a almacenar la lista de usuarios?

2 respuestas
zoeshadow

#169 Almacenala en memoria ¿no?, sino ya es complicarse la vida xD

2 respuestas
Khanser

#169 Eso no es una pregunta técnica, es más una decisión de diseño. No sería justo que alguien te explicase como lo ha hecho él porque entonces acabaríamos teniendo codigo parecido :)

Otra cosa sería preguntar si es mejor almacenar usuarios indexando por inetaddress, mac, dirección remota, problemas asociados y cosas así :)

#170 se debe referir a la estructura de datos donde guardarla.

1 respuesta
Nucklear

#170 ¿Entonces almacenas una lista y cada vez que alguien se desconecte la recorres y eliminas al usuario que ya no está?

#171 Vale entonces no he dicho nada, pensé que ibamos a hacerlo todos con un patron de diseño básico.

2 respuestas
A

#172, a no ser que necesites recorrer la lista por algún motivo para qué vas a usar una lista. Consejo: Tabla Hash o Dispersa, que no sé cómo las llamáis xD.

Un saludo.

1 respuesta
Khanser

#172 Los patrones de diseño también son decisiones de diseño y cada uno debería poder aportar su punto de vista, porque aunque no lo parezca, hay cosas que acaban pudiéndose hacer de diferente manera con resultado similar, aunque el punto de vista sea un Array, o una multilista enlazada con tablas de hash y árboles de búsqueda o lo que sea :)

2 respuestas
Nucklear

#173 Bueno dije lista pero porque no lo había pensado un poco, yo a eso lo llamo diccionarios.

#174 Pues repito lo dicho en #169, si sale una cagada ya me corregireis xD

B

#174: Te voy a acabar dando la razón.

Aunque el tema de la concurrencia me parece muy sencillo, reconozco que para alguien que no haya trabajado nunca con sockets esto puede ser demasiado.

Nos desfasamos un poco, si pensamos en los novatos.

#177: Con mysql es muy fácil, con oracle ni idea. Pero vas a usar una BD para este proyecto? Ya es mucho desfasarse eh :(

#178: xDDDDDDDDDD

2 respuestas
B1x1t0

¿Alguien sabe de alguna web donde 'expliquen' decentemente como se usa PHP + oracle? Es que no encuentro nada decente... :(
edit: #176 es por curiosidad la verdad, pero si eso abrire un nuevo hilo jaja, pero la pereza..:P

1 respuesta
Khanser

#176

1 respuesta
Nucklear

Tengo una duda y no se si me estoy liando.

Tengo el servidor que tiene un listener que recibe hasta 10 conexiones.

Del lado del cliente hago la conexión correctamente y antes de entrar al chat pido al usuario que se identifique. ¿Como hago para que el servidor le conteste y en caso de que ya esté registrado le vuelva a pedir autentificación?

1 respuesta
B

#179: Yo no estoy manejando registros la verdad (si tengo tiempo quizás lo haga, pero es que estoy liadísimo estos días).

Pero a ver, si haces una conexión TCP, cuando el socket servidor escucha te devuelve una referencia al socket para contestarle al cliente.

Y si ya está registrado, la primera vez que se conecte, que te mande algo así como N:MyNick:MyPassword (lo suyo sería que la almacenaras hasheada y que se te enviase así).

1 respuesta