Soru & Cevap

Son dersimizde, öğrencilerin yönelttiği soruları cevapladık:

İşletim Sistemleri ile ilgili olan process (işlem), sanal bellek, interrupt (kesme), bellek yönetimi gibi konuları öğrenmeyle ilgili tavsiyeleriniz nelerdir?

Öncelikle, oldukça düşük seviye konular olduğundan tüm bunlara gerçekten aşina olmanız gerekip gerekmediği meçhuldür. Kernelde değişiklik yapmak veya kerneli implement etmek gibi daha düşük seviyeli kodlar yazmaya başladığınızda önemli olacaktır. Aksi halde, diğer derslerde kısaca ele alınmış olan işlemler (process) ve sinyaller hariç, çoğu konuyla ilişkisi yoktur.

Bu konu hakkında bilgi edinmek için bazı iyi kaynaklar:

Öncelikli olarak öğrenilmesi gerektiğini düşündüğünüz araçlardan bazıları nelerdir?

Öncelik vermeye değer bazı konular:

Bash scriptlerini, Python'u veya diğer dilleri hangi durumlarda kullanabilirim?

Bash scriptleri, yalnızca belirli komut dizilerini çalıştırmak istediğiniz kısa ve tek seferlik basit scriptler için kullanışlıdır. Bash, daha büyük programlarda veya scriptlerde çalışmayı zorlaştıran bir dizi garipliğe sahiptir:

Bu nedenle, daha büyük ve/veya karmaşık scriptler için Python ve Ruby gibi daha olgun script dillerini kullanmanızı öneririz. İnsanların bu dillerde sık karşılaşılan sorunları çözmek için daha önce yazmış oldukları sayısız kütüphane bulabilirsiniz. Bir dilde size lazım olan işlevleri yerine getiren bir kütüphane bulursanız, genellikle yapılacak en iyi şey bu dili kullanmaktır.

source script.sh ve ./script.sh arasındaki fark nedir?

Her iki durumda da script.sh dosyası bir Bash oturumunda okunacak ve yürütülecektir. Aralarındaki fark oturumun (session) komutları çalıştırma şeklindedir. source için komutlar geçerli Bash oturumunuzda yürütülür ve bu nedenle geçerli ortam üzerinde yapılan dizin değiştirme veya fonksiyon tanımlama gibi değişiklikler, source komutunun yürütülmesi tamamlandığında geçerli oturumda devam edecektir. Script ./script.sh şeklinde çalıştırıldığında, geçerli Bash oturumunuz script.sh dosyasındaki komutları çalıştırmak için yeni bir Bash örneği başlatır. Bu nedenle, script.sh dizinleri değiştirirse, yeni Bash örneği dizinleri değiştirir, ancak script tamamlanıp kontrol ana Bash oturumuna geçtiğinde üst oturum aynı konumda kalır. Benzer şekilde, script.sh, terminalinizde erişmek istediğiniz bir fonksiyonu tanımlıyorsa, geçerli Bash oturumunuzda kullanmak için source etmeniz gerekir. Aksi takdirde çalıştırdığınızda yeni Bash işlemi (process), geçerli shell’iniz yerine fonksiyon tanımını gerçekleştiren işlem olacaktır.

Çeşitli paketlerin ve araçların depolandığı yerler nelerdir ve bunlara nasıl referans verilir? /bin ve /lib gibi dizinlerin aralarındaki farklar nelerdir?

Terminalinizde yürüttüğünüz programlara bakacak olursak, tümü PATH ortam değişkeninde listelenen dizinlerde bulunur. Shell’inizin belirli bir programı nereden çalıştırdığını görmek için which komutunu (ya da type komutunu) kullanabilirsiniz. Genelde, belirli dosya türlerinin nerede olduğuna dair bazı kurallar bulunur. İşte konuştuklarımızdan bazıları, daha kapsamlı bir listei için Dosya Sistemi Hiyerarşi Standardı ‘na bakabilirsiniz.

Python paketlerini apt-get install ile mi yoksa pip install ile mi kurmalıyım?

Bu sorunun genel geçer bir cevabı yok. Aslında daha çok yazılım yüklemek için sisteminizin paket yöneticisini mi yoksa dilin paket yöneticisini mi kullanmanız gerektiğiyle ilgilidir. Dikkate alınması gereken birkaç şey:

Hata ayıklaması çakışmalara yol açabileceğinden, her ikisini birden değil, sadece birini kullanmaya çalışmalısınız. Tavsiyemiz, mümkün olduğu kadar dile özgü paket yöneticisini izole ortamlar ile kullanarak global ortamları kirletmemeniz.

Kodumun performansını iyileştirmek için kullanabileceğim en iyi ve en kolay profiling araçları nelerdir?

Profiling amacıyla kullanmak oldukça kullanışlı olan en kolay araç süre ölçerek yazdırmadır. Kodunuzun farklı bölümleri arasında geçen süreyi manuel olarak hesaplarsınız. Bunu defalarca yaparak, kodunuz üzerinde etkili bir binary arama yapabilir ve en uzun süren kod parçasını bulabilirsiniz.

Daha gelişmiş araçlar için, Valgrind’in Callgrind aracı, programınızı çalıştırmanıza, tüm çağrı yığınlarının (call stack) ve diğer şeylerin ne kadar sürdüğünü ölçmenize olanak tanır. Sonrasında, programınızın kaynak kodunun satır başına harcadığı süreyi içeren ek açıklamalı bir versiyonunu oluşturur. Ancak, programınızın büyüklüğüne göre yavaş çalışır ve iş parçacıklarını (thread) desteklemez. Diğer durumlar için, perf aracı ve dile özgü diğer Sampling Profiler’ları yararlı verileri oldukça hızlı bir şekilde üretebilir. Flamegraphs, bahsedilen sampling profiler çıktısı için iyi bir görselleştirme aracıdır. Ayrıca, üzerinde çalıştığınız programlama dili veya programlama görevi için özel araçlar kullanmaya çalışmalısınız. Örneğin, web geliştirme için, Chrome ve Firefox’taki dahili geliştirici araçlarının fantastik profiler’ları vardır.

Bazen kodunuzun yavaş kısmı, sisteminizin disk okuması veya paket iletimi gibi bir olay bekleme aşaması olabilir. Bu durumlarda, donanım kabiliyetleri açısından teorik hızın kabaca hesaplamalarının, asıl değerlerden sapıp sapmadığına bakmakta yarar vardır. Sistem çağrılarındaki bekleme sürelerini analiz etmek için özelleşmiş araçlar da vardır. Bunlar, kullanıcı programlarının çekirdek izlemesini gerçekleştiren eBPF gibi araçları içerir. Özellikle bu tür düşük seviye profiling yapmanız gerekiyorsa bpftrace aracı göz atmaya değerdir.

Hangi tarayıcı eklentilerini kullanıyorsunuz?

Çoğunlukla güvenlik ve kullanılabilirlikle sağlayan favorilerimizden bazıları:

Diğer faydalı data wrangling araçları nelerdir?

Data Wrangling dersi sırasında yer verme fırsatımızın olmadığı araçlardan bazıları, sırasıyla JSON ve HTML verileri için özel ayrıştırıcılar olan jq ve pup‘tır. Perl programlama dili, daha gelişmiş data wrangling pipeline’ları için bir diğer güzel araçtır. Başka bir püf nokta, boşluklu metni sütunlar halinde düzgünce hizalanmış bir metne dönüştürmek için kullanılan column -t komutudur.

Daha genel olarak alışılmadık diğer veri düzenleme araçları ise vim ve Python’dur. Bazı karmaşık ve çok satırlı dönüşümler için, vim makroları kullanımı oldukça kolay değerli bir araç olabilir. Bir dizi eylemi kaydedebilir ve bunları istediğiniz kadar tekrarlayabilirsiniz, örneğin editörler hakkındaki ders notunda (ve geçen yılki videoda) XML formatlı bir dosyayı sadece vim makroları kullanılarak JSON’a dönüştürme örneği mevcut.

pandas Python kütüphanesi genellikle CSV’lerde sunulan tablo verileri için harika bir araçtır. Sadece gruplandırma, birleştirme veya filtreleme gibi karmaşık işlemleri tanımlamayı kolaylaştırmakla kalmaz, aynı zamanda verilerinizin farklı özelliklerinin grafiklerini çizmeyi de oldukça kolaylaştırır. Ayrıca XLS, HTML veya LaTeX gibi birçok tablo formatında dışa aktarmayı destekler. Alternatif olarak R programlama dili (tartışmasız kötü bir programlama dili), veriler üzerindeki istatistikleri hesaplamak için birçok işlevselliğe sahiptir ve pipeline’ınızın son adımı olarak oldukça yararlı olabilir. ggplot2, R’de harika bir çizim kütüphanesidir.

Docker ve Sanal Makine arasındaki fark nedir?

Docker, konteyner olarak adlandırılan daha kapsamlı bir konsepte dayanmaktadır. Konteynerler ve sanal makineler arasındaki temel fark, sanal makinelerin çekirdek ana makine ile aynı olsa bile, çekirdek de dahil olmak üzere tüm OS yığınını yürütmesidir. VM’lerin aksine konteynerler, çekirdeğin başka bir örneğini çalıştırmaktan kaçınır ve bunun yerine çekirdeği ana bilgisayarla paylaşırlar. Linux’ta bu, LXC adı verilen mekanizma ile elde edilir ve kendi donanımında çalıştığını düşünen bir programı döndürmek için bir dizi yalıtım mekanizmasından yararlanır, ama aslında donanımı ve çekirdeği ana bilgisayarla paylaşır. Böylece konteynerler tam yükteki VM’den daha düşük ek yüke sahiptir. Diğer taraftan bakarsak, konteynerler daha zayıf bir yalıtıma sahiptir ve yalnızca ana bilgisayar aynı çekirdekte koşuyorsa çalışır. Örneğin, Docker’ı macOS’ta çalıştırıyorsanız, Docker’ın ilk Linux çekirdeğini almak için bir Linux sanal makinesini döndürmesi gerekir ve bu nedenle ek yük hala önemlidir. Son olarak Docker, konteynerlerin özel bir implementasyonudur ve yazılım dağıtımı için uyarlanmıştır. Bu nedenle, bazı tuhaflıkları vardır; örneğin, Docker konteynerleri varsayılan olarak yeniden başlatmalar arasında herhangi bir depolama biçiminde kalamaz.

İşletim sistemlerinin avantajları ve dezavantajları nelerdir ve aralarında nasıl seçim (örneğin amaçlarımıza en uygun Linux dağıtımını seçmek) yapabiliriz?

Linux dağıtımları, çok sayıda dağıtım olmasına rağmen, çoğu kullanım durumunda aynı şekilde davranacaklardır. Linux ve UNIX özelliklerinin ve çalışma biçimlerinin çoğu herhangi bir dağıtımda öğrenilebilir. Dağıtımlar arasındaki temel fark, paket güncellemeleriyle nasıl başa çıktıklarıdır. Arc Linux gibi bazı dağıtımlar, her şeyin en son versiyona sahip oldukları ve çok sıkı bozulabildiği sallantılı bir güncelleme politikası izlerler. Öte yandan Debian, CentOS gibi bazı dağıtımlar ve Ubuntu’nun LTS sürümleri depolarındaki güncellemeleri yayınlarken çok daha tutucu olduğundan, yeni özelliklerden ödün vermek pahasına kararlı durumlarını korurlar. Hem masaüstü bilgisayarlar hem de sunucularla kolay ve kararlı bir deneyim için önerimiz Debian veya Ubuntu kullanmaktır.

Mac OS, Windows ve Linux arasındaki orta noktadır ve güzel bir arayüze sahiptir. Ancak MacOS, Linux’dan ziyade BSD tabanlıdır. Bu nedenle sistemin ve komutların bazı kısımları farklıdır. Göz atmaya değer bir alternatif ise FreeBSD’dir. Bazı programlar FreeBSD’de çalışmayacak olsa da, BSD ekosistemi Linux’tan daha az dallara ayrılmış ve daha iyi belgelenmiştir. Windows’u ise Windows uygulamaları geliştirmek ve oyun oynamak için en iyi sürücü desteği gibi akıl çelici özelliklerine ihtiyacımız olmayacaksa tavsiye etmiyoruz.

Dual boot sistemler için, en iyi çalışan implementasyonun macOS’in bootcamp’i olduğunu ve özellikle disk şifreleme gibi diğer özelliklerle birleştirirseniz, diğer tüm kombinasyonların uzun vadede sorun yaratabileceğini düşünüyoruz.

Vim vs Emacs?

Üçümüz de birincil editörümüz olarak Vim kullanıyoruz ancak Emacs da iyi bir alternatif. Hangisinin sizin için daha iyi olduğunu görmek için denemeye değer. Emacs, vim’in “modal editing” özelliğini barındırmaz. Fakat bu, Evil ve Doom Emacs eklentileri aracılığıyla etkinleştirilebilir. Emacs kullanmanın bir avantajı, bu uzantıların Vim’in varsayılan script dili vimscript’ten daha iyi bir script dili olan Lisp’te uygulanabilinmesidir.

Makine Öğrenimi uygulamaları için ipuçları ve püf noktalar nelerdir?

Buradaki bazı dersler ve düşünceler Makine Öğrenimi uygulamalarına doğrudan uygulanabilir. Birçok bilim dalında olduğu gibi, ML’de sıklıkla bir dizi deney yaparsınız ve neyin işe yarayıp neyin işe yaramadığını kontrol etmek istersiniz. Bu deneylerde kolayca ve hızlı bir şekilde arama yapmak ve sonuçları anlamlı bir şekilde toplamak için shell araçlarını kullanabilirsiniz. Bu, verilen zaman diliminde veya belirli bir veriseti kullanan tüm deneylerin alt seçimi anlamına gelebilir. Deneyler sonucunda ulaşılan parametreleri saklamak için basit bir JSON dosyası kullanmak, bu sınıfta ele aldığımız araçlarla inanılmaz derecede kolay olabilir. Son olarak, GPU görevlerinizi gönderdiğiniz bir tür kümeyle çalışmıyorsanız, zihinsel enerjinizi de tüketen oldukça zaman alıcı bir görev olabileceğinden, bu süreci nasıl otomatikleştireceğinizi araştırmalısınız.

Başka Vim ipuçları var mı?

Birkaç ipucu daha:

2FA nedir ve neden kullanmalıyım?

İki Aşamalı Doğrulama (2FA), hesaplarınıza şifrelerin yanı sıra ekstra bir koruma katmanı ekler. Giriş yapmak için sadece parola bilmek yetmez, aynı zamanda bazı cihazlara erişiminizin olduğunu bir şekilde “kanıtlamanız” gerekir. En basit şekilde, SMS 2FA ile ilgili bilinen bazı sorunlar olmasına rağmen, telefonunuza bir SMS gönderilerek yapılabilir. Desteklediğimiz daha iyi bir alternatif, YubiKey gibi U2F çözümü kullanmaktır.

Web tarayıcıları arasındaki farklar hakkında yorumunuz nedir?

2020 yılı itibariyle tarayıcıların şu anki manzarası, aynı motoru (Blink) kullandıklarından dolayı çoğunun Chrome’a ​​benziyor olduğudur. Bu, Blink tabanlı Microsoft Edge’in ve Blink’e benzer bir motor olan WebKit tabanlı Safari’nin, sadece Chrome’un kötü versiyonları oldukları anlamına gelir. Chrome, hem performans hem de kullanılabilirlik açısından oldukça iyi bir tarayıcıdır. Alternatif isteyecek olursanız bizim önerimiz Firefox’tur. Chrome ile hemen hemen her açıdan yarışabilir ve gizlilik konusunda mükemmeldir. Flow isimli bir diğer tarayıcı, henüz kullanıma hazır olmamakla birlikte, var olanlardan daha hızlı olacağını iddia ettiği yeni bir render motoru uyguluyor.


Bu sayfayı düzenle.

CC BY-NC-SA lisansı ile lisanslanmıştır.