01 – Aprendendo C no Linux : )

Olá pessoal!

Já faz um tempo que não posto aqui e por isso voltei. : )

Bem, hoje eu pretendo começar a colocar um passo a passo do que sei de C. Talvez não seja muita coisa, mas pretendo colocar aqui algumas coisas para eu lembrar sempre quando precisar. Ok, vamos lá então.

fonte: http://mastigado.wordpress.com

Abra o console do Linux(sim, do Linux mesmo, se quiser usar o Windows fique à vontade também) e comece a escrever:


#include <stdio.h>
#include <stdlib.h>

int main ()
{
   float fAltura, fPeso;
   char cSexo;

   printf ("Qual sua altura?\n");
   scanf ("%f",&fAltura);
   printf ("Qual o sexo da pessoa?\n");
   printf ("Digite 'm' para Masculino e 'f' para Feminino \n");
   scanf ("%c",&cSexo);

   if ( cSexo == 'm' )
   {
      fPeso = ( 72.7 * fAltura ) - 58;
      printf ("Seu peso ideal e %f\n",fPeso);
   }
   else
      if ( cSexo == 'f' )
      {
         fPeso = ( 62.1 * fAltura ) - 44.7;
         printf ("Seu peso ideal e %f\n",fPeso);
      }
      else
         {
            printf ("Sexo Invalido!\n");
         }

      system ("pause");
      return (0);
}

Ok, ok.

E o que este programa faz?

Ele pede para que você digite a altura e o sexo de uma determinada pessoa. Aff, mas que chato!

E para que serve aquele tal de #include<stdio.h> na primeira linha do código?

Para você poder utilizar funções como o scanf(já utilizado no código). Mas o que é uma função? Pois é, a grosso modo é procedimento que faz algo para você, bastando apenas depois de pronto, se quiser utilizá-lo, chamá-lo pelo seu nome. No caso acima chamamos as funções printf, scanf, system e return.

E na 2ª linha, o que é #include<stdlib.h>?

Bem, esta aí é outra biblioteca inserida no nosso código para utilizarmos outra função do C que também utilizamos acima e é chamada de system.

Mas, biblioteca não é aquela que tem na escola?

É, digamos que a nossa biblioteca contém uma série de instruções que às vezes precisamos acrescentar para nosso programa.

Tudo bem e este tal de int main()?

Olha, para executarmos um aplicativo em C, ele tem que ter uma função que chamamos de principal(main) e por algumas regras(para que ele retorne o número de argumentos(veremos mais pra frente)), ela retorna um inteiro. Inteiro? Mas o que é isso? Retorna um inteiro? Como assim? Seria como se eu jogasse um mamão pela metade para você e daí você me retorna um inteiro? É isso mesmo?

Senhores, não é isso.

Na linguagem C e nas outras que conheço, para referenciarmos as coisas, utilizamos os chamados “tipos primitivos”(sim, eu sei que existem outros tipos de tipos). Bom, eu vou deixar alguns dos que mais utilizamos descritos abaixo.

int – Só recebe números sem casas decimais definidas(este tal de int é um inteiro e sai algo do tipo: );

float – Recebe números com casas decimais(aqueles 3.5, 5,2 e por aí vai);

char – Recebe os que chamamos de caracteres do tipo string, ou seja, de todo o tipo.

Então, vamos lá.

Se você observar, após o main, nós declaramos dois campos do tipo float(fAltura e fPeso) e eu ainda coloquei uma letra “f” antes para lembra para todos que se trata de um float mesmo.

Logo após a declaração das variáveis float, declarei uma variável do tipo char chamada cSexo e que servirá também para o nosso programa.

Bem e o que este programa faz?

Ele verifica se a pessoa é do sexo feminino ou masculino e com base na altura informada, ele calcula o peso ideal para aquela pessoa. Útil né?

