Python Gitlab Email Sender

Gitlab kullanıyor iseniz, gitlab sunucunuzdaki post-receive hook scriptinin içerisine, aşağıdaki python scriptini her push işleminden sonra çalıştıracak şekilde ayarlamanız durumunda, script her çalıştığında oluşturduğu commits.db sqlite database’indeki short commit’i ile karşılaştırıp, değişikli var ise aşağıdaki mail gönderim formatında maili ‘*protected email*’ adresine gönderir. Eğer db’de bulunmayan bir repo ile karşılaşması durumunda db’ye repo’yu insert eder.

#!/usr/bin/env python
__author__ = "Gokhan MANKARA <*protected email*"

import gitlab
import sqlite3 as sql
import requests
import smtplib
import os
import email.utils
from email.mime.text import MIMEText

gitlab_url = "https://gitlab.domain.com"
gitlab_access_token = "ABCDEFG"


class SendEmail(object):
    def __init__(self):
        self.mail_to = '*protected email*'
        self.mail_from = '*protected email*'
        self.mail_server = 'mail.domain.com'
        self.mail_subject = 'New Commit'

    def main(self, msg):
        msg = MIMEText(msg)
        msg['To'] = email.utils.formataddr(('Recipient', self.mail_to))
        msg['From'] = email.utils.formataddr((self.mail_subject, self.mail_from))
        msg['Subject'] = self.mail_subject

        server = smtplib.SMTP(self.mail_server, 25)
        server.set_debuglevel(False)

        try:
            server.sendmail(self.mail_from, self.mail_to, msg.as_string())
        finally:
            server.quit()


class Commit(object):
    def __init__(self):
        self.db = "commits.db"
        self.con = sql.connect(self.db)
        self.git = gitlab.Gitlab(gitlab_url, token=gitlab_access_token, verify_ssl=False)
        with self.con:
            self.cur = self.con.cursor()
        requests.packages.urllib3.disable_warnings()

        if not os.path.isfile(self.db):
            os.system("sqlite3 commits.db < commits.sql")

    def sql_insert(self, repo, branch, hash):
        sql = "insert into last_commit ('repo', 'branch', 'hash') values ('%s', '%s', '%s')" % (repo, branch, hash)
        self.cur.execute(sql)
        self.con.commit()

    def sql_select(self, branch, repo):
        sql = "select hash from `last_commit` where branch='%s' and repo='%s'" % (branch, repo)
        self.cur.execute(sql)
        return self.cur.fetchone()[0]

    def sql_update(self, new_hash, branch, repo):
        sql = "UPDATE last_commit SET hash='%s' WHERE branch='%s' and repo='%s'" % (new_hash, branch, repo)
        self.cur.execute(sql)
        self.con.commit()

    def commits(self):
        # git.getprojectsall => Returns a dictionary of all the projects for admins only
        # git.getprojects => Returns a dictionary of all the projects

        for i in self.git.getprojectsall():
            group_name = i["namespace"]["name"]
            project_name = i["path"]
            project_id = i["id"]
            for branches in self.git.getbranches(project_id):
                    new_commit = branches["commit"]["id"][:8]
                    branch_name = branches["name"]

                    try:
                        commit_in_sql = self.sql_select(branch_name, project_name)
                    except TypeError:
                        self.sql_insert(project_name, branch_name, new_commit)

                    if commit_in_sql != new_commit:
                        get_commit_info = self.git.getrepositorycommit(project_id, new_commit)
                        try:
                            author_name = get_commit_info["author_name"]
                            author_email = get_commit_info["author_email"]
                            author_message = get_commit_info["title"]
                            commit_date = get_commit_info["created_at"]
                        except TypeError:
                            pass

                        compare_url = "%s/%s/%s/compare/%s...%s" %\
                                      (gitlab_url, group_name, project_name, check_commit, new_commit)
                        send_email = SendEmail()
                        msg = 'Commit Repo: %s\nBranch Name: %s\nUser: %s\nUser Mail: %s\nCommit Message: %sCommit Time: %s\n\nDiff URL: %s' %\
                              (project_name, branch_name, author_name, author_email, author_message, commit_date, compare_url)
                        send_email.main(msg)
                        self.sql_update(new_commit, branch_name, project_name)

    def main(self):
        self.commits()


if __name__ == "__main__":
    Commit().main()

Python scripti ile aynı yerde oluşturmanız gereken commits.sql dosyası dosyası.

CREATE TABLE last_commit(id INTEGER PRIMARY KEY AUTOINCREMENT, repo TEXT, branch TEXT, hash TEXT);

Gönderilen mailin örnek içeriği,

Commit Repo: githlab-email-repo
Branch Name: master
User: gokhan
User Mail: *protected email*
Commit Message: First Test Email Commit
Commit Time: 2015-05-30T13:58:42.000+03:00

Diff URL: https://gitlab.domain.com/gokhan/gitlab-email-repo/compare/s1ws93...1ex4ng59

Gitlab server’da post-receive hook scriptine, başına “/usr/bin/python” koyarak scripti kullanabilirsiniz. Başına python path’ini koymamızın sebebi, gitlab’ın kendi python binary si olduğundan import ettiğimiz modüller gitlab’ın kendi lib’inde olmadığı için remote gitlab server’a push ettiğinizde “modül bulunamadı” şeklinde hata verecektir.

GitHub Repo

31 Mayıs 2015

Posted In: gitlab, gitlab hook, gitlab send email, lkd-gezegen, python, python gitlab hook

Sudo Komutlarının Loglanması

Daha önceki yazımda kullanıcıya nasıl sudo yetkisi verilebileceğinden bahsetmiştim. Bu yazıda da sudo yetkisi verdiğiniz kullanıcının uyguladığı komutları nasıl loglayacağımıza bakacağız. Önceki yazıda sudoers dosyasına kullanıcıyı eklemiştik, bu yazıda sudoers.d altına kullanıcıları oluşturacağız.

# vi /etc/sudoers.d/gokhan

gokhan   ALL=(ALL)   NOPASSWD: LOG_INPUT: LOG_OUTPUT: ALL
Defaults iolog_dir=/var/log/sudo-io/%{user}

gokhan kullanıcısına şifresiz olarak sudo komutu çalıştırma yetkisi vermiş olduk. iolog_dir dizinini oluşturmamıza gerek yok, default olarak dizin oluşacaktır.

sudo-io dizinine baktığınızda birden fazla dosya oluştuğunu görürsünüz.

.
└── gokhan
    ├── 00
    │   └── 00
    │       ├── 01
    │       │   ├── log
    │       │   ├── stderr
    │       │   ├── stdin
    │       │   ├── stdout
    │       │   ├── timing
    │       │   ├── ttyin
    │       │   └── ttyout
    │       ├── 02
    │       │   ├── log
    │       │   ├── stderr
    │       │   ├── stdin
    │       │   ├── stdout
    │       │   ├── timing
    │       │   ├── ttyin
    │       │   └── ttyout
    │       ├── 03
    │       │   ├── log
    │       │   ├── stderr
    │       │   ├── stdin
    │       │   ├── stdout
    │       │   ├── timing
    │       │   ├── ttyin
    │       │   └── ttyout
    │       ├── 04
    │       │   ├── log
    │       │   ├── stderr
    │       │   ├── stdin
    │       │   ├── stdout
    │       │   ├── timing
    │       │   ├── ttyin
    │       │   └── ttyout
    │       ├── 05
    │       │   ├── log
    │       │   ├── stderr
    │       │   ├── stdin
    │       │   ├── stdout
    │       │   ├── timing
    │       │   ├── ttyin
    │       │   └── ttyout
    │       ├── 06
    │       │   ├── log
    │       │   ├── stderr
    │       │   ├── stdin
    │       │   ├── stdout
    │       │   ├── timing
    │       │   ├── ttyin
    │       │   └── ttyout
    │       └── 07
    │           ├── log
    │           ├── stderr
    │           ├── stdin
    │           ├── stdout
    │           ├── timing
    │           ├── ttyin
    │           └── ttyout
    └── seq

