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 :).

1 Mayıs 2011 Pazar

&Referanslari unset`leyip silmeyi unutma, PHP

$paths = array('a.htm', 'b.htm', 'c.htm', 'd.htm', 'e.thm');
$dir = 'base';
 
// Path`ları standarlaştırırsan
foreach($paths as &$path)
   $path = $dir.'/'.$path;
// unset($path); <- Çözüm budur. Problem ise aşağıda.
 
// Sonra da $path`a değer atamaya kalkarsan
foreach($paths as $path) // mesela, yine foreach
echo $path.', '; 
// Kederli sonuçlar ortaya çıkar.
// base/a.htm, base/b.htm, base/c.htm, base/d.htm, base/d.htm,
// iki kez d.htm çıkmış olur. : (
&

Sorun orda ki, PHP`de foreach`de tanımlanan iterasyon değişkeni ($path) değerini foreach`in dışında da saklıyor.
Dolayısıyla, yukarıdakı foreach son döngüsünde $path`a $paths`ın sonuncusuna referans atadığından, aşağıdakı foreach $path`a her değer atadığında $paths`ın sonuncusunu değiştirmiş oluyor.