Skip to content


rsync e hard link

Olá pessoal!!

No OS X o app Photos é muito bom para organizar e visualizar fotos offline, mas para manter um backup no iCloud tem um preço amargo e no Flickr temos 1TB grátis e no Google Photos é ilimitado para fotos Full HD e mesmo a versão que aceita as fotos em tamanhos originais ainda é mais barato que da Apple.

Não conseguimos fazer os softwares de upload dos concorrentes enxergarem suas fotos dentro do app Photos, então resolvi fazer um hard link para um diretório externo onde os demais aplicativos conseguissem ter acesso às fotos e manter meu backup nas nuvens atualizado 🙂

Esse é o comando completo que utilizei para fazer isso com as fotos:

rsync -rv --link-dest=/Users//Pictures/Photos\ Library.photoslibrary/Masters/ /Users//Pictures/Photos\ Library.photoslibrary/Masters/ /Users//Pictures/Backup

Claro que é possível fazer hard link com qualquer arquivo, o comando é basicamente esse:

rsync -rv --link-dest=$SRC $SRC $DEST

Lembrando que um inode (arquivo) será apagado se não tiver nenhuma referência a ele, então o ideal é apagar todos os hard links criados antes de atualizar novamente usando o rsync, como estamos falando somente de referências não demora nem um minuto para apagar e recriar tudo em muitos gigas.

O próximo passo é manter tudo sincronizado usando o launchd, mas isso é assunto para um próximo post, mas assim que tiver pronto eu atualizo este post.

Obrigado, até a próxima!!

Posted in Dicas, Tips, tutorial.

Tagged with , , , , , , , , , , , .


Android e Calabash

Hi dude,

I was studying Calabash to automated testing with Android and I think it is still not mature enough yet, but it will be excellent tool, I’m not go into details because I don’t think it’s worth it, but for those who want to venture, follows what is needed to iterate a ListView, because just found this information on a single thread of stackoverflow, which of course I’ve lost the source, but follow the gist: https://gist.github.com/paulokhouri/742573a9685ce89862ad

See you soon!!

Pessoal,

Estive estudando Calabash para testes automatizados com Android e acho que ainda não está maduro o suficiente, mas será uma excelente ferramenta, não vou entrar em detalhes porque eu não acho que vale a pena, mas para quem quiser se aventurar, segue o que é necessário para iterar um ListView, pois só encontrei essa informação em uma única thread do stackoverflow, que claro que já perdi a fonte, mas seguem o gist: https://gist.github.com/paulokhouri/742573a9685ce89862ad

Até a próxima!!

Posted in Android, Calabash, Dev, Dicas, Mobile, Tips.

Tagged with , , , , .


Alterar SQLite on the fly

Olá pessoal, hoje o post foi uma necessidade do meu amigo Victor, então ele compartilhou sua solução e eu achei interessante deixar gravado aqui no blog, pois pode ser muito útil, afinal trabalhamos com informática, né 🙂

Alterar um banco de dados em produção é sempre tenso, então o Victor criou uma solução para isso.

Temos que criar dois métodos, um para saber qual a versão do SQLite e outro para incrementar essa versão.

Após realizar a alteração, incrementamos a versão da base e para saber se é preciso rodar o script de alter table na versão atual, verificamos a versão do banco.

Se quiserem sugerir otimizações, fiquem a vontade!!

- (int)getUserVersion
{
    static sqlite3_stmt *stmt_version;
    sqlite3 *database;

    int databaseVersion;

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {
        if(sqlite3_prepare_v2(database, "PRAGMA user_version;", -1, &stmt_version, NULL) == SQLITE_OK)
        {
            while(sqlite3_step(stmt_version) == SQLITE_ROW)
                databaseVersion = sqlite3_column_int(stmt_version, 0);

            NSLog(@"%s: the databaseVersion is: %d", __FUNCTION__, databaseVersion);
        }
        else
            NSLog(@"%s: ERROR Preparing: , %s", __FUNCTION__, sqlite3_errmsg(database));

        sqlite3_finalize(stmt_version);
        sqlite3_close(database);
    }
    return databaseVersion;
}

