1652 Sayfalık İçerik - Tüm Blog Girdilerim

Merhaba Arkadaşlar,

Sabırsızlanan arkadaşlarım yazının en altındaki download linklerine sıçrayabilirler.

Bir yazılımcı sıkıldığında ne yapar? İşte bu günün sorusu...Büyük ihtimalle işlerinden bunalmış veya bazı şeyleri kafaya taktığından içinden çıkılması güç bir psikoloji altına girmiş bir yazılımcının yapacağı şeyler aslında yine teknoloji merkezli olacaktır. Peki ya siz olsanız ne yaparsınız?

  • Belki internet evreninde kafanızı dağıtacak sitelerde gezinirsiniz. Güncel haberler, spor, magazine bültenleri, sosyal ağlar veya chat.
  • Arkadaşlarınız ile oyun oynarsınız ve büyük ihtimalle bu masa üstünde oynayacağınız Satranç ya da Go olmaz. Olsalar bile bilgisayar başında oynanabilenleri olur. Hatta bunun için sosyal ağınıza bir uygulama bile ekleyebilirsiniz. Kuvvetli ihtimalleden birisi PSP gibi oyun konsollarını değerlendireceğinizidir. Tabi şirketinizin içerisinde Turkcell' de olduğu gibi Playstation odası varsa harika.
  • Kitap okuyabilirsiniz ki bu sıkıntınızı daha da arttırabilir çünkü elinizin altındaki kitapların belki de tamamı yazılım ile ilgilidir.
  • Sinemaya gidebilirsiniz ama büyük ihtimalle teknolojinin sınırlarını zorlayan bir filmi seçersiniz. Örneğin Avatar...
  • Bunların haricinde belki MP3 çalarınız ile yürüyeşe çıkabilirsiniz.
  • Ya da kız arkadaşınız veya eşinizle felekten bir gün/gece çalabilirsiniz.

Peki aranızda sıkılınca kod yazanınız var mı? Laughing

Bu gün öylesine çok sıkıldım ki...İçimden pek bir şey yapmak gelmedi. Standart yazılımcı buhranı diyerek ekranıma bakarken bari kod yazayım dedim. Yazacağım kod benim için eğlenceli olsun, sonuçları ise herkes için faydalı olsun istedim. İlk olarak BlogeEngine tabanlı sitemin yönetim paneline girdim ve tüm içeriği dışarıya aktaradım. Artık elimde bloğumda o ana kadar yayınlanmış/yayınlanmamış tüm girdilerin ve bilgilerinin bulunduğu bir XML dosyası vardı. Hımmm... Wink

Öyleyse şöyle bir çalışma içerisine girebilirdim; Tüm XML içeriğini alıp anlamlı bir şekilde tek bir HTML içerisinde birleştirmek. Öyle ahım şahım arayüzü olan bir programa da ihtiyacım yoktu. Basit bir Console uygulaması bile işimi görürdü. Çala klavye yazmaya başladım. Tabi yazarken bol bol debug işlemini uygulamam ve içerikte neyin nerede olduğunu anlamam gerekti. Sonunda aşağıdaki kod ortaya çıktı.

using System;
using System.IO;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace BlogMLReader
{
    class Program
    {
        static void Main(string[] args)
        {   
             // Önce indirdiğim BlogMl.xml dosyasını bir yükliyeyim
            XElement root = XElement.Load( "..\\..\\BlogML.xml");
            // Sonra içerisinden istediklerimi alayım.
            // Nedir bu istediklerim? Yazının başlığı, url adresi, yayın tarihi/oluşturulma tarihi, içeriği(en önemlisi de bu zaten), tag değerleri            
            var allPosts = from post in root.Elements().Last().Elements()
                           where post.LastAttribute.Value == "True" // Hatta içeriği çekerkende yazdığım ama henüz yayınlamadığım yazıları da alması
                           select new // En güzeli anonymous tip kullanmak. Çünkü her şeyi ele almak istemiyorum. Sadece istediklerimi bir tip içerisinde tutmak niyetindeyim.
                           {
                               Title=post.Elements().First().Value,
                               Url=post.Attribute("post-url").Value,
                               DateCreated = post.Attribute("date-created").Value,
                               Content=post.Elements().ElementAt(1).Value,
                               Tags=from tag in post.Elements().Last().Elements() select tag // Birden fazla tag olduğu için...
                           };

            // İçeriği string olarak ele alacaksam performanslı bir tip lazım. StringBuilder mesela
            StringBuilder builder = new StringBuilder();
            
            builder.Append(String.Format("<b>Döküman Oluşturulma Zamanı {0}</b></br>", DateTime.Now.ToLongDateString()));
            // Birde sayaç belirleyim. En azından ekrana kaç tanesinin yapıldığını yazdırabilirim
            int counter = 1;
            // LINQ sorgusu sonucu elde edilen tüm satırlarda dolaşayım
            foreach (var post in allPosts)
            {
                Console.Write("{0} ",counter.ToString());
                counter++;

                // Şurada bir boşluk bırakayım
                builder.AppendLine("</br>");
                // Yazının başlığını link şeklinde basmalıyım. Basit HTML tag' leri işimi görür
                builder.AppendLine(String.Format("<b><h2><a href=\"http://www.buraksenyurt.com{0}\">{1}</a></h2></b>",post.Url,post.Title));
                // Bir boşluk daha bırakayım
                builder.AppendLine("</br>");
                builder.AppendLine(String.Format("Yayın Tarihi : {0}<br/>", post.DateCreated));
                string newContent=String.Empty;
                // Post' taki image' lara ait resimlerin çekilmesi sırasında image.axd isimli bir adrese yönlendirilme söz konusu. Bu nedenle başlarına duruma göre blog adresini ekleyeyim.
                // Aslında bu image' ları request oluşturup yerel makineye indirip ekleyebilirim ama bunu yapmaya üşeniyorum.
                if(!post.Content.Contains("src=\"image"))
                    newContent = (post.Content.Replace("src=\"/", "src=\"http://www.buraksenyurt.com/"));
                else
                    newContent = (post.Content.Replace("src=\"image", "src=\"http://www.buraksenyurt.com/image"));

                builder.AppendLine(newContent);
                // Sanırım bir boşluk burada iyi gider
                builder.AppendLine("</br>");
                
                #region Write Tags
                // Tag' lerini de yazdırayım da konunun hangi alanlara hitap ettiği anlaşılsın
                builder.Append("<b>Tags : </b>");
                foreach (var tag in post.Tags)
                {
                    builder.Append(String.Format("{0}|",tag.FirstAttribute.Value));
                }
                // Bir boşluk daha iyi gider mi? Gider.
                builder.AppendLine("</br>");

                #endregion
            }
            // Nihayet! Şimdi tüm string' i html uzantılı bir dosyaya yazayım ki tarayıcılarda açabileyim. Hele ki internet bağlantısı da var ise tüm resimler görünür.
            File.WriteAllText("BurakSenyurt_AllPublishedPost.html", builder.ToString(),Encoding.Unicode);
        }
    }
}

Kodu çok fazla açıklama gereği duymuyorum ama basit anlamda XML içeriğini LINQ to XML nimetlerinden yararlanarak ele aldığını ve StringBuilder tipini kullanarak bir HTML dosyası ürettiğini ifade edebilirim. İşte uygulamanın çalışması sonucu ilgili klasör altında oluşan HTML dosyası.

Gördüğünüz gibi HTML dosyası başarılı bir şekilde oluşturuldu. 11 Mb civarında. Wovvv!!! Sealed Tabi kodun bu şekilde bir sonuç ürettiğini gördükten ve HTML içeriğinin tamamının yüklenmesinin tarayıcılara göre çok yavaş olmasından ötürü aklıma başka bir fikir daha geldi. Dedim ki, bu HTML içeriğini ben Word formatında kayıt edersem çok daha yararlı bir ürün ortaya çıkabilir. Böylece herkesin indirip istediği gibi kullanabileceği(kötü niyetli olarak değil tabiki de) bir döküman oluşabilirdi.

Artık bunun için de kod yazayım mı yazmıyayım mı diye düşünürken Firefox ile açtığım HTML içeriği üzerinde Select All yaptım. Aman Allahım. Yapmaz olaydım. Undecided Firefox kitlendi. E haklı tabi. 11 Mb' lık Web sayfası içeriği ona fazla geldi. Peki dedim birde Google Chrome' u deniyeyim. Harika...Başarılı bir şekilde Select All ve Copy işlemi yapıldı. Ama Word içerisine Paste edilebilen hiç bir şey yoktu ortada. Uzun süre bekledim ama zaten sabırsız birisi olduğumdan onu da kapattım. En başta söylemem gerekeni en sonda söyledim...Dedim ki; iki Microsoft ürünü birbirleriyle sorunsuz anlaşır. Internet Explorer 8 ile HTML dosyasını açtım. Dosya açıldı ama resimlerin yüklenmesi Firefox'a hatta Chrome'a göre çok daha yavaştı. Eyvah dedim...Ancak en azından sol alt köşede 1600 küsür resimden kaçıncısını yüklediğini söylüyordu. Buna göre tahmini olarak ne kadar bekleyeceğimi biliyordum. Resimler yüklendikten sonra Select All yaptım. Belki bir kaç on saniye bekledikten sonra tüm içerik seçili haldeydi. Hemen Word 2007 tarafına geçtim ve Paste işlemini uyguladım. Volaaaaa!!! İşlem başarılıydı.Laughing Tabi HTML içeriğini oluştururken Title' lara Heading takısını uygulamanın avantajlarını da hemen gördüm. Nitekim aşağıdaki resimden de görüldüğü üzere Document Map otomatik olarak oluşturulmuştu.

Tabi Word dökümanının boyutu 30 Mb' ı geçmişti. Undecided Neyseki hosting firması DiscountAsp.Net' in sitem için ayırdığı 1 gb' a varan alanı bu boyut için müsaitti. Tabi çok doğal olarak ilk yazılarda yer alan Flash nesneleri bu Word dosyası içerisinde oynamıyor. Ama Title' ların aynı zamanda makale linki olduğunu hatırlatmak isterim. Dolayısıyla internet bağlantınız mevcut ise doğrudan buraksenyurt.com adresine de gidebilirsiniz.

Not : 4 Gb Ram'e sahip çift çekirde intel işlemcili makinemde, Windows 7 işletim sisteminin yönetimi altındaki Word 2007 programı, söz konusu dökümanı yaklaşık olarak 40 saniye civarlarında açabilmekte.

Umarım işinize yarar. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.

AllPosts.rar (30 Mb)

Yorumlar (9) -

  • Canı sıkıldığında kod yazmayı tercih eden biri olarak teşekkür etmek istiyorum. Yazılım sektörüne çok büyük katkılarınız oluyor sizi tebrik etmemek mümkün değil. Başarılarınızın devamını dilerim. İyi çalışmalar.
  • Burak hocam emeginize saglik,
    su an bende, psikolojik  olarak ve kod yazmaktan yorulmustum.. Cani sıkılan bir developer olarak dolanıyordum nette ..Bu yazi iyi geldiSmile

    Tesekkurler.
  • Hocam Allah razı olsun.Çalışmalarınızı/Yazılarınızı büyük bir haz ile takip ediyorum.Devamının gelmesi dileğiyle..
  • İnsaları bilgilendirmek kadar arada böyle eğlenceli yazılar ile "Gülümsetmek" hoş bir duygu olsa gerek.Teşekkürler Smile)
  • Güzel bir yazı olmuş. Ben sıkılınca film veya dizi izliyorum... Kafa dağıtmaya birebir Smile
  • Çok büyük bir keyifle okuduğum ve okurken de bana birçok şey kattığını düşündüğüm bu yazılar için teşekkür ederim, elinize sağlık...
  • Çok teşekkürler Burak hocam Smile Paylaşım konusunda gerçekten sınır tanımıyorsunuz Smile

Yorum ekle

Loading