tag:blogger.com,1999:blog-41220148658250487702024-03-13T23:58:24.171-03:00Dicas de informáticaO Blog foi criado com o objetivo de expor comentários e dar dicas de informática. Seja bem-vindo, opine, critique, dê dicas, esteja à vontade para falar a respeito do texto, mas, sempre dentro dos limites.Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.comBlogger37125tag:blogger.com,1999:blog-4122014865825048770.post-20673439443273524762015-04-15T21:06:00.003-03:002015-04-15T21:36:28.985-03:00Tutorial comunicação serial, node.js e gráficos em tempo real via socket.<div dir="ltr" style="text-align: justify;">
Com o surgimento do Arduino, foi possível ampliar as aplicações de eletrônica e robótica em geral com a rápida adesão e criação de bibliotecas e módulos específicos e fáceis de manusear. Tratando-se de software, o Node.js tornou-se muito popular com o surgimento de milhares de pacotes e a possibilidade de estabelecer conexões com várias linguagens, tipos de bancos de dados e inúmeras tecnologias. Dentre elas, a comunicação serial, padrão usado na maioria dos projetos de sistemas microcontrolados.</div>
<div dir="ltr" style="text-align: justify;">
Estabelecendo a conexão via serial de seu sistema embarcado com o Node.js torna possível expandir a sua aplicação uma vez que o node implementa um servidor web. Você pode facilmente utilizar as milhares de APIs web disponíveis além de hospedar seu sistema em um servidor e fornecer acesso por smartphones, tablets e demais dispositivos que se conectam à rede mundial de computadores.</div>
<div dir="ltr" style="text-align: justify;">
Esse tutorial tem como objetivo explicar como estabelecer a comunicação serial entre seu sistema microcontrolado (não necessariamente Arduino, mas qualquer um que implemente comunicação serial) e o Node.js, além de utilizar uma biblioteca em JavaScript para plotar gráficos em tempo real utilizando uma página web.</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Primeiro passo, é preciso instalar o Node.js em sua máquina, basta acessar o site https://nodejs.org/download/ e seguir para a seção de downloads. </div>
<div dir="ltr" style="text-align: justify;">
A instalação segue um fluxo tranquilo em Windows e Mac. No Windows, você precisa adicionar o caminho do executável do node para a variável de ambiente do sistema PATH para poder executá-lo do terminal do Windows. Isso pode ser feito em painel de controle, configurações avançadas.</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Se está usando ambiente GNU/Linux, basta baixar o arquivo compactado com o código-fonte, extrair os dados para uma pasta qualquer, em seguida, acesse a pasta e digite os comandos:</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
./configure </div>
<div dir="ltr" style="text-align: justify;">
make</div>
<div dir="ltr" style="text-align: justify;">
#make install </div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Se você encontrou algum erro nessa parte, certifique-se de ter instalado o pacote build-essential que contém os compiladores necessários para gerar o executável do node. O comando make pode demorar mais de 5 minutos porque ele está compilando o sistema e isso demora mesmo. Lembre-se que o terceiro comando deve ser feito com privilégios de administrador (sudo), uma vez que ele copia o arquivo para a pasta bin do sistema.</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Pronto, node.js já está instalado em sua máquina. Junto com ele, existe o npm (node package manager) que é o gerenciador de pacotes do node. A partir do qual é possível instalar pacotes para as mais variadas aplicações (acesse esse link para conferir do que estou falando: https://www.npmjs.com/).</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Vamos inicialmente criar um diretório para organizar nosso app (geralmente os projetos em node são chamados de app - aplicação). Abre um terminal e navegue até o diretório. Feito isso, digite o seguinte comando:</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
npm install express</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Esse é o primeiro pacote que vamos instalar. Verifique que após a instalação, um subdiretório foi criado: node_modules. Todos os módulos que você instalar ficarão localizados dentro dessa pasta. A menos que use a opção -g em que o módulo é instalado globalmente no diretório do node no seu sistema (opção usada quando vamos instalar o socket.io - algumas vezes ele dá problema e exige que seja instalado globalmente).</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
http://expressjs.com/ esse pacote é interessante porque ele é um framework que encapsula muitas funções do node para você e permite um desenvolvimento mais fluido para seu app. Para maiores informações, acesse a página dele.</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Agora digite o seguinte comando:</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
npm install serialport</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Esse módulo é o responsável em estabelecer a comunicação serial com o node. Maiores detalhes aqui: https://www.npmjs.com/package/serialport .</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Por fim:</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
npm install socket.io</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Já que temos nossos pacotes básicos, vamos criar um arquivo chamado server.js dentro do nosso diretório de trabalho. Esse é o arquivo principal de nossa aplicação. Vamos iniciar a codificação. Primeiro requisite os seguintes arquivos (semelhante ao include do C e require do PHP):</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
var app = require('express')();</div>
<div dir="ltr" style="text-align: justify;">
var express = require('express');</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Essas variáveis irão armazenar objetos que utilizaremos mais adiante. Em seguida vamos utilizar um diretório para servir arquivos públicos como arquivos .css e .js.<br />
<br />
app.use(express.static(__dirname + '/public'));<br />
<br />
Definimos executando o método use do app que instanciamos mais adiante. Eu separei o arquivo express para justamente poder utilizar a chamada express.static acima. Agora crie também um diretório chamado public na pasta do projeto. Iremos adicionar alguns arquivos mais na frente no tutorial.<br />
<br />
O próximo passo é criar o nosso servidor http e instanciar o socket.<br />
<br />
var http = require('http').Server(app);<br />
var io = require('socket.io')(http);<br />
<br />
Feito isso, temos o nosso servidor e o socket prontos para serem usados. Agora definimos rotas para o servidor web responder às requisições dos usuários com a seguinte linha:<br />
<br />
app.get('/', function(req, res) {<br />
res.sendfile('index.html');<br />
});<br />
<br />
A função de callback aceita dois parâmetros, uma requisição e uma resposta. Isso quer dizer que, quando o usuário requisitar o endereço raiz da nossa aplicação "/", o node vai retornar uma página chamada index.html que depois criaremos.<br />
<br />
Agora vamos criar a variável do socket:<br />
<br />
var mySocket;<br />
<br />
Registramos o socket quando a conexão é estabelecida da seguinte maneira:<br />
<br />
io.on('connection', function(socket) {<br />
mySocket = socket;<br />
console.log('a user connected');<br />
socket.on('disconnect', function() {<br />
mySerialPort.close(function(err) {<br />
if (err) console.log("Error at disconnect event: " + err);<br />
console.log('port closed');<br />
});<br />
});<br />
});<br />
<br />
Registramos eventos usando o método on. Quando o usuário emitir um sinal para fechar a conexão, o nosso socket irá encerrar a comunicação (on 'disconnect').<br />
<br />
Vamos definir agora a porta serial:<br />
<br />
var serialport = require("serialport");<br />
var SerialPort = serialport.SerialPort;<br />
<br />
Em seguida instanciamos o objeto com as configurações:<br />
<br />
var mySerialPort = new SerialPort("/dev/ttyACM0", {<br />
baudrate: 115200,<br />
parser: serialport.parsers.readline("\n")<br />
});<br />
<br />
Observe que é preciso dizer a porta serial onde seu microcontrolador está conectado. No Debian ela foi reconhecida como /dev/ttyACM0, mas no Windows será COMx e no Mac como /dev/tty.usbmodemx. Certifique-se de colocar o caminho correto do seu dispositivo. Definimos também a taxa de transmissão dos dados e escolhemos um parser para a serial. Ele vai ler linhas e reconhecer quando houver mudança de linha "\n". Isso pode ser encontrado na documentação do serialport.<br />
<br />
Agora vamos criar eventos para a nossa porta serial.<br />
<br />
Quando ela for aberta corretamente, vamos indicar uma mensagem para o usuário:<br />
<br />
mySerialPort.on("open", function() {<br />
console.log("Port Open");<br />
});<br />
<br />
Veja que em cada evento, existe uma callback relacionada como ele a qual é executada quando o evento é disparado.<br />
<br />
Um evento especial chamado 'data' é quando os dados chegam na porta serial. Vamos implementar a leitura dos dados que chegam:<br />
<br />
mySerialPort.on("data", function(data) {<br />
console.log('data received: ' + data); // apenas debug<br />
io.emit('serialData', {<br />
dado: parseFloat(data)<br />
});<br />
<br />
});</div>
<div dir="ltr" style="text-align: justify;">
<br />
<br />
Observe que o socket já foi incluído dentro do evento, e, quando os dados chegam, já emitimos um evento via socket para que o usuário que está acessando a página veja o resultado. O evento 'serialData' foi criado por mim e esse nome será utilizado posteriormente na página index.html para gerenciar a chegada de novos dados pelo socket. Eu configurei o Arduino para de tempos em tempos enviar um número ponto flutuante (float) pela serial.<br />
<br />
Por fim, vamos iniciar o nosso servidor:<br />
<br />
http.listen(3000, function() {<br />
console.log('listening on *:3000');<br />
});<br />
<br />
Esse comando faz com que o servidor esteja ligado e funcione na porta 3000.<br />
<br />
Vamos agora implementar o nosso index.html. Primeiramente, vamos acessar a página da biblioteca Chart.js que vamos utilizar para plotar os gráficos. Crie um diretório js dentro da pasta public do projeto. Acesse a página http://www.chartjs.org/ e clique em download. Quando abrir o repositório do github, clique no arquivo Chart.js, depois na opção Raw e salve o arquivo dentro do diretório public/js de sua aplicação.<br />
<br />
Estarei utilizando gráfico de linhas e, para maiores informações, acesse a documentação dele aqui: http://www.chartjs.org/docs/ .<br />
<br />
Vamos criar nosso index.html. Basicamente configuramos o socket, instanciamos o Chartjs, configuramos alguns parâmetros e tratamos os eventos do socket para que os dados sejam plotados. Definimos um canvas, que é o lugar onde o gráfico será plotado. No meu caso, usei algumas configurações globais e coloquei dentro do diretório js também, o arquivo está em logo abaixo.<br />
<br />
// Conteúdo do arquivo ChartConfig.js<br />
<br />
<!-- HTML generated using hilite.me --><div style="background: #ffffff; overflow:auto;width:auto;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;"><table><tr><td><pre style="margin: 0; line-height: 125%"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123</pre></td><td><pre style="margin: 0; line-height: 125%">Chart.defaults.global <span style="color: #333333">=</span> {
<span style="color: #888888">// Boolean - Whether to animate the chart</span>
animation<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">false</span>,
<span style="color: #888888">// Number - Number of animation steps</span>
animationSteps<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">0</span>,
<span style="color: #888888">// String - Animation easing effect</span>
animationEasing<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"easeOutQuart"</span>,
<span style="color: #888888">// Boolean - If we should show the scale at all</span>
showScale<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">true</span>,
<span style="color: #888888">// Boolean - If we want to override with a hard coded scale</span>
scaleOverride<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">false</span>,
<span style="color: #888888">// ** Required if scaleOverride is true **</span>
<span style="color: #888888">// Number - The number of steps in a hard coded scale</span>
scaleSteps<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">null</span>,
<span style="color: #888888">// Number - The value jump in the hard coded scale</span>
scaleStepWidth<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">null</span>,
<span style="color: #888888">// Number - The scale starting value</span>
scaleStartValue<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">null</span>,
<span style="color: #888888">// String - Colour of the scale line</span>
scaleLineColor<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"rgba(0,0,0,.1)"</span>,
<span style="color: #888888">// Number - Pixel width of the scale line</span>
scaleLineWidth<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">1</span>,
<span style="color: #888888">// Boolean - Whether to show labels on the scale</span>
scaleShowLabels<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">true</span>,
<span style="color: #888888">// Interpolated JS string - can access value</span>
scaleLabel<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"<%=value%>"</span>,
<span style="color: #888888">// Boolean - Whether the scale should stick to integers, not floats even if drawing space is there</span>
scaleIntegersOnly<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">true</span>,
<span style="color: #888888">// Boolean - Whether the scale should start at zero, or an order of magnitude down from the lowest value</span>
scaleBeginAtZero<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">false</span>,
<span style="color: #888888">// String - Scale label font declaration for the scale label</span>
scaleFontFamily<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif"</span>,
<span style="color: #888888">// Number - Scale label font size in pixels</span>
scaleFontSize<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">12</span>,
<span style="color: #888888">// String - Scale label font weight style</span>
scaleFontStyle<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"normal"</span>,
<span style="color: #888888">// String - Scale label font colour</span>
scaleFontColor<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"#666"</span>,
<span style="color: #888888">// Boolean - whether or not the chart should be responsive and resize when the browser does.</span>
responsive<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">true</span>,
<span style="color: #888888">// Boolean - whether to maintain the starting aspect ratio or not when responsive, if set to false, will take up entire container</span>
maintainAspectRatio<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">true</span>,
<span style="color: #888888">// Boolean - Determines whether to draw tooltips on the canvas or not</span>
showTooltips<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">false</span>,
<span style="color: #888888">// Function - Determines whether to execute the customTooltips function instead of drawing the built in tooltips (See [Advanced - External Tooltips](#advanced-usage-custom-tooltips))</span>
customTooltips<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">false</span>,
<span style="color: #888888">// Array - Array of string names to attach tooltip events</span>
tooltipEvents<span style="color: #333333">:</span> [<span style="background-color: #fff0f0">"mousemove"</span>, <span style="background-color: #fff0f0">"touchstart"</span>, <span style="background-color: #fff0f0">"touchmove"</span>],
<span style="color: #888888">// String - Tooltip background colour</span>
tooltipFillColor<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"rgba(0,0,0,0.8)"</span>,
<span style="color: #888888">// String - Tooltip label font declaration for the scale label</span>
tooltipFontFamily<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif"</span>,
<span style="color: #888888">// Number - Tooltip label font size in pixels</span>
tooltipFontSize<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">14</span>,
<span style="color: #888888">// String - Tooltip font weight style</span>
tooltipFontStyle<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"normal"</span>,
<span style="color: #888888">// String - Tooltip label font colour</span>
tooltipFontColor<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"#fff"</span>,
<span style="color: #888888">// String - Tooltip title font declaration for the scale label</span>
tooltipTitleFontFamily<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif"</span>,
<span style="color: #888888">// Number - Tooltip title font size in pixels</span>
tooltipTitleFontSize<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">14</span>,
<span style="color: #888888">// String - Tooltip title font weight style</span>
tooltipTitleFontStyle<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"bold"</span>,
<span style="color: #888888">// String - Tooltip title font colour</span>
tooltipTitleFontColor<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"#fff"</span>,
<span style="color: #888888">// Number - pixel width of padding around tooltip text</span>
tooltipYPadding<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">10</span>,
<span style="color: #888888">// Number - pixel width of padding around tooltip text</span>
tooltipXPadding<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">10</span>,
<span style="color: #888888">// Number - Size of the caret on the tooltip</span>
tooltipCaretSize<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">8</span>,
<span style="color: #888888">// Number - Pixel radius of the tooltip border</span>
tooltipCornerRadius<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">6</span>,
<span style="color: #888888">// Number - Pixel offset from point x to tooltip edge</span>
tooltipXOffset<span style="color: #333333">:</span> <span style="color: #0000DD; font-weight: bold">10</span>,
<span style="color: #888888">// String - Template string for single tooltips</span>
tooltipTemplate<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"<%if (label){%><%=label%>: <%}%><%= value %>"</span>,
<span style="color: #888888">// String - Template string for multiple tooltips</span>
multiTooltipTemplate<span style="color: #333333">:</span> <span style="background-color: #fff0f0">"<%= value %>"</span>,
<span style="color: #888888">// Function - Will fire on animation progression.</span>
onAnimationProgress<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">function</span>() {},
<span style="color: #888888">// Function - Will fire on animation completion.</span>
onAnimationComplete<span style="color: #333333">:</span> <span style="color: #008800; font-weight: bold">function</span>() {}
}
</pre></td></tr></table></div>
<br />
// fim do arquivo ChartConfig.js<br />
<br />
Aqui começa o index.html:<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: .1em .1em .1em .8em; border: solid gray; overflow: auto; padding: .2em .6em; width: auto;">
<table><tbody>
<tr><td><pre style="line-height: 125%; margin: 0;"> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48</pre>
</td><td><pre style="line-height: 125%; margin: 0;"><span style="color: #557799;"><!DOCTYPE html></span>
<span style="color: #007700;"><html</span> <span style="color: #0000cc;">lang=</span><span style="background-color: #fff0f0;">"en"</span><span style="color: #007700;">></span>
<span style="color: #007700;"><head></span>
<span style="color: #007700;"><meta</span> <span style="color: #0000cc;">charset=</span><span style="background-color: #fff0f0;">"utf-8"</span> <span style="color: #007700;">/></span>
<span style="color: #007700;"><title></span>Realtime plot<span style="color: #007700;"></title></span>
<span style="color: #007700;"><script </span><span style="color: #0000cc;">src=</span><span style="background-color: #fff0f0;">"/socket.io/socket.io.js"</span><span style="color: #007700;">></script></span>
<span style="color: #007700;"></head></span>
<span style="color: #007700;"><body></span>
<span style="color: #007700;"><canvas</span> <span style="color: #0000cc;">id=</span><span style="background-color: #fff0f0;">"meusDados"</span> <span style="color: #0000cc;">width=</span><span style="background-color: #fff0f0;">"900"</span> <span style="color: #0000cc;">height=</span><span style="background-color: #fff0f0;">"400"</span><span style="color: #007700;">></canvas></span>
<span style="color: #007700;"><script </span><span style="color: #0000cc;">src=</span><span style="background-color: #fff0f0;">"js/Chart.js"</span><span style="color: #007700;">></script></span>
<span style="color: #007700;"><script </span><span style="color: #0000cc;">src=</span><span style="background-color: #fff0f0;">"js/ChartConfig.js"</span><span style="color: #007700;">></script></span>
<span style="color: #007700;"><script </span><span style="color: #0000cc;">language=</span><span style="background-color: #fff0f0;">"javascript"</span><span style="color: #007700;">></span>
<span style="color: #888888;">// conjunto de dados vazio</span>
<span style="color: #008800; font-weight: bold;">var</span> formatoDados <span style="color: #333333;">=</span> {
labels<span style="color: #333333;">:</span> [],
datasets<span style="color: #333333;">:</span> [{
fillColor<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"rgba(172,194,132,0.4)"</span>,
strokeColor<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"#ACC26D"</span>,
pointColor<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"#fff"</span>,
pointStrokeColor<span style="color: #333333;">:</span> <span style="background-color: #fff0f0;">"#9DB86D"</span>,
data<span style="color: #333333;">:</span> []
}]
};
<span style="color: #008800; font-weight: bold;">var</span> meusDados <span style="color: #333333;">=</span> <span style="color: #007020;">document</span>.getElementById(<span style="background-color: #fff0f0;">"meusDados"</span>).getContext(<span style="background-color: #fff0f0;">"2d"</span>);
<span style="color: #008800; font-weight: bold;">var</span> myChart <span style="color: #333333;">=</span> <span style="color: #008800; font-weight: bold;">new</span> Chart(meusDados).Line(formatoDados);
<span style="color: #007700;"></script></span>
<span style="color: #007700;"><script></span>
<span style="color: #008800; font-weight: bold;">var</span> socket <span style="color: #333333;">=</span> io();
<span style="color: #008800; font-weight: bold;">var</span> cont <span style="color: #333333;">=</span> <span style="color: #0000dd; font-weight: bold;">1</span>;
<span style="color: #008800; font-weight: bold;">var</span> valores <span style="color: #333333;">=</span> [];
socket.on(<span style="background-color: #fff0f0;">'serialData'</span>, <span style="color: #008800; font-weight: bold;">function</span>(res) {
<span style="color: #008800; font-weight: bold;">if</span> (cont <span style="color: #333333;">></span> <span style="color: #0000dd; font-weight: bold;">81</span>) {
myChart.removeData();
<span style="color: #888888;">//socket.disconnect();</span>
<span style="color: #888888;">//console.log("serialport closed");</span>
}
myChart.addData([res.dado], cont<span style="color: #333333;">++</span>);
<span style="color: #888888;">//console.log(res.dado);</span>
});
<span style="color: #007700;"></script></span>
<span style="color: #007700;"></body></span>
<span style="color: #007700;"></html></span>
</pre>
</td></tr>
</tbody></table>
</div>
<br /></div>
<div>
</div>
Observe que, após instanciar o objeto do socket, eu verifico o evento que foi criado no servidor 'serialData' e efetuo a leitura desse valor através de uma callback. Observe que ele chega em forma de objeto e precisamos acessar o campo 'dado' para obter o valor desejado.
<br />
<div>
<br /></div>
<div>
Utilizo a variável cont para servir como eixo das abscissas, os dados provenientes da serial comporão o eixo das ordenadas. Inicialmente o conjunto de dados é vazio e ele é preenchido com os dados da serial. Por motivos de visualização, eu decidi remover o conjunto de dados quando o contador for maior do que 81, caso contrário, se o fluxo de dados for muito grande, você poderá perceber travamentos no seu browser.</div>
<div>
<br /></div>
<div>
Pronto, o seu aplicativo está pronto para receber dados da serial e plotar em tempo real.</div>
<br />
<div dir="ltr" style="text-align: justify;">
Execute o seguinte comando para iniciar o servidor node em terminal:<br />
<br />
node server.js<br />
<br />
Você verá uma mensagem indicando que o servidor está "escutando" na porta 3000.<br />
Para verificar o funcionamento, abra um navegador e digite o endereço http://localhost:3000</div>
<div dir="ltr" style="text-align: justify;">
<br /></div>
<div dir="ltr" style="text-align: justify;">
Algumas melhorias ainda precisam ser feitas na utilização da biblioteca Chart.js. Se o fluxo de chegada de dados for grande, pode ser que o sistema trave. É preciso ter um maior controle disso e evitar que ocorre estouro de buffer pelo uso exagerado de memória.<br />
<br />
Todo esse processo foi feito em videoaulas e você acompanhá-las pelos links abaixo:<br />
<br />
<br />
<div style="text-align: center;">
<b><span style="font-size: large;">Parte 1: https://www.youtube.com/watch?v=LNtmLapUSzw</span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/LNtmLapUSzw/0.jpg" frameborder="0" height="266" src="http://www.youtube.com/embed/LNtmLapUSzw?feature=player_embedded" width="320"></iframe></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-size: large;">Parte 2: https://www.youtube.com/watch?v=ewMkFQ6surQ</span></b></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ewMkFQ6surQ/0.jpg" frameborder="0" height="266" src="http://www.youtube.com/embed/ewMkFQ6surQ?feature=player_embedded" width="320"></iframe></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<b><span style="font-size: large;">Parte 3: https://www.youtube.com/watch?v=d_SoD0iE54Y</span></b></div>
<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/d_SoD0iE54Y/0.jpg" frameborder="0" height="266" src="http://www.youtube.com/embed/d_SoD0iE54Y?feature=player_embedded" width="320"></iframe></div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: center;">
<br /></div>
Qualquer dúvida, pode comentar nos vídeos que eu responderei.<br />
<br />
Um abraço,<br />
<br />
Bruno Pinho<br />
<br />
<br /></div>
Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com0tag:blogger.com,1999:blog-4122014865825048770.post-18080491005800219582013-11-10T04:35:00.001-03:002013-11-10T05:04:30.264-03:00PythonIae galera, tudo beleza?<br />
Hoje venho fazer uma postagem sobre uma linguagem de programação que está sendo usada bastante e que possui uma estrutura boa de se aprender, o python.<br />
<br />
Estou cursando uma disciplinal na faculdade que a maioria dos trabalhos usa python e eu nunca havia programado nela antes. Não há mistério, python é uma linguagem interpretada, não precisa compilar, basta colocar os comandos para ver imediatamente o resultado, ou então criar um script para executar uma lista deles.<br />
<br />
Para quem usa Linux não vai ter dificuldade alguma porque geralmente o interpretador já vem por padrão na distribuição e basta digitar python na linha de comando. Caso contrário, há instaladores na página oficial.<br />
<br />
Primeira coisa a citar, python não precisa declarar tipo de variável, é dinâmico. Ora é inteiro, ora vetor ou até mesmo string, fica a seu cargo. Uma variável pode mudar sua representação no decorrer do programa, embora não seja uma boa prática.<br />
<br />
Python possuem milhares de módulos e te permite fazer desde gráficos até interfaces bonitas com botões, etc.<br />
<br />
<br />
Manipulação de strings e vetores são fáceis e há métodos padrões para te auxiliar.
Eu comecei a elaborar uma série de tutorias e espero que te ajude a compreender melhor.<br />
Aqui está o link: <a href="http://youtu.be/af09RGQoMGM">http://youtu.be/af09RGQoMGM</a><br />
Tenha uma boa introdução e boa sorte!<br />
Abraço,<br />
Bruno PinhoBruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com0tag:blogger.com,1999:blog-4122014865825048770.post-64916097699805883892012-01-23T23:06:00.000-02:002012-01-29T00:21:48.128-02:00Compilador MiniJava<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8_Pb4adcpHLHzyvp8BxnPAXNYHoAYoaepyJafHOUwlpBJDvrrzun4_c1XqFg55lXjz_MxP5c-OwNTCOOGOjVwPYX-q_IjDkhY1fRJvAr5SDNkvQHTLJxuH7IWxAbzUnlBYS3g9pqJCct3/s1600/java+werwe%25281%2529.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8_Pb4adcpHLHzyvp8BxnPAXNYHoAYoaepyJafHOUwlpBJDvrrzun4_c1XqFg55lXjz_MxP5c-OwNTCOOGOjVwPYX-q_IjDkhY1fRJvAr5SDNkvQHTLJxuH7IWxAbzUnlBYS3g9pqJCct3/s200/java+werwe%25281%2529.jpg" width="200" /></a></div>
<br />
<div style="text-align: justify;">
Desde
quando comecei meus estudos de computação e aprendi a primeira
linguagem de programação, C, eu tenho a curiosidade de entender o
funcionamento de um compilador.</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
Ficava
fascinado pelo fato de um programa transformar um arquivo texto
contendo construções da linguagem, em outro arquivo contendo código
que uma máquina consegue compreender preservando a semântica, ou
seja, seu significado. Esse é o processo de compilação.
</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
Para
iniciantes, isso fica um pouco abstrato porque o foco inicial é
aprender a programar e não como funciona um compilador.</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
Finalmente,
no meu 7° período de curso (bem que poderia ser antes!) tive a
oportunidade de, não só entender todo esse processo de compilação,
mas também construir um compilador seguindo as etapas de projeto.
Cursei a disciplina Compiladores ministrada pelo professor <a href="http://www.univasf.edu.br/~marcus.ramos/c-2011-2/index.html" target="_blank">Marcus Ramos</a> o qual agradeço a paciência e disponibilidade para tirar
dúvidas e compartilhar seu conhecimento, o que possibilitou a
realização desse trabalho!
</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
A
linguagem usada para a construção foi MiniJava. Ela é uma versão
reduzida do Java. Possui apenas construções simples e comandos
básicos como if, while, System.out.println(), permite criação de
métodos e atributos de classe e possui apenas tipos int, boolean,
objeto e vetor de int.</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
Como
nosso tempo foi curto (pouco menos de 2 meses, porque antes tivemos
que ver a teoria que envolve a construção de compiladores), algumas
decisões de projeto tiveram de ser tomadas para que pelo menos algo
de cada etapa (análise sintática, análise de contexto e geração
de código) pudesse ser feito.
</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
A análise
sintática consiste em reconhecer os símbolos (tokens) a partir da
leitura de um arquivo texto de entrada e verificar se eles respeitam
as regras gramaticais da linguagem fonte (no caso foi usada uma BNF
estendida que pode ser encontrada <a href="http://www.cambridge.org/resources/052182060X/MCIIJ2e/grammar.htm" target="_blank">aqui</a>).
</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
Na
semântica, já com os tokens corretamente reconhecidos, o programa é
verificado se está correto agora observando o significado das
construções. Basicamente acontece a identificação (reconhecimento
de variáveis e métodos) e vinculação (vincula cada uso de
variável com sua declaração). Possíveis erros são facilmente
identificados e mensagens exatas podem ser emitidas nessas etapas.
</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
E, por
fim, geração de código. Com o programa bem escrito e com o
significado correto perante as regras da linguagem, as instruções
podem ser traduzidas passo a passo para linguagem de máquina.
Gerando o PUSH para reservar espaço para variáveis, STORE para
guardar valores, LOAD para carregar valor de um registrador, JUMP
para desvios, dentre outras. Essas são algumas básicas, cada
máquina possui seu conjunto de instruções.</div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0cm; text-align: justify;">
No nosso
caso, o código de máquina foi gerado com base em uma máquina
abstrata usada a partir do livro base da disciplina (<a href="http://www.dcs.gla.ac.uk/~daw/books/PLPJ/" target="_blank">link dele aqui</a>),
o TAM (Triangle Abstract Machine). <br />
<br />
<a href="http://minijava.brunopinho.com/" target="_blank"><span style="color: blue;"><b>Aqui nesse</b></span> <b><span style="color: blue;">link</span></b></a> você encontra o arquivo compactado contendo o executável do compilador em bytecode juntamente com uma classe de exemplo. Também há um manual explicando como que instala e usa o compilador! Fique à vontade para testar e comentar.<br />
<br />
Um abraço,<br />
Bruno Pinho.</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com4tag:blogger.com,1999:blog-4122014865825048770.post-81608019514085957492012-01-13T21:13:00.000-02:002012-01-14T13:05:55.931-02:00Dropbox no Debian Squeeze<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9vXsgK77UIBo6SirduE5ZdKrcXfYXfcDEetqRGk5opOXr1PYgw_KBLZfbeTjz-sdgFnppve3i-Shjv2QAc01msreCKHrRWguMQDnZzfXNMYwD-JGt3IT_U_WW0wKUIyo9QEoBUSH0huTH/s1600/dropDeb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="97" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh9vXsgK77UIBo6SirduE5ZdKrcXfYXfcDEetqRGk5opOXr1PYgw_KBLZfbeTjz-sdgFnppve3i-Shjv2QAc01msreCKHrRWguMQDnZzfXNMYwD-JGt3IT_U_WW0wKUIyo9QEoBUSH0huTH/s320/dropDeb.png" width="320" /></a></div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
Recentemente instalei o
dropbox no Debian Squeeze e ele não funcionava de modo algum. Usei
os pacotes .deb do site oficial tanto para Ubuntu quanto Debian e
todos davam o mesmo problema: não encontrava um arquivo 'dropbox' no diretório
/home/user/.dropbox-dist/ sendo que ele estava lá.</div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
Tentei instalar pelo
codigo fonte, compilei tudo mas não funcionou também. Mesmo erro.
Depois de tanto procurar, resolvi tentar uma dica do site do dropbox
mas o download falhava. Ate que encontrei uns arquivos compactados.
Fiz o <a href="http://www.dropbox.com/download?plat=lnx.x86" target="_blank">donwload versão x86</a> (<a href="http://www.dropbox.com/download?plat=lnx.x86_64" target="_blank">versão 64 bits</a>) deles e extraí para a minha pasta home. Entrei no
diretório .dropbox-dist e executei o daemon do dropbox: ./dropboxd
</div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
A partir daí ele
baixou uns arquivos de instalação e pude usá-lo normalmente. Para
criar o atalho, pode ser na mão, mas se já tiver a versão instalada
a partir do .deb, basta apagar o diretorio .dropbox-dist e
substituí-lo pelo baixado do site como fiz acima. Pronto, agora o
seu dropbox funciona tranquilamente no Squeeze!</div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
<br /></div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
Depois de vasculhar e tentar sem sucesso inúmeras vezes pelo .deb, consegui resolver o problema.</div>
<div class="western" style="margin-bottom: 0in; text-align: justify;">
Espero que tenha ajudado!</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com0tag:blogger.com,1999:blog-4122014865825048770.post-38747588658525172102012-01-13T12:47:00.000-02:002012-01-14T13:09:51.281-02:003DSP? Nunca mais!<div style="text-align: justify;">
<br /></div>
<div class="western" style="text-align: justify;">
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="float: left; margin-right: 1em; text-align: left;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG1TYCY_aPRyGvsx_NkiJoe1BK2HcHtEi3VReeyB8DIUjT9p84YtmpqH8qsV-HqNqd5zC-0qf1K7WTDeJy6lIup-FGhYLaCKUcxzAa5A66jQuzXUqL26tO9PTSHlZPDY4cvkZxv6JAFJCA/s1600/3DSPBluew2310u.jpg" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="119" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjG1TYCY_aPRyGvsx_NkiJoe1BK2HcHtEi3VReeyB8DIUjT9p84YtmpqH8qsV-HqNqd5zC-0qf1K7WTDeJy6lIup-FGhYLaCKUcxzAa5A66jQuzXUqL26tO9PTSHlZPDY4cvkZxv6JAFJCA/s200/3DSPBluew2310u.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small;">Placa wireless 3DSP</span></td></tr>
</tbody></table>
Hoje venho compartilhar com vocês, usuários de
notebook MUB (Microboard Ultimate Black) da Microboard que vem com a placa de conexão wireless
3dsp de fabricação chinesa, o fim dos meus problemas com a rede sem
fio. Recentemente instalei o Windows Seven e, ao instalar o driver da
dita placa e usá-lo, volta e meia dava a famosa tela azul. Não sei
por que isso, mas o problema era por conta da placa. Sempre a usei no
Xp e sempre funcionou bem, não tenho do que reclamar. No entanto, eu
gosto de usar Linux e na versão open source dos drivers o negócio é
um pouco complicado.</div>
<div class="western" style="text-align: justify;">
<br /></div>
<div class="western" style="text-align: justify;">
Eu tenho a preferencia pela distro Debian. Mas eu
tinha uma barreira que impedia de usá-lo. Os drivers não
funcionavam corretamente. Para compilar era um trabalho e tinha que
renomear uns diretórios e mesmo assim não funcionava. Quando
pensava estar tudo ok, a placa não tinha um bom desempenho.
Instabilidade na conexão e superaquecimento do meu note são só 2
problemas que listo... Só havia uma distribuição Linux em que os
drivers funcionavam corretamente: Ubuntu. Você baixava o pacote .deb
e instalava numa boa. Só que eles tinham limitação de versão do
kernel e, sempre na próxima versão do Ubuntu que sair e tiver uma
atualização do lernel, o drive pára de funcionar. Então teria que
e esperar sair o pacote pré-compilado para a próxima versão do
Ubuntu. Ou seja, sempre ficava dependendo do pessoal desenvolver o
próximo pacote para a versão... Isso não é uma coisa boa!</div>
<div class="western" style="text-align: justify;">
<br /></div>
<div class="western" style="text-align: justify;">
Mas há o código fonte, você poderia compilar e
resolver o problema... Não! Simplesmente esse código fonte só
funcionava também no Ubuntu. Tentei inúmeras vezes instalar no
Debian mas aí aparecia a famosa frase dessa placa quando abria o seu
gerenciador: “no valid wireless device”.</div>
<div class="western" style="text-align: justify;">
<br /></div>
<div class="western" style="text-align: justify;">
</div>
<div class="western">
<div style="text-align: justify;">
Então, já cansado de ficar limitado a usar ao o
Ubuntu, abdiquei do bluetooth (só para lembrar, a 3dsp possui
wireless e bluetooth na mesma placa) e a troquei. Antes de tudo,
precisava pesquisar quais placas teriam suporte no Linux ou pelo
menos drivers que funcionassem. Isso pode ser visto para o Debian
<a href="http://wiki.debian.org/WiFi" target="_blank">aqui</a>. Achei duas placas de nome no mercado que teria suporte no
Linux: atheros e rtl. Não achei atheros com preço acessível. Então
parti para a rtl. Mas possuem 3 versões. Eu optei pela rtl8187b da
azurewave. Além de ter suporte, possui drivers open source. E, para
nossa alegria, o Debian Squeeze já possui módulo para essas placas:
rtl8187. Bastava então instalá-lo e carregar. </div>
</div>
<div class="western">
<div style="text-align: justify;">
<br /></div>
</div>
<div class="western">
<div style="text-align: justify;">
<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/AVvXsEhymRQ4BHYwSO5o1LDmAiDHQJ1nW0a58OK0iWHt25g9SrS7lALb6Vm_qQCruCv61g-CI0W2N1uothhMhK3DXGyRTS7XlNX4MQe7TErV7j612kdwQ_3ELG_uKmbTjhyphenhyphenu-JJi0HoTrMGFlYOV/s1600/s_MLB_v_F_f_209704755_3960.jpg" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="119" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhymRQ4BHYwSO5o1LDmAiDHQJ1nW0a58OK0iWHt25g9SrS7lALb6Vm_qQCruCv61g-CI0W2N1uothhMhK3DXGyRTS7XlNX4MQe7TErV7j612kdwQ_3ELG_uKmbTjhyphenhyphenu-JJi0HoTrMGFlYOV/s200/s_MLB_v_F_f_209704755_3960.jpg" width="200" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: small;">Placa RTL8187B da Azurewave</span></td></tr>
</tbody></table>
Comprei a placa
Minipci no valor de 39 reais. Abri o notebook e fiz apenas trocar
pela 3dsp reconectando os cabos da antena da mesma maneira que
estavam. Liguei o notebook e pronto. Tanto o Windows quanto o Linux
reconheceram automaticamente o driver. Fiquei surpreso já que tinha
separado os drivers.. Mas o importante é que agora tenho a liberdade
de escolher qualquer distribuição Linux porque essa placa tem
suporte em muitas versões do kernel e o código fonte esta
disponível para instalação manual. E, na pior das hipóteses, pode
usá-la com o ndiswrapper. A 3dsp não funcionava com o ndiswrapper
porque não possui o arquivo necessário. </div>
</div>
<div class="western">
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Então, para aqueles que ainda têm dor de cabeça com essa placa, segue mais uma experiência de alguém que resolveu trocá-la para ter melhor desempenho e liberdade com seu notebook MUB!</div>
</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com3tag:blogger.com,1999:blog-4122014865825048770.post-31057116969041536382011-09-22T20:59:00.001-03:002012-01-29T01:20:02.347-02:00Vídeo - Comando fork() no Linux<div>
Bem pessoal, segue abaixo uma vídeo-aula que fiz explicando como se cria processos no ambiente linux usando o comando fork().</div>
<div>
<br /></div>
<div>
<br /></div>
<iframe allowfullscreen="" frameborder="0" height="315" src="http://www.youtube.com/embed/3VgLkCqqKWo" width="560"></iframe>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com0tag:blogger.com,1999:blog-4122014865825048770.post-58768667751530699322011-09-11T15:53:00.000-03:002012-01-29T00:49:26.414-02:00O que são Microcontroladores?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQWf9L-oUx3oZq5L1T8J0x_6cam79YVwlfi_uWI-nBdyZTx_smPvq5mHCuiIYzRa011-WQPsxN_tMlNeJJM7l3XvoOgnaHPqiM6b3N1vjiNW15Uf-Me3d_zvtq6odH98zoAbQoh_fuGAFS/s1600/pic16f628a.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5651181925959134290" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhQWf9L-oUx3oZq5L1T8J0x_6cam79YVwlfi_uWI-nBdyZTx_smPvq5mHCuiIYzRa011-WQPsxN_tMlNeJJM7l3XvoOgnaHPqiM6b3N1vjiNW15Uf-Me3d_zvtq6odH98zoAbQoh_fuGAFS/s320/pic16f628a.jpg" style="cursor: hand; cursor: pointer; display: block; height: 320px; margin: 0px auto 10px; text-align: center; width: 283px;" /></a><br />
<div style="text-align: justify;">
Alguém já ouviu falar em microcontrolador e ficou se perguntando o que é e para que serve? Pois é, imagine um computador em miniatura que possui um conjunto reduzido de instruções mas que é capaz de controlar inúmeras coisas como a temperatura do seu forno microondas, a temperatura de um dado ambiente e até acionar motores! O objetivo é criar um dispositivo que seja semelhante ao chip de processador usado em seu notebook ou desktop mas seja projetado para aplicações específicas e que exija bem menos potência para funcionar. Foi então que surgiu o PIC (Programmable Interface Controller ou controlador de interface programável) fabricado pela Microchip. Dentro desta "pastilha" preta cheia de pinos acima, há inúmeros módulos, por assim dizer, que possuem características importantes para o funcionamento do conjunto.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Aí dentro encontramos diversos dispositivos de entrada e saída e periféricos. Ou seja, encontramos um conversor Analógico/Digital, memória, uma CPU para processar os dados, dentre outros. O conversor serve para obter dados provenientes de sensores e convertê-lo para um sistema que seja fácil do computador interpretar. Os dados que estão na natureza possuem muitas vezes natureza analógica, ou seja, sinais contínuos no tempo. Os computadores só entendem 0 e 1, então é preciso converter esse sinal contínuo em uma sequência de zeros e uns!!</div>
<div style="text-align: justify;">
A memória é usada para guardar o programa que a gente faz usando a linguagem C, por exemplo, dentro do chip para ele poder ser executado, e, ao ser desligado, o seu conteúdo não seja perdido!</div>
<div style="text-align: justify;">
E também uma memória volátil, aquela que os dados são perdidos quando tiramos a alimentação (energia). </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
O uso desses componentes pequenos está cada vez mais comum hoje em dia já que sistemas específicos e projetos direcionados são cada vez mais necessários. Você aí, se tiver uma fazendo e quer que a sua irrigação seja monitorada 24horas por dia para que não haja prejuízos, com certeza você pode "encomendar" um sistema desse de um Engenheiro por exemplo. Ele vai desenvolver o programa e adquirir os sensores corretos para monitorar e quem sabe, se for preciso, acionar alguma coisa. Ele vai fazer uma plaquinha que vai conter lá o elemento principal para fazer todo o gerenciamento do sistema, o Microcontrolador! Um sistema desses você pode encontrar por aí, garanto que não vai ser fácil, e pior, talvez não seja 100% adequado para o seu problema. Então é por isso que sua aplicabilidade é muito grande. Já que cada situação possui suas características que precisam ser desenvolvidas especificamente para cada cliente.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Esse chip também possuem pinos usados para enviar sinais para serem interpretados por um computador via comunicação usb ou serial. Então além de monitorar a sua fazenda, ele ainda pode enviar os dados para serem salvos em HD e analisados depois, e por aí a imaginação ajuda bastante nessas horas, colocar tudo em banco de dados, criar gráficos, analisar em qual época do ano tal fenômeno é mais presente, onde é preciso aumentar ou diminuir a quantidade de água e etc!</div>
<div style="text-align: justify;">
Bem é isso, espero que tenham entendido um pouco do que expliquei!</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Imagem tirada de: <a href="http://www.roboticasimples.com/cursos.php?acao=15">http://www.roboticasimples.com/cursos.php?acao=15</a></div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com1tag:blogger.com,1999:blog-4122014865825048770.post-78099974968924223592011-09-08T21:26:00.000-03:002014-07-02T20:00:22.437-03:00Comando fork() - Sistemas Operacionais<div style="text-align: justify;">
Pessoal, resolvi postar algo sobre o uso do comando fork() em ambiente Linux de programação.</div>
<div style="text-align: justify;">
Quando damos o comando fork() em um programa escrito em C no Linux, ele vai criar uma cópia exata a partir do ponto em que o comando é executado e dois processos executam ao mesmo tempo, o processo pai (aquele que chama o comando fork() ) e o processo filho (o que foi gerada pela chamada do fork() ).</div>
<div style="text-align: justify;">
Um programa simples que usa o fork() pode ser visto logo abaixo:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div style="text-align: justify;">
<div style="text-align: justify;">
<div style="text-align: justify;">
<div style="text-align: justify;">
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">#include < stdio.h ></span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">#include < stdlib.h ></span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">#include < sys/types.h ></span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">#include < sys/wait.h ></span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">#include < unistd.h ></span></div>
</div>
</div>
</div>
</div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">int main ()</span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">{</span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>pid_t filho;</span></div>
<div style="text-align: justify;">
<span class="Apple-tab-span" style="font-family: Courier New, Courier, monospace; font-size: x-small; white-space: pre;"> </span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>filho = fork(); //aqui criamos o processo filho</span></div>
<div style="text-align: justify;">
<span class="Apple-tab-span" style="font-family: Courier New, Courier, monospace; font-size: x-small; white-space: pre;"> </span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>if ( filho == 0 ) { //execução do filho</span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>printf ("Sou o filho executando...\n");</span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>_exit(0);</span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span></div>
<div style="text-align: justify;">
<span class="Apple-tab-span" style="font-family: Courier New, Courier, monospace; font-size: x-small; white-space: pre;"> </span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>else { //execução do pai</span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>printf ("Sou o pai executando.\n");</span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>}</span></div>
<div style="text-align: justify;">
<span class="Apple-tab-span" style="font-family: Courier New, Courier, monospace; font-size: x-small; white-space: pre;"> </span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><span class="Apple-tab-span" style="white-space: pre;"> </span>exit(0);</span></div>
<div style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">}</span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Uma maior explicação dos cabeçalhos incluídos nesse programa pode ser encontrado nas entradas de manual do linux, como "man fork". Você pode encontrar descrições detalhadas de cada função.</div>
<div style="text-align: justify;">
Podemos ver que quando damos um comando fork() um valor de retorno é atribuído à variável filho. No processo pai, esse valor é diferente de zero, no processo filho, é igual a zero. Observe que o que estiver abaixo do comando fork() é replicado para outro processo, então tanto o processo pai quanto o filho irão executar o que vier abaixo, por isso precisamos testar com o "if" o que cada um deve executar. Então se o valor da variável filho é igual a zero, então quer dizer que é o trecho de código que o filho deve executar, caso contrário, será o do pai. Dessa forma, temos dois processos executando, sendo que um foi gerado pelo outro! A ideia é fazer com que os dois executem e realizem tarefas de modo mais rápido, sendo que cada tarefa é atribuída para cada um realizar separadamente, com isso pode-se obter ganho de desempenho!</div>
<div style="text-align: justify;">
Espero que tenham gostado!</div>
</div>
Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com1tag:blogger.com,1999:blog-4122014865825048770.post-7221385505571577442011-09-04T19:19:00.000-03:002012-01-29T00:50:39.775-02:00Sistemas Operacionais<div style="text-align: justify;">
Recentemente comprei um livro de Sistemas Operacionais para poder acompanhar melhor as aulas, já que estou cursando essa disciplina nesse semestre, e gostaria de compartilhar o que estou achando dele.</div>
<div style="text-align: justify;">
É esse aqui: <span class="Apple-style-span" style="background-color: white; font-family: arial, sans-serif; font-size: small; line-height: 16px;"><b><em style="font-style: normal;">Sistemas Operacionais</em> Modernos - <em style="font-style: normal;">3ª</em> Ed. 2010 - <em style="font-style: normal;">Tanenbaum</em>, Andrew S. </b>Por enquanto estou gostando muito de sua abordagem sobre a teoria em que se baseia um S.O. (Abreviação de Sistemas operacionais). Para quem não sabe, esse Tanenbaum desenvolveu um S.O. para fins didáticos, baseado no UNIX, o pai da família de Linux que vemos por aí e BSD's da vida, como o da Apple que acompanha seus notebooks. O nome desse sistema didático é MINIX, já que era uma versão menor do Unix (confira aqui: www.minix3.org). No site encontramos o seu código-fonte e um monte de documentação ensinando a instalar e usar. </span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="background-color: white; font-family: arial, sans-serif; font-size: small; line-height: 16px;">Na minha opinião nada melhor para estudar S.O. do que no linux, ainda mais quando dispomos de um material inicial, como o Minix, para podermos praticar um pouco daquilo que estudamos. Ele possui um conjunto reduzido de instruções, o que permite um maior entendimento e facilidade para poder usar os comandos e quem sabe até estudar realmente a implementação já que podemos abrir o código fonte, na sua maioria escrito em C.</span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="background-color: white; font-family: arial, sans-serif; font-size: small; line-height: 16px;">Pretendo em breve postar mais alguns conceitos importantes como processos e threads!</span></div>
<div style="text-align: justify;">
<span class="Apple-style-span" style="background-color: white; font-family: arial, sans-serif; font-size: small; line-height: 16px;">Um abraço!</span></div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com0tag:blogger.com,1999:blog-4122014865825048770.post-34511133327295421402011-08-28T13:24:00.000-03:002012-01-29T00:51:18.973-02:00Falha boot ubuntu 10.04<div>
Iae galera, depois de tanto tempo sem postagem resolvi voltar para mostrar uma solução simples para um "bug" que aconteceu em meu notebook quando instalei a versão 10.04 (stable) do ubuntu.</div>
<div>
Toda vez quando inicio o sistema a mensagem aparece logo após a escolha do sistema operacinal no grub: </div>
<div>
<br /></div>
<span class="Apple-style-span">"udevd [308] open /dev/null failed: no such file or directory"</span><br />
<div>
<br /></div>
<div>
Pesquisei e não achei uma solução. Então resolvi fazer um teste, atualizei a versão do kernel para a 2.6.32-33-generic e essa mensagem deixou de aparecer.</div>
<div>
Provavelmente era alguma tentativa de leitura de algum dispositivo que o sistema não estava tratando corretamente!</div>
<div>
<br /></div>
<div>
Por enquanto é isso. Em breve irei preparar umas boas postagens!</div>
<div>
<br />
<div>
<br />
<div>
<br /></div>
</div>
</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com0tag:blogger.com,1999:blog-4122014865825048770.post-25675985419730292642010-10-30T12:23:00.000-03:002012-01-29T00:47:33.702-02:00Maratona de Programação 2010<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpyUUS0gSC0w0ZDgs6C2V2ufCl1cSuQ46lD_LcIjFEJx_ryTzutxHQXIjz9S9ivNks6f-sjjp1DZLeAzv-8OnCRJt_0YLLZAJRpaTkcxB6Axh5oAq53jG_-m3L35UgXJB1-FM6yjtnEV5u/s1600/icpc_logo_big.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5533862152944655154" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpyUUS0gSC0w0ZDgs6C2V2ufCl1cSuQ46lD_LcIjFEJx_ryTzutxHQXIjz9S9ivNks6f-sjjp1DZLeAzv-8OnCRJt_0YLLZAJRpaTkcxB6Axh5oAq53jG_-m3L35UgXJB1-FM6yjtnEV5u/s400/icpc_logo_big.png" style="cursor: pointer; display: block; height: 339px; margin: 0px auto 10px; text-align: center; width: 345px;" /></a><br />
<br />
<div style="text-align: justify;">
A Maratona de programação é uma competição promovida pela ACM, IBM e SBC (Sociedade Brasileira de Computação) que envolve todos os estudantes que se interessam por programação de computadores. Ela acontece em três etapas. A primeira, a regional, é realizada separadamente pelos estados brasileiros. Cada região recebe Instituições escritas e concorrem a uma, duas ou três vagas a depender dos critérios da competição, por exemplo, a sede que foi medalhista na final anterior consegue mais uma vaga para a final brasileira. Passada a primeira etapa, as equipes irão disputar agora a final brasileira em algum lugar do Brasil. Nesse ano ocorreu em Joinville com o apoio da UDESC (Universidade do Estado de Santa Catarina). Só que a prova da final brasileira é a mesma de alguns países da América do Sul, na verdade, a final brasileira já é uma etapa da regional sul-americana. E, por fim, a terceira etapa é o mundial. No qual as equipes que melhor se qualificaram nas finais irão disputar o mundial em algum lugar do mundo. Ano passado foi na China e em 2010 será no Egito.<br />
<br />
Esse ano a Univasf marcou presença na regional de Sergipe em Aracaju com 3 equipes: 3 ohms (Thiago Ribeiro, Jesse Nery e Thiago Bruno), Programaçao MaCima (Matias Filho, Anderson Matias e Cícero) e Faca na Caveira (Bruno Pinho, Sérgio Soares e Victor Dias), tendo como técnico o Professor Marcelo Santos Linder.</div>
<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_UJbrx0Tl9Hgyn_noCQ_zpfTjEOfIwiTqd_tmDVWU7PzbitpJAApXUBWbeZn69XQZFRVYDFjE1PE1dKGTwd9kruX4zUT5vl3OsrAl6XLoWf-K0ps12FYqwHwXi8VMOqYbZMt0w7UV_0Oy/s1600/101_0073.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5533862647007549522" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_UJbrx0Tl9Hgyn_noCQ_zpfTjEOfIwiTqd_tmDVWU7PzbitpJAApXUBWbeZn69XQZFRVYDFjE1PE1dKGTwd9kruX4zUT5vl3OsrAl6XLoWf-K0ps12FYqwHwXi8VMOqYbZMt0w7UV_0Oy/s400/101_0073.jpg" style="cursor: pointer; display: block; height: 299px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a>Regional em Aracaju: equipes da Univasf</div>
<br />
<div style="text-align: justify;">
Foi a segunda vez que a Univasf participou da Maratona e conseguiu bons resultados e colocações tendo em conta o pouco preparo e o fato de sermos iniciantes na competição. Felizmente conseguimos uma vaga para disputar a final brasileira da maratona em Joinville. Isso foi muito bom porque contribuiu para que pudéssemos ter mais experiência e saber como se preparar melhor para a maratona conversando e trocando ideias com pessoas de outras equipes.</div>
<br />
<div style="text-align: justify;">
A equipe Faca na Caveira conseguiu na final brasileira a 44ª colocação dentre as 50 equipes que conseguiram se classificar. Contamos com a presença do Professor Mário Godoy que nos acompanhou na final brasileira da maratona de programação.<br />
Foi um bom desempenho e esperamos continuar se preparando para as próximas competições, que, além de promover mais conhecimento para os estudantes da área de Computação, podemos aprimorar e aprender novas técnicas de programação que com certeza serão úteis em nossa vida profissional. Espero que possamos nos organizar melhor e conseguir chegar na final brasileira com mais equipes e mais bem preparados.</div>
<br />
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigHrs_8uOe5auJKW7WNdsjc8Py4bAAQou5ukdxucSHlPyya8rChZcjLO0YKavsA80__XT0nHEcMuhJL5JF77HfQ2A4BALAPc5ygtVK1iSiivQUeYQEr8XJPfpTU1Y3anHqIC0RdKBN1swL/s1600/101_0304.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5533865054889824034" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigHrs_8uOe5auJKW7WNdsjc8Py4bAAQou5ukdxucSHlPyya8rChZcjLO0YKavsA80__XT0nHEcMuhJL5JF77HfQ2A4BALAPc5ygtVK1iSiivQUeYQEr8XJPfpTU1Y3anHqIC0RdKBN1swL/s400/101_0304.jpg" style="cursor: pointer; display: block; height: 300px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a>Final Brasileira: equipe Faca na Caveira</div>
<br />
<div style="text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7tauO5IcJqGDOcw6rFuhCT6gRwqWvkEvGI5UT8ML6lWPmfbtf2KzdQuN3f9bHqUZO3fXuL71l4em_-58VUscbT_svqjsYf_1gfPncZBFuEg1G2Tqo1B6FMpUC4DJrfiCgVZ-o1GRZ6dKU/s1600/101_0291.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5533866421808055570" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7tauO5IcJqGDOcw6rFuhCT6gRwqWvkEvGI5UT8ML6lWPmfbtf2KzdQuN3f9bHqUZO3fXuL71l4em_-58VUscbT_svqjsYf_1gfPncZBFuEg1G2Tqo1B6FMpUC4DJrfiCgVZ-o1GRZ6dKU/s400/101_0291.jpg" style="cursor: pointer; display: block; height: 300px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a>Professores: Mário e Marcelo<br />
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: left;">
<div style="text-align: justify;">
Gostaria de agradecer também à <a href="http://www.univasf.edu.br/">Univasf</a> por ter apoiado essa ideia e aos professores do nosso colegiado (<a href="http://www.univasf.edu.br/~ccomp">CCOMP</a>) que estiveram a todo momento nos ajudando e depositando confiança!</div>
<br />
<div style="text-align: left;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhto_P_LlE1EAOH2tAt_sWV7Uc-UnMzewi45alnkoKRvs-zTpsXJEqLbIfNGI_AKKkQmUY8sktsto7GIYBA6XXaj_bD_HUyhoTPQeEiBxufzOMFwcA2Iee6PZnHQuoFIFFq5jb0yOozI8-b/s1600/Captura_de_tela.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5533906302643421474" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhto_P_LlE1EAOH2tAt_sWV7Uc-UnMzewi45alnkoKRvs-zTpsXJEqLbIfNGI_AKKkQmUY8sktsto7GIYBA6XXaj_bD_HUyhoTPQeEiBxufzOMFwcA2Iee6PZnHQuoFIFFq5jb0yOozI8-b/s400/Captura_de_tela.png" style="cursor: pointer; display: block; height: 99px; margin: 0px auto 10px; text-align: center; width: 281px;" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHys09xPRf89M2byJMUKAE_PRZvXnEEdQU4PgUPGylhrAEoGEMItELkYXoZDXXlDftndCpiMMcntAFjZyrymsS7QQBKbUwFmQpXYRJYPJtCtB4SuHf3CKTqHd6UDTEVkA-Ez3BXVE8V9Rq/s1600/univasf.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5533906469489979970" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHys09xPRf89M2byJMUKAE_PRZvXnEEdQU4PgUPGylhrAEoGEMItELkYXoZDXXlDftndCpiMMcntAFjZyrymsS7QQBKbUwFmQpXYRJYPJtCtB4SuHf3CKTqHd6UDTEVkA-Ez3BXVE8V9Rq/s320/univasf.jpg" style="cursor: pointer; display: block; height: 107px; margin: 0px auto 10px; text-align: center; width: 165px;" /></a></div>
<br />
Alguns links:<br />
placar da regional: <a href="http://maratona.ime.usp.br/primeira-fase10/aracaju/mail.google.com.html">http://maratona.ime.usp.br/primeira-fase10/aracaju/mail.google.com.html</a><br />
informações e placar da final: <a href="http://maratona.ime.usp.br/resultados10/">http://maratona.ime.usp.br/resultados10/</a><br />
página principal da maratona: <a href="http://maratona.ime.usp.br/">http://maratona.ime.usp.br/</a><br />
<br /></div>
<div style="text-align: justify;">
<br /></div>
</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com1tag:blogger.com,1999:blog-4122014865825048770.post-53631188313933582932010-07-23T19:30:00.001-03:002012-01-29T00:38:31.737-02:00A era do Software Livre<div style="text-align: justify;">
Olhem a propaganda da Dell e do Sistema Livre Ubuntu. Creio que estamos realmente no momento da liberdade de tecnologia e sistemas. Uma das gigantes da produção de computadores (Dell) faz uma propaganda em parceria com a distribuição GNU/Linux mais querida da atualidade, o Ubuntu!!<br />
<br />
Cada vez mais o Sistema proprietário está tendo que baratear seus produtos para concorrer com os sistemas livres que estão cada vez mais, melhores, seguros e fáceis de usar!<br />
Além de tudo, ganhando espaço no mercado mundial, taí o resultado, confiram:</div>
<br />
<object height="225" width="400"><param name="allowfullscreen" value="true">
<param name="allowscriptaccess" value="always">
<param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=10518151&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1">
<embed src="http://vimeo.com/moogaloop.swf?clip_id=10518151&server=vimeo.com&show_title=1&show_byline=1&show_portrait=0&color=&fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="225"></embed></object><br />
<a href="http://vimeo.com/10518151">Ubuntu</a> from <a href="http://vimeo.com/user1196300">Keith Kenniff</a> on <a href="http://vimeo.com/">Vimeo</a>.Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com3tag:blogger.com,1999:blog-4122014865825048770.post-5176468418208970342010-07-22T00:27:00.000-03:002012-01-29T01:22:55.380-02:00Videoaula alocação dinâmica de memória em C<div style="text-align: justify;">
Você está programando na linguagem C e se depara com a situação: eu preciso armazenar dados em meu programa mas não sei quanto de memória irei utilizar. Se eu reservar um pedaço bem grande da memória, corro o risco de não utilizá-la toda. Se reservar uma pequena "fatia" também tenho possibilidade de ter que usar algo mais. Então como devo fazer para usar exatamente aquilo de que preciso? Para isso vou mostrar para vocês como alocar posição ou espaço de memória de uma maneira otimizada para garantir que eu vou usar sempre o necessário sem ter que desperdiçar nada.<br />
Essa aula é básica para aprender como alocar memória. É claro que há a possibilidade de aumentar esse espaço de memória para caber mais "coisas", mas isso é assunto para uma próxima aula quem sabe!!<br />
Espero que gostem da explicação. Qualquer coisa é só comentar, :-)</div>
<br />
<div style="text-align: justify;">
<br />
<object height="385" width="480"><param name="movie" value="http://www.youtube.com/v/8VjsSR0o3ZM&hl=pt_BR&fs=1">
<param name="allowFullScreen" value="true">
<param name="allowscriptaccess" value="always">
<embed src="http://www.youtube.com/v/8VjsSR0o3ZM&hl=pt_BR&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
<br />
<br />
link do vídeo: <a href="http://www.youtube.com/watch?v=8VjsSR0o3ZM">http://www.youtube.com/watch?v=8VjsSR0o3ZM</a></div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com1tag:blogger.com,1999:blog-4122014865825048770.post-86738473679839073692010-07-12T23:03:00.000-03:002012-01-29T01:21:27.967-02:00O que é Computação em Nuvem?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_qKTk7c6MdCQQMu1eLNvckX5_CE6TFOy0mKN-HCIzxqlNsbyLV5b9UraHcIIp552-_aUQcAu3cxQXlBXSJFwqvhPW2oKCrAYvU2rRT0nq9DWZAzICVxZGPA-HCHA0dvUk9EmftGe3Ado3/s1600/cloud-computing-kitchen-sink.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5493208853652207666" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj_qKTk7c6MdCQQMu1eLNvckX5_CE6TFOy0mKN-HCIzxqlNsbyLV5b9UraHcIIp552-_aUQcAu3cxQXlBXSJFwqvhPW2oKCrAYvU2rRT0nq9DWZAzICVxZGPA-HCHA0dvUk9EmftGe3Ado3/s400/cloud-computing-kitchen-sink.jpg" style="cursor: pointer; display: block; height: 286px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a><br />
<div style="text-align: justify;">
<strong></strong><strong></strong><br />
<br />
<br />
<div style="text-align: justify;">
Muito se tem falado sobre esse novo termo da computação, mas afinal, o que é, e para que serve?<br />
Também conhecido como "<strong>cloud computing</strong>" do inglês. Tudo indica que vai ser a nova maneira de usar computador. Como a maioria dos aplicativos usados por nós baseia-se na "nuvem", ou seja, na imensa rede de redes que se chama internet, nada mais justo do que rodar o sistema também na própria nuvem. A ideia basicamente é ter um sistema que concentre na internet tudo aquilo de que necessitamos para desenvolver nossas atividades, e-mail, mensagem instantânea, vídeos, pesquisa, música, etc...<br />
Bastaria apenas ter acesso à internet e pronto, o sistema iria buscar para nós o que precisássemos. Quem dispara mais uma vez nessa corrida, como sempre, é a Google. Ela inclusive lançou seu sistema para a computação em nuvem. Tudo vai rodar direto dos servidores da internet para a nossa máquina, que pode ser um netbook, que além de prático e leve possui um conjunto de hardware simples que seria ideal para rodar aplicativos diretos de servidores web sem problema. O computador seria um mediador entre a nuvem e o usuário. O trabalho de processamento que era atribuído ao sistema operacional (Windows, Linux, Mac) passou para os grandes servidores que rodam diretamente da internet, então os sistemas que utilizam a computação em nuvem precisariam basicamente de um navegador web como o Mozilla ou Chrome para rodar os aplicativos. Em qualquer lugar do mundo, poderíamos acessar os nossos dados, bastando para isso termos acesso à internet. Interessante não?! Mas será que seria confiável deixar nossos dados em um servidor web assim? Pairando na internet numa boa? Como vamos garantir segurança?? Isso é conversa para se discutir quando essa ideia estiver mais bem consolidada e termos grande número de pessoas nesse novo modelo para saber quais são as ferramentas usadas para manter a segurança dos dados.</div>
<strong></strong></div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com4tag:blogger.com,1999:blog-4122014865825048770.post-67607743205229288502010-07-01T22:31:00.000-03:002012-01-29T01:22:08.211-02:00Tutorial Makefile<div style="text-align: justify;">
Iae pessoal, tudo bem?</div>
<div style="text-align: justify;">
Estava dando uma passada pelo YouTube atrás de vídeo-aulas sobre Makefile, que é uma ferramenta muito usada para auxiliar na programação e vi que não tinha nenhuma em português. Então resolvi desenvolver essa vídeo-aula para auxiliar todos que procuram por um material em português e ainda não achou. Espero que esse vídeo possa te ajudar a entender como funciona essa ferramenta e que otimize sua programação.</div>
<div style="text-align: justify;">
Qualquer dúvida e comentário é bem-vindo!</div>
<div style="text-align: justify;">
Falou!</div>
<div>
<br /></div>
<div>
<br /></div>
<object height="385" width="480"><param name="movie" value="http://www.youtube.com/v/F3yQFrrZ9ns&hl=pt_BR&fs=1">
<param name="allowFullScreen" value="true">
<param name="allowscriptaccess" value="always">
<embed src="http://www.youtube.com/v/F3yQFrrZ9ns&hl=pt_BR&fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com1tag:blogger.com,1999:blog-4122014865825048770.post-1365076933021611772010-06-24T19:18:00.001-03:002010-06-24T19:20:47.159-03:00Dicas nova versão Ubuntu<a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMNHWkK_S1uZR4SeeMk4mqb28XkMIKc7EtrCqRo2VwAypQNusy2p6I2cAnsTMeVtzAaHnjD7H4-k2z7PO2vlZIwIhVdS0r-XiI0CTr2nNR_XI5_VJEFXr4vgyCN7xg1Jvl_uC3V335ird7/s1600/ubuntu-10-04.png"><img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 221px;" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMNHWkK_S1uZR4SeeMk4mqb28XkMIKc7EtrCqRo2VwAypQNusy2p6I2cAnsTMeVtzAaHnjD7H4-k2z7PO2vlZIwIhVdS0r-XiI0CTr2nNR_XI5_VJEFXr4vgyCN7xg1Jvl_uC3V335ird7/s400/ubuntu-10-04.png" border="0" alt="" id="BLOGGER_PHOTO_ID_5486468316055748738" /></a>Para aqueles que gostam de usar o ubuntu e estão sem rodar formatos gerais como mp3, avi aí vai um tutorial para instalar todos os pacotes necessários:<div><a href="http://ubuntued.info/multimedia-no-ubuntu-lucid-lynx">http://ubuntued.info/multimedia-no-ubuntu-lucid-lynx</a></div><div><br /></div><div>flw galera!!</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com1tag:blogger.com,1999:blog-4122014865825048770.post-53351848318787389182010-02-21T00:26:00.000-03:002012-01-29T00:49:06.005-02:00O que é Roteador?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDIHvXa8QNGBeswrnzCmEpgmujRs4i0IEhOo-JCehtHV1saqUatzPDJQPVJ0oK8X5Of2kxu7VBrGLFDjuykPBpkxWBdcPJvSHTgcYDGNcHrCI44yexsW-S6Oe9tbPRqBgecitDPUb_g8KH/s1600-h/800px-Router2.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5440533846838231970" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDIHvXa8QNGBeswrnzCmEpgmujRs4i0IEhOo-JCehtHV1saqUatzPDJQPVJ0oK8X5Of2kxu7VBrGLFDjuykPBpkxWBdcPJvSHTgcYDGNcHrCI44yexsW-S6Oe9tbPRqBgecitDPUb_g8KH/s400/800px-Router2.jpg" style="cursor: pointer; display: block; height: 118px; margin: 0px auto 10px; text-align: center; width: 299px;" /></a><br />
<div style="text-align: justify;">
<br />
Bem, pessoal, continuando a série "Redes", aí vai a explicação de mais um componente muito importante em uma rede, o roteador!</div>
<div style="text-align: justify;">
<b>Roteador</b> (estrangeirismo do inglês <i>router</i>, ou <b>encaminhador</b>) é um equipamento usado para fazer a comutação de protocolos, a comunicação entre diferentes redes de computadores provendo a comunicação entre computadores distantes entre si.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Roteadores são dispositivos que operam na camada 3 do modelo OSI de referência. A principal característica desses equipamentos é selecionar a rota mais apropriada para encaminhar os pacotes recebidos. Ou seja, escolher o melhor caminho disponível na rede para um determinado destino.</div>
<div style="text-align: justify;">
Os roteadores utilizam tabelas de rotas para decidir sobre o encaminhamento de cada pacote de dados recebido. Eles preenchem e fazem a manutenção dessas tabelas executando processos e protocolos de atualização de rotas, especificando os endereços e domínios de roteamento, atribuindo e controlando métricas de roteamento. O <span class="mw-redirect">administrador</span> pode fazer a configuração estática das rotas para a propagação dos pacotes ou pode configurar o roteador para que este atualize sua tabela de rotas através de processos dinâmicos e automáticos.</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
Os roteadores encaminham os pacotes baseando-se nas informações contidas na tabela de roteamento. O problema de configurar rotas estaticas é que, toda vez que houver alteração na rede que possa vir a afetar essa rota, o administrador deve refazer a configuração manualmente. Já a obtenção de rotas dinamicamente é diferente. Depois que o administrador fizer a configuração através de comandos para iniciar o roteamento dinâmico, o conhecimento das rotas será automaticamente atualizado sempre que novas informações forem recebidas através da rede. Essa atualização é feita com a troca de informações entre roteadores vizinhos em uma rede.</div>
fonte: <a href="http://pt.wikipedia.org/wiki/Roteador">http://pt.wikipedia.org/wiki/Roteador</a><br />
Para descontrair, achei um vídeo explicando o funcionamento de um pc por dentro: <a href="http://www.youtube.com/watch?v=Y_24IKwFD2A&feature=related">http://www.youtube.com/watch?v=Y_24IKwFD2A&feature=related</a>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com3tag:blogger.com,1999:blog-4122014865825048770.post-74317384806600519012010-02-19T23:47:00.000-03:002012-01-29T00:39:12.766-02:00O que é Modem?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh87Fm7B-ykHCpCij6hJFqbSUyzxAq868wBNCyW6dlCeTvje0w3843QixIHyPvtiZXzcoDq8vwigIjk7VYzIvwLHvKsA8bs_4fDs4f_EL3Q3tdBDWh73CQVM35pC_aCNmBwwza1w05l3EhN/s1600-h/MODEM_ADSL_D_LIN_48de9a9dcf0dd.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5440154107650578594" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh87Fm7B-ykHCpCij6hJFqbSUyzxAq868wBNCyW6dlCeTvje0w3843QixIHyPvtiZXzcoDq8vwigIjk7VYzIvwLHvKsA8bs_4fDs4f_EL3Q3tdBDWh73CQVM35pC_aCNmBwwza1w05l3EhN/s400/MODEM_ADSL_D_LIN_48de9a9dcf0dd.jpg" style="cursor: pointer; display: block; height: 267px; margin: 0px auto 10px; text-align: center; width: 273px;" /></a><br />
<div style="text-align: justify;">
Hoje a internet tornou-se uma ferramenta essencial para a humanidade e, seria quase inimaginável o mundo sem essa tecnologia. Ser entendida como a rede mundial de computadores é fácil, mas, estar por dentro da função de cada aparelho usado para mantê-la funcionando, é outra.<br />
Vou tentar juntar algumas explicações do que cada um faz.<br />
Primeiro, devemos saber que a peça básica usada na maioria das conexões é o <span style="color: #3366ff; font-style: italic;">modem</span>. Certo e daí, Para que ele serve?<br />
<br />
<span style="color: black;">Modem é junção das palavras: modulador e demodulador. Ele é um dispositivo </span><span class="mw-redirect" style="color: black;">eletrônico</span><span style="color: black;"> que modula um </span><span style="color: black;">sinal digital</span><span style="color: black;"> em uma onda analógica, pronta a ser transmitida pela </span><span style="color: black;">linha telefônica</span><span style="color: black;">, e que demodula o </span><span style="color: black;">sinal analógico</span><span style="color: black;"> e o reconverte para o formato </span><span class="mw-redirect" style="color: black;">digital</span><span style="color: black;"> original.</span><span style="color: black;"> Utilizado para </span><span style="color: black;">conexão</span><span style="color: black;"> à </span><span style="color: black;">Internet</span><span style="color: black;">, </span><span class="mw-redirect" style="color: black;">BBS</span><span style="color: black;">, ou a outro </span><span style="color: black;">computador</span><span style="color: black;">.</span> </div>
<div style="color: black; text-align: justify;">
O processo de conversão de sinais binários para analógicos é chamado de modulação/conversão digital-analógico. Quando o sinal é recebido, um outro modem reverte o processo (chamado demodulação). Ambos os modems devem estar trabalhando de acordo com os mesmos padrões, que especificam, entre outras coisas, a velocidade de transmissão (bps, baud, nível e algoritmo de compressão de dados, protocolo, etc).</div>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
</div>
<div style="color: black; text-align: justify;">
Os primeiro modens analógicos eram externos. Conectados através das interfaces paralelas, onde a velocidade de transmissão eram de 300 bps (bits por segundo) e operavam em dois sinais diferentes, um tom alto que representava bit 1, enquanto o tom baixo representava o bit 0 (zero).</div>
<div style="color: black; text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: black;">fonte de consulta: </span><a href="http://pt.wikipedia.org/wiki/Modem" style="color: #3366ff;">http://pt.wikipedia.org/wiki/Modem</a></div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com1tag:blogger.com,1999:blog-4122014865825048770.post-71174363710423481282010-02-09T13:48:00.000-03:002012-01-29T00:47:07.501-02:00Como economizar bateria de seu mp3 player<div style="text-align: justify;">
Todas as músicas em formato mp3 possuem uma taxa de bits (o bit-rate ou bitrate) que é o número de bits usados por segundo, para representar o conteúdo a ser exibido. Quanto maior for o bit-rate, maior será a qualidade, assim como o tamanho do arquivo. Geralmente possuem valores altos: 128kbps, 192kbps e podem ser constantes ou ficar alternando. Não pense que seu arquivo de mp3 está doido ao vê-lo mudar a taxa de bits ao ser executado no seu mp3 player. É porque ele não é constante.<br />
Podemos diminuir essa taxa de bits através de programas e reduzí-la para a taxa que são usadas em rádios: 64kbps. Além de ouvir a música belezinha, dá pra economizar bateria, porque o aparelho não precisa gastar tanto processamento quanto seria para processar uma de 128kbps por exemplo. E imagine todas as músicas do seu mp3 com uma taxa de 64kbps! Seria uma economia e tanto. Dá pra fazer aquela caminhada com o seu mp3 durante uns 3 dias sem precisar recarregar a bateria.<br />
<br />
Link para o programa conversor no Baixaki: <a href="http://www.baixaki.com.br/download/free-mp3-wma-converter.htm">http://www.baixaki.com.br/download/free-mp3-wma-converter.htm</a><br />
Se usar o Ubuntu, basta ir em aplicativos, central de programas do Ubuntu e digitar "converter áudio".<br />
É isso!</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com2tag:blogger.com,1999:blog-4122014865825048770.post-53700941716546053222010-02-05T15:46:00.000-03:002012-01-29T00:41:07.230-02:00Vírus no GNU/Linux?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb2RylvJvewjoXFrDIHFOs4lpsywHe2ne8R6nTmLnmGt80dr83yms9y-E6KaWTq3tPkkfn6DldWiICEkUvtEFzq-AbkfFwFvqproPwQpA0f6DoqOZzECWZY9e5WkujgKg3IobJunRLDSgY/s1600-h/Sem+t%C3%ADtulo.png"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5434832785797257762" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb2RylvJvewjoXFrDIHFOs4lpsywHe2ne8R6nTmLnmGt80dr83yms9y-E6KaWTq3tPkkfn6DldWiICEkUvtEFzq-AbkfFwFvqproPwQpA0f6DoqOZzECWZY9e5WkujgKg3IobJunRLDSgY/s400/Sem+t%C3%ADtulo.png" style="cursor: pointer; display: block; height: 245px; margin: 0px auto 10px; text-align: center; width: 327px;" /></a><br />
<div style="text-align: justify;">
Sempre comenta-se que o sistema baseado no Unix não pega vírus, como todas as distribuições GNU/Linux que temos hoje. Mas, por que motivo isso não acontece? Existem algumas pragas que tentaram infectar o GNU/Linux, mas o sistema de permissões de usuários e grupos impedem a proliferação em massa.<br />
<br />
Alguns anti-vírus, até existem, mas nem vale a pena. É como se fosse um simples alarme de possíveis ameaças.<br />
<br />
A grande fortaleza do sistema é uma organização de permissões de acessos, leitura e escrita para pastas e arquivos. É muito restrito e apenas o usuário administrador (root) tem o poder de alterar os arquivos de sistema. Portanto, para que uma praga digital dessa funcione, seria necessário logar a conta do administrador e permitir que ele rode. Ou então acessar a internet como administrador, o que é muito improvável no ambiente Unix. Por isso é altamente recomendável que a senha root seja usada o mínimo possível, seja para instalar programas ou alterar configurações de sistema, sempre fazendo backups, porque qualquer alteração indesejada ou por engano, pode ser fatal.<br />
E, como os arquivos dos usuários comuns ficam em uma pasta separada /home, possivelmente apenas esse diretório estaria afetado pelo vírus caso ele executasse algum código malicioso, e isso não afetaria todo o sistema.<br />
Por isso o sistema baseado no Unix é muito usado em servidores pelo alto poder de segurança que possui.</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com0tag:blogger.com,1999:blog-4122014865825048770.post-28171304052734809482010-01-28T01:55:00.000-03:002012-01-29T00:50:25.023-02:00Google!<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwgxXQGClICP7X1tJgbDBUR5MEKLFQB0lnxwQ3VsQr15_irBNff9urXGLP-rEIDWMlaU3rwf_H6gp0vvBTiiC2wWINnx3RcqliUoWpiZtSjHacSxblLfkpBwGy11WbPU8bz8vjcIA9k1jP/s1600-h/google.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5431651649559854338" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjwgxXQGClICP7X1tJgbDBUR5MEKLFQB0lnxwQ3VsQr15_irBNff9urXGLP-rEIDWMlaU3rwf_H6gp0vvBTiiC2wWINnx3RcqliUoWpiZtSjHacSxblLfkpBwGy11WbPU8bz8vjcIA9k1jP/s400/google.jpg" style="cursor: pointer; display: block; height: 146px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a><br />
<br />
<div style="text-align: justify;">
Há anos quando fazíamos pesquisas no google, sofríamos e não achava nada relacionado ao assunto. Isso por volta do ano 2000 mais ou menos quando o site de busca famoso era o cadê. De lá para cá o mundo da informática sofreu mudanças drásticas e uma evolução tremenda. Os esquipamentos ficaram mais poderosos e com mais capacidade de armazenamento. Os sites de buscam obtiveram vários novos métodos de busca, os chamados sniffers, que são os responsáveis em fuçar todos os sites da rede mundial de computadores para listar para o usuários todos aqueles relacionados com sua pesquisa. Hoje o poder do google fez com que esmagasse todos os demais sites de busca. Pensou em comprar algo, o google ajuda a escolher, está planejando uma viagem com a família o google lista todos os hotéis da cidade desejada, e por aí vai... porém, ao meu ver, no lado computacional, o google veio como duas mãos na roda, principalmente quando se trata de instalação de aplicativos e configurações, seja na plataforma windows, gnu/linux ou mac. Sempre há um tópico em algum fórum sobre o tema em que alguma pessoa já passou ou está passando por esse problema, que, na maioria das vezes vai te ajudar ou dar uma luz para chegar a uma possível solução. Isso graças ao poder de busca do google. O programa da impressora não funciona ou está com problema para instalar o driver, vai no google que ele te mostra onde possui a versão mais atual com correção de erros. É fantástico, chega você fica besta com a facilidade de uso! Com pouco tempo de uso de sistema Ubuntu, baseado no gnu/linux, já passei por alguns problemas para instalar drivers de webcam, rede sem fio etc.. os quais foram solucionados com pesquisas no google. Ele sempre me mostrou o caminho das pedras e consegui instalar tudo belezinha. Portanto, se tiver alguma dúvida e ainda não conseguiu solucionar, pergunta pra o google que ele responde, a fomosa googlada, mas, preste atenção na hora de buscar, porque é precisar saber algumas dicas antes de começar a pesquisar. Primeiro tenha em mãos o tipo de equipamento e a sua versão, ex.: impressora hp modelo f4200. Daí você usar assim no google para achar os drivers para essa impressora: hp f4200 + drivers. O '+' é como uma forma de combinar informações para conseguir exatamente o que deseja. É isso!<br />
Abraço a todos.</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com0tag:blogger.com,1999:blog-4122014865825048770.post-26790018903208791042009-11-16T22:30:00.000-03:002012-01-29T01:20:47.812-02:00Afinal, o que é barramento?<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifhGdVkCagmBLDlncOJZnwWdvEcT5b4vgjprrErrYhgfPHxI33Tyfiu3lWfuSD2h-AYNG6AcSqoE4EAGvY1CDrRt5N_JxtLLJACq2yfj7Cyj-qlYPcqYZ-wXqWHBgjC_O0i1Ng6BiEXTnJ/s1600/f_BarramentoSm_7f30622.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5404882429935725554" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEifhGdVkCagmBLDlncOJZnwWdvEcT5b4vgjprrErrYhgfPHxI33Tyfiu3lWfuSD2h-AYNG6AcSqoE4EAGvY1CDrRt5N_JxtLLJACq2yfj7Cyj-qlYPcqYZ-wXqWHBgjC_O0i1Ng6BiEXTnJ/s400/f_BarramentoSm_7f30622.jpg" style="cursor: pointer; display: block; height: 230px; margin: 0px auto 10px; text-align: center; width: 400px;" /></a><br />
<div style="text-align: justify;">
Estava conversando com um amigo esses dias e eu mostrando para ele se um computador que estava sendo anunciado prestava. Daí ele começou a falar sobre as características do PC usando uns termos sobre computador que muitas vezes acaba que passando despercebido. Fiquei curioso, porque com certeza absoluta não vamos aprender tudo, sobre o que estudamos, na faculdade. Ela serve também como um eixo norteador para que facilite o aprendizado e mostre o caminho das pedras como diz um grande amigo. Mas, voltando, fiquei curioso porque eu sei o que é, mas não sei explicar corretamente. Resolvi pesquisar e mostrar aqui no blog o significado dessa estrutura de nosso computadores que influi diretamente no tráfego dos dados, logo, na velocidade e desempenho do nosso bicho eletrônico: O barramento.<br />
Segundo a wikipedia é: é um conjunto de linhas de comunicação que permitem a interligação entre dispositivos, como a <a class="mw-redirect" href="http://pt.wikipedia.org/wiki/Unidade_Central_de_Processamento" title="Unidade Central de Processamento">CPU</a>, a <a href="http://pt.wikipedia.org/wiki/Mem%C3%B3ria_%28computador%29" title="Memória (computador)">memória</a> e outros <a href="http://pt.wikipedia.org/wiki/Perif%C3%A9rico" title="Periférico">periféricos</a>. Esses fios estão divididos em três conjuntos: </div>
<ul style="text-align: justify;">
<li>via de dados: onde trafegam os dados;</li>
<li>via de endereços: onde trafegam os endereços;</li>
<li>via de controle: sinais de controle que sincronizam as duas anteriores.</li>
</ul>
<div style="text-align: justify;">
</div>
<div style="text-align: justify;">
O desempenho do barramento é medido pela sua largura de banda (quantidade de bits que podem ser transmitidos ao mesmo tempo), geralmente potências de 2:</div>
<div style="text-align: justify;">
</div>
<ul style="text-align: justify;">
<li><a href="http://pt.wikipedia.org/wiki/8_bit" title="8 bit">8 bits</a>, <a href="http://pt.wikipedia.org/wiki/16_bit" title="16 bit">16 bits</a>, <a href="http://pt.wikipedia.org/wiki/32_bit" title="32 bit">32 bits</a>, <a class="mw-redirect" href="http://pt.wikipedia.org/wiki/64_bits" title="64 bits">64 bits</a>, etc.</li>
</ul>
<div style="text-align: justify;">
Basicamente é entendido como a quantidade de dados que podem ser lidos / transmitidos entre os componentes do computador. Então, quanto maior a largura da banda, mais rapidamente os dados serão transportados e comunicados entre o processador, memória e demais periféricos. Possibilitando mais rapidez. Por exemplo o<span class="mw-headline" id="Barramento_de_mem.C3.B3ria"> Barramento de memória</span>:</div>
<div style="text-align: justify;">
<span style="font-style: italic;">É</span> responsável pela conexão da <a class="mw-redirect" href="http://pt.wikipedia.org/wiki/Mem%C3%B3ria_principal" title="Memória principal">memória principal</a> ao <a href="http://pt.wikipedia.org/wiki/Processador" title="Processador">processador</a>. É um barramento de alta velocidade que varia de micro para micro e atualmente gira em torno de 533MHz a 2000MHz, como nas DDR3.</div>
<div style="text-align: justify;">
Portanto, maior atenção na hora de comprar um PC, é bom olhar as características antes de comprar aquele pc com o preço bom demais.. se bem que, hoje, tudo barateia com muita rapidez, mas é bom dar uma conferida!</div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com3tag:blogger.com,1999:blog-4122014865825048770.post-79762993149265789322009-09-17T20:07:00.000-03:002012-01-29T01:21:14.816-02:00Rode programas do windows no seu GNU/linux<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIBYvAhIBAf9W1H7GoXOmlPLqBEHkiEJcpcqu8mtBk9EKrRPi_lqt4c8KwpU_SDxDNtSj28uBCSJgk-pCZuyD99btxpl_4aWCDXf44JstlGzjol7vMKI13enDNSY47nEUpACI1fbAoNxLg/s1600-h/imagem_wine.jpg"><img alt="" border="0" id="BLOGGER_PHOTO_ID_5382578150760467554" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIBYvAhIBAf9W1H7GoXOmlPLqBEHkiEJcpcqu8mtBk9EKrRPi_lqt4c8KwpU_SDxDNtSj28uBCSJgk-pCZuyD99btxpl_4aWCDXf44JstlGzjol7vMKI13enDNSY47nEUpACI1fbAoNxLg/s400/imagem_wine.jpg" style="cursor: pointer; display: block; height: 259px; margin: 0px auto 10px; text-align: center; width: 255px;" /></a><br />
<div style="text-align: justify;">
Para quem acabou de migrar para o sistema GNU/Linux e ainda prefere usar alguns aplicativos que são exclusivos do Windows, há uma ferramenta de código aberto que simula o sistema da Microsoft para você rodar seus programas. Basta digitar no terminal: <strong><em><span style="color: #3333ff;">sudo aptitude install wine</span></em></strong> ,<br />
e pronto, você vai ter um simulador de Windows no seu Pc.<br />
Depois disso, basta você fazer o download do programa e salvar em qualquer pasta, depois, pelo terminal de comando, você entra no diretório ao qual o programa pertence e digita: wine <nome_do_programa>nome_do_programa . Fácil, não?!</nome_do_programa><br />
<nome_do_programa>Pronto, agora você já pode usá-lo normalmente como se estivesse no Windows.</nome_do_programa><br />
<nome_do_programa></nome_do_programa><br />
<nome_do_programa>Pode conferir mais sobre o wine aqui: <a href="http://www.winehq.org/">http://www.winehq.org/</a></nome_do_programa><br />
<nome_do_programa></nome_do_programa></div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com1tag:blogger.com,1999:blog-4122014865825048770.post-8999591415546156672009-09-08T20:51:00.000-03:002012-01-29T00:42:08.293-02:00É totalmente livre?<u><strong><em>Retirado de: <a href="http://www.guiadohardware.net/artigos/gnewsense/">http://www.guiadohardware.net/artigos/gnewsense/</a><br />Enter gNewSense - the free Ubuntu</em></strong></u><em><br />Autor original: <strong>Benedikt Ahrens</strong><br />Publicado originalmente no: </em><a href="http://www.freesoftwaremagazine.com/columns/gnewsense_the_free_ubuntu"><em>freesoftwaremagazine.com</em></a><br />
<em> Tradução: Roberto Bechtlufft</em><br />
<br />
<table align="right" border="0" cellpadding="1" cellspacing="1" style="width: 110px;" summary=""> <tbody>
<tr> <td><a href="http://distrowatch.com/table.php?distribution=gnewsense"><br /></a></td> </tr>
</tbody> </table>
<div align="justify">
O projeto gNewSense tem o objetivo de criar uma distribuição GNU/Linux que tenha como prioridade principal a liberdade do usuário — ainda que isso limite seu conforto e o suporte a hardware. O sistema operacional Ubuntu é usado como ponto de partida.<br />
<br />
<h3>
Sobre o Debian e o Ubuntu</h3>
<br />
Um Ubuntu livre? O Ubuntu já não é livre? Não, o <a href="http://www.ubuntu.com/">Ubuntu</a> não é livre. Ao menos de acordo com as diretrizes da <a href="http://www.fsf.org/">FSF</a> (Free Software Foundation) que definem se um sistema operacional é ou não livre, e que podem ser encontradas <a href="http://www.gnu.org/philosophy/free-system-distribution-guidelines.html">aqui</a> — e o mesmo vale para o Debian, que forma a base do Ubuntu. O objetivo dessas distribuições é dar suporte à maior quantidade possível de hardware, para que o usuário passe por uma instalação fácil e confortável — afinal, o objetivo dessas distribuições é conquistar uma fatia do mercado. Por vezes, os princípios do software livre são negligenciados no processo. Essa atitude menos rígida com relação à liberdade também pode ser encontrada em todas as áreas da produção de software, do kernel do Linux à distribuição de software pelo Debian e pelo Ubuntu (observação: cabe ao leitor deduzir se as afirmações feitas aqui também se aplicam a outras distribuições como o SUSE, por exemplo; aqui o autor trata exclusivamente do Debian e do Ubuntu).<br />
<br />
<h4>
O kernel do Linux</h4>
<br />
A maioria dos componentes de um computador, como as unidades de CD, discos rígidos, placas de rede e afins, exigem um software mantido em um módulo de memória do próprio componente com o objetivo de estabelecer sua comunicação com a placa-mãe. Esse software é conhecido como firmware. Na maioria dos casos, o firmware é instalado de forma permanente no componente. Já em outros casos, principalmente em placas de rede, o firmware é copiado para o componente pelo driver (ou seja, pelo módulo do kernel) quando o módulo é carregado.<br />
Para proporcionar uma experiência mais confortável ao usuário, o firmware de alguns componentes (como por exemplo os firmwares das placas de rede Broadcom que são executados pelo driver "tg3") vem integrado ao kernel do Linux. Isso parece razoável, já que muitas vezes os componentes não funcionam sem os seus respectivos firmwares. Mas infelizmente a maioria dos firmwares não está de acordo com os critérios do software livre, já que os fabricantes não liberam o código fonte. Vou usar o driver "tg3" como exemplo. Embora o driver seja livre e licenciado pela GPL, ele usa <a href="http://www.broadcom.com/support/ethernet_nic/driver-sla.php?driver=570x-Linux">firmware que não é livre</a>. Eis um trecho do código fonte:<br />
<pre><div class="rawoutput">
/*<br />
* tg3.c: Broadcom Tigon3 ethernet driver.<br />
*<br />
* Copyright (C) 2001, 2002, 2003, 2004 David S. Miller (davem@redhat.com)<br />
* Copyright (C) 2001, 2002, 2003 Jeff Garzik (jgarzik@pobox.com)<br />
* Copyright (C) 2004 Sun Microsystems Inc.<br />
* Copyright (C) 2005-2007 Broadcom Corporation.<br />
*<br />
* Firmware is:<br />
* Derived from proprietary unpublished source code,<br />
* Copyright (C) 2000-2003 Broadcom Corporation.<br />
*<br />
* Permission is hereby granted for the distribution of this firmware<br />
* data in hexadecimal or equivalent format, provided this copyright<br />
* notice is accompanying it.<br />
*/</div>
</pre>
<br />
Ou seja, informações sobre direitos autoriais e anunciando que o firmware é derivado de código fonte proprietário não divulgado. Software derivado de software proprietário não é livre. O módulo tg3 e seu firmware são parte do <a href="http://www.kernel.org/">kernel original</a>.<br />
<br />
<h4>
As distribuições</h4>
<br />
Com as distribuições lidam com o kernel oficial do Linux? O projeto Debian é baseado em um <a href="http://www.debian.org/social_contract">contrato social</a> que inclui <a href="http://www.debian.org/social_contract#guidelines">diretivas para o software distribuído pelo Debian</a>. Houve uma <a href="http://www.debian.org/vote/2006/vote_007.en.html">votação em 2006</a> quanto à presença de software não livre no kernel do Linux, e o resultado foi sua aprovação. A ideia central é a de que a usabilidade do software é mais importante do que a conformidade com o contrato social e com a liberdade do usuário.<br />
Mas as distribuições não estão apenas distribuindo software não livre com o kernel do Linux. O pacote "linux-firmware" do Ubuntu é parte da seção "main", ou seja, da seção que (de acordo com o Ubuntu) supostamente contém apenas software livre. Só que o pacote <a href="https://bugs.launchpad.net/~gnewsense">contém firmware que não é livre</a>.<br />
Outro exemplo: por anos o Debian e o Ubuntu ignoraram o fato de que o X.org continha software não livre (<a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=211765">o relatório de bugs do Debian</a>, <a href="http://www.debian.org/vote/2004/vote_002">a pesquisa de opinião dos desenvolvedores do Debian quanto ao tratamento dado ao software não livre</a> e, <a href="http://www.debian.org/vote/2006/vote_007">mais uma vez</a>, <a href="https://bugs.launchpad.net/debian/+bug/6765/comments/8">o relatório de bugs do Ubuntu, que foi copiado do Debian</a>). Software não livre foi deliberadamente mantido na seção "main" para não restringir o conforto e a usabilidade do sistema operacional.<br />
Graças a uma nova licença criada para o software em questão o problema <a href="http://www.fsf.org/news/thank-you-sgi">foi resolvido por enquanto</a>.<br />
Além disso, o Debian e o Ubuntu facilitam a instalação de software não livre, como por exemplo ao oferecer os repositórios "contrib" e "non-free" (Debian) ou "restricted" e "multiverse" (Ubuntu), bem como uma interface gráfica para a instalação de drivers proprietários para placas de vídeos, WLAN etc. (no GNOME do Ubuntu, em "Sistema-> Administração"). Os navegadores instalados por padrão, Iceweasel (Debian) e Firefox (Ubuntu), também oferecem a possibilidade de instalar plugins não livres.<br />
<br />
<br />
<h3>
<a href="http://distrowatch.com/table.php?distribution=gnewsense"><img alt="logo" height="74" src="http://www.guiadohardware.net/imagens/img-39aa425c.png" width="90" /></a></h3>
<br />
<h4>
A ideia</h4>
<br />
O <a href="http://www.gnewsense.org/">projeto gNewSense</a> tem por objetivo a criação de uma distribuição GNU/Linux que tenha como prioridade a liberdade do usuário, mesmo que isso limite o conforto e o suporte a hardware. As bases de ação da distribuição são as <a href="http://www.gnu.org/philosophy/free-system-distribution-guidelines.html">diretivas da FSF para sistemas operacionais livres</a>. A citação obtida do <a href="http://www.gnewsense.org/Main/Features">site oficial do gNewSense</a> descreve seu objetivo: "Observe que nosso objetivo é produzir uma distribuição totalmente livre, e não abrigar a maior quantidade possível de recursos". Na prática, isso significa que o gNewSense pretende 1. distribuir apenas software que seja livre de acordo com a definição da FSF e 2. não facilitar a instalação de software não livre. Esses dois objetivos precisam de um breve esclarecimento: quanto ao ponto 1, é difícil garantir que qualquer coleção não trivial de software seja 100% gratuita, ou seja, que cada arquivo fonte tenha sua licença verificada. Mas o gNewSense remove imediatamente qualquer software de sua lista se for descoberto que o mesmo não é livre, mesmo que isso leve a grandes limitações (<a href="http://wiki.gnewsense.org/Main/Broken3dApps">como acontece com o software não livre do X.org, mencionado anteriormente</a>). Quanto ao ponto 2, obviamente o usuário continua livre para instalar software não livre. Só que o gNewSense não oferece nenhuma ajuda nesse sentido ao usuário, como por exemplo, fornecendo um software ou as instruções necessárias para a instalação de software não livre.<br />
<br />
<h4>
A implementação</h4>
<br />
Para esse fim, os fundadores Brian Brazil e Paul O’Malley escreveram um grupo de scripts, conhecido como "Builder" (compilador), que remove os elementos não livres do Ubuntu. Qualquer usuário pode usar o Builder para fazer sua própria distribuição GNU/Linux. Um caso especial interessante é a distribuição que já é oferecida pronta e que traz o mesmo nome do projeto, gNewSense. Há uma <a href="http://www.gnewsense.org/Mirrors/Mirrors">imagem de live-CD disponível</a>. A versão atual do gNewSense (2.1) é baseada no Ubuntu 8.04.1 e por isso oferece um visual e um estilo quase idêntico, como você pode ver nestas <a href="http://wiki.gnewsense.org/Screenshots/Screenshots">fotos</a>. O modo live permite testar o hardware, o que é muito importante, já que a remoção de drivers não livres faz com que alguns componentes de hardware suportados pelo Ubuntu não funcionem (veja abaixo). A instalação no disco rígido pode ser iniciada pelo modo live. Instruções e tutoriais de instalação e administração do sistema podem ser encontradas no <a href="http://wiki.gnewsense.org/">wiki do gNS</a>.<br />
<br />
<h4>
Quais são as limitações do gNewSense?</h4>
<br />
Levando-se em conta as explicações acima, não é de se surpreender que o uso do gNewSense seja mais restrito que o do Ubuntu. A falta de suporte a muitas placas de WLAN, a falta de suporte a GLX e a falta do Firefox não tornam o gNewSense muito atraente para os usuários. Para evitar a decepção, é fortemente recomendável ler sobre o hardware suportado e o software fornecido antes da instalação. Para isso, inicie o gNewSense no modo live, pelo CD. Essa é uma maneira isenta de riscos de testar os gráficos, o som, as placas de rede e afins. Como a remoção de firmware não livre do kernel é automática, não há uma lista precisa de componentes suportados pelo Ubuntu que não sejam suportados pelo gNewSense. Um bom ponto de partida para quem quiser saber sobre o hardware suportado é a <a href="http://www.fsf.org/resources/hw">página da FSF</a>. Para maiores informações, visite o <a href="http://wiki.gnewsense.org/index.php?n=ForumMain.ForumMain">fórum do gNewSense</a> ou poste sua dúvida na <a href="http://www.gnewsense.org/index.php?n=Community.Community">lista de discussão</a>. As placas WLAN e várias placas LAN e de vídeo para as quais não há drivers livres geralmente não são suportadas. Em comparação com o Ubuntu, faltam também os repositórios "restricted" e "multiverse", obviamente, mas a seção "universe" vem <a href="http://www.gnewsense.org/Main/Features">ativada por padrão</a>.<br />
<br />
<h4>
E por que usar o gNewSense?</h4>
<br />
O gNewSense é um dos sistemas operacionais classificados como livres pela FSF e é <a href="http://www.gnu.org/links/links.html#FreeGNULinuxDistributions">suportado ativamente por ela</a>. O projeto GNU oferece uma versão modificada do Firefox para o sistema operacional, chamada de <a href="http://www.gnu.org/software/gnuzilla/">Icecat</a>, que pode ser instalada facilmente pelo sistema de gerenciamento de pacotes. Diferente do Firefox e de outras versões dele, o Icecat oferece-se para instalar plugins livres e inclui alguns recursos de segurança que não estão presentes no Firefox. Alguns dos componentes não suportados pelo gNewSense podem ser suportados no fim das contas através da instalação de um novo kernel do <a href="http://www.fsfla.org/svnwiki/selibe/linux-libre/index">projeto Linux Libre</a> — <a href="http://aligunduz.org/">Ali Gunduz</a> oferece <a href="http://aligunduz.org/gNewSense/">pacotes compilados para o Debian</a>. A versão atual, o kernel 2.6.28-libre, por exemplo, permite o uso do módulo tg3 sem o firmware não livre. Além disso, algumas placas WLAN da Atheros são suportadas pelos módulos atk5 e atk8 (incluídos no kernel 2.6.28).<br />
Para quem não sabe, gNewSense é uma distribuição GNU/Linux grátis. Ela e outras podem ser encontradas em: <a href="http://www.gnu.org/">www.gnu.org </a><br />
<h3>
Conclusão</h3>
<br />
Usando o gNewSense, você pode mostrar que a liberdade do software que você usa é realmente importante para você. Assim os fabricantes de hardware podem ser motivados a fornecer drivers e firmware livres para seus produtos e de quebra trazer transparência e inovação a essa área da produção de software. Para completar, você ainda pode mostrar aos projetos que originaram o gNewSense (Debian e Ubuntu) que você quer se manter fiel aos princípios e contratos de maneira consistente, e que não está satisfeito com exceções fajut</div>
<br />
Créditos a <em>Benedikt Ahrens</em> - <a href="http://www.freesoftwaremagazine.com/columns/gnewsense_the_free_ubuntu"><em>freesoftwaremagazine.com</em></a><br />
Tradução por <em>Roberto Bechtlufft <roberto><br /></roberto></em><br />
<div class="warn">
<strong>Comente</strong>: <a href="http://www.guiadohardware.net/comunidade/gnewsense-ubuntu/970536/">http://www.guiadohardware.net/comunidade/gnewsense-ubuntu/970536/</a></div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com2tag:blogger.com,1999:blog-4122014865825048770.post-51400092691839435502009-08-21T16:05:00.000-03:002009-08-21T16:10:56.887-03:00Tropa de Elite Multiplayer<h2>Descrição</h2> <div id="HOTWordsTxt" name="HOTWordsTxt"> <p>O jogo <strong>Tropa de Elite Multiplayer </strong>não surgiu antes da hora, nem está sendo circulado ilegalmente. Com características ligadas aos líderes do gênero FPS "(Counter-Strike, Battlefield e Doom 3), a versão Beta deste fenômeno nacional prova que chegou para ficar — e não vai pedir pra sair tão cedo.</p><p>Por enquanto, há um único mapa disponível no Jogo. O cenário é favela, pichada com as tags das duas facções terroristas mais perigosas do Brasil (Primeiro Comando da Capital e Comando Vermelho), composta por ensanguentadas casas de madeira e acompanhada de uma trilha sonora que todo fã já sabe de cor e salteado: "Para pa pa pa pa pa para pa pá". Como insinua o próprio nome, Tropa de Elite Multiplayer foi especialmente desenvolvido para se jogar online (Na Internet).</p><div style="text-align: center;" align="center"><img src="http://www.ziggi.com.br/imagens_programas/screenshots/big_1229616890_15334.jpg" alt="" width="503" height="335" /></div> <h3>Vestindo a farda preta</h3><p>Ao conectar-se em algum server, que você pode tanto selecionar na lista quanto criar um seu próprio, o primeiro passo a ser dado é escolher se você prefere integrar ao BOPE ou participar do tráfico do morro. Ambas opções possuem quatro alternativas de skins, sendo que a sala comporta no máximo 8 jogadores de uma vez.</p><h3>Faca na caveira...</h3><p>É preciso ter muito sangue frio para brincar de capitão Nascimento. Enquanto os desenvolvedores do jogo Tropa de Elite Multiplayer ainda estão realizando alguns testes com o jogo, a única missão nesta chacina é intensificá-la cada vez mais, pegando prática e fazendo corpos adversários desabarem.</p><h3>...e nada na carteira</h3><p>Seguindo o estilo do Counter-Strike, principalmente quando se trata da fase "cs_rio", ambientada em morro carioca, a guerra aqui também é travada entre a lei e seus infratores. No entanto, não se acumula nem se perde <a href="http://www.ziggi.com.br/downloads/tropa-de-elite-multiplayer#" onclick="hwClick1332496770326(674527818);return false;" style="border-bottom: 1px dotted; color: rgb(0, 102, 0); text-decoration: underline;" onmouseover="hw1332496770326(event, this, '674527818'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe(event, this); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " oncontextmenu="return false;">dinheiro</a>; as armas, com bastantes variações, estão todas espalhadas pelo chão da fase (assim como suas munições). Já no CS você compra as Armas e Munições.</p><p>Na base traficante encontram-se, entre outras: rifle AK 47, pistola glock e 38. No lado da melhor polícia do Brasil: rifle Colt M4A1 Carabine, sniper e mais. Também estão presentes escopetas, metralhadoras automáticas como a <a href="http://www.ziggi.com.br/downloads/tropa-de-elite-multiplayer#" onclick="hwClick59987762326(674527818);return false;" style="border-bottom: 1px dotted; color: rgb(0, 102, 0); text-decoration: underline;" onmouseover="hw59987762326(event, this, '674527818'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe(event, this); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " oncontextmenu="return false;">MP5</a> e outros modelos — qualquer um pode ser utilizado por ambas as equipes, sem restrições.</p><div style="text-align: center;" align="center"><img src="http://www.ziggi.com.br/imagens_programas/screenshots/big_1229616914_15334.jpg" alt="" width="504" height="336" /></div> <h3>Osso duro de roer</h3><p>Em média, independemente da arma utilizada, o adversário precisa levar três tiros para morrer. E não há diferença entre acertar a perna, o tronco e a cabeça. Portanto não tente aprimorar sua técnica do "headshot", pois vai ser inútil; o mais recomendável é mirar no peito da vítima. Ao morrer, instantaneamente você volta à sua base. Durante poucos segundos, seu corpo fica transparente e inatingível.</p><h3>Comandos</h3><ul><li><strong>W</strong>: frente.</li><li><strong>S</strong>: trás.</li><li><strong>A/Q</strong>: esquerda.</li><li><strong>D/E</strong>: direita.</li><li><strong>C</strong>: agachar.</li><li><strong>T</strong>: <a href="http://www.ziggi.com.br/downloads/tropa-de-elite-multiplayer#" onclick="hwClick20271000731326(674527818);return false;" style="border-bottom: 1px dotted; color: rgb(0, 102, 0); text-decoration: underline;" onmouseover="hw20271000731326(event, this, '674527818'); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='solid';" onmouseout="hideMaybe(event, this); this.style.cursor='hand'; this.style.textDecoration='underline'; this.style.borderBottom='dotted 1px'; " oncontextmenu="return false;">conversar</a> (chat).</li><li><strong>Barra de espaço</strong>: pular.</li><li><strong>Esc</strong>: menu.</li><li><em>Você também pode optar pelas setas direcionais para realizar a movimentação do personagem.</em></li></ul><h3>Mouse</h3><ul><li>Mexer o mouse - Olhar/virar;</li><li>Botão esquerdo - Atirar;</li><li>Botão direito - Acionar função especial da arma (caso tenha; por ex.: mira sniper).</li></ul><h6><em>Descrição: site do fabricante.</em></h6>http://www.ziggi.com.br/downloads/tropa-de-elite-multiplayer<br /><br /> </div>Bruno Sampaio Pinhohttp://www.blogger.com/profile/14907042289332503956noreply@blogger.com2