Cronjob ve Moodle Cron İşleri

Cron Nedir?

Cron çok basit ifade etmek gerekirse, zamanlandırılmış görevlerdir. Cron görevleri 2 kısımdan oluşur. Birinci kısım cron’un ne zaman çalışacağını, ikinci kısım ise
çalıştığı zaman ne yapacağını belirtir. İlk kısım, yani cron’un ne zaman çalışacağının belirtildiği kısım 5 alandan oluşur ve alanlar bir tane boşluk karakteri (space) ile ayrılır.

# * * * * * çalıştırılacak komut
# ┬ ┬ ┬ ┬ ┬
# │ │ │ │ │
# │ │ │ │ │
# │ │ │ │ └───── Haftanın günü (0-6 arası değer veya *) (0 = Pazar’ı ifade eder.)
# │ │ │ └────────── Ay (1-12 arası değer veya *)
# │ │ └─────────────── Gün (1-31 arası değerveya *)
# │ └──────────────────── Saat (0-23 arası değerveya *)
# └───────────────────────── Dakika (0-59 arası değer veya *)

“*” karakteri ise “her” anlamı taşır. Örneğin “her hafta”, “her gün”, “her saat” vb.

Örneğin, her gün saat 23:59’da belli bir dizini temizlemek istiyorsanız:

Örneğin, aynı dizini, sadece Pazartesi’den Cuma’ya her gün saat 23:59’da temizlemek istiyorsanız;

Aynı cron görevini şöyle de yapabilirdik:

Eğer bir Cron görevinin birden çok işi yapmasını istiyorsak && kullanırız:

Cron Görevi oluşturmak ve pattern ile boğuşmamak için aşağıdaki araç kullanılabilir:

http://www.cronmaker.com/

Oluşturduğunuz cron görevini test etmek için ise aşağıdaki araç:

http://www.easycron.com/predictor

Moodle ve Cron Görevleri

[Terminal] – Cron görevini çalıştır:

[Tarayıcı] – Cron görevini çalıştır:

* Öncelikle; Site yönetimi -> Güvenlik -> Site ilkeleri adresinden “cronremotepassword” değeri belirlenmelidir. Çalıştır:

[curl-wget] – Cron görevini çalıştır:

Cron Görevleri Hazırlamak

Sistemde kendi oluşturduğun bir cron görevi var mı kontrol et:

Sistemde diğer userların oluşturduğu bir cron görevi var mı kontrol et:

Diğer userların oluşturduğu cron görevlerine müdahale et:

Moodle için cronjob’ı www-data user’ı üzerinden oluşturmak süreklilik açısından tavsiyedir.
Cronjob eklemek için dosyayı düzenle:

Dosyaya görevi ekle ve kaydet:

Hepsi bu kadar.

Kartaca'nın Eğlenceli İş Başvurusu

Takip ettiğim firmalardan biri olan Kartaca “yeni mezun yazılım uzmanı” aradığını duyurmuş.

Oldukça eğlenceli ve seçici olmuş, hazırlayanların eline sağlık.

Başvuru sayfası
Başvuru sayfası – ilk adım

Başvuru sayfasına ulaşınca karşımıza bu HEX çıkıyor. Decode edince ise bir wiki bağlantısından ibaret olduğunu anlıyoruz.

Sayfanın kaynak kodlarına baktığımda ise kabak gibi Base64 hashi karşımıza çıkıyor. Esasen ben önce Base64’ü decode etmiş sonra HEX’i ASCII’ya çevirmiştim. Yani HEX pek bi işime yaramamıştı 🙂

kartaca-base64
Başvuru sayfası – ikinci adım

HEX’i decode ettiğimde karşıma başvuruyu nasıl yapabileceğime dair bi yol haritası çıktı:

En eğlenceli kısım bundan sonra başlıyor. Açıkcası REST mevzuuna pek aşina değildim ama stackoverflow’a üç beş dakika göz atarak olayı hallettim.

