arşiv

0, 2010 için arşiv

Şifreli Metin

Perşembe, 17 Haz 2010

http://www.istihza.com/blog/this-modulu-icindeki-sifreli-metin.html/ adresindeki yazıda Python’daki this modülü içinde yer alan şifreli bir metinden ve bu metnin Python yardımıyla nasıl çözüleceğinden söz ettik.

Sizce o şifreli metni, kesinlikle Python’dan yararlanmadan, sadece İngilizce bilgisi kullanarak çözme imkanı var mı? Yani diyelim ki elinizde sadece bu şifreli metin var ve bildiğiniz tek şey bu metnin İngilizce olduğu… Bir de metindeki “Gur” kelimesinin “The” anlamına geldiğini biliyoruz. Böyle bir durumda acaba bu metin nasıl çözülür?

Metnimiz şu:

“Gur Mra bs Clguba, ol Gvz Crgref. Ornhgvshy vf orggre guna htyl. Rkcyvpvg vf orggre guna vzcyvpvg. Fvzcyr vf orggre guna pbzcyrk. Pbzcyrk vf orggre guna pbzcyvpngrq. Syng vf orggre guna arfgrq. Fcnefr vf orggre guna qrafr. Ernqnovyvgl pbhagf. Fcrpvny pnfrf nera’g fcrpvny rabhtu gb oernx gur ehyrf. Nygubhtu cenpgvpnyvgl orngf chevgl. Reebef fubhyq arire cnff fvyragyl. Hayrff rkcyvpvgyl fvyraprq. Va gur snpr bs nzovthvgl, ershfr gur grzcgngvba gb thrff. Gurer fubhyq or bar– naq cersrenoyl bayl bar –boivbhf jnl gb qb vg. Nygubhtu gung jnl znl abg or boivbhf ng svefg hayrff lbh’er Qhgpu. Abj vf orggre guna arire. Nygubhtu arire vf bsgra orggre guna *evtug* abj. Vs gur vzcyrzragngvba vf uneq gb rkcynva, vg’f n onq vqrn. Vs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n tbbq vqrn. Anzrfcnprf ner bar ubaxvat terng vqrn — yrg’f qb zber bs gubfr!”

Bulmaca meraklılarına hodri meydan!… :)

Uncategorized ,

this Modülü İçindeki Şifreli Metin

Çarşamba, 16 Haz 2010

Python’daki sürpriz yumurtalar içinde en bilineni herhalde şudur:

>>> import this

Bu komutu verdiğinizde, Python’un felsefesini anlatan bir metin görürsünüz:

The Zen of Python, by Tim Peters

Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren’t special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one– and preferably only one –obvious way to do it.
Although that way may not be obvious at first unless you’re Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it’s a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea — let’s do more of those!

Ancak “this” modülü yukarıdaki metinden ibaret değildir. Bu modülün başka özellikleri de bulunur. Peki nedir bu özellikler?

Yukarıdaki çıktıyı veren “this” adlı modülün içeriğine baktığımızda şöyle bir şeyle karşılaşıyoruz:

>>> dir(this)
 
['__builtins__', '__doc__', '__file__', '__name__',
 '__package__', 'c', 'd', 'i', 's']

Demek ki “this” modülünün içinde “c”, “d”, “i” ve “s” adlı dört adet nitelik var. Ben bu yazıda sizin dikkatinizi “s” ve “d” niteliklerine çekmek istiyorum.

Önce “this” modülünün “s” niteliğini kontrol edelim:

>>> this.s
 
"Gur Mra bs Clguba, ol Gvz Crgref\n\nOrnhgvshy vf 
orggre guna htyl.\nRkcyvpvg vf orggre guna 
vzcyvpvg.\nFvzcyr vf orggre guna pbzcyrk.\nPbzcyrk 
vf orggre guna pbzcyvpngrq.\nSyng vf orggre guna 
arfgrq.\nFcnefr vf orggre guna qrafr.\nErnqnovyvgl 
pbhagf.\nFcrpvny pnfrf nera'g fcrpvny rabhtu gb oernx 
gur ehyrf.\nNygubhtu cenpgvpnyvgl orngf chevgl.
\nReebef fubhyq arire cnff fvyragyl.\nHayrff rkcyvpvgyl 
fvyraprq.\nVa gur snpr bs nzovthvgl, ershfr gur grzcgngvba 
gb thrff.\nGurer fubhyq or bar-- naq cersrenoyl bayl bar 
--boivbhf jnl gb qb vg.\nNygubhtu gung jnl znl abg or boivbhf 
ng svefg hayrff lbh'er Qhgpu.\nAbj vf orggre guna arire.
\nNygubhtu arire vf bsgra orggre guna *evtug* abj.\nVs 
gur vzcyrzragngvba vf uneq gb rkcynva, vg'f n onq vqrn.
\nVs gur vzcyrzragngvba vf rnfl gb rkcynva, vg znl or n 
tbbq vqrn.\nAnzrfcnprf ner bar ubaxvat terng vqrn -- yrg'f 
qb zber bs gubfr!"

