To help on the development of peer to peer apps on the iPhone, I developed an abstraction on GKSession called NetworkProxy. To use it, we just create a new instance of a NetworkMessage:

        NetworkMessage* message = [[[NetworkMessage alloc] init] autorelease];

Set it’s message type and any other (optional) information we may want to transmit:

        [message setMessageType:NetworkMessageType_FinalScore];
        [message setScore:35];
        [message setMessage:@"Text to send goes here!"];
        

And send it:

        [networkProxy sendMessage:message];

NetworkProxy is the class that does the heavy work. It is initialized with a connected GKSession:

        @implementation NetworkProxy        
        
        -(id) initWithSession:(GKSession*) msession
        {
                …
                return self;
        }

And expects a INetworkClient to be injected, to be able to handle incoming messages:

        -(void) setClient:(id<INetworkClient>) mnetworkClient
        {
                networkClient = [mnetworkClient retain];
        }
        

Inheriting INetworkClient means implementing two methods, one to handle incoming messages and one for network errors:

        @protocol INetworkClient <NSObject>
                @required
                -(void) messageReceived:(NetworkMessage*) data;
                -(void) networkError;
        @end


Incoming messages should be pretty straight forward:

        -(void) messageReceived:(NetworkMessage*) data
        {
                switch ([data messageType]) {
                        case NetworkMessageType_GameStarting:
                                …
                                break;
                        case NetworkMessageType_Click:
                                …
                                break;
                        case NetworkMessageType_FinalScore:
                                …
                                break;
                        default:
                                break;
                }
        }

If you’re planning on using the code start by checking the NetworkMessage class. That’s where the magic (with some help from NSCoder) is.
Start by adding your own message types:

        typedef enum {
                NetworkMessageType_GameStarting = 0,
                NetworkMessageType_Click = 1,
                NetworkMessageType_FinalScore = 2,
                NetworkMessageType_SendBomb = 3
        } NetworkMessageType;

And be sure to un/serialize them properly:

        - (id)initWithCoder:(NSCoder *)coder
        {
                self = [super init];
                
                [coder decodeValueOfObjCType:@encode(NSInteger) at:&messageType];
                [coder decodeValueOfObjCType:@encode(NSInteger) at:&score];
        
                return self;
        }

        - (void)encodeWithCoder:(NSCoder *)coder
        {
                [coder encodeValueOfObjCType:@encode(NSInteger) at:&messageType];
                [coder encodeValueOfObjCType:@encode(NSInteger) at:&score];
        }

Of course, you can have your NetworkMessage with complex objects as attributes, just make sure they also implement NSCoder.

Code here.

Para poder facilmente adicionar o gravatar de um utilizador a um site ASP MVC 2, criei o seguinte HTML helper:

namespace MySite.Helpers
{
    public static class HTMLHelpers
    {

        public static string GravatarFor(this HtmlHelper html, string id, string email, object htmlAttributes)
        {
            int size = 80;

            string imageUrl = "http://www.gravatar.com/avatar.php?";

            if (!string.IsNullOrEmpty(email))
            {
                MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();

                UTF8Encoding encoder = new UTF8Encoding();
                MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();

                byte[] hashedBytes = md5Hasher.ComputeHash(encoder.GetBytes(email));

                StringBuilder sb = new StringBuilder(hashedBytes.Length * 2);
                for (int i = 0; i < hashedBytes.Length; i++)
                {
                    sb.Append(hashedBytes[i].ToString("X2"));
                }

                imageUrl += "gravatar_id=" + sb.ToString().ToLower();
                imageUrl += "&rating=G";
                imageUrl += "&size=" + size.ToString();
            }

            var builder = new TagBuilder("img");

            builder.GenerateId(id);

            builder.MergeAttribute("src", imageUrl);
            builder.MergeAttribute("alt", "Gravatar");
            builder.MergeAttribute("default", "~/Content/Images/default-gravatar.png");
            builder.MergeAttributes(new RouteValueDictionary(htmlAttributes));

            return builder.ToString(TagRenderMode.SelfClosing);
        }
    }
}

Para usar, basta importar o namespace numa view:

<%@ Import Namespace=”MySite.Helpers” %>

E depois usar o helper como extensão do objecto HTML:

<%= Html.GravatarFor(“gravatarId”, Model.User.Email, null) %>

onde em Model.User.Email estará o email do utilizador.

Essencial para limpar o lixo do svn (git rules :) )

find ./ -name “xpto” | xargs rm -Rf

Leia o resto deste artigo »

Source unknown

Source unknown

Com o iPad ha pouco mais de um mês nas minhas mãos, aqui fica uma pequena review

img_0001.png

  • O ecrã é magnifico… simplesmente magnifico. Mas não tem uma app com relógio!?!?!? e a calculadora???? tsc tsc…

img_0003.png

  • As apps, mesmo as híbridas, ficam com outra dimensão… brutal!

img_0004.png

img_0005.png
        •        O teclado é excelente mas… o facto de ainda não ter Português é extremamente frustrante! Imaginem que cada palavra que escrevo o corrector ortográfico ‘corrige-me’ algo com parecido em inglês…

  • Rápido. Nem sequer faz sentido fazer comparações entre pc’s e o iPad.
  • A bateria. Uso o iPad durante 2 dias, estando constantemente na net, a ver documentos pdf/word/excel para mandar aos alunos, a jogar, …, e só ao final do segundo dia é que o preciso de carregar. Qual
  • Neste momento uso o iPad para tudo menos editar documentos (word, etc) ou para programar. De resto substituiu o meu mac sem qualquer problema.

Sinceramente… vale mesmo a pena.. :)

Aqui ficam alguns links para se conseguir uns bons UIAlertViews por cima do Cocos2d:

http://www.gaminghorror.net/cocos2d-iphone-resources/ – Excelente conjunto de pequenos utilitários de código para cocos2d

StackOverflow – Esta pergunta prendeu-me a atenção… Há ali umas belas dicas… :)

IPhoneDeveloperTips – Finalmente, aqui pode-se ver uma bela modificação, em que conseguimos ficar com:

Aqui fica uma actualização do código do menu para o Cocos2d 0.99, cortesia do Felipe Oliveira.

Ecrã de instalação de módulos extras, que podem ser retirados da internet

Agora com um loading bem mais rápido:

Categorias

Tweets

View João Caxaria's profile on LinkedIn

Enter your email address to follow this blog and receive notifications of new posts by email.

Join 1 other follower

Seguir

Get every new post delivered to your Inbox.