Criando instância de classe, método e variável a partir de uma string em PHP

Olá pessoal!

1:00h da manhã! Que delícia lutar contra o sono numa sexta a noite só para programar! Ah! Nossa, delicious : (

fonte: https://mastigado.wordpress.com

Pois bem, vou deixar uma dica aqui de como instanciar métodos, classes ou variáveis a partir de uma string em PHP. Sim, eu acredito que isso vá no mesmo conceito de Reflection, mas não será isso que irei abordar hoje.

Por hora vamos lá!

“Tempo de conversa fiada acabou!”

Para instanciar uma classe a partir de uma string:


$class = "MinhaClasse";
$objeto = new $class();

Para capturar o conteúdo de uma variável a partir de uma string (isso está cheirando a ponteiro)


$valorPersonalizado = 123;
$nomevariavel = 'valorPersonalizado';
echo $$nomevariavel; // echo's 123

Para gerar e chamar uma função a partir de uma string


$funcao = 'minha_funcao';
$funcao('parametro1'); // chama minha_funcao('parametro1');

Para gerar e chamar um método a partir de uma string


$metodo = 'facaAlgumaCoisa';
$objeto = new MinhaClasse();
$objeto->$metodo(); // executa o método facaAlgumaCoisa de MinhaClasse->facaAlgumaCoisa()

fonte: http://stackoverflow.com/questions/4578335/creating-php-class-instance-with-a-string

fonte: https://mastigado.wordpress.com

fonte: http://php.net/manual/en/language.variables.variable.php

Instalando e configurando o Composer com a PSR-4

Olá pessoal!

Este post vai para quem tem dificuldade (assim como eu) em instalar e configurar o Composer com a PSR-4.

fonte: https://mastigado.wordpress.com

Para quem não sabe as “PSRs” do PHP são a grosso modo um conjunto de boas práticas para padronizar frameworks e acredito que também sirva para nossos próprios apps. Esse conjunto de PSRs foi criado por uma organização chamada PHP-FIG (http://www.php-fig.org/) e existem até hoje cerca de 18 delas.

Neste post trato especificamente de como configurar o Composer e a inserção da PSR-4 que é responsável pelo autoload dos arquivos do PHP. Este “autoload” é útil para que carreguemos nossos arquivos sem ter de ficar utilizando o método require_once ou require do PHP. E por que utilizar a PSR-4? Bem, a PSR-4 substituiu a PSR-0 que também é responsável pelo autoload dos arquivos, mas que entrou em estado deprecated.

Pois bem e o Composer? Bem, o Composer é um gerenciador de dependências do PHP que funciona como um gerenciador de pacotes, assim como o nuget do C#, o Apt do Debian, o Yum do Fedora/Cent-OS e por aí vai.

Download do Composer

Para baixarmos o Composer podemos seguir as orientações de seu próprio site no endereço https://getcomposer.org/download/ e seguir as instruções caso as que eu coloquei abaixo estejam desatualizadas, porém antes, execute as seguintes instruções enumeradas abaixo.

  1. Se estiver no Linux abra o terminal, entre na raiz de seu projeto (se for no Windows, tente usando o prompt);
  2. Crie um diretório com o nome public;
  3. Coloque seu arquivo index.php dentro deste diretório public;
  4. Ainda na raiz do projeto crie dois diretórios, um chamado de vendor e outro de app;
  5. Dentro do diretório vendor crie de preferência um diretório com o nome de sua instituição, pode ser minhaempresa (ou pense em outro nome que caracterize essa idéia);
  6. E dentro do diretório app crie uma classe chamada de Init.php com o conteúdo abaixo.
<?php

namespace app;
class Init {

    public function __construct() {
       echo "Ok. It works!";
    }
}

E agora execute as linhas abaixo no terminal (uma de cada vez).

   php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
   php composer-setup.php
   php -r "unlink('composer-setup.php');"

Arquivo composer.json

Vou deixar algumas observações sobre o conteúdo deste arquivo que servirá de base para a configuração do Composer.

Basicamente esta área abaixo está reservada para que você defina a partir de qual versão do PHP será instalada em sua máquina, quais serão os pacotes que são requeridos na instalação e o mínimo de tipo de versão aceitável do aplicativo.

    "name": "meuapp",
    "require": {
       "php": ">=7.0.5"
    },
    "require-dev": {
       "phpunit/phpunit": "5.7@stable",
       "squizlabs/php_codesniffer": "dev-master"
    },
    "minimum-stability": "alpha",

Já a área onde tratamos da PSR-4, responsável pelo carregamento da estrutura de arquivos de nossa aplicação terá este raciocínio:

A raiz do meu projeto PHP é composta por um diretório que se chama meuapp e lá dentro tenho as pastas app, public e vendor, sendo que  dentro de vendor tenho um diretório chamado de minhaempresa. Portanto quando defino o mapeamento das minhas classes na definição da PSR-4 sempre tenho que me referir ao que está dentro da raiz de meu projeto (no caso a pasta meuapp).  Na primeira linha de mapeamento (do script abaixo) deixei o código assim: “minhaempresa\” : “vendor/minhaempresa” porque estou dizendo que quero mapear a pasta minhaempresa que está no caminho vendor -> minhaempresa e que por consequência está dentro de meuapp, contudo para ser mais específico, o mapeamento omite a pasta meuapp na nomenclatura, mas na prática ele quer dizer isso: meuapp/vendor/minhaempresa. O mesmo raciocínio se aplica para a linha de mapeamento do diretório app que em outras palavras que dizer meuapp/app. Tenham bastante atenção nisso, pois é algo simples que me fez perder um tempo considerável para entender (2 dias refletindo sob o calor da rua e do altamente gelado ar condicionado do meu serviço) , então se alguém tiver dúvida poste aqui.


      "autoload": {
         "psr-4": {
            "minhaempresa\\" : "vendor/minhaempresa",
            "app\\" : "app"
         } 
      },

Agora, o próximo passo é criar na raiz de sua aplicação um arquivo chamado composer.json e coloque dentro dele o conteúdo abaixo.

{
      "name": "meuapp",
      "require": {
         "php": ">=7.0.5"
      },
      "require-dev": {
         "phpunit/phpunit": "5.7@stable",
         "squizlabs/php_codesniffer": "dev-master"
      },
      "minimum-stability": "alpha",
      "authors": [{
         "name": "Minha Empresa",
         "email": "developer@minhaempresa.com.br"
      }],
      "autoload": {
         "psr-4": {
            "minhaempresa\\" : "vendor/minhaempresa",
            "app\\" : "app"
         } 
      }, 
      "config": {
         "bin-dir": "bin"
      }
}

Sobre o arquivo composer.phar

Após baixado o Composer, um arquivo de nome composer.phar é criado e é ele que iremos executar para a configuração do composer

   php composer.phar -S install

Os comandos abaixo são opcionais, portanto não precisam ser executados

   php composer.phar install --no-plugins --no-scripts ...
   php composer.phar update --no-plugins --no-scripts ...

Conteúdo do arquivo index.php

Dentro do arquivo index.php você deverá colocar o conteúdo abaixo:

<?php
   require_once '../vendor/autoload.php';
   $init = new \app\Init;

A partir de uma única chamada para o arquivo autoload.php feita no index.php não precisaremos mais utilizar o comando require_once em nenhum lugar de nosso app quando precisarmos instanciar alguma classe ou outro contido na definição da PSR-4 no arquivo composer.json.

E para finalizar, execute o servidor PHP embutido (dentro do diretório onde está o seu arquivo index.php) que você já tem na sua instalação do PHP.

Se estiver rodando na máquina local use este comando:

    php -S 127.0.0.1:8080

Senão, coloque o ip dela, execute e acesse de outra máquina.

   php -S 192.168.92.128:8080

O resultado tem que ser a impressão na tela da mensagem contida no construtor da classe Init.

Pronto! Tá aí mastigado.

fonte: https://mastigado.wordpress.com

fonte: https://getcomposer.org/doc/04-schema.md

fonte: http://pt.stackoverflow.com/questions/19200/composer-autoload-e-psr-0-vs-psr-4

fonte: http://www.douglaspasqua.com/2015/01/26/php-autoload-psr-4psr-0-com-composer/

fonte: https://getcomposer.org/doc/01-basic-usage.md

fonte: https://seld.be/notes/psr-4-autoloading-support-in-composer

fonte: https://github.com/pavlakis/psr4-with-composer

fonte: http://www.php-fig.org/psr/psr-4/meta/

fonte: https://seld.be/notes/psr-4-autoloading-support-in-composer

fonte: https://getcomposer.org/doc/faqs/how-to-install-untrusted-packages-safely.md

//PSR-4 com Testes

fonte: http://culttt.com/2014/05/07/create-psr-4-php-package/

Linux não monta mais partição NTFS após atualização do Windows 8 e 10

Olá pessoal!

Essa dica vai pra quem tem dual boot Linux/Windows e que teve problema para remontar automaticamente partições NTFS após certa atualização do Windows 8 ou 10. Me refiro aqui a atualização que modificou uma série de coisas no sistema operacional da Microsoft que não sei listar ao certo, mas que alterou a forma de inicialização do Windows afetando a funcionalidade do script de montagem de partições no fstab.

fonte: https://mastigado.wordpress.com

Para resolver este problema basicamente você vai apenas desligar o modo de inicialização rápida do Windows. Então se você já souber como fazer isso sem precisar ver os screenshots abaixo vá tranquilo, caso contrário convido-lhe a passar o olho no resto do tutorial porque farei algumas considerações acerca deste problema que acontece também em outras ocasiões.

Senão, vamos ao passo a passo.

01 – Siga no Painel de Controle e vá em Opções de Energia.

01_painel_de_controle

02 – Ao lado direito vá em Escolher a função dos botões de energia.

02_escolher_funcao_botoes_energia

03 – Depois em Alterar configurações não disponíveis no momento.

03_alterar_configuracoes_nao_disponiveis_no_momento

04 – E desmarque a opção Ligar inicialização rápida (recomendado).

04_desmarcar_inicializacao_rapida

E pronto. Salve as alterações, reinicie seu pc, tente entrar no Linux novamente e confira se suas partições NTFS  montam automaticamente.

Algumas considerações:

O código que utilizo para montar uma partição NTFS no arquivo fstab (localizado em /etc/fstab) está deste jeito:

/dev/sda1      /media/W10USBSO          ntfs         defaults,umask=000

Eu já escrevi um tutorial explicando como montar partições tanto por linha de comando quanto no fstab e você pode conferir aqui, porém para resolver este tipo de problema você precisa saber que quando o Windows entra em estado de hibernação é normal que não se consiga montar as partições em modo de leitura e escrita, mas sim em somente leitura como na linha abaixo dentro do console por exemplo:

mount -ro ntfs /dev/sda1 /home/usuario/teste/

Entretanto, depois desta atualização a que me refiro neste post, o Windows passando a ativar este modo de inicialização rápida deixa o sistema de arquivos como se estivesse em estado de hibernação e aí que reside o engano da interpretação do problema.

Muita gente tenta resolver este problema tentando desativar o arquivo de hibernação do Windows, mas para este nosso caso em específico esse procedimento não irá funcionar.

Quando o seu Linux não monta as partições NTFS durante o boot e você tem certeza que está tudo ok com seu Windows e que ele não está hibernando, geralmente a primeira coisa que tentamos fazer é montar a partição na linha de comando deste jeito:

mount -t ntfs /dev/sda1 /home/usuario/teste/

Mas aí você recebe um erro deste jeito:

Windows is hibernated, refused to mount.
Failed to mount '/dev/sda1': Operação não permitida
The NTFS partition is in an unsafe state. Please resume and shutdown
Windows fully (no hibernation or fast restarting), or mount the volume
read-only with the 'ro' mount option.

Então você pensa: “o Windows deve estar hibernando e não percebi”, aí conforme orientação de alguns blogs (para o caso da hibernação) você tenta remover o arquivo de hibernação pelo Linux:

mount -t ntfs-3g -o remove_hiberfile /dev/sda1 /home/usuario/teste/

E aí recebe o mesmo erro porque ele não está hibernando, não existe o arquivo hiberfile.

Cheguei a utilizar um outro comando para tentar corrigir algum erro na partição NTFS, o ntfsfix:

ntfsfix /dev/sda1

Mas me retornou algo similar, dizendo que o Windows está hibernando:

Mounting volume... Windows is hibernated, refused to mount.
FAILED
Attempting to correct errors...
Processing $MFT and $MFTMirr...
Reading $MFT... OK
Reading $MFTMirr... OK
Comparing $MFTMirr to $MFT... OK
Processing of $MFT and $MFTMirr completed successfully.
Setting required flags on partition... OK
Going to empty the journal ($LogFile)... OK
Windows is hibernated, refused to mount.

Então fica aí a dica, neste caso o seu problema está no Windows e não no Linux. E sinceramente, desabilitar esta opção de “fast startup” não fez diferença considerável para meu Windows 10 no quesito desempenho de inicialização.

fonte: https://askubuntu.com/questions/145902/unable-to-mount-windows-ntfs-filesystem-due-to-hibernation

fonte: https://www.vivaolinux.com.br/topico/Linux-Avancado/Linux-nao-monta-particao-NTFS

fonte: https://mastigado.wordpress.com

Missing Assembly References in Visual Studio

Olá pessoal!

Hoje deixar uma dica rápida para quem adicionou corretamente a referência de seu projeto no Visual Studio, mas ele informa como se ela não estivesse lá. Algo como na figura abaixo.

missing reference

Peguei o exemplo acima no site do Telerik e nele podemos ver que onde se encontram as marcações em amarelo são justamente os locais em que as referências não foram bem resolvidas.

Comigo esse fato acontece as vezes em duas situações distintas, são elas:

  1. Acabei de adicionar um ou mais projetos (que pertenciam a outra Solution) para dentro do Visual Studio;
  2. Ou renomeei um projeto, retirei-o do Visual Studio, depois criei outros com o mesmo nome ou diferentes, e outros projetos que dependiam dele não conseguem referenciar os novos projetos adequadamente.

Solução:

  1. Feche todas as abas que estão abertas no Visual Studio porque elas podem conter alguma referência antiga;
  2. Clique com o botão direito em cima do seu projeto e veja qual o TargetFramework ele está utilizando e tente colocar todos os outros projetos no mesmo padrão (referências antigas poderiam ter outras versões de Target Framework marcadas).
  3. Clique em cima da Solution com o botão direito e em seguida Clean Solution;
  4. Faça o mesmo procedimento na Solution, mas desta vez vá em Rebuild Project;
  5. Feche, abra novamente seu Visual Studio e cruze os dedos.

fonte: http://stackoverflow.com/questions/2231731/why-cant-i-reference-my-class-library

fonte: http://docs.telerik.com/teststudio/troubleshooting-guide/visual-studio-tg/missing-assembly-references

fonte: https://mastigado.wordpress.com

Utilizar o Debug do Android Studio num aparelho Android desconhecido

Olá pessoal!

Já faz um tempo que não posto por aqui e hoje vou deixar uma remodelada dica a respeito do que peguei neste blog sobre como colocar determinado tablet para entrar em modo debug no Android Studio.

Pois bem, o meu caso foi que precisei colocar o tablet Dell Vennue 8 para ser reconhecido no Android Studio porque só testar no meu aparelho celular não tava dando muito certo. Porém, precisei colocar também outro dispositivo desconhecido, um aparelho chamado Garmin Monterra e tive de fazer uma (pequena) alteração no procedimento ensinado pelo blog que peguei a informação.  “Mastiguei” ao máximo que pude o procedimento.

Vamos lá?

Ok!

Pré requisitos:

  • Entrar em modo desenvolvedor (vá em configurações  > sobre o dispositivo > clique 7 vezes no número de versão;
  • Verifique se o modo foi habilitado no Android;
  • Se estiver, habilite a depuração USB (em configuração>modo desenvolvedor > depuração USB);
  • No Pc, instale pelo Android SDK Manager o pacote Google USB Drivers;
  • Conecte seu dispositivo.

– Vamos até o Gerenciador de Dispositivos do Windows e localizamos o aparelho que queremos que nosso Android Studio reconheça para que possamos fazer Debug de nossas apps.

Garmin Monterra no Gerenciador de Dispositivos.

– Clicamos com o botão direito no dispositivo desejado e em seguida siga em Propriedades.

Garmin Monterra propriedades no Gerenciador de Dispositivos.

– Vá até a guia Detalhes e na caixa de Propriedade escolheremos IDs de Hardware.

ID de Hardware

– Copiamos os dois valores contidos na caixa Valor.

Valor de ID de hardware

– Na próxima estapa devemos procurar pelo arquivo android_winusb.inf e editá-lo. Em meu Windows 7 estava localizado em C:\Users\nome_do_meu_usuario\cminstaller\resources\drivers\usb_driver, mas este caminho pode variar de sistema para sistema.

Em seguida, procure a sessão onde está definida a configuração de ;Google Nexus (generic) e abaixo desta configuração (não do título da sessão) é que você deverá colocar o código parecido com o que está abaixo, porém com as informações de hardware do seu aparelho e não do meu.  Por isso lembre-se, essa aí abaixo é minha configuração e não a sua.


;Garmin Monterra
%SingleAdbInterface%     = USB_Install, USB\VID_091E&PID_2585&REV_0216&MI_01
%CompositeAdbInterface%  = USB_Install, USB\VID_091E&PID_2585&MI_01

Observe acima que existem duas variáveis (%SingleAdbInterface% e %CompositeAdbInterface%) que você terá de colocar para armazenar os valores que você copiou do seu ID de Hardware no Gerenciador de Dispositivos, na ordem que estavam. Repare bem o screenshot um pouco mais acima e o código logo abaixo dele, estão bem mastigados.

O que fazer quando você já fez este procedimento com outro dispositivo desconhecido?

Bem, quando você faz este procedimento somente em um dispositivo é tranquilo, mas quando você quer colocar um outro dispositivo desconhecido? Também é tranquilo, mas deve ser feita uma alteração no arquivo.

Repare (na figura abaixo) que já existiam duas variáveis com os mesmos nomes que usamos anteriormente (%SingleAdbInterface% e %CompositeAdbInterface%). E para resolver isso é simples, comente o código que apontava para o dispositivo que foi introduzido antes e adicione a linha que formatamos um pouco mais acima. Não se preocupe que o seu dispositivo anterior não irá perder o driver, pois ele já foi instalado no sistema operacional assim que foi dado o refresh do Gerenciador de Dispositivos.

android_winusb.inf

– Agora, volte no Gerenciador de Dispositivos, clique novamente com o botão direito no dispositivo desconhecido e em seguida em Atualizar Driver.

atualizar driver dispositivo

– Feito o procedimento acima, na caixa que se abrirá escolha o arquivo que foi inserida a informação do driver que deseja instalar.

atualizar driver de android_winusb.inf

– Aqui um detalhe importante de quando você for escolher qual será o driver utilizado. No blog que eu disse ter pegado a informação é dito que foi escolhido o driver com o nome ADB Interface e no meu caso escolhi Android Composite ADB Interface, portanto é bom que você perceba que podem ocorrer variações.

garmin novo driver

– E sim, no meio da instalação podem também acontecer avisos do Windows dizendo que não pôde verificar o driver. Sinceramente eu não tinha muito o que fazer, então deixei seguir.

driver não confiável

10º – Depois disso, clique em Fechar e finalize a instalação.

instalação driver finalizada.

11º – Quando voltar para o Gerenciador de Dispositivos pode ser que já esteja lá o dispositivo instaladinho e bonitinho ou o sistema operacional pode pedir para ser reiniciado assim como foi comigo e por aí vai. Se não funcionar de primeira refaça o procedimento com (mais) cuidado e (mais) carinho.  Outra observação que faço é que se você tiver plugado os dois dispositivos desconhecidos ao mesmo tempo, no Gerenciador de Dispositivos irá aparecer dois nomes iguais, portanto não temas.

dispositivo desconhecido reconhecido.

12º – E por fim, abra o Android Studio, ligue o Debug ou dê o Run. Eu pluguei os dois dispositivos desconhecidos (agora reconhecidos) para que todos vejam que não importa o número de dispositivos que você coloque, ele irá reconhecer todos após ter feito o procedimento correto.

garmin monterra on androi studio

Moral da história

Se você comprou aquele celular chinês de marca Android e quer usá-lo no Android Studio não temas! Existe uma esperança.

fonte: https://mastigado.wordpress.com

E claro, mais uma vez não poderia deixar de citar a fonte que inspirou este post:

fonte: http://cadnunsdimirdev.blogspot.com.br/2015/03/como-usar-seu-dell-venue-8-paratestar.html

Capturar apenas data de coluna Datetime no SQL Server

Hoje vou deixar um post bem curto para caso onde apenas é preciso somente pegar a data de uma coluna  do tipo datetime.

Vamos lá:

No SQL Server 2008 ou superior, você pode converter a data assim:


SELECT CONVERT(date,nome_da_sua_coluna_datetime)

Para versões antigas, você pode seguir desta forma:


SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, @sua_data))

Por exemplo:


SELECT DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))

