Amatör Telsiz Özgür Yazılım Günlerinde

TuxHam_blog.jpg (200×173)Bilenler bilmeyenlere anlatsın. Linux Kullanıcıları Derneği ve İstanbul Bilgi Üniversitesi Bilgisayar Bilimleri Bölümü tarafından ortaklaşa gerçekleştirilen Özgür Yazılım ve Linux Günleri 30-31 Mart 2012 tarihinde İstanbul Bilgi Üniversitesi Dolapdere Kampüsü’nde gerçekleştirilecek.

2 gün sürecek olan etkinlikte Telsiz ve Radyo Amatörleri Cemiyeti (TRAC) orada bulunacak. Cumartesi günü de  amatör telsizcilik ve linux konusunda kısa bir konuşma yapacağım. Linux veya amatör telsiz konusuna ilgi duyan herkesi bekliyoruz!

 

Etkinlik anasayfasına buradan, etkinlik programına ise buradan ulaşabilirsiniz.

73! DE TA1AET

(Fotoğraf: http://www.linuxjournal.com/content/amateur-radio-forums-now-tech-support-i-hope)

Reklamlar

IstStatus Servisinin Susturulması ve Güvenlik Anlayışımız

Dün birçok havacılık meraklısı insanın yanısıra otellerin ve havayolu şirketlerinin çeşitli havalimanlarına iniş yapacak olan uçakları görebildikleri, kule ile aralarında olan telsiz konuşmalarını dinleyebildikleri iststatus.com kapatıldı. Kapatılma sebebi ise “güvenlik”. Devlet Hava Meydanları İşletmesi, VIP uçakların içerisindeki yolcuların, uçak kodunun, havadaki pozisyonunun herkes tarafından açık olarak görülmesinin bir güvenlik zaafiyeti oluşturduğunu düşünmüş ve öyle görünüyor ki teröristlerin bir saldırı yaparak uçağı düşürmelerinden korkarak kapatılmasını sağlamış [0]. Bu düşünce tarzının yanlış olduğunu, kafamıza kuma gömmek olduğunu ve doğru olanın ne olduğunu bir şekilde DHMİ’ye anlatmak gerekiyor.

Konuyu daha iyi anlayabilmek için iststatus.com ‘un bu servisi nasıl sağladığına fazla teknik detaya inmeden bir bakalım. Radar sistemlerinin nasıl çalıştığını hepimiz az çok biliyoruz. Bir radar sinyali göndererek objelerden seken sinyali işleyip bu objelerin bize olan uzaklığını hesaplayarak objelerin konumunu belirleyebiliyoruz. Havacılıkta bu radara Birincil Radar (Primary Radar) deniyor ve genel olarak yedek olarak kullanılıyor. Ancak şöyle bir sorun mevcut, uçakların kuleye olan uzaklık bilgisinin yanısıra yerden olan yüksekliği, uçak kodu gibi bilgilerin de bilinmesi gerekiyor. Bunun için birincil radar yetersiz kaldığı için İkincil İzleme Radarı (Secondary surveillance radar) kullanılıyor. Basit olarak her uçak gerekli bilgileri içerisinde barındıran bir alıcı/verici (transponder) taşıyor. İkincil izleme radarı bir sinyal gönderip bilgi istediği zaman uçaklarda bulunan bu alıcı/verici gerekli bilgiyi kodlanmış (şifrelenmiş değil) bir biçimde 1090 MHz‘den yayınlıyor.  DHMİ’nin söylediğinin aksine şunu belirtmek gerekir ki bu bilgi uçağın içerisindeki yolcu bilgilerini kapsamamaktadır.

IstStatus‘un yaptığı şey zaten herkes tarafından görülebilen, şifrelenmemiş ve 1090 MHz’de gönderilen veriyi anlamlı bir veri haline getirip 3 dakika gecikme ile insanlara sunmak. Telsiz konuşmaları da tek bir kanal değil, birden fazla kanal dolaşılarak veriliyor. Bu kanallar, benim bildiğim kadarıyla, yer, yaklaşma, ve kule. Burada konuşulanlar ise tamamiyle havacılıkla ilgili ve anormal bir durum olmadığı sürece “TK 321, yüksekliğini aaa’ya çıkar, hızını bbb’ye düşür, baş kısmını da ccc’ye yönelt” şeklinde ve herhangi bir önemli bilgi içermiyor. Tekrar hatırlatmak gerekiyor ki bu telsizler de herkes tarafından rahatlıkla dinlenebilir.

IstStatus türünün tek örneği değil tabi ki. Dünyanın birçok yerinde, görünüllü insanlar evlerinin çatılarına basit bir telsiz anteni ve az önce bahsettiğim 1090 MHz’de yayınlanan veriyi anlamlı hale getirecek cihazı koyarak (ADS-B Receiver) insanlara havaalanında neler olduğunu sunuyor. Bunun çeşitli yararları mevcut. Birincil olarak havacılıkla ilgilenen çeşitli insanlar kuleyi takip ederek muhabere konusundaki bilgilerini genişletiyorlar. Bu, aynı zamanda kulede ya da uçakta meydana gelen bir olumsuzluk durumunda otokontrol sağlıyor. Bir diğer yararı ise oteller ve misafirlerini havalimanında karşılayacak olan oluşumlar bu sayfayı takip ederek uçağın nerede olduğuna bakarak araçlarını zamanında çıkarıyorlar ve havalimanındaki gereksiz trafik engellenmiş oluyor. Bunu, iststatus kapandığından beri Atatürk Havalimanında yaşanan araç trafiğinden anlayabiliriz.

Herhangi bir terörist eylemi gerçekleştirme planı olan bir insan, 3 dakika gecikme ile aldığı bilgiyi kullanmayacaktır ve daha sofistike düşünmesi gerekir. Elinde yaklaşık olarak 400-500€ maliyeti olan ADS-B alıcısı olan bir insan bu bilgileri zaten görebilecektir. Şu anda alınan karar kafamızı kuma gömmekten başka bir şey olmamakla birlikte otokontrolü ve havacılık meraklılarının çalışmalarını engellemektedir. Öyle görünüyor ki kuledeki insanlar ve DHMİ, bu otokontrolden rahatsız oluyorlar. Dilerim ki havacılık meraklıları, telsiz meraklıları ve bir şekilde iststatus’den yararlanmış insanlar bu konunun peşini bırakmaz.

[0] http://www.airporthaber.com/iststatus-susturuldu–36590h.html

Nasıl Sıralama Analizi Yapılmaz

Veri Yapıları ve Algoritmalar (COMP231) dersinin bu haftaki projesinde sıralama algoritmalarının implementasyonu ve analizi yapılması istendi. Proje Quick sort ile beraber ders kitabı olarak kullandığımız Cormen’in Introduction to Algorithms kitabındaki Merge sort algoritmasının yazımını bize bırakmış ve Insertion sort ile beraber birtakım yardımcı fonksiyonları hazır olarak vermişti.

Güzel bir pazar günü başlangıcında quick sort’u yazıp diğer kısımlarını akşama bırakmış idim. Sanırım eğlence akşam vaktini bu işe ayırmamla başladı. Gece 10.30 – 3.30 arası Cormen’in Merge sort algoritmasını yazmakla,  toplamda 4 tane algoritmanın analizini yapıp anlamlı veri elde eden programcığı yazmakla ve gnuplot öğrenmekle geçti. Sonunda gnuplot ile sonucu elde ettim ancak twitter’da bahsettiğim üzere bir problem vardı. Gecenin o vaktinde artık ekrana bakacak halim kalmadığı ve proje teslimine 5 saat kaldığı için projenin o hali ile gönderip sabah labda bakmaya karar verdim.

Sabah problemi reb’e söylemem ile beraber durumun hocaların bulunduğu e-posta listesine atılması bir oldu :) Şimdi bulduğum sonucu ve olması gereken sonucu yan yana koyalım.

İlk analizde görüyoruz ki harika bir gariplikte O(n^2) çalışması gereken insertion sort O(n) çalışmakta. Normalde O(n . lgn) çalışması gereken merge sort neredeyse O(n^2) çalışıyor gibi görünüyor.

Tabi ki hata bu veriyi üreten kodda meydana geliyor. Sıralama algoritmalarının çalışmasında herhangi bir sıkıntı mevcut değil. Sakin kafa ile düşününce anlıyoruz ki durum tamamiyle mutation, yani bir dizinin (array) ortak kullanımından kaynaklanıyor. Alınan kahve oranı ve gecenin ilerleyen saatleri ile yazılan kod kalitesi arasında bir ilişki olabileceğini düşünürsek ilk veriyi üreten kodun kirli bir biçimde yazıldığına şaşırmamak gerek. Kod tek bir liste alıp o liste üzerinde tek tek sıralama algoritmalarını çalıştırıyor. Yani ilk sıralamadan sonra elimizde sıralı bir liste oluyor ve devamındaki 3 algoritma sıralı liste üzerinde sonuç veriyor. Durum böyle olunca, insertion sort çalışması gereken bir biçimde sıralı liste üzerinde O(n) zamanda çalışıyor. Merge sort sıralanmamış liste üzreinde ilk olarak çalıştırıldığı için onun dışındaki diğer algoritmalar da aynı şekilde sıralı listeler üzerinde sonuç veriyor.

Sabah veri üreten programığı düzgün bir biçimde yazdıktan sonra doğru olan yukarıdaki sonuçları elde ettim. Sağda görüldüğü üzere insertion sort O(n^2) zamanda çalışıyor ve diğer algoritmalar yok denecek kadar az bir sürede işlemi tamamlıyor. Soldaki grafikte ise kalan algoritmaların analizi mevcut. Görüldüğü gibi 25.000.000 elemanlı listeye kadar analizi mevcut ki bu kadar büyük bir rakamda insertion sort’u beklemek çok uzun süreceği için çıkarmak zorunda kaldım.

Yanlış veriyi üreten programcığı buradan görebilirsiniz. Farkedeceğiniz üzere getAnalysis metodu tek bir liste üzerinde işlem yapmakta. Düzgün ve temiz haline ise buradan ulaşılabilir. getAnalysis artık bir metod ve liste alarak, önce listeyi kopyalıyor, ardından da zamanı döndürüyor. Bu işlemi 4 algoritma için tekrarlayıp zamanlarını aldıktan sonra dosyaya yazdırıyorum.

Ne öğrendim? 

Temel olarak yorgunken bir problemin içinden çıkılamadığında dinlenilmesi gerektiğini öğrendim. İşin teknik kısmında ise mutation konusunda dikkatli olunması gerektiğini, sıralama algoritmalarının nasıl davrandığını düzgün bir biçimde aklımda yazdım. Tabi sonucunda bölüm içerisinde eğlence konusu olmam ve “Eren The Sorter” olarak adlandırılmamın kaçışı olmadı :)

Not: Grafikleri geç bir saatte oluşturduğum için yazım yanlışı yaptım. Grafiklerin sadece başlığının düzeltilmiş hali ile uğraşacak ve görselleri tekrar yükleyecek gücü bulamadığım için grafikleri okurken comprasion kelimesini comparison şeklinde okumanızı rica ediyorum efem.

Kısa Yoldan Dosya Paylaşmak İstiyorsanız

Ofis içerisinde, ya da evinizde bir bilgisayardan diğerine dosya almak istiyorsunuz diyelim. Bunun için Samba, Scp (secure copy), FTP gibi yöntemler mevcut ancak bunların önceden ayarlanması ve üzerinde zaman harcanması gerekiyor. Bunun yerine basit olarak bri dizindeki dosyaları HTTP üzerinden sunmaya yarayan ve python ile beraber gelen basit bir sınıf mevcut, SimpleHTTPServer.

Tek yapmanız gereken bir konsol açmak ve dosyalarını paylaştırmak istediğiniz dizine girmek. Sonrasında konsola python -m SimpleHTTPServer 8080 yazarak o dizindeki dosyaları 8080 numaralı porttan sunmaya başlayabilirsiniz.

Amatör Telsiz CEBIT’te!

6-9 Ekim’de TÜYAP’ta gerçekleşecek CEBIT etkinliğinde ben de dahil olmak üzere birkaç amatör telsizci aktif katıılmcı olacağız. AMD Geode platformu ile beraber Pardus üzerinde çalışan amatör telsizcilik yazılımları ve bunların uygulamalarını sergileyeceğimiz Pardus standımıza hepiniz davetlisiniz. Eğer RoIP (Radio Over Internet Protocol), APRS (Automatic Packet Reporting System) ve genel anlamda amatör telsizciliğe meraklıysanız, standımıza gelmenizi tavsiye ederim. CEBIT’te görüşmek üzere!

Sn. Huzeyfe ÖNAL’a Açık Mektup

Sn. Huzeyfe ÖNAL,

Anonymous konusunda birçok yerde çeşitli haberler çıktı. Kimimiz bu
oluşumu yeni duydu, internet teknolojileri alanında çalışan insanlar
olarak bazılarımız da onları Sony, Wikileaks vb. gibi operasyonlarda
yakından takip etti.

Öyle görünüyor ki, siz de Anonymous konusunda röportaj verecek kadar
yakından takip etmişsiniz ve bu konuda bilgi sahibisiniz. Röportajınızı
aynen alıntılıyorum;

Anonymous’un anlık mesajlaşma kanalında gruba destek veren çok sayıda
Türk ile karşılaştık. İdeolojik söylemleri ile yurt dışındaki binlerce
Anonymous taraftarını Türkiye’ye karşı kışkırtan bu kişiler, bazı önemli
hedeflere saldırılması önerisinde bulundu.

İlk büyük saldırılarını bugün saat 18.00’de gerçekleştirmeyi planlayan
grup, 12 Haziran akşamı da YSK’nın sistemini etkisiz hale getirmeye
çalışacak. Bu sayede büyük yankı uyandırmayı ve seçime şaibe düşürerek
devlet kurumlarını yıpratmayı amaçlayan hackerlar, saatlerce sisteme
veri girişini engellemeyi hedefliyor. [0]

Anladığım kadarıyla irc.anonops.li #opturkey kanalındaki konuşmalardan
bahsediyorsunuz. Orada bir siyasi partiye saldıralım, YSK’ya saldıralım
vs. diyen kişilerin daha Anonymous’un ne olduğundan haberdar
olmadıklarını siz de ben de tahmin edebiliriz. Dikkat ettiniz mi
bilmiyorum ancak Anonymous oluşumu o kanalda ve diğer birçok yerde de
hiçbir politik, dini, ırkçı yaklaşımları olmadığını belirtmiştir. Zaten
sonrasında gönderdikleri bildiride, iddialarınızın hepsi
yalanlamışlardır. [1]

Bu noktada benim aklıma 2 olasılık geliyor. Ya gerçekten Anonymous oluşumunu
yakından takip etmediniz, ya da yukarıda belirtilen IRC kanalında
söylenen “bu politik değil, amacımız sadece *SANSÜR* konusuna dikkat
çekmek” cümlelerini kaçırdınız.

Bu noktadaki tek sorum şu: böyle bir zamanda, güvenilir
kaynaklara dayanmadan, bu şekilde bir iddiayı nasıl ortaya
koydunuz ve bu açıklamadaki amacınız ne idi?

[0] http://www.gelecekonline.com/metin/huzeyfe_onal_siber_saldirinin_hedefi_12_haziran-11757
[1] http://www.ntvmsnbc.com/id/25221300/

Teşekkürler,
Eren TÜRKAY

1 Mayıs 2011

1 Mayıs 2011 yaklaşıyor. Geçen sene LKD ve BITDER ile beraber çok sayıda denilemeyecek bir katılımla  güzel bir 1 Mayıs geçirmiştik. Umuyorum bu sene daha fazla katılım gerçekleşir ancak şimdiye kadar  bloglarda ya da başka ortamlarda konu hakkında bir haber duy(a)mamak beni biraz üzdü doğrusu.

1-2 Nisan Özgür Yazılım ve Linux Günleri‘nde konuşulabilecek konu olarak bunu da hatırlamakta yarar  var. Özgür Yazılım ile ilgilenen insanlar olarak yüzyüze konuşmanın ve birbirimizle tanımanın organize olmamızda yardımcı olacağını düşünüyorum.

Linux Günleri’nde ve 1 Mayıs’ta görüşmek üzere!

Map, Fold, Lambda ve Fonksiyonel Programlama Üzerine

Giriş

Son 5 aydır eski adı ile PLT-Scheme, yeni adı ile Racket kullanarak problemler çözüyor ve fonksiyonel programlamanın güzelliklerini görüyoruz . Her programcının hayatının belli bir bölümünü fonksiyonel programlama ile geçirmesi gerçek anlamda çok yararlı oluyor ve düşünce yapısını değiştiriyor. Bu konu farklı bir blog girdisinin konusu olacağı için konuya fazla eğilmeden başlıkta da belirttiğim şeyler hakkında bir şeyler karalamayı planlıyorum.

Bu blog girdisinde map, fold ve lambda’nın ne olduğuna ve nasıl çalıştığına değinip, bunları kullanarak çözülebilecek güzel bir problem yazacağım. Bahsedilen fonksiyonlar birçok programlama dillerinde mevcut ve hepsinin altında yatan mantık aynı. Yazının daha rahat anlaşılır olabilmesi adına Racket’in sözdizimine değinmek yararlı olacak. Genel olarak Racket’a giriş, high-order fonksiyonların tanımı üzerine yoğunlaşan bir yazı olacak.

(Kodların renklendirilmemesinden ötürükusura bakmayınız. Anladığım kadarıyla WordPress Racket için kod renklendirmesi desteklemiyor)

Racket, infix prefix notation diye tabir edilen, prosedürlerin önce geldiği, sonrasında parametrelerin yer aldığı bol parantezli bir dil. Tipik bir toplama işlemi

(+ 2 3)
(+ 2 3 4 5 6)

şeklinde yapılıyor. Burada +, iki veya daha çok sayı cinsinden parametre alabilen ve sayıların toplamını döndüren bir fonksiyon. Tıpkı matametikte olduğu gibi, iç içe geçmiş fonksiyonlar da yazabiliyoruz. 3 4 ve 5 sayılarını toplayıp, sonrasında elde edilen rakamı 2 ile çarpmak istersek;

(* 2 (+ 3 4 5))

yazmamız yeterli olacaktır. Bir fonksiyon tanımlamayı define prosedürü ile yapıyoruz. iki parametre alan ve bunları birbiri ile çarpan basit bir fonksiyonu aşağıdaki gibi tanımlayabiliriz.


(define (carp bir iki)

(* bir iki))

Daha fazlası için How to Design Programs kitabını okuyabilirsiniz. Şimdilik bu kadar işimizi görecek.

Lambda

Yukarıda, bir fonksiyon tanımladık ve buna bir isim verdik. Ancak her fonksiyona bir isim vermek zorunda mıyız? Hayır. Lambda bu noktada işimize yarıyor. Lambda’yı bize bir fonksiyon döndüren anonim bir fonksiyon olarak adlandırabiliriz. Örneğin bir parametre alan ve bunun karesini döndüren bir fonksiyon elde etmek istiyorsak


(lambda (x) (sqr x))

yazmamız yeterli olacaktır. Bu yukarıda yaptığımız toplama işlemindeki gibi kullanabiliriz. Hatırlayın, prosedürler önce ve parametreler sonra geliyor. Eğer lambda bize bir fonksiyon döndürüyorsa, bu fonksiyonu direkt olarak çağırabilir ve işimizi halledebiliriz. Öyleyse;

((lambda (x) (sqr x)) 2)

bize 4 sonucunu verecektir. Lambda, high-order fonksiyonları kullanırken çok işimize yarayacak. Devam etmeden önce bildiğiniz bir programlama dilini kullanarak bunun üzerinde biraz pratik yapmanız yararlı olacaktır.

High-Order Functions

High-order fonksiyonlar, genel olarak, en azından parametre olarak bir fonksiyon alan veya çıktı olarak bir fonksiyon döndüren fonksiyonlardır. Fonksiyonumuz bir veri almak yerine, bir fonksiyon alabilir ve bununla harikalar yaratabiliriz. İşte Racket’taki map, foldr, foldl, filter gibi fonksiyonlar bu kategoriye girer. Diğer programlama dillerinde de map, fold ve filter mevcut.

High-order fonksiyonlar, listeleri işlemede bize büyük kolaylıklar sağlıyor.  Map, listedeki her eleman üzerinde işlem yaparak, işlem sonrasında çıkan sonucu bir liste halinde döndürür. Filter ise, her eleman üzerinde işlem yaparak, bizim belirttiğimiz kurallara uyan liste elemanlarını seçip, bir liste döndürüyor. Adından da anlaşılacağı gibi, belli bir koşula bağlı olarak liste elemanlarını filtreliyor.

Biraz daha açacak olursak. Map, kendisine ilk parametre olarak, tek bir parametre kabul eden ve sonuçta bir şey döndüren bir fonksiyon alıyor, ikinci parametre olarak da üzerinde bu fonksiyonun uygulanacağı liste alıyor. Sonrasında, listenin her elemanını teker teker alıp, o fonksiyona parametre olarak veriyor, fonksiyondan dönen sonucu yeni bir liste halinde bize sunuyor. Listedeki her sayıyı bir arttıran bir map ifadesi şu şekilde yazabiliriz;


(map (lambda (parametre) (+ 1 parametre)) (list 1 2 3 4 5))

Burada dikkatinizi lambda’ya çekmek istiyorum. Map ilk parametre olarak bir fonksiyon alıyor demiştik. Bu fonksiyonu dışarıda bir yerde tanımlamak yerine, lambda ile o fonksiyonu oluşturduk ve map’e parametre olarak verdik. İstersek listedeki her elemanın karesini de şu şekilde alabilirdik;


(map sqr (list 1 2 3 4 5))

Sqr fonksiyonu, bir parametre alan ve sonucunda o sayının karesini döndüren bir fonksiyondur. Burada lambda’nın ve map’in ne iş yaptığını daha iyi görebileceğinizi umuyorum. Genellikle high-order fonksiyonları kullanırken fonksiyonlar dışarıda tanımlanmaz ve lambda ile hızlı bir biçimde işlem yapılır.

Filter da map ile aynı mantıkta çalışıyor ancak kendisine parametre olarak aldığı fonksiyonun boolean bir veri, yani doğru veya yanlış döndürmesini bekler. Bunu her liste elemanının kontrolünü sağlıyor gibi düşünebiliriz. Eğer o liste elemanı fonksiyona giriyor, ve sonucunda True dönüyor ise, o eleman çıktıdaki listede yer alacaktır. (1 3 4 5 7 88) listesindeki 4ten büyük elemanları almak için aşağıdaki kodu kullanabiliriz.


(filter (lambda (x) (> x 4)) (list 1 3 4 5 7 88))



Tekrar hatırlatmak isterim. Listedeki her eleman sıra ile fonksiyona parametre olarak gönderiliyor, eğer fonksiyondan dönen sonuç True ise, sonrasında döndürülecek olan listeye ekleniyor, değilse zaten listede yer almıyor.

Fold, map ve filter’dan biraz daha karışık. Map gibi birinci parametre olarak fonksiyon alıyor ancak bu fonksiyon iki parametreli. Sonraki parametre olarak iterasyona başlamak için bir veri, ve en son olarak da üzerinde işlem yapacağı listeyi alıyor. Tipik bir foldr prosedürü şu şekilde;


(foldr (lambda (x y) (* x y)) 1 (list 2 3 4 5))

Foldr, listenin sağından başlayarak işlem yapıyor ve akümülatif çalışıyor. Buradaki mantık şu. Listeyi işlerken, fold’a verdiğimiz fonksiyonun ilk parametresi, yani buradaki “x”, her zaman listenin elemanları, “y” ise bir önceki fonksiyon çağrısından dönen sonuç. Listeyi işlemeye başlarken, fonksiyonun ilk çağrılışında, daha önce bir fonksiyon çağrısı olmadığı ve sonuç dönmediği için, “y” parametresi, fold’a verdiğimiz ikinci parametre oluyor. Yani fold başlarken, “x” 5, “y” 1 değerini alıyor ve fonksiyona giriyor. Bu fonksiyon da her iki değeri çağırıp “5” sonucunu döndürüyor. Şimdi sıra listenin ikinci elemanında. “x” parametresi 4 değerini alıyor, bir önceki çağrıdan gelen 5 sonucu da “y” değeri oluyor. İkisi çarpılıyor ve 20 sonucu çıkıyor. Sıra üçüncü elemanda. “x” 3 değerini alıyor, “y” 20 değerini alıyor ve çarpılarak sonuç 60 çıkıyor. Ve sıra geldi son elemana. Son “x” 2 değerini alırken “y” 60 değerini alıyor ve foldr fonksiyonumuz 120 değerini döndürüyor.

Basit olarak lambda, map, filter ve fold bu işlere yarıyor. Geliştirip daha farklı şeyler yapmak pratikle kazanılabilecek bir şey. Kullanım alanında sınır mevcut değil. Örnek olarak, map içerisinde fold kullanıp, çıkan sonucu filtreleyebilir ve oradan dönen liste üzerinde de işlem yapabiliriz. Bu noktada “sky is the limit” :)

Soru

Elimizde içerisinde sayı listesi barındıran bir liste olsun. Örneğin ((1 2) (3) (4 5)). Tasarlayacağımız fonksiyon da bu listeyi alıp, kartezyen çarpımlarını yine sayı listesi barındıran bir liste halinde döndürsün. Yani fonksiyonumuza ((1 2) (3) (4 5)) verdiğimizde bize ((1 3 4) (1 3 5) (2 3 4) (2 3 5)) döndürmeli.

Lakin burada bazı kısıtlamalar var. Tasarlayacağımız fonksiyon sadece map, filter, fold kullanabilir ve fonksiyonun gövdesinde “if, else” gibi ifadeler kullanmamamız gerekiyor. Sadece, high-order fonksiyonlara verdiğimiz fonksiyonlar içerisinde (lambda) “if, else” kullanabiliriz. Mümkünse google’da benzer sorular için aramayın, üzerinde düşünmek gerçekten güzel bir beyin jimnastiği oluyor.

Bunu istediğiniz programlama dilinde çözebilirsiniz. Ben Racket’da yorumları silersek normalde 12 satır, biraz sıkıştırırsak 8 satırda çözdüm ve high-order fonksiyonlar konusunda çok pratiğim olmadığı için yaklaşık olarak 2 saat vaktimi aldı. Sonuçta gayet iyi bir pratik oldu tabi. Çözdüğünüz zaman yorum olarak girmenizi gerçekten isterim. Yaklaşım ve düşünce farklarını görmek ve bunun üzerinde tartışmak yararlı olacaktır.

Her listeden bir eleman, ve küçük parçalara ayırın da ipucunuz olsun :)