Espacio de tecnologia, software libre y sus derivados. Una horda de monos entrenados escriben de vez en cuando por aqui algunas noticias, opiniones e incluso alguna que otra cosa fuera del tema. Maqueros, favor de abstenerse que no somos lo suficientemente guapos.

Piano daemon

Archive for Mac

Los Arreglos NSMutableArray en objetive C

screen-shot-2012-01-13-at-64803-pm.png

A diferencia de los NSArray… a estos se les pueden agregar y objetos al gusto…

NSDictionary en Objetive C

Los diccionarios en Objetive C son como los hashes en perl …
o como los Diccionarios en Python,
O como los arreglos asociativos en Php
o como los Hashmap en Java
o como los hashes en ruby.

El siguiente ejemplo al invocar el indice @Dog … esto nos retornara “House pet”

Nota.. al igual que los NSArray … se debe finalizar la inicializacion de un NSDictionary con un nil (el equivalente a NULL en otros lenguajes).

screen-shot-2012-01-13-at-63009-pm.png

Tambien podemos recorrerlo al viejo estilo de los perleros el foreach

screen-shot-2012-01-13-at-63917-pm.png

NSArray en objetive C

Los NSArray son arreglos en objetive c que no se pueden ALTERAR una vez definidos…. y tienen que terminal en null..

He aqui la forma en que se iteran…

screen-shot-2012-01-13-at-62024-pm.png

Tambien podemos recorrelo al estilo foreach

screen-shot-2012-01-13-at-63636-pm.png

Seguridad en PC

Fabulosa conversacion entre mac y Pc

Steve Jobs presenta la primer Macintosh. Enero 1984. Subtiitulos en Español

El Ciclo de vida del Objeto en Objetive C

Asi como los pajaritos y las abejas de nuestro mundo real, objectos dentro de la aplicacion tiene un ciclo de vida. Ellos nacen (via un alloc o un new), viven ( reciben mensajes y crean cosas utiles ), hacen amigos (via composicion y por ser pasados como argumentos a metodos), y eventualmente moriran cuando su periodo de vida este sobrepasado. Cuando todo esto sucede, el polvo que de ellos queda (memoria) es reciclado y reaprovechado para la nueva generacion.

1. — Conteo por Referencia (Reference Counting)

learnobjectivec-referencecounting.png

Cocoa usa una tecnica conocida como conteo por referencia, algunas veces tambien llamada “retain counting“. Donde cada objeto tiene un integer asociado con el, este entero asociado es conocido como su referencia de conteo o retain count. Cuando una parte de codigo esta interesada en un objeto, esta parte de codigo incrementara la referencia de conteo de dicho objeto (diciendo “Yo estoy estoy interesado en este objeto cabron!”). Pero cuando esta parte de codigo haya satisfecho su mas bajos instintos con el objeto y ya no lo necesite mas…, entonces el conteo de referencia de dicho objeto pasara a Cero. Entonces como a nadie mas le interesa este objeto, entonces pasara a ser destruido y su memoria reciclada.

Cuando un objeto es creado via alloc o new, o via a copy, el conteo de referencia del objeto es aumentado a 1. Para incrementar el conteo de referencia de un objeto se invoca el metodo retain. Para decrementar el conteo de referencia de un objeto se invoca el metodo release.

Cuando un objeto esta siendo destruido es por que su conteo de referencia a alcanzado su valor 0, Objective-C mandara automaticamente la ejecucion del metodo dealloc del objeto.

Veamos un ejemplo… aqui defino mi clase y la implementacion de la misma

@interface RetainTracker : NSObject
@end // RetainTracker

@implementation RetainTracker
- (id) init {
       if (self = [super init]) {
           NSLog (@"init: Retain count of %d.",
           [self retainCount]);
       }
  return (self);
} // init

- (void) dealloc
{
  NSLog (@"dealloc called. Bye Bye.");
  [super dealloc];
} // dealloc
@end // RetainTracker

Y aqui hago uso de ella para demostrar el uso de retain y release

