TİMUR EROĞLU'NUN GÜNLÜĞÜ
Anasayfa  Hakkımda
Yazılımcı
Bana Ulaşın
Arama

yaşamak bir ağaç gibi tek ve hür ve bir orman gibi kardeşçesine
N.Hikmet Ran

Visual Studio’nun bize sunduğu imkanlardan biri de template’ler. Bazı durumlarda yaratacağımız sınıflar için ortak kodlarımız vardır. Örneğin bir UserControl oluşturuyorsak gerekli namespace ler eklenmeli, sınıfımız UserControl sınıfından türetilmeli, InitializeComponent metodu yaratılmalı ve içerisinde gerekli nesneler oluşturulmalı. Biz ise projemizde Add à New Item dediğimizde, bize gelen ekrandan UserControl ü seçip oluşturduğumuzda, bu gerekli eklemelerin hazır geldiğini görüyoruz. Peki ya bu hazır template ler dışında kendimize ait, bize özel template lere ihtiyacımız varsa nasıl yapacağız?

Örneğin bizim yaratacağımız sınıfların Guid lerinin verilmesi gerekiyor, bunun için System.Runtime.InteropService namespace inin eklenmesi gerekiyor. Sınıflarımızda da iki property olacak Sınıfİsmi + Id ve Sınıfİsmi + Name olarak. Ve bu sınıflarımızda bir adet constructor olacak Sınıfİsmi + Name property sini set etmek amacıyla. Ve bu sınıflarımızın ToString metodu override edilerek ve değer olarak Sınıfİsmi + Name si dönecek.

Bunun için kendi templatelerimizi oluşturmalıyız. Oluşturmak için projemizde bir adet sınıf oluşturuyoruz ve template parametereleri ile oluşturuyoruz sınıfımızı. Parametrelerin listesi şu şekilde :

clrversion - Current version of the common language runtime (CLR).

GUID [1-10] - A GUID used to replace the project GUID in a project file. You can specify up to 10 unique GUIDs (for example, guid1).

itemname -The name provided by the user in the Add New Item dialog box.

machinename -The current computer name (for example, Computer01).

projectname -The name provided by the user in the New Project dialog box.

registeredorganization - The registry key value from HKLM\Software\Microsoft\Windows NT\CurrentVersion\RegisteredOrganization.

rootnamespace -The root namespace of the current project. This parameter is used to replace the namespace in an item being added to a project.

safeitemname -The name provided by the user in the Add New Item dialog box, with all unsafe characters and spaces removed.

safeprojectname -The name provided by the user in the New Project dialog box, with all unsafe characters and spaces removed.

time -The current time in the format DD/MM/YYYY 00:00:00.

userdomain -The current user domain.

username -The current user name.

year -The current year in the format YYYY.

Parametreler $ işaretleri arasında kullanılır.

$safeitemname$

$username$ gibi.

Sonra kendimize uygun template imizi sınıf yazar gibi oluşturuyoruz.

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace $rootnamespace$ -- Projenin namespace i yazılacak

{

    /// <summary>

    /// Created by $username$ - Kullanıcı Adı gelecek

    /// </summary>

    [Guid("$guid1$")] –- Yeni bir guid yaratılacak

    public class $safeitemname$ -- Verdiğimiz sınıfın ismi gelecek

    {

        private int _$safeitemname$Id = 0;

        private string _$safeitemname$Name = string.Empty;

        public $safeitemname$ ()

        {

        }

        public $safeitemname$ (string name)

        {

            _$safeitemname$Name = name;

        }

        public int $safeitemname$Id

        {

            get{return _$safeitemname$Id;}

            set{ _$safeitemname$Id = value;}

        }

        public string $safeitemname$Name

        {

            get{return _$safeitemname$Name;}

            set{ _$safeitemname$Name = value;}

        }

        public override string ToString()

        {

            return $safeitemname$Name;

        }

    }

}


$rootnamespace$ yerine sınıfın bulunduğu namespace, $safeitemname$ yerine sınıfımızın ismi, $username$ yerine o sınıfı oluşturan kullanıcının adı gelecek.

Template nesnemizi yazdıktan sonra File-Export Template yolunu izliyoruz. Önümüze çıkan ekrandan Item Template şıkkını seçtikten sonra devam ediyoruz ve ekrandan templatimizi oluşturacak olan sınıfı seçiyoruz. Daha sonra istersek hangi namespace içinde olması gerektiğini belirtiyoruz ve en son template imizin ismini, iconunu ve açıklamasını seçerek kaydediyoruz.

Bundan sonra Visual Studio ile oluşturduğumuz herhangi bir projeye Add --> New Item dediğimizde kendi template imizi seçersek nesnemiz istediğimiz şekilde oluşacak.

Örneğin Book isminde bir nesne oluşturalım(My Templates altındaki DebugTemplate i seçiyorum, yani benim yarattığım template i).


Sınıfımız aşağıdaki şekilde oluşacaktır.

using System;

using System.Collections.Generic;

using System.Text;

using System.Runtime.InteropServices;

namespace MyTemplate

{

       /// <summary>

       /// Created by Timure

       /// </summary>

       [Guid("fe5bbf53-2d09-42be-914c-f00c237efee1")]

       public class Book

       {

             private int _BookId = 0;

             private string _BookName = string.Empty;

             public Book()

             {

             }

             public Book(string name)

             {

                    _BookName = name;

             }

             public int BookId

             {

                    get { return _BookId; }

                    set { _BookId = value; }

             }

             public string BookName

             {

                    get { return _BookName; }

                    set { _BookName = value; }

             }

             public override string ToString()

             {

                    return BookName;

             }

       }

}

Kaynak : http://msdn2.microsoft.com/en-us/library/eehb4faa(VS.80).aspx

Bol neşeli günler...

Yorumlar(0) 11 Nisan 2008 Cuma

Yorumlar(2) 11 Nisan 2008 Cuma

Bir uygulamamızda o anda aktif olan pencereyi almak istiyorsak “user32.dll” içerisindeki GetForeGroundWindow metodunu kullanırız. Bu metot bize aktif olan pencerenin handle değerini döndürür. Biz de bu handle değeriyle o forma erişebiliriz ve o forma istediğimiz işlemi uygulayabiliriz.

[DllImport("user32.dll")]

public static extern IntPtr GetForegroundWindow();

Ben uygulamamda eğer o pencere bir uygulamanın MainWindow’u ise o uygulamayı alıyorum. Bunu da formun handle değerini o uygulamanın MainWindow’unun handle değeriyle karşılaştırarak yapıyorum.

public Process GetForeGroundWindowProcess()

{

       IntPtr handle = Native.GetForegroundWindow();

       Process[] processes = Process.GetProcesses();

       for (int i = 0; i < processes.Length; i++)

       {

             if (processes[i].MainWindowHandle == handle)

                    return processes[i];

       }

       return null;

}

Uygulamamda aynı zamanda aktif pencereyi aldığımız anda ekranın görüntüsünü de alıyorum. Aldığım bu görüntüyü Temp klasörüne kopyalıyor, form kapanana kadar orada saklıyorum.

public static Image GetScreenImage()

{

IntPtr handle = Native.GetDesktopWindow();

       IntPtr hdcSrc = Native.GetWindowDC(handle);

       Native.RECT windowRect = new Native.RECT();

       Native.GetWindowRect(handle, ref windowRect);

       int width = windowRect.right - windowRect.left;

       int height = windowRect.bottom - windowRect.top;

       IntPtr hdcDest = Native.CreateCompatibleDC(hdcSrc);

       IntPtr hBitmap = Native.CreateCompatibleBitmap(hdcSrc, width, height);

       IntPtr hOld = Native.SelectObject(hdcDest, hBitmap);

       Native.BitBlt(hdcDest, 0, 0, width, height, hdcSrc, 0, 0, Native.SRCCOPY);

       Native.SelectObject(hdcDest, hOld);

       Native.DeleteDC(hdcDest);

       Native.ReleaseDC(handle, hdcSrc);

       Image img = Image.FromHbitmap(hBitmap);

       Native.DeleteObject(hBitmap);

       return img;

}

public static string SaveImage()

{

       Image image = GetScreenImage();

       string path = Path.GetTempPath() + Path.GetFileNameWithoutExtension(Path.GetTempFileName());

                    image.Save(path + ".gif", ImageFormat.Gif);

       return path + ".gif";

}

Daha sonra bu resimleri form kapanırken siliyorum.

private void Form1_FormClosing(object sender, FormClosingEventArgs e)

{

       for (int i = 0; i < lwProcesses.Items.Count; i++)

       {

             try

             {

                    File.Delete(lwProcesses.Items[i].SubItems[2].Text);

             }

             catch

             {

              }

       }

}

Ekran görüntüsünü de alıp listeme uygulamanın adı, uygulamanın ana penceresinin ismi Title ı ile birlikte ekliyorum. Bu işlem timer her tick olduğunda yapılıyor(Uygulamamda 5 saniye).

private void timer1_Tick(object sender, EventArgs e)

{

       Process process = GetForeGroundWindowProcess();

       string s = ScreenCapture.SaveImage();

       if (process == null)

       {     

             lwProcesses.Items.Add(new ListViewItem(new string[] { "Null", "Null",s }));

       }

       else

       {

             lwProcesses.Items.Add(new ListViewItem(new string[] { process.ProcessName,process.MainWindowTitle,s }));

       }

}

Daha sonra listemde “Click For Image” kısmına tıklandığında yeni bir form açılıp, listedeki o item ile ilgili resim yeni bir formda açılıyor. Yeni açılan formun aktif olmaması için SWP_NOACTIVATE ile gösteriyoruz.

Formun gösterilme kodları…

public void Show(string imagePath, Point p)

{

       Native.ShowWindow(this.Handle, Native.SWP_NOACTIVATE);

       Set(imagePath, p);

}
 

public void Set(string imgPath, Point pt)

{

       pbImage.ImageLocation = imgPath;

       Location = pt;

}

ListView’un sonuncu subitem’ına tıklandığında o formu açıyorum.

private void lwProcesses_MouseDown(object sender, MouseEventArgs e)

{

       Point p = new Point(e.X, e.Y);

       ListViewHitTestInfo info = lwProcesses.HitTest(p);

       if (info.SubItem != null && info.Item.SubItems.IndexOf(info.SubItem) == 2)

       {

             if (imageForm != null)

             {

                           imageForm.Set(info.SubItem.Text, lwProcesses.PointToScreen(p));

             }

             else

             {

                    imageForm = new frmImage();

                    imageForm.Show(info.SubItem.Text, lwProcesses.PointToScreen(p));

                    AddOwnedForm(imageForm);

             }

       }

}


Kaynak kodlarını indirmek için tıklayın... 

Bol neşeli günler…

Yorumlar(0) 26 Aralık 2007 Çarşamba

Merhaba. İşte bir yılı daha doldurduk acısıyla tatlısıyla.

Her ne kadar doğumgünlerini anlamsız bulsak da insan etkisinde kalıyor. Ömrümden bir yıl geçti diye düşünmeden edemiyor. Peki nasıl geçti? Asıl önemli soru burada yatıyor bence. Bir yıl daha yaşlandık, peki bu bir yıl yaşlanma bize neler getirdi, neler kazandırdı bize?

Bunun muhasebesini yapmak o kadar da zor ki, herkes yaşamıştır, o kadar da kolay değil kazancımızın mı yoksa kaybettiklerimizin mi daha çok olduğuna karar vermek.

Şu anda da bunun muhasebesiyle uğraşmaktayım, acaba doğru şeyler mi yaptım, yoksa hep pişman olacağım şeyler mi? Ben şuna inanıyorum ki, insan ne kadar doğru şeyler yaparsa yapsın, ne kadar doğru kararlar verirse versin aklının bir ucunda hep acabalar olacaktır. Acaba şöyle yapsaydım nasıl olurdu, daha mı iyi olurdu vs… Onun için pek de keşkelere sığınmak istemiyorum hayatımda. Hep inanmışımdır, bir karar verdiysen onun arkasında olacaksın, Hayatında keşkelere yer vermeyeceksin, elimden geldiğince de buna uymaya çalışıyorum.

Evet, geçen bir yılda ne oldu? Neler yaptım? Neler yapmam gerekiyordu? Bence hayatımın en doğru yıllarından birini yaşadım. En önemlisi  iş hayatımda ilk deneyimim insanların bilmem kaçıncı deneyiminden daha doğruydu. Her şeyden önemlisi Özcan Değirmenci gibi biriyle aynı ortamda çalışmak gibi bir şansım oldu. Yanlış anlamayın, sadece Fox Decompiler’ı  yazmış olmasından dolayı bana aktaracağı tecrübelerden kaynaklı değil, gerçekten de iş hayatında karşılaşabileceğiniz en iyi iş arkadaşlarından birine sahip olduğum için şanslı sayıyorum kendimi. İş ahlakını bana öğrettiğin için sonsuz teşekkürler Özcan…. Sadece Özcan değil bana bu iş hayatında yardımcı olan dostlarım Bülent, Murat ve Selçuk’a da sonsuz teşekkürler….


Kalın sağlıcakla….

Yorumlar(4) 10 Ekim 2007 Çarşamba

Microsoft .Net 3.5 sürümünün kütüphanelerinin kodlarını açıyor. Kodlar Visual Studio 2008 ile birlikte gelecek. Bu sayede debug işlemi sırasında debugger kütüphanenin kodlarına dallanacak ve programcılar hatanın sebebini kütüphane kodları üzerinden görebilecek.

Camiamıza hayırlı ve uğurlu olmasını diliyoruz...

Kaynak : http://weblogs.asp.net
Yorumlar(0) 08 Ekim 2007 Pazartesi

.Net 2.0 içerisinde Sql Server veritabanı ile ilgili işlemlerde SMO(SQL Management Objects) kullanabiliriz. SMO nesneleri ile Sql Server’lara erişip, onlar üzerinde çeşitli işlemler gerçekleştirebiliriz. Bu örnekte biz SMO kullanarak Sql Server üzerindeki çeşitli database’lerin yedeklerini alacağız. Bunun için ilk başta projemize Microsoft.SqlServer.Smo ve  Microsoft.SqlServer.ConnectionInfo referanslarını ekleyeceğiz.


Bir bilgisayarda register edilmiş Sql Server’lara erişebiliyoruz.
 

RegisteredServerCollection servers = SmoApplication.SqlServerRegistrations.RegisteredServers;

 

Ve aldığımız bu server’lar üzerinde database’lerin listesini de yine bu Smo nesnelerini kullanarak alabiliyoruz.

Server server = new Server(cbServers.Text);

DatabaseCollection databases = server.Databases;

Aldığımız bu database’lerin yedeğini almak için de, Smo içerisinde bulunan Backup nesnesinden faydalanıyoruz.

Server server = new Server(cbServers.Text);

Backup backup = new Backup();

backup.Database = database.Name;

backup.Devices.Add(new BackupDeviceItem(txtPath.Text + "\\" + database.Name + ".bck", DeviceType.File));

backup.Action = BackupActionType.Database;

backup.SqlBackup(server);

 

Smo üzerinden yedeklemenin yanından birçok işlem gerçekleştirebiliriz. Server’lar ile ilgili bilgilerin alınması, ayarların değiştirilmesi vs.

Kaynak Kodları İçin Tıklayın....

Bol neşeli günler….

Yorumlar(2) 07 Ekim 2007 Pazar

           Evet tam bir yıl sonra aileme kavuşuyorum. Gerçi 4 gün gibi kısa bir süre görüşebileceğiz ama, 1 yıl bekleyince insan ne kadar süre göreceğini dert etmiyor. Yeter ki bir kavuşup da hasret giderelim diyor. Bugün yolca çıkıyorum, yarın sabah Mersin'deyim.

          O da çok kötü bir güne denk geldi. Sen bir yıl boyunca bekle, sonra git Fenerbahçe'nin maçının olduğu gün yola çık . Olacak iş değil. Gerçi Fenerbahçe'm kazansın da, gerisi mühim değil. Maksat Fenere gol olmasın

       Bol neşeli günler...
Yorumlar(0) 29 Ağustos 2007 Çarşamba

Merhaba. Windows işletim sisteminde sistem bilgilerine erişmek, onları yönetmek için WMI(Windows Management Instrumentation- Windows Yönetim Araçları) kullanılır. Ben de WMI ile ilgili yaptığım bir örneği sizlerle paylaşmak istedim. Bu örneğimde WMI ile harddisk ve işlemci bilgilerini alacağız.

WMI ile bilgileri almak ve sistemi yönetmek için System.Management namespace’i altındaki nesnelerden faydalanıyoruz. O yüzden ilk başta System.Management dll’ini projemize referans olarak ekliyoruz. Daha sonra nesneleri alacağımız sınıfı yazıyoruz.

class WMIManager

    {

        //Nesnemizin etki alanını temsil ediyor

        ManagementScope _scope = null;

        //İstediğimiz verileri sistemden alır

        ManagementObjectSearcher _searcher = null;

        //İstediğimiz nesnelerin bize verildiği collection

        ManagementObjectCollection _collection = null;

        public WMIManager(string machineName, string userName, string password)

        {
            //Yerel makinede çalışıyorsak
           
if (machineName == string.Empty)
            {
                machineName = "localhost";
            }
            //Etki alanımız belirlenir. Yani hangi makinenin bilgilerini alacağımız
           
_scope = new ManagementScope("\\\\"+ machineName +"\\root\\cimv2");
            if (userName != null)
            {
                /*Eğer uzak makineden veri alacaksak kullanıcı kimliğimizi göndeririz.
               
Bu kullanıcı kimliği o bilgisayarda yönetici olmak zorunda ve şifre
                boş olmamalı*/
                ConnectionOptions coptions = new ConnectionOptions();
                coptions.Username = userName;
                coptions.Password = password;
                _scope.Options = coptions;
            }         
       
}

        public ManagementObjectCollection GetCollection(string queryString)
        {
            /*Hangi bilgileri istediğimizi gösteren sorgu cümlemiz gelir ve o cümleye göre
            
istediğimiz bilgileri alırız*/
            ObjectQuery query = new ObjectQuery(queryString);
            _searcher = new ManagementObjectSearcher(_scope, query);
            _collection = _searcher.Get();
            return _collection;
        }

    }

Daha sonra aldığımız bu nesneleri listeleyeceğimiz kodları yazıyoruz. WMI ile bilgileri almak için hangi verileri istediğimiz bir sorgu cümlesiyle sisteme bildiriyoruz. Örneğin sistemdeki disklerin tüm bilgilerini almak için “Select * from Win32_LogicalDisk” cümlesini gönderiyoruz. Ya da sadece Sistemdeki disklerin seri numarasını almak için “Select VolumeSerialNumber from Win32_LogicalDisk” sorgusunu gönderiyoruz.

private void btnLogicalDisks_Click(object sender, EventArgs e)
        {
            //Sistemde bulunan diskler hakkındaki tüm veriler alınır
           
LoadInformations("Select * from Win32_LogicalDisk");
        }
        private void LoadInformations(string query)
        {
            string computerName = txtComputerName.Text;
            string userName = txtUserName.Text;
            string password = txtPassword.Text;
            ManagementObjectCollection collection = null;
            WMIManager manager = null;
            /*WMI bilgilerini alacağımız nesnemiz oluşturuluyor. Eğer yerel makinede çalışıyorsak
            
kullanıcı adı ve şifre boş bırakılır*/
            if (userName != string.Empty)
            {
                manager = new WMIManager(computerName, userName, password);
            }
            else
           
{
                manager = new WMIManager(computerName, null, null);
            }
            try
           
{
                /*Oluşturduğumuz nesneden istediğimiz bilgileri alıyoruz*/
        
       collection = manager.GetCollection(query);
            }
            catch (Exception exp)
            {
                MessageBox.Show(exp.Message);
                return;
            }
            lwWMI.Columns.Clear();
            lwWMI.Items.Clear();
            /*Her WMI class'ına göre farklı özelllikler olacağından gösterimde farklı ColumnHeader olmalıdır.*/
           
bool headersLoad = false;
            ColumnHeader[] headers = null;
            int headerIndex = 0;
            ListViewItem[] lwItems = new ListViewItem[collection.Count];
            int itemIndex = 0;
            /*Bilgiler bize ManagementObject olarak veriliyor. Biz de bu bilgeleri listeliyoruz*/
           
foreach (ManagementObject obj in collection)
            {
                /*Aldığımız nesnelerin tüm özelliklerini listelemek için property'lerini dönerek her biri için bir
                
ColumnHeader yaratıyoruz*/
                PropertyDataCollection dataCollection = obj.Properties;
                if (!headersLoad)
                {
                    headers = new ColumnHeader[obj.Properties.Count];
                    foreach (PropertyData pData in dataCollection)
                    {
                        ColumnHeader header = new ColumnHeader();
                        header.Text = pData.Name;
                        header.Width = 150;
                        headers[headerIndex] = header;
                        headerIndex++;
                    }
                    lwWMI.Columns.AddRange(headers);
                    headersLoad = true;
                }

                /*Aldığımız bilgiler ListView'a ekleniyor*/
               
ListViewItem item = null;
                string[] values = new string[dataCollection.Count];
                for (int i = 0; i < dataCollection.Count; i++)
                {
                    /*PropertyDataCollection içerisindeki indexleyici bizden property'nin ismini istiyor.
                    
Biz de bu ismi ListView kolonlarına verdiğimiz için ordan alabiliyoruz. Ve o indexleyici
                     yarıdmıyla da bilgileri alabiliyoruz....*/
                    PropertyData data = dataCollection[lwWMI.Columns[i].Text];
                    if (data.Value != null)
                        values[i] = data.Value.ToString();
                    else
                       
values[i] = string.Empty;
                }
                item = new ListViewItem(values);
                lwItems[itemIndex] = item;
                itemIndex++;
            }

            lwWMI.Items.AddRange(lwItems);
        }
        private void btnProcess_Click(object sender, EventArgs e)
      
{
            //Makinede bulunan İşlemci bilgileri alınır
           
LoadInformations("Select * from Win32_Processor");
        }



                Kaynak Kodları İndirmek İçin Tıklayın...

İyi  Günler....

Yorumlar(0) 23 Ağustos 2007 Perşembe

Diyelim ki bir klasörden resimleri alıyorsunuz ve bir şekilde bu resimlerle ilgili açıklama da koymanız gerekiyor. Benim
blogum için böyle bir şeye ihtiyacım oldu(Albümlerde bazı resimler için açıklama koymak istedim). Resim dosyalarının
sonuna yazacağım açıklamayı ekliyorum ve resmi görüntüleyeceğim zaman resmin sonundan bu açıklamayı okuyorum
ve resmi görüntülerken açıklamayı da gösterebiliyorum. Burada önemli noktalardan biri de açıklamayı yazdıktan sonra
açıklamanın uzunluğunu da resim dosyasının sonuna eklemektir. Çünkü okuma işlemi sırasında dosyadan ne kadar
yazı okuyacağımız bilmemiz gerekir.

 

Yazma işlemi şu şekilde;

 

public static bool WriteText(string filename, string text)

        {

            try

            {

                FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.ReadWrite);

                /* Yazacağımız text byte türünden diziye çevriliyor */

                byte[] bytes = Encoding.Default.GetBytes(text);

                /* Dosyaya yazma işlemi için BinaryWriter nesnesi oluşturuluyor */

                BinaryWriter bw = new BinaryWriter(fs);

                /* Cursor un posizyonu dosyanın sonuna ayarlanıyor */

                fs.Position = fs.Length;

                /* Text dosyanın sonuna yazılıyor */

                bw.Write(bytes);

                /* Yazdığımız text in uzunluğunu da dosyanın sonuna ekliyoruz */

                bw.Write(bytes.Length);

                bw.Flush();

                bw.Close();

                fs.Close();

                fs.Dispose();

                return true;

            }

            catch

            {

                return false;

}

}

 

Okuma işlemi de şu şekilde;
 

public static string ReadText(string filename)
        {
            try
           
{
                FileStream fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
                /* Dosyadan okuma yapmak için BinaryReader nesnesi oluşturuluyor */
               
BinaryReader br = new BinaryReader(fs);
                /* Dosyanın sonundan yazının uzunluğu okunuyor */
               
fs.Position = fs.Length - 4;
                int count = br.ReadInt32();
                /* Cursor yazının başladığı yere ayarlanıyor */
               
fs.Position = fs.Length - count - 4;
                /* Yazı okunuyor ve string olarak veriliyor */
               
byte[] buffer = br.ReadBytes(count);
                return Encoding.Default.GetString(buffer);
            }
            catch(Exception exp)
            {
                return "Error" + exp.Message;
            }
   }


Kaynak Kodlar İçin Tıklayın

Yorumlar(2) 14 Ağustos 2007 Salı

Sonunda bloguma kavuştum. Hani derler ya “Terzi kendi söküğünü dikemez” diye, benimki de öyle oldu. Ne zamandır kendi blogumu yazacam, bir türlü vakit ayırıp da yazmadım. Bu süre içinde gerek işyerinde, gerek dışarıda, gerekse de okul için projeleri yapmaya zaman ayırdım, bir tek kendi bloguma zaman ayırmadım. Kendime haksızlık ettim sanırım biraz.
   
Bir de yazılımcıyız ya, illa kendimiz yazacağız. Nasıl olsa elimizden geliyor, bari kendi emeğimiz olsun dedik. İyi de olsa, kötü de olsa, her satırında kendi emeğinin olduğu bir ürün yaratmak gerçekten zevk veriyor insana.

Önceden çok anlamsız gelirdi insanın kendisi ile ilgili bir site yapması. Sonraları anlamaya başladım yavaş yavaş. İnsan düşüncelerini de, sevincini de, üzüntüsünü de paylaşmak istiyor. Yeri geldiğinde ne kadar mutlu olduğunu, yeri geldiğinde en  kadar hüzünlendiğini haykırmak istiyor insan. Yeri geldiğinde de gündem hakkında, bir olay hakkında düşüncelerini paylaşmak istiyor insanlarla.

Tabi bir de bilgisini paylaşmak istiyor. Bir yazılımcının da bilgisini en iyi paylaşacağı yerdir sanırım internet. Şu anda zaten C#nedir?com forumlarında bildiklerimi paylaşmaya çalışıyorum. Artık bundan sonra buradan da öğrendiklerimi paylaşacağım.

Bol neşeli günler...
Yorumlar(12) 14 Ağustos 2007 Salı

Sitede yayınlanan bütün yazılar ve yorumlar sadece kişilerin kendilerini bağlar.
The website owner will not be responsible for comments made by other people on to the website
and that all comments are the opinion of these individuals only.
Created By Timur Eroğlu © 2007