Friday, June 24, 2011

PostgreSQL : Postgres Diye Okunur

Eğitim notlarımdan derleme bir yazı yazacağım:

1970'lerde geliştirilmeye başlanmış. Yapısı ana olarak 3 kademeli. En üstte tek çekirdekte çalışan bir postmaster prosesi var. En zayıf özelliği galiba bu, çoklu çekirdek desteği (multi cpu, multi core) yok. Bu postmaster'ın altında shared memory var.

Shared memory'nin yapısında da üç unsur var,
- shared buffers
- wal (writer ahead log) buffers
- process array

Bir işlem ise 4 adımdan oluşuyor: rewrite, parse, plan, execute.

Örneğin, bir insert yapacağız. Cümlemiz, her seferinde bu 4 adımdan geçip execute sonucunda veri, yazılmaya hazır halde bellek uzayından disk uzayına geçiyor. Bu disk uzayında da doğrudan veritabanı ile ilgili tabloda değil, xlog adı verilen transaction log dosyalarına yazılır. Sonrasında arka planda, Postgres bu xlogları esas db'ye geçirir imiş. Filesystem ile çok fazla haşır neşir olmaması ve bu bölünmüş yapı da performans artışı sağlatabiliyor.

Şöyle ki, xlog dosyalarını çok çok hızlı bir diskte (fiziksel olarak ayrı bir diskte) tutarsınız, hatta ramdiskte bile olabilir bu; veri dosyalarınızı raidlenmiş hızlı random okuma yetisine sahip bir disk yapısında bulundurursunuz örneğin. Böylece şahane hızlı olurmuş.

Xlog'un avantajı şu: esas veritabanı dosyalarına veriyi yazmadan, bu xlog'a veri yazıldığı anda, kullanıcıya "işlem başarılı" yanıtını dönüyor. Çünkü olası bir kesintide (elektrik kesintisinde mesela, fiks örnek), db açılırken, bu xlogları tarayıp, eksik kalan, öbür tarafa geçirmediği, yansıtmadı işlemleri evvela aktarıp toparlıyor kendini.

Ayrıca çekirdeği itibariyle, veritabanı kendinden performans optimizasyonuna sahip. Özellikle queryleri indexlerle çekme konusunda çok çok başarılıymış. Bununla birlikte "hint" olayı yok querylerde. Oraclecılar, raporlamacılar veya developerlar (realtime dataya bakmak gerekiyor bazen) özellikle selectlerde bol bol hint kullanır bu yüzden sevinebilirler de, üzülebilirler de.

Dediğim gibi, Postgresql'de ise Oracle'daki gibi hint olayı yok (yani bu prosesi 8 thread çalıştır, index olarak şunu değil bunu kullan gibi ipuçları kullanamıyoruz). Postrgres tabanı kullanan, onun üzerine yazılmış bazı sistemlerde (örneğin enterprisedb) bu özellik sonradan getirilmiş olsa da, temelde yok. Sebebini de esas geliştiricisi şöyle açıklıyor: "bizimkinden daha optimize çekemezsiniz." o derece iddialılar sorgu konusunda.

Postgres'in bir de `mvcc` desteği var (Oracle vs diğer rdbmslerde de var, o ayrı). Buna göre yapılan işlemler, eşzamanlı farklı transactionlarda tutarlı sonuçlar veriyor, güzel bir şey bu.

Bazı dikkat edilmesi gereken özellikleri de varmış. Örneğin block size, disk için 8 kb şeklinde fikslenmiş. Bu bloklar da yarım parçalı kullanılamıyor. Işletim sistemleri dersi alanlar belki hatırlar (bilgisayar mühendisliği okumadıysanız üzgünüm), veri bu bloklara bölünmeden yazılabiliyorsa, yani bloklar verimli kullanılırsa daha az io yapılır. Aynı durum burada da geçerli. Örnekleyelim. Diyelim ki blok size 8 olsun (byte), 1000'le çarpıldığını düşünün:

Tablo yaratıyorsunuz, 5 sütununuz var.
C1 varchar 5
c2 varchar 6
c3 int 4
c4 varchar 3
c5 int 2

