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 - Khala

#1
Otros lenguajes / Rust - Es un Lenguaje Orientado a Objetos?
Septiembre 27, 2021, 04:29:19 PM
En este articulo, vamos a explorar la Programacion orientada a objetos (OOP) en Rust y cubrir temas como Objeto, Encapsulacion, Herencia, Polimorfismo y otros junto con ejemplos de codigo en Rust.

Contenidos:


  • Introduccion a la OOP
  • Que es Rust?
  • Objetos y Encapsulacion
  • Herencia y Polimorfismo


Empecemos con Programación orientada a objetos.

Introduccion a OOP.
La programación orientada a objetos es un termino que existe desde 1967, creado por Alan Key. En la arquitectura orientada a objetos, el codigo está estructurado en Objetos, que se comunnican entre ellos a traves de interfaces publicas, pero no saben como funcionan los demás internamente.

Esto hace que el programador pueda evitar preocuparse sobre como estan implementados internamente los objetos con los cuales está interactuando. E incluso si esa implementacion cambiara, o fuera totalmente desconocida, mientras las funciones de la interfaz publica no cambien, puede estar seguro que su codigo va a seguir funcionando (A menos que la implementacion esté mal, en cuyo caso.. bueno, no hay mucho que hacer!)

Qué es Rust?
Antes de seguir avanzando... Qué es Rust?



El lenguaje de programacion Rust te ayuda a escribir software que es más rapido y más seguro. En general, control de bajo nivel y facilidad de escritura suelen estar opuestas en el diseño de lenguaje de programacion. Rust desafia este problema. Balanceando  una poderosa capcidad tecnica con la experiencia del developer, Rust te da la opcion de controlar los detalles de bajo nivel (como el uso de memoria) sin los problemas tradicionalmente asociados a dicho control.

Con eso dicho, hay muchas definiciones para la Programacion orientada a objetos (OOP a partir de ahora, por su sigla en ingles), y dependiendo de cual elijas usar, Rust puede ser o no ser un lenguaje OOP. Muchos lenguajes OOP comparten ciertan caracteristicas, como Objetos, Herencia, Encapsulacion...

Veamos como Rust lidia e implementa estas cosas! (Los ejemplos de código estan sacados directamente del Libro de Rust, linkeado al final de este articulo).

Objetos y Encapsulacion

En el libro Design Patterns: Elements of Reusable Object-Oriented Software de Erich Gamma, Richard Helm, Ralph Johnson, y John Vlissides (Addison-Wesley Professional, 1994), los objetos son definidos como:

Programas OOP estan compuestos de objetos. Un objeto empaca tanto datos como los procedimientos que operan con esa data. Los procedimientos son tipicamente llamados metodos u operaciones (O funciones, más tradicionalmente hoy dia)

Usando esta definicion, Rust es un lenguaje OOP. Rust tiene structs y blowues impl que pueden ser usados para almanecar datos y formas de operar con ellos respectivamente.

Código: php
pub struct AveragedCollection {
    list: Vec<i32>,
    average: f64,
}

impl AveragedCollection {
    pub fn add(&mut self, value: i32) {
        self.list.push(value);
        self.update_average();
    }

    pub fn remove(&mut self) -> Option<i32> {
        let result = self.list.pop();
        match result {
            Some(value) => {
                self.update_average();
                Some(value)
            }
            None => None,
        }
    }

    pub fn average(&self) -> f64 {
        self.average
    }

    fn update_average(&mut self) {
        let total: i32 = self.list.iter().sum();
        self.average = total as f64 / self.list.len() as f64;
    }
}


Como se puede ver en el codigo de arriba, tenemos una estructura (el bloque struct) y un bloque de implementacion (el bloque impl). Ésta estructura es comparable a una clase en C# o cualquier otro lenguaje similar. El bloque impl es esencialmente donde las funciones que uno pondria dentro de esa clase.

La estructura esta marcada pub (publica) lo que significa que otro codigo externo a esta estructura puede usarla, pero los camps internos son privados. Esto significa que los datos están encapsulados dentro del 'Objeto' struct. Las funciones add(para agregar), remove( para remover) y promedio (average) tambien estan marcadas como pub, lo cual expone esta interfaz al mundo exterior. Mientras, update_average (actualizar el promedio) se mantiene privada, lo que significa que solo el objeto/estructura AveragedCollection puede usarla. Lo cual tiene sentido. Solo la coleccion deberia ser capaz de actualizar sus propios datos. Esto elimina el problema de terceros alterando los datos de la coleccion sin nuestro conocimiento. Lo cual nos da otro beneficio. Si algo esta mal con los datos, sabemos que el error debe estar en la estructura o en su implementacion, y no en cualquier otro lado de nuestro programa. Esto es uno de los pilares de la programacion SOLID; lo cual está fuera de los contenidos de este articulo, pero puedo explayarme mas en otro, si fuera necesario o pedido)


