domingo, 11 de abril de 2021

Comunicação Síncrona e Assíncrona

 Comunicação síncrona refere-se ao contato imediato entre o emissor (quem envia a mensagem) e o receptor (quem recebe a mensagem), a comunicação assíncrona é atemporal. 

Na comunicação assíncrona o emissor envia a mensagem, mas não necessariamente o receptor irá recebê-la imediatamente.

Imaginemos que um emissor está a enviar uma mensagem de texto através de um tubo e que a mensagem é enviada recorrendo a bolas, cada bola com uma letra. Quando as bolas chegam ao receptor, a mensagem tem que ser remontada, ou seja, têm que se colocar as bolas pela ordem correta, para se voltar a ter a mensagem.

  • Em comunicação Assíncrona, cada bola tem um número de sequência, que permite que seja colocada na sua posição. Isto permite que as bolas sejam enviadas e recebidas por qualquer ordem, uma vez que esse número de sequência identifica a posição de cada bola (letra) na mensagem.
  • Em comunicação síncrona, as bolas têm que ser enviadas e recebidas de forma sincronizada, mantendo uma ordem bem definida: a primeira bola (letra) a ser enviada, tem que ser a primeira a ser recebida e assim sucessivamente.


Comunicação Síncrona

Em uma comunicação síncrona o emissor e receptor são sincronizados pelo mesmo relógio, o receptor recebe de modo contínuo (mesmo quando nenhum bit é transmitido) os dados em compasso em que o emissor as remete.

inserir a descrição da imagem aqui

Simples exemplo em Javascript:

function foo(){
    console.log("foo");
}
function bar(){
    console.log("bar");
}
function baz(){
    console.log("baz");
}
foo();
bar();
baz();

Essas funções serão executadas em ordem, bar não será executada até que foo tenha terminado e baz por sua vez só será executado após o término de bar, havendo assim uma sincronia.

Comunicação Assíncrona

Em uma comunicação assíncrona a sincronização é diferente, o emissor envia o fluxo de dados e periodicamente insere um elemento de sinal, comumente chamado de flag, para que seja possível distinguir aonde começa (a informação de início da transmissão é o start-bit) e acaba (a informação de fim de transmissão é o stop-bit) o bloco de dados e qual a sua posição na sequência de dados transmitidos.

inserir a descrição da imagem aqui

Exemplo:

function foo(){
    console.log("Executando algo assíncrono aqui");
}
function bar(){
    setTimeout(foo, 0);
    console.log("Alguma coisa por aqui");
    console.log("...");
}
bar();


Aqui não há a mesma sincronização que noutro exemplo, uma função não vai esperar pelo término da outra. Nesse exemplo usamos a função setTimeout para enfileirar foo que vai executar 0 ms após o loop de eventos, o loop de eventos ficará indisponível até completar sua atual pilha de execução - neste caso, o resto de bar, que inclui as duas declarações console.log. Após o término de bar o loop de eventos fica livre, e assim foo pode ser executada.

Saída:


Alguma coisa por aqui
...
Executando algo assíncrono aqui



Quando e para que devo usá-las? Grande parte do processo de tomada de decisão sobre isso envolve o senso comum, um conjunto de fatores, uma comunicação assíncrona pode ser usado quando a resposta não tenha que ser entregue urgentemente, esse tipo de comunicação é adequado para situações em que não seja necessário a entrega urgente dos dados, por outro lado, não seria apropriado usar esse tipo de comunicação se você precisa de interação imediata. Já a comunicação síncrona é ideal quando se precisa de espontaneidade, como em uma conversa em tempo real entre duas ou mais pessoas.

Tanto a comunicação síncrona, quanto a assíncrona, têm suas vantagens e desvantagens, utilizar uma ou outra vai depender da necessidade da sua aplicação.

segunda-feira, 29 de março de 2021

WINDOWS FORMS - DATAGRIDVIEW, OBTER O ÍNDICE DA GRID

 int indice = dgvTabelaParticulaAdicionar.CurrentCell.RowIndex; 


DataGridViewCell.RowIndex 

Obtém o índice da linha pai da célula.

WINDOWS FORMS C# - ALINHAR À DIREITA UMA COLUNA DO DATAGRIDVIEW

É bem simples. Basta definir a constantes que indicam o alinhamento de conteúdo dentro de uma célula DataGridView


 dgvTabelaParticulaAdicionar.Columns[6].DefaultCellStyle.Alignment =                                      

         DataGridViewContentAlignment.TopRight;


Campos

CAMPOS
BottomCenter512

O conteúdo é alinhado verticalmente na parte inferior e horizontalmente no centro de uma célula.

BottomLeft256

O conteúdo é alinhado verticalmente na parte inferior e horizontalmente à esquerda de uma célula.

BottomRight1024

O conteúdo é alinhado verticalmente na parte inferior e horizontalmente à direita de uma célula.

MiddleCenter32

O conteúdo é alinhado no centro vertical e horizontal de uma célula.

MiddleLeft16

O conteúdo é alinhado verticalmente no meio e horizontalmente à esquerda de uma célula.

MiddleRight64

O conteúdo é alinhado verticalmente no meio e horizontalmente à direita de uma célula.

NotSet0

O alinhamento não está definido.

TopCenter2

O conteúdo é alinhado verticalmente na parte superior e horizontalmente no centro de uma célula.

TopLeft1

O conteúdo é alinhado verticalmente na parte superior e horizontalmente à esquerda de uma célula.

TopRight4

O conteúdo é alinhado verticalmente na parte superior e horizontalmente à direita de uma célula.

Formatar TextBox Valores Decimais

 Adicione um TextBox ao seu projeto e faça as seguintes alterações:

string valor;
        private void txt_valor_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar) && e.KeyChar != Convert.ToChar(Keys.Back))
            {
                if (e.KeyChar == ',')
                {
                    e.Handled = (txt_valor.Text.Contains(","));
                }
                else
                    e.Handled = true;
            }            
        }

        private void txt_valor_Leave(object sender, EventArgs e)
        {
            valor = txt_valor.Text.Replace("R$", "");
            txt_valor.Text = string.Format("{0:C}", Convert.ToDouble(valor));
        }

        private void txt_valor_KeyUp(object sender, KeyEventArgs e)
        {
        	valor = txt_valor.Text.Replace("R$","").Replace(",","").Replace(" ","").Replace("00,","");
        	if(valor.Length == 0)
        	{
        		txt_valor.Text = "0,00"+valor;
        	}
        	if(valor.Length == 1)
        	{
        		txt_valor.Text = "0,0"+valor;
        	}
        	if(valor.Length == 2)
        	{
        		txt_valor.Text = "0,"+valor;
        	}
        	else if(valor.Length >= 3)
        	{
        		if(txt_valor.Text.StartsWith("0,"))
        		{
        			txt_valor.Text = valor.Insert(valor.Length - 2,",").Replace("0,","");
        		}
        		else if(txt_valor.Text.Contains("00,"))
        		{
        			txt_valor.Text = valor.Insert(valor.Length - 2,",").Replace("00,","");
        		}
        		else
        		{
        			txt_valor.Text = valor.Insert(valor.Length - 2,",");
        		}
        	}        	
        	valor = txt_valor.Text;
            txt_valor.Text = string.Format("{0:C}", Convert.ToDouble(valor));
            txt_valor.Select(txt_valor.Text.Length,0);
        }


quarta-feira, 17 de março de 2021

DATAGRIDVIEW - AJUSTAR AS COLUNAS DE FORMA AUTOMÁTICA

Propriedade: DataGridView.AutoSizeColumnsMode 



Esta propriedade Obtém ou define um valor que indica como as larguras de coluna são determinadas.

public System.Windows.Forms.DataGridViewAutoSizeColumnsMode AutoSizeColumnsMode { get; set; }

Essa propriedade permite que você configure o controle para que as larguras das colunas sejam ajustadas automaticamente para preencher o controle ou ajustar o conteúdo da célula. Os ajustes de tamanho ocorrem no modo de preenchimento sempre que a largura do controle é alterada


 dataGridView_ExamePacienteDupicados.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

segunda-feira, 8 de março de 2021

TRUNCATE TABLE (Transact-SQL)

 Remove todas as linhas de uma tabela ou partições especificadas de uma tabela sem registrar as exclusões de linha individual. TRUNCATE TABLE é semelhante à instrução DELETE sem nenhuma cláusula WHERE; entretanto, TRUNCATE TABLE é mais rápida e utiliza menos recursos de sistema e log de transações.

-- Syntax for SQL Server and Azure SQL Database

TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name } [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) ) ] [ ; ]

Argumentos

database_name
É o nome do banco de dados.

schema_name
É o nome do esquema ao qual a tabela pertence.

table_name
É o nome da tabela a ser truncada ou da qual todas as linhas são removidas. table_name deve ser um literal. table_name não pode ser a função OBJECT_ID() nem uma variável.

WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )
Aplica-se aSQL Server (SQL Server 2016 (13.x) até a versão atual)

Especifica as partições para truncar ou das quais todas as linhas são removidas. Se a tabela não for particionada, o argumento WITH PARTITIONS ON PARTITIONS gerará um erro. Se a cláusula WITH PARTITIONS não for fornecida, a tabela inteira será truncada.

<partition_number_expression> pode ser especificado das seguintes maneiras:

  • Forneça o número de uma partição, por exemplo: WITH (PARTITIONS (2))

  • Forneça os números de várias partições individuais separados por vírgulas, por exemplo: WITH (PARTITIONS (1, 5))

  • Forneça os intervalos e as partições individuais, por exemplo: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <range> pode ser especificado como números de partições separados pela palavra TO, por exemplo: WITH (PARTITIONS (6 TO 8))

