27 Haziran 2014 Cuma

Ruby Dilinin Temel Özellikleri

DEĞİŞKENLER
    1. İSİMLENDİRME



Alfanümerik karakterler (A-Z, a-z, 0-9) ve alt tire ( _ ) gibi karakterler isimlendirmede kullanılabilir. Ancak değişken ve metod isimleri sayı ile başlamaz. EK olarak metod isimleri soru işareti (?) veya ünlem (!) İle bitebilir [4].


Ruby dilinde değişken ve metodların isimlerin uzunluğu konusunda bir sınırlama yoktur. Örneğin aşağıdaki kod 10000 karakter uzunluğunda bir metod tanımlamak için kullanılabilir [2]:


looong_name = "a" * 10000; # => "aaaaaaaaa.....
a_class = Class.new
a_class.__send__(:define_method, looong_name) { :hello }
a_class.new.__send__(looong_name) # => :hello

puts a_class.instance_methods.inspect # you better not run this :-)


Değişkenler ön tanımlı $!, $stderr, $FILENAME, $0, $1, $ERROR_INFO gibi anahtar kelimeler ve __FILE__, self, nill gibi ön tanımlı sabitlerle aynı isimlere sahip olamazlar.


self = 5
=> #<RuntimeError: no>


    1. TİP TANIMLARI



Değişken tipleri javascript, PHP gibi dillerde olduğu gibi dinamik olarak belirlenir [5]


a = 5
=> 5
a = “5”
=> “5”
a
=> “5”
Değişkenler numerik, string, dizi, hash gibi tipler alabilir [5]. Ruby dinamik tanımlı (dynamically typed) bir dil olduğundan, tip kontrolü, değişken çalıştırıldığında yapılır [6].


    1. KAPSAM



Ruby'de sabit kapsam (static scope) kullanılmaktadır, yani değişkenler yerel kapsamdan başlayıp, daha geniş kapsamlara adım adım giderek aranır [7]
    1. DEĞİŞKEN ÇEŞİTLERİ

Ruby dilinde genel, yerel ve örnek olmak üzere 3 farklı çeşit değişken vardır. Bir çok programlama dilinde değişkenlerin çeşitleri açıkca belirtilir. Ancak, Ruby değişken isminin ilk karakterinden, değişkenin çeşidinin çözümlenmesi yoluna gitmiştir  [1].


İLK KARAKTER
DEĞİŞKEN ÇEŞİDİ
DEĞİŞKEN KAPSAMI
$
Genel Değişken
Tüm program
@
Örnek Değişken
Nesne
[a-z] veya _
Yerel Değişken
Bildirildiği yer
@@
Sınıf Değişkeni
Ana sınıf ve alt sınıflar
[A-Z]
Sabit
Hem sınıf, hem sınıf dışı


İstisnai olarak,  daima o an çalışmakta olan nesneyi ifade eden self ve ilklendirilmemiş değişkenlere atanan anlamsız değer olan nil isimlendirme kuralına göre yerel değişkenler gibi tanımlanmış olsalar da, aslında self genel bir değişken, nil ise bir sabittir.


      1. GENEL (Global) DEĞİŞKEN

$  ile başlayan bir ada sahiptir. Kapsam olarak, genel değişkenlere yazılımın her hangi bir yerinden başvurulabilir. İlklendirilmeden önce nil değerine sahiptirler [1].


Genel değişkenler izlenilebilirdir. Bir genel değişkenin değeri değiştiğinde çağrılan bir yordam tanımlanabilir. Bu tip kullanımda, genel değişken etkin değişken olarak da isimlendirilir [1].


      1. ÖRNEK (Instance) DEĞİŞKEN

@ ile başlayan bir ada sahiptir. Etki alanı self nesnesi ile sınırlıdır. Nesne dışından değiştirilemez. Nesnedeki ilk kullanımında kendiliğinden oluşur [1].


class OrnekDeneme
 def set_foo(n)
   @foo = n
 end
 def set_bar(n)
   @bar = n
 end
end


      1. YEREL DEĞİŞKEN

Küçük harfle ya da “_” karakteriyle başlar. Yerel değişkenler genel ya da örnek değişkenlerde olduğu gibi, başlangıçta nil değerine sahip değildirler, çünkü atama yapmadan gerçekte oluşmazlar. Yerel bir değişkene yaptığınız ilk atama onu bildirmekle aynı şeydir. Eğer başlangıç değeri olmayan bir yerel değişkene başvurursanız, Ruby yorumlayıcısı bunun bir yöntemi çalıştırma girişimi olduğunu düşünür ve hata verir [1].


Genelde yerel bir değişkenin etki alanı sırasıyla aşağıdakilerden biridir [1]:
  • proc{ ... }
  • loop{ ... }
  • def ... end
  • class ... end
  • module ... end
  • yazılımın tamamı (yukarıdakilerden herhangi biri yoksa)


Örneğin, aşağıdaki kodda “bar” isimli yerel değişken loop dışından erişilmeye çalışıldığında nil değerini verir. Çünkü loop içindeki ve dışındaki değişkenler ayrı kapsamdadır ve ayrı değişkenler olarak değerlendirilirler.


loop{
 bar=45;
 break
};
bar;


      1. SINIF DEĞİŞKENLERİ

@@ ile başlar ve sınıfın tüm örnekleri tarafından paylaşılırlar. Bir sınıfı miras alan alt sınıflar tarafından da erişilebilirler [3].
Aşağıdaki örnekte @@foo değişkeninin değerini son erişen Thing2 sınıfı  değiştirmiştir.


class Parent
 @@foo = "Parent"
end

class Thing1 < Parent
 @@foo = "Thing1"
end
class Thing2 < Parent
 @@foo = "Thing2"
end


      1. SINIF SABİTLERİ

Büyük harfle başlarlar. Sabitlere bir kere değer ataması yapılmalıdır. Eğer yeniden değer ataması yapılırsa, hata değil uyarı mesajı verilir. Sabitler sınıfla beraber tanımlanmalıdır ancak, örnek değişkenlerin aksine sınıf ismiyle beraber belirtilerek (Ör. sinif::SABIT şeklinde) sınıfın dışından da erişilebilirler [1].


class Foo
 BAR = 123
end
puts Foo::BAR   
# => 123



[1]
M. Slagell and P. Yanardağ, "Ruby Kullanıcı Kılavuzu," 22 Nisan 2003. [Çevrimiçi]. Available: http://pdf.belgeler.org/uygulamalar/ruby/ruby-ug.pdf. [Erişim Tarihi: 8 Nisan 2014].

[2] Daniel Vartanov, “What's the maximum length of a method name in ruby?”, 29 Ekim 2011, http://stackoverflow.com/questions/7935867/whats-the-maximum-length-of-a-method-name-in-ruby. [Erişim Tarihi: 8 Nisan 2014].
[3] “Ruby Programming/Syntax/Variables and Constants”, Wikibooks, http://en.wikibooks.org/wiki/Ruby_Programming/Syntax/Variables_and_Constants. [Erişim Tarihi: 8 Nisan 2014].
[4] “Ruby Programming/Syntax/Lexicology”,Wikibooks, http://en.wikibooks.org/wiki/Ruby_Programming/Lexicology . [Erişim Tarihi: 8 Nisan 2014].
[5] “Ruby Programming/Syntax/Literals”,Wikibooks, http://en.wikibooks.org/wiki/Ruby_Programming/Literals . [Erişim Tarihi: 8 Nisan 2014].
[6] Tim Hoolihan, “Static vs. Synamic Scope”, 17 Şubat 2009, http://hoolihan.net/blog-tim/2009/02/17/static-vs-dynamic-scope/ . [Erişim Tarihi: 10 Nisan 2014].
[7] “What kind of scoping does Ruby use?Static or Dynamic”,Forum Ruby, https://www.ruby-forum.com/topic/91666 . [Erişim Tarihi: 10 Nisan 2014].

NOT: YTÜ - İleri Programlama Dili Dersi 2014 1. Dönem Ödevi Çerçevesinde Hazırlanmıştır.

NOT 2: Ruby 1.9 baz alınmıştır.

26 Haziran 2014 Perşembe

