Contents tagged with Desenvolvimento

  • GitLab.com - erro 404 (not found) ao tentar clonar um repositório

    12/06/2017

    Para quem está com problemas sobre não conseguir clonar um repositório do GitLab fica a dica.

    Resumindo: o problema é sobre a credencial salva no Windows não aceita pelo GitLab.

    Abaixo a tela de erro após tentar clonar pelo TortoiseGit (com qualquer aplicativo daria problema):

    Mesmo após tentar configurar as credenciais avulsas o Git insistia em buscar a configuração que estava gravada no Windows (10):

    Esse era o motivo, a credencial salva no Windows estava sendo aplicada mesmo eu indicando outra, no caso do GitLab a mensagem de erro retornada não é nada sugestiva diga-se de passagem, sendo retornado um erro HTTP 404, sendo que o erro é de credencial inválida.

    No meu caso eu preferi editar a credencial existente com o usuário e senha corretos:

    Após a correção o processo de clonagem do repositório funcionou sem problemas:

    Referência: 

    • https://gitlab.com


  • ASP.NET MVC - Retornando um erro 500 com mensagem (explicando quando ocorre status code = 0)

    21/07/2016

    Em desenvolvimento web podemos (devemos!) trabalhar com código protegido no lado do servidor (entre try...catch), para então - também - trabalharmos com mensagens amigáveis ao usuário, para isso para uma exceção gerada no servidor retornamos também a mensagem de erro tratada.

    O exemplo abaixo é só um snippet no contexto MVC considerando método POST no Controller com retorno do tipo ActionResult:

    ​Então no bloco catch temos:

     

    return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, mensagem);  

    Sendo que a variável mensagem tem o valor de "ERROR FORÇADO NO SERVIDOR".

    Como resultado da chamada temos o seguinte retorno:

    Tudo certo, mensagem retornada, status code = 500.

     

     

    RESSALVA!!!

    Em uma outra simulação.

     

    return new HttpStatusCodeResult(HttpStatusCode.InternalServerError, mensagemMuitoGrande);

     

     

    Digamos então que a variável mensagemMuitoGrande tenha um valor grande (não sei precisar o limite), pode ser um log mais completo do erro, não sei, qualquer conteúdo string que extrapole o limite.

     

    Você então irá se deparar com um problema que está relacionado ao tamanho do response e com isso a interceptação da exceção gerada terá um status code = 0, ao invés de 500, e nada de mensagem retornada.

    A informação mais completa no rastreamento da rede (fico devendo a imagem) exibe como "aborted", ou seja, o tal limite atingido faz com que o retorno do request seja "cancelado/abortado".

     


     


  • Tabela de acentos em JavaScript

    20/07/2016

    Quem trabalha com desenvolvimento em Javascript de vez em sempre precisa utilizar frameworks de terceiros (ExtJS, Bootstrap, Jquery, AngularJS, DevExtreme e outras) ou mesmo construir uma própria código nativo.

    Sobre acentuação, em alguns casos a meta tag charset pode não ser suficiente para corrigir problemas de textos exibidos ao usuário com caracteres estranhos.

    Para a situação citada você pode substituir os acentos por códigos.

    Abaixo uma tabela com os tais caracteres e os seus substitutos:

    á = \u00e1

    à = \u00e0

    â = \u00e2

    ã = \u00e3

    ä = \u00e4

    Á = \u00c1

    À = \u00c0

    Â = \u00c2

    Ã = \u00c3

    Ä = \u00c4


    é = \u00e9

    è = \u00e8

    ê = \u00ea

    ê = \u00ea

    É = \u00c9

    È = \u00c8

    Ê = \u00ca

    Ë = \u00cb


    í = \u00ed

    ì = \u00ec

    î = \u00ee

    ï = \u00ef

    Í = \u00cd

    Ì = \u00cc

    Î = \u00ce

    Ï = \u00cf


    ó = \u00f3

    ò = \u00f2

    ô = \u00f4

    õ = \u00f5

    ö = \u00f6

    Ó = \u00d3

    Ò = \u00d2

    Ô = \u00d4

    Õ = \u00d5

    Ö = \u00d6


    ú = \u00fa

    ù = \u00f9

    û = \u00fb

    ü = \u00fc

    Ú = \u00da

    Ù = \u00d9

    Û = \u00db


    ç = \u00e7

    Ç = \u00c7


    ñ = \u00f1

    Ñ = \u00d1


    & = \u0026

    ' = \u0027

    Referências:


  • Monitorando ataques a aplicações Web em ASP.NET

    20/07/2016

    As aplicações que desenvolvi para clientes possuem um mecanismo de log que implementei que também detecta erros na requisição de rotas ASP.NET MVC além de erros de aplicação, validações, regras de negócio e outros.

    Inicialmente quando pensei em fazer isso não imaginava que seria útil para outrs fins, de vez em quando recebo e-mails de requisições de tentativas fúteis em encontrar falhas de segurança na aplicação baseadas em requests lançados a esmo por crackers querendo invadir sites nem que seja apenas para defacing.

    Fúteis pois são como tiro no escuro numa sala vazia, ou seja, nunca acertará nada no meu caso pelo menos, tentam explorar falhas de frameworks ou aplicações em Javascript, JSP ou PHP.

    Uma pequena lista de falhas que tenta explorar:

    • Error: The controller for path '/testproxy.php' was not found or does not implement IController.
    • Error: The controller for path '/menuBcm.js' was not found or does not implement IController.
    • Error: The controller for path '/web-console/ServerInfo.jsp' was not found or does not implement IController.
    • Error: The controller for path '/modules/simpleslideshow/uploadimage.php' was not found or does not implement IController.
    • Error: The controller for path '/license.php' was not found or does not implement IController.
    • Error: The controller for path '/wp-login.php' was not found or does not implement IController.
    • Error: The controller for path '/AdServer/UCookieSetPug' was not found or does not implement IController.

    Estou pensando em realmente entrar na brincadeira simulando a página como a que tentam acessar para extrair a informação que estão tentando submeter.


  • LINQ :: Select().Max() considerando retorno que pode ser nulo

    20/07/2016

    Para quem desenvolve sistemas e trabalha com LINQ e banco de dados, pode existir uma situação em que seja necessário fazer o que utilizando SQL convencional seria um SELECT MAX(campo), sendo que normalmente campo uma chave primária (particularmente eu trabalho com PKs identity ou sequences).

    O objetivo é simples, encontrar o maior valor para um determinado campo.

    A sugestão utilizando LINQ é algo como:

    decimal consultaId = ContextoBD.Query<TipoDominio>()     .Select(x => (decimal?)x.Id)     .Max() ?? 0; var maiorId = (consultaId + 1); return (int)maiorId;

    Mas então a pergunta, "qual o detalhe do código, não seria óbvio só utilizar o método Select() e então Max() diretamente para uma variável Int?".
    Só que isso não funciona em todos os casos!
    O detalhe no código acima está em utilizar um tipo decimal como retorno com um cast nulável da coluna alvo (Id) e um operador de coalescência nula garantindo 0 como retorno.
    O motivo por tal manobra é que o LINQ irá falhar caso exista algum valor nulo (ou coleção vazia) e tentará retornar um valor nulo para um tipo Int, mesmo que você determinei que possa aceitar Int?, pra mim isso é um bug, mas enfim, o código garantirá um valor zero nas condições que de maneira convencional daria um erro em tempo de execução, sim, porque em tempo de compilação não daria erro.
    Referências:


  • IIS Express - resolver problemas de cache

    24/06/2016

    Quem desenvolve com o Visual Studio deve, em algum momento, ter esbarrado com algum comportamento estranho do IIS Express após alguma mudança de arquivos do projeto fora do contexto do Visual Studio.

    A solução que encontrei foi a exclusão do site no IIS Express para que seja posteriormente criado pelo Visual Studio, assim como da primeira vez.

    $appCmd = "C:\Program Files (x86)\IIS Express\appcmd.exe"
    $result = Invoke-Command -Command {& $appCmd 'list' 'sites' '/text:SITE.NAME' }
    for ($i=0; $i -lt $result.length; $i++)
    {
        Invoke-Command -Command {& $appCmd 'delete' 'site'  $result[$i] }
    }
    

    Esse snippet exclui todos os sites, mas pode ser facilmente adaptado para um apenas.


  • Login em uma URL com redirecionamento para outra após a autenticação

    24/06/2016


    A necessidade é bem simples, autenticar num site web e então após isso redirecionar para outra URL.

    O fato esperado é que após ocorrer o submit para a URL da action o contexto da página corrente não existe mais, claro, então rotinas colocadas por exemplo no evento "onsubmit" do form não funcionarão. Pelo mesmo motivo quaisquer rotinas a serem executadas por um setTimeout() na página também não serão executados, que foi um caso que tentei, um timer local considerando que se passaram X segundos e que nesse período a autenticação ocorreu.

    Além desse problema de contexto alterado houve ainda problemas sobre CORS quando tentei utilizar um código mais limpo com XMLHttpRequest fazendo o POST para a URL da action, então a solução mais simplista e funcional foi:

    1. Copiar o HTML original da página de autenticação.
    2. Pré-preencher os valores de usuário e senha.
    3. Simular o clique no botão, na verdade não o método click, mas o método submit.
    4. Meta tag para fazer o redirecionamento para a página destino desejada.
    Mas o segredo mesmo para se manter no contexto foi o "target" do form ser um iframe, nesse caso usar a Metatag foi só para evitar mais um script, eu poderia usar um setTimeout(), mesmo o onsubmit funcionaria.



    Abaixo a solução para o mundo ideal (usuário e senha corretos por exemplo).
    Veja que a solução é HTML+Javascript puro, nada de JQuery ou outra framework.

    
    <meta http-equiv="refresh" content="5; url=http://URL_APOS_AUTENTICAR">
     
    <form action="http://URL_DE_AUTENTICA" method="post" name="acesso" id="acesso" target="logado" hidden="hidden">
        <input name="nome" type=text size=30 maxlength=30 value='usuário'>
        <input name="senha" type=password size=30 maxlength=30 value='senha'>
        <input type="submit" name="Entrar" id="Entrar" value="Entrar">
    </form> 
     
    <iframe name="logado" id="logado" hidden="hidden"></iframe>
     
    <h2>Executando processo de autenticação, aguarde...</h2>
     
    <script>
     
        // autentica para o iframe escondido.
        document.getElementById('acesso').submit();
     
    </script>
    
    
    
    
    
    
    Referências: 
    • http://pt.wikipedia.org/wiki/Cross-origin_resource_sharing
    • http://www.w3schools.com/xml/xml_http.asp
    
    


  • Microsoft abraça o Open Source de verdade no desenvolvimento de aplicações

    21/06/2016

    Após um bom tempo apenas cozinhando Open Source, parece que a Microsoft resolveu definitivamente abraçar a causa.

    .NET Foundation Projects

    Projects under the stewardship of the .NET Foundation currently include the .NET Compiler Platform ("Roslyn") as well as the ASP.NET family of projects, both of which were open sourced by Microsoft Open Technologies, Inc. (MS Open Tech). Xamarin has contributed several open source .NET projects, including the very popular Mailkit and Mimekit projects. We’re actively engaged in bringing many more projects into the foundation, see our blog for the latest announcements.

    Pick a project below to learn more about it and how to contribute:

    Referência: http://www.dotnetfoundation.org/projects


  • Problema de rolagem de HTML em iframe no iOS

    21/06/2016

    O "Causo"

    Recentemente tive um problema que, consultando vários fóruns, confirmei que realmente existe uma situação única de problema de rolagem de conteúdo HTML em um iframe em qualquer browser executado no iOS.


    Como é que funciona?

    Os browsers em dispositivos móveis adequam a rolagem de conteúdo com aquela forma elástica que ocorre quando a gente segura a tela com o dedo e arrasta para cima ou para baixo e então soltando o conteúdo vai rolando na direção que soltou sozinho até parar.

    Nessa condição a scrollbar padrão, aquela feiura antiquada, dá lugar a outra, e o comportamento de clique muda também para se comportar da maneira citada, toque, segura e solta.

    Essa mudança de visual e funcionamento difere da execução em desktop em que aparece a barra de rolagem e o conteúdo rola apenas ao clicar na barra lateral ou com teclas de atalho (page down, up e etc), e se segurar o cursor do mouse com o clique em algum ponto irá marcar texto (alguns browser permitem mudar esse comportamento para tipo o estilo mobile).

    Sim, mas e daí?

    Esbarrei pelo problema usando o Ext.Net (ExtJS), na verdade não é culpa dele, mas sim do iframe em que o conteúdo HTML é embutido. O funcionamento do sistema era abrir rotas/URLs em janelas dentro da principal simulando o funcionamento de janelas do Windows por exemplo, mas para isso a parte interna das janelas é um iframe.

    O fato apenas ocorre no iOS, em qualquer Android funciona, no caso não havia a mudança para o estilo mobile, continuava o HTML com rolagem estilo desktop.

    Então depois de algumas pesquisas em fóruns, vários indicavam a pequena iscrolljs.com.

    Basicamente o funcionamento é o de se colocar uma DIV dentro de outra DIV, cada uma com o seu devido CSS aplicado (tem tudo no site), e no onLoad() da página instanciar um objeto da iScroll (bastante sugestivo o prefixo do nome).

    Na minha aplicação passei por mais problemas, pois trabalhando com o ExtJS vi que não poderia utilizar os Ext.Panels padrões pela injeção de HTML indesejado, cheguei até a testar mas não funcionou, de qualquer maneira consegui contornar usando o iScroll na forma mais simples, pelos próprios exemplos do site dele.

    Eu cheguei a ver algumas soluções baseadas em ExtJS mas achei muito, mas muito complexas, exageradamente...criação de componentes com herança, eventos e etc, muita ladainha para uma necessidade mais direta de aplicar, e olha que no meu caso eu tinha alguns poréns a mais:

    1. Store é atualizada disparando evento DataChanged...
    2. ...DataView atrelada à Store renderiza conteúdo...
    3. ...captura do HTML renderizado na DataView...
    4. ...injeção do HTML dentro da DIV mais interna usada pelo iScroll.

    Só serve para isso?

    Não!

    Existem algumas outras funções bastante interessantes como zoom, scroll infinito (carga de HTML por demanda) e outras, que um dia irei explorar, o importante é saber que há como fazer e o iScroll é a solução atual mais simples e leve de aplicar.

    Mas lembre-se!

    Apenas para ficar ciente, o comportamento do scroll de conteúdo passará a ser "estilo" mobile mesmo em browser no desktop, ou seja, para rolar tem-se que clicar, segurar e jogar o cursor para uma direção, prático como se utiliza um tablet e celular, mas pode ser que alguns usuários estranhem no desktop.


  • Editor WYSIWYG - Colando uma imagem da área de trabalho no Chrome

    21/06/2016

    Quem trabalha com desenvolvimento web provavelmente já precisou implementar um "editorzinho" de textos básico com formatação (negrito e etc, alteração de fonte e etc), o famoso editor no estilo WYSIWYG, quase um Word. :)

    Existem diversas soluções no mercado que podem ser integradas a projetos de terceiros e eu creio que uma das mais completas seja o CKeditor, no meu caso optei por algo mais enxuto, mas com o mínimo necessário além de um API que me atendesse, o SCEditor.

    Apesar de N tipos de editores, alguns muito simples, outros bem completos, todos os que vi funcionam com a mesma lógica de disponibilização da área que será editada, a definição da propriedade "ContentEditable=true" na tag HTML que então será a área do editor.

    ...então caímos no assunto da publicação, nem todos os browsers aceitam colar uma imagem no editor!

    Quando o usuário faz uma captura de tela pela tecla Print Screen ou com uma ferramenta (SnagIt por exemplo), a imagem fica na área de transferência, então ao colar no editor a mesma é codificada para o padrão texto Base64 e embutida em uma tag IMG no HTML , recurso idêntico ao GMail quando incorpora imagens como anexo, bem, esse é o comportamento correto, mas...no Chrome nada acontece.

    Testei no Internet Explorer 11 e no Firefox 35 e funciona certinho, mas no Chrome 40 nada acontece, quando a gente tenta colar uma imagem nem mesmo aparece algum indicador que foi tentado, já com texto ou HTML na área de transferência o mesmo é colado sem problemas.

    Tentei encontrar alguma chave de configuração no Chrome que permitisse colar imagem mas não encontrei nada, algo tipo "Enable Image Paste".


    Então resolvi apelar testando códigos de interceptação do "paste" da imagem pelo usuário, e 

    não é que funcionou!



    A SOLUÇÃO

    A idéia básica é interceptar o "paste" dado pelo usuário, interpretar o conteúdo da área de trabalho como imagem, gerar a cadeia base64 da image e então injetar no HTML do editor a tag IMG com a string.

    Não há uma solução genérica, uma que funcione em qualquer browser, a que funcionou está na referência 2 abaixo, e ainda precisei fazer algumas alterações.

    Como o problema é apenas no Chrome descartei o código para os outros browsers.

    Ao invés de incorporar a imagem como base64 eu poderia salvá-la em disco e então adicionar uma tag IMG com o link da imagem no servidor, isso não seria um problema, o mais difícil foi achar uma rotina que interceptasse o "paste" no Chrome.

     

    [Atualização em 25/fev/15]

    Após colocar o comentário sobre o problema num fórum do site do SCEditor que eu utilizo, o autor mandou uma solução mais enxuta da mesma idéia, e que pelo o que testei funciona de forma genérica (são algumas poucas alterações do código original que montei):

    var IMAGE_MIME_REGEX = /^image\/(p?jpeg|gif|png)$/i;
    
    var loadImage = function (file) {
        var reader = new FileReader();
        reader.onload = function(e){
            var img = document.createElement('img');
            img.src = e.target.result;
            
            var range = window.getSelection().getRangeAt(0);
            range.deleteContents();
            range.insertNode(img);
        };
        reader.readAsDataURL(file);
    };
    
    document.onpaste = function(e){
        var items = e.clipboardData.items;
    
        for (var i = 0; i &lt; items.length; i++) {
            if (IMAGE_MIME_REGEX.test(items[i].type)) {
                loadImage(items[i].getAsFile());
                return;
            }
        }
        
        // Normal paste handling here
    }

    Referências:

    1. http://pt.wikipedia.org/wiki/WYSIWYG
    2. https://gist.github.com/Buildstarted/4577472/
    3. http://www.w3schools.com/jsref/event_onpaste.asp
    4. http://pt.wikipedia.org/wiki/Base64
    5. http://stackoverflow.com/questions/237254/how-do-you-handle-oncut-oncopy-and-onpaste-in-jquery
    6. http://www.sceditor.com/posts/how-to-upload-and-insert-an-image/
    7. http://ckeditor.com/
    8. http://jsfiddle.net/6yocdszm/ (atualização de 25/fev/15)