Guia: Substituir Windows 8.0 Pré-Instalado

Essa semana, meu antigo notebook veio a falecer e eu precisei comprar um meio que emergencialmente para terminar alguns freelas que estavam com prazos bem apertados.

Eu sou usuário linux mas ainda mantenho uma partição com Windows para alguns trabalhos específicos (exigência de cliente e/ou tecnologia, etc. ) . Como não fui com a cara do Windows 8, resolvi formatar a máquina e instalar meu Ubuntu + Win 7 e assim deu-se inicio ao meu final de semana terror.

O problema é o UEFI, sucessor de togakure da boa e velha BIOS. Por causa dele, eu não conseguia simplesmente mudar a prioridade de BOOT para CD/DVD já que o Windows 8 não reinicia de verdade, ele hiberna, então quando você pressiona Del, F1, F10 ou seja lá qual for a tecla que te levaria para o setup no boot, não acontece nada … você continua indo parar no vírus Windows 8.

Ok, vamos então para a receita de bolo para remover ele e instalar seu sistema operacional preferido.

DESATIVAR O FAST BOOT NO WINDOWS 8

Abra o painel de controle e vá até as opções de energia.
No menu do lado esquerdo, escolha a opção “Alterar o funcionamento dos botões de energia” e em seguida, clique em “Alterar configurações não disponíveis no momento”.
Na parte inferior da tela, desmarque a opção “Ligar inicialização rápida”.

ACESSAR A BIOS

Ainda no Windows 8, vá até as opções de desligamento e segure a tecla shift e clique em reiniciar. Isso vai fazer com que você entre nas configurações do UEFI.

Se tudo deu certo até o momento, você estará agora olhando para a tela do UEFI, que é mais ou menos assim:

Clique na opção “Troubleshoot”, depois em “Advanced Options” e por fim “UEFI Firmware Settings”. Pronto, o computador irá reiniciar e provavelmente você não terá que pressionar nenhuma tecla para entrar na BIOS, já vai entrar direto.

Já na boa e velha BIOS, procure as opções de Boot (cada fabricante tem um layout diferente, por isso não tenho como dizer onde exatamente está) e habilite o Boot Legacy e altere as prioridade de boot entre UEFI e legacy, deve ter uma opção: Boot Legacy First.

Na mesma tela, selecione a ordem de prioridade de boot para CD/DVD ou se você vai realizar uma instalação via USB, selecione o dispositivo correspondente. Tudo isso fica antes do seu HD que contém o Windows 8. Em alguns casos, também é necessário desativar o Secure Boot – Não foi o meu caso mas se for necessário, provavelmente se encontra na aba Security.

Reinicie com o CD/DVD de instalação do novo Sistema e tudo vai funcionar como esperado. Se você vai ficar com apenas 1 sistema operacional, seus problemas acabaram e você já pode ser feliz \o/.

* A partir de agora, sempre que precisar entrar na BIOS, basta pressionar a tecla de função normalmente como antigamente durante o boot.

DUAL BOOT – INSTALAR LINUX

Para instalar seu linux (em meu caso o Ubuntu), basta dar o boot pelo Live CD ou USB (lembre-se, você deve alterar a prioridade do boot na BIOS para que ele inicie pelo dispositivo e não pelo HD) e seguir as instruções de instalação.

Eis que você chega na parte de selecionar a partição de instalação e o instalador não reconhece a partição onde você instalou o outro sistema operacional e mostra o disco inteiro vazio. Pois é, mais uma novidade 🙂 – O GPT. O GPT é o novo formato de tabela de partição, sucessor da MBR. E o que acontece é que as vezes, você instala um sistema com MBR e ficam “resíduos” do GTP no disco, dai a ferramenta de partição entende que trata-se de um disco em GPT e lá não tem nada. 

Saia da instalação e entre no modo “Try Ubuntu”, acesse o terminal e execute a ferramenta gdisk. Sintaxe: gdisk /dev/sda

ATENÇÃO – Muito cuidado a partir daqui.

O gdisk irá identificar que o disco possui MBR e GPT e pergunta como você deseja trabalhar, escolha MBR Only.
Tecle “x” para entrar no modo expert
Tecle “z” para apagar os dados da GPT e confirme com “y”
Tecle “n” para a pergunta “Blanking the MBR”. Cuidado para não responder “y” aqui.

