Oracle Lock Kill Etme

kill-session-oracle

Merhaba Sayın Takipçilerim, Uzun bir aradan sonra tekrar karşınızdayım 🙂

Oracle Bir tablo üzerinde ardı ardı çalışmalar yaptığınız zaman o tablonun lock e düşmesi kaçınılmazdır.

Böyle durumlarda Kill etmek için sorgumu paylaşıyorum.

Db de lock var mı? öğrenmek için aşağıdaki sorguyu çalıştırmak yeterlidir.

SELECT distinct username U_NAME , owner OBJ_OWNER, object_name, object_type, s.osuser,s.sid||’,’||s.serial#||’,’||s.inst_id “SESSION BILGISI”
FROM gv$locked_object v, dba_objects d,
gv$lock l, gv$session s
WHERE v.object_id = d.object_id
AND (v.object_id = l.id1)
AND v.session_id = s.sid
and V.INST_ID=S.INST_ID
and owner like ‘OC_%’

Lock açmak için aşağıdaki sorguyu çalıştırmak gerekiyor.

Alter system kill session ‘s.sid,s.serial#‘ ye yazıp çalıştırın lockın açıldığını göreceksiniz.

s.sid ve s.serial# ilk sorgudan geliyor şöyle ki:

“SESSION BILGISI” kolonunu oluşturan s.sid ve s.serial# (ilk ve ikinci değer oluyor.) değerlerini yazacaksınız.

Bol kodlu günlerde kullanın efenim 🙂

ORACLE NESNELERİ

images

  • SQL dilinde kullanılan SELECT komutu ve DML komutları (INSERT, DELETE, UPDATE) genellikle tüm VTYS’lerde aynı şekilde kullanılır.
  • DDL (CREATE, DROP, ALTER) ve DCL (GRANT, REVOKE) komutlarında ise bazı farklılıklar vardır.

–Örneğin SQL Server’da önce bir LOGIN nesnesi yaratılır, daha sonra yaratılan bir kullanıcı (USER) bu LOGIN nesnesi ile ilişkilendirilir. Dolayısı ile SQL Server’daki “CREATE USER” komutunun yazımı ile ORACLE’daki yazım farklıdır.

  • Bu ders sunusundaki tüm DDL ve DCL komutları ORACLE’a göre verilmiştir.

Tablo Yaratma

CREATE TABLE scott.emp(

  empno NUMBER CONSTRAINT pk_emp PRIMARY KEY,

  ename VARCHAR2(10) CONSTRAINT nn_ename NOT NULL CONSTRAINT upper_ename CHECK (ename = UPPER(ename)),

  job VARCHAR2(9),

  mgr NUMBER CONSTRAINT fk_mgr REFERENCES scott.emp(empno),

  hiredate DATE DEFAULT SYSDATE,

  sal NUMBER(10,2) CONSTRAINT ck_sal CHECK (sal > 500),

  comm NUMBER(9,0) DEFAULT NULL,

  deptno NUMBER(2) CONSTRAINT nn_deptno NOT NULL

  CONSTRAINT fk_deptno REFERENCES scott.dept(deptno)

);

Bütünlük Kısıtlamaları  (Integrity Constraints)

Oracle’da veri bütünlüğünü sağlamak için 5 farklı bütünlük kısıtlaması tanımlanabilir:

–Primary Key, Foreign Key, Unique, Not Null, Check

Kısıtlamalar tablolar oluşturulurken tanımlanabileceği gibi tablolar oluşturulduktan sonra da tanımlanabilirler.

Ancak tabloya önceden girilmiş olan veriler varsa, bu verilerin tanımladığımız kısıtlamaya uyması gerekir.

Tablo ve Sütun Kısıtlamaları

Eğer kısıtlama sütun tanımının yanında verilirse sütun kısıtlaması, tüm sütunlar tanımlandıktan sonra CONSTRAINT ile başlayan ifadede verilirse tablo kısıtlaması olarak adlandırılır.

  CREATE TABLE supplier_item (

  supp_no NUMBER NOT NULL,

  item_no NUMBER NOT NULL,

  qty NUMBER NOT NULL DEFAULT 0,

  CONSTRAINT pk_si PRIMARY KEY   (supp_no, item_no) );

Primary Key Constraint

Birincil anahtar kısıtlayıcısı, bir tabloya girilen her bir kaydın belirtilen sütun değeri olarak diğer kayıtlardan ayırmak üzere tekil ve farklı bir değer girmeye zorlar.

Bir tabloda sadece bir tane Primary Key Constraint tanımlanabilir ve bu sütun (veya sütunlar) asla NULL değer kabul etmez.

Foreign Key Constraint

Bir tablonun belli sütununa girilecek değerleri başka bir tablonun indekslerle tekilleştirilmiş bir sütunundaki değer kümesi ile sınırlandırmak için kullanılır.

 CREATE TABLE tablo_ismi (

sütun tanımlamaları…,

CONSTRAINT kısıtlayıcı-ismi

FOREIGN KEY(sütun-ismi)

REFERENCES tablo-ismi(sütun-ismi)

);

Unique Constraint

Bazı durumlarda, bir tabloda birincil anahtar alanın yanı sıra başka bazı sütunlardaki verilerin de tekrarlanmaması istenebilir. Bu türden alanlar için Unique Constraint tanımı yapılır.

Unique Constraint’i, Primary Key Constraint’ten ayıran en önemli iki özellik,

–Unique bir tabloda birden fazla olabilir. Ancak Primary Key tablo başına sadece bir adet alan olabilir.

–Unique Constraint tanımlı bir alan NULL değerler kabul edebilir.

Not Null Constraint

Eğer bir sütun için her zaman veri girilmesi zorunlu olsun isteniyorsa “Boş Olamaz Kısıtlayıcısı”kullanılır.

Check Constraint

Bir sütuna girilebilecek değerleri, belli kıyaslara karşı kontrol eden kısıtlayıcı türüdür ve üç farklı amaç için kullanılabilir:

–Bir sütuna girilebilecek değerleri belli bir küme ile kısıtlamak için

–Bir sütuna girilebilecek değerleri belli bir formata uygunluğunu denetlemek için

–Bir sütuna girilebilecek değerleri, başka sütunlar üstünden bir kıyas ile denetlemek için

  CREATE TABLE tablo-ismi( sütun tanımlamaları…,

  CONSTRAINT constraint-ismi

  CHECK(ifade) FOR sütun-ismi )

İndeks Kullanımı

İndeksler verilere hızlı erişim amacıyla kullanılır.

OLAP sistemlerde mümkün olduğu kadar çok indeks kullanılır, OLTP’de ise fazlası uygulamaya zarar verebilir (özellikle çok sık güncellenen tablolarda).

PrimaryKey’ler otomatik olarak indekslenir, ForeignKey’ler de genellikle indekslenmesi gereken alanlardır.

WHERE koşulu ile seçilen sütunlar, aynı sırada indeks yapılmalıdır.

Ne zaman indeks kullanmalı?

Bir veya daha fazla sayıda sütun sıklıkla bir where koşulunda yada tablo birleştirme işleminde kullanılıyorsa indeks kullanmak hızı arttıracaktır.

Eğer sorgunun sonucu tablodaki satırların %2 yada daha azı gibi küçük bir bölümünü döndürecek ise indeks kullanımı faydalı olacaktır.

Sütundaki değerlerin çoğu NULL ise indeks kullanımı iyi sonuç verir.

Sütundaki değerler büyük ölçüde birbirini tekrar eden değerler ise (cinsiyet sütununda sadece iki farklı değer olması gibi) indeks kullanmanın anlamı yoktur.

Tablo çok sık güncelleniyorsa, indeksin de güncellenmesi gerekeceği için zaman kaybı yaratır.

İndeks Yaratma

Aşağıdaki iki indeks aynı anda mevcut olabilir, çünkü sütun sıraları farklıdır.

  CREATE INDEX emp_idx1

  ON emp (ename, job);

  CREATE INDEX emp_idx2

  ON emp (job, ename);

View (Görüntü)

Gerçekte olmayan tablolardır. Sadece SELECT ifadesinden ibarettirler.

Neden view kullanılır?

  1. Veri erişimini sınırlamak için
  2. Karmaşık sorguları kolay hale getirmek için
  3. Veri bağımsızlığını sağlamak için
  4. Aynı verinin farklı görünümlerini sunmak için
  5. Eğer Primary Key View’da yer alıyorsa DML (insert, delete, update) işlemleri o view üzerinde uygulanabilir.

View Yaratma

CREATE VIEW emp_view AS

  SELECT empno, ename, sal, loc

  FROM emp, dept

  WHERE emp.deptno = dept.deptno

  AND dept.deptno = 10;

CREATE VIEW dept20 AS

  SELECT ename, sal*12 annual_salary

  FROM emp

  WHERE deptno = 20;

Synonym

Tablo, view, sequence,procedure, function, package veya başka bir synonym için alternatif bir isimdir.

  CREATE SYNONYM market

  FOR scott.market_research;

  CREATE PUBLIC SYNONYM emp

  FOR scott.emp;

Sequence

Otomatik olarak artan sayılar üretmek için kullanılır.

 CREATE SEQUENCE seq_supplier
MINVALUE 1
MAXVALUE 999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 20;

  INSERT INTO (seq_supplier.NEXTVAL, …)

Transaction Nedir?

Daha küçük parçalara ayrılamayan en küçük işlem yığınına Transaction denir.

Geçerli kabul edilmesi bir dizi işlemin tamamının yolunda gitmesine bağlı durumlarda transaction kullanılır.

Transaction bloğu ya hep ya hiç mantığı ile çalışır. Ya tüm işlemler düzgün olarak gerçekleşir ve geçerli kabul edilir veya bir kısım işlemler yolunda gitse bile, blok sona ermeden bir işlem bile yolunda gitmese hiçbir işlem olmamış kabul edilir.

Bir transaction COMMIT işlemi ile tamamlanır. Eğer ROLLBACK işlemi uygulanırsa tüm transaction işlemleri geri alınır.

Transaction Neden Gerekli?

Örneğin; bir havale işleminde, havale yapanın hesap bilgilerinden havale yaptığı miktar düşüldükten sonra, elektrik kesintisi, donanımsal veya yazılımsal bir arıza nedeniyle alıcının hesabına bu miktar eklenemez ise; gönderenin hesabından düşülen paranın iade edilmesi gerekir.

Aksi halde bu paranın sahibinin kimliği kaybedilmiş olur. Bu da sistemin olası haller dışında veri kaybetmeye müsait bir durumda olması demektir. Bu tür aksaklıklar transaction kavramı sayesinde kontrol altına alınır.

Transaction Örneği

UPDATE savings_accounts

SET balance = balance – 500

WHERE account = 3209;

UPDATE checking_accounts

SET balance = balance + 500

WHERE account = 3208;

INSERT INTO journal VALUES (journal_seq.NEXTVAL, ‘1B’, 3209, 3208, 500);

COMMIT;

Kullanıcı Yaratma

Kullanıcı yaratma CREATE USER komutu ile yapılır. Bu komutu çalıştırma yetkisi genellikle DBA yada güvenlik yöneticisi olan kişilerde vardır.

CREATE USER ÖZLEM

IDENTIFIED BY A853B

DEFAULT TABLESPACE USERS

TEMPORARY TABLESPACE TEMP

PROFILE DEFAULT;

Kullanıcının Tanımlarını Değiştirm

Tüm nesne tanımlarının değiştirilmesinde olduğu gibi kullanıcıların da (kullanıcılar da bir nesnedir) tanımlarını ALTER komutu ile değiştirebiliriz.

Aşağıdaki komut ÖZLEM kullanıcısının şifresini değiştirir:

         ALTER USER ÖZLEM IDENTIFIED BY XY358;

Kullanıcıyı Silme

Diğer nesnelerde olduğu gibi kullanıcı silmede de DROP komutu kullanılır:

DROP USER ÖZLEM;

Eğer kullanıcının şeması altında nesneler varsa bu nesnelerin de silinmesi için CASCADE ifadesi kullanılmalıdır:

DROP USER AHMET CASCADE;

Sistem Yetkileri

Kullanıcıların sistemde neler yapabileceklerini sınırlayan tanımlamalara sistem yetkileri denir.

Bir kullanıcı ilk yaratıldığı anda hiçbir yetkisi yoktur.

Sisteme bağlanabilmesi için CREATE SESSION yetkisinin kullanıcıya verilmesi gerekir:

GRANT CREATE SESSION TO ÖZLEM;

GRANT komutu ile aynı anda birden çok yetki birden çok kullanıcıya verilebilir:

GRANT CREATE TABLE, UNLIMITED TABLESPACE TO ÖZLEM, YAĞMUR;

Sistem Yetkileri çok fazladır, hepsinin ezbere bilinmesinin gereği yoktur. İsminden yetkinin ne olduğu konusunda çıkarım yapılabilir. Eğer yetki isminde “ANY” sözcüğü geçiyorsa farklı şemalar üzerinde işlem yapabilme yetkisi olduğunu gösterir.

CREATE TABLE: Kullanıcının sadece kendi şeması üzerinde tablo oluşturma yetkisi.

CREATE ANY TABLE: Kullanıcının tüm şemalar üzerinde tablo oluşturma yetkisi.

Verilen Yetkilerin Geri Alınması

Kullanıcılara verilen yetkilerin geri alınması REVOKE komutu ile gerçekleştirilir:

REVOKE CREATE TABLE FROM ÖZLEM;

Nesne Yetkileri

Bir kullanıcının veri tabanındaki nesneler üzerinde ne tür yetkileri olduğunu tanımlamak için kullanılan yapıya nesne yetkisi denir.

Bir kullanıcı kendi yarattığı tablolar üzerinde SELECT yetkisine sahiptir, fakat başka şemalardaki tablolar üzerinde SELECT sorgusu yapabilmesi için gerekli yetkinin verilmesi gerekir.

GRANT yetkiler [(sütunlar)]

ON nesneler

TO kullanıcılar [roller] [PUBLIC];

Nesne Yetkisi Verme

MEHMET kendisine ait olan PERSONEL tablosu üzerinde SELECT sorgusu yapma yetkisini AHMET’e vermek isterse:

GRANT SELECT ON PERSONEL TO ÖZLEM;

ÖZLEM kendisine ait olan OGRENCILER tablosunun sadece ADI ve SOYADI alanları üzerinde UPDATE yapma yetkisini YAĞMUR’e vermek isterse:

GRANT UPDATE (ADI, SOYADI) ON OGRENCILER TO YAĞMUR;

Rol

Rol, birçok yetkinin bir araya getirilmesi ile oluşan yetki gruplarına verilen isimdir.

Bir rol kendi içinde başka rolleri de içerebilir.

Örneğin Oracle 11g’de DBA Rolünün;

–16 Rolü

–202 Sistem Yetkisi

–284 Nesne Yetkisi

  vardır.

* OracleEnterpriseManager üzerinden görülebilir.

Rol Yaratma

Rol de bir nesne olduğu için CREATE komutu ile yaratılır. Fakat diğer nesnelerden farklı olarak, yaratan kullanıcının şeması altında bu roller görünmez (rol bir kişiye ait değildir).

CREATE ROLE DENEME;

GRANT CREATE TABLE, CREATE VIEW, UNLIMITED TABLESPACE TO DENEME;

GRANT DENEME TO AHMET;

GRANT DENEME TO ALTAN WITH ADMIN OPTION;

SYSDBA ve SYSOPER Sistem Yetkileri

SYSDBA: Bu yetki ile veritabanına bağlanan kullanıcı tüm işlemleri yapabilme iznine sahip olur. Bunlardan bazıları:

–STARTUP ve SHUTDOWN işlemlerini gerçekleştirir.

–CREATE DATABASE (Veritabanı yaratma)

–ALTER DATABASE: open, mount, back up, karakter seti değiştirme

–CREATE SPFILE (Sistem Parametre Dosyası yaratma)

–ARCHIVELOG ve RECOVERY

SYSOPER: Bu yetki ile veritabanına bağlanan kullanıcı temel işletim görevlerini yapma iznine sahip olur, fakat kullanıcı verilerini göremez.

–STARTUP ve SHUTDOWN işlemlerini gerçekleştirir.

–ALTER DATABASE: open, mount, back up

–CREATE SPFILE (Sistem Parametre Dosyası yaratma)

–ARCHIVELOG ve RECOVERY

SYS ve SYSTEM Kullanıcıları

SYS kullanıcısı tüm veri tabanının ve veri sözlüğünün sahibidir. Sisteme giriş yaparken AS SYSDBA eki ile bağlanır. Sahip olduğu SYS şeması üzerinde değişiklik yapılmamalıdır.

SYSTEM kullanıcısı veri sözlüğü dışında başka idari işler ile ilgili tabloları ve görünümleri sağlayan SYSTEM şemasının sahibidir. Sisteme Normal kullanıcı olarak giriş yapar.

SYS şemasının nesnelerine erişme yetkisi olan roller

SELECT_CATALOG_ROLE:Kullanıcılara veri sözlüğü görünümleri üzerinde sorgu yapma yetkisi verir.

EXECUTE_CATALOG_ROLE:Kullanıcıların veri sözlüğü üzerinde paket (package) ve prosedür yürütme yetkisi olmasını sağlar.

DELETE_CATALOG_ROLE:Sistem izleme (audit) tabloları olan SYS.AUD$ ve SYS.FGA_LOG$ tablolarında silme yetkisi verir.

Trigger (Tetikleyici)

Bir veri tabanında belirli bir tabloda değişiklik olduğunda otomatik olarak bir işlemi başlatan bir dizi SQL ifadesidir.

Bir trigger bir olaydan (insert, delete ya da update ifadelerin belirtilen tabloda oluşması) ve bir hareketten (ilgili prosedür) oluşur.

Örneğin; personel tablosundan bir kaydın silinmesi olayı gerçekleştiğinde, eski_personel tablosuna personelin numarasını ve işten ayrılma tarihini belirtmek için o anki tarihi kaydeden bir prosedür yazılması ile bir tetikleyici oluşturulabilir.

Trigger Yaratma

CREATE [or REPLACE] TRIGGER TriggerName

[ BEFORE | AFTER ]

 [ DELETE | INSERT | UPDATE [of ColumnName ] ]

ON [User.]TableName

[ FOR EACH ROW ] [ WHEN Condition ]

BEGIN

 [PL/SQL Block]

END ;

BEFORE / AFTER:DML ifadesinden önce / sonratetikle

FOR EACH ROW: Etkilenen her satır için tekrar tetikle

WHEN: Tetikleyiciye koşul ekler

Trigger Örneği

Ekran Alıntısı1

StoredProcedure (Saklı Yordam)

StoredProcedure’ler veritabanında saklanan ve gerektiğinde ismi ile çağrılabilenPL/SQL bloklarıdır.

Değer döndüren prosedürlere fonksiyon (function) denir.

Önceden derlenmiş olduğu için, normal kullandığımız bir SQL sorgusunun tekrar tekrar çalıştırılmasına nazaran daha fazla performans elde etmemizi sağlarlar.

Server üzerinde tutulduğundan, yükü istemci tarafına değil de, sunucu tarafına yükleyerek programımızın performansını arttırır. (Elbette ki bu bir seçimdir. Sunucunuz güçlüyse bu seçimi tercih edebilirsiniz.)

Bir kez yazılıp, tekrar tekrar kullanıldığı için modüler bir yapıda program geliştirmiş oluruz.

Aynı PL/SQL ifadesini birden fazla yerde kullanacağımız zaman, bunu bir saklı yordam haline getirerek, kullanımını sadece ismini çağırma ile gerçekleştirebiliriz.

Belirli girdi ve çıktı parametreleri olduğu için, saklı yordamların kullanımı ile güvenlik açısından kendimizi sağlama almış oluruz.

Ağ trafiğini azaltır. İstemci tarafından birçok satıra sahip SQL komutunun sunucuya gitmesindense, sadece saklı yordamın adının sunucuya gitmesi ağı daha az meşgul etmiş olur.

CREATE PROCEDURE para_yatirma

(hes_no IN NUMBER, miktar IN NUMBER) AS

BEGIN

  UPDATE hesaplar

  SET bakiye = bakiye + miktar

  WHERE hesap_no = hes_no;

END;

DROP ve ALTER

Yaratılan nesnelerin silinmesi için DROP, nesneler üzerinde değişiklik yapmak için ALTER komutları kullanılır.

Tablo silme:

DROP TABLE ALTAN.PERSONEL;

Tabloya yeni kolon ekleme:

ALTER TABLE OGRENCI ADD (TCNO VARCHAR2(11));

Tablodaki SOYAD kolonunun veri türünü değiştirme:

ALTER TABLE OGRENCI MODIFY (SOYAD VARCHAR2(25));

Tablodan kolon silme:

ALTER TABLE DROP COLUMN TCNO;

PERSONEL’deki bölüm alanını BOLUMLER’deki BOLUM_NO alanına ilişkilendirme:

ALTER TABLE PERSONEL ADD CONSTRAINT per_bölüm_fk

FOREIGN KEY(BOLUM) REFERENCES BOLUMLER(BOLUM_NO);

Bir sonraki makalede görüşmek dileğiyle 🙂

SQL Server Integration Services

SSIS (SQL Server Integration Services), bir veri kaynağından verilerin alınıp üzerinde istediğiniz  tüm işlemleri yapıp , başka bir veri kaynağına aktarmanızı sağlayan araçtır. Verilerinizi Sql den Text Dosyasına, Excelden Sql e gibi birçok platform arasında taşıyabilirsiniz. Yeni bir SSIS paketi oluşturmak için Sql Server’ımızla kurulan Business Intelligence Development Studio‘yu kullanıyoruz.  SSIS’le ilgili birçok tanım ve açıklama bulabilirsiniz ama ben daha örneklerle anlatmak istiyorum.

İlk örneğimizde Text Dosyası ile Sql Server arasında veri transfer etmeyi göstereceğim.Sql tablomuzdan verilerimizi Text dosyamıza aktaracağız.  Öncelikle Sql Server Business Intelligence Development Studio’ muzu açalım. File/New Project diyelim. “Integration Service projecti” seçelim. Solution Explorer penceresinden “SSIS Packages”in üstüne sağ tıklayıp “SSIS Import end Export Wizard”ı seçelim.

1

Ekranımız şekildeki gibi açıldı. Toolbox penceresinden DataFlow Task sürükleyip bırakıyoruz.

2

 

DataFlow Task bileşenine çift tıkladığınız zaman Toolbox’ın değiştiğini farkedeceksiniz.

Bir text dosyasından SQL database içine veri taşıyacağımız için FlatFile Destination ve ADO.Net Source kontrollerini kullandım.

3

 

Şimdilik kontrollerin bağlantı ayarlarını yapmadığım için kırmızı işareti görmekteyiz.

Şimdi Sırayla kontrollere çift tıklayalım ve conneciton ayarlarımızı yapalım.

Ekrandaki gibi FlatFile Connection Manager’a New diyerek yeni bir conneciton oluşturuyoruz.

ADO.Net Source üzerine tıklıyoruz. Connection Manager’dan New diyerek yeni bir bağlantı oluşturuyoruz.

4

 

Columns kısmında columnları görebiliriz.

5

ADO.NET Source Kontolümüzün ayarlarını yaptık. Şimdi Flat File Destination kontrolüne tıklıyoruz. New Connection diyerek yeni bir con. oluşturuyoruz.

6

Yalnız Column names in the first data row seçeneğinin seçili olduğundan emin olun. Böylece text dosyamızın ilk satırını column adları olarak aldık.

Columns kısmına tıklayarak Columnlarımızın özelliklerini belirleyebiliyoruz. Ben şimdilik verilerin ‘,’ ile ayrılamasını istediğim için column delimiter özelliğini

Comma {,} olarak ayarlıyorum. Advanced ile columlarımızın veri tiplerini ve genişliklerini ayarladıkların sonra sıra geldi paketimi çalıştırmaya. F5 🙂

Captureson

Yeşil yandığını ve 7 kayıt eklendiğiniz gördük. Böylece paketimiz çalışmış oldu. Diğer makalelerimde görüşmek üzere. Sağlıcakla kalın 😉

 

Sürgün Ülkeden Başkentler Başkentine

Sezai Karakoç’un mükemmel şiiri..

images

Senin kalbinden sürgün oldum ilkin
Bütün sürgünlüklerim bir bakıma bu sürgünün bir süreği
Bütün törenlerin şölenlerin ayinlerin yortuların dışında
Sana geldim ayaklarına kapanmaya geldim
Af dilemeye geldim affa layık olmasam da
Uzatma dünya sürgünümü benim
Güneşi bahardan koparıp
Aşkın bu en onulmazından koparıp
Bir toz bulutu gibi
Savuran yüreğime
Ah uzatma dünya sürgünümü benim
Nice yorulduğum ayakkabılarımdan değil
Ayaklarımdan belli
Lambalar eğri
Aynalar akrep meleği
Zaman çarpılmış atın son hayali
Ev miras değil mirasın hayaleti
Ey gönlümün doğurduğu
Büyüttüğü emzirdiği
Kuş tüyünden
Ve kuş sütünden
Geceler ve gündüzlerde
İnsanlığa anıt gibi yükselttiği
Sevgili
En sevgili
Ey sevgili
Uzatma dünya sürgünümü benim

Bütün şiirlerde söylediğim sensin
Şuna dedimse sen Leyla dedimse sensin
Seni saklamak için görüntülerinden faydalandım Salome’nin Belkıs’ın
Boşunaydı saklamaya çalışmam öylesine aşikarsın bellisin
Kuşlar uçar senin gönlünü taklit için
Ellerinden devşirir bahar çiçeklerini
Deniz gözlerinden alır sonsuzluğun haberini
Ey gönüllerin en yumuşağı en derini
Sevgili
En sevgili
Ey sevgili
Uzatma dünya sürgünümü benim

Yıllar geçti sapan olumsuz iz bıraktı toprakta
Yıldızlara uzanıp hep seni sordum gece yarılarında
Çatı katlarında bodrum katlarında
Gölgendi gecemi aydınlatan eşsiz lamba
Hep Kanlıca’da Emirgan’da
Kandilli’nin kurşuni şafaklarında
Seninle söyleşip durdum bir ömrün baharında yazında
Şimdi onun birdenbire gelen sonbaharında
Sana geldim ayaklarına kapanmaya geldim
Af dilemeye geldim affa layık olmasam da
Ey çağdaş Kudüs (Meryem)
Ey sırrını gönlünde taşıyan Mısır (Züleyha)
Ey ipeklere yumuşaklık bağışlayan merhametin kalbi
Sevgili
En sevgili
Ey sevgili
Uzatma dünya sürgünümü benim

Dağların yıkılışını gördüm bir Venüs bardağında
Köle gibi satıldım pazarlar pazarında
Güneşin sarardığını gördüm Konstantin duvarında
Senin hayallerinle yandım düşlerin civarında
Gölgendi yansıyıp duran bengisu pınarında
Ölüm düşüncesinin beni sardığı şu anda
Verilmemiş hesapların korkusuyla
Sana geldim ayaklarına kapanmaya geldim
Af dilemeye geldim affa layık olmasam da
Sevgili
En sevgili
Ey sevgili
Uzatma dünya sürgünümü benim

Ülkendeki kuşlardan ne haber vardır
Mezarlardan bile yükselen bir bahar vardır
Aşk celladından ne çıkar madem ki yar vardır
Yoktan da vardan da ötede bir Var vardır
Hep suç bende değil beni yakıp yıkan bir nazar vardır
O şarkıya özenip söylenecek mısralar vardır
Sakın kader deme kaderin üstünde bir kader vardır
Ne yapsalar boş göklerden gelen bir karar vardır
Gün batsa ne olur geceyi onaran bir mimar vardır
Yanmışsam külümden yapılan bir hisar vardır
Yenilgi yenilgi büyüyen bir zafer vardır
Sırların sırrına ermek için sende anahtar vardır
Göğsünde sürgününü geri çağıran bir damar vardır
Senden ümit kesmem kalbinde merhamet adlı bir çınar vardır
Sevgili
En sevgili
Ey sevgili

Scrum

Scrum; 1990 yılının başlarında geliştirilen Çevik (Agile) proje yönetim metodolojilerinden biridir..Scrum bir SDLC olmayıp bir Agile Fremework yapısı sunar. Scrum İhtiyaca yönelik ,esnek bir geliştirme sürecidir. Düzenli geribildirim ve kısa dönemli planlamalarla hedefe ulaşmayı sağlar.Scrum’un getirdiği en büyük yeniliklerden birisi, proje ilerlemesini transparant ve devamlı şekilde göstermesidir.Scrum komplex problemlerin çözümlenip yüksek değerli sonuçlar üretilmesidir.

Başarısı kanıtlanmış bir yazılım geliştirme yöntemi olup; Microsoft, Google, Facebook gibi şirketlerde kullanılmaktadır.

Resimde Scrum Yaşam Döngüsü gösterilmiştir.

scrum

Scrum’da Roller

scrum2

Product Owners : Ürün yöneticisidir. Projenin müşteri değerinden ve Product Backlog oluşturulmasından sorumludur. 30 gün veya daha az gün içinde yapılması gerekenleri açıklar.Gereksinimleri belirlerken ekipten gereksinimlerin tahmini süreleri hakkında bilgi alabilir.  Üründeki değeri arttıracak kişidir. Üründeki değerlerin hangi niteliğe göre hayata geçirileceğini belirler.Developer Teams’a ne istediğini bildirmesi gerekir. Bir projede bir Product Owner olur fakat bir Product Owner birden fazla projede yer alabilir.

Development Teams : 30 gün veya daha az süreli projeyi gerçekleştiren ekiptir. Proje gelistirme ekibi 20 kişiden fazlaysa, ekip her biri 5 ila 20 kişiden oluşan küçük takımlara bölünür. Ne üretileceğine Product Owner karar verirken nasıl üretileceğine Development Teams karar verir. Self-Organize’dir. Kendi kendini yönetebilir. Takımdaki herkes kendi görevlerini kendisi belirler.

Scrum Master : İşin doğru işlenmesini scrumun doğru çalışmasını sağlar.Diğer rollere destek verir.Daha başarılı çıktı üretilebilmesini sağlar. Ortaya çıkan engellerle uğraşır. Scrum Master’ın hiçbir otoritesi yoktur ama birşeyleri düzelttirmekle görevlidir.Scrum Master takımın içindeki sorunlara destek olur direkt çözmez. Çünkü takım self-org. olmalı kendi sorunlarını kendisi çözmeli. Scrum Master sıkıntıları dışarıdan görüp bunları çözmek için ekibi tetikleyen kişidir. Scrum Master sprint süresince takımdan sorumludur.

Scrum Zaman Planlaması

Release planning meeting : Proje hayat süresinin ilk safhasında yapılır. Sürüm planlama toplantısıdır. Geliştirilecek ürün hakkında planlamaların yapıldığı toplantıdır.

Sprint Planning Meeting : Her sprint başlangıcında yapılan toplantıdır.Sprin süresince geliştirilmesi gereken gereksinimler kararlaştırılır.Sprint Backlog hazırlanır. 4+4 süresince 2 asamalı olarak gerçekleştirilir.İlk 4 saatinde Project Owner ve Development Team Product Backlog üzerinde ilişkilendirme yapar.Diğer 4 saatinde Team Sprint için Plan hazırlar.

8 saat için 4 haftalık Sprint, 4 saat için 2 haftalık sprint olması gerekir.

Sprint : Sprint  toplantılarında kararlaştırılan gereksinimlerin geliştirildiği süreç. Takım üyeleri aldıkları görevleri 2-4 hafta arasında yapılan Sprint toplantısına kadar tamamlamaya çalışır.Sprint uzunluğu 30 veya daha kısa sürebilir. 30günü geçemez.

Daily Scrum : Günlük olarak 15 dk süre ile ayakta yapılan toplantıdır. Scrum Master şu soruları sorar.

-Dün ne yatın?

-Bugün ne yapacaksın?

-Yapmayı planladığın işlerinde sorun teşkil edecek durumlar var mı?

Toplantıya takımdan olmayanlar da katılabilir ama sadece dinlerler.

 Her Sprintten sonra 2 toplantı olur.

Sprint Review Meeting : Her Sprint sonunda yapılan sprint değerlendirmesidir. Üyeler çalıştıkları işin hangi kısımlarını tamamlamış hangi kısımlarını tamamlamamış. 4 saat süreli Toplantıdır. Sprint bittiği zaman “Sprint Review” raporu çıkarılır ve ortaya çıkan sorunlar kaldırılır. Sprint içinde biten işler varsa Müşteri veya Müşteri temsilcisine gösterilebilir.

Sprint Retrospective : Sprint Review’in arkasından yapılır. Süreç iyileştirmeleri yapılır. Herkesin katıldığı toplantıdır. Temel 2 soru vardır.

-Bir öneki sprint süresince neler yolunda gitti.

-Bir sonraki sprint için neler geliştirilebilir.

3 saat süreli toplantıdır.

Örnek vermek gerekirse;

“Kaliteyi nasıl arttırabiliriz?

Sprint uzunluklarını nasıl ayarlayabiliriz?

Taım içi iletişim problemi var sorunu çözelim.

Product Owner telefonlarına cevap vermiyor ne yapabiliriz 🙂 ” gibi,,

Scrum Süresince Kullanılan Araçlar 

Procut Backlog : Öncelik sırasına göre listelenmiş olan ihtiyaçların tutulduğu listedir. Herbir hitiyacın özelliği,amacı,detayları ve maaliyeti belirlenir. Product Backlog istek dokumandır. Bu listedeki herbir işe PBI denir. PBI (Product Backlog Item) bir üründe olması gereken herşey bu listede yer alır. Product Owner bu PBI ların nekadarının yapılacağına karar verir. Development Team istediklerini de listeye ekleyebilir. Product Backlog sürekli değişebilen yaşayan bir süreçtir. Bu listede fibonacci sayılarına göre(1 3 5 8 13 21….) iş yükü belirlenir.

Sprint Backlog : Bir sprint boyunca geliştirilmesi gereken gereksinim ve fonksiyonların bulunduğu listedir.Belirli bir plan ortaya çıktıktan sonra o planda yapılacak olan işlerin olduğu liste ortaya çıkar. Listedeki işler için 4 haftalık sprintler ortaya çıkar.

Release Burndown(Kalan gereksinimler-Geçen zaman grafiği) : Product Backlog içindeki tüm gereksinimler grafikte dikey olarak yazılır. Sprint bittikten sonra yatay bölüm biten gereksinimler ile güncellenir.

Sprint Burndown : Kalan gereksinimler-geçen zaman grafiğidir. Bunun Release’den farkı sadece 1 sprint için geçerli olmasıdır. Sprint boyunca takım üyeleri kalan saat-gün hakkında bilgi verirler. Grafik bu bilgilere göre güncellenir.

Scrum içinde yayınlandı

WPF Binding işlemi

Merhaba Yazılım Severler, Uzun bir aradan sonra tekrardan makale yazmaya başlamış bulunuyorum.
Bu makalemde WPF Bindig ile bir örnek yapacağız.Bunun için yine Nortwind Veritabanını kullanacağım.
WPF Binding, Kullanıcı arayüzü ve arayüz elemanları ile verinin birbirine bağlanmasına ve arayüz elemanları ile verinin birlikte uyumlu çalışmasına olanak sağlayan bir yapıdır.Binding ile data üzerinde yapılan bir değişiklik, bu datalara bağlı kontrollerin bu değişikliğe göre değişmesini sağlar.

Şöyle örnek vereyim. Bir sınıf oluşturdunuz. Bu class elemanlarını projesinizin UI’ında button,grid diye kontrollere bind ettiniz, eğer kontroller üzerine bir değişiklik

yapılırsa(veri ekleme,silme vs.) yaptığınız değişiklik class ınızın o kontrole bind edilmiş üyelerini ve o üyeye bağlı tüm kontrollerin ve işlemlerin değerlerini değiştirir.

Öncelikle Visual Stduio’dan projemizi oluşturuyoruz.

Capture1
Şimdi projenizin App.Config Dosyasına şu eklemeleri yapıyoruz.

<?xml version=”1.0″ encoding=”utf-8″ ?>

<configuration>

  <connectionstrings>

<add connectionstring=”Data Source=XXXSQLServer ; User Id=XXX; Password=XXX;  Initial Catalog=Pubs;name=”XXX”/>

</connectionstrings>

</configuration>

 

DataSource UserName ve password alanlarını bilgisayarınızın SQL ayarlarına göre doldurunuz.

Şimdi MainWindow.xaml kısmını açıyoruz ve aşağıdaki NameSpaceleri ekliyoruz.
using System.Configuration;
using System.Data;
using System.Data.SqlClient;

Namespaceleri ekledikten sonra UI kısmında controllere classımızdaki değerleri bind ediyoruz ve  kod kısmında da Database kodlarımızı yazıyoruz.

<datagrid  height="400" width="350" name="grdEmployee">
    <datagrid.columns>
        <datagridtextcolumn binding="{Binding FirstName}" width="100" header="First Name"/>
        <datagridtextcolumn binding="{Binding LastName}" width="100" header="Last Name"/>
        <datagridtextcolumn binding="{Binding Salary}" width="100" header="Salary"/>
    </datagrid.columns>
</datagrid>

 

public MainWindow()
{ 
    InitializeComponent();
    FillDataGrid(); 
}

private void FillDataGrid()
{ 
    string ConString = ConfigurationManager.ConnectionStrings["ConString"].ConnectionString;
    string CmdString = string.Empty;
    using (SqlConnection con = new SqlConnection(ConString))
    {
        CmdString = "SELECT emp_id, fname, lname, hire_date FROM Employee";
        SqlCommand cmd = new SqlCommand(CmdString, con);
        SqlDataAdapter sda = new SqlDataAdapter(cmd);
        DataTable dt = new DataTable("Employee");
        sda.Fill(dt);
        grdEmployee.ItemsSource = dt.DefaultView; 
    }  
}

ve DataGridimiz şekildeki gibi geliyor.
Capture3

 

Yine Binding işlemine başka bir örnek vermek gerekirse; aşağıdaki sınıfımızın IU kısmında nasıl set edildiğine bakabilirsiniz.

using System.ComponentModel;
using System.Collections.ObjectModel;

public class User
{
string firstName;
public string FirstName
 {
get{return firstName;}
set {firstName = value;
NotifyPropertyChanged(“FirstName“);
 }
}

string lastName;
public string LastName
{
get { return lastName; }
set { lastName = value;
NotifyPropertyChanged(“LastName”); }
}
string country;
public string Country
 {
get { return country; }
set { country = value;
NotifyPropertyChanged(“Country”);
 }
}

public event PropertyChangedEventHandler PropertyChanged;
 protected void NotifyPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
 {
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
 }
 }

UI ısmını inceleyecek olursak;

MainPage.xaml

<Grid>
<DockPanel x:Name=“userNameDocpanel” >
    <TextBlock DockPanel.Dock=“Top”
    <TextBlock VerticalAlignment=“Center”>First Name</TextBlock>
    <TextBlock Text=“{Binding Path=FirstName}”></TextBlock>
    <TextBlock VerticalAlignment=“Center”>Last Name</TextBlock>
    <TextBlock Text=“{Binding Path=LastName}”></TextBlock>
   <TextBlock VerticalAlignment=Center”>Country</TextBlock>
<TextBlock Text=“{Binding Path=Country}”></TextBlock>
</TextBlock>

<ListBox ItemsSource=“{Binding}” IsSynchronizedWithCurrentItem=”True” Height=“271”>
    <ListBox.ItemTemplate>
<DataTemplate>
    <TextBlock>
   <TextBlock Text=”{Binding Path=FirstName}”></TextBlock>
    <TextBlock Text=”{Binding Path=LastName}”></TextBlock>
   <TextBlock Text=”{Binding Path=Country}”></TextBlock>
</TextBlock>
    </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
</DockPanel>
</Grid>

Göründüğü gibi class üyelerimizi controllere set ettik.

Bir diğer makalede görüşmek üzere. Size bir yazılımcı atasözü :

“Dünyayı düzeltmeye çalışıyorum ama kaynak kodlarını bulamıyorum”

WPF içinde yayınlandı

Ramazan Bayramı’mız

ramazan,bayrami.51 Geldik yine bir Ramazan Bayramına daha. Şükürler olsun kavuşturana.

Bayramları çok severim. Neden biliyor musunuz?
Bayramlar umuttur, berekettir, özlemdir. Bir sıcak mesaj bile kapatır mesafeleri. Dargınlar barışır, hasretler giderilir, dertler unutulur… En çok yaşlılar bekler Bayramı. Gözleri umutla evlatlarını, torunlarını arar. Bayramlar umuttur. Hastahane köşesinde nice acılarla kıvranan insanlar. Engelliler,Sakatlar, Kanser-Verem Hastaları.. belki de çoğu hayattan ümidini kesmiştir. Onlar içindir yine bayram. Bir nebze de olsa sıkıntılarını unutmaları için.

Hele ki yetim çocuklar. Bayramlar başta onların olmalı. Başını okşayacak, kanat verecek anne veya babalarının olmaması, aile ortamı özlemi. Şu zorlu hayatta kanatsız kuş misali.

Bir de Gurbetlik çekenler.. Ailesinden sevdiklerinden ya da vatanından ayrı içlerinden hasretler Bayramı geçirenler.. Peki ya Şehit aileleri, yakınlarını kaybeden insanlar velhasıl..

Yine de herşeye rağmen, hayata sımsıkı tutunmalı insan. En kusursuz cinayet insanın yaşama sevgisini öldürmektir. Bu bayram da en çok onları sevindirelim..
Yaşlıları, hastaları, yetim çocukları..

Peki ya ülkemizin içinde buluduğu durumlar ? Mısır ve Suriyeli kardeşlerimizin durumları?

Hangi ideoloji, hangi inanç,hangi dil, hangi kültür, hangi takımdan olursa olursa tüm insanlar arasındaki dostluk bağını güçlendirir bayramlar. Bu bayramı da kalplerde yaşamalı ve duları da esirgememeli.

Canlar cananı Peygamber Efendimizin(S.A.V)’in güzel bir hadisi ile bitireyim.
Ramazan Bayramı sabahı melekler yollara dökülür ve şöyle seslenirler : “Ey Müslümanlar topluluğu! Keremi bol olan Rabbinizin rahmetine koşunuz. O, bol iyilik ve ihsanda bulunur. Sonra onlara bol bol mükâfatlar verilir. Siz gece ibadet etmekle emrolundunuz ve emri yerine getirdiniz. Gündüz oruç tutmakla emrolundunuz, orucu tuttunuz ve Rabbinize itaat ediniz, mükâfatınızı alınız.”

Hep bir arada, sevgi dolu ve huzurlu nice bayramlar geçirmek dileğiyle 🙂