SENDE YAZ , FARKIN OLSUN...

24 Şubat 2012 Cuma

Java Script Ile Tarayiciya Gore Sayfa Yonlendirmesi

Selamlar , bazen yaptigimiz web sitelerinin, cozunurlugunu , arka planini, sayfayi ve bir takim ozelliklerini kullandigimiz tarayici (browser) ya gore duzenlemek zorunda kaliriz. Ornegin CSS 3 teknolojisi ile yapmis oldugunuz bir web sitesinin eski browserda yada bazi ozelliklerinin mevcut guncel chrome'da calismadigina kendim sahit oldum. Bu yuzden bazen sayfa acilislarinda mecburen tarayiciya gore sayfa yonlendirmesi yapmak zorunda kalabiliyoruz. Cok fazla uzatmadan kisa Java Script kodunu vermek istiyorum;

Olay soyle oluyor :)

var JspCoder;//Tanimladiginiz herhangi bir degisken olarak dusunebilirsiniz
JspCoder = navigator.appName;//Bu kisim hangi browser ile calistigimizi algiliyoruz
if (JspCoder == "Microsoft Internet Explorer")
{
window.location=("http://www.sendeyazfarkinolsun.com/anasayfa.aspx");
}
else if (JspCoder == "Netscape")
{
window.location=("http:// www.sendeyazfarkinolsun.com /icerik.aspx");
}
else {
window.location = ("http:// www.sendeyazfarkinolsun.com /index.htm);
}

yukaridaki sekilde gerekli yonlendirmeleri bu Java Script kodu ile cok basit bir sekilde yapabiliriz...

Iste bu kadar...

Sende Yaz, Farkin Olsun...

10 Şubat 2012 Cuma

'Dinamik' Ajax Accordion olusturmak ve icerisine 'dynamic' olarak 'Control'ler eklemek

Uzun bir aradan sonra tekrar merhaba , yazima baslamadan once sunu belirtmeliyimki, cok fazla zamanimi alan bu islemi malesef internette ya eksik yada yanlis kodlarla buldum. Baska birisininde ayni sikintiyi yasamamasi acisindan paylasmak istedim. Neyse hemen konuya geciyorum...

Ajax Accordion bildiniz uzere, web sitemize hem gorsel anlamda guzellik katarken hemde alan kullanimi acisindan cok buyuk kolayliklar saglayabiliyor. Ajax Accoridon 'u ajax toolkit'i indirerek ( buradan indirebilirsiniz...) cok basit bir sekilde kullanabiliyoruz. (Nasil kullanildigina dair video'yu buradan izleyebilirsiniz...)

Fakat mesele, dinamik olarak birseyler kullanmak istedigimizde biraz karisiyor. Bir video paylasim siteniz var. Bu sitede icerik olarak "komedi","Muzik","Spor" gibi farkli kategoriler oldugunu dusunelim. Ve herhangi biri secildiginde onlarla ilgili videolar geliyor diyelim. ( Bu web sitesini ornek olarak soyluyorum, yani binlerce video olan bir site degilde , her kategoride 3 ile 10 arasinda cesitli videolar var farzedelim) Ama hangisinde kactane video geliyor bilmiyorsunuz,cunku dinamik olarak data base'den geliyor videolar. Ve ayni zamanda Accordion kullanmak istiyorsunuz, yani video sayisi kadar accordion pane (Accordion,uzerine tiklandiginda yukari yada asagi dogru kayan tabandir.) olusturulmasini istiyorsunuz. Videolar icin de yine ASP.NET' in media playerini kullaniyorsunuz farzedelim. (Bu sizin kullanidiginiz herhangi bir media player da olabilir. ) Yapmaniz gereken, oncelikle secilen kategoride kac adet video var bunun sayisini almak , ve kod tarafinda dinamik olarak for donguleri icerisinde olusuturulan accordion pane'lerin sayisi olarak almis oldugumuz bu video sayisini fonksiyona gondermek.
Buna gore fonksiyonumuz kac adet accordion pane (kayan taban) olusturacagini bilecek ve ona gore dinamik olarak olusturacak.

Burdan oyle kod kismina gecerek devam ediyorum ,

Ilk olarak Media Playeri olusturan kodumuzu veriyorum;

Control MediaPlayer_Create(string videoUrl, int idChanger)

//videoUrl==> Bu playerin hangi videoyu oynatacigini belirtiyor,,
//idChanger==> Her seferinde yeni bir mediaplayer olusturuldugundan,bunlarin ID leri ayni
//olamayacagindan, "MediaPlayer" yazip sonuna yollamis IdChanger'i ekliyor, IdChanger //degerini Accordion Pane olusturdugum yerden yolluyorum.Yani 5 tane //olusturucaksam,idChanger'i 5 olarak yolluyorum.
{
ASPNetVideo.WindowsMedia x = new WindowsMedia();

x.ID = "MediaPlayer" + idChanger;
x.AutoPlay = false;
x.Height = 300;
x.VideoURL = videoUrl;
x.Width = 600;

return x;
}

Ust kisimda dinamik olarak MediaPlayeri olusturuyoruz, Kac defa olusturulacagini ise AccordionPane'leri olusturdugumuz yerden halledicez. Yani bu fonksiyonumuzu orada kullanicaz...

Accordion Paneleri olusturmadan once, bize media playerin oynatacagi videolar lazim. Dogal olarak bu videolarin URL 'i lazim. Bu URL' leri getirmek icin bir fonksiyon daha yazdim,

Yazmis oldugum bi Store Procedure ile vermis oldugum kategorilerin Videolarini bulup , bana URL(Oynatacagi Adres) lerini donduruyor...
O fonksiyonumuz ise soyle ;

public List < string > getVideoURLs(string prm_CategoryCode )

{
//Kisaca fonksiyonun islevine deginirsek , bir string tipinde bir List olusturdum, bana data //baseden gelen video adreslerini biriktirip dondursun diye.Daha sonra ben bu adresleri tek tek //media player olusturuken kullanicam ve olusturdugum media player hangi videoyu //oynatacagini bu adreslere gore belirleyecek...
if (string.IsNullOrEmpty( prm_CategoryCode ))
return null;

List < string > sListVideoURLs = new List(0);

using (SqlConnection xSqlConnection = new SqlConnection(sConnectionString))
{

try
{
SqlCommand xSqlCommand = new SqlCommand();
xSqlCommand.CommandType = System.Data.CommandType.StoredProcedure;
xSqlCommand.CommandText = "BSC_OLC_SP_GetVideoURL";
xSqlCommand.Parameters.Add(new SqlParameter("@ prm_CategoryCode",prm_CategoryCode));
xSqlCommand.Connection = xSqlConnection;
xSqlCommand.Connection.Open();

SqlDataReader xSqlDataReader = xSqlCommand.ExecuteReader();
while (xSqlDataReader.Read())
{

sListVideoURLs.Add(xSqlDataReader[0].ToString());
}

xSqlCommand.Connection.Close();
return sListVideoURLs;
}
catch
{

xSqlConnection.Close();
return null;
}
}

}



Hemen AccordionPane olusturmaya geciyorum ;

void createAjaxAccordion(int prm_videoNumber, List < string > prm_videoURLs)

{
AjaxControlToolkit.Accordion genelAccordion = new AjaxControlToolkit.Accordion();
List < AjaxControlToolkit.AccordionPane > paneList = new List();
List < Literal > literalListHeaders = new List();
List < Literal > literalListContents = new List();

for (int i = 0; i < prm_videoNumber ; i++)
{
paneList.Add(new AjaxControlToolkit.AccordionPane());
paneList[i].ID = "Pane" + i;
}

for (int i = 0; i < prm_videoNumber ; i++)
{
literalListHeaders.Add(new Literal());
literalListHeaders[i].ID = "headerContent" + i;
literalListHeaders[i].Text = "--->" + "Category" + (1 + i);
}

for (int i = 0; i < prm_videoNumber ; i++)
{
literalListContents.Add(new Literal());
literalListContents[i].ID = "Content" + i;
literalListContents[i].Text = "--->" + " Category " + (1 + i);
}

genelAccordion.ID = "myAccordion";
genelAccordion.FadeTransitions = true;
genelAccordion.FramesPerSecond = 40;
genelAccordion.TransitionDuration = 500;

for (int i = 0; i < prm_videoNumber ; i++)
{
paneList[i].HeaderContainer.Controls.Add(literalListHeaders[i]);
paneList[i].ContentContainer.Controls.Add(MediaPlayer_Create(prm_videoURLs[i],i));
}

for (int i = 0; i < prm_videoNumber ; i++)
{
genelAccordion.Panes.Add(paneList[i]);
}
form1.FindControl("Panel2").Controls.Add(genelAccordion);


}

Yukarida Panel2 dedigim, ASP tarafinda olusturmus oldugum Panel'in ID'si. Siz kendi olusturdugunuz panelin ID'sini vermelisiniz.

Yukaridaki kisimda ozetle,

Ilk olarak genel bir Accordion olusturuyoruz,
Sonrasinda Kactane Video Adresi Gelmisse elimize, o kadar Accordion Pane Olusturuyoruz..
Her olusturdugumuz accordion pane'in birer header ve content i oldugu icin, onlari da for dongusu icerisinde olusturuyorz. Zaten Accordion Pane sayisi ile, content ve headar sayisi esit olucak.Hepsi icin bir for donugusude kullanilabilirdi, acik olmasi acisindan bu sekilde yazdim.

Sonrasinda mediaplayer olusturan fonksiyonumuzu cagirip, kacinci accordion pane i olusturuyosak onun degerini ve oynatilacak videonun URL si ni gonderiyoruz.

Hepsi bu, umarim isinize yarar. Benim bi gece sabahlamama sebep oldu :)

Takildiginiz yer yada yardimci olabilecegim baska bir yer olursa yazabilirsiniz...

Sende Yaz Farkin Olsun!!!

Berkan Bilgin

9 Aralık 2010 Perşembe

Avea'dan Türkiye'de ve dünyada bir ilk: NFC teknolojili BonusluAvea

Dünyanın ilk telefon bağımsız, NFC teknolojisi ile çalışan temassız mobil ödeme çözümü BonusluAvea ile kullanıcılar, cüzdan taşımaya gerek duymadan
Bonuslu Avea
NFC SIM kartları içerisinde yer alan banka ve kredi kartlarını kullanarak hızlı ve temassız alışverişin ayrıcalığını yaşayacaklar. Avea Mobil Cüzdan içerisinde yer alan BonusluAvea servisinin lansmanını, dünyanın en büyük Uluslararası Kart Teknolojileri ve Uygulamaları Fuarı Cartes 2010 kapsamında yapıldı. BonusluAvea ile artık alışverişlerde kullanılan fiziki banka ve kredi kartlarını Avea Mobil Cüzdan içerisine taşıyor. Önümüzdeki dönemde ise Avea aboneleri Avea Mobil Cüzdan’ı; ulaşım, yemek, köprü ve otoyol geçişleri, stadyum ve bina girişleri gibi farklı alanlarda da kullanabiliyor olacaklar."

Avea Mobil Cüzdan

Peki nedir NFC teknolojisi?
NFC (Near Field Communication – Yakın Saha İletişimi) teknolojisi kısa mesafelerde cihazların birbirleri ile iletişim kurmalarına olanak sağlayan bir haberleşme teknolojisidir. Yakın mesafedeki (0-5 cm) elektronik cihazlar arasında çok kısa sürede (100 ms) iletişim kurarak güvenli bir temassız ara yüzden 424 kbps’e kadar hızlarda tüm dünyada boş olan 13.56 MHz frekansında çalışmaktadır. ISO 18092 ile standartlaştırılan NFC, mevcut temassız ödeme ve ISO 14443 standardına dayanan biletleme altyapılarıyla uyumludur. NFC, tipik olarak birkaç santimetre olan kısa bir çalışma kapsamına sahiptir ve radyo frekansı ile tanımlama (RFID) teknolojisi ve temassız akıllı kart altyapısıyla birlikte çalışır. NFC’ yi kullanırken, telefonunuz diğer cihazlarla iletişim kurabildiği gibi RFID servisi kısayol etiketlerinden küçük miktarlarda veriyi de okuyabilir. Bu yüzden, telefonunuzu bir RFID etiketine dokundurduğunuzda, etiketin içinde olan servis kısayolu başlatılır. RFID etiketlerini cüzdanınızda ya da cebinizde saklayabilir ya da posterlerin içine yerleştirebilirsiniz. Ayrıca NFC telefonunuzu kullanıp boş bir RFID etiketine veri koyarak kendi kişiselleştirilmiş hizmet kısayollarınızı oluşturabilirsiniz. NFC, kişiselleştirilmiş hizmet kısayollarınızı diğer NFC özelliğine sahip cihazlarla paylaşmanızı sağlar. Dahası, telefonunuzu bir NFC kredi kart okuyucusuna ya da bilet girişine dokundurarak işlem yapabilirsiniz. Kredi kartı, müşteri kartı ya da yolculuk bileti gibi ödeme bilgileriniz telefonunuzun içindeki entegre akıllı kartta güvenli bir biçimde saklanır.

Sizlerde bu yeni teknolojiyle tanışmak istiyorsanız www.bonusluavea.com adresini ziyaret ederek hemen başlayabilirsiniz.

Alıntı yaptığım yeri eklemeyi unutmuştum , özür dileyerek hemen belirtmek istiyorum.
Bu arada,teknoloji ve development üzerine ilgi duyan arkadaşlara, Cem Kefeli'nın sitesinide şiddetle tavsiye ediyorum.

Not:Üstteki makale , aşşağıda yer alan adresten alıntıdır!!!
http://www.cemkefeli.com/post/2010/12/07/Aveadan-Turkiyede-ve-dunyada-bir-ilk-NFC-teknolojili-BonusluAvea.aspx
Kaynaklar: Avea, Donanımhaber Forum, wikipedia, gelecekonline

Sende Yaz, Farkın Olsun!!!

6 Ağustos 2010 Cuma

JPA Mucizesi (Java Persistance API)




Evet , mucize diye başlık attım çünkü gerçekten mucizeler yaratıyor :) Kısaca bahsetmek istiyorum JPA'den.

Kimdir JPA,nedir,ne işe yarar , nerde kullanırız,kullandığımıza değermi?

Sırayla bu soruların tamamına cevap vermeye calısıcam ve fırsat bulursam kısa bi zaman içerisinde JPA yöntemiyle yapmıs oldugum basit bi örnek ve daha sonrada JPA le yaptıgım ve bi önceki makalemde bahsettiğim RMI yontemiyle ilişkilendirilmiş Server-Client Application bi örnek yazıcam.




O zaman sırayla baslıyalım soruları cevaplandırmaya.

Nedir bu JPA?
Java Persistence API; ilişkisel verilerin(Relational Data) , Java nesneleriyle nasıl ilişkilendirilieceği, bu nesnelerin ilişkisel veri tabanında(Relational DataBase) daha sonra erişilmeye elverişli şekilde nasıl tutulacağı ve kullanan uygulama sona erdikten sonra da varlığın devamlılığının nasıl sağlanacağı ile ilgilenir.Varlık kalıcılık modelinin(Entity Persistance Model) basitleştirilmesi yanında Java Persistence API
nesne ilişkisel eşlemeyi standartlaştırır. Daha genel bilgilerle açıklicak olursak , Farzedelimki bi projede mysql kullandınız daha sonra aynı projeyi mssql ' e taşımak istediniz.Yapmanız gereken iş çooook tabi JPA kullanmadıysanız.Eger JPA ile tasarlanmıs bi proje ise , JPA veri tabanıyla ilişki kurarken hangi veri tabanının driver'ını gösterdiyseniz onun la ilişkiye içerisinde oluyor ve verileri cok rahat bi şekilde veri tabanına işliyo.Çünkü JPA kendine has çok basit bi querylanguage kullanıyor yani select yapıcagınız zaman,kendiniz bi query olusturuyosunuz ve JPA nın formatında bi query oluyo , daha sonra alt tarafta hangi veri tabanını koyarsanız koyun , driverını JPA'a gösterdikten sonra sorun yok, o sizin yazdıgınız queryleri arka tarafta hangi veri tabanı varsa onun anlayacağı dile çeviriyor ve işleminizi yapıyor.Sakın demeyinki bide JPA query yazmayımı öğrenicez diye ,neredeyse bildigimiz query tamamen aynı sadece falzadan ":" karakteri falan var.Güya ayrı bi query language olusturduk hesabı.Şunu da belirtmeliyim ki bircok method zaten JPA de kullandıgımız Entity'mizin içinde tanımlı.Yani silmek(remove method) , eklemek(persist method) , bulmak(find method) , kendi içerisinde tanımlı.Ama query konusunda bagımsızlık olması gerektiğinden dolayı(çünkü cok specific bi query yazmak isteyebilirsiniz) size kendi query nizi olusturma imkanı veriyor ve onu alıp kullanacagı veri tabanının diline çeviriyor.Ne denebilirki.PERFECT! :)

JPA Ne işe yarar?

Ne işe yaramazki diyebiliriz aslında , çünkü bu daha çok sizin kullanım şeklinize baglı fakat örneklicek olursak yukardada yazdıgım üzere; projenizin altındaki database'i kaldırmak istediginiz de , sizi bütün kullandıgınız queryleri değiştirmek zorunda bırakmaz çünkü zaten siz projeyi JPA kullanarak yaptıysanız o zaten kendi dilini kullanmıstır ve veri tabanın değişmesi umrunda olmaz , driver'ını gösterirsiniz o bütün queryleri kendisi o veri tabanının diline çevirir.

JPA Nerelerde Kullanılır?
Valla şöyle bi düşününce aslında kullanmak çok mantıklı gözüküyor.Özellikle cok fazla sorgulama(query) içeren uygulamalarda verimli bi şekilde kullanılabilir.

JPA Kullandığımıza değermi?

Dogrusunu söylemek gerekirse , bu soruyu soran kişiler için sölüyorum , demek ki şu ana kadar herhangi bi proje'yi farklı bi veri tabanına taşımayı denemişler yada taşımışlar ama hiç üşenmemişler.Kısaca "Tabiki DEĞER..."
Fırsat buldugum en kısa zamanda örneklendiricem.Umarım ufkunuzu açmıştır ve faydalı olmustur.Sende Yaz , Farkın Olsun!!!

