1 Nisan 2018 Pazar

4 - Açık Cezeri Kütüphanesi (rand ve randn komutları ile tek boyutlu sinyal işlemleri)

Herkese Merhaba, Açık Cezeri Kütüphanesi ile ilgili düzenlenen yeni yazı dizimize hoş geldiniz.

Not: OCL çok sık güncellendiği için, bu derse başlamadan önce github sitesinden OCL'nin son sürümünü indirip sisteminize kurmanız gerekmektedir. Bunun için 2.dersimiz olan OCL kurulumu dersine https://open-cezeri-library.blogspot.com.tr/2018/03/ack-cezeri-kutuphanesinin-kurulumu.html bakabilirsiniz.

Bu dersimizde OCL ile çeşitli istatistiksel işlemlerin tek boyutlu diziler üzerinde nasıl gerçekleştirildiğini inceleyeceğiz. Geçen derslerimizde hatırlarsanız OCL'de tek boyutlu diziler

CMatrix cm=CMatrix.getInstance(start,end,value);
CMatrix cm=CMatrix.getInstance().zeros(100,1);
CMatrix cm=CMatrix.getInstance().ones(100,1);
CMatrix cm=CMatrix.getInstance().ones(100,1).multiplyScalar(value);
CMatrix cm=CMatrix.getInstance().vector(0,0.1,360);
CMatrix cm=CMatrix.getInstance().linspace(0,360,1500);

yapılabiliyordu. Bunun dışında rand ve randn metotlarını kullanarak ta tek boyutlu sinyal üretebilirsiniz. rand ve randn komutlarını birçok şekilde kullanabiliriz. Diğer komutlarda olduğu gibi, ilk iki parametre matrisin satır ve sütun sayısı olacak.

CMatrix cm=CMatrix.getInstance().rand(100,1);

denildiğinde değerleri 0..1 arasında değişen random değerlerden meydana gelmiş 100 satır ve 1 sütünluk bir sinyal üretir. Burada kullanılan rand metodunun içinde düzgün dağılan random fonksiyonu (uniformly distributed random function) kullanılmıştır. Eğer random sayısının 0 ile 1 arasında değilde orta noktası 0 olup standart sapması unit (1) olan bir dağılım olmasını istiyorsanız randn metodunu kullanmanız gerekir. Kullanım deseni rand ile aynıdır. Normal dağılım fonksiyonu Şekil-1'de gösterilmiştir. Daha detaylı bilgi için http://www.statisticshowto.com/probability-and-statistics/normal-distributions/ bakılabilir.

Şekil-1 : Normal Dağılım Grafiği (Gaussian dağılımına da benzemektedir)


randn metodunu daha çok gerçek hayattakine benzer şekilde bir dağılım modellemesi yapmak istenildiğinde kullanılabilir. Mesela: 100 öğrenciden meydana gelen bir sınıfta Matematik dersinde öğrencilerin aldığı notların modellenmesi gibi. Bunun için bir örnek üzerinden gidelim. Örneğimizde iki adet CMatrix nesnesi yapmamız gerekiyor. Bunlardan birincisine cmUniform diğerine de cmNormal diyeceğiz. Her iki matrisin ürettiği değerleri plot edip görsel olarak aralarındaki farkları anlamaya çalışacağız.


        CMatrix cmUniform = CMatrix.getInstance()
                .rand(1000, 1)
                .plotFX("UnOrdered")
                .sort()
                .plotFX("Ordered in Ascending Order")
                .hist(100)
                ;

rand(1000,1) komutu 1000 x 1 olan bir sütün matrisi üretiyor ve plotFX ile ekrana çiziyor. (plotFX OCL'ye yeni eklendi bunun yerine plot da kullanılabilir, farkı FX uzantısı ile JavaFX kullanıldığını kullanıcıya belirtmek içindir, JavaFX normal swing'e göre daha kaliteli çizimler üretmektedir, bu yüzden OCL'nin gelecek versiyonlarında özelikle veri görselleştirme işlemlerinde swing'ten JavaFX geçiş yapılacaktır) Matrisin değerleri 0 ile 1 arasında uniformly distributed (düzgün dağılmış) seçiliyor. Bu işlemlerin sonucunda elde edilne ekran çıktısı Şekil-2 de gösterilmektedir.



