Öyle bir seyir defteri…

Vodem’in (Huawei 4231) Linux’ta Ethernet Olarak Kullanımı

09 Mayıs 2016 Pazartesi, 18:22

Elime Vodafone’un bir modemi (Vodem) geçti. Bilgisayarıma taktığımda Linux bir ethernet olarak görmedi ve doğrudan çalışmadı. Daha önce Turkcell’in yeni nesil VINN’larında bu hiç başıma gelmediğinden, bir miktar uğraşmam gerekti.

Huawei’nin K4203 isimli bir modeliymiş (lsusb sağolsun). Kendisi öntanımlı olarak MBIM isimli, Linux 3.8’de desteği gelen bir protokolle bağlanıyormuş (Google sağolsun). Bir sonraki nesil bir cihaz kısaca. Ama ethernet aygıtı olarak da çalıştırmak da mümkün. Bunun için usb_modeswitch ile cihaza komut gönderilmesi gerekiyor.

lsusb çıktısında aygıtın ID’sini 12F1:1F1C olarak görüyoruz:

# lsusb
# lsusb | grep Huawei
Bus 002 Device 012: ID 12f1:1f1c Huawei Technologies Co., Ltd.

usb_modeswitch ile şu komutu gönderince kendisi bir ethernet aygıtına dönüşüyor:

# usb_modeswitch -v 12d1 -p 1f1c -W -I -M 55534243123456780000000000000011062000000101000100000000000000
Taking all parameters from the command line

* usb_modeswitch: handle USB devices with multiple modes
* Version 1.2.5 (C) Josua Dietze 2012
* Based on libusb0 (0.1.12 and above)

! PLEASE REPORT NEW CONFIGURATIONS !

DefaultVendor= 0x12d1
DefaultProduct= 0x1f1c
TargetVendor= not set
TargetProduct= not set
TargetClass= not set
TargetProductList=""

DetachStorageOnly=0
HuaweiMode=0
SierraMode=0
SonyMode=0
QisdaMode=0
GCTMode=0
KobilMode=0
SequansMode=0
MobileActionMode=0
CiscoMode=0
MessageEndpoint= not set
MessageContent="55534243123456780000000000000011062000000101000100000000000000"
NeedResponse=0
ResponseEndpoint= not set

InquireDevice disabled
Success check disabled
System integration mode disabled

Looking for default devices ...
searching devices, found USB ID 12d1:1f1c
found matching vendor ID
found matching product ID
adding device
searching devices, found USB ID 04f2:b230
Found device in default mode, class or configuration (1)
Accessing device 012 on bus 002 ...
Getting the current device configuration ...
OK, got current device configuration (1)
Using interface number 0
Using endpoints 0x01 (out) and 0x81 (in)

USB description data (for identification)
-------------------------
Manufacturer: Vodafone(Huawei)
Product: HUAWEI Mobile
Serial No.: FFFFFFFFFFFFFFFF
-------------------------
Looking for active driver ...
OK, driver found; name unknown, limitation of libusb1
OK, driver "unkown" detached
Setting up communication with interface 0
Using endpoint 0x01 for message sending ...
Trying to send message 1 to endpoint 0x01 ...
OK, message successfully sent
Resetting response endpoint 0x81
Resetting message endpoint 0x01
-> Run lsusb to note any changes. Bye.

Artık lsusb ile baktığımızda USB ID’sinin de değiştiğini görüyoruz:

# lsusb | grep Huawei
Bus 002 Device 013: ID 12d1:1590 Huawei Technologies Co., Ltd. 

Şimdi bir ağ aygıtı olarak da onu görebilmeliyiz ve eğer ağ yöneticimiz otomatik IP almaya ayarlıysa IP’sini bile almış olmalı:

# ip a
8: enp0s29u1u3: mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 86:c9:ec:4d:51:bb brd ff:ff:ff:ff:ff:ff
inet 192.168.9.100/24 brd 192.168.9.255 scope global enp0s29u1u3
valid_lft forever preferred_lft forever

Bu yaptığımız ayarlar, ne yazık ki kalıcı değil. Modemin üzerine böyle bir bilgi yazamıyoruz. Onun yerine Linux’un aygıt yöneticisi olan udev’e bu modemin her takıldığını farkettiğinde bu komutu çalıştırmasını söylememiz gerekiyor.

Bunun için udev’in kuralları okuyabileceği bir dosya oluşturuyoruz:

echo 'ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1f1c", RUN+="/usr/sbin/usb_modeswitch -v 12d1 -p 1f1c -W -I -M 55534243123456780000000000000011062000000101000100000000000000"'> /etc/udev/rules.d/45-usb_modeswitch.rules

udev’e kuralları tekrar okumasını söylüyoruz:

# udevadm control --reload-rules

Artık “Vodem”i taktığımızda, otomatik olarak ethernet kartı olarak görünmeli ve DHCP’ten IP alabilmeli.

Not: Aygıta gönderilmesi gereken “55534243123456780000000000000011062000000101000100000000000000” gibi bir mesajı kafadan yazmadım :). İnternet’ten araştırdığımda rastladım. Sadece bu cihaz değil, başka Huawei cihazlarında da işe yarıyor gibi okudum. Teknik kaynağını bilen varsa, yorumlara eklerse sevinirim.

Gezegen | 1 Yorum »
 

Linux’ta saat ileri/geri alınma zamanlarının kontrolü

23 Ekim 2015 Cuma, 16:52

Bilgi teknolojilerinden anlamayan yöneticiler sağolsun, 2011’de olduğu gibi bu yıl da, son dakikada Türkiye’nin “daylight saving time” (dst) uygulamasının tarihleri çok kısa bir zaman kala değişti.

