Defterdeki o kayıt National Museum of American History'de sergilenmektedir.
Kutluhan Metin's Personal Blog
17 Şubat 2014 Pazartesi
Neden "Debugging" deniyor?
1951 yılında Grace Hopper isimli bilgisayar bilimcisi UNIVAC adındaki devasa bilgisayarı programlıyordu. Bir gün sistemin çalışması aniden durdu. Hopper, problemin bir kelebek yüzünden oluştuğunu buldu. Sistem kayıt defterine bu hatayı "bug" olarak kaydetti. Bu zamandan beridir bilgisayar problemleri "bug" olarak isimlendirilmektedir.
Defterdeki o kayıt National Museum of American History'de sergilenmektedir.
Defterdeki o kayıt National Museum of American History'de sergilenmektedir.
Computer Graphics Rendering Pipeline
If you're a newbie in Computer Graphics and OpenGL probably your mind is confused about rendering pipeline. In this post I'll simply and fundamentally try to mixture mathematical basics of computer graphics and OpenGL rendering logic.
Think of an artist who tries to paint a view. What should he do? At first he should decide his sitting position (adjusting the camera) and secondly he should try to paint that 3D view onto a 2D paper (projection). Last thing he should decide is which part of the paper the view will be drawn (viewport). What an OpenGL programmer should do is a very similar to this process:
In computer graphics we represent assets as array of points. Every point is represented with 4 parameters in homogeneous coordinates, in mathematics it's represented with matrices like:
Pay attention it is not the representation on the screen. It is the representation of the asset in the real world coordinates. Screen is a 2D plane so that we need to project the asset on it. In order to do that we need to multiply it with a Transformation Matrix called Projection Matrix. We have basically two kind of projections in computer graphics:
Ortographic projection can be used in computer aided applications. You can think of Autocad or Solidworks type of applications. Perspective projections can be used in especially in games. Basically in perspective projections you can view assets relatively. As an example if you're in a plane and looking below you'll see road lines which are all the same size. But you're in a car you'll see the farthermost line as the shortest one. After you make decision between ortographic and perspective projections you need to multiply your asset (array of points) with this projection matrix. The result of this operation will give you the asset's 2D represented coordinates. Then remember that you should decide which part of the screen you want to draw this object. It is another transformation type called viewport. When you multiply the last result with your viewport matrix then you obtain the drawing of your asset on the screen.
And lastly what if you want to move the object on the screen(Translation) or want to show your asset bigger/smaller (Scaling), or want to rotate your asset? These are called viewing transformations as a whole. In OpenGL we have modelview matrix in order to do these operations. Model is our asset and view our camera. Think why both of them represented as one matrix? Because, there is no difference between rotating model about left side 45 degrees or rotating camera about right side 45 degrees. This example is valid with other situations as well. (Translation,Scaling)
I think it's been a good introduction about Computer Graphics and OpenGL.
Think of an artist who tries to paint a view. What should he do? At first he should decide his sitting position (adjusting the camera) and secondly he should try to paint that 3D view onto a 2D paper (projection). Last thing he should decide is which part of the paper the view will be drawn (viewport). What an OpenGL programmer should do is a very similar to this process:
In computer graphics we represent assets as array of points. Every point is represented with 4 parameters in homogeneous coordinates, in mathematics it's represented with matrices like:
Pay attention it is not the representation on the screen. It is the representation of the asset in the real world coordinates. Screen is a 2D plane so that we need to project the asset on it. In order to do that we need to multiply it with a Transformation Matrix called Projection Matrix. We have basically two kind of projections in computer graphics:
- Perspective Projection
- Orthographic Projection
Ortographic projection can be used in computer aided applications. You can think of Autocad or Solidworks type of applications. Perspective projections can be used in especially in games. Basically in perspective projections you can view assets relatively. As an example if you're in a plane and looking below you'll see road lines which are all the same size. But you're in a car you'll see the farthermost line as the shortest one. After you make decision between ortographic and perspective projections you need to multiply your asset (array of points) with this projection matrix. The result of this operation will give you the asset's 2D represented coordinates. Then remember that you should decide which part of the screen you want to draw this object. It is another transformation type called viewport. When you multiply the last result with your viewport matrix then you obtain the drawing of your asset on the screen.
And lastly what if you want to move the object on the screen(Translation) or want to show your asset bigger/smaller (Scaling), or want to rotate your asset? These are called viewing transformations as a whole. In OpenGL we have modelview matrix in order to do these operations. Model is our asset and view our camera. Think why both of them represented as one matrix? Because, there is no difference between rotating model about left side 45 degrees or rotating camera about right side 45 degrees. This example is valid with other situations as well. (Translation,Scaling)
I think it's been a good introduction about Computer Graphics and OpenGL.
4 Şubat 2014 Salı
Reassambling TCP Packets
If you read tcp messages like files it would work properly on local but it may not work properly with other situations. So that you should reassamble the your tcp package on client side. Here is a great article on that problem.
As a summary there are three cases:
First case, you can assume that you read perfect amount of data.
Second case, you might not read data enough.
Third case, you might read more than one message.
So, according to these cases you should examine these situations. If you read perfect amount there is no problem. If you don't read enough you should wait for the next message and merge it appropriate amount. If you read more than one message you should hold the overflow into some variable and merge it with next income packet.
As a summary there are three cases:
First case, you can assume that you read perfect amount of data.
Second case, you might not read data enough.
Third case, you might read more than one message.
So, according to these cases you should examine these situations. If you read perfect amount there is no problem. If you don't read enough you should wait for the next message and merge it appropriate amount. If you read more than one message you should hold the overflow into some variable and merge it with next income packet.
3 Şubat 2014 Pazartesi
Implementing A Circular Buffer (Ring Buffer)
A ring buffer is generally used in streaming applications such as music streaming or video streaming. When you stream media from somewhere the bytes of the media will be written on a ring buffer and after it received by the client new data will be written on the buffer. So that you will use a fixed-size data structure and will be able to do real-time streaming without using a big data structure which is not very easy to handle when it comes from the socket.
General implementation of a ring buffer
There are two cases while reading/writing from/to a ring buffer:
First one is as you guess, is to write/read directly as if our ring buffer is an ordinary buffer. This case is suitable if income data doesn't causes overflow. If ring buffer overflows after incoming data you must have another case to handle it. This is the second case and it is very comprehensible as well as the first case. If your data overflows then push it from the beginning of the data structure. And in both cases you should adjust your begin/end indexes (or you can use pointers). These indexes holds the address/index of the last data on the buffer.
I implemented my own ring buffer data structure using C++ language like this:
19 Aralık 2013 Perşembe
Microsoft Teknolojileri Etkinligindeki Sunumum
Bugün bölümdeki msp arkadaşlarımızın düzenlediği etkinlikte ben de Kinect oturumum ile katkı vermeye çalıştım. Aslında bu etkinliğin amacı Teknopark'ta haftasonu ERU ACM, Erciyes Teknopark ve Microsoft'un ortaklaşa düzenleyeceği en uzun gecede yapılacak hackhaton etkinliğine gitmeden Windows Phone uygulama geliştirmeye giriş yapmaktı, bu açıdan Kinect biraz ekstra oldu :) umarım faydalı olmuştur. Kod yazmadık belki ama örnek projeleri inceleme fırsatımız oldu. Etkinliğe katılan herkes en azından basit düzeyde Kinect ile uygulama (hatta oyun :)) yazabilir duruma geldi diye düşünüyorum. Etkinlikte anlatmaya çalıştığım (hazır) uygulamalara tekrar göz atmak isterseniz diye linklerini ekliyorum:
Eklem açılarına ulaşım: http://www.uerkal.com/post.aspx?pid=107
İskelet yapısına ulaşım: http://www.uerkal.com/post.aspx?pid=96
Temel Ses Tanıma İşlemleri: Speech Basics
Hackhaton'da görüşmek dileğiyle :)
5 Aralık 2013 Perşembe
Socket Programming Using Boost Asio
Boost birçok uygulamada tercih edilen oldukça kullanışlı bir kütüphane.
Asio ise network uygulamalarında kullanmak için geliştirilmiş Boost'un alt kütüphanesi diyebiliriz. Daha önce Winsock Kullanarak C++ ile Socket Programlama başlığında Boost'un kurulumunun uzun olduğu ve Intelisense'in saçmalamasına sebep olduğunu bahsetmiştim. Yeni versiyonlarla (1.55.0) bahsettiğim ikinci sorun düzelmiş gibi görünüyor ancak Intellisense'in tepkisi yine biraz yavaş.
Öncelikle Windows 8 ve Visual Studio 2012 yüklü bir makinede Boost kurulumunun nasıl gerçekleştirildiğine bakalım:
Video sonunda oluşturulan konfigüre edilmiş projenin bir kopyasını saklamanızı tavsiye ederim. Böylece yeni projeler için tekrar nasıl konfigüre ediyorduk diye düşünmek zorunda kalmazsınız.
Kod kısmına geldiğimizde ise elimizde bir client bir de server var. Tahmin edeceğiniz üzere server'dan gelecek veriyi client dinleyecek. Bunları yaparken senkron bir UDP bağlantısı kullanacak. Temel bir uygulama olması adına ben yalnızca aldığım veriyi ekrana yazdırmayı tercih ettim.
Kodlaru şu şekilde: (Yorum satırlarını okursanız anlaşılır olacağını düşünüyorum.)
SyncUDPServer.cpp
SyncUDPClient.cpp
Burdaki örneği alıp Visual Studio'da compile ettiğinizde client'a string'in gelmediğini farkedeceksiniz. Bunun sebebi client'ın komut satırı parametresi olarak (hatırlatma: argc, argv) host'un adresini istemesi. Bende iki program da aynı makinede çalıştığı için host'umun adresi "localhost".
"localhost" parametresini gönderirken ister komut satırından;
SyncUDPClient.exe localhost yazabilir parametreyi elle gönderebilirsiniz.
İsterseniz proje özelliklerinde küçük bir konfigürasyonla bu işi halledebilirsiniz:
Böylece Boost Asio ile temel düzeyde, senkron çalışan, UDP üzerinden haberleşen sender ve receiver fonksiyonları yazmış olduk.
Asio ise network uygulamalarında kullanmak için geliştirilmiş Boost'un alt kütüphanesi diyebiliriz. Daha önce Winsock Kullanarak C++ ile Socket Programlama başlığında Boost'un kurulumunun uzun olduğu ve Intelisense'in saçmalamasına sebep olduğunu bahsetmiştim. Yeni versiyonlarla (1.55.0) bahsettiğim ikinci sorun düzelmiş gibi görünüyor ancak Intellisense'in tepkisi yine biraz yavaş.
Öncelikle Windows 8 ve Visual Studio 2012 yüklü bir makinede Boost kurulumunun nasıl gerçekleştirildiğine bakalım:
Video sonunda oluşturulan konfigüre edilmiş projenin bir kopyasını saklamanızı tavsiye ederim. Böylece yeni projeler için tekrar nasıl konfigüre ediyorduk diye düşünmek zorunda kalmazsınız.
Kod kısmına geldiğimizde ise elimizde bir client bir de server var. Tahmin edeceğiniz üzere server'dan gelecek veriyi client dinleyecek. Bunları yaparken senkron bir UDP bağlantısı kullanacak. Temel bir uygulama olması adına ben yalnızca aldığım veriyi ekrana yazdırmayı tercih ettim.
Kodlaru şu şekilde: (Yorum satırlarını okursanız anlaşılır olacağını düşünüyorum.)
SyncUDPServer.cpp
SyncUDPClient.cpp
Burdaki örneği alıp Visual Studio'da compile ettiğinizde client'a string'in gelmediğini farkedeceksiniz. Bunun sebebi client'ın komut satırı parametresi olarak (hatırlatma: argc, argv) host'un adresini istemesi. Bende iki program da aynı makinede çalıştığı için host'umun adresi "localhost".
"localhost" parametresini gönderirken ister komut satırından;
SyncUDPClient.exe localhost yazabilir parametreyi elle gönderebilirsiniz.
İsterseniz proje özelliklerinde küçük bir konfigürasyonla bu işi halledebilirsiniz:
Böylece Boost Asio ile temel düzeyde, senkron çalışan, UDP üzerinden haberleşen sender ve receiver fonksiyonları yazmış olduk.
20 Ağustos 2013 Salı
Okudum: Code - Hidden Language of Computer Hardware And Software
Bilgisayar yazılımı ve donanımını ve aralarındaki ilişkiyi iyi bir şekilde anlamak isteyenlerin kesinlikle okuması gereken kitaplardan biri. İlk chapterlar Braille alfabesi ve telegrafın icadını konu alıyor, elektrik sinyallerini nasıl anlamlı hale getirebileceğimizden bahsediyor. Sonraki chapterlarda logic design konularına yer veriyor. Son olarak microprocessors ve operating systems konularıyla bitiriyor Charles Petzold. Yer yer de konularla ilgili ufak ilginç bilgilere yer veriyor. Örneğin;
"Almost everyone knows a little Morse code. Three dots, three dashes, and three dots represent SOS, the international distress signal. SOS isn't an abbreviation for anything-it's simply an easy-to-remember Morse code sequence. During the Second World War, the British Broadcasting Corporation
prefaced some radio broadcasts with the beginning of Beethoven's Fifth Symphony- BAH, BAH, BAH, BAHMMMMM-which Ludwig didn't know at the time he composed the music is the Morse code V, for Victory."
Kitap Amazon'dan uygun bir ücret karşılığında edinilebilir. Ayrıca konuyla ilgili daha fazla bilgi sahibi olmak istiyorsanız NandToTetris'e de bir göz atmanızı tavsiye ederim.
Kitap Amazon'dan uygun bir ücret karşılığında edinilebilir. Ayrıca konuyla ilgili daha fazla bilgi sahibi olmak istiyorsanız NandToTetris'e de bir göz atmanızı tavsiye ederim.
3 Temmuz 2013 Çarşamba
Booken Cybook Opus unboxing, inceleme
Uzun süren e-kitap okuyucu araştırmamdan sonra geçtiğimiz ay hepsiburada'dan bir Booken Cybook Opus siparişi verdim. Bir aylık kullanıcı deneyimimi bu yazıda anlatmaya çalışacağım.
Kutunun içinden cihazımız, bilgisayar bağlantı kablosu, şık bir kılıf ve e-reader'ı eğimli tutmaya yarayan plastik bir platform çıktı:
Booken Cybook Opus'u tercih etme sebebim parlamayı en aza indirgeyen ve gözü asla yormayan e-ink teknolojisine sahip ekranı oldu. Kullandığım süre boyunca da ürünün bu özelliklerinden oldukça memnun kaldım. Gözü hiç yormadığı gibi güneşte bile asla parlama yapmıyor, bir kağıttan farksız diyebilirim, hatta dünyanın parasına aldığımız kuşe kağıda basılı kitaplardan çok çok daha iyi.
Beni hayal kırıklığına uğratan tarafı ise içinde bulunan yazılım oldu. Öncelikle yazılım oldukça yavaş çalışıyor, internetten biraz araştırdığımda ise Booken'ın sitesinden firmware güncellemesini yaptığınızda bu sorunun ortadan kalktığını söylüyorlar, ben yapmadım o yüzden bu konuda bir fikrim yok.
Cihazı almaya karar verirseniz düşünmeniz gereken ilk nokta cihazı hangi amaçla kullanacağınız. Benim cihazı almaktaki en büyük amacım ders kitaplarımı yüklemek ve okumaktı. Bunun için alıyorsanız almayın. Çünkü ders kitapları genellikle pdf formatında oluyor ve cihazın ne yazık ki pdf yazılarını büyütmek gibi bir özelliği yok. Bunun yerine zoom yapabiliyor ancak o da oldukça yetersiz kalıyor, özellikle bazen yazılımın yavaşlığından dolayı işkenceye dönüşebiliyor. Booken Cybook Opus aynı zamanda ders çalışırken altını çizme, üstüne not alma gibi alışkanlıkları olanlar için de tercih edilmemesi gereken bir ürün.
Peki bu cihazı kimler tercih etsin? Cihazın pdf'in aksine ePub formatında çok başarılı olduğunu söylemeliyim. ePub uzantılı dosyalarda yazıyı istediğiniz puntoya büyütebiliyor ve yazı stilini de istediğiniz gibi değiştirebiliyorsunuz. Yani bu cihaz roman okumak için ideal.
Cihazın bir diğer güzel yanı ise pil ömrünün oldukça uzun olması. Dosya aktarımı yaparken yaptığım şarjlar ile bir aydan fazla süredir kullanıyorum. Çünkü e-ink teknolojisinde cihaz siz yalnızca kitap sayfasını değiştirmek için tıkladığınızda yeni sayfayı getirmek için enerji harcıyor. Onun dışında bir sayfa üzerinde 3 dk ya da 5 dk kalmanız harcanan pil miktarını değiştirmiyor.
Şunu da eklemeliyim ki, internette yaptığım araştırmalarda öğretim üyelerinin cihazı makale okumak için kullandığını ve oldukça memnun kaldıklarını okudum.
Tabi bunları anlattıktan sonra herkesin aklına pdf dosyalarını epuba çevirip okusak olmaz mı sorusu gelmiştir. O konuda da biraz araştırma yaptım. Ancak bunu yapan yazılımlar da oldukça yetersiz. Bu yazılımlarla convert işleminizi gerçekleştirdiğinizde genellikle kelimeler arasında büyük boşluklar kalıyor. Aslında bu sorun ufak bir kod yazılarak çözülebilir gibi duruyor, ancak kitap bol grafiklerin olduğu şemalarla anlatılmış bir kitap ise converterlar bu noktada iyice saçmalıyor ve kitabı anlaşılmaz hale getiriyor. Yine de denemek isteyen bu konuda en iyi olduğu iddia edilen calibreyi deneyebilirler.
Sonuç olarak eğer roman okumak için alıyorsanız alın, mutlaka memnun kalırsınız; ancak diğer kullanımlar için pek uygun değil Booken Cybook Opus.
Ücretsiz epub edinebileceğiniz iki kaynak ile yazımı sonlandırıyorum:
11 Haziran 2013 Salı
"Uzaktan Fizyoterapi" adlı projemiz Tübitak 2209 kapsamında destek aldı
Sayın Yrd. Doç. Dr. Mete Çelik danışmanlığında mart ayında başvurusunu yaptığımız projemiz bugün itibariyle Tübitak 2209 kapsamında desteklendi. Sevgili arkadaşım Mert Kavi ile birlikte sene boyunca çalışmaları sürdüreceğiz. Bu güzel haberi blogumdan duyurmak istedim :) Diğer destek alan projeler için linke tıklayabilirsiniz.
18 Mart 2013 Pazartesi
II. ACM Türkiye Öğrenci Kurultayı'nın Ardından
ACM Türkiye Öğrenci Kurultayları'nın ilki geçen sene ACM Hacettepe tarafından düzenlenmişti. Hacettepe'de 2.'sini yapmaya gönüllü olmuştuk ve 15,16,17 Mart tarihlerinde 2. ACM Türkiye Öğrenci Kurultayı Kayseri'de ERU ACM tarafından düzenlendi.
ERU ACM adına oldukça keyifli 3 gündü. İlk gün İbrahim Kıvanç'ın Windows 8 workshopu ile başladık. 2. ve 3. günler ise yazılım mühendisliği (Ferhat Savcı), mobil teknolojiler (İbrahim Kıvanç), Orman Genel Müdürlüğü Web Tabanlı Yangın Yönetim Sistemi (Vehbi Tutmaz & İlhami Aydın), robotik ve özgür yazılım (Dr. Necdet Yücel) konu başlıklarıyla devam ettik. Pazar günkü oturumlardan sonra Erciyes Dağı'na çıktık ve programımız burda sona erdi.
Birbirimizle fikir ve bilgi alışverişi yapmak adına çok verimli bir kurultay geçirdiğimizi düşünüyorum. Bu alışveriş sayesinde hem Türkiye'deki chapterlar hem de kurultay bundan sonraki yıllarda adından daha da söz ettirecek hale gelecektir.
Seneye Kurultay'ı Bilkent Üniversitesi düzenleyecek. Şimdiden sabırsızlanmaya başladık doğrusu :)
Yazımı bitirirken yoğun programına rağmen bizi kırmayıp kurultayda bizle birlikte olan ACM Avrupa Konseyi üyesi Reyyan Ayfer Hocamıza çok teşekkür ediyorum. Kurultay sonrasında hocamızın göndermiş olduğu mailden alıntı yapmak istedim :)
Sana, arkadaslarina ve hepsinden onemlisi yaninizda canla basla destek veren hocaniz Mete Bey'e sonsuz tesekkurler ediyorum.""Etkinliginizde yer almis olmaktan buyuk mutluluk duydum.
Reyyan Ayfer
Seneye Bilkent'te görüşmek üzere!
14 Mayıs 2012 Pazartesi
ERU ACM ve Yeni Görevim
Blogumda ERU ACM ile ilgili bu zamana kadar herhangi birşey paylaşmamış olmama rağmen yaklaşık 6 7 aydır olabildiğince aktif rol almaya çalıştığım ve ortamından haz aldığım bir topluluk oldu ERU ACM. Bugüne kadar beraber çok iş yaptık. Öncelikle bu işlerde emeği geçen başta kurucu başkanımız Ömür Erdem olmak üzere tüm arkadaşlarıma teşekkür ediyorum. Bu tarihten itibaren Yönetim Kurulu Başkanlığı'nı devralmış bulunuyorum. Bu görev değişiminin ERU ACM ailesi için hayırlı olmasını diliyorum.
Ayrıca 2. ACM Öğrenci Kurultay'ına da ev sahipliği yapacağız. Verdiğimiz sözlerde herhangi bir değişiklik olmadığını ayrıca belirtmek isterim :))
Hep beraber nice etkinliklere!
Ayrıca 2. ACM Öğrenci Kurultay'ına da ev sahipliği yapacağız. Verdiğimiz sözlerde herhangi bir değişiklik olmadığını ayrıca belirtmek isterim :))
Hep beraber nice etkinliklere!
Kaydol:
Kayıtlar (Atom)