LibreOffice Calc’a "Tüm Yorumları Sil" fonksiyonu eklendi

Kısa süre önce eklediğim tüm yorumları göster ve gizle fonksiyonlarından sonra takımı tamamlayarak "tüm yorumları sil" fonksiyonunu ekledim. 5.4 sürümünden itibaren kullanılabilicek.



İlgili hata kaydı: https://bugs.documentfoundation.org/show_bug.cgi?id=107143
Gönderdiğim yama: https://gerrit.libreoffice.org/gitweb?p=core.git;a=commitdiff;h=38ba5bfa215231f5937abebafd075a58c227e7ca
Sürüm notu: https://wiki.documentfoundation.org/ReleaseNotes/5.4#Calc




20 Nisan 2017

Posted In: calc, comment, Gezegen, hesap tablosu, libreofis, ozguryazilim

Özgür Yazılımı Richard Stallman’dan Dinlemek

    28 Şubatta Richard Stallman Sabancı Üniversitesine geldi. Biz de kalabalık bir grupla dinlemeye gittik.  Elbette bişeylere ikna olmak için orada değildik.  Bu konuyu çok kez Necdet Yücel'den dinledik. Ama bunu özgür yazılım akımını başlatan adamdan dinlemekte ayrı güzeldi. O konuşurken bi o kadar rahat biz ise acayip heyecanlıydık. :)

    Stallman önce yazılımların neden özgür olması gerektiğine,  özgürlük kavramının hükümet dahil çok kişiyi rahatsız etmesine değindi.  Aslında sadece yazılım tarafında değil sanatta, düşünceyi ifade etmede, hayatta özgürlükten bahsetti. Bunun nasıl sağlanabileceğinden bahsetti. Onu dinlerken insan böyle bir dünyayı hayal edemiyor tabi. Çıkışta Necdet hocayla aramızda geçen diyalog şöyleydi:

- Stallmanın hayalindeki dünya çok güzel ama insan böyle bir dünyayı hayal edemiyor.
+ Bundan 30 yıl öncede özgür yazılım diye bir şeyi de hayal edemiyordu insanlar.

:) (İç ses : Umut var)

    Bir de Linus'a gönderme yapmayı ihmal etmedi tabi. "Linux işletim sistemleri söylemi yanlış." Linux işletim sisteminin sadece çekirdeği. Geri kalan özgür araçlar GNU projesinin ürünleri. Lütfen Linux yenine GNU/Linux kullanalım Stallman'ın hakkını Stallman'a verelim :)

    Bir de Açık Kaynak mevzusundan bahsetti. Açık kaynak diye bir kavram var elbette. Ama bunun Stallman ile bi alakası yok. Açık kaynağın babası falan diye bahsedilmesinden oldukça rahatsız. Tam da bunu yazacakken Stallmanın türkçe viki maddesine bakayım dedim bir de ne göreyim. Her yerde açık kaynak yazıyor. Kolları sıvadım ve özgür yazılım ulan diye değiştirdim :)

    Kısacası Stallman'ı görmüş olmak heyecan ve mutluluk vericiydi. Bu konuşmayı kaçırdıysanız geç kalmış değilsiniz. 6 Mart 2015 te BİLMÖK'te yine konuşacak ve biz de orada olacağız :)



Şimdi de en havalı fotoğrafımı paylaşıyorum :)



3 Mart 2015

Posted In: Gezegen, kripton, Özgür yazılım, özgürlük, ozguryazilim, richard stallman

Akademik Bilişim 2015

    Bu sene 17. si düzenlenen bu etkinliğe ikinci katılışımdı. Etkinlik Eskişehir Anadolu Üniversitesinin ev sahipliğinde gerçekleşti. Bu sene bu etkinliğe bakış açımı değiştiren bir sene oldu. Çünkü önümüzdeki sene olacak akademik bilişim için hazırlıkların daha bu seneki akademik bilişim başlamadan başladığına şahit oldum. Ve bu büyük etkinlik çok az insanın devamlı desteğiyle ayakta duruyor. Etkinlik katılımcı-eğitmen sayısı olarak giderek büyüyor. Ölçek büyüdüğünde aklınıza hiç gelmeyecek küçücük bir şey bile büyük bir soruna dönüşebiliyor. Yaklaşık 1500 kişi kurslara kayıt olurken, yaka kartlarını alırken, kalacağımız yerlerde, prizleri kullanırken, internete bağlanırken, yemek yerken, sunumları dinlerken bir sorun yaşamadık. Ama sorun yaşamamamız için çok insan hiçbir maddi karşılık almadan uykusuz kaldı, çalıştı, emek harcadı. O gönüllüler ordusuna bir kez daha saygılarımı iletiyorum.

    İlk gün kayıt için normal olarak bir miktar koşuşturma vardı. Çünkü kursiyerlerin hepsi aynı anda kayıt masasına gelmişti. Sonra kursiyerler sınıflarına yerleşti ve kurslar başladı. Ortalık sakinleşti. Biz Necdet hocamla etkinlik boyunca tek tek sınıfları gezdik, herşeyin yolunda olup olmadığını kontrol ettik. 35 kurs 40 tan fazla sınıf vardı. Bu gerçekten yorucuydu ama yaşadığım en tatlı yorgunluktu :) Akgül hocanın yanımızda olamadığı zamanlarda Necdet hoca bir eli telefonda herşeyin yolunda olduğunu anlatıyordu :) Ama Akgül hoca da ne durumda olursa olsun sürekli çalışıyordu. Sunucular kuruyor sayfa sayfa mailler yazıyordu. Bunları yazarken etkinliğe bir kez daha uzaktan bakma fırsatı buluyorum ve nasıl büyük bir çaba ve fedakarlıkla devam ettiğini bir kez daha anlıyorum.

    Ders aralarında kursiyerle tanışıp etkinlik hakkındaki izlenimlerini öğrendik. Bizim gördüğümüz herkes etkinlikten memnundu. Memnun olmadıkları bir yer varsa söylemeleri için Necdet hoca ne kadar üstlerine gitse de  :) olumsuz bir  dönüş olmadı. Bu mutluluk verici.

    Günün sonunda eğitmenler ayrı yorgun kursiyerler ayrı yorgun oluyordu. Kolay birşey değil tabi. Sabah 9 dan akşam 6 ya kadar bir konu hakkında konuşmakta dinlemekte zor birşey.

    Bir de şahit olduğum bir olayı anlatacağım size. Sanırım bizim sınıfları gezip insanlarla konuşmamızı biraz kıskanmış olan biri -sanırım bir eğitmendi- hızlıca bi yere gidiyordu. Necdet hocanın yanından geçerken hocam en rahatı senin işin vallaha dedi ve gitti :) Aslında biraz da o kısmı vurgulamak istiyorum bu yazımda. Kötü niyetle demedi biliyorum ama keşke hiç demeseydi. O bir haftanın güzel geçmesi için çok öncesinden nasıl bir çalışma yapıldığını anlatacağım. Gördüğüm kadarını tabi. Her gün saatlerce telefon görüşmesi yapılıyor. Fiziksel sorunlar çıkıyor (elektrik tesisatının o kadar bilgisayar için uygun olmadığı gibi...) Bunlar çözülmeye çalışılıyor. Hakemler yapılacak olan bildiri seminer kurs ve panellerin gözden geçirme işini yapıyor. Hakem başına çok sayıda kontrol etmesi gereken başvuru düşebiliyor. Bunların düzeltilmesi gereken yerler başvuru yapanlara geri bildiriliyor. Düzeltmeler yapılınca tekrar gözden geçiriliyor. Bir karara varılana kadar bu böyle süregeliyor.  Kurslar belli olduktan sonra kurs başvuruları başlıyor. Başvurular bittikten sonra başvuranlar içinden kimlerin seçileceği konusu başlıyor. Her eğitmen kendi kursu için buna karar veriyor ama mail listesi sorun yaşayanların sorunlarıyla doluyor taşıyor. Mail listesine ya da organizatörlere yaşadıkları ve kendi çözebilcekleri şeyler için bile mail atanlar oluyor. Bunları takip etmek ve yapılan yanlışlara sabır gösterip kalp kırmadan bu işleri çözmek işte o etkinlilk günü en rahatı da sizsiniz dediğiniz adamların çok uzun süre yaptığı iş. Ve daha anlatmayı atladığım bir dünya şey var.

     Sonunda kurslar bitti katılımcılara katılım belgeleri dağıtıldı. Akgül hoca aramıza katıldı :)

    Ertesi gün benim içinde bulunduğum iki konuşma vardı. Biri panel biri bildiriydi. Bu ilk konuşmam olmamasına rağmen hep ilk günkü heyecanı yaşıyorum böyle zamanlarda :) Bi takım mide kelebeklenmeleri falan :)

    Akgül hoca açılış konuşmasını yaptı ve seminerler başladı. Daha öce 16 kez bu konuşmayı yapmış olan Akgül hocanın bile yeniden hazırlanmak için 4 saatini harcadığını gördükten sonra ne kadar hazırlansa yetersiz geliyor insana :) Ben 1 saat öncesinden panelin olacağı salondaydım. Sunumu projektörü kontrol ettim herşey yolundaydı. Kızlar geldi hazırlıklarımızı tamamladık. Ve dünden bugüne kadın yazılımcı ve toplumdaki yeri isimli panelimiz başladı.
                             

    Bir buçuk saat çok gelecek diye düşünürken yetmedi bile. Ama anlatmak istediğimizi dinleyicilere aktardığımızı düşünüyorum. Olumlu geri dönüşler aldık :)

    Arkasından yaz stajımda yaptığım süpervisor için merkezi yönetim arayüzü CESI yi sundum :)



    Benden sonra Necdet hocam yazılımları nasıl lisanslamalıyız adlı sunumunu yaptı. Bir yazılımı lisanslarken vermemiz gereken 4 ana karar olduğunu ve lisansın buna göre biçimleneceğini anlattı. Ve bu dört yol ayrımından mantıklı bi şekilde döndüğümüzde kendimizi özgür yazılım lisansları arasında bulduk. :) Bu sunumun insanların aklında çok ışık yaktığını düşünüyorum. Doğru bilinen yanlışlar,  masum görünen ahlaksızlıklar insanların gözleri önüne daha apaçık nasıl dökülebilir bilmiyorum.

    Etkinlik günlerinin her anından kendime ayrı bir ders çıkardım. Bana çok katkısı olan bu büyük etkinliği düzenlemede emeği geçen herkese tek tek  saygılarımı sunarım.

    Bu anlattıklarım etkinlik saatleriydi tabi... Bunların dışında Eskişehir de çok güzel zaman geçirdik. Tandığım o kadar çok insan vardı ki kendimi hiç yabancı hissetmedim Eskişehire. Her akşam başka güzel geçti. Bir gün dışarı çıktığımızda cadde üzerinde ilerlerken tanıdıklara rastlaya rastlaya 25 kişiye yakın bi topluluk olarak porsuk çayının yanında yürüdük :) Harika bir duygu...


    Bir takım güzel sebeplerden son iki güne kalamadım ama aklım Eskişehirdeydi :) Bir hafta en fazla bu kadar güzel geçebilirdi herhalde :) Önümüzdeki yıl aynı konulu blog yazısını yazmak için sabırsızlanıyorum. :)


10 Şubat 2015

Posted In: ab2015, akademikbilişim, eskişehir, Gezegen, kadınyazılımcı, Özgür yazılım, ozguryazilim

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

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

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

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.





4 Ocak 2015

Posted In: Gezegen, i18n, internationalization, l10n, linux, Localization, ozguryazilim, python

cesi (Centralized Supervisor Interface)


    Bir önceki yazımda Supervisordan bahsetmiştim. Supervisor arayüzden de komut satırından da kullanılabilen bir API si olan Unix benzeri işletim sistemleri üzerinde çalışan bir süreç yönetim sistemidir. Bazı eksikleri şöyleydi:

  -- Supervisorun varolan arayüzü sadece kurulu olduğu makine üzerindeki süreçleri yönetebiliyordu. Ama API uzaktaki makinelerle iletişim kurmaya izin veriyordu.
  -- Arayüzde herhangi bir yetkilendirme seviyesi yoktu. Arayüzü görebilen herkes süreçlerle ilgili istediğini yapabiliyordu.
  -- Herhangi bir şekilde süreçler filtrelenerek yönetilemiyordu. Ya tek tek ya da hepsiyle birden iş yapılabiliyordu.

    Bu yaz stajımı Gamegos'ta Kaan'ın mentörlüğünde yaptım. Yaptığımız iş Supervisor'a yukarıda bahsettiğim eksiklikleri gideren yeni bir arayüz yazmaktı. Yeni arayüzü Python Flask ve Jquery kullanarak yazdık. Şimdilik paketlemedim. Nasıl kurulacağını projenin README kısmında açıkladım. Bu blogta arayüzün yeteneklerini ve kullanımını anlatacağım.
  Projeyi buradan bulabilirsiniz.

  DASHBOARD
--------------------------

    Program çalıştığında karşımıza gelen ilk sayfadır. Toplamda kaç node olduğunu kaçının bağlı kaçının sorunlu olduğunu, toplam kaç süreç olduğunu kaçının çalışıp kaçının durmuş olduğunu ve kullanıcının arayüzde yaptığı işlemlerin logunun son 12 satırını görüntüleyen paneller var.













    NODE
----------------
   
    Node özelliği bu arayüzün merkezi olmasını sağlayan özelliktir. Yani her bir node bizim iletişim kurduğumuz farklı bir supervisora denk geliyor. Kaç tane süpervisor ile iletişim kuracaksak hepsinin host port kullanıcı adı parola bilgilerini /etc/cesi.conf içine şu şekilde yazmalıyız (node isimleri eşsiz olmalıdır) :

  [node:gulsah]
 username = gulsah
 password = ***
 host = gulsah.xyz.com
 port = 9001
    
     Node seçeneğine tıkladığımızda açılan liste yapılandırma  dosyasındaki nodeların listesidir. Node eğer bağlıysa node  isminin  başında bir checkbox olacaktır. Bağlantıda bir  problem  olmuşsa node isminin başında bir çarpı olacaktır.  Buradan istediğimiz nodeları seçerek süreçlerini  yönetebiliriz.


   ENVİRONMENT
----------------------------

    Nodelardan oluşan topluluklardır. Bir filtreleme seçeneğidir. Environment'ı x node ismi y olan süreçler hakkında şunları yap dememize imkan tanır. İstediğimiz kadar environment tanımlayabiliriz. Environment isimleri eşsiz olmalıdır. /etc/cesi.conf  dosyasında şöyle tanımlanır:

  [environment:market]
  members = gulsah, kaan

  Arayüzde environment seçeneğine tıkladığımızda o environmenta üye olan ve bağlantısında problem olmayan nodeların listesini görürüz. Bu nodelardan hangisini seçersek onların süreçlerini yönetebiliriz.











  GROUP
---------------


   Grup zaten Supervisor'un sağladığı bir özellikti. Bu yüzden /etc/cesi.conf içine bununla ilgili birşey yazmaya gerek yok. Supervisor'un yapılandırma dosyasında tanımlanır. Süreçler bir gruba eklenebilir. Eğer sürecin grubu yoksa varsayılan olarak grup adı sürecin adı olur. Bu da arayüzde bir filtreleme seçeneğidir. Grubu x environmeti y olan süreçler için şunları yap deme imkanı sağlar.

    Arayüzde grup seçeneğine tıkladımızda içinde o grubu bulunduran  environmetların listesini görürüz. Buradan hangi environmentleri seçersek grubu seçtiğimiz grup, environmenti seçtiğimiz environment olan süreçleri görüntüleyip yönetebiliriz.

  *Aynı süreç birden fazla gruba ait olmamalıdır.










  SHOW ALL
---------------------

Show all seçeneği ne kadar node ve onların ne kadar süreci varsa hepsini birden görüntülemeyi ve yönetmeyi sağlar.




















    Ayrıca herhangi bir şekilde görüntülediğimiz tabloların üzerinde alt seçimler de yapabiliriz. O anda görüntülediğimiz süreçlerden hangisinin başındaki checkbox işaretliyse tabloların üstündeki turuncu butonları kullanarak sadece o süreçleri durdurup başlatabiliriz.


    Program çalıştırılmadan önce yapılandırma dosyasında veritabanı ve kullanıcı loglarının tutulduğu dosyaların yolunu /etc/cesi.conf dosyasında şu şekilde belirtmeliyiz:

    [cesi]
    database = /x/y/userinfo.db
    activity_log = /x/y/cesi_activity.log


   KULLANICI SEVİYELERİ
--------------------------------------------

   Admin:
   -- Kullanıcı ekleme silme işi sadece admin tipindeki kullanıcılar tarafından yapılır.
   -- Tüm süreçlerle ilgili herşeyi yapabilirler.

  Standart User:
   -- Tüm süreçler hakkında herşeyi yapabilir.

  Only Log
  -- Süreçlerin hepsini görüntüleyebilir
  -- Süreçlerin sadece loglarını okuyabilir.

  Read Only
  -- Sadece süreçleri görüntüleyebilir. Herhangi bir şeye müdahale edemez.




    Program ilk kurulduğunda varsayılan kullanıcı admindir. Kullanıcı adı ve parolası "admin" dir. Change password seçeneğini kullanarak admin ilk olarak parolasını değiştirmelidir. Gerek varsa istediği yetkilerde yeni kullanıcılar ekleyebilir. Eklediği yeni kullanıcılarda oturum açtıklarında aynı şekilde parolalarını değiştirebilirler.


Kullanıcı ekleme paneli:      
















Kullanıcı silme paneli:



Desteği için Kaan Özdinçer'e teşekkürler. 







29 Ağustos 2014

Posted In: Açık kaynak, bootstrap, centralized, cesi, flask, Gezegen, Özgür yazılım, ozguryazilim, process control, python, supervisor, supervisord

Supervisor

  Supervisor kurulu olduğu bilgisayarın üzerindeki süreçleri kontrol edebilen Unix benzeri işletim sistemleri üzerinde çalışabilen bir sistemdir. Aslında süreçlerin kontrolünü rc.d dizini altına betikler yazarak da yapmak mümkün ama supervisor bu işi bi standarta göre yaptığından bakım yapmak da yazmak da yönetmek de daha kolay olacaktır. Ayrıca süpervisor ile zombi süreç oluşumunu engelleyebiliyoruz. Süreçleri gruplayarak toplu işler yaptırabiliyoruz. Tek seferde birden çok sürece parametre gönderebiliyoruz. Duran süreçleri otomatik başlatabiliyoruz. Hepsinden sırayla bahsedeceğim.

  Arayüzünün görünümü ise şöyle:


















   Komut satırını kullanarakta bilgi almak mümkün. Komut satırına supervisorctl yazarak etkileşimli bir kabuk açıldığını göreceğiz. "help" yazdığımızda yapabileceklerimizi rahatlıkla görebiliriz.

   Kurulumu:
  "easy-install supervisor", "pip install supervisor" kullanmak ya da direk kaynak kodundan kurmakta mümkün ama depodan kurabiliyor olmak kullanım alanını genişletecektir. Bu yüzden bunu tercih ediyoruz.

$ sudo apt-get install supervisor

  Şuan varsayılan olarak /etc/supervisor/supervisord.conf yolunda şablon olarak bir yapılandırma dosyası oluşmuş olmalı. İşler karmaşıklaştığında yönetimin daha kolay olması için buradaki bazı bölümleri yavaş yavaş /etc/supervisor/conf.d/ dizini altına taşıyacağız. İlk olarak http yaplandırması kısmını şöyle yazıyoruz:

  # vim /etc/supervisor/conf.d/http.conf

Açılan dosyaya şu yapılandırma bilgierini ekeyelim:

  [inet_http_server]         ; inet (TCP) server disabled by default
  port=*:9001        ; (ip_address:port specifier, *:port for all iface)
  username=user              ; (default is no username (open server))
  password=123               ; (default is no password (open server))

2. satırda * yerine özel bir ip adresi ya da localhost yazabiliriz. * yazmamız supervisor'a tüm arayüzlerden ulaşabilmemizi sağlar. Bu dosyayı kaydedip çıkalım.

  İçinde şuan kayıtlı hiçbir süreç olmadığından çalıştığında bir süreç göremeyeceğiz. Çalıştırmak için şu komutu verelim:

  # service supervisor start

  Şimdi adres çubuğuna localhost:9001 yazdığımızda yukarıdaki resmin süreçler olmadan ki halini görüyor olmamız lazım

  Şimdi hiçbirşey yapmayan örnek bir kod yazalım supervisor'a ekleyelim ve durumunu inceleyelim:

  # vim /usr/local/bin/long.sh

  Açılan dosyaya şu kodu yazalım:

  #!/bin/bash
  while true
  do
      # Echo current date to stdout
      echo `date`
      # Echo 'error!' to stderr
      echo 'error!' >&2
      sleep 1
  done

  Kaydedip çıkalım ve şimid bu dosyaya çalıştırılabilme izni verelim:

  # chmod +x /usr/local/bin/long.sh

   Şimdi yazdığımız bu küçük programı supervisor 'un yapılandırmasın ekleyelim.

  # vim /etc/supervisor/conf.d/long_script.conf 

  Açılan dosyaya şunalrı yazalım:

   [program:long_script]                       ; programa verecğimiz isim
   command=/usr/local/bin/long.sh       ; eklemek istediğimiz kodun yolu
   autostart=true                                    ; supervisor çalıştığında otomatik başlatılıp başlatılmayacağı
   autorestart=true                                 ; otomatik yeniden başlatılıp başlatılmayacağı
   stderr_logfile=/var/log/long.err.log   ; standart hata çıktısının yazılacağı dosyanın yolu
   stdout_logfile=/var/log/long.out.log  ; standart çıktısının yazılacağı dosyanın yolu

 Bu dosyayı kaydedip çıkalım. Bu yaptığımız değişiklikleri okuyabilmesi için supervisor'u yeniden başlatalım:

  # service supervisor restart

  Şimdi adres çubuğuna yeniden localhost:9001 yazdığımızda bir tane satır görüyor olmamız gerekiyor.

  Programla ilgili şu bilgileri göreceğiz:
  Durumu:
      --running
      --starting
      --backoff
      --stopping
      --stopped
      --exited
      --fatal

  Süreç numarası:

      --pid 1800

  Sürecin çalıştığı süre:

     --uptime 3:24:07

  Adı:

    --long_script

  Ve bu süreç üzerinde yapabileceğimiz olaylar:   Yeniden başlat, başlat, durdur, logları temizle, logları görüntüle gibi

   Bir sonraki yazımda XML-RPC API sinin kullanımından API yi kullanarak süreçlere nasıl müdahale edebildiğimizden  bahsedeceğim.

4 Temmuz 2014

Posted In: Açık kaynak, Gezegen, linux, Özgür yazılım, ozguryazilim, process control, supervisor, supervisord

Twitter Auto Publish Powered By : XYZScripts.com