Celular Motorola W388

16/outubro/2009

Leia porque cheguei a considerar desrespeito uma falta de informação.

Pense:
• Na hora de descrever as funcionalidades de um produto é preciso dizer o que o produto não faz?
• Se um recurso induz o consumidor a pensar que outro recurso esta disponível é preciso esclarecer?

Parece questões simples, basta fazer uma pesquisa completa que se atenha as funcionalidades que interessa e pronto. Parece, mas nem sempre é tão simples assim.

No meu caso foi um celular da marca Motorola modelo W388, que tem câmera é player de MP3 já vêm cabos de dados, mas não sincroniza contatos e a agenda.

O problema é que não existe a informação que este modelo não sincroniza contatos e agenda e esta funcionalidade é muito mais antiga e básica que outros recursos que este modelo tem.

Para descobrir que este modelo não faz a sincronia é preciso pesquisar e pesquisar com vontade, isso porque é normal as pessoas terem dificuldades em fazer a sincronia devido ao software que esta sendo usado não ser o correto ou não ter sido instalado ou configurado corretamente.

Sendo assim como não existe a informação da limitação deste modelo, e passa-se pelo pressuposto que o problema é nosso e não do aparelho, perde-se muito tempo e dinheiro para se descobrir que não se consegue sincronizar os contatos e a agenda por conta de uma limitação do celular.

Olhe o site da Motorola para este modelo http://www.motorola.com/Consumers/BR-PT/Consumer-Product-Services/Mobile-Phones/ci.W388-BR-PT.alt
Diz o básico sobre contatos e agenda, mesmo que possa ser dito que em nenhum lugar fala que os contatos e a agenda podem ser sincronizados, verdade, mas não diz o contrário, fala que tem conectividade via porta USB 2.0 têm cartão de memória de 1Gb.

Como se descobre que não tem esta funcionalidade?
Apenas por tentar não é o suficiente porque sempre fica a dúvida que foi o usuário que não soube instalar e ou configurar o programa certo para isso.
Olhando na internet não achava nada que desse uma luz, até que achei no endereço http://www.reputacao.com.br/opiniao-lista.jsp?id=743 uma referência a uma conversa com a Motorola sobre este modelo onde a Motorola afirma não ter esta opção.

Ao ler isto tentei falar com a Motorola, porem sem sucesso, fiz uma reclamação no site do jornal “O Globo” na coluna “defesa do consumidor”, e aí recebi uma ligação da Motorola, onde foi confirmado que não existe esta funcionalidade não existe nenhuma atualização que permita o sincronismo. Eu perguntei então ao atendente da Motorola se o objetivo da ligação era apenas para informar que, nas minhas palavras, “o problema é seu e não faremos nada para resolvê-lo”, é claro que ele não disse com estas palavras, mas é assim que me sinto.

A postura da Motorola, na minha opinião, esta errada em pelo menos dois pontos.
1. Não é clara a definição das funcionalidades do seu produto.
2. Não tem nenhum comprometimento com o seu cliente.

Precisei apelar para um jornal para que me dessem atenção, não vão fazer nada para resolver a situação, transferiram o ônus todo para o consumidor.

Minha conclusão pessoal, cuidado com a Motorola, ela não esta nem aí para o seu consumidor. Já com respeito ao modelo W388 se não liga para os contatos do seu celular e gosta de ouvir um som baixo fique a vontade a decisão é sua.

Eu fico agora com a certeza que vou mudar de celular e de preferência de outra marca.

A Arte de transformar TI em ARTE

10/fevereiro/2009

