Kafa patlatmak isteyenlere: Mesajlaşma/Sohbet sistemi yapısı

Yazılımını geliştirdiğim bir web sitesinde üyeler arası mesajlaşma sistemine ihtiyaç duyuldu. Bunun üzerine ben de biraz araştırma yaparak biraz da kendim birşeyler katarak bir yapı oluşturdum. Yapı “conversation” modeli üzerinde çalışıyor. Yani iki kullanıcı arasında bir mesajlaşma olduğu anda bu iki kullanıcının üyesi olduğu bir konuşma(conversation) kaydı yapılıyor. Gönderilen mesaj ise doğrudan üyeye değil bu konuşma kaydına gönderiliyor. Teknik olarak baktığımızda, her ne kadar ihtiyaç olmasa da, bir konuşmaya birden fazla kişi katılabilir. Yani Facebook mantığıyla bir mesajlaşma sistemi olmuş oluyor.

Bu yazıyı yazma sebebim, sizlerden de fikir alarak sistemi iyileştirmek ve problemli kısımlarını gidermek. Sql şeması ve use-case gibi şeyleri oluşturmada çok iyi değilim. O yüzden düz metin olarak bilgileri paylaşacağım.

1- Veritabanı tablo kayıtları ve kullanım amaçları
Veritabanı olarak Mysql, programlama dili olarak Php kullanılmaktadır.

Tablo1: konusmalar
Kullanım amacı:
Mesajlaşma aksiyonunu gerçekleştiren 2 üye için bir kayıt oluşturulur.
Sütunlar:

  • id: auto increment, primary alan.
  • uniq: Konuşmanın benzersiz anahtarıdır. Bir kişi ile olan geçmiş sohbeti görüntülerken mesajlar bu uniq değerine göre getirilir.
  • lastupdate: datetime formatında, konuşmanın son güncellenme tarihi-saatidir.
  • lastmsg: son mesajı gönderen kullanının id değeridir.

Tablo2: konusmalar_uyeler
Kullanım amacı:
Konusmalar tablosunda oluşturulan bir kayda hangi üyelerin dahil olduğunu belirten tablodur.
Sütunlar:

  • id: auto increment, primary alan.
  • user: Dahil olan üyenin id değeri.
  • konusmaid: Konuşmalar tablosundaki ilgili id değeri. (konusmalar.id)
    (Burayı neden id yaptım bilmiyorum. uniq değerine göre de eşleştirme yapılabilirmiş halbuki.

Tablo3: konusmalar_mesajlar
Kullanım amacı:
Bir konuşmaya aitmesajların kaydedildiği tablodur.
Sütunlar:

  • user: Mesajı gönderen kullanınıcın id değeri.
  • mesaj: Kullanıcının yazdığı text mesaj.
  • konusmaid: Bu mesajın hangi konuşmaya ait olduğu ile ilgili alan. (konusmalar.id)
  • deleted: Bu mesajı hangi kullanıcıların sildiği bilgisi. (Bu sütun Problemler başlığında irdelenecek)

2-) Kısaca mesaj gönderme işlemi

  • Kullanıcı mesajını ilgili kişinin profiline girerek ya da konuşma penceresinden gönderebilir.
  • Mesajını gönderdiği anda arkaplanda şu işlemler gerçekleştirilir
    1. İki kullanıcı arasında daha önce bir konuşma gerçekleşmiş mi konusmalar_uyeler tablosu ile kontrol edilir. Eğer gerçekleşmemişse, konusmalar tablosuna yeni bir kayıt eklenir. Eğer gerçekleştirilmişse, konusmalar tablosundaki ilgili kayıt alınır.
    2. Gönderilen mesaj konusmalar_mesajlar tablosuna, ilgili konusmaid ile kayıt edilir.
    3. konusmalar tablosundaki ilgili satırın lastupdate ve lastmsg alanları güncellenir.
    4. Mesaj gönderilen kişiye bildirim yapılır. (Eğer kişi konuşmayı görüntüledikten sonra mesaj alırsa kendisini bir bildirim yapılır. Bunun kontrolü konusmalar_notify ile yapılıyor fakat asıl konu bu olmadığı için dahil etmedim)

3-) Konuşma görüntüleme işlemi

  • Üye kişisi, şu şekilde bir link açar: site.com/mesaj/oku/konusmauniqdegeri
  • Arkaplanda, ilgili konuşma uniq değerine ait bütün mesajlar listelenir. (Aslında bütün mesajlar görüntülenmez. “Daha fazlasını yükle” şeklinde pagination mevcut. Bununla birlikte sildiği mesajlar da görüntülenmez.)

4-) Mesajlar sayfası

Bu sayfada kişinin daha önce kimlerle mesajlaştığı listelenir. Teknik olarak konusmalar tablosundaki üyesi olduğu konuşmalar listelenir. Bu sql sorgusundan, her bir kayıt için konuşmanın kiminle olduğu(user details) ve son gönderilen mesaj döner.

5-) Problem: Mesaj silme

Bir kullanıcı, bir mesajı sildiğinde, ilkel bir içimde ilgili mesajın konusmalar_mesajlar.deleted sütununa silen üyenin id değeri eklenir. Silme kaydı json_encode ile eklenir. Yani geri dönüştürdüğümüzde silen üyelerin id değerlerini içeren bir array elde ederiz.

Ancak konuşmanın içeriğini listelerken, sql sorgusuna şu şekilde bir where değeri ekliyoruz:
konusmalar_mesajlar.delete NOT LIKE ‘%uyeniniddegeri%’
(Burada olası id değeri çakışması basit bir iki trick ile halledilmiş durumda. Sonuçta standart bir array şu şekilde kaydediliyor:[1,3])

Bir veritabanı uzmanı değilim ama NOT LIKE gibi bir sorgunun üstelik wildcard kullanılmış halinin ne kadar performans açısından sıkıntılı olabileceğini tahmin ediyorum. Belki de çok sıkıntılı değildir bilmiyorum ama içime sinmedi bir türlü.

Keza, mesaj silmek için değil, tüm konuşmayı silmek için, konuşmaya tüm mesajların deleted sütununu güncelliyorum. Bu da tüm konuşmaları listelerken problem yaratıyor. Çünkü bir kişiyle konuşma var fakat içi boş şeklinde dönüşü oluyor. Bu yüzden tüm mesajları görüntülerken içinin dolu olup olmadığı kontrolünü ekstradan yapıyorum.

Çözüm üfürmesi: Her bir mesaj için tek satır kaydediyorum. Peki o satırı üye olan herkes için kayıt etsem nasıl olur? Yani aynı mesajı hem a hem b kullanıcısı için kaydetsem. Böylece biri mesajı sildiğinde sadece kendine ait kaydı siler (Fiziken veya bir işaret ile). Eğer fiziken silmezsem konuşmaya ait mesajlar listelenirken mesajın silinip silinmediğini NOT LIKE ile değil != ile kontrol ederim. Ayrıca bir konuşmanın içinin dolu olup olmadığı daha basit bir şekilde kontrol edilmiş olunur.

Belki iki kişilik konuşmalarda bu çözüm kullanılabilir. Her ne kadar grup konuşma olmayacak olsa da bu çözümün %100 doğru olduğunu düşünmüyorum. Ki, veritabanı konusunda uzman olmadığım için, hangi koşullarda satır sayısı çokluğu kabul edilebilir olur bilemeyeceğim. Belki binlerce satır yerine NOT LIKE daha avantajlı bir çözümdür.

6-) Sizden beklediğim

Ufak tefek başka problemleri olsa da şimdilik aklıma gelen kilit olaylar bunlar.Yapacağınız yorumlar için şimdiden teşekkür ediyorum. (Ya kimse yorum yapmazsa :/)

  • Sistemi varolan yapı ile inceleyip yorumlamanız öncelikli ricam. Dezavantajları neler olabilir? Geliştirmek için neler yapılabilir?
  • İkinci olarak mysql bu iş için ideal mi? Mysql ideal değil diyorsanız, aynı fonksiyonalitede yerine ne kullanabiliriz?
  • Mesajlaşma sistemini başka bir servisten satın alsam ne dersiniz? Daha önce böyle bir tecrübe yaşadınız mı? (www.cometchat.com/ facebook tarzı mesajlaşma stiliyle şu biraz kafama yatıyor. Ama %100 kontrol edemeyeceğim bir sistem. Örneğin offline mesaj göndermede notifikasyon işini nasıl çözeceğiz?)

İstihdam olmadan proje nasıl olur?

Günümüzde çeşitli bilişim firmaları “startup” kültürüyle yırtık dondan çıkar gibi piyasaya atılıyor. Bu firmaların yaptığı işlere baktığımızda sistem yöneticiliğinden, proje yöneticiliğine; neredeyse bsd dahil bilimum işletim sistemlerini kapsayan yazılım geliştiriciliğinden, tasarım hizmetlerine kadar bir çok alanda hizmet verdiklerini görüyoruz.

Bu da birşey mi? Kendi firmasında istihdam yaratmadan her biri ayrı uzmanlıklar gerektiren bu tarz alanlarda iş yapıp, piyasaya yazılımcı/tasarımcı ihracat eden firmalar bile mevcut.

Bir eleştiri yazısı gibi olcaktı fakat pek eleştirecek birşey bulamadım. Çünkü konu hakkında bilgi sahibi değilim. Küçük ölçekli (1-5 personel istihdam eden) bir firma nasıl oluyor da bilişim sektöründeki tüm konular ile ilgili hizmet verebiliyor? Nasıl oluyor da bünyesinde personel çalıştırmazken, başka firmalara İK danışmanlığı yapabiliyor? Ki bu firma sahipleri “Türkiye’de işin ehli personel yok yeaa” diyip bugüne kadar neden proje gerçekleştirmediklerini açıklıyorlar.

Biri bana açıklasın lütfen.

Algoritma ne değildir?

abonelikalgritması1-600x558Yukarıda görmüş olduğunuz şey bir algoritma değildir. Sistem hiç değildir. Bu gördüğünüz şey basit bir akış diyagramıdır.

Bir arkadaş kendi blogunda bunu bir üyelik algoritması olarak paylaşmış ve “bu bir algoritma değil” diye yaptığım yoruma da bir kitaptan alıntı yaparak şema hakkında sistem diye bahsederek yanıt vermiş.

“Belli bir problemi çözmek veya belli bir amaca ulaşmak için geliştirilmiş sisteme algoritma denir.”
Kerem Köseoğlu – Programcılık Mantığı – Sayfa.37

Yorumunu “Öğrenmeye devam ;)” ile bitirmiş ki bu da literatürde laf sokmak anlamına gelir. Tabi yorumu bu şekilde bitirince, bunun neden algoritma olmadığını anlattığım yorumu silmiş. Tekrar gönderdim, belki yayınlar.

Herneyse, şimdi bu yukarıdaki şeyin neden algoritma olmadığını burada anlatmaya çalışayım. Eğer yanlışım varsa lütfen yorum kısmında düzeltin.

En temelinde algoritma, matematikte ve bilgisayar bilimlerinde (ve elbette yaşamda) belli bir sonuca ulaşmak için kullanılan düzenli prosedürlerdir. Bir algoritma, istenilen sonuca ulaşmak için yapılacak işlemleri adım-adım, sırayla, iyi tanımlı bir biçimde içerir.

Yukarıdaki şema neden bir algoritma değildir 1: Algoritma, sizi istenilen tek bir sonuca götürür. Şemada istenilen sonucun ne olduğu belli değildir. Buna uygun olarak, günlük yaşamdan bir örnekle derse girmemiz için bir algoritma yazalım:
1- Evden çık
2- Otobüs durağına git
3- Otobüse bin
4- Doğru durakta in
5- Sınıfa git
6- Derse gir
Bu algoritma sizi amacınıza ulaştırır. Eğer tek bir adımı atlarsanız sonuca ulaşamazsınız. Veya bir adımı yanlış yaparsanız sonuca yine ulaşamazsınız(ulaşamayabilirsiniz).

Yukarıdaki şema neden bir algoritma değildir 2: Otobüse bin adımı iyi tanımlanmamıştır. Burada tam olarak hangi otobüslere bineceğimiz belirtilmelidir. Sizi okula götürmeyen bir otobüse binmeniz halinde derse gidemeyebilirsiniz. Bu yüzden her bir adım, en iyi şekilde tanımlanmalıdır.

Yukarıdaki şema neden bir algoritma değildir 3: Bir adımda hata oluşması durumunda sonuca tekrar ulaşabilmeniz için yapılacak adımlar en iyi biçimde tanımlanmalıdır. Yani bir üyenin içeriği görmeye yetkisi yoksa “o zaman içeriği gösterme” yerine “içeriği görebilmesi abonelik sayfasına geç” gibi bir şey yazılması gerekir.

Yukarıdaki şema neden bir algoritma değildir 4: Bu şema aslında bir abonelik sistemi işleyişidir. Kaldı ki o bile yanlış çizilmiştir ya da ben anlayamamışımdır. (Aşağıya doğru olan şemayı biri bana anlatabilirse çok sevinirim.)

Bir sistem işleyişi anlatımı yine algoritmaya benzer özelliklere sahip olmalıdır. Her bir adım iyi tanımlı olmalıdır, hata durumlarında yapılacaklar iyi tanımlı olmalıdır. Algoritmadan farklı olarak sistem işleyişinde bir sonuç yoktur. Belli durumlarda oluşacak birden fazla sonuç vardır. Algoritmanın temeli dediğim gibi, bir sonuca ulaşmaya dayanır.

Matematikte aksine(tersine) ispat denilen bir yöntem vardır. Bir şeyin doğru olduğunu söyleyebilmek için 10 kural varsa, 10 u da ispat edilmelidir. Bir şeyin yanlış olduğunu söylemek için tek bir kuralın yanlış olduğunu göstermek(ispat etmek) yeterlidir.

Bilgisayar bilimleri, bilişim teknolojileri gibi alanlarda çalışan, araştırma yapan herkes eleştiriye sonuna kadar açık olmalıdır. Bir kaynaktan öğrenilen bilgi kesin doğru değildir. Özellikle o bilgiyi şekilde görüldüğü gibi yanlış anlama ihtimali oldukça yüksektir. İyisi mi, paylaşalım tartışalım ve birbirimizi geliştirelim. Hatamız varsa üzerine düşelim, yeni bilgileri tekrar paylaşalım. Ama lütfen ego yapmayalım.

Maden işçisi onurumuzdur!

Hayatımda hiç bir yakınım için ölüm acısı yaşamadım diyebilirim. Bir tek dedemi kaybettik bundan 5 yıl önce. O yüzden bilmezdim ölüm ne demektir ne değildir. Ateş hep düştüğü yeri yaktı.

İlk kaybettiğim yakınım Ali İsmail oldu. Haince dövüldüğü gece aynı yerdeydik. O sol sokak başındaymış, ben sağ sokaktaydım. İlk kez onu kaybettiğimizde yaşadım ölüm acısını. Yine ateş düştüğü yeri yaktı ama ben anladım ne olduğunu. Tam anlamıyla hissettim acılarını. Acılarına ortak olmaya çalıştım kendimce. Ali İsmail’in adını yaşatmayı borç bildim kendime.

Bugün yüzü aşkın onurlu maden işçisinin ölüm haberini aldık. Ailelerin neler hissettiğini düşünmeye  çalışıyorum. Bugün de o acıyı hissediyorum. Ne ölen geri gelecek, ne aileleri bir daha mutlu olacak. Ama ben o onurlu işçilerin; ailelerine ekmek götürebilmek için saatlerce yerin derinliklerinde çalışan onurlu işçilerin sorumlularından hesap sorulana kadar mücadele edeceğim. Hiç bir zaman unutmayacağım. Unutturmamak için çalışacağım. Patronların işçinin hayatını yok saymasından, devletin buna göz yummasından hesap soracağız. Er ya da geç.

İnşallah bilim maşallah sanırsam

Türkiye’de konuyla ne kadar alakasız insan varsa onlar “bakan” oluyor. Hele hele bu konular teknoloji-bilim gibi konular olunca ortaya komedi diyaloglar çıkıyor. Mesela Binary Yıldırım’ın Bulut Bilişim hakkında söyledikleri ya da söylemedikleri hala aklımızda ve bu trajikomik duruma hala gülüyoruz.

Bu bulut sistemi dedikleri birşey var, herkes oraya bişey atıyo, gelen ordan işine yarayanı alıyo kullanıyo, ben böyle anlıyorum belki farklı bişeydir.

 

Son günlerde yine benzer bir şekilde bir başka bakan gündeme geldi. İnternette yayınlanan ses kayıtları ile ilgili montaj olduğunu belirtiyor, tamamen hissiyatına güvenerek. Bu bakan, “bilim ve teknoloji bakanı”.

Ben o ses kayıtlarını ilk dinlediğimde çok açık bir montaj olduğunu hissettim. Başbakanlık Tübitak’tan böyle bir teknik inceleme talep ederse biz onu yaparız ama teknik incelemeyi gerektirmeyecek kadar açık montaj olduğu ortada. Bunu başka hiç bir teknik incelemeye gerek duymadan söyleyebiliriz.
(Tarafsız bir kaynaktan videosunu bulduğumda ekleyeceğim)

Bilimin kurallarını hiçe sayan bir kişi bilim ile ilgili bakan yapılmış. Şaşırmadık. Ortada bir kayıt var, bununla ilgili gerçek-montaj iddiaları dolaşıyor. Ancak bakan bey “montaj olduğunu hissettim, incelemeye gerek dahi yok” diyor. Evet zaten bilim dediğimiz şey tamamen hissiyata dayalı olarak yapılıyor. Yarın ben de sınav kağıdına “ifadenin doğru olduğunu hissettim, ispat etmeye gerek dahi yok” yazacağım.

Tabi ben bunu sınav kağıdına yazdığımda 0 alacağım. Bakan söylediğinde sıkıntı yok bize gelince auuuuv. Ne auuuuvvv? Kaset montajdır değildir bu tartışmalara hiç girmiyorum (belirtmem gerekir ki montaj olmadığını hissettim). Asıl başka bir nokta üzerine yoğunlaşmak istiyorum. Türkiye’deki bütün üniversiteler bilimden tamamen uzaklaşmış, ülke sorunlarından tamamen uzaklaşmış durumda. Sözde bütün üniversiteler bilim üretiyor ve sözde demokratikler. Bilim ve Teknoloji Bakanı, resmen açık açık bilim etiğine, bilime saldırıda bulunmuştur. Bilim ürettiğini, bağımsız, demokratik olduğunu savunan bütün üniversitelerin montajdır-değildir tartışmalarına girmeden bakanın yaptığı bu açıklamayı kınaması gerekiyor. Ancak böyle bir açıklama gelmeyeceği oldukça açık.

Üniversiteler bağımsız ve özgür olmadığı sürece bu ülkenin özgürleşmesini kimse beklemesin. Sözde ülkenin aydın geçinen insanları, sözde ilerici insanları bilime yapılan bu saldırıyı kınamıyorsa, bu ülkede en az yolsuzluk, hırsızlık kadar büyük sorunlar var demektir. Biz aslında buna bir isim vermiştik: yandaşlık.