Bu dosya çokluğunun içinde kaybolmak yerine aşağıdaki komut ile sudo izni verdiğiniz kullanıcının neler yaptığını görebilirsiniz.

# find /var/log/sudo-io/ -name log -exec cat {} \; | grep "::" -A 2 | awk -F: '$1 ~ /^[0-9]+$/{printf  "%s%s",(NR>1)?"\n":"",$1;next} {printf ";" $0} END{printf "\n"}'

1427012536;/var/log;/usr/bin/yum install
1427014071;/var/log;/bin/cat /etc/passwd
1427011890;/home/gokhan;/usr/bin/yum update
1427014063;/var/log;/bin/cat /etc/shadow
1427010846;/home/gokhan;/bin/ls /var/log/sudo-io/
1427010852;/home/gokhan;/bin/ls /var/log/sudo-io/gokhan
1427010823;/home/gokhan;/usr/bin/yum update
1427010863;/home/gokhan;/bin/cat /var/log/sudo-io/gokhan
1427011064;/home/gokhan;/usr/bin/yum update

 

22 Mart 2015

Posted In: Küçük Notlar, lkd-gezegen, sudo, sudo komutlarının loglanması, sudo log, sudoers

Zfsonlinux Kurulumu ve Yapılandırması

Zfs, yüksek ölçeklenebilirliğe uyumlu, aşağıdaki kriterleri dikkate alarak dizayn edilmiş dosya sistemi ve mantıksal hacim yöneticidir.

  • Veri bütünlüğü
  • Basit depolama yönetimi
  • Her şeyi online olarak yapabilmesi

Bsd sistemlerde default olarak gelen zfs dosya sistemini, zfsonlinux kurarak linux sistemlerde de kullanma imkanı bulabiliyoruz.

Zfsonlinux Kurulumu

Redhat tabanlı işletim sistemi için zfsonlinux download sayfasından 6 ve 7 dağıtımları için gerekli rpm repolarını indirebilirsiniz. Bu yazıda Centos 6 için kurulum yapılacaktır.

# rpm -ivh https://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -ivh http://archive.zfsonlinux.org/epel/zfs-release.el6.noarch.rpm
# yum install kernel-devel zfs

# reboot

Sunucuyu yeniden başlattıktan sonra aşağıdaki şekilde hata almanızın sebebi  kernel, kernel-headers ve kernel-devel versiyonlarının uyuşmamasından kaynaklanıyor olabilir. Kernel’i güncellemeniz problemi çözecektir.

# zfs list
Failed to load ZFS module stack.
Load the module manually by running 'insmod <location>/zfs.ko' as root.

[root@localhost ~]# rpm -qa |grep kernel
kernel-firmware-2.6.32-504.el6.noarch
dracut-kernel-004-356.el6.noarch
kernel-2.6.32-504.el6.x86_64
kernel-devel-2.6.32-504.8.1.el6.x86_64
kernel-headers-2.6.32-504.8.1.el6.x86_64

Zfs Pool Oluşturulması

Zfs kurulumu yapılan sunucuda 2 disk mevcut, 2. disk zfs olarak yapılandırılıp, tank0 olarak zfs pool oluşturacağız. 2.diski sisteme mount etmediğimden dolayı “df ” çıktısında görünmüyor. Eğer önceden ext4 olarak formatlayıp mount ettiğiniz bir diski kullancak iseniz ilk önce umount edip, “/etc/fstab” dosyasından diskin mount edildiği satırın başına “#” koymanız yada satırı silmeniz gerekiyor. Bu sayede zfs diski legacy olarak fstab üzerinden sisteme sorunsuz mount edebiliriz.

# zpool create tank0 /dev/sdb 
# zfs list 
NAME    USED  AVAIL  REFER  MOUNTPOINT
tank0   108K  19.6G    30K  /tank0

tank0 poolunun yanında aynı disk üzerinde birden fazla poollar da oluşturabilirsiniz.

# zfs create -o mountpoint=/home/zfs1 tank0/zfs1

# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
tank0        156K  19.6G    30K  /tank0
tank0/zfs1    30K  19.6G    30K  /home/zfs1

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       11G  961M  8.6G  10% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             477M   49M  403M  11% /boot
tank0                  20G  128K   20G   1% /tank0
tank0/zfs1             20G  128K   20G   1% /home/zfs1

Poolları legacy olarak oluşturmadığımız için sunucuyu resetlemeniz durumunda zfs poolları sunucunun açılışında oluşturulamayacak ve ” df ” çıktısında görünmeyecektir.

# zfs list
NAME         USED  AVAIL  REFER  MOUNTPOINT
tank0        158K  19.6G    30K  /tank0
tank0/zfs1    30K  19.6G    30K  /home/zfs1

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       11G  961M  8.6G  10% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             477M   49M  403M  11% /boot

Bu sebeble aşağıdaki şekilde zfs poollarını mointpoint olarak legacy ayarlayıp, sunucunun açılışı sırasında fstab ayarlarına göre mount olmasını sağlıyoruz.

# zfs set mountpoint=legacy tank0

# zfs get mountpoint tank0
NAME   PROPERTY    VALUE       SOURCE
tank0  mountpoint  legacy      local

# zfs set mountpoint=legacy tank0/zfs1

# zfs get mountpoint tank0/zfs1
NAME        PROPERTY    VALUE       SOURCE
tank0/zfs1  mountpoint  legacy      local

fstab dosyasına aşağıdaki satırları ekliyoruz.

tank0                   /tank0                  zfs     defaults        0 0
tank0/zfs1              /home/zfs1              zfs     defaults        0 0

Artık poolları mount edebiliriz.

# mount -a

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup-lv_root
                       11G  961M  8.6G  10% /
tmpfs                 499M     0  499M   0% /dev/shm
/dev/sda1             477M   49M  403M  11% /boot
tank0/zfs1             20G     0   20G   0% /home/zfs1
tank0                  20G     0   20G   0% /tank0

Zfs komutunun ayrıntılarını linkte bulabilirsiniz.

Performans Ayarları

Sunucularda performans amacı ile kullandığım birkaç zfs ayarlarından bahsedecek olursak,

  • Çok fazla i/o yapan bir sunucuda zfs compression özelliğini aktif ederek i/o sorununu azaltabilirsiniz.

# zfs get compression
NAME        PROPERTY     VALUE     SOURCE
tank0       compression  off       default
tank0/zfs1  compression  off       default

# zfs set compression=on tank0
# zfs set compression=on tank0/zfs1

# zfs get compression
NAME        PROPERTY     VALUE     SOURCE
tank0       compression  on        local
tank0/zfs1  compression  on        local

  • recordsize değerini değiştirebilirsiniz.

# zfs set recordsize=128K tank0
# zfs set recordsize=128K tank0/zfs1
 
# zfs get recordsize
NAME        PROPERTY    VALUE    SOURCE
tank0       recordsize  128K     default
tank0/zfs1  recordsize  128K     default

 

10 Şubat 2015

Posted In: *nix, lkd-gezegen, zfs, zfs kurulumu, zfs pool, zfs yapılandırması, zfsonlinux, zpool

Vimdiff Kullanımı

İki yada daha fazla txt dosyalarının, vim editörün diff mode özelliğini kullanarak diff farkını görmek için kullanılır. Vim text editörünün diff modda çalıştırılması ( vim -d ) ile vimdiff komutunu vererek çalıştırmak arasında bir fark yoktur. Aşağıdaki resimdeki gibi dosyalar açıldığında koyu kırmızı satırlar, iki dosya arasındaki diff farkını gösterir. ” –#########– “şeklinde dosyaların başında ve sonunda görünmesinin sebebi, o satırların iki dosyada da aynı olmasıdır. Vimdiff, fark bulunmayan satırları göstermez.

Kullanımı

# vimdiff file1 file2 [file3 [file4]]
# vim -d file1 file2 [file3 [file4]

httpd.conf ( resimde solda ) ve apachenin kaldırılması sonucunda oluşan httpd.conf.rpmsave dosyalarının aralarında diff farkına bakalım,

# vimdiff httpd.conf httpd.conf.rpmsave

Editör içerisinde iken iki dosya arasında gezinmek için aşağıdaki kısayollardan biri kullanılabilir;

  • Ctrl+W + Ctrl+W
  • Ctrl+W + W

İki dosya arasındaki farkları uygulamak için aşağıdaki editör komutları yada kısayolları kullanılır,

  • :[range]diffput ( yada dp kısayolu ), imlecin bulunduğu satırındaki değişikliği karşı dosyaya uygulayarak, karşı dosyanın aynı satırını değiştirir. ( put )
  • :[range]diffget ( yada do kısayolu ), imlecin bulunduğu satırı, karşıdaki dosyanın aynı satırına göre, imclecin bulunduğu satırı değiştirir. ( get )

diffput yada diffget komutların başlarında range kullanılmaması durumunda, farklı satırların alt alta olması durumunda vim grup olarak  değişiklik uygular. Sadece satırda değişiklik yapmak için diffget ve diffput aşağıdaki şekilde kullanılır.

  • :39,diffget  ; 39. satırı karşı dosyadaki aynı satıra göre imlecin bulunduğu satırı değiştirir.
  • :299,diffput ; Karşı dosyadaki 299. satırı değiştir.
  • :200,$diffget ; 200. satırdan sonra son satıra kadar değişiklikleri uygular.

Vim diff mode özelliğini daha ayrıntılı incelemek için man sayfasına bakabilirsiniz.

 

5 Eylül 2014

Posted In: diff, diff kullanımı, iki dosya arasındaki fark, iki dosya arasındaki farkı görmek, Küçük Notlar, lkd-gezegen, vim, vim diff mode, vimdiff

LaborComm 2014’te Düzenlediğimiz Paneldeki Sunuşum

Uluslararası İşçi ve İletişim Konferansı (LaborComm) [1], 2010 yılından bu yana Ankara Üniversitesi İletişim Fakültesi’nin [2] yürütücülüğünde düzenlenen ve bence oldukça önemli tartışmaların yürütüldüğü, dolu dolu geçen bir konferans. Bu yıl 5. kez düzenlendi. İlk kez geçen yıl dinleyici olarak katılabilmiştim LaborComm’a ve birçok oturumda epey bilgi edinmiş, tartışmalardan faydalanmıştım.

LaborComm 2014’ün teması, geçtiğimiz birkaç yılda dünyada ve Türkiye’de ortaya çıkan direniş hareketlerinin etrafında şekilleniyordu. Çağrı metninden [3] alıntılayacak olursam:

“Geçtiğimiz birkaç yıl tüm dünyada ve Türkiye’de toplumsal hareketlerin yükseldiği ve bu çerçevede iletişim ve iletişim ağlarının önem kazandığı bir dönem oldu. Egemenler interneti artık sadece yeni birikim stratejilerinin ayrılmaz bir parçası olarak değil, aynı zamanda kendi egemenliklerine yönelen büyük bir tehdit olarak da görmeye başladılar. Bu çerçevede internet üzerindeki izleme faaliyetlerinin giderek tırmandığı açığa çıkarken, internetin sınırlandırılmasına yönelik düzenlemeler de giderek daha fazla gündeme geliyor. Ancak diğer yandan internet üzerindeki görece özgür alanların sınırları genişliyor ve buralardaki iletişim ve örgütlenme kent meydanlarında somutlaşıyor. LaborComm 2014, bu alanda yaşanan deneyimlerin bilgisini üretmeyi ve ileriye dönük olarak emeğin ve iletişimin özgürleşim olanaklarını değerlendirmeyi amaçlamaktadır. Bunun yanı sıra düzenlenme amacına uygun olarak iletişim ve emeğin kesiştiği tüm alanlara ilişkin çalışmaları beklemektedir.”

Tahmin edilebileceği gibi, Gezi Direnişi ile ilgili epeyce bildiri vardı, programdan da görülebilir. Biz de, hem Gezi Direnişi’ni, hem de özgür yazılımı, özgür İnternet’i ve özgür iletişimi önemseyen 4 bilişim emekçisi (İzlem Gözükeleş, Taylan Özgür Yıldırım, Oktay Dursun ve ben) olarak bu yıl konferansta bir panel düzenlemeyi önerdik. Konferans yürütücüleri fikre olumlu yaklaştılar ve böylelikle konferansın kapanış oturumunu kapmış olduk. Oturum başkanımızın da şu an iletişim alanında akademik çalışmalarını yürüten ama özünde bizler gibi bilgisayar mühendisi olan Doç. Dr. Funda Başaran Özdemir olmasıyla biraz daha rahatladık:)

Panelimizin başlığını “Direniş Kendi İletişim Kanallarını Oluştururken; Özgürlük, Yazılım, İnternet ve Emekçiler” olarak belirledik, her birimiz konunun farklı birer boyutunu ele almaya çalıştığımız birer sunuş yaptık. Sunuşların ardından salondan gelen soru ve katkılarla da tartışmayı genişlettik. Hem bizlerin izlenimi, hem de panel sonrası dinleyicilerden gelen geri bildirimlere dayanarak söyleyebilirim ki güzel bir panel oldu.

Konferansın bildiri kitapçığı şu anda hazırlanma aşamasında. Önümüzdeki birkaç hafta içinde yayımlanmış olacak sanırım, konferans web sitesinden e-kitap olarak da indirilebilecek. Bizim paneldeki sunuşlarımız konferansın diğer oturumlarındaki gibi akademik bildiri niteliğinde değildi, ama yine de panelde konuşulanların da bildiri kitapçığında yer almasının güzel olacağını söylediler bize. Ben de toparlayabildiğim kadarıyla yaptığım sunuşu genel hatlarıyla kısa bir metinde aktarmaya çalıştım. Aşağıda o metni bulabilirsiniz.

Panelde ilk sunuşu ben yapmıştım ve özgür yazılımı neden bu kadar önemsediğimizi kısıtlı zamanda hızlı biçimde anlatmaya çalışmıştım. Yaptığım sunuşun içeriğinin büyük bir kısmı, bir süredir farklı etkinliklerde yaptığım “Her Yer Linux Her Yer Özgür Yazılım” sunumumla[4] çakışmakla birlikte, o sunumda yer verip burada anlatmadığım ve burada olup onda olmayan bazı kısımlar da var.

Özgür Yazılımı Neden Bu Kadar Çok Önemsiyoruz?

Richard Stallman’ın bundan yaklaşık 30 yıl önce başlattığı özgür yazılım hareketi, artık başladığı noktanın çok ilerisinde. İnternet’in sağladığı yayılma olanağının da katkısıyla bugün dünyanın her yerinde çeşitli özgür yazılımları geliştiren, yaygınlaştıran, yerelleştiren, paylaşan ve kullanan insanlar, şirketler ve hatta devletler bulunuyor. İnternet’e bağlı herhangi bir cihazı kullanan bir kişi, kendi kullandığı yazılımlar özel mülk yazılım olsa bile bağlandığı web sitesi özgür yazılımlar aracılığıyla hazırlandığı ve sunulduğu için dolaylı yoldan da olsa özgür yazılımları kullanmış oluyor. Teknik yeterlilikleri ve üstünlükleriyle özgür yazılımlar bilişim alanında kolaylıkla vazgeçilemeyecek bir yer edinmiş durumdalar.

Öte yandan, özgür yazılımı bu kadar çok önemsememizin ve her fırsatta öne çıkarmamızın sebebi sadece sunduğu teknik olanaklardan kaynaklanmıyor. Tarihçesi, ortaya çıkış gerekçeleri ve gelişim süreci ele alındığında özgür yazılım meselesi, teknik bir tartışma olmanın çok ötesinde, politik bir mesele olarak karşımızda duruyor. Özgür yazılım hareketini başlatan ve günümüzdeki en önemli temsilcilerinden biri olan Richard Stallman, çeşitli söyleşilerinde bu durumu şöyle dile getiriyor:

“Özgür yazılım, sadece teknik bir mesele değildir. Aynı zamanda etik, sosyal ve politik bir meseledir. Sadece bilişim alanında çalışanları değil, toplumun her kesimini ilgilendirir. Düşünce özgürlüğü, ifade özgürlüğü, kişisel bilgilerin gizliliği gibi konularla doğrudan ilgilidir. ”

Richard Stallman’ın çizdiği bu çerçeve, aslında epey geniş bir alanı tarifliyor olsa da, politik bir mesele olarak özgür yazılımı bireysel ve toplumsal özgürlükler bağlamında tartışmanın tek başına yeterli olmadığını düşünüyoruz. Elbette özgür yazılımların yazılım alanında üretici ve tüketiciler olarak bizlere sağladığı özgürlükler çok büyük önem taşıyor, özellikle de çokuluslu yazılım ve donanım tekelleri ile devletlerin bu özgürlüklerimize saldırılarını yoğunlaştırdıkları bir dönemde olduğumuzu göz önünde bulundurduğumuzda var gücümüzle savunmamız gereken bir mevkide bulunuyorlar. Fakat özgür yazılımı politik bir mesele olarak tartışırken, çok daha temelde olan ve aslında bu özgürlüklerin de kaynağını oluşturan, özgür yazılımların hem üretim hem de tüketim süreçlerini de doğrudan etkileyen bir noktayı ele almak istiyoruz: Kamusal mülkiyet. Eğer özgür yazılımlarla özel mülk yazılımları birbirinden net bir şekilde ayırt edebiliyorsak bunu sağlayan şey teknik özellikler değil, üretilen yazılımın ve kaynak kodunun mülkiyetinin kime ait olduğudur. Özgür yazılım hareketi, hem üretilen bir ürün olarak yazılımın, hem de o yazılımın üretilmesini sağlayan üretim aracı olarak kaynak kodlarının mülkiyetini topluma vermesiyle bir devrim yapmıştır. Yazılımın ve kaynak kodunun mülkiyetinin toplumsallaştırılması; yazılım geliştirme pratiklerinden paylaşım yöntemlerine, yazılımların çoğaltılma (kopyalanma) özgürlüğünden istenilen amaç doğrultusunda özelleştirilebilme ve kullanılabilme özgürlüğüne kadar tüm üretim ve tüketim süreçlerinin piyasa ekonomisi koşullarından bambaşka koşullarda şekillendirilebilmesine olanak sağlamıştır. Böylelikle hem bireysel ve toplumsal özgürlüklerimiz korunabilmiş, hem de özgür yazılımlar özel mülk yazılımlar karşısında birçok teknik üstünlüğe sahip olabilmişler ve yaygınlıklarını artırabilmişlerdir.

Politik bir mesele olarak özgür yazılımı ele alırken dikkate aldığımız önemli noktalardan bir başkasını da özgür yazılım hareketinin ortaya çıkış süreci bize anlatıyor. Bu nokta, özgür yazılım hareketinin, yazılımın metalaşmasına karşı geliştirilmiş bir hareket olmasıdır. 1970’li yıllara kadar, Richard Stallman’ın da aralarında bulunduğu yazılım geliştiriciler (hacker’lar) geliştirdikleri tüm yazılımları birbirleriyle paylaşmakta, böylelikle hem birbirlerinden öğrenmekte hem de çözülmüş bir sorunu tekrar çözmekle uğraşmak (“tekerleği yeniden keşfetmek”) zorunda kalmamaktadırlar. Yazılımların ticari olarak alınıp satılması yaygın değildir, bilişim alanında sadece donanım bir masraf kalemi olmaktadır. Ancak 1970’li yıllardan itibaren bu durum değişmeye başlar, yazılımın da parayla alınıp satılabileceği fikri yaygınlaşır ve birçok yazılım firması kurulur. Bunun yanı sıra, bu firmalar ürettikleri yazılımların kaynak kodlarını “ticari sır” oldukları gerekçesiyle paylaşmamaktadırlar. Bütün bunlara duyulan tepki, özgür yazılım hareketinin başlatılmasında tetikleyici olmuştur.

Özgür yazılım hareketinin uygulamaya koyduğu önemli özelliklerden birisi, hem kamusal mülkiyetle hem de hareketin metalaşma karşıtı niteliğiyle bağlantılı olan, “üretimde özgürlük, tüketimde eşitlik” ilkesidir. Özgür yazılımların mülkiyeti topluma ait olduğu için toplumun her bireyi özgür yazılımlar üzerinde aynı haklara sahiptir ve onları dilediği şekilde kullanma (tüketme) özgürlüğü vardır. Dolayısıyla tüketimde eşitlik sağlanmıştır. Öte yandan, yazılımı kullanma karşılığında bireylerden herhangi bir karşılık beklenmez. Üretim sürecine katılıp katılmama konusunda her birey kendisi karar verebilir ve üretime katılmayan bireyler, tüketim haklarını kaybetmezler; üretime katılan bireylerle hâlâ eşit tüketim hakkına sahip olurlar. Üretime katılmak isteyen bireyler ise bu özgürlüklerini istedikleri zaman kullanabilirler çünkü üretim aracı olan kaynak kodlarının mülkiyeti topluma aittir, onlar da bu kaynak kodlarını kullanarak istedikleri şekilde yazılım geliştirebilirler.

