Remote Debugging in Java

It’s a brief tutorial how to debugging remotely in Java by attaching to running jvm.

-Xdebug: Enables debugging support in the VM
jdwp: Java Debug Wire Protocol
suspend=n : Allows jdb to connect running jvm any time
address: Any process to debug will be connected via the port number written in the address..

We configured our program to accepts debugging requests. The remaining part is about how to connect it. I use IntellijIDEA as Java IDE , so the following part contains IntellijIDEA configuration for remote debugging.

On Run/Debug configuration windows, you can add new Remote Configuration as on the image above. Port should be same with the address on the jvm options. I attached a process that runs locally on my machine, you can override it.

Sources:
http://download.oracle.com/otn_hosted_doc/jdeveloper/904preview/jdk14doc/docs/tooldocs/windows/jdb.html

 

155 Words

Creating List of Beans in Spring

Let’s think we need a list of IMoveable in a class and I need to pass it through property injection in Spring. The easiest way is:

It seems fine if you have a few items and new items won’t be added. What if you have more items (eg 100)? What if another developer add pyramidMoveableObject and forget to add it into moveableObjectList?

In these scenarios, we have prettier way to do it. I a class to find all beans which implements IMoveable interfaces, more generally find beans of given types.

I’ll use 2 interface in my class

  1. FactoryBean inteface of Spring, to create list of items
  2. ApplicationContextAware interface to access beans in my context.
Then we can create our IMoveable list through the following beans:
At the end, our scene bean looks like this:
 

271 Words

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