Java Immutable (Değişmez) Sınıflar
Ahmet Orsorlu tarafından, Java kategorisi altında, 19.05.2012 tarihinde gönderildi
Immutable (değişmez) sınıflar, nesneleri bir kez oluşturulduktan sonra nesne içeriği değiştirilemeyen sınıflardır. Bir nevi sabit sınıflardır diyebiliriz. Örneğin, Java’da String sınıfı değişmez sınıflardan bir tanesidir. Diğer bilinen değişmez sınıflardan bazıları, Integer, Double, Boolean, BigDecimal sınıflarıdır.
Gelin şimdi hem değişmez sınıfların özelliklerini görmek adına hem de değişmez bir sınıf nasıl yaratılır onu görmek adına bir sınıf yazalım.
public final class ImmutableMutant {
private final String name;
private final int numberOfArms;
private final int numberOfLegs;
public ImmutableMutant(final String name, final int numberOfArms,
final int numberOfLegs) {
this.name = name;
this.numberOfArms = numberOfArms;
this.numberOfLegs = numberOfLegs;
}
public String getName() {
return name;
}
public int getNumberOfArms() {
return numberOfArms;
}
public int getNumberOfLegs() {
return numberOfLegs;
}
}
Kodu incelediğimizde sınıfın final bir sınıf olduğunu görüyoruz. Sınıfı final olarak tanımlamanın amacı, sınıfın başka sınıflar tarafından extend edilmesini (türetilmesini) engellemek. Yani, final sınıfların alt sınıfları olmaz. Dolayısıyla değişmez sınıflardan herhangi bir şekilde başka sınıflar türetilemez.
İkinci olarak, sınıfın tüm elemanları private ve final‘dır. Yani, sınıf içinden veya dışından herhangi bir şekilde değiştirilemez.
Üçüncü olarak, sınıfın tüm elemanları sadece constructor vasıtasıyla ilklendirilebilir.
Ve son olarak, sınıf elemanlarını dışardan değiştirebilecek metodlar (setter metodları) yoktur.
Şimdi de değişmez sınıfların özellikleri ve avantajlarından bahsedelim. Değişmez sınıf nesneleri kesinlikle thread korumalıdır (thread-safe). Çünkü, bir kez oluşturulduktan sonra içeriği değiştirilemez bu da threadlerde kullanımda ortaya çıkabilecek senkronizasyon sorunlarını ortadan kaldırır. Değişmez sınıf nesnelerinin içerikleri değişmeyeceği için program akışı içerisinde içerikte istenmeyen değişikliklerin olmasının önüne geçilebilecektir. Değişmez sınıf nesnelerini gönül rahatlığıyla başka referanslara atayabilirsiniz. Örneğin, bir metoda yolladığınızda o metod içerisinde nesnenin değişmeyeceğini garanti etmiş olursunuz.
linux foreground(fg) komutu (command)
Emre Macit tarafından, Linux kategorisi altında, 17.05.2012 tarihinde gönderildi
Linuxta bir komut çalıştırdığınızda belki de yanlış bir şey yaptığınızda, CTRL + Z ile o komutu durdurduğunuzu zannediyorsanız, yanılıyorsunuz. Sadece Pause etmiş oluyorsunuz. (Aslında yapmanız gereken CTRL + C kombinasyonudur.)
CTRL + Z ile durdurduğunuzu sandığınız bir komuta devam etmek için ise fg komutunu yazabilirsiniz.
Komut kaldığı yerden çalışmaya devam edecektir.
denemek için sleep 10 yazın ve sonra 4-5 saniye sonra ctrl + z e basın. Sonra da fg yazıp enter’a basın.
göreceksiniz ki 5-6 saniye sonra komutunuz bitmiş olacaktır.
network – genel Telnet komutları
Gökhan Tunçkale tarafından, Network kategorisi altında, 14.05.2012 tarihinde gönderildi
- ?/help Yardım bilgilerini görüntüler
- close veya c Mevcut bağlantıyı kapatır
- display Telnet istemcisine ait ayarları görüntülemeye yarar.
- open veya o bir Web sitesini bağlanmak için kullanılır
- quit veya q Telnet’ten çıkış yapmak için
- set Ayarlar üzerinde değişiklik yapmak için kullanılır.
- status Telnet İstemcisinin bağlanıp bağlanmadığını görüntüler
- unset Oturum açmayı ya da parola istemini kapatır.
- CTRL + ] Bağlı olunan oturumdan Telnet komut satırına geçiş yapar.
network – Telnet nedir?
Gökhan Tunçkale tarafından, Network kategorisi altında, 14.05.2012 tarihinde gönderildi
Telnet, İnternet ve ya özel bir ağ ile ulaşılabilen bir makineye bağlanmak için gerçekleştirilen TCP/IP protokolü ve bu işi yapan programlara verilen genel isimdir.
Bağlanılan makinede login olabilmek için orada bir username’e sahip olmanız ve bir telnet erişim programının olması gerekir. Telnet erişimli bazı web servisleri, bağlantı sırasında username istemeyebilirler, ya da girmemiz gereken username bağlantığımızda otomatik olarak karşımıza çıkabilir.
Telnet erişim programları genellikle işletim sistemi ile birlikte gelmektedir (Windows 7 işletim sisteminde güvenlik nedeni ile Telnet pasif haldedir. Aktifleştirmek için Program Ekle/Kaldır -> Windows özelliklerini aç ve ya kapat tıklayarak Telnet bileşenlerini aktifleştirebiliriz.). Telnet işlemleri genellikle komut satırından gerçekleşir.
Telnet protokolü girdiğimiz username ve password’u, bağlı olduğumuz ağda rahatlıkla görülebilecek şekilde düz metin (plain text) formatında gönderir. Bu yüzden telnet güvensizdir. Çünkü ağa erişebilen herkes girdiğimiz username ve password’u görebilir.
Windows ortamında Telnet istemcisini Başlat -> çalıştır -> telnet.exe yazarak çalıştırabiliriz. Daha sonra telnet komutu ardından da bağlanmak istediğimiz makinenin IP adresini yazarız (yazdıktan sonra Enter) ve karşımıza komut satırı gelir. Buraya username ve password yazdıktan sonra karşıdaki makineye bağlanmış oluruz. Komut satırından çalıştırabileceğimiz genel telnet komutlarından burada bahsettim.
Telnet karşıdaki makinaya bağlanmak için bir protokol dedik. Http ve Ftp’de karşıdaki makinaya bağlanmak için olan protokollerden bazıları. Özellikle internette uzaktaki bilgisayara bağlanmak ve protokoller izin verdiği ölçüde karşıdaki bilgisayarı kullanmak bu saydığım protokoller için geçerli.
Telnet’in farkı nedir?
Web üzerinde Http protokolünü kullanarak bilgisayarlar arasında gezinebiliyoruz. Genel mantığı, biz browser üzerinden sunucuya bir istekte bulunuruz ve sunucu bize isteğimiz doğrultusunda bir yanıt verir. Aynı şekilde Ftp protokolünde de bilgisayarımızdan sunucuya dosya alış-verişi konusunda istekte bulunuruz, sunucu da bize gerekli dosyayı verir ya da biz oraya dosyayı yükleriz. İki durumda da karşı makineye herhangi bir giriş (login olma) işlemi yok, sadece istekte bulunuyoruz.
Telnet kullandığımızda ise uzaktaki makineye giriş yaparız, yani login oluruz. Konsol sayesinde sanki o makinenin başındaymış gibi işlem yapabiliriz. Bu olaya Remote Login denir.
Ayrıca, Http ve Ftp protokollerini kullandığımızda uzaktaki bilgisayarın hangi işletim sistemi ile çalıştığı önemli değildir. Telnet kullandığımızda ise sunucunun sahip olduğu işletim sistemi bize sunulur. Dolayısıyla kullanılan işletim sistemi ve yazdığımız telnet komutları sonunca ortaya çıkan sonuç bize aynen yansır.
Günümüzde Telnet kullanımı uzaktaki sunucuya erişmek adına pek yaygın değildir. Fakat yine de sunucuya komut yollamak, gelen cevapları kontrol etmek ve SMTP, IRC, HTTP, FTP veya POP3 gibi servislerdeki sorunların tespitinde kullanılmaktadır.
Bozulmaktaki Türkçe’miz..
Emre Macit tarafından, Genel kategorisi altında, 12.05.2012 tarihinde gönderildi
Gün geçtikçe dilimiz ne yazık ki içler acısı bir hal alıyor. Sokağa çıktığımızda, etrafta tabelalar, konuşulan şeylerin, şehrin neredeyse yarısı yabancı dilde. Çay bahçesi veya Kahve yok artık hiçbir yerde. Café var. Pub var, bar var.. 40 yıllık pastanelerimiz bile “patisserie” olmuş durumda. Kuaförlerimiz Coiffeur oldu. Araçlarımız doğan, şahindi eskiden şimdi hepsi ultra mega thunder oldu. Televizyondaki reklamlar ingilizce olunca daha bir ilgi çekici ve karizmatik oluyor. Halkla ilişkiler ve pazarlama uzmanlarının umrunda değil ki Türkçemiz bozulmuş! Önemli olan müşteri toplamak.. Daha da önemlisi karizma yapmak.
Bir yazılımcı olarak bilgisayar kavramları arasında boğuşup dururken elbet ki Türkçe-İngilizce birbirine çok karışıyor ve tarzanca diye nitelendirdiğim bir garip dil ortaya çıkıyor. Fakat günlük dilde konuşurken biraz da olsa dikkat etmeye çalışıyorum. Elimdeki A ürününü B ürünüyle “change” yapmıyorum örneğin. Ama dediğim gibi ; Bir projede milestone yerine “mihenk taşı” diyorum, ne yazık ki derdimi anlatamıyorum. Mecburen ben de milestone diyorum dilimi yuvarlaya yuvarlaya.. Günlük konuşmamız içinde de Türkçe sözlüğümüzde olmayan o kadar çok kelime var ki… Hangisini söyleyeyim?
Türkçemize sahip çıkmalıyız, durum git gide kötüleşiyor yoksa…
Apache Performans Ayarları (Performance tuning) Önerileri
Emre Macit tarafından, Apache, Web kategorisi altında, 11.05.2012 tarihinde gönderildi
Apache’de Performans ayarını yapmaya yeltenmişseniz, öyleyse bazı terimleri biliyor, bazı sorunlarla karşılaşmış, bazı sıkıntılar yaşıyor olduğunuz manasını çıkarıyorum çok rahatlıkla.
Öyle değilse de, bilgi iyidir, okuyunuz.
Apache, güzel(!) bir web serveri. Bir sürü de ayarı mevcut.
Burada bahsetmek istediğim konu, genel olarak hangi 3 ü 5 yapacağınız, hangi 200 yerine 50 yazacağınız ile ilgili değil. Yani hesapsal ayarlardan bahsetmeyeceğim. O apayrı ve ihtiyaca yönelik bir konu çünkü.
Peki bunlardan bahsetmeyeceksemne manası kaldı bu yazının?
Şöyle ki, Apache de performans ayarı yapmak istiyorasnız, hali hazırda yoğun çalışan bir veya birkaç apache web serveriniz olduğu yorumunu çıkarıyorum. Burada Sayısal değerler sistemden sisteme değişiklik göstermekte. Benim bir uygulamam session ve mysql bağlantısı bile kullanmadan, yoğun çalışıyorsa bu ayrı bir durum ve ayrı bir optimizasyon gerekiyor, veya veya veritabanı ve statik içerik durumu yoğun ise bu ayrı bir optimizasyon gerektiriyor.
Ben burada sadece bakış açısını izah etmeye çalıaşcağım.
Bu noktada bazı denemelerimiz oldu bunları paylaşmak isterim.
Apache istekleri karsılarken statik veya php isteklerinde, gelen isteklerin sayısıyla birlikte parabolik olarak artan bir grafik çiziyor. gelen istek arttıkça, makina load’u artarak artıyor ve bir süre sonra sistemi kitleyebiliyor. (%95 kitliyor emin olun.)
Statik dosyalar (Resimler, css, js, vb..)
Apache php isteklerini normal bir şekilde verirken, statik içerik devreye girdiğinde içeride açtığı portları iyi yönetemiyor. Bir web sitesinin bir sayfasında genelde 1 php isteği, 40-50 tane de statik içerik isteği oluyor. Bu noktada apache den dolayı saçlarımız dökülmeye başlıyor.
Statik içerik ile ilgili noktada cache için EXPIRES headeri göndermek ilk yapılacak şey olabilir.
Browser bir içeriği cachelese bile o dosya değişmiş mi diye server a soruyor. Bu noktada bu sorgu da request olarak bir maliyet oluşturuyor. Expıre cache i ile server browser a bu dosyaya verdiğiniz süre kadar değişmeyeceğinin garantisini veriyor, ve dosyalarınız değişmeyeceğinin teyidi alındığından browser o dosya cacheinde varsa, server a hiç sormuyor.
Bir değişiklik durumu için ise, statik dosyalarınızın sonuna ?time=2938748292 şeklinde bir timestamp koyarak çekmesini sağlyabilirsiniz. Örneğin bir dosyanız var ve normalde adı header.jpg . Siz bubunu EXPIRES ile cachelemesini söylerseniz, değiştirseniz bile browser eski dosyayı yeni gibi gösterecektir. Bu noktada siz isteği header.jpg?t=23984729493 şeklinde gönderirseniz, ve dosyanızı değiştirdiğinizde , bu timestampı da değiştirirseniz, veya dosya ismine bu timestampı kaydederseniz, browser cachelediği eski dosyayı bulamayacağından, yeni dosyayı çekmiş olacaktır.
Anlatmak istediğim, siz bir dosya değiştirmedikçei sayfanıza bir kere gelen kişi, 2. sorgudan itibaren gereksiz request göndermemeye başlayacak. 1 sayfa ilk açılışta 45 statik + 1 php = 46 request dersek,2. requestten itibaren 1 requeste inecektir. Bu da CİDDİ avantaj olacaktır.
Apachedeki gereksiz modüller
Apachenizde kullanmadığınız yani gereksiz modüller açık olabilir. Bunları kapatın. Neyi kullanıp neyi kullanmadığınızı araştırmanız biraz zzaman alabilir, ama bunların da küçük de osla bir miktar etkisini görürsünüz.
Apache .htaccess desteğini kapatın
.htaccess dosyaları çeşitli server ayarlarını yapabildiğiniz dosyadır. Buna ihtiyacınız yoksa, htaccess desteğini direkt kapatın. İhtiyacınız varsa da httpd.conf seviyesinden genel olarak yapmaya özen gösterin. Yani imkan varsa hiç kullanmayın. Ama zend framework gibi frameworkler mod_rewrite vb modüllerine ihtiyaç duyuyor diyorsanız da httpd.conf seviyesinden de ihtiyazınıcı görebiirsiniz. (Tabi ki yönetimi daha zor oluyor haliyle)
Apache htaccess desteği varsa, her requestte isteğin gittiği php dosyasına kadarki klasör ailesinde (örneğin /usr/local/php/deneme/example/html/index.php php sayfasına gelen requestte, sırasıyla usr, sonra local sonra php sonra deneme sonra example sonra html klasörlerinin içinde) .htaccess dosyası var mı? varsa load et kuralları çalıştır işlemini yapıyor. bu da tekil bir isteğin gecikmesine sebep olabiliyor. Bunu da kapatmanız sizi pembe bir gökyüzüne kavuşturmayacak ama bir miktar avantaj sağlayacaktır.
Bahsetmek istediğim daha çok şey var fakat, amaç burada bakış açısı olarak, kendinizi bilgisayar yerine koyarak düşünmektir. Böyle yaparsanız, belirli seviyeye kadar performansı artırabiirsiniz. Belirli seviye dememin sebebi ise, ileride bazı performans ihtiyaçlarınıza apachenin yeterli olmayacağını farkedeceksiniz. Bu zaman ise, apache’nin yerine ne koymamız gerektiğini konuşuruz.
midnight commander – mc – konsol tabanli klasor-dosya yoneticisi
Emre Macit tarafından, Genel, Linux, Uygulama kategorisi altında, 11.05.2012 tarihinde gönderildi
Midnight commander linux sistemlerde çalışabilen konsol tabanlı bir programdır. dosya ağacını daha görsel bir ortamda gezebilmenize olanak sağlar. Sağ ve Sol 2 ekranda ayrı klasörleri gezip, dosya kopyalama klasör kopyalama vb gibi işlemleri yapmanıza olanak sağlar.
MC nasıl yüklenir?
redhat tabanlı sistemler için YUM paketi ile
yum install mc
diyerek, debian ubuntu tabanlılar için APT paketi ile
apt-get install mc
diyerek sisteminize yükleyebilirsiniz.
Centos ta yüklediğinizde her tarafın garip karakterler ile dolduruğunu görürseniz , muhtemelen putty üzerinden iletişim kuruyorsunuzdur. (şu linkte olduğu gibi)Böyle ise encoding ile ilgili bir problem var demektir. Bunu da putty ayarlarınızdan Traslation kısmında encoding’inizi UTF-8 yaparak düzeltebilirsiniz.
Ayrıca programın search, copy paste,vb gibi konsol tabanlı olmasına rağmen bir çok özelliğinin bulunduğunu da belirteyim. Bunları da kurcalayıp bulabilirsiniz. (programı açtığınızda f1,f2 gibi function tuşlarıyla ulaşabilirsiniz)
Bir de aynı şekilde mcedit programı var. Bunu da ayrı bir yazıda yazmak isterim.
Bu programı uzak bağlantı ve server ortamında bir şeyler ile uğraşan herkese tavsiye ederim.
network – Port Yönlendirme (Port Forwarding) nedir?
Gökhan Tunçkale tarafından, Network kategorisi altında, 10.05.2012 tarihinde gönderildi
İnternete her bağlandığımızda bir adet IP adresine sahip olduğumuz biliyoruz. Bu IP adresi internete bağlandığımız bilgisayarın internet üzerindeki adresine denk gelmektedir. Ama aslında internete giren bilgisayarımız değil, modemdir. İnterneti bilgisayarla paylaşan modem olduğu için, bilgisayarla modem arasında da bir ağ (network) olması gerekir. Ortada bir ağ varsa her iki tarafın da IP adresi var demektir. Bilgisayarın, modemle kurduğu LAN için bir adet IP adresi, modemin ise hem bilgisayarla kurduğu LAN için bir IP adresi, hem de internetteki IP adresi vardır.
Bilgisayar ile internet arasındaki iletişimin modem üzerinden olduğunu, yani bilgisayar ile modem arasındaki yerel IP’ler üzerinden olduğunu artık biliyoruz.
Port Yönlendirme (Port forwarding) işlemi biz internete girerken genellikle gerekmeyebilir. Çünkü biz erişmek istediğimiz yere kendi IP adresimizi veriyoruz. Eğer bilgisayarımıza dışardan erişmek istiyorsak, karşı tarafa hangi IP adresine sahip olduğumuzu ve hangi portu kullandığımızı bildirmemiz gerekir. Verdiğimiz IP adresi ile ancak modeme erişilebilir, çünkü az önce de söylediğim gibi internete erişen aslında modemdir.
Uzaktaki bilgisayarın erişmek istediği bizim bilgisayarımız ise, modemin yapması gereken, dışarıdan gelen isteği bizim bilgisayarımıza yönlendirmektir. Örnek vermek gerekirse, modem, kendisine uzaktaki bilgisayardan, internet üzerindeki IP adresi ve A portuyla gelen bir isteği, bilgisayarımızın ilgili portuna yönlendirir. Modem yönlendirir diyorum fakat bu işlemi de biz gerçekleştiririz. Gerçekleşen bu işleme port yönlendirme denir.
network – Bridge nedir?
Gökhan Tunçkale tarafından, Network kategorisi altında, 08.05.2012 tarihinde gönderildi
Aynı protokolü kullanan alt ağları birbirine bağlamaya yararlar.
Nasıl çalışırlar? Şöyle; birbirine LAN ile bağlı 4 bilgisayar düşünelim, bunlardan bağımsız ama yine birbiriyle LAN ile bağlı 4 bilgisayar daha düşünelim. Bu iki LAN’ı birbirleriyle (bridge kullanarak) bağladığımız zaman mantıken ortaya bir LAN çıkar.
Bridge burda ne işe yarar, ne yapar kısmına gelelim. Bu bahsi geçen 2 LAN’ın kendi içlerinde oluşturduğu bir veri akış trafiği vardır. Bir LAN’dan diğerine veri aktarmak istediğimizde doğal olarak trafik artışı olacaktır. Bu iki bağımsız ağ arasına konulan köprü, iki tarafa da aktarılmak istenen verileri inceler. Eğer verinin gitmesi gereken adres diğer ağda değilse, onu diğer ağ tarafına geçirmez ve böylece diğer tarafın trafiği boş yere artmaz. Yani bridge verilerin gideceği adresleri tutar diyebiliriz.
Bunlara ek olarak bridge süzme işlemi yaptığı için, yani bir LAN’dan diğerine verileri kontrol ederek geçirdiği için, LAN’lardan herhangi birinde oluşan hatalar ya da arızalar diğer LAN’ı etkilemez.
