Singleton hakkında yazı yazılacak
Posted in C#.
Comments Off
– 08/01/2012
Geliştirdiğimiz bir projede forms authenication kullanıyorduk. Performans, cache vs derken veritabanına mümkün olduğunca az gitmeye çalışıyorduk. Bununla birlikte portal üzerindeki bütün yetkilendirme işlemlerini aspnet membership üzerinden rollerle sağlıyorduk.
Bu noktada garip bir sorun ortaya çıktı, membership her sayfada veritabanına gidip kullanıcının rollerini tekrardan sorguluyordu. Biz performans konusuna bu kadar değiniyorken, herşeyi kısıp cache’lere yükleniyorken sürekli veritabanına sorgu atılması can sıkıcıydı tabii ki. Hele ki binlerce kullanıcının aynı anda bu portalı kullanacak olması sunuculara ciddi bir yük demekti.
Neyse ki sorunun kaynağı msdn de gizliydi. Varsayılan olarak .net maksimum 25 adet kullanıcı rolü saklıyor. Eğer bu sayıdan fazla rollere sahip bir kullanıcınız varsa veritabanına gidip her sayfa isteğinde rollerini tekrar çekiyor ve saklamıyor.
Çözüm ise gayet basit, web.Config içerisinde rol provider tanımında “maxCachedResults” özelliğinin minimum rol sayısından büyük olması gerekiyor.
Örneğin :
Comments Off
– 08/01/2012
Geliştirdiğimiz workflowların başlatıldığı anda bitmesinin gerekmediği durumlar olabilir. Yani, düğmeye bastığınızda yapılacak olan iş başka birilierinin onayına ihtiyaç duyuyor olabilir, başka kaynaklardan bilgi alması gerekiyor olabilir ya da buna benzer dış etkenlere bağlı workflow geliştiriyor olabilirsiniz.
Bu noktada workflowun bir noktada saklanması ve belirli şartlar olgunlaştığında veya istendiği takdirde yeniden çağrılması için Workflow Persistence Service kullanılır. .NET WF kütüphaneleri, SQL Server ile entegre bir biçimde bunu gerçekleştirmektedir.
Dolayısı ile uygulamalarınızda WF Persistence Service kullanmak için sadece gerekli ayarları yapıp servisi doğru parametre ile çağırmanız yeterlidir.
Öncelikle SQL Server üzerinde workflowların kaydedileceği şemanın yaratılması gerekmektedir. .NET Framework 3.0 ile birlikte SQL Server üzerinde gerekli yapıyı oluşturacak SQL Scriptleri mevcuttur. Bunlara “c:\Windows\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\EN”
Posted in Uncategorized.
– 11/10/2010
Bugün ilginç bir hata ile karşılaştım.
Lokal SQL Server’ı çalıştırdığımda “named pipes” ile ilgili bir hata veriyordu. SQL Server configuration manager üzerinden baktığımda da named pipe ların enable olduğunu görüyordum. Kontrol panelindeki services kısmında manuel sql server servisini start etmeye kalktığımda otomatik tekrar duruyordu
.
Sorunun kaynağını anlamak için event viewer kullandım, peşpeşe 4 farklı hata vardı. En üstteki hataya baktığımda portların kapandığı durumda aldığımız mesaja benzer bir hata olduğunu görüp makineye kurulu antivirüs uygulamasını kontrol ettim. Burada bir sıkıntı yoktu, antivirüs kapatmıyordu ama telnet ile de ulaşamıyordum.
En alttaki hataya baktığımda ise daha sorunun kaynağı daha anlaşılır oldu. Problem configuration manager üzerinde “VIA”protokolünün de açık olmasından kaynaklanıyordu. Bunu “Disabled” duruma getirince sorun düzeldi.
Peşpeşe aldığım hatalar ise şöyle:
1. TDSSNIClient initialization failed with error 0×7e, status code 0×60.
2.payday loans online TDSSNIClient initialization failed with error 0×7e, status code 0×1.
3. Could not start the network library because of an internal error in the network library. To determine the cause, review the errors immediately preceding this one in the error log.
4. SQL Server could not spawn FRunCM thread. Check the SQL Server error log and the Windows event logs for information about possible related problems.
MSDN üzerindeki bir blogda okuduğum bir makale sayesinde çok önemli bir bilgiye sahip oldum. Genelde şöyle bir bilgi vardır “.NET üzerinde/C# da herşey object ten türemiştir”.payday loans Maalesef bütün genellemelerde olduğu gibi bu da yanlış.
Şöyle ki, .NET üzerinde birçok şey object nesnesinden türemiştir ve .NET dilleri (özellikle C#) çok güzel bir nesnesel programlama dilidir. Fakat herşey nesneden türemez. Örneğin pointer ve interface ‘ler nesneden türemedikleri gibi bu türleri hiyerarşik olarak genişletemezsiniz. Örneğin bir interface’den kalıtım alan başka bir interface tanımlayamazsınız!
Veya bir pointer nesneden türemediği gibi nesneye de dönüştürlemez.(bir değer türü gibi kullanmak istiyorsanız, önce IntPtr türüne dönüştürmeniz gerekir)
Yine aynı makalenin yorumlarında gördüğüm güzel bir çürütme sorusu vardı. “Peki neden ‘Typeof(ITestType)’ gibi bir kullanım ile tipini almaya kalktığımda bana nesne geri gönderiyor?”. Cevabı da gayet açık, TypeOf geriye bir tür gönderiyor, interface in kendisini değil.
Özetle, herşey nesne olmamakla birlikte, çeşitli dönüşüm yöntemleri ile farklı kullanımlara sahip olabilirler.
Bahsettiğim makaleye buradan ulaşabilirsiniz.
Bestes online kasino deutschland.
Posted in Uncategorized.
– 11/10/2010
WPF ile ilgili bilgim son derece sınırlı olmakla birlikte, şuan üzerinde çalıştığım proje de WPF kullanmam gerekiyor. Uygulamanın analizinde belirli bir textboxt içerisinde, belirli uzunlukta metin alınacağı ve bu belirli uzunluktan sonra girilen metnin farklı bir renkte boyanarak silineceği görsel bilgisinin kullanıcıya verilmesi gerekiyor.
Bir örnekle açıklarsak, metin kutusuna girilen 25 karakterden ilk 10 karakteri kırmızı, geri kalan 15 karakterin siyah olması ve tamam düğmesine basıldığında bu 10 karakterin işlenmesi gerekiyor.
Normalde rahatlıkla yapılabilecek bu isteği, WPF’in bileşenlerinin biraz yetersiz ve farklı, ve benim bu konudaki bilgimin az oluşu nedeniyle yarım gün boyunca araştırmam gerekti. Fakat neyseki mutlu son ile bitti ve aşağıdaki birkaç satır kod ile bu işi kotardım.
Öncelikle formumuza koyduğumuz bir RichTextBox nesnesinin KeyUp olayının içerisine aşağıdaki satırları yazıyoruz.
private void TextInput_KeyUp(object sender, KeyEventArgs e)
{// mevcut metindeki butun renklendirmeleri kaldir
TextRange documentRange = new TextRange(TextInput.Document.ContentStart, TextInput.Document.ContentEnd);
documentRange.ClearAllProperties();
// 10 karakterden fazla bir text girilmisse
if (documentRange.Text.Trim().Length >= 10)
{
Color c = Colors.Red;
SolidColorBrush brush = new SolidColorBrush(c);// 10. karakterin pointer bilgisini al. (text in sonunda \r\n karakterleri oldugundan +2)
var rightPointer = TextInput.Document.ContentStart.GetPositionAtOffset(10 + 2, LogicalDirection.Forward);
// ilk 10 karakteri sec
TextRange tr = new TextRange(TextInput.Document.ContentStart, rightPointer);// yazi rengini degistir
tr.ApplyPropertyValue(TextElement.ForegroundProperty, brush);
}
}

WPF RichTextBox Coloring Output
WPF in normal TextBox bileşeni bu tarz renklendirmeyi desteklemediği için RichTextBox kullanmamız gerekti.
Ayrıca, RichTextBox’un textchanged olayına bu kodları yazarsanız metnin rengini değiştirdiğiniz anda tekrar tekrar textchange olayının tetiklenmesine sebep olacağından hata ile karşılaşırsınız.
Posted in WPF.
– 27/06/2010
Bugün Workflow Foundation ile transaction işlemleri nasıl yapılır diye bir inceleyim dedim. Öncelikle Framework 3.5 ile gelen Transaction Scope Activity’nin derdime çözüm olacağını düşündüm fakat biraz inceleyince pek uygun olmadığını anladım. Zira bu aktivitenin yaptığı sadece içerisindeki aktivite bloklarını atomik hale getirmekten ibaretti.
Benim yapmak istediğim ise, bir iş akışı başlatmak ve bu akışın herhangi bir aşamasında bir problem olduğu durumda rollback yapmak. Bu bağlamda (file veya bir listeyi de manipüle edebiliyor olabileceğim olasılığı ile) sql veritabanına birşeyler yazdığımı varsaydım.
Bu süreci gerçeklemek için SqlTransaction sınıfını kullandım. Şöyle ki; bir init aktivitesi içinde bağlantı bilgilerini hazırladıktan sonra, ilk aktivitede bağlantı açıyorum. ikinci aktivitede SqlTransaction başlatıyorum, üçüncü aktivitede iki adet kayıt giriyorum (ikinci kayıtta hata var). Sonraki aktivitede ise eğer kayıt yapıldıysa transaction’ı commit ediyorum. Son olarak da bağlantıyı kapatıyorum.
İkinci kayıtta soyadı alanını null geçtiğim ve veritabanı modelinin buna izin vermemesi nedeniyle transaction başarısız olacağından, ilk kayıt da geri alınacak ve veritabanına iki kayıt da yazılmayacak.
Şimdi bu senaryonu gerçekleyelim. Öncelikle veritabanımızı oluşturup, bir adet personel tablosu oluşturuyoruz. Benim kullandığım Personel tablosunun script’i aşağıdaki gibidir.
USE [TestDB]
GO/****** Object: Table [dbo].[Personel] Script Date: 01/22/2010 15:06:50 ******/
SET ANSI_NULLS ON
GOSET QUOTED_IDENTIFIER ON
GOSET ANSI_PADDING ON
GOCREATE TABLE [dbo].[Personel](
[PersonelID] [int] IDENTITY(1,1) NOT NULL,
[FirstName] [varchar](50) NULL,
[LastName] [varchar](50) NOT NULL,
CONSTRAINT [PK_Personel] PRIMARY KEY CLUSTERED
(
[PersonelID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]GO
SET ANSI_PADDING OFF
GO
Bundan sonra, Visual Studio içerisinden projemizi oluşturuyoruz. Uygulama son derece basit bir state machine console application. Bir adet workflow içeriyor ve aşağıdaki gibi aktivitelere sahip.

Bundan sonra, StateActivity2 içerisinde yukarıda bahsettiğim akışı tasarlıyoruz. bunun için de en basitinden olsun diye adım adım CodeActity kullandım. 
Öncelikle initActivity ile workflow içerisinde kullanılacak connection, transaction ve command nesnelerinin tanımlıyoruz.

Bundan sonraki aktivitelerde ise aşağıda görebileceğiniz üzere; bağlantı açma, transaction başlatma, kayıt, transaction kapatma ve bağlantı sonlandırma işlemleri yapılıyor.
Bir sonraki çalışmam bunun entity framework ile kullanımı üzerine olacak.
Posted in Asp.NET, C#, SQL Server, Workflow Foundation.
– 22/01/2010
Mevcut projemizde test sunucumuz Windows 2008 yüklü IIS 7 kullanan bir sisteme sahipti. Web tabanlı uygulamayı test sunucusuna deploy etmeye kalktığımda Kurulum Sihirbazı, “The installer was interrupted before <uygulamanın adı> could be installed. You need to restart the installer to try again’” şeklinde bir mesaj ile kurulumu iptal ediyordu. Event log’a baktığımda “…. Installation success or error status: 1603.” şeklinde bir hata aldığımızı gördüm. Öncelikle sorunun başka birşey olduğunu düşündüm ve deployment pack’i tekrar tekrar oluşturdum. Her seferinde aynı hatayı verince google’a danışayım dedim. Nitiative, Inc adlı bir blogda bu sorunun aynısının yaşandığını ve bizim test sunucumuzdaki bir eksik konfigürasyon nedeniyle bu hatayı aldığımızı öğrendim.
Server Manager üzerinden IIS 7 servis rollerine “IIS 6 Metabase Compatibility” rolünü ekledikten sonra kurulum başarı ile başladı.
Posted in Deployment, IIS 7.
– 12/01/2010
Uygulamalarımızda planladığımız iş süreçleri herzaman düz bir akış içermeyebilir. Bunun yerine, daha çok belirli durumlarda belirli işlerin yapılmasını gerektiriyor olabilir. Bu makalede buna benzer durumlarda kullanabileceğimiz “State Machine Workflow” ile ilgili bir örnek yapacağız.
Örneğimiz hepimizin bildiği müzik kutularını simule edecek son derece basit bir uygulama. Kullanıcıya hangi şarkıyı dinlemek istediği liste halinde sunulacak, kullanıcı bir şarkı seçecek ve dinleyecek, sonrasında yeniden başa dönecek.
Öncelikle yeni bir uygulama açıyoruz (File/New/Project, State machine workflow console application). Visual studio bize default olarak bir şablon oluşturmuş olacak, kendisinin oluşturduğu “Workflow1” isimli dosyayı silip, proje üzerinde sağ tuşa tıklayıp “Add/State machine worklow” seçiyoruz, isim olarak “wfMusicBox” yazıp onaylıyoruz.
State machine workflow oluşturduğumuzda boş bir kutu içeren bir tasarım penceresi ile karşılaşacağız. Burada bilmemiz gereken birkaç husus var.
Workflow tasarım penceresi üzerinde boş bir yere tıklayıp özellikler penceresine baktığınızda, workflowa ait birkaç özelliğin bulunduğunu göreceksiniz. En önemli iki özellik; “Initial State Name” ve “Completed State Name” dir. bunlar sırasıyla başlangıç ve bitiş durumlarını ifade eder. Dizayn penceresinde öncelikle durumları (state) belirler, o durumların içinde de bu state e bağlı olarak yapılması gerekenleri belirlersiniz. Örneğin şarkı bittikten sonra yeni bir şarkı çalınıp çalınmayacağı kararı sonrası ya çıkış, ya da listeleme moduna geri dönülmesi için yapılan işlemler mevcut duruma bağlı olarak yapılması gereken aktivitelerdir.
Workflow üzerinde başlangıç ve bitiş statelerini belirledikten sonra, belirlediğiniz statelerin başlık kısmında bunu belirtir ufak birer simge olduğunu göreceksiniz. Ek olarak bitiş stateinin içerisinin boş olması gerektiğini unutmamak gerekir.
State ler ile ilgili olarak içerilerinde kullanabileceğiniz aktiviteler sınırlıdır. Buraya koyduğunuz aktiviteler bir nevi konteyner görevi görecektir, dolayısı ile bunların içerisinde normal bir aktivite akış tasarımı yapacağız.
Bu kadar girişten sonra şekildeki gibi state lerimizi tasarlıyoruz. state ler arası çizgilerin çıkmayışını dert etmeyin, onları elle çizmiyorsunuz. Aksine, SetStateActivity kullandığınızda otomatik olarak çiziliyor.
Her bir state içerisinde birer adet “StateInitializationActivity” mevcut. Init aktivitesinin içerisindeki akışımız ve özellikler aşağıdaki gibidir.
Kullandığımı CodeActivity belirli bir init mesajı vermek içindir. Sonrasında da “SetStateActivity” kullanarak akışı, “stateListMode” isimli liste durumuna geçiriyoruz.
Liste modundan devam eden akış da benzer bir yapıya sahiptir. CodeActivity kullanarak kullanıcıya bir seçenek sunulmasını sağlıyoruz. Kullanıcı seçimini yaptıktan sonra ise SetStateActivity kullanarak çalma moduna, “statePlayMode” state’ine geçiyoruz.
Bu örnekteki listeleme ve çalma işlemi tamamen temsilidir. Maksat süreci ve bileşenlerin kullanımını göstermektir. Dolayısı ile gerçekten bir şarkı çaldığımız yok
Sadece belirli bir süre (bu örnekte 2sn) akışı bekletiyoruz.
Play modu da buna benzer bir yapı kullanmakla birlikte, FadeOut modu (bu modda şarkının bitiime yakın olduğunu varsayıyoruz.)
Fadeout modunda bir karar mekanizması var. buradaki yapı sadece if-else yapısı olduğundan, sadece ilk if brunch’’ında condition bulunmakta ve bu declarative değil, yani genel bir property den değer almıyor da direkt bir metod sonucunda geri dönüş değerine bağlı. Dolayısı ile içeride istediğimiz işlemi yapıp sonrasında berlili bir sonuç geri döndürebiliyoruz.
Duruma göre SetStateActivity’ler ile ya akışı bitiriyoruz ve “stateShutDownMode” durumuna atlıyoruz, ya da “stateListMode” durumuna atlayarak yeniden başlıyoruz.
Gördüğünüz üzere, herhangi bir state den devam edip çeşitli şekillerde akışı kontrol edebiliriz.
Örnek uygulamayı indirmek için aşağıdaki linke tıklayın.
Posted in Asp.NET, C#, Workflow Foundation.
– 21/09/2009