Como publicar cardápio no Consumer

Imagem 25

Imagem 25

Imagem 24

Imagem 24

Imagem 23

Imagem 23

Imagem 22

Imagem 22

Imagem 21

Imagem 21

Imagem 20

Imagem 20

Imagem 19

Imagem 19

Imagem 18

Imagem 18

Imagem 17

Imagem 17

Imagem 16

Imagem 16

Imagem 15

Imagem 15

Imagem 14

Imagem 14

Imagem 13

Imagem 13

Imagem 12

Imagem 12

Imagem 11

Imagem 11

Imagem 10

Imagem 10

Imagem 9

Imagem 9

Imagem 8

Imagem 8

Imagem 7

Imagem 7

Imagem 6

Imagem 6

Imagem 5

Imagem 5

Imagem 4

Imagem 4

Imagem 3

Imagem 3

Imagem 2

Imagem 2

Imagem 1

Imagem 1

Envio Mensagem pedido

Envio mensagem pedido

Imagem 11

Imagem 11

Imagem 10

Imagem 10

Imagem 9

Imagem 9

Imagem 8

Imagem 8

Imagem 7

Imagem 7

Imagem 6

Imagem 6

Imagem 5

Imagem 5

Imagem 4

Imagem 4

Imagem 3

Imagem 3

Imagem 2

Imagem 2

Imagem 1

Imagem 1

pedido no zap

pedido no zap

Autorizar acesso ao Computador

Autorizar acesso ao Computador

 

Licenças Mikrotik

Para que serve a licença Level 4?

Em equipamentos wireless que possui a Level 3: Para habilitar o modo AP bridge (vários clientes wireless conectados simultaneamente).

Em ambiente virtual: Para licenciar o roteador virtual (CHR) com limite de 1Gbps por interface virtual.

Em servidores físicos: Licenciar para até 200 clientes PPPoE e 200 clientes Hotspot.

Para que serve a licença Level 5?

Em ambiente virtual: Para licenciar o roteador virtual (CHR) com limite de 10Gbps por interface virtual.

Em servidores físicos: Licenciar para até 500 clientes PPPoE e 200 clientes Hotspot.

Para que serve a licença Level 6?

Em ambiente virtual: Para licenciar o roteador virtual (CHR) sem limite de banda nas interfaces (o limite estará no hardware utlizado).

Em servidores físicos: Licenciar o servidor com todos os recursos de forma ilimitada (o limite estará no hardware utlizado).

Link para adquirir as licenças: http://bit.ly/Licencas

Contatos:
Site: http://www.redesbrasil.com
Email: contato@redesbrasil.com
Telefone: (64) 3416-2345
WhatsApp no link: http://bit.ly/Whats-Redes-Brasil
Skype: treinamentos.redesbrasil

Matriz de confusão

No campo de aprendizado de máquina e, especificamente, no problema de classificação estatística , uma matriz de confusão , também conhecida como matriz de erros, [6] é um layout de tabela específico que permite a visualização do desempenho de um algoritmo, tipicamente um aprendizado supervisionado (em aprendizado não supervisionado , geralmente é chamado de matriz correspondente ). Cada linha da matriz representa as instâncias em uma classe prevista, enquanto cada coluna representa as instâncias em uma classe real (ou vice-versa). [2] O nome deriva do fato de que é fácil ver se o sistema está confundindo duas classes (ou seja, geralmente classificando incorretamente uma como outra).

É um tipo especial de tabela de contingência , com duas dimensões (“real” e “previsto”) e conjuntos idênticos de “classes” em ambas as dimensões (cada combinação de dimensão e classe é uma variável na tabela de contingência).

Exemplo

Se um sistema de classificação foi treinado para distinguir entre cães e gatos, uma matriz de confusão resumirá os resultados do teste do algoritmo para uma inspeção mais aprofundada. Supondo que uma amostra de 13 animais – 8 gatos e 5 cães – a matriz de confusão resultante possa se parecer com a tabela abaixo:

Classe real
Gato Cachorro
Classe prevista
Gato 5 2
Cachorro 3 3

Nesta matriz de confusão, dos 8 gatos reais, o sistema previu que três eram cães, e dos cinco cães, previu que dois eram gatos. Todas as previsões corretas estão localizadas na diagonal da tabela (destacadas em negrito), portanto é fácil inspecionar visualmente a tabela quanto a erros de previsão, pois eles serão representados por valores fora da diagonal.

Tabela de confusão 

Na análise preditiva , uma tabela de confusão (às vezes também chamada de matriz de confusão ) é uma tabela com duas linhas e duas colunas que relata o número de falsos positivos , falsos negativos , verdadeiros positivos e verdadeiros negativos. Isso permite uma análise mais detalhada do que a mera proporção de classificações corretas (precisão). A precisão não é uma métrica confiável para o desempenho real de um classificador, porque produzirá resultados enganosos se o conjunto de dados for desequilibrado (ou seja, quando o número de observações em diferentes classes varia muito). Por exemplo, se houvesse 95 gatos e apenas 5 cães nos dados, um classificador específico poderia classificar todas as observações como gatos. A precisão geral seria de 95%, mas com mais detalhes o classificador teria uma taxa de reconhecimento de 100% ( sensibilidade ) para a classe de gatos, mas uma taxa de reconhecimento de 0% para a classe de cães. A pontuação F1 é ainda mais confiável nesses casos, e aqui renderia mais de 97,4%, enquanto a informação remove esse viés e gera 0 como a probabilidade de uma decisão informada para qualquer forma de adivinhação (aqui, sempre adivinhando o gato).

De acordo com Davide Chicco e Giuseppe Jurman, a métrica mais informativa para avaliar uma matriz de confusão é o coeficiente de correlação de Matthews (MCC) [5] .

Assumindo a matriz de confusão acima, sua tabela de confusão correspondente, para a classe cat, seria:

Classe real
Gato Não gato
Classe prevista
Gato 5 verdadeiros positivos 2 falsos positivos
Não gato 3 negativos falsos 3 verdadeiros negativos

A tabela final de confusão conteria os valores médios para todas as classes combinadas.

Vamos definir um experimento a partir de instâncias P positivas e N negativas para alguma condição. Os quatro resultados podem ser formulados em uma matriz de confusão 2 × 2 , da seguinte maneira:

Condição verdadeira
População total Condição positiva Condição negativa Prevalência Σ Condição positiva/population População total Precisão (ACC) = Σ Verdadeiro positivo + Σ Verdadeiro negativo/Σ População total

Condição prevista
Condição prevista
positiva
Verdadeiro positivo Falso positivo ,
erro tipo I
Valor preditivo positivo (VPP), Precisão = Σ Verdadeiro positivo/Σ Condição prevista positiva Taxa de descoberta falsa (FDR) = Σ Falso positivo/condition Condição prevista positiva
Condição prevista
negativa
Falso negativo ,
erro tipo II
Verdadeiro negativo Taxa de falsa omissão (FOR) = Σ Falso negativo/Σ Condição prevista negativa Valor preditivo negativo (VPN) = negative Verdadeiro negativo/Σ Condição prevista negativa
Taxa positiva verdadeira (TPR), Rechamada , Sensibilidade , probabilidade de detecção, Potência Σ Verdadeiro positivo/Σ Condição positiva Taxa de falso positivo (FPR), Fallout , probabilidade de alarme falso Σ Falso positivo/Σ Condição negativa Razão de verossimilhança positiva (LR +) TPR/FPR Odds ratio diagnóstico (DOR) LR +/LR− 1 pontuação = 2 · Precisão · Recuperação/Precisão + Recuperação
Taxa de falsos negativos (FNR), taxa de faltas = Σ Falso negativo/Σ Condição positiva Especificidade (RCM), Seletividade, Taxa negativa verdadeira (TNR) Σ Verdadeira negativa/Σ Condição negativa Razão de verossimilhança negativa (LR−) FNR/TNR

Referências

  1. ^ Fawcett, Tom (2006). “Uma introdução à análise ROC” (PDF) . Cartas de reconhecimento de padrão . 27 (8): 861–874. doi : 10.1016 / j.patrec.2005.10.010 .
  2. Salte para:b Poderes, David MW (2011). “Avaliação: da precisão, rechamada e medida F ao ROC, informação, marcação e correlação” (PDF) . Jornal de Tecnologias de Aprendizado de Máquina . 2 (1): 37-63.
  3. ^ Ting, Kai Ming (2011). Enciclopédia de aprendizado de máquina . Springer. ISBN978-0-387-30164-8.
  4. ^ Brooks, Harold; Castanho, Barb; Ebert, Beth; Ferro, Chris; Jolliffe, Ian; Koh, Tieh-Yong; Roebber, Paul; Stephenson, David (26-01- 2015). “Grupo de Trabalho Conjunto WWRP / WGNE sobre Pesquisa de Verificação de Previsão” . Colaboração para a pesquisa australiana sobre clima e clima . Organização Meteorológica Mundial . Recuperado em 17/07/2019 .
  5. Salte para:b Chicco D, Jurman G (janeiro de 2020). “As vantagens do coeficiente de correlação de Matthews (MCC) sobre o escore F1 e a precisão na avaliação da classificação binária” . BMC Genomics . 21 (6) doi : 10.1186 / s12864-019-6413-7 . PMC 6941312 . PMID 31898477 .
  6. ^ Stehman, Stephen V. (1997). “Seleção e interpretação de medidas de precisão de classificação temática”. Sensoriamento Remoto do Ambiente . 62 (1): 77-89. doi : 10.1016 / S0034-4257 (97) 00083-7 .

Fonte: https://en.wikipedia.org/wiki/Confusion_matrix

Design Responsivo para Flutter: Introdução

Às vezes, a configuração muda para um aplicativo em um dispositivo móvel. Talvez um teclado apareça de repente ou o usuário gire o dispositivo. Ou talvez você queira exibir seu aplicativo em dispositivos pequenos e grandes.

De qualquer forma, seu aplicativo precisa responder a essas alterações de layout. Se você usar o Design Responsivo , ele usará.

Neste tutorial do Flutter, você:

  • Crie um aplicativo de bate-papo no Flutter que responda às alterações no layout.
  • Aprenda a usar de vibração MediaQueryLayoutBuilderOrientationBuilderFittedBoxAspectRatiowidgets.
  • Aprenda a lidar com mudanças de orientação.
  • Realize redimensionamento de texto.
  • Restrinja um widget filho em uma coluna.
  • Aprenda sobre a ideia do CustomMultiChildLayoutwidget.
Nota : Este tutorial supõe que você já esteja familiarizado com o básico do desenvolvimento do Flutter. Se você é novo no Flutter, leia o  tutorial Introdução ao Flutter . Você também deve ter conhecimento do uso do Android Studio com Flutter.

O que é Design Responsivo?

O conceito de Design Responsivo tem tudo a ver com o uso de um conjunto de códigos que respondem a várias alterações no layout. Plataformas como os SDKs nativos do iOS e Android resolveram esse problema com “layouts universais”. Os layouts universais respondem a alterações de layout usando restrições e redimensionando elementos automaticamente.

Existem várias razões pelas quais o layout precisa mudar responsavelmente dos desenhos iniciais.

Manipulação de diferentes tipos de dispositivos e tamanhos de tela

Layouts responsivos

Seu aplicativo Flutter pode ser executado em um telefone, tablet, tela de TV ou (quando eles começam a suportá-lo) assistir. Mesmo na categoria de telefones, há uma grande variedade de resoluções e tamanhos de tela diferentes. Você precisa garantir que o layout funcione conforme o planejado para cada tipo de dispositivo e tamanho de tela. Além disso, você pode ter layouts diferentes para cada tipo de dispositivo e tamanho de tela.

Com isso em mente, o Flutter fornece vários widgets e classes para o design responsivo. Você aprenderá sobre alguns deles neste tutorial.

Manipulando Alterações de Estado do Teclado

Sua interface pode ter campos de texto. O teclado aparece quando o usuário começa a interagir com esses campos. Quando esse teclado é exibido, também ocorrem problemas de layout.

O Android lida com isso com alterações na configuração do teclado. O iOS usa notificações internas para alterações de estado do teclado. Mas no Flutter, a Scaffoldclasse lida automaticamente com as alterações de estado do teclado.

Em detalhes, Scaffoldajusta as inserções inferiores para liberar espaço para o teclado. No entanto, você pode desativar esse comportamento definindo a resizeToAvoidBottomInsetpropriedade como false.

Você pode ler mais sobre Scaffolda interação do teclado aqui .

Como lidar com alterações de orientação

Vamos ser sinceros, os usuários podem girar o dispositivo e o fazem com frequência. Você pode desativar a resposta a isso no seu aplicativo, bloqueando-o no modo retrato ou paisagem, mas seu aplicativo não seria tão divertido e poderá ser menos útil em relação à experiência do usuário.

Quando a rotação ocorre no Flutter, MediaQuerypode ajudar a reconstruir seu layout. MaterialAppWidgetsAppjá use MediaQuery. Se você usá-los, o Flutter recria seus widgets em MaterialAppse a orientação mudar.

Você pode ler mais sobre MediaQuery aqui .

Agora que você entende os motivos do Design responsivo, é hora de ver o que os widgets do Flutter podem fazer para ajudar.

Começando

Faça o download do projeto inicial clicando no botão Download de materiais na parte superior ou inferior do tutorial. Em seguida, abra o projeto inicial no Android Studio 3.4 ou posterior. Você também pode usar o VS Code, mas precisará adaptar as instruções abaixo, conforme necessário.

Você deve usar uma versão recente do Flutter, 1.5 ou superior. Certifique-se de obter dependências do Flutter para o projeto, se solicitado pelo Android Studio com a mensagem ‘Packages get’ não foi executada .

Você encontrará que o projeto inicial fornece algumas partes do aplicativo de bate-papo com as quais você trabalhará.

Usando o MediaQuery para decidir o layout

Agora você deve tentar usar MediaQuerypara determinar o layout. Essa é apenas uma das opções que você pode usar para responder às alterações de layout. Você poderá usar as outras opções nas próximas seções.

Vá para o arquivo ChatListPage.dart na pasta lib . Substitua o conteúdo de build(BuildContext context)por:

// 1 
var hasDetailPage =
    MediaQuery.of (context) .orientation == Orientation.landscape;
// 2
Filho Widget;

if (hasDetailPage) {
   // 3
  filho = linha (
    crianças: [
      // 4
      SizedBox (
        largura: 250 ,
        altura: infinito duplo ,
        filho: _buildList (contexto, hasDetailPage),
      ),
      // 5
      Expandido (filho: _buildChat (context, selectedIndex)),
    ],
  );
} mais {
   // 6
  filho = _buildList (contexto, hasDetailPage);
}

andaime de retorno (
  appBar: AppBar (
    title: Text ( "Bate-papo" ),
  ),
  body: SafeArea (
    // 7
    criança: criança,
  ),
);

Com isso, você cria a página de bate-papo usando  MediaQuery. Aqui está o que você fez:

  1. Primeiro, você verifica a orientação de MediaQuery. Se for paisagem, você tem uma página de detalhes.
  2. Segundo, você declara um widget filho para uso posterior.
  3. Em seguida, se você tiver uma página de detalhes, declara o filho como uma linha de widgets.
  4. Para isso, a linha contém a lista de bate-papos como um primeiro item.
  5. Em seguida, o próximo item da linha é a página de bate-papo que mostra a conversa.
  6. Se você não tiver uma página de detalhes, a criança será a lista de bate-papos.
  7. Por fim, você precisa atribuir o widget filho que você criou como filho SafeArea.

Crie e execute o projeto – você deve ver uma tela como esta para retrato:

Retrato da lista de bate-papo

E isso para a paisagem:

Lista de bate-papo com paisagem detalhada

Você notará que o layout é diferente para retrato e paisagem. Você também pode tentar executá-lo em um dispositivo diferente, como um tablet.

Usando widgets no design responsivo

Como mencionado anteriormente, existem outros widgets que atingem o mesmo efeito que MediaQuery. Por exemplo, LayoutBuilderpermite que você faça a mesma coisa. Você verá isso nesta seção.

Além disso, existem outros problemas de layout com o aplicativo de bate-papo. Por exemplo, o tamanho do texto no avatar do usuário não é dimensionado. Você vai consertar isso daqui a pouco.

Usando LayoutBuilder e OrientationBuilder

LayoutBuilderOrientationBuildersão alternativas MediaQuerypara lidar com mudanças de orientação. Hora de ver exatamente como eles funcionam, começando com LayoutBuilder.

Primeiro, abra o ChatListPage.dart , como você fez na seção anterior. Substitua o conteúdo de build(...)por:

andaime de retorno (
  appBar: AppBar (
    title: Text ( "Bate-papo" ),
  ),
  body: SafeArea (
    // 1
    filho: LayoutBuilder (construtor: (construtor, restrições) {
      // 2 
      var hasDetailPage = constraints.maxWidth> 600 ;

      if (hasDetailPage) {
         // 3 
        retorna Row (
          crianças: [
            // 4
            SizedBox (
              largura: 250 ,
              altura: infinito duplo ,
              filho: _buildList (contexto, hasDetailPage),
            ),
            // 5
            Expandido (filho: _buildChat (context, selectedIndex)),
          ],
        );
      } else {
         // 6 
        return _buildList (context, hasDetailPage);
      }
    }),
  ),
);

Com isso, você cria a página de bate-papo novamente, desta vez usando LayoutBuilder. Aqui está o que você fez:

  1. Primeiro, você declara a LayoutBuildercomo filho de SafeArea.
  2. Segundo, você determina se possui uma página de detalhes usando a largura máxima do widget pai. Se for maior que 600, você terá uma página de detalhes.
  3. Em seguida, se você tiver uma página de detalhes, declara filho como uma linha de widgets.
  4. Para isso, a linha contém a lista de bate-papos como um primeiro item.
  5. Em seguida, o próximo item da linha é a página de bate-papo que mostra a conversa.
  6. Por fim, se você não tiver uma página de detalhes, será a lista de bate-papos.

Crie e execute o projeto. Você deve ver a mesma tela nas diferentes orientações da seção anterior.

Se você também quiser tentar OrientationBuilder, substitua as linhas por LayoutBuildere a configuração de hasDetailPagepor:

filho: OrientationBuilder (construtor: (construtor, orientação) {  
   var hasDetailPage = guidance == Orientation.landscape;

Essa pequena alteração tem o mesmo efeito. Em vez de ler a largura do widget pai, você lê a orientação do widget pai no construtor. Se a orientação for paisagem, você terá uma página de detalhes.

Crie e execute o projeto. Você deve ver as mesmas telas de antes. Como você pode ver, cada um desses vários widgets pode resolver o problema de diferentes orientações e tamanhos de tela.

Em seguida, você corrigirá o texto que não está sendo redimensionado no avatar do usuário.

Redimensionamento automático de texto com base no tamanho do widget pai

Como você pode ver na captura de tela da paisagem acima, o texto nas caixas coloridas do usuário não está sendo redimensionado corretamente para preencher a caixa. Você não pode simplesmente aumentar o tamanho da fonte, pois pode passar por cima da caixa. A maneira correta de fazer isso é permitir que o widget seja dimensionado de acordo com o tamanho do widget pai.

O widget Flutter FittedBoxpode resolver esse problema.

Usando FittedBox

Abra AvatarImageView.dart em lib / widgets e verifique o conteúdo de _buildContent(Color textColor). Você pode ver aqui um Textwidget que renderiza as iniciais do usuário. O tamanho da fonte é 14. Coloque o Textwidget FittedBoxcomo abaixo:

// 1 
retorno FittedBox (
   // 2
  fit: BoxFit.contain,
  // 3
  filho: texto (
    iniciais,
    style: TextStyle (cor: textColor, fontSize: 14 ),
  ),
);

Isso faz com que o Textwidget preencha o widget pai e siga as BoxFit.containregras. Passando por cada linha:

  1. Primeiro, você declara a FittedBoxcomo pai do Textwidget.
  2. Segundo, você usa o BoxFit.containajuste para aumentar o tamanho possível sem sair da caixa de widgets.
  3. Por fim, você declara o Textwidget original como filho.

Crie e execute o projeto. Você verá o seguinte na orientação paisagem:

Texto redimensionado em paisagem

Agora você vê que o texto foi redimensionado de acordo. Em geral, você pode usar outros tipos de BoxFit. Você pode ver como cada um deles se comporta na imagem abaixo:

Opções BoxFit

Fornecendo restrições às crianças

Há um botão de anexo de imagem de clipe de papel no seu aplicativo de bate-papo. Isso deve permitir que você selecione imagens de uma galeria. Geralmente, você deseja exibi-lo na visualização de bate-papo para poder continuar vendo a conversa enquanto escolhe uma imagem.

No momento, isso não está sendo exibido. Clique no botão anexar e você verá apenas o seguinte para retrato:

Galeria no retrato inicial

e isso para paisagem:

Galeria na paisagem inicial

Usando o AspectRatio

Você precisa consertar a galeria quebrada. Primeiro, abra o arquivo ConversationPage.dart na pasta lib . Em seguida, procure a linha SquareGallery()com um TODO .

Esse widget não está aparecendo porque é filho Columne não possui informações suficientes para determinar sua própria altura. Portanto, envolva-o em um  AspectRatiowidget para fornecer restrições. Substitua a SquareGallery()linha pelo seguinte:

Proporção da tela(
  aspectRatio: 3 ,
  filho: SquareGallery (),
),

Agora que a galeria está envolvida AspectRatio, ela terá uma restrição que tenta seguir a proporção fornecida. Será três vezes mais largo do que alto. Além disso, AspectRatiotentará encontrar restrições que se encaixem no que você forneceu como proporção, bem como nas restrições pai.

No entanto, se não encontrar essa restrição, fornecerá uma que segue apenas a proporção que você forneceu. Nesse caso, o widget pode estourar.

Crie e execute o projeto. Ao clicar no botão de anexo da imagem, você verá uma tela como esta para retrato:

Retrato final da galeria

e isso para paisagem:

Galeria paisagem final

Parabéns! Agora você corrigiu os problemas de layout no aplicativo. Você pode finalmente responder novamente nos chats! :]

CustomMultiChildLayout

Além dos widgets básicos para o design responsivo, o Flutter também fornece uma maneira de criar widgets por conta própria CustomMultiChildLayout. Agora você verá como usá-lo, mas apenas na teoria. Por CustomMultiChildLayoutser um tópico tão grande, você verá apenas o básico aqui.

Confira o snippet de código abaixo:

CustomMultiChildLayout (
  delegar: delegar,
  filhos: widgets,
)

Aqui você declara um CustomMultiChildLayoutcom um delegado personalizado. O delegado pode ser um objeto de uma classe como o seguinte:

// 1 
classe  RWDelegate  estende  MultiChildLayoutDelegate  {
   // 2 
  @override 
  void performLayout (tamanho do tamanho) {
     // Faça seu layout aqui
  }

  // 3 
  @override 
  bool shouldRelayout (MultiChildLayoutDelegate oldDelegate) => false ;
}

Aqui está o que você fez:

  1. Primeiro, você declara uma subclasse de MultiChildLayoutDelegate.
  2. Segundo, você substitui o performLayoutmétodo. Aqui você precisa fazer o layout dos widgets filhos usando os métodos layoutChildpositionChild.
  3. Por fim, você retorna um booleano de shouldRelayoutse o widget deve executar um layout novamente. Este método deve decidir com base nos parâmetros ou estado do seu próprio widget.

Você pode ler a documentação completa deste widget aqui e do delegado  aqui . Procure um tutorial completo CustomMultiChildLayoutem nossa página Flutter em breve!

Para onde ir a partir daqui?

Você pode baixar o projeto concluído clicando no botão Download de materiais na parte superior ou inferior do tutorial.

Se você estiver interessado, consulte os documentos oficiais dos aplicativos responsivos no Flutter  aqui  e o livro de receitas oficial do design  aqui .

Também existem bons guias sobre como desenvolver aplicativos para vários tamanhos de tela e orientações aqui e aqui .

A equipe do Flutter também fez uma apresentação no Google I / O 2019 sobre UIs adaptáveis ​​no Flutter. Você pode assistir aqui .

Você também pode querer ler sobre as configurações de acessibilidade de texto em cada plataforma.

Espero que você tenha gostado deste tutorial sobre Design Responsivo com Flutter! Se você tiver alguma dúvida ou comentário, participe da discussão no fórum abaixo.

Fonte: https://www.raywenderlich.com/4324124-responsive-design-for-flutter-getting-started

Como usar triggers Cloud Functions para o Firestore

Ferramentas utilizadas: 

Back end: Firebase Cloud Functions – Versão: 3.0.0

Neste tutorial, exploraremos o Firebase Cloud Functions para executar o código nos servidores Firebase.

Uma das principais dificuldades ao trabalhar com a autenticação baseada em funções é permitir que os usuários administrativos criem ou convidem pessoas para sua equipe.

Se você usar a conta de administrador para criar o novo usuário, o Firebase efetuará logout e login com a nova conta.

Para corrigir isso, usaremos o Firebase Cloud Functions. A ideia é que, em vez de criar a conta, nosso usuário administrador possa armazenar as informações desejadas no banco de dados.

O Cloud Functions lê o banco de dados e, com essas informações, cria a nova conta de usuário e armazena o perfil do usuário no banco de dados.

Configurando funções da nuvem

Se você ainda não ouviu falar sobre o Cloud Functions, o TL; DR é que são funções executadas nos servidores do Firebase.

Você cria a função, carrega-a, ela é executada. O Google cuida de dimensionamento automático, segurança e muito mais para você.

Para começar, a primeira coisa que você precisa fazer é instalar a Firebase CLI, para fazer isso, abra seu terminal e digite:

npm install -g firebase-tools

Depois de instalado, vá em frente e use a CLI para fazer login no Firebase Console com:

firebase login

Ele abrirá uma janela do navegador para você efetuar login. Por fim, vá para a pasta em que você tem seu projeto e inicialize o Cloud Functions com:

firebase init functions

Ele fará algumas perguntas, como selecionar se você deseja usar o TypeScript ou JavaScript, escolher o projeto que será associado ao seu console etc.

Escolha TypeScript, e ele fornecerá o TSLint e ajudará a detectar erros antes que eles aconteçam 🙂

Uma vez feito, ele gerará uma pasta chamada functions, dentro, você encontrará alguns arquivos de configuração, como package.jsonindex.tsarquivo onde escreveremos nossas funções.

Abra o index.tsarquivo e verifique se está dentro:

import * as functions from 'firebase-functions';
import * as admin from 'firebase-admin';

import { UserRecord } from 'firebase-functions/lib/providers/auth';
admin.initializeApp();

OBSERVAÇÃO: a inicialização do administrador provavelmente não estará lá; adicione-o você mesmo.

Estamos dizendo às nossas funções da nuvem que queremos usar as funções SDK e o SDK de administrador. Em seguida, estamos usando o SDK de administrador para inicializar nosso aplicativo.

UserRecordobjeto será usado estritamente para fins de digitação, para garantir que nosso projeto use tipos apropriados.

Agora é hora de criar nossa função, mas primeiro, vamos examinar o que precisamos, a função precisa:

  • Leia o Firestore para saber quando adicionamos um novo usuário.
  • Obtenha as informações do usuário.
  • Crie a conta do usuário.
  • Armazene os dados do usuário dentro de uma coleção de perfis de usuário.

Com isso em mente, vamos criar nossa função e realizar o primeiro passo, lendo o Firestore:

exports.createTeamMember = functions.firestore
  .document(`teamProfile/{teamId}/teamMemberList/{newUserId}`)
  .onCreate(async (snap, context) => {});

Estamos usando o functions.firestorepacote para ouvir o documento localizado em:

`teamProfile/{teamId}/teamMemberList/{newUserId}`

Observe que {teamId} e {newUserId} são curingas, portanto, o Functions escutará nesses caminhos dinamicamente, portanto, se você adicionar esses usuários:

`teamProfile/ATeam/teamMemberList/user1`
`teamProfile/BTeam/teamMemberList/user2`
`teamProfile/ATeam/teamMemberList/user3`
`teamProfile/BTeam/teamMemberList/user4`

As funções capturam todos eles. Agora que estamos ouvindo o banco de dados, extrairemos as informações que precisamos usar:

exports.createTeamMember = functions.firestore
  .document(`teamProfile/{teamId}/teamMemberList/{newUserId}`)
  .onCreate(async (snap, context) => {
    const id: string = snap.data().id;
    const email: string = snap.data().email;
    const teamId: string = snap.data().teamId;
  });

Estamos acessando as informações do event.dataEssas são as informações que armazenamos no banco de dados sobre esse usuário .)

Assim que tivermos as informações, o próximo passo seria criar a conta do usuário:

exports.createTeamMember = functions.firestore
  .document(`teamProfile/{teamId}/teamMemberList/{newUserId}`)
  .onCreate(async (snap, context) => {
    const id: string = snap.data().id;
    const email: string = snap.data().email;
    const teamId: string = snap.data().teamId;

    const newUser: UserRecord = await admin.auth().createUser({
      uid: id,
      email: email,
      password: '123456789'
    });
  });

Estamos usando o adminSDK para criar um novo usuário e estamos passando o uid, o emaile o passwordque queremos que o usuário tenha.

Quando tivermos isso, nossa próxima etapa é criar o documento para as informações de perfil deste usuário, para isso vamos usar o adminSDK novamente:

exports.createTeamMember = functions.firestore
  .document(`teamProfile/{teamId}/teamMemberList/{newUserId}`)
  .onCreate(async (snap, context) => {
    const id: string = snap.data().id;
    const email: string = snap.data().email;
    const teamId: string = snap.data().teamId;

    const newUser: UserRecord = await admin.auth().createUser({
      uid: id,
      email: email,
      password: '123456789'
    });

    await admin
      .firestore()
      .doc(`userProfile/${id}`)
      .set({
        email: email,
        id: id,
        teamId: teamId,
        teamAdmin: false
      });

    return newUser;
  });

Essa última função vai para a userProfilecoleção, depois vai um nível mais fundo no documento {userId} e armazena as informações lá.

Estamos dizendo ao Firestore que o usuário não é um administrador, o ID da equipe a que pertence e as informações pessoais do usuário ( email e ID ).

Nossa função está pronta para ser usada, então vá em frente e abra o terminal novamente dentro da pasta do seu projeto e digite:

firebase deploy --only functions

Ele implantará sua Função no Firebase, vá em frente e tente, você pode acessar seu aplicativo e usar a função adicionar usuário que criamos, verifique se a função está sendo acionada, que cria o usuário e cria o perfil no base de dados.

Fonte: https://javebratt.com/firestore-functions/#commento-login-box-container

Dados Raster

Dados rastermatriciais ou bitmap (que significa mapa de bits em inglês) são imagens que contêm a descrição de cada pixel, em oposição aos gráficos vetoriais.

O tratamento de imagens deste tipo requer ferramentas especializadas, geralmente utilizadas em fotografia, pois envolvem cálculos muito complexos, como interpolaçãoálgebra matricial, etc.

Um bitmap pode ser monocromático, em escala de cinza ou colorido. Normalmente os pixels são formados no padrão RGB, do inglês Red, Green, Blue, que utiliza três números inteiros para representar as cores vermelhoverde e azul ou RGBA, quando o formato possui transparência (sendo A o nível de alfa de cada pixel). Para mídias impressas as imagens bitmap ou raster utilizam o modo de cor CMYK (CianoMagentaAmarelo e Preto).

Necessidade de compactação

A cada ponto da imagem exibida na tela ou papel corresponde um pixel desta grade, de forma que a maioria das imagens requer um número muito grande de pixels para ser representada completamente. Por exemplo, uma imagem comum de 800 pixels de largura por 600 de altura necessita de 3 bytes para representar cada pixel (um para cada cor primária RGB) e mais 54 bytes de cabeçalho. Isso totaliza 1.440.054 bytes. Embora a representação de imagens na memória RAM seja feita geralmente em bitmaps, quando se fala em um grande número de imagens armazenadas em discos magnéticos e transmissão de dados via redes surge a necessidade de compressão desses arquivos, para reduzir o espaço ocupado e o tempo de transmissão.

compactação de dados pode ser com perda ou sem perda. Os principais formatos adotados para a compressão de dados na internet são o Compuserve GIF, o JFIF(conhecido por JPEG), e o mais atual e livre o PNG.

 

Fonte: https://pt.wikipedia.org/wiki/Raster

Certificação CTAL

Para participar de um exame do nível avançado, o ISTQB determina que os candidatos possuam experiência prática na área. Assim, para ser considerado apto a realizar estes exames, é necessário que o candidato:

  1. Possua uma Certificação ISTQB Certified Tester, Foundation Level (CTFL) ou seu similar emitido pelo ISEB.
  2. Comprove suas experiências em período integral (8hs diárias) em pelo menos um dos itens abaixo:
    • 2 anos de experiência prática em Teste de Software ou Qualidade em TI.
    • 2 anos dedicados à Pesquisa Acadêmica relacionadas à Qualidade de TI no nível de Pós Graduação, ou como instrutor de cursos ou disciplinas relacionadas à Qualidade de TI.
    • 3 anos de experiência prática em Desenvolvimento de Sistemas, Análise de Sistemas ou Engenharia de Software.

