27 Aralık 2018 Perşembe

High Level Architecture - HLA

Giriş
Simülasyon dünyasında kullanılan arakatman. 1998 yılında DoD standardı haline geldi. 2000 yılında IEEE (IEEE Std 1516 veya HLA1516 olarak anılıyor) standardı haline geldi.

Ayrıca  "Stanag 4603" ile NATO standardı oldu.

Atası
HLA'nın atası Distributed Interactive Simulation (DIS)

RTI
Run Time Infrastructure anlamına gelir. Türkçesi Çalışma Zamanı Altyapısı. HLA mimarisindeki merkezi sunucudur. Servis sağlayıcı olarak düşünülebilir.

Pitch RTI, MÄK RTI gibi paralı  ve Portico, OpenRTI, Open HLA gibi açık kaynak RTI gerçekleştirimleri vardır.

Windows'ta Pitch RTI servisini kontrol etmek için şu komutlar kullanılır.
sc \\servername start prti1515
sc \\servername stop prti1515
sc \\servername query prti1515

Federation
Bir ismi olan ve Federate'lerin (federasyonun üyesi) çalıştığı simülasyon ortamı. Federate örneğin bir platformu temsil edebilir.

Federasyonun Kurulması ve Başlaması
Federasyonu oluşturan bir federe bulunur. Her federe simülasyon açılırken bazı safhalardan geçer.
Bunlar
1. Açılma - Initialization
2. Koşma - Run
3. Bitiş - End
olabilir.
İlgili safha geçişlerini duyuran bir federe olabilir.

Servisler
Şunlar bulunur
1. Federation Management
2. Declaration Management
3. Object Management
4. Data Distribution Management
5. Ownership Management
  Attrbiute sahipliğini değiştirebilmek hakkı anlamına gelir.
6. Time Management
  2 tip mesaj sırası vardır. Reception Order FIFO gibi çalışır. TSO ise heap gibi çalışır.

Federation Object Model
Federation Object Model (FOM) yazısına taşıdım.

Object Class
Object kalıcı veri tipini temsil eder. Her sınıfın (class) bir sahibi bulunur. Sadece sınıfı yaratan federate bu sınıfın nesnelerini (instance) yaratabilir ve silebilir. Class içinde alanlara "attribute" denilir.

Object'ler arasında kalıtım olabilir. HLAobjectRoot tüm object'lerin atasıdır.

Her alanın da sahibi vardır. Bir nesnenin farklı alanlarının farklı sahipleri olabilir. Sahiplik federasyon üyeleri arasında değişebilir. Alanı sanırım sadece sahip günceller.

Interaction Class
Anlık veri tipini temsil eder. İsmi interaction yerine event olabilirdi. Tek seferlik olayları temsil eder. Örneğin bir patlama olması interaction'dır. Interaction içindeki alanlara attribute yerine "parameter" denilir. HLAinteractionRoot tüm interaction'ların atasıdır. Interaction'da içinde zaman etiketi (time tag) bilgisi bulunur.

Attribute Tag
Şu alanlar mutlaka olmalı
1. name
2. transportation
3. order
4. dimensions

Performans
İlgi duyulan attribute ve DDM (İlgi gruplarına) abone olmak gerekir.

Handle
RTI tarafından verilen numara gibi düşünülebilir.

Zaman - TimeConstrained
Açıklaması şöyle.
A TimeConstrained federate cannot advance its internal time until RTI allows it. This is used for simulators that should advance time almost simulataneously
FederateAmbassador Arayüzü
FederateAmbassador Arayüzü yazısına taşıdım.

NullAmbassador Sınıfı
FederarateAmbassador arayüzünden kalıtır. Override edilmesi gereken metodları boş olarak sağlar. Kendi sınıfım bu sınıftan kalıtır.

RTIambassador Arayüzü
RTIambassador Arayüzü yazısına taşıdım.

LogicalTime Arayüzü
LogicalTime Arayüzü yazısına taşıdım.

