DevHouse Internet Software Development House http://localhost:8080 Desenvolvimento de Sistemas para Internet e Mobile Tue, 23 Jun 2026 08:58:43 +0000 pt-BR hourly 1 https://wordpress.org/?v=4.8.14 [Dica] Ícone do Skype não aparece no Ubuntu http://localhost:8080/dica-icone-do-skype-nao-aparece-no-ubuntu/ http://localhost:8080/dica-icone-do-skype-nao-aparece-no-ubuntu/#respond Thu, 27 Aug 2015 18:43:55 +0000 http://www.devhouse.com.br/?p=879 Para fazer o ícone do Skype aparecer no systray do Unity no Ubuntu adicione o pacote sni-qt com o seguinte comando:

sudo apt-get install sni-qt:i386

Faça log out ou reinicie e pronto!

]]>
http://localhost:8080/dica-icone-do-skype-nao-aparece-no-ubuntu/feed/ 0
Configurando HTTPS no Wildfly http://localhost:8080/configurando-https-no-wildfly/ http://localhost:8080/configurando-https-no-wildfly/#comments Mon, 04 May 2015 15:29:26 +0000 http://www.devhouse.com.br/?p=790 Esta configuração é apenas para habilitar o https em uma máquina de desenvolvimento com o Servidor de Aplicação Wildfly. Não fui a fundo na questão de segurança já que não sou eu que administro o servidor onde vai rodar a aplicação. Portanto não use isto em ambiente de produção.

Estou usando o Wildfly 8.2.0.Final.

  1. A primeira coisa a fazer é entrar no diretório da instalação do Wildfly, na pasta ./standalone/configuration/  e executar o seguinte comando:
    keytool -genkeypair -alias serverkey -keyalg RSA -keysize 2048 -validity 7360 -keystore localhost.keystore -keypass mypassword -storepass mypassword -dname "cn=Server Administrator,o=Acme,c=GB"
  2. Edite o arquivo ./standalone/configuration/standalone.xml e adicione o seguinte xml dentro de security-realms:
    <security-realm name="UndertowRealm">
    	<server-identities>
    		<ssl>
    			<keystore path="localhost.keystore" relative-to="jboss.server.config.dir" keystore-password="mypassword"/>
    		</ssl>
    	</server-identities>
    </security-realm>
  3. Em seguida adicione a linha abaixo dentro de subsystem undertow -> server
    <https-listener name="https" socket-binding="https" security-realm="UndertowRealm"/>

    Veja como ficou a entrada completa:

    <subsystem xmlns="urn:jboss:domain:undertow:1.2">
    	<buffer-cache name="default"/>
    	<server name="default-server">
    		<http-listener name="default" socket-binding="http"/>
    		<https-listener name="https" socket-binding="https" security-realm="UndertowRealm"/>
    		<host name="default-host" alias="localhost">
    			<location name="/" handler="welcome-content"/>
    			<filter-ref name="server-header"/>
    			<filter-ref name="x-powered-by-header"/>
    		</host>
    	</server>
    	<servlet-container name="default">
    		<jsp-config/>
    		<websockets/>
    	</servlet-container>
    	<handlers>
    		<file name="welcome-content" path="${jboss.home.dir}/welcome-content"/>
    	</handlers>
    	<filters>
    		<response-header name="server-header" header-name="Server" header-value="WildFly/8"/>
    		<response-header name="x-powered-by-header" header-name="X-Powered-By" header-value="Undertow/1"/>
    	</filters>
    </subsystem>

 

Pronto, reinicie o servidor e acesse https://localhost:8443.

]]>
http://localhost:8080/configurando-https-no-wildfly/feed/ 14
[Resolvido] Error: (state SENT_SECOND_EHLO) code(0) ou [Server response: read error code(0) ] no GMail http://localhost:8080/resolvido-error-state-sent_second_ehlo-code0-ou-server-response-read-error-code0/ http://localhost:8080/resolvido-error-state-sent_second_ehlo-code0-ou-server-response-read-error-code0/#respond Mon, 09 Feb 2015 23:11:38 +0000 http://www.devhouse.com.br/?p=777 Caso você esteja configurando o Gmail para ler as mensagens do Outlook do M$ Office 365 via SMTP e POP3 mas ocorre os seguintes erros:

Error: (state SENT_SECOND_EHLO) code(0)

Ou

Error: [Server response: read error code(0) ]

A solução é simples: altere o endereço do servidor SMTP de outlook.office365.com para o servidor específico para a sua localização geográfica.

  1. Abra o prompt de comando e  digite: ping outlook.office365.com
  2. Anote qual o endereço de retorno como por exemplo: outlook-namsouth.office365.com
    PING outlook-namsouth.office365.com (132.245.16.242): 56 data bytes
    64 bytes from 132.245.16.242: icmp_seq=0 ttl=241 time=172.730 ms
    64 bytes from 132.245.16.242: icmp_seq=1 ttl=241 time=189.141 ms
    64 bytes from 132.245.16.242: icmp_seq=2 ttl=241 time=169.283 ms
    64 bytes from 132.245.16.242: icmp_seq=3 ttl=241 time=168.586 ms
    64 bytes from 132.245.16.242: icmp_seq=4 ttl=241 time=164.661 ms
    ^C
    --- outlook-namsouth.office365.com ping statistics ---
    5 packets transmitted, 5 packets received, 0.0% packet loss
    round-trip min/avg/max/stddev = 164.661/172.880/189.141/8.525 ms
    MacBookAir:~ leonardo$
    
  3. Insira outlook-namsouth.office365.com no lugar de outlook.office365.com
  4. Use seu email completo como usuário.
  5. Porta 587 e criptografia TLS.

Pronto!

]]>
http://localhost:8080/resolvido-error-state-sent_second_ehlo-code0-ou-server-response-read-error-code0/feed/ 0
Copiar / Download de um site inteiro com WGET [ripar] http://localhost:8080/copiar-download-de-um-site-inteiro-com-wget-ripar/ http://localhost:8080/copiar-download-de-um-site-inteiro-com-wget-ripar/#respond Sat, 11 Oct 2014 08:44:03 +0000 http://www.devhouse.com.br/?p=765 Para copiar um site inteiro, incluindo fotos, arquivos js e css usando o wget no Linux execute o seguinte comando:

 

$ wget \
     --user-agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36" \
     --recursive \
     --no-clobber \
     --page-requisites \
     --html-extension \
     --convert-links \
     --restrict-file-names=windows \
     --domains exemplo.com \
     --no-parent \
     -e robots=off \
     --load-cookies=cookies.txt \
         exemplo.com/blog

o parâmetro –domains informa ao wget para só baixar arquivos daquele domínio.
O último diz de qual raiz copiar. Nesse caso eu só copiaria os arquivos, recursivamente, do /blog do site exemplo.com.

A explicação dos parâmetros segue abaixo. Depois eu traduzo:

–recursive: download the entire Web site.

–domains website.org: don’t follow links outside website.org.

–no-parent: don’t follow links outside the directory tutorials/html/.

–page-requisites: get all the elements that compose the page (images, CSS and so on).

–html-extension: save files with the .html extension.

–convert-links: convert links so that they work locally, off-line.

–restrict-file-names=windows: modify filenames so that they will work in Windows as well.

–no-clobber: don’t overwrite any existing files (used in case the download is interrupted and
resumed).

]]>
http://localhost:8080/copiar-download-de-um-site-inteiro-com-wget-ripar/feed/ 0
Acessar dbAdapter ou outra resource do bootstrap de qualquer lugar da aplicação [Zend Framework 1] http://localhost:8080/acessar-dbadapter-ou-outra-resource-do-bootstrap-de-qualquer-lugar-da-aplicacao-zend-framework-1/ http://localhost:8080/acessar-dbadapter-ou-outra-resource-do-bootstrap-de-qualquer-lugar-da-aplicacao-zend-framework-1/#respond Tue, 30 Sep 2014 12:27:24 +0000 http://www.devhouse.com.br/?p=757 $bootstrap = Zend_Controller_Front::getInstance()->getParam('bootstrap'); $resource = $bootstrap->getPluginResource('db'); $adapter = $resource->getDbAdapter();

 

]]>
http://localhost:8080/acessar-dbadapter-ou-outra-resource-do-bootstrap-de-qualquer-lugar-da-aplicacao-zend-framework-1/feed/ 0
Habilitando Syntax Highlighting no Nano http://localhost:8080/habilitando-syntax-highlighting-no-nano/ http://localhost:8080/habilitando-syntax-highlighting-no-nano/#respond Mon, 29 Sep 2014 18:29:06 +0000 http://www.devhouse.com.br/?p=750 Estou desenvolvendo um software em PHP e testando algumas modificações direto no servidor. Para editar os arquivos php eu uso o nano (não me acostumei ao vi). Então senti falta de cores no código para facilitar a compreensão e tirar um pouco a monotonia do monocromático. E funciona via ssh!

Veja se os arquivos de highlight estão no diretório /usr/share/nano/

$ ls /usr/share/nano/
asm.nanorc     fortran.nanorc   man.nanorc     ocaml.nanorc   ruby.nanorc
awk.nanorc     gentoo.nanorc    mgp.nanorc     patch.nanorc   sh.nanorc
c.nanorc       groff.nanorc     mutt.nanorc    perl.nanorc    tcl.nanorc
cmake.nanorc   html.nanorc      nano-menu.xpm  php.nanorc     tex.nanorc
css.nanorc     java.nanorc      nanorc.nanorc  pov.nanorc     xml.nanorc
debian.nanorc  makefile.nanorc  objc.nanorc    python.nanorc

