Archive for the ‘programming’ Category:
Mac’de port kullanımını görmek
için güzide bir komut var. işte şu:
sudo lsof -i -P
Ubuntu için de şu kullanışlı
sudo netstat -lntp
Servlet için Test Driven Development
Test driven development çok önemli bir olay. Standard java projelerinde junit kullanıyorum. Ancak bir web uygulaması yazıyorsanız servlet’leri test etmek bir dert olabilir.
Daha önce bu meseleyi şu şekilde çözüyordum: model ve controller class’larım için junit testlerimi yazıyor, servletlerin logic’ini daha basit bırakıyordum. Ancak yeni işimde (Oyun stüdyosu) komplex servlet implementasyonu ile karşılaştığım için servlet testi yazmam farz oldu.
Servlet’lerdeki testing problemi şu: bir container’a (tomcat gibi) ihtiyacınız var. Lakin muhteşem kütüphane HttpUnit kendi build-in container implikasyonuyla (türkçesini bilemedim) geliyor.
Kurulum için web sitesinden kaynağı indirip, jar ve dependency kutuphaneleri classpath inize eklemelisiniz.
Neyse lafı kısa kesip örneğe geçeyim. Örnek olabilecek en basit servlet testi. Ama giriş için iyidir bence.
Test kodu aşağıdaki gibi, bu benim için çalışan konfigurasyon.
@Test
public void testServlet() throws IOException, SAXException, ServletException {
File webXml = new File("./web/WEB-INF/web.xml");
// web.xml deki servlet tanımlarından olayi cozuyor
ServletRunner sr = new ServletRunner(webXml, "/BeerV1");
// servlet asagidaki gibi register de edilebiliyor ayrıca.
// sr.registerServlet("BeerSelect", BeerSelect.class.getName());
ServletUnitClient sc = sr.newClient();
WebRequest req = new PostMethodWebRequest("http://localhost:8080/BeerV1/BeerSelect.do");
req.setParameter("color", "Light");
InvocationContext ic = sc.newInvocation(req);
BeerSelect bs = (BeerSelect) ic.getServlet();
String servletInfo = bs.getServletInfo();
assertEquals("The servlet info is wrong", servletInfo, "My super beer selector");
// evet invocation context kullandıgımız için servlet metodlarını manual olarak cagiriyoruz.
bs.doPost(ic.getRequest(), ic.getResponse());
String color = bs.getColor();
assertEquals("The color is wrong", color, "Efes Light" );
}
Bu da servlet
public class BeerSelect extends HttpServlet {
private String _color = "";
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
try{
String email = this.getServletConfig().getInitParameter("email");
request.setAttribute("email", email);
out.println("
Beer advisor
");
BeerExpert exp = new BeerExpert();
List res = exp.getBrands(request.getParameter("color"));
request.setAttribute("styles", res);
for( String s : res ){
this.setColor(this.getColor() + s);
}
RequestDispatcher dsp = request.getRequestDispatcher("result.jsp");
dsp.forward(request, response);
} finally {
out.close();
}
}
@Override
public String getServletInfo() {
return "My super beer selector";
}
public String getColor() {
return _color;
}
public void setColor(String _color) {
this._color = _color;
}
}
Bu kadar
Zend Framework’da bir Bug
Call to undefined method Zend_View_Helper_Placeholder_Container::ksort()
Bu hatayı zend framework bir şekilde veriyor. Sanıyorum bir bug’dan kaynaklanıyor bu sorun. Yeni versionlarda bu hata giderilmiş olması lazım. Lakin en kolay (geçici çözüm) ise aşağıdaki metodu Zend/View/Helper/Placeholder/Container/Abstract.php dosyasına eklemek.
Oh yeah.
/**
* Sort the array by key
*
* @return array
*/
public function ksort()
{
$items = $this->getArrayCopy();
return ksort($items);
}
Htaccess dosyası
Htaccess dosyasında kullandığım tanımlamaları sürekli unutuyorum. Burayı da not defteri gibi kullanmaya başladım. Yaptığım olay sırayla şu: Öncelikle uygulama ortamını belirliyorum. Buradaki ortama göre bir config dosyası yüklüyorum çünkü. Sonra optimizasyon için ETag ları set ediyorum. Sora Expire header’ları ayarılıyorum. Sonra her bişeyi Gzip ile sıkıştırıyorum (apache deflate mod sağolsun). Daha sonrası da klasik url rewrite
SetEnv APPLICATION_ENV production
Header unset ETag
FileETag None
Header set Expires "Thu, 15 Apr 2012 20:00:00 GMT"
Header unset Last-Modified
# Insert filter
SetOutputFilter DEFLATE
# Netscape 4.x has some problems...
BrowserMatch ^Mozilla/4 gzip-only-text/html
# Netscape 4.06-4.08 have some more problems
BrowserMatch ^Mozilla/4\.0[678] no-gzip
# MSIE masquerades as Netscape, but it is fine
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html
# NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48
# the above regex won't work. You can use the following
# workaround to get the desired effect:
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
# Don't compress images
SetEnvIfNoCase Request_URI \
\.(?:gif|jpe?g|png)$ no-gzip dont-vary
# Make sure proxies don't deliver the wrong content
Header append Vary User-Agent env=!dont-vary
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} -s [OR]
RewriteCond %{REQUEST_FILENAME} -l [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^.*$ - [NC,L]
RewriteRule ^.*$ index.php [NC,L]
JQuery Calendar Olayları
Gerçekten süper takvim uygulamaları var jquery ile yazılmış. Benim de şu anki projem için ihtiyacım olduğu için araştırdım. Çünkü js kısmına çok vakit ayırmak istemiyorum. şöyle bir araştırma içinde 9 adet calendar uygulaması var. Bunlardan benim hoşuma gidenler sırasıyla şöyle:
http://wiki.github.com/robmonie/jquery-week-calendar/
http://www.filamentgroup.com/…/ui_css_framework/
http://www.bytecyclist.com/projects/jmonthcalendar/
http://arshaw.com/fullcalendar/
http://www.stefanoverna.com/wp-content/tutorials/ical_like_calendar/
finder da cut seçeneği
malesef disabled edilmiş halde. madem cut olayını implement ediyorsun niye disable olarak sunuyorsun sayın apple. eminim bu gerzekçe olayın da bi açıklaması vardır. ama bu olayı düzeltmenin kolay yolu aşağıdakini terminale yazmak.
defaults write com.apple.finder AllowCutForItems 1
Php Configure command doesnot work on mac osx with intel arch
I have wanted to run my php extensions that I’ve wrote earlier in a linux machine on mac os x snow leopard, but the intel architecture came with the snow leopard does not allow me to that. Basically my extensions are written in 32 bit but my development environment is in 64bits now. By the way I am using Zend Server CE for now.
Normally you should build php for your new extension by running the following commands
phpize
./configure (add some configuration parameters here)
make
But it won’t help and gives an error like this:
mach-o, but wrong architecture in Unknown on line 0
The solution is to add some extra build parameters before the configuration command:
MACOSX_DEPLOYMENT_TARGET=10.6 CFLAGS=’-O3 -fno-common -arch i386 -arch x86_64′ LDFLAGS=’-O3 -arch i386 -arch x86_64′ CXXFLAGS=’-O3 -fno-common -arch i386 -arch x86_64′ ./configure
Then you’re ready to go.
Mac için Svn client
2 gün önce leopard’dan snow leopard’a geçtim. svn repositorylerini eclipse ya da netbeans gibi bi IDE içinden yönetmeyi sevmiyorum. ide’ler genellikle hantal olduğu için bir de svn ile ağırlaştırmayayım diyorum. ayrıca bir çok farklı proje için farklı ideler kullandığım için, bağımsız bir svn client’ı kullanmak istiyorum. ayrıca komut satırını da diff olayı zor olduğu için kullanmıyorum.
leopard kullanıyorken windows’daki muhteşem program tortoise svn e benzeyen (ama onun yarısı kadar güçlü olmayan) ScpPlugin kullanıyordum. bir svn tool’undan istediğim temel şeyleri karşılıyordu. hızlıca update edeyim ve commit edeyim o kadar. ancak malesef scpplugin snow leopard da çalışmıyor. bunu öğrenince de hummalı bir svn client arayışına girdim.
svn client dan en büyük beklentim bedava olması (tercihen open source) olması idi. dolayısıyla ilk bulduğum program svnx oldu. bu enteresan bir program. kullanımı sezgisel değil. bir süre nasıl commit edileceğini falan bulamadım. daha sonra birşeylere tıklayınca başka pencereler açılmaya başladı. benim için gui çok önemli değil. lakin commit edeceğim dosyaları seçtirmemesi/exclude ettirmemesi yüzünden bu programdan vazgeçtim.
2. denediğim program zigversion oldu. ticari kullanımı ücretli ama ev kullanıcıları için bedava lisans veriyorlar. sitesindeki video özelliklerini gayet iyi anlatıyor. commit ederken tüm dosyaları hızlıca diff edebilmek müthiş bir özellik. aynı şekilde değişiklik yapılmış dosyaların bir önceki revision ile karşılaştırılabilmesi de güzel bir özellik.
zigversion son zamanlarda gördüğüm en iyi svn client diyebilirim. ama kötü özellikleri de var. öncelikle commit (check in) edilecek dosyaları hariç (exclude) ederken üzerine sağ tıklayıp ignore demek gerekiyor. bu çok güzel bir özellik ama herbirinin yanında bir checkbox olsaydı çok daha iyi olurdu. diğer bir kötü özellik (bir önceki kötü değil eksik özellikdi aslında) ise programı açtığımızda önümüze çıkan ilk penceredeki “add/import existing working copy” özelliğinin iyi çalışmaması. malesef bende bu özellik çalışmadı. sıfırdan checkout yapıp önceki değiştirdiğim dosyaları elimle yeni working copy ye taşımam gerekti.
sonuç olarak zigversion da karar kıldım. eğer düzgün bir svn client bulamasaydım şu aralar fovori idem olan netbeans in svn client ını kullanacaktım. olmadı eclipse in svn client ı gayet kullanışlı gözüküyor. ancak zigversion biraz daha geliştirilirse ve bedava olmaya (ev kullanıcıları için) devam ederse benim tek tercihim olacak gibi gözüküyor. hatta tortoise svn den bile kullanışlı diyebilirim.
hallelujah
Safari için Firebug benzeri araç
Evet böyle birşey yapmış safarideki abiler. Çok güzel çok kullanışlı olmuş. Firebug’ın eline su dökemese de yine de en azından bunun olması safariye sempatimi artırdı. Ancak Mac üzerindeki safari’de varsayılan olarak bu özellik kapalı geliyor. Aşağıdaki komutu terminal’de çalıştırdıktan sonra herhangi bir elementin üzerine sağ tıklayıp “inspect element” dediğinizde “firebug for safari” aktif edilmiş oluyor.
defaults write com.apple.Safari WebKitDeveloperExtras -bool true
Scalability in PHP
PHP nin sevdiğim tarafı iyi scale edilebiliyor olması. Bu konuda güzel bi prezentasyon buldum.


