Komut Satırında Yapılabilecek Birkaç Numara

Linux ve Apple bilgisayarlarda kurulumla birlikte gelen bir terminal programı vardır. Eğer Windows bir makinede çalışılacaksa, terminal kullanmak için Cygwin yüklenebilir. Bu arada Windows 10 için doğrudan bir kurulum yapmak da mümkünmüş.

Bu terminal sayesinde, özellikle Unix işletim sistemleri için geliştirilmiş, oldukça güçlü bazı komutları kullanabilirsiniz. Bu komutlar dizinler arasında gezmeye, dosyalara göz atmaya ve işletim sisteminden hızlıca bilgi almaya yararlar.

Bu yazıda ayrıntılı komutlara, hele hele işletim sistemine yapılan detaylı sorgulara girmeyeceğiz. Önceliğimiz en basit komutları öğrenmek, dosyaları kurcalamak ve tablo halindeki veriyi işlemek. Hatta tüm bunlara hızlı bir giriş yapacağız demeliyim. Asıl amacım sizleri komut satırını kullanmaya ikna etmek ve merak uyandırmak. Eğer bu yazıdan sonra terminal kullanmaya başlayıp, yeni komutları internette aramaya koyulduysanız, amacıma fazlasıyla ulaşmışım demektir.

1 Temel Komutlar

Eğer kurulum safhasını tamamladıysanız, terminali çalıştırdığınızda karşınıza şuna benzer bir ekran çıkar:

terminal.png

Ben bu yazıyı Apple marka bir bilgisayarda yazıyorum. Onun için sizin açtığınız terminal programının görüntüsü farklı olabilir. Örneğin arka planı açık renktir ya da yazı karakterleri farklıdır. Bu ekranda

sibirbil at sib-mbp [~]$

ile başlayan kısım komut satırını gösteriyor. Kabaca bir hesap makinesi ekranı gibi düşünebilirsiniz. Bu yazının kalanında göreceğiniz komutları işte bu satıra yazacağız.

Malum, bilgisayarlar ile ilgili bir yazıya "Merhaba Dünya" demeden başlanmaz. Komut satırında ekrana bir yazı yazdırmak için echo komutu kullanılıyor.

echo "Merhaba Dünya"
Merhaba Dünya

Şimdi dizinler arasında dolaşmaya bir bakalım. İlk komutumuz pwd. İngilizce print working directory kelimelerinin baş harflerinden oluşuyor. Bu komut içinde bulunduğumuz dizini gösterir.

pwd
/Users/sibirbil/Dropbox/ToDo/UnixKomutSatiri

Bulunduğumuz dizin içindeki dosyaları ve dizinleri görmek içinse list sözcüğünün kısaltması ls komutunu kullanıyoruz.

ls
UnixKomutSatiri.html
UnixKomutSatiri.org
resim

Burada dizinin içindeki dosyaları ve "resim" isimli dizini görüyorsunuz. Sırada dizinler arasında geçiş yapma var. Bunun için change directory kısaltması cd kullanılıyor. Şimdi "resim" dizinine geçip, içindekilere bakabiliriz.

cd resim; ls
terminal.png

Dikkat ederseniz iki komutu, cd ve ls, tek satırda yazmak için arada noktalı virgül kullandık. Bu sayede önce "resim" dizinine geçtik ve oradaki dosyaları listeledik. Tam bu aşamada iki özel dizinden bahsetmekte fayda var. Şu an çalıştığınız dizin için "." üstteki dizin içinse ".." kullanılıyor.

cd ..; ls
UnixKomutSatiri.html
UnixKomutSatiri.org
resim

Komut satırında joker karakterler kullanmak işleri hızlandıracaktır. Yani bu karakterler bir ya da birden fazla karakterin yerine giriyorlar. Önemli bir kısmını şu sayfada özetlemişler. Ben sadece birini anlatacağım; "*" karakteri. Bu sembol bilinmeyen sayıdaki karakter dizisi yerine kullanılıyor. Aşağıdaki komut ile uzantısı ".org" olan tüm dosyaları listeleyebiliyoruz:

ls *.org
UnixKomutSatiri.org

Ya da bu yazının dosyalarına bakabiliriz:

ls Unix*.*
UnixKomutSatiri.html
UnixKomutSatiri.org