urllib2, httplib, httplib2, pycurl, requests gibi zilyon tane kütüphanesi sebebiyle elim direk sadık dost Python’a gitsede, başvuruda PHP’nin adı geçtiği için PHP ile yapayım dedim. Açıkcası PHP’den çok anladığım söylenemez (python’a nazaran) yine de şöyle bir betik yazdım:

Sıra geldi betiği çağırmaya ve sonuçları gözlemeye. Terminal’den:

ve hepsi bu kadar.

Hep böyle güzel iş ilanları görmek dileğiyle.

PHP PDO'da in Koşuluna Array Bind Etmek

Bir kaç gündür, üniversitelerin çeşitli sınav sonuçları için yayınladıkları kontenjanlarını içeren bir uygulama yazmakla meşgulüm. Kulağa basit gelse de beklediğimden daha çok iş gücü gerektiren bir proje oldu. Bu uygulama geliştirme sürecinde iki temel sorunu aşmam gerekti:

  1. Veritabanını performanslı ve maintainable bir şekilde kurgulamak.
  2. Karmaşık sorguları PDO ile hazırlayabilmek.

Veritabanı meselesini Louis Davidson abimizin ilham verici yazısı eşliğinde, 2-3 saatlik kalem-kağıt bir hesaplama ve kafa yorma süreciyle çözdüm.

Meraklısına: https://www.simple-talk.com/sql/database-administration/ten-common-database-design-mistakes/

PHP’de 2 yıla yakın bir süredir veritabanı bağlantıları ve işlemleri için PDO kullanıyorum. Nedenleri ise şurada:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

pdo-to-db

Gel gelelim ki PDO bir extension olması sebebiyle bazı kompleks durumlar için her zaman açık çözümler sunmuyor ve insana saç baş yoldurtabiliyor. Yaşadığım durum, 4 grup altında toplanmış toplamda 20 checkbox’tan gelen verileri çeşit çeşit olasılıklarda sorguya dahil edebilmeye çalışmaktı. Örneğin 3 değer POST edebilen bir checkbox grubundan yalnızca biri seçilmiş olsaydı “=” veya “like” clause’u yeterli olabilirdi ancak seçim sayılarının arttığı durumlarda bir “array” gönderilecek ve bunları sorguya like veya = ile dahil etmek mümkün olmayacaktı ki akabinde clause’u “in” olarak değiştirmek gerekliydi. Fakat gelen array’i implode ettiğimde ise, PDO her zaman buna string veya float muamelesi yaparak yalnızca ilk değeri işleme alıyor, diğerlerini ise görmezden geliyordu. Örnekleyerek anlatayım:

Şöyle bir array gelsin ve bunu virgüller ile ayrıştıralım ki veritabanı sorgusuna uyumlu olsun:

Böylece elimizde $degerler adında ve temsili olarak ‘a,b,c,d’ yapısına sahip bir “string” oldu. Bunu sorguya bind etmek istersek:

gibi bir şey olacak. Sorgu bu şekildeyken “bind” temelde şöyle çalışıyor:

Burada ihtiyacım olan ise sorgunun şu şekilde çalışması:

Yani bir nevi dizi elemanlarını parçalamak. Ancak belirtmem gerekir ki, dizi elemanlarının sayısı kesin değil! Devamlı değişebiliyor ve post işlemi sonrasında bir döngüden geliyor! Bu yüzden statik çözümler ile bunu çözmek zor.

PDO’nun bu konu için bir çözümü veya yeteneği yok. Bu yüzden çözüm yolunu MySQL’in “find_in_set” fonksiyonu ile sağlayacağız:

ve hepsi bu kadar! Stackoverflow’dan görebileceğiniz üzere, bu sorun baya bir kişiye sıkınt yaratmış. Çözümler ve süper tartışma-örnekleri için:

http://stackoverflow.com/questions/920353/php-pdo-can-i-bind-an-array-to-an-in-condition

http://stackoverflow.com/questions/1586587/pdo-binding-values-for-mysql-in-statement?lq=1

PHP'de Gelen Veri Kontrolü

