Thursday, April 26, 2012

Pandas ve Oge Gezinme

Bir yontem

df = ...
for i, row in enumerate(df.values):
    for j, val in enumerate(row):
        print df.ix[i,j]

Bir digeri

for key in df.index:
    for val in df.T[key]:

Boyutlar (Dimensions)

Dellstore ambar tasarimindan devam ediyoruz (bkz onceki yazi). Sadece posta kodu tanimlamistik, simdi ETL ile zaten aldigimiz kredi kart tipi (creditcardtype) ve cinsiyet (gender) uzerinde ek boyutlar tanimlayalim. Bunlar da dejenere boyut olabilir. Direk xml dosyasina girelim, ve

    <Dimension type="StandardDimension" highCardinality="false" name="creditcardtype">
      <Hierarchy name="
creditcardtype" hasAll="true">
        <Level name="creditcardtype" column="creditcardtype" type="String" uniqueMembers="false"

                 levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>
    <Dimension type="StandardDimension" highCardinality="false" name="gender">
      <Hierarchy name="gender" hasAll="true">
        <Level name="gender" column="gender" type="String" uniqueMembers="false" 

          levelType="Regular" hideMemberIf="Never">
        </Level>
      </Hierarchy>
    </Dimension>


Yayin sonrasi konsola gidiyoruz, ve mesela posta kodu 29435'e bakiyoruz. Bu kod icin + tiklaninca, kredi kart tiplerine gore dagilim gosteriliyor, cunku siralama olarak once kod, sonra kart var. Sonra cinsiyet uzerindeki + tiklaninca M cikiyor, yani erkek (male) musteriler. F cikmadi, demek ki bu kod, ve kart 3 ile alisveris yapan hic kadin musteri olmamis. Kart kodu bu arada kredi kart numarasinin ilk hanesi ve bilindigi gibi bu hane, 3,4 gibi sayilar Mastercard, Visa, vs. gibi kredi kart sirketlerine tekabul ediyorlar.



Peki ya detaya inme sirasini degisik sekilde yapmak isteseydik? O zaman sol ust kosedeki ikona yine tikliyoruz,


ve boyutlarin solundaki yukari, asagi ok isaretlerini kullanarak siralamayi istedigimiz gibi degistiriyoruz. Mesela her seyi basasagi dondurelim, ve konsola donunce farkli siralamanin raporlamayi degistirdigini gorelim,






Olcutler (Measures)

Pentaho ambar tasariminda bazi ek olcutler dusunelim. Onceki yazida yarattigimiz olcut totalamount uzerinde yaratildi ve toparlayici (aggregator) fonksiyonu olarak toplam (sum) tanimladi. Yani gruplama hangi boyut uzerinden yapiliyorsa, o gruplar icinde belirlenen kolon uzerinde toplam yapilacak.

Baska toparlayicilar da olabilir, mesela siparis eden kac tane tekil musteri oldugunu (unique customers) bir olcut olarak gormek istiyorsak, baska bir olcut customerid uzerinde distinct-count kullanabilirdi.


Bu kupu yayinlayalim ve konsola gidelim. Gidince olcutun konsolda gozukmedigini farkedebilirsiniz. Olcutun gozukmesi icin sol ust kosedeki ikona tiklayin (resim altta)


ve Measures uzerine tiklayin, ve unique customers yanindaki isarete tiklayin,

 ve OK deyin, ve sonraki (daha dogrusu onceki) ekran gelince tekrar OK yapin. Iki olcut yanyana gosteriliyor olacak.

Bir baska olcut orderid uzerinde count olabilir, zaten her orders satirinda tekil bir orderid olduguna gore bu olcut tum satirlari sayacaktir, yani kac tane siparis oldugunu gosterecektir.

Olcutler bundan daha fazlasini da yapabilir. Diyelim ki "musterilerin siparislerinin oran olarak ne kadarinin mevcut (eski) musterilerden geldigini" hesaplatmak istiyoruz. Bunun icin elimizde bilgi var, reg_date ve orderdate. Demek ki olcut tek bir kolona degil, iki kolona bakacak, ve bir toplam degil, bir oran hesaplayacak.

Bunun icin xml dosyasina editor ile girin, ve sunu ekleyin,

    <Measure name="Existing Customer Rate" aggregator="avg">
      <MeasureExpression>
        <SQL dialect="generic">
          (case when orderdate > reg_date then 1 else 0  end)
        </SQL>
      </MeasureExpression>
    </Measure>
      
     

Bu ornekte olcut icine SQL kodu bile gomebildigimizi goruyoruz. Bu kod olcute biraz daha akil kazandiriyor, bir sart ifadesi var, eger orderdate>regdate ise o zaman bu eski bir musteridir, geriye 1 dondur, degilse 0. Bu irdeleme satir bazli yapilacak. Bir de bu degerler uzerine toparlayici olarak ortalama (avg) fonksiyonu tanimlarsak, o zaman olcut bize her grup icin 1'den kucuk bir sayi verir, yani bir oran hesaplamis oluruz.

Bu kuvvetli bir olcut. Ustelik hangi boyut kullanirsa kullanilsin isleyecektir! Isin o kismini kullaniciya birakiyoruz, biz ambar tasariminda gerekli hazirligi yapmis oluyoruz. Yayin sonrasi bakiyoruz, posta koduna tiklayinca her kod altinda ne kadar musteri sadakati var aninda listeleniyor.


Eger olcute Schema Workbench'ten bakarsak suna benziyor,

Eger oran bir yuzde olarak gosterilsin istiyorsak, sadece formatString tanimini degistirmemiz yeterli,

    <Measure name="Existing Customer Rate" formatString="0.0%" 
        aggregator="avg">
    ..
     </MeasureExpression>


Yayin sonrasi goruntunun soyle oldugunu goreceksiniz


Pentaho ile Ambar Tasarimi

Dellstore ornegi ile devam edelim. Ambar tablolari anormalize (denormalize) edilmisler tablolardir, bir nevi "yassilastirilmis" haldedirler. Iliskisel tabanlarda veri tekrarina iyi gozle bakilmaz, fakat OLAP, yani ambar semalari bol bol veri tekrarlayabilir, ve bir suru tablodan aldigi veriyi tek bir tabloda ozetlemeye ugrasabilir.

Diyelim ki satislari analiz edecegiz, ve posta kodu (zip), satis miktari gibi bilgilerin tek tabloda olmasini istiyoruz. Iste ornek bir ETL,

drop table if exists order_fact;
create table order_fact as (
select
o.orderid,
o.customerid,
o.totalamount,
c.zip,
c.creditcardtype,
c.gender,

min(o.orderdate) over (partition by o.customerid ) as reg_date,
orderdate
from orders o, customers c
where o.customerid = c.customerid
)

Bu tabloda onceki yazida gordugumuz "ilk alisveris" numarasi kullanildi, ayrica customers tablosundan cekilip alinmis posta kodu var. Boylece bir Gercek (Fact) olusturduk. min() ve diger tablolardan veri cekerek Gercek tablosunu zenginlestirdik, ona daha fazla aninda erisilebilecek bilgi kazandirmis olduk. Kimbilir bu ek bilgileri ne sekillerde kullanacagiz (sonraki yazi). 

Ambari tasarlamak icin Pentaho Schema Workbench gerekli,

http://sourceforge.net/projects/mondrian/files/schema%20workbench/

Acildiktan sonra dizin icinde sh workbench.sh isletmek yeterli. File | New | Schema ile yeni semayi tasarlamaya baslayabilirsiniz.

Once Options | Connection ile yeni bir taban baglantisi tanimlayin.

Simdi sol ust kosede Schema uzerine sag tik ile Add Cube. Bir kup (cube) aslinda Gercek kavramina tekabul ediyor.


Ilk ekleme yapildiginda kirmizi ile isaretli olacak, bu bir uyari, Schema Workbench (SW) surekli kupun tasarimini kontrol ediyor ve uygun degilse o kisimlari kirmizi ile isaretliyor. Isim degisikliginden sonra, Order kupu uzerinde Add Table secebilirsiniz.


Tablo eklemek icin schema secilmesi gerekir, bunlar bir listeden gosterilecek zaten, sonra name icin tablo secilir. Bu da listede var.

Sonra kup uzerinde Add Dimension. Bu otomatik olarak boyut (dimension) altina bir hiyerarsi (hierarchy) ekleyecek. Simdi hangi tabloya referans ettiginiz gerekli, yani Gercek ve Boyut arasindaki baglanti burada yapilacak.

Burada bir ara verip boyut kavramini bir daha dusunelim. Aslinda her boyutun ayri bir tablo olmasina gerek yoktur. Bazi boyutlar Gercek uzerinde basit kolonlar olarak dururlar, mesela sehir ismi, posta kodu boyle olabilir. Bu tur basit bilgiler icin uzerinde sadece iki tane kolon olan (bir id, bir de deger) bir tablo gereksiz olur.Bu tur boyutlara bu sebeple dejenere boyut (degenerate dimension) adi verilir, bir tur "dandik boyut (!)" denebilir. Pentaho'ya bir boyutun dejenere oldugunu belli edebilirsiniz.

Yani bu noktada aracta Add Table ile tablo eklemek gerekir, ki bunu yapacagiz, ama sonra bir seviye (level) eklemek gerekir, ama biz bu seviyeyi ekleyince, tabloyu silecegiz. Level uzerinde kolon (column) icin eger order_fact uzerindeki bir kolon ismini verirseniz, ve boyut tablosu yoksa (ki yok,  cunku sildik), Pentaho bunun dejenere boyut oldugunu anlar. Daha duzgun isimler de verdikten sonra durum soyle


Column icin liste cikmiyorsa onemli degil, elle kolon ismini yazin. Simdi kup uzerinde Add Measure diyerek bir olcut ekleyelim. Bu olcut Pentaho ambar arayuzu ile boyutlarin detayina girerken (drill down) gosterilecek olcut.


Simdi File | Publish ile bu tasarimi ana servise yayinlayabiliriz. Altta gorulen ekran geliyor, Publish Password onceki yazidaki xml icinde olan sifre. Kullanici vs biliniyor zaten.


OK deyince ikinci bir ekran gelecek.


Bu ekranda Data Source icin dell girdik. Bu ismin Pentaho konsolunda onceden yaratilmis bir veri taban baglanti ismiyle birebir uyusmasi lazim. Simdi Publish ile yayini yapin. Simdi konsola gidelim, ve New Analysis View ikonuna tiklayalim,



Bir dialog kutusu gelecek, burada Dellstore Schema ve Cube icin Order sececegiz, yani yaptigimiz yayin basarili olmus ki bizim kup konsol tarafindan goruluyor. Secince analiz sayfasina girecegiz,


Bu noktada zip altindaki + isaretini tiklarsak,


Hangi posta kodundan gelen musterilerin toplam kac liralik alim yaptigini gorebiliriz.

Dahasi da var tabii; tek boyut, tek gercek ekledik. Eger birden fazla boyut olsa, Pentaho boyutlarin birbiri altinda dallanip budaklanmis bir halde nasil dagilabilecegini gosterecekti. Ayni anda birden fazla olcut (measure) gosterebilirdik, vs. Bunlar da baska bir yazinin konusu olsun.

Kupu File | Save ile kaydettikten sonra kaydedilen dosyanin icine bakin, bu bir XML dosyasi, ve cok rahat okunabilen bir formati var. Bir boyutu ekleyince, digerlerini bir editor icinden kopyala yapistir yapip birkac isim degisikligi ile hizla ekleyebilirsiniz.

Acik Kaynakli Araclarla Veri Analizi - P. Janert

Cok guzel bir kitap, genelde O'Reilly kitaplari pur kodlama ile ilgilenir, bu kitapta veri analizinin matematiksel detaylarina da giriliyor. Yazar Janert Amazon sirketinde uzun sure veri analizcisi olarak calismis, ve fizik gecmisinden geliyor. Veri analizinde hem teoriye, hem uygulamaya hakim. Kitaptaki kodlar ve veri setleri altta;

Link

Wednesday, April 25, 2012

Python Profiler

Python icin yazilmis memory_profiler adli bir paket, etiketleme (annotation) ozelligini kullaniyor, hafiza kullanimi olculmek istenen fonksiyon basina @profile ibaresi konuluyor.

Tuesday, April 24, 2012

Pandas ile Birlesim (Join)

Iki cetrefil SQL'in urettigi sonuclarin bir adres kodu (zip) kolonu uzerinden birlestirilmesi gerekiyordu, ve sartlar oyledir ki Web sitemizin surekli kullandigi tabanin bir kopyasi olan sadece-okunabilir (read-only) tabana (dogal olarak) yazim yetkisi mevcut degildi. Sonuclar nasil birlestirilebilir?

Iki SQL'in ciktisi CSV olarak alinir. Sonra bu ciktilar ayri ayri Pandas ile DataFrame olarak yuklenir. Pandas'in DataFrame'leri hafiza icinde sanki tabloymus gibi birlestirebilme (join) ozelligi vardir! Kod altta. Not olarak duselim, Pandas ve Numpy oldukca buyuk csv dosyalarini hafizada cok hizli isleyebilir. Bizim durumumuzda 100 MB buyuklugunde ciktilar vardi, ve Pandas hizla birlesimi gerceklestirdi.

import numpy as np
from pandas import *

csv1 = read_csv("dosya1.csv")
csv2 = read_csv("dosya2.csv")
res =  merge(csv1, csv2, left_on='plz', right_on='zip', how='inner')
res.to_csv("sonuc.csv",  sep='\t')

Friday, April 20, 2012

Pentaho ve Rapor Sonuclarini Zamanli Olarak Email ile Postalama

Rapor hazirladiniz, servise yayinladiniz, bu raporun otomatik olarak belli zamanlarda isleyip, PDF olarak mesela, ciktisinin birilerine gonderilmesini istiyor musunuz? Pentaho ile mumkun.

Once Admin konsolda (PAC) Administration | Schedule altinda dosya ikonundan yeni bir takvim (schedule) olusturulur. Selected Files tab'inden raporunuz secilir ve alaka kurulur. PAC'in ne oldugu icin ilk Pentaho Community yazisina bakabilirsiniz.

Sonra Pentaho normal konsola gidilerek raporunuzu tekrar bulun, eger sol kisim acik degilse View | Browser ile acik hale getirin. Raporunuz uzerinde sag tiklama, ve Schedule secimi. Bu ekran raporunuzun bir goruntusunu getirecek, hem de email icin bos alanlar verecek. Bu alana gerekli mail adreslerini yazip, schedule secerseniz, is tamamlanir.

Bu konuda arama yaparken xaction gibi konular hakkinda bir suru tavsiyeler gorulebiliyor, bunlarin hicbirine gerek yok.

Ekran goruntuleri icin alttaki baglantiya bakabilirsiniz. Baska bir dilde olmasina ragmen kullanisli.

http://santenkelapa.blogdetik.com/2010/09/03/automatic-sending-pentaho-reporting-to-e-mail-pengiriman-otomatis-pentaho-reporting-ke-e-mail/


Thursday, April 19, 2012

Pentaho ile Pivotlama (Crosstabs)

Onceki yazida Pandas ile yaptigimiz pivot tablosu teknigini anlatan iki kaynak

http://b-e-o.blogspot.de/2009/11/crosstabs-in-prd-35.html

http://www.youtube.com/watch?v=o_J3nkFRgpI

Dikkat: Bu ozellik en son Report Designer 3.8 itibariyle hala "deneysel ozellik (experimental feature). Arac baslayinca kapali halde, acmak icin Edit | Preferences sonra "Enable (unsupported) experimental feature" tiklayin.

Usttekileri takip edince guzelce calisiyor, fakat bir problem eksik olan x,y kordinatlari varsa, oralar bosluk olmuyor, yani merdiven goruntusu alamiyorsunuz. Bir hata var, o yuzden satir, kolon x,y degerlerinin tum kombinasyonlarini siz elle doldurun. Yani tablonuza oyle yazin (ki Pentaho degerleri bu tablodan okuyacak).

Bir de x,y kordinatlarini belirleyen iki kolonu ORDER BY ile siralayarak alirsaniz iyi olur.

Python Paketleme


Bir plpython kodunun kullanmasi gereken yardimci kodlarimiz var. Fakat plpython sonunda Postgres tarafindan, onun surec alaninda, hesabinda isletilen bir sey oldugu icin, yardimci kodu plpython fonksiyonu ile "ayni dizine koymak" teknigi ise yaramaz. Yardimci kodu bir paket haline getirmek gerekiyordu, yani kodun her surec, her Unix kullanicisi tarafindan bulunabilecek merkezi bir yere koyulmasi gerekiyordu.

Ust [paket] dizini altinda bir [paket] dizini daha yarattik, ust dizin icinde MANIFEST.in

include *.txt
recursive-include docs *.txt

iceriyor. Bir README.txt iyi olur. docs altdizini gerekli. [paket]/[paket] icinde __init__.py lazim ama bos olabilir. Yardimci kodu bu __init__ yanina atabilirsiniz.

[paket] altinda bir setup.py,

from distutils.core import setup

setup(
    name='Paket Ismi',
    version='0.0.1',
    author='Burak Bayramli',
    author_email='mail@post.ce',
    packages=['[paket]'],
    scripts=[],
    url='http://www.site.com',
    license='',
    description='.',
    long_description=open('README.txt').read(),
)

Kurmak icin

python setup.py sdist
gksudo python setup.py install

Bu kadar. Artik isteyen herkes import [paket] ile kodunuzu alabilir.

http://guide.python-distribute.org/creation.html

Wednesday, April 18, 2012

Meta, Sema ve Postgresql

Tablolar hakkinda sema, meta bilgisi almak istiyorsaniz, ve pg_dump komutu problem cikartiyorsa, tablo, kolon, tip bilgisi icin

select column_name,udt_name from information_schema.columns where table_name = '[tablo]'  order by ordinal_position

gibi bir sorgu gerekli bilgiyi alir. Siralamayi ordinal_position uzerinden yapmamiz iyi olur, cunku bu siralama o tablo uzerinde "select *" islettigimizde kolonlarin gelecegi sira. Tabandan veri cekerken genellikle (basitlik amaciyla) select * kullanildigi icin semanin da ayni siralamaya uyacak sekilde alinmasi iyi olur.

Not: information_schema.columns uzerinde baska ilginc kolonlar da var.

Eger indis bilgisi almak istiyorsak,

SELECT tablename, indexdef FROM pg_catalog.pg_indexes

Bu sorgu indisi uretmek icin gerekli komutu bile gosterecektir.

Otomatik olarak uzaktaki bir semayi verisiyle indisleriyle beraber yerel bir tabana aktarmak icin su script'ler kullanilabilir.

run_csv.sh - uzaktaki makina uzerinde sql isletip ciktiyi bir csv olarak kaydeder,

psql [.. uzaktaki makina .. ] -c "COPY ($1) TO stdout with delimiter ',' CSV HEADER "

run.sh - yerel taban uzerinde argumanda verilen sql dosyasini isletir

psql [.. yerel ..]  < $1

csv_schema.py - sema ciktisini alip sql komutlarina donusturur

import csv, sys

# argv 1: csv file name
# argv 2: table name

schema = csv.reader(open(sys.argv[1], 'rb'), delimiter=',')
schema.next() # skip header

print "drop TABLE if exists %s ;" % sys.argv[2]

print "CREATE TABLE %s (" % sys.argv[2]
i = 0
list = list(schema)
l = len(list)-1

for line in list:
    if i < l:
        print "%s %s, " % (line[0], line[1])
    else:
        print "%s %s " % (line[0], line[1])
    i+=1
print ");\n"

schema.sh - python script'i kullanarak semayi doker, ve yerel tablo uzerinde isletir.

sh run_csv.sh "select column_name,udt_name from information_schema.columns where table_name = '[tablo]'" > $LH_DATA_DIR/$1/[tablo].out
python csv_schema.py DATA_DIR/$1/[tablo].out [tablo] > $LH_DATA_DIR/$1/[tablo].sql
sh run.sh DATA_DIR/$1/[tablo].sql


dump.sh - tablolarin verisini db dosyalarina kaydeder

sh run_csv.sh "select * from [tablo]" > DATA_DIR/$1/[tablo].db

load.sh - db dosyalarini yerel tabloya yukler

psql [..yerel..] -c "COPY [tablo] FROM 'DATA_DIR/$1/[tablo].db' with csv header delimiter ',' ";

indexes.sh - indeksleri uzaktaki makinadan alarak yerelde isletir

sh run_csv.sh "SELECT indexdef FROM pg_catalog.pg_indexes where tablename = '[tablo]' " > /tmp/idx
perl -pi -e 's/\"//sg' /tmp/idx
perl -pi -e 's/\n/;\n/sg' /tmp/idx
tail -n+2 /tmp/idx > $LH_DATA_DIR/$1/[tablo]_idx.sql
sh run.sh $LH_DATA_DIR/$1/[tablo]_idx.sql













Postgresql DB Baglantisi (dblink)

Oracle'daki database baglantisi (db link) ozelliginin Postgresql'da karsiligi nedir? Bilindigi gibi dblink sayesinde yerel tabanimiz icinde uzaktaki bir tabaninin tablolarini sanki yerelmis gibi kullanabiliyoruz. Postgres ile uzak tabanlarin birlesim (join) icin kullanilabildigi supheli, fakat en azindan duz SELECT kullanimi db link ile mumkun. Veri ambari ortaminda uzaktaki tablolarin kopyasina ihtiyacimiz var sadece / zaten, sofistike tum sorgular yerel (olmali).

sudo apt-get install postgresql-contrib-9.1

Sonra psql icinden

Simdi

CREATE EXTENSION dblink;

komutu sadece bir seferlik isletilir. Bundan sonra uzaktaki makine uzerineki sorgular su sekilde isletilir ([tablo]'dan sadece name adli bir kolonu aliyoruz)
SELECT name FROM dblink('host=[host] user=[sifre] password=[sifre] dbname=[taban]', 
'SELECT name FROM [tablo]') 
as 
t1(name text)
Bu ozelligin begenmedigimiz tarafi kullanici, sifre gibi detaylarin sorgu icinde olmasi. Bu detaylar baska bir ayar dosyasinda olsaydi daha iyi olurdu. Ayrica "as .." sonrasi sema bilgisini SELECT sonrasi bizim vermemiz gerekiyor. Bu bilgi select ile kendiliginden alinsa daha iyi olurdu. Veri ambari kodlamasi genellikle db link uzerinden CREATE TABLE AS (SELECT ..) gibi bir kullanimla uzaktaki tablolari yerel ortama tasir. Ustteki yontemde tanim elle eklendigi icin bu pek kullanisli olmaz.

Faydali bir script / metot altta. Baglanti kurmak istenilen (hedef) taban, ve tablo icin

select column_name,udt_name from information_schema.columns where table_name = '[TABLO]' order by ordinal_position

isletilir, cikti bir text dosyasina yazilir. Sonra

import os, csv, sys

schema = csv.reader(open("/tmp/link.out", 'rb'), delimiter=',')
schema.next() # skip header

print "drop table if exists %s ;" % [TABLO]
print "create table %s as (" % [TABLO]
print "SELECT * FROM "
print "dblink('host=localhost user=postgres password=postgres dbname=[KAYNAK TABAN]', " % country
print "'SELECT * FROM %s') " % table
print "as t1"
print "("
i = 0
list = list(schema)
l = len(list)-1

for line in list:
    if i < l:
        print "%s %s, " % (line[0], line[1])
    else:
        print "%s %s " % (line[0], line[1])
    i+=1   
print "));\n"


script'i hedef tablo icin gereken create table as (select ...) ifadesini o tablonun semasina bakarak otomatik olarak uretecektir. Bu ifadeyi alip direk DDL olarak kaynak taban uzerinde isletebilirsiniz.

Fakat Postgres uzerinde dblink buyuk veri setleri icin guvenilir olmayabiliyor. Biz her nedense hafizanin tukendigini soyleyen "out of memory" hatalari almaya basladiktan sonra dblink kullanmaktan vazgectik.

Tuesday, April 17, 2012

Faydali Unix Komutlari

Hangi surec (process) port 8080'i dinliyor?

netstat -n --tcp -p -l |grep ":8080"

Sadece bastaki satiri gostermek

head -1 [DOSYA]

Bir dosyanin son N satirini atlamak / gostermemek (silme amacli olabillir), mesela son iki satir icin

head -n-2 [DOSYA]

Bir dosyanin ilk satirini atlamak icin

tail -n+2 [DOSYA]

Bir komut ciktisini text olarak baska bir komut icine gommek

`` kullanilir. Mesela

echo "b.txt" > a.txt
echo "filan" > b.txt
echo "falan" >> b.txt

Yani a.txt icinde b.txt yaziyor, simdi

wc -l `cat a.txt`

dersek, a.txt icindeki b.txt arguman olarak wc'ye verilecek. Ve

2 b.txt

sonucu gelecek. Yani burada a.txt degil onun icindeki b.txt wc'ye gecildi.

Eger bir Unix script'inizin .bashrc icinde tanimladiginiz alias (kisayollari) kullanmasini istiyorsaniz, bu script'i soyle isletmeniz gerekir:

bash -i [script]

Emacs icin benzer durum, M-x compile mesela alias'lari gormuyor. Onun icin

(setq shell-file-name "bash")
(setq shell-command-switch "-ic")

tanimlamak lazim.

Sonsuz kere bir komutu isletmek icin, mesela surec listesini surekli gostermek

while true; do ps -eaf; sleep 2; done

Belli satirlar arasindaki satirlari cekip cikartmak, mesela 10 ile 20

sed -n 10,20p [DOSYA]

Rasgele satirlar cekip cikarmak (.005 bir oran, daha fazla satir icin bu sayi arttirilabilir)

cat [DOSYA] | perl -n -e 'print if (rand() < .005)'

Dosya icinde metin aramak (/usr seviyesinden asagi dogru inerek, tum altdizinlerde, xml soneki tasiyan dosyalarda)

find /usr -name '*.xml' -exec grep -l 'filan' {} \;

Dosya icinde kelime degistirmek (xml sonekli dosyalarda, altdizinlere girmez)

perl -pi -e 's/filan/falan/sg' *.xml

Usttekinden daha iyisi replace.py diye ufak bir Python script yazmak,

import os, re, sys
filename = sys.argv[1]
content = open(filename).read()
fout = open(filename,"w")
content = content.replace("burak","bayramli")
fout.write(content)
fout.close()

Ustteki script'i python replace.py [dosya] seklinde cagirabiliriz. Bu tek dosya uzerinde degisim yapar. Eldeki content uzerinde her turlu regex, vs. bazli islemleri yapabiliriz. Hatta gerekirse basa, sona istedigimiz metni ekleyebiliriz.

Eger bircok dosya uzerinde ustteki degisimi yapmak istersek,

find .-type f -name "*" -exec python replace.py {} \;

Dosyayi kullanan program hangisi

lsof [DOSYA]

Bir dizinden baslayarak ozyineli (recursive) olarak o dizin altindaki en buyuk dosyalari listelemek icin

du -h | sort -hr | head -20  

Bir makinadaki tum donanimlari listele (Ubuntu)

lspci
Harici sabit diskte bazi dizinlerimin yedegini tutuyoruz, ve iki yerel dizini senkronize etmek icin

rsync --delete -r /tmp/dira/ /tmp/dirb

Ustteki rsync komutu kaynak dizini "belirleyici (master)" olarak kabul edecektir, ve /tmp/dira icinde olan her sey, yeni dosya, mevcutun silinmesi, ekleme islemi aynen /tmp/dirb'ye yansitilacaktir. Not: Eger /tmp/dirb FAT32, NTFS gibi Windows temelli bir dosya sistemi ise azar azar guncelleme ise yaramaz, tum dosyalar her seferinde tekrar silbastan yollanir. Bunun sebebi Win temelli dosya sistemlerinin dosya sahibi, erisim haklari gibi bilgileri -Unix ile uyumlu- tutmuyor olmasidir.

Monday, April 16, 2012

Musteri Sadakati ve Pivot Tablo Kullanimi

Onceki yazida Pandas ile nasil pivot tablosu yaratabilecegimizi gorduk. Bir baska yazida dellstore tabaninda ilk siparis tarihi ve guncel siparis tarihleri yanyana dokebilecegimizi gorduk, ve ay bazinda bu bilgiyi gosterdik. Simdi ilginc bir ek daha: eger bu iki ay kolonunu x,y kordinati gibi kullanip ucuncu bir musteri sayisi kolonunu pivot tablosunda gosterseydik ne olurdu?

Onceki yazidaki (date_trunc kullanan sorgu) SQL'in ciktisini kolon isimleriyle ve virgullu ayrilmis sekile CSV olarak kaydedin. Simdi alttaki kod ile
import numpy as np
from pandas import *
df = read_csv('/tmp/out')

pv_cust = df.pivot('reg_date','cdate','customer_count')
pv_cust.to_csv('out1.csv',  sep='\t', na_rep='')
pivot dosyasini out1.csv'e basiyoruz.
reg_date        2004-01-01      2004-02-01      2004-03-01
2004-01-01      979.0   43.0    46.0    54.0    43.0    47.0
2004-02-01              930.0   42.0    49.0    57.0    50.0
2004-03-01                      882.0   38.0    47.0    26.0
2004-04-01                              835.0   36.0    45.0
2004-05-01                                      792.0   42.0
2004-06-01                                              763.0
Ciktinin bir merdiven goruntusu vermesi raslanti degil, tarihler solde ve ustte sirali, ve tanim itibariyle musteri ilk alim yaptigi tarihten once alim yapmis olamayacagina gore, ustteki cikti ortaya cikacak. Tablonun faydasi, herhangi bir reg_date icin gerekli satiri bulup o satiri saga dogru takip etmek, ve arka arkaya her ay neler oldugunu hemen gorebilmek.

Ustteki ciktiya ilginc bir ek caprazdaki sayiyi bir yuzde 100 olarak almak, ve ondan sonraki sayilari "eski musterilerin kacta kaci tekrar alim yapti" sorusuna cevap olarak daha dusuk yuzdeler olarak gostermek (keske onlar da yuzde 100 olsa!). Bu ek kod
pv_cust_perc = pv_cust.copy()
for date in pv_cust_perc.index:
for val in pv_cust_perc.T[date]:
    if np.isnan(val) == False:
        pv_cust_perc.T[date] = (pv_cust_perc.T[date] / val) * 100
        break

pv_cust_perc.to_csv('out2.csv',  sep='\t', na_rep='')
Bu ciktiyi da out2.csv de bulabilirsiniz.

Postgres Min, Partition

PG tabaninin bir kolonu temel alarak partition etme ozelligi var. Bu komut, secilen kolonun tekrar ettigi satirlar uzerinden / icinde / arasinda islemler yapmanizi sagliyor. Mesela dellstore tabanini ornek alirsak (onceki yazimiz) bu tabanda orders var, ve musteri numarasi tabii ki belli satirlarda tekrar ediyor, cunku ayni musteri gelip tekrar alisveris yapmis (istenen bir sey degil mi?). Partition ozelligini kullanarak, tum satirlara bakarken ek bir bilgi daha ekleyebiliriz. Mesela ayni customerid uzerinden en az orderdate'i cekip cikartmak ve bu en az tarihi ayni musteri icin tum satirlara yaymak.
select
customerid,
min(o.orderdate) over (partition by o.customerid ) as reg_date
from orders o
order by customerid

customerid | reg_date | orderdate
------------+------------+------------
...
40 | 2004-07-06 | 2004-07-06
41 | 2004-06-02 | 2004-06-02
41 | 2004-06-02 | 2004-08-09
41 | 2004-06-02 | 2004-10-15
42 | 2004-12-23 | 2004-12-23
43 | 2004-05-19 | 2004-05-19
44 | 2004-03-18 | 2004-03-18
44 | 2004-03-18 | 2004-12-08
Dikkat edelim, id 41 tekrar ediyor, ve reg_date yani bu musterinin ilk satin alim yaptigi tarih 2004-06-02 id 41 icin tekrar edilmis.

Boylece bir ek bilgi, ek kolon yaratmis olduk. Bu bilgiyi nasil kullanabiliriz? Mesela bir "musteri sadakati" sorgusu dusunulebilir, belli bir tarih arali icin "kac eski musteri bu aralikta alim yapmis" diye bir soru sorulabilir. Eski musterinin tanimi reg_date'i o araliktan once olanlar ve orderdate'i aralik icinde olan kisiler olabilir.

Ilginc bir ust sorgu soyle olabilir. Mesela ilk alim (reg_date) ve mevcut alim (orderdate) bilgisinin sadece ay ve yil kismi uzerinden bir GROUP BY yaparsak, o zaman tum ilk alim, mevcut alim tarih kombinasyonlarini goruruz.
select
extract (month from reg_date) as month,
extract (year from reg_date) as year,
extract (month from odate),
extract (year from odate),
count(distinct(customerid))
from
(
select
customerid,
min(o.orderdate) over (partition by o.customerid ) as reg_date,
orderdate as odate
from orders o
) as sub1
group by
extract (month from reg_date),
extract (year from reg_date),
extract (month from odate),
extract (year from odate)

reg_month | reg_year | odate_month | odate_year | count
-----------+----------+-------------+------------+-------
1 | 2004 | 1 | 2004 | 979
1 | 2004 | 2 | 2004 | 43
1 | 2004 | 3 | 2004 | 46
1 | 2004 | 4 | 2004 | 54
1 | 2004 | 5 | 2004 | 43
Bu kombinasyon ciktisi uzerinden ek sorularimiza cevap bulabiliriz. Mesela bakiyoruz, 2004 Ocak ayinda ilk alimini yapan ve sonra 2004 Subat ayinda alim yapan 43 kisi varmis, vs.

Ay bazinda gruplamanin bir diger yolu tarih kolonunda ay oncesi tum bilgiyi ayni seye esitlemek, ay kalacak sekilde "yoketmek (truncate)". Bu teknik altta, bazi durumlarda daha kullanisli bulunabilir.
select
cast (date_trunc('month',reg_date) as date) as reg_date,
cast (date_trunc('month',odate) as date) as cdate,
count(distinct(customerid)) as customer_count
from
(
select
customerid,
min(o.orderdate) over (partition by o.customerid ) as reg_date,
orderdate as odate
from orders o
) as sub1
group by
date_trunc('month',reg_date),
date_trunc('month',odate)

Friday, April 13, 2012

Veri Islemek - plpython

Python kayitli islemler ile veri islemenin ornegi
CREATE or REPLACE FUNCTION test ()
RETURNS text
AS $$
import sys
class WritableObject:
def __init__(self):
self.content = ''
def write(self, string):
self.content = self.content + string + "\n"
outbuffer = WritableObject()
rv = plpy.execute("select a from TABLO");
for y in rv:
outbuffer.write(y['a'])
return outbuffer.content
$$ LANGUAGE plpythonu;

select * from test()
Sondaki select islemi bu sql dosyasini her islettigimizde hem kodun degismesi hem de test edilmesi icin eklendi. Sonuc ortami icin bu select ifadesi cikartilmali.

Kodun yaptigi bir sorgu isletip sonucu kayitli islemden dondurmek, ve SELECT uzerinden bu sonucun ekrana basilmasidir.

Baska bir ornek, plpython kodu icinden SELECT'vari kolon bazli satirlar dondurmek. Bunun icin once bir "tip" yaratilmasi gerekli, daha sonra bu tip uzerinden hafizada bir Python listesi olarak olusturulan sonuclar geriye dondurulebiliyor. Bu sonuc cagri yapan tarafa aynen bir SELECT ciktisi gibi gozukuyor.
CREATE TYPE kayit_tipi AS (
how text,
who text
);

CREATE or replace FUNCTION veri_getir()
RETURNS SETOF kayit_tipi
AS $$
return ( [ "xxx", "World" ], [ "yyy", "PostgreSQL" ], [ "zzz", "PL/Python" ] )
$$ LANGUAGE plpythonu;

select * from veri_getir();
Ayni kodun yield kullanan sekli
CREATE TYPE bizim_tip AS (
how text,
who text
);

CREATE or replace FUNCTION veri_getir ()
RETURNS SETOF greeting
AS $$
for val in [ "World", "PostgreSQL", "PL/Python" ]:
yield ( val, val )
$$ LANGUAGE plpythonu;

select * from veri_getir();

Pivot Tablolari

Satir olarak tekrar eden iki kolondaki verileri bir tur kordinat olarak alip, ucuncu bir kolondaki degere gore bir tablo hucresinde deger atamak istiyorsak, Pandas paketinin pivot ozelligi ise yarar. Pivot genel bir veri prezentasyon yaklasimi, Postgres icinde crosstab diye bir fonksiyon var, fakat kullanimi pek kolay degil. Pandas'i indirin

http://pypi.python.org/pypi/pandas#downloads

Klasik setup.py hareketleri. Su ornek kod ilginc
import numpy as np
from pandas import DataFrame
df=DataFrame({
'foo': ['one', 'one', 'one', 'two', 'two', 'two'],
'bar': [ 'A' , 'B' , 'C' , 'A' , 'B' , 'C' ] ,
'baz': [ '1', '2', '3', '4', '5', '6']
})
print df
pv = df.pivot('bar', 'foo')
print pv.to_string()
Sonuc
foo one two
bar
A 1 4
B 2 5
C 3 6

plpython

Kayitli prosedurler (stored procedures) veri tabanlarina fonksiyonel bazli cetrefil ek mantik eklemek gerektiginde gundeme gelirler. Cogunlukla bir sorgudan gelen sonucu satir satir isleyerek ek mantik uygulamak gerektigine kullanilirlar, SELECT vb. sorgu komutlari, her ne kadar kuvvetli ozelliklere sahip olsalar da, bu baglamda yetersiz kalabilirler.

Kayitli prosedurleri kodlamak icin her tabanin kendine has bir dili var cogunlukla, Oracle PL/SQL kullanir, MySql baska, vs. Hepsi de kosul (if), dongu (loop) icin farkli komutlar kullanirlar. Postgresql da kayitli prosedur icinde Python kullanmak mumkun. Bu buyuk rahatlik cunku farkli bir dil ogrenmeye gerek kalmiyor. Kurmak icin

sudo apt-get install postgresql-plpython-9.1

sudo -u postgres createlang plpythonu [taban] -U postgres

Ornek bir prosedur
CREATE FUNCTION pymax (a integer, b integer)
RETURNS integer
AS $$
if a > b:
  return a
return b
$$ LANGUAGE plpythonu;
Test etmek icin

select pymax(2,4);

Sonucun 4 geldigini goreceksiniz.

Python bazli PG kayitli islemleri her turlu Python paketini import edebilirler. Yani select uzerinde cagirdiginiz bir islem arka planda Numpy, Scipy kullaniyor bile olabilir! Burada muthis potansiyel var. Raporlama motorunuz (mesela Pentaho) hicbir seyden habersiz "basit" SQL isletiyor olabilir, ama arka planda o basit cagrilar sofistike analitik islemleri yapiyor olabilirler.

Plpython fonksiyonlari icinden logging mumkun, basta
import logging
LOG_FILENAME = '/tmp/plpython.log'
logging.basicConfig(filename=LOG_FILENAME,level=logging.DEBUG)
tanimlanirsa,
logging.debug("mesaj")
ile istenilen cikti ustte tanimli dosyaya yaziliyor.

Notlar

Plpython icinden kullanilan python, ya da sisteminizde kurulu ayni Python'un kullanilis sekli biraz daha secici olabilir. Mesela if 'kelime' in degisken gibi bir ifade eger degisken None ise disaridan bir test ile problemsiz calissa da Postgresql icinden problem cikartti. Bu tur farkliliklar olabilir.
 

Friday, April 6, 2012

Ne Zaman Ambar, Ne Zaman Gelisiguzel Sorgu

Eger kullanicinin bazi baglantilari kesfetmesini istiyorsak, simdiden ongoremeyecegimiz boyutlarda gruplama yapilmasini desteklemek istiyorsak o zaman ambar bir secenek olabilir. Eger takimda bir programci var ise gelisiguzel sorgular da iyi bir cozum. Ara bir veri katmanina ihtiyac duymadan online tabandan hemen veriyi alip getiriyorlar. Parametrize edilebiliyorlar, sadece degistirilmek icin programciya ihtiyac duyuyorlar.

"Baglantilari kesfetmek" ne demektir? Ambarda Gercek ve Boyutlar oyle duzenlenir ki, pek cok boyut tek bir Gercegi destekler / referansi olur. Bu sayede gercekler pek cok degisik sekillerde gruplanip, kesilip bicilebilirler. Mesela siparis gercegi zaman, bolge, ulke, saat, vs. gibi pek cok boyutla baglanmis olabilir, bu baglantilar birebir baglamda ambar icin olusturulur. Online tabanda bu iliskiler biraz daginik halde olabilir, ambar onlari toparlar ve tekil Gercek tablolarini desteklemek icin kullanir. Sonra raporlama araci gruplamayi daha rahat sekilde yapabilir, ve kullaniciya verisi hakkinda degisik fikirler vermeye baslayabilir.

Pentaho Community ve Ticari Urun Farklari

Report Designer araci iki tarafta da ayni.

Community versiyonda web konsoldan analyzer ve report araclari surukle-birak islemini destekliyor, acik kod versiyonda desteklemiyor.

Kurulum com versiyonda daha kulfetli bundan bahsettik.

Iki tarafta da veri ambar yetenekleri var. Mesela com versiyon bir "veri kupu" yaratilmasindan bahsediyor, bu bir veri ambar kavramidir.

Veri transferi (ETL) islemi icin Kettle denen bir araclari var, bu aracin acik versiyonu mevcut. Biz simdilik pur SQL ile bu isleri yapiyoruz.

Parametreli Pentaho Raporlari

Onceki yazida nasil rapor tanimlanip yayinlandigini gorduk. Simdi bir rapor icin nasil parametre hazirlanabilecegini gorelim. Parametreler raporlarda bir nevi "bos birakilmis" alanlardir; kullanici raporu isletirken bu bilgileri o anda girer. Mesela bir parametre, tabandaki siparislerin raporlarken hangi tarih araligi uzerinden isletilecegini tanimlayabilir.

Onceki yazidaki raporumuza donelim. Raporu actiktan sonra Data tab'i uzerinden Sample Query uzerine sag tiklama yapip Edit Query diyelim. Yani eski sorguya bazi ekler yapacagiz. Diyelim ki eski sorguyu belli tarih degerleri arasinda gormek istiyoruz. Mesela 2004-03-01 ve 2004-08-01.

SELECT
EXTRACT(MONTH FROM orderdate) AS month,
EXTRACT(YEAR FROM orderdate) AS year,
SUM(totalamount) AS total
FROM orders
where orderdate between '2004-03-01' and '2004-08-01'
GROUP BY year, month
ORDER BY year, month

Onizleme ile bu sorgunun isledigini gorebilirsiniz.

Fakat bu araligi kullaniciya sorsak daha iyi olmaz mi? O zaman

SELECT
EXTRACT(MONTH FROM orderdate) AS month,
EXTRACT(YEAR FROM orderdate) AS year,
SUM(totalamount) AS total
FROM orders
where orderdate between ${fromDate} and ${toDate}
GROUP BY year, month
ORDER BY year, month

${..} ile parametre kullanmis olduk. Simdi Data tab'i icinde en alttaki Parameters kismina gidip sag tiklama yapin, ve Add Parameter secin.


Parametre ekleme icin soyle bir pencere gelecek, icini alttaki gibi doldurabilirsiniz.

Goruldugu gibi fromDate kodunu verdik, Value Type yani alan tipi bir Date. Mandatory sectik cunku kullanicinin bu bilgiyi girmesini sart kosmak istiyoruz. Display Type ise bilginin hangi gorsel oge ile alinacagi. Date Picker bir tarih GUI objesi gosteriyor, hakikaten cok kullanisli bir sey. Ayni sekilde toDate de ekleyin, ve OK ile ikisini de kaydedin. Onizleme ile kontrol edin ve yayinlayin. Simdi Pentaho konsolundan raporu yukleyince, alttaki goruntuyu gorecegiz.


Guzel bir tarih secici obje cikti goruldugu gibi. Buradan tarihleri seciyoruz, ve alttaki gibi filtrelenmis ciktinin basildigini goruyoruz.

Parametrelerin cok daha kuvvetli ozellikleri de var. Mesela kullaniciya belli bir liste icinden bir secim yaptirmak istiyorsaniz, ve bu listenin kendisinin de bir sorgu ile tabandan cikmasini istiyorsaniz (mesela tabaninizdaki mevcut sehirlerin bir DISTINCT listesi olabilir) o zaman parametre tanimini bir sorguya baglamak mumkun.

Ornek olarak su sorguyu alalim

select products.* from products, categories
where products.category = categories.category
and categories.categoryname = 'Action'

Bu sorgu tum aksiyon filmlerini listeler. Biz kategorinin kullaniciya sorulmasini istiyoruz. Simdi yeni bir rapor yaratip alttaki sorguyu verelim.

select products.* from products, categories
where products.category = categories.category
and categories.categoryname = ${category}

Ama simdi ikinci bir sorgu daha lazim. Bu sorguyu eklemek icin DB baglantisi uzerine sag tik ve Edit Datasource. Available Queries yanindaki +,


Onizleme yapin isledigini kontrol edin. OK ile ekleyin, eger Data tab'de sorgu listeniyor ama kolonlari listede gozukmuyorsa, sag tik ve Select Query ile bunu zorlayabilirsiniz. Ayni sey ana sorgu icin de gecerli. Simdi parametreyi ekleyelim.


UI objesini Drop Down sectik ve buraya dikkat, Query icin onceden tanimladigimiz allCategories sorgusunu sectik. OK ile ekleyin, ve yayinlayin. Konsolda soyle cikacak.


Kaynaklar

http://www.prashantraju.com/2010/01/creating-parameters-with-pentaho-report-designer/

Pentaho Community Server ve Raporlama

Pentaho Community versiyonu kurulusu biraz kulfetli fakat kullanisli bir program. Gelisiguzel (ad-hoc) SQL'leri alarak istenilen sekilde formatlanmasini, hatta bu SQL'ler icin sonradan son kullanicinin girebilecegi parametreler tanimlanmasini, ve sonuclarin HTML yaninda PDF, XLS gibi pek cok formatta dokulmesini saglar. Yapi soyle: Report Designer adli bir zengin GUI programi rapor taslaginin hazirlamasini saglar, programcilar rapor taslagini zaten bildikleri SQL ile kurarlar, taslaklar hazirlaninca onlar bir server'a yayinlanabilir (publish). Artik kullanicilar servise bir Web GUI uzerinen eriserek istedikleri anda bu raporlari isletirler.

Almak icin

sourceforge.net/projects/pentaho/files/

Bu linkten Business Intelligence Server ve Report Designer projelerinin tar.gz dosyalarini indirin. Once BI server. Bir dizine actiktan sonra [dizin]/biserver-ce dizinine gidin. Burada sh start-pentaho.sh komutu islemeyecek, catalina.sh dosyasindan sikayet edebilecek. Duzeltmek icin

chmod 777 tomcat/bin/*.sh

BI icinde Tomcat var, yani java jdk de kurulmus olmali. Bir not daha: Mesela Postgresql paketten ciktigi haliyle gerekli JDBC jar dosyalarini icermiyor. Eger bu tur ek tabanlarla calismak istiyorsaniz, gerekli dosyalari bulup, biserver-ce/tomcat/lib altina koyun.

Sonra

biserver-ce/pentaho-solutions/system/publisher_config.xml dosyasina girin ve

<publisher-config>
<publisher-password></publisher-password>
</publisher-config>

icin bir sifre tanimlayin, mesela "admin"

<publisher-config>
<publisher-password>admin</publisher-password>
</publisher-config>

Artik BI calisir. http://localhost:8080/pentaho adresini kontrol edin. Pentaho User Console Login'e tiklayinca bir suru ornek kullanici gorebilirsiniz. Joe (Admin) ile is yapabilirsiniz, kullanici joe, sifre password. Bunlari sonra degistirirsiniz tabii.

Web bazli bir admin konsolu da var, fakat normal servisin parcasi degil. Onun  icin biserver-* altinda /administration-console dizinine gitmek ve start-pac.sh isletmek lazim. Web sayfalari localhost:8099 uzerinde sizi hazir bekliyor olacak.

Simdi RD kurun. [dizin] altinda sh report-designer.sh ile baslatabilirsiniz. Ornek olarak unlu dellstore DVD dukkani tabanini kullanacagiz, sema ve veri dosyalari surada (dellstore2 baglantisi). Bunlari ise baslamadan once tabaninizda yaratmis olun.

http://pgfoundry.org/projects/dbsamples

File | New ile yeni bir rapora baslayalim. Bos bir sayfa cikacak. Sag bolume gidin ve iki tab icinde Data'ya tiklayin, ve Data Sets uzerinde sag tiklama yapin. JDBC secin.


Soyle bir pencere acilacak

Ilk kez RD kullandigimiz icin taban baglantisi hazirlamamiz gerekiyor, o yuzden sag ustteki yesil + ile baglanti eklemesi yapacagiz. Sonraki kullanimlarda hazir olan baglantilardan birini secerdik, mesela SampleData diye baslayan bir suru taban icin baglanti hazirlanmis, bunlari listeli cikiyor goruldugu gibi. Herneyse, yeni baglanti ekrani soyle

Biz burada dellstore2 tabanimiz icin parametreleri girdik. Test ile test edin, ve tamamsa OK ile ekleyin.


Baglanti solda listelenecek (lread'i biz daha once ekledik). Simdi raporumuza lazim olan veriyi saglamamiz gerekli, onun icin bir de sorgu (query) ekleyecegiz. Simdi "Available Queries" basligi yanindaki yesil + dugmesine tiklayin. Query denen alt pencerye

SELECT
EXTRACT(MONTH FROM orderdate) AS month,
EXTRACT(YEAR FROM orderdate) AS year,
SUM(totalamount) AS total
FROM orders
GROUP BY year, month
ORDER BY year, month;

sorgusunu girdik. Preview ile sonuclari kontrol edebilirsiniz, uc kolon var, tamamsa OK ile eklersiniz. Simdi bos raporun oldugu sayfaya donunce sag tarafta sunu gormemiz lazim,

Sorgu eklenmis ve uc tane kolon gozukuyor. Bu noktada bu uc kolonu surukle-birak ile bos raporun uzerinde istediginiz gibi konumlayabilirsiniz ve sol ust kosedeki goz isaretine tiklayip sonucu gorebilirsiniz.

Fakat bu "serbest sekilli" raporlar icin. Eger onceden tanimli kolonlari duzgun, renkleri ayarli bir rapor goruntusu isterseniz, onceden hazirlanmis sablonlara bakabilirsiniz. Bunun icin File | Report Wizard secin. Cobalt secenegi fena degil, Next deyin, yine bir sorgu tanimlamak lazim. Data Source diyen pencerede yine + yapin, Choose Type icin JDBC secin, yine ayni sorgu ekrani gelecek. Taban dellstore, ve sorgu sagda yine ayni SQL, ve OK.

Ustteki pencereye donunce sorgu eklenmis halde. Simdi sorgunuz uzerine tek tiklama (yoksa Next aktif hale gelmiyor), ve Next. Cikan ekranda month, total, year kolonlarini secip, alttaki sag ok isareti ile alt sag kutuya tasiyin, ve Finish.

Rapor ekranina donuyoruz ve bu noktada raporun basligini, isterseniz kolonlarin tanimini degistirebiliyorsunuz. Raporun nasil gozukecegini gormek icin sol ustteki goz isaretini kullanabilirsiniz.

Guzel. Simdi raporun yayinlanmasina (publish) gelelim. File | Publish secin, gelen kutuda OK deyin, ve ikinci ekranda

Gerekli bilgileri girin, mesela rapor ismi, tanimi, vs. Sonra bir dizine tiklayin (bu gerekli, ana dizine kayda izin verilmiyor) gecici olarak Steel Wheels altinda kaydedebilirsiniz, ya da dizin ikonlarinin en sagindaki (ustunde gunes isareti olan) ikon ile kendi dizininizi yaratabilirsiniz.

Burada diger onemli bilgi Publish Password kismi, bu sifre bu yazinin basinda belirttigimiz XML dosyasi icine yazdigimiz sifre, yani bizim ornekte "admin" kelimesi. Simdi OK deyin, ve yayin isi bitecek.

Bu raporu ayrica kendi sabit diskinize de kaydedebilirsiniz, bu tipik dosya kaydi, Save ile oluyor. Simdi Pentaho web konsoluna gidelim, ve sol ust kosedeki dosya acma ikonuna tiklayalim,


Steel Wheels'e girelim, orada Dell Store raporunun listelendigini goreceksiniz. Rapora tiklayin ve sonucun listelendigini gorun. Output Type secenegi ile XLS, PDF dosyalari urettirebilirsiniz.

Kaynaklar

http://www.robertomarchetto.com/www/how_to_use_pentaho_report_designer_tutorial


http://www.youtube.com/watch?v=qo1BQfgDV-Y

OpenCV Ubuntu

Apt-get ile kurulus

sudo apt-get install libavformat-dev ffmpeg libcv2.1 libcvaux2.1 libhighgui2.1 python-opencv opencv-doc libcv-dev libcvaux-dev libhighgui-dev

FFMEG ile mpg -> avi cevirimi

ffmpeg -i output.mpg -sameq output.avi

Monday, April 2, 2012

Clicktale

Yeni nesil Web siteleri sayfalarinin kullanimini analiz etmek icin Clicktale adli bir urun / site kullaniyorlar. Bu urunu / kodu sitenize entegre ettikten sonra herhangi bir kullanicinin mouse hareketleri bile tekrar geri calinabiliyor (playback). Mesela kullanici XYZ mouse'u sitenizin sayfalari uzerinde gezdirmis, gezdirmis, ama uzun sure tiklamamis, dusunmus, sonra bir tiklayip hemen geri gelmis, bunlari o anda oluyormus gibi sonradan "seyretmek" mumkun. Bu bilgi tabii ki sitenin kullanimini ilerletmek icin kullanilabilir. Clicktale ayrica bir "sicaklik haritasi (heatmap)" yaratabiliyor, bu haritada kullanicilarin daha cok gezindigi bolgeler daha sicak renklerle gosterilebiliyor vs.