uygulanan etiketler: php
pengeunpedi pengeunpedi pengeunpedi
  penguenyuvasi   pengulog   arşiv   bulut   rss

apache mpm_prefork module

Friday, May 1, 2009 9:16:58 PM tarihinde Fırat KÜÇÜK tarafından gönderildi.

PHP ile program yazanlar apache sunucusuna ve Apache'ye ait mpm_prefork modülüne kulak aşinalıkları vardır. Gerçi modül diyoruz ama an itibari ile Ubuntu'da prefork modülünü yüklediğimizde /usr/sbin içindeki ana çalıştırılabilir dosya olan apache2'nin değiştiğini gördüm. Windows'ta bu yapıyı test etmedim. Windows'ta çalışma kipleri arasında geçiş nasıl sağlanıyor bir malumatım yok.

Sunucu taraflı dil olarak PHP ve sunucu olarak Apache kullanıyorsanız. PHP dilinin getirmiş olduğu çeşitli sunucu taraflı kısıtlamaların bulunduğunu söylemeliyim. Tabi bu PHP geliştiricilerini üzmesin. PHP oldukça sade ve hızlı bir dil. Büyük destekçileri olduğunu biliyorum. :)

Konunun evveliyatına deyinirsek; Daha önceki teknoloji olan CGI (Common Gateway Interface)'da benzer bir metod ile işlem yapıyordu. CGI ile yazılan uygulamaları hep harika ve daha zevkli bulmuşumdur. :) Şahsi kanaatim bir web programcısı diğer dillere geçmeden öncelikle CGI ile program yazmalıdır. Bu web uygulamalarının çalışma mantığı hakkında olabildiğince fikir sahibi olmamımızı sağlar.

Uç birim/Konsol uygulamaları ya da diğer bir değişle siyah ekranlarımız için yazdığımız uygulamaların çalışma mekaniği aynıdır. Konsol uygulamaları Standart Çıktı (Standart Output) ve Standart Girdi (Standart Input) ile etkileşirler. Ekrana yazacağımız şeyleri standart çıktıya aktarırız. Ekrandan okunan şeyler ise standart girdiden okunur. Sistemde küresel bir değişken varsa bunlar da çevresel değişkenler sayesinde elde edilir.

<?php echo(readline("Yazı: ")); ?>

Yukarıdaki örnek standart girdiden okuyup, standart çıktıya yazan bir PHP programıdır. Uzun lafın kısası CGI bu tarz uygulamalar için bir arabirim sunar. Web sunucu ile girdi ve çıktı aygıtları arasında. Siz HTTP üst bilgi başlıkları (Header) dahil olmak üzere tüm sisteme hakim olursunuz.

Apache üzerinde PHP CGI kipinde çalışabildiği gibi, mod_php üzerinde de çalışabilmekte: PHP'i CGI olarak çalıştırmak istersek:

.htaccess dosyasına;

Allow from       All
Options          ExecCGI
AddHandler       cgi-script .php

test.php dosyasına:

#!/usr/bin/php
<?php
echo("Content-type: text/plain\n\n");
echo("merhaba");
?>

Dosya CLI interpreter tarafından işleneceğinden çalıştırma yetkilerine sahip olması gereklidir. Çocuk süreç alt bir süreç daha oluşturup yorumlayıcıyı çağırır.

root     15016  0.0  0.3  33908  3124 ?        Rs   May01   0:00 /usr/sbin/apache2 -k start
www-data 15021  0.0  0.1  34528  1784 ?        S    May01   0:00  \_ /usr/sbin/apache2 -k start
www-data 27404  0.5  0.4  31164  4596 ?        R    May01   0:00  |   \_ /usr/bin/php /var/www/test.php

PHP gerek mod_php ile çalışsın gerekse mod_cgi ile temeldeki Apache çalışma sistematiği mpm_prefork modülü üzerine olacaktır. Bu her talep için ayrı bir çocuk sürecin hizmet etmesi manasına gelir. Fakat mod_php ile çalışırken ek bir çocuk süreç daha olmayacağından ve çıktı/girdi aygıtlarını kullanmayacağından uygulamanın daha hızlı çalışacağını söyleyebiliriz.

inceleme, linux, phpkaynak | yorumlar [1]