Bunlar 8'lik olarak aşağıdaki şekilde dizilecektir (boş blok |--------| ile gösteriliyor)
|5*c1 + ---|
|6*c2 + --|
|4*c3 + 3*c4 + -|
|2*c5 + ------|
İsraf olan toplamda 3+2+1+6 byte var. Bu da disk kafasının daha çok oynaması, daha çok i/o demek.

Şayet bu tablo şu şekilde tanımlanırsa,
c1 varchar 5
c4 varchar 3
c2 varchar 6
c5 int 2
c3 int 4

Dizilim değişiyor,
|5*c1 + 3*c4|
|6*c2 + 2*c5|
|4*c3 + ----|


3 blokta iş bitecekti, israf 4 byte, i/o daha az, performans daha yüksek.

Dikkatli kullanılması gereken bir de explain hususu var. "Explain analyze select * from t1" derseniz, önce sorgu çalıştırılır, sonra açıklaması yapılır. Tehlikeli, çünkü delete veya update benzer şekilde "explain analyze" ile birlikte kullanılırsa, veriyi siler. Bunu önlemek için illa ki begin / rollback yapısını kullanmak gerek. Alışkanlık meselesi.

Vacuum olayı var değinilmesi gereken.

Insert yaparken en alta yeni bir satır ekliyor diyelim.

Delete yaparken aradan (yukarılardan bir yerlerden) eski bir satırı siliyor. Silmek için de başına bir invisible flagi ekliyor. (Dosya sistemine benziyor bu yapı) ve tam olarak, fiziksel olarak silmiyor veriyi. Ama selectlerde, count'larda bu veri sayılmıyor. Silinmiş yani üst katmanda.

Update ise, yapısı itibariyle delete ve insert'ten oluşuyor gibi düşünülebilir. Önce değiştirilecek eski veri invisible ediliyor (siliniyor) sonra en alta yeni bir satır ile ilgili verinin güncellenmiş hali yazılıyor. Eskisi görünmez, yenisi görünür halde.

Vacuum işte burada devreye giriyor ve bu silinen (güncellenip de eskiyen veriler de aynı şekilde) sistemden atılıyor. Autovacuum ortamında belirli zaman aralıklarında (bunun eşik değerleri var elbet) çalışarak disk üzerinde aşırı zıplamalara yol açacak, eski veri kirliliği birikimini engelleyebilir. Vacuum sonrasında yerleri boşalan yerlere, yeni gelen datalar insert ediliyor, db derli toplu kalıyor bu sayede.

Prosedür yok, her şey fonksiyon. Böyle bir özelliği var.

Değişkenler ve tablo adları, tamamen küçük harf. Isterseniz "tablo" deyip büyük harflerle tablo isminde veritabanı yaratabilirsiniz, erişirken yine çift tırnak içinde aynı şekilde yazmanız gerekiyor bu durumda. Bu noktada standart sql'den ayrılıyor. Oracle'da her şey büyük harfti mesela.

Ip, mac ve benzeri dataları tutmak için buna özel verip tipleri var. Char tipinden bunları saklayıp, sonra uygulama tarafında (string operasyonları ile) parçalayıp incelemektense, bu şekilde tutmak daha güzel. Geometrik veri tipleri var, bir de bir sonraki sürümde coğrafi konumla ilgili bir veri tipi çıkarıp, en yakındaki coğrafi konumu gösterebilecek bir altyapı üzerinde çalışılıyormuş.

Partial ve functional indexler var. Indexlerde detaylı regular expression kullanabilme şansımız varmış.

Daha başka şeyleri de var da onları yazmaya üşendim.

Eğitim notlarımdan şimdilik bu kadar.

Yaklaşık 10 senedir çeşitli veritabanlarına bir şeyler yazıp çizen bir kimse olarak ise söyleyebilirim ki, "neden olmasın". Dba değilim, yazılım tarafındayım işin ve ara katmanda Oracle'a yaptırdığım işlerin aynısını Postgres'e de yaptırabiliyorum. Geçen sene sıfırdan yazdığım bir projede, Oracle olması planlanan veritabanı son anda Postgrese dönmüştü ("bunu kullanacaksın", "peki patron" şeklinde bir emrivaki ile). Projeyi yazma süremin yarısı kadar bir süre Postgres'i inceleyip, bağlantı yaratacak sınıfları bulmak, sunucu sistemini ona göre konfigüre etmek, yeni veritabanında tabloları racona uygun veri tipleri ile yaratıp, gerekli optimizasyonları yapmakla geçti. Onun dışında sentaksını öğrenip, Oracle muadili kodları uygulamada (java) kullanma aşaması birkaç saat. Onda da nvl yerine coalesce yazmak yaptığım en karmaşık işti, o kadar.

Mysql'i bırakalı yıllar oldu ama, Oracle ile 3 senedir bilfiil uğraşan biri olarak hiçbir eksiğini görmediğimi söylemeliyim. Kullanın, deneyin, çekinmeyin. Ustaları da diyor ki: dünyadaki gelecek veritabanı yönetim sistemi, Postgres olacakmış. Çünkü açık kaynak, yaşasın özgürlük.

Monday, June 06, 2011

Web Application Developing on JBoss, Netbeans and Maven

Jsp sayfalarındaki değişimleri gerçek zamanlı olarak görebilmek için, JBoss'a uygulamaların açık (exploded) olarak deploy edilmesi gerekiyor. Ancak JBoss'un deploy dizini ile NetBeans'in derlediği Maven projesi /target/ dizini malesef aynı değil. JBoss üzerinde de, Weblogic'teki gibi "I will make the deployment accessible from the following location." opsiyonu olmadığından; bu sorunun üstesinden gelmek için Windows'un symbolic link yapısını kullanmak işe yarayabilir. Symbolic Link oluştururken dikkat edilecek husus, klasörün isminin .war şeklinde bitmesi. Böylece JBoss deploy dizinini tararken, bu "hede.war" ismindeki klasörün, açık durumda bulunan bir web application olduğunu anlıyor. Şöyle ki;

D:\>cd D:\jboss\server\default\deploy
D:\jboss\server\default\deploy>mklink /D deneme.war D:\svn\deneme-web-app\trunk\target\deneme

Böylece IDE'nizde 1 harfini değiştirdiğiniz Jsp sayfanız, anında target dizinine gönderiliyor, JBoss da bunu okuyarak değişimleri exploded deploy edilmiş war'unuza yansıtıyor. IDE üzerinde yaptığınız değişikliği zahmetsizce (tekrar clean & deploy, target dizinini aç, kopyala, JBoss deploy dizinine war at vs yapmadan), sadece tarayıcıdan F5 yaparak görmek çok güzel.

Niye İngilizce başlık yazdım bilmiyorum.

Thursday, December 09, 2010

Operation: Payback

Operation: Payback

Bu sivil Hareketi özetleyen en güzel metin sanırım şu:
- i should probably clarify something. i'm not anti-government, anti-establishment, or anything of that sort. i'm just anti-anti-wikileaks.
Yani diyor ki:
- sanırım şunu açıklığa kavuşturmalıyım. ben devlet karşıtı, kuruluş karşıtı veya ona benzer bir şey değilim. ben sadece wikileaks karşıtlarının karşısındayım.

bu harekete katılanlar çoğunlukla gençler. bilinçli, kafası çalışan, muhtemelen adli sicili temiz çocuklar. bu insanların internet sitelerinde özgürce gezmek, eğlenmek, paylaşmak ve iletişim kurmak en doğal hakları ve hepsi de bunu sonuna kadar kullanıyor.

internetin bu özgür ortamı (haddinden fazla özgür çoğu zaman, doğrudur) bu kitleyi kendine çekmiş. ifade özgürlüğü, kendini anlatabilme, paylaşmak ve her türlü bilgiye ve görüşe kesintisiz, sansürsüz ulaşım internetin en güzel yanı sanırım.

assange sadece bir kişi. wikileaks ise sadece bir site. ama tüm bunlar aslında özgürlüğün savunulması. wikileaks adının altında ve julian assange kişisi ile vücut bulmuş durumda. assange'ı çok mu seviyoruz, hayır, wikileaks'i çok mu okuyoruz, hayır. ama savunduğumuz şey bu şeffaflık ve ifade özgürlüğü.

taciz şikayeti ile ilgili olarak yargılanacak julian assange kişisi kırmızı bülten ile aranıyor olabilir, hapse atılabilir, hapiste öldürülebilir, bunların hepsi olabilir. ona bir şey olursa wikileaks darbe alacaktır, doğrudur. hatta wikileaks de bitebilir, bu da doğru. peki bu oluşan farkındalık sindirilebilir mi? hiç sanmıyorum. `v for vendetta` filminden alıntı yapalım,
- Beneath this mask there is more than flesh. Beneath this mask there is an idea, Mr. Creedy, and ideas are bulletproof. (bu maskenin ardında etten daha fazlası var. bu maskenin ardında bir düşünce var bay creedy, ve düşünceler kurşun geçirmezdir)

v for vendetta filmine benzetebiliriz şu an dünyada yaşananları. v'nin korsan yayınları wikileaks'e, assange kişisi de v'nin kendisine benzetilebilir. filmdeki despot ve faşist devletin karşısında sinen aptal(laştırılmış) halkın, bir adamın onlara hatırlattığı fikirlerin etrafında toplanıp devlete karşı gelmesi de işte bu operation payback oluyor.

bu operation: payback aynı zamanda 8 aralık'ta ankara üniversitesi siyasal bilgiler fakültesindeki burhan kuzu'ya yumurta atılması eylemine de benziyor. birkaç gün önce devletin polisleri, sesini duyurmak isteyen öğrencileri dövmüştü. 8 aralık 2010 günü ise sıra öğrencilerdeydi. hükümetin vekili, istenmemesine rağmen tüm küstahlığı ve pişkinliği ile öğrencilerin arasına girip gövde gösterisi yapacak, çocuklara artık inanmadıkları lafları satacaktı. ama olmadı, satamadı, sattırmadılar. dün arkadaşları dövülen öğrenciler, hükümetin vekilini konuşturmadılar. hükümetin vekili derken de neyi ifade ettiğimi belirteyim; o vekil benim vekilim değil, öğrencilerin vekili değil, milletin vekili değildir çünkü. o vekil hükümetin vekilidir.

o yumurta atan çocuklar; haklarını arayan, sesini duyurmaya çalışan, farkındalık oluşturmak isteyen, uyumadıklarını haykıran öğrenciler işte bugün operation: payback saldırılarını yapanlardan çok farklı düşünmüyor aslında. özgürlük ve şeffaflık isteyen, seslerin susturulmamasını isteyen, sansürlenmemesini isteyen, bilinçli ve uyumayan internet kullanıcıları bu operation: payback'te yer alanlar.

burada kimse maşa değil. hepsinin kendi bilinçleri ve tercihleri var. bu tercihler ve kolektif bilinç sayesinde bugün sesini çıkaran gençlerimiz var. bu bilinç ve çok seslilik, daha demokratik ve uygar bir geleceğin garantisidir.

opeation: payback'e dönelim.

haber sitelerinde "anoynymous" isimli bir hacker grubundan bahsediliyor. ama bu tam olarak doğru değil. çünkü saldırılar tamamen özgür, çoğu daha önce hiç tanışmamış birkaç bin insan tarafından yapıldı. büyük bir kısmında kişisel bilgisayarlar kullanıldı, evlerdeki kendi internet bağlantıları bu saldırılarda kullanıldı. bu bilgi güvenlik uzmanları tarafından da şu sözlerle doğrulanmıştır:
- in this case... they seem to be using their own computers (bu mevzu ele alındığında, kendi bilgisayarlarını kullanıyor gibiler)
( http://www.reuters.com/article/idUSL3E6N80HH20101208?pageNumber=2 )

çoğunlukla `4chan`, `digg`, `reddit` gibi sitelerde takılan ve haberleşen bu gençlerin ortak oldukları bir grup yok. "anonymous" isimli bir hacker grubu yok yani ortalıkta. anarşist bir düzene benziyor aslında, bir lider ve hiyerarşi yok; 2000 kişi aynı anda aynı şeyi düşünüyor ve yapıyor ve bu onları bir birlik yapıyor.
- Anonymous is supporting WikiLeaks not because we agree or disagree with the data that is being sent out, but we disagree with any form of censorship on the Internet (anonimlerin wikileaks'i destekleme sebebi, açıklanan verilere katılması veya katılmaması değildir. bizler, internetteki her türlü sansürlemeye karşı olduğumuz için bunu yapıyoruz).

saldırıların detayları ise şu şekilde;

- ilk saldırı, `paypal`'ın wikileaks bağışlarını dondurmasının ardından, kurumun bu haberi duyurduğu blog sitesine geldi. saldırılar sonucunda ThePayPalBlog.com sitesine erişim engellendi ve site 8 saatin üzerinde kapalı kaldı.

- ikinci hedef paypal oldu ve siteye erişim yavaşladı. ayrıca paypal hesaplarının tepki olarak kapatılması da öneriliyor. şöyle bir notla kapatmak örneğin yardımcı olabilir, "You stopped accepting WikiLeaks donations.".

- üçüncü hedef wikileaks'e gönderimleri durduran `postfinance`.ch isimli bankaya yapıldı ve siteden saatlerce transfer yapamadı. mağdur olan bir kullanıcı şöyle bir yorum yapmış "rica etsem postfinance'e saldırıları bir 10 dakika durdurabilir misiniz, bankayı kullanman lazım. rica etsem, lütfen?" http://twitter.com/LBisaTwit/status/12050627035136000

- paralel olarak bir başka grup "assange terörist gibi avlanmalıdır" diyen ( http://www.thefirstpost.co.uk/72259,people,news,sarah-palin-julian-assange-wikileaks-should-be-hunted-like-a-terrorist ) `sarah palin` ve wikileaks'e karşı lobi yapan ( http://www.ntvmsnbc.com/id/25158267/ ) senatör `joe liebermann`'ın sitesini hedef aldı ve kesinti yaşattı. sarah palin ve eşi (oğlu da olabilir) ayrıca kişisel banka hesaplarının ve e postalarının da tehdit altında olduğunu söyledi.

- tüm bunlarla birlikte ana hedefler de `visa.com` ve `mastercard.com` oldu. bu kurumların sitelerine yapılan saldırılar neticesinde `.com saatlerce erişim sorunu yaşadı, sitenin ana sayfası görüntülenemedi. e-ticaret ve para transferlerinde bilinen bir kesinti yaşanmadı; ayrıca `mastercard` "müşteri ve kart bilgileri veritabanımız güvende" diye açıklama yaptı. ( http://www.reuters.com/article/idUSL3E6N80HH20101208 ). saldırıların yanı sıra "mastercard hesaplarınız tehlikede, hesaplarınızı kapatın" duyuruları yapıldı, bu konuda siteler açıldı, mastercard'a karşı sosyal medyalarda ve bloglarda karalamalar yapıldı.

ilk saldırı dalgası ile ilgili detaylı bilgiye panda security sitesinden ulaşabilirsiniz.
(bkz: http://pandalabs.pandasecurity.com/tis-the-season-of-ddos-wikileaks-editio/)

inisiyatif, bu saldırıların ardından bu sabah bir başka hedefe yöneldi: parayı kesen paracı firmalardan sonra "hazır toplanmışken bir diğer sansürcülere de dalalım" demiş olacaklar ki `riaa`, `mpaa`, `ifpi` gibi kurumların sitelerine de saldırılar düzenlendi, saatlerce sitelere erişim yapılamadı. ( http://pandalabs.pandasecurity.com/4chan-users-organize-ddos-against-mpaa/ )

bu eylemler daha da devam edecek gibi gözüküyor. `moğollar`'ın dediği gibi `Bir şey yapmalı` ve bu topluluk yapabileceğini, yapması gerekeni yapıyor. helal olsun.

Friday, November 12, 2010

IntelliJ IDEA ve JavaDoc Türkçe UTF-8 Ayarı

Merhaba,

Bölge ayarınız (Regional Settings) Türkiye/Türkçe ise IntelliJ IDEA 8+ kullanırken JavaDoc oluşturmada sorun yaşayabiliyorsunuz. Türkçe karakter içeren notlarda ve Interface'lerde hatalar alınıyor.

Generating C:\Users\cagri.celebi\Desktop\ab\index-files\index-1.html...
java.util.MissingResourceException: Can't find resource for bundle com.sun.tools.doclets.internal.toolkit.resources.doclets, key doclet.ınterface
at java.util.ResourceBundle.getObject(ResourceBundle.java:384)
...
javadoc exited with exit code 1

Büyük I'yı küçük i yerine küçük ı yaptığı için "ınterface" isminde (olmayan) bir nesne tipi yapmaya çalışıyor sanıyorum, neyse sallamayayım şimdi onları.

Söz konusu sorunları aşmak için javadoc oluştururken dil için İngilizce ("en" veya "en_US") ve Karakter kodlaması için de "utf-8" demeniz gerekiyor. Onu da command line parameter olarak
-locale en_US -charset "UTF-8"
ile veriyorsunuz. Arayüzden yaparken şu şekilde ayarlayabilirsiniz.



IntelliJ dedim ama diğer ideler de JavaDoc.exe kullanarak bunu oluşturuyorsa benzer ayarlar yapılabilir.

Kolay gelsin.

Konu ile uzaktan ilgisi olan bir başka post daha var, ilginizi çekebilir;
Oracle Weblogic'i Regional Settings en-US Yapmadan Çalıştırmak

Monday, August 09, 2010

TorrentReactor Köyü

İnternetteki en büyük torrent sitelerinden birisi olan TorrentReactor kendisine köy almış. 150000$ karşılığı köyün ismini de TorrentReactor olarak değiştirmişler.



Eski ismi Gar olan bu şirin köyün yeni sahibi TorrentReactor (TR), evet. TR yetkilileri, köye genişbant internet erişimi için yatırım yapacaklarını, ayrıca bu paranın da okul ve sağlık hizmeti gibi halka dönük işlerde kullanılacağını açıklamış.

S.T.A.L.K.E.R. oyunundan çıkmış gibi görünen bu fotoğraftan da anlıyoruz ki tam da korsan krallara yakışır bir mekan olmuş.

Kaynak: http://torrentfreak.com/torrentreactor-buys-and-renames-russian-town-100807/

Wednesday, July 28, 2010

Simple If Then Else Scripting in TF2

Source: https://cagricelebi.com/blog/simple-if-then-else-scripting-in-tf2/

Not only Team Fortress 2, all Half-Life 2 games actually. Yeap, it's easy. A friend of mine asked me something like this
- I want to make the "g" key make the fov 90 on a press and 75 on the other press. It should toggle.

The pseudo code is like this at the first sight,
if (on keypress g) {
    if (fov==90) {
        fov=130;
        break;
    }
    if (fov==130) {
        fov=90;
        break;
    }
}


But as far as I know, there is no if then else logic on that platform. There is only bindings or aliases for the time being. So the algorithm is a bit more complicated, like calling functions with a global variable,

method1{
fov=90;
on keypress g: call method2;
}

method2{
fov=130;
on keypress g: call method1;
}

on keypress g: call method1;


This works like changing the binding of keypress g, which calls a method. The methods do 2 jobs; 1st changing the fov setting, 2nd changing which method to be called on keypress g.

The final code is like this.
alias ws1 "fov_desired 75; bind g ws2"
alias ws2 "fov_desired 90; bind g ws1"
bind g ws1


Here, each time you press g, the fov is toggled between 90 and 75.

You may code different if/else statements like this approach. The algorithm is a bit complex but that is the only choice with the current system.

I hope it works.

Thursday, July 01, 2010

Response Headerları İncelediğimiz Sıradan Bir Gündü

Firebug veya HttpWatch tarzı request/response monitoring tool kullananlar bilir, headerlarda proxy veya load balancer cihazların kendi bilgileri bulunur. Zappos.com diye bir ayakkabı alışveriş sitesi varmış, orada da Firebug açıkken şöyle bir şey görebilirsiniz:



Çok şirin değil mi ama Benjamin.
- I feel pretty.
Kendime not: Firebug nedir, nasıl kullanılır diye bir ara basitçe yazayım.