int main (int argc, const char *argv[])
      {
        RetainTracker *tracker = [RetainTracker new];
        // count: 1
        [tracker retain]; // count: 2
        NSLog (@"%d", [tracker retainCount]);
        [tracker retain]; // count: 3
        NSLog (@"%d", [tracker retainCount]);
        [tracker release]; // count: 2
        NSLog (@"%d", [tracker retainCount]);
        [tracker release]; // count: 1
        NSLog (@"%d", [tracker retainCount]);
        [tracker retain]; // count 2
        NSLog (@"%d", [tracker retainCount]);
        [tracker release]; // count 1

        NSLog (@"%d", [tracker retainCount]);
        [tracker release]; // count: 0, dealloc it

        return (0);
} // main

Y aqui nuestra salida a pantalla….

screen-shot-2012-01-12-at-33827-pm.png

El conteo de referencia nos ayuda a evitar una gran cantidad de problemas surguidos al compartir memoria entre diferentes clases y objetos, pero plantea problemas a la hora de decidir donde y quien debe ejecutar los releases.

2. — Propietario del Objeto (Object Ownership)
Si un metodo tiene que devolver un objeto nuevo y no guarda ningun puntero al mismo ¿Como libera la memoria de este nuevo objeto … ? como no guarda el puntero no puede hacer el release más tarde, tampoco lo puede ejecutar inmediatamente porque si lo hace se liberará la memoria en este mismo momento y producirá el fallo al intentar usarla. Y tampoco es buena idea devolverlo sin el release, por que en este caso se producira un leak si la otra clase no la libera. Aqui entra en juego la convencion Ownership

Según esta convención, todo objeto es responsable de liberar la memoria que crea o retiene, pero aporta un par de reglas extras para solucionar el problema anterior:

Regla A)
Cuando un objeto va a utilizar memoria creada por otro método debe hacer un retain para evitar su liberación prematura.

Regla B)
Todo objeto debe liberar la memoria creada (mediante métodos alloc, copy o new) y retenida (mediante método retain), invocando el método release en algún momento en su ciclo de vida. Por cada alloc/retain ejecutado debe hacerse un release.

Regla C)

Si un método devuelve un objeto que no va a liberar, el método deberá llamarse allocXXX, copyXXX o newXXX (donde XXX se sustituye por el nombre que elijas). De esta forma, el que invoca el método puede conocer esta característica y, aplicando la regla B podra librerarla. Esta misma regla podría aplicarse N veces si cada método devuelve a su vez el objeto nuevo a su padre.

Ejemplo convención Ownership:

- (Clase *) newObjectWithData:(NSData *)data{
               //Creamos el objeto
               Clase *object = [[Clase alloc] init];

              //Ejecutamos lo que sea
              [object setData:data];

              //Devolvemos el objeto
              return object;
}

En este ejemplo podemos hacer la devolución gracias a haber nombrado al método newXXX, que indicará al que lo invoque que el objeto de tipo Clase * devuelto está sin liberar.

3.– Autorelease

Por último, tenemos un último recurso que nos ayudará a gestionar la memoria. Lo he dejado al final porque no pienso tratarlo aqui, ya que desaconsejo su uso, y es mejor no mostrarlo para evitar una mala praxis.

Zombies las estrategia contra EXC_BAD_ACCESS en X-Code

Es traumante encontrarse con este error y no saber por qué sucede, bueno, sucede generalmente porque liberaste (release) algo que no deberías o antes de que deberías, o no lo liberaste, o sea algún retain de más o de menos.

screen-shot-2012-01-12-at-11230-pm.png

Cuando tienes algún error de este tipo el programa terminará y el xcode te mandará un mensaje que dice algo como:

screen-shot-2012-01-12-at-114935-am.png

Para saber dónde está el error, suele ser un problema en proporcion al tamaño de tu codigo, a razon de esto existe algo llamado NSZombie. Y como funciona esto.. ? Los Zombies permiten que los objetos que ya han sido liberados (su retain count ha llegado a 0) mantegan una copia vacia (a esta copia es el famoso zombie). Asi entonces cuando en nuestro código llamemos al zombie, este te advertirá que estas llamando a una instancia que ya fue liberada.

