30 Eylül 2014 Salı

Disposable

Garbage Collector Tarafından Çağırılan Metodlar
Bir nesne yok edilirken Java'da finalize(), C#'ta ise Dispose() metodu çağırılıyor. Bu metodların içinde unmanaged resource'lar varsa onları serbest bırakmak mümkün.


Finalize veya IDisposable Arayüzleri
C# 
IDisposable arayüzünden kalıtmak gerekir.
Not : C#'ta Finalize metodu da var. Ancak bu metodu kullanmamak gerekir.

Implement IDisposable only if you are using unmanaged resources directly. If your app simply uses an object that implements IDisposable, don't provide an IDisposable implementation.

Örnek:
public class MyClass : IDisposable {
  
    public virtual void Dispose() {
        ...
    }
}
Eğer birden çok resource bırakılacaksa generic bir Dispose metodu da kullanılabilir.
private static void Dispose<T>(ref T obj) where T : class, IDisposable {
    if(obj != null) {
        try { obj.Dispose(); } catch {}
        obj = null;
    }
}

public virtual void Dispose() {
    Dispose(ref stream);
    Dispose(ref log);
}


Finalize veya Dispose İşleminin Hemen Çağırılması
C#
using ifadesi içine bir veya daha çok sınıf verilerek kod bloğundan çıkınca kaynakların hemen bırakılması sağlanabilir. Örnek:
using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}


Java'da şu anda using benzeri bir kullanım yok ancak Java 7'de buradaki gibi olacak.

Java Closeable Arayüzü
Java'da C#'taki gibi using kullanımı yok ancak bazı sınıflar için özel bir arayüz geliştirilmiş.
Özellikle stream sınıfları Closeable arayüzünden türüyorlar. Bu arayüz ile finalize metodunun çalıştırılmasını beklemeden stream kapatılabiliyor ve kaynaklar serbest kalabiliyor. Closeable arayüzü close() metodunda IOException attığı için daha çok stream'ler için düşünülmüş. Örneğin ResultSet  veya socket sınıfları close() metodları olmasına rağmen bu arayüzü kullanmıyorlar.


25 Eylül 2014 Perşembe

Posix Standart Streamleri

Posix Standart Streamleri

Posix standard streamleri çalıştırılan her programı geçilen 3 tane stream file descriptor'dır.

Unix ile ortaya çıkan bu yapı Windows üzerinde de aynen kullanılmaktadır. Programlama dilleri ile posix standard streamleri arasındaki farkı NonBuffered ve Buffered I/O başlıklı yazıdan görebilirsiniz.

 

Aşağıdaki standart stream'ler ile çalışmak için kullanılan bazı sistem çağrıları var.

isatty
Unix'te programlar stdout gerçek bir tty mi yoksa pipe ile başka bir programamı yönlendirilmiş diye anlamak isteyebilirler. Böylece davranışını farklılaştırabilirler. Örneğin ls sadece "ls" şeklinde seçeneksiz kullanılırsa ve stdout tty ise çıktı olarak bir satıra birden çok dosya ismini yazar (many per line). Eğer stdout bir başka program ise çıktısını satır satır (one per line ) gönderir.
if (isatty (STDOUT_FILENO))
{
  format = many_per_line;
}
else
{
  format = one_per_line;
} 


perror
perror sistemdeki hataları stderror akımına yazdırmak için kullanılıyor. Örnek :
int fd = open(filename, O_APPEND|O_WRONLY, S_IWUSR);
if(-1 == fd)
{
    perror( filename )
}
Aslında perror tam olarak aşağıdaki gibi çalışıyor.
fprint( stderr, "error: %s\n", strerror( errno ) );

strerror
strerror ise sistemdeki hataları string olarak döndürüyor. strerror GNU libc içinde statik bir buffer kullanıyor. Dolayısıyla thread-safe değil. Thread-safe işlemler için strerror_r kullanılabilir. Bu metod errno isimli global bir değişkeni kullanıyor. Bu değişken aslında thread-local bir değişken.

getpass
getpass.c dosyasına bakınca stdin bir dosyaya yönlendirilmiş olsa bile /dev/tty'den halen okuma/yazma yapabildiğimizi görebiliyoruz.



24 Eylül 2014 Çarşamba

MIL-STD- 498 SQAP

Software Quality Assurance Plan
Software Quality Assurance Plan'in (SQAP) Türkçesi Yazılım Kalite Güvence Planı.

İçerğinde kalite güvence faaliyetlerinde kullanılacak checklistleri (kontrol listesi) barındırır veya bu listelere atıfta bulunur.



14 Eylül 2014 Pazar

VectorCast

Giriş
VectorCast firmasının VectorCover aracı ile coverage alma hakkında notlarım aşağıda. DO-178B süreciden SCA için kullanılıyor.

Working Directory
Working directory'de CCAST_.CFG dosyası bulunur. Bu dosya Tools > Options menüsü ile girilen seçenekleri saklar.

VectorCast eğer working directory isminde boşluk varsa çalışmıyor. File > Set Working Directory ile yeni bir çalışma alanı tanımlamak gerekebilir. Ayrıca Tools > Options menüsü ile GUI sekmesine gelip "Remember last working directory" seçeneğini kullanarak bu dizinin hatırlanması sağlanır.

Environment
Visual Studio terminolojisi ile açıklamak gerekirse CCAST_.CFG solution dosyası environmentismi.vcp ise  proje dosyası olarak düşünülebilir. vcp dosyasında instrument edilecek dosyaların bilgileri bulunur.

Preprocessor
Preprocessing işlemi şu yüzden yapılıyor.
"Instrumenter rely on source being preprocessed so that all macros and expanded and conditional compilation sections are resolved. Preprocessed source code can be created by running the compiler with the correct flags."

Windows Ortamı İçin Debug veya Release Seçilmesi
Tools > Options Preprocessor/Compiler sekmesinde "Defined Variables" alanına _DEBUG yazılmalı

Windows Ortamı İçin C Runtime Seçilmesi
1. Multi Threaded Debug -> Debug için /Mtd /D "_DEBUG"
                                         -> Release için /Mtd

2. Multi Threaded Debug DLL -> Debug için /MDd /D "_DEBUG"
                                                  -> Release için /MDd



Instrumented Kod Örnekleri
MyClass.cpp dosyasında
extern char vcast_unit_stmt_bytes_1 [];

MyClass::MyClass () {
 VCAST_STATEMENT_INSTRUMENTATION_POINT_REALTIME (vcast_unit_stmt_bytes_1,1,0); //1. unit 0. statement

}

vcast_c_options.h dosyasında
char vcast_unit_stmt_bytes_1 [2] = {0};

Üretilen Kod
c_cover_io.cpp, vcast_c_options.h ve c_cover.h projeye dahil edilmeli.

Eğer kapsama sonucu dosyaya yazılacaksa, dosyayı oluşturan kod
void vCAST_CREATE_INST_FILE (void) imzasına sahip.


Parasoft Rule Wizard

Giriş
Statik Analiz yaparken hazır gelen kuralların dışına çıkmak gerektiğinde Parasoft Rule Wizard'ı kullanıyoruz. Bu uygulama görsel olarak kuralı tasarlayabilmemizi sağlıyor.

Görsel Kural
Kural şu kutucuklardan oluşuyor.
Parent Node: İçi beyaz kutu. Kuralın ana giriş noktası
Qualifications : Başlığı sarı renk olan ve ana kuralı detaylandıran kutucuklar. Örnek:

Doğru Ana Kuralı Bulmak
Yeni bir kural için doğru ana kuralı bulmak aşılması gereken ilk engel. Mantıksa olarak gruplama yapılmış. Her ağacı açınca altında başka dallar karşımıza çıkıyor. Biraz deneme yanılma yapmak gerekebilir.


Kural Kaydetmek
Yaratılan kurala isim verirken Rule Editor'de boş bir alana sağ tıklayoruz.

