sábado, 1 de agosto de 2009

JAVA: Compactação de Arquivos

Para compactar um texto ou frase em formato .ZIP, usando tecnologia Java, é uma tarefa relativamente simples.

Primeiro, cria-se um objeto de escrita de bytes FileOutputStream, em seguida cria-se um ZipOutputStream passando o FileOutputStream como parâmentro. O ZipOutputStream é responsável por escrever os bytes de forma compactada.

Segue um exemplo de como compactar o conteúdo de uma variável String:


import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;

public class ZipFile {

public static void main(String[] args) {

String str = "Texto para ser compactado! teste.";

try {
// cria o arquivo zip
String outFilename = "/tmp/outfile.zip";
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(
outFilename));

out.putNextEntry(new ZipEntry("file.txt"));

// grava a string acima no arquivo zip
out.write(str.getBytes(), 0, str.getBytes().length);
out.closeEntry();

// fecha a stream e completa o arquivo
out.close();
} catch (IOException e) {
}

System.out.println("Complete");
}
}



O código de exemplo cria uma aquivo compactado /tmp/outfile.zip. Dentro do arquivo zip será criado um arquivo chamado file.txt com o texto contido na String str.


Para mais informações:
http://java.sun.com/developer/technicalArticles/Programming/compression/

sábado, 25 de julho de 2009

Descobrir a quais grupos pertenço

Na necessidade de descobrir a quais grupos do sistema seu usuário pertence, a forma mais simples é usando o comando groups.

O comando groups, lista todos os grupos (separados por espaço) aos quais o usuário corrente está associado:

groups

Resultado para o meu usuário:

eiti adm dialout cdrom plugdev users lpadmin admin sambashare uml-net

No caso se quiser saber também os ids dos grupos, basta utilizar o comando id:
id

Resultado:
uid=1000(eiti) gid=1000(eiti) grupos=4(adm),20(dialout),24(cdrom),46(plugdev),100(users),108(lpadmin),123(admin),124(sambashare),127(uml-net),1000(eiti)

Boa sorte.

sexta-feira, 17 de julho de 2009

Instalação de Fontes Latex no Ubuntu

Instalação de Fontes Latex no Ubuntu

(La)TeX usa Computer Modern com serifa engrossada, como fonte padrão para corpo do texto (e equações). O TeX foi desenvolvido especialmente para documentos científicos e portanto, foi adotado a fonte Modern que oferece um clima de seriedade devido a sua aparência elegânte e frio.

Veja um exemplo de texto com a fonte Computer Modern:
http://www.dm.ufscar.br/~sadao/latex/doc-and-fonts/fontscm_pt.pdf

Vamos aos passos para instalação das fontes no Linux. Após a instalação será possível utilizar as fontes em documentos do OpenOffice, por exemplo.
As instruções a seguir foram executadas com sucesso na distribuição Ubuntu versão 8.10.

Primeiro, deve-se efetuar o download do arquivo com as fontes. O arquivo pode ser baixado do seguinte endereço:
http://canopus.iacp.dvo.ru/~panov/cm-unicode/download.html

Baixa o arquivo pfb fonts (cm-unicode-VERSION-pfb.tar.gz). Descompacte o arquivo em um diretório temporário, por exemplo /tmp:

cd /tmp
tar xzvf cm_unicode-VERSION-pfb.tar.gz
cd cm-unicode-VERSION

O diretório de fontes do X11, crie um novo diretório chamado cm-unicode para as fontes. No meu caso criei em: /etc/X11/fonts/

sudo mkdir -p /etc/X11/fonts/cm-unicode

Como super usuário, copie os arquivos das fontes:

sudo cp *.afm /etc/X11/fonts/cm-unicode
sudo cp *.pfb /etc/X11/fonts/cm-unicode

Para ativar as fontes execute os comandos:

sudo mkfontscale
sudo mkfontdir

No arquivo /etc/fonts/fonts.conf, adicione uma nova entrada para o diretório de fontes:

/etc/X11/fonts/cm-unicode

Atualize o cache de fontes:

sudo fc-cache

Pronto, agora basta reiniciar o ambiente gráfico (X), para que a lista de fontes Computer Modern Unicode (CMU) esteja disponível para utilização.



Exemplo de utilização da fonte do Writer do BrOffice 3.











Referências:

http://canopus.iacp.dvo.ru/~panov/cm-unicode/install.html
http://canopus.iacp.dvo.ru/~panov/cm-unicode/download.html

segunda-feira, 6 de julho de 2009

Guia: Comandos básicos do linux

Visando montar um guia de comandos básicos do linux, montei essa pequena listagem com alguns comandos que julguei serem essenciais nos primeiros contatos com máquinas linux. Todos os comandos podem ser executados no console do sistema (shell).
Com esses comandos o usuário será capaz de:

- se localizar no sistema
- se locomover pelas pastas do sistema
- apagar, copiar e remover arquivos e diretórios
- trocar de usuário
- executar comandos como super usuário
- listar os arquivos de um diretório
- mudar as permissões de arquivos
- exibir o conteúdo dos arquivos no console
- ver os processos do sistemas e também finalizá-los
- consulta o manual de um comando

Vamos a listagem:

Para logar como super usuário:

su -



Para executar um comando com permissão de super usuário:

sudo command



Se ao logar em uma máquina linux, bater a dúvida: Onde estou? O comando abaixo mostra o diretório corrente:

pwd



Listagem dos arquivos de uma diretório em forma de lista:

ls -lah



Mudar para outro diretório:

cd /another/directory



Copiar um arquivo de um diretório para outro:

cp /some/directory/somefile.txt /another/directory



Copia um diretório e todos os seus arquivos e subdiretórios recursivamente

cp -R pasta_orig pasta_destino



Sai do diretório corrente indo para o diretório pai:

cd ..



Mover um arquivo de um diretório para outro:

mv /some/directory/somefile.txt /another/directory



Para renomear um arquivo, mova-o:

mv oldname.txt newname.txt



Apagar um arquivo:

rm filename.txt



Apagar um diretório e seus arquivos recursivamente

rm -r dirname (use com extrema cautela!)



Criar um diretório:

mkdir dirname



Mudar as permissões de um arquivo ou diretorio para possa ser modificado por qualquer usuário

chmod ugo+rwx file_or_directory



ugo+rwx significa, para (usuário, grupo, outros), + mais permissões (read, write, execute). Use o sinal de menos - ou invés do sinal de + para remover permissões. ugo e rwx pode ser usado em qualquer ordem, ex.: go-w.

Para ver o conteúdo de um arquivo:

more filename.txt



Tecle espaço para rolar para a próxima páquia e q para sair.
Com o less é possível é possível adiantar e voltar a exibição de uma parte do arquivo:

less filename.txt



Mostra as ultimas linhas de um arquivo texto:

tail -n number_of_lines filename.txt

ex:

tail -n 100 filename.txt



Mostra as primeiras linhas de um arquivo:

head -n number_of_lines filename.txt



Lista os processos rodando no sistema:

ps -ef



Lista os processos do java rodando no sistema:

ps -ef | grep java



Finaliza um processo do sistema, o Process ID (pid), deve ser informado para essa operação e pode ser obtido por meio do comando ps:


kill -9 pid



Descompacta arquivos .zip

unzip filename.zip



Descompacta arquivos .rar

unrar filename.rar



Descompacta arquivos.tar.gz

tar xvfz arquivo.tar.gz



Compacta um arquivo ou um diretório

tar cvfz arquivo.tar.gz diretorio/arquivo



Cancela um processo/operação
ctrl+C

Coloca um processo em execução em background:
ctrl+Z
bg

Executa um arquivo binário/script

./script.h



Acessar uma outra máquina linux via SSH:

ssh myuser@myserverip.com

ex.:
ssh kimura@200.189.1.2



Acessar uma url no console via browser:

links http://www.site.com



Finalmente, qualquer dúvida sobre um comando, consulte o manual :)


man command



Boa sorte!
Seja livre! Use Linux!


quinta-feira, 25 de junho de 2009

Visita de Richard Stallman na UNICAMP

Na última segunda-feira dia 22/06/2009, tivemos a visita do irreverente bandeirante do software livre em Campinas-SP, o Richard Stallman.

Ele fez uma palestra falando sobre a filosofia do software livre, motivos e justificativas para seguir tal filosofia e implicações legais e morais da utilização de software proprietário.

Em 1983 ele deslanchou o movimento do software livre no mundo, com a criação da Free Software Foundation. Hoje, Richard Stallman pede: “Por favor, não chame o GNU de Linux”.

A filosofia do software livre defendida por Stallman, se refere basicamente a 4 liberdades:

  • 0 : liberdade de executar o programa para qualquer propósito
  • 1 : liberdade de estudar como o programa funciona e adaptá-lo para suas necessidades.
    O acesso ao código fonte é essencial para isso.
  • 2 : liberdade de distribuir cópias do programa livremente
  • 3 : liberdade de melhorar o programa e distrubuir essas melhoras/correções para o público, de forma a contribuir com a comunidade
Segue o link para baixar o cartaz de divulgação da palestra:
http://www.ic.unicamp.br/~islene/mc039/cartaz.pdf

E por fim, minha foto com o Guru do software livre e seu mascote GNU:

Agradecimentos ao Clausius Reis pela foto. :)

Para mais informações acesse:

http://www.gnu.org/
http://stallman.org/
http://www.fsf.org/

sábado, 20 de junho de 2009

Thunderbird: Arquivo de assinatura com imagem

Ultimamente precisei adaptar minha assinatura de e-mail com uma imagem, e notei que para fazer isso no mozilla thunderbird faz-se necessário criar um arquivo no formato HTML com o design de sua assinatura.

Então, mãos à obra:



<table width="100%" border=0>
<tr>
<td nowrap="nowrap">
<div style="font-family:Tahoma, Verdana, Arial; font-size:8.5pt; color:#78af28; font-weight:bold;">Eiti Kimura</div>
<div style="font-family:Tahoma, Verdana, Arial; font-size:8.5pt; color:#497e94;">tecnologia<br />
<a href="mailto:eiti@company.com" target="_blank" style="color: #497e94">eiti@company.com</a>
</div>
</td>
</tr>
<tr>
<td nowrap="nowrap"><img src="http://www.company.com/meulogotipo.gif" border="0"></td>
</tr>
</table>



O código de exemplo da listagem acima, monta uma assinatura simples com um nome, departamento, link para e-mail e um pequeno logo.

Para adicionar essa assinatura como padrão para sua conta, salve esse código com nome de assinatura.html, vá até o menu editar->configurar contas do thunderbird. Na janela que se abre, selecione sua conta e marque a caixa de seleção: inserir arquivo como assinatura, clique no botão arquivo e abra o arquivo html conforme codificado a cima.

Ao iniciar a composição de um novo e-mail, note sua assinatura no final da página, no entanto repare que a imagem do logo não aparece na página. Isso se deve proque no exemplo a imagem está hospedada em um servidor externo. Ao enviar um e-mail com essa configuração, o thunderbird exibe uma mensagem: anexando meulogo.gif, o que indica que ao enviar a mensagem o programa anexa a imagem do site que você indicou na sua assinatura.

Uma desvantagem desse modelo, é que você sempre precisará ter as imagens utilizadas em sua assinatura hospedadas em um site da web. Esse modelo é o mais difundido quando se trata de assinaturas de e-mail para o thunderbird, contudo nem sempre é o mais usual. Outros clientes de e-mail dão a possibilidade de anexar à assinatura imagens do disco local do seu computador, com o thunderbird não é diferente, também é possível fazer isso, o que muda é a codificação de sua assinatura.

Modifique o código html da assinatura acima para que fique da seguinte forma:



<table width="100%" border=0>
<tr>
<td nowrap="nowrap">
<div style="font-family:Tahoma, Verdana, Arial; font-size:8.5pt; color:#78af28; font-weight:bold;">Eiti Kimura</div>
<div style="font-family:Tahoma, Verdana, Arial; font-size:8.5pt; color:#497e94;">tecnologia<br />
<a href="mailto:eiti@company.com" target="_blank" style="color: #497e94">eiti@company.com</a>
</div>
</td>
</tr>
<tr>
<td nowrap="nowrap"><img src="file:///home/eiti/Imagens/assinatura/meulogo.gif" border="0"></td>
</tr>
</table>



A única tag html modificada é a img que agora aponta para um arquivo local no meu computador. Basta usar a diretiva file:/// mais o caminho da imagem local no seu computador. Percebe que agora ao iniciar a composição do seu e-mail sua assinatura aparece completa, com a imagem do logo inclusive.

Espero que seja útil a outros que como eu tiveram dificuldade de inserção de imagens na assinatura do thunderbird.

sexta-feira, 12 de junho de 2009

Editor de Textos Geany

Um excelente editor de textos para sistemas proprietários é o Edit Plus. Depois de migrar para o LINUX, sentia falta de um editor de textos equivalente ao Edit Plus, que fosse leve e permitisse editar e principalmente atualizar os arquivos em tempo real (para acompanhar arquivos de log).

Encontrei um excelente editor de textos, leve com recursos avançados, equivalente ao Edit Plus com recursos formidáveis, muito bom.
Esse tópico tenho o prazer de apresentar o editor Geany, que passou a sanar a necessidade de um editor robusto para LINUX.

Utilizando o Ubuntu 8.10, é possível instalar o Geany com uma linha de comando no shell:

sudo apt-get install geany

Entretanto, a versão do software nos repositórios do Ubuntu é a 0.14, enquanto que a versão mais recente do programa é a 0.16.
Para instalar a versão 0.16, tive que instalar também alguns pacotes adicionais de desenvolvimento para o sistema, uma vez que o programa será compilado para a distribuição.

Para compilar a versão mais nova, é necessário instalar o pacotes:

aptitude install gnome-core-devel build-essential

Logo depois da instalação, baixe a versão mais nova do código-fonte do site do Geany: http://www.geany.org/Download/Releases#source

O link para baixar o fonte diretamente do sourceforge é:
http://prdownloads.sourceforge.net/geany/geany-0.16.tar.gz?download

Descompacte o código fonte, entre no diretório:

tar xvfz geany-0.16.tar.gz
cd geany-0.16

O próximo passo é compilar e instalar o sistema:

sudo ./configure
sudo make
sudo make install

Se o programa tiver sido instalado com sucesso, um ícone será criado no menu Aplicativos->Desenvolvimento->Geany, ou simplemente chame o aplicativo a partir do shell:

geany

Veja uma tela do programa:


O Geany, mostrou-se bastante eficiente quanto ferramenta de desenvolvimento, edição simples de texto, códigos-fonte, scripts e etc. Tem vantagem de ser livre de licença e de fácil instalação.

Enjoy! ;)

terça-feira, 2 de junho de 2009

Acesso ao MS-SQLServer via Shell

Para acessar o SQLServer no Linux via shell, pode-se utilizar a biblioteca FreeTDS. Este acesso é útil para aqueles que trabalham em um ambiente misto com servidores Linux e Windows.

O primeiro passo é verificar os pré-requisitos para a compilação da ferramenta:
- GCC
- MAKE

O código fonte pode ser obtido diretamente do site do projeto FreeTDS, cujo endereço é www.freetds.org. No entanto, nesse exemplo o código fonte será baixado a partir de um mirror.

Para efetuar o download do código fonte, execute:

wget http://ibiblio.org/pub/Linux/ALPHA/freetds/stable/freetds-stable.tgz

Em seguida, deve-se descompactar o arquivo com os fontes:

tar xvfz freetds-stable.tgz
Ao descompactar, será criado o diretório freetds-0.82, próximo passo será compilar o código fonte e instalar a ferramenta:
cd freetds-0.82
/configure --with-tdsver=8.0
make
sudo make install

Com a ferramenta instalada, o acesso as bases do SQLServer é feita de forma simples. Digite no shell de acordo com o exemplo:

tsql -S -U -P

tsq -S 192.168.1.1 -U opendevnotes -P @34cwcd12

Para executar uma instrução, você digita a consulta e em seguida o comando go.

A Figura abaixo mostra um exemplo de conexão da FreeTDS com um SQL Server 2005 (endereço 192.168.1.32) e com um SQL Server 2000 (endereço 192.168.1.8). O comando SELECT @@version é executado para mostrar a versão dos dois SQL Servers utilizados.


Dessa forma é possível acessar os bancos de dados via shell no linux.


Todo post foi baseado em:
http://imasters.uol.com.br/artigo/10196/sql_server/acessando_o_sql_server_no_linux/

segunda-feira, 25 de maio de 2009

Gerenciamento de pacotes com apt-get

O apt-get é um utilitário de gerenciamento de pacotes via linha de comandos.

Para instalar um novo pacote em sua distribuição, digite no console:

sudo apt-get install seu_pacote

Para instalar o utilitário tcpdump, por exemplo:

#apt-get install tcpdump

Os pacotes serão automaticamente baixados e instalados no computador.

Entretanto faz-se necessário muitas vezes, saber se um pacote está instalado no sistema, qual a versão dele e até mesmo qual a versão do determinado pacote, para essas tarefas podemos utilizar o apt-cache.

O apt-cache faz uma série de operações no cache de pacotes do APT, dentre elas a procura de um pacote, encontrando sua versão e até mesmo suas dependências.

Para encontrar as dependências do pacote tcpdump, por exemplo, digite no console:

#apt-cache depends tcpdump

Resultado com todas as dependências do pacote:

tcpdump
Depende: libc6
Depende: libpcap0.8
Depende: libssl0.9.8

Para saber qual a versão de determinado pacote, por exemplo, digite no console:

#apt-cache policy tcpdump

Resultado com a versão do tcpdump instalada no sistema:

tcpdump:
Instalado: 3.9.8-2
Candidato: 3.9.8-2
Tabela de versão:
*** 3.9.8-2 0
500 http://br.archive.ubuntu.com hardy/main Packages
100 /var/lib/dpkg/status


Essas ferramentas são muito úteis quando se deseja gerenciar os pacotes instalados no computador pela linha de comandos.

quarta-feira, 13 de maio de 2009

Busca de Arquivos

Para buscar determinados arquivos no linux, via linha de comandos, pode-se utilizar a seguinte sintaxe:

find /mnt -type f -name *.xml -print0 | xargs -0 ls -sh

Essa linha busca todos os arquivos XML dentro da pasta /mnt, imprimindo o tamanho do arquivo encontrado também. Muito útil.

Fonte:
http://ubuntuforums.org/showthread.php?p=6671212

quinta-feira, 7 de maio de 2009

Artigo: Como escrever um vírus em linux em 5 passos

Esse artigo é muito interessante, fala sobre a vulnerabilidade de sistemas linux que utilizam os gerenciadores de gráficos KDE e GNOME.

O autor mostra que nem sempre um usuário linux está protegido de ameaças, e como é possível criar facilmente um vírus.

As dicas de segurança e a conscientização de que o linux não é absoluto, e você não está 100% livre de virus, é um dos pontos fortes desse artigo.

Recomento a leitura(em inglês):
http://www.geekzone.co.nz/foobar/6229

sábado, 25 de abril de 2009

Instalar o Skype no Ubuntu 8.04

Se as configurações do driver da placa de som do seu computado estiverem corretas, a instalação do Skype será simples.

Para instalar o Skype no Ubuntu Hardy Heron (versão 8.04), basta executar no console:

sudo apt-get install skype

Após a instalação, um ícone de acesso ao Skype é criado no menu Applicações->Internet. Basta clicar no atalho do Skype para executá-lo.

Para ajustar as configurações de som do seu sistema, no nosso caso do microfone para o Skype, instale o gerenciador gráfico executando o comando:

sudo apt-get install alsa-firmware

Abra o controle de volume e vá no menu Arquivo->Mudar dispositivo, tenha certeza de que o dispositivo ALSA Mixer está selecionado.

Em seguina clique no menu Editar->Preferências, e selecione os dispositivos: microphone, mic boost, internal mic -- ou qualquer outro dispositivo do seu interesse.

Basta agora modificar o volume do microfone e verificar se o mesmo não se encontra em mudo ou etc.

Fonte:

http://divyad.wordpress.com/2008/05/01/install-skype-on-ubuntu-804-hardy-heron-configure-sound/

quarta-feira, 15 de abril de 2009

JAVA: Parse de arquivo XML com DOM

Esse post mostra como efetuar a leitura e o parse de um arquivo tipo XML usando JAVA e a API DOM.

É muito comum a troca de arquivos XML na web, entre aplicações ou mesmo simples feeds via RSS.
O JAVA possui uma API chamada DOM (Document Object Model), com as classes providas por essa API é possível efetuar a leitura de um arquivo XML, extrair informações para objetos.

Abaixo segue um exemplo básico de arquivo XML utilizado para ilustrar o exemplo:

data.xml




8
Eiti Kimura
Development Team
eiti@mycompany.com


9
José da Silva
Human Resources
jose@mycompany.com


10
Karoline Taylor
Tecnology Team
karoline@mycompany.com




A idéia principal seria, extrair dos dados dos empregados (employee) desse arquivo, e retornar uma lista de objetos empregado. Esses objetos podem ser manipulados de inúmeras maneiras, entretanto no nosso exemplo, iremos apenas imprimir os objetos no console para verificar a extração dos dados.

O arquivo XmlDomParser.java mostra como fazer a leitura do arquivo, o parser e a extração dos dados em forma de uma lista de objetos:

XmlDomParser.java

package com.opendevnotes.xml.dom;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.StringReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;

/**
* @author J.P. Eiti Kimura
* @author Thiago Medeiros dos Santos
*/
public class XmlDomParser {

private String xml;

public static void main(String[] args) {

XmlDomParser parser = new XmlDomParser();

// obtem o path do arquivo
URL url = XmlDomParser.class.getResource("data.xml");

// faz a leitura do arquivo e armazena em uma string
File file = new File(url.getPath());
parser.readFile(file);

// faz o parser do arquivo retornando uma lista de employees
List empList = parser.unmarshallEmployees();

// escreve a lista no console
for (Employee emp : empList)
System.out.println(emp);
}

/**
* Lê o arquivo do disco
* @param file
* @return retorna um objeto String com o texto do arquivo lido
*/
public String readFile(File file) {
try {

BufferedReader inp = new BufferedReader(new FileReader(file));

String line;
StringBuilder sb = new StringBuilder();

while ((line = inp.readLine()) != null) {
sb.append(line).append("\n");
}

this.xml = sb.toString();
return sb.toString();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

return null;
}

/**
* Efetua o parser da String xml
* @return Document
*/
public Document parse() {
try {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = null;

try {

builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException ex) {
ex.printStackTrace();
}

Document doc = builder.parse(new InputSource(new StringReader(this.xml)));
return doc;
} catch (Exception e) {
e.printStackTrace();
}

return null;
}

/**
* Retorna uma listade objetos Employee
* @return
*/
public List unmarshallEmployees() {

List employeeList = new ArrayList();
Document doc = this.parse();

try {
// obtem o primeiro nó filho, o nó raiz
Node root = doc.getFirstChild();

// obtem todos os filhos desse nó
NodeList rootChildren = root.getChildNodes();

// para cada faz a leitura das propriedades
for (int count = 0; count < node =" rootChildren.item(count);" emp =" new">
NodeList rootChildren = root.getChildNodes();
for (int count = 0; count < node =" rootChildren.item(count);">


Para testar os exemplos acima, os dois arquivos (java e xml), devem estar no mesmo pacote, esse exemplo o pacote criado foi: com.opendevnotes.xml.dom.

Dessa forma, pode-se utilizar o Java DOM para ler/parsear arquivos XML preenchendo objetos de interesse. No entanto, o DOM pode ter desempenho ruim com arquivos XML com volume de dados muito grande. Para aplicações de pequeno e médio porte essa solução é amplamente utilizada.

Agradecimentos ao meu amigo Thiago Medeiros dos Santos pela ajuda com o parser XML desse exemplo.

Referências:
http://www.roseindia.net/xml/dom/
http://java.sun.com/j2se/1.4.2/docs/api/org/w3c/dom/package-summary.html

domingo, 5 de abril de 2009

Guia de referência gratuito do Ubuntu Linux

O guia de referência de bolso do Ubuntu Linux está disponível em PDF, totalmente gratuito, idêntico ao formato impresso.

Palavras do autor Keir Thomas:
"Menos de 48 horas que o livro estava on-line no site, foi baixado mais de 100.000 vezes. Facilmente se tornou o livro mais lido sobre Ubuntu e provavelmente, o livro mais lido de Linux de todos os tempos. Tenho o prazer de dizer que o livro está no topo da lista de livros sobre Linux da Amazon.com".

A cópia em PDF do livro pode ser baixada no site:

http://www.ubuntupocketguide.com/index2.html



ref.: revista fullcircle magazine ed. 21.

Abraços,

sexta-feira, 27 de março de 2009

Ajuste de Data/Hora do Java no RedHat Linux

Executando um sistema Java Web no sistema RedHat Enterprise 3, percebi que a hora atual que o Java me retornava era em torno de 5 horas atrasada com relação ao horário do sistema, ou seja, o horário do comando date. Tudo leva a crer que o sistema não está configurado para ler um locale que usa como separador o caractere _ (underscore).

Uma forma de contornar o problema é criar um link simbólico da localidade, no meu caso de America/Sao_Paulo, para America/Sao Paulo, e em seguida setar como a localidade padrão do sistema e reiniciar o relógio. Abaixo um exemplo de programa em java simples para exibir a data/hora atual do sistema, para testar as modificações:


public class TesteHorario {

/**
* @param args
*/
public static void main(String[] args) {
System.out.println(new Date());
}
}



Para criar um link simbólico para a localidade e setar como padrão do sistema, basta executar:


ln -s /usr/share/zoneinfo/America/Sao_Paulo /usr/share/zoneinfo/America/Sao\ Paulo
ln -sf /usr/share/zoneinfo/America/Sao\ Paulo /etc/localtime


Ou então no caso de existir uma variável de ambiente setada:


ln -s $JRE_HOME/lib/zi/America/Sao_Paulo $JRE_HOME/lib/zi/America/Sao\ Paulo
ln -sf $JRE_HOME/lib/zi/America/Sao\ Paulo /etc/localtime


Para atualizar a data e hora do sistema após a modificação (se necessário):
Exemplo: modificar a data atual para 31 de julho, 11:16, basta digitar no console (perceba que a hora é informada no formato de 24h)


date 07312316


Para atualizar o hardware clock com a data/hora obtidas com o comando date, basta executar:


/sbin/hwclock --systohc


Essas alterações foram suficientes para que o JAVA passasse a exibir a mesma data/hora do sistema operacional (RedHat Enterprise 3)

quarta-feira, 18 de março de 2009

Transferência de arquivos remotos com SCP

Quando se trabalha com linux, geralmente utiliza-se o prompt de comandos (shell).
Uma forma fácil de transferir arquivos entre máquinas remotas, no shell do linux, é utilizando o comando scp.

O scp (secure copy - remote file copy program) copia arquivos entre máquina em uma rede. Utiliza o ssh para transferência de dados, e utiliza a mesmo sistema de segurança utilizado pelo ssh. Esse comando requisita o nome do usuário e senha na máquina remota.

Exemplos de utilização:

Transferência de um arquivo local para uma máquina remota e vice-versa:


scp arquivo_local.txt seu_login@host_remoto:/diretorio/arquivo_remoto.txt

scp seu_login@host_remoto:/diretorio/arquivo_remoto.txt arquivo_local.txt


Esse utilitário é muito útil para transferir arquivos remotamente de forma segura.

terça-feira, 10 de março de 2009

Java: Ler Arquivo Texto

Essa dica é bastante trivial, porém é um código que sempre necessito consultar diversas vezes.
Resolvi publicar aqui no blog, quem sabe facilita para mais alguém.

A dica é simplesmente ler um arquivo de texto linha-a-linha.
Vamos ao código:



try {
BufferedReader in = new BufferedReader(new FileReader("infilename"));
String str;
while ((str = in.readLine()) != null) {
process(str);
}
in.close();
} catch (IOException e) {
}


Esse trecho de código, lê uma linha do arquivo por vez, foi retirado originalmente do The Java Developers Almanac 1.4. Essa é a forma mais simples que encontrei para ler arquivos de texto puro.

No meu caso, o arquivo de texto é composto por valores separados por vírgula, onde, o primeiro campo se refere ao número de identificação do usuário e o segundo seu nome. Por exemplo:

112344316, José da Silva
098987626, Marcia de Mello
981122154, Fabiane de Andrade



/**
* Carrega lista de telefones válidos para processamento
*/
private void loadTextFile()
{
String filePath = "/tmp/usersList.txt";

try {

BufferedReader in = new BufferedReader(new FileReader(filePath));
String str;
while ((str = in.readLine()) != null) {
String data[] = str.split(",");
System.out.println("Nome: " + data[1] + " CPF.:" + data[0]);
}

in.close();
} catch (Exception e) {
e.printStackTrace();
System.out.println("Erro ao ler arquivo de texto " + e.toString());
}
}



Esse código simples mostrou como ler e processar um arquivo de texto linha por linha.

domingo, 8 de março de 2009

vmstat: Relatório virtual e estatística do computador

O vmstat é um utilitário interessante quando se necessita saber informações sobre o consumo dos recursos do computador.

O vmstat relata informações sobre processos, memória, paginação, bloqueios de IO e atividade da CPU. O primeiro relatório produzido informa uma média desde a ultima vez que o computador foi reiniciado.

Abra um prompt de comando e digite vmstat, o utilitário será executando exibindo um relatório similar a esse:
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 0 518208 579328 878984 0 0 59 51 50 931 4 1 94 1

Significado dos parâmetros:

r - número de processos executáveis (runnable process)
b - número de processos bloqueados
in - número de interrupções geradas
cs - número de mudanças de contexto
us - tempo gasto pela CPU enquanto executava um código de usuário
sy - tempo gasto pela CPU enquanto executava um código do kernel
id - duração do tempo em que a CPU estava em estava idle
wa - tempo em que a CPU estava esperando por I/O

Com esse utilitário é possível de forma simples monitorar o consumo de memória, processamento entre outros parâmetros do computador.

Referências:
http://ibgwww.colorado.edu/~lessem/psyc5112/usail/man/linux/vmstat.8.html

sábado, 28 de fevereiro de 2009

Programa livre para teste de servidores Web

Na busca de uma ferramenta para testar uma aplicação que rodava em um servidor web, além do tradicional Jmeter, encontrei um utilitário da apache para linux chamado ab.

O ab (Apache HTTP server benchmarking tool), é uma ferramenta para benchmarking de servidores web da apache (HTTP). Com essa ferramenta possibilita medir o desempenho de sua versão atual do servidor, mostra especialmente quantas requisições por segundo o servidor é capaz de responder.

Para instalar o ab, utilize a seguinte linha de comando:


sudo apt-get install apache2-utils



Um exemplo de utilização:


sudo ab -n 1000 -c 10 -X 192.168.1.114:3128 -e result.csv http://localhost:8080/minhaAplicacao/index.jsp



Segue abaixo a descrição dos parâmetros utilizados no teste:

Parâmetros utilizados:

-n : número de requisições do teste
-c : concorrência, representa o número de usuários simultâneos por requisição
-X : endereço IP do servidor proxy (só utilize esse opção se usar um proxy)
-e : escreve um arquivo .CSV (valores separados por vírgula) contendo a cada porcentagem (1%-100%) o tempo gasto pelo servidor para responder as requisições


Resultado da execução do teste:



This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking localhost [through 192.168.1.114:3128] (be patient)
Completed 100 requests
Completed 200 requests
...
Completed 900 requests
Finished 1000 requests


Server Software: squid/2.6.STABLE16
Server Hostname: localhost
Server Port: 8080

Document Path: /minhaAplicacao/index.jsp
Document Length: 1087 bytes

Concurrency Level: 10
Time taken for tests: 10.509680 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Non-2xx responses: 1000
Total transferred: 1503000 bytes
HTML transferred: 1087000 bytes
Requests per second: 95.15 [#/sec] (mean)
Time per request: 105.097 [ms] (mean)
Time per request: 10.510 [ms] (mean, across all concurrent requests)
Transfer rate: 139.59 [Kbytes/sec] received

Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 1
Processing: 101 103 1.6 104 110
Waiting: 101 103 1.4 104 109
Total: 101 103 1.7 104 110

Percentage of the requests served within a certain time (ms)
50% 104
66% 105
75% 105
80% 105
90% 105
95% 106
98% 106
99% 106
100% 110 (longest request)



Nesse teste, fiz 1000 requisições com 10 usuários acessando a página simultaneamente por requisição, obtive um tempo médio por requisição de 105ms e verifiquei também que meu servidor (Tomcat 5.5) conseguiu responder em média 95.15 requisições/segundo.

Essa ferramenta é simples de ser utilizada, pode ser usada para medir desempenho de servidores HTTP.

Referência:
http://httpd.apache.org/docs/2.0/programs/ab.html

domingo, 15 de fevereiro de 2009

JAVA: Converter Imagem para Escala de Cinza

Um exemplo básico de processamento de imagens em JAVA é a conversão de uma imagem colorida para escala de cinza.

Esse exemplo (MainClass) mostra como efetuar a leitura dos pixels de uma imagem, converter seus valores para RGBA (red, green, blue, alpha), modificar os pixels e gravar uma nova imagem.




import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class MainClass {

// converte pixels da imagem para tons de cinza
public static int[] imageToGray(int image[]) {
int grayimage[] = new int[image.length];

for (int i = 0; i < image.length; i++) {
// extrai a informação RGBA do valor inteiro
int alpha = (image[i] >> 24) & 0xff;
int red = (image[i] >> 16) & 0xff;
int green = (image[i] >> 8) & 0xff;
int blue = (image[i]) & 0xff;

// média dos valores RGB para tranformar para
// escala de cinza
int mean = (red + green + blue) / 3;

// converte a informação de rgb para inteiro
int gray = ((0 << 24) & 0xFF000000) | ((mean << 16) & 0x00FF0000) | ((mean << 8) & 0x0000FF00) | (mean & 0x000000FF);

// seta o pixel modificado na imagem
grayimage[i] = gray;
}

return grayimage;
}

public static void main(String[] args) throws IOException {

File inputFile = new File("/tmp/tux-ubuntu.jpg");
BufferedImage buffImage = ImageIO.read(inputFile);

int w = buffImage.getWidth();
int h = buffImage.getHeight();

int rgba[] = new int[w * h];
// obtem pixels do bufferedImage
buffImage.getRGB(0, 0, w, h, rgba, 0, w);

// converte para tons de cinza
int gray[] = imageToGray(rgba);
// escreve no bufferedImage
buffImage.setRGB(0, 0, w, h, gray, 0, w);

// escreve nova imagem no disco
ImageIO.write(buffImage, "JPG", new File("/tmp/tux-gray.jpg"));
}
}




O exemplo de utilização da classe:

terça-feira, 3 de fevereiro de 2009

JAVA: Varargs

Uma característica muito legal das linguagens orientadas à objetos, em especial do JAVA é o overloading de métodos, onde um mesmo método pode ser invocado usando assinaturas diferentes. Por exemplo, um método com o mesmo nome, mas com uma variável quantidade de argumentos aceitáveis.
Um exemplo poderia ser:



Calc c = new Calc();

c.calcula(10, 35, 34);

c.calcula(3.4, 12);

c.calcula("Triângulo", 56, 23, 21);



No exemplo acima, foi instanciada uma classe chamada Calc, que efetua algum tipo de cálculo qualquer. O objeto c possui um método chamado calcula(), que pode ser chamado de três formas diferentes, onde o nome do método não muda, somente seus argumentos.

O Varargs (Variable Arguments), permite especificar que o método terá múltiplos argumentos do mesmo tipo, sem que haja necessidade de pre-determinar o número exato de argumentos(em tempo de compilação e/ou execução).

Para utilizar o varargs, fazemos uso da elipse (...), onde os três pontos são a chave (keyword) pra varargs. Vejamos e exemplo da classe VargsExample, esta por sua vez é composta de métodos que calculam a média de valores passados com o argumentos. Temos mean(float num1, float num2), que calcula a média de 2 argumentos, um overload do método anterior: mean(float num1, float num2, float num3, float num4); que calcula a média entre quatro argumentos, e por ultimo, temos a utilização de varargs: mean(float... numbers), que permite o cálculo da média para um número indefinido de argumentos, incluindo a passagem de parâmetro como um array primitivo do tipo float.



public class VargsExample {

// método que calcula a média
public float mean(float num1, float num2) {
return (num1 + num2) / 2.0f;
}

// overloading do método que calcula a média
public float mean(float num1, float num2, float num3, float num4) {
return (num1 + num2 + num3 + num4) / 4.0f;
}

// calculo da média usando varargs
public float mean(float... numbers) {
float sum = 0;

for (float n : numbers)
sum += n;

return sum / (float) numbers.length;
}

public static void main(String[] args) {

VargsExample calc = new VargsExample();
// Exemplos de chamadas de métodos

// método de calculo de média
calc.mean(10, 23);

// overloading
calc.mean(10, 20, 30, 40);

// usando varargs que recebe número indeterminado de argumentos
calc.mean(12);
calc.mean(new float[] {12, 45, 78, 34, 21, 34, 54, 8, 9, 12, 87});
calc.mean(0, 2, 1);
calc.mean(9, 5, 7, 10, 4);
}
}




O exemplo apresentado, mostra a flexibilidade que se consegue com o emprego de varargs em determinados métodos. Esse recurso foi introduzido na versão Tiger do JAVA: 1.5.

domingo, 25 de janeiro de 2009

Adicionar Servidor Tomcat 5.5 como serviço no Ubuntu

Esse post mostra como colocar o servidor web Tomcat 5.5 como serviço no sistema ubuntu linux.
Para isso basta:

Criar o script de inicialização em /etc/init.d/ arquivo: tomcat

# description: Auto-starts tomcat
# processname: tomcat
# pidfile: /var/run/tomcat.pid

case $1 in
start)
sh /opt/tomcat/bin/startup.sh
;;
stop)
sh /opt/tomcat/bin/shutdown.sh
;;
restart)
sh /opt/tomcat/bin/shutdown.sh
sh /opt/tomcat/bin/startup.sh
;;
esac

exit 0


Em seguida deve-se dar permissão de execução ao arquivo

sudo chmod 755 /etc/init.d/tomcat


O próximo passo é instalar o tomcat como um serviço sistema, o utilitário
update-rc.d é utilizado com esse fim da seguinte forma:

update-rc.d tomcat defaults


Resultado da execução e criação de links efetuado pelo update-rc.d:

Adding system startup for /etc/init.d/tomcat ...
/etc/rc0.d/K20tomcat -> ../init.d/tomcat
/etc/rc1.d/K20tomcat -> ../init.d/tomcat
/etc/rc6.d/K20tomcat -> ../init.d/tomcat
/etc/rc2.d/S20tomcat -> ../init.d/tomcat
/etc/rc3.d/S20tomcat -> ../init.d/tomcat
/etc/rc4.d/S20tomcat -> ../init.d/tomcat
/etc/rc5.d/S20tomcat -> ../init.d/tomcat



A próxima vez que o sistema for reiniciado, o arquivo tomcat (configurado acima) será executado inicializando o servidor tomcat como um serviço.

terça-feira, 20 de janeiro de 2009

JAVA: Criando Threads

Podemos fazer analogia a um processo como sendo um programa em execução. Já uma Thread é conhecida como "processo leve" (lightweight process), é considerada leve pelo fato de rodar dentro do contexto do processo, aproveitando-se do compartilhamento dos recursos alocados para o ambiente do programa.

Há casos em que dentro da execução de um processo, verifica-se a necessidade de "disparar" uma thread que irá executar paralelamente ao processo a que pertence. Dessa forma, pode-se executar instruções sem que o processo principal fique em estado de espera "lock" até que um trecho de código seja executado.

Em JAVA pode-se herdar a classe Thread ou implementar a interface Runnable para se utilizar threads em seus processos. Exemplo de uma thread simples:


/**
*
* @author João Paulo Eiti Kimura Classe que estende uma tread simples
*/
public class SimpleThread extends Thread {

public SimpleThread(String str) {
super(str);
}

public void run() {

// qualquer processamento ...

// faz a thread dormir um número aleatório em (ms)
long sleepTime = (long) (Math.random() * 1000);
System.out.println(getName() + " sleeping for " + sleepTime + " ms");

try {
sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished: " + getName()); // finaliza a execuçao
}
}


No exemplo da classe SimpleThread, pode-se verificar que a classe herda características da classe Thread do java. Seu construtor default chama o construtor da classe mãe (Thread), no qual o parâmetro passado representa o nome da thread. O método principal da thread é o run, é nele que todo processamento é realizado. Com fins ilustrativos, o método run desse exemplo apenas aguarda um tempo em milissegundos.


Vejamos como executar a classe SimpleThread:

public class ExemploThread {

public static void main(String[] args) {

SimpleThread t1 = new SimpleThread("Thread 1");
SimpleThread t2 = new SimpleThread("Thread 2");
SimpleThread t3 = new SimpleThread("Thread 3");

t1.start();
t2.start();
t3.start();
}
}


Na classe ExamploThread, foram instanciados 3 objetos das classe SimpleThread. Para iniciar a execução da thread, fez-se a chamada ao método start() de cada objeto. Esse método executa o método run implementado na thread.
Resultado da execução da classe ExemploThread:


Thread 1 sleeping for 546 ms
Thread 3 sleeping for 580 ms
Thread 2 sleeping for 854 ms
finished: Thread 1
finished: Thread 3
finished: Thread 2



Dessa forma é possível executar tarefas em paralelo ao processo principal de um programa. Entretando, se sua classe já tiver herdado alguma outra classe não será possível herdar a classe Thread, ou qualquer outra, devido a natureza da linguagem que permite a herdar as características de apenas 1 classe. Especificamente para solucionar esse caso, faz-se uso da implementação da interface Runnable.

A classe que implementar a interface Runnable irá implementar o método run. Vamos a um exemplo de implementação desta interface:


public class ThreadInterface extends MyClass implements Runnable {

public void run() {

// qualquer processamento ...

// faz a thread dormir um número aleatório em (ms)
long sleepTime = (long) (Math.random() * 1000);
System.out.println(Thread.currentThread().getName() + "Thread sleeping for " + sleepTime + " ms");

try {
Thread.sleep(sleepTime);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished: " + Thread.currentThread().getName()); // finaliza a execuçao
}
}


Um exemplo de chamada e execução da classe que implementa a interface Runnable:


public class ExemploThreadInterface {

public static void main(String[] args) {

new Thread(new ThreadInterface(), "Thread1").start();
new Thread(new ThreadInterface(), "Thread2").start();
new Thread(new ThreadInterface(), "Thread3").start();
}
}


Resultado da execução:


Thread1Thread sleeping for 569 ms
Thread3Thread sleeping for 821 ms
Thread2Thread sleeping for 795 ms
finished: Thread1
finished: Thread2
finished: Thread3



Com a classe Thread e a interface Runnable é possível criar facilmente threads simples em Java, de forma a executar tarefas na execução de qualquer processo da aplicação.

Download dos códigos fonte dos exemplos: thread_src.zip

quinta-feira, 15 de janeiro de 2009

JAVA: Trabalhando com Data/Hora

Tive a necessidade de comparar datas em JAVA, uma forma rápida e fácil de fazer isso é usando classe Calendar.

A Calendar é uma classe abstrata, com ela pode-se modificar uma data/hora em dias, minutos, meses e etc. Segue um exemplo de como comparar duas datas usando a classe Calendar do java:

CalendarExemplo1.java

1 import java.util.Calendar;
2 import java.util.Date;
3
4 public class CalendarExemplo1 {
5
6 public static void main(String[] args) {
7
8 Calendar data1 = Calendar.getInstance();
9 data1.add(Calendar.DAY_OF_MONTH, 2);
10
11 Calendar data2 = Calendar.getInstance();
12 data2.add(Calendar.HOUR, 1);
13
14 int result = data1.compareTo(data2);
15 String msg = "";
16
17 if (result == 0)
18 {
19 msg = "Data 1 é igual que Data 2";
20 }
21 else if (result > 0)
22 msg = "Data1 é maior que Data 2";
23 else
24 msg = "Data 1 é menor que Data 2";
25
26 System.out.println("Data/Hora Atual: " + new Date());
27 System.out.println("Data 1 : " + data1.getTime());
28 System.out.println("Data 2 : " + data2.getTime());
29 System.out.println(msg);
30 }
31 }


Resultado:

Data/Hora Atual: Tue Sep 23 14:14:06 GMT-03:00 2008
Data 1 : Thu Sep 25 14:14:06 GMT-03:00 2008
Data 2 : Tue Sep 23 15:14:06 GMT-03:00 2008
Data1 é maior que Data 2


Os métodos mais utilizados da Calendar para modificar os valores das datas são o add e o roll.
Com método add pode-se somar ou subtrair unidades de tempo das datas. Exemplo:

CalendarExample2.java

1 import java.util.Calendar;
2 import java.util.Date;
3
4 public class CalendarExemplo2 {
5
6 public static void main(String[] args) {
7
8 //atrasa em 1 horas e 30 minutos a hora atual
9 Calendar cal = Calendar.getInstance();
10 cal.add(Calendar.HOUR, -1);
11 cal.add(Calendar.MINUTE, -30);
12
13 //obtem a data e hora em milisegundos
14 long d1= cal.getTimeInMillis();
15 long d2= new Date().getTime();
16
17 //calcula a diferença enter as datas
18 long diff = (d2-d1);
19
20 //converte de ms para min. (1ms/1000)/60
21 long minute = (long)(diff*1e-3)/60;
22
23 System.out.print("Dif. temporal (min): " + minute);
24 }
25 }


Observe que nas linhas 10 e 11 eu estou atrasando o horário atual em 1 hora e 30 minutos. O calculo da diferença temporal é feito em milisegundos (linha 18) e depois convertido em minutos para a exibição (linha 21).

Resultado:

Dif. temporal (min): 90


O resultado mostra a diferença entre as duas datas em minutos foi de 90 minutos.

O método roll faz a chamada "rolagem" da unidade de tempo, sem alterar as demais unidades. Por exemplo, pode-se pedir para que seja rolado 10 meses a frente, isso é feito alterando-se somente a unidade mês, o ano e o dia vão continuar os mesmos. Exemplo:

CalendarExample3.java


1 import java.util.Calendar;
2
3 public class CalendarExemplo3 {
4
5 public static void main(String[] args) {
6
7 Calendar cal = Calendar.getInstance();
8 System.out.println(cal.getTime());
9
10 //"rolagem" do mês em 5 unidades
11 cal.roll(Calendar.MONTH, 5);
12 System.out.print(cal.getTime());
13 }
14 }


Resultado:

Tue Sep 23 14:16:08 GMT-03:00 2008
Sat Feb 23 14:16:08 GMT-03:00 2008


A rolagem da unidade de tempo mês é feita na linha 11 do programa CalendarExample3.java. Perceba no resultado que a data iniciou no mês de setembro, contou-se 5 meses a frente, a data final foi para o mês de fevereiro, sem que o ano se modificasse.

Com a classe Calendar é possível fazer a diferenças entre datas e horas de forma fácil e intuitiva, bastando apenas indicar a unidade de tempo e o quando será adicionado ou retirado.

Download dos códigos fonte: calendar_src.zip

Para mais detalhes sobre as demais funcionalidades da classe Calendar, consulte o java doc no endereço: http://java.sun.com/j2se/1.5.0/docs/api/java/util/Calendar.html

quarta-feira, 7 de janeiro de 2009

Converter arquivos .UIF para ISO no Linux

O .UIF é um formato proprietário utilizado para gerar imagens de CD e DVD. MagicISO é um software proprietário que lê e converte esse tipo de arquivo em sistemas Windows. Entretanto, para o linux encontrei um utilitário que converte as imagens de .iuf para .iso, é o uif2iso.

A ferramenta pode ser baixada do seguinte endereço:
http://aluigi.altervista.org/mytoolz/uif2iso.zip

O programa tem a dependência dos pacotes: zlib e OpenSSL. Para instalar as dependências digite no console:

apt-get install zlib1g zlib1g-dev libssl-dev


Descompacte o arquivo uif2iso.zip e entre no diretório src. Para compilar e instalar:

cd uif2iso/src
make
sudo make install


Pronto, agora com a ferramenta instalada é possível converter o arquivo de imagem uif para iso usando:

# uif2iso imagem.uif imagem.iso


Referência:
http://aluigi.altervista.org/mytoolz/