Google Code üzerindeki proje oluşturma limitini ne yazık ki doldurdum. İşe yaramayacak bir kaç projeyi sildim ancak tam olarak silinmediği için hala limit dolu olarak görünüyor. Bunun üzerine svnservisi.com alan adını alıp kendi svn sunucumu kurmaya karar verdim. Tabi genel kullanımada açık ve herhangi bir sınırlama olmayacak (maddi, manevi gidebildiği yere kadar
)
Şu an bir vps üzerinde. Sistemde tam olarak bitmedi iş yoğunluğundan ötürü. Eğer asterisk sunucusu ile ilgili yapılacakları bu hafta sonu tamamlayabilirsem sanırım bu pazartesi ya da hafta ortalarında rahata kavuşacağım ve biraz dinlenme imkanı bulacağım. Böyle bir durumda bir iki hafta sonra svnservisi.com yayın hayatına başlayabilir.
(more...)
İş dönüşü applet yazımı konusunda araştırma ve birazda kurcalama yaparken Jython denen şeyi keşfettim. Aslında daha öncesinde bir kaç yerde rastlamıştım. Hatta geçen hafta Python kodunu linux dağıtımı üzerinde Windows için derleme işlemi sırasında da karşıma çıkmıştı. Ancak hiç üzerinde durmamıştım.
Jython.org adresine girip, bir kaç örneğe bakmak gerçekten heyecan vericiydi. İlk applet'ı yazarken derleme kısmında biraz sorunla karşılaştım ancak onuda hallettim. Detaylı olmasada yapılması gerekenleri sırasıyla yazmaya çalışacağım.
1 - JDK, Python ve Jython kurmak (Python kurmadan çalışıyormu bilmiyorum).
2 - Jython kurulumu sırasında JDK yolunun seçilmesi.
3 - İlk applet'ın yazımı:
#-*- coding. utf-8 -*-
from java import awt, applet
class DemoApplet(applet.Applet):
def init(self):
self.b1 = awt.Button('Buton Durumunu Değiştir',actionPerformed=self.change_status_button)
self.b2 = awt.Button('Merhaba Dünya')
self.add(self.b1)
self.add(self.b2)
def change_status_button(self,event):
if self.b2.isEnabled():
self.b2.enabled = False
else:
self.b2.enabled = True
4 - Kodların derlenmesi:
# cd test/
# jpythonc --core --deep --jar appletdemo.jar *.py
5 - İndex.html nin oluşturulması:
<html>
<head>
<title>Jython</title>
</head>
<body>
<applet code="DemoApplet" archive="appletdemo.jar" width="500" height="100"></applet>
</body>
</html>
MySQL ile aynı sorgu içerisinde farklı veritabanlarını kullanarak işlem yapabiliyoruz. Bugün bir veritabanındaki alanla, farklı bir veritabanındaki alanı aşağıdaki sorgu ile silmeye çalışarak bu özelliği kullandım. Ancak sonucunda hata ile karşılaştım.
Hata ile karşılaştığım sql sorgusu aşağıdaki şekilde:
DELETE FROM database2.test WHERE database2.test.name = database1.test.name;
/* SQL Error: Unknown column 'database1.test.name' in 'where clause' */
İşten geldikten sonra evde biraz uğraştım bunun üzerine ve çalışan bir sql kodu üretebildim. Şu sayfanında yardımı oldu:
DELETE database2.test FROM database1.test, database2.test WHERE database2.test.name = database1.test.name;
Hangi tablo üzerinde işlem yapılacaksa o tabloyu delete den sonra belirtmelisiniz.
(Kısa süren)Aramalarımız sonucunda yararlı bir program bulamayınca ellerimizi kullanarak (tabiki bilgisayar üzerinde) bir sitenin verilerini Postgresql'den Mysql'e aktardık. Eğer böyle bir şeye niyet ederseniz sırasıyla aşağıdaki işlemleri gerçekleştirebilirsiniz.
1 - Pgadmin kurulumu ve veritabanındaki tabloların şemalarının alınması.
2 - Alınan şemaların Mysql'in tanıyacağı şekilde değiştirilmesi.
3 - Pgadmin ile verileri kopyalamak (listeleme bölümünde hepsini seçip CTRL+C yapmak).
4 - Bu kopyalanan verileri bir editör kullanarak (Geany) csv dosyası şeklinde kaydetmek (aslında sadece dosya sonu csv oluyor, txt de olabilir. ya da hiç bir şey).
5 - Ardından oluşan csv dosyasını mysql konsol'da aşağıdaki şekilde kullanmak:
LOAD DATA INFILE "CSV_DOSYASI_YOLU"
INTO TABLE table1
FIELDS TERMINATED BY ";"
OPTIONALLY ENCLOSED BY """"
LINES TERMINATED BY "\r\n";
Bu son yazılan komut ile herhangi bir düzenli veri olan dosyadan mysql üzerindeki tablolara veri ekleyebilirsiniz. Koddaki FIELDS TERMINATED BY ile belirtilen karakter, dosya içindeki verilerin ayraç karakteri; LINES TERMINATED BY ile belirtilen karakter ise satır sonu karakteridir. OPTIONALLY ENCLOSED BY ile belirtilen karakter ise herhangi bir alandaki veride bulunan, veriyi çevreleyen, ama göz ardı edilmesi istenen karakterdir. Örneğin dosyanızdaki veri aşağıdaki şekilde ise:
1;1986;"Osmaniye"
Veritabanına bu veriler şu şekilde eklenir;
ID Tarih Şehir
1 1986 Osmaniye
StumbleUpon ile keşfettiğim bir site, http://www.chessproblems.com/. Kendi problemlerinizide ekleyebiliyorsunuz.
Bir kaç haftadır Asterisk ile uğraşmaktayım. Php ile asterisk'e hükmetmeye çalışıyorum. Epey ilerlemede sağladım. Bugün (dünden kalma bir sorun) kayıt işleminde dosya adını değiştirme konusu ile uğraştım. Tüm komutlar(örnekler) doğru gönderilmesine rağmen kayıt işleminde dosya ismine müdahale edemiyordum. Her zaman olduğu gibi yine alakasız bir işlem yaparken soruna neden olan kısmı görebildim.
Şuna benzer bir kodla arama yapıldığı zaman sunucuda açılan kanal adını alabiliyordum:
[...]
$split_response = split("State: Up",$this->get_response());
$split_response = split("Channel: ",$split_response[0]);
$this->channel_name = $split_response[strlen($split_response)];
[...]
Bu kodların altına birde aşağıdaki kodları eklemek gerekiyormuş:
[...]
$this->channel_name = str_replace("\r","",$this->channel_name);
$this->channel_name = str_replace("\n","",$this->channel_name);
[...]
Bu işlemlerden sonra aşağıdakine benzer bir kodla artık açık olan bir kanaldaki görüşmeleri istediğiniz dosya ismi ile kaydedebilirsiniz:
[...]
$this->cmd("Action: Monitor");
$this->cmd("Channel: ".$this->channel_name);
$this->cmd("File: testdosyasi",2);
[...]
Şurada da asterisk için bir php apisi mevcut(muş).
Po dosyalarını mo dosyalarına çevirebilen bir appengine uygulaması geliştirdim. http://po2mo.appspot.com/ adresinden uygulamaya erişebilirsiniz.
Farklı dil desteği olan bir projede kullanmak için PHP ile bir sınıf oluşturdum. Bir kaç özellik daha ekleyeceğim. Kodlara aşağıdan erişebilirsiniz. Çalıştırmak için http://savannah.nongnu.org/projects/php-gettext/ adresinden ilgili php dosyalarını, http://gnuwin32.sourceforge.net/packages/gettext.htm adresindende *.po dosyalarını *.mo dosyasına dönüştürebilmek için gerekli olan araçları indirebilirsiniz. Son verilen adres Windows işletim sistemi için geçerli. Bir Linux dağıtımı kullanıyorsanız paket yöneticiniz vasıtasıyla "gettext" paketini kurabilirsiniz.
Po dosyasını mo dosyasına dönüştürebilmek için konsolda aşağıdaki komutu kullanabilirsiniz.
$ msgfmt messages.po -o messages.mo
Oluşan *.mo dosyasını aşağıdaki dizin yapısı içinde kullanmalısınız.
- locale
-- en_US
---- LC_MESSAGES
------ messages.mo
< ?php
/*
session_start();
require_once('gettext.inc');
require_once('class.localization.php');
$locale = new localization;
$locale->langsPath = realpath('./locale');
$locale->langList = array('tr_TR','en_US','de_DE','fr_FR');
$locale->defaultLang = 'tr_TR';
$locale->domain = 'messages';
$locale->initLocale();
echo $locale->_('string');
*/
class localization{
var $langsPath = ''; // Dil dosyalarının yüklü olduğu dizin.
var $defaultLang = 'tr_TR'; // Öntanımlı gelen dil.
var $langList = array(); // Sistemde yüklü dil listesi.
var $lang = ''; // Kullanılan dil değerini tutan değişken.
var $domain = 'messages'; // .mo dosyası adı.
/*
Yerelleştirme sınıfı yükleyicisi.
*/
function initLocale(){
// Session oluştur ve verileri ata.
if (!isset($_SESSION['system_lang']))
$_SESSION['system_lang'] = $this->defaultLang;
// Dil değişimi olacaksa verileri ata.
if (isset($_GET['lang']))
$_SESSION['system_lang'] = $this->control($_GET['lang']);
$this->lang = $_SESSION['system_lang'];
// Dil değerine göre verileri yükle.
T_setlocale(LC_ALL,$this->lang);
T_bindtextdomain($this->domain,$this->langsPath);
T_bind_textdomain_codeset($this->domain,'UTF-8');
T_textdomain($this->domain);
}
/*
Dil listesi kontrolü.
*/
function control($locale){
return in_array($locale,$this->langList) ? $locale : $this->defaultLang;
}
/*
Metni çevirir.
*/
function _($str){
return T_($str);
}
}
?>
16 Ekim'den beri istcall'da çalışıyorum. Bu süre zarfında projelerle ve diğer uğraşılarımla pek ilgilenemedim. Ama yavaş yavaş adapte oluyorum bu düzene. İşin sevindirici tarafı Linux ve Python'dan uzak kalmamam olsa gerek. Diğer bir sevindirici tarafı ise artık tasarımla uğraşmam gerekmiyor.
Bazen lazım oluyorlar, listelemekte fayda var unutmamak için.
- Bir dizinin boyutunu öğrenebiliriz : du -hs /home/
- rm -f * ile silinemeyecek kadar çok dosya varsa kullanabiliriz : find . -name '*' | xargs rm
- Linux sunucu üzerinde ms access veritabanı dosyasından veri çekmek için kullanabiliriz : mdbtools (PHP'de exec, Python'da os.system() ile işe yarayabilir web uygulamaları için. Yanız bu paket Pardus'da yok ya da ben bulamadım)
- n tane işlem için işleri çok kolaylaştırabilir : imacros for firefox.
- Pdf dosyasından veri almak için kullanılabilir: pdftotext (PHP'de exec ile işe yarayabilir.)
Aşağıda puanlara göre bir liste oluşturup, id değerine göre kullanıcı puanının kaçıncı sırada olduğunu bulmaya yarayan bir sınıf mevcut. Bir arkadaşın işine yarayacak sanırım.
< ?php
class sirala{
var $db = null;
function sirala(){
$this->db = mysql_connect('localhost','root','vertrigo');
mysql_select_db('test');
}
function kapat(){
mysql_close($this->db);
}
function veriEkle($veriSayisi){
for($count=0;$count< $veriSayisi;$count++){
$point = rand(0,$veriSayisi);
mysql_query(sprintf('insert into tablo(isim,puan) values("%s",%d)',
'isim-'.$count,
$point
));
}
}
function veriSirala(){
$result = mysql_query('select * from siralama');
if (mysql_numrows($result)==0){
mysql_query('insert into siralama(liste) values("")');
}
$puan_listesi = array();
$result = mysql_query('select * from tablo order by puan desc ');
$count = 1;
while ($row = mysql_fetch_object($result)){
$puan_listesi[$row->id] = $count;
$count++;
}
mysql_query(sprintf('update siralama set liste="%s"',
serialize($puan_listesi)
));
}
function sirayiAl($id){
$result = mysql_query('select * from siralama ');
$data = mysql_fetch_array($result);
$data = unserialize($data[0]);
return $data[$id];
}
}
$sirala = new sirala();
// Test amaçlı 100 veri ekle.
$sirala->veriEkle(100);
// Eklenen verileri sırala ve siralama adındaki tabloya oluşan listeyi aktar
$sirala->veriSirala();
// ID değerine göre kişinin sırasını ekrana yaz.
echo $sirala->sirayiAl(90);
$sirala->kapat();
?>
Okul bu yaz bitti. MYO olduğu için bir miktar daha okuyacağım. Ancak 2009 DGS ile bu şekillenecek gibi. Şimdilik sınavsız geçiş hakkımı kullanıp açıköğretime kayıt yaptıracağım. Askerlik ile ilgili durumuda bir kaç hafta önce halletmiştim 2011'e kadar. Şimdi önümde değerlendireceğim bir vakit bulunmakta.
Okul nedeniyle bir süredir kişisel çalışıyordum. Okul bittiğine göre bu vakti bir işte çalışarak değerlendirmek benim için faydalı olacağa benziyor. Umarım kısa zamanda uyum sağlayacağım bir firma ile anlaşırım
PyTR ile Python konusundaki bildiklerimi -pek sık olmasada- yazarak insanları bilgilendirmeye çalışıyordum. Bir süre önce Python TR günlüğüne katıldım. Artık orada da yazmaya çalışacağım. Django ile ilgili bir yazı ile orayada merhaba dedim.
Not Al ve Gedit Patron biraz daha gelişti. Gedit Patron'u django ve google app engine için özelleştireceğim. Şimdilik bazı eksiklikleri var.
Not Al içinse geliştirme süreci yeni özellikler ekleyerek devam ediyor. Son olarak SSH üzerinden notları aktarma ve alma özelliği eklendi. Bu özelliği biraz geliştirdikten sonra müsait bir vakitte notlara etiket ekleme özelliğini ekleyeceğim.
Eğer projelerinizde SSH ile ilgili bazı işlemler yapacaksanız paramiko modülünü kullanabilirsiniz. Ben bu modülü kullanarak şöyle bir sınıf oluşturdum ve Not Al için kullandım. Yalnız windows üzerinde deneme fırsatım olmadı. Özellikle derleme işleminden sonra sorun çıkıp çıkmadığını test etmem gerekiyor.
Eğer roundcube kullanırken aşağıdaki gibi bir hata ile karşılaşıyorsanız şu sayfayı ziyaret etmenizde fayda var.
PHP Fatal error: Call to undefined method MDB2_Driver_Datatype_mysql::getDBInstance()
Uzun süre yazmıyordum. Ortaya konu olarak bayağı karışık bir girdi çıktı
.