02 March 2015

Richard Stallman İstanbul'da


Geçtiğimiz cumartesi Sabancı Üniversitesi'nde gerçekleşen Richard M. Stallman'ın "Telif Hakları ve Toplum" sunumuna katıldım.

Katılımın çok fazla olacağını düşünmüştüm. Hatta bu kalabalıkta oturacak yer bulamam diye biraz endişelenmiştim.  Ama üniversitenin konumundan olsa gerek bir insan seli durumu yoktu. Çanakkale'den yine kalabalık gelmiştik. Necdet Hoca'nın mezun öğrencileri ile birlikte sunumda birbirini tanıyan en büyük gruptuk sanırım.

Stallman, sunumuna özgürlüğü, bir yazılımın neden özgür olması gerektiğini ve özgür yazılımın esaslarının neler olduğunu anlatarak başladı. Kullanılan sistemin insan özgürlüğüne saygı duyması gerektiğini söyledi. Bu sözünü çok sevdim:) Özgür yazılımı hiç bilmeyip ilk kez orada Stallman'dan dinleyen birisi için verdiği örnekler hayatın içinden, somut, net ve açıklayıcıydı. 

Bir işletim sistemi için gerekli olan tüm yazılımlar hazırken (çekirdek hariç) , Linus'un yazdığı çekirdek kullanıldı diye bu işletim sistemine  sadece "Linux" işletim sistemi dememizin doğru olmadığını "GNU/Linux" olarak kullanılması gerektiğini söyledi.
 
Daha sonra açık kaynaklı yazılımlardan ve bunun neden etik olmadığından, sansürlerden, telif haklarından ve lisanslardan bahsetti. Özgür yazılımın felsefesi ile ilgili daha ayrıntılı cevapları buradan bulabilirsiniz.

Konuşma sonunda GNU peluşu açık artırmaya sunuldu.(FSF için) Peluşun sahibi Necdet Hoca oldu :)

Sunumdan sonra Stallman soruları yanıtladı. Verdiği cevaplar da konuşmasında olduğu gibi netti.

Özgür yazılım hareketini başlatan kişiden, özgür yazılımı dinlemek çok çok güzeldi. Bilgi ve Sabancı Üniversitesi'ndeki sunumu kaçırmış olabilirsiniz ama hala katılmak isteyenler için, Ankara Üniversitesi'nde bir konuşması daha olacak. Stallman bir daha ne zaman Türkiye'ye gelir bilinmez. Gidebilecek durumu olanlar için bence kaçırılmaması gereken bir fırsat.

Etkinlikten sonra, bu kalabalık ekiple bolca sohbet etme fırsatım oldu. Benim için yine aşırı keyifli geçen bir gündü :) Görüşmek üzere.


01 March 2015

Maildeki Ekli Dosyayı Indiren Python Script


Mail içerisinde gelen ekli dosyayı IMAP SSL bağlantısı sağlayarak indirdikten sonra, okundu olarak işaretleyip, okundu olarak işaretlenen maillerin deleted olarak etiketlenmesini sağlayan python scripti.

#!/usr/bin/env python

import email
import getpass
import imaplib
import os

detach_dir = '.'  # directory where to save attachments (default: current)
user = "username"
pwd = "password"

# connecting to the gmail imap server
m = imaplib.IMAP4_SSL("mail.domain.com")
m.login(user, pwd)
m.select("INBOX")  # here you a can choose a mail box like INBOX instead
# use m.list() to get all the mailboxes

# you could filter using the IMAP rules here (check http://www.example-code.com/csharp/imap-search-critera.asp)
resp, items = m.search(None, 'UNSEEN')
items = items[0].split()  # getting the mails id

for email_id in items:
    # fetching the mail, "`(RFC822)`" means "get the whole stuff", but you can ask for headers only, etc
    resp, data = m.fetch(email_id, "(RFC822)")
    email_body = data[0][1]  # getting the mail content
    mail = email.message_from_string(email_body)  # parsing the mail content to get a mail object

    # Check if any attachments at all
    if mail.get_content_maintype() != 'multipart':
        continue

    print "["+mail["From"]+"] :" + mail["Subject"]

    # we use walk to create a generator so we can iterate on the parts and forget about the recursive headach
    for part in mail.walk():
        # multipart are just containers, so we skip them
        if part.get_content_maintype() == 'multipart':
            continue

        # is this part an attachment ?
        if part.get('Content-Disposition') is None:
            continue

        filename = part.get_filename()
        counter = 1

        # if there is no filename, we create one with a counter to avoid duplicates
        if not filename:
            filename = 'part-%03d%s' % (counter, 'bin')
            counter += 1

        att_path = os.path.join(detach_dir, filename)

        # Check if its already there
        if not os.path.isfile(att_path):
            # finally write the stuff
            fp = open(att_path, 'wb')
            fp.write(part.get_payload(decode=True))
            fp.close()

# flag as deleted
dresp, ditems = m.search(None, 'SEEN')
ditems = ditems[0].split()
for demail_id in ditems:
    m.store(demail_id, '+FLAGS', '\\Deleted')
    m.expunge()

 



Richard Stallman - Telif Hakları Sunumu


Bu sene Stallman Türkiye'ye geldi. İstanbul'da iki sunum yaptı ve Bilmök'te bir sunum daha yapacak. Etkinlik hakkında bilgi için buraya bakabilirsiniz.

Ben Sabancı Üniversitesi'nde yapılan Telif Hakları konuşmasına katıldım. İlk defa bu kadar büyük bir insanın yaptığı konuşmaya katıldım, çok mutluyum. İstanbul Avrupa tarafında oturmam ve etkinliğin Tuzla'da olması nedeniyle 09:30da yola çıktım ama olsun :). Sabah Kadıköy'de Gülçin ile buluşup servisle etkinliğe gittim. Bu kadar zaman sadece sosyal ağlardan konuşma fırsatı bulduğum insanlarla yüz yüze görüşmek de heyecanlı oluyor.

Etkinliğe muhtemelen kapılar kırılır, ortalık yıkılır düşüncesi ve Necdet hocayla (ve ekibiyle) daha fazla vakit geçirmek için bir saat erken gittim. Necdet hocayı ve arkadaşlarımı görme kısmı tamamdı ancak böyle bir etkinlikte dolup taşıp oturmaya yer olmaması gibi bir durum beklerdim, olmadı. Salon doluydu ancak yine de beklediğim hararet yoktu.

Stallman konuşurken "bu konuda en mantıklı böyle düşünebilirdi" düşüncesi aklımda oluştu. Aslında Necdet hoca da bize okulda yıllardan beri Stallman'ın felsefesinden, görüşlerinden bahsediyor. Stallman konuşurken "Necdet hoca da bize bunlardan bahsetmişti" şeklinde hatırladım. Stallman'ın bize bahsettiği noktalar:

- Özgürlük nedir? Özgürlük yazılım açısından nedir?
- Özgürlük kod içeriği şöyle olmalıdır, böyle güvenli olmalıdır, gibi şeyleri göz önüne almaz, kullanıcının onu değiştirebilmesi, dağıtabilmesi anlamına gelir
- Özgür olmayan yazılımlar oluşturulmamalıdır
- İnsanların sahip olduğu yazılımları paylaşma hakları ellerinden alınmamalıdır
- Eğer bir sistem içerisinde özgür olmayan başka yazılımlar da varsa o sistem özgürlüğünü kaybeder

Bunun dışında tersine mühendislik hakkında da güzel şeyler söyledi. Üniversitelerde ders olarak verilmesi gerektiğinden bahsetti. Bir de Torvalds hakkında da .. :(. Bu ara Linux Vakfı'nda staj yaptığımdan yine de öyle demesek mi şirinliğinde dinledim :). Torvalds'ın Gnu projesini de kullanarak bir çekirdek oluşturduğunu ve Gnu içerisinde bir boşluk oluşup Linux'un geliştirildiğinden bahsetti.

Etkinlik başlarında Gnu is not unix şakası oldukça döndü. Bu cümleyi ilk okuduğum zamanı dün gibi hatırlıyorum. 2. sınıftayken Gnu ne acaba diyip What is gnu yazdığımda gördüğüm ilk cevap Gnu is not unix olmuştu. O zamanlar çok yeni olduğumdan "hmmm .. Pek anlamadım, bir daha okuyalım, Gnu is not unix .. hmm ..". O halim de pek şirindi ;).

Etkinliğin sonlarına doğru Gnu peluş oyuncak açık artırmaya sunuldu ve sahibi elbette ki Necdet hoca oldu. Aslında yedi kişi bir Gnu'ya girsek de olabilirdi ama .. :).

Açık artırmadan sonra dinleyicilerin sorularına yer verildi ve soranların bir kısmı Stallman'ın aslında iddia etmediği şeyleri sanki Stallman öyle düşünüyormuş gibi sordu. Düşünceler hakkında böyle düşünmek de yanlış olmaz mı, ya da şöyle düşünebilir mi şeklinde sorulmasını anlarım ama salonda ben haklıyım şeklinde yapılan konuşmalar vardı. Stallman'ın buna verdiği cevap beni dinlemeye gelenler bana katılmayabilir ne yapabilirim oldu :).

Etkinlik çıkışında Necdet hoca ve öğrenci/mezun grup birlikte vakit geçirdik. Dün Kaan'ın da söylediği gibi ben biraz neşe saçmış olsam da çok güzel bir gündü. Aşağıda etkinlikten fotoğraflar, Stallman ile topluca fotoğraf çektirdik :)







28 February 2015

ÇOMÜ'de Bilgisayar Mühendisliği Okumak


Geçtiğimiz yaz haziran sonunda lisans dönemimi tamamlamış oldum. 4 yıl süren dolu, heyecanlı bir üniversite hayatı oldu.

İlk sene her yeni gelen gibi şehir efsaneleri duydum, okulu bitirebilecek miyim, acaba doğru bir bölümde miyim gibi her arkadaşımda olan hislere kapıldım. Daha önceden bilgisayar bilimlerine yakınlığım yoktu, soyut konuları sevdiğim için bu bölümü seçtim. Zaten güzel ülkemde öğrencilerin nasıl bölüm seçtikleri kendi başına ayrı bir konu, ona şimdi burada değinmeyeceğim :).

1. sınıftayken Necdet hoca bize derste öğrencilerinden bahsederdi, bana da hep Necdet hocayla çalışmak uzak bir hayal gibi gelirdi, hayal dememin nedeni kendimi yetersiz görmem, o kadar yetenekli değilim, zeki değilim, ben düz lise çıkışlıyım (ne alakaysa :)) gibi .. şuan çoğu öğrencide malesef olan hisler.

