Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - EzianGES

#1
Qué tal gente, cómo les va? :D

Estoy comenzando con esto de la web (?) y se me cruzó hacer un juego muy sencillo, para dos personas. Lo estoy desarrollando en javascript usando Pixi.JS. El tema es el siguiente, se me presentó la necesidad de guardar información (asesinatos, muertes y puntos), por lo tanto necesito una base de datos. Primera vez en mi vida de programador que debo lidiar con esto.

Mi duda radica en lo siguiente, según pude "imaginar" como sería, ya que no podría dejar acceso a la base de datos desde js porque supongo que eso sería extremadamente vulnerable, no? Asumo que desde js debería comunicarme con un programa en el servidor, y que ese programa acceda a la base de datos.

Por ejemplo:
Jugador1(Cliente A) mata a Jugador2(Cliente B).
Cliente A envía "anotame un frag mas" al programa en el servidor, y Cliente B envía "anotame una muerte mas" al mismo programa en el servidor, y ese programa en el servidor es el responsable de modificar la base de datos
Estoy en lo correcto? A la vez pienso, si Cliente X es quién dice "anotame un frag"  o "anotame una muerte", hay manera de que una persona edite eso, y envíe -por ejemplo- diez veces "anotame un frag"?

En fin, primero me gustaría saber si el planteo que se me hizo en la cabeza es el correcto. Un abrazo, y gracias de antemano :)
#2
Navegando topé con este sitio que cubre el uso de Pygame y Box2D para la programacion de juegos. Cubren la construcción de un engine de física básico, algo de network, entre otras cosas. Realmente interesante.

Dejo el enlace:
http://physics.gac.edu/~miller/jterm_2013/physics_engine_tutorial.html
#3
Hasta donde yo recordaba, si hacía algo así:
Código (Python) [Seleccionar]

>>>3 / 2
1
>>>3 // 2
1
>>>3.0 / 2
1.5
>>>3 / 2.0
1.5


Python me devolvía un número entero si usaba / entre dos números enteros, y un número entero con // sin importar que fuesen float...

