Yeni bir blog – arslan.io

Yeni bir blog açtım: arslan.io. Burada teknik ağırlıklı yazılar olacaktır. Bu blog’un en büyük farkı ingilizce olması. Bunu uzun zamandır yapmak istiyordum ama bir türlü fırsat bulamamıştım. Diğer bir fark ise Jekyll yerine Posthaven kullanmamdır. Posthaven kullanmamın en büyük sebebi de, kolay yazmama izin vermesi. Ayrıca Posthaven kurucuların uzun vadeli düşüncelerini de destekliyorum. Bakalım nasıl olacak o kısımda.

Neden İngilizce peki? İçimde kalmasın dedim. Hem daha fazla insanlarla irtibata geçebilme, hem de ingilizce yazma anlamında kendimi geliştirmek istediğimden ve çoğu şeyin Türkiye sınırları içinde malesef yeterince rağbet görmemesi beni bu diğer bloğu açmaya itti.

Örneğin şu yazı: QTcpServer sınıfına SSL desteği eklemek (Qt). İngilizce olsaydı muhtemelen bir çok kişinin işine yarayacaktı, halbuki bu tarz niche konuları türkçe yazmak ayağına sıkmak gibi bir şey. Kimsenin işine yaramıyor ve kimse de okumuyor.

..

Arslan.io domain ismini de alınca, bu blogu açmam için hiç bir engel kalmadı diyebilirim. Şimdiden bir kaç tane yazı yazdım. İleride çok daha fazla ve değişik yazılar paylaşacağım. İlgilenen herkesi beklerim, seveceğinizi düşünüyorum: arslan.io

13 Mayıs 2013

Subvim – Sublime Text benzeri Vim dağıtımı

Bundan bir ay önce Subvim adinda yeni bir proje oluşturdum. Sublime Text sevip de Vim’den bir türlü ayrılamayanlar benim gibi insanlar için düşünülmüştü. Proje’yi duyurduktan sonra gördüm ki benim gibi bir sürü insan varmış:

Kısacası hiç ummadığım kadar rağbet gördü. Subvim gelirsek, kendisi şöyle bir şey oluyor:

subvim screenhhost

Bir çok özellikleri mevcut:

  • SublimeText’deki renk şemasının hemen hemen aynısi (bunun için molokai.vim üzerinde kendi değişiklerimi yaptım)
  • SublimeText’deki kısa yollarının hemen hemen çoğu mevcut ve her biri ayni görevi yapiyor
  • Birden fazla imleç kullanabiliyorsunuz (multiple cursor)
  • Otomatik tanımlama. Bunun için YouCompleteMe eklentisinin ikili paketini derleyip Subvim’e dahil ettim.
  • Goto symbol/definition özelliği ile bulunduğunuz dosyada herhangi bir method, fonksiyon veya da veri tipine gidebiliyorsunuz. Bunun için de yine Ctags’in derlenmiş ikili paketini ekledim ve ctags için özel değışikler mevcut.
  • Kapatıp açtığınızda dosyalariniz, pencere konumlari aynen eski hali ile oluşturuluyor.
  • .. ve daha fazlası

Şu an için sadece Mac OS X’de çalışıyor. Ileride zamanım olursa Linux altında çalışacak şekilde özellikler ekleyeceğim.

5 Mayıs 2013

Yeni işim, yeni gelişmeler – Koding

Bundan yaklaşık iki-buçuk yıl önce “yeni bir başlangıç” başlığı ile Pardus’ta ise başladığımı paylaşmıştım. O zaman çok heyecanlı ve mutluydum. Uzun zamandır, Pardus’tan ayrıldıktan sonra ilk defa o anki mutluluğu ve heyecanı tekrardan yaşıyorum.

Yeni bir maceraya yelken açmış bulunmaktayım. Şubat ayı itibariyle Koding.com‘de çalışmaya başladım. İnanılmaz heyecanlı bir projede inanılmaz insanlarla çok güzel işler yapma fırsatı elde ettim. Pardus projesinden çok yakın iki arkadaşım (Gökmen Göksel ve Bahadır Kandemir) de Koding’de çalışmaya başladı(çok daha öncesinden). Onlarla tekrar olmak da mutlu verici bir gelişme. Koding’in kurucuları(Devrim Yaşar ve Sinan Yaşar) da bu konuda çok iyi ve işi bilen insanların olması ve en önemlisi de geliştiricilerin halden anlamaları benim açımdan daha da mutlu verici bir gelişme.

Yaklaşık iki aydır Koding için iki tane uygulama yazdım (Rails Dashboard ve Django Dashboard), iki tane uygulama geliştirmek üzereyim ve bunların üzerine uygulamaları yazarken kullandığımız KD Framework’un teknik belgelendirme sürecini de başlatmış bulunmaktayım. Bunların hepsini akşamları boş zamanımda yapmaya çalıştım. Uzun ve yorucu bir süreçti (kabul), ama özellike Devrim abinin bu süreçteki tutumu ve yaklaşımı bu işi sevmemi ve sahiplenmemi sağladı. Bundan sonra her günümü çok daha verimli ve Koding endeksli çalışıyor olabileceğim. Heyecanlı ve güzel bir iş kısacası.

Koding nedir?

Koding activity alanı

Koding’e biraz değineyim. Koding.com iki türk kardeşin kurduğu (Devrim Yaşar ve Sinan Yaşar), A.B.D, San Francisco menşeili bir şirket. Önümüzdeki sene bolca duyacağınız bu ismi bir yere not alın. Koding.com sayesinde dünyanın neresine giderseniz gidin, tek bir tıkla tüm geliştirme ortamınıza ulaşabileceksiniz. Yani bildğiniz terminal(evet kendinize ait bir Linux sanal makinesi), dosyalarınız için depolama alanı, yüzlerce farklı frameworku,vs.. gibi seçenekler mevcut. Ve size ait bir şubdomainiz bile var. Bu daha başlangıç diyebilirim. Daha inanılmaz özellikler sırayla devreye girecek.

Bu çalışma ortamını örnek vermek gerekişe şu şekilde kullanıyorum: arslan.koding.com/docs altında, Koding.com içinde uygulama yazabileceğiniz bir framework’un dokümantasyonları mevcut. Bunların son bir aydır kendim yazmaya çalışıyorum. Bu adreste yer alan dokümanların hepsi aslında bir github deposunda markdown olarak saklanıyor. Ben yeni doküman ekledikten sonra Koding’e giriş yapıp bu değişikleri terminal ile kolay bir şekilde alıyorum(git pull). Sonra bunları yine terminal altında markdoc ile html sayfalarına çeviriyorum. Ve tüm bunlar doğrudan hiç bir şey yapmadan arslan.koding.com/docs yüklenmiş oluyor. Yani anlayacağınız web sitemi buradan sunduğum gibi, geliştirmesini ve bakımını da Koding üzerinden yapıyorum. Aşağıda ise Koding içinden bu dökümanlara ulaşabileceğiniz uygulamanın ekran görüntülerini görebilirsiniz:

Koding belgelendirm

Herkes için farklı imkanlar

İnanılmaz değil mi? Fakat bununla bitmiyor. Söylece bir hayal edin ve şunları bir düşünün:

  • Sınıf arkadaşınla bir C++ örneğini denemek için Koding’e giriş yaptınız ve ikiniz de kendi sanal makinelerinizde kodu derleyip sonuçlarını gördünüz. Aynı kod parçasını beraber aynı anda düzenliyorsunuz. Onun makinesinde bilmem ne aracı kurulmamış, sende kod parçası yokmuş, gibi şeyler tarihe karıştı.

  • Netbook, ChromeOS, iPad gibi kısıtlı imkanlara sahip bir cihazdan Koding’e giriş yaptınız ve altınızdaki makine ile terminal, depolama alanı ve şahsınıza ait bir sanal makine üzerinde geliştirmenizi yapabiliyorsunuz (linode’da ssh bağlanmaktan farklı bu, ssh’e gerek yok çünkü her şey web tabanlı ve zeki, düşünülmüz bir arayüze sahip)

  • Sabah evden çıkarken çok önemli bir kodu yazmayı unuttunuz ve müşteriye eksik bir halde gönderdiniz (ya da bilgisayarınız almayı unuttunuz yanınızda!). Arkadaşınızın laptop’undan Koding’e giriş yapıp geliştirmeyi devam edip müşteriye kalan eksiklikleri tekrar gönderiyorsunuz.

  • SQL (MondgoDB, MySQL,vs..) öğrenmek istiyorsunuz, Linux nedir bilmiyorsunuz öğrenmek istiyorsunuz, Rails, Django gibi web framework’u öğrenmek istiyorsunuz, Git,Vim gibi araçları öğrenmek istiyorsunuz’vs.. her şey Koding ile mümkün! MySQL gibi bir veritabanını tek tıkla aktif hale getirebiliyorsunuz, Linux zaten terminal ile hazır kurulu geliyor,Rails kurmak tek tıklık bir şey, vs..

  • Hakkari’deki bir öğrenci, Ethiopia’daki bir genç, Güney Amerika’daki mühendisler,vs.. herkesi en kısıtlı bilgisayarla bile dünyanın en güzel teknolojilerini tek bir tarayıcı ve internet bağlantısı ile sunabiliyorsun. Bundan daha güzel bir şey olabilir mi sizce?

Evet bunları hayal edin dedim, ama bunların çoğu hayalden öte gerçek. Ve Koding ile bunları yapma fırsatı elde edeceksiniz. Önümüzdeki senelerde eğer başarabilirsek inanılmaz ve devrimsel bir ürün ortaya çıkacak. Normalde herkese uzak olan bir çok teknolojiye ulaşma imkanınız olacak.

Son durum

Koding San Francisco ofis

Önümde üç haftalık bir San Francisco ziyareti var. Oradaki ofiste 3 hafta boyunca Koding’deki backend teknolojilerini yakından takip edip üzerine bir şeyler de ekleyeceğim ve kuracağım. Hem benim açımdan da bir nevi ‘kick-start’ ölmüş olacak (işi hızlıca öğrenip, giriş yapabilmek bizim gibi uzaktan çalışan insanlar için önemli) hem de Koding bünyesinde çalışan diğer insanları da tanımış olacağım. Kuzey Amerika kıtasını da ilk defa göreceğim için o açıdan da biraz heyecanlıyım. Hadi hayırlısı.

3 Şubat 2013

Vim eklentileri (olması gerekenler)

Vim altında eklenti yazmak ve kullanmak başlı başına bir alan. Çok güçlü ve her türlü işi yapmanıza olanak sağlıyor. Aslında eklenti demek bile anlamsız çoğu zaman. Bunların her birini her gün defalarca kez kullanıyorum. Beni çok hızlandırdığı gibi dakikalar süren işlemleri saniyeler içinde yapmamı da sağlıyor. Uzun vadede ne kadar yararlı olduğunu anlatamam bile. Bu yüzden kullandığım bu eklentileri bu yazıda ayrıntılı bir şekilde anlatmaya çalışacağım.

Tüm eklentilerin ana başlığına tıklayarak ulaşabildiğiniz gibi, hepsini birden kullamak istiyorsanız benim düzenli olarak bakımını yaptığım ve bir sürü hatadan arındırılmış dotfiles deposundan da indirip kullanabilirsiniz. Mac ve Linux altında çalışacak şekilde düzenlendi (Mac ve Linux’a özgü ifdef’ler mevcut vimrc’de).

github.com/farslan/dotfiles

Yazıya başlamadan önce bir ayrıntıyı değineyim. Vim’de kısa yolları modife etmek çok kolay, bunun için de leader diye bir özellik de mevcut. vimrc de böyle bir değişken tanımlayıp bir karakter atayabiliyorsunuz (örneğin benim leader tuşu , karakteri.)

Kullandığım eklentiler ile hep bu tuş ile kullanıyorum, bu yüzden de örneklerimde hep ,a , ,,w, ,g vs.. gibi kombinasyonlar göreceksiniz. Örneğin ,n kombinasyonu önce , tuşuna sonra da n tuşuna basmak anlamına geliyor.


ack

Bu en sevdiğim eklentiler arasında ilk beşe girer. ack-grep adında, grep tarzında bir uygulama var. Kullanmadıysanız tavsiye ederim. Bu grep‘ten farklı olarak öntanımlı olarak bir çok önemli parametlerle geliyor, örneğin recursive olması,.svn ve .git gibi klasörleri atlaması, binary’leri atlaması,vs..

Bu eklenti ile doğrudan vim altından ack-grep çağırabiliyorsunuz. Bunu ben ,a kısayolun atadım. Herhangi bir kelimenin üzerine gelip ,a yaptığınızda o kelimeyi dizinde arıyor ve küçük bir pencere olarak gösteriyor:

Vim altında ack-grep kullanımı

Sonra bu pencerede istediğiniz dosyaya o tuşu ile geçebiliyorsunuz. En güzeli de go tuşları ile önizleme yapabilmenizdir. Yani 10 tane seçenek geldiyse her birine go basa basa içeriğini görebilmenize imkan sağlıyor. t ve v tuşları ile de sekme ve dikey olarak o dosyayı açabiliyorsunuz. Şahane bir eklenti.

a

Kaynak kodlar ile başlık dosyaları (foo.cpp ve foo.h) arasında hızlı geçiş için kısa yollar sunuyor. Örneğin foo.cpp ile uğraşıyorsam, :A ile doğrudan foo.h dosyasına geçiş yapıyor(:A yaptığımda tekrar eski dosyaya dönüyorum). :AS, :AV ve :AT ile de dikey, yatay ve sekme şeklinde açabiliyorum.

ctrlp

Bu eklenti sayesinde ctrl+p kısa yollu ile herhangi bir dosyaya aniden geçiş yapabiliyorsunuz. Basit ve kullanışlı. ctrl+p yaptıktan sonra ilk 1-2 harfi yazında kendisi o dizinde bulunan tüm dosyaları getiriyor. Şu şekilde bir şey:

Vim altında ctrlp kullanımı

Üç çeşit arama şekli var:

  1. Buffer’de bulunan dosyalar
  2. En çok kullandığınız dosyalar (bunun için bir bellek tutuyor)
  3. Dizinde bulunan dosyalar

Bu ayarları istediğiniz gibi değiştirebilirsiniz. Standart olarak dizindeki dosyaları arıyor, ama ctrl+f ile modu değiştirebilirsiniz (ctrlp pencersinde). Yine sık sık kullandığım ctrl+s, ctrl+v ve ctrl+t kısa yolları ile dosyaları yatay, dikey ve sekme olarak açabiliyorsunuz.

gist-vim

gist.github.com servisini doğrudan kullanmanızı sağlıyor. :Gist komutunu çalıştırdığınız anda kendisi tüm dosyayı gist’e aktarıp sonra da tarayıcıyı açmanızı sağlıyor. Çok basit ve güzel. Şu komutlarını sıkca kullanıyorum:

  • :Gist
  • :Gist -p
  • :'<,'>Gist
  • :'<,'>Gist -p

-p seçeneği “secret” olarak yolluyor. (Ben bunu özellikle de markdown ile yazdığım dökümanlara anında preview yapabilmek için kullanıyorum, o an bakıyorum sonra siliyorum) '<,'> de visual ile seçilen kısım anlamını taşıyor.

Visual moda herhangi bir kod parçasını seçip :Gist yazdığınızda otomatik olarak eklenir. Yine -p ile dilerseniz “secret” olarak yollama imkanınız var. :help gist-vim ile daha fazla bilgiye ulaşabilirsiniz.

(Bonus: :Gist -p ile markdown dosyalarınız için gizli bir Gist oluşturup ön izleme yapabilirsiniz)

gundo

Vim 7.x serisi ile beraber “undo” özelliği gelmişti. Şimdi bu undo özelliği bildiğimiz geri alma özelliklerinden farklı. Eğer vim/vimrc’de set undofile ayarını açtıysanız bu özelliği kullanabilirsiniz. Peki nedir bu özellik?

Bu özellike ile bir dosya üzerinde yaptığınız tüm değişikleri, dosyayı kapatsanız dahi kaydediliyor. Yani örneğin bir değişiklik yaptınız, dosyayı kaydetip çıktınız. 1-2 gün sonra tekrar açıp bildiğimiz u eski haline getirebilirsiniz (hali derken tabi 10 tane değişiklik yaptıysanız en eski haline bile getirebilirsiniz)

gundo ise “graphical-undo” anlamına geliyor. Dosya üzerinde yaptığınız tüm değişiklikleri ağaç formatında gösteriyor:

Vim altında gundo kullanımı

Ben bunu ,g kısa yolu ile açıp kapatacak şekilde düzenledim. Böylelikle eski sürümlere bakıp bir sorun olduğunda kolayca geçebiliyorum.

(Bonus: Undofile özelliği ile fazladan istemediğiniz dosyalar oluşuyor. Bunları set undodir=/tmp gibi bir seçenek ile değiştirebilirsiniz.)

nerdcommenter

Bu da çok sade ama en çok işime yarayan eklentilerden biri. Herhangi bir kod parçasını comment etmek için kullanıyorum. İki tane kısa yolu var biri kapatıyor diğeri de açıyor

  • ,cc
  • ,c<space>

Güzel olan ise ön tanımlı olarak bir çok dili otomatik olarak tanıyor ve ona göre comment ediyor kodu. Yani python kodlarının önüne # koyuyor, c,cpp kodlarının önünde \\ gibi.

Nerdcommenter çok kapsamlı ve bir çok modu destekleyen tarafları da var. Genelikle bu tarz eklentilerde bunlara boğulup gidebilirsiniz. :help nerdcommenter ile daha fazla bilgiye ulaşabilirsiniz.

supertab

Vim’in muhteşemem bir completion motoru var. Bunu ctrl+x ile çağırabiliyorsunuz ve sonra istediğiniz completion moda girmenizi sağlıyor(mesela ctrl+f ile file completion moduna girebiliyorsunuz.) Genelikle bir çok dil için completion eklentileri bulabilirsiniz, her biri bu motoru kullanıyor. Şu şekilde bir şey:

Vim altında supertab kullanımı

supertab ise insert modunda otomatik olarak bu modları kullanmanızı sağlıyor. Örneğin /usr/l<tab> ile otomatik olarak file completionu yapıyor, yani /usr dizindeki dosyaları getiriyor tab’e bastıkça. Bir çok ayrıntı özelliği de var. Olmazsa da olur bu eklenti, ama daha da güzelleştiriyor.

easymotion

Vim’deki kelime bazlı “motion” düzenkelerini kolaylaştıran bir eklenti. Örneğin normalde j,k,w,b,e,f,t,d,vs.. gibi envai çeşit tanımlar vim ile dolaşabilir ve gerekirse bunlar üzerinde işlemler yapabilirsiniz.

Easymotion gezmeyi daha da kolaylaştırıyor. ,,w ile doğrudan “w” bazlı motion üzerinden bir harf haritası çıkartıyor, yani kelime bazlı. Sonra istediğiniz kelimeye tek bir tıkla geçebiliyorsunuz. Örnek

<imleç>Lorem ipsum bir başka olabilirdi

İmleç Lorem kelimesinin önünde dururken ,,w basarak şu şekile getiriyorsunuz:

<imleç>Lorem {a}psum {b}ir {c}aşka {d}olabilirdi

c tuşuna basarak “başka” kelimesine geçiyorsunuz. Aşağıda örnek bir görüntü görebilirsiniz:

Vim altında easymotion kullanımı

surround

Surround eklentisi ile bir kelime ya da satırı belirli bir karakter ile kapatabilirsiniz. Örneğin

foo

kelimesini ysw" kombinasyonu ile

"foo"

haline getirebilirsiniz. Ya da yss" ile tüm satırı kapatabilirsiniz. Hangi karakter ile kapatmak istediğiniz size bağlı. Syntaxı berbat ama yine Vim’in motion’larını desteklediği için idare edilebilir. Bir sonraki eklenti ile daha bir anlamlı hale geliyor.

repeat

Bir önceki “surround” özelliğini tekrar tekrar yapmak işkence olacaktır. Mesela birden fazla kelime veya satır için. Normalde . karakteri ile Vim’de bir önceki “motion” tekrarlayabiliyorsunuz. Mesela yy ile bir satırı kopyaldıysanız tekrar . ile bir sonraki klasörü kopyalaybilirsiniz. Kendisi otomatik olarak son yaptığınız hamleyi yapıyor.

repeat ise bu . özelliğini daha da güçlü bir hale getiriyor. Surround gibi eklentiler ile uyumlu bir şekle getiriyor. Böylelikle . ile kolay bir şekilde kelimeleri veya satırları istediğiniz karakterle kapatabilirsiniz (yani tekrar tekrar aynı tuş kombinasyonları girmenize gerek yok)

tagbar

ctags, exuberant ctags, etags, vs.. gibi “tags” üreten uygulamalar için ayrı bir pencere açıyor. Böylelikle kullanılan modüller, fonksiyonlar, macrolar, enum’lar,vs.. gibi envai çeşitle bilgiyi tek bir hamlede görebilirsiniz. Bunu ben ,b tuşu ile kapatıp açıyorum. Görüntüsü ise şu şekilde bir şey:

Vim altında tagbar kullanımı

(Dipnot: ctags özelliği ile dahili vim-ctags özelliği ile fonksiyonlar ve ilintili dosyalar arasında kolayca geçiş yapabilirsiniz.)

autoclose

