Como perder a amizade de um programador

2 comentários


Falou tudo, hahaha

O engraçado é que já fizeram cada uma dessas coisas comigo.


fonte: http://nerdson.com/blog/

[crítica] - livro: Tutorial do J2EE 1.4

0 comentários
Olá a todos,

Vamos a minha primeira crítica.

Ficha técnica:


ISBN : 8573933836
ISBN 13: 9788573933833
Espec. : COMPUTACAO ORIENTADA AO OBJETO
BROCHURA
2 º Edição - 2005 1064 pág.

O mercado para Java concentra-se em torno de 80% dos projetos em J2EE(Java 2 Enterprise Edition).

Assim, comprei esse livro acreditando que iria desbravar o mundo do J2EE pois, é "from the source". Contudo, fiquei muito decepcionado.

Costumeiramente, eu me perdia durante a leitura e depois descobri o porque. Inúmeras vezes o livro faz referência a conceitos em um determinado capítulo sendo que somente são discutidos em capítulos posteriores. Exemplo, no capítulo de JSP são encontradas muitas menções a JSTL que estão no capítulo 14.

É praticamente impossível entender qualquer código do livro sem o auxílio do CD (mesmo com o CD a tarefa é difícil). Devido a ele mostrar 60 linhas de código quando necessito aprender somente 5 linhas.

Pouquíssimas vezes é ensinado a trabalhar no arquivo web.xml, ele simplesmente utiliza as ferramentas que vem junto com o J2EE e o você fica sem entender como manipular o descritor.

Os conceitos são jogados e mal abordados.

De fato, o livro engloba importantes tópicos da tecnologia J2EE, contudo, aprendi mais sobre Servlets e JSP na internet do que nele.

Nada é bom no livro?
Os 5 primeiros capítulos são bons, deu para aprender, mas, o resto...

Se você é um iniciante poupe seu tempo e dinheiro e se você é expert no assunto, então, não precisa desse livro.

Java rodar arquivo .bat

0 comentários

English version at the following link:


enprogramminghome.blogspot.com

Oi pessoal,

Observei que algumas pessoas entram no blog procurando uma maneira de Java executar arquivos .bat.

Isso é possível, basta compilar e executar o seguinte código:

public class RunBat {

public static void main(String[] args) throws Exception {
String arquivoBat = "nome.bat"
Process p = Runtime.getRuntime().exec(arquivoBat);
System.out.println("Esperando .bat terminar a execução");
p.waitFor();
}
}

A String arquivoBat pode receber os seguintes valores:
1-) Nome simples do arquivo .bat se o .class desse .java estiver no mesmo diretório.
2-) Nome simples do arquivo .bat se ele puder ser reconhecido globalmente pelo sistema operacional. Ex: Se o seu diretório de localização está no
path.
3-) Caminho completo do .bat.

Desabilitar o campo de texto (JTextField) do JFileChooser

2 comentários
English version at:
link

Atualmente, estava tentando desabilitar o JTextField de um JFileChooser que estou trabalhando.

A princípio, pensei: "Tranquilo."

Mas, para a minha surpresa vi que não havia nada implementado, mas, como o programador que sou tentei implementar algo:

Tentei o seguinte:
Components[] comp = meuJFileChooser.getComponents();
for(Component c: comp) {
if(c instanceof JTextField) {
c.setVisible(false);
}
}

Bem...isso não funcionou, mas, a idéia seguinte funcionou


Clique aqui para ver a solução.

A dificuldade do problema é obter a referência do JTextField em questão.

Adicionar ícone em executável usando C/C++

0 comentários
English version at:
link

Olá,

Fiquei mais de um mês sem fazer um post por estar pensando em uma idéia diferente para publicar no blog.

Finalmente, ela apareceu.

Todos os compiladores que já usei adicionam o ícone padrão quando um executável é gerado. Por uma questão de design, venho procurado um modo de que um executável gerado tenha um ícone próprio.

Realizei a façanha em C/C++ no Windows.

Programas C/C++ podem utilizar um arquivo de recursos. Este é um arquivo texto escrito manualmente pelo programador. Nele podem ser armazenadas informações que serão inseridas no executável e.g: Descrição, Empresa, Versão... e o nome do arquivo de ícone.

Passos:
1-) O arquivo de ícone deve ter extensão .ico (usaremos o nome "im.ico")
2-) Crie o arquivo de recursos com extensão .rc (usaremos o nome "recTeste.rc")
3-) No arquivo de recursos insira as seguintes linhas:

#include <winver.h>

MEUAPLIC ICON DISCARDABLE "im.ico"

1 VERSIONINFO
FILEVERSION 3,3,0,0
PRODUCTVERSION 3,3,0,0
#ifdef _DEBUG
FILEFLAGS 0xbl
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904B0"
BEGIN
VALUE "CompanyName", "GenericCompany\0"
VALUE "FileDescription", "GenericApplication\0"
VALUE "FileVersion", "1.0\0"
VALUE "InternalName", "1.0\0"
VALUE "LegalCopyright", "Copyright \251 Generic Company. 1997\0"
VALUE "LegalTrademarks", "Generic Trademark.\0"
VALUE "OriginalFilename", "\0"
VALUE "ProductName", "Generic Application.\0"
VALUE "ProductVersion", "1.0\0"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

4-) Crie um arquivo "recTesteLib.rc" com o seguinte conteúdo.
#include "recTeste.rc"

5-) Utilize a seguinte sintaxe no programa windres.exe (vem junto com o Devian) para transformar o arquivo texto em um binário apropriado para ser usado pelo gcc:
windres -i recTesteLib.rc --input-format=rc -o recTesteLib.res -O coff

6-) Compile o seu fonte com o gcc utilizando a seguinte sintaxe:
gcc fonte.c recTesteLib.res -o "fonte"

Pronto!

Além do ícone no executável, veja que as informações de recursos foram inseridas no executável. Para ve-las, selecione o executável e pressione com com o botão direito do mouse e vá em propriedades e clique na aba "Versão".


Observações:
1-) Se não quiser ter todo esse trabalho, basta criar o arquivo de recursos em formato texto e adiciona-lo como parte de um projeto no Devian. Ele irá poupa-lo de escrever todos esses comandos.
2-) Não explicarei os comandos do programa windres para que o post não fique longo. Em caso de curiosidade vá no seguinte link
3-) Os arquivos de recursos tem muitas utilidades, dentre elas está a fácil adição de componentes gráficos em um Windows Frame. Quando aprender mais sobre esse assunto farei um post.

Restrição de memória do DOS

0 comentários
Olá,

Quando a microsoft fornecia DOS 5.x a restrição de memória era de 1 Mb. Devido a isso, o s.o era acusado injustamente de ser extrememente limitado, mas, vou mostrar que não é limitação dele e sim do PC.

O PC possuia um registrador de segmento de 16 bits e um de deslocamento de 16 bits Assim, ele pode referenciar 65536 endereços e cada um com 16 bits. logo, 1048576
(65536 * 16) posições de memória poderiam ser referenciadas, equivalendo a 1 Mb.

Atualmente, o tipo DWORD de 32 bits do Windows pode referenciar mais de 4 Gb de RAM.

Sobrecarregando operadores em C++

0 comentários
Olá,

Os compiladores de C++ possui definições padrão para os operadores.
Ex:
int + int
float + float
...

E assim, por diante.
Mas, para a maioria deles a soma de duas cadeias de caractéres é um erro.
Exemplo de código inválido:
...
char* str1 = "aaa";
char* str2 = "bbb";

char* str3 = str1 + str2;

Mas, muitos compiladores (e.g: g++, bcc32) permitem sobrecarga de operador. Ou seja, é adicionar uma nova assinatura (sem alterar o número de argumentos) e comportamento a um operador.
Ex:
Podemos fazer com que seja possível somar um double com um array de char. Isso é muito esquisito, então, vamos fazer com que seja possível somar duas cadeias de caractéres.

A sobrecarga de operador aplica-se indivudualmente as classes (talvez, haja um jeito de sobrecarregar para todas).

A sintaxe é:
tipo-retorno nome-classe::operator # (lista-argumentos)

