sábado, 21 de novembro de 2015

Problema de compilação do Qt Creator no Mac OS.

Olá



Para aquelas pessoas que trabalham com máquinas Mac (Apple) e o Qt Creator, vai aqui uma dica.

Recentemente eu tive um problema ao atualizar meu Mac OS para a versão 10.11. Ao tentar compilar meu projetos antigos, tive o seguinte problema: error: Could not resolve SDK path for 'macosx10.9'

Ei aqui a solucão para vocês ;-)


1) Vá até o diretório ~/Qt/5.3/clang_64/mkspecs
2) Edite o arquivo qdevide.pri
3) Modifique a definicão antiga QMAKE_MAC_SDK = macosx10.9 para QMAKE_MAC_SDK = macosx10.11



Espero ter ajudado.


Abraços

segunda-feira, 23 de março de 2015

TCL/TK - Trabalhando com data.

Bom dia Galera!!



Segunda feira chegou e começa a semana. Semana passada foi uma correria danada e sofri pra trabalhar com data no TCL. Então vou postar aqui meu código para que vocês não precisem sofrer como eu.

Fui incumbido de gerar alguns relatórios na empresa, por período. Ai vocês já podem imaginar, trabalhar com data de inicio e fim.

Procurei vários sites que me dessem uma luz, que por uma sorte me fornecesse um código pronto pra minha necessidade ;-)  Quebrei a cara kkkk

Então segue algumas dicas sobre o que aprendi lendo materais:

- Pegando a data atual da máquina


[clock scan [clock format [clock seconds] -format %Y-%m-%d]]


Dica: o TCL trabalha com um número inteiro que representa a data, então a partir do comando acima, você pode fazer uma comparação de datas, exemplo:


set data_inicio [clock scan [clock format [clock seconds] -format %Y-%m-%d]]

if { [expr $data_inicio < [clock scan 20150303]] } {

    # faça algo se for verdadeiro

}




- Transformando o tipo de dados data do TCL para string


set a [clock scan [clock format [clock seconds] -format %Y-%m-%d]]

set data_formatada [clock format $a {%d/%m/%Y}]



- Incrementando a data


set a [clock scan [clock format [clock seconds] -format %Y-%m-%d]]

for {set i 0} {$i < 10} {incr i} {

     set a [clock scan {+1 days} -base $a]

}




Essas foram algumas dicas que descobri, assim que tiver mais dicas eu postarei aqui.



Grande abraço, Emanuel

quarta-feira, 10 de dezembro de 2014

TCL - Multiplas condições em um IF

Olá galera,


Recentemente um estagiário meu estava sofrendo com o alinhamento de várias condições em um IF. Este caso me lembrou que eu já passei por isso e portanto decidi colocar aqui para vocês para que não "sofram" como nós.


O seguinte bloco de código não funciona:

if {{$number == 1 && $name == "hello"} || {$number == 0&&$name == "yes"}} {
    #faça algo
}

O interpretador envia mensagem de erro: IS EXPECTED TO BE A BOOLEAN.

O motivo é que os { } e os ( ) não podem ser colocados em paralelo. Mas no caso dos ( ) eles são reconhecidos como array (ex. $ar(2) ), por tanto, interpretado como array de booleanos.

Utilizem o seguinte bloco de código:

if {(($number == 1)&&($name == "hello")) || (($number == 0)&&($name == "yes"))} {
    #faça algo
}


Até a próxima, Emanuel

sexta-feira, 28 de novembro de 2014

TCL/TK - Acesso ao sistema de arquivos

Tcl possui diversos comandos que permitem acessar o sistema de arquivos de um computador. Muitos desses comandos, possuem opções que só estam disponíveis em um determinado sistema operacional.
Para uma maior portabilidade de seu programa, é recomendável utilizar apenas as opções indepentes de sistema operacional.

