21 Şubat 2014 Cuma

C# Cümledeki kelimelerin baş harfleri büyüten extension method

Merhaba arkadaşlar faydalı olabilecek bir extension method daha paylaşıyorum sizlerle.
Kulandığınız string cümledeki kelimelerinin baş harflerini büyüten bir extension method

 public static string GrowfirstCharacter(this string Text)
        {
            string yeniKelime = ""; //Yeni oluşacak cümle
            if (Tex.Contains(" ")) //Boşluk içeriyorsa
            {
                string[] words = Text.Split(' '); //Boşluğa göre split edip string diziye atıyorum
                for (int i = 0; i < words.Length; i++)
                {
                    yeniKelime += words[i].Substring(0, 1).ToUpper() + words[i].Substring(1, words[i].Length - 1).ToLower() + " "; //ilk harfi büyütüp yeni cümleyi oluşturuyorum.
                }
                Tex = yeniKelime.TrimEnd(' '); //Sonda oluşan fazlalık boşluğu siliyorum
            } //Boşluk içermiyorsa
            else
            {
                Tex = Tex.Substring(0, 1).ToUpper() + Tex.Substring(1, Tex.Length - 1).ToLower();
            }
            return Tex;
        }
Kullanımı....
            Kullanım 1 (Direk string ifade üzerinden)
            string cumle = "bu bir cümledir".GrowfirstCharacter();
            
Çıktısı:  Bu Bir Cümledir
            Kullanım 2 (Extension class'ı üzerinden)
           string cumle = ExClass.GrowfirstCharacter("bu bir cümledir");
Çıktısı:  Bu Bir Cümledir

18 Şubat 2014 Salı

Singleton

Gang of Four
Tasarım örüntülerinin amaçlarından bir tanesi low coupling, high cohesion'a sahip kodlama yapmak.

High Coupling Örneği
Örnekte bir sınıf değişince bir başka sınıfın da etkilenmesi gösteriliyor. Bu durum high coupling için tipik bir sonuç.


Singleton

Singleton kavram olarak çok basit olmasına rağmen, farklı bir çok şekilde yaratılabiliyor. Aşağıda gördüğüm örnekleri toplamaya çalıştım.

C++

Static Metod Değişkeni Olarak
Bu örnekte, singleton nesnesi statik olarak getInstane metodu içinde tanımlanıyor.
Örnekte copy constructor C++11 yöntemiyle etkinsizleştirilmiş. Dolayısıyla aşağıdaki gibi kullanılması engellenmiş.
Object singleton = Object::instance(); //Hata verir
Object& singleton = Object::instance (); //Ok
Java
Lazy Singleton
İlk örnek en basit olanı.

Bu örnekte ise class loader kullanılarak, singleton sınıfının  bir defa yüklenmesi sağlanıyor.

Aşağıdaki örnekte Singleton'mış gibi görünen ancak gerçekte Factory olan tuhaf bir kullanım şekli var. Tam anlamıyla bir anti-pattern diye düşünüyorum.


Enum şeklinde Singleton
Bu alışılageldik bir yöntem değil. JVM'in kendi içinde kullandığı bir kilit ile bu nesneyi yarattığı dolayısıyla thread-safe olduğu belirtilmiş.
Örnek:
public enum UserActivity {
INSTANCE
;

public void dostuff() {
...
}
}

// use it as ...
UserActivity.INSTANCE.doStuff();
C#
Örnek'te bir ata sınıftan kalıtma gösterilmiş:
Ata sınıf:
public abstract class Singleton<ClassType> where ClassType : new()
{
static Singleton()
{
}

private static readonly ClassType instance = new ClassType();

public static ClassType Instance
{
get
{
return instance;
}
}
}
Kalıtan sınıf:
class Example : Singleton<Example>
{
public int ExampleProperty { get; set; }
}
Kullanım:
public void LameExampleMethod()
{
Example.Instance.ExampleProperty++;
}




28 Aralık 2013 Cumartesi

Asp.net Dosya upload sırasında dosyaya rastgele isim vermek

Öncelikle static bir class içerisinde static bir method tanımlıyoruz. İsterseniz static tanımlamadan da yapabilirsiniz. Ama bunu yaparsanız class'ın örneğini türetmeniz gerekir.
public static string RastgeleString(int Length)
{
string characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; //Rastgele değer oluşturacak string değerimiz.
Random rd = new Random(); //Rastgele değer üreten sınıfımız
string a = ""; //Boş bir string tanımlıyoruz.
for (int i = 0; i < Length; i++)
a+=characters[rd.Next(0, characters.Length)]; //Method değişkeni kadar for ile dönüp her dönüş tanımladığımız boş string'e += ile ekliyoruz.

return a; //Oluşan stringi geri döndürüyoruz.
}
Şimdi rastgele isim üretip dosyayı yükleyelim..
string file_name = Methot.RastgeleString(10);

if (FileUpload.HasFile)
{
string type = Path.GetExtension(FileUpload.FileName); // .jpg, .doc, .pdf şeklinde dosya uzantısı döner.
string full_name = file_name + type; //Rastgele oluşturduğumuz isimle dosya tipini birleştiriyoruz.

FileUpload.SaveAs(Server.MapPath("~/dosyayolu/" +full_name)); //FileUpload'ın SaveAs methoduyla dosyanın yeni ismini verip kaydediyoruz.

}
İyi Kodlar!

Kaynak / Source: http://kodstrap.com/makale-dosya-upload-sirasinda-dosyaya-rastgele-isim-vermek-10

10 Ağustos 2013 Cumartesi

Düzenli İfadelerin Derlenmesi

compile() metodu
Bu konumuzda ifadelerimizi düzenledikten sonra işleme koyacağız.Peki bu derlemenin ne farkı var? diye sorarsak;
bilmemiz gereken en önemli özelliği programlarımızın daha hızlı çalışmalarını sağlamak.Tabiki bunu görebilmek için
büyük çapta projelerde çalışıyor olmamız lazım ki şu an için sadece nasıl kullanıldığını öğreneceğiz.

Önceki derslerdeki örnekleri biraz değiştirerek başlayalım:

>>> import re
>>> version=["python2.7","django1.0","php5.0","Android4.0"]
>>> Compiler=re.compile("[a-z]+[0-9]\.[0-9]")
>>> for i in version:
derli=Compiler.search(i)
if derli:
print derli.group()

kodumuz bu şekilde.Şimdi bunu açıklayalım.
İlk iki satır bilindik şeyler asıl iş üçüncü satırdaki "Compiler" değişkeni ile başlıyor.
Bir önceki konumuzda "Compiler" değişkeninde yaptığımız işlemi for döngüsü içinde yapıyorduk ve program her döngüye
başladığında "Compiler" değişkeni tekrar tekrar oluşturuyordu.Fakat burada yaptığımız ise tek bir sefer "Compiler"
değişkenini tanımladıktan sonra for döngüsü içinde kullanmmız gereken sadece search() metodu, bu metodda
aradıklarımızı bulmamızı sağlar.

Kodumuzu çalıştırdığımızda

python2.7
django1.0
php5.0
ndroid4.0

çıktılarını alırız.


compile() ile derleme seçenekleri

re.IGNORECASE veya re.I
Bu alt metodumuz büyük-küçük harf ayrımı yapmamızı sağlıyor.

>>> php=" Hypertext Preprocessor (Türkçe: Üstünyazı Önişlemcisi [1]) (Aslen: Personal Home Page - Kişisel Ana Sayfa) , genelağ için yaratılmış, sunucu taraflı, çok geniş kullanımlı, genel amaçlı, HTML içerisine gömülebilen betik ve programlama dilidir[1]. PHP, ilk kez Rasmus Lerdorf tarafından, web üzerinden sayfasına ziyaret edenleri izlemek amacıyla bir dizi Perl betiği kullanılarak geliştirilmişti. İnsanlar kısa zamanda bununla ilgilenmeye ve bu konuyla ilgili sorular sormaya başladıklarında, Rasmus kararını verdi ve bir betik motoru oluşturdu. Ayrıca formlara da destek verdi ve böylece PHP/F1'i biçimlendirmiş oldu. Adını duyurdukça bir grup yazılım geliştirmecinin dikkatini çekti ve böylece bir API oluşturuldu ve PHP3 ortaya çıktı. Daha sonraları yeniden ele alınması gerekti ve Zend motoru PHP4'ü yaratmış oldu. Artık PHP önünde pek engel bulunmuyordu, böylece PHP daha ünlenmeye başladı. Günümüzde PHP, bloglardan forumlara, portal sistemlerinden veri tabanlarına, yapay sinir ağlarından matematiksel sistemlere, sınıflardan fonksiyonlara her türlü işlevde kullanılır."
>>> derle=re.compile("PHP",re.IGNORECASE)
>>> print derle.findall(php)

şeklindeki kodumuzun çıktısı

['PHP', 'PHP', 'PHP', 'PHP', 'PHP', 'PHP', 'PHP']

olur.Örneği şu şekilde ve daha faklı şekillerde de kullanabiliriz.

>>> derle=re.compile("PHP+[0-9]",re.IGNORECASE)
>>> print derle.findall(php)

bu kodumuzun şıktısı ise

['PHP3', 'PHP4']

olacaktır.Bundan daha fazlası sizin ihtaycınıza kalmış.
php adlı yazı http://tr.wikipedia.org/wiki/PHP adresinden alınmıştır.

re.DOTALL veya re.S
Bu alt metodumuz ise "." sembolünü string olarak kabul ederek istediğimiz ifadeyi diğer satırlardada aramamızı sağlar

>>> example="deneme python.\n deneme python"
>>> print re.search("python.*",example).group()

şeklindeki kodumuz "." sembolünün gerçek rolünün kullanıldığı bir örnek ve sonucu da şu şekilde:

python.

Gördüğümüz gibi "\n" ifadesine kadar arama yaptı bir alt satıra geçip oradaki "python" ifadesini aramadı.
Şimdi bizim öğreneceğimiz kodu buna uyarlıyalım.

>>> example="deneme python.\n deneme python"
>>> derle=re.compile("python.*",re.DOTALL)
>>> nesne=derle.search(example)
>>> if nesne:
print nesne.group()

kodumuz bu şekilde ve sonucumuz ise

python.
 deneme python

re.UNICODE veya re.U
Tükrçe programlar yazabilmemiz için diğer seçeneklerden biri

>>> list=["şeker","şey","ğ","çatal","python"]
>>> for i in list:
nesne=re.search("\w*",i)
if nesne:
print nesne.group()

kodlarımız bize içinde Türkçe karakter bulunduğu için bize "php" ifadesinden başka bir sonuç döndürmeyecek.
Fakat kodumuzu şu şekilde düzeltirsek

>>> list=["şeker","şey","ğ","çatal"]
>>> derle=re.compile("\w*",re.UNICODE)
>>> for i in list:
nesne=derle.search(i)
if nesne:
print nesne.group()

bize Türkçe karakterdede arama olanağı sağlayacaktır.
Sonucumuz

şeker
şey
ğ
çatal
python



17 Temmuz 2013 Çarşamba

Özel Diziler


Boşluk Karakterinin Yerini Turan Dizi: \s

Bu ifade karakter dizimizdeki boşluk karakterini bulmamızı sağlar.

import re
language=["python programlama","django web programlama","php web programlama","Android"]
for i  in language:
sonuc=re.search("[A-Za-z]+\s[A-Za-z]+",i)
if sonuc:
print sonuc.group()

kodlarını çalıştırdığımızda bizi vereceği karakter dizileri aşağıdaki gibidir;

python programlama
django web
php web

Gördüğünüz gibi bize burada boşluk ifadesinin kullanıldığı karakter dizileri geri döndürüldü.

Ondalık Sayıların Yerini Tutan Dizi: \d

Bu ifade karakter dizimizdeki ondalık sayı karakterini bulmamızı sağlar.
Örneği önceki derslerimizde şöyle bir ifade kullanıyorduk

karakter_dizisi=re.search("[0-9][A-Za-z]")

şeklinde ifade kullanmıştık.Buradaki amaç sayı ile başlayan ve harf karakterleriyle devam eden karakter dizilerini bulmaktı. İşte kodumuz tam burada öne çıkıyor.

version=["php5","python 2","python3","CSS 3","HTML5"]
for i in version:
sonuc = re.search("[A-Za-z]+\d+",i)
if sonuc:
print sonuc.group()

yukarıdaki kodumuz bize sonu sayı ile biten karakter dizilerini verecektir.

php5
python3
HTML5

Gördüğünüz gibi sonu sayısal ifade olan karakter dizilerimizi kolaylıkla bulduk.
Ama diyelim ki biz "CSS 3" bulmak istiyoruz.Küçük bir değişiklik ile onuda kolaylıkla bulabilir.

for i in version:
sonuc = re.search("[A-Za-z]+\s\d+",i)
if sonuc:
print sonuc.group()

kodunu çalıştırdığımızda bize çıktı olarak

python 2
CSS 3

2 çıktı verecektir.Burada dikkat edilmesi gereken kod => sonuc = re.search("[A-Za-z]+\s\d+",i)
Çünkü bu kodun içindeki boşluk(\s) dizisini sayısal ifade(\d) dizisinden sonra yazarsak, önce sayısal ifade arayacak sonra boşluk ifadesini arayacak.Fakat bizin karakter dizilerimiz içinde böyle bir karakter dizisi bulunmadığı için sonuç boş dönecektir.Bunu denemek için

for i in version:
sonuc = re.search("[A-Za-z]+\d\s+",i)
if sonuc:
print sonuc.group()

kodunu çalıştırarak sonucu görebilirsiniz.

Alfanümerik Karakterlerin Yerini Tutan Özel Dizi: \w

Bu ifade karakter dizimizdeki alfanümerik karakterleri ve "_" karakterini bulmamızı sağlar.

alfanumerik = "yukonit12_$"
print re.search("\w*",alfanumerik).group()

Yukarıdaki kodumuzu çalıştırdığımızda bize alfanumerik olmayan bir karaktere kadar olan alfanumerik karakter dizisini verdi.
Cümle biraz karışık gibi oldu ama bir sonraki örnekte daha iyi anlaşılacağını umuyorum.Bu kodumuzun çıktısı;

yukonit12_


Diğer bir örnek olarak şu kodlarımızı yazalım.

alfanumerik="yukonit12_python_$_php_%_asp"
print re.search("\w*",alfanumerik).group()

Kodlarımız bunlar şimdi bu kodlarımızı çalıştıralım ve sonucu görelim.

yukonit12_python_

Gördüğünüz gibi yukarıda bahsettitğim " bize alfanumerik olmayan bir karaktere kadar olan alfanumerik karakter dizisi " olayı
umarım burada daha iyi anlaşılmıştır.

Dersimizin sonuna gelmeden önce şu soruyu sorabiliriz: Peki bu harfleri büyük yazarsak ne olur?

"\s" ifadesi boşluk karakterinin yerini bulmamızı sağlarken, "\S" ifadesi boşluk karakteri olmayan karakter dizilerini bulmamızı sağlar.
"\d" ifadesi ondalık sayı karakterinin yerini bulmamızı sağlarken, "\D" ifadesi ondalık sayı karakteri olmayan karakter dizilerini bulmamızı sağlar.
"\w" ifadesi alfanümerik ve "_ "karakterinin yerini bulmamızı sağlarken, "\W" ifadesi alfanümerik olmayan ve " _ " karakteri bulunmayan karakter dizilerini bulmamızı sağlar.

Bunlarla ilgili örnekleri size bırakıyorum.Hatta bu dersteki örnekler üzerinde denerseniz sizin içi daha faydalı olur.
Bir sonraki derste görüşmek üzere...

10 Temmuz 2013 Çarşamba

Eşleşme Nesnelerinin Metodları

Group() metodu
Bu metodu daha önce işlediğimiz düzenli ifadelerde kullanmıştık.
Bu bölümde başka bir özelliğine daha değineceğiz.Bu özellik ise
bir karakter dizisini gruplamamızı sağlaması.

improt re
gruplanacak_yazi="django python dilinin web çatısıdır."
gruplama=re.search("(django) (python) (dilinin) (web) (çatısıdır)")
print gruplama.group()

kodlarını çalıştırdığımızda biz

django python dilinin web çatısıdır.

çıktısını verecektir.Bu çıktı oluşturduğumuz grubumuzun tamamıdır.
Grubumuzun bölümlerine erişmek için ise

print gruplama.group(3)

şeklinde yazdığımızda bu kodumuzun çıktısı 3. kelimemiz yani "dilinin" olacaktır.
Burada karıştırılmaması gerek konu indis numarasının 1'den başlaması.Daha önce gördüğümüz
listeler ile karıştırılmamalıdır.Örneğimizi biraz daha geliştirelim;

gruplama=re.search("(django) (python) (dilinin) (web çatısıdır)",gruplanacak_yazi)

şeklinde düzenledikten sonra grubumuzun 4.bölümünü çağıralım

print gruplama.group(4)

Kodumuzu çağırdıktan sonra biz verdiği çıktı "web çatısıdır" oldu.Yani grublamayı biz yönetbiliyoruz.

Groups() Metodu
Bu metodumuz bizim grupladığımız düzenli ifademizi demet haline çevirerek bize sunar.Bir önceki örnekle
devam edersek sadece çıktı alıcağımız yerdeki "group" koduna "s" ekliyeceğiz.

.
.
.
print gruplama.groups()

kodumuz bize şu şekilde bir çıktı verecektir:

('django', 'python', 'dilinin', 'web \xe7at\xfds\xfdd\xfdr')

buradaki 4 ifademizdeki "web" kelimesinden sonraki bölümdeler Türkçe karakter uyumsuzluğu olduğu için
çıkmaktadır.Aslında "\xe7at\xfds\xfdd\xfdr" ifadesinin anlamı "çatısıdır".

bir sonraki dersete görüşmek üzere