quarta-feira, 19 de maio de 2010

Sistema operacional Linux, Distro Linux, Distribuições, mas que raios é isso tudo?

Para um usuário acostumado com windows, a vida é fácil, você escolhe entre Seven, Vista ou XP e pronto!
No caso dos sistemas operacionais baseados em linux a situação é diferente, cada um é como se fosse filho de um mesmo pai e com mães completamente diferentes. Você não pode julgar os sistemas linux apenas com uma Distribuição Linux.
Como isso funciona, o kernel linux (núcleo do sistema) desenvolvido originariamente por Linus Torvalds , é distribuído gratuitamente e de forma livre, dessa forma, qualquer pessoa que queira pode alterar e adaptar o mesmo a seu gosto, apesar de toda a filosofia "livre" em torno dele (livre não quer dizer gratuito) o linux é mantido por empresas que lucram e muito com ele, como isso ocorre?

O seu Roteador, o seu modem, seu celular ou qualquer outro dispositivo eletrônico que necessite de algum sistema controlador, provavelmente funciona com uma versão do kernel linux, por isso, muitas empresas investem no desenvolvimento do mesmo, pois desse modo, eles tem um sistema comprovadamente robusto e funcional com pouco investimento. Na realidade não nada de muito ideológico nisso...
A segunda parte da importância do kernel linux é com relação aos servidores, como o linux pode ser adaptado a qualquer arquitetura de hardware, temos versões para rodarem em servidores e sistemas específicos como o do LHC e demais supercomputadores. Como os processos envolvidos são muito críticos e específicos é necessário um sistema operacional desenhado e preparado para a tarefa específica. Esses clientes em geral tem muito dinheiro, mas como o que está em jogo muitas vezes envolve propriedades intelectuais importantíssimas é melhor que o controle total e absoluto de hardware e software estejam nas mãos deles.
Por fim, temos o linux em smartphones, tablets e dispositivos móveis diversos  onde ele vem ganhando muitos adeptos e em sistemas em desktop, os sistemas em desktops possuem infindáveis distribuições, que são versões de sistemas operacionais diferentes baseados no mesmo kernel e aplicativos, mas não se engane, Fedora é diferente de Ubuntu que é diferente do Archlinux. Cada um desses que eu citei são sistemas operacionais diferentes, cada um com sua característica e peculiaridade.
Cada sistema linux diferente pode ser tão diferente um do outro como o Céu e a Terra, imagine com relação ao Windows, tem até um artigo bem interessante: O Linux não é o Windows.
Tem muita gente que questiona o linux e talz, mas na realidade o linux nunca foi e não é um concorrente do Windows, a começar pela finalidade e depois pela maneira que é distribuído, o concorrente do windows mais próximo é o MacOSX, mesmo assim, por rodar em hardware específico podemos dizer que ele é de nicho assim como o linux, na realidade o windows não possui nenhum concorrente, essa é a verdade nua e crua, se ele fosse vendido em caixinhas e tivesse propaganda  e a finalidade de substituir o windows ele poderia até ser um concorrente mas não é o que ocorre, até mesmo no ramo de servidor ele em si não é um concorrente, o real concorrente do IIS é o Apache, que roda no próprio windows também.
Portanto, quando falar de "linux" entenda apenas como o kernel do sistema, porque um sistema operacional usável, baseado em kernel linux é Ubuntu, Fedora, Mandriva etc... Espero ter esclarecido as dúvidas de quem ainda não sabia, qualquer coisa, comentem.

Performance do Ubuntu 10,04 VS Windows Vs MacOSX

Antigamente podíamos sem dúvidas dizer: "A performance do Linux é Superior ao Windows", a realidade não é bem assim.

Com a nova versão do Windows 7 temos um cenário bastante interessante onde os dois sistemas operacionais (Ubuntu 10.04 e Windows 7 ) possuem performances bastante similares, com o Windows ganhando em alguma coisa e o Ubuntu Linux em outras.
Na época do XP (Vista não Conta) o mesmo era e é extremamente antigo e simplesmente não se aproveita do que o hardware tinha a oferecer, como resultado, mesmo tendo drivers inferiores, o linux ganhava em performance por ser mais otimizado em hardware mais recente, o exemplo disso é o SMP (Symmetric Multi-Processing), coisa que no XP ainda engatinha e há muito tempo tem um suporte decente em linux, o mesmo ocorre com a arquitetura de 64bits onde há tempos o linux suporta perfeitamente.
Com as melhorias inseridas no Windows 7, podemos ver os resultados interessantes do Ubuntu 10.04 VS Windows 7 onde os resultados são similares quando os drivers são semelhantemente otimizados. O interessante disso é que: O Ubuntu Linux 10.04 e o Windows 7 possuem performance semelhantes, Se as empresas resolvessem lançar jogos baseados em OpenGL o Ubuntu Linux teria uma performance Similar ao Windows e , em alguns casos , Superior e em outros inferior.

Vale lembrar que os testes foram realizados usando o Ubuntu 10.04 e que existem diversos sistemas operacionais baseados no kernel linux que podem ter uma performance diferente.

Sistema operacional baseado em linux? mas o que é isso? linux é linux não?
Não exatamente, vou explicar no próximo post.

quarta-feira, 12 de maio de 2010

Visualização de Impressão Utilizando o QPrintPreviewDialog e PyQt4

Dessa vez foi um pouco complicado hehe, eu estava garimpando a internet procurando um exemplo de como utilizar o QPrintPreviewDialog, sem sucesso, depois de muito procurar fiz uma pergunta ao amigo do site sobre Python e Qt e ele gentilmente me respondeu, o resultado pode ser visto aqui:



#!/usr/bin/python
# -*- coding: utf-8 -*-
from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import QtCore
from PyQt4.QtWebKit import QWebView

class ProgramaImpressor(QDialog):
    def __init__(self,parent=None):
        super(ProgramaImpressor,self).__init__(parent)
        rotuloNome=QLabel("Nome: ")
        rotuloEndereco=QLabel(u"Endereço: ")
        rotuloOutros=QLabel("Diversos: ")
        self.impressor=QPrinter()
        self.txtnome=QLineEdit()
        self.txtendereco=QLineEdit()
        self.txtdiversos=QTextEdit()
        self.btnimprimir=QPushButton("&Imprimir")
        layoutHorizontal=QHBoxLayout()
        layoutHorizontal2=QHBoxLayout()
        layoutHorizontal3=QHBoxLayout()
        layoutVertical=QVBoxLayout()
        layoutHorizontal.addWidget(rotuloNome)
        layoutHorizontal.addWidget(self.txtnome)
        layoutHorizontal2.addWidget(rotuloEndereco)
        layoutHorizontal2.addWidget(self.txtendereco)
        layoutHorizontal3.addWidget(rotuloOutros)
        layoutHorizontal3.addWidget(self.txtdiversos)
        layoutVertical.addLayout(layoutHorizontal)
        layoutVertical.addLayout(layoutHorizontal2)
        layoutVertical.addLayout(layoutHorizontal3)
        layoutVertical.addWidget(self.btnimprimir)
        self.setLayout(layoutVertical)
        self.dialogo=QPrintPreviewDialog()
        self.html=u""
        self.documento=QWebView()
        self.connect(self.dialogo, SIGNAL("paintRequested (QPrinter *)"),self.documento.print_)
        self.connect(self.documento,SIGNAL("loadFinished (bool)"),self.previaImpressao)
        self.connect(self.btnimprimir, SIGNAL("clicked()"),self.imprimir)
  
    def previaImpressao(self,arg):
        self.dialogo.exec_()  
  
    def imprimir(self,html=None):
  
        html=u"<font align=center><H1>Relatório de Teste de Impressão</H1></font>\
        <br>\
        <p>O nome digitado Foi: <font color=blue>%s</font></p>\
        <p>O endereço da pessoa é: <font color=blue>%s</font></p>\
        <p>Os demais comentários São:\
        <br>%s</p>"%(self.txtnome.text(),self.txtendereco.text(),self.txtdiversos.toHtml())
        self.documento.setHtml(html)
        #self.documento.show()
      
      
      