Bir gün ÇoMaK ekibi alt sınıflara sunum yapacaktı, ben bu sunumu son anda öğrendim. Ondan birkaç hafta önce etkinliklere katılmalıyım, araştırma yapmalıyım gibi düşünceler aklımda oluşmaya başlamıştı. Bu sunum tam bunun üzerine denk gelmişti. O gün sunuma dinlemek için katıldım ve aynı gün Necdet hocanın ekibi arasına katıldığım gün oldu. Zaten etkinliğe katıldığın zaman böyle katılacaksın :P.

Bilgi işlem o zamanlar çok kalabalıktı, ben de pek küçüktüm ;). O zaman etrafımda Gsoc'a alınmış birçok insan vardı, bu benim üzerimdeki heyecanı daha çok artıran bir etkendi. 1. sınıftayken İngilizce'min ne kadar yetersiz olduğunu hatta hiç olmadığını fark ettim. 1'in yazından beri kurslara gidiyorum, neredeyse 3. sınıfa kadar da evde kendim kelime ezberleyerek geçirdim. 20 yaşına gelmiş bir insan olarak İngilizce iki kelimeyi bir araya getirememek gerçekten pek utandığım bir durumdu. Neyse o sorunlar da zamanla azaldı. Hatta 3. sınıfta yaptığım konuşma pratikleri 4. sınıfın sonunda Google'a iş görüşmesi için İrlanda'ya kadar gitmemi sağladı.

Öğrenciyken mezun olabilir miyim düşüncesi yerini notları sınıfta en yüksek olan öğrencilerden biri olmaya bıraktı. 3. sınıfın sonlarına kadar mezun olunca nasıl iş bulacağım düşüncesiyle kendimi geliştirme çabalarım ise yurt dışına burs alarak gitmeyi nasıl sağlayabilirim çalışmalarına döndü :).

Öğrenciyken bilgisayar bilimleri hakkında birçok farklı alanda çalıştım. Hepsinde tam bir çalışma ve birçok derin özelliğini öğrenme kadar ilerlemesem de hangi alanlarda çalışabileceğimi gördüm ve birçoğunda uygulama geliştirdim. Masaüstü uygulamaları, web uygulaması, sunucu tarafında çalışacak yazılımlar, sunucu yönetimi ve sistem yöneticilerinin kullandıkları teknolojiler, kavramlar gibi şeylere baktım. Android cihazlara uygulama yazmaya da baktım ancak pek fazla ilgimi çekmedi.

3'teyken OPW için Gnome'a katkı verdim ve o süreçte ilk kez yabancı biriyle uzaktan çalışıyordum. 3'teyken Ruby & Gtk  kullanmam, Ruby'nin eksik gördüğüm yanları nedeniyle bana listelerde soru sorma alışkanlığı kazandırdı. Aynı zamanda liste takip etme alışkanlığını da. Listeleri takip etmek insana gerçekten çok şey kazandırıyor ve üstelik takip ederken çok az vakit harcamış oluyorum.

4. sınıfta Linux çekirdeği üzerinde çalışmaya başladım ve şimdi Gnome OPW, Linux Kernel'da staj yapıyorum.

Öğrenciliğim sürecinde Necdet hocayla çalıştım, yanlış yaptığım şeylerin doğrusunu ve bunun dünya genelinde nasıl olduğunu öğrendim. Bilmediğim birçok şeyden haberdar oldum ve daha sonra hiç bilmediğim başka şeylerden nasıl haberdar olabiliceğimi öğrendim (listeleri, blogları takip etme alışkanlığıyla). Kullanıcı dostu uygulama yazmak, belgelemek, standartlara uymak ve araştırmayı öğrendim.

4 yıl benim için yoğun geçti ve bu süreci kendimi geliştirmek için bir fırsat olarak gördüm. Bir süre çok hata yapıyorum, yapamıyorum gibi düşüncelere kapıldım hatta bir ara bilgi işlemden ayrıldım, sonra geri geldim ;). Çok renkli bir öğrencilik hayatım vardı :).

Necdet hocayla birlikte çalışmak çalışma enerjimi korumamı sağladı, kendisi hep enerjisine hayran olduğum bir insan. Birlikte çalışma sürecim boyunca da cesaretlenmemi sağladı.

Ben birçok konuda normalin üzerinde heyecana sahip olan bir insanım, bir zamanlar bu kadar heyecanlı olmayı iyi bir şey gibi görmezken daha sonradan fark ettim ki bu aslında çok güzel bir şey. Şimdi öğrencilik günlerime baktığımda (sanırsın on yıl önce mezun olmuş) bu heyecanlı günlerimi ve Necdet hocanın bu konuda yaptığı şakaları hatırlıyorum :). Necdet hoca benim hem öğrenciyken birlikte çalıştığım hocam hem de arkadaşım.

Aslında Çomü'de her şey bu anlattığım kadar pürüzsüz değil malesef. Benim gördüğüm hocaların büyük bir kısmında her geçen sene ders anlatma isteğinde azalma, aynı şekilde öğrencilerde de dinleme isteğinde bir azalma var. Sorun hiçbir şekilde dersin slaytlardan işlenmesi değil. Hayvan derisine yazarak işleyecek değiliz elbette. Sorun, dersin sadece slayt okunarak işlenmesi, o slaytları çıkıp ben de okuyabilirim. Akademisyen olmaya gerek var mı bunun için? En çok anlam veremediğim ise derste sorduğumuz sorulara tatmin edici bir cevap alamıyor olmak ya da geçiştirici cevaplar almak.

Uzun yıllar boyunca anlayamadığım bir konuda okulda büyük bir çoğunluğun birbirine suç atıyor olması. Pek az insan acaba öğrenciliğimi/öğretmenliğimi düzgün yapıyor muyum dedi. Genelde büyük çoğunluk suçu başkalarında buldu. Elbette ki mesele haklı haksız bulmak değil ama ortada öğrencinin kendini geliştiremiyor olması gibi bir problem var ve bu durum karşısında hocalara hiçbir şey olmuyor. İstediğin kadar tartış, şikayet et. Olan yine öğrencilere oluyor ve mesleğini sevmeden yapan nesiller yetişiyor. Evet, öğrenciler kendilerini yetiştirmek için bir şeyler yapmalı, internette her kaynak var, çok iyi üniversitelerde anlatılan dersleri internetten de izleyebiliriz. Hocalar her şeyi alıp öğrencinin beynine yerleştirsin de değil beklentim ancak bu yaptıklarının da doğru olmadığı çok açık ortada. 4. sınıfın ilk döneminde, mecburen tamamen ezber anlatan bir hocanın iki dersini birden seçmek zorunda kalmıştık, bu da 2000 slayt yapıyor ve slaytlar tamamen dolu, resim falan çok az var. Olsa da onları da inceleyerek ezberlemek gerekiyor. Bunun dışında zaten zorunlu olan ve ezber içerikli bir dersimiz de vardı. 4'ün ikisinde toplam 6 ders açıldı, ben bunlardan bir tanesini zaten seçemiyordum diğer 40 arkadaşım gibi. Yani bu durumda seçmeli adı altında geriye kalan 5 dersin 5'ini de aldık.

4. sınıfın sonlarına doğru tüm hayat enerjim çekilmiş gibi hissettiğim bir süreç oldu, bir gün çok enerjiğim diyerek derse girdim ve içim şişti diyerek dersten çıktım. Aslında içi çabuk şişen bir insan da değilimdir ama ..

Neyse ki dört sene bitti. Lisans deneyimimden sonra hep bahsetmek istediğim yukarıda şikayet ettiğim durumlar değil, onları belki birileri bir şeyleri değiştirir ümidiyle yazdım. Şimdi hatırladıklarım, kendime ne kadar çok şey kattığım, deneyimler, güzel çalışma ve bazen yaptığım gezme günleri :).

Locust – Açık Kaynak Kod Load Test Uygulaması


Locust, web uygulamaları üzerinde detaylı olarak stress test yapabilmeye olanak sağlayan açık kaynak kodlu çok güzel bir yazılım. Temel olarak yük testinin yapılacağı web uygulaması için hangi sayfalarda kaç kişinin gezeceğini, hangi sayfalardan hangi sayfalara geçileceği, toplam dolaşım süresinin ne olacağı vs. gibi detaylı senaryonuzu bir python scripti şeklinde tarif edip, locust’a bu senaryoyu simule etmesini söylüyorsunuz.

Aşağıdaki gibi güzel ve anlaşılır bir web arabirimi olan Locust aynı anda milyonlarca anlık ziyaretiçiyi belirlediğiniz eşik değerlerine göre web uygulamanıza dolduruyor ve arayüz üzerinden uygulamanızın kullanıcı isteklerine verdiği cevapların stabilitesini ölçüp sınırlarınızı tespit edebiliyorsunuz.

 


Devamini okuyun: Locust – Açık Kaynak Kod Load Test Uygulaması


Cagri Ersen tarafından Syslogs adresinde yayınlandı. | Permalink | Etiketler: ,



27 February 2015

Gemalto – İstihbaratcılar İzin Almadan İstediklerini Dinleyebilecek


ABD istihbarat örgütü NSA ve ingiliz gizli istihbaratının (GCHQ) ortaklaşa yaptığı operasyonda, Dünyanın en büyük sim kart üreticisi Gemalto hacklendi. Gemalto senede 2 milyar sim kartı üreten ve dünya çapında 450 tane GSM sağlayıcına sim kartı satan firma. Bunların içinde Turkcell, Avea ve Vodafone’un olup olmadığına iddiaya girer misiniz benimle? Gemalto’nun sim kartlarına yerleştirdiği özel […]

25 February 2015

Junos cihazlara SSH key ile erişim


Juniper’in JUNOS kullanan güvenlik cihazlarına (SRX firewall, EX-series switchler) password girmeden SSH key ile erişim için aşağıdaki adımları yapmak yeterli olacaktır. – Client üzerinde RSA key-pair oluşturun. ssh-keygen -t rsa – JUNOS cihaza bağlanın ve user ayarlarını değiştirin. goatleaf# set system login user gurcanozturk uid 2001 class super-user authentication ssh-rsa "ssh-rsa PASTE_YOUR_PUBLIC_KEY_HERE gurcanozturk@senna.local" goatleaf# commit …

23 February 2015

A/B Testlerinizi Doğru Yapıyor Musunuz?


Growth Hacking başlığı altında geçen olmazsa olmazlardan biri de A/B testleridir. A/B testlerinde amaç birden fazla varyasyonu test ederek hangisinin daha verimli olduğunu anlamaktır. A/B testi yaparken en çok yapılan hatalardan biri de testin başarıya ulaştığını düşünerek testi erken sonlandırmaktadır. Peki elinizdeki örneklem büyüklüğü (sample size) yeteri kadar büyük mü? Örneğin A ana sayfanız 1000 üzerinden 300 tıklama elde etmişse ve de B ana sayfanız 342 Devamını Oku […]

21 February 2015

Juniper EX-4500 switchte SNMP sorunu


