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ı?
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...
Ö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!!! 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. 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ı. 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. 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)