Bajo presupuesto + Genialidad
Ocio
Permalink: http://www.mononeurona.org/users/entry/vendaval/1054
Fuma!!!
Ocio
Permalink: http://www.mononeurona.org/users/entry/vendaval/1053
A small price to pay for immortality.
General
Es un comercial muy bueno, que me pone a pensar en que hay que hacer algo...Grandioso.
saludos.
Permalink: http://www.mononeurona.org/users/entry/vendaval/1050
Responsabilidades
Software
Me da gusto formar parte de la Mononeurona, de estudiar una carrera que amo y no tener una cabeza tan dura, y por que no es tan dura escribo esto:
Muchos nos dedicamos (o dedicaremos) al desarrollo de software, y esto es en muchos casos peligroso, hoy todos tenemos una computadora para aplicaciones cotidianas, desde el celular hasta la laptop, maquinas que requieren de un software para funcionar. en estas maquinas ponemos nuestro dinero, educación, diversión e incluso hasta la vida, si vamos a poner todo ese peso en un software, mas vale que este bien diseñado, que sea escalable y modificable sobre todo de calidad. para mi gusto todas las aplicaciones deberían tener el toque academico.
Claro el mundo seria mejor si todo fuera como te lo enseñan en la escuela, claro, las cosas no son asi, la gente se desespera, pierde dinero, muere por errores en cálculos, programación y humanos, tal vez es un caso extremo, pero esas maquinas son parte de nosotros, alguien es tal o cual numero en una base de datos o tiene esta o aquella IP, correo electrónico, blog, etc.
Poca gente dedicada a esto sabe como y cuando instalar parches, imaginemos lo siguiente, un servidor en producción No Debe tener teclado, mouse y mucho menos monitor, solo debe ser visto vía ssh, si funciona dejalo, si se ha publicado algún parche critico, no lo instales de inmediato, infórmate de como les ha funcionado a los demás, no te puedes dar el lujo de instalarlo y que te provoque algún problema con tu servidor (han odio de soluciones que causan otros problemas, son comunes). tu software no sera el mas nuevo por la misma razón...que te puede costar si no eres precavidos, horas extras de trabajo, dinero, mucho dinero, tu empleo, etc.
La labor del respaldo es critica y tediosa, consume recursos y espacio, pero siempre es necesaria.
Para cada área posible dentro de este basto mundo de las TI, se tiene que ser responsable...Son muchas ideas, poco tiempo...
La ingenierÃÂa del Software es (muy)importante.
La administración de los recursos es vital en muchos casos.
La lo que hagamos hoy en nuestras computadoras puede revolucionar el mundo del mañana, hay que ser cuidadosos.
Disculpen mas que una entrada son ideas escritas sin mucha coherencia.
Permalink: http://www.mononeurona.org/users/entry/vendaval/1041
Queridos Reyes Magos
Ocio
1.-The Art of Computer Programming
2.-ACER Ferrari 5000 De preferencia con Windows Vista Ultimate Force Attack of MS. o como Carajos se llame.
3.-PS3 para esas tardes de lluvia, cuando uno no puede salir por que se inundo.
4.-Tanenbaum, Andrew. "Sistemas operativos: diseño e implementacion" (no requiere presentacion)
5.-UML Y PATRONES - Introducción al Análisis y Diseño Orientado a Objetos.
6.-NetBSD 4.0 para no descargarlo de la MN.
7.-Un smart por que parece de juguete.
8.-Una chamarra de la UAM-AZC por que hace frio.
9.-Un trabajo aqui, aqui o aqui.
10.-Paz para los Mononeurones de buena Voluntad y que sus deseos se realicen con el peso del esfuerzo y dedicación.
Gracias.
P.D. El teléfono de la chamaca que vende juguetes enfrente de mi puesto no me viene mal tampoco. ;)
Permalink: http://www.mononeurona.org/users/entry/vendaval/1033
Civil War
Ocio
Recien en una visita aun centro comercial me encontre un "Comic" de una saga muy interesante, muchas cosas pasan y bueno una imagen vale mas que mil palabras:


Permalink: http://www.mononeurona.org/users/entry/vendaval/990
Aprendiendo C (7ma. Parte)
Software
/*Programa que recibe un arreglo de valores float y devuelve su potencia n*/
#include<stdio.h>
float SuperPower(float base, int potencia);//Prototipo de la funcion
int main()
{
int i,j,tam;
printf("dame el tamanio del arreglo\n");
scanf("%d",&tam);
float A[tam];
printf("Dame los valores del arreglo\n");
for(i=0;i<tam;i++)
scanf("%f", &A[i]);
printf("dame la potencia\n");
scanf("%d",&j);
for(i=0;i<tam;i++)
printf("%f\t%f\n", A[i],SuperPower(A[i],j)); //Llamada a la funcion
return 0;
}
float SuperPower(float base,int potencia)//definicion
{
int i;
float acumulador=1;
if(potencia>0)
{
for(i=0;i<potencia;i++)
acumulador*=base;
}
else
acumulador=1/SuperPower(base,-potencia);//pequenia recursion
printf("%f^%d ->", base, potencia);
return acumulador;
}
Como podemos ver en la tenemos algo que se llama “prototipo” de la función definido antes de la función main(), esta es una notación heredada del lenguaje c++ y que se adopto para el estándar ANSI C. Normalmente una función como en matemáticas solo regresa un valor o ninguno (Tipo void), este valor tiene asociado un tipo que puede ser char, int, float, etc. En el ejemplo es un tipo double, tenemos además el nombre con el que se invocara a la función “SuperPower()” entre paréntesis tenemos la lista de parámetros que se definen por su tipo y un nombre, el nombre es opcional, sin embargo, es importante ponerlo con fines de documentación y claridad del código, tambien puede no tener parametros en cuyo caso se especifica como void. El prototipo termina siempre en punto y coma ‘;’.
Dentro de la función main() tenemos las invocaciones a la función “SuperPower()” con sus respectivos argumentos, ordenados por el tipo y orden que esta especificada en el prototipo de la función, exactamente la función de dicho prototipo es indicar al compilador el orden y numero de parámetros que deberá tener una función, esto facilita la detección de errores por parte del compilador.
Tenemos también la definición de la función, esto incluye los parámetros descritos en el prototipo y el cuerpo de la función, el cuerpo incluye las instrucciones que se realizaran cuando esta es llamada. La ubicación de dicha definición es arbitraria, los viejos hackers en UNIX solían ubicarlas al inicio antes de la función main(), esto por sus costumbres heredadas del ENSAMBLER. Actualmente la literatura especializada en el tema suele ubicar las definiciones de las funciones después del a función main.
Dentro de la definición vemos la siguiente instrucción:
acumulador*=base;
El operador "*=" se usa para abreviar la operación
acumulador =acumulador * base;
Existen las corespondientes abreviasiones para los operadores de suma,resta, división, modulo, etc. estos operadores se llaman oficialmente operadores de asignación
También tenemos una segunda llamada ala funcion dentro de si misma, este tecnica de programacion se llama recursión y hare una nota breve sobre ella en la próxima entrada, sin embargo, es importante que notes que la funcion hace una llamada a si misma con alguna modificacion en los argumentos, a la hora de correr el programa tendras una salida con valores y una flecha que te muestra cuantas llamadas se hicieron antes de regresar el valor final despues de la tabulacion. para el caso particular de la potencias solo se hacen 2 máximo, pero en otros programas usaremos estas "banderas" para fines explicativos.
La utilidad de las funciones es grande, pero es mí deber mencionar que la existencia de muchas funciones dentro de un programa facilita su depuración, sin embargo, disminuye su velocidad. Además es un tema amplio, tratare de explicar la mayoría de los asuntos de interés. Veamos algo distinto y que es importante cuando se trabaja en grupos y se requiere que un grupo de programadores trabajen sobre una misma serie de funciones. Se volvería tedioso tener que escribir cada función dentro del mismo archivo, aun cuando solo sea un “copy&paste”, para esto podemos crear nuestras propias bibliotecas y permitir que el resto de los programadores solo las enlacen. Vemos como se hace, la verdad no tiene mucho chiste, pero habrá que explicarlo con un ejemplo:
/*/home/vendaval/funcion.c*/
/*Programa que recibe un arreglo de valores float y devuelve su potencia n*/
#include <stdio.h>
#include "vendaval.h"
int main()
{
int i,j,tam;
printf("dame el tamanio del arreglo\n");
scanf("%d",&tam);
float A[tam];
printf("Dame los valores del arreglo\n");
for(i=0;i<tam;i++)
scanf("%f", &A[i]);
printf("dame la potencia\n");
scanf("%d",&j);
for(i=0;i<tam;i++)
printf("%f\t%f\n", A[i],SuperPower(A[i],j));
return 0;
}
------------------------------------------------------------------------------------------------------------------------
/*/home/vendaval/vendaval.h*/
#include<stdio.h>
float SuperPower(float base, int potencia);//Prototipo de la funcion
float SuperPower(float base,int potencia)//definicion
{
int i;
float acumulador=1;
if(potencia>0)
{
for(i=0;i<potencia;i++)
acumulador*=base;
}
else
acumulador=1/SuperPower(base,-potencia);//pequenia recursion
printf("%f^%d ->", base, potencia);
return acumulador;
}
Como notaras solo habrá que listar los prototipos y después las definiciones de cada función. Simple ¿no?, luego solo lo metemos a un archivo cuyo postfijo o extensión sea “.h”.
Otro asunto es cuando se hace la inclusión de la biblioteca por medio de la directiva #include, en este caso usamos comillas dobles, esto es por que la biblioteca esta en el mismo directorio que el archivo con la función principal,
Usualmente en Linux hay un directorio "/usr/include" que tiene todas las bibliotecas estandar -desconozco como sea para los BSDs, Solaris 9 (el de la UAM) lo tiene- el hecho es que si quieres invocar tu biblioteca con '<' y '>' necesitas moverlo a la ubicación de las demás bibliotecas, en linux la antes citada.
Breviario cultural: La palabra “parámetros” solo se usa cuando hacemos referencia al prototipo o definición de la función, cuando hacemos referencia a la función cuando esta es llamada usamos “argumentos”.
Hoy aprendimos:
1.-Prototipo, definición y llamada de una función.
2.-Creación y uso de bibliotecas de funciones.
En la siguiente entrada hablaremos mas detalladamente de las funciones, incluyendo una breve nota de recursión.
Permalink: http://www.mononeurona.org/users/entry/vendaval/975
Aprendiendo C (Apendice C -"a Revisar")
Software
Nota del Autor. Deseo que expresen sus dudas y opiniones para que este apéndice se verdaderamente enriquecedor para los lectores de la obra final, de momento es pequeño por que mis conocimientos en el area son reducidos.
Apéndice C: Notas breves sobre licencias libres
Aunque hemos pretendido ser formales en los aspectos técnicos del lenguaje C, existen otros asuntos que es conveniente tratar cuando se crea software. Esto es las licencias.
El software como cualquier otra obra de autoría propia, el autor tiene todos los derechos sobre el esto es lo que se llama copyright. Cuando decidimos liberar nuestra obra podemos hacerlo en diferentes formas, una –y la menos recomendable- es dejarla al dominio publico, es sin duda la forma mas sencilla porque solo hay que dejarla sin copyright. Esta forma de liberar la obra nos deja sin los recursos para poder demostrar la autoría de la obra y con ello sus derechos.
La otra forma es por medio de una licencia “libre” u”OpenSource”, esto se hace basándonos en el copyright, aunque normalmente este recurso se usa para limitar la libertad del usuario del software, también se puede usar para lo contrario, de esta idea han nacido nazcan licencias especiales que dan privilegios de Uso, Copia, modificación, redistribución, tal vez bajo ciertas restricciones propias de cada licencia.
En cuanto a las licencias su proliferación es increíble aunque las mas usadas son GPL, BSD y MIT. Esto para software, pero ningún software es bueno si no tiene su documentación y esta también hay que licenciarla tenemos opciones como Creative Commons, GNU FDL y por supuesto Mononeurona Commons License bajo el cual se licencia el presente trabajo.
La elección de la licencia es personal y deberá ser adecuada para la obra, usaremos un ejemplo sencillo para mostrar los pasos del licenciamiento en este caso con licencia 4-clause BSD (Original BSD)
1.-Debemos agregar el copyright con año y nombre
//”Copyright © 2007 , Alberto Rodríguez Sánchez (Vendaval) all rights reserved”
/*University of California, Berkeley*/
Nota que use “copyright” y no derechos de copia o algo similar, no uses traducciones en especial cuando usas licencias en ingles. Cuando tú obra tenga varias versiones a través de los años incluirás TODOS esos años.
2.-Debemos agregar la nota que establezca que se puede copiar bajo los términos de la licencia elegida. en este caso Original BSD, pero es lo mismo para GPL o MIT.
3.-Se debe entregar una copia completa de la licencia junto con el código fuente, suele entregarse en un archivo con el extraño nombre “LICENSE”. En este caso les dejo un enlace a la licencia BSD.
Un pequeño ejemplo con este programa:
/* Copyright (c) 2007, Alberto Rodriguez Sanchez "vendaval"* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* * Neither the name of the COLECTIVO MONONEURONA nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY ALBERTO RODRIGUEZ SANCHEZ "VENDAVAL" ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL ALBERTO RODRIGUEZ SANCHEZ "VENDAVAL" BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include<stdio.h>
int main()
{
printf(“HOLA SANDRA”);
return 0;
}//Fin funcion principal
Nota Final.
Aunque muchos prefieren la licencia GPL v2, explico que de nuevo que tiene que ver con preferencias personales o las necesidades especiales del proyecto.
El objetivo de esta pequeña nota es introducir al tema de las licencias que es en realidad complejo y extenso, pero con este pequeño ejemplo podemos hacer valer nuestros derechos y nuestra filosofía.
Para Saber mas:
www.gnu.org/licenses
www.opensource.org
y google.
Permalink: http://www.mononeurona.org/users/entry/vendaval/971
Aprendiendo C (6ta Parte)
Software
#include<stdio.h>
#include<ctype.h>/*biblioteca que proporciona la funcion tolower*/
int main()/*inicio funcion principal*/
{
int A1[][3]={{1,2,3},{0,9,8},{5,6,4}};
int A2[][3]={{9,10,31415},{217,3000,2},{}};
int i,j,n,m;
char c;
printf("\n\nMenu\nMostrar arreglo A1 y A2->a\n");
printf("Crear y mostrar nuevo arreglo->b\n\n");
scanf("%c", &c);
c=tolower(c);/*cambiamos a minusculas*/
switch(c)
{
case 'a':
printf("A1:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d ",A1[i][j]);
printf("\n");
}
printf("\n\nA2:\n");
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
printf("%d2 1º",A2[i][j]);
printf("\n");
}
break;
case 'b':
{
printf("Introduce 2 numeros enteros");
scanf("%d %d", &m, &n);
int B[m][n];
printf("Introduce %d elementos\n",m*n);
for(i=0;i<m;i++)
for(j=0;j<n;j++)
scanf("%d",&B[i][j]);
printf("El arreglo que introduciste es:\n");
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
printf("%d ",B[i][j]);
printf("\n");
}
}
break;
default:
printf("Entrada no valida\n");
break;
}
return 0;
}//fin funcion principal
Entre las cosas nuevas que encontraremos en este programa están los arreglos bidimencionales, tememos la declaración y asignación de valor de A1 y A2, para denotar cada fila se usa un par de llaves "{}", observa que A2 tienen el ultimo grupo de llaves vacío, el compilador les asignara el valor 0 a todos los componentes de esa fila, así cuando desees un arreglo con todos sus valores 0 puedes declarlo como Arreglo[tamaño]={0}; darle valor al primer elemento es necesario.
Los arreglos bidimencionales son muy utiles para representar tablas, grafos, matrices, etc. y son una facilidad de la programacion, al igual que los arreglos de una dimensión, son estructuras de datos que tienen un mismo tipo y que estan ordenados en posiciones contiguas de memoria,en la declaracion de A1 y A2 nota que solo declare el numero de filas (3), esto es porque C require sabes cuantas posiciones debe recorrer antes de aumentar una fila, pues todos los datos estan "alineados" en memoria.
Tenemos una estructura de control nueva switch(), Esta toma el valor de su argumento que puede ser un entero o un char y busca entre los casos (case) para ejecutar una acción, normalmente existe una expresión default que se realiza en caso de que la entrada no coincida con ningún caso. esta expresión default es opcional. tambien es de notarse que cada caso termina con "break", esto sale de switch y continua ejecutando la instruccion despues de la llave del cierre de switch. en el ultimo caso o caso default al final de switch no es necesario poner el break,pero es mejor ponerlo por claridad. la estructura basica es :
switch(Variable entera o char)
{
case var1:
instruciones
break
case var2:
instruciones
break::
case var3:
instruciones
break:
......
default:
instruciones
break:
}
Tambien tenemos el uso de la función tolower() de la biblioteca estandar ctype.h, esta funcion tomauncaracter y lo convierte a minuscula si es mayuscula, de lo contrario devuelve el mismo caracter. existe su contrario que va de minusculas a mayusculas, esta función se llama toupper() y se utiliza de la misma manera.
Existen muchas funciones en diversas bibliotecas que son parte del estandar ASCI,aun no se como presentare dichas funciones, de momento usare algunas y explicare su uso y biblioteca que contiene su "prototipo". En la literatura técnica primero se enseñan las funciones y luego los arreglos, supongo que con fines pedagogicos. veremos funciones en la siguiente entrada.
Hoy vimos:
1.-Declaración de arreglos Bidimencionales.
2.-Recorrido de arreglos bidimencionales.
3.-Instrucción switch..case..default
4.-Casos especiales de uso de switch.
5.-Función tolower y toupper.
Dudas en los comentarios.
Nota: El programa presentado esta escrito de una manera "poco practica", esto con fines de hacer versiones mejoradas de el.
Permalink: http://www.mononeurona.org/users/entry/vendaval/954
Como en el ajedrez
Ciencia y Tecnologia
Debian GNU/Linux potato 2 semanas -> Mandrake 1 mes -> Ubuntu 1 semana -> Slackware 9, 10 creo? como un año o mas -> Debian GNU/Linux etch, lenny, sid a la fecha-> Estudio profundo de teoria de sistemas operativos->Otros Nucleos proximamente
En lo particular -como muchos- regalo Ubuntus, Me puse triste cuando Martin dejo de vender Ubuntus en el metro,me dio algo de pena poner la noticia de que Ubuntu podria dañar los discos duros de las laps, meda gusto ver a gente con su kubuntu, edubuntu, ubuntu estudio, etc. Ese era el fin ultimo de que se trabajara tanto haciendo las cosas fáciles, pero eso no quiere decir que conozcas -diria aarkerio- las tripas del sistema y el verdadero hacker las conoce, las modifica y las reescribe, por que las puede entender.
Un Ubuntu en un principio no es para desarrolladores, no tienen ni librerÃÂas de desarrollo ni compiladores, para hacerlo servidor tendrÃÂas que desinstalar mil y un madres, tu sabes "volarle" las X, agregarle ssh server, etc
El punto que defiendo es que de las distribuciones de linux hay un rey y una reyna -Slackware y Debian- que son de las que mas te permiten aprender mas de como funciona tu cacharro con el núcleo Linux. Es como en el ajedrez, el rey es el mas importante, donde aprenderás mas.
Pero la Reyna es la mas rompe madres de todas las otras piesas.
P.D: Creo que el caballo, mi pieza favorita, seria CentOS
Permalink: http://www.mononeurona.org/users/entry/vendaval/944










