Desen_20120806a20120810




S\303O PAULO \u2013 Pouca gente consegue entender como a Apple consegue fidelizar seus clientes, mesmo com o alto pre\347o dos aparelhos e as constante atualiza\347\365es. Segundo o site Smartmoney, os cliente da Apple s\343o verdadeiros f\343s da empresa e v\343o defender a marca para o resto da vida. Pensando nisso o site listou as coisas que a Apple nunca ir\341 dizer aos seus clientes. Confira:

  1. Nossos clientes est\343o exaustos: a empresa jamais iria comentar a insatisfa\347\343o dos seus clientes com o ritmo acelerado de suas atualiza\347\365es.

  2. Tenha cuidado com aquele aplicativo: voc\352 jamais ouvir\341 a Apple pedindo para os clientes tomarem cuidado com os aplicativos, que podem ser cobrados sem que o usu\341rio perceba.

  3. Voc\352 ficar\341 dependente: o iPhone est\341 cada vez mais presente na vida dos usu\341rios. O aparelho est\341 mudando os costumes dos consumidores, que n\343o conseguem permanecer em um jantar ou em um evento religioso sem checar as atualiza\347\365es das redes sociais pelo aparelho. O iPhone est\341 se tornando item essencial na vida dos consumidores e provoca depend\352ncia.

  4. Voc\352 pode gastar mais com nossos dispositivos: n\343o s\343o s\363 os produtos da Apple que tendem a ser mais caros que os dos concorrentes. As pessoas tamb\351m gastam mais ao us\341-los. O propriet\341rio do iPhone gasta, em m\351dia, 10% a mais em suas contas mensais de telefonia do que os de outros telefones, segundo estimativas do analista da Morning Star, Michael Hodel.

  5. N\363s precisamos de outro gadget que mude o jogo: transtornos com atualiza\347\343o n\343o s\343o a \372nica coisa que os cr\355ticos n\343o gostam sobre lan\347amentos de produtos da Apple. Alguns dos novos produtos que s\343o lan\347ados nem sempre s\343o t\343o revolucin\341rios e trazem tantas novidades quanto se diz.

  6. O iPhone est\341 muito caro - at\351 mesmo comparado ao Ipad: o iPhone tem um custo de produ\347\343o bem menor do que o iPad, mas a Apple tem margens de lucro muito mais elevadas com o telefone do que com o tablet, dizem os especialistas.

  7. N\343o se engane por nossas propagandas: a Apple usa de publicidade l\372dica para atrair os clientes. A marca se tornou quase que uma religi\343o.

  8. Nossos recursos est\343o ficando ultrapassados: grandes marcas est\343o trazendo inova\347\365es primeiro que a Apple. Atualmente, a empresa est\341 lan\347ando funcionalidades o que o Android j\341 possui.

  9. Vamos nos ligar a voc\352 para o resto da vida: a forma de armazenamento de dados da Apple ligam o cliente \340 marca pelo resto da vida. Os aparelhos da empresa n\343o se comunicam com as demais vers\365es do mercado. Por exemplo, o ICloud da Apple \351 diferente de sistemas de outras empresas de armazenamento virtual por uma raz\343o fundamental - ele funciona exclusivamente com outros produtos da Apple.

  10. Nossos f\343s n\343o ligam se fizermos algo errado: a Apple n\343o tem clientes. Ela tem f\343s que costumam se manter fi\351is \340 empresa mesmo quando ela os decepciona.

Frustra\347\365es

At\351 os clientes mais fi\351is da Apple se dizem chateados com os constantes lan\347amentos de novos aparelhos. Segundo o site Smartmoney, os consumidores est\343o frustrados porque quando compram o mais recente produto da Apple, a empresa normalmente j\341 est\341 preparando a substitui\347\343o.

\u201cTudo que compramos deles j\341 est\341 ultrapassado\u201d, explica o consultor de tecnologia Patchen Barrs, que possuiu 25 produtos da Apple adquiridos nos \372ltimos 20 anos. Desde 2001, a empresa lan\347ou seis iPod, dois iPod mini, seis iPod nanos, quatro Shuffles iPod e quatro edi\347\365es do iPod Touch. A Apple lan\347ou cinco modelos de iPhone desde 2007 e teve tr\352s iPad desde 2010.