LogicalTimeFactory Arayüzü
LogicalTimeFactory Arayüzü yazısına taşıdım.

LogicalTimeFactoryFactory Sınıfı
getLogicalTimeFactory metodu
Şöyle yaparız.
HLAfloat64TimeFactory timeFactory = 
  (HLAfloat64TimeFactory)LogicalTimeFactoryFactory.getLogicalTimeFactory("HLAfloat64Time")



Neighbor Discovery Protocol - NDP

Giriş
Neighbor Discovery Protocol (NDP) IPv6 ile geliyor. RFC 4861 ile tanımlı. ARP ve daha başka protokollerin (örneğin Duplicate Address Detection) birleştirilmiş hali gibi düşünülebilir. Açıklaması şöyle
The Neighbor Discovery Protocol (NDP, ND) is a protocol in the Internet protocol suite used with Internet Protocol Version 6 (IPv6). It operates at the Link Layer of the Internet model (RFC 1122), and is responsible for gathering various information required for internet communication, including the configuration of local connections and the domain name servers and gateways used to communicate with more distant systems. 
Bu protokol için neden komşu ismi seçilmiş bilmiyorum. Bence yanlış isimlendirme olmuş.
NDP güvenli olmak için ilave işler de yapıyor. NDP iletişim için ICMPv6 kullanıyor.

Neighbor Cache
Açıklaması şöyle
IPv6 doesn't use ARP, so there isn't an ARP cache. IPv6 uses ND, and a host maintains a Neighbor Cache and a Destination Cache, among others.

ICMP Mesajı
ICMP mesajının yapısı şöyle.
struct icmpv6header {
  unsigned char type;
  unsigned char code;
  unsigned short int chk_sum;
  unsigned int body; 
};
body alanı çeşitli yapılar olabilir. Yapının ne olduğu type alanına göre belirlenir.
type alanının sahip olabileceği bazı değerler şöyle
ND_ROUTER_SOLICIT = 133
ND_ROUTER_ADVERT = 134
ND_NEIGHBOR_SOLICIT = 135
ND_NEIGHBOR_ADVERT = 136
ND_NEIGHBOR_REDIRECT = 137
Neighbor Solicitation ICMP Message Nedir
Solicitation talep, istek anlamına gelir. Sorgu yapmak isteyen "Neighbor Solicitation ICMP Message" mesajını Solicated Node Multicast grubuna gönderir. Böylece sadece gruptaki bilgisayarlar tetiklenir. ARP'taki gibi tüm bilgisayarlar dürtülmez.Cevap veren ise "Neighbor Advertisement ICMP message" ile cevap verir.

"Target Address" alanına sorgulanmak istenen IPv6 numarası yazılır.
ICMPv6 Option altındaki "Link-layer address" alanında ise kendi MAC adresim yazılıdır.

Neighbor Solicitation ICMP mesajı "link-local multicast" olarak gönderilir. Açıklaması şöyle
The NDP provides two message types that are of interest here: Neighbor Solicitation and Neighbor Advertisement. A node that wants to learn a link-layer address for a particular IP address sends a Neighbor Solicitation to the link-local solicited-node multicast address - there is no broadcast for IPv6 any more.

For example, if the address in question is 2001:db8::0011:2233:4455:6677, then the solicited-node multicast address is ff02::1:ff55:6677, and the ethernet multicast address is 33:33:ff:55:66:77. All nodes with an address ending on *55:6677 belong to that multicast group and will listen to that - this is most likely only the target system itself. The Neighbor Solicitation contains also the unicast IPv6 addresses and the MAC address of the soliciting system.

On receipt, the target node answers with its Neighbor Advertisement, which is sent to the unicast address (link layer and IPv6) of the soliciting node. Thus, the soliciting node learns the MAC-address of the target node.
Router Solicitation ICMP Mesajı Nedir
Bir bilgisayar router'ı bulmak için "Router Solicitation" (RA) mesajı gönderir. Router ise "Router Advertisement" (RA) mesajı ile cevap verir.


Solicited Node Multicast Nedir
IPv6'da broadcast olmadığı için mesajlar multicast olarak gönderilir. Her bilgisayar bir "Solicited Node multicast" grubuna katılır. Açıklaması şöyle
Each IPv6 interface must subscribe to a solicited-node multicast address for each IPv6 unicast or anycast address configured on the interface. These solicited-node multicast addresses are based on the IPv6 unicast or anycast addresses, so, in all likelihood, the resolution request only interrupts the one host with that IPv6 address, or possibly a very few hosts. This is a better solution than ARP.
RFC 4861, Neighbor Discovery for IP version 6 (IPv6)'deki açıklama şöyle
Nodes accomplish address resolution by multicasting a Neighbor Solicitation that asks the target node to return its link-layer address. Neighbor Solicitation messages are multicast to the solicited-node multicast address of the target address. The target returns its link-layer address in a unicast Neighbor Advertisement message. A single request-response pair of packets is sufficient for both the initiator and the target to resolve each other's link-layer addresses; the initiator includes its link-layer address in the Neighbor Solicitation.
Solicited Node Multicast Adresi Nasıl Oluşturulur
IPv6 adresinin son 24 biti kullanılarak oluşturulur. Bir ethernet arayüzü birden fazla IPv6 adresi alabildiği için birden fazla gruba katılım olabilir. RFC 4291, IP Version 6 Addressing Architecture, Section 2.7.1. Pre-Defined Multicast Addresses'deki açıklama şöyle
Solicited-Node multicast address are computed as a function of a node's unicast and anycast addresses. A Solicited-Node multicast address is formed by taking the low-order 24 bits of an address (unicast or anycast) and appending those bits to the prefix FF02:0:0:0:0:1:FF00::/104 resulting in a multicast address in the range
FF02:0:0:0:0:1:FF00:0000
to
FF02:0:0:0:0:1:FFFF:FFFF
For example, the Solicited-Node multicast address corresponding to the IPv6 address 4037::01:800:200E:8C6C is FF02::1:FF0E:8C6C. IPv6 addresses that differ only in the high-order bits (e.g., due to multiple high-order prefixes associated with different aggregations) will map to the same Solicited-Node address, thereby reducing the number of multicast addresses a node must join.
A node is required to compute and join (on the appropriate interface) the associated Solicited-Node multicast addresses for all unicast and anycast addresses that have been configured for the node's interfaces (manually or automatically).
Ethernet Packeti
Açıklaması şöyle
To create an IPv6 layer-2 multicast address from an IPv6 layer-3 multicast address you simply use 33-33 and append the last 32-bits of the IPv6 layer-3 multicast address. This gives you a lot more layer-2 multicast addresses than IPv4 has because IPv4 only uses 23 bits of the layer-3 multicast address in the layer-2 multicast address.
RFC 2464, Transmission of IPv6 Packets over Ethernet Networks'deki açıklaması şöyle
  1. Address Mapping -- Multicast
An IPv6 packet with a multicast destination address DST, consisting of the sixteen octets DST1through DST[16], is transmitted to the Ethernet multicast address whose first two octets are the value 3333 hexadecimal and whose last four octets are the last four octets of DST.
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
              |0 0 1 1 0 0 1 1|0 0 1 1 0 0 1 1|
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
              |   DST[13]     |   DST[14]     |
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
              |   DST[15]     |   DST[16]     |
              +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
RFC 7042, IANA Considerations and IETF Protocol and Documentation Usage for IEEE 802 Parameters, Section 2.3.1. Identifiers Prefixed "33-33" yazısında açıklaması şöyle
2.3.1. Identifiers Prefixed "33-33"
All MAC-48 multicast identifiers prefixed "33-33" (that is, the 2**32 multicast MAC identifiers in the range from 33-33-00-00-00-00 to 33-33-FF-FF-FF-FF) are used as specified in [RFC2464] for IPv6 multicast. In all of these identifiers, the Group bit (the bottom bit of the first octet) is on, as is required to work properly with existing hardware as a multicast identifier. They also have the Local bit on and are used for this purpose in IPv6 networks.
(Historical note: It was the custom during IPv6 design to use "3" for unknown or example values, and 3333 Coyote Hill Road, Palo Alto, California, is the address of PARC (Palo Alto Research Center, formerly "Xerox PARC"). Ethernet was originally specified by the Digital Equipment Corporation, Intel Corporation, and Xerox Corporation. The pre-IEEE [802.3] Ethernet protocol has sometimes been known as "DIX" Ethernet from the first letters of the names of these companies.)
Cisco
Cisco cihazlarda IPv6 Discovery Cache tablosunu görmek için şöyle yaparız.
show ipv6 neighbors
IPv6 Address                              Age Link-layer Addr State Interface
FE80::222:8303:4977:5A95                    0 0022.8377.5a95  REACH Gi0/0/1.841
Duplicate Address Detection
Açıklaması şöyle
When a interface takes an IPv6 address it does the DAD mechanism. A NS will be sent to the multicast address "solicited node multicast group address". If there is another interface in this multicast group it won't take this address.
Açıklaması şöyle
Neighbor Solicitation and Advertisement messages are also used for Duplicate Address Detection as specified by [ADDRCONF]. In particular, Duplicate Address Detection sends Neighbor Solicitation messages with an unspecified source address targeting its own "tentative" address. Such messages trigger nodes already using the address to respond with a multicast Neighbor Advertisement indicating that the address is in use.

26 Aralık 2018 Çarşamba

Interchangeable Virtual Instruments Drivers - IVI

Giriş
IVI sürücülerincen önce 1990'larda Standard Commands for Programmable Instrumentation (SCPI) vardı. SCPI ASCII tabanlı metin komutlardı.

1993 yılında VXIplug&playSystemsAlliance ortaya çıktı ve API tabanlı sürücü arayüzleri sağlamaya başladı. Bu kullanım ASCII tabanlı metin komutlardan daha kolay olmasına rağmen standart haline gelemedi.

Bu sorundan kurtulmak için 1998 yılında Interchangeable ckuruldu.

IVI Class Compliant Drivers
Açıklaması şöyle.
IVI Class Compliant drivers usually also include numerous functions that are beyond the scope of the class definition. This may be because the capability is not common to all instruments of the class or because the instrument offers some control that is more refined than what the class defines
Liste şöyle
Class IVI Driver
Digital multimeter (DMM) IviDmm
Oscilloscope IviScope
Arbitrary waveform/function generator IviFgen
DCpowersupply IviDCPwr
AC power supply IviACPwr
Switch IviSwtch
Power meter IviPwrMeter
Spectrum analyzer IviSpecAn
RFsignalgenerator IviRFSigGen
Upconverter IviUpconverter
Downconverter IviDownconverter
Digitizer IviDigitizer
Counter/timer IviCounter

IVI Custom Drivers
Açıklaması şöyle.
IVI also defines custom drivers. Custom drivers are used forinstruments that are
not members of a class. For example, there is not a class definition for network
analyzers, so a networkanalyzer driver must be a custom driver. Custom drivers
provide the same consistency and benefits described below for an IVI driver,
except interchangeability.
IVI sürücüleri 2 türlü API destekler
- IVI-C veya
-  IVI-COM

Shared Components
Tüm sürücülerin kullandığı ortak işlevi içerir. IVIShared Components IVI sürücüsünden önce kurulmalıdır. İndirme sayfasına gitmek için tıklayınız.

- 32 bit sistemler için IviSharedComponents_260.exe,
- 64 bit sistemler için IviSharedComponents64_260.exe

kurulur

VISA Shared Components
VISA sürücüleri, IVI sürücülerinin alt katmanıdır ve üretici (vendor)'ın sağladığı kurulum ile gelir.

Visual C++

COM Driver için

Include Path
Include path'e iki satır eklenir

1. include path'e şu satırı dahil ederiz.
-32 bit sistemler için “C:\Program Files\IVI Foundation\IVI\Bin”
-64 bit sistemler için “C:\Program Files (x86)\IVI Foundation\IVI\Bin”

2. VISA DLL'i göstermek için include path'e şu satırı dahil ederiz.
-“$(VXIPNPPATH)VisaCom”


Gerekli Kütüphane
Üreticinin verdiği kütüphane ile linklenir. Örneğin Ag34401.lib

DLL'leri dahil etmek için şu satırı dahil ederiz. no_namespace kullanarak sürücünün API'sine global namespace içinden de erişebiliriz.
#import <IviDriverTypeLib.dll> no_namespace
#import <IviDmmTypeLib.dll> no_namespace
#import <GlobMgr.dll> no_namespace
#import <Ag34401.dll> no_namespace








Git checkout seçeneği - Switch To Another Branch - Yerel Depo'da Farklı Bir Dala Geçer

Giriş
Söz dizimi şöyle
git checkout <branch>
Açıklaması şöyle
Switch to a branch and update working directory
Yerel depodaki farklı bir dala geçmek için kullanılır. svn'den gelenler için bu komut kafa karıştırıcı çünkü svn'deki checkout komutundan farklı bir anlama geliyor.

Örnek
IntelliJ'de yerel depo'da yeni bir branch yaratıp bunu, IntelliJ ile push'ladıktan sonra yerel dalları silmek için şöyle yaparız.
$ git -C "path" checkout -b "$new_branch_name"
#Push yap. Sonra develoment'a geri geç, ve yeni dalları sil
git -C "$path" checkout development
git -C "$path" branch -d "$new_branch_name"
Örnek
Şöyle yaparız.
$ git checkout master
Switched to branch 'master'
Örnek
development branch yaratmak için şöyle yaparız.
git checkout development

git push origin development
Örnek
Şöyle yaparız.
> git checkout .
# checks out current directory
> git checkout ..
# Checks out parent directory, if in repository.
-b seçeneği
Yeni branch oluşturur. Önce yeni branch ismi daha sonra mevcut branch ismi yazılır

Örnek
c'den mynewbranch isimli yeni bir branch yaratmak istersek şöyle yaparız.
$ git checkout -b mynewbranch c
Örnek
Şöyle yaparız.
$ git checkout -b br1
Switched to a new branch 'br1'
Örnek
Açıklaması şöyle
Check out the files from the revision you want without checking out the revision itself
Şöyle yaparız.
git checkout some-other-commit -- .
--recurse-submodules seçeneği
Örnek
Şöyle yaparız.
git checkout --recurse-submodules tags/boost-1.65.1

21 Aralık 2018 Cuma

ISTQB Chapter 4 - Test Design Techniques

Giriş
International Software Testing Qualifications Board (ISTQB) Chapter 4 - Test Design Techniques ile ilgili notlarım şöyle.

Bir önceki bölümün ismi Static Techniques. Bu bölümün de ismi "Dynamic Techniques" olmalıydı.

Test Condition
Test koşulu olarak çevrilse de aslında "test edilen şey" diye düşünmek daha iyi. Test condition'ı test etmek için birden çok "test case" geliştirilebilir.

Test Case
Test durumunda girdi ve beklenen sonuçlar (expected result) belirtilir. Testin detaylı adımları yoktur. Daha çok özet gibidir.

Test Procedure
Test adımlarının detaylı belirtimidir.
Not : İlginç olan şey ISQB'nin Test Case ve Test Procedure diye iki ayrı başlık altında sunduğu şey, bir çok şirket tarafından tek bir dokümanda hallediliyor. Şimdiye kadar hiçbir şirkette "Test Case" ve "Test Procedure" diye iki farklı dokümanın hazırlandığını görmedim.