A Qualificação CTAL não expira, sendo necessário obtê-la apenas uma única vez para realizar qualquer exame do nível avançado.

Processo de Qualificação

1) Declaração

Para ser avaliado o candidato deve apresentar uma declaração das empresas ou instituições que atuou, comprovando seu tempo de serviço e as atividades exercidas na função ou cargo ocupado. O candidato deve apresentar um número suficiente de declarações que cubram os requisitos para a Qualificação. Por exemplo, caso o candidato tenha 1 ano e 6 meses na empresa A, e 6 meses na empresa B, ambas atuando em funções exercidas na área de teste de software, ele deve apresentar duas declarações (uma de cada empresa).

Esta declaração deve possuir 6 itens importantes (veja na imagem abaixo), onde na ausência de qualquer um, a qualificação será recusada em primeira análise, e o pagamento da taxa devolvido.

istqb

Declaracao-modelo

Declaracao-exemplo

Fonte:  https://www.bstqb.org.br/qualificacao

Como homologar sua Automação Comercial com o TEF PayGo?

Clique aqui para acessar o passo-a-passo da homologação do TEF PayGo. É simples, rápido e gratuito.

Para verificar a integração Android e Linux, entre em contato conosco por 0800 737 2255, dev@paygo.com.br ou preencha o formulário abaixo

 

Fonte: https://www.paygo.com.br/homologue-2/

CHECK-LIST DE HOMOLOGAÇÃO CF-e

HOMOLOGAÇÃO

1. PREPARAR AMBIENTE:

1.1 – Se certificar de que tanto a aplicação comercial quanto o integrador estejam fechados.

1.2 – Abrir o integrador

1.3 – Abrir a aplicação comercial pelo integrador

2. VERIFICAÇÃO DADOS POS:

2.1 – Cadastro de POS

Dados do POS:

ID: Valor fornecido pelo usuário, pode ser um número sequencial.

Serial do POS: No ambiente de produção, o valor inserido é o número de série do equipamento.

Descrição: Valor fornecido pelo usuário, pode ser uma forma de identificar o POS.

2.2 – VERIFICAÇÃO CHAVE DE ACESSO AO VALIDADOR.

Esse valor pode ser encontrado no manual do integrador fiscal, página 9. OBSERVAÇÃO: A chave de acesso ao validador é igual nos dois ambientes tanto na homologação quanto na produção.

Chave de acesso Validador: 25CFE38D-3B92-46C0-91CA-CFF751A82D3D

2.3 – VERIFICAÇÃO CHAVE DE REQUISIÇÃO

OBSERVAÇÃO: A chave de requisição é um código gerado a partir do CNPJ do contribuinte mais o CNPJ da adquirente.

3. TESTE DE VENDAS:

3.1 – Fazer uma venda a dinheiro

3.2 – Fazer uma nova venda (a venda deve ser finalizada com duas formas de pagamento, dinheiro e cartão).

3.3 – O AC deve solicitar COD DE AUT, NSU e BANDEIRA, antes de finalizar o cupom.

3.4 – Realizar uma venda com o integrador desligado – Nesse caso aplicação não deve emitir o cupom.

3.6 – Fazer uma nova venda a cartão, logo depois cancelá-la.

4. VERIFICAÇÃO DO BANCO DE DADOS

4.1 – Verificar no banco de dados as seguintes tabelas: ID_pagamentos e ID_respostafiscal

5. ENVIO DE DOCUMENTOS FISCAIS

5.1 – Enviar todos os XML’s gerados no momento da homologação para o e-mail: suporte.mfe@sefaz.ce.gov.br com o assunto “DADOS HOMOLOGAÇÃO + NOME SOFTWARE HOUSE”.

OBS: PARA SER FEITO A HOMOLOGAÇÃO É NECESSÁRIO A DISPONIBILIZAÇÃO DO APLICATIVO DE ACESSO REMOTO ACESEFA.

NO DIA DO AGENDAMENTO, ENTRAR EM CONTATO ATRAVÉS DOS SEGUINTES RAMAIS:

(85) 3108-0283

(85) 3108-0284

(85) 3108-0215

(85) 3108-0216

(85) 3108-0784

(85) 3108-0797

Caso tenha alguma dúvida enviar um e-mail para suporte.mfe@sefaz.ce.gov.br

 

Fonte:

https://www.projetoacbr.com.br/forum/topic/55266-roteiro-e-ou-manual-para-homologa%C3%A7%C3%A3o/

 

https://www.projetoacbr.com.br/forum/topic/51588-vpe-validador-de-pagamentos-eletr%C3%B4nicos-utilizando-o-integrador-fiscal-ce/

 

Linguagem Elixir

Elixir é uma linguagem dinâmica e funcional projetada para a criação de aplicativos escaláveis ​​e de manutenção.

O Elixir aproveita a Erlang VM, conhecida por executar sistemas de baixa latência, distribuídos e tolerantes a falhas, além de ser usada com sucesso no desenvolvimento da Web e no domínio de software incorporado.

Para saber mais sobre o Elixir, consulte nosso guia de introdução e nossa página de aprendizado para outros recursos . Ou continue lendo para obter uma visão geral da plataforma, idioma e ferramentas.

Recursos da plataforma

Escalabilidade

Todo o código Elixir é executado dentro de threads de execução leves (chamados processos) que são isolados e trocam informações por meio de mensagens:

current_process = self()

# Spawn an Elixir process (not an operating system one!)
spawn_link(fn ->
  send(current_process, {:msg, "hello world"})
end)

# Block until the message is received
receive do
  {:msg, contents} -> IO.puts(contents)
end

Devido à sua natureza leve, não é incomum ter centenas de milhares de processos em execução simultaneamente na mesma máquina. O isolamento permite que os processos sejam coletados de maneira independente, reduzindo as pausas em todo o sistema e usando todos os recursos da máquina da maneira mais eficiente possível (escala vertical).

Os processos também podem se comunicar com outros processos em execução em máquinas diferentes na mesma rede. Isso fornece a base para a distribuição, permitindo que os desenvolvedores coordenem o trabalho em vários nós (escala horizontal).

Tolerância ao erro

A verdade inevitável sobre o software em execução na produção é que as coisas vão dar errado . Ainda mais quando levamos em consideração a rede, os sistemas de arquivos e outros recursos de terceiros.

Para lidar com falhas, o Elixir fornece supervisores que descrevem como reiniciar partes do seu sistema quando as coisas dão errado, voltando a um estado inicial conhecido que é garantido que funcione:

children = [
  TCP.Pool,
  {TCP.Acceptor, port: 4040}
]

Supervisor.start_link(children, strategy: :one_for_one)

A combinação de escalabilidade, tolerância a falhas e programação orientada a eventos por meio da passagem de mensagens faz do Elixir uma excelente opção para arquitetura e programação reativa.

Caracteristicas do idioma

Programação funcional

A programação funcional promove um estilo de codificação que ajuda os desenvolvedores a escrever um código curto, conciso e sustentável. Por exemplo, a correspondência de padrões permite que os desenvolvedores destruam facilmente os dados e acessem seu conteúdo:

%User{name: name, age: age} = User.get("John Doe")
name #=> "John Doe"

Quando combinada com guardas, a correspondência de padrões nos permite combinar e declarar condições específicas para que algum código seja executado:

def drive(%User{age: age}) when age >= 16 do
  # Code that drives a car
end

drive(User.get("John Doe"))
#=> Fails if the user is under 16

O Elixir depende muito desses recursos para garantir que seu software esteja funcionando sob as restrições esperadas. E quando não estiver, não se preocupe, os supervisores estão de costas!

Extensibilidade e DSLs

O Elixir foi projetado para ser extensível, permitindo que os desenvolvedores estendam naturalmente a linguagem para domínios específicos, a fim de aumentar sua produtividade.

Como exemplo, vamos escrever um caso de teste simples usando a estrutura de teste do Elixir chamada ExUnit :

defmodule MathTest do
  use ExUnit.Case, async: true

  test "can add two numbers" do
    assert 1 + 1 == 2
  end
end

async: trueopção permite que tests sejam executados em paralelo, usando o maior número possível de núcleos de CPU, enquanto a assertfuncionalidade pode introspectar seu código, fornecendo ótimos relatórios em caso de falhas. Esses recursos são criados usando as macros do Elixir, possibilitando adicionar novas construções como se fizessem parte da própria linguagem.

Recursos de ferramentas

Um ecossistema em crescimento

