25 Şubat 2019 Pazartesi

Man In The Middle Attack - Aradaki adam saldırısı

Giriş
Aradaki adam saldırısını engellemenin tek yolu seritifka kullanmak. Açıklaması şöyle.
In computer networks, the alternative channel is usually a public-key infrastructure (PKI). This means your operating system or browser has a set of preconfigured root certificates from which other certificates are signed (and possibly even further certificates using these as intermediate certificates). Hence, when you visit some website, it presents a signed certificate, which is signed using (a chain of) certificates which you already trust. Then, by using this certificate, an authenticated key exchange is possible (e.g., to agree on an ephemeral key to use with ordinary symmetric encryption).
Açıklaması şöyle.
In a man-in-the-middle attack, you ask Bob for his key but Eve intercepts the message and sends you her key instead. She asks Bob for his key and then passes messages between you and Bob, decrypting them, reading and/or changing them in the process.

The problem is that you don't know whether or not you really have Bob's key. Certificates get around this because the certification authority (CA) gives Bob a digitally signed message saying "Bob's key is 12345". You can verify this certificate because there aren't many CAs so your browser just contains a list of valid CA keys. Now, if Eve intercepts your attempt to start encrypted communication with Bob, she has two choices. If she tells you that Bob's key is 67890, then either she doesn't provide a certificate and you say "Sorry, you need to prove that" or she provides a fake certificate and you say "That certificate isn't valid." Alternatively, she tells you that Bob's key is 12345 and provides a valid certificate of that, but this is no use to her because she doesn't know Bob's private key, so she can't decrypt the messages she's relaying between the two of you.

Düzenli İfadeler (Regular Expressions) ile Positive Lookahead

Giriş
Düzenli ifadeye (?=subexpression) şeklinde yazılır. Positive lookahead parantez içinde yazılmasına rağmen düzenli ifadedeki eşlemeye dahil edilmez. Yani non-consuming kabul edilir. Açıklaması şöyle.
Typically, a zero-width positive lookahead assertion is found at the end of a regular expression pattern. It defines a substring that must be found at the end of a string for a match to occur but that should not be included in the match. It is also useful for preventing excessive backtracking.
Örnek
Elimizde şöyle bir kod olsun. Önünde sayı, ardında yine bir sayı olan boşlukları siler.
string test = "Some Words 1 2 3 4";
string result = Regex.Replace(test, @"(?<=\d)\s+(?=\d)", "");
Çıktı olarak şunu alırız.
Some Words 1234
Örnek
Artarak giden 5 tane rakamı yakalamak için şöyle yaparız.
^\d*(?=\d{5}(\d*)$)0?1?2?3?4?5?6?7?8?9?\1$
Açıklaması şöyle.
We can force it to match exactly 5 characters by combining a look-ahead of five digits and an arbitrary suffix (which we capture) and a backreference \1 (which must exactly the suffix matched by the look-ahead, ensuring we've now walked ahead 5 characters in the string).
Örnek
Belli bir kelimeye kadar olan grubu yakalamak için şöyle yaparız.
/^.+?(?=\s*\b(?:was|in|for)\b)/
Elimzde "Once upon a time there was a fox in a hole";  olsun
Souç olarak şunu alırız
"Once upon a time there"

20 Şubat 2019 Çarşamba

Gramer

Gramer Bileşenleri
Gramer ve türlerine girmeden önce gramer bileşenlerini bilmek gerekir. Bileşenler şunlardır
Terminal (devamlı), nonterminal (terminal), start symbol (başlama simgesi) ve production.

Production
S -> aSB bir production'dır. Terminal a , nonterminal S'in tanımladığı string seti ve terminal b'nin birleşiminden oluşur.

Substitution
A->xy production satırında A'nın yerine xy karakterlerinin konmasına da substitution denilir.

Gramer Gösterimi
En çok kullanılan gramer gösterim şekli Backus-Naum Form (BNF)'tir. BNF tekrar eden şeyleri gösterimde zahmetlidir. Bu yüzden Extended BNF gösterimi geliştirilmiştir.

EBNF parametrelerler gruplanmış alt kuralları da destekler.

Context Free Grammar (İçerikten Bağımsız Gramer) - Nedir?
Context Free Grammar yazısına taşıdım.

Context Sensitive Grammar Nedir?
Context Sensitive Grammar en çok doğal konuşma dilinde bulunur. Programlama dillerinde parsing safhasında karmaşıklığı çok artırdığı için pek tercih edilmez.

Örnek
Elimizde şöyle bir sql olsun.
SELECT x FROM y WHERE z
Açıklaması şöyle.
y can be another select query itself, so it cannot be simulated with finite-state machine.

Örnek
XML'de rastgele tag isimleri kullanılabilir. Her tag'in düzgün bir şekilde açılıp kapandığı kontrol edilmelidir. XMl Context Sensitive bir gramer kullanır.
<hi>
 <bye>
 the closing tag has to match bye
 </bye>
</hi> <!-- has to match "hi" -->
Örnek
C++ Context Free olduğunu iddia etse de aslında Context Sensitive bir grammar kullanır.
foo (a);
şeklindeki bir satır foo metodunu a parametresi ile çağırmak olabileceği gibi, foo tipinden a değişkeni tanımlamak (a'nın etrafından parantez olabilir veya olmayabilir) olarak ta anlaşılabilir. Yine aynı şekilde
x * y ;
 x ve y'nin çarpımı olabileceği gibi, x'e point eden y pointer'ı tanımlaması da olabilir.

Gramer ve Recursion
Gramerlerde left, middle veya right recursion olabilir. Recursion kullanılan gramer, parser türüne göre problem çıkarabiliyor.

1.Left Recursion
Şöyledir.
A→A∣1

2. Middle Recursion
Şöyledir.
A→0A1∣1

3. Right Recursion
Şöyledir.
A→0A∣1

Right Recursive Gramer, LR Parser ile kullanılamaz.

Şimdi biraz daha detaylandıralım.

Left Recursive Grammar Nedir?
Left Recursive Grammar (LRG) 'lar kendi içlerinde gruplanıyor.

1. Immediate Left Recursive Grammar 
Anlaması en kolay olanı.
Örnek 1
Şöyle yaparız
M -> M + n | n
Örnek 2
Şöyle yaparız
Expression ::= Expression '*' Expression
            || Expression '+' Expression
            || Term

Term ::= Number | Variable

LRG'ler sonsuz döngüye girebildikleri için pek tercih edilmezler. Grameri LRG olmaktan çıkarmak için çözümler bile bulunmuş.
Örnek
Elimizde şöyle bir gramer olsun
Expression  ::= AdditionExpression

AdditionExpression  ::=
    MultiplicationExpression
        | AdditionExpression '+' MultiplicationExpression
        | AdditionExpression '-' MultiplicationExpression

MultiplicationExpression    ::=
    Term
        | MultiplicationExpression '*' Term
        | MultiplicationExpression '/' Term

Term    ::=
    Number
        | '(' AdditionExpression ')'

Number  ::=
    [+-]?[0-9]+(\.[0-9]+)?
Recursive'den çıkarmak için şöyle yaparız.
AdditionExpression  ::= 
    MultiplicationExpression AdditionExpressionTail

AdditionExpressionTail ::=
        | '+' MultiplicationExpression AdditionExpressionTail
        | '-' MultiplicationExpression AdditionExpressionTail

Context Free Gramerler İçin Kullanılabilen Parser Çeşitleri Nelerdir
Context Free gramerler için LL Parser ve LR parser kullanılabilir. Bu iki parser çeşidini karşılaştıran şu yazıyı okudum ama anlamadım :)

1. LL Parser
LL Parser tablolar kullanır. Look ahead (ileri bakış) kullanırsa - örneğin 2 token ileri bakıyorsa LL (2) olarak belirtilir. Producution'dan başlayarak string'e ulaşmaya çalışır. Bu yüzden top-down olarak adlandırılır.

2. LL(1) Parser
Basit bir LL(1) grameri şöyledir.
S -> F

S -> ( S + F )

F -> a
3. LL(2) Parser
Aşağıdaki örnek Y iki token öteye bakmak zorunda olduğu için LL(2)'dir.
Z-> X

X-> Y
 -> b Y a

Y-> c
 -> c a
3. LL(2) Parser'dan LL(1)'e Dönüşüm
Elimizde şöyle bir kural olsun. Element iki token öteya bakmak zorunda olduğu için LL(2)'dir.
ELEMENT ::= PREFIX > ELEMENT_OR_DATA END_TAG
Dönüşümü şöyle yaparız.

LR Parser
LR Parser string'den production'a ulaşmaya çalışır. Bu yüzden bottom-up olarak adlandırılır.


Context Free Grammar (İçerikten Bağımsız Gramer) - Nedir?

Giriş
Context Free Grammar (CFG) kuralların anlamdan ve içerikten (kuraldan önceki olayları hatırlama gibi düşünülebilir) bağımsız olmasını ifade eder. CFG'de sadece kurala göre değiştirme (substitution) işlemi yapılır ve doğal dillerdeki gibi sözcüğün önündeki ardındaki kısımlara bakılmaz. Sadece söz dizim (syntax) işletilir.

Bir diğer açıklama ise şöyle
All the production rules have a non-terminal (büyük harf) on the left hand side.
Gramer Context Free İse Dil de Context Free Olur
Açıklaması şöyle.
Just to clarify, a language is context-free when it is generated by a context-free grammar. There're SQL context-free grammar definitions online. 
Örnek 1
Şöyle yaparız.
X→aXc
X→b
Örnek 2
Yani kısaca kuralı işletmek için önceki durumu hatırlanması gerekmemeli anlamına geliyor.
S → SS
S → (S)
S → ()
context free iken
S  → abc
S  → aSBc
cB → WB
WB → WX
WX → BX
BX → Bc
bB → bb
değildir. Çünkü sol tarafta B ile ilgili kurallarda cB ve bB var. Bu durumda B'den önce gelen context hatırlanmalı c veya b içermesine göre farklı bir kural işletilmeli.

13 Şubat 2019 Çarşamba

12 Şubat 2019 Salı

Active Record Örüntüsü

Giriş
Açıklaması şöyle
Veriye erişmek için iki tane yöntem var.
1. Entity-Repository 
2. Active Record.
Aralarındaki fark şöyle

Entity-Repository 
Açıklaması şöyle. Bu aslında SpringBoot'un uyguladığı şey. Entity nesnesi sadece kendi alanlarını bilir. Veri tabanı işlemleri ayrı bir Repository sınıfındadır
An implementation of the Entity-Repository Pattern brings an Entity as a pure object and, when needed, a respective Repository class to encapsulate any of this entity's database integration and operations. Database calls can be managed by the context lifecycle and are not mixed with business logic.
Örnek
Şöyle yaparız
@Entity
public class Person {
    private @Id Long id;
    private @Column String name;
    private @Column LocalDate birthday;
    private @ManyToOne List<Address> addresses;
}

public interface PersonRepository extends <Person, String> {}
Kullanım şöyledir. Tüm veri tabanı kodları Repository sınıfında.
Person person =...; // persist a person repository.save(person); List<Person> people = repository.listAll(); // finding a specific person by ID person = repository.findById(personId);
Active Record Örüntüsü
Açıklaması şöyle.
An active record class encapsulates not only the data but also its persistence operations.
Açıklaması şöyle
When using the Active Record Pattern, the entity holds its attributes, persistence methods, and even database connection details. It is, therefore, an "active" entity that can persist and manage itself, ...
Örnek
Şöyle yaparız
@Entity
public class Person extends PanacheEntity {
 {  public String name;
    public LocalDate birthday;
    public List<Address> addresses;
}
Kullanım şöyledir. Tüm veri tabanı kodları Entity sınıfında.
Person person =...;

// persist a person
person.persist();
List<Person> people = Person.listAll();

// finding a specific person by ID
person = Person.findById(personId);


11 Şubat 2019 Pazartesi

Verilen Parametrelerin Doğruluğunu Kontrol Etmek - Validation

Verilen Parametrelerin Doğruluğunu Kontrol Etmek - Validation Check
Validation check yaparken temel yöntemler var. Bir çok çatı ve kütüphanede her 3 yöntem de kullanılıyor.

1 . Magic value dönmek 
- null , -1 gibi bir değer döner. Magic value döngü içinde kullanılan stream sınıfları için çok uygun. StreamReader. Read gibi. Ya da index döndüren IndexOf gibi metodlar için de rahatlıklar kullanılabilir.

2. Exception atmak
Normalde çağrının çalışmasını bekler. Eğer gerçekten istisnai bir durum varsa exception atılabilir.
Bir diğer tabirle crach early de denilir.

Örnek
if not file.exists() :
  throw toysOutOfPram

if not validate(file) :
  throw foodAtMummy

# do stuff with file...
Magic Value dönmek ile Exception atmak seçenekleri arasında ciddi çekişme var.
Favour exceptions over error codes
şeklinde çalışan bir ekol, ve Objective-C gibi bu yöntemi tercih etmeyen bir başka ekol var.

Ayrıca Leaky Abstraction isminde bir arayüzün atılacak exception'ları belirlememesi yönünde fikirler de havada uçuşuyor.

3. false dönmek ve bir out parametre ile gerçek sonucu dönmek
Çağrı bir şeyin olup olmayacağını kontrol etmek içinse bu yöntem kullanılabilir. Dictionary.TryGetValue gibi.

4. Özel bir sonuç nesnesi dönmek
Bu yöntemi hiç kullanışlı bulmuyorum.
interface IMyResult
{
    bool Success { get; }
    // Only access this if Success is true
    MyOtherClass Result { get; }
    // Only access this if Success is false
    string ErrorMessage { get; }
}

Validation Check Nerede Yapılmalı
Yani validation check her zaman metodun başında yapılmalı. Martin Fowler, Specification Pattern ismiyle, bu kullanımı daha da karmaşık hale getirmiş.

Validation check yaparken tek return kuralında ısrar etmek uygun değil.

Örnek
Aşağıdaki örnekte basit bir validation check var. Hata varsa metod hemen dönüyor. Yapılacak gerçek iş ise rahatça okunabiliyor.
public String getSomeValue(String arg) {

  if (arg == null) {
    return "";
  }

  ...
  ...
  ...
  valueToReturn = "some value;

  return valueToReturn;
}
Örnek
Bu örnekteyse ise validation check validation check ve gerçek iş aşağıdaki if/else ifadesinin içinde. Bu bencence okuması daha zor bir kod.
public String getSomeValue(String arg) {

  String valueToReturn = null; 

  if (arg==null) {
     valueToReturn = "";
  }  else {
     ...
     ...
     ...
     valueToReturn = "some value";
  }

  return valueToReturn;
}
Örnek
Bu örnekteyse ise validation check validation check ve gerçek iş aşağıdaki if/else ifadesinin içinde. Bu bencence okuması daha zor bir kod.
function some_fun( a ) {
    var result;

    if ( !a ) {
        result = false;
    } else {
        // some big piece of code
        // with many levels of indention
        // and so on
        if ( /*  */ ) {
            // some code
            result = 1;
        } else {
            result = 2;
        }
    }

    return result;
}
Validation Sınıfın Kendi İçinde Olmalı
Örnek
Elimizde şöyle bir kod olsun.
new ZipCode("totally invalid zip code");
Validate etmek için şöyle yapalım
ZipCodeHelper.validate("totally invalid zip code");
Bu kullanım yanlış. Validation sınıfın içinde olmalı Şöyle yaparız.
public class ZipCode {
  private String zipCode;

  public ZipCode(string zipCode) {
    if (!validate(zipCode))
       throw new IllegalFormatException("Invalid zip code");

    this.zipCode = zipCode;
  }

  public static bool validate(String zipCode) {
    // logic to check format
  }

  @Override
  public String toString() {
    return zipCode;
  }
}
Validation Check İçin Kullanılan Diğer Örüntüler
Guard ve Monad var.
Guard
Özellikle notNull, exists gibi şeylerde kullanılıyor.
public void MyAction(string param) {
    Guard.Require(param).NotNull();
}
Monad 
En az 3 karakter olmalı benzeri kurallar için kullanılıyor.
public void MyAction(User user) {
    Guard.Require(user).NotNull();
    MyBusinessValidatorForUsers(user).UserNameAtLeast3Chars();
}