Sunday, May 27, 2012

Pentaho ve Hesaplanmis Olcutler, Yuzdeler

Pentaho icindeki Mondrian OLAP motoruna bir boyut cercevesinde veriyi kesip bicerken hesapli olcut (calculated measure) uzerinden yuzde raporlatmak mumkun. Mesela dellstore orneginde cinsiyet uzerinden veriyi incelerken hem gercek sayi hem de yuzde gormek istiyoruz. Bunun icin analtik kup xml icinde

    <CalculatedMember
        name="GenderPercent"
        dimension="Measures"
        formula="[Measures].[orders] / ([Measures].[orders], [gender].Parent)">
      <CalculatedMemberProperty
          name="FORMAT_STRING"
          value="0.0%"/>
    </CalculatedMember>
  </Cube>


tanimlariz. Ve cinsiyet (gender) uzerine tiklayinca miktar (amount) olcutu ile beraber hesaplanmis olcut cinsiyet yuzdesinin (gender percent) gosterildigini gorebiliriz.


Kaynak

Box ve Whisker Grafikleri

Gaussian Kontrolu

Tuesday, May 22, 2012

Almanya'da Calisma

Almanya'da Calisma - Oturma Izni (Residence Permit, Aufenthaltstitels)

Ikamet kaydi (anmeldung) yapildiktan sonra simdi oturma izni, ve bu iznin pasaportunuza 2 senelik vize olarak gecirilme isi kaliyor. Bu en son basamak. Bundan sonra ikiser sene olarak oturma izinleri uzatilacak, ve 6 sene sonra kalici oturma izni alinabilecek. Bu arada hem Anmeldung, hem de oturma izni icin fazla beklememek iyi olur. Ilk alinan 3 aylik vizede az zaman kaldiysa bile yardim edebilirler, ama sure bitmeden 1 ay once gitmek en iyisi. Bunun icin gecici kalinan yer uzerinden bile bir Anmeldung alinabilir, sonra oturma izni sonrasi kalici yerinize gecince bir tane daha Anmeldung alabilirsiniz. O nasil olsak daha kolay, ve hizli bir surec.

Neyse, bu son basvuru icin gereken dokuman Aufenthaltstitels, alttaki zip icinde hem pdf hem de gerekli loc dosyalarini bulabilirsiniz, Python doldurucu surada

Indir

Gidilmesi gereken yer, daire Landeseinwohneramt Berlin, adresi Friedrich-Krause-Ufer 24. U9 treni ile U9 Amrumer Str'a gidilir, inince Torfstrasse yonune yurunur, kopruyu gecince sola nehir kenarindan yuruyun, hemen binanin onune geleceksiniz.

Izinler icin farkli uyruklar icin farkli bolumler var, Turkei icin olana gidilir, ve basvuru noktalari (katlar) da soyadinin bas harfine gore ayrilmistir, 'B' icin 4. kat gibi, vs. Bunu giristeki elemana soyisminizi gostererek hemen ogrenebilirsiniz.

Yaninizda goturecekleriniz: Is kontrakti (kopya olabilir), saglik sigortasi, bir fotograf (biyometrik), pasaport, kira kontraktiniz, 110 Avro, isyerinizden son maas cekleri. Bazi baglantilar

http://www.berlinfo.com/Worktime/Authorities/getting_started/registration/index.htm#what

http://www.berlinfo.com/Worktime/Authorities/getting_started/residence_permit/index.htm

http://berlin.angloinfo.com/countries/germany/residency.asp#noneu

Opening Hours: Monday, Tuesday, Thursday: 07:30 - 13:00, Wednesday: closed,
Friday: 07:30 - 12:00

Erken giderseniz iyi olur, gelince makinadan numara aliyorsunuz, bekliyorsunuz. Beklemenin pek uzun surdugu soylenemez. Sonra dokumanlariniza bakacak gorevlinin ofisinde bu kisi odeme icin size bir kart verecek, bu kart "kasiyer makina" icin, makine alt katlarin birinde, zaten resimli isaretler yolu gosterir. Kart uzerinde ne kadar odeme gerektigi kodlanmistir, makine ona gore nakit alir, ve makbuzu alinir. O makbuzu ofisteki gorevliye geri veriyorsunuz. Ve oturma izni pasaport ile veriliyor.

Diger Konular

Vergi numarasi (identifikationsnummer) almak gerekecek, sirketinizin insan kaynaklari bolumu herhalde bu numarayi bir noktada sizden ister, siz de gidip Finanzamt adli bir resmi daireden bunu alirsiniz. Berlin icin alttaki sayfa her bolgedeki Finanzamt burosunu gosteriyor

http://www.berlin.de/sen/finanzen/steuern/finanzaemter/

Yanlis hatirlamiyorsam bu is icin Anmeldung, is kontrakti, pasaport goturmustum, hic bir form doldurmadim. Is bitince uzerinde numaranizi tasiyan belge size verilecek. Bu kadar.

Kalici Oturma Izni ve Emeklilik Odemeleri

Kalici oturma izni icin emeklilik icin ne kadar odeme yaptiginizla alakali belge gerekebilir. Bunun icin iki yontem var,

https://www.eservice-drv.de/SelfServiceWeb/

adresinde sigorta no'sunu girmek, ve Renteninformation ya da diger verilebilen belgelerden birini istemek. Bu biraz gizemli bir sayfa, isim filan da giriliyor sonra dugmeye basinca PDF filan uretilmiyor, meger posta ile bu belge gonderiliyormus. Sayfada adres te sorulmamasi gizemi daha da arttiriyor, herhalde Anmeldung ile baglantili olarak kayitlarinda en son hangi adres varsa ona gidiyor. Bizimkinin gelmesi 3 hafta aldi.

Daha iyi bir yontem Deutsche Rentenversicherung bizzat gitmek, yanliz dikkat, Google Maps'in bugun itibariyle verdigi adres Wallstrasse yanlis. Esas adres Fehrberliner Platz 5'te, buraya Fehrberliner Platz U-Bahn duragindan erisebilirsiniz, hatta U-Bahn cikisinin hemen yaninda. Burada siraya girip birileriyle konusup gerekli belge alinabilir.

Monday, May 21, 2012

Almanya'da Calisma - Ikamet Kaydi (Anmeldung)

Almanya'da oturacak bir yer bulduktan sonra resmi daireye bu adresi bildirmek gerekiyor. Tabii ondan once "oturacak yer nasil bulunur?" diye sorulacak olursa, Berlin odakli olarak bedava servislerden

http://www.wg-gesucht.de/

http://www.immobilienscout24.de/de/finden/wohnen/index.jsp

Fakat bu sitelerden birincisine cok talep var, "gorme gununde" kirk tane adam oraya gitmis olabiliyor.

Komisyon alan servislerden Rassmussen Immobilien tavsiye edebilirim. Eger kisa sureli bir yerlerde kalmak gerekirse, Praeger Platz yakinindaki Hotel Atrium ya da Kurfurstendamm yakinindaki Hotel Ingeborg (gunluk 40-50 Eur arasi).

Simdi ikamet adresinizin kaydina gelelim, yani Anmeldung sureci. Bu is ile ugrasan resmi dairelerden mesela bir tanesi surada

http://www.berlin.de/ba-mitte/org/buergeramt/infosystem.php/dienstleistung/120686/standort/122282/

Digerlerine de bu sayfadan ziplanilabilir.  Elektronik olarak randevu alirsaniz iyi olur, birisi mesela randevusuz gidip 4 saat beklemis, fazla olmus. Randevu icin "termin online buchen" ve tarih sonra saat uzerine tiklayarak randevu alinabilir. Kayit icin email'den baska bir seye ihtiyac yok, sistem iyi isliyor. Gerci ben kayit olup gittigimde o gun dairenin bilgisayar sistemlerinde ariza vardi, ama ertesi gune randevuyu ertelediler, is halloldu.

Bazilari icin dil problem olabilir, kayit gorevlisi gelen yabanci olsa bile Almanca kullanmayi tercih ediyor gibi geldi, biz isi kurtardik, bir Italyan tanidik ta yarim Ingilizce / Almanca ile isi kurtarmis, baska bir Ispanyol eleman bu is icin 10 kere gitmis, ama bu arkadas formlarla da problem yasamisti herhalde... Bu yaziyi okuyanin bu dertleri olmayacak tabii ki, Anmeldung formlari altta bulunabilir,

Indir

Bu zip icinde bizim Python form doldurucu icin gerekli loc dosyalari var, fill dosyalari siz yaratin. Ayrica anmeld-explanation.pdf dosyasi form alanlarinin ne anlama geldigini Ingilizce anlatiyor.

---

[1] Bu arada ev kiralamadan bazi kiracilar kredi tarihinizin iyi oldugunu gosteren Schufa adli bir belgeyi sizden isteyebilir. Bu belgeyi bankalar, ya da diger ozel sirketler verebiliyor, Internet uzerinden de alinabiliyor, fakat biz sahsen fiziki bir yere gitmeyi tercih ettik. Mesela Berlin'de easyCredit adli bir sirket (Wilmersdorfer Strasse 55 adresindeki sube iyi) belli bir ucret karsiliginda (20 Eur civariydi saniyorum) bu isi yapar. Anmeldung, pasaport, banka ATM karti goturmeniz yeterli. Sonucta verilecek Schufa belgesi "bu kisinin finans durumu iyidir" gibi bir sey soyleyecek, ki mustakbel kiracinizin ilgilendigi bu bilgi zaten.

Friday, May 11, 2012

Veri Zenginlestirmek

Simdiye kadar gordugumuz partition..over ile nasil ek kolon, bilgi yaratabildigimizi gorduk. Veriyi zenginlestirmenin veri madenciligi acisindan faydalari var. Mesela dellstore2 tabaninda orders tablosu uzerinde orderdate (siparis tarihi) var. Fakat mesela siparisin hangi mevsimde yapildigi yok. Belki yaz aylari ile musterinin yaptigi siparisler arasinda bir baglanti vardir. O zaman bu tur akla gelebilecek pek cok ek bilginin mevcut bilgiden cekip cikartilmasi, ya da diger tabanlardan birlestirilerek getirilmesi gerekir. Bazi numaralar:

- PG case-when-then ibaresi cok ise yariyor. Bu ifade SELECT icinde sart irdelemesi yaparak ilginc sartlara gore ek bilgi yaratmayi kolaylastirir. Mesela

SELECT .., case when amount > 2000  then 'VIP' else 'NORMAL' end as status, ..

gibi bir ifade miktar (amount) kolonuna bakiyor, eger 20 uzeri ise musterinin statusunu VIP, yani "en onemli musterilerden" diye isaretliyor.

- Bir kayiti akla gelebilecek her turlu sekilde isaretlemeye ugrasmak lazim, bu seceneklerden bazilari ilk basta akla yatkin gelmese de ilginc faydalar saglayabilirler. Mesela "son 6 aydir siparis vermemis musterileri" isaretlemek. Kod

SELECT .., last_value(orderdate) over (partition by customerid) < (now() - interval '6 months') as did_not_come_back_past_6_months, ..

(Onceden first_value gormustuk, simdi de last_value goruyoruz). Iste bu sekilde belli bir musterinin verdigi son siparis tarihinin son 6 aya gelip gelmedigini dogru / yanlis (t/f) seklinde yeni bir kolon olarak yarattik. Ve dikkat: bu bilgi sadece musterinin en son siparisine tekabul eden kayda degil, tum kayitlarina ekleniyor. Eger musteri son 6 ayda alisveris yaptiysa, tum kayitlari 't' diyecek, yoksa hepsi 'f' diyecek.

Thursday, May 10, 2012

Dropdown Secimi Ile Ayri DIV Gostermek

Basit bir prezentasyon teknigi, sukseli bazi raporlari "akilli dokuman" olarak gondermek icin iyi olabilir. Listeden secilen kaleme ait olan bilgiler kendi DIV etiketleri icinde tutuluyor, hangi kalem secilirse onun bilgisi altta hemen basiliyor. 

<script>
function displayDiv(e){
  divs =new Array('ELMA', 'ARMUT', 'PORTAKAL');
  for (var i=0;i<divs.length;i++){
    document.getElementById(divs[i]).style.display = "none";
  }
  document.getElementById(e.innerHTML).style.display = "block";
}

</script>

<select name="#" id="#" onChange="displayDiv(this.options[this.selectedIndex]);">
      <option selected="selected"> </option>
      <option >ELMA</option>
      <option >ARMUT</option>
      <option >PORTAKAL</option>
</select>
<br/>
<br/>

<div id='ELMA'  style='display:none;'>
  Elma hakkinda seyler buraya...
</div>
<div id='ARMUT'  style='display:none;'>
  Armut hakkinda seyler buraya...
</div>
<div id='PORTAKAL'  style='display:none;'>
  Portakal hakkinda seyler buraya...
</div>

Postgres First_Value, Sum, Partition

Su yazida PG tabaninin bir kolondaki degerin ayniligini temel alarak o grup icinde / uzerinde islemler yaptigini gosterdik. Bu gruba PG bir "pencere (window)" adini veriyor. Klasik GROUP BY islemi satirlari azaltir, ozetler, pencere bazli OVER .. PARTITION komutu ise satirlari oldugu gibi birakip onlara ek bilgi eklenebilmesini saglar. Akla gelebilecek her seyi bir pencereye yayabilirsiniz. min teknigini gorduk, ama su da mumkun,

select
o.orderid,
o.customerid,
o.totalamount,
sum(o.totalamount) over (partition by o.customerid ) as sum,
o.orderdate
from orders o
order by customerid

Burada ayni musterinin (aynilik kriteri customerid) siparis tutarlari toplaniyor ve bu musterinin tum satirlarina yayiliyor. Ustteki sorguyu isletin, ve id = 13 icin

 orderid | customerid | totalamount |  sum   | orderdate 
---------+------------+-------------+--------+------------
     379 |         13 |      246.21 | 336.39 | 2004-01-14
    9447 |         13 |       90.18 | 336.39 | 2004-10-10

sonucunu goreceksiniz. Toplam tekrarlanmis.Satirlarin toplami yerine, aynen ilk siparis tarihi ornegine benzer sekilde "o grubun ilk satirindaki herhangi bir kolonun degerini" de yayabiliriz. Bunun icin first_value() cagrisi OVER .. PARTITION ile beraber kullanilir,

select
o.orderid,
first_value(o.orderid) over (partition by o.customerid order by o.orderdate) as first_order_id,
o.customerid,
o.totalamount
from orders o
order by customerid


Sonuc

 orderid | first_order_id | customerid | totalamount
---------+----------------+------------+-------------
     379 |            379 |         13 |      246.21
    9447 |            379 |         13 |       90.18

Musteri 13'un ilk siparisi id 379, sonraki 9447. Biz first_value ile 379'u aldik, first_order_id uzerinden otekine "yaydik". first_value cagrisina kolon degeri verilebildigi gibi depolu islem (stored procedure) cagrisi da verilebilir.

Boyle islemler nerede ise yarar? Mesela musterinin her sipariste hangi (belki degisik bir) kanaldan geldigini biliyoruz, Web kanalindan mi, Internet kanalindan mi, vs. Fakat raporlama amacli olarak bu musterinin bize getirdigi tum kazanci "ilk geldigi kanalin" hanesine yazmak istiyoruz. Bu gibi durumlarda bu ilk kanal bilgisini "cogaltarak" o musterinin tum diger kayitlarina yaymak, over.. partition ile mumkun olur.

Sonra SQL'in geri kalan mekanizmalari oldugu gibi calisirlar, GROUP BY mesela bu yeni yaratilan kolonu sanki gercek bir kolonmus gibi kullanabilmeye baslar. SQL kumesel olarak dusunur, ve her satirin bu sebeple atomik olmasi iyidir, satirlarin kendi hakkindaki bilgiyi kendi uzerinde tasimasi lazimdir -- OVER.. PARTITION ile gereken bu tur ek bilgileri satirlara ekleyebilmis oluruz.







Monday, May 7, 2012

Python ile Dinamik Excel Dosyasi Yaratmak

Gerekli paketler surada listeli:

http://www.python-excel.org/

Biz Excel uretimi icin xlwt kullandik. En basit kod

from tempfile import TemporaryFile
from xlwt import Workbook
book = Workbook()
sheet1 = book.add_sheet('Sheet 1')
sheet1.write(0,0,'A1')
book.save('simple.xls')
book.save(TemporaryFile())

0,0 hucresin bir seyler yazilip kaydedildi. Stil uygulamasi icin easyxf tavsiye edilir, mesela write(0,0,'vs',easyxf('alignment: horizontal right')) gibi.

Paketin bazi eksikleri sadece yazmaya yonelik olmasi, bir hucrenin mevcut durumunu okuyup bir seyler eklemek imkansiz. Okuma icin diger paket xlrd kullaniliyor, o zaman da ta  en bastan bir xls dosyasi acmis oluyorsunuz, ve baska bir ortamda / mod icinde oluyorsunuz.Excel ureten kodlarda icerik dinamik oldugu zaman kor bir sekilde veriyi uygun yere atmakla ugrasiriz, birkac kolonu satiri kapsayacak stil uygulamasi (mesela renk, agirlik -bold-, font buyuklugu) sonradan belli alanlara uygulamak tercihimiz. xlwt ile bunlari yapmak zor, write ile tekrar ayni hucreye yazdiginizda o hucrenin eski degeri eziliyor.

Cozum write() metotunu kendi write metotumuz sarmalayip (wrap), bu bizim metot icinde global bir stil listesini her yazim icin kontrol etmek, yani stili surekli / her x,y degeri icin bu listeden almak. Bu stil listesi basit bir Python listesi olabilir, yazim baslamadan once hazir olmalidir, (x1,x2,y1,y2,stil) tuple listesi seklinde, stiller belli bloklar icin tanimlandigi icin bir dikdortgen icindeler, x1,x2 kullanimi bunun icin. Sarmalanan write surekli kendisine verilen x,y'nin hangi stil dikdortgeninin icine dustugunu kontrol edecek yani.