No meu caso todos os arquivos estavam lá exceto o php.nanorc. Justo o que eu precisava. Então peguei da net. Segue ele na íntegra:

## PHP Syntax Highlighting
syntax "php" "\.php[2345s~]?$"
color white start="<\?(php|=)?" end="\?>"
# Functions
color brightblue "([a-zA-Z0-9_-]*)\("
# Constructs
color brightblue "(class|extends|goto) ([a-zA-Z0-9_]*)"
color green "[^a-z0-9_-]{1}(var|class|function|echo|case|break|default|exit|switch|if|else|elseif|endif|foreach|endforeach|@|while|public|private|protected|return|true|false|null|TRUE|FALSE|NULL|const|static|extends|as|array|require|include|require_once|include_once|define|do|continue|declare|goto|print|in)[^a-z0-9_-]{1}"
color brightblue "[a-zA-Z0-9]+:"
# Variables
color white "\$[a-zA-Z_0-9$]*|[=!<>]"
color white "\->[a-zA-Z_0-9$]*|[=!<>]"
# Special Characters
color yellow "[.,{}();]"
color yellow "\["
color yellow "\]"
color yellow "[=][^>]"
# Numbers
color magenta "[+-]*([0-9]\.)*[0-9]+([eE][+-]?([0-9]\.)*[0-9])*"
color magenta "0x[0-9a-zA-Z]*"
# Special Variables
color brightblue "(\$this|parent::|self::|\$this-\>)"
# Bitwise Operations
color magenta "(\;|\||\^){1}"
# And/Or/SRO/etc
color green "(\;\;|\|\||::|=>|->)"
# Online Comments
color brightyellow "(#.*|//.*)$"
# STRINGS!
color red "('[^']*?')|(\"[^\"]*?\")"
# Inline Variables
color white "\{\$[^}]*\}"
# PHP Tags
color red "(<\?(php)?|\?>)"
# General HTML
color red start="\?>" end="<\?(php|=)?"
# trailing whitespace
color ,green "[^[:space:]]{1}[[:space:]]+$"
# multi-line comments
color brightyellow start="/\*" end="\*/"

Gravei o arquivo php.nanorc em uma pasta do meu usuario mesmo. Depois precisei criar um arquivo .nanorc e incluir o caminho para os arquivos de sintaxe:

$ nano ~/.nanorc
include /usr/share/nano/sh.nanorc
inclue ~/php.nanorc

E pronto, é só editar um arquivo php:

nano-syntax-highlight

Nano com Syntax Highlight

]]>
http://localhost:8080/habilitando-syntax-highlighting-no-nano/feed/ 0
Impedir que um Script PHP seja executado ao mesmo tempo no Cron http://localhost:8080/impedir-que-um-script-php-seja-executado-ao-mesmo-tempo-no-cron/ http://localhost:8080/impedir-que-um-script-php-seja-executado-ao-mesmo-tempo-no-cron/#respond Mon, 29 Sep 2014 18:11:53 +0000 http://www.devhouse.com.br/?p=748 Estou construindo um script de sincronia de banco de dados que deve rodar de 5 em 5 minutos na cron do linux. O problema é que ele pode acabar durando mais do que cinco minutos então pesquisando uma forma de evitar que o script seja executado novamente antes que o anterior termine encontrei a solução no link abaixo e coloco aqui com pequenas alterações:

http://abhinavsingh.com/blog/2009/12/how-to-use-locks-in-php-cron-jobs-to-avoid-cron-overlaps/

Crie um arquivo chamado CronHelper.php e adicione o código abaixo (eu coloquei na mesma pasta do meu script cron):

<?php
define('LOCK_DIR', __DIR__ . '/');
define('LOCK_SUFFIX', '.lock');

class CronHelper {
    private static $pid;

    function __construct() {
        
    }

    function __clone() {
        
    }

    private static function isrunning() {
        $pids = explode(PHP_EOL, `ps -e | awk '{print $1}'`);
        if (in_array(self::$pid, $pids)) {
            return TRUE;
        }
        return FALSE;
    }

    public static function lock() {
        global $argv;
        
        $path_parts = pathinfo($argv[0]);

        $lock_file = LOCK_DIR . $path_parts['basename'] . LOCK_SUFFIX;

        if (file_exists($lock_file)) {
            //return FALSE;
            // Is running?
            self::$pid = file_get_contents($lock_file);
            if (self::isrunning()) {
                error_log("==" . self::$pid . "== Já está em progresso...");
                return FALSE;
            } else {
                error_log("==" . self::$pid . "== O job anterior foi interrompido abruptamente...");
            }
        }

        self::$pid = getmypid();
        file_put_contents($lock_file, self::$pid);
        error_log("==" . self::$pid . "== Trava adquirida, processando o job...");
        return self::$pid;
    }

