Mock Kavramı ve GoogleMock (gMock) Nedir/Nasıl Kullanılır?

Birim (Unit) testleri yazarken sadece kendi içerisinde statik olarak uygulanan algoritmalarla çalışmayız, hatta çoğu zaman bu şekilde çalışmayız. Onun yerine diğer objelerle sürekli etkileşimde olan, gerçek zamanlı (real time) olarak işlemler gerçekleştiren şekilde tasarımlar yaparız. Benzer sistem tasarımlarının testlerini yazarken de her zaman gerçek objeler üzerinde çalışamayız. İşte tam olarak burada karşımıza kurtarıcı niteliğinde bir kavram çıkıyor, Mocking.

Mock kavramı anlamı itibarı ile taklit objeler oluşturmamıza izin vermektedir. Gerçek zamanlı testlerde karşılaşacağımız objelerin taklit edilen hallerini oluşturarak testimize dahil etmemize yarar. Bu yazıda üzerinde işlem gerçekleştireceğimiz Mock framework‘ü ise GoogleMock (gMock) olacak. Yazı içerisindeki anlatımların bir çoğunu YouTube kanalımda anlattığım GoogleTest video serisi içerisinden de ulaşabilirsiniz (Henüz yayınlanmadı).

Mock objeleri ile diğer diller üzerinde çalışırken sizin için işin bir kısmını otomatikleştiren araçlar olduğunu görebilirsiniz. GoogleMock (gMock) da C++ dili özelinde bu işi yapan bir araç olarak Google tarafından tasarlanmıştır. Kullanılacak olan komponentin arayüz üzerindeki davranışlarını tespit etmek için kullanılırlar.


GoogleMock Nasıl Kullanılır?

Bu konudaki en özenle hazırlanmış ve detaylı kaynak olarak Google‘ın kendi dokümantasyonunu örnek verebiliriz. İlgili linklere “Kaynaklar” kısmında ulaşabilirsiniz.

Bir örnek üzerinden anlatmaya çalışacağım ancak öncesinde bilmemiz gerekenlerden kısaca bahsetmek istiyorum. Mock nesneleri içerisinde MOCK_METHOD fonksiyonu ile tanımlamalar yapacağız. Fonksiyonun aldığı parametreler:

  • MOCK_METHOD(void, FonksiyonAdi_1, (), (override));
  • MOCK_METHOD(void, FonksiyonAdi_2, (int parameter_1, int param_2), (override));
  • MOCK_METHOD(int, FonksiyonAdi_3, (), (const, override));

Böyle bir yazımda şunu ifade etmektedir; ilk parametre sizin taklit objeniz üzerinde test etmek için oluşturduğunuz fonksiyonunuzun geri dönüt tipi, ikinci parametre fonksiyon adınız, 3. parametre eğer fonksiyonumuz içerisine bir parametre gönderiyorsak o parametrelerin verilmesi gerekiyor, eğer girilmiyor ise boş gönderilebilir. 4. parametrede ise fonksiyonunuz sabit metot ile kullanılıyorsa belirtilmesi gerekir. Eski versiyon kullanımlarda MOCK_METHOD yerine tercih edilen bir diğer kullanım daha vardır:

  • MOCK_METHOD0(FonksiyonAdi_1)
  • MOCK_METHOD1(FonksiyonAdi_2, void(int parameter_1)) // sadece bir parametre aldığı zaman kullanılır
  • MOCK_METHOD2(FonksiyonAdi_2, void(int parameter_1, int parameter_2)) // sadece iki parametre aldığı zaman kullanılır
  • MOCK_CONST_METHOD1(FonksiyonAdi_2, void(int parameter_1)) // const metodu içerdiği zaman kullanılır

5 parametre alan bir fonksiyon için MOCK_METHOD5 makrosu kullanılmalıydı yani kaç parametre varsa sondaki sayı onunla değişmeliydi ancak eğer 10+ parametre alan bir fonksiyonumuz varsa yalnızca MOCK_METHOD10 makrosu kullanılırdı. Yazının ilerleyen bölümlerinde yeni makroyu kullanacağım.

Mock kullanımı esnasında karşımıza ON_CALL ve EXPECT_CALL makroları çıkıyor. ON_CALL makrosu bir testin kaç kez yapıldığı sizin için önemli değilse kullanabileceğiniz bir makro ancak prototip ve kullanım itibari ile EXPECT_CALL ile aynı yapıya sahiptir, EXCEPT_CALL’dan farklı olarak sadece With() ve WillByDefault() fonksiyonları ile birlikte kullanılabilir.

EXPECT_CALL tanımlaması kullanacağımız mock testlerinin vazgeçilmezidir. Ve:

  • With(multi-argument-matchers)
  • Times(cardinality)
  • InSequence(sequences)
  • After(expectations)
  • WillOnce(action)
  • WillRepeatedly(action)
  • RetiresOnSaturation();

fonksiyonları ile birlikte kullanılır. Tanımlamasını yaptığımız fonksiyon çağırıldığında nasıl tepki vereceğini belirtmemizi ister. Yani aşağıdaki gibi bir kullanım yaptığımız zaman;

EXPECT_CALL(obje_adi, getValueFromObject())
    .Times(10)
    .WillOnce(Return(130))
    .WillOnce(Return(140))
    .WillOnce(Return(150))
    .WillRepeatedly(Return(200));

getValueFromObject() fonksyionunu 10 kez çağıracak, ilk çağırmada 130, ikincisinde 130, üçüncüsünde 150 ve sonrasında her seferinde 200 değerini döndürmesini bekliyoruz. Ana hatları ile kullanılacak olan fonksiyonların ne yaptığına bakacak olursak;

  • With(): içerisine girilecek parametre fonksiyonu da yapılacak işleme dahil eder
  • Times(): çalışması beklenen fonksiyonun kaç kez çalıştırılacağını belirtir
  • InSequence(): belirtilen çağrıların istediğiniz sıraya göre yapılmasını istiyorsanız bir sekans oluşturup ardından fonksiyon içerisinde belirtmeniz gerekmektedir
  • After(): çalışma sonrasında beklenen çıktı için kullanılır
  • WillOnce(): 1 kez çalışması sonucunda ortaya çıkacak çıktıyı belirtir
  • WillRepeatedly(): sürekli çalışması sonucunda ortaya çıkacak çıktıyı belirtir
  • RetiresOnSaturation(): istenilen çıktı oluşmadı ancak fonksiyon çalışabileceği en maksimum noktaya kadar çalıştıysa – saturasyon noktası – fonksiyonu sonlandırır

Burada yazılanlar GoogleMock sisteminin ana yapısını oluştursa da bir miktar havada kaldığının farkındayım. Onun için bu özelliklerin birkaç tanesini bir örnek üzerinde kullanarak daha rahat anlamanızı sağlamaya çalışacağım.

Örnek üzerinde GoogleMock

Aşağıda yer alan örnekte basit bir UserInterface sınıfı oluşturarak onun üzerindeki get/set fonksiyonlarını test edecek bir taklit sınıfı oluşturduk. Bu sayede bir arayüze ihtiyac duymadan otomatik olarak testlerimizi gerçekleştirmiş olduk.

Kodlara bakacak olursak ilk olarak test edilmesini istediğimiz sınıfımızı oluşturduk, daha sonra da bu sınıftan türemiş bir mock sınıfı oluşturduk. Ardından get/set fonksiyonlarımızın nasıl çalıştığını görmek için bir DataReminder sınıfı oluşturduk ve bunlara bağlı testlerimizi yazmaya başladık.

EXPECT_CALL içerisinde çağırdığımız fonksiyonlarımız sayesinde DataReminder içerisinde tutulmasını beklediğimiz veriyi oluşturmuş olduk. Son olarak da kontrollerimizi yaparak testin başarıyla tamamlandığını görmüş olduk.

Kaynaklar

https://github.com/google/googletest/blob/master/googlemock/docs/for_dummies.md

https://github.com/google/googletest/blob/master/googlemock/docs/cook_book.md

http://donsoft.io/gmock-presentation

Richard Wells – Test-Driven Development in C++/ https://www.linkedin.com/learning/test-driven-development-in-c-plus-plus/add-items-add-item-prices-and-calculate-the-current-total

Kapak Görseli: C++ Unit Testing: Google Test and Google Mock / Udemy – https://www.udemy.com/course/cplusplus-unit-testing-google-test-and-google-mock/

Yazılımda test de neymiş?

Yazılımda test kavramı sadece kelimelerle aşina olduğum bir durumdu ancak daha öncesinde hiç üzerine araştırma yapmamış, hiç bir yerde kullanma ihtiyacı hissetmemiştim – ne salakmışım. Bir sistemi kafanda kurguluyorsun, kağıt üzerinde adım adım her şey çalıştırıyorsun, oturup kodunu yazıyorsun ama sonra canlıya çıkınca bir bakıyorsun patır patır dökülüyor.

Bunun hepimizin öncesinde karşılaştığı bir problem olduğunu düşünüyorum. Kimse yoktur ki “Benim yazdığım kod tek seferde babalar gibi çalışır, kafamda oluşturduğum yapı Nikola Tesla’nın yansılarında oluşturduğu gibi kusursuz çalışır halde olur” diyebilsin. İşte bu problemleri, kodu yazdıktan sonra debug etme süresini, oluşabilecek ekstra senaryoları ve projenin ilerleyen süreçlerinde yapılacak ekleme çıkartmaların yazdığınız koda etkisini görebilmek için test yazmak çok büyük önem arz ediyor. Hele bir de gömülü sistemler gibi yazdığınız kodun çıktılarını görsel olarak alamayabileceğiniz bir alanda çalışıyorsanız bu debug süreci zaten alıyor başını gidiyor.

Yazılım testini gömülü sistemlerde nasıl kullanabiliriz sorusuna cevap aramaya başladığım dönemde bir yazılımın geliştirme süreçleri üzerine de bilgiler edindim. Çünkü normal bir yazılımı test etmek için sadece test methodları yeterli olabilirdi, ancak burada bahsettiğimiz konuda işin içerisine dahil olan bambaşka bir şey daha var: Donanım. Gömülü yazılımlar donanım üzerine koşan yazılımlardır, yani yazdığın sistemin fonksiyonel tarafını soyutlayabilirsiniz, bunun testlerini yapabilirsiniz ancak işin içerisine donanım üzerindeki fonksiyonlar da girince biraz tuhaflaşıyor gibi geliyor insana. Ancak bu konu üzerine de çalışmalar yapılmış tabii ki, bkz: Mock, Stubs, Fakes. James W. Grenning’in “Test Driven Development for Embedded C (Pragmatic Programmers)” kitabını okumanızı şiddetle öneriyorum. Zaten benim de bu işin ucundan tutmama vesile olan kitaptır kendisi. Bu öneri için Burak Kirazlı‘ya teşekkür ederim.

Yaklaşık 3-4 yıldır C dili ile projeler geliştirmeye çalışıyorum. 3 ay kadar denilebilecek bir sürede test yazılımları üzerine çalışmaya başladım ve daha önceden oluşturmuş olduğum basit algoritmaları ve bazı veri yapıları kütüphanelerimi testlerini yazarak yeniden oluşturmaya başladım. Bu süreçte o kullandığım kütüphanelerde yaptığım hataları, eksikleri görme fırsatım oldu. Bana kazandırdığı bakış açısı sayesinde olayı çoklu bir şekilde bakabilmeyi öğrendim diyebilirim. Yavaş yavaş da donanım üzerinde çalışan kısımların testleri nasıl yapılır onlar üzerine kafa yormaya başlıyorum. Ve bu öğrenme sürecimin sonunda ortaya çıkan çıktıları YouTube üzerinde Google Test özelinde anlatmaya çalışıyorum. Bahsettiğim konuların şu an için Unit Test – Birim Testi kapsamında olduğunu da belirtmek istiyorum. Umarım ilerleyen dönemlerde diğer test kavramlarına (Integration Test, System Test, Performance Test vb.) değinme fırsatı bulabilirim.

Bu kavramlarla tanıştığım sırada Nordic Semiconductor firmasının “Senior Software Test Engineer” ilanını görüp “Olmaz ya, yine de şans bu” diyerek başvurumu tamamladım ve bir hafta sonrasında Test Takım Lideri ile 1 saat süren bir görüntülü görüşme yaptık ve sonucunda bir test ödevi verdiler. İşte bu ödevi yapabilme dürtüsüyle giriştiğim araştırmalar sonucunda yaptığım bir şeylerin yanlış olduğunu, bu tekniğin çok daha sistematik bir kod yazmak, dokümantasyon oluşturmak için faydalı olduğunun farkına vardım. Beni bu deneyime iten tecrübe bu buldu, eğer sizi bir şekilde bu yazımla daha geniş bir bakış açısına tetikleyebildiysem ne mutlu bana. Tabii deneyimleyip yararlı veya yararsız olduğuna karar verecek olan yine sizsiniz.

2020 sen nasıl başladın?

Çok uzun zamandır bloguma ne kişisel ne de uğraştığım şeylerle ilgili içerik girmiyordum. Ancak artık bloguma biraz daha önem verip içerikler oluşturmaya karar verdim. Yeni içerikler için de başlangıç olarak hepimizin muzdarip olduğu konuyu kendi özelimde ele almak istedim.

2020 hepimiz için ‘mutluluk’ getirecek bir sene olarak başlamış gibi görünüyordu ama çok geçmeden foyası ortaya çıktı. Depremler, savaşlar, salgın hastalıklar derken herkes için hayat farklı bir hal almaya başladı. Bunun sosyolojik ve ekonomik etkileri içinde bulunduğumuz virüs salgınından kurtulduktan sonra hızlı bir şekilde ortaya çıkacaktır. Sosyologlar konu üzerine onlarca tez yazacaklardır, sosyal medya ekonomistleri ise kimsenin ciddiye alıp dinlemeyeceği yüzlerce methiyeler düzeceklerdir – millet haksız da sayılmaz bu dinlememe konusunda.

Ben geçtiğimiz sene Haziran ayında mezun olduktan sonra Eskişehir’de bir yazılım şirketinde Gömülü Yazılım Mühendisi olarak işe başlamıştım. Ancak bu süreçte başvurusu devam eden de bir TÜBİTAK projemiz vardı, 1512 kapsamında bir girişimcilik programına başvurmuştuk. Aradan geçen birkaç ay içerisinde çalıştığım yerdeki işleri toparlamaya başlamıştık ve TÜBİTAK’a yaptığımız sunumdan da güzel dersler çıkartarak geri döndük. Onaylanması halinde 1 Şubat 2020’de başlayacak 200.000 TL’lik bir destek verilmiş olacaktı. Şimdi düşünüyorum da eğer onaylansaydı ve biz bir yola girdikten sonra böyle bir salgın olayı sebebiyle karantinaya girseydik acaba nasıl bir çıkış yolu arıyor olurduk? İlk defa tecrübe edeceğiniz bir işe atılıyorsunuz – bir şirket yönetiminden bahsediyorum – ve daha ilk ayınızda, belki henüz destek paraları bile yatmamışken karantinaya çekilip evden çalışmaya devam ediyorsunuz. Oldukça didaktik bir durum olabilirdi belki.

Aylar içerisinde artık çalıştığım yerdeki işimden zevk almadığımı fark ettim. Bazıları diyebilir ki “Yeni mezun adamsın, ne zevkinden bahsediyorsun, kazandığın tecrübeye bak sen.” (ki böyle diyen çok adamla karşılaştım) Ama işler bazen o şekilde yürümüyor. Kendime hiçbir şey katamadığım bir ortamda daha fazla kalmak istemedim ve 2020 Şubat ayı başında işimden ayrılarak Eskişehir’deki evimi kapattım. Henüz bir iş bulmadan ayrılmam belki çok doğru değildi ancak ayrılmaya karar verdikten sonraki süreçte hem çalışıp hem de iş aramanın etik olmayacağını düşündüm ve aynı zamanda iş arama esnasında şirkete olan katkımın da düşeceğine emindim ve o yüzden karşı tarafı da mağdur etmemek adına ayrıldım.

Tabii evdeki hesabın çarşıya pek uyduğu söylenemez. Şirketlerle görüşmelerimi yaptım, haber bekleme durumuna geçtim ancak 1 aydır neredeyse hepsi ya uzaktan çalışıyor ya da ücretsiz izindeler. Bu yüzden bu süreçte nasıl geri dönüşler gerçekleşir emin değilim. Karantinadan sonra da ekonomik sebepler baş gösterecektir, bu durumda da çalışan ihtiyacı duyulur mu bilmiyorum.

Ben de ‘işsiz’ hayatımda yaklaşık iki yıldır freelance olarak çalıştığım ajansla birlikte daha fazla iş yapmaya başladım. Özellikle herkesin eve kapandığı bu dönemde firmalar internet sitelerine ve online alışverişe çok önem verir hale geldiler, bu yüzden o tarafta çok büyük bir iş yükü var. Ideasoft altyapısı ile çalışan e-ticaret siteleri için tema geliştirmeye başladık, bu benim yeni tecrübe ettiğim bir olgu oluyor burada.

