sexta-feira, 21 de fevereiro de 2014

Bounds Index checking ( Checando índice limite do vetor )


Um método utilizado em programação para evitar referenciar itens que ultrapassem os limites de um vetor afim de controlar o problema de maneira segura. Em linguagens de mais alto nível como Java e C# este artificio já é implementado automaticamente gerando uma exceção que pode ser controlada pelo programa, porém existe o custo em tempo de execução desta verificação, afinal toda vez que é necessário referenciar um item do vetor esta verificação será feita. Linguagens como C e C++ não implementam automaticamente esta verificação e deixam a responsabilidade para o programador que pode optar por mais segurança ou evitar a verificação e tornar a execução mais rápida. Apesar de haver uma grande discussão sobre este assunto onde uns acham que o ganho de performance não vale o risco o fato é que a alternativa existe para cada programador escolher em seu caso qual a alternativa melhor para seu contexto.

Ex.:

#include

#define SIZE_VETOR 7
char vetor[SIZE_VETOR] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; //Escopo Global

void getItem( int indice, char * out ){
       *out = vetor[indice];
};


int main( int argc, char ** argv, char ** argenv ){

   char c = 0;

   getItem(0, &c); //neste momento foi referenciado o item 0 do vetor sendo o valor 'a' OK

   printf( "%c", c );

   getItem(6, &c); //neste momento foi referenciado o item 6 do vetor sendo o valor 'g' OK

   printf( "%c", c );

   getItem(10, &c); //neste momento foi referenciado o item 10 do vetor FALHA

   printf( "%c", c );

   return 1;

};

Uma maneira de evitar o crash de seu sistema  e o mesmo ser finalizado abruptamente na linha onde sinalizei a falha seria efetuar uma checagem antes de referenciar afim de identificar o problema e tratá-lo da melhor forma possível, uma forma bem didática seria efetuar um if antes de cada referencia e tratar o erro para isso seria necessário modificar a função getItem:

#include

#define SIZE_VETOR 7
char vetor[SIZE_VETOR] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g' }; //Escopo Global

int getItem( int indice, char * out ){

    if(  indice < SIZE_VETOR && indice > SIZE_VETOR )
       *out = vetor[indice];
       return 1; //SUCESSO
  else
      *out = -1; //FALHA
      return 0;
};

