<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Under-Linux.org - Blogs - root@blog:/# chmod o+r * por Magnun</title>
		<link>http://under-linux.org/blogs/magnun/</link>
		<description>UnderLinux o Portal do Administrador de Sistemas</description>
		<language>pt</language>
		<lastBuildDate>Mon, 22 Mar 2010 07:44:13 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>5</ttl>
		<image>
			<url>http://under-linux.org/images/misc/rss.jpg</url>
			<title>Under-Linux.org - Blogs - root@blog:/# chmod o+r * por Magnun</title>
			<link>http://under-linux.org/blogs/magnun/</link>
		</image>
		<item>
			<title><![CDATA[[Curso de Python] Correção: Estruturas For Aninhadas]]></title>
			<link>http://under-linux.org/blogs/magnun/curso-de-python-correcao-estruturas-aninhadas-1877/</link>
			<pubDate>Mon, 08 Mar 2010 15:56:04 GMT</pubDate>
			<description>Antes de prosseguir leia os artigos anteriores aqui (http://under-linux.org/blogs/magnun/curso-de-python/). 
 
Olá pessoal!! Depois de uma sumida pra...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><p class="alert2">Antes de prosseguir leia os artigos anteriores <a href="http://under-linux.org/blogs/magnun/curso-de-python/" target="_blank">aqui</a>. </p><br />
<br />
Olá pessoal!! Depois de uma sumida pra conseguir lançar um dos meus projetos, estou retomando o curso. A um tempo deixei uns exercícios mas não corrigi. Logo... vamos corrigi-los!<br />
<br />
<br />
<br />
<p class="redbox"> <b><font size="4">Correção: Estruturas For Aninhadas</font></b> </p><br />
<br />
<b>1. O dicionário abaixo representa uma lista de alunos (chaves) e suas notas (valores). Percorra esse dicionário e calcule a média de cada aluno imprimindo o nome do aluno seguido de sua nota.<br />
alunos = {'fulano':[6, 7, 5, 2], 'sicrano':[7, 8, 9, 8], 'beltrano':[10, 9, 10, 10]}</b><br />
<br />
Esse exercício é muito divertido e simples. A grande sacada está em lembrar de usar o método items() em conjunto com o for. Vamos ver o código.<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:132px;">alunos = {'fulano':[6, 7, 5, 2], 'sicrano':[7, 8, 9, 8], 'beltrano':[10, 9, 10, 10]}
for aluno,notas in alunos.items():
    media = 0
    for nota in notas:
        media += nota
    media = float(media) / len(notas)
    print \&quot;Aluno:\&quot;,aluno
    print \&quot;Média:\&quot;,media
    print</pre>
</div> Nada muito complexo. Declaramos o dicionário com os alunos, e já vamos para o for. Nele &quot;desempacotamos&quot; as variáveis aluno (string) e a variável notas (lista de números). É importante notar que esse &quot;desempacotamento&quot; só é possível porque usamos o método items(), caso contrário só seria possível obter o nome do aluno. Depois criamos um novo for, que irá pegar cada nota dentro de notas. Esse for simplesmente soma todas notas do aluno. Depois desse for podemos dividir pelo comprimento da variável notas, assim obtemos a média!<br />
<br />
<br />
<b>2. Repita o exercício 1 informando, ao final de tudo, a média da turma.</b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:192px;">alunos = {'fulano':[6, 7, 5, 2], 'sicrano':[7, 8, 9, 8], 'beltrano':[10, 9, 10, 10]}
media_turma = 0
for aluno,notas in alunos.items():
    media = 0
    for nota in notas:
        media += nota
    media = float(media) / len(notas)
    media_turma += media
    print \&quot;Aluno:\&quot;,aluno
    print \&quot;Média:\&quot;,media
    print

media_turma = float(media_turma)/len(alunos)
print \&quot;Media da turma:\&quot;,media_turma</pre>
</div> Aqui bastou adicionar uma outra variável com o nome media_turma. Nela somamos todas as médias e depois dividimos pelo número de alunos.<br />
<br />
<br />
<b>3. Repita o exercício 2 informando quais alunos foram aprovados (média deve ser maior ou igual a 6). </b><br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:228px;">alunos = {'fulano':[6, 7, 5, 2], 'sicrano':[7, 8, 9, 8], 'beltrano':[10, 9, 10, 10]}
media_turma = 0
for aluno,notas in alunos.items():
    media = 0
    for nota in notas:
        media += nota
    media = float(media) / len(notas) 
    media_turma += media
    print \&quot;Aluno:\&quot;,aluno
    if media &lt; 6:
        print \&quot;Média:\&quot;,media,\&quot;(Reprovado)\&quot;
    else:
        print \&quot;Média:\&quot;,media
    print

media_turma = float(media_turma)/len(alunos)
print \&quot;Media da turma:\&quot;,media_turma</pre>
</div> Para resolver esse, bastou adicionar um if verificando se a nota é menor que 6 (de 0 até 5.9).<br />
<br />
Até mais...</blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/curso-de-python-correcao-estruturas-aninhadas-1877/</guid>
		</item>
		<item>
			<title>USBManager 1.0.0 Release</title>
			<link>http://under-linux.org/blogs/magnun/usbmanager-1-0-0-release-1874/</link>
			<pubDate>Fri, 05 Mar 2010 15:16:10 GMT</pubDate>
			<description><![CDATA[Hello all! After a long Release Candidate Freeze,  I'm happy to announce the USBManager 1.0.0 (https://launchpad.net/usbmanager) release. Who was...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Hello all! After a long Release Candidate Freeze,  I'm happy to announce the <a href="https://launchpad.net/usbmanager" target="_blank">USBManager 1.0.0</a> release. Who was following the 1.0-rc version will notice that there are few visibly changes. A great part of 1.0.0 improvements are &quot;under the hood&quot;, making the application more stable and fast. <br />
<br />
I the past months few bugs were reported, most were simple and didn't cause any glitch in USBManager, except for bug #423476. #423476. <br />
<br />
<div align="center"><img src="http://under-linux.org/members/magnun/albums/usbmanager/9669-icon_192.png" border="0" alt="" /><br />
</div> <br />
<br />
<font size="4"><b>Downloading and Installing</b></font><br />
<br />
The USBManager 1.0.0 version can be donwloaded <a href="https://launchpad.net/usbmanager/+download" target="_blank">here</a>. To install, unpack it and execute the following line:<br />
sudo ./setup.py install<br />
<br />
<br />
<font size="4"><b>Usage</b></font><br />
<br />
USBManager can be called through the Applications Menu, in the System section. Alternatively, you can call it with the line: usbmanager.<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f97/9686d1267801719-route-nao-quer-deletar-rota-.png" id="attachment9686" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9686d1267758457-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#55;&#45;&#109;&#97;&#105;&#110;&#119;&#105;&#110;&#100;&#111;&#119;&#46;.png
Visualizações:	128
Tamanho: 	24,6 KB
ID:      	9686" class="size_medium" /></a> </div><br />
<br />
Its possible to mount/umount the device clicking int the checkbox. To obtain more info about a certain device, just select it and click in the properties icon, or simply double click the device. In this window you can change the devices label.<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f97/9687d1267801741-route-nao-quer-deletar-rota-.png" id="attachment9687" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9687d1267758448-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#52;&#45;&#112;&#114;&#111;&#112;&#101;&#114;&#116;&#105;&#101;&#115;&#49;&#46;.png
Visualizações:	133
Tamanho: 	37,1 KB
ID:      	9687" class="align_left size_medium" /></a>  <a href="http://under-linux.org/attachments/f97/9688d1267801762-route-nao-quer-deletar-rota-.png" id="attachment9688" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9688d1267758451-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#53;&#45;&#112;&#114;&#111;&#112;&#101;&#114;&#116;&#105;&#101;&#115;&#50;&#46;.png
Visualizações:	132
Tamanho: 	36,4 KB
ID:      	9688" class="size_medium" /></a><br />
<br />
</div><br />
<br />
The &quot;tray feature&quot; can be used calling USBManager with the following line: usbmanager --tray<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f97/9689d1267801804-route-nao-quer-deletar-rota-.png" id="attachment9689" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9689d1267757512-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#52;&#45;&#116;&#114;&#97;&#121;&#95;&#105;&#99;&#111;&#110;&#46;.png
Visualizações:	136
Tamanho: 	12,5 KB
ID:      	9689" class="size_medium" /></a><br />
<br />
<div align="left">The 'system tray' gives you the feature to mount/umount the device with only two clicks. With this feature you're able to call the main USBManager interface very quickly.<br />
</div> <br />
<a href="http://under-linux.org/attachments/f97/9690d1267801821-route-nao-quer-deletar-rota-.png" id="attachment9690" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9690d1267757502-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#54;&#45;&#116;&#114;&#97;&#121;&#95;&#99;&#111;&#110;&#116;&#101;&#120;&#116;&amp;#.png
Visualizações:	138
Tamanho: 	12,1 KB
ID:      	9690" class="size_medium" /></a><br />
</div> <br />
A good suggestion is put USBManager to start on the tray with the operational system, so it can monitor all your USB device activity.<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f97/9691d1267801846-route-nao-quer-deletar-rota-.png" id="attachment9691" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9691d1267758445-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#51;&#45;&#111;&#108;&#100;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	135
Tamanho: 	27,8 KB
ID:      	9691" class="size_medium" /></a><br />
<a href="http://under-linux.org/attachments/f97/9692d1267801880-route-nao-quer-deletar-rota-.png" id="attachment9692" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9692d1267758454-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#54;&#45;&#111;&#108;&#100;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	138
Tamanho: 	31,5 KB
ID:      	9692" class="size_medium" /></a><br />
<a href="http://under-linux.org/attachments/f97/9693d1267801899-route-nao-quer-deletar-rota-.png" id="attachment9693" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9693d1267758443-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#50;&#45;&#111;&#108;&#100;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	134
Tamanho: 	34,3 KB
ID:      	9693" class="size_medium" /></a><br />
<br />
<br />
<br />
</div> Also, USBManager provide a way fast and simple way to format you USB devices. Just select the desired device and click in the format icon (broom).<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f97/9694d1267801935-route-nao-quer-deletar-rota-.png" id="attachment9694" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9694d1267757496-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#56;&#45;&#102;&#111;&#114;&#109;&#97;&#116;&#105;&#110;&#103;&#95;&#102;&#97;&amp;#.png
Visualizações:	133
Tamanho: 	23,7 KB
ID:      	9694" class="size_medium" /></a><br />
<br />
</div><br />
In order to have more formating options, I suggest you to install the following tools:  <b>mlabel</b>, <b>ntfsprogs</b> and <b>e2label.</b><br />
<br />
<br />
<br />
<br />
<font size="4"><b>Improvements</b></font><br />
<br />
Visibly the USBManager has the following improvements:<br />
<br />
<br />
<b>Better support for Red Hat based distributions (as Fedora). </b><blockquote>This new funcionality was resulted by the work on Bug #423476. As Red Hat based distributions does not use gksudo was created a routine to pre-select the proper command used to &quot;become root&quot;. Actually this routine searches for the following functions: gksudo, gksu and beesu. If none of those are supported by you Linux distribution, please report a bug <a href="https://bugs.launchpad.net/usbmanager" target="_blank">here</a>, inform which graphical front-end for sudo can be used and I'll provide the correction immediately.<br />
<br />
</blockquote><b>New Disk usage window design.  </b><blockquote>The Disk Usage window now has colored bars, used to highlight the biggest files and folders. Also, a device macro analysis was added, providing and overview of the total number of files, average size of files, total number of folders and average size of folders.<br />
<br />
</blockquote><div align="center"><a href="http://under-linux.org/attachments/f97/9695d1267801982-route-nao-quer-deletar-rota-.png" id="attachment9695" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9695d1267757522-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#50;&#45;&#100;&#105;&#115;&#107;&#95;&#117;&#115;&#97;&#103;&#101;&#46;.png
Visualizações:	146
Tamanho: 	87,5 KB
ID:      	9695" class="size_medium" /></a><br />
<br />
<br />
</div><b>EXT File System formating support. </b><blockquote>USBManager 1.0.0 supports formating for the following file systems: FAT16, FAT32, NTFS, EXT2, EXT3 e EXT4.<br />
<br />
</blockquote><div align="center"><a href="http://under-linux.org/attachments/f97/9696d1267801997-route-nao-quer-deletar-rota-.png" id="attachment9696" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9696d1267757525-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#49;&#45;&#102;&#111;&#114;&#109;&#97;&#116;&#105;&#110;&#103;&#95;&#101;&#120;&amp;.png
Visualizações:	132
Tamanho: 	24,8 KB
ID:      	9696" class="size_medium" /></a><br />
<br />
<br />
</div><b>Smart umounting.</b><blockquote>The device is automatically umounted before changing the device label.<br />
</blockquote><b>More notifications.</b><blockquote> Some more new notifications were added in 1.0.0. Ex: Umounted device notification.<br />
<br />
</blockquote><div align="center"><a href="http://under-linux.org/attachments/f97/9697d1267802027-route-nao-quer-deletar-rota-.png" id="attachment9697" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9697d1267757499-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#55;&#45;&#110;&#101;&#119;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	133
Tamanho: 	28,1 KB
ID:      	9697" class="align_left size_medium" /></a> <a href="http://under-linux.org/attachments/f97/9698d1267802054-route-nao-quer-deletar-rota-.png" id="attachment9698" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9698d1267757510-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#53;&#45;&#110;&#101;&#119;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	134
Tamanho: 	32,9 KB
ID:      	9698" class="size_medium" /></a><br />
<br />
<br />
</div>The most important non-visual improvements are highlighted below:<br />
<br />
<b>GOBjects Signals</b><blockquote> All objects inside USBManager communicate with signals, reducing the usage of pointers nad bringing more code flexibility.<br />
</blockquote><b>On demand analysis</b><blockquote>The Disk Usage tool was modified to provide file/folder scanning and analysis only when a folder is selected. This modification was made to reduce the Disk Usage Tool startup time and making it more fast and user friendly.<br />
</blockquote><b>Community translations:</b><blockquote> USBManager started using Rosetta, <a href="https://translations.launchpad.net/usbmanager" target="_blank">launchpad's translation tool</a>. With this, the USBManager translations can be made trough the Web without the need to install some additional software. The translated strings are sporadicly merged into the USBManager's code.<br />
</blockquote><font size="4"><b><br />
More translations</b></font><br />
Further on Brazilian Portuguese translation were added more 5 languages (thanks for the lanchpad community contributions):<br />
<ul><li> Dutch</li>
<li>French</li>
<li>German</li>
<li>Russian</li>
<li>Spanish</li>
</ul><div align="center"> <a href="http://under-linux.org/attachments/f97/9699d1267802116-route-nao-quer-deletar-rota-.png" id="attachment9699" rel="Lightbox_1874" ><img src="http://under-linux.org/attachments/f97/9699d1267800267-route-nao-quer-deletar-rota-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#56;&#51;&#45;&#116;&#114;&#97;&#100;&#117;&#99;&#97;&#111;&#46;.png
Visualizações:	133
Tamanho: 	6,6 KB
ID:      	9699" class="size_medium" /></a> </div> <br />
Actually, there are unfinished translations for Thai (25% translated), Turkish (84% translated) and Arabic (23% translated).<br />
<br />
<br />
<br />
<font size="4"><b>Fixed Bugs</b></font><br />
<br />
&quot;Minor bugs&quot; corrections:<br />
<ul><li>#413438 -  Details in the README</li>
<li>#413995 -  Renaming of the .desktop file</li>
<li>#494026 -  &quot;Error&quot; repeatedly spelled as &quot;Erro&quot;</li>
</ul><br />
&quot;Average bugs&quot; corrections:<br />
<ul><li>#414003 - Wrong script end-of-line-encoding</li>
</ul><br />
&quot;Critical bugs&quot; corrections:<br />
<ul><li>#423476 -  Umounting fail</li>
</ul> <br />
<font size="4"><b>Community Thanks:</b></font><br />
<br />
Despite I'm the only one developing USBManager, I must thank to some people in the community to help me concluding this job. I must thanks for anyone that helped me spreading my app through the Web and everyone that reported some bug or errors in this project.<br />
<br />
A special thank to <b>Fabian Affolter</b> for helping me improve this project with suggestions and for packing it to Fedora.<br />
<br />
<b>Arabic translations: </b>Nizar Kerkeni<br />
<b>Dutch translations: </b>Donkade and cumulus007<br />
<b>French translations: </b>Guillaume Mazoyer, Nicolas Delvaux, Nizar Kerkeni, Pascal Lemazurier and Sorkin.<br />
<b>German translations:</b> BBO, Fabian Affolter, Fred Seidemann, Georg Engelmann and mogli.<br />
<b>Russian translations:</b> Nikolay Edigaryev, Petron, Sergey Sedov and vsink.<br />
<b>Spanish translations:</b> Demuxer, Monkey, Paco Molinero, guillemsster and kaeltas. <br />
<b>Thai translations:</b> Krit Marukawisutthigul.<br />
<b>Turkish  translations:</b> zeugma</blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/usbmanager-1-0-0-release-1874/</guid>
		</item>
		<item>
			<title>Lançamento do USBManager 1.0.0</title>
			<link>http://under-linux.org/blogs/magnun/lancamento-do-usbmanager-1-0-0-1873/</link>
			<pubDate>Fri, 05 Mar 2010 14:49:35 GMT</pubDate>
			<description>Olá pessoal! Após um bom tempo como Release Candidate, tenho o prazer de anunciar o USBManager 1.0.0 (https://launchpad.net/usbmanager). O pessoal...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Olá pessoal! Após um bom tempo como Release Candidate, tenho o prazer de anunciar o <a href="https://launchpad.net/usbmanager" target="_blank">USBManager 1.0.0</a>. O pessoal que acompanhou a versão 1.0-rc vai perceber que, visivelmente, poucos alterações foram feitas. A maioria das mudanças foram realizadas &quot;debaixo do capô&quot;, para deixar o aplicativo mais estável e rápido. <br />
<br />
Nesses meses foram reportados poucos bugs, a maioria simples e que não impactavam no funcionamento do aplicativo, com excessão do bug #423476. <br />
<br />
<div align="center"><img src="http://under-linux.org/members/magnun/albums/usbmanager/9669-icon_192.png" border="0" alt="" /><br />
</div> <br />
<br />
<font size="4"><b>Downloading e instalação</b></font><br />
<br />
O USBManager 1.0.0 pode ser baixado <a href="https://launchpad.net/usbmanager/+download" target="_blank">aqui</a>. Para instalar, descompacte o arquivo e execute a seguinte linha:<br />
sudo ./setup.py install<br />
<br />
<font size="4"><b>Utilização</b></font><br />
<br />
O USBManager pode ser utilizado através do menu Aplicações-&gt;Sistema. Alternativamente, você pode chamá-lo com o comando: usbmanager. <br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f89/9671d1267799719-soft-igual-ambiente-de-rede-.png" id="attachment9671" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9671d1267758457-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#55;&#45;&#109;&#97;&#105;&#110;&#119;&#105;&#110;&#100;&#111;&#119;&#46;.png
Visualizações:	123
Tamanho: 	24,6 KB
ID:      	9671" class="size_medium" /></a> </div><br />
<br />
É possível montar e desmontar o dispositivo clicando no checkbox. Para Obter mais informações sobre um dispositivo, basta selecioná-lo e clicar no ícone de propriedade (catraca), ou simplesmente um duplo clique sobre o dispositivo. Nessa janela também é possível alterar o label do dispositivo.<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f89/9672d1267799747-soft-igual-ambiente-de-rede-.png" id="attachment9672" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9672d1267758448-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#52;&#45;&#112;&#114;&#111;&#112;&#101;&#114;&#116;&#105;&#101;&#115;&#49;&#46;.png
Visualizações:	122
Tamanho: 	37,1 KB
ID:      	9672" class="align_left size_medium" /></a>   <a href="http://under-linux.org/attachments/f89/9673d1267799764-soft-igual-ambiente-de-rede-.png" id="attachment9673" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9673d1267758451-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#53;&#45;&#112;&#114;&#111;&#112;&#101;&#114;&#116;&#105;&#101;&#115;&#50;&#46;.png
Visualizações:	122
Tamanho: 	36,4 KB
ID:      	9673" class="size_medium" /></a><br />
<br />
<br />
</div><br />
<br />
A &quot;função systemtray&quot; pode ser usada chamando o USBManager com a seguinte linha: usbmanager --tray<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f89/9674d1267799785-soft-igual-ambiente-de-rede-.png" id="attachment9674" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9674d1267757512-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#52;&#45;&#116;&#114;&#97;&#121;&#95;&#105;&#99;&#111;&#110;&#46;.png
Visualizações:	121
Tamanho: 	12,5 KB
ID:      	9674" class="align_center size_medium" /></a><br />
<br />
<div align="left">O 'system tray' te dá a possibilidade de montar e desmontar os dispositivos com 2 cliques. Com ele também é possível chamar a interface do USBManager rapidamente.<br />
</div> <br />
<a href="http://under-linux.org/attachments/f89/9675d1267799809-soft-igual-ambiente-de-rede-.png" id="attachment9675" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9675d1267757502-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#54;&#45;&#116;&#114;&#97;&#121;&#95;&#99;&#111;&#110;&#116;&#101;&#120;&#116;&amp;#.png
Visualizações:	121
Tamanho: 	12,1 KB
ID:      	9675" class="size_medium" /></a><br />
</div> <br />
Uma boa sugestão é configurar o USBManager para inicializar no system tray juntamente com o sistema operacional, desta forma ele irá monitorar todas as atividades de dispositivos USB.<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f89/9676d1267799839-soft-igual-ambiente-de-rede-.png" id="attachment9676" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9676d1267758445-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#51;&#45;&#111;&#108;&#100;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	119
Tamanho: 	27,8 KB
ID:      	9676" class="size_medium" /></a><br />
<br />
<a href="http://under-linux.org/attachments/f89/9677d1267799860-soft-igual-ambiente-de-rede-.png" id="attachment9677" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9677d1267758454-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#54;&#45;&#111;&#108;&#100;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	125
Tamanho: 	31,5 KB
ID:      	9677" class="size_medium" /></a><br />
<br />
<a href="http://under-linux.org/attachments/f89/9678d1267799891-soft-igual-ambiente-de-rede-.png" id="attachment9678" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9678d1267758443-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#53;&#50;&#45;&#111;&#108;&#100;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	121
Tamanho: 	34,3 KB
ID:      	9678" class="size_medium" /></a><br />
<br />
<br />
<br />
</div> Além de tudo isso, o USBManager ainda te dá a possibilidade de formatar dispositivos. Basta selecionar o dispositivo desejado e clicar na 'vassoura'.<br />
<br />
<div align="center"><a href="http://under-linux.org/attachments/f89/9679d1267799919-soft-igual-ambiente-de-rede-.png" id="attachment9679" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9679d1267757496-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#56;&#45;&#102;&#111;&#114;&#109;&#97;&#116;&#105;&#110;&#103;&#95;&#102;&#97;&amp;#.png
Visualizações:	122
Tamanho: 	23,7 KB
ID:      	9679" class="size_medium" /></a><br />
<br />
</div><br />
Para ter mais possibilidades de formatação, sugerimos a instalação das ferramentas <b>mlabel</b>, <b>ntfsprogs</b> e <b>e2label.</b><br />
<br />
<br />
<br />
<br />
<font size="4"><b>Melhoramentos</b></font><br />
<br />
Visivelmente o USBManager apresenta as seguintes novas funcionalidades:<br />
<br />
<br />
<b>Melhor suporte para distribuições baseadas em Red Hat (como o Fedora). </b><blockquote>Essa funcionalidade é resultado da correção do Bug #423476. Distribuições Red Hat não possui o gksudo, com isso foi criada uma rotina para pre-selecionar a função de credenciamento a ser utilizada. Atualmente a rotina busca as funções gksudo, gksu e beesu. Se sua distribuição não suporta nenhuma destas, reporte um bug <a href="https://bugs.launchpad.net/usbmanager" target="_blank">aqui</a> informando qual função de credenciamento pode ser utilizada que eu providenciarei a correção imediatamente.<br />
<br />
</blockquote><b>Novo design da janela de análise de utilização de disco.  </b><blockquote>Agora ela possui barras coloridas para ressaltar os arquivos que mais ocupam espaço do dispositivo, além de uma disponibilizar uma  macro análise do dispositivo informando, numero total de arquivos, tamanho médio de arquivo, numero total de pastas e tamanho médio de pastas.<br />
<br />
</blockquote><div align="center"><a href="http://under-linux.org/attachments/f89/9670d1267799657-soft-igual-ambiente-de-rede-.png" id="attachment9670" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9670d1267757522-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#50;&#45;&#100;&#105;&#115;&#107;&#95;&#117;&#115;&#97;&#103;&#101;&#46;.png
Visualizações:	127
Tamanho: 	87,5 KB
ID:      	9670" class="size_medium" /></a><br />
<br />
</div><b>Suporte ao formato do tipo EXT. </b><blockquote>Agora o USBManager suporta os seguintes formatos: FAT16, FAT32, NTFS, EXT2, EXT3 e EXT4.<br />
<br />
</blockquote><div align="center"><a href="http://under-linux.org/attachments/f89/9680d1267799942-soft-igual-ambiente-de-rede-.png" id="attachment9680" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9680d1267757525-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#49;&#45;&#102;&#111;&#114;&#109;&#97;&#116;&#105;&#110;&#103;&#95;&#101;&#120;&amp;.png
Visualizações:	122
Tamanho: 	24,8 KB
ID:      	9680" class="size_medium" /></a><br />
<br />
<br />
</div><b>Desmontagem inteligente.</b><blockquote> Agora, antes de mudar o label do dispositivo, o USBManager automaticamente desmonta o dispositivo correspondente.<br />
</blockquote><b>Mais notificações</b><blockquote> Algumas novas notificações como quando um dispositivo é desmontado.<br />
<br />
</blockquote><div align="center"><a href="http://under-linux.org/attachments/f89/9681d1267800106-soft-igual-ambiente-de-rede-.png" id="attachment9681" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9681d1267757510-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#53;&#45;&#110;&#101;&#119;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	120
Tamanho: 	32,9 KB
ID:      	9681" class="align_left size_medium" /></a>  <a href="http://under-linux.org/attachments/f89/9682d1267800118-soft-igual-ambiente-de-rede-.png" id="attachment9682" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9682d1267757499-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#52;&#55;&#45;&#110;&#101;&#119;&#95;&#110;&#111;&#116;&#105;&#102;&#105;&#99;&#97;&amp;#.png
Visualizações:	123
Tamanho: 	28,1 KB
ID:      	9682" class="size_medium" /></a><br />
<br />
<br />
</div> As mudanças não visíveis mais importantes são descritas a baixo:<br />
<br />
<b>Sinais GOBjects</b><blockquote> Todos os objetos dentro do USBManager se comunicam através de sinais, reduzindo o uso de ponteiros e trazendo mais flexibilidade ao código.<br />
</blockquote><b>Análise sob demanda</b><blockquote> A ferramenta da análise de disco foi modificada para escanear e analisar o conteúdo das pastas somente quando esta pasta é expandida, tornando o tempo de inicialização dessa função muito mais rápida.<br />
</blockquote><b> Traduções cooperativas:</b><blockquote> O USBManager agora utiliza o Rosetta, ferramenta de <a href="https://translations.launchpad.net/usbmanager" target="_blank">tradução do Lanchpad</a>, com isso as traduções podem ser feitas pela Web, sem a necessidade de instalar nenhum programa adicional. As traduções, de tempos em tempos, incluídas dentro da base de código do USBManager automaticamente. <br />
</blockquote><font size="4"><b>Mais Traduções</b></font><br />
Além das línguas inglesas e português brasileiro, o USBManager está disponível (graças as contribuições dos usuários do Launchpad) em mais 5 línguas:<br />
<ul><li> Holandês</li>
<li> Francês</li>
<li> Alemão</li>
<li> Russo</li>
<li> Espanhol</li>
</ul><div align="center"> <a href="http://under-linux.org/attachments/f89/9684d1267800312-soft-igual-ambiente-de-rede-.png" id="attachment9684" rel="Lightbox_1873" ><img src="http://under-linux.org/attachments/f89/9684d1267800267-soft-igual-ambiente-de-rede-.png" border="0" alt="Clique na imagem para uma versão maior

Nome:	         &#57;&#54;&#56;&#51;&#45;&#116;&#114;&#97;&#100;&#117;&#99;&#97;&#111;&#46;.png
Visualizações:	121
Tamanho: 	6,6 KB
ID:      	9684" class="size_medium" /></a><br />
</div> <br />
Atualmente estão sendo feitas traduções para Tailandês (25% traduzido), Turco (84% traduzido) e Árabe (23% traduzido).<br />
<br />
<br />
<br />
<font size="4"><b>Bugs Corrigidos</b></font><br />
<br />
Lista de correção de &quot;Bugs leves&quot;:<br />
<ul><li> #413438 - Detalhamento do arquivo README</li>
<li> #413995 - Renomear o arquivo .desktop para ser compativel com o resto do projeto</li>
<li> #494026 - Erros de digitação de algumas palavras</li>
</ul> <br />
Lista de correção de &quot;Bugs médios:<br />
<ul><li> #414003 - Erro de codificação de arquivos</li>
</ul> <br />
<br />
Lista de correção de &quot;Bugs importantes&quot;:<br />
<ul><li> #423476 - Desmontar o volume resultava em falhas (para distribuições baseadas em Red Hat)</li>
</ul> <br />
<br />
<font size="4"><b> Agradecimentos</b></font><br />
<br />
Apesar do USBManager ser desenvolvido exclusivamente por mim, tenho que agradecer a algumas pessoas pela realização desse trabalho. Deve agradecer, por exemplo, a todos que ajudaram a espalhar esse meu aplicativo pela Web e a todos que reportaram bugs e erros no meu projeto.<br />
<br />
Um agradecimento especial ao <b>Fabian Affolter</b> por me ajudar a melhorar meu projeto com sugestões e por empacota-lo para o Fedora. Em breve estarei disponibilizando um pacote do USBManager para Ubuntu.<br />
<br />
<b> Tradução para o Árabe:</b> Nizar Kerkeni<br />
<b> Tradução para o Holandês:</b> Donkade e cumulus007<br />
<b>Tradução para o Francês: </b>Guillaume Mazoyer, Nicolas Delvaux, Nizar Kerkeni, Pascal Lemazurier e Sorkin.<br />
<b>Tradução para o Alemão: </b>BBO, Fabian Affolter, Fred Seidemann, Georg Engelmann e mogli.<br />
<b>Tradução para o Russo: </b>Nikolay Edigaryev, Petron, Sergey Sedov e vsink.<br />
<b>Tradução para o Espanhol: </b>Demuxer, Monkey, Paco Molinero, guillemsster e kaeltas. <br />
<b>Tradução para o Tailandês: </b>Krit Marukawisutthigul.<br />
<b>Tradução para o Turco: </b>zeugma</blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/lancamento-do-usbmanager-1-0-0-1873/</guid>
		</item>
		<item>
			<title><![CDATA[[Curso de Python] A função range]]></title>
			<link>http://under-linux.org/blogs/magnun/curso-de-python-funcao-range-1862/</link>
			<pubDate>Fri, 26 Feb 2010 13:32:23 GMT</pubDate>
			<description>Antes de prosseguir leia os artigos anteriores aqui (http://under-linux.org/blogs/magnun/curso-de-python/). 
 
Olá pessoal!  
 
Dando continuidade ao...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><p class="alert2">Antes de prosseguir leia os artigos anteriores <a href="http://under-linux.org/blogs/magnun/curso-de-python/" target="_blank">aqui</a>. </p><br />
<br />
Olá pessoal! <br />
<br />
Dando continuidade ao estudo da estrutura for vamos ver uma função muito utilizada em cojuto com o for: a função range<br />
<br />
Como brinde, devido a uma dúvida postada nos comentários, vamos ver como fazer combinações em Python. <br />
<br />
<p class="redbox"> <font size="4"><b>A função range</b></font> </p><br />
<br />
Muitas vezes, junto com o for, é necessário criar uma lista de valores, para isso utilizamos a função range. A função range, gera um lista de valores de acordo com os argumentos passados para ela. Segue um exemplo básico:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:48px;">&gt;&gt;&gt; range(10)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</pre>
</div> Ao especificar somente um valor, a função range retorna uma lista de número. Diferente do que imaginamos, ela não retorna uma lista até o número especificado (nesse caso, de 0 a 10) mas sim um intervalo que se inicia no zero e termina no número inteiro que antecede o número especificado. na notação matemática para intervalos, a função range do exemplo anterior criaria o seguinte intervalo: [0,10). Isto é, um intervalo fechado à esquerda e aberto à direita. <br />
<br />
É possível alterar o início do intervalo, basta adicionar mais uma argumento. Mesmo alterando o início, o intervalo gerado pelo range sempre será fechado à direita e aberto à esquerda. Um pequeno exemplo:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:108px;">&gt;&gt;&gt; range(1,10)
[1, 2, 3, 4, 5, 6, 7, 8, 9]
&gt;&gt;&gt; range(5,10)
[5, 6, 7, 8, 9]
&gt;&gt;&gt; range(-5,10)
[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
&gt;&gt;&gt;</pre>
</div> Também é possível especificar o &quot;passo&quot; do intervalo, ou seja o valor de incremento:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">&gt;&gt;&gt; range(-6,6,2)
[-6, -4, -2, 0, 2, 4]
&gt;&gt;&gt;</pre>
</div> No exemplo acima, utilizamos um incremento de 2, desta forma &quot;pulamos&quot; de 2 em 2.<br />
<br />
O nosso colega Jockerman pediu uma ajuda para re-escrever o seguinte código C em Python:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:180px;">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;

main(){

    int x,y;

    for(x=1; x&lt;=10;x++){
        for(y=x+1;y&lt;=10;++y){
            printf(\&quot;%d, %d\n\&quot;, x,y);
        }
    }
}</pre>
</div> Esse trecho de código é utilizado para gerar pares de numeros não repetidos. Um trecho da execusão desse código em C:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:192px;">1, 2
1, 3
1, 4
1, 5
1, 6
1, 7
1, 8
1, 9
1, 10
2, 3
2, 4
2, 5
2, 6
2, 7</pre>
</div> Vamos reescrever esse código para Python...<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">for x in range(1,11):
    for y in range(x+1,11):
        print '%i, %i'%(x,y)</pre>
</div> Podemos ver que a unica diferença entre os códigos é a ausência de declaração de variáveis, a necessidade da função range (que faz o papel de x=1; x&lt;=10;x++) e que no range temos que especificar o final como 11. Segue um trecho da saída gerada pela execução desse código:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:192px;">1, 2
1, 3
1, 4
1, 5
1, 6
1, 7
1, 8
1, 9
1, 10
2, 3
2, 4
2, 5
2, 6
2, 7</pre>
</div> Mas o mais legal de tudo é a facilidade que o Python provê aos seus programadores. Esse problema citado pelo nosso colega, é uma combinação simples de 2 em 2. Então, porque perder tempo pensando em como fazer esses fors? Gaste sua massa cinzenta em outros problemas, use a biblioteca padrão do Python:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:72px;">from itertools import combinations

for x,y in combinations(range(1,11), 2):
    print '%i, %i'%(x,y)</pre>
</div> Segue a saída completa gerada pela execução desse código:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:372px;">1, 2
1, 3
1, 4
1, 5
1, 6
1, 7
1, 8
1, 9
1, 10
2, 3
2, 4
2, 5
2, 6
2, 7
2, 8
2, 9
2, 10
3, 4
3, 5
3, 6
3, 7
3, 8
3, 9
3, 10
4, 5
4, 6
4, 7
4, 8
4, 9
4, 10
5, 6
5, 7
5, 8
5, 9
5, 10
6, 7
6, 8
6, 9
6, 10
7, 8
7, 9
7, 10
8, 9
8, 10
9, 10</pre>
</div> </blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/curso-de-python-funcao-range-1862/</guid>
		</item>
		<item>
			<title>Quantos porcos e quantas galinhas?</title>
			<link>http://under-linux.org/blogs/magnun/quantos-porcos-e-quantas-galinhas-1856/</link>
			<pubDate>Tue, 23 Feb 2010 19:18:32 GMT</pubDate>
			<description>Hoje eu estava lendo alguns sites através do Google Reader e dentre todos os assuntos um se destacou. Foi um post do Sérgio Luiz do blog Vivaotux...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Hoje eu estava lendo alguns sites através do Google Reader e dentre todos os assuntos um se destacou. Foi um post do Sérgio Luiz do blog <a href="http://vivaotux.blogspot.com" target="_blank">Vivaotux</a>. <a href="http://vivaotux.blogspot.com/2010/02/quantos-porcos-e-quantas-galinhas.html" target="_blank">Nesse post</a> ele apresenta o seguinte problema:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_quote">
		<div class="quote_container">
			<div class="bbcode_quote_container"></div>
			
				 Um fazendeiro tem um bando de porcos e um bando de galinhas. Ele sai para o terreiro e observa 20 cabeças e 56 pernas. Quantos porcos e quantas galinhas que ele tem?
			
		</div>
	</div>
</div> O Sérgio apresentou uma solução em Python onde ele utilizava a 'força bruta' para achar a solução. Achei a solução muito bem elaborada, eu não teria conseguido pensado em algo assim! Confiram o código ao vivo no post dele <a href="http://vivaotux.blogspot.com/2010/02/quantos-porcos-e-quantas-galinhas.html" target="_blank">aqui</a>. Nos comentários deixei outra possibilidade de solução, e pensando agora, enquanto escrevo esse post, percebi que existe terceira forma de resolver esse problema! <br />
<br />
Vamos primeiro abordar o problema...<br />
<br />
Enquanto eu lia o código, me lembrei das aulas de álgebra linear e calculo numérico e pense: deve ter uma maneira mais direta de se resolver isso. Pegando o problema do início, o que temos é um sistema de 2 equações e 2 variáveis:<br />
<br />
equação 1: numero_de_galinhas + numero_de_porcos = numero_de_cabecas<br />
equação 2: 2*numero_de_galinhas + 4*numero_de_porcos = numero_de_pernas<br />
<br />
Para ser mais matemático, vamos dizer que o numero de galinhas é X e o numero de porcos é Y. Para simplificar, vamos pegar o numero de pernas e cabeças dados no exemplo: 56 e 20, respectivamente. Reescrevendo a equação, e destacando as constantes unitárias temos:<br />
<br />
<br />
equação 1: 1*X + 1*Y = 20<br />
equação 2: 2*X + 4*Y = 56<br />
<br />
<br />
As duas maneira que consegui pensar podem ser classificadas como simples e complexa. Vamos pela complexa primeiro...<br />
<br />
<br />
<br />
<font size="4"><b> Resolução de sistemas lineares através de matrizes</b></font><br />
<br />
Um sistema linear pode ser representado por matrizes da seguinte forma:<br />
<br />
[Coeficientes]*[Variaveis] = [Constantes]<br />
<br />
Isto é, a matriz de coeficientes multiplicada pela matriz de variáveis é igual a matriz de constantes, onde a matriz de coeficientes é composta pelos coeficientes das variáveis X e Y, a matriz de variáveis é composta pelos próprios X e Y e a matriz de constantes é compostas pelas constantes após o sinal de igual. Dessa forma temos o seguintes:<br />
<br />
Matriz coeficientes:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">| 1     1 |
|         |
| 2     4 |</pre>
</div> Matriz Variáveis:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">| X |
|   |
| Y |</pre>
</div> Matriz Constantes:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">| 20 |
|    |
| 56 |</pre>
</div> Juntando tudo temos:<br />
Matriz coeficientes:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">| 1     1 |   | X |   | 20 |
|         | * |   | = |    |
| 2     4 |   | Y |   | 56 |</pre>
</div> Para resolver o sistema tudo que temos que fazer é isolar a matriz das variáveis:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">| X |   | 1   1 |-1   | 20 |
|   | = |       |  *  |    |
| Y |   | 2   4 |     | 56 |</pre>
</div> Isto é, a Matriz das variáveis é igual à multiplicação entre a matriz dos coeficientes inversa (por isso o -1) e a matriz das constantes.<br />
<br />
Agora vem a mágica! Para fazer isso em Python só precisamos de um import! Segue o código:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:276px;">from scipy import matrix

def resolve_fazenda(cabecas, pernas):
    # 1*galinhas + 1*porcos = cabecas
    # 2*galinhas + 4*porcos = pernas
    # Cria a matriz de coeficientes
    Mcoef = matrix([[ 1, 1], # Coeficiente da primeira equação
                    [ 2, 4]], # Coeficiente da segunda equação
                  )
    # Cria a matriz de constantes
    Mconst = matrix([[cabecas], [pernas]])
    # Calcula a multiplicação entre a matriz dos coeficientes inversa e a matriz das constantes
    # Aqui eu chamei ela de Matriz Solução
    Msolucao = Mcoef.getI()*Mconst
    # Apresenta a solução
    print 'Tem %s galinhas e %s porcos na fazenda!'%(float(Msolucao[0]), float(Msolucao[1]))


# Vamos fazer alguns testes!
resolve_fazenda(20, 56) #Tem 12.0 galinhas e 8.0 porcos na fazenda!
resolve_fazenda(21, 62) #Tem 11.0 galinhas e 10.0 porcos na fazenda!</pre>
</div> Ok, agora a forma simples...<br />
<br />
<br />
<br />
<font size="4"><b> Solução algébrica por isolamento </b></font><br />
<br />
Vamos retomar as equações (substituindo os valores constantes por C e P apra cabeças e pernas, respectivamente):<br />
equação 1:   X +   Y = c<br />
equação 2: 2*X + 4*Y = P<br />
<br />
Isolando o X na primeira equação obtemos:<br />
X = C - Y (equação 3)<br />
<br />
Substituindo o X a equação 2 obtemos:<br />
Y = (P/2) - C (equação 4)<br />
<br />
Agora usamos as equações 3 e 4 para resolver o problema:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:168px;">def resolve_fazenda2(cabecas, pernas):
    # Porcos = (Pernas/2) - Cabecas
    # Galinhas = Cabeças - Porcos
    porcos = float(pernas/2) - cabecas
    galinhas = cabecas - porcos
    # Apresenta a solução
    print 'Tem %s galinhas e %s porcos na fazenda!'%(galinhas, porcos)


# Vamos fazer alguns testes!
resolve_fazenda2(20, 56) #Tem 12.0 galinhas e 8.0 porcos na fazenda!
resolve_fazenda2(21, 62) #Tem 11.0 galinhas e 10.0 porcos na fazenda!</pre>
</div> Em ambos os exemplos, vale a pena adicionar testes se os valores encontrados são inteiros porque, com certeza, não faz sentido ter &quot;galinhas negativas&quot; e &quot;porcos negativos&quot; no resultado! <br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:108px;">&gt;&gt;&gt; resolve_fazenda(10, 20)
Tem 10.0 galinhas e 0.0 porcos na fazenda!
&gt;&gt;&gt; resolve_fazenda(11, 20)
Tem 12.0 galinhas e -1.0 porcos na fazenda!
&gt;&gt;&gt; resolve_fazenda(12, 20)
Tem 14.0 galinhas e -2.0 porcos na fazenda!
&gt;&gt;&gt;</pre>
</div> </blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/quantos-porcos-e-quantas-galinhas-1856/</guid>
		</item>
		<item>
			<title><![CDATA[[Curso de Python] Estruturas For Aninhadas]]></title>
			<link>http://under-linux.org/blogs/magnun/curso-de-python-estruturas-aninhadas-1853/</link>
			<pubDate>Mon, 22 Feb 2010 14:44:13 GMT</pubDate>
			<description>Antes de prosseguir leia os artigos anteriores aqui (http://under-linux.org/blogs/magnun/curso-de-python/). 
 
Olá pessoal!! Sei que sumi e demorei...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><p class="alert2">Antes de prosseguir leia os artigos anteriores <a href="http://under-linux.org/blogs/magnun/curso-de-python/" target="_blank">aqui</a>. </p><br />
<br />
Olá pessoal!! Sei que sumi e demorei para postar essa continuação! Peço desculpas a todos e garanto que vou retomar a regularidade das postagens. <br />
<br />
Sem mais delongas, vamos ao que interessa!<br />
<br />
<br />
<br />
<p class="redbox"> <b><font size="4">Estruturas For Aninhadas</font></b> </p><br />
<br />
Muitas vezes uma única estrutura for não é o suficiente para realizarmos um trabalho, para sanar isso utilizamos um aninhamento de estruturas for. Uma estrutura for aninhada nada mais é que &quot;um for dentro de outro for&quot;. <br />
<br />
Um aninhamento de 2 fors torna possível percorrer e analisar estruturas de duas dimensões. Um simples exemplo a baixo:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:132px;">listas_nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for lista_num in listas_nums:
    # For externo, responsável por percorrer pegar a lista de números dentro da lista
    print 'Encontrei a lista',lista_num
    print '   Essa lista é composta por:',
    for num in lista_num:
        # For interno, responsável por percorrer os números dentro de cada lista.
        print num,
    print ''</pre>
</div> Nesse exemplo, nosso for mais externo percorre o conteúdo da lista listas_nums, que são as seguintes listas: [1, 2, 3], [4, 5, 6] e [7, 8, 9]. O for mais interno é executado em cada uma dessas listas, dessa forma ele percorre o conteúdo (números) de cada lista. abaixo a saída produzida pelo código acima:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:96px;">Encontrei a lista [1, 2, 3]
   Essa lista é composta por: 1 2 3
Encontrei a lista [4, 5, 6]
   Essa lista é composta por: 4 5 6
Encontrei a lista [7, 8, 9]
   Essa lista é composta por: 7 8 9</pre>
</div> Esse tipo de abordagem é efetiva para uma série de problemas. Vamos ver agora alguns exemplos mais práticos, como por exemplo calcular a média dos valores de cada lista:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:120px;">listas_nums = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
for lista_num in listas_nums:
    tamanho = len(lista_num)
    soma = 0
    for num in lista_num:
        soma = soma + num
    media = float(soma)/tamanho
    print 'A média da lista', lista_num, 'é:',media</pre>
</div> Segue a saída gerada pelo código acima:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">A média da lista [1, 2, 3] é: 2.0
A média da lista [4, 5, 6] é: 5.0
A média da lista [7, 8, 9] é: 8.0</pre>
</div> <p class="redbox"> <b><font size="4">Exercícios </font></b></p><br />
Agora vou deixar alguns exercícios para vocês resolverem:<br />
<br />
1. O dicionário abaixo representa uma lista de alunos (chaves) e suas notas (valores). Percorra esse dicionário e calcule a média de cada aluno imprimindo o nome do aluno seguido de sua nota. <br />
alunos = {'fulano':[6, 7, 5, 2], 'sicrano':[7, 8, 9, 8], 'beltrano':[10, 9, 10, 10]}<br />
<br />
2. Repita o exercício 1 informando, ao final de tudo, a média da turma. <br />
<br />
3. Repita o exercício 2 informando quais alunos foram aprovados (média deve ser maior ou igual a 6).</blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/curso-de-python-estruturas-aninhadas-1853/</guid>
		</item>
		<item>
			<title><![CDATA[[Curso de Python] Entendendo o For]]></title>
			<link>http://under-linux.org/blogs/magnun/curso-de-python-entendendo-o-1833/</link>
			<pubDate>Wed, 10 Feb 2010 10:31:47 GMT</pubDate>
			<description>Antes de prosseguir leia os artigos anteriores aqui (http://under-linux.org/blogs/magnun/curso-de-python/). 
 
Olá pessoal! Hoje vamos entender mais...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font face="Arial"><font face="Arial"><p class="alert2">Antes de prosseguir leia os artigos anteriores <a href="http://under-linux.org/blogs/magnun/curso-de-python/" target="_blank">aqui</a>. </p><br />
</font></font><br />
<font face="Arial"><font face="Arial">Olá pessoal! Hoje vamos entender mais um pouco da estrutura for. Vamos começar a ver como o for faz a sua mágica e reduz (muito) o trabalho do desenvolvedor!<br />
<br />
<br />
</font></font> <font face="Arial"><font face="Arial"><p class="redbox"> <font size="4"><b>Entendendo o For</b></font> </p><br />
<br />
Como já foi comentado no último <i>post</i>, o for parece estranho para quem está acostumado com linguagens como C/C++ e Java. Nessas linguagens, é necessário informar ao <i>for </i>um limite, para que ele saiba quando parar. No <i>Python </i>ele simplesmente sabe quando parar, como isso é feito? <br />
<br />
O <i>For </i>funciona somente com objetos iteráveis, isto é, <i>strings </i>comuns, <i>strings</i> <i>unicode</i>, tuplas, listas, <i>byte arrays</i>, <i>sets </i>comuns, <i>frozen sets</i>, e dicionários. Alguns desses tipos ainda não foram abordados nesse curso por não terem um uso muito frequente.<br />
 <br />
Quando o <i>for </i>recebe um objeto iterável ele usa a função <i>iter </i>para criar um iterador. Um iterador funciona similar a um ponteiro indicando um objeto. Quando solicitamos a esse iterador o próximo objeto ele pula uma &quot;casa&quot; e retorna o próximo objeto. A baixo temos um exemplo dessa idéia:<br />
<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:252px;">&gt;&gt;&gt; frase = &quot;teste&quot;
&gt;&gt;&gt; ponteiro = iter(frase)
&gt;&gt;&gt; type(ponteiro)
&lt;type 'iterator'&gt;
&gt;&gt;&gt; ponteiro.next()
't'
&gt;&gt;&gt; ponteiro.next()
'e'
&gt;&gt;&gt; ponteiro.next()
's'
&gt;&gt;&gt; ponteiro.next()
't'
&gt;&gt;&gt; ponteiro.next()
'e'
&gt;&gt;&gt; ponteiro.next()
Traceback (most recent call last):
  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;
StopIteration
&gt;&gt;&gt;</pre>
</div> Ao solicitarmos o próximo objeto, após o final do objeto iterável, recebemos o erro &quot;<i>StopIteration</i>&quot;. Com esse erro o for sabe que deve parar a iteração. <br />
<br />
Todos os objetos possuem o mesmo comportamento no <i>for</i>, com exceção do dicionário:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:276px;">&gt;&gt;&gt; for item in ('abc', 'cde', 'efg'):
...  print 'item='+item
...
item=abc
item=cde
item=efg
&gt;&gt;&gt;
&gt;&gt;&gt; for numero in [1, 2, 3]:
...  print 'numero:',numero
...
numero: 1
numero: 2
numero: 3
&gt;&gt;&gt;
&gt;&gt;&gt; for album in {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995}:
...  print album
...
Gish
Mellon Collie
Siamese Dream
&gt;&gt;&gt;</pre>
</div> O <i>for </i>retorna somente as chaves de um dicionário, para obtermos o valor associado a aquela chave utilizamos '<i>slicing</i>':<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:120px;">&gt;&gt;&gt; smashing_pumpkins = {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995}
&gt;&gt;&gt; for album in smashing_pumpkins:
...  print 'O album',album,'foi lancado em',smashing_pumpkins[album]
...
O album Gish foi lancado em 1991
O album Mellon Collie foi lancado em 1995
O album Siamese Dream foi lancado em 1993
&gt;&gt;&gt;</pre>
</div> É possível também utilizar o método <i>items</i>, que cria uma lista de tuplas. Segue um exemplo para melhor entendimento:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:60px;">&gt;&gt;&gt; smashing_pumpkins.items()
[('Gish', 1991), ('Mellon Collie', 1995), ('Siamese Dream', 1993)]
&gt;&gt;&gt;</pre>
</div> Cada tuplas dentro da lista é um par chave/valor. Se utilizarmos isso dentro do for teremos um resultado bem diferente:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:132px;">&gt;&gt;&gt; smashing_pumpkins = {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995
}
&gt;&gt;&gt; for item in smashing_pumpkins.items():
...  print item
...
('Gish', 1991)
('Mellon Collie', 1995)
('Siamese Dream', 1993)
&gt;&gt;&gt;</pre>
</div> Agora o item a ser retornado passa a ser um tupla com a chave e o valor associado a ela. É possível utilizar o <i>slicing </i>para obter o nome do album e o ano de lançamento, mas existe também um abordagem mais organizada. Para uma melhor legibilidade do código, podemos fazer o '<i>unpack</i>' (desempacotar) da tupla. O <i>unpack </i>pode ser feito conforme abaixo:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:132px;">&gt;&gt;&gt; smashing_pumpkins = {'Gish':1991, 'Siamese Dream':1993, 'Mellon Collie':1995
}
&gt;&gt;&gt; for album,ano in smashing_pumpkins.items():
...  print 'O album',album,'foi lançado em',ano
...
O album Gish foi lançado em 1991
O album Mellon Collie foi lançado em 1995
O album Siamese Dream foi lançado em 1993
&gt;&gt;&gt;</pre>
</div> Dessa forma temos um código limpo, compacto e extremamente legível. Mesmo que ninguém saiba qual o conteúdo do dicionário <i>smashing_pumpkins</i>, ao ler o for, sabe que as chaves são os nomes dos albums e os valores são os anos de lançamento. <br />
</font></font></blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/curso-de-python-entendendo-o-1833/</guid>
		</item>
		<item>
			<title><![CDATA[[Curso de Python] Conhecendo o for... in...]]></title>
			<link>http://under-linux.org/blogs/magnun/curso-de-python-conhecendo-o-1800/</link>
			<pubDate>Wed, 27 Jan 2010 14:34:14 GMT</pubDate>
			<description>Antes de prosseguir leia os artigos anteriores aqui (http://under-linux.org/blogs/magnun/curso-de-python/). 
 
Olá pessoal! Hoje vamos ver mais uma...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><font face="Arial"><font face="Arial"><p class="alert2">Antes de prosseguir leia os artigos anteriores <a href="http://under-linux.org/blogs/magnun/curso-de-python/" target="_blank">aqui</a>. </p><br />
</font></font><br />
<font face="Arial"><font face="Arial">Olá pessoal! Hoje vamos ver mais uma modalidade de laço de repetição: <b>for</b>.</font></font><br />
  <br />
  <font face="Arial"><font face="Arial">Esse laço é o mais utilizado em Python. O laço <i>while</i> na verdade é utilizado somente em alguns casos especiais, que o <i>for </i>não conseguiria resolver. Vamos deixar de papo e ir logo ao assunto!</font></font><br />
<br />
<br />
<font face="Arial"><font face="Arial"><p class="redbox"> <font size="4"><b>Conhecendo o for... in...</b></font></p><br />
</font></font><font face="Arial"><font face="Arial"><br />
</font></font><br />
<font face="Arial"><font face="Arial">O laço <i>for</i>, diferente do laço <i>while</i>, não utiliza uma condição. Ele precisa somente de um argumento iterável e de uma variável para repassar o item de cada iteração. O for sempre trabalha em conjunto com a instrução in. A sua estrutura básica é a seguinte:</font></font><br />
  <div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:48px;">  <font face="Arial"><font face="Arial">for VARIAVEL in ITEM_ITERAVEL:</font></font>
  <font face="Arial"><font face="Arial">   FAZ_ALGO</font></font></pre>
</div>   <font face="Arial"><font face="Arial">Vamos a um exemplo no modo interativo do Python:</font></font><br />
  <div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:132px;">  <font face="Arial"><font face="Arial">&gt;&gt;&gt; lista = ['este', 'e', 'um', 'teste']</font></font>
  <font face="Arial"><font face="Arial">&gt;&gt;&gt; for item in lista:</font></font>
  <font face="Arial"><font face="Arial">...     print item</font></font>
  <font face="Arial"><font face="Arial">...</font></font>
  <font face="Arial"><font face="Arial">este</font></font>
  <font face="Arial"><font face="Arial">e</font></font>
  <font face="Arial"><font face="Arial">um</font></font>
  <font face="Arial"><font face="Arial">teste</font></font>
  <font face="Arial"><font face="Arial">&gt;&gt;&gt; </font></font></pre>
</div>   <font face="Arial"><font face="Arial">O laço <i>for</i>, para quem está acostumado com o <i>for </i>de C/C++, chega a ser um absurdo, algo irreal. Eu também tive essa sensação! Sugiro a todos fazer como eu fiz, aceitar que o for magicamente sabe onde a variável iteravel começa e termina. Dessa mesma forma sobre natural, a cada iteração o for pega um ítem da lista e joga dentro da variável item. </font></font><br />
  <br />
  <font face="Arial"><font face="Arial">Pronto, é assim que o for funciona. Ele reduz espantosamente o esforço do programador, identificando o inicio e o fim do objeto iterável e repassando cada item desse objeto em uma variável previamente prevista. Com o for você praticamente esquece que a função len() existe.</font></font><br />
  <br />
  <font face="Arial"><font face="Arial">O for serve também para fazer iteração em strings. Conforme abaixo:</font></font><br />
  <div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:276px;">  <font face="Arial"><font face="Arial">&gt;&gt;&gt; texto = \\&quot;este e um teste!\\&quot;</font></font>
  <font face="Arial"><font face="Arial">&gt;&gt;&gt; for letra in texto:</font></font>
  <font face="Arial"><font face="Arial">...     print '-&gt;',letra</font></font>
  <font face="Arial"><font face="Arial">...</font></font>
  <font face="Arial"><font face="Arial">-&gt; e</font></font>
  <font face="Arial"><font face="Arial">-&gt; s</font></font>
  <font face="Arial"><font face="Arial">-&gt; t</font></font>
  <font face="Arial"><font face="Arial">-&gt; e</font></font>
  <font face="Arial"><font face="Arial">-&gt;</font></font>
  <font face="Arial"><font face="Arial">-&gt; e</font></font>
  <font face="Arial"><font face="Arial">-&gt;</font></font>
  <font face="Arial"><font face="Arial">-&gt; u</font></font>
  <font face="Arial"><font face="Arial">-&gt; m</font></font>
  <font face="Arial"><font face="Arial">-&gt;</font></font>
  <font face="Arial"><font face="Arial">-&gt; t</font></font>
  <font face="Arial"><font face="Arial">-&gt; e</font></font>
  <font face="Arial"><font face="Arial">-&gt; s</font></font>
  <font face="Arial"><font face="Arial">-&gt; t</font></font>
  <font face="Arial"><font face="Arial">-&gt; e</font></font>
  <font face="Arial"><font face="Arial">-&gt; !</font></font>
  <font face="Arial"><font face="Arial">&gt;&gt;&gt; </font></font></pre>
</div>   <font face="Arial"><font face="Arial">Como podem ver podemos alterar livremente a variável para um nome que seja compatível a um item que estamos iterando. Por exemplo, se vamos iterar sobre uma lista de palavras, identificamos a variável como palavra. Se vamos iterar sobre uma lista que contêm todos os meses do ano, vamos utilizar uma variável com o nome mês, e assim sucessivamente.</font></font><br />
  <br />
  <font face="Arial"><font face="Arial">É isso ai pessoal. Por hoje é só! Vamos conhecer o for aos poucos.</font></font></blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/curso-de-python-conhecendo-o-1800/</guid>
		</item>
		<item>
			<title><![CDATA[[Curso de Python] Mais Sobre as Estruturas While]]></title>
			<link>http://under-linux.org/blogs/magnun/curso-de-python-mais-sobre-estruturas-while-1787/</link>
			<pubDate>Thu, 21 Jan 2010 10:44:39 GMT</pubDate>
			<description>Antes de prosseguir leia os artigos anteriores aqui (http://under-linux.org/blogs/magnun/curso-de-python/) 
 
Bom dia a todos! Finalmente, estamos...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore"><p class="alert2"> Antes de prosseguir leia os artigos anteriores <a href="http://under-linux.org/blogs/magnun/curso-de-python/" target="_blank">aqui</a> </p><br />
<br />
Bom dia a todos! Finalmente, estamos quase completando os estudos com a estrutura <i>while</i>. Já vimos praticamente todas as instruções que se aliam a ela: <i>continue</i>, <i>break</i> e o <i>else</i>.<br />
<br />
Vou mostrar hoje alguns exemplos da estrutura <i>while</i> de forma mais complexa e depois vou deixar alguns exercícios. Postem os resultados, ok?!<br />
<br />
<p class="redbox"><font size="4"><b>Mais Sobre as Estruturas While</b></font></p><br />
<br />
Agora que já conhecemos diversas instruções que alteram o comportamento da estrutura <i>while </i>vale a pena comparar sua utilidade. Vamos começar com um exemplo simples:<blockquote>1. Buscar a primeira ocorrência de uma letra dentro de uma <i>string</i> passada pelo usuário. Deve ser informada a posição dessa ocorrência ou, caso não exista uma ocorrência, deve ser impresso um texto informando que a letra buscada não foi encontrada.<br />
</blockquote>Vou resolver esse exercício de duas formas, uma será usando apenas o while, a outra será usando as instruções <i>continue</i>, <i>break</i> e <i>else</i>. No final iremos comparar os dois códigos.<br />
<br />
<b><u>Resolução 1</u></b><br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:372px;"># Recebe a string
texto = raw_input('Favor informar uma string: ')
# Recebe a letra que será buscada na string
letra = raw_input('Favor informar uma letra para buscarmos: ')

# Vamos verificar se por acaso o usuário não passou mais de uma
# letra. Para isso verificamos o comprimento com a função len.
if len(letra) &gt; 1:
    print 'Foi informado a palavra',letra,'.'
    # Pega somente a primeira letra da palavra
    letra = letra[0]
    print 'Sera considerado apenas a primeira letra:', letra


n = 0
encontrada = False
while n &lt; len(texto):
    # Pega a letra na posição n
    letra_texto = texto[n]
    # incrementa n para a próxima iteração do loop
    n = n + 1
    if letra_texto == letra:
        print 'encontrada a letra',letra,'na posicao',(n-1)
        # Prepara para parar o loop
        encontrada = True
    if encontrada:
        # Como o while testa se n é menor que o comprimento do texto,
        # para parar o while basta alterar n para o comprimento do text
        # dessa fora, essa será a última iteração do loop.
        n = len(texto)


if encontrada == False:
     # Se 'encontrada' é falso, quer dizer que não foi encontrada
     print 'Nao foi possivel encontrar a letra',letra
print '\n'</pre>
</div> Nesse exemplo, logo no início, eu fiz uma verificação para confirmar que o usuário tinha passado uma letra. Caso o tamanho de 'letra' fosse maior que zero teríamos o problema de comparar uma palavra com uma letra.<br />
<br />
A execução mostra o seguinte comportamento:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:216px;">$ ./busca_letra
Favor informar uma string: este e um teste
Favor informar uma letra para buscarmos: u
encontrada a letra u na posicao 7

$ ./busca_letra
Favor informar uma string: este e um teste
Favor informar uma letra para buscarmos: uma
Foi informado a palavra uma .
Sera considerado apenas a primeira letra: u
encontrada a letra u na posicao 7

$ ./busca_letra
Favor informar uma string: este e um teste
Favor informar uma letra para buscarmos: z
Nao foi possivel encontrar a letra z</pre>
</div> <b><u>Resolução 2</u></b><br />
Agora vamos ver como re-escrever o código acima utilizando as instruções que aprendemos:<br />
<div class="bbcode_container">
	<div class="bbcode_description">Código:</div>
	<pre class="bbcode_code" style="height:336px;"># Recebe a string
texto = raw_input('Favor informar uma string: ')
# Recebe a letra que será buscada na string
letra = raw_input('Favor informar uma letra para buscarmos: ')

# Vamos verificar se por acaso o usuário não passou mais de uma
# letra. Para isso verificamos o comprimento com a função len.
if len(letra) &gt; 1:
    print 'Foi informado a palavra',letra,'.'
    # Pega somente a primeira letra da palavra
    letra = letra[0]
    print 'Sera considerado apenas a primeira letra:', letra

n = 0
while n &lt; len(texto):
    # Pega a letra na posição n
    letra_texto = texto[n]
    # incrementa n para a próxima iteração do loop
    n = n + 1
    if letra_texto == letra:
        print 'encontrada a letra',letra,'na posicao',(n-1)
        # Vamos quebrar o while.
        break
else:
     # Só atingiremos caso o while tenha chegado ao fim
     print 'Nao foi possivel encontrar a letra',letra</pre>
</div> Podemos verificar, rapidamente, que o codigo reduziu de tamanho. Outra coisa é que utilizamos uma variável a menos, a variável 'encontrada'. Isso implica em menos memória e menos processamento para alocar e desalocar essa variável.<br />
<br />
Agora, analisando o código, pode surgir uma dúvida quanto ao <i>break</i> e o <i>else</i>. O <i>else </i>só é executado se o loop terminar todas as iterações. Como o <i>break</i> 'quebra' o loop quando a letra é encontrada, o else não é executado. Com isso fica fácil estruturar o programa para indicar que a letra não foi encontrada.<br />
<br />
<p class="yellowbox"><font size="4"><b>Exercícios</b></font> </p><br />
<br />
Agora uns exercícios para vocês. Tentem usar as instruções <i>continue</i>, <i>break</i> e <i>else</i> em todos os exemplos.<blockquote><b>1</b>: Fazer um programa que busca em um texto, passado pelo usuário, <b>todas as ocorrências</b> de uma letra. Caso não seja encontrado, informar que não foi encontrado a letra buscada.<br />
<b>2</b>: Fazer um programa que recebe palavras do usuário e informe o comprimento da palavra. O programa só deve para quando o usuário digitar a palavra 'pare'.<br />
<b>Desafio</b>: Criar um código que organize a seguinte lista: [3, 4, 2, 1, 5]<br />
</blockquote></blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/curso-de-python-mais-sobre-estruturas-while-1787/</guid>
		</item>
		<item>
			<title>França e Alemanha Recomendam a Suspensão do Uso do IE</title>
			<link>http://under-linux.org/blogs/magnun/franca-e-alemanha-recomendam-suspensao-do-uso-do-ie-1777/</link>
			<pubDate>Tue, 19 Jan 2010 14:21:15 GMT</pubDate>
			<description>Como consequência da declaração de que uma falha no IE foi utilizada para atacar as contas de e-mail do Google, os governos Francês e Alemão estão...</description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Como consequência da declaração de que uma falha no IE foi utilizada para atacar as contas de e-mail do Google, os governos Francês e Alemão estão recomendando aos seus cidadãos que deixem de usar o <b>IE 5, 6 e 7</b> nos sistemas operacionais <b><i>Windows</i><i>XP, Vista e 7.</i></b> <br />
<br />
<div align="center"><img src="http://under-linux.org/members/magnun/albums/logotipos/8732-ie.jpg" border="0" alt="" /><br />
</div> <br />
Na última sexta-feira, dia 15/01, a Secretaria Federal para Segurança na Tecnologia da Informação (BSI) alemã alertou os seus cidadão e desencorajou o uso do IE 6, 7 e 8 pois estes, mesmo navegando no &quot;modo seguro&quot; ou desabilitando <i>scripts</i>, possibilita a realização de ataques [1].<br />
<br />
O Centro de Avaliação Governamental de Resposta e Tratamento de Ataques de Informática (CERTA) se juntou ao governo alemão nessa segunda-feira, dia 18/01, ao orientar os cidadãos franceses a buscarem outras alternativas ao IE [2].<br />
<br />
Cliff Evans, chefe de segurança e privacidade do IE, em uma entrevista à BBC [2] declarou que todos devem migrar para o IE8 pois este é o &quot;navegador mais <b>seguro do mercado</b>&quot; e que até o momento só existem códigos maliciosos para o IE6. Cliff Evans afirmou também que &quot;o risco é mínimo&quot; pois para ser atacado o usuário deve visitar uma página maliciosa e &quot;existem poucas dessas páginas pela internet&quot;<br />
<br />
<br />
Depois de anos de campanha para que o IE fosse abandonado por diversos motivos e foi necessário algo maior para fazer com que as pessoas abram os olhos e vejam que não era apenas bobeira de <i>nerds</i> e <i>geeks</i>. Será que dessa vez o IE morre de vez?<br />
<br />
<br />
<font size="4"><b>Saiba Mais:</b></font><br />
[1] <a href="http://www.h-online.com/security/news/item/Warning-over-using-Internet-Explorer-from-German-Government-as-exploit-goes-public-906173.html" target="_blank">Warning over using Internet Explorer from German Government as exploit goes public - The H Security: News and Features</a><br />
[2] <a href="http://news.bbc.co.uk/2/hi/technology/8465038.stm" target="_blank">BBC News - France joins Germany warning against Internet Explorer</a><br />
<br />
<br />
<font size="4"><b>Notícias Relacionadas:</b></font><br />
- <a href="http://under-linux.org/blogs/magnun/ie-foi-vetor-para-ataque-ao-google-1770/" target="_blank">IE Foi Vetor Para Ataque ao Google</a></blockquote>

 ]]></content:encoded>
			<dc:creator>Magnun</dc:creator>
			<guid isPermaLink="true">http://under-linux.org/blogs/magnun/franca-e-alemanha-recomendam-suspensao-do-uso-do-ie-1777/</guid>
		</item>
	</channel>
</rss>