O Elixir é fornecido com um ótimo conjunto de ferramentas para facilitar o desenvolvimento. O Mix é uma ferramenta de compilação que permite criar facilmente projetos, gerenciar tarefas, executar testes e muito mais:

$ mix new my_app
$ cd my_app
$ mix test
.

Finished in 0.04 seconds (0.04s on load, 0.00s on tests)
1 tests, 0 failures

O Mix também é capaz de gerenciar dependências e se integra ao gerenciador de pacotes Hex , que executa a resolução de dependências, busca pacotes remotos e hospeda documentação para todo o ecossistema.

Desenvolvimento interativo

Ferramentas como o IEx (shell interativo do Elixir) são capazes de alavancar muitos aspectos do idioma e da plataforma para fornecer ferramentas de depuração automáticas, recarga de código, recarga de código e documentação bem formatada:

$ iex
Interactive Elixir - press Ctrl+C to exit (type h() ENTER for help)
iex> h String.trim           # Prints the documentation for function
iex> i "Hello, World"        # Prints information about the given data type
iex> break! String.trim/1    # Sets a breakpoint in the String.trim/1 function
iex> recompile               # Recompiles the current project on the fly

Erlang compatível

O Elixir é executado na VM Erlang, oferecendo aos desenvolvedores acesso completo ao ecossistema da Erlang, usado por empresas como Heroku , WhatsApp , Klarna e muito mais para criar aplicativos distribuídos e tolerantes a falhas. Um programador Elixir pode chamar qualquer função Erlang sem custo de tempo de execução:

iex> :crypto.hash(:md5, "Using crypto from Erlang OTP")
<<192, 223, 75, 115, ...>>

Para saber mais sobre o Elixir, consulte o nosso guia de primeiros passos . Também temos documentação online disponível e um Crash Course para desenvolvedores de Erlang .

Fonte: https://elixir-lang.org/

Kit de laboratório doméstico de engenharia genética

 

 

 

Descrição do Produto

NOTA: A maneira como podemos oferecer este kit a um preço tão baixo é encontrando as melhores ofertas com nossos parceiros e fabricantes. Isso significa que este kit leva de 1 a 2 meses para ser enviado. Por favor, seja paciente e entenda que estamos fazendo o possível para chegar até você.

Consulte-nos sobre códigos de desconto para nossas aulas on-line com a compra deste kit.

Escolha nossa opção de plano de pagamento no check-out para fazer 4 pagamentos mensais.Veja mais informações aqui .

Este kit inicial do laboratório de bricolage fornece todo o equipamento, reagentes e materiais necessários para começar em biologia molecular e engenharia genética. Além disso, inclui um  kit de genotipagem e suprimentos do nosso  kit DIY CRISPR  para que você possa realizar seus primeiros experimentos! Vem com tutoriais explicando a ciência e como usar o equipamento.

Este kit vem com

  • Máquina de PCR com tampa aquecida
  • Tubos de PCR
  • Um conjunto de 3 novas pipetas de grau laboratorial
  • Pontas de pipeta para cada pipeta
  • Caixa de eletroforese em gel de agarose e molde de gel com pente
  • Rack de tubo
  • Uma fonte de alimentação para executar a eletroforese
  • 2 powerchords
  • Almofada de aquecimento com temperatura controlada para culturas em crescimento
  • 10g Agarose
  • 50g de mistura de tampão TAE (27g de base Tris / 23g de acetato de Tris / 0,5g de EDTA)
  • 5g de sulfato de canamicina
  • 5g de ampicilina de sódio
  • 40g de ágar LB
  • 20g LB Media
  • Manga de 20 placas de Petri
  • Balanças de 0,01g – 200g e balanças
  • Óculos trans-eye-luminator e luz azul
  • 5 x 15mL Tubes
  • 5 x tubos de 50 ml
  • bactérias ativadas por luz pDusk, pDawn
  • pJE202 bactérias brilhantes bioluminescentes geneticamente modificadas
  • 100uL Gel Verde Mancha 10.000x
  • 500uL 5x Taq Master Mix
  • Corante de carregamento de DNA de 200 uL
  • 100uL 100bp DNA Ladder
  • 100uL 1kbp DNA Ladder
  • Kit de Genotipagem
  • Suprimentos do  kit DIY CRISPR
  • Microcentrífuga 10k novíssima

https://www.the-odin.com/genetic-engineering-home-lab-kit/

Jython – A linguagem que mistura Java com Python

Essa linguagem une duas boas ferramentas numa só. 🐍

Introdução

Jython é uma implementação da linguagem Python que gera bytecode para máquinas Java (JVM – Java Virtual Machine). Com ela é possível fazer o desenvolvimento de aplicações híbridas que unem código em Java e Python.

Esta ferramenta é muito útil também para embutir uma linguagem para criação de scripts em aplicações que requerem este tipo de funcionalidade. Também inclui um compilador que converte código fonte Python em Java bytecode, permitindo que programadores Python possam escrever classes que possam ser utilizadas por um programa Java.

Entre suas vantagens, destacam-se:

  • 🐍 – Velocidade de desenvolvimento: Python é uma linguagem de desenvolvimento rápido (RAD – Rapid Application Development).
  • 🐍 – Praticidade: Não é necessário compilar o código Jython para testá-lo. Isto torna a depuração muito mais rápida. Depois de terminado o processo, utiliza-se o compilador Jythonc para compilar o programa, para incluir as bibliotecas do Jython existe a opção do freeze.
  • 🐍 – Tempo de aprendizado: Por ter uma sintaxe simples, limpa e coerente o seu aprendizado é muito fácil.

Instalação

Procedimento no Linux

  • 1. – Instale as dependências Primeiramente você precisará ter o instalados no seu sistema:
  • JDK – Ambiente de desenvolvimento para Java;
  • e o IcedTea – Um software de integração.

Use o gerenciador de pacotes da sua distribuição para instalá-los, exemplo, como instalei aqui no Gentoo:

sudo USE="-cups -alsa" emerge -a dev-java/openjdk-bin dev-java/openjdk-jre-bin

Nesse caso eu rejeitei os módulos: cups e alsa e o icedtea foi instalado automaticamente, pois é uma dependência.

Agora baixe o Jython no endereço: https://sourceforge.net/projects/jython/ . Após baixar extraia o pacote:

Antes crie e entre um diretório, para os arquivos não ficarem espalhados

mkdir ambiente && cd ambiente/
mv ../jython* .
jar xj jython.jar
java -jar jython_installer-*.jar

Após esse último comando, ele abrirá um wizard para você seguir, acompanhe as imagens abaixo:

Jython WizardJython WizardJython Wizard

Nessa 4º imagem ↓ parte você ainda poderia escolhe um diretório personalizado, exemplo de de ~/.config/jython, seria o mais ideal para não poluir sua pasta pessoal.Jython Wizard

Jython WizardJython WizardJython WizardJython WizardJython WizardJython Wizard

Após o finish agora vamos editar o seu vim ~/.bashrc e adicione a seguinte linha:

Nesse caso minha versão e nome do diretório é 2.5.2 , verifique a sua.

PATH="${PATH}:${HOME}/jython2.5.2/bin/"

Depois rode o comando source ~/.bashrc ou feche e abra o terminal para poder que o comando jython seja encontrado.

Criando sua primeira aplicação

Um mini aplicativo que efetua soma de dois números. Crie um arquivo como nome vim soma.py

import javax.swing as libswing 
pnumero = libswing.JOptionPane.showInputDialog("Digite um Numero Inteiro: ") 
snumero = libswing.JOptionPane.showInputDialog("Digite um Numero Inteiro: ") 
soma = int(pnumero) + int(snumero) 
libswing.JOptionPane.showMessageDialog(None, "A soma eh %d " % soma)

Salve e rode da seguinte maneira:

jython soma.py

No Shell irá aparecer as saídas do programa, mas não significa que é um problema, e sim que está enviando os outputs corretamente.

Jython WizardJython Wizard

Perceba que nesse caso eu somei 8 + 8 e o resultado foi o esperado. 😁️

Explicando o código

  • import javax.swing as libswing – Importa a biblioteca do Java.
  • pnumero = libswing.JOptionPane.showInputDialog("Digite um Numero Inteiro: ") – Mostra a primeira caixa de diálogo e armazena o valor na variável pnumero.
  • snumero = libswing.JOptionPane.showInputDialog("Digite um Numero Inteiro: ") – Mostra a segunda caixa de diálogo e armazena o valor na variável snumero.
  • soma = int(pnumero) + int(snumero) – Converte os valores de pnumero e snumero para inteiros e soma os dois armazenando o resultado na variável soma.
  • libswing.JOptionPane.showMessageDialog(None, "A soma eh %d " % soma) – Mostra na tela o resultado da soma, simples não é?

