Thursday, January 31, 2013

Wakari

iPython Not Defter teknolojisi uzerine kurulmus bir yeni Internet servisi - Wakari

https://www.wakari.io/usermgmt/helpdoc

Daha once NbViewer'dan bahsetmistik, Internet'te direk URL olarak bulunan ipynb not defterlerini gostermek icin kullanilabiliyordu, ve bu dosyalari indirmenize izin veriyordu. Wakari bu isi bir adim daha oteye aliyor, not defterini yine herkes gorebiliyor (Wakari hala bir gosterici -viewer-), fakat eger bu not defterini degistirmek, ekler yapmak isterseniz, ve Wakari hesabina sahipseniz bunu yapabiliyorsunuz. Not Defteri hesabiniza kopyalaniyor ve islem oradan devam ediyor.

Ayrica, kopyaladiginiz not defterinin kullandigi tum ham veriye hala erisebiliyorsunuz. Wakari verileri kendi icinde depoluyor, ayrica "kamuya acik veri setleri" kategorisinde herkesin isine yarayacak bazi onemli veri setleri var, mesela 2012 Secim Anket verisi, 1000 Genom verisi, vs. Bu verilere not defteri icindeki Python kodu direk erisebiliyor.

Bazi ek sukseli ozellikler Python calisma alanini (environment) degistirmek, mesela kullanilan python, numpy versiyonunu otomatik olarak tanimlayabilmek.

Bu ve benzeri teknolojilerin bilimsel yayin, veri incelemesi (data exploration), ozellikle egitimde kolayliklar, degisim getirecegi neredeyse kesin. Icinde matematik sembolleri, video'su, grafigi olan, ve hesapsal kodu aninda degistirilebilip sonucu orada gorulebilen bir ortamdan bahsediyoruz.

Ekteki baglantida birisi basta anlattigimizi yapmis, bir not defteri gormus, icindeki analize bir seyler katayim bari diyerek kopyalayip kendi hesabinda devam etmis.

https://www.wakari.io/usermgmt/nb/trentoliphant/AnagramPicture

Trent Oliphant bu arada, unlu Numpy'i yazan Travis Oliphant'in kardesidir. Travis Oliphant Continuum Analytics adli bir sirket kurdu ve orada Python'u temel alan yeni nesil veri analiz araclari yaziyorlar. Numba bunlardan bir tanesi.

Tuesday, January 15, 2013

Hadoop - Ilk Ornek (Python), Esleme-Indirgeme


Simdi bir onceki yazida Java ile yapilani Python ile yapalim. Once mapper.py kodunu /home/hduser altinda yaratalim,

#!/usr/bin/env python
import sys

# input comes from STDIN (standard input)
for line in sys.stdin:
    # remove leading and trailing whitespace
    line = line.strip()
    # split the line into words
    words = line.split()
    # increase counters
    for word in words:
        # write the results to STDOUT (standard output);
        # what we output here will be the input for the
        # Reduce step, i.e. the input for reducer.py
        #
        # tab-delimited; the trivial word count is 1
        print '%s\t%s' % (word, 1)


Sonra ayni dizinde reducer.py

#!/usr/bin/env python

from operator import itemgetter
import sys

current_word = None
current_count = 0
word = None

# input comes from STDIN
for line in sys.stdin:
    # remove leading and trailing whitespace
    line = line.strip()

    # parse the input we got from mapper.py
    word, count = line.split('\t', 1)

    # convert count (currently a string) to int
    try:
        count = int(count)
    except ValueError:
        # count was not a number, so silently
        # ignore/discard this line
        continue

    # this IF-switch only works because Hadoop sorts map output
    # by key (here: word) before it is passed to the reducer
    if current_word == word:
        current_count += count
    else:
        if current_word:
            # write result to STDOUT
            print '%s\t%s' % (current_word, current_count)
        current_count = count
        current_word = word

# do not forget to output the last word if needed!
if current_word == word:
    print '%s\t%s' % (current_word, current_count)



Ise baslamadan once mapper.py isliyor mu hemen kontrol edelim,

echo "foo foo quux labs foo bar quux" | /home/hduser/mapper.py

