<?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; Nerd</title>
	<atom:link href="http://bgarber.notapipe.org/blog/category/nerd/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>Concentração x Quantidade de Sono</title>
		<link>http://bgarber.notapipe.org/blog/2010/11/concentracao-x-quantidade-de-sono/</link>
		<comments>http://bgarber.notapipe.org/blog/2010/11/concentracao-x-quantidade-de-sono/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 00:49:22 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Nerd]]></category>

		<guid isPermaLink="false">http://bgarber.notapipe.org/blog/?p=191</guid>
		<description><![CDATA[A dura verdade&#8230; Tweet]]></description>
			<content:encoded><![CDATA[<p style="text-align: left;">A dura verdade&#8230; <img src='http://bgarber.notapipe.org/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p style="text-align: center;"><a href="http://bgarber.notapipe.org/blog/wp-content/uploads/2010/11/concentracao_vs_sono.png"><img class="aligncenter size-medium wp-image-192" title="concentracao_vs_sono" src="http://bgarber.notapipe.org/blog/wp-content/uploads/2010/11/concentracao_vs_sono-300x254.png" alt="Fear the zombie-mode!" width="300" height="254" /></a></p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2010/11/concentracao-x-quantidade-de-sono/&via=bgarber&text=Concentração x Quantidade de Sono&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/concentracao-x-quantidade-de-sono/feed/</wfw:commentRss>
		<slash:comments>0</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>Teclado USB + GRUB</title>
		<link>http://bgarber.notapipe.org/blog/2007/04/teclado-usb-grub/</link>
		<comments>http://bgarber.notapipe.org/blog/2007/04/teclado-usb-grub/#comments</comments>
		<pubDate>Wed, 25 Apr 2007 12:41:12 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nerd]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/2007/04/25/teclado-usb-grub/</guid>
		<description><![CDATA[É conhecido um problema que o grub tem com relação a teclados USB. Pois bem, eu tive alguns probleminhas aqui em casa&#8230; =P Minha entrada PS/2 para o teclado (note que só o teclado, a entrada para o mouse continua funcionando&#8230;) pifou de uma maneira misteriosa que ainda agora não entendo, mas bem, tive que [...]]]></description>
			<content:encoded><![CDATA[<p>É conhecido um problema que o grub tem com relação a teclados USB. Pois bem, eu tive alguns probleminhas aqui em casa&#8230; =P Minha entrada PS/2 para o teclado (note que só o teclado, a entrada para o mouse continua funcionando&#8230;) pifou de uma maneira misteriosa que ainda agora não entendo, mas bem, tive que comprar um teclado USB. Bootando meu PC e entrando no grub qual é minha surpresa? O grub não reconhecia meu teclado USB.</p>
<p>Pensei: &#8220;e agora?&#8221;. Pelo menos eu conseguia bootar o Ubuntu (por causa do time out do grub) e via que o teclado funcionava. Só o grub que não estava gostando dele. Depois de ler alguns tutoriais na internet e pedir alguns conselhos a amigos (valeu César e Rodolfo pela ajuda) descobri que eu poderia arrumar isso habilitando uma opção na minha BIOS. Aqui na minha máquina a opção era &#8220;USB keyboard&#8221;, mas em algumas máquinas pode ser &#8220;USB legacy&#8221;. Do estado &#8220;disabled&#8221; passei para &#8220;enabled&#8221;, rebootei a máquina e &#8220;tchran&#8221;! Funcionou! Fica aqui a minha dica para aqueles que tiverem o mesmo tipo de problema que eu e não acharam alguma solução.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2007/04/teclado-usb-grub/&via=bgarber&text=Teclado USB + GRUB&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/04/teclado-usb-grub/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Reallife xeyes</title>
		<link>http://bgarber.notapipe.org/blog/2007/04/reallife-xeyes/</link>
		<comments>http://bgarber.notapipe.org/blog/2007/04/reallife-xeyes/#comments</comments>
		<pubDate>Thu, 12 Apr 2007 18:35:10 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Geral]]></category>
		<category><![CDATA[Nerd]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/2007/04/12/reallife-xeyes/</guid>
		<description><![CDATA[Mas olhem só o quê que o cara fez&#8230; Inspirado pelos xeyes (um plugin tanto para Gnome quanto para KDE, que coloca um par de olhos perseguindo o cursor na tela) um GEEK criou uma máquina que faz a mesma coisa que o xeyes, só que com pessoas. Confira o post na íntegra aqui. Confira [...]]]></description>
			<content:encoded><![CDATA[<p>Mas olhem só o quê que o cara fez&#8230; Inspirado pelos xeyes (um plugin tanto para Gnome quanto para KDE, que coloca um par de olhos perseguindo o cursor na tela) um GEEK criou uma máquina que faz a mesma coisa que o xeyes, só que com pessoas. Confira o post na íntegra <a href="http://hunz.geekheim.de/?p=47">aqui</a>. Confira o vídeo de demonstração <a href="http://hunz.org/xeyes.avi">aqui</a>.</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2007/04/reallife-xeyes/&via=bgarber&text=Reallife xeyes&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/04/reallife-xeyes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
<enclosure url="http://hunz.org/xeyes.avi" length="2439752" type="video/x-msvideo" />
		</item>
		<item>
		<title>One Instruction Set Computer</title>
		<link>http://bgarber.notapipe.org/blog/2007/02/one-instruction-set-computer/</link>
		<comments>http://bgarber.notapipe.org/blog/2007/02/one-instruction-set-computer/#comments</comments>
		<pubDate>Tue, 13 Feb 2007 18:14:14 +0000</pubDate>
		<dc:creator>Bryan</dc:creator>
				<category><![CDATA[Nerd]]></category>

		<guid isPermaLink="false">http://bgarber.wordpress.com/2007/02/13/one-instruction-set-computer/</guid>
		<description><![CDATA[Quem me conhece da faculdade sabe que, nas últimas semanas, ando maravilhado com uma novidade: processador com uma única instrução. Para aqueles que não acreditam, procurem informações na internet! É verdade, é possível criar computadores com uma única instrução. A instrução baseia-se no seguinte: um byte para acessar uma posição de memória A, um byte [...]]]></description>
			<content:encoded><![CDATA[<p>Quem me conhece da faculdade sabe que, nas últimas semanas, ando maravilhado com uma novidade: processador com uma única instrução. Para aqueles que não acreditam, procurem informações na internet! É verdade, é possível criar computadores com uma única instrução. A instrução baseia-se no seguinte: um byte para acessar uma posição de memória A, um byte para acessar uma posição de memória B e um byte para definir um OFFSET C, ficando cada operação com esta aparência genérica:</p>
<p>A B C</p>
<p>O que o processador realiza é a subtração do conteúdo da posição de memória A pelo conteúdo da posição de memória B, Armazenando esse resultado na posição A. Caso o resultado for negativo, o processador faz um <em>jump</em> para a posição do programa definido em C. Parece coisa de maluco, mas (para quem é <em>nerd</em> o suficiente para tentar =P) funciona.</p>
<p>Pois bem. Fiquei curioso e resolvi desenvolver um emulador. Um pouco mais robusto, faz diferença entre área de código e área de dados, mas funciona. Ainda tem alguns bugs, consigo ler do teclado, imprimir na tela, multiplicar posições, somar, diminuir (já é nativo&#8230; =P), setar valores, mover valores&#8230; Ainda falta fazer dividir, mas nada que um pouco de tempo livre não resolva. =)</p>
<p>Quem quiser fazer esta experiência, recomendo. É divertido!</p>
<div style="float: right; margin-left: 10px;"><a href="http://twitter.com/share?url=http://bgarber.notapipe.org/blog/2007/02/one-instruction-set-computer/&via=bgarber&text=One Instruction Set Computer&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/02/one-instruction-set-computer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