    public static function unlock() {
        global $argv;

        $lock_file = LOCK_DIR . $argv[0] . LOCK_SUFFIX;

        if (file_exists($lock_file)) {
            unlink($lock_file);
        }

        error_log("==" . self::$pid . "== Soltando a trava...");
        return TRUE;
    }

}

Para utilizado coloque todo o código do cron dentro do if:

<?php
require 'CronHelper.php';

if(($pid = cronHelper::lock()) !== FALSE) {
    /*
     * O código do seu cron job vai aqui!
     */

    cronHelper::unlock();
}

?>
]]>
http://localhost:8080/impedir-que-um-script-php-seja-executado-ao-mesmo-tempo-no-cron/feed/ 0
Enviando via GMail com PHPMailer http://localhost:8080/enviando-via-gmail-com-phpmailer/ http://localhost:8080/enviando-via-gmail-com-phpmailer/#respond Mon, 29 Sep 2014 17:30:08 +0000 http://www.devhouse.com.br/?p=742 A biblioteca PHPMailer é bem completa e de uso muito comum entre programadores PHP. Então a dica é como configurá-la para enviar emails usando o SMTP do GMail.

require_once 'PHPMailer/PHPMailerAutoload.php';
    
$mail = new PHPMailer();
$mail->IsSMTP();
$mail->SMTPDebug = 0;
$mail->SMTPAuth = true;
$mail->SMTPSecure = 'tls';
$mail->Host = 'smtp.gmail.com';
$mail->Port = 587; 
$mail->Username = "envio@email.com.br";  
$mail->Password = "********";           
$mail->SetFrom("envio@email.com.br", "CronJob");
$mail->Subject = "Uma excecao ocorreu.";
$mail->Body = $text;
$mail->AddAddress($to);
if(!$mail->Send()) {
    echo 'Mail error: '.$mail->ErrorInfo; 
    return false;
} else {
    echo 'Message sent!';
    return true;
}
]]>
http://localhost:8080/enviando-via-gmail-com-phpmailer/feed/ 0
Concatenar várias linhas de um Select em uma única linha e gerar um JSON de uma Query [MySQL] http://localhost:8080/concatenar-varias-linhas-de-um-select-em-uma-unica-linha-e-gerar-um-json-de-uma-query-mysql/ http://localhost:8080/concatenar-varias-linhas-de-um-select-em-uma-unica-linha-e-gerar-um-json-de-uma-query-mysql/#respond Mon, 22 Sep 2014 20:13:18 +0000 http://www.devhouse.com.br/?p=732 Para concatenar várias linhas em uma:

SELECT GROUP_CONCAT(COLUNA1) FROM TABELA;

Sendo assim para gerar um JSON de uma query:

SELECT 
	CONCAT('[', 
		GROUP_CONCAT(
			CONCAT('{"coluna1":"', COLUNA1, '",'), 
			CONCAT('"coluna2":"', COLUNA2, '"}')
		)
	,']') AS JSON 
FROM TABELA;
]]>
http://localhost:8080/concatenar-varias-linhas-de-um-select-em-uma-unica-linha-e-gerar-um-json-de-uma-query-mysql/feed/ 0
Concatenar várias linhas de um Select em uma única linha e gerar um JSON de uma Query [SQL SERVER] http://localhost:8080/concatenar-varias-linhas-de-um-select-em-uma-unica-linha-e-gerar-um-json-de-uma-query-sql-server/ http://localhost:8080/concatenar-varias-linhas-de-um-select-em-uma-unica-linha-e-gerar-um-json-de-uma-query-sql-server/#respond Mon, 22 Sep 2014 20:12:12 +0000 http://www.devhouse.com.br/?p=731 Para concatenar várias linhas em uma:

SELECT CAST((
    SELECT COLUNA1 + ' - ' COLUNA2 FROM TABELA FOR XML PATH('')
) AS VARCHAR(MAX));

Sendo assim para gerar um JSON de uma query:

SELECT '[' + CAST((
    SELECT '{"coluna1":' + COLUNA1 + '","coluna2":"' + COLUNA2 + '"},' FROM TABELA FOR XML PATH('')
) AS VARCHAR(MAX)) + ']';
]]>
http://localhost:8080/concatenar-varias-linhas-de-um-select-em-uma-unica-linha-e-gerar-um-json-de-uma-query-sql-server/feed/ 0