quarta-feira, setembro 29, 2010

Projeto Lógico de Computadores - Aula 6

Como (quase) ninguém entregou a lista, e o único motivo dela era associar a necessidade de estudar com a possibilidade de ganhar alguma nota facilmente, então a partir de agora vocês não precisam mais entregar as duas listas.

Algum aluno me pediu a segunda lista separada do livro, então está aí o link:

Lista 2 - Problemas 2-13 até 2-18

E a aula 6 a seguir.


segunda-feira, setembro 27, 2010

Listas de Projeto Lógico de Computadores


  • A lista 1 ficou para hoje, 27 de Setembro de 2010, no mesmo horário, às 19:00
  • A lista 2 ficou para o dia da prova, 04/10/10, e deve ser entregue até as 19:00.


Quem não puder enviar por email pode me entregar em mãos na FACIMA, sem problemas.

Daqui há pouco a próxima aula no site. Notem que a matéria das provas é o que vimos até agora, SEM CONTAR A AULA DE HOJE. Ou seja, a aula de hoje cairá na NP2.

domingo, setembro 19, 2010

Trabalho Final da Disciplina de Sistemas Operacionais Abertos

Definição dos Grupos


Alguns grupos já definiram seus assuntos e integrantes


  • Integrantes: Ewerton Correia, Tiago Feitosa e João Paulo
  • Assunto: Software-Livre de Gerenciamento de Informações Estudantis (SIS) - OpenSis
  • Integrantes: Thiago Barros, ...
  • Assunto: eCommerce, osCommerce
  • Integrantes: Alexandre di Salvo, Oscar Angeles
  • Assunto: CMS, Joomla
  • Integrantes: Ewerton Henrique, Pedro, Ítallo
  • Assunto: CMR (SugarCRM)


Trabalho 1 de Sistemas Operacionais Abertos

Notas e Comentários


Apesar de repetidos avisos feitos por mim, alguns alunos copiaram seus trabalhos da internet. Quem copiou o trabalho, tirou zero, infelizmente. Um aluno, pelo menos, fez boa parte do trabalho, mas emprestou parte do seu trabalho a um colega, que copiou alguns textos e principalmente capturas de tela. Nota zero para ambos

Espero que nos próximos trabalhos isto não ocorra. Quem quiser discutir a nota do seu trabalho, pode conversar comigo as 19:00, na sala dos professores, na quarta-feira.

As notas finais serão calculadas assim:

(NP1 + NP2 +NTF +0.3*MT)/3.3 = MF

NP1 = Nota da Prova 1
NP1 = Nota da Prova 2
NTF = Nota do Trabalho Final
MT = Média dos Trabalhos
MF = É a média final, arredondada para cima, se necessário.

Ou seja, este trabalho mais alguns outros contarão como 30% de uma prova.


 Nome NP1 NP2 NTF NT1 MT MF
Pedro Aurélio NP1 NP2 NTF zero(b) MT MF
Gustavo Souto NP1 NP2 NTF 5,0 MT MF
Marcos Vinicius NP1 NP2 NTF zero(a) MT MF
Alexandre Di Salvo NP1 NP2 NTF 10,0 MT MF
Ewerton HenriqueNP1 NP2 NTF 7,0 MT MF
João Paulo NP1 NP2 NTF zero(c) MT MF
Angélica Ferreira NP1 NP2 NTF zero(d) MT MF
Cliviane Pereira NP1 NP2 NTF zero(e) MT MF
Ítalo Rodrigo NP1 NP2 NTF zero(f) MT MF
Oscar Angeles NP1 NP2 NTF 9,5 MT MF
Nome NP1 NP2 NTF NT1 MT MF
Nome NP1 NP2 NTF NT1 MT MF
Nome NP1 NP2 NTF NT1 MT MF
Nome NP1 NP2 NTF NT1 MT MF
Nome NP1 NP2 NTF NT1 MT MF


(a) Cópia de http://www.guiadohardware.net/artigos/algumas-peculiaridades-linux/ e http://www.gdhpress.com.br/linux/leia/index.php?p=cap1-14 . Capturas de tela copiadas de/para um colega (atente para o link do pen-drive nas capturas).

(b) Deu as capturas de tela para outro colega, ou emprestou dele. Cópia de http://www.guiadohardware.net/dicas/linux-entendendo-arvore-diretorios.html. Escreveu parte do trabalho, mas as capturas de tela copiadas/emprestadas me OBRIGAM a dar esta nota.

(c) Cópia de http://www.explorando.viamep.com/2006/05/linux-entenda-estrutura-de-pastas-e.

(d) Cópia de http://www.guiadohardware.net/dicas/linux-entendendo-arvore-diretorios.html e http://www.icefusion.com.br/curriculo/67-estrutura-basica-de-diretorios-do-linux

(e) Cópia de http://0fx66.com/blog/linux/entendendo-as-estruturas-de-diretorios-no-linux/

(f) Cópia de http://ademirlord.blogspot.com/2010/02/comandos-e-diretorios-no-linux.html




sexta-feira, setembro 17, 2010

Aula 4 de Java II

Nosso tutorial de sempre, somente repetindo o link

Trabalho da disciplina.

Fazer os programas a seguir, retirados da lista de exemplos da página da Oracle. Os programas devem ser feitos utilizando o editor visual do Netbeans, ou seja, os exemplos devem ser adaptados para usar o editor visual.


Os exemplos que devem ser feitos são:
  1. button
  2. buttongroup
  3. colorchooser
  4. combobox
  5. dialog
  6. editorpane
  7. filechooser
  8. formattedtextfield
  9. label
  10. list
  11. menu
  12. panel
  13. passwordfield
  14. progress
  15. slider
  16. spinner
  17. textarea
  18. textfield
  19. toolbar
  20. tooltip
Entrega dia 07/10/2010, no dia anterior ao da Primeira Prova da Disciplina. A matéria da primeira prova é exatamente esses programas.

Entrega por email, para henriquemarks@gmail.com, contendo
  • Um arquivo zipado, contendo todos os códigos separados por PASTAS. Ou seja, cada Projeto numa pasta separada. O nome do arquivo zipado deve ser seunome.
  • O Título do email deverá conter:
    • SEUNOME-JAVA2-TRABALHO1
    • O Trabalho anexado
  • A entrega deve ser feita até as 21:00 do dia 07/10/2010, por email.

quarta-feira, setembro 15, 2010

Aula 5 de Sistemas Operacionais Abertos

Faremos a definição dos trabalhos de final de curso desta disciplina.

Tenho várias sugestões de projetos, provavelmente este trabalho servirá não somente para esta disciplina, mas também para os seus futuros TCCs, para quem se interessar, e também para dar os primeiros passos numa carreira profissional empreendedora. Sugiro fortemente que as pessoas cheguem no horário da aula, hoje, as 19:15.

Minhas sugestões de Trabalhos até o momento


  •  Trabalho em grupo, com apresentação no final do curso. Grupos de no máximo 3 pessoas.
  •  Vale uma nota de uma prova, ou seja, trabalho final + prova 1 + prova 2 + peso*(outros trabalhos) comporão a nota toda.
ASSUNTOS


  • Softwares-Livre de Gerenciamento de Projeto
    • Candidatos: OpenGoo, eGroupWare, dotProject, Redmine
  • Softwares-Livre de Gerenciamento de Recursos Humanos (HRM)
    • Candidatos: OrangeHRM
  • Softwares-Livre para gerenciamento de conteúdo Web (CMS)
    • Candidatos: Drupal, Joomla!, Plone
  • Softwares-Livre para Gerencia de Relacionamento com Clientes (CRM)
    •  Candidatos: Sugar, OpenERP
  • Softwares-Livre para Comércio Eletrônico (eCommerce)
    • Candidatos osCommerce, Magento
  • Softwares-Livre de gerenciamento de bibliotecas
    • Candidatos: openBiblio, Koha
  • Softwares-Livre de Gerenciamento de Informações Estudantis (SIS)
    • Candidatos: openSIS
  • Softwares-Livre para Educação a Distância (EAD)
    • Candidatos: Moodle
  • Softwares-Livre para Gestão de Empresas (ERP)
    • openERP, openBravo

 Iremos vasculhar todos estes na aula, e colocaremos os links principais dos projetos assim que eles forem definidos.

quarta-feira, setembro 08, 2010

Aula 4 de Sistemas Operacionais Abertos



Processos




Introdução

  • Os processos contém, além do código de execução (text section), os recursos usados (como arquivos abertos), sinais, dados internos do kernel, um espaço de endereços na memória, e uma seção de dados (data section), contendo variáveis globais.


  • Um processo pode conter várias threads de execução (threads). no Linux, um thread é um processo especial, de modo que o tratamento de threads é o mesmo de processos.


  • Um processo inicia no Linux através da chamada de sistema fork(), que cria um processo duplicando outro. O kernel retorna duas vezes de fork(): uma vez para o processo que chamou fork (o processo pai) e outra vez para o processo que foi criado (o processo filho).




  • Em geral, o processo filho chama uma das funções da família exec() para criar um novo espaço de memória e susbtituir a existente, de modo que o filho realmente distingue-se do pai.




  • Em versões recentes do kernel, a chamada a fork() é implementada por uma chamada a clone(), que atrasa o processo de duplicação do processo pai inteiro, visto que este poderá (ou não) ser substituído pelo filho. Veremos esta implementação do kernel com mais detalhes.

Processos no Kernel

  • O kernel mantém a lista de processos numa lista circular duplamente encadeada chamada task list
  • Cada elemento da lista é chamdo descritor de processo, e é do tipo struct task_struct.
  • Esta estrutura está definida num arquivo de cabeçalho, em <linux/sched.h>
  • Definição de task_struct
Lista de Processos e cada descritor de processos, contendo a struct task_struct

Guardando o descritor de processo

  • Cada processo tem associado a si um ID, chamado PID, que é um tipo pid_t, que é muitas vezes um sinônimo para int, ou, por questões de compatibilidade short int (16 bits). Pode-se modificar o valor em tempo de execução em /proc/sys/kernel/pid_max.
  • No kernel,. os processos são referenciados pelo endereço de memória (ponteiro) de sua task_struct. Cada processo tem uma, e ela está em alguma posição de memória. Existe uma macro que guarda este ponteiro, chamada current, que contém o endereço do processo EM EXECUÇÃO.
    • No PowerPC, este endereço está num registrador.
    • No x86, este endereço está na região de memória do processo, em geral na mesma posição relativa, possibilitando que um código em linguagem de montagem recupere este valor rapidamente.
Estados dos Processos

A task_struct contém um campo state, que pode ter os seguintes valores:

  • volatile long state;    /* -1 unrunnable, 0 runnable, >0 stopped */
