Pesquisar neste blog

segunda-feira, 19 de novembro de 2012

F123 - Software para deficientes visuais baseado em Software Livre.

Queridos leitores,
aqueles que conhecem ou tem amigos com deficiência visual, existe uma ferramenta de inclusão muito boa, desenvolvida por um Brasileiro. O Projeto F123 possibilita o acesso à educação e a oportunidades de trabalho facilitando o uso de tecnologias assistivas baseadas em software livre.
Normalmente pessoas com deficiência visual em países em desenvolvimento são forçadas a usar software gratuito extremamente limitado, já que uma única cópia de um leitor de tela convencional pode chegar a custar o equivalente a três ou quatro computadores. Uma pequena minoria consegue acesso e aprende a usar softwares caros, e assim que tenta encontrar emprego ou fazer um estágio descobre que o preço dessa tecnologia adiciona uma barreira a mais a um processo que já é difícil. O Projeto F123 quebra este círculo de dependência e vulnerabilidade, facilitando o acesso a tecnologias baratas e de fácil uso.
O Projeto F123 disponibiliza todo o software que uma pessoa com deficiência precisa para usar um computador (incluindo sistema operacional, aplicativos, tecnologia assistivas como leitor de tela ou teclado virtual), em pendrives ou quando instalado diretamente em um computador. Uma pequena modificação na seqüência de inicialização do BIOS de um computador, permite que a pessoa com deficiência use praticamente qualquer computador sem a necessidade de instalar nada no caso do uso do sistema F123 em um pendrive. O pendrive F123 de 4 ou mais Gigabytes é efetivamente o disco que contém tudo aquilo que o usuário precisa para navegar na Internet e trabalhar com documentos, planilhas eletrônicas, e-mails, e mensagens instantâneas.

Organizações e indivíduos interessados em ajudar a pessoas com deficiência podem concentrar seus recursos e energias em reabilitação, capacitação, e diversas outras áreas, já que software caro deixou de ser um obstáculo. F123 é o acesso democrático à educação e ao emprego na palma da mão.

Site do Projeto: http://f123.org

terça-feira, 6 de novembro de 2012

Script Mostra Status das Filas do Postfix

Olá pessoal,
segue abaixo um script simples que mostra resumidamente o status das filas do postfix:




mail-server:~# cat contafilas.sh
#!/bin/sh

# uso: ./contafilas

# variaveis

qdir=`/usr/sbin/postconf -h queue_directory`

incoming=`/usr/bin/find $qdir/incoming -type f -print | wc -l | awk '{print $1}'`
maildrop=`/usr/bin/find $qdir/maildrop -type f -print | wc -l | awk '{print $1}'`
active=`/usr/bin/find $qdir/active -type f -print | wc -l | awk '{print $1}'`
deferred=`/usr/bin/find $qdir/deferred -type f -print | wc -l | awk '{print $1}'`
hold=`/usr/bin/find $qdir/hold -type f -print | wc -l | awk '{print $1}'`
corrupt=`/usr/bin/find $qdir/corrupt -type f -print | wc -l | awk '{print $1}'`

# imprimindo informacoes

echo "E-mails chegando (incoming queue): $incoming"
echo "E-mails sendo processados (maildrop): $maildrop"
echo "E-mails na fila para entrega (active queue): $active"
echo "E-mails que nao foram entregues (deferred queue): $deferred"
echo "E-mails com problemas (corrupt queue): $corrupt\n"


Para Executar:

www:~# ./contafilas.sh

E-mails chegando (incoming queue): 3136
E-mails sendo processados (maildrop): 407449
E-mails na fila para entrega (active queue): 538
E-mails que nao foram entregues (deferred queue): 7324
E-mails com problemas (corrupt queue): 0


Fica bem melhor para acompanhar.



Caso voces queiram apagar os itens das filas basta seguir as seguintes instruções:


Apagar o que está na fila de entrada:
# postsuper -d ALL incoming

Apagar o que está sendo processado:
# postsuper -d ALL maildrop

Apagar o que está ativo na fila:
# postsuper -d ALL active