Ruby Dilinin Tarihi ve Çıkış Noktası

    1. DİLİN ORTAYA ÇIKIŞI

Ruby, Yukihiro Matsumoto tarafından 24 Şubat 1993 yılında tasarlanmış basit ve güçlü bir nesneye yönelik programlama dilidir. Perl, Smalltalk, Eiffel, Ada ve Lisp gibi dillerden etkilenmiştir [1]. “Programcının en iyi arkadaşı” sloganıyla lanse edilmektedir.  Ruby’nin nasıl ortaya çıktığı bizzat yazarı tarafından 1999 yılına ait bir mail listesinde aşağıdaki şekilde ifade edilmiştir [2] :
Meslektaşım ile nesneye yönelik betik/komut dosyası dilinin olasılığı hakkında konuşuyordum. Nesneye yönelik betik dili çok umut verici görünüyordu. PERL biliyordum, fakat onu pek sevmiyordum, çünkü onda oyuncak bir dil havası vardı (hala da var). Daha sonra PHYTON öğrendim fakat onu da sevemedim. Onun gerçek bir nesneye yönelik dil olduğunu düşünmedim. Ondaki nesneye yönelik kavramlar sanki dilin bir eklentisi gibiydi. 15 yıllık bir dil taraftarı ve Nesneye Yönelik Programlama destekçisi olarak, gerçekten eşsiz bir nesneye yönelik, kullanımı kolay bir betik dili aradım ama bulamadım.  Bunun üzerine böyle bir dili kendim yapmaya karar verdim. Yorumlayıcıyı çalışır hale getirmek aylarımı aldı. Bir programlama dilinde olmasından hoşlanacağım, döngüler, hata yakalama, çöp toplayıcı gibi özellikleri Ruby'e ekledim. Daha sonra PERL dilinin özelliklerini bir sınıf kütüphanesinde toplayarak bunları uyguladım.”
    1. DİLİN İSMİ

Matsumoto, İngilizce “pearl” yani inci kelimesinden esinlenen Perl dilinden etkilendi ve yeni dili için de bir mücevher ismi seçmek istedi. Bir arkadaşının doğduğu ay olan Temmuz'u simgeleyen burç taşından hareketle Ruby yani yakut ismini koydu. Ayrıca Pearl (inci) Haziran'ı simgeleyen bir burç taşıdır. Bununla birlikte, yazı tipi boyutlarında Pearl 5 puntoyu ifade ederken Ruby 5.5 puntoyu ifade eder. Bu nedenlerle de Ruby ismi oldukça anlamlıdır [2].
    1. DİLİN TARİHÇESİ

Dilin ilk kararlı hali 0.95 versiyon numarasıyla 21 Aralık 1995 tarihinde lanse edilmiştir. Bunu izleyen yıllarda dilin bir çok versiyonu yayınlanmıştır: [1]
  • Ruby 1.0 (1996 Aralık) : Ard arda yayınlanan versiyonlardan sonra 25 Aralık'ta yayınlandı.
  • Ruby 1.2 (1998 Aralık)
  • Ruby 1.4 (1999 Ağustos)
  • Ruby 1.6 (2000 Eylül)
  • Ruby 1.8 (2003 Ağustos) : 10 yıl geçerli kaldıkran sonra 2013'te desteği sonlandırılmıştır.
  • Ruby 1.9 (2007 Aralık) : GPL yerine BSD lisansına geçildi. 1.8 versiyonu ile uyumsuzdur.
  • Ruby 2.0 (2013 Şubat) : Bir çok yeni özellik eklendi. 1.9.3 versiyonu ile geriye dönük uyumludur.
  • Ruby 2.1 (2013 Aralık)
  • Ruby 2.1.1 : 24 Şubat 2014'te yani Ruby'nin 23. yaş gününde yayınlandı.


Takashi sunumlarında Ruby'nin tarihini 5 döneme ayırmıştır. [3]:
  • Tarih Öncesi Çağ: 1993'de dil hiç bir kod olmadan kavramsal olarak ortaya çıktı. Ruby ismi seçildi.
  • Antik Çağ: Ruby'nin ilk kararlı sürümü yayınlandı. İlk makale ve web sitesi hazırlandı.
  • Orta Çağ: Dil Japonya'da yaygınlaştı. Ruby kitabları ard arda yayınlandı. Bir çok konferans düzenlendi.
  • Modern Çağ: Dil Japonya dışında yaygınlaştı.
  • Muasır Çağ: Ruby'nin zirve yaptığı ve artık tamamen kabul gördüğü zamanlardır. “Ruby on Rails” devri.


[1] "Ruby Programming Language”, http://en.wikipedia.org/wiki/Ruby_(programming_language), Erişim: 13 Mart 2014.
[2] Shugo Maeda (17 December 2002), "The Ruby Language FAQ", http://www.ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html , Erişim: 2 Mart 2014.
[3] Nick Sieger, “RubyConf: History of Ruby”, http://blog.nicksieger.com/articles/2006/10/20/rubyconf-history-of-ruby/ , Erişim: 13 Mart 2014.

NOT: YTÜ - İleri Programlama Dili Dersi 2014 1. Dönem Ödevi Çerçevesinde Hazırlanmıştır

20 Haziran 2014 Cuma

TopCoder: SRM 625 Div2 Round 1

Top Coder SRM 625 Div2 Round 1 problemi için çözümüm AddMultiply.java dosyasında. Daha iyi bir çözüm ise AddMultiplyBest.java dosyasında :




TopCoder üzerinden çözümün detayına bakabilirsiniz: http://community.topcoder.com/stat?c=problem_solution&rm=322742&rd=15858&pm=13231&cr=20029384

TOPCODER’A KATIL

19 Haziran 2014 Perşembe

TopCoder ile Programlama Yarışmalarına Katıl!

Belki duymuşsunuzdur TopCoder diye bir platform var. Tutorial vs. bir çok özellikleri olsa da, en belirgin özelliği online programlama yarışmalarına katılabilmeyi sağlaması.
Ben arada yarışmalarına katılıyorum zevkli oluyor. 2 hafta da bir Single Round Match (SRM) denilen yarışmalar düzenleniyor.  Programcılık ve algoritma yeteneğini geliştirmek ve kendini sınamak isteyenlere şiddetle tavsiye edilir.

SRM’lere belirtilen zamanda Top Coder Arena’ya giriş yaparak katılabiliyorsunuz. Arena’ya istediğiniz zaman girip alıştırma da yapabiliyorsunuz. Bunun dışında da yarışmalar düzenleniyor.
Belki bir SRM’e hep beraber katılıp skorlarımızı yarıştırırız J Java, C, C# kullanılabiliyor. Aşağıdaki linkten üye olabilirsiniz.


5 Mayıs 2014 Pazartesi

Eclipse Plugin'leri : Kod Kalitesi Araçları


CodePro AnalytiX

By Google. Comprehensive automated software code quality and security analysis toolkit CodePro AnalytiX to automatically improve software quality, reliability, and maintainability in developer applications.
https://developers.google.com/java-dev-tools/download-codepro?csw=1


Metrics plugin

CK metrics
http://metrics2.sourceforge.net/


SonarQube

SonarQube is an open source quality management platform, dedicated to continuously analyze and measure source code quality
http://docs.codehaus.org/display/SONAR/Installing+SonarQube+in+Eclipse


Bu konu hakkındaki aşağıdaki makaleyi de inceleyebilirsiniz:
Comparing Software Metrics Tools


12 Şubat 2014 Çarşamba

Tasarım Kalıpları nedir?

Tasarım kalıpları, yazılım tasarımında sürekli karşılaşılan genel sorunlara esnek, yeniden kullanılabilir, başarılı çözümler getiren bir takım hazır kalıplardır. Hazır olarak kodun içine konulup çalışabilen, bitmiş tasarımlar değildir. Çeşitli durumlarda sorunların nasıl giderileceğini açıklayan, bunlara yol gösteren açıklamalardır. Nesneye dayalı programlamada, tasarım desenleri sınıf ve nesneler arasındaki ilişkilerin en iyi şekilde nasıl olmaları gerektiğini açıklayan yöntemlerdir. Algoritmalar, tasarım deseni değildir. Çünkü bunlar hesaplama sorunlarına çözüm getirirler, oysaki tasarım desenleri yazılım tasarımı sorunlarıyla ilgilenir. [1]

