Jugando con el comando top (GNU/Linux)

GNU/Linux No Comments

top es una herramienta bastante útil para manejar procesos del sistema, me refiero a GNU/Linux :) (para variar jeje). Para quieres no sepan de que estoy hablando, les presento a top (pequeñas modificaciones respecto a la presentación predeterminada):

_top.png

Como ven muestra bastante información :), algunos de los campos que considero más importantes:

top - 11:42:00 up 16:37, 4 users, load average: 0.36, 0.35, 0.43

Muestra cuanto tiempo lleva prendido el sistema, además del número de usuarios conectados a la misma (en consolas “tty”, consolas virtuales “pts”, etc)

Tasks: 101 total, 1 running, 98 sleeping, 0 stopped, 2 zombie

El número total de procesos (101), cuantos activos (1), cuantos dormidos (98), cuantos parados (0) y cuantos zombies(2)..

Mem: 1294344k total, 838488k used, 455856k free, 127804k buffers

Información sobre el estado de la memoria RAM en kb, el total (1.29 GB aprox.), cuanta usada (usada y en buffer, 838 MB aprox.), libre (455 MB aprox.) y en buffers (127 MB aprox.).

Swap: 546168k total, 179888k used, 366280k free, 339480k cached

Lo mismo que para la memoria RAM pero ahora para la swap (memoria virtual en disco).

Columnas:

PID: Identificador del proceso (es como el nick XD)..

USER: Usuario que ha ejecutado el proceso.

PR: Prioridad del proceso en el sistema.

NI: Valor nice del proceso (si son negativos; tienen mayor prioridad, si son positivos; menos prioridad).

RES: Memoria RAM ocupada por el proceso.

%CPU: Porcentaje ocupado de la CPU

TIME+: Cuanto tiempo lleva el proceso en el sistema.

COMMAND: Nombre del procesos y sus parametros.

PPID: PID del proceso padre.

UID: ID del usuario que ha ejecutado el proceso.

Ya que sabemos más o menos lo que nos muestra top, podemos hacer algunas par de cosas más sobre la administración de los procesos (donde empieza la diversión XD).

1) Podemos activar/desactivar la linea de uptime con “l”.

Tasks: 101 total,   3 running,  96 sleeping,   0 stopped,   2 zombie
Cpu(s):  4.7%us,  1.3%sy,  0.0%ni, 90.8%id,  0.0%wa,  0.1%hi,  3.1%si,  0.0%st
Mem:   1294344k total,   846200k used,   448144k free,   128808k buffers
Swap:   546168k total,   179652k used,   366516k free,   340452k cached

2) Podemos activar/desactivar la linea de Task y CPU con “t”.

top - 12:12:42 up 17:08,  4 users,  load average: 0.33, 0.25, 0.24
Mem:   1294344k total,   846380k used,   447964k free,   128916k buffers
Swap:   546168k total,   179648k used,   366520k free,   340464k cached

3) Podemos expandir la información si contamos con más de un procesador con “1″.

top - 12:13:24 up 17:09,  4 users,  load average: 0.34, 0.26, 0.24
Tasks: 101 total,   2 running,  97 sleeping,   0 stopped,   2 zombie
Cpu0  :  1.8%us,  0.8%sy,  0.0%ni, 92.0%id,  0.0%wa,  0.3%hi,  5.2%si,  0.0%st
Cpu1  :  2.6%us,  0.8%sy,  0.0%ni, 96.6%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1294344k total,   841780k used,   452564k free,   128952k buffers
Swap:   546168k total,   179648k used,   366520k free,   340512k cached

4) Podemos activar/desactivar la linea sombre la memoria RAM y SWAP con “m”.

top - 12:14:03 up 17:09,  4 users,  load average: 0.32, 0.26, 0.24
Tasks: 101 total,   3 running,  96 sleeping,   0 stopped,   2 zombie
Cpu(s):  2.5%us,  0.6%sy,  0.0%ni, 93.1%id,  0.0%wa,  0.6%hi,  3.1%si,  0.0%st

5) Podemos eliminar un proceso con “k” y después escribir el PID del proceso.

PID to kill: 7209

6) Podemos cambiar el nivel de nice (columna NI) con “r”, valores negativos mayor prioridad, valores positivos menor prioridad, valor nice por defecto 10.

PID to renice: 7209
Renice PID 7209 to value: -1

PID %MEM  VIRT SWAP  RES CODE DATA  SHR nFLT nDRT S  PR  NI %CPU COMMAND
7209  5.4  184m 115m  68m 1284  99m  32m  885    0 S  14  -1    2 epiphany

7) Podemos con “G” cambiar el modo de presentación dependiendo lo que nos interese ver, regularmente a mí me gustar ver que tanto de memoria gasta cada proceso, para eso después de pulsar “G”, escribimos 3 y enter. Si quieres ver procesos por usuario podemos ponerle en 4. El predeterminado es 1.

Choose field group (1 - 4):

8) Podemos con “u” ver los procesos del usuario que le indiquemos.

Which user (blank for all): soullost

9) Podemos con “f” cambiar las columnas a mostrar.

Current Fields:  AEHIOQTWKNMbcdfgjplrsuvyzX  for window 1:Def
Toggle fields via field letter, type any other key to return

* A: PID        = Process Id
* E: USER       = User Name
* H: PR         = Priority
* I: NI         = Nice value
* O: VIRT       = Virtual Image (kb)
* Q: RES        = Resident size (kb)
* T: SHR        = Shared Mem size (kb)
* W: S          = Process Status
* K: %CPU       = CPU usage
* N: %MEM       = Memory usage (RES)
* M: TIME+      = CPU Time, hundredths
b: PPID       = Parent Process Pid
c: RUSER      = Real user name
d: UID        = User Id
f: GROUP      = Group Name
g: TTY        = Controlling Tty
j: P          = Last used cpu (SMP)
p: SWAP       = Swapped size (kb)
l: TIME       = CPU Time
r: CODE       = Code size (kb)
s: DATA       = Data+Stack size (kb)
u: nFLT       = Page Fault count
v: nDRT       = Dirty Pages count
y: WCHAN      = Sleeping in Function
z: Flags      = Task Flags <sched.h>
* X: COMMAND    = Command name/line

10) Podemos con “o” (de oso xD) cambiar el orden de las columnas que especificamos anteriormente.

Current Fields:  AEHIOQTWKNMbcdfgjplrsuvyzX  for window 1:Def
Upper case letter moves field left, lower case right

* A: PID        = Process Id
* E: USER       = User Name
* H: PR         = Priority
* I: NI         = Nice value
* O: VIRT       = Virtual Image (kb)
* Q: RES        = Resident size (kb)
* T: SHR        = Shared Mem size (kb)
* W: S          = Process Status
* K: %CPU       = CPU usage
* N: %MEM       = Memory usage (RES)
* M: TIME+      = CPU Time, hundredths
b: PPID       = Parent Process Pid
c: RUSER      = Real user name
d: UID        = User Id
f: GROUP      = Group Name
g: TTY        = Controlling Tty
j: P          = Last used cpu (SMP)
p: SWAP       = Swapped size (kb)
l: TIME       = CPU Time
r: CODE       = Code size (kb)
s: DATA       = Data+Stack size (kb)
u: nFLT       = Page Fault count
v: nDRT       = Dirty Pages count
y: WCHAN      = Sleeping in Function
z: Flags      = Task Flags <sched.h>
* X: COMMAND    = Command name/line

11) Podemos con “H” ver los procesos tomando en cuenta los threads de los mismos.

12) Podemos con “c” ver los argumentos de los procesos con los que han sido ejecutado.

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
7489 soullost  18   0     0    0    0 Z  0.0  0.0   0:00.00 [play] <defunct>
7387 soullost  15   0 66708  27m  11m S  0.0  2.2   0:03.72 eog file:///home/soullost/Desktop/top.png
7367 soullost  15   0  3408 1736 1400 S  0.0  0.1   0:00.06 bash

13) Podemos con “z” cambiar el color de las columnas :). Si estamos en el modo 3 para ver procesos según la memoria que usen, pulsamos “z” y después “x” tendremos las columnas de un color (en mi caso como purpura) y la correspondiente a la %MEM con un background resaltando dicha columna 8) (me explico?). Algo como lo siguiente:

_screenshot2.png

14) Podemos con “Z” modificar el color de las columnas cuando pulsamos “z”.15) Podemos con “n” o “#” definir el número de procesos a mostrar.

Maximum tasks = 2, change to (0 is unlimited): 2
PID %MEM  VIRT SWAP  RES CODE DATA  SHR nFLT nDRT S  PR  NI %CPU COMMAND
6054  2.4 49572  18m  29m    4  37m 2828  427    0 S  15   0  0.0 wish
6244  0.8 75040  62m  10m   36  34m 1640    4    0 S  15   0  0.0 trashapplet

16) Podemos con “A” mostrar top con multiventanas (similar a la primera imagen donde les presentaba a top).

17) Podemos guardar las preferencias y modificaciones de top con “W”.

18) Por último, podemos ver la ayuda de top con “h” :D..

Espero les sea de utilidad y que se diviertan jugando con top :).

Nos vemos :P.

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5 out of 5)
Loading ... Loading ...

Autounmask para Gentoo GNU/Linux

GNU/Linux, Gentoo 1 Comment

Autounmask es un herramienta escrita en perl para los que usamos Gentoo como distribución de GNU/Linux, básicamente se encarga de desenmascarar paquetes y sus dependencias a la rama inestable (testing).

Para ver un ejemplo de la gran utilidad de esta herramienta basta con decir que hace unos días pase a testing gnome con la versión 2.18, para eso, les dejo los paquetes que agregué a mi package.keywords en /etc/portage:

#Gnome 2.18
#gnome-base/gnome
#>=gnome-extra/evolution-data-server-1.10.0
#>=gnome-base/gnome-volume-manager-2.17.0
#>=www-client/epiphany-2.18.0
#>=net-analyzer/gnome-nettool-2.17.4
#>=x11-libs/libwnck-2.18.0
#>=gnome-base/eel-2.18.0.1
#>=gnome-extra/deskbar-applet-2.17.93
#>=dev-libs/atk-1.18.0
#>=gnome-base/libbonoboui-2.18.0
#>=gnome-extra/gnome-games-2.18.0
#>=dev-python/gnome-python-desktop-2.17.3
#>=x11-wm/metacity-2.17.8
#>=gnome-base/gnome-panel-2.18.0
#>=x11-libs/pango-1.15.4
#>=gnome-extra/yelp-2.18.0
#>=app-arch/file-roller-2.18.0
#>=gnome-extra/gcalctool-5.9.14
#>=gnome-base/libgnome-2.18.0
#>=app-text/evince-0.8.0
#>=x11-themes/gnome-icon-theme-2.17.1
#>=gnome-base/gconf-2.18.0.1
#>=gnome-extra/gucharmap-1.10.0
#>=gnome-extra/fast-user-switch-applet-2.17.4
#>=gnome-extra/zenity-2.18.0
#>=app-text/gnome-doc-utils-0.10.1
#>=gnome-extra/gnome-screensaver-2.18.0
#>=gnome-base/libgnomekbd-0.1
#>=gnome-base/libgnomeui-2.18.1
#>=gnome-extra/evolution-webcal-2.9.92
#>=gnome-extra/gnome-keyring-manager-2.17.0
#>=gnome-base/libgnomeprint-2.17.92
#>=gnome-extra/gconf-editor-2.17.0
#>=gnome-base/gnome-menus-2.18.0
#>=gnome-extra/gtkhtml-3.14.0
#>=gnome-base/gnome-vfs-2.18.0.1
#>=gnome-base/libgnomeprintui-2.18.0
#>=gnome-base/gnome-desktop-2.18.0
#>=gnome-extra/bug-buddy-2.17.4
#>=gnome-base/nautilus-2.18.0.1
#>=gnome-base/gdm-2.18.0
#sys-auth/consolekit
#>=media-sound/esound-0.2.37
#>=x11-themes/gtk-engines-2.10.0
#>=x11-terms/gnome-terminal-2.18.0
#>=x11-libs/vte-0.15.3
#>=gnome-base/gnome-applets-2.18.0
#>=app-editors/gedit-2.18.0
#>=gnome-base/control-center-2.18.0
#>=gnome-extra/gnome-power-manager-2.18.0
#>=sys-apps/hal-0.5.8
#app-misc/hal-info
#>=gnome-base/libbonobo-2.18.0
#>=gnome-extra/gnome-media-2.18.0
#>=x11-misc/alacarte-0.11.3
#>=net-misc/vino-2.18.0
#>=mail-client/evolution-2.10.0
#>=gnome-extra/nautilus-cd-burner-2.18.0
#>=media-gfx/eog-2.18.0.1
#>=media-video/totem-2.18.0
#>=gnome-base/gnome-keyring-0.8
#>=app-admin/sabayon-2.18.0
#>=gnome-base/gnome-session-2.18.0
#>=dev-libs/libIDL-0.8.8
#>=x11-themes/gnome-themes-2.18.0
#>=gnome-extra/gnome-utils-2.18.0
#gnome-base/libgnomekbd

Con todo esto, ya es posible actualizar gnome, pero aqui es donde entra autounmask, para desenmascarar gnome y todos sus paquetes basta con hacer:

autounmask gnome-base/gnome-2.18.0

Y en tu archivo packages.keywords se agregaran los paquetes antes mencionados automáticamente, aparte si hay que agregarlos al package.unmask por alguna razón también lo hace por si solo ;) .

Algo más, podemos no poner la versión del paquete y nos arrojará las versiones que encuentre, tanto en la bd de portage como los overlay’s que tengamos en make.conf.

Por ejemplo:

UnderHouse ~ # autounmask dev-lang/tk

autounmask version 0.21 (using PortageXS-0.02.07 and portage-2.1.2.7)

* Using repositories:
/usr/portage
/usr/local/portage
/usr/local/layman

* The given category/package-version does not seem to exist. Listing existing versions:

* gentoo (/usr/portage):
dev-lang/tk-8.4.9
dev-lang/tk-8.4.14

*  (/usr/local/portage):
dev-lang/tk-8.5.0

*  (/usr/local/layman):
none

* Please pick one of the versions given above and try again.

Como siempre los desarrolladores de gentoo haciendo herramientas útiles para todos los usuarios. Que lo disfruten :P.

Bueno, nos vemos :P.

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (1 votes, average: 5 out of 5)
Loading ... Loading ...

Death Note

General 3 Comments

_20061113235057.jpg

Se se, hoy hablaré de anime :P, resulta que no me gustaba del todo, hasta que mi hermana y la sonsa me empezaron a enganchar, empezé viendo Loveless ya que mi hermana me invitaba a verlo :P y luego seguí las recomendaciones de la sonsa.

Algunas de los anime que he visto y que me falta ver(que ya los tengo pero por falta de tiempo están rezagados):

1) Loveless
2) Full Metal Alchemist
3) Blood+
4) Hellsing
5) Gantz

Tampoco soy un otaku :P, bueno la verdad es que llevo poco rato que empezé a ver anime, como unos 4/5 meses xD.

Bueno vamos al grano, hoy revizando una revista de anime (para variar de mi hermana jaja) me encontre con un reportaje sobre Death Note ( Cuaderno de la Muerte).

Death Note trata sobre un personaje llamado Light y el libro de un dios de la muerte (que lo llaman Shinigami), la historia empieza cuando Ryuk (el shinigami) tira su cuaderno de la muerte al mundo de los humanos, lógicamente el que lo encuentra es Light. El poder del libro consiste en que si se escribe el nombre de una persona y se piensa en su rostro, éste morirá y además si no se especifica la causa de la muerte, morirá de un paro cardiaco, todo esto, lleva a enlazar a Ryuk con Light hasta que el cuaderno se destruya o Light muera. Light al darse cuenta de semejante poder en sus manos, empieza matando a criminales (excusa de mejorar el mundo en el que vivimos), lo cual origina que la ONU se fije de los asesinatos y traten de atrapar al causante. Entonces es ahi cuando aparece otro personaje llamado “L” que es como un detective que trata de unir todas las piezas para encontrar a “Kira” ( Pseudonombre que le otorgan a Light) al unirse con el gobierno de Japón.

Haciendo comparaciones 8), el drama que se maneja en la historia es muy similar al que se ha hecho con la serie Prison Break (que en agosto empieza su tercera temporada, creo) a diferencia de toque personal de los animes, con un ir y venir de conclusiones y sorpresas mientras se va desarrollando, eso que apenas voy viendo 6 capítulos jejeje =].

Para que se den una idea:

Si tienes buena conexión de internet puedes verlo en:

http://www.peliculasonline.org/index.php?serie=Death%20Note

Ojo: El sexto capítulo el audio está bastante atrazado.

Si les gusta, dejen sus comentarios :) y si no, ps también XD.

Nos vemos.

Califica el tema:
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...

FIN DE SEMESTRE

General, Parsing, Programación No Comments

A que no saben qué? Llegó fin de semestre y la semana y media para los exámenes (recuperaciones, extraordinarios), por lo tanto, como soy relisto xD estuve esta semana sin navegar mucho :P.

Resumiendo las materias (copiando a la madona):

