27 January 2015

Veri Madenciliği Örnekleri 101


Veri Madenciliği Nedir? Veri madenciliği, ham verinin işlenerek bilgi elde edilmesi için kullanılan yöntemlerin bütünüdür. Elde edilen bilgi şunlar olabilir: anomali tespiti örüntü (pattern) tespiti korelasyon Veri madenciliğini uzun uzun anlatmak yerine bu teknikleri kullanarak ortaya çıkan örnek durumlardan bahsetmek istiyorum. Pazar Sepeti Analizi Örneği Veri madenciliği 101 başlıklı çalışmalarda verilen ilk örneklerden biri pazar sepeti analizidir. Devamını Oku […]

26 January 2015

PHP ile Dizi Değerlerini Türkçe Uyumlu Sıralamak


PHP ile dizi değerlerini Türkçe uyumlu sıralamak için php-intl paketi kurulu olması şartıyla Collector sınıfı çok yararlı olacaktır.

Aşağıdaki örneği ve ürettiği sonuçları inceleyebilirsiniz.

	$dizi[5] = 'i';
	$dizi[6] = 'İ';
	$dizi[7] = 'ö';
	$dizi[8] = 'Ö';
	$dizi[9] = 'ş';
	$dizi[10] = 'Ş';
	$dizi[11] = 'ü';
	$dizi[12] = 'Ü';
	$dizi[1] = 'ç';
	$dizi[2] = 'Ç';
	$dizi[3] = 'ı';
	$dizi[4] = 'I';
	
	//normal hali
	print_r($dizi);

	//asort ile sıralanmış hali
	asort($dizi);
	print_r($dizi);
	
	//colltor->asort ile sıralanmış hali
	$collator = new Collator('tr_TR');
	$collator->asort($dizi);
	print_r($dizi);

Sonuçlar

Array
(
    [5] => i
    [6] => İ
    [7] => ö
    [8] => Ö
    [9] => ş
    [10] => Ş
    [11] => ü
    [12] => Ü
    [1] => ç
    [2] => Ç
    [3] => ı
    [4] => I
)

Array
(
    [4] => I
    [5] => i
    [2] => Ç
    [8] => Ö
    [12] => Ü
    [1] => ç
    [7] => ö
    [11] => ü
    [6] => İ
    [3] => ı
    [10] => Ş
    [9] => ş
)

Array
(
    [1] => ç
    [2] => Ç
    [3] => ı
    [4] => I
    [5] => i
    [6] => İ
    [7] => ö
    [8] => Ö
    [9] => ş
    [10] => Ş
    [11] => ü
    [12] => Ü
)


25 January 2015

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 RDMBS, 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



24 January 2015

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

23 January 2015

Amazon Web Services


AmazonWebservices_Logo.svg Amazon Web Service 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 Service, biz kısaca AWS diyelim.

AWS benim için atıl kapasiteye giden paranın cepte kalması demek. Yoksa içerdiği servislerin bir çoğunu sunan alternatif servis sağlayıcılar var. Hatta açık kaynak çözümler ile siz kendiniz de kurabilirsiniz. Ki ben artık SQS yerine RabbitMQ kullanıyorum. Şimdi önceden kullandığım AWS servisleri hakkında iki kelam edeyim.

Amazon Simple Storage Service (S3)

Amzon’un en sevdiğim servisi, eğer statik dosyalarınız varsa ve çok fazla (saatte birden daha sık) değişmiyorsa. Amazon S3 üzerinde ister public ister private olarak barındırabilirsiniz. ( içimden store edebilirsiniz yazmak da geçmedi değil)  kendi apisi gayet kullanışlı, ayrıca favori programımız s3cmd ile  de komut satırından direkt olarak bucket’lara erişim sağlayabiliyorsunuz. Bence tek kusuru panelindeki dosya yöneticisi. Sanki bilerek ilkel bırakılmış gibi. Günümüzdeki popüler web projelerinin çoğu statik dosyalarını S3 üzerinde tutuyor. Mesela HipChat üzerinden birine dosya göndermek istediğinizde anında s3’e atıp linkini size gönderiyor.

Amazon Elastic Compute Cloud (EC2)

Günümüzde Bulut bilişim (Cloud computing) herkesin dilinde. Bir bulut tekerlemesi tutturmuş gidiyoruz. Amazon EC2 servisi ile bu bulut üzerinde kendi ölçeklendirilebilir tarlanızı (cluster) oluşturma olanağı sunuyor. Bunu Auto Scaling özelliği ile yapıyor. Tabi bunu yaparken de bir diğer servisi olan CloudWatch‘ı kullanıyor. Eğer bir EC2’yi auto scaling ile yapılandırmayacaksanız ve de ücretsiz kullanım miktarını da aşıyorsanız EC2 size göre değil. Size DigitalOcean Cloud servisini öneririm. Bu arada Amazon Centos seçkisi Amazon Linux isminde bir dağıtım hazırlamış en ucuz fiyatı ona veriyor. Haliyle kullanıyorsunuz.

RDS

Sistemi auto scaling ile yapılandırınca halilye veritabanı sunucunuzu ayırmanız gerekiyor. İşte burada RDS servisi devreye giriyor. İster küçük bir  Instance ve buna bağlı Read Replica kullanın ya da isterseniz bunların tamamı büyüklüğünde tek bir veritabanı sunucusu oluşturun. Bildiğim kadarı ile henüz RDS auto scale edemiyor. Bu sebeple veritabanı optimizasyonunda tamamen iş size düşüyor. RDS ve CloudSearch gördüğüm kadarı ile Amazon’un en pahalı servisleri.  Sorgu başına para alması sizi gereksiz SQL sorgularından kaçınmaya itiyor. Performans sorunları olsa da sizi S3Db bile kullanmaya itebilir.

Route53 –  DNS Server

Serviğimiz ucuz servislerden biri Route53. Bildiğiniz DNS server, ekstra bir numarası yok. Her domain için farklı birer domaine sahip dns sunucusu veriyor. Yıllarca paranoyasını yaptığımız dağınık nameserver olayını adamlar servis olarak gayet güzel sunuyor.

CloudFront

Amazon’un CDN servisi. Dosyarı S3 üzerinde tutmasına rağmen MaxCDN ile karşılaştırınca pahalı bir servis. Yine popüler bir çok web sitesi CloudFront kullanmakta.

Simple Queue Service (SQS)

İlk öğrenmeye başladığımda hayran olduğum bir servis SQS. Asılında önce atla deve bir şey yapmıyor. Bir listeye işi ekliyor. Talep geldiğinde de sıradan veriyor. Bu servisi de EC2 ile birleştirince ortaya birbiri ile direkt hiç bir etkileşimi olmayan servisler çıkıyor. Ayrıca düzgün bir CloudWatch yapılandırması ile EC2’leri otomatik genişletip daraltabiliyorsunuz. Fakat yine tam entegre bir şekilde kullanmayacaksanız açık kaynak alternatifi RabbitMQ aynı işi daha ucuza yapmanızı da sağlayacaktır.

Simple Email Service (SES)

Amazon SES servisinde tamamen ucuz etin yahnisi durumu söz konusu. Herkes kullanıyor ver artık neredeyse her gönderilen email spama düşüyor. Bu sebeple farklı email servislerini kullanmanızı öneriyorum.

CloudSearch

Solr alternatifi bir servis, CloudSearch fakat onun pahalı versiyonu. Neredeyse sağlam bir EC2 üzerine Solr kursanız CloudSearch’den daha ucuza gelecek, ki zaten internette araştırıken bunu yapan bolca insan gördüm.

ElastiCache

Amazonun ölçeklendirilebilir in-memory cache servisi. Yapbozun verileri cacheleme(önbellekleme daha iyi gibi )  parçası. Bildiğiniz memory cache.

Daha bir sürü servisi var ve sürekli yapbozda eksik gördüğü noktalara entegre çözümler sunan servisler çıkarıyor. Onlara da daha sonra deyinebilirim. SNS‘de favori servislerimizden fakat çok fazla kullcalamadığım için hakkında yorum yapmayacağım.

Bu kadar Cloud demişken Google Cloud Computing servisini de zikretmemek aypı olur. Henüz kendisini kullanmadım fakat ilk fırsatta kullanıp yorumlarımı yazacağım.

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



21 January 2015

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 […]

17 January 2015

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 olarak ister de peri kızı olarak tanıtan bir email gönderebilirsiniz. Bu durumdan dolayı, seneler […]

16 January 2015

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 :).

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
...


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:




07 January 2015

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

04 January 2015

Collapsing Huge Pages & Swap In/Out


Last week, I focused on collapsing huge pages and swap in/out. Rik  have asked me some questions and I countinue to reply them. When we study, he puts some hints to questions and sometimes, I back to old questions and try to understand them better. I've started to follow linux-mm list and understand what they mention about at least :). Before I've tried to follow some staging lists but see emails a lot* everyday.

My project includes very small coding according to other kernel internship projects but the topic is too complex and its about core functionality of Linux Kernel. That's really good :). Before the internship, I was thinking "I should pick a small staging driver and study for todo issues". Because with small driver, learning and to be part of Linux Kernel can be easier and I was going to do just self study, also work at another company so have not enough time. Todays, I study on almost hardest topic with a Linux Kernel developer!


I can start coding for my project but need to discuss which policy we will follow to get swapped out pages to memory. We should discuss about trade off to collapsing pages in a 2 mb page when getting them from swap to memory. Keeping in mind the functions is a bit hard for me, I re-look a lot of time to which function what does. My memory is not good :(.


I've replied following questions which are asked me by my mentor. When I reply the questions, don't need to search just from books, look to codes and understand a bit of them :).


Following call chains for Linux Kernel - 3.18


1) How is a page swapped out?


add_to_swap()

        get_swap_page()
                scan_swap_map()
        if(PageTransHuge(page))
                if (split_huge_page_to_list(page, list))
                        swapcache_free()
        add_to_swap_cache()

Swapped out is implemented by add_swap_page(). The function allocates swap space for a page. Swap areas includes slots, and their size are equals to page frames.


It checks whether page up to date and locked then gets swap page, get_swap_page() firstly checks is there a swap page with atomic_long_read(&nr_swap_pages) if so, decrements nr_swap_pages by one. In there used highhest_bit to decrease searching time of free slot. get_swap_page() returns type swap_entry_t. add_swap_page(), cheks whether the page is huge, if so; it splits the huge page to list with

split_huge_page_to_list(page, list).  The function calls __split_huge_page() -> __split_huge_page_map().

If split_huge_page_to_list() returns 0, that means splitted pages succesfully. After that it adds the page entry to swap cache. If huge page can not splitted then called swapcache_free(entry), to release retrieved swap page.

Note: I did not understand why we set page as dirty? at line:202. The page is not changed. Rik's answer: After the page is added to the swap, it is removed from the process page tables.


Then we have a page that is only in the page cache, and not mapped in any process. The dirty bit indicates the data has to be saved to swap before the page can be freed.


scan_swap_map() is used to find free swap slot.


2) Where is the information of where a page is in swap, stored in the data structures used to track the memory of a process?  In other words, how does swap in find where in swap memory is?


Using swap_info_struct swap_info[] array, it includes indexes of ptes and also offsets are stored in swap_map.


3) How is a page swapped in?

do_swap_page()
        pte_to_swp_entry()
        lookup_swap_cache()
        if (!page)
                swapin_readahead()

        else if (PageHWPoison(page)) {...}

It calls pte_to_swp_entry(), pte is converted to swap entry. the function converts pte to architecture independent entry format. Then checks validation of entry with non_swap_entry(). Sets DELAYACCT_PF_SWAPIN flag to spcefiy that does in swap operation. It checks whether the page in swap cache. If so, checks HWPoison flag which is for recovering memory errors; if not runs swapin_readahead() to get probably needs to swap in pages. If HWPoison is setted, it goes to label out_release and release the page and swap cache page from page cache. I've a question here: if the page was huge, but right now it is not because splitted to locate on swap. The page have no compound flag anymore? Is that correct?


Rik's answer: Swap only ever stores single pages, indeed. That means swapped
in pages will not have the compound flag set page_cache_release() calls put_page(), and the function checks using PageCompound().

Note: do_swap_page() gets two pte argument. orig_pte is created by handle_mm_fault() using ACCESS_ONCE(). The macro is for volatile issues maybe but I didn't understand why second pte is created.

Answer: do_swap_page gets both the location of the pte (a pointer) and the value of the pte at handle_mm_fault time. This way it can verify whether the pte changed from its original value, while it is doing things (like retrieving data from swap)

4) How can you discover whether a page is present in the swap cache?

_PAGE_FILE detects whether the page in swap cache, it is into page table entry.

5) Under what conditions are 4kB pages collapsed into a 2MB THP?

In handle_pte_fault(), at line: 3219 do_swap_page() is called because system want to swapped in pages, so it wants to collapse the pages but it can't. This happens, if the cases occur: pte shouldn't be on memory and swap cache. Also pte should be belong to anonymous page, not to file.

Rik's question: Can you write down the call traces that contain the collapse functions in mm/huge_memory.c?
My answer, there are two cases for it:
do_huge_pmd_anonymous_page() -> alloc_hugepage_vma() -> .. __alloc_pages_nodemask()

khugepaged_scan_pmd() -> collapse_huge_page() -> khugepaged_alloc_page() -> alloc_pages_exact_node() -> .. -> __alloc_pages_nodemask()

Rik's answer: Firt call chain, you can leave alone during your project, and is important to understand what the data structures look like.

Second call chain: This is the one you will want to work with.

6) how many pages would be good to bring into swap when trying to collapse a huge page? how many is too much?

x86 systems use 4kB page size. It can be enlarged maximum 4mb. With 2mb page, it is enlarged 512 times, thats good. 4mb page means 1024 times enlarged, it is not so good, if size is more than 4mb huge page, it will be useless.

Rik's answer: Sure, but if all of them are swapped out, it is obviously a bad
idea to bring them all into memory just to collapse them into a 2MB THP.

Out of the 512 pages, what would be a reasonable number to not be in memory already, and bring in from swap? 1? 5? 10? 20? What would the number depend on?

My answer: do_swap_page() ->  swapin_readahead() -> swapin_nr_pages()

In swapin_nr_pages(), using page_cluster it detects how many pages getting swap in.

page_cluster defined in swap.c. swap_setup() function assigns its default value.

7) what about pages that are already in the swap cache? how should we count those?

For this question, I'm a bit confused, thought swap cache is a swap slot .. and replied different thing :). Firstly, I've tried to count how many pages in swap, afterwards go ahead to correct intent.

If a page in the swap cache, that means the page up to date on memory. Also the page is on the one swap slot. Swap cache size is equal to a swap slot. struct swap_info_struct, it has array swap_map.

I've read from book, swap_duplicate() increases slot usagecounter, probably it mentions about the line:

count = p->swap_map[offset];

I've seen on comment line of the function "increment its swap map count." So I guess, swap_map count can be slot usage counter. But I know swap_info struct per swap area not per swap slot. A swap area can include set of slots, so I think, swap_map count doesn't mean swap cache usage counter. Did I misunderstand? Can you inform me about swap_map?

Rik's answer: The swap_map counter means the number of users of that swap slot, which may be different from the number of users of the swap cache page.

However, this line of research is tangential to your project, and your interpretation of question 2 differs from my intent.

My answer: I've thought, when a page will be added to swap cache, it increases count of swap cache page.

add_to_swap_cache() -> __add_to_swap_cache()

In __add_to_swap_cache(), after adding radix tree, it increases the counter at line 104:
address_space->nrpages++;

nrpages specify total number of pages in address_space which stores swap cache address that means how many pages are in swap cache.

8) what about the !pte_write test in __collapse_huge_page_isolate? how can that break collapsing of a THP? is there a simple way to improve that?

pte_present() checks whether the entry have write access. It needs to create a page using page table entry with vm_normal_page(). If write access is disallowed, can't create page.

My mentor said __collapse_huge_page_isolate() is important point your project, and I've reviewed it:

__collapse_huge_page_isolate()
        for (_pte = pte; _pte < pte+HPAGE_PMD_NR; _pte++, address += PAGE_SIZE) {
                pte_none()
                !pte_present() || !pte_write()
                isolate_lru_page(page)

For loop:
Firstly, it checks pte_none(), this function returns true if pte is not in Ram. There is a counter none, checks with none for allowed khugepaged_max_ptes_none. If exceeds the limit then goes to label out. pte_none() returns true if none of the bits in the pte are set, that is the pte is all zeroes. pte_present() also is used for page swapped out. pte_write() checks whether the kernel write to page. Then checks is the page compound, if so does system halt. If page is not anon nor swap backed then does system halt. The page should have only one reference, this property checked by _count variable. Then it locks the page.

I'm looking isolate_lru_page(), Lru list includes inactive file/page, active file/page. But I didn't understand why there is PG_lru flag and we check it with PageLRU(page) at line 1344, vmscan.c

Rik's answer: If the page is not currently on an LRU, a different task may have that page on a pagevec, and do something with it later. That could race with trying to collapse the hugepage, and cause all sorts of problems.

In isolate_lru_page(), it checks again VM_BUG_ONE(!page_count(page), page), but already it checked for page_count() before calling isolate_lru_page() line at: 2171. Why it does this again?

Rik's answer: The page_count check is debugging code, in case somebody changes the kernel and calls isolate_lru_page on a page that got freed. It checks PageLRU once outside the lock (it can be changed by another CPU), and once inside the lock (taking a lock is expensive, and only done conditionally).

And also it checks PageLRU two times, in isolate_lru_page(). It gets lruvec then runs page_lru(), which checks page unevictable, if so sets lru as unevictable; if not, calls page_lru_base_type(), this decides base type for page - file or anon after adds active property and returns lru. Then isolate function runs get_page(), if page head or normal, increments _count. Then clear page lru and calls del_page_from_lru_list(), this function deletes lru from page using list_del()

It checks for page young conditions, then set referenced as 1. If it goes to label out, it runs release_pte_pages().

Note: That function gets a pointer to the start of a page table page, and iterates over all the ptes inside that page table page. A 2MB THP contains 512 4kB pages, which is 1<<HPAGE_PMD_ORDER pages.

03 January 2015

Python Uygulamalarına Dil Desteği Eklemek


Projemiz klasik olarak ekrana "Hello World"  yazdırsın ve buna dil desteği ekleyelim. Projenin dizin yapısı şöyle:
---
helloproject/
└── hello.py

---
hello.py dosyasının içeriği aşağıda:

---
print "Hello World"
---


1. _() Fonsiyonunu Belirlemek

Bu fonksiyon kodun içinde çevirilecek cümlelerin, kelimelerin belirlenmesine ve yerelimizde kullandığımız dil her ne ise cümlelerin o dile göre çevirilmiş halinin gösterilmesine yarayan fonksiyondur.

hello.py dosyası ile aynı dizine i18n.py isimli bir dosya açalım ve içine şunları yazalım.

---

# -*- coding: utf-8 -*-

import os, sys
import locale
import gettext

# Bu degisken ismine kendi uygulamanizin ismini yazmalısınız!
# Ceviri dosyaları bu yolda olmalıdır.
#  @LOCALE_DIR@/@LANGUAGE@/LC_MESSAGES/@APP_NAME@.mo
APP_NAME = "helloproject"



# Sisteminizde helloproject isim dosyanın bulunduğu yolu döndürecektir.

# Bu kismi baska projeler icin projenizin bulunduğu dizine göre değiştirmelisiniz.
APP_DIR = os.path.dirname(os.path.abspath("helloproject"))

# .mo dosyalari bu dizinin altinda olacaktir APP_Dir/i18n/LANGUAGECODE/LC_MESSAGES/

LOCALE_DIR = os.path.join(APP_DIR, 'i18n')

# Hangi dile cevrilecegini belirleyen kisim burasidir. Burada olusan
# listede ilk yazan dil hangisiyse ona ceviri yapilacaktir.
#
# hangi dile cevirilecegi LANG cevresel degiskenine bakilarak belirlenir.
DEFAULT_LANGUAGES = os.environ.get('LANG', '').split('.')
DEFAULT_LANGUAGES += ['en_US']

lc, encoding = locale.getdefaultlocale()
if lc:
    languages = [lc]

languages += DEFAULT_LANGUAGES
mo_location = LOCALE_DIR

# Burada herhangi bir degisiklik yapmaniza gerek yok
gettext.install(True, localedir=None, unicode=1)

gettext.find(APP_NAME, mo_location)

gettext.textdomain (APP_NAME)

gettext.bind_textdomain_codeset(APP_NAME, "UTF-8")

---

Şuan oluşan dizin yapısı:

---
 helloproject/
├── hello.py
└── i18n.py

---
2. Çevirmek İstediğimiz  Cümleleri Belirlemek

İçinde çeviri yapmak istediğimiz dosyaların başına şu kodu eklemeliyiz.

---
import i18n
_ = i18n.language.ugettext
---

Bu projede çevrilecek tek cümle "Hello World" oluğundan şimdi hello.py dosyasını aşağıdaki şekilde düzenleyelim.


---
import i18n
_ = i18n.language.ugettext 
 
print _("Hello World")
---

Çevilecek cümleler şu yapıda olmalı:

_("çevrilecek cümle")

3.Çeviriler İçin Şablon Oluşturmak

.pot uzantılı dosya şablon dosyasıdır. Her projede bir tane .pot uzantılı dosya bulunur. Çeviri yapılacak diller için oluşturulacak dosyalar bu .pot uzantılı dosya kullanılarak üretilecektir.

Şimdi helloproject.pot isimli dosyayı oluşturacağız. Önce projenin içine "po" isminde bir dizin oluşturalım ve aşağıdaki komutu çalıştıralım.

---
xgettext --language=Python --keyword=_ --output=po/helloproject.pot hello.py
---

Eğer "xgettext: Non-ASCII character at..." gibi bir hatayla karşılaşıyorsanız -başka projelerde- aşağıdaki komutu yazmalısınız:

---
xgettext --language=Python --keyword=_ --output=po/helloproject.pot --from-code=UTF-8 hello.py
---

Bu adımdan sonra oluşan dizin yapısı şu şekildedir:

---
 helloproject/
├── hello.py
├── i18n.py
└── po
    └── helloproject.pot

---

Oluşan helloproject.pot isimli dosya aşağıdaki gibi olmalı:

---
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-01-03 22:53+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"

#: hello.py:4
msgid "Hello World"
msgstr ""

---

! Buradaki isim soyisim email gibi bilgileri doldurmakta fayda var.

4. Bir Dil İçin Çeviri Dosyası Oluşturmak

Oluşturduğumuz bu şablon dosyasını kullanarak projenin türkçe için çeviri dosyasını oluşturacağız. Oluşturduğumuz po dizininin içinde aşağıdaki komutu çalıştıralım

---
msginit --input=helloproject.pot --locale=tr_TR
---

Bu işlemin sonunda oluşan dizin yapısı:

---
helloproject/
├── hello.py
├── i18n.py
└── po
    ├── helloproject.pot
    └── tr.po

---

Oluşan tr.po dosyasının içi şöyle olmalı:

---
# Turkish translations for PACKAGE package.
# Copyright (C) 2015 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# gulsah <gulsah.1004@gmail.com>, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-01-03 22:53+0200\n"
"PO-Revision-Date: 2015-01-03 23:08+0200\n"
"Last-Translator: gulsah <gulsah.1004@gmail.com>\n"
"Language-Team: Turkish\n"
"Language: tr\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=ASCII\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"

#: hello.py:4
msgid "Hello World"
msgstr "
"
---


Burada .po uzantılı dosyaları çevirmek için çeşitli editörler var (poEdit ,pootle, transifex,...) Bizim projemiz minik olduğundan elle çeviriyi yapabiliriz. Çeviriyi yaptığımızda dosyanın son 2 satırı şöyle değişecek:

---
msgid "Hello World"
msgstr "Merhaba Dunya
"
---

5. Derleme

Program hızlı çalışabilmesi açısından oluşturduğumuz bu .po dosyalarına değil bunları derleyerek oluşturduğumuz .mo dosyalarına bakacaktır. Bu derleme işi ve derlenen dosyaları koyduğumuz yer program için önemli. i18n.py içinde belirttiğimiz şekilde bu proje için oluşan .mo dosyalarını aşağıdaki komutla oluşturacağımız dizin içinde saklayacağız. (Şuan helloproject dizini içindeyiz)

---
mkdir -p i18n/tr/LC_MESSAGES
---

Şimdi tr.po dosyasını derleyelim:

---
msgfmt po/tr.po --output-file i18n/tr/LC_MESSAGES/helloproject.mo
---

Sonuçta oluşan dizin yapısı şöyle olmalıdır:

---
helloproject/
├── hello.py
├── i18n
│   └── tr
│       └── LC_MESSAGES
│           └── helloproject.mo
├── i18n.py
└── po
    ├── helloproject.pot
    └── tr.po

---

Eğer LANG değişkenin içinde kullandığınız dil ingilizceyse onu türkçe ile değiştirirseniz hello.py dosyasını çalıştırdığınızda artık çıktısının "Merhaba Dunya" olduğunu göreceksiniz.







02 January 2015

LibreOffice Impress sunumlarınızı Pebble ile uzaktan yönetin


Neredeyse iki yıl önce LibreOffice Impress sunumlarınızı Android telefonunuzla nasıl uzaktan yönetebilirsiniz diye yazmıştım. Bu halen çok kullanışlı bir yöntem olmasına rağmen sunumları kol saatimizden yönetmek de eminim çok kişinin hoşuna gidecektir. Bir yılı aşkın süredir pebble kullandığımızdan bu uygulama onun üzerinde hazırlandı.



Uygulamayı geliştiren Gülşah bununla ilgili bir blog yazmıştı ama aradan geçen bir haftada yazılım daha kolay kurulabilir ve kullanılabilir hale geldi. Takip edilecek adımlar şöyle:
  • Pebble aygıtlarla sadece bluetooth üzerinden haberleşebildiğinden bilgisayarınızla eşleştirmeniz gerekiyor. Bu işletim sistemine ve kullandığınız masaüstü ortamına göre değişiklik gösterdiğinden burada anlatmak gereksiz ama herhangi bir bluetooth aygıt gibi eşleştiriliyor.
  • pebble-remote uygulamasını kurmadan önce bağımlılıklarını kuralım. Gülşah uygulama için bir depo oluşturduğunda buna da gerek kalmayacak.
    • $ sudo apt-get install python-dev libopenobex1-dev python-tk python-lightblue python-pexpect xdotool python-bluez bluez-tools
    • Uygulama pebble için hazırlanmış lightblue kitaplığını kullandığından onu github deposundan indirip kurmak gerekiyor. Kurulumu için buraya bakabilirsiniz.
  • Artık pebble-remote uygulamasını kurabiliriz. Uygulamanın deb paketini buradan indirip kurabilirsiniz. Çok yakın zamanda rpm paketini de hazır olacaktır.
  • Kurulum tamamlandığında konsoldan aşağıdaki komutla sunumunuzu başlatıp pebble'ınızın müzik uygulamasından yukarı ve aşağı tuşlarını kullanarak sunumda sayfalar arasında gezinebilirsiniz.
    • $ pebble-remote ~/kirkiki.odp
Pebble kullanıcılarından gelecek geri bildirimlerle uygulamaya ihtiyaç duyulan ne varsa eklenebilir.

Kendinden sonrakilere örnek göstereceğim bir çalışma arkadaşı olan Gülşah eminim bundan sonra daha sıkı çalışıp özgür yazılım camiasında daha çok iş yapacaktır.

29 December 2014

Online Shell Script Checker


http://www.shellcheck.net/ adresinde, online olarak shell scriptlerinizi hatalara karşı kontrol edebileceğiniz güzel bir servis var. Böyle küçük ve kullanışlı servislerin bookmark’da durmasında fayda var.


Cagri Ersen tarafından Syslogs adresinde yayınlandı. | Permalink | Etiketler:



28 December 2014

Begining to Read Memory Management Codes


My Linux Kernel internship started two weeks ago and will take 3 months. My mentor is Rik Van Riel. My project aim to fix transparent huge page swapping issues, if system needs to swap huge pages, it has to split the pages to small sized ones but then the system can not reconstitute the huge pages.

Rik asked me some questions about huge page and swapping and I've replied them. Before the reply the questions I've looked for following data structures and definitions.

Firstly I've started to examine struct page and mm_struct in mm_types.h. The kernel holds all information in mm_struct, it includes vm_area_struct *mmap which involves list of memory areas.  vm_areas_struct is an object to show memory areas. Also, the kernel threads don't use mm_struct so if you see if (!mm) {...} it means this is  kernel thread.

Likely & Unlikely Functions: Theese are for branch prediction so used for compiler optimization. They supply to guess which instruction will run and do read ahead.
http://kernelnewbies.org/FAQ/LikelyUnlikely
http://stackoverflow.com/questions/109710/likely-unlikely-macros-in-the-linux-kernel

Numa & Uma Systems: I've understood the two keywords looking the picture :).










Hot &  Cold Page: If a page in cpu cache, it is hot page however cold page is vice versa.

struct scan_control: It is used for page scaning, holds following variables:
unsigned long nr_scanned: How many inactive pages were scanned.
int may_writepage: It determines whether the kernel can write backing store.
swap_cluster_max: It is restriction for a lru list.

struct zone: The kernel divides memory to nodes, and the nodes include zone lists. Every zone area include pages. You can look for struct zone.

struct list_head: Doubly linked list, to build & manage lists.

Page Flags: http://lxr.free-electrons.com/source/include/linux/page-flags.h

High Memory: Linux Kernel seperate high rate of memory for user space so high memory means user space.
http://unix.stackexchange.com/questions/4929/what-are-high-memory-and-low-memory-on-linux

Page Vector: Provides operations on page list instead of individual pages.

Slot: Swap area is divided to slots. Size of each slot equals to page frame.

up_read/write, down_read/write functions: They are for spinlock issues and includes assembly instructions.

BUG_ON* functions: Checks given condition and returns system halt or nothing.
http://lxr.free-electrons.com/source/include/linux/mmdebug.h#L18

Swap Cache: Some pages after swapped out, if the page is not changed, it has an entry on swap cache and system can read data on memory withouth get the page to back memory.
http://www.linux-tutorial.info/modules.php?name=MContent&pageid=314

Transparent Huge Page vs. Huge Page: Transparent huge page supplies a layer for huge page. http://goo.gl/qGksYX

Note-1: Swap space used by user space tools (mkswap)

Note-2: x86 systems don't use pte level for THP (transparent huge page), it can direct access data on pmd.

Following questions which are asked to me by my mentor. I've explained just important points for my project and their function traces because there are a lot of functions, sometimes they can be very complex :).

Below call chains for Linux Kernel - 3.18

1) from do_page_fault(), sometimes the VM uses transparent huge pages
   (2MB size on x86) for anonymous memory. What functions does the
   code go through between do_page_fault() and the function that
   installs 2MB pages in the process page tables?
When I examined functions, I saw a lot of spinlock functions and Rik said, they for ensure that multiple concurrent instances of the page fault code do not manipulate the page table simultaneously.

do_page_fault()
  __do_page_fault() /* checks the fault is belong to bad area or good area */
    handle_mm_fault()
      __handle_mm_fault()
        __do_huge_pmd_anonymous_page()
       
         
pgtable_trans_huge_withdraw takes a page table page from the process's
reserve of page table pages, so the 2MB page (mapped at pmd level) can
be mapped as 4kB page entries (at the pte level).


2) When are 2MB pages used?

If PAE is enabled, then use 2mb pages. I've looked for it following links:
http://en.wikipedia.org/wiki/Physical_Address_Extension https://www.cs.rutgers.edu/~pxk/416/notes/09a-paging.html
http://en.wikipedia.org/wiki/Page_Size_Extension
http://en.wikipedia.org/wiki/Page_%28computer_memory%29#Huge_pages

3) What does the VM do when a 2MB page cannot be allocated?
   (still in memory.c and huge_memory.c)
In  do_huge_pmd_anonymous_page(), if it can not allocate 2MB page;
it returns, out of memory or fall back. It also calls count_vm_event()
with THP_FAULT_FALLBACK argument. At line: 824, it tries to set
huge zero page, if it can't do that, calls put_huge_zero_page(),
which calls atomic_dec_and_test(). 

At line: 839: If it couldn't install huge page, it calls
put_page(). I've thought;in put_page, it checks whether
the page compound or not, but the page will be compound
always, because the page comes from alloc_hugepage_vma().


4) When the system runs low on memory and wants to swap something
   out, it will split up a huge page before assigning it space in
   a swap area. Find the code in vmscan.c, swapfile.c and huge_memory.c
   that does that. What does the function trace look like from
   try_to_free_pages to the function that splits the huge pages?
try_to_free_pages()
  throttle_direct_reclaim(gfp_mask, zonelist, nodemask)
    do_try_to_free_pages(zonelist, &sc)
      delayacct_freepages_start()
      global_reclaim()
      do while { vmpressure_prio()
      shrink_zones() /* if a zone reclaimable it returns true */}


I've seperated shrink_zones() to below:

shrink_zones()
  nodes_clear(shrink.nodes_to_scan)
  loop:
  populated_zone() {return (!!zone->present_pages);}
  zone_reclaimable_pages(zone) -> get_nr_swap_pages()
  node_set()
  zone_reclaimable()
  shrink_zone()
     shrink_lruvec()
       shrink_list()
          shrink_active_list()
          shrink_inactive_list()
             shrink_page_list()
               add_to_swap()
                 split_huge_page_to_list()
                    __split_huge_page()
                       __split_huge_page_map()


try_to_free_pages(): If memory is not sufficent, it checks pages and removes least used one.
shrink_zones(): It is runned by kswapd with specified time interval and used for remove rarely used
pages. It also balances inactive and active lists using shrink_active_list().
shrink_active_list(): Provides to transfer pages between active_list and inactive_list and detect least used active lists and also implements page selection.
shrink_inactive_list(): Removes lists from inactive_list and send the lists to shrink_page_list().

In general, shrink_* functions run per zone.

5) in huge_memory.c look at collapse_huge_page and the functions
   that call it - under what conditions does the kernel gather up
   512 4kB pages and collapse them into one 2MB page?
collapse_huge_page()
                khugepaged_alloc_page() /* allocate new page */
                __collapse_huge_page_isolate(vma, address, pte); /* this one is new function for me */
                if (isolate_lru_page(page)) { ... }
                if (pte_young(pteval) || PageReferenced(page) ||
                        mmu_notifier_test_young(vma->vm_mm, address)) { ... }
                __collapse_huge_page_copy()

collapse_huge_page_isolate() removes pages from lru with isolate_lru_page().
I've thought: when collapsing pages, their lru's will change. So it isolates
pages.


Note-1: __collapse_huge_page_copy(): 
The 4kB pages could be anywhere in memory.
The 2MB page needs to be one contiguous page.
That means the contents of the 4kB pages need
to be copied over into the one 2MB page.
khugepaged_scan_pmd(), if page is young, it will call collapse_huge_page().
If the collapse function can correct vma, pmd and isolate pages, it collapses
pages.


6) under what conditions does the kernel decide not to collapse
   the 4kB pages in a 2MB area into a 2MB page?
There some conditions for it:
1) If can't alloc khuge page, it won't collapse.
2) I've looked to this condition in collapse_huge_page():
        if (unlikely(khugepaged_test_exit(mm))) {goto out;}
   if mm has no user, it goes to label out and doesn't collapse pages.
3) If it can't find vma and pmd
4) If it can't isolate pages


7)  look at what happens when shrink_page_list()
passes a 2MB transparent huge page to add_to_swap()
When it sent 2 MB page to add_to_swap function, it firstly checks whether page locked and up to date then calls get_swap_page(). If there is no swap page returns 0, If not it checks transHugePAge() then implements split_huge_page_to_list(). In split_huge_page_to_list it gets anonymous vma and does write-lock for it and checks PageCompound. With PageCompound it controls the is huge or not.  Then it checks PageSwapBacked. Then calls __split_huge_page() and the function wants the page shouldn't be tail and splits the page in __split_huge_page_splitting(). The function backs to add_to_swap and does swapcache_free() issues.

8) Can you explains what the page looks like after it has been split?
What happened to the 2MB page?  What do we have instead?
What happened with the PageCompound flag?
__split_huge_page(), it calls __split_huge_page_splitting() in the iteration. It counts number of mapped pmds before splitted it and increase mapcount.

In split_huge_page_map(), it takes page offset with address argument. Firstly, it checks pmd address validity. It
creates small entries in for loop with mk_pte(), set_pte_at(), pte_unmap (this one is just nop instruction for x86 systems). The for loop does one entry for page one, then page two, then page three etc. It changes address of entry adding pagesize (haddr += PAGE_SIZE) up to number of pmd.

I've asked, why pmd_populate()  is performed two times at lines: 1790, 1843?
Rik's answer: The first pmd_populate puts in place a special transparent huge page
PMD that says "this transparent hugepage is being split, do not mess
with it".


The second pmd_populate puts in place the page table page containing
the 4kB pages that map the 2MB area.


Note-1: In __split_huge_page() iterates vma from root of red black tree at line: 1864 but the function gets only one page and a page can match just one vma. So why it needs to iterate vma?

Rik replied my question: "The same page may be shared by multiple processes, if the
process that created the 2MB page originally called fork() afterwards."

Note-2: In  __split_huge_page_splitting(), it calls  pmdp_splitting_flush() what does it do also pmd_update and flush_tlb_range function? I think it should save pmd's content before splitting, it shouldn't lose it. Why it flushes pmd?
Rik's answer: if a small page is touched or dirtied afterwards, we want the MMU to set the accessed and/or dirty bit on the 4kB page entry.

Note-3: We can ignore PVOP_VCALL stuff - that is for Xen, which uses an alternate function for filling in page table info. 

9) Under what conditions can a region with 4kB pages be
turned into a 2MB transparent huge page?
I've traced following call chain:
do_page_fault()
        __do_page_fault()
                handle_mm_fault()
                        __handle_mm_fault() /* check conditions */
                                do_huge_pmd_anonymous_page() /* check conditions */
                                __do_huge_pmd_anonymous_page() /* check conditions */

In __handle_mm_fault(), "if (pmd_none(*pmd) && transparent_hugepage_enabled(vma)) { ... }" if the expression is correct, it can realize do_huge_pmd_anonymous_page(). I've seen this quote for pmd_none() "if page is not in RAM, returns true." But I think, if page is not used for any process, it includes zeros and should be in RAM.

In do_huge_pmd_anonymous_page(), "if (!(flags & FAULT_FLAG_WRITE) && transparent_hugepage_use_zero_page()) { ... }"
if it can correct the condition, it can start to create transparet huge page. I've looked for condition values.
flags = FAULT_FLAG_ALLOW_RETRY | FAULT_FLAG_KILLABLE; allow retry and killable flag values are defined with special values (0x08, 0x02)?
I think their values only for to check something. And transparent_hugepage_flags is 0UL, is it always have this value? I've looked for its value,
probably always have same value. The last condition creates huge zero page using  set_huge_zero_page() which calls pmd_mkhuge().


One more condition: __do_huge_pmd_anonymous_page(mm, vma, haddr, pmd, page), if it returns false, that means created transparent huge page at line: huge_memory.c#L808
If pmd_none() returns true, creates thp.


10) What code turns 4kB pages into a 2MB page?
pmd_mkhuge() installs 2 MB page. Actually, it does pmd_set_flags(pmd, _PAGE_PSE).
_PAGE_PSE uses _PAGE_BIT_PSE which means huge page.

11) Under what conditions can a region with 4kB pages not
be turned into a 2MB transparent huge page?
There are a lot conditions for this.
1) If the entire 2MB page inside vma, return fall back.
2) If it can't create anonymous vma, return out of memory.
3) If it can't create huge page vma, return fall back.
4) If it get true from __do_huge_pmd_anonymous_page(), return fall back.
5) in __do_huge_pmd_anonymous_page(), if page is not support huge page, the code create kernel panic, and halt.
   VM_BUG_ON_PAGE(!PageCompound(page), page);

6)  If it cannot allocate a huge page


24 December 2014

Pebble ile Libreoffice Impress Uzaktan Kontrolü



    Libreoffice üzerinde sunumlarınızı yaparken slaytı değiştirmek için yeniden bilgisayarın başına mı gitmeniz gerekiyor? Ya da bu işi uzaktan yapmak için elinizde kocaman bir telefon mu taşımak zorunda kalıyorsunuz? Durun! Artık slaytlarınızı Pebble ile değiştirebilirsiniz... Nasıl mı? :D

    1) Pebble'ınızın telefonunuzla olan bağlantısını kesin.

    2) Pebble'ı bilgisayarınızın bluetoothu ile eşleştirin. Pebble sürekli dışarıya görünür halde olmadığından bu eşleşmeyi yapmak için biraz hızlı olmanız gerekecek. Pebble'ın dışarıya görünür hale gelmesi için  Settings-->Bluetooth ayarına girdiğinizde yukarıda "Now Discoverable" yazısı çıkacaktır. O anda bu eşleşmeyi yapmak gerekiyor. Bir defada olmayabilir. Bu kısım bi miktar sıkıntılı ancak bunu sadece bir kez yapmanız yeterli. Siz elle bu eşleşmeyi bitirmediğiniz sürece bir daha böyle bir işlemeye ihtiyaç olmayacaktır.

    3) pebble-remote uygulamasın indirin. Sıkıştırılmış bir şekilde indirebilirsiniz ya da şu komutu kullanarak uygulamayı klonlayabilirsiniz.

        $ git clone  https://github.com/COMU/pebble-remote

    4) Bağımlılıkları kuruyoruz.

        $ sudo apt-get install python-dev libopenobex1-dev python-tk python-lightblue python-pexpect xdotool python-bluez

     5) lightblue-0.4 uygulamasını indirip kuruyoruz:

        $ git clone https://github.com/pebble/lightblue-0.4/
          $ cd lightblue-0.4
          $ sudo python setup.py install

    6) Bir terminal aracılığıyla pebble-remote dizini içine geçin:
     
        $cd /path/to/pebble-remote

    7) Burada çalıştırmak için gerekli komutu yazarken bazı parametrelere ihtiyacınız olacak.

Birinci parametre pebble id Bu bilgiyi iki şekilde öğrenebilirsiniz. Birincisi Pebble üzerinde Settings-->About-->BT Address

İkincisi bilgisayarınızda bluetooth ayarlarında eşleşmiş cihazlara girip Pebble cihazına tıkladığınızda sağ tarafta adres bilgisi olacaktır.

Adres 6 oktetten oluşan 11:22:33:AA:BB:CC gibi bir bilgidir. Bu bilgiyi bir kenara not edelim.

İhtiyacımız olan ikinci parametre, yapmak istediğiniz sunumun bilgisayardaki tam yolu.
Örneğin: /home/gulsah/sunum1.odp

Artık  şu komutu çalışırabiliriz(Kendi pebble id niz ve sunumunuzun tam yolu ile):

./p.py --pebble_id 11:22:33:AA:BB:CC --lightblue remote libreoffice /home/gulsah /sunum1.odp

    Bu komutu çalıştırdıktan sonra pebble ile bağlantıda bir sorun yaşarsanız bir defa bu komutu çalıştırırken yine pebble'ın ikinci adımda tarif ettiğim gibi görünür olması gerekebilir.

    Sunum önünüze tam ekran açılacaktır. Pebble içindeki müzik uygulamasını açıp üst ve alt düğmelerini kullanarak slaytlarınızı Pebble ile değiştirebilirsiniz. :)

 




23 December 2014

İnternetle Özgür Yazılım Sembiotik Bir İlişki İçinde


BTHABER 1000. sayı söyleşisi 15 aralık 2014

http://www.bthaber.com/internetle-ozgur-yazilim-iliskisi

Sedef Özkan

BThaber-AkgulÜlkemizin bilişim otoritelerinden Mustafa Akgül ile bilişim tarihimizde; sözcüklerle kısa sürse de, bir o kadar uzun ve devam edecek yolculuğa çıktık.

Bilişim dünyasına girişinin internetle olduğunu söyleyen Mustafa Akgül, “İnterneti çok önemsiyorum; ‘İnternet Yaşamdır!’ diyorum, onun en az sanayi devrimi kadar önemli, insanlığı ‘Bilgi Toplumu’na taşıyan bir gelişme olduğunu düşünüyorum” şeklinde konuşmasına başladı. Çabasını; interneti Türkiye’ye tanıtmak, ülkenin gündemine taşımak, ülkenin ekonomik, sosyal ve demokratik anlamda gelişmesine yönelik önündeki engelleri kaldırmak olarak aktaran Akgül, “Bu amaçla, İnternet Konferansı’nı 19 kere, Akademik Bilişim Konferansı’nı 16 kere, İnternet Haftası’nı 17 kere arkadaşlarımla düzenledik, düzenlemeye devam ediyoruz. KamuNet Konferansı’nı sadece 1 kere yapabildik. Bunların yanında Linux ve özgür yazılımı Türkiye’ye tanıtmak, gelişmesine katkı vermek için uğraştım. İnternetle özgür yazılım sembiyotik bir ilişki içindeler. İnternet sayesinde birbirini tanımayan insanlar birlikte, tüm insanların ortak malı ürünleri geliştiriyor. Bunların yanında pek çok bilişim etkinliği içinde oldum” açıklamasını yaptı.

Bilim, Ar-Ge ve inovasyonu temel alan kapsamlı bir strateji ve planla ülkemiz kalkınabilir

“Bilişim ve internet bir yandan toplumun bütünleşmesi, bir hedef etrafında birleşmesi, katılımcı ve saydam, demokratik olmaya yardımcı olacak araçları, öte yandan tüm sektörleri değiştiren, geliştiren, tüm yaşamı etkileyen, kolaylaştıran, sinerjiler oluşturma potensiyeline sahiptir” diyen Akgül, bilim, Ar-Ge ve inovasyonu temel alan kapsamlı bir strateji ve planla ülkemizin kalkınabileceğinin altını çizdi ve şu detayları verdi: “AB seviyesine ulaşabiliriz. ‘İnternet ve Bilişim’ tüm toplum kesimleri, tüm sektörler için önemli. Herkesin kendi işini yaparken, internet ve bilişimi kullanması, iyi planlanır ve düzgün araçlar geliştirilirse, işini daha iyi yapmasına, yüksek katma değere neden olacaktır. Şu anda Türkiye’de iyi niyetle çabalayan, para harcayan ama düzgün ve kapsamlı bir stratejisi olmayan, katılımcı, saydam mekanizmaları olmayan, resmin tamamını göremeyen çelişkiler içinde bir görüntü var. Bir yandan Bill Gates, Steve Jobs, Mark Zuckerberg’ler yetiştirmeyi hedefleyen, öte yandan twitter, facebook ve youtube’un kökünü kazımak isteyen bir ülkeyiz. Microsoft’un bile Açık Kaynak dünyasına katılma çabasında olduğu bir zamanda, olayın farkında olmayan bir bilişim sektörü, basın ve üniversiteleri olan bir ülkeyiz. Herkesin bilişimin önemini söylediği ama bir curcunanın sürdüğü, bütünsel bir yapının olmadığı acı bir gerçek olarak karşımızda.”

Dünya, anaokulunda programlama kavramlarını öğretmeye çalışıyor

“Bilişimi ve bilişimle ülkeyi ne geliştirir?” sorusuna şöyle yanıt veren Akgül, açık kaynak ve özgür yazılıma da vurgu yaptı: “Bilişim için siyasal liderlik, sorumluluk alacak siyasal geleceği bilişime bağlı bir siyasal kadro, tüm paydaşları içeren, katılımcı, tüm çalışmaları koordine edecek bir yapılanma, kapsamlı bir strateji, açık ortamlarda periyodik gözden geçirilen Eylem Planı; bilişimi ve bilişimle ülkeyi geliştirir. Demokrasi, saydamlık, katılımcılık, ifade özgürlüğü, merak, girişim, bilişim sektörünün gelişmesi için önemlidir. Açık Kaynak ve özgür yazılımlar stratejinin bir parçası olmak zorunda. İnsan gücü, eğitimi de önemli bir parçası olmalı. Ülke olarak bilişim eğitimi ve bilişim kültürüne önem vermemiz gerekir. Kaliteli uzmanlar, doktoralı elamanlar yetiştirmeliyiz. Bizim, dağdaki çobandan, denizdeki balıkçıya, tarihçiden ziraatçiye, temel bilişim kavramlarını, bilişim ve internet tehdit ve olanaklarını, sınırlarını ve potensiyeli anlatacak mekanizmalar kurmamız gerekir.” Mustafa Akgül, “Dünya anaokulunda programalama kavramlarını öğretmeye çalışıyor” diyerek erken yaşta bilişim eğitimine dikkat çekerek şunları paylaştı: “Okullarda temel bilişim kültürünü, başta programalama, bilgi sistemi, veri tabanı, ağ, güvenlik, mahremiyet, etik ve estetik kavramlarını öğretmeniz lazım. Bilişimin önemini, karmaşıklığını, zorluğunu ve kırılganlığını okullarda anlatmamız gerekir. Her meslekten okullu, bir yelpazede bilişim kültürü almalı. Öğretmenler, hukukçular, kamu/siyaset bilimciler, idareciler, işletmeciler biraz daha öncelikli olmalı.” Yazılım stratejisine de değinen Akgül, “Doğru dürüst bir yazılım stratejimiz olmalı. Bunda Açık Kaynak ve özgür yazılımlar, gömülü sistemler önemli rol almalı. Stratejik sektörler belirlemeli, onlara daha fazla odaklanmalıyız. Bütün bunlar bir miktar öğrenme ister. Öğrenen, geri besleme yapacak, katılımcı yapılar kurmalıyız.”

Eşit bir dünya vatandaşı olduğunun farkında yaşamak…

Akgül, tecrübelerini paylaşırken yolu bilişimden geçenlere yani herkese şunları önerdi: “Başta merak, işin özünü anlamaya, öğrenmeye, deney yapmaya, eleştirisel bakmaya önem vermeli, özen göstermeliler. Yapıcı ve girişimci olmalılar. Sorumluluk almaktan, hata yapmaktan korkmasınlar. İnsanları kırmaktan kaçınsınlar, yumuşak bir dille uzlaşmacı olsunlar. İlkelerden taviz vermeden, diyalogla orta yol bulmanın yollarını arasınlar. Sanat ve kültürden, müzikten zevk almaya çalışsınlar. Doğa ve çevreye saygılı, yaşama saygılı bir tavır sergilesinler. Eşit bir dünya vatandaşı olduğunun farkında olarak yaşasınlar.”

İnterneti savunmaya, tanıtmaya, yaymaya devam edecegiz

Hedefleri hiç tükenmeyen Akgül, “Benim çalışmalarım birbirine bağlı olarak ‘İnternet ve Özgür Yazılım’ etrafında olmuştur. İnternet konusunda, yurt dışındaki internet özgürlüğünü savunan gruplarla birlikte çalışan isoc-tr yani İnternet Derneği’ni geniş bir kadroyla birlikte kuruyoruz. İnterneti savunmaya, tanıtmaya, yaymaya devam edecegiz. Yıllık kapssamlı internet raporları çıkartmak, interneti toplumun gündemine koymak, demokrasiyi geliştirici uygulamalara destek olmak gibi hayallerimiz var. 1998’de bir kere yapabildigimiz KamuNet Konferansı’nı günün koşullarında; kamunun saydamlaşmasına, etkin çalışmasına, yurttaşa hızlı hizmet ve demokrasiye katkı vermesine yönelik yılık konferanslar olarak yapmak istiyoruz. Özgür yazılım boyutunda; üniversitelerde özgür yazılım derslerinin ve kullanımının artması, yıllık raporların hazırlanması gibi çaba/proje/hayallerim var. Son yirmi yılı özetlemeye çalışan 2 sloganımız bulunuyor: ‘İnternet yaşamdır’ ve ‘Türkiye Bilişimle, Bilişim Özgür Yazılımla gelişir!’”



22 December 2014

2015'de kurumsal pazarda PostgreSQL'in yeri



2014'ü kapatırken, 2015 planlarımızı ve hedeflerimizi tabii ki bir süredir düşünüyor ve not ediyoruz.

Bu yazıda 2014'ün çok kısa bir özetinin yanı sıra 2015'de Türkiye'de PostgreSQL konusunda neler beklediğimizi bulabilirsiniz

Continue reading "2015'de kurumsal pazarda PostgreSQL'in yeri"

19 December 2014

3. Türkiye PostgreSQL Konferansı'nın ardından


Biraz gecikmeli de olsa 3. Türkiye PostgreSQL Konferansı'nı değerlendirmek istedim.

Bu seneki konferans, İstanbul'daki 2 büyük etkinlikle aynı gün, ama Ankara'da idi. Biz tarihi daha önceden belirlemiş olmamıza rağmen geç duyurduğumuz için çakışıyor gibi gösterildik. Bir dahaki sefere zamanında duyuracağız, bundan ders aldık.

Continue reading "3. Türkiye PostgreSQL Konferansı'nın ardından"

14 December 2014

İmzalamadığınız Commit Sizin Değildir


Git kullananlar bilirler, .gitconfig isimli dosyaya isim soyisim ve e-posta adresi yazılarak commit loglarına commit sahibinin bilgileri otomatik eklenir.

Ancak bu durumun bir olumsuz(?) yanı vardır. Başkaları sizin adınıza commit yapabilir.
Kendi .gitconfig dosyanıza Ali yazsanız Ali’nin adına Veli yazsanız Veli’nin adına commit yapabilirsiniz.

Ancak bir commit’in gerçekten o kişinin yaptığına emin olmak için commit’i imzalamakta fayda vardır.

Peki imzalamayı nasıl yapacağız?

Öncelikle sisteminizde imza var mı bakınız:

gpg --list-keys

(Eğer daha önce GPG ile ilgili işlem yapmamışsanız, bu komut gerekli dosyaları da oluşturacaktır.)

Şuna benzer bir sonuç döndürmeli:

pub   2048R/B489436C 2014-12-14
uid                  Adil Ilhan <no-reply@adililhan.com>

Eğer GPG anahtarınız yoksa boş sonuç dönecektir.

gpg --gen-key

komutu ile GPG anahtarınızı oluşturabilirsiniz. Bu komut size yol gösterecektir.

Ekstra olarak açıklama gereği duyduğum kısım passphrase kısmı. Buraya parola girerseniz oluşturacağınız anahtar bu parola olmadan çalışmayacaktır. Yani anahtarınız çalınsa bile ekstra olarak bir de buraya yazdığınız parolaya ihtiyaç duyulacaktr.

GPG anahtarı artık oluşmuş olmalı. Kontrol için:

gpg --list-keys

Git ortamınıza bu anahtarı tanımlamak gerek:

git config --global user.signingkey B489436C

B489436C bilgisini gpg –list-keys komutunun sonucundan aldım.

Artık commitleri -S parametresi ile imzalayabiliriz:

git commit -m "test" -S

İmzalanmış commitleri görme ve doğruluğunu teyit etme:

git log --show-signature

Bu komut, yerel (local) makinenizdeki GPG bilgisi ile commit log’unda yer alan GPG bilgisini eşleştirir.
Uyuşan loglara gpg: Good signature… yazılır. Uyuşmayan loglara Can’t check signature yazılır.

Örneğin sizin bilgisayarınızdan imzalanarak commitlenen bir commit başka bir bilgisayarda bakıldığında ve o bilgisayarda sizin GPG anahtarınız yoksa log sonuçlarına Can’t check signature bilgisi yazılır.



08 December 2014

Etkinlik Dolu Haftasonu (Özgür Web Günleri 2014, Devfest İstanbul 2014)


Herkese merhaba, geçtiğimiz haftasonu İstanbulda gerçekleşen 2 etkinliğe katıldım. 

İlki cuma ve cumartesi günü olan Özgür Web Teknolojileri Günleri. Diğeri de cumartesi günü gerçekleşen Devfest İstanbul. Birazcık gözlemlerimden ve sunumlardan bahsetmek isiyorum. 

Özgür Web Günlerine cuma günü katılmama rağmen beklediğimden kalabalıktı. Tahmin edeceğiniz gibi Çanakkale'den yine kalabalık bir ekiple gittik. (Necdet Yücel, Gülşah Köse, Esra Altıntaş, Sedat Ak, Hilal Çetinkaya, Yeliz Taneroğlu, Dilek Üzülmez, Natavan Mirzayeva)
Etkinlik Mustafa Akgül'ün konuşmasıyla başladı. Akgül Hoca, eskiden bu zamana etkinliklerin nasıl başlayıp ilerlediğinden, Türkiye'ye internetin gelişinden ve durumunun nasıl geliştiğinden, LKD'nin nasıl başladığından bahsetti. 

Sonrasında Necdet Yücel'in "Yenilikçi Web Teknolojilerini Nasıl Lisanslamalıyız?" sunumunu dinledim. Necdet Hoca, özgür yazılım ile açık kaynak arasındaki farklardan, özgür yazılımın felsefe olarak bize ne anlattığından, lisansların öneminden ve çeşitlerinden bahsetti.
 
Öğleden sonra Gülşah Köse'nin " Supervisor için merkezi yönetim arayüzü" sunumu vardı. Bize, stajında kendi yazdığı CESİ'nin neler yapabildiğini anlattı. :)

Etkinliğin son sunumlarından Puppet Sertifika Yönetimi'ni de ben anlattım. Stajda yaptığım işten, Puppet'ın nasıl çalıştığından, puppet sertifikalarından bahsettim:) Sunum slaytlarına buradan ulaşabilirsiniz. 

Sunumlar dışında yeni özgür yazılım insanlarını tanımak, uzun zamandır görmediklerim ile sohbet etmek çok güzeldi. İkinci günü de eminim aşırı harika olmuştur :)

Ayrıca etkinlikten sonra çoğu Çomü'den mezun Necdet hocanın öğrencisi olan kalabalık bir grupla sohbet etme fısatımız oldu. Katılmayanlara ne anlatsam boş olacak. Anlayamazsınız :)

Cumartesi günkü Devfest etkinliğine de katılım çok çok fazlaydı. Bazıları Türkçe, bazıları İngilizce gerçekleşen sunumlar 4 paralel salonda yapıldı. Öğleden sonra katılmama rağmen  kendimden beklemediğim kadar sunum dinledim. Ağırlıklı olarak web uygulamaları hakkında sunumlar vardı. 

Bir de yakından quadcopter görme fırsatım oldu :)

Benim için çok yoğun ve eğlenceli geçen bir haftasonuydu. Yeniden görüşmek üzere, hoşçakalın :)


07 December 2014

Page Fault Handler


I've started to read something about memory issue. Firstly, I've looked for basic concepts for it. This link is pretty good for basic concepts.

MMU (Memory Management Unit) translates physical memory addresses to virtual addresses. It creates an interrupt when a page fault occured. When a process try to access an address and if the address is unknown for MMU then it creates page fault exception. In this case page fault exception handler examines current state of MMU and process.  do_page_fault(...) function is page fault handler for Linux. It is processor specific function, I've studied for x86 based systems.

do_page_fault() function gets two arguments which are error code and registers of the process. The error code specifies the page fault whether because of read operation or write operation.

Firstly the function saves address of line which is cause of the exception (control register two), then saves prev state of process.

Page fault handler needs to detect whether the page fault is good or bad. Good page fault means the process needs more memory. Bad page fault can occur for different cases, in general it causes of terminate the process by the handler.

Actually do_page_fault calls __do_page_fault(...) function and it is main area to handle the page fault.

In Linux based systems every process has a page directory and page table. We can understand which pages used by which process with the data structures. If process needs more memory, the handler gets a page from pglist_data which is a global list and adds the page to page table of process.

The function using mm_struct can detect whether the process has permission access for the address. It uses find_vma function for this operation. If process has to access then the address assigned to the process else the process is terminated and segmentation fault occured.

Processes are created as instance of task_struct which includes mm_structs and keeps info about processes.

You can see process resources under /proc/pid/*. If you want to see process vma, then type "cat /proc/pid/maps" on bash. To understand memory issues better, I've read the chapter, this book is very good for kernel newbies.

Also this two links are very helpful for me, they are for kernel 2.6x series but very good to understand big picture of the topic.

Other sources:
http://www.stillhq.com/pdfdb/000446/data.pdf
http://duartes.org/gustavo/blog/post/how-the-kernel-manages-your-memory/


06 December 2014

İnternet Demokrasi ve Kalkınma için Yaşamsaldır


inet-t'14

inet-t’14

Bu yıl 19.sunu yaptığımız “Türkiye’de İnternet” Konferansı fikri Türkiye İnternetinin emekleme günlerinde 1995 baharında yurt dışının 64K, iç hatların 9.6 veya 19.2K olduğu günlerde, daha 2 Mbitlik omurga hayal edilirken, ortaya çıkan çalkantıyı azaltmak, paydaşları bir masa etrafında toplamak, ve ortak akıl oluşturmak amacıyla ortaya atılmıştı. İlk yıllar bürokrasinin merkezi Ankara, ile iş dünyasının merkezi İstanbul arasında gidip geldik, büyük ölçüde tüm paydaşları da buluşturduk.

Türkiye İnterneti çok büyüdü, büyük oyuncuları ve iş dünyasını bu konferansa pek çekemiyoruz. Ama, biz hala, bu konferansın, internetle ilgilenenlerin buluşma noktası, sorunların tartışıldığı bir platform, ortak aklın arandığı bir ortam olmasını arzuluyoruz. Bu konferansın, internet konusunda, topluma entelektüel liderlik etmesi arzumuzdan ve çabamızdan vazgeçmedik. Ana sorunların ülkenin gündemine taşınması, o sorunlar için alternatif çözüm arayışlarına ortam sağlama amacı hala geçerli.

İnterneti Nasıl Algılamalı ?

İnternet hepimiz için yaşamın ayrılmaz bir parçası haline gelmiştir; ve yaşamı sürekli olarak hiç beklemediğimiz sekilde değiştirtirebilmektedir. Bu konferansı düzenleyenler olarak, interneti, insanlığın yeni toplum biçimi olduğunu düşündüğümüz, Bilgi Toplumunu oluşturan araç ve kavramların temsilcisi olarak görüyoruz. Sanayi devrimi insanın kol gücünü çokladı, onun etkin kullanımını mümkün kıldı. İnternetin temsil ettiği devrim ise, insanın beyin gücünü çokluyor, onun ürünlerinin paylaşılmasını, yeniden üretilmesini kolaylaştırıyor. İnternet Bilgi Toplumunun taşıyıcısı, ön modeli, katalizörü konumunda. Yaşam gitikçe artan bir şekilde bilgi ve enformasyon üzerine dönüyor. Artı değer yaratmanın ana unsuru, bilgi, ar-ge, inovasyon, yani eğitimli insanların beyinsel ürünleri oluyor. İnternet bireyi özgürleştiriyor, güçlendiriyor. Kitlelere örgütlenme ortamları sunuyor, onları güçlendiriyor. Hiyararşik yapıları kırmaya başlıyor. Nasıl sanayi devrimi sancılı olduysa, Bilgi Toplumuna dönüşüm de uzun ve sancılı olacaktır. İnternet dünya üzerinde 3 milyar insanın katıldığı bir paylaşım, öğrenme, üretim ve eğlence ortamıdır. İnternet, sektörleri yeniden yapılandıran, meslekleri değiştiren, kamu yönetimi, demokrasi, hizmet ve ticareti yeniden tanımlayan devrimsel bir gelişmedir. Birbirlerini hiç görmeyen insanlar, insanlığın ortak mülkiyeti için ürünler geliştirmekte; özgür yazılım, açık erişim, açık ders malzemeleri, açık bilim, açık tıp, açık biyoloji gibi projeleri hayata geçirmektedirler.

Dünya Nerede, Türkiye Nereye Gidiyor ?

Internetin boyutları konusunda bir kaç rakam verirsek: 3 milyara yakın insan internet kullanıcısı. İnternete kayıtlı bilgisayar sayısı 1 milyarı aştı. 950M web var. 140M’sı uluslararası, toplam 276M kadar alan adları var. Blog ve video sayısının yüz milyonlar ölçüsünde olduğunu biliyoruz. Google artık sayfa sayısı vermiyor, ama 2008 de 1 trilyon URL’e ulaştığını açıklamıştı. Facebook milyarı aştı (1.350B), twitter 284-645M , Linkedin 260M, wordpress 75+600 M blog var, vine 40M, instagram 200M, Pinterest 70M. Türkiye’ye gelince 16-74 yaş grubunde kullanım %53, Erkekler %63.5, Kadınlar %44.1, bu orta doğu anadoluda %37.6, % 50.5 % 24.2 düşüyor . Düzenli kullananlar 44.9, 54.3. 35.5. Internete kayıtlı bilgisayar 7.2 milyon rapor edildi. TR altında 357 bin alan adı var. Yurt dışında da 1.3M civarında var . Kabaca değerlendirirsek; dünya ortalamasını yakaladık ama, Avrupa ortalamasını yakalayamadık.

Uluslarası indekslere durum, parçalı bulutlu; coğunlukla bulutlu. ITU indeksilerinde durum: ICT gelişmede 68/166, beceride 48/166 , internet kullanımında 77/166, erişimde 61/166. Fiyat sepetinde ise 67/166. Dünya geniş bant indeksinde 70/173. Dünya ekonomik formu indeksinde uzunca bir dönem geriledik; indeksi değiştirdiler, 70’lerden 52’ye sıçradık, 45 ve bu sene 51/148. Yine Dünya Ekonomik Forununda Rekabet indeksinde bir sıçrama yaparak 59 dan 43’e sıçradık, 44/148. Ama, WIPO ve INSEAD’ın ürettiği Inovasyon indeksinde 54. Birleşmiş Milletlerin e-devlet indeksinde 71/192 ama e-katılımda 111/192 sıradayız. İnsani gelişme, demokrasi, basın ve ifade özgürlüğü, ve toplumsal cinsiyet indekslerinde çok kötüyüz; 69/192, 125/142, 154/179 . WWW vakfının sıralamasında 58/81 durumdayız: bu özgürlük, içerik ve yarar alt indekslerinde de aynı civarda.

Türkiye İnterneti gelişiyor. Mobilde ilginç uygulamalar var, en yeni cihazları alıyoruz. Finans sektörümüz internet işinde oldukça başarılı. Kamuda Maliye, Sağlık, Adalet sisteminde önemli projeler var. E-devlet hizmetleri sunumunda Avrupa ortalamasının üstündeyiz. Büyük özel sektör interneti oldukça iyi kullanıyor. Okullar için 8 milyarlık Fatih Projesi yürüyor görüntüsü veriyor. Çeşitli ar-ge teşvikleri var, teknokentler çoğalıyor. İnternet ve Bilişimle ilgili bakanlarımız var.

Türkiye Gemisi Rotasını Bilgi Toplumuna henüz döndüremedi!

Bütün bunlara rağmen, ülkede Bilişim, Bilgi Toplumu konularında bir dağınıklık söz konusu. Ülkemizde planlı, sistematik, kapsamlı ve tutarlı bir Bilgi Toplumuna yöneliş olduğunu söylemek mümkün değil. 2006-2010 kapsayan Bilgi Toplumu Stratejisi ve Eylem Planı vardı, yenisi için bu sefer katılımcı bir şekilde çalışıldı, siyasilerin onayını bekliyor. Türkiye gemisinin rotasını bilgi toplumuna döndürecek boyutta sahiplenme, yapılanma, program, ve çaba yok. Arada bir söylenen iyiniyetli, parlak sözler, başlayan bir çok proje bu gerçeği değiştirmiyor. En başta, yeterli kapsamda siyasal sahiplenme ve örgütlenme olduğunu söylemek zor. Vaktinin yarısını, 1/3′ünü buna ayıran bakan, müsteşar ve genel müdür düzeyinde kimse yok. Bilgi Toplumu çalışmalarını koordine edecek kapasitede bir yapılanma yok. Yapılanma olarak, Bilgi Toplumu Dairesi, Başbakanlık e-devlet grubu, Türksat, BTK, Sanayi Bakanlığı ve Ulaştırma Bakanlığı var. Bunun bir Parlamento ayağı yok. Sivil toplumu, özel sektörü, üniversiteyi ve basını işin içine çekecek, ortak aklı arayacak, saydam ve katılımcı, felsefe, kadro ve yapılar yok. Moda deyimiyle Multi stakeholder yapılar yok; bir başka deyişle Türkiye İnternetinde yeterli düzeyde yönetişim yok.

Yasaklar Kanayan Yara

Türkiye İnternetinin özgürlük boyutu ve yasaklar kanayan yarasıdır. . Ülkemiz 7 yıldır, 5651 nolu yasa yoluyla, tabir caizse, “İnternetle Savaşıyor”. Ülke olarak kanıksadık ama, 5651′in getirdiği yapı, demokratik hukuk devletinde kabul edilemez bir Hukuk Faciasıdır. I yBürükratik bir kadro 60 bin webi asaklamktadır, basitçe yargısız infaz sözkonusudur. Bu filtre uygulaması ile daha kötü bir hal aldı derken, devletin topyekün bir savaşı gizli kapaklı yürüttüğü izlenimini almaya başladık. Mevcut mevzuatı zorlayarak, yasa ve hukuk dışı bir şekilde, Youtube ve Twitter’ın kapatılması, Google DNS sunucuları için yapılan sahte sunucular, Türk Telekomun bütün iletişimi, https dahil izleme altyapısı kurma çabası, BTK’nın tüm trafiği izleme arzusu, insan hakları, hukuk devleti açılarından kaygı verici gelişmelerdir. Bunlar mevcut anayasal hakların ihlali nin ötesinde uluslarası hukukun, ve internet kurallarının/protokollerın çiğnenmesi anlamına gelmektedir. Bütün bunlar çocukları koruma bahanesiyle yapılıyor. Çocukların korunması konusunda bir anlaşmazlık yok. Sorun bunun nasıl yapılacağında. Hoşgörü, diyalog ve yönetişim içinde insan odaklı çözüm aramalıyız. Saydam ve katılımcı yapılarla, ifade özgürlüğü ekseninde sorunu çözmeliyiz.

Türkiyenin dünya İnternet literatüre girdiği iki nokta öne çıkıyor: biri YouTube/twitter engellemesiyle öne çıkan yasakçı bakış, diğeri ise Gezi olayları sırasındaki Sosyal Ağ kullanımıdır.

Bilgi Toplumu Strateji ve Eylem Planın temel hedefi, emek yoğun bir ekonomiyi ve kırsal ağırlıklı bir toplumu, bilgi yoğun bir ekonomi ve toplumsal yapıya dönüştürmek olmalıdır. Farklı disiplinlerden uzmanları barındıran, esnek, bağımsız, inisiyatif alabilen, yönetişimi temel alan bir yapı gerekir. Türkiye’yi Bilgi Toplumuna taşıyacak kadroları yetiştirmeye yönelik çalışan bir programımız ve politikalarımız yok, ve var olan kadroları kamuda tutacak insan kaynakları politikalarımız sorunlu. Serbestleşme mevzuat olarak tamam ama, pratikte ağır aksak ilerliyor; istatistikler fiili tekelin devam ettiğini gösteriyor. Bir başka deyişle bilişim ve internet sektöründe tam rekabetin olduğunu söylemek zor.

Dünya Çocuklara Programlama Öğretmeye Çalışıyor!

Ülkemizde Bilişim insan gücünde ciddi sorunlar var; en başta vizyon ve plan eksikliği öne çıkıyor. Okullarda bilişim eğitimini sorunlu. İlk 12 yılı düşünürsek, temel bilişim eğitimi seçmeli ve medya okuryazarlığı de seçmeli halde idi. Şimdi Bilişim Teknolojileri ve Yazılım Dersi kararı verildi. ACM lise fen kolunda bir öğrencinin 6 bilgisayar bilimi dersi almasını öneriyor; bu kültür derslerin ötesinde. Öğrencilerimize, bilgisayar/bilgi okur yazarılığı dışında, etik, güvenlik, estetik ve temel programlama, ağ, veritbanı ve bilişim sistemleri kavramlarını öğretmeliyiz Dünya çocuklara programlama öğretmeye çalışıyor. Tim Benners-Lee poltikacılara programalam öğretmek istiyor.

İnternetden ve Sosyal Ağlardan Korkmayın, onları ciddiye Alın!

Bütün dünyada devletler, interneti zapturapt altına almak istiyorlar, ama kitleler daha açık bir toplum istiyorlar; saydamlık, hesap verilebilirlik, yönetime katılma, ve refahtan pay istiyorlar. Bunu kamu yönetiminden istedikleri kadar, tüm kurumlardan istiyorlar. Wikileaks’i dünya yurttaşlarının gerçekleri öğrenme, saydamlık talebi penceresinden bakmak gerekir. Snowdeni de aynı yönde yapılmış önemli bir katkı olarak görmek gerekir.

İnternet, sosyal ağlarla, yeni medyayla, kitlesel projelerle, pek çok insanı tedirgin ediyor. İnternet yaşamın vazgeçilemez bir gerçeği oldu. Biz diyoruz ki, İnternet’den Korkmayalım! Onu öğrenelim! Olanaklarını ve olası risklerinin farkında olalım. İnterneti kendimizi geliştirmek, işimizi geliştirmek, daha iyi yapmak, daha iyi dünya vatandaşı olmak için kullanalım. Nasıl elektriği, telefonu kullanıyorsak, interneti de aynı ölçüde doğal kabul edelim. Kendimizi özgürleştirmek, yenilemek için kullanalım. Demokrasiyi geliştiren bir yurttaş olarak katkımızı göstermek için kullanalım, toplumsal katılım ve denetim için kullanalım.

Bu konferansta toplam 34 oturumda 8 Panel/Form, 13 seminer ve 10 bildiri ve 2 Çalıştay oturumu yapılacaktır. İnternetin, ticari, hukuksal, sosyal boyutlarını kapsayan 40 bildiri arasında İnternetin tüm boyutları hakkında bildiri bulmak mümkün. Eğitim seminerleri, hem bireysel kullanıcıya, hem kurumsal kulanıcıya, hem Yazılım Şirketlerine, yönelik, hem bilim adamına, hem programcıya hem de girişimceye yönelik olacaktır. Seminerlerin önemli kısmı Özgür yazılım etrafında olacaktır. Linux ve Özgür yazılımlar, İnternet üzerinde yayılmış 10 Milyon civarında gönüllünün ürettiği 1 Milyon civarında yazılımı kapsamaktadır. Özgür yazılım, bireyler, kurumlar ve ülkeler için tasarruf, istihdam, güvenlik ve rekabet açılarından önemlidir. Ülkemizin yazılım startejisin önemli bir parçası olmak gerekir. Özgür Yazılımın yansımaları olarak açık erişim, açık ders malzemeleri, açık bilim, açık kitap, açık biyoloji, creative commons, crowd sourcing, crowd funding, wikipedia gibi paylaşma ve katılım felsefeli projeler gelişmektedir.

Ülkemizdeki İnternet kullanıma yönelik, e-öğrenme, toplumsal yansımalar, e-tarım, e-ticaret konularında deneyim paylaşan bildirilerin yanında işin teknik boyutuna odaklanmış bildiriler de sunulacaktır. Bireysel/Siber güvenlik, Hukuk, Mobil, E-öğrenme, Sosyal Ağlar, Kent sistemleri, Bilgi Toplumu, Yönetişim, Demokrasi oturumları öne çıkmaktadır.

ISOC-TR Kuruluyor
İnternetin Uluslarası yönetiminde önemli bir rol oynayan ABD Merkezli İnternet Derneği (Internet Society) ile benzeri çalışmalar yapacak Ankara merkezli İnternet Derneği tanıtımını da bu konferansta yapılacaktır.
Konferansa katılmak, yeni şeyler öğrenmek, yeni dostluklar, yeni ağlar oluşturmanın yanında, Türkiye İnternetine sahip çıkmak, yasaklara karşı tavır almak, katılımcı, saydam ve demokratik bir toplum oluşturma çabasına katkı vermek, “bu çorbada benim de bir tutam tuzum var “ demek için önemli.

Biz, İnterneti çok önemsiyoruz. Bu konferansları da genelde interneti, özelde Türkiye internetini tartışacak, toplumun gündemine koyacak, ve ülkemizin gelişmesine katkı verecek bir platform, ortak akıl için bir ortam olarak tutmaya çalısıyoruz, çalışacağız. İnternet konferansını, ülkenin Bilgi Toplumu ve e-devlet çabalarının gözden geçirileceği, geri besleme yapılacağı bir dost ortamı yapmak istiyoruz.
Bu hedefe ulaşmada bugüne kadar istediğimiz başarıyı elde edemedik ama bu davet bizim!

Katkı veren herkese tekrar teşekkür eder, başarılar dilerim.

İnet-tr YK Adına
Mustafa Akgül
27 kasım 2014
[19. İnternet Konferansı açık konuşması ve Sunumu ]



02 December 2014

3. Türkiye PostgreSQL Konferansı'nda sosyal etkinlikler


Bu seneki PostgreSQL konferansı'nda sosyal etkinliklerimiz de var. Ankara ve İstanbul'da toplam 3 etkinlik planladık:


Continue reading "3. Türkiye PostgreSQL Konferansı'nda sosyal etkinlikler"