int main( int argc, char ** argv, char ** argenv ){

   char c = 0;
 
   if( getItem(0, &c) //neste momento foi referenciado o item 0 do vetor sendo o valor 'a' OK
      printf( "%c", c );
   else
      printf( "ERRO: índice incorreto" );

   if( getItem(6, &c) //neste momento foi referenciado o item 6 do vetor sendo o valor 'g' OK
      printf( "%c", c );
   else
      printf( "ERRO: índice incorreto" );

   if( getItem(10, &c) //neste momento foi referenciado o item 10 do vetor FALHA
      printf( "%c", c );
   else
      printf( "ERRO: índice incorreto" );


   return 1;

};

Ressalto que o exemplo acima é somente montado para fins didáticos sendo possível efetuar a checagem de maneira mais eficiente.







quarta-feira, 12 de fevereiro de 2014

MYSQL backup e restore

Para esta tarefa utilizaremos a ferramenta mysql e mysqldump. 

Backup


# mysqldump -u root -p my_schema > my_file_bkp.dmp

# mysqldump -u root -p[solicita senha*] [schema_name] > dumpfilename.sql


Outra maneira de efetuar o bkp é utilizando o parâmetro -A o qual vc não precisa selecionar o schema que deseja efetuar o bkp ele efetuará o dump de todos o bancos.

# mysqldump -u root -p -A > my_file_bkp.dmp

# mysqldump -u root -p[solicita senha*]  -A > dumpfilename.sql


Caso vc queira selecionar alguns schemas em específico o qual deseja efetuar o bkp vc poderá utilizar o parâmetro --databases e logo em seguida colocar os nomes dos schemas separados por espaço.

# mysqldump -u root -p  --databases my_schema1  my_schema2  my_schema3 > my_file_bkp.dmp

# mysqldump -u root -p[solicita senha*] [schema_name ...] > dumpfilename.sql


Para outros parâmetros vc pode consultar o manual com o seguintes comando:

#man mysqldump


Restore


Neste caso ele poderá ser de duas maneiras uma quando vc NÃO utiliza nem o parâmetro -A nem o --databases, neste caso vc poderá efetuar o restore em qualquer schema pré existente que esteja vazio. Para ilustrar o exemplo vou criar um banco antes de efetuar efetivamente o restore.

# mysql -u root -p

Quando executo este comando é aberto para mim um shell específico para o mysql onde vc poderá executar comando para o banco de dados.

> create database my_schema;
> quit

Agora vc deve executar o comando:

# mysql -u root -p my_schema < my_file_bkp.dmp

# mysql -u root -p[solicita senha*] [schema_name] < dumpfilename.sql


Agora, caso vc tivesse usado os parâmetros -A, --databases vc não seria necessário informar o schema e nem criar o schema pois ele tentará restaurar no mesmo de origem:

# mysql -u root -p  < my_file_bkp.dmp

# mysql -u root -p[solicita senha*]  < dumpfilename.sql


Para outros parâmetros vc pode consultar o manual com o seguintes comando:

#man mysql



* Se vc não passar este parâmetro o sistema tentara utilizar a senha do usuário logado no shell, vc poderia passar também a senha na própria linha de comando porém eu não recomento, visto que a mesma deverá ser salva no histórico do shell permitindo que outro usuário com um pouco de artimanha e mal intencionado furte sua senha.




quarta-feira, 24 de novembro de 2010

Descobrindo as bibliotecas linkadas em seu arquivo executavel

Facilmente podemos identificar as dependencias de um executável que são conhecidas no mundo unix/unix-like como objetos compartilhados (Shared Objects) e no windows como bibliotecas de linkagem dinamicas (Dynamic Link Libraries), para isso iremos usar alguns comandos conforme a plataforma:

- Mac
  $otool -L "nome do executável"
- Linux
  $ldd "nome do executável"
- Windows
  >dumpbin /dependents "nome do executável

segunda-feira, 11 de outubro de 2010

Code Project - A set of ADO classes - version 2.20

Estou colocando aqui no meu blog para download o código fonte do componente de Classes ADO 2.20 construída pelo Carlos Antollini que peguei no site do Code Project www.codeproject.com. Efetuei algumas correções para o funcionamento com o padrão de código de caracteres UNICODE e modifiquei algumas funções que foram descontinuadas pelo VS2010. O artigo original se encontra AQUI

Para baixar a minha versão com as correções clique AQUI

Abraços

sábado, 30 de janeiro de 2010

Parallels Desktop 5.0 para Mac com Slackware

Tive dificuldade em instalar as ferramentas adicionais do Parallels no sistema virtualizado Slackware 12.2 (Kernel 2.6.27), lembrando que foi instalado todos os pacotes desta versão.
Na ajuda do Parallels é orientado a montar o cd com a imagem de cd das ferramentas do Parallels no ambiente linux (hd/Biblioteca/Parallels/Tools/prl-tools-lin.iso):
Ex.:
mount -o exec /dev/cdrom /mnt/cdrom
(Lembre-se que vc deve associar a imagem ao dispositivo de cd do Parallels)

Após isso deve-se executar o script install:
Ex.:
/mnt/cdrom/install

Porém ao executar este procedimento me é reportado um erro:

Error: there is no option to install prltoolsd service
Error: failed to install prltoolsd service
Error: failed to install user space applications and drivers
2009-10-07T23:59:47+0200: execCmd: ./install --install [123]
2009-10-07T23:59:47+0200: Error: An error occurred when installing Parallels Tools. Please go to /var/log/parallels-tools-install.log for more information.
2009-10-08T00:01:04+0200:

Este problema ocorre com a distribuição slackware e muito provavelmente com as distribuições derivadas dela. O problema se deve ao fato do modelo de inicialização dos scripts do slackware não ser suportado pelo Parallels. Para resolver esta situação deve-se efetuar os seguintes procedimentos:

Para instalação:
export def_sysconfdir=/etc/rc.d
cd /etc/rc.d
echo "/etc/init.d/prltoolsd stop" >> rc.local_shutdown
chmod a+x rc.local_shutdown
(Edite /etc/rc.d/rc.local e comente a linha "Run Parallels" colocando o "#" na frente da frase)

Para remoção:
export def_sysconfdir=/etc/rc.d
(Remova a linha "/etc/rc.d/prltoolsd stop" do arquivo rc.local_shutdown )
(Remova a linha "/etc/rc.d/prltoolsd start" do arquivo rc.local )

Referências:
Help Parallels ( file:///Users/(seu login)/.parallels/pd_help.htm )




segunda-feira, 28 de dezembro de 2009

Comando Cut

Este comando tem como objetivo tratar um string e retornar partes dele, exemplo:

Executo o comando uname -r e ele me retorna 2.6.27.7-smp, vamos supor que eu quera dividir esta string em campos tendo como delimitador o ."ponto". Neste caso seria como tivesse uma lista com o seguintes valores:
2
6
27
7-smp;

Vou retornar o item 2 da lista "6", veja o comando:

uname -r | cut -d "." -f2

O retorno deste comando seria "6".

Explicando:

Quando coloquei o pipe "|" ele passou o retorno do comando uname -r para
entrada do comando cut.

O parametros:
-d -> indica qual será o delimitador que será detectado para gerar a lista, em nosso caso informamos o ".";

-f -> indica qual dos itens da lista será retornado, em nosso caso o item 2.

Referências:
man cut (Manual do Cut)
http://www.experts-exchange.com/Programming/Languages/Scripting/Shell/Q_23092995.html

Versionamento do Kernel do Linux

Os números que vemos na versão do kernel tem significados especiais, vamos exemplificar:

Quando rodo o comando uname -r em meu console no slackware tenho como retorno o seguinte:
- 2.6.27.7-smp

* O primeiro número "2" identifica a qual série o kernel pertence, este número somente é modificado quando novas implementações se tornam incompatíveis com as versões anteriores, ou seja, softwares escritos para uma seŕie não funcionarão em outra série;

* O segundo número "6" sinaliza em que estágio está, caso esteja em desenvolvimento este número vai ser ímpar, caso seja uma versão estável, este valor será um número par;

* O terceiro número "27" identifica o release do kernel, ou seja, as correções que
vão acontecendo na série e estágio corrente, ou mesmo pequenas melhorias em implementações correntes, informando que houve modificações;

* O quarto número "7" identifica que houve novas correções (bugs) críticas urgentes que não podem esperar o próximo release;

* O texto que segue logo após o hifen "smp" identifica particularidades na configuração do release do kernel, neste caso, identifica que foi configurado no kernel características para processamento simétrico pararelo;


Referências :
http://tldp.org
http://en.wikipedia.org/wiki/Linux_kernel#Version_numbering
Livro Construíndo sistema linux embarcado "O REILLY"