Vai te dar:


2008-09-22 00:00:00.000

Quais são os prós?

Você não precisa usar nada de varchar <-> apenas conversões de datetime são requeridas;
Você não precisa pensar nada sobre configurações de locale.

fonte: https://mastigado.wordpress.com

fonte: http://stackoverflow.com/questions/113045/how-to-return-the-date-part-only-from-a-sql-server-datetime-datatype

Delimitar o tempo do Progress Dialog no Android

Olá pessoal!

Hoje eu vou deixar uma dica básica para quem precisa definir um tempo para exibição do Progress Dialog.

 progress = new ProgressDialog(this.context);
 progress.setTitle("AVISO!");
 progress.setMessage("Servidor Offline ou Aparelho com Wifi Desligado.");
 progress.show();

 Runnable progressRunnable = new Runnable() {
    @Override
    public void run() {
       progress.cancel();
    }
 };

 Handler pdCanceller = new Handler();
 pdCanceller.postDelayed(progressRunnable, 4000);

 progress.setOnCancelListener(new DialogInterface.OnCancelListener() {
    @Override
    public void onCancel(DialogInterface dialog) {
       progress.dismiss();
    }
 });

Eu naõ tenho muito o que dizer, o negócio tá mastigado. Para alterar o tempo basta alterar o valor onde está escrito 4000.

fonte: https://mastigado.wordpress.com

Outras refererências:

fonte: http://briandolhansky.com/blog/2013/7/11/snippets-android-async-progress
fonte: http://www.tutorialspoint.com/android/android_progress_circle.htm

%d blogueiros gostam disto: