Thursday, April 18, 2013

IP ve Bolge Eslemesi, Python

IP adresini yaklasik olarak bir bolgeye, sehre, hatta enlem boylam kordinatina eslemek icin pygeoip adli Python paketi var. Kurmak icin

sudo easy_install pygeoip

Kodun ek veri dosyalarina ihtiyaci var. Bu dosyalar

http://dev.maxmind.com/geoip/geolite#IP_Geolocation-1

adresinde Downloads bolumunden indirilebilir, GeoIP.dat.gz, GeoIPv6.dat.gz, GeoLiteCity.dat.gz dosyalari mesela. Ornek kod, mesela 212.174.157.30 ip adresi icin (adresi nslookup www.tbmm.gov.tr ile bulduk)

import pygeoip

gi = pygeoip.GeoIP('[DIZIN]/GeoLiteCity.dat')
print gi.record_by_addr('212.174.157.30')


Sonuc

{'city': u'B\xfcy\xfck', 'region_name': u'61', 'area_code': 0, 'time_zone': 'Asia/Istanbul', 'dma_code': 0, 'metro_code': None, 'country_code3': 'TUR', 'latitude': 40.66669999999999, 'postal_code': '', 'longitude': 40.400000000000006, 'country_code': 'TR', 'country_name': 'Turkey', 'continent': 'EU'}

Sonuc Istanbul (sitenin barindirma servisi degisik bir sehirde demek ki). Diger ornekler

https://github.com/appliedsec/pygeoip

Eger mesela Pandas DataFrame objesi uzerindeki bir IP adresini isleyip, hesaplanan enlem / boylam degerlerini ayni satira ayri kolonlar olarak yazmak isteseydiniz,

import pygeoip, os         
import pandas as pd

gi = pygeoip.GeoIP('[DIZIN]/GeoLiteCity.dat')

def ip_loc(x):
    rec = gi.record_by_addr(x)
    lat = rec['latitude']
    lon = rec['longitude']
    return pd.Series([lat, lon], index=['latitude','longitude'])

df = pd.DataFrame({'ip': ['212.174.157.30','212.174.157.30','212.174.157.30']})

df[['latitude','longitude']] = df['ip'].apply(ip_loc)

print df


Buradan gelen sonuc

               ip  latitude  longitude
0  212.174.157.30   40.6667       40.4
1  212.174.157.30   40.6667       40.4
2  212.174.157.30   40.6667       40.4


Monday, April 15, 2013

LateX ile Prezentasyon - Beamer

Daha once baska bir prezentasyon paketinden bahsetmistik. Beamer adli bir paket kullanmasi daha kolay bir program.

Eger suradaki apt-get listesi var ise, beamer kurulmus olacaktir, yok ise

apt-get install latex-beamer

ile kurulabilir. En basit ornek

\documentclass{beamer}

\usetheme{Darmstadt}
\usefonttheme[onlylarge]{structurebold}
\setbeamerfont*{frametitle}{size=\normalsize,series=\bfseries}
\setbeamertemplate{navigation symbols}{}

\title{Introduction to Whatever}
\logo{%
    \includegraphics[width=1cm,height=1cm,keepaspectratio]{logo-dosyasi}
}

\begin{document}
\begin{frame}{Header}

Text text

\end{frame}

\end{document}






Dosya logo-dosyasi bir imaj dosyasidir ve eps eklentisinde olmasi gerekiyor, ImageMagick ile baska bir formattan rahatca eps cevrimi yapilabilir.

Paketin pek cok ozelligi var, suradan dosyalar indirilip, doc altindaki pdf okunabilir, examples altindaki orneklere bakilabilir.

Eger yazicidan basmak istersek, ve iki sayfa tek tarafta olacak sekilde cikti istersek (prezentasyonlar genelde oyle basilir) ama yazici problem cikartiyorsak, yaziciya gondermeden once PDF uzerinde degisim yapilabilir, mesela

pdfjam --landscape --nup 2x1 dosya.pdf --outfile dosya2.pdf

Bu script cagrisi ile 2 sayfa teke indirgenmis olur.


Friday, April 12, 2013

Sqlplus ile CSV Uretmek

Komut satirindan sqlplus ile CSV uretmek icin

set echo off
set verify off
set termout on
set heading off
set pages 50000
set feedback off
set newpage none
set linesize 250
set colsep '|'

spool out.csv;

select 

kolon1 || '|' ||
kolon2 
from tablo where filtre = 'filan';

spool off;
exit;


Bu sql dosyasini mesela test.sql olarak kaydedersek,

sqlplus64 user/pass@db @test.sql

ile isletebiliriz, ve ciktiyi out.csv icinde goruruz. Kolon degerleri | ile ayrilmis olacaktir. Okunan tablo ismi goruldugu gibi tablo, zaten ciktiyi uretecek SQL ozellikle belirtiliyor.

SQLPlus'un CSV uretmek icin pek iyi bir ortam oldugu soylenemez. Zaten bu aracin "sekli olarak veri uretmek" oldugu soyleniyor, tabii 70-80'li yillarin text bazli ortami icin kolonsal sekiller uretmek anlaminda.. Bu sekli egilim sadece veriyi cekip cikartmak isteyenler  icin problem olabiliyor. Mesela linesize parametresine dikkat, bu parametre bir satirda kac karakter olacagini tanimlar, eger veri satirinda o kadar karakter yoksa, o zaman linesize bosluk karakteri ile doldurulur (daha fazla veri gelmisse de fazla olan karakterler kesip atilir! dikkat). Bu bosluk karakteri satirdaki en son kolonu okurken problem cikartabilir, Pandas ile mesela skipinitialspace=True ile bu bosluktan kurtulmak gerekiyor.

Kolonlari yanyana ve | ile ayrilacak sekilde biz yanyana getiriyoruz, cunku baska turlu tum bilgilerin ardi ardina sirilanmasi mumkun olmuyor (colsep ile set edilen ayarin pek bir anlami yok yani).

Ayrica SQLPlus kolon isimlerini otomatik olarak vermiyor. Biz bu isimleri Pandas ile okurken kendimiz veriyoruz.

Monday, April 8, 2013

Ubuntu'dan Oracle'a Baglanmak

Su sayfadaki tarif takip edilebilir

https://help.ubuntu.com/community/Oracle%20Instant%20Client

Su adrese girilir ve baglanan sisteme tekabul eden baglanti tiklanir

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html

Bizim icin bu Linux x86-64 idi mesela. Buradaki listelenen seyler icinde Basic, SQL*Plus, JDBC Supplement icin gosterilen rpm indirilir. "Lisans Kabulu" icin en ust soldaki radyo dugmesinin secilmis olmasi gerekiyor.

Bu noktada Oracle sitesi "uyelik" sartini arar, email, sifre vs verip uyelik yapilir, konfirmasyon email'ine cevap verildikten sonra ustteki rpm dosyalari indirilecektir.

Sonra

apt-get install alien

kurulur ve

sudo alien -i oracle-instantclient11.2-*

ile indirilen dosyalar kurulur. Eger paylasilan kutuphane (shared library, so) hatalari var ise, .bashrc icine

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/oracle/11.2/client64/lib

yaziniz. Bir kere sudo ldconfig yapmaniz da gerekebilir. Ayrica

sudo apt-get install libaio1

Bundan sonra sqlplus64 isleyecektir. Simdi makina, db isimlerini nasil tanimlayacagimiza gelelim.

sudo mkdir /etc/oracle

ve bu dizinde

sudo gedit /etc/oracle/tnsnames.ora

Bu dosyada db, makina isimleri, ip adresleri yeralir. En son .bashrc icinde

export TNS_ADMIN=/etc/oracle

Artik sqlplus64 user@db gibi bir ifade ile baglanti yapilabilir.

Eger Python icinden baglanmak istersek,

http://tshepang.net/accessing-oracle-db-using-python-in-debian

cxOracle lazim, mesela 64 bit Python 2.7 Oracle 11 icin CentOS 5 x86_64 RPM (Oracle 11g, Python 2.7)  baglantisina tiklanir. Indikten sonra

sudo alien --install cx_Oracle-5.1.2-11g-py27-1.x86_64.rpm
sudo easy_install cx_oracle
sudo ln -s /usr/lib/python2.7/site-packages/cx_Oracle.so /usr/lib/python2.7/lib-dynload
sudo ln -s /usr/lib/oracle/11.2/client/lib/libnnz11.so /usr/lib
sudo ln -s /usr/lib/oracle/11.2/client/lib/libclntsh.so.11.1 /usr/lib


Kod ornegi

import pandas as pd]
import pandas.io.sql as sql
import cx_Oracle as odb
conn = odb.connect("[kullanici]/[sifre]@[taban]")

df = sql.read_frame("select .. from", conn)

ile Oracle verisi bir Dataframe icine alinmis olur.