Herencia y Polimorfismo
La herencia es un mecanismo por el cual un objeto puede heredar parte de su definicion de la de otro objeto, lo cual le da los datos y comporatmiento de su padre, sin tener que definirlos nuevamente.

Considerando herencia, Rust no tiene forma de especficiar que una estructura hereda atributos o funcionalidad de otra. Entonces en este sentido, Rust NO es un lenguaje OOP. No obstante, hay otras soluciones que Rust ofrece que son similares a herencia, por ejemplo, Traits.

Un trait le dice al compilador de Rust sobre funcionalidad que un tipo en particular tiene y puede compartir con otros tipos. Podemos usar Traits para definir comportamiento compartido en una forma abstracta. Podemos usar Traits tambien para especificar que un tipo generico tiene que tener si o si cierta funcionalidad o comportamiento. (Si ya conocen OOP, piensen en una Interfaz. Es esencialmente lo mismo)

Código: php
pub trait Summary {
    fn summarize(&self) -> String;
}


Esto es un ejemplo de un Trait. Tal como una Interfaz en otros lenguajes, cualquier clase o estructura en el caso de Rust que use esto, DEBE OBLIGATORIAMENTE implementarlo en algun lugar de su propia definicion. Un trait puede tener multiples metodos en su cuerpo, y cualquiera que lo use deberá implementarlos todos.

La implementacion se veria algo asi...


Código: php
pub struct NewsArticle {
    pub headline: String,
    pub location: String,
    pub author: String,
    pub content: String,
}

impl Summary for NewsArticle {
    fn summarize(&self) -> String {
        format!("{}, by {} ({})", self.headline, self.author, self.location)
    }
}


A veces es util o necesario tener algun tipo de implementacion por defecto para estos, lo cual es posible:

Código: php
pub trait Summary {
    fn summarize(&self) -> String {
        String::from("(Read more...)")
    }
}


Si queremos usar la implementacion por defecto, se deja el bloque impl vacío. El compilador entenderá que la ausencia de implementacion implica que se usará la implementacion por defecto.

Para mucha gente, polimorfismo es un sinonimo de herencia. Pero en realidad es un concepto mas general que refiere a codigo que puede trabajar con datos de multiples tipos. Para Herencia, estos tipos suelen ser sub-clases.

Rust en cambio usa Generics para abastraer diferentes tipos posibles, y Traits para imponer restricciones sobre que cosas esos tipos deben proveer.

Usando structs, traits y bloques impl, uno puede codear en un estilo OOP, pero como pueden ver, es dificil decir definitivamente si Rust es o no es un lenguaje OOP. En mi opinion, Rust es un lenguaje versátil que de ser necesario, puede ser OOP. Pero si querés aprender sobre el estilo de diseño OOP, es mejor hacerlo con lenguajes más tradicionales en esto, como por ejemplo C#, Java, o incluso C++ (Si eres valiente).

Les pregunto.. Conocen Rust? Han oido hablar de este lenguaje de programacion? Cree que cumple los requisitos para ser OOP?

Link al articulo Original (Con algunos cambios, tambien en ingles, escrito por mi para OpenGenus y traducido tambien por mi para Underc0de) No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Link al libro de Rust (En ingles) No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Gracias por Leer!
#2
Otros lenguajes / Conjunto de proyectos para practicar
Septiembre 19, 2021, 05:17:15 PM
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

En este link encontrarán una gran variedad de tutoriales (Y algo de código de fuente en algunos) para practicar. Desde renderers 3D, pasando por blockchain y crypto, bots, bases de datos, etc. Hay varios ejemplos en diversos lenguajes, por eso lo puse en esta sección de 'otros', en lugar de atarlo a uno.

La idea es poder comprender el concepto de lo que uno quiere construir, y luego construirlo paso a paso. (Sin copiar y pegar).

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos!
#3
Buenas Gente!

Por si no sabían, está abierta la inscripción al primer módulo (Supuestamente el segundo sale cerca del 20 de Septiembre, 2021). Es acerca de Blockchain y criptomonedas! A continuacion dejo un poco de informacion y el link a la pagina!

C1b3rWall Academy es una acción formativa enmarcada dentro del proyecto C1b3rWall, que dio sus primeros pasos en 2018 y contó como materialización más importante el I Congreso de Seguridad Digital y Ciberinteligencia desarrollado en junio de 2019 en la sede de la Escuela Nacional de Policía en Ávila (España). Casi 4.000 personas asistieron a este evento procedentes del sector público de la seguridad, sector académico universitario, comunidades profesionales de hacking y empresas muy relevantes del sector de la ciberseguridad.

La edición online del C1b3rWall Academy 2020 reunió a más de 41.000 personas de 82 países diferentes. Participaron más de 130 ponentes entre los que figuraron miembros de Policía Nacional, universidades, asociaciones y empresas con reconocido prestigio en el ámbito de la ciberseguridad, así como 38 comunidades de hackers de ámbito nacional e internacional.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

#4
Presentaciones y cumpleaños / He vuelto :D
Septiembre 14, 2021, 03:15:06 PM
Buenas!

No es realmente una presentación, mas bien un anuncio de que he vuelto a lurkear por estos lugares. Mi nombre es Khala, algunos de ustedes quizás me conocen de hace muchos muchos años (Me registré en el 2013!) , vivía en el IRC básicamente.

Incursionando nuevamente y mas profundamente esta vez en el mundo de la programación, con particular interés en blockchain, criptografía, y en mejorar mis habilidades y conocimientos como programador en general.

Un saludo, y me alegra mucho estar acá de nuevo :D
#5

Bueno, vengo a dejarles un libro que estoy leyendo, el cual esta MUY bueno al momento de aprender Python y Criptografia a la vez. Explica el codigo paso a paso, explica como funciona lo basico de Python (Tener una base de programacion siempre ayuda). (Utiliza Python 3.2)

Descarga: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Saludos :)
#6
C / C++ / Beej's guide to Networking[PDF]
Octubre 13, 2014, 02:51:01 PM
Les dejo el link al PDF a la guia en español de esta guia. Esta principalmente hecha para programar en linux, pero incluye las modificaciones necesarias que deberan hacer los que usen otros S.O's.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta



Tabla de contenidos(Relevantes)

  • ¿Qué es un socket?
  • structs y manipulacion de datos
  • Llamadas al sistema
  • Modelo Cliente-Servidor
  • Técnicas moderadamente avanzadas
  • Referencias adicionales

Dejo tambien el link a la guia original en ingles por si a alguien le interesa!
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#7


En el siguente tutorial voy a explicar algunos comandos basicos para usuarios y operadores de un canal de IRC. Abajo de todo dejo el link con la pagina de la cual saque esta informacion por si quieren leerlo de la fuente. En ese link tambien hay ejemplos y algunos comandos que no inclui por sentir que no encajaban en el contexto. Desde ya, solo me encargue de traducir lo que decia la pagina :)

Comandos para Usuarios.

/help

El primer y mas util de los comandos. Simplemente escribes /help donde normalmente escribes para comunicarte y va a devolverte una lista con todos los comandos disponibles.

Tambien puedes escribir /help <comando> para obtener ayuda acerca de dicho comando.

Ejemplo: /help who

/server servidor

Cada servidor tiene su propio 'hostname' como por ejemplo No tienes permitido ver los links. Registrarse o Entrar a mi cuenta, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta entre otros. Para especificar a que servidor quieres conectarte, simplemente escribes el comando como esta descripto arriba.

Ejemplo: /server No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

/nick Nuevo-Nick

Este comando es bastante sencillo de entender. Eliges que nick vas a usar y el cual van a ver los otros usuarios.

Ejemplo: /nick Foo123

/list

Hace una lista de los canales que hay en el servidor al qu estas conectado, la cantidad de usuarios y los temas para cada uno.

Si estas en un servidor grande, probablemente esta lista sea muy larga, e incluso pueda desconectarte por la cantidad de informacion que te tira.

/names #canal

Te mostrara el nombre de todos los usuarios actualmente conectados a dicho canal. Hoy en dia la mayoria de los usuarios estan como "invisibles", naturalmente, estos no aparecen en tu lista.

/whois Nick

Este comando devuelve informacion relacionada con el usuario que tiene actualmente el Nick que especifican. La informacion devuelta es: La conexion, desde donde esta hecha (dependiendo de como este registrado el usuario, puede mostrar su IP o no). Tambien muestra los canales publicos a los que esta unido ese usuario, y finalmente en que servidor esta conectado. Puede incluso tambien mostrar si el usuario esta inactivo, hace cuanto lo esta, y en que momento se conecto. (Es posible que la informacion varie, o este dada en distinto orden que lo que describo aqui. Mejor probar uno mismo y verlo :D)

Ejemplo /whois Khala
Devuelve:
* [Khala] ([email protected]): realname
* [Khala] +#underc0de
* [Khala] No tienes permitido ver los links. Registrarse o Entrar a mi cuenta :Stockholm, SE
* [Khala] is using a secure connection
* [Khala] is connecting from *@xxx.xxx.xxx.xx xxx.xxx.xxx.xx
* [Khala] idle 00:10:50, signon: Thu Oct 09 15:09:49
* [Khala] is logged in as Khala

/away [Mensaje-Opcional]

Con este comando, nos ponemos en estado 'away', indicando a cualquiera que intente mandarnos un mensaje privado, que no estamos y a continuacion el mensaje que nosotros pusimos. Por ejemplo:

/away vuelvo en 5 minutos.

Si alguien te habla aparecera "<Tu-Nick> esta ausente. (Vuelvo en 5 minutos)" (Aclaracion: el formato varia de servidor a servidor).

Esta informacion tambien saldra si alguien intenta hacer /whois con tu nick.

Para quitar el estado de away, vuelves a poner /away sin ningun mensaje.

/quit [Mensaje opcional de despedida]

Sales del IRC, te desconectas del servidor y abandonas todos los canales en los que te encuentras. Y en caso de poner algun mensaje, lo muestra a los otros usuarios en el mensaje que les informa que te has desconectado.

/msg Nick Mensaje

Con este comando mandaremos un mensaje privado a la persona cuyo nick especificamos. Para responderte, la otra persona tendra que escribir el mismo comando pero con tu nick. Los mensajes privados solo pueden ser leidos por el creador y quien los recibe, nadie mas.

Tambien existe la alternativa /msg #nombre_canal [mensaje opcional] para mandar dicho mensaje a todos los usuarios que esten actualmente en dicho canal.

/query Nick

Esto lo que va a hacer es armar una 'ventana privada' con la otra persona. Su uso es puramente el de poder mandar mensajes privados sin tener que andar escribiendo /msg Nick Mensaje cada vez. Solo comodidad.

Los comandos a continuacion son usados una vez que estamos conectados a algun servidor.

/join #canal

Si conocen algun canal que pertenezca al servidor, o por medio del comando /list, se utiliza este comando para unirse a dicho canal.
Ejemplo: /join #underc0de

Todos los canales de IRC tienen como prefijo el caracter # asi que no te lo olvides :).

/me hace algo

Este comando 'hace' una accion en el canal. Se usa mas que nada para 'juegos'. la mejor forma de explicarlo seria con un ejemplo.

Supongamos que mi nick es "TuNick". Al escribir /me abre un canal lo que se veria en el canal seria literalmente: "TuNick abre un canal". Siempre usa /me y la accion en tercera persona, sino terminaras con algo con poco sentido gramatico :D

/leave [canal]

Con este comando sales del canal especificado, si no especificas ninguno, saldras del actual (del que mandas este comando).

Registro de nick/usuario
En el caso de usar freenode, algo muy recomendable es registrar tu nick. No es algo muy complicado pero si es la primera vez que lo haces puede ser algo tedioso. Paso a explicar los pasos a seguir.

1- /msg NickServ REGISTER password No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Como primera medida, elige un usuario/nick para utilizar y pontelo como actual usando /nick TuNick. Luego mandas el comando aca arriba, reemplazando password y el mail, por una contraseña segura y tu mail respectivamente.
El mail no se le enviara a nadie, es principalmente usada para ayudarte a recuperar tu cuenta en caso que pierdas tu contraseña. Una vez hecho esto te llegara un mail con un comando de confirmacion que deberas 'ejecutar' (como todos los otros en este tutorial) para confirmar tu cuenta.
Para mantener tu mail privado, ejecuta el siguiente comando (Aunque se establece por defecto con cuentas nuevas) /msg NickServ SET HIDEMAIL ON.

Una vez hecho esto.. listo! Nick registrado. (Para mas informacion, No tienes permitido ver los links. Registrarse o Entrar a mi cuenta)
En caso que no uses freenode, busca como registrar el nick en el servidor que utilices.

Comandos para Operadores.

