tag:blogger.com,1999:blog-40826212021494300472024-02-18T21:26:09.707-08:00Flávio Gomes da Silva LisboaFlávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.comBlogger28125tag:blogger.com,1999:blog-4082621202149430047.post-32042289957727511082021-08-23T11:56:00.005-07:002021-08-23T11:56:33.066-07:00GIT: error: o gpg não pôde assinar os dados fatal: failed to write commit object<p><b>Ambiente: </b></p><ul style="text-align: left;"><li>Ubuntu 18.04 LTS</li><li>git version 2.17.1</li></ul><p> </p><p><b>Mensagem de erro ao tentar fazer git commit:</b></p><p>error: o gpg não pôde assinar os dados<br />fatal: failed to write commit object</p><p></p><p><b>Solução: </b> </p><p></p><div style="text-align: left;"><span style="font-family: courier;">gpg2 --gen-key <br /></span></div><div style="text-align: left;"><span style="font-family: courier;">git config --global gpg.program gpg</span></div><div style="text-align: left;"><span style="font-family: courier;">git config --global commit.gpgsign true</span></div><div style="text-align: left;"><span style="font-family: courier;">gpg --list-secret-keys --keyid-format=long<br />git config --global user.signingKey [CHAVE IDENTIFICADA PELO COMANDO ANTERIOR]<br /></span></div><p><br /></p><p><br /></p>Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-12492067721856442252020-07-24T04:23:00.000-07:002020-07-24T04:23:00.048-07:00Desabilitar mensagens de erro no phpMyAdmin<br />
Inclua no arquivo config.inc.php, na primeira linha, a seguinte instrução:<br />
<br />
<span style="font-family: "Courier New", Courier, monospace;">$cfg['SendErrorReports'] = 'never';</span>Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-78626241661150688682020-03-18T10:34:00.001-07:002020-04-22T09:17:42.310-07:00Alterar a senha do usuário root do MySQL no Debian\Ubuntu<u>Premissas:</u><br />
<ul>
<li>Ambiente Linux Debian\Ubuntu</li>
<li>Seu usuário é administrador (está na tabela sudoers </li>
</ul>
<u>Procedimentos:</u><br />
<br />
No terminal, entre com o usuário root:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">sudo su</span><br />
<br />
Pare o servidor MySQL<br />
<span style="font-family: "courier new" , "courier" , monospace;"><br /></span>
<span style="font-family: "courier new" , "courier" , monospace;">service mysql stop</span><br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;">Execute o MySQL com seguinte argumento:</span><br />
<br />
<pre><span style="font-family: "courier new" , "courier" , monospace;">mysql --defaults-file=/etc/mysql/debian.cnf</span></pre>
<pre> </pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;">Selecione o banco mysql:</span></pre>
<pre> </pre>
<pre><span style="font-family: "courier new" , "courier" , monospace;">use mysql</span></pre>
<pre> </pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;">Altere a senha do usuário para a senha desejada de acordo com o modelo abaixo:</span></pre>
<pre> </pre>
<pre><span style="font-family: "courier new" , "courier" , monospace;">UPDATE user SET authentication_string=PASSWORD('mysql') WHERE User='root';</span></pre>
<pre> </pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;">Saia do MySQL:</span></pre>
<pre> </pre>
<pre><span style="font-family: "courier new" , "courier" , monospace;">quit</span></pre>
<pre> </pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;">Reinicie o servidor MySQL</span></pre>
<pre> </pre>
<pre><span style="font-family: "courier new" , "courier" , monospace;">service mysql start</span></pre>
<pre> </pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: small;">Faça o login normalmente.</span></span></pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: small;"> </span></span></pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: small;">Caso não funcione, experimente estes procedimentos:</span></span></pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: small;"> </span></span></pre>
<pre><span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: small;">https://linuxconfig.org/how-to-reset-root-mysql-password-on-ubuntu-18-04-bionic-beaver-linux </span></span></pre>
<pre> </pre>
Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-6141998771432743012018-12-04T10:51:00.001-08:002018-12-04T10:52:19.180-08:00Guia rápido de R<div class="entry-content">
<b>Onde obter o R</b><br />
<br />
<b>https://www.r-project.org/ </b><br />
<br />
<b>Instalação do R no Ubuntu/Debian:</b><br />
<br />
<code>sudo apt-get install r-base</code><br />
<br />
<span style="font-family: "arial" , "helvetica" , sans-serif;"><span style="font-size: large;"><b><code>Executando o R:</code></b></span></span><br />
<br />
<code>Digite r na linha de comando (ou r.exe no Windows)</code><br />
<br />
<b>Obtendo ajuda</b><br />
<br />
<code>help([NOME DA FUNÇÃO])<br />
help("[NOME DA FUNÇÃO]") // quando houver caracteres especiais<br />
help.start() // abre a ajuda no navegador web padrão</code><br />
<br />
<b>Executando comandos armazenados em um arquivo</b><br />
<br />
<code>source("[NOME DO ARQUIVO]") // o arquivo deve ter a extensão R</code><br />
<br />
<b>Desviando a saída do console para um arquivo externo</b><br />
<br />
<code>sink("[NOME DO ARQUIVO]")<br />
sink() // sem argumento restaura a saída para o console</code><br />
<br />
<b>Vendo objetos da sessão R</b><br />
<br />
<code>objects()</code><br />
<br />
<b>Removendo objetos da sessão R</b><br />
<br />
<code>rm([OBJETO1],[OBJETO2],...,[OBJETON])</code><br />
<br />
<b>Associando um vetor a um objeto</b><br />
<br />
<code>x </code><br />
<br />
ou<br />
<br />
<code>c([VALOR1],[VALOR2],...,[VALORN]) -> x</code><br />
<br />
ou<br />
<br />
<code>assign("x",c([VALOR1],[VALOR2],...,[VALORN]))</code><br />
<br />
Se um valor passado como argumento para a função c for um vetor, o
resultado não será um vetor multidimensional (uma matriz). Os valores do
elemento vetor serão inseridos no vetor resultado, na ordem em que
foram definidos. Assim, se x é o vetor gerado por c(10.4, 5.6, 3.1, 6.4,
21.7), y definido por c(x,0,x) será igual a:<br />
<br />
<code>10.4 5.6 3.1 6.4 21.7 0.0 10.4 5.6 3.1 6.4 21.7</code><br />
<br />
Ou seja, todos os elementos de x, depois o 0, e novamente os elementos de x.<br />
<br />
<b>Aritmética de vetor</b><br />
<br />
R permite a soma de vetores, inclusive de comprimentos diferentes. No
caso da diferença de tamanho, o cálculo é feito até o último elemento
do vetor maior, repetindo os elementos do vetor menor quando terminam.<br />
<br />
Por exemplo, imagine o vetor x com 5 elementos assim definido:<br />
<br />
<code>c(10.4, 5.6, 3.1, 6.4, 21.7) -> x</code><br />
<br />
E o vetor y, com 11 elementos, assim definido:<br />
<br />
<code>y 10.4 5.6 3.1 6.4 21.7 0.0 10.4 5.6 3.1 6.4 21.7</code><br />
<br />
Se criarmos um vetor v combinando x e y desta forma:<br />
<br />
<code>v </code><br />
<br />
O cálculo de cada elemento de v será feito desta forma:<br />
<br />
<code>v[1] = 2 * x[1] + y[1] + 1<br />
v[2] = 2 * x[2] + y[2] + 1<br />
v[3] = 2 * x[3] + y[3] + 1<br />
v[4] = 2 * x[4] + y[4] + 1<br />
v[5] = 2 * x[5] + y[5] + 1<br />
v[6] = 2 * x[1] + y[6] + 1<br />
v[7] = 2 * x[2] + y[7] + 1<br />
v[8] = 2 * x[3] + y[8] + 1<br />
v[9] = 2 * x[4] + y[9] + 1<br />
v[10] = 2 * x[5] + y[10] + 1<br />
v[11] = 2 * x[1] + y[11] + 1</code><br />
<br />
<b>Gerando sequências</b><br />
<br />
Para gerar uma sequência de inteiros de 1 a 30:<br />
<br />
<code>s = 1:30</code><br />
<br />
Para gerar uma sequência decrescente de 30 a 1:<br />
<br />
<code>s = 30:1</code><br />
<br />
Você pode usar uma variável para definir um dos limites de uma sequência. Assim se você define n com valor 10:<br />
<br />
<code>n </code><br />
<br />
Você pode criar uma sequência de 1 a 10 assim:<br />
<br />
<code>s = 1:n</code><br />
<br />
Você pode criar uma sequência com a função seq(). Existem dois formatos:<br />
<br />
<code>seq([ELEMENTO INICIAL],[ELEMENTO FINAL],by=[DIFERENÇA COMUM OU RAZÃO]) </code><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">seq(length=[QUANTIDADE DE ELEMENTOS],from=[ELEMENTO INICIAL],by=[DIFERENÇA COMUM OU RAZÃO])</span><br />
<br />
Você pode criar uma sequência a partir da repetição de elementos de
um vetor. Existem duas possibilidades, repetir um vetor n vezes ou
repetir n vezes os elementos de um vetor. Isso é feito com a função
rep(), assim:<br />
<br />
<code>rep([VETOR],times=[NUMERO DE VEZES QUE O VETOR SERÁ REPETIDO])</code><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">rep([VETOR],each=[NUMERO DE VEZES QUE CADA ELEMENTO DO VETOR SERÁ REPETIDO])</span><br />
<br />
Sendo assim, consideremos o vetor fibonacci assim definido:<br />
<br />
<code>fibonacci = c(1,1,2,3,5,8,13,21)</code><br />
<br />
Podemos gerar um vetor que repita fibonacci três vezes, assim:<br />
<br />
<code>trifibonacci = rep(fibonacci, times=3)</code><br />
<br />
trifibonacci terá o seguinte conteúdo:<br />
<br />
<code>1 1 2 3 5 8 13 21 1 1 2 3 5 8 13 21 1 1 2 3 5 8 13 21</code><br />
<br />
E podemos gerar outro vetor repetindo cada elemento de fibonacci três vezes, assim:<br />
<br />
<code>fibonaccigago = rep(fibonacci, each=3)</code><br />
<br />
fibonaccigago terá o seguinte conteúdo:<br />
<br />
<code>1 1 1 1 1 1 2 2 2 3 3 3 5 5 5 8 8 8 13 13 13 21 21 21</code><br />
<br />
<b>Vetores lógicos</b><br />
<br />
É possível gerar um novo vetor com elementos booleanos a partir de um vetor numérico existente usando condições lógicas.<br />
Por exemplo, o vetor pares, assim definido:<br />
<br />
<code>pares </code><br />
<br />
Pode gerar o vetor menorquesete, assim definido:<br />
<br />
<code>menorquesete </code><br />
<br />
Que terá o seguinte conteúdo:<br />
<br />
<code>TRUE TRUE TRUE FALSE FALSE</code><br />
<br />
<b>Valores ausentes</b><br />
<br />
NaN indica que o resultado de uma operação não é um número, o que
significa que essa operação não está definido para os números
envolvidos.<br />
Inf indica o infinito, ou o limite de 1/x quando x tende a 0.<br />
<br />
Abaixo seguem os resultados de algumas operações envolvendo as constantes NaN e Inf.<br />
<br />
0/0 : NaN<br />
1/0: Inf<br />
Inf/Inf: NaN<br />
1/Inf: 0<br />
Inf/0: Inf<br />
<br />
<b>Vetores de caracteres</b><br />
<br />
A função paste permite gerar um vetor de caracteres a partir de
outro, pela colagem de cada um dos elementos do vetor de origem aos
elementos de uma sequência numérica intermediados por um caractere
separador. Se o vetor de origem for menor que a sequência, seus
elementos serão repetidos até que o tamanho case com a sequência.<br />
Assim, o seguinte exemplo de uso da função paste():<br />
<br />
<code>labs </code><br />
<br />
Irá gerar o seguinte vetor:<br />
<br />
<code>"X1" "Y2" "X3" "Y4" "X5" "Y6" "X7" "Y8" "X9" "Y10"</code><br />
<br />
<b>Vetores indexados</b><br />
<br />
É possível selecionar subconjuntos de um vetor usando índices entre
colchetes. Os índices podem ser condições (expressões lógicas),
quantidades integrais positivas, quantidade integrais negativas (um
conjunto diferença) e cadeias de caracteres.<br />
<br />
<i>Expressões lógicas</i><br />
<br />
<div align="justify">
<span style="font-family: "courier new" , monospace;">y <- x[!is.na(x)]</span></div>
<div align="justify">
y é o subconjunto de x onde cada elemento retorna falso quando passado como argumento para a função is.na()</div>
<div align="justify">
<br /></div>
<i>Quantidades integrais positivas</i><br />
<br />
<div align="justify">
<span style="font-family: "courier new" , monospace;">z <- x[1:10]</span></div>
<div align="justify">
<br /></div>
<div align="justify">
z é o subconjunto dos dez primeiros elementos de x</div>
<div align="justify">
<br /></div>
<i>Quantidades integrais negativas</i><br />
<br />
<div align="justify">
<span style="font-family: "courier new" , monospace;">k <- x[-(1:5)]</span></div>
<div align="justify">
<br /></div>
<div align="justify">
k é o subconjunto de todos os elementos de x exceto os cinco primeiros.</div>
<div align="justify">
<br /></div>
<i>Cadeias de caracteres</i><br />
<br />
Para atribuir nomes a elementos de um vetor, use a função names(),
recebendo o vetor de nomes. Assim, supondo um vetor numérico fruit
assim:<br />
<br />
<div align="justify">
<span style="font-family: "courier new" , monospace;">fruit <- c(5, 10, 1, 20)</span></div>
<div align="justify">
<br /></div>
É possível atribuir nomes aos elementos desta forma:<br />
<br />
<div align="justify">
<span style="font-family: "courier new" , monospace;">names(fruit) <- c(“orange”, “banana”, “apple”, “peach”)</span></div>
<div align="justify">
<br /></div>
<div align="justify">
E um subconjunto do vetor resultado pode ser selecionado usando os nomes dos elementos, assim:</div>
<div align="justify">
<br /></div>
<div align="justify">
<span style="font-family: "courier new" , monospace;">lunch <- fruit[c(“apple”,”orange”)]</span></div>
<div align="justify">
<br /></div>
<div align="justify">
<b>Gerando de novos vetores a partir de funções</b></div>
<div align="justify">
<br /></div>
<div align="justify">
Um novo vetor pode ser gerado a partir de um
existente pela aplicação de uma função a cada um de seus elementos. Para
isso basta passar o vetor de origem como argumento para a função. Ela
retornará um vetor em que cada elemento será o resultado da chamada a
própria função com a passagem do elemento como argumento.</div>
<div align="justify">
<br /></div>
<div align="justify">
Se criarmos um vetor y assim:</div>
<div align="justify">
<br /></div>
<div align="justify">
<span style="font-family: "courier new" , "courier" , monospace;">y = c(-1,2,-3,4,-5,6,-7,8,-9,10)</span></div>
<div align="justify">
<br /></div>
<div align="justify">
Após sobrescrevê-lo assim:</div>
<div align="justify">
<br /></div>
<div align="justify">
<span style="font-family: "courier new" , monospace;">y <- abs(y)</span></div>
<div align="justify">
<br /></div>
Seu conteúdo será apenas de inteiros positivos.<br />
<br />
<b>Alternado o comprimento de um objeto</b><br />
<br />
É possível truncar o tamanho de um objeto usando os índices. Assim,
para limitar um objeto alpha aos seus primeiro cinco elementos fazemos
assim:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">alpha <- alpha[1:5]</span><br />
<br />
Também é possível limitar o tamanho usando a função length(), assim:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">length(alpha) <- 5</span><br />
<br />
É possível selecionar elementos alternados criando uma expressão
numérica. Por exemplo, para selecionar apenas os elementos com índices
pares dos cinco primeiros elementos:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">alpha <- alpha[2 * 1:5]</span><br />
<br />
<b>Ordenação de vetores</b><br />
<br />
É possível ordenar um vetor e eliminar os elementos repetidos usando as funções factor() e levels().<br />
Consideremos um vetor que contém siglas repetidas dos estados e
territórios da Austrália, correspondentes a uma amostra de auditores
fiscais australianos:<br />
<br />
<div align="justify">
<span style="color: black;"><span style="font-family: "courier new" , monospace;">state
<- c(“tas”, “sa”, “qld”, “nsw”, “nsw”, “nt”, “wa”, “wa”,”qld”,
“vic”, “nsw”, “vic”, “qld”, “qld”, “sa”, “tas”,”sa”, “nt”, “wa”, “vic”,
“qld”, “nsw”, “nsw”, “wa”,”sa”, “act”, “nsw”, “vic”, “vic”, “act”)</span></span></div>
<div align="justify">
<br /></div>
Com a função factor(), podemos gerar um objeto que contém os mesmos
dados do vetor acrescido da propriedade levels, que contém um vetor com
os elementos ordenados sem repetição. Assim, se criarmos um novo objeto
assim:<br />
<br />
<div align="justify">
<span style="color: black;"><span style="font-family: "courier new" , monospace;">statef <- factor(state)</span></span></div>
<div align="justify">
<br /></div>
<div align="justify">
O objeto statef conterá o vetor state e uma
propriedade levels, que é um vetor com os elementos de state ordenados,
sem repetição.</div>
<div align="justify">
<br /></div>
<div align="justify">
Para obter apenas o vetor ordenado, use a função levels():</div>
<div align="justify">
<br /></div>
<div align="justify">
<span style="font-family: "courier new" , "courier" , monospace;">levels(statef)</span></div>
<div align="justify">
<br /></div>
<b>Cálculo de média aritmética sobre elementos de vetores</b><br />
<br />
É possível calcular as médias aritméticas de conjuntos de valores
classificados por rótulos. Se você possui um vetor com os rótulos e
outro vetor com os valores associados aos rótulos, na mesma ordem, você
pode obter um novo vetor com as médias usando a função tapply().<br />
<br />
Suponha que haja um vetor com valores de impostos arrecadados por
auditores fiscais australianos, que casa justamente com o vetor state
citado anteriormente:<br />
<br />
<div align="justify">
<span style="color: black;"><span style="font-family: "courier new" , monospace;">incomes
<- c(60, 49, 40, 61, 64, 60, 59, 54, 62, 69, 70, 42, 56, 61, 61, 61,
58, 51, 48, 65, 49, 49, 41, 48, 52, 46, 59, 46, 58, 43)</span></span></div>
<div align="justify">
<br /></div>
Para obter a média de valor arrecadado por estado, usamos a função
tapply, passando o vetor de valores como primeiro argumento, o vetor
gerado pela função factor() como segundo argumento e a função mean()
(sem os parênteses) como terceiro argumento.<br />
<br />
<div align="justify">
<span style="color: black;"><span style="font-family: "courier new" , monospace;">incmeans <- tapply(incomes, statef, mean)</span></span></div>
<div align="justify">
<br /></div>
<div align="justify">
Isso produzirá com vetor com as médias de cada estado:</div>
<div align="justify">
<br /></div>
<div align="justify">
<span style="color: black;"><span style="font-family: "courier new" , monospace;">act nsw nt qld as tas vic </span></span></div>
<div align="justify">
<span style="color: black;"><span style="font-family: "courier new" , monospace;">44.500 57.333 55.500 53.600 55.000 60.500 56.000 </span></span></div>
<div align="justify">
<span style="color: black;"><span style="font-family: "courier new" , monospace;">wa</span></span></div>
<div align="justify">
<span style="color: black;"><span style="font-family: "courier new" , monospace;">52.250</span></span></div>
<br /></div>
Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-63950768242300808362018-05-11T07:04:00.001-07:002018-05-11T07:04:09.634-07:00Roteiro para chaves PGP usando GIT no Debianhttps://github.com/nextcloud/server/wiki/How-to-sign-your-commits-using-PGP<br />
<br />
https://keyring.debian.org/creating-key.html<br />
<br />
https://www.vivaolinux.com.br/topico/OTRS/Assinar-mensgens-com-o-gpg-(PGP)Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-60743825471095881302018-01-26T09:13:00.002-08:002018-01-26T09:13:12.050-08:00GIT: juntando commitsÀs vezes, para implementar uma funcionalidade, é preciso fazer vários
commits, mas no final você só precisa de um, com todas as mudanças.<br />
<br />
Para juntar vários commits, use o comando git rebase, neste formato:<br />
<br />
<pre>git rebase -i [branch]~[numero de commits]
</pre>
<br />
Por exemplo, se você quiser juntar os três ultimos commits do branch issue2814 <br />
<br />
<pre>git rebase -i issue2814~3</pre>
<pre> </pre>
Será aberto um editor com os commits.Substitua a palavra pick por
squash a partir da segunda linha, para que os commits anteriores sejam
mesclados ao último.<br />
<br />
Após salvar o arquivo com as mudanças, será aberto o commit único, para alteração dos comentários.
Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-55219382995674897402017-10-31T04:39:00.004-07:002017-11-06T08:58:47.506-08:00Nextcloud - configuração do arquivo de logA configuração do arquivo de log no Nextcloud é feita no arquivo <b>config.php</b> no diretório <b>config</b>.<br />
<br />
A localização do arquivo é definida pela chave logfile, mas cuidado! O valor padrão assumido é o diretório de dados do Nextcloud, definido pela chave <b>datadirectory</b>.<br />
<br />
<b>Configuração em servidor Linux</b><br />
<br />
O arquivo de log deve ter código de permissão 640 e ser de propriedade do usuário <b>www-data</b>.<br />
<br />
O código 640 atribui permissão de leitura e escrita (6) para o dono do arquivo,
somente leitura para usuários do mesmo grupo (4) e nenhuma permissão
para outros usuários (0).
<br />
<br />
Comandos para configurar isso no GNU/Linux:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">chmod 640 [arquivo de log]</span><br />
<span style="font-family: "courier new" , "courier" , monospace;">chown www-data [arquivo de log]</span><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><span style="font-size: small;"><span style="font-family: Times,"Times New Roman",serif;">Se após a criação do diretório, o Nextcloud reclamar que não há permissão para o arquivo de log, crie o arquivo .ocdata no diretório de dados [datadirectory].</span></span></span>Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com2tag:blogger.com,1999:blog-4082621202149430047.post-75985597675341039612017-06-30T10:09:00.003-07:002017-06-30T10:09:21.275-07:00Amanhecer Esmeralda<div style="text-align: justify;">
Já imaginou poder comprar uma revista em quadrinhos com uma história
completa que não continue na próxima edição, ou que não faça referência a
30 outras revistas diferentes? Para leitores de quadrinhos mais
infantis, como os da Turma da Mônica (original) e da Disney, essa é uma
realidade quase frequente. Mas para os leitores de quadrinhos de
super-heróis é um sonho distante. </div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi47txPSc302M5pqrFeVFh-TrG3QSexylMRVQbjxcrbwP7wHI2Yarh7lY4LiwTIPEsQcdnBSnQC6K8b5zK1e6V1mDbFKIuH60GO55MYSMgcbtoU53FGlOpwK8yByBVgVHoJqIo1HwdU0Fg/s1600/cara-dos-quadrinhos-simpsons.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="235" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi47txPSc302M5pqrFeVFh-TrG3QSexylMRVQbjxcrbwP7wHI2Yarh7lY4LiwTIPEsQcdnBSnQC6K8b5zK1e6V1mDbFKIuH60GO55MYSMgcbtoU53FGlOpwK8yByBVgVHoJqIo1HwdU0Fg/s320/cara-dos-quadrinhos-simpsons.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">"Uma história com começo, meio e fim em uma única revista?"</td></tr>
</tbody></table>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Entretanto houve um tempo em que as
histórias de super-heróis tinham roteiros tão descompromissados quanto
os quadrinhos infantis de hoje. Era o tempo em que os editores ainda não
tinham grandes preocupações com a continuidade e a cronologia dos
personagens. Era o tempo em que ainda os editores ainda não haviam visto
a oportunidade de obrigar os fãs a comprarem dezenas de revistas para
acompanhar uma história.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Os super-heróis da DC Comics, conhecidos
entre os setentistas e oitentistas como Superamigos, e pelos mais novos
como Liga da Justiça, viveram um momento em que os roteiristas não
precisavam de uma enciclopédia com referências cruzadas e vários álbuns
para poder escrever uma história. Eles podiam ignorar fatos passados ou
simplesmente incluí-los, contradizendo o que já havia sido escrito
antes.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNyZyL_Sk-vBfgNTmibqnFwjKnolXw4eMAqzTPvCqlqS2Kc7z_yM4FJz9UYsT8DO1d9SlR3tQBaFy7XX1Wi7oK_3x6NFqLMD1IKM9YTTsLydgyU5mJ8N8_U3M7PX-I9xS53eFzLPZbaJ0/s1600/mosaico-civil-war-676x1024.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNyZyL_Sk-vBfgNTmibqnFwjKnolXw4eMAqzTPvCqlqS2Kc7z_yM4FJz9UYsT8DO1d9SlR3tQBaFy7XX1Wi7oK_3x6NFqLMD1IKM9YTTsLydgyU5mJ8N8_U3M7PX-I9xS53eFzLPZbaJ0/s320/mosaico-civil-war-676x1024.jpg" width="211" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Guerra Civil: contradição de caráter</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Foi assim que o Superman, que no início só torna-se herói
adulto, logo depois passa a ter uma adolescência como Superboy. E logo o
último sobrevivente de Krypton passa a não ser mais tão último assim,
encontrando prima, cachorro, gato, cavalo e até inimigos vindos de seu
planeta.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikkKzP3oI27xV4nEAV3KuY-fj38ComXtocXDfJ4izYV5NfqQMZOQaqDd0aII08w6iiTutRkImKkCaC779Agkaa23ecEGDH-h17gPYtFTB1KBiyYF9TdaLTnhvAEj_1DbK-KTB7LyTUfHw/s1600/krypto15.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="313" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEikkKzP3oI27xV4nEAV3KuY-fj38ComXtocXDfJ4izYV5NfqQMZOQaqDd0aII08w6iiTutRkImKkCaC779Agkaa23ecEGDH-h17gPYtFTB1KBiyYF9TdaLTnhvAEj_1DbK-KTB7LyTUfHw/s320/krypto15.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Os super-animais de estimação</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nos anos 40 vários personagens foram criados, muitos tendo a
magia como fonte de poder, como o Lanterna Verde original, Alan Scott, o
Senhor Destino e o Gavião Negro original. Nos anos 60, vários heróis
foram reformulados, para terem uma origem mais científica. Assim
surgiram o segundo e mais conhecido Flash, Barry Allen, o Lanterna Verde
Hal Jordan, e o Gavião Negro alienígena Katar Hol.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPylfM8ZGvEVdqJwiKroiJBI0pvXgHpceaAe6vmkglGxnUu_cabTiEMT7OXCQPnTvKeYlWxGvud-SZ0kslDK-3l1ak3wCFc2FQY-u-CHk-7nn00ZRl_8uIXmA_VEuOIIDb3dTXm3Vtbyk/s1600/Flash123.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPylfM8ZGvEVdqJwiKroiJBI0pvXgHpceaAe6vmkglGxnUu_cabTiEMT7OXCQPnTvKeYlWxGvud-SZ0kslDK-3l1ak3wCFc2FQY-u-CHk-7nn00ZRl_8uIXmA_VEuOIIDb3dTXm3Vtbyk/s320/Flash123.jpg" width="221" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Os Flashes da Era de Prata e de Ouro</td></tr>
</tbody></table>
<div style="text-align: justify;">
</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrEPtcrFLfd3jIbqSwnrauDThUz1XviRq17pdL2ayAaaplo_bTT5QEuWvz6-T6YyF8X_7uZ1g5lRvy4jLo3Vg3d5FOOqV5mjAKgztKzbjCh5EWFaFEbbJl1HBEjcOBQLweH8Y8U2E83kE/s1600/GreenLantern40.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrEPtcrFLfd3jIbqSwnrauDThUz1XviRq17pdL2ayAaaplo_bTT5QEuWvz6-T6YyF8X_7uZ1g5lRvy4jLo3Vg3d5FOOqV5mjAKgztKzbjCh5EWFaFEbbJl1HBEjcOBQLweH8Y8U2E83kE/s320/GreenLantern40.jpg" width="216" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Os Lanternas Verdes da Era de Prata e de Ouro</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Só que havia um
problema. Superman, Batman e Mulher-Maravilha haviam lutado com os
heróis dos anos 40, a Sociedade da Justiça. E agora, eles lutam com os
heróis dos anos 60, a Liga da Justiça. E em vinte anos, continuavam
enxutos. Como explicar isso? Aliás, como explicar que, aparentemente, a
trindade da DC Comics parecia não se lembrar de ter lutado com a
Sociedade da Justiça? Em uma história do Flash Barry Allen chamada
Flash of Two Worlds, publicada na revista Flash #123 de 1961, o Flash
dos anos 60 se encontra com o Flash dos anos 40. Voltando no tempo? Não,
porque o Flash dos anos 40 nunca existiu na história do Flash dos anos
60. Então como? O que ocorre é que ambos descobrem que existem terras
paralelas. Ou seja, em uma Terra há um Flash, e ela está na década de
40, enquanto em sua cópia há um outro, só que ela está vive a década de
60. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi57DNEfpLDV7Pnu8wbxxVlNxd5VT6929Mfx-liB5a7skTKPKSyy6KLRrXGbxtedBuV_-kC_Cx7TXuQJCzg7c41UMNtV5DK4uMx1FTSnVbPM_fT4RgxH7jCg6yF1o3ZrfALnXofC_fpHRA/s1600/DC_Comics_Presents_87.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi57DNEfpLDV7Pnu8wbxxVlNxd5VT6929Mfx-liB5a7skTKPKSyy6KLRrXGbxtedBuV_-kC_Cx7TXuQJCzg7c41UMNtV5DK4uMx1FTSnVbPM_fT4RgxH7jCg6yF1o3ZrfALnXofC_fpHRA/s320/DC_Comics_Presents_87.jpg" width="211" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Superman e Superboy</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Confuso? Isso piorou com o tempo. Pra tentar explicar as
incoerências geradas pela falta de continuidade nas histórias foram
sendo criadas várias terras paralelas: Terra 3, Terra X, Terra S, Terra
Prime e milhares outras. A Terra da Liga da Justiça era a 1, enquanto a
Terra da Sociedade da Justiça era a 2. De vez em quando os heróis de
Terras diferentes se encontravam. Às vezes ocorriam coisas curiosas,
como a morte do Batman da Terra 2 (que teve uma filha com a Mulher Gato)
enquanto sua contraparte na Terra 1 permanecia viva. Bem, um dia a
DC resolveu arrumar a bagunça e tentar estabelecer uma única Terra, com
uma única cronologia. Mas não dava pra simplesmente começar do zero sem
dar uma satisfação para os leitores. Então surgiu uma das maiores sagas
dos quadrinhos nos anos 80: a Crise nas Infinitas Terras. Essa foi uma
história magistral, publicada originalmente em doze edições, que reuniu
todos (TODOS) os personagens da DC Comics em um confronto com o
Antimonitor, uma criatura de anti-matéria que queria destruir o
multiverso (o universo com as múltiplas Terras). </div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfNWRDRx1v5DXTa1Wqa84SdMUKzYLf9jjGoGXwan4OEcHcPIYXHdRVZutwZy-F40wiJbuQMh2KcDuLbBgjfxBMa-W-dK-D2y3cJyzaNux5QR6-8V4lsaPNNmq5ffzi7N5ixK-QQLwzOw8/s1600/Alex-Ross-cover-to-the-collected-Crisis-on-Infinite-Earths.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="292" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfNWRDRx1v5DXTa1Wqa84SdMUKzYLf9jjGoGXwan4OEcHcPIYXHdRVZutwZy-F40wiJbuQMh2KcDuLbBgjfxBMa-W-dK-D2y3cJyzaNux5QR6-8V4lsaPNNmq5ffzi7N5ixK-QQLwzOw8/s640/Alex-Ross-cover-to-the-collected-Crisis-on-Infinite-Earths.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Os personagens de Crise nas Infinitas Terras, por Alex Ross</td></tr>
</tbody></table>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
No final da saga, as
Terras (que sobreviveram) são fundidas em uma única Terra. Alguns
heróis e vilões morrem, para solucionar as incoerências, como o Robin e a
Caçadora da Terra 2 e a Supermoça. Infelizmente, alguns que não
precisavam morrer por causa disso também sucumbem, como o Flash. A
partir do final da Crise, toda a cronologia do universo DC foi
unificada, tanto que os autores da saga, Marv Wolfman e George Pérez,
escreveram "A História do Universo DC", para servir de referência para
os artistas e leitores. A partir daí, os principais personagens da DC
Comics tiveram suas origens recontadas. Um desses foi o Lanterna Verde
da Era de Prata (anos 60). E tudo o que foi falado até agora foi apenas
uma introdução para a história dos anos 80 que reconta a origem do
personagem criado na década de 60.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAzxgx_YHIN0DbmNSy-iRQedyM9KrgU1_LPh2iMcWi0GUKiCU7WL2-jIrbOD9KAhAy9R5iC1qyHM7QgOcWClbojYP6KtooEBW7gpR8-5Rft5cRx3_gm3UX0qAwEaOY1jikBSv5tUt-Ahc/s1600/HistoriaUniversoDC-01062009.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAzxgx_YHIN0DbmNSy-iRQedyM9KrgU1_LPh2iMcWi0GUKiCU7WL2-jIrbOD9KAhAy9R5iC1qyHM7QgOcWClbojYP6KtooEBW7gpR8-5Rft5cRx3_gm3UX0qAwEaOY1jikBSv5tUt-Ahc/s1600/HistoriaUniversoDC-01062009.jpg" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">A história do universo DC</td></tr>
</tbody></table>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
O nome dessa história é Emerald
Dawn, traduzida aqui como Amanhecer Esmeralda. O que ela tem de
importante hoje? Bem, parte dela serviu para o infame primeiro filme solo
do Lanterna Verde. E olha que o personagem
já apareceu em péssimas produções cinematográficas antes, mas sempre como parte
de uma equipe. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Os fãs do Lanterna Verde esperaram pela chance
de assistir a uma produção que honrasse toda a mitologia da Tropa dos
Lanternas Verdes, conceito criado por John Broome e Gil Kane, logo na
primeira história em quadrinhos de Hal Jordan, o Lanterna que foi
interpretado por Ryan Reynolds que mais tarde ironizou sua atuação no filme solo de Deadpool.</div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Quwfvoc-9flyAszoCTRG2E0_IfBLt1Wg4GZ0rznKLLGehthTD0We4wn2zlkw_jfYN_jcUNVXakFHdtRBIAo5yaEPx3dz0nBzswRqekUHHPjuaW74xuPNDJMQ6Pp9pP35AzwWGuSZy14/s1600/greenlanternmovie.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2Quwfvoc-9flyAszoCTRG2E0_IfBLt1Wg4GZ0rznKLLGehthTD0We4wn2zlkw_jfYN_jcUNVXakFHdtRBIAo5yaEPx3dz0nBzswRqekUHHPjuaW74xuPNDJMQ6Pp9pP35AzwWGuSZy14/s320/greenlanternmovie.jpg" width="226" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">O primeiro filme solo do Lanterna Verde</td></tr>
</tbody></table>
<div style="text-align: justify;">
A Tropa dos Lanternas Verdes tem uma
grande importância na Crise das Infinitas Terras. Na verdade, a origem
da crise se dá no planeta Oa, que é o lar dos Guardiões do Universo, os
criadores da Tropa. </div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu-OsvXRj1v5_YaoOyc7QGEp7zl-5ZOM8LjTtw7HzUsX5Z1POWbzkSC7yJUUigobFlfErZr7w0bnwy1pB9Qmajo0d1se2z4gPPSlr3PylKawbQ9bQlP8p5fkHU8jjwalSkulF8SG2YhYo/s1600/greenlanterncoprs.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="270" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhu-OsvXRj1v5_YaoOyc7QGEp7zl-5ZOM8LjTtw7HzUsX5Z1POWbzkSC7yJUUigobFlfErZr7w0bnwy1pB9Qmajo0d1se2z4gPPSlr3PylKawbQ9bQlP8p5fkHU8jjwalSkulF8SG2YhYo/s640/greenlanterncoprs.jpg" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Os milhares de membros da Tropa dos Lanternas Verdes, exceto Mogo, um vírus e uma equação</td></tr>
</tbody></table>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Eu resolvi reescrever este artigo, criado originalmente em meu site (<a href="http://www.fgsl.eti.br/">www.fgsl.eti.br</a>) após assistir ao
primeiro trailer do filme Lanterna Verde, que infelizmente não foi o filme que o gladiador esmeralda merecia. Mas percebi que diversas frases foram retiradas
da história Amanhecer Esmeralda. Eu pessoalmente gosto muito dessa
história. É bem escrita (ao contrário do filme) e bem desenhada, e ainda não tem aquela
sanguinolência dos quadrinhos pós-Watchmen e Cavaleiro das Trevas. É
algumas vezes poética e até inspiradora. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Em uma das cenas do filme, Hal Jordan diz
que um Lanterna Verde não pode ter medo, mas ele não é assim. Em
Amanhecer Esmeralda, quando Abin Sur encontra Hal e lhe diz que ele foi
escolhido para ser seu sucessor, ele responde: </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
"Você disse que um
Lanterna Verde tem de ser corajoso e eu estou me borrando nas
calças". </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Abin Sur responde: </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
"Se o anel o escolheu, é porque você
tem o potencial para superar o medo". </div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFromvzRqc8vdvJFFv-UworfNyuzD0oGvUjOykIqqJGPI7G2gWhcMkCC02Q3q-BypD3DmWQ3-eqDTXvvXb-PmRsZ9N4RUF65x69VTYiJQouhVvSxD0iiGv2hNrngNHXEHMblvFxmnjHDU/s1600/ed01.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjFromvzRqc8vdvJFFv-UworfNyuzD0oGvUjOykIqqJGPI7G2gWhcMkCC02Q3q-BypD3DmWQ3-eqDTXvvXb-PmRsZ9N4RUF65x69VTYiJQouhVvSxD0iiGv2hNrngNHXEHMblvFxmnjHDU/s400/ed01.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Abin Sur e Hal Jordan</td></tr>
</tbody></table>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
No infame filme, é Carol Ferris, o
amor de Hal, quem lhe diz:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
"Você tem a habilidade de superar o
medo". </div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUxUYBWqlcQzEqs2P3FiAt-jyMKPyDMzmATOAY91JmJQQKpExT0LGyp31sNKSRbbEViojtASf1pjBpkXMpSTjAL2UlkkF-gr2yFkB2wo0IjyYdYN2rhyphenhyphenGwqSZVvY8utBdYtfTuC_KlDzQ/s1600/11film_green_lantern_lively_looking_up_600.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="180" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUxUYBWqlcQzEqs2P3FiAt-jyMKPyDMzmATOAY91JmJQQKpExT0LGyp31sNKSRbbEViojtASf1pjBpkXMpSTjAL2UlkkF-gr2yFkB2wo0IjyYdYN2rhyphenhyphenGwqSZVvY8utBdYtfTuC_KlDzQ/s320/11film_green_lantern_lively_looking_up_600.jpg" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Blake Lively como Carol Ferris</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
O encontro entre Hal e Abin Sur ocorre, guardadas
as adaptações, de maneira bastante similar a origem recontada em 1986, embora de forma bem sucinta (e pouco épica).
Aliás, no filme aparece o planeta Oa e os outros Lanternas que Hal
conhece na história, que serão os mais influentes em sua carreira de
super-herói: Tomar Re, Killowog e Sinestro. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
O Hal Jordan
vivido por Reynolds é um sujeito pouco responsável, que de repente se vê
com uma enorme responsabilidade nas mãos. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Em Amanhecer Esmeralda, Hal é
retratado como um cara que carrega uma dor pela morte do pai (que
também era piloto) e vive uma fase de seguidos fracassos. A cena fo filme em que
ele ejeta do caça após uma pane me deixou com a suspeita de que tentaram fazer referência ao roteiro de Amanhecer Esmeralda, mas infelizmente, descartaram essa explicação.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Eu sempre quis que Amanhecer
Esmeralda virasse filme, pois é uma história fantástica, realmente
poderia ser a origem definitiva (mas contaram ela de novo pra consertar a besteira de terem matado Hal Jordan). Seria fantástico assistir a um filme baseado nessa saga. Aliás, eu não entendo porque Warner Bros complica tanto suas produções, enquanto a Marvel Studios apenas segue os roteiros dos quadrinhos adaptando o que é necessário mas mantendo a essência dos personagens e a trama principal das sagas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9vw2QKM0unsmsD26dX6tzLg80URgNrrGDYZF8FJwam1HjFuVvXQz-jUAxcTYOeFPb3cW7muKmnXRGPrrwXkcxXnzuozRM-fzmnl_Heqcp-ZKzcc0K3WHX1Aq4ittewx3pBQ90wtd1IZg/s1600/ae.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj9vw2QKM0unsmsD26dX6tzLg80URgNrrGDYZF8FJwam1HjFuVvXQz-jUAxcTYOeFPb3cW7muKmnXRGPrrwXkcxXnzuozRM-fzmnl_Heqcp-ZKzcc0K3WHX1Aq4ittewx3pBQ90wtd1IZg/s400/ae.png" width="285" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Amanhecer Esmeralda - versão brasileira</td></tr>
</tbody></table>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Uma nova produção com a Tropa dos Lanternas Verdes já foi anunciada. Quem sabe eu ainda
ouça a frase de Hal, quando entrou na bateria central pela primeira
vez: "Eu anda tenho medo? Sim. Mas o medo não importa mais". </div>
Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-79341595927460649752017-02-14T16:22:00.003-08:002017-02-14T16:22:37.013-08:00Cloud programmers<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy8aXSjVoKAFL6qbIHdXwdg3CiTLWpXyCvXJ9LKOFQw54kkYWDJBh93dP43mrpP6Dtgn7132OQ4GlgsZeuRt8LtXH3QniVoAH6nJMWurEPCT0Td2HoZ-ByPCbuv1tm-2DDxaWoBf3IXOM/s1600/andando_nas_nuvens_af09e065e071ea1c66a3e91a69c098c1_nas+nuvens.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="251" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhy8aXSjVoKAFL6qbIHdXwdg3CiTLWpXyCvXJ9LKOFQw54kkYWDJBh93dP43mrpP6Dtgn7132OQ4GlgsZeuRt8LtXH3QniVoAH6nJMWurEPCT0Td2HoZ-ByPCbuv1tm-2DDxaWoBf3IXOM/s320/andando_nas_nuvens_af09e065e071ea1c66a3e91a69c098c1_nas+nuvens.jpg" width="320" /></a></div>
<br />
<br />
<br />
<br />
<br />
<div style="text-align: justify;">
O conceito de <b>programador em nuvem </b>(em inglês, <i>cloud programmer</i>) refere-se à utilização total da memória e das capacidades de raciocínio de um programador por meio de todos os meios de comunicações que estiverem disponíveis para abrir demandas. <br /><br />O programador em nuvem pode ser acionado de qualquer lugar do mundo, a qualquer hora. Não há necessidade do programador comparecer a um local de trabalho, porque qualquer lugar onde ele possa conectar seu notebook e pegar sinal de celular é um local de trabalho. Você pode abrir demandas para o programador em nuvem remotamente, através da Internet, usando e-mail, mensageria instantânea, Skype, ou qualquer outro programa <br /><br />O programador em nuvem tem elasticidade. Ele é capaz de aumentar a sua capacidade de resolver problemas de acordo com o aumento da demanda. <br /><br />O programador em nuvem é multitarefa: ele trabalha em vários projetos simultaneamente. Ele usa várias janelas no seu desktop e vários monitores ao mesmo tempo. Ele codifica usando as mãos, os pés, a voz e os olhos. Enquanto ele desenvolve, atende ao telefone, participa de reuniões, faz relatórios e presta consultoria.<br /><br />O programador em nuvem é 24X7. Não existe distinção entre vida profissional e vida social. Aliás, não existe vida social. Todos os recursos devem ser direcionados para o atendimento de demandas.<br /><br />Você não precisa de mais programadores. Basta abrir as demandas para o programador em nuvem e ele automaticamente irá expandir o tempo para terminar dez demandas no período em que ele não conseguiria nem atender a uma.<br /><br />O programador em nuvem está em algum local elevado, onde não existe necessidade de comida, lazer ou qualquer coisa mundana. Só precisa de um suprimento de oxigênio para o cérebro funcionar.<br /><br />O programador em nuvem é onipresente. Envolva ele em quantos compromissos você quiser, agende quantas reuniões você precisar. Ele conseguirá tempo infinito para participar de todas as atividades dispensáveis e ainda fazer o seu trabalho.</div>
Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-25694722879436930042017-02-14T16:10:00.002-08:002017-02-14T16:10:50.436-08:00Não fique preso à tecnologia<b>Filme</b>: Homem de Ferro 2.<br />
<div style="text-align: justify;">
<b>Cena</b>: Tony Stark recebeu alguns objetos pessoais de seu pai Howard Stark, dados por Nick Fury, o diretor da S.H.I.E.L.D. Entre os objetos está uma fita de vídeo, com uma gravação feita em 1974. Quando seu pai termina a mensagem para a Expo Stark, ele inicia uma outra mensagem para o filho. Nela, Howard diz que está limitado pela tecnologia de sua época, mas que Tony não, e por isso poderá realizar aquilo que ele projetou.</div>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPOZ8Ip7ASchST8TbdaGWwUYJAZ1P4Nk9V47-IPCJ041YzN3mZ_tmHffURnSCoKRvIWchu4ui1k1KWUuUgXN-e0sIA_55Fcegou-2wuqEmgfted1ysjVpzl5wKd7ZWquA3PMNNrMesvA4/s1600/howard_stark-iron-man-2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhPOZ8Ip7ASchST8TbdaGWwUYJAZ1P4Nk9V47-IPCJ041YzN3mZ_tmHffURnSCoKRvIWchu4ui1k1KWUuUgXN-e0sIA_55Fcegou-2wuqEmgfted1ysjVpzl5wKd7ZWquA3PMNNrMesvA4/s320/howard_stark-iron-man-2.png" width="320" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Howard Stark, pai de Tony Stark</td></tr>
</tbody></table>
Tony está sendo envenenado pelo paladium, o elemento utilizado no reator arc de seu peito, que o mantém vivo, desde que estilhaços de uma bomba se alojaram em seu peito, no Afeganistão. Ele precisa substituir o paladium por outro elemento químico, mas não existe um substituto disponível. A partir da mensagem do pai, Tony descobre que a maquete da Expo Stark é um esquema para a composição de um novo elemento químico. Ele cria um acelerador de partículas, e partir do esquema do pai, cria o novo elemento, que passa a usar em um novo reator.<br /><br />Quero enfatizar a mensagem de Howard Stark, de que ele estava limitado pela tecnologia da época. Ela vale para o desenvolvimento de software. Nós também limitamos nossos projetos à tecnologia que temos disponível. Na verdade, é ainda pior que isso, ficamos presos a somente um tipo de tecnologia e passamos a criar arquitetura a partir de uma tecnologia existente, em vez de projetar a arquitetura e buscar as tecnologias que a implementam. Ficamos subjugados pelas soluções de software existentes e não inovamos por não desafiar as restrições que elas impõem.<br /><br />Um arquiteto tem de ousar experimentar. Tem de ter uma atitude Oscar Niemeyer. Já pensaram se Niemeyer ficasse limitado às tecnologias de construção civil para conceber seus projetos. Ele viaja, ousa, depois verifica se é possível. Não sendo possível, pode rever o projeto. Mas ele não tem medo de ousar.<br /><br />É natural que nos apeguemos ao passado, pois isso gera uma sensação de conforto. Aquilo que já vimos funcionar nos dá mais segurança. Não queremos arriscar, porque o sucesso é esquecido rapidamente, mas o fracasso é lembrado eternamente. Um sucesso não apaga um fracasso. Mas isso é decorrência do medo também, porque o fracasso sempre é uma possibilidade. Faz parte de qualquer empreendimento. Deve constar na avaliação de riscos. Mas não podemos trabalhos com risco zero. Conforme houver capacidade de recuperação, devemos tentar algo novo, algo inesperado.<br /><br />Os primeiro carros eram parecidos com carruagens, porque esse era o modelo que o homem conhecia à época. Ele tentava criar uma carruagem sem cavalos. A medida que a lembrança das carruagens foi ficando mais distante, o carro começou a se tornar algo completamente diferente da carruagem. Mas mesmo assim, alguns ousavam. Veja a imagem abaixo.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVsk54d-PCTxZfH81WZcE0duLZasjH2OiWaintImlBDgraWOU2CgSt0jCzg3nXSdq0K-zd_Eft07U3Lfqm9tY4-9bWwVP1LSdrWQ2COYpBmUMuXouiPk1-BXdEGQfu32njIZdsnVHIO6I/s1600/edison_1900.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="280" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVsk54d-PCTxZfH81WZcE0duLZasjH2OiWaintImlBDgraWOU2CgSt0jCzg3nXSdq0K-zd_Eft07U3Lfqm9tY4-9bWwVP1LSdrWQ2COYpBmUMuXouiPk1-BXdEGQfu32njIZdsnVHIO6I/s400/edison_1900.jpg" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Thomas Edison e um de seus carros elétricos</td></tr>
</tbody></table>
Um carro elétrico, produzido pelo inventor da lâmpada, Thomas Edison. Na verdade, os carros elétricos existiam desde 1830. Nos Estados Unidos houve uma época em que havia estações de recarga de baterias, no lugar de postos de gasolina. Hoje estamos discutindo a poluição causada pelos veículos a gasolina e uma das barreiras para substitui-los por carros elétricos é a falta de estações de recarga. Depois de quase um século, vemos que Thomas Edison SEMPRE ESTEVE CERTO QUANTO AO CARRO ELÉTRICO. Porque ousou experimentar.<br />Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-30668693188393136862017-02-14T07:33:00.006-08:002017-02-14T07:33:39.169-08:00Linux: Como saber quantos arquivos existem um um diretório<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">O comando abaixo: </span></span></span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">ls -laR | grep -v ^[.dlt] | grep -v ^$ | wc -l</span></span></span><br />
<br />
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">lista todos os arquivos dentro do diretório atual, incluindo todos os seus subdiretórios. </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Você pode fazer o teste em um diretório com poucos arquivos e subdiretórios (que você consiga contar), só pra verificar que funciona mesmo.
Eu obtive essa informação no site <a href="http://linuxquestions.org/">linuxquestions.org</a>, por meio do usuário <b>w1k0</b>. Como seguramente irei esquecê-lo (tanto o comando quanto o link), registrei aqui para acesso rápido e compartilhado.</span></span></span></div>
Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-51231707897167212612017-02-14T07:30:00.001-08:002017-02-14T07:30:22.358-08:00PHP e Python para Universitários - aula zero<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Segundo o professor Carlos Yujiro Shigue (2009), "o Cálculo Numérico consiste na obtenção de soluções aproximadas de problemas de Álgebra Linear e Não-Linear, Estatística e Análise de Dados, Cálculo Diferencial e Integral e outros métodos matemáticos, utilizando métodos numéricos. Com a popularização de computadores de baixo custo e de alta capacidade de processamento, praticamente todas as atividades de Engenharia tem feito uso cada vez mais intensivo dos métodos e técnicas computacionais na resolução de problemas reais, para os quais as soluções manuais são impraticáveis e/ou imprecisas".</span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">No entanto, o professor também chama a atenção para alguns problemas relacionados à aritmética computacional: </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<ul>
<li><span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">"No computador, geralmente, a quantidade de operações aritméticas que se pode realizar é muito maior do que aquelas realizadas manualmente, de forma que o erro de arredondamento do dispositivo de cálculo se torna importante".</span></span></span></li>
<li><span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">"No computador não temos como checar cada operação, tendo em vista a velocidade com elas são realizadas e também pela quantidade, que impossibilita a conferência dos resultados das operações aritméticas".</span></span></span></li>
</ul>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">O professor Shigue mostra um exemplo de problema usando linguagem C:</span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">void main()
{</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> int i;</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> float soma = 0.;</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> for(i=1;i<=10000;i++)</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> soma = soma + .0001;</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> printf("Soma = %10.7f", soma);</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">} </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Veja, estamos somando 1 milionésimo mil vezes. Bem, 1000 X 0,001 = 1, certo? Por isso, o código acima deveria, teoricamente, imprimir o número 1, com sete zeros na parte fracionária. Mas em vez disso, segundo o professor, ele imprime 1.0000535.
Eu fiz um teste criando um programa com o código acima. Compilei com o gcc 5.4.0 em uma máquina com Ubuntu 16.04. É claro que acrescentei no início a importação #include <stdio.h>, que o professor omite em sua nota de aula. Sem essa linha o código não funciona.
Bem, eu obtive como resultado exatamente 1.0000535, confirmando o que o professor disse. </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Bem, meus amigos, tenho que lhes dizer que isso não acontece em PHP e Python.
Fiz o código equivalente em PHP: </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><?php</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">$soma = 0;</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">for($i=1;$i<=10000;$i++)</span></span></span></div>
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> $soma = $soma + (float) 0.0001;</span></span></span><div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">printf("Soma = %10.7f", $soma);</span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Executei esse código com o PHP 7.0.8 e o resultado foi este: 1.0000000</span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Fiz o código equivalente em Python:</span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">soma = 0.0; </span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">for i in range(1,10001):</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> soma = soma + 0.0001</span></span></span></div>
<div style="text-align: justify;">
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">print "Soma = %10.7f" % soma</span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Executei esse código com o Python 2.6.5 e o resultado foi este: 1.0000000
Ora, vejam só! PHP e Python são mais precisos que a linguagem C! </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">É claro! Eles são escritos em C, mas aprimoram os recursos dela.
Bem, para quem achava que PHP e Python não serviam para computação científica, se quiser envie uma mensagem perguntando como se resolvem problemas de matemática computacional com essas duas linguagens livres e podemos publicar outros artigos.
Até lá.</span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"><u>Referência</u>:
Shigue, C. Y. <b>Notas de Aula</b>. Disponível em <a href="http://www.alunos.eel.usp.br/numerico/notas.html">http://www.alunos.eel.usp.br/numerico/notas.html</a>. Acesso em 13/04/2011.</span></span></span></div>
Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-73179980504197404542017-02-14T07:19:00.005-08:002017-02-14T07:19:44.407-08:00Tipagem de Variáveis<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Podemos considerar duas classificações para variáveis, uma baseada na manutenção dos tipos de dados existentes e outra baseada na definição de seus tipos.
Para a primeira classificação, podemos distinguir dois tipos de variáveis: forte e fraca.
Para a segunda temos outros dois: estática e dinâmica.
A <b>tipagem forte</b> ocorre quando a linguagem não permite que uma variável tenha seu valor automaticamente alterado para outro tipo para possibilitar uma operação .
A <b>tipagem fraca</b> ocorre quando a linguagem permite que uma variável tenha seu valor automaticamente alterado para outro tipo para possibilitar uma operação.
A <b>tipagem estática</b> ocorre quando a linguagem obriga a prévia declaração de tipo de uma variável, sendo que uma vez definida, ela não pode mudar de tipo.
A <b>tipagem dinâmica</b> ocorre quando a linguagem não obriga a prévia declaração de tipo de uma variável. O tipo é assumido na atribuição de valor à variável, que pode ser por presunção ou forçado com casting. Além disso, é possível modificar o tipo da variável atribuindo-lhe outro valor. </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Com relação a tipagem forte e fraca, podemos ver um exemplo simples utilizando os modos interativos de PHP e Python.
Execute o Python no terminal: </span></span></span></div>
<br />
<span style="font-size: small;"><span style="font-family: "Courier New",Courier,monospace;">Python 2.7.12 (default, Nov 19 2016, 06:48:10) <br />[GCC 5.4.0 20160609] on linux2<br />Type "help", "copyright", "credits" or "license" for more information.<br />>>> </span></span><br />
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Agora vamos criar duas variáveis. Uma chamada numero1 é um inteiro contendo o número 2. A segunda, chamada numero2 é uma string contendo o texto "3". Em seguida vamos tentar somar o conteúdo das duas variáveis.</span></span></span></div>
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">>>> numero1 = 2 </span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">>>> numero2 = "3" </span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">>>> print numero1 + numero2 </span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Traceback (most recent call last):</span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> File "<stdin>", line 1, in <module></span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">TypeError: unsupported operand type(s) for +: 'int' and 'str' </span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">>>> </span></span></span><br />
<br />
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Como você pode ver, ocorreu um erro, pois as variáveis são de tipos diferentes. Ou melhor, não dá para adicionar um tipo inteiro a um string.
Agora vamos fazer a mesma coisa em PHP. Primeiro, abra o modo interativo: </span></span></span></div>
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;"> ~$ php -a </span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;">Interactive mode enabled<br /><br />php ></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Agora tente somar um inteiro com um string: </span></span></span><br />
<br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">php > $numero1 = 2; </span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">php > $numero2 = '3';</span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">php > print $numero1 + $numero2;</span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">5 </span></span></span><br />
<span style="font-family: "Courier New",Courier,monospace;"><span style="font-size: small;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">php ></span></span></span><br />
<br />
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Que interessante. PHP não se voltou para o programador e disse "seu burro, não posso somar um número com um texto!". A partir da operação, ele tomou uma decisão: 'é uma soma aritmética, então os dois operandos tem de ser números. como um deles é texto, vou converter seu conteúdo para inteiro, visto que não o número representado pelo texto não possui casas decimais'.
Qual a conclusão que temos? </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Tanto PHP quanto Python possuem tipagem dinâmica. Não precisamos declarar as variáveis, elas assumem um tipo quando recebem um valor.
Python, porém, possui tipagem forte. Você não pode executar uma operação se os tipos não forem os especificados pela operação. PHP, por outro lado, tem tipagem fraca. Ele altera o tipo de forma para se ajustar à operação.
A tipagem do Python é melhor do que o PHP? Não. É apenas uma questão de abordagem. </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">O Python está preocupado em impedir operações indevidas. O PHP, por outro lado, não está sendo conivente com elas, apenas oferece um mecanismo facilitador para o programador, que, se usado de forma indevida, é potencialmente perigoso.
Lembre-se de que a mesma faca usada para passar manteiga no pão pode matar uma pessoa. Tudo depende de quem maneja a faca.
Um último comentário. Em Python, todas as variáveis contém objetos, ou seja, todos os tipos são classes. Então ao atribuir um valor, a variável referencia um objeto que encapsula aquele valor. PHP, por sua vez, não converte valores automaticamente em objetos. </span></span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Python é melhor do que PHP porque cria objetos pra tudo? Bem, será que você precisa de objetos pra tudo?
Não existe melhor linguagem de programação. Existe aquela que é mais adequada para uma determinada aplicação. Utilizar uma única tecnologia para fazer tudo é como usar somente um tipo de material para todas as partes de uma construção. </span></span></span></div>
<br />
<span style="font-size: small;"><span style="font-family: inherit;"><span style="-webkit-text-stroke-width: 0px; color: black; display: inline ! important; float: none; font-style: normal; font-variant-caps: normal; font-variant-ligatures: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Referência: SEBESTA, Robert W. <b>Conceitos de Linguagens de Programação</b>. 5.ed. Porto Alegre. Bookman, 2003.</span></span></span>Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-71015996449067299132017-02-14T03:48:00.002-08:002017-10-13T10:54:37.816-07:00Segurança no PHP<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwg6eLb_1UhdztJuEf0H6o0Vcu_n8ob_F4GzZD6U28s9rh-SeqQEk6uNR5ngTdapEJd1Y-tiF8MvryEXQM2kRcIIUOX6OBTpMxjRjYP_oUxTLrQyzSx4P7gaw85bQwLhaeQHWvHjunpUQ/s1600/phpsec.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="107" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwg6eLb_1UhdztJuEf0H6o0Vcu_n8ob_F4GzZD6U28s9rh-SeqQEk6uNR5ngTdapEJd1Y-tiF8MvryEXQM2kRcIIUOX6OBTpMxjRjYP_oUxTLrQyzSx4P7gaw85bQwLhaeQHWvHjunpUQ/s320/phpsec.jpeg" width="320" /></a></div>
<br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;"><span style="color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">O PHP é seguro? Essa não é a pergunta certa.
A pergunta correta é se o programador PHP codifica de forma segura. Uma aplicação segura nada tem a ver com a linguagem de programação, mas com a arquitetura de software. </span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;"><span style="color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">A configuração adequada do ambiente de produção também deve ser uma preocupação. Coisas como deixar mensagens de erro serem vistos pelo usuário ocorrem em aplicações Java, Python, PHP, Ruby e são consequências de uma configuração feita sem preocupação com segurança. </span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;"><span style="color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Para software, não basta performance. É preciso ter capacidade de se defender de ataques. Isso não significa que a aplicação deve ficar invulnerável. Significa que ela deve tornar a vida do atacante um inferno.
Para software, não basta ser o Flash. É preciso ser o Superman. Mas saiba que sempre haverá kriptonita. </span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;"><span style="color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Como parte da lenta, gradual e segura recuperação segura de conteúdo para o meu site (provocada pela migração para um novo provedor), estou novamente disponibilizando minha tradução do capítulo 10 do guia de certificação Zend. Esse capítulo é uma amostra grátis obtida na Amazon. Eu só fiz a versão em português. É uma leitura obrigatória para programadores PHP.
Você pode obter a tradução<a href="https://sourceforge.net/projects/fgslibraryphp/files/downloads/traducoes/ZCE_Seguranca_no_PHP.pdf/download"> aqui</a>.</span></span></span><br />
<br />
<span style="font-size: small;"><span style="font-family: inherit;"><span style="color: black; display: inline; float: none; font-style: normal; font-weight: normal; letter-spacing: normal; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px;">Para mais informações sobre segurança no PHP, você pode consultar a página do OWASP sobre <a href="https://www.owasp.org/index.php/PHP_Security_Cheat_Sheet">segurança em PHP</a>. </span></span></span>Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-26297524698138970772017-02-05T10:00:00.002-08:002017-02-05T10:00:27.960-08:00Criando e aplicando patches com GITVocê fez um <i>branch</i> de um projeto com GIT e quer submeter um <i>patch</i>.<br /><br />
Veja bem, você não vai empurrar as suas alterações diretamente para o repositório remoto, você irá enviar um arquivo contendo as alterações para alguém aplicá-las, possivelmente, um revisor de código ou o git master.<br /><br />Após fazer as alterações e executar o git commit, você utiliza o seguinte comando:<br /><br />
<span style="font-family: "Courier New",Courier,monospace;">git format-patch master --stdout > [nome do arquivo].patch</span><br /><br />O argumento master indica que as alterações serão aplicadas no branch master.<br /><br />Vamos agora pensar do ponto de vista de quem recebe o patch. A pessoa que enviou deve ter explicado em um fórum, lista de discussão e/ou por um relato em um sistema de solicitações de mudança, o que ela fez. Mas você quer saber realmente o que será alterado, antes de aplicar o patch. Você pode ver as alterações antes de aplicá-las com o seguinte comando:<br /><br />
<span style="font-family: "Courier New",Courier,monospace;">git apply --stat [nome do arquivo].patch</span><br />
<br />A próxima questão é saber se não haverá problemas em aplicar o patch. Você fazer um teste com o seguinte comando:<br /><br />
<span style="font-family: "Courier New",Courier,monospace;">git apply --check fix_empty_poster.patch</span><br />
<br />Tendo certeza de que não haverá problemas, você pode aplicar o patch usando o seguinte comando:<br /><br />
<span style="font-family: "Courier New",Courier,monospace;">git am --signoff < [nome do arquivo].patch</span><br /><br />O argumento <i>--signoff</i> identificará que o commit resultante foi originário de um patch, incluindo o nome de usuário e e-mail que você configurou com git config.<br /><br />Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-67085575522055172662017-02-05T09:51:00.000-08:002017-02-05T09:51:02.797-08:00Erros comuns no PostgreSQL II - comparação entre timestampsUm modo de resolver problema de comparação de datas do tipo timestamp with timezone no PostgreSQL 8.4.8 <br />
<br />
Estou trabalhando na conversão de um banco MySQL para PostgreSQL. Embora exista uma SQL ANSI, cada banco tem seu dialeto particular. Além disso, há os tipos de dados específicos de cada banco.<br /><br />Bem, eu tive de passar um campo de data para o tipo timestamp with timezone do PostgreSQL, versão 8.4.8. E na aplicação que usa o banco existem algumas consultas que fazem comparações de data. <br /><br />Bem, havia uma comparação assim: 'expires_at' > NOW(). O campo expires_at é do tipo timestamp with timezone e a função NOW retorna o dia de hoje como timestamp with timezone também. Então, a princípio, eu estava comparando limão com limão e deveria funcionar.<br /><br />Mas na execução, o PostgreSQL chiava dizendo que havia uma entrada inválida e apontava o campo expires_at. Peguei a documentação do PostgreSQL, na parte de funções de data e hora, e tentei desvendar o problema. Parecia não ter sentido, pois eu estava comparando coisas iguais.<br /><br />Consultei um colega antes de submeter essa dúvida a um fórum, para verificar se não era algo trivial e evitar ser massacrado pelos especialistas, fartos de responderem questões perdidas na milésima página de resultados das buscas. Bem, não desvendamos o mistério, mas encontramos uma solução alternativa:<br /><br />age(expires_at,now()) > interval '1 day'<br /><br />Quer dizer, em vez de comparar as datas diretamente, eu comparei o intervalo. Mas isso não parecia elegante.<br /><br />Depois de pensar bastante na mensagem de erro original, fiz um teste. O delimitador do PostgreSQL é apóstrofo. Mas em um paradoxo, coloquei o campo expires_at entre aspas. E funcionou. Por que? Não sei, só sei que foi assim.<br /><br />Solução:<br /><br />"expires_at" > now()<br /><br />Estou contando porque se alguém passar por um problema parecido, há uma solução. Solução, não explicação.Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-55105893229784616072017-02-05T09:48:00.002-08:002017-02-05T09:48:41.048-08:00Erros comuns no PostgreSQL - Superusuário sem senha<br />Você está usando uma distribuição Ubuntu. Acabou de instalar o PostgreSql, phppgadmin e pgadmin III, com o synaptic. Todo empolgado, abre o pgadmin III e tenta se conectar usando o usuário postgres. Certo, você não deveria usar o superusuário, deveria criar um usuário para o banco que vai utilizar. Mas você quer apenas saber se uma aplicação se conecta com o PostgreSQL, não quer modelar um banco de dados para uma situação real.<br /><br />Bem, se receber esta mensagem:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">Um erro ocorreu:<br /><br />Error connecting to the server: FATAL: autenticação do tipo password falhou para usuário "postgres"<br />FATAL: autenticação do tipo password falhou para usuário "postgres"</span><br />
A causa é muito simples: seu usuário postgres não tem senha. Basta criar uma senha para ele.<br />
<br />Como fazer isso?<br />
<br />Seu usuário precisa ter acesso de root, ou seja, ser administrador de sua máquina. Se isso for verdade, você pode dar o comando sudo su postgres e digitar a sua senha (a do seu usuário).<br />
<br />Em seguida, execute o comando psql. Ele abrirá o terminal de controle do PostgreSQL, que permite a você operar um SGBD. Nesse terminal, digite o seguinte comando:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">alter role postgres encrypted password 'a senha que você quiser';</span><br /><br />Pronto, agora você pode se conectar.<br /><br />Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-13660949817781417392017-02-03T01:40:00.003-08:002017-02-03T01:40:44.404-08:00Guia rápido de comandos SQLO que você precisa saber para sobreviver com SQL.<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjThEDnOMMoT5tUxrosRSQAT263_pC5pEe8NtZPcfMyhJCrfoqDp6LrL5nO5TAcPbPndJFnV1wWCVhoz1KAf4xZHwzba_Fq4L-tLDcbnGBxPvDWYM5o_ncqZP5uHXQcm2zxwHaKOknIbZQ/s1600/RebelLabs-SQL-cheat-sheet.png" imageanchor="1"><img border="0" height="452" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjThEDnOMMoT5tUxrosRSQAT263_pC5pEe8NtZPcfMyhJCrfoqDp6LrL5nO5TAcPbPndJFnV1wWCVhoz1KAf4xZHwzba_Fq4L-tLDcbnGBxPvDWYM5o_ncqZP5uHXQcm2zxwHaKOknIbZQ/s640/RebelLabs-SQL-cheat-sheet.png" width="640" /></a>Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-60826570850873112172017-02-03T01:39:00.001-08:002017-02-03T01:39:23.477-08:00Guia rápido de comandos GITO mínimo que você precisa para sobreviver com GIT.
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaYkK4DPnn6xLVZqhjWhmqfyCdAnVn3TNZyWNKctoJGIyH02CoB7sgAskKrXbvc1U0_MX4zGSK3XzV_PEErVGJR5EqPh3QU85sQy1is_PhyZU6B3SPAshyRZ6ZOrvaVKuLKydlSMfleOk/s1600/Git-Cheat-Sheet-by-RebelLabs.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="451" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaYkK4DPnn6xLVZqhjWhmqfyCdAnVn3TNZyWNKctoJGIyH02CoB7sgAskKrXbvc1U0_MX4zGSK3XzV_PEErVGJR5EqPh3QU85sQy1is_PhyZU6B3SPAshyRZ6ZOrvaVKuLKydlSMfleOk/s640/Git-Cheat-Sheet-by-RebelLabs.png" width="640" /></a></div>
<br />Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-19613439266835894912017-01-27T01:44:00.001-08:002017-01-27T01:44:20.467-08:00Como instalar o WordPress no CentOS 7
<div class="entry-content">
<strong>Instalação do Apache</strong><br />
<br />
<pre>sudo yum install httpd</pre>
<pre> </pre>
<strong>Instalação do PHP e extensões requeridas pelo WordPress</strong><br />
<br />
<pre>sudo yum install php php-devel php-gd php-pecl-memcache php-pspell php-snmp php-xmlrpc php-xml</pre>
<pre> </pre>
<strong>Instalação do MariaDB</strong><br />
<br />
<pre>sudo yum install mariadb-server mariadb</pre>
<pre> </pre>
<strong>Início do serviço Apache</strong><br />
<br />
<pre>sudo apachectl start</pre>
<pre> </pre>
<strong>Início do serviço MariaDB</strong><br />
<br />
<pre>sudo systemctl start mariadb.service</pre>
<pre> </pre>
<strong>Configuração de senha do usuário administrador MariaDB</strong><br />
<br />
<pre>/usr/bin/mysqladmin -u root password '[SENHA]'</pre>
<pre> </pre>
<strong>Download do pacote do WordPress</strong><br />
<br />
<pre>sudo yum install wget
cd /var/www/html
sudo wget https://wordpress.org/latest.tar.gz
sudo tar zxvf latest.tar.gz</pre>
<pre> </pre>
<strong>Download e configuração do idioma Português</strong><br />
<br />
<pre>cd /var/www/html
sudo wget https://br.wordpress.org/latest-pt_BR.zip
sudo mkdir wpptbr
sudo unzip latest-pt_BR.zip -d wpptbr
cd /var/www/html/wordpress/wp-content
sudo mkdir languages
cd languages
sudo cp /var/www/html/wpptbr/wordpress/wp-content/languages/*.mo .
sudo cp /var/www/html/wpptbr/wordpress/wp-content/languages/*.po .</pre>
<pre> </pre>
<strong>Instalação do WordPress</strong><br />
<ol>
<li>Acesse o endereço http://[IP]/wordpress</li>
<li>Preencha os dados de conexão com o banco de dados</li>
<li>Crie o arquivo wp-config.php de acordo com o template apresentado</li>
</ol>
<strong>Habilitação do idioma Português</strong><br />
<br />
<pre>cd /var/www/html/wordpress
sudo vi wp-config.php</pre>
<pre> </pre>
Adicione a seguinte linha ao arquivo citado acima:<br />
<br />
<pre>define('WPLANG','pt_BR');
</pre>
</div>
Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-54694089862985773082017-01-27T01:42:00.006-08:002017-01-27T01:46:05.707-08:00Como adicionar dependências com Maven no EclipseEm um projeto Maven há um arquivo chamado pom.xml.<br />
<br />
Na aba Dependencies do editor de arquivos pom.xml é possível adicionar dependências, clicando sobre o botão Add.. do quadro Dependencies, à esquerda.<br />
<br />
Esse botão abrirá uma janela como a exibida na figura 1:<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4GhGyfglIe4r3X0NUnKgytdQlFLPn3lvS04j5KPxLG9dgYeJ3zw6qF2ZwddxXTK9i3-okbNf_2CgQsff87KHuC4EVwR7PzDC0SpOJR2Pwa_l_k9l0Lq4AKj8AdAdiy7uvXONjlcpriU/s1600/maven_select_dependency.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjz4GhGyfglIe4r3X0NUnKgytdQlFLPn3lvS04j5KPxLG9dgYeJ3zw6qF2ZwddxXTK9i3-okbNf_2CgQsff87KHuC4EVwR7PzDC0SpOJR2Pwa_l_k9l0Lq4AKj8AdAdiy7uvXONjlcpriU/s400/maven_select_dependency.png" width="337" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figura 1</td></tr>
</tbody></table>
<br />
<br />
No campo <b>Group Id</b> deve ser colocado o nome do pacote da dependência.<br />
<br />
No campo <b>Artifact Id</b> deve ser colocado o nome da dependência.<br />
<br />
No campo <b>Version</b> deve ser colocada a versão desejada.<br />
<br />
Após preencher os campos e clicar sobre o botão OK, atualize o projeto selecionando o nome do projeto com o botão direito do mouse e selecionando o Maven > Update Project conforme a figura 2.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRE59ueWxgOXbWtXGYiWu-INmy34QqCFhMvcTDKCZ6ftu8SBOipsd4mIt9VW-TMMzYmdyJ9TyM6nczXzpxVfrw_JgZVNaHU4xF9QtnLw-Dwms7sojrE9l3TE_HKPuD5FtnU2YUX0uyrU4/s1600/eclipse_maven_update_project.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="173" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjRE59ueWxgOXbWtXGYiWu-INmy34QqCFhMvcTDKCZ6ftu8SBOipsd4mIt9VW-TMMzYmdyJ9TyM6nczXzpxVfrw_JgZVNaHU4xF9QtnLw-Dwms7sojrE9l3TE_HKPuD5FtnU2YUX0uyrU4/s400/eclipse_maven_update_project.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Figura 2</td></tr>
</tbody></table>
<br />
<br />
A dependência aparecerá no nó Maven Dependencies.Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-37287348273568000442017-01-27T01:40:00.002-08:002017-01-27T01:40:13.624-08:00Instalando OwnCloud 9.1 no Debian 8<span style="font-family: "Courier New",Courier,monospace;">sudo apt-get update<br /><br />sudo apt-get install apache2<br /><br />cd /var/www/html<br /><br />wget https://download.owncloud.org/community/owncloud-9.1.1.zip<br /><br />sudo apt-get install unzip<br /><br />unzip owncloud-9.1.1.zip<br /><br />sudo apt-get install mysql-server<br /><br />sudo apt-get install mysql-client<br /><br />sudo apt-get install phpmyadmin<br /><br />sudo apt-get install php5-curl</span><br /><br />O arquivo /etc/apache2/apache2.conf deve ter a seguinte seção alterada:<br /><br /><span style="font-family: "Courier New",Courier,monospace;"><Directory /var/www/html>Options Indexes FollowSymLinks<br />AllowOverride All<br />Require all granted<br /></Directory></span><br /><br />A diretiva AllowOverride All deve ser configurada para All para permitir a leitura do arquivo .htaccess do Owncloud. Não basta configurar para FileInfo, pois o arquivo .htaccess possui diretivas php_value, que alterar a configuração padrão do PHP definida pelo arquivo php.iniFlávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-69419671173182828862017-01-27T01:37:00.003-08:002017-01-27T01:50:23.661-08:00Como instalar o Graylog no Debian 8Este guia foi construído a partir de uma instalação Debian 8 32 bits feita em uma máquina virtual sobre VirtualBox 5.1.6.<br />
<br />
<b>Atualize o repositório Debian:</b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">sudo echo "deb http://ftp.debian.org/debian jessie-backports main" > /etc/apt/sources.list.d/backports.list<br />sudo apt-get update</span><br />
<br />
<b>Instale as dependências:</b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">sudo apt-get install apt-transport-https openjdk-8-jre-headless uuid-runtime pwgen</span><br />
<br />
<b>IMPORTANTE!</b> Deve ser instalado o Java 8. Sem ele, o servidor Graylog irá lançar uma exceção e não conseguirá levantar. Por isso verifique se o link simbólico /usr/lib/jvm/default-jre está apontando para o diretório da versão 8 do JRE. Se não estiver, reconstrua o link para apontar o Java 8. Também altere o link simbólico /etc/alternatives/java para apontar para o interpretador java (que fica na pasta jre/bin da instalação Java).<br />
<br />
<b>Instale o MongoDB:</b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">sudo apt-get install mongodb-server</span><br />
<br />
<b>Instale o ElasticSearch:</b><br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">wget -qO - https://packages.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -<br />echo "deb https://packages.elastic.co/elasticsearch/2.x/debian stable main" | sudo tee -a /etc/apt/sources.list.d/elasticsearch-2.x.list<br />sudo apt-get update && sudo apt-get install elasticsearch</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></span><br />
Modifique o arquivo /etc/elasticsearch/elasticsearch.yml, configurando a seguinte diretiva:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">cluster.name: graylog</span><br />
<br />
Configure o ElasticSearch como um serviço para que ele seja iniciado automaticamente:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">sudo systemctl daemon-reload<br />sudo systemctl enable elasticsearch.service<br />sudo systemctl restart elasticsearch.service</span><br />
<br />
Instale o Graylog:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">wget https://packages.graylog2.org/repo/packages/graylog-2.1-repository_latest.deb<br />sudo dpkg -i graylog-2.1-repository_latest.deb<br />sudo apt-get update && sudo apt-get install graylog-server</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></span><br />
Edite o arquivo /etc/graylog/server/server.conf e configure a diretiva password_secret com a senha gerada pelo comando abaixo:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">pwgen -N 1 -s 96</span><br />
<br />
Edite o arquivo /etc/graylog/server/server.conf e configure a diretiva root_password_sha2 com uma senha criptografada com o comando abaixo:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">echo -n [SENHA] | sha256sum</span><br />
<br />
Configure o Graylog como um serviço para que ele seja iniciado automaticamente:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">sudo systemctl daemon-reload<br />sudo systemctl enable graylog-server.service<br />sudo systemctl start graylog-server.service</span><br />
<span style="font-family: "courier new" , "courier" , monospace;"></span><br />
<b>Tornando a interface web disponível</b><br />
<br />
No arquivo /etc/graylog/server/server.conf existem duas diretivas para controlar a exposição da interface web do Graylog. De acordo com a configuração da rede, pode ser necessário substituir a configuração padrão dessas diretivas pelo IP pelo qual o servidor do Graylog será visível na rede.<br />
<br />
<ul>
<li>web_listen_uri: configura o acesso à interface HTML</li>
</ul>
<ul>
<li>rest_listen_uri: configura o acesso à API REST</li>
</ul>
<br />Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com3tag:blogger.com,1999:blog-4082621202149430047.post-64574551226237971192017-01-27T01:35:00.001-08:002017-01-27T01:35:05.754-08:00Como enviar dados do Apache para o Graylog a partir de um servidor Debian 8Premissa: ter um servidor com Graylog instalado.<br /><br />Instale o módulo de desenvolvimento do Apache e suas dependências:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">sudo apt-get update<br />sudo install openssl<br />sudo apt-get install libssl-dev<br />sudo apt-get install libtool<br />sudo apt-get install apache2-dev</span><br />
<br />Baixe o código-fonte do módulo de https://github.com/mikkolehtisalo/mod_gllog.<br /><br />Entre na pasta mod_gllog e compile o módulo:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">sudo apxs -i -c mod_gllog.c</span><br />
<br />Habilite o módulo SSL do Apache:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">sudo a2enmod ssl</span><br /><br />
Crie um arquivo para carregar o módulo gllog no Apache:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">sudo vi /etc/apache2/mods-available/gllog.load</span><br /><br />
Preencha o arquivo com as seguintes instruções:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">LoadFile /usr/lib/x86_64-linux-gnu/libssl.so<br />LoadModule gllog_module /usr/lib/apache2/modules/mod_gllog.so</span><br /><br />
Crie um link simbólico para o arquivo:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">cd /etc/apache2/mods-enabled<br />sudo ln -s ../mods-available/gllog.load</span><br /><br />
Crie um arquivo de configuração para um virtual host que configure o módulo gllog:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">cd /etc/apache2/conf-available/<br />sudo vi vhosts.conf</span><br /><br />
Preencha o arquivo com esta seção:<br /><br /><span style="font-family: "Courier New",Courier,monospace;"><VirtualHost *:80><br /> # Master switch for the module<br /> GlLog On<br /> # The application.secret for graylog-web, stolen from application.config<br /> GlLogKey "xTnfNbUH7KFAM9AyPGUgD4ka17dFzpYfKmPzzFDxXmyeVpz2emInSFFmw6c1J6IoDSZishz4e7nR9O5BeJRJonNCxkx7hoTs"<br /> # Switch for checking validity of the signature<br /> GlLogSignature On<br /><br /> # Use the LogFormat defined earlier<br /> CustomLog ${APACHE_LOG_DIR}/access.log gl_combined<br /></VirtualHost></span><br />
<span style="font-family: "Courier New",Courier,monospace;"></span><br />Onde o valor de GlLogKey deve ser substituído pelo valor da diretiva password_secret do arquivo /etc/graylog/server/server.conf.<br /><br />Crie um link simbólico para o arquivo:<br /><span style="font-family: "Courier New",Courier,monospace;"><br />cd /etc/apache2/conf-enabled<br />sudo ln -s /etc/apache2/conf-available/vhosts.conf</span><br /><br />
Finalmente, é necessário reiniciar o Apache:<br /><br /><span style="font-family: "Courier New",Courier,monospace;">sudo service apache2 restart</span><br /><br /><br /><br /><br /><br />Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0tag:blogger.com,1999:blog-4082621202149430047.post-81867145970693938622017-01-27T01:32:00.000-08:002017-01-27T01:51:04.094-08:00Configuração do contexto com JBoss AS 6.xPara configurar o contexto de uma aplicação JEE com JBoss AS 6.x, é necessário criar um arquivo jboss-web.xml na pasta WEB-INF, com o seguinte conteúdo:<br />
<br />
<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;"><?xml version="1.0" encoding="UTF-8"?><br /><jboss-web><br /> <context-root>/[CONTEXTO]</context-root><br /></jboss-web></span><br />
<br />Flávio Gomes da Silva Lisboahttp://www.blogger.com/profile/12431396547400250125noreply@blogger.com0