Sending First Patch To Upstream

Last week, I sent first patch to upstream and it was accepted in mm tree :). I am very happy about that. You can see it here.

Subsystem maintainers are very careful and a lot of people review the codes. Out side of staging directory, and before the internship, my first patch is about y2038 project. When I sent patch for y2038, a lot of developers reviewed and suggested something. I have recently seen the patch here: http://lwn.net/Articles/620870/, it was my first experience :).

Todays, I work with linux kernel mm community, this makes me very excited and happy :).  I gained some experiences in this process and learnt how can I be sure with my changes. This is most important case for coding. When I talked with my mentor, every time I reported different thing :) and said "oh this prevents collapsing pages into a thp!". Because I was testing wrong. Finally I could find what was the problem.

For test results, I look /var/log/kern.log, it is very large file so I split it like that: "split -n 5" and look newly created small files and log time stamps is important. To be sure with my changes print out virtual memory address area for my test programs.

/proc/pid/smaps shows whole vmas for the process. pr_info("vm_start = %04lx\n", vma->vm_start); is enough to see begining address of the vma. Sometimes I need to see which process run this function, I print out current->pid. If I know what happened in every step, I find my faults very easy. I have to do something like that, because other processes will log about their huge pages in kern.log and I shouldn't confuse which process logged the results. To examining kern.log was big scale thing for me.

Before sending patch I need to be careful and check something for my patch. Also keeping focus on the issues is important. Working on kernel needs to pay attention more accorrding to other projects which I got experiences with them when I was student.

After this patch, I will work on zero pages and discover new things :).

29 Ocak 2015

Posted In: Gezegen, internship, kernel, linux, memory management, opw

Session’ları Memcached’te Saklamak Ne Kadar Doğru?

Özellikle arkasında birden fazla web sunucusunun bulunduğu web projelerinde genellikle non-sticky session bilgilerini saklamak için Memcached kullanılır. Bu şekilde kullanıcıların, farklı web makinelerine düştüklerinde oturum bilgilerine erişilebilmesi amaçlanır.

Ama projenizde her şey yolunda giderken, bir anda kullanıcılardan kendi istekleri dışında “logout olma” şikayetleri gelmeye başladı. Hemen projenizin kodlarını incelediniz ancak anormal bir durum görünmüyor.

Muhtemelen Memcached kullanıcıların session bilgilerini siliyordur.

Peki ama nasıl?

Bu durumu örneklersek: 1. kullanıcı giriş yaptı ve session bilgileri Memcached‘e yazıldı. Ardından yüzlerce kullanıcı da giriş yaptı ve hafızada yer kalmadı. 1. kullanıcının session bilgileri silindi ve böylece logout oldu.

Memcached neden session bilgilerini sildi?

Memcached’e 64 MB (örnek değer) limit verdiniz ve bu 64 MB doldu. Memcached otomatik olarak kendi içerisinde LRU (Least Recently Used) algoritmasını uygulamaya başlayacaktır. Bu algoritma ile “son zamanlarda en az kullanılan” key’i hafızadan silecektir.

Bu senaryoda da bizim silinen key’imiz 1. kullanıcının session key’i oluyor.

Bir diğer durum ise Memcached persistent (kalıcı) bir veri saklamaması. Bundan dolayı sadece LRU algoritması ile değil herhangi bir sebepten dolayı Memcached kapanıp, yeniden açılırsa da (konfigürasyon değişikliği, işletim sisteminin yeniden başlatılması, donanım güncellemesi vs.) session bilgileri silinmiş olur. Doğal olarak kullanıcılar web sitesinden çıkış yapmış olur. Bu da kimi projeler için hoş olmayan sonuçlar doğurabilir.

Session kayıplarını önlemek için, genelde persistent şekilde veri saklayan RDBMS, NoSQL çözümler kullanmanız önerilir.

Bir yazıda hem session hem cache geçiyorsa sonuna şu gif’i koymamak olmaz :) : Patronun cache icin session kullandigini gordugumde ben

26 Ocak 2015

Posted In: Genel, Gezegen

Python Paketi Hazırlamak

    Pebble Remote projesinin bana katkısı gerçekten çok büyük oldu. Daha buraya yazmadığım bir sürü büyük küçük birbirini gerektiren bi çok işi öğrendim.  Paketlemeyi öğrenme amacım pebble remote'un pip komutuyla kurulabilir hale gelmesini sağlamaktı.

Şimdi örnek olarak aşağıdaki python projesini pip ile kurulabilir hale getireceğiz

pebbleremote
└── pebble
    ├── bluetooth.py
    ├── data
    │   └── logo.png
    ├── __init__.py
    ├── py_script.py
    └── remote.py

setup.py dosyasını yazmalıyız

Öncelikle bu dosyanın yukarıdaki pebble modülü ile aynı seviyede olması gerekiyor.

pebble
├── pebble
│   ├── bluetooth.py
│   ├── data
│   │   └── logo.png
│   ├── __init__.py
│   ├── py_script.py
│   └── remote.py
└── setup.py

setup.py dosyasının içinde bulunması gerekenler:

from setuptools import setup

setup(name='pebble-remote',
version='1.0',
description='Libreoffice Impress tool for remoting presentations with Pebble',
url='http://github.com/Libreoffice/impress_remote/tree/master/pebble',
author='Gulsah Kose',
author_email='gulsah.1004@.gmail.com',
license='MPLv2',
packages=['pebble'],
      scripts=['pebble/py_script.py'],
      install_requires = ['setuptools'], 
zip_safe=False)


Bu kadarını yazdığımızda sadece pebble modülünü gereken yere kuracak hale getirmiş oluruz. Ama içinde yukarıda olduğu gibi bir python dosyası olmayan modüle dahil olmayan dosyalar olabilir -data dizini ve altındaki png dosyası gibi-.

Onuda pakete dahil etmek için aşağıdaki yolu izliyoruz:

- Öncelikle MANIFEST.in dosyasının içinde aşağıdaki satırı  yazalım Bunu modül dışında olan dosyaları pakete dahil etmek için kullanıyoruz:

include /pebble/data/logo.png

 pebble
├── MANIFEST.in
├── pebble
│   ├── bluetooth.py
│   ├── data
│   │   └── logo.png
│   ├── __init__.py
│   ├── py_script.py
│   └── remote.py
└── setup.py

 - Bu ekleme için setup.py dosyasının içeriğini de değiştirmemiz gerekecek. Dosyanın son hali aşağıdaki gibi olacak:

from setuptools import setup 
 
setup(name='pebble-remote',
version='1.0',
description='Libreoffice Impress tool for remoting presentations with Pebble',
url='http://github.com/Libreoffice/impress_remote/tree/master/pebble',
author='Gulsah Kose',
author_email='gulsah.1004@.gmail.com',
license='MPLv2',
packages=['pebble'],
      scripts=['pebble/py_script.py'],
      package_data={
'pebble/data': ['logo.png'],
},
      data_files=[
('/opt/pebble/logo/', ['
pebble/data/logo.png'])
      ], 
      install_requires = ['setuptools'], 
      zip_safe=False)


Artık projemiz kurulmaya hazır hale gelmiştir. Aşağıdaki komutu kullanarak kurulumunu yapabilirsiniz:

$sudo python setup.py install

Kurulumu bu şekilde yaptığınızda paketi kaldırmak için aşağıdaki komutları kullanabilirsiniz:

$sudo python setup.py install --record file.txt
 
#cat file.txt | xargs rm -rf

 Şimdi bu projeyi python package index (PyPi) 'e yükleyelim:

Önce bu adresten bir hesap oluşturmalısınız. Projenizi buraya yüklemeden önce depoda aynı isimde başka bir proje varmı diye bakmalısınız. Çünkü pypi'de tüm paket isimleri eşsiz olmalıdır.

Sonra aşağısaki komutu çalıştırdığınızda karşınıza size kullanıcı adı parola gibi bilgilerinizi soran kısımlar çıkacak. Bunları doğru bir şekilde tamamladığınızda herşey yolundaysa 200(OK) kodunu göreceksiniz. Bunu gördüğünüzde artık projeniz pip ile kurulabilir hale gelmiş olacak.
 
$sudo python setup.py register sdist upload
 
Artık #pip install pebble-remote yazdığınızda projeniz sorunsuz kuruluyor olmalı.


Paketlemeyi öğrenirken faydalandığım linkler burada. Yukarıdaki setup.py dosyası içindeki alanların ne anlama geldiği ayrıntılı anlatılıyor:

1) http://www.scotttorborg.com/python-packaging/minimal.html#
2) https://pythonhosted.org/setuptools/setuptools.html

Bununla ilgili çok örnek bulmanız mümkün elbet ama pebble remote için yaptığım paketi aşağıdaki linkten inceleyebilirsiniz

3) https://pypi.python.org/pypi/pebble-remote/2.0

24 Ocak 2015

Posted In: Gezegen, index, linux, ozguryazilim, package, pebble, pebble-remote, pip, pypi, python

Amazon Web Services

Amazon Web Services hakkında internette zilyon tane makale bulabilirsiniz. Ben ilk başlarda araştırırken çok fazla türkçe döküman görmedim. Gerçi türkçe döküman hiç aramadım, yoksa kesin birileri yazmıştır. Amazon Web Services, biz kısaca AWS diyelim. AWS benim için atıl kapasiteye giden...

The post Amazon Web Services appeared first on Bahri Meriç CANLI Kişisel Web Sitesi.

24 Ocak 2015

Posted In: amazon, AWS, dns, EC2, Hosting, linux, Mobil, open source, S3, Server, web, web service

SPF Kaydı ve all ibaresi

Emailleriniz SPAM’e düşmesin – DKIM – SPF ve DMARC Ayarları başlıklı yazımda gönderdiğiniz epostaların spam’e düşmemesi için yapılabilecek ayarlardan bahsettim. SPF kaydında bir konudan daha bahsedilmesi gerektiğini farkettim. SPF kaydındaki “all” ibaresi, eğer bizim verdiğimiz listedeki sunuculardan başka bir yerden email gelirse ne yapılması gerektiğini belirttiğimiz kısım. Bu ifade önüne eklenecek işarete göre birkaç manaya […]

21 Ocak 2015

Posted In: Hosting, linux

Emailleriniz SPAM’e düşmesin – DKIM – SPF ve DMARC Ayarları

Müşterileriniz devamlı emaillerinizin spam yada junk dizinlerine düştüğünü söylüyorsa, okumaya devam edin. Email göndermek için yapmanız gereken tekşey SMTP protokolünün dilinden anlayan bir program kullanmanız, yani bir PHP, Perl hatta Bash kod parçası bile email gönderebilir. Bu emaillerde ister kendinizi Obama@whitehouse.gov olarak ister de peri kızı@dunyalarguzeli.com olarak gösterebilirsiniz. Gerçek hayattaki mektuplaşmada olabilecek sahtekârlıkların ve oyunların […]

17 Ocak 2015

Posted In: Hosting, linux

Python’da Kullanıcı Tanımlı Hatalar

    Python projelerinde kullanıcılar hata tanımlayabilir ve aynı sistem tarafından tanımlı hatalar gibi try-except içinde kullanabilir.

    Ben pebble-remote projesini geliştirirken bu hata yakalama kısmında şöyle bir sorunla karşılaşmıştım. Kullanıcı tanımlı hata sınıflarım vardı ve bu sınıfların tanımlandığı dosyanın dışında bir yerde bu tanımlanan hataları yakalamak istiyordum. Hatanın tanımlandığı python dosyasını da import ettiğim halde bu hataları yakalayamıyordum.

   Daha iyi bir yöntemi de olabilir elbet ama benim deneyerek bulduğum çözüm hata sınıfının tam yolunu yazmak oldu.

Kullanmaya çalıştığım python modülünün yapısı aşağıda:

libpebble/pebble
├── __init__.py
├── LightBluePebble.py
├── pebble.py
└── stm32_crc.py

LightBluePebble.py dosyası içinde bir hata aşağıdaki gibi tanımlanmış:
LightBluePebbleError(Exception):
def __init__(self, id, message):
self._id = id
self._message = message
def __str__(self):
return "%s ID:(%s) on LightBlue API" % (self._message, self._id)
Bu hatayı yakalamak istediğim dosya içinde  içinde modülü aşağıda şekilde import ettim:
import pebble as libpebble
Bu haliyle aşağıdaki kod hatalıydı:
try:
...
except LightBluePebbleError as e
...
Doğrusu:
LightBluePebbleError = libpebble.LightBluePebble.LightBluePebbleError

try:
...
except LightBluePebbleError as e
...

16 Ocak 2015

Posted In: exception, Gezegen, handling, impress, linux, ozguryazilim, pebble, pebble-remote, python, userdefinedexception

Python Projelerine Mimetype Desteği Eklemek

    Python projeniz eğer sadece konsol aracıysa ve bunu sağ tıkla şununla aç şeklinde çalıştırılabilecek hale getirmek istiyorsanız projenize mimetype desteği eklemeniz gerekir.

    Benim buna ihtiyaç duymam, gururla daha çok yerde anlatacağım bir olayın arkasından oldu. Bu sene bitirme projemin bir parçası olarak Pebble ile LibreOffice Impress uzaktan kumandasını yazdım. Ve yazdığım araç bir hafta önce LibreOffice deposuna kabul edildi. Ve daha güzeli LibreOffice deposunun tümüne yazma hakkım olması ve listedekilerin "LibreOffice geliştirici ekibine hoşgeldin" demeleriydi. O anki heyecanımla Çanakkaleyi koşarak turlayabilirdim :) Bu süreçteki tüm desteği için Necdet hocama ne kadar teşekkür etsem az. pebble-remote kabul edildikten sonra bu projenin kullanımını kurulumunu basitleştirmeye çalıştım. Mimetype desteğini eklediktan sonra pebble-remote artık sadece bir konsol aracı olmaktan çıktı ve kullanımı çok çok kolaylaştı.

Mimetype desteği eklenmesi şu adımlarla gerçekleştirdim:


* Menüde görünecek logoyu belirledim ve bu logoyu /usr/share/pixmaps/ dizini altına pebble-remote.png ismiyle kopyaladım.












* Menüde görünebilir hale gelmesi için aşağıdaki dosyayı  /usr/share/menu/ altına pebble-remote adıyla kopyaladım. 

---
?package(pebble-remote):needs="X11" section="Applications/Office"\
  title="Pebble Remote" command="/usr/bin/pebble-remote"\
  hints="Presentation"\
  kderemove="y"\
  icon="/usr/share/icons/hicolor/32x32/apps/libreoffice-impress.xpm"
---

* Aşağıdaki dosyayı  /usr/share/applications/ dizini altına pebble-remote.desktop ismiyle kaydettim:

---
[Desktop Entry]
Version=1.0
Terminal=false
Icon=/usr/share/pixmaps/pebble-remote.png
Type=Application
Categories=Office;Presentation;X-Red-Hat-Base;X-MandrivaLinux-Office-Presentations;
Exec=pebble-remote %U
MimeType=application/vnd.oasis.opendocument.presentation;application/vnd.oasis.opendocument.presentation-template;application/vnd.sun.xml.impress;application/vnd.sun.xml.impress.template;application/mspowerpoint;application/vnd.ms-powerpoint;application/vnd.openxmlformats-officedocument.presentationml.presentation;application/vnd.ms-powerpoint.presentation.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.template;application/vnd.ms-powerpoint.template.macroenabled.12;application/vnd.openxmlformats-officedocument.presentationml.slide;application/vnd.openxmlformats-officedocument.presentationml.slideshow;application/vnd.ms-powerpoint.slideshow.macroEnabled.12;application/vnd.oasis.opendocument.presentation-flat-xml;application/x-iwork-keynote-sffkey;
Name=Pebble Remote
GenericName=Presentation
Comment=Pebble remote control for LibreOffice Impress.
StartupNotify=true
Keywords=Slideshow;Slides;OpenDocument Presentation;Microsoft PowerPoint;Microsoft Works;OpenOffice Impress;odp;ppt;pptx;
InitialPreference=5
StartupWMClass=libreoffice-impress
X-KDE-Protocols=file,http,smb,ftp,webdav
---

Bu işlemlerden sonra odp formatındaki dosyaya sağ tıkladığımda aşağıdaki görüntüyü gördüm:


16 Ocak 2015

Posted In: Gezegen, impress, mimetype, ozguryazilim, pebble, pebble-remote, python, remote

Happy Coding & Testing Process

After third week, we started coding and made basic things. Our first aim to enable read-only ptes for collapsing. I still look for this issue. Something goes wrong and I can't see what is that.

To test my changes I've prepared test programs. They create pressure on memory and supply to swapped out system. Actually, they are very basic, just make malloc(), read/write operations on memory. memtest and stress are very strong workload programs, but to swapped out something they mix operations which are not correct for me. I should test specific conditions so use my test programs and they will be sophisticated later on.

To get informations about what happened with my changes, I use smem which shows swap usage percentage, pid, ppid with -t -p options and that's enough for me :). For specific process I look /proc/pid/smaps it gives anonhugepages/anonymouspages numbers and swap usage.

To look kernel messages we can use dmesg, but its size is not enough for me :) because I've been testing almost every line of the functions. To increase size of dmesg log, you should should set CONFIG_LOG_BUF_SHIFT in kernel config file. However When I setted it by 27 which means 2^27 bytes, make seems that doesn't accept this number! Probably, the number can be 16 or 17 as suggestion of config, but I'm not sure about that. Then I've looked /var/log/kern.log, and its size enough for me :) I'm sure about test results with it.

do_swap_page() makes swapped in operations afterward khugepaged scans the pages tables that come from do_swap_page(). There is no function call for khugepaged_scan_mm_slot(), it is called per 10000 miliseconds. Its call chain is like that:
khugepaged_scan_mm_slot() -> khugepaged_scan_pmd() -> collapse_huge_page() ->
__collapse_huge_page_isolate()

Today I've realized in khugepaged_scan_pmd(), ptes seem unpresent! but they are swapped in. Then I need to look do_swap_page() again :).

16 Ocak 2015

Posted In: coding, Gezegen, internship, kernel, khugepaged, linux, smem, stress, testing

Bir Git Deposuna Başka Bir Git Deposunu Geçmişiyle Taşımak

Diyelim ki git deposunda geliştirdiğiniz projenizi başka bir git deposunun içindeki bir yere taşımanız gerekti. (Transfer işleminden bahsetmiyorum.) Ve kendi deponuzdayken yaptığınız commitlerin de kaybolmasını istemiyorsunuz. Öyleyse sırayla aşağıdaki adımları takip edmelisiniz:

$git clone kendi_depom
$git clone hedef_depo
$cd hedef_depo
$git checkout master
$git remote add rm1remote <kendi_depomun_urlsi>
$git fetch rm1remote
$git merge rm1remote/master
$git remote rm rm1remote

7 Ocak 2015

Posted In: Gezegen, git, github, linux, move a repo, ozguryazilim

Twitter Auto Publish Powered By : XYZScripts.com