Mesmo que não tenha perguntado ou tenha muito ou pouco conhecimento de construção civil, não importa o que procuro estabelecer não é que usar exemplos para compreender um novo mundo é errado ou pouco produtivo. O que realmente atrapalha são as pessoas que para defender uma idéia, abalizam seus pensamentos em falácias. Dizer que se na construção civil em uma fábrica de automóveis as coisas funcionam de determinada forma e com este fato “incontestável” fica provado seu pensamento, aí sim esta o erro.
Se olharmos para qualquer setor de prestação de serviço, veremos ambientes diferentes e dependendo destes ambientes, o que funciona em um, pode não funcionar no outro. E note que não mudamos de ramo.
Só para fechar o raciocínio em cima da construção civil. Quando se teoriza em cima da construção geralmente se monta um ambiente controlado e bem fechado tanto no seu escopo, como em um projeto aprovado e em algumas vezes já executado outras vezes, entretanto se verificamos um ambiente diferente, os problemas são os mesmos; planejamento não bate, orçamento fura, e isso é quase a regra e não a exceção.
Conversando sobre a dificuldade de fazer uma estimativa de uma tarefa com uma pessoa bem distante de TI, obtive uma resposta bem familiar. Perguntei a uma senhora aposentada — que trabalhou como costureira — se fosse pedido a ela um prazo para adaptar uma roupa que ela não tinha feito, mas que cabia em uma modelo (Alta e magra) para uma pessoa com medidas bem diferentes, porem ela não poderia fazer medidas precisas ou examinar a roupa detalhadamente.
Qual foi a resposta?
“Depende, pode ser mais fácil fazer outra roupa igual com as medidas da pessoa.”
Parece familiar não é?
É neste ponto que eu queria chegar. Não devemos imaginar que comparar TI com o resto dos prestadores de serviço é um erro. O erro é imaginar que os outros prestadores de serviço resolveram os nossos problemas. Por mais que possamos aprender com o mundo em nossa volta, não podemos imaginar que a solução para a administração de TI é simplesmente virar uma fábrica, uma construtora, não importa o que admiremos ou acreditamos que é bem administrado.
Administrar TI não é discutir se os desenvolvedores são artistas ou operários, mas uma frase que eu gosto e que tenta simplificar bem o esforço de gerir TI é essa:
“Gerir desenvolvedores não é gerir artistas, mas é gerir profissionais para que façam arte”.

Um Profissional independente de sua profissão trabalha por dinheiro, mas uma equipe bem motivada e administrada além de ganhar dinheiro executa um trabalho que podemos sim chamar de ARTE.

TI é ARTE…

Flex, ruby, rails, RubyAmf e mySQL

16/janeiro/2009

Dando um tempo no tema, mas não esquecendo…

Quero postar algo que pode ser de interesse.

 

Estou estudando FLEX e vou colocar um passo a passo de como montar uma aplicação usando RUBY, RAILS, FLEX e RUBYAMF.

 

Não pretendo explicar como instalar e configurar o ambiente, assim é preciso configurar seu ambiente com os componentes e o banco MYSQL para executar este exemplo.

 

O objetivo deste passo a passo é prover apenas um exemplo, sei que existem muitos na NET, mas tive dificuldades de aplicar estes exemplos e este que estou postando é o resultado de minha pesquisa na NET e da ajuda de um grande profissional que não me deixou desistir (Grato a Luiz e Iuri).

Sendo assim segue o passo a passo que consegui fazer funcionar, onde no FLEX consegui inclui, alterar e excluir um registro.

 

Check list do Ambiente:

            Ruby 1.8.6 <2007-09-24 patchlevel 111> [i386-mswin32]

            Rails 2.2.2

            mxmlc 3.1.0 build 2710

            FLEX 3.0

            MySQL 5.0.45

 

Tudo bem até agora? Então é só prosseguir…

 

No prompt de comando comece:

C:Estudo>rails -d mysql cadastro

C:Estudo>cd cadastro

C:Estudocadastro>

Testando

            C:Estudocadastro>ruby scriptserver

            http://localhost:3000/

 

Altere o arquivo C:Estudocadastroconfigdatabase.yml

            Coloque “username” e “password” corretos

            Ex: Considerando que o nome do usuário é “aluno” e a senha é “minhasenha” fica assim:

                        development:

                                   adapter: mysql

                                   encoding: utf8

                                   database: cadastro_development

                                   pool: 5

                                   username: aluno

                                   password: minhasenha

                                   host: localhost

                        test: 

                                    adapter: mysql

                                   encoding: utf8

                                   database: cadastro_test

                                   pool: 5

                                   username: aluno

                                   password: minhasenha

                                   host: localhost

                        production:

                                   adapter: mysql

                                   encoding: utf8

                                   database: cadastro_production

                                   pool: 5

                                   username: aluno

                                   password: minhasenha

                                   host: localhost

 

 

Voltando ao prompt de comando :

C:Estudocadastro>rake db:create

C:Estudocadastro>

     ruby script/plugin install http://rubyamf.googlecode.com/svn/trunk/rubyamf

C:Estudocadastro>

     ruby script/generate scaffold pessoa nome:string sobrenome:string