Conclusão

Eu particularmente curti o Jython 🙌️ e vou me aprofundar mais sobre ele e provavelmente haverá mais tutoriais aqui sobre o mesmo. E você ?! Curtiu ?! Conte-nos usando o campo de comentários . Abraços!

 

Fontehttps://terminalroot.com.br/2019/10/jython-a-linguagem-que-mistura-java-com-python.html?utm_source=dlvr.it&utm_medium=facebook

ProcMon e SysMon

Process Monitor é uma ferramenta avançada de monitoramento para Windows que mostra sistema de arquivos em tempo real, registro e atividade de processo / thread. Ele combina os recursos de dois utilitários herdados da Sysinternals, Filemon e Regmon , e adiciona uma extensa lista de aprimoramentos, incluindo filtragem rica e não destrutiva, propriedades abrangentes de eventos, como IDs de sessão e nomes de usuário, informações confiáveis do processo, informações de processo confiáveis, pilhas de threads completas com suporte integrado a símbolos para cada operação, registro simultâneo em um arquivo e muito mais. Seus recursos exclusivamente poderosos farão do Process Monitor um utilitário essencial no seu kit de ferramentas para solução de problemas e caça-malware do sistema.

Visão geral dos recursos do Monitor de processo

O Process Monitor inclui recursos avançados de monitoramento e filtragem, incluindo:

Mais dados capturados para os parâmetros de entrada e saída da operação

Filtros não destrutivos permitem que você defina filtros sem perder dados

A captura de pilhas de encadeamentos para cada operação possibilita, em muitos casos, identificar a causa raiz de uma operação

Captura confiável de detalhes do processo, incluindo caminho da imagem, linha de comando, ID do usuário e da sessão

Colunas configuráveis e móveis para qualquer propriedade de evento

Os filtros podem ser definidos para qualquer campo de dados, incluindo campos não configurados como colunas
A arquitetura avançada de log é escalada para dezenas de milhões de eventos capturados e gigabytes de dados de log

A ferramenta de árvore de processos mostra o relacionamento de todos os processos referenciados em um rastreio

O formato de log nativo preserva todos os dados para carregamento em uma instância diferente do Process Monitor
Dica de ferramenta de processo para fácil visualização das informações da imagem do processo

A dica de ferramenta Detalhes permite acesso conveniente a dados formatados que não cabem na coluna
Pesquisa cancelável
Registro de tempo de inicialização de todas as operações

A melhor maneira de se familiarizar com os recursos do Process Monitor é ler o arquivo de ajuda e, em seguida, visitar cada um dos itens e opções de menu em um sistema ativo.

SYSMON

O System Monitor ( Sysmon ) é um driver de serviço e dispositivo do sistema Windows que, uma vez instalado em um sistema, permanece residente nas reinicializações do sistema para monitorar e registrar a atividade do sistema no log de eventos do Windows. Ele fornece informações detalhadas sobre criações de processos, conexões de rede e alterações no tempo de criação do arquivo. Ao coletar os eventos que ele gera usando os agentes Windows Event Collection ou SIEM e, posteriormente, analisá-los, você pode identificar atividades maliciosas ou anômalas e entender como os invasores e malware operam na sua rede.

Observe que o Sysmon não fornece análise dos eventos que gera, nem tenta se proteger ou se esconder dos invasores.

Visão geral dos recursos do Sysmon
Sysmon inclui os seguintes recursos:

Registra a criação do processo com linha de comando completa para os processos atual e pai.
Registra o hash dos arquivos de imagem do processo usando SHA1 (o padrão), MD5, SHA256 ou IMPHASH.
Vários hashes podem ser usados ao mesmo tempo.
Inclui um GUID de processo em eventos de criação para permitir a correlação de eventos, mesmo quando o Windows reutiliza IDs de processo.
Inclua um GUID da sessão em cada evento para permitir a correlação de eventos na mesma sessão de logon.
Registra o carregamento de drivers ou DLLs com suas assinaturas e hashes.
Os logs são abertos para acesso bruto de leitura de discos e volumes
Opcionalmente, registra conexões de rede, incluindo o processo de origem de cada conexão, endereços IP, números de porta, nomes de host e nomes de porta.
Detecta alterações no tempo de criação do arquivo para entender quando um arquivo foi realmente criado. A modificação do registro de data e hora de criação de arquivo é uma técnica comumente usada por malware para cobrir suas faixas.
Recarregue automaticamente a configuração, se alterada no registro.
Filtragem de regras para incluir ou excluir determinados eventos dinamicamente.
Gera eventos desde o início do processo de inicialização para capturar atividades feitas por malware sofisticado no modo kernel.

LINKS

https://docs.microsoft.com/pt-br/sysinternals/downloads/sysmon

https://docs.microsoft.com/pt-br/sysinternals/downloads/procmon

Integração fiscal com equipamentos Bematech

Windows – SAT BEMATECH
http://bematechpartners.com.br/wp01/?page_id=308

Plataforma Fiscal Bematech
http://www.bematechpartners.com.br/wp01/upload-files/downloads/oneapi/DOCUMENTACAO_GERAL/help/APIOne.html#_o_que_é_a_a_apione

Integrando a Plataforma Fiscal através da APIOne.
http://www.bematechpartners.com.br/wp01/upload-files/downloads/oneapi/DOCUMENTACAO_GERAL/help/APIOne.html#_instalação_da_plataforma_fiscal_fiscal_manager

CENTRAL DE DOWNLOADS
http://bematechpartners.com.br/wp01/

Electron JS

 

 

Crie um aplicativo de desktop usando a tecnologia da Web (Javascript, HTML, CSS, Nodejs e mais), escrevendo o código javascript do zero usando o Electron.js como estrutura.

 

 

http://www.faztweb.com/curso/electron-primera-aplicaci%C3%B3n

https://github.com/FaztWeb/electron-products-test/blob/master/src/views/index.html

https://github.com/electron/electron-api-demos

 

http://photonkit.com/

 

 

 

 

Como instalar um servidor web no Raspberry Pi (Apache + PHP + MySQL)

Por que um Raspberry Pi como um servidor web?

Mas por que usar uma raspberry como um servidor web , em vez de usar provedores de serviços especializados em hospedagem na web?

Primeiro, do ponto de vista econômico, você deve saber que os serviços de hospedagem não são gratuitos e que você tem que pagar todos os meses / ano. Ao contrário do framboesa que só precisa de uma conexão . 
Além disso, escolhendo Raspberry, você tem a possibilidade de modificar seus serviços como você deseja (exemplos: o tamanho do disco, a hospedagem do banco de dados, etc.), que geralmente não é o caso de hosts especializados , que geralmente vendem compartilhada hospedagem com baixa capacidade de configuração . 
No entanto, para suportar mais usuários, você deve usar um Raspberry Pi 3 (o Pi 3 pode ser encontrado aqui ), o Raspberry Pi com 1 GB de RAM, em vez do Raspberry tipo B + (512 MB de RAM)

A questão que surge agora é, como fazer um servidor web no Raspeberry Pi ? Instalação do servidor Apache com Raspbian

O que é o Apache?

Primeiro, vamos instalar o Apache, que é o servidor web como tal . 
Quando falamos de um servidor web, geralmente pensamos na máquina, mas esse termo também se refere ao software que permite que a máquina analise solicitações de usuários (em formato http) e retorne o arquivo correspondente à solicitação (Ou um erro se o arquivo não for encontrado ou a consulta for formulada incorretamente). 
Como parte do Apache, é um software sobre o qual falamos .

No momento, o Apache é o servidor web mais utilizado , com cerca de 60% de participação de mercado. O Apache tem sua própria licença, usada por muitos outros projetos. Além disso, o uso maciço do Apache (que se tornou o padrão para servidores da Web), juntamente com sua alta popularidade, levou a uma tremenda abundância de documentação, cursos e outros livros relacionados ao seu uso, e sua segurança, como esta. livro .

Seja para o Raspberry Pi e o Raspbian, ou para uma máquina mais genérica, o Apache é, portanto, uma opção segura , e as habilidades que você poderá adquirir no assunto sempre serão úteis.

Instalação do Apache

Antes de instalar o servidor, verifique se temos uma máquina atualizada. Para fazer isso , devemos ter direitos de administrador , seja por causa do comando sudo.

sudo apt update

sudo apt upgrade

sudo apt update

Quando o Raspberry Pi estiver atualizado, instalaremos o servidor Apache.

sudo apt instalar apache2


A propósito, aproveitamos para dar direitos ao arquivo do apache
para que você possa gerenciar facilmente seus sites. 
Para fazer isso, execute os seguintes comandos:

sudo chown -R pi: www-data / var / www / html / 
chmod sudo-R 770 / var / www / html /

Verifique se o Apache está funcionando

Quando a instalação estiver concluída, podemos testar se o Apache está funcionando corretamente , indo para o endereço do Raspberry. 
Para fazer isso, é necessário tentar acessar o Raspberry a partir da porta 80 (essa porta não será aberta de fora, ela terá que fazer desde o próprio Raspberry). Não se preocupe, é muito fácil. Simplesmente abra o navegador da Web Raspberry e vá para “http://127.0.0.1”. Você deve então receber uma página com uma mensagem como “Funciona! “E muitos outros textos. 
Se você ainda não tem uma GUI no seu Raspbian ou usa o SSH para se conectar ao seu Raspberry, você pode usar o seguinte comando:

wget -O check_apache.html http://127.0.0.1

Este comando salvará o código HTML da página no arquivo “check_apache.html”no diretório atual. 
Então você só tem que ler o arquivo com o comando

cat ./check_apache.html

Se você vir marcado em um local no código “Funciona! É que o Apache está funcionando.

O Apache usa o diretório “/ var / www / html” como a raiz do seu site. Isso significa que quando você chama seu Raspberry na porta 80 (http), o Apache procura o arquivo em “/ var / www / html”. 
Por exemplo, se você chamar o endereço “http://127.0.0.1/example”, o Apache procurará o arquivo “exemplo” no diretório “/ var / www / html”. 
Para adicionar novos arquivos, sites, etc., você precisará adicioná-los a este diretório.

Agora você pode usar seu Raspberry para criar um site em HTML, CSS e JavaScriptinternamente. 
No entanto, você pode querer permitir rapidamente interações entre o site e o usuário . Por exemplo, para permitir que o usuário se registre, etc. Para isso, você precisará do PHP.

Instalação do PHP no seu Raspberry Pi

O que é PHP?

Primeiro de tudo, você deve saber que o PHP é uma linguagem interpretada . E como no caso dos servidores, a sigla PHP pode ter vários significados . De fato, quando falamos sobre PHP, podemos falar sobre o idioma ou o interpretador . 
Aqui, quando falamos sobre a instalação do PHP, isso significa que vamos instalar o interpretador , a fim de usar a linguagem.

O PHP (o idioma desta vez) é usado principalmente para tornar um site dinâmico, isto é, o usuário envia informações para o servidor que retorna os resultados modificados de acordo com essas informações . Por outro lado, um site estático não se adapta às informações fornecidas por um usuário . É salvo como um arquivo de uma vez por todas e sempre entregará o mesmo conteúdo.

O PHP é gratuito e mantido pela PHP Foundation, assim como pelo Zend Enterprise, e várias outras empresas (deve-se notar que Zend também é o autor do famoso framework Zend PHP, amplamente utilizado e reconhecido no mundo dos negócios). .

É uma das linguagens de programação mais utilizadas e é até a mais utilizada para programação web, com cerca de 79% de market share.

Mais uma vez, todas as habilidades que você pode adquirir, no idioma, ou na instalação e configuração do interpretador, sempre serão úteis. Então, só podemos aconselhá-lo a aprender o PHP, que é realmente uma linguagem maravilhosa e muitas vezes subestimada.

Como instalar o PHP

Voltaremos a usar o administrador para instalar o PHP com a linha de comando.

sudo apt instalar php php-mbstring

Saber se o PHP está funcionando

Para saber se o PHP está funcionando corretamente, não é muito complicado, e o método é bastante semelhante ao usado para o Apache .

Você primeiro excluirá o arquivo “index.html” no diretório “/ var / www / html”.

sudo rm /var/www/html/index.html

Em seguida, crie um arquivo “index.php” neste diretório, com esta linha de comando

echo "<? php phpinfo ();?>"> /var/www/html/index.php

A partir daí, a operação é a mesma da verificação do Apache . Você tenta acessar sua página, e você deve ter um resultado próximo a esta imagem (se você não tiver uma interface, use o mesmo método de antes, e procure as palavras “Versão do PHP”).

Capturando um phpinfo de um servidor em Raspbian.

Tabela gerada pelo comando phpinfo em uma framboesa.

Um banco de dados MySQL para o seu servidor

Um DBMS, o  que é isso? Por que o MySQL?

Agora que configuramos o PHP, você provavelmente desejará armazenar informações para uso em seus sites. Para este propósito, os bancos de dados são usados ​​com mais freqüência. 
Vamos, portanto, configurar um DBMS (Database Management System), ou seja, o MySQL.

O MySQL é um DBMS gratuito , poderoso e usado maciçamente (cerca de 56% de participação no mercado de DBMSs gratuitos). Aqui, novamente, o MySQL é tão essencial para o desenvolvimento, seja qual for a linguagem, que você deve aprender e dominar completamente, com este livro, por exemplo .

Como instalar o MySQL

Para fazer isso, vamos instalar o mysql-server e o php-mysql (que servirão como um link entre o php e o mysql)

sudo apt instale o mysql-server php-mysql

Verifique se o MySQL está funcionando corretamente

Para verificar o funcionamento do MySQL, desta vez vamos usar apenas a linha de comando . Para fazer isso, simplesmente nos conectaremos pelo comando:

sudo mysql --user = root

Não excluiremos o usuário root padrão do mysql e criaremos um novo usuário root do mysql, porque o padrão só pode ser usado com a conta root do Linux, e portanto não disponível para os scripts do servidor web e php.

Para fazer isso, uma vez que você se conectar ao MySQL, simplesmente execute esses comandos (substitua passwordpela senha que você quer):

DROP USER 'root' @ 'localhost'; 
CREATE USER 'root' @ 'localhost' IDENTIFICADO POR 'senha'; 
GRANT ALL PRIVILEGES ON *. * TO 'root' @ 'localhost'

Então você agora tem um servidor web, conectado ao PHP e MySQL . Isso é tudo que é preciso.

(Nas suas conexões de nexts, você poderá se conectar ao mysql sem usar o sudo, com o comando mysql --user=root --password=yourmysqlpassword).

Adicionar PHPMyAdmin

A instalação do PHPMyAdmin é absolutamente desnecessária. Nesta instalação, não vamos nos preocupar com nenhuma configuração de segurança especial!

A instalação do PHPMyAdmin é muito rápida e fácil, nós simplesmente temos que usar o gerenciador de pacotes com este comando:

sudo apt instala phpmyadmin

O programa de instalação do PHPMyAdmin fará algumas perguntas. Sobre o dbconfig-commoncomponente, opte por não usá-lo (como já configuramos nosso banco de dados). Sobre o servidor para configurar o PHPMyAdmin para, escolha Apache. E a senha do root é aquela que você definiu para o MySQL.

Você também deve ativar a extensão mysqli usando o comando acima:

sudo phpenmod mysqli 
sudo /etc/init.d/apache2 reiniciar

Verifique se o PHPMyAdmin está funcionando corretamente

Para verificar se o PHPMyAdmin funciona, você simplesmente tentará acessá-lo, usando o endereço do seu Raspberry seguido de / phpmyadmin. Por exemplo, localmente será http://127.0.0.1/phpmyadmin

Se você ainda receber um erro, pode ser porque o PHPMyAdmin foi movido para outro diretório. Neste caso, tente o comando

sudo ln -s / usr / share / phpmyadmin / var / www / html / phpmyadmin

Agora, podemos acessar o PHPMyAdmin do navegador do Raspberry Pi, com o URL: http://127.0.0.1/phpmyadmin

Tornar um servidor acessível a partir da web

Seu servidor da web está pronto. No entanto, você provavelmente não pode acessá-lo da internet . De fato, seria necessário que o seu modem redirecionasse os pedidos para o seu Raspberry, as boas portas. 
Para colocar esses redirecionamentos no lugar, e até mesmo obter um URL, você deve olhar para DynDNS e encaminhamento de porta!

Fonte

https://howtoraspberrypi.com/how-to-install-web-server-raspberry-pi-lamp/

https://stackoverflow.com/questions/39281594/error-1698-28000-access-denied-for-user-rootlocalhost