Formateo la PC, me bajo Python3.3.4 y me topo con lo siguiente (además de una web mejorada con una shell interactiva que se luce http://python.org/):
Código (Pyton) [Seleccionar]

>>> 3 / 2
1.5


¿Desde cuándo una división entre dos números enteros me devuelve float si o si? xD O siempre fue así y yo por algún motivo no me di cuenta? xD Busqué en la documentación sobre el último release y no dice nada al respecto D:


#5
Disculpen que haga este hilo acá... realmente no se donde hacerlo jaja en fin, estoy experimentando con ctypes en Python (si lo sé esto es el subforo de C). Para eso me estoy informando con MSDN, y recurro a la sabiduría de los C-sianos (?) que la tienen calada...
Estoy intentando usar la API TerminateProcess, cuya descripción es la siguiente:

BOOL WINAPI TerminateProcess(
  _In_  HANDLE hProcess,
  _In_  UINT uExitCode
);


CitarhProcess [in]
A handle to the process to be terminated.
The handle must have the PROCESS_TERMINATE access right. For more information, see Process Security and Access Rights.
uExitCode [in]
The exit code to be used by the process and threads terminated as a result of this call. Use the GetExitCodeProcess function to retrieve a process's exit value.

Entiendo que necesita dos argumentos de entrada, el "handle" del proceso, y un código de salida.
Bien, entonces asumo que tengo que conseguir el "handle" del proceso. Pues bien, no entiendo cómo obtener el handle. Soy muy novato en el tema, y estoy viendo algo sobre la API OpenProcess, que teóricamente me devuelve el handle del proceso:

HANDLE WINAPI OpenProcess(
  _In_  DWORD dwDesiredAccess,
  _In_  BOOL bInheritHandle,
  _In_  DWORD dwProcessId
);


CitardwDesiredAccess [in]
The access to the process object. This access right is checked against the security descriptor for the process. This parameter can be one or more of the process access rights.
If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.
bInheritHandle [in]
If this value is TRUE, processes created by this process will inherit the handle. Otherwise, the processes do not inherit this handle.
dwProcessId [in]
The identifier of the local process to be opened.

Entiendo que necesita tres argumentos. Llegado el tercer argumento (el PID), entiendo que para obtenerlo, tengo que utilizar la API GetProcessID:

DWORD WINAPI GetProcessId(
  _In_  HANDLE Process
);


Ahora bien, eso me devolvería el PID... el cuál necesito para obtener el handle... Pero la función me pide el handle del proceso... No entiendo xD.

Perdón la ignorancia, y que haga una pregunta así, pero no logro entender el procedimiento para cerrar un proceso mediante TerminateProcess. Se que lo puedo hacer utilizando taskkill /f /im blabla, pero prefiero entender esto :\
Aclaro que no estoy haciendo ninguna maldad ni nada similar, solo estoy practicando multithreading, y se me ocurrió hacer una función que abra un proceso, mientras otra lo cierre, por el mero hecho de practicar algo, y decidí hacerlo de esta manera.

De todas maneras, voy a seguir buscando y probando. No pido un códigohecho, con una palabra que me oriente estaría muy agradecido!

Un abrazo.


#6
Por esas casualidades de la vida me topé con Kivy. Un par de videos y algunas críticas me convencieron de probarlo. Por un momento tuve la extraña sensación de "preocupación", de que este framework fuese un proyecto inestable mas, con grandes problemas. Para sorpresa mía, fue casi todo lo contrario: un proyecto robusto, una obra de ingeniería, pero muy joven, con una comunidad agradable, con muy buen nivel. Entonces me hice una serie de preguntas vitales: ¿Windows, Linux? ¿Python 2, Python 3? ¿3.2? ¿3.3? Para mi sorpresa... no solo Windows y Linux, si no también Android, iOs, y OSx. La documentación es regular. Para un programador experimentado, o un lector muy ávido de inglés, es buena.
Me dispuse a instalarlo bajo Windows en principio... y resultó ser algo mas complejo de lo que pensaba. Podría bajarme todo en uno, como si fuese "otra versión"de Python. Es decir, viene con un Python portable, y desde ese intérprete puedo usar Kivy. Para tener Kivy a disposición del intérprete ya instalado, es necesario -según llegué a leer- compilar a mano todo. Lo dejé para después. fue entonces cuando lo probé bajo Ubuntu. Acá es donde comenzaron los pequeños retrasos. La verdad no soy muy entendedor de Linux todavía, soy un usuario que lleva muy poco tiempo utilizándolo.
Quiero aclarar que en Ubuntu, contamos por defecto con Python2.7. Para acceder a Python 2.7 tipeamos cualquiera de las siguientes líneas en la terminal:

user@ubuntu:~$ python
user@ubuntu:~$ python2
user@ubuntu:-$ python2.7


Asumo -y es pura suposición- que al tipear "python", Linux ejecuta el intérprete predefinido, si tipeamos "python2", ejecuta la versión mas reciente de Python2x, y si tipeamos "python2.7" accedemos a la versión específica. (algún linuxero que corrija a este novato, por favor)
Tipeamos ahora lo siguiente, para saber si tenemos Python3.3 instalado:

user@ubuntu:-$ python3.3

Si no lo tenés instalado, Ubuntu -a la fecha- no cuenta con tal versión en los repositorios oficiales. Es por eso que debemos buscarlo en otro repositorio. En mi caso, DuckDuckGo-eando, me topé con que los repositorios DeadSnakes si cuentan, por tanto debemos agregar a la lista:

user@ubuntu:-$ sudo apt-get install python-software-properties
user@ubuntu:-$ sudo add-apt-repository ppa:fkrull/deadsnakes
user@ubuntu:-$ sudo apt-get update
user@ubuntu:-$ sudo apt-get install python3.3-dev


El -dev es para desarrolladores. Una vez que tenemos instalado Python3.3 correctamente, es tiempo de descargar Kivy, y Cython, que forma parte de los requerimientos. Descargamos Kivy desde la web oficial, descargamos el fichero (Kivy-1.8.0.tar.gz), el mismo quedará en /home/Descargas, en donde lo descompriremos, quedando entonces en /home/Descargas/Kivy-1.8.0.

Es tiempo de probar si todo funciona, lo cuál en mi caso no sucedió, pero mejor intentarlo.

user@ubuntu:-$ cd Descargas/Kivy-1.8.0
user@ubuntu:-/Descargas/Kivy-1.8.0$ python3.3 setup.py install


Si querés instalarlo para otra versión, solo cambia "python3.3" por la versión deseada ("python2.7", por ejemplo).

Si no hay ningún error, estás de suerte, y solo queda por importar Kivy:

user@ubuntu:-$ python3.3
>>>import kivy



Pero si te levantaste con el pie izquierdo, entonces vas a tener que hacer algunos pasos adicionales, seguramente habrá aparecido algún problema relacionado a Cython. Realmente no llegué a entender el 100% de lo que hice, pero bajé cython y cython3.
Cython lo conseguí en el siguiente enlace de Ubuntu: http://packages.ubuntu.com/raring/cython3
Lo bajé, lo extraje, y tuve que copiar cada fichero en la carpeta correspondiente dentro de /usr/bin.
Para esto, como usuario común, no podremos hacerlo, por lo que utilizaremos Nautilus:

user@ubuntu:-$ sudo nautilus

Una vez hecho esto, nos dirigimos a la carpeta de Cython3 (que en mi caso tiene el nombre cython3_0.17.4-0ubuntu1_amd64) y dentro está el siguiente sistema de directorios:

Citarcython3_0.17.4-0ubuntu1_amd64/
       ./usr
           ./bin
             cydbg    (fichero)
             cython3  (fichero)
           ./lib
              ./python3
                 ./Cython
           ./doc

Lo que tenemos que hacer ahora es copiar los ficheros cydbg y cython3 a /usr/bin en nuestro sistema de directorios, y la carpeta Cython a /usr/lib/python3.3.

Nuevamente intentamos instalar Kivy:

user@ubuntu:-/Descargas/Kivy-1.8.0$ python3.3 setup.py install

Si nuevamente tenemos un error, es necesario que Cython esté en el directorio de Kivy. Pero debemos bajar "otra versión" al parecer, desde http://cython.org/#download. Una vez descargado, extraemos el fichero, y dentro tendremos una carpeta llamada "Cython". La debemos copiar entera ADENTRO del directorio de Kivy. Y ahora si, abrimos la terminal:

user@ubuntu:-$ cd Descargas/Kivy-1.8.0
user@ubuntu:-/Descargas/Kivy-1.8.0$ python3.3 setup.py install


Y el problema debería estar solucionado, algo como lo siguiente debería aparecer al importar kivy:
Python 3.3.3 (default, Dec 27 2013, 19:27:19)
[GCC 4.6.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import kivy
[INFO   ] Kivy v1.8.0
>>>


Ahora bien, lo que hice yo fue copiar la carpeta "kivy" (dentro de Kivy-1.8.0) a la carpeta de python3.3 (./usr/lib/python3.3, necesitamos Nautilus). Esto es porque para importar Kivy, deberíamos estar dentro del directorio donde fue extraído. De esta manera, estemos donde estemos, podremos importar kivy.

Se que es una solución informal, infundamentada. Realmente fue un rebusque de novato que me di. Espero que le sirva a algún otro novato, y por favor, sepan disculpar las burradas dichas seguramente.
Les mando un abrazo.

PD: Voy a buscar la solución en Windows. Creo que voy a echar una mirada al registro, quizás pueda modificar algunas llaves, y así reemplazar el intérprete "normal" por el Kivy (que es el mismo, pero portable).
------------------------------------------
EDIT:
Encontré una manera mas limpia de instalar bajo Ubuntu, con el siguiente script:

Código (bash) [Seleccionar]

install_kivy_stable_py3_virtualenv.sh
Shell

#!/bin/sh
# Bootstrap Python3.3
sudo apt-get install python-software-properties
sudo add-apt-repository ppa:fkrull/deadsnakes
sudo apt-get update
# Install necessary system packages
sudo apt-get install -y build-essential mercurial git python3.3 python3.3-dev python-gst0.10 ffmpeg gstreamer0.10-plugins-good libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-ttf2.0-dev libsmpeg-dev libsdl1.2-dev libportmidi-dev libswscale-dev libavformat-dev libavcodec-dev libgl1-mesa-dev libgles2-mesa-dev zlib1g-dev
# Bootstrap current setuptools
wget https://bitbucket.org/pypa/setuptools/raw/bootstrap/ez_setup.py -O - | sudo python3.3
# Bootstrap a current Python virtualenv
sudo apt-get remove --purge -y python-virtualenv python-pip
sudo easy_install-3.3 -U pip
sudo pip3.3 install -U virtualenv
# Create a vitualenv
sudo rm -rf venv
virtualenv-3.3 venv
# Install current version of cython into the virtualenv
sudo apt-get remove --purge -y cython
sudo pip uninstall --yes cython
venv/bin/pip install -U cython
# Install other PyGame and Kivy dependencies
venv/bin/pip install -U numpy
# Install pygame into the virtualenv
hg clone https://bitbucket.org/pygame/pygame
cd pygame
../venv/bin/python setup.py build
../venv/bin/python setup.py install
sudo ../venv/bin/python setup.py install
cd ..
sudo rm -rf pygame
# Install development version of Kivy into the virtualenv
venv/bin/pip install kivy
# Install a couple of dependencies for KivyCatalog
venv/bin/pip install --upgrade pygments docutils


Fuente: https://gist.github.com/brousch/8825629 & Ben Rousch jaja
#7
Gente... estoy un tanto desconcertado del por qué Python actúa de esta manera. ¿Alguien me podría decir a qué se debe?

Código (Python) [Seleccionar]

SECTION_LINKS = 'LINKS'
SECTION_NOTES = 'NOTES'
SECTION_EXAMPLES = 'EXAMPLES'
SECTION_DATA = 'DATA'
SECTION_RELATED = 'RELATED'
SECTION_DEFINITIONS = 'DEFINITIONS'
COMMON_SECTIONS = [SECTION_LINKS, SECTION_NOTES, SECTION_EXAMPLES,\
SECTION_DATA, SECTION_RELATED, SECTION_DEFINITIONS]
SECTION_ALGORITHM = 'ALGORITHM'
SECTION_CONTENT = 'CONTENT'
# - Structure
AL_STRUCTURE = COMMON_SECTIONS.append(SECTION_ALGORITHM)
print(AL_STRUCTURE)
DE_STRUCTURE = COMMON_SECTIONS.extend(SECTION_CONTENT)
print(DE_STRUCTURE)


En este caso, la salida de print para ambos es None.

El problema ya lo solucioné de la siguiente manera:
Código (Python) [Seleccionar]

AL_STRUCTURE = [SECTION_ALGORITHM]
AL_STRUCTURE.extend(COMMON_SECTIONS)
DE_STRUCTURE = [SECTION_CONTENT]
DE_STRUCTURE.extend(COMMON_SECTIONS)

Y funciona... Pero mi duda es la siguiente:
¿Por qué en el primer caso AL_STRUCTURE y DE_STRUCTURE pasan a ser de tipo None?
By the way... ¿tienen una manera mas compacta y pythónica de hacer lo anterior? :P
#8
Muy buenas tardes gente... ¿cómo les va? Estoy con una pequeña duda... hace unos días retomé programación, y agarré C++ -aunque por problemas eléctricos estuve sin pc algunos días-. Estoy recién comenzando con punteros, referencias, estructuras, etc y estoy probando pequeños programas para ir entendiendo el funcionamiento.

Pues bien, estuve haciendo un pequeño programa en donde se agrega mediante un bucle for valores de 4 en 4 a cada elemento. Es decir, array[0] = 4, array[1] = 8, etc.
Para esto, y a fines de practicar, lo hice utilizando punteros de la siguiente manera:

EDIT:

#include <iostream>
#include <string>
int main ()
{
    int matriz[10];
    int *ptr = NULL;
    int valor = 4;
    ptr = matriz;
    for (int i=0; i < 10; i++) {
matriz[i] = valor;
std::cout << " DIRECCIÓN: " << ptr;
std::cout << "| VALOR: " << *ptr << std::endl;
ptr++;
valor += 4;
    }
return 0;
}




El programa muestra una salida en terminal como la siguiente:
CitarADRESS: 0x601180| VALUE: 4
ADRESS: 0x601184| VALUE: 8
ADRESS: 0x601188| VALUE: 12
ADRESS: 0x60118c| VALUE: 16
ADRESS: 0x601190| VALUE: 20
ADRESS: 0x601194| VALUE: 24
ADRESS: 0x601198| VALUE: 28
ADRESS: 0x60119c| VALUE: 32
ADRESS: 0x6011a0| VALUE: 36
ADRESS: 0x6011a4| VALUE: 40

Funciona correctamente peeeeero....

Mis dudas son:
1 ) ¿Existe otra alternativa sin usar punteros?
2 ) De ser así, ¿cuál sería la ideal para ustedes?
3 ) En la línea 29 utilizo puntero++ con el fin de avanzar a la siguiente dirección, funciona, pero está bien pensado o funciona de pedo? jaja
4 ) De estar bien el código, ¿alguna sugerencia para este noob? xD Además de los comentarios que los quité :P

Gracias de antemano y les mando un abrazo.

#9

--- Pueden cerrar, ya investigué al respecto, y entendí otras cosas :P Gracias igual.