Bu otomatik olarak parantez, kesme işaret,.. gibi karakterleri kapatıyor. Örneğin [ karakteri yazdığınızda ] otomatik olarak ekleniyor. Ayrıca " ', gibi bir sürü karakter de tanımlamak mümkün.

Güzel bir kaç özelliğe de sahip. Örneğin " karakterini eklediniz, kendisi gitti bir tane daha ekledi. Siz arasını doldurmaya başladınız ve ikinci " karakterin sonuna geldiniz. Burada insert modundan çıkıp " karakterini eş geçeceksiniz. Ama autoclose’de bunu yapmanıza gerek yok, " karakteri yazdığınızda doğrudan onu eş geçmiş olursunuz.

Ya da iki karakter arasında iseniz ve insert modunda ilkini sildiyseniz diğeri de otomatik olarak siliniyor.

fugitive

Git deposu için ara sıra kullandığım bir eklenti. Kurduktan sonra herhangi bir git deposunda (ki sadece bir git deposunda çalışır, git deposu yoksa : ile çağıramazsınız).

  • :GStatus ile değişen dosyaları ve sonrasında + ve - tuşları ile istediğim dosyaları staging alanına ekleme imkanı sunuyor
  • :Gcommit ile commit için gerekli alanı oluşturup depoya commit etmemi sağlıyor
  • :Gdiff yana yana olarak son değişiklikleri gösteriyor (ki bu pek sorunlu gerçi)
  • :Git ile git komutunu doğrudan çalıştırıp, push, pull gibi işlemlere olanak sağlıyor
  • vs..

:Gstatus’u çalıştırıca çıkan bir ekran görüntüsü:

Vim altında fugitive kullanımı

Normalde terminal’den ya da gui ile kullanıyorsanız bir sorun yok. Ama MacVim ya da GVim ile güzel bir şekilde çalışıyor. Bir sürü fazla özelliği de var. Dediğim gibi çok sık kullanmıyorum(tig + terminal ikilisini tercih ederim) ama yine de MacVim gibi arayüzlerle iyi oluyor.

nerdtree

Nerdtree başta güzel gözüken, ama pek kullanılmayan, sonra şuna bir daha göz atayım diyerek aşık olabileceğiniz bir eklenti. Benim olmazsa olmazlardan biri haline geldi. Yaptığı ise bulunduğunuz dizini ağaç şekilde sol tarafta göstermesi:

Vim altında nerdtree kullanımı

Hemen hemen her IDE’de olan bir şey gibi düşünebilirsiniz, ama nerdtree’nin güzelliği doğrudan Vim içinden kolayca klasör oluşturma, yer imi oluşturup onlara hızlıca geçme, istediğiniz dosya veya klasörü ayrı sekmelerde ve ya dikey,yatay pencerelerde açma imkanı sunmasıdır.

Kullandıkça eliniz, ayağınız oluyor. Bunu ,n tuşuna atadım ve kolayca kapatıp açabiliyorum.

(Bonus: Macvim altında mouse ile normal dosya yöneticisi gibi gezebiliyorsunuz!)

powerline

Powerline için çok söze gerek yok, Insert, Normal, Recording, Visual, Tagbar, Nerdtree, Ctrlp, Gundo,vs.. gibi envai çeşit mod için farklı renklendirme özelliğine sahip. Yukarıda şu ana kadar paylaştığım tüm ekran görüntülerinde en alta renkli renkli olarak mevcut

Kesinlikle tavsiye ederim.

(Dipnot: Mac altında dotfiles/stuff’daki “Source Code Pro for Powerline” fontunu kurarsanız “fancy” modundaki grafiksel özellikleri de görmüş olursunuz)


Hepsi bu kadar. Dotfiles klasöründe yukarıdakilerden farklı eklentiler de mevcut, onlar genelikle renklendirme, dosya tanımı,vs.. gibi işler olduğundan anlatmadım.

Bir sonraki yazımda sıkca kullandığım, bilin(mey)en Vim özelliklerini anlatmayı düşünüyorum. Kullandığız değişik ve güzel Vim eklentileriniz varsa yorum kısmında belirtebilirsiniz.

16 Aralık 2012

QTcpServer sınıfına SSL desteği eklemek (Qt)

Qt ile yazdığımız bir sunucu uygulaması için SSL desteği eklememiz gerekiyordu. Bunun için araştırma yaptığımda yine her zamanki gibi karışık ve herşeyi baştan anlatan bir yazı bulamayınca, şu an okuduğunuz blog yazısı ortaya çıktı.

Sunucumuz QTcpServer sınıfından üretilmiştir. Genelikle herkes bu temel sunucu üzerinden kendi sunucularını yazarlar. Burada tek sorun QTcpServer, QTcpSocket sınıfını kullanıyor. Bu sınıfın da SSL desteği mevcut değil. Qt API belgelerine baktığımda bununla ilgili QSslSocket diye SSL protokolu kullanan bir sınıf olduğunu gördüm. Bunun için QTcpServer’in kullandığı üç tane virtual fonksiyonu tekrar yazmamız gerekiyor. Bu fonksiyonlar sırayla şunlar:

İlk başta incomingConnection() desteğini değiştirelim. QTcpServer bu fonksiyonu her yeni bağlantıda çağırıyor. Sonra bir tane QTcpSocket oluşturuyor, soket tanımlıyor ve bunu da dahili bir listeye ekliyor. Bu dahili liste de nextPendingConnection() veya hasPendingConnections() gibi fonksiyonlar ile uyum halinde çalışıyor. Bunların hiç birini siz yapmıyorsunuz. Hepsi otomatik olarak QTcpServer tarafından yapılıyor. SSl desteği için aşağıdaki gibi bunu yeniden yazmamız gerekiyor(reimplementation):

void Server::incomingConnection(int socketDescriptor)
{
	QSslSocket *socket = new QSslSocket(this); 
	socket->setProtocol(QSsl::SslV3);  // TODO: Or other protocols, like tls, sslv2? Research...

	// For now these files should be reside in the same folder as the application
	socket->setPrivateKey("server.key"); // $ openssl genrsa -out server.key 2048
	socket->setLocalCertificate("server.crt"); // $ openssl req -new -x509 -key server.key -out server.crt -days 1095

	if (socket->setSocketDescriptor(socketDescriptor)) {
		pendingConnections->enqueue(socket); // Will be used in nextPendingConnection()

		// newConnection() is emmited within QTcpServerPrivate. No need to emit it manually.
		// However encrypted() is emitted if QSslSocket enters encrypted mode.
		// Useful for debugging or other stuff.
		// TODO: we might need sslErrors() signal implementation
		connect(socket, SIGNAL(encrypted()), this, SLOT(ready())); 

		socket->startServerEncryption(); //  Initiate the SSL handshake
	} 
	else { 
		delete socket; 
	}
}

Koda yorumlar eklediğimden detaya girmeyeceğim, sadece pendingConnections kısmını anlatayım. QTcpServer bildiğiniz gibi kendi listesini tutuyor. Fakat bizim nextPendingConnection() ve diğer fonksiyonları ile çalışması için oluşturduğumuz QSslSocketi bu listeye dahil etmemiz gerekiyor. Fakat böyle bir liste olmadığından kendimiz bir QQueue<QSslSocket*> veri tipi oluşturup ona ekliyoruz. FIFO veri tipinde olduğundan gelen bağlantıların düzgün bir şekilde gitmesi açısından da önemli. Sırada nextPendingConnection() sınıfı var, onu da şu şekilde değiştiriyoruz:

QTcpSocket* Server::nextPendingConnection()
{
	// Return the next connection in the queue. If there is none,
	// return 0.
	if (pendingConnections->isEmpty()) {
		return 0;
	} else {
		return pendingConnections->dequeue();
	}
}

Burada gördüğünüz gibi daha önce oluşturduğumuz QQueue listesindeki socketleri geri dönderiyoruz. Geri dönüş veri tipi QTcpSocket* olması da bir sorun değil, çünkü QSslSocket de QTcpSocketin bir altsınıfı olduğundan aynı sayılır o anlamda. Tabi son olarak hasPendingConnections() de bu QQueue listesinden dönüş yapması gerektiğinden onu da şu şekilde değiştiriyoruz:

bool Server::hasPendingConnections() const
{
    return !pendingConnections->isEmpty();
}

Header dosyalarına gerekli olan QSslSocket, QQueue, vs.. gibi kitaplıkları eklemeyi unutmayın. Ayrıca pendingConnectionsi de tanımlamaya unutmayın. Bir de ready() diye bir slot var. incomingConnection() sınıfında SSL şifrelemesi gerçekleştiğinde encrypted() diye bir sinyal gönderiliyor. Bende bu slot içinde sadece bir qDebug() çıktısı var ve adı üzerinde debug için kullanıyorum. Siz kendiniz için kullanabilirsiniz.

Son olarak da sonradan gördüğüm bir yardımcı kitaplıktan bahsedeyim. Bizim yazdığımız sunucu modifiye edildiğinden bize pek uymuyordu ama libqxt diye Qt eklenti kütüphaneleri var. Gerçekten güzel bilgiler mevcut. Örneğin network altında doğrudan SSL kullanan bir tane sunucu sınıfı qxtsslserver mevcut. Eğer size uygunsa yukarıda yaptığım modifikasyonları yapmadan doğrudan bunu kullanabilirsiniz.

17 Kasım 2012

Linux kullanıcısından Mac OS X değerlendirmesi

Bundan 1-2 ay önce kendime yeni bir Macbook Air aldım. Daha önce hiç Mac kullanmamış, ama yaklaşık 7-8 yıldır Linux kullanan biri olarak bununla ilgili tecrübelerimi yazayım dedim. Aşağıda yazılım, donanım, kullanım,vs.. yönünden bir Linux kullanıcısı/geliştirici açısından izlenimlerimi bulabilirsiniz.

Mountion Lion altinda kullanilan uygulamar

  • Dosya sistemi farklı(haliyle). Elim hep /usr, /home/ vs. gibi dizinlere gidiyor. Zamanla bu dizinlere değil de farklı yerlere bakmak gerektiğini anlıyorum tabi ki. Alışkanlık gerektiriyor. Kullandığınız özel betikler varsa bunları ona göre düzenlemeniz gerekiyor.

  • Terminal olarak iTerm2 kullanıyorum, herhangi bir sorun yaşamadım. Normalde Gnome-terminal kullanıyordum. Tmux desteği bile var (bunun sayesinde Tmux’un session bilgisini doğrudan iTerm’in pencere sistemi ile kullanabiliyorsunuz. Yani mesela Yakuake’deki gibi pencereleri bölüp, kapatıp açtığınızda aynen bıraktığınız gibi geliyor). Fakat ben iTerm’in bu özelliğini kullanmadım. Zaten uzun süredir kullandığım ve kişiselleştirdiğim tmux.conf ile klasik düzende devam ediyorum.

  • Tmux var ve tıpkı Linux altındaki gibi düzgünce çalışıyor. Herhangi bir sorun yaşamadım. Linux altında kullandığım tmux.conf ile sorunsuz çalışıyor,

  • Vim de Linux altında kullandığım dosyaları, eklentileri yine sorunsuz bir şekilde çalıştırabildim. Bunu için Github’da dotfiles deposunu kullanıyorum (merak edenler için sağ taraftan github linkinden ulaşabilirsiniz.)

  • Zsh‘da bazı eklentilerim için değişiklik yapmak zorunda kaldım. Bazı uygulamalar farklı çalıştığından alias’ları değiştirdim(ls –color yerine ls -G gibi).

  • Cmd tuşuna alışamadım bir türlü. CMD, OPTİON, CTRL, FN tuşlarını ciddi şekilde birleştirerek kullanan bir işletim sistemi OS X. Bazen ALT diyorlar, bazı yerlerde OPTİON diyorlar (ikisi de aynı). CMD ve CTRL karışıklığı. Cmd dışında Ctrl tuşu da var. Normalde Ctrl+C, Ctr+V gibi tuşlar yerine Cmd+C, CMD+V gibi kısayollar kullanmak gerekiyor. Bu da kafa karışıklığına yol açıyor

  • Terminal altında Cmd değil de Ctrl tuşunu kullanmanız gerekiyor. Burada Capslock’u ne yapmalı o zaman? CMD ya da CTRL mi? Ben Emacs tarzı veri girişini çok kullandığım için (Xcode, Bash/Zsh readline) CTRL olarak ayarladım.

  • İnsert tuşu yok, delete tuşu yok(onun yerine backspace var), silmek için Fn+Backspace yapmanız gerekiyor. PageUp, PageDown gibi tuşlar da yok. Özellikle Tmux ile copy-mode’a girerken rahatsız oluyor bu.

  • İngilizce klavye kullandığımdan kod yazmak çok daha verimli ve hızlı olmaya başladı(gerçi bunun Linux-Mac durumu ile alakası yok). Fakat Türkçe harflerden eksik kaldım(gördüğünüz gibi). Bununla ilgili küçük bir değişiklik yapmıştım klavye kullanımı ile ilgili (uzun süre tutunca türkçe hali geliyordu). Paylaşırım sizlerle sonra.

  • Dokunmatik touchpad çok iyi çalışıyor. İpad,Iphone’daki gibi verimli ve kesintsiz bir deneyim sunuyor. Bir süre sonra Mouse kullanmayı bile bırakabiliyorsunuz bu yüzden (çünkü daha verimli, hızlı ve konforlu).

  • Dokunmatik touchpad’ı kişiselliştirme imkanı var ekstra bir araç sayesinde (Better TouchTool). Ben bunu kullanarak Chrome’da gezmek için bazı ekstradan seçenekler ekledim (mesela üç parmak ile sağ-sol ile sekmeleri gezme, aşağı yapınca sekme kapanıyor, yukaria yapınca yeni sekme açılıyor, iki kere dokunca kapanmış sekme geliyor)

  • Doğal kaydırma (Natural Scrolling) başta garip geldiğinden kapatmıştm. Fakat Apple ileride iOS cihazlarını Mac cihazları ile birleştireceğinden ve ileride dokunmatik ekranlı Mac’ler olacağından bu alışkanlığı kazanmak amacıyla tekrar açtım (trend oraya doğru gidiyor). Fakat fare ile bu sefer düzgün olmadı. Bunun için de Scroll Reverser diye bir uygulama kuruyorsunuz. Dokunmatik doğal sürükleme kullanırken, fare normal scrolling’i kullanmış oluyor

  • Logitech M705 faresini kullanıyorum. Kullanımı, tepki süresi çok kötü çalışıyor. Logitech yazılımı kötü diyebilirim. Linux altında çok daha iyi çalışıyor çünkü bu fare.

  • Basit bir yedekleme aracı olarak Time Machine uygulaması var. Boş bir partition sunuyorsunuz(harici veya dahili disk) kendisi saat başı tüm sistemin yedeğini alıyor. Basit ve bir çok kişinin kullanacağı bir araç olmuş.

  • Tam ekran özelliği güzel bir şekilde entegre edilmiş (çift ekran kullanan kullanıcılar haricinde). Gnome 3 ve Unity de de kullanım tecrübelerini bu yönde geliştiriyor artık. Alışmak zor olmadı buna, keza gayet severek kullandığım bir özellik.

  • Masaüstü uygulamaları kaliteli, göze hitap eden uygulamalar. Albenisi çok. Bir çok şirketin Mac yazılımını bulabiliyorsunuz. Ve hepsi de güzel oluyor. Uygulamalar tıpkı iPhone’daki gibi paralı oluyor. Genel olarak insanların da parayla satın aldığını sezdim. Kullanıcı kitlesi para vermeyi normal buluyor (bence bir emek, yazılım için bu doğru bir şey). Tabi açık kaynak kodlu yazılımlar da güzel bir şekilde çalışıyor (Chrome, Firefox, vs..). Firefox özellikle çok daha güzel gözüküyor. Macbook Air’in ekran kalitesi iyi olunca daha da hoşunuza gidiyor.

  • Uygulama kurmak için bir sürü yol var. Ayrıca uygulama kurmak da çok farklı (kurma yöntemi açısından). App Store’dan kurmak en kolayı, tıklıyorsun ve kendi kendine kuruyor(iPhone’daki gibi)

  • İnternet sitesinden indirdiğiniz kurulum dosyalarda da iki tür var. Bazıları .pkg ile bitiyor, bazıları ise .dmg ile. Pkg ile biten Windows ınstaller gibi Next, Next şeklinde ilerleyip kuruyor. Dmg ile bitenlerde karşınıza küçük bir pencere çıkıyor ve uygulama simgesini Applications klasörüne atıyorsunuz (bu da kurulmuş oluyor). Bu uygulama simgeleri de aslında birer klasör oluyor (terminal ile girip bakabilirsiniz)

  • Tmux, git, vs, gibi uygulamaları Homebrew ile kurabiliyorsunuz. Homebrew, Gentoo Portage gibi doğrudan kaynağını indirip kuran bir paket yöneticisi. Ayrıca “Xcode Command Line Tools” adında bir paket var (Xcode içinden indirebiliyorsunuz). Şimdi karışıklık burada başlıyor. Mesela X öde içinden git çıkıyor, ama Homebrew ile de kurabiliyorsunuz. Sistemde iki tane git olmuş oluyor. Homebrew “/usr/local” altına kuruyor, Xcode ise kendi “/Applications/Developer/Xcode..” deki klasörüne kuruyor. Genel olarak git, zsh, vs gibi temel paketler Xcode Command Line Tools içinden çıkıyor, ama daha sofistike uygulamalar için Homebrew şart(mesela Tmux için). Xcode içinden çıkan uygulamaları ‘xcrun uygulama_adı’ şeklinde çalıştırabilirsiniz (örneğin ‘xcrun git push’).

  • Xcode ile kod geliştirmek zorundasınız uzun vadede (Ojbective-C, iOS programlama için). Çünkü bir çok özelliği ve hızlılığı sadece Xcode ile elde edebiliyorsunuz. Vim ile uzun bir süre denedim yazmayı ama sonunda pes ettim. Vim’de clang_complete eklentisi bile Xcode gibi hızlı ve verimli olamıyor (bir çok metodu tamamlamıyor mesela). APİ kullanımı, belgelere bakma, snippets özelliği, code tamamlama, iOS arayüz tasarımı,vs.. gibi bir çok işi buradan yapmak zorundasınız. Fakat Xcodebuild adında, doğrudan Xcode dosyaları ile çalışan bir arayüz sunuyor Apple. Bununla Xcode ile aynı şekilde uygulamanızı derleyebiliyorsunuz. Bu otomatik betik, Jenkins gibi inşa sistemlere bağlamak, shell ile bir bağ oluşturup farklı işler yapmak istiyorsanız güzel bir araç. Çok kullanma durumum olmadı, ama güzel benziyor.

  • Xcode ve diğer bir çok uygulama Emacs kısa yolları kullanıyor. Bu yüzden Bash altında kullandığınız bir çok kısayollu aynen bunda da kullanabilirsiniz (Ctrl+A, +E, +K, +F, +B, vs.. gibi). Xcode için Vim eklentisi de var, fakat kararsız ve Xcode’un çalışma şekli ile uygunsuz (Xcode sizi hep insert modunda olmanızı bekliyor belli komutlar için, yani mesela otomatik kod tamamlamayı tekrar açmak için insert moduna girmeniz gerekiyor)

  • Her şey birbiriyle çok uyumlu. Bağlantılı bir şekilde işliyor. Profil fotoğrafınız varsa tüm uygulamalar Avatar olarak onu kullanabiliyor. Sistemin bir çok yerinde email, twitter, imessage gibi yerlere bilgi yollamak işi kolaylaştırıyor. Bir şeyleri bir yerden bir yere bırakma ile ilgili küçük ayrıntılar çokça mevcut (mesela bir dosyayı Mail simgesinin üzerine bıraktığınızda doğrudan onu yollamaya kalkıyor). Bu kararlılığı ve bütünü hissediyorsunzu bir süre sonra. Her şey sorunsuz bir şekilde işliyor. Zamanla alışıyorsunuz ve tıpkı iPhone’daki gibi ‘Demek ki bu işler böyle olmalı’ diyorsunuz (arayüz kullanım açısından).

  • Gnome3, Ünity, Kde gibi masaüstünde kullanılan bir çok özellike Mac’de alınmış. Özellikle Gnome 3 kullanıp Mac kullanmaya başlayınca (Gnome 3 daha yeni diye söylüyorum) bir çok benzerlik göreceksiniz.

  • iCloud’u çok kullanmıyorum. Dropbox’un Linux desteği olmasından dolayı benim için daha iyi. Fakat ilerleyen yıllarda iCloud desteği daha entegre bir şekilde çalışacağından bu konuda şüphelerim var malesef.

  • İlginç ve saçma bulduğum özellikleri var. Örneğin: Uygulama silmek için çöp kutusuna bırakıyorsunuz. Dosya yöneticisinde (Fınder) kes yapamıyorsunuz. Kısa yol olan Ctrl+X kullanabilirsiniz ama menüde yok. Bir şey çöp kutusuna atmadan doğrudan silemiyorsunuz. Bunun için betikler var Delete-immediately. Save aş özelliği sadece ALT tuşuna basınca çıkıyor, o da düzgün çalışmıyor. ‘Save aş’ diye farklı bir dosyaya kaydetmeye çalışırsanız, orijinal dosyayı da kaydediyor.

  • Türkiye’de Mac ile ilgili güzel kaynak az. Bunlardan Sihirli Elma kaliteli ve uzun, doyurucu içerik sunuyor. Hoşuma gitti için sizlerle de paylaşayım dedim. Yurtdışında ise camia çok farklı. Klasik meşhur Apple fanboy’ları varken, Ünix/Geek’leri de çok. Nasıl baktığınıza bağlı olarak değişiyor. Çok kafa takmamak lazım bu yüzden. Yine bir sürü kaynak var tabi, ben Macrumors.com sitesini tavsiye ediyorum. Apple camiası ve sorunları hakkında doyurucu ve kaliteli bilgi bulabilirsiniz (özellikle Forumlarında). Teknik camia ilgili hakkında ileride bir şeyler karalayacağım, şimdilik yeni yeni tanımaya başladığımdan yanlış bilgi vermek istemiyorum.

Bu kadar. Aklıma geldikçe yine bu listeye eklemeler yapacağım, genel olarak bir sürü küçük farklılıklar var. Bazıları iyi, bazıları kötü. Bence alışkanlık ve bakış açısı ile düzeltilecek şeyler. Biraz farklı bakmak ve bazı şeylerden feragat etmek gerektiriyor Mac kullanmak. Özgürlüğe aşırı önem verenler bence çok rahatsız olurlar bu sistemde. Kişisel olarak sevdim diyebilirim. Yaklaşık bir aydır akşamları kullanıyorum evde. Başlarda terminal ve tuşlara alışmamıştım ama zamanla o da geçti. Şimdi bir çok işimi Mac altından yapıyorum. Tabi Linux kullanımım değişmedi. Gündüzleri ise işimde 8-9 saat Linux kullanıyorum (saat ortalaması olarak Linux başı çekiyor). İki farklı işletim sistemi olduğundan Github, Dropbox, vs.. gibi servisleri de daha fazla kullanmaya başladım senkron kalabilmek için. Bunun dışında blog’da bundan sonra Mac ve özellikle Objective-C ile ilgili ipucuları da paylaşabilirim.

Hepsi bu kadar. Linux’dan Mac’e geçiş açısından başka sorunlarınız varsa ya da düşüncüleriniz varsa yorum kısmından paylaşabilirsiniz.

(not: İngilizce klavye ile yazdım, ama okuma keyfi bozulmasın diye Mustafa Emin Acer’in Text Deasciifier sitesini kullandim. Bu güzel calışmayı kullanmanızı ve tanıtmanızı tavsiye ederim.)

6 Ağustos 2012

Debian tabanlı yeni Pardus

Debian Tabanlı Yeni Pardus

Necdet Yücel tarafından çekilen Debian tabanlı Pardus konsol ekranı


Yavaş yavaş bazı bilgiler gün ışığına çıkmaya başladı herhalde. Başlıkta yazdığım gibi önümüzdeki 1-2 ay içinde çıkacak olan Pardus, Debian tabanlı bir dağıtım olacaktır. Eski bir Pardus geliştiricisi olarak o kadar emeğin, teknolojinin sona erdirilmesini tabi ki üzülerek izleyeceğim. Ama konumuz bu değil(bu yazı açısından), konumuz Debian tabanlı Pardus’a ilişkin bulgular.

Pardus’un Debian tabanlı olmasına ilişkin üç önemli bulgu

Son zamanlarda kamuya açık yerlerde bununla ilgili bir çok ipucu birikti. Bunlar Pardus’ta çalıştığım zamanlardaki bilgilerim ve Pardus çalıştayındaki bilgilerle birleşince ortaya çıktı. Şimdi sırayla bunlar neler onları yazayım:

  1. Pardus Çalıştayı. Pardus çalıştayında ben de yer almıştım. Benimle beraber Pardus ekibinde yer alan ekibin bir kısmı, daha önce ayrılmış geliştiriciler, Türkiye’deki Açık kaynak camiasından tanınmış simalar gibi bir çok insan katıldı. Bir çok şey çizildi yazıldı. Fakat orada özellikle Ahmet Kaplan‘ın “Paket sayısı çok az, Ubuntu gibi on binlerce paketi olan bir dağıtımı alt yapı olarak kullanmak daha mantıklı” cümlesi aslında her şeyi özetler durumdaydı.

    Ahmet kaplan dışında Jon Hall (maddog) da “Debian gibi evrensel ve oturmuş bir dağıtım varken ve özellikle fork’a müsait iken başka bir paket yöneticisi kullanmak mantıksız” demişti.

    Apache Foundation’da yer almış Alex Karasulu da buna benzer düşünceye sahip idi. Kendisi de zaten Jon Hall ile beraber konu açıldıkça bunun avantajlarınıanlatmaya çalışıyordu.

    Son olarak Enderunix ekibi de tam kadro oradayı ve her biri de “Devlet Pardus gibi bir dağıtıma destek vermemeli, Ubuntu/Debian forku daha mantıklı” cümlesine yakın ortak bir düşünceye sahiptiler.

    Tüm bunlar Ahmet Kaplan’ın istediği zemini hazırlamıştı aslında ta o zamanlar. Çalıştayda herkesin kafasında “Debian tabanlı bir Pardus” yerleşmişti ve mantıklı gelmeye başlamıştı (mantıklı ile o günün sonunda oluşan ve solunan havanın sonuçunda oluşan genel algıyı kastediyorum.)

  2. Danışma kurulu toplantısına ilişkin bilgiler. Pardus Çalıştayında karar verilen bir konu vardı. O da bir danışma kurulunun kurulması ve Tübitak olmak üzere bir çok alandan insanların bir kurul oluşturması idi. Bu kurulda resmi/gayriresmi geliştirici, STK, topluluk, çözüm ortakları,vs.. gibi bir çok kesimden insanlar yer alacaktı.

    Bu hafta sonu bu kurul toplanacak. Bununla ilgili Pardus Camia listesinde kimlerin katılacağı sorulduğunda Doruk Fişek şöyle bir mesaj attı:


    E-posta giden kişiler şunlar:

    • Ahmet Kaplan (TÜBİTAK)
    • Abdullah Arslan (MSB - kamu kurumları temsilcisi)
    • Abdullah Erol (TÜBİTAK)
    • Cahit Cavit Vural (?)
    • Doruk Fişek (Özgür Yazılım A.Ş. - çözüm ortakları temsilcisi)
    • Necdet Yücel (18 Mart Üniversitesi - üniversite temsilcisi)
    • Sezai Yeniay (Topluluk temsilcisi)

    Burada yeni-eski simalar var. Bazıları tanıdığımız bildiğimiz insanlar. Ama aralarından “Cahit Cavit Vural”‘ın neden olduğunu anlayamamıştım. İsim tanıdık geliyordu ama nerde gördüğümü hatırlayamamıştım. Biraz araştırınca Pardus kullanıcı listesine “Magmalinux” adındaki Debian forkunu tanıttığını görmüştüm. Magmalinux, Debian tabanlı bir dağıtımdır. Cahit Vural ise bildiğim kadarıyla bununla yıllarca ilgilenmiş ve uğraşmış bir kişidir.

    Yukarıdaki listede onun da isminin yer alması, Tübitak’ın Debian forku ile ilgilinen kişilerin bilgi birikime başvurduğu anlaşılıyor. Acaba Cahit Cavit Vural, Tübitak’ın aylardır hazırladığı Debian forkunda çalışan yeni geliştiricilerinden biri miydi?

  3. Özgürlükiçin.com’daki gizemli Debian tabanlı Pardus dağıtımı. Tüm bunlar yaşanırken ozgurlukicin.com forumlarında ilginç bir olaya tanıklık edildi. Forumda AoKiji adında biri aşağıdaki ilginç anısını paylaştı:

    “Birkaç gün önce pilot okulların birine işim düştü. aklıma hemen akıllı tahta yer alan pardus bir göz atmak geldi. açtık sistemi bir baktık. pardus ilk açılışta grupla değilde windows yapısı altından işletim sistemini seçiyorsunuz. varsayılan “windows”. ordan pardus seçiyoruz.

    Pardus 2011 kurulu sistemde ama bildiğimiz 2011 ile arasında epeyi fark var. adı pardus 2011 ama tamamiyle yeni bir sistem gibi geldi bana. paket yöneticisi .deb paket yöneticisiydi. içersinde paketler hepsi güvenli sürümlerdi.”root” porolasını bilmediğim için fazla kurcalamayadım. herhalde yakında bir açıklama gelir”

Yani yeni Pardus, Pardus değil mi?

Yukarıdaki yazılanları birleştirince bir çok şey aslında ortaya çıkıyor. Bildiğiniz gibi 30 küsür geliştirici son bir sene içinde Pardus projesinden ayrıldı ve projede bir kişi bile kalmadı. Fakat Ahmet Kaplan’ın her konuşmasında “Pardus bitmedi, çok güzel bir şekilde geri döneceğiz” demesi de kafaları iyi karıştırmıştı.

Tübitak muhtemelen son 1-2 aydır Debian/Ubuntu tabanlı bir dağıtım üzerinde çalışıyor (benim tahminim Debian üzerinde, Ubuntu upstream ile iyi anlaşamıyor). Fakat bunu henüz şimdi açıklamayacağı için tüm bilgiler de burnu açık havada kalıyor.

Pardus markası 2-3 ay içinde çok farklı bir anlamda kullanılacak. Yıllarca oluşturulmuş ve kamunun bildiği bir markayı doğrudan kullanmak Tübitak’ın da işine yarayacaktır. Ayrıca Kamu bilindik bir isimle iş yapacağı için içi rahat olacaktır. Fakat Erkan Tekman ve ekibinin yıllarca oluşturduğu teknolojiden hiç bir iz,eser bulunmayacaktır. Yani dışarıdaki yüzlerce Debian forkundan biri olacaktır. Adı Pardus olacak, ama bizim bildiğimiz Pardus’tan çok farklı bir ürün ortaya çıkacaktır.


Dipnot: Yukarıda yazılanlar tamamen şahsi fikrim olmakla beraber, doğru veya yanlış bilgiler içerebilir. Bu bilgilerin doğru kabul edilip edilmemesi tamamen okurun insiyatifine bırakılmıştır. Tüm bilgiler kamuya açık bilgilerden yorumlanarak yazılmıştır.

28 Haziran 2012

C’de Pointer Sözdizimi (Syntax) ve Aritmetiği

C’de pointer konusunda yüzlerce, binlerce kaynak var. Bu yüzden size sil baştan pointer’i anlatmayacağım (söz!). Sadece, pointer konusunu öğrenmeye başlayan herkesin sıkıntı çektiği sözdizimi(pointer syntaxı) ve aritmetiği ile ilgili ayrıntılara örneklerle değineceğim. Okuduğum bir çok kaynakta örnek malesef çok az. Bu yazımda özellikle C’de pointer sözdiziminde kullanılan yıldız * operatörünün neden kafa karıştırdığını ve *ptr++, *++ptr, ++*ptr, vs.. gibi değişkenlerin ne anlama geldiğini anlatacağım. Örnek C kodları da mevcut olacaktır, yani indirip, derleyip adım adım görebileceksiniz.

Şimdi pointer nedir?

Pointer bir veri tipidir ve bu veri tipi başka bir değişkeni işaret eder. Peki nasıl işaret eder? Diğer değişkenin sakladığı(tuttuğu) adres sayesinde doğrudan oraya işaret eder. Peki pointer nasıl oluşturulur (declaration)? Pointer tıpkı diğer veri tipleri sözdizimi gibi oluşturulur. Tek fark değişkenin önüne bir yıldız konmasıdır. Örneğin aşağıda bir pointer ve örneklerimizi kullanacağımız bir array verelim

int *foo_ptr;
int my_array[] = {13, 4, 9, -5, 45};

Burada “pointer to int” tipinde bir pointer değişkeni oluşturduk ve bu değşikenin ismi de foo_ptr. Şu an için hiç bir yere işaret etmiyor. Geçersiz bir durum söz konusu ve bunu gidermek için bir yere işaret etmesini sağlayacağız. Yukarıda my_array değişkeni oluşturmuştuk. Şimdi ona işaret etmesini sağlayalım:

foo_ptr = &my_array[0];

Array oluşturulurken bellekte bir bütün olarak yer aldığından ilk sayısı (yani my_array[0]) bize arrayin başlangıcını verecektir. & operatoru ise, bize bir veri tipinin bulunduğu alanın adresini verir. Yukarıda böylelikle foo_ptr değişkenini my_array değişkenin ilk elemanına işaret ediyor olacak. my_array elemanı da bir bütün olduğundan aslında hepsini işaret etmiş olacak. Son olarak belki de önemli bir ayrıntı, & operatoru ile geri dönen verinin tipi pointer cinsinden. Bu yüzden doğrudan foo_ptr değişkenine atayabildik.

İşaret edilen veriye ulaşmak

Pointer’in işaret ettiği veriye ulaşmak için tek yapmamız pointer değişkenin önüne yıldız koymak. Mesela my_array’deki ilk sayıyı çıktısını alalım:

printf("Bu my_array[0] değeri: %d", *foo_ptr); // 13 sayısını gösterecek

Peki o zaman bu değeri değiştirebilir miyiz? Evet aynen değiştirebiliriz. Şimdi sıkı durun. Aşağıda iki tane örnek var, bakalım onlar ne yapıyor:

*foo_ptr = 2;
printf("Bu my_array[0] değeri: %d", *foo_ptr); // 2 sayısını gösterecek

C’deki asıl sorun, * operatorunun hem pointer oluşturma için kullanılması hem de veriyi ulaşmak için kullanılmasıdır. Aslında her ikisini anlamı farklı. Örneğin aşağıdaki örnek ne yapıyor sizce?

foo_ptr = 2;

Eğer adres atama örneğini iyi anladıysanız bu ifadenin sorunlu bir ifade olduğunu göreceksiniz. Yukarıdaki örnek 2 sayısını (burada int tipinde) pointere (pointer de burada pointer of int tipinde) atamaya çalışacak. Ama böyle bir şey mümkün değil. Çünkü her ikisinin tipi farklı. Bu yüzden derlemeye çalışırsanız şöyle bir uyarı çıkacak(“-Wall -g” parametreleri ile derliyorum):

warning: assignment makes pointer from integer without a cast [enabled by
default] 

Dereference özelliğini düzgün kullanabilmek

Yukarıda yıldız * operatoru ile veriye doğrudan ulaşmanın bir diğer adı pointer dereference demektir. Yıldız operatörü malesef bir çok kafa karışıklığına da yol açıyor. Çünkü hem pointer veri tipini oluşturmaya yarıyor, hem de pointer’in işaret ettiği yere ulaşmamızı sağlıyor. Örneğin bir fonksiyonumuz olsun ve bu fonksiyon iki tane argüman alsın. Bu argümanlar pointer to int şeklinde olsun:

void foo_function(int *bar_ptr, int *qux_ptr);

Şimdi dereference özelliği ile birlikte yukarıdaki örnek de kafa karıştırıcı olabiliyor. Çünkü man sayfaları ya da herhangi bir kiptalıkta tanımlar bu şekilde ifade edilmiştir. Burada iki tane pointer tipinden veri alıyorum anlamına geliyor. Bir örnekten gidelim. İki tane pointer oluşturalim ve bunları bir yere işaret etmesini sağlayalım

int *a_ptr;
int *b_ptr;
int x = 2;
int y = 3;

Sonra bu pointerleri işaret etmesine sağlayalım:

a_ptr = &x;
b_ptr = &y;

Buraya kadar herşey normal. Şimdi bu pointer’leri fonksiyonumuza düzgün bir şekilde verelim:

foo_function(a_ptr, b_ptr); // OK: Valid

Yukarıdaki örnek doğru sözdiziminde yazılmış bir örnektir. Gördüğünüz gibi gidip değişkenlerin önüne yıldız öperatorunu koymadık. Neden? Çünkü fonksiyonumuz pointer of int tipinde bir veri bekliyordu. Mesela yıldızlı şekilde yazmak yanlış olacaktı:

foo_function(*a_ptr, *b_ptr); // NOT OK: Invalid

Burada fonksiyonumuza int tipinde iki tane veri sunuyoruz. Halbuki fonksiyon bizden pointer of int cinsinden bir veri tipi bekliyordu. Pointer’lerin önüne yıldız koyarak dereference etmiş oluyoruz, yani işaret ettiği veriyi kullanıyor oluyoruz artık. Bir fonksiyon doğrudan int tipinde veri de alabilir, örneğin:

bar_function(int a, int b);

O zaman gayet sorunsuz bir şekilde oluşturduğumuz pointer verilerimizi kullanabilirdik:

bar_function(*a_ptr, *b_ptr);

Bir başka atama şekli: ptr = my_array

Tekrar örnek değişkenlerimizi oluşturalım:

int *ptr;
int my_array[] = {13, 4, 9, -5, 45};

Sonra ptr’ye my_array’in adresini atalım:

ptr = my_array;  // ptr = &my_array[0]; ile aynı

Yukarıdaki örnek bir başka sözdizimi farklılığı. Yani istersek bu şekilde de yazabiliriz. Farklı bir şekilde yazılmış hali diyelim. Herhangi bir adres pointerini, örneğin &foo[i] , şu şekilde de yazabiliriz kısaca:

(foo + i)

Bizim my_array[0] örneği de haliyle (my_array +0) şekline dönüşüyor. Sıfır ve parantezleri attık mı, sonuç olarak üsteki sonucu elde ederiz:

ptr = my_array;

3[my_array] ve my_array[3] eşittir, nasıl mı ?

Bir önceki örnekte &foo[i] sözdiziminin (foo +i) sözdizimine eşit olduğunu söylemiştik. O zaman kısa bir hack yapalım. Mesela my_array[3] şu şekilde yazalım:

(my_array + 3)

yerlerini değiştrelim:

(3 + my_array)

Hiç bir şey değişmedi, hala aynı. Son olarak bunu da my_array sözdiziminde yazalım:

3[my_array]

Evet bu mümkün! Inanmakta güçlük çekiyorsanız deneyip sonucu kendi gözlerinizle görebilirsiniz. Hiç bir zaman böyle bir şey yazmayın, yazmayalım. Sadece neler olabileceğini görünüz diye yazdım.


Aşağıda yukarıdaki örneği denemeniz için kısa bir örnek kod mevcut:

Pointer Aritmetiği, örnekler, örnekler..

Şimdi buraya kadar gelmişken aşağıdaki örnek değişkenlere bakalım:

*ptr
*(ptr++)
(*ptr)++
++*ptr
*++ptr
*ptr--
*--ptr
--*ptr

Gördüğünüz gibi karman çoban bir şey. Her birini anlamı farklı, anlaması zor bir şeymiş gibi gözüküyor. Ama şu ana kadar anlattıklarımda bir sorun yoksa, bunlar da bir sorun olmayacak. Şimdi my_array örneğinden gidip her bir değişken ne yaptığını öğrenmiş olacaksınız. Array ve ptr tanımlarını hatırlatalım:

int *ptr;
int my_array[] = {13, 4, 9, -5, 45};

Sonra ptr’ye my_array’in adresini atalım:

ptr = my_array;  // ptr = &my_array[0]; ile aynı

Şimdi devam etmeden önce şunu unutmayın. * operatoru + operatorundan daha önceliklidir. Yukarıdaki listede parantez kullandıklarım olduğu gibi, kullanmadıklarım da var. Parantez kullanmıyorsanız ben o koda kötü derim. Özellikle C gibi bir dilde, pointerleri yukarıdaki gibi kullanacaksanız kesinlikle parantez kullanın. Parantez kullanılmayan değişkenlerin de neye dönüştüğünü tek tek öğreniyor olacaksınız birazdan. Başlayalım:

*ptr // print the value 13

Bu bize my_array değişkenindeki ilk değeri verecektir. Hatırlayınız ki * operatoru bir pointer’in önüne konulduğunda, o pointer doğrudan o veriyi bize gösterir.

*(ptr++) // print the value (13) and increment pointer

Bu bize o anki değeri verecektir, bizdeki örnekte 13 sayısını verecektir. Fakat ptr pointeri de bir artacaktır. Yani artık ptr bir sonraki indeksi işaret ediyor.

(*ptr)++ // print the value (4) and increment the value

Burada bir üsteki örneğin tersini yapıyoruz. İlk önce değeri alıyoruz. Sonra da bu değeri artırıyoruz. Çıktı olarak bize 4 verecektir, ama değişkenin değeri artık 5 olmuştur.

++*ptr // same as ++(*ptr), increment value (5) and print the value (6)

Burada * öncelikli her zamanki gibi. Bu yüzden ilk başta değişkeni bize verecektir. Yani 5 sayısını. Ama öndeki iki ++ artış operatoru olduğundan 5 sayısı bir artacak yani 6 olacaktır.

*++ptr // same as *(++ptr), increment the pointer and print the value (9)

Bu sefer ilk önce pointeri bir artırıyoruz. Sonra da işaret ettiği yerin değişkenini alıyoruz. Pointeri bir artırdığımız bir sonraki değeri almış olduk. Bu da (9) sayısı.

*ptr-- // same a (*ptr)--, print the value (9) and decrement the pointer

Şu anki işaret edilen yerinin değişkenin değerini alıyoruz. Yani bu da bizim örneğimizde (9) sayısı. Fakat sonra pointer düşürüyoruz. Artık bir önceki yere işaret ediyor.

*--ptr // same a *(--ptr), decrement the pointer and print the value (13)

Burada pointerin işaret ettiği yeri bir daha düşürüyoruz. Yani en başa döndük. Sonra da değeri alıyoruz, o da bizim örneğimizde (13)

--*ptr // same a --(*ptr), decrement value (13) and print the value (12)

Son olarak değerimizi alıyoruz ve bu değeri bir azaltıyoruz. Yani 13 sayısını 12 olarak geri dönüyor bize.


Tabi en iyi deneyim göze görülür bir deneyim. Bu yüzden yukarıda tek tek anlattığım örnekleri aşağıdaki C kodunu çalıştırıp da görebilirsiniz. Kolaylık olsun diye ptr adreslerinin de çıktısını veriyorum. Böylelikle pointer adreslerinin nasıl artığını gözünüzle göreceksiniz.

Evet hepsi bu kadar. Bir sonraki yazıma vakit ayırabilirsem, iki boyutlu arraylar (pointers to pointers to data type) ve struct ilişkisini yazmayı düşünüyorum. O zaman işler daha da karmaşık hale geliyor haliyle. Ama umarım yukarıdaki örnekler az çok işinize yaramıştır diye düşünüyorum. Sormak istediğiniz, aklınıza takılanlar varsa, yanlış bulduğunuz kısımlar varsa yorum kısmına yazın lütfen.

5 Haziran 2012

Blog altyapısı olarak Jekyll kullanmak

Blogumu RSS’den takip edenler muhtemelen değişimi görmemiştir (RSS’deki bozukluk dışında). Bundan iki ay önce Dreamhost sunucuların genelini etkileyen bir saldırı sonucunda hasar gördü. Merak edenler için: Dreamhost Sites Hacked. Sabah kalktığımda bu manzara ile karşılaştığımda artık Wordpress’i terketmenin zamanı geldiğini anlamıştım.

Wordpress artık işimi görmemeye başlamıştı. Her ay güncellenmesi, durmadan ihtiyacımın olmadığı özellikleri eklemesi, güvenlik açıkların artması, her geçen gün daha da hantalaşması,vs.. Uzun zamandır bu hantal yapıdan kurtulmayı düşünüyordum. Çünkü Wordpress benim için sadece basit bir blog arayüzünden fazlası değildir. Sunduğu özellikler böyle bir açık kaynak kodlu proje için muazzam olsa da benim için gereksiz bir yükten başka bir şey değildi. Yukarıda anlatığım durum gerçekleşince ben de soluğu Jekyll‘de buldum.

Jekyll nedir?

Jekyll statik site üreticisi diye geçiyor. Bunu biraz daha açayım. Jekyll, Ruby ile yazılmış bir uygulama. Belli bir sisteme, şablona göre bir klasör oluşturup içindeki dizinleri oluşturuyorsunuz. Örneğin benim klasörümdeki dizinler şu şekilde:

Jekyll Template

Yukarıdaki klasörler oluştuktan sonra bu dizin içinde şu komutu çalıştırıyoruz:

# jekyll --safe

Jekyll, yukarıdaki dizini tarıyor ve sonunda _site diye bir klasör oluşturuyor(yukarıdaki resimde yer almıyor, ona sonra değineceğim). Bundan sonra sizin tek yapmanız gereken herhangi bir tarayıcı ile bu _site altındaki index.html dosyasını açmak. Aslında tüm blogunuz ve içeriği _site klasörü içinde oluşmuş ve herhangi bir websunucu üzerinde (Apache,vs..) yayınlamaya hazır duruyor. Hepsi bu kadar. Herhangi bir veritabanı, kurulum,vs.. gibi adımlar yok. Jekyll’in güzel ve beni cezbeden yönlerinden biri bu.

Jekyll’de blog yazma işlemi nasıl işliyor?

Jekyll’de yazılarınızı Markdown veya [Textile](http://en.wikipedia.org/wiki/Textile_(markup_language) formatlarında yazabilirsiniz. Böyle olunca hem daha rahat ve hızlı bir şekilde yazabildiğiniz gibi, Vim, Emacs gibi metin düzenleyiciler ile de değiştirebilirsiniz (Jekyll’in bir güzel yani daha).

Bu yazıları da _post dizini altına yerleştiriyorsunuz. Peki bunun nasıl göründüğünü, yani çıktısını nasıl göreceksiniz? Yukarıda bahsettiğim gibi _site klasörü aslında bizim blogumuzun birebir çıktısı oluyor. Tek yapmanız gereken bir web tarayıcı ile bunu açmanız. Jekyll bir adım daha öte gidip size bir kolaylık sunuyor. --server parametresi ile çalıştırdığımızda

# jekyll --server

yerel bir sunucu oluşturuyor ve bize _site içeriğini sunmaya başlıyor(yerelde 4000 port numarasında). Yerelde doğrudan locahost:4000 portundan inceleyebilirsiniz sitenizi.

Örneğin ben genellikle tmux’da iki tane yan yana pencere açıyorum, birinde Jekyll sunucusu çalışıyor bir yanda da Vim açık şekilde yazımı yazıyorum. Vim’de ne zaman yazımı kaydetsem Jekyll bana son halini sunuyor:

Jekyll-Vim çalışma akışı

Jekyll’de bloglar nerede ve nasıl host edilir?

Burada çeşitli seçenekler var. Aklıma gelen iki tanesi şu şekilde:

  1. Yerelinizde oluşan _site klasörünü satın aldığınız bir sunucuya yüklemek. Tabi her seferinde tüm _site klasörünü yüklememiniz tavsiye edilir. Bunun yerine ya bir betik yazıp sadece değişiklikleri sunucunuza yüklersiniz (web jargonunda deploy derler). Bunun için Google’da Jekyll Deployment diye aratırsanız insanların çeşitli betikler, çözümler sunduğunu göreceksiniz.

  2. Ya da Github’in Github Pages özelliğini kullanacaksınız (ben bu şekilde kullanıyorum). Github’ın Jekyll desteği var ve size özel subdomain veriyorlar. Ayrıca CNAME özelliği sayesinde satın aldığınız bir domain ismini de buraya yönlendirebiliyorsunuz. Mesela blog.arsln.org adresi farslan.github.com adresini işaret ediyor(bu yüzden github linkine tıklarsanız kişisel siteme yönlendirileceksiniz). Github’daki en güzel özellik doğrudan Jekyll desteği olmasıdır. Yani siz normal bir git deposu açıyorsunuz, yukarıdaki resimdeki gibi bir Jekyll klasör şablonu oluşturuyorsunuz ve gerisini github’a bırakıyorsunuz. Depoyu oluşturduktan sonra depda her değişiklikte (commit) github otomatik olarak jekyll --safe komutunu çalıştırıp _site klasörünü oluşturuyor.

İyi güzel de, nasıl kurulur bu Jekyll, nasıl başlayalım?

Geldik en can alıcı noktaya. Yukarıdaki anlatıklarım ile ilgili sorunun yoksa ve ben bu işi yaparım diyorsanız bundan sonrası kolay. Burada asıl konu Jekyll Nedir sorusuna bir cevap bulmaktı. Yani muhtemelen Jekyll’e geçmek istediniz ama bir türlü işlerin nasıl yürüdüğünü anlamadınız. Yukarıdaki anlatıklarım umarım bu konuda yardımcı olmuştur. Bundan sonra yapmanız gerekenler şunlar:

  1. Sıfırdan bir blog başlamayı düşünüyoranız başta Jekyll’i yerel makinenize kurmalısınız(bu her koşulda yapılmalı). Jekyyl ana sayfasındaki kurulum notlarına bakabilirsiniz.

  2. Jekyll’i kurduktan sonra Jekyll’in klasör yapısını ve anlamına bakabilirsiniz.

  3. Jekyll’in altyapısı ve işlevini öğrendikten sonra asıl mesele olan kendi blogunuzu oluşturmaya geldi. Jekyll’de güzel olan kısım ise, bir uygulumanın kaynak koduna bakar gibi blog sitelerin kodlarına bakıp değiştrebilmenizdir. Bu konuda bir süre site var. Örneğin şurada bir çok kullanıcın Jekyll ile yapılmış sitelerini ve kaynak kodlarını görebilirsiniz: Jekyll kullanıcı siteleri. İsterseniz benim Github’daki bloguma da bakabilirsiniz: farslan.github.com

  4. Wordpress’iniz varsa ve geçmeyi düşünüyorsunuz Wordpress to Jekyll aramasını yapıp bununla ilgili belgelere bakabilirsiniz.

  5. Markdown veya [Textile](http://en.wikipedia.org/wiki/Textile_(markup_language) öğrenebilirsiniz.

Jekyll konusunda bir uyarı

Jekyll’de RSS’den tuttun da yorumlara kadar her şeyi kendiniz yerleştirmeniz gerekiyor. Hatta anasayfa’da üç/dört/beş tane yazı çıkmasını sağlamak bile sizin göreviniz. Sitenin tasarımı, Jekyll konfigurasyonları, eklentileri (örneğin kod renklendirmeleri), gibi bir çok konuyu baştan veya başkalarının şablonlarına bakıp oluşturmanız gerekiyor. Yukarıda verdiğim bağlantılar bu konuda size bir önayak olacaktır.

Bu blogun okuyucusu iseniz muhtemelen bu tarz şeyler sizin için sorun oluşmayacak, ama Wordpress’i basit işler için kullanıyorsanız, Vim’in, Terminal’in yanınından bile geçmediyseniz ve şu ana kadar anlatıklarım ile ilgili soru işaretleriniz oluştuysa elinizi bile vumayın. Çünkü Jekyll terminal, shell, geliştirme gibi konularda aşınalık ve bilgi istiyor. Yani daha doğrusu Jekyll ile uğraşmak istiyor ve kullanmak istiyorsanız bu bilgiler şart.

Jekyll’in avantajları

Benim açımdan en güzel yani Github’da hiç bir derdim olmadan kullanabilmek. Blogda kullanacağım resimleri kişisel hostumda tutuyorum. Yorumlarımı da şahane bir yorum hizmeti olan Disqus ile yönetiyorum. Diğer kalan tüm işlerim github üzerinde olduğu için çok hızlı ve sorunsuz bir altaypıya sahip oluyorum (hız konusu gibi).

Bunun dışında yazılarımı Vim ile yazıp, yerelimde istediğim tarayıcıda sitemi anında görebilmek ve yazıyı oluşturduktan sonra basit bir git push origin master ile konsoldan github’a yollamak paha biçilmez bir deneyim sunuyor bana. Benim gibi işlerinizin çoğunu konsol üzerinden yapıyorsanız, vim/emacs kullanmayı seviyorsanız, git hastası iseniz Jekyll tam biçilmiş kaftan.

Yorum kısmında yazı ile ilgili düşünceleri ve önerilerinizi yazabilir, aklınıza takılan soruları sorabilirsiniz.

1 Mayıs 2012

Pardus’tan ayrılışım ve sonrası

Kısa Özet

TÜBİTAK’da yer aldığım Pardus projesinden istifa ettim iki hafta önce. Tam 20 ay ( ~1.5 yıl) severek çalışmış, iyi insanlar tanımış, bir çok güzel bilgi öğrenmiş, ama üzgün ve hevesi kırılmış biri olarak ayrıldım. Neden mi?

Uzun Hikaye (geçmişe dair)

Nerden nasıl başlasam sözlerime bir türlü bilemedim. Bu yazılanları büyük bir hüzünle yazdığımı belirteyim. İnsanoğlu hayallerle büyür ama bu hayaller tam gerçekleştiği sandığınız anda kül olup uçtuğunu geç fark ediyor. En iyisi ben kaseti en başa sarıp o şekilde size hikeyimi anlatayım.

Yıl 2010. Hacettepe’den mezun olmama iki ay kala Pardus projesine iş başvuruşunda bulunmuştum. 2008 yılında staj yapmıştım ve böylelikle de ekibin bir çok kısmını kısmen de olsa tanıyordum. Linux ile maceram ise 2005 yıllarına dayanıyor. İşim güçüm Linux idi, okulda insanlara Linux’u anlatırdım, Linux kullanır, Linux CD’si dağıtırdım(Maviportal), kişisel blogumda belgeler yazardım, insanlarla tartışırdım. Bundan daha keyifli bir şey yoktu benim için. Akşam okuldan geldiğim gibi Archlinux ile ilgili gelişmeleri takip eder, şu an hangi teknolojiler, hangi paketlerde ne özellikler mevcut, sistemde ne gibi değişiklikler olacak diye adım adım takip ederdim. Seviyordum çünkü.

Hal böyle olunca Pardus’ta işe başlamak da hayallerimden biriydi. Nitekim öyle de olmuştu. Erkan Tekman’dan kabul mektubunu alınca bölümün önünde sevinçten zıpladığımı, gözlerimin güneş misali parladığı o an orada olanlar bilir. Akşam üstü bunu aileme söyledim ve 2010 Ağustos ayında ise resmen Pardus ekibinde işe başlamıştım.

Pardus ofisinde ilk iş günüm (Ağustos 2010)

İlk ofisimde Onur Küçük, Ozan Çağlayan, İbrahim Güngör ve Serdar Dalgıç vardı. İşe başlamamla birlikte hangi konularda çalışacağım ile ilgili bilgiler aramaya konulmuştum. “İşe Alıştırma” gibi bir faaliyet yoktu, “İşe dalıp” çalışmak vardı. Ben de bilgisayarımı kaptığım gibi ofiste ne yapabilirim diye sormuştum. Onur Abi(ben böyle seslenirdim kendisine): “Bugzilla’daki yeni paket isteklerine bakabilirsin, hataları çözebilirsin, oradan bir gir istersen” demişti. Ben de bunun üzerinde Bugzilla’ya girip gözüme ilk kestirdiğim yeni paket isteğini yapmaya konuldum. Paket ise Geogebra idi.

Daha öncesinde paket yapmama (2009 yılında) rağmen her şey benim için yeniydi. O yüzden hiç yerimde durmuyordum, ayağa kalkıp ofis ofis dolanırdım. Bilmediğim ne varsa her birini tek tek sorar, not alırdım ve uygulardım. Hal böyle olunca da birinci hafta “Yapılacak iş var mı? Bana iş verin” diye serzenişte bulunduğumda bana Texlive ailesinin tüm paketleri atanmıştı. Amacım hem yeni çıkacak Pardus 2011 için bunları yeniden düzenlemek hem de Pisi’den çıkan texlivemodules actionsapi’yi sil baştan tekrar düzenlemek. Texlive paketleri ile uğraşırken gözüme kestirdiğim bazı hataları da kendimce çözmeye çalışıyordum. Bunları da zaman zaman blog yazıları niteliğinde sizlerle paylaşmıştım.

Zamanla bu paketlerin üzerine Fatih Aşıcı’dan da tek tük işler alarak devam ettim. Kimse boş durmuyordu, herkes bir şeyi bir yerlere yetiştirmeye çalışıyor bir şeyler yapmaya çalışıyordu. Ben de bu hızın içinde kendimce bir şeyler yapmaya çalışıyordum. Fatih Aşıcı ile yaptığım işler artınca ve Fatih’in Nisan 2011’de askere gideceği kesinleşince yavaştan onun işlerini devralmaya başladım. Ofisi değiştirdim ve onun yanına geçmiştim. Fatih Aşıcı ile başta Panda ve Panda-KDE olmak üzere bir sürü güzel işlere imza attık.

Fatih Aşıcı askere gidince ona ait paketlerin %70-80’i devralmıştım. Zamanla onun paketlerin bakımı ile uğraşıyor ve bir yandan da X11, Mesa, Ekran kartları gibi teknolojirdeki gelişmeleri takip ediyor ve öğrenmeye çalışıyordum. Hatta bununla ilgili gelişmeleri de sık sık bu blogda sizlerle paylaşıyordum. Örneğin “Wine 64bit” konusundaki gibi. 2011 Ağustos ayında ise, yani tam bir yıl sonra işe iyice alışmıştım. İş yerimi, iş ortamını çok seviyordum. “Bundan sonrası çok güzel olacak, bir sürü güzel işlere imza atacağız, güzel işler yapacağız” diye söylenip duruyordum. Bu bundan 7-8 ay önceydi.

Ayrılıkların başlaması (Temmuz-Ağustos 2011)

Tabi bu şekilde ilerlemedi hiç bir şey.

2011 güzünde ekipten insanlar tek tek ayrılmaya başlamıştı. İsimlerini tek tek vermek istemiyorum, zira gidenleri geliştirici listesi, twitter gibi mecralardan görmüşünüzdür. Gidenler Pardus ekibinde yıllarca çalışmış, deneyimli insanlardı. Onlar gittikçe üzerimizde iş yükü artıyor, ileride yapmak istediklerimize dair hayaller de sönükleşiyordu. İş yükü artıyordu çünkü bu kadar çok paketin bakımını yapmak gerçekten çok zordu. Zor olmasının en büyük etkenlerden biri de eşit olmayan paket dağılımı idi. Benim üzerimde 300’e yakın paket varken, bir başkasının üzerinde en fazla 40-50 olabiliyordu. Bunu her ne kadar eşitlemeye çalışsak da, geliştiricilerin bu konudaki tutumu bu işi daha da zorlaştırmıştı.

İnsanlar ayrıldıkça kurumsal alanlarda da işler artmaya, yeni işler doğmaya başlıyordu. Bu yeni işlerden biri mesela Fatih Projesi idi. Fatih Projesi daha yeni duyulmaya başladığında Pardus ekibi olarak (Erkan Tekman önderliğinde) sık sık Ankara’ya gider gelirdik. O zamanlarda MEB Eğitek’de iki tane akıllı Tahta üzerinde 1-1.5 gün içinde Pardus’u sorunsuz bir şekilde çalıştıracak hale getirip göstermiştik. Erkan Tekman ta o zaman Pardus’un yapabiliceklerini, yapamayacaklarını, yapılması gerekenleri tek tek sıralamış ve bildirmişti.

2011 Kış ayında Tübitak Yönetimini değişmeye başladı. Tübitak içinde yapılan büyük bir toplantı sonucunda Pardus’un Fatih Projesinde yer almaması karar verilmişti. Bizimle yapılan bir toplantı da Pardus’un fiyat kırıcı rolü üstlendiğini, bu yüzden Microsoft karşısında -5 dolar kadar bir avantaj sağladıklarını, o yüzden Pardus’un bu konudaki başarısının yadsınamaz olduğu dile getirilmişti. Bunun duyan ekibin bir kısmı buna çok kırılmış (haklı olarak) ve ayrılmaya karar vermişti. Kan kaybı artarak devam etti bu günden sonra.

Son aylar (Ocak-Nisan 2012)

Aradan aylar geçti. Daha önce yukarıda saydığım isimlerin olduğu ofiste tek başına kalmıştım, var olan işleri düzenlemeye çalışıyorum, bir yandan da ansızın çıkan Fatih Projesi ile ilgili konusunda çalışıyordum. Ben de herkes gibi ayrılmaya karar vermiştim. Sebebleri çoktu, bunun en başında iki yıl önceki hayallerimi gerçekleşmek ve bir şeyler yapabilmek için gerekli zeminin yok olmasıydı. Belki bazı insanlar devlete kapağı atıp tüm gün oturup, aklı zorlamayan rahat işler yapmayı seviyordur, ama ben bunlardan biri değildim.

Çalıştay’da da “501 Developer” sözünü duyunca üzüldüm biraz. “501” geliştiricisi olmak kötü bir şey değil, ama TÜBİTAK tarafından sanki yıllardır böyle çalışıyormuşuz gibi itham edilmek beni çok üzdü. Çünkü bu proje’de yer almış herkes bilir ki, gecesi, gündüzü, haftasonu, fark etmeksizin çalışan bir ekip vardı. Mesai kalmak zevkti ve eve gitsek bile çalışırdık. Kaldı ki bu Pardus Projesinde işe başlayan insanların çoğu zaten işe başlamadan önce de boş zamanlarında destek veren insanlardı. “Sabah 8:00 akşam 17:00 arası çalışıyorsunuz, bize hevesli insanlar lazım” diye itham edilmek hoş olmadı.

20 ay önce Ankara’dan yola çıkarken yanımda bir bavul ve gönlümde yatan kocam hayalim, Pardus’a olan sevdam, hevesim vardı. Fedakarlık yapıp ailemi, dostlarımı, en yakın arkadaşlarımı, anılarımı, alışkanlıklarımı bırakıp gelmiştim. Pardus ve Pardus’la beraber bu ülkem, bu dünya için güzel şeyler üretebilirim diye çıkıp gelmiştim.

Pardus projesiyle ilgili gelişmeler bana herhangi bir proje için bu denli fedakarlığı hiç bir zaman yapmamam gerektiğini acı bir şekilde öğretti.

..

Bu projede yer aldığım sürede bana desteğini esirgemeyen, sorduğum tüm sorularımı eksiksiz bırakmayan, kimi zaman dertlerimi dinleyip derman olan herkese teşekkür ederim. Sizlerden çok şey öğrendim, inşallah ben de öğrendiklerimi yeri ve zamanı geldiğinde başkalarına aktarabilme şansına sahip olurum.

Yeni iş? Gelişmeler var mı ?

Pardus’tan sonra yeni bir işe başladım(16 Nisan 2012 itibariyle). Tanıdık simalar ile çalışıyor olacağım. Önümüzdeki yıllar blogumda yeni işimle ilgili edindiğim bilgileri yine sizlerle paylaşacağım.

22 Nisan 2012

WP Twitter Auto Publish Powered By : XYZScripts.com