Apagar o que está deferred
# postsuper -d ALL deferred

Apagar e-mails corrompidos:
# postsuper -d ALL corrupt


Abraços e bom proveito.

Apagar mensagens do Postfix

Pessoal,
segue abaixo algumas dicas para apagar mensagens do postfix:


postsuper -d ID       #Apaga mensagem de ID
postsuper -d ALL      #Apaga todas mensagens
postsuper -d ALL deferred #Apaga todas as mensanges com status deferred

segunda-feira, 29 de outubro de 2012

Como trocar o editor padrão no Debian?


# update-alternatives --config editor
There are 5 choices for the alternative editor (providing /usr/bin/editor).
  Selection    Path                Priority   Status
------------------------------------------------------------
* 0            /usr/bin/vim.gnome   60        auto mode
  1            /bin/ed             -100       manual mode
  2            /bin/nano            40        manual mode
  3            /usr/bin/vim.basic   30        manual mode
  4            /usr/bin/vim.gnome   60        manual mode
  5            /usr/bin/vim.tiny    10        manual mode

Escolha o seu e pronto.

Como acertar o timezone no Debian 6

Basta executar o seguinte comando e escolher o correto time zone da sua região:


#  dpkg-reconfigure tzdata

quarta-feira, 3 de outubro de 2012

Minhas Atribuições como Engenheiro

No dia 14 de Setembro de 2012, após alguns meses de luta, consegui ter o reconhecimento e atribuições na parte de elétrica, conforme o meu currículo de disciplinas do Curso de Engenharia de Computação.

Ficou definido pelo Conselho de Engenharia elétrica os seguintes dispostos:


Art. 8º - Compete ao ENGENHEIRO ELETRICISTA ou ao ENGENHEIRO ELETRICISTA, MODALIDADE ELETROTÉCNICA:

I - o desempenho das atividades 01 a 18 do artigo 1º desta Resolução, referentes à geração, transmissão, distribuição e utilização da energia elétrica; equipamentos, materiais e máquinas elétricas; sistemas de medição e controle elétricos; seus serviços afins e correlatos.

Confea – Conselho Federal de Engenharia, Arquitetura e Agronomia LDR - Leis Decretos, Resoluções

Art. 9º - Compete ao ENGENHEIRO ELETRÔNICO ou ao ENGENHEIRO ELETRICISTA, MODALIDADE ELETRÔNICA ou ao ENGENHEIRO DE COMUNICAÇÃO:

I - o desempenho das atividades 01 a 18 do artigo 1º desta Resolução, referentes a materiais elétricos e eletrônicos; equipamentos eletrônicos em geral; sistemas de comunicação e telecomunicações; sistemas de medição e controle elétrico e eletrônico; seus serviços afins e correlatos.

Resumindo:

Estou apto a assinar projetos das áreas de:

Elétrica:
Instalações Elétricas - em Baixa Tensão até 75 kW ou 93kVA para Fins Residenciais e Comerciais

Telecomunicações:
Instalações Telefônicas - Internas Via Par Metálico

Eletrônica
Sistemas e Equipamentos - de Cabeamento Estruturado



segunda-feira, 10 de setembro de 2012

Aumentar a capacidade de envio e recebimento do seu Postfix

Olá queridos leitores,
escrevo abaixo uma breve dica para aumentar a capacidade de envio ou recebimento do seu servidor postfix, tudo de acordo com o hardware do seu servidor, é claro!



Para aumentar o número máximo de mensagens a serem entregues simultâneamente, ou seja, recebidas pelo nosso servidor:
/etc/postfix/master.cf:
    # ====================================================================
    # service type  private unpriv  chroot  wakeup  maxproc command + args
    #               (yes)   (yes)   (yes)   (never) (100) 
    # ====================================================================
    . . .
    smtp      inet  n       -       -       -       200      smtpd

veja que desta forma estamos configurando 200 sessões para recebimento, ou seja 200 processos recebendo mensagens. Você pode aumentar ou diminuir de acordo com suas necessidades e capacidade de hardware.