Az sonra dosyalarla uğraşmaya başlayacağız. Tabii başka komutlar göreceğiz. O aşamaya geçmeden önce bir hatırlatma yapayım. Burada komutların en basit hallerini kullanıyorum. Aslında çok daha farklı numaraları var. Eğer herhangi bir komutun kullanımlarını ve seçeneklerini incelemek isterseniz man komutunu kullanarak yardım alabilirsiniz:

man <komut_ismi>

Örneğin

man ls

Şimdi ilk fırsatınızda dosya kopyalama (cp), dosya taşıma ya da isim değiştirme (mv) ve dosya silme (rm) komutlarını öğrenebilirsiniz.

2 Metin İşleme

Önce "metin" ile ne demek istediğimizi anlatmaya çalışayım. Bilgisayarda dokümanlar genelde iki formatta kaydedilir: ikili (binary) ve metin (text). Örneğin MS Word ile yazılan bir yazı, uzantısı ".docx" olacak şekilde ikili formatta kaydedilecektir. Öte yandan içinde çalıştığımız bu dizinde yer alan ".org" ve ".csv" dosyaları metin formatında kaydedilmişlerdir. Metin dosyalarının içindekilere baktığımızda okuyabileceğimiz harfler ve sayılar görürüz. Ancak ikili dosyaları açmak için özel programlara ihtiyacımız vardır. Örneğimize dönersek, ".doc" uzantısı ile kaydedilen bir dosyayı açmak MS Word ya da Libre Office gibi bir program kullanırız. Bu çok da büyük bir kısıtlama olarak düşünülmesin. İkili dosyalarla çalışan programların pek çoğu farklı biçemlerde kaydetme seçeneği sunarlar. Örneğin MS Word dosyalarını ".txt" uzantılı olarak ya da MS Excel dosyalarını ".csv" olarak metin formatında kaydedebilirsiniz.

Biz bu kısımda metin biçiminde dosyaları kurcalayacağız. Önce araya kullanışlı başka bir komut sıkıştırayım. İnternetten tam adresini bulduğunuz bir dosyayı wget komutu ile indirebilirsiniz. Shakespeare'in ünlü oyunu Hamlet'i kendi sayfamın altında bir yere koydum. Oradan indirelim.

wget http://people.sabanciuniv.edu/sibirbil/komutsatiri/hamlet.txt

Bakalım inmiş mi.

ls *.txt
hamlet.txt

Bir dosyanın içindekileri ekrana yazmak için cat komutunu kullanabiliriz. Ancak bu durumda dosyanın tamamı terminal ekranında akıp gidecektir.

cat hamlet.txt

Eğer bu tür uzunca bir dosyaya yavaş yavaş göz atmak isterseniz more komutu daha uygun olur. Yukarı-aşağı tuşları ile satırlar arasında gezebilirsiniz. Boşluk tuşuna basarak da sayfa sayfa atlamanız mümkün.

more hamlet.txt

Diğer iki seçenek de head ve tail komutları. Herhangi bir dosyanın en başındaki ve en sonundanki belirli sayıda satırı gösteriyorlar. Bu komutlara verdiğimiz -n seçeneği ile görmek istediğimiz satır sayısını belirliyoruz. Haydi, ilk 15 satıra bir bakalım.

head -n 15 hamlet.txt

1604


THE TRAGEDY OF HAMLET, PRINCE OF DENMARK


by William Shakespeare



Dramatis Personae

  Claudius, King of Denmark.
  Marcellus, Officer.

Pek çok komutun -n gibi verilecek seçenekleri var. Bir önceki bölümde yazdığım gibi man kullanarak komutların seçeneklerine bakabilirsiniz. Şimdi de Hamlet'in sondan 10 satırını görelim.

tail hamlet.txt
    The soldiers' music and the rites of war
    Speak loudly for him.
    Take up the bodies. Such a sight as this
    Becomes the field but here shows much amiss.
    Go, bid the soldiers shoot.
            Exeunt marching; after the which a peal of ordnance
                                                   are shot off.  


THE END

Dikkat ederseniz tail komutunu kullanırken satır sayısı vermedik. Çünkü her iki komut için de öntanımlı satır sayısı 10. Bazen bir dosyanın tamamı yerine belirli aralıktaki satırlarını görmek isteyebiliriz. Bunu yapmak için bir seçenek sed komutunu kullanmak. Aşağıdaki komut ile dosyanın 35. ile 40. satırları arasını görebiliriz:

sed -n "35,40p" hamlet.txt
  English Ambassadors.

  Getrude, Queen of Denmark, mother to Hamlet.
  Ophelia, daughter to Polonius.

  Ghost of Hamlet's Father.

Bu işin uzmanları sed komutunun böyle bir kullanımını görünce çok kızacaklar eminim. Haklılar. Gerçekten de sed ile pek çok şey yapmanız mümkün. Bu konuda yazılmış bir kitap bile var. Ama başlangıç seviyesindeki böyle bir yazıda dahi olsa, en azından bir duymuş olun diye kullanayım istedim.

Metin dosyaları söz konusu olduğu zaman en çok kullanılan komutlardan birisi dosya içinde bir kelimeyi aramak. Bunun için kullanacağımız komut grep. Kullanımı en basit haliyle şu şekilde

grep <aranacak kelime> dosya

Hamlet'in abayı yaktığı Ophelia, metinde hangi satırlarda geçiyor diye bakabiliriz.

grep Ophelia hamlet.txt
  Ophelia, daughter to Polonius.
Polonius, Laertes and his sister Ophelia, [Voltemand, Cornelius,]
Enter Laertes and Ophelia.
    Fear it, Ophelia, fear it, my dear sister,
  Laer. Farewell, Ophelia, and remember well
  Pol. What is't, Ophelia, he hath said to you?
    Than may be given you. In few, Ophelia,
                       Enter Ophelia.
    How now, Ophelia? What's the matter?
      Ophelia,'-
      'O dear Ophelia, I am ill at these numbers; I have not art to