Los operadores o "ops" son las peronas que tienen control absoluto (debajo del dueño del canal, pero no es relevante) sobre sus canales. Ellos tienen el derecho de decidir quien entra, quien se va, quien debe irse, quienes hablan quienes no. Debes acoplarte a sus reglas, sino vas a terminar siendo echado de la mayoria de los canales a los que te unas.

Dicho esto, sigamos!

/topic #canal tema

Los canales tienen temas (topics) que generalmente indican el tema actual de conversacion. Generalmente esto se muestra constantemente en algun lado de tu cliente grafico (Mas sobre esto al final del tutorial :D)

Ejemplo: /topic #underc0de Bienvenidos a Underc0de!

/kick nick [razon opcional]

Con esto literalmente echas a una persona del canal, con la razon especificada, si es necesario. Si no se especifica ninguna razon, se usa el nick del operador que "kickea" como razon.

Modos de canales.
Agregando a estos 2 comandos, el comportamiento de cada canal se puede controlar mediante los modos. No voy a entrar increiblemente en detalle en cada uno. Cada modo es denotado con un caracter, y se puede prender o apagar dicho modo usando + y - respectivamente. Por ejemplo, supongamos modo 'x'. +x lo prenderia, -x lo apagaria. En los siguientes puntos dejare entre parentesis el caracter que denota dicho modo.

La manera de especificar un modo para un canal es el siguiente:

/mode #canal +/-caracter-de-modo. Por ejemplo /mode #underc0de +p

Publico: Este es el modo por defecto de los canales. Significa que este canal va a aparecer en la lista de /list y podras usar /names en el.

Privado (p) o Secreto(s): al contrario de los canales publicos, estos canales no aparecen en /list, no podras usar /name en ellos, y puede que logres conectarte a ellos sabiendo su nombre, como puede que no. Estos canales suelen prometer seguridad y privacidad a sus usuarios.

Nada de mensajes externos al canal(n): No entrara ningun mensaje del estilo /msg #nombre_canal [mensaje] que normalmente le llegaria a todo usuario del canal.

Control de tema(t): Si esta encendido, solo los ops podran cambiar el tema del canal.

Operador de canal (o [nick]): Cualquier Op puede darle Op a cualquier otro usuario. Una vez que le des op a otro, este pasa a tener absolutamente todos los derechos que tiene cualquier op. Podria quitarte el op y hasta echarte. Asi que solo dale op a la gente que conozcas y con quien tengas confianza. (Ejemplo: /mode #underc0de +o TuNick (Para dar op, o -o para quitarlo)

Tambien pueden hacerse varios a la vez, por ejemplo:
/mode #underc0de +ooo TuNick SuNick SusNicks (Si, me estoy quedando sin nombres para nicks :D)

Moderado(m): En un canal moderado, solo los operadores del canal pueden hablar publicamente, los otros usuarios no podran mandar mensajes. La excepcion es si te dan voz (+v). LOs canales moderados son utiles para conferencias o para mantener el control en un canal concurrido.

Solo Invitados(i): A este canal solo van a podrar entrar las personas si son invitadas por un op.
Para invitar a alguien, /invite Nick #canal

Limitado(l [numero]): Limita la cantidad de usuarios que pueden estar en el canal. /mode #canal +l 20 solo permitiria que 20 personas esten a la vez en el canal.

Luego para quitar el limite, no hace falta especificar el numero. Con /mode #canal -l alcanza.

Protegido por contraseña(k contraseña): Para poder entrar a un servidor protegido por contraseña.. debes saber la contraseña, claro esta. Para especificarla usas /mode #canal +k contraseña. Cuando alguien quiera entrar, debera hacerlo de la siguiente manera: /join #canal contraseña.
Para remover la contraseña, a diferencia del modo limitado, si hay que especificar la contraseña. /mode #canal -k contraseña.

Bans (b [nick!user@host]): Uno de los comandos mas complicados de utilizar. Una vez que alguien ha sido kickeado puede volver a entrar automaticamente al canal.. Para evitar eso, usamos los bans. (Recorda, si queres que alguien no pueda volver a entrar, primero ban, luego kick.). Un consejo, si ya estas conectado a un IRC, utiliza /whois en alguien que conozcas, o en tu mismo, y mira bien la informacion que te devuelve. Si no estas conectado, conectate y hazlo. Es importante para esta parte. El parametro [nick!user@host] se conoce tambien como ban mask

El caracter "*" es un comodin para remplazar cualquiera de las partes que la 'victima' puede cambiar.

(Para esta seccion voy a copiar exactamente los ejemplos de la pagina de la cual yo consegui esta informacion, va a ser mas sencillo que lo haga asi.)

Por ejemplo. Queremos banear a buddy. Y su /whois nos dice:

*** buddy is No tienes permitido ver los links. Registrarse o Entrar a mi cuenta (Think different.)

En este caso el ban mas especifico seria: "[email protected]
Noten como se usa ! y @ para separar el nick!usuario@host. Si buddy cambiara cualquier parte de esta combinacion, podria volver a entrar a nuestro canal. Podria cambiar muy facilmente, por ejemplo, su nick usando /nick, o el usuario saliendo y volviendo a entrar (si posee un entorno grafico como mIRC)

Cualquier parte de este comando puede ser cambiado por un * que implica "Todos." Por ejemplo, si hicieramos "*[email protected]" baneariamos todos los nicks que pertenecientes al usuario abcd del host No tienes permitido ver los links. Registrarse o Entrar a mi cuenta.

Para ver los bans actuales del canal, estando fuera o dentro de el, basta con no usar ban mask. Por ejemplo /mode #canal +b.

Para quitar un ban, hay que usar exactamente la misma ban mask que fue usada al momento de banear al usuario (Se puede chequear viendo los bans actuales).

Clientes

La seleccion de clientes es bastante grande para todas las plataformas (Windows, Mac, Linux, Android, etc), sin considerar que tambien es posible conectarse directamente desde un navegador de internet cualquiera. Abajo les dejo unos links con algunos de los clientes mas usados, para que puedan entrar e investigar por su cuenta.

Linux: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Windows(7): No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Bibliografia
Toda la informacion aqui (mas las partes omitidas por poseer complejidad que va mas alla del objetivo de este tutorial) esta tomada de la siguiente pagina. No soy autor de nada de lo que esta escrito aqui.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
#8
Otros lenguajes / Recopilatorio de VideoTutoriales
Octubre 11, 2014, 04:37:03 PM
En el siguiente canal encontraran muchisimas listas de reproduccion con videotutoriales desde basicos a avanzados de muchos temas relacionados con programacion. Desde C, Java, Android develpment, hasta como programar juegos e incluso de temas que nada que ver con programacion! Se los recomiendo :)

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

