Puppy Linux Discussion Forum Forum Index Puppy Linux Discussion Forum
Puppy HOME page : puppylinux.com
"THE" alternative forum : puppylinux.info
 
 FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

The time now is Fri 25 Apr 2014, 02:41
All times are UTC - 4
 Forum index » House Training » Users ( For the regulars ) » Usuarios de habla Hispana
Como hacer un programa sencillo para puppy linux
Moderators: rarsa
Post new topic   Reply to topic View previous topic :: View next topic
Page 4 of 7 [105 Posts]   Goto page: Previous 1, 2, 3, 4, 5, 6, 7 Next
Author Message
mister_electronico


Joined: 20 Jan 2008
Posts: 549
Location: Asturias_ España

PostPosted: Wed 24 Mar 2010, 17:01    Post subject: Hola Walter...  

Mediante comandos del Bash como tipo scanf podemos detectar cuando hemos tecleado una tecla y la metemos en una variable., y luego con el comando If__ Then --- fi seleccionamos la accion que queremos realizar y luego con el comando aplay de linux , ejecutamos el archivo dela nota que queremos tocar........ Mediante Gtkdialog lo podemos hacer bonito para que marque las notas...... Bueno Walter ..... mucho animo y al toro........jejeje

[/quote]
Back to top
View user's profile Send private message Yahoo Messenger 
Azulete

Joined: 25 Mar 2010
Posts: 3

PostPosted: Thu 25 Mar 2010, 08:26    Post subject:  

Saludos a la comunidad.
Recientemente he descubierto esta maravilla de sistema. Puppy recien instalado.
Back to top
View user's profile Send private message 
Azulete

Joined: 25 Mar 2010
Posts: 3

PostPosted: Thu 25 Mar 2010, 08:29    Post subject:  

Aqui les dejo este pequeño aporte. Es una pequeña traduccion del manual que se menciona mas arriba.

1.- POR DONDE EMPEZAR

>> La documentacion de gtkdialog es escasa, pero esto es un comienzo. La encontraras en /usr/share/doc/gtkdialog/gtkdialog.txt.
Lo mismo esta en la web, pero con otro formato.

>> El aprendizage con ejemplos es mucho mejor, y es mas fácil de entender. Estan ubicados en /usr/share/doc/gtkdialog/examples
Además necesitaras tener instalado
dev_save.sfs
el cual tabien lo puedes encontrar en la web.

Nota: Puppy usa los comandos de gtkdialog3 en lugar de los de gtkdialog. Por ello debes cambiar esto en los ejemplos. Otra opcion que tienes es teclear en la consola:
ln -s /usr/sbin/gtkdialog3 /usr/sbin/gtkdialog

>> Encontraras mas informacion de gtkdialog en goblinX forum
>> Si tecleas 'gtkdialog3 --help' en la consola te mostrara los parametros que tiene.
>> technosaurus ha realizado algunas plantillas que las puedes descargar de aqui here.



2.) SINTAXIS: Como usar las variables en el codigo.


Empecemos. Abre una comsola y teclea:

ln -s /usr/sbin/gtkdialog3 /usr/sbin/gtkdialog

Para mostrar el contenido de una variable en gtkdialog necesitamos ponerla entre comillas simples. Seria algo como:
TEXT='Hello world'
Esto guardara en la variable TEXT la cadena Hola mundo.

Una vez guarda si la queremos mostrar pondriamos
“$TEXT”
Veamos un ejemplo. Abra un editor de texto y añada todo lo que esta apartir de Code:

Code:
#!/bin/bash

TEXT='Hola mundo'

export script='
<text>
<label>El contenido de la variable es: '"$TEXT"'</label>
</text>'

gtkdialog3 --program=script

Guarde el archivo con el nombre ejemplo1.sh
Cambie los permisos del archivo para poder ser ejecutado. Para ello abra una consola y en el mismo directorio donde guardo el archivo y teclee:

chmod u+x ejemplo1.sh

Pulse Intro. Ahora teclee lo que viene a continuacion y pulse intro.
./ejemplo1.sh

Y uala saltara nuestra primera ventanita con con gtkdialog3 (lo que hay delante de la barra / es un punto).