Nesse link está a minha classe
String.

O operador de adição foi sobrecarregado para receber um ponteiro de char (cadeia de caractéres) e concatenar com o buffer corrente e incrementar a variável que denota o tamanho da string.

Agora, é possível fazer a seguinte operação:
String str1 = "aaa";
String str2 = str1 + "vvv";

Mas, não é possível imprimir na tela o objeto de uma string.
Exemplo de código inválido:
String str1 = "sss";
cout << str1;

Então, para que o código de cima seja válido temos de sobrecarregar o operador "<<" de um cout.

No mesmo link esse operador já foi sobrecarregado.

Não é permitido sobrecarregar:
.
.*
::
?:

Criando Processos em Windows usando C

0 comentários
Olá,

Para criar um executável Windows escrito em C que cria um novo processo veja o seguinte código:
#include "<"windows.h">" // aspas inseridas para tags aparecerem

int main(int argc, char **argv) {
PROCESS_INFORMATION pi; /*preenchido em CreateProcess */

STARTUPINFO si;
GetStartupInfo(&si);

CreateProcess(NULL, /* Nome do módulo executável*/
"notepad.exe", /* String da linha de comando */
NULL, /* Atributos de segurança do processo */
NULL, /* Atributos de segurando do encadeamento*/
FALSE, /* Sinalizador indicativo de herança */
DETACHED_PROCESS, /* Sinalizadores de criação */
NULL, /* Ponteiro para o novo bloco de ambiente */
NULL, /* Ponteiro para o diretório atual */
&si, /* Ponteiro para STARTUPINFO */
&pi /* Ponteiro para PROCESS_INFORMATION */
);


return 0;
}

A string contendo o nome do processo vão os argumentos de linha de comando.

É possível usar funções como execl e spawnl para abrir executáveis (funciona em linux), porém, essas funções não retornam informações interessantes em relação ao processo aberto. Por exemplo, o comando "pi.dwProcessId" retorna o ID do processo.

Veja a estrutura de PROCESS_INFORMATION:

typedef struct _PROCESS_INFORMATION {
HANDLE hProcess;
HANDLE hThread;
DWORD dwProcessId;
DWORD dwThreadId;
} PROCESS_INFORMATION, *LPPROCESS_INFORMATION;

O HANDLE do processo serve para diversas operações (que não serão descritas nesse post).

Programming @ home em inglês

0 comentários
Olá a todos,

Hoje, estou inaugurando a versão inglês do blog.
Comecei a fazer isso devido as pessoas que acessam o blog pelo google e não falam português.
Somente vou traduzir os novos posts e dos antigos os mais interessantes.

O link é:
www.enprogramminghome.blogspot.com
Se houver qualquer tipo de erro nos textos em inglês, por favor, me avisem.

Alterar ícone do JFrame

0 comentários
Por padrão, o ícone que aparece no canto superior de um JFrame é o símbolo do Java (xícara de café). Uma questão importante no design é que esse ícone seja o logo representante do software criado.
Para alterar esse ícone com um suposto arquivo png chamado "logo.png" basta seguir o seguinte código em Java:
class Teste {
JFrame jf = new JFrame();
...
java.net.URL url = getClass().getResource("logo.png");
java.awt.Image im = java.awt.Toolkit.getDefaultToolkit().getImage(url);
jf.setIconImage(im);
}

[OFF] Um programador Certificado

0 comentários
Olá a todos,

A certificação de programador Java SE é um documento emitido pela Sun Microsystems, que comprova que o portador tem proficiência em Java SE (Aplicações Desktop e Servidores). A Sun não libera o número de pessoas que possuem a certificação, mas, é estimado que somente 10% dos profissionais em Java a possuem, o que a torna um documento de impacto na hora da contratação.

E ontem, tive o meu level-up. Passei na prova. É um exame bem difícil. Posteriormente, farei um post sobre o livro que usei para estudar.

Indução do Laço e Redução da Força

0 comentários
Indução do Laço e Redução da Força são técnicas de otimização de laços (for, while, ...), normalmente, empregadas pelos compiladores.

Seja o seguinte laço,