PD: No soy autor de estos videos ni del canal :D (por las dudas que me jodan)
#9
C / C++ / De cero a C
Agosto 31, 2014, 12:21:34 AM

DISCLAIMER: NO SOY UN EXPERTO EN C. Ni cerca. Soy simplemente un estudiante de Ingenieria en Informatica en la FIUBA al cual desafiaron a realizar esta tarea que van a leer ahora. El desafio fue ir armando una especie de recopilacion / tutorial de lo que voy viendo en la materia Algoritmos y programacion II. Solo me voy a encargar de lo 'practico' la parte teorica la voy a evitar ya que aun no entiendo bien ciertas cosas (Eficiencia de algoritmos, etc). Asi que bueno.. Empecemos :)

Comencemos desde el principio.

1- Qué es C? (Un pequeño recopilado de Wikipedia. Lo va a explicar mejor que yo. Si quieren ahondar: No tienes permitido ver los links. Registrarse o Entrar a mi cuenta ).

C es un lenguaje de programación creado en 1972 por Dennis M. Ritchie en los Laboratorios Bell. es un lenguaje orientado a la implementación de Sistemas Operativos,

concretamente Unix. C es apreciado por la eficiencia del código que produce y es el lenguaje de programación más popular para crear software de sistemas, aunque

también se utiliza para crear aplicaciones.

C es un lenguaje compilado. Qué significa esto? Que nosotros nos vamos a encargar de escribir el código, otro programa llamado compilador va a tomar ese codigo, y nos

va a dar nuestro programa ejecutable. No es tan simple como lo describo pero es lo que hay que saber. Existen otros tipos de lenguajes, por ejemplo los interpretados,

que no son compilados, sino que son 'interpretados' por otro programa. Ejemplo, Python.

Insisto, para detalles mas especificos, buscar en google o ver el link de wikipedia.

2- Introduccion a C.
Código: c

#include <stdio.h>
/* Programa que imprime "Hello world!" en consola. */
int main(void){
        printf("Hello World!");
getchar();
return 0;
}


El primer programa el cual en mi opinión todo programador nuevo debería escribir, en el lenguaje que desea aprender, es el clásico hola mundo. Y, como es habitual,