Para truncar uma tabela particionada, a tabela e os índices deverão estar alinhados (particionados na mesma função de partição).


Restrições

Você não pode usar TRUNCATE TABLE em tabelas que:

  • São referenciadas por uma restrição FOREIGN KEY. É possível truncar uma tabela que tenha uma chave estrangeira que referencie a ela mesma.

  • Participam de uma exibição indexada.

  • São publicadas com replicação transacional ou replicação de mesclagem.

  • São temporais com controle de versão do sistema.

  • São referenciadas por uma restrição EDGE.


Permissões

A permissão mínima necessária é ALTER em table_name. As permissões TRUNCATE TABLE são padronizadas para o proprietário da tabela, os membros da função de servidor fixa sysadmin e as funções de banco de dados fixas db_owner e db_ddladmin, e não podem ser transferidas. Entretanto, você pode incorporar a instrução TRUNCATE TABLE dentro de um módulo, como um procedimento armazenado, e conceder permissões adequadas ao módulo por meio da cláusula EXECUTE AS.

segunda-feira, 18 de janeiro de 2021

HISTÓRIA DA INTERNET MÓVEL


    Veja como a Internet evoluir em um curto espaço de anos. 

    Ao ver a figura tente imaginar tudo que ela nos proporciona e proporcionou ao longo dos anos.




 

quinta-feira, 2 de julho de 2020

PHP falha de autenticação com contas google

Configurar conta Google

Após a implementação para envio de Email, precisaremos configurar nossa conta de Email, para que não ocorram erros de autenticação: 

1 - Permitir aplicativos menos seguros: https://myaccount.google.com/lesssecureapps

2 - Permitir acesso à sua Conta do Google: https://accounts.google.com/b/0/DisplayUnlockCaptcha

3 - Desativar verificação em duas etapas ou criar uma senha para o e-mail https://support.google.com/accounts/answer/1064203?hl=pt-BR

Normalmente até o segundo passo já resolve o problema



Código envio de Email em PHP

<!DOCTYPE>
<html>
<head>
<title>Formulário enviado com sucesso!</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="content-language" content="pt-br">
</head>
<body>
<?php  
require_once("email/class.phpmailer.php");
include("email/class.smtp.php"); 
require 'email/PHPMailerAutoload.php';
// require("../../phpmailer/class.phpmailer.php");
// include ("config.php");

$data = date("d/m/Y");
$hora = date("H:i");
// Definindo nomes dos campos
$name = $_POST['Name'];
$email = $_POST['Email'];
$telefone = $_POST['Phone'];
$Message = $_POST['Message'];
// Inicia a classe PHPMailer
$mail = new PHPMailer();
// Define os dados do servidor e tipo de conexão
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->IsSMTP(); // Define que a mensagem será SMTP
$mail->Host = "smtp.gmail.com"; // Endereço do servidor SMTP
$mail->Port = 587;
// $mail->SMTPSecure = 'SSL';
$mail->SMTPDebug = 1; // Debugar: 1 = erros e mensagens, 2 = mensagens apenas
$mail->SMTPAuth = true; // Usa autenticação SMTP? (opcional)
$mail->Username = 'acquafutura2001@gmail.com';//eumail@dominio.net'; // Usuário do servidor SMTP
$mail->Password = 'acqua@123';//senha'; // Senha do servidor SMTP
// Define o remetente
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->From = "acquafutura2001@gmail.com"; //$email;//seumail@dominio.net"; // Seu e-mail
$mail->FromName = "ACQUA FUTURA"; //$name ; // Seu nome
// Define os destinatário(s)
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->AddAddress('acquafutura2001@gmail.com', 'ACQUA FUTURA');//fulano@dominio.com.br', 'Fulano da Silva');
//$mail->AddCC('ciclano@site.net', 'Ciclano'); // Copia
//$mail->AddBCC('fulano@dominio.com.br', 'Fulano da Silva'); // Cópia Oculta
// Define os dados técnicos da Mensagem
// =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
$mail->IsHTML(true); // Define
$mail->Subject  = "Formulario de Contato"; // Assunto da mensagem
$mail->Body = utf8_decode("<b>Mensagem: </b>
<br><br>
<b>Nome</b> $name
<br>
<b>Email</b> $email
<br>
<b>Telefone</b> $telefone
<br>
<b>Mensagem</b> $Message");
//Envio da Mensagem
// Envia o e-mail
// $phpmail->ClearAllRecipients();
// $phpmail->ClearAttachments();
$enviado = $mail->Send();
if ($enviado) {
include 'sucesso.html';
} else {
include 'falha.html';
}
?>

</body>
</html>