for(i = 0; i < 1000000; i++) {
vetor[i] = 0;
}


Cada elemento da variável vetor tem um tamanho x, assim, para acessar cada elemento é necessário efetuar a seguinte operação de multiplicação (base + i * x). Em vez de usar os índices para acessar os elementos, pode-se aplicar a seguinte técnica:

1. endAddress = &vetor[1000000];
2.
3. for(pointer = vetor; pointer < endAddress; pointer++) {
4. *pointer = 0;
5. }

Na linha 1 é obtido o endereço de memória do último elemento que desejamos acessar do vetor. Na linha 3 o ponteiro pointer recebe o endereço inical do vetor e a operação pointer++ realiza o incremento para o endereço de memória da variável seguinte, eliminando a lenta operação de multiplicação.

O processo de criar novas variáveis a partir das variáveis do laço é chamado de Indução do Laço. Devido a indução fazer com que menos operações sejam realizadas ocorre a Redução da Força.

Normalmente, os compiladores automaticamente induzem o laço.

Usando Timer e TimerTask

0 comentários
Timer e TimerTask são classes Java usadas para executar tarefas paralelamente com o código que a dispara. Neste momento você pensa: "Mas, Threads já fazem isso.". Sim, elas fazem, mas, o diferencial é que a classe Timer faz com que a tarefa seja executada somente após um período de tempo ou periodicamente.

Primeiramente, crie uma classe que herde TimerTask. A classe não abstrata PrintTask faz essa herança e implementa o método abstrato +run(void):void. No método run está a implementação da tarefa (imprimir o valor do contador e icrementar). Vide a API para entender o método cancel.

Agora, desejo que seja impresso no terminal o valor do contador a cada segundo. Então, usamos a classe Timer para realizar essa tarefa. Basta fazer,

Timer tim = new Timer();
tim.scheduleAtFixedRate(new PrintTask(), 0, 1000);


E pronto. A mágica acontece nos métodos de escalonamento da classe Timer. Três tipos de escalonamento podem ser feitos:
- Única Execução
- Retardo Fixo
- Taxa Fixa

Explicação dos tipos de escanolamento
1- A única Execução é quando a tarefa do TimerTask associado é executada uma única vez
Métodos:
-- public void schedule(Timer Task, Date time) - executa a tarefa na data especificada

-- public void schedule(Timer Task, long delay) - executa a tarefa após delay millisegundos.

2 - O Retardo fixo é quando a tarefa do associado é executada periodicamente de acordo com uma taxa de tempo especificada. E a periocidade é garantida. Ex: Suponha que a tarefa executa com taxa de 5 segundos e a sua última execução foi as 15:20:50 h , então, a próxima execução deve ser as 15:20:55, entretanto, diversos retardos podem ocorrer (devido a coleta de lixo, escalonamento de Threads e demais atividades) fazendo com que a próxima execução seja depois de 5.1 segundos (supostamente). Assim, o algoritmo de Retardo Fixo vai garantir que a execução ocorra no tempo correto, encurtando o intervalo do período.
Métodos:
-- public void schedule(Timer Task, Date firstTime, long period) - A tarefa é executada com escalonamento de Retardo Fixo, iniciando na data firstTime com uma taxa period.

-- public void schedule(Timer Task, long delay, long period) - A tarefa é executada com escalonamento de Retardo Fixo, iniciando após delay millisegundos com uma taxa period.

3 - O escalonamento de Taxa Fixa é quando uma tarefa do associado é executada periodicamente de acordo com uma taxa de tempo especificada e não há encurtamento do intervalo, uma vez que houve algum atraso. A importância está na frequência do evento.
Métodos:
-- public void scheduleAtFixedRate(Timer Task, Date firstTime, long period) - A tarefa é executada com escalonamento de Taxa Fixa, iniciando na data firstTime com uma taxa period.

-- public void scheduleAtFixedRate(Timer Task, long delay, long period) - A tarefa é executada com escalonamento de Taxa Fixa, iniciando após delay millisegundos com uma taxa period.

Ratings:

Avaliação deste artigo

Copyright © Programming @ home