As possibilidades  para os processos (tasks) rodando são:
  • TASK_RUNNING: O processo pode rodar, ou está rodando, ou está numa runqueue (fila de execução.
  • TASK_INTERRUPTIBLE: O processo está "dormindo", esperando para ser posto em execução novamente.
  • TASK_UNINTERRUPTIBLE: O mesmo, mas o processo NÃO responde ao envio de sinais (que é um dos mecanismos de comunicação entre-processos visto em Sistemas Operacionais).

Manipulando o estado atual do processo



  • set_task_state(task, state). Ajusta a tarefa (processo) task para estar no estado state.


Aula 3 de Sistemas Operacionais Abertos

Livro do Robert Love, LKD, capítulo 2


Obtendo o código-fonte do Kernel Linux


  • Usando git


    • Não é a maneira mais fácil, e deve ser usada apenas por aqueles que querem acompanhar as modificações, ou trabalhar na fronteira do desenvolvimento. É a versão de hoje do kernel. CUIDADO COM FIREWALLS MAL CONFIGURADOS.


    • $ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git


  • Código-fonte da sua distribuição.


    • É o método recomendado para nós
    • Ubuntu 10.04: kernel 2.6.32.XX, onde XX depende do quão atualizado está o seu sistema.
    • Instale o pacote linux-source.
    • Um arquivo zipado (.bz2) será colocado na pasta /usr/src/ , chamado linux-source.tar.bz2. Copie este arquivo para a sua pasta pessoal (o seu home) e descompacte-o. Será criada uma pasta linux-source

A árvore do Kernel e suas pastas.

O kernel contém muitas pastas. Algumas delas serão vistas aqui, verifique as outras no livro.

Pasta                                                Descrição
arch                                                  Código dependente da arquitetura (x86, ARM, MIPS,...)
Documentation                                  Documentação
drivers                                              Drivers em geral (a maior pasta)
include                                              Kernel headers, arquivos .h do kernel, veja manual de C.
init                                                    inicialização do kernel
kernel                                               subsistemas principais
mm                                                   gerenciamento de memória
net                                                    subsistema de rede





Compilando o Kernel

Antes de compilar o kernel, precisamos configurá-lo. Queremos o suporte a funcionalidade de gerencia de memória A ou B ? Queremos o driver de placa de áudio X ou Y ? Podemos configurar estas opções antes de compilar o kernel. Há ferramentas que ajudam nesta compilação.

Por exemplo, digitando o comando (na pasta onde você colocou o kernel, já descompactado)

make menuconfig

É oferecido a você um menu de opções de configuração do kernel, que você pode navegar facilmente, escolhendo as opções que mais lhe agradam.
Se você não sabe nada, e está apenas começando, pode gerar uma configuração default (padrão) para a sua plataforma, que será detectada automaticamente, usando o comando:

make defconfig

Este comando cria a configuração padrão. Esta configuração é guardada num arquivo chamado .config (note que arquivos começando por . no Linux são ocultos. Para vê-los, va no menu do gerenciador de arquivos e marque ver arquivos ocultos). Você pode editar esta configuração diretamente neste arquivo texto, e salvá-lo com este nome. Após, rode o comando:

make oldconfig

Para que o arquivo editado a mão por você seja interpretado e validado. Está configurado o kernel, pronto para compilação, usando o comando:

make

Vá tomar um chá, café ou chimarrão enquanto espera.

Instale o kernel

Em x86, com grub2, você precisa copiar ua imagem do kernel recém-compilado para uma pasta do sistema, editar o arquivo de configuração do grub (o bootloader, programa que faz a inicialização), colocando as informações do seu kernel lá.

Tarefa: Compile o kernel no seu computador, na sua casa.


Trabalho 1 de sistemas Operacionais Abertos

Trabalho 1:


Entrega: 15/09/2010, até as 19:00, por email, para henriquemarks@gmail.com


Formato: PDF


Assunto: Faça uma pesquisa sobre a estrutura de diretórios utilizada nas distribuições Linux em geral, explicando a estrutura e as pastas, a utilidade de cada uma, permissões, detalhes, e outras questões que você achar relevantes. Exemplifique o seu trabalho com capturas de tela do seu próprio sistema.


O trabalho deve conter Título, Autor, Instituição, Data, Resumo, Introdução, Seções e Subseções, Conclusão e Referências.


Para quem quer começar a fazer bons trabalhos, utilizando um bom editor de texto científico, eu sugiro o uso do editor lyx, no Linux ou Windows. É um editor gráfico de Latex, e para quem quiser usar, basta abrir o lyx e criar todos esses itens de formatação que estão acima. Depois, é só escrever no meio do texto. Há manuais de ajuda disponíveis no programa, um tutorial excelente, e algumas dicas que darei em aula. Há ainda alguns templates (modelos) prontos, bastando preencher com o seu trabalho os espaços em branco.

segunda-feira, setembro 06, 2010

Aula 4 Projeto Lógico de Computadores

Operandos imediatos ou constantes


Existe uma instrução especial para adicionar valores constantes. Por que ? Porque esta operação é muito comum.

Como somar uma constante a um valor ?

Constante = 4 . Onde ela está na memória ? Em $s1 + addr , por exemplo.

Logo:

  • lw $t0, addr($s1)
  • add $s3, $s3, $t0
    • Duas instruções para carregar um valor constante da memória num registrador e depois somar com outro valor. MUITO DISPENDIOSO.
Instrução Adicionar Imediatamente
  • addi $s3, $s3, 4
Princípio de Design 3
  • Faça com que as operações mais comuns sejam rápidas
Existe ainda no MIPS um registrador que contém zero, sempre, chamado $zero
Não existe subi no MIPS, porque pode-se utilizar diretamente constantes negativas no MIPS.

sábado, setembro 04, 2010

Aula 3 Projeto Lógico de Computadores

Estamos seguindo fielmente o capítulo 2 de Patterson e Hennesy, e vocês já podem começar a usar o simulador Mars e ou SPIM. O Mars você obtém da Internet ou

Mars.jar

Eu extraí o arquivo, criando uma pasta Mars. Para rodar o simulador, eu entro na pasta pela linha de comando:

cd Mars (cuidado com a maiúscula)

e depois digito:

java Mars

O spim você instala normalmente.

O Livro, desculpem pelo tamanho:

Computer Organization and Design 4thEd. Patterson and Hennessy

A aula


2.1 Introdução

  • Para trabalhar com computadores devemos entender sua linguagem.
  • A linguagem de um computador é o conjunto de instruções que ele entende (instruction set).
  • Vamos trabalhar com um conjunto de instruções  real, da família de processadores MIPS.
  • Mips é RISC, ou seja, é um computador que entende um conjunto reduzido de instruções (reduced instruction set computation)
  • Temos também CISC, conjunto complexo de instruções
  • Desde o início da computação moderna, sabia-se que um conjunto reduzido de instruções  seria capaz de realizar qualquer computação
Conceito de Programa Armazenado:
  • Vamos representar os dados por números no computador.
  • Vamos representar as instruções por números no computador.
Por que MIPS ?

  • É usado em sistemas embarcados
  • É RISC
  • É parecido com ARM
  • Temos Simuladores (Mars, SPIM).

2.2 Operações de Hardware do Computador
  • Todo computador deve ser capaz de realizar operações aritméticas básicas.


    • Ex: (todos os exemplos no MIPS)
    • add a,b,c


      • adicionar "b" e "c" e colocar em "a"


  • Operações aritméticas no MIPS: Uma operação por vez, três operandos.


    • Ex: Somar "b", "c", "d" e "e" em "a"


      • add a,b,c
      • add a,a,d
      • add a,a,e
O MIPS tem 32 registradores e 2^30 palavras de memória (2 elevado na trinta, ou seja, 1 Giga palavras na memória). e isto leva ao princípio de Design 1.

Simplicidade favorece a regularidade

Ou seja, operações simples, que são sempre iguais, são mais fáceis de implementar em Hardware.

  • Ex: Linguagem C

    • a = b + c;
    • d = a - e;

  • Qual é o código assembly correspondente ? Ou seja, qual seria o código gerado por um compilador a partir deste código C ?

    •  add a,b,c
    • sub d,a,e

      • Operação sub, de subtração

  • Ex: Linguagem C

    • f = (g + h) - (i + j);

  • Qual é o código de montagem (assembly) gerado ?

    • add t0, g, h
    • add t1, i, j
    • sub f, t0, t1

2.3 Operandos do Hardware do Computador

Operandos aritméticos
  • Os operandos das operações aritméticas devem estar armazenados nos registradores da CPU
  • Tamanho de um registrador no MIPS: 32 bits
  • Grupos de 32 bits = palavra (word)
Por que 32 registradores ?

Resposta 1)
  • Príncipio de Design 2
Menor é mais rápido

Ou seja, menos registradores, significa Hardware mais simples e mais rápido. O ciclo de relógio pode ser menor com menos registradores.

Resposta 2)

  • Tamanho de instruções e endereçamento (seção 2.5)
Convenção para escrita de registradores: Símbolo $, seguido de dois caracteres

  • Ex: Escreva usando os registradores

    •  f = (g+h) - (i+j);

  • Resposta:

    • add $t0, $s1, $s2
    • add $t1, $s3, $s4
    • sub $s0, $t0, $t1

Operandos de memória

As linguagens de programação tem , em geral:
  • variáveis
  • vetores
  • estruturas
Como guardar estes tipos complexos nos registradores, para realizar operações neles ?
  • Registradores: São poucos, com pouco espaço
  • Memória: Muita!
Temos que ser capazes de transferir dados da memória para os registradores, e vice-versa
  • Instruções de transferência de dados
Para acessar uma palavra na memória, a instrução deve fornecer um endereço.


E endereço do terceiro elemento é 8, e o seu valor é 10 (memory[2])
  • Instruções load word(lw) e store word(sw)
  • Carregar da memória (lw) e guardar na memória (sw)
  • A primeira das instruções traz da memória e coloca num registrador
  • A segunda instrução pega o valor de um registrador e coloca na memória
