Remote Method Invocation (RMI)

Bu yazımızda Client üzerinden uzak sunucuda bulunan uygulamamıza ait metodları kullanmayı göreceğiz. Uygulama client ve server olmak üzere 2 bölümden oluşmaktadır. Client tarafında kullanıcıya sunulan gui ile kullanıcı www.imdb.com üzerinden istediği film araması için gerekli anahtar kelimeleri girmektedir. Kullanıcı aramayı başlattığında client uygulama server uygulamaya gerekli parametreleri geçirmekte, server uygulamada bu parametrelerle sorgulama, html parse gibi işlemeleri gerçekleştirerek client uygulamaya sonucu döndürmektedir. Dönen sonuç yine gui içerisinde kullanıcıya sunulmaktadır. Film aramasının yanı sıra gui içerisinde 3 sn’de bir güncellenen bir alanda www.foreca.com‘dan alınan İzmir için hava durumu bilgisi görüntülenmektedir.

Client: RmiApp.java: Netbeans tarafından render edilen bir class’tır. Bir desktop (gui) application’ı başlatmaya yarayan fonksiyonları içerir.

RmiInterface.java: Server’da override ettiğimiz fonksiyonları içeren Interface class’ı.

RmiView.java: Gui uygulamamızın kodlarını içeren class. Ayrıca server’a istekte bulunduğumuz (parametre gönderme vs.) fonksiyonları da içeriyor.

UpdateWeather.java: Weather bilgisini aldığımız ve gui’yi güncellediğimiz Thread class’ı. Server: RmiInterface.java: Server’da override ettiğimiz fonksiyonları içeren Interface class’ı.

GetInfo.java: Server üzerinde yaptığımız işlemleri (http post, get, parse vb.) ayrı bir class olarak burada gerçekleştirdik. RmiServer.java içerisinden bu fonksiyonları çağırıyoruz.

Uygulamanın çalıştırılması: Server dosyalarının bulunduğu klasörün içinden rmiregistry çalıştırıldıktan sonra java RmiServer komutu ile server uygulaması başlatılır. (Not: Server uygulaması localhost’ta çalışacak şekilde şu anda başka bir bilgisayarda çalıştırılacaksa o bilgisayarın ip’si RmiServer içerisine girildikten sonra RmiServer.java dosyası tekrar derlenip, stub tekrar oluşturulduktan sonra server başlatılmalıdır.)

Server uygulaması başlatıldıktan sonra bin/client içerisinde client uygulamasının .jar dosyası olarak paketlenmiş java -jar rmi.jar komutu ile client uygulaması başlatılır. Daha sonra gui’de gerekli alana server uygulamasının çalıştığı bilgisayarın ip’si girilerek bağlantı sağlanır.

Stub dosyasını oluşturma: server klasörü içerisinde bulunan RmiServer dosyası derlenerek .class dosyası oluşturulur.

javac RmiServer.java

Daha sonra oluşturulan derlenmiş dosya Rmi Stub Compiler ile tekrar derlenerek stub dosyası oluşturulur.

rmic RmiServer.class

Uygulamanın kodlarını buradan indirebilirsiniz.

Kalın sağlıcakla.

PyQt & Animated Gif Macerası..

Python – PyQt birlikteliğinden swf oynatma yeteneği çıkmayınca geliştirdiğim uygulamada dinamik olarak güncellenebilen bir alanda animated gif oynatmaya karar verdik. Qt ile bunun oluru nedir diye baktığımda pek de zor olmadığını gördüm.

Özetle şöyle:
Önce bir QMovie nesnesi oluşturuyorsunuz, oynatacağınız gif’i QMovie nesnesini oluştururken belirtiyorsunuz. Daha sonra bir QLabel oluşturup setMovie metoduna oluşturduğunuz QMovie nesnesini veriyorsunuz. Son olarak oluşturduğunuz QMovie nesnesinin start() metodunu çağırarak gif’i oynatıyorsunuz. Mantık olarak çok basit olmakla birlikte bir türlü çalıştıramadım. Hata da vermiyor, bir derdi var belli, çok da küçük bişey ama bir türlü göremiyorum. Deneme için oluşturduğum kod aşağıda, oynatmaya çalıştığım gif dosyası da burada. Programı deneyip sonucu bana bildirirseniz çok sevinirim.

Çalıştığım sistem özellikleri:

Pardus 2008.2
PyQt 4.4.4

Cevap:
Aşağıdaki kodda bulunan movie nesnesini self‘e bağlayınca çalıştı. QMovie nesnesinin neden class’a bağlı global bir değişken olarak tanımlanması gerektiğini anlamış değilim. Bu örnek de böyle bir hatayla karşılaşanlar olursa diye dursun burada.

# -*- coding: utf-8 -*-
from PyQt4 import QtCore, QtGui
import sys
 
class Ui_MainWindow(object):
   def setupUi(self, MainWindow):
      MainWindow.setObjectName("MainWindow")
      MainWindow.resize(800, 600)
      self.centralwidget = QtGui.QWidget(MainWindow)
      self.centralwidget.setObjectName("centralwidget")
      self.label = QtGui.QLabel(self.centralwidget)
      self.label.setGeometry(QtCore.QRect(210, 90, 351, 231))
      movie = QtGui.QMovie("progress.gif")
      self.label.setMovie(movie)
      movie.start()
 
      """
 
      ** PyQt sürümünüzün gif destegi olup olmadigini commentleri kaldirarak gorebilirsiniz
 
      formats = QtGui.QImageReader.supportedImageFormats ()
      for i in formats:
         print i
 
      """
 
      self.label.setObjectName("label")
      MainWindow.setCentralWidget(self.centralwidget)
      self.menubar = QtGui.QMenuBar(MainWindow)
      self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 29))
      self.menubar.setObjectName("menubar")
      MainWindow.setMenuBar(self.menubar)
      self.statusbar = QtGui.QStatusBar(MainWindow)
      self.statusbar.setObjectName("statusbar")
      MainWindow.setStatusBar(self.statusbar)
 
      self.retranslateUi(MainWindow)
      QtCore.QMetaObject.connectSlotsByName(MainWindow)
 
   def retranslateUi(self, MainWindow):
      MainWindow.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
 
if __name__ == "__main__":
   app=QtGui.QApplication(sys.argv)
   window=QtGui.QMainWindow()
   ui=Ui_MainWindow()
   ui.setupUi(window)
   window.show()
   sys.exit(app.exec_())

Ev yapımı şifreleme

lock-and-key-icon-thumb355812Merhaba.Bugün size Python ile ev yapımı şifreleme nasıl yapılır ondan bahsedeceğim. Ev yapımı şifrelemeden neyi kastettiğimi yazının devamında daha rahat anlayacaksınız.(Not: Yazar girişte başlığı kullanarak merak uyandırmaya çalışmış ve okuyucuyu yazının devamını okuması için teşvik etmeye çalışmıştır).Programı görmeden önce size bu programı nerede kullanabileceğinizden bahsedeceğim, programın bu bilgiyle incelendiğinde daha kolay anlaşılacağını düşünüyorum.

Bir uygulama geliştirdiniz. Uygulamanız kullanıcı adı ve şifre girişi gerektirmekte ve siz de bu kullanıcı adını ve şifreyi kullanıcının bilgisayarında tutmak durumundasınız. Sadece bir kullanıcının kullanıcı adı ve şifresini tutmak içinde veritabanı kullanmak istemiyorsunuz. Bu durumda bu bilgileri bir dosyada tutmanız gerek. Buraya kadar her şey normal. Sorun bu bilgileri o dosyada nasıl tutacağınız. Bir dosya oluşturup içerisine pattadanak (böyle mi yazılıyor bu?) yazacak değilsiniz. Bu kadarla da kalmıyorsunuz programınız kullanıcınızın izni dışında 3. şahıslar tarafından kopyalandığında da o 3. şahıs programını çaldığı kullanıcınızın bilgileri ile giriş yapamasın istiyorsunuz, yok artık!!! İşte bu yazıda böyle bir ihtiyaç durumunda kullanabileceğiniz bir şifreleme yönteminden, kendi verdiğim isimle “Ev Yapımı Şifreleme” den bahsedeceğim.

Çok konuştuk, kodu görelim. Önce kodun tamamını verip daha sonra parça parça açıklamasını vereceğim.
Continue reading “Ev yapımı şifreleme”