Carregando...

Vapor 3 Postgres e OneModel

30 de August de 2018

 

Vapor

 


http://vapor.codes

 

 

Objetivo: Criar uma api com reaproveitamento de modelo de dados para uso em aplicativo nativo.

 

Keynote: https://www.slideshare.net/michelboss/cocoaheads-poa-agosto-18

 

Instalando o Vapor

Siga as instruções do site oficial: https://docs.vapor.codes/3.0/install/macos/

 

Após instalado e com o XCode aberto, vamos instalar o Fluent para o PostreSQL, que será o responsável por toda a comunicação de model / vapor com nosso banco de dados.

Link Documentação Fluet

 

Adicione o pacote no arquivo Package.swift

 

dependencies: [

        // 💧 A server-side Swift web framework.

        .package(url: "https://github.com/vapor/vapor.git", from: "3.0.0"),

        .package(url: "https://github.com/vapor/fluent-sqlite.git", from: "3.0.0")

        .package(url: "https://github.com/vapor/fluent-postgresql.git", from: "1.0.0"),

    ],

    targets: [

        .target(name: "App", dependencies: ["FluentSQLite", "FluentPostgreSQL", "Vapor"]),

 

 

Após adicionar as linhas e dependências execute novamente o comando: 


	$ vapor xcode

Para que sejam instaladas as dependências no projeto.

Faça isso sempre que adicionar e ou remover alguma dependência

 

Feito isso vamos começar as configurações:

 

Configurações de Serviços, IP e porta: 

Providers:

 

/// Register providers first

try services.register(FluentPostgreSQLProvider())

 

 

IP e Porta:

 

//Configure IP And Port

    let serverConfiure = NIOServerConfig.default(hostname: "0.0.0.0", port: 8080)

    services.register(serverConfiure)

 

 

Fluent PostgreSQL DataBase:

 

/// Configure a PostgreSQL database

 

    var databases = DatabasesConfig()

    let databaseConfig = PostgreSQLDatabaseConfig(hostname: "localhost", username: "michel", database: "todoDemo1")

    let dataBase = PostgreSQLDatabase(config: databaseConfig)

    databases.add(database: dataBase, as: .psql)

    services.register(databases)

 

 

Migrations:

 

/// Configure migrations

    var migrations = MigrationConfig()

    migrations.add(model: Todo.self, database: .psql)

    //migrations.add(model: Todo.self, database: .psql)

    services.register(migrations)

 

 

Configurando Model: Sources > App > Models > Todo.Swift

 

Vamos alterar o model Todo para o seguinte formato. Removendo o import do FluentSQLite também o protocolo SQLiteModel substituindo por Codable, vamos adicionar um atributo / campo do tipo Bool

import Foundation

 

 

/// A single entry of a Todo list.

final class Todo: Codable {

    /// The unique identifier for this `Todo`.

    var id: Int?

 

    /// A title describing what this `Todo` entails.

    var title: String

    

    /// A flag describing if this `Todo` is done.

    var done: Bool?

 

 

    /// Creates a new `Todo`.

    init(id: Int? = nil, title: String, done: Bool? = false) {

        self.id = id

        self.title = title

        self.done = false

    }

}

 

Vamos recortar agora as seguintes linhas que estão abaixo da class Todo:

 

/// Allows `Todo` to be used as a dynamic migration.

extension Todo: Migration { }

 

/// Allows `Todo` to be encoded to and decoded from HTTP messages.

extension Todo: Content { }

 

/// Allows `Todo` to be used as a dynamic parameter in route definitions.

extension Todo: Parameter { }

 

 

Agora abra o arquivo: Sources > App > Controllers > TodoController.Swift

Logo abaixo do import Vapor, cole o código que copiamos do arquivo Todo.swift

Vamos aproveitar e importar também a Lib FluentPostgreSQL e adicionar a Extension para o mesmo

 

 

extension Todo: PostgreSQLModel { }

 

 

Nosso arquivo após os ajustes deve ficar assim:

 

import Vapor

import FluentPostgreSQL

 

extension Todo: PostgreSQLModel { }

 

/// Allows `Todo` to be used as a dynamic migration.

extension Todo: Migration { }

 

/// Allows `Todo` to be encoded to and decoded from HTTP messages.

extension Todo: Content { }

 

/// Allows `Todo` to be used as a dynamic parameter in route definitions.

extension Todo: Parameter { }

 

 

 

/// Controls basic CRUD operations on `Todo`s.

final class TodoController {

    /// Returns a list of all `Todo`s.

    func index(_ req: Request) throws -> Future<[Todo]> {

        return Todo.query(on: req).all()

    }

 

    /// Saves a decoded `Todo` to the database.

    func create(_ req: Request) throws -> Future<Todo> {

        return try req.content.decode(Todo.self).flatMap { todo in

            return todo.save(on: req)

        }

    }

 

    /// Deletes a parameterized `Todo`.

    func delete(_ req: Request) throws -> Future<HTTPStatus> {

        return try req.parameters.next(Todo.self).flatMap { todo in

            return todo.delete(on: req)

        }.transform(to: .ok)

    }

}

 

 

Fizemos estes ajustes para que possamos isolar o arquivo de model Todo para que possamos usá-lo tanto no Vapor quanto em um projeto de app sem se preocupar com dependências.

 

Neste momento já podemos rodar o projeto e ver o banco criado. com o Terget Run selecionado  aperte Command + R para rodar o projeto

Se tudo deu certo você deve ter a seguinte saída no console do XCode.

 

E se você abrir seu gerenciador de banco, terá o banco criado também. (Eu uso o pgAdmin)

 

 

Podemos fazer um commit de nossas alterações e partir para o próximo branch =)

 

Testando API com Postman:

Você pode facilmente testar a api com o Aplicativo Postman

 

Se fizermos um get no mesmo endereço já teremos a listagem com as todos criadas, se acessarmos no navegador o endereço http://localhost:8080/todos também teremos acesso as todos criadas.

 

Criando um App de Todo e Reaproveitando o Model

 

Primeiro precisamos adicionar um novo Target no projeto:

 

  1. Selecione o Projeto e ckique no icone + conforme imagem abaixo:


     
  2. Selecione Single View App:


     
  3. Preencha os campos conforme preferir e de ok:

 

Pronto você tem um novo target criado. Agora precisamos fazer com que o Model seja visto por nosso novo target.

Para isso selecione o arquivo de model e na coluna de Utilities marque o target do App conforme imagem abaixo:

Agora o Model Todo já está visivel para o Target do App.

Não vou entrar no melhor modo de fazer um app de Todo mas vou deixar o projeto final no github para que vocês vejam o tutorial rodando e criando registros.

Link do projeto final: https://github.com/micheltlutz/todoCocoaHeads

Fique a vontade e crie como você preferir.

 

 

Espero que tenham gostado e em breve trago novos posts de Vapor. 

 

 

Automatizando deploy com Fastlane

13 de March de 2018

fastlane é uma plataforma de código aberto mantida pelo Google destinada a simplificar a implantação de Android e iOS.

O fastlane permite automatizar todos os aspectos do seu desenvolvimento e liberar o fluxo de trabalho.

Link do projeto: https://fastlane.tools

 

Suporte com Integração Contínua

 
 
Vou criar um tutorial para o setup inicial e posteriormente vou evoluindo, no final deste poste você será capas de:
  • Criar o app no Developers Portal da Apple;
  • Criar o app na Itunes Connect;
  • Gerar certigicados de provisionamento de desenvolvimento e de distribuição;
  • Enviar seu app para revisão

 

Requisitos

O processo todo foi feito em um MacOS

São necessários previamente instalados os itens abaixo.

  • Xcode instalado
  • Xcode Command Line Tools ( abra o terminal e execute ) xcode-select —install
  • Brew
  • Bundler
 

Instalando Brew


# Instalar
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Testes de permissões
brew doctor

# Atualizar Brew
brew update

# Instalar Brew Cask, para instalar apps pelo terminal
brew tap caskroom/cask

Instalando Budler

# Instalar Bundler
sudo gem install bundler

Repositório

 
Além disso recomendo já ter criado também uma conta no Bitbucket ou outro de sua preferência, o Bitbucket será usado para criar um repositório privado para os certificados.
 
Não esqueça que é necessário também uma conta de desenvolvedor Apple ID. 
 

Dependências para certificados e usuários desenvolvedores e CI

O fastlane tem um controle de certificados e recomenda o uso de um repositório git privado para armazenamento destes.

Em caso de conta de desenvolvedor (empresa) Team onde se permite adicionar mais desenvolvedores, recomenda-se criar uma nova apple id (usuário e email para este na rede) com permissões especificas de gestão de aplicativos para que este usuário faça as criações, publicações e atualizações automaticamente sem precisar usar senha de desenvolvedor global.

Fastlane pode ser usado com projetos Ionic, React Native e Projetos nativos também, uma vez que se utiliza de arquivos comuns de projetos das plataformas para realizar as automatizações. 