Matemáticas V: :):):):(:(:(
Teoría de la Computación: :):):):):):)
Desarrollo sustentable: :):):):):):)
IO: >:( N/A
Circuitos: :):):):):(:(

Como sea, me llevo buenos cimientos sobre analizadores sintácticos, circuitos y matemáticas xD (que realmente fueron las únicas materias rescatables). Lo bueno es que la semana que viene ya prácticamente se termino todo, dos días más para extraordinarios y se acabo :D (no pregunten si me llevo extras de mate XD).

Bueno, hoy tengo mucho sueño O.o y les comparto un pequeño programa (que se puede pasar a POO y demás yerbas, pero por el tiempo encima, ps 8) que pasa de un gramática libre de contexto a la FNC (forma normal de chomsky) con algunas restricciones :P.

El código es:

C++:
  1. /**
  2. Descripcion: Convierte a forma normal de chomsky.
  3.                      
  4. Ejemplo:
  5.        
  6.         Gramatica:
  7.             A -> Ac    Donde: A     - Es un no terminal
  8.             A -> w           Ac   - Es la derivacion del no terminal A
  9.            
  10.         Gramatica en Forma Normal de Chomsky:
  11.             A -> AZ
  12.             A -> w
  13.             Z -> c
  14.            
  15. Notas:
  16.         1) Los terminales deben ser de un solo caracter.
  17.         2) Como terminales acepta a-z y +,-,*,/,%,( y ).
  18.         3) Las derivaciones no deben contener espacios.
  19.             
  20. **/
  21.  
  22.  
  23.  
  24. #include<iostream.h>
  25.  
  26. #include<stdlib.h>
  27.  
  28. #include<stdio.h>
  29.  
  30. #include<string.h>
  31.  
  32.  
  33.  
  34. typedef char cadena[80];
  35.  
  36.  
  37.  
  38. struct g{
  39.  
  40.     char nterminal;
  41.  
  42.     cadena derivacion;
  43.  
  44. };
  45.  
  46.  
  47.  
  48. g gramatica[20];
  49.  
  50. g fnc[30];
  51.  
  52.  
  53.  
  54. int pos=0;
  55.  
  56. int pos2=0;
  57.  
  58. int convertir();
  59.  
  60. int sprReglasUnitarias();
  61.  
  62. int verificar();
  63.  
  64. int duplicidad(char,int,int);
  65.  
  66. int crear(int,char,int,int);
  67.  
  68. int eliminar(char,int);
  69.  
  70. int terminal(int,int);
  71.  
  72. int noTerminal(int,int);
  73.  
  74.  
  75.  
  76. int main(){
  77.  
  78.     system("CLS");
  79.  
  80.    
  81.  
  82.     cout<<"Escribe una gramatica: "<<endl;
  83.  
  84.     cout<<"Para terminal: $"<<endl;
  85.  
  86.     do{
  87.  
  88.         cout<<"No terminal: "; cin>>gramatica[pos].nterminal;
  89.  
  90.         gramatica[pos].nterminal=toupper(gramatica[pos].nterminal);
  91.  
  92.         if(gramatica[pos].nterminal!='$'){
  93.  
  94.             cout<<"Derivacion: "; cin>>gramatica[pos].derivacion;
  95.  
  96.             pos++;
  97.  
  98.         }
  99.  
  100.         else{
  101.  
  102.             break;
  103.  
  104.         }
  105.  
  106.     }while(pos<20);
  107.  
  108.  
  109.  
  110.     system("CLS");
  111.  
  112.     cout<<"La gramatica es:"<<endl;
  113.  
  114.     for(int j=0; j<pos; j++){
  115.  
  116.         cout<<gramatica[j].nterminal<<" -> "
  117.  
  118.                 <<gramatica[j].derivacion<<endl;
  119.  
  120.     }
  121.  
  122.     convertir();
  123.  
  124.     cout<<"La gramatica en FNC:"<<endl;
  125.  
  126.     for(int j=0; j<pos2; j++){
  127.  
  128.         cout<<fnc[j].nterminal<<" -> "
  129.  
  130.                 <<fnc[j].derivacion<<endl;
  131.  
  132.     }
  133.  
  134.  
  135.  
  136.     system("PAUSE");
  137.  
  138.  
  139.  
  140.     return 0;
  141.  
  142.  
  143.  
  144. }
  145.  
  146.  
  147.  
  148. int convertir(){
  149.  
  150.    
  151.  
  152.     // Suprime reglas unitarias
  153.  
  154.     sprReglasUnitarias();   
  155.  
  156.     // Verifica y da formato a la forma normal de chomsky
  157.  
  158.     verificar();
  159.  
  160.     return 0;   
  161.  
  162. }
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170. int sprReglasUnitarias(){
  171.  
  172.    
  173.  
  174.     char tmp;
  175.  
  176.     int indice;
  177.  
  178.    
  179.  
  180.     // Elimina no terminales no productivos
  181.  
  182.     for(int j=0; j<pos; j++){
  183.  
  184.         if( strlen(gramatica[j].derivacion)==1 ){
  185.  
  186.             for(int x='A'; x<='Z' ; x++){
  187.  
  188.              if(gramatica[j].derivacion[0]==x){
  189.  
  190.                     indice=j;
  191.  
  192.                     tmp=gramatica[j].derivacion[0];
  193.  
  194.                  gramatica[j].derivacion[0]='\0';
  195.  
  196.                  eliminar(tmp,indice);
  197.  
  198.                 }
  199.  
  200.             }
  201.  
  202.         }
  203.  
  204.     }
  205.  
  206.    
  207.  
  208.    
  209.  
  210.     for(int j=0; j<pos; j++){
  211.  
  212.         if(gramatica[j].derivacion[0]!='\0'){
  213.  
  214.             fnc[pos2].nterminal=gramatica[j].nterminal;
  215.  
  216.             strcpy(fnc[pos2].derivacion,gramatica[j].derivacion);
  217.  
  218.             pos2++;
  219.  
  220.         }
  221.  
  222.     }
  223.  
  224.     return 0;
  225.  
  226. }
  227.  
  228.  
  229.  
  230. int eliminar(char tmp, int indice){
  231.  
  232.    
  233.  
  234.     cadena string;
  235.  
  236.    
  237.  
  238.     for(int j=0; j<pos; j++){
  239.  
  240.         if( tmp==gramatica[j].nterminal){
  241.  
  242.             strcpy(string,gramatica[j].derivacion);
  243.  
  244.             gramatica[j].derivacion[0]='\0';
  245.  
  246.             strcpy(gramatica[indice].derivacion,string);
  247.  
  248.         }
  249.  
  250.     }
  251.  
  252.     return 0;   
  253.  
  254. }
  255.  
  256.  
  257.  
  258. int verificar(){
  259.  
  260.    
  261.  
  262.     const int indice=0;
  263.  
  264.     int longitud=0;
  265.  
  266.    
  267.  
  268.     for(int j=0; j<pos2; j++){
  269.  
  270.         longitud=strlen(fnc[j].derivacion);
  271.  
  272.         if(longitud==1){ //OK
  273.  
  274.             if( terminal(indice,j) ) continue;
  275.  
  276.         }
  277.  
  278.         else if(longitud==2){
  279.  
  280.             if( noTerminal(indice,j) && noTerminal(indice+1,j)  ) continue;
  281.  
  282.             else if( noTerminal(indice,j) && terminal(indice+1,j) ){ //OK
  283.  
  284.                 if( duplicidad(fnc[j].derivacion[indice+1],j,indice+1) ){
  285.  
  286.                     crear(2,fnc[j].derivacion[indice+1],j,indice+1);
  287.  
  288.                 }
  289.  
  290.                 j=-1;
  291.  
  292.             }
  293.  
  294.             else if( terminal(indice,j) && noTerminal(indice+1,j) ){ //OK
  295.  
  296.                 if( duplicidad(fnc[j].derivacion[indice],j,indice) ){
  297.  
  298.                     crear(2,fnc[j].derivacion[indice],j,indice);
  299.  
  300.                 }
  301.  
  302.                 j=-1;
  303.  
  304.             }
  305.  
  306.             else if( terminal(indice,j) && terminal(indice+1,j) ){ //OK
  307.  
  308.                 if( duplicidad(fnc[j].derivacion[indice],j,indice) ){
  309.  
  310.                     crear(2,fnc[j].derivacion[indice],j,indice);
  311.  
  312.                 }
  313.  
  314.                 if( duplicidad(fnc[j].derivacion[indice+1],j,indice+1) ){ //OK
  315.  
  316.                     crear(2,fnc[j].derivacion[indice+1],j,indice+1);
  317.  
  318.                 }
  319.  
  320.                 j=-1;
  321.  
  322.             }
  323.  
  324.         }
  325.  
  326.         else if(longitud>2){
  327.  
  328.             if( noTerminal(indice,j) ){ //OK
  329.  
  330.                 crear(1,fnc[j].derivacion[indice+1],j,indice);
  331.  
  332.                 j=-1;
  333.  
  334.             }
  335.  
  336.             else if( terminal(indice,j) ){ //OK
  337.  
  338.                 if( duplicidad(fnc[j].derivacion[indice],j,indice) ){
  339.  
  340.                     crear(2,fnc[j].derivacion[indice],j,indice);
  341.  
  342.                 }
  343.  
  344.                 j=-1;
  345.  
  346.             }
  347.