C:Estudocadastro>rake db:migrate

Testando

            http://localhost:3000/pessoas

            Cadastre uma pessoa.

 

 

Agora será preciso editar o arquivo C:Estudocadastroappcontrollerspessoas_controller.rb

Neste arquivo localize as def e substitua o antes pelo depois tanto no def index, create, update e destroy

//————————————————————

– def index

————– antes —————–

  def index

    @pessoas = Pessoa.find(:all)

    respond_to do |format|

      format.html # index.html.erb

      format.xml  { render :xml => @pessoas }

    end

  end

————– depois —————–

  def index

    @pessoas = Pessoa.find(:all)

    respond_to do |format|

      format.html # index.html.erb

      format.xml  { render :xml => @pessoas }

      format.amf { render :amf => @pessoas } # <<– Acrescentar

    end

  end

//————————————

 

– def create

————– antes —————–

  def create

    @pessoa = Pessoa.new(params[:pessoa])

    respond_to do |format|

      if @pessoa.save

        flash[:notice] = ‘Pessoa was successfully created.’

        format.html { redirect_to(@pessoa) }

        format.xml  { render :xml => @pessoa, :status => :created, :location => @pessoa }

      else

        format.html { render :action => “new” }

        format.xml  { render :xml => @pessoa.errors, :status => :unprocessable_entity }

      end

    end

  end

————– depois —————–

  def create

    if @is_amf  

      @pessoa = Pessoa.new({:nome => params[0][:nome], :sobrenome => params[0][:sobrenome]})

    else  

      @pessoa = Pessoa.new(params[:pessoa])

    end   

 

    respond_to do |format|   

      if @pessoa.save        

        flash[:notice] = ‘Pessoa was successfully created.’        

        format.html { redirect_to(@pessoa) }

        format.xml  { render :xml => @pessoa, :status => :created, :location => @pessoa }

        format.amf  { render :amf => “Message Saved” }      

      else        

        format.html { render :action => “new” }

        format.xml  { render :xml => @pessoa.errors, :status => :unprocessable_entity }

        format.amf  { render :amf => @pessoa.errors }      

      end   

    end  

  end

//————————————

 

 

– def update

————– antes —————–

  def update

    @pessoa = Pessoa.find(params[:id])

    respond_to do |format|

      if @pessoa.update_attributes(params[:pessoa])

        flash[:notice] = ‘Pessoa was successfully updated.’

        format.html { redirect_to(@pessoa) }

        format.xml  { head :ok }

      else

        format.html { render :action => “edit” }

        format.xml  { render :xml => @pessoa.errors, :status => :unprocessable_entity }

      end

    end

  end

————– depois —————–

  def update

    if @is_amf

      @pessoa = Pessoa.find(params[0][:id])

      @pessoa.nome = params[0][:nome]

      @pessoa.sobrenome = params[0][:sobrenome]

    else

      @pessoa = Pessoa.find(params[:id])

    end     

    respond_to do |format|

      if @pessoa.update_attributes(params[:pessoa])

        flash[:notice] = ‘Pessoa was successfully updated.’

        format.html { redirect_to(@pessoa) }

        format.xml  { head :ok }

        format.amf { render :amf => @pessoa }

      else

        format.html { render :action => “edit” }

        format.xml  { render :xml => @pessoa.errors, :status => :unprocessable_entity }

        format.amf  { render :amf => @pessoa.errors }  

      end

    end

  end

//————————————

 

– def destroy

————– antes —————–

  def destroy

    @pessoa = Pessoa.find(params[:id])

    @pessoa.destroy

    respond_to do |format|

      format.html { redirect_to(pessoas_url) }

      format.xml  { head :ok }

    end

  end

————– depois —————–

  def destroy

    if @is_amf

      @pessoa = Pessoa.find(params[0][:id])

    else

      @pessoa = Pessoa.find(params[:id])

    end     

    @pessoa.destroy

    respond_to do |format|

      format.html { redirect_to(pessoas_url) }

      format.xml  { head :ok }

      format.amf  { render :amf => ‘delete’ }          

    end

  end

  end

//————————————————————

 

//————————————————————

 

 

Voltando ao prompt de comando :

C:Estudocadastro>mkdir appflex

C:Estudocadastro>mkdir publicbin

 

 