vamos a ver línea por línea que hace cada instrucción, obviamente, hay cosas que aún no se van a entender, pero con el tiempo va a ser algo común. :)

1- #include <stdio.h>

Ésta es una de esas lineas que al principio no se entienden muy bien. Pero veamos. Hay mucha funcionalidad de C que no esta incluida en todo programa que uno escriba,

pero sí esta agrupada en archivos llamados "librerías". Éstas librerias poseen la extensión .h y, al momento de incluírlas en nuestro programa deben escribirse entre <

> como muestra el programa arriba. (Algunos ejemplos serian, stdio.h -Standard Input Output, stdlib.h -Standard Library, entre otros). Más adelante cuando aprendamos

más, vamos a poder hacer nuestrar propias librerías y agregar o usar modificaciones funcionales. Es mejor no ahondar mucho en este tema ahora, en un futuro no muy

lejano va a tener mucho mas sentido. Sigamos!

2- /* Programa que imprime "Hello world!" en consola. */

Ésto es un comentario. Los comentarios son lineas o mejor dicho, porciones de 'código' que no va a ser compilado. Son a la vez algo que no tiene uso, y algo muy

importante. Paso a explicar por qué y probablemente muchos no esten de acuerdo. No tiene uso. Por qué? Porque no es algo que el compilador (como dijimos arriba) vaya a

tomar en cuenta a la hora de ensamblar nuestro programa.

Ahora, si son algo que no van a ser tomado en cuenta, por qué son algo importante? Simple. Nuestro código, eventualmente, va a ser leído por otras personas. O incluso

por vos mismo en 6 meses cuando reveas cosas que ya has escrito. Los comentarios ayudan a documentar, y dar a entender qué estabas pensando, por qué hiciste algo de

cierta forma, como funciona cierta u otra parte del código, etc. Es lo que permite o ayuda que alguien que no sabe que estabas haciendo, pueda entender que hace tu

programa.

Creeme que si 2 personas escriben el mismo código. Uno que sabe toneladas de programacion y otro que apenas se defiende, y, el que sabe mucho no agrega comentarios, y

el otro si.. Adivina qué codigo podrás entender con mayor facilidad? El documentado o el no documentado? El del experto o el del novato?

3- int main(void) {

Hay 2 cosas que decir sobre esta línea en particular. La funcion main es el punto de entrada de tu programa, es decir, el mismo empieza con main. Por ahora es todo lo

que hace falta saber. Todo programa tiene una funcion main, siempre se escribe igual (por ahora). Lo segundo, la llave ({). Las llaves en C determinan bloques de

código. Siempre que se abra una llave, se cierra en otro lado. Muchos errores bizarros pueden saltar a la hora de compilar si uno olvida cerrar una llave.

4- printf("Hello World!");

La funcion printf pertenece a la libreria stdio.h y es precisamente es la que "imprime" texto a la pantalla. La cantidad de funcionalidad que ofrece printf (print

format) es demasiado grande, y no es el punto de este post ahondar demasiado en ella. Lo que es necesario saber: En loss parametros de printf (Lo que va entre

paréntesis) es lo que será escrito. No desesperen, ya veremos funciones bien en otro momento :).

5- getchar();

Otra funcion que veremos en detalle más adelante. Ésta te dejo que averigües su funcion en nuestro programa a vos mismo. Intenta compilar y correr el programa (el

ejecutable) con y sin ella y veras por qué razón la incluímos.

6- return 0;

Nuestro programa es básicamente 'llamado' por el sistema operativo cuando lo corremos. La mayoría de las funciones devuelven valores, por ejemplo. Si escribiéramos una

funcion suma(a,b), la idea sería que sume los números a y b y devuelva el valor de dicha suma. Main es una función particular, ya que, devuelve 0 siempre que no haya

problemas. Si surgiera algún error, devolvería otro valor distinto de 0. Una vez más, se verá mas adelante.

7- }

Como dijimos, todos los bloques de código empiezan y terminan con llaves.. Y main no es la excepción.



Bien. Si me seguiste hasta acá y no saliste volando de la PC a estudiar cocina o diseño de interiores, logré mantener tu atención y/o interés lo suficiente. Quedate un

poco más!

Variables

¿Qué es una variable? Una variable es básicamente, un 'espacio' de memoria en el cual nosotros guardamos un valor para usarlo luego.

Digamos que queremos hacer un programa que tome 2 números, los sume,y muestre su valor en pantalla. Necesitaríamos pedir 2 valores al usuario y guardarlos en algún