uzun bir bekleyişten sonra

Sunday, September 14, 2008 10:07:21 AM tarihinde Fırat KÜÇÜK tarafından gönderildi.

Yaklaşık 1 senedir bu günlüğüme yazı yazmıyordum. 2009 yılının yaklaşması itibari ile penguenyuvasi.org için tamamen yerli üretim bir blog çalışması içerisine girdim. Sözü fazla uzatmadan kısmet bugüneymiş diyorum. :)

Penguenyuvası'nda neler yapıldı ve neler yeni?

Öncelikle tüm görsel öğeler inkscape ve gimp kullanılarak tek tek el ile hazırlandı. Tabi yuvarlak hatlı penguenler oldu biraz ama neyse :)

Kodlama kısmını başta PHP ve codeigniter kullanarak gerçekleştirdim. (PHP ile proje yapacaklara tavsiyem codeigniter veya symfony'i mutlaka denemeleri.) Ama sonra beni tanıyanlar bilirler 2 hafta önce canım sıkıldı ve kalan kısmını PHP ile devam etmek yerine tamamen Java'da yazmanın daha mantıklı olacağını düşündüm her nasılsa???

Kodlama esnasında kullandığım teknolojiler şunlar:

  1. Düzenleyici ve IDE olarak: netbeans 6.1, vim, gedit
  2. Veritabanı: MySQL (5.0.51a-3ubuntu5.1)
  3. Sunucu: Ubuntu 7.10 üzerinde Apache 2.2.4-3ubuntu0.1 ve Apache Tomcat 6.0.18
  4. Programlama dili: Java
  5. Alt teknolojiler: Java Bean, Filter, Servlet, Jspx, Jspf, Tag handler, Tagx, TLD'ler

Kodlama esnasında kendime bir projenin Java'dan PHP'e dönüştürülmesinin çoka akıllı bir davranış olmadığı konusunda bir çok telkinde bulundum, hatta zaman zaman kendime küfrettim. PHP'de tek metod ile yapacağınız bir şey için Java'da 3-4 satır kod yazmanız kaçınılmaz. Fakat Java teknolojilerinde daha çok detaya inmek mümkün. Sunucu ile ilişkileriniz daha sıkı.

Sıkı ilişki kelimesini açarsak web sunucu ve web sunucu üzerinde çalışan uygulamalar, aynı dilde yazıldığından bu bir avantaj. Bir kaç örnek verelim Servlet dediğimiz web uygulamacığı çalışmadan önce veya çalıştıktan sonra gelen ve gönderilen parametreleri bir süzgeçten (javax.servlet.Filter) geçirebiliyorsunuz. Bu da sizin PHP'de yalnızca Apache'ye modül yazarak gerçekleştirebileceğiniz işleri yapmanıza imkan tanıyor.

<filter>
  <filter-name>Suzgec</filter-name>
  <filter-class>org.pengulab.penguenyuvasi.filters.PenguFilter</filter-class>
</filter>
<filter-mapping>
  <filter-name>Suzgec</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Url örüntülerini (url-pattern) kolayca yönlendirebilmemiz (servlet-mapping) de bir avantaj. Örneğin tüm .pengu uzantılı dosyalara Pengu servlet'inin cevap vermesini sağlıyabiliriz. Böylelikle kendi şablon dilimizi hatta web üzerinde çalışan betik programlama dilimizi yapmamızı sağlar. (Javy webde böyle çalışıyor şuanda)

<servlet>
  <servlet-name>Pengu</servlet-name>
  <servlet-class>org.pengulab.penguenyuvasi.handlers.PenguHandler</servlet-class>
</servlet>
<servlet-mapping>
  <servlet-name>Pengu</servlet-name>
  <url-pattern>/*.pengu</url-pattern>
</servlet-mapping>

Bunu Apache'de yapmak için bir Tutucu (Handler) yazmamız lazım. Bu Handler'ı .htaccess dosyasında veya genel yapılandırma dosyasında tanımlarız. Apache'nin bütünleşik veya modüllerinde gelen tutucularına ilaveten Java'da olduğu gibi bir tutucu yapmak için Action komutunu kullanıyoruz. (wepy'de bu şekilde çalışıyordu.)

Action add-footer /cgi-bin/footer.pl
AddHandler add-footer .html

Tekrar kullanılabilir öğeler (reusable components) yapma konusunda ise Java oldukça yetenekli tag, tagx dosyaları ile tld kütüphaneleri ile kendi özelleştirilmiş xml etiketlerinizi oluşturabiliyorsunuz. Hatta javanın ifade dili (EL - Expression Language) için işlevlerde yazabiliyorsunuz bu sayede.

penguenyuvasi.org'da neler yeni sorusunun cevabına gelirsek uzun bir zamandır viki imlası ile günlük girdisi yazma hayalim vardı. Bu hayali yeni sürüm ile gerçekleştirdim. Pegi adını verdiğim viki imlası ayrıştırıcısını kullanarak daha kolay ve anlaşılır gönderiler yazmak mümkün. Bir de şirin mi şirin etiket bulutumuz var. Bu da web 2.0'ın nimetlerinden. Gerçi yeni trend bildiğiniz gibi RIA (Rich Internet Applications) yani janjanlı flex, ajax, silverlight sayfaları. Bu uygulamalar internetin yakın gelecekteki hali hakkında ipuçları veriyor. Sanırım HTML artık flash veya applet gibi öğeleri içene gömmekte kullandığımı 4 - 5 satırlık bir geleceğe doğru gidiyor.

Karşılaşılan zorluklar

Java denilince akla yerel problemi geliyor. Oldukça sık karşılaştığım canım Türkçeme yapılan eziyetler'den kurtulamadım bir türlü. Forward ve include'a ait parametrelerde kullandığınız Türkçe karakterler bozuk gönderilmekte. Bu nedenle:

request.setCharacterEncoding("UTF-8");

ifadesi ise bu durumun çaresi fakat her betiğe tek tek yazmak zor olacağı için filter çözümü daha uygun gibi:

import java.io.*;
import javax.servlet.*;

public class EncodingFilter implements Filter {

  private String encoding;

  public void destroy() {
  }

  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    request.setCharacterEncoding((encoding == null || encoding.isEmpty()) ? "UTF-8" : encoding);
    chain.doFilter(request, response);
  }

  public void init(FilterConfig config) throws ServletException {
    encoding = config.getInitParameter("encoding");
  }
}

web.xml dosyasınada şu şekilde girdide bulunabiliriz.

<filter>
  <filter-name>EncodingFilter</filter-name>
  <filter-class>org.pengulab.penguenyuvasi.filters.EncodingFilter</filter-class>
  <init-param>
    <param-name>encoding</param-name>
    <param-value>UTF-8</param-value>
  </init-param>
</filter>
<filter-mapping>
  <filter-name>EncodingFilter</filter-name>
  <url-pattern>/*</url-pattern>
</filter-mapping>

Bunun daha kısa bir yolu varsa önerileri bekliyorum. Diğer bir yerel problemi ise veritabanına yaptığımız sorgularda baş gösteriyor. Bunu düzeltmemiz için JDBC bağlantı dizgesinin sonuna ek iki adet parametre eklememiz gerekli:

jdbc:mysql://localhost:3306/veritabani?characterEncoding=utf8&useUnicode=true
atölye, haber, inceleme, java, php, sorun çözümükaynak | yorumlar [0]


yerel ayrımcılığı

Monday, July 9, 2007 5:37:00 AM tarihinde Fırat KÜÇÜK tarafından gönderildi.

Bu girdiyi başka biri daha karşılaşırda saç baş yolar belki diye yazıorum. ubuntu 7.04 feisty dağıtımında php-pear paketini kuruyoruz. Herşey güzel. Fakat upgrade yapmaya kalkınca.

root@minik:~# php-pear upgrade-all
Will upgrade console_getopt
Will upgrade pear
Did not download optional dependencies: pear/XML_RPC, use --alldeps to download automatically

Fatal error: Call to undefined method PEAR_Registry::packageinfo() in /usr/share/php/PEAR/Dependency2.php on line 659

eveet, php paketlerini milyon defa inceleyip kodlarını bile inceledim. Sonunda sonucun yerel ayrımcılığından kaynaklandığını buldum.

root@minik:/var/log# export LANG=en_US
root@minik:/var/log# pear upgrade-all
Will upgrade console_getopt
Will upgrade pear
Did not download optional dependencies: pear/XML_RPC, use --alldeps to download automatically
pear/PEAR can optionally use package "pear/XML_RPC" (version >= 1.4.0)
downloading Console_Getopt-1.2.3.tgz ...
Starting to download Console_Getopt-1.2.3.tgz (4,011 bytes)
....done: 4,011 bytes
downloading PEAR-1.6.1.tgz ...
Starting to download PEAR-1.6.1.tgz (295,780 bytes)
...done: 295,780 bytes
downloading Structures_Graph-1.0.2.tgz ...
Starting to download Structures_Graph-1.0.2.tgz (30,947 bytes)
...done: 30,947 bytes
upgrade-all ok: channel://pear.php.net/Structures_Graph-1.0.2
upgrade-all ok: channel://pear.php.net/PEAR-1.6.1
PEAR: Optional feature webinstaller available (PEAR's web-based installer)
PEAR: Optional feature gtkinstaller available (PEAR's PHP-GTK-based installer)
PEAR: Optional feature gtk2installer available (PEAR's PHP-GTK2-based installer)
upgrade-all ok: channel://pear.php.net/Console_Getopt-1.2.3
To install use "pear install pear/PEAR#featurename"
root@minik:/var/log# pear list
Installed packages, channel pear.php.net:
=========================================
Package          Version State
Archive_Tar      1.3.2   stable
Console_Getopt   1.2.3   stable
PEAR             1.6.1   stable
Structures_Graph 1.0.2   stable

Bu bir şey mi? symfony adlı framework'de symfony propel-build-all çalışmamasının nedeni de yerel ayrımcılığıymış. Burdan çıkaracağımız ders. Bir hata olduğunda önce yabancı yereller ile dene. Sonra caanım Türkçem ile dene.

php, sorun çözümükaynak | yorumlar [1]


programlama dilleri kullanılabilirlik incelemesi

Monday, January 29, 2007 9:41:00 AM tarihinde Fırat KÜÇÜK tarafından gönderildi.

usability comparision for usual programming languages

Javy'nin tam imla yapısı oturmadan çeşitli kullanılabilirlik testleri ile durumu ele almak istiyorum. Bu şekilde daha kolay ve anlaşılır program geliştirme metodunu yakalayabiliriz sanırım. Bu testi yaparken sıralama algoritmalarından bubble sort algoritmasının codecodex.com adresindeki örnekleri üzerinde incelemeler yapmak istiyorum.

Assembly Dilinde Kabarcık Sıralama

bs proc array:DWORD,len:DWORD
 mov ecx,len
 mov edx,array
 bs_o:
 xor ebp,ebp
 bs_i:
 mov eax,DWORD PTR [edx+ebp*4+4]
 cmp DWORD PTR [edx+ebp*4],eax
 jb @F
 xchg eax,DWORD PTR [edx+ebp*4]
 mov DWORD PTR [edx+ebp*4+4],eax
 @@:
 add ebp,1
 cmp ebp,ecx
 jb bs_i
 loop bs_o
 pop ebp
 retn 8
bs endp

Aslında yukarıdaki ifade tam bir assemly dili değil. Assembly derleyicisinin (Assembler), belirli bir adrese etiket atama ve offsetler üzerinde aritmetik işlemler yapabilme gibi çeşitli güzel özellikleri ile Assembly dili bir nebze olsun daha kullanıcı dostu hale getirilmiş. HLA (High Level Assembly) adındaki çeşitli projeler sayesinde Assembly dili kodları arasında if, else gibi çeşitli üst düzey ifadeler yazabilmekteyiz. Assembly makine kodlarının anlaşılabilir hale getirilmiş hali olduğu için çok yüksek hızlarda işlem yapabilmekte. Makine dili ve özellikle üst düzey hali (HLA) paylaşılmış kütüphaneler ve durağan kütüphanelerdeki API'leri kullandığı sürece uzun kodlar nispeten daha da kısaltılmış oluyor. Fakat işlemci üzerindeki kaydedicilerin varlığından bile haberdar olmayan programcılardan EAX kaydedicisinin içeriğini yığına atmalarını beklemek hem üretkenliği hem de geliştirici sayısını azaltacaktır.

C Dilinde Kabarcık Sıralama

void bubbleSort(int *array, int length)
{
  int i, j, temp;
  int test; /*use this only if unsure whether the list is already sorted or not*/
  for(i = length - 1; i > 0; i--)
  {
    test=0;
    for(j = 0; j < i; j++)
    {
      if(array[j] > array[j+1]) /* compare neighboring elements */
      {
        temp = array[j];    /* swap array[j] and array[j+1] */
        array[j] = array[j+1];
        array[j+1] = temp;
        test=1;
      }
    } /*end for j*/
    if(test==0) break; /*will exit if the list is sorted!*/
  } /*end for i*/
      
}/*end bubbleSort*/

