Previous
Next

Design Patterns - Tasarım Desenleri

by Cem Kefeli 26. Eylül 2017 00:43

Aslında;

Ben şu işi böyle yapıyorum. Bu şekilde çözüm buldum, çok da kullanışlı, işleri çok da kolaylaştırıyor. Sen de kullan diye de standard bir diagram haline getirdim. Al işte bu da o diagram!"

demektir 'Design Pattern' ya da Türkçe olarak 'Tasarım Deseni'. Bu kadar da basittir felsefe olarak...

Design Patters - Tasarım DesenleriBirilerine bir yön vermeyi, sık yaşanan sorunları ortak kalıplarda en ideal yöntem ile çözmeyi amaçlar. Çözmekten de ileri gider ve herkesin bir çırpıda anlayabileceği, ulaşabileceği ve uygulayabileceği sadelikte ve standart söylemle dile getirir söylemek istediklerini. 'Best Practice' ortaya koyar bir başka söylemle. Peki en iyi olduğunu kim nasıl tescil eder bu yöntemin? Aslında hiç kimse. Zamana ve tercihe bağlı bir algı bu. Kabul gören tasarım zamanla yayılır ve doğal yollardan tescil edilmiş olur. Yani konu bir probleme getirilen en iyi çözüm iddiasını taşımak değildir aslında.

Yazılım diline özgü de değildir. Bir tasarım deseni farklı farklı yazılım dilleri kullanılarak uygulanabilir. Desen, yazılımın nasıl olması gerektiğini ortaya koyar ve resmi çizdikten sonra kenara çekilir, gerisini geliştiriciye bırakır. Geliştiriciye de kolaylıklar sağlar. Neyi nasıl yapması gerektiğini daha önce aşina olduğu tasarım desenleri yardımıyla kolayca belirleyebilir. Ya da kendisine ait olmayan bir kodu okurken tasarım deseni sayesinde kaynak koda kolayca adapte olabilir. Kendisine ait olmayan bir kaynak kod üzerinde geliştirmeye başladığında tekrara düşmeden, yapıyı bozmadan yazılım geliştirebilir.

Peki neden ihtiyaç var desenlere? Bu soruyu sormadan önce belki de bir yazılımın ne kadar kaliteli ve güncele uygun olduğunun nasıl anlaşılabileceğini düşünmek gerekir. Anlayabilmek için genişletilmiş hali yedi adet ama temelde dört adet başlık vardır vardır litaratürde bahsedilen ve incelenmesi gereken;

  • Rigidity: Bir yazılıma yeni bir özellik eklenmesi, gelen yeni bir iş isteğinin karşılanması için yazılımın birçok yerinin değiştirilmesi gerekiyorsa ve bu değişiklikler de çok köklü yerlere dokunuyorsa 'değişmezlik' kavramı için sıkıntı var demektir. Normal şartlarda yalnızca yeni özellikle ilgili yerlere dokunmak yeterli iken bir de bu yeni özellik haricinde birçok farklı noktaya dokunmak gerekiyorsa yazılım artık ağır yavaş ölüyor demektir.
  • Fragility: Üzerinde geliştirme yapılmak istenen yazılım değişiklik isteklerine çok karmaşık cevap veriyorsa örneğin asıl iş ile mantıksal bağı olmayan birçok yeri etkiliyorsa ve bu etkiler yıkıcı olabilecek türden ise yazılım için ciddi anlamda kırılganlık var demektir.
  • Immobility: Günümzde artık birçok yazılım, genel amaçlar için yazılmış kütüphaneleri kullanarak iş görebiliyor. Yani her kütüphane kendi işinde özelleşmiş özellikleri barındırıyor ve yazılımlar ise bu kütüphanelerin yalnızca birer müşterisi olarak konumlanıyor. Eğer yazılım bu mantığa uygun bir şekilde geliştirilmemişse yani bir değişiklik modüler bir şekilde yapılamıyorsa ve birden çok yerde aynı kodlamanın uygulanmasını mecbur kılıyorsa o yazılım için taşınabilirlik anlamında sıkıntılar var demektir.
  • Viscocity: Bir yazılım üzerinde değişiklik yapılması düşünüldüğünde olması gerekeni yapmak yani design temelli çalışmak taba tabirle uyduruk yöntemle çalışmaktan daha zor ise o zaman yazılım artık güncel şartlara da ayak uyduramıyor demektir. Bu konu temelde yazılım ve çevre birim olmak üzere iki alt konu olarak inceleniyor litaratürde. Hani derler ya "Bu konu üzerime yapıştı kaldı. Kurtulamıyorum!" diye. Burada da durum aynıdır. Belki yazılımın artık günceli reddetmesi, ayak uyduramaması nedeniyle üzerinize yapışıp kalmıştır, belki de artık yazılımın yaşadığı ortam günceli takip edemiyordur, derleme zamanı çok uzamıştır bu nedenle üzerinize yapışıp kalmıştır. Fazlası...

Bit temelli (bitwise) operatörler ile mantıksal operatörler arasındaki fark

by Cem Kefeli 6. Temmuz 2017 23:24

Sadece tek bir karakterin yazılımınızın performansını ve gidişatını nasıl kolayca değişitirebileceğini görmek istiyorsanız yazının devamını okumanızı öneririm.

İlk önce bit temelli (bitwise) 've' (&) işaretinden bahsetmek istiyorum. Bit temelli işlemler, meşhur 'Olmak ya da olmamak, işte bütüm mesele bu!' sözüne uygunand (&) ve or (|) operatörleri için değer/sonuç tablosu bir şekilde var olan (1) ya da olmayan (0) değerlerin birbiri ile münasebeti ile ilgileniyor. 'veya' (|) operatörünü bir matematiksel işaret olarak ele alacak olursak toplama işlemine denk tutabiliriz. Eğer 'veya' işlemine girecek değerlerden herhangi birisi anlamlıysa yani '1' ise sonuç da anlamlı (true) olacaktır. Yapılan işlem içerisinde yalnızca tek bir 1'in olması sonucun '1' olması için yeterlidir. 've' (&) operatörünü bir matematiksel işaret olarak ele alacak olursak da çarpma işlemine denk tutabiliriz. Eğer 've' işlemine girecek değerlerden herhangi birisi anlamsızsa yani '0' ise sonuç da anlamsız (false) olacaktır. Yani yapılan işlem içerisinde yalnızca tek bir '0'ın olması sonucun '0' olması için yeterlidir. Bu basit bit temelli işler için bir değer/sonuç tablosu oluşturmak gerekirse sağdaki tablo karşımıza çıkar.

Bu ön bilgilerden sonra şimdi artık yazının ana konusuna gelecek olursak asıl önemli noktalardan birisi de mantıksal işlemler için 've' ve 'veya' operatörlerinin nasıl yorumlanacağıdır. Öncelikle şunu belirtmek gerekir ki eğer bit temelli işlem yapacak olursanız sonuç da yine bit temelli olacaktır. Çalışma anında bit temelli işlemlerde yorum gücü katma değeri yoktur. Sırası ile istenilen hesaplamadaki bit temelli işlemler yapılır, nihayetinde de yine bit temelli bir sonuç elde edilir. Mantıksal işlemlerde ise uygulama çalışma anında yine bit değerler üzerinden bir işlem yapılmaktadır ama bu sefer bir yorumlama katma değeri de söz konusudur. Biraz açacak olursak örneğin bir 'if' koşulu içerisinde yer alan aşağıdaki ifadeyi inceleyelim; Fazlası...

ESP8266 wifi modül kullanımı

by Cem Kefeli 29. Aralık 2016 15:11

Son günlerde ağırlıklı olarak arduino platformunda IoT temelli geliştirmeler yapmaya çalışıyorum. Tasarlamaya çalıştığım yapı genel olarak düşük güç ile çalışan sıcaklık, nem ve ışıklılık seviyesi gibi bilgileri wi-fi üzerinden bir merkezi birime ileten mobil bir birim. Bu mobil birimi denetleyen ve yöneten merkezi bir istasyon ve bu merkezi istasyonun konuştuğu bir WEB servis. Merkezi istasyonu RaspberryPI platformu üzerine kurdum. Çünkü burada java ile daha esnek ve arduino platformuna göre daha gelişkin yapılar adapte ediyorum. Zaten merkezi bir birim olduğu için de güç beslemesi kablo ile olacak ve düşük güç tüketimi ihtiyacı bulunmuyor. WEB servis ise java ile geliştirilmiş genel olarak merkezi istasyonun iletişim halinde olduğu, merkezi istasyon verilerinin MySQL veritabanına bu WEB servisler yardımıyla işlendiği, kullanıcı ayarlarının tutulduğu bir arayüz işlevini görmekte. Son olarak ise tüm bu sistemin kullanıcı yönetiminin sağlandığı bir android yazılımı. Bu bahsetmiş olduğum yapı şuan kullanılabilir durumda ve bu yapı yardımıyla kendi evimdeki kombi cihazını ev sıcaklığına göre (Günlük program, haftalık program, anlık sıcaklık kontrolü...) kontrol edebiliyorum. Ev sıcaklığının istediğim sıcaklıkta sabit kalmasını sağlayabiliyorum ve istediğim sıcaklığa geldiğinde kombimin gereksiz yakıt tüketmesini engelleyebiliyorum. Günlük ve haftalık programlar sayesinde evde ESP8266 12Eolmadığım zamanlar otomatik olarak ev sıcaklığım 19-20 derecelere iniyor, evde olduğum zamanlarda ise 22-23 derecelere çıkıyor. Bu kararları android yazılımı ile belirtilen değerlere uygun olarak merkezi birim veriyor ve uyguluyor.

Bu yazıda ise asıl odaklanmak istediğim konu Espressif'in üretmiş olduğu ESP8266 wi-fi modülü. Bu modül piyasada özellikle maliyetinin çok az olması ve projelere kolay implemente edilebiliyor olması ile ünlü. Benim için de seçim nedeni bu oldu açıkçası. Oldukça fazla zigbee, z-wave ve wi-fi modülü inceledim. Fakat birçoğunun maliyeti oldukça yüksekti, bir kısmı ise kolay temin edilebilir değildi. ESP8266 ise piyasada 20 TL etrafında değişen fiyatlara bulunabilir bir modül. İlk olarak ESP8266-01 ile başladım test çalışmalarıma fakat bir süre sonra gördüm ki bu donanım 3.3 v ile beslenmesine rağmen gerilim dalgalanmalarına aşırı duyarlı ve tabiki zamanında üretilen ilk versiyon olmasının vermiş olduğu bazı bug'ları var. Çoğu zaman firmware güncellemesi yapmak gerekiyor ve stabil bir şekilde çalışmıyor yük altında. ESP8266-01 deneyimim sonrası ESP8266-12'ye yöneldim. Bu platform ile daha önce karşılaştığım birçok stabil olmayan durumun hiçbirisi ile karşılaşmadım. Sonuç olarak da yapmaya çalıştığım nihayi üründe bu modülü kullanmaya karar verdim.Fazlası...

Yaz saati uygulaması ve tzupdater ile java güncellemesi yapılması

by Cem Kefeli 10. Ekim 2016 22:09

Yaz saati uygulaması Türkiye'de 1972 yılından 2016 yılına kadar doğrudan enerji tasarrufu amaçlı olarak gün ışığından daha fazla faydalanabilmek amacıyla uygulanmıştır. Bu uygulama ile birlikte ilkbahar aylarının başlangıcında saatler bir saat ileri alınır ve Türkiye saati UTC+3 olur. Sonbahar aylarının sonuna doğru ise saatler bir saat geri alınarak ülke zaman dilimi UTC+2'ye geri döner ve yaz saati uygulaması ise son bulmuş olur. Yani aslında Türkiye'nin gerçek zaman dilimi UTC+2 olarak belirlenmiştir. UTC+3 ise yaz saati uygulaması için geçici bir süreliğine geçilen bir zaman dilimidir.

2016 ekim ayı itibari ile ise Bakanlar Kurulu'nun 2013'de almış olduğu ama 2016'ya kadar uygulanmayan karar (Resmi gazete 2016/9154) doğrultusunda saatlerin geri alınması uygulamasına son verilmiştir. Yani artık tüm yıl boyunca yaz saati uygulanmasının kullanılması ya da kış saati uygulamasının ülke genelinde son bulması kararlaştırılmıştır.

Özellikle bankacılık ve iletişim sektörü için bu durumdan nasıl etkilenileceği, olumsuz etkilerinin neler olacağının tartışıldığı bir ortamda bilişim sistemleri de kendisini yeni karara adapte etmeye çalışıyor. Binlerce ve hatta çok büyük olasılıkla on binlerce sistem bu karar için elden geçiriliyor... İşletim sistemlerine yamalar yükleniyor, veritabanlarına yamalar yükleniyor, vb... Bu bağlamda kurumsal birçok yazılımın vazgeçilmezi olan Java için de yeni koşullara ayak uydurabilmenin bazı şartları bulunuyor.

iana.org üzerinden indirebileceğiniz bir time zone (tz) güncellemesi ile Java kurulumunuzu Türkiye için yeni time zone'a uygun hale getirebilirsiniz. Aşağıda yüklemenin nasıl yapılacağını göstermeye çalışacağım fakat bununla birlikte bu güncellemenin etkilerinin de neler olacağını görebilmek, analiz edebilmek için birkaç satırdan oluşan bir test kodu yazdım ve yaşadıklarımı aşağıdaki gibi aktarmaya çalışıyorum;

Java test kodumuz aşağıdaki gibi;

Time Zone test uygulaması  |  Gizle  |  Göster
package datetimeapp;

import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.util.Date;

/**
 *
 * @author cem.kefeli
 */
public class DatetimeApp {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyy HH:mm:ss.SSS");
        
        ZonedDateTime zonedDateTime_Local = ZonedDateTime.now();
        Date dateTime_ZonedLocal = Date.from(zonedDateTime_Local.toInstant());        
        System.out.println("dateTime_ZonedLocal: "+simpleDateFormat.format(dateTime_ZonedLocal));
        
        ZoneId zoneId_Turkey = ZoneId.of("Europe/Istanbul"); // Europe/Istanbul +02:00/+03:00
        ZonedDateTime zonedDateTime_Turkey = ZonedDateTime.of(LocalDateTime.now(), zoneId_Turkey);
        Date dateTime_ZonedTurkey = Date.from(zonedDateTime_Turkey.toInstant());        
        System.out.println("dateTime_ZonedTurkey: "+simpleDateFormat.format(dateTime_ZonedTurkey));
        
        ZoneId zoneId_Any = ZoneId.of("Asia/Baku"); // Asia/Baku +04:00
        ZonedDateTime zonedDateTime_Any = ZonedDateTime.of(LocalDateTime.now(), zoneId_Any);
        Date dateTime_ZonedAny = Date.from(zonedDateTime_Any.toInstant());        
        System.out.println("dateTime_ZonedAny: "+simpleDateFormat.format(dateTime_ZonedAny));
    }
}

Eğer bu kodu derleyerek çalıştıracak olursanız aşağıdaki gibi bir çıktı ile karşılaşıyor olacaksınız. Şu anda yaz saati modunda ve UTC+3 zaman diliminde olduğumuz için Bakü yerel zaman dilimi ile aramızdaki zaman farkı bir saat olarak görülecektir. Sistem zamanı ve java zamanı ise aynı görülüyor.Fazlası...

Hakkımda...

Cem KEFELİ

Electronics and
Telecommunication Eng.
devamı...


Son yapılan yorumlar...

Comment RSS

Yasal bir uyarı...

Disclaimer"Bu web sitesinde görmüş olduğunuz bilgilerin, dokümanların ve diğer materyallerin kullanılmasından doğabilecek hiç bir sorumluluktan site sahibi sorumlu tutulamaz. Web sitesi içerisinde yer alan yazılar, yorumlar, resimler ve diğer tüm içerikler yalnızca sahibinin görüşünü yansıtmakta olup içeriğin sahibi kişilerin çalıştığı kurumları bağlayıcı hiç bir nitelik taşımamaktadır. Yapılan tüm alıntılar mutlaka kaynak gösterilerek verilmeye çalışılmaktadır. Web sitesi içerisinde bulunan ilgili materyaller, ilgili yasal kurumlar tarafından uygun görülmemesi durumda kaldırılacaktır."
General