Şekil-2 : rand ile üretilen orjinal sütun matrisinin plotFX çıktısı

                .sort()
                .plotFX("Ordered in Ascending Order")

komutları ise ilk önce matrisi artan sıralama ile sıralıyor daha sonra da sıralanmış matrisi plot ediyor. İlgili çıktı Şekil-3 de gösterilmiştir.



Şekil-3 : Yükselen (ascend) sıra ile sıralanmış (sort edilmiş) çıktısı

en son yazılan hist(100) komutu ise dağılımın  histogramını 100 bölgeye ayırarak gösteriyor. Çıktısı aşağıda.



Şekil-4: Düzgün dağılımlı (uniformly distributed) rand fonksiyonun çıktısının histogramı 


        CMatrix cmNormal = CMatrix.getInstance()
                .randn(1000, 1)
                .plotFX("UnOrdered")
                .sort()
                .plotFX("Ordered in Ascending Order")
                .hist(100)
                ;
randn ile normal dağılımlı matrisimizin çıktıları ise aşağıdaki Şekil 5-7 de gösterilmiştir.



Şekil-5: randn ile normal dağılım (dağılımın mean değerinin sıfırda olduğuna dikkat ediniz)



Şekil-6: Yukarıya doğru sıralanmış hali (dağılımın başı ile sonuna doğru bölgede doğrusal olmayan fonksiyon genelde en fazla değerlerin ortada kümelenmiş olduğuna kenarlarda ise nispeten daha az sayıda değer üretildiğine işaret etmektedir)



Şekil-7: Şekil-6'da anlatılanları tasdik eder nitelikte histogram grafiği.

Uygulama Yapalım

500 kişilik bir okuldaki öğrencilerin Sinyal ve Görüntü İşleme Uygulamaları dersinden aldıkları notları benzetim (simülasyon) yolu ile analiz edelim. Bunun için gerekli olan OCL komutlarını alt alta yazarak kodlayınız.

Bu sorunun cevabında izlediğiniz yöntemi veya kodları yorumlar kısmında tartışabilirsiniz.

youtube kanalımıza abone olmayı ve yorum yazmayı unutmayalım. Herkese iyi kodlamalar.

https://www.youtube.com/watch?v=XiL8RtApi78 





28 Mart 2018 Çarşamba

3 - Açık Cezeri Kütüphanesi (tek boyutlu sinyaller nasıl üretilir)

    Bu yazımızda Açık Cezeri Kütüphanesi (OCL) kullanılarak, tek boyutlu sinyallerin üretilmesi ve onlar üzerinde geçekleştirilen sinyal işleme uygulamalarından bahsedeceğiz. Eğer 1. ve 2. derslerimizde önerilenleri tamamıyla uygulamış iseniz bugünkü yazımızda kodlayacağımız komutlar sorunsuz bir şekilde çalışacaktır.

    OCL'de tek boyutlu bir sinyal (1 boyutlu dizi, one dimensional array) üretmenin birden fazla yolu bulunmaktadır. Geleneksel olarak, Java dilinde bir boyutlu dizi:

double[] dizi=new double[n];  n sıfırdan farklı tamsayı

şeklinde üretilir. Varsayılan olarak dizi değişkeninin tüm elemanlarına sıfır değeri atanmaktadır. Bir dizideki elemanları 0 değil de istediğimiz bir sayı ile mesela 1 ile doldurmak istersek döngü kullanmamız gerekir. n=100 olduğunu kabul edersek mesela:

for (int i=0;i<100;i++){
   dizi[i]=1;
}

Diğer taraftan Matlab ve Python gibi dillerde bir boyutlu dizi yapmak için

Matlab  ==>  dizi=ones(100,1);
Python  ==>  import numpy as np
                      dizi=np.ones(100)

dememiz kâfidir. Görüldüğü gibi dilin dahili yapısında vektörizasyon kabiliyeti bulunmaktadır ve bu yüzden kullanıcı for döngüleriyle uğraşmadan doğrudan problemin çözümü üzerine odaklanabilmektedir. Java 8, 9 ve 10 da yapılan bir dizi iyileştirmeler özellikle de stream apisi Java kod geliştiricilerine kod tasarrufu sağlayarak ekstra kolaylıklar sağlamaktadır. Ancak Matlab, R ve Python dilleri geliştirilme süreçlerinde vektörizasyon temelinde tasarlandıkları için Java'da söz konusu işlemleri yapabilmek adına üçüncü parti kütüphaneleri geliştirilmiştir. Bu bağlamda java tabanlı geliştirilen matrix kütüphanelerine örnek olarak JAMA, JBLAS, COMMONS MATH, COLT ve EJML gösterilebilir. Her birinin kendi ekseninde üstünlükleri zayıflıkları mevcut olmakla birlikte, kullanıcı ve geliştirici perspektifinden olaya bakacak olursak ilgili apileri öğrenmek ve uzmanlaşmanın maliyetinin yüksek olduğu görülecektir. OCL de aynen zikredilen kütüphaneler gibi Java dilinde geliştirilen alana has bir dil olarak yorumlanabilir ve önceki api ler gibi matris tabanlı işlemleri kolaylaştırmak adına geliştirilmiştir. OCL'de kullanılan metod isimleri genelde Matlab'de aşina olduğumuz isimlere benzetilmeye çalışmakla birlikte yüzde yüz aynı yapıda değildir. Örneğin 100 elemanlı ve değerleri bir olan bir diziyi OCL'de yapmanız için



main metodunun veya main metodundan çağrılan başka bir metodun içerisinde CMatrix sınıfından bir nesne yapmanız gerekmektedir. CMatrix sınıfının constructor metodları bilerek private tanımlanmıştır. Bunun sebebi olarak üretilecek nesne üzerinde daha fazla hakimiyet kurma isteği ve çeşitli güvenlik nedenleri sayılabilir. Yani daha açık söylemek gerekirse,

CMatrix cm=new CMatrix();

geleneksel nesne üretme tekniği çalışmamaktadır. Bunun yerine CMatrix sınıfında public static erişim belirleyicisi özelliğine sahip getInstance  (yani sınıfın bir örneğini ver veya yap) metodları overload edilmiştir. Yukarıdaki kod bloğunda görüldüğü gibi CMatrix sınıfının altı kırmızı ile çizilmiştir, bunun nedeni properties den add jar ile eklediğimiz OCL kütüphanelerini henüz import etmediğimizden kaynaklanmaktadır. Bunun için sol tarafta beliren sarı baloncuğa tıklayıp ilgili sınıfı (yani CMatrix) "add import cezeri.matrix.CMatrix" seçerek kodumuza dâhil ediyoruz.


CMatrix sınıfı fluent interface (akıcı arayüz) veya method chaining (metot zincirlenmesi) olarak ta bilinen bir tasarım kipi kullandığı için getInstance() metodundan sonra "." bırakıp ones metodunu çağırıyoruz. ones metodunun kullanımı Matlab'e benzemektedir. ones metodunun tek parametre versiyonunu kullandığınızda örneğin .ones(100) deseydik 100x100 2 boyutlu bir matris üretecek idi. Bunun yerine .ones(100,1) kullandık. Bu komut ile OCL'nin 100 satır ve bir sütun dan meydana gelen bir matris üretmesini istiyoruz. buna aynı zamanda column matrix yani sütun matrisi de denmektedir. Satır matrisi üretmek istiyorsak ".ones(1,100)" demeli idik. Ayrıca üretilen matrisin içeriğini output penceresinde görüntülemek için ".println()" komutunu çağırdık. Sonuç aşağıdaki gibi olacaktır.



Tüm elemanları "0" olan bir matris yapmak için de ".zeros" komutu kullanılır. Elemanlarının değeri sıfır olan matris üretmenin diğer bir yolu getInstance metodunu kullanmaktır. Bunun için

CMatrix cm=CMatrix.getInstance(100,1);  kullanılabilirdi.

SORU: 100 elemanlı, değerleri 3.14 yani PI sayısı olan bir sütun matrisini OCL'de gerçekleyiniz.

CEVAP:

CMatrix cm=CMatrix.getInstance(100,1,Math.PI);

veya

CMatrix cm=CMatrix.getInstance(100,1).addScalar(Math.PI);

veya

CMatrix cm=CMatrix.getInstance().zeros(100,1).addScalar(Math.PI);

veya

CMatrix cm=CMatrix.getInstance().ones(100,1).multiplyScalar(Math.PI);

aynı sonucu geri döndürecektir.

Yukarıdaki örnekte bir matrise herhangi bir sayıyı eklemek istersek "addScalar" komutunu, sayıyla çarpmak içinse "multiplyScalar" metodunu kullanabiliriz.

Bazen de dizinin elemanlarını bir seri gibi doldurmak isteyebiliriz. Mesela ardışık sayılardan meydana gelen bir sütun matrisi yapmak için

CMatrix cm=CMatrix.getInstance().vector(0,1,255);

yukarıdaki komut çalıştırıldığında 0,1,2,3...255 serisini bir sütun matrisi yani 256x1 olan matrise yazar. vector komutunun ilk parametresi başlangıç değerini, ortadaki parametre artım miktarı (incr) ve son parametre ise bitiş değerini simgeler. Dikkat edilmesi gereken önemli bir nokta, üretilen sütun matrisine başlangıç ve bitiş değerleri dâhil edilmektedir. vector komutunu daha çok artım miktarı belirgin olan problemlerde kullanıyoruz. Örneğin istersek 0 ile 255 arasında 0.001 artımla değeri yükselen bir seri de üretebilirdik bu durumda 255001 adet artan seri değerleri üretilirdi. Diğer taraftan, bazı problemlerde artım değerinden ziyade, matris boyutu önemli olabilir. Mesela, 0..255 arasına 999 adet sayıyı lineer (eşit arttırımlı) yerleştirmek istersek "linspace" komutunu kullanmamız gerekecektir.

CMatrix cm=CMatrix.getInstance().linspace(0, 255, 99);

yukarıdaki komutun sonuna println ekleyip ekrana bastığımızda toplamda 99 satırdan meydana gelen sütun matrisinin elemanlarının başlangıç değeri olarak 0'dan başladığını ancak bitiş değerini yazmadığını görürüz. Bunun nedeni son değer eklendiğinde satır sayısı 100 olacaktır. Ancak özellikle 99 satır olması gerektiğini söylediğimiz için son değer seriye eklenmez.

vector ve linspace komutları daha çok matematiksel fonskiyonların (polynomial and complex) yazılmasında y=f(x) benzetimi için x eksenini temsil etmede kullanılmaktadır.

SORU: 0..720 arasında sinüs değerini hesaplayan kodu OCL ile gerçekleyiniz.

CEVAP:

CMatrix cm=CMatrix.getInstance().vector(0, 1, 720).sin().plot();

yukarıdaki kod bloğu çalıştırıldığında aşağıdakine benzer bir grafik üretecektir.



Plot ekranı dikkatlice incelendiğinde bir şeylerin yanlış gittiği kolaylıkla anlaşılabilir çünkü sinüs fonksiyonu teorik olarak 0..360 arasında tam bir periyot yapması gerekirken şekilden de anlaşılacağı gibi çok yüksek frekansta değişim göstermektedir. Bunun nedeni, sin metodu varsayılan olarak (by default) radian türünde değerler alır. Bunun için sin metodundan önce toRadians() veya multiplyScalar(Math.PI/180) yazmamız gerekir. Doğru çalışan kod ve plot ekranı aşağıda gösterilmiştir.

CMatrix cm=CMatrix.getInstance().vector(0,1,720).toRadians().sin().plot();

veya

CMatrix cm=CMatrix.getInstance().vector(0,1,720).multiplyScalar(Math.PI/180).sin().plot();



Şimdilik tek boyutlu sinyallerle ilgili anlatacaklarımız bu kadar. Açık Cezeri Kütüphanesine katkıda bulunmak ve yazı dizilerini daha kaliteli yapmak için kanalımıza abone olmayı ve yorum yazmayı unutmayınız. Herkese iyi kodlamalar.

Bu dersin videosuna   https://www.youtube.com/watch?v=ebzcySaeGOI   linkinden ulaşabilirsiniz.


14 Mart 2018 Çarşamba

2 - Açık Cezeri Kütüphanesinin Kurulumu

OCL'yi bilgisayarınıza sorunsuz bir şekilde kurmak, çalıştırmak ve kullanabilmek için aşağıda listelenen yönergeleri başarılı bir şekilde uygulamanız gerekir.

1- Sisteminizde JDK yüklü değilse http://www.oracle.com/technetwork/java/javase/downloads/index.html adresinde Netbeans editörünün çalışabileceği ve işletim sisteminize uygun jdk'yı indirip kurmalısınız. Bu tarih itibariyle Netbeans IDE 8.2 sürümü jdk 8 ile uyumlu olduğu için JDK 8 i indirmeniz gerekmektedir. Netbeans'in sonraki versiyonları hangi jdk ya uyumlu ise oracle sitesinden uygun jdk'yi kurmanız gerekmektedir.

2-  Netbeans'in son sürümünü https://netbeans.org/downloads/ linkinden indirip kuruyorsunuz.

3- OCL'yi sadece https://github.com/hakmesyo/open-cezeri-library linkinden indirmenizi öneriyorum. Farklı kaynaklardaki sürümler çok eski sürüm olduklarından çeşitli sorunlarla karşılaşabilirsiniz. Github'dan OCL'yi iki farklı yöntem ile bilgisayarınıza indirebilirsiniz. Birincisi Yeşil renkli "Clone or download" yazan butonu tıkladığınızda açılır pencereden 



resimde görüldüğü gibi butona basarak linki kaydediyorsunuz. Daha sonra Netbeans editörünüzün menülerinden sırasıyla  Team menüsüne oradan git menüsüne oradan da clone seçeneğine tıklayarak "Clone Repository" penceresinin açılmasını sağlıyorsunuz. Burada Repository URL yazan yere github dan kopyaladığınız linki yapıştırıyorsunuz. Altta "Specify Destination Folder" yazan yerde hedef klasörünüz olan "C:\projects" yazarak "Next" sonra da "Finish" butonuna basıyorsunuz. Bu işlemlerden sonra OCL bilgisayarınıza indirilecektir.  






























OCL indirme işlemi bir müddet sürecektir. İşlem bittikten sonra aşağıdaki gibi bir pencere belirecektir. Bu kısımda da "Open Project" butonuna basarak projenin editöre yüklemesini sağlamalısınız.




Clone yöntemi ile OCL'yi indirmenizin avantajı OCL güncellendikten sonra tüm projeyi indirmeden sadece güncel dosyaları indirebilme şansınızdır. Bunun için yapmanız gerekenler OpenCezeriLibrary projesini sol taraftaki proje penceresinden mouse ile seçtikten sonra sırasıyla menüden Team --  Remote -- Pull deyip açılan pencereden de next ile ilerleyip sadece güncel dosyaları indirmek olacaktır. OCL çok sık güncellendiği içi arada bir OCL yi son sürümüne güncellemeniz yararlı olacaktır. İleride OCL Maven veya Gradle sistemine geçtiğinde güncelleştirme işlemi otomatik olarak yapılacaktır. Ancak şu an için bu kısımda anlatıldığı şekilde yapmanız gerekiyor. Veya alt kısımda anlatılan zip yöntemini kullanmalısınız.

  İkinci alternatif, clone yapmadan OCL yi zip olarak indirip 
kurmaktır. Bunun için github linkinden yeşil renkli "Clone or Download" butonuna tıkladığınızda açılan pencerede "Download ZIP" seçeneğine tıklayarak OCL'yi indirme işlemini başlatıyorsunuz. 




OCL'yi bilgisayarınıza indirdikten sonra değişik zip yazılımlarından biri ile (winrar, winzip, 7z gibi) açıyorsunuz. Açarken "extract to here" veya "buraya çıkart" ı seçmelisiniz çünkü içiçe iki tane aynı isimde "open-cezeri-libraray-master" klasörünüzün olmaması gerekiyor. Mümkünse kök dizinde projects isminde bir klasör yapıp ("c:\projects veya d:\projects") açtığınız zip klasörünü projects dizininin içine/altına taşıyorsunuz. 




4- Netbeans geliştirme editörünüzü açtıktan sonra menüden open project seçip "c:\projects\" in içindeki OCL'nin açılmasını sağlıyorsunuz.




5- OCL Netbeans'te açıldıktan sonra editörün sol tarafındaki pencereden OpenCezeriLibrary projesine mousun sağ tuşuyla tıklayıp açılan popup menüden "clean and build"  seçeneğine tıklayarak projenin derlenmesini ve yine "c:\projects" dizini altında "SharedLibrary" isimli bir dizinin yapılmasını sağlıyorsunuz. SharedLibrary dizini "OpenCezeriLibrary.jar" dosyasını ihtiva etmekle birlikte ayrıca lib klasörünün altında OCL'nin kullandığı diğer üçüncü parti jar kütüphanlerini de içermektedir. Yapacağınız projelerde OCL'yi kullanabilmek için söz konusu jar dosyalarının projenize dahil edilmeleri gerekmektedir.
























6- Netbeans IDE'sinin sol kısmındaki projeler bölümünde boş bir 
yere mousun sağ tuşu ile tıkladığınızda açılan popup menüden "new project" seçip yeni bir proje açınız.

7- Yapacağınız yeni projeye büyük harfle başlayacak şekilde arasında boşluk karakteri olmadan İngilizce karakterlerle bir proje ismi veriyorsunuz. Örnek "OgrenciKayitProgrami" gibi.

8- Yeni projenizi de mümkünse "c:\projects\" dizini altına açmakta fayda vardır.

9- Yeni projenizi yaptıktan sonra mouse ile üzerine gelip sağ tıkladığınızda açılan menüden   "Properties" kısmına oradan da "Libraries" bölümüne tıklıyorsunuz. Sağ taraftaki pencerede "Add JAR/Folder" yazan butona tıklayıp projects klasörü altındaki "SharedLibraries" dizini içerisinden öncelikle "OpenCezeriLibrary.jar" dosyasını seçiyorsunuz. Dosyayı seçtikten sonra  "Relative Path" radyo butonun aktif olduğundan emin olun. Daha sonra da tekrar add jar/folder butonuna basıp lib altındaki bütün jar ları ctrl+A ile seçip relative path radyo butonu aktif iken projenize dahil ediyorsunuz. Aslında bu jar'ların büyük çoğunluğunu belki de projenizde hiç kullanmayacaksınız. OCL'de uzmanlaştıkça projeniz için gerekli jar dosyalarını daha kolay filtreleyebileceksiniz. Şimdilik başlangıç aşamasında tüm jar'ları dahil etmenizin çok büyük bir sakıncası yok.








10- Dahil ettiğiniz jar'lardan bazıları JNI tabanlı geliştirildiği için (özellikle donanım bağlantılarında örneğin webcam, endüstriyel kamera, OpenCV ve Arduino bağlantısı gibi işlemlerde) çeşitli dll dosyalarına ihtiyaç duyulacaktır. Dilerseniz bu dll'leri registry'den ekleyebilir veya sistem path'ini tanımlayabilir ya da kolay olması açısından OpenCezeriLibrary klasörü altındaki tüm dll dosyalarını kopyalayıp kendi projenizin altına yapıştırabilirsiniz.




11-  OCL ile birlikte gelen resimleri kendi projenizde de kullanmak isterseniz OpenCezeriLibrary  klasörü altındaki "Images" dizinini de kopyalayıp kendi projenize yapıştırmalısınız.

Tüm maddeleri sırasıyla doğru bir şekilde uyguladıysanız artık OCL bazlı program geliştirebilirsiniz. Bir sonraki yazımızda küçük bir örnek ile OCL kullanım senaryosu anlatılacaktır.

İyi çalışmalar.




1 - Açık Cezeri Kütüphanesi çalışma mantığı nedir ne işe yarar ve kimler OCL'yi kullanmalıdır?

   Open Cezeri Library (OCL), Java programlama dili ile hazırlanmış, açık erişimli matris, veri görselleştirme, sinyal ve görüntü işleme, makine öğrenmesi ve derin öğrenme alt konularını ve modüllerini kapsayan başta öğrenciler, akademisyenler, bilim adamları ve araştırmacılar için geliştirilen bir yazılım kütüphanesidir. 

 Asıl ortaya çıkış hikayesi, El-Cezeri Sibernetik ve Robotik Laboratuvarında geliştirilen projelerde kullanılmak üzere ortak bir yazılım çatısı ve tekrar kullanılabilir (reusable) sınıf ve metodlar'dan meydana gelen alan spesifik dil (Domain Specific Language DSL) geliştirmek olarak özetlenebilir. OCL tasarım deseni olarak, FactoryMethod, Facade, Singleton, Observer, ve Fluent Interface veya method chain kalıplarını kullanmıştır. 

   Java programlama dilinde vektörizasyon işlemleri Matlab, R veya Python dillerine göre belirgin ölçüde zor ve zahmetlidir. Özellikle matris ve vektör tabanlı aritmetiğin yoğun olarak kullanıldığı makine öğrenmesi, sinyal ve görüntü işleme, bilgisayarlı görü uygulamaları ve grafiksel işlemlerde  Matlab, R, Python ve benzeri dillerde geliştirilen uygulamalarda matris ve vektörel işlemler harici for döngülerine ihtiyaç duyulmaksızın dilin kendi yorumlama özelliğini kullandığından daha az satırla çözülmeye çalışılır. Örnek vermek gerekirse, Matlab'de sin() fonksiyonu parametre olarak tek bir değişkeni aldığı gibi, tek boyutlu veya n boyutlu bir matrisi de alabilir mahiyettedir. Java'da Math sınıfında statik olarak tanımlı metodlar ise sadece tek bir değişken üzerinde işlem yapılacak şekilde tasarlanmıştır. Bir vektör (tek boyutlu dizi) veya bir matris (iki boyutlu dizi) üzerinde işlem yapabilmesi için sırasıyla tek seviyeli ve iç içe çalışan ikili for (nested for) döngüsü yapılarına ihtiyaç duyulur. Birçok işlemde tekrarlayan for döngüleri yazmak geliştirici açısından kodun denetiminin azalması, kod karmaşıklığına sebebiyet vermesi ve hatalı kodlama riskini netice vereceği için tasvib edilmez. OCL'yi geliştirirken aynen Matlab'da olduğu gibi n-boyutlu dizilerle çalışmaya imkan verebilecek bir framework geliştirmeye çalıştık. Şu an için OCL en fazla 2 boyutlu dizilerle çalışabilecek şekilde tasarlandı. Sadece bazı durumlar için örneğin renkli bir görüntünün piksel değerlerine ulaşmak istediğinizde 3 boyutlu dizi üretebilmektedir.  

   OCL'yi tasarlarken geliştiricinin sadece probleme odaklanmasını ve belirli bir mantıksal akış çerçevesinde kodlama sistematiğini bölmeden metodlar arasına nokta notasyonu ile sonuca ulaşması hedeflenmiştir. Bunun neticesinde geliştiricinin farklı sınıf veya metodları ayrı değişkenlere atamasına ve programın bütünlüğünü bozmasına gerek kalmamıştır. Bu tarz yaklaşımın (Fluent Interface veya Method Chaining) diğer bir avantajı da geliştiricinin noktayı bastıktan sonra açılan popup menüden işi ile ilgili anahtar kelimeleri (keywords) yazarak ilgili metoda hızlı ve etkin ulaşabilme şansıdır. Bunun için birbiri ile alakalı metodlar semantik olarak öbeklenmiştir. Mesela, görüntü işleme ile ilgili metodların tümü aynen Matlab'de olduğu gibi im ön eki ile başlarlar (imread, imhist, imshow gibi). 

   Aslında OCL'yi tasarlarken iki geliştirici kitleyi (Matlab ve JAVA yazılım geliştiricileri) göz önüne alarak aynı işlemi yapacak iki farklı isimde metod tanımlaması yazmayı uygun gördük. Örneğin OCL'yi kullanacak kişi Matlab platformundan geliyorsa aşina olduğu fonksiyon isimlerini aynen muhafaza etmekle beraber, JAVA geliştiricilerinin sıklıkla kullandığı fiil önekli metod isimlendirmeleri (imread'in java karşılığı readImage gibi) de kullanıldı. Bu bağlamda, geliştiricinin ismini unuttuğu bir metoda daha hızlı ve verimli bir şekilde konumlanmasının da önü açılmış oldu. Bu özelliklerin dışında OCL'de geliştirici isterse CMatrix nesnesinin herhangi bir state'ine yeni bir değişken tanımlaması yapmadan prev() ve next() komutları yardımıyla ulaşabilmektedir. Bu yaklaşım program akışını sekteye uğratmadan geliştiricinin kullanımına açılmıştır. Kullanıcı isterse performans ve hızdan kazanmak için söz konusu özelliği kapatabilir.

   Çeşitli kullanım senaryoları ve belirli problemlerin OCL temelli çözümü ile ilgili yazı dizilerimiz devam edecektir. OCL'nin gelişmesi adına sizden gelecek geri bildirimler son derece önemlidir. Geri bildirimlerinizi, blogun alt kısmındaki yorum kısmına veya e-mail adresime gönderebilirsiniz. Blog sitemize ve youtube kanalımıza abone olmayın unutmayın. 

İyi çalışmalar.