RunTime do AdvPL

Introdução

No primeiro post do Blog, em apenas um parágrafo foi dada uma definição bem sintética do que é o AdvPL: Trata-se de uma uma linguagem de programação estruturada com suporte a orientação de objetos, que roda em uma máquina virtual com arquitetura client-server e multi-plataforma.

Hoje vamos entrar um pouco mais fundo em algumas características da execução de um código AdvPL, desde a pré-compilação até a execução do Código. Mas antes, vamos com algumas definições.

Código AdvPL

A sintaxe da linguagem AdvPL é uma extensão da sintaxe xBase, mais conhecida pelo seu uso na linguagem Clipper. Um código fonte em AdvPL passa por uma etapa de pré-compilação, onde vários comandos são transformados em chamadas de funções, e “açúcares sintáticos” podem ser implementados, através de #defines, #translates, #command(s), #ifdef(s) e afins. Os comandos da linguagem AdvPL que realmente são “comandos” são as instruções de decisão e iteração, como WHILE, FOR, IF, ELSEIF , ELSE, CASE, END … praticamente todo o resto dos comandos são implementações feitas por #command, #xcommand ou #translate, que permitem você usar por exemplo um “comando” de abertura de tabela, como o comando “USE <cTabela> ALIAS <cAlias> [ SHARED | EXCLUSIVE ] [ VIA <cRdd> ] [READONLY] [NEW]”, que na etapa de pré-compilação vai ser transformando internamente na chamada da função DbUseArea().

Pré-compilação

Tanto o IDE como o TDS (versão anterior e atual do Ambiente de Desenvolvimento de aplicações AdvPL, respectivamente) trabalham com um pré-compilador (appre.exe). A partir do fonte AdvPL e dos respectivos #include(s) utilizados no código, a pré-compilação gera um novo arquivo, chamado de PPO (Pre Processed Output), e este sim é o código enviado ao AppServer para ser compilado.

Compilação

A compilação deste código gera um “ByteCode” em formato proprietário, interpretável somente pela máquina virtual do AppServer. O ByteCode gerado é criptografado e armazenado em um arquivo de repositório de objetos, configurado no AppServer para o ambiente onde os fontes estão sendo compilados. Damos o nome de “ambiente” a um espaço virtual de execução, que engloba um repositório de objetos e um ponto de acesso a uma pasta no disco (local ou remota via rede) para acesso a arquivos sob este identificador de ambiente, entre outras configurações de acesso a dados relacionais e comportamentos desejados para a instância do ambiente.

Repositório de Objetos

Armazena as funções e classes compiladas a partir dos fontes AdvPL, é fornecido pela TOTVS contendo as compilações dos módulos do ERP Microsiga do produto padrão. Contém também as funções do Framework AdvPL, usadas pelos fontes dos demais módulos, e que também são usados em customizações do produto, onde o próprio cliente pode criar um código em AdvPL, usando-se das funções básicas e de Framework AdvPL para customizar o produto padrão através de pontos de entrada (compilação de funções de usuário — USER FUNCTION(s) — com nomes especificos, onde existem pontos de chamada realizados pelo produto padrão do ERP), ou mesmo criando novas funcionalidades.

O repositório possui mecanismos de verificação de integridade e proteção de código, para evitar a engenharia reversa dos fontes compilados. A reversão de código é possível, e às vezes necessária quando um cliente por exemplo “perde” os fontes das customizações da versão em uso do seu ERP, e precisa delas no momento de uma migração de versão. O procedimento de “descompilação” neste caso é solicitado para a TOTVS mediante abertura de chamado, onde cada caso é avaliado.

O repositório de objetos também guarda arquivos de imagem (BMP,PNG,JPG), que podem ser inseridos em um Projeto AdvPL através do IDE/TDS e recuperados posteriormente em tempo de execução e usados diretamente por algumas funções, classes e comandos da linguagem que montam a interface da aplicação.

O Protheus 12 utiliza uma nova engine da máquina virtual do AppServer, com um novo formato de ByteCode, com mais instruções de baixo nível. Isto tornou o ByteCode ligeiramente maior, porém com ganhos de desempenho em alguns processos e funcionalidades.

Execução do AdvPL

Partindo de uma execução de um programa AdvPL, iniciado a partir do SmartClient, o SmartClient faz um HandShake com o AppServer via conexão TCP (ou SSL caso configurado), e solicita a execução de uma função. Ela pode ser uma “Main Function” — Função de entrada de módulo ou ferramenta do ERP — ou uma “User Function” — aplicações ou customizações criadas em AdvPL pelo próprio cliente.

Como o AdvPL é essencialmente dinâmico, os fontes do repositório são carregados na memória sob demanda, conforme as funções vão sendo chamadas. Quando o Menu do ERP é apresentado, todos os programas já carregados e executados até então, essencialmente fontes do Framework do AdvPL são mantidos na memória. Ao chamar uma opção de menu, o fonte e suas dependências são carregados sob demanda e executados, e quando o usuário encerra a opção e volta ao Menu do ERP, todos os fontes carregados desde o início daquela opção são descarregados da memória.

Quando a excecução é a chamada de menu da interface MDI (SIGAMDI), cada opção de menu cria um contexto e uma conexão separada com o AppServer, permitindo a execução de múltiplos programas sob a mesma interface, onde cada execução possui seu contexto e processo independentes. Cada opção de menu finalizada encerra o seu próprio conexto e descarrega todos os prograas da memória. Ao usar o mecanismo de Balanceamento de Carga do AdvPL, cada nova opção de Menu do MDI pode ser direcionada para o AppServer com menos processos em execução.

Para jobs, não existe balanceamento de carga nativo. Cada Job é executado na instância do serviço onde o AppServer está sendo executado. Hoje podemos emular um balanceamento realizando um RPC para um determinado serviço e subindo o job via RPC ( Nativo do AdvPL).

Atualmente o contexto de uma execução em AdvPL está implicitamente amarrado com uma Thread do Sistema Operacional. A arquitetura multi-thread do AppServer não estabelece afinidade entre as CPUS físicas do equipamento, o Scheduler de tarefas do sistema operacional e encarregado de distribuir as Threads e realocá-las por CPU a seu critério. Devido ao cenário extremamente variável de peso de execução das Threads, tentar estabelecer uma afinidade tende a ser pior do que deixar o sistema operacional escolher a CPU em uso.

AdvPL com interface – SmartClient

A execução de processos de interface AdvPL com o SmartClient é síncrona, a aplicação SmartClient é a resposável por renderizar a interface (Janela ou diálogo) construída pela aplicação AdvPL, e uma vez que a interface seja “ativada”, o AppServer passa a esperar por uma interação do usuário no SmartClient, como pressionar um botão ou preencher um campo. Entre ambos existe um mecanismo de verificação de conexão, chamado “pulso”. Quando o AppServer está aguardando por uma interação do usuário com a interface, mesmo que o usuário não dispare nenhum evento, a cada 60 segundos o SmartClient dispara um evento interno de “pulso” para o AppServer , para indicar que o SmartClient ainda está aberto. Caso o AppServer nao receba nenhum evento ou nenhum pulso do SmartClient em 3 minutos, ele assume que o SmartClient não está mais conseguindo se comunicar com o AppServer , e derruba/finaliza o processo em execução no AppServer , liberando os recursos utilizados ( arquivos e registros bloqueados, licenças, conexão com DBAccess,etc ).

Depuração de Código AdvPL

Através do IDE e/ou TDS, podemos depurar (ou “debugar”) um código AdvPL, colocando pontos de parada, inspecionando variáveis de memória, e determinando as etapas de execução (step into, step over, step out, run…). Deve-se tomar uma atenção especial no uso dos “Watches” de execução, pois a chamada de funções dentro de um “Watch” podem mudar o comportamento da aplicação, como por exemplo reposicionar o ponteiro de registro atual de uma tabela de dados, mudando o comportamento da aplicação enquanto ela está sendo depurada. Normalmente usamos os Watches para variáveis de memória. Através da Janela de Comandos do IDE/TDS, também podemos executar expressões, e até mudar conteúdos de variáveis durante a depuração através de instruções de atribuição. Isto pode ser útil em muitas situações.

Uso de memória

Normalmente a memória alocada por um programa é limpa quando o programa é finalizado. Durante a execução de código, existem algumas limpezas realizadas nos destrutores de componentes de interface, e no retorno ao stack (pilha) anterior após a execução de funções do Repositório de Objetos. Normalmente objetos são limpos quando não são mais referenciados, porém caso seja feita uma referência circular entre objetos, a limpeza somente ocorre quando a aplicação termina, ou quando for realizada explicitamente por uma função chamada “FreeObj()”.

Existem diversos recursos de monitoramento de memória do AppServer, um dos mais utilizados é a configuração DebugThreadUsedMemory, que pode ser habilitada no appserver.ini, na seção [GENERAL]. Esta configuração faz com que o AppServer mostre no Monitor de Processos do AppServer a quantidade de memória aproximada em uso por cada processo em execução.

Conclusão

Boa parte dos recursos mencionados neste tópico estão documentados no site oficial de documentação da TOTVS, o TDN (Totvs Development Network), que pode ser acessado no link http://tdn.totvs.com. O Post de hoje é só pra “molhar” o bico, os próximos posts em momento oportuno vão entrar em mais detalhes de cada uma destas operações 😀

Agradeço a audiência de todos, e desejo a vocês TERABYTES de sucesso !!! 

Abraços 😉

Introdução a Informática – Parte 03

Introdução

No post anterior, vimos as etapas que acontecem quando ligamos o equipamento, e de bandeja alguma coisa bem ‘por cima’ sobre dados e programas. Agora vamos descer um pouco mais dentro dos Bytes, abordar o conceito de Dados e Programas, e aproveitar o gancho para ver ‘por cima’ o que é um sistema de arquivos, mais especificamente o sistema de arquivos em árvore, usado pelo MS-DOS e pelo Windows.

Lembrando do Byte

“Note que um byte nada tem de especial, é apenas um número binário de oito algarismos. Sua importância na informática deriva apenas do fato do código ASCII haver adotado números de oito bits, além de razões meramente construtivas ou operacionais. Por exemplo: os códigos enviados a impressoras para controlar a impressão têm oito bits, os valores trocados via Modem entre computadores também, assim como diversas outras operações elementares de intercâmbio de informações. Além disso, memórias costumam ser organizadas de tal forma que as operações de leitura e escrita são feitas com quantidades de um byte ou de um múltiplo de bytes (oito, dezesseis, trinta e dois, sessenta e quatro ou cento e vinte e oito bits – o que corresponde a um, dois, quatro, oito e dezesseis bytes, respectivamente).” (Wikipedia, BYTE)

Logo, o que está gravado em qualquer arquivo armazenado no disco de um computador ? R: Bytes. E na memória RAM ? R: Bytes. E num pen-drive ? Mais Bytes. Legal, tudo são Bytes, ou sequências numéricas de octetos. Mas, no computador eu tenho arquivos de texto, imagens, áudio, vídeo … tudo são bytes ? R: SIM.

Existem editores de texto e ferramentas de disco que permitem abrir um arquivo qualquer, em qualquer formato, e ler todos os bytes do arquivo, e mostrar na tela o conteúdo do arquivo representados em bytes. Normalmente estes programas mostram o valor de cada byte em uma base numérica conhecida por HEXADECIMAL. No sistema decimal, usamos 10 algarismos diferentes para representar um número, de “0” a “9”. No sistema binário, usamos apenas 2: “0” e “1”. No sistema Hexadecimal, usamos 16 ( HEXA + DECIMAL = 6 + 10 ), usando os algarismos de “0” a “9” e as letras de “A” a “F”.

Partindo da base binária, precisamos de uma sequência de 4 BITS para representar 16 valores diferentes, certo ? Usando Hexadecimal, com apenas um símbolo, de “0” a “F”, conseguimos representar 16 valores diferentes. Vejamos abaixo como podemos representar os 256 valores diferentes de um Byte usando cada um dos sistemas ( DEC = Decimal, HEX = Hexadecimal, BIN = Binário ):

DEC HEX BIN DEC HEX BIN DEC HEX BIN DEC HEX BIN
------------------------------------------------------------------------------
000 00 00000000 064 40 01000000 128 80 00000010 192 C0 11000000
001 01 00000001 065 41 01000001 129 81 00000011 193 C1 11000001
002 02 00000010 066 42 01000010 130 82 00000100 194 C2 11000010
003 03 00000011 067 43 01000011 131 83 00000101 195 C3 11000011
004 04 00000100 068 44 01000100 132 84 00000110 196 C4 11000100
005 05 00000101 069 45 01000101 133 85 00000111 197 C5 11000101
006 06 00000110 070 46 01000110 134 86 00001000 198 C6 11000110
007 07 00000111 071 47 01000111 135 87 00001001 199 C7 11000111
008 08 00001000 072 48 01001000 136 88 00001010 200 C8 11001000
009 09 00001001 073 49 01001001 137 89 00001011 201 C9 11001001
010 0A 00001010 074 4A 01001010 138 8A 00001100 202 CA 11001010
011 0B 00001011 075 4B 01001011 139 8B 00001101 203 CB 11001011
012 0C 00001100 076 4C 01001100 140 8C 00001110 204 CC 11001100
013 0D 00001101 077 4D 01001101 141 8D 00001111 205 CD 11001101
014 0E 00001110 078 4E 01001110 142 8E 00010000 206 CE 11001110
015 0F 00001111 079 4F 01001111 143 8F 00010001 207 CF 11001111
016 10 00010000 080 50 01010000 144 90 00010010 208 D0 11010000
017 11 00010001 081 51 01010001 145 91 00010011 209 D1 11010001
018 12 00010010 082 52 01010010 146 92 00010100 210 D2 11010010
019 13 00010011 083 53 01010011 147 93 00010101 211 D3 11010011
020 14 00010100 084 54 01010100 148 94 00010110 212 D4 11010100
021 15 00010101 085 55 01010101 149 95 00010111 213 D5 11010101
022 16 00010110 086 56 01010110 150 96 00011000 214 D6 11010110
023 17 00010111 087 57 01010111 151 97 00011001 215 D7 11010111
024 18 00011000 088 58 01011000 152 98 00011010 216 D8 11011000
025 19 00011001 089 59 01011001 153 99 00011011 217 D9 11011001
026 1A 00011010 090 5A 01011010 154 9A 00011100 218 DA 11011010
027 1B 00011011 091 5B 01011011 155 9B 00011101 219 DB 11011011
028 1C 00011100 092 5C 01011100 156 9C 00011110 220 DC 11011100
029 1D 00011101 093 5D 01011101 157 9D 00011111 221 DD 11011101
030 1E 00011110 094 5E 01011110 158 9E 00100000 222 DE 11011110
031 1F 00011111 095 5F 01011111 159 9F 00100001 223 DF 11011111
032 20 00100000 096 60 01100000 160 A0 00100010 224 E0 11100000
033 21 00100001 097 61 01100001 161 A1 00100011 225 E1 11100001
034 22 00100010 098 62 01100010 162 A2 00100100 226 E2 11100010
035 23 00100011 099 63 01100011 163 A3 00100101 227 E3 11100011
036 24 00100100 100 64 01100100 164 A4 00100110 228 E4 11100100
037 25 00100101 101 65 01100101 165 A5 00100111 229 E5 11100101
038 26 00100110 102 66 01100110 166 A6 00101000 230 E6 11100110
039 27 00100111 103 67 01100111 167 A7 00101001 231 E7 11100111
040 28 00101000 104 68 01101000 168 A8 00101010 232 E8 11101000
041 29 00101001 105 69 01101001 169 A9 00101011 233 E9 11101001
042 2A 00101010 106 6A 01101010 170 AA 00101100 234 EA 11101010
043 2B 00101011 107 6B 01101011 171 AB 00101101 235 EB 11101011
044 2C 00101100 108 6C 01101100 172 AC 00101110 236 EC 11101100
045 2D 00101101 109 6D 01101101 173 AD 00101111 237 ED 11101101
046 2E 00101110 110 6E 01101110 174 AE 00110000 238 EE 11101110
047 2F 00101111 111 6F 01101111 175 AF 00110001 239 EF 11101111
048 30 00110000 112 70 01110000 176 B0 00110010 240 F0 11110000
049 31 00110001 113 71 01110001 177 B1 00110011 241 F1 11110001
050 32 00110010 114 72 01110010 178 B2 00110100 242 F2 11110010
051 33 00110011 115 73 01110011 179 B3 00110101 243 F3 11110011
052 34 00110100 116 74 01110100 180 B4 00110110 244 F4 11110100
053 35 00110101 117 75 01110101 181 B5 00110111 245 F5 11110101
054 36 00110110 118 76 01110110 182 B6 00111000 246 F6 11110110
055 37 00110111 119 77 01110111 183 B7 00111001 247 F7 11110111
056 38 00111000 120 78 01111000 184 B8 00111010 248 F8 11111000
057 39 00111001 121 79 01111001 185 B9 00111011 249 F9 11111001
058 3A 00111010 122 7A 01111010 186 BA 00111100 250 FA 11111010
059 3B 00111011 123 7B 01111011 187 BB 00111101 251 FB 11111011
060 3C 00111100 124 7C 01111100 188 BC 00111110 252 FC 11111100
061 3D 00111101 125 7D 01111101 189 BD 00111111 253 FD 11111101
062 3E 00111110 126 7E 01111110 190 BE 01000000 254 FE 11111110
063 3F 00111111 127 7F 01111111 191 BF 01000001 255 FF 11111111
------------------------------------------------------------------------------

TABELA ASCII

Mas, se dentro de um arquivo qualquer, eu tenho apenas Bytes, como é que eu vou trocar informações ? No final, tudo são números, certo ? R: Sim. Na prática sim. O que nós podemos fazer é dar significado aos números, e definir uma forma de interpretação diferente para os números. O padrão mais conhecido na informática para representação e trocas de informações baseadas em TEXTO para computadores é a famosa TABELA ASCII.

“ASCII (do inglês American Standard Code for Information Interchange; “Código Padrão Americano para o Intercâmbio de Informação“) é um código binário (cadeias de bits: 0s e 1s) que codifica um conjunto de 128 sinais: 95 sinais gráficos (letras do alfabeto latino, sinais de pontuação e sinais matemáticos) e 33 sinais de controle. […] A codificação ASCII é usada para representar textos em computadores, equipamentos de comunicação, entre outros dispositivos que trabalham com texto. Desenvolvida a partir de 1960, grande parte das codificações de caracteres modernas a herdaram como base.” ( Wikipedia, ASCII)

Não vou replicar a tabela ASCII dentro deste post, dêem uma olhada nela no link da Wikipedia “https://pt.wikipedia.org/wiki/ASCII“. Quando abrimos um arquivo que contém apenas TEXTO (normalmente identificados pela extensão “.txt”), quando encontramos um byte com valor decimal “32”, ele significa um espaço em branco, “65” representa a letra “A” (“a” maiúscula do alfabeto), e uma sequência de bytes “13” e “10” representa uma quebra de linha.

Arquivos e Extensões

Um arquivo nada mais é do que uma sequência finita/limitada de Bytes. Qualquer programa é capaz de abrir um arquivo e ler seus bytes, mas para dar significado a esta informação, é necessário saber o que estes bytes representam. Quando o sistema de arquivos do MS-DOS foi concebido, foi definido que um “arquivo” possui um nome, que o diferencia dos demais, e uma extensão, normalmente separada do nome por um “.” ponto decimal, onde a extensão indica o tipo do conteúdo do arquivo.

Vejam abaixo algumas extensões e seus usos mais comuns, para os ambientes MS-DOS e Windows:

  • .INI Arquivo texto de configuração ou inicialização de algum aplicativo ou sistema.
  • .BAT Arquivo texto que contém uma sequencia de comandos do sistema operacional.
  • .EXE Arquivo binário que contém os códigos de um programa que pode ser executado pelo sistema operacional.
  • .JPG Arquivo de imagem no formato JPEG (Joint Photographic Experts Group).
  • .BMP Arquivo de imagem no fotmato BITMAP.
  • .PNG Arquivo de imagem no formato Portable Network Grafics.
  • .TXT Arquivo texto de uso geral.
  • .DLL Arquivo binário de link dinâmico, contém funções que podem ser carregadas e usadas por um ou mais programas.
  • .DOC Documento do MS-Word ou outro editor de textos.
  • .XLS Arquivo de Planilha Eletrônica do MS-Excel.
  • .PPT Arquivo de apresentação do MS-PowerPoint.
  • .ZIP Arquivo compactado no padrão ZIP, armazena um ou mais arquivos.
  • .RAR Arquivo compactado no padrão proprietário RAR, criado pelo russo Eugene Roshal (RAR = Roshal ARquive).
  • .XML Arquivo texto que contém dados estruturados usando XML (eXtended Markup Language).
  • .XSD Arquivo texto que contém uma regra de validação ou modelo de troca de dados em XML.
  • .DBF Arquivo de dados, normalmente nos formatos DBASE III e posteriores.
  • .CDX Arquivo de índice de dados, normalmente relacionado a dados em arquivo DBF.
  • .DTC Arquivo de dados no formato c-Tree, usados no AdvPL

Para mais extensões e seus usos mais comuns, consulte “https://pt.wikipedia.org/wiki/Extens%C3%B5es_de_ficheiros“.

Sistema de Arquivos e Diretórios (ou Pastas) no Windows

O sistema de arquivos do Windows herdou a estrutura organizacional e princípios do sistema de arquivos do MS-DOS. Cada unidade de disco instalada na máquina recebe uma letra maiúscula do alfabeto como identificador de unidade, seguido do símbolo “:” (dois pontos). As duas primeiras unidades de disco do computador, antes de existir disco rígido, eram as unidades “A” e “B”. Por isso que, até hoje, quando você abre o Prompt de Comando do sistema operacional no Windows, ou o Windows Explorer, a sua unidade de disco rígido é mostrada como “C:”, e as demais partições de disco e outras unidades (CD-ROM, Pen-Drive,etc) seguem em sequência.

A estrutura de arquivos do Windows é baseada em pastas — ou diretórios, como uma árvore. O primeiro diretório da árvore, ou “raiz”, e representado pela barra inversa “\”. A partir de qualquer diretório, você pode ter um ou mais arquivos, e um ou mais diretórios. Vamos entender que um diretório é um espaço nomeado dentro da estrutura que permite você guardar mais arquivos e outros diretórios. Dentro de qualquer pasta, você não pode ter mais de um arquivo ou pasta com o mesmo nome e extensão. Porém você pode ter arquivos com mesmo nome e extensão em pastas diferentes.

O Windows criou uma padronização, que apresentou pequenas mudanças ao longo das últimas 7 ou 8 versões, mas a base é a mesma. A partir da pasta Raiz da unidade de disco rígido (C:\) existe uma pasta chamada “Arquivos de Programas”, onde dentro dela existem pastas para as aplicações e programas instalados no equipamento, uma pasta “Usuários”, para registrar as informações de perfil e dados de aplicativos de cada usuário do equipamento, e a pasta “Windows”, que armazena um enorme grupo de outras pastas, que contém todos os programas, extensões, drivers e demais arquivos do Sistema Operacional.

Cada arquivo de cada pasta do computador pode ser endereçada ou identificada por um identificador de caminho completo (Full Path), composto pela unidade de disco, estrutura de pastas, e o nome do arquivo. Por exemplo, o arquivo nomeado “mstsc.exe” (Remote Desktop Connection Client), que fica na pasta “System32”, que fica na pasta “Windows” a partir do Drive “C:”, pode ser endereçado como “c:\Windows\System32\mstsc.exe”.

O sistema de arquivos de forma geral permite bem mais recursos e operações, e outras formas de endereçamento determinadas por cada sistema operacional. No Linux, por exemplo, o sistema de arquivos foi herdado dos sistema Unix, onde qualquer dispositivo pode ser endereçado como um arquivo. Não há “letras” de unidade de disco, existem “devices” nomeados, utilizando prefixos específicos para acessar cada tipo de dispositivo, e outros recursos como links dinâmicos para arquivos e pastas, que recentemente também foram implementados no Windows.

Dentro do arquivo

Mesmo que todos os arquivos do disco contenham “Bytes” dentro, arquivos que contenham por exemplo uma imagem ou fotografia, possuem uma regra de armazenamento e interpretação destes bytes. Por exemplo, vamos pegar um formato de imagem mais “antigo”, como o BITMAP (Ou Mapa de Bits), usado no Windows e no (extinto) OS\2.

Na Wikipedia, acesse o link “BMP file format” (https://en.wikipedia.org/wiki/BMP_file_format), veja a seção “File Structure“. Nela é descrito como é o formato de armazenamento interno de uma imagem em um arquivo BMP. O arquivo começa a ser lido do primeiro byte, e existem sequências de bytes de tamanho fixo que indicam informações de como os demais dados estão dispostos, e a partir de um determinado ponto, os blocos de bytes possuem tamanhos variáveis, de acordo com as definições anteriormente especificadas no arquivo. Um arquivo de dados em formato DBF possui uma estrutura similar, onde no início do arquivo os primeiros blocos de bytes identificam quais as informações que estão armazenadas no arquivo.

Nível de complexidade de operações com arquivo

Agora, imagine o quão complexo seria se você tivesse que saber como as informações estão dispostas dentro do arquivo para poder acessá-las? Sim, daria um valente trabalho…. cada arquivo possui uma estrutura interna, e um erro ao ler ou gravar um dado pode corromper a informação no arquivo.

PAra tornar este processo mais fácil, as linguagens de programação que trabalham nativamente acesso a dados oferecem mecanismos de mais “alto nivel”, onde através de funções ou classes, você aciona operações como “ler um registro”, “posicionar em um registro”, “inserir um novo registro”, “alterar os dados de um registro”. Outra abordagem muito utilizada é usar um segundo software, um SGBD (Sistema Gerenciador de Banco de Dados), usando SQL (Structured Query Language), através das quais você monta sentenças praticamente “literais” e solicita ao SGDB a operação desejada, como “SELECT * FROM SA1010 WHERE A1_ATIVO = ‘S’ ORDER BY A1_NREDUZ” (Selecione todos os registros da tabela SA1010 onde o campo (coluna) A1_ATIVO seja igual a letra ‘S’ maiúscula, com o resultado ordenado pelo campo A1_NREDUZ).

Se você precisa trabalhar com um tipo de arquivo que contém imagens, e quer aplicar na imagem um efeito, como mudança de brilho ou cor, você pode escrever uma API sua, abrir o arquivo em modo ‘binário’ (lendo diretamente seu conteúdo em bytes para a memória), entender como aquele mapa de bytes representa a imagem e suas cores, e aplicar o efeito desejado recalculando as definições de cores. Ou, você pode usar um componente pronto, uma biblioteca de funções fornecida com a linguagem ou uma biblioteca de terceiros (existem bibliotecas pagas e gratuitas, com código aberto (Open Source) e código fechado, para diversas linguagens de programação. Naturalmente, vai ser bem mais fácil e rápido usar uma biblioteca pronta. Basta você pesquisar se a escolha em foco atende todas as suas necessidades e não tem alguma restrição que inviabilize seu uso no cenário onde a mesma será aplicada.

Conclusão

A introdução está ficando “longa”, mas uma vez assimilada esta base comum de conhecimento, ela serve para tudo o que foi construído sobre ela, apenas existindo algumas características e comportamentos diferenciados para algumas plataformas ou sistemas, o resto é “farinha do mesmo saco”. Quem gosta de TI, Análise de Sistemas, Engenharia de Software, Programação e ciências correlatas, precisa ter sede e vontade de aprender, e de se manter atualizado, sempre. Mesmo após tornar-se um especialista, é preciso estar de olhos e ouvidos abertos para a evolução constante em torno da área como um todo.

Novamente, agradeço a todos pela audiência, e desejo a vocês TERABYTES de sucesso 😉

Até o próximo post, pessoal 😀

Referências

BYTE. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Byte&oldid=43771720>. Acesso em: 2 nov. 2015.

ASCII. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=ASCII&oldid=43771464>. Acesso em: 2 nov. 2015.

Extended ASCII. (2015, April 1). In Wikipedia, The Free Encyclopedia. Retrieved 03:19, November 2, 2015, from https://en.wikipedia.org/w/index.php?title=Extended_ASCII&oldid=654535698

RAR (file format). (2015, October 30). In Wikipedia, The Free Encyclopedia. Retrieved 19:19, November 14, 2015, from https://en.wikipedia.org/w/index.php?title=RAR_(file_format)&oldid=688294797

General overview of the Linux file system. In The Linux Documentation Project. Retrieved 17:27, November 14, 2015, from http://www.tldp.org/LDP/intro-linux/html/sect_03_01.html

Introdução a Informática – Parte 01

Introdução

“Informática é um termo usado para descrever o conjunto das ciências relacionadas ao armazenamento, transmissão e processamento de informações em meios digitais, estando incluídas neste grupo: a ciência da computação, a teoria da informação, o processo de cálculo, a análise numérica e os métodos teóricos da representação dos conhecimentos e da modelagem dos problemas. Mas também a informática pode ser entendida como ciência que estuda o conjunto de informações e conhecimentos por meios digitais.” (1)

Em dois artigos anteriores, eu postei algo sobre Programação e sobre Análise de Sistemas. Seguindo a mesma linha, de “desmistificar” a aparente complexidade deste universo, eu reparei que alguns conhecimentos que eu considero como “base” para o entendimento dos sistemas computacionais são pouco abordados, ou são vistos com uma superficialidade muito grande.

E boa parte do que temos hoje em tecnologia de sistemas e processamento de dados é uma evolução natural desta base. Logo, eu considero fundamental saber um pouco mais da origem das coisas, e da evolução histórica da computação no último século, para entender um pouco mais no que ela é baseada, e por quê (e como) ela evoluiu a saltos gigantescos desde então.

Um pouco de História

Fiz meu primeiro curso de programação com 13 anos de idade, e meu primeiro curso de nível profissional de informática com 15 anos, em uma escola de informática em Botucatu, fundada por um ex-técnico de Software da IBM e sua esposa. Antes de sentarmos na frente de um IBM-PC e ligá-lo pela primeira vez, tivemos uma semana de aula sobre “Introdução a Informática”, para que todos tenham uma noção de o que é um micro-computador, o que têm dentro, e pelo menos uma noção de como as partes internas funcionam.

Particularmente eu achei aquilo extremamente interessante, pois na semana seguinte, quando fomos para a frente dos computadores, mesmo sem ter visto um, nós sabíamos o que precisava ser feito para ligá-lo, e o que acontecia desde o momento que você apertou o botão “ON” até aparecer o “Prompt” de comando do sistema operacional ( na época, “A:\>” ).

Seguindo esta linha, estou dando inicio a uma série de Posts, com a TAG “Introdução a Informática”, onde eu vou tentar trazer esse conhecimento para vocês, com a maior riqueza de detalhes que a minha memória permite, estendendo esta abordagem até os micro-computadores dos dias de hoje. Recomendo essa literatura a todos que estão iniciando seus estudos em computação, e estendo o convite a todos que tenham alguma curiosidade sobre isso.

A necessidade é a mãe da invenção

A necessidade de mensurar coisas é tão antiga quanto a história da civilização. Uma vez que o homem aprendeu a cultivar a terra, por volta do período neolítico (8 mil A.C.). Este período é considerado um importante avanço social, econômico e político, onde o homem descobre que é muito mais vantajoso agir em grupo do que individualmente.

Com a subsistência mais fácil, não tendo que sair para caçar todos os dias, os neolíticos tinham mais tempo para interagir entre si, então desenvolveram as primeiras atividades de lazer, descobrindo a arte da cerâmica e depois como comercializá-la. O surgimento da escrita e a criação do Estado pelas primeiras da Antiguidade marcou o final da era neolítica.

Desde então, sempre existiu a necessidade de mensurar coisas. Quantidade de sementes, frutos produzidos, criação de unidades monetárias (dinheiro) para facilitar relações comerciais e afins. Embora a matemática conhecida hoje — usando algarismos indo-arábicos (1234567890), com ponto decimal e frações date de 1000 D.C., a utilização dessa representação em algarismos decimais é datada de 2 A.C.

O Ábaco, um instrumento de cálculo que data de 5500 A.C., ele é considerado como uma extensão do ato natural de contagem com os dedos. E também usa o sistema decimal (onde usamos 10 algarismos para representar um número). O Ábaco ainda é usado hoje para ensinar a crianças somar e subtrair.

Invenções mecânicas

Buscando dar mais precisão, segurança e velocidade aos processos de operações numéricas, várias invenções mecânicas foram surgindo ao longo do tempo, como a máquina de operações de Pascal (Século XVII), o Tear de cartões perfurados de Jacquard (Século XVIII), o projeto da máquina analítica de Babbage, até a máquina eletromecânica de Herman Hollerith, um equipamento que usava cartões perfurados usado para calcular o censo populacional dos EUA de 1890 em APENAS um ano — o censo da década anterior demorou 7 anos … Através de um painel de fios em seu tabulador 1906 Type I, foi possível executar diferentes trabalhos sem a necessidade de ser reconstruído. Estes foram considerados os primeiros passos em direção à programação. Em 1911, quatro corporações, incluindo a firma de Hollerith, se fundiram para formar a Computing Tabulating Recording Corporation. Sob a presidência de Thomas J. Watson, ela foi renomeada para IBM (“International Business Machines”).

O papel da eletricidade

Mesmo sendo conhecidos desde a Grécia antiga, os fenômenos magnéticos e os fenômenos elétricos somente começaram a ser estudados e explicados cientificamente a partir do século XVII. No início do século XIX, Hans Christian Ørsted obteve evidência empírica da relação entre os fenômenos magnéticos e elétricos. A partir daí, os trabalhos de físicos como André-Marie Ampère, William Sturgeon, Joseph Henry, Georg Simon Ohm, Michael Faraday foram unificados por James Clerk Maxwell em 1861 por meio de equações que descreviam ambos os fenômenos como um só: o fenômeno eletromagnético. Esta unificação foi uma das grandes descobertas da física no século XIX. Com uma teoria única e consistente, que descrevia os dois fenômenos anteriormente julgados distintos, os físicos puderam realizar vários experimentos prodigiosos e inventos úteis, como a lâmpada elétrica (Thomas Alva Edison) ou o gerador de corrente alternada (Nikola Tesla)

Entre 1930 e 1940, George Stibitz, um pesquisador da Bell Labs percebeu que os relés eletromecânicos usados em centrais telefônicas poderiam ser usados para realizar operações sequenciais, e desenvolveu os primeiros circuitos de lógica digital usando relés. Os projetos de computadores usando relês da Bell foram usados pelos EUA para fins militares, usando 1400 relês e com memória de 10 números, eles eram usados para processamento de cálculos de direcionamento de artilharia anti-aérea. Os trabalhos de George Stibitz foram baseados nos princípios de álgebra booleana, concebidos por George Boole quase um século antes, mas que até o momento não tinham aplicação prática.

Com o surgimento da válvula termo-iônica, como uma forma de modulação direta de energia, bem mais rápida que um relê, todo o conhecimento adquirido até então foi aproveitado para a evolução desta tecnologia. Porém, as válvulas queimavam com muita facilidade, e consumiam muita energia para funcionar. Mas a velocidade de chaveamento de energia era tão mais rápida que um relê, que logo surgiram os primeiros computadores usando esta tecnologia. A universidade de Iowa em 1942 montou um dos primeiros computadores valvulados, não programável, mas funcional para resolver equações de primeiro grau.

O primeiro computador totalmente eletrônico e programável foi o ENIAC (Electronic Numerical Integrator And Computer). Construído durante a segunda guerra mundial na universidade da Pensilvânia, ficou pronto em 1946. Usava mais de 17 mil válvulas, consumia 150 kW, e pesava 27 toneladas …. mas era milhares de vezes mais rápido do que qualquer computador a relê. Por exemplo, o computador Harward Mark II (1947), que usava relês de alta velocidade, operava a uma frequência de 8 Hz (ciclos por segundo). O ENIAC operava a uma frequência vertiginosa de 5 mil Hz (5 KHz), o que permitia ele calcular aproximadamente 357 multiplicações de números de 10 dígitos por segundo. Hoje, um processador de um SmartPhone ultrapassa facilmente 1 GHZ ( Um BILHÃO de ciclos por segundo).

Onde estão os “zeros” e “uns” ?

O sistema de numeração binário (base 2), usa apenas dois algarismos para representar um valor: ‘0’ ou ‘1’. Em informática, a menor unidade de armazenamento de um dado é o “bit”, que coincidentemente também armazena os valores ‘0’ ou ‘1’. Quando agrupamos 8 bits, temos um Byte ( também chamado de “octeto” de bits). Utilizando um BIT, armazenamos 2 valores diferentes (0 ou 1). Usando 2 bits, armazenamos quatro sequências de bits diferentes ( 00, 01, 10 e 11). Usando 8 Bits (um Byte) podemos armazenar 2 ^ 8 sequencias diferentes, ou seja, 256 combinações diferentes de 0 e 1 (de 00000000 a 11111111). Convertendo isso para numeração decimal (ou base 10), temos 256 valores diferentes (entre 0 e 255).

E por que eu preciso saber disso ?

Bem, meu chapa … toda a base de programação e processamento de dados são sequencias de zeros e uns. Isto somente vai ser quebrado com a computação quântica, que surgiu como teoria a alguns anos, e atualmente os estudos na área estão tornando possível a criação do Hardware para permitir este tipo de processamento. A computação quântica deve quebrar paradigmas em campos de aplicação onde as máquinas tradicionais (utilizando lógica booleana) chegaram em um limite tecnológico “físico” de desempenho. A menor unidade de informação em um computador é um Byte, que nada mais é do que um agrupamento de 8 bits. Logo, todo o armazenamento de dados e fluxo de informações entre os componentes de um computador e seus componentes auxiliares (ou periféricos) serão sequências ou blocos de zeros e uns 😉

E onde entra a tal da “programação” ?

Programar significa fornecer uma lista de instruções para realizar uma determinada tarefa. Quando você compra um produto desmontado, que vêm com um manual de instruções de montagem, ele descreve em linguagem natural a lista de passos para você montar o produto. Isto pode ser considerado um programa, que ao ser executado na ordem certa e com os materiais corretos, resulta no produto montado.

Um programa de computador é exatamente isso. Qualquer programa de computador é composto de uma sequência de instruções e dados, regidos por uma gramática e um conjunto de operações especificas, cujo objetivo final é enviar ao processador do equipamento uma sequência de códigos binários que representem a sequência de processamento a ser executada. Nesta sequência de instruções podemos interagir com os periféricos do equipamento, como a interface de vídeo, o teclado, uma impressora, uma unidade de armazenamento de dados, etc.

Conclusão

Este tópico é só para “abrir o apetite”. No próximo vamos dar uma boa olhada no que tem dentro de um computador, o que é um “Sistema Operacional”, por quê precisamos de um, e depois o que acontece quando a gente liga um equipamento.

Desejo a todos uma boa leitura, e TERABYTES de sucesso 😀

Até o próximo post, pessoal 😉

Referências

INFORMÁTICA. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Inform%C3%A1tica&oldid=43615873>. Acesso em: 12 out. 2015.

ÁBACO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=%C3%81baco&oldid=43500340>. Acesso em: 12 out. 2015.

ALGARISMOS INDO-ARÁBICOS. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Algarismos_indo-ar%C3%A1bicos&oldid=43058223>. Acesso em: 12 out. 2015.

ELETROMAGNETISMO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Eletromagnetismo&oldid=43478266>. Acesso em: 12 out. 2015.

HERMAN HOLLERITH. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Herman_Hollerith&oldid=42754476>. Acesso em: 12 out. 2015.

George Stibitz. (2015, August 15). In Wikipedia, The Free Encyclopedia. Retrieved 07:19, October 12, 2015, from https://en.wikipedia.org/w/index.php?title=George_Stibitz&oldid=676218293

Harvard Mark II. (2014, September 19). In Wikipedia, The Free Encyclopedia. Retrieved 07:37, October 12, 2015, from https://en.wikipedia.org/w/index.php?title=Harvard_Mark_II&oldid=626186726

ENIAC. (2015, October 12). In Wikipedia, The Free Encyclopedia. Retrieved 07:44, October 12, 2015, from https://en.wikipedia.org/w/index.php?title=ENIAC&oldid=685327153

SISTEMA DE NUMERAÇÃO BINÁRIO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Sistema_de_numera%C3%A7%C3%A3o_bin%C3%A1rio&oldid=43459004>. Acesso em: 12 out. 2015.

Outras referências

http://www.infoescola.com/pre-historia/periodo-neolitico/

http://www.newtoncbraga.com.br/index.php/curiosidades/4856-cur008

http://www.techtudo.com.br/artigos/noticia/2012/09/computadores-a-valvulas.html

O profissional de TI

Introdução

Este post é dedicado a todos os profissionais da área de Tecnologia da Informação, inclusive aos futuros candidatos e interessados em ingressar neste mundo. Espero que estes poucos parágrafos sirvam de inspiração para todos que com ele tomarem contato.

Definição da Tecnologia da Informação

A Tecnologia da Informação (TI) pode ser definida como o conjunto de todas as atividades e soluções providas por recursos de computação que visam permitir a produção, armazenamento, transmissão, acesso, segurança e o uso das informações. (*Wikipedia). Por tão ampla definição, um profissional da área precisa ter uma boa base de conhecimentos gerais sobre a aplicação da tecnologia, e optar por especializar-se em uma ou mais áreas relacionadas ao uso da tecnologia.

Competências

O sucesso na carreira é determinado pelas competências e “conjuntos de habilidades”, ou seja, toda a gama de ativos intelectuais e comportamentais, particularmente aqueles que permitem os relacionamentos dentro da organização e são canalizados para os clientes. (*Engineer Top Management)

Traduzindo pro bom português: Amigo, tudo o que você sabe e é capaz de fazer têm peso. Não apenas o que você sabe em Hardware ou Software, conhecimento acadêmico ou prático, mas também todas as demais habilidades. Relacionamento, apresentação pessoal, gerenciamento de conflitos e expectativas, resolução de problemas, boa oratória, correta aplicação do idioma (falado e escrito), etc…

Cultivando suas competências

Muitas pessoas têm um talento “nato” para alguma coisa. E normalmente pessoas de sucesso usam deste talento para conquistar seu lugar ao sol. O que nem todos se dão conta, é que não basta ser extremamente bom em uma coisa. Você também pode desenvolver outras capacidades, além daquelas que você têm mais facilidade ou predisposição em aprender. Basta você se interessar por isso, e dedicar-se.

Ninguém nasceu sabendo falar, amarrar os sapatos, escovar os dentes, fazer operações matemáticas, dirigir um automóvel, entre muitas outras coisas. Aquilo que não se sabe, se aprende. Pode levar mais ou menos tempo, pode ser mais fácil para uns e mais difícil para outros. Tem medo de falar em público ? Existe curso de oratória. Têm dificuldade em se organizar, têm curso pra isso também. Para quem têm facilidade em ser auto-didata, a Internet é um prato cheio de recursos e fontes de pesquisa, livros, manuais e cursos inteiros gratuitos. Basta priorizar seu tempo para fazer os cursos do seu interesse ou necessidade. Caso você não seja tão autodidata assim, existem cursos presenciais ou mesmo instrutores particulares. E, mesmo sendo um pouco mais difícil fazer um curso a distância, a capacidade de mídia na Internet permite cursos tão interativos, com tutores com atendimento via chat e vídeo, a sala de aula é virtual, mas com tanta interação que parece uma sala real.

O esforço e seu mérito

Ao cursar os últimos anos do ensino médio, uma colega de sala destacava-se por suas notas altas em todas as matérias e atividades, uma jovem muito inteligente. Uma aula da grade de ensino, Desenho Geométrico e Trigonometria, era ministrada por uma freira, que apesar de ter docência nesta matéria, não se preocupava em explicar alguns fundamentos dos assuntos abordados, deixando muitas dúvidas e lacunas entre uma aula e outra.

Como eu tinha muita facilidade em absorver o conhecimento da matéria, e conseguia entender com relativa facilidade o material didático, após o resultado da primeira prova do bimestre, alguns amigos da minha sala me perguntaram se eu não poderia explicar a matéria novamente e tirar essas dúvidas. Eu pedi autorização à diretora para usar a sala de aula no primeiro horário da tarde uma vez por semana, inicialmente para 3 ou 4 colegas.

Na terceira ou quarta semana, dos 40 alunos da sala, mais de 30 estavam vindo às aulas de reforço. Para meu espanto, a aluna mais inteligente da sala estava presente. Eu não entendi … por que a aluna mais inteligente da sala precisa de aula de reforço? Após a aula, eu fui conversar com ela, e lhe perguntei exatamente isso. O que ela me respondeu eu nunca mais esqueci:

“— Eu não sou a aluna mais inteligente da sala. Eu sou esforçada. Mesmo assistindo a todas as aulas na primeira carteira, e prestando atenção na matéria, boa parte do que foi explicado eu não entendo logo de primeira. Todos os dias eu chego em casa, e preciso pegar os livros, e ler tudo de novo. As vezes eu preciso ler duas ou três vezes, fazer e refazer os exercícios, e mesmo assim na próxima aula eu vou na mesa do professor tirar uma dúvida ou pedir uma explicação mais detalhada sobre alguns pontos que eu não entendi da matéria. Todos me consideram inteligente por que eu tiro boas notas nas provas, mas para conseguir isso, eu preciso dedicar várias horas do dia para estudar e rever as matérias. Se eu fosse mesmo tão inteligente, eu não precisaria fazer todo esse esforço pra entender as coisas. O que faz a diferença, é que eu sei das minhas limitações, mas tenho vontade de aprender. Então eu me dedico, o quanto for necessário, para aprender e entender o que está sendo ensinado.” ( Rebeca de Campos Leite )

Aprendendo a aprender

A cada dia novos conhecimentos são gerados, e outros são reciclados, em qualquer área de atuação. Acredito que a área de TI seja uma das mais voláteis e em constante mutação, então elas exigem que o profissional da área esteja sempre tomando conhecimento e contato com as novas tecnologias e abordagens para as soluções existentes e em desenvolvimento para lidar com os problemas contemporâneos e constantes necessidades que se apresentam a cada novo instante. É importante gostar de estudar e aprender a absorver novos conhecimentos, valendo-se da experiência adquirida com os conhecimentos já adquiridos.

Não se prenda a uma tecnologia ou a um conceito. Não existe uma solução mágica universal que sirva para todos os casos, normalmente quebramos um problema muito grande em problemas menores, e várias alternativas podem ser apresentadas para cada um. Todas trazem implicitamente um custo/benefício, e têm seus prós e contras. Entender isso e saber escolher é um diferencial muito importante, e isto se aplica não somente a um sistema informatizado, mas também se aplica a decisões de natureza pessoal.

Conclusão

Não basta saber e aprender, é preciso utilizar e entender a melhor forma de utilizar seu conhecimento e sua capacidade, bem como manter-se atualizado, e expandir suas capacitações. Se você realmente quer avançar na sua vida pessoal e profissional, estes são os melhores conselhos que eu posso te dar 😉

Até a próxima, pessoal 😀

Referências

TECNOLOGIA DA INFORMAÇÃO. In: WIKIPÉDIA, a enciclopédia livre. Flórida: Wikimedia Foundation, 2015. Disponível em: <https://pt.wikipedia.org/w/index.php?title=Tecnologia_da_informa%C3%A7%C3%A3o&oldid=42589522> Acesso em: 24 jun. 2015.

Dicionário – Enginheer Top Management. Artigo sobre Capacidade Intelectual. Disponível em <http://www.eigenheer.com.br/candidatos/dic2.html> Acesso em: 24 jun. 2015.

Desmistificando a análise de sistemas

Prefácio

Nada como uma linda manhã de Domingo para estar inspirado e escrever um novo artigo. O título foi a ultima coisa a ser definida. Terminado mais um ano, em 04/01/2015 completei mais um aniversário na Totvs, são 16 anos completos, com muitos desafios, sempre vistos como oportunidade de crescimento, e muitas realizações, cada uma com um sabor especial. Agora estou curtindo alguns dias de férias, recarregando as baterias para entrar no 17o ano, com mais desafios, aprendizados e compartilhamento de experiências, buscando novas realizações.

Hoje o post não têm códigos de máquina, nenhum programa. Em um post anterior, “Desmistificando a programação”, eu tentei em algumas palavras mostrar que programar um computador é mais simples do que parece a primeira vista. O post de hoje complementa o artigo inicial, e estende a sua abrangência até a análise de sistemas. Novamente, afirmo que isto não é um bicho de 7 cabeças 🙂

Introdução

No último século, nunca houve tanta evolução em comparação com qualquer outro período da história da humanidade. Não me refiro apenas a informática, computação ou tecnologia da informação, mas em todas as áreas. A conquista do espaço, os avanços da medicina, o estudo do genoma humano, erradicação de algumas doenças, globalização, a revolução industrial, muita coisa para colocar em apenas um parágrafo.

O uso da eletricidade e as pesquisas realizadas para descobrir mais formas de utilizá-la levaram a um avanço desproporcional da tecnologia da informação e a outras ferramentas e recursos utilizados em todas as áreas. Pra ser um pouco mais específico, após a descoberta de materiais semicondutores, capazes de modular corrente elétrica em baixa voltagem e com tamanho cada vez mais reduzido, foram criados os mais diversos tipos de equipamentos. E estes evoluiram assustadoramente nos ultimos 50 anos.

Computadores

Um computador que ocupava um andar de um prédio, foi reduzido até ficar do tamanho de um fogão doméstico, e foi crucial para completar com sucesso a primeira missão tripulada para o espaço, que conseguiu sair da órbita da Terra, chegar até a lua, descer no asteroide, voltar novamente ao espaço e retornar em segurança de volta à Terra. Outro dia assisti a um documentário da History Channel que abordou os detalhes dessa proeza, inclusive entrevistou algumas pessoas ainda vivas atualmente, que participaram direta ou indiretamente neste projeto.

Cada equipe envolvida tinha desafios inéditos e realmente difíceis para fazer o projeto dar certo. Desafios de concepção, testes, validações e integrações, um universo de possibilidades a ser avaliado, muitas das soluções encontradas tiveram que ser re-feitas várias vezes, até que fosse encontrada uma alternativa funcional, e torná-la viável. Mas todas elas tinham um ponto em comum: Foi estabelecido um alvo, uma meta a ser realizada. E, a partir dela, quais as etapas necessárias para que esta meta fosse atingida. Primeiro definimos o que queremos como resultado, para então trabalhar em como fazer este resultado ser atingido.

Cozinhar arroz

E esta linha de raciocínio aplica-se praticamente a toda e qualquer realização, para qualquer objetivo. Partindo de um exemplo simples, vamos determinar um objetivo: Eu quero arroz no almoço de hoje. Detalhando um pouco mais o objetivo, deve ser arroz branco comum, não parbolilizado ou integral, apenas arroz tipo 1, e é para o almoço de hoje, e necessariamente eu quero cozinhar esse arroz. Para fazer esta tarefa, eu preciso enumerar os insumos necessários para cozinhar arroz, e as etapas necessárias para uso destes insumos, para no final da execução de todas as etapas, meu resultado seja “arroz cozido”.

Logo, vou precisar pelo menos de um recipiente de preparo (panela), uma fonte de calor (fogão), acessórios de preparo (copo para medida, uma colher), e é claro, vou precisar de arroz, água e temperos. E, na lista de tarefas para preparar o arroz, eu preciso definir todas as etapas de preparo, como lavar o arroz, ferver água, misturar o arroz com os temperos, colocar para cozinhar, etc. São todos procedimentos simples, mas é necessário saber cada um deles e executá-los corretamente para que o resultado seja arroz branco soltinho e apetitoso.

E, como todo o problema simples esconde um universo de problemas menores, qualquer etapa trocada ou mal executada interfere no resultado. Se a quantidade de água não for correta, ou o arroz fica cru ou fica “empapado”, se a panela não for tirada do fogo na hora certa o arroz fica cru ou queima no fundo. E, se faltar algum insumo ou algum recurso usado para fazer o arroz apresentar problema, você nem chega perto do resultado… Por exemplo, o fogão quebrou durante o cozimento, ou acabou o gás, ou não têm arroz no armário e o mercado está fechado.

Da cozinha pro teclado

Qualquer semelhança entre fazer arroz, escovar os dentes, e projetar um sistema informatizado não é mera coincidência. Tirando o uso final do resultado (você não vai colocar o sistema em um prato e almoçá-lo), as etapas básicas são as mesmas de qualquer atividade. O que fatalmente muda é a quantidade de etapas e os tipos de insumos aplicados.

Todas estas tarefas têm em comum a necessidade de levantar o que precisa ser feito, como deve ser feito, e se todos os insumos necessários existem, estão disponíveis e em condições de uso, e podem envolver um plano de contingência para cobrir as maiores possibilidades de fracasso da tarefa. Se o arroz der errado, é bom você ter um miojo guardado no armário, para não ficar com fome.

Projetando, analisando e desenvolvendo

Na construção de um um sistema informatizado, ou apenas no desenvolvimento de uma funcionalidade de um sistema, primeiro você precisa saber exatamente qual é o resultado esperado, depois avaliar as possibilidades de obter este resultado, verificar se a possibilidade escolhida é aplicável, analisar e aplicar a possibilidade escolhida. Dado o número de varíaveis, procedimentos, fluxo da informação e componentes deste processo, a atividade de análise e desenvolvimento de sistemas pode parecer num primeiro momento muito complexo, mas cada etapa e cada necessidade pode ser dividida em fases e etapas menores, onde algumas etapas podem ser feitas ao mesmo tempo, e quando se tem mais de uma pessoa no mesmo projeto, algumas etapas podem ser paralelizadas.

Esta lógica é praticamente instintiva, nós aplicamos ela sem perecber em muitas atividades corriqueiras do nosso cotidiano. Sim, a tal da lógica de programação, é tão simples quanto isso. Para escovar os dentes, precisamos conhecer as etapas do processo, experimentar o processo, fazer alguns ajustes na forma de execução ou na sequência ou no tempo de cada etapa, após algumas tentativas, a execução do processo torna-se tão natural, que nós nem precisamos mais pensar nas etapas, elas são realizadas naturalmente. Nós não nascemos sabendo escovar os dentes, nós aprendemos isso. Em um determinado momento, nós apredemos o que é a escova, pra que serve, qual é a maneira certa de segurar a escova, o que precisamos para usá-la, e como usá-la da melhor forma. Não é nada diferente das etapas de análise e desenvolvimento, ou aprendizagem e uso de uma linguagem de programação. O que pode tornar este aprendizado naturalmente mais difícil é a quantidade de elementos envolvidos e a quantidade de propriedades destes elementos.

Conclusão

Desde o princípio da informática, um bit têm apenas dois valores lógicos: 0 (desligado) ou 1 (ligado), e a utilização de uma corrente elétrica para a representação binária em um ponto de um circuito é este ponto estar energizado (1) ou não estar energizado (0). Os conceitos de processo, sistemas operacionais, interface, memórias (temporaria e persistente) não mudou desde a sua origem. Tudo o que temos hoje é resultado da evolução deste model-base. Conhecendo bem a base deste modelo, definitivamente torma mais fácil entender o que ele é e como ele funciona.

A cada novo avanço da tecnologia da informação, a utilização de aplicações em computadores têm se tornado cada vez mais intuitiva, você não precisa aprender ou endender muito como o seu celular funciona por dentro, para ser capaz de fazer uma ligação, outirar uma foto e publicá-la no Facebook, ou para jogar nele. Então, cada vez menos pessoas sabem o que acontece por trás da tela do computador, celular ou tablet. Muitos cursos de informática ensinam como você opera algumas aplicações dentro de um sistema operacional, ou mesmo como operar um sistema operacional, mas poucos entram nos méritos de como isso acontece por dentro do equipamento.

Se você vai ser um operador da máquina ou de seus aplicativos, você não precisa efetivamente saber disso em maior profundidade, mas para programar um equipamento, é necessário aprofundar-se um pouco mais, e isto realmente abre seus horizontes e a sua forma de enxergar um sistema informatizado, e eu garanto que absorver este conheicmento faz muita diferença. Normalmente você estuda estes aspectos em maior profundidade fazendo um curso superior de tecnologia em análise e desenvolvimento de sistemas, e em maior profundidade em ciência da computação.

Quanto mais você conhece como o equipamento funciona, e quais são as melhores práticas de como utilizá-lo, as escolhas das alternativas para a solução que você busca tornam-se mais fáceis. Um desenvolvedor de sistemas deve gostar de aprender e não ter medo de desafios, pois cada novo desafio envolve novos aprendizados e extensões do seu conhecimento.

Até o próximo post, pessoal 😉

Desmistificando a programação

Para você, que está iniciando ou se interessa em programação, mas acha que isso é coisa de outro mundo, eu tenho uma notícia muito boa: Pode parecer difícil, mas na verdade não é. A complexidade de um sistema começa a surgir na integração de suas partes, não exatamente em programá-lo. Este tópico é muito interessante para quem está começando agora a interessar-se por programação, e vai lhes dar uma noção do que é um programa de computador, e inclusive vai lhe dar as instruções parar fazer um programinha bem simples, que pode ser executado em qualquer navegador de internet ( Web Browser ) instalado no seu computador.

Cada linguagem de programação é apenas um dialeto de instruções, que possui uma gramática e sintaxe próprias, como se fosse um outro idioma. No final das contas, visto de forma muito simplista, um programa de computador não passa de uma lista de instruções para ler, transformar ( ou processar ) informações, composta de instruções e recursos fornecidos por uma linguagem ou ambiente, para realizar uma tarefa.

Há quase 20 anos atrás, tive a oportunidade de ministrar aulas de Informática, foi um capítulo a parte na minha vida de programador, muito gratificante ao ver como os alunos admiraram a simplicidade da abordagem dos conceitos de programação e a satisfação minha e deles de entender como um programa de computador funciona.

Um ex-professor e amigo meu, Sr. Regginato, foi um dos professores que me introduziu no mundo do IBM-PC e dos conceitos da informática e do processamento de dados, em uma escola que ele montou junto com sua esposa em Botucatu, interior de São Paulo. Acho que foi dele a frase “Programar um computador é como escovar os dentes.”

Parece loucura, mas é exatamente isso. Imagine que você precise escrever uma lista de passos para ensinar uma pessoa a escovar os dentes. como você faria ? Naturalmente, você deverá criar uma espécie de manual com os passos para realizar esta tarefa, com um mínimo de detalhes que tornem o processo intuitivo, e naturalmente escrito em um idioma que a pessoa conheça. Por exemplo:

Para escovar os dentes:

1) Vá até o banheiro, abra o espelho e localize a sua escova de dentes.
2) Verifique se a escova de dentes está no espelho.
3) Caso não esteja, verifique se ficou sobre a pia.
4) Verifique se têm pasta de dentes no banheiro, e se têm água na pia.
5) Caso algum dos itens acima não esteja pronto para uso, não é possível escovar os dentes.
6) Pegue a escova de dentes, abra a torneira e molhe um pouco a cabeça da escova.
7) Pegue a pasta de dentes, abra-a e posicione a saída do tubo na cabeça da escova.
8) Pressione um pouco o final do tubo até que saia pasta suficiente para colocar sobre as cerdas da escova.
9) Feche a pasta de dentes e guarde-a no espelho.
10) Insira a escova na boca, e espalhe a pasta na sua arcada dentária inferior.
11) Esfregue a escova entre a arcada superior e inferior, cerrando os dentes para facilitar a operação.
12) Esfregue lateralmente as arcadas superior esquerda e direita, inferior esquerda e direita e a parte frontal superior e inferior.
13) Repita o passo 12 por duas vezes.
14) Durante o processo, respire pelo nariz para não engolir pasta de dentes ou a espuma deixada pelo processo de escovação.
15) Cuspa o excesso de pasta e espuma na pia.
16) Abra a torneira, pegando a água com uma das mãos, e leve à boca para enxaguar.
17) Bocheche a água para limpar a pasta e cuspa a água com pasta na pia.
18) Volte ao passo 16 e repita-o por duas vezes.
19) Lave a escova de dentes, tirando as sobras de pasta e espuma.
20) Feche a torneira, e guarde a pasta no espelho.
21) Pronto, seus dentes estão escovados.
22) Repita a operação de escovação sempre após as refeições.

Para nós é uma coisa simples, mas descrever a lista de tarefas e passos para escovar os dentes incluem muitos detalhes que nós não prestamos mais a atenção, pois aprendemos isso desde pequenos e sabemos de cor e salteado. A lista de tarefas acima foi escrita em uma linguagem que nós chamamos de “Linguagem Natural”. Programar um computador basicamente é criar uma lista de instruções, a qual chamamos de “programa”, escrito em uma linguagem ou dialeto que a linguagem entende, para que o computador execute a lista de instruções quando você solicitar a ele a “execução” do programa.

Vamos ver agora um exemplo mais simples: Como fazer uma operação de soma de números inteiros em uma folha de papel:

1) Usamos uma folha de um caderno, e escrevemos os dois ou mais números a serem somados alinhados à direita
2) Após escrever os números, passe um traço sob o último número. Abaixo deste traço será escrito o resultado da soma.
3) considere a coluna mais à direita na vertical, e some todos os números dessa coluna.
4) Caso a soma dos números resulte em um número menor ou igual a nove, escreva este número na ultima coluna em baixo do traço.
5) Caso o número seja maior do que nove, escreva na última coluna da direita abaixo do traço o último digito à direita do resultado calculado, e copie o dígito da esquerda do resultado na coluna imediatamente anterior, na linha em branco antes do número.
6) Repita a operação a partir da etapa 03, considerando agora a coluna anterior (à esquerda) da ultima coluna calculada, levando em conta que caso tenha sido escrito um número na linha superior vindo da soma da ultima coluna, este número deve ser considerado na operação.
7) Ao realizar a operação até a primeira coluna, caso algum digito adicional tenha sido colocado na coluna anterior, ele deve ser copiado para baixo, no resultado.

Agora vamos executar este procedimento, usando os números 12444, 312 e 9644.

  12444
+   312
+  9644
 -------

No nosso exemplo, 4 + 2 + 4 = 10, logo copiamos o zero na ultima coluna da linha do resultado, e o numero 1 na coluna anterior, na linha imediatamente superior aos números a serem somados.

    1
 12444
+  312
+ 9644
-------
     0

Agora, voltamos na etapa 3 e somamos 1+4+1+4 ( 10 novamente), copia o zero no resultado e joga o um na coluna da esquerda na linha superior

   11
 12444
+  312
+ 9644
-------
    00

Agora somamos a terceira coluna, 1+4+3+6 ( 14 ), copia o 4 pra baixo e o um na coluna da esquerda na linha superior.

  111
 12444
+  312
+ 9644
-------
   400

Ao somar a quarta coluna, ignoramos os espaços em branco das colunas que não tem número, e somamos 1+2+9 ( 12 ). Copia o dois pra baixo, e o um na coluna da esquerda na linha superior.

 1111
 12444
+  312
+ 9644
-------
  2400

E agora, por ultimo, somamos a coluna anterior ( nossa última coluna com números), 1+1 (2) e copiamos o resultado para baixo.

 1111
 12444
+  312
+ 9644
-------
 22400

E chegamos ao resultado 22400. Pode fazer na calculadora, vai dar o mesmo resultado …rs…

Agora, vamos fazer um programa de computador para somar três números. Vou escolher uma linguagem script, que qualquer Browse de internet possa executar. Usando uma máquina com qualquer versão do Windows, abra o bloco de notas do seu computador, e crie um novo arquivo de texto. Chame-o de “exemplo.html”, e salve-o na sua pasta de documentos.

Agora, cole o conteúdo abaixo dentro deste arquivo:

// <![CDATA[
a = 12444;
b = 312
c = 9644;
d = a+b+c;
alert("Resultado = "+d);
// ]]>

Salve o arquivo, ele tem que ter a extensão HTML, então execute o arquivo clicando duas vezes em cima do nome do arquivo na sua pasta de documentos. O Windows vai verificar qual é o programa usado como padrão para navegação WEB, capaz de abrir e mostrar páginas HTML, e chamá-lo para mostrar o conteúdo do arquivo. Como o arquivo contém um script, o navegador sabe o que o script singifica e vai executá-lo. Seu resultado em tela deve ser uma mensagem parecida com a imagem abaixo:

Featured image

Traduzindo o script acima: utilizamos algumas letras do alfabeto para receber valores. A recebe o valor 12444, B recebe o valor 312 e C recebe 9644, e D recebe o resultado da soma dos conteúdos de A com B com C, e por último chamamos uma função da linguagem JavaScript para mostrar o resultado em uma janela na tela do Browser.

Tão simples quanto isso 🙂

Se você chegou até aqui e fez o exemplo acima, meus parabéns, você fez um pequeno programa de computador! Não foi necessário refazer toda a sequência de operações que teríamos de fazer ao somar um numero no papel, afinal a linguagem utilizada oferece operadores aritméticos prontos com estas funcionalidades. Para executar este programa, internamente o browser chamou um interpretador, que traduziu o programa para chamar instruções específicas do processador da sua máquina, para ler os conteúdos dos números e somá-los.

A partir de um exemplo simples, também conhecido como ‘Hello world’, iniciamos a construção de programas mais complexos, utilizando mais funções da linguagem escolhida, funções que permitem perguntar valores ao usuário da maquina, ou obter valores em um formulário, desenhar uma janela com botões e escrever as ações que cada botão deve executar, ler e gravar informações em um arquivo no disco ou em um Banco de Dados, etc. A maioria das linguagens de desenvolvimento de mercado permitem estes tipos de operação, cada uma do seu jeito particular, a complexidade do programa tende a crescer de acordo com a quantidade de dados e complexidade do processo a ser realizado com estes dados.

Até o próximo post !!