domingo, 20 de janeiro de 2013

Instalando e criando laboratórios experimentais com o Dynamips / Dynagen

Essa postagem tem o objetivo de orientar no processo de instalação e criação de laboratórios experimentais com o emulador de roteadores Cisco Dynamips/ Daynagen. Com este é possível estudar e testar os recursos dos roteadores Cisco 1700, 2600, 3600, 3700, 7200 sem a necessidade de adquiri-los para essa finalidade.

Primeiro baixe o Dynagen, o e WinPcap, que constam neste link para download. A versão disponibilizada aqui é válida apenas para o Windows.


INSTALANDO


  • Primeiro execute o instalador do WinPcap e prossiga seu processo de instalação a qual é bastante prático e objetivo como exposto adiante.
Instalando WinPcap - passo 1

Instalando WinPcap - passo 2

Instalando WinPcap - passo 3

Instalando WinPcap - passo 4

Instalando WinPcap - passo 5

  • Depois execute o instalador do Dynagen e prossiga seu processo de instalação a qual é bastante prático e objetivo como exposto adiante.


Instalando Dynagen - passo 1

Instalando Dynagen - passo 2

Instalando Dynagen - passo 3

Instalando Dynagen - passo 4

Ao concluir a instalação do Dynagen será possível visualizar os seguintes atalhos: Dynamips Server, Network device list e Dynagen Sample Labs.
Instalando Dynagen - passo 5

Para o próximo passo é necessário que você possua o(s) IOS Cisco 1700, 2600, 3600, 3700 ou 7200, que corresponde ao sistema operacional do roteador. Assim que consegui-lo deve-se seguir os seguintes passos: acesse Meu Computador/Arquivos de programas/Dynamips/Images e cole o(s) IOS Cisco (se tiver mais de um IOS pode colocar também) neste local, assim como apresentado na figura.

Configurando Dynagen


CRIANDO LABORATÓRIO DE TESTE

Abra o atalho Dynagen Sample Labs e depois acesse simple1. Para facilitar crie um atalho desse laboratório na área de trabalho.

Configurando laboratório Dynagen - passo 1

Agora com o botão direito do mouse, abra o arquivo do laboratório como Bloco de Notas ou WordPad para que possamos edita-lo.

Configurando laboratório Dynagen - passo 2

Perceba que ao abrir o arquivo do laboratório é possível visualizar alguns comandos para a execução do mesmo. O fato é que esse emulador não trabalha com interfaces gráficas, nem mesmo na elaboração da topologia. Então para prosseguir é preciso elaborar uma topologia da rede que se pretende simular.

Configurando laboratório Dynagen - passo 3

Na figura abaixo é apresentada a topologia proposta para configuração do laboratório baseado nela. Composto por dois roteadores conectados a rede 172.16.0.0/24.

Configurando laboratório Dynagen - passo 4

Agora iremos adaptar o laboratório simple1 que já encontra-se aberto para executar como conforme topologia proposta. As modificações constam na figura abaixo:

Configurando laboratório Dynagen - passo 5



EXECUTANDO LABORATÓRIO

Execute primeiro o Dynamips Server e depois o laboratório simple1. No console do Dynagen digite list e depois enter, e visualizará os dois roteadores propostos na topologia. Para acessar um deles digite telnet seguido do nome atribuído ao roteador no arquivo da topologia, exemplo: telnet R1 e depois enter (ele é case sensitive, ou seja, faz diferença entre letras maiúsculas e minusculas) e será aberta uma nova janela para que se possa fazer as configurações nesse equipamento.

Executando laboratório Dynagen - passo 1

Executando laboratório Dynagen - passo 2

Agora em se tratando das configurações entre os roteadores será mostrado em outra postagem. Nessa postagem você aprendeu a instalar e configurar a topologia de um laboratório simples no dynagen exceto configurações entre equipamentos.


POSSÍVEIS PROBLEMAS

Caso esteja trabalhando com o sistema operacional Windows XP basta seguir as orientações apresentadas nessa postagem, porém, caso esteja realizando a instalação no Vista ou 7 siga as seguintes orientações propostas nesse link que diz respeito a permissões de acesso a pasta.

Problemas também podem ser encontrados em relação ao consumo de memória, para solucioná-los sugiro as seguintes links: blog ccna e tutorial dynagen.


REFERÊNCIAS BIBLIOGRÁFICAS

Filippetti, Marco. Instalação do Dynamips / Dynagen no Windows Vista. Disponível em: <http://blog.ccna.com.br/2009/07/06/instalacao-do-dynamips-dynagen-no-windows-vista/>.

Filippetti, Marco. Dynagen - Tutorial básico. Disponível em: <http://blog.ccna.com.br/2007/10/05/dynagen-tutorial-basico/>.

Anuzelli, Greg. Dynamips / Dynagen Tutorial. Disponível em: <http://dynagen.org/tutorial.htm>.

quarta-feira, 16 de janeiro de 2013

Strogonoff de Almôndegas Monsters !

Deixando o notebook e o eclipse (maldito seja o vicio de ter que abrir uma IDE ) de lado nessas férias resolvi fazer um rango diferente, o Strogonoff de Almôndegas Monsters do tamanho de uma bola de sinuca !
Itensbacklog - Ingredientes:
  • 1/2 kg Carne Moída 
  • 250g Farinha de Rosca (+ ou -)
  • 1 Ovo
  • 100g queijo mussarela 
  • Tempero e Sal a gosto
  • 1 lt Creme de Leite 
  • Molho de Tomate 
Modo de Preparo:
Sprint 1 - Fazendo a massa de carne:
Mamífero! Tempere a carne e misture com o ovo e a farinha de rosca até deixar a massa uniforme e no ponto para fazer as bolinhas.

Agora corte o queijo em cubos e o envolva com a massa fazendo um bola! No meu caso da pra ver que as bolas são gigantescas!



Sprint 2 - Assando ou Fritando:
Depois de fazer as bolotas, você pode assar ou fritar... No meu caso de gordura em excesso, eu resolvi assar no forno, mas acho que fritas, também deve ficar bom.


Deixe-as no forno até dourar...


Sprint 3 - Preparando o Molho:
Ferva o molho de tomate, e acrescente o creme de leite. Após ferver um pouco, derrame o molho sobre as almôndegas na travessa e leve ao forno por uns 5min.
Enchendo o Bucho:
Mô véi! Agora é a melhor parte!


Isso aí nem cachorro come!!

segunda-feira, 10 de dezembro de 2012

Dica: Flex + Php Como NÃO usar !!

Olá negada! 

Recentemente coisa de 1 ano atrás algo me dizia que os mais de 100 requires em uma app estavam consumindo muito recurso na comunicação de Flex+Php e com o ZendAmf. Inicialmente o gateway php estava da seguinte forma:


require_once 'Zend/Amf/Server.php';
require_once 'dir/minhaClasse1.php';
require_once 'dir/minhaClasse2.php';
...
require_once 'dir/minhaClasse300.php';


$server = new Zend_Amf_Server ( );
$server->setClass ("Mapeamento das Classes" );
$server->setProduction ( false );
echo $server->handle ();

Esses inúmeros require_once incluindo todas essas classes, mostra-se totalmente desnecessário, pois além de consumir muito recurso deixando a comunicação entre o flex e o php terrivelmente lenta (Quer piorar as coisas? imagina umas 100 pessoas <tentando acessando esse mesmo arquivo!), para que diabos eu vou carregar meu sistema inteiro, se meu RO (remote object) so vai precisar de um determinado metodo por vez, e xau pro lôro!?  Solução Goooooooooooogle!

Como algum héroi que desenvolveu o Zend ja tinha PENSADO nessa possibilidade! Não tem logica nenhuma fazer a gambiarra codificação da forma descrita acima. Então bastou implementar no gateway o autoLoader para carregar automaticamente as classes do diretório que serão utilizadas pelo Flex (Remote Object), ficando assim:

require_once 'Zend/Loader/AutoLoader.php';
require_once 'Zend/Amf/Server.php';
Zend_Loader_Autoloader::getInstance ()->setFallbackAutoloader ( true );

$server = new Zend_Amf_Server ( );
$server->setProduction ( false );
// setando o diretorio das classes(carregadas automáticamente) usadas pelo Flex (remote object)
$server->addDirectory ( dirname ( __FILE__ ) . "/dir" );

echo $server->handle ();

Essa forma de carregar os arquivos automaticamente, deixa a comunicação muito mais rápida, pois não preciso levantar todo o sistema para acessar um simples método de login por exemplo!

sexta-feira, 30 de novembro de 2012

Android - Expandable ListView com CheckBox

Estava eu dando uma brincada com Android implementando uma Expandable ListView com CheckBox,
quando me deparei com uma situação chata: Ao marcar alguns checkboxs, e usar o scroll da
app, percebi que alguns itens que não tinha marcado, misteriosamente apareciam marcados, e os
itens que tinha marcado antes dos scrooling, já não esatavam mais marcados.

Antes e depois de utilizar o scroll
Pois bem, após algumas pesquisas vi que esse problema estava acontecendo com varias pessoas, porém
não achei nenhuma solução funcionando, e resolvi disponibilizar por aqui.

Primeiramente, os check box estavam mudando de estado por causa do ListView Recycle no meu Adapter,
que resolvi armazenando o estado em uma coleção no onClick... e no momento antes do retorno do metodo getChildView(...)
eu veficido se um determinado identificador existe.


expandable.xml
 


    


list_item_group.xml
 


    

list_item_child.xml
 
 

 
 
    

    
    
  
    
 

ChildEntity.java
 package com.blogspot.receitastecnologicas;

import java.math.BigDecimal;
import java.text.ParseException;

public class ChildEntity {
 private Integer id;

 private String descricao;

 private BigDecimal valor;

 public ChildEntity() {
  // TODO Auto-generated constructor stub
 }

 public ChildEntity(int id, String descr, BigDecimal valor) {
  this.id = id;
  this.descricao = descr;
  this.valor = valor;
 }

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getDescricao() {
  return descricao;
 }

 public void setDescricao(String descricao) {
  this.descricao = descricao;
 }

 public BigDecimal getValor() {
  return valor;
 }

 public void setValor(BigDecimal valor) {
  this.valor = valor;
 }

 public String getValorFormatado() throws ParseException {
  // TODO Auto-generated method stub
  return this.getValor().toString();
 }
}

GrupoEntity.java
 package com.blogspot.receitastecnologicas;

import java.util.List;

public class GrupoEntity {
 private Integer id;
 private String descricao;
 private String tipo;
 private List listChild;

 public GrupoEntity() {
 }

 public GrupoEntity(Integer id, String descricao, String tipo) {
  this.id = id;
  this.descricao = descricao;
  this.tipo = tipo;
 }

 public Integer getId() {
  return id;
 }

 public void setId(Integer id) {
  this.id = id;
 }

 public String getDescricao() {
  return descricao;
 }

 public void setDescricao(String descricao) {
  this.descricao = descricao;
 }

 public String getTipo() {
  return tipo;
 }

 public void setTipo(String tipo) {
  this.tipo = tipo;
 }

 public List getListChild() {
  return listChild;
 }

 public void setListChild(List listChild) {
  this.listChild = listChild;
 }

 @Override
 public String toString() {
  return this.getId() + " - " + this.getDescricao();
 }
}

MainActivity.java
 package com.blogspot.receitastecnologicas;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ExpandableListView;

import com.blogspot.receitastecnologicas.R;

public class MainActivity extends Activity {
 ExpandableListView explistView;

 public void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.expandable);
  explistView = (ExpandableListView) findViewById(R.id.list_expandable);

  List listgrupo = new ArrayList();
  GrupoEntity grupo = new GrupoEntity(1, "Street Fighter", "D");
  List child = new ArrayList();
  child.add(new ChildEntity(1, "Ryu", new BigDecimal(10)));
  child.add(new ChildEntity(2, "Blanka", new BigDecimal(20)));
  child.add(new ChildEntity(3, "Vega", new BigDecimal(30)));
  grupo.setListChild(child);
  listgrupo.add(grupo);

  GrupoEntity grupo1 = new GrupoEntity(2, "Mortal Kombat", "D");
  List child1 = new ArrayList();
  child1.add(new ChildEntity(4, "Sub Zero", new BigDecimal(10)));
  child1.add(new ChildEntity(5, "Scorpion", new BigDecimal(20)));
  child1.add(new ChildEntity(6, "Rayden", new BigDecimal(30)));
  grupo1.setListChild(child1);
  listgrupo.add(grupo1);

  GrupoEntity grupo2 = new GrupoEntity(3, "Oh my Dog!", "D");
  List child2 = new ArrayList();
  child2.add(new ChildEntity(7, "Allejo", new BigDecimal(10)));
  child2.add(new ChildEntity(8, "Chuck Norris", new BigDecimal(20)));
  child2.add(new ChildEntity(9, "Jeremias", new BigDecimal(30)));
  grupo2.setListChild(child2);
  listgrupo.add(grupo2);
  // sets the adapter that provides data to the list.
  explistView.setAdapter(new ExpandableAdapter(MainActivity.this,
    listgrupo));
 }

} 

ExpandableAdapter.java
 package com.blogspot.receitastecnologicas;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckBox;
import android.widget.TextView;

import com.blogspot.receitastecnologicas.R;

public class ExpandableAdapter extends BaseExpandableListAdapter {
 private Context ctx;
 private List lista;
 private Map childSelected = new HashMap();

 public ExpandableAdapter(Context ctx, List lista) {
  super();
  this.ctx = ctx;
  this.lista = lista;
 }

 // interface

