Spring Profiles

Spring Profiles allow users to use various configurations, register different beans etc. Working on different environments may cause some problems or we need to run with quick setup on our development environment. To make it more clear, we can mention to database issues.

One of my colleague may change hibernate mappings. To get rid of schema compatibility problems, I want to create database schemas on every run at my development environment. When it comes to deployment releases, migration scripts will create database and schemas so I won’t need to create it programmatically.

For the sample case mentioned above, I create 2 different spring profile as following:

 

If -Dspring.profiles.active=dev is given as JVM options, dev profile is loaded. In case of not specifiying active profile explicitly, default profile is loaded as default.

For further reading, please look at following links:

 

177 Words

Run bat files as Windows Service with NSSM

I found NSSM on this StackOverflow link when I was searching for a tool to run bat files as windows service. It is really easy to use. I show you a simple usage, just follow the steps below.

Steps
  1. Download and extract it
  2. Open command window in the directory of nssm.exe
  3. Type nssm install SimpleService
  4. Set application path and display name for your batch file
  5. Click Install Service

 

nssm

Here is my simple batch script

 

.NET Framework Kaynak Kodları

* .NET Framework kullanarak uygulama geliştirirken kullandığınız hali hazırdaki methodların nasıl yazıldığını merak ediyor musunuz?
* Eminim ben olsaydım şu sınıfı bu şekilde yazardım dediğiniz olmuştur.
* Kullanılan design pattern ları merak ettiğiniz de olmuştur.
* Acaba Sort() methodu hangi algoritmaya göre sıralama yapıyor dediğiniz de olmuştur.

Olmadıysa yazının devamı sizi ilgilendirmiyor 🙂

