Aklımda Kalası Kelimeler

* давайте работать вместе
* Zarf ve Mazruf, Zerafet(xHoyratlık) ile aynı kökten(za-ra-fe) gelir
* Bedesten
* Suç subuta ermiştir - Suç sabit olmuştur

25 Ekim 2009 Pazar

Java da Thread

Threadi tanımak için bu makaleyi okuyabilirsiniz.
Öncelikle java Thread sınıfı ve Runnable interfacesini bize hizmet etsinler diye verir. Thread sınıfının Runnable arayüzünün implemente edilmiş sınıfların objesini kabul eden bir yapıcı metodu vardır. Java da bir kalıtım yapacak olursak ancak bir sınıftan extend edebiliriz(Single Inheritance).


SINGLE INHERITANCE:
Bu da java da single inheritance olarak geçmektedir. Peki biz bir sınıf yaratalım ve ata sınıfı A olsun. Ama aynı zamanda sınıfımızda Thread işlemleri de yapabilmek için Thread sınıfından türetelim. Bunu aşağıdaki gibi yapmak gerekiyor.

class A {
// falanda filan
}

class B extends A, Thread{ // Hata verecektir. Single Inheritance a göre.
// falanda filan
}

Ama burada hata oluşur çünkü Hem A sınıfından hem Thread sınıfından sınıfımızı extend edemeyiz.


Single Inheritance yüzünden bizde Runnable arayüzünü kullanırız. Böylece Thread işlemlerine kendi sınıfımızı sokabiliriz.

class B extends A implements Runnable{
// Falanda filan
}



Yazdığınız herhangi bir java programının başlangıç yordamı public sınıfın main metodudur. Bu metod işlerken standart program için bir Thread oluşur ve program sonlandığında Thread’ da sonlanır. Ancak bununla birlikte bir sınıf içindeki diğer yordamlarında hem programın bir parçasıymışçasına hem de programdan bağımsız işlemci gücü kullanarak çalışması Thread sayesinde yapılabilir. Bu iş parçacıkları ana iş parçacığı içinden yönetilebilir. Ref:JAVA İçinde Thread Kullanımı



Thread Önceliklerini Belirlemek




Bunun sonucunda çıktımız aşağıdaki gibi olacaktır. Artık first thread ilk çalışıyor dikkat ederseniz.


Arkaplan ve Önplan threadleri (Foreground, Background Threads)



thObj.setDaemon(true); // Background Thread olsun

ile threadimiz background thread olarak çalışır. Uygulama bitirilmek istendiği zaman background threadler kapanmayı geciktirmez.Ama foreground threadler bitirilmeden uygulama kapatılamaz.
Kodumuz aşağıdaki gibi olacak:


Sonuç foreground thread olduğu için ikinci thread bitinceye kadar bekleyecek şekilde yani aşağıdaki gibi olacaktır.

10 sn bekleme bittikten sonra;


Threadi Durdurmak


Bir threadi durdurmak için önceden stop() fonksiyonu kullanılırken şimdilerde abilerin tavsiyesi ile bir şart değişkeni kullanılarak işleyiş durdurulmalıdır.

public class Thredim extends Thread{
public void run(){
while(!timeToStop){
// birşeyler yap
}
}

void StopToRunning(){
timeStop= true;
}

}

23 Ekim 2009 Cuma

Biraz ağ yapıları




Bir protokol katmanı yazılım, donanım veya ikisinin birleşimiyle uygulanabilir.

 

Uygulama katmanı, ağ uygulamalarının ve bunların uygulama katmanı protokollerinin bulunduğu yerdir. Uygulama katmanında gidip gelen bilgi paketlerine mesaj denir. Sunucu – istemci uygulaması geliştirdiyseniz (geliştirmediyseniz dert etmeyin o da olur) sürekli mesaj alır, mesaj gönderirsiniz. Bağlantı sağlandığında bir mesaj, istemciden gönderilen bilgi(mesaj) sunucu tarafında alındğında bir mesaj v.s.


DNS (Domain Name System) bir uygulama katmanı protokolüdür. Resimde görüldüğü gibi FTP, HTTP, Telnet v.s. protokolleri de uygulama katmanı protokolleridir ve protokol seviyesi fiziksel katmana hitap etmez.

Evimize ilkokul 5 e giden oğlumuzun arkadaşı misafir olarak gelsin.

Misafirin

  1. kapıda karşılama işi,
  2. kapının açılması,
  3. "hoşgeldin" diyerek içeri buyur edilmesi,
  4. montunun teslim alınması,
  5. kapının kapatılması,
  6. odaya götürülmesi
işini (protokolünü) eşimiz yapsın.

Sonra misafiri
  1. odasında ağırlaması,
  2. oyuncaklarını paylaşıp,
  3. getirilen kurabiyeyi ikram edip,
  4. bilgisayar oyununu açıp,
  5. hır çıkartması

işi (protokolü) oğlumuzun olsun.

Oğlumuzun yaptığı işi uygulama katmanı protokolü olarak düşünürsek, firefox internet gezgini HTTP protokolünün gereklerini yerine getirebilir. Ama bu demek değildir ki; HTTP protokolü fiziksel katmanıda içerir. Örneğimize dönersek, misafirimizin kapıdan geçirilmesi işi (protokolü) oğlumuzun protokolü içinde değildir. Protokoller bir ya da birden fazla katmanı içerebilir.

Aynı zamanda bu katmanlardaki işleri ayrı ayrı protokoller ile uygulamalar ya da cihazlar yapabilegceği (ya da herikisinin yapabileceği ) gibi tüm bu protokollerin tek bir protokol içinde tanımlanması da mümkündür.

Hadi örneğimizi SMTP protokolü üzerinden genişletelim. SMTP outlook gibi bir uygulamanın genellikle 25 numaralı bir port üzerinden uzaktaki sunucuya bağlanarak çeşitli komutlarla TO, FROM, SUBJECT, BODY gibi bilgileri(iletimizi) (protokole göre bu bilgilerin kimisi mecburi kimisi aseçimlidir) çeşitli komutlarla gönderdiğimiz protokoldür.

Anladığınız üzere SMTP protokolü, outlook programı ile sunucu üzerindeki ileti hizmeti veren programın önceden tanımlanmış, kurallara göre karşılıklı konuşmasıdır. Veeee UYGULAMA KATMANI seviyesinde çalışır.

 

Taşıma katmanı, uygulama katmanı mesajlarını uçtan uca TCP/IP, UDP, DCCP, SCTP protokolleri ile (yaygın olarak TCP/IP ve UDP) ile taşır.Taşıma katmanı paketine segment denir.

TCP, uzun mesajları daha kısa segmentlere böler ve böylece tıkanıklık kontrol mekanizması sunar. Ağ tıkandığında kaynakta iletim hızı düşürülür.

Çeşitli

ICMP = Internet Control Message Protocol
IGMP = Internet Group Management Protocol

Aşağıdaki 4 protokol OSI nin taşıma katmanında (Transport Layer) çalışırlar.
UDP = User Datagram Protocol
TCP = Transmission Control Protocol
DCCP = Datagram Congestion Control Protocol
SCTP = Stream Control Transmission Protocol

22 Ekim 2009 Perşembe

Biraz ağ programlama 1

  • Elimden gelirse, (aklıma da gelirse tabii) network programlama serisini yazmaya çalışırım.

    TCP, UDP nedir? IP nedir? Gibi sorularınız varsa en güzel kaynak budur. Daha ucuza sitelerde var bakın derim.

    Bir uç sistemden (sizin bilgisayarınız) diğer bir uç sisteme(ziyaret ettiğiniz siteyi barındıran sunucuya) veri gönderilmesi gerektiğinde (sizin talebiniz, sunucunun cevabı gibi veriler) gönderici uç sistem verileri segmentlere ayırır ve her segmente başlık byte ları ekler. İşte paketimiz hazır. Bu paketler bir uç sistemden yola çıktığında (http://www.harthurt.com/ adresini talep ettiğinizde ya da sayfa sizin bilgisayarınıza gelmeye başladığında) internet bulutunda bazı cihazlara (yönlendiricilere -router-) sora sora adresi bulur. Bu yolculuğa paketler, TCP/IP protokolünde belirlenen biçimlere göre kutulanır ve gönderilir. Detay.

    Basit bir çizimle web sitesini görmek için adresini internet gezginine yazdığımızda oluşan trafik aşağıdaki gibidir:

Çizim için referans: blog.monstuff.com

Bir telnet ile uzaktaki ileti sunucumuza 110 portundan bağlansaydık neler olurdu? (Yani POP3 -Post Office Protocol Version 3- bağlantısı kursaydık)
Kalın yazılmış olanlar benim komut olarak gönderdiklerim. Altlarındakilerse gelen cevaplar.


C:\Users\User>telnet mail.sunucuAdi.com 110
+OK Welcome to MailEnable POP3 Server
USER cem@sunucuAdi.com
+OK
PASS sifremBudur
+OK
STAT
+OK 3 72349
RETR 1
+OK 24045 octets
Received: from ([127.0.0.1]) with MailEnable ESMTP; Mon, 19 Oct 2009 01:57:19 +0300
Received: from 84.123.214.26 by rly2.ypf.com.ar; Mon, 19 Oct 2009 00:56:36 +0100
Message-ID: <000d01ca5046$3eb6f170$6400a8c0@incompletely>
From: "Manager Andrea Best" <shop@compusa.com>
To: <cem@tekfark.com>
Subject: Your order has been paid! Parcel NR.9704
Content-Type: text/plain
Your mail 10.130.214.77:54409->212.146.137.72:110 contains contaminated file _From_Manager_Andrea_Best___shop_compusa.com___Date_Manager_Andrea_Best___shop_compusa.com___SubjYour_order_has_been_paid__Parcel_NR.9704_/_DHL_print_label_f532c.zip_/DHL_print_label_f532c.exe with virus Packed.Win32.Krap.x, so it is dropped. virus description: http://www.viruslist/.com/en/search?VN=Packed.Win32.Krap.x

.

QUIT

+OK Goodbye
Connection to host lost.

C:\Users\User>




Demek ki 110 portunda sunucuda bekleyen uygulama benimle kendince belirli bir sırada sorulara cevap veriyor. (İleti sunucusu ile karşılıklı konuşmak ile ilgili kaynak.)

Şimdi bir socket bağlantısı kurmamız gerekecek 110 üzerinden sunucudaki uygulamaya erişebilmek için. O zaman TcpClient sınıfından bir nesne ile bu işi yapabiliriz. (Java'da Socket sınıfı)


C#
TcpClient tcpClient = new TcpClient("mail.sunucuAdi.com", 110);

Java
Socket socket = new Socket("mail.sunucuAdi.com", 110);


Hadi şimdi bağlantıyı açalım. (Zaten yapıcı metot açıyor ama olsun)

if(!tcpClient.Connected){
tcpClient.Connect("mail.sunucuAdi.com:110");
}

//ya da

IPAddress ipAdres = IPAddress.Parse("192.168.1.45");
IPEndPoint ipEndPoint = new IPEndPoint(ipAdres, 110);

if(!tcpClient.Connected)
tcpClient.Connect(ipEndPoint);

Bağlandıysak bize "+OK Welcome.........falanda filan" gelecek. Bakın müspet cevap + ile başlıyor. Demek ki menfi olanı - olacak. Eksi görürsek anlarız ki hata aldık. Peki bu gelen mesajı nasıl alacağız? Bunu da NetworkStream sınıfından bir nesne ile yapacağız(Gözünü sevdiğim Türkçe). NetworkStream nesnesi ancak bağlantılı bir socket varsa yaratılabilir(Yani NetworkStream sınıfının yapıcı metodu bir Socket nesnesi istiyor). NetworkStream ile açılan soket üzerinden stream alıp verebileceğiz (komut gönderip, yanıtlarını alabileceğiz). Peki aldığımız bu yanıtları nasıl ekrana taşıyacağız? Bunu birazdan cevaplayacağız ama önce bu soket nasıl tanımlanıyor, bağlantı nasıl açılıyor, soket bağlantısının nasıl özellikleri var diye bakalım.

İşte soket tanımlama ve bağlantı açma kısmı:

Socket socket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
socket.Connect("192.168.1.45", 110);
NetworkStream networkStream = new NetworkStream(socket);

// ya da

NetworkStream networkStream = tcpClient.GetStream();


Biliyoruzki Socket sınıfı çeşitli yapıcı metotlar ile tanımlanabiliyor. Burada dikkatinizi çekmek istediğim nokta şu ki;
  • AddressFamily enumu içinde IPV4, IPV6, AppleTalk v.s. gibi adres tiplerini,
  • SocketType enumu içinde Stream, Dgram, Raw v.s. gibi bağlantı tipleri ile bağlantının güvenilirmi, iki ya da daha fazla bağlantı açılıp açılmayacağını, başlangıçta bir bağlantının gerekli olup olmadığı gibi bilgileri barındıran soket tipini,
  • ve ProtocolType enumu içinde bu bağlantı üzerinde hangi protokolü kullanacağımızı belirliyoruz.


Yani bir soket için bu üç bilgiye ihtiyacımız olduğuna dikkat etmeliyiz.

AddressFamily
SocketType
ProtocolType



Burada dikkat etmemiz gereken, ileti sunucusunun 110 portu ile kendi makinemizin 57579 portuna soket bağlantısı kurulmuş olmasıdır. Bu soket bağlantısını da 1688 Handle ile windows aklında tutuyor.

19 Ekim 2009 Pazartesi

Yalnız başınızayken kalp krizi geçirirseniz?

Diyelim ki, mesai saati bitti ve siz de akşam 18:30 civarında, alışılmadık derecede zorlu bir iş gününün ardından (tabii ki tek başınıza) arabanıza binip evin yolunu tuttunuz. Çok yorgunsunuz ve canınız da fena halde sıkkın ve sinirli bir haldesiniz.

Birdenbire göğsünüzde, kolunuza ve çenenize doğru yayılmaya başlayan korkunç bir ağrı hissediyorsunuz. En yakın hastaneye sadece on dakikalık mesafedesiniz ama hastaneye ulaşmayı başarıp başaramayacağınızdan bile emin değilsiniz.


Yalnız başınızayken kalp krizi geçirirseniz nasıl hayatta kalırsınız?

Pek çok insan kalp krizi geçirdiği sırada tek başına oluyor; etrafta yardim edecek kimse bulunmuyor. Kalp atışları düzensizleşen ve kendisini bayılacakmış gibi hisseden birinin bilincini yitirmeden önce yalnızca 10 saniye kadar zamanı vardır. Bu durumda ne yapmanız gerekir?

Cevap:
Paniğe kapılmadan üst üste kuvvetlice öksürmeye başlayın.

Arabanızı sağa çekin motoru durdurup dörtlüleri yakin arabanın arkasına geçip sırt üstü yere yatın ayaklarınızı arabanızın bagajına doğru yukarı kaldırın ve öksürmeye başlayın öksürmeden önce her seferinde derin bir nefes alin; öksürükleriniz güçlü olsun, derinden gelsin ve uzun sürsün, tıpkı göğsünüzde birikmiş balgamı atmaya çalışır gibi öksürün.

Her iki saniyede bir derin nefes alıp öksürün ve bunu ya yardim gelene dek yada kalp atışlarınız tekrar normale dönene dek sürekli yapın. Sakin arabanızın içinde oturmayın bu esnada sizi gören insanlar yardim edeceklerdir.

* Derin nefes almak ciğerleri oksijenle doldurur.
* Öksürmek kalbe tazyik yapar ve kan dolaşımını rahatlatır.
* Kalbe uygulanan bu tazyik, kalbin normal ritmine dönmesini kolaylaştırır.
* Bütün bunlar size, bilincinizi kaybetmeden önce hastaneye yetişecek zamanı tanir.
* Ayaklarınız yukarı doğru kaldırılmış olduğundan vücudunuzdaki bütün kan kalbe basınç yapacaktır.
* Bu pozisyonda yatmak kalbin normal çalışmaya düzenine geçmesine yardımcı olur.

16 Ekim 2009 Cuma

Delegate ile Thread yaklaşımı.

Sözün Özü
Çünkü bu konuda çok örnek var. Ben sadece iki çok az daha farklı metot ile anlaşılırlığı birazcık daha arttırmak istedim. Ama esas vurgum en alttaki nota olacak. "this.InvokeRequired" herhangi bir delegate (beginInvoke) ile çağırıldığında TRUE olarak set ediliyor. Yani listbox1.InvokeRequired ya da button1.InvokeRequired doğrudan Main Thread den başka bir threade geçilmek isteniyor mu (BeginInvoke call edilmiş mi?) diye bakar. this.InvokeRequired, listbox1.InvokeRequired ya da button1.InvokeRequired ile de geçişi yakalayabilirsiniz.

Olayımız Nedir?

Butonumuz kırmızı ve gri olacak Timer1 nesnemizle her 3 saniyede. Bu arada thread bir for içinde dönecek 1000000... gibi bir sayıya ulaşıncaya kadar listBox1 içine item ekleyeceğiz.
Sonuç aşağıdaki gibi olacak:

Bunu aşağıdaki kodla yapabiliyoruz:


Aşağıdaki kodla da yapabiliyoruz:


NOT:
InvokeRequired required compares the thread ID of the calling
thread to the thread ID of the creating thread.

If these threads are different,it returns true.



namespace wfDelegate
{
public partial class Form1 : Form
{
private delegate void DelYeni();
private DelYeni delYeniBeginInvoke;

private delegate void DelSayListeyeEkle();
private DelSayListeyeEkle delSayEkle;


public Form1()
{
delYeniBeginInvoke = new DelYeni(YeniDelegate);
delSayEkle = new DelSayListeyeEkle(SayListeyeEkle);
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
delSayEkle.BeginInvoke(null, null);
}

void SayListeyeEkle()
{
for (int i = 0; i < 1000000000000; i++)
{
ListeyeEkle(i);
}
}

private bool b;
private void ListeyeEkle(object item)
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(
delegate
{
b = this.InvokeRequired;
delYeniBeginInvoke.BeginInvoke(null, null);
listBox1.Items.Add(item);
}));
}
}


void YeniDelegate()
{
if (this.InvokeRequired)
{
this.Invoke(new MethodInvoker(
delegate
{
button1.Width = 250;
}));
}
}

private void timer1_Tick(object sender, EventArgs e)
{
if (button1.BackColor == Color.Red)
button1.BackColor = Color.DimGray;
else
button1.BackColor = Color.Red;
}
}
}

12 Ekim 2009 Pazartesi

SOAP Sunucu istekleri nasıl işler


  1. İstemci tarafından HTTP istekleri olarak sunucumuza SOAP paketleri düşer.

  2. HTTP handler'a geçen bu istekler uygun SOAP servletine yönlendirilir. Servletimiz HTTP talebinin decode edilmesinden mesuldür artık.

  3. İstek SOAP sunucu tarafından işlenerek HTTP/SOAP encodera gönderilir.
  4. HTTP/SOAP encoderımız cevabı bir HTTP cevabına sarar ve SOAP servletimize geri gönderir.

  5. SOAP servletimizde istemcimize iletir.


SOAP için WIKIPEDIA ya bakabilirsiniz.

GODORO da güzel bir anlatım bulabilirsiniz

Webservisleri, RPC v.s. üzerine basit bir anlatımda benden

Okumaya başladığım kaynak bu. Yanında daha öz bir kaynakta buldum o da bu.
Çeviri yapmayacağım çok gerekmedikçe. İngilizce kaynaklardan nefret ediyorum. İsterdim ki hepsi türkçe olsun ve hepimiz sorunsuz anlayıp gelişen, geliştiren olalım. Ama ne kadar çevirirsen çevir bu dili anlamadıkça ilerlemek çok mümkün değil. O nedenle zamanı boşa harcamayalım 3, 4,5 inci dillerimizide öğrenelim.
Serileştirme üzerine bu makaleyi okuyabilirsiniz.
Bir Class Library projesi oluşturun ve yanına bir ASP.Net Web Servisi projesi ekleyin ve son olarakta Windows Form procesi ekleyin.

Kıymetli nokta;
  1. Bir ClassLib, bir Web Servisi, bir de Windows Form projesini bir solution altında toplayalım.
  2. Bir ClassLib projesinde tanımladığınız Book sınıfından bir nesneyi WebServisi procesinde HelloWorld metoduna parametre olarak verin.
  3. Windows Form a Web Referans olarak Windows Servisini verin ve HelloWorld metodunu çağırın.
  4. Windows Servisinin proxysini gözlemleyin ve görün elalem neler yapmış.

Bu makalenin üstüne ekleyeceğiz vakit oldukça (yetim bırakmazsak).

Alakasız bir not: kaynak
Differences Between XMLA Web Services and Generated Web Services
The major differences between XMLA Web services and generated Web services are:
�� Consumption capabilities. Generated Web services have a WSDL that is
customized for each stored process that is in the service. This enables client
application developers to create proxies that can create and read the XML
documents that are exchanged with the service. XMLA services are described in
the Discover call, so proxies must be manually created by the developer for calling
the service.
�� Attachments. XMLA Web services can process XML only. Generated Web services can read and write binary information by using attachments. For example, this means you can return graphs that are generated by ODS by using generated
services.
�� Output parameters. The only allowed output from XMLA is the _WEBOUT
stream. Generated services can return output parameters, the _WEBOUT stream,
packages (by using attachments), and data targets.
�� Deployment. To deploy a stored process for XMLA, you set the XMLA Web Service keyword. To deploy a stored process for a generated service, you use a wizard in the folder view of SAS Management Console.
�� Metadata. Generated Web services have metadata that can be accessed using SAS Management Console.

Having all the type information in the WSDL is better suited to most client
applications, and also makes things simpler for the developer.
Making the WSDL more specific to the actual parameters instead of having a generic interface enables you to simplify the request XML.
Making the WSDL more specific also makes the Web service more easily consumed by standard Web service client applications such as BizTalk, InfoPath, Word, SharePoint, Excel, AJAX, and WebSphere.

Generated Web services also support attachments. Attachments enable you to send
non-XML (binary) data with a SOAP request or response. Most stored processes
generate binary output (because they create reports that contain HTML and GIF
images). MTOM is currently supported by .NET and the Apache Axis2 Web Service
stack.

IFormatter ve Serialization

Referans: MSDN
Örnek: chsarpnedir.com
The SoapFormatter and BinaryFormatter classes implement the IRemotingFormatter interface to support remote procedure calls (RPCs), and the IFormatter interface (inherited by the IRemotingFormatter) to support serialization of a graph of objects. The SoapFormatter class also supports RPCs with ISoapMessage objects, without using the IRemotingFormatter functionality.

During RPCs, the IRemotingFormatter interface allows the specification of two separate object graphs: the graph of objects to serialize, and an additional graph containing an array of header objects that convey information about the remote function call (for example, transaction ID or a method signature).

RPCs that use the BinaryFormatter separate into two distinct parts: method calls, which are sent to the server with the remote object containing the method called, and method responses, which are sent from the server to the client with the status and response information from the called method.

During serialization of a method call the first object of the object graph must support the IMethodCallMessage interface. To deserialize a method call, use the Deserialize method with the HeaderHandler parameter. The remoting infrastructure uses the HeaderHandler delegate to produce an object that supports the ISerializable interface. When the BinaryFormatter invokes the HeaderHandler delegate, it returns the URI of the remote object with the method that is being called. The first object in the graph returned supports the IMethodCallMessage interface.

The serialization procedure for a method response is identical to that of a method call, except the first object of the object graph must support the IMethodReturnMessage interface. To deserialize a method response, use the DeserializeMethodResponse method. To save time, details about the caller object are not sent to the remote object during the method call. These details are instead obtained from the original method call, which is passed to the DeserializeMethodResponse method in the IMethodCallMessage parameter. The first object in the graph returned by the DeserializeMethodResponse method supports the IMethodReturnMessage interface.

11 Ekim 2009 Pazar

Java'da Kolleksiyonlar






package collections;

import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Vector;

public class Main {

public static void main(String[] args) {
HashMap hmap = new HashMap();
hmap.put(21, "0333154");
hmap.put(2, "433154");
hmap.put(4, "33154");
hmap.put(5, "75154");
hmap.put(21, "5675154");


}

public static void fVector() {
Vector vc = new Vector();
vc.add("Ankara");
vc.add("Zonguldak");
vc.add("Izmir");
vc.add("Ankara");

System.out.println(vc); //[Ankara, Zonguldak, Izmir, Ankara]
// Ankara yı iki kez girebildik (DUPLICATE olabildi)
// ve sıralama yapmadı.
// Vector ler LIST tir diyebiliriz.

Enumeration enm = vc.elements();
while (enm.hasMoreElements()) {
System.out.println(enm.nextElement());
}
}

private static void fHashMap() {
HashMap hmap = new HashMap();
hmap.put(21, "0333154");
hmap.put(2, "433154");
hmap.put(4, "33154");
hmap.put(5, "75154");
hmap.put(21, "5675154");
if (!hmap.containsKey(2)) {
hmap.put(2, "556665545");
}
Iterator itr = hmap.keySet().iterator();
while (itr.hasNext()) {
int key = (Integer) itr.next();
System.out.println("Key: " + key + " Value: " + hmap.get(key));
}
/**
Key: 2 Value: 433154
Key: 4 Value: 33154
Key: 21 Value: 5675154
Key: 5 Value: 75154
1-> Sıralamadığı için SET olduğunu anlayabiliyoruz.
2-> 21 keyini tekrar 5675154 değeri ile eklemedi.
3-> ContainsKey ile varlığını kontrol edebiliyoruz.
**/
}

private static void fHashSet() {
HashSet hs = new HashSet();
hs.add(21);
hs.add(6);
hs.add(1);
hs.add(3);
hs.add(9);


Iterator itr = hs.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
/* Sonuç:
1
3
21
6
9
**/
}
}

10 Ekim 2009 Cumartesi

Java'da Sınıflar arasında Throws işlemi.


Java'da Checked Exceptions

Referans: http://www.javaplex.com/blog/understanding-exceptions-in-java/
Checked Exceptions and Runtime Exceptions

When in a program, if you perform an operation that causes an exception—that is, an exception is hrown—you can always catch the exception (you will see how later in the chapter) and deal with it n the code. This is called handling the exception. Based on whether or not you are required to handle hem, the exceptions in Java are classified into two categories: checked exceptions and runtime xceptions.
Checked Exceptions
This is the category of exceptions for which the compiler checks (hence the name checked exceptions) o ensure that your code is prepared for them: prepare for unwelcome but expected guests. These exceptions are the instances of the Exception class or one of its subclasses, excluding the runtime Exception subtree. Checked exceptions are generally related to how the program interacts with its environment; for example, URISyntaxException and ClassNotFoundException are checked exceptions.
The conditions that generate checked exceptions are generally outside the control of your program, and hence they can occur in a correct program. However, you can anticipate (expect) them, and thus you must write the code to deal with them. The rule is: when a checked exception is expected, either declare it in the throws clause of your method or catch it in the body of your method, or do both; i.e. you can just throw it without catching it, you can catch it and recover from it, or you can catch it and rethrow it after doing something with it. Just throwing it without catching it is also called ducking it. You will get more comfortable with the throw and catch terminology by the end of this chapter.

Runtime Exceptions
The exceptions of type RuntimeException occur due to program bugs. The programmer is not required to provide code for these exceptions because if the programming were done correctly in the first place, these exceptions wouldn’t occur, anyway. Because a runtime exception occurs as a result of incorrect code, catching the exception at runtime is not going to help, although doing so is not illegal. However, you would rather write the correct code to avoid the runtime exceptions than write the code to catch them. An exception represented by the ArithmeticException class is an example of runtime exceptions. Again, you do not need to declare or catch these exceptions.

Runtime exceptions (exceptions of type RuntimeException or its subclasses) and errors (of type Error or its subclasses) combined are also called unchecked exceptions and they are mostly thrown by the JVM, whereas the checked exceptions are mostly thrown programmatically. However, there is no rigid rule.




Runtime Exception'lar ve Checked Exception'lar vardır. Bir resime bakalım:


4 Ekim 2009 Pazar

Javada interface ve abstract kavramları ve sınıf türetme






package abstractpkg;

interface intrface {
// interface içinde public
// modifier kullanılabiliyor.
public int intrfaceMetot_1();
void intrfaceMetot_2();
//C#tan farklı olarak normal/static
//sabit tanımlanabiliyor
final int yas = 10;
}

interface intrface1 {
int intrface_1_metot();
}

abstract class abs {
abstract void absMetot();
void absMetot_2(String s1){
// birşeyler yapsın
// anlayalımki abstractlerin
// bodyli metotları da olduğunu
}
}

abstract class abs1 extends abs implements intrface, intrface1 {
public String sdegisken;
abstract void abs_1_Metot();
}




class cls extends abs1 {

@Override
void abs_1_Metot() {
}

@Override
void absMetot() {
}

public int intrfaceMetot_1() {
}

public void intrfaceMetot_2() {
}

public int intrface_1_metot() {
}
}

class clsInterfaceten implements intrface,intrface1{

public int intrfaceMetot_1() {
}

public void intrfaceMetot_2() {
}

public int intrface_1_metot() {
}
}

public class Main {

public static void main(String[] args) {
}
}


Interface kullanımına güzel bir örnek: http://www.sourcecodesworld.com/articles/java/java-data-structures/Comparing_Objects.asp

Javada Interface

JAVA:

interface ii{
// public yazmaya gerek yok
void sayma();

// public yazabilirsinizde
public int say();

// java da interface içine
// sabit tanımlanabilir.
final int yas = 10;
}

class cc implements ii{
public int say() {
return yas; // 10 doner
}

public void sayma() {
}
}


C#:

interface ii
{
// The modifier 'public' is not valid
// for this item
public int say(); // HATALI

void sayma();

// Interfaces cannot contain fields
const int yas = 10; // HATALI
}

class cc : ii
{

public void sayma()
{
}

public int say()
{
// interface içinde field tanımlanamayacağı
// için erişilemez
return 4444;
}
}

Javada Enum

Öncelikle bilinmesi gereken javada enum un bir class gibi davrandığıdır. Ama classtan farklı yapıcı metotları daima private olmak zorunda. Bir de yapıcı metotlarının parametre sayısı enum değerlerine parantez açarak verilebiliyor.
Aşağıdali örnek çok güzel anlatıyor:


package planets;
enum Planet {
// parantez içindeki parametreler
// yapıcı metoda parametre olarak atanır
MERCURY (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
EARTH (5.976e+24, 6.37814e6),
MARS (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURN (5.688e+26, 6.0268e7),
URANUS (8.686e+25, 2.5559e7),
NEPTUNE (1.024e+26, 2.4746e7);

private final double mass; // in kilograms
private final double radius; // in meters
Planet(double mass, double radius) {
this.mass = mass;
this.radius = radius;
}
private double mass() { return mass; }
private double radius() { return radius; }

// universal gravitational constant (m3 kg-1 s-2)
public static final double G = 6.67300E-11;

double surfaceGravity() {
return G * mass / (radius * radius);
}
double surfaceWeight(double otherMass) {
return otherMass * surfaceGravity();
}
public static void main(String[] args) {
if (args.length != 1) {
System.err.println("Usage: java Planet ");
System.exit(-1);
}
double earthWeight = Double.parseDouble(args[0]);
double mass = earthWeight/EARTH.surfaceGravity();
for (Planet p : Planet.values())
System.out.printf("Your weight on %s is %f%n",
p, p.surfaceWeight(mass));
}
}


Bu da sonucu(179 verirsek giriş değeri olarak:

run:
Your weight on MERCURY is 67,618613
Your weight on VENUS is 161,994839
Your weight on EARTH is 179,000000
Your weight on MARS is 67,793956
Your weight on JUPITER is 452,969797
Your weight on SATURN is 190,816781
Your weight on URANUS is 162,017769
Your weight on NEPTUNE is 203,760725
BUILD SUCCESSFUL (total time: 0 seconds)

Buraya yazmak istemezdim ama...

Bende çatlayacak gibi oluyorum bu kadar şeyi görüp susunca. İçinize atıyorsunuz tüm çelişkileri diyemiyorsunuz "aman beni O cu, Şu cu sanmasın" diye. Yahu diyemez olduk hissettiğimizi.

Bugün güzel bir makale okudum. İşte bu makale. Daha önce bir göz gezdirmiştim makalede geçen kitaba ama ben esas aşağıdaki görüşmeyi alıntı olarak eklemek istiyorum.

Bensiyon Pinto kim? Türk Musevi Cemaati Onursal Başkanı. Bensiyon Pinto, bir gün, cemaatin fiili başkanı iken bana telefon etti ve şöyle dedi:

“Özdemir, biliyor musun, gazetelerde Musevi ya da Yahudi kökenli işadamı Moiz Milka diye yazdıkları zaman tüylerim diken diken oluyor. Ermeni kökenli, Rum kökenli de diyorlar. Sana Türk kökenli Türk yazarı mı diyorlar? Bizler Türkiye Cumhuriyeti vatandaşlarıyız. Senin adının önüne kökenle ilgili bir sıfat yapıştırılmıyorsa, bizlere de yapıştırılamaz. Biz yasalara göre her vatandaş gibi Türk’üz!”


Şimdi bu yazıyı okuyupta mutlu olmamak var mı? Bu milliyetçilik demek değildir. Bu vatanın yek olması demektir. Bu hepimizin bir olması demektir. Bensiyon Pinto, "Türküm" deyince Yahudilikten mi çıkıyor. Çerkes sevgilim "Türküm" deyince aslınımı inkar ediyor. Boşnak arkadaşım "Türküm" deyince dansını, şarkılarını mı unutuyor. Bu içinde bulunduğumuz gerilimli anlamsız günlerde, "Kürtüm" demene hiiiç itiraz etmedim etmeyeceğimde. Ama "Türküm" demek kimseye zul gelmezken sana zul geliyorsa cevabını sen içinde ara ve annemin deyişiyle "ne olur kimseninde canına düşmeyin" . Bu yüzden canımıza düşen politikacılara, fırsatçılara (ki onların kapkaçcıdan, hırsızdan ne farkı vardır sorarım size) ne olur tevessül etmeyin.

Javada FINAL kavramı

Eğer classın başına final yazarsak, extend edemeyiz.
Eğer metodun başına final yazarsak, override edemeyiz.

Eğer değişkenin başına final yazarsak, değişkene değer atamalıyız ve daha sonra da değişkenin değerini değiştiremeyiz.





Başlatıcılarında değer atamamızda sorun yok.


Yapıcı metotta değer atamamızda da sorun yok.





Ama bir değer atamamışsak gümleriz. Bakınız aşağıdaki resime:




STATIC FINAL nasıl olacak peki?

Eeee değişken static ise başlatıcının da static ifadesi içermesi gerekiyor. Statik olduğu içinde yapıcı metotda değer atayamayız.


Olması gereken:

package primitive;

public class Main {

// statik olduğu için constructorda da başlatılamaz.
static final int sayi = 10;

// bu olur du ama static final degisken olsaydı
static final String isim;

static
{
isim = "soyadi";
}

public Main() {
}

public static void main(String[] args) { }
}

Java'da super ve this kavramının yapıcı metotlarda kullanımı

super ve this ile yapıcı metot seçimi.

Biliyoruz ki super ile base sınıfın yapıcısına this ile de yazdığımız sınıfın diğer bir yapıcısına erişiyoruz.


package poly;

import java.lang.String;

class Employee {
String adi;
String soyadi;
int yas;

public Employee() {
}

public Employee(String adi) {
}

public Employee(String adi, String soyadi) {
}

public void func() {
System.out.println("Bu empden");
}
}

class Manager extends Employee {
public Manager(String adi) {
super(adi); // Employee sınıfının 2. yapıcısını çağır
// Eğer biz bir parametre alan yapıcı tanımlarsak
// Default yapıcıyıda silersek super(adi) hata verir.
}

public Manager(int yas) {
}

public Manager(String adi, String soyadi, int yas) {
this(adi); // Manager sınıfının 2. yapıcısını çağır
// Şimdi soyadi ve yasiyla ne yapacaksak.
// kodlarini yazariz.
}
}

public class Main {

public static void main(String[] args) {
Manager mng = new Manager("adi", "soyadi", 21);
}
}

Java da ki ... (params), Array'e karşı

C# ta params vardı hatırlarsanız.

Java da ise ... var :)
Aslında bu [] ile aynı. Hadi resimle bitirelim bu işide.

Javada Class Yapıları


package poly;

class Employee{
public void func() {
System.out.println("Bu empden");
}
}

class Manager extends Employee{
public void func() {
System.out.println("Bu mngden");
}
}

public class Main {
public static void main(String[] args) {
Employee emp1 = new Employee();
emp1.func();

Employee emp2 = new Manager();
emp2.func();

Manager mng = new Manager();
mng.func();

Manager mng1 = new Employee();
mng1.func();

/* SONUCLAR:
run:
Bu empden
Bu mngden
Bu mngden
Exception in thread "main" java.lang.RuntimeException: Uncompilable source code - incompatible types
required: poly.Manager
found: poly.Employee
at poly.Main.main(Main.java:28)
Java Result: 1
BUILD SUCCESSFUL (total time: 3 seconds)
*/
}
}

3 Ekim 2009 Cumartesi

Low Level - High Level API

Aslında aşağıda daha güzel cümlelerle anlatıldığı için hiç bir şey yazmıyorum. Güzeldi!
Bence high level API leri kullanıyoruz diye de kendimizi yazılımcı saymamakta ayrıca bir şeytanın dürtmesi. Aynı şeyleri her kodumuzda bize vermeleri yerine yapıyor olmak bence zaman kaybı olacaktı. Bunlarla uygulama çıkartmak onları yazmak kadar önemlidir derim ben...
Üzmeyin tatlı canınızı daha öteye götürmek için öğrenemeye devam...

Kaynak: George A. Papayiannis
The low-level API extends the Canvas class and is mainly used to develop games or any UI were you must draw pixels yourself. A good example of the low-level API in action is the WormGame, packaged in the example application of the Sun Wireless Toolkit. The high-level API is used to create standard lists, textboxes and forms. It’s important to remember when developing with MID, you have no control precisely were widgets will appear on the screen — this power is given to individual devices (i.e. the device manufacturer). The form class has numerous children items, which can be attached, these include textfield, stringitem, etc. The figure below was taken from J2ME Application Development and shows structure of MIDP UI Classes.