skip to Main Content

python da pandas ile excel üzerinde çalışmak – 1

pythonda excel dosyaları ile çalışmak için kullanabileceğiniz kütüphane sayısı oldukça fazla. bu kütüphanlerin kendine göre avantajları mevcut. bu kısa yazıda kullanımı oldukça kolay olan pandaw dan bahsedegim

öncelikle pandası kuralım

pip3 install pandas

kurulum sorunsuz olarak tamamlandıktan sonra ilk örneğimizi yapabiliriz. temel ıolarak üç adım mevcut.

import pandas as pd   # 1. adim kutuphaneyi import ediyoruz

excel_text = pd.read_excel(r'router.xls')  # 2. adim excel dosyami belirtiyoruz

print (excel_text ) # 3. ekrana yazdiriyoruz / işliyoruz..

en temel haliye excel içindeki verileri text ortamına aktarmış olduk.. bu python dosyamızı çalıştırınca aşagıdaki şekilde bir çıktı elde ediyoruz.

root@fcicek:~/python/# python3 router_excel.py 
       router interface
0    router_a     0/0/1
1    router_b     0/0/2
2    router_c     0/0/3

csv dosyası üzerinde çalışmak istereniz read_excel yerine read_csv kullanmanız gerekmektedir. ; ile ayrılmış ve utf8 ile kodlanmış bir csv dosyasında çalışmak isterseniz

data = pd.read_csv (r'router.csv', sep=';', encoding='utf8', quotechar='"') 

işinize yarayacaktır. eğer herhangi bir sutun veya satır ile çalışmak istiyorsak

df = pd.DataFrame(data, columns= ['router'])

ile çalışacağınız sütünu seçebilirsiniz. satırları okuyorak satırlardaki veriler ile işlem yapmak için ise


for i in df.index:
    print(df['router'][i]+'----'+df['interface'][i])

yapısını kullanabilirsiniz. pandas konusunda daha detaylı bilgilere erişmek isterseniz aşagıdaki bağlantılar işinize yarayacaktır

https://pandas.pydata.org/docs/

https://pandas.pydata.org/docs/pandas.pdf

https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf

wordpress xmlrpc erişimini kapatmak

oluşturulmasında ve kullanılmasındaki temel düşünce güzel olsada kullanılmıyorsa xmlrpc wordpress için güvenlik açığı riski barındırıyor.

apache kullanıyorsanız .htacces dosyasına aşagıdaki ilaveleri yaparak riskleri minimize etmiş olursunuz.


# .htaccess WordPress xmlrpc.php devre disi birakmak
<Files xmlrpc.php>
 order deny,allow
 deny from all
 #allow from <izin verilen ip adresleri>
 allow from xxx.xxx.xxx.xxx
</Files>

nokia sros için araçlar

genel olarak network ekipmanlarında cli ile konfigürasyon yapıyorsanız sıklıkla kopyala – yapıştır yapıyorsunuzdur. ancak bu yöntem hatalara oldukça açıktır.

bu hatayı minimize etmek adına python ile yazılmış nokia sros güzel bir kod bulmuştum. bunu paylaşmak istedim. örnek için aşağıdaki şekilde bir konfigürasyonumuz olsun.. bunu c1.txt olarak kaydediyoruz.

        vpls 11 customer 1 vpn 11 i-vpls create
            backbone-vpls 100:11
            exit
            stp
                shutdown
            exit
            sap 1/5/1:11 create
            exit
            sap 1/5/1:12 create
            exit
            no shutdown
        exit
        vpls 100 customer 1 vpn 100 b-vpls create
            service-mtu 2000
            stp
                shutdown
            exit
            mrp
                flood-time 10
                no shutdown
            exit
            sap 1/5/1:100 create
            exit
            spoke-sdp 3101:100 create
            exit
            spoke-sdp 3201:100 create
            exit
            no shutdown
        exit

t.py olarak kaydettiğimiz python kodunu çalıştığımızda mevcut kodumuz aşağıdaki örnekte görüleceği üzere yeniden düzenleniyor. bu şekilde bir yapı bir çok olası hatanın önüne geçecektir.

fcicek@cicek:~/mpls/sros$ python t.py c1.txt
/configure vpls 11 customer 1 vpn 11 i-vpls create backbone-vpls 100:11
/configure vpls 11 customer 1 vpn 11 i-vpls create stp shutdown
/configure vpls 11 customer 1 vpn 11 i-vpls create sap 1/5/1:11 create
/configure vpls 11 customer 1 vpn 11 i-vpls create sap 1/5/1:12 create
/configure vpls 11 customer 1 vpn 11 i-vpls create no shutdown
/configure vpls 100 customer 1 vpn 100 b-vpls create service-mtu 2000
/configure vpls 100 customer 1 vpn 100 b-vpls create stp shutdown
/configure vpls 100 customer 1 vpn 100 b-vpls create mrp flood-time 10
/configure vpls 100 customer 1 vpn 100 b-vpls create mrp no shutdown
/configure vpls 100 customer 1 vpn 100 b-vpls create sap 1/5/1:100 create
/configure vpls 100 customer 1 vpn 100 b-vpls create spoke-sdp 3101:100 create
/configure vpls 100 customer 1 vpn 100 b-vpls create spoke-sdp 3201:100 create
/configure vpls 100 customer 1 vpn 100 b-vpls create no shutdown

kullanılan t.py

#!/usr/bin/env python3

import re
import math
import sys

def pop(stack):
    try:
        stack.pop()
    except Exception as err:
        print("ERROR: Unable to flush stack - %s" %err)

def output(stack):
    output = " ".join(stack)
    print(output)
    return output

def sros_flatten(data):
    stack = []
    exit_detected = False
    indent = 0
    new_conf = ""

    for line in data.lstrip().splitlines():
        l = len(line) - len(line.lstrip())
        nxt_indent = math.ceil(float(l/4))

        if line.startswith(("#", "echo")) or line.strip() == "":
            pass
        elif line.strip() == "exit all":
            new_conf = new_conf + "\n" + output(stack)
        else:
            if nxt_indent == 0 and line.strip() == "configure":
                new_line = str("/") + str(line.strip())
                stack.append(new_line)

            elif nxt_indent > indent:
                if line.strip() != "configure" and len(stack) == 0:
                    stack.insert(0, "/configure")
                stack.append(line.lstrip())

            elif nxt_indent == indent:
                if line.strip() != "exit":
                    if exit_detected:
                        stack.append(line.strip())
                    else:
                        if len(stack) != 0:
                            new_conf = new_conf + "\n" + output(stack)
                            pop(stack)
                            stack.append(line.strip())
                        else:
                            stack.insert(0, "/configure")
                            stack.append(line.strip())
                    exit_detected = False

            else:
                if line.strip() == "exit":
                    if not exit_detected:
                        new_conf = new_conf + "\n" + output(stack)
                        del stack[-2:]
                    else:
                        pop(stack)
                    exit_detected = True

                else:
                    new_conf = new_conf + "\n" + output(stack)
                    exit_detected = False
                    pop(stack)
            indent = nxt_indent
    
    return new_conf

def main():
    filename = sys.argv[1]
    with open(filename, 'r') as f:
        data = f.read()

    sros_flatten(data)

if __name__ == "__main__":
    main()

Akıllı Ulaşımda GTFS (General Transit Feed Specification) – I

akıllı şehir kavramının en temel alt kavramı ve olmazsa olmazı elbetteki akıllı ulaşım. akıllı ulaşımın temel amacını ise “a noktasından b noktasına en hızlı , ekonomik ve güvenli ulaşım” şeklinde özetleyebiliriz.

akıllı ulaşımı ise kendi içinde farklı alanlara ayırabiliriz. bunlara örnek verecek olursak

  • toplu ulaşım yapısı ve planlaması
  • sinyalizasyon ve yönlendirmeler
  • park sistemleri
  • trafik analizi ve navigasyon hizmeti

vb şeklinde sayıyı arttırabiliriz. şimdi gelelim yazımızın ana konusuna toplu taşıma ile a noktasından b noktasına erişim olayına.