Nos muestra una ventana con
El contenido de la variable es: Hola mundo
Back to top
View user's profile Send private message 
mister_electronico


Joined: 20 Jan 2008
Posts: 549
Location: Asturias_ España

PostPosted: Thu 25 Mar 2010, 14:18    Post subject: Bienvenido a este foro Azulete...  

Bienvenido a este foro Azulete, hay un minicurso en ingles abierto por Zigbert que progarma para puppy con programas como Pburn, este minicurso es bastante interesante.


http://www.murga-linux.com/puppy/viewtopic.php?t=38608


Si a la gente le interesa y traducir este minicurso o poner ejemplos comentados de este post en ingles aqui, pues tienen mi colobaracion...

Un saludo.
Back to top
View user's profile Send private message Yahoo Messenger 
walter leonardo


Joined: 10 Dec 2009
Posts: 225

PostPosted: Thu 25 Mar 2010, 15:44    Post subject: hola
Subject description: hola
 

Hola.
Me podrias dar un ejemplo mister, porque estoy en blanco y no me sale nada Confused .
Back to top
View user's profile Send private message 
mister_electronico


Joined: 20 Jan 2008
Posts: 549
Location: Asturias_ España

PostPosted: Thu 25 Mar 2010, 17:36    Post subject: Es que el programita que propones no es secillito....  

Walter es que el programa que propones no es precisamente sencillito, por eso te decia
suerte y al toro.... jejeje...

No soy ningun entendido en Gtkdialog ni tampoco en el leguaje de Shell.....

Aunque tampoco es necesario que lo escribieras en estos lenguajes, por que tu programa como dices no requiere mas que de teclado para ir apretando teclas y produciendos sonidos...

En realidad lo podrias escribir en C y luego que se ejecutara desde Gtkdialog y se matara el proceso desde Gtkdialog cuando acabaras....

Necesitas conseguir los archivos sonoros de cada una de las notas que quieres ejecutar

El programa que esta abajo en el C no esta depurado ni comprobado, pero mas o menos esta es la idea lo llamamos por ejemplo nota...

Cada vez que lo ejecutemos lo llamaremos con nota "numero" numero es de 1 a 6 por ejemplo que corresponde a una nota musical do re mi fa so la .....

se le pasa con el argumento argc de C. lee ese numero y mediante la comparacion con if ejecuta la orden de llamada a comando del systema linux que en este caso es el
comando "aplay" que ejecuta el archivo sonoro correspondiente.

Cada vez que aprietes una tecla del teclado tienes que llamar a este programa nota...


#include <stdio.h> // Prueba de parámetros para función main

int main(int argc)

{
int i;
i = argc;

if(i=1) Then system("aplay do.wav");
if(i=2) Then system("aplay re.wav");
if(i=3) Then system("aplay mi.wav");
if(i=4) Then system("aplay fa.wav");
if(i=5) Then system("aplay so.wav");
if(i=4) Then system("aplay la.wav");

return 0;
}


Bueno esto es una de las miles de posibilidades que tienes....

Espero que te sirva de algo....

Un saludo Walter...
Back to top
View user's profile Send private message Yahoo Messenger 
mister_electronico


Joined: 20 Jan 2008
Posts: 549
Location: Asturias_ España

PostPosted: Thu 25 Mar 2010, 19:04    Post subject: Otra forma de hacerlo...  

Otra forma de hacerlo es el siguiente programa....

#include <stdio.h> // Prueba de parámetros para función main

int main(void)

{
char ch;

while( scanf( "%c", &ch ) != 's' ) /* Ejecutalo mientras no sea igua a s */
{
if(ch=='a') Then system("aplay do.wav");
if(ch=='b') Then system("aplay re.wav");
if(ch=='c') Then system("aplay mi.wav");
if(ch=='d') Then system("aplay fa.wav");
if(ch=='e') Then system("aplay so.wav");
}



return 0;
}


Este programa no esta depurado ni comprobado...

La diferencia con el primer programa es que este se ejecutara indefinidamente mientras no apretemos la tecla "s"

Un saludo nos vemos....
Back to top
View user's profile Send private message Yahoo Messenger 
walter leonardo


Joined: 10 Dec 2009
Posts: 225

PostPosted: Sat 27 Mar 2010, 21:38    Post subject: hola
Subject description: hola
 

