31 Ocak 2019 Perşembe

Unit Test - Brim Testi

Unit Test Yapabilmek İçin Tasarım Değişikliği
Bunu yapmamak lazım. Açıklaması şöyle.
Unit tests often break encapsulation and make the code under test more complex than would otherwise be required (e.g. by introducing additional interface types or adding flags). As always in software engineering, every good practice and every good rule has its share of liabilities. Blindly producing a lot of unit tests can have a detrimental effect on business value, not to mention that writing and maintaining the tests already costs time and effort.
Bir başka açıklama şöyle. Özellikle test edebilmek için production koduna test arayüzü eklemekten kaçınmak lazım.
I would argue it depends of the kind of change. There's a difference between making code easier to test, and introducing test-specific hooks that should NEVER be used in production. I am personally wary of the latter, because Murphy...

17 Ocak 2019 Perşembe

Full Condition Coverage Nedir

Giriş
Açıklaması şöyle.
Test all 2^N possible combinations.


DO-178B MC/DC Coverage Nedir? - Level A

Giriş
MC/DC "Modified Condition/Decision Coverage" anlamına gelir. Türkçesi "Değiştirilmiş Koşul Karar Kapsamı" olarak geçiyor. DO-178 B Level A projelerde yapılır. Açıklaması şöyle
The principle of this type of coverage covers all paths and decisions, by having coverage of each decision and coverage of each condition. Constraints are that
a) each entry point and exit point is covered, and
b) that each condition within a decision demonstrates its impact on the result of the decision.
Kısaca sonucu bağımsız olarak etkileyen her tekil koşulun test edilmesi anlamına geliyor.
Koşul Değişikliği -> Sonuç Değişikliği
olarak düşünülmeli. Bir başka açıklama şöyle
How can you approach Modified Condition/Decision Coverage(MC/DC) in your project?…not to be confused with AC/DC!

Let’s look at the what, the why and the when…

Modified Condition/Decision Coverage (MC/DC) is a code coverage criterion commonly used in software testing.

For example, DO-178C software development guidance in the aerospace industry requires MC/DC for the most critical software level (DAL A).

Code coverage is a way of measuring the effectiveness of your test cases.

The higher the percentage of code that has been covered by testing, the less likely it is to contain bugs when compared to code that has a lower coverage score.

There are three other types of code coverage that are worth considering in relation to MC/DC: Statement coverage, Decision coverage and Multiple condition coverage.

In addition to the criteria required by statement and decision coverage, MC/DC requires that 'Each condition in a decision has been shown to independently affect that decision's outcome'.

===

Why MC/DC?

Aerospace and automotive guidance prioritizes safety above all else in the software development lifecycle.

With that in mind, truly ‘exhaustive testing’, as encapsulated by MCC, would be the safest and most rigorous approach in a perfect world.

MC/DC represents a compromise that finds a balance between rigor and effort; positioning itself in between DC and MCC.

MC/DC requires a much smaller number of test cases in comparison to multiple condition coverage (MCC), while retaining a high error-detection probability.

===

When is MC/DC required?

DAL A aerospace projects

Any software that is critical to provide (or prevent failure of) continued safe flight and landing of an aircraft is defined as being Design Assurance Level A software.

Any aerospace software that is being created at this level of assurance must measure and report MC/DC.

ASIL D automotive projects

ISO 26262 prescribes MC/DC for ASIL D (the highest criticality level) software.

MC/DC Neden Lazım
Eğer Full condition coverage veya bir diğer ismiyle Truth Table yöntemini deneseydik çok fazla test yazmak gerekirdi. N tane koşul için 2^N tane test yazmak gerekir. Örneğin A ve B'nin yanına yeni bir C koşulu daha gelseydi, test sayısı iki ile çarpılacaktı. Bu durum da maliyetler çok artacaktı.

MC/DC test sayısını azaltmayı hedefler. Açıklaması şöyle. Çünkü MC/DC 'de tüm koşullar önce True ile başlar sonra bir seferde tek bir koşul False yapılır. Truth Table yönteminde ise bir seferde birden fazla False olabiliyor. Bu yüzden test sayısı çok fazla oluyor.
In general, with N conditions MC/DC requires N+1 test cases as opposed to 2^N. As such, it strikes a good balance between rigor (each condition tested) and efficiency (testing all of 2^4 may not be necessary).
Truth Table
MC/DC için truth table çıkartmak gerekiyor. Bunu çıkartmanın kolay bir yolu şöyle.

Kaç tane değişken varsa (n diyelim) s^n tane (K diyelim) satır olması gerekiyor.

İlk sütuna dönüşümlü olarak K/2 tane T ve F yazılır.
İkinci sütuna dönüşümlü olarak K/4 tane T ve F yazılır.
Üçüncü sütuna dönüşümlü olarak K/8 tane T ve F yazılır.

Truth Table'dan MC/DC Testine Geçiş
İlk sütundaki değer değişikliği (diğer sütunlar sabit kalmalı) sonucu da değiştiriyorsa bu sütun teste dahil edilir.

İkinci sütundaki değer değişikliği (diğer sütunlar sabit kalmalı) sonucu da değiştiriyorsa bu sütun teste dahil edilir.

Üçüncü sütundaki değer değişikliği (diğer sütunlar sabit kalmalı) sonucu da değiştiriyorsa bu sütun teste dahil edilir.

Örnek
Dolayısıyla kodun nasıl yazıldığı testleri de etkiler. Şu iki kod arasında test maliyeti açısından fark mevcut. Bu örnekte çok fazla test yazmak gerekiyor.
(A||B) && (A||!C)
Aynı işi gören bu kodda ise daha az test yazmak gerekiyor.
A||(B&&!C)
Örnek
Elimizde şöyle bir kod olsun
if (conditionA && conditionB && conditionC && conditionD) {
    return true;
}
MC/DC testi için şöyle yaparız
                       A B C D