Bugün ani güç kesilmesi sebebiye kapanıp açılan Juniper EX-4500 (virtual chassis) network switchimiz nedense kapanmadan önce SNMP üzerinden yanıt verdiği interface istatistiklerini, gelen/giden trafik istatistiklerini vermemeye başladı. Switch üzerinde mib kontrolü yapmaya çalıştığımda bile hata bilgi veremez durumdaydı. #show snmp mib walk 1.3.6.1.2.1.31 {master:0} # Linux bir sunucudan snmpwalk komutu ile deneme yaptığımızda ise istenen …

19 February 2015

Yenilemek için fazla dokunmayacağım


Yazılarda, sunumlarda, -özellikle- tezlerde, konferans ve hatta televizyonlarda son onbeş yıldır duymaktan sıkıldığımız başlangıç cümlesini yani  “Küreselleşen dünyada…” demeden değişen dünya ile ilgili bir yazıya başlayabilmek çok önem verdiğim şeylerden biri. Naçizane önerim; lütfen siz de bu iki kelime ile başlamayın.

İnternet çok büyük bir devrim, çok basit bir ilkeye dayanmasına rağmen gerçekten tarihteki en başarılı ve en büyük devrim diyebiliriz. 90’lı yıllardaki ilk hali ile de büyük bir devrimdi, şimdiki dinamik haliyle ise çok büyük bir devrim. Dünyada bugüne kadar bu kadar insanı birbirine birçok yönden bağlayabilen eşsiz bir proje. Basit olarak, karşılıklı kelimeler, ses ve görsel veriler iletilmesinden çok ötede bir şeyi başarıyor, insanlar birbirlerini etkileyebiliyor. Birbirlerini etkileyen insanlar ise çok değişiyor ve farklı bir şekilde başka insanları etkilemeye başlıyor. Tarif etmesi güç ama lise biyoloji derslerinde genetiğin temelini hatırlarsak, melezlenme ile yeni bezelye türlerin oluşması gibi, düşünce sistemleri de melezlenerek yeni düşünceler ve bunların yayılmasıyla oluşan daha doğrusu örülen kolektif bir beyinin paydaşı haline geliyoruz.

Düşünceler, algılama hatta duyguların internet ağı üzerinden adeta füzyon reaksiyonu gibi ortaklaştığını kolayca görüyoruz, tanık oluyoruz. İyi yönde bir gelişme olduğu şüphesiz. Kötü yönde bir eğilim üzerinde neler olabileceğini ise düşünmek dahi istemiyorum, dev bir karşılıklı ortak nefret dünyayı yok olma savaşına bile götürebilir…

Bir şeyin içindeyseniz değiştiğini çok olay farkedemezsiniz. Teknolojiyi de topluma göre biraz önden takip ediyorsanız -ki bir blog okuyucusu olmak bence bunun için yeterli bir göstergedir- her yeniliğin dünyayı değiştireceğini düşünüp sabırsızlanmış ve değişime şahitlik etmek için beklemişsinizdir diye tahmin ediyorum. Fakat değişimin gerçekleştiğini ancak başka birinin ağzından ‘Artık xxx değişti’ lafını duyduğunuz zaman anlarsınız, ki bu onay ispatı aynı zamanda sizin şahitlik sürenizi de bir anda siler götürür, birden bu gerçekle karşılaşmış gibi olursunuz…

İşte bu değişimin daha doğrusu içinde bulunduğumuz devrimin çok da büyük bir maliyeti var: ‘Bağlı olma zorunluluğu’-bağımlılığı nasıl tanımlarsanız tanımlayın, özü şudur günlük hayatınızda internetin yeri artık sabittir, erişme ve erişilebilme alışkanlığınız haline gelmiştir. Bağımlılıktan öte bir durum olduğunu düşünüyoum, organik bir bağ hissi, bağlı olma hissi, beslenme refleksi gibi…

İnternet bağımlılığı, sosyal medya bağımlılığı gibi genel adlarla zaten bu durumu tartışmış, konuşmuşsunuzdur… Ama ben durumun biraz daha farklı ve derin olduğunu düşünüyorum. Bu yazıda da duruma bu ciddiyeti kattığını düşündüğüm şeyi yazmak istedim: AKIŞ (stream)…

Algı olarak doğrusal bir çizgide gidiyoruz. Kolayı da bu, bir zaman sırasında tane tane akan bilgiler… Karmaşayı sevmiyoruz, zaman sırasına dizilmiş her çeşit bilgiyi karıştırmadan almak gerçekten çok kolay… Sosyal medyada bilgilir akışla geliyor, zaman çizginizde hakimiyet sizde, okuduğunuz internet gazetesi haberi size akışla veriyor… Sürekli olduğunuz haber sitesine bakın, neden ana haberleri numaralandırılmış, neden yukarıdan aşağıya doğru önem sırası değil de zaman sırasına göre sıralanmış haberler var? Kolayı bu da o yüzden. Kolay olduğu için takip etmeyi başarıyoruz ve başarabildiğimiz bu eylem zevk veriyor, bağlanıyoruz. Sözlük siteleri bile akışın ağırlıklı bir takip kipi içerisinde, aradığınız terim neyse dilerseniz ararsınız… Örnekleri fazla verip konuyu boğmaya gerek yok, günümüzdeki çoğu internet sitesi bir akış üzerine kurulmuş.

Bağlı olmak aslında internetten beslenir halde olmak gibi, ne yediğiniz size kalmış, süper bilgilerle de beslenebilirsiniz, süper saçma bilgilerle de. Elbette internet dünayadaki bütün bilginin kaynağı değil (en azından şimdilik), fiziki çevremiz ve yaşamanın ta kendisi bilginin diğer kaynakları. Dengesiz beslenme gibi dengesiz bir bilgi beslenmesi de sorunlara yol açıyor, obezite gibi düşünelim. Dengesizce internetten beslenir hale gelmemiz, doysak dahi daha fazlasını arama haliyle bizi akışımızın başına geçiriyor ve yenilemek için ya tıklıyoruz ya da sürükleyip bırakıyoruz… Nasıl bir ruh hali ise az sayıda gelen güncelleme, yeni bir habere denk gelememek, gelen kutumuzda yeni bir posta olmaması bizi mutsuz etmekte. Oysa o zaman dilimi içerisinde nasıl bir beklentideyiz… Dev internet ağı ve sınırsız içerik akışından bizim nasibimize az düşmesi açken yoksul sofrasında olmak gibi bir his veriyor. Ne kadar çok yenilersek o kadar az ile karşılaşıp daha mutsuz oluyoruz. Tabi akışla beslenmek gibi etkileşme ihtiyacı da aynı şekilde, insani ve sosyal bir ihtiyaçmışçasına internet üzerindeki ağımızdaki kişişelerle etkileşmeyi bir ihtiyaçmış gibi görüyoruz. Çoğumuz aile ve yakın arakdaşlarımızla fiziki platformda daha az etkileşiyoruzdur…

Bir akıllı telefon sahibinin ortalama 9 dakikada bir telefonunu kontrol ettiğini okuduğumda kendime üzüldüm. Hayatın akışındayken bir işin ortasında veya sohbet ederken birden zorunlulukmuş gibi telefona ya da bilgisayar ekranına dönmek… Ne kötü ama ne çok yapıyorum… Altını çizmek isterim, üzüldüğüm şey ekrana uzun süre bakmak değil, dönüp bağı kontrol etmek…

Ne yapalım, yolda, durakta beklerken nasıl geçsin zaman diyebiliriz… O metrobüsün içinde 4-5″lik bir dünya kapısını açmayalım mı? Açalım tabi ama mümkünse başı-sonu olan bir şey olsun ekranın öte tarafında, akışın periyodunu mümkünse biz belirleyelim. Ha bire yenilemeyelim, yeni haber var mı diye aynı siteleri her saat turlamayalım. Mümkünse okumadaki boşluklara doğru ileleyelim… E-kitap olur, daha sonra okumak için sakladığınız yazıları Pocked – Read it Later (Daha sonra oku) Feedly vb uygulamalara yüklenelim.

Geçtiğimiz iki ayı yolculukta Kindle ile kitap okuyarak geçirdim. Son on günde yolculuk süremi düşünmem gereken bazı konulara ayırdım bu nedenle kitap okumaya ara verdim. O konuları düşünemediğim gibi, beş dakika bakayım derken yolculukta 38 kere akış yenilediğimi farkedince ne kadar sıkıcı bir şeyin içine kendimi ittiğimi gördüm.Akışlar yoğunlaştıkça birbirini tekrar eden ve akışlardaki kişilerin de birbirini tekrar eden halle gelmesi gerçekten faydasız ve sıkıcı… Azı karar çoğu zarar…

 Bu yüzden artık yenilemek için ikidebir dokunmayacağım. Önemli bir haber – olay varsa zaten bildirimi gelir, çevrendekiler bahseder. Hem bugüne kadar hep haberleri herkesten önce takip ettim de ne oldu, cemiyet ortamında -aa şu olmuş denildiğinde yaşanan ortak heyecanı yaşamadım, ben onu çoktan öğrenip şaşkınlığımı tüketmiştim, çevremle o anda paylaşabildiğim tek şey törpülediğim küstahlığımla söylediğim -evet okudum ben onu- evet duydum…

Kendime sınır koymayı sevmiyorum, uymayınca benim kendime olan saygımın öz-benliğimce ezilmesini kendime yediremiyorum. Fakat (bu kelime ile cümleye başlanılamayacağı iddia ediliyor) günde üç kere toplu ve hızlı şekilde bu akışlara göz atmamın kafi olacağını ve bunu uygulamayı düşünüyorum. Sabah gazetesi, akşam postası gibi, bir de öğle benden olsun…

Spam engelleyici doğrulamalarındaki ‘Stop spam, read books (Spam yapmayı bırak, kitap oku)‘ sözünü ilk duyduğumdan bu yana çok seviyorum, ve her zaman kaybıyla ilgili konuda bu lafın türevlerini kafamda çeviriyorum, bu konuda da ‘Yenilemeyi bırak, kitap oku (Stop refreshing, read books)‘ diyerek kendimi motive edeyim.

Akış dedim, durgunluk ve dinginlikle bitireyim.

Sapanca Gölü Kenarında

Sapanca Gölü Kenarında – (1920 x1280 boyutlu duvar kağıdı halini indirmek için resme tıklayın – JPG – 538 KB) Ekran boyutunuza göre dilediğiniz ölçüde küçültüp/kırpıp kullanabilirsiniz)

Mutlu günler.

Bu yazı 1.000 kelime ve 7.395 karakter içeriyormuş, çok değil hani… Satır boşluksuz 2 adet A4. Ne kadar okudum/zaman kaybım oldu diye merak ediyorsanız işinize yarar :)



18 February 2015

Türkiye İçin PHP ile Twitter Trend Topics Listesi


Twitter Topic Trend’i sitenizin bir köşesine eklemek isterseniz PHP ve TwitterOauth kütüphanesiyle bu işi şu şekilde halledebilirsiniz.

 ?php
	//https://github.com/abraham/twitteroauth adresinden
	//twitterOauth kütüphanesini indirmeniz gerekiyor
	//sonra uygun şekilde çağırıyoruz

	require "autoload.php";

	use Abraham\TwitterOAuth\TwitterOAuth;
	
	//https://apps.twitter.com/ adresinden
	//uygulama oluşturuyorsunuz
	//uygulamaya ait keyleri bu alana giriyorsunuz
	$CONSUMER_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';
	$CONSUMER_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';

	//uygulama oluşturulduktan sonra
	//Uygulama -> Key ve Access Token alanından
	//Token Actions'dan token oluşturuyoruz
	$access_token = 'nnnnnnnn-xxxxxxxxxxxxxxxxxxxxxxxxxxx';
	$access_token_secret = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';

	//Türkiye için WeoID değeri
	$woeid = '23424969'; 

	$connection = new TwitterOAuth($CONSUMER_KEY, $CONSUMER_SECRET, $access_token, $access_token_secret);
	
	//API Versiyonu
	$connection->host = 'https://api.twitter.com/1.1/'; 

	//talebi gönderiyoruz ve sonucu alıyoruz
	$ret = $connection->get('/trends/place', array('id' => $woeid));

	//sonuçları yazdırıyoruz
	foreach ($ret[0]->trends as $topic)
	{
		echo 'url.'">url.'">url.'">'.$topic->name.'
'; }


14 February 2015

Akademik Bilişim 2015


    Bu sene 17. si düzenlenen bu etkinliğe ikinci katılışımdı. Etkinlik Eskişehir Anadolu Üniversitesinin ev sahipliğinde gerçekleşti. Bu sene bu etkinliğe bakış açımı değiştiren bir sene oldu. Çünkü önümüzdeki sene olacak akademik bilişim için hazırlıkların daha bu seneki akademik bilişim başlamadan başladığına şahit oldum. Ve bu büyük etkinlik çok az insanın devamlı desteğiyle ayakta duruyor. Etkinlik katılımcı-eğitmen sayısı olarak giderek büyüyor. Ölçek büyüdüğünde aklınıza hiç gelmeyecek küçücük bir şey bile büyük bir soruna dönüşebiliyor. Yaklaşık 1500 kişi kurslara kayıt olurken, yaka kartlarını alırken, kalacağımız yerlerde, prizleri kullanırken, internete bağlanırken, yemek yerken, sunumları dinlerken bir sorun yaşamadık. Ama sorun yaşamamamız için çok insan hiçbir maddi karşılık almadan uykusuz kaldı, çalıştı, emek harcadı. O gönüllüler ordusuna bir kez daha saygılarımı iletiyorum.

    İlk gün kayıt için normal olarak bir miktar koşuşturma vardı. Çünkü kursiyerlerin hepsi aynı anda kayıt masasına gelmişti. Sonra kursiyerler sınıflarına yerleşti ve kurslar başladı. Ortalık sakinleşti. Biz Necdet hocamla etkinlik boyunca tek tek sınıfları gezdik, herşeyin yolunda olup olmadığını kontrol ettik. 35 kurs 40 tan fazla sınıf vardı. Bu gerçekten yorucuydu ama yaşadığım en tatlı yorgunluktu :) Akgül hocanın yanımızda olamadığı zamanlarda Necdet hoca bir eli telefonda herşeyin yolunda olduğunu anlatıyordu :) Ama Akgül hoca da ne durumda olursa olsun sürekli çalışıyordu. Sunucular kuruyor sayfa sayfa mailler yazıyordu. Bunları yazarken etkinliğe bir kez daha uzaktan bakma fırsatı buluyorum ve nasıl büyük bir çaba ve fedakarlıkla devam ettiğini bir kez daha anlıyorum.

    Ders aralarında kursiyerle tanışıp etkinlik hakkındaki izlenimlerini öğrendik. Bizim gördüğümüz herkes etkinlikten memnundu. Memnun olmadıkları bir yer varsa söylemeleri için Necdet hoca ne kadar üstlerine gitse de  :) olumsuz bir  dönüş olmadı. Bu mutluluk verici.

    Günün sonunda eğitmenler ayrı yorgun kursiyerler ayrı yorgun oluyordu. Kolay birşey değil tabi. Sabah 9 dan akşam 6 ya kadar bir konu hakkında konuşmakta dinlemekte zor birşey.

    Bir de şahit olduğum bir olayı anlatacağım size. Sanırım bizim sınıfları gezip insanlarla konuşmamızı biraz kıskanmış olan biri -sanırım bir eğitmendi- hızlıca bi yere gidiyordu. Necdet hocanın yanından geçerken hocam en rahatı senin işin vallaha dedi ve gitti :) Aslında biraz da o kısmı vurgulamak istiyorum bu yazımda. Kötü niyetle demedi biliyorum ama keşke hiç demeseydi. O bir haftanın güzel geçmesi için çok öncesinden nasıl bir çalışma yapıldığını anlatacağım. Gördüğüm kadarını tabi. Her gün saatlerce telefon görüşmesi yapılıyor. Fiziksel sorunlar çıkıyor (elektrik tesisatının o kadar bilgisayar için uygun olmadığı gibi...) Bunlar çözülmeye çalışılıyor. Hakemler yapılacak olan bildiri seminer kurs ve panellerin gözden geçirme işini yapıyor. Hakem başına çok sayıda kontrol etmesi gereken başvuru düşebiliyor. Bunların düzeltilmesi gereken yerler başvuru yapanlara geri bildiriliyor. Düzeltmeler yapılınca tekrar gözden geçiriliyor. Bir karara varılana kadar bu böyle süregeliyor.  Kurslar belli olduktan sonra kurs başvuruları başlıyor. Başvurular bittikten sonra başvuranlar içinden kimlerin seçileceği konusu başlıyor. Her eğitmen kendi kursu için buna karar veriyor ama mail listesi sorun yaşayanların sorunlarıyla doluyor taşıyor. Mail listesine ya da organizatörlere yaşadıkları ve kendi çözebilcekleri şeyler için bile mail atanlar oluyor. Bunları takip etmek ve yapılan yanlışlara sabır gösterip kalp kırmadan bu işleri çözmek işte o etkinlilk günü en rahatı da sizsiniz dediğiniz adamların çok uzun süre yaptığı iş. Ve daha anlatmayı atladığım bir dünya şey var.

     Sonunda kurslar bitti katılımcılara katılım belgeleri dağıtıldı. Akgül hoca aramıza katıldı :)

    Ertesi gün benim içinde bulunduğum iki konuşma vardı. Biri panel biri bildiriydi. Bu ilk konuşmam olmamasına rağmen hep ilk günkü heyecanı yaşıyorum böyle zamanlarda :) Bi takım mide kelebeklenmeleri falan :)

    Akgül hoca açılış konuşmasını yaptı ve seminerler başladı. Daha öce 16 kez bu konuşmayı yapmış olan Akgül hocanın bile yeniden hazırlanmak için 4 saatini harcadığını gördükten sonra ne kadar hazırlansa yetersiz geliyor insana :) Ben 1 saat öncesinden panelin olacağı salondaydım. Sunumu projektörü kontrol ettim herşey yolundaydı. Kızlar geldi hazırlıklarımızı tamamladık. Ve dünden bugüne kadın yazılımcı ve toplumdaki yeri isimli panelimiz başladı.
                             

    Bir buçuk saat çok gelecek diye düşünürken yetmedi bile. Ama anlatmak istediğimizi dinleyicilere aktardığımızı düşünüyorum. Olumlu geri dönüşler aldık :)

    Arkasından yaz stajımda yaptığım süpervisor için merkezi yönetim arayüzü CESI yi sundum :)



    Benden sonra Necdet hocam yazılımları nasıl lisanslamalıyız adlı sunumunu yaptı. Bir yazılımı lisanslarken vermemiz gereken 4 ana karar olduğunu ve lisansın buna göre biçimleneceğini anlattı. Ve bu dört yol ayrımından mantıklı bi şekilde döndüğümüzde kendimizi özgür yazılım lisansları arasında bulduk. :) Bu sunumun insanların aklında çok ışık yaktığını düşünüyorum. Doğru bilinen yanlışlar,  masum görünen ahlaksızlıklar insanların gözleri önüne daha apaçık nasıl dökülebilir bilmiyorum.

    Etkinlik günlerinin her anından kendime ayrı bir ders çıkardım. Bana çok katkısı olan bu büyük etkinliği düzenlemede emeği geçen herkese tek tek  saygılarımı sunarım.

    Bu anlattıklarım etkinlik saatleriydi tabi... Bunların dışında Eskişehir de çok güzel zaman geçirdik. Tandığım o kadar çok insan vardı ki kendimi hiç yabancı hissetmedim Eskişehire. Her akşam başka güzel geçti. Bir gün dışarı çıktığımızda cadde üzerinde ilerlerken tanıdıklara rastlaya rastlaya 25 kişiye yakın bi topluluk olarak porsuk çayının yanında yürüdük :) Harika bir duygu...


    Bir takım güzel sebeplerden son iki güne kalamadım ama aklım Eskişehirdeydi :) Bir hafta en fazla bu kadar güzel geçebilirdi herhalde :) Önümüzdeki yıl aynı konulu blog yazısını yazmak için sabırsızlanıyorum. :)




12 February 2015

Eldeki Veri Sorunuzun Cevabını İçermiyor Olabilir


Veri analizi, veri bilimi, büyük veri, veri madenciliği gibi kavramların popülerliğinin artması ile beraber eldeki verinin her türlü soruya cevap vereceği düşüncesi gibi yanlış bir düşünce de yükselmeye başladı. John D Cook’un blog’unda gördüğüm John Tukey’in şu cümlesi de bu sıkıntıyı dile getiriyor: The data may not contain the answer. The combination of some data and an aching desire for an answer does not ensure that a reasonable answer can be extracted from Devamını Oku […]

10 February 2015

Zfsonlinux Kurulumu ve Yapılandırması


Zfs, yüksek ölçeklenebilirliğe uyumlu, aşağıdaki kriterleri dikkate alarak dizayn edilmiş dosya sistemi ve mantıksal hacim yöneticidir.

  • Veri bütünlüğü
  • Basit depolama yönetimi
  • Her şeyi online olarak yapabilmesi

Bsd sistemlerde default olarak gelen zfs dosya sistemini, zfsonlinux kurarak linux sistemlerde de kullanma imkanı bulabiliyoruz.

Zfsonlinux Kurulumu

Redhat tabanlı işletim sistemi için zfsonlinux download sayfasından 6 ve 7 dağıtımları için gerekli rpm repolarını indirebilirsiniz. Bu yazıda Centos 6 için kurulum yapılacaktır.

# rpm -ivh https://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh http://archive.zfsonlinux.org/epel/zfs-release.el6.noarch.rpm
# yum install kernel-devel zfs

# reboot

Sunucuyu yeniden başlattıktan sonra aşağıdaki şekilde hata almanızın sebebi  kernel, kernel-headers ve kernel-devel versiyonlarının uyuşmamasından kaynaklanıyor olabilir. Kernel’i güncellemeniz problemi çözecektir.

# zfs list
Failed to load ZFS module stack.
Load the module manually by running 'insmod <location>/zfs.ko' as root.

[root@localhost ~]# rpm -qa |grep kernel
kernel-firmware-2.6.32-504.el6.noarch
dracut-kernel-004-356.el6.noarch
kernel-2.6.32-504.el6.x86_64
kernel-devel-2.6.32-504.8.1.el6.x86_64
kernel-headers-2.6.32-504.8.1.el6.x86_64

Zfs Pool Oluşturulması

Zfs kurulumu yapılan sunucuda 2 disk mevcut, 2. disk zfs olarak yapılandırılıp, tank0 olarak zfs pool oluşturacağız. 2.diski sisteme mount etmediğimden dolayı “df ” çıktısında görünmüyor. Eğer önceden ext4 olarak formatlayıp mount ettiğiniz bir diski kullancak iseniz ilk önce umount edip, “/etc/fstab” dosyasından diskin mount edildiği satırın başına “#” koymanız yada satırı silmeniz gerekiyor. Bu sayede zfs diski legacy olarak fstab üzerinden sisteme sorunsuz mount edebiliriz.

# zpool create tank0 /dev/sdb 
# zfs list 
NAME    USED  AVAIL  REFER  MOUNTPOINT
tank0   108K  19.6G    30K  /tank0

tank0 poolunun yanında aynı disk üzerinde birden fazla poollar da oluşturabilirsiniz.

# zfs create -o mountpoint=/home/zfs1 tank0/zfs1

# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
tank0        156K  19.6G    30K  /tank0
tank0/zfs1    30K  19.6G    30K  /home/zfs1

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       11G  961M  8.6G  10% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             477M   49M  403M  11% /boot
tank0                  20G  128K   20G   1% /tank0
tank0/zfs1             20G  128K   20G   1% /home/zfs1

Poolları legacy olarak oluşturmadığımız için sunucuyu resetlemeniz durumunda zfs poolları sunucunun açılışında oluşturulamayacak ve ” df ” çıktısında görünmeyecektir.

# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
tank0        158K  19.6G    30K  /tank0
tank0/zfs1    30K  19.6G    30K  /home/zfs1

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       11G  961M  8.6G  10% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             477M   49M  403M  11% /boot

Bu sebeble aşağıdaki şekilde zfs poollarını mointpoint olarak legacy ayarlayıp, sunucunun açılışı sırasında fstab ayarlarına göre mount olmasını sağlıyoruz.

# zfs set mountpoint=legacy tank0

# zfs get mountpoint tank0
NAME   PROPERTY    VALUE       SOURCE
tank0  mountpoint  legacy      local

# zfs set mountpoint=legacy tank0/zfs1

# zfs get mountpoint tank0/zfs1
NAME        PROPERTY    VALUE       SOURCE
tank0/zfs1  mountpoint  legacy      local

fstab dosyasına aşağıdaki satırları ekliyoruz.

tank0                   /tank0                  zfs     defaults        0 0
tank0/zfs1              /home/zfs1              zfs     defaults        0 0

Artık poolları mount edebiliriz.

# mount -a

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       11G  961M  8.6G  10% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             477M   49M  403M  11% /boot
tank0/zfs1             20G     0   20G   0% /home/zfs1
tank0                  20G     0   20G   0% /tank0

Zfs komutunun ayrıntılarını linkte bulabilirsiniz.

Performans Ayarları

Sunucularda performans amacı ile kullandığım birkaç zfs ayarlarından bahsedecek olursak,

  • Çok fazla i/o yapan bir sunucuda zfs compression özelliğini aktif ederek i/o sorununu azaltabilirsiniz.

# zfs get compression
NAME        PROPERTY     VALUE     SOURCE
tank0       compression  off       default
tank0/zfs1  compression  off       default

# zfs set compression=on tank0
# zfs set compression=on tank0/zfs1

# zfs get compression
NAME        PROPERTY     VALUE     SOURCE
tank0       compression  on        local
tank0/zfs1  compression  on        local

  • recordsize değerini değiştirebilirsiniz.

# zfs set recordsize=128K tank0
# zfs set recordsize=128K tank0/zfs1
 
# zfs get recordsize
NAME        PROPERTY    VALUE    SOURCE
tank0       recordsize  128K     default
tank0/zfs1  recordsize  128K     default

 



Sending First Patch To Upstream


Last week, I sent first patch to upstream and it was accepted in mm tree :). I am very happy about that. You can see it here.

Subsystem maintainers are very careful and a lot of people review the codes. Out side of staging directory, and before the internship, my first patch is about y2038 project. When I sent patch for y2038, a lot of developers reviewed and suggested something. I have recently seen the patch here: http://lwn.net/Articles/620870/, it was my first experience :).

Todays, I work with linux kernel mm community, this makes me very excited and happy :).  I gained some experiences in this process and learnt how can I be sure with my changes. This is most important case for coding. When I talked with my mentor, every time I reported different thing :) and said "oh this prevents collapsing pages into a thp!". Because I was testing wrong. Finally I could find what was the problem.

For test results, I look /var/log/kern.log, it is very large file so I split it like that: "split -n 5" and look newly created small files and log time stamps is important. To be sure with my changes print out virtual memory address area for my test programs.

/proc/pid/smaps shows whole vmas for the process. pr_info("vm_start = %04lx\n", vma->vm_start); is enough to see begining address of the vma. Sometimes I need to see which process run this function, I print out current->pid. If I know what happened in every step, I find my faults very easy. I have to do something like that, because other processes will log about their huge pages in kern.log and I shouldn't confuse which process logged the results. To examining kern.log was big scale thing for me.

Before sending patch I need to be careful and check something for my patch. Also keeping focus on the issues is important. Working on kernel needs to pay attention more accorrding to other projects which I got experiences with them when I was student.

After this patch, I will work on zero pages and discover new things :).


09 February 2015

API Kayıtlarını (Log’larını) Görselleştirerek Örüntü (Pattern) Bulmak


Web servisleri aracılığıyla sağladığımız API fonksiyonlarının kayıtlarını görselleştirerek herhangi bir pattern (örüntü) çıkarıp çıkaramayacağımı merak ettim. Şu sorunun cevabını arıyorum; sağladığımız fonksiyonlardan birinde gün ve saat bazında bir pattern var mı? Örneğin; x fonksiyonu pazartesi günü saat 19:00–20:00 arasında düzenli olarak en az 1 kere olsa bile çağrılmış. Bu sebeple şöyle bir veri topladım: Burada amacım bir fonksiyonun Devamını Oku […]

08 February 2015

Redis (AB15)


Redis, özellikle web uygulamalarında yaygın kullanılan, gelişmiş bir anahtar-değer veritabanıdır. Kullanan bazı tanınmış şirketler: Twitter, Github, Weibo, Pinterest, Snapchat, Craigslist, Digg, StackOverflow, Flickr..



Kurulum (Centos 6.6 minimal için)

Önce epel(Extra Packages for Enterprise Linux) ve remi  paket depolarını ekleyelim.

#rpm -Uvh http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
#rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

#yum repolist (depoların eklendiğini bu komutla görebiliriz.)

#yum install redis -y

#redis -version

Yapılandırma

vim /etc/redis.conf

(slaveof <master-ip> <master-port>)
slaveof 192.168.56.103 6379 (diğer makina(lar)ın ip'si portu)

#service redis start

redis loglarını görmek için:
#tail -f /var/log/redis/redis.log
 
# redis-cli
127.0.0.1:6379>info
127.0.0.1:6379>keys *
127.0.0.1:6379>monitor

Sentinel(koruyucu, muhafız) 
 
/etc/redis-sentinel.conf  
Master makinayı kapatınca slave makinalardan biri master olmaz. Sentinel'ler Redis yönetimi yapan dağıtık sistemdir. İzleme, uyarma, failover(yük devretme) özellikleri vardır. Master seçimi için önce kendi aralarında haberleşir, oy çokluğu ile yeni master makinayı seçerler. 

Yük dengeleme ve kesintisiz master erişimi için Haproxy ile kullanılıyor.
1 master ve 1 slave makinamız varsa, kesintisiz master erişimi için en az 3 sentinel ve 2 haproxy makinası ile sağlıklı bir sistem oluşturbiliriz.
 
Sentineller kendi aralarında ve Redis'lerle konuşur. Master'a karar verir ve onu izlerler. Bir yazma isteği gelirse, Virtual IP hangi Haproxy makinasında ise ona gider. Haproxy, Sentinel'lerden master makinayı öğrenir ve isteği master makinaya gönderir.



07 February 2015

MongoDB (AB15)


MongoDB (humongous'dan geliyor. Çok büyük, kocaman anlamında)
* ölçeklenebilir
* doküman tabanlı
* C++ ile 10gen tarafından geliştirilmiş
* NoSQL veritabanı uygulaması.

MongoDB, özellikle hız gerektiren ve geleneksel ilişkisel veritabanlarının (rdbms) hantal ve yavaş kaldığı yapılarda kullanılmaktadır.

SQL                                            MongoDB

database                                    database

table                                           collection

row                                            document ya da BSON(Binary Json) document

column                                       field
 
Kurulum: (Centos 6.6 minimal için)

#vim /etc/yum.repos.d/mongodb.repo

[mongodb]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1

# yum install -y mongodb-org

# chkconfig --add mongodb

Konsol yönetimi için , birincil arka plan kabuğunu çalıştırmamız gerekiyor.
#mongod

veritabanlanlarını listeler:
> show dbs
admin  (empty)
local  0.078GB

> use aborgtr
switched to db aborgtr

O anki veritabanını gösteriyor:
> db
aborgtr

veri basarken:
> for (var i = 1; i<=100; i++) {
... db.aborgtr.insert( {x : i} )
... }

döküman listelerken:
> db.aborgtr.find()
{ "_id" : ObjectId("54cdcc52a6b7739755db0c3c"), "x" : 1 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c3d"), "x" : 2 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c3e"), "x" : 3 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c3f"), "x" : 4 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c40"), "x" : 5 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c41"), "x" : 6 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c42"), "x" : 7 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c43"), "x" : 8 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c44"), "x" : 9 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c45"), "x" : 10 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c46"), "x" : 11 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c47"), "x" : 12 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c48"), "x" : 13 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c49"), "x" : 14 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c4a"), "x" : 15 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c4b"), "x" : 16 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c4c"), "x" : 17 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c4d"), "x" : 18 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c4e"), "x" : 19 }
{ "_id" : ObjectId("54cdcc52a6b7739755db0c4f"), "x" : 20 }
Type "it" for more

Replika için yapılandırma ayarları:
vim /etc/mongod.conf

#where to log
logpath=/var/log/mongodb/mongod.log

logappend=true

bind_ip = 0.0.0.0

# fork and run in background
fork=true

port = 27017

dbpath= /var/lib/mongodb

# location of pidfile
pidfilepath = /var/run/mongodb/mongod.pid

# Turn on/off security. Off is currently the default
noauth=true

# Specifies a maximum size in megabytes for the replication operation log
oplogSize = 12288

# Configure ReplicaSet membership
replSet = replicaadi

# Enable rest API (disabled by default)
rest = true

(smallfiles=true)
# service mongod start

Primary olarak belirlenmiş mongo makinesine bağlanılır :
# mongo --host (mongo-primary-ip)

Replica makineler gruba eklenir :(rs: replica set)
> rs.add("mongo-rep02")
> rs.add("mongo-rep03")

Replica seti ayarları ve durumu görüntülenebilir :
> rs.status()
> rs.conf()

dump alırken : 
# mongodump --username aybuke --password foo --db aborgtr --out /root --authenticationDatabase admin

#ls -l /root/aborgtr/

Master önceliklendirme
>cfg = rs.conf()
>cfg.members[0].priority = 0.5
>cfg.members[1].priority = 2
>cfg.members[2].priority = 2
>rs.reconfig(cfg)
rs.conf() ile duruma bakılabilir
2 yüksek öncelikli 0.5 düşük öncelikli manasında

Hidden Member(Gizli üye) Ayarlama
>cfg = rs.conf()
>cfg.members[0].priority = 0
>cfg.members[0].hidden = true
>rs.reconfig(cfg)
rs.conf() ile son duruma bakılabilir

Delayed (Gecikmeli) Üye Ayarlama
>cfg = rs.conf()
>cfg.members[0].priority = 0
>cfg.members[0].hidden = true
>cfg.members[0].slaveDelay = 3600
>rs.reconfig(cfg)
3600 sn geriden gelen bir replika set üyesi ayarlanır.

MongoOplog ile belirli bir süre önceki verileri alma
Primary oplog'undan belirli bir süreye kadar olan değişiklikler aşağıdaki şekilde aktarılır
mongodb0 primary makinesinin oplogundan son 1 saatteki değişiklikleri mongodb02 makinesine al :
# mongooplog --from mongodb0.ab.org.tr --host mongodb02.ab.org.tr --seconds 3600

yararlı komutlar:

abrep1:PRIMARY> rs.printReplicationInfo()
configured oplog size:   1024MB
log length start to end: 67144secs (18.65hrs)
oplog first event time:  Sun Feb 01 2015 15:34:43 GMT+0200 (EET)
oplog last event time:   Mon Feb 02 2015 10:13:47 GMT+0200 (EET)
now:                     Mon Feb 02 2015 10:44:59 GMT+0200 (EET)
---
abrep1:PRIMARY> rs.printSlaveReplicationInfo()
source: centos4.ab.org.tr:27017
        syncedTo: Mon Feb 02 2015 10:13:47 GMT+0200 (EET)
        0 secs (0 hrs) behind the primary
source: centos5.ab.org.tr:27017
        syncedTo: Mon Feb 02 2015 10:13:47 GMT+0200 (EET)
        0 secs (0 hrs) behind the primary

06 February 2015

Elastic Search (AB15)


Akademik Bilişim bu yıl Eskişehir'de düzenlendi. Konferans öncesinde 4 gün boyunca birçok alanda eğitim verildi. Ben de "Yeni Uygulama Servisleri 1" kursuna katıldım. İlk gün Elastic Search, 2 ve 3. gün MongoDB son gün de Redis anlatıldı. Bu yazımda Elastic Search hakkında öğrendiklerimi yazacağım.

Kursa gelmeden önce sanal makinede Centos 6.6 Minimal kurup gelmiştik. Ayrıca makinelerin internete çıkabilmesi ve kendi aralarında haberleşmesi için de ağ ayarlarını düzenlememiz gerekti. 


*Java ile geliştirilmiş 
*lucene tabanlı
*Apache License, version 2 ("ALv2")
*Ölçeklendirilebilir
*Tam metin(full-text) arama motoru ve veri analiz aracıdır.
*Büyük veriler ile çalışan sistemlerde içerik aramaları, veri analizi ve  sorgulamalar için kullanılır. Örneğin Foursquare, GitHub gibi.
*NoSQL doküman veritabanıdır. (JSON)
*Dokümanlar ilişkisel veritabanlarındaki tablo satırları gibi düşünebilir, veriler JSON formatında tutulur.

Kullanılan Terimler:

** Index : İlişkisel veritabanlarındaki veritabanına karşılık gelir.

** Type (Tip): İlişkisel veritabanlarındaki tablolara eştir.

** Mapping(haritalama): İlişkisel veritabanlarında shema tanımlarına denk düşer. Her index mapping'e sahiptir.

** Document: Elasticsearch'de JSON formatında saklanan dokümanlardır. İlişkisel veritabanı tablolarındaki row'a (satır) denk düşer. Her document bir index'de saklanır ve bir type ve id'ye sahiptir. Document, 0 ya da daha fazla alan barından ya da anahtar-değer çiftlerinden oluşan bir JSON nesnesidir.

** Id: Document'larin kimliğini belirlemek için kullanılır. index, type, id numarası her document için eşsiz olmalıdır. Eğer bir document için ID sağlanmamışsa otomatik olarak oluşturulur.

** Text: Yapılandırılmamış sıradan yazı bütünlerine verilen addır.

** Cluster(Küme): Aynı cluster adını paylaşan bir veya daha fazla node'u barındıran yapıya verilen addır. Her cluster, clusterın kendisi tarafından otomatik olarak seçilen tek bir master node'a sahiptir. Eğer var olan master node bir şekilde ulaşılamaz, servis veremez hale gelirse yine cluster tarafından cluster'daki başka bir node master node'un yerine geçirilir.

** Node: Bir cluster'a ait, sistemde koşan elasticsearch oluşumuna verilen addır. İdeal bir Elastic Search cluster yapısında bir sunucuda bir node bulunmalıdır.
Kurulum:
1) JDK Kurulumu:

Elastic Search kurmak için Jdk paketini kurmalıyız. Önce rpm paketini çekiyoruz.

# wget -c --no-cookies --no-check-certificate --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/7u75-b13/jdk-7u75-linux-x64.rpm -0 jdk-7u75-linux-x64.rpm

Kurulumu yaparken:
# rpm -ivh jdk*

Bu komutla da, jdk'nın kurduğumuz sürümünü kullanmak için ve önceden kurulu başka versiyonda bir jdk varsa karışmaması için kullanılacak dosyaları belirtiyoruz.

# alternatives --install /usr/bin/java java /usr/java/latest/bin/java 20000 \
--slave /usr/bin/keytool keytool /usr/java/latest/bin/keytool \
--slave /usr/bin/rmiregistry rmiregistry /usr/java/latest/bin/rmiregistry \
--slave /usr/bin/javaws javaws /usr/java/latest/bin/javaws \
--slave /usr/bin/orbd orbd /usr/java/latest/bin/orbd \
--slave /usr/bin/pack200 pack200 /usr/java/latest/bin/pack200 \
--slave /usr/bin/rmid rmid /usr/java/latest/bin/rmid \
--slave /usr/bin/rmiregistry rmiregistry /usr/java/latest/bin/rmiregistry \
--slave /usr/bin/servertool servertool /usr/java/latest/bin/servertool \
--slave /usr/bin/tnameserv tnameserv /usr/java/latest/bin/tnameserv \
--slave /usr/bin/unpack200 unpack200 /usr/java/latest/bin/unpack200 \
--slave /usr/bin/jar jar /usr/java/latest/bin/jar \
--slave /usr/bin/jarsigner jarsigner /usr/java/latest/bin/jarsigner

#java -version

2) Elastic Search Kurulumu

İlk olarak elasticsearch.repo  dosyasını oluşturmalıyız.
$ vim /etc/yum.repos.d/elasticsearch.repo

içeriği:

[elasticsearch-1.4]
name=Elasticsearch repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.4/centos
gpgcheck=0
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1

(gpgcheck: Gpg dosyasının kontrol edilmesini sağlar. 1 kontrol et, 0 etme anlamındadır. 1 olursa daha güvenli bir kurulum olur)

# yum install elasticsearch

# chkconfig --add elasticsearch

(Chkconfig komutu istenilen runlevel seviyesinde servisimizi eklememizi, silmemizi , durumunun ne olduğunu öğrenmemizi ve durumunu istediğimiz gibi değiştirmemizi sağlar. --add: Yeni servis eklememizi sağlar.Yani /etc/rc.d/rc[0-6] dizinine servis ekler. chkconfig --list ile listeleyebiliriz.)

Yapılandırma:

Virtual Memory

max_map_count değeri işletim sistemlerinde varsayılan olarak, elasticsearch'ün ihtiyaç duyduğundan az bir değerle geliyor.

Tavsiye edilen değer:
# sysctl -w vm.max_map_count=262144

Eğer rpm/deb deposundan kurulum yapılmışsa bu değer ayarlı geliyor.

Swappiness

Elastic search'ün kullanmak için böldüğü ama kullanmadığı bellek alanını, işletim sistemi çekirdeği ihtiyaç duyduğu anda swap'a atmak ister. Elastic Search çalışan bir sistemde, bu çok büyük performans kaybına yol açar ve node dengesini bozar. Bu nedenle,

*Swap kapatılabilir.
#swapoff -a

*vm.swappiness 0 ya da 1 yapılabilir. (duruma ve ihtiyaca göre değiştirilebilir)
#sysctl -w vm.swappiness=1 (çekirdekdeki swap parametresini düzenlerken)

*mlockall - elasticsearch prosesinine ayrılan ram tamamen engellenebilir.
 /etc/elasticsearch/elasticsearch.yml içeriğinde :
bootstrap.mlockall: true

Eğer nodes çıktısında mlockall:false döndürüyorsa,
ulimit -a | grep locked çıktısı unlimited olmalı:
# ulimit -l unlimited

Bu ayarları şöyle gör :
# curl http://localhost:9200/_nodes/process?pretty

Çevre değişkenleri

/etc/init.d/elasticsearch dosyasında
export ES_HEAP_SIZE=1G
gibi Elasticsearch'ün maximum kullanabileceği ram miktarının üst limitini belirleyebiliriz.
Bu değer ayarlandığında:
ES_MIN(256m) ve ES_MAX(1g) olan değerleri aynı değere sabitler.

Cluster Ayarlama

/etc/elasticsearch/elasticsearch.yml de:

cluster.name : cluster_adi
node.name : elastic01                    # node'un ismi
node.master : true                         # master olup olamayacagi bilgisi
node.data : true                             # üzerinde veri tutup tutmayacagi bilgisi
index.number_of_shards: 5           # kullanilacak primary shard sayisi
index.number_of_replicas : 1        # her bir shard'in kaç replikasi olacagi sayisi
path.conf  /etc/elasticsearch         # elasticsearch ayar dizin yolu
path.data /var/lib/elasticsearch    # elasticsearch data dizin yolu
path.logs  /var/log/elasticsearch  # elasticsearch log dizin yolu
bootstrap.mlockall : true (ram lock için)
network.host: 0.0.0.0
discovery.zen.ping.multicast.enabled: false (çoklu bildirmeyi kapatiyoruz)
discovery.zen.ping.unicast.hosts: ["192.168.56.102] (diğer node'un IP'si)
Bu ayarlar diğer node(lar)'da da yapılıp servisler ayağa kaldırılır.
# service elasticsearch start

Kontroller

Cluster durumu :
# curl -XGET 'http://localhost:9200/_cluster/health?pretty=1'

Node bilgisi :
# curl http://localhost:9200/_nodes/process?pretty

Shardlarin durumu kontrolü :
# curl -XGET localhost:9200/_cat/recovery?v

Index durumu kontrolü:
#curl -XGET 'localhost:9200/_cat/indices?v

Veri İşlemleri

Bir JSON verisini sisteme basmak için önce veritabanı oluşturalım :

# curl -XPUT http://localhost:9200/shakespeare -d '
{
"mappings" : {
"_default_" : {
"properties" : {
"speaker" : {"type": "string" },
"play_name" : {"type": "string" },
"line_id" : { "type" : "integer" },
"speech_number" : { "type" : "integer" }
      }
    }
  }
}
';

Örnek JSON verisi:
# wget http://www.elasticsearch.org/guide/en/kibana/current/snippets/shakespeare.json

veriyi basarken :
# curl -XPUT localhost:9200/_bulk --data-binary @shakespeare.json

Sorgu çalıştırırken:
# curl -XGET 'http://localhost:9200/shakespeare/_search?q=play_name:Hamlet&q=speaker:Hamlet&pretty'

Kolay gelsin..

05 February 2015

Teknik Borç Nedir? Nasıl Oluşur?


Teknik Borç Nedir? Teknik borç (technical debt) eksik/hatalı yazılım geliştirme süreçleri sonucunda oluşan sıkıntıları ifade etmek amacıyla kullanılan bir terimdir. Bu kavramın babası aynı zamanda wiki kavramının babası olan Ward Cunnighman’dır. Teknik Borç Nasıl Oluşur? Yazılım geliştiricisiniz ve sizden yazdığınız uygulamaya bir özellik eklemeniz isteniyor, kullanacağınız iki yöntem var; ya hızlı bir şekilde kodlayıp isteneni teslim edeceksiniz Devamını Oku […]

04 February 2015

Uyap Döküman Editörünün linux sistemlerde çalıştırılması. (UDF Editör)


Bilindiği üzere Adalet Bakanlığı ve Milli Eğitim Bakanlığı (ve belkide benim bilmediğim bazı diğer kurumlar) döküman editörü olarak "udf editör" adı altında bir yazılım kullanmakta. Bu editörle elektronik imzalama işlemlerini de gerçekleştirmekteler. Yazılım java da yazılmış olduğundan platform bağımsız çalışır hissi verse de, son kullanıcılar için hazırlanmış bir linux kurulum yönergesi veya paketi bulunmuyor.(En azından ben bulamadım).

Bir ubuntu kullanıcısı olarak sistemim de uyap döküman editörünü çalıştırmak için önce uyap.gov.tr den windows kurulum dosyasını indirip wine ile çalıştırdım. /home/username/.wine/drive_c/ altına uyap adında bi dizin oluşturup dosyaları buraya atmıştı. Baktığımda ise bir bat dosyası da bu java dosyalarını tetikliyordu. Bunun için ben de bi sh dosyası oluşturup bu jar dosyalarını çalıştırması için gerekli değişiklikleri yapmam yeterli oldu. Zaten deb dosyasının içini bir arşiv yöneticisi ile açarsanız yaptığım değişiklikleri görebilirsiniz.

Buraya kadar olan kısım kendi isteklerine göre dağıtımlarına uyap editörü kurmak isteyenler içindi. Bundan sonrası için ise; ubuntu kullanıcıları için hazırladığım deb dosyasını direk indirip kurabilirler. Bu deb i komut satırından indirdiğiniz dizinde sudo dpkg -i uyapeditor.deb komutu ile kurabilirsiniz. Dash da ise Uyap Editor yazdığınızda başlangıç simgesini göreceksiniz. Komut satırında ise uyap komutu ile açılıyor.


Ubuntu 14.04.1 LTS olan sistemimde denedim sorunsuz çalıştı. Olur da çalışmazsa haberleşelim :)

Deb Kurulum Dosyası


Not: Bu arada github dan baktığımda editörün paketi PisiLinux depolarında görünüyor. PisiLinux Geliştiricilerini de buradan selamlıyorum :) Harikasınız.

03 February 2015

Adobe Flash Eklentisi Güvenlik Açığı


Adobe firmasının, web tarayıcılarında çok yaygın kullandığımız Flash eklentisi için çok kritik bir güvenlik açığı duyuruldu. Işin kötüsü 0-day denilen bu açıkta henüz bir yama ve güncel sürümü bulunmuyor. Aynı zamanda bu açık için bir exploit yaygın olarak mevcut ve son kullanıcıların bilgisayarlarını ele geçirmek için kullanılıyor.

Kötü niyetli bir web sitesine bağlandığınızda bu exploit bilgisayarınıza malware yükleyip, tüm kontrolünü ele geçirebiliyor. Bu sebeple Adobe Flash eklentisini yama çıkarana kadar etkisizleştirmek gerekliliği önemle duyuruldu.

Sistem yöneticisi arkadaşlar, bu açığa karşı, yeni güncelleme gelene kadar aşağıdaki squid kuralını aktif edebilir. Aşağıdaki kural seti application/x-shockwave-flash içeriğini squid üzerinde engellemek için yeterli. Ancak yineden SSL bağlantı yapılan kötü niyetli sitelerde  bu malware bulunma olasılığı yüzünden en kesin çözüm flash player ‘i etkisiz hale getirmek.

acl flash_mime_type rep_mime_type -i ^application/x-shockwave-flash$
acl flash_safe_list dstdom_regex "/etc/squid/flash_safe_list.txt"

http_reply_access deny flash_mime_type !flash_safe_list

flash_safe_list dosyasına da flash içeriğe güvenilir site adresleri eklenebilir.

.youtube.com
.googleapis.com
.turn.com
.creative-serving.com
.oroll.com
.facebook.com
.google.com

 



31 January 2015

Linux Kernel Ekibiyle Staj


Geçtiğimiz yaz haziran sonunda mezun oldum. Mezuniyetten sonra bir işe girip çalışmak, her gün işe gidip gelmek, birkaç ay işim dışında bir şeye bakmamak, sonrasında iş temposuyla birlikte neler yapabileceğime karar vermek gibi bir düşüncem vardı. Ancak tabi ki böyle olmadı :).

Ağustos başında Google İrlanda ofisinden iş görüşmesi için e-posta aldım, benim ile başlangıç bir telefon görüşmesi yapmak istediklerini söylediler. Hemen kabul ettim. İlk üç aşamayı geçtim, son görüşme için Irlanda'ya gittim ancak son görüşmede başarılı olamadım. Sorular beklediğim gibi değildi, internetten çalıştığım gibi de değildi.

Ben evde son görüşmeye hazırlanırken Gnome OPW için başvurular da başlamıştı. Ben daha önce ilk Gnome'un araçlarına sonra da Linux Kernel'a başvurmuştum. Gnome'a katkı verirken katkı vermek için masaüstü bilgisayarınızda ortam oluşturmak zor. En son Fedora 19'un alfa sürümünü kullanmak zorunda kalmam ve alfanın hiç kullanışlı olmaması üzerine katkı vermeyi sonlandırdım :). Aslında jhubild'de kullanabiliriz ama onda ortamı hazırlaması .. bana bir tane geliştiricisi o zamanlar Fedora beta sürümü varken, beta kullanmamı önermişti, beta yine kullanılabilirdi ancak bir sonraki sürüme geçtiklerinde alfa kullanmak zorunda kalmam pek iyi olmadı. Bir de Gnome Continuous var, onu yeni gördüm ama henüz denemedim.

Linux Kernel'a katkı verdiğim sene aslında alınmayı beklemiştim gerçekten ama olmadı. Bu dönem başvuru süresi 2 ay gibi uzundu :), geçen sene 3 hafta gibi bir süreydi. Necdet hoca "Aslında sen başvursan çok şey yaparsın" dedi, ben de başvurdum ve alındım :). Alınmayı gerçekten beklemiyordum ve çok güzel bir sürpriz oldu.

Şimdi Rik van Riel ile birlikte bellek yönetimi üzerinde çalışıyorum. Bellek yönetimi katkı vermeye başlamanın en zor olduğu kısımlardan biri, çünkü çekirdeğin temel fonksiyonlarını içeriyor ve daha karmaşık. Başvurduğunuz projeye göre staj sürecinde ne kadar yama gönderebileceğinizin sayısı da değişiyor. Ben projem zor olduğundan, 4 ayda otuz satır yazabilir miyim derken şimdiden bir yamayı kabul ettiler bile :).

Linux kaynak kodunda bellek yönetimi ile ilgili dizin mm/. Eğer güncel mm dizinini takip etmek istiyorsak da Linus Torvalds'ın kullandığı dalı değil de linux-next'i takip etmek gerekiyor. Yamaları Andrew Morton kabul ediyor ve günlük olarak etiketliyor. Güncel linux-next'i nasıl takip edeceğinizi görmek için buraya bakabilirsiniz.

Anladığım kadarıyla, Linux'ta bellek yönetimi üzerine çoğunlukla Redhat ekibi bakıyor, çünkü birçok sunumu ve belgeyi o ekip hazırlamış. Ben yamaları gönderirken mm dizini bakıcılarına baktığımda genelde @redhat.com alan adlı hesaplar var. Yamaları vger.kernel.org ve  akpm@linux-foundation.org listelerine gönderdiğim için de çok mutluyum. O kadar büyük listelerdeki insanların kodlara bakıyor olması oldukça heyecanlı :).

Üzerinde çalıştığım proje ise, bellek üzerinde 2kB/4kB kadar boyutlarda olabilen sayfaların dışında bir de büyük sayfalar (huge page) var. Onların boyutları ise 2MB/4MB. Peki neden büyük sayfalara ihtiyaç duyuyoruz? Çünkü sayfalar büyük olduğunda sayfa tabloları da büyük oluyor ve bir süreç için verileri bellekten atma/belleğe getirme miktarı azalıyor. Eğer sayfalar 4MB'tan büyük olursa verimsiz oluyor.