 public Object getChild(int groupPosition, int childPosition) {
  return lista.get(groupPosition).getListChild().get(childPosition);
 }

 public long getChildId(int groupPosition, int childPosition) {
  return childPosition;
 }

 public View getChildView(final int groupPosition, final int childPosition,
   boolean isLastChild, View convertView, ViewGroup parent) {
  final ViewChildHolder holder;
  final ChildEntity child = lista.get(groupPosition).getListChild()
    .get(childPosition);
  if (convertView == null) {
   convertView = LayoutInflater.from(ctx).inflate(
     R.layout.list_item_child, null);// carregando layout
   holder = new ViewChildHolder();
   holder.id = (TextView) convertView.findViewById(R.id.txtid);
   holder.txtValor = (TextView) convertView
     .findViewById(R.id.txtValorTitulo);

   holder.check = (CheckBox) convertView.findViewById(R.id.chkItem);

   holder.check.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
     CheckBox chk = (CheckBox) v;
     Log.d("Check", "Selecionado " + holder.check.getText()
       + " Holder:" + holder);

     if (chk.isChecked()) {
      if (!childSelected.containsKey(holder.id.getText()))
       childSelected.put(holder.id.getText().toString(),
         true);
     } else {
      if (childSelected.containsKey(holder.id.getText()))
       childSelected.remove(holder.id.getText());
     }
     holder.check.setChecked(chk.isChecked());

    }

   });
   convertView.setTag(holder);

  } else {
   holder = (ViewChildHolder) convertView.getTag();
  }
  holder.check.setText(child.getDescricao());
  holder.txtValor.setText(child.getValor().toString());
  holder.id.setText(child.getId().toString());
  holder.check.setChecked(childSelected.containsKey(holder.id.getText()));

  return convertView;
 }

 static class ViewChildHolder {
  TextView id;
  TextView txtValor;
  CheckBox check;
 }

 public int getChildrenCount(int groupPosition) {
  return lista.get(groupPosition).getListChild().size();
 }

 public Object getGroup(int groupPosition) {
  return lista.get(groupPosition);
 }

 public int getGroupCount() {
  return lista.size();
 }

 public long getGroupId(int groupPosition) {
  return groupPosition;
 }

 public View getGroupView(int groupPosition, boolean isExpanded,
   View convertView, ViewGroup parent) {
  ViewGroupHolder holder;
  GrupoEntity grupo = lista.get(groupPosition);
  if (convertView == null) {
   convertView = LayoutInflater.from(ctx).inflate(
     R.layout.list_item_group, null);// carregando layout
   holder = new ViewGroupHolder();

   holder.txtDescricao = (TextView) convertView
     .findViewById(R.id.txt_item_group);
   convertView.setTag(holder);
  } else {
   holder = (ViewGroupHolder) convertView.getTag();
  }

  holder.txtDescricao.setText(grupo.getDescricao());

  return convertView;
 }

 static class ViewGroupHolder {
  TextView txtDescricao;
 }

 public boolean hasStableIds() {
  return true;
 }

 public boolean isChildSelectable(int groupPosition, int childPosition) {
  return true;
 }

}

http://developer.android.com/reference/android/widget/ExpandableListView.html

domingo, 16 de setembro de 2012

Prepared statements em Stored Procedures - Mysql

Hoje vou mostrar como é simples usar Prepared statements em Stored procedures.
Prepared Statements são instruções pré compiladas, que possibilita executar uma instrução mais de uma vez de modo eficiente, pois a instrução é analisada apenas uma vez.  Assim como só vai haver dinamismo no envio dos dados por parâmetros, o tráfego da rede é reduzido! detalhes aqui!

Sintaxe SQL para instruções preparadas é baseada em três instruções :

PREPARE prepara um comando para execução.
EXECUTE executa uma declaração preparada.
DEALLOCATE PREPARE libera uma declaração preparada.


Agora, como já dizia o Coronel Jesuíno: "mysql abra ai que vou lhe usar!" 


DELIMITER ;;
    CREATE PROCEDURE sp_Posts(IN idPost TEXT)
BEGIN


SET @queryDelete = CONCAT('DELETE FROM posts WHERE posts.id IN (', idPost,')');
PREPARE pstm FROM @queryDelete;
EXECUTE pstm ;
DEALLOCATE PREPARE pstm ;
END
;;
 
e para executar: 

CALL sp_Posts('5,8,9,32,45,100,165,200');
 

quarta-feira, 5 de setembro de 2012

Waze : app comunitário de trânsito e navegação

Dica de app interessante para Android e Iphone:
Waze é um aplicativo comunitário de trânsito e navegação, usado por mais de 20 milhões de pessoas,
que estão unindo forças com outros motoristas próximos para usufruir de um trânsito mais inteligente,
economizar tempo e melhorar a jornada diária de todos.