screen-shot-2012-01-12-at-115710-am.png

¿Cómo habilito los objetos NSZombie?

Abre el proyecto en el que quieres habilitar los zombies, y ubicate sobre el ejecutable del proyecto, abre el menú contextual y selecciona Get Info, luego Ve a la pestaña de Arguments, agrega en el fondo la variable NSZombieEnabled y pon el valor en YES

screen-shot-2012-01-12-at-124243-pm.png

screen-shot-2012-01-12-at-124425-pm.png

Ahora corremos de nuevo el programa, solo que ahora, cuando el programa se interrumpa, no terminará, sino que se pausa, y podemos ver que manda un mensaje como el siguiente (lo que esta en amarillito):

screen-shot-2012-01-12-at-125300-pm.png

Ahora si tratamos de continuar la ejecucion de la aplicacion podemos notar que el zombie nos dice….
Hey en esta direccion de memoria hay un Objeto vacio que fue usado como “En este caso la clase Exercise”
screen-shot-2012-01-12-at-125523-pm.png

Socket Servidor multiclientes

Hola a todos tiempo de no escribir….
Ultimamente he estado bastante ocupado liberando algunos sistemas a produccion…. (cosas tediosas pero importantes)

Bueno, aqui les dejo como generar un servidor tcp/ip que reciba tramas de texto mediante Sockets de multiples clientes, este lo he desarrollado en java…

Y como lo probe?…. utilizando netcat (nc ahora)

La parte servidor basicamente esta compuesta de dos partes….. una Clase que contendra nuestro metodo Main
Y la clase que implementara todo aquello que haremos con las tramas de texto recibidas…

Fichero con funcion Main

package com.agnux.tcp;

import java.io.IOException;
import java.net.ServerSocket;

public class Main {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = null;
        boolean listening = true;

        try {
            serverSocket = new ServerSocket(6666);
        } catch (IOException e) {
            System.err.println("Could not listen on port: 6666.");
            System.exit(-1);
        }

        while (listening) { new MultiClientServer(serverSocket.accept()).start(); }

        serverSocket.close();
    }

}

Fichero que implementa la razon de ser de nuestro Servidor Socket multiclientes

package com.agnux.tcp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class MultiClientServer extends Thread {
    private Socket socket = null;

    public MultiClientServer(Socket socket) {
    	super("MultiClientServer");
    	this.socket = socket;
    }

    public void run() {

    	try {
		    PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
		    BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));

		    String inputLine;

		    while ((inputLine = in.readLine()) != null) {

		    	System.out.println(inputLine);

		    }
		    out.close();
		    in.close();
		    socket.close();

    	} catch (IOException e) {
    		e.printStackTrace();
    	}
    }

}

Primera Prueba
Esto lo hice desde mi macbook…. ya se lo que estan pensando… maquina de putos… si la verdad prefiero una pc con linux… pero ya que… este comando lo corri desde la terminal de mi snowlepard


nc -v -w 2 192.168.1.181  6666 < /etc/services

Finalmente podremos ver como se despliega el flujo de texto… en la consola de la maquina donde tengas corriendo este Servidor Socket Multiclientes

Aqui les dejo algo de informacion sobre netcat http://oreilly.com/pub/h/1058

Tutorial Hello world para principiantes de desarrollo iphone

Introduccion:

Les mostrare la manera mas simple de crear un programa Hello World sobre IphoneI am going to show you the simplest way to create hello world iPhone tutorial. Para probar el codigo sobre un dispositivo (iPhone) necesitaras comprar una licencia de desarrollador la cual tiene un costo de 99$ para ti y de 299$ para una empresa.


Iniciando el Desarrollo con Iphone:

Lo primero que necesitaras es conocer c-objetive … te recomiendo bajarte algunos libros de rapidlibrary.
O tambien podrias leer “getting started with iPhone”, este tutorial cubre las cosas que tu requieres saber antes de iniciar el desarrollo para iPhone( Tambien puedes mirar el video tutorial de “Getting Started with iPhone” ).