Depois de declaradas as variáveis que iremos utilizar no nosso programa(lembre-se que é boa prática de programação a declaração de variáveis logo no começo de sua função(seja ele a principal(main) ou não), utilizamos o comando printf que é utilizado para exibir alguma coisa na tela. A primeira frase a ser exibida é “Qual é a sua altura?\n“. E é claro que você reparou este “\n” no final da frase e este “cara” quer dizer que na próxima vez em que for exibida alguma coisa na tela, este será feito na outra linha, porque “\n” significa que é um caractere de salto de linha.

Abaixo da linha onde está contido o primeiro comando printf, existe a linha que contém o comando scanf. Pois bem, este tal de scanf é responsável para ler uma entrada de dados vindo do seu teclado para dentro de uma variável. E olha que maravilhoso, você pode escolher em qual das variáveis que você declarou lá em cima que irá armazenar o que você deseja. Bem, então raciocinemos um pouco e pensemos que se eu faço uma pergunta para alguém sobre qual seria a altura dela, provavelmente eu não gostaria que ela me respondesse algo do tipo um metro e setenta, mas sim 1,7 correto? Então meus amigos, podemos supor que declaramos a nossa variável chamada fAltura para receber este tipo de argumento que esperamos(1,7 ou 1,56 ou 1,90 e por aí vai). Ok, então fica algo deste tipo:

scanf(“%f”,”&fAltura”);

Onde “%f” nos informa que queremos ler a informação para uma variável do tipo float. Sim, você pode até pensar que se já declaramos uma variável do tipo float, não deveríamos ter de colocar novamente esta informação aí, mas temos sim, pois ali estamos dizendo que tipo de valores serão lidos do teclado. Já onde está escrito “&fAltura” quer dizer em qual variável iremos guardar esta informação. Mas peraê, e este “&” aí? Pois é pessoal, quando colocamos o símbolo & antecedendo uma variável quer dizer que queremos gravar a informação no endereço de memória dela. Wooowww! O que que é isso? No endereço de memória? Por que isso não é automático sem termos de precisar ficar colocando este “&” antes? Simples, você está estudando C, uma linguagem de médio nível e daí, temos que detalhar as coisas um pouquinho mais. Mas peraê novamente e se não colocarmos esta informação antes? Simples, não irá gravar nada dentro da variável, pois quando gravamos no endereço de memória de uma variável, estamos gravando o dado no lugar onde ela realmente está. Em outras palavras, quando gravamos o dado sem o &  é como se um desconhecido passasse num carro fazendo bundalêlê para você, mas provavelmente isso não faria diferença para você, mas se todos os seus amigos te desprezassem de uma só vez, você sentiria isso porque todos eles te desprezaram colocando um “&” na frente do desprezo. Ênfú, que explicação sem noção!

Olha, mais abaixo tem outros printf e um outro scanf, mas o raciocínio é mesmo, só que invés de float é char e char meus amigos, aceita letras e números. Entendido? Espero que sim. Ah, você pode ter pensado “se char também aceita números, por que eu não declarei fAltura como char“? Simples, não dá para fazer contas de subtração, divisão, multiplicação e adição com char e sim somente com float e int(inteiro). Agora sim, entendido? Ah muleque!

Bom, agora tem uma tal de if descrito desta forma:

if( cSexo ==  ‘m’ ){

Ok, ok. Este if é o que chamamos de condição ou condicional ou como você preferir. A função dele é colocar uma condição no meio do caminho do programa para você prosseguir. Mas como assim? Imagine a seguinte situação, alguém quer entrar na sua casa e você diz que só pode entrar se a pessoa disser “por favor”, e se não disser, você não deixa ela entrar. Pronto, este é nosso if! Vamos traduzir para o nosso programa acima. Se dentro da variável cSexo estiver contida a letra m, duas coisas acontecerão:

fPeso = ( 72.7 * fAltura ) – 58;
printf (“Seu peso ideal e %f\n”,fPeso);

Primeiro, a variável fPeso receberá o resultado da conta que está à direita do sinal “=”. Mas e aí, o que significa este sinal “=”, não quer dizer “igual”? Não meus amigos, o sinal de igualdade na linguagem C é representado por “==” e o sinal “=” quer dizer que o que está à esquerda está recebendo o valor do que está à sua direita. Ai ,ai, como assim? No caso acima, a variável fPeso está recebendo o valor de 72,7 vezes o valor contido na variável fAltura, menos 58, ok? Agora, logo abaixo há outra instrução printf, só que desta vez não há somente texto a ser exibido na tela, mas também um valor de variável. Onde está escrito %f quer dizer que após a letra “e”, será exibido um valor do tipo float(número decimal) e após o fechamento das aspas e da vírgula é onde é identificado de qual variável sairá este valor. Espero que tenham entendido isso.

Mais abaixo deste primeiro if, há uma instrução chamada else, que quer dizer senão. Bem, se no if você pode dizer que se(if) uma variável conter a letra “m” você faz determinada coisa, no else significa que se esta variável NÃO conter a letra “m”, você faz outra coisa. O else sempre é o contrário do if. Veja outros exemplos magníficos: Se(if) você é bonito demais, você vai ganhar o beijo de uma princesa, senão(else), você deverá ganhar muito dinheiro para ter várias mulheres. Daí, você pode ter vários ifs dentro de elses e isto é chamado de ifs aninhados.

E para finalizar, aquela instrução system(“pause”) é utilizada noWindows para que o terminal não feche automaticamente(só no Windows) e a função return passando o parâmetro 0, quer dizer que o programa principal está retornando o número inteiro zero.

fonte: http://mastigado.wordpress.com

Bem gente, é isso aí, tá muito mastigado.

Failed to load libGL.so no Linux

Olá para todos. Esta pequena solução é para quem está começando a programar para Android.

fonte: http://mastigado.wordpress.com

Ocorre geralmente quando estou tentando iniciar um emulador do Android. Pois bem, sem muita firula, você pode fazer o seguinte:

Primeiro, você deve procurar pela biblioteca libGL.so no seu Linux.

  1. Dê um updatedb para atualizar seu arquivo database;
  2. Depois dê um locate libGL.so;
  3. Algo parecido com isso pode aparecer:

/usr/lib/i386-linux-gnu/libGL.so.1

/usr/lib/i386-linux-gnu/libGL.so.1.2

Segundo, você deverá criar um link simbólico desta biblioteca para dentro da pasta lib do seu SDK Android. Você pode fazer algo como isto:

ln -s /usr/lib/i386-linux-gnu/libGL.so.1 /opt/android-sdk-linux/tools/lib/libGL.so

Pronto! Resolvido.

fonte: http://stackoverflow.com/questions/11332817/failed-to-load-libgl-so-in-android

Instalar plugin Java no Firefox para acessar sites de banco no Linux

fonte: http://mastigado.wordpress.com

Esta é uma dica muito simples, mas para quem sempre tem de sempre instalar e reinstalar o Java(o bendito Java) no Linux, sabe que é um saco acessar sites de banco(Banco do Brasil, Caixa, Santander, Bradesco, etc) neste SO. Bem, a dica é bem simples.

  1. Você deverá ir no site http://www.java.com e baixar a versão para o seu Linux(pode ser 32 ou 64 bit). Não precisa baixar o pacote rpm, baixe o tar.gz mesmo.
  2. Depois descompacte(tar -zxvf o_seu_jre.tar.gz) o seu conteúdo dentro da pasta /usr/local. Bem, eu descompactei lá e funcionou! Então, ficará algo como isto: /usr/local/o_pacote_jre_sei_la_de_que_versao.
  3. Bem, vou supor que você tenha o Firefox instalado, tanto por ter descompactado a pasta em tar.gz ou tenha-o instalado de alguma outra forma. Pois bem, basta você ir até o diretório /usr/lib/mozilla/plugins(se não existir, crie) e criar um link simbólico lá dentro para determinada biblioteca do Java conforme orientação de instalação no site do Java. Pronto! Você provavelmente irá conseguir acessar o seu site de banco agora.
  4. E para finalizar(isso é muito importante para usuários do Linux), se você quiser que o seu Firefox tenha a opção de atualizar automaticamente habilitada, torne o seu usuário dono de seu diretório, da maneira abaixo:

chown seuusuario:seuusuario -R /nome_da_sua_pasta_do_firefox

Sim! É mole fazer isso, mas é chato ter de lembrar disso toda a vez que você tem que reinstalar um Linux em algum lugar do mundo. Tanto que estou usando o Debian Wheezy e esta dica funciona pra Slackware, Fedora ou qualquer outra distro Linux.

fonte: http://mastigado.wordpress.com

fonte: http://davelargo.blogspot.com.br/2013/05/firefox-21-changed-plugins-folder.html

Liberando seu MySQL para acesso externo

Olá para todos.

Hoje, vou deixar uma dica básica, mas que serve para galera que precisa o banco de dados MySQL externamente(noLinux de preferência).

Sabe aquela hora em que você já preparou seu banco de dados perfeitamente e precisar conectar seu sistema que não está na mesma máquina  em que se encontra o banco de dados? Pois bem, você vai precisar fazer uma pequena alteração em um arquivo do MySQL(aliás, praticamente finado MySQL, pois a Oracle não curte este negócio de free ou open source).

fonte: http://mastigado.wordpress.com

– Você deve ir até o arquivo my.cnf que pode estar em /etc/mysql/my.cnf e editar este arquivo, mas, você pode dar um updatedb e em seguida um locate my.cnf, pois pode ser que esteja em outro lugar.

– Dentro deste arquivo, existe um parâmetro chamado bind-address que deverá ser alterado para como está abaixo.

bind-address = 0.0.0.0

– Lembre-se que você deverá reiniciar o serviço do MySql logo em seguida para confirmar se surtiu efeito. Para executar este comando você pode digitar no console(mas pode ser que o comando mude):

/etc/init.d/mysql restart

– Se ainda assim não rolar, libere a porta 3306(padrão do MySql) no seu firewall(se ele estiver ativo, claro). Primeiro execute uma linha e depois a outra.

iptables -t filter -A INPUT -p tcp –dport 3306 -j ACCEPT

iptables -t filter -A INPUT -p udp –dport 3306 -j ACCEPT

– E por último, para se conectar no MySql, digite:

mysql -U root -p

E execute:

grant all privileges on *.* to ‘[usuario]‘@’%’ identified by ‘[senha]‘;

Olha, esta informação eu peguei no blog abaixo e dei uma incrementada, que por sinal estava muito bem explicada.

fonte: http://www.cjdinfo.com.br/solucao-my-sql-liberar-acesso-remoto-ao-mysql

fonte: http://mastigado.wordpress.com

Alterar campos no banco de dados para ser replicado em seu edmx

Olá pessoal,

Enquanto programo em C# utilizando edmx(usando model-fist) e não code-first, às vezes ocorrem algumas inconveniências quando preciso alterar um atributo da classe no banco, ou simplesmente excluir um campo no banco de dados. Em vista disso, vou deixar aqui como costumo fazer estes procedimentos de uma forma que eles realmente funcionem como espero. Vamos lá então.

fonte: http://mastigado.wordpress.com

Para alterar o tamanho do campo

alter table teste alter column nome char(1) not null

Para inserir uma nova coluna no banco

alter table teste  add minhacoluna varchar(60) null

Para excluir uma coluna no banco

alter table teste drop column telefone varchar(15) null

Em seguida, abra o seu modelo edmx no Visual Studio e clique com o botão direito na área branca. No menu que irá surgir, clique em Update Model from Database.

Algumas considerações importantes sobre o mapeamento do edmx

  • Se você incluir uma nova coluna, basta executar o Update Model from Database que ele irá puxar os campos adicionados em seu banco e replicar no seu modelo.
  • Se você alterar um campo no seu banco e executar o Update Model from Database no seu edmx, ainda assim, será necessário alterá-lo manualmente no edmx.
  • Se você exclui uma coluna do banco e em seguida, executar Update Model from Database, receberá um erro informando que a tabela não foi mapeada. No exemplo abaixo, excluí a coluna telefone do meu banco e mandei atualizar no edmx.

Error 11009: Property ‘telefone’ is not mapped.

O campo que existia no banco de dados e que estava mapeado no edmx, deverá agora ser excluído manualmente no seu mapeamento edmx, após a exclusão do campo no banco.

fonte: http://mastigado.wordpress.com

ASP.Net Erros indesejáveis

Olá pessoal.

Para quem está acostumado a programar em php, python e utilizar Apache ou Nginx sabe que quando o seu servidor(Linux) sofre um pique de energia ou um desligamento inesperado, basta ligá-lo novamente e deixar que o próprio sistema operacional faça sua checagem de sistema de arquivos na sua inicialização. Então, depois de iniciar novamente, você percebe que seu Apache, Cherokee, Gunicorn ou Nginx continuam funcionando normalmente. Até o mais cabuloso pau no sistema de arquivos, a ponto de você ter de restaurá-lo, não irá danificar seus programas e você que programa na plataforma LInux, sabe disso, a não ser, claro, que seu HD tenha ido para o saco. MAS, isto não acontece sempre com o nosso amiguinho (Ru)Windows. Com certeza. O que você ganha em produtividade utilizando o Visual Studio programando em C#, você perde ficando refém deste sistema operacional. Então, para tentar me lembrar do que tenho que fazer quando ocorre um probleminha deste tipo(alguém tropeçou no fio e meu pc desligou, e depois que liguei novamente, corrompeu tudo), vou tentar fazer um tópico permanente dos erros que eu for encontrando e vou colocando aqui, para eu poder me lembrar de como proceder e para ajudar outros desesperados.

Então, vamos lá.

fonte: http://mastigado.wordpress.com

Erro 1:

antlr3.runtime’ could not be loaded ou Rastreamento do Carregamento de Assembly: As informações a seguir podem ser úteis para determinar por que o assembly ‘Antlr3.Runtime’ não pôde ser carregado.

Quando e como ocorreu:

Estava programando no Visual Studio e meu estabilizador desligou, então liguei o pc novamente e continuei a programar. Em seguida, ele desligou novamente, daí quando religuei o pc e voltei a programar, quando fui testar meu programa em ASP.Net dentro do Visual Studio, ao abrir o browser dei de cara com a tela abaixo.

Erro antlr3

antlr3.runtime’ could not be loaded

Como foi resolvido:

Abri o console do Nuget(Package Manage Console) no Visual Studio e digitei install-package antlr. Pronto, resolveu.

Erro 2:

Tentei fazer login em um sistema que já estava hospedado, mas que eu tinha acabado de refazer o seu banco de produção.

Quando e como ocorreu:

Após ter refeito o banco de dados que o meu sistema hospedado tentou acessar.

nao_e_possivel_autenticar

Não é possível autenticar no sistema

Como foi resolvido:

Fui em tabela por tabela do banco e refiz as suas permissões originais.

fonte: http://mastigado.wordpress.com

Um objeto com a mesma chave já existe no ObjectStateManager

Sim pessoal, o título pode parecer meio estranho, mas isto pode um dia acontecer com você.

Você pode em algum momento estar programando em C# e de repente, quando tenta atualizar um objeto, um erro como este surge em seu Visual Studio

An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key

Pode até soar estranho, se como eu, você trabalha com níveis de permissões de usuário e precisa em algum momento, alterar a permissão de acesso de um deles, mas quando menos se espera, é surpreendido por uma mensagem dizendo que já existe um objeto com a mesma chave no ObjectStateManager.

fonte: http://mastigado.wordpress.com

Para quem não sabe, segundo definição da Microsoft, o ObjectStateManager, Obtém o Gerenciador de estado de objetos usado pelo contexto do objeto para controlar alterações do objeto.

Mas enfim, procurei várias alternativas para resolver este erro, porém, somente em um site encontrei uma resposta suficientemente simples para eu poder reproduzir abaixo seu post, muito bem mastigado.

O problema surge a partir do modo como o ObjectContext funciona. Em condições normais, a store do ObjectContext guarda em seu cache uma instância(e apenas uma) da classe ObjectStateEntry para cada entidade. Isso significa que não podemos ter mais de uma entidade(exemplo: registro) com a mesma chave no cache.

Mesmo que isto pareça ser óbvio, em algumas circunstâncias, este não é o comportamento que queremos. Contudo, podemos resolver o problema de diferentes maneiras. Aqui nós fornecemos um truque.

Vamos começar por reproduzir o problema(me desculpe se o exemplo a seguir é tão trivial, mas o único objetivo é reproduzir o erro):


TestMVCEntities db = new TestMVCEntities();

News testNews = new News();

testNews.NewsID = 1;

db.News.Attach(testNews);

News testNews2 = new News();

testNews2.NewsID = 1;

db.News.Attach(testNews2);

Quando executarmos esse código, teremos o erro An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key. Isso porque nós demos um Attach(anexamos) num contexto da mesma entidade(observe a chave(key)).

Uma maneira fácil de impedir este problema é utilizarmos dois diferentes contextos. Olhe para este código:


TestMVCEntities db = new TestMVCEntities();

TestMVCEntities db2 = new TestMVCEntities();

News testNews = new News();

testNews.NewsID = 1;

db.News.Attach(testNews);

News testNews2 = new News();

testNews2.NewsID = 1;

db2.News.Attach(testNews2);

Neste último trecho de código, nós usamos dois contextos diferentes que têm dois caches diferentes. É por isso que não temos qualquer erro.

fonte: http://library.logicsistemi.it/en/net/general-topics/81-an-object-with-the-same-key-already-exists-in-the-objectstatemanager

fonte: http://mastigado.wordpress.com

Seguir

Obtenha todo post novo entregue na sua caixa de entrada.

%d blogueiros gostam disto: