Após alguns meses longe do blog, voltei para apresentar ferramentas que tenho utilizado em meu trabalho.
Divido as ferramentas em duas categorias: Administração Remota e Acesso Remoto.
Administração Remota
LogMeIn Free
https://secure.logmein.com/products/free/
TeamViewer
http://www.teamviewer.com/en/index.aspx
CrossLoop Free
http://www.crossloop.com/
Softwares que nunca testei:
Supremo Remote Desktop
http://www.nanosystems.it/remote-desktop-freeware-en.aspx
Mingleview
http://www.mingleview.com/features.html
EchoVNC
http://sourceforge.net/projects/echovnc/
RemoteVNC
http://sourceforge.net/projects/remotevnc/
Acesso Remoto
RealVNC
http://www.realvnc.com/products/free/4.1/
UltraVNC
http://www.uvnc.com/
TightVNC
http://tightvnc.com/
TigerVNC [não recomendo]
http://sourceforge.net/apps/mediawiki/tigervnc/index.php?title=Main_Page
Software que nunca testei:
VirtualGL/TurboVNC [com aceleração OpenGL]
http://sourceforge.net/projects/virtualgl/files/TurboVNC/
Outros 1: RDP/NX Clients [não testei nenhum]
2X Client for RDP/Remote Desktop
http://www.2x.com/rdp-client/windows-linux-mac/
FreeRDP
http://www.freerdp.com/
RemoteDesktop
http://www.rdesktop.org/
NoMachine
http://www.nomachine.com/download.php
OpenNX
http://opennx.sourceforge.net/
Outros 2: Seamless Windows [não testei, transfere aplicações ao invés da área de trabalho]
WinSwitch
http://winswitch.org/about/
Outros 3: Screen sharing [não testei, apenas dá visão à área de trabalho]
JoinME
https://join.me/
Explicações:
Acho importante termos sempre um ferramenta padrão e
uma reserva. Minha ferramenta de Administração Remota
favorita é o LogMeIn, e a secundária TeamViewer.
O LogMeIn através de uma única conta de e-mail me
permite ter acesso à todas minhas máquinas registradas
e obter informações sobre o estado das atualizações do
Windows.
O TeamViewer possui um fantástico recurso para quem
faz acesso remoto temporário: ele permite gerar um
binário registrado em sua conta, o qual deve ser enviado
para o cliente para acesso praticamente instantâneo, sem
cadastro!
Como já tenho o LogMeIn instalado em todas as máquinas
não faz sentido migrar para o TeamViewer. Mas pode-se
perceber que não é uma software menor.
No universo Acesso Remoto, uso RealVNC Free v.4.1.3,
como a ferramenta principal e UltraVNC/TightVNC como
secundárias.
Escolhi o RealVNC por ter a mais simples, rápida e
cômoda instalação e ainda sim ter o melhor desempenho,
a melhor fluidez.
O UltraVNC infelizmente é reconhecido como vírus pelo
Avira e apesar de saber que trata-se de um falso positivo,
usá-lo me traria mais trabalho sem maiores benefícios.
O TightVNC aparemente exige mais processamento e isso
acaba prejudicando seu uso em máquinas mais antigas.
Porém, tem instalação bastante rápida, simples, não exige
re-inicialização e não apreseta conflito com antivírus.
Cheguei a testar o TigerVNC, mas ele apresentou falhas
em duas máquinas diferente e como possuia muitas
alternativas não quis buscar soluções. Simplesmente,
troquei de programa.
Mas o que significam estas duas categorias distintas
que criei? Chamo de ferramentas de Administração Remota
as aplicações que me permitem visualiar todas as máquinas
de modo centralizado, numa interface única e na qual não
preciso me preocupar com NAT/firewall. Ou seja, elas são
ótimas para acesso via internet.
Já as ferramentas de Acesso Remoto só me permitem
acessar uma máquina por vez e normalmente é preciso fazer
port forwarding para cada máquina para permitir acesso via
internet. São ótimas ferramentas para uso interno, in lan.
Apesar de poderem ser usadas através da internet, exigem
mais trabalho para fazê-lo.
Por fim, uma ferramenta que chamou minha atenção
durante a pesquisa mas ainda não tive a oportunidade de
testá-la foi o WinSwitch. Segundo a empresa responsável o
software permite acessar aos aplicativos presentes ao
invés de todo o desktop. O que é fantástico por permitir
que máquinas com SOs distintos rodem programas de SOs
diferentes, sem alternar à área de trabalho padrão e
ainda consumindo muito pouca banda de rede.
abraços!
Felas do Hardware && Felas das Redes
Fernando Di Ramos
domingo, 15 de abril de 2012
sexta-feira, 28 de outubro de 2011
Só brincando com números
Estou assistindo ao programa da BBC - A História da Matemática.
Nele o apresentador nos informa que o quadrado de um número é uma unidade maior que a multiplicação do seu antecessor e do seu sucessor.
É o tipo de coisa que nunca acho uma utilidade maior que uma diversão momentânea. Mas que seguramente existe uma aplicação prática muito importante em algum lugar =]
Veja:
Separando as duas sequências em duas linhas:
1, 4, 9, 16, 25, 36, 49, 64, 81, 100...
0, 3, 8, 15, 24, 35, 48, 63, 80, 99...
Pensei:
|X| * |X| = (|X| - 1) * (|X| + 1) + 1
Mas acredito que não precisa de módulo :D
Pode fazer a conta, é verdade.
X * X = ( X - 1 ) * ( X + 1 ) + 1
X * X = (X * X + X) + (-X - 1) + 1
X * X = X * X + (X - X) + (1 - 1)
X * X = X * X
Se 12 x 12 é 144, então
11 x 13 tem que ser 143.
Sabe quando complica?
Se 13 x 13 é 169, então
12 x 14 é 168, (169 - 1) ou (169 - 1)
11 x 15 é 165, (168 - 3) ou (169 - 4)
10 x 16 é 160, (165 - 5) ou (169 - 9)
09 x 17 é 153, (160 - 7) ou (169 -16)
08 x 18 é 144, (153 - 9) ou (169 -25)
...
X * X = ( X - 2 ) * ( X + 2 ) + 4
X * X = (X*X + 2X) + (-2x - 4) + 4
X * X = X * X
...
Então:
X * X = (X - Y) * (X + Y) + Y*Y
Hohoroooho :D
Não sei para que serve, mas é bem legal.
Outra coisa que dá pra notar também é que a soma de todos ímpares a partir de 1 dá um número quadrado. Você viu? Será um regra? :D
---
Hohoo, vi outra coisa:
7 x 7 = 49,
7 + 7 = 14,
49 - 14 + 1 = 36 (que é 6 * 6)
15 x 15 = 225
15 + 15 = 30
225 - 30 + 1 = 196 ( que é 14*14)
X*X = ( X - 1 ) * ( X - 1 ) + 2X - 1
X*X = X*X - X - X + 1 + 2X - 1
X*X = X*X
Talvez
X*X = ( X - Y ) * ( X - Y ) + 2X*Y - Y*Y
Alguma coisa me diz que eu deveria ter entendido (visto) isso na oitava série, =]
abraços
Nele o apresentador nos informa que o quadrado de um número é uma unidade maior que a multiplicação do seu antecessor e do seu sucessor.
É o tipo de coisa que nunca acho uma utilidade maior que uma diversão momentânea. Mas que seguramente existe uma aplicação prática muito importante em algum lugar =]
Veja:
-1 =-1 x 1
0 = 0 x 0
0 = 0 x 2
1 = 1 x 1
3 = 1 x 3
4 = 2 x 2
8 = 2 x 4
9 = 3 x 3
15= 3 x 5
16= 4 x 4
24= 4 x 6
25= 5 x 5
35= 5 x 7
36= 6 x 6
48= 6 x 8
49= 7 x 7
63= 7 x 9
64= 8 x 8
80= 8 x 10
81= 9 x 9
99= 9 x 11
100=10 x 10
Separando as duas sequências em duas linhas:
1, 4, 9, 16, 25, 36, 49, 64, 81, 100...
0, 3, 8, 15, 24, 35, 48, 63, 80, 99...
Pensei:
|X| * |X| = (|X| - 1) * (|X| + 1) + 1
Mas acredito que não precisa de módulo :D
Pode fazer a conta, é verdade.
X * X = ( X - 1 ) * ( X + 1 ) + 1
X * X = (X * X + X) + (-X - 1) + 1
X * X = X * X + (X - X) + (1 - 1)
X * X = X * X
Se 12 x 12 é 144, então
11 x 13 tem que ser 143.
Sabe quando complica?
Se 13 x 13 é 169, então
12 x 14 é 168, (169 - 1) ou (169 - 1)
11 x 15 é 165, (168 - 3) ou (169 - 4)
10 x 16 é 160, (165 - 5) ou (169 - 9)
09 x 17 é 153, (160 - 7) ou (169 -16)
08 x 18 é 144, (153 - 9) ou (169 -25)
...
X * X = ( X - 2 ) * ( X + 2 ) + 4
X * X = (X*X + 2X) + (-2x - 4) + 4
X * X = X * X
...
Então:
X * X = (X - Y) * (X + Y) + Y*Y
Hohoroooho :D
Não sei para que serve, mas é bem legal.
Outra coisa que dá pra notar também é que a soma de todos ímpares a partir de 1 dá um número quadrado. Você viu? Será um regra? :D
---
Hohoo, vi outra coisa:
7 x 7 = 49,
7 + 7 = 14,
49 - 14 + 1 = 36 (que é 6 * 6)
15 x 15 = 225
15 + 15 = 30
225 - 30 + 1 = 196 ( que é 14*14)
X*X = ( X - 1 ) * ( X - 1 ) + 2X - 1
X*X = X*X - X - X + 1 + 2X - 1
X*X = X*X
Talvez
X*X = ( X - Y ) * ( X - Y ) + 2X*Y - Y*Y
Alguma coisa me diz que eu deveria ter entendido (visto) isso na oitava série, =]
abraços
quarta-feira, 26 de outubro de 2011
Felas do Hardware - Cinema em Casa!
Existem inúmeros tocadores de vídeo no mercado. Eu tenho 3 favoritos: KMPlayer, MPlayer e VLC.
O KMPlayer é o "Korea Multimedia Player", um player iniciado em 2001 por Kang Yong-Huee em Delphi (quando a linguagem ainda chamava-se Object Pascal, em 2006 a Borland definiu Delphi como também uma linguagem), completamente gratuito e proprietário.
Pros: O melhor desemenho para vídeos Full-HD que já vi.
Cons: Não suporta RMVB muito bem.
O MPlayer é "The Movie Player", um player GNU, iniciado em 2000, escrito em C. É multiplataforma e possui uma infinidade versões e GUIs - interfaces gráficas.
Pros: Excelente desempenho em vídeos de baixa resolução, é altamente configurável e por isso pode rodar tudo.
Cons: Exige leitura da documentação e algumas configurações para obter todo seu poder.
O VLC é o "VideoLAN Client", outro player GNU, iniciado em 2001, escrito em C/C++. Possui um cone como símbolo pois a equipe de desenvolvimento uma vez roubou um cone da rua após uma noite de bebedeira. Compartilha muitos recursos com o MPlayer.
Pros: Instalação padrão bastante poderosa, não exigindo qualquer configuração.
Cons: Tem desempenho e número de compatibilidades de arquivo menores.
KMPlayer (versão única)
http://www.kmplayer.com/forums/
MPlayer (melhores versões)
http://www.umplayer.com/
http://mplayer-ww.com/eng/
http://smplayer.sourceforge.net/
http://www.mplayer2.org/
VLC (versão única)
http://www.videolan.org/vlc/
--
Todos os programas acima não necessitam de instalação de CODECs adicionais ao sistema. Todos eles são completos para uso assim que instalados.
Entretando, muita gente gosta de usar o Windows Media Player, Winamp e outros programas que façam uso do pool de codecs do sistema.
Já testei inúmeras versões mas todos nós sabemos dos seus problemas: manutenção do sistema.
Problemas de compatibilidade são mais difícies de reparar pois são tantas bibliotecas utilizadas, documentação pequena e dispersa, tantos programas e recursos que tornam impeditivo seu uso com eficiência e clareza.
Mas trazem muito conforto para quem não tem muita intimidade com computadores e prefere rodar tudo num só prgrama.
Para estes, minha sugestão é o K-Lite Codec Pack.
Obtido em:
http://www.codecguide.com/
--
[Outros binários Win32 do MPlayer]
http://www.mplayerhq.hu/design7/projects.html
http://data.netfast.org/downloadse.html
http://oss.netfarm.it/mplayer-win32.php
http://kovensky.project357.com/
http://mulder.bplaced.net/
[Outros projetos baseados no MPlayer]
http://inmplayer.sourceforge.net/
http://www.chronix.org/projects/mplayerwin/
http://klibb.com/cgi-bin/wiki.pl/SimpleMplayer
http://sourceforge.net/projects/goomediacenter/
[Curiosidades sobre o KMPlayer]
http://www.kmplayer.com/forums/showthread.php?t=63
http://www.kmplayer.com/forums/showthread.php?t=141
--
abraços
O KMPlayer é o "Korea Multimedia Player", um player iniciado em 2001 por Kang Yong-Huee em Delphi (quando a linguagem ainda chamava-se Object Pascal, em 2006 a Borland definiu Delphi como também uma linguagem), completamente gratuito e proprietário.
Pros: O melhor desemenho para vídeos Full-HD que já vi.
Cons: Não suporta RMVB muito bem.
O MPlayer é "The Movie Player", um player GNU, iniciado em 2000, escrito em C. É multiplataforma e possui uma infinidade versões e GUIs - interfaces gráficas.
Pros: Excelente desempenho em vídeos de baixa resolução, é altamente configurável e por isso pode rodar tudo.
Cons: Exige leitura da documentação e algumas configurações para obter todo seu poder.
O VLC é o "VideoLAN Client", outro player GNU, iniciado em 2001, escrito em C/C++. Possui um cone como símbolo pois a equipe de desenvolvimento uma vez roubou um cone da rua após uma noite de bebedeira. Compartilha muitos recursos com o MPlayer.
Pros: Instalação padrão bastante poderosa, não exigindo qualquer configuração.
Cons: Tem desempenho e número de compatibilidades de arquivo menores.
KMPlayer (versão única)
http://www.kmplayer.com/forums/
MPlayer (melhores versões)
http://www.umplayer.com/
http://mplayer-ww.com/eng/
http://smplayer.sourceforge.net/
http://www.mplayer2.org/
VLC (versão única)
http://www.videolan.org/vlc/
--
Todos os programas acima não necessitam de instalação de CODECs adicionais ao sistema. Todos eles são completos para uso assim que instalados.
Entretando, muita gente gosta de usar o Windows Media Player, Winamp e outros programas que façam uso do pool de codecs do sistema.
Já testei inúmeras versões mas todos nós sabemos dos seus problemas: manutenção do sistema.
Problemas de compatibilidade são mais difícies de reparar pois são tantas bibliotecas utilizadas, documentação pequena e dispersa, tantos programas e recursos que tornam impeditivo seu uso com eficiência e clareza.
Mas trazem muito conforto para quem não tem muita intimidade com computadores e prefere rodar tudo num só prgrama.
Para estes, minha sugestão é o K-Lite Codec Pack.
Obtido em:
http://www.codecguide.com/
--
[Outros binários Win32 do MPlayer]
http://www.mplayerhq.hu/design7/projects.html
http://data.netfast.org/downloadse.html
http://oss.netfarm.it/mplayer-win32.php
http://kovensky.project357.com/
http://mulder.bplaced.net/
[Outros projetos baseados no MPlayer]
http://inmplayer.sourceforge.net/
http://www.chronix.org/projects/mplayerwin/
http://klibb.com/cgi-bin/wiki.pl/SimpleMplayer
http://sourceforge.net/projects/goomediacenter/
[Curiosidades sobre o KMPlayer]
http://www.kmplayer.com/forums/showthread.php?t=63
http://www.kmplayer.com/forums/showthread.php?t=141
--
abraços
sexta-feira, 21 de outubro de 2011
Matemágicas e notícias
Há quanto tempo, felas!
Quem me conhece pessoalmente sabe que eu não gosto de truques. Mas esse pessoal da matemática é supreendente!
E se fosse possível testar se um resultado é legítimo ou pura fraude?!
Eu não acredito, mas funciona:
Lei de Benford
http://gigamatematica.blogspot.com/2011/07/lei-de-benford.html
(...)
--
Quem me conhece pessoalmente sabe que eu não gosto de truques. Mas esse pessoal da matemática é supreendente!
E se fosse possível testar se um resultado é legítimo ou pura fraude?!
Eu não acredito, mas funciona:
Lei de Benford
http://gigamatematica.blogspot.com/2011/07/lei-de-benford.html
(...)
Notícias
Não custumo me interessar por recursos humanos. Entretanto, uma vez ou outra leio um texto da área. E recentemente li um dos mais belos artigos jornalísticos da minha vida.
Eliane Brum - Meu filho, você não merece nada
--
Existem alguns novos meios de se abrir o CMD no Windows 7. Veja quatro formas!
--
Às vezes, eu deixo o mais importante pro final. Por exemplo, o queijo da pamonha :D
Gostaria de dizer belas palavras em homenagem a tão majestoso homem. Mas não sei como fazê-lo. Perdemos Dennis Ritchie, uma semana após a morte de Steve Jobs.
Não pretendo fazer comparações entre as personalidades, Ritchie foi um dos mais importantes cientistas do mundo. Pai da linguagem C, do HelloWorld e co-autor do Unix - que é só a base de todos SOs do mundo.
DMR–Eulogia a um Gigante
Ao invés de fazer um minuto de silêncio, faça uma linha de código C =]
A equipe de desenvolvimento do Notepad++ fez:
A equipe de desenvolvimento do Notepad++ fez:
quinta-feira, 29 de setembro de 2011
Resumo do livro K&R C - parte =(
Perdi todos os arquivos do meu netbook, incluindo a parte 4 que estava completa, livros e várias outras coisas.
Infelizmente, o resumo está suspenso.
Infelizmente, o resumo está suspenso.
abraços
terça-feira, 13 de setembro de 2011
Resumo do livro K&R C - parte 03
Caros amigos, continuaremos com a introdução à linguagem C baseada na obra The C Programming Language 2ed (ANSI C) de Kernighan & Ritchie.
No tópico anterior nós vimos os seguintes conceitos:
Seqüências de Escape: representação de caracteres invisíveis através de letras precedidas de contra-barra.
Declaração de variáveis: a declaração é feita, em C, escrevendo primeiro o tipo de dado e depois o identificador da variável, ou seja, seu nome.
Tipos primitivos de dados: estruturas pré-definidas pela linguagem que permitem ao programador seu uso sem qualquer pré-requisito. Em C, temos char, int, float, double e ponteiros.
Qualificadores de tipo: os tipos primitivos podem ser extendidos, melhorados, através do uso de qualificadores. Em C, temos signed, unsigned, short, long, const e volatile.
Atribuição/Assignment: comando ou expressão que (re)define o valor armazenado numa variável, seja em tipo primitivo ou em tipo definido pelo usuário. Permite que uma mesma variável possua valores diferentes no decorrer do programa.
Expressões Matemáticas: combinação de variáveis, constantes, parênteses, funções e operadores suportados em C, de acordo com suas respectivas precedências e associações, para solução de cálculos.
Caracteres de Conversão/Conversion Characters: assim são chamados por K&R os caracteres substituídos nas exibição de uma string formatada ou na leitura através de scanf. Em alguns trechos também usam o termo "Conversion Specification".
Porém são mais comumente referenciados em português como "caracteres de formatação", "códigos de formatação", "comandos de formatação", "especificadores de conversão", "especificadores de formato"(format specifiers, by Microsoft*), "especificadores de tipos", "formatadores de tipos" e outros. Em momento oportuno será apresentada sua tabela e o modo de formatar caracteres de conversão.
*Format Specifiers (C/C++ Language Expressions)
http://msdn.microsoft.com/en-us/library/75w45ekt%28v=vs.71%29.aspx
Constantes Simbólicas/Symbolic Constants
Sempre é preciso conhecer boas práticas de programação. Evite esconder "valores mágicos" como 20 e 300 no fundo de seu código. Eles transmitem pouca informação para quem lê o código e ainda dificulta seu acesso quando for necessário fazer sua alteração.
Um bom modo de tratá-los é através da utilização de nomes significativos. Uma linha iniciada por "#define" determina um nome simbólico(symbolic name/symbolic constant) para uma particular sequência de caracteres, um literal*.
Os valores CARGO, SALARIO e DURACAO_DO_CONTRATO são constantes simbólicas, não são variáveis, e, portanto, não são declaradas, são apenas definidas. Constantes simbólicas são convencionamente escritas em letras maiúsculas para serem facilmente diferenciadas das variáveis, que devem ser escritas em minúsculo.
Por fim, atenção, não se coloca ";" no final da definição de uma constante simbólica.
* Nota do tradutor: o termo literal, principalmente, em obras estrangeiras se refere a algo que é como ele realmente é, e não ao conceito de string. Neste sentido "140" é um literal e é do tipo numérico. Seria portanto um literal numérico.
Um outro modo simples de entender o que é um literal é pensá-lo como sendo um valor fixo, constante, com tipo determinado, podendo ou não ser do tipo string, atribuído à uma variável, constante ou função.
Entrada e Saída de Caracteres
O modelo de entrada/input e saída/output suportado pela biblioteca padrão é bastante simples. Entrada ou saída de texto, independentemente de onde seja originada ou para onde vá, é apenas o tratamento do fluxo/stream de caracteres.
Um fluxo de texto (text stream) é uma seqüência de caracteres divida em linhas, na qual, cada linha consiste em zero ou mais caracteres seguidos por um caractere de nova linha. Essa é a responsabilidade da biblioteca, criar fluxos de E/S (Entrada/Saída, I/O) de acordo com esse modelo. Enquanto isso, o programador C que se valha da biblioteca não precisará se preocupar com a saída de seu programa.
A biblioteca padrão provê inúmeras formas de leitura e escrita de um caractere por vez. Os mais simples são "getchar" e "putchar". O comando getchar lê o próximo caractere de entrada do fluxo de texto e retorna seu valor.
O presente leitor poderá estranhar a expressão "fluxo de texto", porém, saiba que a entrada de texto nem sempre é feita através do teclado ou pelo usuário, poderá, por exemplo, ser de um arquivo de texto ou de uma requisição WEB ou de uma conversa entre programas e etc.
A função putchar imprime, normalmente na tela, o caracter do valor inteiro da variável passada como parâmetro.
Uma curiosidade da linguagem C em relação ao fluxo de texto é que os caracteres são todos diretamente intercambiáveis com números. A documentação inclusive recomenda a utilização do tipo int para leitura de caracteres, por ter uma faixa de valores possíveis maior que uma variável char comum.
Nas palavras dos autores: um caractere escrito entre aspas simples representa um valor inteiro igual ao valor numérico do caractere no mapa da caracteres da máquina. Isto é chamado de um caractere constante e é apenas uma outra forma de escrever um inteiro pequeno.
Exercício*: faça um programa que leia um texto e que escreva-o substituindo cada seqüência de caracteres em branco por um único espaço.
* Nota do tradutor: o exercício apresentado faz uso de desvios condicionais e uma iteração. Como esta introdução se preocupa em ser uma primeira visão da linguagem para alguém que se inicia em algoritmos, não é esperado que você consiga fazê-lo. Entretando, preferi apresentar a pergunta e uma possível solução para simplesmente não me afastar muito do conteúdo original do livro K&R C.
Não se preocupe caso não tenha entendido o programa acima. Em breve seremos capazes de solucionar desafios muito maiores. Tenha persistência!
abraços
No tópico anterior nós vimos os seguintes conceitos:
Seqüências de Escape: representação de caracteres invisíveis através de letras precedidas de contra-barra.
Declaração de variáveis: a declaração é feita, em C, escrevendo primeiro o tipo de dado e depois o identificador da variável, ou seja, seu nome.
Tipos primitivos de dados: estruturas pré-definidas pela linguagem que permitem ao programador seu uso sem qualquer pré-requisito. Em C, temos char, int, float, double e ponteiros.
Qualificadores de tipo: os tipos primitivos podem ser extendidos, melhorados, através do uso de qualificadores. Em C, temos signed, unsigned, short, long, const e volatile.
Atribuição/Assignment: comando ou expressão que (re)define o valor armazenado numa variável, seja em tipo primitivo ou em tipo definido pelo usuário. Permite que uma mesma variável possua valores diferentes no decorrer do programa.
Expressões Matemáticas: combinação de variáveis, constantes, parênteses, funções e operadores suportados em C, de acordo com suas respectivas precedências e associações, para solução de cálculos.
Caracteres de Conversão/Conversion Characters: assim são chamados por K&R os caracteres substituídos nas exibição de uma string formatada ou na leitura através de scanf. Em alguns trechos também usam o termo "Conversion Specification".
Porém são mais comumente referenciados em português como "caracteres de formatação", "códigos de formatação", "comandos de formatação", "especificadores de conversão", "especificadores de formato"(format specifiers, by Microsoft*), "especificadores de tipos", "formatadores de tipos" e outros. Em momento oportuno será apresentada sua tabela e o modo de formatar caracteres de conversão.
*Format Specifiers (C/C++ Language Expressions)
http://msdn.microsoft.com/en-us/library/75w45ekt%28v=vs.71%29.aspx
Constantes Simbólicas/Symbolic Constants
Sempre é preciso conhecer boas práticas de programação. Evite esconder "valores mágicos" como 20 e 300 no fundo de seu código. Eles transmitem pouca informação para quem lê o código e ainda dificulta seu acesso quando for necessário fazer sua alteração.
Um bom modo de tratá-los é através da utilização de nomes significativos. Uma linha iniciada por "#define" determina um nome simbólico(symbolic name/symbolic constant) para uma particular sequência de caracteres, um literal*.
/* Programa para calcular o
custo de um funcionário */
#include <stdio.h>
#include <stdlib.h>
#define SALARIO 650.00
#define DURACAO_DO_CONTRATO 6
#define CARGO "Programador"
int main(){
printf("Tabela de Salario\n");
printf("Cargo: %s\n",CARGO);
printf("Salario: R$%4.2f\n",SALARIO);
printf("Duracao do contrato: %d meses\n", DURACAO_DO_CONTRATO);
printf("Custo para empresa: R$%4.2f\n\n",(SALARIO*DURACAO_DO_CONTRATO));
/***
* Perceba os tipos
* CARGO é string
* SALARIO é float
* DURACAO_DO_CONTRATO é int
***/
return(0);
}
Os valores CARGO, SALARIO e DURACAO_DO_CONTRATO são constantes simbólicas, não são variáveis, e, portanto, não são declaradas, são apenas definidas. Constantes simbólicas são convencionamente escritas em letras maiúsculas para serem facilmente diferenciadas das variáveis, que devem ser escritas em minúsculo.
Por fim, atenção, não se coloca ";" no final da definição de uma constante simbólica.
* Nota do tradutor: o termo literal, principalmente, em obras estrangeiras se refere a algo que é como ele realmente é, e não ao conceito de string. Neste sentido "140" é um literal e é do tipo numérico. Seria portanto um literal numérico.
Um outro modo simples de entender o que é um literal é pensá-lo como sendo um valor fixo, constante, com tipo determinado, podendo ou não ser do tipo string, atribuído à uma variável, constante ou função.
Entrada e Saída de Caracteres
O modelo de entrada/input e saída/output suportado pela biblioteca padrão é bastante simples. Entrada ou saída de texto, independentemente de onde seja originada ou para onde vá, é apenas o tratamento do fluxo/stream de caracteres.
Um fluxo de texto (text stream) é uma seqüência de caracteres divida em linhas, na qual, cada linha consiste em zero ou mais caracteres seguidos por um caractere de nova linha. Essa é a responsabilidade da biblioteca, criar fluxos de E/S (Entrada/Saída, I/O) de acordo com esse modelo. Enquanto isso, o programador C que se valha da biblioteca não precisará se preocupar com a saída de seu programa.
A biblioteca padrão provê inúmeras formas de leitura e escrita de um caractere por vez. Os mais simples são "getchar" e "putchar". O comando getchar lê o próximo caractere de entrada do fluxo de texto e retorna seu valor.
c = getchar();
/* c irá receber o
próximo caractere
do fluxo de texto */
O presente leitor poderá estranhar a expressão "fluxo de texto", porém, saiba que a entrada de texto nem sempre é feita através do teclado ou pelo usuário, poderá, por exemplo, ser de um arquivo de texto ou de uma requisição WEB ou de uma conversa entre programas e etc.
A função putchar imprime, normalmente na tela, o caracter do valor inteiro da variável passada como parâmetro.
putchar(c);
Uma curiosidade da linguagem C em relação ao fluxo de texto é que os caracteres são todos diretamente intercambiáveis com números. A documentação inclusive recomenda a utilização do tipo int para leitura de caracteres, por ter uma faixa de valores possíveis maior que uma variável char comum.
#include <stdio.h>
#include <stdlib.h>
/* Apresentaremos os valores
decimais dos caracteres
invisíveis de C */
int main() {
int i;
/* Salvaremos CHARs em INTs
sem casting explícito. */
i = EOF;
printf("\n EOF = %3d\n\n",i);
i = '\0';
printf("\n \\0 = %3d\n\n",i);
i = '\a';
printf("\n \\a = %3d (bell)\n\n",i);
i = '\b';
printf("\n \\b = %3d (backspace)\n\n",i);
i = '\f';
printf("\n \\f = %3d (formfeed)\n\n",i);
i = '\n';
printf("\n \\n = %3d (newline)\n\n",i);
i = '\r';
printf("\n \\r = %3d (carriage return)\n\n",i);
i = '\t';
printf("\n \\t = %3d (h tab)\n\n",i);
i = '\v';
printf("\n \\v = %3d (v tab)\n\n",i);
i = 'A';
printf("\n A = %3d\n\n",i);
int c;
printf("Digite uma letra: ");
c = getchar();
/* putchar(c); */
printf("\nchar = %d\n\n",c);
return(0);
}
Nas palavras dos autores: um caractere escrito entre aspas simples representa um valor inteiro igual ao valor numérico do caractere no mapa da caracteres da máquina. Isto é chamado de um caractere constante e é apenas uma outra forma de escrever um inteiro pequeno.
Exercício*: faça um programa que leia um texto e que escreva-o substituindo cada seqüência de caracteres em branco por um único espaço.
* Nota do tradutor: o exercício apresentado faz uso de desvios condicionais e uma iteração. Como esta introdução se preocupa em ser uma primeira visão da linguagem para alguém que se inicia em algoritmos, não é esperado que você consiga fazê-lo. Entretando, preferi apresentar a pergunta e uma possível solução para simplesmente não me afastar muito do conteúdo original do livro K&R C.
/***
* Uma possível solução para o
* exercício 1-9 do livro de Brian Kernighan
* e Dennis Ritchie - The C Programming
* Language 2ed, em inglês, mais conhecido
* como K&R C.
*
* A solução não faz uso de vetores. Usa
* apenas três variáveis inteiras e uma
* iteração.
*
***/
#include <stdio.h>
#include <stdlib.h>
#define FIM '\n'
#define ESPACO ' '
int main() {
int
entrada, /* Fluxo de entrada */
posicao, /* Posição do caractere no fluxo de entrada */
ultimo_espaco; /* Posição do último espaço */
posicao = 0;
/* Posição começa com zero */
ultimo_espaco = -1;
/* O último espaço precisa ser um valor
inválido, ou seja, um valor menor que
zero. Caso contrário, minha lógica
não funcionará. */
while( (entrada = getchar()) != FIM ){
posicao++;
if(entrada == ESPACO ){
if( (posicao - 1) != ultimo_espaco){
putchar(entrada);
} /* Fim do IF aninhado */
ultimo_espaco = posicao;
} else{
putchar(entrada);
} /* Fim do IF-THEN-ELSE */
} /* Fim do WHILE */
return(0);
} /* Fim do MAIN */
Não se preocupe caso não tenha entendido o programa acima. Em breve seremos capazes de solucionar desafios muito maiores. Tenha persistência!
abraços
quinta-feira, 8 de setembro de 2011
Resumo do livro K&R C - parte 02
Caros amigos, continuaremos com a introdução à linguagem C baseada na obra The C Programming Language 2ed (ANSI C) de Kernighan & Ritchie.
No tópico anterior nós criamos um ambiente de programação C e aprendemos alguns conceitos, entre eles:
Identação: a utilização de espaços em branco para facilitar a leitura do código.
Função: uma seqüência de passos necessários para a realização de uma tarefa através do uso de outras funções e variáveis.
Variável: um espaço limitado no qual podemos armazenar valores durante a execução do nosso programa.
Função principal: em C, ela é "main(){ ... }" e nos nossos exemplos ela não recebe argumentos.
Argumento: o modo pelo qual funções trocam informações. Falaremos mais sobre ele e sobre seu irmão gêmeo, o parâmetro, em tópicos futuros.
Biblioteca: contêiner de funções e variáveis. Arquivo que nos permite usar funções e variáveis pré-escritas, por nós ou por terceiros, e nos livra da necessidade de estarmos sempre fazendo códigos repetidos.
Bloco de código: espaço de descrição de todas as operações da função, são delimitados por chaves.
String: cadeia de caractéres. Também traduzido como literal, cordão, corda e muitas vezes chamado de vetor de caractéres. É uma seqüência de símbolos tipográficos envoltos por aspas duplas.
Comentário: modo de escrever informações no código fonte do programa sem alterar a lógica algorítmica. Em ANSI C é todo código escrito entre /* e */.
Uhu, vimos muita coisa em tão breve tópico, não é mesmo? Com certeza, lá ainda existe muita mais coisas que ainda não somos capazes de ver!
Mas chega de papo, :D
Iniciando - As Seqüências de Escape
No nosso Hello World escrevemos o seguinte código:
Nós já sabemos que a função printf recebe uma string como argumento e a exibe na tela. Mas o leitor atento já perbeu que a seqüência "\n" não é mostrada na tela.
Ela é a notação do carecter de nova linha (newline character), o qual quando exibido efetua uma quebra de linha e posiciona o cursor no canto esquerdo da nova linha.
Para entender a sua importância veja o código abaixo.
O código acima produz uma saída idêntica ao do nosso primeiro exemplo e só há quegra de linha na saída quando utilizamos o \n.
Indo mais fundo, o \n representa apenas um caractere de saída. Ele faz parte das seqüências de escape (escape sequence), que são simples mecanismo de texto ou simples caractéres invisíveis.
Dentro de uma string as seqüências de escape possuem as seguintes funções:
* Usando o Windows 7 e Code::Blocks MinGW as caixas de som emitiram um bip;
** Form feed não funciona no prompt de comando, mas deve funcionar em impressoras;
*** Volta para o início da linha, não é criada uma nova linha;
**** É um pouco difícil domá-los de modo a fazer a saída bem formatada;
***** Foi criado para manter compatilidade em ambientes Unix, onde "?" tem outra utilização na shell;
Veja em: http://www.grymoire.com/Unix/Quote.html
Iniciando - Variáveis e Expressões Matemáticas
O próximo programa usa a fórmula °C=(5/9)(°F-32) para exibir temperaturas em graus Celsius e Fahrenheit.
O mesmo código, porém, comentado.
Atenção: além da identação outro recurso que facilita o entendimento do código é a utilização de comentários. A medida que nos programas se tornarem maiores e principalmente quando for necessário rever um código que fizemos no mês passado ou antes, ficará claro a importância de ambos.
Os comentários em ANSI C são quaisquer caracteres entre /* e */, e seu conteúdo é ignorado pelo compilador. Em C++ podemos usar "//" para fazermos comentários de uma única linha. Novamente, a utilidade de um comentário é a de tornar o código mais compriensível. Veja o código abaixo.
Até aqui fizemos uso de números inteiros, strings, funções e expressões matemáticas. Mas e os números reais? Eu posso fazer minhas próprias funções? Como representar expressões matemáticas maiores?
Começaremos pelos tipos primitivos de dados.
Tipos Primitivos
Quando você digita "int i" está dizendo que a variável i é do tipo inteiro. Caso digite "float f" estará criando um número de ponto flutuante (floating point) que em português é número real.
Eu poderia fazer uma lista dos intervalos numéricos suportados por cada tipo de dado em C, porém, no presente estágio de desenvolvimento tal lista poderia nos induzir ao erro. É melhor entender, vejamos.
Caso usemos um compilador para C em MS-DOS Real, neste caso um número inteiro será de 16-bits e por isso guardará um valor entre -32.768 e +32.767.
Porém, se utilizarmos um compilador C para MS-Windows 32-bits, um número inteiro será de 32-bits e portanto guardará um valor entre -2.147.483.648 e +2.147.483.647.
Agora, num universo 64-bits, onde tanto o Sistema Operacional quanto o compilador seja 64-bits, um número inteiro terá 64-bits e por isso guardará um valor entre -9.223.372.036.854.775.808 e +9.223.372.036.854.775.807.
Por isso, prefiro não fazer tal tabela. No futuro aprenderemos como descobrir o limite possível de armazenamento de cada tipo de dado através de programação, sem usarmos tabelas. Tenha paciência, :D
* Alguns podem estar curiosos em relação ao uso da expressão ANSI C. Isso tem a ver com a fabricação de compiladores.
Pode parecer confuso, mas nós criamos uma linguagem de programação no papel, ou em nossa mente, e só depois a implementamos. Ou seja, só depois criamos um programa capaz de converter o código da linguagem que invetamos em linguagem de máquina - na linguagem que seu computador entender.
Este programa capaz de converter códigos humanamente compreensívveis em linguagem de máquina é chamado compilador. Ok, alguns seres humanos compreendem código de máquina, mas eu não tenho tanta certeza se eles são realmente humanos :D
Um código, ou um compilador, ser ANSI C significa que ele respeita todas as regras determinas pela American National Standards Institute (ANSI) para se escrever código em C. =]
abraços
No tópico anterior nós criamos um ambiente de programação C e aprendemos alguns conceitos, entre eles:
Identação: a utilização de espaços em branco para facilitar a leitura do código.
Função: uma seqüência de passos necessários para a realização de uma tarefa através do uso de outras funções e variáveis.
Variável: um espaço limitado no qual podemos armazenar valores durante a execução do nosso programa.
Função principal: em C, ela é "main(){ ... }" e nos nossos exemplos ela não recebe argumentos.
Argumento: o modo pelo qual funções trocam informações. Falaremos mais sobre ele e sobre seu irmão gêmeo, o parâmetro, em tópicos futuros.
Biblioteca: contêiner de funções e variáveis. Arquivo que nos permite usar funções e variáveis pré-escritas, por nós ou por terceiros, e nos livra da necessidade de estarmos sempre fazendo códigos repetidos.
Bloco de código: espaço de descrição de todas as operações da função, são delimitados por chaves.
String: cadeia de caractéres. Também traduzido como literal, cordão, corda e muitas vezes chamado de vetor de caractéres. É uma seqüência de símbolos tipográficos envoltos por aspas duplas.
Comentário: modo de escrever informações no código fonte do programa sem alterar a lógica algorítmica. Em ANSI C é todo código escrito entre /* e */.
Uhu, vimos muita coisa em tão breve tópico, não é mesmo? Com certeza, lá ainda existe muita mais coisas que ainda não somos capazes de ver!
Mas chega de papo, :D
Iniciando - As Seqüências de Escape
No nosso Hello World escrevemos o seguinte código:
printf("hello, world\n");
Nós já sabemos que a função printf recebe uma string como argumento e a exibe na tela. Mas o leitor atento já perbeu que a seqüência "\n" não é mostrada na tela.
Ela é a notação do carecter de nova linha (newline character), o qual quando exibido efetua uma quebra de linha e posiciona o cursor no canto esquerdo da nova linha.
Para entender a sua importância veja o código abaixo.
#include <stdio.h>
main(){
printf("H");
printf("e");
printf("l");
printf("l");
printf("o");
printf(",");
printf(" ");
printf("world");
printf("\n");
}
O código acima produz uma saída idêntica ao do nosso primeiro exemplo e só há quegra de linha na saída quando utilizamos o \n.
Indo mais fundo, o \n representa apenas um caractere de saída. Ele faz parte das seqüências de escape (escape sequence), que são simples mecanismo de texto ou simples caractéres invisíveis.
Dentro de uma string as seqüências de escape possuem as seguintes funções:
\a - Alerta, um bip (bell character*)
\b - backspace
\f - Nova Página (formfeed**)
\n - Nova Linha (newline)
\r - Retorno do Carro(carriage return)***
\t - Tabulação Horizontal****
\v - Tabulação Vertical****
\0 - Caracter Nulo, Fim de Vetor
\\ - Exibe \ (backslash)
\? - Exibe ? (question mark*****)
\' - Exibe Aspas Simples
\" - Exibe Aspas Duplas
\000 - Exibe Número Octal("0" varia de 0 a 7)
\xhh - Exibe Número Hexadecimal("h" varia de 0 a F)
* Usando o Windows 7 e Code::Blocks MinGW as caixas de som emitiram um bip;
** Form feed não funciona no prompt de comando, mas deve funcionar em impressoras;
*** Volta para o início da linha, não é criada uma nova linha;
**** É um pouco difícil domá-los de modo a fazer a saída bem formatada;
***** Foi criado para manter compatilidade em ambientes Unix, onde "?" tem outra utilização na shell;
Veja em: http://www.grymoire.com/Unix/Quote.html
Iniciando - Variáveis e Expressões Matemáticas
O próximo programa usa a fórmula °C=(5/9)(°F-32) para exibir temperaturas em graus Celsius e Fahrenheit.
#include <stdio.h>
main() {
int celsius;
int fahrenheit;
int temperatura_baixa, temperatura_alta;
temperatura_baixa = 0;
temperatura_alta = 150;
fahrenheit = temperatura_baixa;
celsius = 5 * (fahrenheit - 32) / 9;
printf("%d F \t = \t %d C \n", fahrenheit, celsius);
fahrenheit = temperatura_alta;
celsius = 5 * (fahrenheit - 32) / 9;
printf("%d F \t = \t %d C \n", fahrenheit, celsius);
}
O mesmo código, porém, comentado.
/* Exibir uma tabela
Fahrenheit-Celsius */
#include <stdio.h>
main() {
/* Podemos declarar variaváveis um a um*/
int celsius;
int fahrenheit;
/* Ou várias ao mesmo tempo, separando-as por vírgula*/
int temperatura_baixa, temperatura_alta;
/* As declarações acima determinaram a criação de 4
espaços de memória para o armazenamento de números
inteiros e com seus respectivos nomes: celsius,
fahrenheit... */
temperatura_baixa = 0;
/* Acima fizemos a atribuição do valor 0 */
temperatura_alta = 150;
/* Acima fizemos a atribuição do valor 150 */
fahrenheit = temperatura_baixa;
/* Acima fizemos a atribuição do valor armazenado
no espaço de inteiros chamado temperatura_baixa
e o armezenamos em outro espaço de memória que
também foi destinado a inteiros mas agora chamado
de fahrenheit. */
celsius = 5 * (fahrenheit - 32) / 9;
/* Acima a variável celsius passou a guardar o
resultado da expressão matemática acima, ou seja,
a conversão de fahrenhei em celsius. */
printf("%d F \t = \t %d C \n", fahrenheit, celsius);
/* Exibe a seguinte mensagem:
0 F = -17 C
No futuro discutiremos o uso de %d */
fahrenheit = temperatura_alta;
celsius = 5 * (fahrenheit - 32) / 9;
printf("%d F \t = \t %d C \n", fahrenheit, celsius);
}
Atenção: além da identação outro recurso que facilita o entendimento do código é a utilização de comentários. A medida que nos programas se tornarem maiores e principalmente quando for necessário rever um código que fizemos no mês passado ou antes, ficará claro a importância de ambos.
Os comentários em ANSI C são quaisquer caracteres entre /* e */, e seu conteúdo é ignorado pelo compilador. Em C++ podemos usar "//" para fazermos comentários de uma única linha. Novamente, a utilidade de um comentário é a de tornar o código mais compriensível. Veja o código abaixo.
/* Demostração de uso de comentários do C++ */
// O que é escrito na mesma linha
// após o uso do // é complemtamente
// ignorado pelo compilador.
int c; // armazena graus Celsius
int f; // armazena graus Fahrenheit
int k; // armazena graus Kelvin
Até aqui fizemos uso de números inteiros, strings, funções e expressões matemáticas. Mas e os números reais? Eu posso fazer minhas próprias funções? Como representar expressões matemáticas maiores?
Começaremos pelos tipos primitivos de dados.
Tipos Primitivos
Quando você digita "int i" está dizendo que a variável i é do tipo inteiro. Caso digite "float f" estará criando um número de ponto flutuante (floating point) que em português é número real.
Eu poderia fazer uma lista dos intervalos numéricos suportados por cada tipo de dado em C, porém, no presente estágio de desenvolvimento tal lista poderia nos induzir ao erro. É melhor entender, vejamos.
Caso usemos um compilador para C em MS-DOS Real, neste caso um número inteiro será de 16-bits e por isso guardará um valor entre -32.768 e +32.767.
Porém, se utilizarmos um compilador C para MS-Windows 32-bits, um número inteiro será de 32-bits e portanto guardará um valor entre -2.147.483.648 e +2.147.483.647.
Agora, num universo 64-bits, onde tanto o Sistema Operacional quanto o compilador seja 64-bits, um número inteiro terá 64-bits e por isso guardará um valor entre -9.223.372.036.854.775.808 e +9.223.372.036.854.775.807.
Por isso, prefiro não fazer tal tabela. No futuro aprenderemos como descobrir o limite possível de armazenamento de cada tipo de dado através de programação, sem usarmos tabelas. Tenha paciência, :D
Tabela de tipos primitivos em ANSI C*
char 'a', armezena um caractere
int 10, armazena um número inteiro
float 5.5, armezana um tipo real
double 0.5, armazena um tipo real grande
* &, armazena endereços de variáveis
Tabela de qualificadores de tipo
signed armazena valores sinal de + e -
unsigned armazena valores sem sinal
short armazena valores menores
long armazena valores maiores
const armazena valores constantes, imutáveis
volatile não sei ainda pra que serve :D
* Alguns podem estar curiosos em relação ao uso da expressão ANSI C. Isso tem a ver com a fabricação de compiladores.
Pode parecer confuso, mas nós criamos uma linguagem de programação no papel, ou em nossa mente, e só depois a implementamos. Ou seja, só depois criamos um programa capaz de converter o código da linguagem que invetamos em linguagem de máquina - na linguagem que seu computador entender.
Este programa capaz de converter códigos humanamente compreensívveis em linguagem de máquina é chamado compilador. Ok, alguns seres humanos compreendem código de máquina, mas eu não tenho tanta certeza se eles são realmente humanos :D
Um código, ou um compilador, ser ANSI C significa que ele respeita todas as regras determinas pela American National Standards Institute (ANSI) para se escrever código em C. =]
abraços
Assinar:
Postagens (Atom)
