Workshop RavenDB 2018: Segurança, eficiência e produtividade

RavenDbAdminPortal

Participei da edição 2018 dos workshops RavenDb, ocorrida em 22 Junho em São Paulo no complexo jK, e vou contar as principais novidades da versão 4.0 desse poderoso banco de dados, seguro por padrão e otimizado para eficiência.

Anúncio do RavenDB Workshop edição 2018

O RavenDb é desenvolvido pela Hibernating Rhinos, empresa israelense, localizada em um dos pólos de tecnologia e inovação mais importantes do planeta. Israel é reconhecidamente celeiro de inovações importantes no campo da medicina, militar dentre outros.

O workshop foi conduzido pelo consultor independente Elemar Jr, que participa ativamente do desenvolvimento desse SGBD, com outros profissionais de nível mundial com “skillset” extremamente elevado.

Já faz um tempo que venho pesquisando bancos de dados noSql disponíveis no mercado, para que em meus próximos projetos eu utilize essa vertente de banco de dados, tendo em vista ganho de produtividade e performance.

Tendo escolhido o RavenDb acima do MongoDb, iniciei pesquisas mais aprofundadas, e esse workshop consolidou minha escolha, e reforçou as características que tornam o Raven a escolha mais recomendada e segura da atualidade.

No workshop tratamos sobre:

a) Setup do sgbd

RavenDb está habilitado para ser configurado tanto em uma única máquina, quanto em um cluster distribuído.

Ele é multi-plataforma, e está disponível para instalação em todas as principais plataformas do mercado:

  • Windows x64 / x86
  • Linux x64
  • Docker
  • MacOS
  • Raspberry Pi

O processo de setup é super intuitivo, e facilita ao extremo a configuração de um cluster seguro, com certificados Let’s Encrypt totalmente gratuitos.

RavenDbSetupWizard

b) Modelagem de documentos

Aqui vão algumas dicas valiosas ao modelar documentos:

  • O documento deve conter somente dados essenciais, e value objects.
  • Seu documento equivale a uma entidade, então outras entidades que o compõe, devem ser gravadas em coleções de documentos independentes.
  • É possível referenciar essas entidades na entidade associada, e efetuar a carga de entidades associadas de forma eficiente e rápida.
  • Um documento deve ser: Coerente e Auto-Suficiente > Não deve ser preciso carregar outros documentos, para que um documento faça sentido. Ex: Um item de pedido, faz sentido sem o documento *pedido* ? Não. Então a lista de itens de pedido, deve ser gravada em conjunto como documento *pedido*. Agora, a lista de itens de pedido, contém produtos certo? Um produto faz sentido, se não estiver vinculado a uma lista de itens do pedido? Sim, faz sentido. Por esse motivo, produto deve ser gravado em um documento independente, e *referenciado* pelos itens do pedido.
  • Um documento deve ser: Isolado > Deve poder mudar a qualquer momento, sem necessariamente ter que mudar quaisquer outros documentos.
  • É recomendado que o tamanho de um documento não ultrapasse 1 MB. Melhor ainda seria se o tamanho girasse em torno de 80 KB.

c) Alta disponibilidade

RavenDb 4.0 foi criado pensando na alta disponibilidade, e tem uma natureza distribuída. A arquitetura de cluster escolhida pelo raven é a master-master, que tem inúmeras vantagens sobre os concorrentes, por não conter um ponto único de falha. Se um nó master falhar, outro nó assumirá o papel de master.

Algumas recomendações:

  • Para que um cluster RavenDB seja beneficiado por todo o poder da arquitetura distribuída master-master, ele deve conter no mínimo 3 nós.
  • O cluster deve conter de preferência uma quantidade ímpar de nós. Pois quando nós caírem, alguns processos exigirão que a maioria absoluta dos nós esteja online. Em clusters com números pares, essa eleição da maioria pode falhar, impedindo a execução de operações que exijam consenso, como por exemplo:
    • Criar / excluir um banco de dados.
    • Adicionar/remover um nó de/para um grupo de bancos de dados.
    • Mudar configurações específicas
    • etc
  • No startup da nossa aplicação, devemos informar as url’s dos nós de nosso cluster. Mas caso você tenha por exemplo 30 nós, não é necessária informar a url de todos eles, pois informando a url de somente 1 nó, esse nó irá comunicar ao driver do ravendb a topologia completa do cluster.
  • Mesmo não sendo necessário informar estaticamente a url de todos os nós, é uma boa prática informá-los, pois, caso o nó informado caia, a sua aplicação não irá conseguir encontrar os demais.
  • RavenDb usa o protocolo RAFT para estabelecer consenso no cluster.

d) Raven Query Language

Uma das novidades mais interessantes da versão 4.0 é a RQL, uma linguagem DQL extremamente poderosa para definição de consultas.

Dentre as principais características me chamaram atenção:

  • Similaridade com linguagem SQL e LINQ.
  • Possibilidade de consumir funções javascript dentro das queryes!!!!!!!!!!
  • Possibilidade de declarar novas funções javascripts, e consumí-las imediatamente em seguida dentro de um consulta RQL!!!!!!!!!!!!!!!!!!!!!!!
  • Queryes com busca espacial. Podemos definir uma área com pontos geográficos baseados em coordenadas, e executar buscas contra essa área. O RavenDb computa esses dados e entrega o resultado pronto de forma simples e rápida.

Exemplos:

declare function MontarNomeCompleto(e)
{
var format = function(p) { return p.Nome + “ “ + p.Sobrenome; };
return { NomeCompleto: format(e) };
}
from Funcionarios as f select MontarNomeCompleto(f);

e) Usando RQL para reduzir carga de rede e latência em operações de consulta

Usando RQL, conseguimos efetuar a pré-carga de documentos associados, de forma que quando formos montar nosso DTO/ViewModel, eles já estejam pré-carregados, no mesmo round-trip do documento principal.

É a prática mais recomendada para carga de aggregate roots, pois reduz drasticamente a carga de rede e latência.

f) Features avançadas

Há 2 features extremamente produtivas que me chamaram atenção:

  • Data subscriptions: Permite a uma aplicação cliente receber um lote de documentos do RavenDb e executar operações nestes documentos. Assim que concluído o processamento, deve-se notificar o RavenDb para que ele envie o próximo lote de documentos. Tem uma ótima vantagem sobre a changes API, pois se o ouvinte da assinatura estiver offline, assim que ele se tornar novamente online, poderá continuar de onde parou.
  • Changes API: Oferece um recurso similar a “push notifications”, que avisa um determinado subscriptor de eventos que ocorreram com os dados no servidor.

Esses tópicos são somente a “ponta do iceberg”, de todos os poderosos recursos do RavenDb. Nesse post poderia ter falado mais de índices map-reduce que são impressionantemente úteis, full-text search dentre outros; mas abordarei em futuros posts.

Usa RavenDb e quer falar sobre? Fale comigo, adoraria trocar idéia sobre cenários de aplicação contigo.

Abraço e até a próxima.

 

Anúncios

Certificados de cliente no RavenDb com VM Linux Ubuntu no Azure

Olá 🙂

Estou a um tempo conhecendo mais o database RavenDb, e evoluindo o entendimento de como montar ambientes com essa plataforma.

Depois de fazer alguns testes com deploy Kubernetes no Azure AKS, parti para um deploy em uma máquina Linux com Ubuntu 16.04 LTS no Azure.

Nesse deploy, após seguir o tutorial, e optar pela configuração segura, usando o certificado do Let’s Encrypt, não consegui com que o certificado gerado automaticamente no setup, funcionasse na minha máquina.

O firefox quantum, aparentemente não aceita certificados sem senha. E mesmo que o certificado esteja armazenado na Vault do sistema operacional MacOs/Windows, ele não utiliza esses certificados pré-instalados. O chrome igualmente, também estava solicitando senha para o certificado gerado automaticamente.

Identificados esses problemas, busquei ajuda no google groups oficial do Raven DB. Uma idéia que lí no grupo, sugeria a geração de um certificado com senha, usando a RAVENDB CLI.

Segui os seguintes passos:

1. Iniciei uma conexão SSH com minha máquina virtual.

ssh -i <arquivo_privatekey_usar> user@host

2. Acessei a pasta onde montei os arquivos do RavenDB (no seu caso o path será diferente).

cd /mntdata/Server

3. Executei o binario da CLI (no windows mude para rvn.exe)

./rvn admin-channel

4. Conectado na CLI gerei um novo certificado de acesso client:

generateClientCert <name> <path-to-output-folder> [password]

5. Esse arquivo será gerado no path que você tiver especificado no output. Agora, vamos copiá-lo para nossa máquina local, de onde faremos acesso ao painel administrativo do RavenDB. Para copiar, usei o comando SCP (secured copy).

Para copiar de uma máquina remota, para a máquina local, a sintaxe é a seguinte:

scp user@host:/path/to/remotefile localfile

Feita essa cópia para a máquina local, basta instalá-lo no seu computador.

E eis nosso painel administrativo executando:

RavenDbAdminPanel

RavenDb – Painel administrativo

 

Para registrar o certificado explicitamente no Firefox, siga os seguintes passos:

1. No Firefox, vá em Preferências.

2. Procure por Certificados.

3. Na aba “Seus certificados”, clique em Import.

4. Localize o arquivo .pfx e confirme a operação.

5. Reinicie o firefox.

 

Build > Asp Net Core, Node, VSTS > unexpected end of file

Olá!

