| |||||||||||||||||||||||||||||||||||||||||||||||||||
|
terça-feira, 10 de fevereiro de 2015
Marcelo Mrack's invitation is awaiting your response
terça-feira, 3 de fevereiro de 2015
Marcelo Mrack's invitation is awaiting your response
| |||||||||||||||||||||||||||||||||||||||||||||||||||
|
terça-feira, 27 de janeiro de 2015
I'd like to add you to my professional network on LinkedIn
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
sexta-feira, 9 de agosto de 2013
O que eu faria hoje, uns 3 anos depois ?
Brincando agora um pouco, sem sono (qui nada, mortinho!) as 04:29h, o que eu escreveria de código para gerar uma típica tela de criação de login como Merlin ?
class Pessoa {
@Ui.Label("Login")
@Ui.Required
String username;
@Domain.Value(":regex=([A-Z][a-z][0-9])+")
@Domain.Required
String password;
@Task.Like("password")
String retypePassword;
@Ui.RenderAs("label")
String message;
@Ui.RenderAs("button")
@Task.Agent(":event=click,action=validate")
}
@Task.Action
class Rules {
@Domain.Alias("validate")
public void validatePassword() {
@In ctx;
String password = ctx.get("password")
String retypePassword = ctx.get("retypePassword")
if (!password.equals(retypePassword)) {
ctx.set("message.setText","The entered password does not match.")
}
}
}
public class PessoaTest {
public static void main(String args[]) {
Merlin.getInstance(Toolkit.SWING).createAndRenderUi(new Pessoa());
}
}
Tem lógica ?
Não sei, mas que dá vontade de retomar isso... nooooosa!
class Pessoa {
@Ui.Label("Login")
@Ui.Required
String username;
@Domain.Value(":regex=([A-Z][a-z][0-9])+")
@Domain.Required
String password;
@Task.Like("password")
String retypePassword;
@Ui.RenderAs("label")
String message;
@Ui.RenderAs("button")
@Task.Agent(":event=click,action=validate")
}
@Task.Action
class Rules {
@Domain.Alias("validate")
public void validatePassword() {
@In ctx;
String password = ctx.get("password")
String retypePassword = ctx.get("retypePassword")
if (!password.equals(retypePassword)) {
ctx.set("message.setText","The entered password does not match.")
}
}
}
public class PessoaTest {
public static void main(String args[]) {
Merlin.getInstance(Toolkit.SWING).createAndRenderUi(new Pessoa());
}
}
Tem lógica ?
Não sei, mas que dá vontade de retomar isso... nooooosa!
sexta-feira, 27 de maio de 2011
Quanto vale o Merlin?
Nada!
Conforme a Cayenne Consulting, o resultado eh este:
Ou eu volto a trabalhar nele, ou a coisa vai continuar assim... :(
Conforme a Cayenne Consulting, o resultado eh este:
Ou eu volto a trabalhar nele, ou a coisa vai continuar assim... :(
sexta-feira, 16 de julho de 2010
quinta-feira, 15 de julho de 2010
Snapshots, a saida para o controle do passado?
O uso de configurações históricas no Merlin é a base de toda a sua capacidade de renderização.
Depois de muitas pesquisas, acredito que um termo melhor para isso é chamar a coisa de Configuração por Contexto. E, de forma geral, ela é usada junto à Configuração por Exceção, e ambas cooperam para um modelo altamente eficiente no reuso de informações.
Porém, quando falamos em histórico, ou melhor, em contexto, o problema é que ele pode mudar constantemente. Vou dar um exemplo:
Supomos que temos um campo String Nome no sistema S4. Sem contexto algum, e sem nenhuma anotação atrelada, isso produz uma tela de cadastro com um controle de tela simples do tipo texto. Nada demais. Digamos que esse sistema S4 foi feito hoje, 15/Jul/2010.
Agora, se inserimos no contexto do Merlin, informações de um sistema S1, mais antigo, desenvolvido lá pelo ano de 2007 (sei lá, talvez a empresa adquiriu outra empresa, e lá no servidor de aplicação um aplicativo mais antigo foi deployado junto, e o classpath do Merlin localizou esses metadados antigos...).
Nesse caso, se existir alguma classe nesse sistema antigo, que satisfaça as condições de localização espacial do Merlin, por exemplo, uma anotação @Length(40) sobre um camo Nome do tipo String, então, bingo, o contexto acaba de ser mudado, pois o Merlin calcula os pesos (ou melhor, as distâncias) de cada informação, e sugere então que, o campo String Nome do sistema S4 também deva reusar a informação @Length(40). Óbvio, pois sendo S4 mais novo (mais recente) do que S1 (que foi feito lá em 2007), esperamos que as informações históricas sejam reusadas no sistema mais atual S4.
Qual o problema nesse caso?
O problema se resume ao fato que, a cada alteração no contexto, os sistemas podem sofrer alterações de comportamento (nesse caso, o sistema S1) e isso não é nada bom, pois nenhum usuário gostaria de, a cada vez que abrisse uma tela, essa tivesse um comportamento e aparência diferentes...
Bem, e para resolver isso?
Abaixo, copio o algoritmo que bolei ontem a noite antes de ir dormir as 2:48 AM:
1) Se tem um Snapshot, então usa ele e fim.
2) Se tem uma configuração direta (uma anotação atrelada), então usa ela e fim. (Isso é Configuração por Exceção).
3) Ler todo conteúdo do contexto, tanto o passado (sistemas mais antigos) quando o futuro (sistemas mais novos).
4) Calcular as métricas (as distâncias de cada anotação).
5) Escolher a anotação de distância (na verdade, isso é uma função direta que envolve tempo e espaço - falarei mais em outro momento) mais próxima.
6) Produzir um Snapshot com essas distâncias e salvar num meio físico recuperável na próxima renderização.
7) Renderizar o conteúdo da tela de cadastro.
8) Monitorar alterações (se ativado esse comportamento).
9) Fim.
Usando essa lógica de processamento, resolvemos a situação do exemplo acima, e várias outras situações até (bem mais complexas que eu imaginei). Isso porque, quando o sistema S1 entra no contexto, e esse é alterado por essa entrada, o Merlin já tem um Snapshot com tudo o que ele precisa. E assim, se o sistema S4 for renderizado inúmeras vezes, isso não é impactado pelas nuances das alterações do contexto provocadas pelo sistema S1, ou mesmo outros sistemas S2 e S3 mais antigos; ou mesmo ainda sistemas mais novos como S5, S6, etc.
Sei
Sei que tudo isso parece uma loucura, mas aqui no meu minúsculo e limitado cérebro, essas coisas se encaixam e produzem até uma aura sobre o caminho que tenho pela frente até realmente o Merlin tornar-se algo factível.
T+
Marcadores:
configuracao_por_contexto,
configuracao_por_excecao,
histórico,
snapshot
Assinar:
Postagens (Atom)