Bueno encontré esto por Internet pero no me acuerdo donde jeje, pero si me acuerdo para que servia.
Es un programa que tiene 3 aplicaciones adentro:
1: keyloger (capta el teclado)
2: capturador de pantalla
y el mas importante,
3: es una aplicacion para designarle a una tecla del teclado reproducir un sonido.(justo lo que quiero yo)
Pero hay que compilarlo y yo no pude porque me daba error, pero si alguien puedo se lo agradecere.
Nota: el programa parece estar hecho en C.
kbdevents-1.1.tar.gz
Description 
gz

 Download 
Filename  kbdevents-1.1.tar.gz 
Filesize  48.29 KB 
Downloaded  445 Time(s) 
Back to top
View user's profile Send private message 
goshujinsama


Joined: 31 Mar 2010
Posts: 25
Location: MX

PostPosted: Wed 31 Mar 2010, 00:53    Post subject: hola
Subject description: hola
 

Hola a todos, para mi lo mas facil de hacer para lo que proponen seria hacer el programa en c, pero con sdl, y su libreria sdl mixer, de echo yo estaba programando un juego Embarassed con esas librerias en guindos Laughing , pero tambien me gustaria pasarlo a linux, lo intentare, voy a checar tambien el tar a ver si se compilarlo, y hay que seguir con esto amigos Cool .
Back to top
View user's profile Send private message MSN Messenger 
walter leonardo


Joined: 10 Dec 2009
Posts: 225

PostPosted: Wed 31 Mar 2010, 02:53    Post subject: hola
Subject description: hola
 

hola, bienvenido Very Happy .
Seria bueno que pases tus programas hechos en C para linux asi lo usemos todos.
Yo no quiero hacer programas en C por la razon que nose compilarlos para puppy pero si para windos y por eso empece a aprender algo de gtk Very Happy .
Saludos.
Back to top
View user's profile Send private message 
goshujinsama


Joined: 31 Mar 2010
Posts: 25
Location: MX

PostPosted: Wed 31 Mar 2010, 19:55    Post subject: c compiling
Subject description: c++
 

Hola de nuevo a todos, walter, lo primero que debes de tener para compilar tus programas en c en puppy son las librerias necesarias par compilarlos, luego en geany seleccionas el tipo de archivo que es, creo que es en el menu document, de ahi ya teniendolo escrito lo conpilas con f8 y despues lo construyes con f9 y por ultimo, para probarlo abres una terminal y ejecutas tu programa poniendo su ruta, espero y este claro como hacerlo y cualquier duda pues por aqui nos leemos.
Back to top
View user's profile Send private message MSN Messenger 
walter leonardo


Joined: 10 Dec 2009
Posts: 225

PostPosted: Wed 31 Mar 2010, 21:10    Post subject: hola
Subject description: hola
 

Que bueno, esa de construir no la sabia, eso era lo que me faltaba Very Happy .
Que paquetes tendría que instalar en puppy 4.3.1 para compilar solo en C porque yo no quiero instalar el paquete devx_431.sfs para compilar solo en C porque tuve una mala experiencia al instalarme ese paquete, cuando lo instale empece a tener problemas el sistema y los programas Confused .
Hay algun paquete liviano para instalar para compilar en C?
Me das un ejemplo de como el programa de lo que quiero hacer(asignar un sinido a una tecla).
Gracias por la explicación Very Happy .
A me estaba olvidando,
Como hago para ejecutar con un script el archivo compilado en C para no tener que estar entrando en la terminal y ejecutarlo de ahy, osea quiero ejecutarlo de un solo click.
Back to top
View user's profile Send private message 
goshujinsama


Joined: 31 Mar 2010
Posts: 25
Location: MX

PostPosted: Fri 02 Apr 2010, 16:07    Post subject: Hola
Subject description: hola
 

Hola de nuevo, bueno, no se si haiga algo mas ligero solo para compilar c, pero pues el paquete dev a mi no me a causado ningun problema, y eso que yo tengo una full install, bueno, creo que podria ser por el tipo de instalacion que tienes, sobre el ejemplo del programa, dejame nadamas y checo unos errores que me da la libreria sdl, tengo que checar como linkear bien las librerias, pero yo ya pude hacer una calculadora sencilla en c con librerias estandar, asi que solo es cuestion de investigar como hacer lo que quiero, saludos.
Back to top
View user's profile Send private message MSN Messenger 
mister_electronico


Joined: 20 Jan 2008
Posts: 549
Location: Asturias_ España

PostPosted: Mon 05 Apr 2010, 18:05    Post subject: Yo utilizo devx_XXX  

Yo utilizo el dev y la verdad es que nunca me ha dado ningun problema .... ni me ha afectado a ningun programa.

Un ejemplo:

#include <stdio.h>

int main()
{
printf(" Hola que tal \n");

return (0);
}


guardarlo como hola.c y se compila.

gcc hola.c -o hola

Para ejecutarlo se ejecuta desde el termial ./hola


Para ejecutarlo desde un script podemos hacer.....

#!/bin/bash

#Ejecutar un programa C hola desde un script.

hola


Guardamos este texto en un archivo por ejemplo: prueba.sh

Le damos orden para poder ejecutarse chmod +x prueba.sh

Y colocamos el archivo hola ejecutable de C dentro del directoria /USR/BIN.

Y ejecutamos el script ./prueba.sh

Si no queremos colocar el programa en C dentro de /USR/BIN entonces dentro del script tendremos que dar el Path o direccion donde se encuentra el ejecutable como por ejemplo /mnt//home/hola

Nos vemos un saludo..
Back to top
View user's profile Send private message Yahoo Messenger 
goshujinsama


Joined: 31 Mar 2010
Posts: 25
Location: MX

PostPosted: Tue 06 Apr 2010, 23:00    Post subject:  Hola
Subject description: SDL programing
 

Bueno, lo primero de todo es conseguir las librerias, para esto nos vamos a www.libsdl.org y descargamos la SDL, SDL_image, SDL_mixer, SDL_ttf(al menos son las que considero indispensables).

Nos bajamos las que son .tar.gz, y las instalamos con el tipico procedimiento de:

./configure
make
make install

Y Pues aqui dejo un pequeño ejemplo:

MAIN.CPP
//===============================================================================
/*Este codigo es propiedad de Fernando Escutia Rodriguez, escrito el 05/04/2010*/
//===============================================================================
/*Iniciamos las cabezeras necesarias para el programa*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL_ttf.h>
#include "csprite.h"

/*Definimos las definiciones y variables globales*/
SDL_Surface *screen, *texto;
SDL_Color bgcolor, fgcolor;
SDL_Rect rectangulo;
TTF_Font *fuente, *fon;
char msg[100];
CFrame ftitle;
CSprite title;
CFrame fmagic;
CSprite magic;
Mix_Music *tit;
Uint32 ini_milisegundos, fin_milisegundos, frametime;

/*estructura del cartel magic puzzle*/
struct mag{
int x, y;
} magi;

/*Cargamos los sprites*/
int initsprites(){
ftitle.load("img/title.bmp");
title.addframe(ftitle);
fmagic.load("img/magic.bmp");
magic.addframe(fmagic);
}

/*Cargamos los archivos de musica*/
void inicializa(){
tit = Mix_LoadMUS("music/trust.mp3");
}

/*iniciamos las coordenadas moviles*/
void moviles(){
magi.x = -5;
magi.y = 100;
}

/*Iniciamos el frameo*/
void ResetTimeBase() {
ini_milisegundos=SDL_GetTicks();
}

int CurrentTime() {

fin_milisegundos=SDL_GetTicks();
return fin_milisegundos-ini_milisegundos;
}

/*iniciamos los textos que vamos a usar*/
const char text[100]="Presione espacio para continuar o esc para salir";

/*Iniciamos codigo del programa*/
int main(int argc, char *argv[]) {

int done = 0;
int estado = 1;
int pan = 0;
SDL_Event event;
Uint8 *keys;

/*Iniciamos SDL*/
if (SDL_Init(SDL_INIT_VIDEO|SDL_INIT_AUDIO) < 0) {
printf("No se pudo iniciar SDL: %s\n", SDL_GetError());
exit(1);
}

/*Iniciamos modo de video*/
screen = SDL_SetVideoMode(598, 429, 24, SDL_HWSURFACE|SDL_DOUBLEBUF);
if (screen == NULL){
printf("No se puede iniciar el modo grafico: %s\n", SDL_GetError());
exit(1);
}

/*Iniciamos SDL_ttf*/
if (TTF_Init() < 0){
printf("No se puede iniciar SDL_ttf: %s\n", SDL_GetError());
exit(1);
}
atexit(TTF_Quit);

/*Iniciamos el audio*/
if (Mix_OpenAudio(44100,AUDIO_S16SYS,2,4096) < 0){
printf("No se puede iniciar el audio: %s\n", Mix_GetError());
exit(1);
}
atexit(Mix_CloseAudio);

/*Cargamos las fuentes*/
fuente = TTF_OpenFont("Fonts/ionic.ttf", 20);
fon = TTF_OpenFont("Fonts/monofont.ttf", 20);

/*Iniciamos los colores para las fuentes*/
bgcolor.r = 255;
bgcolor.g = 0;
bgcolor.b = 0;

initsprites();
inicializa();
moviles();

/*Iniciamos ejecucion del programa*/
while (done == 0){
switch (estado){

/*Iniciamos la pantalla de presentación*/
case 1:
Mix_PlayMusic(tit, -1);
while ((done == 0) && (estado == 1)){
ResetTimeBase();

title.setx(0);
title.sety(0);
title.draw(screen);

magic.setx(magi.x);
magic.sety(magi.y);
magic.draw(screen);

if (pan == 0){
fgcolor.r = 0;
fgcolor.g = 14;
fgcolor.b = 255;

sprintf(msg, "%s", text);
texto = TTF_RenderText_Blended(fuente, msg, fgcolor);
rectangulo.y = 370;
rectangulo.x = 87;
rectangulo.w = texto->w;
rectangulo.h = texto->h;

SDL_BlitSurface(texto, NULL, screen, &rectangulo);
}

SDL_Flip(screen);

keys=SDL_GetKeyState(NULL);

if (pan == 1){
if((magi.x < 270) && (magi.y < 260)){
magi.x=magi.x+(43);
magi.y=magi.y+(41);
}
}

/*Iniciamos el timing*/
do {
frametime=CurrentTime();
} while (frametime<300);

/*Iniciamos el chequeo de eventos*/
while (SDL_PollEvent(&event)){
if (event.type == SDL_QUIT){done = 1;}
if (event.type == SDL_KEYDOWN){
if (event.key.keysym.sym == SDLK_ESCAPE){done = 1;}
if (event.key.keysym.sym == SDLK_SPACE){
if (pan == 0){pan = 1;}
}
}
}
}
break;
}
}
/*Paramos la musica*/
Mix_HaltMusic();

/*Liberamos el recurso de la musica*/
Mix_FreeMusic(tit);

/*Liberamos recursos de fuentes*/
TTF_CloseFont(fuente);
TTF_CloseFont(fon);

return 0;
}

CSPRITE.H
#ifndef CSPRITE_H_

#define CSPRITE_H_

#define TRUE 1

#define FALSE 0

// CFrame representa un frame independiente de un sprite.

class CFrame {

public:

SDL_Surface *img;

void load(char *path);

void unload();

};

// La clase CSprite esta formada por un array de frames;

class CSprite {

private:

int posx,posy;

int estado;

int nframes;

int cont;

public:

CFrame *sprite;

CSprite(int nf);

CSprite();

void finalize();

void addframe(CFrame frame);

void selframe(int nf);

int frames() {return cont;}

void setx(int x) {posx=x;}

void sety(int y) {posy=y;}

void addx(int c) {posx+=c;}

void addy(int c) {posy+=c;}

int getx() {return posx;}

int gety() {return posy;}

int getw() {return sprite[estado].img->w;}

int geth() {return sprite[estado].img->h;}

void draw(SDL_Surface *superficie);

int colision(CSprite sp);

int colision2(CSprite sp);

};

#endif /* CSPRITE_H_ */


CSPRITE.CPP
#include <SDL/SDL.h>

#include "csprite.h"

#include <SDL/SDL_image.h>

// Sprite Class implementation