Ao criar uma build definition com Visual Studio Team Services (VSTS), ocorreu uma falha na etapa de publish, e venho aqui compartilhar a solução encontrada.

Setup:

  • Projeto ASP NET CORE
  • Agent Queuee: Hosted VS2017
  • JavaScriptServices (https://github.com/aspnet/JavaScriptServices/)
    • Server-side prerendering for universal (a.k.a. isomorphic) applications, where your Angular / React / etc. components are first rendered on the server, and then transferred to the client where execution continues
    • Webpack middleware so that, during development, any webpack-built resources will be generated on demand, without you having to run webpack manually or compile files to disk
    • Hot module replacement so that, during development, your code and markup changes will be pushed to your browser and updated in the running application automatically, without even needing to reload the page
    • Routing helpers for integrating server-side routing with client-side routing

Criei uma build definition para a camada de apresentação, com as seguintes etapas:

BuildDefinitionVstsEtapas

Ao executar o processo de build recebi o seguinte erro no processo de [ publish ]:


2017-09-25T15:51:15.6205662Z ##[section]Starting: Publish
2017-09-25T15:51:15.6205662Z ==============================================================================
2017-09-25T15:51:15.6205662Z Task : .NET Core
2017-09-25T15:51:15.6205662Z Description : Build, test, package, or publish a dotnet application, or run a custom dotnet command. For package commands, supports NuGet.org and authenticated feeds like Package Management and MyGet.
2017-09-25T15:51:15.6205662Z Version : 2.1.3
2017-09-25T15:51:15.6205662Z Author : Microsoft Corporation
2017-09-25T15:51:15.6205662Z Help : [More Information](https://go.microsoft.com/fwlink/?linkid=832194)
2017-09-25T15:51:15.6205662Z ==============================================================================
2017-09-25T15:51:16.3385534Z [command]"C:\Program Files\dotnet\dotnet.exe" publish d:\a\1\s\Tcs.Erp.UI.Web\Tcs.Erp.UI.Web.csproj --configuration release --output d:\a\1\a\Tcs.Erp.UI.Web
2017-09-25T15:51:17.8425717Z Microsoft (R) Build Engine version 15.3.409.57025 for .NET Core
2017-09-25T15:51:17.8425717Z Copyright (C) Microsoft Corporation. All rights reserved.
2017-09-25T15:51:17.8425717Z
2017-09-25T15:51:20.2386553Z Tcs.Erp.UI.Web -> d:\a\1\s\Tcs.Erp.UI.Web\bin\release\netcoreapp2.0\Tcs.Erp.UI.Web.dll
2017-09-25T15:51:45.6297302Z EXEC : npm ERR! tar.unpack unzip error d: \a\_temp\npm-3668-ce5239c6\registry.npmjs.org\typescript\-\typescript-2.4.1.tgz [d:\a\1\s\Tcs.Erp.UI.Web\Tcs.Erp.UI.Web.csproj]
2017-09-25T15:51:52.7841764Z npm ERR! Windows_NT 10.0.14393
2017-09-25T15:51:52.7841764Z npm ERR! argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install"
2017-09-25T15:51:52.7851759Z npm ERR! node v6.10.0
2017-09-25T15:51:52.7851759Z npm ERR! npm v3.10.10
2017-09-25T15:51:52.7851759Z npm ERR! code Z_BUF_ERROR
2017-09-25T15:51:52.7851759Z npm ERR! errno -5
2017-09-25T15:51:52.7851759Z
2017-09-25T15:51:52.7851759Z npm ERR! unexpected end of file
2017-09-25T15:51:52.7851759Z npm ERR!
2017-09-25T15:51:52.7851759Z EXEC : npm ERR! If you need help, you may report this error at: [d:\a\1\s\Tcs.Erp.UI.Web\Tcs.Erp.UI.Web.csproj]
2017-09-25T15:51:52.7851759Z npm ERR! <https://github.com/npm/npm/issues&gt;
2017-09-25T15:51:52.8351980Z
2017-09-25T15:51:52.8361795Z npm ERR! Please include the following file with any support request:
2017-09-25T15:51:52.8361795Z npm ERR! d:\a\1\s\Tcs.Erp.UI.Web\npm-debug.log
2017-09-25T15:51:52.8821822Z d:\a\1\s\Tcs.Erp.UI.Web\Tcs.Erp.UI.Web.csproj(36,5): error MSB3073: The command "npm install" exited with code -5.
2017-09-25T15:51:52.9151842Z ##[error]Error: C:\Program Files\dotnet\dotnet.exe failed with return code: 1
2017-09-25T15:51:52.9171845Z ##[error]Dotnet command failed with non-zero exit code on the following projects : d:\a\1\s\Tcs.Erp.UI.Web\Tcs.Erp.UI.Web.csproj
2017-09-25T15:51:52.9241833Z ##[section]Finishing: Publish

Ao procurar pelo erro no nosso amigo google, encontrei essa Issue no GitHub do npm:

https://github.com/npm/npm/issues/14394
Com a seguinte resposta:

Pasted_Image_25_09_17_13_34Então editei minha build definition, e inclui a seguinte tarefa antes do processo de [ publish ]

Pasted_Image_25_09_17_13_36

E voilà:

Pasted_Image_25_09_17_13_37Agora é só criar a [ release definition ].

🙂

O que ninguém te contou sobre o MacBook Pro e o Mac OS

04 - 17 9 comentários

Estou há 7 dias usando o famoso MacBook Pro 15″ 512SSD I7 2.7 16 GB RAM TOUCH ID E TOUCH BAR (de agora pra frente denominado somente MBP) recém adquirido. Sempre ouvi falarem bem do equipamento, e resolvi conhecer, testar. Não antes de muita pesquisa, leitura, e assistir muitos reviews no youtube.

Quanto as portas do note, eu já sabia que ia ter que comprar adaptadores, mas me convenci que portas USB-C eram mesmo o futuro. Inclusive ironicamente, o iPhone usa lightning, enquanto vários androids do mercado já vem de fábrica com portas USB-C.

No processo de escolha, considerei um Dell Latitude Quad Core vendido no Brasil, um Avell B115, ou um DELL XPS 15 (importado). Me interessei mais pelo DELL XPS 15, mas a fabricante não cobre garantia de equipamentos importados, ou seja, a Dell não vai te atender aqui no Brasil, se seu equipamento tiver sido comprado fora do país, então optei pelo APPLE.

Sou um programador .NET, e pensei que o MBP seria a máquina definitiva para desenvolvimento tanto windows (Bootcamp), quanto mobile (IOS/Android), pois é preciso uma máquina com MacOS para desenvolver para iOS com Swift. Minha idéia era usar o BOOTCAMP para ter todo o poder de fogo da máquina no ambiente windows, e trocar para MACOS quando quisesse usar recursos específicos do Mac, combinando com Parallels para usar o Windows dentro do Mac. Um recurso bem legal inclusive do Parallels, que virtualiza minha partição do bootcamp, permitindo um mix interessante.

Mas como você poderá ler abaixo, meus planos não deram tão certo.

Stacks que uso no dia-a-dia:

  • Programo em Windows Forms + ASP NET MVC + PostgreSql com Visual Studio 2017 no Windows.
  • Programo em Web com ASP.NET CORE + DOCKER +  RavenDB + Azure com JetBrains Rider e VS Code no macOS.

Equipamentos adicionais que possuo:

  • Microsoft Arc Touch Bluetooth: comprei um cinza para utilizar no meu MacBook. Mas se tornou um peso de papel, pois tem sérios problemas de pareamento com MacOs (funciona bem em Linux e Windows). Toda vez que: computador entra em suspensão, mouse entra em modo de economia de energia, ou fica parado por alguns minutos, o pareamento é invalidado, e tenho que refazer o pareamento. Refazer esse pareamento 5 vezes por dia é inviável. Eu trabalho com a tampa do notebook fechada, usando um segundo monitor. E como estou sem mouse, tenho que abrir a tampa do notebook, pra usar o trackpack, e fazer o pareamento.

    MacOs_PareamentoMicrosoftArcTouch.jpg

    Tendo que refazer o pareamento constantemente, graças a um bug do MacOs que não faço idéia como contornar. Acabei desistindo de usar o mouse.

Minhas percepções sobre o hardware do MacBook Pro:

Prós:

  • Ótimo acabamento, aparência metalizada é agradável.
  • A tela é linda. Profissionais da área gráfica devem fazer bom proveito.
  • Saída de ar fica na parte de trás, não joga o ar quente na nossa perna caso usemos no colo.
  • Creio que a dobradiça seja melhor que do meu antigo Dell Inspiron, meu Dell Inspiron começou a quebrar a dobradiça da tela com 2 anos de uso, consegui reparar, mas não ficou como o original.
  • Como ele carrega via USB-C eu consigo escolher a porta em qual vou carregar o aparelho. Se a tomada está do seu lado direito, troque o cabo de energia pra porta que está do lado direito, se a tomada está do lado esquerdo, idem.

Contras:

  • apesar da saída de ar estar bem posicionada, em várias ocasiões, ele esquenta ao ponto de cozinhar um ovo, ficando impossível utilizar no colo.
  • Como o super-aquecimento fica na região da bateria, a durabilidade dela vai ser muito menor. Espero que só a bateria se degrade rápido, pois tudo nesse computador é soldado, aumentando as probabilidades dele se tornar um peso de papel muito caro ao longo do tempo.
  • Fonte dele é branquinha, bonitinha, mas não deixa de ser um trambolho pesado, mais pesado que o notebook eu arrisco dizer.
  • Posição da tecla Ctrl no teclado não ficou boa. Um ctrl+tab pra trocar de aba no browser exige um certo “malabarismo”.

Agora vamos as minhas percepções sobre o software do computador (Mac OS Sierra 10.12.4) :

Prós:

  • O SO estimula bastante o uso de múltiplas áreas de trabalho (mesas), de forma que abramos telas no formato full screen, e nos concentremos em uma atividade de cada vez. Windows também oferece múltiplas áreas de trabalho, mas o maximizar do windows não cria uma desktop exclusiva pro aplicativo.
  • Observei que alguns aplicativos que uso no windows, tem uma estética ainda melhor no MacOS.
  • Shortcuts, muitos atalhos de teclado para diversas funções. Acho que dominar os atalhos é essencial nessa plataforma.
  • Integração com iPhone: quando o telefone toca, posso atender pelo computador, usando meu fone de ouvido. Acho ótimo evitar a radiação que o celular emite em nosso cérebro quando o utilizamos próximo a cabeça. É mais saudável. 🙂

Contras:

  • Não funciona bem com teclados externos (acentos mudam de lugar, algumas teclas não são reconhecidas). Atualizado 18/07/18: Consegui acertar os layouts de teclado.
  • Mac Os Sierra não funciona direito com o Microsoft Arc Bluetooth Mouse (detalhe: funciona bem até no linux). Comprei esse mouse pra usar quando meu macbook chegasse, e ele se tornou um peso de papel de R$ 350,00.
  • Atalho: arrastar arquivo com o botão direito do mouse, e soltar para colar uma cópia, não existe no MacOS. Atualizado 18/07/18: Acabei me acostumando a usar mais o teclado nessa rotina.
  • MacOs não te dá a mesma liberdade que o windows ao lidar com múltiplos monitores. É necessário fechar a tampa do notebook, conectado na energia, pra ele entender que eu só quero usar o monitor externo. No windows, a combinação WINDOWS+P, exibe o menu de projeção, e você não é obrigado a fechar a tampa.

    Windows_MenuDeProjecao.png

    Consigo definir com facilidade minha estratégia de utilização de um segundo monitor, através do atalho windows+p.

  • Ainda na linha de múltiplos monitores, se eu estou usando meu monitor ultra-wide, e volto para o monitor do notebook, o macos não reorganiza minhas janelas. Já o windows re-organiza as janelas, de forma que elas respeitem a borda da tela. É um pequeno detalhe, incomoda pouco.

Minha experiência com Apple Bootcamp:

  • Wifi caindo e voltando sem parar. UM HORROR! Reinstalei o bootcamp 2 vezes, excluindo a partição e começando do zero com ISO’s diferentes do Windows. Essa foi a principal razão que me fez abandonar o bootcamp.
    Veja essa busca no google sobre problemas no Wifi com Bootcamp
  • Computador esquenta muito mais que o normal, navegando na internet. Fazendo atividades simples. E detalhe, se eu reinicio a máquina e volto pra MacOS, navegando nos mesmos sites, a máquina se resfria. Parece até boicote da Apple.
    Detalhe:

    Apple_AtendimentoBootcamp.png

    Atendimento obtido via chat da apple. Em azul minhas mensagens, em cinza mensagens do atendente apple.

  • Trackpad não funciona com mais de 3 toques simultâneos. Driver porco da Apple, mal feito. Não tiveram capricho. Por sorte tem um software paralelo que melhora a compatibilidade do Trackpad com windows.
  • Bluetooth não funcionou. Meu Microsoft Arc Bluetooth, não funcionou com o driver de bluetooth que o bootcamp instala. Nem reconheceu o mouse para pareamento.

[ Atualizado em 18/07/2018 ] Desisti de usar o Bootcamp, e tenho usado Parallels.

Aplicativos para MACOS:

Algumas coisas me impressionaram na AppStore do Mac, como carência de aplicativos de qualidade, e coisas que o windows oferece built-in, você precisa usar apps de terceiros pra ter.

Ex:

Tenho um monitor ultra wide, e pra usar bem o espaço em tela, gosto de colocar janelas na metade da esquerda, e janelas na metade da direita. No windows eu usaria a combinação de teclas [ Win + Seta esquerda ] e [ Win + Seta Direita ]. No mac tive que comprar o aplicativo abaixo.

MagnetForMac

Magnet For Mac

Utilitários para descompactação – BAD

Você usa 7zip, WinRar? Esqueça isso no MAC. Até agora não encontrei um utilitário de descompactação que me permitisse extrair arquivos pré-selecionados. Os que encontrei me obrigam a extrair tudo, e depois excluir o que eu não quero.

Graças a essa carência, veja qual é o 4o aplicativo mais vendido na loja, e quanto estão pagando:

MacOs_Winzip30dolares

[ EDIT ] Estou usando o aplicativo The Unarchiver – GRATUITO.

Skitch by Evernote – GOOD

Foi uma grata surpresa encontrar na AppStore esse aplicativo que eu adoro. Me ajuda a destacar pontos em imagens, embaralhar textos, e instruções visuais. #recomendo

Captura de Tela 2017-04-27 às 21.31.39

Parallels – VERY GOOD

  • Aplicativo de virtualização muito bem feito.
  • Integração com sistema de arquivos do Mac é ótima. Salvo os arquivos da máquina virtual direto no sistema de arquivos do Mac, facilitando o trabalho simultâneo.
  • Pelo computador ser quad-core, não observei perca de performance utilizando o windows virtualizado, óbvio que tem percas, mas não pude perceber.

Conclusões:

  • Gostaria que de ouvir opiniões, dicas, se possível me ajude nos comentários a achar mais pontos positivos nessa plataforma, e que me ajudem a ser mais produtivo.
  • Espero conseguir vendê-lo e comprar um Surface Book ou um notebook gamer windows. [ Atualizado em 18/07/18 ] Me acostumei bem com a plataforma, e gosto da forma como o macOS incentiva o uso do teclado. Eu não descarto voltar pro Windows, mas ao voltar, procuraria de imediato fazer um remapeamento das teclas. Ex: Quero poder usar WINDOWS + SETA ESQUERDA e voltar pro começo da linha.

[Atualizado 27/04/2017] Faço um comparativo sobre aplicativos.

[ Atualizado 03/06/2018] O notebook começou a apresentar estalos quando abro a tampa, e quando está parado sobre a mesa. Procurando na internet pelas palavras chave “macbook pro retina creaking sound” encontrei outros donos de macbook com problemas.

[ Atualizado 01/07/2018 ] Levei o computador a Apple Morumbi mas não consegui reproduzir os estalos para o técnico. Mesmo assim, o técnico após executar alguns testes, abriu uma OS para troca da Top Case sem custos, mesmo minha garantia tendo vencido (Meus parabéns ao pós-venda da Apple).

Conclusão:

Contra: No mesmo dia que o computador saiu do reparo, após já ter saído da loja da Apple e chegar no hotel, o computador voltou a apresentar estalos. Desisto de consertar isso.

Prós: O computador, com pouco mais de 1 ano de uso, tinha um desgaste na top case, no local onde apoiamos o punho para digitar. Mas me impressiona ter esse desgaste num equipamento caro desses, e eu usando em 95% do tempo ele fechado, com monitor e teclado externo. Como isso estragou com pouco tempo de uso? Com a troca da TopCase e bateria, espero que esse desgaste não volte a aparecer.

OrdemServicoMacbookReparo

[ Atualização 18/07/2018 ] Enquanto redigia no blog o acontecimento do dia 01/07/2018, começou a acontecer um novo problema: O Fone de Ouvido está falhando. Pára de sair áudio. Testei o fone de ouvido no celular, e funciona perfeitamente. Quando reinicio a máquina ele volta a funcionar. Mas pára de funcionar aleatoriamente.

[ Atualização 18/07/2018 _ 2 ] E pra minha surpresa, voltou a acontecer um problema de meses atrás, com monitores externos. Por coincidência enquanto atualizava esse post.

Clique aqui para assistir

Nenhum texto alternativo automático disponível.

Imagem de tela distorcida. Foto tirada do monitor com o celular, mostrando a aparência da tela assim que divulguei o post no grupo ASP .NET BRASIL.

 

[ Links ] Reddit Bluetooth problems

Evolua o MessageBox com TaskDialog

Olá Pessoal.

Neste post lhes apresento o Task Dialog. Perfeito para o cenário Windows Forms + C#, onde você precisa transmitir uma mensagem em tela para o operador do seu sistema.

Na versão Windows Vista em diante, a microsoft incluiu uma API de mensagens a TaskDialog, que expande muito as possibilidades de apresentação de mensagens em tela.

Você está limitado as possibilidades abaixo?

aparência de um message box

aparência de um message box

Porquê não expandir suas possibilidades de customização para isto?

Demonstrativo com todas as opções de customização da task dialog

Demonstrativo com todas as opções de customização da task dialog

Veja que você pode adicionar Radio Buttons, Botões de Comando, área expansível, para exibir detalhes da mensagem, mensagem de rodapé com ícone, etc.

Vai melhorar a legibilidade das suas mensagens, facilitando o entendimento, e criando a possibilidade do seu operador executar ações diretamente na mensagem.

API com Task Dialog: https://msdn.microsoft.com/en-us/library/windows/desktop/bb787471%28v=vs.85%29.aspx

Para não se preocupar com os detalhes da invocação desta API seguem 2 dicas:

Wrapper para Windows Vista ou superior: http://www.codeproject.com/Articles/17026/TaskDialog-for-WinForms

Wrapper que funciona também em versões anteriores do windows: http://www.codeproject.com/Articles/21276/Vista-TaskDialog-Wrapper-and-Emulator 

Valeu pessoal.

Abraço.

Entity Framework 6, WCF e Detached Entities

Esse artigo irá ajudar outros programadores que estejam trabalhando com entity framework 6 em um cenário de inserção/alteração de entidades desatachadas.

Estou trabalhando em um sistema com o seguinte cenário:
Clients: Windows Forms e ASP NET MVC
Backend: WCF + EF6 + Azure Sql Database

No meu domínio, minhas entidades herdam desta BaseEntity abaixo:

    public class BaseEntity
    {
        public DateTime DataCadastro { get; set; }
        public DateTime DataAlteracao { get; set; }
        public virtual OperadorSistema OperadorCadastro { get; set; }
        public virtual OperadorSistema OperadorAlteracao { get; set; }
    }

E estou tentando persistir a entidade Empresa:

    public class Empresa : BaseEntity
    {
        public int EmpresaId { get; set; }
    }

Tendo apresentado o domínio, imaginem que na minha aplicação client, na tela de Edição de dados da Empresa, coleto os dados e envio para o método GravarEmpresa, no meu WCF.
No meu serviço, eu instancio um novo contexto do entity framework, e tento atachar a entidade recebida pelo WCF ao contexto:

   this._dbSet.Attach(entity);

O cadastro da empresa chegou da seguinte forma:

Tenho um usuário “Admin” cadastrado, ao gravar alterações na “Empresa”, imaginem que tanto na propriedade OperadorCadastro quanto na OperadorAlteracao, o operador “Admin” está associado, com a mesma Primary Key, mas com referências de memória diferentes.

O entity framework faz um processamento sequencial atachando a entidade root, e as entidades associadas, e dispara o seguinte erro:  “Attaching an entity of type failed because another entity of the same type already has the same primary key value.”

Para solucionar o erro, usei a biblioteca GraphDiff.

A biblioteca GraphDiff tem uma interface fluente, e facilita bastante o attach de objetos no contexto.

Conclusão:

=> Antes:

    public override void Update(Empresa entity)
    {
        this.context.Empresas.Attach(entity);
    }

=> Depois:

    public override void Update(Empresa entity)
    {
        context.UpdateGraph(entity, map => map.AssociatedEntity(ent => ent.OperadorAlteracao));
    }

Referências:
Introduzindo biblioteca GraphDiff http://blog.brentmckendrick.com/introducing-graphdiff-for-entity-framework-code-first-allowing-automated-updates-of-a-graph-of-detached-entities/

Atachando entidade desconectada http://www.entityframeworktutorial.net/EntityFramework5/attach-disconnected-entity-graph.aspx

AngularJs + Ui-Router – Controller sendo inicializado mais de uma vez

04 - 15 2 comentários

Desenvolvendo um frontend com angularjs, me deparei com um pequeno problema.

Contexto:

-> View que permite o usuário consultar o seus dados pessoais, e editá-los.

Controller:

-> Consome uma API /api/account/getdadosprofile, e atualiza a tela com os dados retornados.

Código abaixo: Configuração da minha rota utilizando plug-ins “ui-router” e “ocLazyLoad“.

.state("profile.account", {
            url: "/account",
            templateUrl: "views/profile/profile.account.html",
            data: { pageTitle: 'Minha Conta', pageSubTitle: 'dados da conta' },
            controller: "dadosUsuarioController",
            resolve: {
                deps: ['$ocLazyLoad', function ($ocLazyLoad) {
                    return $ocLazyLoad.load({
                        name: 'MyApp',
                        insertBefore: '#ng_load_plugins_before', // load the above css files before '#ng_load_plugins_before'
                        files: [
                            'js/controllers/dadosUsuarioController.js'
                        ]
                    });
                }]
            }
        })

Estou utilizando ui-router para fazer o roteamento das minhas views.

O data-bind estava funcionando corretamente na minha view, mas percebi utilizando as Developer Tools do Browser (F12), na aba Network, que estavam sendo executadas 4 requests para a API.

O problema disso? Tráfego desnecessário(e duplicado) de dados sendo feito entre client/server.

Investigando bastante a solução, passei pela documentação oficial do ui-router, e li artigos focados em ui-router, mas encontrei a resposta no seguinte post do StackOverflow:

http://stackoverflow.com/questions/15535336/combating-angularjs-executing-controller-twice

No stackOverflow a resposta/explicação se baseou no roteamento nativo do angularJs, mas percebi que isso se aplicava também no “ui-router”. A questão é: Quando especificamos o parâmetro “controller” na rota, esse controller é injetado automaticamente na minha view/template. Por não saber disso, eu declarava o controller manualmente na div.

<div ng-controller="dadosUsuarioController"> // motivo do controller ser executado 2 vezes
   // dessa forma a solução é: 1: remover a diretiva acima, 2: remover o parâmetro controller na sua rota.
</div>

Pessoal, em suma é isso, dúvidas/sugestões, enviem pelos comentários.

Abraço.

How to pass any number of parameters into a method in C# .NET

Ótima dica.

Exercises in .NET with Andras Nemes

You must have come across built-in methods in .NET where you can send any number of arguments into a method. E.g. string.Format has an overload where you can pass in a format string and then an array with the “params” modifier.

There’s nothing stopping you from using the same keyword to write a similar method, here’s an example:

Ver o post original 124 mais palavras

Categorias:Dicas / Tips

Criando Script para facilitar a instalação de Windows Service

Fala pessoal. Desenvolvi um Windows Service, e fui procurar as melhores formas de acelerar o processo: compila/desinstala versão anterior/instala versão nova, no ambiente de desenvolvimento. Pois ao desenvolver um Windows Service, para debugar temos que enfrentar essa rotina de registrar no S.O. 1ª abordagem: Tentei usar os “post-build” events, que podem ser configurados direto no Visual Studio, para que, sempre que eu compilasse, o VS já fizesse automaticamente este trabalho de desinstalar a versão anterior e instalar a nova. Problema: Precisa executar em modo administrador os comandos do Post-Build, o que me fez desistir de encontrar uma solução nesse sentido. 2ª abordagem: Criei um .BAT no Notepad++. O motivo de eu ter criado o .BAT fora do visual studio? Tudo que é criado no editor do visual studio, pega o encoding UTF-8, o que gera problemas na execução do batch. Justamente por isso, criei no notepad++, lembrando de colocar o encoding para ASCII. Problema: * Eu não sabia como obter o path do .bat, e não queria definir um path absoluto no script, pois dessa forma o script não serviria para outros desenvolvedores rodarem em suas máquinas. Solução: Usei como exemplo o seguinte código encontrado no stackoverflow: http://stackoverflow.com/questions/13934063/install-windows-service-as-easy-as-possible-with-visual-studio-2012 Com o .BAT criado, adicionei o arquivo no projeto com as seguintes propriedades: Copy to Output Directory = Copy always Build Action = None Dessa forma, sempre que o Build for executado, o .bat vai ser copiado para a pasta de output, ficando pronto para ser executado. Até a próxima.

BoletoBr – Validando arquivo remessa Cnab 400 Itau

10 - 14 10 comentários

Olá pessoal.

Desenvolvi em conjunto com o https://www.facebook.com/SamuelR.sro uma biblioteca para geração de boletos em .NET.

É open source e está disponível no github: https://github.com/gabrielrb/boletobr.

Gera boletos nos principais bancos nacionais: Itaú, Caixa, Bradesco, Banco do Brasil, HSBC. É uma biblioteca fácil de manter e expandir.

Hoje passamos por uma dificuldade ao validar o arquivo de remessa CNAB 400 Itaú.

O validador do Itaú apontava que o arquivo estava incorreto, apontava uma posição errada ao preencher o CEP.

Erro ao validar layout 400

Verificamos todo o layout gerado pelo BoletoBr, campo a campo, olhando a documentação do Itaú e não encontramos um erro sequer.

Então conseguimos um arquivo de remessa válido com um cliente, e observamos que estava igual ao nosso as posições do campo.

Conclusão: Codificação. O BoletoBr gerava o arquivo de remessa no formato UTF-8, e o validador do Itaú, só reconhece corretamente arquivos de remessa codificados em ANSI.

É uma informação que não é informada na documentação dos bancos, e é muito importante, pois impede a leitura correta do arquivo de remessa.

Após descobrir esta solução inesperada, escrevi este post para ajudar os colegas desenvolvedores.

Um abraço.

Categorias:BoletoBr Tags:, , , , ,
Viagem e Voo

Dicas para viagens, férias e voos nacionais e internacionais

Ivan Guimarães Meirelles

Analista Desenvolvedor

Void Podcast

Vazio e sem retorno de valor

Elemar DEV

Negócios, tecnologia e desenvolvimento

2,000 Things You Should Know About WPF

Everything a WPF Developer Needs to Know, in Bite-Sized Chunks

blog

so long

Fernando Franzini Blog

Engenharia de Software e Arquitetura Ágil

Gabriel RB.net

Blog técnico, com dicas, códigos, novidades e problemas do dia-a-dia programando.

Alexandre Valente's Blog

Experiências em tecnologia e assuntos diversos

%d blogueiros gostam disto: