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!

sexta-feira, 31 de agosto de 2012

CASE em SQL

Neste post irei mostrar um recurso pouco conhecido e que não é visto na faculdade (pelo menos eu não vi), que é o usos do CASE em SQL.
A utilização do CASE em comandos SQL funciona semelhante ao 'if' das liguagens de programação.
Sintaxe:
'CASE' Expressão Avaliada

'WHEN' Expressão a ser comparada

'THEN' Expressão Resultante (caso a comparação seja avaliada como TRUE)

'ELSE' Expressão Resultante (caso nenhuma comparação seja avaliada como TRUE)

'END'

Como exemplo, podemos imaginar uma situação em que desejamos saber qual o maior publico entre os times Pernambucanos (Santa Cruz, Sport e Nautico ).
 SELECT mediaPublico,
       CASE
         WHEN mediaPublico>= 12000
              AND mediaPublico< 20000 THEN
         'Vice maior Torcida de PE - IXPORTÊ'
         WHEN mediaPublico>= 20000 THEN
         'A MAIOR TORCIDA DO NORTE/ NORDESTE - TRI-TRI-TRI- TRICOLOR SANTA!!!'
         WHEN mediaPublico< 12000 THEN
         'Torcida do Nauticu,cabe dentro de um fusquinha'
       end AS Maior_Torcida
FROM   torcida 

O CASE também pode ser usada em qualquer instrução ou cláusula que permita uma expressão válida como UPDATE, DELETE,
usando também a cláusula WHERE.

Receita de Salsicha em Conserva - Sausage Rocker

Eita! Hoje é sexta feira,que 'MARAVILHAS'! e como hoje e amanha são dias sagrados para quem gostar de tomar umas cervejas, vou ensinar a fazer um tira gosto matador! A velha Salsicha em Conserva, a qual eu batizo de Sausage Rocker!
Essa receita também serve para batatas

Itensbacklog - Ingredientes:
  • 1kg Salsicha pequena (se não encontrar usa a comum)
  • 1lt Vinagre
  • 1 Cebola
  • Coentro
  • Cebolinha
  • 3 Cabeças de alho
  • 2 Folhas de Louro
  • Cuminho  
  • Pimenta do reino agosto
  • Sal a Gosto
  • Orégano 
Modo de Preparo:
Sprint 1 - Fervendo a Salsicha
Coloque as salsichas em uma panela, adicione água, espere levantar fervura e deixe ferver por 5 minutos, escorra e espere esfriar. 
Sprint 2 - Compilando o Tempero
 Separe alguns galhos de coentro, e pique a Cebola, a cebolinha e as cabeças de alho.

Sprint 3 - Montando o Recipiente
 Após as salsichas esfriarem, em um Recipiente de vidro com tampa você pode ir adicionando os temperos (louro,orégano,cuminho+pimenta do reino,sal) a gosto, as salsichas e
pequenos galhos de coentro e a cebolinha e alho picados. 


Use o seu lado feminino design para ornamentar o recipiente com as salsichas e coentro. 
  
Agora preencha o pote com vinagre... e quando estiver faltando uns 2 ou 3 dedos para encher o recipiente, complete com água filtrada

Sprint 4 - Cevar
 Feche o recipiente e agite(Balance, saculeje), para espalhar o tempero.
Agora sossegue e espere  uma ou duas semanas para tomar uma com a salsicha!

  

Obs: Consumir a Salsicha com alguma bebida alcoólica não faz mal! O que faz mal é engolir o que a globo tenta te empurrar de guela abaixo!

FITec - Vagas de estágio em design de interação

A FITec – Fundação Para Inovações Tecnológicas - comunica aos interessados que estão abertas vagas de estágio em design de interação. Abaixo detalhes sobre as vagas:

Requisitos:
                - Habilidade para compreender as necessidades do usuário e produzir conceitos, soluções e designs de interface do usuário;

                - Domínio de ferramentas de design como Photoshop, Illustrator, Fireworks e Dreamweaver;

                - Desejável: conhecimento em linguagens front-end para Web, como HTML, CSS e JavaScript.

Informações sobre a vaga:

                - O projeto envolve a pesquisa, prototipação e criação da identidade visual de softwares que serão desenvolvidos pela FITec;

                - Carga horária: 6h.
              
Os interessados devem enviar e-mail para o endereço efreitas@fitec.org.br .   O assunto do e-mail deve ser "Estágio Design de Interação"

quinta-feira, 30 de agosto de 2012

RESTful Web Services PHP com Respect / Rest

A construção de WebServices RESTful está surgindo como uma alternativa para a integração de sistemas independente de plataforma.  Além de ser mais simples e leve que o SOAP,  possui a capacidade de transmitir dados diretamente através de HTTP.
Nesse post não pretendo explicar o que é, e todos os princípios da arquitetura REST Transferência de Estado Representacional (Representational State Transfer), e quem não conhece e estiver a fim de aprender... esta disponível a própria tese do Roy Fielding sobre o tema, e uma artigo Wikipédia.

O RESTful foca em URIs e nos detalhes do protocolo HTTP para se beneficiar de seus recursos, sem a necessidade de passar a ação implicitamente na URL ex: Para que eu vou implicitar a ação Edit na minha url http://meusite/usuario/666/edit , se  com o recursos do HTTP posso fazer assim: PUT  http//meusite.com/usuario/666.
 Assim como no Java existe JERSEY que é a implementação de referencia do JAX-RS (API RESTful web Service) , no PHP existe a simples e direta Respect / Rest  disponível aqui no github.