Se quisermos aumentar o número de sessões para entrega de mensagens podemos ajustar o seguinte processo:
/etc/postfix/master.cf:
     # ====================================================================
     # service type  private unpriv  chroot  wakeup  maxproc command + args
     #               (yes)   (yes)   (yes)   (never) (100) 
     # ====================================================================
     . . .
      smtp      unix  -       -       n       -       200       smtp
estabelecemos que o postfix irá entregar até 200 mensagens simultanâneamente.
Estes valores devem ser testados e ajustados de acordo com sua realidade e necessidade.
Não deixe de ler a documentação sobre tunning de processos do kernel disponível nas referências.

Uma recomendação comum é definir:

disable_dns_lookups = yes
maximal_queue_lifetime = 1d
bounce_queue_lifetime = 1d
queue_run_delay = 300s
minimal_backoff_time = 300s
maximal_backoff_time = 1800s
disable_vrfy_command = yes


referências

segunda-feira, 6 de agosto de 2012

Como formatar uma fita no Linux

Você já deve ter ouvido falar que não se formata fita, realmente não existe essa necessidade, o que vou ensinar e a apagar o cabeçalho da fita e liberar ela como se fosse uma fita “virgem”.



Limpando a fita

Retroceder a fita para o início

mt -f /dev/st0 rewind


Grava a marcação de fim de arquivo na fita

mt -f /dev/st0 eof


Abraços

quinta-feira, 2 de agosto de 2012

ModSecurity extension for IIS


Announcing the availability of ModSecurity extension for IIS

This blog post has also been posted on the Microsoft Security Research and Defense site:
By:
  • Greg Wroblewski, Microsoft Security Engineering Center
  • Ryan Barnett, Trustwave SpiderLabs
Vulnerabilities in on-line services, like cross-site scripting, cross-site request forgery, or even information disclosure, are important areas of focus for the Microsoft Security Response Center (MSRC). Over the last few years Microsoft has developed a number of tools capable of mitigating selected web specific vulnerabilities (for example, UrlScan). To help on this front we have participated in a community effort to bring the popular open source module ModSecurity to the IIS platform. Yesterday at Black Hat Las Vegas, we have announced the availability of an RC version and we expect that stable release will be available soon.

Installation

Although the source code of ModSecurity’s IIS components is fully published and the binary building process is publicly described (see mod_security/iis/winbuild/howto.txt in SourceForge repository), it is highly not recommended to self-build the module for non-research or non-development purpose.
A standard MSI installer of ModSecurity for IIS 7 and later versions is available from SourceForge files repository of ModSecurity project and in the future designated maintainers will be keeping it updated with latest patches and minor versions of the module.

Configuration

The IIS installer does not interfere with currently running web applications. This means that the installation process must be followed by an application pool restart or recycling in order to load the new module into the application pool process. For the RC version of the module the restart/recycle step is also highly recommended each time a ModSecurity configuration file has been changed:
Restart_iis_pool 
After successful load of the module into the application pool process a series of informational events is recorded in the application event log:
Eventlog 
Runtime messages and notifications generated during the operational phase, both coming from the user-defined rules and system specific events or errors, are sent to the same application event log repository.
To apply a ModSecurity configuration file to a web application or a path, one has to use IIS configuration schema extension, like in the example below:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <ModSecurity enabled="true" configFile="c:\inetpub\wwwroot\test.conf" />
    </system.webServer>
</configuration>
The c:\inetpub\wwwroot\test.conf config file is a regular ModSecurity configuration containing the same directives as used on the Apache web server.

Examples of Protection

The most common application of ModSecurity is a protection layer called “virtual patching” (see Resources section, [5]). Using two recent vulnerabilities as an example we would like to show how this layer can be specified in an environment with IIS server running with ModSecurity.

CVE-2011-3414

In December 2011 a vulnerability was addressed in ASP.NET that allowed attackers to cause excessive processor load on most ASP.NET web applications. The hash collision issue required attacker to send a large (typically 1MB or 4MB) POST request to the server, with tens of thousands of arguments with specially crafted names. There are at least four ways to mitigate this kind of attack:
  • Restrict the request body size.
  • Restrict the number of arguments.
  • Identify repetitive payloads.
  • Check arguments names against PoC data.
The approach of checking for the presence of repetitive payload is the most sophisticated one and it can be implemented in ModSecurity using the following chain of rules:
SecRule &ARGS "@ge 1000" "chain,id:1234,phase:2,t:none,deny,msg:'Possible Hash DoS Attack Identified.',tag:'http://blogs.technet.com/b/srd/archive/2011/12/27/more‑information‑about‑the‑december‑2011‑asp‑net‑vulnerability.aspx?Redirected=true'"
  SecRule REQUEST_BODY "^\w*?=(.*?)&\w*?=(.*?)&\w*?=(.*?)&\w*?=(.*?)&" "chain,capture"
    SecRule TX:1 "@streq %{tx.2}" "chain,setvar:tx.hash_dos_match=+1"
    SecRule TX:2 "@streq %{tx.3}" "chain,setvar:tx.hash_dos_match=+1"
    SecRule TX:3 "@streq %{tx.4}" "chain,setvar:tx.hash_dos_match=+1"
      SecRule TX:HASH_DOS_MATCH "@eq 3"
When this rule is loaded into an IIS server configuration and the attack is launched on the protected path, the Windows application event log will record an access denied message from ModSecurity:
Eventlog2
At the same time the attacker will see HTTP response 403, stopping the attack before it reaches ASP.NET vulnerable component.

CVE-2012-1859

In July 2012, Microsoft patched a classic case of reflected cross-site scripting vulnerability in Microsoft SharePoint 2010. For the attacks to exploit the vulnerability it was enough to trick user into clicking on a malicious URL, like the one below:
http://sharepoint/_layouts/scriptresx.ashx?culture=en‑us&name=SP.JSGrid.Res&rev=laygpE0lqaosnkB4iqx6mA%3D%3D&sections=All<script>alert(‘Hacked!!!’)</script>z
The script injected by the attacker could gain access to the entire data set available to the victim through the hacked SharePoint server.
One possible way to block this attack is a whitelist approach: let the URL with sections argument that does contain only valid characters pass through, while block all other URLs. Below is a ModSecurity rule implementing this approach for alphanumeric characters:
SecRule REQUEST_FILENAME "@contains /_layouts/scriptresx.ashx" "chain,phase:1,block,msg:'SharePoint Sections Param Violation - Illegal Chars"
  SecRule ARGS:sections "!@rx ^\w+$"
The rule included through ModSecurity config file into the SharePoint web.config file, generates the following event when any invalid character (indicating possible attack attempt) is discovered in the corresponding SharePoint URL:
Eventlog3

Feedback

We encourage you to download and try out the tool.  If you have any feedback on your experiences with the tool, you can reach us at switech@microsoft.com or on the ModSecurity Users Mail-list.

Acknowledgments

The following people have contributed to the multi-platform effort of ModSecurity:
  • Microsoft – ModSecurity Port for IIS
    • Greg Wroblewski – Senior Security Developer
    • Suha Can – Security Researcher / Developer
  • Trustwave - ModSecurity
    • Ziv Mador – Director of Security Research
    • Ryan Barnett – Security Researcher Lead
    • Breno Pinto – ModSecurity Researcher & Developer
  • Open community  - Security Port for Nginx
    • Alan Silva  - Security Software Engineer at Locaweb
We would like to thank: Wade Hilmo and Nazim Lala, members of the Microsoft’s IIS team , for their support and help in solving many technical problems.

Resources

[1]   ModSecurity home page: http://www.modsecurity.org/

quarta-feira, 18 de julho de 2012

What is difference betwteen SFP/GBIC (mini GBIC)?


1. What is a GBIC? 


Giga Bitrate Interface Converter GBIC is an abbreviation, is the gigabit optical signal into electrical signal interface devices. GBIC is designed for hot use. GBIC is an international standard interchangeable products. With GBIC Gigabit switch interface design flexibility as interchangeable in the market account for a large market share. 


2. What is SFP? 


SMALL FORM PLUGGABLE SFP is an abbreviation, simply understood as an upgraded version of GBIC. SFP GBIC module module volume ratio reduced by half, the same panel can be configured more than double the number of ports. SFP Module GBIC same basic and other features. Some switch vendors said the SFP module is small GBIC (MINI-GBIC). SFP Module GBIC same basic and other features. 




Summary: 


1.GBIC is larger than SFP. 
2.SFP is in prominent use while GBIC is already obsolete. 
3.GBIC and SFP are equal in performance. 

sexta-feira, 29 de junho de 2012

O que é Herança em Java?


O conceito de encapsular estrutura e comportamento em um tipo não é exclusivo da orientação a objetos; particularmente, a programação por tipos abstratos de dados segue esse mesmo conceito. O que torna a orientação a objetos única é o conceito de herança.

Formas de herança

Há várias formas de relacionamentos em herança:
  1. Extensão: subclasse estende a superclasse, acrescentando novos membros (atributos e/ou métodos). A superclasse permanece inalterada, motivo pelo qual este tipo de relacionamento é normalmente referenciado como herança estrita.
  2. Especificação: a superclasse especifica o que uma subclasse deve oferecer, mas não implementa nenhuma funcionalidade. Diz-se que apenas a interface (conjunto de especificação dos métodos públicos) da superclasse é herdada pela subclasse.
  3. Combinação de extensão e especificação: a subclasse herda a interface e uma implementação padrão de (pelo menos alguns de) métodos da superclasse. A subclasse pode então redefinir métodos para especializar o comportamento em relação ao que é oferecido pela superclasse, ou ter que oferecer alguma implementação para métodos que a superclasse tenha declarado mas não implementado. Normalmente, este tipo de relacionamento é denominado herança polimórfica.
A última forma é, sem dúvida, a que mais ocorre na programação orientada a objetos. Algumas modelagens introduzem uma forma de herança conhecida como contração, que deve ser evitada.


Herança é um mecanismo que permite que características comuns a diversas classes sejam fatoradas em uma classe base, ou superclasse. A partir de uma classe base, outras classes podem ser especificadas. Cada classe derivada ou subclasse apresenta as características (estrutura e métodos) da classe base e acrescenta a elas o que for definido de particularidade para ela.
Sendo uma linguagem de programação orientada a objetos, Java oferece mecanismos para definir classes derivadas a partir de classes existentes. É fundamental que se tenha uma boa compreensão sobre como objetos de classes derivadas são criados e manipulados, assim como das restrições de acesso que podem se aplicar a membros de classes derivadas. Também importante para uma completa compreensão da utilização desse mecanismo em Java é a compreensão de como relacionam-se interfaces e herança.
Herança é sempre utilizada em Java, mesmo que não explicitamente. Quando uma classe é criada e não há nenhuma referência à sua superclasse, implicitamente a classe criada é derivada diretamente da classe Object. É por esse motivo que todos os objetos podem invocar os métodos da classe Object, tais como equals() e toString().

Exemplos e mais explicações:

Herança é quando uma classe herda atributos de outra. Na imagem abaixo podemos ver um exemplo:
Temos 5 classes: A classe pai (ou superclasse) Pessoa e suas respectivas classes filhas (ou subclasses), que são PF, PJ, Amigos e Parentes. PF é filha da classe Pessoa e pai das classes Amigos e Parentes. PJ é filha de Pessoa e não tem subclasses.
Podemos ver também que a classe pessoa tem os atributos nome, telefone e endereço. A classe PF tem os atributos RG e CPF. A classe PJ tem os atributos CNPJ e IE. A classe Amigos, tem o atributo blog. A classe Parentes tem o atributo email. Como PF e PJ são subclasses de Pessoas, elas herdam da classe Pessoas os atributos nome, telefone e endereço. As classes Amigos e Parentes, por serem subclasses de PF, herdam os atributos RG e CPF, além disso, também herdam os atributos nome, telefone e endereço, já que sua classe pai é uma classe filha de Pessoa (poderiamos dizer que a classe Pessoa é avô de Amigos e Parentes :P ).
Por esta razão podemos dizer que a hierarquia em Java ocorre de cima para baixo. Uma superclasse (ou classe pai) pode ter várias subclasses (ou classes filhas) que, por sua vez, podem ter suas próprias subclasses. Mas o oposto não acontece. Não é possível para uma classe filha ter duas ou mais classes pais (se pudesse já ia ter gente chamando a classe filha de “classe bastarda” ahuheuehuaheuhau).
Para melhor entendimento usaremos o esquema da primeira imagem para criarmos um programinha simples que irá receber os dados de pessoas digitados pelo usuário.