ComandoDescrição
fila atimeRetorna o tempo em segundos, a partir 01/01/1970, desde o último acesso ao arquivo. 
file attributesRetorna ao define os atributos de um arquivo. As opções são diferentes para o UNIX, o Windows e o MacOS. 
file copyCopia um ou mais arquivos para outro. 
file deleteRemove um arquivo. 
file dirnameRetorna o caminho completo de um arquivo. 
file executableRetorna 1 se o arquivo for um programa executável pelo usuário, 0 caso contrário.
file existsRetorna 1 se o arquivo existir( e se o usuário puder ler o seu diretório ), 0 caso contrário. 
file extensionRetorna a extensão de um arquivo. 
file isdirectoryRetorna 1 se o arquivo for um diretório, 0 caso contrário. 
file isfileRetorna 1 se o arquivo for um arquivo regular, 0 caso contrário. 
file joinUne nome de arquivo e diretórios, usando o separador correto para o sistema operacional. 
file lstatO mesmo que file stat, mas usando a chamada lstat do kernel. 
file mkdirCria um ou mais diretórios. Pode criar uma árvore inteira. 
file mtimeRetorna o tempo em segundos, a partir 01/01/1970, desde a última modificação no arquivo. 
file nativenameRetorna o nome específico do arquivo para o sistema operacional corrente.
file ownedRetorna 1 se o arquivo pertencer ao usuário, 0 caso contrário. 
file pathtypeRetorna o tipo do caminho: absolute, relative ou volumerelative. 
file readableRetorna 1 se o arquivo puder ser lido pelo usuário, 0 caso contrário. 
file readlinkRetorna o valor do link sinbólico. 
file renameRenomeia um arquivo. 
file rootnameRetorna o nome do arquivo sem a extensão. 
file sizeRetorna o tamanho do arquivo. 
file splitRetorna o caminho de um arquivo em uma lista. Cada subdiretório como um elemento da lista. 
file statRetorna os resultados da chamada à função stat do kernel em uma lista, cujos elementos são: atime, ctime, dev, gid, ino, mode, mtime, nlink, size, type e uid. 
file tailRetorna o nome do arquivo, sem o caminho. 
file typeRetorna o tipo do arquivo: file, directory, characterSpecial, blockSpecial, fifo, link ou socket. 
file volumeRetorna a lista dos drivers locais no Windows, dos drivers locais e de rede no MacOS e apenas "/" no UNIX. 
file writableRetorna 1 se o usuário puder escrever no arquivo, 0 caso contrário. 


Exemplo 


No Windows, não utilize "\" para separar diretórios e nomes de arquivos, use "/", pois Tcl interpreta o caractere "\" como um caractere especial. Se desejar poderá usar "\\".

TCL/TK - Funções e procedimentos

Procedimento é uma subrotina ou porção de código, que é executado a partir de um nome que o referencia. Uma função é um procedimento que retorna um valor.
Para entender melhor o que é uma função, vejamos o seguinte exemplo: 
Desejamos calcular o quadrado de um número dado e imprimi-lo na tela: 
proc quadrado {numero} {
      return [expr $numero * $numero]
}
puts [quadrado 2]
Retornará 4 pois 2 vezes 2 é igual a 4.  

Criando procedimentos e funções

