24 Eylül 2017 Pazar

Ekip Kurma - Team Building ve Planlama

Ana Hedefler
Ana hedefler yani proje takvim hedefleri yönetim tarafından konulur.
Örneğin A işinin 3 ayda bitmesi gerek.

Bu hedeflerin çok net olması gerekir. Hedefler değişirse, neden değiştiği ve yeni hedefin ne olduğunun anlaşılacak bir şekilde tekrarlanması gerekir. Bazı projelerde, ana hedefler değiştirildikten sonra (revize etmek) ekip yeterince bilgilendirilmiyor.

Örneğin kabul testine girecek bir projede, problemlerin çözülmesi için önce Mayıs ayı hedef konulduğunu gördüm. Daha sonra yetişmeyeceği anlaşıldığı için, Temmuz, daha sonra da Ağustos ayına hedef konuldu, ancak ekip yeterince bilgilendirilmediği için işlerin ne zaman bitmesi gerektiği konusu anlaşılmadı.

Planlama ve Tahmin
Planlamanın ilk ayağı tahmin.
Tahmini yapabilmek için işin ne olduğunun detaylarıyla anlaşılması en önemli husus.
Daha sonra işin diğer iş parçacıklarına olan bağımlılıklarına dikkat etmek gerekiyor.
İşi kimin/kimlerin yapacağı ise bence en alt sırada olan husus.

1. Bazı projelerde tahmini, işi yapacak kişinin verdiğini gördüm.
2. Bazı projelerde ise tahmini, takım liderinin yaptığını ve yapacak kişiye uygun olup olmadığını sorduğunu gördüm.

Her iki yöntem de de bence kötü. Planlama oyununda yapılan tahminler ortak akıl ile yapıldığı için çok daha iyi sonuçlar veriyor.

Planlama ile ilgili gördüğüm kötü örnekler şöyle
- İşi yapacak insan takım liderinin neden bahsettiği konusunda fikir sahibi olmadığı için ses çıkaramadı.
- Takım liderinin işi planlarken elinde sadece işin ismi vardı. Her zaman kullandığı şablonu kullanarak plana sadece X Design, X Coding, X Unit Testing, X Bug Fix başlıklarını yazdı ve yanlarına isim + gün bilgisi girdi.
- Takım liderleri işi yeterince küçük parçalara ayırmadığı için işin yetişmediğini gördüm.
- Takım lideri işin bağımlı olduğu diğer iş kırılımlarını hesaba katmadığı için tümleşim bir türlü olmadı ve iş kapanamadı. Bir projede yeni bir API sağlanması gerekiyordu. Takım lideri bu API'yi kendi üzerine aldı ancak kendisine bu işi planlamadı ve bitiremedi.

Yineleme (Iteration) Planı
Tahminler belli bir süre için yapılır. Örneğin 3 hafta. Bazı şirketlerde üst yönetim yineleme planlamasına önem veriyor ve sapmaları (erken bitirme, geç kalma) dahi sorguluyor. Bazı şirketlerde ise bu tür planlara kabaca bakılıyor. Sapmalara ses çıkarılmıyor.

Gördüğüm kötü örnekler şöyle
- Planlama SAP uygulamasına girildi. Yineleme başladıktan sonra tahminin yanlış olduğu ve işin aslında 3 aşamada yapılması gerektiği anlaşıldı. SAP onaylandığı - yani bütçe verildiği - için plan değiştirilemez denildi. Takım lideri işin ismini X Phase 1 olarak değiştirdi. Bir sonraki yinelemeye X Phase 2 ve X Phase 3 ismini verdi.
- Yineleme başladıktan sonra kullanılması düşünülen bir kütüphanenin aslında sadece Linux'ta çalıştığı anlaşılınca iş parçası 3 yineleme sonrasına atıldı. Onun yerine alelacele başka bir şey planlandı.
- Gereksinimleri yazan kişinin aslında işi anlamadığı ve geliştiricinin soruları karşısında yanlış tasarım yaptığı anlaşıldı. İş baştan yapılmak üzere bir sonraki yinelemeye ötelendi.