Online olarak .NET Framework 4.5.1’e ait olan kodları gezebiliyorsunuz.
String’ten Int32’ye dönüşüm yapmamızı kolaylaştıran [TryParse](http://referencesource.microsoft.com/#mscorlib/system/int32.cs#325507e509229dbc “TryParse”);

Reference Source’un geçmişine baktığımızda
2008 tarihli Scott Guthrie’nin blog yazısı mevcut: [http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx](http://weblogs.asp.net/scottgu/archive/2008/01/16/net-framework-library-source-code-now-available.aspx)

 

Haberin duyurulduğu sitede şöyle bir açıklama yapılmış:

> we have published sources and PDBs for every major .NET framework update namely .NET framework 4.0 and 4.5. However these builds would be rendered effectively useless the moment any update to the framework was released, since the binaries on the updated box no longer matched the PDBs that were indexed on the reference source server.

Özetle, .NET Framework’üne gelen her bir update ile Reference Source sunucusundaki binaryler ile [PDB](http://en.wikipedia.org/wiki/Program_database)‘ler arasındaki uygunsuzluk oluştuğu için şu ana kadar bu sistem istenilen randıman ile işlemiyormuş. Fakat,

> Starting with .NET 4.5.1 we have radically changed the symbol indexing and publishing process to be in sync with the build process such that as and when updates are shipped , the corresponding PDBs are also updated to the reference source site appropriately.

denildiğine göre bundan sonra her bir update geldiğinde reference source sunucularındaki PDB’ler senkronize hale getirilecekmiş.

Kaynak: [http://blogs.msdn.com/b/dotnet/archive/2014/02/24/a-new-look-for-net-reference-source.aspx](http://blogs.msdn.com/b/dotnet/archive/2014/02/24/a-new-look-for-net-reference-source.aspx)

325 Words

Kısa Kısa – 1 (Metin Döndürme)

“andromeda” metninindeki karakterleri sağa kaydırdığımızda sırasıyla
“aandromed” , “daandrome” metinlerini elde ederiz.

Diyelim ki elimizde 2 adet metin var bu metinlerden birisini diğerinin kaydırılmış hali olup olmadığını nasıl tespit ederiz , daha doğrusu efektif olarak bu iş nasıl yapılır?

Şöyle yapılıyor ; döndürülmüş olduğunu varsaydığımız metninn sonuna kendisini ekliyoruz. Oluşan yeni metin içinde eğer orjinal metin varsa bu metin döndürülmüş demektir.

Örneğin; “onurbaysan” orjinal metin olsun. “baysanonur” da döndürülen metnimiz olsun. “baysan**onurbaysan**onur” metni “onurbaysan” ı içerdiği için “baysanonur” , “onurbaysan” ın döndürülmüş şeklidir diyoruz.

String text1 = “onurbaysan”; String text2 = “nurbaysano”; if (String.Concat(text2, text2).Contains(text1)) Console.WriteLine(“döndürülmüş”); else Console.WriteLine(“güzel deneme!”);

Bu kodu daha efektif hale getirmek için text1’in uzunluğu , text2’nin uzunluğundan farklı mı koşulunu eklersek kodu bir nebze daha hızlandırabiliriz.

Kaynak:
[http://stackoverflow.com/questions/2553522/interview-question-check-if-one-string-is-a-rotation-of-other-string](http://stackoverflow.com/questions/2553522/interview-question-check-if-one-string-is-a-rotation-of-other-string)

183 Words

ASP.Net MVC Custom Route

Son zamanlarda uğraştıklarımın başında [ASP.Net MVC](http://tr.wikipedia.org/wiki/ASP.NET_MVC_Framework) geliyor. MVC , açılımı Model-View-Controller olan bir örüntüdür.

***Model*** = Temel anlamıyla uygulama içinde kullanılacak olan veriler ile haşır neşir olduğumuz kısım oluyor.

***View*** = İsminden de anlaşılacağı üzere , uygulamanın kullanıcı arayüzü diyebiliriz.

***Controller*** = Model’daki verileri işlediğimiz , kullanıcı etkileşimi sonucu gerekli işlemleri yerine getirdiğimiz ve View’a gerekli verileri ilettiğimiz kısımdır.

– – – – – –

Basit düzeydeki giriş bilgilerinden sonra, anlatmak istediğim kısıma gelelim. MVC’de Özel Rota(Custom Route) yazmaktan bahsedeceğim.

ASP.Net MVC ile birlikte gelen varsayılan rota şu şekildedir:

routes.MapRoute( “Default”, // Route name “{controller}/{action}/{id}”, // URL with parameters new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } // Parameter defaults );

 

Örnek bir senaryoda bu bilgisini inceleyecek olursak; farzedelim ki bir araba sitesi yapacağız.

Controller: Araba
Action: Detay
id: Cadillac

Cadillac marka otomobilleri listelemek istiyoruz. Varsayılan rotaya göre bu işlem için URL miz şu şekilde olacaktır:

**…/Araba/Detay/Cadillac**

Fakat bu URL pek kullanıcı dostu değil çünkü kullanıcı sizin Araba controller’ı altında tanımlamış olduğunuz actionları bilmek zorunda değildir. Fakat bunu …/Araba/Cadillac şeklinde yapacak olursanız bu URL daha kullanıcı dostu olacaktır.

Bu işlem mevcut rotanın yanına ek rota tanımlayarak gerçekleştirilir. Bunu da ASP.Net MVC projemizin altında bulunan “Global.asax”  dosyasını değiştirerek yapıyoruz. Bu dosyayı açtığınız zaman varsayılan rotaya ait kod kesiminin RegisterRoutes methodu altında olduğunu farkedeceksiniz. Biz de yeni rotamızı bu methodun içinde tanımlayacağız.

routes.MapRoute( “Araba”, // Route name “Araba/{id}”, // URL with parameters new { controller = “Araba”, action = “Detay” } // Parameter defaults );

Burada dikkat edilmesi gereken en önemli husus , tanımlayacağımız rotanın , varsayılan rota tanımlamamız gerektiğidir. Çünkü aksi durumda varsayılan rota , tanımlayacağımız rotayı yoksayacaktır.

Bu durumda “*Global.asax*” dosyasında bulunan ***RegisterRoutes*** methodunun son şekli aşağıdaki gibi olacaktır.

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”); routes.MapRoute( “Araba”, // Route name “Araba/{id}”, // URL with parameters new { controller = “Araba”, action = “Detay” } ); routes.MapRoute( “Default”, // Route name “{controller}/{action}/{id}”, // URL with parameters new { controller = “Home”, action = “Index”, id = UrlParameter.Optional } ); }

422 Words

Memoization

Latince memorandum kelimesinden türeyen memoization, birden çok defa hesaplanması gereken işlemlerin sonucunun hatırlanıp, aynı işlemi tekrar tekrar yapmamıza engel olan ve bu şekilde zamandan kazanmamızı sağlayan optimizasyon tekniğidir. Klasik örnek olacak belki ama fibonacci örneğini ele alalım.

Normalde yazdığımız fibonacci sayısı hesaplayan özyinelemeli fonksiyon

int fibonacci(int n) { if (n == 1 || n == 2) return 1; else return fibonacci(n – 1) + fibonacci(n – 2); }

Yukarıdaki fonksiyonun fibonacci(5) şeklinde çağırılmasından sonra sonucu bulması için gerçekleşecek özyinelemeli çağrılar sonucunda oluşacak ağaç şu şekildedir:

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2011/11/tree.png “tree”)](http://www.onurbaysan.com/blog/wp-content/uploads/2011/11/tree.png)

 

 

Bu şekilde görüldüğü gibi 3 değeri 2 kez çalıştırılacak. Bu fonksiyonun 5 ile değil de daha büyük bir sayı ile çağırıldığı düşünülecek olursa tekrar hesaplanacak değerlerin sayısı artacaktır.

Ama eğer biz her hesaplanan fibonacci sayısının değerini bir veri yapısında tutacak olursak ve aynı işlemi tekrarlamamız gereken durumda direk sonucuna erişim yapabiliriz. Bunu da şu şekilde bir kod ile yapabiliriz.

 

//Memoization işleminde kullanılacak veri yapısı Dictionary fibs = new Dictionary(); int mFibonacci(int n) { if (n == 1 || n == 2) return 1; if (fibs.ContainsKey(n)) return fibs[n]; else { fibs[n] = mFibonacci(n – 1) + mFibonacci(n – 2); return fibs[n]; } }

 

Yukarıdaki verilen 2 farklı koda ait çalışma zamanları bilgileri aşağıda mevcuttur.

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2011/11/output-1024×324.png “output”)](http://www.onurbaysan.com/blog/wp-content/uploads/2011/11/output.png)

Son söz olarak bu yöntem ile zamandan kazanmamıza rağmen sizin de farketmiş olacağınız üzere ek bellek kullandığımız için yerden kaybediyoruz.

305 Words

İki Farklı Dosyadaki Ortak Kelimeleri Bulma – Algoritma

Bazılarınız “Bu kadar uzun başlık mı olur?” diye sorabilir , gayet normal fakat birazdan anlatacaklarımı kapsayan en uygun başlık buydu.

 

– – – – – –

Elimizde 2 adet dosya var. Bu dosyaların içinde geçen ortak kelimeleri bulmak istiyoruz. İlk aklımıza gelen genelde şunlar olur: – İlk dosyayı bir listede tutup ikinci dosyadaki kelimeleri okurken tek tek listenin içerinden karşılaştırmak olur.

– Dosyaları belleğe aktarmayız. İlk dosyadan bir kelime okuduğumuzda , ikinci dosyayı baştan sona dolaşıp bu kelimenin ikinci dosyada geçip geçmediğini kontrol ederiz.

– – – – – –

 

Zaman karmaşıklığı(Time Complexity) açısından bakacak olursak yukarıdakilerin ikisi de tek tek tüm elemanları karşılaştıracağından O(n2) karmaşıklığa sahip. Elimizdeki verilerin çok olması durumunda ciddi bir zaman kaybı oluyor.

Peki bir de şu şekilde düşünsek. İki dosyanın ilkini okuduk belleğe aldık (ki bunu hertürlü yapacağız) , ikinci dosyayı da kelime kelime okurken , bellekteki veriler üzerinde dizideki gibi O(1)’de erişim yapacak bir mekanizma olsa.

HashTable O(1)**’de erişim yapma imkanı sunduğu için , ilk dosyadaki kelimeleri HashTable da tutup , ikinci dosyayı kelime kelime okuyup karşılaştırmak , zaman karmaşıklığını O(n) e düşürüyor.

** Under reasonable assumptions , the average time to search for an element in a hash table is O(1)  [Introduction to Algorithms , 3rd edition]

Tabi burada şunu da söylemek lazım, HashTable’ın ek bir lookup table kullanacağımız için yer karmaşıklığı(space complexity) bakımından ve hash fonksiyonunda belli bir süre kaybetme bakımından bir takım eksileri var.

Neyse konuyu fazla dağıtmadan şundan bahsetmek istiyorum. C#’ta buna benzer bir şekilde çalışan bir method olarak ***Intersect*** methodu var.

Aşağıdaki resimden örnek koda ve farklı 2 methoda ait çalışma zamanı(tick cinsinden) bilgilerine ulaşabilirsiniz.

 

[![](http://www.onurbaysan.com/blog/wp-content/uploads/2011/10/test1-1024×645.png “test”)](http://www.onurbaysan.com/blog/wp-content/uploads/2011/10/test1.png)

355 Words

Pointer

                                         ![xkcd](http://imgs.xkcd.com/comics/pointers.png)

                                                                                                      *xkcd’den alıntıdır.

14 Words

C#’ta Kendi Olayımızı(Custom Event) Yazmak

Bu yazımda C# dilini kullanarak nasıl kendi olaylarımızı yazdığımızdan bahsedeceğim. Öncelikle olayın(event) ne olduğunu basit birkaç örnekle anlatacak olursak;

– GUI üzerinde button a tıklanması sonucu bir olay tetiklenir ve siz ne yapmak istiyorsanız o kod içinde onu yaparsınız.
– Timer kullanmak istediniz farzedelim tick adında bir olay mevcuttur. Diyelim ki siz her bir saat vuruşunda ekrana birşey yazdırmak istiyorsunuz. O zaman ekrana yazdırma işlemini yapacağınız kodu olayın gerçekleşmesiyle(event firing) birlikte sapılacak methodun içine yazarsınız.

Sözü fazla uzatmadan kendi olayımızı kullanacağımız senaryoyu açıklamak istiyorum. MailBox adında mesajlarımızı barındıran bir sistemimiz var. Sisteme yeni bir mesaj gelme işlemi bu senaryoda bizim olayımız olacak ve yeni mesaj geldiğinde , gelen mesajı olayını dinleyen methodumuz ekrana gelen mesajı yazdıracak.

Message adında bir sınıfımız olsun ve bu sınıfımız mesajın kimden geldiğini , mesajın içeriğini ve mesajın geldiği saati tutsun.

class Message { public string body { get; set; } public DateTime timestamp { get; set; } public string from { get; set; } public Message(string body, string from) { this.body = body; this.from = from; this.timestamp = DateTime.Now; } }

Olay tanımı yaparken delegate ten yararlanıyoruz. Delegate nedir diyenler için MSDN’deki delegate tanımı: “A delegate is a type that references a method.”

public delegate void MessageHandler(object o , MessageReceivedArgs e);

Delegate imizi tanımladıktan sonra olay tanımını şu şekilde yapıyoruz:

public event MessageHandler MessageReceived;

MailBox sınıfımızın son hali aşağıdaki gibi oluyor.

class MailBox { List messages = new List(); public delegate void MessageHandler(object o , MessageReceivedArgs e); public event MessageHandler MessageReceived; public void newMessage(Message msg) { messages.Add(msg); MessageReceived(this , new MessageReceivedArgs(msg)); } }

Yukarıdaki kod kesiminde MessageReceivedArgs tipinde nesnelerin kullanıldığı birkaç yer dikkatinizi çekmiş olmalı. Bunu da kısaca açıklayacak olursak; olayın tetiklenmesinden sonra sapılacak yordamın imzası aşağıdaki gibi olmalıdır.

sapilacakYordam(object sender, EventArgs e)

Burada kullanılan 2. parametre EventArgs tipindeki parametre yerine biz kendi yarattığımız tipimizden bir parametre geçmek istersek ; EventArgs sınıfını kalıtan yeni bir sınıf yazabiliyoruz.

class MessageReceivedArgs : EventArgs { public readonly Message message; public MessageReceivedArgs(Message message) { this.message = message; } }

En son olarak ta olayımızı test edeceğimiz ana sınıfımızın kodunu yazıyoruz.

static void Main(string[] args) { MailBox mb = new MailBox(); mb.MessageReceived += new MailBox.MessageHandler(mb_MessageReceived); mb.newMessage(new Message(“May day”, “Captain Kirk”)); mb.newMessage(new Message(“Hello world” , “Alien”)); Console.ReadKey(); } static void mb_MessageReceived(object o, MessageReceivedArgs e) { Console.WriteLine(e.message.timestamp + ” yeni mesaj geldi: ” + e.message.from + ” : ” + e.message.body); }

Kodun tamamını indirmek için [tıklayınız](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/CustomEvent.zip).

508 Words

Observer Pattern

Observer tasarım örüntüsü bir objenin durumunun değişmesi halinde , onu dinleyen gözlemcilere bu durumun bildirilmesini ele alan bir tasarım örüntüsüdür. Burada objeler ve gözlemciler arasında one-to-many ilişki söz konusudur. Bu örüntünün kafamızda daha netleşebilmesi için birkaç örnek vermek gerekirse:

 

– Event handling işlemlerinde. Örneğin bir buttona bastığınızda bir methodun çağırılması işlemi arkaplanda bu tasarım örüntüsüyle kodlanmış bir kod tarafından sağlanmaktadır.

– MVC(Model – View – Controller) mimarisinde View kısmında herhangi bir değişikliğin otomatik olarak kod kısmına yansıtılması.
[![](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/800px-Observer-300×124.png “800px-Observer”)](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/800px-Observer.png)

public interface Subject { void subscribe(Observer observer); void unsubscribe(Observer observer); void notifySubscribers(Notification notification); }

public class Center : Subject { List observers = new List(); List notifications = new List(); public void subscribe(Observer observer) { observers.Add(observer); } public void unsubscribe(Observer observer) { observers.Remove(observer); } public void notifySubscribers(Notification notification) { foreach (Observer observer in observers) observer.update(notification); } public void insertNotification(Notification notification) { notifications.Add(notification); notifySubscribers(notification); } }

public interface Observer { void update(Notification notification); }

public class Subscriber : Observer { private string name; public Subscriber(string name) { this.name = name; } public string getSubscriberName() { return name; } public void update(Notification notification) { Console.WriteLine(name + ” : New message from ” + notification.getFrom() + ” : ” + notification.getBody()); } }

Kodun tamamı için [tıklayınız](http://www.onurbaysan.com/blog/wp-content/uploads/2011/09/observe.zip).

261 Words