<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Gokhan Atil Oracle Blog</title>
	<atom:link href="http://www.gokhanatil.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.gokhanatil.com</link>
	<description>Oracle, Veriambarı, Apex ve Unix üzerine yazılar...</description>
	<lastBuildDate>Fri, 03 Sep 2010 14:08:34 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Oracle Berkeley DB Java Edition</title>
		<link>http://www.gokhanatil.com/2010/09/oracle-berkeley-db-java-edition/</link>
		<comments>http://www.gokhanatil.com/2010/09/oracle-berkeley-db-java-edition/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 14:08:34 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1751</guid>
		<description><![CDATA[Bu aralar NoSQL veritabanlarını inceliyorum. NoSQL veritabanları daha önceden duymamış olabilirsiniz, aslında uzun zamandır bir çok popüler projede kullanılıyorlar (örneğin facebook, digg, twitter, reddit). Bu veritabanlarının ortak özelliği ilişkisel yapıda olmamaları, SQL desteklememeleri ve genel olarak dağıtık mimari için tasarlanmış olmalarıdır. NoSQL veritabanlarından biri de Berkeley DB. Berkeley DB, adından da çağrışım yapılacağı üzere Berkeley üniversitesinde [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Bu aralar NoSQL veritabanlarını inceliyorum. NoSQL veritabanları daha önceden duymamış olabilirsiniz, aslında uzun zamandır bir çok popüler projede kullanılıyorlar (örneğin facebook, digg, twitter, reddit). Bu veritabanlarının ortak özelliği ilişkisel yapıda olmamaları, SQL desteklememeleri ve genel olarak dağıtık mimari için tasarlanmış olmalarıdır. NoSQL veritabanlarından biri de Berkeley DB. Berkeley DB, adından da çağrışım yapılacağı üzere Berkeley üniversitesinde ortaya çıkmış bir yazılım. Genel amaçlı embedded bir veritabanı olan Berkeley DB, transaction, hotbackup ve replikasyon desteğine sahip ve bir çok projenin alt yapısında kullanılmakta. Üreticisi Sleepcat Software&#8217;i 2006&#8242;da Oracle tarafından alındı ve şu an Oracle tarafından dağıtılan 3 sürümü var:</p>
<p>Berkeley DB<br />
Berkeley DB Java Edition<br />
Berkeley DB XML</p>
<p style="text-align: justify;">Ben bunlar arasında en kolay kullanabileceğim Berkeley DB Java Edition&#8217;ı test etmeye karar verdim. Berkeley DB Java Edition, 100% Java ile yazılmış, çok basit bir şekilde projenize eklenebiliyor ve Direct Persistence Layer (DPL) veya &#8220;temel API&#8221; ile kullanılabiliyor. Anahtar/Değer şeklinde verilerinizi kaydetmeyi sağlıyor. Yani Berkeley DB&#8217;de RDBMS&#8217;lerden alışa geldiğimiz tablo, kolon yapısı yok.  NoSQL veritabanlarında tablolar yerine genelde &#8220;kolleksiyonlar&#8221; olur ama Berkeley DB&#8217;de bu da yok :)</p>
<p>En basit şekilde özetlersek şu şekilde bilgi kaydetmenizi sağlıyor:</p>
<p>Key | Value<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
1   Gökhan<br />
2   Ahmet</p>
<p style="text-align: justify;">Bu basit yapısına rağmen, high avalibility için replikasyon desteği var, ayrıca hotbackup alınabiliyor. Pek çok NoSQL veritabanında dağıtık yapıda verim alınabilmesi açısından görmezden gelinen ACID ve transaction desteği var (opsiyonel olarak açıp, kapatabiliyorsunuz).</p>
<p><span id="more-1751"></span>Berkeley DB Java Edition için dökümanlar:</p>
<p><a href="http://www.oracle.com/technetwork/database/berkeleydb/documentation/index-160410.html" target="_blank">http://www.oracle.com/technetwork/database/berkeleydb/documentation/index-160410.html</a></p>
<p>Berkeley DB Java Edition&#8217;ı ve diğer sürümleri şu adresten indirebilirsiniz:</p>
<p><a href="http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html">http://www.oracle.com/technetwork/database/berkeleydb/downloads/index.html</a></p>
<p style="text-align: justify;">Buradan ilgili dosyayı indirip (je-x.x.x.tar.gz/zip), bir klasöre açtığınızda Berkeley DB&#8217;yi kullanmak için gerekli JAR kütüphanesine ve örnek Java kodlarına sahip oluyorsunuz. Bundan sonra yapmanız gereken, favori Java IDEniz aracılığıyla bir Java projesi oluşturup je-x.x.x.jar dosyasını projenize eklemek.  Berkeley DB ve diğer NoSQL veritabanları SQL desteklemediğinden, veritabanı üzerinde işlem yapabilmek için size sağlanan API kütüphanesini kullanıyorsunuz, ben bunun nasıl yapıldığını göstermek için Java ile &#8220;temel API&#8221; kullanan bir kaç örnek oluşturalım.</p>
<p style="text-align: justify;">Berkeley DB, veritabanı dosyalarını bir klasör içinde tutuyor. Veritabanını açmak için öncelikle bu klasörü bir &#8220;ortam&#8221;  (Environment) nesnesi olarak tanıtmamız gerekiyor:</p>
<blockquote><p>Environment vtOrtami = null;<br />
try {			EnvironmentConfig ortamKonfigurasyonu = new EnvironmentConfig();<br />
ortamKonfigurasyonu.setAllowCreate(true);<br />
vtOrtami = new Environment(new File(&#8220;/data/sampledb&#8221;), ortamKonfigurasyonu);<br />
} catch (DatabaseException dbe) {			System.out.println(&#8220;Berkeley DB ortam oluşturma hatası!&#8221;);		}</p></blockquote>
<p style="text-align: justify;">ortamKonfigurasyonu.setAllowCreate(true) sayesinde daha önce bu klasörde veritabanı tanımlanmadıysa otomatik olarak oluşturulmasını sağlıyoruz. Veritabanı ortamını oluşturduktan sonra, bu ortam içinde veritabanı açacağız:</p>
<blockquote><p>DatabaseConfig vtKonfigurasyonu = new DatabaseConfig();<br />
vtKonfigurasyonu.setTransactional(false);<br />
vtKonfigurasyonu.setAllowCreate(true);<br />
Database ornekVT = vtOrtami.openDatabase( null, &#8220;testDB&#8221;, vtKonfigurasyonu);</p></blockquote>
<p style="text-align: justify;">Fark ettiyseniz vtKonfigurasyonu.setTransactional(false) ile veritabanımızın transaction desteğini kapattım. Bir veritabanının transcation desteği olup olmadığını o veritabanını oluştururken belirliyorsunuz. Transaction desteği olan bir veritabanını transaction desteğini kapatarak açmanız veya tersi durum mümkün değil. Ortam olarak belirlediğimiz dizin boş olduğundan bu işlem sonrası transaction desteği olmayan &#8220;testDB&#8221; adında bir veritabanına sahip olacağız.</p>
<p>Bu oluşturduğumuz veritabanına kayıt eklemek için DatabaseEntry nesnelerinden faydalanıyoruz:</p>
<blockquote><p>DatabaseEntry anahtar = new DatabaseEntry();<br />
DatabaseEntry veri = new DatabaseEntry();</p>
<p>IntegerBinding.intToEntry( 1, anahtar);<br />
StringBinding.stringToEntry( &#8220;GÖKHAN ATIL&#8221;, veri);<br />
ornekVT.put(null, anahtar, veri);</p></blockquote>
<p style="text-align: justify;">Veritabanına kaydetmek istediğimiz anahtar ve değer (key/value) için DatabaseEntry nesneleri oluşturup Binding nesneleri aracılığı ile istediğimiz değer atamalarını yapıyor ve sonra &#8220;put&#8221; fonksiyonu ile veritabanına bu değerleri kaydediyoruz.</p>
<p>Berkeley DB, sequence yani sayaç nesnelerini destekliyor. Kayıtları yaparken key olarak sayaçtan aldığımız değerleri kullanabiliriz:</p>
<blockquote><p>SequenceConfig sayacKonfigurasyonu = new SequenceConfig();<br />
sayacKonfigurasyonu.setAllowCreate(true);<br />
StringBinding.stringToEntry(&#8220;ORNEK_SAYAC&#8221;, veri);<br />
Sequence sayac = ornekVT.openSequence(null, veri, sayacKonfigurasyonu);</p>
<p>IntegerBinding.intToEntry( (int)sayac.get(null, 1), anahtar);<br />
StringBinding.stringToEntry(&#8220;VALUE&#8221; + i, veri);<br />
ornekVT.put(null, anahtar, veri);</p></blockquote>
<p>Şimdi bütün bu yazdıklarımı birleştirip, belirlediğimiz klasör altında testDB adında veritabanı oluşturan ve buna 1 milyon kayıt giren örnek bir kod yazalım:</p>
<blockquote><p>import com.sleepycat.bind.tuple.*;<br />
import com.sleepycat.je.*;<br />
import java.io.File;</p>
<p>public class DBinsert {</p>
<p>public static void main(String[] args) {</p>
<p>Environment vtOrtami = null;</p>
<p>try {<br />
EnvironmentConfig ortamKonfigurasyonu = new EnvironmentConfig();<br />
ortamKonfigurasyonu.setAllowCreate(true);<br />
vtOrtami = new Environment(new File(&#8220;/data/sampledb&#8221;), ortamKonfigurasyonu);<br />
} catch (DatabaseException dbe) {<br />
System.out.println(&#8220;Berkeley DB ortam oluşturma hatası!&#8221;);<br />
}</p>
<p>DatabaseConfig vtKonfigurasyonu = new DatabaseConfig();<br />
vtKonfigurasyonu.setTransactional(false);<br />
vtKonfigurasyonu.setAllowCreate(true);<br />
Database ornekVT = vtOrtami.openDatabase( null, &#8220;testDB&#8221;, vtKonfigurasyonu);</p>
<p>DatabaseEntry anahtar = new DatabaseEntry();<br />
DatabaseEntry veri = new DatabaseEntry();</p>
<p>SequenceConfig sayacKonfigurasyonu = new SequenceConfig();<br />
sayacKonfigurasyonu.setAllowCreate(true);<br />
StringBinding.stringToEntry(&#8220;ORNEK_SAYAC&#8221;, veri);<br />
Sequence sayac = ornekVT.openSequence(null, veri, sayacKonfigurasyonu);</p>
<p>for( int i = 0; i &lt; 1000000; i++) {<br />
IntegerBinding.intToEntry( (int)sayac.get(null, 1), anahtar);<br />
StringBinding.stringToEntry(&#8220;VALUE&#8221; + i, veri);<br />
ornekVT.put(null, anahtar, veri);<br />
}</p>
<p>sayac.close();<br />
ornekVT.close();<br />
vtOrtami.close();<br />
}<br />
}</p></blockquote>
<p>Veritabanından kayıt çekmek için &#8220;get&#8221; fonksiyonunu kullanıyoruz. Bu yazdığımı veriler arasında rastgele arama yapalım:</p>
<blockquote><p>import com.sleepycat.bind.tuple.*;<br />
import com.sleepycat.je.*;<br />
import java.io.File;</p>
<p>public class DBselect {</p>
<p>public static void main(String[] args) {</p>
<p>Environment vtOrtami = null;</p>
<p>try {<br />
EnvironmentConfig ortamKonfigurasyonu = new EnvironmentConfig();<br />
ortamKonfigurasyonu.setAllowCreate(true);<br />
vtOrtami = new Environment(new File(&#8220;/data/sampledb&#8221;), ortamKonfigurasyonu);<br />
} catch (DatabaseException dbe) {<br />
System.out.println(&#8220;Berkeley DB ortam oluşturma hatası!&#8221;);<br />
}</p>
<p>DatabaseConfig vtKonfigurasyonu = new DatabaseConfig();<br />
vtKonfigurasyonu.setTransactional(false);<br />
vtKonfigurasyonu.setAllowCreate(true);<br />
Database ornekVT = vtOrtami.openDatabase( null, &#8220;testDB&#8221;, vtKonfigurasyonu);</p>
<p>DatabaseEntry anahtar = new DatabaseEntry();<br />
DatabaseEntry veri = new DatabaseEntry();</p>
<p>Random generator = new Random();</p>
<p>IntegerBinding.intToEntry( generator.nextInt(1000000) , anahtar);</p>
<p>if (<strong>ornekVT.get(null,anahtar, veri, null ) == OperationStatus.SUCCESS</strong>) {<br />
System.out.println(IntegerBinding.entryToInt(anahtar) + &#8221; : &#8221;<br />
+ StringBinding.entryToString(veri));<br />
}<br />
ornekVT.close();<br />
vtOrtami.close();<br />
}</p>
<p>}</p></blockquote>
<p style="text-align: justify;">Verileri update etmek için aynı key&#8217;e sahip bir kayıdı &#8220;put&#8221; ile tekrar kaydetmemiz yeterli oluyor. Bu işlem yeni kayıt eklemek yerine veriyi güncelleyecektir.</p>
<blockquote><p>Integer guncellenecekKayit = 3852301;</p>
<p>IntegerBinding.intToEntry( guncellenecekKayit , anahtar );<br />
StringBinding.stringToEntry(&#8220;GOKHAN&#8221;, veri);<br />
ornekVT.put( null, anahtar, veri );</p>
<p>if (ornekVT.get(null, anahtar, veri, null ) == OperationStatus.SUCCESS) {<br />
System.out.println(IntegerBinding.entryToInt(anahtar) + &#8221; : &#8221;<br />
+ StringBinding.entryToString(veri));<br />
} else System.out.println(&#8220;Kayıt bulunamadı&#8221; );<br />
Date bitisZamani = new Date();</p></blockquote>
<p>Her hangi bir kaydı silmek için delete fonksiyonunu kullanıyoruz:</p>
<blockquote><p>Integer silinecekKayit = 3852301;</p>
<p>IntegerBinding.intToEntry( silinecekKayit , anahtar );<br />
<strong>ornekVT.delete( null, anahtar );</strong></p>
<p>IntegerBinding.intToEntry( silinecekKayit , anahtar);</p>
<p>if (ornekVT.get( null, anahtar, veri, null ) == OperationStatus.SUCCESS) {<br />
System.out.println(IntegerBinding.entryToInt(anahtar) + &#8221; : &#8221;<br />
+ StringBinding.entryToString(veri));<br />
} else System.out.println(&#8220;Kayıt bulunamadı&#8221; );</p></blockquote>
<p style="text-align: justify;">Bu örneklerden sonra aklınıza muhemelen şu soru gelmiştir: Berkeley DB&#8217;deki Anahtar/veri (key/value) yapısı düşünüldüğünde, yani veritabanında sadece bir anahtar kolonu ve ona karşılık bir değer kolonu tutabildiğimize göre, diğer veritabanlarında olduğu gibi bir kayıt içerisinde birden fazla kolon nasıl tutulabilir?</p>
<p style="text-align: justify;">Bunu aşmak için oluşturduğunuz kayıt yapılarını (nesnelerinizi), tek bir değişkende toplamanız gerekir. DPL (Data Persistence Layer) bu işi çok kolaylaştırıyor. Temel API ile yolunuza devam etmek istiyorsanız, TupleInput ve TupleOutput nesnelerinden faydalanarak nesnelerinizi veritabanına yazılacak tek değişken haline getirebilirsiniz.  Bu işlemin nasıl yapıldığını göstermek için örnek bir uygulama yazalım.</p>
<p>İlk önce, saklayacağımız kayıt yapısını içeren bir nesne oluşturuyoruz (OrnekNesne.java):</p>
<blockquote><p>import com.sleepycat.bind.tuple.TupleBinding;<br />
import com.sleepycat.bind.tuple.TupleInput;<br />
import com.sleepycat.bind.tuple.TupleOutput;<br />
import com.sleepycat.je.DatabaseEntry;</p>
<p>public class OrnekNesne {</p>
<p>private String isim;<br />
private String email;<br />
private String telefon;</p>
<p>public OrnekNesne(String isim, String email, String telefon) {<br />
super();<br />
this.isim = isim;<br />
this.email = email;<br />
this.telefon = telefon;<br />
}</p>
<p>public OrnekNesne() {<br />
super();<br />
this.isim = &#8220;Joen Doe&#8221;;<br />
this.email = &#8220;N/A&#8221;;<br />
this.telefon = &#8220;N/A&#8221;;<br />
}</p>
<p>public void yazdir() {</p>
<p>System.out.println( &#8220;İsim&#8230;&#8230;: &#8221; + isim);<br />
System.out.println( &#8220;Email&#8230;..: &#8221; + email);<br />
System.out.println( &#8220;Telefon&#8230;: &#8221; + telefon);</p>
<p>}</p>
<p>public String getIsim() {<br />
return isim;<br />
}</p>
<p>public void setIsim(String isim) {<br />
this.isim = isim;<br />
}</p>
<p>public String getEmail() {<br />
return email;<br />
}</p>
<p>public void setEmail(String email) {<br />
this.email = email;<br />
}</p>
<p>public String getTelefon() {<br />
return telefon;<br />
}</p>
<p>public void setTelefon(String telefon) {<br />
this.telefon = telefon;<br />
}</p>
<p>public DatabaseEntry objectToEntry() {</p>
<p>TupleOutput output = new TupleOutput();<br />
DatabaseEntry entry = new DatabaseEntry();</p>
<p>output.writeString(getIsim());<br />
output.writeString(getEmail());<br />
output.writeString(getTelefon());</p>
<p>TupleBinding.outputToEntry( output, entry);</p>
<p>return entry;<br />
}</p>
<p>public void entryToObject( DatabaseEntry entry ) {</p>
<p>TupleInput input = TupleBinding.entryToInput(entry);</p>
<p>setIsim(input.readString());<br />
setEmail(input.readString());<br />
setTelefon(input.readString());</p>
<p>}</p>
<p>}</p></blockquote>
<p>Sonra bu örnek nesnemizi kullanacak kodları yazıyoruz:</p>
<blockquote><p>import com.sleepycat.bind.tuple.*;<br />
import com.sleepycat.je.*;<br />
import java.io.File;</p>
<p>public class DBinsertobject {</p>
<p>public static void main(String[] args) {</p>
<p>Environment vtOrtami = null;</p>
<p>try {<br />
EnvironmentConfig ortamKonfigurasyonu = new EnvironmentConfig();<br />
ortamKonfigurasyonu.setAllowCreate(true);<br />
vtOrtami = new Environment(new File(&#8220;/data/sampledb&#8221;),<br />
ortamKonfigurasyonu);<br />
} catch (DatabaseException dbe) {<br />
System.out.println(&#8220;Berkeley DB ortam oluşturma hatası!&#8221;);<br />
}</p>
<p>DatabaseConfig vtKonfigurasyonu = new DatabaseConfig();<br />
vtKonfigurasyonu.setTransactional(false);<br />
vtKonfigurasyonu.setAllowCreate(true);<br />
Database ornekVT = vtOrtami.openDatabase(null, &#8220;nesneDB&#8221;,<br />
vtKonfigurasyonu);</p>
<p>DatabaseEntry anahtar = new DatabaseEntry();<br />
DatabaseEntry veri = new DatabaseEntry();</p>
<p>IntegerBinding.intToEntry(1, anahtar);<br />
OrnekNesne gokhanAtil = new OrnekNesne(&#8220;Gökhan Atıl&#8221;, &#8220;gokhan at gokhanatil.com&#8221;, &#8220;4444444&#8243;);<br />
ornekVT.put(null, anahtar, gokhanAtil.objectToEntry() );</p>
<p>IntegerBinding.intToEntry(2, anahtar);<br />
OrnekNesne aliCengiz = new OrnekNesne(&#8220;Ali Cengiz&#8221;, &#8220;ali at cengiz.com&#8221;, &#8220;5555555&#8243;);<br />
ornekVT.put(null, anahtar, aliCengiz.objectToEntry() );</p>
<p>IntegerBinding.intToEntry(3, anahtar);<br />
OrnekNesne hakanBalta = new OrnekNesne(&#8220;Hakan Balta&#8221;, &#8220;hakan at balta.com&#8221;, &#8220;6666666&#8243;);<br />
ornekVT.put(null, anahtar, hakanBalta.objectToEntry() );</p>
<p>IntegerBinding.intToEntry(1, anahtar);<br />
ornekVT.get(null, anahtar, veri, null );</p>
<p>OrnekNesne yeniMusteri = new OrnekNesne();<br />
yeniMusteri.entryToObject(veri);<br />
yeniMusteri.yazdir();</p>
<p>ornekVT.close();<br />
vtOrtami.close();</p>
<p>}<br />
}</p></blockquote>
<p style="text-align: justify;">Berkeley DB, hızlı ve sağlam yapısı ile projelerinizde kullanmayı düşünebileceğiniz bir veritabanı. Dual lisans ile geliyor. Eğer açık kaynak kodlu yazılım üretiyosanız, ücretsiz olarak bu veritabanını projenize dahil edebilirsiniz. Veritabanına erişmek için yazdığım nesneler bu işin en uygun nesneler olmayabilir, ben açıkçası Berkeley DB nasıl kullanılıyor sorusuna cevap aradığımdan nesneleri modellerken çok titiz davranmadım. Buna karşın bu dökümanın Berkeley DB ile uğraşmak isteyenlere için faydalı olacağını düşünüyorum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/09/oracle-berkeley-db-java-edition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu, Oracle XE ve SQL Developer</title>
		<link>http://www.gokhanatil.com/2010/09/ubuntu-oracle-xe-ve-sql-developer/</link>
		<comments>http://www.gokhanatil.com/2010/09/ubuntu-oracle-xe-ve-sql-developer/#comments</comments>
		<pubDate>Wed, 01 Sep 2010 09:44:03 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[APEX]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[sql developer]]></category>
		<category><![CDATA[toad]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1705</guid>
		<description><![CDATA[Ubuntu üzerine Oracle XE kurup onda çalışma yaptığımı daha önce yazmıştım. Karşılaştığım bir iki sorunla ilgili olarak bulduğum çözümleri paylaşmak istedim. Oracle XE yüklenince, XWindows ana paneline gerekli menüleri ekliyor, ama &#8220;Start Database&#8221; dediğinizde veritabanı açılmasına rağmen listener açılmıyordu. Terminal penceresi açıp listener&#8217;ı manuel olarak başlatmaya çalışınca hatayı gördüm: Listener programı listener.log dosyasına yazamıyordu. Dosyanın [...]]]></description>
			<content:encoded><![CDATA[<p>Ubuntu üzerine Oracle XE kurup onda çalışma yaptığımı daha önce yazmıştım. Karşılaştığım bir iki sorunla ilgili olarak bulduğum çözümleri paylaşmak istedim.</p>
<p style="text-align: justify;">Oracle XE yüklenince, XWindows ana paneline gerekli menüleri ekliyor, ama &#8220;Start Database&#8221; dediğinizde veritabanı açılmasına rağmen listener açılmıyordu. Terminal penceresi açıp listener&#8217;ı manuel olarak başlatmaya çalışınca hatayı gördüm:</p>
<p><a href="http://www.gokhanatil.com/wp-content/uploads/2010/08/lsnrhatasi.png"><img class="aligncenter size-medium wp-image-1724" title="Listener'da alınan hata" src="http://www.gokhanatil.com/wp-content/uploads/2010/08/lsnrhatasi-300x134.png" alt="" width="300" height="134" /></a></p>
<p>Listener programı listener.log dosyasına yazamıyordu. Dosyanın yetkilerini kontrol edince sadece oracle kullanıcısının yazma yetkisi olduğunu gördüm. Kendi kullanıcımı hali hazırda DBA grubuna atamış olduğumdan, root oldum ve dba grubuna yazma yetkisi verdim:</p>
<blockquote><p># chmod g+w /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/network/log/listener.log</p></blockquote>
<p style="text-align: justify;"><span id="more-1705"></span>Bu işlemden sonra listener yetki hatası vermedi ama IPC ile ilgili hata vermeye başladı :) Google&#8217;da yaptığım araştırmada net bir cevap bulamasam da /var/tmp/.oracle ile ilgili bir sorundan bahsedildiğini gördüm.  Bu dizinde her kullanıcının yazma hakkına olmasına rağmen listener nedense benim kullanıcım altında çalışınca bu dizine erişmek istemiyordu. XE&#8217;yi sadece ben çalıştıracağım için o dizinin sahibini değiştirdim:</p>
<blockquote><p># chown gokhan /var/tmp/.oracle</p></blockquote>
<p>Bu işlemden sonra listener&#8217;ı kendi kullanıcım ile çalıştırabildim ve menüden veritabanı açılıp katapılabilir hale geldi. Ana paneldeki Oracle&#8217;ın menülerini incelerken &#8220;run SQL command line&#8221; ile açılan sqlplus penceresinde hata alındığını fark ettim:</p>
<p><a href="http://www.gokhanatil.com/wp-content/uploads/2010/08/sqlplushatasi.png"><img class="aligncenter size-medium wp-image-1731" title="SQL+'da alınan hata" src="http://www.gokhanatil.com/wp-content/uploads/2010/08/sqlplushatasi-300x115.png" alt="" width="300" height="115" /></a></p>
<p>Menünün çalıştırdığı scripti buldum ve inceledim, script içinde NLS_LANG değişkenini belirlemek için bir başka script çalıştırılmaya çalışılıyordu. İlgili satırların başına diyez ekleyip kodları devre dışı bıraktım ve bu hata da ortadan kalktı:</p>
<blockquote><p>$ vi /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/config/scripts/sqlplus.sh</p></blockquote>
<p>Diyez eklenecek satırlar (ben eklenmiş halini yazdım):</p>
<blockquote><p>#NLS_LANG=`$ORACLE_HOME/bin/nls_lang.sh`<br />
#export NLS_LANG</p></blockquote>
<p style="text-align: justify;">SQL Plus ile çalışmayı seviyorum ama sorgu sonuçlarını daha rahat inceleyebilmek, yazdığım sorguyu formatlamak gibi işler için grafik arayüzlü bir araca ihtiyaç duyuyorum. Linux altında wine ile TOAD kullanmak mümkün ama TOAD insanı &#8220;hazıra&#8221; alıştırdığından,  ben Oracle SQL Developer kullanmak istedim. Zip dosyasını indirip uygun bir klasöre açtıktan sonra Java ile yazılmış olan SQL Developer sorunsuz çalıştı. Üst panele SQL Developer için bir &#8220;launcher&#8221; oluşturdum ama çalıştırdığımda &#8220;ocijdbc11&#8243; dosyasının kayıp olduğu ile ilgili bir hata aldım. Buna rağmen program açıldı ama TNS bağlantısı yapmama izin vermedi. Bir kaç dakikalık google aramasından sonra bu konuyla ilgili çözümü buldum: SQL Developer, Oracle&#8217;ı kurduğum dizini göremiyordu. Yani ORACLE_HOME değişkeni tanımlanmamıştı. Ben bash için bu tanımlamayı hali hazırda yapmıştım ama launcher ile çalıştırınca &#8220;terminal&#8221; açmadan çalıştırdığımdan bu değişkeni okuyamıyordu. Hemen sqldeveloper.sh dosyasını açtım ve içinde Oracle XE&#8217;nin HOME dizinini tanımladım:</p>
<blockquote><p>$ vi /home/gokhan/sqldeveloper/sqldeveloper.sh</p>
<p>export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server</p></blockquote>
<p style="text-align: justify;">Böylece SQL Developer, &#8220;start&#8221; menüsünden sorunsuzca çalışmaya başladı. Herşeyi tekrar test ettim, sorunsuz çalışıyordu. &#8220;Go To Database Home Page&#8221; menüsüne tıklayıp APEX sayfasını açtığımda sayfanın Firefox ile açıldığını fark ettim. Firefox&#8217;un son sürümleri hem Ubuntu hem Windows altında çok yavaş çalışıyor. Bir süre sonra memory kullanımı inanılmaz artıyor. Bu yüzden bilgisayarımda Google Chrome kullanmaya başladım. Google Chrome, varsayılan tarayıcım olarak seçilmiş olmasına rağmen &#8220;Go To Database Home Page&#8221; hala firefox ile APEX&#8217;e bağlanıyordu. Bunu da değiştirmek istedim. Menünün çalıştırdığı scripte baktım:</p>
<blockquote><p>$ vi /usr/lib/oracle/xe/app/oracle/product/10.2.0/server/config/scripts/DatabaseHomePage.sh</p></blockquote>
<p>Bu dosyada tarayıcıların listesi var, basit bir döngü ile bu tarayıcıları kontrol edip, ilk bulduğunu çalıştırarak sayfaya bağlanıyor:</p>
<blockquote><p>#!/bin/sh<br />
for i in<strong> google-chrome</strong> firefox mozilla konqueror ; do<br />
if test -x &#8220;/usr/bin/$i&#8221;; then<br />
/usr/bin/$i http://127.0.0.1:8080/apex<br />
exit $?<br />
fi<br />
done</p></blockquote>
<p>Bu listeye google-chrome&#8217;u ekleyince &#8220;Go To Database Home Page&#8221; menüsü APEX&#8217;e Google Chrome ile bağlanmaya başladı.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/09/ubuntu-oracle-xe-ve-sql-developer/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle 8i ve ORA-00257: archiver error</title>
		<link>http://www.gokhanatil.com/2010/08/oracle-8i-ve-ora-00257-archiver-error/</link>
		<comments>http://www.gokhanatil.com/2010/08/oracle-8i-ve-ora-00257-archiver-error/#comments</comments>
		<pubDate>Thu, 26 Aug 2010 09:27:04 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[log_archive_dest]]></category>
		<category><![CDATA[ORA-00257]]></category>
		<category><![CDATA[ORA-16019]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1723</guid>
		<description><![CDATA[Legacy sunucularımızdan birinin bağlantı yapılmak istendiğinde ORA-00257 hatası verdiğini fark ettim. Üzerinde Oracle 8i koşan sunucunun disklerinde yeterince boş alan olmasına rağmen archiever çalışmıyordu. Oracle 8i&#8217;de, db_recovery_file_dest_size parametresi de yok, bu tip bir sınırlama olmadığı halde ve diskler boşken bu hatanın alınmaması gerekirdi. Alert logları inceleyince şu hatayı gördüm: ARC0: Beginning to archive log# 2 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Legacy sunucularımızdan birinin bağlantı yapılmak istendiğinde ORA-00257 hatası verdiğini fark ettim. Üzerinde Oracle 8i koşan sunucunun disklerinde yeterince boş alan olmasına rağmen archiever çalışmıyordu. Oracle 8i&#8217;de, db_recovery_file_dest_size parametresi de yok, bu tip bir sınırlama olmadığı halde ve diskler boşken bu hatanın alınmaması gerekirdi. Alert logları inceleyince şu hatayı gördüm:</p>
<blockquote><p>ARC0: Beginning to archive log# 2 seq# 85055<br />
ARC0: Failed to archive log# 2 seq# 85055<br />
Wed Aug 25 10:43:21 2010<br />
Wed Aug 25 10:43:10 2010<br />
ARC0: Beginning to archive log# 1 seq# 85051<br />
ARC0: Archiving not possible: No primary destinations<br />
ARC0: Failed to archive log# 1 seq# 85051</p></blockquote>
<p style="text-align: justify;"><span id="more-1723"></span>log_archive_dest parametrelerini inceledim. log_archive_dest tanımlanmamıştı ama log_archive_dest_1 tanımlıydı. &#8220;No primary destinations&#8221; uyarısından yola çıkıp log_archive_dest&#8217;i set etmek istediğimde ORA-16019 hatası aldım (log_archive_dest_1 tanımlı olduğundan log_archive_dest&#8217;i değiştirmeme izin vermedi). Bu yüzden önce log_archive_dest_1&#8242;i etkisizleştirip tekrar log_archive_dest&#8217;i set ettim ve log&#8217;ları switch etmeye çalıştım:</p>
<blockquote><p>SQL&gt; ALTER SYSTEM SET log_archive_dest_state_1=DEFER;<br />
SQL&gt; ALTER SYSTEM SET log_archive_dest=&#8217;/oraarch/oracle/MHSB/arch&#8217;;<br />
SQL&gt; ALTER SYSTEM SWITCH LOGFILE;</p></blockquote>
<p>Bundan sonra archiver düzeldi ve sistem çalışmaya başladı:</p>
<blockquote><p>Wed Aug 25 10:44:29 2010<br />
Thread 1 advanced to log sequence 85058<br />
Current log# 2 seq# 85058 mem# 0: /oradata5/MHSB/redo02.log<br />
Wed Aug 25 10:44:29 2010<br />
ARC1: Beginning to archive log# 1 seq# 85057<br />
Wed Aug 25 10:44:36 2010<br />
Thread 1 advanced to log sequence 85059<br />
Current log# 3 seq# 85059 mem# 0: /oradata5/MHSB/redo03.log</p></blockquote>
<p style="text-align: justify;">Anlaşılan şu ki, Oracle&#8217;ın daha üst sürümlerinde diskte yer açıldığında archiver otomatik olarak işine devam ederken, Oracle 8&#8242;de veritabanını dürtmek gerekiyor.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/08/oracle-8i-ve-ora-00257-archiver-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oracle, Google, Adobe, OpenSolaris ve Java üzerine</title>
		<link>http://www.gokhanatil.com/2010/08/oracle-google-adobe-opensolaris-ve-java-uzerine/</link>
		<comments>http://www.gokhanatil.com/2010/08/oracle-google-adobe-opensolaris-ve-java-uzerine/#comments</comments>
		<pubDate>Wed, 25 Aug 2010 14:11:36 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[adobe]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[opensolaris]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1745</guid>
		<description><![CDATA[Bir Oracle DBA gözüyle son günlerde Oracle ile ilgili yayınlanan haber başlıklarına hızlıca bir göz atmak ve kendimce yorumlamak istedim. Gündemdeki en önemli konu elbetteki Oracle ile Google arasında açılmış olan dava. Oracle&#8217;ın açtığı dava hakkında zaten bir yazı yazmıştım. Dava hakkında taraflardan açıklamalar gelmiş. Google, Oracle&#8217;ı Java topluluğuna ve açık kaynak destekçilerine havale ediyor: [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Bir Oracle DBA gözüyle son günlerde Oracle ile ilgili yayınlanan haber başlıklarına hızlıca bir göz atmak ve kendimce yorumlamak istedim. Gündemdeki en önemli konu elbetteki Oracle ile Google arasında açılmış olan dava. Oracle&#8217;ın açtığı dava hakkında zaten bir <a href="http://www.gokhanatil.com/2010/08/oracle-googlei-dava-ediyor/" target="_blank">yazı</a> yazmıştım. Dava hakkında taraflardan açıklamalar gelmiş. Google, Oracle&#8217;ı Java topluluğuna ve açık kaynak destekçilerine havale ediyor:</p>
<p><a href="http://www.theregister.co.uk/2010/08/16/google_oracle_android_lawsuit/" target="_blank">http://www.theregister.co.uk/2010/08/16/google_oracle_android_lawsuit/</a></p>
<p style="text-align: justify;">Google bu davayı, Oracle&#8217;ın açık kaynak topluluğu ve Java geliştiricilerine karşı açtığı bir dava olarak göstermek istiyor. Google gibi bir dünya devinin hukuksal mücadeleyi bir yana bırakıp hedef saptırmasını anlamakta zorluk çekiyorum. Dava için öne sürülen savlar çok kuvvetli olduğu için Google mahkemede kaybedeceği davayı, toplumun gözünde kazanmaya çalışıyor olabilir mi? Google bu manevralar ile ne  elde etmeyi umuyor? Haklıysan milyon dolarlık avukat ordunla zaten bu savaşı kazanırsın neden açık kaynak topluluğundan destek bekliyorsun? SMS ile mesaj atıp sana $5 avukat parası mı vereceğiz?</p>
<p><span id="more-1745"></span>&#8220;Java&#8217;nın Babası&#8221; James Gosling, bu davanın açılacağını ben zaten biliyordum ama bu davadan sonuç çıkmaz demiş:</p>
<p><a href="http://www.theregister.co.uk/2010/08/17/golsing_on_sun_goofy_patent_contestas/" target="_blank">http://www.theregister.co.uk/2010/08/17/golsing_on_sun_goofy_patent_contestas/</a></p>
<p>James Gosling, telif haklarından ne kadar anlıyor bilmiyorum, ama bir başka söyleminde Andorid platformunun Java&#8217;nın &#8220;platform bağımsız&#8221; karşı olmasına önemli bir darbe vurduğunu söylemiş:</p>
<p><a href="http://www.theregister.co.uk/2010/08/17/oracle_google_javafx_dalvik_goslin/" target="_blank">http://www.theregister.co.uk/2010/08/17/oracle_google_javafx_dalvik_goslin/</a></p>
<p style="text-align: justify;">Zaten davanın asıl çıkış noktası Android&#8217;in J2ME standartlarına uymaması değil mi? Patent ihlalleri bahanesiyle yapılmak istenen Android&#8217;in J2ME uyumsuz &#8220;java platformunun&#8221; popülerleşmesini önlemek. Gosling, Sun&#8217;ın mobil cihazlar için &#8220;platform bağımsız&#8221; olmasını başaramadığından yakınırken, bir yandan da Oracle&#8217;ın açtığı davaya &#8220;temeli yok&#8221;, ancak &#8220;gülünebilir&#8221; diyor.</p>
<p style="text-align: justify;">Dün yayınlanan bir başka haberde Adobe&#8217;un &#8220;açık kaynak ve standartlar&#8221; direktörü David McAllister&#8217;ın Oracle&#8217;a yaptığı suçlama var. &#8220;Oracle, açık kaynağı nakit ineği (cash cow) olarak görüyor, açık kaynağa karşı yeni bir cephe oluşturuyor&#8221; demiş:</p>
<p><a href="http://www.theregister.co.uk/2010/08/24/adobe_oracle_axis_of_evil/" target="_blank">http://www.theregister.co.uk/2010/08/24/adobe_oracle_axis_of_evil/</a></p>
<p style="text-align: justify;">Ne güzel bir sözümüz var: Dinime küfreden müslüman olsa! Bu adam Adobe&#8217;un ne kadar yetkili bir ağzıdır bilmiyorum ama sormazlar mı adama, sen açık kaynak için ne yaptın diye? Flash veya Photoshop&#8217;un kaynaklarını mı açtın? Hadi kaynak kodlarını açmak zor geldi, Flash (player değil) veya Photshop&#8217;un açık kaynaklı her hangi bir sistemde çalışacak versiyonunu mu çıkardın? Bu gün masaüstünde Linux kullanımını engelleyen faktörlerden biri, Adobe&#8217;un yazılımlarının Linux işletim sisteminde çalışmaması değil mi? Mac&#8217;lere verdiğin desteği Linux&#8217;a verseydin acaba Linux şu an hangi durumda olurdu?</p>
<p>Gözüme çarpan son haber &#8220;OpenSolaris projesinin sonlandırıldığı&#8221; ile ilgili oldu:</p>
<p><a href="http://www.theregister.co.uk/2010/08/13/opensolaris_is_dead/" target="_blank">http://www.theregister.co.uk/2010/08/13/opensolaris_is_dead/</a><br />
<a href="http://www.theregister.co.uk/2010/08/23/opensolaris_board_dead/" target="_blank">http://www.theregister.co.uk/2010/08/23/opensolaris_board_dead/</a></p>
<p style="text-align: justify;">OpenSolaris projesi ile çok içli dışlı değildim ama yine de bu projenin sonlanmasını istemezdim. Solaris 11 ile birlikte openSolaris yerine Solaris 11 Express çıkacakmış. Bu olay sadece isim değiştirilmesi ile ilgili değil. Ayrıca Solaris Express sürümleri, Solaris&#8217;in kurumsal sürümü piyasaya sürüldükten sonra dağıtılmaya başlanacakmış. Yani şu an olduğu gibi en son gelişmeleri, openSolaris değil Solaris içerecek. Ayrıca anladığım kadarıyla artık Solaris kodlarının tamamı açık olarak yayınlanmayacak.</p>
<p style="text-align: justify;">Oracle&#8217;ın Solaris&#8217;i ana işletim sistemi olarak benimseyeceğini ve sahip çıkacağını düşünüyordum ama bunu kıskanç bir koca tarzında yapacağını düşünmemiştim. Bu kararının Google&#8217;a açtığı dava ile aynı zamana getirmesini, hele ki Google, Oracle&#8217;ı açık kaynak düşmanı olarak göstermeye çalışırken yapmasını stratejik bir hata olarak görüyorum.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/08/oracle-google-adobe-opensolaris-ve-java-uzerine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Veritabanı hesabını kim kilitliyor?</title>
		<link>http://www.gokhanatil.com/2010/08/veritabani-hesabini-kim-kilitliyor/</link>
		<comments>http://www.gokhanatil.com/2010/08/veritabani-hesabini-kim-kilitliyor/#comments</comments>
		<pubDate>Mon, 23 Aug 2010 12:08:32 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[auditing]]></category>
		<category><![CDATA[hatalı şifre]]></category>
		<category><![CDATA[login]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1687</guid>
		<description><![CDATA[Ceviz.net Veritabanı ve SQL bölümünde sorulan bir soru: Arada bir oracle de hatalı girişten oracle hesabı kilitlenmesi yaşıyorum hatalı girişi yapan makınanın ip adresini bulmam gerekiyor bu bilgiye nasıl ulasabilirim? Oracle kullanıcısının şifresi değiştirildiğinde sıklıkla karşılaşılan durumlardan biri. Muhtemelen eski kullanıcı şifresi ile veritabanına bağlanmaya çalışan bir istemci var ve bu yanlış şifre denemeleri hesabın [...]]]></description>
			<content:encoded><![CDATA[<p>Ceviz.net Veritabanı ve SQL bölümünde sorulan bir soru:</p>
<p><em>Arada bir oracle de hatalı girişten oracle hesabı kilitlenmesi yaşıyorum hatalı girişi yapan makınanın ip adresini bulmam gerekiyor bu bilgiye nasıl ulasabilirim? </em></p>
<p style="text-align: justify;">Oracle kullanıcısının şifresi değiştirildiğinde sıklıkla karşılaşılan durumlardan biri. Muhtemelen eski kullanıcı şifresi ile veritabanına bağlanmaya çalışan bir istemci var ve bu yanlış şifre denemeleri hesabın kilitlenmesine yol açıyor. Hesabın kilitlenmesini önlemek için kullanıcının ait olduğu profile ait FAILED_LOGIN_ATTEMPTS parametresini UNLIMITED olarak değiştirebilirsiniz:</p>
<blockquote><p>SQL&gt; ALTER PROFILE <strong>profil_adi</strong> LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;</p></blockquote>
<p><span id="more-1687"></span>Ama bu yöntem, veritabanı hesabını brute force şifre saldırılarına açık hale getireceğinden ciddi bir güvenlik açığına sebep olacaktır. Bunun yerine hatalı şifrenin girildiği istemciyi tespit edebiliriz. Öncelikle oturum açma girişimlerini audit ediyoruz:</p>
<blockquote><p>SQL&gt; AUDIT CREATE SESSION BY <strong>kullanici_adi</strong> WHENEVER NOT SUCCESSFUL;</p></blockquote>
<p style="text-align: justify;">WHENEVER NOT SUCCESSFUL parametresini kullanmazsak, kullanıcıya ait tüm oturum açma girişimleri, başarılı olsa da olmasa da  loglanacaktır. Şu an amacımızın sadece hatalı şifre giren istemciyi bulmak olduğunu varsayarak ben bu parametreyi yazdım.  Bu komutu çalıştırıp audit işlemini tanımladıktan sonra, ister ara ara, istersek bir sonraki hesap kilitlenmesinde şuna benzer bir sorgu ile ilgili kullanıcının oturum açma girişimleri hakkında bilgi alabiliriz:</p>
<blockquote><p>SQL&gt; SELECT os_username, userhost, terminal, extended_timestamp<br />
FROM dba_audit_session<br />
WHERE username = &#8216;<strong>kullanici_adi</strong>&#8216;<br />
ORDER BY extended_timestamp DESC;</p></blockquote>
<p>Audit işlemini sonlandırmak isterseniz şu komutu çalıştırabilirsiniz:</p>
<blockquote><p>SQL&gt; NOAUDIT CREATE SESSION BY <strong>kullanici_adi</strong>;</p></blockquote>
<p>Audit komutlarının çalışabilmesi için veritabanında AUDITING  özelliğinin aktif olması gerekir. Aktif olup olmadığını şu şekilde kontrol edebilirsiniz:</p>
<blockquote><p>SQL&gt; SELECT value FROM v$parameter WHERE name = &#8216;audit_trail&#8217;</p></blockquote>
<p>Eğer bu sorgunun sonucunda NONE dönmüyorsa auditing aktif durumdadır.  Sorgu NONE dönüyorsa, auditing&#8217;i aktif hale getirmek için veritabanınıza SYS olarak bağlanıp, audit_trail parametresini değiştirmeniz ve veritabanını restart etmeniz gerekir:</p>
<blockquote><p>SQL&gt; ALTER SYSTEM SET AUDIT_TRAIL=db SCOPE=spfile;<br />
SQL&gt; SHUTDOWN IMMEDIATE<br />
SQL&gt; STARTUP</p></blockquote>
<p>Auditing özelliği ile ilgili daha fazla bilgiyi Oracle dökümanlarında bulabilirsiniz:</p>
<p><a href="http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/cfgaudit.htm" target="_blank">http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/cfgaudit.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/08/veritabani-hesabini-kim-kilitliyor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>APEX 4.0 ve Yenilikler</title>
		<link>http://www.gokhanatil.com/2010/08/apex-4-0-ve-yenilikler/</link>
		<comments>http://www.gokhanatil.com/2010/08/apex-4-0-ve-yenilikler/#comments</comments>
		<pubDate>Sat, 21 Aug 2010 17:41:02 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[APEX]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[APEX 4]]></category>
		<category><![CDATA[RESTful]]></category>
		<category><![CDATA[websheet]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1681</guid>
		<description><![CDATA[APEX 4.0 çıkalı 2 ay oldu ama bu yeni sürüm üzerine yazı yazmaya ancak vakit bulabildim. Aslında APEX 4 üzerinde bir süredir test yapıyordum çünkü Oracle&#8217;ın apex.oracle.com sitesinde deneme hesabına sahibim. Buna karşın, APEX 4&#8242;ü bilgisayarıma kurmadan, sadece kısa süreli yaptığım online testlerle üzerine bir şeyler yazmak istemedim. Kurulum tahmin edeceğiniz gibi önceki sürümle aynı. [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">APEX 4.0 çıkalı 2 ay oldu ama bu yeni sürüm üzerine yazı yazmaya ancak vakit bulabildim. Aslında APEX 4 üzerinde bir süredir test yapıyordum çünkü Oracle&#8217;ın apex.oracle.com sitesinde deneme hesabına sahibim. Buna karşın, APEX 4&#8242;ü bilgisayarıma kurmadan, sadece kısa süreli yaptığım online testlerle üzerine bir şeyler yazmak istemedim. Kurulum tahmin edeceğiniz gibi önceki sürümle aynı. Ubuntu&#8217;ya APEX kurulumunu anlattığım yazıdaki önergeleri takip ederek rahatlıkla kurulumu yapabilirsiniz:</p>
<p><a href="http://www.gokhanatil.com/2010/05/ubuntuya-oracle-xe-ve-apex-yuklemek/" target="_blank">http://www.gokhanatil.com/2010/05/ubuntuya-oracle-xe-ve-apex-yuklemek/</a></p>
<p><a href="http://www.gokhanatil.com/wp-content/uploads/2010/08/apex4-1.png"><img class="aligncenter size-medium wp-image-1694" title="APEX Giriş Ekranı" src="http://www.gokhanatil.com/wp-content/uploads/2010/08/apex4-1-300x200.png" alt="" width="300" height="200" /></a></p>
<p>Giriş sayfasının ekran görüntüsünden anlaşılacağı üzere APEX, web 2.0 ile gelen tasarım şablonlarına adepte olmuş bu yüzden daha modern görünüşlü uygulamalar geliştirebileceğiz.</p>
<p><span id="more-1681"></span>Yeni APEX&#8217;te neler var onlara bir bakalım.</p>
<ul>
<li>Team Development: APEX&#8217;e entegre team development desteği gelmiş. Team development özelliği sayesinde, ekip içi görevlendirme yapılabiliyor, &#8220;yappılacaklar&#8221;, &#8220;özellikler/features&#8221; listeleri oluşturulabiliyor, hata bildirimlerini ve geri beslemeleri APEX içinden yönetilebiliyorsunuz.</li>
<li>AJAX ile güçlendirilmiş Dinamik Aksiyonlar: AJAX sayesinde formları işleme, girilen değerleri doğrulama ve benzeri işlemleri JScript kodu yazmadan yapılabiliyorsunuz.</li>
<li>Websheet: Websheeti boş bir APEX uygulamasına benzetebilirsiniz. Kullanıcılarınıza yetki vererek onların websheet üzerinden raporlar oluşturmasını, Open Office Calc, MS Excel veya diğer elektronik çizelgelerden kopyala/yapıştır ile verinin uygulamaya aktarılıp bu verilerin paylaşılmasını sağlayabilirsiniz.</li>
<li>RESTful Web Servisleri Desteği: Hiç kod yazmadan, basit bir arayüz ile RESTful web servislerini kullanabiliyorsunuz.</li>
</ul>
<p><a href="http://www.gokhanatil.com/wp-content/uploads/2010/08/apex4-2.png"><img class="aligncenter size-medium wp-image-1696" title="APEX Yazılım Geliştirme Arayüzü" src="http://www.gokhanatil.com/wp-content/uploads/2010/08/apex4-2-300x132.png" alt="" width="300" height="132" /></a></p>
<p>APEX&#8217;in hem yeni özelliklerini hem de yeni temalarını ve arayüzünü çok beğendim. En kısa zamanda indirip kullanmanızı tavsiye ederim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/08/apex-4-0-ve-yenilikler/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Oracle kullanıcıları için FriendFeed Grubu</title>
		<link>http://www.gokhanatil.com/2010/08/oracle-kullanicilari-icin-friendfeed-grubu/</link>
		<comments>http://www.gokhanatil.com/2010/08/oracle-kullanicilari-icin-friendfeed-grubu/#comments</comments>
		<pubDate>Thu, 19 Aug 2010 11:16:52 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[Genel]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1668</guid>
		<description><![CDATA[Bir kaç gündür Friendfeed&#8217;i aktif olarak kullanmaya başladım ve şimdi bu kadar zamandır nasıl kullanmadığıma şaşırıyorum. Aynı konularla ilgilendiğiniz kişilerin yazılarına erişmek, takip etmek, fikir paylaşımında bulunmak friendfeed ile çok kolay. FriendFeed&#8217;e Oracle ile uğraşan Türk uzmanların bloglarını eklediğim bir grup oluşturdum. Bu gruba üye olarak uzmanların sayfalarına eklediği yeni yazılarından anında haberdar olabilirsiniz. Grup [...]]]></description>
			<content:encoded><![CDATA[<p>Bir kaç gündür Friendfeed&#8217;i aktif olarak kullanmaya başladım ve şimdi bu kadar zamandır nasıl kullanmadığıma şaşırıyorum. Aynı konularla ilgilendiğiniz kişilerin yazılarına erişmek, takip etmek, fikir paylaşımında bulunmak friendfeed ile çok kolay. FriendFeed&#8217;e Oracle ile uğraşan Türk uzmanların bloglarını eklediğim bir grup oluşturdum. Bu gruba üye olarak uzmanların sayfalarına eklediği yeni yazılarından anında haberdar olabilirsiniz.</p>
<p>Grup adresi: <a href="http://friendfeed.com/oracleturkiye" target="_blank">http://friendfeed.com/oracleturkiye</a></p>
<p>Eğer Oracle ile ilgili bir blogunuz, web sayfanız varsa bana ulaşın, sizin sayfanızdaki feedleri de bu gruba ekleyelim.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/08/oracle-kullanicilari-icin-friendfeed-grubu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Oracle, Google&#8217;ı Dava Ediyor</title>
		<link>http://www.gokhanatil.com/2010/08/oracle-googlei-dava-ediyor/</link>
		<comments>http://www.gokhanatil.com/2010/08/oracle-googlei-dava-ediyor/#comments</comments>
		<pubDate>Fri, 13 Aug 2010 11:40:16 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[java]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1655</guid>
		<description><![CDATA[Oracle, Google&#8217;ın Android işletim sisteminde kullandığı Java platformunun, telif haklarını ihlal ettiği iddiasıyla dava açtı. Oracle, patent ihlalinin engellenmesi için Android ürünlerinin satışının ve reklamlarının durdurulmasını, Google&#8217;ın tazminat ödemesini istiyor. Konuyla ilgili çeşitli iddialar var. Bir kısım, bu davanın Oracle&#8217;ın Java üzerinden para kazanmak isteğiyle ilgili olduğunu düşünüyor ve bu yüzden Oracle&#8217;ın hareketini Java&#8217;ya vurulan [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Oracle, Google&#8217;ın Android işletim sisteminde kullandığı Java platformunun, telif haklarını ihlal ettiği iddiasıyla dava açtı. Oracle, patent ihlalinin engellenmesi için Android ürünlerinin satışının ve reklamlarının durdurulmasını, Google&#8217;ın tazminat ödemesini istiyor.</p>
<p style="text-align: justify;">Konuyla ilgili çeşitli iddialar var. Bir kısım, bu davanın Oracle&#8217;ın Java üzerinden para kazanmak isteğiyle ilgili olduğunu düşünüyor ve bu yüzden Oracle&#8217;ın hareketini Java&#8217;ya vurulan bir darbe olarak görüyor. Sun&#8217;ın satın almadan önce bile sürekli Java&#8217;ya olan desteğinden bahseden Oracle&#8217;ın,  Java&#8217;dan gelir elde etmeye çalışarak Java topluluğunu karşısına alacağını hiç sanmıyorum.</p>
<p style="text-align: justify;">Diğer bir iddia ise Oracle&#8217;ın, Google&#8217;a karşı Apple&#8217;a destek olduğu. Android tabanlı akıllı telefonların bu yılın 2. çeyreğinde %27&#8242;lik pazar payına ulaşarak, iPhone&#8217;un %23&#8242;lük pazar payını geçmiş olması yüzünden, Oracle&#8217;ın Android&#8217;in yükselişini engellemek için bu yola başvurduğu söyleniyor. Bunu desteklemek için Apple&#8217;ın patronu Steve Jobs ile Oracle&#8217;ın patronu Larry Ellison&#8217;ın yakın arkadaş olmaları delil gösteriliyor ama ben bu seviyedeki firmaların &#8220;bir arkadaşa kıyak&#8221; yapmak adına bu derece önemli manevralar yapmayacağı düşünüyorum.</p>
<p style="text-align: justify;"><span id="more-1655"></span>Aslında bu olay, daha önce Sun ile Microsoft arasında Java dağıtımlarındaki anlaşmazlık yüzünden açılan davaya çok benziyor. Hatırlarsanız 1997&#8242;de Sun, orjinal Java dağıtımıyla uyumlu olmayan kendi Java dağıtımını yaptığı için Microsoft&#8217;a dava açmış ve davayı kazanarak bir milyar dolarlık tazminat almıştı. Şu an Andoid ile gelen Java dağıtımı da, orjinal Java platformu ile tam olarak uyumlu değil, yani J2ME için yazdığınız bir programı, Android&#8217;de çalıştırabileceğinizin garantisi yok. Oracle, Google&#8217;ın Android işletim sisteminde diğer akıllı telefon üreticilerin yaptığı gibi j2ME kullanmasını istiyor.</p>
<p>Konuyla ilgili detaylara şuradan ulaşabilirsiniz:</p>
<p><a href="http://www.theregister.co.uk/2010/08/13/oracle_sues_google/" target="_blank">http://www.theregister.co.uk/2010/08/13/oracle_sues_google/</a></p>
<p><a href="http://www.reuters.com/article/idUSTRE67B5G720100813" target="_blank">http://www.reuters.com/article/idUSTRE67B5G720100813</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/08/oracle-googlei-dava-ediyor/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Data Guard için TCP Socket Buffer Boyutunun Hesaplanması</title>
		<link>http://www.gokhanatil.com/2010/08/data-guard-icin-tcp-socket-buffer-boyutunun-hesaplanmasi/</link>
		<comments>http://www.gokhanatil.com/2010/08/data-guard-icin-tcp-socket-buffer-boyutunun-hesaplanmasi/#comments</comments>
		<pubDate>Thu, 12 Aug 2010 07:17:34 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[Oracle]]></category>
		<category><![CDATA[data guard]]></category>
		<category><![CDATA[tcp socket buffer]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1651</guid>
		<description><![CDATA[Alejandro Vargas&#8217;în blogunda yayınlanan bir yazı dikkatimi çekti. Fiziksel Data Guardlarda optimum TCP scoket buffer boyutunu hesaplamak için çok basit bir formül vermiş. Optimum socket buffer boyutu = (Bant genişliği * round trip time (rtt) * 3) Bant genişliği: Primary ile secondary sunucular arasındaki iletişimi sağlayan network bağlantısının hızı. Round Trip Time: İki sunucu arasında [...]]]></description>
			<content:encoded><![CDATA[<p>Alejandro Vargas&#8217;în blogunda yayınlanan bir yazı dikkatimi çekti. Fiziksel Data Guardlarda optimum TCP scoket buffer boyutunu hesaplamak için çok basit bir formül vermiş.</p>
<blockquote><p>Optimum socket buffer boyutu = (Bant genişliği * round trip time (rtt) * 3)</p></blockquote>
<p>Bant genişliği: Primary ile secondary sunucular arasındaki iletişimi sağlayan network bağlantısının hızı.</p>
<p>Round Trip Time: İki sunucu arasında paketlerin gidip gelme (ping) süresi</p>
<p>Bu değeri set etmemiz, sunucular arasında archivelogların  transferlerinin daha sağlıklı ve hızlı gerçekleşmesini sağlayacak.  Formülün mantığını aslında basit. Bant genişliği ile paketin ulaşın süresini çarparak  gerçek gönderim hızımızı buluyor ve bunu sabit bir katsayı ile (3) çarpıyoruz. Alejandro Vargas, neden 3  kullanıldığını açıklamamış. Aslında genelde network otoriteleri, tcp socket bufferını hesaplarken bu  katsayının 2 olarak alınmasını öneriyor ama biz Vargas&#8217;ın Oracle  konusundaki deneyimlerine güvenerek 3 alacağız.</p>
<p>Formülü örnek bir senaryoda kullanalım:</p>
<p><span id="more-1651"></span>Sunucuların yakın lokasyonlarda olduğunu ve bağlantı hızının, yani bant genişliğinin network<br />
kartlarının hızıyla sınırlı olduğunu düşünelim. Diyelim ki iki sunucuda da 1G ethernet kartı var ve<br />
bir sunucudan diğerine ping attığımızda, ping değerleri 2 ms civarında. Bu durumda:</p>
<blockquote><p>socket buffer boyutu = Bant genişliği * round trip time (rtt) * 3</p>
<p>socket buffer boyutu = 1.000.000.000 bit * 0.002 saniye * 3 = 600.000 bit</p>
<p>600.000 bit = 600.000 / 8 bayt = 75000 bayt</p></blockquote>
<p>Bu bulduğumuz değeri eğer Data Guard Broker kullanıyorsak, sqlnet.ora içine</p>
<blockquote><p>RECV_BUF_SIZE = 75000<br />
SEND_BUF_SIZE = 75000</p></blockquote>
<p>Data Guard Broker&#8217;ı kullanmıyorsak, listener.ora veya tnsnames.ora içine yazabiliriz:</p>
<blockquote><p>LISTENER=<br />
(DESCRIPTION=<br />
(ADDRESS=(PROTOCOL=tcp)<br />
(HOST=&lt;hostname.domain&gt;)(PORT=1521)<br />
(RECV_BUF_SIZE = 75000)<br />
(SEND_BUF_SIZE = 75000)))</p>
<p>&lt;dbname&gt;=<br />
(DESCRIPTION=<br />
(RECV_BUF_SIZE = 75000)<br />
(SEND_BUF_SIZE = 75000)<br />
(ADDRESS=(PROTOCOL=tcp)<br />
(HOST=&lt;hostname.domain&gt;)(PORT=1521))<br />
(CONNECT_DATA=(SERVICE_NAME=&lt;dbaname&gt;)))</p></blockquote>
<p>Alejandro Vargas&#8217;ın ilgili sayfası:</p>
<p><a href="http://blogs.oracle.com/AlejandroVargas/2010/05/how_to_calculate_tcp_socket_bu.html" target="_blank">http://blogs.oracle.com/AlejandroVargas/2010/05/how_to_calculate_tcp_socket_bu.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/08/data-guard-icin-tcp-socket-buffer-boyutunun-hesaplanmasi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>MS SQL Server&#8217;da Linked Server Kullanan Sorgularda Performans</title>
		<link>http://www.gokhanatil.com/2010/07/ms-sql-serverda-linked-server-kullanan-sorgularda-performans/</link>
		<comments>http://www.gokhanatil.com/2010/07/ms-sql-serverda-linked-server-kullanan-sorgularda-performans/#comments</comments>
		<pubDate>Thu, 15 Jul 2010 07:59:38 +0000</pubDate>
		<dc:creator>Gökhan Atıl</dc:creator>
				<category><![CDATA[Genel]]></category>
		<category><![CDATA[linked server]]></category>
		<category><![CDATA[ms sql server]]></category>
		<category><![CDATA[openquery]]></category>

		<guid isPermaLink="false">http://www.gokhanatil.com/?p=1612</guid>
		<description><![CDATA[Eğer Microsoft SQL Server üzerinde linked server tanımlayarak Oracle veya başka bir veritabanına bağlanıyorsanız yazdığınız sorgularda performans problemleri yaşayabiliriz. Örneğin aşağıdaki sorgu tablonun tutulduğu Oracle veritabanında 30 ms&#8217;de sonuç döndürürken, bu sunucuya linked server ile veritabanı bağlantısı yapmış olan Microsoft SQL Server üzerinde 5 saniyede sonuç döndürüyordu: SELECT COUNT (*) SAYI FROM [DBLINK_ADI]..[SCHEMA_ADI].[TABLO_ADI] WHERE A [...]]]></description>
			<content:encoded><![CDATA[<p>Eğer Microsoft SQL Server üzerinde linked server tanımlayarak Oracle veya başka bir veritabanına bağlanıyorsanız yazdığınız sorgularda performans problemleri yaşayabiliriz. Örneğin aşağıdaki sorgu tablonun tutulduğu Oracle veritabanında 30 ms&#8217;de sonuç döndürürken, bu sunucuya linked server ile veritabanı bağlantısı yapmış olan Microsoft SQL Server üzerinde 5 saniyede sonuç döndürüyordu:</p>
<blockquote><p>SELECT COUNT (*) SAYI<br />
FROM [DBLINK_ADI]..[SCHEMA_ADI].[TABLO_ADI]<br />
WHERE A &lt;&gt; &#8217;00&#8242; AND B = &#8216;TELEFON&#8217; AND (C &gt; &#8217;2010-07-12&#8242; OR D IS NULL )</p></blockquote>
<p>Sadece 1 satır sonuç döndüren bir sorgunun network&#8217;den etkilendiğini düşünmek zor. Aynı linked server üzerinden ve aynı tablodan sorgu yapıp yine 1 satır döndüren aşağıdaki sorgu ise 50 ms&#8217;de sonuç döndürüyor:</p>
<blockquote><p>SELECT COUNT (*) SAYI<br />
FROM [DBLINK_ADI]..[SCHEMA_ADI].[TABLO_ADI]</p></blockquote>
<p><span id="more-1612"></span>Bu aradaki performans farkı, sorgunun işleniş biçiminden ve network üzerinde taşınan bilgi miktarından kaynaklanıyor. MS SQL Server, linked server kullanarak yaptığınız sorguları uzak sunucuda çalıştırmaya uğraşır. Bu işlem eğer siz iki MS SQL Serverlar arasında linked server yaptısayanız daha başarılı olurken, diğer sunucularda  kullandığınız OLE DB bağlantısına  göre başarım oranı azalır.</p>
<p>Özellikle her iki veritabanındaki karakter set ve sıralama ayarları aynı ve linked server ayarlarında &#8220;collation compatible&#8221; seçeneği etkin ise, sorgulardaki WHERE koşulları uzak sunucuda uygulanabilir. Eğer karakter set ve sıralama ayarları farklı ise, WHERE ile belirtilen koşullar uzak sunucuda uygulanmandan tablodaki bütün veri kümesi yerel sunucuya çekilir, bu da network bağlantınızın hızına göre sorgunun performansını ciddi anlamda olumsuz yönde etkiler.</p>
<p>Collation compatible olmayan sunucular kullansanız bile, MS SQL Server&#8217;a sorgunun tamamını uzak sunucuda işlemesini söyleyebilirsiniz. Bunun için OPENQUERY komutunu kullanılıyor. OPENQUERY iki parametre alır, birincisi linked server&#8217;ın ismi, ikincisi ise uzak sunucuda çalıştırılacak sorgu. Sorguyu uzak sunucuda çalışacak şekilde yani uzak sunucunun desteklediği SQL komut setiyle yazmanız gerektiğine dikkat etmelisiniz.</p>
<p>Üsteki sorguda TSQL&#8217;e özel her hangi bir komut olmadığından, Oracle&#8217;da (uzuk sunucumuzda) çalıştırırken sadece tablo ismini düzenlemem yeterli oldu:</p>
<blockquote><p>SELECT * FROM OPENQUERY( linkedserver, &#8216;SELECT COUNT (*) SAYI FROM TABLO_ADI<br />
WHERE A &lt;&gt; &#8221;00&#8221; AND B = &#8221;TELEFON&#8221; AND (C &gt; &#8221;2010-07-12&#8221; OR D IS NULL )&#8217; );</p></blockquote>
<p>Sonuç sizin de tahmin edeceğiniz üzere 50 ms civarında dönmeye başladı (20 ms&#8217;lik fark networkden kaynaklanıyor). OPENQUERY sadece Oracle&#8217;a yaptığınız bağlantılarda kullanabileceğiniz bir komut değil. Veritabanından bağımsız olarak bütün linked serverlar için kullanabilirsiniz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.gokhanatil.com/2010/07/ms-sql-serverda-linked-server-kullanan-sorgularda-performans/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