Sonuc

foo    1
foo    1
quux    1
labs    1
foo    1
bar    1
quux    1


olmali. Indirgeyiciyi test edelim

echo "foo foo quux labs foo bar quux" | /home/hduser/mapper.py | /home/hduser/reducer.py

Sonuc

foo    2
quux    1
labs    1
foo    1
bar    1
quux    1


Eger bir onceki ornek yuzunden mevcut dizine yazilamayacagi gibi bir hata gelmesin istersek (ya da gelirse) bu dizini silebiliriz,

bin/hadoop dfs -rmr /user/hduser/gutenberg-output

Simdi Python surecleri baslatabiliriz, Python kodunun kullanilabilmesi icin Hadoop Streaming kullanacagiz, HS sayesinde isleyici sureclerin verilerini standart girdi (standard input, STDIN) uzerinde alirlar, ve ciktilari standart cikti (standard output, STDOUT) uzerine yazarlar. [HADOOP DIZIN]/contrib/streaming/hadoop-*streaming*.jar dosyasi bu isi yapmaktadir. Ayrica HS kullanilinca STDIN, STDOUT ile iletisim yapabilen (neredeyse her programlama dili) her turlu stil / dil isleyici yazmak icin kullanilabilir.

bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar -mapper /home/hduser/mapper.py -reducer /home/hduser/reducer.py -input /user/hduser/gutenberg/* -output /user/hduser/gutenberg-output

Sonuclari daha once yaptigimiz gibi geri aliriz,

bin/hadoop dfs -getmerge /user/hduser/gutenberg-output /tmp/gutenberg-output

Artik ustteki dosya tum sonuclari iceren sonuc dosyasidir.

Daha detayli esle/indirge anlatimi icin Istatistik notlarimiza bakilabilir.

Mrjob icin suraya bakiniz.

Kaynaklar

http://developer.yahoo.com/hadoop/tutorial/module4.html

http://www.michael-noll.com/tutorials/running-hadoop-on-ubuntu-linux-single-node-cluster/

---

[1] Kelime sayma probleminde anahtarlara ayirma islemi basit gibi duruyor, "kelimenin kendisi anahtar zaten" vs. Fakat bu evrede bazi veri temizleme islemleri olabilir, ki bu islemler kendi ic mantiklarini tasiyor olabilirler; ya da anlamsal (semantic) farkli islemler devreye sokabiliriz. Kelimelerde Ankara, ankara, annkara kelimelerinin ayni anahtara esleneceginin kararini bu asamada veriyor olabilirdiik mesela. Belki elimizde yazma hatalarini algilayabilen bir algoritmamiz vardir, onu bu asamada kullanmaya karar verdik vs. Geometrik transformasyonlardan tutun, cografi, kelimesel her turlu eslestirme bu safhada kullanilabilir.

Hadoop - Ilk Ornek (Java)


Oncelikle tum Hadoop yazilarinin kullandigi ornek kelime sayma ornegine bakalim. Suradaki adreslerden 3 tane veri dosyasini indirin, ve diyelim ki /tmp/gutenberg altina koyun

http://www.gutenberg.org/etext/20417

http://www.gutenberg.org/etext/5000

http://www.gutenberg.org/etext/4300

Simdi bu dosyalari HDFS uzerine kopyalacagiz. Dikkat, HDFS ozel bir dosya sistemi [3], bizim dosya sistemimiz "uzerinde" yasiyor ama ic yapisi tamamen baska bir alem. O "aleme" erismek icin normal Unix cp, mv komutlarini degil, Hadoop'un kendi verdigi komutlari kullaniyoruz. Yani o dosya sistemiyle konusurken bir tercumana ihtiyacimiz var. Not: Alttaki tum komutlari hduser ve [HADOOP_DIZINI] icinde islettigimizi varsayiyoruz [1],

bin/hadoop dfs -copyFromLocal /tmp/gutenberg /user/hduser/gutenberg

Disk uzerindeki listeye bakalim (goruldugu gibi, ls bile kullanamiyoruz, ozel ls lazim)

bin/hadoop dfs -ls /user/hduser

Kelime sayma (WordCount) Java programi Hadoop ana dizini icindeki bir jar icinde zaten var, onu kullanalim, alip islettirelim,

bin/hadoop jar hadoop-examples-*.jar wordcount /user/hduser/gutenberg /user/hduser/gutenberg-output

Is bitince sonuc gutenberg-output icinde, ekrana basalim

bin/hadoop dfs -cat /user/hduser/gutenberg-output/part-r-00000

Istersek kendi dizinimize geri alabiliriz,

mkdir /tmp/gutenberg-output

bin/hadoop dfs -getmerge /user/hduser/gutenberg-output /tmp/gutenberg-output


head /tmp/gutenberg-output/gutenberg-output


Ekranda soyle seyler gozukecek, kelime sayimi yapilmis, tabii ciktinin "basina" baktigimiz icin 1 tane bulunmus kelimeler goruyoruz bir suru, mesela AS-IS, vs.

"(Lo)cra"    1
"1490    1
"1498,"    1
"35"    1
"40,"    1
"A    2
"AS-IS".    1
"A_    1
"Absoluti    1
"Alack!    1


Ilk Hadoop surecimizi boylece isletmis olduk.

---

[1] Eger dfs komutlarini hduser degil kendi kullanicimiz uzerinden isletmek istersek, ssh uzerinden bunu yapabiliriz. Nasil olsa ssh artik localhost uzerinde de calisacak sekilde ayarlandi, eger kullanicimizin .ssh/id_rsa.pub anahtarini /home/hduser/.ssh/authorized_keys uzerine eklersek, "ssh localhost -l hduser /home/hduser/Downloads/hadoop*/bin/hadoop dfs ..." gibi komutlari artik kendi kullanicimiz uzerinden isletebiliriz.

[2] Kaynak

[3] HDFS dagitik (distributed) calisabilen bir dosya sistemi, cok buyuk tek bir dosyayi birden fazla makina uzerinde parca parca tutabiliyor yani (bunu arka planda kullaniciyi gostermeden kendisi hallediyor), hatta o parcalari tutan makinalarin cokme durumunda yedegine yonlendirme (failover) gibi ozellikleri de var. Buyuk veri islemesi gereken Hadoop ortami icin bicilmis kaftan, cunku tipik olarak cok buyuk bir veya birkac veri dosyasi elimize geciyor, ve bunlari "bir yerlere koymamiz" gerekiyor. Ya da esle-indirge surecinden yine buyuk veri uretiliyor, bu ciktilarin da HDFS uzerine koyulmasi mumkun.

Hadoop (Tek Makina Kurulusu)

Hadoop eszamanli, paralel veri isleme tekniklerinden olan Esleme / Indirgeme (Map-Reduce) kavraminin kodlanmasini / isletilmesini saglar. Hadoop servisleri ozel bir sekilde yazilmis EI kodlarini alir, onlari birden fazla makinaya dagitir, onlar icin gereken verileri parcalayarak / bolerek parca parca bu sureclere verir, analiz sonuclarini birlestirir (yine kullanicinin verdigi programa bakarak) ve sonuclari toparlayarak tek sonuca indirger. Hadoop Java ile yazilmistir, fakat surecleri (jobs) pek cok dilde yazilabilirler. Once Hadoop kuralim, ve bu ornek icin tek makina uzerinde birden fazla Hadoop servisi isletebilecek sekilde bu kurulumu yapalim.

Once Hadoop icin ayri bir kullanici gerekli

$ sudo addgroup hadoop
$ sudo adduser --ingroup hadoop hduser

Bu kullanici ssh cagrisi yapacak, aslinda ssh ile makinamiz yine kendisine baglanacak ama, sistem boyle isliyor, tek makina kurulusunda bile bunlari yapmak lazim,

$ ssh-keygen -t rsa -P ""
$ cat $HOME/.ssh/id_rsa.pub >> $HOME/.ssh/authorized_keys

Dikkat: Ustteki komutlari hduser icin ayni sekilde isletmek lazim. 

Eger ssh localhost ile baglanti olmazsa, belki SSH servisi kurulmamistir, onu kurariz,

$ sudo apt-get install openssh-server

Simdi alttaki adresten hadoop indirelim ve lzop kuralim

http://www.apache.org/dyn/closer.cgi/hadoop/core

sudo apt-get install lzop

Alttakileri hem hduser hem de kendi kullanicimiz icin .bashrc icine ekleyelim

export HADOOP_HOME=[HADOOP DIZINI]

export JAVA_HOME=[JAVA JDK DIZINI]


unalias fs &> /dev/null
alias fs="hadoop fs"
unalias hls &> /dev/null
alias hls="fs -ls"

lzohead () {
    hadoop fs -cat $1 | lzop -dc | head -1000 | less
}

export PATH=$PATH:$HADOOP_HOME/bin


Simdi [HADOOP DIZINI]/conf/hadoop-env.sh icinde

# The java implementation to use.  Required.
export JAVA_HOME=[JAVA HOME]


yapin. JAVA_HOME ne ise ustte onu veririz, which java ile bu dizini bulabilirsiniz, bazen bu komut bir sembolik baglanti (symlink) verir, ls -al ile bu baglantilari izleyerek gercek adrese ulasabilirsiniz. Eger Java JDK kurulmamissa, 

sudo apt-get install openjdk-6-jdk

Simdi Hadoop icin gereken islem dizinlerini kuralim, ve onlari hduser'a verelim,

sudo mkdir /app
sudo mkdir /app/hadoop
sudo mkdir /app/hadoop/tmp
sudo chown hduser:hadoop /app/hadoop/tmp
conf/core-site.xml icinde

  <property>
    <name>hadoop.tmp.dir</name>
    <value>/app/hadoop/tmp</value>
    <description>A base for other temporary directories.</description>
  </property>

  <property>
    <name>fs.default.name</name>
    <value>hdfs://localhost:54310</value>
    <description>The name of the default file system.  A URI whose
    scheme and authority determine the FileSystem implementation.  The
    uri's scheme determines the config property (fs.SCHEME.impl) naming
    the FileSystem implementation class.  The uri's authority is used to
    determine the host, port, etc. for a filesystem.</description>
  </property>


conf/mapred-site.xml icinde

<property>
  <name>mapred.job.tracker</name>
  <value>localhost:54311</value>
  <description>The host and port that the MapReduce job tracker runs
  at.  If "local", then jobs are run in-process as a single map
  and reduce task.
  </description>
</property>


conf/hdf-site.xml icinde

<property>
  <name>dfs.replication</name>
  <value>1</value>
  <description>Default block replication.
  The actual number of replications can be specified when the file is created.
  The default is used if replication is not specified in create time.
  </description>
</property>


Simdi hduser olarak sunu isletin

[HADOOP DIZINI]/bin/hadoop namenode -format

Simdi kendi kullaniciniz icinden Hadoop kurulus dizinine gidin, ve chmod a+w ile bu dizine herkes icin okuma hakki verin, boylece hduser oraya yazabilsin. 

Bu komut daha once tanimlanan /app//hadoop altinda gereken dizinleri formatlayacak.

[HADOOP DIZINI]/bin/start-all.sh

ile tum servisleri baslatabilirsiniz.

jps

komutu

25612 TaskTracker
25870 Jps
25290 SecondaryNameNode
25053 DataNode
25380 JobTracker
24819 NameNode


listesini dondurmeli.

Eger tek makina uzerinde birden fazla cekirdek (core) uzerinde islem yapmak istiyorsak mapred-site.xml dosyasi icindeki  mapred.map.tasks ayari kullanilabilir, buraya 4-5 gibi bir sayi gerekiyor. Ayrica mapred.tasktracker.map.tasks.maximum ayari var, ki bu da eszamanli olarak isleyen islemlerin (task) en fazla ne kadar olabilecegini belirtleyen bir ust sinir, bir onceki ayar ile kismen ilintili. Birinci ayardaki sayi bu ust sinir sayisindan fazla olamiyor.


Kaynak

R ve iPython Baglantisi

iPython not defteri icinden direk R kullanmak mumkun. Hatta Pandas DataFrame objesini bile R'ye gecmek mumkun. R baglantisi ipython icindeki sihir (magic) fonksiyonlari ile kullaniliyor, bu fonksiyonlar yuzde % ile basliyorlar ve dis sistem baglantisi, hata ayiklayici ile iletisim gibi "kutu disinda" olan servisleri ipython icine getiriyorlar.

Arka planda R ile baglanti rpy2 ile yapiliyor, bunun icin

sudo apt-get install python-rpy2

iPython'un kendi ek baglanti kodlari da lazim - bu kutuphanenin ismi rmagic, ki kodlari ipython 0.14 (su anki son stabil surum) icinde var. Eger alttaki load_ext calismazsa, 0.14'u alip kurmak lazim.

Kurulduktan sonra, not defteri, ya da pur ipython icinden alttakiler isler.

In [2]:
%load_ext rmagic
%R X=c(1,4,5,7); sd(X); mean(X)
Out [2]:
array([ 4.25])


In [3]:
from pandas import *
parasiteData = read_csv("parasite_data.csv", sep=",", na_values=["", " "])
%R -i parasiteData print(summary(parasiteData))
       V1              V2             V3       
 Min.   : 0.50   Min.   : 1.0   Min.   :0.0000 
 1st Qu.: 0.60   1st Qu.:13.0   1st Qu.:0.0000 
 Median : 0.75   Median :25.5   Median :0.8457 
 Mean   : 0.75   Mean   :25.5   Mean   :0.8364 
 3rd Qu.: 0.90   3rd Qu.:38.0   3rd Qu.:1.5337 
 Max.   : 1.00   Max.   :50.0   Max.   :2.9008 


Kaynak

Kodlar

Sunday, January 13, 2013

Taavi Burns Pandas Konusmasi


Pandas kullanarak Web log analizi hakkinda bir video. Numpy ve Pandas hakkinda guzel bazi bilgiler de var. Video'da anlatilanlarin bir kismi hakkinda bizim aldigimiz notlari NbViewer'dan iPython not defteri olarak paylasiyoruz.

Not Defteri

NbViewer, Github ve Not Defteri

iPython not defterlerimizi aynen blog yazilari gibi yayinlamak istersek

http://nbviewer.ipython.org

adresinde boyle bir servis var. Bu servis, dosyalari yine Internet'te olan not defterlerinin JSON formatindaki hallerini, Web formatinda hemen ekrana basiyor. Geri verilen URL ise tamamen statik bir URL gibi duruyor, yani baskalariyla paylasilacak yazi baglantisi artik bu olacaktir.

Peki yazinin JSON formatindaki ana dosyasi nerede olabilir? Github bu dosyalari tutmak icin mukemmel bir yer. Pek cok programcinin zaten Github hesabi var, Github metin bazli dosyalari ham (raw) halde servisleyebiliyor, GH sitesine girin oradaki herhangi bir dosyaniza gidin ve ust sag kosede "raw" dugmesini goreceksiniz. Buna bastiktan sonra tarayicinin bizi goturdugu URL adresi dosyamizin ham halinin baglantisidir. Bu baglantiyi alip, NbViewer sitesine gideriz, orada ana sayfadaki kutu bu is icin zaten, baglantiyi oraya gireriz, ve Go! ile not defterimizin son halini elde ederiz.

Sunday, January 6, 2013

iPython, Not Defteri ve Emacs

iPython Not Defteri uygulamasini ipython shell icinden kullanabilirsiniz, ya da Emacs icinden baglanti kurulursa direk Emacs'te kullanim mumkun. Bu isi halleden eklenti ein adinda bir eklenti, kurmak icin bir suru tarif var, fakat bizim Emacs ayarlarinin tamami surada, o ayarlar ile beraber ein baglantisi otomatik olarak gelecek. Eklentiye girilmeden once ipython not defteri servisi baslatilir

ipython notebook --pylab=inline

Ve Emacs icinden M-x ein:notebooklist-open ile not defterine girilir. Ein icinden python + not defteri kullaniminin bazi ek faydalari var, bunlari ileride isleriz. Fakat cok kuvvetli bir veri analiz, yayin, bilgi iletim sistemine kavusmak mumkun.


"Hucreler" icinde Python yazilir, ve bu kodlari isletmek ve sonuclarini (eger istenmis ise, print vs gibi komutlarla) altta gormek icin CTRL - Enter'a basilir. Eger grafik cizilmesine dair bir komut verilmisse, bu grafik aynen metinsel sonuclarda oldugu gibi, ayni dokuman icinde (hemen altta) gosterilecektir.

Emacs C-x C-s artik not defteri kaydi yapacaktir, kaydedilen hedef formati JSON.

iPython matematiksel sembolleri cizmek icin MathJax kullanir. Bu bir Javascript kutuphanesidir ve not defteri bu js kodlarini uzaktaki bir adresten almaya calisir. Eger bu kodlar yerel islesin istersek, ipython icinden

from IPython.external.mathjax import install_mathjax
install_mathjax()

komutlari gerekli.

Eger not defterini pdf'e cevirmek istersek, bunu LaTeX uzerinden yapabiliriz.

https://github.com/ipython/nbconvert

adresinden kod alinir. Kurmak icin dizini acmak yeterli, kullanmadan once bazi ek paketler lazim,

sudo pip install markdown
sudo pip install -U docutils
sudo pip install pygments
sudo pip install nose
sudo apt-get install pandoc

Kullanmak,

python [DIZIN]/nbconvert.py dosya.ipynb -f latex

Sonucta dosya.tex uretilecek. Bu dosyayi pdflatex dosya.tex ile PDF'e cevirebilirsiniz. Eger uretilen LaTeX'in sartlarini kontrol etmek istersek, [DIZIN]/converters/latex.py icinde bunu yapabiliriz, mesela 113. satiri

       r'\documentclass[%s,fleqn]{%s}' % (self.documentclass_options,

131. satirdan itibaren

        # Include document body
        final.append('\setlength{\mathindent}{0pt}')
        final.append('\setlength{\parindent}{0pt}')
        final.append('\setlength{\parskip}{8pt}')


 ve o metodun sonunda

        # Return value must be a string
        str = '\n'.join(final)
        str=str.replace('\n\\[','\\[')
        str=str.replace('\\]\n','\\]')
        return str



ekleri yapilirsa, uretilen LaTeX buna gore olur.

Saturday, January 5, 2013

ipython

Etkilesimli / anlik / canli veri analizi icin cok faydali bir program: ipython. Bu program aslinda bir shell, yani aynen bash, zsh gibi fakat ozellikle Python tasarlanmis bir shell, bu sebeple mesela komut satirinda import yapilabilir, bir Python script dosyasi icine yazilabilecek her sey satir satir bu shell icinde isletilebilir.

ipython niye faydalidir? Diyelim ki buyuk veri setleri ile is yapiyoruz, read_csv ile dosya okuduk, sonra Scikits Learn'deki KMeans ile bir kumeleme islemi yaptik. 100 bin civari satirlarin ustunde artik bu islemler uzun zaman almaya baslar. Fakat belki yapmak istedigimiz kumelemeyi bir kere yapip, sonra onun sonuclarini farkli sekillerde analiz etmek.. Eger her seyi surekli python dosya.py gibi isletiyorsak, script islemeyi bitirince hafizadaki her sey kaybolacaktir, uzun suren islemleri her seferinde tekrar bastan isletmek zorunda kaliriz [1]. Iste ipython burada faydali olur, KMeans shell icinde isletilir, ve shell bitmeden ayakta durdugu icin, KMeans'in sonuclari hala hafizada durmaktadir. Artik bu shell icinde istenen analiz yapilir. Ayrica shell icinde direk hata ayiklayici (debugger) kullanabilme, hata cikinca daha rahat analiz gibi bir suru guzel ozelligi vardir. Neyse,

$ ipython 

ile baslatinca shell'e girilir (yuzde isaretini shell isareti gibi kabul edelim)

%run [dosya.py]

ile dosya.py icindeki Python komutlari sanki elle % sonrasi yaziliyormus gibi isletilebilir, Unix shell'deki "kaynaktan isletme (sourcing)" kavramina benziyor, yani

. [dosya.sh]

gibi. Matplotlib ile daha entegre sekilde baslatmak icin

ipython --pylab 

o zaman ayrica matplotlib import etmeye gerek kalmaz, plot komutu aninda cizimi yapar, normalde bilindigi gibi plt.show() sonrasi normal Python script blok edecekti.

% reset 

ile hafiza icerigi temizlenir, soru sorulmadan bu is yapilsin istersek

% reset -f

Not Defteri

Bir dizi ipython islemini  tarayici icinden yapabilmek, ve hem kodsal, hem de prezentasyon amaciyla bunlari paylasmak icin ipython "not defteri" uygulamasi ilginc. Kurmak icin sudo apt-get install ipython-notebook. Baslatmak icin

ipython notebook --pylab=inline

Bu bir servis baslatacak, genellikle port 8888 uzerinde isler. Bu porta baglaninca bir ipython not defterine girmis oluruz. Not defteri aynen ipython shell gibi etkilesimli (interactive) bir ortamdir, ama terminal penceresindeki shell yerine bir HTML sayfasindayiz. Tablolar, grafikler aninda orada gosterilir mesela.. Daha guzel tarafi tum bu etkilesimin dosyaya kaydedilip paylasilabilmesi; boylece paylasilan seyler baskalari tarafindan onlarin notebook uygulamasi icine yuklenebilir, boylece diger kisiler de ayni ipython islem zincirini gorurler, isterlerse kodla onlar da oynayabilirler, orasini burasini degistirip sonuclarin farklarina bakabilirler mesela.

Son zamanlarda konferanslarda bu moda haline geldi, ipython not defteri aciliyor, yeni yapilmis (konferansta anlatilan) her ne var ise, takir takir not defterine yuklenip islemesi gosteriliyor, sonra konusma sonrasi bu etkilesim zinciri dosyaya kaydediliyor ve Web sitesinden herkesle paylasiliyor.

Not defterinde hucreler var, bu hucrelere Python komutlari girilir, onlari "isletmek" icin Shift+Enter'a basilir. Hucrelere geri donerek icerikleri degistirilebilir (bu shell ortamina gore bir ilerleme) ve tekrar Shift+Enter yeni sonuclari verir (o hucrede). Eger bir degisikligin tum not defterine yansimasini istersek, solda "All" tusu ile her seyi isletebiliriz.

Not defteri icinde LaTeX kullanmak mumkundur. Kod yazilan hucrede iken solda "Markdown" secerseniz, yazdiklarini metin olarak kabul edilir ve iki $ $ isareti arasindaki her sey LaTeX komutu olarak algilanir, ve Shift + Enter sonrasi aninda grafiksel olarak gosterilir.  Bu tek kelimeyle muthis bir ozellik, bilimsel hatta egitimsel icerik paylasma konusunda cok faydali. Bu teknolojiyle interaktif bilimsel kitaplar yazilabilir, gidisat o yonde.


Eger Ubuntu icinde masaustunde mesela dizinler arasinda gorsel olarak gezinirken icinde oldugunuz dizinde isleyen bir not defter servisi baslatmak istersek, $HOME altinda .gnome2/nautilus-scripts dizinine gidip mesela notebook-server adinda bir dosya yaratiriz, bu dosya icine

#!/bin/sh
cd `echo $NAUTILUS_SCRIPT_CURRENT_URI | sed -e 's/file:\/\///g'`
gnome-terminal -e 'ipython notebook --pylab=inline --no-browser '


Dosya uzerinde chmod 755 yapariz (kosturulabilir dosya olur yani), ve artik Nautilus ile dizinler icinde gezinirken, farede sag tiklama ve Scripts | notebook-server ile o dizinde bir servis baslatiriz.

Bu arada ipython not defteri ornegini servis tarafini yerel sahsi makinamizda bir servis uzerinden islettik, ama bu servis aslinda Internet'te herhangi bir yerde isliyor da olabilir. Demek ki birinden bir HTML not defteri alip, onu Amazon EC2 gibi bir servisten de ekrana basiyor olabilirdik. Hatta herkesin erisebilecegi bu tur bir servis uzerinden bilimsel yayinlarin paylasilmasi mumkun - hakikaten de bakiyoruz,

http://nbviewer.ipython.org/

gibi bir servis baslamis. Bunlar cok guzel gelismeler.

Not: Bu yaziya daha fazla ipython numarasi eklenecek.

---

[1] Tabii ki sonuclari script icinde bir yere kaydedip sonra baska script icinden geri alabiliriz, fakat bunlar hep ek kodlama gerektirir.

Thursday, January 3, 2013

Python with komutu, ContextManager

Bir blogun etrafinda yapilacak oncesi / sonrasi islemlerini, daha ozel olarak surekli tekrarlanan rutin temizlik hareketlerini modulerize hale getirmek icin Python with kullanilabilir. Standart ornek

with open('/tmp/workfile', 'r') as f:
    read_data = f.read()


Ornekteki with sunlari yapar; kod bloguna girmeden once dosya acilir, ciktiktan sonra kapanir, bloktan cikis nasil olursa olsun. Fakat bu ornek bazi seyleri gostermiyor; birincisi open komutu ozel sekilde kodlanmistir ki with ile kullanilabilsin. Daha kisa bir ornek

from contextlib import contextmanager

@contextmanager
def tag(name):
    print "<%s>" % name
    yield
    print "</%s>" % name

with tag("h1"):
    print "foo"


Burada tag komutunun with ile nasil kullanilabilir hale getirildigini goruyoruz.
tag icindeki yield komutu bir "yer isaretleyici / tutucu (placeholder)", islem o noktaya gelince with blogunun icindeki komutlar isletilir, yukaridaki ornekte print komutu. Bir ornek daha

from contextlib import contextmanager
import os

@contextmanager
def working_directory(path):
    current_dir = os.getcwd()
    os.chdir(path)
    try:
        yield
    finally:
        os.chdir(current_dir)


with working_directory("data/stuff"):
    # data/stuff icinde bir seyler yap  


Ornekte working_directory with ile cagrildigi zaman parametre olarak verilen string bir dizin olarak kabul edilir, o dizine "gidilir", sonra with blogunda tanimlanan seyler yapilir (yield), ve sonra o dizinden cikilir. Cikis isleminin finally icinde yapilmasi, isleyis sirasinda istisna (Exception) olsa / atilsa bile bu isin yapilmasini garantiler (open kodlamasinda da herhalde benzer isler yapiliyor, acilmis dosyayi kapatmak icin).

Kisaca with ile kullanilan bloklar  "cevresinde" hep olacak / beraber olmasini istedigimiz kod parcalarini biraraya koyabiliriz.

http://docs.python.org/2/tutorial/inputoutput.html

http://docs.python.org/2/library/contextlib.html

http://stackoverflow.com/questions/3012488/what-is-the-python-with-statement-designed-for

Tuesday, January 1, 2013

Kod: Kısıtlı Boltzman Makinaları (Restriced Boltzman Machines -RBM-)

Simdiye kadar buldugumuz en temiz RBM Python kodu surada

git://github.com/echen/restricted-boltzmann-machines.git

Sadece tek bir main programi var, python rbm.py deyince hemen o isliyor. Kod tek bir sinif ve dosya icinde.

Bir baska Python RBM ornek kodu suradan indirilebilir.

git://github.com/lmjohns3/py-rbm.git

Bunu kurmak biraz daha cetrefilli, setup.py ile kurulur. Isletmeden once

sudo pip install glumpy

sudo apt-get install python-opengl

gerekli. Ayrica MNIST imaj veri tabani lazim

http://yann.lecun.com/exdb/mnist/

Buradan train-images-* diye baslayan ilk iki dosyayi indirip acin,

Simdi py-rbm dizini altinda mnist.py adli kodu bulun ve bu dizinde

python mnist.py -i [DIR]/train-images.idx3-ubyte -l [DIR]/train-labels.idx1-ubyte

isletin. Ekrana bir GUI cikacak bu GUI uzerinde yapay ogrenim algoritmasinin imajlardan "baz goruntuler" cikartirken bunlarin sag kenarda basildigini goreceksiniz.