Formato da instrução
  • Nome da instrução (lw) seguido do registrador onde colocaremos o valor, e depois uma constante e mais um registrador contendo um endereço
  • Ex: Linguagem C
    • A é um vetor com 100 palavras (A[100]), cujo endereço inicial está armazenado em $s3
    • g e h são duas variáveis: {g,h} --> {$s1, $s2}
    • g = h + A[8];
  • Qual é o código de montagem correspondente ?
    • Carregar da memória o valor num registrador temporário
    • lw $t0, 32($s3)
      • lw é a instrução para carregar da memória no registrador
      • $t0 é o nome do registrador
      • Qual é o endereço de memória ? 32($s3)
      • $s3 é o endereço inicial do vetor (por exemplo, endereço 80)
      • 32 significa o deslocamento (em bytes) em relação a posição inicial (por exemplo, 80 + 32 = 112)
      • Por que 32 ? 32 = 8 * 4. O primeiro elemento de A está em 80. O segundo está 4 bytes adiante, ou seja, 84, o terceiro em 88, e assim por diante. Logo, o elemento A[8] esta na posição $s3 + 8 * 4.
      • No MIPS, existe restrição de alinhamento de memória, ou seja, todas as palavras devem inciar em posições de memória que são múltiplos de 4.
    • $s3 é chamado de endereço base (registrador base)
    • 32 = 8 * 4 é chamado de deslocamento (offset)
    • Após carregar em $t0 o valor de A[8], somar com h e colocar em g
      • $s1 = $s2 + $t0
A operação oposta de load word é store word, que pega o valor em um registrador e coloca num endereço de memória

  • Ex: Linguagem C
    • h --> $s2
    • endereço inicial de A --> $s3
    • A[12] = h + A[8];
  • Resposta
    • Carregar A[8]
      • lw $t0, 32($s3)
    • Somar com h e guardar num local temporário
      • add $t0, $s2, $t0
    • Guardar na memória, no elemento 12 do vetor A.
      • sw $t0, 48($s3)
      • Guardar o valor de $t0 no endereço $s3 + 48, ou seja, no elemento 12 de A (12*4)

Sistemas Operacionais Abertos

Nossos manuais para sistemas operacionais abertos e o Kernel:

Principal, mais voltada a código, e mais recente
Linux.Kernel.Development.3rd.Edition

Secundária, mais voltada a sistemas operacionais em geral
Understanding The Linux Kernel 3rd Edition

No Linux, talvez seja necessário instalar um visualizador de arquivos chm, como o kchmviewer.

quinta-feira, setembro 02, 2010

Aula 2 Java - FACIMA

Nesta aula, continuaremos seguindo os tutoriais do site da Oracle sobre Swing e Java, e usaremos uma ferramenta de gerência de código-fonte para manter os códigos num repositório.

Faremos uma recapitulação sobre o uso do Netbeans, e um programa simples, conforme o post anterior sobre a aula de Java.

Depois, seguiremos um exemplo no Swing Tutorial, para criarmos um aplicativo gráfico simples.

Criando um Aplicativo gráfico

Disciplina Java - FACIMA - 2010/2

Já temos um repositório de código-fonte, ou seja, um local onde os códigos de vocês ficarão armazenados, para facilitar o trabalho de vocês individualmente e em equipe.

O projeto está hospedado no code.google.com, e o link é:

Repositório do Google para nossos projetos

O nome do projeto é facima-java-20102, e vocês DEVEM pedir autorização para mim para ingressar no grupo, por email.

No título do email, por favor, coloque:

FACIMA-JAVA-20102

Coloque seu nome completo no corpo do email, por favor.

Cadastrarei e retornarei o mais rápido possível.

Até mais

Instrução disciplina de Java

Para instalar TUDO o que é necessário para trabalharmos, no momento, basta, no Linux:

- Abrir o instalador de programas
- Instalar o netbeans

Todo o resto que é necessário será instalado junto, automaticamente.

Em outras plataformas, você precisa baixar do site da SUN/ORACLE, e instalar tudo a mão. No Linux, não precisa nada disso, somente siga as instruções acima.

Vamos usar algumas ferramentas de gerenciamento de código-fonte, então eu sugiro que instalem também o pacote subversion no Linux, ou o programa Tortoise no Windows.