29 Temmuz 2010 Perşembe

Java ' da RMI (Remote Method Invocation)



Selamlar ,artık mümkün oldugunca Java üzerine de bişeyler yazmaya çalışıcam.Günümüzde Mesajlajma ve msn tarzı sohbet programlarının kullanımı cok yaygın oldugundan bu olayın temeliyle ilgili bi konudan bahsetmek istedim.Öncelikle RMI kısaltmasının Türkçe açılımı "Uzaktan Metod Çağırımı" demektir.Adından da anlaşılacağı üzere , iki ayrı objenin bir interface ( Arayüz ) aracılığıyla , birbirleri arasında server - client (sunucu - istemci) ilişkisi oluşturmada kullanılan bir yöntemdir.Daha genel olarak yazıcak olursak ; Bir cihaz üzerinde çalışan Java nesnelerinin, başka bir cihaz üzerinde çalışan diğer Java nesnesinin metodunu çağırmasını sağlar. Bu önemli özellik dağıtık uygulamalar geliştirilmesine izin verir.

Genel şablon şu şekildedir :




Çok basit bir RMI örneğini resimlli ve açıklamalı olarak paylaşmak istedim.

İlk olarak oluşturmamız gereken nesnelerimizi belirliyelim;

1)Server (Sunucu) görevi yapan objemiz;
2)Client (İstemci) görevi yapan objemiz;
3)Her iki taraf tarafından da kullanılabilen bir Interface (Arayüz);
4)ve bu interface' i (Arayüz) implment edicek olan objemiz.

İstersek arada baglantı saglicak olan interface'imizi implement etmek için ayrı bir nesne

oluşturmayıp diğer nesnemiz içinde de implement edebilirdik fakat kodun anlasılması

acısından ve temizliği acısından bu sekilde yazılması daha faydalı olucaktır.

Gelelim program tarafına ;

1.Kısım'da Server isimli class'ımızı yazalım ;

import java.rmi.registry.Registry;//Registry' mizi oluşturmak ve

import java.rmi.registry.LocateRegistry;//yerleştirmek için paketlerimizi dahil ettik

//Ben isim olarak ServerClass dedim;

public class ServerClass {

public ServerClass() {


try {//Try catch kullanımına kendimizi alıştırmamız lazım ki ne gibi hatalar aldıgımızı //görelim

Registry myregistry=LocateRegistry.createRegistry(1099);//Öncelikle kendimize Default olan

//1099 portunu ayırdık

myregistry=LocateRegistry.getRegistry();//Ve bu portu aldık.

myregistry.rebind("MesajServisi",new ImplementSender());//Bind(Baglamak) kelimesinden

//de anlaşıldığı gibi , MesajServisi ismini verdiğimiz sunucuya,interface'mizi implement eden

ImplementSender isimli nesneyle geçiş yapacagımızı belirttik.

System.out.println("Server is Working...");//Ve Server'ın Çalıştıgı uyarısı için bir output aldık.

} catch (Exception e) {//Try'ın içerisindeki olası bir Exception(İstisna) durumunda 'e' içerisine //gömülü hatayı getiricek.

System.out.println("Registry Olusturulan Kısımda Hata: "+e);//Hata Output'unu vericek
}
}

public static void main(String [] args) {


new ServerClass();//Ve burda objemizin bir instance(Örneğini) olusturarak server'ı calıstırdık.
}
}


2.Kısım'a gelicek olursak Client nesnesini oluşturucaz ;

//Her zamanki gibi , ilk olarak kullanacagımız tanımlı objeleri ve

// methodları barındıran paketlerimizi dahil ettik.

import javax.swing.*;

import java.rmi.Naming;

import java.rmi.RemoteException;

import java.net.MalformedURLException;

import java.rmi.NotBoundException;

//Ben isim olarak ClientClass dedim;

public class ClientClass//Direk olarak main method içerisinde interfaceimizin bir instance'ını
//oluşturduk ve Naming.lookup yaparak , yazdıgımız url'nin referansını döndürmesini sagladık
{

public static void main(String [] args)
{

try
{
SenderInterface senderinterface=(SenderInterface)Naming.lookup("rmi://127.0.0.1

/MessageService");//127.0.0.1 yerine localhost'da yazabilirdik,zaten o anlama geliyor.

//Cunku suan local de calıstırıyoruzki,mesajlaşmamızı görebilelim.

for(int i=0;i<6;i++)
{
//Burda ben sonlandırmak için kısa bi döngü olusturdum;

//Bunu siz istediginiz takdirde kullanıcılar cıkıs yapana kadar uzatabilirsiniz.Suan 6 kere

//mesajlaşıcaklar

StringFirstMessage=senderinterface.getData(JOptionPane.showInputDialog("Gonderilmek

İstenen Mesaj:\nKullanıcı 1 Mesaj Alanı:\n")); //1 nolu kullanıcının mesajı String

SecondMessage=senderinterface.getData(JOptionPane.showInputDialog("Gonderilmek

İstenen Mesaj:\nKullanıcı 2 Mesaj Alanı:\n"));//2 nolu kullanıcının mesajı
}
}

// import java.rmi.RemoteException;

// import java.net.MalformedURLException;

//import java.rmi.NotBoundException;

// Bize uyarı vermeleri için dahil ettiğimiz bu paketlerin sonunda Exception yazması demek;

//oluşacak Exception'ın kullanıcıya throw edilmesi (fırlatılması ) demek.Buyüzden hepsi

//için ayrı ayrı cacth yazmak zorundayız.

catch (RemoteException RMTException)
{
System.out.println("RemoteException Hatası: "+RMTException);
}
catch (MalformedURLException Murle
)
{ System.out.println("Malformed URL Exception Hatası : "+Murle);
}
catch (NotBoundException NotBound)
{
System.out.println("NotBoundException Hatası: "+NotBound);
}
}
}

Ve şimdide gelelim 3.Kısım'a: Interfacemizi oluşturalım ;

import java.rmi.*; //Ben isim olarak SenderInterface dedim;

public interface SenderInterface extends Remote{ //Remote method olmasından dolayı

//Java'da tanımlı Remote Class'ına extends olması (Yayılması) lazım.

public String getData(String text) throws RemoteException; //Burda ise her iki tarafından

//da kullanacagı methodu yazıyoruz fakat method'un içeriğini , Implement ettiğimiz yerde ,

//yani ImplementSender class'ımızda(Sabit bir isim değildir,kendi verdiğim isimdir)

//tanımlayacagız.Bir diğer nokta ise,görüldüğü gibi bu method da RemoteException içeriyor

//ve bu da methodu kullanacagımız yerde try catch yazmalıyız anlamına geliyor , ki

//herhangi bir exception durumunda bize exception bildirebilsin. İsterseniz throw etmesini

//istemiyorum ,bana bi exception bildirmesin diyebilirsiniz tabiki , ama yazarken

//karsılasılacak hataların cabuk cozulebilmesi acısından şart;
}

Ve son kısım 4.Kısım' da ise oluşturdugumuz Interface'i implement edicek Class'ı yazıyoruz;

import java.rmi.RemoteException;//Yine Exceptionlarımız var import

java.rmi.server.UnicastRemoteObject;//Bu sebepten catch kullanmayı //unutmayalım.

public class ImplementSender extends UnicastRemoteObject implements SenderInterface
{
//UnicastRemoteObjesinin , java içerisinde tanımlı olan constructor'ını kullanacagız ve bu

//yuzden extdends UnicastRemoteObject yazdık ve yazdığımız Interface'i implement

//edebilmesi içinde sonuna Implements keyword'unu yazıp yanına implement edeceği

//interface'in adını yazdık.

static int cnt=1;//Static olarak tanımlamamın sebebi , her

//initialize edildiğinde 1'e eşitlenmesini istemememin sebebi,1 iken 1.kullanıcı yazıcak ,

// 2 iken 2. kullanıcı yazıcak.Bu ornek kod oldugu için o kısımlar istendiği gibi değiştirilebilir

public ImplementSender() throws RemoteException
{
super();//UnicastRemoteObject isimli sistemde tanımlı olan objenin constructor'ını

//çağırdık.
}
public String getData(String text) throws RemoteException
{
//Az önce Interface'in içerisinde boş bıraktığımız methodumuzu işte tam burda //tanımlıyoruz. Amacımız yollanan mesajın interface methodu ile alınıp, daha sonra diğer // objenin bu methodu cagırmasıyla içerisinde tasıdıgı string'i return ettirip diger objeye //tasımak.

if(cnt==0) { System.out.println("1. Kullanıcıdan Mesaj Geldi : ===>"+text);
cnt++;
return text;
}
System.out.println("2.Kullanıcıdan Mesaj Geldi : ===>"+text);
cnt--;
return text;
}
}
Programımızın Çalıştırılmasına gelince , doğal olarak ilk önce Server'ımızı yani ServerClass'ımızı çalıştırıyoruz ve daha sonra ise ClientClass'ımızı çalıştırıyoruz.Ve karşımıza direk yollayacagımız metni isteyen kutu cıkıyor.

Alttaki Screen Shotlardan programın Çalışırken ki görüntüsüne bakabilirsiniz.



Ve işte Bu kadaaaaaar :) Bazı yerleri biraz fazla detaylı anlatmamın sebebi , daha alt seviyedeki
arkadaşların baktığı zaman "Burayı niye yazdık?" dememesi içindir.








Kodun Direk Olarak Çalıştırılabilir halini yorumsuz olarak alt kısıma koyuyorum.
Bu programın kodlarını yazarken IDE olarak Eclipse tercih edilmiştir.


import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


public class ServerClass {

public ServerClass() {


try {

Registry myregistry=LocateRegistry.createRegistry(1099);
myregistry=LocateRegistry.getRegistry();
myregistry.rebind("MessageService",new ImplementSender());
System.out.println("Server is Working...");

} catch (Exception e) {

System.out.println("Registry Olusturulan Kısımda Hata: "+e);
}
}

public static void main(String [] args) {


new ServerClass();
}
}


import javax.swing.*;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.net.MalformedURLException;
import java.rmi.NotBoundException;


public class ClientClass
{

public static void main(String [] args)
{

try
{
SenderInterface senderinterface=(SenderInterface)Naming.lookup("rmi://127.0.0.1/MessageService");
for(int i=0;i<6;i++)
{
String FirstMessage=senderinterface.getData(JOptionPane.showInputDialog("Gonderilmek İstenen Mesaj:\nKullanıcı 1 Mesaj Alanı:\n"));
String SecondMessage=senderinterface.getData(JOptionPane.showInputDialog("Gonderilmek İstenen Mesaj:\nKullanıcı 2 Mesaj Alanı:\n"));
}
}
catch (RemoteException RMTException)
{
System.out.println("RemoteException Hatası: "+RMTException);
}
catch (MalformedURLException Murle)
{
System.out.println("Malformed URL Exception Hatası : "+Murle);
}
catch (NotBoundException NotBound) {
// TODO: handle exception
System.out.println("NotBoundException Hatası: "+NotBound);
}


}




}



import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;


public class ImplementSender extends UnicastRemoteObject implements SenderInterface {

static int cnt=1;
public ImplementSender() throws RemoteException{
// TODO Auto-generated constructor stub
super();
}
public String getData(String text) throws RemoteException{
if(cnt==1)
{
System.out.println("1. Kullanıcıdan Mesaj Geldi : ===>"+text);
cnt++;
return text;
}
System.out.println("2.Kullanıcıdan Mesaj Geldi : ===>"+text);
cnt--;
return text;
}

}

import java.rmi.*;



public interface SenderInterface extends Remote{

public String getData(String text) throws RemoteException;

}

Umarım faydalı bir makale olmustur.Daha sonra görüşmek üzere.
Sende Yaz , Farkın Olsun!!!

26 Mayıs 2010 Çarşamba

SqlDataReader Kullanımı



Selamlar ;
Bazen tabloları hazır bir şekilde veri tabanından alıp , olduğu gibi DataGridView içerisine yerleştirmeye çalışırız , bu tip işlemleri SqlDataAdapter ve DataSet kullanarak çok rahat birşekilde gerçekleştirebiliriz.Ama bu yöntemle , doldurduğumuz DataGridView Kolonları(dikey) veri tabanındaki tuple (Aynı Türden Veriler Demeti) isimleriyle Data Grid'e yerleşirler , yada bazen bütün tuple ları DataGridView e eklemek istemeyiz , sadece bazılarını göstermek isteriz.Bunları aynı mantıkla yapmak mümkün fakat SqlDataReader bu konuda büyük rahatlık sağlıyor.SqlDataReader while döngüsü kullanılarak içerisinde tuple ları tek tek çektiği için , ayrı ayrı yerleştirme imkânı da sağlamış oluyor.Yani 3.kolondaki verilerle 7.kolondaki verilerin yerini çok rahat değiştirebilirsiniz.Sadece DataGridView kullanımında değil tabiki , her türlü veri çekme işleminde çok kolay bir şekilde SqlDataReader kullanabiliriz.Mesela bir combobox 'u , veri tabanından çekeceğim illerin ismiyle doldurmak istedim diyelim.Hemen Reader kullanımını burda kısaca 2 -3 satır göstericem fakat alt tarafda resmi yerleştirdim , oraya tıklayarak Kodları inceleyebilirsiniz.
Örnek:
Tabiki öncelikle SqlConnection oluşturuyoruz
SqlConnection baglantim = new SqlConnection("Data Source=Bilgisayarınızınadı;Initial Catalog=DataBaseAdı;Integrated Security=True");
daha sonra bu baglantıyı açmamız gerek;
baglantim.open();
şimdi de veri tabanına ne yapmak istediğimizi belirticek olan SqlCommand satırını yazalım;
SqlCommand cmd=new SqlCommand("select * from iller",baglantim);

Sonrasında myreader isimli SqlDataReader oluşturuyoruz;
SqlDataReader myreader;
Query imizi içine yazıp yada üst te bir string içerisine yazıp SqlCommand içerisinde o stringi yazıp , cmd.ExecuteNonQuery(); şeklinde çalıştırabiliriz; fakat bu noktada
değişen bir şey var.Direk olarak Query mizi çalıştırmak yerine , myreader isminde oluşturduğumuz SqlDataReader objemize atıyoruz.Yani myreader=cmd.ExecuteReader(); diyoruz.
Daha sonra while(myreader.Read()) şeklinde bir döngü oluşturuyoruz.Yani myreader isimli objemiz , veriler bitene kadar tek tek verileri alıcak.
Bu döngü içerisinde , her seferinde gelen verileri ne yapacagımızı yazıyoruz.Mesela comboBox ımıza veri tabanımızda kayıtlı olan illerimizi yerleştirelim.

while( myreader.Read() )//bitene kadar okuyacak
{
comboBox1.Items.Add(myreader.GetValue(0).ToString());
}



İllerimizi combobox ımıza yerleştirmiş olduk.Yukarıda SqlDataReader'ın degerlerini GetValue fonksiyonu ile aldık.Dikkat ettiyseniz myreader.GetValue(0).ToString() yazdık.Yani iller isimli tablodaki ilk tuple ı aldık.Varsayalım ki ,veri tabanımızda öğrenciler isimli bir tablomuz var.Tablomuzda isim,soyisim,yas,cinsiyet olsun.Biz sadece Soyisim ve yaşı almak istiyoruz; o zaman myreader.GetValue(1) diyerek soyismi, myreader.GetValue(2) diyerek yaşı çekebiliriz.Daha sonra bu aldığımız değerleri while döngüsü içerisinde DataGridView ' e
dataGridView1.Rows.Add(myreader.GetValue(1).ToString(),myreader.GetValue(2).ToString());
diyerek DataGridView ' e sadece Soyisim ve Yaşı eklemiş olduk.


Alt kısımda ki resime tıklayarak , comboBox için kodların Visual Studio üzerinde ki görünümünü büyütebilirsiniz.Bu kodları aynı mantıkla DataGridView kullanımı yada kendi isteğinize göre de modifiye edebilirsiniz.



Umarım Yardımcı Olmuştur. Sende Yaz , Farkın Olsun...

25 Mayıs 2010 Salı

Tek Bir Fonksiyonla Bütün TextBox ları Temizlemek


Selamlar,Bazen yazdığımız programlarda o kadar çok TextBox oluyor ki,"temizle" butonunu oluşturmaya korkuyor insan.Ama korkmayın:)Yazacağımız küçük bir fonksiyonla bu dertten kurtuluyoruz.


Nasıl mı? Şu şekilde ;
TextBox larımızın bulunduğu forma çift tıklayalım(Yada Solution Explorer'dan sağ Tıklayıp View Code da diyebilirsiniz).


Formun kod kısmına girmiş bulunduk.Burada fonksiyonumuzu oluşturalım.


Buyrun Altta Direk Kopyalanıp Kullanılabilir Halini Veriyorum...


private void temizle()
{

foreach (Control c in Controls)
{

if (c is TextBox)
if (c.Text != "")
c.Text ="";
}
}

Fonksiyonumuzu oluşturduktan sonra , hangi buton tıklandığında çalışacak ise o butonun Click_Event kısmında çağırıyoruz.

private void button1_Click(object sender, EventArgs e)
{
temizle();
}

Daha net anlaşılması açısından alttaki yorumlanmış halinede bakabilirsiniz.

private void temizle() // Temizleme Fonksiyonumuz

{
foreach (Control c in Controls)//control tipinde c diye bir değişken oluşturduk ve foreach ile tek tek formumuzdaki bileşenleri çekiyoruz

{
if (c is TextBox)//if içerisinde gelen parametre bir textbox mı diye kontrol ediyoruz , TextBox ise İçerdeki "if" yapısına giriyoruz
if (c.Text != "")//Eğer gelen Textbox boş değil ise
c.Text ="";//Gelen TextBox'un textini boş yaptık...
}

}
private void button1_Click(object sender, EventArgs e)

{
temizle();//Butonumuza Tıkladığımız anda bu fonksiyon çalıştırılacak.
}

Bu kodu ComboBox , CheckBox , vs. olarak modifiye edebilirsiniz.Kendinize Göre Uyarlayıp Şekillendirebilirsiniz.
İşte Bu Kadar Basit :)
Umarım Faydalı Olmuştur.Sende Yaz , Farkın Olsun!!!