Obviamente, todos os modelos ganharam vers\365es mais r\341pidas, ficaram mais finos e com recursos adicionais, como c\342meras melhores e telas com qualidade melhorada. Segundo o site Smarthmoney, a Apple se recusou a comentar o assunto e informou que as melhorias mais do que justificam o processo acelerado de suas atualiza\347\365es.

Consumidores est\343o com medo

Mesmo com os benef\355cios das atualiza\347\365es, quase 50% dos consumidores dizem que est\343o receosos em comprar novos produtos devido ao lan\347amento em curto de prazo de vers\365es mais atualizadas. Os dados s\343o de uma pesquisa recente com duas mil pessoas, realizada pela revista Marketing, no Reino Unido.

Em julho, a Apple deixou a desejar mais uma vez quando lan\347ou uma nova vers\343o de seu software de Airplay, que praticamente conecta gadgets da Apple e transmite v\355deos de computadores para a Apple TV. Mas o novo Airplay n\343o \351 compat\355vel com computadores iMacs e do MacBook Air comprados antes de meados de 2011.


Passando eventos para uma m\341quina virtual Ter\347a-feira, 07/08/2012 \340s 11h15, por Alexey Lyashko

O c\363digo fonte para este artigo pode ser encontrado aqui.

M\341quinas virtuais e frameworks de software constituem uma parte inicial de nossa vida digital. H\341 VM complexa e frameworks de software simples. Estes dois artigos (virtual machine simples e tempo de execu\347\343o de framework simples atrav\351s de exemplo) mostram o qu\343o f\341cil pode ser implementar voc\352 mesmo. Eu fiz o poss\355vel para descrever a forma como o c\363digo VM pode interagir com c\363digo nativo e o sistema operacional, no entanto, a intera\347\343o ainda \351 deixada para tr\341s sem explica\347\343o. Este artigo ir\341 corrigir essa omiss\343o.

Como de costume - nota para nerds: O c\363digo fonte dado neste artigo \351 apenas para exemplo. Eu sei que este framework est\341 longe de ser perfeito, portanto, este artigo n\343o \351 um HOW TO ou tutorial - apenas uma explica\347\343o do princ\355pio. Verifica\347\365es de erro s\343o omitidas de prop\363sito. Voc\352 deseja implementar um quadro real - fa\347a voc\352 mesmo, incluindo verifica\347\365es de erro. Ao dizer c\363digo VM, n\343o me refiro \340 implementa\347\343o da m\341quina virtual, mas ao pseudo-c\363digo que corre dentro dela. Vis\343o geral da arquitetura

Desnecess\341rio mencionar que a capacidade de transmitir eventos/sinais a um c\363digo executado pela m\341quina virtual implica em uma mais complexa arquitetura VM. Enquanto todos os exemplos anteriores foram baseados em uma \372nica fun\347\343o respons\341vel pela execu\347\343o, a adi\347\343o de eventos n\343o significa apenas a adi\347\343o de uma outra fun\347\343o, mas teremos que introduzir t\363picos para nossa implementa\347\343o. Pelo menos dois segmentos s\343o necess\341rios: Actual VM - esta thread \351 respons\341vel pela execu\347\343o do c\363digo execut\341vel da VM e pelo envio de eventos da fila (processador); Event Listener - esta thread \351 respons\341vel pela coleta de eventos relevantes para os sistemas operacionais e pela adi\347\343o deles na fila de processos da da VM.

Voc\352 pode ver que a fun\347\343o Core(), no c\363digo fonte anexo, cria thread adicional.

Fig.1: Arquitetura VM com Event Listener

Event Listener: Essa thread coleta eventos do sistema operacional (movimento do mouse, key up/down etc.) e adiciona uma nova entrada para a lista de estruturas de eventos.

