Archive for: October, 2011

Android’de XMPP Client Geliştirme

Oct 23 2011 Published by under mobile

Android’de bir chat uygulaması yazmak isterseniz bu yazı tam da sizin için diyebilirim. Öncelikle bir chat sunucusuna ihtiyaç var. Bunun için OpenFire biçilmiş kaftan zira açık kaynak kodlu (GPL ile lisanslı), yönetimi kolay ve güvenli. Üstelik GTalk ve Facebook dahil piyasadaki chat uygulamalarının bir çoğu bu sunucuyu kullanıyor.

XMPP client geliştirmek için İlk olarak OpenFire sunucusunu bilgisayarımıza kuruyoruz.  (http://www.igniterealtime.org/projects/openfire/) Sunucuyu kurduktan sonra başlatıyoruz:

Sunucu kısmını hallettikten sonra client tarafına geçebiliriz.  XMPP client için en uygun kütüphane SMACK API. (http://www.igniterealtime.org/projects/smack/) SMACK jar’larını aldıysak Android uygulamamızı geliştirmeye başlayabiliriz.

Chat sunucusuna bağlanmak için:

Chat uygulaması icin bir login ekranına ihtiyacımız var. Android’de ekrana bileşenler ekleyip onlardan değerleri almayı bildiğinizi varsayarak bu kısmı atlıyorum. (http://developer.android.com/guide/index.html)

Login ekranından aldığımız kullanıcı ismi ve şifreyle Openfire sunucusuna bağlanmak için (login başarısız olduğunda XMPPException atar.):

Login olduktan sonra ulaşılabilir (available) olduğumuzu da sunucuya göndermemiz gerekiyor:

Eğer giriş yapan kullanıcı OpenFire sunucusunda herhangi bir gruba üye değil ise default grup yaratıyoruz:

Giriş yaptıktan sonra arkadaşlarımızı görmek için önce chat gruplarına ulaşıyoruz. (Grupları listelemek için String RosterGroup.getName() metodunu kullanabiliriz.

Grup üyesi olan kullanıcıları listelemek için:

Listelenen kullanıcıları da hallettik. Artık chat yapabilmek için yeterli altyapıya sahibiz. Chat yapmak için ChatManager sınıfına ihtiyacımız var:

Kullanıcının üzerine tıklandığında yeni bir chat başlatmamız gerekiyor. İlk parametre chat’in ismi. Yani chat yaptığınız kullanıcının ismi. İkinci parametre şimdilik önemsiz.

Chat yarattıktan sonra gelen mesajların ekranımızda görünmesi için bir Listener’a ihtiyacımız var:

Send tuşuna basıldığında yazılan mesajı göndermek için:

Chat için ihtiyacımız olan metodlar bunlar. Ancak tabii bir chat uygulamasının login olan kullanıcının bir dahaki girişinde isterse kullanıcı ismi ve/veya şifresini hatırlatma ve gönderilen mesajların history’sini kaydetme gibi özelliklerinin olması gerekmektedir. Android’de DB işlemleri için SQLite kullanıyoruz. DB yaratmak için SQLiteOpenHelper sınıfından extend eden bir sınıf yazabilir ve SQLiteDatabase sınıfıyla da scriptlerinizi çalıştırabilirsiniz. Ayrıca kullanıcının kendisinin sisteme kaydolması için de gerekli metodlar Smack API’de mevcut.

Yukarıdaki işleyişin doğru çalışması için OpenFire chat sunucusundan grup yaratmanız ve kullanıcı eklemeniz gerekmektedir. Bu işemlerin ekran çıktıları aşağıdadır:

Kullanıcı listesi: (OpenFire sunucusu admin ekranı)

Bu API ve yukarıdakilerle aşağıda ekran çıktılarını bulabileceğiniz türden bir uygulamayı çok rahat yazabilirsiniz:

Login ekranı:

Arkadaş listesi ekranı:

Konuşma penceresi:

Comments are off for this post

Scrum’da User Story nedir ?

Oct 16 2011 Published by under agile

Scrum’da “User Story”‘ler kullanıcı ile sistem arasındaki etkileşimi anlatmak için kullanılan ve kullanıcının kazancını  vurgulayan metinlerdir. Bir “user story”, yazılım geliştiricinin harcayacağı eforun tahminini yapabilmesi için gereken bilgiyi içeren ve bir gereksinimden daha üst düzeyde olan tanımlamadır. “User Story”‘leri daha iyi anlamak için kendinizi müşterinin yerine koymanız gerekmektedir. User Story’ler “use case”‘ler veya senaryolardan daha küçük parçalardır ve bunları yazılımcıların kendisi değil projenin sahibi yazar.[3] Bir insanın birkaç dakika içerisinde yazabileceği kadar basit ve anlaşılabilirdirler. Fonksiyonel olmayan gereksinimleri de kapsamalıdırlar. Bir story yazıldığında ona ne kadar efor gerektiğinin tahmini yapılabilmelidir. Aksi halde amaca hizmet etmemiş olur. Efor tahmini “Story Point” denilen birimle ifade edilir. Yazılım takımı içerisinde ortalamalar alınarak bu “Story Point” zamana dönüştürülür ve bu dönüşüm sonucunda her bir story’ye zaman verilebilir. Proje sahibi tarafından her bir story’ye bir öncelik de verilmelidir. Genel pratiklerde her bir story’nin kendine özgü bir id’si olmalıdır. “User Stories Applied” [1] isimli kitabında Mike Cohn şöyle bir format önermiştir. (çalıştığım takımda da bu formatı kullanıyoruz.)

………. (rol) olarak ……… (herhangi bir şey) yapmak istiyorum böylece ……… (kazanç)

örnek:

Kütüphane görevlisi olarak kitap ismine göre arama yapmak istiyorum böylece bir kitabın bilgilerine çok çabuk ulaşabileceğim.

Öğrenci olarak kütüphane abonelik kartı almak istiyorum böylece kütüphaneden ödünç kitap alabileceğim.

İyi bir “User Story” INVEST denilen modeli kullanır.

Independent (bağımsız) : Bağımlılıklar azdır. Bu da planlamayı kolaylaştırır.

Negotiable : (tartışılabilir) Üzerinde tartışılabilir. Böylece detaylandırılabilir.

Valuable: (değerli) Müşteriye bir değer sağlar.

Estimatable: (tahmin edilebilir) Çok büyük veya anlaşılmaz olursa efor tahmini yapılamaz.

Small: (küçük) Bir haftadan daha kısa sürede takım tarafından gerçeklenebilir.

Testable: (test edilebilir) Kabul edilme kriteridir.

“User Story” yazarken en sık karşılaşılan hatalar şunlardır. Birinci hata metnin çok fazla gereksiz bilgi içermesidir. Bu durum metnin tartışılabilmesini ve “yapılacaklar listesi”nin çıkarılabilmesini zorlaştırır. Çok fazla gereksiz bilgi içermesi aynı zamanda story’nin kabul edilme kriterini içeren bilginin kaybolabilmesine neden olur. Bir takımın bir story üzerinde çalışabilmesi için öncelikle kabul edilebilme kriterini bilmesi gerekir. Bir diğer hata kabul edilebilme kriteri ile test senaryolarının birbirine karıştırılmasıdır. Kabul edilebilme kriteri şu soruya cevap verir: “Bu story’yi bitirdiğimi nasıl bileceğim?”. Test senaryoları şu sorunun cevaplarını içerisinde barındırır : “Bu story’yi nasıl test edeceğim ve test adımları nelerdir?”. Bir story üzerinde takımın çalışması sonucunda hem kabul edilme testleri (acceptance tests) hem de test senaryoları (test cases) eklenir. Peki “user story” her çalışma metodolojisi için uygulanabilir ve/veya faydalı bir metin midir? Duruma göre değişir. [2] Eğer bir takım iteratif yaklaşım uyguluyorsa (agile) o takım için “user story” veya “use case” bire birdir. Eğer o takım büyük gereksinimlerin tepeden aşağıya kadar en ince ayrıntısıyla geldiği waterfall yöntemiyle çalışıyorsa user story o takıma pek bir anlam ifade etmez.

 

kaynaklar:

[1] User Stories Applied: For Agile Software Development (Mike Cohn)

[2] http://www.scrumalliance.org/articles/169-new-to-user-stories

[3] http://www.agilemodeling.com/artifacts/userStory.htm

 

Comments are off for this post

Unix ve C’nin en önemli geliştiricilerinden Dennis Ritchie hayatını kaybetti

Oct 13 2011 Published by under software development

Unix’in ve C programlama dilinin en önemli geliştiricilerinden bir tanesi olan bilim adamı Dennis MacAlistair Ritchie 8 Ekim’de hayatını kaybetti. Kendisini saygıyla anıyorum.

Comments are off for this post

Google’dan Javascript’e rakip : Dart

Oct 12 2011 Published by under software development

Google web uygulamaları geliştirmek için tasarlamış yeni programlama dili Dart’ı duyurdu. Google’ın Dart’ı duyururken hedeflediği şeyin basitlik, esneklik ve kolay öğrenilebilirlik olduğunu söyleyebiliriz. Kolay öğrenebilir olması için de syntax’ı javascript ve java’ya benzeterek milyonlarca javascript/java geliştiricisini hedeflediğini görüyoruz. Göze çarpan en önemli özellik ise isteğe bağlı tip tanımlama (optional types). Yani yazılımcı isterse statik olarak tipleri tanımlayabilir ya da tip tanımlamadan değişkenlerini tanımlayabilir. Google’ın iddiasına göre tip tanımı olmadan yazılan bir prototip uygulama karmaşıklaştıkça tip tanımlanan modüler bir uygulamaya dönüştürülebilir. Bu dönüşümün de sancısız olacağı görüşündeler. (ne kadar objektif olduklarını zamanla göreceğiz.) Sınıflar java’da olduğu gibi tek bir sınıftan türeyebiliyor ama birden fazla arayüzü implement edebiliyor. Bir sınıfı birden fazla sınıftan türetme (multiple inheritance) özelliği yok. İsteğe bağlı tip tanımlama özelliğini şu şekilde örneklendirebiliriz:

Tip tanımsız:

Tip tanımlı:

Dart’ı kullanmanın üç yolu var. Birincisi Dart kodunu javascripte dönüştürüp yeni bir tarayıcıda (chrome, firefox 4’ten sonrası, safari 5’ten sonrası) çalıştırmak. İkinci yol sunucu tarafında bir virtual machine üzerinde çalıştırmak. Sonuncu yol ise küçük Dart programlarını Dartboard denilen araç ile (firebug’a benziyor) tarayıcının içerisindeki bir pencereden çalıştırmak.

Bir Dart programını direk html’in içerisine de ekleyebilirsiniz. Bunun için #import veya #source kullanılabiliyor. Dart’la birlikte yeni bir MIME tipi de geldi:“application/dart”:

<html>
<body>
<script type="application/dart">
main() {
Element element = document.getElementById('message');
element.innerHTML = 'Hello from Dart';
}
</script>
<div id="message"></div>
</body>
</html>

Daha fazlası için Dart spec’i : http://www.dartlang.org/docs/spec/index.html

Comments are off for this post

Ruby on Rails (RoR)

Oct 11 2011 Published by under software development

Ruby on Rails kullanım kolaylığı olan, programcıların hızlı ve kolay web uygulamaları geliştirmesini amaçlayan, MVC tabanlı, açık kaynak kodlu bir yapıdır. Şu an bu yapıyı kullanan sitelere bakarsak (Twitter, Basecamp, Github, Groupon, Shopify, Yellow Pages..vs.) framework’ün gücünü hissedebiliriz. Rails 2003’te David Heinemeier Hansson tarafından yazıldı. Şu anda 1800 civarında yazılımcı ve büyük bir ekosistem tarafından destekleniyor. Eğer gerçekten kod güzelliği sizin için önemliyse hatta yazdığınız koda şiirine hayranlıkla bakan bir şair gibi bakıyorsanız, o zaman Rails’a tam da sizi düşünerek tasarlanmış bir yapı diyebiliriz. “Enterprise bir uygulamada yazılan kod, çirkin, güncellenmesi zor ve pahalı olmak zorunda değil!” sloganına sahip Rails’ın syntax’ını daha önce programlamayla az çok ugraşmış herkes birkaç günde öğrenebilir. Rails’i biraz daha anlamak için kendi reklamlarını yaparken maddeler halinde yazdıkları özelliklerden bahsetmek gerekebilir. Bu özellikler: MVC, Don’t Repeat Yourself, Dynamic Languages, Convention over Configuration, Object Relational Mapping ve Testing Tools. Ayrıca hemen hemen tüm açık kaynak kodlu javascript kütüphanelerini (Sproutcore, JQuery, Prototype, Dojo, MooToo, ExtJS..vs.) ve veritabanlarını (mongoDB, Cassandra, MySQL, Redis, PostgreSQL, CouchDB..vs.) destekler. Rails 3’le gelen ve bağımlılık yönetimini düzenleyen Bundler yapısı da acı çekmeden tüm bağımlılıkların kolay yönetilebilmesini sağlar. Plugin yükleme mantığı sayesinde çoklu dil desteği,arama ve sorgulama, istatistik, loglama, güvenlik ve test araçları gibi birçok özellik hızlı bir şekilde web uygulamasına eklenebilir. Şu an halihazırda 1614 plugin (http://agilewebdevelopment.com/plugins) bulunuyor ve gün geçtikçe sayıları artıyor.

Bir çok web framework’ü gibi MVC mimarisine sahip bir yapı olan Rails, model, view ve controller’ları otomatik yaratan araçlara sahip. (scaffolding). Bu araçlar sayesinde basit bir CRUD uygulaması çok hızlı bir şekilde geliştirilebiliyor. Framework’ün yapısına baktığımızda ise nesneleri DB’yle ilişkilendirmek için tasarlanmış ActiveRecord, web servis sağlayıcısı ActiveResource, ActionPack, ActionSupport ve ActionMailer gibi bir çok farklı pakete ayrıldığını ve bu paketlerin extension’lariyla plugin’ler geliştirilebildiğini görüyoruz.

Bu yazılanlardan sonra Rails hala ilginizi çekmediyse yazının devamını okumama özgürlüğüne sahipsiniz. Ama eğer “Güzelmiş, bir göz atmakta fayda var” diye içinizden mırıldanıyorsanız ilk yapmanız gereken şey Ruby’yi indirip yüklemeniz. (http://rubyforge.org/frs/?group_id=167). Ardından Ruby’nin standart paket yöneticisi olan RubyGems için aynı şeyi yapmalısınız. RubGems’in işletim sistemlerindeki paket yöneticilerinden pek bir farkı yok. (apt-get, emerge..vs.) RubyGems’i de yükledikten sonra tüm Rails’i ve bağımlılıklarını komut satırından

yazarak yükleyebilirsiniz. Kurulum işlemleriniz de gördüğünüz üzere en az framework kadar kullanıcı dostu. Kurulumlar bittikten sonra uygulamanızı yaratmaya başlayabilirsiniz. Uygulamanın iskeletini yaratmak için komut satırından

sunucuyu başlatmak için ise

ve

komutlarını çalıştırmanız yeterli. Artık uygulamanız http://localhost:3000 üzerinde çalışıyor. http://localhost:3000’i açıp oradaki talimatları yerine getirin.

Artık bir Ruby on Rails 3.0 ile yaratılmış bir uygulamanız var. Bu uygulamayı NetBeans veya Eclipse üzerinde geliştirebilirsiniz. 2007 yılından bu yana Eclipse desteği olmasına karşın uyumsuzluk sorunları yaşarsanız NetBeans’e geçmenizi tavsiye ederim. NetBeans’i yükleyip açtıktan sonra “New Project”‘e tıklayıp “Ruby on Rails Application with Existing Resources”‘a tıklayın ve komut satırından yarattığınız uygulamanın dizinini belirtin. (Not: Rails 3.0’dan sonrasını kullanmak istiyorsanız Ruby Platforom’dan Manage’e tıklayıp
Ruby directory’si olarak Ruby 1.8.7 ve sonrasını göstermeniz gerekmektedir.)

Uygulamayı NetBeans’e import ettikten sonra Model, View ve Controller’larınızı komut satırı yerine NetBeans üzerinden yaratabilirsiniz.
(http://netbeans.org/features/ruby/index.html)

Referanslar:
http://netbeans.org/features/ruby/index.html,
http://guides.rubyonrails.org/getting_started.html,
http://rubyonrails.org/documentation,

Comments are off for this post

Başlarken

Oct 11 2011 Published by under other

Bu blog’da profesyonel bir yazılım uzmanı olarak yazılım’dan, amatör bir müzisyen olarak müzikten, bir okur-yazar olarak kitaplardan, herhangi biri olarak da canım ne isterse onlardan bahsedeceğim. Okumama özgürlüğünüzü istediğiniz an kullanabilirsiniz.

Saygılar,

Yalçın Yenigün

Comments are off for this post