9 Nisan 2021 Cuma

Java'da Thread ve Semaphore Kullanımı Bayram Harçlığı Örneği

Normal Dede, SemaphoreDede, AtomicDede ve SynchronizedDede torunlarına bayram harçlığını doğru bir şekilde dağıtabilecek mi? Bayram harçlığı örneğiyle Java'da Semaphore, Thread, AtomicInteger ve synchronized yapılarının nasıl kullanıldığını göreceğiz.

 

Osmanlı'da Bayram Kutlaması
Osmanlı'da Bayram Kutlaması

Thread Nedir?

Türkçe'mize iş parçacığı olarak geçmiş bulunan thread'ler bir hesaplama işini yürüten yapılara denir. İşlemcide yürüyen işlemlerde (process) bir veya birden fazla thread çalışabilir. Bu sayede yoğun işlem gücü gerektiren işler farklı threadlere bölünüp, işlemcinin en verimli şekilde kullanılmasını sağlayarak daha az zamanda işin bitmesine yardımcı olurlar. Örneğimizde dedelerinin elini öpüp harçlık alacak olan torunları birer Thread içinde modelleyeceğiz.

MultiThread Nedir?

Basit programlarımızı main thread dediğimiz tek bir threadde çalışacak şekilde yazarız. İşler büyüdükçe yeni threadlere ihtiyaç doğar ve çoklu threadli (multithread) yapılar ortaya çıkar. Burada bilmemiz gereken şey, kullandığımız yazılım dilinin multithread programlamaya ne kadar API desteği verdiğidir. Java multithreading ve concurrency konularında oldukça iyi standart api desteği sunuyor. 

İşlemci hızları artık Moore Yasası'na göre hızlanmıyor. İşlemci üreticileri çareyi daha çok çekirdekli işlemciler üretmekte arıyorlar. Doğal olarak yazılım dünyasının geleceği de bu çok çekirdekleri en verimli kullananların olacak. Paralel programlama gün geçtikçe daha çok önem kazanacağa benziyor.

Semaphore Nedir?

Uçak gemilerinde elinde bayraklarla pilotlara işaretler veren adamı hatırladınız mı? Kalkış Yapabilirsin! Kalkışı İptal Et! Bayrakları kullanış şekline göre farklı mesajlar verebilir. Semaphore da ismini bu bayraklı işaretlerden alıyor. Kodlar işlemcide işletilirken bir thread'e sen devam edebilirsin derken, diğerine "Hooop hemşerim nereye? Sen dur!" demek için kullanılan yapılardır, Semaphore.

Java'da Semaphore Kullanımı Örneği
Java'da Semaphore Kullanımı Örneği

Kritik Bölge Sorunu (Critical Section Problem)

Kodumuzda bir data birden fazla thread tarafından paylaşılıyorsa ve değiştirilme ihtimali varsa bu dataya kritik kaynak denir. Birden fazla threadin aynı anda bir kod bloğuna girip oradaki paylaşılan değeri değiştirmeye çalışması sonucu hatalı değerler ve öngörülemeyen sonuçlarla karşılaşabiliriz. Bu probleme kritik bölge problemi deniyor. Örneğimizde dedelerin dağıtmak üzere ellerindeki tuttukları toplam harçlık miktarı kritik kaynağımız olacak. 

Mutual Exclusion / Mutually Exclusive / Mutex Nedir?

Tanımladığımız kritik bölgelere aynı anda sedece bir threadin girebilmesi durumuna mutual exclusion denir. Java'da Semaphore tanımlanırken int permits parametresi alır. Bu kaç tane threadin acquire() çağırmasından sonra gelen threadlerin bloklanacağını bildirir. Örneğin 10 değerini verirsek kritik bölgeye girecek ilk 10 threadin devam etmesine izin verirken 11. thread geldiğinde, içerdeki 10 threadden en az birinin release() metodunu çağırmasını bekler ve 11. threadi bloklar. İçerdeki threadlerden biri release() çağırdığında artık blokaj kalkar ve bloklanan thread devam eder. Koronavirüs tedbirlerince AVM'lerde aynı anda bulunabilen müşteri sayısı kısıtına benzetebiliriz. 100 müşteri sınırı var ise, içeri giren hiç bir müşterinin çıkmadığını varsayarsak, ilk 100 müşteriye giriş izni verilir, 101. müşteri girebilmek için içerden bir müşterinin çıkmasını bekler.

Bu bilgiler göz önüne alındığında, kritik bölgeye yalnızca 1 threadin girmesini istediğimiz durumlarda Semaphore permit değerine 1 veririz. Bu özel durumdaki Semaphore nesneleri mutex olarak da adlandırılır.

synchronized Anahtar Kelimesi

Javada kritik kaynakları korumak amacıyla synchronized anahtar kelimesi kullanılır. Önüne geldiği kod bloğuna veya metoda aynı anda sadece bir threadin girmesine izin verir.

Bayram Harçlığı Dağıtma Örneği

Gelelim eğlenceli bölüme. Dedemiz ve 1000 torunu bir ramazan bayramında bayramlaşacaklar. Dedemiz, elindeki çantada toplam 100 Bin TL tutuyor ve her torununa 100 TL bayram harçlığı vermeyi planlıyor. 1000 torun aynı anda dedenin elini öpüp harçık almaya kalkarsa sonuç ne olur? Eğer kritik kaynağını, çantasını, korumaya almadıysa pek hoş şeyler olmaz tahmin edileceği üzere. 

Örnek projemizdeki sınıflara yakından bakalım.

Torun.java, dededen alacağı harçlık miktarı bilgisini ve başarılı şekilde alıp almadığı bilgisini tutuyor.

 
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
 public class Torun {

    private Integer alinacakHarclik;
    
    private boolean harclikAlabildim;

    public Torun(Integer alinacakHarclik) {
        this.alinacakHarclik = alinacakHarclik;
    }

    public void dedeninEliniOp(IDede dede) {

        harclikAlabildim = dede.harclikVer(alinacakHarclik);
    }
    
    public boolean isHarclikAlabildim() {
        return harclikAlabildim;
    }
}

Farklı yöntemler kullanan dedeler tanımlayacağımız için şu şekilde bir IDede.java interface tanımladık.

1
2
3
4
5
6
7
8
public interface IDede {

    public boolean harclikVer(Integer alinacakHarclik);
    
    public Integer getKalanHarclik();

    void setToplamDagitilacakHarclik(Integer toplamDagitilacakHarclik);
} 

Normal Dede'miz çok iyi niyetli. Her gelen toruna sorgu sual sormadan elindekinden veriyor. Dede.java sınıfını şu şekilde tanımladık.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class Dede implements IDede {

    private Integer toplamDagitilacakHarclik;

    @Override
    public boolean harclikVer(Integer alinacakHarclik) {
    
        toplamDagitilacakHarclik = toplamDagitilacakHarclik - alinacakHarclik;
       
        return toplamDagitilacakHarclik >= 0;
    }
    }

AtomicDede ise elindeki toplam harçlık miktarını AtomicInteger nesnesi kullanarak tutuyor. AtomicInteger sınıfı, üzerindeki eksiltme arttırma gibi işlemleri atomic olarak halledebiliyor ve araya başka thread girmiyor.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
public class AtomicDede implements IDede {

    private AtomicInteger toplamDagitilacakHarclik;

    @Override
    public boolean harclikVer(Integer alinacakHarclik) {
         
        toplamDagitilacakHarclik.addAndGet(-alinacakHarclik);
       
        return toplamDagitilacakHarclik.get() >= 0;
    }
}   

SemaphoreDede harçlık verme işini bir kabinde yapıyor ve o kabine aynı anda sadece bir torunu alıyor. Kullandığı Semaphore mutex kilidini kullanarak, harclikVer metoduna ilk giren threadle birlikte acquire() metodu ile Semaphore'daki izin miktarını 1 eksiltiyor. Ve bu ilk giren thread işini bitirene, çıkarken de release() metodunu çağırana kadar da içeriye başka thread almıyor.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
public class SemaphoreDede implements IDede {

    private Integer toplamDagitilacakHarclik;
    
    private Semaphore mutex = new Semaphore(1);

    @Override
    public boolean harclikVer(Integer alinacakHarclik) {
       
        try {
            mutex.acquire();
           
            toplamDagitilacakHarclik = toplamDagitilacakHarclik - alinacakHarclik;
           
            mutex.release();
        } catch (InterruptedException e) {

            e.printStackTrace();
        }
       
        return toplamDagitilacakHarclik >= 0;
    }

}

Örnek projemizde ElOpmeHarclikAlmaThread.java ismindeki sınıf ile torunun dedenin elini öpmesini simüle edeceğiz.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
public class ElOpmeHarclikAlmaThread  extends Thread {

    private IDede dede;
    
    private Torun torun;
    
    public ElOpmeHarclikAlmaThread(IDede dede, Torun torun) {
        this.dede = dede;
        this.torun = torun;
    }

    @Override
    public void run() {

        torun.dedeninEliniOp(dede);
    }

}

BayramKutlama.java sınıfımızda da simülasyon kodlarımız bulunuyor. Torun sayısı kadar Thread oluşturuyor ve başlatıyoruz.Sonra tüm threadlerin bitmesini join() metodu ile bekliyoruz. En sonunda dedenin elinde kalan para miktarının sıfır olmasını bekliyoruz. Sıfır değil ise işler karışmış demektir.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
public class BayramKutlama {
    
    public void bayraminizKutluOlsun(IDede dede) {
        
        List<ElOpmeHarclikAlmaThread> elOpmeThreadleri = new ArrayList<>();
       
        dede.setToplamDagitilacakHarclik(100000);
       
        int torunSayisi = 1000;
               
        int harclikMiktari = 100;
       
        for(int i = 0; i < torunSayisi; i++) {
           
            Torun torun = new Torun(harclikMiktari);
           
            ElOpmeHarclikAlmaThread elOpmeThread = new ElOpmeHarclikAlmaThread(dede, torun);
           
            elOpmeThreadleri.add(elOpmeThread);
        }
       
       
        for(int i = 0; i < torunSayisi; i++) {
       
            elOpmeThreadleri.get(i).start();
        }
       
       
        // Tum threadlerin bitmesini bekle
        for(int i = 0; i < torunSayisi; i++) {
           
            try {
                elOpmeThreadleri.get(i).join();
               
                if(!elOpmeThreadleri.get(i).getTorun().isHarclikAlabildim()) {
                   
                    System.out.println( (i + 1) + ". Torun harcligini tam alamamis!!");
                }
               
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        System.out.println(dede.getClass().getSimpleName() + " Bitirdi. Elinde kalan miktar " + dede.getKalanHarclik());
        if(dede.getKalanHarclik() > 0) {
           
            System.out.println(dede.getClass().getSimpleName() + " BASARISIZ!!!");
           
        } else {
           
            System.out.println("Dedenin elinde hic para kalmadi. Berhudar olsunlar!");
        }
    }
}

BayramApp.java sınıfında da tüm dede tiplerimiz için simülasyonumuzu koşturuyoruz. Sonuçları konsola yazdırıyoruz. Üst üste çalıştırarak sonuçların hep aynı olduğunu görüyoruz. Sadece normal Dede sınıfımızda dedemizin elinde kalan miktar sıfırdan farklı oluyor. Diğer dedelerimiz kullandıkları yöntemlerle kritik kaynaklarını korumanın bir yolunu bulmuş görünüyorlar.

Bayram Harçlığı Output
Bayram Harçlığı Output

 

Output:

Dedeler harcliklari dagittiginde ellerinde hic para kalmamasi lazim!
--------
Basliyoruz
--------
Dede Bitirdi. Elinde kalan miktar 2700
Dede BASARISIZ!!!
Dede hesaplama suresi 54

AtomicDede Bitirdi. Elinde kalan miktar 0
Dedenin elinde hic para kalmadi. Berhudar olsunlar!
AtomicDede hesaplama suresi 49

SynchronizedDede Bitirdi. Elinde kalan miktar 0
Dedenin elinde hic para kalmadi. Berhudar olsunlar!
SynchronizedDede hesaplama suresi 51

SemaphoreDede Bitirdi. Elinde kalan miktar 0
Dedenin elinde hic para kalmadi. Berhudar olsunlar!
SemaphoreDede hesaplama suresi 50

Örnek projemizi GitHub'da şuradan indirip kendiniz de deneyebilirsiniz.



6 Nisan 2021 Salı

JTS CBS Kütüphanesi Rehberi 5 - Quadtree Nedir? Java'da Örnek Kullanım

Her düğümünün (node) 4 adet çocuğu (child) olan ağaç (tree) veri yapısına quadtree denir. Genellikle 2 boyutlu bir yüzeyi 4 eşit alana bölmek için kullanılır. Bu bölümler de yinelemeli olarak 4 er eşit parçaya ayrılır. Bu şekilde her bir alan quadtree yapısında tutulur.

 

Quadtree nedir?
Quadtree

Java'da quadtree örneği görselleştirmesini JTS (Java Topology Suite) kütüphanesinde bulunan Quadtree sınıfı ile yapacağız. 

Öncelikle 100 adet rastgele nokta türünde geometri tanımlayalım. Bu noktaları tanımladığımız Quadtree nesnesine ekleyeceğiz. 

quadTree.insert(Envelope itemEnv, Object item);

insert metodu ile verdiğimiz "item" nesnesi Envlope (zarf, kapsam) ile tanımlanan konuma indekslenir. Daha sonra belli bir arama / tarama dikdörtgeni kullanarak quadtree nesnesinde bu alana denk gelen itemler sorgulanır.

quadTree.query(Envelope searchEnv);

query() metodunun Java dokümanında query metodunun döndüğü sonuçlar arasında searchEnv arama alanında olmayan nesnelerin de dönülebileceği belirtilmiş. Yani false positive sonuçlar da dönülebilmektedir. JTS geliştiricileri, sevimsiz bir şekilde, bu false positive sorgu sonuçlarını elemek sorumluluğunu kullanıcıya bırakmışlar. Bu nedenle dönen sorgu sonuçlarını bir kez de tarama poligonuyla kesiştirip, kesişmeyenleri sonuç listesinden sileceğiz. query()'yi kullanmayıp direk poligon ile kesişim hesaplamamamızın sebebi, query metodu ile tree içindeki yüksek sayıdaki nesnelerin çoğunu eleyerek daha az sayıda nesnede kesişim hesaplamamızı sağlaması, bu sayede performans kazancı sağlamasıdır.

Görselleştirme amacıyla, quadTree'ye eklediğimiz tüm noktaları ekrana çizdireceğiz. Arama tarama dikdörgenimizi ve query sorgusundan dönen noktaları, false positive sonuçları temizlemiş bir şekilde, kırmızı renge boyayacağız. Dışarda kalan noktaları maviye boyayacağız.

                GeometryFactory geometryFactory = new GeometryFactory();

                Random randomX = new Random(System.currentTimeMillis());
               
                Random randomY = new Random(System.currentTimeMillis() + 100);
               
                List<Coordinate> noktaKoordinatlari = new ArrayList<>();

                int noktaSayisi = 100;
               
                Point[] noktalar = new Point[noktaSayisi];

                Quadtree quadTree = new Quadtree();
               
                for(int i = 1; i <= noktaSayisi; i++) {
                   
                    int xRandomlySelected = randomX.nextInt(250) + 65;
                   
                    int yRandomlySelected = randomY.nextInt(250) + 50;
                   
                    Coordinate coordinate = new Coordinate(xRandomlySelected, yRandomlySelected);
                   
                    noktaKoordinatlari.add(coordinate);
               
                    noktalar[i-1] = geometryFactory.createPoint(coordinate);
                   
                    quadTree.insert(noktalar[i-1].getEnvelopeInternal(), noktalar[i-1]);
                   
                }
               
                Coordinate[] coordinates = new Coordinate[] { new Coordinate(150, 60), new Coordinate(250, 60),  new Coordinate(250, 250),new Coordinate(150, 250), new Coordinate(150, 60)};
               
                Polygon cercevePoligon = geometryFactory.createPolygon(coordinates);
               
                List<Object> cerceveOlasiKapsananNoktalar = quadTree.query(cercevePoligon.getEnvelopeInternal());
               
                List<Point> falsePositives = new ArrayList<>();
               
                for (Object c : cerceveOlasiKapsananNoktalar) {
                    Point p = (Point) c;
                   
                    System.out.println(p + " intersects polygon: " + cercevePoligon.intersects(p) + " envlope " + p.getEnvelopeInternal());
                   
                    if(!cercevePoligon.intersects(p)) {
                        falsePositives.add(p);
                    }
                }
               
                cerceveOlasiKapsananNoktalar.removeAll(falsePositives);

JTS Quadtree Visualisation
JTS Quadtree Visualisation

Github'daki örnek JTS eğitim projemizdeki QuadtreeGorsellestirme.java sınıfını çalıştırarak görselleştirebilirsiniz.

 Önceki bölümler:

  1.  JTS CBS Kütüphanesi Rehberi  1 - Geometri Modeli
  2.  JTS CBS Kütüphanesi Rehberi  2 - Geometrik İlişki Hesaplamaları 
  3.  JTS CBS Kütüphanesi Rehberi  3 - Geometrik Alan Hesaplamaları
  4.  JTS CBS Kütüphanesi Rehberi 4 - Delaunay Üçgenleme, Voronoi Diyagram, Convex Hull



2 Nisan 2021 Cuma

JTS CBS Kütüphanesi Rehberi 4 - Delaunay Üçgenleme, Voronoi Diyagram, Convex Hull

 Previously on JTS

  1.  JTS CBS Kütüphanesi Rehberi  1 - Geometri Modeli
  2.  JTS CBS Kütüphanesi Rehberi  2 - Geometrik İlişki Hesaplamaları 
  3.  JTS CBS Kütüphanesi Rehberi  3 - Geometrik Alan Hesaplamaları

Merhabalar. JTS (Java Topology Suite) rehberimizin önceki bölümlerinde geometri modellerini tanımış, geometrilerin birbiri ile ilişkilerini incelemiş, daha sonra ise geometrik alan hesaplamaları üzerinde durmuştuk. Bu bölümde ise Delaunay Triangulation üçgenleme algoritması ile nasıl üçgenler oluşturulacağını, Voronoi diyagramı üretmeyi ve convex hull poligonu üretimini göreceğiz. Tüm görselleştirme örnek kodlarına GitHub'da şuradan ulaşabileceğinizi hatırlatarak başlayalım. 

Delaunay Triangulation / Üçgenleme

Delaunay triangulation / üçgenleme algoritması, bir nokta setinden anlamlı üçgenler oluşturma yöntemidir. Yüzey modelleme, (terrain modelling), mesh üretme ve rota planlama gibi alanlarda kullanılabilmektedir. Biz örneğimizde rastgele koordinatlardan oluşan bir nokta seti oluşturup JTS'den DelaunayTriangulationBuilder sınıfını kullanarak bu noktalardan bize üçgenler üretmesini isteyeceğiz. Nokta sayısını 100 ve 1000 yaparak iki defa çalıştırıp çıkan sonuçları görselleştireceğiz. Örnek projemizdeki DelaunayUcgenleme.java sınıfını çalıştırarak görselleştirebilirsiniz.

                GeometryFactory geometryFactory = new GeometryFactory();

                Random randomX = new Random(System.currentTimeMillis());
               
                Random randomY = new Random(System.currentTimeMillis() + 100);
               
                List<Coordinate> coords = new ArrayList<>();

                int noktaSayisi = 100;

                for(int i = 1; i <= noktaSayisi; i++) {
                   
                    int xRandomlySelected = randomX.nextInt(405) + 25;
                   
                    int yRandomlySelected = randomY.nextInt(405) + 20;
                   
                    System.out.println(i + ". Rastgele secilen nokta " + xRandomlySelected + ", " + yRandomlySelected);

                    coords.add(new Coordinate(xRandomlySelected, yRandomlySelected));
               
                }
               
                DelaunayTriangulationBuilder ucgenBuilder = new DelaunayTriangulationBuilder();
               
                ucgenBuilder.setSites(coords);
               
                Geometry triangles = ucgenBuilder.getTriangles(geometryFactory);
               
                List<Polygon> uretilenUcgenler = new ArrayList<>();
               
                if(triangles instanceof GeometryCollection) {
                   
                    GeometryCollection geometryCollection = (GeometryCollection) triangles;
                   
                    System.out.println("Üretilen üçgen sayısı: " + geometryCollection.getNumGeometries());
                   
                    for(int i = 0; i < geometryCollection.getNumGeometries(); i++) {
                       
                        Polygon ucgen = (Polygon) geometryCollection.getGeometryN(i);
                       
                        uretilenUcgenler.add(ucgen);
                    }
                   
                }

Delaunay triangulation / üçgenleme
Delaunay triangulation / üçgenleme

Nokta sayısını 1000 yaparsak aşağıdaki gibi bir çizimle karşılaşıyoruz.

Delaunay triangulation / üçgenleme noktalar
Delaunay triangulation / üçgenleme noktalar

Voronoi Diagram / Diyagram

Matematikte, bir Voronoi diyagramı, bir düzlemin belirli bir nesne kümesinin her birine yakın bölgelere bölünmesidir. En basitinden, bu nesneler düzlemdeki sonlu sayıda noktadır (tohumlar, siteler veya oluşturucular olarak adlandırılır). Her tohum için, o tohuma diğerlerinden daha yakın olan düzlemin tüm noktalarından oluşan, Voronoi hücresi (Voronoi cell) adı verilen bir bölge vardır. Biyolojiden kimyaya, sağlıktan mühendisliğe çok çeşitli kullanım alanları mevut.

Üçgenleme örneğimize benzer şekilde rastgele 100 noktadan VoronoiDiagramBuilder sınıfını kullanarak Voronoi diyagramı oluşturacağız. Örnek projemizdeki VoronoiDiagramGorsellestirme.java sınıfını çalıştırarak görselleştirebilirsiniz.

                GeometryFactory geometryFactory = new GeometryFactory();

                Random randomX = new Random(System.currentTimeMillis());
                
                Random randomY = new Random(System.currentTimeMillis() + 100);
                
                List<Coordinate> coords = new ArrayList<>();

                int noktaSayisi = 100;

                for(int i = 1; i <= noktaSayisi; i++) {
                    
                    int xRandomlySelected = randomX.nextInt(250) + 65;
                    
                    int yRandomlySelected = randomY.nextInt(250) + 50;
                    
                    System.out.println(i + ". Rastgele secilen nokta " + xRandomlySelected + ", " + yRandomlySelected);

                    coords.add(new Coordinate(xRandomlySelected, yRandomlySelected));
                
                }
                
                VoronoiDiagramBuilder diagramBuilder = new VoronoiDiagramBuilder();
                
                diagramBuilder.setSites(coords);
                
                Geometry triangles = diagramBuilder.getDiagram(geometryFactory);
                
                List<Polygon> uretilenPoligonlar = new ArrayList<>();
                
                if(triangles instanceof GeometryCollection) {
                    
                    GeometryCollection geometryCollection = (GeometryCollection) triangles;
                    
                    System.out.println("Üretilen poligon sayısı: " + geometryCollection.getNumGeometries());
                    
                    for(int i = 0; i < geometryCollection.getNumGeometries(); i++) {
                        
                        Polygon poligon = (Polygon) geometryCollection.getGeometryN(i);
                        
                        uretilenPoligonlar.add(poligon);
                    }
                    
                }

Voronoi Diagram / Diyagram
Voronoi Diagram / Diyagram

Convex Hull - Dışbükey Örtü, Zarf

Convex hull, bir geometrinin tüm noktalarını kapsayan en küçük poligon olarak tanımlanabilir. Örneğimizde, rastgele tanımladığımız 100 noktadan bir MultiPoint nesnesi oluşturacak ve bu nesnenin convexHull() metodu ile zarf poligonunu üreteceğiz. Örnek projemizdeki ConvexHullGorsellestirme.java sınıfını çalıştırarak görselleştirebilirsiniz.

                GeometryFactory geometryFactory = new GeometryFactory();

                Random randomX = new Random(System.currentTimeMillis());
               
                Random randomY = new Random(System.currentTimeMillis() + 100);
               
                List<Coordinate> noktaKoordinatlari = new ArrayList<>();

                int noktaSayisi = 100;
               
                Point[] noktalar = new Point[noktaSayisi];

                for(int i = 1; i <= noktaSayisi; i++) {
                   
                    int xRandomlySelected = randomX.nextInt(250) + 65;
                   
                    int yRandomlySelected = randomY.nextInt(250) + 50;
                   
                    System.out.println(i + ". Rastgele secilen nokta " + xRandomlySelected + ", " + yRandomlySelected);

                    Coordinate coordinate = new Coordinate(xRandomlySelected, yRandomlySelected);
                   
                    noktaKoordinatlari.add(coordinate);
               
                    noktalar[i-1] = geometryFactory.createPoint(coordinate);
                }
               
                MultiPoint multiPoint = geometryFactory.createMultiPoint(noktalar);
                 
                Polygon convexHull = (Polygon) multiPoint.convexHull();

Convex Hull - Zarf
Convex Hull - Zarf

Bu bölümde Delaunay üçgenlemesi ile bir nokta setinden nasıl üçgen üretileceğini, nasıl Voronoi diyagram oluşturulacağını, convex hull poligon geometrisinin nasıl hesaplanacağını gördük. Faydalı olması dileğiyle... 

Önceki Bölümler

  1.  JTS CBS Kütüphanesi Rehberi  1 - Geometri Modeli
  2.  JTS CBS Kütüphanesi Rehberi  2 - Geometrik İlişki Hesaplamaları 
  3.  JTS CBS Kütüphanesi Rehberi  3 - Geometrik Alan Hesaplamaları

Sonraki Bölüm:

JTS CBS Kütüphanesi Rehberi 5 - Quadtree Nedir? Java'da Örnek Kullanım

21 Mart 2021 Pazar

JTS CBS Kütüphanesi Rehberi 3 - Geometrik Alan Hesaplamaları

Previously on JTS

  1.  JTS CBS Kütüphanesi Rehberi  1 - Geometri Modeli
  2. JTS CBS Kütüphanesi Rehberi  2 - Geometrik İlişki Hesaplamaları 

Merhabalar. JTS (Java Topology Suite) rehberimizin önceki bölümlerinde geometri modellerini tanımış, daha sonra ise geometrilerin birbiri ile ilişkilerini incelemiştik. Bu bölümde alan hesaplama yetenekleri üzerinde duracağız. Tüm görselleştirme örnek kodlarına GitHub'da şuradan ulaşabileceğinizi hatırlatarak başlayalım.

Intersection - Kesişim Alanı Hesaplama 

İki adet poligon tanımlayıp bunların kesişim alanını intersection() metodu ile hesaplatıp farklı renkle boyayalım. Örnek projemizdeki KesisimAlanHesaplama.java sınıfını çalıştırarak görselleştirebilirsiniz. 

GeometryFactory geometryFactory = new GeometryFactory();

                Coordinate[] coordinates = new Coordinate[] { new Coordinate(150, 60),
                        new Coordinate(325, 180),new Coordinate(90, 150), new Coordinate(150, 60)};

                Coordinate[] coordinates2 = new Coordinate[] { new Coordinate(210, 120), new Coordinate(350, 120),
                        new Coordinate(400, 210),new Coordinate(250, 300), new Coordinate(180, 150), new Coordinate(210, 120)};
               
                Polygon maviPolygon = geometryFactory.createPolygon(coordinates);
               
                Polygon sariPolygon = geometryFactory.createPolygon(coordinates2);
               
                Polygon kesisimAlani = (Polygon) sariPolygon.intersection(maviPolygon);

Geometrik Kesişim Alan Hesaplama
Geometrik Kesişim Alan Hesaplama

Union - Birleşim Alanı Hesaplama

Kesişim örneğinde tanımladığımız mavi ve sarı poligonun birleşim alanını union() metodu ile hesaplatıp boyayalım. Örnek projemizdeki BirlesimAlanHesaplama.java sınıfını çalıştırarak görselleştirebilirsiniz. 

GeometryFactory geometryFactory = new GeometryFactory();

                Coordinate[] coordinates = new Coordinate[] { new Coordinate(150, 60),
                        new Coordinate(325, 180),new Coordinate(90, 150), new Coordinate(150, 60)};

                Coordinate[] coordinates2 = new Coordinate[] { new Coordinate(210, 120), new Coordinate(350, 120),
                        new Coordinate(400, 210),new Coordinate(250, 300), new Coordinate(180, 150), new Coordinate(210, 120)};
               
                Polygon maviPolygon = geometryFactory.createPolygon(coordinates);
               
                Polygon sariPolygon = geometryFactory.createPolygon(coordinates2);
               
                Polygon birlesimPoligonu = (Polygon) sariPolygon.union(maviPolygon);

Birleşim Alan Hesaplama (Union)
Birleşim Alan Hesaplama (Union)

Unary Union - Tekil Birleşim Alanı Hesaplama

Geometri parametresi almayan union() metodu tekil birleşim operasyonunu gerçekleştirmektedir. Çağrıldığı geometri nesnesi içindeki geometrileri birleştirip bir sonuç dönmektedir. Bizim örneğimizde sarı ve mavi poligondan bir adet MultiPolygon nesnesi oluşturup bu nesnede unary union() metodunu kullanarak yine aynı birleşim poligonunu elde ettiğimizi göreceğiz. Örnek projemizdeki TekilBirlesimAlanHesaplama.java sınıfını çalıştırarak görselleştirebilirsiniz.

 GeometryFactory geometryFactory = new GeometryFactory();

                Coordinate[] coordinates = new Coordinate[] { new Coordinate(150, 60),
                        new Coordinate(325, 180),new Coordinate(90, 150), new Coordinate(150, 60)};

                Coordinate[] coordinates2 = new Coordinate[] { new Coordinate(210, 120), new Coordinate(350, 120),
                        new Coordinate(400, 210),new Coordinate(250, 300), new Coordinate(180, 150), new Coordinate(210, 120)};
                
                Polygon maviPolygon = geometryFactory.createPolygon(coordinates);
                
                Polygon sariPolygon = geometryFactory.createPolygon(coordinates2);
                
                MultiPolygon multiPoligon = geometryFactory.createMultiPolygon(new Polygon[] {sariPolygon, maviPolygon});
                
                Polygon birlesimPoligonu = (Polygon) multiPoligon.union();

Tekil Birleşim Alan Hesaplama (Unary Union)
Tekil Birleşim Alan Hesaplama (Unary Union)

Difference - Fark Alanı Hesaplama

Yine aynı mavi ve sarı poligon ile devam ediyoruz. Sarı poligonun mavi poligondan farkını difference() metodu ile hesaplatıp boyayalım. Örnek projemizdeki FarkAlanHesaplama.java sınıfını çalıştırarak görselleştirebilirsiniz.

GeometryFactory geometryFactory = new GeometryFactory();

                Coordinate[] coordinates = new Coordinate[] { new Coordinate(150, 60),
                        new Coordinate(325, 180),new Coordinate(90, 150), new Coordinate(150, 60)};

                Coordinate[] coordinates2 = new Coordinate[] { new Coordinate(210, 120), new Coordinate(350, 120),
                        new Coordinate(400, 210),new Coordinate(250, 300), new Coordinate(180, 150), new Coordinate(210, 120)};
               
                Polygon maviPolygon = geometryFactory.createPolygon(coordinates);
               
                Polygon sariPolygon = geometryFactory.createPolygon(coordinates2);
               
                Polygon farkPoligonu = (Polygon) sariPolygon.difference(maviPolygon);

Fark Alan Hesaplama (Difference)
Fark Alan Hesaplama (Difference)

Symetric Difference - Simetrik Fark Alanı Hesaplama

Bu örnekten yola çıkarak symDifference() metodunu kullanarak hesapladığımız simetrik farkı, sarı poligonun mavi poligondan farkı ile, mavinin sarıdan farkının birleşimi olarak tanımlayabiliriz. Örnek projemizdeki SimetrikFarkAlanHesaplama.java sınıfını çalıştırarak görselleştirebilirsiniz.

GeometryFactory geometryFactory = new GeometryFactory();

                Coordinate[] coordinates = new Coordinate[] { new Coordinate(150, 60),
                        new Coordinate(325, 180),new Coordinate(90, 150), new Coordinate(150, 60)};

                Coordinate[] coordinates2 = new Coordinate[] { new Coordinate(210, 120), new Coordinate(350, 120),
                        new Coordinate(400, 210),new Coordinate(250, 300), new Coordinate(180, 150), new Coordinate(210, 120)};
               
                Polygon maviPolygon = geometryFactory.createPolygon(coordinates);
               
                Polygon sariPolygon = geometryFactory.createPolygon(coordinates2);
               
                MultiPolygon simetrikFarkPoligonu = (MultiPolygon) sariPolygon.symDifference(maviPolygon);

Simetrik Fark Alan Hesaplama (Symetric Difference)
Simetrik Fark Alan Hesaplama (Symetric Difference)

Buffer - Tampon Alanı Hesaplama

Bir geometrinin sınırlarından istediğimiz birim kadar genişletilmiş şekilde yeni bir geometri elde etmek için buffer() metodunu kullanırız. Örneğimizde, sarı ve mavi poligonlardan 30 birim tamponlu daha geniş poligonlar elde edelim. Örnek projemizdeki TamponAlanHesaplama.java sınıfını çalıştırarak görselleştirebilirsiniz.

GeometryFactory geometryFactory = new GeometryFactory();

                Coordinate[] coordinates = new Coordinate[] { new Coordinate(150, 60),
                        new Coordinate(325, 180),new Coordinate(90, 150), new Coordinate(150, 60)};

                Coordinate[] coordinates2 = new Coordinate[] { new Coordinate(210, 120), new Coordinate(350, 120),
                        new Coordinate(400, 210),new Coordinate(250, 300), new Coordinate(180, 150), new Coordinate(210, 120)};
               
                Polygon maviPolygon = geometryFactory.createPolygon(coordinates);
               
                Polygon sariPolygon = geometryFactory.createPolygon(coordinates2);
               
                Polygon tamponluSariPoligon = (Polygon) sariPolygon.buffer(30);
               
                Polygon tamponluMaviPoligon = (Polygon) maviPolygon.buffer(30);

Tamponlu Alan Hesaplama (Buffer)
Tamponlu Alan Hesaplama (Buffer)
 

Önceki Bölümler

  1.  JTS CBS Kütüphanesi Rehberi  1 - Geometri Modeli
  2. JTS CBS Kütüphanesi Rehberi  2 - Geometrik İlişki Hesaplamaları 

Sonraki Bölümler:

JTS CBS Kütüphanesi Rehberi 4 - Delaunay Üçgenleme, Voronoi Diyagram, Convex Hull 

JTS CBS Kütüphanesi Rehberi 5 - Quadtree Nedir? Java'da Örnek Kullanım

 


19 Mart 2021 Cuma

Mühendis Özlü Sözleri


 

 
1. “Mühendisler problem çözmeyi severler. Eğer ortada çözülecek problem yoksa, kendi elleriyle oluştururlar."
- Scott Adams

2. “Mükemmellik, ekleyecek birşey kalmadığında değil, çıkarak birşey kalmadığında elde edilir.”
- Antoine de Saint-Exupery

3. “Bizim işimizde sorun insanların senin fikirlerini çalmasını engellemek değildir, tam aksine fikirlerinizi çalmalarını sağlamaktır!”
- Howard Aiken

4. “Matematik benim tutkum, mühendislik ise mesleğim.”
- Wilfred James Dolor

5. “Herhangi bir aptal ayakta duran bir köprü inşa edebilir, ancak sadece bir mühendis ancak zar zor ayakta duran bir köprü yapabilir.”
- Anonim

6. “İnsan ayağı tam bir mühendislik harikası ve sanat eseridir.”
- Leonardo da Vinci

7. “Ne kadar az hareketli parça, o kadar iyi." "Gerçekten. Mühendislik alanında bundan daha doğru bir söz henüz söylenmedi.”
- Christian Cantrell

8. “Birşeylerin nasıl çalıştığını gerçekten öğrenmek istiyorsanız, o şeyi dağılıp parçalanırken inceleyin.”
- William Gibson

9. “Elli kişi tarafından daha iyi yapılamayacak, beş yüz kişilik bir mühendislik ekibi tarafından yapılan bir işi hiç görmedim.”
- C. Gordon Bell

10. “İnsanların tamamen kusursuz bir şey tasarlamaya çalışırken yaptıkları yaygın bir hata, tamamen aptalların zekasını hafife almaktır.”
- Douglas Adams

11. “Yaptığınız her şeyde mükemmellik için çabalayın. Var olanın en iyisini alın ve daha iyi hale getirin. Var olmadığı zaman, onu tasarlayın.”
- Sir Henry Royce

12. “Normal insanlar, kırılmazsa tamir edilmeyeceğine inanırlar. Mühendisler, kırılmazsa henüz yeterli özelliğe sahip olmadığına inanırlar.”
- Scott Adams

13. “Birinci mühendislik kuralı; prototiplere dikkat edin. Bununla birlikte, kendi özgün iş yapış şekline sahip olmayan bir mühendis tarafından yapılan her şeyden kaçının.”
- Simon R. Green

14. “İyi fikirlere sahip olmanın püf noktası, görkemli bir izolasyon içinde oturup büyük düşünceler düşünmeye çalışmak değildir. İşin püf noktası masaya daha fazla parça almaktır.”
- Steven Johnson

15. “John Kobak şöyle der: Herhangi bir şey öğrenmenin yolu, bir şeyin başarısız olması ve bir daha nasıl başarısız olamayacağını anlamanızdır.”
- Robert S. Arrighi

16. “İmalat, parçaları bir araya getirmekten daha fazlasıdır. Fikirler ortaya koymak, temel ilkeleri test etmek ve mühendisliğin yanı sıra son montajı mükemmelleştirmektir."
- James Dyson

17. “Garbolojinin kötü kokulu alanının roket bilimi, petrol keşfi veya beyin cerrahisinin popülaritesine ulaşmamış olması şaşırtıcı değildir."
- Hans Y. Tammemagi

18. “Tamamladığımız projeler bildiklerimizi gösteriyor - gelecek projeler ne öğreneceğimize karar veriyor.”
- Dr. Mohsin Tiwana

19. “Vaktimi yüksek konseptli şeyler hakkında insanları kandırmakla harcamıyorum; Zamanımı mühendislik ve üretim problemlerini çözmek için harcıyorum.”
- Elon Musk

20. “İyi bir bilim adamı, özgün fikirleri olan kişidir. İyi bir mühendis, mümkün olduğunca az fikirle çalışan bir tasarım yapan kişidir.”
- Freeman Dyson

21. “Benim gibi daha fazla mühendis teknolojiden nefret etseydi dünya daha iyi bir yer olurdu. Tasarladığım şeyleri, başarılı olursam kimse fark etmeyecek. İşler sadece işe yarayacak ve kendi kendini yönetecek.”
- Radia Pearlman

22. “İyimser için bardağın yarısı dolu. Karamsar için bardağın yarısı boş. Mühendis için bardak, olması gerekenden iki kat daha büyük."
- Anonim

23. “Gençlerin tüm insanlık için, daha iyi bir yarın için, bilim ve mühendislikle ilgilenmelerini sağlamaktan daha güçlü bir şekilde inandığım hiçbir şey yok.”

 - Bill Nye

24. “Ama şunu unutma, evlat... Uçaklar savaş için var olmadılar. Para kazanmak için de değiller. Uçaklar güzel rüyalardır. Mühendisler hayalleri gerçeğe dönüştürürler."
- Hayao Miyazaki

25. “Genellikle imkansız olduğunu düşündüğümüz şeyler basit mühendislik problemleridir... Bunları engelleyen fizik yasası yoktur.”
- Michio Kaku

26. “Başlangıçta bir mühendis olmam gerekiyordu, ancak yaratıcı enerjimi, amaç olarak iğrenç bir sermaye kazancı ile günlük yaşamı daha da rafine hale getiren şeylere harcamak zorunda kalma düşüncesi benim için dayanılmazdı.”
- Albert Einstein

27. “En önemli şey, en önemli şeyin en önemli şey olarak kalmasını sağlamaktır.”
- Donald P. Coduto

28. “Elektronları keşfetmek ve hareketlerini yöneten denklemleri bulmak heyecan vericidir; ama bu prensipleri elektrikli konserve açacakları tasarlamak için kullanmak sıkıcı. Şimdilerde artık sadece konserve açacakları var.”
- Neal Stephenson

29. “Uçaklar bilim tarafından değil, tersine sanat tarafından tasarlanmıştır. Mühendisliğin bilim olmadan da yapabileceğini söylemek istemiyorum, aksine bilimsel temellere dayanmaktadır, ancak bilimsel araştırma ile mühendislik ürünü arasında mühendisin sanatı tarafından kapatılması gereken büyük bir boşluk vardır.”
- British Engineer to the Royal Aeronautical Society, 1922.

30. “Mükemmel bir köprü, bir milletin ihtişamını ve dehasını tanıtmaya hizmet etmesi gereken büyük bir anıttır; kişi kendini mimari olarak mükemmelleştirme çabalarıyla meşgul etmemelidir. Çünkü zevk her zaman değişime açıktır. Ancak her zaman yapısında ve dekorasyonunda uygun olan sağlamlık karakterini muhafaza etmeye çalışmalıdır.”
- Jean Peronnet

31. “Mühendis, rakamlarla arası iyi olan, ancak bir muhasebeci kişiliğine sahip olmayan kişidir.”
- Anonim

32. “Mimarlar ve mühendisler, halkın rızası, halkın onayı ve çoğu zaman kamu parasıyla kendi anıtlarını inşa ettikleri için en şanslı insanlar arasındadır.”
- John Prebble

33. “Mühendislik, tamamen anlamadığımız malzemeleri, doğru bir şekilde değerlendiremeyeceğimiz kuvvetlere dayanacak şekilde kesin olarak analiz edemeyeceğimiz şekillere dönüştürme sanatıdır, öyle ki halkın cehaletimizin kapsamından şüphelenmek için hiçbir nedeni yoktur.”
- Dr. AR Dykes

 

34. “Mühendislik, bazı bilinen ihtiyaçları karşılamak için çevremizdeki fiziksel dünyayı dönüştüren herhangi bir yapının tasarımını ve yapımını düzenleme çabasını ifade eder.”
- G.F.C. Rogers

35. “Mühendislik ... kabaca ama yetersiz olmayan bir şekilde tanımlayacak olursak, herhangi bir beceriksizin bir şekilde iki dolarla yapabileceği bir şeyi bir dolarla daha iyi yapma sanatıdır.”
- Arthur Mellen Wellington

36. “ Mühendisler ... sadece teknisyen değildir ve insana ve medeniyetin ilerlemesine fayda sağlamayı vaat etmeyen hiçbir projeye onay vermemeli veya isimlerini ödünç vermemelidir.”
- John Fowler

37. “Mühendisler ... insanüstü değildirler. Varsayımlarında, hesaplamalarında, sonuçlarında hatalar yaparlar. Hatalar yapmaları affedilebilir olduğu gibi onları yakalamaları da beklenir. Bu nedenle, modern mühendisliğin özü, sadece kişinin kendi işini kontrol edebilmesi değil, aynı zamanda işini kontrol ettirmesi ve başkalarının çalışmalarını kontrol edebilmesidir.”
- Henry Petroski

38. “Hayallerden gelen vizyonu alıp bilim ve matematiğin büyüsünü uygulayarak, mesleğimin mirasını ve doğanın malzemeleri hakkındaki bilgilerimi bir tasarım oluşturmak için birleştiriyorum.”
- Anonim


39. “Deneyim sadece teoriyi doğrulamaya hizmet etmekle kalmaz, aynı zamanda onu bozmadan ondan farklılık gösterir, teorinin ulaşamadığı yeni gerçeklere götürür.”
- Dalembert

40. “Bir tünel hattının döşenmesinden nihai tamamlanmasına kadar, iş ya proje sahiplerinin pahasına yapılmış bir dizi deney ya da önceki deneyimin sonuçlarının bir dizi mantıklı uygulaması olabilir.”
- H.S. Drinker

41. “İnşaat mühendisliğini tercih edin, çünkü inşaat mühendisliği size insanları yönetme konusunda en çok şeyi öğreten mühendislik dalıdır. İnsanları yönetmek çok, çok yararlı ve neredeyse ne yaptığınıza bakılmaksızın faydalı olan bir beceridir.”
- Sir John Harvey Jones

42. “Başarısız olmadım ama ampul yapmamak için 1000 yol buldum.”
- Thomas Edison

43. “Köprülerin inşasında uyulacak kuralların veya koşulların belirlenmesine karşıyım ki, bugünün önyargılarını veya hatalarını kanun olarak kaydetmek veya kayıt altına almak yarınki iyileşmenin önünü tıkamış utanç verici bir şey olabilir.”
- Isambard Kingdom Brunel

44. “Mühendislik tarihi gerçekten de bozulmaların ve bu bozulmalardan öğrenmenin tarihidir. Üniversitede bana şu öğretilmişti ki 'mühendis en çok hurdalıkta öğrenir.”
- C.A. Claremont, Spanning Space

45. “Mühendislere dikkat etmek gerekir. Dikiş makinesiyle başlarlar, atom bombasıyla bitirirler.”
- Marcel Pagnol, Critiques des Critiques


46. “Yıllar geçtikçe insanlar başta bilseler bile bunu hangi mühendisin yaptığını unuturlar. Veya bir politikacı ona kendi adını verir. Ya da onu finanse etmek için diğer insanların parasını kullanan bir sponsorun adı ile anarlar. Ancak mühendisin kendisi, sadece birkaç mesleğin bilebileceği tatminlerle geçmiş başarı zincirlerine bakar. Ve profesyonel meslektaşlarının övgüsü, istediği tek ödüldür.”
- Herbert Hoover

47. “Mühendislik veya teknoloji, daha önce var olmayan şeylerin yapımıdır, oysa bilim, uzun süredir var olan şeylerin keşfedilmesidir."
- David Billington

48.“Yanlış gidebilecek bir şey ile yanlış gitmesi mümkün olmayan bir şey arasındaki en büyük fark, yanlış gitmesi mümkün olmayan bir şey ters gittiğinde, genellikle ulaşıp tamir etmenin imkansız hale gelmesidir.”
- Douglas Adams

49. “Dünyanın refahı büyük ölçüde mühendislerin çalışmasına bağlıdır. Mesleğin büyük bir geleceği ve sınırsız kapsamı var; Her ülkede her türden yeni eser isteniyor ve istenecek ve hayal gücü ve hevese sahip genç bir adam için daha çekici bir meslek düşünemiyorum. Bilimsel bilgi kadar hayal gücü de gereklidir.”
-Sir William Halcrow

50. “Pek çok yönden köprü kurma hikayesinin medeniyet hikayesi olduğuna şüphe yok. Bununla, bir halkın ilerlemesinin önemli bir bölümünü kolaylıkla ölçebiliriz.”
- Franklin D. Roosevelt

51. “Mühendislik bilimden oldukça farklıdır. Bilim adamları doğayı anlamaya çalışır. Mühendisler doğada olmayan şeyler yapmaya çalışırlar. Mühendisler buluşu zorlarlar.”
- Yuan-Cheng Fung

52. “Mühendisler ve miktar ölçme uzmanları estetiği tartıştıklarında ve mimarlar vinçlerin ne yaptığını araştırdıklarında doğru yolda olacağız demektir.”
- Ove Arup

53. “Mühendisin hayatı boyunca yaptığı iş, doğal güçlerin sistematik olarak uygulanmasından ve doğal kaynakların insan hizmetinde sistematik olarak geliştirilmesinden oluşur.”
- Harry Walter Tyler

54. “Bilim adamı yeni bir malzeme veya enerji türü keşfeder ve mühendis bunun yeni bir kullanım alanını keşfeder.”
- Gordon Lindsay Glegg

55. Bir bilim adamı yeni bir yıldız keşfedebilir ama yıldız yapamaz. Bir mühendisten bunu kendisi için yapmasını istemesi gerekirdi.”
- Gordon Lindsay Glegg

56. “Mühendislik, yürüyen bir ansiklopedi gibi sadece bilmek ve bilgili olmak değildir; mühendislik yalnızca analiz değildir; mühendislik sadece var olmayan mühendislik problemlerine zarif çözümler getirme kapasitesine sahip olmak değildir; mühendislik, teknolojik değişimin gücünü organize etme sanatını icra etmektir… Mühendisler, bilim ve toplum arasında bir yerde çalışırlar.”
- Gordon Stanley Brown

57. “Binalarımızı şekillendiriyoruz, sonra onlar bizi şekillendiriyor.”
- Winston Churchill

58. “Mühendislik, insanlığın kullanımı ve rahatlığı için doğadaki büyük güç kaynaklarını yönlendirme sanatıdır.”
- Thomas Tredgold

59. “Mühendislik, refah üretmek için doğal kaynakların verimli kullanımına yönelik bilimin profesyonel ve sistematik uygulamasıdır."
- Theodore Jesse Hoover

60. “Mühendisler iş dünyasında iş insanlarından daha mı iyidir? Tartışmalı. İş adamları kesinlikle daha büyük evlere sahipler, daha süslü arabalar kullanıyorlar, daha güzel kıyafetler giyiyorlar ve daha iyi görünen arkadaşları var. Mühendisler bu tür parayı harcayacak zaman yönetimi becerilerinden yoksundur. Mümkün olan en hızlı ve en verimli şekilde en fazla parayı kazanmanın yollarını bulmak için tüm zamanlarını harcıyorlar. Ve sonra anladıklarında süreci optimize ediyorlar.”
- Raul Perez

61. “Kimse hatalarla öğrenmek istemez, ancak başarılardan son teknolojinin ötesine geçecek kadar öğrenemeyiz.”
- Henry Petroski

62. “Bilim hepimizi şaşırtabilir ve büyüleyebilir ama dünyayı değiştiren mühendisliktir.”
- Isaac Asimov

63. “Bilim adamları dünyayı olduğu gibi incelerler, mühendisler hiç olmamış dünyaları ortaya çıkarırlar.”
- Theodore von Karman

64. “Medeniyetin öyküsü, bir bakıma mühendisliğin öyküsüdür - doğanın güçlerini insanın iyiliği için çalıştırmaya yönelik o uzun ve çetin mücadeledir.”
- Lyon Sprague DeCamp
 

65. “Erkekler köprüler kurar ve çöllere demiryolları atarlar, ancak yine de bir düğmeyi dikmenin kendilerinin ötesinde olduğunu başarılı bir şekilde iddia ederler.”
- Heywood Broun

66. “İdeal mühendis bir karışımdır… O bir bilim adamı değildir, matematikçi değildir, sosyolog veya yazar değildir, ancak mühendislik problemlerinin çözümünde bu disiplinlerden herhangi birinin veya tümünün bilgi ve tekniklerini kullanabilir.”
- N.W. Dougherty

67. “Mühendislik, insanın kullanımı için doğa tarafından sağlanan ve depolanan, enerji, kinetik ve potansiyeli koruma bilimidir. Bu enerjiyi en iyi şekilde kullanmak mühendislik işidir, böylece mümkün olan en az israf yapılabilir.”
- William A. Smith
 

68. “Yeni ekonomik dünya hakkında bildiğimiz tek şey bize mühendis yetiştiren ulusların avukat yetiştirenlere üstün geleceğini söylüyor. Şimdiye kadar hiçbir millet, büyüklüğe giden yolu dava etmedi.”
- Richard Lamm

69. “Görüyorsunuz, amacım mühendislik dünyasını karıştırmak değil, sadece güzel bir sanat eseri ortaya koymaktı.”
- Kit Williams

70. “İyi bir mühendis tersten düşünür ve kendisine önerdiği bileşenlerin ve sistemlerin biçimsel sonuçlarını sorar.”
- Helmut Jahn

71. “Mühendislik dehasının büyük zaferleri - lokomotif, makas köprüsü, çelik ray - ... mühendislikten ziyade bir icattır.”
- Arthur Mellen Wellington
 

72. “Bir teori, tanımlayıcı olasılıklar açısından o kadar zengin olabilir ki, herhangi bir veriye uyacak şekilde yapılabilir.”
- Phillip Johnson-Laird

73. “Herhangi bir tasarım aşamasında mühendisin ilk sorunu, sorunun gerçekte ne olduğunu keşfetmektir.”
- Anonim

74. “Mevcut gerçeklikle savaşarak bir şeyleri asla değiştiremezsiniz. Bir şeyi değiştirmek için mevcut modeli geçersiz kılan yeni bir model oluşturun.”
- Buckminster Fuller

75. “Mühendislik zihni harekete geçirir. Çocuklar kolayca sıkılır. Dışarı çıkıp ellerini kirletmek zorundalar: bir şeyler yapmak, bir şeyleri parçalamak, bir şeyleri düzeltmek. Okullar bunu sunabildiğinde, bir hayat mühendisiniz olacak.”
- Bruce Dickinson

76. “Mühendislerin zorlamaları olmasaydı, insanlık tekerleği asla görmezdi, onun yerine yamuk yaygınlaşırdı. Çünkü pazarlamadaki biri herkesi büyük bir frenleme yeteneğine sahip olduğuna ikna ederdi.”
- Scott Adams

77. “O zamanlarda (1909) baş mühendis neredeyse her zaman aynı zamanda baş test pilotuydu. Bu, havacılığın erken dönemlerinde zayıf mühendisliği ortadan kaldırmaya yarayan bir şanstı.”
- Igor Sikorsky

78. “Sanırım bana en çok sorulan soru şu: "O kapsülün içinde oturup geri sayımı dinlerken nasıl hissettin?" Bunun cevabı kolay. Fırlatmaya hazır bir şekilde hepsi bir hükümet sözleşmesindeki en düşük teklif veren tarafından inşa edilen iki milyon parçanın üzerinde oturduğunuzu bilseniz tam olarak nasıl hissedeceğinizi hissettim.”
- John Glenn

79. “Biz, bilmeyenlerin önderliğindeki isteksizler, nankör için imkansız olanı yapıyoruz. Çok uzun zamandır o kadar çok şey yaptık ki, çok az şeyle, artık hiçbir şey yapmadan her şeyi yapmaya yetkin durumdayız."
- Anonim

80. “Ne zaman bir iş yapıp yapamayacağınız sorulduğunda, onlara 'Kesinlikle yapabilirim!' Deyin Sonra çalışın ve nasıl yapılacağını öğrenin.”
- Theodore Roosevelt

81. “Mühendis, filozof ile teknisyen arasında bir arabulucudur ve iki yabancı arasındaki bir tercüman gibi her ikisinin de dilini, dolayısıyla hem pratik hem de teorik bilgiye sahip olmanın mutlak gerekliliğini anlamalıdır.”
- Henry Palmer

82. “Bir problem üzerinde çalışırken asla güzelliğini düşünmem ama bitirdiğimde çözüm güzel değilse yanlış olduğunu bilirim.”
- R. Buckminster Fuller

83. "Bilim adamı, anlık bir sonucu hedeflemez. Gelişmiş fikirlerinin hemen ele alınacağını beklemez. Onun işi çiftçi gibidir. Görevi, gelecek olanların temelini atmak ve yolu göstermektir. O yaşar, çalışır ve umut eder.”
- Nikola Tesla

Daha fazlası için :

Yazılımcı Özlü Sözleri tıklayın.

Çalışmak ve İş ile Alakalı Atasözleri ve Deyimler 


Java'da Thread ve Semaphore Kullanımı Bayram Harçlığı Örneği

Normal Dede, SemaphoreDede, AtomicDede ve SynchronizedDede torunlarına bayram harçlığını doğru bir şekilde dağıtabilecek mi? Bayram harçlığı...