bir şekirde a noktasından b noktasına gitmek istediğimizi düşünelim. bunun için neler gerekmektedir aklımıza gelebilecekleri yazmaya çalışalım.

  • öncelikle cebinizde ulaşımı sonlandıracak seviyede para olması gerekmektedir ve toplu ulaşım sistemine ait ödeme sistemine sahip olmalısınız. güzergahtaki seferlere ait ücret bilgisini bilmelisiniz.
  • bineceğiniz ve ineceğiniz durakları bilmelisiniz
  • aktarma yapacaksanız aktarma noktalarını bilmelisiniz.
  • birden fazla alternatif varsa metro, vapur v.b. bu alternatifleri bilmelisiniz
  • ….

temel olarak en hızlı ve ekonomik olarak yolculuğu gerçekleştirmek için yukarıdaki bilgileri sahip olmalısınız. bu bilgileri bir düzen altında toplanması ve paylaşılması için   standart altında toplama gereksinimi sonucu oluşturulmuş standartlardan bir tanesi General Transit Feed Specification (GTFS) dir.

GTFS standartı ile toplu taşıma bilgileri için 13 farklı dosya – tablo oluşturulmuştur. Bu standart gereği 6 tanesi zorunludur. standartda kullanılan dosyalar ait temel açıklamalar aşagıdaki tabloda yer almaktadır. tablolar hakkında daha detaylı bilgi almak için dosya adları üzerine tıklayabilirsiniz.

Dosya adı Zorunluluk durumu Açıklaması
agency.txt gerekli verileri sağlayan bir veya daha fazla toplu ulaşım hizmeti sağlayan kurumlara ait bilgiler
stops.txt gerekli araçların yolcu indirme/birdirme yaptıkları noktalar.
routes.txt gerekli güzergah bilgisi yer alır. güzergah üzerinden birden fazla sefer bulunabilir.
trips.txt gerekli Güzergah üzerindeki tüm sefer bilgilerini içerir.

Her rota için geziler. Gezi, belirli bir saatte gerçekleşen iki veya daha fazla durak dizisidir.

stop_times.txt gerekli Toplu taşıma araçlarının duraklara ulaşma ve duraktan ayrılma zamanı yer alır.
calendar.txt gerekli Hizmetin ne zaman başlayıp bittiğini ve hizmetin mevcut olduğu haftanın günlerini belirtir.
calendar_dates.txt isteğe bağlı Calendar.txt dosyasında tanımlanan servisler için istisnaları içerir. örnek olarak resmi tatillerdeki değişimler.
fare_attributes.txt isteğe bağlı Toplu ulaşım kurumlarının güzergahlar için belirlediği ücret bilgileri yer almaktadır
fare_rules.txt isteğe bağlı Toplu ulaşım kurumlarının güzergahlar için belirlediği ücret bilgileri uygulama kuralları yer almaktadır.
shapes.txt isteğe bağlı bir güzergahın harita üzerinde temsil edilirken kullanılacak çizgi ve simgeler kuralları.
frequencies.txt isteğe bağlı Güzergahlardaki değişen servislere ait zaman bilgilerini, aradaki süre farkları içerir.
transfers.txt isteğe bağlı Transfer noktaları arasındaki aktarım için bağlantı kurallar. (30 dk içerisinde ücretsiz v.b. gibi)
feed_info.txt isteğe bağlı İçerik hakkında yayıncı, sürüm ve son kullanma bilgileri gibi ek bilgileri

dosyalar arasında temel bağlantıları gösteren diagram ise aşagıdaki yer almaktadır.

bu verilerin işletmeci, belediye v.b. bir organizasyon tarafından hazırlanıyor olması ve tüm geliştiricilere açılıyor olması gerekliki buraya kadar baktığımız temel bilgiler bir işe yarasın. ülkemiz için bu bilgilerin olduğu işletmeci belediye bilgisi ne yazıkkı iki elin parmakları kadar.

google, microsoft, yandex gibi şirketlerin harita uygulamaları üzerinden belirgin iller için navigasyon seçenekleri arasında toplu taşıma seçenekleri çıkmaktadır.

sadece bu alanda özelleşen moovit uygulmasına göre ülkemize toplu taşıma bilgisinin yer aldığı iller aşagıdaki gibidir. yani bu illere ait veriler bir şekilde paylaşılıyor – paylaşılmış durumdadır.

bu bilgilere ulaşabilirseniz gelişime açık olan bu alanda bir uygulama yazabilirsiniz. bu yazıyı yazarkent istanbul haricinde bu verilere ulaşamadığımı belirtmek isterim. verilere ulaştıktan sonra moovit tarzından bir hizmet sunabilmenin nasıl yapılacağını merak ediyorsanız

