segunda-feira, 19 de setembro de 2016

O que fazer se o seu cliente parar de responder subitamente

O Cliente Sumido

Natan, o designer, recebeu um telefonema de um possível cliente, adrenalina subindo, pode ser um novo job chegando. Discutem detalhes, ideias vem, ideias vão, rabiscos no papel. Pronto, chegaram em um conceito. Desligam o telefone sem marcar uma reunião ou qualquer outro tipo de compromisso, mas tudo bem, a conversa foi boa e nada pode dar errado nessa venda.

Com todo o ânimo que a ligação provocou, Natan abre o seu editor gráfico favorito, produz alguns designs básicos, começa a fazer sua pesquisa de referências, busca por tudo: estilo gráfico, tipografia, cores, época, imagens. Pronto, já está fazendo o que ele sabe fazer melhor. Está produzindo um material de qualidade pro seu cliente. Digo, possível cliente.

O dia se acabou e nosso designer envia para o cliente todo esse novo material que produziu, e não foi pouca coisa. Ao chegar no escritório (em muitos casos, ao chegar na sua sala/escritório, o futuro realmente chegou nessa profissão) Natan sente uma pequena decepção do cliente ainda não ter respondido com qualquer tipo de feedback. Mas ainda exaltado pelo dia de ontem, como as coisas não estão fáceis, o telefone não toca e você não está recebendo emails de pedidos de orçamento, resolve dar um próximo passo no projeto do cliente, afinal, se alguma outra coisa chegar você já vai ter adiantado bastante esse projeto e não jogado o seu tempo fora navegando no facebook.

Os dias passam, Natan já produziu um pequeno protótipo, com css e javascript e um bocado de back-end. Resolve mandar um segundo email. Pegava mal tentar entrar em contato antes, cliente importante. No sábado de manhã uma resposta.

"Ok ótimo manda bala"

A pequena decepção se torna ira. "Como é possível que depois disso tudo é somente isso que ele pode falar? E mandar bala em quê, exatamente? Nem assinamos um contrato, o escopo não está fechado, o que tinha pra atirar você já atirou. Mandar bala, veja só..."

Um cliente antigo lhe liga, você recebe com muito carinho os pedidos de alteração e deixa um pouco de lado o cliente misterioso. Argh, argh, é assim que o designer reagiu aos pedidos do antigo cliente. Aumentar o logo de novo? Trocar o ícone da cestinha de compras por um carrinho porque foi comprovado que isto aumenta as conversões em 7,33%? Daí-me paciência, Natan pensou. E aos poucos foi voltando pro misterioso e ainda não cliente, não consegue parar de pensar na sua nova linda estrutura que está usando, as novas bibliotecas, as boas referências. "Projeto Massa!"

Lembra-se de responder o cliente. Dessa vez fez tudo certo.

"Bom dia Sr Gilson,

Que bom que o senhor gostou do trabalho, podemos marcar uma reunião para fecharmos o escopo e assinarmos o contrato do trabalho?

Muito obrigado,
O Designer"

5 dias se passaram, e sim, nada do Sr Gilson responder, é, agora Natan consegue o chamar pelo nome. Não se contentando com a demora de responder do Sr Gilson, acredita que ele precisa de mais um incentivo e envia pra ele um vídeo do novíssimo protótipo.

Dois dias se passaram, e ele o responde. Diz que está muito ocupado mas que quer muito marcar a reunião com você no início da semana seguinte. Note que era uma terça-feira.

Esta história já aconteceu com Natan, com você e com muita gente, não é verdade? Infelizmente esta é a realidade de muitos freelancers, mas não pense que não há como sair dessa, que faz parte da vida. Existe um mundo onde você pode trabalhar e ser respeitado por seus clientes, mas pra isso é preciso mudar alguns padrões de comportamento e adicionar coisas simples ao seu processo VOCÊ PRECISA DE UM CONTRATO. Um contrato antes de tudo, e uma dose de reflexão para aprender a enxergar você da maneira que o cliente enxeraga. Se você quer saber como fazer um contrato que não lhe toma todo o seu tempo nem sua energia vitual, como fugir de clientes ruins sem ser rude e como atrair bons clientes, se inscreva na minha novíssima newsletter onde irei ensinar como se vence essas verdadeiras sinucas que a vida do freelancer é.






sábado, 24 de janeiro de 2015

How to center crop image from camera or SdCard in android

Setting scaleType to centerCrop is not enough. You actually need to transform your Bitmap. The following method can do that (performance considerations are not taken seriously here, though)

    public static Bitmap scaleCenterCrop(Bitmap source, int newHeight, int newWidth) {
        int sourceWidth = source.getWidth();
        int sourceHeight = source.getHeight();
        // Compute the scaling factors to fit the new height and width, respectively.
        // To cover the final image, the final scaling will be the bigger
        // of these two.
        float xScale = (float) newWidth / sourceWidth;
        float yScale = (float) newHeight / sourceHeight;
        float scale = Math.max(xScale, yScale);
        // Now get the size of the source bitmap when scaled
        float scaledWidth = scale * sourceWidth;
        float scaledHeight = scale * sourceHeight;
        // Let's find out the upper left coordinates if the scaled bitmap
        // should be centered in the new size give by the parameters
        float left = (newWidth - scaledWidth) / 2;
        float top = (newHeight - scaledHeight) / 2;
        // The target rectangle for the new, scaled version of the source bitmap will now
        // be
        RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight);
        // Finally, we create a new bitmap of the specified size and draw our new,
        // scaled bitmap onto it.
        Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig());
        Canvas canvas = new Canvas(dest);
        canvas.drawBitmap(source, null, targetRect, null);
        return dest;
    }

So, remember to always call it before using your bitmap in your CircularImageViews

quarta-feira, 21 de janeiro de 2015

How to center AlertDialog message

You follow some tutorials and stackoverflow answer to code something like this
         final AlertDialog alertDialog = new AlertDialog.Builder(this)
                    .setMessage(getString(R.string.email_invalido))
                    .setNeutralButton(R.string.ok, null)
                    .create();
            TextView messageView = (TextView) alertDialog.findViewById(android.R.id.message);
            if (messageView != null) {
                messageView.setPadding(15, 20, 10, 10);
                messageView.setGravity(Gravity.CENTER_VERTICAL);
            }                                     alertDialog.show(); 

But that produces the following error:

android.util.AndroidRuntimeException: requestFeature() must be called before adding content
            at com.android.internal.policy.impl.PhoneWindow.requestFeature(PhoneWindow.java:249)
            at com.android.internal.app.AlertController.installContent(AlertController.java:234)
            at android.app.AlertDialog.onCreate(AlertDialog.java:337)
            at android.app.Dialog.dispatchOnCreate(Dialog.java:361)
            at android.app.Dialog.show(Dialog.java:262)
            at xxx.activity.validateMailAndMayRequestRecoverPassword(EsqueciSenhaActivity.java:34)
            at xxx. activity onClickEnviarButton(EsqueciSenhaActivity.java:62)             at xxx.activity$$ViewInjector$1.onClick(EsqueciSenhaActivity$$ViewInjector.java:18)
            at android.view.View.performClick(View.java:4456)
            at android.view.View$PerformClick.run(View.java:18465)
            at android.os.Handler.handleCallback(Handler.java:733)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5086)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

Analyzing the PhoneWindow.java source code I've found out that you need to call show before using findViewById() because of some side effects.

So the correct code is

            final AlertDialog alertDialog = new AlertDialog.Builder(this)
                    .setMessage(getString(R.string.email_invalido))
                    .setNeutralButton(R.string.ok, null)
                    .create(); alertDialog.show();             TextView messageView = (TextView) alertDialog.findViewById(android.R.id.message);
            if (messageView != null) {
                messageView.setPadding(15, 20, 10, 10);
                messageView.setGravity(Gravity.CENTER_VERTICAL);
            } 

quinta-feira, 27 de novembro de 2014

How to get sqlite file location for iOS simulator

Just use the following command at your debugger in Xcode.

po NSHomeDirectory()

The debugger accept commands if it's paused, you can pause the app using a breakpoint or though the Pause command (In Xcode, Debug -> Pause, ⌃Y)

segunda-feira, 11 de novembro de 2013

sábado, 13 de abril de 2013

Playing a Graphic Designer a.k.a Making a banner and youtube logo to a friend

I've been playing around in Illustrator and Photoshop, messing with some types, alignments and images to try to make something useful for a great friend.

That's the result, I hope you like it!

I didn't have the guts with typography contrast here, making "essa" and "vamos" a little boring. 

This one is completely different, a less ludic approach.