Agora vamos faze de forma rápida e simples um exemplos do Respect\Rest  usando os métodos HTTP (GET,POST,PUT,DELETE) para construir uma app RESTFul.

require_once 'bootstrap.php';
require_once 'Respect/Rest/Router.php';
require_once 'Respect/Rest/Request.php';

use Respect\Rest\


Router;
$router = new Router('/index.php/');
/**
 * get
 * 
 */
$router->get('/meusite/app/login/*/*', function($login, $senha) {
            if ($login == "rectec" && $senha == "123") {
                return "Usuario=> $login Senha: " . md5($senha);
            } else {
                return "Você não existe!!!";
            }
        });

$router->get('/meusite/usuarios', function() {
    return 'Listagem de usuarios';
})->accept(
    array(
        'text/html' => function($data) {
            return 'usuarios em HTML';
        },
        'application/json' => function($data) {
            return 'usuarios em JSON';
        }
    )
);
/**
 * post
 * 
 */
$router->post('/meusite/usuario/', function() {
            
            $data_back = json_decode(file_get_contents('php://input'));
            
            return 'Cadastrando: ' . json_encode($data_back);
        });

/**
 * Alterar
 * 
 */
$router->put('/meusite/usuario/*', function($id = null) {
            return 'Alterando: ' . $id;
        });
/**
 * Deletar
 * 
 */
$router->delete('/meusite/usuario/*', function($id = null) {
            return 'Deletando: ' . $id;
        });
Caso queira representar a saída com HTML, JSON, XML, JPG, etc,  use o Cabeçalho Accept! Para testar vc pode usar um debug para RESTful web service chamado RESTClient no seu FireFox!

segunda-feira, 27 de agosto de 2012

Programa de Residência em Software para Desenvolvedores.

O Softex Recife está realizando seleção de bolsistas para o seu Programa de Residência em Software que será realizado em parceria com a Procenge. O programa irá formar especialistas em desenvolvimento de software, com objetivo de atender a demanda por profissionais qualificados para a área de TI.


Seguem mais informações do programa:

I)                   Quantidade de vagas: 15

II)                 Pré-requisitos:

a)      Formação: Cursando o último ano de curso superior ou tecnólogo em Informática, Engenharia da Computação ou qualquer curso da área de ciências exatas.

b)     Experiência: Desejável conhecimento acadêmico em linguagens de programação visual e banco de dados e gerador de relatórios.

c)      Conhecimentos Técnicos: Desejável conhecimentos engenharia de software, ferramentas e técnicas de testes, análise e programação orientada a objeto e UML, metodologia SCRUM, linguagens de desenvolvimento, manipulação de dados através de SQL.

 Os currículos indicados deverão ser encaminhados para o e-mail: 
selecao@next.org.br

Instalando Temas para o Editor de Código do Eclipse


O site http://eclipsecolorthemes.org/ fornece varias opções para quem quer mudar o
style do editor de código da IDE Eclipse. Ele permite fazer downloads
ou criar o seus próprios temas. Ainda existe a opção de instalação do The Eclipse Color Theme Plugin
via Update Site. (http://eclipse-color-theme.github.com/update/)

domingo, 26 de agosto de 2012

Picanha Invertida Rocker

Minha esposa ficou falando que viu um tal de Edu Guedes (sei lá quem diacho é esse cabra) fazer uma picana invertida na tv, e resolvi mostrar a ela que qualquer um pode fazer isso (até um nerd)!
Itensbacklog - Ingredientes:
  • 1 picanha inteira (+ ou - 1.200kg)
  • azeitonas verdes sem caroço
  • 200g queijo mussarela 
  • 1 linguiça calabresa
  • orégano 
  • sal grosso 
Modo de Preparo:
Sprint 1 - Invertendo a Picanha:
Mamífero! Pegue uma Faca afiada, e faça um corte na base da carne até próximo a extremidade, deixando um espaço de 1cm nas laterais para não rasgar quando for inverter. Feito isso a carne ficará parecendo uma sacola.

Agora coloque uma das mãos dentro da carne, e com a outra precione a extremidade para inverte-la. Tenha cuidado para não rasgar feito eu fiz (ainda bem que foi pequeno)! :) 


Sprint 2 - Picando o Recheio:
Agora pegue o queijo, azeitonas, e linguiça. Pique e misture com um pouco de orégano! obs. Caso ache legal... frite a linguiça!

Após misturar o recheio, preencha a picanha.

Sprint 3 - Costurar e Sal grosso:
Com a picanha recheada, costure e passe um pouco de sal grosso em toda a carne.
Deixe curtindo enquanto o forno é aquecido durante uns 10 a 15 minutos.

Sprint 4 - Leve ao Forno:
Agora MÔ véi, é só ficar virando o lado da carne de 15 em 15 minutos, e esperar ficar no ponto!

Enchendo o Bucho:
Mô pirraia! Agora é a melhor parte! Arrume um vinho ou cerveja, e comece o show!


Isso aí nem cachorro come!! (pq não sobra)

Abertura do Livro Receitas Tecnológicas


Hello Word / ping -t 127.0.0.1 (local host)

Hello..., Is there anybody in there?
Just nod if you can hear me.
Is there anyone at home?

Come on now: (Comfortably Numb - Pink floyd)

Olá pessoal! Como não temos livros de receitas, resolvemos criar esse blog para postar nossos snippets de códigos, passo a passao para fazer um ensopado de protocolos em panelas geograficamente distribuídas até uma linda e deliciosa picanha!  Quando nossas monografias, trabalhos, pesquisas, e frelas nos derem uma folga estaremos postando por aqui! Participem, curtam e interajam com nossas postagens.