if __name__ == "__main__":
    import sys
    app = QApplication(sys.argv)
    JanelaPrincipal = ProgramaImpressor()
    JanelaPrincipal.show()
    app.exec_()

terça-feira, 6 de abril de 2010

Programação em Python e Qt, exemplo prático e funcional

Estou de volta à atividade no Blog com uma informação bastante legal, Criei um programinha baseado em uma aula de VB.net (Blarg!) que eu tive e criei uma Agenda Eletrônica usando o Banco de Dados MySQL e PyQt, é fácil de instalar, você precisa instalar o Python, eo PyQt, se estiver usando Linux, basta ir no Gerenciador de pacotes que ele está disponível, não se esqueça do QtSQL, se estiver usando Windows basta ir nos links que eu deixei.
As demais explicações sobre o Programa estão no código do mesmo, basta clickar aqui para baixar:

Código Fonte: Download

Instalador Para Ambiente Windows: Download

Eu usei o Eclipse com o plugin Pydev e o Qt designer.


quinta-feira, 25 de março de 2010

Como instalar plugins no Gimp

Recentemente eu precisei instalar alguns plugins no Gimp, em especial o Plugin: GREYCstoration, um plugin fantástico por sinal, ele vem já compilado para o Gimp, sendo assim, como instalar? Simples ;)

$gimptool --install-bin GREYCstoration_gimp_pc_linux


Com isso ele fica instalado para o usuário atual, se quiser instalar para todos basta:


$gimptool --install-admin-bin GREYCstoration_gimp_pc_linux


Se fosse um arquivo fonte c para ser compilado seria:

$gimptool --install GREYCstoration_gimp_pc_linux.c


É isso, espero que seja útil.
Inté :D

terça-feira, 19 de janeiro de 2010

Acessar Banco de Dados MySQL no ArchLinux

Eu usava o Ubuntu com o netbeans e o mesmo encontrava e acessava o banco de dados local mysql sem problemas, quando instalei o arch e o netbeans, eu não consegui fazer mais isso, procurei em diversos lugares diferentes(menos na Wik oficial do Arch) a solução e ninguém parecia a ter.
Como pouco uso o netbeans eu não me importei muito e me contentei em usar no meu desktop que tem o ubuntu 64 bits, eu já havia configurado as tabelas, os BD's propriamente ditos e o arquivo my.cnf e nada feito.
O problema apareceu quando eu não consegui acessar o MySQL com os meus aplicativos python, e o pior é que eu precisava demonstrar o acesso a um cliente com o programa rodando no micro dele e o mysql rodando como servidor no meu note, e agora?
Novamente a maratona no google e nada feito, então resolvi procurar na Wiki do Arch : , a solução estava lá, era só seguir os passos, e voilá, tudo funcionando, inclusive o netbeans.
Fica aí a dica, se alguém precisar configurar e por acaso cair por esse blog a solução está na wiki do arch.


Enable remote access

The MySQL server does not listen on the TCP port 3306 by default. To allow (remote) TCP connections, comment the following line in /etc/mysql/my.cnf:

skip-networking

Remember to edit /etc/hosts.allow by adding the following lines:

mysqld: ALL : ALLOW
mysqld-max: ALL : ALLOW

terça-feira, 12 de janeiro de 2010

Meu Primeiro Script PyQt

Consegui depois de algum estudo criar o meu primeiro script em Python + Qt, ele é muito simples e fiz com o intuito de resolver um problema de renomear um monte de fotos de uma pasta.
Ele funciona assim, você digita a pasta onde estão os arquivos, por exemplo:

/home/user/arquivos

depois coloca o nome base do arquivo, por exemplo:

fotos2006.jpg

depois ele renomeia as fotos como 1fotos2006.jpg,2fotos2006.jpg e assim por diante. É uma função muito simples, mas vale à pena o aprendizado, tive muitos problemas para ele funcionar com caracteres especiais.

Aqui vai o script (estou sem tempo para inserir comentários depois eu faço isso)



# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui
from os import system
import subprocess
class Ui_janelaPrincipal(object):
def setupUi(self, janelaPrincipal):
janelaPrincipal.setObjectName("janelaPrincipal")
janelaPrincipal.resize(419, 226)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("../../star.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
janelaPrincipal.setWindowIcon(icon)
self.centralwidget = QtGui.QWidget(janelaPrincipal)
self.centralwidget.setObjectName("centralwidget")
self.label = QtGui.QLabel(self.centralwidget)
self.label.setGeometry(QtCore.QRect(10, 10, 59, 30))
self.label.setObjectName("label")
self.label_2 = QtGui.QLabel(self.centralwidget)
self.label_2.setGeometry(QtCore.QRect(10, 60, 91, 51))
self.label_2.setObjectName("label_2")
self.label_3 = QtGui.QLabel(self.centralwidget)
self.label_3.setGeometry(QtCore.QRect(10, 120, 59, 18))
self.label_3.setObjectName("label_3")
self.mensagens = QtGui.QLabel(self.centralwidget)
self.mensagens.setGeometry(QtCore.QRect(110, 120, 131, 61))
self.mensagens.setObjectName("mensagens")
self.botaoRenomear = QtGui.QPushButton(self.centralwidget)
self.botaoRenomear.setGeometry(QtCore.QRect(290, 140, 106, 27))
self.botaoRenomear.setObjectName("botaoRenomear")
self.caminho = QtGui.QLineEdit(self.centralwidget)
self.caminho.setGeometry(QtCore.QRect(100, 10, 311, 28))
self.caminho.setObjectName("caminho")
self.novo_arquivo = QtGui.QLineEdit(self.centralwidget)
self.novo_arquivo.setGeometry(QtCore.QRect(100, 70, 113, 31))
self.novo_arquivo.setObjectName("novo_arquivo")
janelaPrincipal.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(janelaPrincipal)
self.menubar.setGeometry(QtCore.QRect(0, 0, 419, 24))
self.menubar.setObjectName("menubar")
janelaPrincipal.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(janelaPrincipal)
self.statusbar.setObjectName("statusbar")
janelaPrincipal.setStatusBar(self.statusbar)
QtCore.QObject.connect(self.botaoRenomear, QtCore.SIGNAL("clicked()"), self.renomear)
self.retranslateUi(janelaPrincipal)
QtCore.QMetaObject.connectSlotsByName(janelaPrincipal)

def renomear(self):
caminho = unicode(self.caminho.text())
arquivo = unicode(self.novo_arquivo.text())
completo = caminho + '/.caminho'
system(u"ls %s > %s/.caminho" % (caminho, caminho))
prepare21 = open(unicode(completo), 'r')
linhas = prepare21.readlines()
contagem = 0
for arquivos in linhas:
contagem += 1
filesX = arquivos[:len(arquivos) - 1]

#print filesX
#try:
#system(u'mv -fv "%s/%s" "%s/%d%s"' % (caminho, filesX, caminho, contagem, arquivo))
# print fileX
subprocess.call(['mv', '-fv', caminho + '/' + unicode(filesX, 'utf-8'), caminho + '/' + str(contagem) + arquivo])
self.mensagens.setText(u"transação efetuada\ncom sucesso")
#except:
#self.mensagens.setText(u"Falha geral\nna transação")



def retranslateUi(self, janelaPrincipal):
janelaPrincipal.setWindowTitle(QtGui.QApplication.translate("janelaPrincipal", "Renomear em massa", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("janelaPrincipal", "Pastas:", None, QtGui.QApplication.UnicodeUTF8))
self.label_2.setText(QtGui.QApplication.translate("janelaPrincipal", "Nome Base :", None, QtGui.QApplication.UnicodeUTF8))
self.label_3.setText(QtGui.QApplication.translate("janelaPrincipal", "Status:", None, QtGui.QApplication.UnicodeUTF8))
self.botaoRenomear.setText(QtGui.QApplication.translate("janelaPrincipal", "Renomear", None, QtGui.QApplication.UnicodeUTF8))


if __name__ == "__main__":
import sys
app = QtGui.QApplication(sys.argv)
janelaPrincipal = QtGui.QMainWindow()
ui = Ui_janelaPrincipal()
ui.setupUi(janelaPrincipal)
janelaPrincipal.show()
sys.exit(app.exec_())