Konuşur gibi Türkçe Kod #14: Satır Testi

##1. Bölüm: Türkçe kodlama | ##2. Bölüm: TAR-Python ayarları
##3.Bölüm: kendi .tr uzantımız | ##4. Bölüm: Dil = KARAKTER yorumlayıcısı
##5. Bölüm: Donanım Sürücüleri | ##6. Bölüm: Kendi YAZ komutumuz
##7. Bölüm: Tüm harfleri 1 değişkene atama | ##8. Bölüm: Kendi komutlarımız
##9. Bölüm: YAZ’ma şekilleri + Teknoloji Oteli | ##10. Bölüm: Tırnak
##11. Bölüm: Burası Mühim | ##12. Bölüm: Yeni Satır
##13. Bölüm: İki Satır


Hatırlarsanız İki Satır muhabbet edelim 😉 derken YAZ komutumuz ilk seferinde doğru çalışırken, ikinci seferinde doğru çalışmamıştı. Satır atlama sorununu çözünce de başka bir sorunumuz devam etmişti, cümle değişkenimizin içini silip, yeni karşılaşacağı tırnak sonrasındaki harfleri yakalaması için ayarlamıştık.

Ve istediğimiz sonucu almıştık.


 

Bir önceki konudaki çukura denk gelmemek için isterseniz yeniden testler yapalım. En basitinden 3. satırı eklersek ne olacak, 4. satırı eklersek ne olacak bakalım.

3 satır için sonucu görelim

Şansa olmadı inşallah, garantilemek için bir de 4. satırı sonrası bakalım.

 

Güzel.

Biraz abartalım ve farklı şeyler deneyelim. Mesela programcı alt satıra değil de hemen yan tarafa yeniden bir yaz komutu isterse ne olacak? Hem alta hem yana yazıp görelim.

yaz "+Merhaba Dünya"
yaz "+Nasılsın?"
yaz "-İyiyim"
yaz "-Sen nasılsın?" yaz "-Orada havalar sıcak mı?" yaz "-Burası fena"
yaz "-Hiç kış gibi değil"

Ok.

Peki javascript ya da python gibi pek dildeki noktalı virgül olayına bakalım. Alışkanlık bu ya, art arda birkaç komut yazarken aralarına noktalı virgül ; koyarsa..

bakalım..

Hadi hayırlı olsun  İlk noktalı virgülden sonrası Yok.
Dıırıt, Dırııt..

 

Olağan şüpheli noktalı virgül gibi olsa da sanki o masum gibi.

Önceki yazılarda, dosya içinde yaz geçiyor mu? Tırnak var mı diye baktık. Ancak bunların arasında/öncesinde/sonrasında gelecek karakterler için bir yol yöntem önermedik. Ve görüldüğü üzre ilk beklenmedik karakter sonrası işleme girmedi.

Fakat 😉
Bununla birlikte daha önce aldığımız bir kararın, burada sonucunu görebiliyoruz:
Hatalı olan 88$# karakterler sonrası çalışmadı ama tümden hata vermek yerine buraya kadar olan kısımları işleme aldık. Yaklaşık olarak hatanın en sonra doğru işlemden sonra olduğunu tahmin edebiliriz.
Örneğimizde, hatanın yaklaşık olarak Nasılsın? ‘ın hemen sonrası bir yerlerde olduğunu öngörebiliriz.

Hatayı bulduysak, çözüme yaklaştık demektir 😉


Görsel

Konuşur gibi Türkçe Kod #13: İki Satır

##1. Bölüm: Türkçe kodlama | ##2. Bölüm: TAR-Python ayarları
##3.Bölüm: kendi .tr uzantımız | ##4. Bölüm: Dil = KARAKTER yorumlayıcısı
##5. Bölüm: Donanım Sürücüleri | ##6. Bölüm: Kendi YAZ komutumuz
##7. Bölüm: Tüm harfleri 1 değişkene atama | ##8. Bölüm: Kendi komutlarımız
##9. Bölüm: YAZ’ma şekilleri + Teknoloji Oteli | ##10. Bölüm: Tırnak
##11. Bölüm: Burası Mühim | ##12. Bölüm: Yeni Satır


Daha önce Yaz komutu ve Tırnakları yakalamıştık ve arasında geçen metini, cümle isimli değişkene atamıştık. Ardından bunu da ekrana yazdırmıştık. Tek seferlik bu komut için bir sorun yoktu ancak son bölümde yeni satıra geçip, yeni bir yaz komutu verdiğimizde işler karışmıştı. Satır atlama yani \n sorununu çözdüğümüzde ise karşımıza farklı bir tablo çıkmıştı.

yaz "merhaba dünya"
yaz "Nasılsın?"

Yeni satır karakterini yok ettik ama  Merhaba Dünya ile Nasılsın birleşik olarak geldi.

Bi yerlerde araya girip müdahale gerekiyor. Foksiyonumuzun tamamına bir göz atalım:

def Oku():
UzantiKontrol()
#print okunan
harfler = list(okunan);
#print harfler
komut = ""
tirnak = "son"
cumle = ""
for h in harfler:
komut += h
#print komut
if komut == "yaz":
komut = ""
elif komut == "\"":
print "tirnak var"
if tirnak == "bas": tirnak = "son"; print "ilk tirnak"
elif tirnak == "son": tirnak = "bas"; print "ikinci tirnak"
komut = ""
elif tirnak == "bas":
cumle += h ; print cumle
komut =""
elif komut == " ": komut = ""
elif komut == "\n": komut = ""
print cumle
Oku()

//Kopyalamak için metin olması güzel ama Steemit tab’lere izin vermediği için şöyle baksak sanırım daha sağlıklı olacak:

isterseniz daha önce kontrol amaçlı koyduğumuz, “tınak var”, “ilk tırnak”.. gibi açıklamaları kaldırıp daha sakin olarak görelim.

 

Görüleceği üzre, ilk tırnak sonrası başlattığımız “cümle“, ikinci tırnağı ve sonrasında iki satırdaki ilk tırnağı da görüyor ama birleştirmeye devam ettiğimiz için, ayrı ayrı yaz komutlarının metinlerini birleşik halde çıktı alıyoruz.

Hmm..

Ne yapmalı ne etmeli..

 

🙂

“Merhaba Dünya”nın sonundaki tırnak ile “Nasılsın”ın başındaki tırnak arasında bir şeyler yapmak işimizi çözebilir sanırım. Yani şu el-if’in içi:

burada yine bir karar aşaması var.

Tırnağın kapandığını görür görmez, mevcut cümleyi hemen orada ekrana basacak mı?
yoksa,
atıyorum cümleler adında başka bir dizi içinde mi toplamak lazım?
//Bu tür seçim yapmak durumunda kaldığımız kararlarla, dolaylı olarak programla dilimizin karakteristik yapısını oluşturuyoruz sanki.

Zamanında ASP’nin tüm kodlara bakıp çıktı sunana kadar boş ve beyaz bir ekrana baktığımızı hatırladığım için, benim oyum -şimdilik- hemen oracıkta gereken işlemi yapmak yönünde.

45’e print ekleyip, 49’daki print’i kaldırıp bakalım..

Tamam gibi ama olmadı. İkinci defa ekrana basmadan önce bir de cümle’nin içini silmemiz lazım // ki yeni göreceği tırnak ve sonrasındaki metin, bağımsız ikinci bir cümle olabilsin.

Yani, cumle=”” ekleyelim:

ve bakalım:

Yey!


Görsel ;))

Konuşur gibi Türkçe Kod #12: Yeni Satır

##1. Bölüm: Türkçe kodlama | ##2. Bölüm: TAR-Python ayarları | ##3. Bölüm: kendi .tr uzantımız

##4. Bölüm: Dil = KARAKTER yorumlayıcısı | ##5. Bölüm: Donanım Sürücüleri

##6. Bölüm: Kendi YAZ komutumuz | ##7. Bölüm: Tüm harfleri 1 değişkene atama.

##8. Bölüm: Kendi komutlarımız | ##9. Bölüm: YAZ’ma şekilleri + Teknoloji Oteli

10. Bölüm: Tırnak | ##11. Bölüm: Burası Mühim


Bir şekilde direk bu sayfaya geldiyseniz, konuya direk buradan dalış yapsanız da olur elbet lakin olayı ince ince idrak ederek kavramak isterseniz önceki bölümlere göz atmanız daha sağlıklı olabilir.


Son konumuzda YAZ’ı yakaladıktan sonra gelmesini beklediğimiz TIRNAK işaretini yakalama olayına bakmıştık. Ardından TIRNAK sonrası başlayacak olan metin için, sıradaki her harfi karakteri cumle değişkeni içinde toplamıştık. Ta ki İKİNCİ TIRNAK işaretini görene dek.

Ve aradaki boşlukları yok etmiştik 🙂

Peki programcı şöyle bir kod yazarsa ne olacak?

Yaz "Merhaba Dünya"
Yaz "Nasılsın"

Bakalım nasıl bir sonuç alıyoruz:

What?

Ne oldu ki, ilk satırı bile göremedik? En azından sadece ikinci satırın başlayana kadar olan kısımların bir çıktısı görseydik..

Dikkatlice bakarsak örnek.tr program dosyamızda

Yaz “Merhaba Dünya”

diyor. Ancak yorumlayıcımız TAR ile yaz var mı diye kontrol ettiğimiz komut “yaz”

Yaz ≠ yaz

ASCII tablosunu incelediğimiz yazıyı hatırlarsanız, her bir küçük harf ve büyük harfi ayrı BYTE’lar ile tanımlıyorduk. Bkz: 8 bit ASCII table

Yine bir karar noktası

Programlama dilimiz küçük harf – büyük harfe duyarlı mı olacak yoksa nasıl yazdığı önemli değil mi diyeceğiz.

YAZ = YAz = Yaz = yaz = yAz = yAZ

şahsen kendi tercihim, programcının canın istediği şekilde yazması yönünde. İster YAZ der iterse yaz. Bazı dillerde bu sorun yüzünden zihnimizde Büyük-Küçük bilgisini tutmak zorunda kalıyoruz. Bkz: Serial.Println, pulseIn, digitalWrite ..

her bir IF sınamasında yukarıdaki tüm versiyonları yazmaktansa, bize gelen karakterlerin hepsini önceden küçültür ve öyle işleme alırsak daha sağlıklı olabilir.

// I harfi için korku filmi sesleri size de geldi mi 🙂

 

Tamam küçültelim de standart lowercase fonksiyonları ingilizce temelli olduğu için  IrMak kelimesini irmak olarak küçültüyorlar. Bizde küçük ı harfinin büyüğü yok, i harfinin büyüğü ise I

Kodcu tek satırda değil de iki satırda YAZ derse ne olacak derken, nereye geldik 🙂

Ok. Şu an için örnek.tr dosyamızdaki Yaz komutunu yaz yapıp sonucu görelim ve Harf Küçültme işini sonraki yazılara bırakalım.

E hani “Nasılsın?”

Onun yerine bir boşluk var sadece..

Çoğu zaman, hatanın olduğu yer aynı zamanda çözümün de olduğu yerdir.
Biz bir karakter olarak görmesek bile, NL: New Line: \n CR: Carriage Return: Satır Başı yazısından hatırlarsak, sonraki satırı belirten görüntüsü olmayan ama bit/byte karşılığı olan karakterler vardı.

Biz ENTER tuşuna bastığımızda oluşan  \n gibi  örneğin. O halde boşlukları kaldırdığımız gibi yeni satır karakterlerini de silebiliriz.

Şimdi yeniden bakalım:

Yey!
Nasılsın yazısı da geldi!
Ama öncekilerle birlikte. Çoğu çözüm yanında yeni sorun da getirirmiş 😉 Bkz: internet, tablet..


Görsel

Konuşur gibi Türkçe Kod #11: Burası Mühim

##1: Türkçe kod | ##2: TAR-Python
##3: .tr uzantımız | ##4: KARAKTER yorumlayıcısı
##5: Sürücüler | ##6: YAZ
 ##7: Harfleri değişkene atama. | ##8: Komutlarımız
 ##9: YAZ’ma şekilleri + Teknoloji Oteli | ##10: Tırnak


Önceki bölümdeki bazı kısımları açıklayarak devam edelim. Zira BURASI MÜHİM. Çünkü neredeyse YENİ BİR PROGRAMLAMA DİLİNİ ÜRETMENİN ÖZÜ burada denilebilir.

Gayet basit ama mihenk taşı hikaye burada başlıyor:

Önceki bölümlerde, örnek.tr dosyası için yazılan her şeyi harf harf parçalamış ve hepsini liste halinde harfler değişkenine atmıştık.

Ve bu harfleri TEK TEK YAN YANA GETİRİP, bize lazım olan bir komut var mı yok mu bakıyoruz.

Şimdi kodları yorumlayan pc’nin kendiniz olduğunuzu düşünün. PC ile empati 🙂

Size komut =”” denilmiş. Komut adında bir değişken var ve şu an içi boş.

Ardından komut += h denilmiş.

Yani biraz önce örnek.tr program dosyası içinde yazılmış olanların

İLK HARFİ artık komut’un da değeri. Yani komut=y

ve bakıyoruz; YAZ, TOPLA, EĞER vb.. komut olarak kullanmak istediğimiz bir terim geçiyor mu?

şu an için komut = y olduğu için
komut == “yaz” sınaması bize Hayır diyor.  FOR döngüsü içinde olduğumuz için devam ediyoruz.

komut += h gördüğümüz için komut‘umuza bir harf daha ekliyoruz ve artık komut = ya

yeniden sınama yapıyoruz;
komut, “yaz” a eşit mi?
hayır
devam..

komut += h  peki o zaman, komut = yaz

komut, “yaz” a eşit mi?
Eveet! 🙂
O halde TIRNAK aramaya başlayabiliriz. Tabi öncesinde komut‘u yeniden boşaltalım ki yeni yakalayacağımız terimler için karışıklık olmasın:

komut = yaz ise komut=”” olarak atadığımız için en baştan bakıyormuşçasına devam edebiliriz.

 

Bakalım tırnak var mı?

Varsa, bunu “tırnak var” diye belirtelim. -şimdilik tabi ki, sonra kaldıracağız-

Ve ayrıca Baştaki Tırnak mı Sondaki tırnak mı bu sorunu çözmemiz lazım:

Akış sırasına göre gittiğimiz ver her terim sonrası komut’un içini boşalttığımız için,
tırnağı ilk gördüğümüzde tırnak = bas yaparsak, az sonra gelecek olan Merhaba Dünya gibi bir METİN için hazırlık yapabiliriz 😉

Aradığımız terimi bulunca, sonrakilere hazır olması için komut‘un için boşalttığımız gibi, tırnak = bas ‘ı yakaladığımızda, sonrasına hazırlık için tırnak = son yapıyoruz.
Benzer şekilde tırnak = son ise de tırnak = bas yapıyoruz.

Peki!
tırnak = bas ise cümle başlıyor demek, o halde yeni gelecek her harfi cümle değişkeni içinde toplayabiliriz 😉

Güzel.

Şimdi önceki bölümlerde konuştuğumuz Boşluğu Yokluğa eşitleme olayını yapalım 😉

ve ardından döngünün dışından da cümle‘nin on halini ekranda görelim.

 

Çarşambanın gelişini perşembeden tahmin edebilenler için, “Yeni bir Programlama Dili nasıl yazılır?” sorusuna teknik manada mühim bir açıklama getiren kısım burada yazılanlar. Zira bundan sonraki çoğu şey
for h in harfler döngüsü içinde dönüp duracak. Ve her döngü içinde YAZ var mı KIŞ var mı 🙂 TOPLA var mı ÇARP var mı diye bakıp duracağız.

Canınızın çektiği başka komutlar varsa  kurgusunu burada yapabilirsiniz 😉


Görsel

Konuşur gibi Türkçe Kod #10: Tırnak

##1. Bölüm: Türkçe kod yazma.

##2. Bölüm: TAR-Python ayarları.

##3. Bölüm: Kendi .tr uzantımız.

##4. Bölüm: Dil üretmek = KARAKTER yorumlayıcısı yazmak.

##5. Bölüm: Donanım-Yazılım kesişimi = sürücüler.

##6. Bölüm: Kendi YAZ’ımız.

 ##7. Bölüm: Tüm harfleri bir değişkene atama.

 ##8. Bölüm: Kendi komutumuz.

 ##9. Bölüm: YAZ’ma şekilleri + Teknoloji Oteli


Son yazıda sadece kod yazmak değil farklı kararlar da almak gerekiyordu. İster istemez diğer dillerdeki YAZ’ma şekillerine yeniden baktım.

Mesela, Basic‘te Merhaba Dünya şöyle yazılıyormuş:

PRINT "Hello, world!"​

Ataların lisanında 😉 ise şöyle
#include
int main(void)
{
puts("Hello, world!");
}

Daha genç versiyonu C++ şöyle
#include
int main()
{
std::cout << "Hello, world!
";
return 0;
}

more+

Görüleceği üzere aynı kaynaktan beslenen iki dil için bile yazım farkları var. Üstelik sadece int main gibi hazırlıklık kısımları değil, direk YAZ işlemini yapan kısımlarda da farklılık var.
puts ya da std::cout <<

Web ile birlikte zirve yapan JavaScript’te ise document.write(‘Hello, world!’); şeklinde.

Her birinde faklı bir şekil söz konusu. Son örnek olarak Logo’da tırnak yerine köşeli parantez kullanılmış: print [Hello, world!]

Buradaki TIRNAK yerine Köşeli parantez kullanımı; önceki yazıda @kagantrky ‘in da katkılarıyla incelediğimiz durumlar için cesaret verdi. Bir dilde ekrana çıktı almak için puts kullanmak gerektiğini öğrenmek zorundayken bir başka dilde aynı işlem için [  köşeli parantez  gerektiğini bilmek/öğrenmek zorundayız.

E madem, yeni bir dil için bazı yeni şeyleri öğrenmek zorunlu o halde TAR için de yeni şeyler pek ala söz konusu olabilir 😉


İsterseniz önce normal yoldan bakalım.

Yani yaz "Merhaba Dünya" şeklinde bir yazım için TIRNAKLARI ve ebetteki arasında METİNİ tespit etmemiz lazım.

A’ a! Yeni bir sorunumuz var.

 

İlk tırnak da ikinci tırnak da aynı şekilde: "

O halde

  • TIRNAK ile İLK karşılaştığımız anda bunun bilgisini bir yerde tutmamız lazım
  • Ve hemen içindeki harfleri bir CÜMLE olarak birleştirmemiz lazım
  • CÜMLEYE eklemeye devam etmeli
  • Ta ki İKİNCİ TIRNAK karşısına çıkana kadar
  • Her tırnak ile karşılaşmada bunun HANGİ TIRNAK olduğu bilgisini güncellememiz lazım

Tabiki bir de BOŞLUK var. ”
Bir şeyin kıymetini yokluğunda anladığımız gibi YAZ’ın bittiğini sonbaharın/BOŞLUK’un gelmesinden anlıyoruz ki YAZ tek başına bir kelime olabilsin.
Ama aynı zamanda YAZ’da sonra SADECE bir boşluk HEMEN ardından TIRNAK şartı koşmak da gıcık edici olabilir.
Bununlabirliktebilgisayarınkelimeleriayırtetmesi için boşlukgörmeihtiyacıolmayabilir; )
Bu yüzden boşluğu yok edebiliriz // Boşluğu yok etmek.. felsefik bi şey gibi durdu 🙂


TIRNAK hangi tırnak bilgisini tutmak için tırnak adında
ve tırnakların arasındaki metini oluşturup saklamak için cumle adın da değişkenler atayalım.
son/kapanış bir tırnağı görmüş ve şimdi karşında çıkanı ilk/başlama tırnağı kabul etmesi için tırnak=”son” yapalım.

Daha sakin bir görünüm için bazı printleri etkisiz hale getirelim.

şimdi
y
ya
yaz
yaz ”
yaz “M

akışı içinden YAZ ve TIRNAK yakalamak için oltamızı atalım 😉

dikkat edilmesi ve anlaşılması gereken kritik noktalardan birisi de

40. ve 46. satırlarda gördüğümüz komut=”” ataması, komut sürekli elimizde tuttuğumuz ve içine baktığımız bir değişken olduğu için HER KOMUT ya da işlemeden üzerinden geçtiğimiz HER KARAKTER sonrası mevcut içeriğini yokluğa eşitliyoruz. //Bi felsefik söz daha 🙂

 


Görsel

Konuşur gibi “Türkçe” Kod #8: Komut

##1. Bölümde Kod yazarken Türkçe komutlar/terimler kullanma fikrini üzerinde durmuştuk.

##2. Bölümde TAR’ın -şimdilik- gerekli olan  Python’u kurmuş ve Path ayarlarına bakmıştık.

##3. Bölümde Kendi dosya uzantımızı .tr olarak belirlemiştik bunu TAR’ın çağrılabilmesini sağlamıştık.

##4. Bölümde Kendi Programlama Dilimizi yapmak demenin KARAKTER yorumlayıcısı yazmak olduğundan bahsetmiştik.

##5. Bölümde Digital 0-1 ile fiziksel bir parçanın etkileşimine değinmiştik.

##6. Bölümde .tr program dosyamızın içindeki YAZ komutumuzu koşturmuştuk.

 ##7. Bölümde .tr dosyamızın içinde tüm harfleri UTF-8 olarak bir değişkene atamamıştık.


Tüm harfleri bir değişkenin içine aldığımıza göre, sırasıyla her birine bakabiliriz. Dahası belli şartlara göre art arda gelme varsa, durumdan kendimize vazife çıkarabiliriz 😉

//”liseliler buradaki espriyi anlamaz” demek istiyorum 🙂

Ne demek istiyorum;
öyle rasgele yzbzey syyuzs dizilişi değil de cümlenin içinde y+a+z dizilişi varsa, bu bizim için bir komut, yerine getirilmesi gereken bir emirdir.

o halde şu yan yana dizilişleri bir de pratikte görelim:

Dikkat edilirse komut adında Null bir  değişken oluşturduk. [Bu arada “Null” kelimesinin; Almanca’da “öyle hiç bir şey ki, sıfır bile değil” manasına da geldiğini öğrendiğim günden bu yana, çok severim kendisini 🙂 ]

komut değişkenini, fonksiyonun dışından da kullanmak için global yaptık.

sonra da sırayla tüm harfleri, başta null olan komut değişkenimize EKLEYEREK bi çıktısını aldık.. görelim Uğur’cuğum

ilk yazıda tam bu olayın mantığından / teorisinden bahsetmiştik.
Şimdi de pratiğini görmüş olduk.


İç içe danteller..

Buraya kadar güzel. İşler dantel dantel olmaya bundan sonra başlayacak.

Yukarıdaki .giften görüldüğü üzere ilk satır işimize yaramaz.
3 satır, gelmesini beklediğimiz komut(lardan birisi)

Hemen
if komut == "yaz":
bişeyler yap
diyebiliriz amma lakin ki farklı senaryoları da düşünmek zorundayız

 

 

Meselam, şu bayan yaz komutunu verdikten sonra, tek boşluk bırakmış olabilir, şu bayansa beş boşluk bıraktıktan sonra “Merhaba Dünya” yazabilir. Tabi bir de şu bayanda tırnak içine “Merhaba Yaz Güneşi” yazmış olabilir.

Öyle bir şey yapmalıyız ki;
* White Space’leri egale edelim
* Komut nerede başlayıp bitiyor, tırnak nerede başlayıp bitiyor bilelim
* Yazılacak cümle içinde YAZ ve başka komutlar geçiyorsa, taklaya gelmeyelim
* İki+ defa art arda YAZ ile çıktı almak isteniyorsa, kontrpiyede kalmayalım.


Görsel

 

 

Konuşur gibi “Türkçe” Kod #7: Harf Listesi

Önceki kısımlar:

 #1. Bölümde Türkçe Kod yazma fikrini ele almıştık.

#2. Bölümde TAR’ın üzerinde koşacağı Python’u kurmuş ve herhangi bir .exe dosyası gibi çalışabilmesi için Path ayarlarını yapmıştık.

#3. Bölümde nasıl PhotoShop’un kullanacağı dosyaların uzantısı .psd ise bizde TAR’ın kullanacağı uzantıyı .tr olarak belirlemiş bu bunların konsoldan çağrılabilmesini sağlamıştık.

#4. Bölümde Programlama Dillerinin mantığına bakmış, Php’den C++’a hepsinin aslında KARAKTER yorumlayıcısı olduğuna değinmiştik.

#5. Bölümde “A “gibi bir harfin de aslında 0-1’lerden oluştuğuna ve bunu göstermek için Ekranın/Donanım ve Yazılımın eklem noktalarına değinmiştik.

#6 Bölümde YAZ kodumuzu çalıştırmıştık.


Yukarıdaki yazıların toplamı ışığında, YAZ kodumuzun çalışma mantığını biliyoruz.  Biraz mutfak tarafına geçelim.

 

UzantiKontrol fonksiyonumuz ile TAR kelimesi sonrasına yazılacak olanları argüman olarak kabul ediyor ve ardından DosyaIcerik fonksiyonumuzla dosyanın içeriğini okuyorduk.

Şimdi önceki yazılarda üzerinde durduğumuz HARF HARF didikleme işlemimiz için,
Dosya içindeki BÜTÜN karakterleri bir liste içinde toplayalım. Boşuklar, Tablar, Satır atlamalar, tırnaklar, virgüller, parantezler elbetteki harfler ve rakamlar.. BÜTÜN her şey, harfler listemizin bir elemanı olsun.

So..

Bi tane Oku() fonksiyonumuz olsun. Bunun için
def Oku():
yazıyoruz alt satırda 1 TAB içeriden yazmaya başlıyoruz. (Çoğu editör bunu otomatik yapacaktır, ola ki TAB sayılarında bir aksilik çıkarsa, DELETE ile alt satırı yukarı ya çekip, arada hiç bir şey kalmadığında yeniden ENTER yaparak alt satıra geçebilirsiniz.

Oku() içinde önce UzantiKontrol() fonksiyonumuzu çalıştıralım.
Ardından harfler = list(okunan)  ataması yaparak yukarıda bahsettiğimiz tüm KARAKTERLERİ bi listede toplama işini yapalım. Ve bunu ekrana basalım.

 

Ve bakalım elimizde ne var.

Evet. Tam istediğimiz gibi. Listenin elamanlarına dikkat ederseniz y harfi,  a harfi, z harfinin yanında ardaki boşluk ve tırnak ve ardından Merhaba kelimesinin harfleri tek tek bulunmakta.

İyi ama şöyle olması gerekmez miydi? [‘y’,’a’,’z’,’ ‘, ‘”‘,’M’,’e’,’r’,… ..]

her tırnağın önünde bir u harfi var?
u’y’

Öyle olması gerekirdi. Ancak Türkçe karakterlerde sorun yaşamamak için hatırlarsanız üçüncü yazıda şu kodları eklemiştik
icerik = unicode(icerik,'utf-8')

ve özellikle UTF-8 kayıt yapan bir editör ile dosyalarımızı kayıt etmiştik.

Dolayısıyla, her değerin önündeki u, tırnağın içindeki karakterin UTF-8 formatında olduğunu söylüyor.


Görsel

Konuşur gibi “Türkçe” Kod #6: YAZ

Önceki bölümler:

“Türkçe”, Konuşur Gibi Kod Yazmak #1

Türkçe”, Konuşur Gibi Kod Yazmak #2: İlk Adımlar

“Türkçe”, Konuşur Gibi Kod Yazmak #3: Dosya Çağırma

“Türkçe”, Konuşur Gibi Kod Yazmak #4: Harf Harf Didikleme & Karakter Meselesi

Konuşur Gibi “Türkçe” Kod #5: Yazılım ve Donanımın Eklem Yerleri


Belki kendi icat edeceğimiz ya da en azından var olan bir cihazı kendimizin yapacağı durumlar olacak. Ve cihazın her hangi bir sebepten dolayı ekranı olursa; #4 ve #5 Nolu yazılardaki mantık hayli işimize yarayacaktır. Üstelik sembolleri ve harfleri kendimiz oluşturabileceğimiz için Ğ Ü Ş Ö gibi karakterin de rahatça kullanılabildiği ve metinleri Türkçe olan cihazlar güzel olacaktır.

Tabi bu güzellik yanında “font” gibi estetik, işlevsel ama uğraştırıcı bir sorunu/çözümü de yanında getirecektir. Neyse ki TAR için yazı fontu veya bir ekranın çalışma düzenini işleten bir sürücü hazırlamak zorunda değiliz.

// Niye onu da biz yapmıyoruz diyenleri rahatlamak için söyliyeyim; Python php node asp.. hiç biri işletim sistemi/sürücü derinliğine inerek ekrana “Hello World” yazdırmıyor. Zaten işlemekte olan bir sisteme, işletim sistemine pas atıyor.

Biz de diğerleri gibi Windows’a yaz/ print komutunu göndereceğiz ve M, E, R, H, ..  harflerini yazmak için ekranın hangi pixel’ine hükmetmesi gerektiğini ona bırakacağız.

So..
Pixel seviyesinden Harf seviyesine çıkıp, Kodlara yakından bakarak devam edelim..

Seri boyunca Başlıklardan eksilmeyen amacımız: TÜRKÇE Kod Yazmak.

Yani  şunlara denk geldiğimizd

BEGIN DISPLAY("HELLO WORLD!") END.


10 PRINT "Hello, World!"
20 END


package main
import "fmt"
func main() { fmt.Println("Hello, World")}

tümden Fransız gibi hissetmek yerine, anlamaya daha yakın olmak.

BAŞLA EKRAN("MERHABA DÜNYA!") SON.


10 YAZ "Merhaba, Dünya!"
20 SON


ana paket
içerigetir "duzen"
fonksiyon ana() { duzen.YazSatir("Merhaba, Dünya")}

Görüleceği üzere Kodlamadan hiç anlamasak bile Japonca okuyor gibi de olmuyoruz.


Madem kendi dilimizi yazıyoruz..

İlerledikçe gramer yapısı için de bir şeyler düşünebiliriz 😉 Ancak şimdi Hem mümkün olduğunca sade, hem okuması kolay olacak şekilde başlayalım derim.

Yukarıdaki tüm örneklerden daha sade bir şekilde kod yazabiliriz, mesela Programımız  şöyle olsa

çok tatlı olmadı mı?

başla, bitir, include/içeaktar, paket vs. olmadan,

Sadece YAZ “Metin” kodunu yazıyoruz. Ve çalıştığında tırnak içindekileri çıktı olarak ekrana yazıyor.


Görsel

 

Konuşur Gibi “Türkçe” Kod #5: Yazılım ve Donanımın Eklem Yerleri

Önceki bölümler:

“Türkçe”, Konuşur Gibi Kod Yazmak #1

Türkçe”, Konuşur Gibi Kod Yazmak #2: İlk Adımlar

“Türkçe”, Konuşur Gibi Kod Yazmak #3: Dosya Çağırma

“Türkçe”, Konuşur Gibi Kod Yazmak #4: Harf Harf Didikleme & Karakter Meselesi


Bu yazıyı hazırlamak için siteye girmeye çalıştığımda SSL/https hatası almıştım. Bu vesileyle mini bir SSL kurma rehberimiz oldu, kime niyet kime kısmet 😉

#4 Nolu son yazıda, her “Merhaba Nasılsın” diyen amcanın masum aynı olmadığını, amcamızın sözde değil özde Türkçe konuşmak için UTF-8 kullanırsa daha sağlıklı olacağını görmüştük.

Yani;
Uzantısı .tr olan program dosyalarımızı kayıt ederken, kullandığımız editörün UTF-8 kayıt yaptığından emin olmamız gerekiyor. Bu minvalde SublimeText3 işimizi görecektir.

Not defterini açıp, içine;

yaz "Merhaba Nasılsın"

kodunu yazıp, Farklı kaydet seçeneğinden Selam.tr adıyla kayıt yapabilirsiniz. Ve buradaki “ı” harfi sorunsuz görüntüleniyor olabilir ama özünde UTF-8 kayıt yapılmadığı içim TAR’da sorun yaşatacaktır. Bu yüzden aynı kodu, SublimeText ile yine Selam.tr adıyla kayıt edip

tar Selam.tr

diyerek çalıştırdığımızda TAR, selam.tr dosyasını açıp harf harf, karakter karakter içindekileri alacak ve yorumlamaya başlayacaktır.


..da

–Neyi nasıl yorumlayacak? Yaz‘ın manasını ne biliyor ki?
–bilmiyor!

Hadi başka bir konudaki bilgilerimizi birleştirelim; WiFi’den Tost Makinası Kontol serisinin 5. yazısında Serial porttaki bilgilere ulaşmış ve cihazın server hizmeti için hazır olup olmadığına bakmıştık. Ardından bazı pinlere elektrik göndermiş, makinayı çalıştırmıştık.

SeriPort’ta nasıl “?pin=MotoruAC” yazabilir de biz onu okuyup içinde AC yazıyor mu diye bakabiliriz ki?

Elbetteki AC yazmaz. Yazamaz. Ama elektrik var-yok, 01000001 01000011 olabilir. Ve hatırlayınız bu 1-0’lar A ve C demek.

O halde 01111001 01100001 01111010 var mı diye bakarsam yani :Y A Z geçiyorsa,
tost makinası çalıştırmak gibi ekranın belli Pixel’lerini açıp kapatır ya da rengini ayarlayabilirim.

Ve tostmakinalarının/ledlerin/pixellerin hangilerininin çalışacağını öyle bir seçerim ki YAZ dan sonra gelen “iki tırnağın arasındaki” metni gösterecek şekilde olur 😉

Umarım olayın mantığını anlatabilmişimdir. Fark ediyorsanız olay Ekranı pixel pixel kontrol eden bir yazılama gidebilir. Yani ekran kontrolcüsü yazabiliriz. Daha bilindik ifadeyle “ekran kartı sürücüsü/driver” hazırlayabiliriz.

Evet bu hali çok ilkel ama yazılım ve donanımın EKLEM yerlerindeki olayları anlamak ilerde bir işletim sistemi ya da tcp/ip/https/www gibi kendi protokollerimizi hazırlamak için zemin hazırlayabilir 😉


Görsel 1 Görsel 2 Görsel 3

“Cihazın Algılaması” Dediğimiz Şey

Bkz: Önceki konular:
26 Satırda İsrafı Önleme
26 Satır Bahanesiyle, Ucundan Bit-Byte, MBit/s Meali
void loop() ve analogRead açıklaması


Hiç öyle bir niyetim yoktu ama ufak açıklama ve eklemeler yapayım derken, bunun aynı konu üzerindeki 4. yazı olduğu düşünülürse, bu yazılar da bir Seri’ye dönecekmiş havası seziliyor sanki 😉

Son yazıda, analogRead() hakkında yazmışım.. Sonrasından devam edelim..

Bizi karşılayan kod:

-Denilmez ve belki iddialı bir laf olur ama- Denilse ki; Şu programlama dilini hatta ve hatta BÜTÜN Programlama dillerini ve programcılık mantığını tek KELİME ile nasıl özetlersin?

Bu sorunun o tek kelimelik cevabı

olurdu sanırım.

Ve başlıktan da anlaşılacağı üzere, herhangi bir programın ya da cihazın, “algılamasından”, “sınama-doğrulama yapmasından”, “değişikliği fark etmesinden”, “belli bir koşulun gerçeklemesi ile belirli şeyler yapmasından” vb.. bahsediyorsak temelde IF’ten bahsediyoruz demektir.

“`Eğer (şifre yanlışsa)  { Ekrana hata mesajı yazdır. Yanlış şifre denemesi yapıldığın dair mail at. }“`
“`IF (Steem fiyatı 1 USDT’nin altına düşerse) {  100 Steem Sat. 50 SBD Al. EOS’a %10 aşağıdan AL emri gir. }“`

“`IF (evi su basmaya başladıysa) { telefona bildirim gönder. }“`

Ve gelelim üzerinde çalıştığımız örneğe, “`Şayet (gün ağardıysa ){ Sokak lambalarını söndür }“`

Bir önceki bölümden hatırlayacak olursak;

kodu ile A0 pinine bağlamış olduğumuz Işık Sensörü’nden (LDR) gelen değerleri okuyor ve bunu x’e atıyorduk.

Şimdi bi kere daha düşünelim;

Ne istiyoruz?

Margot Robbie ile akşam yemeği yemek 🙂

Gün ağarınca, sokak lambaları sönsün..
Yani? LDR-Sensör üzerine düşen ışık miktarı artınca.. lambalar sönsün..
Yani LDR’den okuduğumuz değer artında..
Yani x değeri artınca

Algılama dediğimiz şey işte tam burası..

// Aydınlık artınca x de artacağı için, x 200’den büyük ise, süslü parantez içindeki yap
// Programlama dilleri arasında ufak tefek imla farkları olabilir ama genel mantık budur.
// Şöyle ise, şöyle değilse, büyükse, küçükse, büyük eşit değilse vb..
// Dilerseniz iki koşulu birlikte de verebilirsiniz. Ali gelmişse ama Zeynep gelmemişse, şunları yap gibi..
// So..

Ok. Ortam aydınlık ve x 200’den büyük. Şimdi lambaları kapatalım.

// Yukarıda A0 pininden değer okumuştuk.
// Bu kez herhangi bir pine bir değer gönderdiğimiz için READ yerine WRITE kullanıyoruz.
// Geniş bir yelpazede veriler/değerler değil de sadece Aç-Kapa , 1-0 gibi bir değer göndereceğimiz için
// yani Dijital bir işlem yapacağımız için digitalWrite() kullanıyoruz.
// burada Sokak lambalarımızın ana hattını kontrol eden Röle, 3 nolu pine bağlı olduğu için
// 3 nolu pine LOW gönderiyoruz. Yani sokak lambalarımızı kapatıyoruz.


Görsel: hdwallsourceshutterstock

Node.js Sevememe

Bayram öncesinde yeğenimle bir proje başlamıştık.

Bir zaman sonra önümüze çıkan kütüphanelerin bazıları Node.js işaret ediyordu.  Bilgisayarım Sunucu Olsun – Python & Bottle yazısında bahsettiğim üzere daha önce Python & Bottle ikilisi kısa araştırmalar sonucunda

“`adresim.com/isteksayfa“` ve / veya duruma göre “`adresim.com/sonucsayfa“`

şeklindeki sunucu isteklerine kolayca yanıt verilebildiğini görmüştüm.

Örneğin,

python kurumu sonrası, consolda (başlat>cmd)
“`
pip install bottle

“`

yaparak bootle kütüphanesi kurmak ve ardından

“`
from bottle import route, run, request
import os; import requests

@route(‘/’, method=’GET’)
def homepage():
return ‘ana sayfadasiniz’

“`

şeklinde kısa bir kodla, localhost çalışmaya başlamıştı.

 

Kendine göre işlemleri sonrası, Node.js’in için de benzer şekilde localhost’u görmek kolay.

Ancak işin için biraz daha detay girince Node.js’in çok da kullanıcı dostu olduğunu söyleyemeyeceğim. Ya da şöyle demek belki daha doğru sanki. “El yordamıyla, basit çıkarımlarla, bu şöyleyse şu da böyledir” diyerek tahminlerde bulunarak işlem yapmak Python Bottle/Flask ile gayet mümkünken, Node.js biraz daha nazlı sanki.

 

Mesela daha önceki

“`

@route(‘/:username’, method=’GET’)
def get_event(username):
kullanici = username.replace(‘:’,”)
yol = “https://steemitimages.com/u/” + kullanici +”/avatar/large”
# os.startfile(yol);
#url =”; #getir = requests.get(url); #gelen = getir.content ; print gelen

htm = ”'<!DOCTYPE html>
<html lang=”en”>
<head>
<script src=”https://code.jquery.com/jquery-3.2.1.min.js”></script>
<script src=”https://cdn.steemjs.com/lib/latest/steem.min.js”></script>
<script type=”text/javascript”>
function fillBlogEntries(username)
{
steem.api.getDiscussionsByBlog({tag: username, limit: 10}, function(err, blog)
{
var blogContainer = $(‘#blog’);
for (var i = 0; i < blog.length; i++)
{
blogContainer.append(‘<div><a target=”_blank” href=”https://steemit.com’ +
blog[i].url + ‘”>’+ blog[i].created + ‘ ‘ + blog[i].title + ‘</div></a>’);
}
});
} </script>
</head>
<body>
<img src=””’+yol+”'”><h3>Merhaba ”’+kullanici+ ”'</h3>
<div id=”blog”></div>
<script>fillBlogEntries(“”’+kullanici+ ”'”);</script>
</body>
</html>
”’
print htm
return htm

“`

kodlarıyla ulaşılan sonuca Node.js ile ulaşmak pek pratik olmuyor.

-Belki hiç yapılamıyor da olabilir bilemiyorum ama- Şu an bir dayanağım ve bilgim olmadan ÖNyargılı olarak kanaatim;
Arka planda bir video’dan kareler alıp, bunu siyah beyaz yaparak kullanıcıya döndürmek gibi bir işlemi Node.js ile yapmak ya da Node.js destekli bir web sayfasından robotik/elektronik bir devreye ulaşmak  için Python‘un 2-3 katı efor sarf etmek gerekir gibime geliyor.

İlerde ne olur bilmem ama hala Node.js’den elektrik alamıyorum