Kategori arşivi: Python

Sap BO RestFul Web Servis ile kullanıcı listesi çıkarılması

(Sap BO user list exctraction with Restful Web Service)

Sap Business Objects ortamında kullanıcı listesi ResftFul Web Service SDK (Python dilinde) almak için aşağıdaki kod kullanılabilir.

#!/usr/bin/python
# -*- coding: utf-8 -*-



import sys
reload(sys)
sys.setdefaultencoding('utf8')



import requests, json, re

baseurl = 'http://hostname_ip:port/biprws' # change hostname ip port, example: 192.168.56.101:6405

headerJson = {'accept': 'application/json'}

r = requests.get(baseurl+'/logon/long', headers=headerJson)

headerJson2 = {'accept': 'application/json', 'content-type': 'application/json'}

postDataJson = '{"userName":"Administrator","password":"PassWD","auth":"secEnterprise"}' # change password

r = requests.post(baseurl+'/logon/long', headers=headerJson2, data=postDataJson)

sapBoLogonToken = '"' + json.loads(r.text)['logonToken'] + '"'

headerJson3 = {'accept': 'application/json', 'X-SAP-LogonToken': sapBoLogonToken}



looperPage = 1
looperPageSize = 50

r = requests.get(baseurl+'/v1/users?page='+str(looperPage)+'&pagesize='+str(looperPageSize), headers=headerJson3)
parsedJson = json.loads(r.text)

userList = []
while len(parsedJson["entries"]) == looperPageSize:
  userList.extend( parsedJson["entries"] )
  looperPage += 1
  r = requests.get(baseurl+'/v1/users?page='+str(looperPage)+'&pagesize='+str(looperPageSize), headers=headerJson3)
  parsedJson = json.loads(r.text)



# rest log off
headerJson4 = {'accept': 'application/json', 'content-type': 'application/json', 'X-SAP-LogonToken': sapBoLogonToken}
r = requests.post(baseurl+'/logoff', headers=headerJson4)



f = open('./user_list.csv','w')

f.write("user_id,user_name,user_fullname\n")
for uli in userList:
  f.write(uli["id"]+","+uli["name"]+","+uli["fullname"]+"\n")

"""
# maybe needed for some users detection
f.write("user_id,user_name,user_name_length,user_fullname,user_fullname_length,reg_exp_flag\n")
for uli in userList:
  if ( len(re.findall("[a-zA-Z]{2}[0-9]{4}",uli["name"])) > 0 ):
    reg_exp_flag = "1"
  else:
    reg_exp_flag = "0"
  f.write(uli["id"]+","+uli["name"]+","+str(len(uli["name"]))+","+uli["fullname"]+","+str(len(uli["fullname"]))+","+reg_exp_flag+"\n")
# reg_exp_flag=1, user_fullname_length<>0, user_name_length=6
"""

f.close()

Dosya olarak indirmek için: re_cmc_user_list.py

sap design studio geomap geojson tr Türkiye

Sap Design Studio ortamında GeoMap komponentinin GeoJson ile belirlenmiş alanlarını (Türkiye’nin illerini) istenen iki renk aralığında gösterge (measure, kpi) değerlerine göre renklendirebilmek için notlar.

Öncelikle Türkiye’nin illerinin GeoJson bilgisine design studio geomap komponentinin kabul ettiği formatta ihtiyaç var. Bunun için https://github.com/cihadturhan/tr-geojson adresindeki açık kaynak (open source) proje kullanılabilir. Buradaki Json formatı Design Studio’da kullanılabilecek şekle getirmek için aşağıdaki Python kodu kullanılabilir.

#!/usr/bin/python
# -*- coding: utf-8 -*-

import json

f = open('./tr-cities-utf8.json','r')

parsedJson = json.loads(f.read())

f.close()



parsedFeatures = parsedJson["features"]
parsedFeatures_new = []

for ipf in parsedFeatures:
    ipf_new = {}
    ipf_new["type"] = ipf["type"]
    ipf_new["properties"] = {}
    ipf_new["properties"]["city_name"] = ipf["properties"]["name"]
    ipf_new["properties"]["city_id"] = ipf["id"]
    ipf_new["geometry"] = ipf["geometry"]
    parsedFeatures_new.append(ipf_new)



f = open('./tr-cities-utf8-2.json','w')

f.write('{"type":"FeatureCollection","features":\n')
json.dump(parsedFeatures_new, f)
f.write('}\n')

f.close()

Bunun dışında tercihsel olarak Türkçe karakterlerin gösterimleri değiştirilmek istenirse aşağıdaki dönüşüm kullanılabilir:
\u0131 > ı, \u011f > ğ, \u00f6 > ö, \u00c7 > Ç, \u00fc > ü, \u015f > ş, \u0130 > İ, \u015e > Ş
‘ {“geometry”:’ > ‘\n{“geometry”:’

tr-cities-utf8.json dosyasının yukarıdaki Python kodu ile işlenmeden önceki (tr-cities-utf8.json) ve işlendikten sonraki (tr-cities-utf8-2.json) hallerini aşağıdaki bağlantıdan indirebilirsiniz.
python_geojson

Örnek çıktıda tr-cities-utf8-2.json dosyası GeoMap komponentinde kullanılmış ve değerler (gösterge, measure, kpi) beyazdan siyaha değerin büyüklüğüne göre ifade edilmiştir.

sap bo restful web service ile universe objelerini dosyaya çıkarma

Sap Business Objects RestFul Web Service Sdk kullanılarak universe (platform) objelerinin Python ile json formatında dosyaya çıkarılması. (Export universe object list to json file with Python)

Dosya olarak indir: export_universe_objects-py


#!/usr/bin/python
# -*- coding: utf-8 -*-



import requests, json

baseurl = 'http://hostname_ip:port/biprws' # change hostname ip port

headerJson = {'accept': 'application/json'}

r = requests.get(baseurl+'/logon/long', headers=headerJson)

headerJson2 = {'accept': 'application/json', 'content-type': 'application/json'}

postDataJson = '{"userName":"Administrator","password":"PassWD","auth":"secEnterprise"}' # change password

r = requests.post(baseurl+'/logon/long', headers=headerJson2, data=postDataJson)

sapBoLogonToken = '"' + json.loads(r.text)['logonToken'] + '"'

headerJson3 = {'accept': 'application/json', 'X-SAP-LogonToken': sapBoLogonToken}



def getUniverseIds(pj):
  ret = []
  if type(pj["universes"]["universe"]) is dict:
    if pj["universes"]["universe"]["id"] == "unx":
      ret.append( pj["universes"]["universe"]["id"] )
  elif type(pj["universes"]["universe"]) is list:
    pj2 = pj["universes"]["universe"]
    for pj2i in pj2:
      if pj2i["type"] == "unx":
        ret.append( pj2i["id"] )
  return ret

looperLimit = 2
looper = 0
looperOffset = looper * looperLimit

r = requests.get(baseurl+'/raylight/v1/universes?offset='+str(looperOffset)+'&limit='+str(looperLimit), headers=headerJson3)
parsedJson = json.loads(r.text)

universeIdList = []
while len(parsedJson["universes"]["universe"]) == looperLimit:
  universeIdList.extend( getUniverseIds(parsedJson) )
  looper += 1
  looperOffset = looper * looperLimit
  r = requests.get(baseurl+'/raylight/v1/universes?offset='+str(looperOffset)+'&limit='+str(looperLimit), headers=headerJson3)
  parsedJson = json.loads(r.text)

if type(parsedJson["universes"]["universe"]) is dict or ( type(parsedJson["universes"]["universe"]) is list and len(parsedJson["universes"]["universe"]) > 0 ):
  universeIdList.extend( getUniverseIds(parsedJson) )



def extractObjectsFromUniverseOutline(outline):
  r = []
  for oi in outline.keys():
    if oi == "item":
      if type(outline[oi]) is dict:
        r.append(outline[oi])
      elif type(outline[oi]) is list:
        r.extend(outline[oi])
    elif oi == "folder":
      if type(outline[oi]) is dict:
        r.extend( extractObjectsFromUniverseOutline(outline[oi]) )
      elif type(outline[oi]) is list:
        for oii in outline[oi]:
          r.extend( extractObjectsFromUniverseOutline(oii) )
  return r

universeObjectsList = []
for ui in universeIdList:
  r = requests.get(baseurl+'/raylight/v1/universes/' + str(ui) + '?aggregated=true', headers=headerJson3)
  parsedJson = json.loads(r.text)
  objectsList = []
  objectsList.append( "id:"+str(parsedJson["universe"]["id"]) )
  objectsList.append( "cuid:"+parsedJson["universe"]["cuid"] )
  objectsList.append( "name:"+parsedJson["universe"]["name"] )
  objectsList.append( "path:"+parsedJson["universe"]["path"] )
  objectsList = objectsList + extractObjectsFromUniverseOutline( parsedJson["universe"]["outline"] )
  universeObjectsList.append( objectsList )



f = open('./universe_object_list.json','w')

json.dump(universeObjectsList, f)

f.close()

dijkstra algoritması python

Dijkstra algoritması, Veri Madenciliğinde (Optimizasyonda) kullanılan Dna’ların benzemezliklerine (benzerliklerine) göre kümeleme algoritmasının Python kodu. (Dijkstra’s Algorithm, Data Mining, Optimization, Clustering Dissimilarity Matrix Calculation)

Ödev Soru 2: (pdf)

A group of plant biologists has identified 12 new species in a restricted geographical area. Based on a DNA sequence study, they have calculated a dissimilarity index (out of 100) for each pair. The resulting dissimilarity matrix is given below. They would like to understand how these species are related with each other. Are they all closely related to each other? Or, are they related to each other in group(s)? In order to answer these questions, they aim to cluster/organize them in groups for which
* dissimilarity within the group is minimal, and
* dissimilarity between the groups is maximal.
To achieve this goal, they use the following procedure:
Step 1. Given a threshold value (D) for dissimilarity index, construct a dissimilarity network where there is an arc between any two species with a dissimilarity index less than or equal to D. Identify each connected component and declare them as groups.
Step 2. Within each group construct a minimum spanning tree of dissimilarity so that the group’s similarity score can be calculated as the ratio of number of species in the group to the total dissimilarity index of the corresponding spanning tree.
As a result of this study, they will also identify a viable threshold value D.
Implement the above classification algorithm using a generic programming language (such as Python) for different values of D, identify each class and calculate the group similarity index for at least three different threshold values where the elements of the clusters and/or clusters’ similarity scores change.

dissimilarity_matrix

dissimilarity_cluster.py


# similarity cluster

import sets

dissimilarity_cluster = [
  [-1,50,21,41,44,18,91,12,90,77,89,31],
  [50,-1,81,88,36,70,19,49,67,100,35,74],
  [21,81,-1,40,98,79,65,84,60,15,37,60],
  [41,88,40,-1,18,49,31,96,78,93,41,38],
  [44,36,98,18,-1,36,77,94,70,52,49,31],
  [18,70,79,49,36,-1,87,40,15,90,0,46],
  [91,19,65,31,77,87,-1,40,31,34,22,60],
  [12,49,84,96,94,40,40,-1,15,25,3,87],
  [90,67,60,78,70,15,31,15,-1,60,17,100],
  [77,100,15,93,52,90,34,25,60,-1,21,83],
  [89,35,37,41,49,0,22,3,17,21,-1,15],
  [31,74,60,38,31,46,60,87,100,83,15,-1]
]

t = 15 # threshold

items = sets.Set() # 1..12

for i in range(1,len(dissimilarity_cluster)+1):
  items.add(i)

tree_list_set = [] # result list of cluster sets
tls = 0

comps = sets.Set() # compare set
comps.add(items.pop())

new_added_flag = 1

while (len(items)>0):
  # print items
  # print comps
  # print tls
  if (new_added_flag==0):
    tree_list_set.append( comps.copy() )
    comps.clear()
    comps.add(items.pop())
    new_added_flag = 1
    tls += 1
  else:
    new_added_flag = 0
  items_tmp = items.copy()
  comps_tmp = comps.copy()
  for i in comps_tmp:
    items_tmp = items.copy()
    comps_tmp = comps.copy()
    for j in items_tmp:
      if dissimilarity_cluster[i-1][j-1]<=t:
        # print "i: "+str(i)+"   j: "+str(j)
        items.remove(j)
        comps.add(j)
        new_added_flag = 1

if len(comps)>0:
  tree_list_set.append( comps.copy() )
  tls += 1

print tree_list_set

python Türkçe karakter

Metin içindeki İngilizce alfabede yer almayan Türkçe karakterleri çeviren ayrıca alfabe ve rakam harici karakterleri temizleyen python kodu.


#!/usr/bin/python
# -*- coding: utf-8 -*-

meaning_chars = [ '-', '_' ] # .

def tr2en(str):
  replace_chars = [ ('ı','i'), ('İ','I'), ('ü','u'), ('Ü','U'), ('ö','o'), ('Ö','O'), ('ç','c'), ('Ç','C'), ('ş','s'), ('Ş','S'), ('ğ','g'), ('Ğ','G') ]
  for search, replace in replace_chars:
    str = str.replace(search, replace)
  return str

def only_chars(str):
  chars = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
          ]
  str2 = ''
  for s in str:
    if s in chars:
      str2 += s
    else:
      str2 += ' '
  return str2

def clear_spaces(str):
  l = str.split(' ')
  l2 = []
  for li in l:
    if len(li)>0:
      l2.append(li)
  return ' '.join(l2)

def clear_chars(str):
  return clear_spaces(only_chars(tr2en(str)))

print clear_chars("as,")

sap bo uygulama servisleri bellek miktarları arşivi

Sap Business Objects platformunun uygulama servislerinin bellek kullanımını takip etmek için yazdığım Windows Batch script aşağıdadır. (taskman.bat) Bat dosyası saatlik olarak zamanlanarak (schedule) proseslerin bellek kullanımları arşivlenebilir. Üretim ortamlarına doğrudan (işletim sistemi seviyesinde) erişimin olmadığı durumlarda da servis belleklerine erişim amaçlı kullanılabilir.


@echo off

set hour=%time:~0,2%
if "%hour:~0,1%" == " " set hour=0%hour:~1,1%
rem echo hour=%hour%
set min=%time:~3,2%
if "%min:~0,1%" == " " set min=0%min:~1,1%
rem echo min=%min%
set secs=%time:~6,2%
if "%secs:~0,1%" == " " set secs=0%secs:~1,1%
rem echo secs=%secs%

set year=%date:~10,4%
rem echo year=%year%
set month=%date:~4,2%
rem echo month=%month%
set day=%date:~7,2%
rem echo day=%day%

set datetimef=%year%%month%%day%_%hour%%min%%secs%

tasklist > D:\tasklist\taskman_output_%datetimef%.txt

Sap Bo RESTful Sdk – Webi Rapor Sorguları Çıkarma – 2

Sap Business Objects ortamında Webi rapor sorgularının çıkarılması için yazdığım önceki yazımda raporların id’lerine (si_id) sıralı parçalar halinde Restful Web Service üzerinden ( http://10.1.2.3:6405/biprws/raylight/v1/documents?offset=200&limit=50 ) erişiliyordu. Bu durumda Webi rapor adetlerinin çok fazla olduğu üretim (production) ortamlarında BO Enterprise veritabanına çok karmaşık Sql sorguları gönderdiği için veritabanı sunucusunu çok olumsuz etkileyebiliyor. Örneğimizde veritabanı Oracle ve üretilen sorgunun where ifadesinde binlerce karşılaştırma yapılıyor, Oracle’a özel analitik fonksiyonlar kullanılmıyor, tüm veritabanlarında çalışabilecek çok uzun ve karmaşık Ansii Sql üretiliyor. Sonuç olarak rapor id’lerini Web Servis üzerinden değil de Admin Tools (Query Builder) üzerinden aşağıdaki sorgu ile metin dosyasına yazıp o dosyadaki id’lerin sorgularını çıkarma yoluna gidiyoruz. (Extract Report Sql by Sap BO RestFul Web Service Sdk and Python Request Json 2)

select si_id
from ci_infoobjects
where si_kind = 'Webi'

import requests
import json
import codecs

def restlogin( baseurl, u, p, logontype ):
  headerJson = {'accept': 'application/json'}
  r = requests.get(baseurl+'/logon/long', headers=headerJson)
  headerJson2 = {'accept': 'application/json', 'content-type': 'application/json'}
  postDataJson = '{"userName":"'+u+'","password":"'+p+'","auth":"'+logontype+'"}'
  r = requests.post(baseurl+'/logon/long', headers=headerJson2, data=postDataJson)
  logontoken = '"' + json.loads(r.text)['logonToken'] + '"'
  return logontoken

def restlogoff( logontoken ):
  headerJson4 = {'accept': 'application/json', 'content-type': 'application/json', 'X-SAP-LogonToken': logontoken}
  r = requests.post(baseurl+'/logoff', headers=headerJson4)

def reportNameToString( rn ):
  if type(rn) is int:
    return str(rn)
  else:
    return rn

def getReportSqls( i ):
  sql = ''
  r = requests.get(baseurl+'/raylight/v1/documents/'+str(i["id"]), headers=headerJson3)
  if r.status_code == 200:
    r = requests.get(baseurl+'/raylight/v1/documents/'+str(i["id"])+'/dataproviders', headers=headerJson3)
    if r.status_code == 200:
      parsedJsonDP = json.loads(r.text)
      if type(parsedJsonDP['dataproviders']) is not str and type(parsedJsonDP['dataproviders']) is not unicode and type(parsedJsonDP['dataproviders']['dataprovider']) is not str and type(parsedJsonDP['dataproviders']['dataprovider']) is not unicode:
        if type(parsedJsonDP['dataproviders']['dataprovider']) is dict:
          if 'dataSourceType' in parsedJsonDP['dataproviders']['dataprovider'].keys() and parsedJsonDP['dataproviders']['dataprovider']['dataSourceType'][0:2] == "un":
            r = requests.get(baseurl+'/raylight/v1/documents/'+str(i["id"])+'/dataproviders/'+str(parsedJsonDP['dataproviders']['dataprovider']['id']), headers=headerJson3)
            if r.status_code == 200 and 'query' in json.loads(r.text)['dataprovider'].keys():
              sql += '\n' + json.loads(r.text)['dataprovider']['query'] + '\n'
        else:
          for j in parsedJsonDP['dataproviders']['dataprovider']:
            if 'dataSourceType' in j.keys() and j['dataSourceType'][0:2] == "un":
              r = requests.get(baseurl+'/raylight/v1/documents/'+str(i["id"])+'/dataproviders/'+str(j['id']), headers=headerJson3)
              if 'query' in json.loads(r.text)['dataprovider'].keys():
                sql += '\n' + json.loads(r.text)['dataprovider']['query'] + '\n'
  return sql



baseurl = "http://10.1.2.3:6405/biprws"
uname = "Administrator"
pword = "PassWD"
logontype = "secEnterprise"

logontoken = restlogin(baseurl, uname, pword, logontype)

headerJson3 = {'accept': 'application/json', 'X-SAP-LogonToken': logontoken}

f = codecs.open('C:/sqllist.txt', 'w', encoding='utf8')



f2 = open('C:/si_id.txt','r')
si_id_list = f2.read().split('\n') # [:-1]

print "bas 1"

for j in si_id_list:
  print "for: " + str(j)
  r = requests.get(baseurl+'/raylight/v1/documents/'+str(j), headers=headerJson3)
  if r.status_code == 200:
    i = json.loads(r.text)['document']
    sql = getReportSqls(i);
    f.write('\nsi_id:' + str(i["id"]) + '\nsi_name:' + reportNameToString(i["name"]) + '\n' + sql)

print "son 1"

f.close()

restlogoff( logontoken )