void CFrame::load(char *path) {

img=IMG_Load(path);

// Asignamos el color transparente al color rojo.

SDL_SetColorKey(img,SDL_SRCCOLORKEY|SDL_RLEACCEL, SDL_MapRGB(img->format,255,0,0));

img=SDL_DisplayFormat(img);

}

void CFrame::unload(){

SDL_FreeSurface(img);

}

CSprite::CSprite(int nf) {

sprite=new CFrame[nf];

nframes=nf;

cont=0;

}

CSprite::CSprite() {

int nf=1;

sprite=new CFrame[nf];

nframes=nf;

cont=0;

}

void CSprite::finalize() {

int i;

for (i=0 ; i<=nframes-1 ; i++)

sprite[i].unload();

}

void CSprite::addframe(CFrame frame) {

if (cont<nframes) {

sprite[cont]=frame;

cont++;

}

}

void CSprite::selframe(int nf) {

if (nf<=nframes) {

estado=nf;

}

}

void CSprite::draw(SDL_Surface *superficie) {

SDL_Rect dest;

dest.x=posx;

dest.y=posy;

SDL_BlitSurface(sprite[estado].img,NULL,superficie,&dest);

}

int CSprite::colision(CSprite sp) {

int w1,h1,w2,h2,x1,y1,x2,y2;

w1=getw(); // ancho del sprite1

h1=geth(); // altura del sprite1

w2=sp.getw(); // ancho del sprite2

h2=sp.geth(); // alto del sprite2

x1=getx(); // pos. X del sprite1

y1=gety(); // pos. Y del sprite1

x2=sp.getx(); // pos. X del sprite2

y2=sp.gety(); // pos. Y del sprite2

if (((x1+w1)>x2)&&((y1+h1)>y2)&&((x2+w2)>x1)&&((y2+h2)>y1)) {

return TRUE;

} else {

return FALSE;

}

}

int CSprite::colision2(CSprite sp) {

int w1,h1,w2,h2,x1,y1,x2,y2;

w1=getw()+2; // ancho del sprite1

h1=geth()+2; // altura del sprite1

w2=sp.getw()+2; // ancho del sprite2

h2=sp.geth()+2; // alto del sprite2

x1=getx()-1; // pos. X del sprite1

y1=gety()-1; // pos. Y del sprite1

x2=sp.getx()-1; // pos. X del sprite2

y2=sp.gety()-1; // pos. Y del sprite2

if (((x1+w1)>x2)&&((y1+h1)>y2)&&((x2+w2)>x1)&&((y2+h2)>y1)) {

return TRUE;

} else {

return FALSE;

}

}


Para que este funcione, debemos de tener los tres archivos en un mismo directorio, y meter el siguiente comando en una terminal:

g++ -L/usr/lib -lSDL -lSDL_image -lSDL_mixer -lSDL_ttf -lpthread -I/usr/include/SDL -D_REENTRANT /mnt/sda7/c01/game/main.cpp /mnt/sda7/c01/game/csprite.cpp -o /mnt/sda7/c01/game/magic_puzzle

Los directorios los substituyes por los tuyos.

Y he aqui el resultado:


NOTA: Si las librerias y las cabezeras no estan en los directorios especificados arriba, se encuentran en /mnt/home/usr/local/include/SDL y /mnt/home/usr/local/lib, nadamas habria que copiar las librerias y cabeceras sdl a los directorios de arriba o poner en la linia para compilar estos directorios en lugar de otros a la hora de compilar.

Espero y les sirva, de todos modos recomiendo que busquen en google por "[ebook]programacion de videojuegos con sdl.pdf", cualquier duda pueden hacermela llegar y tratare de darle respuesta lo mas pronto posible.
Back to top
View user's profile Send private message MSN Messenger 
Display posts from previous:   Sort by:   
Page 4 of 7 [105 Posts]   Goto page: Previous 1, 2, 3, 4, 5, 6, 7 Next
Post new topic   Reply to topic View previous topic :: View next topic
 Forum index » House Training » Users ( For the regulars ) » Usuarios de habla Hispana
Jump to:  

You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum
You cannot attach files in this forum
You can download files in this forum


Powered by phpBB © 2001, 2005 phpBB Group
[ Time: 0.1002s ][ Queries: 13 (0.0057s) ][ GZIP on ]