Agora vamos para o FLEX é claro que se já tiver intimidade com o compilador do FLEX é só adaptar os passos abaixo e continuar na linha de comando, entretanto os passos foram escritos usando a IDE do FLEX.

Novo projeto FLEX

            1ª ABA

            desmarque “use default location”

            coloque no campo “folder” o seguinte “C:Estudocadastro”

            Click em NEXT 

 

            2ª ABA

            coloque no campo “OutPut folder” o seguinte “publicbin”

            Click em NEXT 

 

            3ª ABA

            coloque no campo “Main source folder” o seguinte “appflex”

            coloque no campo “Output folder URL” o seguinte “http://localhost:3000/bin”

             Click em FINISH 

Criar um arquivo com o nome “services-config.xml” no mesmo diretório onde esta o arquivo cadastro.mxml

 

Segue o conteúdo do arquivo:

<?xml version=”1.0″ encoding=”UTF-8″?>

  <services-config> 

    <services>  

      <service id=”rubyamf-flashremoting-service”

        class=”flex.messaging.services.RemotingService”

        messageTypes=”flex.messaging.messages.RemotingMessage”>           

        <destination id=”rubyamf”>    

          <channels>     

            <channel ref=”rubyamf”/>    

          </channels>    

          <properties>     

            <source>*</source>    

          </properties>   

        </destination>  

      </service> 

    </services> 

    <channels>  

      <channel-definition

        id=”rubyamf”

        class=”mx.messaging.channels.AMFChannel”>   

        <endpoint uri=”http://localhost:3000/rubyamf/gateway”

          class=”flex.messaging.endpoints.AMFEndpoint”/>  

      </channel-definition> 

    </channels>

  </services-config>

 

Acesse o menu Project > Properties

            selecione o item “Flex Compiler”

            Adicione no campo “Additional compiler arguments” o seguinte ” -services “services-config.xml”"

 

 

Segue o conteúdo do arquivo cadastro.mxml:

<?xml version=”1.0″ encoding=”utf-8″?>

<mx:Application xmlns:mx=”http://www.adobe.com/2006/mxml” layout=”absolute”>

 

<mx:Script> 

    <![CDATA[

            import mx.controls.Label;

            import mx.controls.Text;

            import mx.controls.Alert;

            import mx.rpc.events.FaultEvent;

            import mx.rpc.events.ResultEvent;

            import mx.rpc.http.HTTPService;

            import mx.collections.ArrayCollection;

 

                        [Bindable]

                        private var minhasPessoas:ArrayCollection;

                        //HTTP Service–

                        private function carregarPessoas():void {

                                   srvPessoas.send();

                        }

                        private function httpResult(event: ResultEvent):void {

                                   minhasPessoas = event.result.pessoas.pessoa as ArrayCollection;

                        }

                        private function httpFault(event: FaultEvent):void {

                                   Alert.show(event.fault.message, ‘Erro do serviço http’);

                        }

                        //————–

                        //Remote Object–

            private function onFault(event:FaultEvent):void   {   

            Alert.show(event.fault.faultString, “Erro”);  

            }     

            private function onResult(event:ResultEvent):void   {   

            Alert.show(event.message.body.toString(), ‘Resposta’);

            }

            private function novaPessoa():void          {

                        pessoaService.create.send({nome: taPessoaNome.text});

                        carregarPessoas();

            }

            private function alterarPessoa():void {                            

                        pessoaService.update.send({id: taPessoaCodigo.text, nome:taPessoaNome.text});

                        carregarPessoas();

            }

            private function apagarpessoa():void { 

                        pessoaService.destroy.send({id: taPessoaCodigo.text});

                        carregarPessoas();

            }                      

                        //—————                 

    ]]>

</mx:Script>

    <mx:Binding source=”lstPessoas.selectedItem.nome” destination=”taPessoaNome.text” />         

    <mx:Binding source=”lstPessoas.selectedItem.id” destination=”taPessoaCodigo.text” />         

            <mx:RemoteObject 

                        id=”pessoaService”

                        fault=”onFault(event)”  

                        source=”PessoasController”

                        destination=”rubyamf”> 

            <mx:method name=”update” result=”onResult(event)” /> 

            <mx:method name=”create” result=”onResult(event)” />

            <mx:method name=”destroy” result=”onResult(event)” />

    </mx:RemoteObject>

            <mx:HTTPService

                         id=”srvPessoas”

                         url=”http://localhost:3000/pessoas.xml”

                         result=”httpResult(event)”

                         fault=”httpFault(event)”               />

            <mx:List id=”lstPessoas” x=”10″ y=”40″

                        labelField=”nome”

                        dataProvider=”{minhasPessoas}”

                        width=”187″ height=”162″>       

            </mx:List>

            <mx:Button x=”10″ y=”10″ label=”Carregar” id=”btCarregar” click=”carregarPessoas()”/>

            <mx:TextArea id=”taPessoaCodigo” x=”63″ y=”234″ height=”23″ width=”45″/>

            <mx:Label x=”20″ y=”235″ text=”Código”/>

            <mx:Label x=”20″ y=”266″ text=”Nome”/>

            <mx:TextArea x=”63″ y=”265″ id=”taPessoaNome” width=”119″ height=”23″/>

            <mx:Canvas x=”10″ y=”224″ width=”187″ height=”110″>

                        <mx:Button x=”10″ y=”78″ label=”+” id=”btNovo” click=”novaPessoa()”/>

                        <mx:Button x=”61″ y=”78″ label=”-” id=”btExcluir” click=”apagarpessoa()”/>

                        <mx:Button x=”112″ y=”78″ label=”Alterar” id=”btAlterar” click=”alterarPessoa()”/>

            </mx:Canvas>

</mx:Application>

 

 

Teoricamente funciona.

Falta muita coisa para aprender e melhorar, mas espero que tenha sido útil.

TI é Virtual ou Real?

4/dezembro/2008

            Para entender TI as pessoas sentem a necessidade de fazer uma analogia com o mundo real, mas TI faz parte do mundo real. Ninguém sente necessidade de fazer analogia da construção civil ou do processo de vendas com qualquer outra coisa para definir como estas áreas trabalham, porque então com TI a regra muda.

Parece então que TI não faz parte do mundo Real, mas na realidade podemos perceber que a motivação não é entender o que é TI, e sim as pessoas querem gerenciar, avaliar ou administrar TI como é feito em uma outra área que se acredita que funciona bem.

Alguns dizem que desenvolver em TI é igual a construir um prédio hummmmmm, muito interessante.

O que tem haver bit’s e bytes com argamassa e tijolo?

Se aceitarmos isso como uma verdade, assumimos que poderemos gerenciar os profissionais de TI como um mestre de obras gerencia os profissionais da construção civil, que os desenvolvedores não são artistas e apenas codificadores que mecanicamente assentam “tijolos virtuais” um em cima do outro em um ritmo previsível e contínuo.

Percebeu onde queria se chegar?

É difícil para um gestor dizer que não sabe quando o sistema estará pronto porque os profissionais não conseguem estimar de forma precisa quanto tempo demoram em fazer uma tarefa. Na mente do gestor um prédio é bem maior, precisa ser seguro e é bem complexo e os engenheiros conseguem dominar os profissionais de tal forma que o prazo é informado.

Solução: Convença os profissionais que o problema esta com os desenvolvedores ou seus coordenadores são permissivos.

Mas como fazer isso afirmando que o processo de desenvolvimento em TI é igual ou análogo a construção civil.

Preciso informar uma coisa… Eles nem imaginam como é a construção civil em um cenário semelhante ao de TI, acreditem alguns dos problemas de TI não são só de TI. E pior a construção civil se comporta bem desorganizada, imprevisível e seus prazos e orçamento não são nada melhores que os de TI.

Antes de prosseguirmos…

Procurem alguém que trabalhe realmente com construção civil, pessoas que fizeram reformas significativas em um prédio ou não tão significativas assim, perguntem dos detalhes dos prazos e valores e do resultado versus planejado.

Perguntem.

Porque ler isso?

4/dezembro/2008

Parece uma pergunta irrelevante ou feita para uma discussão que não chega a lugar algum, entretanto por mais que não pareça tem um objetivo definido. Por fim vai envolver um assunto conhecido em TI, se os profissionais nesta área são trabalhadores de uma linha de produção ou verdadeiros artistas.

Muito já foi dito e metáforas foram feitas para se entender o desenvolvimento em TI, só que se desenvolver for Arte muda muita coisa, sendo assim tenha outros olhos sobre o tema e acredite que podemos dizer algo interessante.


Seguir

Obtenha todo post novo entregue na sua caixa de entrada.