opentripplanner.org

adresini inceleyebilirsiniz. bu noktada esas girişim belediyelerin bu verileri hızlıca oluşturacakları ve günceleyecekleri bir arayüz servise sunmak daha sağlıklı olacaktır.

toplu ulaşım verisi konusunda ülkemizde en iyi şehir istanbul. bunun nedeni ise avrupa birliğinin akıllı şehirler projesinde pilot şehirlerden bir tanesi olması. proje nedir neler yapıldığını merak ediyorsanız www.citysdk.eu adresi size yardımcı olacaktır.

bir sonraki yazıda basit bir uygulama anlatmaya çalışacağım. yazı konusunda tarih net olmadığı için o işin detayını merak edenler

https://developers.google.com/transit/gtfs/
http://gtfs.org
https://github.com/opentripplanner
https://github.com/BlinkTagInc/gtfs-to-html

adreslerini inceleyebilirsiniz.

“/usr/bin/env: `node’: Böyle bir dosya ya da dizin yok” hatası

fcicek@fcicek-home:~$ cordova create MyApp
/usr/bin/env: `node': Böyle bir dosya ya da dizin yok

hatası ile karşılaşıyorsanız nodejs ile ilgili eksik bir şeyler kurulmuş olabilir..

root@fcicek-home:~# sudo apt-get install nodejs-legacy

ı tekrar kurduktan sonra yeniden denmekte fayda var.

fcicek@fcicek-home:~$ cordova create MyApp
? May Cordova anonymously report usage statistics to improve the tool over time? Yes

Thanks for opting into telemetry to help us improve cordova.
Creating a new cordova project

HC-SR04 ultrasonik modül kullanarak arduino uno platformunda mesafe ölçümü örneği 1

ultrasonik alıcı vericiler mesafe ölçme, cisim algılama vb bir çok alanda günlük hayatımızın içinde yer almaktadır. tüm bu uygulamalar sesin farklı ortamlarda yayılma hızının farklı olması, yansıma ve doppler kanunlarının kullanılması ile mümkün olmaktadır.

sesin yayılma hızı ortam yoğunluğuna, sıcaklığa vb kriterere bağlı değişmektedir. 0 derecede 1 atmosferde sesin havada yaklaşık olarak 340 m/s ile hızla ilerlediğini kabul edebiliriz. (kritik bir uygulama yapılmıyorsa)

konu hakkında bilgi alınmak istenirse https://www.grc.nasa.gov/www/k-12/airplane/sound.html adresinden yararlanılabilir.

piyasdaki en uygun fiyatlı ultrasonic sensor HC-SR04. bu nedenden dolayı çokca örnek uygulama bulabilirsiniz. ürüne ait temel bilgiler ve zamanla diagrami aşağıda yer almaktadır.

 Çalışma Voltajı  DC 5V
 Çektiği Akım  15 mA
 Çalışma Frekansı  40 Hz
 Maksimum Görme Menzili  4m
 Minimum Görme Menzili  2cm
 Görme Açısı  15 °
 Tetik Bacağı Giriş Sinyali  10 us TTL Darbesi
 Echo Çıkış Sinyali  Giriş TTL sinyali ve Mesafe Oranı
 Boyutları  45mm x 20mm x 15mm

 

bu bilgilere göre echo portundan okuduğumuz değeri 58 e bölersek cismin uzaklığını cm cinsinden yaklaşık olarak elde etmiş oluruz.

HC-SR04 ün arduino ile fiziksel bağlantılarını aşagıdaki şekilde yapabiliriz. kullanacağınız pingleri kendi uygulamanıza göre uyarlayabilirsiniz.

devreye ait kod ise

	
/*
HC-SR04 ornegi

 *  Arduino | HC-SR04 
 *  -------------------
 *    5V    |   VCC 
 *    10    |   Trig
 *    9     |   Echo 
 *    GND   |   GND
*/
 
//hc-sr04 sensorune ait kullanicak trigger ve echo portlari
const int trig_pin = 10;
int echo_pin = 9;
 
//uygulamada kullanilacak guvenli mesafe
int guvenlik_mesafesi = 10;
 
//uygulamada gunveli mesafe bilgisini ledle takip edebilmek icin
//kullanilacak pinler
int led_mesafe_guvenli = 3, 
led_mesafe_guvensiz = 2;
 
void setup() {
  //uygulada kullanilacak pinlerin durumunu ayarlayalim
  Serial.begin(9600);
  
  pinMode(trig_pin, OUTPUT);
  pinMode(echo_pin, INPUT);
  
  pinMode(led_mesafe_guvenli, OUTPUT);
  pinMode(led_mesafe_guvensiz, OUTPUT);  
}
 
void loop()
{
  //sesin_suresi milisaniye cinsinden bir veridir.
  //bu veri santimetreye cevrilmektedir.
  long sesin_suresi, mesafe_cm;
 
 
  //olcum oncesi trigger low yapilarak sinyal gonderilmesi engellenir
  //10 ms sinyal gonderildikten sonra  
  //bunun amaci olasi hata olcumlerini minimize etmektedir
  digitalWrite(trig_pin, LOW);
  delayMicroseconds(2);
  digitalWrite(trig_pin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trig_pin, LOW);
 
  //
  pinMode(echo_pin, INPUT);
  sesin_suresi = pulseIn(echo_pin, HIGH);
 
  // olculen sureyi cm olarka mesafeye cevirme
  mesafe_cm = sesin_suresi / 29 / 2 ;
 
  //modulun olcum sinirlari disinda ise seri porttan menzil disi mesajinin
  //olcum sinilari icinde ise mesafe bilgisinin seria porttan gonderilmesi
  if (mesafe_cm > 200 || mesafe_cm < 2){
   Serial.println("Menzil Disi");
   }
   else {
      Serial.print(mesafe_cm);
      Serial.print("  cm");
      Serial.println();
   }
 
  //olculen mesafenin guvenli mesafe icinde olup olmaginin testi
  //olculen mesafeye ledlerinin durumunun degistirilmesi
  if (mesafe_cm > guvenlik_mesafesi)
  {
    digitalWrite(led_mesafe_guvenli, HIGH);
    digitalWrite(led_mesafe_guvensiz, LOW);
  }
  else
  {
    digitalWrite(led_mesafe_guvensiz, HIGH);
    digitalWrite(led_mesafe_guvenli, LOW);
  }
 
  delay(100);
}

dfdf

basit arduino uygulamaları : led animasyon 1

arduino konusunda en temel uygulamalardandır led flash uygulaması yapmak. konuya meraklı kişiler ilk ledli uygulamasını yaptıktan sonra daha elle tutulur şeyler yapmak isterler. bu noktada bir zaman yapmış olduğum bir uygulamayı bende yazı haline getireyim.

uygulamada uno r3 kullandım. uno nun 3, 5, 6, 9, 10, 11 pinleri çıkış olarak kullanılmaktadır. ledleri bu pinlere bağlamadan önce 200 ohm civarı bir direnç kullanmayı unutmayın. devrenin şeması aşağıdaki gibidir.

devrenin kodu ise

int led_sayisi = 6;
int led_pin[6] = {3, 5, 6, 9, 10, 11};
  
void setup() {
  Serial.begin(9600);
  //belirledigimiz tum pinleri cikis yapalim
  for (int i = 0; i < led_sayisi; i++) {
    pinMode(led_pin[i], OUTPUT);
  }
}
  
void loop() {
  animasyon_1();
}
  
void animasyon_1() {
//tüm ledleri sonuk olarak belirleyelim
  int led_durum[6] = {0, 0, 0, 0, 0, 0 };
  for (int j = 0; j < 2; j++) {
//tum ledlerin konumunu sırasyla degistirelim
//ilk dongude led sonuk durumdaysa yanacak
//dongu tekrar edersen yanik durumdaysa sonecek
    for (int i = 0; i < led_sayisi; i++) {
      led_durum[i] = ~led_durum[i];
      digitalWrite(led_pin[i], led_durum[i]);
      delay(150);
    }
  }
}

devreyi kurup uygularsanız aşagıda yer alan videodaki gibi sonuç göreceksiniz.

Devreye ait fritzing dosyası – Arduino led animasyon 1

Back To Top