librelist archives

« back to archive

Consulta variables en argumentos de funciones

Consulta variables en argumentos de funciones

From:
Carlos Pantelides
Date:
2013-04-18 @ 22:24
Estimad@s:

Antes que nada, perdonen si no soy claro, pero aunque tengo bastante claro
el problema y la solución en términos generales, me cuesta muchísimo 
expresarlo de modo sencillo, lo cual paradójicamente me hace sospechar 
acerca de esa supuesta claridad.

En mi limitada comprensión, percibo que lo que quiero no se puede hacer 
como quiero, sin embargo, pregunto.

Querria usar variables en el pattern matching de las claúsulas.

La mejor POC que hallé es replicar el comportamiento[1] de este programa awk[2]

En cierto modo lo que querría es pasar de:

process(1, Id) ->
   hacer algo con Id;
process(2, Id) ->
   hacer algo con Id.

a

process(Actual, Proximo, Id) ->
   que Actual sea Proximo,
   hacer algo con Id.

Si fuera un ABM, sería algo asi:

process(alta, Id) ->
  hacer desaparecer process(alta,Id),
  crear process(modificacion,Id) que puede invocarse múltiples veces,
  crear process(baja,Id) que al ejecutarse hace desaparecer baja y 
modificacion y recrea alta.

Aunque la forma específica que me interesa es esta última, tambien acepto 
gustoso sugerencias de como hacerlo de otras maneras. Ya sé que en general
no esta bien visto el self-modifying code, pero...




Gracias anticipadas

[1] Ejecución

INICIO
2 3
1 2
aceptado 1 y esperando 2
2 3
aceptado 2 y esperando 3
3 4
aceptado 3 y esperando 4
4 7
aceptado 4 y esperando 7
7 1
aceptado 7 y esperando 1
7
3
4
1 4
aceptado 1 y esperando 4
8
FIN

[2] código awk

#!/bin/awk -f
BEGIN {
    print "INICIO";
    inicio = 1;
    pattern = inicio ;
    fin = 8;
}
($0 ~ fin ".+") {
    exit
}
($0 ~ pattern ".+") {
    print "aceptado " $1 " y esperando " $2
    pattern = $2;
}
END {
    print "FIN";
}
Carlos Pantelides

@dev4sec

http://seguridad-agile.blogspot.com/

Re: [erlar] Consulta variables en argumentos de funciones

From:
Ale
Date:
2013-04-19 @ 03:37
El 18 de abril de 2013 19:24, Carlos Pantelides <carlos_pantelides@yahoo.com
> escribió:

> Estimad@s:
>
> Antes que nada, perdonen si no soy claro, pero aunque tengo bastante claro
> el problema y la solución en términos generales, me cuesta muchísimo
> expresarlo de modo sencillo, lo cual paradójicamente me hace sospechar
> acerca de esa supuesta claridad.
>
> En mi limitada comprensión, percibo que lo que quiero no se puede hacer
> como quiero, sin embargo, pregunto.
>
> Querria usar variables en el pattern matching de las claúsulas.
>
> La mejor POC que hallé es replicar el comportamiento[1] de este programa
> awk[2]
>
> En cierto modo lo que querría es pasar de:
>
> process(1, Id) ->
>    hacer algo con Id;
> process(2, Id) ->
>    hacer algo con Id.
>
> a
>
> process(Actual, Proximo, Id) ->
>    que Actual sea Proximo,
>    hacer algo con Id.
>
> process(Actual, Proximo, Id) ->
    case Actual =:= Proximo ->
           true -> Id;
           false -> ok
     end.


La verdad no entendi bien cual es el problema, mostranos lo que hiciste con
Erlang.

Re: [erlar] Consulta variables en argumentos de funciones

From:
Carlos Pantelides
Date:
2013-04-24 @ 01:08
Releyendo Erlang and OTP in action recordé closures.

Si esto funcionara bien, sería exactamente lo que andaba buscando:

-module(dispatcher).
-export([dispatch/4]).
dispatch(LanSrcMac,L

Re: [erlar] Consulta variables en argumentos de funciones

From:
Carlos Pantelides
Date:
2013-04-24 @ 01:08
Releyendo Erlang and OTP in action recordé closures.

Si esto funcionara bien, sería exactamente lo que andaba buscando:

-module(dispatcher).
-export([dispatch/4]).
dispatch(LanSrcMac,LanDstMac,LanSrcIp,LanDstIp) ->
    fun(LanSrcMac,DstMac,LanSrcIp,DstIp) ->
       io:fwrite("Traffic from here (~w ~w) out to ~w ~w~n",
      [LanSrcMac, LanSrcIp,DstMac,DstIp]);
    (SrcMac, LanDstMac, SrcIp, LanDstIp) ->
       io:fwrite("Traffic to here (~w ~w) from ~w ~w~n",
       [SrcMac, SrcIp,LanDstMac,LanDstIp]);
    (SrcMac, DstMac, SrcIp, DstIp) ->
       io:fwrite("Internal traffic from ~w ~w to ~w ~w~n",
       [SrcMac, SrcIp,DstMac,DstIp])
    end.

El uso sería:


5> F=dispatcher:dispatch(lanSrcMac,lanDstMac,lanSrcIp,lanDstIp).
#Fun<dispatcher.0.8003314>
6>  F(lanSrcMac,otherDstMac,lanScrIp,otherDstIp).
Traffic from here (lanSrcMac lanScrIp) out to otherDstMac otherDstIp
ok


El problema es que...

4> c(dispatcher).
dispatcher.erl:3: Warning: variable 'LanDstIp' is unused
dispatcher.erl:3: Warning: variable 'LanDstMac' is unused
dispatcher.erl:3: Warning: variable 'LanSrcIp' is unused
dispatcher.erl:3: Warning: variable 'LanSrcMac' is unused
dispatcher.erl:4: Warning: variable 'LanSrcIp' shadowed in 'fun'
dispatcher.erl:4: Warning: variable 'LanSrcMac' shadowed in 'fun'
dispatcher.erl:6: Warning: this clause cannot match because a previous 
clause at line 4 always matches
dispatcher.erl:6: Warning: variable 'LanDstIp' shadowed in 'fun'
dispatcher.erl:6: Warning: variable 'LanDstMac' shadowed in 'fun'
dispatcher.erl:8: Warning: this clause cannot match because a previous 
clause at line 4 always matches
{ok,dispatcher}

Evidentemente o no termino de entender closures o solo hace el binding con
valores, lo cual suena razonable.

Mala suerte, probaré con otros enfoques, gracias a todos.

Carlos Pantelides



@dev4sec



http://seguridad-agile.blogspot.com/

Re: [erlar] Consulta variables en argumentos de funciones

From:
Gabriel Osorio
Date:
2013-04-24 @ 04:09
Copia esto en el shell.

Sum = fun([], _) -> 0; ([H | T], F) -> H + F(T, F) end,
Sum([1,2,3], Sum).





2013/4/23 Carlos Pantelides <carlos_pantelides@yahoo.com>

> Releyendo Erlang and OTP in action recordé closures.
>
> Si esto funcionara bien, sería exactamente lo que andaba buscando:
>
> -module(dispatcher).
> -export([dispatch/4]).
> dispatch(LanSrcMac,LanDstMac,LanSrcIp,LanDstIp) ->
>     fun(LanSrcMac,DstMac,LanSrcIp,DstIp) ->
>        io:fwrite("Traffic from here (~w ~w) out to ~w ~w~n",
>       [LanSrcMac, LanSrcIp,DstMac,DstIp]);
>     (SrcMac, LanDstMac, SrcIp, LanDstIp) ->
>        io:fwrite("Traffic to here (~w ~w) from ~w ~w~n",
>        [SrcMac, SrcIp,LanDstMac,LanDstIp]);
>     (SrcMac, DstMac, SrcIp, DstIp) ->
>        io:fwrite("Internal traffic from ~w ~w to ~w ~w~n",
>        [SrcMac, SrcIp,DstMac,DstIp])
>     end.
>
> El uso sería:
>
>
> 5> F=dispatcher:dispatch(lanSrcMac,lanDstMac,lanSrcIp,lanDstIp).
> #Fun<dispatcher.0.8003314>
> 6>  F(lanSrcMac,otherDstMac,lanScrIp,otherDstIp).
> Traffic from here (lanSrcMac lanScrIp) out to otherDstMac otherDstIp
> ok
>
>
> El problema es que...
>
> 4> c(dispatcher).
> dispatcher.erl:3: Warning: variable 'LanDstIp' is unused
> dispatcher.erl:3: Warning: variable 'LanDstMac' is unused
> dispatcher.erl:3: Warning: variable 'LanSrcIp' is unused
> dispatcher.erl:3: Warning: variable 'LanSrcMac' is unused
> dispatcher.erl:4: Warning: variable 'LanSrcIp' shadowed in 'fun'
> dispatcher.erl:4: Warning: variable 'LanSrcMac' shadowed in 'fun'
> dispatcher.erl:6: Warning: this clause cannot match because a previous
> clause at line 4 always matches
> dispatcher.erl:6: Warning: variable 'LanDstIp' shadowed in 'fun'
> dispatcher.erl:6: Warning: variable 'LanDstMac' shadowed in 'fun'
> dispatcher.erl:8: Warning: this clause cannot match because a previous
> clause at line 4 always matches
> {ok,dispatcher}
>
> Evidentemente o no termino de entender closures o solo hace el binding con
> valores, lo cual suena razonable.
>
> Mala suerte, probaré con otros enfoques, gracias a todos.
>
>
> Carlos Pantelides
>
> @dev4sec
>
> http://seguridad-agile.blogspot.com/
>
>

Re: [erlar] Consulta variables en argumentos de funciones

From:
Carlos Pantelides
Date:
2013-04-19 @ 21:51
>> La verdad no entendi bien cual es el problema, mostranos lo que hiciste
con Erlang.

No hice nada aun con erlang

Lo de la máquina de estados parece ser la idea apropiada, investigaré como
adaptarla a mi necesidad.

Muchas gracias por vuestra colaboración.

Para los curiosos:

Quiero recibir paquetes en una interfaz de red y tomar distintas 
decisiones según las mac addresses, por ejemplo en pseudo erlang:

process(01:16:ba:64:e3:ba, DstMac, Payload) ->
   hacer algo con Dst y Payload

donde 01:16:ba:64:e3:ba sea configurable, no quiero recompilar.


puse el ejemplo en awk pues hace exactamente lo que quiero.


Carlos Pantelides



@dev4sec



http://seguridad-agile.blogspot.com/

--- On Fri, 4/19/13, Ale <peralta.alejandro@gmail.com> wrote:

From: Ale <peralta.alejandro@gmail.com>
Subject: Re: [erlar] Consulta variables en argumentos de funciones
To: erlar@librelist.com
Date: Friday, April 19, 2013, 12:37 AM




El 18 de abril de 2013 19:24, Carlos Pantelides 
<carlos_pantelides@yahoo.com> escribió:


Estimad@s:



Antes que nada, perdonen si no soy claro, pero aunque tengo bastante claro
el problema y la solución en términos generales, me cuesta muchísimo 
expresarlo de modo sencillo, lo cual paradójicamente me hace sospechar 
acerca de esa supuesta claridad.





En mi limitada comprensión, percibo que lo que quiero no se puede hacer 
como quiero, sin embargo, pregunto.



Querria usar variables en el pattern matching de las claúsulas.



La mejor POC que hallé es replicar el comportamiento[1] de este programa awk[2]



En cierto modo lo que querría es pasar de:



process(1, Id) ->

   hacer algo con Id;

process(2, Id) ->

   hacer algo con Id.



a



process(Actual, Proximo, Id) ->

   que Actual sea Proximo,

   hacer algo con Id.


process(Actual, Proximo, Id) ->
    case Actual =:= Proximo ->
           true -> Id;
           false -> ok
     end.




La verdad no entendi bien cual es el problema, mostranos lo que hiciste 
con Erlang.

Re: [erlar] Consulta variables en argumentos de funciones

From:
Carlos Pantelides
Date:
2013-04-20 @ 01:38
Gabriel:

>Algo como:Tengo una lista de MAC address y en otro lado tengo un 
diccionario de acciones de acuerdo a ese key?

esa es probablemente la implementación que haré. Pero quería descartar que
me lo resolviera el lenguaje como lo hace awk.

grax


Re: [erlar] Consulta variables en argumentos de funciones

From:
Gabriel Osorio
Date:
2013-04-20 @ 04:27
En awk tienes listas asociativas y tuberías. Erlang tiene listas, tuplas y
actores.
Piensa en un actor como una tubería con buzón de correo. Si quieres que
haga algo le mandas un mensaje, el actor (proceso) leerá mensaje y
ejecutará la acción.

Lo bueno de pensar así es que cada proceso será independiente (o
concurrente), de manera que si una MAC address no responde o se demora, las
otras no se verán afectadas.

En este link se explica como hacer esos actores o procesos concurrentes (la
palabra mágica es "spawn"):
http://www.erlang.org/doc/getting_started/conc_prog.html

Este ejemplo no tiene "spawn", pero está en español:

http://aprendiendo-erlang.blogspot.com/2011/06/comunicacion-entre-procesos-ping-pong.html

Luego de leer los ejemplos vas a notar que cada proceso tiene un Process
Identifier (PID) que se puede guardar.
Por lo tanto tu última aclaración indica que el problema se puede resolver
conservando un diccionario con asociaciones a identificadores de proceso
(previamente lanzados con "spawn") y al recibir un evento, mandar un
mensaje al Pid asociado.




El 19 de abril de 2013 20:38, Carlos Pantelides <carlos_pantelides@yahoo.com
> escribió:

> Gabriel:
>
> >Algo como:Tengo una lista de MAC address y en otro lado tengo un
> diccionario de acciones de acuerdo a ese key?
>
> esa es probablemente la implementación que haré. Pero quería descartar que
> me lo resolviera el lenguaje como lo hace awk.
>
> grax
>
>
>
>

Re: [erlar] Consulta variables en argumentos de funciones

From:
Carlos Pantelides
Date:
2013-04-19 @ 23:24
Para los curiosos:

Perdón, me quedó algo incompleto. Mi idea no es necesariamente leer de la 
red, probablemente use tcpdump o tshark y envié a un archivo y de ahi lo 
levante con tail.

El asunto es que dependiendo de las mac address de entrada y salida tengo 
que tomar distintas acciones, ahi es donde entra mi planteo original. 

Carlos "No aclares que oscurece" Pantelides



@dev4sec



http://seguridad-agile.blogspot.com/

--- On Fri, 4/19/13, Ale <peralta.alejandro@gmail.com> wrote:

From: Ale <peralta.alejandro@gmail.com>
Subject: Re: [erlar] Consulta variables en argumentos de funciones
To: erlar@librelist.com
Date: Friday, April 19, 2013, 12:37 AM




El 18 de abril de 2013 19:24, Carlos Pantelides 
<carlos_pantelides@yahoo.com> escribió:


Estimad@s:



Antes que nada, perdonen si no soy claro, pero aunque tengo bastante claro
el problema y la solución en términos generales, me cuesta muchísimo 
expresarlo de modo sencillo, lo cual paradójicamente me hace sospechar 
acerca de esa supuesta claridad.





En mi limitada comprensión, percibo que lo que quiero no se puede hacer 
como quiero, sin embargo, pregunto.



Querria usar variables en el pattern matching de las claúsulas.



La mejor POC que hallé es replicar el comportamiento[1] de este programa awk[2]



En cierto modo lo que querría es pasar de:



process(1, Id) ->

   hacer algo con Id;

process(2, Id) ->

   hacer algo con Id.



a



process(Actual, Proximo, Id) ->

   que Actual sea Proximo,

   hacer algo con Id.


process(Actual, Proximo, Id) ->
    case Actual =:= Proximo ->
           true -> Id;
           false -> ok
     end.




La verdad no entendi bien cual es el problema, mostranos lo que hiciste 
con Erlang.

Re: [erlar] Consulta variables en argumentos de funciones

From:
Gabriel Osorio
Date:
2013-04-20 @ 00:03
Algo como:
Tengo una lista de MAC address y en otro lado tengo un diccionario de
acciones de acuerdo a ese key?


El 19 de abril de 2013 18:24, Carlos Pantelides <carlos_pantelides@yahoo.com
> escribió:

> Para los curiosos:
>
> Perdón, me quedó algo incompleto. Mi idea no es necesariamente leer de la
> red, probablemente use tcpdump o tshark y envié a un archivo y de ahi lo
> levante con tail.
>
> El asunto es que dependiendo de las mac address de entrada y salida tengo
> que tomar distintas acciones, ahi es donde entra mi planteo original.
>
> Carlos "No aclares que oscurece" Pantelides
>
>
>
> @dev4sec
>
>
>
> http://seguridad-agile.blogspot.com/
>
> --- On Fri, 4/19/13, Ale <peralta.alejandro@gmail.com> wrote:
>
> From: Ale <peralta.alejandro@gmail.com>
> Subject: Re: [erlar] Consulta variables en argumentos de funciones
> To: erlar@librelist.com
> Date: Friday, April 19, 2013, 12:37 AM
>
>
>
>
> El 18 de abril de 2013 19:24, Carlos Pantelides <
> carlos_pantelides@yahoo.com> escribió:
>
>
> Estimad@s:
>
>
>
> Antes que nada, perdonen si no soy claro, pero aunque tengo bastante claro
> el problema y la solución en términos generales, me cuesta muchísimo
> expresarlo de modo sencillo, lo cual paradójicamente me hace sospechar
> acerca de esa supuesta claridad.
>
>
>
>
>
> En mi limitada comprensión, percibo que lo que quiero no se puede hacer
> como quiero, sin embargo, pregunto.
>
>
>
> Querria usar variables en el pattern matching de las claúsulas.
>
>
>
> La mejor POC que hallé es replicar el comportamiento[1] de este programa
> awk[2]
>
>
>
> En cierto modo lo que querría es pasar de:
>
>
>
> process(1, Id) ->
>
>    hacer algo con Id;
>
> process(2, Id) ->
>
>    hacer algo con Id.
>
>
>
> a
>
>
>
> process(Actual, Proximo, Id) ->
>
>    que Actual sea Proximo,
>
>    hacer algo con Id.
>
>
> process(Actual, Proximo, Id) ->
>     case Actual =:= Proximo ->
>            true -> Id;
>            false -> ok
>      end.
>
>
>
>
> La verdad no entendi bien cual es el problema, mostranos lo que hiciste
> con Erlang.
>
>
>

Re: [erlar] Consulta variables en argumentos de funciones

From:
Manuel A. Rubio \"Bombadil\"
Date:
2013-04-19 @ 08:50
Hola,

esto lo puedes realizar con una FSM, partes de un estado inicial y 
según los nuevos datos de entrada haces algo y modificas a otro estado. 
Si son 8 estados los que vas a tener, se pueden realizar funciones de 
tipo:

estado1(...) -> ...
estado2(...) -> ...
estado...

Si los estados son variables y puede haber tantos como haya e incluso 
tienen un ciclo de vida, quizás sea mejor que cada elemento numerado sea 
en sí una FSM independiente con los estados "alta", "modificacion" y 
"baja".

Un ejemplo de FSM:

http://bosqueviejo.net/2011/08/03/fsm-maquina-de-estados-en-erlang/

Un saludo.

El 2013-04-19 00:24, Carlos Pantelides escribió:
> Estimad@s:
>
> Antes que nada, perdonen si no soy claro, pero aunque tengo bastante
> claro el problema y la solución en términos generales, me cuesta
> muchísimo expresarlo de modo sencillo, lo cual paradójicamente me 
> hace
> sospechar acerca de esa supuesta claridad.
>
> En mi limitada comprensión, percibo que lo que quiero no se puede
> hacer como quiero, sin embargo, pregunto.
>
> Querria usar variables en el pattern matching de las claúsulas.
>
> La mejor POC que hallé es replicar el comportamiento[1] de este
> programa awk[2]
>
> En cierto modo lo que querría es pasar de:
>
> process(1, Id) ->
>    hacer algo con Id;
> process(2, Id) ->
>    hacer algo con Id.
>
> a
>
> process(Actual, Proximo, Id) ->
>    que Actual sea Proximo,
>    hacer algo con Id.
>
> Si fuera un ABM, sería algo asi:
>
> process(alta, Id) ->
>   hacer desaparecer process(alta,Id),
>   crear process(modificacion,Id) que puede invocarse múltiples veces,
>   crear process(baja,Id) que al ejecutarse hace desaparecer baja y
> modificacion y recrea alta.
>
> Aunque la forma específica que me interesa es esta última, tambien
> acepto gustoso sugerencias de como hacerlo de otras maneras. Ya sé 
> que
> en general no esta bien visto el self-modifying code, pero...
>
>
>
>
> Gracias anticipadas
>
> [1] Ejecución
>
> INICIO
> 2 3
> 1 2
> aceptado 1 y esperando 2
> 2 3
> aceptado 2 y esperando 3
> 3 4
> aceptado 3 y esperando 4
> 4 7
> aceptado 4 y esperando 7
> 7 1
> aceptado 7 y esperando 1
> 7
> 3
> 4
> 1 4
> aceptado 1 y esperando 4
> 8
> FIN
>
> [2] código awk
>
> #!/bin/awk -f
> BEGIN {
>     print "INICIO";
>     inicio = 1;
>     pattern = inicio ;
>     fin = 8;
> }
> ($0 ~ fin ".+") {
>     exit
> }
> ($0 ~ pattern ".+") {
>     print "aceptado " $1 " y esperando " $2
>     pattern = $2;
> }
> END {
>     print "FIN";
> }
> Carlos Pantelides
>
> @dev4sec
>
> http://seguridad-agile.blogspot.com/

-- 
Manuel A. Rubio "Bombadil"
Usuario de GNU/Linux #323628 acorde a http://counter.li.org/
Técnico en Admin. Sistemas Informáticos

Re: [erlar] Consulta variables en argumentos de funciones

From:
Mariano Guerra
Date:
2013-04-19 @ 07:09
Quoting Carlos Pantelides (2013-04-19 00:24:47)
> Estimad@s:
> 
> Antes que nada, perdonen si no soy claro, pero aunque tengo bastante 
claro el problema y la solución en términos generales, me cuesta muchísimo
expresarlo de modo sencillo, lo cual paradójicamente me hace sospechar 
acerca de esa supuesta claridad.
> 
> En mi limitada comprensión, percibo que lo que quiero no se puede hacer 
como quiero, sin embargo, pregunto.
> 
> Querria usar variables en el pattern matching de las claúsulas.
> 
> La mejor POC que hallé es replicar el comportamiento[1] de este programa awk[2]
> 
> En cierto modo lo que querría es pasar de:
> 
> process(1, Id) ->
>    hacer algo con Id;
> process(2, Id) ->
>    hacer algo con Id.
> 
> a
> 
> process(Actual, Proximo, Id) ->
>    que Actual sea Proximo,
>    hacer algo con Id.
> 
> Si fuera un ABM, sería algo asi:
> 
> process(alta, Id) ->
>   hacer desaparecer process(alta,Id),
>   crear process(modificacion,Id) que puede invocarse múltiples veces,
>   crear process(baja,Id) que al ejecutarse hace desaparecer baja y 
modificacion y recrea alta.
> 
> Aunque la forma específica que me interesa es esta última, tambien 
acepto gustoso sugerencias de como hacerlo de otras maneras. Ya sé que en 
general no esta bien visto el self-modifying code, pero...

vos queres que en un principio acepte solo altas para un id y luego solo 
modificacion y baja?

por lo que entiendo no queres aceptar estados invalidos (es decir no aceptar
dos altas del mismo id), estoy en lo correcto?

en ese caso una maquina de estados es lo que necesitas.

http://www.erlang.org/doc/man/gen_fsm.html