Karşımıza anlamsız gibi görünen bir karakter dizisi çıktı… Aslında bu karmaşık ve anlamsız görünen kelime yumağının, en başta verdiğimiz “The Zen of Python” adlı metnin “şifrelenmiş” hali olduğunu az çok tahmin edebiliyoruz. Peki bundan nasıl emin olabiliriz?

Herhangi bir adım atmadan önce bir de “this” modülünün “d” niteliğine bakalım:

>>> this.d
 
{'A': 'N', 'C': 'P', 'B': 'O', 'E': 'R', 'D': 'Q', 'G': 'T',
 'F': 'S', 'I': 'V', 'H': 'U', 'K': 'X', 'J': 'W', 'M': 'Z', 
 'L': 'Y', 'O': 'B', 'N': 'A', 'Q': 'D', 'P': 'C', 'S': 'F', 
 'R': 'E', 'U': 'H', 'T': 'G', 'W': 'J', 'V': 'I', 'Y': 'L',
 'X': 'K', 'Z': 'M', 'a': 'n', 'c': 'p', 'b': 'o', 'e': 'r',
 'd': 'q', 'g': 't', 'f': 's', 'i': 'v', 'h': 'u', 'k': 'x',
 'j': 'w', 'm': 'z', 'l': 'y', 'o': 'b', 'n': 'a', 'q': 'd',
 'p': 'c', 's': 'f', 'r': 'e', 'u': 'h', 't': 'g', 'w': 'j',
 'v': 'i', 'y': 'l', 'x': 'k', 'z': 'm'}

“d” niteliği ise, anahtarları ve değerleri alfabetik karakterler olan bir sözlük barındırıyor. Gördüğünüz gibi bu sözlükte belli harfler belli harflerle eşleştirilmiş.

Bu alfabetik sözlüğün de yukarıdaki şifreli metinle bir bağlantısı olduğunu kestirmek çok zor değil. Hemen bir kaç deneme yapalım:

>>> this.d[this.s[0]]
 
'T'

Burada this.s adlı karmaşık karakter dizisinin ilk harfini this.d adlı sözlüğe anahtar olarak verdik. this.s karakter dizisinin ilk harfi “G”. Dolayısıyla şöyle bir şey yapmış olduk:

>>> this.d["G"]

Tabii this.d sözlüğünde “G” harfinin karşılığı “T” harfi olduğu için çıktıda “T” harfini aldık. O halde şöyle bir şey yazabiliriz:

>>> for i in this.s:
...     print this.d[i]

Buradan şöyle bir çıktı alırız:

T
h
e
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
KeyError: ' '

Bu çıktı bize iki önemli bilgi verdi:

Birincisi, şifreli metnin ilk kelimesini elde ettik. Buna göre ilk kelime “The”. Yani doğru yoldayız!

İkincisi, sözlükte sadece alfabe harfleri olduğu için, for döngüsü bir boşluk karakteriyle karşılaştığında doğal olarak KeyError hatası veriyor. Yani kelimeleri birbirinden ayıran boşluk karakterlerinin ve hatta satırları bitiren “yeni satır” (newline — \n) karakterlerinin icabına bakmamız gerekiyor. Bunun için şöyle bir şey yazılabilir:

>>> a = ""
>>> for i in this.s:
...     try:
...         a += this.d[i]
...     except KeyError as k:
...         a += str(k)
...
>>> print a

Burada öncelikle a adlı boş bir karakter dizisi tanımladık. Biraz sonra bir for döngüsü ile alacağımız bütün harfleri bu a adlı karakter dizisi içinde toplayacağız.

Sonraki satırda for döngümüzü yazıyoruz. Burada yaptığımız şey şu: this.s adlı karakter dizisi içindeki bütün karakterleri tek tek this.d sözlüğü içinde sorgulayıp, hepsini a adlı karakter dizisine atıyoruz. Ancak this.s adlı karakter dizisi içinde, this.d adlı sözlükte herhangi bir karşılığı olmayan boşluk ve yeni satır karakterleri de olduğu için, KeyError hatası alma ihtimaline karşı, hata veren bütün karakterleri de tek tek a adlı karakter dizisine gönderiyoruz. Böylece şifreli karakter dizisi içindeki bütün boşlukları ve satır başlarını muhafaza etmiş oluyoruz. Eğer bu boşluk ve satır başlarını a karakter dizisine göndermek yerine mesela pass gibi bir deyimle görmezden gelirsek şifreli metindeki boşlukları ve satır başlarını kaybetmiş oluruz. O zaman a adlı karakter dizisindeki bütün harfler çıktıda birbirine bitişik görüneceği için yine anlaşılması zor bir metin ortaya çıkmış olur…

Son olarak da a adlı karakter dizisini ekrana yazdırıyoruz…

Bakalım bu kodlar bize ne çıktı veriyor:

The’ ‘Zen’ ‘of’ ‘Python’,” ‘by’ ‘Tim’ ‘Peters’\n”
\n’Beautiful’ ‘is’ ‘better’ ‘than’ ‘ugly’.”\n’Explicit’
‘is’ ‘better’ ‘than’ ‘implicit’.”\n’Simple’ ‘is’ ‘better’
‘than’ ‘complex’.”\n’Complex’ ‘is’ ‘better’ ‘than’
‘complicated’.”\n’Flat’ ‘is’ ‘better’ ‘than’ ‘nested’.
”\n’Sparse’ ‘is’ ‘better’ ‘than’ ‘dense’.”\n’Readability’
‘counts’.”\n’Special’ ‘cases’ ‘aren”‘”t’ ‘special’ ‘enough’
‘to’ ‘break’ ‘the’ ‘rules’.”\n’Although’ ‘practicality’ ‘beats’ ‘purity’.”\n’Errors’ ‘should’ ‘never’ ‘pass’ ‘silently’.
”\n’Unless’ ‘explicitly’ ‘silenced’.”\n’In’ ‘the’ ‘face’ ‘of’
‘ambiguity’,” ‘refuse’ ‘the’ ‘temptation’ ‘to’ ‘guess’.
”\n’There’ ‘should’ ‘be’ ‘one’-”-” ‘and’ ‘preferably’
‘only’ ‘one’ ”-”-’obvious’ ‘way’ ‘to’ ‘do’ ‘it’.”\n’Although’
‘that’ ‘way’ ‘may’ ‘not’ ‘be’ ‘obvious’ ‘at’ ‘first’ ‘unless’
‘you”‘”re’ ‘Dutch’.”\n’Now’ ‘is’ ‘better’ ‘than’ ‘never’.
”\n’Although’ ‘never’ ‘is’ ‘often’ ‘better’ ‘than’ ”*’right’*”
‘now’.”\n’If’ ‘the’ ‘implementation’ ‘is’ ‘hard’ ‘to’ ‘explain’,
” ‘it”‘”s’ ‘a’ ‘bad’ ‘idea’.”\n’If’ ‘the’ ‘implementation’ ‘is’
‘easy’ ‘to’ ‘explain’,” ‘it’ ‘may’ ‘be’ ‘a’ ‘good’ ‘idea’.
”\n’Namespaces’ ‘are’ ‘one’ ‘honking’ ‘great’ ‘idea’
”-”-” ‘let”‘”s’ ‘do’ ‘more’ ‘of’ ‘those’!’

Bingo! Böylece şifreli metni çözmüş olduk…

Şifreli metni çözmemizi sağlayan kodları aslında şu şekilde de yazabilirdik:

>>> a = ""
>>> for i in this.s:
...     a += this.d.get(i, i)
... 
>>> print a

Gördüğünüz gibi, bu defaki çıktımız çok daha zarif…

Burada Python sözlüklerinin get() metodunu kullandık. Bu sayede try…except bloklarıyla uğraşmamıza da gerek kalmadı. get() metodunun ikinci argümanı sayesinde, sözlükte bulunamadığı için hata veren boşluk ve yeni satır karakterlerinin doğrudan a değişkenine eklenmesini sağladık. Bu get() metodunun nasıl çalıştığını daha iyi anlamak için http://www.istihza.com/py2/sozluk.html#get-ve-has-key adresini ziyaret edebilirsiniz.

İyi çalışmalar,

Python , , , ,

Gish Oyunu

Çarşamba, 16 Haz 2010

Bugün http://www.ozgurlukicin.com/forum/haberler/16523/?page=1#post106779 adresinde bir oyun tanıtımı dikkatimi çekti. Normalde oyun oynamayı seven biri değilimdir. Ama bugünlerde biraz rahatlamaya/gevşemeye/stres atmaya şiddetle ihtiyaç duyduğum için, üstelik bu oyun tanıtımına yapılan “müzikleri muhteşem” yorumunu da görünce oyunun kaynak kodlarını sitesinden indirip derlemeye karar verdim.

Oyunun müzikleri gerçekten muhteşem. Oyunun müziklerini dinleyebilmek için oyunu derlemenize gerek yok. Kaynak kodların içindeki “music” adlı dizinin içinde .ogg dosyaları var.

Ama eğer oyunu derlemek isterseniz şu yolu izlemeniz gerekiyor:

1. Öncelikle şu paketleri kurun:

cmake

libsdl1.2-dev

libopenal-dev

libvorbis-dev

Eğer Ubuntu kullanıyorsanız şu komutla gerekli bütün paketleri kurabilirsiniz:

sudo apt-get install cmake libsdl1.2-dev libopenal-dev libvorbis-dev

2. Daha sonra http://github.com/blinry/gish adresinden “download source” bağlantısına tıklayarak kaynak kodları indirin ve indirdiğiniz bu sıkıştırılmış dosyayı açın.

3. “blinry-gish-b595e01″ adlı dizinin içinde sırasıyla şu komutları verin:

mkdir build

cd build

cmake ..

make

4. Dizin içinde “gish” adlı bir çalıştırılabilir dosya oluşacak.

5. Komut satırında ./gish komutunu vererek oyunu başlatabilirsiniz.

6. Oyunu oynarken ihtiyacınız olan tuşlar “space”, “yön tuşları”, “s” ve “a” tuşları.

Gayet keyifli bir oyuna benziyor. Ben biraz oynadım. Ama açıkçası müzikleri daha çok ilgimi çekti… Dinlemenizi öneririm.

Bu arada giriş müziği Hömey’e (Moğol gırtlak müziği) benziyor… Bu işin uzmanları daha iyi bilir.

GNU/Linux, Yazılım , , ,

Also Sprach Zarathustra…

Çarşamba, 02 Haz 2010

Hier sitze ich und warte, alte zerbrochene Tafeln um mich und auch neue halbbeschriebene Tafeln. Wann kommt meine Stunde?

- die Stunde meines Niederganges, Unterganges: denn noch Ein Mal will ich zu den Menschen gehn.

Dess warte ich nun: denn erst müssen mir die Zeichen kommen, dass es meine Stunde sei, – nämlich der lachende Löwe mit dem Taubenschwarme.

Inzwischen rede ich als Einer, der Zeit hat, zu mir selber. Niemand erzählt mir Neues: so erzähle ich mir mich selber.

*******************

Here do I sit and wait, old broken tables around me and also new half- written tables. When cometh mine hour?

-The hour of my descent, of my down-going: for once more will I go unto men.

For that hour do I now wait: for first must the signs come unto me that it is MINE hour–namely, the laughing lion with the flock of doves.

Meanwhile do I talk to myself as one who hath time. No one telleth me anything new, so I tell myself mine own story.

*******************

Burada oturmuş bekliyorum. Yanıbaşımda eski, kırık levhalar… Bir de yeni, yarısı yazılmış levhalar… Ne zaman gelecek benim saatim?

- Alçalışımın, inişimin saati. Bir kez daha gideceğim insanlara.

O saati bekliyorum şimdi. Çünkü benim saatimin gelişinin işaretleri görünmeli önce bana. Yani güvercin sürüsü ile gülen aslan.

Bu esnada, vakti bol biri gibi konuşacağım kendimle. Madem kimse bana yeni bir şeyler söylemiyor, ben de kendi öykümü anlatacağım kendime.

Uncategorized ,