Recentemente o Efetividade.net comentou sobre a disponibilidade de audio books brasileiros. Isto me lembrou do Projeto Gutenberg, que disponibiliza não somente e-textos mas também audio books.
Eu já tinha experimentado um audio-book do Projeto Gutenberg no passado, mas a qualidade era bem ruim. De qualquer forma, resolvi fazer uma nova tentativa e baixei o audio book do The Sign of Four, de Conan Doyle, em inglês.
Este é o segundo livro do Sherlock Holmes. Lembro que não tinha este livro na biblioteca do ginásio e acabei lendo somente depois de adulto, em inglês. Quem quiser saber um pouco sobre o livro, basta olhar na Wikipedia.
Os primeiros segundos do audio book me assustaram, pois é uma voz gerada por computador dizendo "File One ...", porém a partir daí a leitura é humana e muito profissional. O inglês tem um agradável sotaque britânico, entonação perfeita e varia conforme a personagem. É para quem tem boa fluência em inglês, mas estou conseguindo acompanhar bem apesar de fazer um bom tempo que não converso em inglês (mas ouço bastante na TV).
O link para o baixar o audio book é: http://www.gutenberg.org/dirs/etext05/shsof163-index.htm. Quem quiser acompanhar com o texto escrito, pode baixar de http://www.gutenberg.org/etext/2097.
Ao contrário da maioria dos arquivos contidos no Projeto Gutenberg, o audio book não foi feito por um dos voluntário do projeto, mas sim cedido pelo Audio Books For Free, e possui direitos autorais vigentes.
O site do Audio Books For Free (http://www.audiobooksforfree.com/) possui uma boa variedade de livros, porém não é totalmente free. As versões grátis são (pelo menos nos casos que examinei) MP3 com bitrate de 8Kbps, o que eles próprios qualificam como "qualidade suportável". Um efeito deste baixo bitrate é dar uma falsa impressão de eco. Quem tiver curiosidade de ver como a qualidade varia com o bitrate, pode escutar as amostras com as várias opções. Conforme o bitrate (e a qualidade) aumentam, sob o preço (de US$5 a 8). Mesmo para baixar as versões grátis é preciso se cadastrar no site. A estrutura de preços é curiosa: se você preferir baixar um zip ao invés de vários arquivos você precisa pagar uma 'taxa de zip' de 3 dólares!
A versão do The Sign of Four disponível gratuitamente no Projeto Gutenberg é a de 16Kbps e tem uma qualidade mais que suficiente. O Audio Books For Free informa que é o narrador do audio book: John Telfer, um compositor e ator britânico.
sexta-feira, outubro 31, 2008
Audio Book Grátis: The Sign of Four
quinta-feira, outubro 30, 2008
Problemas com o Windows Update
O Windows Update é certamente um recurso muito útil e poderoso do Windows. Na maioria dos casos ele permite manter o seu sistema operacional atualizado com um mínimo de esforço. Exceto, é claro, quando algo dá errado.
As Atualizações do Windows
Como já comentei antes, a Microsoft normalmente disponibiliza novas atualizações uma vez por mês, no chamado Patch Tuesday. Ocasionalmente saem os cumulative patches que substituem um conjunto de patches distintos para um mesmo componentes do Windows. Bem mais esporadicamente temos os Service Packs, que acumulam uma grande quantidade de correções e atualizações.
No dia-a-dia temos duas formas de manter o nosso sistema atualizado:
O Meu Problema
Estou trocando o meu micro no trabalho e portando partindo de um XP SP2 "zerado". A partir de um certo ponto as instalações passaram a dar a seguinte singela mensagem de erro:
Problema: Um problema no seu computador está impedindo que as atualizações sejam baixadas ou instaladas
Solução: Para corrigir o problema, tente instalar as atualizações novamente. Se isso não funcionar, use a Solução de Problemas para tentar solucionar o problema.
Óbvio que tentar novamente deu o mesmo resultado e a Solução de Problemas não deu nenhuma dica útil.
Resolvendo o Problema
Como Santo Google informa, este problema não é totalmente incomum (como veremos, no meu caso foi uma falha conhecida bastante fácil de ser duplicada) e existem várias discussões a respeito. Só para citar duas:
O primeiro ponto importante é olhar o log do Windows Update, que fica em C:\WINDOWS\WindowsUpdate.log. Como todo bom log, foi feito para ser lido pelo programador, não pelo usuário. De qualquer forma a informação que interessa é a seguinte:
Handler Attempting to create remote handler process
Process: C:\WINDOWS\system32\wuauclt.exe
FATAL: Error: 0x80004002. wuauclt handler: failed to spawn COM server
Handler FATAL: 0x80004002: ERROR: Remote update handler container process created (PID: 3036), but exited before signaling event
Se você estiver enfrentando este problema e as mensagens no log forem como estas, é bem provável que a solução que apresento a seguir resolva o problema.
A mensagem fala em um erro ao disparar um COM server. COM é a tecnologia de componentes da Microsoft e ela se baseia fortemente em informações armazenadas no registry. O motivo mais comum para problemas é um módulo COM não estar devidamente registrado.
Embora a mensagem acima não informe isto, o problema é o registro de wups2.dll. Para registrar corretamente esta DLL basta:
net stop wuauserv
regsvr32 %windir%\system32\wups2.dll
net start wuauserv
Entendendo a Falha
A Microsoft tem um artigo curto mas bem detalhado sobre o assunto em http://support.microsoft.com/kb/943144
Existe duas formas fáceis de você obter o problema acidentalmente:
Antes de descobrir o problema real eu estava desconfiado de ter algo corrompido nos arquivos baixados. Nos forums acima tem instruções detalhadas da própria Microsoft de como limpar os arquivos que foram baixados pelo Windows Update mas ainda não instalados. De forma resumida:
Balançando Galinhas Mortas
Entre as sugestões existem alguns rituais que, salvo prova em contrário, me parecem pouco contribuir para solucionar o problema. A menção mais comum é desligar antivirus e outros programas. Embora esta sugestão ajude a desconsiderar uma possível causa de erro, é pouco provável que um antivirus conhecido interfira no Windows Update. Principalmente quando o Windows Update pára de funcionar após algumas atualizações dele próprio.
As Atualizações do Windows
Como já comentei antes, a Microsoft normalmente disponibiliza novas atualizações uma vez por mês, no chamado Patch Tuesday. Ocasionalmente saem os cumulative patches que substituem um conjunto de patches distintos para um mesmo componentes do Windows. Bem mais esporadicamente temos os Service Packs, que acumulam uma grande quantidade de correções e atualizações.
No dia-a-dia temos duas formas de manter o nosso sistema atualizado:
- usar o Automatic Update, que verifica periodicamente a disponibilidade de novas atualizações. Dependendo do seu coeficiente de confiança/pregiça, você pode optar para o Automatic Update apenas notificá-lo da presença das atualizações, baixar mas perguntar antes de instalar ou baixar e instalar sem perguntar nada. O download é feito de forma a minimizar o impacto no uso normal do micro e da internet (veja detalhes no meu post anterior), o que acarreta em uma "falta de pressa".
- usar o Windows Update, que é um site que interage com um controle ActiveX no seu PC para verificar as atualizações disponíveis e possibilita baixar e instalar sob demanda.
O Meu Problema
Estou trocando o meu micro no trabalho e portando partindo de um XP SP2 "zerado". A partir de um certo ponto as instalações passaram a dar a seguinte singela mensagem de erro:
Problema: Um problema no seu computador está impedindo que as atualizações sejam baixadas ou instaladas
Solução: Para corrigir o problema, tente instalar as atualizações novamente. Se isso não funcionar, use a Solução de Problemas para tentar solucionar o problema.
Óbvio que tentar novamente deu o mesmo resultado e a Solução de Problemas não deu nenhuma dica útil.
Resolvendo o Problema
Como Santo Google informa, este problema não é totalmente incomum (como veremos, no meu caso foi uma falha conhecida bastante fácil de ser duplicada) e existem várias discussões a respeito. Só para citar duas:
- no Technet-Br
- no Forum Baboo
O primeiro ponto importante é olhar o log do Windows Update, que fica em C:\WINDOWS\WindowsUpdate.log. Como todo bom log, foi feito para ser lido pelo programador, não pelo usuário. De qualquer forma a informação que interessa é a seguinte:
Handler Attempting to create remote handler process
Process: C:\WINDOWS\system32\wuauclt.exe
FATAL: Error: 0x80004002. wuauclt handler: failed to spawn COM server
Handler FATAL: 0x80004002: ERROR: Remote update handler container process created (PID: 3036), but exited before signaling event
Se você estiver enfrentando este problema e as mensagens no log forem como estas, é bem provável que a solução que apresento a seguir resolva o problema.
A mensagem fala em um erro ao disparar um COM server. COM é a tecnologia de componentes da Microsoft e ela se baseia fortemente em informações armazenadas no registry. O motivo mais comum para problemas é um módulo COM não estar devidamente registrado.
Embora a mensagem acima não informe isto, o problema é o registro de wups2.dll. Para registrar corretamente esta DLL basta:
- parar o serviço de atualizações automáticas
- registrar a DLL usando o regsvr32
- reiniciar o serviço de atulaizações automáticas
net stop wuauserv
regsvr32 %windir%\system32\wups2.dll
net start wuauserv
Entendendo a Falha
A Microsoft tem um artigo curto mas bem detalhado sobre o assunto em http://support.microsoft.com/kb/943144
Existe duas formas fáceis de você obter o problema acidentalmente:
- você reparou uma instalação do XP a partir do CD original. O reparo deixa a DLL no disco mas apaga as informações do registry
- você estava com o XP SP2, foi no Windows Update, atualizou o client do Windows Update e logo em seguida baixou e instalou o SP3. Por uma falha da Microsoft, você não é orientado a reiniciar o micro após atualizar o client. O novo client é instalado mas não registrado; o SP3 registra o client antigo. Foi o que aconteceu comigo.
Antes de descobrir o problema real eu estava desconfiado de ter algo corrompido nos arquivos baixados. Nos forums acima tem instruções detalhadas da própria Microsoft de como limpar os arquivos que foram baixados pelo Windows Update mas ainda não instalados. De forma resumida:
- limpar todo o cache do Internet Explorer (o procedimento é diferente para o IE6 e IE7)
- parar os serviços de Atualizações Automáticas e Criptografia
- apagar a pasta C:\Windows\SoftwareDistribution
- renomear a pasta C:\Windows\\System32\catroot2
- reiniciar os serviços de Atualizações Automáticas e Criptografia
Balançando Galinhas Mortas
Entre as sugestões existem alguns rituais que, salvo prova em contrário, me parecem pouco contribuir para solucionar o problema. A menção mais comum é desligar antivirus e outros programas. Embora esta sugestão ajude a desconsiderar uma possível causa de erro, é pouco provável que um antivirus conhecido interfira no Windows Update. Principalmente quando o Windows Update pára de funcionar após algumas atualizações dele próprio.
terça-feira, outubro 28, 2008
NSIS - parte 5
O NSIS é uma ferramente bastante rica, permitindo expansões de diversas formas. Melhor ainda, ela tem um recurso de macros que possibilita usar estas expansões de uma forma muito fácil. Por exemplo, usamos na parte anterior a Modern User Interface simplesmento usando um !include e meia dúzia de !insertmacros. Por trás disso tem muitas centenas de linhas de script (veja em C:\Program Files\NSIS\Contrib\Modern UI e C:\Program Files\NSIS\Contrib\Modern UI).
Uma coisa comum nas duas versões da Modern User Interface é a criação de novas páginas para o instalador, recurso este que pode ser usado diretamente nos nossos scripts. A versão 1 da MUI usa o recurso de Install Options. Este recurso, que já está sendo descontinuado, utiliza um arquivo .INI para definir os controles presentes na tela e para interagir com eles.
Vamos dar uma olhada neste post no recurso nsDialogs, usado pela MUI2. No nsDialogs a criação e interação com os controles é feita através de código, o que é mais flexível (e trabalhoso) que os arquivos .INI do Install Options.
Tanto Install Options como nsDialogs utilizam plugins, que são DLLs preparadas de acordo com algumas convenções do NSIS. De forma (quase) transparente para nós o NSIS coloca a DLL dentro do instalador, a expande em um diretório temporário e a apaga quando não for mais necessária.
Vejamos abaixo um exemplo e depois vamos análisar as linhas relevantes:
Na nossa sessão obrigatória, ao invés de instalarmos a calculadora, vamos criar um arquivo texto contendo um texto que foi digitado na nossa página personalizada. Reparar que o NSIS possui instruções também para manipular arquivos (no caso estamos usando FileOpen, FileWrite e FileClose).
Chegamos agora à função que ira criar a nossa nova página. A notação nsDialogs::xxxx indica a chamada de uma rotina na DLL nsDialogs. A primeira rotina chamada é Create, que irá criar o diálogo. A opção /NOUNLOAD indica que vamos continuar usando a DLL e portanto ela não deve ser descarregada (é este o motivo de eu ter dito que o uso da DLL era quase transparente). O número mágico que segue, 1018, indica a página que vamos sobrepor. A documentação do nsDialogs informa os números apropriados.
O resultado do Create é um handle para o diálogo (uma identificação para nos referirmos a ele posteriormente). Como acontece em vários locais no NSIS, o resultado fica em uma pilha e precisamos fazer um POP para recuperá-lo e salvá-lo em uma variável. Por segurança, testamos se o valor retornado é válido.
Em seguida criamos dois controles no diálogo: um label (texto estático) e um textbox (caixa para entrada de texto). Os quatro números presentes indicam a posição inicial e o tamanho. Como pode ser visto, existem várias opções de fazer isto: 0 é um posição absolutam em pixels; 12u é um valor proporcional ao tamanho do diálogo (que por sua vez depende do tamanho do fonte do sistema) e 100% é um valor relativo ao tamanho total do diálogo. Além de label e text, existem vários outros controles que podem ser usados.
A rotina de saída da página usa a macro GetText para recuperar o conteúdo da caixa de entrada de texto e salvá-lo em uma variável.
A nossa página personalizada fica com o seguinte aspecto:
Uso Prático
Ok, muito interessante, mas para que pode servir? O uso mais comum é para solicitar informações adicionais ao operador, configurando o software durante a instalação. Embora este exemplo tenha gravado a informação em um arquivo texto, existem instruções no NSIS para escrever no Registry (como já vimos) e para escrever em arquivos .INI.
Alguns exemplos de informações que já solicitei em meus instaladores:
Uma coisa comum nas duas versões da Modern User Interface é a criação de novas páginas para o instalador, recurso este que pode ser usado diretamente nos nossos scripts. A versão 1 da MUI usa o recurso de Install Options. Este recurso, que já está sendo descontinuado, utiliza um arquivo .INI para definir os controles presentes na tela e para interagir com eles.
Vamos dar uma olhada neste post no recurso nsDialogs, usado pela MUI2. No nsDialogs a criação e interação com os controles é feita através de código, o que é mais flexível (e trabalhoso) que os arquivos .INI do Install Options.
Tanto Install Options como nsDialogs utilizam plugins, que são DLLs preparadas de acordo com algumas convenções do NSIS. De forma (quase) transparente para nós o NSIS coloca a DLL dentro do instalador, a expande em um diretório temporário e a apaga quando não for mais necessária.
Vejamos abaixo um exemplo e depois vamos análisar as linhas relevantes:
O primeiro ponto a reparar é os vários !include no início:
#
# Exemplo de uso do "nsDialogs" no NSIS
#
!include MUI2.nsh
!include nsDialogs.nsh
!include LogicLib.nsh
Name "Opções"
OutFile "InstOpc.exe"
InstallDir "$PROGRAMFILES\NSIS_Opcoes"
InstallDirRegKey HKLM "Software\NSIS_Opcoes" "Install_Dir"
BrandingText "DQSoft - http://dqsoft.blogspot.com"
Var ChaveUninstall
Var Dialog
Var Label
Var Text
Var Info
;--------------------------------
; Acrescenta um logotipo
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "dqsoft.bmp"
!define MUI_HEADERIMAGE_UNBITMAP "dqsoft.bmp"
;--------------------------------
; Instalador
!insertmacro MUI_PAGE_WELCOME
Page custom nsDialogsPage nsDialogsPageLeave
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "PortugueseBR"
Section "-Obrigatoria"
StrCpy $ChaveUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\DQSoft_Opcoes"
SetOutPath $INSTDIR
FileOpen $0 $INSTDIR\texto.txt w
FileWrite $0 $Info
FileClose $0
WriteRegStr HKLM SOFTWARE\NSIS_Opcoes "Install_Dir" "$INSTDIR"
WriteUninstaller "uninstall.exe"
WriteRegStr HKLM $ChaveUninstall "DisplayName" "NSIS Opcoes (remoção)"
WriteRegStr HKLM $ChaveUninstall "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKLM $ChaveUninstall "DisplayIcon" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKLM $ChaveUninstall "DisplayVersion" "1.0.0"
WriteRegStr HKLM $ChaveUninstall "Publisher" "DQSoft"
WriteRegStr HKLM $ChaveUninstall "UrlInfoAbout" "http://dqsoft.blogspot.com"
SectionEnd
Section "Atalhos no Menu Iniciar"
CreateDirectory "$SMPROGRAMS\NSIS Opcoes"
CreateShortCut "$SMPROGRAMS\NSIS Opcoes\Texto informado.lnk" "$INSTDIR\texto.txt"
CreateShortCut "$SMPROGRAMS\NSIS Opcoes\Remove.lnk" "$INSTDIR\uninstall.exe"
SectionEnd
;--------------------------------
; Nossa página personalizada
Function nsDialogsPage
nsDialogs::Create /NOUNLOAD 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 12u "Texto a gravar:"
Pop $Label
${NSD_CreateText} 0 13u 100% -13u "Digite aqui..."
Pop $Text
nsDialogs::Show
FunctionEnd
Function nsDialogsPageLeave
${NSD_GetText} $Text $Info
FunctionEnd
;--------------------------------
; Desinstalador
Section "Uninstall"
StrCpy $ChaveUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\DQSoft_Opcoes"
Delete "$INSTDIR\*.*"
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\NSIS Opcoes\*.*"
RMDir "$SMPROGRAMS\NSIS Opcoes"
DeleteRegKey HKLM SOFTWARE\NSIS_Opcoes
DeleteRegKey HKLM $ChaveUninstall
SectionEnd
- MUI2.nsh para usarmos a Modern User Interface
- nsDialogs.nsh para criarmos a nova página
- LogicLib.nsh define algumas operções lógicas que vamos usar
Page custom nsDialogsPage nsDialogsPageLeaveA página personalizada envolve duas funções que declarmos adiante, uma executada antes da execução (que irá criar a página) e outra executada quando o operador sai da página (que usaremos para pegar os valores fornecidos).
Na nossa sessão obrigatória, ao invés de instalarmos a calculadora, vamos criar um arquivo texto contendo um texto que foi digitado na nossa página personalizada. Reparar que o NSIS possui instruções também para manipular arquivos (no caso estamos usando FileOpen, FileWrite e FileClose).
Chegamos agora à função que ira criar a nossa nova página. A notação nsDialogs::xxxx indica a chamada de uma rotina na DLL nsDialogs. A primeira rotina chamada é Create, que irá criar o diálogo. A opção /NOUNLOAD indica que vamos continuar usando a DLL e portanto ela não deve ser descarregada (é este o motivo de eu ter dito que o uso da DLL era quase transparente). O número mágico que segue, 1018, indica a página que vamos sobrepor. A documentação do nsDialogs informa os números apropriados.
O resultado do Create é um handle para o diálogo (uma identificação para nos referirmos a ele posteriormente). Como acontece em vários locais no NSIS, o resultado fica em uma pilha e precisamos fazer um POP para recuperá-lo e salvá-lo em uma variável. Por segurança, testamos se o valor retornado é válido.
Em seguida criamos dois controles no diálogo: um label (texto estático) e um textbox (caixa para entrada de texto). Os quatro números presentes indicam a posição inicial e o tamanho. Como pode ser visto, existem várias opções de fazer isto: 0 é um posição absolutam em pixels; 12u é um valor proporcional ao tamanho do diálogo (que por sua vez depende do tamanho do fonte do sistema) e 100% é um valor relativo ao tamanho total do diálogo. Além de label e text, existem vários outros controles que podem ser usados.
A rotina de saída da página usa a macro GetText para recuperar o conteúdo da caixa de entrada de texto e salvá-lo em uma variável.
A nossa página personalizada fica com o seguinte aspecto:
Uso Prático
Ok, muito interessante, mas para que pode servir? O uso mais comum é para solicitar informações adicionais ao operador, configurando o software durante a instalação. Embora este exemplo tenha gravado a informação em um arquivo texto, existem instruções no NSIS para escrever no Registry (como já vimos) e para escrever em arquivos .INI.
Alguns exemplos de informações que já solicitei em meus instaladores:
- nome de um diretório que será usado para interface entre o meu programa e uma outra aplicação
- dados para acesso a uma base de dados
- endereço IP de um servidor
sexta-feira, outubro 24, 2008
Mochila e Capa para Notebook
Agora que tenho um notebook, é preciso ir atrás dos acessórios. A primeira providência é algo para guardar e transportar.
Mochila CaseLogic NBP-3C
Atualmente a opção número um para transporte de notebook é a mochila. Além de discreta, a mochila é mais confortável e permite levar junto não somente os acessórios básicos (como fonte, mouse e cabos), mas também amenidades (como fones, caderno de anotações, alimentos, bebidas, etc).
No Efetividade.net tem algumas análise de mochilas de alto padrão. No outro extremo, é fácil encontrar mochilas de marcas menos famosas a preços bem mais baixos. Acabei optando por um meio termo: um modelo mais econômico de uma marca de renome.
As fotos abaixo mostram alguns detalhes (clique para ampliar um pouco).
A mochila é de nylon e portanto impremeável. Entretanto, a parte abaixo do zipper que aparece na foto anterior é na realidade uma redinha - o que você colocar ali ficará exposto a olhos e chuva.
O zipper acima abre uma parte cheia de bolsos, ideal para acessórios e miudezas. Uma divisão ampa permite guardar cadernos e pastas.
Por último o compartimento para o notebook, bem acolchoado. Só senti falta de uma fita de velcro para segurar o notebook na vertical.
Capa CaseLogic SNS-15
Nem sempre uma mochila é a melhor opção - às vezes queremos algo menor e que possa ser colocado dentro de uma pasta ou mala comum. Neste momento a capa SNS-15 é uma boa opção.
O notebook não fica tão protegido quanto na mochila, mas fica bem compacto.
Onde Encontrar
A mochila eu comprei na Kalunga, parece que tem também no site do Wallmart. Já comprei nestes dois sites sem problemas.
A capa eu comprei na Fnac, com a qual tenho algumas restrições (as duas compras que fiz demoraram mais que o esperado). O Buscapé informa que o Wallmart também tem (e por um preço bem menor - dançei).
Mochila CaseLogic NBP-3C
Atualmente a opção número um para transporte de notebook é a mochila. Além de discreta, a mochila é mais confortável e permite levar junto não somente os acessórios básicos (como fonte, mouse e cabos), mas também amenidades (como fones, caderno de anotações, alimentos, bebidas, etc).
No Efetividade.net tem algumas análise de mochilas de alto padrão. No outro extremo, é fácil encontrar mochilas de marcas menos famosas a preços bem mais baixos. Acabei optando por um meio termo: um modelo mais econômico de uma marca de renome.
As fotos abaixo mostram alguns detalhes (clique para ampliar um pouco).
A mochila é de nylon e portanto impremeável. Entretanto, a parte abaixo do zipper que aparece na foto anterior é na realidade uma redinha - o que você colocar ali ficará exposto a olhos e chuva.
O zipper acima abre uma parte cheia de bolsos, ideal para acessórios e miudezas. Uma divisão ampa permite guardar cadernos e pastas.
Por último o compartimento para o notebook, bem acolchoado. Só senti falta de uma fita de velcro para segurar o notebook na vertical.
Capa CaseLogic SNS-15
Nem sempre uma mochila é a melhor opção - às vezes queremos algo menor e que possa ser colocado dentro de uma pasta ou mala comum. Neste momento a capa SNS-15 é uma boa opção.
O notebook não fica tão protegido quanto na mochila, mas fica bem compacto.
Onde Encontrar
A mochila eu comprei na Kalunga, parece que tem também no site do Wallmart. Já comprei nestes dois sites sem problemas.
A capa eu comprei na Fnac, com a qual tenho algumas restrições (as duas compras que fiz demoraram mais que o esperado). O Buscapé informa que o Wallmart também tem (e por um preço bem menor - dançei).
quinta-feira, outubro 23, 2008
Google Code Jam 2008 - Atualização
Após a minha desclassificação, parei de acompanhar o Code Jam 2008. Um dos motivos é só tentar resolver o resto dos problemas depois de concluir o meu "programa de estudos" (e para concluir eu preciso primeiro definí-lo!).
De qualquer forma, o concurso continua e já ocorreram a terceira rodada on-line e as rodadas locais on-site, selecionando os 100 concorrentes que participarão da final nos EUA. A lista dos finalistas pode ser vista aqui. De forma resumida:
Fica aqui o convite (ou apelo?) para os colegas programadores se prepararem e participarem no ano que vem.
De qualquer forma, o concurso continua e já ocorreram a terceira rodada on-line e as rodadas locais on-site, selecionando os 100 concorrentes que participarão da final nos EUA. A lista dos finalistas pode ser vista aqui. De forma resumida:
- 43 concorrentes da Europa e Oriente Médio (20 da Rússia)
- 36 concorrentes da Ásia e Pacífico (21 da China)
- 21 concorrentes das Américas (14 dos EUA, 2 brazucas e 2 argentinos)
Fica aqui o convite (ou apelo?) para os colegas programadores se prepararem e participarem no ano que vem.
quarta-feira, outubro 22, 2008
Notebook HP Pavilion dv6750BR
É curioso, mas até o começo do mês eu nunca tive um notebook pessoal. Com a disparada do dolar, consegui finalmente racionalizar a compra de um (na linha do "agora ou nunca").
Pensei inicialmente em um sub-notebook, como o Eee PC. Embora estes aparelhos tenham um preço atraente e dimensões e peso reduzidos, eles são focados no acesso a Web.
Dado o meu "vício" de programação, eu certamente ficaria frustado se não pudesse instalar o Visual Studio no notebook (cheguei a considerar por alguns segundos a possibilidade de usar um ambiente de programação mais leve, mas as obrigações profissionais são muito atreladas às ferramentas Microsoft).
Após alguns dias de debate interno e procura não sistemática, acabei optando por um modelo mais poderoso (mas com um preço médio e longe de ser um "top of line"): o HP Pavilion dv6750BR.
O Hardware
O coração do aparelho é um AMD 64 X2 Turion, trotando alegremente a 1,9GHz. Isto o torna o processador mais poderoso de casa, superando o meu "maduro" desktop (um P4 HT @ 2.8GHz). Infelizmente, não está no curto prazo aproveitar os 64 bits, já que ele vem com o Windows Vista Home Premium de 32 bits. 2 GBytes de Ram e um HD de 160GBytes são bastante espaçosos para as minhas aplicações atuais.
O notebook vem com um gravador de DVD com a tecnologia LightScribe, sob a qual pretendo fazer um post após alguns testes.
Segundo a etiqueta abaixo do teclado, é um notebook voltado para aplicações multimedia. A tela é de 15,4" (widescreen, resolução de até 1200x800) e possui dois alto falantes internos Altec Lansing. Uma barra em cima do teclado facilita a execução de DVDs; acompanha um controle remoto (que me parece de pouco uso). Na margem superior da tela, uma webcam e microfone.
Na lateral esquerda, várias interfaces estão disponíveis:
Na lateral direita temos:
Além da interface ethernet, ele possui WiFi (802.11 a/b/g) e Bluetooth.
Por último, tem um leitor de impressão digital abaixo do teclado.
Resumindo, um micro cheio de apetrechos, dos quais provavelmente vou usar apenas uma parcela.
As Primeiras Impressões
Até agora tive muito pouco tempo para mexer com este "brinquedo". À medida em que conhecer mais e achar pontos relevantes fareis novos posts.
O primeiro ponto importante é que ele vem, como disse, com o Windows Vista. Faz parte do meu pacote "ser dono de um notebook" tirar a cara de dento do chão e finalmente conhecer o Vista. Supondo que não bata em uma quantidade muito grande de incompatibilidades desagradáveis.
A impressão inicial do Vista é bem ruim: na primeira vez que é ligado o micro fica rodando um tempão "otimizando a experiência". Duh!
Além do notebook, a caixa contém o adaptador AC, o controle remote, um fone de ouvido e alguns folhetos praticamente inúteis. Manual? Dentro do HD. Discos de recuperação? Grave você mesmo. Para irritar ainda mais, o software de geração dos discos de recuperação só permite gerar uma cópia e demora uma eternidade. O curioso é que no primeiro dia eu resolvi ir dormir após gravar o primeiro dos três (!) DVDs; no dia seguinte o programa esqueceu que eu já tinha gravado o primeiro e o gravou novamente...
Não é surpresa que o micro venha com aplicativos pouco úteis instalados (como o famigerado Microsoft Works). Mas é latimável ver no seu primeiro desktop (além da lixeira e de um link para o centro de ajuda e suporte da HP) links para o Mercado Livre (será que é para passar adiante o notebook?), versão trial do Office 2007 (ok, pode ser interessante para alguns), versão trial do Norton Internet Security (já expliquei antes porque desisti do Norton) e o discador Terra Compacto.
Do outro lado da tela, três gadgets: relógio (bonito, mas não vale o espaço que ocupa na tela), mostrador de imagens (idem) e leitor de RSS (interessante, mas acho que ia derrubar a minha produtividade).
Ainda estou no começo da limpeza dos lixos e instalação dos programas que realmente pretendo usar. Uma coisa que ainda não localizei é uma lista do que vem no notebook. Algumas coisas não aparecem na lista do Painel de Controle. Tem também um The Sims instalado, mas ainda não tentei rodar para ver se é completo ou mais um trial.
Pensei inicialmente em um sub-notebook, como o Eee PC. Embora estes aparelhos tenham um preço atraente e dimensões e peso reduzidos, eles são focados no acesso a Web.
Dado o meu "vício" de programação, eu certamente ficaria frustado se não pudesse instalar o Visual Studio no notebook (cheguei a considerar por alguns segundos a possibilidade de usar um ambiente de programação mais leve, mas as obrigações profissionais são muito atreladas às ferramentas Microsoft).
Após alguns dias de debate interno e procura não sistemática, acabei optando por um modelo mais poderoso (mas com um preço médio e longe de ser um "top of line"): o HP Pavilion dv6750BR.
O Hardware
O coração do aparelho é um AMD 64 X2 Turion, trotando alegremente a 1,9GHz. Isto o torna o processador mais poderoso de casa, superando o meu "maduro" desktop (um P4 HT @ 2.8GHz). Infelizmente, não está no curto prazo aproveitar os 64 bits, já que ele vem com o Windows Vista Home Premium de 32 bits. 2 GBytes de Ram e um HD de 160GBytes são bastante espaçosos para as minhas aplicações atuais.
O notebook vem com um gravador de DVD com a tecnologia LightScribe, sob a qual pretendo fazer um post após alguns testes.
Segundo a etiqueta abaixo do teclado, é um notebook voltado para aplicações multimedia. A tela é de 15,4" (widescreen, resolução de até 1200x800) e possui dois alto falantes internos Altec Lansing. Uma barra em cima do teclado facilita a execução de DVDs; acompanha um controle remoto (que me parece de pouco uso). Na margem superior da tela, uma webcam e microfone.
Na lateral esquerda, várias interfaces estão disponíveis:
- saída S-Video
- saída para monitor externo padrão VGA
- porta de expansão 3 (proprietária HP)
- modem 56K
- rede Ethernet 10BaseT/100BaseT
- duas portas USB 2.0
- uma porta IEEE 1394 (Firewire)
- leitor de cartões 5 em 1 (SD, MMD, Memory Stick)
Na lateral direita temos:
- slot ExpressCard/54 (evolução dos antigos PC Card ou PCMCIA)
- drive óptico
- uma terceira porta USB 2.0
- entrada de alimentação.
Além da interface ethernet, ele possui WiFi (802.11 a/b/g) e Bluetooth.
Por último, tem um leitor de impressão digital abaixo do teclado.
Resumindo, um micro cheio de apetrechos, dos quais provavelmente vou usar apenas uma parcela.
As Primeiras Impressões
Até agora tive muito pouco tempo para mexer com este "brinquedo". À medida em que conhecer mais e achar pontos relevantes fareis novos posts.
O primeiro ponto importante é que ele vem, como disse, com o Windows Vista. Faz parte do meu pacote "ser dono de um notebook" tirar a cara de dento do chão e finalmente conhecer o Vista. Supondo que não bata em uma quantidade muito grande de incompatibilidades desagradáveis.
A impressão inicial do Vista é bem ruim: na primeira vez que é ligado o micro fica rodando um tempão "otimizando a experiência". Duh!
Além do notebook, a caixa contém o adaptador AC, o controle remote, um fone de ouvido e alguns folhetos praticamente inúteis. Manual? Dentro do HD. Discos de recuperação? Grave você mesmo. Para irritar ainda mais, o software de geração dos discos de recuperação só permite gerar uma cópia e demora uma eternidade. O curioso é que no primeiro dia eu resolvi ir dormir após gravar o primeiro dos três (!) DVDs; no dia seguinte o programa esqueceu que eu já tinha gravado o primeiro e o gravou novamente...
Não é surpresa que o micro venha com aplicativos pouco úteis instalados (como o famigerado Microsoft Works). Mas é latimável ver no seu primeiro desktop (além da lixeira e de um link para o centro de ajuda e suporte da HP) links para o Mercado Livre (será que é para passar adiante o notebook?), versão trial do Office 2007 (ok, pode ser interessante para alguns), versão trial do Norton Internet Security (já expliquei antes porque desisti do Norton) e o discador Terra Compacto.
Do outro lado da tela, três gadgets: relógio (bonito, mas não vale o espaço que ocupa na tela), mostrador de imagens (idem) e leitor de RSS (interessante, mas acho que ia derrubar a minha produtividade).
Ainda estou no começo da limpeza dos lixos e instalação dos programas que realmente pretendo usar. Uma coisa que ainda não localizei é uma lista do que vem no notebook. Algumas coisas não aparecem na lista do Painel de Controle. Tem também um The Sims instalado, mas ainda não tentei rodar para ver se é completo ou mais um trial.
terça-feira, outubro 21, 2008
Cuidado com o que você escreve nos seus fontes
Não é de todo incomum escrevermos besteiras nos comentários dos nossos programas. Diversas vezes escrevi coisas que me pareciam 'espirituosas' no ardor da programação que meses mais tarde me deixaram com o rosto vermelho.
Já tendo visto muita coisa em comentários, o 'causo' de hoje no The Daily WTF não me chamou muita atenção. Entretanto, nos comentários do artigo tinha menção a algo realmente escabroso: o Debian Bug #477454.
Um colaborador do pacote quodlibet (Sebastian Dröge) cometeu um erro e introduziu um bug no pacote. Como 'castigo' o colaborador que corrigiu o bug colocou uma 'sugestão' pouco elogiosa (para dizer o mínimo) no meio do código. Então Sebastian registrou o bug #477454, pedindo (educadamente) que o insulto fosse retirado.
O que parecia ser apenas uma pequena brincadeira ganhou ares surrealistas quando os colaboradores ficaram discutindo (ao longo de 3 meses!) se era correto o bug ter sido marcado como 'sério' e se justificava o trabalho de liberar uma nova versão (o que acabou sendo feito com uma certa dose de má vontade).
Pelo menos do meu ponto de vista a seriedade e profissionalismo dos colaboradores do Debian ficou (ligeiramente) comprometida.
Para os desenvolvedores que estão lendo esta história fica a lembrança: cuidado com o que você escreve nos seus fontes. Mesmo que o seu software não tenha o código aberto, algum dia alguém pode vir a passar os olhos nele e julgar a sua competência e profissionalismo pelo que encontrar.
Já tendo visto muita coisa em comentários, o 'causo' de hoje no The Daily WTF não me chamou muita atenção. Entretanto, nos comentários do artigo tinha menção a algo realmente escabroso: o Debian Bug #477454.
Um colaborador do pacote quodlibet (Sebastian Dröge) cometeu um erro e introduziu um bug no pacote. Como 'castigo' o colaborador que corrigiu o bug colocou uma 'sugestão' pouco elogiosa (para dizer o mínimo) no meio do código. Então Sebastian registrou o bug #477454, pedindo (educadamente) que o insulto fosse retirado.
O que parecia ser apenas uma pequena brincadeira ganhou ares surrealistas quando os colaboradores ficaram discutindo (ao longo de 3 meses!) se era correto o bug ter sido marcado como 'sério' e se justificava o trabalho de liberar uma nova versão (o que acabou sendo feito com uma certa dose de má vontade).
Pelo menos do meu ponto de vista a seriedade e profissionalismo dos colaboradores do Debian ficou (ligeiramente) comprometida.
Para os desenvolvedores que estão lendo esta história fica a lembrança: cuidado com o que você escreve nos seus fontes. Mesmo que o seu software não tenha o código aberto, algum dia alguém pode vir a passar os olhos nele e julgar a sua competência e profissionalismo pelo que encontrar.
segunda-feira, outubro 20, 2008
NSIS - parte 4
Até o momento usamos os diálogos padrões do NSIS. Embora plenamente adequados, eles tem uma certa aparência "antiquada". O NSIS possui recursos muito sofisticados de programação que permitem alterar totalmente as telas. Melhor ainda, já existem alguns pacotes prontos que permitem gerar uma aparência "moderno" com pequeno esforço.
Modern UI
A Modern UI já existe a bastante tempo. Para usá-la, basta incluir o arquivo MUI.nsh e substituir as instruções Page e UninstPage por algumas macros:
Modern UI 2
Mais recentemente, surgiu a Modern UI 2. Para o exemplo acima, basta trocar o "!include MUI.nsh" por "!include MUI2.nsh"; as telas terão a mesma aparência. A vantagem da Modern UI 2 é que é muito mais fácil personalizar as telas apresentadas
Falando em personalização, no próximo post veremos como acrescentar uma tela específica de configuração no nosso instalador.
Modern UI
A Modern UI já existe a bastante tempo. Para usá-la, basta incluir o arquivo MUI.nsh e substituir as instruções Page e UninstPage por algumas macros:
De quebra, alteramos no script acima o branding text (mensagem que aparece na parte inferior da tela) e colocamos um logotipo nosso no alto da página:
#
# Exemplo de uso do "Modern UI" no NSIS
#
;--------------------------------
;Include Modern UI
!include "MUI.nsh"
Name "Calculadora"
OutFile "InstCalc.exe"
InstallDir "$PROGRAMFILES\Calc"
InstallDirRegKey HKLM "Software\NSIS_Exemplo3" "Install_Dir"
BrandingText "DQSoft - http://dqsoft.blogspot.com"
Var ChaveUninstall
;--------------------------------
; Acrescenta um logotipo
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "dqsoft.bmp"
!define MUI_HEADERIMAGE_UNBITMAP "dqsoft.bmp"
;--------------------------------
; Instalador
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "PortugueseBR"
Section "-Obrigatoria"
StrCpy $ChaveUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\DQSoft_Calc"
SetOutPath $INSTDIR
File "c:\windows\system32\calc.exe"
WriteRegStr HKLM SOFTWARE\NSIS_Exemplo3 "Install_Dir" "$INSTDIR"
WriteUninstaller "uninstall.exe"
WriteRegStr HKLM $ChaveUninstall "DisplayName" "Calculadora (remoção)"
WriteRegStr HKLM $ChaveUninstall "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKLM $ChaveUninstall "DisplayIcon" '"$INSTDIR\calc.exe"'
WriteRegStr HKLM $ChaveUninstall "DisplayVersion" "1.0.0"
WriteRegStr HKLM $ChaveUninstall "Publisher" "DQSoft"
WriteRegStr HKLM $ChaveUninstall "UrlInfoAbout" "http://dqsoft.blogspot.com"
SectionEnd
Section "Atalhos no Menu Iniciar"
CreateDirectory "$SMPROGRAMS\Exemplo 4"
CreateShortCut "$SMPROGRAMS\Exemplo 4\Calculadora.lnk" "$INSTDIR\calc.exe"
CreateShortCut "$SMPROGRAMS\Exemplo 4\Remove.lnk" "$INSTDIR\uninstall.exe"
SectionEnd
Section "Atalho no Desktop"
CreateShortCut "$DESKTOP\Calculadora.lnk" "$INSTDIR\calc.exe" "" "$INSTDIR\calc.exe" 0
SectionEnd
;--------------------------------
; Desinstalador
Section "Uninstall"
StrCpy $ChaveUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\DQSoft_Calc"
Delete "$INSTDIR\*.*"
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\Exemplo 4\*.*"
RMDir "$SMPROGRAMS\Exemplo 4"
Delete "$DESKTOP\Calculadora.lnk"
DeleteRegKey HKLM SOFTWARE\NSIS_Exemplo3
DeleteRegKey HKLM $ChaveUninstall
SectionEnd
Modern UI 2
Mais recentemente, surgiu a Modern UI 2. Para o exemplo acima, basta trocar o "!include MUI.nsh" por "!include MUI2.nsh"; as telas terão a mesma aparência. A vantagem da Modern UI 2 é que é muito mais fácil personalizar as telas apresentadas
Falando em personalização, no próximo post veremos como acrescentar uma tela específica de configuração no nosso instalador.
sábado, outubro 18, 2008
NSIS - parte 3
Continuando o nosso tour pelo NSIS, vamos ver como deixar o nosso instalador e desinstalador compatível com o Add Remove Program do Control Panel.
Isto é muito simples: basta o instalador gravar as informações corretos no Registry, sob a chave HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall, e desinstalador apagá-las. É necessário alguns cuidados, para não acontecerem algumas coisas inesperadas ou incorretas.
Infelizmente, não consegui encontrar a documentação destas chaves do Registry (o link em um dos artigos mencionados acima está quebrado). O mais próximo que encontrei foi uma descrição no contexto do Windows Installer. De qualquer forma, aqui vai um resumo incompleto:
Para não ter que ficar repetindo o monstrengo do nome da chave, usei uma variável (ChaveInstall); de resto são comandos que já vimos na parte anterior. A operação do instalador continua a mesma, porém seus efeitos são um pouco diferentes.
Se olharmos no Registry, veremos as chaves de remoção (clique para ampliar):
O nosso programa passa a aparecer no Add Remove Programs (clique para ampliar):
ese clicarmos no link "click here for support information":
Após a desinstalação tudo isto some.
No próximo post vamos deixar para traz a aparência antiquada do nosso instaldor e ver a Moderm User Interface. Até lá!
Isto é muito simples: basta o instalador gravar as informações corretos no Registry, sob a chave HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Uninstall, e desinstalador apagá-las. É necessário alguns cuidados, para não acontecerem algumas coisas inesperadas ou incorretas.
Infelizmente, não consegui encontrar a documentação destas chaves do Registry (o link em um dos artigos mencionados acima está quebrado). O mais próximo que encontrei foi uma descrição no contexto do Windows Installer. De qualquer forma, aqui vai um resumo incompleto:
- você precisa criar uma chave com nome único debaixo do HLM\...\Uninstall. Você pode usar o nome do seu programa, um GUID ou um misto dos dois.
- Dentro desta chave você vai criar alguns valores; DisplayName e UninstallPath são obrigatórios.
- DisplayName é o nome da aplicação apresentado no Add Remove Programs.
- UninstallPath é o caminho para o programa de desinstalação.
- DisplayIcon informa onde obter o ícone
- DisplayVersion informa a versão do programa
- Publisher é que publica o programa
- UrlInfoAbout indica o site do publisher
#
# Quarto exemplo de uso do NSIS
#
LoadLanguageFile "${NSISDIR}\Contrib\Language files\PortugueseBR.nlf"
Name "Calculadora"
OutFile "InstCalc.exe"
InstallDir "$PROGRAMFILES\Calc"
InstallDirRegKey HKLM "Software\NSIS_Exemplo3" "Install_Dir"
Var ChaveUninstall
;--------------------------------
; Instalador
Page directory
Page components
Page instfiles
Section "-Obrigatoria"
StrCpy $ChaveUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\DQSoft_Calc"
SetOutPath $INSTDIR
File "c:\windows\system32\calc.exe"
WriteRegStr HKLM SOFTWARE\NSIS_Exemplo3 "Install_Dir" "$INSTDIR"
WriteUninstaller "uninstall.exe"
WriteRegStr HKLM $ChaveUninstall "DisplayName" "Calculadora (remoção)"
WriteRegStr HKLM $ChaveUninstall "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegStr HKLM $ChaveUninstall "DisplayIcon" '"$INSTDIR\calc.exe"'
WriteRegStr HKLM $ChaveUninstall "DisplayVersion" "1.0.0"
WriteRegStr HKLM $ChaveUninstall "Publisher" "DQSoft"
WriteRegStr HKLM $ChaveUninstall "UrlInfoAbout" "http://dqsoft.blogspot.com"
SectionEnd
Section "Atalhos no Menu Iniciar"
CreateDirectory "$SMPROGRAMS\Exemplo 4"
CreateShortCut "$SMPROGRAMS\Exemplo 4\Calculadora.lnk" "$INSTDIR\calc.exe"
CreateShortCut "$SMPROGRAMS\Exemplo 4\Remove.lnk" "$INSTDIR\uninstall.exe"
SectionEnd
Section "Atalho no Desktop"
CreateShortCut "$DESKTOP\Calculadora.lnk" "$INSTDIR\calc.exe" "" "$INSTDIR\calc.exe" 0
SectionEnd
;--------------------------------
; Desinstalador
UninstPage uninstConfirm
UninstPage instfiles
Section "Uninstall"
StrCpy $ChaveUninstall "Software\Microsoft\Windows\CurrentVersion\Uninstall\DQSoft_Calc"
Delete "$INSTDIR\*.*"
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\Exemplo 4\*.*"
RMDir "$SMPROGRAMS\Exemplo 4"
Delete "$DESKTOP\Calculadora.lnk"
DeleteRegKey HKLM SOFTWARE\NSIS_Exemplo3
DeleteRegKey HKLM $ChaveUninstall
SectionEnd
Para não ter que ficar repetindo o monstrengo do nome da chave, usei uma variável (ChaveInstall); de resto são comandos que já vimos na parte anterior. A operação do instalador continua a mesma, porém seus efeitos são um pouco diferentes.
Se olharmos no Registry, veremos as chaves de remoção (clique para ampliar):
O nosso programa passa a aparecer no Add Remove Programs (clique para ampliar):
ese clicarmos no link "click here for support information":
Após a desinstalação tudo isto some.
No próximo post vamos deixar para traz a aparência antiquada do nosso instaldor e ver a Moderm User Interface. Até lá!
quinta-feira, outubro 16, 2008
NSIS - Parte 2
Na parte 1 apresentei o NSIS com um exemplo bem tosco. Neste segundo post vamos ver como deixar parte da instalação opcional, como criar shortcuts e como criar um desinstalador.
Para ter trechos opcionais na instalação, basta incluir a página components e definir várias seções:
Neste exemplo, podemos ver também o comando CreateShortCut. Este comando tem a seguinte sintaxe básica:
CreateShortCut arq-lnk destino parametros arquivo-com-icone indice-do-icone
Por exemplo, para criar o atalho no desktop criamos um link chamado Calculadora.lnk no diretório $Desktop apontando para o arquivo Calc.exe no diretório de instalação. O ícone para o atalho é o de índice 0 no arquivo Calc.exe.
Para fechar a "lição" de hoje, vamos ver como acrescentar um desinstalador. O desinstalador no NSIS corresponde a uma SECTION de nome Uninstall. Ele pode ter algumas páginas, definidas por UninstPage. O desinstalador é gerado no momento da instalação, pois precisa se referir ao diretório que o usuário escolheu para a instalação. Isto é feito pelo comando WriteUninstaller. Para desinstalar são úteis os comandos RMDir e Delete.
Neste exemplo, estamos montando uma estrutura mais sofisticada no Menu Iniciar. Além do atalho para executar a calculadore, temos um atalho para executar o desinstalador e ambos ficam dentro de uma pasta. O desinstalador cuida de apagar tudo isto.
Aproveitei para colocar também dois comandos de manipulação do registry: WriteRegStr e DeleteRegKey.
O Windows possui uma série de convenções para anotar no registry o desinstalador, para que ele seja apresentado no Painel de Controle, em Add/Remove Programs. Veremos mais detalhes sobre isto no próximo post.
Para ter trechos opcionais na instalação, basta incluir a página components e definir várias seções:
O resultado é a inclusão de uma nova página após a seleção do diretório:
#
# Segundo exemplo de uso do NSIS
#
LoadLanguageFile "${NSISDIR}\Contrib\Language files\PortugueseBR.nlf"
Name "Calculadora"
OutFile "InstCalc.exe"
InstallDir "$PROGRAMFILES\Calc"
Page directory
Page components
Page instfiles
Section "-Obrigatoria"
SetOutPath $INSTDIR
File "c:\windows\system32\calc.exe"
SectionEnd
Section "Atalho no Menu Iniciar"
CreateShortCut "$SMPROGRAMS\Calculadora.lnk" "$INSTDIR\calc.exe"
SectionEnd
Section "Atalho no Desktop"
CreateShortCut "$DESKTOP\Calculadora.lnk" "$INSTDIR\calc.exe" "" "$INSTDIR\calc.exe" 0
SectionEnd
Neste exemplo, podemos ver também o comando CreateShortCut. Este comando tem a seguinte sintaxe básica:
CreateShortCut arq-lnk destino parametros arquivo-com-icone indice-do-icone
Por exemplo, para criar o atalho no desktop criamos um link chamado Calculadora.lnk no diretório $Desktop apontando para o arquivo Calc.exe no diretório de instalação. O ícone para o atalho é o de índice 0 no arquivo Calc.exe.
Para fechar a "lição" de hoje, vamos ver como acrescentar um desinstalador. O desinstalador no NSIS corresponde a uma SECTION de nome Uninstall. Ele pode ter algumas páginas, definidas por UninstPage. O desinstalador é gerado no momento da instalação, pois precisa se referir ao diretório que o usuário escolheu para a instalação. Isto é feito pelo comando WriteUninstaller. Para desinstalar são úteis os comandos RMDir e Delete.
#
# Terceiro exemplo de uso do NSIS
#
LoadLanguageFile "${NSISDIR}\Contrib\Language files\PortugueseBR.nlf"
Name "Calculadora"
OutFile "InstCalc.exe"
InstallDir "$PROGRAMFILES\Calc"
InstallDirRegKey HKLM "Software\NSIS_Exemplo3" "Install_Dir"
;--------------------------------
; Instalador
Page directory
Page components
Page instfiles
Section "-Obrigatoria"
SetOutPath $INSTDIR
File "c:\windows\system32\calc.exe"
WriteRegStr HKLM SOFTWARE\NSIS_Exemplo3 "Install_Dir" "$INSTDIR"
WriteUninstaller "uninstall.exe"
SectionEnd
Section "Atalhos no Menu Iniciar"
CreateDirectory "$SMPROGRAMS\Exemplo 3"
CreateShortCut "$SMPROGRAMS\Exemplo 3\Calculadora.lnk" "$INSTDIR\calc.exe"
CreateShortCut "$SMPROGRAMS\Exemplo 3\Remove.lnk" "$INSTDIR\uninstall.exe"
SectionEnd
Section "Atalho no Desktop"
CreateShortCut "$DESKTOP\Calculadora.lnk" "$INSTDIR\calc.exe" "" "$INSTDIR\calc.exe" 0
SectionEnd
;--------------------------------
; Desinstalador
UninstPage uninstConfirm
UninstPage instfiles
Section "Uninstall"
Delete "$INSTDIR\*.*"
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\Exemplo 3\*.*"
RMDir "$SMPROGRAMS\Exemplo 3"
Delete "$DESKTOP\Calculadora.lnk"
DeleteRegKey HKLM SOFTWARE\NSIS_Exemplo3
SectionEnd
Neste exemplo, estamos montando uma estrutura mais sofisticada no Menu Iniciar. Além do atalho para executar a calculadore, temos um atalho para executar o desinstalador e ambos ficam dentro de uma pasta. O desinstalador cuida de apagar tudo isto.
Aproveitei para colocar também dois comandos de manipulação do registry: WriteRegStr e DeleteRegKey.
O Windows possui uma série de convenções para anotar no registry o desinstalador, para que ele seja apresentado no Painel de Controle, em Add/Remove Programs. Veremos mais detalhes sobre isto no próximo post.
terça-feira, outubro 14, 2008
NSIS - Parte 1
Um dos aspectos mais negligenciados do desenvolvimento de software é a preparação de um instalador. Não é incomum esta tarefa ser feita "nos descontos", usando uma ferramenta incompleta que veio junto com o ambiente de desenvolvimento na base do NNF (Next-Next-Finish).
Nesta série de posts vamos ver uma ferramenta livre (grátis e de fonte aberto) para preparação de instaladores. Não é uma ferramenta automática (ao invés do NNF é preciso preparar um script) mas é altamente versátil e capaz de gerar instaladores bonitos e inteligentes. Existem alguns utilitários para auxiliar na criação do script, mas o nosso foco vai ser a escrita manual. Muitos softwares livres e vários softwares comerciais usam esta ferramenta.
A ferramenta que estou falando é o NSIS - Nullsoft Scriptable Install System e foi desenvolvido pelos criadores do Winamp. A Wikipedia tem uma página a respeito, mas a principal referência é a página oficial. Para acompanhar os meus exemplos, baixe a versão mais recente (no momento a 2.40). O download é um instalador, obviamente feito com o próprio NSIS.
Em linhas gerais, o NSIS compila o script, gerando um arquivo executável que contém a lógica de instalação e todos os arquivos necessários (compactados).
Vamos encerrar esta introdução com um pequeno exemplo. Tomei como "cobaia" a calculadora do Windows, mas você pode usar qualquer outro programa que se resuma a um arquivo executável.
1) Instale o NSIS
2) Execute o seu editor de texto ou programas predileto (no meu caso o SciTE, que até reconhece scripts do NSIS), digite o script abaixo e salve com o nome Ex1.nsi.
Nos próximos posts veremos passo a passo como sofisticar este nosso instalador.
Nesta série de posts vamos ver uma ferramenta livre (grátis e de fonte aberto) para preparação de instaladores. Não é uma ferramenta automática (ao invés do NNF é preciso preparar um script) mas é altamente versátil e capaz de gerar instaladores bonitos e inteligentes. Existem alguns utilitários para auxiliar na criação do script, mas o nosso foco vai ser a escrita manual. Muitos softwares livres e vários softwares comerciais usam esta ferramenta.
A ferramenta que estou falando é o NSIS - Nullsoft Scriptable Install System e foi desenvolvido pelos criadores do Winamp. A Wikipedia tem uma página a respeito, mas a principal referência é a página oficial. Para acompanhar os meus exemplos, baixe a versão mais recente (no momento a 2.40). O download é um instalador, obviamente feito com o próprio NSIS.
Em linhas gerais, o NSIS compila o script, gerando um arquivo executável que contém a lógica de instalação e todos os arquivos necessários (compactados).
Vamos encerrar esta introdução com um pequeno exemplo. Tomei como "cobaia" a calculadora do Windows, mas você pode usar qualquer outro programa que se resuma a um arquivo executável.
1) Instale o NSIS
2) Execute o seu editor de texto ou programas predileto (no meu caso o SciTE, que até reconhece scripts do NSIS), digite o script abaixo e salve com o nome Ex1.nsi.
#
# Primeiro exemplo de uso do NSIS
#
LoadLanguageFile "${NSISDIR}\Contrib\Language files\PortugueseBR.nlf"
Name "Calculadora"
OutFile "InstCalc.exe"
InstallDir "$PROGRAMFILES\Calc"
Page directory
Page instfiles
Section "-Obrigatoria"
SetOutPath $INSTDIR
File "c:\windows\system32\calc.exe"
SectionEnd
- As linhas que começam com '#' são comentarios.
- LoadLanguageFile define a lingua a ser usada nas telas (no caso português do Brasil).
- Name é o nome do instalador, OutFile o nome do arquivo a ser gerado pelo NSIS e InstallDir o diretório padrão de instalação ($PROGRAMFILES é o diretório de programas do Windows onde o instalador está executando - "Arquivos de Programas", "Program Files", etc).
- Os comandos Page indicam quais telas são usados no instalador (no caso a de escolha de diretório e de acompanhamento da instalação dos arquivos).
- Uma Section é uma parte da instalação, veremos no próximo post como usar isto para permitir ao usuário selecionar o que vai ser instalado. Por enquanto temos uma única section, o '-' no início do nome indica que ela é de instalação obrigatória.
- SetOutPath indica onde os arquivos seguintes serão gravados na instalação (no caso $INSTDIR, que é o diretório escolhido pelo usuário).
- Por último, File referência um arquivo no micro onde o script será compilado. No caso vamos pegar o CALC.EXE que está Windows\System32.
Nos próximos posts veremos passo a passo como sofisticar este nosso instalador.
sábado, outubro 11, 2008
Dazzle DVD Recorder
O fim da era VHS me deixou com algumas fitas "insubstituíveis" e o desejo de "algum dia" tentar convertê-las para DVD. Finalmente este "algum dia" está chegando.
O primeiro passo para fazer a conversão é arranjar um vídeo cassete, o que não é fácil (o meu morreu há muito tempo). Minha aventura começou quando a minha cunhada mudou de casa e me ofereceu o seu vídeo cassete antigo (um aparelho de boa marca, 6 cabeças, Hi-FI). Infelizmente, mais adiante descobri que o infeliz está pifado. Felizmente, o meu pai me emprestou o dele.
O passo seguinte é obter um dispositivo de captura de vídeo. Existe muita coisa no mercado, com uma faixa bem grande de preços. Achei mais flexível usar um dispositivo USB ao invés de uma placa, e acabei escolhendo o Dazzle DVD Recorder, que eu comprei (com nota e garantia) por menos de R$200:
Este aparelho (como muitos outros dispositivos de captura) tem uma fama bastante variada na internet, oscilando entre perfeito e imprestável. Como veremos ao longo deste post, isto é bem merecido.
Do ponto de vista de hardware, é um dispositivo USB 2.0 (com um cabo USB longo) com entradas de vídeo composto, S-Video e som estéreo. Para começar a brincar, basta acrescentar um cabo de audio e vídeo (como na foto acima) e ligar ao video cassete. Na outra ponta coloquei o meu já ultrapassado micro (P4 2.8 HT, 512M de Ram), que agora tem um bom espaço em disco.
E chegamos à questão do software. O meu objetivo é gravar o vídeo no HD e posteriormente gravar em um DVD "normal", eventualmente com capítulos para facilitar a navegação. O Dazzle DVD Recorder vem com dois softwares: o Instant DVD Recorder e o Pinnacle Studio Quickstart.
O Instant DVD Recorder permite gravar o vídeo capturado diretamente em um DVD ou no HD com o formato do DVD, o que não é muito prático para manipular. Até onde me lembro, a instalação foi tranquila.
O Pinnacle Studio Quickstart tem mais recursos, porém a instalação trouxe alguns "lixos" para o micro (como o QuickTime Player e uma versão demo do DivX) e exigiu uma reiniciação.
Daí para frente a coisa foi ficando complicada. O video cassete, como a maioria dos comercializados no Brasil, gera vídeo no padrão PAL-M (por compatiblidade com as TVs brasileiras). O Instant DVD Recorder suporta este formato mas o Pinnacle Studio aparentemente não. A solução que eu encontrei foi usar o Windows Movie Maker para capturar o vídeo. Ele trabalha com o driver da Dazzle porém:
A captura em si exige somente paciência, já que a gravação é em tempo real. Ou seja, para capturar uma fita de 1h a captura demora 1h. Escolhendo a melhor qualidade, são 14 MB de disco por minuto de vídeo.
A qualidade do vídeo WMV pareceu bem razoável no micro. Para gravar no DVD acabei usando o Pinnacle Studio, por enquanto sem capítulos ou menu. Na primeira tentativa, após ver avançar míseros porcentos em uma hora, fui dormir. Na manhã seguinte o DVD estava gravado e a qualidade na TV foi boa. Fui repetir a receita com um outro vídeo e na manhã seguinte ainda estava nos "zero purça". Pelo menos não tinha gravado nada no DVD, permitindo re-aproveitá-lo.
Peguei na internet um monte de aplicativos de captura e conversão de vídeo (alguns grátis e outros demo de programas de baixo custo), mas ainda não tive tempo de testá-los. Quando conseguir relato o resultado aqui.
As Conclusões (por enquanto)
Converter VHS para DVD não é uma tarefa simples (nem para qualquer um) principalmente devido ao software. O hardware do Dazzle DVD Recorder está funcionando bem, o vídeo está sendo capturado com boa qualidade. Ainda não consegui de forma satisfatória gravar no PC em um formato adequado e depois passar isto para um DVD.
Considerando o preço do dispositivo de captura e o preço médio de um DVD (com vídeo de qualidade muito melhor, audio remasterizado em 5.1, capítulos, extras, legendas, etc) só compensa fazer a conversão se você tiver várias fitas "insubstituíveis". Ou se você for um masoquista.
O primeiro passo para fazer a conversão é arranjar um vídeo cassete, o que não é fácil (o meu morreu há muito tempo). Minha aventura começou quando a minha cunhada mudou de casa e me ofereceu o seu vídeo cassete antigo (um aparelho de boa marca, 6 cabeças, Hi-FI). Infelizmente, mais adiante descobri que o infeliz está pifado. Felizmente, o meu pai me emprestou o dele.
O passo seguinte é obter um dispositivo de captura de vídeo. Existe muita coisa no mercado, com uma faixa bem grande de preços. Achei mais flexível usar um dispositivo USB ao invés de uma placa, e acabei escolhendo o Dazzle DVD Recorder, que eu comprei (com nota e garantia) por menos de R$200:
Este aparelho (como muitos outros dispositivos de captura) tem uma fama bastante variada na internet, oscilando entre perfeito e imprestável. Como veremos ao longo deste post, isto é bem merecido.
Do ponto de vista de hardware, é um dispositivo USB 2.0 (com um cabo USB longo) com entradas de vídeo composto, S-Video e som estéreo. Para começar a brincar, basta acrescentar um cabo de audio e vídeo (como na foto acima) e ligar ao video cassete. Na outra ponta coloquei o meu já ultrapassado micro (P4 2.8 HT, 512M de Ram), que agora tem um bom espaço em disco.
E chegamos à questão do software. O meu objetivo é gravar o vídeo no HD e posteriormente gravar em um DVD "normal", eventualmente com capítulos para facilitar a navegação. O Dazzle DVD Recorder vem com dois softwares: o Instant DVD Recorder e o Pinnacle Studio Quickstart.
O Instant DVD Recorder permite gravar o vídeo capturado diretamente em um DVD ou no HD com o formato do DVD, o que não é muito prático para manipular. Até onde me lembro, a instalação foi tranquila.
O Pinnacle Studio Quickstart tem mais recursos, porém a instalação trouxe alguns "lixos" para o micro (como o QuickTime Player e uma versão demo do DivX) e exigiu uma reiniciação.
Daí para frente a coisa foi ficando complicada. O video cassete, como a maioria dos comercializados no Brasil, gera vídeo no padrão PAL-M (por compatiblidade com as TVs brasileiras). O Instant DVD Recorder suporta este formato mas o Pinnacle Studio aparentemente não. A solução que eu encontrei foi usar o Windows Movie Maker para capturar o vídeo. Ele trabalha com o driver da Dazzle porém:
- Não deixava alterar a configuração de captura; o jeito era configurar no Instant DVD Recorder;
- Grava a saída no formato WMV, que parece ser menos suportado pelos aplicativos.
A captura em si exige somente paciência, já que a gravação é em tempo real. Ou seja, para capturar uma fita de 1h a captura demora 1h. Escolhendo a melhor qualidade, são 14 MB de disco por minuto de vídeo.
A qualidade do vídeo WMV pareceu bem razoável no micro. Para gravar no DVD acabei usando o Pinnacle Studio, por enquanto sem capítulos ou menu. Na primeira tentativa, após ver avançar míseros porcentos em uma hora, fui dormir. Na manhã seguinte o DVD estava gravado e a qualidade na TV foi boa. Fui repetir a receita com um outro vídeo e na manhã seguinte ainda estava nos "zero purça". Pelo menos não tinha gravado nada no DVD, permitindo re-aproveitá-lo.
Peguei na internet um monte de aplicativos de captura e conversão de vídeo (alguns grátis e outros demo de programas de baixo custo), mas ainda não tive tempo de testá-los. Quando conseguir relato o resultado aqui.
As Conclusões (por enquanto)
Converter VHS para DVD não é uma tarefa simples (nem para qualquer um) principalmente devido ao software. O hardware do Dazzle DVD Recorder está funcionando bem, o vídeo está sendo capturado com boa qualidade. Ainda não consegui de forma satisfatória gravar no PC em um formato adequado e depois passar isto para um DVD.
Considerando o preço do dispositivo de captura e o preço médio de um DVD (com vídeo de qualidade muito melhor, audio remasterizado em 5.1, capítulos, extras, legendas, etc) só compensa fazer a conversão se você tiver várias fitas "insubstituíveis". Ou se você for um masoquista.
quinta-feira, outubro 09, 2008
Microcontroladores - Final
Concluindo (finalmente!) esta série de posts (mas não encerrando o assunto que certamente voltará a ser visto neste blog), vamos a uma série de links.
Da palestra que deu início à série:
Os links para os sites dos fabricantes:www.microchip.com
Da palestra que deu início à série:
- o inevitável powerpoint
- o enfadonho vídeo
Os links para os sites dos fabricantes:www.microchip.com
sexta-feira, outubro 03, 2008
Microcontroladores - Parte 17
Neste penúltimo post da série, vou passar os meus conselhos finais.
Use os Recursos do C
Uma das características da linguagem C é possuir vários recursos que são implementados em tempo de compilação, não impactando a execução. Estes recursos permitem programas mais claros e com menos erros.
Infelizmente, alguns (muitos ?) desenvolvedores de sistemas embarcados resolvem "otimizar" o código deixando de usar estes recursos.
Alguns recursos importantes são:
Comentários não pesam no runtime, portanto não tem nenhuma contra-indicação para sistemas embarcados. Pelo contrário, a programação de microcontroladores é normalmente cheia de sutilezas que exigem comentários mais elaborados. Considere também o uso de uma ferramenta que gera documentação a partir dos comentários, como o Doxygen.
Procure o Equilíbrio
Em alguns casos, boas práticas de programação poderão entrar em conflito com a necessidade de otimização. Nestes casos (que são bem menos comuns do que pode parecer à primeira vista), é importante parar, pensar e procurar o ponto certo de equilíbrio.
Um erro comum é abandonar sumariamente as boas práticas visando um "otimização" desnecessária e que às vezes nem se concretiza. Na outra ponta, alguns iniciantes na programação de microcontroladores às vezes pensam que estão fazendo software para desktop e introduzem overheads inaceitáveis para o mundo embarcado.
Conheça Hardware
A programação de microcontroladores está a um degrau do hardware. Algumas coisas ficam muito difíceis de ser compreendidas por quem não tem noções básicas de hardware e eletrônica. Além disso, o programador de firmware tem uma interação muito forte com o projetista do hardware; este diálogo será mais fácil se um tiver uma idéia do mundo do outro.
Pense na Depuração
A correção de problemas constuma ser bem mais trabalhosa nos sistemas embarcados. É vital se pensar, desde o começo do projeto, nos recursos que estarão disponíveis para a depuração tanto durante o desenvolvimento como depois que o firmware for para o campo.
Use os Recursos do C
Uma das características da linguagem C é possuir vários recursos que são implementados em tempo de compilação, não impactando a execução. Estes recursos permitem programas mais claros e com menos erros.
Infelizmente, alguns (muitos ?) desenvolvedores de sistemas embarcados resolvem "otimizar" o código deixando de usar estes recursos.
Alguns recursos importantes são:
- defines: na mais delicado que fazer uma alteração simples que envolva "números mágicos" que foram colocados diretamente no código (e que podem se esconder na forma de expressões resolvidas na cabeça do programador, impossibilitando um find-replace).
- compilação condicional: dadas as limitações de memória dos microcontroladores, muitas vezes não é possível selecionar trechos a executar durante a execução (isto vale principalmente para trechos de auxílio à depuração). A compilação condicional fornece uma forma muito mais segura de remover um trecho de código (e recolocá-lo depois) do que o uso de comentários. A compilação condicional também facilita ter módulos fontes comuns a vários projetos (ao invés do copy-paste-altera que gera vários fontes parecidos porém diferentes, dificultando o aproveitamento de aperfeiçoamentos e correções).
- struct/union: o uso de struct e union permite documentar melhor estruturas e formatos do que o uso de índices sobre um vetor de bytes e ajudam a evitar erros grosseiros.
- bitfields: não são tão comuns quanto structs, mas tem a mesma finalidade.
- enum: quando se trata de valores relacionados, o enum é muito mais legível que uma sequência de defines.
- typedef: permite criar algo muito parecido com tipos personalidados e facilita criar fontes que serão usados em ambientes diferentes (através da criação de tipos "genéricos" como INT8, INT16 e INT32 que são resolvidos no tipo apropriado em cada ambiente).
Comentários não pesam no runtime, portanto não tem nenhuma contra-indicação para sistemas embarcados. Pelo contrário, a programação de microcontroladores é normalmente cheia de sutilezas que exigem comentários mais elaborados. Considere também o uso de uma ferramenta que gera documentação a partir dos comentários, como o Doxygen.
Procure o Equilíbrio
Em alguns casos, boas práticas de programação poderão entrar em conflito com a necessidade de otimização. Nestes casos (que são bem menos comuns do que pode parecer à primeira vista), é importante parar, pensar e procurar o ponto certo de equilíbrio.
Um erro comum é abandonar sumariamente as boas práticas visando um "otimização" desnecessária e que às vezes nem se concretiza. Na outra ponta, alguns iniciantes na programação de microcontroladores às vezes pensam que estão fazendo software para desktop e introduzem overheads inaceitáveis para o mundo embarcado.
Conheça Hardware
A programação de microcontroladores está a um degrau do hardware. Algumas coisas ficam muito difíceis de ser compreendidas por quem não tem noções básicas de hardware e eletrônica. Além disso, o programador de firmware tem uma interação muito forte com o projetista do hardware; este diálogo será mais fácil se um tiver uma idéia do mundo do outro.
Pense na Depuração
A correção de problemas constuma ser bem mais trabalhosa nos sistemas embarcados. É vital se pensar, desde o começo do projeto, nos recursos que estarão disponíveis para a depuração tanto durante o desenvolvimento como depois que o firmware for para o campo.
quarta-feira, outubro 01, 2008
Microcontroladores - Parte 16
Neste post vamos comentar rapidamente uma questão frequente: e o uso de C++ na programação de microcontroladores?
A programação em C++ em microcontroladores mais potentes, como os baseados na arquitetura ARM, é bastante tranquila. No modelos maiores de microcontroladores com arquitetura Von Newman, como o MSP430, é possível o uso de C++ (com alguns cuidados).
Nos microcontroladores com arquiteturas Harvard e/ou fortes limites de memória, a situação é complicada:
A programação em C++ em microcontroladores mais potentes, como os baseados na arquitetura ARM, é bastante tranquila. No modelos maiores de microcontroladores com arquitetura Von Newman, como o MSP430, é possível o uso de C++ (com alguns cuidados).
Nos microcontroladores com arquiteturas Harvard e/ou fortes limites de memória, a situação é complicada:
- Métodos virtuais e polimorfismo são normalmente implementados através de uma tabela de endereços de rotinas (a vtable). Arquiteturas Harvard tendem a dificultar este tipo de chamada indireta.
- A programação em C++ costuma exigir mais espaço na pilha, que é muito limitada nos microcontroladores mais simples.
- Pouca quantidade de memória dificulta o uso de alocação dinâmica de memória, como o heap do C++ usado para alocação de objetos através de new. Aliás, a alocação dinâmica de memória costuma se evitada na programação embarcada, pois as consequências de um leak de memória serão catastróficas.
Categorias:
Eletrônica,
Hardware,
Linguagens,
Programação
Assinar:
Postagens (Atom)