Assembly dilini insancıl hale getiren en önemli dil hiç şüphesiz C dilidir. Statik bir dilde yani derleme işlemi yapacağımız bir dilde derleme süresinin önemi, Dinamik bir dilin çalışma süresinin önemine kıyasla daha azdır. Eğer yazdığınız bir program 15 sn'de derleniyor ve diğer programlama dillerinin çoğunun veremediği performansı veriyor ise buna katlanabiliriz. -Ki Durağan dillerde modüllere ayrılmış bir yapı ve make ya da ant gibi derleme konusundaki yardımcı araçlar sayesinde. Yalnızca üzerinde işlem yapılan modül derlenebilir. Bu da derleme süresi yavaş olan bir dilde bile harika bir süre tasarrufu demektir. Bu manada dilin imlası derleme süresini arttırsa bile önemli olan üretkenliği de arttırmasıdır.

C dilinin eksilerinden biri ";"'dür. Aynı hataya düşen bir çok programlama dili mevcut. (PHP, Perl, Java, JavaScript, C# ....) Python bunu eğer aynı satırda iki farklı ifade kullanacaksanız ";" kullanabilirsiniz şeklindeki akılcıl çözümü ile ele almış. Zaten LF yada CR'ın çeşitli kombinasyonları ile satır sonu ayraçları bulunmakta. Noktalı Virgül'e bu manada gerek bulunmuyor.

C'nin çok satırlı yorum ifadesi ise Python'a veya çok satırlı yorum ifadesi bulunmayan diğer dillere göre bir üstünlük diyebiliriz. Fakat Python API belgelemesi için 3 tırnak arasına istediğimiz kadar satır girmemize olanak sağlayarak bu olayı kendi meşrebince çözmüş. Yani Guido diyorki eğer çok satırlı yorum yapacaksanız; Bunu API dökümantasyonu yapın. E haklıda biraz olsun. Fakat programcı çok satırlı bir yorum ile anında bir kod bloğunu saf dışı bırakabilir. Bu da gösteriyorki yeni nesil bir dilde her ikisi de bulunmalı. Özellikle Dinamik yani devingen bir betik dil ise "#" yorum ifadesine kesinlikle sahip olmalıdır. Bu ifade betiğin UNIX sistemlerinde bash tarafından işlenebilmesine olanak tanınacaktır.

Kişisel fikrim değilşken tiplerinin belirlenmesi hızlı uygulama geliştirmenin en önemli engellerinden biridir. Bir değişkenin tipinin programcı tarafından belirlenmesi derlenme süresini kısaltacaktır fakat kullanıcıya ait program kodları daha uzun bir hal alacaktır. Değişken tiplerinin belirtilmemesinin (duck typing) dezavantajı ise Java'nın sağladığı gibi bir polymorhism'e sahip olunamayacaktır. Python'da aynı isimde iki method veya işlev bu manada tanımlayamamaktayız. Bu Java gibi dillerde sanal işlev tablosu ile sağlanmakta. Bu manada bir çok biçimliliği python desteklememekte. Her iki özelliği de elde etmek için işlevlerde gerektiğinde durağan tanımlamaların da yapılabildiği dinamik bir dil tercihimdir.

PHP Dilinde Kabarcık Sıralama

function BubbleSort( $items ) {
    $temp = "";
    $size = count( $items );
    for( $i = 0; $i < $size-1; $i++ ) {
         for( $j = 0; $j < $size - 1 - $i; $j++ ) {
              if( $items[$j+1] < $items[$j] ) {
                   $temp = $items[$j];
                   $items[$j] = $items[$j+1];
                   $items[$j+1] = $temp;
              }
         }
    }
}

C hakkında olan tüm eleştirilerimiz PHP içinde geçerli tabiki :) PHP'nin ek olarak alışılmadık bir işlev sistematiği bulunmakta hemen hemen tüm işlevler hiçbir ad uzayı veya paket altında bulunmuyor. İsmini yazdığınız işlevi hemen çağırabiliyorsunuz. Hiçbir paket ya da ad uzayı (namespace) kullanılmadan işevlere direkt erişebiliyorsunuz. Fakat bu sistem, ad karmaşasını da beraberinde getiriyor. PHP'de İşlevler bir sinif içerisinde dahi değiller. Doğrudan erişim esas alınmış. Bunun için php işlevleri, konusuna göre çeşitli önekler alıyor. Mesela mysql hakkındaki bir işlev "mysql_" önekini alıyor. Bu yaklaşım yorumlayıcı hızını düşürmekte esasen ve isim kirliliğini önlemek için de zaten önekler kullanılıyor. Bu manada sinif.metod() çağırımı ile sinif_metod() çağırımı arasında kod uzunluğu bakımından pek bir fark bulunmuyor.

