Building & Running Firebird 3 On MacOS Sierra

Firebird 3 was released almost a year ago and it has already got two minor releases. But there is still no official packages for MacOS. So this post is about my humble attempt to build it on MacOs from source code. Most of the instructions are taken from Paul Beach’s Firebird Devel list post or from his blog.

This area is not my expertise so there may be inefficient or even wrong approaches  so use it on your own risk and any suggestions, corrections and improvements are always welcomed.

When building needed libraries and Firebird source code, my working directory was /Users/ct/prj so when you see these directory in code blocks below you have change it to your working directory name.

First we should stop firebird service if it is installed:

Building ICU

Firs step is downloading and building ICU library. I’ve used version 54.1, but I think more recent versions can also be used without problem. After downloading and extracting ICU, we have to modify icu/source/config/mh-darwin config file

Edit lines 30-35 from this

to this (note the install path change of LD_SONAME) :

then we can build icu.

Building Firebird

Download Firebird source code and extract it

File Modifications

I’ve made below modifications to source files in order to get rid of build errors

builds/posix/prefix.darwin_x86_64

extern/cloop/src/tests/test1/CTest.c

src/common/os/darwin/mod_loader.cpp

Change lines 45-47 from this

to this :

Also change line 100 from this

to this :

src/remote/SockAddr.h

Change lines 91-95 from this

to this

Firebird needs libtommath to get built which is also distrubuted with Firebird source, but I’ve preferred pre-built library which can be installed via macports as

After this we can start to build Firebird, first configure

then make

Installing

At this point you should have compiled binaries in gen/Release/firebird directory. As I do not know how to make a pkg file for MacOs I’ve manually copied files to Library/Frameworks folder and made setup operations manually as :

If you have not installed firebird from an official package then your system does not have firebird user and group. To create them we can use copy user creation code from builds/install/arch-specific/darwin/install-script. Let’s create a temp script file :

copy and paste below code block :

Save file and

As we manually copied binary files we have to modify service loading script too.

Edit file contents as :

Now we can start Firebird service :

You should check /Library/Frameworks/firebird/firebird.log file for any error messages.

As I’ve stated above, although these steps let me build Firebird on MacOs they may not be a hundred percent correct so if you think they should be corrected in any way please do leave a comment.

Hücresel Otonomlar ile Yordamsal Zindan / Mağara / Harita Üretimi

Hücresel otonomlar  ile yardımı ile bir mahzen oluşturma hedefindeydik. Hücresel otonomlar, N boyutlu bir matriste, kesikli zaman aralıkları ile yürütülen hesaplamalar ile her bir matris hücresinin sonlu sayıdaki değer kümesi içinden değer alabildiği ve matris hücresinin bir sonraki iterasyondaki değerinin, komşularının mevcut değerleri üzerinden belli kurallara göre belirlendiği matematiksel yapı olarak tanımlanabilir [1][2][3]

Otonomlar N boyutlu matrislerde tanımlanabiliyor olsalar da, bizim ihtiyacımız olan 2 boyutlu ve yaşamvari olan otonomlar. Dolayısı ile aşağıdaki bölüm konumuzla direk ilgili değil, labirent üretmek isteyenler bir sonraki bölüme atlayabilirler.

Basit (Tek Boyutlu) Hücresel Otonomlar

Basit hücresel otonomlarda, bir hücrenin bir sonraki adımdaki durumunun hesaplanmasında yalnızca soldaki hücrenin, kendisinin ve sağdaki hücrenin durumları (ki bu durumlar 0 / 1 olabilirler ancak) kullanılıyor.

Üç hücrenin her birinin ancak iki farklı durumu olabileceğinden olası tüm kombinasyonlarının sayısı: 23 = 8 dir.

111 110 101 100 011 010 001 000

Bu 8 farklı kombinasyon için de hücrenin yeni durumu iki farklı değeri içerebilir. Bu durumda tek boyutlu otonomlar için üretilebilecek tüm kuralların sayısı ise 28 = 256’dır.

Kuralların genel gösterimi ise şu şekildedir.

Mevcut Durum 111 110 101 100 011 010 001 000
Hücrenin Yeni Değeri 0 1 1 0 1 1 1 0

Alttaki satırın ikili sistemden onluk sisteme dönülmesi ile de kuralın numarası belirlenmiş olur. 011011102 = 110[4][5].

Web üzerinde tüm kuralların çalışmasını gösteren bir çok javascript uygulaması var. Bunlardan yalnızca bir tanesi : https://dl.dropboxusercontent.com/u/676174/html/eca/main.html#demo

Tek boyutlu otonomları ilginç kılan unsurlar ise rassal sayı üretimi  ve şifreleme (kural 30), fiziksel gerçeklerin modellenmesi, trafik akışı gibi parçacık modellenmesi (kural 184), evrensel hesaplayıcı / turing complete (kural 110) vb. çalışmalara konu olmaları.

İki Boyutlu Yaşamvari Hücresel Otonomlar

Hücresel otonomların yaşamvari olarak tanımlanabilmeleri için[1] :

  • İki boyutlu olmaları
  • Hücrelerin yalnızca iki durumu olmalı (0: Ölü / 1: canlı)
  • Komşuları sayılırken köşeden değen komşular da sayılmalı (toplamda 8 komşu)
  • Bir sonraki iterasyondaki hücre değeri, canlı komşuları ile kendi durumunun bir fonksiyonu olarak ifade edilebilinmeli

Bir önceki yazımda belirttiğim üzere yaşamvari hücrresel otonomların en bilinen örneği Conway’in Yaşam Oyunudur. Bu tarz otonomların yaşam kurallarının metinsel olarak ifade edielbilinmesi amacı ile S/B notasyonu geliştirilmiştir.[1]

  • S (Survival) : Canlı bir hücrenin canlı kalabilmesi için gerekli canlı komşu hücreleri tanımlar.
  • B (Birth) Ölü bir hücrenin canlanması için gerekli canlı hücreleri tanımlar.

Bu notasyona göre Conway’in algoritması şu şekilde ifade edilebilinir: 23/3 : Yani, bir canlı hücrenin 2 veya 3 canlı hücresi varsa yaşar, aksi takdirde ölür, bir ölü hücrenin 3 canlı komşusu varsa o hücre canlanır.

Mahzen ve labirent üretmek içinse en uygun kuralların

  • 12345/3[1]
  • 45678/5678[7]
  • 1267/17[6]
  • 345678/5678[8]

Oldukları söyleniyor. Şimdi bu kuralları rahatça test edebilmek adına github’daki projeyi, kuralların girebileceği şekilde yeniden düzenledim.

Kuralı girip, adım adım işletebiliyoruz simülasyonu

Bundan sonraki adım ise, kuralları, ilk doğurganlık oranı ile test ederek en fazla 4 adımda mağara / mahzen benzeri bir yapıya ulaşıp ulaşamadığımızı test etmek ve kurallar içerisinden en çok içimize sineni seçmek.

12345/3 – % 45

Bu ayar bize daha çok labirentsi bir yapı verdi :

45678/5678 – %45

Bu ayar da sanki arazi / dünya haritası gibi bir sonuç üretti. Canlı hücrelerin mi yoksa ölü hücrelerin mi deniz olacağı konusu ise size kalmış.

1267/17 – % 45

Daha çok labirente benzedi sanki..

345678/5678 – % 45

En iyi sonuçları bu kuraldan aldığımı düşünüyorum. 2 veya 3 iterasyon sonucunda gayet mantıklı gözüken haritalara ulaşabiliyoruz.

İlk Durum Çok karışık gözüküyor…
1. İterasyon sonu. Birden bire biraz mahzeni andırmaya başladı.
2. iterasyon: Her adım yapı biraz daha köşesiz hale geliyor.

Bu noktadan sonra yapılması gerekenler ise :

  1. Floodfill algoritması ile mağaranın büyüklüğünü tespit etmek ve uygun boyutta olup olmadığına karar vermek, uygun değğilse yeni bir harita üretmek.
  2. Arada kalan boşlukları doldurmak veya boşluklar çok büyükse koridorlar ile birbirine bağlayan bir algoritma geliştirmek.

Şimdiki hedefim bu iki nokta üzerinde çalışmaya başlamak…

Kaynaklar

  1. http://www.conwaylife.com/wiki/Cellular_automaton
  2. http://en.wikipedia.org/wiki/Cellular_automaton
  3. http://natureofcode.com/book/chapter-7-cellular-automata/
  4. http://mathworld.wolfram.com/ElementaryCellularAutomaton.html
  5. http://en.wikipedia.org/wiki/Elementary_cellular_automaton
  6. http://gamedev.stackexchange.com/questions/79049/generating-tile-map
  7. http://www.roguebasin.com/index.php?title=Cellular_Automata_Method_for_Generating_Random_Cave-Like_Levels
  8. http://gamedevelopment.tutsplus.com/tutorials/cave-levels-cellular-automata–gamedev-9664
  9. http://pixelenvy.ca/wa/ca_cave.html

Diğer İlgili Linkler

Hayat Oyunu – Ilgın’ın Macerası

Kızım için, onunla beraber çok uzun zamandır bir oyun yazmayı planlıyordum, geçen 1 mayıs tatilinde ailece yaptığımız Eskişehir gezisi sonrasında Aizanoi antik kentinin de atmosferi ile konu gene alevlendi. Ilgın’ın hayalindeki oyununun hikayesini beraberce kurgulamaya başladık.

ilgin_zeus
Ilgın Zeus Tapınağı’nda
Zeus Tapınağı

Ilgın’ın hikayesinin kahramanı, çeşitli tehlikeli görevleri başardıktan sonra, büyücünün kara kitabına ulaşıp, ülkeyi esir alan büyüyü kaldıracaktır. Yalnız yine Ilgın’ın kurgusuna göre, oyunun başında oyuncu ana karakterin özelliklerini (cinsiyet, büyü gücü, dövüş gücü vs..) belirleyecek ki bu da oyunu biraz adventure biraz da rpg temelli hale getiriyor.

Ilgın’ın her oynadığında farklı bir oyun oynuyormuş hissini alması için, her seviyenin (Ilgın’a göre her görevin) farklı bir harita üzerinde geçmesini hedefledim (Eh bu da işin içine rogue-like oyunu sokuyor). Aynı seviyenin her oynanışında farklı bir haritada geçmesi ise işleme dayalı harita üretimi (procedural map generation) anlamına geliyor.

Peki, her seferinde rassal olarak üretilen ama mantıklı görünen bir haritayı / zindanı nasıl oluşturabiliriz şeklindeki araştırmalarım beni hücresel otomatlara (cellular automaton) kadar götürdü. Hücresel otomatların belki de en bilineni Conway‘in Hayat Oyunu.

Bu oyunda kurallar çok basit aslında,

  • Bir canlı hücrenin, iki’den daha az canlı komşusu varsa “yalnızlık nedeniyle” ölür
  • Bir canlı hücrenin, üç’ten daha fazla canlı komşusu varsa “kalabalıklaşma nedeniyle” ölür
  • Bir canlı hücrenin, iki ya da üç canlı komşusu varsa değişmeden bir sonraki nesile kalır
  • Bir ölü hücrenin tam olarak üç canlı komşusu varsa canlanır.

Her ne kadar bu algoritmanın bir çok uygulaması varsa da, bizim baba-kız oyunumuzda kullanacağım harita üretim algoritmasını anlayarak geliştirebilme adına bir tane de ben yazdım.

Hayat Oyunu
Hayat Oyunu

Uygulama Python 3 ile geliştirildi, sonraki aşamalarda testi kolaylaştırmak adına grid üzerinde canlı / ölü hücre ekleme ve hem başlangıç durumunu hem de mevcut durumu kaydedip, yükleme özelliğine sahip.

Kaynak kodlarına https://github.com/ctengiz/pygol adresinden ulaşabilirsiniz.

Hala daha hem Ilgın’ın hem de benim yapacak çok işimiz var. Ilgın hikayeyi tamamlayacak, ben de kodlayacağım. Gelişmeleri paylaşmaya devam edeceğiz…

Filtrelenmeden, Engellenmeden, İzlenmeden SSH Socks Proxy ile Internette Gezinin

Bir önceki yazımda, yurt dışında kiraladığımız sunucu üzerinde DNS sunucusu çalıştırmıştık. Şimdi yine aynı sunucuyu kullanarak, tüm Internet çıkışınızı o sunucuya yönlendirecek ve bulunduğunuz coğrafyaya / networke ait tüm filtreleri ve izlemeleri by-pass ederek özgürce internette dolaşabileceksiniz.

Bunun için linux / macosx tabanlı makinelerde herhangi bir ek uygulamaya ihtiyacınız yok kondsoldan ssh uygulamasını, windows bazlı makinelerde ise putty ile beraber gelen plink uygulamasını çalıştıracağız.

MacOsX / Linux

Bu işletim sistemleri için terminalden aşağıdaki komutu vermemiz yeterlidir:

ssh -ND 9999 root@sunucunuzun.ip.adresi

Bu komut ile yurt dışındaki sunucunuz ile kendi bilgisayarınız arasında güvenli / şifrelenmiş bir tünel oluşturursunuz.

Şifreyi girdikten sonra herhangi bir geri bildirim beklemeyin (-N anahtarı <no prompt> anlamına geliyor),  eğer şifrenizi yanlış girdiyseniz zaten hata mesajını alacaksınız zaten.

Sıradaki adımımız ise, web gezinme taleplerimizin bu oluşturduğumuz tünele yönlendirilmesi. Bunun için sisteminizde proxy ayarlarını yapmanız gerekiyor. Mac için,  System Preferences > Network ayarlarına girdiğinizde öncelikle Gelişmiş ayarlar kısmından,

Proxies kısmına geçmeli ve aşağıda işaretlediğim şekilde ayarlarınızı yapmalısınız.

Bu ayarların ardından, bilgisayarınız tüm yaptığınız web gezinme taleplerinizi, yurt dışındaki sunucunuza güvenli bir şekilde iletilecek, sunucunuzdan gelen cevaplar yine kimse tarafından izlenmeden sizin bilgisayarınıza dolayıs ile web tarayıcınıza aktarılacaktır.

Normal gezintinize dönmek için, proxy ayarlarınızı eski haline getirmeniz ve konsolda çalıştırdığınız ssh komutunu sonlandırmanız yeterlidir.

Windows

Öncelikle plink programını indirin, ardından plink’in indiği klasörde bir terminal açın ve şu komutu verin :

plink -D 9999 -N root@sunucunuzun.ip.adresi

Ardından Windows’un proxy ayarlarını yapmanız gerekiyor. Bunun için Denetim Masası > Internet Seçeneklerini açarak aşağıdaki görsellerdeki adımları izleyin :

 

Kendi DNS Sunucunuzu Kurun

Gelişen koşullar sonucunda kendi DNS sunucunuzu kurmak isteyebilirsiz. Örneğin kullandığınız DNS sunucusuna güvenmiyor olabilir veya kullandığınız sunucuya erişim engellenmiş olabilir.

Veya kullandığınız dns sunucusuna yaptığınız sorguların loglandığından ve ileride aleyhinize kullanılacağından şüpheleniyor olabilirsiniz.

Bu tip durumların önüne geçmenin en kolaya yolu yurt dışında kendi DNS sunucunuzu oluşturmaktır. Özgürlüğünüzün ve şahsi güvenliğinizin bedeline için ne kadar bütçe ayıracağınıza bağlı olarak yurt dışında bir çok vps hostin seçeneği mevcut.

Ben yıllık 60$ ı bu iş haracayabileceğim kanaatine vararak Digital Ocean‘ı (bundan sonra kısaca DO diyorum) seçtim. DO’da hesap açma ve VPS oluşturma işlemleri oldukça kolay. Hesap oluşturduktans sonra sanal sunucunuzu (ki kendileri ona droplet diyorlar) oluşturmaya başlayabilirsiniz :

Sunucunun yeri konusunda pek yapabileceğiniz bir şey yok, kendisi otomatik seçiyor zaten :

Son olarak sunucunun işletim sistemini ve üzerinde ön tanımlı olarak kurulu olacakları seçmeniz gerekiyor. Bu yazıya göre kurulum yapacaksanız  yalnızca Debian seçeneğini seçmeniz yeterli :

Ardından DO yaklaşık 60 sn içererisinde sanal sunucunuzu hazır edecektir :

Bu esnada DO, kayıt olurken verdiğiniz email hesabınıza root şifresini (roor linux sunucularda en yetkili hesaptır) gönderecektir. Bu şifreyi sisteme girerken kullanacağız. Güvenli bir yere not edin. Hesap oluşturmanın ardından DO bize yönetim ekranını getirecek:

Console Access butonu ile sanal suncumuzun konsoluna erişebiliriz :

Kullanıcı adı olarak root, şifre kısmına ise mail ile gelen şifreyi yazın. Yalnız, şifreyi girerken linux sistemlerde imlecin hareket  etmesini beklemeyin. Olduğu yerde durur ama karakterleri kabul eder.

Eğer şirenizi doğru girdiyseniz aşağıdaki gibi bir ekranla karşılacaksınız :

passwd komutu ile size atanan şifrenizi, daha kolay hatıralayabileceğiniz bir şifre ile değiştirebilirsiniz (yeni şifrenizi iki kere girmeniz gerekiyor):

Şimdi kendimize ait özel DNS sunucusu kurulumuna başlayabiliriz. Sırasıyla vereceğimiz komutlar :

[code]
apt-get update
[/code]

[code]
apt-get install bind9
[/code]

Bu verdiğimiz komut ile DNS sunucumuzu kurduk. Şimdi gerekli konfigürasyonu yapmamız gerekiyor. Web üzerinden bağlandığımız konsolda / karakterini basan tuş bulunmadığı için (en azından benim kulladığım browserda yoktu ama normal ssh ile bağlanınca klavye yerleşminde herhangi bir sorun yok), aşağıdaki komutları sıra ile vermemiz gerekiyor :

[code]
cd..
cd etc
cd bind
nano named.conf.options
[/code]

Karşımıza çıkan konifigürasyon dosyasının işaretlediğim kısmını

şu şekilde değiştiriyoruz :

ardından Ctrl+O tuş kombinasyonu ile kaydedip, Ctrl+X tuş kombinasyonu ile düzenleyiciden çıkıyoruz. Ardından sunucumuzu yeniden başlatıyoruz.

[code]
reboot
[/code]

Tekrar login ekranımızı gördüğümüzde, DNS sunucumuz hazır demektir. Sunucumuzun IP’si, bilgisayarımızdaki DNS sunucuları kısmına yazmamız yeterli. Bu son kısım ile ilgili internette oldukça bol kaynak var.

Bir sonraki yazımda bu kurduğumuz sunucumuzu proxy olarak kullanıp hiç bir filtreye takılmadan güvenli Internet gezintisini yazmayı planlıyorum.

Subversion – Apache behind Nginx on Debian

I assume that you are already using Nginx as web server. So this guide covers hosting svn access through Nginx proxy with Apache.

Install required packages :
[bash]
apt-get install apache2 subversion libapache2-svn apache2-utils
[/bash]

Create svn folder for repositories :
[bash]
mkdir /var/svn
chown www-data.www-data /var/svn/
[/bash]

Modify your apache /etc/apache2/ports.conf file to listen for a different port than 80. Because port 80 is already used by Nginx.

[code]
# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 81

<IfModule ssl_module>
Listen 443
</IfModule>

<IfModule mod_gnutls.c>
Listen 443
</IfModule>
[/code]

If you plan to use Apache only for svn http access then you can modify /etc/apache2/sites-available/000-default.conf directly, otherwise you shoul create a virtual host file in /etc/apache2/sites-available and enable it via a2ensite.

Apache virtual host configuration file :
[code]
<VirtualHost *:81>
#ServerName www.example.com

ServerAdmin webmaster@localhost
DocumentRoot /var/www/html

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
[/code]

Enable needed apache modules :
[bash]
a2enmod dav_svn auth_basic authz_svn authn_file
[/bash]

Edit configuration file for dav_svn /etc/apache2/mods-available/dav_svn.conf
[code]
<Location /svn>
DAV svn
SVNParentPath /var/svn

# We are giving repository-wide auth to users
AuthType Basic
AuthName "Goltas SVN"
AuthUserFile /etc/apache2/dav_svn.passwd

#Here we define repository based auth settings file
<IfModule mod_authz_svn.c>
AuthzSVNAccessFile /etc/apache2/dav_svn.authz
</IfModule>

Require valid-user
Satisfy Any

</Location>
[/code]

Create svn repository auth settings file, and a basic config sample :
[code]
nano /etc/apache2/dav_svn.authz
[/code]

[code]
[groups]

[/]
#cagatay will access all repositories with read and write grants:
cagatay = rw

[/sample_poject]
#auser will only have read access for only "sample_project" :
auser = r
[/code]

Create a password file and add user “cagatay” to it :
[code]
htpasswd -c /etc/apache2/dav_svn.passwd cagatay
[/code]

To add another user to password file :
[code]
htpasswd /etc/apache2/dav_svn.passwd anotherusername
[/code]

Finally, restart apache :
[code]
/etc/init.d/apache restart
[/code]

Configure Nginx as proxy pass for apache svn :
[bash]
nano /etc/nginx/sites-available/svn
[/bash]

[code]
upstream svnapache {
server 127.0.0.1:81;
}

server {
server_name svn.yourdomain.com;
listen :80;

client_max_body_size 500M;

root /var/www;
index index.html index.htm;

access_log /var/log/nginx/svn.access.log;
error_log /var/log/nginx/svn.error.log;

location / {
proxy_pass http://svnapache;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_redirect off;
proxy_buffering off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
[/code]

Symlink to enable it :

[code]
ln -s /etc/nginx/sites-available/svn /etc/nginx/sites-enabled/svn
[/code]

Restart nginx :
[code]
/etc/init.d/ngix restart
[/code]

To create a new sv repository :
[code]
cd /var/svn
svnadmin create a_new_project_name
chown -R www-data:www-data ./a_new_project_name
[/code]

Bottlepy + Nginx + Uwsgi + Python3 with Virtualenv on Debian

Bottle is my favorite micro web framework for  python.  It is well designed, allows quick prototyping and also developing web based applications.

My preferred web application stack is bottle + nginx + uwsgi + firebird + debian.

So this is my brief tutorial for this stack :

Install required packages :

Prepare web files directory structure for nginx :

Let’s create our virtualenv for our applications. I prefer placing my virtaulenvs in opt directory :

Time to activate our virtualenv and install bottle :

To create our simple demo application :

And code of our simple demo application :

Let’s check if everything is working so far :

If your output is similar to below output then everything is well so far. When you locate to http://localhost:8081, your browser should say “hello” to you.

Now we can safely deactivate our virtualenv,

and start nginx configuration, first we have to create a virtual host file for nginx :

content of the nginx virtualhost is :

to activate our virtualhost we symlink it to sites-enabled directory :

Now it is time to configure our uwsgi. First we create our uswgi appliaction configuration file :

bottledemo.ini content

and symlink to enabled applications :

last touches :