Technologic Stuff

junho 23, 2009

Usando suas partições do linux no windows

Filed under: 1 — rockristao @ 14:25

Neste post demonstrarei como utilizar suas partições do linux no windows de forma transparente, montando-as independente qual for em drives de letra como x:, y:, etc

Eu sou um desenvolvedor crossplatform e 90% dos meus clientes usam windows. tenho um software feito em python com gtk, e tenho grandes problemas com portabilidade, principalmente em comunicação com hardware.
o libusb é um deles. escrevi recentemente um driver de um dispositivo usb para linux, e ao chegar no linux vi que ele não funcionava mesmo utilizando o mesmo libusb. Enfim, não pretendo entrar em detalhes disso, mas é fatal que eu precise usar o windows no dia-a-dia para corrigir alguns eventuais problemas no meu software.

A maior dificuldade de se usar windows, na minha opinião, além de todas que já temos, é não ter acesso aos meus arquivos, principalmente minhas músicas e ao meu repositório svn que fica no linux.

Para resolver este problema estou fazendo os seguintes passos:

Instalando o colinux

o colinux é um port do kernel do linux para windows, basicamente ele roda o kernel do linux como se fosse um serviço do windows, este kernel não tem acesso nem a som nem a vídeo, nem a praticamente qualquer outro dispositivo de hardware do computador, mas é um linux real rodando dentro do seu windows, e sem emulação ou virtualização (se assim preferir chamar).

o colinux pode ser baixado neste site.

baixar o colinux não é tudo. precisamos instalar uma distro básica para que ele possa rodar.
eu particularmente uso um debian que já vem no site para ser baixado, mas nada impede você de utilizar sua própria distribuição já instalada no seu hd, salvo uns problemas de boot que você pode gastar um bom tempo pra corrigir.
Mas de qualquer forma, acho mais fácil utilizar logo uma imagem pronta.
apesar de ter usado minha própria distro do hd por um tempo.

a imagem que eu uso é esta:
Debian Etch 4.0.
Esta imagem é um pouquinho desatualizada, mas para o que vamos usar, não tem importancia.

Após instalar o colinux e desempacotar a imagem do debian, iremos às configurações.

“Mas caetano, se o colinux não consegue acessar o hardware como eu vou montar minhas partições nele?”

Por sorte, no windows, temos algo parecido com o diretório /dev/ do linux, coisa que pouca gente sabe e que eu gastei muitas horas de pesquisa pra descobrir.

Passo 1:

Após instalar o colinux, notamos que ele vem com um arquivo chamado example.conf, como somos preguiçosos, não vamos nos dar sequer ao trabalho de mudar o nome dele, apenas fazer algumas modificações.

no example.conf teremos algo similar a isto:

#
# This is an example for a configuration file that can
# be passed to colinux-daemon in this manner:
#
#    colinux-daemon @example.conf
#
# Note that you can still prepend or append configuration and 
# boot parameters before and after '@', or you can use more 
# that one '@ to load several settings one after another.
# 
#    colinux-daemon @example.conf @overrider.conf mem=32
#
# Full list of config params is listed in colinux-daemon.txt.

# The default kernel
kernel=vmlinux

# File contains the root file system.
# Download and extract preconfigured file from SF "Images for 2.6".
cobd0="c:\coLinux\root_fs"

# Swap device, should be an empty file with 128..512MB.
#cobd1="c:\coLinux\swap_device"

# Tell kernel the name of root device (mostly /dev/cobd0,
# /dev/cobd/0 on Gentoo)
# This parameter will be forward to Linux kernel.
root=/dev/cobd0

# Additional kernel parameters (ro = rootfs mount read only)
ro

# Initrd installs modules into the root file system.
# Need only on first boot.
initrd=initrd.gz

# Maximal memory for linux guest
#mem=64

# Select console size, default is 80x25
#cocon=120x40

# Slirp for internet connection (outgoing)
# Inside running coLinux configure eth0 with this static settings:
# ipaddress 10.0.2.15   broadcast  10.0.2.255   netmask 255.255.255.0
# gateway   10.0.2.2    nameserver 10.0.2.3
#eth0=slirp

# Tuntap as private network between guest and host on second linux device
#eth1=tuntap

# Setup for serial device
#ttys0=COM1,"BAUD=115200 PARITY=n DATA=8 STOP=1 dtr=on rts=on"

# Run an application on colinux start (Sample Xming, a Xserver)
#exec0=C:\Programs\Xming\Xming.exe,":0 -clipboard -multiwindow -ac"

note a chave c0bd0, será o dispositivo virtual para root, descompacte a sua imagem do debian, caso tenha escolhido ela em alguma pasta, eu o fiz em c:\debian\debian.img
e configure para dar boot por ela.

cobd0="c:\debian\debian.img"

Legal, já temos uma configuração que vai dar boot. mas isso não me servirá pra praticamente nada, precisamos montar os discos do linux nesse colinux.

o primeiro passo é descobrir quais são os discos e partições vistos pelo windows, para isso, utilizaremos uma ferramenta do windows de gerenciamento de computador.
Esta ferramenta pode ser localizada em: Menu Iniciar\Painel de Controle\Ferramentas Administrativas\Gerenciamento do Computador.

Dentro desta ferramenta, teremos uma treeview com vários ítens, escolha Gerenciamento de Disco

Gerenciamento de discos

Gerenciamento de discos

como podemos ver, os ítens destacados em vermelhos são as partições que o windows não sabe reconhecer, que por acaso são nossas partições do linux.
abaixo temos o formato delas no disco, veja:

Disco 1:
937 MB, Íntegro, Ativo
13,99GB, Íntegro, Partição desconhecida
122GB, Íntegro, Partição desconhecida
D:, 12GB NTFS, Íntegro

podemos inferir dessas informações que a primeira partição seria a minha swap, a segunda partição minha root e a terceira partição minha home.
todas no disco 1.

agora basta ensinar ao colinux a popular seu udev com elas, colocaremos a seguinte configuração:

logo abaixo de onde colocou o cobd0:

sda3="\Device\Harddisk1\Partition3"
sda2="\Device\Harddisk1\Partition2"
sda1="\Device\Harddisk1\Partition1"
sda="\Device\Harddisk1"

agora o colinux, não apenas irá conseguir reconhecer os dispositivos dentro do linux que se iniciar, como também irá poder usá-los.

Agora finalmente poderemos dar boot no nosso colinux para fins de testes.

o comando é, pelo cmd:

cd \arquiv~1\colinux
colinux-daemon.exe @example.conf

voilá, você estará vendo um console dando boot no seu linux.

coLinux Daemon

coLinux Daemon

Mas tenha calma, ainda não temos nada,
o login inicial é root sem senha.
precisamos configurar nosso colinux inicialmente.

primeiro colocando uma senha para o root

# passwd

após isso, vamos configurar os discos que a gente configurou no example.conf para a fstab.

vamos deixar nossa fstab como esta:

# /etc/fstab: static file system information.
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    defaults        0       0
/dev/cobd0      /               ext3    noatime,errors=remount-ro 0       1
/dev/sda1       none            swap    sw              0       0
#/dev/hdc        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/sda3       /home           xfs             defaults 0 0
/dev/sda2       /mnt            reiserfs        defaults 0 0

note que eu especifiquei os sistemas de arquivos que eu uso, no caso reiserfs para / e xfs pra home, você provavelmente deve usar outros sistemas de arquivos, então não esquecer de especificar.

estou montando a minha home em /home e a minha root em /mnt, já que estamos usando a root do debian que baixamos mesmo.
note que é possível inclusive usar cdroms e afins, mas como não é nosso objetivo neste post, não será explicado aqui.

agora, vamos limpar a home antes de montar tudo:

rm -rf /home/*

Lembre-se de que você deverá fazer isso antes de montar seus discos, caso seja feito errado, você pode perder seus arquivos, óbvio, né?

agora que está tudo beleza, podemos montar tudo:

swapon /dev/sda1
mount -a

isso resolve o problema.
não se esqueça de adicionar um usuário neste debian com a mesma uid que você usa no seu linux.

adduser  caetano

Como eu uso ubuntu no meu linux e aqui estou usando debian e sei que é o primeiro usuário do sistema, tenho certeza que a uid será 1000 a mesma do meu usuário no linux, então não vou ter problemas com permissões.

feito tudo isto, vamos parar o nosso linux.

init 0

está quase tudo pronto com o nosso colinux, falta apenas rede.
em minha residencia e escritório, usamos modens roteadores para distribuir os ips da rede, por este motivo, achei interessante deixar o meu colinux com um ip físico na minha rede, assim eu posso acessá-lo de qualquer lugar, e eventualmente colocar um firewall ou proxy por ele, caso eu necessite.

para fazer isto, precisamos de 2 passos.
a) Configurar a eth0 do colinux para usar interface tuntap.

eth0=tuntap

b) Após isso, precisamos criar uma bridge de rede como na imagem abaixo:bridge

selecione as duas interfaces, a interface de rede do seu computador, e a interface virtual criada pelo colinux,
botão direito do mouse e clique em conexões de ponte, para fazer um bridge.

pronto, agora seu colinux acessa a rede local como se fosse um computador de verdade.

antes de mais nada, precisamos configurar a rede no colinux.
abra novamente o colinux e edite o arquivo /etc/network/interfaces
e edite o arquivo, adicionando o bloco:

auto eth0
iface inet eth0 dhcp

isto caso você queira sua interface com ip dado por dhcp, mas nada te impede de colocar um ip fixo, que em muitos casos é melhor para o que vamos fazer.

após isso, desligue novamente seu colinux.
vamos agora instalar o serviço de linux no seu computador para que o colinux inicie silenciosamente e como serviço quando o computador for ligado.

colinux-daemon --install-service linux @example.conf

agora é possível iniciar ou desligar o linux apenas com net start linux ou net stop linux.

mas ainda não é tudo, precisamos configurar o serviço para iniciar automaticamente.
vá ao menu iniciar/executar e digite: services.msc
localize o serviço linux e entre em suas propriedades

linux service

linux service

coloque tipo de inicialização automático, clique em iniciar e clique em aplicar.

prontinho, já temos o colinux rodando e com rede, agora precisamos instalar o ssh nele.
você deve ter notado que apareceu um atalho para o colinux em sua área de trabalho, eu prefiro acessá-lo com o putty.
mas como não temos ssh ainda, vai com ele mesmo.

acessado, instale o ssh

apt-get update
apt-get install openssh-server ssh

prontinho, já temos ssh funcionando no nosso linux.
podemos passar para o passo 2

Instalando o SpanDrive

O span drive é um software proprietário que monta uma unidade de sftp como se fosse uma unidade de rede.
pode ser baixado para demonstração em:
www.sftpdrive.com

após instalado, irá aparecer um ícone na sua tray de um inmã.
vamos configurá-lo agora:
botão direito do mouse sobre o ícone do inmã, Open Connect Window.

Configuração do spandrive

Configuração do spandrive


Estou usando o ip 10.1.1.222 para o meu colinux e configurei ele manualmente afim de evitar que ele mude toda vez que meu modem for reiniciado.
estou montando minha home em k: para efeitos ilustrativos.
após isto, bote reconecte on logon para sempre que você ligar seu windows esteja tudo certinho lá.
e fim, tudo feito.
veja uma screenshot do sistema em uso:
explorer

e isto é tudo, até o próximo post.

junho 15, 2009

Melhorando o suporte a webcam do aMSN

Filed under: TI — rockristao @ 17:23

Eu deveria ter publicado este post há uns 5 meses atrás, pois bem, antes tarde do que nunca.

Há 5 meses atrás comprei uma webcam pra brincar (e pretendo postar algumas de minhas experiencias com ela neste blog). Fiz questão de comprar uma webcam com suporte a UVC, UVC para quem não sabe é Usb Video Class, que é uma padronização para dispositivos de vídeo usb, bem como foi o VESA no século passado, com instruções básicas e padrões é possível controlar qualquer webcam UVC ou placa de captura com a menor dificuldade. Felizmente linux e windows já implementaram seu suporte em quase sua totalidade. Então para nós usuários não faz muita diferença, a não ser a de termos certeza que em qualquer buraco que plugarmos a cam, ela simplesmente vai funcionar, sem precisar baixar drivers, compilar, ou instalar. simplesmente funciona.
seja no windows, seja no linux ou seja em qualquer plataforma que suporte UVC.

meu primeiro teste foi o básico hello world pra câmeras:

$ gst-launch-0.10 v4l2src ! autovideosink

Isso deve exibir sua imagem no gstreamer, não entrarei em detalhes disso.
a minha primeira decepção foi que apesar da imagem estar completamente perfeita no gstreamer ou no cheese, ficava uma perfeita porcaria no amsn.
percebi que era pelo fato do aMSN só suportar 2 tipos de resolução de câmeras:
o SIF e o QSIF, e esta câmera minha — SPC530NC da philips — suporta resoluções até 1.3MP interpolados, enfim, para resolução vga (640×480) ficava perfeita.

A Resolução SIF é algo em torno de 320×240 e a QSIF são modestos 160×120 e a captura ficou uma verdadeira porcaria.

Para resolver este problema precisamos editar alguns arquivos do aMSN,
O primeiro foi editar o arquivo /usr/share/amsn/msncam.tcl
NA LINHA: 1902

				if { [::config::getKey lowrescam] == 1 } {
					set cam_res "QSIF"
				} else {
					set cam_res "SIF"
				}

deve ser trocado para

				if { [::config::getKey lowrescam] == 1 } {
					set cam_res "SIF"
				} else {
					set cam_res "VGA"
				}

O mesmo na linha: 2847.

Terminado este arquivo vamos ao próximo:

No arquivo assistant.tcl faremos um procedimento parecido
linha 1329:

			if { $lowrescam } {
				set cam_res "QSIF"
				set camwidth 160
				set camheight 120
			} else {
				set cam_res "SIF"
				set camwidth 320
				set camheight 240
			}

Deve ser trocado por:


			if { $lowrescam } {
				set cam_res "SIF"
				set camwidth 320
				set camheight 240
			} else {
				set cam_res "VGA"
				set camwidth 320
				set camheight 240
			}

O mesmo para a linha 1460.

“pronto, caetano, já editei os arquivos, fui testar a única coisa que aparece na cam do amsn é uma janela com o zoom muito alto, mas noto que a resolução melhorou muito.”

Calma, meu amigo, precisamos fazer mais umas modificações, ok?

Agora o arquivo a ser modificado é o “capture.c”.
O arquivo capture.c captura vga em 640×480 (nada mais natural, não é mesmo?)
precisamos fazer um stretching nisso para que a imagem seja redimensionada pra 320×240, que é a resolução que o msn suporta.

Na linha 787 do arquivo capture.c, que fica em utils/linux/capture/capture.c (no source do amsn),
Adicionamos isto:

  if (0) { //!strcmp(tmpRes,"VGA")){
    block.width = 320;
    block.height = 240;
  }

  Tk_PhotoSetSize( 
# if TK_MINOR_VERSION >= 5
    interp, 
# endif
    Photo, capItem->requested_format->width, capItem->requested_format->height);
  Tk_PhotoBlank(Photo);
  if (capItem->requested_format->width == 640){ //we've got vga, then we'll zoom the captured image to SIF
    //Tk_PhotoPutZoomedBlock(handle, blockPtr, x, y, width, height,zoomX, zoomY, subsampleX, subsampleY, compRule)
    
    Tk_PhotoPutZoomedBlock(
# if TK_MINOR_VERSION <= 5
    interp, 
# endif
       Photo, &block, 0, 0, capItem->requested_format->width, capItem->requested_format->height,1,1,2,2
# if TK_MINOR_VERSION >= 4
//Overlay is useless as our image hasn't any alpha channel
    , TK_PHOTO_COMPOSITE_SET 
# endif
      
    );
  }
  

Você deve estar notando que fizemos streching na imagem usando as próprias bibliotecas do TK, por que isso?

A resposta é muito simples, estava com preguiça de querer saber o formato do buffer da imagem, se ele tinha cabeçalho, como todos sabemos, tcl/tk é uma desgraça sem tamanho, enfim, já usei a função deles facilitou minha vida.

Após isso temos o resultado, veja:

configuração de webcam no amsn

configuração de webcam no amsn

Como podemos ver, a mudança realmente é notável.

Caso você esteja com preguiça de fazer tudo isso,
estou anexando os arquivos para você apenas colar no lugar certo.
boa sorte 🙂

Clique no link abaixo para baixá-los.

webcamsn.tar.gz

OBS:
Desde a nova versão do windows live a qual eu não me recordo o número, a microsoft fez mudanças bruscras, tanto no protocolo quanto no codec de camera.
deixando de usar o libmimic.
Portanto, é natural que talvez alguem veja apenas um borrão preto nas versões mais novas do msn, mas isso não é regra, é meio aleatório, sabe-se lá por que.

Um blog de tecnologia

Filed under: TI — rockristao @ 16:14
Tags:

Após vários meses (ou anos) relutando para não escrever sobre tecnologia, achei relevante publicar dois posts, e possivelmente vários outros sobre minhas experiencias no desenvolvimento de tecnologia, espero que seja útil a todos.
Por isso resolvi criar este blog, pois não ficaria legal publicar sobre tecnologia em meu blog cultural.

De qualquer forma o blog cultural continuará a ser mantido em http://rockristao.wordpress.com

até.