İş dünyasındaki sunucu ortamlarda sürekli haşır neşir olduğum linux işletim sistemi, son yıllarda container ortamların iyice yaygınlaşmasıyla birlikte yol arkadaşım oldu.
Kişisel bilgisayarımda Linux işletim sistemine taşınmak, uzun süredir aklımda olan planlardan biriydi. Bunun en önemli nedeni, bilgisayrımda yaşadığım kaynak yetersizliğiydi. Bu yetersizliğin en önemli nedenlerinden biri de Windows işletim sistemi üzerinde Linux tabanlı araçlarının kurulabilmesi için yüklenen sanallaştırma platformlarıydı. Bir süre sonra windows üzerinde terminali bile linux tabanlı kullanmaya başlamıştım. O halde uzun süredir kullandığım Windows işletim sisteminden Linux ortamında bir desktop dağıtıma geçme vaktinin geldiğine karar verdim. Community desteğinin de geniş olması nedeniyle seçimim Ubuntu desktop oldu.
Linux dünyasına geçmeden önce geliştirme araçlarımın linux desteğini inceledim ve artık geçişi başlatmaya karar verdim. Refus programı ile bir USB kurlum olşuturdum ve yedekteki SSD diskim üzerine kurulumu yaptım.
Windows çok kullanışlı ve alışık olduğum bir işletim sistemi olması nedeniyle, Linux desktopa alışamam bir hafta kadar sürdü. Kurulumlar, dosya sistemi, sürücülerin tanıtılması vs. derken bir hafta sonunda acemiliğimi atmış oldum. Server versiyondan alışık olduğum için bir çok kurulumu terminal ile yapmaya çalıştım.
Performans konusunda gayet memnun kaldım. Windows üzerinde container ortamlarda ayağa kaldırdığım araçları Linux üzerinde kaldırdığımda kaynak kullanımı neredeyse %50 civarında fark ettiğini gördüm. Bilgisayarın rahatlamasıyla bende rahat bir nefes almış oldum.
Sonuç olarak, eğer geliştirme değil de ofis veya ev amaçlı bir desktop işletim sistemi seçecek olursam yine windows tercih ederdim. Ancak yazılım ve mühendislik amaçlı kullanımda Unix tabanlı bir işletim sistemini (Linux veya Mac) tercih ederim.
WSL üzerinde çalışan ubuntu veya diğer ürünlerin versionunu görüntülemek için aşağıdaki komut kullanılır.
wsl -l -v
NAME STATE VERSION
docker-desktop-data Stopped 2
Ubuntu-20.04 Running 1
docker-desktop Stopped 2
Ubuntu versionunu 2 yapmak için kullanılacak komut, kurulu olan ubuntu versiyonuna göre aşağıdaki şekilde yapılmaktadır. Örnekteki 20.04 sürümü kurulumunuza göre değişebilir.
wsl --set-version Ubuntu-20.04 2
Conversion in progress, this may take a few minutes…
For information on key differences with WSL 2 please visit https://aka.ms/wsl2
Conversion complete.
İşlem tamamlandıktan sonra yeni version listesi aşağıdaki gibi olacaktır.
wsl -l -v
NAME STATE VERSION
docker-desktop-data Stopped 2
Ubuntu-20.04 Running 2
docker-desktop Stopped 2
Microsoft, windows 10 ile birlikte yeni bir terminal aracını biz kullanıcıların hizmetine sunmuştur. Windows bünyesinde bulunan ilk komut kullanım aracı Command Prompt’tur. Daha sonra yeni bir komut arayüzü olarak Powershell aracı Windows’a dahil edilmiştir. Fakat bu iki araçta rakip işletim sistemlerinin sunduğu konsol araçlarına göre biraz kulanışsız kalmıştır. Örneğin birden fazla ortamda komut satırı çalıştırmak istediğimiz de çok fazla pencere açmamız gerekmektedir. Ayrıca bu araçlarda tab özelliği bulunmamaktadır.
Mizrosoft firması, bu eksiklikleri kapatan açık kaynak kodlu Windows Terminal aracını geliştirmiştir. Windows terminal aracı hem tab kullanımı ile birden fazla pencereyi tek bir ekranda yönetme imkanı sunar, hemde temalar ile görseli özelleştirilebilen bir özelliğe saiptir. Windows terminal aracı windows store üzerinden indirlebilmektedir.
Windows terminalde birden fazla konsol aracını yukarıda görüldüğü gibi aynı anda açabilmek mümkündür. Her konsol aracı ayrı bir tab da görünür. Yeni tab eklemek için pencerenin üst kısmındaki aşağı ok tuşuna basarak istediğimiz aracı seçebiliriz. Resimde dikkat ederseniz ubuntu konsol aracı da eklenmiştir. Bu aracı windows ortamında kullanabilmek için WSL(Windows Subsystem for Linux) kullanabilirsiniz. Bu araç sayesinde windows üzerinde windows store kullanarak istediğimiz linux sürümünü kurabiliriz.
Windows terminalde görünüm özelleştirilebilmektedir. Bunun için aşağıdaki ayarlar sekmesinden ;
Aşağıda sarı ile işaretli araylar butonuna tıklandığında, varsayılan editör ile terminalin ayarlar dosyası (settings.json) açılır.
Benim bilgisayarımda Visual Studio 2019 olduğu için bu editör ile ayarları yapabiliyorum.
Settings.json dosyasında her terminal için profiles objesindeki list kolleksiyonunda ayarlar bulunur. Terminalin görünüm özelliğini değiştirmek için iki yol vardır.
Örneğin Powershell’de One Half Dark şeması için ayarları şu şekilde değiştirip kaydetmek yeterlidir. Görüntü hemen güncellenecektir.
{
// Make changes here to the powershell.exe profile.
"guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
"name": "Windows PowerShell",
"commandline": "powershell.exe",
"hidden": false,
"colorScheme": "One Half Dark"
}
İkinci yol ise kendi ayarlarımızı settings.json dosyası içerisindeki schemes dizisine eklmektir. Burada terminal görsellerine ait çok fazla ayar bulabilirsiniz. Örneğin Command Propt için schemas dizisine aşağıdaki gibi bir ayar ekleyelim.
IIS üzerinde bulunan Rewrite modülü, URL için yeniden yazma diye adlandırılan kuralları uygulamayı sağlar.
Dış dünyaya açık olmayan iç sunuculara erişimin kontrolü
Kurumunuzdan tek bir IP üzerinden erişim sağlanabilen URL adreslerine erişimin çoğaltılabilmesi ve güvenlik altına alınabilmesi
gibi bir dizi kuralların uygulanması URL Rewrite modülü ile gerçekleştirilebilir. Bunun için IIS üzerinde bir Web site veya bir web site içerisine oluşturulan bir uygulama üzerinden bu kurallar tanımlanabilir.
Kurallar IIS arayüz ekranından tanımlanabildiği gibi, web sitesi dizininde bulunan Web.config dosyasında de tanımlanabilmektedir. Zaten arayüzden yapılan ayarlar da Web.config içerisine yazılmaktadır.
Örnek Kurallar
Bu kurallara göre,
Kuralı uyguladığınız siteye, örneğin http://uygulama.com/api şeklinde gelen talepler http://172.16.10.11/api adresine yönlendirilir.
http://uygulama.com/api?a=1&b=2 ile gelen querystring parametreleri aynı şekilde yönlendirmeye taşınır.
http://172.16.10.11/api adresindeki api, basic authentication ile doğrulama gerektiriyor. Kullanıcı adı ve şifre bilgileri Base64 string olarak kodlanıp sunucu değişkeni(server variable) olarak eklenmektedir.
Server Variable Hatası
Kurallara ServerVariables eklendiğinde karşılaşılabilecek olası hatlardan biri 500 internal error olacaktır.
Hata sayfasında hata hakkında detaylı bilgi bulunmamaktadır. Detaylı bilgileri alabilmek için Web.config içerisinde hata aşağıdaki ayarları yapabilirsiniz.
Bu ayarlamadan sonra hata detaylarını şu şekilde görebilirsiniz.
HTTP Error 500.50 – URL Rewrite Module Error.
The server variable “HTTP_Authorization” is not allowed to be set. Add the server variable name to the allowed server variable list.
Hata detayına göre Server Variable olarak kullanılacak bilginin IIS web sitesinde önceden belirtilmesi gerekmektedir. Bunun için URL Rewrite penceresinde, sağ taraftaki View Server Variables kısmından HTTP_AUTHORIZATION değişkenini eklemelisiniz. Bu sayede URL Rewrite modülüne, Authorization header tanıtılmış olacak ve hata ortadan kalkacaktır.
Büyük boyutlu dosyaların transferinin copy/paste yöntemi ile yapılması mümkün olmayabiliyor. Benim başıma gelen gerçek bir sorun, bir uydu fotoğrafının tile denen 256×256 pixel boyutunda parçalara ayırdığında oluşan devasa (yaklaşık 250GB) boyutlu verinin sunuculara aktarılmasıydı. Bu işlem sonucunda oluşan verinin ağdaki başka bir sunucuya taşınması öyle kopyala yapıştır gibi klasik yöntemlere olacak gibi değildi.
Windows ortamında robocopy‘nin gücü kullanılarak PowerShell veya Console üzerinden bu gibi büyük verilerin taşınması kolay bir şekilde yapılabilmektedir.
Robocopy ile dosyaların bir yerden bir yere taşınması için temel yazım biçimi şu şekildedir:
Örneğin, “C:\tiles” dizinindeki tüm dosyalar “D:\tiles” dizinine taşımak için aşağıdaki komut kullanılır. Burada alt dizinler ve dosyalar dikkate alınmaz, ancak tüm sistem dosyaları ve gizli dosyalar taşınır.
robocopy C:\tiles D:\\tiles
Eğer, tüm alt dizinler ve dosyalar da taşınacaksa komuta aşağıdaki gibi “/S” parametresi eklenir. Ancak bu parametre boş dizinleri dikkate almaz.
robocopy C:\tiles D:\\tiles /S
Eğer boş dizinleri de taşımak isterseniz komuta “/E” parametresi eklenmelidir.
robocopy C:\tiles D:\\tiles /E
Eğer ağdaki başka bir bilgisayara taşıma işlemi yapılacaksa, ilgili bilgisayarda bir dizinin paylaşıma açılması gerekmektedir.
Robocopy için bir çok kullanışlı parametreye buradan ulaşabilirsiniz.
PowerShell, Windows işletim sistemine 2006 yılında eklenen, bir komut satırı kabuğu(shell) ve kendine özgü bir betik dilinden (script language) oluşan bir yönetim aracıdır.
PowerShell ile dosyalar nasıl yeniden adlandırılır?
PowerShell aracı, grafik ara yüzü olmayan bir komut satırı aracı olması sebebiyle bütün işlemleri komutlar üzerinden yürütür.
PowerShell ile dosyaları tek tek veya toplu bir şekilde yeniden adlandırmak çok kolaydır. Dosyaları yeniden adlandırmak öncelikle komut satırından dosyaların bulunduğu dizine geçilir.
Yukarıda listelenen dosyaların hepsinin isimlerinde “foo.com” şeklinde bir web sitesine ait gereksiz bir bilgi bulunmaktadır. Bu gereksiz bilgiyi kaldırarak dosyaları temiz bir adlandırmaya kavuşturmak için aşağıdaki komutu kullanabiliriz.
dir *.txt | rename-item -newname {$_.name -replace " foo.com", ""}
Yukarıdaki komut, *.txt dosyalarını seçerek bu dosyaların adlarında bulunan foo.com metnini ve önündeki bir adet boşluk karakterini kaldırır.
Bu şekilde, dosyalarımıza temiz bir şekilde yeniden adlandırılmış olur. Dosyaların uzantılarını da benzer şekilde değiştirmek mümkündür. Doysa sayılarının çok fazla olduğu durumlarda son derece etkili bir yöntem olarak kullanılabilir.
Self Signed Certificate yani Otomatik Olarak İmzalanan sertifikaların IIS yardımı ile oluşturulması adımları aşağıdaki gibidir.
IIS ana penceresinde bulunan “Sunucu Sertifikaları” bölümüne girilir.
Bu bölümde ki sağ pencerede bulunan “Otomatik Olarak İmzalanan Sertifika Oluştur” seçeneği seçilir.
Otomatik imzalanan sertifika oluşturma penceresinde bir sertifika adı ve sertifika deposu seçilir.
Oluşturulan yeni sertifika artık Sunucu Sertifikaları listesinde görünmektedir. Sağ bölümde bulunan “Dışarı Aktar” seçeneği ile açılan pencerede sertifikanın nereye aktarılacağı ve şifresi belirlenir.
Sertifika”C:\Temp\” dizini altına başarılı bir şekilde oluşturulmuştur. Sertifikayı Base64 olarak kodlanmış bir metin halinde almak için kullanılabilecek C# kodu:
Windows 8 sonra Windows 8.1 derken eylül 2015 itibarıyla şu an ki nihai sürüm olan Windows 10 sürümüne geçiş yapmış bulunuyorum.
Windows 10 sürümünde il göze çarpan başlat menüsünün yeniden düzenlenerek klasik başlat menüsü halinde kullanıcılara sunulmasıdır. Windows 8 sürümlerinde başlat menüsü yerinde metro style denen bir arayüz tasarlanmıştı. Bana göre son derece gereksiz ve kullanışsız olan bu arayüz nihayet kaldırılmış. Ancak başlat menüsünün bir kenarında hala etkisi küçük bir pencere şeklinde devam ediyor.
Başlat Menüsü
Windows 8 sürümlerinde Windows App Store uygulamalarının tam ekranda açılması kullanıcılarının görev çubuğuna erişmesini engelliyordu. Windows 10 sürümünde bu sıkıntı ortadan kaldırılmış ve pencere şeklinde çalışma imkanı sunulmuş.
Pencere Yapısı
Bir diğer özellik olan multitask özelliği biraz değişikliğe uğramış ve Ctrl+Tab kısayolu ile çalışan uygulamaları gösteren pencerenin görünümü yenilenmiş.
Multitask
Çalışan tüm uygulamaları görebilmek için görev çubuğuna Görev Görünümü adında bir kısayol da oluşturulmuş. Görev görünümünde sağ altta Yeni Masaüstü ekleme tuşu sayesinde birden fazla sanal masa üstü ayarlamanıza olanak sağlanmış. Bu sayede iş bölümlerinde göre kategorize edilebilen masaüstleri oluşturmak mümkün hale geliyor. Örneğin internet tarayıcıları ve ofis çalışma dosyaları ayrı masaüstü kategorilerinde tutulabilir.
Sanal Masaüstü
Yeni özellikleri keşfettikçe eklemeye devam etmeye çalışacağım. Şimdilik bu kadar. Bir sonraki yazıda görüşmek dileğiyle.
Bu yazıda Windows işletim sistemini kullanırken sıklıkla başvurduğum ipuçlarını sizlerle paylaşmak istedim. Microsoft işletim sistemlerinde bütünlüğü sağlamak adına klavye kısayolları ve işletim sistemi ayarları standarttır. Bu standartlar bize hız kazandırmak için geliştirilmektedir. Şimdilik aklıma gelen ipuçlarını paylaşıyorum, yenileri olduğunda yazıyı güncellemeye çalışacağım.
1- Pencere Ön İzleme Kısayol Tuşu Alt+P
Bir pencere açıkken Alt+P tuşları ile pencere içindeki dosyaların ön izlemesi yapılabilir.
Pencere ön izleme
2- Pencereyi Konumlandırma Window+Yön Tuşları
Window + Left Aktif pencereyi ekranın sol yarım köşesine konumlandırır.
Window + Right Aktif pencereyi ekranın sağ yarım köşesine konumlandırır.
Window + Top Aktif pencereyi tam ekran yapar.
Window + Down Aktif pencereyi minimize eder.
Window yön tuşları
3- Ekran Büyüteç Aracı Window+Artı Tuşu
Window ile birlikte artı tuşuna bastığımızda ekrana bir büyüteç penceresi gelir. Bu pencere açıkken Window+ veya Window- ile ekran boyutunu ayarlamak mümkündür.
Büyüteç kısayolu
4- Pencerelerin Ekran Ön İzlemesi Window+T Tuşu
Açık pencerelerin windows ortamında küçük helde ön izlemelerini görüntülemek için Window+T tuşunu kullanabilirsiniz.
Ön bakış
5- Adım Kaydedicisi psr.exe
Windows Başlat menüsündeki arama satırına psr.exe yazıp enter’a basarak hata kaydediciyi çalıştırabilirsiniz. Kaydı başlatın, bilgisayarınızı kullanın ve hata olduktan sonra kaydı bitirip, HTML slayt gösterisini istediğiniz kişiyle paylaşın.
Adım Kaydedicisi
6- Boş sürücüleri gizleme ayarı
Klasör seçeneklerinden Boş sürücüleri sakla seçeneğinin işaretini kaldırarak, Bilgisayarım penceresinde görünen boş sürücüleri görünmez yapabilirsiniz.
Boş sürücüler
7- Bilgisayarım Penceresi Kısayolu Window+E Tuşu
8- Windows’u KilitlemeWindow+L Tuşu
9- Açık Pencereler Arasında Gezinme Alt+Tab Tuşu
10- İnternet Tarayıcısında(IE, Chrome, Firefox), Tab Pencereleri Arasında Geçiş için Ctrl+Tab Tuşu
11- Tüm pencereleri küçültüp masa üstüne geçmek için window+D tuşu
MSMQ teknolojisi ile alakalı bir önceki yazıda MSMQ tanıtımını yapmış ve Windows işletim sistemlerine nasıl dahil edildiğini incelemiştik.
Bu yazıda ise mesajların MSMQ kuyruğuna nasıl yazıldığını ve kuyruktaki mesajların nasıl okunduğunu incelemeye çalışacağız.
Öncelikle mesaj nedir bundan bahsedelim. MSMQ teknolojisindeki mesaj kavramı aslında bir programlama dili ile oluşturulan nesnelerin serileştirilmiş halleridir. Bir nesne binary veya xml gibi formatlarda serileştirilebilir. Serileştirilmiş nesneler MSMQ gibi mesaj tabanlı iletişim ortamlarında mesaj olarak değerlendirilir.
MSMQ sisteminde mejsalar kuyruk denilen bir dizgede tutulur. Kuyruklar günlük hayattaki posta kutularına benzer. Postacı gelip zarfı posta kutusuna bırakır. Daha sonra ev sahibi gelip kutudaki zarfı açarak mesajı okuyarak ne yapacağını anlar ve gereğini yapar.
C# programlama dili ile MSMQ kuyruğundaki mesajları yönetmek mümkündür. Windows işletim sisteminde MSMQ kuyruğunu bilgisayar yönetimine girerek Private Queue seçeneğinden görüntüleyebiliriz.
MSMQ
.Net Framework içerisinde System.Messaging namespace altında mesaj trafiğini yönetebilecek tipler bulunmaktadır.
MessageQueuetipine ait üyeler yardımıyla sistemde bir kuyruk mevcut mu diye kontrol edilebilir, mevcut değilse yeni kuyruk oluşturulabilir. Mevcut kuyruğa bir mesaj eklenip, kuyruktan bir mesaj alınabilir. Aşağıdaki örnek kod ile kuyruğa mesaj yazma işlemi gerçekleştirilmektedir.
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
else
{
// Kuyruk oluştur.
MessageQueue.Create(@".\Private$\EmailQueue");
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
messageQueue.Send("Bu ilk bir MSMQ mesajıdır", "Title");
Kuyruktaki mesajları okumak senkron veya asenkron şekilde yapılabilmektedir. MessageQueuetipine ait aşağıdaki metodlar:
BeginPeek()
BeginReceive()
asenkron şekilde mesajları okumaya olanak sağlar. bu mesajların override edilmiş şekilleri burada mevcuttur.
BeginPeek() metodu çağrılmadan önce PeekComplated event handler oluşturmak gerekir ki okunan mesajın içeriğine erişebilelim. Aynı şekilde BeginReceive() metodu çağrılmadan önce ReceiveComplated event handler oluşturmak gerekir. BeginPeek() ile alınan mesajlar kuyruktan silinmezken BeginReceive() ile okunan mesajlar kuyruktan silinir. Bu fark, süreçleri yönetmek açısından önemlidir. Aşağıdaki örnek kod, tek bir mesajın kuyruktan asenkron olarak alınmasını sağlar. BeginReceive() kullanıldığı için alınan mesaj kuyruktan silinecektir.
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
messageQueue.ReceiveCompleted += new
ReceiveCompletedEventHandler(EmailReceived);
messageQueue.BeginReceive();
}
private static void EmailReceived (Object source,
ReceiveCompletedEventArgs asyncResult)
{
MessageQueue mq = (MessageQueue)source;
Message m = mq.EndReceive(asyncResult.AsyncResult);
Console.WriteLine("Message: " + (string)m.Body);
}
MessageQueuetipinde senkron bir şekilde mesaj almak için aşağıdaki metodları kullanılabilir:
Peek()
Receive()
GetAllMessages()
Yani Peek() veya Receive() metodu çağrıldığında kuyruktan bir mesaj gelene kadar başka işleme geçilmez. Oysa asenkron metodlarda BeginPeek() veya BeginReceive() komutlarından sonra başka işlem varsa onlar yürütülebilmekteydi.
GetAllMessages() metodu kuyruktaki tüm mesajları getirmek için kullanılır.
MessageQueue queue = new MessageQueue(@".\Private$\EmailQueue");
Message[] msgs = queue.GetAllMessages();
foreach(Message msg in msgs)
{
Console.WriteLine(msg.Body);
}
Mesaj kuyruğuna bir text yerine bir nesneyi göndermek mümkündür. Bu işlem için öncelikle serileştirilecek olan tipin belirlenmesi gerekmektedir. Serileştirilecek olan tip aşağıdaki şekliyle Email adında belirlenmiş ve [Serialize] attribute ile imzalanmıştır.
[Serialize]
public class Email{
public string From {get; set;}
public string To {get; set;}
public string Body {get; set;}
}
Bu nesnenin bir örneğini kuyruğa eklemek için aşağıdaki gibi bir yöntem izlenir.
Email mail = new Email{
From = "sender@mail.com",
To = "receiver@mail.com";
Body = "Merhaba bu bir test mesajıdır.";
};
MessageQueue messageQueue = null;
if (MessageQueue.Exists(@".\Private$\EmailQueue"))
{
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
else
{
// Kuyruk oluştur.
MessageQueue.Create(@".\Private$\EmailQueue");
messageQueue = new MessageQueue(@".\Private$\EmailQueue");
}
Message message = new Message();
message.Formatter = new BinaryMessageFormatter();
messageQueue.Send(message);
Temel olarak MSMQ mesaj yönetimi bu şekilde yapılmaktadır. Buradaki örnekler yazma ve okuma işlemlerini gösteren tek bir uygulama gibi anlaşılabilir. Ancak dağıtık mimarilerde kuyruğuna yazım işlemini bir uygulama yaparken, kuyruğu sürekli kontrol etme işlemini işletim sistemine bağlı bir servis sağlıyor olabilir. Ya da zamanlanmış görev mantığı ile çalışan bir client uygulama da kuyruktaki mesajları okuyarak gerekli görevleri yerine getirebilir. Senaryoları tasarlamak tamamen ihtiyaca ve beceriye kalmıştır.