0%

Caprover-tutorial

Caprover

Kısacası, bu teknolojiyi docker kullandığınız projelerinizde işinizi birkaç tıka indirgeyeceğiniz bir upgrade olarak düşünebilirsin.
Veritabanlarını, popüler docker applerini, wordpressi tek tık ile manage edebiliyorsunuz.
Digitalocean kullanıyorsanız hazır dropletinizi kullanıp kendi caprover vps’inizi kod kullanmadan oluşturabilisiniz.
Basit ve açık olması için listelerle anlatım yapacağım ;

Ne işe yarıyor?

  • One-click apps ile Tek tıkla redis,postgres,wordpress ve yüzlerce bilinen teknoloji için docker containeri oluşturabiliyorsunuz. (aka : deploy)
  • Domain ve subdomain işlerini kendi hallediliyor; Nginx ve letcrpyt kullandığı için domain ve subdomain yönlendirme ve onları https e çevirme işini otomatik hallediyor. Sadece containeri dışa açılacak portu belirtmeniz ve domaini girmeniz yeterli. (hatta one-click apps ile bu da otomatik yapılıyor)
  • Containerların kendi arasındaki dosya paylaşımı için tagları otomatik oluşturabiliyorsunuz.
  • Containerları dışarı açmadan kendi aralarında kolayca bağlayabiliyorsunuz.
  • Nginx ile beraber websocket uygulamalarda kullanabiliyorsunuz.
  • Birden fazla instance ile load balancing yapabiliyorsunuz.
  • Basic auth ile projelere şifreyle erişim koyabiliyorsunuz.
  • Env değerlerini ve portları caproverin kendi arayüzü üzerinden kolayca değiştirebiliyorsunuz.
  • Daha detaylı container yönetimi için caproveri içine Portainer de kurabilirsiniz. Fakat bu tooldan sonra portainere ve docker-cliye gerek duymadım.
  • Github action ile git projeniz ile caproveri bağlayabiliyorsunuz.
  • Deploymentlar için versiyon kontrol sistemi var. Güncel sürüm hatalıysa bir önceki sürüme (image) dönebiliyorsunız.
  • İçine gömülü Netdata ile istatiksel bilgilere erişebiliyorsunuz.
  • Cluster: Birden fazla caprover sunucusunu beraber birbiriyle uyumlu çalıştırabiliyorsunuz.

Caprover-tutorial

Deploy yöntemleri

  • One-click apps: Redis, postgres, wordpress, directus gibi yüzlerce işinize yarar appı tek tıkla kuruyorsunuz.
  • Deploy via ImageName : Direkt image adını girerek app oluşturabilirsiniz. (dockerhubdaki herşeyi kısacası)
  • Deploy captain-definition file : Captain-definition dosyası ile caproverin önceden ayarladığı appleri toplu halde (mesela kendi app’ınız ve mongodb beraber) kurabiliyorsunuz
  • Deploy plain Dockerfile: Dockerfile içeriğini caprover’e giriyorsunuz, ve proje kolayca deploy oluyor.
  • Deploy from Github/Bitbucket/Gitlab: caprover reponuzu takip edip, captain dosyasına bakar otomatik deploy ediyor.
  • Tarball: bir captain dosyası içeren bir .tar dosyasını caprovera upload ederek uygulama deploy ediyorsunuz.
  • Official CLI: Bilgisayarın caprover cli’si kuruluyorsa, proje klasörünüze girip, “caprover deploy” diyerek projenizi ayağa kaldırabiliyorsunuz.

Caprover-tutorial

Benim caprover üzerindeki applerim:

  • apprise : Bildirim sunucusu
  • changedetection : bir web sayfasındaki değişimleri takip ediyor
  • dozzle : docker containerlerinin loglarını erişmek için bir web arayüz.
  • duplicati : veri yedekleme için harika bir çözüm.
  • directus : “veritabanı ve api” kavramını tek bir sistem birleştiren harika bir şey.
  • guacamole : ssh ve vnc sunucuları için güzel bir web arayüzü
  • minio : amazon s3 alternatifi
  • n8n : workflowlar ile otomasyon/integrasyon sistemi
  • portainer : docker containerleri için bir web arayüzü
  • wordpress : haltal olduğu için pek sevmesem de kendisini caprover üzerinden çok kolay blog oluşturabiliyorum.

Resmi sitesi : https://caprover.com

sven-mieke-fteR0e2BzKo-unsplash

Kalem

Okuma yazmayı kalemle öğrendik. İlkokul ve ortaokul hayatımızı kalem ile geçirdik. Kalemle o kadar derin bir bağ kurduk ki, o zihnimizde öğrenme ve birşeyi kendimize katmak ile özdeşleşti.
Kalemle kurulan bu bağımız nöronlar düzeyindedir. Beynimizde eğitim, öğrenme ve gelişim gibi kavramlar kalem ile dallandı, budaklandı.
Fakat özellikle biz yazılım mühendisleri kalemle bağımızı unuttuk, çünkü onun başka bir rakibi vardı; Klavye.

Y ve X kuşağınından bir bireyseniz, beyninizde kalem ile kurulan bağın klavyeyle olandan daha derin olduğu kesindir. Z kuşağından iseniz, klavyenin belki ona yaklaşma ihtimali vardır.
Fakat asla kalem kadar çok yönlü değildir.
Beyin , Sinir ve Kas birbiriyle aşırı bağlantılı bir üçgen oluşturur.
Kalemin hassasiyeti, kullanılan kas sayısı ve beyinle bağlantısı ve atasal geçmişimizle uyumu daha derindir.
Daha küçük bir klavyeye alışmaya çalışırsanız, hemen zorlanmaya ve yanlış yazmaya başlarsınız. Çünkü klayveyle hassasiyetimiz çok derin değildir.
Bu fark mouse ile resim çizmek gibidir.

Herşeyimi sanala aktaran ve kaleme o kadar uzak durmaktan yazmayı hatta imza atmayı unutma düzeyine yaklaşan ben, bir yazılım mühendisi olarak tekrardan unuttuğum birşeyin farkına vardım.
Yazılımı öğrenirken bütün tasarımlarımı, planları kalem ile yapmıştım. Hatta aklımda kalması için temellerini yazarak öğrenmiştim. Yazılımı çok erken yaşlarda öğrenen biriyim çünkü kalemle sıkı bir ilişkim vardı.
Çoğumuzun kalemle bağı o kadar derindir ki, ders kitapların aralarına defterlere hayallerimizi çizeriz. Planlarımızı tasarlarız. Bunu ufak yaşta hepimiz yapmışızdır.
Kalemi aşırı küçümseyip, yazılımla alakalı tasarımları ve planları artık zihnimden yapmaya başlamıştım. Belki bu hatayı sizde yapıyorsunuz. Hatta bunu yaptığınız için Einstein olduğunuza inanıyorda olabilirsiniz. Fakat bu çok büyük bir zihin gücü israfıdır.
İnsanın kısa süreli hafızası çok gelişmiş değildir ve plan yaparken bütünü ve ayrıntılara görmekte zorlanır. Bu sırf yapabiliyorum diye sol kulağını, sağ elinle tepeden dolandırıp tutmak gibi birşeydir.
Herşeyi bir kağıt üzerinde tasarlamak ve planlamak bu eksiğimizi tamamlar.
Fakat bir eksiklik daha vardır. “Akılda kalıcılık”

Kalem ile öğrenme / hafıza arasında çok derin bir nöral bağ vardır. Birşeyi kalemle yazarak onu çok hızlı ezberler ve zihninize yazarsınız.
Mühendisliğin unutulan aracı “Blueprint” dir. Çoğumuz bunun ne olduğunu bile bilmiyoruz. Game developerlar belki Unreal Enginede adını gördüğü için programlama yöntemi sanabilir.
Blueprint eskiden mühendislerin, bir projenin tasarımını cetvelle ,pergelle ve kalemle çizdiği kağıtlardır. Yaptıkları projeleri güzel bir yazı ile öyle bir açıklarlar ki, karmakarışık projeyi diğer mühendisler bile kolayca anlayabilir.
Fakat bu yazıda bize ‘bireysel’ Blueprint’in zihnimize ve verimimize etkisine odaklanacağız.
Blueprint yazılım mühendisleri için de bir ihtiyaçtır.

Geçtiğimiz zamanlarda bir projeye kervan yolda düzülür direkt başlamak yerine, kalem ile plan ve tasarım yapma karar verdim.
Proje biraz karmaşıktı. Fakat kalemle projenin amaçlarını, olmazsa olmazlarını, ne kullanacağımı, sınıflandırmaları, kodların ilişkilerini birer birer yazdım.
Yarım saat bir zamanımı ayırdım. Fakat projeyi geliştireceğim 6 saat için, zihnim hiç olmadığı kadar berraktı. İnanmayacaksınız ama yazdığım kodlarda, yazım aşamasında bile bug olmadı.
Kodu yazıp, çalıştırıyordum ve herşey tıkır tıkır işliyordu. Bir sonraki kodun ne olacağını, şu kodu neyle bağlayacağımı. Hangi sırayla, hangi algoritmayla problemin çözüleceği kesindi.
Bekleyip düşünmeler olmadan, kodlar parmaklarım ile zihnimde bilgisayara akıyordu. Ve 6 saat sonra çıkan ürün de çok tatmin ediciydi. Bittiği zaman ‘birşeyi eksik yaptım mı?’ diye bir düşüncem olmadı.
Hatta bu kadar kolay bittiğine emin olamadım, ana hedefler üzerinden 2-3 defa geçtim, herşeyi yapmıştım bitmişti. Projeyi mükemmeleştirecek bol bol zamanım bile kalmıştı.

Tabii zihnimize aşırı güvenip ufak projeleri kervan yolda düzülür mantığı plansız tasarımsız yapabiliriz. Fakat kaliteli bir ürün öncesinde plan yapmak şarttır.
Bu planı birçok platform ile kalemsiz de yapabiliriz. Fakat kalem ile yazarken kullandığımız kaslar ve bu kasların zihin ile bağlantısı, diğer hafızaya alma ve zihinde onu bütünleştirme konusunda büyük faydası var.
Bu planı bilgisayarda yapsaydım, o plana 10-15 defa tekrar bakmam gerekebilir. Çünkü hatırlayamayabiliyorum ve “kalıcı hafızaya” alınmadığı için zihinde bir bütün oluşturmuş değil.
Fakat kalem ile plan yaptıktan sonra, sadece “yapıldı” yazıp tik atmak için bakmak zorunda kalıyorsun. Unuttum hatırlamadım, kafam bulandı diye bakmalar astronomik ölçekte daha az oluyor.
Zihnimiz en az 12 yıl (lisans okuduysanız, 16+) kalem ile öğrenmeye programlandı. Ve kalem ile büyük bir nöral ağ geliştirdik.

Kalemi bırakıp atmamız, zihnimizin en az 12 yıllık yeteneğini köreltmek olur. Yazılım mühendisi olsak bile bu “eski boomer icadı” kullanmak zorundayız.

jsDelivy

Bugün bir GitHub repositorysindeki dosyaları CDN (Content Delivery Network) olarak kullanmanın yolunu keşfettim.
Bu sayede resimleri github üzerine upload edip, CDN ile daha hızlı ve optimize
şekilde yüklenmesini sağlayabiliyoruz.

Tabi bu sadece resimler için geçerli bir yöntem değil, aynı şekilde kendi kütüphanelerinizi ve kodlarınıza da
bu şekilde, dünyanın her yerinden hızlı erişime sunabilirsiniz.

Siteniz zaten GitHub Pages üzerinde bulunuyorsa bile sitenize erişimde (arada CloudFlare gibi proxyler
kullanıyorsanız ) bir yavaşlık oluşacaktır. Kendi GitHub Pages sayfanızada da resimler, javasscript kodları için
bir CDN ile erişmek süreci hızlandıracaktır.

Avantajları

  • Hızlı erişim
  • Dünyaya geneline yayılmış bir ağdan dosya alarak gecikmelerin azaltılması
  • Kalıcılık (Dosyalar public bir repositoryde güvenli olarak saklanacak)
  • Websitelerini veya webe bağlı uygulamaları hızlandırmak için birebir.

Kullanımı

Bu şekilde GitHub reposundaki dosyanızı linkliyorsunuz. Kendisi otomatik olarak optimize ediyor.

https://cdn.jsdelivr.net/gh/{github kullanıcı adı}/{repo kodu}/{dosyanın adresi}

Tabi Branş ve versiyonda kullanabilirsiniz.

https://cdn.jsdelivr.net/gh/{github kullanıcı adı}/{repo kodu}@{versiyon veya branş}/{dosyanın adresi}

Sadece GitHub için değil, npm ve wordpress içinde kullanabilirsiniz : https://www.jsdelivr.com/?docs=gh

Örnek

https://cdn.jsdelivr.net/gh/farukcan/farukcan.net/
(Repodaki bütün dosyaları listelemek için)

(Tek bir resme erişim örneği)
https://cdn.jsdelivr.net/gh/farukcan/farukcan.net@master/source/images/embedded/Untitled%204.png

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
// load any GitHub release, commit, or branch
// note: we recommend using npm for projects that support it

https://cdn.jsdelivr.net/gh/user/repo@version/file

// load jQuery v3.2.1

https://cdn.jsdelivr.net/gh/jquery/[email protected]/dist/jquery.min.js

// use a version range instead of a specific version

https://cdn.jsdelivr.net/gh/jquery/[email protected]/dist/jquery.min.js
https://cdn.jsdelivr.net/gh/jquery/jquery@3/dist/jquery.min.js

// omit the version completely to get the latest one
// you should NOT use this in production

https://cdn.jsdelivr.net/gh/jquery/jquery/dist/jquery.min.js

// add ".min" to any JS/CSS file to get a minified version
// if one doesn't exist, we'll generate it for you

https://cdn.jsdelivr.net/gh/jquery/[email protected]/src/core.min.js

// add / at the end to get a directory listing

https://cdn.jsdelivr.net/gh/jquery/jquery/
1
<script src="https://cdn.jsdelivr.net/gh/jquery/jquery/dist/jquery.min.js"></script>

Gömülü Yazılım Testi

Özet

Bu yazıda, “Gömülü yazılım nedir?”, “Gömülü yazılım testleri neden önemlidir?”, “Gömülü yazılım nasıl test edilir?”, “Gömülü Yazılımda TDD nasıl yapılır?”, “Standart yazılım testinden farkları nedir?” gibi soruların cevapları işlenmektedir.

Gömülü Yazılım Nedir?

Gömülü yazılımlar , gömülü sistem diye bilinen kontrol aygıtları ve makineleri için bilgisayar yazılımlarıdır.

Gömülü sistem bir görev için atanmış, mekanik ve elektronik fonksiyonları yerine getiren işlemciden, hafızadan, girişler,çıkışlardan oluşan bir bilgisayar sistemidir.

Endüstriyel robotlar, GPS alıcıları, Kameralar, Routerlar, Oyun konsolları, Fotokopi makineleri, Arabalar, Akıllı cihazlar, Saatler, Mikrodalga fırınları, Beyaz eşyalar, Trafik Işıkları, İHAlar, Telefonlar, Tabletler, Askeri cihazlar, Hava araçları bir gömülü sistemdir.

Son istatistiklere göre tahminen dünyadaki işlemcilerin %90’ına yakını bir gömülü sistem parçasıdır.

/images/embedded/Untitled.png

Gömülü yazılım testi neden önemlidir?

Gömülü sistemler hayatımızın her aşamasına girmiştir. Bunlardaki bir kusur, hata ve zayıflık can güvenliğimizi bile tehdit edebilecek seviyelere gelebilmektedir. Geçtiğimiz yıllarda, Chrysler adında birçok ünlü markaların sahibi olan bir firma, arabalarının uzaktan hacklenebilme zayıflığı yüzünden 1.4 milyon arabayı geri çağırmıştır. Bu arabalar yapılacak siber saldırılarla sürücüyü öldürecek ciddiyette riskler taşımaktadır.

Yine geçtiğimiz yıllarda Toyotanın güç sisteminde hiçbir test ve belgeleme içermeyen spagetti kodlar ortaya çıkmıştır.

İngiltere de satılan bir akıllı termostat sistemi, yazılımındaki bir bug sebebiyle müşterileri soğuğa mazur bırakmıştır. Bir can kaybı yaşanmasa da, bu bug bebekler için ölümcül olabilirdi.

Bir Airbus A400M uçağı, gömülü sistemindeki bir bug sebebiyle düşmüştür. Bu boyutta bir uçağın askeri mühimmat taşıması ve yerleşim yerlerine düşmesi büyük can kayıplarına yol açabilirdi.

Gömülü sistemler hastanelerde de kullanılmaktadır. Bir hastanın ilaç pompasını kontrol eden yazılımda bug bulunmuştur. Bu bug sebebiyle, hastalara ölümcül doz verilebilirdi.

Ayrıca gömülü sistemler birbirine bağlı olduğu için birindeki kusur diğerlerini de etkileyebilir. Geçtiğimiz yıllarda bir WiFi destekli Akıllı Lambada bir güvenlik açığı bulunmuştur. Bu açık sayesinde hackerlar WiFi şifresine erişip, bütün evin ağına sızabilmekteydi.

Uzay mekikleri ve roketlerde bir gömülü sistemdir. Geçtiğimiz yüzyıllarda gömülü yazılım kusurları sebebiyle, birçok uzay faciası yaşanmıştır.

Bu sebeplerden dolayı, gömülü yazılım testi, standart yazılım testlerinden ayrılır. Çünkü bir hata, kusur, açık ve zayıflık bizi öldürebilir.

Sektörlere göre gömülü yazılım test tekniği paper sayısı

/images/embedded/Untitled%201.png

Test Nedir?
Test bugların, kusurların, noksanlıkların ve zayıflıkların bulunmasıdır.

Gömülü yazılım nasıl test edilir?

Benzer bir çok yazılım test sisteminde olduğu gibi, gömülü yazılımda da test geliştirme döngüsünün ayrılmaz bir parçasıdır.

Sağlamlık için hem fonksiyonel hemde fonksiyonel-olmayan nitelikler denetlenmelidir.

Fonksiyonel Nitelik Testi, yazılım yerine getirmesi gereken görevleri kusursuz bir şekilde yapmasıyla alakalıdır. Gömülü yazılımda fonksiyonellik fiziksel çevreye bağlı kontrol ediliyor olabilir. Bu çevresel girdilerin tanımı ve aralığı açık olmalıdır.

/images/embedded/Untitled%202.png

Örnek kodda, fonksiyon çevresel bir girdi olan ivmeölçer ile kontrol edilmektedir. Fakat bu fonksiyonun ivmelenme girdilerinden biri “0” değeri aldığında bozulacaktır.

Fiziksel çevre, rastgele oluşturulan sentetik girdiler ile simüle edilebilir. Fakat bu yaklaşımda ilişkili girdi sentezlemek başarısız olabilir. Bunun önüne geçmek için bu simülasyon evrimsel veya metaheuristic algoritmalar ile yapılabilmektedir.

Gerekli olan durumlarda tüm olası girdiler test edilebilir. Fakat çok önemli olmayan fonksiyonlarda, bu yöntem maliyetlidir. (zaman açısından)

Anlaşılacağı üzere girdi uzayı ve bu uzayın test edilebilirliği ve test yöntemleri büyü önem taşımaktadır.

Fonksiyonel Olmayan Nitelik Testi , bir gömülü yazılımın birkaç fonksiyonel olmayan nitelikleri vardır. Bunlardan en önemli ve temel nitelikler : zamanlama, enerji ve güvenirliktir. ( timing, energy, reliability)

Zaman Kısıtlamaları, yazılımın görevlerini kısıtlı zamanda tamamlanmasıyla alakalıdır. Gömülü yazılımların çoğu gerçek zamanlıdır. Tepki süreleri ve gecikmeleri çok önemlidir. Örneğin bir arabanın kaza anında darbe sensörlerindeki verilere göre hava yastıklarını doğru zamanda tetiklemesi hayati önem taşır. Bir kaza olduğunun doğrulanması, emin olunması, hesaplamaların yapılması ve çok geç olmadan hava yastığın tetiklenmesi, milisaniyeler düzeyinde kısıtlı bir zamanda yapılmalıdır.

/images/embedded/Untitled%203.png

Dolasıyla bu süreleri optimize ederken, işlemcinin kod talimatları işleme süresi bilenerek yazılım geliştirilmelidir.

Her bir fonksiyon için bir “zaman bütçesi” belirlenmeli ve o fonksiyon o zamanı aşmayacak şekilde optimize edilmelidir.

İşlemciler, boolean operatorlerini çok hızlı işler, toplama işlemini çarpmaya göre daha hızlı yapar. Hafızaya erişmek bile zaman tüketir.

İşlemci-hafıza arasında zaman kaybı olmaması için işlemcinin önbelleği kullanılmalıdır.

/images/embedded/Untitled%204.png

Her bir fonksiyonun zamanını ölçen testler yazılmalıdır.

Örneğin: assert(time <¼ 1ms)

Her bir önemli fonksiyon için WCET (Worst-case execution time) yani en kötü senaryoda çalışma zamanı bilinmelidir.

Enerji Kısıtlamaları, zaman gibi gömülü yazılımda göz önünde bulundurulması gerek şeylerden biridir. Özellikle batarya kaynaklı sistemlerde önemlidir. Enerji tükenen işlemlerin, komponentlerin tüketim değerlerin testi yazılmalıdır. Zaman kısıtlamalarında olduğu gibi, enerji tüketimi içinde, WCEC (worst case energy consumption) yani en kötü enerji tüketim senaryosu ölçülmelidir.

Güvenirlik Kısıtlamaları, gömülü sistemler çoğu zaman fiziksel çevreyle etkileşim içindedir. Fiziksel çevreden sensörler ile güvenilebilir veriler elde etme çalışır. ( jiroskop , ivmeölçer, kablosuz iletişim vs. ) Ancak bu sensörlerden ve alıcılardan tutarsız veriler alınabilir. Ağda veri paketleri bozulabilir, kaybolabilir. Çoğu sensör kusursuz değildir ve hata payları vardır. Ayrıca daha tutarlı, kaliteli sensör ve alıcı sistemler pahalıdır. İşte burada bu çevresel verilerin kabul edilebilir tutarlılık seviyeleri belirlenmeli ve ona göre bir yazılım geliştirilmelidir.

Test Metodolojilerin Kategorizasyonu

/images/embedded/Untitled%205.png

/images/embedded/Untitled%206.png

Kara-kutu Soyutlaması: Sistem kara kutu gibi davranır. Test senaryoları örnekler ve rastgele girdiler ile oluşturulur. Sistemin gereksinimleri test edilir. Fonksiyonlar test edilir. Sık rastlanmayan uç senaryolar test edilemeyebilir.

/images/embedded/Untitled%207.png

Gri-Kutu Soyutlaması: Kara-kutu ve Beyaz-kutu yaklaşımın karışımı olarak düşebilir. Ancak sistem kara kutu gibi davranmış, bir model gibi temsil edilir. Bilgiyle alakalı özellikler test edilir. Testler arama uzayına göre oluşturulur.

Beyaz-kutu Soyutlaması: Bütün kaynak kodunun ve yollarının test edildiği bir işlemdir. Girdi uzayına göre testler yazılır. Daha çok sistem yapısı test edilir. Bu yöntemde eksik özellikler tespit edilemez.

/images/embedded/Untitled%208.png

Yapısal olmayan yaklaşımlar

Bu yöntemlerde bir düzel ve yapı yoktur. Testin kalitesi testi yapana bağlıdır. Yazılımın ne kadar test edildiğini bilmek zordur. Bu bu testin sonuçları objektif değildir. Çok taraflı ve görecelidir.

Smoke Testing (Duman testi)

Yazılımın bir çok ana fonksiyonun çalıştırılıp duman çıkıp çıkmadığın test edilmesidir. (Bu daha hardwarelar için yapıldığı böyle tanımlanıyor. Tabi duman çıkıp çıkmaması değil, fonksiyonu yerine getirip getirmemesi test edilir)

Geniş ve sığ bir yaklaşımdır

Exploratory Testing (Keşifsel yaklaşım)

Uzman bir tester, sistemin açıklarını bulmayı sistemi alt etmeye çalışır.

Learn(Öğren), Design(Tasarla), Execute(Uygula), Analysis(Sonuçları analiz et) diye 4 aşaması vardır.

Bu çok dağınık bir yöntemdir.

Testing Coverage

Bir yazılımın, test senaryolarının yüzde kaçını başarıyla tamamladığını gösteren değerdir.

%100 coverage, yazılım 100% test edilmiş olduğunu göstermez, çünkü test-caselere bağlıdır.

Aynı şekilde 100% test edilmiş bir yazılım 100% güvenli de değildir.

Test geliştirme döngüsü

TDD (Test Driven Development)

  1. Testleri oluştur.
  2. Bütün testleri çalıştır, hatalı olanı gör.
  3. Ufak(!) değişiklikler ile hatayı düzelt.
  4. Testi yeniden çalıştır. Testin geçildiğini gör.
  5. Testleri refactor et. Fazlalıkları kaldır.

/images/embedded/Untitled%209.png

TDD ve Gömülü Yazılım

  • Testlerde donanıma bağlılık vardır.
  • Gerçek zamanlılıktan gelen zaman kısıtlamaları kısıtlamalar vardır.
  • Sınırlı bir hafıza vardır. (Normal yazılama göre)
  • Pek OOP(Nesneye yönelimli programlama) kullanamazsın.

V-model

/images/embedded/Untitled%2010.png

Unit Test

Yazılımın her bir çalıştırılabilir fonksiyonunun test edilmesidir.

Integration Test (Subsystem Test)

Yazılım her modülünün test edilmesi ve bu modüllerin uyumluluklarında test edilmesidir.

Software Test (System Test)

Sistemin bir bütün olarak test edilmesidir.

Acceptance Test

Müşteriyle beraber yapılan, yazılım kabul edilebilirliğinin testidir.

Emulated Target Board

Gömülü yazılımlar test edilirken ve geliştirirken, sanal donanım kartları kullanılır. Çünkü bir hata yüzünden kart bozulabilir ve kullanılamaz hale gelebilir.

Sanal kartlar yoksa, bu kartları mocklayan bir yazılım yazılarak testler çalıştırılabilir. Fakat bunu donanımdan bağımsız yazılım parçaları için yapmak gerekir.

/images/embedded/Untitled%2011.png

Sunum

Embedded Software Testing Sunum

Kaynakça ve İleri Okuma

On Testing Embedded Software
Abhijeet Banerjee, Sudipta Chattopadhyay†
, Abhik Roychoudhury

What we know about testing embedded software?
Vahid Garousi, Hacettepe University and University of Luxembourg
Michael Felderer, University of Innsbruck
Çağrı Murat Karapıçak, KUASOFT A.Ş.
Uğur Yılmaz, ASELSAN A.Ş.

Automating Embedded Software Testing on an Emulated Target Board
Jooyoung Seo, Ahyoung Sung, Byoungju Choi, Sungbong Kanga
Dept. of Computer Science and Engg., Ewha University, Seoul, Korea
Mobile Solution, System LSI Division, Samsung Electronics Co., Ltd., Yongin, Koreaa
{jyseo, aysung}@ewhain.net, [email protected], [email protected]

Formal Testing Applied in Embedded Software
Li Zhen,Liu Bin, Ma Ning and Yin Yongfeng
Dept. of System Engineering of Engineering Technology
Beihang University
No.37 Xueyuan Road, Beijing, China, 100191

The Effectiveness of Real-time Embedded Software
Testing

Bo Zhang,Xiangheng Shen
Changchun Institute of Optics, Fine Mechanics and Physics
Chinese Academy of Sciences
Changchun, China

Embedded Software
Testing

Distributed Embedded Systems
Philip Koopman
September 30, 2015

Tool Support for Automated Traceability of
Test/Code Artifacts in Embedded Software Systems

Christian Wiederseiner, Vahid Garousi, Michael Smith
Department of Electrical and Computer Engineering, University of Calgary
2500 University Drive NW, Calgary, AB Canada T2N 1N4

Embedded Software Testing in Research
Environment

Marcin Bajer, Marek Szlagor, Marek Wrzesniak
ABB Corporate Research Center
Krakow, Poland

Effective Test Driven Development for Embedded Software
Michael J. Karlesky, William I. Bereza, and Carl B. Erickson, PhD

Test Driven Development for Embedded Software
James Grenning
San Jose, April 2007, ESC Class# 241

Dünyayı sadece irade gücü değiştirebilir
irade isim (ira:de) Arapça irāde
  1. isim Bir şeyi yapıp yapmamaya karar verme gücü, istenç
    Korkunç bir irade kuvveti sarfıyla baş ucundaki lambayı yaktı.“ - S. F. Abasıyanık

(TDK 2018)

 

İrade gücü , karar uygulama ve verme gücüdür ki 3 tarafı vardır ; [1]

1 - Yapmayacağım : Baştan çıkarıcı şeylere dayanmak

2 - Yapacağım : Yapılması gereken şeyleri yapmak

3 - İstiyorum : İnsanın hedef ve isteklerin farkında olması

İrade gücünün, Beynin Prefrontal Korteks‘inden geldiği düşünülüyor.

Prefrontal Korteksin önemi ile ilgili en iyi örneklerden biri beyinlerinin bu bölümü bir kaza sonucu zarar görmüş kişiler. 1848’de Phineas Gage adında sakin, saygılı, çalışkan bir ustabaşı prefrontal kortekse ciddi şekilde hasar veren bir kaza yaşadı ve bu kaza onun hayatını sonsuza dek değiştirdi. Gage’in arkadaşları artık onu tanıyamıyordu. Çünkü Gage sabırsız, çabuk öfkelenen bir insana dönüşmüştü. Bakıldığında eski Gage’in tam tersi bir insan gelmişti. Phineas Gage’in yaşadığı kaza, prefrontal korteks bölgesindeki bir hasarın karakterde nasıl bir değişiklik yaratacağına dair yüzlerce örnekten bir tanesi. İradenin mistik bir şey olmadığı, bunun yerine beynin yüzlerce fonksiyonundan biri olduğu da anlaşılıyor.“ [2]

Sol bölge iradenin “yapacağım” yönünden ,
Sağ bölge iradenin “yapmayacağım” yönünden ,
Orta bölge ise iradenin “istiyorum” yönünden sorumludur.

Bir teoriye göre :

İrade bir kas gibi onu çok kullandığınızda yoruluyor. İradenin kullanıldıkça azalan(yorulan) bir şey olduğu sonucuna varıldı. Bir içgüdüye karşı geldiğiniz her seferde, ne kadar küçük olursa olsun, irade kasını kullanıyorsunuz ve bu yüzden irade rezervini azaltıyorsunuz.

Meditasyon prefrontal kortekse kan akışını artırır. Görünen o ki, beyin kaslarla aynı şekilde adapte oluyor: Nasıl şınav çektiğinizde kol kasları kazanıyorsunuz, meditasyon yaptığınızda da öz-kontrolden sorumlu bölgelerdeki sinirsel bağlantıları geliştiriyorsunuz.

İradeyi güçlendiren şeyler

İrade bir kas gibi olduğu için güçlenmesi için çalıştırılmalı ve zorlanmalıdır. Ancak irade gücünüzü doğru zamanlarda yormalısınız. Yoksa irade yorgunluğu önemli işlerinizi aksatmaya neden olabilir. İrade gücümüzün sınırlarını bilmeliyiz. Bazen tek şey yapmak, çok şey yapmaktan daha iyi olabilir. Odağımızı asla kaybetmemeliyiz.
  1. İrade gücünü kullanırken, irade gücünü kullanma nedenini asla unutmamak, robotlaşmamak. Kendini sürekli motive etmek.
  2. Meditasyon, düşünce kontrolü, soğuk duş, bazı ibadet türleri ( başka bir şey düşünülmemeye çalışılan namaz , zorlayıcı bir oruç , çoğu budist ibadeti gibi )
  3. Dengeli ve yeterli uyumak. ( Fazla uyku, ve sabah kalkma güçlüğü irade azlığına işarettir. Karşı konulması gerekir. )
  4. Spor yapmak ve özgüven arttırmak. Spor, özgüveni arttıracağı için karar alırken daha az çekiniriz.
  5. Beyin için spor yapmak. Beyni kullanmak, kitap okumak, düşünmek. Sudoku çözmek.
  6. Düzgün ve doğru nefes olmak. Stresi yenmek. Önemli durumlarda ve aşırı uç duygular yaşadığında (korku,heyecan,mutluluk) , 5 saniye durup nefes almak ve sakinleşmek. Tekrar düşünmek.
  7. Kendinle barışık olmak. Kendini asla cezalandırmamak. Kendini affetmek. Başka insanlara yardım etmek, iyilik ve doğru eylemler yapmak.
  8. Önemli işlerden başlamak. Mümkünse bu işleri sabah erken halletmek. ( Çünkü güniçinde irade git gide azalıyor )
  9. Aynı hedefe giden bir yol arkadaşı bulmak. Karşılıklı olarak birbirinizi motive edebilecek birinin olması.
  10. Kararsızlığın önüne geçmek. Plan yapmak, Öncelik belirlemek, küçük adımlarla başlamak (kaizen/1 dk yöntemi), prensip sahibi olmak.
  11. Sorumluluk ve risk almak. ( Tek bir risk almadan hayallere ulaşılamaz )
  12. Başarıyı asla hayal etme, o gerçek olmayan hayalle kendini ödüllendirme. Başarı için çalış.

 

[1] Maximum Willpower McGonial

[2] Bilinmeyen kaynak

Sun Bin, Antik Çin’de yaşayan bir stratejisttir. Sun Tzu ile akraba oldukları düşünülmektedir. 20.yy’dan önce Sun Tzu ile aynı kişi olduğu düşünülmekteydi. Çünkü eserleri henüz bulunamamıştı. 20.yy’da “Kayıp Savaş Sanatı” bulundu. Ancak yazdığını kitabın sadece bir kısmı bize ulaşabilmiştir.

Problemler üzerine

Karmaşık bir yumağı çözmek isteyen ipleri düşüncesizce çekiştirmemelidir.
Bir problem olduğunda, en iyisi ona hemen bulaşmamaktır ve düşünüp en uygun imkanı ve zamanı yakaladığımızda onu ince ince çözmemiz gerekir.

Bütün problemler İskenderin Gordion düğümü gibi değildir. Mutlak çözümü yoktur. Dolayısıyla, düğümü parçalayacak kılıcımız yoksa,onu ince ve karmaşık işçilikle çözebiliriz.

Yazılım geliştirirken, öncesinde ince ince plan yapmamız gerekir, çünkü plansız başlanıp devam ettirdiğimiz bir süreç, sona gelindiğinde istenen sonucu vermez. Gözden kaçırdığımız çok şey olduğunu farkeder ve herşeye baştan başlamamız gerekir. Dolayısıyla emeğimiz de boşa gitmiş olur.

Aynı durum Felsefi problemlerde de geçerlidir, bir probleme hemen ön yargıyla yaklaşmamak onu objektif olarak incelemek ve araştırmak gerekir. Doğru olduğunuzu zannettiğiniz şey doğru olmayabilir.

Zhao'yu kurtarmak için Wei'i kuşatmak

Zhao, Sun Bin'in müttefiğinin bir şehriydi. Wei ise , Zhaoya saldıran düşmanın şehridir. Sun Bin, Zhaodaki kuşatmayı kırmak yerine, bütün gücüyle Wei'e saldırır. Wei de yaşlılar ve sakatların dışında ufak bir ordu olduğu için kolaylıkla ele geçirir. Bunu duyan düşman çılgına dönerek, kuşatmarı bırakıp, Wei'e geri döner. Fakat kuşatmadan yeni çıkmış , morali bozulmuş ve dönerken yorulmuş düşman, Weideki ordu tarafından kolaylıkla bozguna uğrar.
Dövüş sanatı: Size tekme atan bir düşman, dengesinden taviz verir ve diğer bacağını savunmasız bırakır. O tekmeyi karşılamak yerine , düşmanınızın diğer bacağına vurmak daha mantıklıdır.

* : Saldıran, saldırmak için gücü bir yerde toplamalıdır. Gücün bir yerde toplanması, diğer yerlerdeki gücü azaltır. Güçlü olduğunu hisseden saldırgan, zayıf yerinden vurulduğunda gücünü sorgular ve moralini kaybeder. Zayıf yerini koruma çabası, ön görülebilir olduğu içinde, stratejik olarak kaybeder.

Strateji : Rakip size saldırıyorsa ya bunu geri püskürtürsünüz ya da ona saldırırsınız. Savunma bekleyen rakibe, saldırı yapmak onun kafasını karıştırır. Bir an da saldıran iken, savunan olur.

Retorik : Biriyle tartışırken, kendinin zayıf olduğu konuyu değiştirip, karşı tarafın zayıf olduğu konu üzerinden tartışmayı sürdürürsen, karşı taraf yetersiz kalacaktır. Kendini savunma ihtiyacı hissedeceği için, az öncesinde üstün tarafın kendi olduğunu unutacaktır. Zihninin odağı değişecektir.

Siber Güvenlik : Bazı DOS saldırısı koruma sistemleri, saldıra yapan bilgisayarların bufferlarını hedef alıp, onları hafızasını doldurarak , saldırı yapamaz hale getirmektedir.

Savaşta ilk adım

Savaş istenmez, zafer arzulanmaz. Harekete geçmek için ilk adım, zafer için gerekli koşullar var olduğunda atılmalıdır.
Bir düşmana, savaşmayı istediğin için saldıramazsın. Haklı sebebin ( Casus Belli ) yoksa, ne halkın ne de ordunun desteği yeterli olur. Haklı olan düşman, sayıca az da olsa daha güçlüdür. Saldırıdan önce bakılacak ikinci şey de, savaşın kazanılabilirliğidir. Öyle ki düşmandan en az iki kat güçlü olunmadığında savaş risklidir.

Savaş ancak savaşla engellenir

Beş imparatorun erdemi, üç kralın yeteneği karşısında zayıf düşenlerin savaşı insanlığı ve adaleti yayarak yasaklayacağım dedikleri söylenir. Bu yöntemi bir çok kral denedi ama başaramadı. Savaş ancak savaş ile engellenir.
Yaklaşan bir savaş engellenemez, engelleme çabaları sadece bunu erteler ve daha beklenmedik bir savaşa neden olur. Onun için bir savaşı engellenmenin yolu savaştır. Ertelemek, tembellik ve kaçmak zafer kazandırmaz. Düşmana avantaj sağlar.

İnsan ilişkilerinde yaşanacağı malum bir tartışma varsa, onu tartışmayla engellersin. Ertelemek sadece şiddetti ve bilinmezliği arttırır.

Ancak ;

Savaşa sadece mecbur* olunduğunda girilmelidir.

Ordunun boyutuna göre durumlar

  • Ordumuz fazlaysa, fishing yapılır. (yem atılır, düşman kontrollü olarak yönlendirilir.)
  • Ordumuz azsa, beklenir ve asıl güç gizlenerek tuzak kurulur. (Gizlenilir, zayıf olduğumuz ve saldırma cesaretimiz olmadığı ima edilir. Ancak asıl güç ile düşman parçalara ayrılarak yok edilir.)
  • Ordular eşitse, yukarıda ki iki teknik aynı anda uygulanır. ( Yem at, yemi yuttur. Eş zamanlı olarak asıl güçle saldır. )

Dar geçitler ve engeller

Bunlar her çağda her savaşta etkili silah olmuştur, düşmanı yenmez ancak düşmanın tam gücünün kullanamamasını sağlar. ( Dağlar,denizler,çöller,vadiler,astroitler, güneş sistemleri,insan yapımı engeller ... )

Kaçışı olmayan düşman

Çıkış yolu kalmamış düşmanın, hala çıkış yolu olduğuna ve beklemesi gerektiğine inandırılması gerekir.
Yoksa düşman savaşmaktan başka çaresi olmadığını anlar ardından büyük cesaret ve fedakarlıkla savaşır.

Asıl güç nedir?

Nüfuz, sayı, hile, strateji değildir. Analiz ve kontroldür. (Bilgelik ve İrade)

Analiz olmazsa hile ve strateji uygulanamaz. Kontrol olmazsa nüfuz ve sayının anlamı kalmaz.

Zafer

Zafer seçimlere, yiğitlik düzene, esneklik duruma, vurucu güç güvenirliğe, kalite eğitime bağlıdır.

Kılıç taşımak

Kılıç bütün gün taşınır ama bu ille de kullanılacağı anlamına gelmez.
Kılıç doğuştan sahip olmadığımız bir silahtır. Tertip ve düzene de doğuştan sahip olamayız. Gücümüzü kullanabilmek için sürekli düzen içerisinde birşeylere hazırlıklı bulunmalıyız. Fakat bu gücümüzü sürekli kullanacağımız anlamına gelmez. Kılıç yanımızda değilse, gücümüzü kullanmamız gerektiğinde kullanamayız.

Facebook üzerinde yayınlanan reklamlardan elde edilen bilgilerle dönüşüm ve retargeting yapılmasını sağlayan kod parçasıdır.

Retargeting : sitemize alışverişe giren birine ileri aşamalarda farklı yerlerde reklam göstererek onu geri dönmesini sağladığımız bir hedefleme sistemidir.

İki türlü retargeting vardır : Pixel temelli ve Liste temelli

Pixel temelli retargeting de, kullanıcının tarayıcısında javascript kodu çalıştırılır ve çerez ile kullanıcıya başka bir yerde reklam gösterilir.

Liste temelli retargeting de kullanıcının sitenizle etkileşim kurması gerekir. Üye olduğunda email adresi alınan kullanıcı tekrar bu email adresi yoluyla sosyal medya hesapları belirlenerek, bunlarla giriş yaptığı yerlerde, kullanıcılara reklamlar gösterilir.

Olay Kodu : Javascript koduna eklenen satırlardır. Kullanıcın hangi aşamada olduğunu retargeting sistemine bildirir.

Pixeldeki olay kodları şunlardır : Search, ViewContent, AddCart, AddToWishList, IniateteCheckOut, AddPaymentInfo, Purchase,Lead

ViewContent : Bir kullanıcının içeriği görüntülenmesi, o ürüne ilgi duyduğunu gösterir. Onun için görüntülenmede bu olay kodu çağrılır. (ürün/sayfa görüntüleme çağrılır)

Search : Bir kullanıcının sitenizde arama yapması, markanıza ve ürünlerinize ilgi duyduğuna işarettir. Bu kişiler birincil potansiyel müşterilerdir. (Aramalarda bu olay çağrılır.)

AddToCart : Sitenizden herhangi bir ürünü satın almaya karar verip, vazgeçmiş kişi, indirim ve kampanyalarda ilk hedeflenmesi gereken kişilerdir. (Bu olay sepete eklemede çağrılır.)

AddToWishlist : Site istek listesi oluşturmaya müsaitse, istek listesine ekleyen kullanıcılara o ürünle ilgili kampanyaları sunabilirsiniz. (istek listesine eklemede çağrılır)

InitiateCheckout : Sizden alışverişini tamamlayan, ürün sahibi olmuş müşteriniz için bu olay çağrılır. Bu kişileri yeni fırsatlardan haberdar edebilirsiniz. (alışverişi tamamla butonunda çağrılır)

AddPaymentInfo : Kişinin ödeme bilgilerini paylaşması size güven duyduğuna ve potansiyel müşteri olduklarına işaret eder. (ödeme formu gönderme butonunda çağrılır)

Purchase : Sizden satın alma işlemini tamamen başarıyla tamamlamış müşteriler için kullanılır. Bu kişilerin sizden yeniden ürün olma ihtimalleri yüksektir. (satıl alma sonrası teşekkürler sayfasında çağrılır)

Lead : Sitenizde kullanıcılar yorum yapabiliyorsa, kullanıcının yorum yapması ürününüzden etkilendiği ve ürünü merak ettiğini işaret eder. (yorum gönderme butonunda çağrılır)

CompleteRegistration : Sitenize üye olma olayıdır. Birinin sitenize üye olması, ürününüzü almaya meyilli olduğunu gösterir. (kayıt formu gönderme butonunda çağrılır)

fpq('track','ViewContent');

Yazılım projesi geliştirirken, kademeli olarak kodları yedeklemek ve saklamak gerekmektedir. Bu yedeklemeler yapılırken gerektiğinde önceki sürüme geri dönebilmemiz ve önceki sürüm ile farkları (change log) belirlememiz gerekmektedir.

Bunun yanı sıra, bir projede birden çok yazılımcı çalıştığı için, yapılan değişikliklerin birbiriyle çakışmaması gerekmektedir. Sürüm kontrol sistemlerinin yaptığı şey de budur.

Şu an en yaygın versiyon kontrol sistemi “Git“dir. Bu yazılım aynı zamanda Linuxun da geliştiricisi olan Linus Torvalds tarafından geliştirilmiştir. Açık kaynak kodlu, ücretsiz bir yazılımdır.

Github“ ise kodların saklanıldığı uzak sunucu (remote) git servisidir.

Repository : git projelerinin her birine verilen addır.

Commit : Herbir sürüme verilen isimdir. Her değişiklik yapılan adımdır. Hash Key , Ad ve açıklama içerir.

Branch : Değişliğin yapıldığı branşa verilen isimdir. Her repositoryinin ana branşı masterdır. Yani uygulamanın asıl sürümünü master branch oluşturur.

git clone <adres>
- uzak sunucudaki kodları geliştiricinin bilgisayarına klonlar

git commit -am <mesaj>
- Kodda yapılan değişikliklerden commit oluşturur

git push
- Commitleri uzak sunucuya gönderir

git pull
- Uzak sunucudaki commitleri ve güncellemeleri alır.

git init
- Herhangi bir klasörde git repositorysi oluşturur.

İki tür map fonksiyon vardır:

  • Değerler için map : bir değerin, 2 nokta arasındaki konumu, başka iki nokta arasına oranlar.
  • Diziler için map : bir fonksiyonu bütün dizi elemanlarına uygulayarak yeni dizi oluşturur.

map(değer,başlangıç,bitiş,yenibaşlangıç,yeniBitiş)

değerin, 2 nokta arasındaki konumu, başka iki nokta arasına oranlar

map(2,1,3,2,6) = 4

map(Math.random(),0,1,-25,75) = -25 ve 75 arası rastgele değer

Array.map(fonksiyon)

bir fonksiyonu bütün dizi elemanlarına uygulayarak yeni dizi oluşturur.

[1,2,3,4].map(Math.sqrt) = [1,4,9,16]

1
2
3
4
5
var array = [ 2 , 3 , 5, 6]

var yeniArray = array.map(function(a){ return a*a+1 });

// yeniArray = [5,10,26,37]

C# map fonksiyonu

1
2
3
4
float map(float val, float iMin, float iMax, float oMin, float oMax) {

return (val - iMin) * (oMax - oMin) / (iMax - iMin) + oMin;
}

Bir fonksiyon veya değişken, oluşturulduğu yerin scopeuna dahildir. Kullanıldığı yerin değil.

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
var random = function(){
return Math.floor(Math.random()*100);
}
var sagas = [];
var hero = "faruk"+random(); // faruk7

var newSaga = function(){
var foil = "thefoil"+random();
sagas.push(function(){
var deed = "thedeed"+random();
console.log(hero+deed+foil);
});
};

newSaga();
sagas[0](); // faruk7 thefoil2 thedeed1
sagas[0](); // faruk7 thefoil2 thedeed4
newSaga();
sagas[0]();  // faruk7 thefoil2 thedeed5
sagas[1]();  // faruk7 thefoil9 thedeed6
sagas[0]();  // faruk7 thefoil2 thedeed7
sagas[1]();  // faruk7 thefoil9 thedeed8

// burdan anlaşıldığı üzere, bir fonksiyonun scopunu , oluşturulduğu yer belirliyor.
// yani sonrasında kullandıldığı scopre değil

// mesela burdaki foil değeri, ilk defa fonksiyonun tanımlandığı foil değeri
// newsagadan sonra, foil güncellenmiyor, yeni foil oluşuyor.
// sagas[0] eski foil değerini döndürecektir.</pre>