segunda-feira, 3 de setembro de 2012

Filtrando linhas da JTable com TableRowSorter

Olá negada!

Nesse post vou mostrar como filtrar as linhas de uma JTable utilizando o TableRowSorter. Como exemplo, criei um model com duas colunas e algumas linhas para a minha JTable. OBS: Utilizei o DefaultTableModel para economizar codigo, mas não use-o
em seus projetos, pois é uma bosta deixa o código muito confuso e difícil de manter (veja mais motivos) ou seja Crie o seu próprio TableModel!

Agora vamos ao FOCO!
Partindo do ponto que você ja tenha um JTexfield e sua JTable com um model com algumas linhas, declare um TableRowSorter<TableModel> e um metodo setRowSorter() que servirá para add o rowSorter a tabela.
No corpo do método será instanciado o TableRowSorter passando o model da JTable (table.getModel()) no seu construtor. Na linha seguinte basta setar ao seu JTable a intancia do RowSorter table.setRowSorter(rowSorter);

Feito isso, set a interface CaretListener que vai disparar o método caretUpdate(CaretEvent arg0) quando a posição do cursor for atualizada. Dentro desse método vem a mágica da classe RowFilter ,
que filtra a JTable, permitindo exibir apenas as linhas que contêm uma coluna com uma sequência específica.

rowSorter.setRowFilter(RowFilter.regexFilter(txtField.getText(), 0));

Abaixo segue o exemplo completo: Minha IDE preferida, se ajeite ai que vou lhe usar!!

Run As Java Application!


Exemplo feito com o código abaixo!

 
import java.awt.Color;
import java.awt.HeadlessException;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.RowFilter;
import javax.swing.border.LineBorder;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.table.TableModel;
import javax.swing.table.TableRowSorter;

/**
 * @author Everton Vieira
 * */
public class FiltroJTable extends JFrame {

 private JTextField textField;
 private JTable table;
 private TableRowSorter<TableModel> rowSorter;

 public FiltroJTable() throws HeadlessException {
  getContentPane().setLayout(null);

  JLabel lblRefinarPesquisa = new JLabel("Refinar Pesquisa:");
  lblRefinarPesquisa.setBounds(10, 11, 123, 14);
  getContentPane().add(lblRefinarPesquisa);

  textField = new JTextField();
  //
  textField.addCaretListener(new CaretListener() {
   public void caretUpdate(CaretEvent arg0) {
    String text = textField.getText().trim();
    rowSorter.setRowFilter(RowFilter.regexFilter("(?i)" +text, 0));
   }
  });
  textField.setBounds(127, 8, 205, 20);
  getContentPane().add(textField);
  textField.setColumns(10);

  table = new JTable();
  table.setModel(new javax.swing.table.DefaultTableModel(new Object[][] {
    { "ReceitasTecnologicas.blogspot.com", null },
    { "profdouglas.blogspot.com", null, }, { "cc", null, },
    { "jovemnerd.ig.com.br", null, null, null }, { "ee", null },
    { "naosalvo.com.br", null, null, null }, { "ax", null } },
    new String[] { "Blog", "Title 2", }));
  table.getColumnModel().getColumn(0).setPreferredWidth(240);

  JScrollPane scrollPane = new JScrollPane();
  scrollPane.setBounds(10, 40, 382, 200);
  scrollPane.setViewportBorder(new LineBorder(new Color(0, 0, 0)));
  getContentPane().add(scrollPane);
  table.setFillsViewportHeight(true);
  table.setBounds(20, 245, 351, -208);
  scrollPane.setViewportView(table);
  setRowSorter();
 }

 /**
  * add o TableRowSorter ao minha JTable
  * 
  * @author Everton Vieira
  */
 private void setRowSorter() {
  if (rowSorter == null) {
   rowSorter = new TableRowSorter<TableModel>(table.getModel());
   table.setRowSorter(rowSorter);
  }
 }

 /**
  * @param args
  */
 public static void main(String[] args) {
  new FiltroJTable().setVisible(true);

 }
}

Se você leu até aqui ou já consultou o javaDoc não vai me perguntar o motivo de que:
 - quando filtra e tenta imprimir o getValueAt da sua JTable não obtém o valor correto.
 Pois você já sacou que quando usar rowSorter você terá que converter o index da linha desejada usando convertRowIndexToView ou convertRowIndexToModel.
System.out.println(table.getModel().getValueAt(table.convertRowIndexToModel(selectedRow), 0));

Abs do Coronel Jesuíno!