Instalar e configurar Spark e OpenFire 4.1.3 no Debian Linux com integração no AD do Windows utilizando SQL Server 2008 R2

Olá pessoal

Tendo observado que a maioria das pessoas que entram no blog querem saber como instalar o OpenFire 4.1.3 com integração no AD. Pois bem, vou tentar ser mais objetivo para aqueles que estão tendo dificuldade em instalar e integrá-los.

ESCLARECIMENTO SOBRE ESTE POST(LEIA ANTES DE TUDO).

  1. Quando você tiver instalado e integrado ao AD o seu OpenFire, não existirá mais a necessidade de adicionar usuários e grupos manualmente dentro do Spark, a partir daí, você precisará apenas criar um usuário no AD e colocá-lo no grupo spark. Somente isso bastará para aparecerem listados todos os usuários no Spark de todos os clientes.
  2. Leia devagar e com atenção o passo a passo para a instalação até o 18º ítem que dará tudo certo, pois detalhei muito bem. Devagar, por favor.
  3. Logo após o passo a passo, eu marquei de vermelho todos os ítens que considero fundamentais para o pós-instalação, então por favor novamente, leia-os com atenção. Se surgiu alguma dúvida no meio do caminho, leia até o final porque talvez posso tratá-la mais abaixo.

Hoje vamos configurar um servidor de mensagens instantâneas de nome OpenFire no Linux Debian 8.7.1

fonte: https://mastigado.wordpress.com

1º – Instalaremos o arquivo executável do OpenFire(não importa a versão). Baixamos o arquivo do site ;

Arquivo executável do OpenFire

2º – E no terminal do Linux, vamos até onde o executável está.

3º – Pelo fato de poder aparecer algum erro do tipo “java7-runtime-headless não está instalado”, instalaremos o pacote abaixo.

apt-get install default-jdk

4º – Em seguida executamos o comando para instalarmos o pacote Debian do Openfire.

dpkg -i openfire_4.1.3_all.deb

5º – Agora daremos início a nossa instalação pela web. Siga no navegador e digite http://o_ip_do_seu_servidor_onde_sera_instalado_o_openfire:9090 e veremos algo para já configurarmos a linguagem da aplicação.

6º – Agora, configuraremos o nosso domínio. No nome do Domínio o correto é ficar com empresa.local (que seria o nome do meu domínio) e no Server Host Name (FQDN) eu voltei atrás e coloquei o ip do meu servidor Linux, pois também funciona e é mais garantido quando você não tem um servidor que “resolve” os nomes de servidores Linux em sua rede.

Quanto as portas, só convém mudar se já existir algum serviço as utilizando neste host. Você também tem a opção de nessa versão definir o tipo de criptografia que irá usar, porém por enquanto eu não irei trabalhar com isso.

OpenFire configuração de domínio

7º – Agora, a conexão com os dados no OpenFire poderá ser feita por um banco de dados externo ou interno, contudo vou deixar minha impressão a respeito do banco de dados interno.

Minha primeira instalação do OpenFire foi utilizando seu próprio banco de dados e não tive uma boa experiência porque ao terminar a instalação, simplesmente não consegui me logar na área administrativa do OpenFire por conta, julgo eu, de um bug. Pesquisei na net sobre isso e descobri que na versão 3.7.0 existia sim este bug, mas que nesta versão que estou instalando(4.1.3) acredito que tenham corrigido.

