<?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>Bryan Garber's Blog &#187; Linux</title>
	<atom:link href="http://bgarber.notapipe.org/blog/category/linux/feed/" rel="self" type="application/rss+xml" />
	<link>http://bgarber.notapipe.org/blog</link>
	<description>Where nerds collide!</description>
	<lastBuildDate>Mon, 12 Dec 2011 16:46:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Hacking /proc &#8211; tempo de execução de um processo em C</title>
		<link>http://bgarber.notapipe.org/blog/2011/05/hacking-proc-tempo-de-execucao-de-um-processo-em-c/</link>
		<comments>http://bgarber.notapipe.org/blog/2011/05/hacking-proc-tempo-de-execucao-de-um-processo-em-c/#comments</comments>
		<pubDate>Mon, 23 May 2011 19:49:09 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://bgarber.notapipe.org/blog/?p=286</guid>
		<description><![CDATA[Recentemente precisei descobrir, usando C, o tempo de execução de um processo. Ao invés de tentar um simples system(&#8220;ps aux &#124; grep &#60;pid&#62;&#8221;), pensei em utilizar algo mais esperto: a árvore montada no /proc. O /proc mantém em sua estrutura de diretórios arquivos para cada processo sendo executado na máquina, tendo um diretório específico para [...]]]></description>
			<content:encoded><![CDATA[<p>Recentemente precisei descobrir, usando C, o tempo de execução de um processo. Ao invés de tentar um simples <em>system(&#8220;ps aux | grep &lt;pid&gt;&#8221;)</em>, pensei em utilizar algo mais esperto: a árvore montada no <em>/proc</em>. O <em>/proc</em> mantém em sua estrutura de diretórios arquivos para cada processo sendo executado na máquina, tendo um diretório específico para cada PID. Bom, não vou entrar em detalhes sobre como está organizado o <em>/proc</em> neste post, mas podemos encontrar uma boa referência <a title="The /proc filesystem" href="http://www.comptechdoc.org/os/linux/howlinuxworks/linux_hlproc.html" target="_blank">aqui</a>.</p>
<p>Como podemos ver na lista de arquivos dentro de <em>/proc/&lt;pid&gt;</em>, o diretório de cada PID possui um arquivo chamado <em>stat</em>. Uma das várias informações guardadas neste arquivo é o <em>starttime</em>. Então a primeira coisa que vamos fazer é abrir o stat do PID desejado no nosso programa:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">char</span> stat_file<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">80</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> pid<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> ac <span style="color: #339933;">&lt;</span> <span style="color: #0000dd;">2</span> <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Error: one argument is needed!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
pid <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>av<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
snprintf<span style="color: #009900;">&#40;</span>stat_file<span style="color: #339933;">,</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span>stat_file<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;/proc/%d/stat&quot;</span><span style="color: #339933;">,</span> pid<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
proc_time <span style="color: #339933;">=</span> fopen<span style="color: #009900;">&#40;</span>stat_file<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #339933;">!</span>proc_time <span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Some strange error occurred while opening the file!<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    exit<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Com o <em>stat</em> do processo aberto, podemos procurar a 22ª <em>string</em> deste arquivo, que refere-se ao campo <em>starttime</em> do processo.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">freadln<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>line<span style="color: #339933;">,</span> proc_time<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">char</span> <span style="color: #339933;">*</span>jiff_from_boot_str <span style="color: #339933;">=</span> s_token<span style="color: #009900;">&#40;</span>line<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">22</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #993333;">long</span> <span style="color: #993333;">int</span> jiff_from_boot <span style="color: #339933;">=</span> atoi<span style="color: #009900;">&#40;</span>jiff_from_boot_str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Onde as funções <em>freadln</em> e <em>s_token</em> são definidas como:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;">size_t freadln <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">**</span>line<span style="color: #339933;">,</span> FILE <span style="color: #339933;">*</span>stream<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> c<span style="color: #339933;">;</span>
    <span style="color: #993333;">unsigned</span> <span style="color: #993333;">int</span> counter <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
    fread<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>c<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> stream<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #009900;">&#40;</span>c <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>feof<span style="color: #009900;">&#40;</span>stream<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        counter <span style="color: #339933;">+=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>line<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> realloc<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>line<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> counter <span style="color: #339933;">*</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>line<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>counter <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> c<span style="color: #339933;">;</span>
&nbsp;
        fread<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>c<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> stream<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    counter <span style="color: #339933;">+=</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>line<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> realloc<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>line<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> counter <span style="color: #339933;">*</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>line<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#91;</span>counter <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> counter <span style="color: #339933;">-</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">char</span><span style="color: #339933;">*</span> s_token <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #339933;">*</span> str<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> sep<span style="color: #339933;">,</span> <span style="color: #993333;">int</span> i<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>s <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span> strdup<span style="color: #009900;">&#40;</span>str<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>ret <span style="color: #339933;">=</span> strtok<span style="color: #009900;">&#40;</span>s<span style="color: #339933;">,</span> sep<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    i<span style="color: #339933;">--;</span>
    <span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">&gt;</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
        ret <span style="color: #339933;">=</span> strtok<span style="color: #009900;">&#40;</span>NULL<span style="color: #339933;">,</span> sep<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        i<span style="color: #339933;">--;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span>ret<span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">return</span> NULL<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> ret<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>A primeira função serve para ler uma linha de um arquivo (não gosto de <em>sscanf</em> ou <em>fgets</em> <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) e a outra serve para ler <em>tokens</em> de uma <em>string</em> a partir de um delimitador sem alterar a <em>string</em> original.</p>
<p>Como podemos reparar, o campo <em>starttime</em> no arquivo <em>stat</em> não está em segundos. Está em <em>jiffies</em> (um tipo de <em>tick</em> de relógio do Linux). O valor de <em>jiffies</em> por segundo é configurado na compilação do <em>kernel</em>. Para obter este valor, temos que realizar a seguinte consulta:</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">long</span> <span style="color: #993333;">int</span> jiffies_per_sec <span style="color: #339933;">=</span> sysconf<span style="color: #009900;">&#40;</span>_SC_CLK_TCK<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Agora fica fácil descobrir quantos segundos tinha se passado desde o <em>boot</em> até o início do programa. Basta dividirmos jiff_from_boot por jiffies_per_sec! Mas como queremos o tempo de execução do programa, vamos esperar para adicionar na fórmula final. Como pode-se imaginar, iremos calcular o tempo de execução do programa obtendo o tempo em segundos desde o <em>boot</em> do <em>kernel</em> (<em>uptime</em>) e subtrair pelo segundo de início do programa em questão. Para isso, iremos consultar usando a estrutura <em>sysinfo</em>.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">struct</span> sysinfo sys_inf<span style="color: #339933;">;</span>
sysinfo<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>sys_inf<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Pronto. Esta estrutura já possui um campo com o uptime em segundos, então basta resolver a diferença!</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">long</span> <span style="color: #993333;">int</span> proc_rtime <span style="color: #339933;">=</span> sys_inf.<span style="color: #202020;">uptime</span> <span style="color: #339933;">-</span> jiff_from_boot<span style="color: #339933;">/</span>jiffies_per_sec<span style="color: #339933;">;</span>
<span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Process %d running time: %ld secs<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> pid<span style="color: #339933;">,</span> proc_rtime<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Bom, acho que é isso. Caso queiram dar uma olhada no meu arquivo C, ele está disponível <a href="http://bgarber.notapipe.org/blog/wp-content/uploads/2011/05/main.c">aqui</a>. Nele poderás ver os <em>includes</em> necessários para compilar o teu código-fonte.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2011/05/hacking-proc-tempo-de-execucao-de-um-processo-em-c/&via=bgarber&text=Hacking /proc - tempo de execução de um processo em C&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2011/05/hacking-proc-tempo-de-execucao-de-um-processo-em-c/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Instalando Debian: the NERD way</title>
		<link>http://bgarber.notapipe.org/blog/2010/11/instalando-debian-the-nerd-way/</link>
		<comments>http://bgarber.notapipe.org/blog/2010/11/instalando-debian-the-nerd-way/#comments</comments>
		<pubDate>Tue, 09 Nov 2010 12:27:39 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Instalação]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nerd]]></category>

		<guid isPermaLink="false">http://bgarber.notapipe.org/blog/?p=128</guid>
		<description><![CDATA[O meu primeiro sistema operacional que instalei foi um Kurumin 3.0, que eu usava num computador velhão aqui de casa. Instalei Linux antes mesmo de ter alguma experiência instalando Windows. E desde que instalei pela primeira vez com sucesso um sistema operacional, não parei mais. Gosto muito de instalar sistemas operacionais, experimentar na segurança de [...]]]></description>
			<content:encoded><![CDATA[<p>O meu primeiro sistema operacional que instalei foi um Kurumin 3.0, que eu usava num computador velhão aqui de casa. Instalei Linux antes mesmo de ter alguma experiência instalando Windows. E desde que instalei pela primeira vez com sucesso um sistema operacional, não parei mais. Gosto muito de instalar sistemas operacionais, experimentar na segurança de uma VM (uso VirtualBox) ou instalando nas minhas máquinas. Nessa minha vida de nerd, depois de instalar o Kurumin, já instalei o Windows XP, o Ubuntu (moleza&#8230;), o FreeBSD, o Gentoo, Minix 3, o Debian, e mais recentemente o Windows Vista e o Arch Linux. Mas eu, como um usuário entusiasta do Debian, já o instalei de várias maneiras diferentes.</p>
<p>Como eu costumo comentar com meus colegas e amigos, o Debian tem, pelo menos 4 modos de instalação: o modo usuário (o qual já comentei <a href="http://bgarber.notapipe.org/blog/2007/11/instalando-debian-usando-interface-grafica/">aqui</a>), o modo normal (que seria basicamente procedendo pelos passos de instalação com o instalador padrão), o modo difícil (o que eu costumo fazer, trata-se de instalar o básico do básico pela instalação normal e instalar o restante via apt-get &#8211; inclusive o X! -, uso muito para instalar a versão <em>testing</em> através do CD de instalação do <em>stable</em>) e o NERD way. Este último é o nível que supera em dificuldade o modo difícil, mesmo usuários experientes podem &#8220;se quebrar&#8221; tentando. Os passos para o NERD way são para pessoas experientes, que sabem o que estão fazendo. Se quiser experimentar, recomendo usar uma máquina virtual, para brincar. Daí, não se corre o risco de danificar as partições do próprio disco. <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p>Antes de qualquer coisa, precisaremos de uma distro <em>live</em> CD qualquer. Eu utilizei o <em>live</em> CD do Ubuntu 10.10, mas pode ser qualquer uma que tenha a possibilidade de executar sem fazer nenhuma instalação. A partir daqui, seguimos os seguintes passos:</p>
<ol>
<li>inicializamos o <em>live</em> CD, entrando no Gnome Desktop;</li>
<li>esta instalação irá usar o <em>debootstrap</em>, que é um utilitário que várias distribuições possuem, portanto vamos abrir um terminal e instalá-lo:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo apt-get install debootstrap</pre></div></div>

<li>após terminar de instalar com sucesso, vamos executar o <em>cfdisk</em>;</li>
<li>no <em>cfdisk</em>, vamos criar 3 partições: uma para o <em>/</em>, uma para o <em>/home</em> e uma para o <em>swap</em>, de acordo com a imagem abaixo (clique na imagem para ampliar):</li>
<div id="attachment_141" class="wp-caption aligncenter" style="width: 310px"><a href="http://bgarber.notapipe.org/blog/wp-content/uploads/2010/11/ubuntu-cfdisk.png"><img class="size-medium wp-image-141" title="ubuntu-cfdisk" src="http://bgarber.notapipe.org/blog/wp-content/uploads/2010/11/ubuntu-cfdisk-300x225.png" alt="Tabela de partições do disco." width="300" height="225" /></a><p class="wp-caption-text">Tabela de partições do disco.</p></div>
<li>os rótulos das partições não foram colocados quando tirei a screenshot acima, mas a saber, o <em>sda1</em> irá mapear para uma área de <em>swap</em>, o <em>sda2</em> irá mapear para o <em>/</em> e o <em>sda3</em> irá mapear para o <em>/home</em>;</li>
<li>após terminado o particionamento do disco, vamos gravar as alterações (<strong>NOTA IMPORTANTE</strong>: este processo é irreversível! Muito cuidado!), talvez um <em>reboot</em> seja necessário (se for, reinstale o <em>debootstrap</em> ao reiniciar, óbvio);</li>
<li>agora, vamos formatar as partições criadas; meu sistema de arquivos escolhido será o <em>ext4</em> e lembrando que as partições, no meu caso e provavelmente o teu,  ficaram nos discos mapeados como <em>/dev/sda*</em>:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo mke2fs -t ext4 -L / /dev/sda2
$ sudo mke2fs -t ext4 -L /home /dev/sda3</pre></div></div>

<li>vamos ativar a área de swap:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo mkswap /dev/sda1
$ sudo swapon /dev/sda1</pre></div></div>

<li>vamos montar a partição / (eu preferi no /mnt):</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo mount /dev/sda2 /mnt</pre></div></div>

<li>agora, estamos prontos para o <em>debootstrap</em>:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo debootstrap squeeze /mnt http://ftp.br.debian.org/debian</pre></div></div>

<li>isto irá instalar o básico do básico na partição, não vai ter nem kernel instalado; este processo irá demorar um pouco, aproveite para tomar um cafézinho&#8230; <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </li>
<li>ao concluir a instalação, vamos fazer um <em>chroot</em> para o diretório onde a partição <em>/</em> foi montada:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">$ sudo chroot /mnt</pre></div></div>

<li>agora precisaremos instalar o <em>kernel</em>; aproveito a oportunidade e instalo mais algumas coisas que poderão ser úteis, como <em>linux-headers</em>, <em>make</em>, etc&#8230;</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;"># aptitude install linux-image-2.6.32-5-686 \
    linux-headers-2.6.32-5-686 make vim</pre></div></div>

<li>espere concluir a instalação, se ele reclamar de &#8220;<em>untrusted packages</em>&#8220;, apenas digite &#8220;<em>Yes</em>&#8220;, que isso pode ser resolvido mais tarde (também não se preocupe com o possível <em>warning: can&#8217;t open /etc/mtab: No such file or directory</em>);</li>
<li>a seguir, vamos configurar o <em>/etc/fstab</em> (sim, temos que fazer isso, eu avisei que seria bem manual no início do post); vamos configurar para ele se parecer com isto:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">#&lt;file system&gt; &lt;mount point&gt; &lt;type&gt; &lt;options&gt; &lt;dump &gt; &lt;pass&gt;
/dev/sda1      swap          swap   defaults  0       0
/dev/sda2      /             ext4   defaults  1       1
/dev/sda3      /home         ext4   defaults  1       2</pre></div></div>

<li>após o <em>fstab</em>, vamos instalar o <em>grub</em> no setor de inicialização:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;"># aptitude install grub
# cd /dev
# mknod sda b 8 0
# mknod sda1 b 8 1
# mknod sda2 b 8 2
# mknod sda3 b 8 3
# grub-install sda
# update-grub2</pre></div></div>

<li>caso a operação de <em>aptitude install</em> do <em>grub</em> reclame que tu estás instalando o <em>grub</em> sem instalá-lo em nenhum disco, diga que é para ele seguir mesmo assim; repare que nós temos que criar cada <em>/dev/sda*</em>, pois eles ainda não aparecem na listagem do diretório;</li>
<li>por final, vamos configurar a rede, utilizando por base a <em>distro</em> do <em>live CD</em>, copiando os seguintes arquivos:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;"># exit
$ sudo cp /etc/hosts /mnt/etc
$ sudo cp /etc/network/interfaces /mnt/etc/network/</pre></div></div>

<li>e não vamos esquecer de editar o <em>/mnt/etc/hostname</em> com o nome desejado para máquina; adicionalmente, troque o &#8220;<em>ubuntu</em>&#8221; (depende do <em>live CD</em> que tu estiveres usando, eu estou usando o Ubuntu aqui) do arquivo <em>/mnt/etc/hosts</em> pelo mesmo nome colocado no <em>/mnt/etc/hostname</em>; repare ainda que, neste momento, nós saímos do modo <em>chroot</em>;</li>
<li>adicione as seguintes linhas no <em>/mnt/etc/network/interfaces</em>:</li>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">auto eth0
iface eth0 inet dhcp</pre></div></div>

<li><strong>Update:</strong> uma alternativa ao passo anterior é instalar o pacote <em>network-manager</em> via <em>apt-get</em>!</li>
<li>vamos voltar ao <em>chroot</em> (<em>sudo chroot /mnt</em>) e trocar a senha do <em>root</em> com <em>passwd</em>;</li>
<li>e agora é hora (enfim!) de dar adeus ao <em>live CD</em> e dar <em>reboot</em> no teu novo sistema operacional! \o/</li>
</ol>
<p>Para a instalação, é isso. Configure novos usuários usando <em>adduser login</em> (substitua <em>login</em> pelo nome de usuário que tu desejar) e instale novos pacotes a vontade. Para instalar o Gnome, execute <em>aptitude install gnome</em>. Ou simplesmente execute <em>tasksel</em>, para automatizar esta instalação de pacotes adicionais.</p>
<p>É possível que tenhas que reconfigurar o layout de teclado no terminal (onde não tem a interface gráfica carregada). Isso se resolve com <em>&#8220;dpkg-reconfigure console-data&#8221;</em> e selecionando o mapa de teclados corretamente das listas (resolvi selecionando <em>&#8220;pc / qwerty / Brazilian / Standard / Standard ABNT2&#8243;</em> da lista completa de mapas de teclado). O problema com &#8220;<em>untrusted packages</em>&#8221; no <em>apt-get</em> eu resolvi apenas executando um <em>apt-get update</em>. Não esqueça de atualizar teu <em>/etc/apt/sources.list</em> com outros repositórios. Aqui vai como está o meu:</p>

<div class="wp_syntax"><div class="code"><pre class="shell" style="font-family:monospace;">deb http://ftp.br.debian.org/debian/ squeeze main contrib non-free
deb-src http://ftp.br.debian.org/debian/ squeeze main contrib non-free
&nbsp;
deb http://security.debian.org/ squeeze/updates main contrib non-free
deb-src http://security.debian.org/ squeeze/updates main contrib non-free</pre></div></div>

<p>É isso. Espero ter ajudado ao nerd que se interessar por este processo. <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2010/11/instalando-debian-the-nerd-way/&via=bgarber&text=Instalando Debian: the NERD way&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2010/11/instalando-debian-the-nerd-way/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tibia on Wine &#8211; finalmente algo que funciona&#8230;</title>
		<link>http://bgarber.notapipe.org/blog/2009/05/tibia-on-wine-finalmente-algo-que-funciona/</link>
		<comments>http://bgarber.notapipe.org/blog/2009/05/tibia-on-wine-finalmente-algo-que-funciona/#comments</comments>
		<pubDate>Sun, 17 May 2009 23:13:40 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nerd]]></category>
		<category><![CDATA[Tibia]]></category>

		<guid isPermaLink="false">http://bgarber.notapipe.org/blog/?p=55</guid>
		<description><![CDATA[É&#8230; Quero dizer&#8230; Hmmm&#8230; Digamos meia boca&#8230; Como prometi há algum tempo atrás (bota tempo atrás), estou disponibilizando aqui um meio fácil de &#8220;botar para funcionar&#8221; o Tibia com o Wine. Só os resultados deixaram a desejar um tanto&#8230; =/ O melhor DirectX que ele conseguiu compatibilidade foi o 5, portanto os gráficos ficaram bem [...]]]></description>
			<content:encoded><![CDATA[<p>É&#8230; Quero dizer&#8230; Hmmm&#8230; Digamos meia boca&#8230; Como prometi há algum tempo atrás (bota tempo atrás), estou disponibilizando aqui um meio fácil de &#8220;botar para funcionar&#8221; o Tibia com o Wine. Só os resultados deixaram a desejar um tanto&#8230; =/ O melhor DirectX que ele conseguiu compatibilidade foi o 5, portanto os gráficos ficaram bem ruinzinhos e sem opções de &#8220;sombra&#8221;. O que deve ser feito para o Tibia funcionar com o Wine é alterar os registros dele. Como se fosse um Windows mesmo, o Wine tem seu <strong>regedit</strong>. Para acessá-lo, basta executar o seguinte comando no terminal:</p>
<p><strong>$ regedit</strong></p>
<p>Isto irá abrir, com o Wine, uma janela como a qual já devemos conhecer do Windows (pelo menos aqueles que gostam de brincar com o editor de registros&#8230; =P). Com a janela aberta, expandimos o HKEY_CURRENT_USER-&gt;Software-&gt;Wine-&gt;Direct3D. Dentro desta pasta devemos modificar o seguinte registro: <strong>DirectDrawRenderer</strong>. O valor dela deverá ser alterado para &#8220;gdi&#8221; (sem as aspas, é claro). Para alterar o valor do registro, basta clicar com o botão direito em cima do registro, clicar em modificar e alterar o campo &#8220;Dados do valor&#8221;. Caso não exista nenhum registro dentro de Direct3D, basta adicioná-lo, clicando no botão &#8220;Editar&#8221;, na barra de menu, selecionar &#8220;Novo-&gt;Valor Texto&#8221;. Altere o nome do registro para <strong>DirectDrawRenderer</strong> e, após isso clique com o botão direito em cima do registro recém criado, clique em Modificar e altere o valor do campo para &#8220;gdi&#8221;. Pronto. Na próxima vez que o Tibia for aberto com o Wine, tudo deverá funcionar corretamente. <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<div id="attachment_62" class="wp-caption aligncenter" style="width: 485px"><img class="size-full wp-image-62" title="Janela do Tibia" src="http://bgarber.notapipe.org/blog/wp-content/uploads/2009/05/captura_da_tela.png" alt="Pelo Wine, conseguimos até apenas o DX5, o que faz percebermos grande perda de qualidade." width="475" height="375" /><p class="wp-caption-text">Pelo Wine, conseguimos até apenas o DX5, o que faz percebermos grande perda de qualidade.</p></div>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2009/05/tibia-on-wine-finalmente-algo-que-funciona/&via=bgarber&text=Tibia on Wine - finalmente algo que funciona...&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2009/05/tibia-on-wine-finalmente-algo-que-funciona/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Primeiro post de utilidade pública: sobre USB 1.1 e Linux</title>
		<link>http://bgarber.notapipe.org/blog/2009/03/primeiro-post-de-utilidade-publica-sobre-usb-11-e-linux/</link>
		<comments>http://bgarber.notapipe.org/blog/2009/03/primeiro-post-de-utilidade-publica-sobre-usb-11-e-linux/#comments</comments>
		<pubDate>Sat, 28 Mar 2009 18:33:42 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://bgarber.notapipe.org/blog/?p=47</guid>
		<description><![CDATA[Há muito tempo atrás, eu vinha comentando que existia um problema com o kernel do Linux e minhas entradas USB. Pois bem, depois de algumas atualizações o problema voltou a ocorrer, mesmo para a versão 2.6.24. Não sei mais o que fazer. Minha expectativa é que algum dia isso seja corrigido, mas não sei quando. [...]]]></description>
			<content:encoded><![CDATA[<p>Há muito tempo atrás, eu vinha comentando que existia um problema com o kernel do Linux e minhas entradas USB. Pois bem, depois de algumas atualizações o problema voltou a ocorrer, mesmo para a versão 2.6.24. Não sei mais o que fazer. Minha expectativa é que algum dia isso seja corrigido, mas não sei quando. Enquanto isso, aquela máquina fica com o Windão rodando (bleh), mas que pelo menos não apresenta crises existencias com o USB. Claro, mantenho o Linux instalado lá e, periódicamente, tenho atualizado com a esperança de que o bug seja corrigido. Ainda tenho planos de corrigir por mim mesmo o bug, mas anda meio complicado, com todos os trabalhos da faculdade e o fato de que, depois de cai o USB, cai a rede&#8230;. Mas vamos ver. <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' />  Quem sabe, eu instale o Debian Sarge nele que, se não me engano, tem kernel 2.4, que funciona tranqüilo.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2009/03/primeiro-post-de-utilidade-publica-sobre-usb-11-e-linux/&via=bgarber&text=Primeiro post de utilidade pública: sobre USB 1.1 e Linux&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2009/03/primeiro-post-de-utilidade-publica-sobre-usb-11-e-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Modificando a versão de append local de um kernel já compilado no linux</title>
		<link>http://bgarber.notapipe.org/blog/2008/07/modificando-a-versao-de-append-local-de-um-kernel-ja-compilado-no-linux/</link>
		<comments>http://bgarber.notapipe.org/blog/2008/07/modificando-a-versao-de-append-local-de-um-kernel-ja-compilado-no-linux/#comments</comments>
		<pubDate>Tue, 15 Jul 2008 18:56:37 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/?p=37</guid>
		<description><![CDATA[Bem, ando meio desaparecido do blog, mas aqui volto com uma dica. É algo que agora a pouco passei e tive que me virar para resolver. No Debian, existe uma maneira fácil e rápida de se compilar o kernel: é o comando make-kpkg. A utilização dele é simples. Primeiro, executa-se o seguinte comando, na pasta [...]]]></description>
			<content:encoded><![CDATA[<p>Bem, ando meio desaparecido do blog, mas aqui volto com uma dica. É algo que agora a pouco passei e tive que me virar para resolver. No Debian, existe uma maneira fácil e rápida de se compilar o kernel: é o comando <strong>make-kpkg</strong>. A utilização dele é simples. Primeiro, executa-se o seguinte comando, na pasta onde se encontra o kernel:</p>
<p><strong># make menuconfig</strong></p>
<p>Este comando abrirá uma interface colorida para configuração do kernel a ser compilado. Altere a seu gosto, mas com cuidado. Não vou entrar em detalhes sobre como configurar o kernel para sua máquina aqui pois não é este o objetivo do artigo, mas recomendo executar alguns <strong>lspci</strong>, e buscar informações na internet (leia-se Google <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> ) caso tenha que configurar algo em especial. Em geral, o kernel já vem com uma configuração por padrão que atende a maioria dos casos. Sempre existe a possibilidade de se copiar o arquivo de configuração do kernel (na pasta <strong>/boot</strong>) atual para o arquivo .config dentro da pasta onde está o kernel, e se executar um <strong>make oldconfig</strong>, mas cuidado, pois alguns módulos podem mudar de nome de uma versão para outra e isso pode trazer problemas. Enfim, voltando ao contexto original, na tela de configuração do kernel, entre em <strong>&#8220;General Setup&#8221;</strong>, na opção <strong>&#8220;Local Version&#8221;</strong>, digite um nome para ser adicionado à versão do kernel. Saia da tela e execute o seguinte comando:</p>
<p><strong># make-kpkg &#8211;initrd linux-image</strong></p>
<p>Este comando gerará na pasta <strong>/usr/src</strong> um arquivo .deb que pode ser instalado através do comando:</p>
<p><strong># dpkg -i &lt;arquivo&gt;.deb</strong></p>
<p>Eu já tinha seguido esses passos a um tempo atrás para compilar o kernel 2.6.24 no meu Debian, mas hoje me deparei com um problema: eu queria modificar o valor que é adicionado à versão do kernel. Este problema pode ser resolvido apenas movendo a pasta <strong>debian</strong> de dentro da pasta do kernel que tu estás compilando para um outro nome ou outro lugar. Após isso, basta executar o <strong>make-kpkg</strong> e o <strong>dpkg -i</strong> normalmente que tudo deverá transcorrer tranqüilamente.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2008/07/modificando-a-versao-de-append-local-de-um-kernel-ja-compilado-no-linux/&via=bgarber&text=Modificando a versão de append local de um kernel já compilado no linux&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2008/07/modificando-a-versao-de-append-local-de-um-kernel-ja-compilado-no-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teclados USB, entradas USB 1.1 e Linux: a saga chega a seu fim!!</title>
		<link>http://bgarber.notapipe.org/blog/2008/03/teclados-usb-entradas-usb-11-e-linux-a-saga-chega-a-seu-fim/</link>
		<comments>http://bgarber.notapipe.org/blog/2008/03/teclados-usb-entradas-usb-11-e-linux-a-saga-chega-a-seu-fim/#comments</comments>
		<pubDate>Sun, 30 Mar 2008 18:12:56 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/?p=36</guid>
		<description><![CDATA[Depois de uns tempos sem postar nada no blog, hoje eu venho com uma ótima notícia para aqueles que tiveram problemas como o meu. Num artigo que publiquei aqui no blog e no VOL (http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=6607), eu apresentei uma solução ao problema de IRQ #11 Disabled do kernel, para as entradas USB 1.1. Por algum motivo [...]]]></description>
			<content:encoded><![CDATA[<p>Depois de uns tempos sem postar nada no blog, hoje eu venho com uma ótima notícia para aqueles que tiveram problemas como o meu. Num artigo que publiquei aqui no blog e no VOL (http://www.vivaolinux.com.br/artigos/verArtigo.php?codigo=6607), eu apresentei uma solução ao problema de IRQ #11 Disabled do kernel, para as entradas USB 1.1. Por algum motivo misterioso, o kernel desbilitava as interrupções de USB e meu teclado não funcionava corretamente. Enfim, não vou expor a história inteira aqui, já que pode ser lida no artigo.</p>
<p>A boa notícia é que a nova versão do kernel, a versão 2.6.24, corrige este problema! Nesta versão, os caras que mantém o kernel jogaram bastante coisa antiga fora e reescreveram boa parte do código. Agora, as portas USB 1.1 funcionam corretamente e o kernel não desbilita as interrupções, mantendo o teclado funcionando perfeitamente! Sinceramente, fizeram um ótimo trabalho no kernel 2.6.24, até o desempenho da máquina ficou melhor com relação às versões anteriores.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2008/03/teclados-usb-entradas-usb-11-e-linux-a-saga-chega-a-seu-fim/&via=bgarber&text=Teclados USB, entradas USB 1.1 e Linux: a saga chega a seu fim!!&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2008/03/teclados-usb-entradas-usb-11-e-linux-a-saga-chega-a-seu-fim/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Instalando Debian usando interface gráfica</title>
		<link>http://bgarber.notapipe.org/blog/2007/11/instalando-debian-usando-interface-grafica/</link>
		<comments>http://bgarber.notapipe.org/blog/2007/11/instalando-debian-usando-interface-grafica/#comments</comments>
		<pubDate>Wed, 07 Nov 2007 13:40:59 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Instalação]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/2007/11/07/instalando-debian-usando-interface-grafica/</guid>
		<description><![CDATA[Não é padrão do instalador netinst (CD reduzido com o sistema básico, baixa e instala o restante do software da internet) do Debian, mas existe a possibilidade de usar uma interface gráfica em GTK para fazer a instalação. No momento do boot do CD netinst, o Debian pergunta sobre a forma de boot (podendo simplesmente [...]]]></description>
			<content:encoded><![CDATA[<p>Não é padrão do instalador netinst (CD reduzido com o sistema básico, baixa e instala o restante do software da internet) do Debian, mas existe a possibilidade de usar uma interface gráfica em GTK para fazer a instalação.</p>
<p>No momento do boot do CD netinst, o Debian pergunta sobre a forma de boot (podendo simplesmente apertar enter e entrar no instalador padrão), digita-se o texto <strong>installgui</strong>, pressiona-se enter e o instalador irá carregar uma interface gráfica bonitinha e até de certa forma intuitiva para a instalação.</p>
<p>Para se obter uma lista mais completa sobre as formas de boot do netinst, pressiona-se &lt;F1&gt; e, na lista de opções, escolha algo como &#8220;formas de boot do instalador&#8221; ou algo parecido.</p>
<p>Achei massa, apesar de preferir a interface de instalação padrão. Acredito que funcione também para o businesscard.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2007/11/instalando-debian-usando-interface-grafica/&via=bgarber&text=Instalando Debian usando interface gráfica&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2007/11/instalando-debian-usando-interface-grafica/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cliente Tibia no Linux</title>
		<link>http://bgarber.notapipe.org/blog/2007/07/cliente-tibia-no-linux/</link>
		<comments>http://bgarber.notapipe.org/blog/2007/07/cliente-tibia-no-linux/#comments</comments>
		<pubDate>Tue, 24 Jul 2007 17:21:20 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/2007/07/24/cliente-tibia-no-linux/</guid>
		<description><![CDATA[Opa! O que parecia descontinuado voltou! Já faz um tempo que a Cipsoft, criadora de um dos mais clássicos jogos de MMORPG do mundo &#8211; Tibia -, resolveu voltar a distribuir versões do jogo para Linux. É só ir na página oficial do jogo (www.tibia.com), baixar o cliente e descompactar. Aqui deu um problema quando [...]]]></description>
			<content:encoded><![CDATA[<p>Opa!</p>
<p>O que parecia descontinuado voltou! Já faz um tempo que a Cipsoft, criadora de um dos mais clássicos jogos de MMORPG do mundo &#8211;  Tibia -, resolveu voltar a distribuir versões do jogo para Linux. É só ir na página oficial do jogo (<a href="http://www.tibia.com">www.tibia.com</a>), baixar o cliente e descompactar. Aqui deu um problema quando fui executar, abria a janela do jogo, mas a tela ficava toda preta. Isso pode-se resolver facilmente instalando o pacote libosmesa6-dev.</p>
<p>Se tu tem uma distro baseada em Debian, ou o próprio Debian (como eu ^^), abra um terminal, e, como root, execute o seguinte comando:</p>
<p><strong># apt-get install libosmesa6-dev</strong></p>
<p>Isto instalará pacotes para renderização do mesa, exatamente o que falta para o Tibia rodar. Toque ficha no executável do cliente e divirta-se com a versão Linux deste maravilhoso game. Qualquer dia, coloco aqui um manual para rodar o cliente Tibia pelo Wine e pelo Cedega. ^^</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2007/07/cliente-tibia-no-linux/&via=bgarber&text=Cliente Tibia no Linux&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2007/07/cliente-tibia-no-linux/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Mágicas do VIM &#8211; Macros</title>
		<link>http://bgarber.notapipe.org/blog/2007/07/magicas-do-vim-macros/</link>
		<comments>http://bgarber.notapipe.org/blog/2007/07/magicas-do-vim-macros/#comments</comments>
		<pubDate>Sun, 01 Jul 2007 22:47:27 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Utilitários]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/2007/07/01/magicas-do-vim-macros/</guid>
		<description><![CDATA[Meu editor para programação favorito é o VIM. Sou fanático por esse maravilhoso editor e suas funcionalidades. Qualquer coisa que peçam para eu programar, o utilizo. Minha última descoberta foi sobre o maravilhoso esquema de macros dele. Macros existem para nos poupar do horrível trabalho de fazer passos repetidamente. Por exemplo, tu tem o seguinte [...]]]></description>
			<content:encoded><![CDATA[<p>Meu editor para programação favorito é o VIM. Sou fanático por esse maravilhoso editor e suas funcionalidades. Qualquer coisa que peçam para eu programar, o utilizo. Minha última descoberta foi sobre o maravilhoso esquema de macros dele. Macros existem para nos poupar do horrível trabalho de fazer passos repetidamente. Por exemplo, tu tem o seguinte trecho no seu arquivo:<br />
<code><br />
symbol O 0<br />
symbol VIM 1<br />
symbol É 2<br />
symbol MÁGICO 3</code></p>
<p>Se tu quiser retirar em cada linha a palavra symbol, os números e os espaços, pode-se gravar uma macro para isso. Sem estar em modo nenhum (&lt;ESC&gt;), aperte em q e mais uma letra, para identificar a macro. Agora, aparecerá a palavra &#8220;recording&#8221; no rodapé do VIM. Entre no modo de inserção (&lt;INSERT&gt;) e faça para a primeira linha o que tu quer que seja gravado na macro. Quando tiver terminado, saia do modo de inserção e aperte apenas q. Assim, tua macro estará pronta para ser usada. Vá para a próxima linha e aperte @&lt;letra_definida_à_macro&gt;. Por exemplo, se tu definiu a letra &#8216;a&#8217; para identificar a macro, aperte @a. Todos os passos que tu tinha gravado na macro serão executados nessa linha. Executando isso linha por linha, ficaremos com:<br />
<code><br />
O<br />
VIM<br />
É<br />
MÁGICO</code></p>
<p>E está feito. Se tu não quiser fazer isso para cada linha (vamos dizer que tu tenha 100 linhas para alterar), tu pode gravar na macro para ele ir para a próxima linha depois de completar tudo. Quando tu for executar a macro, posicione o cursor na primeira linha a ser alterada e digite (sem estar no modo de inserção) 100@&lt;identificador_da_macro&gt;. Assim, o VIM irá chamar 100 vezes tua macro, como foi gravado para ele pular para a próxima linha no final, as 100 linhas são alteradas todas de uma vez.</p>
<p>Mágico!</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2007/07/magicas-do-vim-macros/&via=bgarber&text=Mágicas do VIM - Macros&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2007/07/magicas-do-vim-macros/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Teclado USB no Debian Etch</title>
		<link>http://bgarber.notapipe.org/blog/2007/06/teclado-usb-no-debian-etch/</link>
		<comments>http://bgarber.notapipe.org/blog/2007/06/teclado-usb-no-debian-etch/#comments</comments>
		<pubDate>Tue, 26 Jun 2007 12:21:36 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/2007/06/26/teclado-usb-no-debian-etch/</guid>
		<description><![CDATA[Bem, no meu último post comentei que instalei o Debian no meu PC em casa. O teclado USB que instalei estava dando problemas com o Linux, mas tinha conseguido arrumar. No Debian, descobri que o problema também acontece. Se tento bootar o kernel com irqpoll, o sistema simplesmente congela quando entra na situação de nobody [...]]]></description>
			<content:encoded><![CDATA[<p>Bem, no meu último post comentei que instalei o Debian no meu PC em casa. O teclado USB que instalei estava dando problemas com o Linux, mas tinha conseguido arrumar. No Debian, descobri que o problema também acontece. Se tento bootar o kernel com irqpoll, o sistema simplesmente congela quando entra na situação de nobody cared.</p>
<p>O interessante é o seguinte: no Debian, o kernel somente desabilita a IRQ #11 quando passo muito tempo sem usar o teclado (questão de uns 15 minutos). Enquanto estou usando, o problema não acontece. No dmesg, só notei uma coisa: ele monta novamente o usb device como se ele tivesse sido desmontado. Acho que aqui está uma grande pista para os desenvolvedores do kernel (ou para eu tentar arrumar!).</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2007/06/teclado-usb-no-debian-etch/&via=bgarber&text=Teclado USB no Debian Etch&related=:&lang=en&count=horizontal" class="twitter-share-button">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div>]]></content:encoded>
			<wfw:commentRss>http://bgarber.notapipe.org/blog/2007/06/teclado-usb-no-debian-etch/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