Bu da, çalışan on yüz milyon sunucunun bu kısa süre içerisinde tarihler değişecek biçimde tek tek değiştirilmesi demek. Canlı sunucular için otomatik güncellemenin tercih edilmeyebileceği ya da her sunucunun İnternet bağlantısının olmayabileceği düşünülürse; bu çok ciddi bir iş yükü demek. Bankalar, havayolları gibi saatlerin çok kritik olduğu sistemlerdeki olası problemleri saymıyorum bile. Anadolujet’te yakın zamanda böyle bir sorun yaşadım örneğin:

anadolujet_saat_farki

Bilet almaya çalışırken, bir ekranda 10:00 uçağını seçerken, diğer bir kutuda 11:00 uçağını seçmiş gibi görünüyorum yukarıda.

Normalde saatlerin değişmesi gereken 25 Ekim 04:00 tarihine 1.5 günden az zaman kala, “acaba sunucum saatini doğru zamanda geri alacak mı?” diye bir soru işareti varsa kafanızda bunu Linux’ta kontrol etmek çok kolay.

zdump -v Europe/Istanbul |grep 2015

komutunun çıktısı size yanıtı verecektir. Eğer şuna benzer bir çıktı alıyorsanız, zaman bilgisini güncellemeniz gerekiyor demektir:

[root@barbun ~]# zdump -v Europe/Istanbul |grep 2015
Europe/Istanbul  Sun Mar 29 00:59:59 2015 UTC = Sun Mar 29 02:59:59 2015 EET isdst=0 gmtoff=7200
Europe/Istanbul  Sun Mar 29 01:00:00 2015 UTC = Sun Mar 29 04:00:00 2015 EEST isdst=1 gmtoff=10800
Europe/Istanbul  Sun Oct 25 00:59:59 2015 UTC = Sun Oct 25 03:59:59 2015 EEST isdst=1 gmtoff=10800
Europe/Istanbul  Sun Oct 25 01:00:00 2015 UTC = Sun Oct 25 03:00:00 2015 EET isdst=0 gmtoff=7200

Linux’ta bu bilgiyi tutan tzdata ve tzdata-java paketinin dağıtımınızdaki güncellemesini bulup yapmalısınız.

Güncelleme yapılmışsa, çıktınız şuna benzer olmalı:

[root@barbun ~]# zdump -v Europe/Istanbul |grep 2015
Europe/Istanbul  Sun Mar 29 00:59:59 2015 UTC = Sun Mar 29 02:59:59 2015 EET isdst=0 gmtoff=7200
Europe/Istanbul  Sun Mar 29 01:00:00 2015 UTC = Sun Mar 29 04:00:00 2015 EEST isdst=1 gmtoff=10800
Europe/Istanbul  Sun Nov  8 00:59:59 2015 UTC = Sun Nov  8 03:59:59 2015 EEST isdst=1 gmtoff=10800
Europe/Istanbul  Sun Nov  8 01:00:00 2015 UTC = Sun Nov  8 03:00:00 2015 EET isdst=0 gmtoff=7200
Gezegen | 1 Yorum »
 

Telnet ile SMTP doğrulama ile e-posta gönderiminin test edilmesi

08 Haziran 2014 Pazar, 14:44

Herhangi bir sunucudan e-posta gönderip gönderemediğinin en temel yöntemi, telnet komutuyla herhangi bir e-posta istemcisinin haberleşmesini taklit etmek. Böylece sorunun (varsa) nerede olduğunu tespit etmek mümkün. Eğer telnet’le e-posta gönderirken sorun yaşamıyorsanız, sorun kullanmak istediğiniz istemci ayarlarında demektir.

İstemciler her zaman anlamlandırabileceğimiz hata mesajları da vermeyebiliyor, telnet ile gönderim, bir sorun varsa hangi noktada olduğunu tespit etmekte de yararlı olabilir.

Eğer karşı sunucuya relay hakkınız varsa, isim/parola girmeden kolaylıkla e-posta gönderebilirsiniz. Aşağıdaki anlatımda “AUTH LOGIN” ile “235 2.7.0 Authentication successful” satırları arasında kalan kısmı toptan pas geçebilirsiniz.

Eğer çoğu durumda olduğu gibi e-posta gönderimi için isim/parola doğrulaması yapmanız gerekiyorsa, bu bilgileri base64 kodlayarak göndermeniz gerekiyor. Bunu aşağıdaki perl satırı ile bu kodlamayı yapabiliriz:

perl -MMIME::Base64 -e 'print encode_base64("icerik");'

Örneğin,

[dfisek@karadut ~]$ perl -MMIME::Base64 -e 'print encode_base64("gonderen@alanadi.com");'
Z29uZGVyZW4uY29t
[dfisek@karadut ~]$ perl -MMIME::Base64 -e 'print encode_base64("parolacim");'
cGFyb2xhY2lt

Şimdi e-posta gönderimini test edebiliriz:

[dfisek@karadut ~]$ telnet eposta.alanadi.com 25
Trying 195.112.152.4...
Connected to 195.112.152.4.
Escape character is '^]'.
220 eposta.alanadi.com ESMTP Postfix
AUTH LOGIN
334 VXNlcm5hbWU6

Burada belirtilen VXNlcm5hbWU6 ifadesi, size base64 kodlanmış olarak kullanıcı adınızı girmenizi istiyor. Girelim biz de (üstte kodladığımız ifadeyle):

Z29uZGVyZW4uY29t
334 UGFzc3dvcmQ6

Bu kez de bize base64 kodlanmış olarak parolamızı sordu. Girelim yine (üstte kodladığımız ifadeyle):

cGFyb2xhY2lt
235 2.7.0 Authentication successful

Parola doğrulama işlemini bitirdik. Artık e-postamızla ilgili sunucuya bilgi verebiliriz:

MAIL FROM: gonderen@alanadi.com
250 2.1.0 Ok
RCPT TO: alici@alanadi.com
250 2.1.0 Ok
DATA
354 End data with .

Bu başlıklar, e-postanın kimden kime gideceğini e-posta sunucusuna söyledi. Biz de e-postanın içeriğini yazmak istediğimizi DATA komutuyla e-posta sunucusuna söyledik.

Önce e-postanın başlıklarını yazıyoruz (küçüktür-büyüktür işaretlerinden önce/sonra gelen boşlukları siliniz):

From: Gonderen Adi < gonderen@alanadi.com >
To: Alici Adi < alici@alanadi.com >
Subject: E-posta gönderim testi

İlk “MAIL FROM” e-posta sunucusuna bilgi verirken, burada kullandığımız ikinci “FROM:” göndermek istediğiniz postanın içinde yer alıyor. Artık e-postanın gövdesini yazabiliriz. Yazdıklarımız bittiğinde bir kez boş satıra enter’a, daha sonra bir kez . yazıp enter’a, son olarak da tekrar boş satıra enter’a basmamız gerekiyor. Böylece e-postanın bittiği anlaşılıyor:

E-postam geldiyse beni iki kere pingle.

.
250 2.0.0 Ok: queued as 384E125B587

E-postamız başarıyla kuyruğa alındı.

Bu aşamalardan herhangi birinde takılıyorsanız, gönderimde tam sorunun nerede olduğunu buldunuz demektir.

Gezegen | 2 Yorum »
 

Sunucu Saatlerinin Doğruluğu ve NTP

01 Ekim 2013 Salı, 07:37

Sunucular 7×24 çalışan ve sürekli hizmet veren bilgisayarlar. Hiç kapanmayan bilgisayarların da saatlerinin bir kez düzgün ayarlandıktan sonra hiç bozulmamasını bekleyebilirsiniz.

Ama yanılırsınız :).

Sunucuların saatleri milisaniyeler düzeyinden başlayarak kayabilirler, hatta bu kayma zaman içerisinde dakikaları bile bulabilir. Artık bir donanımda tek sunucu da çalıştırmıyoruz, sanal sunucularda bu kayma miktarı daha da fazla artıyor (donanımın saati paylaşıldığı için).

Ne Önemi Var?

Eeee… bir sunucunun saati birkaç dakika ileride ya da geride olsa ne farkeder diyebilirsiniz. Sorun şu ki, sunucularda yapılan işlemlerin çoğunluğu saniye (hatta milisaniye) biriminde sürelerde gerçekleşiyor.

Birçok sunucuyu ilgilendiren bir işlem yaptığınızı farzedelim, aynı anda birinin saati 16:54:22, ötekinin saati 16:54:17, bir başkasınınkinin 16:55:22 olsun. O işlemin tam olarak hangi sunucuda hangi saatte yapıldığını nereden bileceksiniz? İşlemin yapılmasının ne kadar sürdüğünü ve akışını göremeyeceksiniz.

Sistemde gezinen birini takip ettiğinizi düşünelim, hangi sunucudan sunucuya atladığını, tam ne işlem yaptığını, vs çözmeye çalışırken aradaki zaman farkları kafanızı iyice karıştıracaktır.

Keza aynısı sistem kayıtlarını inceleyerek, geçmişe dönük inceleme yapmanız gereken herhangi bir çalışmada geçerli olacaktır.

NTP ile Saatlerimizi Ayarlayalım

Sunucuların zamanlarını ayarlamak için bir “kuzey yıldızı”na gereksinim duyacaklarını, yıllaar yıllar önce düşünmüş başkaları da. NTP (Network Time Protocol = Ağ Zaman Protokolü) adı verilen bir İnternet standardı ve sunucular arasında haberleşme yöntemi ortaya koymuşlar.

Tek işi zaman servisi vermek (yani saatin kaç olduğunu söylemek) olan NTP sunucularına bağlanan diğer sunucu bilgisayarları, saatin tam olarak kaç olduğunu öğrenip kendilerini ona göre gerekiyorsa düzeltme yöntemine gidiyorlar.

ntp.org isimli bir alan adı var, pool.ntp.org adresine bağlanan sunucular, “havuz”dan kendileri için en uygun/yakın zaman sunucusunu bularak oradan zaman bilgisini alıyorlar.

ntpdate ile Zamanda Atlamak

Normalde bir saati ayarlamak için, doğrudan saati değiştirir ve o zamana “atlama” yaparız. Saat bir an 16:54:22 iken birden 16:54:17 olabilir örneğin. Linux’ta date komutu aynen bunu yapıyor. ntpdate komutu da bu zamanı NTP sunucusundan çekerek yapan uzak akrabası.

Ancak sunucu kayıtları ve uygulamalarında tutarlılık yine önplanda olduğu noktada bunun sağlıklı olamayacağı birkaç senaryo düşününce ortaya çıkıyor. Zamanı geri aldığınızı farzedelim: 16:54:22 iken saat, zamanı ayarladınız ve (sunucu açısından zamanda geriye gidip) saati 16:54:17 yaptınız. Bu durumda sunucu 16:54:17’yi ve sonraki 5 saliseyi ikinci bir kere daha yaşayacak demektir. Sunucu kayıtlarında önce 16:54:18’de yapılmış bir işlem, sonra 16:54:22’de yapılmış bir işlem, sonra tekrar 16:54:18’de yapılmış ikinci bir işlem kaydedilebilecek demektir.

Aynı zaman damgalı ama aslında farklı iki zamana ait işlem tutarsızlık yaratacaktır. Ayrıca zamanın tekil/biricik/unique olduğu ve doğrusal ilerlediğine güvenerek çeşitli işlemler yapan sunucu servislerinin de güvendiği dağlara kar yağacaktır. Zaman ayarlarken servisleri durdurup, zamanı ayarlayıp, servisi başlatmak da bir çözüm ama çoğu zaman sunucu servisler için o kadarlık bir zaman kaybı da uygun olmuyor.

Üstelik ntpdate kullanılarak yapılabilecek olan, sadece belirli aralıklarla (cron’dan) ntpdate komutunu çalıştırmak.

ntpd ile Zamanın Akışını Değiştirmek