Tasarım kalıpları kısaca...

  • Yazılım tasarımında karşılaşılan belirli sorunların yalın ve güzel çözümlerinin tarifi
  • Deneyimin yazılı biçime gelmiş hali
  • Ortak bir sözlük
  • Somut bir gerçekleme ya da soyut bir tarif


Bir tasarım kalıbının ana bileşenleri
  • İsim
  • Sorun : Kalıbın çözdüğü sorunun tarifi
  • Çözüm : Tasarımın bileşenleri, bileşenlerin ilişkileri, sorumlulukları
  • Tartışma/Sonuçlar : Güçlü ve zayıf yönleri, başka kalıplar ile kullanımı vs..

GoF (Gang of Four) Tasarım Kalıpları
  • Oluşumsal (Creational) : Nesnelerin oluşturulması, temsili ve ilişkilendirilmelerindeki bağımlılığı azaltmaya yönelik kalıplar
  • Biçimsel (Structural) : Sınıflar ve nesnelerin bir araya getirilerek daha büyük yapılar elde edilmesine yönelik kalıplar
  • Davranışsal (Behavioral) : Sorumlulukların nesnelere dağıtılması ve algoritma seçimine yönelik kalıplar



[1] Nedir Tasarım Desenleri?, 12/2/2014, http://www.tasarimdesenleri.com/




24 Ocak 2014 Cuma

Decorator Tasarım Kalıbı

Decorator Tasarım Kalıbı ve Kullanımı

Burada Decorator tasarım kalıbınının kullanımına yönelik örnek bir çalışma yapılmıştır. Öncelikle örnek bir uygulama verilmiş ve bu örnek uygulamadaki yetersizlikler belirtilerek, daha ideal bir tasarımın Decorator tasarım kalıbı kullanarak nasıl yapılabileceği anlatılmıştır.

Bu örnek hazırlanırken “Head First Design Patterns” kitabında verilen içecek örneğinden esinlenilmiştir. [1]

15 Ağustos 2013 Perşembe

Yazılım Kalitesi ve Test Teknikleri Sunumu

Yıldız Teknik Üniversitesinde aldığım "Yazılım Kalitesi ve Test Teknikleri" dersinde öğrendiklerimi paylaştığım eğitim sunumunu paylaşmak istedim.

Eğitim kapsamında, yazılım kalitesi, yazılım süreç iyileştirme modelleri, test teknikleri ve yardımcı test ve kalite araçları gibi konulara değinilmiştir.

5 Temmuz 2013 Cuma

İleri Algoritma Analizi Sunumu

Çalıştığım şirkette verdiğim "İleri Algortima Analizi" konulu sunumumu paylaşmak istedim. Sunum kapsamında, karmaşıklık analizi, Greedy Algoritmaları, Dinamik Programlama, Çizge Algoritmaları gibi konulara değinilmiştir.

21 Haziran 2013 Cuma

SAP BI Hata: Connection failed. The server has reached the maximum number of simultaneous connections. (RWI 00239)


Yeni rapor oluşturmak için "Document List- New- Web Intelligence" girince söz konusu hatanın çıkması üzerine bu sorunu incelemeye başladık.

Bu hata hakkındaki bulgularım şöyle:

İlgili Hata Mesajı: Connection failed. The server has reached the maximum number of simultaneous connections. (RWI 00239) 
Hata Açıklaması: Bu hata bir sunucuya belirtilen sayıdan fazla bağlantı oluşturulduğunda oluyor. Yani basit olarak anlatmak gerekirse, izin verilen bağlantı 5 ise ve 5 ayrı kullanıcı raporlama sunucusuna bağlıysa, gelen 6. kullanıcı bu hatayı alacaktır.  Ayrıca browserda birden fazla tab açıp farklı raporlar çalıştırarak bir kullanıcı sunucuya daha fazla bağlantı oluşturabilir. Buna ek olarak schedule edilmiş raporlar da bu sayıya ekleniyor.  
İzin verilen maksimum bağlantı sayısı bir parametre ile belirlenmekte. Aslında bu sunucuya aşırı yük oluşmasını engellemek için koyulmuş bir önlem. BI'ı ilk kullanmaya başladığımızda bu parametre 50'ydi. Zamanla kullanım oranı artınca bu parametreyi 300'e çıkarmıştık. Uzun zamandır da bu sayı bizim için yeterli gelmekteydi. Ancak son zamanlarda raporlama sisteminin şirket içinde kullanımının daha da artması ve sistemin müşterilere de açılmaya başlaması ile 300 sayısının, çok yoğun kullanım anlarında yetersiz kalıyor olabilir. 
Önerilen Çözüm Yolları:
1-) İzin verilen maksimum bağlantı sayısını arttırmak (maximum_connections )
2-) Cluster kullanımı ile yükü birden fazla sunucuya dağıtmak. Ayrıca CPU Core başına bir Webi Rpt Server oluşturmak. 

Bu hata ile ilgili daha ayrıntılı bilgiler için aşağıdaki linkler incelenebilir:

help.sap.com ...
businessobjectstips.com ...
90kts.com ...
wiki.sdn.sap.com ...
SAP Note 1
bobi.blog




12 Haziran 2013 Çarşamba

Yazılım Proje Yönetimi Hakkında

Çalıştığım firmada verdiğim Yazılım Proje Yönetimi eğitiminin sunumu:



12 Ekim 2011 Çarşamba

Business Objects'de Türkçe Verilerdeki Bazı Karakterlerin Düzgün Gösterilmemesi

Microsoft SQL Server 2000 veritabanına OLE DB ile bağlantı kuruyoruz. Bu veritabanında bazı türkçe verilerin düzgün görünmediğini farkettik. Örneğin "ADRES DOĞRULAMA" cümlesi "ADRES DOGRULAMA" olarak görünüyordu. Yani sorun "İ" ve "Ğ" gibi bazı Türkçe karakterlerde görülüyordu.


Aşağıdaki iki yazıda da bizim yaşadığımız soruna benzer durumlardan bahsedilmekte :
Business Objects ve Türkçe Karakterler - Enes KURT
Turkish Characters not showing correctly in universe/report - BOB Forum
Bu problem hakkında bulduğum 3 temel çözüm yolu var. Şimdi bunları açıklamaya çalışacağım.

Çözüm1: Universe veritabanına OLEDB yerine ODBC ile bağlanmak

Yukarıda linkini verdiğim ilk yazıda OLEDB veritabanı bağlantısının ODBC olarak değiştirilmesi tavsiye edilmiş. Bu da sorunu çözüyor ama belirli sebeplerden (yavaşlık, ayrıca ODBC ayarları yapılması gerekmesi gibi) bu çözümü tercih etmedik.


Çözüm2: BI Server'ın kurulu olduğu sanal makinanın "Regional and Language Options>Advanced>Language for non-unicode programs" ayarını Türkçe yapmak

İlk başta biz de problemin veritabanı bağlantısından kaynaklandığını düşündük. Sonradan gördük ki bilgisayarım (local client) 'ın regional setting değerlerini Türkçe olarak değiştirdiğimde problem Universe Designer ve Web Intelligence Rich Client programlarında çözülüyordu fakat Web üzerinden InfoView ile bağlanınca problem sürmekteydi.



Bunun üzerine BI Server'ın kurulu olduğu sanal makinanın da regional setting ayarlarını Türkçe yaptım ve Web üzerinden InfoView ile bağlanınca da problemin çözüldüğünü gördüm.


Çözüm 3: Türkçe Karakter içeren alanların SQL Server'daki collation encodinglerinin Turkish_CI_AI yapmak.

Bu çözüm Universe veritabanına OLEDB ile bağlıyken bile Türkçe karakterlerin düzgün görünmesini sağlıyor.Bu farkın nerden kaynaklandığını anlayamadım. Microsoft'un sitesinde CI, CS, AI ve AS 'nin değerleri şöyle açıklanıyo


CaseSensitivity
CI specifies case-insensitive, CS specifies case-sensitive. 
AccentSensitivity
AI specifies accent-insensitive, AS specifies accent-sensitive.