24 Mayıs 2013 Cuma

Düzenli İfadeler (Regular Expressions) ve Programlama Dilleri

Düzenli ifadeler bana her zaman çok karışık gelmiştir. Aşağıda bazı notlarım var.

Tamamen Eşleşme
boost
boost::regex_match ile verilen string'in tamamının düzenli ifadeyle uyuşup uyuşmadığı kontrol edilir. Aşağıda bu durum açıklanmış.

Örnek
#include <boost/regex.hpp>
boost::regex e ("my pattern");
if ( regex_match ("toFind", e ) )
{
    //Yes...
}
Java
String.matches(String regex) ile eşleşme kontrol edilir.

Tamamen Eşleşme ve Yakalama
boost match_result sınıfının first() ve second() metodları ile iterator kullanma
Bir diğer örnek ise tamamen eşleşme ve verilen string içindeki alanların yakalanması. Örneği boost'un kendi sayfasından aldım.Yakalama için match_result sınıfı kullanılır.Bu sınıfın first ve second metodları ile yakalanan string'e işaret eden iterator'lere erişilebilir.


Arzu edilirse eşleşen alanlar üzerinde döngüyle de dolaşılabilir. Döngünün 1'den başladığına dikkat etmek lazım.

Yakalamak için boost içinde boost::smatch what veya boost::cmatch what gibi iki farklı yapının kullanıldığını gördüm ama aralarındaki fark nedir bilmiyorum.

boost match_result sınıfının prefix() ve suffix() metodlarını kullanma
Aşağıdaki örnekte eşleşme yapılan grubun ön ve sonundaki stringleri alabilme imkanı var.



boost match_result sınıfının str() metodunu kullanma
Yukarıdaki örnekte eşleşmeyi bir string içine almak için first(), second() metodlarını kullandık. Aşağıdaki örnekte ise eşleşmeyi direkt string olarak almak için str() metodunu kullanıyoruz.
 
Java
Aşağıda ilginç bir örnek gördüm. Yakalama grubuna $1 ile erişmiş.

 
Kısmi Eşleşme
C++
C++ 11 regex: checking if string starts with regex sorusunda da gösterildiği gibi regex_search ile yapılır.
std::regex_constants::match_continuous bayrağı verilen string'in düzenli ifade ile başlaması gerektiğini belirtir.

boost regex_search (İlk eşleşme)
regex_search ile yapılır. Bu metod ile match_result sınıfı aracılığıyla eşleşme yapılan string'i alabilme imkanı vardır. İstenmezse sadece metodun döndürdüğü değere de bakılabilir.

Burada dikkat edilmesi gereken nokta smatch veya cmatch yapısı regex_search sınıfına geçilen string'e pointer tutuyorlar. Eğer C++ regex string capture sorusundaki gibi metoda temporary string geçersek hata yapmış oluruz.
smatch sm1;
regex_search(string("abhelloworld.jpg"), sm1, regex("(.*)jpg"));//hata...
cout << sm1[1] << endl;
Java
Buradaki soruda açıklandığı gibi string içindeki tüm sayıları almak için aşağıdaki örnek kullanılabilir.group() metodu ile eşleşmeyi sağlayan tüm string alınabilir.
Bir diğer örnekte ise WWW ile başlayıp : ile biten patern yakalanıyor.


Kısmi Eşleşme ve Yakalama
boost sregex_iterator - Yakalama Grubuna Sayı ile Erişme
sregex_iterator iterator sınıfı ile verilen string üzerinde döngü kurmak çok kolay. How do I loop through results from std::regex_search? sorusunda açıklandığı gibi tüm kısmi eşleşmeleri almak için aşağıdaki gibi bir kod lazım.

Java - Yakalama Grubuna Sayı ile Erişme
Aşağıdaki örnekte kısmi eşleşme sağlayan tüm parçalar döngü içinde alınabilir. Aşağıda group(1) metodunun çağırılmasının sebebi group(int) metodunda şöyle açıklanmış.
Capturing groups are indexed from left to right, starting at one. Group zero denotes the entire pattern, so the expression m.group(0) is equivalent to m.group(). 
Eğer capturing gruplama yapılmıyorsa Matcher sınıfının start() ve end() metodları kullanılabilir.
Pattern p = Pattern.compile("[A-Z]+");
Matcher m = p.matcher(data);
List<String> sequences = new ArrayList<String>();
while (m.find()) {
    sequences.add(data.substring(m.start(), m.end()));
}