İşte o noktada NTPd adı verilen bir nadide uygulama devreye giriyor. Sunucunuzda sürekli çalışan bir uygulama olan ntpd, sadece anlık olarak değil, sürekli zamanı kontrolü altına alıyor. Belirli aralıklarla gidip uzaktaki NTP sunucusuna bakıp doğru zamanı alıyor.

Kendi yerelindeki zaman ile NTP’den gelen zaman farklı olduğunda ise zamanı doğrudan değiştirmek yerine, sunucudaki zamanı yavaşlatıyor ya da hızlandırıyor.

Örneğin gerçek saatin 16:54:22, sunucu saatimizin 16:57:22 olduğunu düşünelim. ntpd zamanın akışını yavaşlatıyor, bir dakika sürmesi gereken 60 saniyenin yavaaş yavaaaş 65 saniyede ilerlediğini görebiliyorsunuz. Daha uzun süren saniyeler sonucunda, her dakika 5 saniye daha gerçeğe yaklaşıyoruz ve 12 dakika sonunda saatler birbirine eş hale geliyor ve ntpd zamanı normal akışına çeviriyor.

Ya da zamanda geride olduğumuzu farzedelim. Gerçek saat yine 16:54:22 olsun ama bizim yerel saatimiz 16:53:22. Bu kez, zamanı hızlandırıyor. Bizim saatimizle saniyeler hızla akmaya başlıyor ve zaman içinde saatler eşitlendiğinde artık zaman akışı normale dönüyor.

Bilimkurgu filmlerinde gördüğümüz, evrende zamanın belli bir yerde daha hızlı/yavaş akması hayaldi gerçek oldu :).

Bu yöntem sayesinde, sunucu sistemimiz açısından zaman hiçbir zaman tekrar etmezken, zamanda hiç atlama da gerçekleşmiyor. Tüm saniyeler mutlaka yaşanıyor, hiçbir saniye iki kere yaşanmıyor.

ntpd aynı zamanda zaman değişimleri ile ilgili istatistik tutuyor ve sunucunun saati belirli bir zamanda ortalama ne kadar kayıyor bilgisine sahip oluyor. Daha sonra uzaktaki NTP sunucusu ile bağlantısı herhangi bir nedenle belirli bir süre koparsa, elindeki istatistiklere göre tahmin yürüterek zamanı ayarlamaya devam ediyor: “En son 2 gün önce doğru saati almıştım, 2 gündür haber yok. Elimdeki istatistiklere göre, bu sunucunun saati 2 gün içinde ortalama 5 ms kayıyor, o zaman ben de saati ona göre düzenleyeyim” diyerek çalışmasını sürdürüyor.

ntpd / ntpdate Seçimi

Peki ne zaman ntpd, ne zaman ntpdate kullanacağız?

Bir kereliğine zamanı ayarlayıp (aradaki fark günler düzeyinde örneğin), daha sonra tüm servisleri tekrar başlatıp logları da temizleyeceksek ntpdate kullanımı istediğimiz sonuca hızlıca varmamızı sağlıyor. Sonrasında ntpd ile ince kaymaları tutabiliriz.

Çalışan canlı bir sunucu sisteminde ise, bu işlemi ntpd’ye bırakmak ve zamanın daha nazikçe düzenlenmesini sağlamak gerekiyor.

Alternatif olarak görülen cron’dan sık sık ntpdate çalıştırarak sunucudaki saat kaymasını önlemeye çalışmak ise yazının başından beri belirttiğim nedenlerle pek önerilmeyen bir yöntem. Sürekli bir zaman için ntpd var zaten.

ntpdate, yine servislerin önemsenmediği, sık kapatılıp-açılan bir masaüstü sisteminde rahatlıkla tercih edilebilir.

Gezegen | 1 Yorum »
 

İngilizce özgeçmişler, başvurular, ilanlar

10 Mayıs 2013 Cuma, 21:52

Ülkemizde ciddi bir işsizlik olsa da, aslında birçok iş arayan insan olduğu gibi birçok işçi arayan insan da var. Karşılıklı beklentiler (hem teknik beceri hem maddi olarak) ne yazık ki çoğu zaman birbirini tutmuyor.

Özellikle çalışma yaşamına yeni atılmış ya da atılmak üzere olan insanlar için iş tanımlama, başvuru, değerlendirme, alım süreci yaşamın önemli bir parçası haline gelmiş durumda.

Hatta bazen öğrenciler bile daha staj aşamasında bu süreçle tanışıyorlar. “Naylon” ya da tanıdıkla staj yapmayacaklarsa, bir özgeçmiş ya da benzeri bir “kendilerini tanıtan” form doldurarak kendilerini staj yapmayı istedikleri işyerlerine tanıtmaları ve stajyer olarak almaya kabul ettirmeleri gerekiyor.

Geçmiş yıllarda bu süreci dışarıdan izlerken her zaman Türkiye’deki firmaların İngilizce iş ilanları vermeleri komiğime gitmiştir. Aradığın kişinin İngilizce bilmesini sağlamak için daha iyi yöntemler olmalı, bir tane çeviri servisine (ya da arkadaşına) o ilanı okutmak zor değil ki diye düşünmüşümdür.

Biz Özgür Yazılım A.Ş.‘ye (kendimiz de dahil olmak üzere) ilk etapta hep sektörde çalışmalarını bildiğimiz, tanıdığımız insanları almıştık. Geçen sene hiç staj duyurusu yapmamamıza rağmen başvuranlardan bir 7 kişilik stajyer ekibimiz oluşmuş, aralarından biri ile çok iyi uyum sağladığımızdan staj sonrasında ekibimize katmıştık.

Bu “başarı” :) üzerine, önceliği yine yeteneklerini zaten bildiğimiz insanlara vererek, bir taraftan iş ilanları da yayınlamaya başladık. İlk kez Ağustos 2012’nin sonunda bir ilanla başladık.

İşte o andan sonra bu başvuru sürecinin daha önce hiç görmediğim bir yüzüyle karşılaştım: Türkçe yayınlanan bir iş ilanına İngilizce bir özgeçmiş ile başvuranlar!

Öyle 1-2 kişiden bahsetmiyorum, yeni mezunların neredeyse yarısı İngilizce özgeçmişleri ile başvuruda bulunuyorlardı. Bu bana acayip şaşırtıcı, bir o kadar da komik geldi. Hadi İngilizce ilan yayınlayanlar bir derece, kendi tercihleri, adamı alacak olanlar onlar. Ama Türkçe ilan yayınlayan birisine İngilizce bir özgeçmiş yollarken verilmeye çalışılan mesajı kavrayamadım. Neden olabilir?

  • “Ben süper İngilizce biliyorum”
  • “Aslında ben yabancı şirketlere başvuruyorum ama size de tenezzül ettim işte, bilin yani beni nereler istiyor aslında…”
  • “Türkçe ilan vermişler ama bunlar düşünememiştir, şimdi değerlendirenlerin hepsi Türkçe bilmiyor olabilir, ben İngilizce yollayayım”
  • “Ben pek Türkçe bilmiyorum, kendimi anca İngilizce ifade edebiliyorum”
  • “Bilgisayar sektöründe tüm terimler ve kaynaklar İngilizce zaten, Türkçe başvuru yapılamaz ki”
  • “Amaan zamanında, İngilizce hazırlamışım, bir de Türkçe’sini mi hazırlayacağım? Karşımdaki İngilizce bilmiyorsa, zaten o işe girmeyeyim.
  • … ?

Hadi bari kendi kendinize kaşınıp İngilizce özgeçmiş hazırladınız, bari yazım hataları yapmasaydınız.

Bu konuyu, Şubat’ta Akademik Bilişim Konferansı’na gittiğimde birkaç kişiye sorduğumda, orada da sağlam bir tartışma konusu oldu. Bir kısmının aklı uçup bana inanmazken (“gerçekten yoktur bunu yapan insanlar canım!” derken), bir kısmı da öğrencilerin bazı üniversitelerde İngilizce okuduklarını, o nedenle İngilizce CV şablonları gösterildiklerini belirterek durumun normalliğini savunmaya çalıştılar, hatta garipsememi garipsediler :).

Yeni bir işe başlayanların çoğunlukla ekip arkadaşlarıyla Türkçe konuşmaları gerektiğini, müşterilerinin Türkçe konuştuğunu, kendilerini Türkçe ifade etmeyi başarmalarının önemini bir şekilde farkettirebilmek gerekiyor diye düşünüyorum.

Belki de ilanlara akıcı Türkçe yazan ve konuşan diye bir ifade eklemek gerekiyor. Kim bilir…

Not: Bu günlüğü haftalaar haftalar önce yazmıştım ama bitiremediğim için yayınlamamıştım. Şimdi vaktim oldu baktım da, bitirmişim aslında, o kadar az klavye oynattım ki üzerinde anlatamam. Yazık olmuş o kadar zamandır rafta durmasına.

Genel | 1 Yorum »
 

Windows komut satırından bul-değiştir yapmak

26 Mart 2013 Salı, 00:06

Her ne kadar çalışma yaşamımın tamamını Linux ve özgür yazılımlar üzerinde çalışarak geçirme lüksüne sahip olmuş olsam da, bazı kurumlarda Windows duvarına toslamadan duramıyorum.

Son iki günde atmadığım takla kalmadı. En son sanırım lise yıllarımdan beri ilk defa binary dosya düzenledim elle. Son geldiğimiz noktada ise bir dizin ve alt dizinlerinde belirli bir metin dosyasında bul/değiştir yapmamız gerekiyordu.

Linux kullananlar için kulağa çok kolay geliyor değil mi? find ve sed’i beraber çalıştırır hayatına bakarsın. Windows’ta böyle bir araç yok hazırda. Önce Linux kafası düşünmeyeyim deyip, İnternet’te benzer araçlar baktım. Bir tanesi .NET framework kurmaya kalktı, öbürü alt dizinlere inmedi derken kendimizi find, sed, vs kurarken bulduk fakat USB’de taşınabilir olması için bir sürü dll koymamız gerekecekti.

Son bir şansımı daha deneyip arama motoru turlarken nihayet Fart‘a rastladım. Tam olarak istediğim işi yapıyordu, basit bir programdı, herhangi bir bağımlılığı yoktu, ufacık bişidi. Linux’taki rpl aracına benzettim.

Find And Replace Text  v1.99b                         by Lionello Lunesu
 
Usage: FART [options] [--] [,...] [find_string] [replace_string]
 
Options:
 -h, --help          Show this help message (ignores other options)
 -q, --quiet         Suppress output to stdio / stderr
 -V, --verbose       Show more information
 -r, --recursive     Process sub-folders recursively
 -c, --count         Only show filenames, match counts and totals
 -i, --ignore-case   Case insensitive text comparison
 -v, --invert        Print lines NOT containing the find string
 -n, --line-number   Print line number before each line (1-based)
 -w, --word          Match whole word (uses C syntax, like grep)
 -f, --filename      Find (and replace) filename instead of contents
 -B, --binary        Also search (and replace) in binary files (CAUTION)
 -C, --c-style       Allow C-style extended characters (\xFF\0\t\n\r\\ etc.)
     --cvs           Skip cvs dirs; execute "cvs edit" before changing files
     --svn           Skip svn dirs
     --remove        Remove all occurences of the find_string
 -a, --adapt         Adapt the case of replace_string to found string
 -b, --backup        Make a backup of each changed file
 -p, --preview       Do not change the files but print the changes

Bir gün böyle bir uygulama arayacaklara not olsun, benim kadar acı çekmesinler diye de bu yazıyı yazayım dedim.

Genel | 1 Yorum »
 

OpenSuSE’ye BCM 43142 kablosuz ağ kartının tanıtılması

23 Şubat 2013 Cumartesi, 11:37

Dell’in yeni Vostro/Inspiron serisi bazı dizüstüleri üzerinde Ubuntu kurulu olarak geliyor tahminen (Ubuntu logosu var üzerinde). Tahminen diyorum, çünkü yurdum bilgisayarcısının elinde o müşteriye Windows yüklü olarak ulaşabiliyor :/.

Windows lisansının parasıyla da uğraşmamanın, ucuz olmalarının, düzgün bir klavyelerinin olması, standart ofis ihtiyaçları için fazlasıyla yeterli olmasının mutluluğu içinde Inspiron’ın 3520 serisinden bir-iki hafta içerisinde 3 tane aldım farklı işler için.

Bu dizüstülerinde Broadcom’un 43142 kablosuz ağ kartından bulunuyor. Aslında üzerinde Ubuntu yüklü geldiği için, bu ağ kartı doğal olarak Linux’ta çalışabiliyor. Üzerindeki Ubuntu’yu kullanacaksanız, sorun yok. Ancak herhangi bir Linux kurup, Broadcom’un son model kararlı sürücülerini kullanmaya kalktığınızda bu kartı (henüz?) tanıtamıyorsunuz.

Bunun üzerine Jasmine Aura isimli güzel bir insan, gitmiş ön-kurulu Ubuntu’dan o sürücüleri çıkartmış, tekrar paketlemiş, içine daha yeni çekirdeklerle çalışabilmesi için yamaları eklemiş.

Hazırda deb paketleri var, bunu OpenSuSE 12.2’de kullanabilmek içinse ben şu yolu izledim:

zypper in kernel-devel gcc kernel-desktop-devel patch make

komutuyla çekirdeğe modül derlemek için gerekli paketleri kurdum.

wget http://jas.gemnetworks.com/debian/pool/main/w/wireless-bcm43142/wireless-bcm43142_6.20.55.19.orig.tar.bz2
tar -xf wireless-bcm43142_6.20.55.19.orig.tar.bz2

komutlarıyla kaynak kodunu indirip açtım.

debian/patches dizinindeki tüm yamaları teker teker uyguladım:

cd wireless-bcm43142
patch -p1 < debian/patches/01-Makefile.patch
patch -p1 < debian/patches/02-license.patch
patch -p1 < debian/patches/03-rename-to-wlan0.patch
patch -p1 < debian/patches/04-linux-semaphore-include.patch
patch -p1 < debian/patches/05-kernel_3.1_onwards.patch
patch -p1 < debian/patches/06-user_ioctl_reqs.patch
patch -p1 < debian/patches/07-kernel_3.4_onwards.patch
patch -p1 < debian/patches/08-kernel_3.6_onwards.patch

Ek olarak aşağıdaki yamayı da hazırlayıp, uygulamam gerekti:

--- amd64/Makefile.orig	2013-02-23 11:18:13.949212051 +0200
+++ amd64/Makefile	2013-02-23 11:18:42.632389994 +0200
@@ -153,3 +153,3 @@
 
-EXTRA_LDFLAGS      := $(src)/lib/wlc_hybrid.o_$(BINARCH)
+EXTRA_LDFLAGS      := $(src)/lib/wlc_hybrid.o_shipped_x86_64

Bunu bir dosyaya kaydedip,

patch -p1 < dosya_adi.patch

olarak uygulayabilirsiniz. Artık modülü derliyorum:

cd amd64
make

Ortaya çıkan wl.ko dosyası bizim çekirdek modülümüz. Bunu ilgili çekirdek dizininin altına kopyalamamız gerekiyor:

cp wl.ko /lib/modules/3.4.11-2.16-desktop/kernel/drivers/net/wireless/
depmod -a

Burada 3.4.11-2.16-desktop olan çekirdeğinizin ismi. Güncellemeler sonucu değişebilir, /lib/modules altında da tüm güncellenmiş çekirdeklerin modüllerini bulabilirsiniz. Kullandığınız çekirdek sürümünü uname -a komutu ile öğrenebilirsiniz.

Modülü denemek için yükleyebilirsiniz:

modprobe wl

Bir hata almadıysanız, artık dmesg komutunun çıktısında, wlan0 aygıtının tanındığını görmelisiniz. Ağ ayarlarınızı yapabilir ve cihazınızı kullanabilirsiniz.

Sistem tekrar açıldığında da, çekirdek ilgili modülü yerleştirdiğimiz yerden bulup otomatik olarak yükleyecektir.

Gezegen | 2 Yorum »
 

4 GB’tan büyük zip dosyalarını Linux’ta açmak

14 Şubat 2013 Perşembe, 10:00

unzip komutuyla 14 GB’lık bir zip dosyasını açmaya çalışıp hata aldığımda çektiğim dosya bozuk diye düşünmüştüm. Böyle corrupt falan bişiler yazmıştı. file komutuyla dosyaya baktım, başlıklarında bir sorun yoktu — zip arşiv dosyası olarak görüyordu.

Dosyayı silip baştan çekmeme ramak kala, daha dikkatli okuduğumda dosyada 10 GB kadar bir fazlalık olduğunu iddia ettiğini farkettim. Rastlantı olacak hali yoktu, unzip komutu 4 GB’tan büyük dosyaları açamıyor olmalıydı.

Google dostumdur, bu sorun gerçekten var mı diye sordum. Varmış. Ama acıklı olan e-posta liste / forumlarda hemen herkes “zip niye kullanıyorsun, gzip kullan, vs vs” türü önerilerle gelmiş. En sinir olduğum yanıtlama türlerinden biri :(. İyi, güzel, hoş demişsiniz de, zip’i kendi hazırlamadıysa (bkz ben) ne yapacak? Adamlar soruyu, büyük bir dosyayı nasıl sıkıştırıp aktarırım diye sormamış ki, zip’i açamıyorum diye sormuş…

p7zip uygulamasına yöneldim ben de. Sisteme kurup,

7za x hede.zip

dedim ve çatır çatır açıldı zip. Başka bir sıkıştırma türü önermekten daha kolay değil mi? :)

Gezegen | 3 Yorum »
 

Cobbler Ağ Üzerinden Kurulum Sunucusu

09 Şubat 2013 Cumartesi, 22:50

Cobbler da ney” dediğinizi duyar gibi oluyorum :).

Özetle, Cobbler, kurulu olduğu ağdaki bir sunucuyu “ağdan açılmaya” (network boot) ayarladığınızda, karşınıza bir menü gelmesini ve bu menüde seçtiğiniz dağıtımın kurulumunu sağlar.

Üstelik kuracağınız dağıtım destekliyorsa, “kickstart” adını verdiğimiz bir dosyaya kurulum adımları sırasında neler yapılacağını yazarsanız, size başka hiçbişi sormadan kurulumu tamamlayabiliyor.

Peki, ne işinize yarar böyle bir servis? İlk aklıma gelen birkaç senaryo:

  • Eğer sunucuya bağlı bir KVM aygıtı varsa, sunucunun başına fiziksel olarak gitmeden kurulum yapabilirsiniz.
    • Kim şimdi yerinden kalkacak? :)
    • Sistem odaları çok gürültülü, yorucu, hasta edici ortamlardır. Orada geçen her dakika, bizim yaşam enerjimizden çeker.
    • Sunucu bir veri merkezinde (datacenter) olabilir. Her veri merkezine isteseniz de girme olanağınız olmayabilir (örneğin sunucular yurtdışında).
  • Kurulum için USB bellek, DVD, vs taşımak gibi bir derdiniz olmaz.
  • Kurumunuzdaki tüm sunucuların aynı şekilde kurulabilmeleri için çeşitli etkileşimsiz kurulum türlerini önden hazırlayıp, herhangi bir kişiyi “menüdeki şu seçeneği seç ve kurulumu yap” diye görevlendirebilirsiniz. Hata yapması mümkün olmaz :)

Cobbler aslında ufacık bir servis. Ama kendi dışında birçok sunucu servisini bir yerlere koşturuyor. DNS, DHCP, TFTP, HTTP, rsync, …

Cobbler’ın RHEL 6 serisi bir dağıtımda (Scientific, CentOS, Oracle) kurulumunu anlatacağım. Başka bir dağıtımda da benzer adımlarla kurabilirsiniz.

Cobbler’ı çalıştırmak için en ideal ortam, sunucuların kendi aralarında kurulmuş olan yedek ağdır. Bugün artık sunucuların hemen hepsinde birden fazla ethernet aygıtı bulunuyor. Bunlardan bir tanesi de genellikle sunucuların kendi aralarında (dışarı kapalı) bir ağ oluşturmak için kullanılıyor — kendi arasında veri alışverişi yapmaları dışarıya verdikleri hizmeti etkilememesi amacı ile. Bu ağda başka bir DHCP sunucusu çalışması gibi bir risk de bulunmadığından çok daha rahat hareket edebiliyoruz.

Cobbler’ı beraber kullanacağınız bir DHCP ve DNS sunucunuzun da hazırda bulunmadığını düşünerek, onları da Cobbler ile beraber ayarlıyoruz. Bunun için en kısa yöntem Dnsmasq servisini kullanmak oluyor. İsterseniz ağdaki bir DHCP ve/ya DNS sunucusunu kullanabilirsiniz.

Cobbler’ın paketleri popüler Redhat ek depolarından EPEL’de bulunuyor. Öncelikle ekli değilse onu ekliyoruz:

rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

Cobbler için gerekli paketleri kuruyoruz:

yum install cobbler dnsmasq

Ek olarak,
* pykickstart sadece kurulumları etkileşimsiz yapmak isterseniz (kickstart dosyaları ile yapılacak seçimleri tanımlıyorsunuz)
* debmirror Debian temelli bir dağıtım kurmak isterseniz
* fence-agents da sunucularda güç yönetimi yapmak isterseniz
* cobbler-web, Cobbler için bir web arayüzü kullanmak isterseniz
kurulabilir. Zorunlu değiller.

Servislerimizi açalım ve açılışta çalışır hale getirelim:

service xinetd start
service dnsmasq start
service httpd on
service cobblerd start
chkconfig xinetd on
chkconfig dnsmasq on
chkconfig httpd on
chkconfig cobblerd on

Cobbler’a hem DHCP için hem DNS için dnsmasq kullanacağımızı söylemek için /etc/cobbler/modules.conf dosyasındaki ayarları şu şekilde değiştiriyoruz:

[dns]
module = manage_dnsmasq

[dhcp]
module = manage_dnsmasq

Dnsmasq’ın ayarlarını Cobbler kendisi yapacak ama o ayarların neler olduğunu kendisine söylememiz gerekli. Bunun için /etc/cobbler/dnsmasq.template dosyasını şu şekilde değiştiriyoruz:

dhcp-range=Baslangic_IPsi,Bitis_IPsi
server=DNS_Sunucumuzun_IPsi
no-dhcp-interface=eth0

Buradaki no-dhcp-interface seçeneği, sunucunun İnternet’e bağlı bacağında DHCP servisi verip ortalığı karıştırmamasını sağlıyor. eth0 yerine sunucunuzdaki ilgili aygıtı yazabilir ya da böyle bir kaygınız yoksa tamamen kaldırabilirsiniz.

Cobbler’ın rsync’in etinden-sütünden yararlanabilmesi için /etc/xinetd.d/rsync dosyasındaki ayarı şu şekilde değiştiriyoruz:

disable = no

Cobbler’ın asıl ayarlarını ise /etc/cobbler/settings dosyasından yapıyoruz:

server: Sunucumuzun_IPsi
next_server: Sunucumuzun_IPsi
password: $1$3xhywdbz$0zc2kIXyvfYngTdgddX/20
manage_dhcp: 1
manage_dns: 1

Burada server ayarı Cobbler servisinin, next_server ayarı TFTP servisinin IP’si ama bizim kurulumumuzda iki servis de aynı makinede olduğu için aynı IP’yi yerleştiriyoruz.

password kısmındaki hash’i ise şu şekilde oluşturuyoruz:

openssl passwd -1 -salt 'rasgelebisiler' 'degistirbeni'

Debmirror kurduysak, /etc/debmirror.conf dosyasında aşağıdaki ayarları düzenliyoruz:

#dists
#arches

Cobbler paketi ile tüm ağ yükleyicileri gelmiyor, aşağıdaki komutla İnternet’ten eksikleri indirebiliyoruz:

cobbler get-loaders

Güvenlik duvarında Cobbler ve saz arkadaşları için bir seri delik açmak gerekiyor:
* 53 – Dns
* 67,68 – Dhcp
* 69 – Tftp
* 80,443 – Httpd
* 873 – Rsync
* 25150-51 – Cobbler

Bunu /etc/sysconfig/iptables dosyasını doğrudan düzenleyip servisi tekrar başlatarak ya da service-config-firewall(-tui) arayüzü ile yapabilirsiniz. Tabii bir seçenek de güvenlik duvarını tamamen kapatmak.

Keza SELinux için de biraz emek harcamak gerekiyor (eğer uğraşmayıp tamamen kapatmayı tercih etmezseniz). httpd’nin web servis parçalarının kullanılabilmesi, tftp’nin imaj dosyalarına erişebilmesi için:

setsebool -P httpd_can_network_connect true
semanage fcontext -a -t public_content_t "var/lib/tftpboot/.*"
semanage fcontext -a -t public_content_t "/var/www/cobbler/images/.*"

Cobbler servisini tekrar başlatıyoruz ve Cobbler’ın ayarlarını ilgili diğer servislere uygulamasını sağlıyoruz:

/etc/init.d/cobblerd restart && cobbler sync

Etkileşimsiz kurulum için bir kickstart dosyası hazırlamak isterseniz, örneklerini /var/lib/cobbler/kickstarts dizinindeki dosyalarda (ve İnternet’te çeşitli sayfalarda) bulabilirsiniz. Ya da system-config-kickstart arayüzünü kullanabilirsiniz.

Artık kurulumlarda kullanacağımız dağıtımları Cobbler’a ekleyebiliriz.

Örneğin, Scientific Linux 6.3’ün ağ üzerinden kurulum ISO’sunu eklemek istersek, öncelikle ISO’yu dosya sisteminde bir yere bağlıyoruz:

mount SL-63-x86_64-2012-08-02-boot.iso /mnt/cdrom -o loop

Cobbler’a bu ISO’yu alıp dağıtım arşivine eklemesini istiyoruz:

cobbler import cobbler import --name=SL63-Boot --path=/mnt/cdrom

Bu adımda hata mesajı alınca paniklemeyin. Netboot ISO’ları gibi kırpılmış ISO’larda bu yaşanıyor. O zaman Cobbler’a, “sen otomatik bulamadın ama bu aslında Redhat türevi bir dağıtım” diye özel olarak belirtmemiz gerekiyor:

cobbler distro add --arch=x86_64 --breed=redhat --name=SL63-Boot --initrd=/var/www/cobbler/ks_mirror/SL63-Boot/isolinux/initrd.img --kernel=/var/www/cobbler/ks_mirror/SL63-Boot/isolinux/vmlinuz

Artık dağıtım Cobbler arşivlerinde olduğuna göre, bu dağıtımı kullanan bir kurulum profili oluşturabiliriz:

cobbler profile add --name=SL63-Boot --distro=SL63-Boot --kickstart=/var/lib/cobbler/kickstarts/centos6.ks

Kickstart parametresi zorunlu değil, onu vermezseniz etkileşimli standart bir kurulum gerçekleştirirsiniz.

Cobbler’ın burada bahsetmediğim daha birçok özelliği var: Memtest, paket yönetimi, ayar yönetimi, puppet entegrasyonu ve daha niceleri. Cobbler’ın el kitabında hepsinin detaylarını bulabilirsiniz.

Kurmaya değer mi?

Birkaç sunucu için değmeyebilir. Kurulacak sunucu sayısı artmaya başladıkça, Kickstart ve benzeri ek özelliklerini kullanmasanız bile, evet, değecek.

Bazı sunucuların yönetim arayüzlerinde de ağ üzerinden ISO yükleyip kurulum yapmak mümkün ama hiç o ISO’ları bir ADSL bağlantısı üzerinden yüklemeyi denediniz mi? :) Hadi bir kere yaptınız, kaç kere o işkenceye dayanabilirsiniz? Ya aceleniz varsa?

Sunucu sayınız giderek artıyorsa, üşenmeyin, Cobbler’la hayatınızı kolaylaştırın…

Gezegen | Yorum Yok »
 

GTK2 programlarını farklı renk profilinde çalıştırmak

09 Temmuz 2012 Pazartesi, 22:00

Bazı GTK2 yazılımları, kendi içinde renk ayarları taşımak yerine doğrudan gtkrc dosyalarından bunu almayı tercih ediyor.

gtkrc dosyasında ise, programa özgü ayar yapılamıyor. İçinde bir programda yeşil üstü beyaz, ötekinde siyah üstü sarı kullanayım diyemiyorsunuz.

Çözüm ise birden fazla gtkrc dosyası oluşturup, daha sonra çevresel değişken ile onu çağırmak oluyor. Örneğin,


GTK2_RC_FILES=~/.gtkrc-2.0-black leafpad &

Bunun sürekli olmasını istiyorsanız, ev dizininizdeki .bashrc dosyasına yerleştirmeyi ya da ilgili uygulamanın sistemdeki .desktop dosyasını (genellikle /usr/share/applications altında bulunur) düzenlemeyi düşünebilirsiniz.

Gezegen | Yorum Yok »