Para geração de screenshots é necessário implementar classes (arquivos) de testes de UI para que o build seja feito. Caso contrário basta adicionar as imagens de screenshot dentro de sua pasta especifica para que quando o release for feito ele possa adicionar as imagens no Itunes Connect ou Play Store Console. Vou criar um outro post mais para frente somente com isso.

 

Mão na massa

Abra o Xcode e crie um projeto qualquer

Na Tala com informações do projeto.

 

Desmarque a caixa Automatically manage signing

 

 

Abra o Terminal e acesse a pasta raiz do projeto.

Tendo todos os requisitos de instalação ok execute o seguinte comando.

 bundle init

este comando irá iniciar o bundler dentro do seu projeto....

Próximos passos

- Abrir o arquivo Gemfile criado pelo bundler 
- adicionar a linha de dependência
     gem "fastlane"
 
- Executar no terminal 

bundle update
 para que o bundle instale as dependências adicionadas no arquivo  Gemfile.
 
- Criar projeto na apple
	bundle exec fastlane produce

Será perguntado seu ID da Apple senha  eo Bundle ID do projeto e o nome do mesmo.

Aguarde o processo. Feito isso você pode começar a usar as ferramentas do fastlane

- Inicializando fastlane
 


	bundle exec fastlane init
 
- Singin 
 

	bundle exec fastlane match init
 
 
colocar caminho do repositorio dos certificados gerados pelo GitHub ou Bitbucket
 
https://seuusuario@bitbucket.org/seuprojeto/certificados.git
 
Para distribuição e desenvolvimento respectivamente.
	bundle exec fastlane match appstore
	bundle exec fastlane match development

É importante que neste momento você sesative o auto signing do seu projeto e selecione na caixa o perdil que tenha match elegível, conforme imagem abaixo.

 

Você pode adicionar no seu info.plist a sequinte linha

< key >ITSAppUsesNonExemptEncryption< / key >
  < false >

Remova os espaços ok?

 

A doc completa do Match você pode encontrar aqui: https://docs.fastlane.tools/actions/match/

 

No próximo post vou explicar como publicar o seu app usando o Fastlane

Até lá....

Swift - Gerando Doc com jazzy

27 de October de 2017

 

Olá pessoal. Hoje vou explicar de uma maneira bem simples como podemos gerar uma documentação de nosso aplicativo de uma forma bem rápida e sem dor de cabeçar. Usando o Jazzy

 

 

Jazzy

O Jazzy é uma ferramenta de linha de comando que gera a documentação de nosso projeto baseada na documentação de cada código fonte, classe, função , struct ...

Ele suporta alguns bons tipos de formato de marcação abaixo alguns links.

A lista completa e documentação pode ser encontradas no pŕoprio git do Jazzy

Bom vamos por a mão na massa.
 

MacOS

Instalação

Precisamos ter instaladao o Ruby em nossa maquina. portanto abra o terminal e digite:  ruby --version

Caso não tenha instalado recomendo o RVM ou instele via Brew.

Feito?

Certo seguimos então com o seguinte comando:

sudo gem install jazzy

Aguarde o final da instalação e pronto já podemos usar. O Jazzy tem seu próprio help parão digitando o jazzy -h

 

Um exemplo basico de documentação.

/**

         Documentação para func com param

     

     - Parameter login: ***String*** com login

     

     - SeeAlso: `Usuario`

     */

    func testeDoc(login: String){

 

.   ...

    }

 

Para excluir da documentação use uma declaração de comentário para documentação com  :nodoc:

/**

 :nodoc:

 */

class AppDelegate: UIResponder, UIApplicationDelegate {

....

 }

 

 

Gerando a documentação

 

Feito isso você precisa voltar para o terminal entre na pasta raiz do projeto e execute o comando:  jazzy --min-acl internal

Vocë deve ter a seguinte saída

 

 

porque --min-acl internal ?

Você poderia apenas executar jazzy  Mas a  documentação deixa claro que por padrão ele procura por padrão declarações publicas e abertas.

Como nosso código é bem padrão precisamos setar o internal como parametro de requisito minimo de geração.

 

Acessando a documentação

 

Entre na pasta do projeto e procurar por outra chamada docs. Dentro dela existe um arquivo index.html dois clicks neste arquivo e a documentação é aberta no navegador padrão de sua maquina.

 

 

- Note que nesta imagem acima a classe AppDelegate ainda aparece. Se você baixar o reposiório do post verá que a documentação com :nodoc: foi adicionada e ela foi removida da documentação final.

 

Deixei todo o fonte e doc em meu git para darem uma olhada segue o link Git postjazzy

 

Linux

Em breve ... estou montando certinho o passo a passo. pois é um pouco diferente na parte de dependências.

 

 

 

Simples não?

 

Como eu gosto de dizer. Uma boa documentação vale por mil palavras.

 

 

Hello World  -  Resiliência em tempos de crise

30 de June de 2017

Primeiramente. Obrigado a você que teve interesse em ler o que começo a escrever a partir de hoje. Tenho minha conta no Medium (Texto migrado do meu Medium) a algum tempo consumo conteúdo mas nunca me dediquei a publicar algo, até não por falta de vontade mas por rotina de outras coisas. E é um pouco sobre estas outras coisas que venho escrever para vocês hoje.

Trabalho com Desenvolvimento de Sistemas atualmente Front-end em uma empresa aqui de Porto Alegre. Sou dono de uma empresa chamada Masters Mx e que em 2015 precisei infelizmente deixar um pouco o sonho de ter o próprio negócio de lado para sobreviver e alimentar um pequeno Golden Retriever de 45kg chamado Simba.

 

Simba

Simba JR Lütz Tiento Golden True Love

 

Quando em 2011 decidi largar um emprego bom na minha área para seguir um sonho que tinha des de pequeno o frio na barriga bateu mas a vontade era maior que ela. A jornada é complicada, muito energético ansiedade, medo. Os projetos vem atrasos ocorrem, problemas acontecem. Você tem seu carro arrombado em um supermercado e furtam seu notebook com um projeto de potencial muito bom que você não havia feito backup. É amigo a primeira tijolada vem e te acerta no meio. Primeiro projeto cancelado.

Você continua pois são coisas que acontecem, investe em um novo computador e segue em frente. São muitos leões para se matar e algumas mulas para se aturar. Consegui manter projetos funcionais ver a empresa prosperar por 5 anos. Vi pessoas que não acreditavam me falar que gostariam de ter tido a coragem que tive quando eram mais novos.

Tentar e fracassar entra na rotina, mas sempre vão existir pessoas que acreditam e investem em você e em seu projeto. Posso dizer que não sou de família rica e não herdei o negócio da família, mas tive a melhor investidora que se pode ter. Dona Sandra minha amada mãe, investiu em mim quando tinha e quando não tinha.
Quando inventava um negócio para fazer dinheiro mas que não ia muito adiante. Responsável por me dar meu primeiro computador 486 dx, de Com um 16 cores e um mouse que não funcionava no qual com a ajuda de um Guru chamado Gelson fez o teclado virar um mouse pelas setas do teclado numérico.
Ahh só para saberem Gelson é meu tio físico e também da área de tecnologia, lembro dele me mostrando como clicar em um botão e fazer uma imagem de um foguete andar na tela a alguns bons anos em VB6(Visual Basic) este mesmo que instalou a primeira versão do Front-Page naquele 486 e que em 2001 conversamos e eu disse que queria fazer sites, como aprendi?

Simples…

  1.  Ente em um site;
  2.  Clique com o direito do mouse e exiba o código fonte;
  3.  Copie o código e cole no seu editor de html;
  4.  Abra o arquivo no navegador;
  5.  Edite o código copiado e veja o que acontece;


Foi o roteiro que me foi passado e que funcionou. Mas não é só isso.

Gato

Empreender e quem é empreendedor sabe, é deixar muitas coisas de lado, dizer não para gastos, passeios roupas da moda, lançamentos de jogos, festas …

Mas e a resiliência?

Bom pessoal do meu ponto de vista a resiliência é um exercício e que precisa de algum esforço de sua parte. Tudo o que resumi aqui e é sério não contei muita coisa para não virar um livro. Procure na sua vida coisas que te inspiram e que te fazem seguir em frente, isso te da força para levantar e seguir. Como já dizia nosso amigo Alfred Thaddeus Crane Pennyworth


Para que caímos Sr. Wayne? … Para aprendermos a nos levantar.


Hoje estou tentando levantar novamente minha empresa e sei que em breve voltamos ao trilho. E focando no desenvolvimento de aplicativos nativos iOS.
Se você leu até aqui obrigado e te desejo muita força. Pretendo trazer um conteúdo legal aqui para quem é desenvolvedor ou não.


"Não desista de seus sonhos pois sonhar é um grande passo para o futuro."
- Michel Anderson Lütz Teixeira

 

Minha Inspiração

Essa é minha inspiração (Eu, Simba e minha Noiva Karen)

Desenvolvido por Michel Lütz