Ainda pesquisando na net, descobri um site que ensinava uma maneira de corrigir este bug de não conseguir conectar o banco interno após a instalação(http://red5guide.com/install_openfire_on_windows_server.html#openfirepassword), só que ao ler o guia, percebi que eu tinha que ter acesso a base de dados do OpenFire para dar um UPDATE em tabela de usuário e não achei muito simples ou possível fazer isso utilizando o banco de dados interno, por isso optei por utilizar um externo. Mas quero deixar claro que não significa que não irá funcionar utilizando o interno, mas este tutorial irá tratar especificamente de conexão com um externo.

Seguindo então na primeira opção, Conexão Padrão do Banco de Dados.

Conexão com banco de dados no OpenFire

8º – Aqui abaixo tenho a opção de escolher vários bancos, mas neste caso aqui iremos apenas escolher o Microsoft SQL Server e efetuar uma pausa na instalação para podermos configurar o nosso banco de dados.

Tipo de Banco de Dados

9º- (importante) Agora faremos a configuração da nossa base de dados no SQL Server, porém antes crie um grupo no Active Directory (AD) com o nome que desejar dentro do diretório Users. Eu escolhi o nome spark para forçar quem for criar usuários no AD, lembrar que sempre devem acrescentar este grupo ao usuário.

Entenda que a criação deste grupo é para se ter a opção de controle de usuários que podem e que não podem ter acesso para utilizar o Spark, Pandion, Pidgin, etc (clientes de mensagens local) no servidor Openfire que estamos criando. Enfim, se desejar segregar alguém, não acrescente este grupo ao usuário que você acha que não deve bater papo com ninguém.

Criação de Grupo no AD

10º – Criei um usuário no AD que é membro dos grupos Administrators, Domain Admins, Domains Users e claro, também o tornei membro do grupo spark. Fiz um usuário neste nível porque não quis misturar o usuário administrador do AD utilizado por usuários avançados com o específico deste sistema que estamos instalando, até porque ele será utilizado mais adiante algumas vezes.

Criação de Usuário Administrador de AD

11º – E para quem não manja muito de SQL Server, abaixo descrevo como criei o banco.

Para criar uma nova base de dados, dentro do gerenciador de banco de dados SQL Server Management Studio, clique com o botão direito em cima de Databases e em seguida, New Database. Dei o nome de SPARKDB para a database , coloquei o banco inicial com 200 megabytes (uns vão achar que é muito, mas deixei assim mesmo) e com Autogrowth ligado em 50%, que quer dizer que toda a vez em que ele atingir seu tamanho máximo (o tamanho inicial é de 200 megas), ele aumentará 50% deste tamanho automaticamente. Coloquei 50% para que a base não fique tão fragmentada no hard disk. Vale lembrar que estou me baseando numa base de dados de 200 usuários utilizando o Spark.

Observação 1: Em uma nova implantação que fiz chamei esta base de dados de OPENFIREDB ao invés de SPARKDB porque na época eu não sabia diferenciar Spark de Openfire por conta da confusão que meu chefe fazia ao chamar tudo de Spark. E enfim, acho que nomear o banco de dados como OPENFIREDB fica coerente. porém neste tutorial seguirei com o nome de SPARKDB mesmo.

Criação do banco de dados

12º – Ainda dentro do SQL Server Management Studio, em Security, clique com o botão direito e em seguida New Login. Em Login Name, utilizei o mesmo nome do usuário do AD, openfire e marquei SQL Server Authentication utilizando a mesma senha do usuário do AD para não me confundir depois, pois quando tentei com o do AD não consegui me logar no SQL Server.

Desmarquei todas as opções de verificações de senha.

E fiz uma alteração do default Database porque entendo que este usuário deve controlar apenas o seu banco, que no nosso caso é o SPARKDB.

Configuração de Usuário para conexão no SQL Server

13º – Na opção Server Role, marquei diskadmin para este usuário porque da última vez que não marquei, deu pau.

Regra do Servidor

14º – Em User Mapping, escolhi a base SPARKDB em específico e marquei db_owner para também colocar como dono daquele banco. E por último, cliquei em OK e a partir daí posso até fechar o SQL Server Management Studio.

User Mapping

15º – Até que enfim, voltei para este carinha aqui. No nosso caso escolhi o SQL Server, coloquei o usuário openfire do banco de dados e alterei a linha da URL do Banco de Dados de:

jdbc:jtds:sqlserver://[host-name]/[database-name];appName=jive

para:

jdbc:jtds:sqlserver://nomeservidor:1433/SPARKDB;appName=jive

Repare que utilizei a porta do SQL Server que é 1433 junto com o nome do servidor.

Configuração do acesso da aplicação ao banco de dados

16º – Nesta tela escolhi a opção que utiliza LDAP porque quero me conectar no AD.

Openfire LDAP

17º – Bem, aqui tem que ser:

O Tipo de servidor tem que ser Active Directory;

Em Host, o nome do seu host. Vale lembrar que apesar de o ip também funcionar aqui(eu acho), uma pessoa que trabalha com AD me orientou colocar o nome do host mesmo.

Na Porta, pode deixar este 389 aí.

DN Base. Este cara você vai colocar desta forma: se seu domínio é aeroporto.cumbica, coloque dc=aeroporto,dc=cumbica;

DN Administrador: O nome daquele usuário que criamos, no caso o openfire(preferencialmente) com o seu domínio. Então ficaria assim:

openfire@aeroporto.cumbica

Configuração da Conexão com o AD

18º – Neste passo, onde está definido sAMAccountName deixei como está, e mantive a sugestão que o servidor me trouxe basicamente no formato abaixo:

(&(objectCategory=person)(objectClass=user) (memberOf=CN=grupo_de_usuarios_do_ad_que_vao_utilizar_o_spark, CN=pasta_onde_esta_meu_usuario_admin_no_ad, DC=meu_dominio,DC=continuacao_do_nome_do_meu_dominio))

Depois, só mando testar as configurações e se estiver tudo ok, é exibida para mim uma tela com o resultado do teste. No meu caso ele trouxe um usuário do AD de forma aleatória e deverá fazer isso com você também.

Mapeamento de usuário

Teste de Conexão com mapeamento de usuário

Vale lembrar que agora você pode também personalizar os valores no seu cliente mensageiro inserindo ou alterando os valores que vem do AD. Você pode pesquisar na net por Active Directory Attributes e se orientar por quais você pode utilizar (https://msdn.microsoft.com/en-us/library/ms675090(v=vs.85).aspx).

19º – Este cara aí abaixo, eu fui orientado para ignorá-lo e passar batido e foi isso o que fiz.

Mapeamento de Grupo

18º – Neste último passo, configuro a conta do administrador(Fui colocando vários usuários do AD que achei que deveriam ser admins do OpenFire).

Conta do Administrador

Pronto! Agora tente se logar no OpenFire com os usuários admins que você criou.

Já sabe, se der pau no login, utilize o procedimento do site abaixo. Claro, depois de ter parado e reiniciado tanto o serviço do aplicativo, quanto o pc que está instalado.

http://red5guide.com/install_openfire_on_windows_server.html#openfirepassword

Para configurar os grupos do AD no seu OpenFire, clique no link abaixo.

https://mastigado.wordpress.com/2013/05/21/adicionando-seus-grupos-do-ad-no-openfire/

Para aumentar a quantidade de memória do seu OpenFire caso note que o serviço esteja travando(isso acontece quando se tem muitos usuários logados).

https://mastigado.wordpress.com/2013/01/25/aumentando-a-memoria-do-java-do-openfire/

Para gerenciar o OpenFire  siga os passos abaixo.

Quando você instala o OpenFire no Linux  ele já roda como um serviço e para gerenciá-lo utilize os comandos abaixo.

Em resumo seria algo assim:


//Para iniciar o serviço

/etc/init.d/openfire start

//Para reiniciar o serviço

/etc/init.d/openfire restart

//Para forçar um reload

/etc/init.d/openfire force-reload

Contudo, quando tentei parar o serviço não consegui. O comando abaixo não funcionou comigo.

/etc/init.d/openfire stop

Então, uma alternativa que encontrei para paralisar este serviço foi consultar o processo do Openfire com o comando abaixo.

ps -ef | grep openfire

E com o resultado identifiquei o PID dele (Process ID), que no meu caso foi o número 8683 que está logo abaixo no começo da primeira linha.

openfire 8683 1 0 15:29 ? 00:00:08 /usr/local/jdk1.8.0_121/bin/java -server -DopenfireHome=/usr/share/openfire -Dopenfire.lib.dir=/usr/share/openfire/lib -classpath /usr/share/openfire/lib/startup.jar -jar /usr/share/openfire/lib/startup.jar
root 8839 788 0 15:52 pts/0 00:00:00 grep openfire

E depois de identificado o PID matei o processo utilizando o comando kill.

kill 8683

E pronto, desta maneira o processo do Openfire está parado. E para subir novamente utilize-se dos comandos que citei anteriormente.

Para desinstalar o Openfire no Debian Linux.

Por vezes precisamos reinstalar o Openfire e temos problemas por conta dos arquivos de configuração que ele guarda. Então para resolver este problema utilizamos o comando abaixo.

apt-get --purge remove openfire

Para que o Spark na versão 2.8.3 conecte no Openfire 4

Esta versão do Openfire traz algumas  alterações em relação a versão 3. Uma delas é o fato de que o uso de certificados válidos é necessário para conexão entre cliente e servidor, fato que irá fazer com que você não consiga se conectar utilizando mesmo nova versão do Spark caso não tenha o ambiente adequado implantado.

Para resolver este problema abra o Spark, siga na guia avançado e marque as opções Disable certificate hostname verification (not recommended) e Accept all certificates (self-signed/expired/hot trusted) como na figura abaixo e pronto. Conecte-se ao servidor.

 

Para alterar as informações pessoais no client Spark.

Quando você se integra no AD, surge um pequeno incoveniente na hora de os usuários poderem alterar suas informações pessoais(nome, telefone, avatar, etc), pois tudo vem do Active Directory automaticamente a partir de então.

O usuário pode se deparar em sua tela com a mensagem abaixo ao tentar realizar qualquer alteração.

server does not support cards unable to save your vcard

Para resolver este pequeno problema, o 1º e o 2º passos são questionáveis e por isso, entendo que somente o 3º é necessário.

  1. Baixar o plugin LDAP Vcard(ldapvcardavatar.jar). Pelo que andei lendo, este plugin ainda está beta e em sua documentação ele diz para que você o utilize por sua conta e risco(depois que instalei e configurei, tive a certeza de ele é beta), mas acho que não temos muitas opções, não? Fui no endereço http://community.igniterealtime.org/docs/DOC-1350 e o baixei.
  2. Em seguida, instalei o “bicho” no servidor.

    Plugin LDAP Vcard para Openfire

    Plugin LDAP Vcard para Openfire

  3. Mas sinceramente, o plugin está em estado depreceated e por isso, você pode ir direto em em Propriedades do Sistema, que fica dentro de Gerenciamento do Servidor e alterar o parâmetro false para true do atributo ldap.override.avatar.

    Propriedades do Sistema

    Propriedades do Sistema

AGORA, DUAS DICAS VALIOSAS QUE SÓ APRENDI NA PORRADA

  1. Caso seus usuários, mesmo estando no grupo específico para o Spark ainda assim não estiverem aparecendo na lista de pessoas do cliente Spark, você deve colocar o seu grupo principal sendo como Domain/Users, no Active Directory, feito isso, estes usuários irão aparecer na lista de usuários do Spark normalmente.
  2. Caso precise adicionar ou retirar administradores do OpenFire, o local correto para se fazer isso quando integrado no AD é Servidor > Gerenciamento do Servidor > Propriedades do Sistema > admin.authorizedJIDs e em seguida, editar esta propriedade.

Tá aí então, mastigado.

Tutorial para instalação do plugin Jappix que é um client de conversação para a web (ainda não testei nessa nova versão de Openfire).

https://mastigado.wordpress.com/2013/01/08/instalar-client-web-jappix-no-openfire-para-bater-papo-usando-o-navegador/

Tutorial para instalação do aplicativo Xabber que é um client de conversação para a Android.

https://mastigado.wordpress.com/2015/10/07/instalar-xabberspark-no-android-para-se-conectar-no-openfire/

fonte: https://mastigado.wordpress.com

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.

Init.php

<?php

namespace app;
class Init {

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

E agora, dentro da pasta raiz de seu projeto, execute as linhas abaixo no terminal (uma de cada vez). Lembrando que o comando php no início de cada linha está pressupondo que você já tem o seu diretório mapeado no PATH de sua máquina (se você não sabe o que é PATH, recomendo ler este post que fiz sobre isso e outro post que fiz sobre como configurá-lo), caso contrário escreva o caminho completo antes de executar o comando (no Linux pode ser algo assim: /opt/php7/bin/php e no Windows algo como isto: C:\Xampp\PHP7\bin\php.exe).

   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 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';
   use app;
   $init = new 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.

E se continuar dando problema após ter feito estes procedimentos?

Abra o prompt do Windows como administrador e digite o comando abaixo:

powercfg /h off

Algumas considerações sobre outras alternativas.

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 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

%d blogueiros gostam disto: