RSS

Monthly Archives: May 2006

xmms-ruby: ikinci bölüm


Daha önce XMMS, Ruby, Emacs filan bunlar güzel şeyler demiştik. Görülen o ki blogosferin üst tabakalarında serin rüzgarlar esmiş, bulutlar elektrik yüklenmiş, birileri daha güzelini yaparım demiş. Ve herhangibiri xmms-ruby konusunu detaylandırmış:

fazlamesai.net’ten FZ ruby ile emacs icinden xmms’e parca sectiren bir program yazmis. Hazir ruby tutorial’ini biraz karistirmisken ruby ile birseyler yapayim dedim. Programi biraz daha gelistirdim. Ekledigim seyler:

  • Birden fazla kelime aranabiliyor, hepsinin parca ismine/dosya ismine uymasi lazim
  • Sadece sayi girilirse xmms o siradaki parcaya atliyor
  • Girdi ‘:’ ile baslarsa xmms’e direkt ruby kodu ile hukmedebiliyoruz (:stop, :play :next gibi). eval fonksiyonu sagolsun.
  • Eger ilk arguman –dialog ise girdi bir dialog yardimiyla aliniyor.

Sahalarda görmek istediğimiz türden hareketler bunlar ;-)

 
Leave a comment

Posted by on May 16, 2006 in General, Programlama

 

AJAX ve .NET patlar? C#, lambda ve adım adım Lisp'e yaklaşan modern (!) ortamlar; #fazlamesai-matematik; bilgisayar ve müzik


Volkan “Don Kişot” Özçelik, AJAX, .NET ve ISO-8859-9 şeklindeki tehlikeli nitrogliserinvari karışımın nerede nasıl patladığını ve olası çözümleri burada ve şurada gayet güzel anlatmış.

(Benzer bir durumla klasik ASP 3.0 ortamında karşılaşıp acı çekmiş biri olarak, ohoo .NET ortamında yaşadığın gerilim bir şey mi! diyorum ;-))

Don Box amcamız ise bakın bakın C#’a da Lispvari özellikler geliyor, 3.0′dı, LINQ’ti filan diye beyanatlarda bulunmuş yoğun olarak: New drop of C# 3.0/LINQ ve Code and Data in C#.

Hayırlı uğurlu olsun, belki ben emekli olmadan C# 3.0 Beta’dan RC’ye, oradan da tam ve stabil sürüme geçer, belki sözdizim biraz daha esnek kılınır. Güçlü fikirlerin güçlü olduğunu kabul etmek ve pek matah olmayan, zorlama bir sözdizim ile uygulamak bile bir şeydir ;-) Bilgisayar endüstrisi tekerleği yeniden keşfetmeye devam ediyor.

irc.freenode.net sunucusundaki #fazlamesai kanalında aniden “matris üçgenselleştirme, simetrikleştirme”, “hesaplamalı geometri”, Maxima, Octave, Kolmogorov karmaşıklığı gibi şeyler görürseniz korkmayınız, çekinmeyiniz, rahat olunuz. Yanlış kanala gelmiş filan değilsiniz, postfix’in filanca parola şifreli kullanıcılarını qmail’in filanca yapısına aktaracak araç yok mu gibilerinden fani, gelip geçici şeylere dair sorularınızı sorup yanıt almaya devam edebilirsiniz (halbuki matematik öyle mi ya mirim, bir teoreme yama yapıldığı, ortalığa salındıktan sonra arkasının toplandığı ya da kullanımdan kalktığı görülmüş şey mi! ;-)) Yakında nesneye yönelik programlama prensiplerini devreye sokarak yeni alt-kanallar açmayı düşünüyoruz:


#fazlamesai-matematik : #fazlamesai {
    private string currentMathSubfield;
    private ISet currentMathResources;

   public string CurrentMathSubfield  {
      get { return currentMathSubfield; }
      set { currentMathSubfield = value; }
   }
}

Neyse telaşa mahal yok, paniğe gerek yok. Metaforlar da kaza yapar bazen.

Biraz cl-wav-synth kurcalayıp, Lispti, müzikti derken sakinleşmekte fayda var ;-)

cl-wav-synth de ne deyip linke tıklamaya üşenenler için:

“cl-wav-synth is a wav sample editor. It comes in two parts, the main library for manipulating wav files and a (Mc)CLIM interface with a full lisp listener, a sample pane editor, a spectrum pane editor and a song pane editor.”

 
Leave a comment

Posted by on May 15, 2006 in .NET, General, Lisp, Music, Programlama

 

AC/DC; Mind Performance Hacks, bilgiyi yönetmek: mind hacks, mindraider, semantik web


Bazılarının en sevdiği parçalardan biri olan Ride On çalıyor AC/DC‘nin Dirty Deeds Done Dirt Cheap albümünden.

Okumaya başladığım kitaplardan biri de Yale’de psikoloji ve felsefe eğitimi almış Ron Hale-Evans‘ın yazdığı Mind Performance Hacks.

Kıvılcım ile muhabbet ederken, sayesinde MindRaider isimli yazılımdan haberdar oldum. RDF, OWL, semantik web gibi kavramların işe yarar bir uygulamasına benziyor. FreeMind zihin haritalama aracı gibi, MindRaider da Java ile geliştirilmiş. Kurcalamakta fayda var. Eğer MindRaider, bir de concept mapping kavramını katarsa bünyesine (işlevsel ve görsel olarak) o zaman gerçekten çok güzel bir bilgi yönetim aracı olarak öne çıkabilir diye düşünüyorum.

 
Leave a comment

Posted by on May 15, 2006 in General, Music

 

Blues Before Sunrise – My Lil' Secret


Howlin’ Wolf and I met last night
To the devil to sell my soul out
Ain’t nobody gonna ever learn that
Oh baby, that’s my little secret!

 
Leave a comment

Posted by on May 15, 2006 in General, Literature, Music

 

Bir İnsan Gecenin 2'sinde Kulağını Neden Hoparlöre Dayar – Ana Tema Üzerine Çeşitlemeler – Şenlik Şen Midir? – Common Lisp Şenliği – Strange Blues – 1001 Gece


The whole world is a fire pit; attaining what state of mind can you avoid being burned?” — Kao Feng


Jackie McLean - Strange Blues

Bir insan evladı gecenin 2′lerinde kulağını neden hoparlöre yapıştırıp bir eli ile de klavyede ENTER tuşuna basıp durur?

(DİKKAT! ACHTUNG! DISCLAIMER! Birazdan yaşanacaklar alegorik bir metamorfozun ilk belirtileri olup Gödel, Escher ve Bach’a taş çıkarma planlarımın nüvesini teşkil etmektedir. Eklektik bir mimarinin tüm özelliklerini taşıyan yazınsal enlem ve boylamlar topolojik dönüşümler sonucunda singüler bir noktada eriyecek, işler karışacak, caz ve Lisp programlama dili aynı paragrafta yer alacak, 1001 Gece Masalları ile Antonio Banderas arasında kayda değer bağlantılar kurulacaktır. Blog uzayını geren vektörleri tek bir potada eritip çorba yapma sanatında özel eğitim almış olan yazar kendini “o romanı aslında ben yazmadım bir süre sonra sonra roman kendi kendini yazmaya başladı, ben sadece nerede duracağını söyledim ona” şeklinde klişe röportaj cevaplarını fütursuzca ve utanmazca vermeye kendini çoktan hazır hissetmektedir. Dilin kemiği olmadığı gibi en dandik klavyenin bile “miin taym bitviin feylır“ı bir hayli yüksektir — nazar değmez inşallah!)

Bir insan evladı gecenin 2′lerinde kulağını neden hoparlöre yapıştırıp bir eli ile de klavyede ENTER tuşuna basıp durur?

Gaipten sesler mi duymaktadır?

X-Files’a konu olacak bir senaryonun ortasına düşmüştür de farkında mı değildir?

Yoksa… yoksa biri ona hayatın anlamını mı fısıldamaktadır?

Bilindiği üzere bilgisayar başında uzunca süre geçiren tayfanın %99′luk bir kısmı ne Matrix ne de Neo tadını yakalamakta, rutin şekilde işine gücüne bakmakta, heyecandan ırak (yeni bir Linux dağıtımı duyunca bedeninde bazı hormonlar salgılanan kişileri ayrı bir psikobiyoloji kategorisi olarak bir kenara koyarsak) rutin bir hayat sürmektedir.

Benim durumumda da benzer şey geçerlidir.

Tez hocama filanca deneyle ilgili 3000 Hz’ten verelim sesi kulaklık üzerinden demişimdir, hoca, hayır, o dB değerinde 3000 Hz olmaz, insanlar rahatsız olur demiştir. Kıllandırıcı bir durum hasıl olmuştur ve naçizane blog yazarınız ufaktan bir Mme Curie tadını yakalamak, kendini bilim uğruna feda etmek için yanıp tutuşmaktadır.

Yapılması gereken nedir? Tabii ki 3000 Hz’lik ses üretmek ve bunun rahatsız ediciliğini test etmek.

Hemen bir Emacs oturumu açılır, güzide algoritmik besteleme sistemi Common Music devreye sokulur. Denir ki ey Common Music, ey Common Music, söyle bana 3000 Hz denen şey MIDI babında neye karşılık gelmektedir? Bilgisayarın henüz insan dili anlamadığını gören ve “Lisp ile o kadar müzik altyapısı kurmuşsun, bi doğal dil arayüzü yazmamışsın, peh!” diye ukalalık eden blog yazarı (sıkıyorsa sen yazsana …ük!) aletle anladığı dilden yani Lispçe konuşmaya karar verir:


CM> (keynum 3000 :hz #t)
102.23265

İşleç yanıp sönmekte, bilgisayar soğukkanlı bir şekilde cevabı, görüntüyü saniyede 60 kere güncellemektedir (gözü kör olsun parasızlığın, bu Philips 107T5 1280×1024′te ne zaman 60 Hz’in üzerine çıkabildi ki gecenin 2′sinde çıksın!). Common Music demektedir ki 3000 Hz, MIDI klavyenin 102.23265 numaralı tuşuna yani yazı ile


CM>  (multiple-value-bind (int fraction) (round (keynum 3000 :hz #t))
          (format t "~r point ~r" int (truncate (* 100000 fraction))))

one hundred two point twenty-three thousand two hundred sixty-five

NIL

evet, yüziki virgül yirmiüçbinikiyüzaltmışbeşinci tuşuna karşılık gelmektedir. Ve evet, tabii ki piyanoda böyle bir tuş filan yoktur!

Bir kez bilim uğruna feda tadını yakalamak için yanıp tutuşmasın bu deli gönül, asla pes etmek yoktur. Öyle bir piyano tuşu olmayabilir ama ses illa oradan bir yerden çıkacaktır. Hemen lazer kalkanları devreye sokulur ve komut verilir:


(define isitsel (new midi
                  :time 0
                  :keynum  (keynum 3000 :hz #t)
                  :amplitude 1.0
                  :duration 2.5))

(events isitsel "tez.mid")

Emacs ortamında C-c C-c ile fonksiyon çalıştırılır ve hoparlörden bir hayli tiz bir piyano sesi gelir. Kulak hoparlöre yaklaştırılır (hoparlörün kulağa yaklaştırılmamasının sebebi blog yazarının laz olması değildir, kablosal bir kaos hüküm sürmektedir masanın karanlık yüzünde (hayır Pink Floyd’u o kadar sevmiyorum, dalga geçmek için yapıyorum bunu)) ve mütemadiyen çınnnn çınnnnnn sesleri dinlenir. Sonra hasar kontrol raporu merkeze iletilir. Görünürde bilime kurban gitmiş bir blog yazarı yoktur.

Hemen pes edilecek midir? Elbette hayır! Belki piyano sesi o kadar rahatsız etmemektedir ama ya sinüsoidal basit bir dalga belli bir dB şiddetinde 3000 Hz frekans ile üretilirse ne olacaktır? Kulak zarı patlayacak, kan gövdeyi götürecek ve ortalık berbat olacak mıdır?

İkinci bir kontrollü deney yapmanın zamanı gelmiştir. Bu sefer devreye efsanevi ses sentezleme sistemi (donanımsal synthesizler halt etmiş yanında hesaabı) CSound devreye girmektedir (blogdaki tarihi bağlamı için buraya bakınız). Evrensel işletim sistemi, programcı dostu işletim sistemi Debian GNU/Linux üzerinde apt-get csound komutu ile hemen CSound yüklenir.

Hemen basit bir ORChestra dosyası:


instr 1

    a1	oscil	10000, 3000, 1

	out	a1

endin

ve bunu kullanan bir SCOre dosyası oluşturulur (tabii ki gerçek bir programcı editörü olan Emacs ve CSound desteği ile yani kısaca böyle (yahut şöyle)):


f1  0	16384	10  1	; use GEN10 to compute a sine wave

;ins	strt	dur
i1	0	1

e			; indicates the end of the score

ardından csound -W deneme.orc deneme.sco komutu verilir ve üretilmiş olan .wav ses dosyası play test.wav ile çalınır. Kulak tekrar hoparlöre yapıştırılır ve mütemadiyen 3000 Hz’lik bu sinyale maruz bırakılır. Ardından hata raporu alınır. Müzikal estetik açısından irite olan bünye fiziksel olarak bütünlüğünü korumaktadır.

Test başarı ile tamamlanmıştır.

Bu stresli denemelerin ve kulak örselenmesinin ardından biraz CSound besteleri besteleri ve CSound Internet Radio hayranlıkla dinlenir.

Artık bilim dünyasındaki maceraya bir süre ara verip, teknolojik sanatsallığın doruklarında gezinmeyi bırakıp biraz da eski üstadlara kulak vermenin zamanı geliyor da geçiyordur. Hemen gerekli tedbirler alınır ve XMMS marka pikaba bir Jackie McLean kaydı konur. Güzel alto saksofoncu insan McLean’in 1957 yılı Prestige kaydı Strange Blues dönmeye başlar. Kontrbas girişinin üstüne binen alto saksofon “sound”u (ses deyince deyince aynı manayı vermiyor mirim ameleliği yine bir başka röportaj cevabına itina ile saklanmaktadır).

Kimdir Jackie McLean?

1931′de doğdu. Küçük yaşta müzikle ilgilenmeye başladı. 19 yaşına geldiğinde Miles Davis’in Dig albümünde çalıyordu. Aynı albümde yer alan bir başka dev saksofoncu Sonny Rollins idi. Jackie McLean yaklaşık 1.5 ay önce, 31 Mart 2006 tarihinde hayata gözlerini yumdu. Mavi gezegeni terk etti. Yarattığı mavi notalar uzayında süzülen ses dizileri genç saksofonculara ilham kaynağı olmaya, örnek teşkil etmeye devam edecek.

McLean 1957 yılında bir garip blues çalar iken “orada bir yerde” kalın gözlüklü bir matematikçi, bir bilgisayar bilimci, bir mantıkçı olan John McCarthy, lambda calculus şekilciliğinden (formalizm deyince aynı anlamı veriyor mirim) yola çıkarak Lisp programlama dilini tasarlamak ve ilk denemeleri gerçekleştirmekle meşguldü. Yaklaşık 50 sene sonra, Türkiye denen ülkenin başkenti Ankara’daki yerel GNU/Linux Şenliğinde, COR3 grubu tarafından epey eğlenceli bir Common-Lisp ile Yazılım Geliştirme sunumu ve ardından Chris Stephenson tarafından Lambda Calculus Programlama Dili sunumu gerçekleştirilecektir. (Common Lisp sunumu ile ilgili detaylar için bkz. http://www.core.gen.tr/slides/CommonLisp-Sunum.pdf ve http://www.core.gen.tr/slides/CommonLisp.pdf.)

Müzik, bilgisayar bilimleri ve yazılım geliştirme paralel evrenlerinde bunlar olurken edebiyat ve sinema paralel evrenlerinde de başka olaylar cereyan etmektedir (elektrik dersek aynı manayı vermiyor mirim!). Nasıl mı? Bakınız 1001 Gece Masalları, 1. cilt, sayfa 944, Kamerü’z-Zaman ile Prenses Bedrü’l-Büdur Öyküsü:

“… Kamerü’z-Zaman yaşlı bahçıvana ‘Lakin, tüm bu halkın, böylesine asık suratla ve buz gibi soğuk bir tavırla görünmeleri ve de konukseverlikten uzak davranmaları nedendir?’ diye sormuş. İyi yürekli ihtiyar ‘Allah’a şükürler olsun ki oğlum, seni onların elinden sağ salim kurtarmış! Bu kentte oturanlar Batı’nın kara topraklarından gelmiş işgalcilerdir; bir gün deniz yakasından gelerek birdenbire karaya çıktılar ve kentimizde oturan tüm Müslümanları kıyıma uğrattılar. Bunlar olağanüstü ve anlaşılmaz şeylere taparlar, karanlık ve garip bir dil konuşurlar ve kötü kokan, örneğin kokmuş peynir ve bayat av eti gibi çürümüş şeyler yerler; asla yıkanmayı bilmezler çünkü doğdukları zaman karalar giymiş çok çirkin kişiler tarafından başları suyla yıkanır ve garip tavırlara eşlik eden bu yıkanış, ömürlerinin geri kalan günleri için öteki her türlü yıkanmaları ortadan kaldırır…”

Efendim? Biri 13. Savaşçı mı dedi? Antonio Banderas mı dedi, Ahmed Ibn Fahdlan Ibn Al Abbas Ibn Rashid Ibn Hamad mı dedi, Buliwyf mı dedi? Hayır bunun paralel evrenlerle tabii ki ilgisi yok. Yazının başında uyarmıştım. Bitti… FIN… The End…

Not: Az önce irc.freenode.net sunucusundaki #fazlamesai kanalında şöyle bir diyalog geçti:

<anhanguera> selam
<anhanguera> otubusteyim su an, istanbuldan ankaraya gidiyorum
<anhanguera> teknoloji denilen sey manyak bir olay
<rahmetli> slm bende arka koltuktayim.
<anhanguera> hahah
<rahmetli> :)
<t -u-N-i-X> :)
<t -u-N-i-X> alper ?

Tabii aniden kanaldan çıkınca insan bir an telaşlanıyor, kazaya kurban gitti bizim Xynth geliştiricileri ve de Xynth Pencere Sistemi sunumu diye endişeleniyor. Neyse ki otobüs firması sağlammış, kaza durumu yokmuş :)

 
 

6 Feet Under: Nessun dorma – 7 Mayıs günü batan güneşler anısına


Herkese tavsiye edemeyeceğim türden bir dizi: 6 Feet Under.

Dizide karşıma çıkan bir parça, herkese tavsiye edebileceğim türden: Nessun Dorma.

İlk kez 16 yıl önce kulaklarımla buluşmuştu üstadın şaheserinin bu en güzel aryası.

Kimse uyumasın! Kimse uyumasın! Zafer benim olacak güneş doğduğunda…

Yatmadan önce defalarca dinliyorum. Uyumadan önce. Batan güneşlerin anısına: Atıf Yılmaz, Erdal Öz ve 7 Mayıs tarihinde yitirdiklerimiz için… Işıkları genç kuşakların yolunu aydınlatsın!

 
Leave a comment

Posted by on May 8, 2006 in General, Music

 

Smalltalk: Bir IDE, bir video, bir dil


Herhalde bunu en iyi Common Lisp + Emacs + SLIME ile uğraşmış olanlar anlayacak ve takdir edecektir: Smalltalk geliştirme ortamı videosu.

Konu ile ilgili birkaç link: Demo video of the Smalltalk IDE, The Power of Smalltalk IDE’s, Jumping the Shark, Today’s (Smalltalk) IDE’s, Are we live, or deadorex?

 
Leave a comment

Posted by on May 8, 2006 in General, Programlama

 

Biten kitaplar, test-driven development, MDA, NHibernate, NetLogo


İki sıkı kitap: Mike Gunderloy‘dan Coder to Developer: Tools and Strategies for Delivering Your Software ve Kent Beck‘ten Test-Driven Development: By Example.

Birinci kitap kodlamanın ötesinde bir yazılım geliştirme sürecinin detaylarına dair somut örnek üzerinden bilgi verirken, Beck’in kitabı çok daha temel bir konuya eğiliyor. Gunderloy, kitabında, haklı olarak sürecin tamamına yakınını aktarıyor ve “unit testing” kavramına kısaca değiniyor. Beck ise, alanın kurucularından biri olmanın getirdiği sorumluluk ile adım adım test-driven geliştirme ve unit testing pratiklerini aktarıyor. (İki kitabı çok kısa aralıklarla okumuş olmak benim açımdan iyi oldu.)

Bu bağlamda gündeme gelen birkaç kavram daha var: Model-driven architecture ve Code coverage.

Birim testleri geliştirirken testlerin kendilerine dair de bir ölçü elde edebilmek ve daha da güven kazanmak açısından “code coverage” önemli. Yardımcı araç olarak NCover ve Clover.NET‘i incelemeyi planlıyorum.

“Model-driven architecture” tarzı tasarımdan koda geçiş için ise AndroMDA denen açık kodlu ürüne vakit ayırmak lazım. Hazır bu aralar yoğun olarak NHibernate ile uğraşıyorken ve AndroMDA da UML modellerinden NHibernate eşleştirmelerini ve veritabanı şemalarını üretebildiğini iddia ediyorken.

Test-driven geliştirme için yine vakit ayrılması gereken bir araç da: TestDriven.NET

Sıradaki kitaplar: Hibernate in Action ve Hibernate: A Developer’s Notebook.

Bunlar olurken bir yandan NetLogo ile uğraşmaya devam. Yurtdışında sosyal ağlar ve organizasyon teorisi üzerine yüksek lisans yapan bir araştırmacının için şirket içi problem çözme ve iletişim konusundaki modelini NetLogo ile uygulamaya çalışma maceram devam ediyor. Bir kez daha karşıma Lisp zihniyeti çıkıyor. Şikayetçi olduğum söylenemez! ;-)

Not: Kent Beck, kitaptaki örneklerin %90′ını Java ve bir kısmını da Python ile veriyor. Arada sırada “aslında şimdi Smalltalk, Smalltalk IDE ve Refactoring Browser olsa idi işler şöyle kolaylaşırdı, böyle kolaylaşırdı demekten kendini alamıyor. Sanırım ne demek istediğini biraz anlıyorum.

 
Leave a comment

Posted by on May 7, 2006 in General, Programlama

 

Çıkarın kağıdı kalemi yazılı var! Quiz zamanı…


Zamanı gelmişti. Perl Quiz vardı, Ruby Quiz vardı, Common Lisp’in ne eksiği vardı?

UnCommon Web‘in geliştiricisi Baringer bu makus talihe, bu gidişata dur dedi ve CL QUIZ‘i başlattı.

İlk soru metin tabanlı CAPTCHA üreten bir fonksiyon geliştirmek ile ilgiliydi.

Eğlenceli çözümler geldi.

İkinci soru ise Common Lisp’in programlanabilir bir programlama dili olma özelliğinin uç noktaya dek zorlanması ile ilgili ;-) Bunun çözümü için tabii her zaman olduğu gibi comp.lang.lisp‘ten kopya çekmek mümkün ;-) Bir başka öneri ise cl-infix paketinin kaynak kodlarına bakmak olabilir.

 
Leave a comment

Posted by on May 6, 2006 in General, Lisp, Programlama

 

ECLM 2006: Meğer neler kaçırmışız!


“… Please don’t assume Lisp is only useful for Animation and Graphics, AI, Bioinformatics, B2B and E-Commerce, Data Mining, EDA/Semiconductor applications, Expert Systems, Finance, Intelligent Agents, Knowledge Management, Mechanical CAD, Modeling and Simulation, Natural Language, Optimization, Research, Risk Analysis, Scheduling, Telecom, and Web Authoring just because these are the only things they happened to list. ” — Kent M. Pitman

ECLM 2006 yani European Common Lisp Meeting 2006 geçti gitti. Neler kaçırmışız neler: AllegroGraph & semantic web, time series analysis for financial markets, electronic design automation, QPX: Low fare search engine, Signal Processing: SigLab.

Karmaşık bilgi işlem problemlerinin çözümleri için geliştirilen araçlarda bir kez daha Common Lisp’in tercih edildiğini görüyoruz. Bir ihtimal sonraki ECLM İstanbul’da olabilir. Her ne kadar bu seneki ECLM 2006′ya sadece tek bir Türk yazılımcı katılmış olsa da Avrupa’daki Common Lisp uzmanlarının İstanbul’da düzenlenecek bir ECLM etkinliğine epey sıcak ve hevesli baktıkları kulağıma çalındı ;-) Bu uzmanları kendi şehrimde görmek ve bilgilerini paylaşırken izlemek isterdim.

ECLM ile ilgili diğer bloglar: ECLM 2006 report, Diary for crhodes, Back from ECLM 2006, ECLM2006 Wrap-up, eclm2006: the dinner, ECLM2006: better late then never

 
Leave a comment

Posted by on May 6, 2006 in General, Lisp, Programlama

 
 
Follow

Get every new post delivered to your Inbox.

Join 53 other followers