9 Mart 2017 Perşembe

Stanag 4691 Duplicate Detection

Giriş
Multi-hop relay ve broadcast trafik'te duplicate detection uygulanır. Duplicate Detection işlev olarak Ethernet seviyesindeki Spanning Tree protokolüne benziyor.

Nasıl Yapılır
İki kısımdan oluşur

1. Kendi gönderdiğim trafiğin bana geri gelmesi. Bu trafiğin kesilmesi gerekir.
2. Source Address + PDU ID + Fragmentation Offset'e bakılarak paketin daha önce işlenip işlenmediğinin bulunması.

1. Source Detection
|<------------------------------------------->|
A (MPR)--> B (MPR)-->C(MPR)-->D

A'nin gönderdiği broadcast paket D'ye gitmesin. B paketi alır. MPR olduğu için C'ye gönderir. C paket alır MPR olduğu için D'ye gönderir. D paketi alırve tekrar gönderir. Burada A kendi gönderdiği paketi alır ve tekrar göndermemelidir.

2 Röle ve Yerel Detection
A -->B --> E
|      D --> G (sonradan gelir)
| --> C --> F
B paketi alır ve MPR olduğu için E ve D'ye gönderir.
 D broadcast paketi alır ve yerel olarak işler. Ancak MPR olmadığı için röle yapmaz. Daha sonra D MPR olur ve paket C'den tekrar gelir. Bu durumda Duplicate  Detection paketi daha önce geldi diye düşürmemeli. Röle yapmalı ama yerel işlememeli. Dolayısıyla röle ve yerel işleme için iki farklı Duplicate Detection veri yapısı kullanılabilir. 

7 Mart 2017 Salı

OpenCv HoughCircles

Giriş
Resimdeki daireleri bulmak için kullanılır. Bu metodun kardeşi HoughLines metodudur.

HoughCircles
Önce çıktıyı alacağımız bir vector tanımlarız. Şöyle yaparız.
vector<Vec3f> circles;
Şu kod Vec3f kullanılmadığı için yanlıştır.
cv::vector< cv::vector<int> > circles;
cv::HoughCircles(..., circles, ...);
Şöyle yaparız.
Parametreler şöyle
srs_gray : Birinci parametre girdi olan image,
circles : İkinci parametre x,y,z yani dairenin noktasal değerlerini saklayan vector,
detection method : Üçüncü parametre her zaman HOUGH_GRADIENT
dp : Dördüncü parametre inverse ratio or resolution. Ne olduğunu anlamadım. double tipindendir ve hep 1 değeri alıyor. Şöyle yaparız.
double dp = 1;
min_dist : Beşinci parametre bulunan daireler arasındaki asgari uzaklık
param_1 ve param_2 : Altı ve yedinci parametreler Canny Edge Detector için kullanılacak al ve üst eşik değerleri. double tipindendir. Varsayılan değerleri 100'dür.

min_radius ve max_radius : En son iki parametre bulunmasını istediğimiz dairenin min ve max radius değerleridir. int tipindendir. Varsayılan değerleri 0'dır. Eğer 0 verirsek her şeyi bulur.
HoughCircles(img, circles, HOUGH_GRADIENT, 1,
             max(img.cols,img.rows), // to find only the biggest perfect circle
             100, 100, 0,0 );
Resim üzerine işaretleme yapmak için şöyle yaparız.
//draw
for( size_t i = 0; i < circles.size(); i++ )
{
  Vec3i c = circles[i];
  cv::circle (img, Point(c[0], c[1]), c[2], Scalar(0,0,255), 3, LINE_AA);
  cv::circle (img, Point(c[0], c[1]), 2, Scalar(0,255,0), 3, LINE_AA);
}

6 Mart 2017 Pazartesi

Parasoft C/C++ Test Statik Analiz Notlarım

Parasoft C++ Test Nedir?
Parasoft'un C++test, Jtest gibi farklı dillere hitap eden araçları var.  C++ test için söyle bir tanım yapılmış.
C++ Test improves C++ developer and team productivity by automating a number of  high impact techniques for error prevention and detection at early stages of development process.
Parasoft Statik Analiz Notlarım
Aşağıda Parasoft'un statik analiz aracıyla ilgili notlarım var. Parasoft'un Metrics aracı da statik analizle ilgili. Ancak Metrics konusunu farklı bir yazıda ele almayı uygun gördüm. Konuyla ilgili Parasoft C/C++ Test Metrics başlıklı yazıya göz atabilirsiniz.

Kurulum - Parasoft ve Lisans Sunucusu (Network License)
Desktop Edition için iki versiyon var. Node-locked veya Floating. Node-locked pek kullanışlı değil.

1. Floating kurulumunda lisans sunucusunu tanıtmak için Parasoft/Preferences menüsü seçilir. License nesnesi tıklanır. Host name ve Port number alanları doldurulur.

2. Daha sonra Edition = Custom Edition seçilir, tüm checkbox'lar tıklanır. Bu adımı yapmadan çalıştırmayı başaramadım. Niçin seçmek gerekiyor emin değilim.

3. Parasoft/Licenses/Deactivate C++ Test ve Parasoft/Licenses/Activate C++ Test menüleri ile lisans alınıp geri verilebilir.

Eğer lisansımız "Command Line Feature" özelliğini sağlamıyorsa, komut satırından kullanmaya çalışırsak "Command Line Feature is not licensed" mesajını alırız.

Builtin Configuration
Parasoft ile hazır bir sürü konfigürasyon geliyor. Bunlar Builtin ağacı altında görülebilirler.

Kendi Konfigürasyonumuzun Ayarlanması
Visual Studio içinden Parasoft/Test Configurations menüsü seçilir. Builtin ağacı altındaki bir hazır kural kataloğuna sağ tıklanarak "Duplicate" menüsü seçilir ve üzerinden deneme yapacağımız bir konfigürasyon yaratılır.

Statik Analiz Nedir?
Statik Analiz, derleyicinin yapmadığı derinlikte analiz yaptığı için gerekli bir faaliyet. Statik Analiz yazılımın sağlamlığını (robustness) ispatlamaz. Sağlamlık sadece test ile ispatlanabilir.

Statik analiz C++'ta 1000 satırda 100-130 arası bulgu veriyor.

Eğer Parasoft pahalı geliyorsa, Visual Studio 2012'de gelen araçlar da kısıtlı statik analiz imkanı sunuyor.  

Statik analiz her derlemede (Projeye sağ tıkla Properties menüsünden etkinleştir) yapılabileceği gibi bir seferlik te (Build > Run Code Analysis menüsü) yapılabilir. 

Ayrıca statik analiz tüm çözüme yapılabileceği gibi sadece seçilmiş projelere de yapılabilir. Statik kod analizi için verilen kural seti fazla değil . En işe yarayanı Microsoft Native Recommended Rules. O da çok fazla şey bulmuyor ancak hiç yoktan iyidir.

Parasoft'u kullanmadan önce derleyicinin ürettiği tüm uyarıların (warning) temizlendiğinden emin olunmalı.

Statik Analiz Çeşitleri
1. Pattern Based : Rule Editor ile girilen kurallara dayanarak belli örüntüleri yakalamaya çalışır. Rules Tree sekmesi altında kurallar görülebilir.
2. Flow Based : Uygulamayı çalıştırmadan, çalışıyormuşçasına üzerinden geçerek hataları bulmaya çalışır. Parasoft'taki BugDetective aracı bu işe yarıyor. BugDetective'de Terminators sekmesinde "terminating functions" tanımlanabilir. 

Screenshot of the window

Kendi Konfigürasyonumuz İçin Static Kod Analizinin Ayarlanması

Statik analizin ne olduğunu öğrendikten sonra kendi konfigürasyonumuz için nasıl static kod analizi yapacağımıza bakalım. 

Öncelikle Static sekmesi seçilerek, Rules Tree sekmesinden tanımlı kurallardan işimize yarayanlar etkinleştirilir. Örneğin MISRA, JSF büyük olanlar arasında. Bunlar arasında "Find Duplicated Code" çok faydalı.

Çalışmayı kolaylaştırmak için sağdaki "Hide Disabled" düğmesi tıklanabilir. Maalesef gizleme işlemi bir seferlik. Ekranı yeniden açınca tekrar herşey görünür hale geliyor.

