C# Oracle Veritabanı Bağlantı Hatası ( TNS:listener was not given the SERVICE_NAME in CONNECT_DATA )

Bir entegrasyon projemizde gittik Oracle’a denk geldik. Onda da hata ile karşılaştık. Yanlış anlaşılmasın denk geldik işte 🙂 Oracle tarafı ile pek bir tecrübem olduğu söylenemez. Fakat Google gibi bir kaynak elimizin altındayken çözümü bulmamak ayıp olurdu.

Alınan hata aşağıdaki gibi bir hatadır.

System.Data.OracleClient.OracleException (0x80131938): ORA-12504: TNS:listener was not given the SERVICE_NAME in CONNECT_DATA

konum: System.Data.OracleClient.OracleException.Check(OciErrorHandle errorHandle, Int32 rc)
konum: System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
konum: System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
konum: System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
konum: System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
konum: System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
konum: System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
konum: System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
konum: System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
konum: System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
konum: System.Data.OracleClient.OracleConnection.Open()

Yukarıdaki gibi bir hata alıyorduk. Hatanın ana teması ise “TNS:listener was not given the SERVICE_NAME in CONNECT_DATA” artık bu ne demekse ( ORACLE ile uğraşanlar biliyorlardır diye tahmin ediyorum 🙂 )

Çözümümüz ise Program tarafında SQL Connection için yazılan string içerisine HOST kısmında aşağıdaki cümleciği yazmak oldu.

(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=BAGLANTI_YAPILACAK_SERVER)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=opera)))

BAGLANTI_YAPILACAK_SERVER bilgisi bağlanacak olduğunuz server bilgisidir. localhost, Server’ın kendi hostname’i, IP Adresi gibi bilgiler olmaktadır.

 

Javascript / JQuery Input Virgül Yerine Nokta

JQuery kullanarak geliştirdiğimiz arayüz çalışmasında matematiksel işlemler yapan ufak bir sayfamız vardı. Fakat Klavyenin sağ tarafındaki Number Pad kullanılığında el alışkanlığı olaraktan ondalıklı sayılar için Virgül kullanıldığında Javascript hataları alıyorduk. Bize gerekli olan ise Virgül tuşuna basıldığında Nokta’ya çevirmesiydi.

Bununla ilgili olaraktan Javascript / JQuery kod parçasını paylaşıyorum. Aynı zamanda ondalıklı sayılar için tek bir ondalık parçası yani tek bir Nokta işareti almalıydı. Kod parçasında nokta yani ondalık var ise tekrardan Nokta basmayacak şekilde düzenleme yaptık.

	$( document ).on( 'keypress', '.input_calc', function( e )
	{
		if( e.keyCode == 46 && $( this ).val().indexOf( '.' ) != -1 )
			e.preventDefault();

		var tmp = $( this ).val();
		if( e.keyCode == 44 )
		{
			setTimeout(function()
			{
				if( tmp.indexOf( '.' ) == -1 )
					e.target.value += '.';
			}, 4 );
			e.preventDefault();
		}
	});

Bu olay / hata / problem artık ne demek isterseniz sadece javascript / web ortamında değil aynı zamanda hemen hemen bütün programlama dilleri ve veritabanı kayıt işlemlerinde ondalıklı sayıların nokta ile gelmesi durumlarını kapsayabilir. Geliştirmekte olduğunuz projede sayısal işlemleriniz mevcut ise dikkat etmenizi öneririm. 🙂

MySql Parçalı Dosyaları İçeri Aktarma

Yedekleme sistemleri her yazılım ve sistem için oldukça önemlidir. Farklı yedekleme senaryoları mevcuttur. Bundanlar en basit olanı veritabanını dump etmektir. Diğeri ise tüm veritabanını tek bir dosyada dump etmek yerine tabloları ayrı ayrı dump etmektir.

Tek bir dosya halindeki yedekleriniz veritabanınızdaki veri büyüklüğüne göre başarılı olabilir. Fakat büyük bir veritabanınız mevcut ise tek bir dosya halinde yedeklemenizi tavsiye etmem.

Elimizde MySql veritabanınızın dump edilmiş hali yani tüm veritabanının dosyaya çıktı alınmış halini aşağıdakine benzer bir komut ile Linux Terminal üzerinden içeriye tekrar alabilirsiniz.


mysql -u MYSQL_USER -pMYSQL_SIFRENIZ VERITABANI_ADI < $d

Okumaya devam et “MySql Parçalı Dosyaları İçeri Aktarma”

Linux CentOS Geçmiş Silme / History Clear

Linux kullanıcılarının çoğu bilir. Hatta HACKER muhabbetlerinde de sürekli geçer.
Asla ayak izlerini belli etme”.
Hacker işlemlerinden çok bir sunucuda konfigürasyon sırasında girilen şifreler olabilir veya yapılan işlemler, adımlar, sql sorguları vb. linux terminal üzerinde yön tuşlarından Yukarı veya Aşağı tuşları ile neler yapılmış neler edilmiş görebilirsiniz. Hatta kullanmış olduğunuz Linux dağıtımına göre history komutu ile listeleme yapabilir, farklı dosyaya çıktı dahi alabilirsiniz.

Hacker muhabbetlerinden ziyade yapılan işin güvenliğini düşünecek olursak – ki bu da hacker muhabbetine dönebilir – geçmişinizi muhakkak kontrol edin, temiz tutun. Bunun için en basit ve birinci adımlardan birisi aşağıdaki komutlardır diyebilirim. Terminalinizden logout / çıkış yapmadan önce komutları uygulayınız..

cat /dev/null > ~/.bash_history && history -c
cat /dev/null > ~/.mysql_history && history -c

 

Tabiki daha detaylı işlemler mevcut. Aklıma gelmişken sizinle paylaşayım dedim. Bunu yapınca hacker vs. olunmuyor onu da söylim 🙂

Veeam Backup & Replication Windows Server Hostname Değiştirme ( Değiştirmeme )

Ufak bir anı paylaşımı daha.
Sanallaştırma teknolojileriden VMware kullanmaktayız. Sanal sistemlerimizi yedeklemek amacıyla da Veeam Backup & Replication kullanıyoruz. Kurulu olan sanal Windows server üzerinde de HOSTNAME’i ( Sunucu / Bilgisayar adı ) ilk kurulum sırasında default olarak bırakmışız. Bu böyle kalmasın diyip değiştirdiğimizde ise Veeam Backup çalışmadı. Değişiklik yapmadan önce yedeklerınızı almanızı tavsiye ederim. Yedekleme tarafı önemli olduğu çözümü bulamadan eski hostname’i geri aldık. Farklı bir sistem üzerinde kurup çözümünü test edeceğim.  Başarılı olursa paylaşacağım. Muhakkak birileri yapmıştır diye düşünüyorum.
Şuna benzer bir hata alıyorsunuz;
“could not connect to server: Connection refused Is the server running on host ‘localhost’ “
Şimdilik demem şudur ki değiştirirseniz problemlerin ardı arkası kesilmiyor. Ya da sisteminiz zaten eski ise yenisini kurup eski konfigürasyonu yenisine taşıyın. 🙂 Ya da değiştirmeyin. 🙂
Sağlıcakla..

Windows Server Arayüz Giderse Geri Getirme

Windows bir sunucunuz var ve ayarları ile oynarken ( Genellikle server ayarları ile oynamanızı tavisye etmem. Fakat en iyi tecrübe şeklidir 🙂 ) yeniden başlatma isteği gelir ve ne olduğunu okumadan EVET’e basarsanız neler mi olabilir. Birçok şey olabilir. Gün içerisinde yaşadığım bir olayı sizlerle paylaşmak istiyorum.

Kenarda köşede kalmış sadece bazı işlemleri yapmak için kullandığım bir Windows sunucu vardı. RDP ( Remote Desktop Protocol | Uzak Masa Üstü Bağlantısı ) olarak kullanıyordum. Üzerinde test için IIS ( Internet Information Services ) kuruluydu. Windows özelliklerinden IIS’i kaldırırken çok fazla dikkat etmeden kaldır sihirbazını kullanarak kaldırığımda sistem benden yeniden başlatma istedi. Ne mi oldu ? Aşağıdaki gibi birşey oldu.

windows-server-cli

Okumaya devam et “Windows Server Arayüz Giderse Geri Getirme”

CodeIgniter WebServis Veritabanı Hatalarını Yakalamak

Codeigniter ile yürüttüğümüz birkaç web servisimiz mevcut. Bu servislerimiz arka planda olduğu için genellikle veritabanı sorguları ve çalışan sorgulardaki hataları yakalayamıyoruz. Bunun için system/database/DB_driver.php dosyasında birazcık oynayacağız.

display_error fonksiyonunda hataları gösteren yere farklı bir domain/sub domain altındaki servisimize gönderiyoruz. Bu servis üzerinde ise gelen bilgileri alıp Mail olarak yazılım ekibimize gönderiyoruz. Böylece bir hata olduğunda yakalama şansımız yüksek oluyor.

Mail göndermek yerine farklı senaryolarda yapılabilir. Örneğin telegramdan kendinize bildirim gönderebilirsiniz. Başka bir veritabanına hataları yazabilirsiniz. SMS hadi attırabilirsiniz. Monitoring yazılımınız ile entegre edebilirsiniz. Bildirim servisini aktif etmek tamamıyla sizin ihtiyaçlarınıza kalmış bir durum.

Okumaya devam et “CodeIgniter WebServis Veritabanı Hatalarını Yakalamak”

IndexedDb – Dixie.js Nedir – Ön Hazırlık – 1

Yazılım projelerinde veritabanları çok önemlidir. Bunun yanında getirdiği birkaç problem vardır. İlk olarak hız konusu gündemde kalır. Hız önemlidir. Hatta bazen önemini sözlerle bile anlatamayız. Biraz abartı olabilecek belki ama ölüm / kalım meselesi bile olabilir hız konusu.  Neyse..

Bir projemizde ekran üzerinde birçok işlem yapıldıktan sonra düzenleme işlemleri bitip “Kaydet” butonuna tıklanıldığında işlemlerin yapılması gerekiyor. Proje Web üzerinde yürüdüğü için bize gerekenler şunlar;

  • Tarayıcı üzerinde bilgi saklanmalı
  • Javascript olarak üzerinde ekleme, silme, arama işlemleri ( database işlemleri gibi )
  • Tarayıcı kapanırsa açıldığında tekrar kaldığı yerden bilgiler devam etmeli
  • Hızlı ve esnek olmalı
  • Ek olarak bizi yormayacak şekilde olması lazım tabiki 🙂

Araştırmalarım sonucu olarak IndexedDb ile tanışmış olup kullanmaya çalıştım. IndexedDb tarafında sıfırdan kütüphane yazmak yerine de var olan kütüphanelerden Dixie.JS hoşuma gitti ve kullanmaya başladım. Okumaya devam et “IndexedDb – Dixie.js Nedir – Ön Hazırlık – 1”

PHP CodeIgniter İle İmage Cache Yapımı

Hemen hemen herkesin ihtiyacıdır diye düşünüyorum. İmage Cache. Genellikle bir tane PROXY URL oluşturup dosyaya ait cache hali varsa onu çekeriz yoksa cache’leyip cache halini çekeriz. Fakat bu durum sistemde dosyalarınızın gelmesini yavaşlatabilir.

Hali hazırsa orjinal dosyalarınızın bulunduğu bir klasör altında image dosyalarınız var ise aşağıdaki paylaşmış olduğum örnekteki gibi bir yöntem ile dosyaların boyutlandırılmasını orantılı bir şekilde yapabilirsiniz.

Bir önceki yazımda “get_dir_contents” fonksiyonunu paylaşmıştım. Bir dizin altındaki tüm dosyaları getirmek için kullanıyoruz.

$list = get_dir_contents( '/var/www/html/cron/orj_images' );

// hangi boyutlarda oluşturacağımızı belirtiyoruz.
$arr[] = array( 32, 32 );
$arr[] = array( 50, 50 );
$arr[] = array( 64, 64 );
$arr[] = array( 70, 70 );
$arr[] = array( 80, 80 );
$arr[] = array( 90, 90 );
$arr[] = array( 100, 100 );
$arr[] = array( 120, 120 );
$arr[] = array( 150, 150 );
$arr[] = array( 160, 200 );
$arr[] = array( 200, 200 );
$arr[] = array( 300, 300 );
$arr[] = array( 200, 256 );
$arr[] = array( 256, 256 );
$arr[] = array( 500, 500 );
$arr[] = array( 512, 512 );
$arr[] = array( 640, 640 );
$arr[] = array( 1024, 1024 );
$i = 0;
// listemizde döngüye girip image_lib kütüphanesi ile işlemleri başlatıyoruz.
foreach( $list as $key => $value )
{
	if( !file_exists( $value ) )
		continue;
	if( is_dir( $value ) )
		continue;
	
	$this->load->library( 'image_lib' );
	// her bir dosya için boyutlandırma dizisine göre ayrı ayrı işlem yaptırıyoruz.
	foreach ( $arr as $k => $v )
	{
		$ext = pathinfo( $value );

		$new_file = $ext[ 'dirname' ].'/'.$ext[ 'filename' ].'-'.$v[ 0 ].'x'.$v[ 1 ].'.'.$ext[ 'extension' ];				
		$old_file = str_replace( '/var/www/html/cron/orj_images', '/var/www/html/cron/chache_images', $new_file );			
		
		if( file_exists( $old_file ) )
			continue;
		// kaynak dosyamnız $value değişkenindedir.
		$config = array(
			'image_library' => 'gd2',
			'source_image' => $value,
			'new_image' => $old_file,
			'maintain_ratio' => TRUE,
			'create_thumb' => TRUE,
			'thumb_marker' => '',
			'width' => $v[ 0 ],
			'height' => $v[ 1 ]
		);

		$this->image_lib->initialize( $config );
		$this->image_lib->resize();
		$this->image_lib->clear();
		echo $old_file."\n";
	}
}

Yeni dosya ekleme işlemlerinde upload sırasında bu boyutlar otomatik olarak cachleniyor. Sistemde orjinal dosya direkt olarak kullanılmıyor.

Bu kod parçasını CRON üzerinden bağladığımız için dosyaları mümkün olduğunda güncel kalmasını sağlıyoruz.

Not : “Yapı Codeigniter framework’ü üzerinden örneklendirilmiştir. Sisteminize uygulamadan önce test etmenizi tavsiye ederim.”

 

PHP İle Dizindeki Tüm Dosya ve Klasörleri Listeleme

PHP ile bir projemizdeki tüm dosya ve klasörlerin listesi gerektiği için kullanmış olduğum fonksiyon aşağıdaki gibidir. Kendinize göre düzenleyip kullanabilirsiniz.

	function get_dir_contents($dir, &$results = array())
	{
		$files = scandir($dir);

		foreach($files as $key => $value){
			$path = realpath($dir.DIRECTORY_SEPARATOR.$value);
			if(!is_dir($path)) {
				$results[] = $path;
			} else if($value != "." && $value != "..") {
				get_dir_contents($path, $results);
				$results[] = $path;
			}
		}

		return $results;
	}