Código

Temos abaixo código do programa que receberá os dados digitados pelo usuário. Os comandos que ainda não foram explicados serão explicados antes da criação do código de cada classe. Gostaria de ressaltar que o foco aqui é a demonstração da herança. Por essa razão os comandos aqui são explicados apenas para facilitar o entendimento de como o código funciona.

Pessoa.java

Aqui a classe pai é criada com seus atributos e métodos construtores. O primeiro método já define o valor dos atributos enquanto o segundo método recebe os valores por parâmetro.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
public class Pessoa {
    String nome;
    String telefone;
    String endereco;
 
    public Pessoa() {
        nome = "";
        telefone = "";
        endereco = "";
    }
    public Pessoa(String nome, String telefone, String endereco) {
        this.nome = nome;
        this.telefone = telefone;
        this.endereco = endereco;
    }
}


PF.java

Aqui é criada a classe PF, que é filha da classe Pessoa. Por essa razão é utilizada a cláusula extends na criação da classe (para mostrar que a classe PF herda atributos da classe Pessoa). Da mesma forma que na classe Pessoa, na PF foram criados os métodos construtores. A diferença é que dessa vez utilizamos o comando super(), que serve para chamar o construtor da classe pai. É importante notar que o método construtor usado para passagem de parâmetros não tem apenas os seus atributos que já foram definidos na criação, mas também tem os atributos da classe Pessoa: public PF (String nome, String telefone, String endereco, String RG, String CPF) Na verdade tanto faz o nome que será usado. Para evitar confusões usei nomes iguais aos dos atributos:nometelefone e endereco. Poderia também usar nt e e que, da mesma forma, os valores seriam passados, já que o super() funciona de forma a enviar os parâmetros na ordem em que se encontram. No comando super() foram definidos os atributos que serão enviados para a classe pai. É justamente aqui que o super() faz a diferença, na passagem por parâmetros.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public class PF extends Pessoa {
    String RG;
    String CPF;
 
    public PF() {
        super();
        RG = "";
        CPF = "";
    }
    public PF(String nome, String telefone, String endereco, String RG, String CPF) {
        super (nome, telefone, endereco);
        this.RG = RG;
        this.CPF = CPF;
    }
}

Amigos.java

Esta classe é filha da classe PF. O código é feito da mesma forma. São definidos na passagem por parâmetros os atributos da classe pai PF e também da classe Pessoa, que também é super classe da classe PF (classe avô, de certa forma ;P). Osuper(), da mesma forma, continua recebendo todos os parâmetros de suas superclasses. Sempre na ordem correta… De cima para baixo.

01
02
03
04
05
06
07
08
09
10
11
12
public class Amigos extends PF {
    String blog;
 
    public Amigos() {
        super();
        blog = "";
    }
    public Amigos(String nome, String telefone, String endereco, String RG, String CPF, String blog) {
        super(nome,telefone,endereco,RG,CPF);
        this.blog = blog;
    }
}

Parentes.java

Aqui o código é feito da mesma forma que o código acima, por se tratar também de uma subclasse da classe PF.

01
02
03
04
05
06
07
08
09
10
11
12
public class Parentes extends PF {
    String email;
 
    public Parentes() {
        super();
        email = "";
    }
    public Parentes(String nome, String telefone, String endereco, String RG, String CPF, String email) {
        super(nome,telefone,endereco,RG,CPF);
        this.email = email;
    }
}

