https://www.buraksenyurt.com/Burak Selim Şenyurt - Raspberry Pi2020-07-03T12:38:30+00:00Matematik Mühendisi Bir Bilgisayar Programcısının NotlarıBurak Selim SenyurtBlogEngine.Net Syndication Generatorhttps://www.buraksenyurt.com/opml.axdBurak Selim SenyurtMatematik Mühendisi Bir Bilgisayar Programcısının Notlarıtr-TRBurak Selim Şenyurt0.0000000.000000https://www.buraksenyurt.com/post/hey-raspi-gercekten-cok-guclu-bir-bilgisayara-ihtiyacim-var-miHey Raspi! Gerçekten Çok Güçlü Bir Bilgisayara İhtiyacım Var mı?2019-09-16T10:13:00+00:00bsenyurt<p><img style="float: right;" src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/raspbian_cover.jpeg" alt="" /></p>
<h2>1985 Yazı - Hikayenin Başladığı Yer</h2>
<p>Almanya’daki kuzenlerimden biri olan Haluk abi orta öğrenimi için dayımlar tarafından İstanbul’a gönderilmişti. Şu anda 94 yaşında olan anneannem ve rahmetli Hasan dedemin Barbaros mahallesindeki bahçeli evlerinin üst katında sokak tarafına bakan oturma odasında yaşıyordu. Benim ilkokul sıralarında olduğum zamanlardı. Rahmetli Ali dayım orta okul sınıf geçme hediyesi olarak Haluk abime üstünde Commodore 64 yazan bir bilgisayar almıştı. Vaktinin çoğunu resim yaparak ve 37 ekran renkli televizyona bağlanmış Commodore’unda oyun oynayarak geçiriyordu.</p>
<p>Çılgın pilot Murdock’lı A takımının, John Jay Rambo’nun, He-Man’in, “bir alışveriş bir fiş” ile KDV’nin, siyah okul önlüklerinin, şeytan Rıdvan gol kralı Tanju’nun olduğu dönemlerdi. Mahallenin bir kaç sokak ötesindeki toprak futbol sahasının yanındaki pasajda müzik kasetleri, plaklar ve VHS’ler satan küçük bir dükkan vardı. Commodore’un popülerleşmesiyle birlikte oyun kasetleri doldurmaya da başlamıştı. Bir kaset içinde onlarca oyun olabiliyordu. Summer Games, Green Beret, River Raid, 1942, PaperBoy, Hawkeye, Emlyn Hughes Soccer ve aklıma gelmeyen niceleri…</p>
<p>Hangi gün olduğunu hatırlamıyorum lakin akşam üstü vakitleriydi. Haluk abiyi camda bekliyordum. Beni pek oynatmazdı ama yanında oturup oynadığı oyunları izlememe izin verirdi. Yokuştan aşağıya doğru yürüdüğünü gördüm. Anneannemin lezzetini hiç unutamadığım o nefis reçellerine malzeme yaptığı rengarenk güllerle süslediği bahçenin kapısını açıp hızlı adımlarla girişe doğru ilerledi. Merdivenlerden üst kata ikişer ikişer çıktığını anlayabiliyordum. Nefes nefese kalmış bir şekilde odaya girdi ve “Yeni oyunlar çıkmış Burak!” dedi gülümseyerek.</p>
<p>Ama hemen oynayamazdık. İlk başta cihazın önceki oyunlar nedeniyle bozulan kafasının düzeltilmesi gerekiyordu. Commodore oyunları okumak için bir kasetçalar kullanıyordu. İçindeki kasetin bantına yazılı bitleri kullanarak bizlerin saatlerce Tv başında vakit geçirmesine neden olan bir eğlence makinesiydi.</p>
<p>Haluk abim saatçi tornavidasını kullanarak kasetçaların üstündeki vidayı sağa sola doğru birkaç kez oynattı. Ekranda sarhoş birisi gibi dolanan eğri büğrü çizgiler bu hareketlerle düz bir doğruya dönüşmeye başladı. Bu, kafa ayarının tamamlandığı anlamına geliyordu. Haluk abim oyun kasetini taktı ve Play tuşuna bastı. İlk oyun başladı. Ekranın alt tarafındaki uçak gemisinden kalkan ikinci dünya savaşına ait bir tayyare yukarı doğru ilerliyordu. Karşısına çıkan düşman uçaklarına ateş açıyor, aşağıdaki hedeflere bomba atıyor, Fuel yazan yerlerden geçerek yakıt takviyesi yapıyordu. Sonra vuruldu. Haluk abi tekrar başladı. Yanında çıt çıkarmadan heyecanla ekranı izliyordum. Joystick kolunu bir o tarafa bir bu tarafa sürükleyip duruyordu. Bu kez biraz daha ilerlemeyi başarmıştı ama yine vuruldu ve tekrar başladı. Tekrar, tekrar ve tekrar…</p>
<p>Dakikalar saatleri tamamlamaya başladı. Sırtımız sokağa dönük olduğundan kararan havanın farkına bile varamamıştık. Arada akşam ezanı ya da yatsı okunmuştu belki ama fark etmemiştik. Sokak sakinleri zaten çoktan evlerine çekilmişti. Zifiri karanlıkta TV ekranına bakıyorduk sadece. Derken kulağımda kısa süreli bir acı hissettim. Bir kaç yıl sonra bir atari salonunda oyun oynarken aynı acıyı tekrar hissedecektim :) Başımı şöyle bir geriye doğru kaldırırken onun tebessüm eden yüzüyle karşılaştığımda Haluk abi sanki oyunun içindeymiş gibi tam konsantre devam ediyordu. İkimizde rahmetli babamın ne odanın kapsını açışını ne arkamıza geçişini fark etmiştik. Belki bir kaç dakikadır tepemizde dikilmiş bekliyordu hatta. Meğer saatler gece yarısını çoktan geçmişti. Ufak bir çocuğun o saatte bilgisayar oyunu başında ne işi vardı!?</p>
<p>Nedense yıllarca o cihazın sadece 64 kilobyte kapasiteli bir bellek ile bizleri ekran başına saatlerce bağlayan oyunlarının nasıl geliştirildiğini düşünmemiştim. Günümüzde sahip olduğumuz bilgisayarları bir düşünün. Gigabyte’larca ram’i olan, çok çekirdekli, müthiş ekran kartlı makinelerimiz var. Quantum’un sınırlarında gezip yüksek hızlara ulaşarak bilimde çığır açacak gelişmelere imza atıyoruz. Peki gerçekten bir programcının ultra mega süper kuponlu bir bilgisayara sahip olması şart mı? Neden hep en iyisini arıyoruz?</p>
<h2>1993 - Üniversite 1nci Sınıf</h2>
<p>Y.T.Ü. Matematik Mühendisliği bölümüne girdiğim yıl programcı olmak istediğime karar vermiştim. İlk yılın birinci ve ikinci dönemi grafik özellikleri arttırılmış GWBasic dilini ders olarak alıyorduk. Kişisel bilgisayarım olmadığı için bir çok çalışmayı sadece belli saatlerde açık olan okul labaratuvarında yapmak zorundaydım. O yıl 286 işlemcili bilgisayarların matematiksel işlem birimi arttırılmış 386 modelleri ile değiştirilmesi söz konusuydu. Beş çeyreklikler yerini 1.44Mb’lık disketlere bırakıyordu. Açık gri renkteki bilgisayar kasalarında hard disk bulunmuyordu. Bu nedenle MS-DOS işletim sistemlerini hocamızın verdiği disketlerden yükleyerek sistemi açabiliyorduk<em>(Bu zamanın bootable USB’leri gibi düşünebilirsiniz)</em> Siyah beyaz tüplü monitörler üzerinde zaman içerisinde Pascal, Cobol, C, C++ gibi lisanları da denedik ama olmuyordu. Kişisel bilgisayarımın olması şarttı. Ne var ki dönemin fiyatları en az bugünkü kadar el yakıyordu.</p>
<p>İmdadıma Siemens’te çalışan eniştem yetişti. Geçici bir süre de olsa çalışmam için Siemens Nixdorf marka, elektronik daktilodan hallice çevrilmiş epey ağır bir laptop getirdi. Ağırlığı nedeniyle dambıl almama bile gerek yoktu. Siyah beyaz ekranı vardı ve üzerinde Windows 3.1 işletim sistemi koşuyordu. Tabii programlama bir yana üzerinde denediğim şeylerden birisi de Duke Nukem oynamaktı. Windows‘un üstünde kabuk olarak koştuğu çekirdek işletim sistemi MS-DOS ile çalışan bir oyundu. Siyah beyaz ekran o kadar geç tazeleme hızına sahipti ki karakteri koştururken arkada bıraktığı gölgeleri gri tonlu kareler halinde görebiliyordunuz. Biraz ağır olsa da bir laptop’un seyyarlığını tatma hissi en azından o yıllarda muhteşemdi.</p>
<p>Tabii bir süre sonra kendi kişisel bilgisayarıma kavuştum. 14 inç monitörü olan 486DX-33mhz işlemcili bir bilgisayar. 8Mb RAM’inin olduğunu hatırlıyorum. Ekranı şenlendiren 2 Mb’lık Diamond Stealth marka bir kartı ve muhteşem ses veren Creative 32bit işlemcisi vardı. Tabii kısa bir süre geçmesine rağmen disket sürücüleri hala kullanılıyor bununla birlikte CD’ler de yüksek kapasiteli depolama birimleri olarak boy gösteriyordu. Artık kasete oyun çeken pek yoktu ama disketlere programlar koyuluyordu. Meşhur Yazıcıoğlu işhanına gidip 21 disketten oluşan Delphi 2.0 kurulum paketini aldığımı daha dün gibi hatırlarım.</p>
<p>Delphi’nin bende ayır bir yeri vardır. İlk kez onunla yazdığımız ve oluklu mukavva üreticisi bir matbaa için geliştirdiğimiz programla para kazanmıştık. 90ların ikinci yarısında Amerika’dan Java isimi bir kitap getirtip bana “Burak! Gelecek bu. Web!” diyen sevgili Orkun ile birlikte 250 dolar kazanmıştık. Ben Taksim’deki Elit kitabevinden <a href="https://www.amazon.com/Delphi-2-Unleashed-Charles-Calvert/dp/0672308584/ref=sr_1_1?keywords=Delphi+2+Unleashed&qid=1568626752&s=books&sr=1-1" target="_blank">Delphi 2 Unleashed isimli 1400 sayfalık bir programlama kitab</a>ı alırken ileriyi gören Orkun 14.4 Kbps hızında bir modem alarak Ataköy’deki evinin odasından internete açılmıştı.</p>
<h2>1997 Şubatı - Compex Fuarı</h2>
<p>O yıllar ne kadar bilgisayar dergisi varsa alıp okumaktaydım. Yeni çıkan işlemcileri, Visual Basic ve Delphi tarafındaki gelişmeleri, Java’nın yükselişini, web teknolojilerinin hayatımıza girişini izliyordum. Üniversitedeki yakın arkadaşlarım bilgisayarlara olan merakımı biliyordu. Bu nedenle yeni bir bilgisayar toplayacakları zaman veya format atmaları gerektiğinde kapımı çalarlardı.</p>
<p>Efes’in alt yapısında yıllarca oynayıp Matematik Mühendisi olmaya karar vermiş 1.96lık sevgili Serkan’da en yakın dostlarımdandı. Abdi İpekçi’de birlikte maç izlediğimiz çok olmuştu ama senede bir bilgisayar fuarına da giderdik. Böylece gelişmeleri canlı canlı görebilirdik. Üstelik bazı firmalar bu fuarlarda indirimler uygulardı. Pentium işlemcilerin yeni serilerinin geldiği heyecanlı günlerdi. Moore yasası sürekli olarak işliyor işlemciler iki seneden daha kısa sürede transistor sayılarını katlayarak hızlanıyordu.</p>
<p>Compex o yıl ocak sonu şubat başı açılmıştı. Serkan, babası ve ben üçümüz birlikte Tepebaşı’nda açılan fuarın yolunu tuttuk. Davetiyelerimizi Pc World dergisinden kapmıştık. Serkan yeni bir bilgisayar almak istiyordu. Tabii ki baş danışman bendim :) Bir stand’tan diğerine gidiyor, broşürleri alıp modelleri inceliyorduk. Sonunda bir tanesinde karar kıldık. Doğruyu söylemek gerekirse fiyatlara da bakıyorduk. Modelin iki versiyonu vardı. Birisi 32 diğeri 64Mb Ram kapasiteliydi. Pek tabii bu devirde olduğu gibi iki katına çıkan Ram farkı bilgisayar fiyatını da epeyce etkliyordu. Ben Serkan’a 64Mb olanını almasını tavsiye ettim. Biraz çekingen halde ve tereddüt ederek babasına doğru döndü ve “Baba…32 Mb yerine 64 Mb olanı alalım” dedi. On yaşında oğlu olan bir baba olarak benim bugün vereceğim tepkinin bir benzerini 1997 kışında Serkan’ın babası verdi; “Sen önce bir 32liği doldur sonra 64lüğüne bakarız” :D</p>
<p>Bu hatıram beni hep güldürür ve durup düşünürüm :) Neden en yüksek konfigurasyona sahip bir bilgisayar toplama çabasındaydık. Bir programcı için ortam şartları büyük bir engel oluşturmamalıydı. Optimize edilmesi gereken bir şeyler varsa bunun yolunu kendisi bulmalıydı.</p>
<h2>2006 Sonbaharı</h2>
<p>O zamanlar büyük bir hevesle ve gönüllü olarak katıldığım topluluk çalışmalarım nedeniyle bir vakit benden savunma istemiş yazılım firmasından ayrıldığım günler. Çalıştığım süre boyunca şirketin bana verdiği IBM Thinkpad T41 model bilgisayarı kullanmıştım. Tabii geri vermek durumunda kalınca bir anda bilgisayarsız kaldım. Evdeyse hiç aşina olmadığım yeşil renkli, dış kapağının saydamlığı nedeniyle içi görünen 1998 model bir iMac G3 vardı. İnanılmaz estetik bir tasarımdı. Tüm Apple’lar da olduğu gibi.</p>
<p>Derken başına oturup onu açtım ve bir kaç arkadaşıma iş aradığıma dair mail atmak üzere harekete geçtim. Ne yazık ki orjinal mac klavyesinde @ sembolünü bir türlü bulamıyordum. Tarayıcı epey tuhaf gelmişti. Başka bir tarayıcıyı nasıl yükleyeceğimi bile bilmiyordum. Gerçekten yabancı topraklarda kalmıştım. Bir kaç gün öncesine kadar Microsoft’un .Net Framework 2.0 sürümü üzerinde C# 2.0 ile geliştirmeler yapmaya çalışan ben sudan çıkmış balık misali çaresiz hissediyordum.</p>
<p>Ancak bir kaç yıl önce yaptığım keskin Linux geçişine keşke o yıllarda cesaret etseydim demeden edemiyorum. Gerçekten güçlü bir Laptop, PC ve Windows işlerimi yapabilmem için şart mıydı?</p>
<h2>2019 Eylül - Günümüz</h2>
<p>Yaz başına kadar yaklaşık 8 yıl önce aldığım Dell marka bir laptop kullanıyordum. WestWorld olarak isimlendirdiğim alet Ubuntu’da koşuyordu. Son olarak 18.04 sürümüne çıkmıştım. 4 çekirdekli intel işlemci, 8 Gb RAM ve 250GB disk kapasitesi hayli hayli yetiyordu. Ekranı bir kaç yıl önce bozulduğundan harici monitör kullanıyordum. Performansı ile ilgili bir sorunum yoktu. Nitekim artık eskisi gibi her şeyi makineye yüklemeye çalışmıyordum. SQL Server’a mı ihtiyacım var? Neden ki? Pekala PostgreSQL’de de denemelerimi yapabilirim. Peki onu kurmak zorunda mıyım? Elbette hayır! Docker ne güne duruyor :) İlle de SQL gerekiyorsa peki? O zaman Azure’a uğrayabilirim. Ya IDE!? Her yeni laptop alındığında mutlak suretle Visual Studio’nun en kallavi sürümünü yüklemiyor muyuz? Haydi itiraf edin. Ultimate sürümlerini torrent’lerden bulup yüklüyorsunuz değil mi? Yanına SQL Server Management Studio…Office’in tam sürümü…Oysa ki Visual Studio Code açık kaynak platformlar için harika bir IDE. Office’i gerçekten kurmak gerekli mi? Üstelik Office 365 varken ve dokümanlarımıza online olarak her yerden ulaşabiliyorken?</p>
<p>Ama işte WestWorld’ün o pancar motoru misali gürültülü fan sesi yok muydu? Müzik dinlemeden çalıştığım sessiz gecelerimin keyfini kaçırıyordu. Yıllar geçtikçe daha fazla zorlanmaya başlamıştı. Soğutucular deniyor, ara ara salon süpürgesi ile tozlarını çekiyor, Ubuntu’nun process’lerini kontrol edip sistemi yoranları ayıklamaya çalışıyordum. Yine de olmuyordu. Elim yeni bir bilgisayar almaya da gitmiyordu. Fiyatlar gerçekten yüksek. Her zaman böyleydi belki de ama dövizdeki artış, okul taksidi, basketbol ayakkabısı derken hep geriye atmak zorunda kaldığım bir maliyetti.<br />Sonra günlerden bir gün bütçeyi bir nebze olsun ayarlamayı başardım. İyi bir indirime giren Macbook Mini modelini bir süredir kovalıyordum. Ahch-to adını vereceğim aletin fiyatı 3K’nın altına düşmüştü. Monitorüm zaten olduğu için Mini PC tadında isteklerimi karşılayacaktı. Üstelik uzun zamandır üzerinde geliştirme yapmayı merak ettiğim macOS işletim sistemini de deneyimleme fırsatı bulacaktım. Bu kez Ubuntu çalışmalarından dolayı terminal penceresine biraz daha aşinaydım ve cesaretim vardı.</p>
<p>Yine de ortada ufak bir pürüz vardı. 4Gb Ram…Gözüme epey az gelmişti. Şirketin verdiği 16Gb RAM’li intel Core i7 Pro işlemcili alet bile bazı durumlarda takılabiliyordu. Baktığım mininin 8Gb olan modelindeki intel işlemcisi de daha iyiydi. Ama fiyat neredeyse %60 oranında fazlalaşıyordu. Sonunda bilgisayarı aldım. İlk kurulumlarımı yaptım. Visual Studio Code, xCode, git, Node.Js, docker ve daha bir sürü şeyi üzerinde denemeye başladım. Ancak korktuğum başıma gelmişti. Ubuntu’dan bile yavaştı sistem. Reaksiyon süresi çok düşüktü. Chrome tab’ları can çekiştiği için terk edip Safari’ye dönmüştüm ama pek bir şey değişmemişti. Her nedense makine açıldıktan çok uzun süre sonra kendini toplamaya başlıyor, tabir yerinde ise t anında sadece bir işe odaklanarak nefes alabiliyordu. “Keşke” dedim yine. Keşke diğer modeli alsaydım. Güçlü olanı. Daha pahalıydı belki de ama performansı iyi olacaktı.</p>
<p>Sonra düşünmeye başladım. Neden en iyisi gerekiyordu programlama yapmam için. Merak ettiğim şeyler arasında kullanacaklarımı pekala bulutta konumlandırabilirdim. Performans maliyeti yüksek IDE’lere gereksinimim yoktu gerçekten de. Ama içime bir huzursuzluk düşmüştü.</p>
<p>Bunun üzerine ucuz maliyetli Raspberry Pi 3B+ almaya karar verdim. 1 Gb Ram’i olan cihazın üzerinde Debian tabanlı Raspbian sürümünü kullanacaktım. 16 Gb’lık bir MicroSD kartı bootable disk olarak hazırladım. Ufacık entegrenin hard diski yoktu ama WiFi ile internete bağlanabiliyordu. Daha ilk gece üstünde bir çok şey yapmış, sadeliğine, sessizliğine ve minimal gereksinimlerine hayran kalmıştım. Şimdilik…</p>
<blockquote>
<p><a href="https://ubuntu-mate.org/blog/ubuntu-mate-bionic-beta1-raspberry-pi/" target="_blank">Şu adresten öğrendiğim kadarıyla</a> Ubuntu Mate sürümünün en azından beta olarak Raspberry Pi 2,3 modellerine kurulumuna ait bir paylaşım var. Diğer yandan <a href="https://www.fossmint.com/operating-systems-for-raspberry-pi/" target="_blank">2019 tarihli bu yazıya göre</a> Ubuntu ile sınırlı değiliz. Bir çok işletim sistemini Raspberry Pi üzerinde kullanmamız mümkün. Windows IoT Core ve Ubuntu Core’da bunlara dahil.</p>
<p><a href="https://www.forbes.com/sites/jasonevangelho/2019/07/01/confirmed-ubuntu-mate-is-coming-to-the-raspberry-pi-4/#51296f2b9b4d" target="_blank">Forbes’un bir haberine göre</a> Ubuntu Mate’in Raspberry Pi 4'ü destekleyeceği ifade edilse de resmi olarak buna dair bir doğrulama en azından yazıyı hazırladığım tarih itibariyle yoktu. Sadece Estimated Time of Arrival konsepti ile üzerinde çalışıldığına dair söylemler var. Sanırım bu desteğin gelip gelmeyeceğini zaman içerisinde öğreneceğiz.</p>
</blockquote>
<h2>Raspbian’da Bir Gece…</h2>
<p>Artık bir şeyleri kurmaya çalışıp, programlama ortamını hazırlamak üzere harekete geçebilirdim. Saat 22yi geçmişti. S(h)arp Efe ve üst kattaki gürültücü velet çoktan uykuya dalmıştı. Mahalle sakinleşmiş ve çalışma odam tam olarak istediğim sessizliğe gelmişti. Arkamdaki kütüphanenin üst rafına kaldırdığım emektar WestWorld’e göz ucuyla şöyle bir baktım ve tebessümle “Umarım tatilin iyi geçiyordur” diyerek klavyeme döndüm. Planladığım belli bir yol haritası yoktu. Doğaçlama gidecektim. Öncelikle Raspbian diyarında neler var ne yok bakayım dedim. Aklıma ilk önce Raspberry Pi’ler ile özdeşleşen Python ortamı geldi.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/masa.jpg" alt="" /></p>
<p>Raspbian üzerinde Python 2 ve 3 sürümleri ile pip paket yöneticisi zaten yüklü olarak geliyor ama benim Node.js ve npm ile yapacağım çalışmalar da var. Lakin bazı ürünlerin doğru sürümlerini yükleyebilmek ya da desteklerinin olup olmadığını görmek için ARM işlemcisinin versiyonunu öğrenmem gerekmişti. Bunun için şu terminal komutunu kullanarak çalışmalarıma başladım.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">uname -m</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/shot_1.png" alt="" /></p>
<p>Sonra aşağıdaki komutlarla nodejs’i sisteme yükledim. Beraberinde npm paket yöneticisi de geldi tabi.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">curl -sL https://deb.nodesource.com/setup_10.x | sudo bash -
sudo apt install nodejs
node — version
npm — version</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/shot_2.png" alt="" /></p>
<p>İşte elimin altında nodejs. Rastgele aklıma gelen enstrümaları toplamaya devam ettim. Mesela şunu merak ediyordum; Raspbian üzerinde PostgreSQL’in Docker Container’ını çalıştıramaz mıydım? Hani kendi başına çalışan hafif bir microservice konuşlandıracağım bir sürü Raspberry cihazımız olur mu hayalinden yola çıkarak<em>(Hatta çalıştığım firmadaki bazı yeni nesil ürünlerin SQL Server’dan PostgreSQL platformuna göçü için yapılan çalışmaları düşünerek)</em> Öncesinde Docker bu sistemde çalışır mı bunu öğrenmem gerekiyordu. Bunun üzerine terminali aşağıdaki komutlarla şenlendirdim.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo docker container run hello-world</pre>
<p>Tabii container’ın başarılı bir şekilde çalıştığını görünce SD kartın çabucak dolmasından endişe edip başlatılan container’lar ile imajı silmeyi de ihmal etmedim. Savurganlığın lüzumu yoktu :)</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo docker container ls -a
sudo docker container rm f7db1b 354818
sudo docker image ls
sudo docker image rm 618e43</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/shot_3.png" alt="" /></p>
<p>Pek tabii bir Container’ı ayağa kaldırmış olmak iştahımın daha da artmasına neden oldu. Bunun üzerine PostgreSQL imajını yükleyeyim ve iki SQL sorgusu çalıştırayım dedim.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo docker run -d — name c_postgres -v London:/var/lib/postgresql/data -p 54321:5432 postgres:11
sudo docker exec -it c_postgres psql -U postgres
CREATE DATABASE AdventureWorks;
CREATE TABLE IF NOT EXISTS Category (CategoryId SERIAL PRIMARY KEY,Name varchar);
INSERT INTO Category (Name) VALUES (‘Book’);
INSERT INTO Category (Name) VALUES (‘Movie’);
SELECT * FROM Category;</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/shot_4.png" alt="" /></p>
<p>Veritabanı oluşturabildiğimi, kayıt atıp çekebildiğimi görünce epey mutlu oldum. Çalışmalarım sırasında ihtiyacım olabilecek veri depoları için PostgreSQL’i burada deneyimleyebilirim<em>(Hatta SQLite gibi sürümleri de denesem gayet iyi olur)</em></p>
<p>Daha neleri kontrol edebilirim diye düşünürken asıl göz ağrım .Net Core’a ayrı bir sayfa açmam gerektiğini fark ettim. Nitekim C# programlama dilini ve .Net Core platformunu deneyimleyeceğim bir ortam olması önemliydi. Biraz araştırma yaptıktan sonra ARM sürümü için <a href="https://dotnet.microsoft.com/download/thank-you/dotnet-sdk-2.2.401-linux-arm32-binaries" target="_blank">Microsoft’un şu adresindeki kaynak</a>tan yararlanarak Raspbian üzerine .Net Core SDK 2.2 versiyonunu yükleyebildim. Tabi güncel .Net Core sürümlerinden hangilerinin hayatta kaldığına ara ara bakmakta yarar var. Özellikle ürünleştirilmiş sürümlerimiz varsa bu önemli bir nokta. <a href="https://dotnet.microsoft.com/download/dotnet-core" target="_blank">Microsoft’un şu adresindeki görsel imgeler</a> iyi birer yardımcı.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/shot_6.png" alt="" /></p>
<p>Gerekli kurulumun ardından basit bir Console uygulaması oluşturup denemem yeterliydi. Henüz Visual Studio Code editörü yüklenebiliyor mu bilmiyordum ama Program.cs içeriğini düzenlemek için Raspbian ile gelen Geany pekala kafiydi.</p>
<p>Gerçi Visual Studio Code’un açık kaynak olarak Raspberry Pi için genişletilmiş code-oss isimli bir versiyonunu <a href="https://pimylifeup.com/raspberry-pi-visual-studio-code/" target="_blank">şu adresten indirip</a> kısa süre kullandım. Ancak yorumlarda da belirtilen blank screen probleminin çözümü için update’leri kapatmak zorunda kalmak beni biraz rahatsız etti. Belki ilerde işlemcinin armhf sürümü için tam Visual Studio Code desteği gelir.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">dotnet new console -o hello-from-pi</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/shot_5.png" alt="" /></p>
<p>Şu an için tek sıkıntı uygulamanın çalışmasının çok yavaş olması. Basit bir Hello World uygulaması için dotnet run komutunun epey beklettiğini fark ettim. Henüz bunun sebebini anlayamadım. Belki ve muhtemelen ARM işlemcisinden kaynaklı lakin bu canımı sıkan bir durum değil. Çünkü çıt çıkartmayan ve ceket cebime koyup istediğim yere götürebileceğim bir bilgisayarım var :) <em>(Gittiğim yerde HDMI girişli bir monitor/tv, klavye ve mouse olması şartıyla tabii)</em></p>
<blockquote>
<p>Tipik bir desktop kullanıcısının başlangıçta yadırgayacağı tek şey varsayılan olarak Raspberry Pi’nin Açma/Kapama düğmesine sahip olmayışıdır. İlk gece işletim sistemini bir kaç sefer kitleyince güç kablosunu çıkartıp tekrar takarak ilkel bir şey yaptığımı da düşündüm aslında. Fakat buna çok takılmadım. Yine de <a href="https://howchoo.com/g/mwnlytk3zmm/how-to-add-a-power-button-to-your-raspberry-pi" target="_blank">şu adresteki yönergeleri takip ederek</a> güç düğmesi entegre edilebileceğini öğrendim. Yanlışlıkla mavi kabloyu keserek devrenin patlamasından korkanlar dükkandan hazır anahtar modülü alıp bağlayabilir de ;)</p>
</blockquote>
<p>Pek tabii merak ettiğim ve denemek istediğim bir çok konu var. Git<em>(Raspbian ile yüklü geliyor)</em> komut satırı aracı ile GitHub projelerine bağlanmak, cihazı NGinX veya Apache sunucusu olarak kurgulayıp web servisi hizmeti sunacak şekilde ayağa kaldırmak, Erlang dilini öğrenmek<em>(ki sorunsuz bir şekilde sisteme kuruldu ve hello world uygulaması çalıştırılabildi — bknz aşağıdaki resim)</em>, Flutter çatısının platform üzerinde kullanılıp kullanılamayacağına bakmak, <a href="https://cloud.google.com/compute/docs/quickstart-linux" target="_blank">Google Cloud Platform öğretilerini takip ederek</a> bulut tabanlı temel geliştirici operasyonlarını Raspi ile birlikte denemek<em>(gCloud CLI)</em> ve benzerleri…</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2019/09/shot_7.png" alt="" /></p>
<p>Aslında Raspberry Pi’yi bir IoT cihazı gibi kullanmaktansa düşük maliyetli ve programlama deneyimi yaşayabileceğim bir araç olarak ele almak şu anki hedeflerimden birisi. En nihayetinde üzerinde gelen Scratch ile çocuklara temel programlama deneyimini de yaşatıyor ki ben hala büyümedim.</p>
<h2>Bir Öğle Arası…Şekerpınar</h2>
<p>Gerçekten de programlama yapmak için çok güçlü bir makineye ihtiyacım var mı? Yeni bir maceraya atılmış gibi hissediyorum. Bazen teknolojinin baş döndürücü gelişmesine kızsam da yeni ufuklara yelken açmamıza olanak sağladığı için hevesleniyorum. Oldukça minimal bir cihaz üzerinde programlama öğrenmeye çalışmak…Motivasyonum tam olarak bu. Piyasadaki bilgisayarlara nazaran çok düşük maliyetli bu minion pc için elde edeceğim deneyime göre 128 Gb Micro SD karta geçmeyi bile düşünebilirim. Hatta <a href="https://www.raspberrypi.org/products/raspberry-pi-4-model-b/specifications/" target="_blank">4Gb Ram kapasiteli Raspberry Pi 4 sürümü</a> maliyet bazında ciddi olarak düşünülebilir ki PC’lere hafif bir alternatif olarak ön plana çıkmakta<em>(<a href="https://www.androidcentral.com/raspberry-pi-4-vs-raspberry-pi-3" target="_blank">Şuradaki karşılaştırma</a> konu hakkında fikir verebilir)</em> Aradığım sorunun cevabını ancak bu şekilde bulabileceğime inanıyorum. Tabii şu önemli parametreyi de unutmamak lazım; Bu karışımı üretim ortamları haricinde yazılım geliştirme adına bir şeyleri öğrenmek için kurcalayacağım deneysel bir çalışma sahası olarak görüyorum. ARM işlemcisi bazı geliştirme platformlarınca desteklenmiyor olsa dahi…</p>2019-09-16T10:13:00+00:00raspberry piraspbianlinuxprogrammingcommodore 64nodejspythondotnetcorepostgresql80ler90lar2000lerbsenyurtAlmanya’daki kuzenlerimden biri olan Haluk abi orta öğrenimi için dayımlar tarafından İstanbul’a gönderilmişti. Şu anda 94 yaşında olan anneannem ve rahmetli Hasan dedemin Barbaros mahallesindeki bahçeli evlerinin üst katında sokak tarafına bakan oturma odasında yaşıyordu. Benim ilkokul sıralarında olduğum zamanlardı. Rahmetli Ali dayım orta okul sınıf geçme hediyesi olarak Haluk abime üstünde Commodore 64 yazan bir bilgisayar almıştı. Vaktinin çoğunu resim yaparak ve 37 ekran renkli televizyona bağlanmış Commodore’unda oyun oynayarak geçiriyordu.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=f134972d-e7e2-4a91-9a61-460e28c76bae6https://www.buraksenyurt.com/trackback.axd?id=f134972d-e7e2-4a91-9a61-460e28c76baehttps://www.buraksenyurt.com/post/hey-raspi-gercekten-cok-guclu-bir-bilgisayara-ihtiyacim-var-mi#commenthttps://www.buraksenyurt.com/syndication.axd?post=f134972d-e7e2-4a91-9a61-460e28c76baehttps://www.buraksenyurt.com/post/raspberry-pi-maceramizda-bu-bolum-tekerlegi-dondurdukRaspberry Pi Maceramızda Bu Bölüm - Tekerleği Döndürdük2016-08-06T21:01:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Uzun bir tatil molasının ardından tekrar birlikteyiz. Sevgili <a href="http://www.recepduman.net/" target="_blank">Recep Duman</a> hocam <strong>RaspiRobot</strong> <strong>Shiled</strong>' ını kullanarak bir <strong>Servo Motora</strong> ait tekerleği ileri yönlü döndürüp durdurmayı başardı. Üstelik <strong>Raspberry Pi</strong>, <strong>RaspiRobot</strong> ve <strong>Servo Motor</strong> için sadece <strong>9 Volt</strong>'luk güç kaynağı ile. Söyleşimizde farklı konulara da değinmeye çalıştık ancak ağırlıklı olarak <strong>Servo Motor</strong> üzerinde durduk. İyi seyriler dilerim.</p>
<p><iframe src="https://www.youtube.com/embed/Xscx6RkuLoA" width="640" height="360" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Söyleşi sırasında bahsettiğimiz kaynaklar ise şöyle.</p>
<p><a href="https://www.monkmakes.com/rrb3/" target="_blank">Monk Makes</a> </p>
<p><a href="https://github.com/simonmonk/raspirobotboard3" target="_blank">Simon Monk'a Ait RaspiRobot GitHub Adresi</a> </p>
<p><a href="http://www.elektrikport.com/teknik-kutuphane/step-ve-servo-motorlar/14750#ad-image-0" target="_blank">Serve ve Step Motor arasındaki farklar ile ilişkili bir yazı</a></p>
<p>Bir sonraki söyleşimizde görüşmek dileğiyle hepinize mutlu günler dilerim.</p>2016-08-06T21:01:00+00:00raspirobotraspberry pipythonservo motorIoTInternet of ThingsbsenyurtUzun bir tatil molasının ardından tekrar birlikteyiz. Sevgili Recep Duman hocam RaspiRobot Shiled' ını kullanarak bir Servo Motora ait tekerleği ileri yönlü döndürüp durdurmayı başardı. Üstelik Raspberry Pi, RaspiRobot ve Servo Motor için sadece 9 Volt'luk güç kaynağı ile. Söyleşimizde farklı konulara da değinmeye çalıştık ancak ağırlıklı olarak Servo Motor üzerinde durduk. İyi seyriler dilerim.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=3c54083a-3991-41f6-be9c-a4faa9482e673https://www.buraksenyurt.com/trackback.axd?id=3c54083a-3991-41f6-be9c-a4faa9482e67https://www.buraksenyurt.com/post/raspberry-pi-maceramizda-bu-bolum-tekerlegi-dondurduk#commenthttps://www.buraksenyurt.com/syndication.axd?post=3c54083a-3991-41f6-be9c-a4faa9482e67https://www.buraksenyurt.com/post/raspberry-pi-ve-python-calisma-notlarimRaspberry PI Derken Oluşan Python Çalışma Notlarım2016-07-18T21:30:00+00:00bsenyurt<p><img style="float: right;" src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/RaspiCover.gif" alt="" />Merhaba Arkadaşlar,</p>
<p>Bloğumu takip edenler bu yaz için <strong>Raspberry PI</strong> ve <strong>Python</strong> programlama diline merak saldığımı biliyordur. Bu merakımı boşa çıkarmamak için de vakit buldukça her iki konuya da çalışıyorum. İş yoğunluğu ve araya giren bayram tatili beni az da olsa geriye atmış durumda. Ama neyseki defterime aldığım renkli renkli notlarım var<em>.</em></p>
<p>Bu yüzden notlarımın üstünden geçmem öğrendiklerimi hatırlamamda epey yardımcı oldu. Notları renklendirmiş olmam da onları okurken sıkılmamamı ve hatta yer yer kendi kendime tebessüm etmemi sağladı. Yazdıklarımın üzerinden geçerken bunları bloğuma da koyayım ve benim gibi temel seviyede bu işe başlayan, elektronik'ten, <strong>Linux</strong>' den ve <strong>Python</strong>' dan bihaber olanlarla bir şeyler paylaşayım istedim. </p>
<p><strong>Raspberry PI</strong> ve <strong>Python</strong> maceramda sevgili <a href="http://www.recepduman.net/" target="_blank">Recep Duman</a> hocamın da yardımları var. Onun yol göstericiliğinde ilerlemeye çalışıyorum. Örneğin birlikte Karaköy' deki elektronikçilere gidip gerekli malzemeleri aldık. Ayrıca takip ettiğim iki kitap var. </p>
<p><a href="http://www.idefix.com/Kitap/Raspberry-Pi/Guray-Yildirim/Egitim-Basvuru/Bilgisayar/urunno=0000000681261" target="_blank"><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/book1a.gif" alt="" /></a> <a href="http://www.idefix.com/Kitap/Yeni-Baslayanlar-Icin-Python/Ahmet-Aksoy/Egitim-Basvuru/Ders-Kitaplari/Teknik-Ders-Kitaplari/urunno=0000000694609" target="_blank"><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/book2a.gif" alt="" /></a></p>
<p>Bu kitapları da şiddetle tavsiye ederim. Orta seviyeye kadar <strong>Raspberry PI</strong> ve <strong>Python</strong> ile donanmamızı sağlayacak değerli kaynaklar. Öyleyse vakit kaybetmeden notlarımızın üzerinden bir geçelim.</p>
<h2>Temel Terminal Komutları [8 Haziran 2016]</h2>
<p>İlk olarak kullanmakta olduğum Raspberry PI kartı üzerinde <strong>Raspbian</strong> işletim sisteminin yüklü olduğunu belirteyim. Kurulum sonrası varsayılan kullanıcı adının <strong>pi</strong> ve şifrenin de <strong>raspberry</strong> olduğunu öğrendim. İlk yaptığım işlerden birisi kullanıcı şifresini değiştirmek oldu. <span style="line-height: 1.8;">Bugünü aşağıda kısa açıklamaları yer alan temel terminal komutlarını inceleyerek geçirmişim.</span></p>
<ul>
<li>ls - Dizin ve dosyaları listelemek içindir</li>
<li>cd .. - Bir üst klasöre çıkarız</li>
<li>mkdir - Klasör oluşturmak için kullanılır</li>
<li>pwd - Print Working Directory'nin kısaltmasıdır. Bulunduğumuz konum bilgisini verir.</li>
<li>clear - Kalabalıklaştıktan sonra terminal ekranının temizlemek için kullanabiliriz. Hayatımızda yeni bir sayfa açar gibi.</li>
<li>whoami - O an sistemde çalışmakta olan kullanıcının adını öğrenmemizi sağlar.</li>
<li>rmdir - Klasör veya dosya silmek içindir.</li>
<li>touch - İçeriği boş bir dosya oluşturmamızı sağlar.</li>
<li>rm - Sadece dosya silmek için kullanılır.</li>
<li>nano - Terminal üzerinden kullanılan bir metin editörüdür. Beni MS-DOS zamanlarına götürmüştür. Merak edip örnek kullanımını da not almışım. -sudo nano HelloWorld.rb ile Ruby kod dosyası açmışım.</li>
<li>cat, more, less - Dosya içeriklerini görmek için kullanılan komutlardır.</li>
<li>df - Sistemdeki diskleri ve boş alan boyutlarını gösterir. Alan boyutlarının daha rahat okunabilmesi için genellikle -h parametresi ile kullanılır.</li>
<li>file - Dosya veya dizinlerin türleri hakkında bilgi edinmemizi sağlar.</li>
<li>history - Terminalde son kullandığımız komutların neler olduğuna bakmak istersek kullanabiliriz.</li>
<li>--help - Bir komutun kullanımı hakkında bilgi verir.</li>
<li>man [Komut Adı] - Bu ise ilgili komut hakkındaki yardım dokümanına ulaşmamızı sağlar.</li>
<li>apt-get - Bu komutu sistemi güncellemek ve uygulama yüklemek için kullanabiliriz. Örnek olarak VLC isimli bir media player yüklemişim ama bunu yapmadan önce sistemi de güncellemişim<em>(sudo komutunu var olan kullanıcı bir takım operasyonları yerine getirirken Permision Denied hatası almasın diye kullanmaktayız)</em><br /><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/firstDay.gif" alt="" /></li>
</ul>
<p>Bu komutları terminal ekranında biraz denemişim. Hatta Raspberry PI'ye uzaktan bağlanmak için de bir şeyler yapmışım. Siz de bunu yapmak isterseniz öncelikle Raspberry PI'yi Internete bağlayıp yerel ağ için verilen <strong>IP</strong> adresini öğrenmeniz gerekir. Bunun için terminalden</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">hostname -I</pre>
<p>komutunu çalıştırmanız yeterli<em>(Bana <strong>192.168.1.107</strong> gibi bir adres dönmüş o gün)</em>Sonrasında uzak bir bilgisayardan <strong>Secure Shell</strong> bağlantısı kurabiliriz. Bu bağlantı için yardımcı programlar kullanabileceğimiz gibi uzak bilgisayar terminalinden ssh komutu vererek de bağlanmayı deneyebiliriz.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">ssh pi@192.168.1.107 </pre>
<p>gibi. Burada <strong>pi</strong> raspberry pi bilgisayarına hangi kullanıcı ile bağlanmak istediğimizi berlitmektedir.</p>
<p>Rasbian'ın konfigurasyon ayarlarını değiştirmek için terminal ekranından <strong>sudo raspi-config</strong> komutunu kullanabiliriz.</p>
<blockquote>
<p>Raspberry PI üzerinde Ruby ile geliştirme yapan <a href="http://rayhightower.com/" target="_blank">Ray Hightower</a> , 2012 yılında Raspberry PI'sini 37 Ekran bir TV'ye bağlamış. Hatta halen bu analog TV'yi kullandığını ifade etmekte. Bu bana Commodore 64 oyun bilgisayarımı ve onu bağladığım 37 ekran televizyonumu hatırlattı. İlk gün aldığım ilginç notlardan birisi.</p>
</blockquote>
<h2>Temel Python ile Geçen Bir Perşembe [9 Haziran 2016]</h2>
<p>Bir sonraki gün temel Python çalışmaları ile geçmiş(<em>Sanırım elektronikden dil kısmına doğru kaymaya karar vermişim)</em> İşe terminalden <strong>python</strong> komutunu vererek başlayabiliriz. Bu durumda python kodlarını yazabileceğimiz ortama girmiş oluruz. Ortamdan çıkmak için yine komut satırından <strong>exit()</strong> ifadesini girebilir veya <strong>Ctrl+D</strong> kısa yol kombinasyonunu kullanabiliriz. Gelelim ilk gün yaptığım basit örneklere<em>(Bunları makaleye geçirirken yine <a href="https://repl.it/languages/python3" target="_blank">Repl.it</a> üzerinden denedim ve doğru çalıştıklarından emin oldum)</em></p>
<p>Tabii giriş kısmında bir Merhaba demek gerekiyordu.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">print("Hello Python and Raspbbery PI")
myAge=39
myName="Burak"
print("My name is {} and I'am {} years old.\nAnd Pi*(R^2)={}".format(myName,myAge,3.14*10*10))</pre>
<p>İlk olarak <strong>print</strong> komutu ile ekrana bir metin içeriği yazdırıyoruz. Devam eden satırlarda ise myAge ve myName isimli iki değişken tanımı söz konusu. Son <strong>print</strong> ifadesinde süslü parantezler içerisinde bu değişkenleri yazdırıyor, <strong>\n</strong> ile bir alt satıra geçiş işlemini gerçekleştiriyoruz<em>(\ ile escape karakter kullanımının söz konusu olduğunu ifade edebiliriz)</em> Süslü parantezler içerisine gelecek ifadeler için format metodundan faydalanmaktayız. İlk süslü paranteze myName, ikinci süslü paranteze myAge son süslü paranteze ise matematiksel bir işlemin sonucu gelmekte.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_1.gif" alt="" /></p>
<p>Bu girişten sonra Python dilinin temel veri türlerinden olan listelere göz atmışım.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">players=["burki","tubi","sharpi","reco","tusubasa"]
print(players)
print(players[2])
players.append("anduin")
print(players)
players.remove("burki")
print(players)
motto="Today is a good day to die"
print("good" in motto)
points=[30,21.50,90,15,18.5,45,3,3.14,0,-4,-2,(90*-3)]
print(points)
points.sort()
print(points)
points.sort(reverse=True)
print(points)
someObjects=[1,-1,"burk",True,90.345,900000055555555555000000000000000015]
print(someObjects)</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_3.gif" alt="" /></p>
<p>Belli tipte veya farklı türlerede elemanları tutmak için listelerden yararlanabiliriz. Listenin elemanlarına ulaşmak için <strong>[]</strong> operatörü kullanılır. <strong>Pop</strong> metodu ile son eklenen eleman listeden çekilir ve ayrıca silinir<em>(ki burada denemeyi unutmuşum ama siz deneyebilirsiniz)</em> Listeden eleman çıkartmak içinse <strong>remove</strong> fonksiyonu kullanılır. Faydalı fonksiyonlardan birisi de <strong>sort</strong>. Karışık bir listenin <strong>ascending</strong> veya <strong>descending</strong> sıralanmasını sağlar. Descending sırlama için <strong>reverse</strong> parametresine <strong>True</strong> değeri verilmesi yeterlidir. O gün hoşuma giden kullanımlardan birisi de, bir öğenin listede olup olmadığının bulunması olmuş.<strong> "good" in motto</strong> ifadesine göre good kelimesi motto değişkeni ile işaret edilen metinde geçiyorsa <strong>True</strong> geçmiyorsa <strong>False</strong> sonucu elde edilir. </p>
<blockquote>
<p>Defterde reverse=true şeklinde yazdıktan sonra Python'un case-sensitive bir dil olduğunu not almışım.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_2.gif" alt="" /></p>
</blockquote>
<p>Notlarım döngüler ve range kullanımı ile devam etmiş. Epey verimli bir haziran günü geçirmişim.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">players=["burki","tubi","sharpi","reco","tusubasa"]
for player in players:
print(player,"is online now")
numbers1=range(11) #0dan 10a kadar bir sayı aralığıdır
total=0
for number in numbers1:
total+=number
print(total)
numbers2=range(-25,0,5)
for number in numbers2:
print(number)</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_4.gif" alt="" /></p>
<p><strong>range</strong> veri türü ile belirli aralıklardaki sayı dizilerini kolayca tanımlayabiliriz. Hatta bu tanımlamalarda adım değeri de verebiliriz. Örneğin <strong>-25'den -5e kadar olan sayıları 5er adım aralıkla elde edebiliriz</strong>. <strong>for</strong> döngüleri ile <strong>range</strong> ve <strong>list</strong> veri türleri üzerinde dolaşarak belli işlemler gerçekleştirmemiz de mümkün. Belli bir değer aralığındaki sayıların toplamını bulmak, oyuncu listesini ekrana yazdırmak örnek kod parçasında yer verilen işlemlerdir.</p>
<blockquote>
<p>Python girinti(indent) kuralları barındıran bir dildir. Bir döngünün<em>(bir metodun, if ifadesinin vb)</em> alt satırlarına inildiğinde girinti verilmesi zorunludur diye de not almışım.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_5.gif" alt="" /></p>
</blockquote>
<p>Bu arada o günkü kod örneklerini dosyalarda bulundurmaya başlamışım. <strong>Python</strong> kod dosyaları için <strong>py</strong> uzantısı kullanılmakta. Eğer bir <strong>python</strong> dosyasını terminalden çalıştırmak istersek aynen <strong>Ruby</strong> dilinden olduğu gibi bir komut kullanmamız yeterli. Örneğin </p>
<p>python HelloWorld.py</p>
<p>gibi.</p>
<blockquote>
<p>Bugüne ait önemli notlardan birisi de sistemde yüklü iki farklı Python sürümü olması. Python 2.7.9 ve Python 3.4.2. Bunlar arasında belirgin farklılıklar var. Bu farklılıkları araştırırken <a href="http://sebastianraschka.com/Articles/2014_python_2_3_key_diff.html" target="_blank">şu blog adresinden</a> yararlanmışım.</p>
</blockquote>
<p>Kod çalışmasına metod tanımlamaları ile devam etmişim. E onlar olmadan olmaz tabii.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">players=["burki","tubi","sharpi","reco","tusubasa"]
def writeAllPlayers():
for player in players:
print(player,"is online now")
def rangeSum(x,y):
numbers=range(x,y)
total=0
for n in numbers:
total+=n
return total
writeAllPlayers()
result=rangeSum(0,11)
print(result)</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_6.gif" alt="" /></p>
<p>Örnek kod parçasında iki metod yer alıyor. <strong>writeAllPlayers</strong> isimli fonksiyonumuz <strong>players</strong> listesindeki elemanları ekrana yazdırmakta. <strong>rangeSum</strong> metodu ise <strong>x,y</strong> parametrelerini kullanarak bir <strong>range</strong> oluşturmakta ve bu değer aralığındaki sayıların toplamını hesap ederek geri döndürmekte. Bu basit metod kullanımlarını inceledikten sonra o haziran günü yaptığım çalışmaları tamamlamışım.</p>
<h2>Modules ve pip [10 Haziran 2016]</h2>
<p>O Cuma günü module kavramını incelmeye çalışmışım. Aslında aldığım notlara göre sadece <strong>random</strong> modülünü kod içerisinde kullanmışım. <strong>Module</strong>' leri kod parçaları içeren ayrık dosyalar olarak düşünebiliriz. <strong>Module</strong>' ler genellikle aynı domain'e özgü fonksiyonellikleri barındırır. Söz gelimi rastgele sayı üretimi ile ilişkili tüm operasyonlar <strong>random</strong> modülünde toplanmıştır. Modüller içerisinde çeşitli veri türleri ve fonksiyonellikler bulunur. Bir modül içerisinde hangi üyelerin olduğunu görmek için <strong>dir</strong> metodundan yararlanabiliriz.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">import random
print("random içeriği",dir(random),"\n")
print("shuffle içeriği",dir(random.shuffle),"\n")</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_7.gif" alt="" /></p>
<p>Örnek kod parçasında <strong>random</strong> modülünün ve bu modüldeki <strong>shuffle</strong> operasyonunun üyeleri listlenmektedir. Eğer istersek bu üyelerin yardım dokümanlarına da ulaşabiliriz. Bunun için <strong>help(random)</strong> gibi bir ifade kullanmamız yeterlidir.</p>
<blockquote>
<p>Kodda dikkat edilmesi gereken noktalardan birisi de import kullanımıdır. <span style="line-height: 1.8;">import ile kodun ilerleyen kısımlarında random modülündeki operasyonlar kullanılabilir hale gelir. Eğer bunu yapmazsak</span></p>
<p>Traceback (most recent call last):<br /> File "python", line 2, in <module><br />NameError: name 'random' is not defined</p>
<p>şeklinde bir hata alırız.</p>
</blockquote>
<p>İşte random modülüne ait bazı kullanımlar.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">import random
def createTenRandoms(x=0,y=11,isInt=False):
numbers=[]
for i in range(11):
rnd=random.random() if isInt else random.randint(x,y)
numbers.append(rnd)
return numbers
numbers1=createTenRandoms(False)
print(numbers1,"\n")
numbers2=createTenRandoms(0,11,True)
print(numbers2,"\n")
print("a random number is",random.choice(numbers1),"\n")
print("and next random number is",random.choice(numbers1))</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_8.gif" alt="" /></p>
<p><strong>createTenRandoms</strong> isimli fonkisyon üç parametre almaktadır ve bu parametrelerin varsayılan ilk değerleri de verilmektedir. Yani metod çağrısı sırasında<strong> x,y</strong> ve <strong>isInt</strong> değişkenlerine bir değer atanması zorunlu değildir. Fonksiyon içerisine gelen <strong>isInt</strong> değerine göre <strong>ternary</strong> operatörüne benzer bir kullanım söz konusudur. Eğer <strong>isInt</strong> değeri <strong>True</strong> gelmişse <strong>random()</strong> fonksiyonu, <strong>False</strong> gelmişse <strong>randint(x,y)</strong> çağrısı söz konusudur. <strong>random()</strong> rastgele kayan noktalı sayılar üretirken <strong>random(x,y)</strong> <strong>x ve y aralığında yer alacak rastgele tamsayılar üretir</strong>. Üretilen rastgele sayılar <strong>numbers</strong> isimli listeye eklenir ve bu liste fonksiyondan geri döner.</p>
<p>O gün izlediğim kitaptan yararlanarak <strong>python</strong> çalışma zamanından <strong>Raspberry Pi</strong> üzerindeki uygulamaların nasıl çağırılabileceğine de bakmışım. Bu işlem için subprocess isimli bir modülden yararlanılmakta. </p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">import subprocess
print(subprocess.check_output("pwd"))
print(subprocess.check_output(["ls", "l"]))
subprocess.run(["ping", "8.8.8.8"])</pre>
<p>Modüllerin kullanımlarını bu şekilde inceledikten sonra Raspberry PI'ye internetten bir kaç paket yüklemeyi denemişim. Ruby'de ki <strong>gem</strong> veya .Net'teki <strong>Nuget</strong> paketleri gibi indirilip <strong>python</strong> tarafında kullanılabilen hazır kütüphaneler söz konusu. Epey faydalı kütüphane olduğunu ifade edebilirim. Örneğin web uygulamaları geliştirmek için kullanılabilecek <strong>flask</strong> kütüphanesini terminalden aşağıdaki gibi yüklememiz mümkün.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo pip install flask</pre>
<p>veya belli bir sürümünü yüklemek için</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo pip install flask==0.10.2</pre>
<p>Kütüphanenin başarılı bir şekilde yüklenip yüklenmediğini anlamak da oldukça kolay aslında. Bunun için <strong>python</strong> komut satırından </p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">import flask</pre>
<p>şeklinde komut çalıştırılması yeterli. Bir hata mesajı almıyorsak paket başarılı bir şekilde yüklenmiştir.</p>
<p>Paketleri kaldırmak için <strong>uninstall</strong> parametresinden yararlanılıyor.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo pip uninstall flask</pre>
<p>Eğer sistemde yüklü olan paketleri görmek ve hatta bunları bir metin dosyasına yazdırmak istersek terminalden aşağıdaki komutu girmemiz yeterli.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo pip freeze>modules.txt</pre>
<blockquote>
<p>Bu arada uzun modül adları söz konusu olursa import ve as ile bu modüle takma ad<em>(alias)</em> vererek kod içerisinde daha kolay kullanılmalarını sağlayabiliriz.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_9.gif" alt="" /></p>
</blockquote>
<p>Aslında kendi modüllerimizi geliştirmemiz oldukça kolay. Tek yapılması gereken aynı alana ait operasyonları içeren py uzantılı bir kod dosyası oluşturmak. Bu kod dosyasının adı aynı zamanda modülün adı olacaktır.</p>
<h3>Paketler</h3>
<p>Bir de Paket kavramı var tabii. Notlarıma baktığımda ilerleyen günlerde paketler<em>(Packages)</em> ile ilişkili bir şeyler karaladığımı gördüm.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_18.gif" alt="" /></p>
<p>Aslında aynı amaca hizmet eden n sayıda modülü hiyerarşik bir klasör yapısı ile ifade edip paket haline getirebiliriz. Kritik nokta her paket içinde <strong>__init__.py</strong> isimli bir dosyanın olmasıdır. Bu dosyayı içeren klasör aslında otomatik olarak bir paket haline gelir. Örneğin aşağıdaki gibi bir klasör yapımız olduğunu düşünelim.</p>
<p>serialization/<br /> __init__.py<br /> schema.py<br /> serializers.py<br /> common.py</p>
<p><strong>__init__.py</strong> nin bırda<em>(yanlışlıkla bırda yazmışım ve burada diye düzeltmek içimden gelmemiş)</em> bir içeriğie sahip olması zorunlu değildir. Ancak kod parçaları da içerebilir. Varlığı <strong>serialization</strong> klasörünün bir paket haline gelmesi için yeterlidir. Eğer bu paketten örneğin <strong>schema</strong> modülünü kullanmak istersek</p>
<p>from serialization import common</p>
<p>gibi bir ifadeyi ele almamız gerekir. O gün konu ile ilişkili olarak internetten araştırma yaptığımı not almışım. <a href="http://stackoverflow.com/questions/448271/what-is-init-py-for" target="_blank">Stackoverflow' da konu ile ilgili güzel bir içerik de bulmuşum.</a></p>
<h2>Web Sitesi Yayımlamışım [12 Haziran 2012]</h2>
<p>O gün kitap üzerinden çalışmaya devam etmişim ve Raspberry Pi'yi bir web sunucusu haline getirmeye çalışmışım. <strong>Raspberry Pi</strong> oldukça ucuz bir kart ama aynı zamanda bir bilgisayar. Bu nedenle onu bir web sunucusu haline getirebilir, üzerinde web uygulamaları barındırabiliriz. Hatta micro-service' ler konuşlandırarak etkileşime geçtiği cihazlardan<em>(örneğin ortam sıcaklığı,mesafe, odadaki ışık şiddeti gibi ölçümler yapabilen çeşitli tipteki sensörlerden)</em> dış dünyaya servis bazlı veri sağlayabiliriz<em>(REST tabanlı servisler ile sensör verilerini JSON formatında yayımlamak gibi) </em>Tabii ilk adım Raspi'yi bir web sunucusu haline getirebilmek. İşte bunun için aşağıdaki adımları izlemişim.</p>
<h3>Apache Kurulumu</h3>
<p>İlk olarak bir web sunucusuna ihtiyacımız var. En uygun seçim <strong>Apache</strong>. Apache kurulumu için terminalden aşağıdaki komutu çalıştırmamız yeterli.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo apt-get install apache2</pre>
<p>Kurulum öncesi sistemi update etmekte yarar olabilir. Kurulum tamamlandığında tarayıcıdan makine IP adresine bağlanılarak apache web sunucusunun kurulup kurulmadığı kontrol edilmelidir. Hatırlanacağı üzere Raspi'nin o anki IP adresini öğrenmek için terminalden <strong>hostname -I</strong> komutunu vermek yeterliydi. O gün benim <strong>Raspim</strong> bana <strong>192.168.1.105</strong> nolu IP adresini vermiş.</p>
<h3>Index.html İçeriğinin Değiştirilmesi</h3>
<p><strong>Apache</strong> kurulduktan sonra<strong> /var/www/html</strong> içerisine varsayılan bir <strong>index</strong> sayfası koyar. Bu <strong>HTML</strong> içeriği istenildiği gibi değiştirilebilir ve kendi karşılama sayfamız sunucuya yüklenebilir. Ben index.html içeriğini aşağıdaki gibi değiştirmişim. </p>
<pre class="brush:html;auto-links:false;toolbar:false" contenteditable="false"><html>
<head>
<title>Burkinin Ahududu Bahcesi</title>
</head>
<body>
<h1>Burkinin ahududu bahcesine hosgeldiniz!</h1>
<p><a href="http://www.buraksenyurt.com">Blog</a></p>
</body>
</html></pre>
<p>Sonrasında kendi bilgisayarımdan bu adrese giderek Raspim üzerinde değiştirdiğim index.html içeriğine ulaşabilmişim.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_10.gif" alt="" /></p>
<h3>Php Kullanımı</h3>
<p>Derken işi ilerletip web sunucusunda php ile nasıl kod yazılacağına dair notlar almışım. Tabii ilk önce <strong>php</strong> alt yapısının yüklenmesi gerekiyor. Bunun için yine terminalden ilerlememiz lazım.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo apt-get install php5 libapache2 -mod -php5</pre>
<p>install'dan sonra gelen ikinci parametre dizisi php'nin apache için gerekli eklentisinin yüklenmesini sağlamakta.</p>
<h3>Bir php dosyasının oluşturulması</h3>
<p>Tabii sisteme php yükledikten sonra bir de Hello World demek gereki değil mi?<em>(Ama php tarafına bulaşacağımı hiç sanmıyorum. Şimdiden not edeyim)</em> Bunun için kitapta öngörüldüğü üzere <strong>bilgi.php</strong> uzantılı bir dosyayı oluşturmuş ve içerisine aşağıdaki kod parçasını yazmışım.</p>
<pre class="brush:php;auto-links:false;toolbar:false" contenteditable="false"><?php
phpinfo();
?></pre>
<p><strong>phpinfo()</strong> metodu ile sistemde yüklü php versiyonunu ve içerisinde yer alan modül listesini elde etmemiz mümkün. Çekinmeyin deneyin.</p>
<h2>Söyleşi Öncesi Hazırlık [15 Haziran 2016]</h2>
<p><img style="float: right;" src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_12.gif" alt="" />Bugün Recep Duman hocamla yapacağım söyleşi öncesi bazı notlar almışım. Özellikle <strong>python</strong> diline ait genel özelliklere çalışmışım.</p>
<ul>
<li>Yorumlamalı<em>(Interpreted)</em> dillerdendir. Yani kaynak kodun tamamının derlenip makine diline çevrilmesi yerine sırası gelen satırın derlenip o anda çalışması söz konusudur.</li>
<li>Dinamik tip sistemine sahiptir.</li>
<li>Platform bağımsızdır. linux, macos, windows, amiga, symbian gibi ortamlarda çalışabilir.</li>
<li>Modüler bir yapısı vardır.</li>
<li>Nesne yönelimli<em>(Object Oriented)</em> bir dildir.</li>
<li>Girintilere<em>(Indent)</em> dayalı, katı kuralları olan, büyük küçük harf duyarlı bir söz dizimine sahiptir.</li>
<li>Python yazılım vakfınca desteklenmektedir.</li>
<li>Tasarımcısı <a href="https://en.wikipedia.org/wiki/Guido_van_Rossum" target="_blank">Guido Van Rossum</a>'dur ve ilk sürümü 1991 yılında çıkmıştır. Kendisine python topluluğu tarafından "Yaşam Boyu Hayırsever Diktatör<em>(Benevolent Dictator For Life)</em>" ünvanı verilmiştir.</li>
<li>Büyük çaplı yazılımların hızlı geliştirilmesi ve prototip üretilmesinde C,C++ gibi dillere tercih edilir. Hatta Java diline göre 3 ila 5, C++ diline göre ise 5 ila 10 kez daha kısa kod blokları ile aynı işlerin yapılabilmesine olanak vardır.</li>
<li>Groovy, ruby ve javascript gibi dilleri etkilemiştir. Kendisi ise C, Haskell, Java, Lisp ve Perl'den etkilenmiştir.</li>
<li>Adını yılandan değil Monty Python grubunun Monty Python's Flying Circus isimli gösterisinden almıştır.</li>
<li>Betik(script) dili olarak openoffice.org, GIMP, Inkspace, Blender, Scribus, Paintshop Pro vb ürünlerde kullanılmıştır.</li>
<li>Django<em>(Python ile yazılan programların internet üzerinden çalışmasına olanak sağlar ki bu bağlamda The New York Times, The Guardian, Bit Bucket ve Instagram gibi siteler doğmuştur)</em>, Youtube, BitTorrent, Pardus, Google, NASA ve CERN python kullanan firma ve ürünlerden sadece bir kaçıdır.</li>
</ul>
<h2>REST Servis Kullanımı [18-Haziran-2016]</h2>
<p>O gün <a href="https://home.openweathermap.org/" target="_blank">Weather Data Service</a> isimli bir <strong>Web API</strong>'yi Raspi üzerinden python ile nasıl kullanabileceğime çalışmışım. Pek çok Web API hizmetinde olduğu gibi bu servisten yararlanabilmek için bir <strong>uygulama anahtarına<em>(Application Key)</em></strong> ihtiyacımız var. Bunun için öncelikle hizmete üye olmalı ve bir <strong>API Key</strong> ürettirmeliyiz. Üzerinde çalıştığım örnek temel olarak ilgili API'ye bir <strong>REST</strong> talebi gönderip sonuçlarını almakta. Örneğin bir şehrin 3 günlük hava durumu bilgisine ulaşmanız mümkün. O günkü çalışmada benim için kritik olan nokta, bu tip hizmetler için <strong>HTTP</strong> çağrılarının <strong>python</strong> üzerinden nasıl gerçekleştirildiğini görmekti. <strong>Python</strong> tarafındaki kodda bu talepleri zahmetsizce gönderebilmek için <strong>requests</strong> modülünden yararlanabiliriz. Ancak bu modülü aldığım notlara göre sisteme yüklenmesi gerekiyor.</p>
<pre class="brush:bash;auto-links:false;toolbar:false" contenteditable="false">sudo pip install requests</pre>
<p>Bu işlemin ardından çok basit bir şekilde aşağıdaki kod parçasında olduğu gibi talep gönderilmesi ve <strong>JSON</strong> formatında içerik alınması mümkün hale gelmekte.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">import requests
import json
def getWeatherData(city_id,ApiKey):
data=get("http://api.openweathermap.org/data/2.5/forecast?id={}&APPID={}".format(city_id,KEY))
return data.json()
print(getWeatherData("buraya sehir idsi gelmeli","buraya api key gelmeli"))</pre>
<p><strong>get</strong> metodu dikkat edileceği üzere basit bir <strong>HTTP</strong> <strong>Get</strong> talebi göndermekte. Bunu yaparken de <strong>Open Weather Map</strong>'in gösterdiği kriterlere göre parametre alıyor. <strong>id</strong> ile şehir numarasını <strong>appid</strong> ile de servis kullanıcısına açılan uygulama anahtarını kullanıyor. Dönen içeriği <strong>JSON</strong> formatında ele almak için <strong>json()</strong> metodunun çağırılması yeterli. Sanıyorum o gün oldukça yorgun olmalıyım ki sadece örneği yapıp bilgisayarda kullanmışım. Deftere de fazla not almamışım. <em>(Dolayısıyla python ile bir REST servis yazıp bunu kullandıracağım bir makaleyi yazılacaklar listesine almam lazım)</em></p>
<h2>Kriptografi ve One-Time Pad Algoritması [19-Haziran-2016]</h2>
<p>Eğlenceli bir gece geçirmişim. One-Time Pad algoritmasını öğrenmiş bunun python dili ile yazımını gösteren tutorial'ı adım adım izlemişim. Aslında <strong>One-Time Pad</strong> algoritmasını anlamakta epey zorlandığımı hatırlıyorum. Kağıt kalem ile ders çalışır gibi yazıp çizerek işi kurtarmıştım.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_11.gif" alt="" /></p>
<p>Örneğin burak kelimesini şifrelemek istediğimizi düşünelim. b alfadeki 1nci indise denk gelir. Diğer yandan örnek otp dosyasının birinci değeri 10dur. Buna göre 1+10 toplamının mod 26 değerine bakılır ki bu değer 11dir. 11 ise alfabede yer alan l harfine karşılık gelmektedir. Bu şekilde ilerlendiğinde <strong>burak</strong> kelimesi için <strong>lzaee</strong> şeklinde şifrelenmiş bir içerik üretilecektir. Şifrelenen içeriğin çözümlenmesi sırasında ise tam tersi durum söz konusudur. l harfinin alfabedeki indisi 11dir. Şifreleme sırasında b harfi için 10 ekleme yapıldığından tam tersi olacak şekilde 11-10 işleminin mod 26 değerine bakılır. Bu değer de 1dir ve sıfır indisli alfabedeki b harfine denk gelmektedir. Bu şekilde şifreleme ve ters şifrleme işlemleri one-time pad algoritmasına göre yapılabilir.</p>
<p>Kodlara gelirsek. Öncelikle one-time pad için gerekli sayı dizilerini içeren rastgele dosyalara ihtiyacımız var. Bu dosya üretimi ve üretilen dosya içeriklerinin görülmesi için aşağıdaki kod parçasından yararlanılabilir.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">import random
alfa="abcdefghijklmnopqrstuvwxyz"
def generateOtpFiles(fileCount,length):
for sheet in range(fileCount):
with open("otpFile"+str(sheet)+".txt","w") as f:
for i in range(length):
f.write(str(random.randint(0,26))+"\n")
def loadOtpFile(filename):
with open(filename,"r") as f:
content=f.read().splitlines()
return content
generateOtpFiles(3,100)
print(loadOtpFile("otpFile1.txt"))</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_13.gif" alt="" /></p>
<p><strong>generateOtpFiles</strong> metodu iki parametre alır. İlk parametre one-time pad için üretilecek dosya adedini, ikinci parametre ise bu dosyalar içerisine atılacak karışık sayı miktarını ifade eder. Açılan ilk <strong>for</strong> döngüsü dosya sayısı kadar, ikinci for döngüsü ise her bir dosyanın içereceği eleman sayısı kadar döner. <strong>with open</strong> ile başlayan kısımda verilen <strong>w</strong> değeri, dosyanın yazma amaçlı olarak açılacağını belirtir. Dosya içerisine 0 ile 26 arasında rastgele tamsayılar atamak için <strong>randint(0,26)</strong> metodundan yararlanılır. Elde edilen sayısal değer <strong>f</strong> ile ifade edilen dosyaya <strong>write</strong> metodu ile yazılır.</p>
<p>Üretilen bir otp dosya içeriğini görmek içinse <strong>loadOtpFile</strong> metodundan yararlanılır(<em>Bu bir nevi test metodu olarak düşünülebilir aslında)</em> Yine <strong>with open</strong> ile başlayan satırda dosyanın bu kez okuma amaçlı olarak açıldığı <strong>r</strong> anahtarı ile belirtilmektedir. Dosya içeriğini okumak için başvurulan <strong>read</strong> metodunu takiben <strong>splitlines</strong> fonkisyonuna da çağrı yapılır. Bu sayede ilgili dosya içeriğinin satır bazında elde edilmesi ve bir listeye alınması sağlanmış olur. Sıra geldi şifreleme ve çözümleme metodlarını yazmaya. Program kodunun son hali aşağıdaki gibidir.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">import random
letters="abcdefghijklmnopqrstuvwxyz"
def generateOtpFiles(fileCount,length):
for sheet in range(fileCount):
with open("otpFile"+str(sheet)+".txt","w") as f:
for i in range(length):
f.write(str(random.randint(0,26))+"\n")
def loadOtpContent(filename):
with open(filename,"r") as f:
content=f.read().splitlines()
return content
def encryptMessage(message,otp):
text=""
for position,character in enumerate(message):
if character not in letters:
text+=character
else:
idx=(letters.index(character)+int(otp[position])) % 26
text+=letters[idx]
return text
def decryptMessage(message,otp):
text=""
for position,character in enumerate(message):
if character not in letters:
text+=character
else:
idx=(letters.index(character)-int(otp[position])) % 26
text+=letters[idx]
return text
generateOtpFiles(3,100)
otpContent=loadOtpContent("otpFile1.txt")
yourMessage=input("Please type your secret message").lower()
print("Your message is '{0}'".format(yourMessage))
em=encryptMessage(yourMessage,otpContent)
print("Encrypted message is '{0}'".format(em))
dc=decryptMessage(em,otpContent)
print("Decrypted message is '{0}'".format(dc))</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_14.gif" alt="" /></p>
<p>Görüldüğü gibi kullanıcının girdiği mesaj önce şifrelenmiş ve sonra şifrelenen içerikten tekrar elde edilmiştir. Kodda o gün için öğrenilecek pek çok yeni kavram da çıkmış bana. Örneğin ekrandan bilgi almak için <strong>input</strong> fonksiyonundan yaralanıyoruz. Fonksiyon arkasından yapılan <strong>lower</strong> çağrısı ise girilen içeriğin küçük harfe dönüştürülmesini sağlıyor. Nitekim alfabemiz küçük harflerden oluşmakta. <strong>encryptMessage</strong> ve <strong>decryptMessage</strong> metodları şifrlenecek ve çözümlenecek içerik ile kullanılacak one-time pad dosya içeriğini parametre olarak alan fonksiyonlar. Her iki metod içerisinde algoritmanın gereklilikleri yerine getiriliyor.</p>
<p>Üzerinde çalışılacak mesajın içeridiği karakterlerin kendisi ve yerlerini dolaşabilmek için <strong>for</strong> döngülerinin nasıl kullanıldığına dikkat edin. <strong>enumerate</strong> metodu ile mesajlardaki karakterleri ve indis değerlerini <strong>key-value</strong> çiftleri şeklinde ele alabiliyoruz. <strong>letters</strong> isimli metin katarında yer alan bir lokasyona gitmek için <strong>index([indis değeri])</strong> notasyonundan yaralanmaktayız. Benzer şekilde yüklenen otp içeriğindeki bir sayıya gitmek için de <strong>otp[position]</strong> notasyonunu kullanmaktayız. O gün izlediğim bu tutorial sayesinde iyi bir pratik yapmış olduğumu görüyorum.</p>
<h2>İkinci Kitap ile Python' a Doğru Kaymış Gönlüm [21 Haziran 2016]</h2>
<p>Her ne kadar Raspberry Pi için bir çok sensör ve malzeme almış olsam da sanıyorum ki python dili epeyce hoşuma gitmiş. Bu nedenle o gün python dilini anlatan ikinci kitaba başlamışım<em>(Gerçi diğer kitapta kaldığım kameranın Raspberry Pi'den kontrolü ile ilişkili kısmı kamerayı alamadığım için beklemeye almak zorunda kalmamın da bunda etkisi olmuş olabilir)</em> İlk bölümlerde aşina olduğum kısımları hızlıca geçtikten sonra <strong>python</strong> içerisindeki temel veri türlerini kaleme almışım. Ne yazık ki gece yaptığım çalışmam S(h)arp Efe tarafında sabote edilmiş ve o da kendi bakış açısından çalışma notlarına ekler ilave etmiş.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_15.gif" alt="" /></p>
<p>Sadede gelecek olursak temel veri türlerini şu şekilde özetleyebiliriz.</p>
<p> </p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_16.gif" alt="" /></p>
<p>Tabii en çok dikkatimi çeken nokta kompleks sayıları doğrudan ifade eden bir türün olması ki şu şekilde sanal ve gerçel köklerini ele alıp kullanabiliriz.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">kompleksX=3.14+4j
print(kompleksX.real)
print(kompleksX.imag)
kompleksY=-3-8.125j
kompleksZ=kompleksX+kompleksY
print(kompleksZ)</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_17.gif" alt="" /></p>
<p>Gelelim temel veri türleri ile ilgili diğer notlara.</p>
<ul>
<li>Metinsel ifadeler için kullanılan <strong>String</strong> veri türü <strong>immutable</strong> bir tiptir. Bir başka deyişle string olarak ifade edilen bir karakter dizisinin elemanlarını değiştiremeyiz.</li>
<li>Benzer şekilde <strong>Tuple</strong> veri türü de <strong>Immutable</strong>' dır. Yani oluşturulduktan sonra doğrudan elemanlarını değiştiremeyiz. Ancak istisnai durumlar da vardır. Söz gelimi <strong>Tuple</strong>' ın bir elemanı <strong>List</strong> tipinden olabilir. Listeler <strong>Mutable</strong> dır. Yani elemanları değiştirilebilir. Dolayısıyla bir <strong>Tuple</strong> içerisinde tanımlı listenin elemanlarında değişiklik yapabiliriz.</li>
<li>Listeler çoğunlukla farklı tipteki elemanları ardışıl olarak saklamak için kullanılan veri türüdür. <strong>Mutable</strong>' dır. Yani elemanlarını değiştirebiliriz. Elamanları diğer <strong>python</strong> veri türlerinden her hangibirisi olabilir. </li>
<li><strong>Sets</strong> olarak ifade edilen kümeler tekrarlı elemanlar içermeyen dizilerdir. Her ne kadar dizi gibi olduklarını not almış olsam da elemanlarına <strong>indis</strong> operatörü ile erişmek mümkün değildir.</li>
<li><strong>Dictionaries</strong> <strong>Mutable</strong> tiplerden bir diğeridir. Elemanlar <strong>key-value</strong> çiftleri şeklinde saklanmaktadır. Anahtar değerleri <strong>benzersiz<em>(Unique)</em></strong> olmak zorundadır.</li>
</ul>
<p>O gün örnek kod parçalarını deneyerek çalışmalarıma devam etmişim.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">#En basit haliyle bir liste tanımı. Sondan bir önceki eleman küme son eleman bir Tuple'dır.
someList=[100,-90,"burk",True,False,3.1415,
{"one","two","five","six"},
("burki",1195,"Math.Eng")]
print(someList)
#En basit haliyle bir Tuple tanımı
person=(90001,"burak selim","şenyurt",1.78,"White")
print(person)
#En basit haliyle küme tanımlaması. Çıktıya dikkat edilecek olursa tekrar eden elemanların teke indirildiği görülebilir.
someSet={3,4,5,1,2,18,16,3,3,2,1,-1,91}
print(someSet)
print("3 küme içinde mi? {}".format("Evet" if 3 in someSet else "Hayır"))
#Bir eleman listesinin tekilleştirilmesi istenirse en basit haliyle kümelerden yararlanılabilir. Örneğin aşağıdaki metinsel ifade içerisinde geçen harfleri tekil olarak elde etmek istersek
motto="This is my last world"
mottoSet=set(motto)
print(mottoSet)
#Kümelerle aynı matematikteki gibi küme işlemleri yapılabilir
set1={1,2,3,4,6,8,10,12}
set2={4,5,6,7,8,9,10}
print("Çıkartma-> set1-set2 = ",set1-set2)
print("Birleşim-> set1|set2 = ",set1|set2)
print("Kesişim-> set1&set2 = ",set1&set2)
print("Kesişim Dışında Kalanlar-> set1^set2 = ",set1^set2)
#En basit haliyle dictionary tanımlaması
studentNotes={"klara":90,"norman":100,"burk":38,"tubi":85}
print("Klara'nın notu",studentNotes["klara"])</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_24.gif" alt="" /></p>
<h2>Metodlara Bir Bakıp Çıkmışım [23 Haziran 2016]</h2>
<p>O gün metodlar ile ilgili bir şeyler yapmışım. Aslında 17 Hazirandaki <a href="https://www.buraksenyurt.com/post/bu-yaz-macerasinin-adi-python.aspx" target="_blank">"Bu Yaz Macerasının Adı Python"</a> isimli yazımda metodlara biraz da olsa değinmişim. Ancak kitabı takip etmeye devam ettiğim için tekrar mahiyetinde de olsa bazı notlar da almışım. Hatta yeni bilgiler de edinmişim. Örneğin değişken uzunluk parametre alan bir metod üzerinde çalışmışım<em>(Yani C# tarafındaki params kullanımını işlemişim) </em>pass kullanımı ile NotImplementedException deneyimi yaşamış, Default Method Arguments ile metod parametrelerinde varsayılan değer kullanımına bakmışım. Kısaca aşağıdaki kodları çalışmışım.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">'''
Aşağıdaki kod satırlarında metodlara ait şu kavramlara yer verilmektedir.
pass
varsayılan parametre değerleri
değişken uzunluklu metod parametreleri
lambda kullanımı
'''
#bir metodun içeriği sonradan tamamlanacaksa kullanılabilir. Biraz NotImplementedException vari bir kullanım
def getPlayerStatistic(playerName):
pass
#metod argümanları isim verilerek kullanılabilir
def doConnect(port,serverName):
#do something
print("Connection for {}:{} is ok".format(serverName,port))
return False
#metod parametrelerine varsayılan ilk değerler verebiliriz.
def findLocation(playerName,city="Paris"):
#do something
print(city,"is scanning for",playerName)
# C# taki params kullanımı burada da var ki
def createPlayer(name,city,*properties):
print("{} from {}\n".format(name,city))
prop=[]
for p in properties:
prop.append(p)
print(prop)
print("*"*10)
# lambda kullanımı. Bunlar tek satırlık metodlar olarak düşünülebilirler. C# taki => ve anonymous metodları hemen aklınıza gelmiştir.
sum=lambda x,y:x+y
print(sum(4,5))
getPlayerStatistic("burk")
result=doConnect(port="8080",serverName="192.168.1.107")
print("Connection is {} success".format("" if result else "not"))
findLocation("burk")
findLocation("tubi","new york")
createPlayer("burki","istanbul","black","master",True,1685)</pre>
<p>ve çalışma zamanı sonuçları.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_21.gif" alt="" /></p>
<h2>String Veri Yapısı ile Eğlenceli Dakikalar [25 Haziran Cumartesi]</h2>
<p>Bugün <strong>string</strong> veri yapısını kullanarak eğlenceli kod parçalarını ele almışım. Hatta <strong>string</strong> tipinin pek çok metodunu sonradan denemem için de not düşmüşüm<em>(Niye göbekli bir karakter çizdiğimi ben de bilemiyorum sayın seyirciler)</em></p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/notes_19.gif" alt="" /></p>
<p>Peki ya kodlar?</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">motto="this is gonna be the BesT Day of my liFe"
#Büyük harfe çevirme ve metin uzunluğunu bulma
print("{} (length={})".format(motto.upper(),len(motto)))
#İlk dört karakteri yazdırma
print(motto[:4])
#Metni tersten yazdırma
print(motto[::-1])
#Son 4 karakter hariç tüm metin
print(motto[:-4])
#this ile başlayıp başlamadığını bulma
print(motto.startswith("this"))
#Cümlenin ilk harfini büyük harfe çevirme
print(motto.capitalize())
#Boşluk karakterine göre metni kelimelere ayırma
words=motto.split(" ")
for w in words:
print(w)
#4üncüden 7nciye kadar
print(motto[4:7])
#Büyük harfleri küçük, küçük harfleri büyük harfe çevirme
print(motto.swapcase())
#İçerik sayısal mı?
print(motto.isalnum())
print("450048".isalnum())
#Metin içinden karakter değiştirme
newMotto=motto.replace(" ","_")
print(newMotto)
# in operatörü ile bir kelimeyi metin içinde arama
print("is there a 'gonna'? {}".format("Yes" if "gonna" in motto else "No"))</pre>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_23.gif" alt="" /></p>
<p>Bu arada string türü ile ilişkili olarak <a href="http://www.tutorialspoint.com/python/python_strings.htm" target="_blank">şu adresten de</a> yararlanmaya ve bilgi almaya çalışmışım.</p>
<h2>Büyülü Kodlar [27 Haziran 2016]</h2>
<p>O gün okuduğum kitapta çok enteresan kod parçalarına rastlamışım ve bunları teker teker denemişim. Kod parçaları bana sihirli gelmiş olacak ki bir de sihirbaz şapkası çizmeye çalışmışım.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_20.gif" alt="" /></p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">import random
#rastgele sayı üretmenin uzun bir yolu
numbers=[]
for i in range(10):
numbers.append(random.randint(10,100))
print(numbers)
#ve rastgele sayı üretmenin tek satırlık kısa yolu
numbers=[random.randint(10,100) for i in range(10)]
print(numbers)
#0 ile 100 arasında 7 ile bölünebilen sayıları listeye almanın uzun yolu
points=[]
for i in range(101):
if i%7==0:
points.append(i)
print(points)
#0 ile 100 arasındaki sayıları listeye almanın kısa yolu
points=[i for i in range(101) if i%7==0]
print(points)
#iki listenin iç içe iki döngü ile ele alınmasının uzun yolu
colorList=["green","gray","red","blue"]
players=["burki","tubi","tom"]
combination=[]
for c in colorList:
for p in players:
combination.append(c+" "+p)
print(combination)
#iki listenin iç içe iki döngü ile ele alınmasının kısa yolu
combination=[c+" "+p for c in colorList for p in players]
print(combination)</pre>
<p>Örnekte 3 farklı operasyon söz konusu. İlk olarak 10 ile 100 arasında rastgele tamsayılar üretip bunları bir listeye alıyoruz. İkinci örnekte 0 ile 100 arasındaki sayılardan 7 ile bölünebilenlerini çekiyoruz. Üçüncü ve son örnekte ise iki farklı listenin tüm ikili kombinasyonlarını çıkartmaktayız. Örneklerin uzun ve kısa versiyonlar var. Kısa versiyonlarda köşeli parantezler içerisinde yazılan ifadeler beni oldukça etkiledi. Köşeli parantezler içerisindeki ifadeleri 3 ana parça halinde düşünebiliriz. İlk parçada eşitliğin sol tarafına atanacak değer ifade edilir. Sonrasında ise bir for döngüsü ve bunu takiben de eğer gerekliyse koşullu bir ifadeye yer alır. Bu sayede tek satırda bir sayı dizisini dolaşıp belirli kriterlere uyanlar için işlemleri kısaca yaptırabiliriz.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/07/notes_22.gif" alt="" /></p>
<p>Çalışmalarım bu tarih itibariyle sonlanmış. Nitekim izin dönemi gelmiş. Şimdi kaldığımız yerden devam edebilirim. Bu uzun yazıda Python notlarımı elektronik ortama almaya çalıştım. Umarım python severler için yararlı bir yazı olmuştur. Bir başka makalemizde görüşünceye dek hepinize mutlu günler dilerim.</p>2016-07-18T21:30:00+00:00raspberry pipythontemel kavramlarInternet of ThingsIoTbsenyurtBloğumu takip edenler bu yaz için Raspberry PI ve Python programlama diline merak saldığımı biliyordur. Bu merakımı boşa çıkarmamak için de vakit buldukça her iki konuya da çalışıyorum. İş yoğunluğu ve araya giren bayram tatili beni az da olsa geriye atmış durumda. Ama neyseki defterime aldığım renkli renkli notlarım var. Bu yüzden notlarımın üstünden geçmem öğrendiklerimi hatırlamamda epey yardımcı oldu. Notları renklendirmiş olmam da onları okurken sıkılmamamı ve hatta yer yer kendi kendime tebessüm etmemi sağladı. Yazdıklarımın üzerinden geçerken bunları bloğuma da koyayım ve benim gibi temel seviyede bu işe başlayan, elektronik'ten, Linux' den ve Python' dan bihaber olanlarla bir şeyler paylaşayım istedim.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=9f7280b5-eff7-473e-a590-37e55164ef9f6https://www.buraksenyurt.com/trackback.axd?id=9f7280b5-eff7-473e-a590-37e55164ef9fhttps://www.buraksenyurt.com/post/raspberry-pi-ve-python-calisma-notlarim#commenthttps://www.buraksenyurt.com/syndication.axd?post=9f7280b5-eff7-473e-a590-37e55164ef9fhttps://www.buraksenyurt.com/post/raspberry-pi-maceramiz-kaldigi-yerden-devam-ediyorRaspberry Pi Maceramız Kaldığı Yerden Devam Ediyor2016-06-15T19:07:00+00:00bsenyurt<p>Merhaba Arkadaşlar,</p>
<p>Raspberry Pi'mize yeni parçalar alarak masraf yapmaya, python dilini öğrenmeye ayırdığımız bir iki haftayı daha heyecanlı bir şekilde geride bıraktık. Ne durumdayız, merak ediyor musunuz? <a href="http://www.recepduman.net/" target="_blank">Recep Duman</a> hocam ile kısa bir Retrospective toplantısı yapıp durumu değerlendiriyoruz. Buyrun izleyelim. Bu arada yer yer sürçü lisan'da ettik o nedenle affedin. </p>
<p><iframe src="https://www.youtube.com/embed/h3xfi1-SmQc" width="640" height="360" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<p>Raspi maceralarımız kaldığı yerden devam edecek. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>2016-06-15T19:07:00+00:00raspberry piIoTInternet of ThingspythonbsenyurtRaspberry Pi'mize yeni parçalar alarak masraf yapmaya, python dilini öğrenmeye ayırdığımız bir iki haftayı daha heyecanlı bir şekilde geride bıraktık. Ne durumdayız, merak ediyor musunuz? Recep Duman hocam ile kısa bir Retrospective toplantısı yapıp durumu değerlendiriyoruz. Buyrun izleyelim. Bu arada yer yer sürçü lisan'da ettik o nedenle affedin.https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=2c7f599c-c730-476c-bda8-c8bd6502a3231https://www.buraksenyurt.com/trackback.axd?id=2c7f599c-c730-476c-bda8-c8bd6502a323https://www.buraksenyurt.com/post/raspberry-pi-maceramiz-kaldigi-yerden-devam-ediyor#commenthttps://www.buraksenyurt.com/syndication.axd?post=2c7f599c-c730-476c-bda8-c8bd6502a323https://www.buraksenyurt.com/post/raspberry-pi-den-python-ile-tweet-gondermekRaspberry Pi'den Python ile Tweet Göndermek2016-06-14T06:00:00+00:00bsenyurt<p><img style="float: right;" src="https://www.buraksenyurt.com/image.axd?picture=/2016/06/raspi_0.gif" alt="" />Merhaba Arkadaşlar,</p>
<p>Geçtiğimiz sene yaz ayı boyunca Ruby programlama dilini öğrenmeye çalışmıştım. Ruby dilinde orta seviyelere kadar bilgimi ilerletebildim ancak bu yaz dönemini paslanmamak adına farklı bir uğraş ile geçirmeye karar verdim. Ruby'yi öğrenmeye başlama amaçlarımın başında çocuklara programlama dilini öğretmek geliyordu. Benzer şekilde Raspberry Pi'nin de bu amaçla kullanılabildiğini öğrendim. Özellikle Scratch dilini kullanarak çocukların robotlara bir şeyler yaptırabilmesi ve bu şekilde programlamayı öğrenmeleri harika. Pek tabi Raspberry Pi'yi özel yapan bir diğer neden de IoT(Internet of Things).</p>
<p>Bunun üzerine aldım Bruce' u yanıma her zamanki gibi büyük bir hevesle koyuldum yola. Önce bir <strong>Raspberry Pi 3 Model B</strong> aldım<em>(Sonrasında 7inch dokunmatik ekran, sıcaklık sensörü, HDMI bağlantı kablosu, 40 GPIO kablosu, bir adet servo motor kontrolcüsü gibi parçaları da dahil ederek kredi kartlarımdan birini epeyce şişirdim)</em> Ancak sonradan öğrendim ki <a href="http://www.robotistan.com" target="_blank">Robotistan</a> gibi sitelerde Raspberry Pi ile ilgili komple setler satılıyor. Yeni başlayacaklara tavsiyem bir set alarak ilerlemeleri.</p>
<h2>Raspi Hakkında Kısa Bilgi</h2>
<p>Raspberry Pi yaklaşık olarak kredi kartından biraz daha büyük olan bir kart. Maliyeti oldukça düşük olan Raspberry Pi aslında microprocessor içeren<em>(ki bu noktada MicroController içeren Arduino'dan ayrılıyor)</em> bir bilgisayar olarak düşünülebilir. Dolayısıyla onunla her şeyi yapabilirsiniz. Bir Web Server haline de getirebilir<em>(ki denedim ve apache2 üzerinde php kodlaması yaptım)</em> sıcaklık sensörüne sahip bir kahve fincanını kumanda da edebilirsiniz. Yapabilecekleriniz hayal gücünüz ile sınırlı diyebilirim.</p>
<p>Çevre ünitelerle<em>(monitör, kamera, GPIO-General Purpose Input Output ile bağlanabilen her türlü elektronik alet, klavye, mouse vb)</em> olan bağlantıları sağlayacak arabirimler üzerinde yer alan kart uygun işletim sistemi yüklendiğinde mini bir bilgisayar haline gelmekte. Bu anlamda <strong>Windows 10 IoT, Ubuntu Mate</strong> ve kendi orjinal işletim sistemi <strong>Raspbian</strong>'ı kullanabiliriz. </p>
<blockquote>
<p>Kart ile ilişkili çok fazla detaya girmeyeceğim nitekim yeni yeni öğreniyorum ama bu konuda epey bilgili olan <a href="https://youtu.be/LfTrBhXo8vk" target="_blank">Recep Duman hocam ile yaptığımız youtube söyleşisini</a> mutlaka izlemenizi öneririm.</p>
</blockquote>
<p>Kullandığım Raspberry Pi üzerinde <strong>Ruby</strong> standart olarak yüklü. Buna ek olarak <strong>python</strong> diline ait ortam da hazır. <strong>Java,Mathematica, Scratch</strong> de diğer diller arasında sayılabilirler. Her biri için güzel birer IDE'de gelmekte.</p>
<p>Aslında amacım bir motoru <strong>Raspberry Pi</strong> ile programlayıp evdeki <strong>Lego Technic</strong>'ler den birisini önceden tayin ettiğim rota doğrultusunda, engellere çarpmayacak şekilde dolaştırabilmek. Ama tabii bu mertebelere gelmeden önce bir programlama diline de hakim olmak gerekiyor. Tercihimi <strong>python</strong>'dan yana kullanıyorum. Böylece yeni bir programlama dilini araştırıp deneme şansım da olacak. Internetteki kaynaklardan ve aldığım bir kaç kitaptan kısa bir giriş turu ile değişkenleri, döngüleri, range, tuple, dictionary gibi nesne koleksiyonlarını, modülleri, metod tanımlamalarını, kodlardaki girintilerin önemi vb kavramları hızlıca denedikten sonra kendimi bir anda Raspberry Pi organizasyonuna ait sitedeki tutorial' ları çalışırken buldum.</p>
<p>İlk gözüme kestirdiğim ise <strong>Twitter API</strong> sini kullanarak Tweet atmak oldu. Daha önceden <strong>C#</strong> ve <strong>Ruby </strong>dillerini kullanarak denediğim bir çalışmaydı. Ancak şimdi ki deneyim daha eğlenceliydi diyebilirim. Bloğuma da dilim döndüğünce vakayı yazayım hangi yollardan geçtiğimi sonradan bakınca hatırlayayım istedim. Şimdi maceramıza başlayabiliriz.</p>
<h2>Genel Prensipler Aynı</h2>
<p>Twitte API sini kullanmanın belli başlı prensipleri var. Bunlar aslında platform bağımsız kabul edebileceğimiz prensipler. İlk önce hangi platformda olursak olalım <strong>Twitter</strong> gibi sosyal ağları kolay bir şekilde kullanabilmek için servis bazlı çalışan kullanımı kolay <strong>API</strong>'lere ihtiyacımız var. Genelde <strong>REST</strong> tabanlı tasarlanan bu servisleri <strong>python</strong> tarafında <strong>Twython</strong> isimli modülü kullanarak ele almak son derece kolay. Bir diğer önemli kuralda bu API'yi kullanabilecek yetkilere sahip olmamızın gerektiği. <strong>Twitter</strong> tarafından baktığımızda bu kullanım için <strong>consumer_key</strong>, <strong>consumer_secret</strong>, <strong>access_token</strong> ve <strong>access_token_secret</strong> değerlerine ihtiyacımız bulunmakta. <a href="https://apps.twitter.com/" target="_blank">Şu adresten kendinize bir application oluşturup gerekli bilgileri alabilirsiniz</a>.</p>
<blockquote>
<p>Şunu belirtelim ki bir kütüphane kullanmak zorunda değilsiniz. Pekala Twitter REST servisleri için gerekli GET,POST paketlerini kendiniz de kod içinde hazırlayıp gönderebilirsiniz.</p>
</blockquote>
<h2>İlk adım twython modülünü yüklemek</h2>
<p>.Net dünyasında <strong>nuget</strong> paketleri, ruby tarafında <strong>gem</strong>'ler...<strong>Python</strong> tarafında ise <strong>module</strong> olarak adlandırılan kütüphaneler söz konusu. <strong>Tweet</strong> atmamızı kolaylaştıracak olan <strong>twython</strong><em>(ki adı twitter ve python un birleşimi ile elde edilmiş. Çok hoş bir isim değil mi?)</em> kütüphanesini sistemimize yüklemek için terminalden aşağıdaki komutları sırasıyla çalıştırmamız gerekiyor.</p>
<p>Burada ki <strong>sudo</strong> komutunu <strong>pi</strong> isimli varsayılan kullanıcının ilgili operasyonlar sırasında <strong>Permission Denied</strong> almaması için kullanılmakta. <strong>apt-get</strong> ile tahmin edeceğiniz üzere sistem güncellemesi ve yeni program yüklemeleri gibi işlemleri gerçekleştirmekteyiz. <strong>python</strong> tarafına ilgili kütüphaneyi yükleyecek asıl komut ise <strong>pip</strong> <strong>install</strong>. Son satır ile <strong>twython</strong> kütüphanesini sisteme yüklemiş bulunuyoruz.</p>
<p>sudo apt-get update<br />sudo apt-get upgrade<br />sudo apt-get install python-setuptools<br />sudo easy_install pip<br />sudo pip install twython</p>
<h2>Azcık Kod</h2>
<p>İlgili kütüphane yüklendiğine göre artık gerekli kodlarımızı yazmaya başlayabiliriz. Uygulama iki kod dosyasından oluşmakta. <strong>py</strong> uzantılı olarak kaydedilecek dosyalardan ilkinde <strong>consumer</strong> ve <strong>access</strong> bilgilerine ait değişkenleri tutacağız. Bunu bir nevi konfigurasyon içeriği gibi de düşünebiliriz<em>(Bu arada kodlar için Python 2 IDLE yi kullandığımı belirtmek isterim. Nitekim biraz sonra değineceğimiz twython kütüphanesini python 3.4.2de kullanamadım. Ama işin peşindeyim)</em></p>
<p>auth.py içeriği</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">consumer_key="..."
consumer_secret="..."
access_token="..."
access_token_secret="..."</pre>
<p>Tabii ki siz ... yazan kısımlara Twitter'ın sizin için ürettiği değerleri girmelisiniz.</p>
<p>İkinci dosyamızda<em>(twitter.py olarak kaydedebiliriz)</em> ise aşağıdaki satırlara yer vereceğiz.</p>
<pre class="brush:py;auto-links:false;toolbar:false" contenteditable="false">from twython import Twython
from auth import(
consumer_key,
consumer_secret,
access_token,
access_token_secret
)
def send_tweet(message):
twitter=Twython(
consumer_key,
consumer_secret,
access_token,
access_token_secret
)
twitter.update_status(status=my_message)
print("\'%s\' seklinde mesaj gonderildi" % message)
my_message="Bu mesaj Raspi'den python kodu ile gonderilmistir"
send_tweet(my_message)</pre>
<p>İlk iki satırda koda enjekte ettiğimiz tip ve değişkenler olduğunu düşünebiliriz. <strong>Twython</strong> nesnesini oluşturabilmek için ilgili tipi az önce yüklediğimiz modül içinden <strong>import</strong> etmekteyiz. Buna ek olarak aynı klasörde yer alan <strong>auth.py</strong> dosyasından da <strong>consumer_key</strong>,<strong>consumer_secret</strong>,<strong>access_token</strong> ve <strong>access_token_secret</strong> isimli string değişkenleri koda alıyoruz.</p>
<p><strong>send_tweet</strong> bir metod tahmin edeceğiniz üzere. <strong>Ruby</strong>'deki gibi <strong>def</strong> anahtar kelimesi ile tanımlanan fonksiyon <strong>:</strong> işareti ile sonlanıyor<em>(aslında for, if gibi kod bloğuna sahip olabilecek ifadeler hep : kullanıyor)</em> Sonrasında önemli olan konu ise metod içerisindeki kod satırlarının girintili yazılması gerekliliği. Eğer böyle yapmazsak kodu kontrol ettirdiğimizde<em>(Alt+X)</em> Invalid Syntax hatası alırız. Bu arada yorumlayıcı metodun bittiğini nasıl anlıyor derseniz;orada boş bir satır var ya...</p>
<p>Koda import ettiğimiz değişkenler <strong>twitter</strong> isimli nesnenin oluşturulması sırasında<em>(şimdilik benim yapıcı metod-constructor olarak düşündüğüm yerde)</em> kullanılıyor. Metoda parametre olarak gelen <strong>message</strong> isimli değişken içeriği de <strong>update_status</strong> isimli fonksiyon kullanılarak <strong>twitter</strong>'a gönderiliyor. Son olarak <strong>print</strong> fonksiyonunu ile komut satırına bir bilgi basıyoruz. Sonuçlar mı? </p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/06/twython_1.gif" alt="" /></p>
<p>Burada <strong>%</strong> kullanımını bir türlü beceremediğimi fark etmişsinizdir :D O yüzden arka arkaya bir kaç tweet gitmiş bulundu. Ama sonuçlar ilk gün için oldukça tatmin ediciydi. Kredi kartı büyüklüğündeki o bilgisayardan, python kodları ile harici bir kütüphane kullanarak tweet atmayı başarabildim. Demek ki bir robotu Raspi ile kullanmaya başladığımda, robotun tweet atmasını artık sağlayabilirim.</p>
<p><img src="https://www.buraksenyurt.com/image.axd?picture=/2016/06/twython_2.gif" alt="" /></p>
<p>Pek tabii modül içerisinde bir çok fonksiyonellik bulunmakta. Örneğin timeline'ı, kendi tweet'lerimizi görebilir, resim gönderebilir ve daha pek çok işlemi gerçekleştirebiliriz. Sonuçta <strong>Twitter API</strong>'sini kullanabileceğiniz kütüphane elinizin altında. Bunları nasıl yapabileceğinizi görmek için <a href="https://www.raspberrypi.org/learning/getting-started-with-the-twitter-api/worksheet/" target="_blank">şu adresteki tutorial</a>'ı aynen benim gibi adım adım yapmanızı öneririm. Ben biraz farklı olarak metod kullandım.</p>
<p>Böylece geldik bir makalemizin daha sonuna. Umarım eğlenceli bir yazı olmuştur. Raspi maceralarımıza devam edeceğiz. Tekrardan görüşünceye dek hepinize mutlu günler dilerim.</p>2016-06-14T06:00:00+00:00pythonraspberry pitwitter apibsenyurtGeçtiğimiz sene yaz ayı boyunca Ruby programlama dilini öğrenmeye çalışmıştım. Ruby dilinde orta seviyelere kadar bilgimi ilerletebildim ancak bu yaz dönemini paslanmamak adına farklı bir uğraş ile geçirmeye karar verdim. Ruby'yi öğrenmeye başlama amaçlarımın başında çocuklara programlama dilini öğretmek geliyordu. Benzer şekilde Raspberry Pi'nin de bu amaçla kullanılabildiğini öğrendim. Özellikle Scratch dilini kullanarak çocukların robotlara bir şeyler yaptırabilmesi ve bu şekilde programlamayı öğrenmeleri harika. Pek tabi Raspberry Pi'yi özel yapan bir diğer neden de IoT(Internet of Things).https://www.buraksenyurt.com/pingback.axdhttps://www.buraksenyurt.com/post.aspx?id=6b32bb33-61b3-4127-a58e-1b92dc8fb5a75https://www.buraksenyurt.com/trackback.axd?id=6b32bb33-61b3-4127-a58e-1b92dc8fb5a7https://www.buraksenyurt.com/post/raspberry-pi-den-python-ile-tweet-gondermek#commenthttps://www.buraksenyurt.com/syndication.axd?post=6b32bb33-61b3-4127-a58e-1b92dc8fb5a7