Case Insensitive Çalışma
boost
  boost::regex regex ("your epxression here",boost::regex::icase);
C#
Regex r = new Regex(@"your epxression here", RegexOptions.IgnoreCase);
Java
Java ile case insensitive çalışma için düzenli ifadeye (?i) karakterini eklemek lazım. Örnek:
Ancak bu seçenek sadece ASCII kodları için çalışıyor. Eğer Unicode karakterler de bulunsun isteniyorsa (?ui) karakterlerini kullanmak lazım.
Tüm Eşleşmeleri Alma
C#
Regex sınıfı yazısına taşıdım.

Java
C#'taki kadar kolay olmasa da yukarıdaki örneklerde görüldüğü gibi döngü ile dönerek tüm eşleşmeleri alma işlemi yapılabiliyor. Matcher sınıfının find metodu kullanılırken metodun çalışma şekline dikkat etmek lazım. Açıklamadan da görüldüğü gibi Matcher sınıfı bir önceki aramada nerede kaldığını hatırlıyor.

  
Birden Fazla Satır İle Çalışma
Java
Eşleşen İfadeyi Başka Bir String İle Değiştirme 
C++ 
regex_replace ile yapılır.
regex rx("world.*");
regex_replace("hello world hello", rx, "myworld");//çıktı olarak hello myworld verir

 

11 Mayıs 2013 Cumartesi

Radar Temelleri

Radarlar ile ilgili genel bilgileri de buraya yazıyorum. Örnek bir radar olarak buradan aldığım şu bilgileri kullanacağım. Ayrıca burada da faydalı bilgiler mevcut.

Radar temelleri yazısıyla birlikte "Elektronik Harp" başlıklı yazıyı da okuyabilirsiniz.

Radar 3 boyutludur
Aşağıdaki şekili buradan aldım ve radar dalgalarının 3 boyutlu çalıştığını gösteriyor.


Çalışma Frekansları
Radarın tipine ve işlevine göre değişkenlik gösterir. Aşağıdaki şekilde arama radarlarının daha düşük frekanslarda çalışırken atış kontrol radarlarının daha yüksek frekanslarda çalıştığını görmek mümkün.

Aşağıdaki şekilde ise frekans aralıkları belirtilmiş.

Yan Huzmeler (Sidelobe)
Radar enerji yayarken ana huzmesinin dışında yan huzmeler de oluşur. Aşağıdaki şekilde bunu görmek mümkün. Yan huzme ile de cisimler tespit edilebilir.


Radar Horizon
Dünyanın eğiminden dolayı havaya gönderilen sinyaller melli bir mesafeden sonra yeryüzünden ayrılırlar. Bu da radarın ufuk ötesindeki yeryüzünü yakın sahaları görememesine sebep olur. Radar yeryüzünü görebildiği kesite "Radar Horizon" deniliyor. Aşağıdaki şekiller bu durumu gösteriyor.




Elevation Angle (Yükseliş Açısı)
Yer ile radar huzmeler arasındaki açı değeridir. Örnek olarak aşağıdaki şekli buradan aldım. Kırmızı ile yazılmış değerler yükseliş açısını göstermektedir. Açı ne kadar yüksek ise tepemde ve çok yükseklerde dolaşan cisimleri tespit edebilirim.
Örneğin TRS-22XX radarının yükseliş açısı 20 derece.  Aşağıda buradan aldığım şekilde TRS-22XX radarının gerçek kaplama değerlerini görebilirsiniz.

Gemilerde kullanılan radarların yükseliş açısı çok daha fazla olabiliyor. Örnek olarak Gabya Sınıfı Fırkateyn ve 3D Radar başlıklı yazıdaki Smart-L radarına bakabilirsiniz.


Azimuth (Kerteriz)
Azimuth aynı zamanda bearing ile eş anlamlı. Türkçesine denizcilikte kerteriz denildiğini de gördüm. Cismin yatay düzlemde kuzey'e göre  (genelde kuzey kullanılır ama başka bir referans noktası da seçilebilir) açısı demektir.