Sıra sanırım şöyle
Test Condition -> Test Case (Expected Results) -> Prioritize Test Cases -> Test Procedure

Test Design Techniques
Test tasarım teknikleri Static ve Dynamic olarak 2 ana gruba ayrılır. Statik teknikler Chapter 3 - Static Techniques'te anlatılıyor. Bu Chapter'da Dinamik Test Teknikleri anlatılıyor.

Dynamic Test Teknikleri
Test tekniklerinin farkını anlatan genel bir açıklama şöyle.
black-box tester is unaware of the internal structure of the application to be tested, while a white-box tester has access to the internal structure of the application. A gray-box tester partially knows the internal structure, which includes access to the documentation of internal data structures as well as the algorithms used.
1. Black Box
Bu test tekniği "based on system specifications" olarak niteleniyor. Yani gereksinimlere göre test tasarlanıyor. Bu alandan mutlaka soru gelir.

1.1. Equivalance Partitions
1.2. Boundary Value Analysis
1.3. Decision Tables
1.4. State transition
1.5. Use cases
Use case testi daha sonra "Acceptance Test" için kullanılabilir. Ayrıca farklı componentler arasında entegrasyonu test etmek için de kullanılabilir.

2. Structure Based
White Box veya Structure Based Testing yazısına taşıdım

3. Experience
Bu test tekniği "based on experience of testers" olarak niteleniyor. Belirli bir gereksinim setine dayanmıyor.

3.1 Exploratory Testing
Expoloratory Testing yazısına taşıdım.

3.2 Attacks
Saldırı. Saldırı kasten veya kaza ile olabilir. Açıklaması şöyle.
Some people enter random by accident and others do it intentionally trying to break the application. In both cases, you don't want the application to crash or exhibit other unwanted behavior.
For the first type of user, you don't want that because it gives them a bad experience and might turn them away.
For the second type of user, they usually don't have honorable intentions and you don't want to let them have access to information that they shouldn't be able to access or allow them to deny genuine users access to your services.
3.3 Taxonimies
Buna dokümanda "Defect Taxonomies" de deniyor. Eş anlamlı kullanılmış. Taxonomy sınıflandırma demek. Hataları sınıflandırıp bu gruplara göre test tasarlanır.

19 Aralık 2018 Çarşamba

OpenMP parallel for - Döngüyü Paralelleştirir

Giriş
Şu satırı dahil ederiz.
#include <omp.h>
#parallel ve #parallel for Fakı Nedir
#pragma omp parallel blok içindeki aynı kodu N tane thread tarafından çalıştırır. Şeklen şöyledir

#pragma omp parallel for döngüyü N tane thread'e böler. Şeklen şöyledir. Burada chunk olarak 1 veriliyor. Dolayısıyla her thread 1 tane eleman işleyip, 4 tane eleman atlıyor.



#parallel for
N'e kadar olan döngü şöyle paralelleştirilir. Her thread döngünün belli bir kısmını çalıştırır. Örneğin ilk thread 1-100 , ikinci thread 101 - 200 arası vs. gibi.
#pragma omp parallel for
for(int i = 0; i < N; i++)
{
    ...
}
#parallel for ile C++11
Eğer v random access iterator sağlıyorsa şöyle yaparız.
#pragma omp parallel for
for (it = v.begin(); it < v.end(); it++)
{
   ...
}
#parallel for ile thread sayısı
Şöyle yaparız.
#pragma omp parallel for num_threads(2)
for (i = 0; i < N; i++) 
{
  ...
}   
#parallel for içinde critical
Şöyle yaparız.
#pragma omp parallel for
for (int i = 20; i < 1000; i++) 
{
  ...
  #pragma omp critical
  {
    ...
  }

}
#parallel for içinde atomic
Şöyle yaparız.
int iteration = 0;
#pragma omp parallel for 
for (int i = 0; i < num_voxels; i++)
{
  ...
  #pragma omp atomic
  iteration++;
  ...  

}