14 Temmuz 2010 Çarşamba

Steve Jobs, Apple, Yöneticilik – (Mükemmeliyetçilik)

  • Ödün vermeyin. Jobs’ın mükemmellik takıntısı gerçekten harika ürünler çıkaran eşsiz bir geliştirme süreci yaratmıştır.
  • Başkalarıyla konuşun. Jobs ürünün nasıl çalışacağını tasarım süreci sırasında tam olarak belirler.
  • Herkesi dahil edin. Tasarım sadece tasarımcıların işi değildir. Mühendisler, programcılar, ürün yöneticileri ve pazarlama yetkilileri bir ürünün nasıl çalışacağını belirleyebilir.
  • Seri bir süreçten kaçının. Jobs prototip ürünleri bir ekipten diğerine değil, ekipler arasında sürekli dolaştırır.
  • Zorlama çözümler üretmeyin. Jobs bilinçli bir şekilde “kullanıcı dostu” bir ürün tasarlamaya çalışmaz. Bu “dostluk” tasarım sürecinde ortaya çıkar.
  • Malzemelere saygı duyun. iMac plastikten, iPhone ise camdan yapıldı. Bunların biçimleri yapıldıkları malzemeye göre şekillenmektedir.
  • A Sınıfı oyuncularla veya adaylarıyla çalışın. Yetenekli personel sizi rakiplerin önüne geçiren bir rekabet avantajıdır.
  • En yüksek kaliteyi arayıp bulun. İnsanlar, ürünler ve reklam dahil.
  • İnsana yatırım yapın. Jobs Apple’a geri döndükten sonra ürünleri iptal ederken bir çok projeyi “steve’ledi” (rafa kaldırdı) ama en iyi insanları elinde tuttu.
  • Küçük ekipler halinde çalışın. Jobs, odaklanamayacaklarından ve yönetilemeyeceklerinden dolayı yüzden fazla kişiden oluşan ekiplerden hoşlanmaz.
  • “Evet efendimci” insanları dinlemeyin. Tartışma ve atışmalar yaratıcı düşünmeyi besler. Jobs, birlikte çalıştığı insanların kendi fikirlerine meydan okumalarını ister.
  • Düşünsel savaşlara girin. Jobs kararları fikir hakkında savaşarak alır. Bu zor ve çaba gerektiren ama özenli ve etkili bir yöntemdir.
  • Ortaklarınızı özgür bırakın. Jobs yaratıcı ortaklarına geniş bir hareket alanı verir.
Deniz KILINÇ

13 Temmuz 2010 Salı

AppDomain Sınıfı ile Müşteri İhtiyaçlarının, Dinamik Kod Üretilerek Karşılanması

Günümüz iş uygulamalarında, artan ihtiyaçlar doğrultusunda yazılım geliştiriciler olarak bizler, ihtiyaçları karşılamak için pek çok farklı tasarım modellerini hayatımıza sokmak zorunda kalıyoruz. Bu modellerden son zamanlarda en popüler olanı ise .Net altyapısını kullanarak CodeDom sınıfı ile dinamik kod üretip, üretilen kodun uygulamada dinamik çalıştırılmasıdır. Böylece, müşteriden müşteriye değişen ihtiyaçlar nedeniyle, parametrik yapılarla uygulamanın çatısını bozabilecek seviyeye gelebilen değişikliklerin önüne geçmiş oluyoruz.
Peki, CodeDom sınıfını kullansak da kullanmasak da, bir şekilde dinamik oluşturduğumuz kodu çalıştırmak istediğimizde ne gibi problemlerle karşılaşırız?
.Net altyapısında dinamik oluşturulan dosyalar, aynı uygulama tarafından bir kez yüklendiğinde bellekten boşaltma şansınız kalmaz.
Eğer uygulamanız özellikle sistem kaynaklarına çok ihtiyaç duyan bir uygulama ise (web uygulaması gibi) bu durumda dinamik oluşturulan kodlarınızı belleğe yükleyip, kullanıp, işiniz bittiğinde de kaldırmak durumunda kalırsınız. İşte tam bu noktada da AppDomain sınıfı devreye girer. AppDomain sınıfı, çalıştırılan uygulamalar için izole bir ortam oluşturmanızı sağlayan diğer bir deyişle .Net uygulamaları ile kendi içerisinde kullandığı .net assembly dosyalarının birbirinden bağımsız çalışmasını sağlayan bir sınıftır. Avantajlarını sıralamak gerekirse;
  • Yüklenen dosyaların bellekten boşaltılmasını sağlar.
  • Dinamik oluşturulan kodlarınız çalıştırıldığında oluşabilecek herhangi bir kararsızlık anında, ana uygulamanız bundan hiç etkilenmeden, yaratmış olduğu AppDomain kopyasını silerek çalışmasına kaldığı yerden devam eder.
Örnek Senaryo ve Kodlaması:
Uygulamanız tarafından belirlenen bir dizin içerisinde oluşturulan dinamik kod dosyalarının yüklenmesi, çalıştırılması ve bellekten atılması…
Burada, “belirlenen bir dizin” in altını çizmek zorundayız çünkü eğer uygulamanız bir web uygulaması ise, çalışma anında “Bin” dizini altında yapılacak herhangi bir dosya işlemi, IIS tarafından izlendiği için uygulamanızın sonlanmasını tetikler. Bunu önlemek için, derlenen dosyaların, yine web uygulamanızın erişebildiği farklı bir dizinde olması gerekmektedir. Böyle bir dizin, yine uygulamanızın kök dizini altında olup, “Bin” dizini ile aynı seviyede olabilir.
AppDomain kullanımı için öncelikle, AppDomainSetup nesnesinden bir kopya yaratmanız gerekir. Sonrasında ise özelliklerinin verilmesi gerekmektedir. Bu sınıfta öne çıkan özellikler aşağıdaki gibidir:
  • ActivationArguments:.Net manifest tabanlı modeli belirler. Uygulamanın bağımlı olduğu dosyalar, güvenlik gereksinimi vs gibi uygulamanın çalışması için gereken bilgileri içerir.
  • ApplicationBase: Uygulamanın bulunduğu dizini gösterir.
  • PrivateBinPath:AppDomain nesnesinin, çalışma anında arama yapacağı dizinleri belirler. “;” ayıraç ile birden fazla dizin verilebilir.
AppDomain.CreateDomain(“HerhangiBirIsim”,AppDomain.CurrentDomain.Evidence,ads);
Burada ikinci parametre için kodu çalıştıran ortamın “Evidence” nesnesi veya “null” değer geçirilebilir. Her iki durumda da, kodu yaratan ortamın kimlik bilgisi kullanılmış olur. Son olarak da, derlenen kodu çalıştırmak için gereken kodun yazılması gerekir.
ICodeExecution execCode = workerAppDomain.CreateInstanceAndUnwrap(fAssemblyNameWithNoExt, String.Concat(fDefaultNameSpace, ".", fClassNameToInvoke)) as ICodeExecution;
execCode.DoExecute(ref executionParams);
Burada CreateInstanceAndUnwarp fonksiyonuna, yaratılan assembly nin dosya uzantısı haricindeki adı ve yaratılacak nesnenin tam adı (bulunduğu isim uzayı [namespace] ve sınıf adı) parametre olarak geçirilir. Dönen nesne ise, her iki “AppDomain” in (kodun çalıştırıldığı ve yaratılan) bildiği bir arayüze tip dönüşümü ile kullanılabilir. Dolayısıyla burada bazı dikkat edilmesi gereken noktalar vardır;
  • Hem derlenen assembly nin referanslarında hem de uygulamamızda kullanılmak üzere hazırlanması gereken bir dll ve bu dll içerisinde tip dönüşümü için kullanacağımız bir arayüz (örn: ICodeExecution) olmalıdır. Bu arayüz üzerinde tanımlı yordam ve özellikler üzerinden “AppDomain” ler arası veri alışverişi gerçekleşir.
public interface ICodeExecution
{
  void
DoExecute(ref object[] executionParams);
}
Ana uygulamadan yaratılan “AppDomain”e çalıştırma anında parametre geçirilmesi gerekiyorsa (örn : object[] executionParams), “Serializable” olarak işaretlenmelidir.
[Serializable]
public
class ExecutionParams
{
private
int result = 0;
public int Value1 { get; set; }
 public int Value2 { get; set; }

public void CalculateResult()
  {
      result = Value1 + Value2;
   }
  public int GetResult()
  {
      return result;
   }
}
  • Ek olarak bu arayüzü kullanan soyut bir sınıfımızın olması dinamik kodlamanın yapılacağı sınıfın altyapısını oluşturmamızı kolaylaştırır. İki farklı “AppDomain” in .Net remoting ile haberleşmesi için gereken tanımlanın bu soyut sınıfta yapılması, dinamik kodlamanın yapılacağı sınıfların da bu soyut sınıftan türetilmesi daha kolay ve hatasız kod oluşumuna olanak sağlar. Dolayısıyla sınıf, MarshalByRefObject nesnesinden türetilmeli ve yukarıda belirtilen ICodeExecution arayüzünü kullanmalıdır.
public abstract class CodeExecution : MarshalByRefObject, ICodeExecution
{
   #region
[_PUBLIC_]
   public CodeExecution() { }
   #region
..ICodeExecution Members..
   public abstract void DoExecute(ref object[] executionParams);
   #endregion
  #endregion
}
Tam kod aşağıdaki gibidir, her iki tarafta kullanılan “ScriptingContracts.dll” içeriği:
public abstract class CodeExecution : MarshalByRefObject, ICodeExecution
{
   #region [_PUBLIC_]
   public CodeExecution() { }
   #region
..ICodeExecution Members..
   public abstract void DoExecute(ref object[] executionParams);
   #endregion
   #endregion
}
public interface ICodeExecution
{
    void
DoExecute(ref object[] executionParams);
}
[Serializable]
public class ExecutionParams
{
  private int result = 0;
  public int Value1 { get; set; }
  public int Value2 { get; set; }
  public void CalculateResult()
  {
    result = Value1 + Value2;
  }
  public int GetResult()
  {
    return result;
 
}
}
Uygulamamızda olması gereken çalıştırma kodu:
AppDomain workerAppDomain = null;

try
{
      
AppDomainSetup
ads = new AppDomainSetup();
       ads.DisallowBindingRedirects = false;
       ads.DisallowCodeDownload = true;
      
ads.ActivationArguments =
AppDomain.CurrentDomain.SetupInformation.ActivationArguments;
      
ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
       ads.PrivateBinPath = String.Concat(fCompilationFolder, ";", "Bin");
       workerAppDomain = AppDomain.CreateDomain(fAssemblyNameWithNoExt, AppDomain.CurrentDomain.Evidence, ads);
       ICodeExecution execCode = workerAppDomain.CreateInstanceAndUnwrap(fAssemblyNameWithNoExt, String.Concat(fDefaultNameSpace, ".", fClassNameToInvoke)) as ICodeExecution;
       execCode.DoExecute(ref executionParams);
}
finally
{
       AppDomain
.Unload(workerAppDomain);
}
Tabii ki bu sadece örnek bir kod. Yüklenen assembly içerisinde oluşacak herhangi bir hatanın uygulamamıza zarar vermemesi için try..catch bloğu ile korunması gerekmektedir.
Ali KALFAOĞLU

8 Temmuz 2010 Perşembe

Yıldız Savaşları’ndan Kariyer Öğretileri

Bu ay okuduğum CIO dergisinin yazılarından birisini [1] direk blogda paylaşmak istedim. Aç yaratıklar. Katil canavarlar. Şeytani planlar. Usta Yoda’nın kendisi Circa 2009’u yöneten Bilişim Uzmanı olsa zor zamanlar geçirirdi. Öyleyse biz de Jedi’ların “Kariyer Eğitimine” göz atalım.
Dosya: İşe alım süreci, çalışan kültürü.
Yıldız Savaşları Anı: Cumhuriyet Ordusu, Şeytani Galaktik İmparatorluğu’nun parçası haline gelir ve tüm “klonlar”, “klon davranışları” sergiler. Toplu Jedi katliamı gerçekleşir.
Çıkarılacak Ders: Bireysellik ve girişimcilik, çoğu organizasyonda küçük görülür. Şirketler “Evet adamları” denilen kolonlarla doludur. Başarıya ulaşmanın yolu bu olabilir. “Yakında beni sevmeyi öğreneceksin” – Jabb The Hutt
*****

Dosya: İnsan Kaynakları Yönetimi
Yıldız Savaşları Anı: Jedi konseyi, güvenilmez Anakin’i –ki güce dengeyi getirecek kişidir- Palpatine’in resmi temsilcisi olarak belirler. Galaktik Cumhuriyeti’nin geleceğini yabana atarlar.
Çıkarılacak Ders: “Seçilmiş Kişi” ye, tüm umutları bağlamak ve geleceği onun üstüne kurmak akıllıca bir iş değildir. “Kazanamazsın Darth. Beni öldürsen bile hayal edebileceğinden daha güçlü geleceğim” – Obi Wan Kenobi
******
Dosya: Emeklilik Stratejisi, Başarı Planı
Yıldız Savaşları Anı: Obi Wan eski çırağı Darth Wader’in kendisini öldürmesine izin verir. Vader, onu aşağılarken “Güçlerin çok zayıf yaşlı adam” cümlesini kullanır.
Çıkarılacak Ders: Bazen daha imtiyazlı ve tecrübeli kişiler, takımları için kendilerini feda ederler. Bundan büyük onur olabilir mi?
Yıldız Savaşları Anı: Asiler, İmparatorluğun Ölüm Yıldızı’nın planlarını ele geçirmiştir. Planlarda keşfedilen zayıflık sayesinde, istasyon yok edilir.
Çıkarılacak Ders: Eğer kendinizi “Büyük Projeye” adadıysanız, en kötü ihtimalleri de düşünün ve zayıf yönleri iyi kavrayın.
Referans
1. CIO dergisi sayı 04, Thomas Wailgum, sayfa 48
Deniz KILINÇ

6 Temmuz 2010 Salı

QlikView - Yeni Nesil İş Zekası Aracı

İş zekası kavramının günümüzdeki önemine daha önceki yazılarımızda değinmiştik. Ekonomik koşullar gereği sektördeki firmalar daha az maliyetle daha verimli sonuçlar elde etmek için çalışmalar yapmak durumundadırlar. Kuşkusuz ki bu çalışmaların amacı mevcut karlılığın devamını sağlamak ve kendini farklılaştırarak bir adım öne çıkmaya çalışmaktır. Bu noktada kullanılacak en etkin aracın bilgi olduğu artık tüm operasyonlar tarafından anlaşılmıştır ancak unutulmamalıdır ki, bu bilgiye yetkileri gereği tüm ekibin erişebilmesi ve değerlendirebilmesi çok önemlidir. İşte bu yüzden iş zekası artık bir çok kurum için vazgeçilmez bir noktaya gelmiştir.
İş zekası uygulamaları dediğimizde yakın zamana kadar belirli periyotlarda sınırlı kullanıcı kitlesinin çeşitli raporlara erişerek bazı analizler yapabiliyor olması anlaşılıyordu. Ayrıca bu işlemi yapabilmek için bile gerçekten büyük kaynaklara ihtiyaç vardı. Bununla birlikte gerçekleştirme süresi uzun, bakım işlemi maliyetli ve zor olup, bunlara rağmen sistem oldukça yavaş çalışıyordu.
QlikView, bahsettiğimiz bu geliştirme platformlarında bulunan tüm süreçleri kökten değiştirecek bir yaklaşım sunan yeni nesil iş zekası ürünü olarak tasarlanmıştır. Maliyetli ve büyük kaynaklara ihtiyaç duymadan, diğerlerine göre çok daha kısa sürede geliştirilebilen ve anlık sorgulamalara geleneksel yapılara göre son derece hızlı bir şekilde cevap verebilen bir platformudur.

Neden QlikView?
Son kullanıcıların veriler üzerinde sorgulama, raporlama ve OLAP analizleri yapabilecekleri ve sonuçlarını dashboard ortamlarda görebilecekleri bir platformdur. Bu platformun kolay, kullanışlı ara yüzü ve mimarisindeki bellek içi çağrımsal veritabanı erişimi sayesinde anlık olarak verilere ulaşım son derece rahat ve hızlıdır.
Peki diğer uygulamaların bu kadar maliyetli ve kaynak kullanarak yaptığı QlikView nasıl yapıyor?
  • Bellek içi veritabanı erişimi (In-Memory)
  • Çağrımsal-Bileşik Veritabanı
  • Yüksek veri sıkıştırma oranı
Bellek içi Veritabanı
İş zekası uygulamalarının en büyük problemlerinden biri yapılan işlemlerin uzun sürmesidir. Ancak iş zekasının en önemli amaçlarından biri, yönetimsel birimlerin veriye hızlı bir şekilde ulaşmasını sağlamak ve karar verme mekanizması içerisinde yapılan bu çalışmanın sonuçlarını hemen alabilmektir. QlikView bu noktada geleneksel iş zekası uygulamalarında kullanılan bakış açısını değiştirerek yepyeni bir strateji ile çözüm üretmektedir.
İş zekası uygulamaları için kullanılan veri kümeleri, veri ambarları, OLAP küpleri gibi çok boyutlu bilgi kaynaklarını disk üzerinde saklamak yerine bellekte tutarak geleneksel yavaşlığı tarihe karıştırıyor. Disk üzerinden veri madenciliği yapılabilecek kadar büyük verilerin defalarca okunmak zorunda kalması şüphesiz çok büyük maliyet, kaynak ve zaman kullanımına neden oluyor. Qlikview bu verilerin tümünü belleğe yükleyerek kullanıcıların her türlü sorgulama ve raporlama istekleri karşısında, verilere bellekten direkt erişim sağlayarak verinin büyüklüğüne göre diğer uygulamalara göre binlerce kat hızlı sonuç döndürür. Qlikview’in bu yaklaşımı tercih etmesinin belki de en büyük sebebi de 64 bit teknolojisinin günümüzde gittikçe kullanılır hale gelmesidir. Bu teknoloji sayesinde belleklerin boyutu terabaytlar düzeyine kadar çıkabilmektedir. Ancak Qlikview sadece bu teknoloji gelişimine ayak uydurmakla kalmamış ve kendi geliştirdiği sıkıştırma algoritmasıyla da bellek kullanımını çok daha fazla optimize hale getirmiştir.
Çağrımsal-Bileşik Veritabanı
Qlikview’in bellek içi veritabanı sistemiyle kazandığı hız dışında sistemdeki kullanımı çok yönlü hale getiren bir yapıyı da veritabanı sistemine dahil etmiştir. Çağrımsal-Bileşik veritabanı şeklinde adlandırılan bu sistem kullanılan verilerin içinde yapılan ilk seçimle doğrudan ve dolaylı tüm bağlantıları hafızaya almasıdır. Bundan sonra yapacağı herhangi başka bir seçim için tekrar bu işlemi yapmak zorunda kalmayacaktır. Bir örnek vermek gerekirse; Bir firmanın İzmir’deki satış tutarlarını görmek istediği bir rapor aldıktan sonra İzmir’de bulunan satış temsilcileri, İzmir’de satılan ürünler gibi raporları görmek için tekrar tekrar işlem yapmayacak sadece ekranda görüntülenmesine karar verecektir. Geleneksel sistemlerde örnekteki gibi farklı kriterlerle raporu almak için tüm veriyi baştan okuyup belleğe almak gerekecekti.
Qlikview bu uygulamayı hem veritabanı üzerinde hem de görsel bileşenler üzerinde gerçekleştirmeyi başarmıştır. Bu sayede hem kullanımda hem de gerçekleştirim sırasında kolaylık ve hız kazanmayı sağlamıştır.
Yüksek Veri Sıkıştırma Oranı
Bellek içi veritabanı özelliğinden bahsederken Qlikview’in kendi geliştirdiği bir veri sıkıştırma algoritması olduğunu söylemiştik. İlişkisel veritabanlarında satır bazlı uygulanan sıkıştırma işlemlerine farklı bir açıdan bakarak sütun bazında sıkıştırma işlemi gerçekleştirmiştir. Yapılan bu sütun bazlı sıkıştırma ile ilişkisel veritabanındaki bir veri kümesini %60 ile %85 arasında sıkıştırabilmektedir. Böylesine büyük orandaki bir sıkıştırma ile de çok büyük verilerin hafızaya alınması ve hafızada işlenmesi çok daha kısa sürede gerçekleşir duruma gelmektedir.
Qlikview’in yeni nesil iş zekası olarak görünmesini sağlayan üç önemli başlığı inceledik. Qlikview bunların yanında gerek kullanım kolaylığı sağlamasıyla gerekse geliştirme sürecindeki kompleks yapıyı ortadan kaldırmasıyla kendini geleneksel iş zekası araçlarından ayırmayı başarmış bir ürün olarak karşımıza çıkıyor. Bu yazımızda neden Qlikview’i tercih ettiğimize değindik, sonraki yazılarımızda Qlikview uygulamasını tanımaya başlayacağız.
Mustafa ERŞAHİN

5 Temmuz 2010 Pazartesi

Visual Studio 2008/2010 Add-In (Solution Item’larına Erişim)

Bir önceki makalemizde bir Add-in projesi nasıl yaratılır, ve Add-in projesinde .Net IDE’sine menüler nasıl eklenir, ona değinmiştik. Bu makalemizde de, IDE içerisindeki solution’un tüm itemlarına nasıl erişebileceğimize ve bu itemlara nasıl eklentiler yapabileceğimize değineceğiz.
.Net’in Code modeli sayesinde bir solutiondaki bütün projelere, bu projelerin sınıflarına ve sınıfların içerisindeki propertylerine ve fonksiyonlarına erişilebilir. Aynı zamanda yeni bir sınıf eklenebilir, eklenen yeni sınıflara namespace, import statementleri, değişkenler veya fonksiyonlar gibi birçok kod parçası eklenebilir. Aynı zamanda var olan kodlar üzerinde de değişiklikler yapılabilir.
Solution explorerdaki Herbir Itema Erişim
1. IDE’ye Erişim
Açtığımız .NET IDE’sinin instance’ı Add-in projesi içerisindeki OnConnection methoduna geçen ilk parametredir.
public void OnConnection(object application, ..........
Bu parametre OnConnection metodu içerisinde genel bir property’e set edilerek class seviyesinden erişilir hale gelmektedir.
_applicationObject = (DTE2)application;
“_applicationObject” nesnesi artık bizim için aktif olan IDE’nin instance’nı göstermektedir.

2. Solution’a Erişim
“_applicationObject” nesnesinin, solution property’sinden solutiona aşağıdaki gibi erişilebilir.
Solution2 soln = (Solution2)_applicationObject.Solution;
3. Projelere Erişim
Solution içerisindeki her bir projeye, solution nesnesinin Projects propertysinde dönülerek erişilir.
foreach (Project project in soln.Projects){}

Her bir “project” nesnesi, Project tipinde olup solution içerisindeki projelere denk gelmektedir.
4. Proje İçerisindeki Itemlara Erişim
Proje içerisindeki herhangi bir klasör, text dosya,image vb. şeylere erişim için aşağıdaki gibi bir döngü kullanılabilir.
foreach (ProjectItem item in prjItem.ProjectItems) {}
Eğer proje içerisindeki bütün sınıf yapılarına (class’lara) erişilecekse, aşağıdaki örnekte olduğu gibi projenin CodeModel property’si üzerinde gidilerek CodeElementlere erişilebilir.
CodeModel codemodel = project.CodeModel;
if (codemodel == null) return null;
CodeElements elements = codemodel.CodeElements;
var elems = elements.OfType<CodeElement>().Where(c => c.Kind == vsCMElement.vsCMElementClass).Select(x => x.Name).Distinct().ToArray();
Bir Projeye Namespace, Class , Method Ekleme
1. Namespace Ekleme
Aşağıdaki örnek, “project” adındaki projeye “Deneme.cs” adında bir kod dosyası, bu kod dosyasına da “Ornek.DenemeNameSpace” adında bir namespace eklemektedir.
CodeNamespace nameSpace = project.CodeModel.AddNamespace(@"Ornek.DenemeNameSpace",@"C:\Ornek\Deneme.cs",0);
“AddNameSpace” methodunun ilk parametresi namespace adını, ikinci parametresi kod dosyasının dosya yolunu, üçüncü parametresi kod dosyası içerisindeki yerini belirtir.
2. Class Ekleme
Aşağıdaki örnek, “nameSpace” adındaki namespace’e “Deneme” adında bir sınıf eklemektedir.
CodeClass2 c = (CodeClass2)nameSpace.AddClass("Deneme", 0, null, null, vsCMAccess.vsCMAccessPublic);
“AddClass” metodunun ilk parametresi sınıfın adını, ikinci parametresi eklendiği kapsamdaki yerini, üçüncü parametresi alt sınıf adını, dördüncü parametre implement ettiği interface adını, beşinci parametre sınıfın erişim tipini belirtir.
3. Method Ekleme
Aşağıdaki örnekte, “cls” adındaki sınıfa “Topla” adında bir metod eklenmiştir. Bu metodun dönüş  tipi integer olarak, metoda erişim tipi ise public olarak verilmiştir.
“AddFunction” metodunun ilk parametresi fonksiyonun adını, ikinci parametresi fonksiyonun tipini, üçüncü parametresi metodun dönüş tipini, dördüncü parametresi eklendiği kapsamdaki yerini, beşinci parametre metodun erişim tipini belirtir.
CodeFunction2 func = (CodeFunction2)cls.AddFunction("Topla",         vsCMFunction.vsCMFunctionFunction, vsCMTypeRef.vsCMTypeRefInt, -1, vsCMAccess.vsCMAccessPublic, null);
EditPoint2 editPoint = (EditPoint2) func.GetStartPoint(vsCMPart.vsCMPartBody).CreateEditPoint();
editPoint.Indent(null, 0);
editPoint.Insert("int x=5;");
editPoint.Indent(null, 0);
editPoint.Insert("int x=8;");
editPoint.Indent(null, 0);
editPoint.Insert("return x+y;");
Eğer fonksiyonun içeriğini eklemek istersek, GetStartPoint metodu ile fonksiyonun gövdesinin ilk başlangıcı alınır. Ve editPoint nesnesinin Insert metodu ile eklenmek istenen kod satırları eklenir.Indent fonksiyonu ile de girinti vererek yazdığımız kodu satır başından sonra istediğimiz kadar içeriden başlatabiliriz.
Özlem KARAGEDİK, Armağan DÖKER

4 Temmuz 2010 Pazar

Analiz Sürecinde Dikkat Edilmesi Gereken Noktalar

Önceki yazılarımızda yazılım yaşam döngüsü sürecindeki ilk adımın planlama ve analiz süreci olduğunu belirtmiştik. Yazılım geliştirirken ortaya çıkacak ihtiyacın doğru olabilmesi için müşterinin beklentilerini tam olarak anlamak ve analizini yapmak gerekir. Ön analiz işlemi yapıldıktan sonra teknik analiz ile ilgili çalışmalar başlar. Teknik analiz, müşteri gereksinimlerinin teknik ekip tarafından daha rahat anlaşılmasını, ekibin aynı dili konuşmasını sağlar.
Teknik Analiz Dökümanında Olması Gereken Kısımlar 
  • Teknik Analiz Başlığı: Her analiz dökümanının başlığı olmalıdır. Döküman versiyon ile tutulacak ise başlıkta versiyon bilgisi belirtilmelidir.
  • Revizyon Tablosu: Analiz dökümanının kim tarafından ne zaman eklendiği/ güncellendiği bu tablo ile belirtilir.
  • Proje Ekibi: Analiz kapsamında çalışacak proje ekibi tanımlanır.
  • Analiz Döküman İçerik tablosu: Analiz içerik listesinin yer aldığı kısımdır. İçerik listesi, analizde yeralan kısımlara kolaylıkla ulaşılmasını sağlar.
  • Amaç: Analizi, yapılan gereksinimin yapılma nedenleri ve amaçları bu alanda belirtilir. Her analizin bir amacı olmalıdır.
  • Genel Bilgiler: Gereksinim hakkında genel bilgiler belirtilmelidir. Analiz dökümanını okuyan kişi, analiz hakkındaki ön bilgiyi bu kısıma baktığında anlamalıdır.
  • Genel İşlem Akış Diyagramları: Analizin başından sonuna kadar işleyişi akış diyagramları ile modellenir. Projede ekibi yada bu analizi inceleyen kişiler, akış diyagramına bakarak sistemin kuş bakışı resmini görür. Bu sayede proje kapsamı da belirtilmiş olur.
  • Detay Bilgiler: Gereksinimin uygulanacağı modüller için detay bilgiler belirtilir(örn : ürün bazlı senaryolar(use-case), ekran görüntüleri ve işlem açıklamaları, riskler... ).
  • Riskler: Gereksinimin yaratacağı riskler gruplandırılarak belirtilmelidir.
    • İşlevsellik: <Sistemin işlevselliğini tam olarak yerine getirememesine neden olacak riskler bu kısıma yazılır.>
    • Yük, kapasite: <Öngörülen maksimum kullanıcı sayısının karşılanamamasına neden olacak riskler bu kısıma yazılır.>
    • Güveninirlik: <Sistemin çökmesine neden olacak riskler,
    • Operasyonlar ve sürdürülebilirlilik: Operasyonların devamlılığını kesintiye uğratabilecek riskler bu kısıma yazılır.>
    • Veri Kalitesi: <Verilerin düzgün bir şekilde saklanmasını ve çekilmesini engelleyecek riskler bu kısıma yazılır.>
    • Performans: < İşlemlerin öngörülen sürelerde yapılmasını engelleyecek riskler bu kısıma yazılır.>
    • Arayüz: <Sistemin arayüzünde ortaya çıkabilecek riskler bu kısıma yazılır.>
    • Entegrasyon: <Sistemin diğer sistemlerle olan etkileşimini engelleyebilecek riskler bu kısıma yazılır.>
    • İhtiyaç Belirleme: <Analiz kapsamında ihtiyacın net olarak aktarılamaması.>
  • Ekran Görüntüleri ve İşlem Açıklamaları: Yazılımda yeni yada değişiklik yapılacak ekranlar var ise; bu ekranların prototipi hazırlanır(Microsoft visio, mspaint vb..) . Ekranlar ile ilgili işlem açıklamaları maddeler halinde detaylandırılır.
  • Test Önerileri: Analiz kapsamında analizi hazırlayan kişi yada test uzmanı tarafından test önerileri belirtilmelidir.
  • Sınıf Diyagramları: Nesne tabanlı programlamada kullanılan sınıflar ve bunların arasındaki ilişkileri modelleyebileceğimiz sınıf diyagramları belirtilmelidir.
  • Tablo Yapısı: Analizde kullanılacak yeni tablo yada mevcut tabloda alan ekleme, değiştirme yapılacak ise tablo yapısı analiz dökümanında mutlaka olmalıdır. Bu kısımda aynı zamanda tabloların foreign key, primary key, tablo içerisindeki alanların varsayılan değerleri, zorunlu olup olmadıkları belirtilmelidir.
Neslihan ÇALIŞKANEL

2 Temmuz 2010 Cuma

SQL Server Recovery Modelleri ve Yedekleme Önerileri

3 tip recovery modeli bulunmaktadır:
  1. FULL Recovery Model
  2. BULK LOGGED Recovery Model
  3. Simple Recovery Model
1. FULL Recovery Model
Eğer veritabanında bir sorun olduğunda veri kaybı yaşanması istenmiyorsaRecovery Model Full seçilmelidir. Bu modelde veritabanında gerçekleştirilen her işlem loga kaydedilir ve yedeklenebilir. Hata oluştuğu ana kadarki tüm verilere tekrar dönülebilir.
2. BULK LOGGED Recovery Model

BULK LOGGED Recovery Model ile yapılan toplu işlemlerin Transaction Log dosyasını büyütmemesi için kullanılabilir. BULK LOGGED Recovery Model ile toplu işlemler log dosyasına minimum şekilde kaydedilir. BULK LOGGED ile toplu bir işlem yapıldığı anda veritabanında bir hasar oluştuğunda hata anına geri dönülemez. Son yapılan toplu işlemler kaybedilir. BULK LOGGED şu işlemler minimum şekilde loga yazılır:
  • Bulk Import işlemleri (BULK INSERT ve INSERT..SELECT)
  • SELECT..INTO işlemleri minimal loglanır
  • Büyük data tiplerinin update işlemleri
  • WRITETEXT ve UPDATETEXT deyimleri
  • Bazı DDL işlemleri
  • CREATE INDEX, ALTER INDEX REBUILD ve DBCC REINDEX operasyonları
3. SIMPLE Recovery Model
Her işlem Transaction Log' a kaydedilir ancak her Checkpoint' ten sonra en son aktif sanal kayıda kadarki(o an hala işlem gören transaction) aktif olmayan sanal kayıtlar (Inactive Virtual Logs) log dosyasından silinirler. Böylece Transaction Log dosyası sürekli büyümez.
Yedekleme Örnekleri
1 - Simple recovery model ve Full Backup
Belirlenen saatler full backup alınabilir. Veritabanı bu alınan saatler arasında bir zamanda zarar gördüğünde en son alınmış full backup restore edilebilir.
2 - Full recovery model ve Full Backup
    • Her gün sistemin yoğun olmayan bir saatinde Belirlenen saatler fullbackup alınır. Hata oluştuğu anda tüm kullanıcıların erişimi durdurularak Transaction Log backup alınır. En son alınmış full backup restore edilerek üzerine alınan transaction backup yüklenir. Veri kaybı olmadan işlem tamamlanır.
    • Veya her gün sistemin yoğun olmayan bir saatinde Belirlenen saatler fullbackup alınır ve belirlenen saatlerde Transaction Log Backup alınabilir. Hata oluştuğu ana en yakın önceki log backup full backup restore edildikten sonra yüklenebilir. Tabi bu durumda en son alınan log backuptan sonra hata oluşan zamana kadar ki veriler kaybedilir.
    • Ve ya haftada -ayda bir full backup alınır ve günde bir veya bir kaç kere differential backup alınır ve gün içinde belli saatlerde veya hata anında log backup alınır. Sorun olduğunda önce en son full backup yüklenir sonra sırayla fark backupları en son da en yakın log backup yüklenebilir.
Bu backup modellerinde elimizde öncelikle bir full backup olması gerekir.
NOT: BULK LOGGED Recovery Model toplu işlemleri kaydetmediği için hata oluştuğu ana dönülebilmesi için tercih edilmeyebilir. Eğer ana dönülmesi istenmiyorsa SIMPLE mod kullanılabilir.
Serap PARLAK

1 Temmuz 2010 Perşembe

SANALLAŞTIRMA (Bölüm-1)

Son bir kaç yıldır sıkça duyduğumuz ve Microsoft'un üzerine basa basa vurguladığı sanallaştırma konusunda yazacağımız bir kaç bilgilendirme makalesi olacak. Bu ilk yazımızda "Sanallaştırma nedir?", "Sanallaştırma türleri nelerdir?" ve "Neden sanallaştırmalıyız?" sorularına kısa cevaplar vereceğiz. Sonraki yazılarımızda ise sanallaştırma türlerinden bazılarına değineceğiz. Yazımızda temel alacağımız ürünler Microsoft ürünleri olacak.
Sanallaştırma Nedir?

Sanallaştırma temel olarak fiziksel kaynakların ayrılarak verimliliğin optimize edilmesi anlamına gelmektedir. Bu kaynak; işlemci gücü, hafıza, disk kapasitesi olabileceği gibi ağ, oturum veya uygulamalar da olabilir. Genelde sanallaştırma dendiğinde aklımıza sunucu sanallaştırması gelse de, günümüz teknolojileri ile uygulamalar, masaüstü ve oturumlar sanallaştırılabilir.
Her ne kadar sanallaştırma, sadece iş dünyası ve şirketlere yönelik görünse de, ev kullanıcıları için de uygulama alanları var. Örneğin mevcut işletim sisteminize dokunmadan, farklı bir işletim sistemini veya yazılımı denemeniz veya virüs tehlikesi yaşamadan izole bir sistemde şüpheli bir yazılımı test etmeniz mümkün.
Sanallaştırma Türleri Nelerdir?

Microsoft’un sunduğu olanaklarla 4 tür sanallaştırma yapabiliyoruz:
1. Sunucu Sanallaştırması
Çok sayıda fiziksel sunucunun, tek bir fiziksel sunucu üzerinde çalışan sanal sunucular halinde konsolide edilmesidir. Burada temel olarak 3 üründen söz edebiliriz:
  • Windows 2003 R2 üzerinde çalışan Virtual Server 2005 R2
  • Windows Server 2008 üzerinde Hyper-V
  • Windows 2008 Hyper-V Server
2. Uygulama Sanallaştırması (App-V)
Yazılımın sanallaştırılarak küçük parçalara ayrılması, active directory yapısı ile kullanıcılara dağıtılması ve kodların dinamik bir şekilde kullanıcılara yollanarak sonraki kullanımlar için cachelenmesidir. Sadece programın başlaması için gereken kodların kullanıcıya iletilmesi yeterlidir. İhtiyaca göre, gereken parçalar kullanıcıya stream edilir. Burada kullanılan ürün, Microsoft’un bir süre önce satın aldığı SoftGrid ve bunun üzerine geliştirilen App-V 4.6 teknolojisi.
3. Masaüstü Sanallaştırma (Med-V, VDI)
Masaüstü bilgisayarlarının sanallaştırılmasını, veri merkezine taşınmasını, ardından son kullanıcılara LAN veya WAN üzerinden sunulmasını sağlayan teknolojiyi ifade etmektedir. Bu konuda bize sunulan ürünler:
  • VirtualPC
  • Enterprise Desktop Virtualization
4. Oturum Sanallaştırma
Terminal Servisleri adı altında toplanan ürünler ile, sadece ekran görüntüsü, klavye hareketleri ve mouse hareketlerinin ağ üzerinden taşınması yolu ile uygulama farklı bir yerde çalışırken sonuçların başka bir yerde izlenmesidir. Terminal servisleri altında toplanan ürünler ise:
  • Terminal Services RemoteApp
  • Terminal Services Gateway
  • Terminal Services Web Access
  • Terminal Services Session Broker
  • Terminal Services Easy Print
Neden Sanallaştırma?

Sanallaştırmanın sağladığı pek çok yarar var şüphesiz. Ancak en önemlileriniı 3 başlık altında toplamak mümkün:
1. Maliyet Düşürme
Sunucu konsolidasyonu ile sağlanan yer ve enerji tasarrufu yanında; veri merkezi çin ihtiyaç duyulan altyapı ihtiyacında, sunucu sahipolma maliyetinde azalma
2. Verimlilik Artışı
Değişikliklerin hızla uygulanabildiği, yüksek erişilebilirliğe sahip kesintisiz iş ortamı, yönetimsel yükte azalma
3. Artan İş Hızı
Dinamik veri merkezleri ile isteklere daha hızlı cevap verebilen bir platform
Sırf maliyetlerdeki azalma bile pek çok firmanın sanallaştırmaya yönelmesindeki temel etmen oluyor. Bu alana yapılan yatırımlar kısa sürede kara dönüştüğü için de idari destek görüyor. Yazımızın sonraki bölümlerinde sanallaştırma türleri hakkında biraz daha detaylı bilgi veriyor olacağız.
Necmettin TÜRER