PHP'nin perl ile benzer bir yaklaşımı daha mevcut değişken tanımlama. Değişkenlerin başına dolar ifadesi konuluyor. Bu başlangıçta bana çok saçma gelmesine karşın. Daha sonraları değişken değişkenleri görünce mantıklı gelmişti. Örneğin $a = deneme ise $$a deneme isimli bir değişkene işaret etmekte. Fakat a = "deneme" $a deneme değişkenine eşit olsaydı daha mantıklı bir yaklaşım olacaktı.

Java Dilinde Kabarcık Sıralama

//Sorts an integer array in ascending order.
//Notice that the array passed must not be a null reference.

//Parameters:
//   data[] - the integer array to sort

//Postcondition:
//   The array is sorted in ascending order.

public static void bubbleSort(int[] data)
{
   boolean isSorted;
   int tempVariable;
   int numberOfTimesLooped = 0;
   
   do
   {
      isSorted = true;

      for (int i = 1; i < data.length - numberOfTimesLooped; i++)
      {
         if (data[i] < data[i - 1])
         {
            tempVariable = data[i];
            data[i] = data[i - 1];
            data[i - 1] = tempVariable;

            isSorted = false;
         }
      }

      numberOfTimesLooped++;
   }
   while (!isSorted);
}

C tarzı dillerin çeşitli güzellikleri de yok değil. Örneğin kıvırcık parantezler tüm programı tek satırda ifade etmemize bile olanak sağlamakta. Ayrıca ++, ! gibi operatörler ise programı oldukça kısaltmakta.

Python'da Kabarcık Sıralama

def bubblesort(l):
    "Sorts l in place and returns it."
    for passesLeft in range(len(l)-1, 0, -1):
        for index in range(passesLeft):
            if l[index] < l[index + 1]:
               l[index], l[index + 1] = l[index + 1], l[index]
    return l

Python harika operatörleri gereği bu işin üstesinden kolaylıkla geliyor. Fakat girintileme zorunluluğu programcıları iyi bir yöne doğrulturken bazen de yapmak istediklerinizi kısıtlayabiliyor. Bu konuda da ruby imdada yetişiyor.

Ruby'de Kabarcık Sıralama

def bubble_sort(list)
  list = list.clone # we should not modify original list
  for i in 0..(list.length - 1)
    for j in 0..(list.length - i - 2)
      list[j], list[j + 1] = list[j + 1], list[j] if ( list[j + 1] <=> list[j] ) == -1
    end
  end
  return list
end

Ruby girintileme kaprisi olmayan nesne modelli bir dil. Ve yazdığınız kodlar son derece okunulabilir olmakta. "in" gibi Python tarzı operatörleri de oldukça işlevsel. Ama if .... end tarzı yaklaşımdan ziyade C tarzı kıvrık parantezler daha hızlı ayrıştırılabilmekte.

assembly, atölye, c cpp, inceleme, java, php, python, rubykaynak | yorumlar [0]




1


pengulog

her hakkı erkektir © 2008 e-posta