Criamos procedimentos e funções através do comando proc. A sintaxe de proc e a seguinte:
proc nome {[argumento1] [argumento2]... [argumentoN]} {
     [upvar nível variável_acima variável_local]
     [global [variavel1] [variavel2]... [variavelN]
     instruções... 
     [return [valor]]
}

Onde nome é o nome do procedimento ou função, argumento1, argumento2, argumentoN são argumentos ou valores opcionais passados ao procedimento ou função, variavel1, variavel2, variavelN são variaveis globais( ou seja variáveis vistas em todo o programa ), instruções são as instruções que serão executadas no procedimento ou função e valor é um valor que opcionalmente será retornado ao procedimento que chamou a função. O comando upvar será estudado mais adiante.

Argumentos

Argumentos são valores passados para a função ou procedimento. No caso do exemplo visto acima, do cálculo do quadrado de um número, número é o argumento passado à função quadrado. Argumentos podem ter valores default, ou padrão. Assim, caso nenhum valor seja passado para a função, um valor padrao será usado como argumento. Para definir um valor padrão para um argumento devemos colocar o nome do argumento e o valor padrão entre chaves {}, assim:
proc quadrado {{numero 0}} {
     return [expr $numero * $numero]
}

Caso existam vários argumentos, cada argumento que possuir um valor padrão deverá vir entre chaves, assim:
proc nome {{argumento1 valor1} {argumento2 valor2}... {argumentoN valorN}} { ... }
Em muitos casos é importante fornecer valores padrões para os argumentos de uma função. Isso evitará erros de tempo de execução. Assim, estude bem suas funções e procedimentos. 

Escopo das variáveis

Variáveis podem ser visíveis em todo o programa, ou somente em partes dele. A isso se dá o nome de escopo. Quando uma variável não pode ser vista em determinada parte do programa, se diz que ela está fora do escopo da função ou procedimento.  
De um modo geral, variáveis criadas no interior de uma função ou procedimento, serão visíveis somente no interior da função ou procedimento onde foi criada. Para tornar uma variável visível em todo o programa, usa-se o comando global. Exemplo:
global código, nome, e-mail
Torna as variáveis código, nome e e-mail disponíveis para todo o programa. 
Entretanto, para utilizar as variáveis acima dentro de uma outra função, você terá que repetir o mesmo comando acima dentro da função onde deseja utilizar as variáveis. 
Muitas vezes entretanto, desejamos utilizar uma variável criada em um nível acima da nossa função, e não uma variável global. Nestes casos podemos utilizar o comando upvar, para criar um ponteiro para a nossa variável um ou mais níveis acima. Exemplo: 
upvar 1 registro reg
Faz com que a variável reg referencie a variável registro que está na função chamadora( um nível acima ). Caso nível seja precedido pelo sinal #, nível será tratado como um valor absoluto. Assim #0 estará se referindo ao nível mais alto no programa. 

Retornando valores

É possivel retornar valores de funções através do comando return, como visto no exemplo de introdução desta aula. Contudo, isso não é obrigatório. 

Criando biblioteca de funções

Bibliotecas de funções são arquivos contendo declarações de diversas funções que queremos reaproveitar em nossos programas. Não há nenhum formato especial para arquivos de bibliotecas.  
Para carregar uma biblioteca utilizamos o comando source. A sintaxe de source é:
source arquivo.tcl
Carregará a biblioteca
O comando source também pode ser usado para carregar programas inteiros em Tcl. Ao carregar um arquivo, source compilará e executará os comandos no arquivo.

Criando pacotes

Uma forma elegante de distribuir bibliotecas é colocando-as em pacotes. Um pacote é criado colocando um comando package provide no início do arquivo. A sintaxe de packageprovide é: 
package provide nome versão
Onde nome é o nome do pacote( biblioteca ) que se está provendo e versão é o número da versão do pacote. 
Para carregar um pacote coloque no ínicio de seu programa:
package require nome versão 
Onde nome é o nome do pacote( biblioteca ) que se está solicitando e versão é o número da versão do pacote. 
Para instalar um pacote em seu computador, crie um diretório, dentro do diretório das bibliotecas do Tcl, com o nome do pacote seguido da versão. Em seguida entre no diretório e execute o comando: 
pkg_mkindex .
Isso criará um índice que Tcl utilizará para encontrar o pacote. Examine o diretório do Tcl em seu computador para entender melhor os nomes dos diretórios de pacotes. 
O diretório das bibliotecas do Tcl no Windows é: 
C:\Arquivos de Programas\Tcl\lib\ 
E no Linux, normalmente é: 
/usr/lib/

Namespaces

Namespaces são a nova forma de encapsular variáveis e funções em bibliotecas e programas em Tcl. Trata-se de um tema avançado e difícil de entender para o iniciante.

quinta-feira, 27 de novembro de 2014

TCL/TK - Adicionando um simbolo N vezes no fim da string.

Boa tarde,



Estava com essa dúvida outro dia no trabalho, pesquisei no manual da linguagem e achei a seguinte solução.

Segue exemplos do código:

puts novastr [format "|%-25s|" hello]

Saída: |hello                        |



set novastr [format "|%-*s|" $qtd $str]



Outras opções que um amigo me enviou:

set novastr $str[string repeat " " [expr {25 - [string length $str]}]]
e
for {set novastr $str} {[string length $novastr] < 25} {} {
    append novastr " "
}


Att, Emanuel Moraes

quarta-feira, 19 de novembro de 2014

TCL/TK - Controle de fluxo

Com frequência, em programação, nossos programas precisam escolher entre certas direções determinadas, de acordo com certas condições pre-estabelecidas. A isso se chama controle de fluxo de execução do programa. Tcl oferece mecanismos avançados para que o programador possa controlar o fluxo de execução de seus programas. Mais adiante estudaremos cada um dos recursos que Tcl oferece para que controle de fluxo de execução de programas. Mas antes vamos entender um pouco mais o que é fluxo de execução.

Analisaremos a seguinte situação: Precisamos  imprimir todos os números ímpares de 0 a 100. O algorítimo do nosso programa ficaria assim:

N = 0
enquanto N < 100 faça {
     se resto(N, 2) <> 0 então {
          imprima N
     }
     incremente N
}

Na primeira linha do nosso programa, iniciamos a variável N como 0. Em seguida entramos em um laço de repetição( uma parte do programa que se repete enquanto uma condição dada permanecer verdadeira ) enquanto N for menor que 100.
No interior do laço de repetição, verificamos se o número N é ímpar( um número é impar se o resto da divisão do número por dois for diferente de zero ). Se for ímpar, imprimimos o número. Incrementamos( somamos mais um ) ao número e repetimos o laço. Cada repetição do laço se chama interação.
Vejamos agora como ficaria cada parte do programa em Tcl:
set N 0 
while {$N < 100} {
     if {[expr fmod($N,2)]} {
          puts $N
     }
     incr N
}

if... then...elseif...else... 

A expressão if...then...elseif...else... permite controlar o fluxo de execução do programa de acordo com diferentes condições dadas. A sintaxe é:
if expr1 corpo1 elseif expr2 corpo2... else corpoN 
Onde expr1, expr2, exprN são diferentes condições a serem testadas e corpo1, corpo2, corpoN são porções de código que devem ser executadas caso a condição correspondente seja verdadeira. A expressão else somente é executada caso todas as outras expressões sejam avaliadas como falsas. 
Exemplo:
if {$x == 0} {
     puts "X é igual a 0"
} elseif {$x < 0} {
     puts "X é menor que 0"
} else {
     puts "X é maior que 0"
} 

while...

A expressão while... permite executar um laço de repetição enquanto uma expressão for avaliada como verdadeira. A sintaxe de while é:
while expr1 corpo
Onde expr1 é a expressão que deve ser avaliada como verdadeira( 1, true ou yes ) para que o laço seja repetido. E corpo é o fragmento de código que será executado a cada repetição do laço.
Pode-se interromper a execução de um laço a qualquer momento através do comando break.
Para pular para a próxima interação de um laço, saltando todas as instruções restantes, podemos utilizar o comando continue.
Exemplo:
set x 0
while {$x < 10} {
     puts $x;
}

for...

A expressão for... permite executar um laço de repetição enquanto uma expressão for avaliada como verdadeira. A sintaxe de for é: 
for início teste próximo corpo 
O onde início contém o código de inicialização da variável usada no teste, teste contém uma expressão que deve ser avaliada como verdadeira para que o laço se repita, próximo contém um fragmento de código que é avaliado a cada repetição, e que normalmente é utilizado para incrementar a variável e corpo contém o fragmento de código que se deseja executar a cada interação do laço.  
Pode-se interromper a execução de um laço a qualquer momento através do comando break.
Para pular para a próxima interação de um laço, saltando todas as instruções restantes, podemos utilizar o comando continue. 
Exemplo:
for {set x 1} {$x < 10} {incr x} {
     puts $s
}

foreach...

A expressão foreach... oferece um meio de interagir por todos os elementos de uma lista, de forma simplificada. foreach é muito usada no processamento de informações retornadas por consultas SQL. 
A sintaxe de foreach é: 
foreach variável lista corpo 
Onde variável é o nome de uma variável que irá conter, a cada interação, o valor de um elemento da lista. lista é a lista que será percorrida e corpo é o fragmento de código que será executado a cada interação. 
Pode-se interromper a execução de um laço a qualquer momento através do comando break. 
Para pular para a próxima interação de um laço, saltando todas as instruções restantes, podemos utilizar o comando continue.
Exemplo:
set lista {vermelho alaranjado amarelo verde azul anil violeta}
foreach cor $lista {
     puts $cor
}

switch... 

O comando switch é provavelmente o meio mais poderoso para se controlar o fluxo de execução de um programa em Tcl. switch permite que se compare o valor de uma string com diversos valores dados e se execute a porção de código correspondente. switch suporta expressões regulares e é muito usado em comandos definidos pelo usuário para avaliar as opções passadas para o comando.
A sintaxe de switch é: 
 
switch [-exact] [-regexp] [-glob] string {
     valor1 corpo1
     valor2 corpo2
     valorN corpoN
}

Onde as opções entre cochetes [] são opcionais, string é a string que será comparada com os valores definidos, valor1, valor2, valorN são os valores que serão comparados com a string e corpo1, corpo2, corpoN são os fragmentos de código que serão executados caso o valor correspondente coincida com a string passada para o comando.
Exemplo:
set x "arquivo"
switch x {
     arquivo {puts "Você selecionou a opção arquivo"}
     editar {puts "Você selecionou a opção editar"}
     ajuda {puts "Você selecionou a opção ajuda"}
}

exit...

O comando exit encerra a execução do programa e retorna um valor para o shell.
A sintaxe de exit é: 
exit valor
Onde valor é o valor que será retornado ao shell. 
Exemplo:
set lista {vermelho alaranjado amarelo verde azul anil violeta}
foreach cor $list {
     puts $cor
}
exit 0