- (void)incrementUserVersion:(int)newVersion
{
    static sqlite3_stmt *stmt_version;
    sqlite3 *database;

    const char *newPragmaVersion = [[NSString stringWithFormat:@"PRAGMA user_version = %d;", newVersion] UTF8String];

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
    {
        if(sqlite3_prepare_v2(database, newPragmaVersion, -1, &stmt_version, NULL) == SQLITE_OK)
            sqlite3_step(stmt_version);
        else
            NSLog(@"%s: ERROR Preparing: , %s", __FUNCTION__, sqlite3_errmsg(database));

        sqlite3_finalize(stmt_version);
        sqlite3_close(database);
    }
}

Espero que tenha ajudado, enjoy e até a próxima!
Victor, obrigado pela contribuição, grande abraço!

Posted in Dev, Dicas, iOS, Mobile.

Tagged with , , , , , , , , , .


Auto Layout

Pessoal agora estamos com algumas fragmentações nos devices da Apple, mas ela não nos abandonou, temos o Auto Layout para posicionar os objetos por referencia e não um frame fixo, então vamos falar um pouco de como funciona.

Para começarmos é requisito o xcode 4.5 e iOS 6 e confirmando o que eu havia dito, não vai ser suportado a arquitetura do iPhone 3G e lembrando que todos os demais podem rodar iOS 6.

Se você criar um novo nib ou usar algum já existente já pode habilitar o Auto Layout como nessa imagem:

Não precisaremos mais de definir os frames como faziamos no - (void)layoutSubviews, por exemplo.

Mas lembre-se de desabilitar o autoresizing maks translation para todas as views que você criou programaticamente, senão o resultado pode não ser o esperado com o Auto Layout.

[view setTranslatesAutoresizingMaskIntoConstraints:NO];

O segredo não está nos objetos ou em suas posições, mas sim nas CONSTRAINTS, elas e suas prioridades que ditam as regras, então escolha a constraint que melhor lhe servir. Vamos botar a mão na massa e ver como se faz.

Na imagem abaixo a constraint selecionada é referente ao objeto, assim como o Button tem as suas constraints que também são referidas ao tamanho do mesmo. Caso contrário são as que tanto queremos, as constraints que definem as posições e a quem elas estão se referindo, ou seja, o objeto vai se posicionar em relação a qual outro objeto.

Ao arrastar um objeto para a tela (nem preciso dizer que é com o AutoLayout habilitado, né) o IB já cria as constraints e habilita as que ele resolve, que não necessariamente são as que você quer, então habilite a que lhe melhor atende e para apagar as que você não quer é só clicar sobre ela e delete:

Vamos trabalhar em cima de uma constraint então, pois ela possui Relation, Constant e Priority.

Relation é a relação de igualdade, assim como uma equação, por exemplo se uma constraint for menor ou igual a um objeto, significa que a distância do objeto poderá ser igual à definida ou diminuir se for necessário, no caso de uma rotação onde a altura da tela fica menor, o objeto se moverá para continuar atendendo à constraint.

Constant é o valor inicial da constraint, digo inicial, pois se for menor ou igual ele vai ser o valor máximo, por exemplo e no caso de maior ou igual, será o valor mínimo, pois o mesmo poderá se extender para atender à Relation.

E mais, se um objeto em portrait, por exemplo, estiver bem em cima da borda, ao invés de definir um valor Constant, clique em Standard, com isso o objeto sempre vai manter no mínimo aquela margem que o IB já define quando você está arrastando os objetos para a tela.

Priority é a prioridade daquela constraint, pois um objeto para ser definido em uma determinada parte da tela, o mesmo precisa atender algumas regras, por exemplo, um objeto não pode definitivamente sair do lado de outro, mas em determinada posição (portrait ou landscape) ele pode se movimentar mais para a direita ou esquerda, então a constraint que define isso tem que ter uma prioridade menor do que a constraint que define a distância entre ambos objetos que têm que ficar lado a lado.

E a prioridade que não vai permitir quem um texto seja cortado, por exemplo, tem que ser a mais alta também, para que um objeto não tente o sobrepor.

Agora, se você quiser definir uma posição em relação a outro objeto é o mesmo princípio, a única diferença vai ser que para você definir tais constraints, você terá que selecionar ambos os objetos e clicar naquele icone para definir as constraints quem referencia um objeto a outro.

E pra encerrar com um slide sessão 202:

Mas como que eu vou saber se deu conflito, o primeiro passo é perceber que o layout não saiu como você esperava e para comprovar:

E isso acontece quando você não consegue satisfazer as regras da “grande equação”, composta pelas constraints que a compõe.

Bom, pessoal, eu tentei mencionar como que as constraints funcionam e não ensinar e mostrar passo a passo, mas recomendo que criem um projeto e testem o que foi dito aqui para você sentir e perceber melhor como é a relação entre todos os atributos e a repetição da palavra constraint, durante o post, foi proposital para que fique bem claro de quem estávamos falando.

Eu subi o projeto que eu criei para testar as combinações aqui no github, então fiquem a vontade para baixá-lo, mas lembre-se que ele só tem alguns casos.

Se quiserem se aprofundar no assunto e trabalhar nas constraints via código [NSLayoutConstraint], o princípio é o mesmo e na WWDC de 2012, sessões 202, 228, 232 e também na ajuda do próprio xcode você encontra mais informações.

Qualquer dúvida ou esclarecimento deixem nos comentários, obrigado e até a próxima!!

 

Posted in Dev, iOS, Mobile, tutorial.

Tagged with , , , , , , , , , , , .


NSDate e NSDateFormatter

Olá pessoal, uma coisa chata é data e quase nunca usamos, ai quando vamos usar novamente já nos esquecemos qual letra que imprime o que, né…

Esse post vai ser mais um guia para que nós possamos consultar toda vez que quisermos imprimir data.

Segue a tabela completa:

y 2012
yy 12
M 8
MM 08
MMM Aug
MMMM August
MMMMM A
D 214
d 1
dd 01
E Wed
EEEE Wednesday
EEEEE W
a AM || PM
h 5
hh 05
H 17
m 2
mm 02
s 2
ss 02
Z -0300
ZZZZ || z GMT-03:00
zzzz Brasilia Time

Essa tabela deu trabalho, mas acho que ficou de um jeito simples e fácil de entender, né.
Agora eu já sei onde recorrer quando eu precisar formatar data novamente, caso eu me esqueça 🙂

Enjoy e até a próxima!!

ps. se eu tiver me esquecido de algum, comente aqui que eu atualizo o post, valeu!!!

Posted in Dicas, iOS, Mobile.

Tagged with , , , , , , , , , , , , , .


iOS 4 ou iOS 5?

Pessoal eu estava pensando se ainda vale a pena dar suporte ao iOS 4, vou lavantar uns pontos que eu considero relevantes.

É realmente eu achei mais interessante começar com esses números da Apple.
O iOS 3, nem preciso dizer muito, pois 2% para não poder nem usar o ARC, fora as inúmeras melhorias do iOS 4, eu nem vou colocar em questão.
O iOS 4 já é uma parcela considerável, mas existem dois pontos:
1. iPhone 3G que já é muito lento e que muitas dessas pessoas gostam simplesmente do celular e não são heavy user da AppStore
2. Pessoas que não atualizam sei lá porque, então a gente não dando mais suporte para o iOS 4, elas vão acabar se sentindo pressionadas e vão acabar atualizando, pois device pra isso elas têm.

Você já deu uma olhada em quantas melhorias e facilidades o iOS 5 lhe oferece?!?!

Bom, nem preciso falar que o iOS 6 já está liberado para nós desenvolvedores, né??
E sim, ele vai ser compatível com o iPhone 3GS, mas não com o primeiro iPad 🙁

Pessoal, estive lendo um artigo falando da incompatibilidade do xcode 4.4 com a arquitetura armv6 (iPhone 3G) e a Apple afirmou que o xcode 4.5 não vai mais suportar essa arquitetura.

Com isso afirma mais ainda que todos os devices suportados pelo xcode podem rodar iOS 5, mais um motivo para não criarmos um app que rode no iOS 4, para podermos usufruir das melhorias do iOS 5.

Este é o meu ponto de vista, compartilhe nos comentários o seu 😉

Como não é o intuito deste post analisar outros pontos, para quem quiser o artigo que fala dessa incompatibilidade com referências da Apple, está aqui: Cocoanetics (em inglês).

Boa reflexão e até a próxima!!

Posted in Dicas, iOS, Mobile, Xcode.

Tagged with , , , , , , , .


Literals e Subscripting

Olá pessoal, recentemente a Apple lançou o Xcode 4.4 com o compilador LLVM alterado mais uma vez por ela com isso ganhamos algumas facilidades, vou mostrar algumas delas e como funciona.
Eu achei mais fácil ir direto na fonte, então na Session 405 – Modern Objective-C, tirei algumas screeshots para demonstrar facilmente como era e como é.
Mas eu sou obrigado a fazer assim agora?
– Não, você não é obrigado, mas eu quero ver você resistir 🙂

Vamos começar por Literals
Antes

Agora

Antes

Agora

Antes

Agora

Antes

Agora

Antes

Agora

Agora vamos mostrar como fica a parte de subscripting
Antes

Agora

Antes

Agora

Ah tá, gostei mas pra isso eu não vou poder fazer app para versões antigas do iOS??
– Ai que é o melhor, assim como o ARC funciona a partir do iOS 4 Literals e Subscripting funciona em versões anteriores, olhem só:

Bom, eu coloquei essa fotinha ai para vocês virem que tem mais coisa nova no novo LLVM da Apple e assistirem aos videos da WWDC.
Bom, é isso ai pessoal, boa sorte!!

Posted in Dev, iOS, Mobile.

Tagged with , , , , , , , , , , , , , , , , .


UIColor

Olá pessoal,

Essa é uma dica simples, mas eu não sabia que funcionava assim.

Ao usar cor RGB com o UIColor, eu não conseguia a cor que eu
queria, então descobri como que os parâmetros do método têm que ficar 🙂

[UIColor colorWithRed:38.0/255.0 green:54.0/255.0 blue:87.0/255.0 alpha:1.0]

O /255 é fundamental para funcionar, ok?

Até a próxima!

Posted in Dev, Dicas, iOS, Mobile.

Tagged with , , , , , , , , .


NO ARC – iOS

Olá pessoal,

Hoje vai uma dica rápida para que está usando ARC para o desenvolvimento dos aplicativos para iOS.

Eu tenho um arquivo de um terceiro que não está preparado para o ARC e estou com medo de convertê-lo, como é possível clicando em Edit -> Refactor -> Convert to ObjectiveC ARC, então você utilizá-lo sem ARC.

Clique no nome do SeuProjeto, vá para a aba Build Phases e no(s) arquivo(s) desejado(s) adicione o parametro -fno-objc-arc.

Lembrando que o ARC está disponível a partir da versão 4 do iOS.

Abraços!!

Posted in Dicas, iOS, Mobile.

Tagged with , , , , , .


Adicione um iOS Local Notification

Olá pessoal, depois de algum tempo sem escrever aos poucos eu vou postando novamente.

Hoje vamos fazer uma coisa simples e muito útil que é Local Notification, ou seja, enviar notificações do próprio aplicativo, não precisa ter conexão à internet.

Para isso precisamos de data e hora e isso conseguimos facilmente com o UIDatePicker, que eu não vou entrar no mérito da questão, mas a ação do Picker tem que ser do tipo valueChanged.

Adicione o trecho de código na classe onde você está definindo a data:

- (void)addNotification {
    UILocalNotification *localNotification = [[UILocalNotification alloc] init];

    localNotification.fireDate = self.datePicker.date;
    localNotification.alertBody = self.messageField.text;
    localNotification.soundName = UILocalNotificationDefaultSoundName;
    localNotification.applicationIconBadgeNumber = 1;

    NSDictionary *infoDict = [NSDictionary dictionaryWithObjectsAndKeys:@"Object 1", @"Key 1", @"Object 2", @"Key 2", nil];
    localNotification.userInfo = infoDict;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
    [localNotification release];
}

Agora, no método

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

do AppDelegate, adicione:

UILocalNotification *localNotification = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (localNotification) {
        NSLog(@"Notification Body: %@",localNotification.alertBody);
        NSLog(@"%@", localNotification.userInfo);
    }
    application.applicationIconBadgeNumber = 0;

E ainda no AppDelegate adicione o método:

- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification {
    NSLog(@"Notification Body: %@", notification.alertBody);
    NSLog(@"%@", notification.userInfo);
    application.applicationIconBadgeNumber = 0;
}

Pronto, simples assim e até a próxima.

Posted in Dev, iOS, Mobile, tutorial.

Tagged with , , , , , , .