İngilizce tanımı ise aşağıda.
Bearing : Horizontal angle at a given point clockwise from a specific datum to a second point.
Datum : A numerical or geographical quantity serving a reference.

Aşağıdaki şekli buradan aldım. TRS-22XX radarının azimuth hassasiyeti 0.25 derece, yani cismin kuzeye göre bulunduğu açıyı en fazla 0.25 derece hata payı ile bulabiliyor.

Range Resolution (Mesafe Çözünürlüğü, Menzil Çözünürlüğü de denildiğini gördüm)
Radarın düz bir çizgi üzerinde arka arkaya uçmakta olan iki cismi birbirinden ayırt edebilmesi için gereken asgari mesafe. Örneğin TRS-22XX radarı aynı çizgi üzerindeki iki cismin arasında 120 metre mesafe var ise birbirlerinden ayırt edebiliyor. Yoksa onları tek bir cisim gibi görüyor. HDR radarında ise bu mesafe 150 .
TRS-22XX : 120 metre
HDR : 150 metre
RAT-31 SL : ?
RAT-31 DL : ?
FPS-117: ?


Aşağıdaki şekli buradan aldım. Şekilde radarın solda olduğunu ve sağa bakan ok yönünde dalga yaydığını farz edelim. Aynı çizgi üzerinde uçan iki uçak arasında 100 metrede az mesafe varsa geri gelen ekolar arasında çok az zaman farkı olacağı için radar iki cismi ayıramaz. Eğer 100 metreden fazla mesafe varsa ekolar arasında yeterince zaman kayması olacağı için ayırabilir.



Darbe Tekrarlama Frekansı
Darbe Tekrarlama Frekansı (Pulse Repetition Frequency - PRF) Cihazın verilen sürede (genellikle saniye cinsindendir) kaç adet darbe tekrarlayabileceğini gösterir. Güzel bir açıklama burada var. Cihaz iki darbe arasında geçen süre içinde de yansıma sinyallerini bekler. Darbe'lerin önemli özelliklerini gösteren bir şekli buradan aldım.


Darbeleri gösteren bir başka şekil ise aşağıda.
Aşağıdaki video çok eski ancak darbelerin genişliğini ve tekrarlama frekansını çok güzel anlatıyor.


Bir cisimden gelen her yansıma radar tarafından voltaj zıplaması olarak görülür.



TRS-22XX :?
HDR :4 ms
RAT-31 SL : ?
RAT-31 DL : ?

FPS-117: ?

Kalem Demet (Pencil Beam)
Huzmeler ince bir kaleme benzediği için böyle isimlendirilmiştir. Aşağıda bir animasyon görmek mümkün.

Burn Through Saha
"Burn Through" mesafesi karıştırma ile karşı karşıya kalan bir radarın sağlıklı  tespit yapabildiği en uzak mesafedir. Karıştırma yapılsa bile hava aracının yansıttığı ekoları gürültü ile sönümlendirmek artık mümkün olmayabilir. Bazı radarla bu mesafeyi artırmak için Burn Through saha tanımlayabilirler. Radar anteni dönerken bu sahaya daha güçlü sinyaller ışıyarak karıştırmayı aşmaya çalışır.

Clutter  (Yansıma Sinyali)
Radarlar bulundukları ortama göre yerden, denizden ve havadan birçok yansıma sinyali alabilirler. Bunları gerçek hedeflerden ayırmak gerekir. Aşağıdaki şekilde yansıma sinayali ile hedefleri ayırd edebilmenin önemini görebiliriz. Yansıma sinyalini elemek için MTI (Moving-Target Indicator) filtreleri kullanılır. Böylece belli bir hızın altında hareket eden yansımalar kullanıcıya gösterilmeden elenirler.



10 Mayıs 2013 Cuma

Spring Security


Spring Security Yükleme
Is there a Spring Security default configuration file name?   sorusunda Spring Security ayarlarını yüklemekle ilgili verilen cevapta ayarları yüklemek için verilen seçenekler arasında bence en kolay olanı contextConfigLocation yöntemini kullanmak.



XML Dosyasının İçi
Aşağıda küçük bir örnek var.

Kimlik Doğrulama

Kimlik Doğrulama İçin Token ile İstekte Bulunma
Spring kimlik doğrulama için AuthenticatonProvider arayüzünden türeyen ve doğrulama işlemini gerçekleştiren sınıflar sunuyor. Benim en çok işime yarayan ActiveDirectory ile kimlik doğrulamayı sağlayan ActiveDirectoryLdapAuthenticationProvider sınıfı. Aşağıda bu sınıfın hiyerarşisi var.


Kimlik Doğrulama Sonucu

Kimlik doğrulama işlemi sonucunda yine bir Authentication nesnesi döndürülür. Aşağıdaki şekil ile durumu görmek mümkün.

Wicket ve AuthenticationManager
Wicket ve AuthenticationManager ile aşağıdaki gibi ilişkilendirilir. WebApplication sınıfı ilk defa bağlanan tarayıcı için newSession metod aracılığıyla bir session nesnesi yaratılmasını sağlar. Session nesnesi tarayıcının gönderdiği locale bilgisini saklar. Aşağıdaki kod parçasında bu durumu görebiliriz. Eğer tarayıcı Türkçe ise locale tr_TR, İngilizce ise en_US olacaktır.



Bir başka şekil ise aşağıda

Verilen Kullanıcıyı Bulma

Bu iş için UserDetailsService arayüzü kullanılıyor. Buradaki örnek soru çok açıklayıcı.

Spring Security Authentication Bridge

Spring Security'nin sadece Authentication hiyerarşisini gösteren kısmı buradan aldım ve aşağıya ekledim.

Bir çok uygulama Spring Security ile gelen diğer ek işlevlere ihtiyaç duymaz.  Örneğin Spring ile gelen Interceptor modelini buradan aldım ve aşağıya ekledim. Şekilden de görüldüğü gibi Interceptor modeli AuthenticationManager'a sadece ucundan dokunmaktadır ancak bir çok uygulamanın bu kadar kapsamlı paketlere ihtiyacı yoktur.



Apache Wicket ile verilen örneklerde bu tarzın benimsendiğini gördüm. Sadece Spring Security'nin gerekli kısmını içine almak için buradan aldığım ve aşağıya eklediğim örnekteki gibi bir köprü kullanır.
Köprü vasıtası ile Spring Authentication paketlerini rahatça kullanma imkanı doğar.

Http ve Spring Security Authentication Bridge

Yukarıdaki anlatımda Http protokolü olmadan Spring Security Authentication kullanılabileceğini farz etmiştim. Örneğin masaüstü bir Swing uygulaması gibi. Ancak işin içine Http girince Spring Security ile gelen Filter Chain'i de resme dahil etmek gerekiyor.

Spring Security ile teferruatlı bir Http filtre zinciri de geliyor. Aşağıda bu filtrelerin önceliklerini gösteren bir şekil var. En üstteki filtre ilk çalışması gereken filtre.

SecurityContextPersistenceFilter

Http protokolünün kullanıldığı ortamlarda bir kere authentication işlemi yapıldıktan sonra diğer istekler için tekrar authentication yapılmasın ve önceki bilgiler Http Session'dan alınsın isteniyorsa SecurityContextPersistenceFilter filtresini kullanmak gerekiyor. Bu filtrenin Spring 2.0'daki ismi HttpSessionContextIntegrationFilter idi.

Filtrenin çalışma prensibi burada anlatılıyor. Bu filtrenin default çalışma şeklinde buradan aldığım şekilde de görüldüğü gibi SecurityContext her bir istek için o isteği işleyecek thread'in threadlocal alanına atanıyor.
UserNamePasswordAuthenticationFilter

Bu filtre ile buradan aldığım aşağıdaki şekildeki gibi şifre doğrulama işlemi yapma ve AuthenticationSuccessHandler arayüzünü kullanarak doğrulama işleminden sonra şifre değiştirmeyi talep etme gibi işlemleri yapmak mümkün.

 
Görüldüğü gibi Spring Security kapsamlı ama ister istemez kendini yazılımın bir çok noktasına dahil ediyor.

7 Mayıs 2013 Salı

Ellipsis Operatörü

Bu operatör fonksiyona bilinmeyen sayıda arguman geçileceğini gösterir.

Java
Örnek:
Burada dikkat edilmesi gereken nokta, bu metoda ArrayList geçilirse, tek bir nesne gibi algılanır. Çünkü arka tarafta parametre olarak verilen nesneler bir Object[] içine dolduruluyor ve metod çağırılıyor.