Dosya uzantısı kullanmaksızın sayfa adresleme

Oluşturulan web sayfalarının adreslerinde dosya uzantıları (.php, .jsp vb) kullanılmadan web sayfalarına adres vermenin nasıl yapılabileceği, bu yazıda anlatılmaktadır. Örnek adres:


Web sayfaları için adres oluştururken tercih edilen, süregelen o geleneksel yöntem aşağıdaki gibidir:


Bir kod sayfası oluşturulur ve sayfaya URL'den parametre gönderilir. Bu durumda ziyaretçi, yukarıdaki adresi analiz ederek web sitesinin altyapısı hakkında aşağıdaki bilgileri elde edebilir.



  • Sitenin dizin yapısı: Kök dizininde "haber.php" isminde bir kod dosyası var.

  • Kullanılan teknoloji: "haber.php" yani PHP toknolojisi kullanılıyor.

  • Parametreler: Sayfa, "HaberId" isminde bir parametre alıyor.

  • vs.


Bu şekildeki adreslemelerin, bazı sıkıntıları vardır:



  • Karmaşa: Böyle adreslerin, ziyaretçiler tarafından hatırlanması zordur. Başka bir sıkıntısı ise; basılı yayım organlarında (gazete, dergi vb), "?" ve ".php" içeren uzun adresler kullanıldığında, ziyaretçilerin gazeteden okuyup tarayıcılarına tuşlaması çok sıkıntılı olmaktadır. Oysa; vukuf.com/makale/23 hatırlaması ve tuşlaması kolay bir adrestir.

  • Güvenlik: Sisteme saldıracak olan muhtemel saldırgan, saldırılarını saltyapıya göre şekillendirecektir. Altyapı hakkında ne kadar az bilgi bilirse, işi o kadar zorlaşır.

  • Esneklik: PHP teknolojisine bağımlı olunur. PHP'den örneğin JSP'ye geçiş yapılacağı zaman, sistemdeki tüm bağlantıların adresleri PHP'den JSP dönüştürülmek zorunda kalacaktır: haber.php --> haber.jsp

  • İzlenim: Bazı projelerde, hangi teknolojinin kullanıldığı özellikle gizlenmek istenebilmektedir. Örneğin; ColdFusion satan bir şirket, kendi internet sitesinde PHP kullanmış olabilir. Teknolojisini gizlemek istemesi çok normal!

  • vs.


Sayfaların adreslerindeki tüm bu sırlar gizlenmelidir. En büyük internet sitelerinde bu zaten yapılmaktadır. Eğer aşağıdaki gibi bir adresleme kullanılırsa sırlar gizlenmiş olur:



Görüldüğü üzere, sayfa adresinde kod dosyasının uzantısı (.php) yoktur. Dizin yapısı da görülmemektedir. vs


Bu yazıda, bu yöntemin kullanılabilmesi için sistemde hangi ayarların ve değişikliklerin yapılması gerektiği anlatılmaktadır.


Uygulama sunucusunda (PHP, ColdFusion, JSP vb) herhangi bir değişiklik yapılmasına gerek yoktur. Tüm püf noktası HTTP sunucunda (Apache, IIS vb) gizlidir. Yöntem ise şöyledir; web sunucusu, tarayıcının gönderdiği sayfa adresini, uygulama sunucusuna değiştirdikten sonra gönderir. Böylece, kodlar süregelen /haber.php yöntemiyle hazırlanırken, adres satırından ulaşım değişmiş olur:



Dizin yapısında bir değişiklik yoktur. Süregelen yöntem devam eder. Kod dosyası, kök dizindedir:



Dosyanın içeriği aşağıdaki gibidir:



Bu yöntemin kullanılabilmesi için yapılması gereken ayarların tamamı web sunucusunda (Apache, IIS vb) yapılacaktır. Konunun uygulama sunucusuyla (PHP, ColdFusion, JSP vb) hiçbir ilgisi yoktur. Bunu hatırladıktan sonra, web sunucusunda hangi ayarların yapılması gerektiğine geçelim...


Apache


Yazıdaki örnekte Apache'nin ayarları aşağıdaki gibidir:


Apache'nin kurulu olduğu dizin:

C:\Program Files\Apache Group\Apache


Sitenin kök dizini:

C:\Program Files\Apache Group\Apache\htdocs


Apache yapılandırma dosyası:


C:\Program Files\Apache Group\Apache\conf\httpd.conf


Tüm değişiklikler Apache yapılandırma dosyasında gerçekleştirilecektir. Yapılandırma dosyası açılır ve aşağıdaki ayarlar yapılır:


Apache'ye Rewrite isimli modülü hafızaya yüklemesi emri verilmelidir. Aşağıdaki satırın başındaki kare (#) kaldırılmalır:


LoadModule rewrite_module modules/mod_rewrite.so


Apache'ye Rewrite isimli modülü kullanıma alması emri verilmelidir. Aşağıdaki satırın başındaki kare (#) kaldırılmalır:


AddModule mod_rewrite.c


Apache'ye Rewrite komutlarını kabul etmesi emri verilmelidir. Yapılandırma dosyasına aşağıdaki satır eklenir:


RewriteEngine On


...işte sıra geldi, adres satırının uygulama sunucusuna gönderilmeden önce nasıl dönüştürüleceğine... Apache yapılandırma dosyasına bir satır daha eklenmelidir:



Görüldüğü üzere, dönüştürme işleminin nasıl yapılacağı Apache'ye anlatılırken Kurallı İfade (Regular Expression) dili kullanılmaktadır:


RewriteRule ^/haber/([0-9]*).*$ /haber.php?HaberId=$1


Bu satırdan yüzlerce oluşturulabilir. Böylece, tüm sitedeki sayfaların adreslerini temizleyebilirsiniz:



Not: Apache yapılandırma dosyasında yapılan değişiklikler hemen uygulanmaz. Apache yeniden başlatılmalıdır. Ya da yapılandırma dosyasını yeniden okuması için Apache'ye komut verilmelidir (reload).

IIS

IIS için rewrite eklentileri

Windows XP'nin güvenlikduvarı

SMTP-POP3: Bir e-posta mesajı hangi yollardan geçer

E-postalar bize nasıl ulaşır?

Her e-posta hesabı "yalnızca bir sunucuda" kuruludur. Dünyanın herhangi bir yerindeki bir kişi, adresinize bir posta gönderdiğinde, posta sunucuları (MTA) kendi aralarında bu postayı birbirlerine aktararak, sizin hesabınızın kurulu olduğu sunucuya bu postayı ulaştırılırlar. O andan itibaren, Outlook'ta (örnektir) "Gönder/Al" komutunu verdiğinizde, Outlook hesabın kurulu olduğu sunucuya (Gelen Sunucusu) bağlanır ve postayı gelen klasörünüze "indirir".

E-postalarımız alıcıya nasıl ulaşır?

Posta alınırkenki senaryo, postayı gönderirken de geçerlidir; sizin postanızı alıcıya ulaştıracak olan sunucu da yine sizin sunucunuzdur. Potansiyel olarak, dünyadaki tüm posta sunucuları aynı zamanda, üzerinden posta göndermeye de izin verirler. Fakat, sunucular yalnızca kendi kullanıcılarının postalarını alıp göndermek üzere yapılandırılırlar. Yani, her kullanıcı yine kendi posta sunucusunu kullanarak postayı arkadaşına gönderecektir. Outlook'ta Gönder komutunu verdiğinizde, Outlook, posta sunucunuza (Giden Sunucusuna) bağlanır ve postayı alıcıya ulaştırılmak üzere sunucuya teslim eder. Sunucunuz, alıcının posta sunucusunu tespit ederek, postayı o sunucuya teslim eder. O andan itibaren, alıcı Gönder/Al yaptığında, posta gelen kutusuna indirilecektir. Posta, alıcıya ulaştı. Anlatılan süreç, aşağıda canlandırılmaya çalışılmaktadır.





route komutu

route komutu/tablosu, makineden dışarıya gitmek isteyen paketleri uygun ağ kartına yönlendirerek (routing) onun üzerinden göndertmekten başka bir işe yaramaz. Birden fazla ağ kartı takılı olan makinelerde kullanılır. Bu tabloya yeni yönlendirme talimatları eklemek için, route komutu kullanılır. Örnek vermek gerekirse;

route -p ADD 84.51.29.241 MASK 255.255.255.255 84.51.26.33

...yukarıdaki komut şu işi yapar; makineden,

IP: 84.51.29.241
Mask: 255.255.255.255

adresine gitmek isteyen paketleri, makineye takılı olan ağ kartlarından, ağ geçidi 84.51.26.33 olarak ayarlı olan kart üzerinden gönder. Ve bu yönlendirme ayarı kalıcı olsun (-p parametresi).

Microsoft Windows işletim sistemi, yazılımlar tarafından dışarıya gönderilmek istenen paketleri dışarıya gönderirken, bu route tablosunu okur. Eğer tabloda, gönderilmek istenen paketle ilgili bir talimat yoksa, Windows, pakedi, varsayılan ağ kartı üzerinden gönderir.

Reverse DNS

Anlamsız bir anlama gelen (!) "Reverse DNS", "IP'den isme" sorgu yapmaya yarar. Bilindik DNS sorgularında, bir domainin hangi adrese karşılık geldiği öğrenilmektedir (İsimden IP'yi elde etme sorgusu). Reverse DNS'te ise, bir IP'nin gerçekte hangi domaine karşılık geldiği öğrenilebilmektedir.

Reverse DNS, e-posta aktarım sistemlerinde (MTA), e-posta iletisinin, gerçekten de o kaynaktan yani o şirketten gelip gelmediğini anlamak için kullanılır. Örneğin, çeşitli DNS sorgulamaları yapmaya yaran bir site olan DNSStuff sitesinde 62.244.212.94 IP numarası Reverse DNS sorgusuna tabi tutulduğunda, "merkez.interajans.com" sonucu geriye dönecektir. Bu sonuç şu manaya gelir; bu IP'li sunucudaki bir e-posta sunucu yazılımı, sizin mail sunucunuza bir e-posta iletisi gönderdiyse ve e-postanın Kimden ("From") kısmında "...@interajans.com" yazıyorsa, o mesaj gerçekten de İnterajans'tan gelmiştir. O mesajı kabul edebilirsiniz. Ama eğer Kimden kısmında "info@microsoft.com" gibi başka bir domain ("microsoft.com") yazıyorsa, o mesaj yalancı bir kaynaktan geliyordur, onu karalisteye alabilirsiniz.

Sizin e-posta sunucunuza bir yerden bir e-posta geldiğinde, sunucunuzun elinde e-posta ile ilgili olarak şu bilgiler mevcuttur:


  • Mesajı bana gönderen öbür e-posta sunucu yazılımının kurulu olduğu bilgisayarın tam adı (Örn: merkez.interajans.com)

  • Gönderen makinenin IP numarası (Örn: 62.244.212.94)

  • E-postanın "Kimden" kısmı (Örn: bulten@interajans.com)

  • E-postanın "Konu" kısmı (Örn: İnterajans aylık bülteni)

  • E-postanın içeriği

  • Ekler vs.


Outlook gibi e-posta istemci yazılımları, bize genellikle yalnızca Kimden, Konu, Kime gibi basit bilgileri gösterirler. Ama görüldüğü üzere, aslında e-postanın içinde başka bilgiler de yer almaktadır.

E-posta sunucunuz, sizin adresinize gönderilmeye çalışılan bir mesajı, size ulaştırılmak üzere kabul etmeden önce, bir takım denetlemeler yapıyor olabilir. Örneğin, Hotmail, Yahoo gibi e-posta sunucuları, Reverse DNS yaparak, mesajın gerçekten de iddia edilen kaynaktan gelip gelmediğini anlamaya çalışırlar. Bunu şöyle yaparlar; mesajı gönderen sistemin IP numarası, Reverse DNS sorgusuna tabi tutulur. Dönen sonuçlar arasında, "Kimden" kısmında yazan adresin ("bulten@interajans.com") domaini (interajans.com) veya subdomain'i (merkez.interajans.com) varsa, posta gönderimi, Reverse DNS denetiminden başarıyla geçmiş olur.

Notlar:

  • "Outlook" yazılımı sadece bir örnektir. Alternatif e-posta yazılımları

  • "interajans.com" bir domaindir. Yoksa, "merkez.interajans.com" veya "www.interajans.com" bir domain değil sadece bir adres bir subdomain'dir.

SQL Server - IDENTITY

@@IDENTITY yöntemi, geleneksek olarak, ID’yi öğrenme yöntemi olarak kullanılır. Bu makalede, alternatif yöntemler üzerinde durulacaktır.

IDENT_CURRENT (‘table1’) fonksiyonu

Belirtilen tabloya,


  • Herhangi bir veritabanı kullanıcısı tarafından

  • Herhangi bir veritabanı bağlantısı (“connection”) içerisinde

  • Herhangi bir oturumda (“session”)

  • Herhangi bir scope’ta (Scope: TSQL alanı. Scope nedir?)

  • Herhangi bir trigger tarafından (eğer kullanılıyorsa)

  • Herhangi bir yolla (INSERT, SELECT INTO veya “bulk copy”)


…eklenmiş olan son IDENTITY değerini almak için,

SELECT IDENT_CURRENT (‘table1’) AS ID

...kullanılabilir.

@@IDENTITY değişkeni


Sistemde,

  • Herhangi bir veritabanı kullanıcısı tarafından

  • Herhangi bir veritabanı bağlantısında

  • Herhangi bir oturumda

  • Herhangi bir scope’ta

  • Herhangi bir trigger tarafından (eğer kullanılıyorsa)

  • Herhangi bir tabloya

  • Herhangi bir yolla


…eklenmiş olan son IDENTITY değerini almak için,

SELECT @@IDENTITY AS ID

...kullanılabilir.

SCOPE_IDENTITY() fonksiyonu


  • Geçerli veritabanı kullanıcısı tarafından

  • Geçerli veritabanı bağlantısında

  • Geçerli oturumda

  • Geçerli scope’ta

  • Herhangi bir tabloya

  • Herhangi bir yolla


…eklenmiş olan son IDENTITY değerini almak için,

SELECT SCOPE_IDENTITY() AS ID

...kullanılabilir.

Dikkat: @@IDENTITY değişkeni NULL döndürebilir

Veritabanında herhangi bir yerde bir INSERT, SELECT INTO veya “bulk copy” işlemi yapılırsa ve o işlemde, herhangi bir IDENTITY alana değer atanmazsa, @@IDENTITY yöntemi, geriye NULL döndürür. Bu nedenle, sistemde farklı yerlerde seri halde IDENTITY alana değer atayıp-okuyan işlemler varsa ve sistemde arada bir yerlerde, yukarıda tarif edildiği gibi bir kayıt ekleme işlemi yapılırsa, sistemde bir yerlerde rutin devam eden ilk @@IDENTITY işlemi, geriye bir seferliğine NULL döndürebilir ve hata oluşabilir.

Geriye NULL döndürme ile ilgili olarak ayrıntılı bilgi, aşağıdaki Microsoft makalesinde bulunabilir:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/tsqlref/ts_ia-iz_82i1.asp

“After an INSERT, SELECT INTO, or bulk copy statement completes, @@IDENTITY contains the last identity value generated by the statement. If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL.”

Dikkat: Bağlantı paylaşımı ihtimalini dikkate alın

ColdFusion gibi bazı uygulama sunucuları, aynı veritabanı bağlantısını, duruma göre, birden fazla web sayfasına (veya istemci yazılıma) kullandırabilmektedir. Böyle bir durumda, sizinle aynı veritabanı bağlantısını kullanan diğer web sayfalarının yaptığı IDENTITY işlemlerinden etkilenmemek için, en garantili yöntem, SCOPE_IDENTITY() kullanmaktır. Böylece, başka scope’lardaki IDENTITY işlemlerinin sizin işlemlerinizi olumsuz etkilemesinin önüne geçmiş olursunuz, desem bile inanmayın... Çünkü, yapılan sınama ve denetimlerde, SCOPE_IDENTITY() fonksiyonunun, @@IDENTITY değişkeni gibi; sistemin biryerlerindeki trigger ve INSERT'lerden vs etkilendiği görülmektedir. Bu nedenle, eğer SCOPE_IDENTITY() fonksiyonu sizin sisteminizde bir şekilde NULL döndürmeye başlamışsa, tüm INSERT ifadelerinizi bir Saklı Yordam (Stored Procedure) içerisine taşıyın. Böyle yaptığınızda, SCOPE_IDENTITY() mutlaka sizin saklı yordamınızda çalıştırılan INSERT ifadelerini baz alacağından, artık SCOPE_IDENTITY fonksiyonu NULL döndürmeyecektir.

Sequence

Oracle ve PostgreSQL gibi bazı veritabanı sunucuları, yeni kayıtlar için ID üretirken, “sequence” isimli yöntemi/nesneyi kullanırlar. Bu yöntemde, bir nevi kalıcı değişken görevini gören bir veritabanı nesnesinin (sequence) tutmakta olduğu sayı, her yeni INSERT ifadesinde bir (“1”) artırılır. Elde edilen yeni sayı, ID alanına kaydedilir. Kural olarak; Sequence bir kez artırıldığında, artık geriye dönüş yoktur. Eğer aynı anda çalışmakta olan başka yerlerdeki SQL ifadeleri de sequence’i artırırsa, sequence, en son kaldığı yerden artmaya devam eder. Böylece, veritabanı çapında ortak olan bu sayı, her zaman için en son ve kararlı ID'yi tutan bir nesne olarak kullanılır. Sequence hakkında ayrıntılı bilgi yine bu sitede


SQL Server 2005 ile birlikte, sequence nesnesi/yöntemi, Microsoft SQL Server’a da eklenmiştir. Güvenle kullanılabilir.

Sayılarla çalışmak

1) Oracle'daki NUMBER salt kullanımı ile PostgreSQL'deki NUMERIC salt kullanımı farklı davranıyorlar. Şöyle ki; Oracle, virgülden sonrasını, her halükarda atıyor. Üstelik, veritabanına göndermeye çalışıldığında hata vermeden otomatik olarak atıyor. Fakat, PostgreSQL, tıpkı bekleneceği gibi (olması gerektiği gibi) virgülden sonra istediğin kadar girebiliyorsun; hepsini veritabanına kaydediyor; harika! Yani; Oracle'da, alan NUMBER ise PostgreSQL'de, o alanı NUMERIC olarak ayarlamakta herhangi bir sakınca yok. (Not: NUMERIC olarak ayarlamak yerine "DOUBLE PRECISION" yapma konusunda yorumu olan var mı?)


2) Mesela NUMERIC(15,2) ayarı, her iki veritabanında da tam olarak aynı şekilde yorumlanıyor... Yani; virgülden sonrası ile birlikte, tüm rakamların toplam adedi en çok 15 olabilir. Bu 15 tane rakamın ise 2 tanesi her halükarda, virgülden sonrası için ayrılıyor. Yani, tam sayı kısmı için (virgülden öncesi için) 13 tane rakam kalıyor. Örnek verirsek; söz konusu ayar için



1234567890123,45


(Sorun yok)



1234567890123


(Otomatik olarak, sonuna iki sıfır konur ve "1234567890123,00" olur)



123456789012345


(Bu sayı kabul edilmez; hata verir. Çünkü, tam sayı kısmı fazla uzun. 13'ten fazla: 15 tane rakam)

Oracle'dan PostgreSQL'e geçiş

Not: Bu yazı taslak aşamasındadır.
Oracle 9i'den Oracle 10g'ye yeni geçtik. Bir yıl kadar sonra ise PostgreSQL 8'e geçtik. Geçiş esnasında, veritabanı üzerinde ve kodlarım üzerinde yapmak zorunda kaldığım değişikliklerin birçoğunu not aldım. Bu yazıda bu notları paylaşacağım. Veritabanı Unicode'du ve PostgreSQL'de veritabanını oluştururken de Unicode olarak oluşturdum. Veritabanım karmaşık değildi:


  • 200'den fazla tablo

  • 50 kadar arttırıcı (sequence)

  • Birkaç fonksiyon

  • Birkaç şema (schema)


Bu kadar çok tablo içermesine rağmen hiç görüntü (view) içermemesinden de anlaşılabilir; yeteri kadar profesyonelce tasarlanmış bir veritabanı değildi. Oracle 8i'den kalma bir veritabanıdır çünkü. Oracle VTS (Veritabanı Sununucusu), yapı üzerinde büyük değişiklikler yapılması noktasında bizi çok sıklıkla hüsrana uğratmıştı. Bu nedenle, çalışmaya devam ettiği müddetçe, genel tasarımı/yapıyı hep muhafaza etme taraftarı olduk. Hatta diyebilirim ki, veritabanı yapısı bizim için tam bir tabu olmuştu. Fakat PostgreSQL'e geçtikten sonra, açıkkaynak yazılımların genel etkisi olsa gerek, özgüven geldi. Artık çok ciddi değişiklikler yapmakta şüphe duymuyorum.

Veritabanı, saklı yordam (stored procedure) içermediği için, geçiş çok kolay oldu. Öyle ki, özel bir veritabanı-geçiş yazılımı kullanmama gerek kalmadı. Bir yazılım aracılığıyla tüm veritabanının SQL dökümünü çıkardım. Yüzlerce:

CREATE TABLE ...
CREATE SCHEMA ...
INSERT INTO ...

deyimi hayal edin. 2 gün içerisinde, bu deyimlerin tamamını PostgreSQL'e uygun şekilde değiştirdim. Değişikliklerin çoğunu, Dreamveawer'ın "Find and Replace" penceresini kullanarak gerçekleştirdim. İşte, değişiklik notlarımın bir kısmı, bu esnadaki değişiklikleri içeriyor.

1) NVARCHAR2 ve VARCHAR2 gördüğüm her yere VARCHAR yazdım.
2) LONG gördüğüm her yere TEXT yazdım.
3) DATE gördüğüm her yere TIMESTAMP yazdım.
4) NUMBER veritürü ile ilgili olarak ise

NUMBER(1..4) --> SMALLINT
NUMBER(5..9) --> INTEGER
NUMBER(10..18) --> BIGINT
NUMBER(20) --> BIGINT

değişikliklerini yaptım.

CREATE TABLE SAY (DEGER NUMBER)

şeklindeki salt kullanımları ise NUMERIC olarak değiştirdim.

NUMBER(T,O) --> NUMERIC(T,O)

değişikliğini yaptım. Veritürleri ile ilgili olarak, hatırladığım kadarıyla yalnızca bu değişiklikleri yapmak yeterli oldu. Şimdi sırada, diğer SQL ifadelerine geldi...

GRANT

PostgreSQL’de, grant komutunun

alter, index

seçenekleri yoktur. Dreamweaver’da, kurallı ifadelerin de yardımıyla,

grant.*alter.*\; grant.*index.*\;

ifadelerini arattırıp, bul-değiştir yapmak suretiyle, GRANT ifadelerini PostgreSQL’e uyumlu hale getirdim.


Tablo-cache

CREATE TABLE ifadesinde CACHE seçeneği olmadığından,

CREATE TABLE ... (...) CACHE;

benzeri tüm ifadeleri

CREATE TABLE ... (...);

olarak değiştirdim.


İlişki-disable

alter table REHBER add constraint BIRIM_REHBER_FK foreign key (ESAS_BIRIM_ID) references ESKI_BOLUM (BOLUM_KODU) disable;

"disable" seçeneği olmadığı için, kaldırıldı.




Şema isimlerinde küçük harf

Rollerin isimleri küçük harfle verildi. Büyük harflerle yazınca, "şema bulunamadı" hatası oluşuyor. Belki bunun çözümü vardır ama, o arada incelemeye vaktim olmadı. (Bununla ilgili olarak söylemek istediğiniz birşey varsa yorum yazabilirsiniz)

ALTER TABLE, CREATE TABLE önceliği

Var olmayan bir tablodaki bir alana ilişki oluşturulamayacağından ve var olmayan bir Birincil Anahtar (Primary Key) üzerinden kısıt kurulamayacağından dolayı,

ALTER TABLE ADD CONSTRAINT
INSERT INTO

komutlarının birçoğu hata verecektir. Bu nedenle, bu komutların çalıştırılma sırası aşağıdaki gibi olmalıdır:

CREATE TABLE ... (... ADD PRIMARY KEY ...);
INSERT INTO ...;
ALTER TABLE ADD CONTRAINT ...;

böylece, hangi tabloyu önce oluşturduğunuz önemsiz hale gelir.

SYSDATE-NOW()

SYSDATE gördüğüm yere NOW() yazdım.

Uygulama Sunucusu kodlarımda yaptığım değişiklikler

  • ORDER BY'larda Türkçe sorunu çıkmasın diye ALTER SESSION benzeri komutlar kullanırdık. Bunları kaldırdık.

  • SQL ifadelerindeki (+) ifadeleri, JOIN ifadeleri ile değiştirildi. (Oracle'ı bilenler, veritabanımızın ne kadar eski olduğunu daha iyi anlamışlardır)

  • CONCAT CONCAT(CONCAT(PERSONEL.ADI,' '),PERSONEL.SOYADI)benzeri ifadelerPERSONEL.ADI || ' ' || PERSONEL.SOYADIile değiştirildi.

  • Uygulama Sunucusu olarak ColdFusion kullanıyoruz. Geri dönen veritürlerini ColdFusion (veya JDBC sürücüsü) bazen doğru algılayamayıncaCAST CAST(SUBSTR(METIN, 17001, 2000) AS VARCHAR2(2000)) AS METIN_PARCA_10benzeri ifadeler kullanmak zorunda kalmıştık. PostgreSQL'de (veya JDBC sürücüsünde)bu noktada herhangi bir sorun mevcut olmadığından CAST ifadelerini çoğu yerden kaldırdık:SUBSTR(METIN, 17001, 2000) AS METIN_PARCA_10

  • Her alt SELECT ifadesinebir isim verilmesi gerekti. Mesela:select * from (select * from)komutu Oracle'da çalışırken PostgreSQL'de hata veriyordu. Biz deselect * from (select * from) calisanlarbenzeri şekilde değiştirmek zorunda kaldık. Bence mantıklı olan da bu.

  • Ve işte geldik arttırıcı (sequence) meselesine. Her iki VTS'de de arttırıcı nesne var. Fakat, değerini almak için komutlar farklı. Oracle'da: select KISI_ID_SEQ.nextval from dualPostgreSQL'de:select nextVal(' KISI_ID_SEQ ') Arttırıcılar hakkında daha fazla bilgi

  • NVL() fonksiyonunun eşleniği COALESCE() fonksiyonudur. Gerekli değişiklikler yapıldı.

  • ColdFusion kodlarımızdaki SQL-binding kısımlarında değişiklikler yapıldı:cfsqltype="cf_sql_clob" --> cfsqltype="cf_sql_text"
    cf_sql_longvarchar --> cf_sql_textcfsqltype="cf_sql_text"
    cfsqltype="cf_sql_nvarchar" --> cfsqltype="cf_sql_varchar

  • TRUNC(x) --> DATE_TRUNC('day', x)

  • ColdFusion kodlarındaki CFQUERY etiketleri arasındaki tüm/* ... */açıklama satırları-- ...ile değiştirildi veya gereksiz açıklama satırları kaldırıldı. Nedendir bilmiyorum; C++ tarzı açıklama satırları hataya neden oldular. İncelemeye pek vaktim olmadı (bu konuda görüşü olan?)


Neden PostgreSQL'e geçtim?
...

Anahtar kelimeler

oracle postgresql geçiş
oracle postgresql migration
oracle postgresql conversion

Türkçe

PostgreSQL ve Türkçe

PostgreSQL 8.1.3 Win32 sürümü, Türkçe karakter desteklemez. Yalnızca ORDER BY sıralamalarını doğru yapar. Esasında bu genelde yeterlidir. Her ne kadar, UPPER() ve LOWER() fonksiyonları Türkçe karakter desteklemese de, bu fonksiyonların eşleniklerini kendi fonksiyonlarınızı kullanabilirsiniz. Mesela UPPER() fonksiyonu yerine TUPPER() fonksiyonunu geliştirebilirsiniz. Bunu yapmak için, şu komutu PL/PGSQL komutunu kullanabilirsiniz:

CREATE OR REPLACE FUNCTION cms_1_tr.tupper("varchar")
RETURNS "varchar" AS
$BODY$
BEGIN
RETURN UPPER(TRANSLATE($1,'ıi','Iİ'));
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;


Buradaki "cms_1_tr", şemanızın adıdır ("public" yazabilirsiniz siz). Eğer, "plpgsql dili kayıtlı değil" gibi bir hata oluşursa, öncelikle, CREATE LANGUAGE komutunu kullarak, dili oluşturmanız gerekecektir. Sorunsuz şekilde çalıştıktan sonra, artık SQL ifadelerinizde UPPER() yazdığınız yerlere TUPPER() yazarak sorununuzu çözebilirsiniz:

SELECT tupper(adi), tupper(soyadi) FROM cms_1_tr.kisiler;

gibi. SQL ifadelerinizdeki LIKE komutlarınızın büyük/küçük ayrımı yapmamasını sağlamak için, PostgreSQL'de ILIKE komutunu kullanabilirsiniz. Fakat maalesef, bu komut da Türkçe karakter desteklemez. Bunun için benim önerebileceğim bir telafi yolu yok. Sizin varsa yorum yazabilirsiniz.

Not 1) PostgreSQL'in hiçbir Linux/Unix sürümünde, Türkçe karakter sorunu yoktur.
Not 2) Oracle Windows sürümünün UPPER() fonksiyonlarında da aynı Türkçe karakter sorunu vardır. Yine aynı yolla çözmüştük. Linux sürümünde durum nedir bunu bilmiyorum (Bu konuda bir bilgisini paylaşmak isteyen varsa yorum yazabilir)

Sequence

İçindekiler:


  • Girizgah

  • Veritabanı sunucularının karşılaştırılması

  • SQL Server

  • PostgreSQL Sequence

  • Oracle Sequence

  • Transaction ve Sequence


Girizgah

Sequence nesneleri PostgreSQL, Oracle ve birkaç istisnai veritabanı yönetim sisteminde (VTYS) kullanılan bir çeşit veritabanı nesnesidir. Artan veya azalan bir sayı elde etmek için kullanılır. Bu nesneleri, yazılım kodlamalarında kullanılan sayaç değişkenleri gibi düşünmek mümkündür. Bu nesne, genellikle bir tabloya eklenecek olan bir kayda bir ID ayarlamak için kullanılır. Her yeni kayıt eklenirken, daha önce ID olarak en son kullanılan sayının bir fazlasını almak için sequence artırılır ve elde edilen bu yeni ve son sayı, yeni kaydın ID'si olarak, INSERT INTO ifadesinde kullanılır.

Bir veritabanında, sınırsız sayıda sequence nesnesi oluşturulup, istenildiği kadar tabloda/alanda kullanılabilir. Bir sequence nesnesi birden fazla tablo için kullanılabileceği gibi, her tablo için ayrı bir sequence nesnesi de oluşturulup kullanılabilir. Eğer ayrım gözetmeksizin tüm ID alanlarını mesela 10 haneli yapma gibi bir geleneğiniz varsa ve tablodaki ID değerlerinin ardışık olup olmaması sizin için hiç önemli değilse, ortak bir sequence oluşturup, birkaç tabloda birden aynı sequence nesnesini kullanabilirsiniz. Tabii ki bu durumda, sequence nesnesinin çok büyük bir değer üretip de, ID alanının alabileceği hane sayısını aşma ihtimalini her zaman göz önünde bulundurmalısınız. Yok eğer, tablodaki ID alanına kaydettiğiniz sayıların ardışık olması sizin için çok önemliyse (örneğin bankalardaki sıra numaraları veya evrakların üzerine not edilen başvuru numaraları gibi), tablo için ayrı ve müstakil bir sequence oluşturup kullanmanız gerekecektir. Özetle: Onlarca tablonun olduğu bir veritabanında, bir de onlarca sequence ile uğraşmak istemiyorsanız, mümkün olduğu kadar, ortak sequence nesneleri kullanın.

Veritabanı sunucularının sequencee noktasında karşılaştırılması

Diğer birçok VTYS'de sequence gibi bir nesne yoktur. Zira onlarda, tabloya yeni bir kayıt eklenirken, ID alanının otomatik olarak bir değer alması için hazır ve bazen sıkıntılı (bkz: SQL IDENTITY) yollar mevcuttur. PostgreSQL'de de kendine has bir hazır yol mevcuttur, aşağıda aktarılacaktır. Microsoft SQL Server'da tablo henüz oluşturulurken hangi alanın otomatik olarak bir sayı alacağı ayarlanabilmektedir. PostgreSQL ise her zamanki "geliştirici dostu" tavrını sürdürmekte ve hem sequence özelliğini hem de otomatik artan alan tanımlayabilme özelliğini bir arada sunmaktadır. VTYS'lerin ID değerleri üretme ile ilgili sunduğu olanaklar, aşağıda aktarılmaktadır.

SQL Server

CREATE TABLE OGRENCILER (
ID INT NOT NULL IDENTITY(1,1),
TAM_ADI VARCHAR(70) NOT NULL
);


Bu ifadedeki IDENTITY(1,1) ayarı sayesinde, tabloya yeni bir kayıt eklendiğinde, ID alanının otomatik olarak sıradaki sayı değerini alması sağlanmış olmaktadır. Örnekteki tablo, bir üniversitedeki öğrencilerin bilgilerinin kaydedildiği tablodur. Bilindiği gibi bir de dersler var maalesef! Öğrencinin kaydı eklenirken, hangi dersleri alacağı da kaydedilmek istenecektir haliyle. Öğrencinin alacağı dersler kaydedilirken, bu yeni öğrencinin ID bilgisine de ihtiyaç duyulacaktır. SQL Server'da bu ID'yi öğrenmek için genelde SELECT @@IDENTITY ifadesi kullanılır. Bu bir SELECT sorgusudur ve son üretilen ID bilgisini geriye döndürür. Geriye döndürülen bu ID bilgisi, sonraki INSERT ifadelerinde kullanılır ve böylece ilişkisel model için gerekli olan ID eşleşmeleri sağlanmış olur.

Sequence kullanılan Oracle ve PostgreSQL gibi VTYS'lerde ise, ID'nin kaç olacağı, daha öğrencinin kaydı oluşturulmadan önce sayaç yardımıyla tespit edilebilmektedir. Bu, birçok avantajı da beraberinde getirmektedir. PostgreSQL ve Oracle'da sequence nesnelerinin nasıl kullanıldığı, aşağıda örneklerle aktarılmaktadır.

PostgreSQL Sequence:

INSERT INTO ogrenciler (
id,
tam_adi
) VALUES (
/*Yeni ID'yi üret ve ID alanına bu değeri kaydet:*/
nextVal('ogrenci_id_seq'),
'Kemal Etikan'
);
INSERT INTO ogrencilerin_dersleri (
id,
ogrenci_id,
ders_id
) VALUES (
/*bu tablonun ID'sini üret ve kaydet:*/
nextVal('ogrencilerin_dersleri_id_seq'),
/*öğrenci ID'si sequence'inin şu anki değerini bu tabloya kaydet:*/
currval('ogrenci_id_seq'),
187
);


Önemli: Yukarıdaki örnekteki birinci INSERT ifadesinden sonra ikinci INSERT ifadesi çalıştırılacakken, başka bir kullanıcının transaction'ında (muamelesinde) bir nextVal('ogrenci_id_seq') komutu çalışırsa, sequence bir artmış ve değişmiş olacağından, ikinci INSERT ifadesindeki currval('ogrenci_id_seq') fonksiyonu, ilk INSERT ifadesindeki ID'den farklı bir değer alacaktır. Yani, ID'leri kullanarak kayıtları ilişkilendirme modeli çökmüş olacaktır. Bu olası sorun bertaraf etmek için, ilk INSERT ifadesinden önce nextVal('ogrenci_id_seq') komutu çalıştırılmak suretiyle ID tespit edilip yazılım değişkenine veya PLPGSQL değişkenine aktarılmalı ve her iki INSERT ifadesinde de bu ID değeri kullanılmalıdır. Aşağıdaki Oracle-ColdFusion örneğinde olduğu gibi.

Yukarıda da vurgulandığı gibi, PostgreSQL'de, bir alanın SQL Server'daki gibi otomatik olarak kendiliğinden bir değer almasını sağlamak mümkündür. Bunu yapmak için, alanın veri türünü BIGSERIAL veya SERAL olarak ayarlamak yeterli olacaktır. Bu nokta ile ilgili daha fazla bilgi için Serial Types resmi belgesine başvurunuz. Bu arada, Oracle'da böyle bir özellik/kolaylık/kıyak yoktur.

Ayrıca PostgreSQL'de, örneğin iki farklı tablodaki ID alanlarının aynı sequence nesnesini kullanarak değerlerini otomatik olarak almasını sağlamak mümkündür:

CREATE TABLE ogrenciler (
id INTEGER DEFAULT nextVal('kisi_id_seq'),
tam_adi varchar(60)
);


CREATE TABLE ogretmenler (
id INTEGER DEFAULT nextVal('kisi_id_seq'),
bransi varchar(60)
);

PostgreSQL'de sequence nesneleri hakkında daha fazla bilgi için CREATE SEQUENCE ve Sequence Manipulation Functions resmi belgelerine başvurunuz. Ayrıca, PostgreSQL Technical Documentation resmi sitesindeki PostgreSQL CBT - Sequences belgesini de kesinlikle incelemelisiniz. Güncel bir PostgreSQL sürümündeki özellikleri aktaran belgeyi incelediğinizden emin olunuz.

Oracle Sequence:

Oracle ve ColdFusion kullanılarak geliştirilmiş olan örnek bir kod:


<cfquery name="qrySayac">
/*ID'yi üret ve tespit et*/
select OGRENCI_ID_SEQ.NEXTVAL as ID from dual
</cfquery>


<cfquery>
insert into OGRENCILER (
ID,
AD,
) values (
/*yukarıdaki sorguda tespit edilen ID'yi bu tabloya kaydet:*/
#qrySayac.ID#,
'Kemal Etikan'
)
</cfquery>

Transaction ve Sequence

Transaction Rollback geri alma işlemleri sequence nesnelerini etkilemez. Bu kural şu manaya gelir: bir sequence nesnesinin değeri bir artırıldıysa, bir Transaction içinde bile olsanız, Rollback yapıldığında, sequence nesnesinin değeri olduğu yerde yani son değerinde kalır. Bu durum, Sequence'lerdeki temel displinlerden ve gerekliliklerden biridir.

View

SQL Server'da bir veritabanı görüntüsü (view) oluşturdunuz. Aradan biraz zaman geçti ve siz görüntüye yeni bir sütun eklediniz ve yazılımınız bu yeni sütunu kullanmaya başladı. Yazılım kodlarınız hata vermeye başlayabilir: "Veritabanı görüntüsünde böyle bir sütun yok". Muhtemelen SQL Server, veritabanı görüntüsünü keşlemiştir. Keşi temizlemek için Query Analyzer'da aşağıdaki komutu çalıştırmayı deneyiniz:

DBCC dropcleanbuffers

Bu komut, keşleri temizlemeye yarar. Bakalım sorununuz düzelecek mi? Eğer düzelmezse, bu yazıya yorum ekleyiniz.

Cursor

Aşağıdaki komutların ve anlatımların tümü, ilgili bir veritabanı içindir. Gerekli üst yetkilere sahip bir kullanıcıyla veritabanına giriş yapıldıktan sonra bu komutlar çalıştırılabilir.

Oracle

Veritabanım şu anda PFILE mı yoksa SPFILE mı kullanıyor:

SELECT value FROM sys.v_$parameter WHERE name = 'spfile';

Tüm ayarlar/parametreler:

SELECT * FROM sys.v_$parameter

Şu anki "azami açık imleç sayısı" ayarı. Aynı anda kaç imleç açık tutulabilir:

--"value" sütunu
SELECT * FROM sys.v_$parameter where name='open_cursors'


Şu anki açık imleçler:

SELECT * FROM v$open_cursor

Şu anda hangi kullanıcıda kaç imleç açık:

SELECT v.value AS numopencursors ,s.machine ,s.osuser,s.username
FROM V$SESSTAT v, V$SESSION s
WHERE v.statistic# = 3 and v.sid = s.sid


Şu anda toplamda kaç imleç açık:

--Yukarıdaki ifadenin count(*) kullanılmış hali
SELECT sum(v.value)
FROM V$SESSTAT v, V$SESSION s
WHERE v.statistic# = 3 and v.sid = s.sid


Aynı anda en çok kaç imlecin açılabileceğini ayarlama:

ALTER SYSTEM SET open_cursors=1005 SCOPE=BOTH;

Unicode

Not: Bu yazı geliştirilmektedir.

Oracle

İçinde tablolar olan bir veritabanını Unicode'a dönüştürmek:

Türkçe karakter kümesi (character set) ile oluşturulmuş olan bir Oracle 10g veritabanının, Unicode karakter kümesine dönüştürülmesi serüveni aşağıda aktarılmaktadır:

1) create database link ELCARO_YEREL
connect to CMS_1 identified by APOLLO
using 'elcaro';

Javascript kullanırken dikkatli olunmalıdır

Not: Bu yazı geliştirilmektedir.

Siteyi yayına vereli aylar oldu. Bu sorun da nereden çıktı?:

Siteyi yayına verdikten uzun bir süre geçtikten sonra bile, sitede bir takım sorunlar çıkması hâlâ muhtemeldir. Bazen gözardı edilen ince noktalar şunlar olabilir:

İstemci bağlantılı potansiyel sorunlar

  • Javascript kodları arasına dinamik kodlarla eklediğiniz içerikler. Tırnak işaretleri soruna neden olabilirler. Bir içeriğin başlığında çifttırnak veya tektırnak işaretinin yer alması yeterli olur çoğu zaman. Birilerinin siteyi hacklemelerine gerek bile kalmayabilir.

  • Sunucudaki kayıtları aldınız ve istemciye Javascript aracılığıyla form alanları üreterek gösterttiniz. Kullanıcı, yine Javascript yardımıyla form alanlarında değişiklikler yaptı ve Kaydet düğmesini tıklattı. Sunucudaki kodlarınız, eski kayıtları tamamen sildi ve yerine, istemciden gelen form alanlarını sayarak yeni kayıtları ekledi. Sizce bu yöntemdeki potansiyel sorun ne olabilir? Bir ipucu vereyim; mevcut kayıtları kullanıcıya gösterilirken bir Javascript hatası oluşur ve hiçbir form alanı oluşturulmazsa ne olur? Ben söyleyeyim; sunucudaki kodlar, her zamanki gibi, eski kayıtları siler ve hemen ardından, istemciden gelen form alanlarını sayarak yeni kayıtları eklemeye çalışır. Ama, form alanları görüntülenemediği için, sunucuya hiçbir form alanı gitmeyecek ki? İşte görüldüğü üzere, tüm kayıtlar silindi!
Javascript, kayıt silme/güncelleme amaçlarıyla kullanılmamalıdır. Çok tehlikelidir. Kullanırken ise dikkatli olunmalıdır. Javascript, istemci ile etkileşim konusunda sırlı ve sihirli bir yaklaşımdır. Ama bu yaklaşım, başınızı ağırtabilir. Dikkat.

CAPTCHA

İstemcidekinin gerçekten bir insan olduğunu kanıtlamak için kullanılan yöntemlerden biri de kepçelerdir (CAPTCHA). Kepçelerde en sık kullanılan yöntem ise "eğri-büğrü" resimler görüntülemektir.

Sunucu kodlamalarında bu resimleri oluşturmak için en sık kullanılan yöntem, sunucu diskinde bir resim oluşturup, istemciye bu resim dosyasının adresini vermektir. Bu yöntemin sıkıntıları şunlardır:


  • Özellikle çok ziyaret alan sitelerde, sunucu diskinde yüzbinlerce resim oluşturulacaktır. Bunları sürekli takip edip silmeniz gerekir.

  • Bu küçük fakat çok sayıdaki dosya, diskte parçalanmalara neden olurlar. Bir süre sonra, disk işlemleri yavaşlar, yedek almak zorlaşır vb. Sık-sık diski "defrag" yapmanız gerekir.


Biz bu sorunların tamamını, meşhur Alagad kepçede yaşadık...

Oysa, eğer resim, sunucuda disk kullanmaksızın bellek üzerinde oluşturulur ve istemciye gönderilirse, hiçbir sorun kalmaz. ColdFusion kodlaması yapıyorsanız, size bu özelliğe sahip bir kepçe bileşeni önerebilirim: LylaCAPTCHA. Apache Lisansı altında dağıtıldığından dolayı, tamamıyla ücretsiz ve AKK olan ve arkaplanda Java'dan istifade eden bu bileşen, yalnızca ColdFusion 7.x üzerinde çalışabiliyor.

CSS hacking

Eskiden CSS yoktu. Eskiden AIDS de yoktu. CSS, henüz yeni oturmakta olan bir standart olduğu için, web tarayıcılarının (Firefox, IE vs) bu standarda uyumu ve geçişi zaman almaktadır. Sancılı olabilmektedir. Geçiş ve uyum sürecinde, tarayıcıların CSS'teki standartları faklı yorumlamalarından hatta kimi zaman yanlış (bug) yorumlamalardan (parsing) dolayı, CSS kullanılmış web sayfalarında, tarayıcıdan tarayıcıya bazı farklı ve sinir bozucu sorunlar çıkabilmektedir. Bu makalede, "CSS haking" tabir edilen mecburi çözüm yollarına değinilecektir.

a:hover

a:hover {

color:#000066;

border-color:#000000;

border-bottom-style:solid;

}

satırlarındaki, kenarlık biçimlendirmesi soruna neden oluyor; linkler üzerinde imleç süratli bir şekilde gezdirildiğinde, ekran titriyor. Bu biçimlendirme Firefox’ta böyle bir soruna neden olmuyor. Ben bu durumu IE bug’ı olarak değerlendiriyorum. Sorunun çözümü için, mezkûr ifadedeki kenarlık biçimlendirmelerinin kaldırılması gerekir:

a:hover {

color:#000066;

}

…ben sitede bu değişikliği yaptım ve sorun düzeldi.

letter-spacing

{

letter-spacing:1px;

}

ifadesi, sağdan-sola yazılan dillerde soruna neden oluyor; kelimeler ters dönüyor. Sanırım bu durum, tarayıcıların bir bug’ı olsa gerek. Bu sorunun çözümü için, sağdan-sola yazılan diller için ayrı bir CSS gönderilmeli tarayıcıya ve bu ifade kaldırılmalı o CSS’ten:

{

letter-spacing:none;

}

Arapça, Farsça, Japonca vb (Unicode)

CSS ile birlikte "sıradışı" dilleri kullandığınız oldu mu hiç? Örneğin, Çince, Farsça vb... Eğer kullandıysanız, bu gibi dillerde yazı karakterlerinin bozuk göründüğüne (kare kare göründüğüne) şahit olmuşsunuzdur. Bu sorunun nedeni, CSS'te belirtmiş olduğunuz yazıtipinin, söz konusu dili desteklememesidir. Bu sorunu aşmak yani karakterleri düzgün görünür hale getirmek için, yazıtiplerini; "Arial" veya benzeri standart yazıtipleriyle değiştirmeniz gerekmektedir:

body{
font-family: Arial, sans-serif;
}


şeklinde.

Eşref Atak

1982
Çalışmakta olduğu şirketler:
www.interajans.com
www.workcube.com

Silkroad Online


İnceleme

Silkroad Online, oynaması bedava olan online oyunlardan biridir. Parasız oynanması oyuncular arasında kötü bir oyun düşüncesi yaratabilir. Ancak oyun grafikleri ve online oyunlara getirdiği yeniliklerle oyun severlere farklı bir heyecan yaratmıştır. Ayrıca düşük sistem bilgisayarlar için grafik ayarlarını kısma özelliği de mevcut. Bu da diğer online oyunlarla rekabet edecek kapasiteye geldiğini gösteriyor. Oyunun yapımcıları biraz daha geliştirirse oyunu piyasadaki en iyi online oyunların arasına sokabilir.

Oyunun ortalama 20 tane serverı var. Bu serverların çok olmasının nedeni; çok fazla oyuncunun oyunu oynamak istemesidir. Oyunda oldukça fazla silah, karakter tiplemeleri, canavarlar ve NPC ler var. Aşağıdaki rehber niteliği taşıyan resme bakarak neyin nerede olduğunu görebilirsiniz. Bu size güzel bir rehber…




Oyun, isminden de anlaşıldığı gibi İpekyolu ticaretini konu alıyor. Konusuna tamamı ile bağlı bir oyun olmuş. Ticaretin küçük çaplısı da mevcut. Canavarlardan elde ettiğiniz malları küçük el tezgahlarına koyup satabilirsiniz. Ayrıca oyunda tezgâhınıza kimin baktığını da görebiliyorsunuz. Mal almak isteyen oyuncular sizinle pazarlık yapabiliyor.

“Birlikten Güç Doğar”

Silkroad Online (SRO)'da guild sistemi de mevcut. Eğer başlıktaki teze katılıyorsanız ya bir guild kurun, ya da bir guilde girin. Guildden çıkmakta çok basit. Sonhyeon(general) in yanına gidin ve ‘leave guild’ deyin. Bu kadar basit.

Sonuç:

Yeni bir online oyun arıyorsanız piyasada bundan iyisini bulamazsınız. Her yönü ile harika bir oyun. Tabi beleş olması da cabası :-)

Sistem Gereksinimleri:

EN AZ

ÖNERİLEN

P3 700

P3 800

256MB RAM

512MB RAM

3GB HDD

3GB HDD

32MB EKRAN KARTI

64 EKRAN KARTI

512KB İNTERNET BAĞLANTISI

1MB İNTERNET BAĞLANTISI

Tanıtım

Oyunu yüklemek için orijinal CD almanıza gerek yok. Tek yapmanız gereken oyunun resmi sitesi olan http://www.silkroadonline.net/ adresine girip oyunu indirmek.Oyunu indirdikten sonra oyunu yükleyip güncellemelerini yapmasına izin vermeniz gerekiyor. Aksitaktirde oyuna giriş yapamazsınız. Oyunun kurumu ve güncellemesi bittikten sonra sitesine girip kaydolmanız gerekiyor. Paralı değildir. Diğer oyunlar gibi Premium derdi yoktur. Günün her saatinde bağlanabilirsiniz. Oyunda diğer online oyunlar gibi kaydetme yok. Oyunu kapattığınız zaman gene kaldığınız yerden devam ediyorsunuz.

Karakter Seçimi:

Oyunda; spear (mızrakçı), glavie(baltacı), sword(kılıççı), bow (okçu), shield(kalkancı) grupları var. Oyunu neden oynadığınız önemli. Eğer arenalarda kapışmak isterseniz glavie, spear veya sword olmanız gerekir. Eğer ben uzaktan canavar kesicem derseniz bow olursunuz. Bowlar arenada kolay kolay kapışamazlar. Ben şahsen spearım. Çünkü spear skileri glavecilerede oluyor. Ayrıca karakterinize istediğiniz yüz ve vücut modellemelerini verebiliyorsunuz. Shield grubu sadece savunma yapar, almanızı tavsiye etmem.


Silahlar:

Silahlar diğer online oyunlar gibi +6, +5, +9 gibi “basılıyor”. Ama bu o kadarda kolay değil. Bunları basmanıza gerek yok aslında. Satıcılardan alabilirsiniz. Mallar o kadar pahalı değil.

Ama bu oyunda lwl atlamak gibi para kazanmak da çok zor. Silahları NPC(oyun içinde yerleri sabit bilgisayar satıcılar) lerden alabilirsiniz. Bu alacağınız silahlar işinizi belli bir süre görür. Silahları kullanmak levele göre oluyor. Mesela Hook Glavie sadece 16. lwlde kullanılabiliyor.



Oyuna İlk Adımlar:

Oyuna girdiğinizde diger oyunlar gibi çıplak dolaşmıyorsunuz. Ezikte olsalar kıyafetleriniz ve silahınız var. Etrafınızda bir sürü oyuncu olacak ve bu oyunu yavaşlatabilir. Korkmayın savaş alanına gittiğinizde çok az takılacak. Etrafınızda oyuncuların haricinde 10’a yakın NPC olacak. İlkönce kaleden çıkın ve biraz canavar öldürün. Her level atladığınızda size 3 tane ex point gelecek bunları ya STR ye vereceksiniz yada İNT e vereceksiniz. STR adamınızın zor ölmesini sağlar. İNT ise adamınızın özel güçlerini kullanma miktarını ayarlar. Tavsiyem 2 STR, 1 INT verin. Göreceksiniz çok faydası olacak.

Oyunun ilk 20 bölümleri zordur ve sıkıcı olabilir. Bu aralarda sadece görev yapmaya çalışın. Görevleri NPC lerden alacaksınız. Oyunda en büyük yardımcılarınız şüphesizki skileriniz olacak. Skiler levellerden bağımsız olarak gelişen güçlerdir. Bunları kendi silahınıza göre ayarlamanız gerekir. Ayrıca artan skileri ateş, buz, elektirik ve kuvvet güçlerine verebilirsiniz. Size tavsiyem ateşe verin. Çünkü ateş rakibinize çok fazla hasar veririr. Ama buzcuları da yabana atmamak lazım. Bunlar rakibini buzla dondurabilir.

20 Level Üstü:

20 level üstü olduysanız oyunla azçok bilginiz ve yargınız oluşmuştur. 20 levelden yüksek olduğunuz için bir gruba geçmeniz gerekiyor.

Hırsız: Kervanları soyar ve paraları alıp kaçar.

Satıcı: Oyunda mal satar ve kervan sürer. Kervan sürerken bol miktarda hırsızla karşılaşabilirler.Kendini ve kervanı savunması oldukça zordur.

Avcı: Arenalarda kapışır. Satıcılara para karşılığı mallarını korur. Canavarlara karşı koyarlar. Bence en güzel gruptur.

Tarayıcı-DNS

Web sitelerinde gezinmek için internet tarayıcılarını kullanıyoruz (Firefox, IE vs). Gezinmekte olduğumuz web sitesinin dünyanın neresindeki web sunucusunda tutulmakta olduğunu hiç düşünmemize ve bilmemize gerek yok. Tarayıcımız tüm işlemleri bizim yerimize halleder. Tarayıcımızın adres satırına bir web sayfasının adresini yazıp "Git" düğmesini tıklatınca, tarayıcımız sırası ile bir dizi işlem yapar. Süreçteki ilk işlemlerin temel amacı, adresi yazılmış olan web sayfasının tutulduğu web sunucusunun IP adresini öğrenmektir. Aşağıdaki görüntüde, IP numarasının temin edilme süreci canlandırılmaya çalışılmıştır.




Tarayıcımız, web sunucusuna farklı protokoller üzerinden bağlanabilmektedir (HTTP, HTTPS, FTP vb). Benzer şekilde, farklı portlar üzerinden de bağlanabilmektedir. Adres satırına yazılan adreste bu ayarların nasıl olacağı belirtilebilmektedir. Aşağıdaki görüntü, bir örnek üzerinden meseleyi aktarmaktadır:


Ömer Atak

1991

Şahsî: www.omeratak.com


.

Beni verem ettin!

Bu sözü bazen kullanırız. Nasıl bir ruh halinde söylenir hepimiz biliriz. Çok anlamlı bir sözdür...

Verem hastalığına "ince hastalık" da denir. Ozanlar ve aşıklar bu hastalığa daha sık yakalanırlardı. Nedenini tahmin edebilirsiniz: dert, keder, aşırı üzüntü... İlginç değil mi? İşte bir örnek: Öğretmenler sinirden ölüyor

Belki de bu muzdarip öğretmenlerin çoğu veremden ölmüştür. Kim bilir...

Verem hastalığının tedavisinin ilk şartı temiz ve açık havanın ardından bol gıda ve üzüntüsüz bir hayattır. Dünyadaki her üç insandan birinin vücudunda, hastalık yapmaya hazır bir verem mikrobu mutlaka vardır. Eğer aşırı üzüntü veya aşırı dert çekerseniz, vücut direnciniz düşebilir ve bu mikrop, bağışıklık sisteminizi alt ederek hastalık yapabilir. Sanırım farkı anlayabilmişsinizdir; vücudunuzda verem mikrobunun bulunması demek, verem hastalığına yakalanacağınız anlamına gelmez. Yalnızca, vücut direnciniz düştüğünde endişe edin...

Verem hakkında sıkça sorulan sorular

Veremin belirtileri nelerdir?

Verem; halsizlik, iştahsızlık, kilo kaybı, ateş, gece terlemesi, öksürük (çoğu zaman kısık kısık ve hoş gibi görünen öksürük), balgam çıkarma ve bazen balgamda kan gelmesi gibi yakınmalarla kendini belli eder. Kişinin önceden verem geçirmiş olması veya ailede yakınları, arkadaşları arasında veremli ya da verem geçirmiş bir hastanın varlığı her zaman olmasa da çok sıklıkla söz konusudur. Teşhis için bir göğüs röntgeni, balgam vb örneklerde mikrobun araştırılması gerekir, Bazen de verem bir idrar yolu hastalığı veya eklem kemik iltihabı ya da ciltte yara şeklinde karşımıza çıkabilir.

Ben veremli miyim?

Öncelikle, doğru sorup-sormadığımıza bakalım;

1) Vücudumda verem mikrobu var mı?
2) Ben verem hastası mıyım?

...evet... Doğru anladınız. Vücudunuzda verem mikrobu olmasıyla, sizin bir verem hastası olmanız ayrı şeylerdir. Ülkemizde her üç kişiden birinin vücudunda verem mikrobu var. Fakat, bunlardan yalnızca bazıları verem hastalığına yakalanırlar. Ne zaman? Vücut dirençleri düştüğü zaman. Vücut dirençleri ne zaman düşecek bu insanların? AIDS olduklarında, alkol bağımlısı olduklarında, yetersiz veya yanlış beslendiklerinde, aşırı üşüdüklerinde vb.

"Verem hastalığının belirtilerini okudum. Bende bunlardan hiçbiri yok. O halde bende verem yok." demek yanlıştır. Bazen hastalık biraz ilerlemesine rağmen pek belirti vermeyebilir (yada siz farketmeyebilirsiniz). Bu durum, bünyeye ve bulaştığı organa bağlı olarak değişir. Hatta, bazı insanlarda (yani mikrobu taşımakta olan 1/3'lük kesimde) bu mikrop hiç hastalık yapmayacak. Ama kendinizi neden riske atasınız ki? Neden hastalığı yaşayacak olan 20,000 Türkten biri olasınız ki (her yıl en azından hasta sayısı)? Vücudunuzda bu mikrop varsa, onu öldürmek için (daha doğru bir ifadeyle; vücudunuzun bağışıklık sisteminin bu mikrobu öldürmesine yardımcı olmak için) Verem Savaş Dispanserlerinden birine gidin. Size severek yardım edeceklerdir. Vücudunuzda verem mikrobu olup olmadığını öğrenmek için de adresiniz yine Verem Savaş Dispanserleri. Sizi teşvik etmek için, size en yakın Verem Davaş Dispanserinin adresini söyleyebilmek isterdim ama şu anda bu mümkün değil. Zira (şimdi derin bir meseleye giriyorum); Bu bloğun başka bir yerinde daha bahsetmiştim sanırım; Türkiye Cumhuriyeti şu an itibariyle verem hastalığıyla mücadele konusunda başarısız ve yetersiz bir duruş sergiliyor (geçmişte çok büyük başarılara imza atıldı). Özellikle, bilgilendirme ve örgütlenme konusunda çok büyük eksiklikler var. Öyle ki; Türkiye'deki tüm Verem Savaş Dispanserlerinin listesini internette bulmak pek mümkün değil. Neden bulasınız ki? Zaten yakında hepsi kapatılacak (böyle bir duyum aldım. Umarım doğru değildir). Belki Google hâlâ açık olan VSD'lerin listesini bulabilir. Bir arama yaptırarak belli-başlı şehirlerdekileri bulabilirsiniz:

Verem Savaş Dispanserlerini ara

Bulaşıcı mıdır?

Evet. Hastalık yapabilen mikrop genellikle yine bir insandan bulaşır (Hasta sığırların sütlerinden bulaştığı da vâkidir. Fakat istisnadır). Ve hava yoluyla bulaşır. Verem hastası olmak için yapılması gerekenler:

1) Öncelikle bize bir verem hastası gerekiyor. Ama her verem hastası işimizi görmez. Mikrop bulaştıran bir tane lazım . Zira; her verem hastası mikrop bulaştırmaz (Bu yüzden, her verem hastasına cüzzamlı muamelesi yapmak yerine, bulaştırıcı olup olmadığını olup olmadığını sormak daha nezaketli bir davranış olabilir). Peki hangi özellikteki verem hastaları mikrop bulaştırır? En önemlisi, ciğer veremi olması gerekiyor (pulmoner tuberculosis [biraz yabancı kelime kullanayım da, kültürlü olduğumu zannedin. Tıpkı televizyonlarda olduğu gibi]). Gerçi; deri, kemik, eklem veremi olanların ki de bulaşabilir. Fakat, bu tür verem hastalarında ise, veremin yara yapmış olması ve sizin yaraya yakın temas edip vücudunuzun içine bir şkilde girmesini sağlamanız gerekir. Ciğer veremlisi bulduk. Ama, hâlâ bulaştırıcı olmayabilir. Amacımız mikrobu kapmak ya... Hastalık, veremi bulaştıracak derecede ilerlemeli veya en azından, mikrop ciğerde öyle konuşlanmış olmalı ki, bizim dayanıklı ciğerimiz (öyle dayanıklı veya azimlidir ki, yarısı "su toplamış" olmasına rağmen, sizi yaşatacak kadar iş çıkarabilir), ürettiği karbondioksitle birlikte dışarı mikrobu da salar hale gelmeli.
2) Mikrobu kapmamız gerekiyor. Hava yoluyla veya diğer gerekli yollarla mikrobun vücudumuza girmesini sağlamalıyız. Mikrop havadan da olsa kolay-kolay vücuda girmez. Bulaştırıcı özellikteki verem hastasıyla uzun süre aynı ortamda kalmak gerekir.
3) Mikrop vücutta kalmayı başarabilmeli. Vücudumuzun bağışıklık sistemi bazen bu mikrobu öldürür. Bitirir onu! Eğer öldüremiyorsa, bağışıklık sistemimiz bu mikropla nasıl dövüşeceğini bilmiyor demektir. Verem Savaş Dispanserlerinin ve BCG aşısının (yabancı gelmiyor değil mi?) yaptığı da tam olarak budur; bağışıklık sisteminize, bu mikrobun nasıl öldürüleceğini öğretir. Bu "öğrenme", yaklaşık 10 yıl boyunca %80 oranında etkili/başarılı olur.
4) Mikrop, vücudumuzu altedebilmeli. Yukarıda da izah edildiği gibi, vücudun direnci öyle düşmeli ki, mikrop bağışıklık sisteminizi altedebilmeli.

İşte bu kadar... Artık mikrop, üremeye/çoğalmaya başlar. Mikrobu yenemeyen organlar, en azından size belirti vermeye başlarlar (yukarıda izah edilen belirtiler). Size bir e-posta göndermelerini bekleyemeyiz. Eğer hasta bu belirtileri zamanında sezip hekim müdahelesi altına girmezse, hastalık çok fazla ilerleyebilir. Öyle ki; hasta, dünyadaki 3 milyon kişilik sessiz çoğunluk arasına bile girebilir ("Sessiz çoğunluk" tabiri tam da onlar içindir. Çünkü, onlar yaşamıyorlar). Her yıl milyonlarca insan verem hastalığına yakalanıyor. Ama oran itibariyle, bunlardan çok ama çok azı yaşamını yitiriyor. Hele ülkemiz gibi, teşhis ve tedavi imkanları bu kadar yeterli bir ülkede. Aslında çok daha az insanın ölmesi sağlanabilir. Ama bunun için devletin örgütlü hareket etmesi gerekmektedir. Gerekli teşvik, teşhis, tedavi ve bilinçlendirme çalışmaları, Dünya Sağlık Örgütü standartlarına göre uygulanmalı ve bu bir politika hline gelmeli. (Muhalefet partisi gibi konuşmaya başladım galiba.)

Nasıl korunur?

Hastalığa karşı koruyucu aşı çok önemlidir (BCG aşısı). Doğumunun birinci ayı ile ilkokul birinci sınıfta iki sefer uygulanması yeterlidir. Düzensiz yaşama, beslenme bozuklukları, alkol ve sigara gibi etkenlerde vücut direncini düşürerek bu hastalığın çıkmasına neden olmaktadır. Bu türlü, direnç düşürücü durumlara düşmekten kaçınılmalı.

Verem ile ilgili görüntüler

Mikroskoptaki görüntüsü

Verem mikrobu, bulaştığı organa, mikrobun türüne vb göre farklı görüntüler arz edebilir:

Verem basili renkli

Verem basili yakın renksiz

Verem basili ciğer dokusunda
Deri tahlili/testi




Verem Savaş Dispanserleri, vücudunuzda verem mikrobu olup olmadığını tespit etmek için, bir deri tahlili yöntemi kullanırlar. Deri altınıza bir aşı injekte edilir. 2-3 gün sonra gelmeniz istenir. Eğer bu aşı bölgesindeki kızarıklık/şişlik belirli bir genişlikten fazla ise, bedeninizin bir yerlerinde verem mikrobu olma ihtimali artmış demektir:



Emin olmak için, sizden bir de ciğer röntgen filmi isteyebilirler...

Röntgen

Verem teşhisinde kullanılan önemli tekniklerden biri de röntgendir...

Verem hastası bir hanımefendinin ciğer röntgeni:

Verem tedavisine başlamadan önce ciğer röntgeni

Üç çeşit ilaçla tedaviye başlandı. Bir ay sonra ciddi bir iyileşme sağlandı:

Verem tedavisine başladıktan bir ay sonra ciğer röntgeni

Bu ufak mikrobun büyük maharetleri
Hastalığı ilerlemiş bir verem hastasının sağ ciğerinin üst kısmından alınan bir parça aşağıdaki gibidir. Bu görüntü sizi rahatsız edebilir. Ama her sağlam insanın bakıp ibret alması gerekir. Görüntü

Çukurlara ve tahriş olmuş kısımlara bakın. Eğer ciğerinizin böyle olmasını istemiyorsanız, üstelik, bu sitede belirtilen verem belirtileri sizde de varsa (veya yakın geçmişte olmuşsa), en yakın Verem Savaş Dispanserine başvurun. Hattâ, belirti vermesini beklemenize gerek yok; en yakın Verem Savaş Dispanserine gidin ve cilt tahlili yaptırın. Zira, bazen ciğeri bu hale getirir, ama çok geç belirti vermeye başlar. Kormayın, neredeyse hiç para istemiyorlar. Zahmet edip gitmeniz onları sevindirecektir bile!

Diğer Yazılar