Özgür yazılım üzerine bugüne kadar yapılan sosyal araştırmaların bir kısmı, üretime katılan yani özgür yazılımları geliştiren ve diğer yollarla (çeviri, test, hata bildirimi vs.) bunlara katkı sağlayan bireylerin neden bu sürece katıldıkları sorusuna odaklanmıştır. Piyasa ekonomisi şartlarının geçerli olmadığı bir ortamda, bireyleri çalışmaya ve üretime yönlendiren sebepler birçok kez sorgulanmıştır. Bu araştırmalar sonucunda ortaya konan birkaç sonuca kısaca değinelim. Bunlardan biri, özgür yazılım toplulukları arasında bir “hediye ekonomisi” oluşmasıdır. Bir başka sonuç, bazı bireylerin “kendilerini kanıtlama” güdüsüyle üretim sürecine katıldıklarıdır; özgür yazılımlar kamusal alanda (İnternet) geliştirildiği için bu bireyler burada bireysel teknik becerilerini sergilemekte ve piyasa ekonomisinin geçerli olduğu yazılım geliştirme süreçlerinde (özel mülk yazılım üreten şirketlerde) iş bulma şanslarını artırmaktadırlar. Bir grup yazılım geliştirici ise, öğrenme ve merak güdülerini tatmin etmek amacıyla üretim sürecinde yer almaktadırlar; zihinsel emeğin ortaya konduğu yazılım geliştirme pratiğinde sıklıkla çeşitli “bulmaca”larla karşılaşılmakta, bireyler bu bulmacaları çözmekten zevk almaktadırlar. Tüm bunların yanı sıra, bazı bireyler de toplumsal çıkarları gözeterek özgür yazılımların geliştirilmesine katkı sağlamaktadırlar. Elbette saydığımız bu gruplar birbirlerinden homojen olarak ayrışmamakta, üretime katılan bir birey bu gerekçelerden birkaç tanesini sahiplenebilmektedir.

Özgür yazılımların geliştirilmesi aşamalarında kullanılmakta olan ve zamanla çeşitli gelişmeler göstermiş olan üretim pratikleri, ağırlıklı olarak meselenin teknik yönü ile ilgiliymiş gibi görünse de, esasen özgür yazılımın politik yanıyla doğrudan ilişkilidir. Özgür yazılımların tamamına yakını İnternet üzerinde, kamuya açık platformlarda geliştirilmektedir. Sadece geliştirilen yazılım ve yazılımın kaynak kodları değil, aynı zamanda tartışma ve karar alma süreçleri de kamusal erişime açık olarak yürütülmektedir. Bir özgür yazılımın geliştirilmesine katkı veren, yani üretim sürecine katılan bireyler, e-posta listesi ya da forum benzeri iletişim ortamlarında yazılım geliştirme süreci ile ilgili fikir alışverişinde bulunurlar ve bu iletişim ortamlarının arşivleri kamusal erişime açık olarak İnternet ortamında saklanır. Böylelikle üretim sürecine katılmayan bireyler de yürütülen tartışmaları izleyebilir, zaman zaman da çeşitli şekillerde kendi görüşlerini ifade edebilirler. Tüm bu özellikleriyle özgür yazılım geliştirme sürecinin oldukça verimli işleyen bir kolektif üretim süreci olduğu söylenebilir.

Özgür yazılımın, burada kısa kısa ele almaya çalıştığımız bu özellikleri, bu hareketin 30 yılı aşkın süredir adım adım ilerleyen ve büyük başarılar kazanan bir hareket olmasını sağlamıştır. Etkileri sadece bilişim alanıyla sınırlı kalmamış, özgür yazılımın başarısından etkilenen başka birçok alanda benzeri özellikleri taşıyan örnekler ortaya çıkmıştır. En basit ve akla gelen ilk örneği, özgür yazılım geliştirme sürecine benzer bir üretim süreciyle kolektif bilgi birikiminin oluşturulduğu Wikipedia projesidir. Benzer şekilde sinema, müzik, edebiyat gibi alanlarda çeşitli yansımaları olmasının yanı sıra, bilişim sistemlerinde kullanılan çeşitli donanımların kolektif biçimde üretilmesini ve bu alandaki tekellerin ortadan kaldırılmasını amaçlayan hareketler de ortaya çıkmaya başlamıştır.

Altını çizmeye çalıştığımız şekilde, özgür yazılım meselesi bir “politik mesele” olmayıp sadece bir “teknik mesele” olsaydı, tahminimizce şimdiye kadar çoktan sonlanmış bir durumda olurdu ve hepimiz özel mülk yazılımlara muhtaç olurduk. Bilişim ve iletişim teknolojileri hayatımızın her alanına nüfuz ederken, birer bilişim ve iletişim tüketicisi ve üreticisi olarak bugün sahip olduğumuz bazı bireysel ve toplumsal özgürlüklerimizi de çoktan kaybetmiş, ya da tıpkı Gezi Direnişi’nde olduğu gibi bunları savunmaya çalışıyor olabilirdik. Panelimizin ana konusuyla özgür yazılımın birbiriyle ne kadar içli dışlı olduğunu anlamak için, özgür yazılımı anlatırken sıklıkla kullandığımız bazı anahtar sözcüklere bitirirken değinmekte fayda var: “Özgürlük”, “Paylaşmak”, “Dayanışma”, “Kamusallılk”, “Kolektif üretim”, “Eşit tüketim”. Gezi Direnişi’ne baktığımızda, aynı anahtar sözcüklerin orada da meselenin kalbinde olduğunu görebiliyoruz.

adilga

[1] http://laborcomm.org/

[2] http://ilef.ankara.edu.tr/

[3] http://laborcomm.org/cagri-metni-2014/

[4] İlgilenenler LKD Seminer Çalışma Grubu sitesindeki Seminer Notları sayfasında bulabilirler:

http://seminer.linux.org.tr/seminer-notlari/


14 Temmuz 2014

Posted In: etkinlik, gezi direnişi, laborcomm, lkd-gezegen, mülkiyet, Özgür yazılım, toplumsal mülkiyet

Ngxtop: Gerçek zamanlı nginx log monitörleme aracı

Ngxtop, nginx web serverın loglarını gerçek zamanlı okuyarak, tanımlanan değişkenlere göre sitenize gelen sorguları hızlı ve kolay şekilde terminal üzerinden yorumlamanızı sağlayan bir programdır.

Python ile yazıldığından, python paketlerinin kurulumunda kullanılan pip aracı ile yada easy_install ile  kolayca kurulumunu yapabilirsiniz.

Ngxtop Kurulumu

Sisteminizde pip kurulu değil ise, ilk önce epel reposunda bulunan python-pip paketini kurmanız gerekiyor.

# rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
# yum install python-pip

Python-pip paketinin kurulumundan sonra artık pip komutu ile ngxtop programını kurabiliriz.

# pip install ngxtop

Easy_install ile kuracak iseniz, centos’un base reposunda bulunan python-setuptools paketini kurmanız gerekiyor.

# yum install python-setuptools
# easy_install ngxtop

Ngxtop Kullanımı

ngxtop [options]
ngxtop [options] (print|top|avg|sum) <var> ...
ngxtop info
ngxtop [options] query <query> ...

Bazı kullanım şeçeneklerine bakacak olursa,

  • -l <file> : Nginx access log dosyasının tam yolu ( full path )
  • -f <format> : Access log formatı ( default: combined )
  • –no-follow : ngxtop normalde mevcut log kayıtlarını dikkate almadan anlık olarak log dosyasına yeni yazılacak olan kayıtları dikkate alır. Bu seçeneği kullanarak, ngxtop mevcut log kayıtlarada bakarak çıktıyı vermesini söleriz.
  • -t <seconds> : güncelleme sıklığı
  • -n <number> : Gösterilecek satır sayısı. ( default değer 10 dur )
  • -o <var> :  Sonuçları sıralama kriteri ( default olarak count şeklindedir. )
  • -a <exp> …, –a <exp> : Çıktığı ortalama, max, min gibi seçenekler ile filtrelemenizi sağlar. ( exp: sum, avg, min, max  )
  • – v : Ayrıntılı çıktı verir.
  • -i <filter-expression> : Sadece filter ile eşleşen kayıtları işler.

Ngxtop ile kullanabileceğimiz  buil-in değişkenleri,

  • body_bytes_send
  • http_referer
  • http_user_agent
  • remote_addr
  • remote_user
  • request
  • status
  • time_local

Eğer nginx’i yum ile kurdu iseniz default olarak conf dosyası etc nin altına kurulduğu için ( /etc/nginx/nginx.conf ) ngxtop komutu verdiğinizde direk bu conf dosyasını okuyarak access log dosyasının yerini bulacaktır.

#ngxtop

Nginx’i elle derleyerek kurduysanız ve etc altına kurmadıysanız,  ngxtop access log dosyasının yerini bulamadığı için ( -l ) parametresi ile log dosyasının yerini göstermeniz gerekecektir.

# ngxtop -l /usr/local/nginx/log/access.log

Built-in değişkenlerini kullanarak çıktı elde etmek için,

# ngxtop print request http_user_agent remote_addr

# ngxtop top remote_addr

# ngxtop -i 'status == 404' print request status

Ngxtop’un en becerikli diğer bir özelliği ise Apache loglarını da yorumlayabilmesi. Apache loglarını yorumlayabilmesi için ngxtop’u aşağıdaki şekilde kullanmanız gerekiyor.

 # tail -f /var/log/httpd/access.log | ngxtop -f common

 

13 Temmuz 2014

Posted In: gerçek zamanlı monitörleme, lkd-gezegen, nginx, nginx log monitorleme, nginx web server, ngxtop, real time, Scripts

Crontab Yardımıyla Göz Sağlığını Korumaya Çalışmak

Bilgisayar başında uzun saatler geçirenlerin çeşitli sağlık problemleriyle karşılaştıkları ortada. Sırt, bel rahatsızlıklarından tutun da göz sağlığının bozulmasına kadar pek çok olumsuz etkisi var bilgisayar başında geçirilen uzun saatlerin.

Bugüne kadar bunlarla ilgili pek çok yazı okudum, hemen hemen hepsi, belirli aralıklarla çeşitli egzersizler yapmayı öneriyor. Fakat okuduğunuz uzun bir makaleye yahut binlerce satırlık kodlara gömüldüğünüz zaman çoğunlukla bunlar aklınıza gelmiyor. Bu durum için de çeşitli çözümler üretilmiş tabii, birtakım uygulamalar, belirli aralıklarla size bu egzersizleri hatırlatabiliyor. Mesela RSIBreak[1] adlı uygulamayı kullanmıştım 3-4 yıl önce, belirli aralıklarla bazı egzersizleri hatırlatan küçük, güzel bir uygulama. Bazı dağıtımların paket depolarında bulunuyor, kurup deneyebilirsiniz.

RSIBreak uygulamasının bir süre sonra beni rahatsız eden iki yanını fark ettim:
1) Uyarıları ekran aracılığıyla yapıyor. Odaklanıp bir yazıyı okurken ekranın bir köşesinden çıkan uyarı kutucuğu dikkatimi çok fazla dağıtıyordu. (Tabii uygulamanın amaçlarından biri elbette bu ama işte biz anlaşamadık, napalım).
2) Belirli aralıklarda verdiği uyarılar sırasında bilgisayarı hiç kullanmamaya zorluyor. Mesela 20 sn boyunca fareyi ya da imleci hiç kımıldatmamanız gerekiyor, aksi takdirde uyarıyı sürdürüyor. Yazılımın beni uyarmasını seviyorum ama bu kadar zorlaması hoşuma gitmiyor.

Bu iki sebepten dolayı uzun süredir RSIBreak’i kullanmıyordum, yerine de yeni bir şey aramadım. Lakin yakın zamanda okuduğum sağlıkla ilgili birkaç yazı, beni tekrar önlem almaya itti. Özellikle göz sağlığı ile ilgili kısım, bilgisayar başında geçirilen süreler yüzünden gözleri bozulan bir kişi olarak “yav bu böyle olmayacak” dedirtince alternatif bir şey yapayım dedim.

Göz sağlığı ile ilgili uyarılar içeren yazıların çoğunda önerilen iki şey var:
1) 20-30 dakikada bir kez, 15-20 saniye süreyle ekrana değil de uzak bir noktaya (en az 5-6 metre uzağa) bakın.
2) Gözlerinizi kırpmayı unutmayın. Normalde insan gözü dakikada 10-12 kez kırpılıyor, fakat bilgisayar başında bir şeye odaklandığımızda bunu yeterince yapmıyoruz ve bu da göz kuruluğuna sebep oluyor.

Bu iki basit mevzuyu çözüme kavuşturmak için kendimce basit bir yol buldum: Bunları kendime hatırlattığım iki küçük(3-4 saniyelik) ses dosyası kaydettim. Kendi kendime “gözlerini kırpmayı unutma!” ve “Uzaklara bak!” diye sesleniyorum (şair burada kendine sesleniyor). Ardından crontab’a iki satır ekledim:

        */10 * * * * mplayer /home/adil/sesler/gozlerinikirp.ogg
        15,45 * * * * mplayer /home/adil/sesler/uzaklarabak.ogg

Böylelikle, her 10 dakikada bir kez gözlerimi kırpmam, her yarım saatte bir kez de ekrandan daha uzak bir mesafeye bakmam için sesli uyarı alıyorum. Şimdilik işe yarıyor, ne çok rahatsız edici ne de işlerimi yapmamı engelleyici.

Yukarıda RSIBreak (ve varsa benzeri yazılımları) kötülemiş gibi oldum ama şu farkın altını çizeyim: Benim çözümüm sadece göz sağlığı için. RSIBreak, oturmadan kaynaklı omuz ve bel rahatsızlıklarını da hedefleyen bir yazılım. O açıdan şans vermekte fayda olabilir ilgilenenler için.

adilga

[1] https://userbase.kde.org/RSIBreak

Not: Yazıyı iki gün önce yazıp kenara koymuştum, arada geçen zamanda hem bir iki arkadaştan fikir aldım hem de RSIBreak’i tekrar kurup kurcaladım biraz. Aslında epeyce özelleştirme imkanı sunuyor yazılım, uyarıların görülme sıklığından zorlayıcılıklarına kadar çeşitli düzenlemeler yapabiliyorsunuz, üstelik sesli uyarı seçeneği de var. Daha önce kullandığım zaman bunlar var mıydı hatırlamıyorum, belki vardı da ben fazla kurcalamamıştım. Şu anki haliyle benim ihtiyacımı giderebilecek durumda aslında. Yine de şimdilik kendi çözümüm benim işimi görüyor, iki gündür iyi geçiniyoruz kendisiyle. Öte yandan, yazıyı paylaştığım bir arkadaş, benim rahatsız olduğum zorlayıcılığın (yani yazılımın sizi ara vermeye zorlaması) aslında sağlık açısından daha faydalı olduğunu düşündüğünü belirtti, kısmen hak vermedim değil. Yine aynı arkadaş, göz sağlığı için başka iki yazılım önerdi, onları da not etmiş olalım buraya:

https://justgetflux.com/
http://jonls.dk/redshift/

Ben bunları henüz denemedim, bir ara denemeye çalışacağım bakalım.


10 Temmuz 2014

Posted In: lkd-gezegen, Özgür yazılım

Pardus Kurumsal 2 Üzerinde Redmine Kurulumu

Birkaç hafta evvel, bir sunuma koyacak birkaç ekran görüntüsü alabilmek için yönetim panelini kurcalayabileceğim bir Redmine kurulumuna ihtiyacım oldu. Halihazırda -gerekirse- bozabileceğim bir tanesi elimin altında olmadığından iş başa düştü. Ben de isterdim tabii bir Scientific Linux üzerinde kurayım, bir Ubuntu üzerinde kurayım da fazla uğraşmayayım; ama maalesef halihazırda kurulu onlar da yoktu. Ben de sanal makinaya Ubuntu kurup “apt-get install redmine” demenin daha uzun süreceğini zannederek, sakalı olan kişilerin aksine telkinlerine karşın, kurulu sistemim olan Pardus Kurumsal 2’de Redmine’ı kurmaya kalkıştım. Yaklaşık 4-5 kere Ubuntu kurup kaldırabileceğim sürede tamamlayabildim sanırım(tabii bunda Ruby on Rails hakkında hiçbir şey bilmememin de etkisi vardı). Neyse ki yaptıklarımı not ettim bi kenara, hem bi daha buna kalkışmamam için uyarı olarak dursun hem de uyarıyı dinlemeyip kalkışırsam[1] işe yarasın diye.

Evvela ihtiyaçları sıralayalım. Redmine’ı kurabilmek için Ruby + Rails + Rack üçlüsünün, uyumlu sürümlerinin(hem birbirleriyle hem Redmine’ın kurulacak sürümü ile) kurulu olması gerekiyor(Apache üzerinde de çalışabiliyor sanırım, lakin ben bunlarla kurdum). Rails ve Rack kurmak için Rubygems gerekiyor. MySQL Server 5.0 ve üstü öneriliyor. Tüm bunların uyumlu sürümleriyle ilgili bir tablo Redmine kurulum wiki’sinde[2] bulunuyor. Seçtiğim sürümleri ve edindiğim yerleri ben de şöyle tablolayayım:

Redmine 1.3.0 http://rubyforge.org/frs/?group_id=1850
Ruby 1.8.7 Pardus Kurumsal 2 paket deposundan
Rubygems 1.3.7 Pardus 2011 paket deposundan, paketi inşa ederek
Rails 2.3.14 Rubygems aracılığıyla
Rack 1.1.1 Rubygems aracılığıyla
MySQL Server 5.5.8 Pardus Kurumsal 2 paket deposundan

MySQL server ve Ruby paketleri Pardus Kurumsal 2 sistemde zaten kurulu olmalı. Bir şekilde kaldırılmışsa, konsoldan “sudo pisi it mysql-server” ve “sudo pisi it ruby” demek yeterli.

Kurumsal 2 paket deposunda ne yazık ki Rubygems’in pisi paketi bulunmuyor. Lakin Pardus 2011 deposunda bulunması işi hiç değilse biraz kolaylaştırıyor. Önce pisi paketini inşa ettim:

sudo pisi build http://svn.pardus.org.tr/pardus/2011/devel/programming/language/ruby/rubygems/pspec.xml

Ardından bu pisi paketinden Rubygems’i kurdum:

sudo pisi it rubygems-1.3.7-1-c2-i686.pisi

Rubygems’i hallettikten sonra, onun aracılığıyla kuracağım Rails ve Rack’i kurmaya sıra geldi. Uygun sürümleri kurabilmek için “-v” parametresini kullandım. Şöyle ki:

gem install rails -v=2.3.14
gem install rack -v=1.1.1

Geriye kalan, Redmine’ı indirip[3] uygun bir dizine açtıktan sonra gerekli yapılandırma işlemlerini halletmek. Önce MySQL’e bağlanıp(MySQL servisi çalışmıyorsa “service mysql-server start” komutundan sonra) veritabanında Redmine’a yer açtım:

create database redmine character set utf8;

Bir de “redmine” adında bir MySQL kullanıcısı oluşturup, parolasını “penguen” yapıp gerekli izinleri sağladım:

create user ‘redmine’@’localhost’ identified by ‘penguen’;
grant all privileges on redmine.* to ‘redmine’@’localhost’;

İndirip açtığım redmine-1.3.0 dizinindeki “config/database.yml.example” dosyasını “config/database.yml” olarak kaydettikten sonra içindeki “production” alanını düzenledim:

production:
 adapter: mysql
 database: redmine
 host: localhost
 username: redmine
 password: penguen

Veritabanı yapılandırmasını tamamlamak ve sunucu yapılandırması için konsoldan redmine-1.3.0 dizinine geçerek şu komutları verdim:

rake generate_session_store
RAILS_ENV=production rake db:migrate

Son olarak, Redmine’ı çalıştıracak kullanıcı hesabı için birkaç izin düzenlemesi gerekli. Bunları da redmine-1.3.0 dizininde iken verdim:

mkdir tmp public/plugin_assets
sudo chown -R pardus_kullanici_adi:users files log tmp public/plugin_assets
sudo chmod -R 755 files log tmp public/plugin_assets

Tüm kurulum ve yapılandırma işlemleri bittikten sonra, sunucuyu başlatmak için:

ruby script/server webrick -e production

Sunucu sorunsuz biçimde çalışıyorsa Redmine’a http://localhost:3000/ adresinden erişilebiliyor. Öntanımlı kullanıcı adı ve parolası “admin”.

Not düşmekte fayda var: Yerelde birkaç ufak deneme yapmak için yaptığım bu kurulumun bazı adımlarının, gerçekten kullanılacak bir Redmine için ideal olmadığı aşikar. Sistemde bir Redmine kullanıcısı oluşturmanın ve Webrick yerine Apache’yi tercih etmenin çok daha sağlıklı sonuçlar vereceğini söyledi bazı kuşlar.

adil

[1]http://www.eksisozluk.com/show.asp?t=yapma+demiyorum+hobi+olarak+yine+yap
[2] http://www.redmine.org/projects/redmine/wiki/RedmineInstall
[3] http://rubyforge.org/frs/download.php/75597/redmine-1.3.0.tar.gz


27 Aralık 2011

Posted In: lkd-gezegen, Özgür yazılım, Pardus Kurumsal 2, Redmine

İstanbul’da Bilgisayar Mühendisliği Çalıştayı, 19 Kasım 2011’de

Türkiye’de mühendislerin mesleki örgütlenmeleri meslek odalarıyla yürüyor. Bu odaların çatı örgütü olan Türk Mühendis ve Mimar Odaları Birliği’ne(TMMOB) bağlı 23 tane meslek odası bulunuyor. Bunlardan iç mimarların, mimarların, peyzaj mimarlarının ve şehir plancılarının odalarını çıkarırsak; 19 farklı mühendislik dalının kendi adıyla odası bulunuyor. Kendi meslek dallarının adıyla odaları bulunmayan mühendisler ise çalışma alanı yakın olan bir mühendislik dalının odasına üye olmak durumundalar. Örneğin endüstri mühendisleri Makina Mühendisleri Odası’na, bilgisayar mühendisleri de Elektrik Mühendisleri Odası’na üye olabiliyorlar.

Geçmişte, çeşitli dönemlerde artan çalışmalarla bazı bilgisayar mühendisleri bir “Bilgisayar Mühendisleri Odası” kurabilmek için çaba gösterdiyseler de, bu çabalar başarıya ulaşamadı. Bunlar yakından tanık olduğum süreçler değil tabii. Ancak son üçüne katıldığım(2009-2010-2011(hani Richard Stallman da oradaydı)) ve sonuncusunu Yeditepe Üniversitesi’nde düzenlediğimiz(8 ay geçti hâlâ bir blog yazısı yazamadım bununla ilgili) Bilgisayar Mühendisleri Öğrencileri Kongresi’nde(BİLMÖK) de konu sıkça gündeme geldiği için biraz aşinayım. Önümüzdeki BİLMÖK’te ise belki de yepyeni gelişmeler konuşulabilir.

Elektrik Mühendisleri Odası’nda(EMO) örgütlenen bilgisayar mühendisleri, çalışmalarını Bilgisayar Mühendisliği Meslek Dalı Komisyonu(BM-MDK) adındaki komisyonlarla yürütüyorlar. EMO Ankara Şubesi’ndeki BM-MDK, 15 Ekim 2011’de bir “Bilgisayar Mühendisliği Çalıştayı” düzenlemişti[1]. Aynı gün Yeditepe Üniversitesi’nde düzenlediğimiz Özgür Web Teknolojileri Günleri[2] sebebiyle Ankara’daki çalıştaya katılamamıştım. Bu kez EMO İstanbul Şubesi’ndeki komisyon, aynı isimle İstanbul’da bir çalıştay düzenliyor. 19 Kasım 2011 Cumartesi günü İTÜ Süleyman Demirel Kültür Merkezi’nde gerçekleşecek çalıştayda da, kurulması amaçlanan “Bilgisayar Mühendisleri Odası” esas konu olacak gibi görünüyor.

19 Kasım 2011 Bilgisayar Mühendisliği Çalıştayı afişi

Bu çalıştaylar için hazırlanmış olan “Bilgisayar Mühendisleri Odası Kuruluş Raporu”nu[3] birkaç hafta önce okuma şansı bulmuştum. Raporda, kaba bir özetle, Bilgisayar Mühendisleri Odası’nın neden kurulması gerektiği, kurulması planlanan odanın ne gibi görevler/sorumluluklar üstlenmesi ve hangi ilkeleri benimsemesi gerektiği gibi konular ele alınmış. Bu konuların çalıştayda da tartışılacağını tahmin ediyorum.

İlgili raporda gözlerimin ilk aradığı şey “özgür yazılım” sözcükleri oldu tabii. Beklentim boşa çıkmadı, özgür yazılımlara önem verilmesine dair ifadeler geçiyor. Ancak bu ifadelerin yeterli olduğunu düşünmüyorum. 30 sayfalık raporda “özgür yazılım” ifadesinin sadece 2 kez geçiyor olması bu düşüncemi destekliyor sanırım. Ülkenin bilişim politikalarında söz sahibi olma amacı olan bir meslek odası özgür yazılımlar konusunda daha çok söz söylemeli ve daha benimseyici olmalı. Hem diğer konulardaki tartışmaları takip edebilmek, hem de bu konuda birkaç söz söyleyebilmek için bu çalıştaya katılmak mantıklı görünüyor. Ne de olsa tüm bilgisayar mühendisleri ve bilgisayar mühendisliği öğrencileri davetli[4].

adil

[1] http://www.emo.org.tr/genel/bizden_detay.php?kod=87254&tipi=2&sube=14

[2] http://www.ozgurwebgunleri.org.tr/2011/

[3] http://bmo.org.tr/2011/11/11/bilgisayar-muhendisleri-odasi-kurulus-raporu-yayinlandi/

[4] http://bmo.org.tr/2011/11/11/istanbulda-bilgisayar-muhendisligi-calistayi/


18 Kasım 2011

Posted In: bilgisayar mühendisleri odası, bilgisayar mühendisliği çalıştayı, bilmök, bmo, emo, etkinlik, lkd-gezegen, Özgür yazılım

Pardus Kurumsal 2’de Psi Sorunu

Uzun süre Jabber istemcisi olarak Kopete’yi kullandım. Ancak birkaç ay önce Kopete’yle bir sıkıntı[1] yaşayınca alternatif bir istemci aramaya başladım. Tavsiyeler üzerine Psi uygulamasını[2] kurdum Kurumsal 2 deposundan.

Her şey çok güzel olacak zannederken, Psi ile de ilişkimiz sorunlu başladı: Jabber sunucusuna bağlanabiliyordum, ancak listemdeki çevrimiçi bir arkadaşıma bir şeyler yazmak istediğimde, konuşma penceresini açıp ilk karaktere bastığım anda uygulama kendiliğinden kapanıyordu. Uzun süre çeşitli ayarları kurcaladım, fakat bir türlü aşamadım bu sıkıntıyı.

Yeni bir istemci arayışına girmiştim ki, Doruk Fişek yardımıma koştu. Hatanın sebebi, uygulamada “Check spelling” özelliğinin açık olmasıymış. “Options -> Misc.” sekmesinde “Check spelling” seçeneğinin önündeki işareti kaldırınca sonunda yeni Jabber istemcimi kullanmaya başlayabildim.

Pardus’un hata takip sisteminde bunun için bir hata kaydı[3] açtım, lakin hatayla ilgilenen Serdar Dalgıç hatayı tekrarlayamadığı için henüz çözülemedi sıkıntı. Ben de onun hatayı tekrarlayamamasından dolayı sorunun benim sistemimden kaynaklı olabileceğini düşünüp bu yazıyı yazmayı ertelemiştim. Fakat Kurumsal 2 kullanan birkaç arkadaşım daha aynı sorunu yaşayınca, hiç değilse hata çözülene kadar birilerinin işine yarayabileceğini düşünerek buraya çözümü yazıyorum.

adil

[1] http://bugs.pardus.org.tr/show_bug.cgi?id=19167

[2] http://psi-im.org/

[3] http://bugs.pardus.org.tr/show_bug.cgi?id=19063


14 Kasım 2011

Posted In: Jabber, Kopete, lkd-gezegen, Özgür yazılım, Pardus Kurumsal, Psi

WP Twitter Auto Publish Powered By : XYZScripts.com