Merhaba,

Formlardan gelen verileri, php’nin bazı metodları ile süzgeçleyebilir-kontrol edebiliriz. Bu sayede daha güvenli form işlemleri sürdürebiliriz.

1) trim() fonksiyonu

trim() fonksiyonu, parametresiz kullanımda stringler üzerinde whitespace var ise, bunları tespit eder ve devre dışı bırakır. trim() fonksiyonu str ve charlist olmak üzere 2 parametre alabilir. Whitespace içerisine neler girer peki?

Kullanımı şu şekildedir ;

Bildiğiniz üzere burada ilk parametre zorunlu, ikinci parametre ise opsiyoneldir. İkinci parametre Php 4.1.0 sürümünde opsiyonel olarak eklenmiştir.

İkinci parametre olmadan kullanıldığı taktirde, aşağıda listelenmiş olan karakterleri string içerisinden çıkartır.

  • ” ” (ASCII32 (0x20)), an ordinary space.
  • “\t” (ASCII9 (0x09)), a tab.
  • “\n” (ASCII10 (0x0A)), a new line (line feed).
  • “\r” (ASCII13 (0x0D)), a carriage return.
  • “\0” (ASCII0 (0x00)), the NUL-byte.
  • “\x0B” (ASCII11 (0x0B)), a vertical tab.

trim() fonksiyonunun parametreli kullanımı ise şu şekildedir ;

Bu örnekte, text içerisinden “=” karakteri temizlenecektir.

trim’e benzeyen ltrim() ve rtrim() fonksiyonları ise aynı işlemi soldan veya sağdan olmak üzere işletir. Başlarında ki “l” ve “r” harfi left-right ikilisini sembolize ediyor.

2) addslashes() fonksiyonu

Veritabanı işlemlerinde tek ve çift tırnakların sıkıntı yarattığını bilmeyen yoktur sanırım (bknz: Sql injection)

addslashes() fonksiyonu tek ve çift tırnak karakterleri için kaçış işlemi uygular.

Kullanımı ise ;

Kullanıcı tek veya çift tırnak içeren bir veriyi göndermiş ise, başına bir tane “/” ekleyerek, kaçış işlemi gerçekleştirir.

3) stripslashes() fonksiyonu

addslashes() ile kaçış işlemi gerçekleştirilmiş olan stringi bastırmak istediğimizde, “/” karakterlerini temizlemek için kullanırız.

Oldukça basit kullanımı olan bir fonksiyon olduğu için, kısaca geçiyorum.

4) htmlspecialchars() fonksiyonu

Özel html karakterlerini, öz değerlerlerine döndürür.

Örneğin ;

  • & (ampersand) => &
  • ” (double quote) => "
  • ‘ (single quote) => '
  • < (less than) => &lt;
  • > (greater than) => &gt;

Biri mecburi, ikisi opsiyonel olan üç parametre ile çalışır. Bunlar string, flags ve charset parametreleridir.

string => Fonksiyonun üzerinde çalışacağı string değerini belirtir.

flags => Bu parametre, tek ve çift tırnaklara karşı uygulanacak muameleyi belirler. Default olarak ENT_COMPAT çalışır, bu durumda yalnızca çift tırnaklar dönüştürülür. ENT_QUOTES durumunda ise hem tek tırnaklar hem çift tırnaklar dönüştürülür. ENT_NOQUOTES durumunda ise tek veya çift tırnaklar üzerinde herhangi bir dönüştürme uygulanmaz.

charset => Dönüştürme işleminde kullanılacak olan karakter setini belirler.

Uygulayabileceğiniz karakter setleri;