Properties Sekmesi
Bu sekmede aşağıdaki alanları dolduruyoruz.

Rule ID : Format anladığım kadarıyla boşluk içermeyecek şekilde Projesi İsmi + tire + Numara şeklinde olmalı. Örneğin MyProject-21 gibi.
Header : Kuralın kısa açıklaması
Author : Kuralı yaratan kişi
Severity : Lowest/Low/Medium/High/Highest seçeneklerinden birisi
Programlama Dili : C,C++ checkboxlarından birisini de seçmek gerekir.

Description Sekmesi
Kuralın daha uzun açıklamasını buraya giriyoruz.

Kuralı Rule Tree'ye Dahil Etmek
Rule Tree içinde kendimize ait bir kategory oluşturmak iyi bir fikir. Bunun için "Edit Rulemap" düğmesine tıklayarak açılan pencerede Categories sekmesine gidiyoruz.
Category Id : Rule ID ile aynı kelimeyi kullanıyoruz. Örneğin MyProject
Category Description : Ağaçta gürünen isim. Büyük harf olarak girilmesi daha iyi. Örneğin MYDESC
Kural dosyası import edilince ağaçta  görünüm aşağıdaki gibi olur

MYDESC [MyProject] - (0/1 enabled)
  Kuralın kısa açıklaması [Kural numarası]

Eğer kural dosyasını Parasoft'un kurulum dizinine yerleştirirsek zaten otomatik olarak tanıyor. Örneğin
C:\Users\myuser\AppData\Local\Xtest\plugins.vs\com.parasoft.xtest.standars.vstudio.core.cpp\urules
dizini

Kendi Yazdığım Bazı Kural Örnekleri

Herhangi bir token'ın const_cast ve dynamic_cast olmasını yakalama kuralı.

{ Token | and }-> { Name | cons_cast | dynamic_cast }

Member methodlar'ın inline olmaması kuralı

{Member Function | and } -> {IsDecl | True}
                                                {IsInline | True}

Bu kuralda IsImplementation yerine IsDecl kullanılıyor. Böylece .h dosyasında kod olmaması sağlanır.



6 Eylül 2014 Cumartesi

Rastgelelik Nedir?

Rastgelelik ile genellikle tek düze (uniform) dağılım arzu edilir.
Uniform dağılım aşağıdaki şekle benzer.
Histogram of Random()

Rastgele Sayısı Bir Sabit ile Çarpmak
Bu işlem tek düze dağılımı bozmaz! 2 * Random () yine tek düze dağılım verir.
Histogram of 2 * Random()


5 Eylül 2014 Cuma

Move Semantics

Move Semantics
Move semantics ile ilgili bilgilendirici bir yazı burada.

Move Constructor
Move constructor aşağıdaki gibi tanımlanır.
A(A&& other)
: _x(std::move(other._x))
{}
std::move  kullanılmazsa aşağıdaki kod copy constructor'ı çağırır.
int main()
{
  A a;
  A b = a;
  b.foo();
}
Move Constructor'ın çağırılması için std::move() metodunu kullanmak gerekir.

#include <utility>
int main()
{
  A a("a");
  A b = std::move(a);
  b.foo();
}
Move Constructor ve RValue
RValue'lar için önce  Move Constructor uygulanmaya çalışılır. Eğe tanımlı değilse Copy Constructor uygulanır.
Örnek:
NonMove foo() {
  return NonMove();
}

Pass By Value and Move Construct
Burada pass by value ve move construct işleminin primitif tipler için daha hızlı olduğu açıklanmış.
class A
{
  A(std::string str) : mStr(std::move(str)) {}
  std::string mStr;  
}

Lokal Değişkenin Move Edilmesi
Lokal değişkenler copy constructor çağırılmadan geçilmek istenirse aşağıdaki gibi yapılabilir. Böylece lvalue değişkenler rvalue haline getirilir.

object3 a(x);
object2 b(std::move(a));
object1 c(std::move(b));
return c;