Pronto, saia do gdisk e abra o gparted ou qualquer outra ferramenta de particionamento que desejar. 
A partir desse momento, você já vai conseguir ver a(s) partição(ões) que contém o outro sistema instalado. Crie as partições linux que desejar e reinicie computador.

Pronto, siga o processo de instalação normalmente.

Referências:

http://askubuntu.com/questions/221835/installing-ubuntu-on-a-pre-installed-windows-8-64-bit-system-uefi-supported

http://www.tecmundo.com.br/como-fazer/29536-windows-8-o-que-e-o-modo-de-inicializacao-rapida-e-como-desabilita-lo.htm

http://askubuntu.com/questions/249642/gpt-partition-table-warning-message-during-install-of-ubuntu

Impressora HP: Impressão extremamente lenta

Sintomas: Impressora não realiza a impressão (Linux) ou imprime de forma extremamente lenta, imprimindo 1 faixa de cada vez (uns 15 ou 20 segundos de intervalo entre uma impressão e outra – Linux e Windows 7).

Diagnóstico: Provavelmente um dos cartuchos está com problema. Remova 1 cartucho de cada vez, mande um documento para a fila de impressão e verifique se a impressão voltou ao normal. Se sim, o cartucho com defeito é o que foi retirado.

Plus: No Linux, baixe a ferramenta gerenciamento de impressão da HP e o driver hplip no site: http://hplipopensource.com/hplip-web/index.html

Pronova Rockey2 + Java

Estou em um novo projeto que foi necessário implementar licença de software utilizando tokens usb. Um amigo me indicou os tokens da Pronova (pronova.com.br) por ser simples de implementar e relativamente seguros. A diferença é que ele usou .NET e meu projeto é em Java e em Java sempre tem uma pegadinha do malandro 🙂

Lá vai eu pegar o sample do java que vem no cd de instalação e fazer os testes no eclipse. Segui as instruções (sic) do arquivo leia-me e apanhei feito mala velha.

Sempre que executava, me retornava o erro: java.lang.unsatisfiedlinkerror ou não encontrava o pacote “rockey2”.

Usei o DJ Decompiler para saber qual era o pacote que estava na tal classe “JRockey2.class” e não tinha pacote nenhum definido. Setei o pacote como sendo rockey2 e passou a apresentar o erro de classe duplicada.

Depois de muitas tentativas, achei o JNA (Java Native Access) e meus problemas acabaram. Joguei fora a classe JRockey2 que vem no SDK e criei uma interface como mostra os exemplos na wiki do JNA apontando para a dll Rockey2 e não a JRockey2.

Vamos a solução:

1. Baixe o jna.jar e platform.jar em https://github.com/twall/jna#download

2. Inclua essas libs no seu classpath

3. Se ainda não colocou, coloque as dlls do SDK na pasta C:\WINDOWS\System32

4. Criei seu wrapper, o meu ficou assim:

package com.wordpress.tidoc.security;

import com.sun.jna.Library;
import com.sun.jna.Native;

public interface JRockey2 extends Library
{
	JRockey2 INSTANCE = (JRockey2) Native.loadLibrary("Rockey2", JRockey2.class);

    public int RY2_Find();

    public int RY2_Open(int i, int j, int ai[]);

    public void RY2_Close(int i);

    public int RY2_GenUID(int i, int ai[], byte abyte0[], int j);

    public int RY2_Read(int i, int j, byte abyte0[]);

    public int RY2_Write(int i, int j, byte abyte0[]);

    public static final int AUTO_MODE = 0;
    public static final int HID_MODE = -1;
    public static final int ROCKEY2_DISABLE_WRITE_PROTECT = 0;
    public static final int ROCKEY2_ENSABLE_WRITE_PROTECT = 1;
    public static final int RY2ERR_SUCCESS = 0;
    public static final int RY2ERR_NO_SUCH_DEVICE = 0xa0100001;
    public static final int RY2ERR_NOT_OPENED_DEVICE = 0xa0100002;
    public static final int RY2ERR_WRONG_UID = 0xa0100003;
    public static final int RY2ERR_WRONG_INDEX = 0xa0100004;
    public static final int RY2ERR_TOO_LONG_SEED = 0xa0100005;
    public static final int RY2ERR_WRITE_PROTECT = 0xa0100006;
    public static final int RY2ERR_OPEN_DEVICE = 0xa0100007;
    public static final int RY2ERR_READ_REPORT = 0xa0100008;
    public static final int RY2ERR_WRITE_REPORT = 0xa0100009;
    public static final int RY2ERR_SETUP_DI_GET_DEVICE_INTERFACE_DETAIL = 0xa010000a;
    public static final int RY2ERR_GET_ATTRIBUTES = 0xa010000b;
    public static final int RY2ERR_GET_PREPARSED_DATA = 0xa010000c;
    public static final int RY2ERR_GETCAPS = 0xa010000d;
    public static final int RY2ERR_FREE_PREPARSED_DATA = 0xa010000e;
    public static final int RY2ERR_FLUSH_QUEUE = 0xa010000f;
    public static final int RY2ERR_SETUP_DI_CLASS_DEVS = 0xa0100010;
    public static final int RY2ERR_GET_SERIAL = 0xa0100011;
    public static final int RY2ERR_GET_PRODUCT_STRING = 0xa0100012;
    public static final int RY2ERR_TOO_LONG_DEVICE_DETAIL = 0xa0100013;
    public static final int RY2ERR_UNKNOWN_DEVICE = 0xa0100020;
    public static final int RY2ERR_VERIFY = 0xa0100021;
    public static final int RY2ERR_UNKNOWN_ERROR = 0xa010ffff;
}

5. Por último, faça a chamada em seu código assim:

int iRetcode = JRockey2.INSTANCE.RY2_Find();

]

Para quem tiver afim de conhecer mais sobre o JNA: http://en.wikipedia.org/wiki/Java_Native_Access e http://twall.github.com/jna/3.5.1/javadoc/

Abrassss

SQL Server: Migrando dados entre schemas diferentes

Fala pessoal! Depois de um longo tempo sem postar nada … estou de volta!!

Recentemente participei do projeto de integração entre 4 sistemas e unificação de suas bases de dados. Nessa base, nós dividimos as tabelas de alguns dos módulos específicos utilizando os schemas do SQL Server.

Vamos lá! O cenário é o seguinte: Temos bases diferentes onde o único schema é o dbo. Ao unificarmos as bases, deseja-se separar alguns objetos com schemas próprios (diferentes do dbo). Não consegui encontrar nenhuma ferramenta free que fizesse o trabalho completo e no meu caso e acredito que no caso de muitos, é complicado pagar um preço relativamente alto pra usar uma ferramento 1 ou 2 vezes apenas. Por esse motivo adotei essa solução.

Vou partir do principio que a nova base já está com a estrutura pronta e só é necessário importar os dados da base antiga.

1º Passo é gerar o script com os dados. Um espécie de “backup” … comum em outros SGBDs como PostgreSQL e MySQL.
Para tal, Clique com o botão direito na base que deseja exportar os dados e escolha a opção Tasks > Generate Scripts, como mostra a imagem abaixo:

Como só interessam os dados, escolha apenas as tabelas que deseja exportar. Na próxima tela, marque as opções “save to file”, “single file” e clique em “Advanced”. Nessa tela, você deverá mudar as propriedades: “Schema qualify object names” para “false”, “Script USE DATABASE” para “false” e por último “Types of data to script” para “data only”, como mostra a imagem abaixo:

Mas porque retirar o nome do schema e o “USE DATABASE”? Se o arquivo gerado for muito grande, maior que 2 GB por exemplo, você terá dificuldade para altera-lo em um editor de textos depois e lembre-se que você quer mudar de schema e não continuar com o dbo e a base destino também é diferente. Ah, eu poderia mudar o schema direto na minha base antiga e já exportar certinho? Claro que pode, mas como ainda trata-se da base de produção, quanto menos modificações, melhor … por isso prefiro alterar apenas o script que não causa nenhum impacto na estrutura atual.

Feito isso, pode gerar o script. A depender do tamanho da base, vai demorar um pouco.

2º Passo, depois do script gerado, nós vamos desativar temporariamente todas constraints e triggers. Para tal, você irá precisar rodar os seguintes comandos SQL:

EXEC sp_msforeachtable "ALTER TABLE ? DISABLE TRIGGER ALL"
GO

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT ALL"
GO

3º Passo, existe um detalhe muito importante agora, como usar o schema se não tem nenhuma referencia no script? O pulo do gato está no default schema do usuário que você irá utilizar na importação. Defina o default schema para o desejado  antes de executar o script de importação.

Agora você tem duas opções: Rodar pelo Management Studio ou pelo linha de comando com o sqlcmd.exe. Se o script for muito grande, você terá que usar o sqlcmd.
Sintaxe: sqlcmd.exe -S <host> -U <usuario> -P <senha> -d <banco destino> -b -i <caminho para o script> -o <log de saída>

Novamente, a depender do tamanho da base, o processo pode levar horas.
Se tudo deu certo até aqui, você já pode habilitar novamente as triggers e contraints:

EXEC sp_msforeachtable "ALTER TABLE ? ENABLE TRIGGER ALL"
GO

EXEC sp_msforeachtable "ALTER TABLE ? CHECK CONSTRAINT ALL"
GO

4º Passo, se tudo deu certo, vai no barzinho mais próximo e pede uma gelada!! \o/
Abrassssss galera!

Forçar o WebBrowser Control a usar IEX(7,8 ou 9)

Desenvolvi um aplicativo que possui um navegador integrado com webbrowser control que insistia em renderizar as páginas como IE7. O IE instalado na máquina, estava renderizando normalmente como IE8 sem estar usando o modo de compatibilidade. Pesquisando com um amigo aqui do trampo, descobrimos que o webcontrol rendereza por padrão como IE7 e precisamos modificar o registro do windows para força-lo a usar o IE8 ou IE9 se for o caso.

Para, tal .. abra o regedit e localize a chave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION e adicione um valor DWORD com o nome do seu aplicativo, browser.exe por exemplo e coloque o valor 7000 em decimal para rodar como IE7, 8000 para rodar como IE8 e 9000 para rodar como IE9.

Existem outros modos de compatibilidade, veja aqui o material oficial da Microsoft.

Abrasss

PHP-GTK2 + Glade 3 = fatal error

Você já viu esse erro?

(php.exe:4416): libglade-WARNING **: Expected <glade-interface>.  Got <interface>.
(php.exe:4416): libglade-WARNING **: did not finish in PARSER_FINISH state

Fatal error: Uncaught exception 'PhpGtkConstructException' with message 'could n
ot construct GladeXML object' in E:\Nodo3\PHP-GTK\Sample\Sample.phpw:6
Stack trace:
#0 E:\Nodo3\PHP-GTK\Sample\Sample.phpw(6): GladeXML->__construct('Sample.glade')

#1 {main}
  thrown in E:\Nodo3\PHP-GTK\Sample\Sample.phpw on line 6

Pois é, o erro é causado pelo formato do arquivo glade: o GtkBuilder, substituto do GladeXML que foi depreciado.

É muito difícil encontrar informações sobre php-gtk2, mas pelo que pude entender, ele não tem suporte total ao padrão GtkBuilder, logo .. é melhor continuar usando GladeXML.

Para resolver o problema, abra o menu Editar > Preferências, e altere o formato de saída do arquivo para Libglade.
Se alguém tiver informações mais precisas sobre o suporte do GtkBuilder no php-gtk2 compartilha aqui ok??

Abrasss

IEOptLib – Internet Explorer Options Library

Fala meu povo!! Criei uma lib em C# para manipular as opções de internet do Windows. É possível modificar as zonas de segurança ou criar um nível personalizado. É bem útil para utilizar em conjunto com o componente WebBrowser (System.Windows.Forms.WebBrowser).

Basicamente a classe modifica as chaves do registro HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\[0-4], onde [0-4] é zona que deseja modificar.

  • 0 – Meu computador
  • 1 – Intranet local
  • 2 – Sites confiáveis
  • 3 – Internet
  • 4 – Sites restritos

Seguindo a regra acima, HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Zones\3 representa as opções da zona de internet. Cada valor DWORD dentro dessa chave, representa um item das opções de internet.

Usar a lib é muito fácil, basta fazer a chamada ao método estático que representa a função que você deseja modificar e passar a zona e o novo valor que será atribuído.

InternetOptions.SetSecurityLevel(InternetOptions.INTERNET, InternetOptions.MEDIUM_LOW_LEVEL);

O exemplo acima altera o nível de segurança da zona de internet para médio-baixo.

Como a maioria das opções requer que o Internet Explorer seja reiniciado, é uma boa prática chamar o método antes de renderizar o componente WebBrowser (se esse for o seu foco). faça as chamadas na classe Program, antes de inicializar o Main Form.

O projeto encontra-se no source forge (http://sourceforge.net/projects/ieoptlib/) e é GPL.
Usei como referência um artigo da Microsoft (http://support.microsoft.com/kb/182569/pt-br) que explica muito bem como funciona a gestão das opções de internet.

Espero ter ajudado
Abrassss

PHP 5.2.13 + Apache 2.2.15 (Windows)

Eu e algumas muitas pessoas, estão encontrando muita dificuldade para instalar o PHP 5.2.13 com Apache 2.2.15. Páginas em branco, erro no php5ts.dll ao tentar iniciar o apache são alguns dos sintomas.

Consegui com muito custo resolver o problema. Vamos a solução!

Ingredientes

  • PHP 5.2.13
  • Apache 2.2.15
  • msvcr71.dll (em alguns casos)

Instale normalmente o Apache e o PHP. Depois vá até o prompt de comando e execute (se o PHP não estiver no path do sistema, acesse o diretório de instalação do PHP):

C:\php -v

Provavelmente você receberá algumas mensagens de erro sobre extensões. Desabilite as extensões que estão dando erro e que você não utiliza. No meu caso desabilitei as extensões do oracle, snmp, sqlite e sybase.

Em alguns casos o PHP reclama da biblioteca msvcr71.dll, se for o seu caso, baixe aqui e salve-a na pasta windows/system32.

Salve suas alterações no php.ini e rode novamente o comando php -v. Desabilite as extensões até que nenhuma mensagem de erro seja exibida.

Crie um script php com o conteúdo <?php phpinfo();?> e coloque no document root. Inicie o apache e acesse essa página. Ficou em branco? Algum extensão que está habilitada não apareceu? Abra o seu httpd.conf e adicione a diretiva PHPIniDir apontando para o caminho do seu php.ini. Algo como PHPIniDir “C:/PHP/php.ini”.

Reinicie o apache e tente executar o script novamente.

Até o próximo post.

Windows Firewall e conexões remotas no SQL Server 2008

Salve, salve!! Depois de um intervalo sem postar nada, deixo aqui uma dica rápida para liberar conexões remotas no SQL Server 2008. Crie um arquivo bat com o conteúdo:

@echo =========  SQL Server Ports  ===================
@echo Enabling SQLServer default instance port 1433
netsh firewall set portopening TCP 1433 "SQLServer"
@echo Enabling Dedicated Admin Connection port 1434
netsh firewall set portopening TCP 1434 "SQL Admin Connection"
@echo Enabling conventional SQL Server Service Broker port 4022
netsh firewall set portopening TCP 4022 "SQL Service Broker"
@echo Enabling Transact-SQL Debugger/RPC port 135
netsh firewall set portopening TCP 135 "SQL Debugger/RPC"
@echo =========  Analysis Services Ports  ==============
@echo Enabling SSAS Default Instance port 2383
netsh firewall set portopening TCP 2383 "Analysis Services"
@echo Enabling SQL Server Browser Service port 2382
netsh firewall set portopening TCP 2382 "SQL Browser"
@echo =========  Misc Applications  ==============
@echo Enabling HTTP port 80
netsh firewall set portopening TCP 80 "HTTP"
@echo Enabling SSL port 443
netsh firewall set portopening TCP 443 "SSL"
@echo Enabling port for SQL Server Browser Service's 'Browse' Button
netsh firewall set portopening UDP 1434 "SQL Browser"
@echo Allowing multicast broadcast response on UDP (Browser Service Enumerations OK)
netsh firewall set multicastbroadcastresponse ENABLE

Execute o bat e seja feliz! Abraços

Editado
Tinha esquecido de colocar o link de onde vem o script original: http://support.microsoft.com/kb/968872

Dica rápida: Executar um arquivo batch através do PHP

Uma dica rápida pra quem está tentando executar um arquivo .bat usando o php. Dê permissão ao usuário do apache ou IIS para executar o cmd.exe, feito isso, chame o seu bat usando como ponte  prompt de comando: exec(“cmd.exe \c arquivo.bat”)

Lembre-se que seu script batch não deve ter interação com o usuário 😉

Abrasss