UBUNTU, LINUX VE DERİNLERE DOĞRU

Son zamanlarda naçizane ve kendi çapımda kablosuz ağ yönetimi ile ilgili Ubuntu üzerinde bir bash script oluşturmaya çalışıyorum. Daha önce de zaten “ZENITY İLE KABUK PROGRAMLAMA MUCİZESİ” adlı yazımda da bahsetmiştim projeden. Zaman geçti projeyi tamamladım, bu süreçte Linux üzerinde derinlere dalarken Gnome masaüstü Ubuntu da hergün kullandığımız o ikonların, programların nerelerden nasıl çağırıldığı husunda güzel şeyler öğrendim ve sizlerle paylaşmak istedim.

Öncelikle hepimiz hergün bilgisayarın başına geçince birçok programı çalıştırıyoruz ve amacımıza göre onu kullanıyoruz. Ama o program ne yapıyor, nerelerden yaralanıyor, nerelere erişiyor diye pek ben de dahil sormuyoruz. Fakat iş programı yazmaya gelince birden bire bunların hepsini düşünmeye başlıyorsunuz mecburen. Çünkü insanlar (son kullanıcılar) artık işlerini kodla halletmek istemiyorlar. Evet özellikle Linux kullanıcıları işlerini terminal aracalığı ile yapmayı seviyorlar ama bütün herkese hitap etmek istiyorsak bu özelliğimizi değiştirmemiz gerekiyor. Herneyse biz konumuza geri dönelim. Her işini grafik ekrandan yapan kullanıcı bir programdan neler ister bunları düşünelim ilk önce. Çünkü bu soru basit gibi duruyor ama aslınca çok önemli bir soru. Ben hala tam olarak cevabını bulamadım. Güya cevabını aldığım durumları sizlerle paylaşacağım örneğin ;

  • Program kolay kurulmalı ve kurulum aşamasında kullanıcı iyi yönlendirilmeli.
  • Eğer program hayati önem taşıyorsa (Network Manager gibi) her açılışta kendiliğinden çalışmalı. Yani autostartup özelliğine o programı eklemeli.
  • Masaüstünde kısayolu olmalı ve adam gibi bir icon’u olmalı.
  • Applications menüsü altına kendi kategorisine göre eklenmeli.
  • Program yaptığı iş hakkında kullanıcıyı bilgilendirmeli ve bunları yaparkende işlemciyi yormamalı.
  • Program istenildiği anda kaldırılmalı. Yani uninstall özelliği eklenmeli.
  • Bunları yaparken de kullanıcıyı çok gerekli olmadıkça terminalle muhattap etmeden herşeyi GUI ile yerine getirilmeli.

Benim bulabildiğim birkaç madde bunlar. Yapmaya çalıştığım bash /sh scriptlerinde bunlara nasıl çözüm bulabilirim diye araştırdım. Tabiki pekçok madde eklenebilir ama bir kullanıcının temel ihtiyaçlarına karşılık verecek durumları çözdükçe diğerleri versiyon artıkça eklenebilir. Bu konuda ki önerileri her daim bekliyorum kesinlikle. İlk maddemizle başlayalım. İlk maddemiz zenity veya programcının isteğine göre herhangi bir görselleştirme aracıyla algoritmik bir şekilde hazırlanabilir. Diğer maddeler hazırlandıktan sonra ilk madde sadece hazırlanan araçların kopyalanması işlemidir. Ama kesinlikle görsellikten ödün verilmeden kullanıcıyı en güzel şekilde yönlendirecek şekilde hazırlanmalıdır. Bu konu için özellikle Human computer interaction başlığına bir göz atılmalıdır.

Diğer maddemiz  autostartup;

Eğer bir uygulamanın her açılışta açılmasını istiyorsak Ubuntu/Gnome  System>Applications Startup menüsü ile bize çok güzel bir ortam sunuyor. İstediğimiz uygulamayı ekleyebilir ve kaldırabiliriz ve öncelik atayabiliriz. Fakat eğer siz bir uygulama yapıyorsanız ve her açılışta açılmasını istiyorsanız bunun için  Applications Startup’ın geri planda yaptığını yapmak zorundasınız. İyi tamam ama ne yapıyor bu Applications Startup.

Figür 1 “Startup Applications” Menüsü

Aslında yaptığı, uygulamanın cinsine göre konfigürasyon dosyaları tutup içerisindeki verilere göre işlem yapması. Bu tür konfigurasyon dosyalarını sisteme daha önce kurduğumuz uygulamalar sayesinde daha ayrıntılı inceleyebiliriz. Nitekim ben de öyle yaptım. Dropbox kişisel dosya paylaşım uygulamasıdır. Bu programın nerelere konfig. Dosyaları attığını inceleyelim;

Terminalde ;


# cd /home/kullanici_adi/.config/autostart/
# ls
au_wifi.sh.desktop  bluetooth-applet.desktop  dropbox.desktop  print-applet.desktop  wicd-tray.desktop

ilk iki komutu verdikten sonra sizinde kullanım şeklinize göre otomatik açılış konfigurasyon dosyalarını göreceksiniz. Biz şu an biz Dropbox’la ilgileniyoruz. Çünkü dışarıdan kurduğumuz profesyonel bir yazılım ve amacımız profesyonel bir yazılım oluşturmak ve profesyonel bir yazılımdan örnek almak. Tekrar komut satırında ;

# nano  dropbox.desktop
[Desktop Entry]
Name=Dropbox
GenericName=File Synchronizer
Comment=Sync your files across computers and to the web
Exec=dropbox start -i
Terminal=false
Type=Application
Icon=dropbox
Categories=Network;FileTransfer;
StartupNotify=false

Dikkat ederseniz programın çalıştırılması ve GUI ortamının sağlanması için bütün ayarlar bu sihirli dosyanın içerisinde. Yapmamız gereken sadece bizim programımızda bunları kendi amaçladığımız şekilde değiştirmek, hadi yapalım:) ;

Komut satırında ;

# nano ornek_program.desktop

[Desktop Entry]
Name= ÖRNEK PROGRAM
GenericName=ÖRNEK PROGRAM
Comment=Bu program otomatik açılış için bir örnektir.
Exec=ornek_program
Terminal=false
Type=Application
Icon=kendi_yaptigimiz_icon
Categories=Network;FileTransfer;   // Neresini isterseniz.
StartupNotify=false

konfigurasyon dosyasını oluşturduktan sonra ;

Figür 2 Startup Applications “ÖRNEK PROGRAM”

görüldüğü gibi  Startup Applications menüsünü hiç kullanmadan oraya amacımıza uygun olarak uygulamamızı eklemiş olduk. Yapacağınız uygulamada eğer her açılışta çalışması istenen bir durum olduğunda yapmanız gereken sadece /home/kullanici_adi/.config/autostart/ dizinin altına bir konfigurasyon dosyası oluşturmak veya silmek olacak.

Bir sonraki iki maddemiz benzer, masaüstünde bir kısayol oluşturmak ve Applications menüsünde amaca uygun bir kategoriye eklenmek. Bunun için yine mevcut programlardan yararlanacağız. Benim bazım yine Dropbox. Eğer siz farklı bir kategoride çalışıyorsanız diğer kategoride bulunan birbaşka programın konfigurasyon dosyasını inceleyebiliriz.

Evet şimdi başlayabiliriz. Öncelikle uygulamamız için güzel bir icon düşünelim. Merak etmeyiniz Linux’ta öyle Windows’ taki gibi icon için ayrıca uğraşıp icon uzantılı dosya yapmak gerekmiyor. “PNG” uzantılı her resim sizin için icon olmaya hazırdır:) Yalnız programımıza icon oluşturacaksak nerelerde kullanmamız gerektiğini birazcık düşünmemiz gerekecek. Çünkü icon kalitesi çok önemli. Neden derseniz eğer bir uygulama panele eklenecekse daha küçük bir alan kaplayacaktır. Bu da icon şeklinin anlaşılamamasına yol açar. Veya Applications menüsünün altına çok küçük bir icon eklemeniz görsellik açısından hoş olmayacaktır. Mesela ben Ubuntu Netbook Remix kullanıyorum, onda küçük bir icon çözünürlük açısından hiç hoş durmadı. Bu yüzden programın kullanılma amacına göre iconlar oluşturup aşağıdaki kategorilere uygun şekilde çağırmamız gerekecek.

Terminalde ;

# cd /usr/share/icons/hicolor/
# ls
128x128  192x192  22x22  256x256  36x36  64x64  96x96             index.theme
16x16    20x20    24x24  32x32    48x48  72x72  icon-theme.cache  scalable

komutlarını verdiğinizde yıkarıda bulunan kategorilerde boyutlara göre icon dizinleri bulacaksınız. Amacınıza göre icon’unuzu ekleyebilirsiniz. En sık kullanılan Applications menüsü altına eklenen  iconladır ve 48×48 lik iconlar buraya uymaktadır.  Lakin farklı dizinlerde de icon’lar bulunmaktadır. Yaptığınız icon’u bu dizinin altına da kopyalamanızı öneririm.”/usr/share/pixmaps/” gibi.

Icon’umuzu da hallettikten sonra menümüzün altına uygulamamızı eklemeye geçebiliriz. Yine bahsettiğimiz gibi benim bazım Dropbox. Şimdi konfigurasyon dosyasını bulalım.

Terminalde;

# cd
/usr/share/applications/
# ls



Figür 3 “applications” dizini

Görüldüğü gibi sistemimizde  applications menüsü altında  ne kadar uygulama varsa hepsi burada 🙂 Buraya nasıl eriştik birazda ondan bahsedelim. System> Main Menu


Figür 4 “Main Menu”

Evet grafik ekrandan böyle yapılyor ama bunların birde  konfigurasyon dosyaları olmalı değil mi? Ama nerede? İşte Figür 3 ‘te verilenler, güzelim görünen bütün “janjanlı” uygulamaların geri planı:) Eee bizde madem profesyonel bir uygulama yapmaya kalktık dalmaya çalışalım bakalım derinlere. Dropbox demiştik ve konf. dosyasını inceleyelim içinde ne var? ;

Terminalde ;

# nano dropbox.desktop

[Desktop Entry]
Name=Dropbox
GenericName=File Synchronizer
Comment=Sync your files across computers and to the web
Exec=dropbox start -i
Terminal=false
Type=Application
Icon=dropbox
Categories=Network;FileTransfer;
StartupNotify=false

komutunu verdik ve karşımıza autostartup daki konfigurasyon dosyası ile aynı bir ayar dosyası çıktı. Fakat ben Sound&Video menüsü altında görünmesini istiyorum. O zaman bizim için örnek teşkil eden Rhythmbox müzik programını göz önüne alabiliriz. Ve böylece onun bulunduğu kategoriyi alabiliriz.

Terminalde;

nano rhythmbox.desktop

#
.
.
.
Categories=GNOME;GTK;AudioVideo;
.
.
.
#

Amacımıza göre düzenlersek;

#sudo nano ornek_program.desktop
[Desktop Entry]
Name=ÖRNEK PROGRAM
GenericName=PROGRAM
Comment=Bu uygulama applications menüsü altında görünür
Exec=ornek_program.sh
Terminal=false
Type=Application
Icon=ornekprogram.png
Categories=AudioVideo;
StartupNotify=false

Evet konfigurasyon dosyamızı oluşturduk şimdi bakalım yapabildik mi?


Figür 5 “SOUND&VIDEO” Kategorisi

Evet herşey yolunda ve herşey istediğimiz gibi. Güzel bir uygulama oluşturmak için neredeyse herşeye sahibiz:) Tabi “ÖRNEK PROGRAM” ımızın icon’u varsayılan olarak verildi. Yukarıda belirtilen klasörlere oluşturulacak iconlar kopyalanırsa konfigurasyon dosyasında “Icon=” kısmına icon ismi yazıldığında belittiğimiz icon menüde bütün ihtişamıyla görülecektir…

Figür 6 Örnek Icon

Diğer bi maddemiz ise uygulamamızın kullanıcıyı ne yaptığı ile ilgili bilgilendirmesi demiştik. Bu yaptığınız uygulamaya göre değişecektir elbette. Şöyleki eğer başka bir uygulama için arayüz oluşturmuşsanız o zaman benim gibi “log” lardan yararlabilirsiniz. Yok eğer uygulamayı tamamen kendiniz yazmışsanız. Kullanıcı etkileşimi hususunda biraz çaba sarfetmeniz gerekmektedir. Program çalıştığında, kapandığında, başka bir programı çağırdığında, çağıracağında, durduğunda kullanıcıya bilgiler vermelisiniz. Şöyleki eğer benim gibi betik hazırlamışsanız kullanıcıyı en iyi şekilde bilgilendirmek zorundasınız aksi durumda uygulamanız herkese hitap etmez durumda olacaktır;

#Yeniden başlat seçeneği sonucu çalışır.
 if [ "Yeniden Başlat" = "$cevap" ]; then
gksu /etc/init.d/networking restart
zenity --info \
--title="Bilgi" \
--text="Ağ yeniden başlatıldı."
 fi

gibi.

Ya da aktif bir programı durdurmak istiyorsanız yapmanız gereken adımlar ve bilgilendirme ;

Terminalde ;

#ps aux | grep program_adi
#pidof program_adi
islem_numarası
#kill islem_numarası

şeklindedir. Bunun için bir örnek Figür 7 da verilmiştir.

Figür 7 “process kill”

Bu işlemi betikte belirtmek istersek;

#Durdur seçeneği sonucu çalışır.
 if [ "Durdur" = "$cevap" ]; then
wpagui_pid=$(pidof wpa_gui)
kill $wpagui_pid
gksu /etc/init.d/network-manager start
zenity --info \
--title="Bilgi" \
--text="AU WiFi Net durduruldu. wpa_gui kapatıldı."
 fi

şeklinde kullanıcıyı bilgilendirmek gerekir.

Diğer bir husus ise başka programı kullandığınız zaman onun sistem tarafından tutulan loglarından yararlanmanız olacaktır. Şöyleki ;

Terminalde ;

#cd /var/log/

#ls

komutlarını verdiğinizde sisteminizde bulunan pekçok uygulamanın logları ile karşılaşacaksınız. Bu logları akıllıca kullanarak kullanıcı bilgilendirme konusunda kullanabilirsiniz. Buradaki şimdiki amacım log dosyalarından nasıl yaralanıyor onu göstermektir. Şöyleki;

Figür 8 “Loglar”

Ben wpa_supplicant’ın logranı kullanarak bir script oluşturdum.  wpa_supplicant ‘ın logları daemon.log ve syslog dosyalarına kaydediliyor. Oradaki bağlantı sonuçlarını alarak kullanıcıyı bilgilendirmeye çalıştım ;

#/var/log/daemon.log verileri inceleniyor...
 echo "" > /home/auwifi/durum
 while [ $(grep -c "No DHCPOFFERS received." /home/auwifi/durum) != 1 ]
    do
    tarih=$(date)
    ara=${tarih:4:12}
    tarih2=$(date --date='1 minutes ago')
    ara2=${tarih2:4:12}
    grep "$ara2" /var/log/daemon.log > /home/auwifi/durum
    grep "$ara" /var/log/daemon.log >> /home/auwifi/durum
#Ağa bağlanamadığı durum...DHCP alınamıyor...
       if [ $(grep -c "No DHCPOFFERS received." /home/auwifi/durum) = 1 ]; then
            zenity --error \
            --title="AU WiFi Linux Hata" \
            --text="Üzgünüz hiçbir ağa bağlanılamadı."
            echo "100" ; sleep 1
            exit 1
       fi
#Ağa bağlandığı durum...
       if [ $(grep -c "Associated" /home/auwifi/durum) = 1 ]; then
             zenity --info \
             --title="Bilgi" \
             --text="AU WiFİ Net ile ağa bağlanıldı."
             echo "100" ; sleep 1
             exit 1
       fi
 done

Yukarıdaki script parçasının sizin için birşey ifade etmediğini biliyorum fakat azda olsa birşeyler ifade etmesi açısından paylaşıyorum. Basitçe anlatacak olursak,  daemon.log dosyası içinde “ No DHCPOFFERS received.” bilgisi programın çalıştığı anda geçmesi durumda program ağa bağlanma konusunda başarısız demektir.  “Associated” kelimesi eş zamanlı geçtiğinde program ağa bağlanmış demektir.

Görüldüğü gibi sistem loglarından da yararlanmak mümkün. Buradaki zenity görselleştirmelerinin nasıl olduğunu merak edeler “ZENITY İLE KABUK PROGRAMLAMA MUCİZESİ” adlı başığa bakabilirler. Çünkü görselleştirme ile ilgili maddemiz orada detaylıca açıklanmıştı.

Yaptığımız uygulamanın kaldırılması hususu en basiti. Eklediğimiz konfigurasyon dosyalarını ve çalışabilir dosyamızı basit bir script ile teker teker sildirebilirsiniz. Çünkü neyi nereye attığımız artık belli:)

Umarım bu çalışmada sizlere yararlı olabilmişimdir.

Yücel K.

Saygılarımla…

If you need help in English for this topic, please send an e-mail or add a comment . We will  immediately return to you!