Planın Uygulanması
Gördüğüm kötü örnekler şöyle
- Takım lideri hiçbir teknik şeye karışmadı ve herkes kendi tasarımını yapıp kendi kodladı. Tümleşim için diğer bileşenlerde yeni API'ler geliştirdi veya mevcut API'leri yine kendine göre değiştirdi. Bu aslında iletişim eksikliği. Yani ekip olamama işareti.



23 Eylül 2017 Cumartesi

Coupling Nedir

Nesneye Yönelik Tasarım
Nesneye Yönelik Tasarımda High Cohesion, Low Coupling amacına ulaşılmaya çalışılır.

Coupling Nedir?
Coupling şöyle tarif ediliyor
"The degree in which components depend on each other for their proper operation is called coupling. Coupling is achieved primarily by the mechanisms chosen to interact between components. The less coupled a system is, the more cohesive it is."
Bir başka açıklama şöyle
Generally speaking, the ease with which any system can be extended is dependant upon the degree to which its subsystems are tightly or loosely coupled. Usually, the more loosely coupled the subsystems are, the easier it is to modify them as they are isolated & don't necessarily require a complete understanding of the system as a whole

Coupling'e Sebep Olan Yöntemler
Bir kaç sebep sayılabilir.

1. Inheritance
Kalıtım sıkı bir coupling sözleşmesidir. Kalıtım ile gelen arayüze sadık kalmak gerekir. 

2. Composition

3.Composition With Interfaces

4. Data Transfer Objects

5. Streams and pipes
Kod içinde circular reference varsa High Coupling olduğu çok rahat görülebilir.

Low Coupling Nasıl Elde Edilir?
Bir çok yöntem var. En basit olanı Encapsulation (Bilgi Saklama) kullanmak

Determinant

Giriş
Açıklaması şöyle
The determinants of  matrices are calculated this way:
det[abcd]=adbc
2x2 bir matriste determinant, alanı verir. Elimizde şöyle bir matris olsun.
1 n
n 1
Determinant'ı bulmak için şöyle yaparız.
1 - n ^ 2

Degenerate Matrix
Determinant'ı 0 olan matristir.
Örnek
Şöyledir.
1 0  1
0 1 -1
0 0  0
Örnek
Şöyledir.
1  1 -2
1 -2  1
-2 1  1
Belirtilen Noktanın Bir Çizginin Sağ veya Solunda Olduğunu Anlamak
Determinant alarak buluruz. Şöyle yaparız.
| x2-x1  x3-x1 |
| y2-y1  y3-y1 |
Alanın artı veya eksi çıkması, son noktanın diğer noktaların sağında veya solunda olmasına göre değişir. Eğer alan >0 ise son nokta diğerlerinin solundadır. < 0 ise sağındadır.

Şöyle yaparız.
public bool isLeft(Point a, Point b, Point c){
  return ((b.X - a.X)*(c.Y - a.Y) - (b.Y - a.Y)*(c.X - a.X)) > 0;
}
Şöyle yaparız
isLeft = function(ax,ay,bx,by,cx,cy){
 return ((bx - ax)*(cy - ay) - (by - ay)*(cx - ax)) > 0;
}
Rank 1 Nedir - Satır
Eğer bir matrisin her satırı bir vectör'ün katı ise rank 1'dir. Elimizde şu matris olsun.
 2   0  -20  10  
-3   0   30 -15
 0   0   0   0
Her satır şu vectör'un katıdır.
1 0 -10 5
Rank 1 Nedir - Sütun
Her matris bir çarpma tablosu gibi ise Rank 1'dir. Elimizde şu matris olsun.
*    1   0  -10  5
    ----------------
 2 |  2   0  -20  10  
-3 | -3   0   30 -15
 0 |  0   0   0   0




22 Eylül 2017 Cuma

SRS Örnekleri

1. SRS ve Döngü Örnekleri
Until all priority x messages are processed, the system shall send X message.
2. SRS ve State Transition Örnekleri
Bazen yazılımda state transition olabiliyor. Durum geçişi için yazılan maddeler şu soruları cevaplamalı.
What conditions are required for the transition to occur?
What action initiated the transition?
What is the output of the transition?
What actions or data transformations occur as a result of the transition?
Örnek.
Bu örnekte başlangıç durumu veriliyor
Upon power up the system shall start in the Comms-Init State.
Bu örnekte başlangıç durumu veriliyor
Join state shall start with X message. The system shall enter B mode. In this mode the system shall be able to
- construct A graph
- deduce network status
Örnek
Bu örnekte bir state'te kabul edilecek bilgi ve bir sonraki state belirtiliyor.
"When in the pre-qualified state, the system shall accept an input of a property address and transition to the submitted state"
3. SRS ve If/Else Örnekleri
Örnek
If {
 if {
 }
}
else
{
}
şeklindeki bir işi tarifler
Upon reception of X message, if status is granted, the unit shall
  - abandon property address and start using assigned address
  - obtain new id from Y
  - perform cleanup of Z
  if previous grant was 10 seconds ago
    - report X error to operator
If status is denied, the unit shall
 - release hold files
Örnek 
If yerine when kullanılıyor
When any/all of the following conditions are satisfied
 -- Condition1
 -- Condition2
the following actions shall be performed
  -  X subsystem shall set Message Count field in Y message to total number of messages
  - X susbsystem shall reject the Y message sequence if Z is not received.
Örnek
If yerine when kullanılıyor
When X message is received, sytem shall alert the operator if there exits Y requests.
Örnek
If koşulu ayrıca belirtiliyor
 X susbsystem shall accept the Y message sequence if any of the following are false :
  -- Z is unknown or T is unknown
4. SRS ve Timeout Örnekleri
Örnek
Bu örnekte bir işin belli bir sürede bitmemesi durumu gösteriliyor.
If deduction is not possible after 20 minutes, the system shall respond B with X Failure message
Bu örnekte bir işin periyodik olması durumu gösteriliyor.


If deduction is not possible every 20 minutes, the system shall respond B with X Failure message
5. SRS Zaman Örnekleri
1.1. On the last working day of each month, a summary of the drugs
     prescribed, their cost, and the prescribing clinics shall be generated.
1.2. The system shall automatically generate the report for printing after
     17.30 on the last working day of the month.
6. SRS Use Case Örnekleri
Bu tür SRS örnekleri gördüm. Sanırım yazılabilir. Bu SRS'lerde Main Case -> Sub Flow şeklinde başlıklar bulunuyor.

Sadece tek bir flow'dan oluşan SRS şöyle.
1. This use case starts when Foo A receives A message.
2.Foo shall announce A.
3. Upon reception of A, Bar shall set field B as 1
4. If IndexNo is empty, Bar shall erase C
5. Upon erasure of C, Bar shall stop periodic job D
Sub Flow'dan oluşan SRS şöyle
1. This use case starts when Foo receives A
2. Foo shall announce A
3. Upon reception of A, Bar shall search for B
4. If B is found,  Sub Flow B Erasure is executed
5. If B is not found, Sub Flow Negative Acknowledgement is executed.

AES

Giriş
AES kısaltması Advanced Encryption Standard kelimelerinin baş harflerinden oluşur. İlk öğrenirken hep Asymmetric Encryption Standard olarak hatırlıyordum. Ama aslında simetrik bir şifreleme algoritmasıdır. Yani aynı anahtar ile düz metin şifrelenir ve açılır. Açıklaması şöyle
The Advanced Encryption Standard (AES) is the latest encryption standard adopted by NIST in 2001 for symmetric encryption of messages. The AES algorithm was selected as part of a contest to find a replacement for the Data Encryption Standard (DES). This algorithm was based on the Rijndael cipher developed by two Belgian mathematicians, Joan Daemen and Vincent Rijmen.

As part of the NIST standard,  AES uses a block size of 128 bits and supports three key lengths: 128, 192 and 256 bits.
Password Key Derivation Function
Password Key Derivation Function (PKDF) AES'e dayalıdır.

Anahtar
Aynı makinede çalışan iki uygulama anahtar üretmek için şu yöntemi kullanabilir.
With traditional servers, the only real solution that I'm aware of is to derive an AES key from some sort of "hardware fingerprint" built by combining serial numbers of all the hardware devices. Then use that AES key to encrypt the credentials. A process running on the same server can reconstruct the AES key and decrypt the credentials,
Anahtar ve Blok Büyüklüğü
Anahtar 128 veya 192 veya 256 bit uzunluğunda olabilir. Blok büyüklüğü ise 128 bit uzunluğundadır. 128 bit binary çıktıdır. Bu çıktı ASCII veya Base64 ile büyümesi pahasına okunabilir hale getirilebilir

Bu kriptonun yayınlandıktan sonra standart hale gelmesi 2 sene sürdü. AES ssl/tls bağlantısı kurulurken istemci tarafından gönderilen kullanılabilecek kriptolar listesi arasında genellikle mevcuttur.

AES-256 2017 yılında ben bu yazıyı yazarken ABD hükümeti tarafından en gizli belgeleri şifrelemek için kullanılıyordu

Çalışması
AES şöyle çalışır.
E: AES şifrelemesi
D: AES şifre açması
x: düz metin
y: şifrelenmiş metin
k: anahtar

ise

şifrelenmiş metin: y = E(x, k)
düz metin: x = D(y, k)

Modları

1. CFB1
Açıklaması şöyle
CFB1 is an older format that is mainly useful for its error propagation properties. That's not often considered an important factor anymore. 
2. ECB - Electronic Codebook
Açıklaması şöyle 
The electronic codebook (ECB) mode encrypts each block individually. Any blocks that are identical and in the same message,  or that are in a different message encrypted with the same key, will be transformed into identical ciphertext blocks. The disadvantage of ECB is that identical plaintext blocks are encrypted to identical ciphertext blocks (thus, it does not hide data patterns well). In some senses, it doesn't provide message confidentiality at all and so it is not recommended for cryptographic protocols
Pek tercih edilmiyor. Hatta TLS 1.3 artık AES-CBC desteklemiyor. Açıklaması şöyle
The problem here is not so much with CBC, but with alternatives that are easier to implement safely, without losing mathematical security.In fact, AES-CBC turned out to be notoriously difficult to implement correctly.

3. CBC - Cypher Block Chaining
Açıklaması şöyle 
The cypher block chaining (CBC) mode introduces feedback. Before each plaintext block is encrypted, it is combined with the ciphertext of the previous block with a bitwise exclusive OR operation. This ensures that, even if the plaintext contains many identical blocks, they will each encrypt to a different ciphertext block. The initialization vector  (IV) is combined with the first plaintext block by a bitwise exclusive OR operation before the block is encrypted. 
CBC Nedir?
Bir bloğun çıktısının diğer bloğa eklenmesine Cypher Block Chaining (CBC) denilir. Çok basit bir örnek şöyle. Elimizde A = 1, B = 2, C = 3 diye bir tablo olsun ve AAA kelimesini şifrelemek isteyelim. Şöyle yaparız.
1. A = A + previous + key = 1 + 0 + 5 = 6
*6 corresponds to the letter F
2. A = A + previous + key = 1 + 6 + 5 = 12
*12 corresponds to L
3. A = 1 + 12 + 5 = 18
*18 corresponds to R
4. A = 1 + 18 + 5 = 24
*24 corresponds to X
Çıktı olarak şunu alırız.
FLRX

4. CFB -Cipher Feedback
Şeklen şöyle


Açıklaması şöyle
CFB just takes the previous block as the IV for the next block making it a stream cipher.
Açıklaması şöyle
CBC, CFB and CFB1 are all non-authenticated modes of operation. CFB is a streaming mode of operation which doesn't require a randomized IV (just a unique IV). Because it is a streaming mode it also doesn't require a padding mode.
Açıklaması şöyle
In CFB-mode you effectively have a data-dependent stream cipher and you'll need ceil (l/n) block cipher calls to process the full message, where l is the mesage length (in bits), n the block size (in bits).

Açıklaması şöyle
So, what actually happens in CFB mode encryption is that the plaintext message is divided into blocks of some fixed length (which typically matches the block size of the block cipher being used). Each of these plaintext blocks is then XORed with the output of the block cipher, and the result of this XOR operation is output as the corresponding ciphertext block, and also used as the input to the block cipher for encrypting the next plaintext block.

Most of the other classical block cipher modes of operation work in a similar way, only the details differ. For example, in OFB mode the output of the block cipher is saved for use as input to the next block cipher call before it is XORed with the current plaintext block to produce the corresponding ciphertext block.

5. OFB - Output Feedback
Açıklaması şöyle 
The output feedback (OFB) mode processes small increments of plaintext into ciphertext instead of processing an entire block at a time. This mode is similar to CFB, but it differs in the way the shift register is filled. If a bit in the ciphertext is mangled, the corresponding bit of plaintext will be mangled. However, if there are extra or missing bits from ciphertext, the plaintext will be mangled from that point on.

6. CTR - Counter
AES CTR modda çalışabilir. CTR modda her blok için kullanılan IV counter bir artırılarak hesaplanır. IV bir önceki bloğun çıktısı olmadığı için her blok birbirini beklemek zorunda kalmaz. Böylece CTR paralel çalıştırılabilir. CTR mod ECB mod kullanılarak yapılabilir. Açıklaması şöyle
You can implement CTR mode if all you have is ECB. All you have to do is use ECB to encrypt the successive counter values and use the resulting ECB-ciphertext as the CTR keystream to xor with the actual plaintext you want to encrypt.

7.GCM
Açıklaması şöyle
AES-GCM takes a 96-bit nonce and NIST says that you can only encrypt 232 messages under a single key if using random nonces. This is because if you throw 232 balls at 296 buckets then you have roughly a 233 chance of getting two in the same bucket and NIST drew the line there. That probability might seem either high or low to you. It's pretty small in absolute terms and, unlike a work factor, an attacker can't spend resources against it, but it's a very long way from the safety margins that we usually use in cryptography.
Açıklaması şöyle
GCM does not provide secure hashing. In general, a MAC has all the properties of a hash only against an adversary who does not know the key. If you want to use the function as a MAC then the key has to be public and then A MAC is not a secure hash. With most common MAC constructions other than HMAC, if you know the key, you can easily construct, at least, a second preimage.
IV olarak verilen 12 byte yani 96 bit aslında nonce. Normalde AES 128 bit IV ile çalışıyor. Bu modda 128 bit bir başka işlem ile 96 bit haline getirilir.

Bu mod yerine AES-SIV veya AES-GCM-SIV kullanılması öneriliyor.

8.SIV ve GCM-SIV
Bu modlarda sabit IV/nonce kullanılabilir.

AES Gerçekleştirimi
4 yöntem var. 
1. Lookup Table
2. With Inversion in GF(2)[X]
3. Bit Sliced
4. AES Donanım Desteği
Bu gerçekleştirim en ilginci çünkü Intel AES için instruction sağlıyor. Şöyle yaparız.
aesenc xmm1, xmm3   % xmm1 - data, xmm3 - key
Bu da şöyle bir kod çıkmasına sebep olur.
# Encrypt the block.
pxor       %xmm5,  %xmm0
aesenc     %xmm6,  %xmm0
aesenc     %xmm7,  %xmm0
aesenc     %xmm8,  %xmm0
aesenc     %xmm9,  %xmm0
aesenc     %xmm10, %xmm0
aesenc     %xmm11, %xmm0
aesenc     %xmm12, %xmm0
aesenc     %xmm13, %xmm0
aesenc     %xmm14, %xmm0
aesenclast %xmm15, %xmm0
AES Kablosuz Klavye
Kablosuz klavyelerde genellikle AES-128 şifreleme kullanılır.