testTypicalCall()   -> T T T T
testAisFalseFails() -> F T T T
testBisFalseFails(  -> T F T T
testCisFalseFails() -> T T F T
testDisFalseFails() -> T T T F
Örnek
Açıklaması şöyle
Modified Condition/Decision Coverage (MC/DC) is a code coverage criterion commonly used in software testing as a way of measuring the effectiveness of your test cases.

MC/DC requires that 'Each condition in a decision has been shown to independently affect that decision's outcome'.

Imagine making a cup of coffee.

To make a warm and tasty cup of coffee, we'd need ALL of the following: a kettle, a cup and coffee.

If any of the components were missing, we wouldn't be able to make our coffee.

Or, to express this another way:

if( kettle && cup && coffee ) {
  return cup_of_coffee;
}
else {
  return none;
}

(see the illustration attached to this post)

Tests 4 & 8 demonstrate that ‘kettle’ can independently affect the outcome.
Tests 6 & 8 demonstrate that ‘mug’ can independently affect the outcome.
Tests 7 & 8 demonstrate that ‘coffee’ can independently affect the outcome.

The tests required for MC/DC analysis in this case are tests 4, 6, 7 & 8.

Tests 1, 2, 3 and 5 are not required as we can satisfy the MC/DC criterion without them.

These redundant tests need not be included in the coverage report.
Şeklen şöyle. Burada bence en kolayı önce tüm koşulların 1 olduğu durumu yani 8. satırı bulmak daha sonra bir koşulun 0 yapılarak sonucu değiştiği satırı bulmak gerekiyor. Bu satırlar 4,6 ve 7


Örnek
Elimizde şöyle bir kod olsun
if ( ((x == 0) && (y == 0)) || y == 0) { 
  ...
}
MC/DC için Şöyle yaparız.
╔════════╦════════╦══════════════════════════════════╗
║ x == 0 ║ y == 0 ║ ((x == 0) && (y == 0)) || y == 0 ║
╠════════╬════════╬══════════════════════════════════╣
║      0 ║      0 ║                                0 ║
║      0 ║      1 ║                                1 ║
║      1 ║      0 ║                                0 ║
║      1 ║      1 ║                                1 ║
╚════════╩════════╩══════════════════════════════════╝




Kriptografik Random Number Generator Kullanımı

Kriptografik Random Number Generator
Crypographically Secure Random Number Generator (CSRNG) non-deterministic olmak için bir external source of entropy kullanırlar. entropy şu anlama gelir.
entropy is the measure of surprise
Açıklaması şöyle
What does ‘entropy’ mean? The Linux kernel uses certain techniques like a user’s mouse movements, variance in the hardware fan noise, variance in the noise of the device drivers, etc. to generate random numbers. When there is a lack of ‘entropy’ in the operating system, then random number generation will slow down. 
Programlama dilleri ve işletim sistemlerinde kullanılabilecek CSRNG'ler şöyle
Reading from /dev/urandom on a Unix-like system
The Java SecureRandom class
The .NET RNGCryptoServiceProvider class
The PHP openssl_random_pseudo_bytes() function
C#
RNGCryptoServiceProvider Sınıfı yazısına taşıdım.

Java
SecureRandom Sınıfı yazısına taşıdım.
UUID Sınıfı yazısına taşıdım.

Win32

Linux /dev/urandom
/dev/urandom dosyası yazısına taşıdım.

11 Ocak 2019 Cuma

Spherical Konum Hesaplama Formülleri - Distance ve Azimuth ile Son Noktayı Bulmak

Giriş
"Calculate end point (latitude/longitude) given a starting point, distance, and azimuth" konusu ile ilgili.

Law of Cosines (spherical) cos(b) = sin(a)*sin(c) + cos(a)*cos(c)*cos(B)
Law of Sines (spherical) sin (B)/sin(b) = sin(A)/sin(a) = sin(C)/sin(c)

Bu formülde

- b iki nokta arasındaki açı mesafesi (angular distance in radians)

- a ikinci noktanın kuzey kutbuna göre enlem farkı yani
a = 90 - lat2

- c ilk noktanın kuzey kutbuna göre enlem farkı yani
c = 90 - lat1

- B iki nokta arasındaki boylam farkı yani
B = lon2 - lon1,

Formül şöyle
cos (b) = cos (90 - lat2) * cos (90 - lat1) + sin (90 - lat2) * sin (90 - lat1) * cos (lon2 - lon1)

b'yi elde etmek için
b = arccos ( cos (90 - lat2) * cos (90 - lat1) + sin (90 - lat2) * sin (90 - lat1) * cos (lon2 - lon1) )

Bu formülden elimize angular distance in radians biirmi geçer.

arc length = (radius) *(angular distance in radians)
distance = (Earth Radius) *  (angular distance in radians)

b yani (angular distance in radians) = distance / (Earth Radius)

lat2'yi Bulmak
Eğer a'yı bulursak lat2'yi bulmak kolay olur. a'yı bulmak istersek Law of Cosines kullanarak şöyle bir formül elde ediliyor.
a = arccos(cos(b)*cos(c) + sin(c)*sin(b)*cos(azimuth))
a = arccos(cos(b)*cos(90 - lat1) + sin(90 - lat1)*sin(b)*cos(azimuth))
En son olarak şöyle yaparız
lat2 = 90 - a

long2'yi Bulmak
Eğer b'yi bulursak long2'yi bulmak kolay olur. b'yi bulmak istersek Law of Cosines kullanarak şöyle bir formül elde ediliyor.
B = arcsin(sin(b)*sin(azimuth)/sin(a)).
En son olarak şöyle yaparız
lon2 = B + lon1


Örnek
Şöyle yaparız
double distanceInMeters = ...; //meters

double latInRadians = ...;

double longInRadians = ...;

double azimuthInRadians = ...;

double RADIUS_EARTH_WGS84_D = 6_378_000.0;

double distanceInRadians = distanceInMeters / RADIUS_EARTH_WGS84_D;

double posLatInRadians =

  Mat.asin(

    Math.sin(latInRadians) *     Math.cos(distanceInRadians )

    +

    Math.cos(latInRadians) *     Math.sin(distanceInRadians ) * Math.cos(azimuthInRadians)

);

double posLongInRadians = longInRadians +

 Math.atan(

  Math.sin(distanceInRadians ) * Math.sin(azimuthInRadians ) /

  Math.cos(latInRadians ) * Math.sin(distanceInRadians)

  -

  Math.sin(latInRadians ) * Math.sin(distanceInRadians) * Math.cos(azimuthInRadians )

);

Konum Hesaplama Formülleri - GPS'i XYZ Kartezyen Koordinate Sistemine Çevirme

GPS'i XYZ Kartezyen Koordinate Sistemine Nasıl Çeviririz?
Bazen GPS enlem/boylamlarını X,Y,Z kartezyen koordinat sistemine çevirmek gerekir. Bu sisteme Earth Centered, Earth Fixed (ECEF) de deniyor. Bu sistemde Z ekseni dünyanın merkezinden kutuplara doğru uzanır.

Küre Kullanarak
Formül şöyle
= r cos(phi) sin(theta) y = r sin(phi) sin(theta) z = r cos(theta)
Bu formülde
theta == latitude phi == longitude
Dolayısıyla tam formül şöyle oluyor.
= radius + altitude x = r cos(long) sin(lat) y = r sin(long) sin(lat) z = r cos(lat)
Çevrim için kullanılan formülde lat (enlem) ve lon (boylam) değerlerinin radyan biriminden olması gerekiyor. Yarıçap ile cos(lat) çarpılarak x-y eksenindeki iz düşümü bulunuyor.

Bu çevrim ile ilgili gördüğüm bir soru burada. Çevrimi anlatan en kolay anlaşılır sayfa burada.

Flattening ile
Eğer flattining kullanılmak istenseydi formül şöyle olurdu. Burada lat ve lon radyan olarak giriliyor.
def LLHtoECEF(lat, lon, alt):
    # see http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html

    rad = np.float64(6378137.0)        # Radius of the Earth (in meters)
    f = np.float64(1.0/298.257223563)  # Flattening factor WGS84 Model
    cosLat = np.cos(lat)
    sinLat = np.sin(lat)
    FF     = (1.0-f)**2
    C      = 1/np.sqrt(cosLat**2 + FF * sinLat**2)
    S      = C * FF

    x = (rad * C + alt)*cosLat * np.cos(lon)
    y = (rad * C + alt)*cosLat * np.sin(lon)
    z = (rad * S + alt)*sinLat

    return (x, y, z)
Bazı hesaplamalarda flattening 0 kabul ediliyor. Bu durumda yukarıdaki küre ile yapılan hesaplamalardan farklı bir sonuç elde edilir.
def llarToWorld(lat, lon, alt, rad):
    # see: http://www.mathworks.de/help/toolbox/aeroblks/llatoecefposition.html
    f  = 0                              # flattening
    ls = atan((1 - f)**2 * tan(lat))    # lambda

    x = rad * cos(ls) * cos(lon) + alt * cos(lat) * cos(lon)
    y = rad * cos(ls) * sin(lon) + alt * cos(lat) * sin(lon)
    z = rad * sin(ls) + alt * sin(lat)

    return c4d.Vector(x, y, z)
C++ kodu şöyle olurdu. Bu kodu hiç anlamadım
struct Point3d {
    float x, y, z;
    Point3d& fromLatLon(float lat_deg, float lon_deg) {
        static const float r = 6371.; // sphere radius
        float lat(lat_deg*M_PI/180.), lon(lon_deg*M_PI/180.);
        x = r * std::cos(lat) * std::cos(lon);
        y = r * std::cos(lat) * std::sin(lon);
        z = r * std::sin(lat);
        return *this;
    }
};

7 Ocak 2019 Pazartesi

IEEE 802.1Q Frame

Giriş
Ethernet II Frame'lerinin VLAN Tag'i konulacak şekilde genişletilmesidir. Açıklaması şöyle
802.1q frames are a different format than "standard" Ethernet (802.3). Standard Ethernet frames do not have VLAN IDs. A PC or other device transmits and receives Ethernet frames (802.3).
Açıklaması şöyle.
Remember that 802.1Q adds to the ethernet frame, moving the Ether Type field down, and inserting a different Ether Type field and other fields.
Açıklaması şöyle.
A virtual LAN (VLAN) is any broadcast domain that is partitioned and isolated in a computer network at the data link layer (OSI layer 2). A LAN is an abbreviation for local area network and in this context virtual refers to a physical object recreated and altered by additional logic. VLANs work through tags within network packets and tag handling in networking systems - recreating the appearance and functionality of network traffic that is physically on a single network but acts as if it is split between separate networks. In this way, VLANs can keep networks separate despite being connected to the same network, and without requiring multiple sets of cabling and networking devices to be deployed.
VID Alanı
VLAN Identifier (VID) alanı 12 bit uzunluğundadır. 0 - 4095 arasında değer alabilir. Ancak 0 ve 4095 kullanılmadığı için 4094 tane farklı VLAN kurulabilir. Açıklaması şöyle.
802.1Q allows different 4094 VLANs, 0 and 4095 are reserved and can't be used.
Bu alana isim verilemez. Verilen isimler üreticiye özel (vendor specific şeylerdir. Açıklaması şöyle.
The VLAN tag in an Ethernet packet is a 12 bit interger, providing 4096 numbered values. There is no string identification in the packet.

Since management of VLANs via numbers only is a burden on human memory and thus error-prone, vendors have soon started to allow associating a descriptive name with the numerical tags to ease that burden - but these names are local either to each device or in the best case to a family of devices that share a configuration database. AFAIK there is no cross-vendor way to synchronize name-number tuples.
Paket Büyüklüğü
Bir 802.1Q paketi FCS hariç en fazla 1518 byte uzunluğunda olabilir. 1500 byte veridir + 18 byte header. VID için ayrılan 12 bit 4 byte büyüklüğünde yer kaplar. FCS 4 byte'tır ancak çoğu ethernet sürücüsü FCS'i okumaya izin vermez.

VLAN Nedir ?
Açıklaması şöyle.
VLAN can be used to isolate your IoT traffic from the rest of your networking devices.

A VLAN is a way of telling your networking equipment (your router) to treat certain wires to behave like they are a completely separate network, behind a firewall and dedicated to communicating in private. Some of the more expensive home networking routers can be set up this way, but setting it up complex, and will be different for each router.
VLAN ve Subnet
Açıklaması şöyle. VLAN ile genelde bir subnet kullanılır.
VLANs are layer 2 constructs. Subnets are layer 3 constructs. While normally there is a 1:1 correspondence between VLANs and subnets, it isn't always the case. You can have multiple subnets per VLAN or a subnet that spans multiple VLANs.
Inter VLAN Routing
Aynı switch üzerinde VLAN'lerin birbirleriyle iletişim kurabilmesi için kullanılır. Bir projede VLAN1'den gelen paketleri VLAN0'ın trunk portune göndermek için static routing kuralı tanımladık. Kuralda tag:0 kullanılınca tag bilgisi paketten siliniyordu.

Native VLAN Nedir?
802.1q standardında Native VLAN kavramı var. Bu şu anlama geliyor. Normalde switch'in tag'lenmiş ethernet frame'leri alması beklenir. Ancak eğer olurda tag'siz bir frame gelirse bizim belirlediğimiz bir VLAN olarak taglenebilir. Buna Native VLAN deniyor.

Access Port Nedir?
Cisco terminolojisinde VLAN olarak tag'lenmemiş frame'leri alan port'tur.

Trunk Nedir?
Cisco terminolojisinde VLAN olarak tag'lenmiş frame'leri alan port'tur. Açıklaması şöyle
A trunk allows pretagged packets to passthrough without changing the tag while an access port takes the packets it receives and retags them.
Açıklaması şöyle
Tags are used on trunks in order to tell the other end of the link which frames are on which VLAN. A switch receiving frames on an access interface already knows to which VLAN the frames belong.
Açıklaması şöyle
When a switch transmits frames on a trunk, it uses 802.1q framing, which includes a VLAN tag. If the switch is transmitting frames with tags, then that port is a trunk port. Most hosts do not understand 802.1q frames, so they ignore them. That is why you can have tagged and untagged frames on the same port. But it's still a trunk port.
Örnek
İki switch arasında şöyledir
Switch A VLAN 10 -> Switch B VLAN 10
Örnek
İki host ve switch arasında şöyledir.
H1 --- S1 --- S2 --- S3 --- H2
Açıklaması şöyle
Hx are hosts, Sx are switches. Both hosts are connected with access port on VLAN 20 to the corresponding switches, while all the other ports are trunks. No VTP is enabled, meaning that only S1 and S3 has VLAN20 in their table.

This is how I reason the process of sending a frame from H1 to H2:

*The frame is tagged with VLAN 20 upon leaving via the trunk port from S1
* The frame reaches S2, since it can't recognize the VLAN, it simply drops the frame, hence H2 doesn't receive the frame.