Sistemin swap kullanması gerektiğinde büyük sayfalar normal boyutlu sayfalara parçalanıyor (2kB/4kB) ve o şekilde swap alanına yerleştiriliyor. Sorun şu ki; swap alanından belleğe tekrar geri getirilmek istendiğinde büyük sayfa olarak değil, normal boyutlu sayfalar olarak getiriliyorlar bu durumda eski verim sağlanamıyor, aynı zamanda burada izlenmesi gereken bir algoritmaya da karar verilmeli. Çünkü bir süreç swap kullanıyor diyelim, ve swapte olan bir veriye ihtiyaç duyuldu, sadece tek bir verinin bulunduğu sayfa 2kB, ancak bunun yerine 2MB büyük sayfa getirmek her zaman yararlı olmaz. Burada karar verilmesi gereken noktalar var.

Geçtiğimiz dönem kod ve belge okumak üzerine geçti. Bir tane de yama gönderdim. Sadece okunabilir sayfaları büyük sayfalar şeklinde birleştirmek için. Yamayı burada görebilirsiniz.

Bundan sonraki bir süre ise; "daha önce hiç okuma/yazma isteği almamış, henüz fiziksel belleğe eşlenmemiş, sadece sanalda bulunan, bir süre sonra ilk kez okuma izni aldığında fiziksel belleğe eşlenen sayfalar" var, bunlara zero page deniliyor, bunlar üzerinde çalışacağım. Eğer sayfa içerisinde veri yoksa, ilk okuma isteği aldığında çekirdek bunu sıfırlarla dolu bir sayfa olarak üretiyor. Bunları da büyük sayfalara dahil etmek üzere çalışacağım. Aynı zamanda (emin değilim), Documentation dizininde de belgelendirme yapmam gerekecek. Muhtemelen birkaç işim daha var ancak henüz ben bilmiyorum, danışmanımla işleri bitirdikçe yenisini alma şeklinde ilerliyoruz. Henüz başlamadığımız işlerden de şuna bir ara bakarız şeklinde konuşuyoruz.

Staj sürecinde birkaç Türkçe yazı daha yazacağım (yazmadı) :).


28 January 2015

Zamanın ruhu


Teknolojik gelişme insan topluluklarının yaşam biçimini kökten değiştirebiliyor.

Mesela tarımın keşfiyle (kabaca MÖ 9000), avcı-toplayıcı göçebe topluluklar yerleşik düzene geçip köy, şehir ve devletleri oluşturdular. Az sayıda kişinin bütün topluluğa yetecek yiyeceği üretebilmesi, diğerlerini günlük yiyeceği toplamak derdinden kurtarıp kral, asker, rahip, bilim adamı gibi sınıf ve meslekleri ortaya çıkardı.

Bu değişimin olumsuz etkileri de oldu. Kalabalık ve sabit topluluklar; dışkıların birikip su kaynaklarını kirletmesi, bulaşıcı hastalıklar, kıtlık ve savaşlar gibi yeni sorunlar yarattı. Ancak, sınıflaşmayla ortaya çıkan bilim ve siyaset; kanalizasyonlar, su kanalları, yönetim ve hukuk sistemleri icat ederek bu sorunları zamanla çözdü.

Sanayi devrimi (18. yy) başladığında dengeler yeniden bozuldu. Kol gücü ihtiyacı düşer ve üretim verimliliği sürekli artarken bir yandan da oluşan katma değeri cebe atan işverenler ile işçileri arasındaki uçurum açılıyordu. Artan işsizliğin pazarlık güçlerini azalttığı işçiler, bir araya gelip sendikalaşarak güç dengesini yeniden kurdular. Günlük sekiz saat mesai, çocuklara işçilik yaptırılmaması, hafta sonu tatili gibi hakları yasalaştırmayı başardılar. Bir yandan da makinalaşmanın getirdiği yeni iş kollarına (makineleri kullanmak, inşa ve tamir etmek) eleman sağlamak için temel eğitim sistemleri ve okullar kuruluyordu.

Bu gelişmeler sayesinde; geçiş dönemindeki isyanlara (mesela Luditler), bir anda oluşan fakirlik ve sömürüye, işverenlerin sendikalara acımasız saldıralarına rağmen, bilişim devriminin (20. yy) başlarına geldiğimizde, en azından gelişmiş ülkelerde, toplumun çoğunluğunu orta sınıf oluşturmakta ve kendine eğitim, iş, sağlıklı ve iyi bir yaşam olanağı bulabilmekteydi.

Bilişim devrimini bilgisayar, Internet, sosyal medya gibi değişik aşamalara bölmenin doğru olmadığını düşünüyorum. Tarımın ya da buhar makinasının icadına karşılık gelen ve herşeyi başlatan olay, Alan Turing'in 1930'larda kendi adıyla anılan Turing makinesini keşfidir. Son derece basit ve soyut bir makinenin yapılabilecek tüm hesaplamaları yapabilmesi o kadar güçlü bir fikirdi ki, çok kısa bir zamanda bilgisayarların, hesaplanabilirlik, karmaşıklık ve kriptoloji bilimlerinin, iletişim teknolojilerinin, otomasyonun ve robotların ortaya çıkmasına yol açtı.

Bilgisayar bilimleri alanında çalışan bir kişi olarak mesleğimin özünün diğer meslekleri yok etmek olduğunu düşünüyorum. Veritabanları, muhasebe ve İK elemanlarını; kendi kendini süren araba, şöförleri; sosyal medya, gazeteci ve siyasetçileri; online eğitim, ögretmenleri; ATM ve POS cihazları, banka katiplerini; Amazon, tezgahtarları; yüksek seviyeli programlama dilleri ve tasarım araçları, programcıları; bulut bilişim servis ve yazılımları, sistem yöneticilerini yok ediyor.

Her gelişme ile başka bir alandaki rutin düşünsel işler ortadan kalkıyor. Tıpkı sanayi devrimindeki gibi, verimliliğin ve işsizliğin birlikte artması söz konusu ve gene aynı şekilde işverenler tasarruf edilen katma değeri cebine atıyor; ancak önemli bir fark var.

Bu sefer, kol gücünden sonra zihinsel iş alanları da kaybolunca; yalnızca eğitimle insanlara verilebilecek yeni bir iş becerisi kalmadı. Kol ve zihin gücü otomasyonla kolayca sağlanırken, çok az kaynakla çok büyük değer ortaya çıkaran tek yetenek yaratıcılık. O da malesef eğitimle aktarılabilecek bir şey değil. Belki bir parça geliştirilebilir ama daha ziyade köreltildiğini görüyoruz. İçinde yüksek miktarda şans da içeriyor. Bırakın toplumun çoğunluğunu, tek bir kişiyi bile alıp sanatçı, girişimci, mucit ya da vizyoner yapamayız. Bu nedenle mesela Amerika'da tartışılan gençlerin STEM eğitimine yönlendirilmesi ya da ilkokullara konacak programlama dersleri gibi önerilerin, bireysel gelişime fayda sağlasa da, işsizliği çözmesi beklenmemeli.

Bu durumun yarattığı eşitsizliği, geçmişte de varolan ve sosyal faktörlerden kaynaklanan eşitsizlikle karıştırıp yalnızca bir gelir dağılımı sorunu olarak görenler var. İşin bu tarafının çözümü kolay: toplanan vergiler, teknolojinin de yardımıyla, her insana temel barınma, beslenme, iletişim ve eğitim imkanlarını sağlamaya fazlasıyla yeter. İnsanların ideolojilerini bir tarafa bırakıp böyle bir amacı gerçekleştirmeye karar vermeleri zor tabi, ama problem bir mühendislik problemi.

Hatta bazı para tüccarlarının büyük servetlerini hiç bir iş yapmadan daha fazla güç ve para kazanmak için kullanabilmesi bile bence ana problem değil. Teknolojinin artan asimetrik gücüyle "disruption" eninde sonunda onları da yenecek. Milyar dolarlık Kodak, Nokia gibi dev şirketlerin, ar-ge de yaptıkları halde, bir anda çöpe gidebildiği bir dünyada yaşıyoruz. Petrol zenginliği bile ufaktan azalmaya başladı.

Ancak, dünyada hâlâ sanayi devriminin fikirsel gelişmelerini bile özümseyememiş büyük halk kitleleri ve devletler varken; böyle bir yeni yaşam biçiminin insan topluluklarında yaratacağı sosyolojik ve psikolojik çalkantının nelere yol açacağı bilinmiyor.

Şu anda ciddi bir tepki ve reddetme var. Eşitsizliğe olan tepki, sorunun kaynağını görmeyip fanatizme ve faşizme dönüşüyor. Irkçılık ve kutuplaşma artıyor. Sokaktaki sıradan vatandaştan, Avrupa Merkez Bankasına bir sürü kişi ve kurum borçlanmayla eski düzeni sürdürebilme derdinde. Siyasal partilerin bu konuda bir söylemi bile yok, ya da sanayi devriminin temel varsayımları çoktan çökmüş ideolojilerini anlatıyorlar. Orta sınıfta durumu henüz iyi olanlar, işsiz ya da az kazanan insanların tembellikten bu durumda olduğuna inanıyor. Değişimi görmeyen gençler mesela Amerika'da hâlâ yüz elli bin dolarlık öğrenim kredisi alıp iş bulma imkanı vermeyecek üniversite bölümlerinde okumaya devam ediyor. Eşitsizliğin olumsuz tarafını sosyal politikalar ile engellemeyi başaran ama olumlu tarafından değer yaratmak için faydalanamayan (göçmenlik ve bireysel girişim konusundaki katılıkları yüzünden) bazı gelişmiş Avrupa ülkelerinin toplam ekonomik gücü zayıflıyor. Daha bir çok örnek sayılabilir.

Hoşlanmadıkları ve birlikte yaşamayı bilmedikleri rastlantısallık, teknoloji ve iletişim tarafından ivmelenerek hızlandırılırken; insan topluluklarının yaşayacağı büyük buhrandan bir ütopya mı yoksa felaket mi çıkacak bilemiyorum.



27 January 2015

Veri Madenciliği Örnekleri 101


Veri Madenciliği Nedir? Veri madenciliği, ham verinin işlenerek bilgi elde edilmesi için kullanılan yöntemlerin bütünüdür. Elde edilen bilgi şunlar olabilir: anomali tespiti örüntü (pattern) tespiti korelasyon Veri madenciliğini uzun uzun anlatmak yerine bu teknikleri kullanarak ortaya çıkan örnek durumlardan bahsetmek istiyorum. Pazar Sepeti Analizi Örneği Veri madenciliği 101 başlıklı çalışmalarda verilen ilk örneklerden biri pazar sepeti analizidir. Devamını Oku […]