lado para poder hacer la cuenta luego. Con eso. Sigamos.

Código: c

#include <stdio.h>

int main()
{
    int a,b;

    printf("Dame el primer numero. ");
    scanf("%d", &a);

    printf("Dame el segundo numero. ");
    scanf("%d", &b);

    printf("El resultado de la suma es: %d", a + b);
    return 0;
}


Este programa hace exactamente lo que pedimos. La línea int a,b; es la declaración de variables. Para declarar variables, C necesita saber de que tipo son, para poder

asignarle la memoria necesaria. Claro, no es todo lo mismo. No es lo mismo guardar una letra, que un número entero, o que un numero con coma y 15 decimales, por decir

algo exagerado.

Algunos de estos tipos son: int (integer, enteros), char (Character, caracteres), float (punto flotante, los numeros decimales con coma) entre otros. En otro post

vamos a ver mas en detalle todos los tipos de variables.

Por último, para terminar de entender el programa de arriba, la función scanf es prácticamente la hermana de printf. Printf muestra, scanf recibe informacion de un

método de entrada, en general el teclado. Se usa de esta forma: scanf("%tipo", &variable en la que se guardará el dato). El %tipo depende de qué es lo que se guardará,

en este caso, d para 'decimal'. Algunos de estos tipos serian, %d para int's, %f para float's y %c para char's.

Creo que es suficiente para ésta primera entrega. Aún nos falta mucho y, siendo mi primera vez escribiendo un tutorial, tengo mucho que mejorar. En los próximos posts

incluíre imágenes y más links. Ante cualquier duda, manden un mp o.. recurran a google. Todo lo que dije está explicado en más profundidad en otras páginas.

Hasta la próxima. Suerte programando! -Khala :)!

Changelog
v-o.1
Primera entrega.
#10
Programa de tutores en underc0de / Clases de apoyo de programación.

La idea es la siguiente:

Básicamente, como dice el título, un programa de tutores / clases de apoyo de programación.
Ambos se van a manejar un poco diferente, pero antes de decidir meterme de lleno y organizar bien el asunto, prefiero ver cuál es la respuesta del foro en general.

Programa de tutores:
Los expertos en cada lenguaje tomarían alumnos (Máximo de tres para no enloquecerse) y darían una mano ayudando, guiando, y ofreciendo información, ya sea a través de consejos, bibliografia recomendada, o resolución de dudas. NO van a enseñar. NO van a resolver tareas. Solo van a guiar.
Todos sabemos que la cantidad de información en cuanto a informática es increíblemente grande, y los principiantes nos perdemos muy fácilmente a la hora de buscar buena información. O simplemente no sabemos por dónde empezar.
El esfuerzo seria principalmente llevado por los alumnos.. Aprenderán o mejorarán tanto como esten dispuestos a esforzarse.

La siguiente idea.. Las clases de apoyo:

Si no hay disponibilidad (ya sea humana u horaria) de algun experto de alguno de los lenguajes de programación dados en este foro, podríamos organizar pequeñas clases de apoyo de programación en general (de ningún lenguaje en particular), ya sea en el IRC de underc0de o algún canal paralelo, junto con algun espacio en el foro. En este lugar los usuarios podrían traer dudas, y se explicarían con algun ejemplo.

Los encargados de ayudar en estos lugares no tienen por qué ser expertos en todos los lenguajes, o alguno en particular. Con saber conceptos basicos de programacion alcanzaría. En este espacio también podrian responder usuarios. Responder no se limita a los encargados.
No se asegura que las dudas sean respondidas, ya que sería un lugar comunitario para resolver problemas sencillos.
Este tipo de "taller" se podría realizar en el IRC, en ciertos horarios dedicados (No-restrictivo), para promover a la vez el uso del canal IRC.

Mi opinión.. Creo que ambos "programas" funcionarían bien a la par. Desde ya, empezar esto o no queda en las manos del foro. Yo solo aporto mi idea :)

Saludos!
#11
Presentaciones y cumpleaños / Buenas!
Septiembre 26, 2013, 04:38:19 AM
Hola! Mi nombre es Raziel, tengo 19 años y soy un novato en cuanto a seguridad informatica y programacion, pero tengo mucha ganas de aprender! Cualquiera que se sienta con ganas de gritarle a un noob y acompañarlo un poco.. Acepto mensajes *_* Desde ya gracias por el foro, gracias por las respuestas a las preguntas que probablemente empiece a spammear por todos lados!

Un gusto!