ISO-8859-1 ISO8859-1 Western European, Latin-1
ISO-8859-15 ISO8859-15 Western European, Latin-9. Adds the Euro sign, French and Finnish letters missing in Latin-1(ISO-8859-1).
UTF-8 ASCII compatible multi-byte 8-bit Unicode.
cp866 ibm866, 866 DOS-specific Cyrillic charset. This charset is supported in 4.3.2.
cp1251 Windows-1251, win-1251, 1251 Windows-specific Cyrillic charset. This charset is supported in 4.3.2.
cp1252 Windows-1252, 1252 Windows specific charset for Western European.
KOI8-R koi8-ru, koi8r Russian. This charset is supported in 4.3.2.
BIG5 950 Traditional Chinese, mainly used in Taiwan.
GB2312 936 Simplified Chinese, national standard character set.
BIG5-HKSCS Big5 with Hong Kong extensions, Traditional Chinese.
Shift_JIS SJIS, 932 Japanese
EUC-JP EUCJP Japanese

Şimdilik bu kadar.

Detecting Browser and Browser Capabilities with PHP

Introduction

Detecting browsers and collecting data about browser capabilites can be done with Javascript or Activex, but there is still a long way away from being 100% accurate.

There are thounsands of browser types to detect. In every update of IE/Firefox or etc. the specific version of the browsers are changing.

Now, there are over 120.000 known browser UserAgents.

So, It’s hard to collect all of the data about browsers, and testing-detecting.

What is Browscap

Gary Keith says in http://browsers.garykeith.com/index.asp ;

Microsoft had a good idea when they created browscap.dll and browscap.ini to use with their web server for browser identification.

In theory, someone at Microsoft would routinely update the browscap.ini file and make it available to its customers. As a result we would all have reliable browser identification in order to know exactly what features the client’s browser supports.

Sadly, Microsoft never made any attempt to keep the file up to date.

There was a brief wellspring of volunteers who did a good job of maintaining browscap.ini for a while. Those sources are now either intentionally out of date as a way to drive product sales, or no longer exist. I can’t blame them for giving up as this is not an easy project to maintain.

Here is what I do as part of my project.

Shortly after midnight on Sunday morning the website log files for this site and over thirty other sites of various types are downloaded for analysis. Once downloaded the log files are analyzed on a number of levels. Over the years I have developed a number of systems for automatically collecting the data I need for further analysis. The vast majority of new user agents each week are variations on existing user agents in my database, so when the analysis is complete I usually wind up with around two dozen truly new and unique user agents to investigate. I typically do my research on Sunday afternoon and only a few new user agents from major search engines and popular browsers are eventually added to the files in any given week.

User agent detection is still a long ways away from being 100% accurate though because there will always be new user agents that aren’t in the files yet and hence won’t be properly identified. There are also the bugs in both browscap.dll and PHP’s get_browser(), which my files also support, to contend with. And of course there are always spoofed user agents. User agents that claim to be one thing, but in fact are often badly behaved bots masquerading as well behaved bots like Googlebot.

Approximately once a week the raw data in my database is compiled into various reports, including the all-important browscap.ini file for browser identification, and gets uploaded to this website.

Compatibility

browscap.ini is compatible with IIS 5 and later,

browscap.ini is compatible with PHP 5 and later,

browscap.ini is compatible with Sun One Asp on Windows.

Download

http://browsers.garykeith.com/downloads.asp

Frequently Asked Questions

http://browsers.garykeith.com/faq.asp

Configuration (Optional)

When you checked your php.ini file on your php folder or serve, search for “browscap”, you will find this :

[browscap]
; http://php.net/browscap
; browscap = extra/browscap.ini

You can configure the settings, and the location for browscap file.

As I said in the tittle, this is optional.

Browscap Parser

You can use one of this parsers :

https://github.com/garetjax/phpbrowscap

http://alexandre.alapetite.fr/doc-alex/php-local-browscap/index.en.html

Setting Up

Put Browscap.php (the parser) and php_browscap.ini in the same folder. Next create a new file called test.php in the same directory and put this inside it:

Next create a sub-folder called cache, Browscap.php will store information for quick access here. Now if you visit test.php in your browser (assuming it is on your server) you should see your browser info displayed to the screen!

To access individual tidbits of information simply access $data as an object:

Update

Update your browscap.ini file  very often, I offer you to check the updates weekly, or twice in a week.