Linux’ta disk doluluk oranının yanlış hesaplanması

July 22nd, 2013 No comments

diskBir sunucuda garip bir problemle karşılaştım, diskte yer kalmadığını söylüyordu fakat ne yaparsam yapayım diski dolduran dosyaları bulamıyordum. Biraz araştırınca sorunu ve çözümünü buldum. Senaryo şöyle idi:

  1. Dosya bir program tarafından okumak için açılır.
  2. Başka bir program bu dosyayı siler.

Bu senaryo gerçekleştiğinde, her ne kadar dosya silinmiş olsa da, hala diskte yer tutmaya devam edecektir. “du” komutuyla baktığınızda yer tutmayacaktır, ancak df ile kontrol ettiğimizde disk dolu olarak görünecektir.

Basit bir demo yapacağım:

Öncelikle 1GB boyutunda bir dosya oluşturacağım.

mkdir /tmp/tmp_directory/
cd /tmp/tmp_directory/
dd if=/dev/zero of=1gb_file.dat bs=1M count=1024

Oluşturulan bu dosyayı python ile açacağım.

python
Python 2.7.4 (default, Jul  5 2013, 08:21:57)
[GCC 4.7.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> f = open("1gb_file.dat", "rwb")
>>>

Şimdi disk bilgilerine bakıyorum

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda5       414G   11G  382G   3% /

Görüldüğü gibi diskin 11GB’lık kısmı kullanılıyor.

du -sh tmp_directory/
1.1G    tmp_directory/

tmp_directory dizini diskte 1.1GB yer tutuyor.

Şimdi dosyayı siliyorum.

rm tmp_directory/1gb_file.dat

Disk bilgilerini tekrar kontrol edelim:

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda5       414G   11G  382G   3% /

du -sh tmp_directory/
4.0K    tmp_directory/

Görüldüğü gibi, df çıktısı hala diski 11GB dolu görüyor, du ile baktığımızda ilgili dizinin boyu sadece 4KB, buda boş bir dizinin diskte tuttuğu yer.

Açtığımız dosyayı geri kapatalım.

>>> f.close()

Tekrar kontrollerimizi yapalım:

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda5       414G   10G  383G   3% /

Dosya kapatıldıktan sonra 1.1GB’lık alan tekrar boş olarak hesaplandı.

Bu dosyayı biz oluşturduğumuz için hangi dosya üzerinde işlem yapacağımızı biliyorduk, peki bu durumda olan dosyalarını nasıl bulabiliriz?

lsof komutu yardımıyla bunu yapabiliriz.

sudo lsof | grep deleted
python    21882            askin    3r      REG                8,5         0    7211180 /tmp/tmp_directory/1gb_file.dat (deleted)

Bu şekilde hangi açık dosyaların silinmiş olduğunu görebiliriz. Bu çıktıya göre, askin kullanıcısı 21882 process id’si ile python programıyla /tmp/tmp_directory/1gb_file.dat dosyasını açmış, fakat bu dosya hala açıkken silinmiş. Bu dosyayı kapatmak için biraz daha bilgiye ihtiyacımız var.

sudo ls -l /proc/21882/fd/*
lrwx------ 1 askin askin 64 Jul 22 14:58 /proc/21882/fd/0 -> /dev/pts/11
lrwx------ 1 askin askin 64 Jul 22 14:58 /proc/21882/fd/1 -> /dev/pts/11
lrwx------ 1 askin askin 64 Jul 22 14:58 /proc/21882/fd/2 -> /dev/pts/11
lr-x------ 1 askin askin 64 Jul 22 14:58 /proc/21882/fd/3 -> /tmp/tmp_directory/1gb_file.dat (deleted)

Burdan aldığımız bilgiyle dosyamızı kapatabiliriz.

sudo cat /dev/null > /proc/21882/fd/3
Categories: Gezegen, Linux Tags: , , , ,

Python Sözlük Hızlı Rehber

July 20th, 2013 No comments

Başlığında söylediği gibi, Python sözlük hızlı rehber

# Anahtar/değer çiftleriyle sözlük tanımlama
dict = {
    'anahtar1′ : 'deger1′,
    'anahtar2′ : 'deger2′,
    'anahtar3′ : 'deger3′
}

# Tüm anahtarları al
sozluk.keys()

# Tüm değerleri al
sozluk.values()

# Düzenleme
sozluk['anahtar2'] = 'deger8′

# Erişim
print sozluk['anahtar1']

# 'deger2'yi yazdır
print sozluk['anahtar2']

# Boş sözlük tanımlama ve değer atama
bosSozluk = {}
bosSozluk['anahtar4'] = 'deger4'

# Sözlük üzerinde döngü kurma (foreach)
for anahtar in sozluk:
    print sozluk[anahtar]

# Anahtarları sıralayıp, o sıraya göre değerleri yazdırmak
anahtarlar = sozluk.keys()
anahtarlar.sort()
for anahtar in anahtarlar:
    print sozluk[anahtar]

# Değerlere göre döngü kurmak (sıralı değil)
for deger in sozluk.values():
    print deger

# Tek seferde anahtar ve değer çiftlerini al
for anahtar, deger in sozluk.items():
    print "%s=%s" % (anahtar, deger)

# Kayıt silme
del sozluk['anahtar2']

# Tüm kayıtları silmek
sozluk.clear()

# Boyut
len(sozluk)
Categories: Programlama Tags: , ,

Listeler ile ilgili garip bir döküman

July 13th, 2013 No comments

Bu yazı oluşturulurken http://www.pythonforbeginners.com/python-lists-cheat-sheet/ adresindeki yazı referans alınmıştır. Bir çok yeri doğrudan çeviri olmakla beraber bir kısmını kendim baştan yazdım. Yazım – Mantık hataları vs. bulursanız yorum yazmaktan çekinmeyin.

Liste Nedir?

Bir veya birden fazla elemanı tutmak için kullanılan en basit veri yapısıdır. Liste elemanlar topluluğudur (string, integer ve hatta diğer listeler). Listedeki her bir elemana index değeri atanır.
Listeler köşeli parantezler ile açılıp kapatılır. Listedeki her bir eleman virgül ile ayrılır. Stringlerin aksine listeler mutable – değişkendir, bunun manası listeler değiştirilebilir.

Liste Yaratma

Listeler köşeli parantez ile açılıp kapatılan, virgülle ayrılmış elamanlarla yaratılır.
Listeler bir takım değerler tutar (aynı stringlerin karakter serileri barındırması gibi).
Listeler çok kolay yaratılır, aşağıda liste oluşturmanın birkaç yolu vardır

emptyList = [ ]  

list1 = ['one, two, three, four, five']
 
numlist = [1, 3, 5, 7, 9]
 
mixlist = ['yellow', 'red', 'blue', 'green', 'black']
 
# Boş bir liste adece köşeli parantez kullanılarak oluşturulur:
list = []

Liste Boyu

len fonksiyonunu kullanarak listenin boyunu alabiliriz.

list = ["1", "hello", 2, "world"]
len(list)
>>> 4

List Append (Ekleme)

Append listenin sonuna eleman ekleyecektir. Eğer listenin başına ekleme yapmak istiyorsanız insert fonksiyonunu kullanabilirsiniz.
list.insert(0, “Files”)

list = ["Movies", "Music", "Pictures"]
  
# list.append(x) listenin sonuna bir eleman ekleyecektir
list.append("Files")
 
print list
>>> ['Movies', 'Music', 'Pictures', 'Files']

List Insert (Araya ekleme)

Syntax: list.insert(x, y) # y elemanını x. elemanın önüne yerleştirecektir

list = ["Movies", "Music", "Pictures"] 
 
list.insert(2,"Documents")
 
print list
['Movies', 'Music', 'Documents', 'Pictures', 'Files']
 
# Listede istediğiniz bir yere eleman ekleyebilirsiniz
 
list = ["Movies", "Music", "Pictures"] 
list.insert(3, "Apps")

List Remove (eleman çıkartma)

Listeden bir elemanı çıkartmak için remove metodu kullanılır. Eğer eleman listede birden fazla tekrar ediyorsa, sadece ilk eleman çıkartılır, diğerleri kalır.

Syntax: list.remove(x)

List = ['Movies', 'Music', 'Files', 'Documents', 'Pictures']
 
list.remove("Files")
 
print list
['Movies', 'Music', 'Documents', 'Pictures']
 
a = [1, 2, 3, 4]
a.remove(2)
print a
>>> [1, 3, 4]

List Extend (Liste genişletme)

Listeleri birleştirmek istediğimz zaman extend metodunu kullanabiliriz.
Syntax: list.extend(x) # x listesinin elamanlarını listeye ekleyecektir

list2 = ["Music2", "Movies2"]
list1.extend(list2)
 
print list1
>>> ['Movies', 'Music', 'Documents', 'Pictures', 'Music2', 'Movies2']

List Del (Listeden silme)

Belli bir indexteki elemanı çıkartmak için del fonksiyonunu kullanırız.

list = ["Matthew", "Mark", "Luke", "John"]
del list[1]
 
print list
>>> ["Matthew", "Luke", "John"]

List Keywords

“in” terimi bir elemanın listede olup olmadığını kontrol etmek için kullanılabilir.

list = ["red", "orange", "green", "blue"]
if "red" in list:
    do_something()
     
# "not" terimi "in" ile birlikte kullanılabilir
 
list = ["red", "orange", "green", "blue"]
if "purple" not in list:
    do_something()

List Reverse (Liste tersi)

Reverse metodu tüm listenin sıralamasını tersine çevirecektir.

L1 = ["One", "two", "three", "four", "five"]
  
# Listeyi olduğu gibi yazdır
print L1
>>> ["One", "two", "three", "four", "five"]

# Listeyi tersten yazdır
for i in L1[::-1]:
    print i
 
# YADA
 
L = [0, 10, 20, 40]
L.reverse()
 
print L
>>> [40, 20, 10, 0]

List Sorting (Sıralama)

Bir listeyi sıralamanın en kolay yolu sorted fonksiyonunu kullanmaktır.
Bu fonksiyon parametre olarak bir fonksiyon alır ve sıralanmış olarak yeni bir liste döndürür. Asıl liste değişikliğe uğramaz.

sorted() fonksiyonu opsiyonel parametrelerle özelleştirilebilir. “reverse=True” parametresi listeyi tersten sıralanmış olarak döndürecektir. sorted(list, reverse=True)

# içinde bazı numaralar olan bir liste oluştur
numbers = [5, 1, 4, 3, 2, 6, 7, 9]
  
# numaraları sıralı olarak yazdır
print sorted(numbers)
  
# asıl listenin elemanları bir değişikliğe uğramadı
print numbers
my_string = ['aa', 'BB', 'zz', 'CC', 'dd', "EE"]
 
# Eğer hiç bir parametre kullanılmazsa ön tanımlı değerler kullanılacaktır (Büyük - Küçük duyarlı)
print sorted(my_string)
 
# reverse parametresi ile tersten sıralayacaktır
print sorted(strs, reverse=True)   # ['zz', 'aa', 'CC', 'BB']

# Bu bir sonuç döndürmeyecektir, listeyi değiştirecektir
list.sort()

List Split (Dilimleme)

Bir stringi dilimleyip liste haline getirebiliriz. Bunu yapmak için split metodunu kullanırız. Eğer metoda parametre geçirmezsek boşluk karakterine göre dilimleyecektir.

list = 'one, two, three, four, five'
newlist = list.split(',')
 
print newlist
>>> ['one', ' two', ' three', ' four', 'five']

List Indexing

Listedeki her bir elamana 0dan başlayacak şekilde bir numara atanır. Bu numaraya index adı verilir. Bu index kullanılarak listenin elemanına doğrudan erişebiliriz.

list    = ["first", "second", "third"]
list[0] == "first"
list[1] == "second"
list[2] == "third"

List Slicing

Bazen listenin bir kısmına ulaşmak isteyebiliriz. Python bunu dahali olarak destekler. Bir listenin elemanına ulaşmaya çalışır gibi, başlangıç ve bitiş indexleri vererek belirli bir aralıktaki değerleri liste olarak alabiliriz.

colors = ['yellow', 'red', 'blue', 'green', 'black']
 
print colors[0]
>>> yellow
     
print colors [1:]
>>> red, blue, green, black

Bu stackoverflow sayfasından alınan örneğe bakalım.

# baslangictan, son indexine kadar (son dahil değil)
a[baslangic:son]
# baslangic indexinden listenin sonuna kadar
a[baslangic:]
# listenin basindan, son indexine kadar (son dahil değil)
a[:son]
# tüm listenin kopyası
a[:]

Birde kullanabileceğimiz adım sayısı vardır.

# belirli adimlara göre
a[start:end:step]

FIXME: hem anlatım bozukluğuna bak, hemde test et
Bir diğer özellik de başlangıç ve bitiş değerleri negatif sayı olabilir, bu durumda listenin başından değilde sonundan itibaren saymamız gerekir.

# listedeki son eleman
a[-1]
# listenin son iki elemanı
a[-2:]
# son iki eleman hariç listenin tüm elemanları
a[:-2]

List Loops

Bazen bir liste üzerindeki elemanları kullanacak bir döngü kurmak isteriz. Pythonda bunu “in” terimi kullanarak rahatlıkla yapabiliriz.

# Buna benzeyebilir
matching = []
for term in mylist:
    do something
 
# Bir koşulu saylayan liste elemanlarını başka bir listeye atmak
matching = []    # Boş bir liste oluştur
for term in mylist:
    if test(term):
        matching.append(term)
 
# İçinde eleman olan bir listeyi bu şekilde döngüye sokabiliriz
items = [ 1, 2, 3, 4, 5 ]
for i in items:
    print i

List Methods

Calls to list methods have the list they operate on appear before the method name.

Any other values the method needs to do its job is provided in the normal way as
an extra argument inside the round brackets.

s = ['h','e','l','l','o']	# liste oluştur
s.append('d')         		# listenin sonuna ekle
len(s)                		# listedeki eleman sayısı
s.sort()               		# listeyi sırala
s.reverse()           		# listeyi ters çevir
s.extend(['w','o'])    		# listeyi genişlet
s.insert(1,2)         		# araya eleman ekle
s.remove('d')           	# listedeki ilk 'd' elemanını çıkart
s.pop()               		# listedeki son elemanı çıkart
s.pop(1)              		# 1 nolu indexteki elemanı çıkart
s.count('o')            	# listede bulunan 'o' ların sayısı
s = range(0,10)          	# 0 - 10 aralığındaki sayılardan oluşan bir liste oluştur
s = range(0,10,2)        	# yukardaki benzeri fakat bir de adım değeri belirle

Örnekler

Bu makaleyi bazı liste örnekleri göstererek bitirelim.

İlk olarak sadece sayılardan oluşan bir liste oluşturalım.

list = [1,2,3,5,8,2,5.2]    # 1,2,3,5,8,2,5.2 değerlerini tutan bir liste oluştur
i = 0
while i < len(list):     # Listenin her bir elemanını yazdıran while döngüsüin the list
    print list[i]        # Her elemana index değeriyle ulaşılıyor
    i = i + 1            # While döngüsü her çalıştığında i değişkenini 1 arttır

Bir sonraki örnek listedeki elemanların ortalama değerini hesaplama.

list = [1,2,3,5,8,2,5.2]
total = 0
i = 0
while i < len(list):
    total = total + list[i]
    i = i + 1
 
average = total / len(list)
print average
Categories: Programlama Tags: ,

Off the Record Messaging (OTR)

July 13th, 2013 No comments

Off the Record Messaging (OTR) anlık mesajlaşma servislerinde güvenli olarak mesajlaşmak için geliştirilmiş bir protokoldür. Birçok anlık mesajlaşma uygulaması için eklentileri geliştirilmiştir. Ben pidgin ile birlikte kullanıyorum. Özel olarak kalmasını istediğiniz sohbetlerinizi OTR kullanarak güvenli bir şekilde yapabilirsiniz. [1] adresinde OTR ile ilgili wikipedia sayfasını bulabilirsiniz. [2] adresinde OTR ana sayfası bulunmakta.

Pidgin ve Ubuntu kullanıcıları için kurulum çok basit:

sudo apt-get install pidgin-otr

Bir çok dağıtım deposunda OTR hazır olarak gelmektedir. Windows kullanıcıları da pidgin için kurulum dosyasını OTR’ın web sayfasından indirebilir.

Aşağıda kullanım ile ilgili videoyu izleyebilirsiniz.

[1] http://en.wikipedia.org/wiki/Off-the-Record_Messaging
[2] http://www.cypherpunks.ca/otr/index.php

Categories: İnternet Tags: , , ,