Enter King, Queen, Polonius, Ophelia, Rosencrantz, Guildenstern, and Lords.
    Affront Ophelia.  
    And for your part, Ophelia, I do wish
  Pol. Ophelia, walk you here.- Gracious, so please you,
    We will bestow ourselves.- [To Ophelia] Read on this book,
    The fair Ophelia!- Nymph, in thy orisons
    Sprung from neglected love.- How now, Ophelia?
    march. [Enter King, Queen, Polonius, Ophelia, Rosencrantz,
                                  [Sits down at Ophelia's feet.]  
                 Enter Ophelia distracted.
  Queen. How now, Ophelia?
  Queen. Nay, but Ophelia-
  King. Pretty Ophelia!
    In hugger-mugger to inter him; Poor Ophelia
                      Enter Ophelia.  
    Dear maid, kind sister, sweet Ophelia!
  Laer. Too much of water hast thou, poor Ophelia,
  Ham. What, the fair Ophelia?
  Ham. I lov'd Ophelia. Forty thousand brothers

Hangi satırlarda geçtiğini yazdırmak isterseniz tek yapmanız gereken grep komutuna -n seçeneğini vermek.

grep -n Ophelia hamlet.txt
38:  Ophelia, daughter to Polonius.
268:Polonius, Laertes and his sister Ophelia, [Voltemand, Cornelius,]
560:Enter Laertes and Ophelia.
597:    Fear it, Ophelia, fear it, my dear sister,
652:  Laer. Farewell, Ophelia, and remember well
657:  Pol. What is't, Ophelia, he hath said to you?
695:    Than may be given you. In few, Ophelia,
1143:                       Enter Ophelia.
1145:    How now, Ophelia? What's the matter?
1329:      Ophelia,'-
1343:      'O dear Ophelia, I am ill at these numbers; I have not art to
1846:Enter King, Queen, Polonius, Ophelia, Rosencrantz, Guildenstern, and Lords.
1883:    Affront Ophelia.  
1891:    And for your part, Ophelia, I do wish
1898:  Pol. Ophelia, walk you here.- Gracious, so please you,
1899:    We will bestow ourselves.- [To Ophelia] Read on this book,
1949:    The fair Ophelia!- Nymph, in thy orisons
2039:    Sprung from neglected love.- How now, Ophelia?
2152:    march. [Enter King, Queen, Polonius, Ophelia, Rosencrantz,
2176:                                  [Sits down at Ophelia's feet.]  
3169:                 Enter Ophelia distracted.
3172:  Queen. How now, Ophelia?
3188:  Queen. Nay, but Ophelia-
3219:  King. Pretty Ophelia!
3251:    In hugger-mugger to inter him; Poor Ophelia
3342:                      Enter Ophelia.  
3348:    Dear maid, kind sister, sweet Ophelia!
3679:  Laer. Too much of water hast thou, poor Ophelia,
3942:  Ham. What, the fair Ophelia?
3979:  Ham. I lov'd Ophelia. Forty thousand brothers

Toplam kaç satırda geçtiğine bakacaksanız -c komutunu kullanmalısınız.

grep -c Ophelia hamlet.txt
30

Eğer arayacağınız tek bir kelime değil de, kelime öbeği ise aranacak ifadeyi tırnak içinde yazmanız yeterli.

grep "Enter Hamlet" hamlet.txt
Enter Hamlet, Horatio, and Marcellus.
                 Enter Hamlet, reading on a book.
                           Enter Hamlet.
Enter Hamlet and three of the Players.
                         Enter Hamlet.
                          Enter Hamlet.
Enter Hamlet.
        Enter Hamlet and Guildenstern [with Attendants].
       Enter Hamlet, Rosencrantz, [Guildenstern,] and others.
                 Enter Hamlet and Horatio afar off.
Enter Hamlet and Horatio.

Bir dosyanın içindeki harfleri, kelimeleri ve satırları saymak için wc komutunu kullanıyoruz.

wc hamlet.txt
4463   31956  196197 hamlet.txt

Buradaki sayılar sırasıyla toplam satır, toplam kelime ve toplam karakter sayılarını ifade ediyor. Bu komuta -l, -w ve -c seçeneklerini vererek sadece bir sayıya bakabiliriz.

wc -l hamlet.txt
4463 hamlet.txt

Şimdi daha ilginç bir işe soyunalım. Hamlet oyununda "the" kelimesi bakalım kaç kere geçiyor. Bunu yapmak için önce "the" kelimesini grep komutu ile aramalı, sonra da çıkan sonuçları wc komutuna göndermeliyiz. Ayrı ayrı komutları kullanmak tamam da, bir komutun çıktısını diğerine girdi nasıl yapacağız? Bunun için "|" işareti kullanılıyor. Bu işarete, İngilizce "boru" anlamına gelen pipe deniyor. Komutları borularla birbiri ardına döşüyoruz diye düşünebiliriz sanırım.

grep the hamlet.txt | wc -l
1356

Fakat burada ufak bir sorun var. Ya bir satırda "the" kelimesi birkaç kere geçiyorsa. Malum biz her satırı sadece bir kere sayıyoruz. Neyse ki grep komutuna -o seçeneğini verirsek, satırların tamamını değil aranan kelimelerin kendisini gösteriyor.

grep -n -o "Enter Hamlet" hamlet.txt
714:Enter Hamlet
1401:Enter Hamlet
1914:Enter Hamlet
2058:Enter Hamlet
2579:Enter Hamlet
2625:Enter Hamlet
2931:Enter Hamlet
2995:Enter Hamlet
3074:Enter Hamlet
3750:Enter Hamlet
4022:Enter Hamlet

O zaman daha doğru bir sayma işlemi yapabiliriz.

grep -o the hamlet.txt | wc -l
1656

Tam 300 tane daha "the" kelimesi bulduk. Güzel. Fakat hâlâ bir sorunumuz var. Maalesef grep komutu büyük küçük harfleri ayırıyor. O nedenle sayma işlemi sırasında "The" kelimelerini alamadık. Onun da çaresi -i seçeneğini vermek.

grep -i -o the hamlet.txt | wc -l
1929

Sonunda doğru saymayı başardık.

Artık bir komutun çıktılarını bir dosyaya yazmayı konuşabiliriz. Bu oldukça kolay. Tek yapmanız gereken > karakterini takiben çıktının yazılacağı dosya ismini vermek. Örneğin, içinde Ophelia geçen satırları "ophelia.txt" diye bir dosyaya yazalım:

grep Ophelia hamlet.txt > ophelia.txt

Bakalım nasıl oldu.

head ophelia.txt
  Ophelia, daughter to Polonius.
Polonius, Laertes and his sister Ophelia, [Voltemand, Cornelius,]
Enter Laertes and Ophelia.
    Fear it, Ophelia, fear it, my dear sister,
  Laer. Farewell, Ophelia, and remember well
  Pol. What is't, Ophelia, he hath said to you?
    Than may be given you. In few, Ophelia,
                       Enter Ophelia.
    How now, Ophelia? What's the matter?
      Ophelia,'-

Eğer bir dosyanın üzerine yazmak yerine sonuna eklemek istersek o durumda >> işaretini kullanıyoruz. Şimdi "ophelia.txt" dosyasının sonuna Ophelia'nın babası Polonius'un geçtiği satırları ekleyelim:

grep Polonius hamlet.txt >> ophelia.txt

Dosyanın sonuna bir göz atalım bakalım eklenmiş mi?

tail -n 5 ophelia.txt
                                                     Polonius.
  Hamlet in madness hath Polonius slain,
King. Now, Hamlet, where's Polonius?
King. Where is Polonius?
  For good Polonius' death, and we have done but greenly

Metin işleme derya gibi konu. Sadece birkaç komut ile hafif bir başlangıç yaptık. Daha ötesini öğrenmek isterseniz internette pek çok kitap bulabilirsiniz. Açıkçası kitaptan önce komut satırıyla haşır neşir olun derim. Sonrasında Google ile arama yaptığınızda her işinize bir cevap bulacağınızdan eminim.

3 Tablolar

Gelelim içinde tablo halinde veri olan metin dosyalarına. Hemen bir tanesini indirelim.

wget http://people.sabanciuniv.edu/sibirbil/komutsatiri/titanic.csv

İndirdiğimiz dosyada bir tablo var.

head titanic.csv
survived,pclass,name,sex,age,sibsp,parch,ticket,fare,cabin,embarked
0,3,"Braund, Mr. Owen Harris",male,22,1,0,A/5 21171,7.25,,S
1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C
1,3,"Heikkinen, Miss. Laina",female,26,0,0,STON/O2. 3101282,7.925,,S
1,1,"Futrelle, Mrs. Jacques Heath (Lily May Peel)",female,35,1,0,113803,53.1,C123,S
0,3,"Allen, Mr. William Henry",male,35,0,0,373450,8.05,,S
0,3,"Moran, Mr. James",male,,0,0,330877,8.4583,,Q
0,1,"McCarthy, Mr. Timothy J",male,54,0,0,17463,51.8625,E46,S
0,3,"Palsson, Master. Gosta Leonard",male,2,3,1,349909,21.075,,S
1,3,"Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg)",female,27,0,2,347742,11.1333,,S

Bu tablo Titanic yolcularının listesinin bir kısmını gösteriyor. İlk satırda tablo başlıkları var. Ondan sonraki her satır da bir yolcuya karşılık geliyor. İlk önce toplam kaç yolcudan bahsediyoruz bir bakalım.

wc -l titanic.csv
892 titanic.csv

İlk satırda başlıklar olduğuna göre toplam 891 yolcu var.

Bu tür tablolarda en sık yapılan işlemlerden birisi bir satırı ya da bir sütunu görmek. Satır için yine sed kullanabiliriz. Örneğin 3. satıra bir bakalım.

sed -n 3p titanic.csv
1,1,"Cumings, Mrs. John Bradley (Florence Briggs Thayer)",female,38,1,0,PC 17599,71.2833,C85,C

Bu tabloda ilk sütun ilgili satıdaki yolcunun kazadan sağ kurtulup kurtulmadığını gösteriyor. Bir sütundaki sayıları almak için cut komutunu kullanıyoruz. Bu komuta -f seçeneği ile sütun sayısını, -d seçeneği ile de hangi karakter ile sütunların ayrıldığını belirtiyoruz.

cut -f 1 -d ',' titanic.csv | head
survived
0
1
1
1
0
0
0
0
1

Ama bize ilk satır lazım değil. Bu noktada tekrar tail komutunu kullanabiliriz. Eğer tail ile birlikte -n seçeneğinden sonra +k yazılırsa, baştan k satırı atlayarak sonuna kadar dosyayı gösteriyor. O zaman ilk satırdan şu şekilde kurtulabiliriz:

cut -f 1 -d ',' titanic.csv | tail -n +2 | head
0
1
1
1
0
0
0
0
1
1

Hiç fena değil. Her seferinde ilk satırı çıkarmakla uğraşmayalım. Dosyayı ilk satır olmadan "titanicbasliksiz.csv" isminde yeni bir dosyaya yazalım.

tail -n +2 titanic.csv > titanicbasliksiz.csv

Tamamdır. Artık yeni dosyamızı kullanabiliriz. İlk önce sağ kalan insan sayısına bakalım. Bunun için grep komutundan yararlanabiliriz.

cut -f 1 -d ',' titanicbasliksiz.csv | grep 1 | wc -l
342

Beşinci sütun yolcunun cinsiyetini gösteriyor. Bakalım kaç tane kadın yolcu varmış.

cut -f 5 -d ',' titanicbasliksiz.csv | grep female | wc -l
314

Peki ya sağ kalan kadın sayısına bakabilir miyiz?

cut -f 1,5 -d ',' titanicbasliksiz.csv | grep "1,female" | wc -l
233

Dikkat ederseniz bakmak istediğim iki sütun için cut komutunun -f seçeneğinden sonra sütun numaralarını yazdım.

Son olarak biraz daha zorlu bir örnek düşünelim. Dosyanın 6. sütununda insanların yaşları var. Bu yaşları toplamak istesek nasıl yapacağız. Basit bir hesap işi olduğu için bc komutuna ihtiyacımız var. Bu komuta temel işlemleri verdiğimiz zaman sonucu ekranda gösteriyor.

echo "(3+4)*6" | bc
42

İlk işimiz 6. sütunu almak olsun.

cut -f 6 -d ',' titanicbasliksiz.csv | head
22
38
26
35
35

54
2
27
14

Bazı yolcuların yaşları girilmemiş. O satırları atlayalım. Bunu yapmak için yine grep komutu imdadımıza koşacak.

cut -f 6 -d ',' titanicbasliksiz.csv | grep -v "^$" | head
22
38
26
35
35
54
2
27
14
4

Burada -v seçeneği, aradığımız kelimenin dışındaki satırları göstermek için kullanılıyor. Ardından gelen ^$ ifadesi ise boş satırlar anlamında. Yani bu grep komutu boş olmayan satırları göster anlamına geliyor.

Gelelim bir sonraki aşamaya. Bu sayıları bc komutuna alt alta veremiyoruz. Her satırdan sonra + işaretine ihtiyacımız var. Bunun için de paste komutunu kullanabiliriz. Bu komut, adı üstünde, dosyalardaki satırları birleştirmek için kullanılıyor. İsterseniz deneyelim.

ls | paste -s -
UnixKomutSatiri.html    UnixKomutSatiri.org     hamlet.txt      ophelia.txt     resim   titanic.csv     titanicbasliksiz.csv

Aralara + eklemek istersek de -d seçeneği kullanılıyor.

ls | paste -d + -s -
#UnixKomutSatiri.org#+UnixKomutSatiri.html+UnixKomutSatiri.org+hamlet.txt+ophelia.txt+resim+titanic.csv+titanicbasliksiz.csv

Artık yaşları toplamaya hazırız.

cut -f 6 -d ',' titanicbasliksiz.csv | grep -v "^$" | paste -d + -s - | bc
21205.17

Garip biçimde virgüllü bir sayı çıktı. Bizde hata yok. Dosyada bir sürü yaş virgülle ayrılarak yazılmış. Bakmak için yine grep kullanabiliriz. Ancak bir metin içinde . ararken dikkat etmeli çünkü noktalama işaretlerinin farklı anlamları olabiliyor. O durumda \. şeklinde kullanabiliriz.

cut -f 6 -d ',' titanicbasliksiz.csv | grep "\."
28.5
0.83
14.5
70.5
32.5
32.5
36.5
55.5
40.5
45.5
20.5
23.5
0.92
45.5
0.75
40.5
0.75
24.5
28.5
0.67
30.5
0.42
30.5
0.83
34.5

İşte bu kadar. Başta da dediğim gibi terminali kullanmakta ısrar ederseniz son derece güçlü bir araç öğrenmiş olursunuz. Konu derin ve ben sadece yüzeyinde dolaştım. Öyle ki Unix komutlarıyla program dahi yazabilirsiniz. Bunun için pek çok kaynak var. Ben bir tanesine burada referans vermiş olayım. Yazı da bu şekilde bitsin.

Author: Ş. İlker Birbil

Created: 2016-09-20 Tue 10:02

Emacs 24.5.1 (Org mode 8.2.10)

Validate