Aynı zamanda da kendi alanımla ilgili kendimi geliştirmeye de devam ediyorum. Aldığım öneriler neticesinde okuduğum kitaplar ufkumu açtı ve olaylara – mesleki olaylara – farklı bir bakış açısıyla baktığımı hisseder hale geldim. Öğrendiğim yeni şeyleri de öğrendikçe, öğrendiğim kadarıyla YouTube üzerinden anlatmak istedim. Bunun için varolan YouTube kanalımda yeni içerikler üretmeye başladım. Bunlardan ilki yazılımda test tekniklerini öğrendiğim bir içerik serisi haline geldi. C ve C++ uygulamalarımızı test etmek için geliştirilmiş olan GoogleTest framework’unu en basit haliyle anlatmaya çalışıyorum. Hazırda birkaç videom daha var ancak periyodik olarak ekliyorum hepsini. (YouTube’un periyodik video ekleyen kanalları sevdiğini okumuştum bir yerde :)) Zamanla bu seri içerisinde veri yapıları tanımlayıp test etme işlemlerini yapacağınız ve ardından da gömülü sistemlerde nasıl bu tekniği kullanabiliriz onu anlatmaya çalışacağım.

Karantina içerisinde “Hızlı Okuma” tekniklerini öğrenmeye karar verdik. Bunun için Gülseren Şenyüzü – Anlayarak Hızlı Okuma kitabını okuyarak, içerisinde anlatmış olduğu teknikleri her gün pratik yaparak çalışmalara başlamıştım. Yaptığım araştırmalar sonucunda bilgisayar üzerinde göz antrenmanlarını yapabileceğimiz 1-2 programa denk geldim ve onları da kullanmaya başladım. Bugün sanırım 7-8. gün, henüz net bir sonuç elde edemeyeceğimin farkındayım ve bu zinciri kırmadan devam etmeye çalışıyorum.

Aynı zamanda geçtiğimiz 15-16 günlük süreçte

  • Kozmos – Carl Sagan
  • Sherlock Türkiye’de
  • Bir Bilim Adamının Romanı – Oğuz Atay (Mustafa İnan hakkında)

kitaplarını okudum. Özellikle Mustafa İnan’ın hayatı hakkında bilgi edinmek çok güzel oldu. Eski dönem bilim insanlarının hayatını okudukça, 1940-1950 yıllarından böyle kaliteli insanlarımız varken şu an hala bazı şeyleri neden aşamadığımızı düşünüyorum.

Görsel Kaynağı: https://d.neoldu.com/news/71603.jpg

Python – Dizin İçerisindeki Görsellerin Boyutlarını Küçültme

Bir önceki yazımda bir dizin içerisindeki dosyaların isimlerinin nasıl değiştirileceğini anlatan bir Python script’i paylaşmıştım. Bu yazımda ise bir dizin içerisindeki görsel boyutlarının nasıl küçültüleceğini hakkındaki script’imi (python image resize) paylaşacağım.

Görsel küçültme işlemi için yararlandığım kaynak: https://www.techtrekking.com/how-to-compress-images-using-python/

Şimdi ise bu işlemi bir dizin içerisindeki tüm dosyalar üzerinde nasıl gerçekleştireceğimize bakalım. İlk olarak Python Image Library olarak da bilinen PIL (Pillow) paketini pip ile sisteminize dahil etmeniz gerekiyor.

pip install Pillow

Eğer Python 2.x ve 3.x versiyonlarını aynı sistemde kullanıyorsanız bu işlemi yaparken pip3 kullanmanız gerekebilir.

Yukarıdaki script içerisinde ‘path’ değişkeni ile script’i çalıştıracağımız dizinin adresini alıyoruz ve bu ana dizin yolumuz oluyor. ‘extensions’ değişkeni ise bir liste halinde bu script’ten etkilenmesini istediğiniz dosya türlerini içerisinde tutuyor.

‘files’ değişkeni sayesinde sizin ‘path’ değişkeni altındaki belirttiğiniz tüm klasörlerin içerisine tek tek girerek yine sizin ‘extensions’ listesi içerisinde belirttiğiniz tüm dosyalara erişebilir hale geliyoruz.

Ardından ‘files’ içerisindeki tüm dosyaları tek tek gezerek boyut küçültme işlemini yapıyoruz. Bu işlem için öncelikle resmi seçiyoruz ve seçtiğimiz resmi belirtmiş olduğumuz ‘quality’ ve ‘optimize’ parametreleri ile tekrar kaydetme işlemi yapıyoruz.

Script’i çalıştırdıktan sonra dizin içerisinde yer alan dosyalarınızın boyutlarını arasındaki farkı komut satırın üzerinden görebilirsiniz.

Python – Dizindeki Dosya İsimlerini Topluca Değiştirme

Python dili ve kullanım alanları hakkında bilgi sahibi değilseniz araştırarak ne kadar kuvvetli bir dil olduğunu öğrenebilirsiniz. Şu an çalıştığım yerde Raspberry Pi üzerinden GPIO işlemleri yapmak için, hem masaüstü hem de Raspberry Pi ekranı için görsel arayüzler tasarlamak için ve de bazı hayatınızı kolaylaştırabilecek kod blokları yazarak iş yükünüzü çok kolay bir şekilde azaltabilmenize fayda sağlıyor.

Üzerinde çalıştığımız bir projede içerisinde neredeyse 2.000 JPG, PNG ve PDF dosyası olan bir klasör vardı ve bizden ilk aşama için istenilen şey bu görsellerin hepsinin ismindeki boşlukların “-” ile değiştirilmesi, tüm Türkçe karakterlerin Unicode karakterlere dönüştürülmesi ve tüm görsel adının küçük harf olmasıydı. Belki 20-30 dosya için bu işlemi el ile yapmak daha kolay bir yol olabilir ancak söz konusu 2.000 dosya ise bu iş çok farklı boyutlara gidiyor demektir. Bu işlem için bir Python script’i yazarak tüm işlemi tek bir komut ile yapabileceğimi düşündüm ve aşağıda gördüğünüz script’i yazdım.

Burada yaptığımız şey “path” değişkeni ile script’in bulunduğu klasörün yolunu alıyoruz ve ardından bu yolunda altındaki – tüm alt klasörler de dahil olmak üzere – tüm PDF dosyalarını bir listeye atıyoruz.

Ardından “rename()” fonksiyonu içerisinde “replace” fonksiyonu ile tüm boşlukları “-” ile değiştiriyoruz ve sonra “lower” fonksiyonu ile tüm karakterleri küçültükten sonra “translate” fonksiyonu sayesinde bir üst satırda oluşturmuş olduğumuz “translationTable” içerisinde belirttiğimiz karakterlerin değişimini yapıyoruz.

Eğer PDF değil de JPG veya PNG dosyalarına – veya istediğiniz herhangi bir farklı dosya tipi için – aynı işlemi uygulamak istiyorsanız “files” listesini oluşturduğumuz satır içerisindeki “.pdf” uzantısını istediğiniz uzantı ile değiştirmeniz yeterli olacaktır.

Bu işlem sayesinde belki 1 günden fazla sürecek bir işlemi yarım saatlik araştırmanın ardından yaklaşık 4 saniyede tamamlamış olduk. Bu şekilde kullandığım birkaç script daha mevcut. Önümüzdeki dönemlerde hepsini tek tek paylaşıyor olacağım.

SPI Nedir ve Nasıl Çalışır?

Seri haberleşme ve Paralel haberleşme arasındaki farktan daha önceki yazılarımda bahsetmiştim. Seri haberleşmelerin en çok kullanılanlarından birisi olan SPI yani Serial Peripheral Interface haberleşme protokolünden bahsedeceğiz.

SPI haberleşme protokolü master/slave yapısını baz alarak çalışır ve full-duplex işleme izin verir. SPI haberleşmesi gerçekleştirebilmek için 4 pin gereklidir. Bunlar;

  • MOSI (SDO) (Master Out Slave In)
  • MISO (SDI) (Master In Slave Out)
  • CS (SS) (Chip Select)
  • Clock (SCL, CLK)

Burada bulunan MOSI ve MISO veri aktarımını gerçekleştirdiğimiz pinlerdir. CS pini ile hatta bulunan herhangi bir slave aygıtı seçmemiz sağlanıyor. Clock pini ise seri haberleşme gereği olarak verilerin iletilmesini sağlıyor.

Veri iletimi 8-bit olarak gerçekleşir. CS pinini kullanarak slave seçimini yaptıktan sonra master cihazından göndermek istediğiniz veriyi MOSI pinini Lojik 0 ve Lojik 1 şeklinde binary olarak değiştirerek hatta yazarsınız. Her bir bit için CLK pinini 0 – 1 yapmanız yeterlidir. Aşağıdaki resimde daha net bir şekilde görülmektedir.

Kaynaklar:

http://ww1.microchip.com/downloads/en/devicedoc/spi.pdf

https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/all

https://ondergormez.files.wordpress.com/2015/01/spi-iletim-yapisi.png

Yeni Yazıcımız: Tevo Tarantula

Bu yazıyı yazmaya başladığımda Ocak ayıydı ancak bir türlü tamamlayamadım. Artık yeni yazıcımız demeyelim de uzun kullanım testimiz diyelim. 2016’da 1 adet Prusa i3 modeli kendi topladığımız yazıcımız vardı. 2017 yaz başında bir tane de Prusa i3 model metal şaseye sahip yazıcı satın aldık. 3 ay kullandıktan sonra artık bu 2 yazıcının da kalibrasyonları, kaymaları, arızalarının bize çok fazla vakit ve para kaybettirdiğinin farkına vardık. O kadar fazla uğraştırıyorlardı ki gönül rahatlığı ile bir baskıyı bırakıp dışarı çıkamıyordunuz.

Biz de Burak’la birlikte elimizdeki iki aleti de satıp yeni bir yazıcı almaya karar verdik. Biraz araştırdıktan sonra yeni aletimizin Tevo Tarantula olmasında karar kıldık. Aşağıda da resimlerini gördüğünüz aleti sipariş etmek için uygun bir vakit kollamaya başladık. Siparişi vereceğimiz sıralarda “Black Friday”in yaklaştığı farkettik ve indirim olacak diye 11 Kasım tarihini beklemeye başladık. 11 Kasım günü siparişimizi tamamladık ve siparişimiz 25 Kasım günü elimize ulaştı. Satıcı firmaya 194$, gümrüğe ise bu tutarın %20’i olan 38.8$ ödeme yaptık. O günkü dolar kuru ile cebimizden yaklaşık ola  rak 890-900 TL para çıkmış oldu. Gümrük sürecinde DHL firması ile muhattap olduk ve hiçbir sıkıntı olmadan, gümrüğe geldikten hemen sonra ödememizi yaparak kargomuzun yola çıkmasına yardımcı oldular.

Yeni Yazıcı: Tevo Tarantula

Aslında ana yapıya baktığınız zaman Tevo Tarantula da Prusa i3 model alınarak yapılmış bir yazıcı. Ama farklı olan kısımları, farklı tasarlanmış bir kart kullanıyor. Burda bahsetmek istediğim konu, üzerinde bulunan kartı istediğiniz yazıcıya takıp kullanabiliyorsunuz, onun da üzerinde Atmega2560 çipi var. Aslında bizim kullandığımız Arduino Mega’dan bir farkı yok, ancak üzerine ekstra bir RAMPS kartı takmadan, tümleşik olarak motor sürücüleri ile birlikte geliyor ve sizin tek yapmanız gereken şey motor kablolarının bağlantısını yapmak oluyor.

Onun dışında ray yapısında Prusa i3 modeli lineer rulmanlar kullanırken Tevo Tarantula’da tekerlek rulmanlar kullanılmış. Bunun artı ve eksileri var. Lineer rulman sistemini belirli periyotlarla yağlamamız gerekiyordu anca teker sisteminde buna ihtiyaç duymuyoruz. Ancak tekerin sıkıntıs da havada tozlar tekeri ve yüzük rulmanı dolduruyor.

Tabla kısmında Prusa i3 üzerinde tüm tablaları denemiştim, cam, bant, ısıtıcı tabla, düz tabla, PEI tabla. Bu yöntemlerin de hepsinin birbirinden farklı eksi ve artıları var ama burda bunlardan bahsetmeyeceğim. Tevo Tarantula’da ise gönderdikleri tabla yeterli oluyordu ama ben baskıları kaldırırken tablaya zarar vermemek için PEI tabla alarak üzerine yapıştırdım ve ısıtıcı tabla ile birlikte kullanıyorum. Herhangi bir kalkma sorunu yaşamadığımı söyleyebilirim. Hatta çok yapışmadan dolayı kaldırırken kırdığım parçalar da oldu.

Tevo’nun dikey ekseni bir yere sabitlenmediği için biraz sallantı yapabiliyordu ve biz de bu sorunu çözmek için Thingiverse üzerinden bulduğumuz destek parçaları ile almış olduğumuz sehpaya sabitledik. Şu an sallantılar %90 oranında azaldı. Ayrıca sehpamızın üzerine LCD ekranı koymak için bir parça basarak onu da sabitledik. Prusa’da LCD ekranımız olmadığı için sadece bilgisayara bağlı olarak baskı alabiliyorduk ve bu bizi yazıcıya bağlı kalmak zorunda bırakıyordu. Ama artık hafıza kartına GCODE dosyasını atıp baskıyı başlatıp evden laptop ile çıkabiliyoruz. Bu çok büyük bir avantaj sağladı. Sürekli satışını yaptığımız parçaların dosyaları hafıza kartının içerisinde duruyor, evde olmadığımız zamanlarda eğer sipariş gelirse evde olan birisini arayarak direk baskının başlamasını sağlayabiliyorsunuz.

Aldığımız baskıların kalitesinin çok çok çok ekstrem bir şekilde değişim olduğunu söyleyemem. Ama az da olsa gözle farkedebileceğimiz bir kalite artışı oldu. Kalitenin yanı sıra en önemli avantajı güven oldu. Artık baskının %90 ihtimalle biteceğini bilerek baskı yapıyoruz. Bu uzun baskılar için de geçerli, gönül rahatlığıyla baskı alabiliyoruz.

Burun Kıkırdağı Eğriliği Ameliyatı Oldum

Uzun zamandır çektiğim burundan nefes alamama sorunum vardı. Sol burundan bir nebze nefes alabilsem de sağ burundan neredeyse sıfıra yakın bir nefes alabiliyordum. Burundan nefes alamamanın getirebileceği tüm sorunları yaşamaya başladım. Gece uyuduğum uyku, uyku değildi. Bazen nefes alamadığım için uyanıyordum, fazlasıyla horlamaya başlamıştım ve horladığımı hissedebiliyordum. Spor yapmaya başladıktan çok kısa bir süre sonra vücut nefesi ağızdan almamdan dolayı yığılıp kalıyordu. Yemek yerken insan hiç çiğnemeyi bırakıp nefen alma molası verir mi? Ben veriyordum, çünkü burundan nefes yok, tüm oksijeni ağızdan almanız gerekiyor ve çiğnemeye ara verip, nefes alıp bir sonraki nefese kadar çiğnemeye devam ediyordum. Geçtiğimiz son 6 ayda neredeyse hiç iyileşemedim, sürekli griptim. Çünkü burundan nefes alamıyorum, tüm nefes ağızdan alınıyor ve yanımda birisi hapşursa hasta oluyordum.

Kitap okumak tamamen bir eziyet haline gelmeye başlamıştı. Nefesi ağızdan alırken aynı anda kitabı takip etmek çok zor bir şey, çok fazla dikkat dağıtıyordu. Artık bu durumun son aşamasına geldiğini anladım. Ama bir sorun vardı, ameliyat olmaktan korkuyordum 🙂

Ameliyat Kararı

Ocak ayında apartmanımızdan bir abi benimle aynı sorunu yaşadığı için ameliyat olmuştu ve onunla konuşarak artık tüm korkularımı yendim. “Ben yaz tatiline gittiğim zaman ilk işim ameliyat olmak olacak.” dedim kendi kendime.

Memlekete geldim, 2 gün dinlendikten sonra 3. gün, perşembe sabahı saat 7:45’te hastaneye gidip sıra aldım – randevu sisteminden birkaç gün daha sonraya veriyordu randevuyu, ben beklemek istemedim. Bir de ameliyat olan abi doktorun ameliyat günlerinin cuma günü olduğunu söylemişti, ben de bu cumayı kaçırıp da önümüzdeki haftaya kalsın istemedim. – Doktora göründüm, doktor daha önceki göründüğüm doktorlar gibi burun kıkırdağımda eğrilik (C tipi Septum Deviasyonu) olduğunu söyledi, basit bir operasyonla (Septoplasti ameliyatı) sorun kalmayacağını söyledi ama ameliyat günlerini salı günü ile değiştirdiği için salı günü yapabileceğini söyledi. Benim de iş durumumdan dolayı çok fazla tatilim yoktu ve rica ettim, cuma günü ameliyathane boş olduğu taktirde beni alabileceğini söyledi. Ramazan ayı içerisinde olduğumuz için hastanede çok fazla hasta yoktu ve cuma günü bana sıra geldi.

http://www.nazimcerkes.com/burun-egriligi-septum-deviasyonu/

Ameliyat Günü

Ameliyat masasını gördüğüm zaman çok korkacağımı falan düşündüm ama bu sorundan kurtulup artık daha rahat bir hayat geçireceğimi bilmek daha ağır bastı ve hiçbir korku duymadan ameliyata girdim. Yaklaşık 1.5 saat sonra tekrar çıktım. Genel anestezi uygulamışlardı. Kendime geldiğimde burnumda bir bandaj vardı ve neredeyse hiçbir ağrım, sızım yoktu. Ertesi sabaha kadar müşahede altında tuttular ve daha sonra eve çıktım. Burnuma silikon tampon takılmıştı. Silikon tamponlar, eski tip, nefes almayı engelleyici, alınırken oldukça acı veren bez tamponların yerine kullanılmaya başlanmış. Esnek bir yapısı var ve ortasında bir boru var. Bu boru sayesinde az da olsa nefes alabiliyorsunuz ve verilen tedavi yöntemlerinden birini o sayede uygulayabiliyorsunuz.

Tampon Çıkartılması

Doktor çarşamba günü kontrole gelmemi ve tamponları çıkartmak için bakacağını söyledi. Çarşambaya kadar hiç ağrım, sızım, yüzümde şişlik, morluk vs. olmadı. Yüzde şişlik ve morluk olması durumu, ameliyat sırasında burun etine müdahele yapılması gerekirse oluyormuş. Ama bende ete bir müdahele olmadığı için öyle bir durum söz konusu olmadı. Çarşamba doktor çıkartmak istemedi, araya bayram tatili giriyordu ve o yüzden önümüzdeki pazartesi gününe kaldı. Pazartesiye kadar da tamponla gezdikten sonra pazartesi tamponları aldırmaya gittim. Aslında beni ameliyattan çok tampon aldırma konusu korkutuyordu. Çünkü okuduğum her yerde, izlediğim her videoda, konuştuğum her burnundan ameliyat olmuş insandan bunu duydum. “Tampon alınırken sanki beynini alıyorlarmış gibi acı veriyor.” Kesinlikle böyle bir şey olmadı. O kadar acı olmadan, o kadar hafif bir şekilde çıktı ki o tampon çok şaşırdım. Çünkü doktor tam çıkartmaya başlayacağı zaman ben kendimi ve oturduğum koltuğun kolunu o kadar sıkmıştım ki kaslarım ağrımıştı ama bir sinek ısırığı canınızı daha çok yakıyor. Zaten sağ taraftakini çıkarttıktan sonra ben acımadığını anlayıp kendimi bıraktım, sol taraftakini çıkartırken yüzüm gülüyordu.

http://www.kulakburunbogaz.info/Septoplasti-SMR-AmeliyativeAmeliyatSonrasiHastaBakimi.html

Ameliyat Sonrası

Evet, artık normal hayata dönebildim. Artık burnumun iki deliğinden de sorunsuz bir şekilde nefes alabiliyordum. Bu gerçekten bambaşka bir hismiş. Şu an aldığım nefesi, vücudumun rahatlamış halini gördükten sonra ben daha önce nasıl yaşıyormuşum diye sormaya başladım. Gerçekten burundan nefes almak çok çok çok çok önemli bir olay. Yemek yemem, spor yapmam, çalışmam, uyumam, kitap okumam, hepsi değişti.Şu an çok rahatım ve iyi ki ameliyat olmuşum diyorum. Burnun dış görünüşünde ise hiçbir değişiklik olmuyor, çünkü yapılan işlen sadece iç tarafta yapılıyor. Buradan ameliyat doktorum Sayın Murat Doğrusöz’e teşekkür ediyorum.

Sözün özü, eğer burnunuzdan veya sağlığınızı kötü etkileyen bir rahatsızlığınızdan şikayetçi iseniz ve tek çözümü ameliyatsa, kesinlikle olmanızı tavsiye ederim.

Sağlık kadar önemli bir şey yok.

UART Nedir ve Nasıl Çalışır?

Daha önce Seri Haberleşme Protokolleri (UART, SPI, I2C) yazımda küçük bir değinme ile bahsettiğim haberleşme protokollerine biraz daha detaylı olarak girmeye başlayacağımız serimizin ilk yazısı olan “UART Nedir (USART Nedir) ve Nasıl Çalışır?” yazısı ile karşınızdayım.

UART (Universal Asynchronous Receiver Transmitter), bilgisayar ve mikrokontroller veya mikrokontroller ve çevre birimler arasında haberleşmeyi sağlayan haberleşme protokolüdür. Asenkron olarak çalıştığı için herhangi bir “clock” ihtiyacı duymaz. USART (Universal Synchronous Asynchronous Receiver Transmitter) ise hem senkron hem de asenkron olarak çalışabilir. UART’a göre daha gelişmiş bir protokoldür. Haberleşme mantıklı aynı şekilde çalışır ancak USART aynı zamanda senkron haberleşmeleri de gerçekleştirebilir. Yeni çıkan bir mikroişlemcinin datasheet’ine baktığınız zaman bu birimleri genelde USART birimi olarak görüyoruz çünkü USART aynı zamanda UART’ı da kapsayan bir birim olarak tasarlanmıştır.

USART, 5 ve 9 bit arası data uzunluğuna sahip veriyi taşıma özelliğine sahiptir. Ancak genel olarak 8 veya 9 bitlik kullanımlar tercih edilir.

UART – USART Haberleşmesi

UART haberleşmesini gerçekleştirirken ilk olarak baudrate (veri taşıma hızı) ayarlanması gerekir. Veri taşıma hızı çok çeşitli aralıklarda olabilir ancak piyasada yaygın olarak kullanılan baudrate’ler 4800, 9600, 57600, 115200 ve mikroişlemciler için çok fazla tercih edilmese de 921600. (921600 genelde hızlı işlem gerektiren yerlerde kullanılır.) Baudrate bizim verimizin saniyede ne kadarlık byte’ını taşıyacağını belirlememize yarar. Örneğin veri taşıma hızımızı 115200 seçersek bu bizim için saniyede yaklaşık olarak 11520 byte veri iletimi sağlayacaktır.

Veri iletimi için aşağıdaki görseldeki gibi bir yapı kullanılır. Yani haberleşme işlemimiz bir başlangıç bitinden sonra data bitleri, ardından parity biti ve son olarak da bitiş biti gönderilerek sonlandırılır. Bu işlem sırasında data uzunluğu ve parity biti opsiyonel olarak değişkenlik gösterebilir.

Bu haberleşme tipini kullanabilmemiz için alıcı ve vericinin veri taşıma hızlarının (baudrate) aynı olması gerekiyor (veya birbirine çok yakın değerler olması gerekiyor.) Bunun sebebi ise aktarım sırasında oluşabilecek hataları minimuma indirmek. Hata payları tolere edilebilir seviyede olması taktirde bir sorun yaratmayacaktır (~%1-3)

Yukarıdaki görselde gördüğünüz gibi haberleşme gerçekleşmesi için ilk önce verici tarafında logic 1 (HIGH) seviyesinde bulunan iletişim hattı iletişimin başlaması için logic 0 (LOW) seviyesine çekilir ve bu bizim Başlangıç Bit’imizi (Start Bit) temsil eder. Ardından göndermek istediğimiz verileri başlangıç bitinin arkasına ekleriz. Eğer parity bitine sahipsek onu da ekledikten sonra son olarak iletişime sonlandırmak için gerekli olan bitiş bitini (stop bit) HIGH seviyesine çekerek iletişimin sonlandığını alıcıya bildiririz. Biz verici kısmında bu işlemleri yaparken alıcı da aynı şekilde işlem yapar ve sadece bizim gönderdiğimiz dataları kendi UART Data Register’ına yazar.

Nasıl Kullanabiliriz?

USART haberleşmesi yapabilmek için mikroişlemcimizdeki daha önceden tanımlanmış olan pinleri kullanarız. Bunun için ya USB-TTL dönüştürücü ya da RS232 modülü kullanırız. Her iki modülü de RX-TX pinleri mikroişlemcimizin RX-TX pinleri ile ters olarak bağlanacak şekilde bağlantısını yaptıktan sonra iletişimi başlatabiliriz. (Yani mikroişlemci TX —> Modül RX, mikroişlemci RX —> Modül TX). RS232 ile daha ayrıntılı bilgi için ilgili yazımı ( RS232 Nedir? ) inceleyebilirsiniz.

Kaynaklar:

http://enderunix.org/docs/hard_soft-uart.pdf

https://learn.sparkfun.com/tutorials/serial-communication/uarts

https://en.wikipedia.org/wiki/Universal_asynchronous_receiver-transmitter

http s://www.slideshare.net/canezgiaydemir/uart-ve-seri-haberleme

http://www.mcu-turkey.com/wp-content/uploads/2012/11/maximsoftuartfig1.jpg

http://www.bb-elec.com/Images/whitepaper-images/DataByte.aspx

WordPress SMTP Ayarları – Contact Form

Yakın zamanda yaptığımız bir websitesinde iletişim ve diğer formlar için Contact Form eklentisini kullanmamız istendi. Ancak bu eklentiyi kullanırken “Failed to send your message. Please try again later or contact the administrator with another method.” (İletinizi gönderme başarısız oldu. Lütfen daha sonra tekrar deneyin ya da yönetici ile başka bir yöntemle iletişime geçin.) şeklinde bir hata ile karşılaştık. Biraz araştırma yaptıktan sonra sorunun WordPress‘in SMTP ayarlarından kaynaklandığının farkına vardık. Bu da hosting firmamızın mail fonksiyonlarını kapatmasından kaynaklanıyor. Kapatılmadığı taktirde ciddi bir spam mail tehlikesi ile karşı karşı kaldığımız için otomatik olarak kapalı olarak geliyor ve biz bu ayarları yapılandırarak artık özel olarak kullanabilir hale geliyoruz.

SMTP açılım olarak Simple Mail Transfer Protocol (Basit Posta Aktarım Protokolü) demektir. Yani sizin gönderdiğiniz bir mailin karşı tarafa iletilmesi geçmesi gerek prosedürlerinde büyük bir rolü olan yapıdır. Bazı sunucularda SMTP ayarlanmamış olarak gelebiliyor. Bizim bunu kullanabilmemiz için ayarlarını yapmamız lazım.

Bu ayarları yapmak için ben basit bir eklenti kullanarak duruma müdahele ettim. Eklentimizin adı “WP Mail SMTP“. Eklentiyi kurduktan sonra Ayarlar sekmesi altında bulunan eklenti kontrol panelini açıp ayar yapmaya başlayabiliriz.

Öncelikle “From Email” ve “From Name” kısımlarını doldurup, daha sonra kendi sunucumuza üzerinden iletişim sağlayacağımız için “Mailer” kısmının altında yer alan “Other SMTP” seçeneğini işaretliyoruz. Bu işaretlemeyi yaptıktan sonra bize aşağıda bir alan açılıyor. O alanda yer alan bilgileri doldurmamız gerekiyor. Kendi sunucumuzun bize vermiş olduğu SMTP host ve port numaralarını girdikten sonra şifreleme yöntemimizi seçmemizi istiyor. O kısmında altında yazdığı gibi TLS önerilen şifreleme yöntemi olarak geliyor. Ama eğer size SSL sertifikasına sahipseniz ve korumanızı daha da kuvvetlendirmek istiyorsanız bu seçeneği seçerek ilerleyebilirsiniz. Biz TLS şifreleme yöntemini seçerek devam edeceğiz.

TLS seçildikten sonra alt kısmında yer alan “Authentication” alanı otomatik olarak kapalı olarak geliyor. Kullandığımız sunucularda uzaktan bağlantı yapabilmek için kullanıcı adı ve şifrelerini biliyor ve sisteme tanıtıyor olmamız lazım. Bu yüzden bu ayarı etkinleştirerek açılan alan içerisine kullanıcı adımızı ve şifremizi yazıyoruz. Ardından yine eklentinin bizi bilgilendirmek için verdiği kodu wp-config.php dosyamıza yapıştırıyoruz ve “your_password” alanını kendi şifremiz ile değiştiriyoruz.

define( 'WPMS_ON', true );
define( 'WPMS_SMTP_PASS', 'your_password' );

Ayarları kaydettikten sonra artık sunucumuz mail gönderme işlemlerine hazır hale geliyor.