27 Kasım 2011 Pazar

C#’ta Yıldızlı Kelebek tarifi, içerik: iki yarım üçgen, bir sürü boşluk…

Çıktı kodun altındadır.

Kod:

  1: void KelebekYildizli(int n)
  2:         {
  3:             if (n % 2 == 0) n++;
  4:             for (int i = 0; i < n / 2; i++)
  5:             {
  6:                 for (int j = 0; j < i + 1; j++)
  7:                 {
  8:                     Console.Write("*");
  9:                 }
 10:                 for (int j = 0; j < n - 2 * i - 2; j++)
 11:                 {
 12:                     Console.Write(" ");
 13:                 }
 14:                 for (int j = 0; j < i + 1; j++)
 15:                 {
 16:                     Console.Write("*");
 17:                 }
 18:                 Console.WriteLine();
 19:             }
 20:             for (int i = 0; i < n ; i++)
 21:             {
 22:                 Console.Write("*");
 23:             }
 24:             Console.WriteLine();
 25:             for (int i = (n-2) / 2; i >= 0 ; i--)
 26:             {
 27:                 for (int j = i+1; j > 0; j--)
 28:                 {
 29:                     Console.Write("*");
 30:                 }
 31:                 for (int j =  n - 2 * i - 2; j > 0; j--)
 32:                 {
 33:                     Console.Write(" ");
 34:                 }
 35:                 for (int j = i+1; j > 0; j--)
 36:                 {
 37:                     Console.Write("*");
 38:                 }
 39:                 Console.WriteLine();
 40:             }
 41:         }
 42: 

Çıktısı:
kelebekyildizli

Not: Girlen satır sayı tek değilse, bir üst tek satır gibi algılar (mes: 6 girildise, 7 algılar). Kelebeğin simetrik olması içindir.

5 Ekim 2011 Çarşamba

Apache web sunucusu nasıl kurulur ve çalışır.

Geçen defa Microsoft IIS ile uğursuzluktan sonra Apache`ye yöneldim.

Apache kurulumu.

Apache`nin resmi sitesinden win32 binary installer indirmekle başladım.
Çalıştırdığımda Network Domain ve Server Name (site isimlerine benzer formatda) girdi istedi.
Local user için 8080 portuna kurulmayı teklif etti.

 

İlk çalıştırılması.

Kurulduktan sonra konsolda çalıştırdım ve tarayıcımı localhost:8080, 127.0.0.1:8080, 192.168.1.4:8080 (lokal ağ adresim) yöneltdim.
Her üçünde "It works!" yazısı uğuru bildirdi.

 

Web kök.

Web kök hosta denk gelen klasöre denilir. (Yani, http://localhost/ sorgusunda web sunucunun baktığı ve dosya sistemimizde yerleşen klasör.)
Web kökü Apache`nin kurulduğu klasörde htdocs`ta buldum. İçeride tek yatan index.html dosyası tarayıcımdan gördüyüm "It works!" yazısını taşıyordu.
Artık üzerinde statik bir site kurabilir web sunucum var.

 

TarayıcI taraftan bakış ve çalışma teorisi

Apache web sunucusu HTTP üzerinden hizmet sunar.
HTTP`de bir dosyanın, resmin ya her hangi başka verinin (terim olarak - kaynak) yerleştiği yeri belirtmek için onun yerleştiği hostu (site adresi gibi de algılanabilir) ve o hostda hangi yolda (klasör ve dosya gibi) bulunduğu belirtilir.
Örnek: http://example.com/index.html adresini açmak için, tarayıcımız example.com hostunda /index.html yolu sorgular.
HTTP bir TCP/IP üzerinden çalışan protokol olduğundan, tarayıcımız sunucumuzun yerleştiği IP adrese söylediğimiz port üzerinden bağlantı kurar. HTTP hizmetleri susmaya göre 80 portunu kullanır, tarayıcılar da portu girmediğimzde ona yönelir.
Sunucumuzun hangi IP adresde yerleştiğini bilmek için tarayıcımız biligisayarımızda yerleşen hosts dosyasına müracaat eder. Orada denilen host için IP adres bulmadığı halde DNS hizmetine baş vurur. DNS (alan adı sistemi) hizmeti domainlerin hangi IP adrese bağlı olduğuna cevap bulunduran global sunucular birleşmesidir - konumuzun kapsamı dışında bulunduğu için DNS hakkında bu kadar bilgi yeter.
Şimdi elimizde iki aşağı seviyeli - IP adres, port - ve iki yukarı seviyeli - host, kaynak yolu - tanımlayıcı elde etmiş oluyoruz. Tarayıcımız bunları kullanarak bize istediğimiz kaynağı getiriyor.

 

Sunucu taraftan bakış

Apache çalışmaya başlarken ayarlar dosyasını kontrol eder ve ona göre hizmet sunar.
Ayarlarda hangi IP adreste hangi portu dinlemeli olduğunu belirtebiliriz.
(Bir bilgisayarın birden fazla IP adresi ola bilir. Bu aynı zamanda farklı ağlara bağlı olabilmesinden ileri geliyor. Mesela, local ağ adresi (lan), global ağ adresi (internet üzerinden, wan))
Listen 127.0.0.1:80 dediğimizde, yalnız kendi bilgisayarmızdan erişebilen sunucu elde ederiz.
Susmaya göre ise, bilgisayara bağlanan tüm 80 nolu port soketlerine hizmet sunar.
Bağlantı kurulduğunda, web sunucu HTTP kurallarına göre gelen sorguyu bilgisayarımızdakı dosyaya karşılaştırmaya çalışır.
Web kök denilen, ve http://localhost adresine denk gelen klasör DocumentRoot ayarı ile belirtilir. (Windows`ta susmaya göre "C:/Program Files (x86)/Apache Software Foundation/Apache2.2/htdocs/" adresi örnektir.)
Bundan sonra localhost hostunda /index.html sorduğumuzda, .../htdocs/index.html dosyası gelir.

 

Yekunda, bir Apache web sunucu ile bir statik site hizmete sunuldu.
Lakin Apache web sunucusu bir bilgisayarda bir çok web site sunabiliyor.
Bunun için VirtualHost ayarı ile sunmak istediğimiz sitenin hangi IP adres, port ve hosta bağlı olduğunu, dosya sistemimizde hangi yolda yerleştiğini belirtmek gerek.
Statik html dosyaların yanında php, perl, python, ruby, asp.net gibi dillerde yazılmış scriptlerin çalıştırılabilinmesi için ilgili modülü Apache`ye yüklemek ya da dosyanı yorumlayıcıya yöneltmesi için ayarlamak gerek.
Bunlar bu başlığın dışında olduğu için burada bitiriyorum.

Herkese güzel siteler!

4 Ekim 2011 Salı

“Microsoft Internet Information Services (Microsoft IIS) nasıl kurulur?” sorusunda başarısızlık.

Microsoft Internet Information Services (Microsoft IIS) bir web server (veb sunucusu) olup, bir çok şey edebilmekle beraber, dosyalarınızı internette açmaya da yardımcı oluyor.

IIS nasıl kurulur sorusu İnternet Programlama dersinin ikinci sorusuydu, ilk olan IIS nasıl çalışır idi.

Ben de eve gelip onu kurmaya yöneldim.


Evvela Microsoft`un sunduğu Web Platform Installer (Web PI) yazılımını www.iis.net sitesinden  indirdim. Tanıtımında Microsoft Web Platformun`un bileşenlerinin - IIS ve uzantıları, SQL Server Express, .NET Framework ve Visual Web Developer gibi yazılımlara erişmekte kolaylık sağladığı yazılmıştı.
Onun arayüzünde modern frameworklarla yanaşı Install IIS görünce, klasik yolun var olduğunu hatırladım ve eskilere saygıdan onu takip etmek istediğime karar verdim.

Windows eklentilerinin idare panelinden (Control Panel > Programs > Programs and Features > Turn Windows features on or off) Internet Information Services öğesini seçip "ok" tusuna basarak kurmayı başlattım.

Kurma bitince, ne start menu`de, ne de program files`da hiç bir şey oluşturmadan, benden habersiz şekilde C:\inetpub\ klasörünün oluşturulduğu, içinde de veb kökün (wwwroot klasörü) yatdığını buldum. İlk başta yanlış kurulduğunu düşünmüştüm.
Tarayıcımı http://localhost/ adresine yönlendirdim. Ne garibse, hoşgeldin sayfasının yerine Error 404 (404.4) geldi.
Microsoftun bilgitabanında durum kodları sayfasında 404.4 hatasının açılımı "No handler configured" diye geçiyordu.
İnternette araştırmanın sonucunda benim kullandığım Windows 7 Home Basic sürümünün özellikleri kısıtlı olduğunu, hatanın da bundan dolayı oluştuğunu buldum.
(IIS 7.5`in farklı Windows sürümleri için sunduğu özellikleri gösteren tablolar: http://technet.microsoft.com/en-us/library/cc753473.aspx . Temel HTTP özelliklerinden statik sayfaları açma bile YOK. Lakin, HTTP hatalar ve yönlendirme var :\.)
IIS ile tanışmamı burada sonlandırıp - bu arada onu silmeyi unutmayarak - açık yazılıma yöneldim.

Herkese kolaylıklar ve bilgisayarında açık yazılım egemenliğini diliyorum!

24 Mayıs 2011 Salı

Bilgi sistemi otomatik doldurma

Ele şimdi oğrenci bilgi sistemine girdim ki, sayısal elektronik dersinin notuna bakayım.
Bir de karşıma bizim çok sevdiğimiz anketler çıktı.
Geçen sene yazdığım bir scripti hatırladım. Şimdi de sizinle bookmarklet şeklinde paylaşayım diyorum, siz de eziyyet etmeyesiniz.

Bu linki favorilerinize(bookmarklarınıza) ekleyin, Derman.
Sonra anket sayfasına gidin.
Orada o bookmarka tıklayın, ve tamam!

İyi günler dilerim. ^__^



NOT: Yalnız Google Chrome 11 için testedilmiştir.

3 Mayıs 2011 Salı

Stringi int dizisine çevirme, C# Extension Method yazarak. Ninja yolu, tek satırlık ve döngüsüz .


fibonaccisnipSık-sık girdide boşlukla ayrılmış sayılar alıyoruz.
Bunu string gibi okuyup integer dizine çevirmemiz gerekiyor.
Adeta bunu her defa for döngüsünde Convert.ToInt32 ya Int32.Parse yazarak gerçekleştiriyoruz.
Şimdi ise bunu tek satırda ve döngü kullanmadan nasıl yapıldığını göreceksiniz.
Hatta, hiç string değişkenine aktarmadan kısa ve güzel böyle bir koda varacağız:

int[] data = Console.ReadLine().ToIntArray()

(ToIntArray() metodu en son C# .Net 4 dahil string dizilerinde mevcut değil. Extension Methodla eklenildi. Kodu en aşağıda.)
Bence harika.

Önce stringin tek satırda integer dizisine nasıl dönüştüğüne bakalım.
Bunun için iki yol var. Her ikisi stringi string dizisine, onu da int dizisine çevirmekden geçiyor. (aralıklı sayılar stringi =>[işlem: string aralıklarda kesiliyor…] her elemanı bir sayı tutan string dizisi =>[işlem: her eleman stringden integere çevriliyor ve yeni dizi oluşturuluyor] istenilen int dizisi).
Stringi diziye bölmek için Split kullanıyoruz. (Split – böl, parçala.) Girdide bizde boşlukla ayrılmış sayılar olduğu için, boşlukla (‘ ‘) bölünüyor. Sonra onlar Array.ConvertAll ya Linq`in Select metodu ile int dizisine çevriliyor.

string s = Console.ReadLine()
int[] data;

data = Array.ConvertAll(s.Split(' '), i => Int32.Parse(i)); // Yol bir

data = s.Split(' ').Select(s => int.Parse(s)).ToArray(); // Yol iki, Linq ister

String.Split, Array.ConvertAll, Linq.Enumerable.Select
(bunların ilk ikisi hakkında gelecekde yazacağım)

Şimdi bu blogda ilk Extension Method yazılmasını göreceğiz.

public static class Utils
{
    public static int[] ToIntArray(this string s)
    {
        return Array.ConvertAll(s.Split(' '), i => Int32.Parse(i));
    }
}
public class Program(){
    static void Main(){
        int[] data = Console.ReadLine().ToIntArray();
    }
}

(evet, this string.  ve evet, ToIntArray parametre almıyor. hem de classın ve metotun static tanımına da bakmayın, statik tavr etmez. amma static tanımlanmalı. bu ve diğer tuhaflıklar hakkında gelecekde.)

2 Mayıs 2011 Pazartesi

String diziyi char dizisine çevirme, C#, String.ToCharArray()

String dizisini char dizilerine çevirmek için böyle kod kullanabilirsiniz. String.ToCharArray() bir stringi char dizisine çevir metottur.

public char[][] StringsToCharsArray(string[] isimler)
{
    char[][] char_isimler = new char[isimler.Length][];
    for (int i = 0; i < isimler.Length; i++) {
        char_isimler[i] = isimler[i].ToCharArray();
    }
    return char_isimler;
}

Yok, string dizisini tek bir char dizisine çevirmek gerekirse:

public char[] StringsToSingleCharArray(string[] isimler)
{
    return String.Join("", isimler).ToCharArray();
}

String.Join metoduna ilk giren parametre ayracdır. İki stringi birleştirende araya koyulacak string. Arada hiç bir şey olmasını istemiyorsunuzsa yazdığım gibi (“”) yazmak yeter.

Programlama niye eğlenceli? Programlamanın 5 sevinci.

Frederik Bruks (Frederick Brooks) “The Mythical Man-Month”* kitabında bizim sanatımızın insanını bu sanatta cezb eden sevinçleri böyle özetlemiş:

1. Yapma-oluşturma sevinci.
2. Diğer insanlara faydalı ürün yapma sevinci.
3. Bir-biri ile ilişkili dinamik elemanlardan oluşan bilmece nesneleri düzenleme prosesinin cazipliyi.
4. Sürekli yeni bilgi edinme ve gayri-adi mesele çözme sevinci.
5. Ürünlerle çalışmaya ilgi, hansılar ki, yalnız akli gücün uygulanmasıyla yaratılmışlar, ve buna rağmen mevcutlar, inkişaftalar ve tamamen anlatılamaz şeyler ediyorlar.

Programlama ona göre eğlencelidir ki, her birimizin derin içinde olan yaratıcılık hasretini gideriyor.

(Kısaltılmış ve serbest çeviri. Tam metni burada okuyun(en).)

Programlamanın bir avantajı var – bağımsızlık imkanı. İstediğin ürünü bir iş yerine bağlanmadan geliştire bilirsin. Bir ressam kimi. Ressama göre avatajı ise yukarıdakı maddelerde, esasen de ikinci maddede belirtilmiş.

O kitabı okumamışım.

*"Mythical Man-Month – mitik kişi-ay. Kişi-ay bir kişinin bir ayda gördüğü işe denir. Mesela, iki kişinin yarım ay çalışması toplamda bir kişinin bir ay çalışması kadar zaman alır. Güç birimi diyebilirsiniz. Yapılacak işin miktarını işçinin harcayacağı zaman cinsinden gösterir.  Aynı şekilde kişi-gün, kişi-hafta, ve büyük projeler için kişi-yıl kullanılır. Bir kişi-yıllık projeyi 365 kişi bir günde bitirir :).