18 Kasım 2012 Pazar

Digraph Code - II

continues from digraph code - i ...

Also you can access the source code on GitHub

Implementation


We have a directed graph class named digraph. It holds the nodes of the graph and provides necessary functions to add/remove nodes/arcs. It also provides functions to solve some graph theory related problems. (currently only shortest path problem on non-weighted graphs). Inside it is dgNode class which holds the nodes. If you want to use digraph class as a container your data is held inside these dgNode objects. Finally we have links. Every node is responsible for keeping the arcs it sends to other nodes but they also hold a list of incoming arcs for performance reasons.

Digraph Code - I

Hi, welcome back for an English blog entry. I will be writing about stuff I coded in last moths and I think some of them will be useful for anyone interested in learning about the Linux kernel, Linux system programming or C++/STL.

Well, I wrote some code which finds the exit of a 2d maze by using a stack, back when I saw a problem in the Larry Nyhoff's book. One can call it some sort of "depth-first search". Then I enhanced it to find the shortest path possible. You can read its code on GitHub. It's very crude and may be inefficient but I was just beginning to use C++ back then.

So I later found out (in the same book) that shortest paths can be found much more easily by using breadth-first search on a directed graph (namely Dijkstra's method). And I set off to write my own digraph class right away. Well, it took more time than I anticipated but more on that below.

Finally I want to say writing a digraph class/container helped me see how the design process is important. Also I realized I had the whole encapsulation principle wrong in OOP. It took time but it was well worth it. Unfortunately some parts are a little cryptic but it works alright.

You can get the source from GitHub.

5 Kasım 2012 Pazartesi

Geçtiğimiz 6 ay

İyi günler,

Yaklaşık altı ay önce sistem admini olarak çalıştığım iş yerimden sistem programlama alanında çalışmak istediğim için ayrıldım. (eski işyerimde çalıştığım alanlar için Mayıs ayında hazırladığım eski CV’me bakabilirsiniz.) Bu sürenin bilgisayar ile ilgili olmayan işlerle ilgilendiğim iki buçuk ayı haricinde yazılım konusunda kendimi yetiştirmeye çalıştım. Aşağıda daha detaylı aktaracağım gibi temel bazı konuları öğrenebildiğimi düşünüyorum.
  1. Önceki işyerimde çalışırken network ve işletim sistemleri konusunda detaylı bilgi edinmiştim. Bu dönemde ayrıca “C Programming Language” kitabını okuma ve C bilgilerimi güncelleme fırsatı buldum. Yine bu dönemde “Reversing - Secrets of Reverse Engineering” kitabını okudum ve genel olarak CPU’ların çalışma şekli hakkında bilgi sahibi oldum. Disassembler kullanarak 32-bit x86 için derlenmiş basit kodları inceleyerek pratik yaptım. 
  2. Linux Program Development” kitabı ile memory ve dosya işlemlerine ek olarak Linux işletim sisteminin sağladığı olanakları kullanarak yazılım geliştirmeyi öğrendim. Burada öğrendiklerimle basit bir concurrent (her connection’a özel thread açan) chat server uygulaması yazdım. 
  3. Web programlama yaparken OOP konusunda deneyim sahibi olmuştum. Ama C++ ve özellikle STL konusunda bilgim olmadığı için “ADTs, Data Structures and Problem Solving with C++” kitabını okudum. Kitabı okurken yazdığım küçük programcıklardan birkaçını GitHub'da bulabilirsiniz. 
  4. Daha önce Python ile PyQt kullanarak GUI geliştirmiştim. C++ ile Qt kullanarak komut satırından çalışan bir program için arayüz yazdım. 
  5. Linux Device Drivers 3rd edition” kitabını okudum. ARP paketlerine sahte yanıtlar üreterek kendisini başka network cihazları ile iletişimde gibi gösteren basit bir network driver yazdım. Bir de basit bir char driver yazdım. Henüz gerçek bir donanım için driver yazmadım.
Örnek uygulamalar hakkında daha detaylı bilgiye ve kaynak kodlarına Kod Örnekleri bölümünden ulaşabilirsiniz. Bu örneklerin küçük olduğunun ve ancak giriş seviyesinde bilgi sahibi olduğumu gösterdiklerinin farkındayım. Daha kapsamlı uygulamalar geliştirmek için zamanım olmadı.

Orta ölçekli projelerde deneyim kazanabilmek için zod-engine isimli open-source bir proje ile bir süre uğraştım. Ama proje şu anda aktif olarak geliştirilmiyor. Proje kodunu kullanarak kendim bazı şeyler yaptıysam da şu anda paylaşabileceğim somut bir örnek yok.