JAVA-SOKET İLE BASİT BİR İSTEMCİ-SUNUCU UYGULAMASI

  Bu uygulamamızda Java'nın soket nimetinden faydalanacağız.Localhost üzerinden istemci-sunucu mimarisini kullanarak basit bir uygulama yapacağız.İstemciden alınan sayının(request),server'da faktöriyel'ini alıp sayıyı istemciye geri (response) döndüreceğiz.İlk olarak istemci tarafını kodluyoruz.

client.java
import java.io.IOException;
import java.io.PrintStream;
import java.net.Socket;
import java.util.Scanner;
public class Client {
    public static void main(String [] args) throws IOException{
        int number,temp;
        Scanner sc1=new Scanner(System.in);
        Socket s=new Socket("127.0.0.1",496);
        Scanner sc2=new Scanner(s.getInputStream());
        System.out.println("Faktöriyeli alınacak sayi : ");
        number=sc1.nextInt();
        PrintStream ps=new PrintStream(s.getOutputStream());
        ps.println(number);
        temp=sc2.nextInt();
        System.out.println(number+"! ="+temp);
    }
}

Soket sınıfından nesnemizi türettik.Bu sınıfımızın yapılandırıcısına 2 parametre girdik.İlki cihazımın ip adresi(şimdilik localhost).İkincisi de iletişimin hangi port üzerinden olacağı.sc1 istemciden alınacak sayi.sc2 ise sunucuya konsol'a yazılacak değeri okuyup sunucu ile iletişime geçecek.InputStream ve OutputStream hem istemci hemde sunucuda yazılmalı.Çünkü haberleşme iki taraflı oluyor.İstemci bir istekte bulunuyor,sunucu gelen isteğe cevap veriyor.İstemci de gelen cevabı alıyor.

Şimdi de sunucu tarafını kodlayalım..


server.java

import java.io.IOException;
import java.io.PrintStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;

public class Server {
        public static int factorial(int num){
             if (num == 1)
                return 1;
                    return num*factorial(num-1);
          }
    public static void main (String [] args) throws IOException{
        int number,temp;
        ServerSocket s1=new ServerSocket(496);
        Socket ss=s1.accept();
        Scanner sc=new Scanner(ss.getInputStream());
        number=sc.nextInt();
        temp=factorial(number);
        PrintStream p=new PrintStream(ss.getOutputStream());
        p.println(temp);
    }
}


accept() fonksiyonu ile server 496 nolu soketi dinlemeye alıyor.Sonra getInputStream ile değeri okuyor. number=sc.nextInt(); gelen değerin integer tipinde olduğunu söylüyor.Daha sonra yazdığımız recursive fonksiyona parametre olarak yolluyoruz.Bize dönen değeri temp değişkenine atıp bu değeri istemciye yolluyoruz.Benzer şekilde swing,awt kütüphanelerini kullanarak basit chat,karşılıklı online oyunlar programlayabilirsiniz...

İYİ ÇALIŞMALAR




ASENKRON SAYICILAR ÖRNEK-1-

Örnek-1
   
          4'ten başlayıp 14'e kadar sayan negatif kenar tetiklemeli asenkron yukarı sayıcı devresini T flip flop'ları ile tasarlayınız.

Çözüm-1
 
   

Yaptığımız adımları tek tek gözden geçirelim.Sayıcımız 4'ten başlayacağı için 4'e ön kurma yaptık.(0100).Daha sonra bu sayıcımız 14'e kadar sayacağı için (15'i saymayacak) 1111', nand kapısı ile bağlayıp devremizin sırası ile R-R-S-R girişlerine bağladık.Artık devremiz 4-15 arası sayacak.Negatif kenar tetiklemeli ve yukarı sayıcı olduğundan bir sonraki flip flop'un clok girişi bir öncek flip flop'un Q değerinden alınacaktır.Ve dikkat edeceğimiz başka bir kısım ise T tipi FF'umuzn 0 ile aktif hale geldiği bu sebeble ABCD'nin 1111 olduğu durumlar nand kapısına bağlandığıdır.



İYİ ÇALIŞMALAR

SIFIRLAMA VE ÖNKURMA DEVRELERİ

Flip floplardaki set ve reset girişlerini kullanarak devrelerimizi kurup sıfıralayacağız.Yerine göre

kur,yerine göre de sıfırla işlemini uygulayacağız.Bir sayma işlemini bir değerden başlatırken kurma

işlemi yaparız.Örnek verecek olursak 6'dan başlayıp 30' a kadar sayan devreyi tasarlarken devremizi

6 ya kurmamız lazım kurma ve sıfırlamayı nasıl yapacağımıza bakalım.



Sıfırlamalı asenkron yukarı sayıcı devresine bakalım.Burada 4 FF olduğundan bu sayıcı 0 ile 15 arası

sayacaktır.Sıfırlama her flip-flop'un clear(reset) girişlerine sıfırlama devresinin çıkışı bağlanır.



Yukarıda gördüğünü asenkron yukarı sayıcı devre 2 den başlayarak 15 e kadar sayan bir sayıcı

devresi.(0010) Sırası ile ABCD.Burada 2 sayısana kurmak istediğimizden C flip flopumuzun set'ine

diğer flip floplarımızın reset'ine kurma devremizi bağlıyoruz.Böylece devremiz 2 sayısına kurulmuş

oldu.

DURUM İNDİRGEME

      Durum indirgemesi flip flop sayısını azaltmak için kullanılır.Bu sayede hem maliyet azalacak hem de karmaşıklık ortadan kalkacaktır.Şimdi aşağıdaki örnek üzerinde görelim




Bakın ilk tablomuzu olduğu gibi de kullanabiliriz.Fakat 5 durumumuz olduğundan en az 3 FF kullanmamız gerekir.Burada gelecek durumları aynı olan şimdiki durumlarımıza bakalım.A ve D.
A ve D den birini yok etmemiz gerekiyor.Biz örneğimizde D'yi yok ettik.Bu işlemi gerçekleştirirken D hangi durum ile eşleşmiş ise(A) geriye kalan tüm D'lerin yerine A yazıyoruz.Bunun sebebi D'yi tamamen yok etmemizdir.Bu işlemler tamamlandıktan sonra geriye 4 durumumuz kalıyor.Görüldüğü üzere bu durum tablosunun devresinde bize 2 tane FF yetecektir.Bu da 1 FF kar yaptığımızı gösteriyor.Ya bütün bu işlemleri 1 FF'tan kar etmek için mi yaptık ? dediğinizi duyar gibiyim :)Ya bu devreden binlerce,yüzbinlerce üretecekseniz ?


İYİ ÇALIŞMALAR...

SWING İLE BULMACA YAPIMI



import java.awt.*;
import java.awt.event.*;
import java.util.Random;
import javax.swing.*;
import javax.swing.event.*;
/**
 *
 * @author Gökhan
 */
public class Bulmaca extends JFrame  implements ActionListener {
   static JTextField[] txtField = new JTextField[28];
   JButton jbtn;
   static  JLabel[] s=new JLabel[7];
   String deger="X";
   Dimension panel=new Dimension(610,610);
   JLabel sorular=new JLabel();
    int kazanc;
    int kayip;
    Random r=new Random();
    int secilen=r.nextInt(10);
    String []a=new String[27];
    JLabel sa;
   public void karala(int[]k)
   {
     
       for(int i=0;i<k.length;i++)
       {
              txtField[k[i]].setBackground(Color.black);
              txtField[k[i]].setEnabled(false);
              txtField[k[i]].setText("X");
       }
   }
   public void sonuc(){     
          kazanc=JOptionPane.showOptionDialog(null,
                        "Devam etmek istiyor musunuz ?",
                        "KAZANDINIZ", JOptionPane.YES_NO_OPTION,
                        JOptionPane.PLAIN_MESSAGE, null, null, null);
   
                   if(kazanc==JOptionPane.YES_OPTION)
           {
               
                new Bulmaca();
           }
            else {
                System.exit(1);
            }
        }
   public JPanel soruEkle(JLabel [] s){
        JPanel soru=new JPanel();
        soru.setPreferredSize(panel);     
       for (JLabel item : s) {
           soru.add(item);
       }
        return soru;
 
   }
   public  void kotuSonuc(){
     kayip = JOptionPane.showOptionDialog(null,
                        "Devam etmek istiyor musunuz ?",
                        "KAYBETTİNİZ", JOptionPane.YES_NO_OPTION,
                        JOptionPane.PLAIN_MESSAGE, null, null, null);
            if(kayip==JOptionPane.YES_OPTION)
           {   
            new Bulmaca();
           }
            else {
                System.exit(1);
            }
   }
   public void kontrolEt(String durum){
         for(int i=0;i<28;i++){
               deger=deger+txtField[i].getText();
           }
   if(deger.equals(durum)){
       sonuc();
           }
   else{
      kotuSonuc();
   }
   }
   public JButton butonEkle(){
        jbtn=new JButton("Cevapları Göster");
        jbtn.addActionListener(this);
        jbtn.setActionCommand("cevapgoster");
        return jbtn;
   }
    public Bulmaca(){   
        Random renk=new Random();
        int renksec=renk.nextInt(3);
        this.setDefaultCloseOperation(3);
        this.setSize(630,375);
        this.setLayout(new FlowLayout());
        Dimension jtSize =new Dimension(40,40);
        JPanel jpn1=new JPanel();
        jpn1.setPreferredSize(new Dimension(320,190));
        if(renksec==0)jpn1.setBackground(Color.yellow);
        if(renksec==1)jpn1.setBackground(Color.red);
        if(renksec==2)jpn1.setBackground(Color.ORANGE);
   for (int i = 0; i < 28; i++) {
     txtField[i] = new JTextField(Integer.toString(i+1));
    txtField[i].setHorizontalAlignment(JTextField.CENTER);
     jpn1.add(txtField[i]);
     txtField[i].setPreferredSize(jtSize);
   }
   if(secilen==0){
        int[] t1={1,6,15,20,21,27};
        karala(t1);
   s[0]=new JLabel("1)PHP'de form metodu (1-15)");
   s[1]=new JLabel("2)PHP'de rastgele sayı seçmek istediğimizde kullanacağımız fonksiyon (3-6)");
   s[2]=new JLabel("3)Bir metni istediğimiz karakterden parçalara ayırabileceğimiz PHP fonksiyonu(8-14)");
   s[3]=new JLabel("4)PHP'de sayfaya yazı basmak için kullanılan komut(17-20)");
   s[4]=new JLabel("5)PHP'de bir değişkenin var olup olmadığını test eden fonksiyon(23-27)");
   s[5]=new JLabel("");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
   if(secilen==1){
        int [] t2={6,7,12,19,21,22,23};
        karala(t2);
   s[0]=new JLabel("1)HTML'de oluşturulan bir tablonun kalınlığını ayarlayan anahtar kelime(1-6)");
   s[1]=new JLabel("2)HTML'de eklediğimiz JPEG dosyasının yerini belirttiğimiz anahtar kelime (14-28)");
   s[2]=new JLabel("3)HTML'de girdi girmenizi sağlaya tag(8-14)");
   s[3]=new JLabel("4)CSS'te bir list type.                   (25-28)");
   s[4]=new JLabel("5)HTML sayfasını parçalara ayırmamızı sağlayan tag.(15-19)");
   s[5]=new JLabel("6)HTML sayfasındaki bir CSS dosyasının linkini belirten anahtar kelime(9-12)");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
   if(secilen==2){
        int [] t3={0,13,15,16,17,24};
        karala(t3);
   s[0]=new JLabel("1)T-SQL'de tablo veya veritabanı oluştururken kullandığımız anahtar kelime(2-7)");
   s[1]=new JLabel("2)T-SQL'de kayıtları göstermek için kullandığımız anahtar kelime(14-28)");
   s[2]=new JLabel("3)T-SQL'de 10 değerden en büyüğünü getirmek için kullanılan fonksiyon(19-21)");
   s[3]=new JLabel("4)T-SQL'de 10 değerden en küçüğünü getirmek için kullanılan fonksiyon (22-24)");
   s[4]=new JLabel("5)T-SQL'de 10 değerin ortalamasını döndüren foksiyon(25-27)");
   s[5]=new JLabel("6)T-SQL'de 10 değerin toplamını döndüren fonksiyon (8-22)");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
      if(secilen==3){
        int [] t4={0,2,13,14,16,20,21,22};
        karala(t4);
   s[0]=new JLabel("1)C#'ta bir sınıftan nesne türetileceği zaman kullanılan anahtar kelime (2-16)");
   s[1]=new JLabel("2)C#'ta geriye herhangi bir değer döndürmeyen fonksiyon tipi (4-7)");
   s[2]=new JLabel("3)C#'ta bir String değişkeninin uzunluğunu bulmaya yarıyan anahtar kelime(8-13)");
   s[3]=new JLabel("4)C#'ta herzaman kullanılan çok önemli bir döngü     (18-20)");
   s[4]=new JLabel("5)C#'ta oluşturduğumuz bir dizinin boyutunu bulmak için kullanılan anahtar kelime(24-28)");
   s[5]=new JLabel("");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
         if(secilen==4){
        int [] t5={6,7,8,17,18,20,25,27};
        karala(t5);
   s[0]=new JLabel("1)C++'ta çok geniş bir erişim belirleyici (1-6)");
   s[1]=new JLabel("2)C++'ta bir sayıyı alta yuvarlayan math. fonksiyonu(10-14)");
   s[2]=new JLabel("3)C++'ta dışarıdan girilen değeri oluşturduğumuz değişkene atan anahtar kelime(15-17)");
   s[3]=new JLabel("4)C++'ta ekrana yazı basmak için kullanılan anahtar kelime(6-27)");
   s[4]=new JLabel("5)C++'ta girilen bir sayiyi üste yuvarlayan math. fonksiyonu(22-25)");
   s[5]=new JLabel("");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
     if(secilen==5){
        int [] t5={0,6,12,13,14,26,27};
        karala(t5);
   s[0]=new JLabel("1)CSS'te bir sınıf yazarken sınıfın önüne getirilen işaret (2-6)");
   s[1]=new JLabel("2)CSS'te bir id yazarken önüne getirilen işaret(10-14)");
   s[2]=new JLabel("3)CSS'te tanımlanmış sınırların dışında boşluk oluşturmak için kullanılır.(8-12)");
   s[3]=new JLabel("4)CSS'te bir font'un türünü seçmek için kullanılan alt anahtar kelime style(21-27)");
   s[4]=new JLabel("");
   s[5]=new JLabel("");
   s[6]=new JLabel("");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
 if(secilen==6){
        int [] t5={0,14,15,19,20,25,26,27};
        karala(t5);
   s[0]=new JLabel("1)Çevremizdeki ortam (sıcaklık, basınç,vb) değişikliklerini algılayan cihazlar(2-7)");
   s[1]=new JLabel("2)Çok sayıda devre elemanlarından tek bir devreyi oluşturan yapı(8-14)");
   s[2]=new JLabel("3)Sayısal tasarımda birden çok çıkışı tek çıkışı aktarır(17-19)");
   s[3]=new JLabel("4)Bir bitlik veriyi tutmak için kullanılan flip flop devresi(22-25)");
   s[4]=new JLabel("");
   s[5]=new JLabel("");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
  if(secilen==7){
        int [] t5={0,7,8,12,14,17,18,19,27};
        karala(t5);
   s[0]=new JLabel("1)Ağ öğelerinin birbirlerine bağlanmasına olanak veren ağ donanımı(2-7)");
   s[1]=new JLabel("2)Ağ öğelerinin birbirlerine bağlanmasına olanak veren ağ donanım aygıtı(7-14)");
   s[2]=new JLabel("3)Bir bilgisayar ağında, bir cihazın ağ donanımını tanımaya yarayan adres(10-12)");
   s[3]=new JLabel("4)Ağ üzerinden birbirleri ile veri alışverişi yapmak için kullanılan adres(16-17)");
   s[4]=new JLabel("5)Aynı ağ iletişim kurallarını kullanan iki bilgisayar ağı arasında veri iletimini sağlar(22-27)");
   s[5]=new JLabel("");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
   if(secilen==8){
        int [] t5={7,14,19,20,21,22,23};
        karala(t5);
   s[0]=new JLabel("1)Birden fazla işin aynı anda çalışması halinde birbirlerini beklemesini sağlayan bir mekanizma(1-7)");
   s[1]=new JLabel("2)Türkiye'de TÜBİTAK tarafından geliştirilen bir Linux dağıtımı olan işletim sistemi(9-14)");
   s[2]=new JLabel("3)İşletim sistemlerinde bir işlem oluşturmak için kullanılan fonksiyon(16-19)");
   s[3]=new JLabel("4)Process'ler arası iletişim için kullanılan bir fonksiyon(25-28)");
   s[4]=new JLabel("");
   s[5]=new JLabel("");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);
   this.add(soruEkle(s));
 }
   if(secilen==9){
        int [] t5={14,19,20,27};
        karala(t5);
   s[0]=new JLabel("1)Mobil uygulama geliştirme platformu ....... studio (1-7)");
   s[1]=new JLabel("2)Bir PHP framework'u (8-14)");
   s[2]=new JLabel("3)Basit Nesne Ulaşım Protokolü,dağınık uygulamalarda bilgi taşımaya yarayan protokol.(16-19)");
   s[3]=new JLabel("4)JSP'nin çalıştığı yer uygulama sunucusularından biri (25-28)");
   s[4]=new JLabel("");
   s[5]=new JLabel("");
   s[6]=new JLabel("-----");
   this.add(butonEkle());
   this.add(jpn1);

   this.add(soruEkle(s));
 } 
   this.setVisible(true);
    }   
    public static void main(String[] args) {
       new Bulmaca();
    }
   @Override
    public  void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("cevapgoster")){
       if(secilen==0){
           String cvp="XGXRANDXEXPLODETXECHOXXISSETX";
           String cevaplar="1)GET2)RAND3)EXPLODE4)ECHO5)ISSET";
           s[6].setText(cevaplar);
           kontrolEt(cvp);//php
         
    }
       if(secilen==1){
           String cvp="XBORDERXXHREFXSINPUTXRXXXDISC";
           String cevaplar="1)BORDER 2)SRC 3)INPUT 4)DISC 5)DIV 6)HREF";
           s[6].setText(cevaplar);
            kontrolEt(cvp);       //html
    }
       if(secilen==2){
          String cvp="XXCREATESELECTXUXXXMAXMINXAVG";
          String cevaplar="1)CREATE 2)SELECT 3)MAX 4)MIN 5)AVG 6)SUM";
          s[6].setText(cevaplar);
            kontrolEt(cvp);//SQL
       }
       if(secilen==3){
          String cvp="XXNXVOIDLENGTHXXWXFORXXXCOUNT";
          String cevaplar="1)NEW 2)VOID 3)LENGTH 4)FOR 5)COUNT";
          s[6].setText(cevaplar);
            kontrolEt(cvp);//C#
       }
       if(secilen==4){
           String cvp="XPUBLICXXXLOORCINXXUXCEILXTX";
           String cevaplar="1)PUBLIC 2)FLOOR 3)CIN 4)COUT 5)CEIL";
            s[6].setText(cevaplar);
            kontrolEt(cvp);//C++
       }
       if(secilen==5){
         String cvp="XXSHARPCSTYLEXXXMARGINNOKTAXX";
         String cevaplar="1)NOKTA 2)SHARP 3)MARGIN 4)STYLE";
        s[6].setText(cevaplar);
            kontrolEt(cvp);//CSS
       }
       if(secilen==6){
          String cvp="XXSENSORENTEGREXXMUXXXDATAXXX";
          String cevaplar="1)SENSOR 2)ENTEGRE 3)MUX 4)DATA";
         
         s[6].setText(cevaplar);
            kontrolEt(cvp);//TASARIM
       }
       if(secilen==7){
          String cvp="XXSWITCHXXMACXUXIPXXXBXROUTERX";
          String cevaplar="1)SWITCH 2)HUB 3)MAC 4)IP 5)ROUTER";
          s[6].setText(cevaplar);
            kontrolEt(cvp);//Ağ
       }
       if(secilen==8){
           String cvp="XXSEMAFORXPARDUSXFORKXXXXXPIPE";
           String cevaplar="1)SEMAFOR 2)PARDUS 3)FORK 4)PIPE";
           s[6].setText(cevaplar);
            kontrolEt(cvp);//işletim sistemleri
       }
       if(secilen==9){
         
           String cvp="XANDROIDLARAVELXSOAPXXTOMCATX";
           String cevaplar="1)ANDROID 2)LARAVEL 3)SOAP 4)TOMCAT";
           s[6].setText(cevaplar);
            kontrolEt(cvp);
       }
    }
    }
}







BELLEĞE ERİŞİM

Okuma İşlemi

1-Saat işaretinin 1'den sıfıra inmesiyle,adres bilgileri adres yoluna konur.

2-Adres yolu üzerinde adres bilgisinin oluşmasının ardından bellek gözü seçici canlandırılırsa kod

çözücü ile belirlenen bellek gözü seçilecektir.

3-Bellek gözünün seçilmesinin ardından oku emrinin gönderilmesi ile, adreslenerek seçilen bellek

gözünün içeriği veri yoluna aktarılır.Veri yoluna aktarılan veriler,birinci aşamada belirlenen

adreslerin adres yolu üzerinde kaldığı,bellek gözü seçicinin etkin olduğu ve OKU girişi 1'de

bulunduğu sürece veri yolu üzerinde görülmeye devam eder.

Yazma İşlemi

1-Saat işaretinin 0'a inmesiyle,seçilen bellek gözünün adresi adres yoluna konulur.

2-Yazılacak veri,veri yolu üzerine konulur.

3-Oku/yaz sinyali yaz konumuna (0 konumu) getirilir.

4-Bellek seçici 0 konumuna getirilerek belleğin seçilmesi sağlanır.Bunun sonucunda adres yolunda 

belirtilen bellek gözü seçilir.Ardından veri yolundaki veriler seçilen bellek gözüne yazılır.






BELLEK DÜZENİ

         Belleğin temel birimine bit denir.Bitler yanyana konarak bir bellek gözünü (satırını) meydana

getirir.Dinamik belleklerde bellek gözleri genellikle bir gözeden oluşmaktadır.Statik belleklerde ise

bir bellek gözü genelde 8 bitten oluşur.Ancak bir gözünde 1,2 veya 4 bit olan statik belleklerde

üretilmektedir.4 bitlik yapıya dörtlü,8 bitlik yapıya ise sekizli adı verilmektedir.Bellek bitleri yan

yana konarak bir gözü(satırı) ,bu gözler üst üste konarakta bellek oluşturulur.Bu belleğe N x M

boyutlu bir matris olarakta bakabiliriz.Burada N satır sayısına yani bellek gözü sayısına,M ise sütun

sayısına yani bir gözdeki bit sayısına karşılık gelmektedir.

           Belleğin aynı sütunda bulunan tüm gözelerinin girş ve çıkış uçları birbirine bağlıdır.

Sonuçta,belleğin göz sayısı ne olursa olsun veri bağlantı ucu,bir gözdeki bit sayısına eşittir.Göze

çıkışlarının bir hatta toplanabilmesi için her gözenin çıkışı üç konumlu kapı biçiminde t

tasarlanmaktadır.Veri yolundaki verilerin bitlere yazılması veya bitlerden veri yoluna veri aktarılması

yine üç konumlu kapılar ile yapılmaktadır.Salt oku bellekler her zaman oku yönünde çalıştıkları için

yönlendiriciye gerek duymazlar.




Bir seçici,bir bellek gözünün tüm bitlerine bağlıdır ve hepsini birlikte seçer veya seçmez.Bir sütundaki bitlerin giriş ve çıkışlarının birbirine bağlı olması ve sonunda tek bir veri hattına ulaşması,bir anda sadece bir bellek gözünün veri yoluna bağlanabilmesi koşulunu gerektirmektedir.Bir başka deyişle,bir anda sadece bir bellek gözüne erişebilir.








ASENKRON AŞAĞI SAYICILAR

Şimdi 2 bitlik bir Asenkron yükselen kenar tetiklemeli aşağı sayıcıya bakalım.


Buradaki en önemli nokta 2.flip flopumuzun clock girişi.Yükselen kenar tetiklemeli yukarı sayıcıda bu giriş Q' den alınıyordu.Burada ise Q dan alınıyor.Ve çıkışlarımız(b) ona göre oluşuyor.Burada sayıcımız şekilde (b)'de görüldüğü gibi 0 3 2 1 0 3 2 1 şeklinde sayacaktır.

Ve negatif (düşen) kenar tetiklemeli






ASENKRON YUKARI SAYICILAR

İlk flip flop'a clock sinyali uygulanır.Diğer flip flopların clock girişine ise ilk flip flop'un çıkışı bağlanır.(Q veya Q')Her clock vuruşunda Toggle(tersleme) işlemi yapılacağından daha önce gördüğümü J-K'nın 1-1 ve T flip flop'unun 1 olması durumları burada kullanacağımız flip floplardır.1 olma durumuna dikkat edin çünkü sadece o durumda tersleme işlemi yapan 2 flip flopumuzdur J-K ve T.

Asenkron Yukarı Sayıcı

Aşağıdaki 2 bitlik asenkron pozitif kenar tetiklemeli yukarı sayıcıya bir göz atalım.


Öncelikle flip flop'umuz kaç bit 2. 2^2=4'e kadar sayan bir  sayıcı devremiz var. 0 1 2 3 0 1 2 3 diye devam ediyor.Flip floplarımızın isimleri aklımızı karıştırmasın.En düşük değerlikli bitimiz en soldaki yani clock sinyalini alan flip floptur.Yukarıdaki sayıcımızda 'B' en düşük değerlikli bitimizdir.Bildiğiniz üzere flip floplar 1 bitlik veriyi tutan devrelerdi.Sayıcı devremizi a'da tasarladık.İlk flip flopumuzun Q' çıkışı ikinci flip flopumuzun clock girişine bağlandı.Bunun nedeni sayıcımızın sayıcımızın pozitif kenar tetiklemeli olmasıdır.Bu durumlarda flip flopumuzun JK mı ? T mi ? olduğuna dikkat etmemiz gerekiyor.İleride değineceğiz.Çıkış dalgalarımıza bakacak olursak ilk clock sinyalimizi ele almalıyız.Çünkü devremizin çalışmasını sağlayan gerçek clock sinyali o'dur.Pozitif kenar tetiklemeli clock sinyalimizde her yükselen kenar tetiklendiğinde Qb değerimiz 0'dan 1'e 1'den 0'a inecektir.Böylece Qb ve Qb' nin çıkış sinyallerini elde ettik.Şimdide Qb' her pozitif kenar tetiklemesi için Qa durum değiştirir.Ve son olarak oluşan Qa ve Qb durumlarına bakarsak,sayıcımızın 0 1 2 3 0 1 2 3 diye saydığını görürüz.Eğer Qa ve Qb çıkışlarımıza led bağlarsak bu olayı daha net görebiliriz.


Bakın burada negatif kenar (düşen kenar tetiklemeli) flip flop kullandık bir sonraki flip flopumuzun clock girişi Q oldu.Ve clock girişindeki yuvarlak ile de bun belirttik..





















SAYICILAR(COUNTERS) GİRİŞ

Giriş darbelerine bağlı olarak belirli bir durum dizisini tekrarlayan lojik devrelere "sayıcı" ismini veriyoruz.

Şimdi sayıcıların nasıl sınıflandırıldığına bakalım.

a)Tetikleme sinyalinin uygulanmasına göre
  1)ASENKRON SAYICILAR
  2)SENKRON SAYICILAR

b)Sayma yönüne göre
  1)YUKARI-İLERİ SAYICILAR
  2)AŞAĞI-GERİ SAYICILAR
  3)YUKARI/AŞAĞI SAYICILAR

c)Elde edilen sayının kodlanmasına göre
  1)İKİLİ SAYICI (BINARY COUNTERS)
  2)BCD SAYICI(BCD COUNTERS),
  3)ONLUK SAYICI(DECIMAL COUNTERS)

SAYICININ MOD'U
  
   n sayıdaki flip flop ile 2^n sayıda sayma yapabilir.Örneğin 3 flip flop ile 0-7 ve arasını sayabiliriz.Bir sayıcının tekrar yapmadan sayabildiği sayı miktarına o sayıcının mod'u denir.
Mod13->0-12 Mod9->0-8 arasını sayar.







SWİNG İLE OKUDUĞUMUZ DOSYAYI GÖRÜNTÜLEME

/**
 *
 * @author Gökhan
 */
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;



public class DosyaOku extends JFrame implements ActionListener{
        JTextArea jtxa;
        int i;
        DefaultListModel<String> dlm;
        JList<String> jlist;
    public DosyaOku(){
        this.setDefaultCloseOperation(3);
        this.setSize(new Dimension(500,500));
        this.setLayout(new FlowLayout());
        JPanel jpn=new JPanel();
        jpn.setPreferredSize(new Dimension(400,400));
 
       
dlm = new DefaultListModel<String>();

jlist = new JList(dlm);

JScrollPane jscp = new JScrollPane(jlist);
jscp.setPreferredSize(new Dimension(166, 150));

jpn.add(jscp);
        JButton jbtn=new JButton("Dosyayı Göster");
        jbtn.setPreferredSize(new Dimension(120,30));
        jbtn.addActionListener(this);
       
     
        jpn.add(jbtn);
         
        this.add(jpn);
        this.setVisible(true);
    }
    public static int satirDondur(){
        int sayac=0;
  try{
            FileInputStream f=new FileInputStream("A.txt");
    try (DataInputStream d = new DataInputStream(f)) {
        BufferedReader b=new BufferedReader(new InputStreamReader(d));
        while(b.readLine()!=null){
            sayac++;
        }
    }
       }
        catch(Exception e)
       {
            System.err.println("Hata" + e.getMessage()); 
       }
  return sayac;
 
    }
   
    public static void main(String[] args) {
       new DosyaOku();
    } 

    @Override
    public void actionPerformed(ActionEvent e) {
         String [] str=new String[satirDondur()];
       
        try{
            FileInputStream f=new FileInputStream("A.txt");
    try (DataInputStream d = new DataInputStream(f)) {
        BufferedReader b=new BufferedReader(new InputStreamReader(d));
        for(i=0;i<str.length;i++){
        str[i]=b.readLine();
        dlm.addElement(str[i]);
        }
    }
       }
        catch(Exception ex)
       {
            System.err.println("Hata" + ex.getMessage()); 
       }
           
    }
}


Bir önceki yazımızda klasörümüze eklediğimiz bir text dosyamızı nasıl okuyabileceğimizi görmüştük.Şimdi de JList,JScrollPane ve JButton component'leri ile okuduğumuz dosyayı listeliyoruz.Böylece dosya üzerinde silme veya güncelleme işlemleri yapabilir.Veya bu dosyaları kontrollü bir şekilde veritabanına yazabiliriz.

İYİ ÇALIŞMALAR...

Spring Boot Uygulamasını Heroku üzerinde Deploy Etme

Bu yazımızda sizlere spring boot ile yazılmış basit bir Rest api'nin heroku üzerinde nasıl deploy edebileceğimizi göstereceğim. Önce ...