Statik Analiz Sonuçları
Analiz sonuçları Show / Details altındaki Quality Tasks penceresinde kurallara göre gruplanmış olarak görülebilir.

Kod İçinde Supress
Eğer kod içinde bazı satırlar için supress etmek istersek satıra
/* parasoft-suppress ...*/ yazılır.

Konfigürasyon Export/Import İşlemi
Herhangi bir konfigürasyon nesnesine sağ tıklanarak kuralları Export etme imkanı var.

Komut Satırından Çalıştırmak
cpptestcli -solution My.sln -config "user://MyConfig" -report filename.xml

Bu komut sonucunda xml dışında iki html daha üretiliyor. parasoft.html özet bir tablo. parasoft_dev.html ise kaynak kod dosyalarındaki hataları gösterir.

GUI'den başlatmak
Eğer sadece belli bir kod parçası için statik analiz çalıştırılmak istenirse, Solution Explorer'a sağ tıklanır. Açılan menüden Parasoft/Test Using / User Defined / "Example Configuration" seçilir.  Veya Built-in konfigürasyonlarda birisi de seçilebilir. Ancak MISRA gibi konfigürasyonlar çok ağır olabiliyorlar.

Zor MISRA Kuralları
MISRA yazısına taşıdım

OpenCV FaceRecognizer Arayüzü

Constructor
Şöyle yaparız.
Ptr<FaceRecognizer> model = createEigenFaceRecognizer();
predict metodu
Şöyle yaparız.
Mat img = imread("...");

int prediction = model->predict(img);
train metodu
Şöyle yaparız.
std::vector<Mat> images = ...;
std::vector<int> labels = ...;

model->train(images, labels);

OpenCV Point Sınıfı

Point Sınıfı
x ve y Alanları
Elimizde bir nokta olsun.
cv::Point2d pt = ...
Şöyle yaparız.
pt1.x, pt1.y
Constructor - column + row
Şöyle yaparız
mat.at<type>(cv::Point(x,y))
cv::norm
İki nokta arasındaki mesafeyi bulmak için şöyle yaparız.
double EuclideanDistance(const cv::Point2d &pt1, const cv::Point2d &pt2)
{
  return cv::norm(pt1-pt2,cv::NORM_L2);
}

2 Mart 2017 Perşembe

OpenCV Scalar Sınıfı

Giriş
Açıklaması şöyle
Scalar is a 4 dimensional vector with template type.
Constructor - 1 boyut
Şöyle yaparız.
cv::Scalar clr = cv::Scalar(1);
Constructor - 3 boyut
Şöyle yaparız.
cv::Scalar clr = cv::Scalar(0, 0, 0);
Constructor - 4 boyut
Şöyle yaparız.
cv::Scalar(1,1,1,1)

28 Şubat 2017 Salı

Gömülü Proje - Hash

Giriş
Bu hash fonksiyonları kriptografik değildir! Dolasıyıla avalance effect göstermelerini beklememek gerekir.

DJB2, DJB2a, FNV-1,FNV-1a, Murmur2, MurmurHash3 gibi bir çok popüler hash fonksiyonu mevcut.

FNV1
FNV1 ve FNV1-a kodlaması çok basit hash metodları. 
FNV1-a aşağıdaki gibi. FNV1 ile tek farkı xor işleminin prime ile çarpılmasından önce yapılması.
hash = FNV_offset_basis
for each octetOfData to be hashed
    hash = hash xor octetOfData
    hash = hash * FNV_prime
return hash
FNV1 ve FNV1-a için sabitler aşağıda.
Hash Size    Prime                       Offset
===========  =========================== =================================
32-bit       16777619                    2166136261
64-bit       1099511628211               14695981039346656037
Murmur3
Şöyle yaparız.
uint64_t MurmurHash3Mixer( uint64_t key ) { 
  key ^= (key >> 33);
  key *= 0xff51afd7ed558ccd;
  key ^= (key >> 33);
  key *= 0xc4ceb9fe1a85ec53;
  key ^= (key >> 33);

  return key;
}