<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>coding &#187; linux</title>
	<atom:link href="http://www.coding.com.br/tag/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coding.com.br</link>
	<description>have you coded today?</description>
	<lastBuildDate>Fri, 23 Jul 2010 02:37:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Licenças para módulos no Linux</title>
		<link>http://www.coding.com.br/kernel/licencas-para-modulos-no-linux/</link>
		<comments>http://www.coding.com.br/kernel/licencas-para-modulos-no-linux/#comments</comments>
		<pubDate>Sun, 13 Jun 2010 03:29:29 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[kernel]]></category>
		<category><![CDATA[gpl]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=1083</guid>
		<description><![CDATA[O arquivo /usr/src/linux/include/linux/module.h define as licenças aceitáveis para um módulo (ou driver) seja reconhecido como software livre.

GPL - GNU Public License v2 or later
GPL v2 - GNU Public License v2
GPL and additional rights - GNU Public License v2 rights and more
Dual BSD/GPL - GNU Public License v2  or BSD license choice
Dual MIT/GPL - GNU Public License v2 or MIT license choice
Dual MPL/GPL [...]]]></description>
			<content:encoded><![CDATA[<p>O arquivo <em>/usr/src/linux/include/linux/module.h</em> define as licenças aceitáveis para um módulo (ou <em>driver</em>) seja reconhecido como software livre.</p>
<ul>
<li><strong>GPL</strong> - <em>GNU Public License v2 or later</em></li>
<li><strong>GPL v2</strong> - <em>GNU Public License v2</em></li>
<li><strong>GPL and additional rights</strong> - <em>GNU Public License v2 rights and more</em></li>
<li><strong>Dual BSD/GPL</strong> - <em>GNU Public License v2  or BSD license choice</em></li>
<li><strong>Dual MIT/GPL</strong> - <em>GNU Public License v2 or MIT license choice</em></li>
<li><strong>Dual MPL/GPL</strong> -<em> GNU Public License v2 or Mozilla license choice</em></li>
</ul>
<div id="_mcePaste">Também há um espaço (infelizmente) para licenças proprietárias:</div>
<div>
<ul>
<li><strong>Proprietary <em>- </em></strong><em>Non free products<br />
</em></li>
</ul>
</div>
<p>Como vocês podem notar, há componentes que podem ser definidos com licenças duplas, contudo quando executado no Linux apenas a GPL é relevante. Algumas razões para definir a licença:</p>
<ol>
<li><span id="result_box" class="short_text"><span>O </span><em>modinfo</em><span> pode  mostrar informações para usuários que desejam avaliar as licenças dos módulos sua instalação.</span></span></li>
<li><span id="result_box" class="short_text"><span><span id="result_box" class="short_text">A comunidade  pode ignorar relatórios de <em>bugs</em> dos módulos proprietários.</span></span></span></li>
<li><span id="result_box" class="short_text"><span><span id="result_box" class="short_text">Os fabricantes podem fazer o mesmo com suas próprias políticas.</span></span></span></li>
</ol>
<p>Para inserir a licença, basta colocar no seu código-fonte a macro  &#8221;MODULE_LICENCE&#8221;. Exemplo:</p>
<pre>  MODULE_LICENCE("GPL");</pre>
<p>Lembre-se que alguns recursos do <em>kernel</em> são disponíveis apenas se seu código é livre.</p>
<p>Um exemplo é o <strong>sysfs</strong> (através da macro EXPORT_SYMBOL_GPL) que por questões de manutenção e consistência exige que você licencie seu módulo em alguma licença compatível com a GPL.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/kernel/licencas-para-modulos-no-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Calourada Livre 2010</title>
		<link>http://www.coding.com.br/unifei/calourada-livre-2010/</link>
		<comments>http://www.coding.com.br/unifei/calourada-livre-2010/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 22:39:30 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[unifei]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[software livre]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=775</guid>
		<description><![CDATA[Este ano pensei minha apresentação no Calourada Livre como uma série de &#8220;dicas&#8221; para os bixos aprenderem sobre Software Livre ainda na graduação, associando quando possível as matérias oferecidas no curso.
 
Slides: http://www.slideshare.net/maluta/calourada2010
:wq
]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Este ano pensei minha apresentação no Calourada Livre como uma série de &#8220;dicas&#8221; para os bixos aprenderem sobre Software Livre ainda na graduação, associando quando possível as matérias oferecidas no curso.</p>
<p style="text-align: justify;"><em> </em></p>
<p style="text-align: center;">Slides: <a title="Slides da minha apresentação no Calourada Livre realizado esta semana na Universidade Federal de Itajubá." href="http://www.slideshare.net/maluta/calourada2010" target="_blank">http://www.slideshare.net/maluta/calourada2010</a></p>
<p>:wq</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/unifei/calourada-livre-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ipconfig over usb ethernet</title>
		<link>http://www.coding.com.br/embarcado/ipconfig-over-usb-ethernet/</link>
		<comments>http://www.coding.com.br/embarcado/ipconfig-over-usb-ethernet/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 14:29:09 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[embarcado]]></category>
		<category><![CDATA[beagleboard]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[usb]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=683</guid>
		<description><![CDATA[I guess this post apply only if you are using Linux v.2.6.33-rc3 or above.
You would have noted that kernel IP auto-configuration is not usable for some USB-Ethenet dongles on newer kernel because it starts before the USB devices are found. This was already discussed on LKML.  I proposed a workaround adding a section on menuconfig [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: right;"><em>I guess this post apply only if you are using Linux v.2.6.33-rc3 or above.</em></p>
<p style="text-align: justify;">You would have noted that kernel IP auto-configuration is not usable for some USB-Ethenet dongles on newer kernel because it starts before the USB devices are found. This was already discussed on LKML.  I proposed a workaround adding a section on menuconfig to user increase delay (<a href="http://lkml.org/lkml/2010/2/9/420" target="_blank">patch</a>) but other developer proposed another <a href="http://marc.info/?l=linux-netdev&amp;m=126311212608318&amp;w=2" target="_blank">patch</a> to configure this delay at runtime rather than at compile time. This patches weren&#8217; t  applied to mainline (to further information check link). I decided post here because I take some time to configure my NFS  rootfs due this delay. My tests were made using BeagleBoard and USB-Ethernet dongle based on ASIX 8877x.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/embarcado/ipconfig-over-usb-ethernet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adicionando SSH Fingerprints automaticamente ao known_hosts</title>
		<link>http://www.coding.com.br/sysadmin/adicionando-ssh-fingerprints-automaticamente-ao-known_hosts/</link>
		<comments>http://www.coding.com.br/sysadmin/adicionando-ssh-fingerprints-automaticamente-ao-known_hosts/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 11:00:06 +0000</pubDate>
		<dc:creator>Celso Fernandes</dc:creator>
				<category><![CDATA[sysadmin]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ssh]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=555</guid>
		<description><![CDATA[Olá,
Da mesma série de posts sobre automatização de configurações da pasta do usuário (nossa, pra quem não postava, já esta até fazendo série de posts heheh). Iremos abordar uma configuração que muitas vezes nos trás muita dor de cabeça, aceitar todos fingerprints de chaves de servidor ssh.
Eu costumo utilizar o $HOME/.ssh/config para deixar todos meus [...]]]></description>
			<content:encoded><![CDATA[<p>Olá,<br />
Da mesma série de posts sobre automatização de configurações da pasta do usuário (nossa, pra quem não postava, já esta até fazendo série de posts heheh). Iremos abordar uma configuração que muitas vezes nos trás muita dor de cabeça, aceitar todos fingerprints de chaves de servidor ssh.</p>
<p>Eu costumo utilizar o $HOME/.ssh/config para deixar todos meus hosts ssh configurados, pra quem não conhece isso, basta criar este arquivo, e ele usa o seguinte formato:</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;">Host <span style="color: #339933;">&lt;</span>nome servidor<span style="color: #339933;">&gt;</span>
HostName <span style="color: #339933;">&lt;</span>host<span style="color: #339933;">/</span>ip<span style="color: #339933;">&gt;</span>
User <span style="color: #339933;">&lt;</span>usuário<span style="color: #339933;">&gt;</span></pre></div></div>

<p>realizando a configuração de um servidor fictício:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">Host servidor
HostName localhost
User root</pre></div></div>

<p>Feito isto, basta digitar: ssh servidor, que seria o equivalente a ssh root@localhost, isto facilita quando não se tem acesso ao /etc/hosts para guardar nome amigável para determinados ips, e quando se acessa diferentes servidores com diferentes nomes de usuários. Voltando ao nosso problema, eu tenho meu config, mas meu known_hosts esta desatualizado ou pior, vazio!</p>
<p>A cada nova conexão seria necessário aceitar cada chave do servidor, como a seguir:</p>
<blockquote><p>The authenticity of host &#8217;servidor (127.0.0.1)&#8217; can&#8217;t be established.<br />
RSA key fingerprint is bc:b1:8d:c3:61:6a:5b:9f:c1:b2:16:c5:e4:d2:b1:b2.<br />
Are you sure you want to continue connecting (yes/no)?</p></blockquote>
<p>O que torna cansativo, principalmente se tiver que executar um comando em cada servidor, então temos o seguinte script:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">KNOWN_HOSTS</span>=.<span style="color: #000000; font-weight: bold;">/</span>ssh_known_hosts
<span style="color: #007800;">SSH_ARGS</span>=<span style="color: #ff0000;">&quot;-o StrictHostKeyChecking=no -o UserKnownHostsFile=<span style="color: #007800;">$KNOWN_HOSTS</span>&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> host <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>config <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;^Host &quot;</span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-d</span><span style="color: #ff0000;">&quot; &quot;</span> -f2<span style="color: #000000; font-weight: bold;">`</span>; <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$host</span>;
    <span style="color: #c20cb9; font-weight: bold;">ssh</span> <span style="color: #007800;">$host</span> <span style="color: #007800;">$SSH_ARGS</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">''</span>;
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #007800;">cnt</span>=<span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">for</span> host <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>.ssh<span style="color: #000000; font-weight: bold;">/</span>config <span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">&quot;^Host &quot;</span><span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">cut</span> <span style="color: #660033;">-d</span><span style="color: #ff0000;">&quot; &quot;</span> -f2<span style="color: #000000; font-weight: bold;">`</span>; <span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #007800;">linha1</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${cnt}</span>q;d&quot;</span> <span style="color: #007800;">$KNOWN_HOSTS</span><span style="color: #000000; font-weight: bold;">`</span>
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$linha1</span> <span style="color: #007800;">$host</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #800000;">${KNOWN_HOSTS}</span>.tmp
    <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #000000; font-weight: bold;">&amp;</span>gt;<span style="color: #000000; font-weight: bold;">&amp;</span>gt; <span style="color: #800000;">${KNOWN_HOSTS}</span>.tmp
    <span style="color: #7a0874; font-weight: bold;">let</span> cnt++
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #800000;">${KNOWN_HOSTS}</span>.tmp <span style="color: #800000;">${KNOWN_HOSTS}</span></pre></div></div>

<p>O que este script faz, nada mais é do que ler cada Host configurado no arquivo <em>$HOME/.ssh/config</em> e aceitar automaticamente a chave primária do mesmo através da <em>opção -o StrictHostKeyChecking=no</em> e salva no arquivo <em>-o UserKnownHostsFile=$KNOWN_HOSTS</em> (no nosso caso KNOWN_HOSTS=./ssh_known_hosts), fiz isso para não sobrescrever o seu arquivo <em>known_hosts</em> e ainda para facilitar a leitura do arquivo, ou pegar somente os hosts que lhe interessam, o segundo for do script coloca o valor do &#8216;Host&#8217; como comentário em cada fingerprint.</p>
<p>Vale a pena lembrar que cada chave será automaticamente aceita, então cabe a você garantir que realmente cada chave pertence ao servidor em questão, e não esta ocorrendo nenhum tipo de ataque man-in-the-middle. E após executado o script, é só colocar os fingerprints no known_hosts e estamos prontos para conectar no servidor sem confirmação dos mesmos.</p>
<p>Até breve.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/sysadmin/adicionando-ssh-fingerprints-automaticamente-ao-known_hosts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kernel stats: horários dos commits</title>
		<link>http://www.coding.com.br/linux/kernel-stats-horarios-dos-commits/</link>
		<comments>http://www.coding.com.br/linux/kernel-stats-horarios-dos-commits/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 21:53:41 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[kernel]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=602</guid>
		<description><![CDATA[
Durante sua apresentação na Linux.conf.au 2010, o fundador do site LWN.net e contribuidor do kernel Jonathan Corbet demonstrou uma análise das contribuições no kernel Linux durante aproximadamente 1 ano (entre Dez 2008 e Jan 2010). Uma das conclusões é que 75% código é escrito por programadores pagos por empresas, lideram a lista: Red Hat (12%), [...]]]></description>
			<content:encoded><![CDATA[<p align="justify">
Durante sua apresentação na Linux.conf.au 2010, o fundador do site LWN.net e contribuidor do kernel Jonathan Corbet <a href="http://www.lca2010.org.nz/programme/schedule/view_talk/50141?day=wednesday">demonstrou</a> uma análise das contribuições no kernel Linux durante aproximadamente 1 ano (entre Dez 2008 e Jan 2010). Uma das conclusões é que 75% código é escrito por programadores pagos por empresas, lideram a lista: Red Hat (12%), Intel (8%), IBM e Novell (6% cada), Oracle (3%). </p>
<p><p align="justify">
Um dos pontos que a estatística não mostra é que &#8211; mesmo sendo empregado de grandes empresas &#8211; boa parte do trabalho é feita fora do horário &#8220;comercial&#8221;, se alguém observar as datas de todos os <em>commits</em> e organizá-los pela frequência em horas, você tem o seguinte resultado para diferentes <em>releases</em>.
</p>
<pre>
<strong>v2.6.33-rc7	</strong>	<strong>v2.6.32</strong>			  <strong>v2.6.24</strong>	

Hora	Commits		Hora	Commits		Hora	Commits
<strong>0	8069		0	7808		0	4745
1	7052		1	6800		1	4155
2	4715		2	4556		2	2835
3	2717		3	2601		3	1395</strong>
4	2236		4	2096		4	898
5	1426		5	1193		5	559
6	1299		6	1134		6	381
7	1933		7	1723		7	580
8	4108		8	3798		8	1445
9	6429		9	6003		9	2261
10	8550		10	7969		10	3027
11	10284		11	9640		11	3946
12	9191		12	8403		12	3313
13	11728		13	11024		13	4522
<strong>14	13127		14	12340		14	5052
15	14281		15	13295		15	5813
16	13685		16	12721		16	5212
17	11486		17	10793		17	5050</strong>
18	7938		18	7334		18	3335
19	7354		19	6933		19	2850
20	7460		20	6953		20	3161
21	8561		21	8138		21	3436
22	8953		22	8498		22	3872
23	7741		23	7335		23	3843
</pre>
<p>Comando utilizado para gerar esses dados:</p>
<blockquote><p>
git log v2.6.33 | grep ^Date: | perl -pe &#8217;s/^(?:\S+\s+){4}(\d+).*/$1/&#8217; | sort -g | uniq -c
</p></blockquote>
<p>A conclusão é que muitos desenvolvedores fazem o código durante a noite e acordam tarde. <img src='http://www.coding.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/linux/kernel-stats-horarios-dos-commits/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Convertendo videos do Youtube para audio (MP3)</title>
		<link>http://www.coding.com.br/gnu/convertendo-videos-do-youtube-para-audio-mp3/</link>
		<comments>http://www.coding.com.br/gnu/convertendo-videos-do-youtube-para-audio-mp3/#comments</comments>
		<pubDate>Sat, 16 Jan 2010 18:30:58 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[gnu]]></category>
		<category><![CDATA[lame]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[mplayer]]></category>
		<category><![CDATA[ogg]]></category>
		<category><![CDATA[youtube]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=487</guid>
		<description><![CDATA[Programas necessários:

Alguma distribuição GNU/Linux
mplayer
lame (caso queria converter para mp3)
vorbis-tools (caso queira converter para ogg)

Os videos do YouTube, normalmente qualquer conteúdo Flash, fica armazenados na pasta /tmp do sistema operacional na forma FlashXXXX (exemplo: FlashaOiW6k). Para cada arquivo flash existirá um arquivo correspondente, para descobrir de qual se trata utilize o mplayer, no console (cd /tmp):
mplayer FlashaOiW6k
Após [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">Programas necessários:</p>
<ul>
<li>Alguma distribuição GNU/Linux</li>
<li><a href="http://www.mplayerhq.hu" target="_blank">mplayer</a></li>
<li><a title="Lame project" href="http://lame.sourceforge.net" target="_blank">lame</a> (caso queria converter para mp3)</li>
<li><a href="http://www.vorbis.com " target="_blank">vorbis-tools</a> (caso queira converter para ogg)</li>
</ul>
<p style="text-align: justify;">Os videos do YouTube, normalmente qualquer conteúdo Flash, fica armazenados na pasta <strong>/tmp</strong> do sistema operacional na forma FlashXXXX (exemplo: FlashaOiW6k). Para cada arquivo flash existirá um arquivo correspondente, para descobrir de qual se trata utilize o mplayer, no console (cd /tmp):</p>
<pre style="text-align: justify;">mplayer FlashaOiW6k</pre>
<p style="text-align: justify;">Após descobrir o arquivo, vamos primeiro converter o arquivo para <strong>wav </strong>e depois para algum formato mais compacto.</p>
<pre>mplayer FlashaOiW6k<span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px; "> -novideo -ao pcm:file=musica.wav</span></pre>
<p><span style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 18px; font-size: 12px; white-space: pre; "><span style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; line-height: 19px; white-space: normal; font-size: 13px; ">Convertendo para <strong>mp3</strong>:</span></span></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 159px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">lame -V2 input.wav output.mp3</div>
<pre>lame -V2 musica.wav musica.mp3</pre>
<div></div>
<p>Ou <strong>ogg</strong>:</p>
<pre>oggenc musica.wav</pre>
<p>No final temos os seguintes tamanhos para cada arquivo, considerando uma música de 4 minutos.</p>
<ul>
<li>8.9M    FlashaOiW6k</li>
<li>21.0M    saida.wav</li>
<li>2.4M   saida.mp3</li>
<li>1.5M   saida.ogg</li>
</ul>
<p>Este procedimento provavelmente irá funcionar para qualquer conteúdo Flash (ex. outros sites de video) que fique armazenado na tmp.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/gnu/convertendo-videos-do-youtube-para-audio-mp3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Acionando os mantenedores</title>
		<link>http://www.coding.com.br/kernel/acionando-os-mantenedores/</link>
		<comments>http://www.coding.com.br/kernel/acionando-os-mantenedores/#comments</comments>
		<pubDate>Sun, 15 Nov 2009 23:41:26 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=420</guid>
		<description><![CDATA[Se você precisar entrar em contato com o mantendor de algum sub-sistema do kernel Linux mas não sabe onde procurar, utilize um script (get_maintainer.pl) incluído no próprio código. Um exemplo,  suponha que você utilize o sistema de arquivos ext4 e deseje sugerir alguma idéia. Se for um bug é recomendado utilizar a plataforma de submissão [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Se você precisar entrar em contato com o mantendor de algum sub-sistema do kernel <a href="http://www.kernel.org" target="_blank">Linux</a> mas não sabe onde procurar, utilize um <em>script</em> (get_maintainer.pl) incluído no próprio código. Um exemplo,  suponha que você utilize o sistema de arquivos <a href="http://ext4.wiki.kernel.org/index.php/Main_Page" target="_blank">ext4</a> e deseje sugerir alguma idéia. Se for um <em>bug</em> é recomendado utilizar a <a href="http://bugzilla.kernel.org/" target="_blank">plataforma</a> de submissão de bugs (bugzilla) que além de seguir uma metodologia para descrever o erro é uma forma de catalogar o problema. Estou considerando neste <em>post</em> que você ainda não é um desenvolvedor e quer achar o mantenedor pois gostaria de fazer uma sugestão ou comentário acerca da área do código-fonte que ele mantém. Este tipo de busca talvez seja mais intessante nos <em>devices drivers&#8230;</em></p>
<p style="text-align: justify;"><em><span style="font-style: normal;">Um exemplo com o ext4:</span></em></p>
<p style="text-align: justify;"><em> </em></p>
<p style="padding-left: 30px; "><strong>./scripts/get_maintainer.pl -f  fs/ext4/</strong></p>
<p style="padding-left: 60px; "><em><em>&#8220;Theodore Ts&#8217;o&#8221; &lt;tytso@&#8230;&gt;</em></em></p>
<p style="padding-left: 60px; "><em><span style="background-color: #ffffff; font-style: normal;"><em> </em></span>Aneesh Kumar K.V &lt;aneesh.kumar@&#8230;&gt; </em></p>
<p style="padding-left: 60px; "><em><span style="background-color: #ffffff; font-style: normal;"><em>Eric Sandeen &lt;sandeen@&#8230;&gt; </em></span></em></p>
<p style="padding-left: 60px; "><em><span style="background-color: #ffffff; font-style: normal;"><em> </em></span><span style="background-color: #ffffff; font-style: normal;"><em><span style="background-color: #ffffff; font-style: normal;"><em>linux-kernel@vger.kernel.org <span style="color: #ff0000;">(lembre-se de se cadastrar e sempre de copiar a lista de email junto)</span></em></span></em></span></em></p>
<p>Um exemplo com o <em>driver</em> de video da Intel:</p>
<p><span style="color: #ff0000;"><em> </em></span></p>
<p><span style="color: #ff0000;"><em> </em></span></p>
<p style="padding-left: 30px;"><em><strong>./scripts/get_maintainer.pl -f drivers/video/intelfb/</strong></em></p>
<p><em> </em></p>
<p><em> </em></p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Sylvain Meyer &lt;sylvain.meyer@worldonline.fr&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Andrew Morton &lt;akpm@linux-foundation.org&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Thomas Hilber &lt;sparkie@lowbyte.de&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Stefan Husemann &lt;shusemann@googlemail.com&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Hannes Eder &lt;hannes@hanneseder.net&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">Paul Menzel &lt;paulepanter@users.sourceforge.net&gt;</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">linux-fbdev-devel@lists.sourceforge.net</div>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow-x: hidden; overflow-y: hidden;">linux-kernel@vger.kernel.org</div>
<p style="padding-left: 30px; "><span style="color: #ff0000;"><em><span style="color: #000000;"><span style="font-style: normal;"> </span></span></em></span></p>
<p style="padding-left: 60px; ">Sylvain Meyer &lt;sylvain.meyer@&#8230;&gt;</p>
<p style="padding-left: 60px; ">Andrew Morton &lt;akpm@&#8230;&gt;</p>
<p style="padding-left: 60px; ">Thomas Hilber &lt;sparkie@&#8230;&gt;</p>
<p style="padding-left: 60px; ">Stefan Husemann &lt;shusemann@&#8230;&gt;</p>
<p style="padding-left: 60px; ">Hannes Eder &lt;hannes@&#8230;&gt;</p>
<p style="padding-left: 60px; ">Paul Menzel &lt;paulepanter@&#8230;&gt;</p>
<p style="padding-left: 60px; ">linux-fbdev-devel@lists.sourceforge.net</p>
<p style="padding-left: 60px; ">linux-kernel@vger.kernel.org</p>
<p style="padding-left: 30px; ">
<p><span style="background-color: #ffffff;">Dar o retorno do uso de algum programa é ótimo para o desenvolvedor e garante a qualidade do sotfware. </span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/kernel/acionando-os-mantenedores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Changes on kernel cross compiling</title>
		<link>http://www.coding.com.br/embarcado/changes-on-kernel-cross-compiling/</link>
		<comments>http://www.coding.com.br/embarcado/changes-on-kernel-cross-compiling/#comments</comments>
		<pubDate>Wed, 28 Oct 2009 22:32:01 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[embarcado]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[linux]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=360</guid>
		<description><![CDATA[Probably if you compile &#8211; many times &#8211; Linux for embedded hardware you change Makefile to your specific architecture and compiler. An example:
# Set the ARCH and CROSS_COMPILE default values
ARCH            ?= arm
CROSS_COMPILE   ?= arm-unknown-linux-gnu-
Latest Linux (~2.6.31) turns it deprecated (commit 575543347b5baed0ca927cb90ba8807396fe9cc9). Now [...]]]></description>
			<content:encoded><![CDATA[<p>Probably if you compile &#8211; many times &#8211; <a href="http://www.kernel.org">Linux</a> for embedded hardware you change <a href="file:/usr/src/linux/Makefile">Makefile</a> to your specific architecture and compiler. An example:</p>
<pre># Set the ARCH and CROSS_COMPILE default values
ARCH            ?= arm
CROSS_COMPILE   ?= arm-unknown-linux-gnu-</pre>
<p>Latest Linux (~2.6.31) turns it deprecated (commit <a href="http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=2331d1a6cd3d6e580bc88b9a160066d9e1177fe1">575543347b5baed0ca927cb90ba8807396fe9cc9</a>). Now the settings are saved in two files named:</p>
<p style="padding-left: 30px;">include/generated/kernel.arch<br />
include/generated/kernel.cross</p>
<p><strong>What changes?</strong></p>
<p>Using the new way you don&#8217;t edit Makefile anymore, just need set once your definitions for cross compiling:</p>
<pre>$ make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnu-</pre>
<p>And for next builds just run <em>make</em></p>
<pre>$ make</pre>
<p>This works both for plain builds and for O=&#8230; builds.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/embarcado/changes-on-kernel-cross-compiling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Depurando programas em assembly no GNU/Linux (parte 1)</title>
		<link>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/</link>
		<comments>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 02:41:03 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nasm]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=276</guid>
		<description><![CDATA[Embora eu particularmente prefira a sintaxe AT&#38;T à Intel. Estou tendo que aprender a usá-la (e bem). Para os estudos optei pelo NASM, GNU ld e o GDB. Um processo simples, descrito abaixo:
#nasm -g -f elf programa.asm 
#ld programa.o
#gdb -q a.out
Vamos fazer um pequeno programa teste que carrega no registro ecx o valor da variável [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Embora eu particularmente <a href="http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html">prefira</a> a sintaxe AT&amp;T à Intel. Estou <a href="http://www.unifei.edu.br">tendo</a> que aprender a usá-la (e bem). Para os estudos optei pelo <a href="http://www.nasm.us/">NASM</a>, <a href="http://www.gnu.org/software/binutils/">GNU ld</a> e o <a href="http://www.gnu.org/software/gdb/">GDB</a>. Um processo simples, descrito abaixo:</p>
<p style="padding-left: 30px;">#<strong>nasm</strong> -g -f elf <span style="color: #000000;">programa.asm </span><br />
#<strong>ld</strong> <span style="color: #000000;">programa.o</span><br />
#<strong>gdb</strong> -q <span style="color: #000000;">a.out</span></p>
<p>Vamos fazer um pequeno programa teste que carrega no registro <em>ecx</em> o valor da variável (var1) e em <em>edx</em> seu endereço:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">section <span style="color: #000000; font-weight: bold;">.data</span>
&nbsp;
   var1 <span style="color: #000000; font-weight: bold;">dd</span> <span style="color: #0000ff;">40</span>
&nbsp;
section <span style="color: #339933;">.</span>text
&nbsp;
   global _start
&nbsp;
   _start<span style="color: #339933;">:</span>
      <span style="color: #00007f; font-weight: bold;">nop</span>
      <span style="color: #00007f; font-weight: bold;">nop</span>
      <span style="color: #00007f; font-weight: bold;">mov</span>   <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span>var1<span style="color: #009900; font-weight: bold;">&#93;</span>
      <span style="color: #00007f; font-weight: bold;">lea</span>   <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span>var1<span style="color: #009900; font-weight: bold;">&#93;</span>
&nbsp;
   _exit<span style="color: #339933;">:</span>
      <span style="color: #00007f; font-weight: bold;">mov</span>   <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">1</span>
      <span style="color: #00007f; font-weight: bold;">int</span>   <span style="color: #0000ff;">80h</span></pre></div></div>

<p>Dentro do gdb:</p>
<pre>(gdb) break 11
Breakpoint 1 at 0x80480a1: file teste.asm, line 11.
(gdb) r
Starting program: /home/maluta/coding/a.out
Breakpoint 1, _start () at teste.asm:11
11            nop
(gdb) print var1
$1 = 40
(gdb) info registers ecx edx
ecx            0x0      0
edx            0x0      0</pre>
<p>Adicionamos um <a href="http://sourceware.org/gdb/current/onlinedocs/gdb_6.html#SEC34">breakpoint</a> (eu precisei inserir duas instruções <em>nop</em> para o gdb realmente para no ponto) e verificamos os valores de <strong>var1</strong>, <strong>ecx</strong> e <strong>edx</strong>.</p>
<pre>(gdb) si
_start () at teste.asm:12
12            mov   ecx, [var1]
(gdb) si
_start () at teste.asm:13
13            lea   edx, [var1]
(gdb) info registers ecx
ecx            0x28     40
(gdb) si
_exit () at teste.asm:16
16            mov   eax, 1
(gdb) info registers edx
edx            0x80490b8        134516920</pre>
<p>E por fim, verificamos o conteúdo no endereço definido em edx.</p>
<pre>(gdb) print *0x80490b8
$2 = 40</pre>
<p style="text-align: justify;">Algumas considerações:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">O <a href="http://www.gnu.org/software/ddd/">Data Diplay Debugger</a> (DDD) é um <em>front-end</em> muito bom para o GDB que pode ser utilizado ao invés da interface de linha de comando.</li>
</ul>
<ul style="text-align: justify;">
<li style="text-align: justify;">O após <em>label</em> <strong>_exit </strong>há uma chamada a uma <em>syscall</em> (adivinha qual?) do <a href="http://www.kernel.org">kernel</a>. Passa-se o valor (no registro eax) e chama uma interrupção (80h).  A verdadeira &#8220;diversão&#8221; está em associar essas syscalls (write, fork, execve, &#8230;) mas isto é para outro <em>post</em>&#8230; Por enquanto vou lidar com os diferentes modos de endereçamento e operações lógicas e aritméticas.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enviando SMS no GNU/Linux</title>
		<link>http://www.coding.com.br/programacao/enviando-sms-no-gnulinux/</link>
		<comments>http://www.coding.com.br/programacao/enviando-sms-no-gnulinux/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 03:15:46 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sms]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=222</guid>
		<description><![CDATA[Essa semana vi no blog do Mauro Martins um post sobre mandar SMS a partir do Excel (recomendo ler lá antes). Fiquei curioso, mas por opção resolvi utilizar apenas o GNU/Linux. O exemplo a seguir pode ser feito utilizando qualquer sistema Linux, a linguagem Python (com o módulo do PySerial instalado) e um celular smartphone [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Essa semana vi no <a title="Post inspirador" href="http://mauromartins.wordpress.com/2009/09/08/mandar-sms-a-partir-do-excel/" target="_blank">blog</a> do Mauro Martins um <em>post</em> sobre mandar SMS a partir do Excel (recomendo ler lá antes). Fiquei curioso, mas por opção resolvi utilizar apenas o GNU/Linux. O exemplo a seguir pode ser feito utilizando qualquer sistema Linux, a linguagem Python (com o módulo do <a href="http://www.coding.com.br/programacao/pyserial-utilize-o-python-para-controlar-a-interface-serial/" target="_blank">PySerial</a> instalado) e um <span style="text-decoration: line-through;">celular</span> <em>smartphone</em> da Nokia (nesse caso um <a title="N95 specs" href="http://www.gsmarena.com/nokia_n95-1716.php" target="_blank">N95</a>). O primeiro passo foi conectar o cabo USB e escolher o modo <strong>PC Suite</strong>.</p>
<p style="text-align: justify;">No terminal:</p>
<pre># lsusb | grep Nokia
Bus 005 Device 004: ID 0421:04f0 Nokia Mobile Phone</pre>
<p style="text-align: justify;">É preciso carregar os módulos necessários, se você precisar compilar o kernel são as opções CONFIG_USB_ACM e CONFIG_USB_SERIAL do .config</p>
<pre># modprobe cdc-acm
# modprobe usbserial vendor=0x0421 product=0x04f0</pre>
<p style="text-align: justify;">Observe que os valores dos parametros do módulo usbserial são obtidos através do comando lsusb. A partir desse ponto será criado um <em>device node</em> referenciado por /dev/ttyACM0. O código é bem simples, aonde apenas instanciamos um objeto da classe PySerial e utilizamos os métodos de escrita e leitura.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> serial
ser = serial.<span style="color: black;">Serial</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
ser.<span style="color: black;">port</span>=<span style="color: #483d8b;">'/dev/ttyACM0'</span>
ser.<span style="color: black;">baudrate</span>=<span style="color: #ff4500;">19200</span>
ser.<span style="color: black;">rtscts</span>=<span style="color: #ff4500;">1</span>
ser.<span style="color: black;">timeout</span>=<span style="color: #ff4500;">3</span>
ser.<span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">Depois foi apenas usar os métodos write() e read() para fazer a prova do conceito. Como eu não sabia a quantidade de bytes a serem recebidos &#8220;chutei&#8221; um valor (10 bytes) e especifiquei um <em>timeout</em> para sair.</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">ser.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'AT'</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>0d<span style="color: #000099; font-weight: bold;">\x</span>0a'</span><span style="color: black;">&#41;</span> <span style="color: #808080; font-style: italic;"># AT</span>
ser.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">10</span><span style="color: black;">&#41;</span></pre></div></div>

<p style="text-align: justify;">O exemplo de envio de um SMS que o Mauro apresentou pode ser feito dessa forma, lembrando que a extensão &#8216;\x0d\x0a&#8217; é o valor hexadecimal para o terminador de linha (o equivalente a pressionar [ENTER]).</p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;">ser.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'AT+CMGF=1'</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>0d<span style="color: #000099; font-weight: bold;">\x</span>0a'</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
ser.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'AT+CMGS=&quot;0XXYYYYYYYY&quot;'</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>0d<span style="color: #000099; font-weight: bold;">\x</span>0a'</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">time</span>.<span style="color: black;">sleep</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
ser.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'www.coding.com.br'</span>+<span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>0d<span style="color: #000099; font-weight: bold;">\x</span>0a<span style="color: #000099; font-weight: bold;">\x</span>1a'</span><span style="color: black;">&#41;</span>
 <span style="color: #808080; font-style: italic;"># envia a mensagem (www.coding.com.br) para o número definido</span></pre></div></div>

<p style="text-align: justify;">Meus primeiros testes só funcionaram quando dei um atraso (não se esqueça do <em>import time</em>) entre cada comando, abritrariamente escolhi 2 segundos, mas acredito que esse valor possa ser menor (fiz testes e funcionou). Passei uma boa parte da noite experimentando diversos comandos AT que encontrei no <a title="Lista de comandos AT (em inglês)" href="http://sw.nokia.com/id/95672052-6c77-488d-a055-acef77e4cdc5/AT_Command_Set_For_Nokia_GSM_And_WCDMA_Products_v1_2_en.pdf" target="_blank">manual</a>, os comandos de faziam a requisição de alguma informação: nível do sinal, número de série, fabricante, etc funcionaram, mas quando tentei fazer uma requisição da lista de contatos ou das mensagens SMS não obtive sucesso (mas é claro que fiz testes rápidos sem dar atenção merecida a documentação).</p>
<p style="text-align: justify;">Uma solução para fazer o equivalente no Excel é exportar a planilha no formato <a title="Explicação da Wikipedia sobre o fomarto CSV" href="http://pt.wikipedia.org/wiki/Comma-separated_values" target="_blank">CSV</a> e fazer um parser (lembrando que o Python já tem um <a href="http://docs.python.org/library/csv" target="_blank">módulo</a> pronto que faz isso) ou então até mesmo fazer um<em> plug-in</em> para o OpenOffice <img src='http://www.coding.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/programacao/enviando-sms-no-gnulinux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