typedef struct _EVENT
{
   struct _EVENT* next_event; // Pointer to the next event in the queue
   int            code;       // Code of the event
   unsigned int   data;       // Either unsigned int data or the address of the buffer
                              // containing information to be passed to the handler
}EVENT;
O c\363digo para o listener \351 bastante simples:
while(WAIT_TIMEOUT == WaitForSingleObject(processor_thread, 1))
{
   // Check for events from the OS
   if(event_present)
   {
      EnterCriticalSection(&cs);
      event = (EVENT*)malloc(sizeof(EVENT));
      event->code = whatever_code_is_needed;
      event->data = whatever_data_is_relevant;
      add_event(event_list, event);
      event->next_event = NULL;
      LeaveCriticalSection(&cs);
   }
}

O c\363digo \351 suficientemente auto-explicativo. Antes de tudo, ele verifica eventos dispon\355veis (essa parte \351 omitida e substitu\355da por um coment\341rio). Se houver um novo evento para transmitir \340 VM, ele o adiciona \340 fila. Enquanto neste exemplo a coleta de eventos \351 implementada como um loop, na vida real, voc\352 pode faz\352-la na forma de callbacks e usar o loop acima apenas para esperar a thread do processador para sair.

Processador

Obviamente, o "processador" thread vai ser um pouco mais complicado, ent\343o, no artigo anterior (tempo de execu\347\343o de framework simples atrav\351s de exemplo), como al\351m de executar a fun\347\343o run_opcode (CPU **), ele tem que verificar se h\341 eventos pendentes e passar o controle de fluxo para o handler associado no c\363digo VM.

typedef struct _EVENT_HANDLER
{
   struct _EVENT_HANDLER* next_handler; // Pointer to the next handler
   int                    event_code;   // Code of the event
   unsigned int           handler_base; // Address of the handler in the VM's code
}EVENT_HANDLER;

DWORD WINAPI RunningThread(void* param)
{
   CPU*            cpu = (CPU*)param;
   EVENT*          event;
   EVENT_HANDLER*  handler;

   do{
      EnterCriticalSection(&cs);
      if(NULL != events)
      {
         event = events;
         events = events->next_event;

         // Save current context by pushing VM registers to VM's stack
         
         cpu->regs[REG_A] = (unsigned int)event->code;
         cpu->regs[REG_B] = event->data;

         handler = handlers;
         while(NULL != handler && event->code != handler->event_code)
               handler = handler->next_handler;
         
         cpu->regs[REG_IP] = handler->handler_base;

         free(event);
      }
      LeaveCriticalSection(&cs);

   }while(0 != run_opcode(&cpu));
   return cpu->regs[REG_A];
}

Estamos quase terminando. Nosso framework j\341 sabe como passar eventos para um handler correto no c\363digo da VM. Duas coisas ainda precisam ser descobertas - registrar um handler e retornar de um handler.

Retornando do handler

Devido ao fato de que o Event Handler n\343o \351 uma rotina regular, n\343o podemos retornar dele usando a instru\347\343o regular RET, em vez disso, vamos introduzir uma outra instru\347\343o - IRET. Como o evento realmente interrompe o fluxo de execu\347\343o do programa, IRET - retorno de interrup\347\343o \351 exatamente o que precisamos. O c\363digo fonte que manipula essa instru\347\343o \351 t\343o simples, que n\343o h\341 necessidade de fornec\352-lo aqui no texto do artigo. Tudo o que ele faz \351 simplesmente restaurar o contexto do c\363digo da VM disparando os registos previamente

inseridos na pilha.

Registrando um Event Handler A \372ltima coisa que resta \351 "ensinar" o programa escrito em pseudo assembly a registrar um handler para um tipo determinado de evento. Para fazer isso, precisamos adicionar uma chamada de sistema simples - SYS_ADD_LISTENER. Essa chamada de sistema aceita dois par\342metros:

C\363digo do evento para handler.
Endere\347o da fun\347\343o handler.
loadi  A, 0             ;Code of the event
loadi  B, handler       ;Address of the handler subroutine
_int   sys_add_listener ;Register the handler

C\363digo de exemplo

O c\363digo de exemplo anexado a este artigo \351 a implementa\347\343o de todos os itens acima. Ele faz o seguinte: