7 Aralık 2014 Pazar

IEEE 754 Özel Sabitler

Özel Sabitler
Epsilon
Epsilon kelime anlamı olarak sıfıra en yakın rakam demek.

C
<cfloat> içinde tanımlı olan FLT_EPSILON 1'den büyük olan en küçük pozitif sayıyı elde etmek için kullanılabilecek değeri gösterir.  Yani tanımın tersine  1 + FLT_EPSILON = 1'den büyük en küçük pozitif sayı anlamına geliyor.

C++
std::numeric_limits<float>::epsilon() 'da yukarıdaki işlemi C++ için yapar. Bu sabit genellikle iki kayan noktayı karşılaştırmak için kullanılır. Örnekte epsilondan 1'e kadar olan sayılar yazdırılıyor.
using nld = std::numeric_limits<float>;
 auto h = nld::epsilon();
 for (; h < 1; h = std::nextafter(h, 1.0f)) {
     std::cerr << "h: " << h << std::endl;
 }

numeric_limits<float>::min() : en küçüpozitif normalized değerleri döner. Bu sayı FLT_MIN'dir. Örnek:

C#
Single.Epsilon C'nin aksine tanıma uygun olarak - en küçük pozitif sayının kendisini verir. 

6 Aralık 2014 Cumartesi

Birim Testi - Unit Test

Birim Testi (Unit Test) Çapraz Yapılabilir mi ?
Bu konuda yapılmasının iyi olduğu yönünde bazı yazılar var ancak ben bu yöntemi kullanırken bazı eksiklikler gördüm. Çalıştığım projede çapraz testin stajyerlerce yapılmasını istendi.

Stajyerler, birim testi yazarken kodu tamamen anlayıp gerçek içeriğe yönelik test yerine, sadece kapsama yüzdesini artıracak testleri yazdılar. Birim testi yapan kişi, kodu geliştiren kişi ile birebir çalışan birisi değilse, test istenildiği kadar verimli olmayabilir.

Kodu geliştiren kişi birim testini kendi yazmayınca, kodun ne kadar test edilebilir olduğunu tam kavrayamıyor. Bu konuda da eksiklik olduğunu düşünüyorum.

Birim Testi Gözden Geçirilir mi ?
Bence gözden geçirilmemesi lazım çünkü birim testleri canlı kod parçalarıdır. Sürekli değişirler. Kapsama ölçümü almak yeterli. Ama bazı firmalar birim testlerinin de gözden geçirilmesini süreçlerine dahil ediyorlar.

Büyük Yazılımlarda Birim Testleri Nasıl Yönetmeli
Yazılım büyüdükçe birim test sayısı da artıyor. Çok fazla testi bir arada koşturmak, hatanın bulunmasını zorlaştırır. Bu yüzden birim testleri de kendi içinde bölümlemek gerekebilir.

Birim Testleri Kod Dokümantasyonu Olabilir mi ?
Özellikler çevik süreçlerde birim testinin dokümantasyon olarak kullanılabileceği yönünde görüş birliği var.

Arrange-Act-Assert pattern
Açıklaması şöyle. Arrange kısmı setup() gibidir. Test için gerekli hazırlıklar yapılır. Act kısmında test edilecek şey çağrılır. Assert kısmında testin sonucu dığrulanır
Arrange: In this section, we perform the setup and initialization required for the test. This usually involves creating data required for a test case and/or setting up mocks,

Act: In this section, we take the actions required for a test case. This means calling the method under test.

Assert: In this section, we verify that our test case did what was expected from it. This usually involves asserting the response of the method under test and/or verify that invocations were made on mock objects.

Birim Testi İle Tümleyim (Integration) Testinin Farkı Nedir?
Sorunun cevabını ben de bilmiyorum. Tek anladığım tümleyim testleri bir veya daha fazla birimin bir araya getirilerek yapılması gerektiği. Hangi araçlar kullanılır ve seviyesi ne olmalıdır bilmiyorum.

Bazen birim testi yapmak, integration testi yapmaktan daha zor olabiliyor. Özellikle birim testi için girdiyi hazırlamanın zor olduğu durumlarda yalıtılmış birim testi yerine integration testi yapılabilir deniyor.  Örnekte birim testi için bir tree hazırlanması gösterilmiş.
ar input = new AssignStatement(
  new Variable("x"),
  new BinaryExpression(
    new Constant(2),
    BinaryOperator.Plus,
    new BinaryExpression(new Constant(3), BinaryOperator.Multiply, new Variable("a"))));
Bu girdiyi hazırlamak gerçekten uzun sürebilir. Bunun yerine integration testi gibi başka bir sınıfın girdi hazırlaması kabul edilebilir.
var input = new Parser().ParseStatement("x = 2 + 3 * a");

Tümleyim testi için "big bang" yöntemi en kolay yöntem. Bottom up veya top down yöntemlerde birleştirilmesi gereken bileşenlerin sırasının belirlenmesi ve her birleşimi besleyecek kod ve araç geliştirilmesi gerekebiliyor.

Birim Testi Dışarıdan Bir Dosyayı Yükleyerek Yapılabilir mi ?
Dışarıdan dosya yüklemenin amacı eğer çok fazla sayıda olasılığı denemek ise makul sayılabilir. Ancak amacın birim testi yerine tümleyim testine doğru kaymamasına dikkat etmek lazım.

GUI Testi Nasıl Yapılır?
GUI uygulamalarının işlevsel testleri (functional test) bir test otomasyon aracı ile yapılırsa daha iyi olur.

Yük (Load) Testi
Yük testi sonucunda sistemde çalışması gereken normal senaryolar denenir ve yük sonucu işle kaybı olup olmadığı görülür.

Birim Testi Anti Pattern'ları
Burada birim testinde yapılan yanlışlıklar verilmiş. En çok puan alan anti pattern Free Ride/Piggback. Yeni özelliği test etmek için baştan test yazmak yerine mevcut testin biraz değiştirilmesi.

Her Bug veya Yeni Kod İçin Birim Testi
Düzeltilen her bug veya yeni eklenen her özellik için birim testi yapmak gerekir. Birim testinin Free Ride olmamasına dikkat edilmelidir.

Birim Testi Production Ortamıyla Aynı Olmalıdır
Birim testleri production ortamıyla mümkün olduğunca aynı olmalıdır. Buradaki örnekte production ortamında UTC saat dilimi kullanılırken birim testlerde yerel saat kullanıldığı için hataların yakalanmadığı anlatılıyor.

Test Yöntemleri
Tüm test yöntemleri test için kullanılacak verinin rastgele değil de belli prensiplere göre seçilmesini amaçlar. Böylece testin etkinliği artırılarak

Equivalance Class Partitioning
Denkli Sınıfı Testi yazısına taşıdım.

Boundary Value Testing
Boundary Value Testing - türkçesi uç nokta test yöntemi - yukarıdaki denklik sınıfı yöntemine çok benziyor.  Aradaki en büyük fark kümeden girdi seçerken, tam uçtaki, ucun bir altındaki ve bir üstündeki değerleri kullanmak. Yani biraz daha fazla test yazılması anlamına geliyor. Eğer 3'ten fazla test yazılması gerekiyorsa girdiyi equivalence gruplarına ayırırken bir hata yapıldığı anlamına gelen bir yazı gördüm ancak tam ne demek isteniyor bilmiyorum.

Eğer girdi aralık ise (range)
Aralık sürekli (continuous) veya kesikli (discrete) olabilir. Aşağıdaki aralık örneğinde, a -1 , a ve a+1 ayrıca b -1 , b , b+1 değerlerini kullanarak 6 test yazılıyor. Örneğin bir büyüklüğü 10 olan array veri yapısı için indeksleri test ediyor olsaydık, -1,0,1 ve 8,9,10 indeks değerlerini kullanmamız gerekirdi. Kırmızı ile işaretli girdiler içinse , hata almayı beklerdik.
Eğer girdi nokta ise
Noktanın kendisi, bir eksiği ve bir fazlası için test yazılıyor. Boolean değerler de nokta gibi düşünülebilir. Yani bir true bir de false girdi denenmelidir.

Eğer girdi küme ise
Bu durumda mümkünse kümedeki tüm elemanların ve küme dışındaki bir elemanın denenmesi isteniyor.
Yine denklik sınıfı test tekniğine göre biraz daha fazla test yazılıyor.



CPPUnit
Konuyu CPPUnit başlıklı yazıya taşıdım.

5 Aralık 2014 Cuma

Base64

Base64 Nedir?
Base64 binary verinin sadece bazı ASCII karakter içerecek şekilde kodlanması anlamına gelir.
Base64 encoding schemes are commonly used when there is a need to encode binary data that needs be stored and transferred over media that are designed to deal with textual data. This is to ensure that the data remains intact without modification during transport.
Binary verinin bazı transfer protokolleri ile kullanırken, kontrol karakteri olarak algılandığı için bozulduğu yazılı. Böyle bir transfer protokolüne örnek veremiyorum.

Hangi Karakterler Vardır
Base64 ile kullanılan ASCII alt kümesi A–Z, a–z, 0–9, +, /, =  karakterleridir. Toplam 64 tane karakter vardır. Yani her karakter 6 bit ile temsil edilebilir.

Bir string'in Base64 olup olmadığını anlamak için [^A-Za-z0-9+/=] düzenli ifadesine başvurulabilir.

Base64 verilen girdiyi daha büyük hale getirir. Yani çok verimli değildir.

Ne Tür Binary Veri İçin Kullanılır?
1. hash sonucu elimize geçen byte[] değeri,
2. MIME eklentileri Base64 string haline çevrilmiş şekilde karşımıza çıkıyor. Örneğin e-posta'da eklenti olarak gönderilen bir gif dosyası Base64 olarak gönderilebilir.
MIME-Version: 1.0
Content-Description: "Base64 encode of a.gif"
Content-Type: image/gif; name="a.gif"
Content-Transfer-Encoding: Base64
Content-Disposition: attachment; filename="a.gif"
MIME Base64 binary to text çevriminde kullanılabilecek bir standart. Bu standarda göre bir satırın uzunluğu en fazla 76 karakter olabilir.

3. XML içine binary veri eklerken

kullanılabilir.

Veri Neden = Karakteri İle Biter? - Veri 3'ün Katı Olacak Şekilde Tamamlanır
Base64 veriyi 3 byte'lık gruplar halinde okur. Eğer veri 3'ün katı değilse olacak şekilde tamamlanır. Bu durumda çevrimin sonunda genellikle "=" karakteri ile biten string'ler elde ederiz. "=" karakteri Base64 çevrim tablosunda boşluk karakterine denk gelir. Dolayısıyla bir string'e bakıp sonu 2/3 ihtimalle = karakteri ile bitiyorsa, Base64 ile kodeklendiğini tahmin edebiliriz.

Base64 ve URL Safe Çevrim
Bazı Base64 kodekleri URL Safe bir mod sunuyorlar. URL içinde + ve / karakterleri kullanılmaz. Standart Base64 ise bu karakterleri kullanır. URL Safe çevrim yapan kodekler  + ve / karakterleri yerine "_" karakteri kullanır. Örneğin Apache Commons kütüphanesi aşağıdaki gibi kullanılabilir.
base64String = Base64.encodeBase64URLSafeString(myByteArray);
Apache Commons
Base64 Sınıfı kullanılabilir.

Linux
base64 komutu kullanılabilir






2 Aralık 2014 Salı

CMMI - Organizational Process Focus Süreci

OPF (Organizational Process Focus) - Process Management

  • SG 1 Determine Process Improvement Opportunities
    • SP 1.1 Establish Organizational Process Needs
    • SP 1.2 Appraise the Organization's Processes
    • SP 1.3 Identify the Organization's Process Improvements
  • SG 2 Plan and Implement Process Improvements
    • SP 2.1 Establish Process Action Plans
    • SP 2.2 Implement Process Action Plans
  • SG 3 Deploy Organizational Process Assets and Incorporate Experiences
    • SP 3.1 Deploy Organizational Process Assets
    • SP 3.2 Deploy Standard Processes
    • SP 3.3 Monitor the Implementation
    • SP 3.4 Incorporate Experiences into Organizational Process Assets

SG 1
SG 1 kapsamında daha iyi ne yapabiliriz soru sorulur. 

Lessons Learned
Lessons Learned - Öğrenilen Dersler yazısına taşıdım

SG 3 
SG 3 proje çapında iyi yapılan işlerin veya çıkarılan derslerin kurumsallaştırılmasını vurguluyor. 

30 Kasım 2014 Pazar

Engellenmiş Ortamda Yazılım Geliştirmek

Çalışma Ortamı
Savunma sanayindeki bazı yazılım firmaları çalışanlarına doğru dürüst internet erişimi vermezler. Bazı kübiklere internet makineler koyarlar - ki bu makineler genellikle en dandik işe yaramayanlardır. USB'ler etkin değildir, çalışmaz.

Kaynak kodum çalınmasın diye mi ? 
Microsoft kaynak kodunu bir çok kurum ile paylaşıyor. Açık kaynak kodlu bir çok yazılım var. Bu kurumlar kodların çalınmasından korkmuyor mu ?

Çalışanlar internette vakit harcamasın diye mi ? 
Bunu engellemenin çok basit yöntemleri var. Websense gibi bir araç ile bazı siteler engellenir. Hatta şu anda herkes telefon,tablet ile internete bağlanıyor. İnternette vakit harcamak isteyen yine harcar. Bu kişileri engellemenin yolu da yok.

Peki internete erişimi olmayan insanlar nasıl yazılım geliştirecekler ?
Best of the best olduğunu iddia eden bu firmalar yazılım geliştirme konusunda bu kadar engel koyduktan sonra ne elde edeceklerini sanıyorlar ?

29 Kasım 2014 Cumartesi

CMMI - Süreç Varlıkları

Süreç Varlıkları (Organizational Process Assets) bir çok firmanın CMMI yapısına geçince hayata geçirdikleri bir portal.

Genellikle 4 kademeden oluşuyor.

Policies -> Processes/Practices -> Work Instructions/Procedures -> Enablers/Templates

Policies
Identify the organization's expectations for establishing and maintaining the process

Processes/Practices
Often high level process descriptions whereas Work Instructions/Procedures provide more detailed steps related to the process

Enablers/Templates
Can be any kind  of process aid that helps carry out the process and can include tool guides, or templates to help build related documentation

Süreç varlıkları da "review", "approval", "release" aşamalarından geçerler.

Yazılım Arayüzü

Giriş
Yazılım arayüzleri için hazırlanan belgelere bir çok farklı isim verilebiliyor. Software Interface Control Document (ICD), Interface Design Document (IDD) gibi isimler farklı yerlerde karşımıza çıkabilir. Hepsi üç aşağı beş yukarı aynı şeyi yani formatlı mesajları kast eder. Ben bu yazıda "ICD" kelimesini kullandım.

Interface Control Document Nedir?
Interface Control Document (ICD) genellikle elektriksel arayüzler için kullanılır.Yazılım arayüzleri için hazırlanan belgelere de Software ICD deniliyor.

IDD Nedir?
Interface Design Document yazılım arayüzünü belirtir.

Data Transfer Object Nedir?
Ben ICD ile Data Transfer Object (DTO) kavramını birbirine çok yakın buluyorum. DTO klasik kullanımında yazılım servisleri veya katmanları arası veri aktarımı için tanımlanır. ICD ise farklı sistemler arası veri aktarımı için kullanılır. DTO'nun Serialize(), Deserialize() metodları olması gerekmez.

Bitwise ICD
Bir çok iletişim yolu düşük bant genişliğine sahip olduğu için formatlı mesajları sıkıştırmak gerekir. Bu yüzden mesaj alanları bit bit tanımlanırlar. Bitleri engineering formata çevirmek için iki yöntem var.

Low Level ve High Level ICD tanımlamak
Bu yöntemde Low Level ICD bit seviyesinde mesajları okuma yazma işleminden sorumludur.
High Level ICD ise Low Level ICD mesajlarını resolution ve offset değerleri ile çarpıp bölerek engineering formata çevirir.  Ben bu yöntemi daha doğru buluyorum.

Not : Resolution (bazı projerlerde scale de deniyor ki bence scale başka bir şeyi ifade eder) bir bit ile temsil edilebilen en küçük değer anlamına gelir.

Low level  ve High Level'ı birleştiren tek bir ICD tanımlamak
Bu yöntemde her bir mesaj alanı bir struct veya class olarak tanımlanır. Bu sınıfların scale ve offset alanları vardır. Sınıfa değer atanınca scale ve offset değerleri ile çarpıp bölerek engineering formata çevirir. Örnek bir sınıf aşağıda.

class MyInt32 {
 public :
   int32_t m_Value;
   double m_Scale;
   double m_Offset;

  void operator= (int value){
    m_Value = (value * m_Scale) + m_Offset;
  }
}

Bytewise ICD
Bantgenişliği düşük olmayan iletişim yollarında bytewise ICD tanımlanır. Bu ICD mesajlarında int, double gibi büyük tipler kullanılabilir.

ICD ve Protokol
Bir çok iletişim protokolü gerçek verinin yanında ek şeyler de gönderir. Örneğin gerçek veri zarflanabilir, daha küçük parçalara ayrılabilir vs. ICD mesajlarını iletişim protokolüne çevirmek için protokolü gerçekleştiren sınıflar yazmak gerekebilir.

Header Örneği
Message ID : Hangi mesaj olduğunu anlamak için kullanılır. Aşağıda bu alanı kullanan basit bir örnek var.
protected void decode(UnparsedPacket msg, List<Object> out) throws Exception {
        switch(msg.id){
            case FooPacket.ID:
                FooPacket fooPacket = new FooPacket(msg.frame);
                out.add(fooPacket);
                break;
            case BarPacket.ID:
                BarPacket barPacket = new BarPacket(msg.frame);
                out.add(barPacket);
                break;
        }
 }

Message Size : Mesajın byte cinsinden toplam büyüklüğü. Eğer UDP gibi parçalanmaya izin vermeyen bir transport kullanılıyorsa bu alana gerek olmayabilir. TCP gibi transportlarda bu alan ileride ICD'nin değişebileceği de düşünülerek konulursa faydalı olur.

ICD Mesaj Sınıfları
Genellikle sadece Serialize (Stream s), Deserialize (Stream s), ToString() gibi metodlara sahip olan sınıflardır.  Kullanılan programlama diline göre stream sınıf hiyerarşisini de kodlamak gerekebilir.

BitStream, LittleEndianStream, BigEndianStream gibi streamleri bazı programlama dillerinde mevcut olmayabiliyor. Bu durumda hiyerarşiyi kendimiz kurmak zorunda kalırız.

Ayrıca ICD mesajlarını, abstract bir sınıf veya arayüzden türetmek te programlamayı kolaylaştırır.

Serialize Metodu
C++ için yazıyorsak
void MyMessage::Serialize (stream& s);
şeklinde yazılabilir.


ToString metodu
C++ için yazıyorsak
void MyMessage::ToString (stringstream& s);
şeklinde yazılabilir.

ICD ve Range Check
Eğer mesajların hatalı gelebileceği düşünülüyorsa, ICD mesajlarına hatalı durumları yakalayan range check kodları eklenir

ICD ve Logical Check
Bu tür mantıksal kontrolleri ICD mesajlarına eklemek kolay olmayabilir. Gerekirse ICD mesajlarını işleyen katmana dahil edilmelidir.

ICD ve Request Response
Bazı ICD'lerde gönderilen isteğe karşılık Response gönderilir. Bu tür belgelerde hangi isteğe hangi cevap gönderildiğini gösteren bir akış diagramı (sequence diagram) faydalı olur.

İstek ve cevabı eşleştirmek için istek içine sırayla artan bir RequestID yazılır. Gönderilen cevap içine de aynı RequestID yazılarak istek ve cevap eşleştirilir.

ICD ve Surrogate Key
Bazı ICD'ler nesneler üzerinde CRUD işlemi için kullanılır. Eğe karşı sistem, benim yazılımımda CRUD işlemi yapıyorsa, her nesneye bir SurrogateKey verilmesi iyi olur. Benim sistemim ile karşı sistemin yarattığı nesneleri birbirlerinden ayırmak için Surrogate Key iki kısma bölünebilir. Öreğin 0- 100 arası değerler benim, 100-200 arası değerler karşı sistemin olabilir.


ICD ve Acknowledgement
Bazı ICD'lerde gönderilen komuta karşılık Acknowledgement gönderilmesi istenir. ACK mesajında mesajın alındığı belirtilir. Bazen de Response gönderilmeyen durumlarda mesajın işlenip işlenemediği belirtilir.

Internal Mesaj Yapısına Çevirmek
Formatlı ICD mesajı okunduktan sonra yazılımda bir şekilde saklanması gerekir.

Clone Yöntemi
Kullanılabilecek en kolay yöntem ICD mesajını ve Internal mesajı ortak bir sınıftan türetmek olabilir.

     ---->BaseClass<----
     |                                 |
            ICDClass                     InternalClass
Bu yöntemde ICDClass kendisi kullanmasa bile InternalClass'ın ihtiyaç duyduğu alanları da görür ve bilir.

Field Copy Yöntemi
Biraz daha zor bir yöntem ise ICD mesajlarını dizi şeklinde çekirdeğe iletmek. Bu yöntemde çekirdek ICD mesajlarını kendi içindeki yapılara yapıştırır.

ICD Arayüz Bileşeni --- ICD mesaj Dizisi ----> Çekirdek

Bu yöntem ise çekirdek kodunda Clone() yerine teker teker nesnenin alanlarının kopyalaması yapıldığı için hata yapmaya müsaittir.

ICD Arayüzü İçin Yazılım Bileşeni

Yazılımın çekirdeği ile arayüz arasına ICD Arayüzü Yazılım Bileşeni yerleştirmek iyi bir fikir. Böylece çekirdek işlev ICD değişikliklerinden mümkün olduğunca yalıtılmış olur.

SIU 
Sub-System Interface Unit : Genellikle sadece mesaj dönüşümü yapan, akıllı olmayan yazılımlardır

SAU
Sub-System Adaptation Unit : SIU'dan akıllı olan yazılımlardır. Mesajları gerekirse parçalar veya birleştirebilirler.


ICD Mesaj Dizisinin Kısmi Gelmesi
Özellikle bant genişliğinin düşük olduğu sistemlerde ICD mesaj dizisi örneğin 5 parçadan oluşsa bile tasarruf için sadece güncellenmek istenen parçanın gönderilmesi söz konusu olabilir. Bu durumda ICD arayüz sisteminin önceden gelmiş olan bilgiyi kaybetmemek için ICDClass nesnesini doldurmaya başlamadan önce mevcut son halini okuması ve yeni gelen mesaj ile doldurulmuş nesneyi güncellemesi gerekebilir.

ICD Mesajlarının Gönderilmesi
Havadan yapılan iletişim sistemlerinde genellikle aynı paket bir kaç defa tekrarlanır. Farklı zamanlarda yapılan bu gönderimin amacı herkesin mesajı alabilmesini sağlamaktır. ICD arayüz yazılımı bir aktarım kuyruğu kullanarak mesajların gönderilmesi zamanını ve kalan sayacı tutabilir. Adil kullanım kotası koyarak gönderenleri yavaşlatabilir. Daha fazla para ödeyene öncelik tanıyabilir vs.

Bridge Yazılımlar
Bazı yazılımlar sadece iki ICD arasında dönüşüm yapmak için vardır. Bu tür yazılımlara bridge (köprü) denir. Statefull ve stateless olabilirler.

Statefull Sistem
Statefull sistemler genellikle belleklerinde tuttukları bilgiyi süzerek daha küçük listeler halinde karşı sisteme gönderirler. Liste gönderimi periyodik veya sorguya dayalı olabilir.

Stateless Sistem
Stateless sistemler belleklerinde bilgi tutmazlar. Gelen mesajı dönüştürerek bir kuyruğa atarlar. Kuyruğu okuyan bir başka thread ise diğer sisteme gönderir.


ICD Toplantıları
Toplantı öncesinde konuşulacak konular ve çözüm önerileri hazırlanırsa süreç hızlanır. Bir çok toplantı gündem ve çözüm önerisi hazırlanmadığı için faydasız hale geliyor.

Toplantılarda Toplantı Katılım Formu ve Toplantı tutanağı doldurulur.