Carregando...

WWDC 2019 - Body Invaders

22 de April de 2019

Welcome to Body Invaders

 

My first submission to WWDC is Rejected, no problem, the experience was fantastic and fun. Next year we will try again

 

The inspirations and motivations for the creation of this playgroundBook game are:

My wife Karen and the little babies Alice and Anita

 

To best experience use device on landscape rotation.

 

 This playground will teach you how your body defends itself from bacteria and viruses that we are exposed to every day ...

 

 The stories of superheroes show us the struggles between the defenders of planet Earth and the enemies who try to invade our space and dominate us, with intense battles of powers between good and evil. In this war all the super powers necessary to defeat the villains are used as quickly as possible and without causing much mess, establishing world peace. In the human body are battled several of these battles every time bacteria and viruses invade our body trying to multiply and make us sick. In our blood we have well-trained small soldiers to attack any invader and destroy it, lymphocytes and macrophages.

 Let's present the two main heroes

 

Macrophages

 

 Macrophages are the first to detect enemies and their function in the army is to neutralize, ingest (phagocytosis) and destroy the invading villains, in addition to processing them and presenting them to the lymphocytes.

 

 

Lymphocytes

 

 Lymphocytes protect us against viruses, fungi and bacteria and are responsible for differentiating the cells from the body from foreign bodies. When they find the invaders in the bloodstream, they produce the antibodies, responsible for the destruction of the villains.


 

 In this chapter your enemies are two types of bacteria

 

Bacilus

 

 

 

Cocus

 

 ---

 

Instructions

Share via Air drop a file Body Invaders.playgroundbook this file are open in Playgrounds

Tap in icon Body Invaders an enjoy de game.

 

Game Instructions

 Tap the bacteria to kill them.

 

 You have 2 types of weapons **Macrophages** and **Lymphocytes**

 

 ## Macrophages

 Have 2 points of power

 

 ## Lymphocytes

 Have 10 points of power

 To change weapons tap the hero at the bottom of the screen. You have 3 minutes to kill as many bacteria as possible

 

GitHub Project

https://github.com/micheltlutz/body-invaders

Youtube Demo

 

Raspberry Pi DHT-SwiftyGPIO - PTBR

10 de March de 2019

Usando o Swift para exibir a temperatura e a umidade de um módulo DHT11

Requisitos

Raspberry Pi 2+ ou Raspberry Pi 3 Model B Model DHT11 ou DHT22

Instalando Dependências

Para usar os binários pré-construídos fornecidos, você precisará instalar as seguintes dependências:

 

 

sudo apt-get install clang libicu-dev libcurl4-nss-dev

 

 

Iniciando

SwiftyGPIO faça o Download da ultima versão compátivel com sua placa.

Veja a tabela: Build Swift On ARM prebuilt-binaries e baixe.

 

wget https://github.com/uraimo/buildSwiftOnARM/releases/download/4.2.3/swift-4.2.3-RPi23-RaspbianStretch.tgz

 

Descompacte os arquivos para uma pasta de sua escolha. Por exemplo:  /home/michel/swift-4.2.3/ após descompactar, execute um export path:

 

export PATH=/home/michel/swift-4.2.3/usr/bin:"${PATH}" 

 

Teste se está tudo certo com o combando: 

 

swift --version 

 

A saída no terminal de ve ser algo como isso:

 

Swift version 4.2.3 (swift-4.2.3-RELEASE) 
Target: armv7-unknown-linux-gnueabihf

 

 

Clone e rode o projeto

 

$ git clone https://github.com/micheltlutz/DHT-SwiftyGPIO 
$ cd DHT-SwiftyGPIO
$ swift run  Waiting output should be like this: 
Temperatura: 25.0 Umidate: 41.0

 

Arquivos de referência

O DHT.swift foi baseado no projeto dhtxx Mas com modificações.

A DHT class init permite selecionar o sensor e o tipo de conversão de dados que por padrão é Celcius.

 

Enums Types

 

swift public enum SupportedSensor { 
    case dht11, dht22 
} 

public enum ConversionType { 
    case Fahrenheit, Celsius 
} 


init(pin: GPIO, for sensor: SupportedSensor, conversion: ConversionType = .Celsius) { } 

... 


Exemplo criando objeto para um módulo DHT11

 

let dht = DHT(pin: gpios[.P4]!, for: .dht11) 

 

Problemas conhecidos

 

Erros de leitura iniciais ocorrem devido a falha de pulso inicial. Normalmente você terá boa leitura nos 60 segundos após rodar o programa
 
Veja o projeto no GitHub DHT-SwiftyGPIO
 
 
 
 
Espero que este projeto ajude a começar com a criação de projetos de IoT com o Swift

 

 

Raspberry Pi DHT-SwiftyGPIO

10 de March de 2019

Using Swift to display temperature and humidity of a DHT11 module

Requirements

Raspberry Pi 2+ or Raspberry Pi 3 Model B Model DHT11 or DHT22

Installing Dependencies

To use the provided prebuilt binaries you'll need the install the following dependencies:

 

 

sudo apt-get install clang libicu-dev libcurl4-nss-dev

 

 

Starting

SwiftyGPIO Download last version swift ARM compatible with your board.

See table: Build Swift On ARM prebuilt-binaries and Download

 

wget https://github.com/uraimo/buildSwiftOnARM/releases/download/4.2.3/swift-4.2.3-RPi23-RaspbianStretch.tgz

 

Unzip the files to a folder of your choice: For example: /home/michel/swift-4.2.3/ After unzip, export path:

 

export PATH=/home/michel/swift-4.2.3/usr/bin:"${PATH}" 

 

Test if everything went right run command:

 

swift --version 

 

And the output should be like this:

 

Swift version 4.2.3 (swift-4.2.3-RELEASE) Target: armv7-unknown-linux-gnueabihf

 

 

Clone and run project

 

$ git clone https://github.com/micheltlutz/DHT-SwiftyGPIO 
$ cd DHT-SwiftyGPIO
$ swift run  Waiting output should be like this: 
Temperatura: 25.0 Umidate: 41.0

 

Reference files

The DHT.swift was based on the project dhtxx But with modifications

DHT class init allows you to select the sensor type and data conversion by default is used Celcius

 

Enums Types

 

swift public enum SupportedSensor { 
    case dht11, dht22 
} 

public enum ConversionType { 
    case Fahrenheit, Celsius 
} 


init(pin: GPIO, for sensor: SupportedSensor, conversion: ConversionType = .Celsius) { } 

... 


Example create module DHT11 Object

 

let dht = DHT(pin: gpios[.P4]!, for: .dht11) 

 

Issues

 

Initial read errors occur due to initial pulse failure  Usually get a good reading within the past 60s.

See the project on Github DHT-SwiftyGPIO

 

 

I hope this project helps start with the creation of IoT projects with Swift

 

 

Vapor 3: Reutilizando o model de backend para o seu app

08 de December de 2018

 

Estou transpondo o tutorial para o blog enquanto isso apreie os slides =D

 

 

 

https://www.slideshare.net/michelboss/vapor-3-reutilizando-o-model-de-backend-para-o-seu-app-125505201

 

 

 

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