Author Archive

Mysql rolling record appender procedure

Tuesday, January 24th, 2012

Bir tablo üzerinde bir alana bağlı kalarak son birkaç kaydı tutmam gerekti, ben de bir prosedür yazdım. Bu prosedür önce yeni kaydı yapıyor, ardından son kaydı bularak (örnekte 3 kayıda göre çalışıyor) ondan eski kayıtları siliyorum. Bütün bu işlemleri de transaction içerisinde yaparak daha da sağlıklı çalışmasını bekliyorum.

DELIMITER $$
CREATE DEFINER=`dbuser`@`%` PROCEDURE `update_visits`(_member_id int, _last_visit datetime)
BEGIN
declare _max_date date;
start transaction;
insert into VISITS (member_id, last_visit) value (_member_id, _last_visit);
select last_visit into _max_date from VISITS where member_id = _member_id order by last_visit desc limit 2, 1;
delete from VISITS where member_id = _member_id and last_visit < _max_date;
commit;
END

Ubuntu full screen flash for dual views

Friday, December 23rd, 2011

Ubuntu’da çift ekran çalışırken bir ekranda tam ekran flash video izleyip diğer ekranda çalışamıyorsunuz. Öteki ekrana tıkladığınız anda pencere normal haline dönüyor. Buna engel olmak için /etc/adobe/mms.cfg dosyası içerisinde (yoksa yaratıyoruz) aşağıdaki satırları yazıp kaydediyoruz. Restart sonrasında çalışmaya başlıyor.

OverrideGPUValidation=true
EnableLinuxHWVideoDecode=0

Düzeltme: sanırım bu yöntem de bir işe yaramıyor :(

Ebay ql.io projesini yayınladı

Tuesday, December 13th, 2011

Çok fazla açık kaynaklı projesi bulunmayan Ebay (https://www.ebayopensource.org/) ql.io projesi ile teknik anlamda beni etkileyen bir projeye imza atmış. ql.io nedir derseniz özetle istemci tarafından tek bir istek ile sunucu tarafında birden çok web servis isteğini birleştirilip dönebilme özelliği sunan bir yazılım. Arkaplanda nodejs (http://nodejs.org/) kullanıyor.

Daha kolay anlamak için örnek yapabiliriz. Web console (http://ql.io/console) açtıktan sonra rest servislerinizi bir veritabanı tablosu gibi tanıtıyoruz. Örnek olarak


-- A table to find products
create table eBay.FindProducts
on select get from "http://open.api.ebay.com/shopping?callname=FindProducts&appid={^apikey}&responseencoding=JSON&version=725&QueryKeywords={^QueryKeywords}&MaxEntries={max}&ProductSort=Popularity&AvailableItemsOnly=true&siteid={siteid}"
using defaults max = "5", apikey = "{config.eBay.apikey}", sideid = 0
resultset 'Product';

-- A table to get product details
create table eBay.ProductDetails
on select get from "http://open.api.ebay.com/shopping?callname=FindProducts&appid={^apikey}&responseencoding=JSON&version=725&siteid={siteid}&ProductID.type={^ProductType}&ProductID.Value={^ProductID}"
using defaults apikey = "{config.eBay.apikey}", sideid = 0
resultset 'Product';

-- A table to get product reviews
create table eBay.ProductReviews
on select get from "http://open.api.ebay.com/shopping?callname=FindReviewsAndGuides&ProductID.Value={#^ProductID}&ProductID.type={^ProductType}&appid={^apikey}&responseencoding=JSON&version=745&siteid={siteid}"
using defaults apikey = "{config.eBay.apikey}", sideid = 0;

Run ettiğimiz zaman bu servisler tablo olarak oluşuyor. (show tables diyerek görebilirsiniz). Daha sonra örnek bir istek yapıyoruz:

prodid = select ProductID[0].Value from eBay.FindProducts where
QueryKeywords = 'macbook pro';
details = select * from eBay.ProductDetails where
ProductID in ('{prodid}') and ProductType = 'Reference';
reviews = select * from eBay.ProductReviews where
ProductID in ('{prodid}') and ProductType = 'Reference';

return select d.ProductID[0].Value as id, d.Title as title,
d.ReviewCount as reviewCount, r.ReviewDetails.AverageRating as rating
from details as d, reviews as r
where d.ProductID[0].Value = r.ProductID.Value;

Çalıştırdığınız zaman arka planda servisler birbirini beklemeden çağırılıyor ve sonuç birleştirilerek size dönüyor.

Bence mutlaka incelenmesi gereken çok başarılı bir proje.

Detaylı bilgi:
http://ql.io/
http://www.ebaytechblog.com/2011/11/30/announcing-ql-io/

Apache Pig ile Veri İşleme

Monday, September 12th, 2011
Hadoop üzerindeki verileri işlemek amacıyla SQL syntax’ına benzer bir dil olan Apache Pig projesini inceliyorum. Örnek olarak log dosyalarındaki ip adreslerini gruplayarak gösteren bir Pig scripti yazdım, şöyle:

/**
* @author haqen
*/
register pig-utils.jar;
A = LOAD ‘error.log’ using com.haqen.pig.MyCustomLoader() AS (in: map[]);
B = FILTER A by in#’_ip’ is not null;
C = GROUP B by in#’_ip’;
D = FOREACH C GENERATE group, COUNT($1) as ip_count;
E = FILTER D BY ip_count > 1;
F = ORDER E BY ip_count DESC;
G = LIMIT F 30;
DUMP G;

Log’u parse etmek için kendi Loader’ımı yazdım. Bu yaştan sonra SQL öğreniyormuş gibi, öğrenmesi sıkıcı ama sonuç alınca keyifli oluyor. Buna alternatif olarak Hive projesi var, onu da kullanıyorum ancak Hive daha ziyade işlenmiş veri üzerinde analiz yapmaya yarıyor diye düşünüyorum. Pig ile ise Map Reduce yazamadan, Java ile uğraşmadan analiz yapabiliyorsunuz. İncelemeye devam edeceğim.

apache üzerinden statik dosyaları sunmak

Thursday, August 18th, 2011

Siteniz üzerindeki javascript, css ve imajlar gibi statik dosyaları daha hızlı sunmak için apache üzerinde çok kullanışlı modlar mevcut. Geliştirdiğim java uygulamasının tüm statik dosyalarını apache üzerinden ayrı bir subdomain üzerinden sunuyorum. Bu subdomainin altındaki .htaccess dosyasına aşağıdaki blogdaki ayarları girerek hem bu dosyaların sıkıştırılmasını sağlıyorum, hem de header expire parametresi girerek bunların uzun süre tekrar çekilmemesini sağlıyorum. .htaccess üzerinden bu ayarların yapabilmesi büyük nimet.

http://www.samaxes.com/2008/04/htaccess-gzip-and-cache-your-site-for-faster-loading-and-bandwidth-saving/

Bu sayede sayfanın yüklenmesinde inanılmaz bir hızlanma oluyor. Aslında statik dosyaları sunmak için apache’den daha hızlı web sunucular da var, ngnix veya lighttp gibi.