PJ.java

Aqui o código é feito praticamente igual o código da classe PF, já que PJ é subclasse apenas da classe Pessoa.
?
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
public class PJ extends Pessoa {
    String CNPJ;
    String IE;
 
    public PJ() {
        super();
        CNPJ = "";
        IE = "";
    }
    public PJ(String nome, String telefone, String endereco, String CNPJ, String IE) {
        super (nome, telefone, endereco);
        this.CNPJ = CNPJ;
        this.IE = IE;
    }
}

CadastraPessoa.java

Este é o método principal (main), que é o primeiro código a ser executado. Por ser um código um pouco maior e uma classe diferente das outras, deixarei os comentários dentro do código para facilitar o entendimento e a visualização.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import javax.swing.JOptionPane; //import necessário para usar o JOptionPane
 
public class CadastraPessoa {
 
    public static void main(String[] args) {
 
        Pessoa objPessoa = new Pessoa(); //Declaração e instanciação do objeto da classe Pessoa.
 
        //O comando abaixo declara uma variável local de tipo inteira (int) chamada 'opcao' que guardo um número digitado pelo usuário. Para isso é usado o comando JOptionPane.showInputDialog que serve justamente para pedir um valor para o usuário. Como o JOptionPane trabalha com String e a variável opção é inteira, foi necessário usar o comando Integer.parseInt para transformar em inteiro o valor que foi recebido como String. Os '\n' utilizados servem para colocar quebras de linha.
        int opcao = Integer.parseInt(JOptionPane.showInputDialog("Digite a opção: \n\n1. Pessoa física\n2. Pessoa Jurídica"));
 
        //Os comandos abaixo declaram variáveis de tipo String e guardam o dado digitado pelo usuário no JOptionPane. Como as variáveis usadas abaixo são de tipo String, não é necessário usar o Integer.parseInt
        String nome = JOptionPane.showInputDialog("Digite o nome");
        String telefone = JOptionPane.showInputDialog("Digite o telefone");
        String endereco = JOptionPane.showInputDialog("Digite o endereço");
 
        //Abaixo temos o comando if que checa se o valor dentro da variável 'opcao' é 1. Se for será executado o código abaixo. Se não for, não será executado o bloco e outro comando é executado (neste caso, outro if que checa se a o valor em 'opcao' é 2.
        if (opcao == 1) {
            PF objPF = new PF();
 
            String RG = JOptionPane.showInputDialog("Digite o RG");
            String CPF = JOptionPane.showInputDialog("Digite o CPF");
 
            opcao = Integer.parseInt(JOptionPane.showInputDialog("Digite a opção:\n\n1. Amigos\n2. Parentes"));
            if (opcao == 1) {
                String blog = JOptionPane.showInputDialog("Digite o blog");
 
                //Por fim, abaixo é declarado e instanciado o objeto de classe Amigos. Dessa vez os valores são passados por parâmetros. Como podemos notar, os códigos anteriores pediram os dados para os usuários e armazenaram nas variáveis nome, telefone, endereco, RG, CPF e blog. Agora esses dados estão sendo passados por parâmetros já na instanciação do objeto. Aqui notamos como funciona a hierarquia em Java e também como o comando super() trabalha, já que primeiro são passados os parâmetros para os atributos da classe Pessoa (nome, telefone, endereco), depois para a classe PF (RG, CPF) e, por fim, para a classe Amigos (blog)
                Amigos objAmigos = new Amigos(nome,telefone,endereco,RG,CPF,blog);
            }
            if (opcao == 2) {
                String email = JOptionPane.showInputDialog("Digite o e-mail");
                Parentes objParentes = new Parentes(nome,telefone,endereco,RG,CPF,email);
            }
        }
 
        if (opcao == 2) {
            String CNPJ = JOptionPane.showInputDialog("Digite o CNPJ");
            String IE = JOptionPane.showInputDialog("Digite a Inscrição Estadual");
            PJ objPJ = new PJ(nome,telefone,endereco,CNPJ,IE);
        }
    }
}
Bom proveitos a todos.