La Idea de este tutorial
Ya existen muchos tutorial sobre Hellos Wolrd in Iphone pero se me antojo escribir uno muy muy basico sobre el iPhone sdk el cual cubre xcode, y interface builder.

Simples pasos creae aplicacion hello world iPhone

Paso 1:Abre el Xcode y da click sobre File > New Project. Select “View-Based Application” y da click sobre “Choose..” button. El nombre de este proyecto sera “Hello World” y da click sobre el boton “Save”. Ahora ya tienes una plantillapara tu proyecto iphone hello world.

Step 2:Ahora pulsa el botton Build and Go para corre esta aplicacion plantilla. Esto iniciara el simulador iPhone y podras ver una pantalla gris en este. Da click sobre el boton Home button and este te mostrara HelloWorld icon sobre el dash board del iPhone simulator.

P1
Salida de nuestra primera aplicacion iphone

Paso 3:Ahora abre tu Xcode project y selecciona el archivo HelloWorldViewController.h y escribe el siguiente codigo:

IBOutlet UITextField *txtUserName;
IBOutlet UILabel *lblUserTypedName;
Also write this method before end of this class
- (IBAction) submitYourName;?

Paso 4:Entonces tu archivo HelloWorldViewController.h lucira como esto:

#import 

@interface HelloWorldViewController : UIViewController {
IBOutlet UITextField *txtUserName;
IBOutlet UILabel *lblUserTypedName;
}

- (IBAction) submitYourName;
@end

Paso 5:Ahora abriremos el archivo HelloWorldViewController.m y escribiremos este metodo antes de @end?

- (IBAction) submitYourName;
{lblUserTypedName.text = txtUserName.text;}

Paso 6:Ahora iniciermos con algo de diseño sobre el (constructor de interfaces) interface builder. Ejecuta un doble click sobre el archivo MainWindow.xib el cual es la principal ventana o punto de entrada hacia tu aplicacion.

p02
Estructura de tu aplicacion iphone

picture-8.png
Interface builder apariencia

Paso 7:Clickea sobre Herramientas y selecctiona Library (cmd + shift + L) y arrastra el campo de texto a tu vista. Como el campo de texto esta ya seleccionado, clickea sobre Tools>Inspector (cmd + 1) y en el campo de Texto teclea “Tu nombre”.

picture-9.png
Agrega etiqueta a tu primer aplicacion iPhone

picture-10.png
Cambiando texto en tu UILabel

Paso 8:Ahora arrastra el componente TextField de tu Library hacia tu vista (cmd+shift+L) y tambien arrastra otra Label dentro de la vista.
screen-shot-2010-06-28-at-31351-pm.png
Agregando un componente Text field a tu primera aplicacion iPhone

picture-12.png
Agregando otra Label a tu primera aplicacion iPhone

Paso 9:Lo ultimo por hacer es arrastrar un boton hacia la vista y entonces abrir el Inspector de nuevo mediante el menu superior selecting tools>Inspector. En Title teclee “Submit”.
picture-19.png

Paso 10:Ahora mapea la variable controller clase funcion y metodos con el interface builder. Seleccione File’s Owner en Interface builder y seleccione inspector de coneccion desde Tools cmd + 2

picture-13.png
Mapea tu controller con el Interface Builder

Paso 11:Ahora tu puedes ver 2 nuevas variables son agregadas in el connection inspector txtUserName y lblUserTypedName. Clickea sobre txtUserName radio button y arrastra este a el text field en la vista (como tu puedes ver en la imagen)
picture-14.png
Mapea tu text field con Interface builder

Paso 12:Haz lo mismo con el lblUserTypedName, selecciona su radio y arrastra es hacia abajo de la label.
picture-15.png
Mapea tu label field con Interface builder

Paso 13:Ahora el ultimo paso es, click sobre submitYourName radio y arrastra este a el botton y selecciona touch down de la lista.
picture-21.png
Mapea tu button con Interface builder

picture-23.png
Establecer tipo de accion al boton

Paso 14:Ahora cierra la interface y abre xcode. And press “build and go”.

Salida final

picture-25.png

Entradas mas recientes »