May 05 2011

Expected identifier, String or number

Tag: GenelM. Cihat Altuntaş @ 3:39 pm

Dün beni oldukça ugrastiran bir hataya deyinmeden gecemedim. Isyerimiz bilgisayarlari yenileyince Windows 7′den cok sevdigim isletim sistemi Vista’ya ve dolayisiyla IE 7′ye geri donus yapmis oldum. Tabi kotumser olmamak lazim bu gecis sayesinde hobi olarak gelistirdigim projemi uzun zaman sonra IE 7′de denemis oldum ve asagidaki gibi bir hata ile karsilastim.

expectedidentifier

Expected identifier, string or number

Hatali kod asagidaki gibi olmasada ayni hatayi verecek bir kodu hemen yazabiliriz.

<html>
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8">

	<title>Deneme</title>

	<script type="text/javascript" charset="utf-8">
	    var Person= {
	      name :"Cihat",
	      number:100,
	      say:function(){
		  alert("My name is : "+this.name);
	      },
	      birthDate:"12.12.1990",
	    };

	    window.onload =function(){
		Person.say();
	    };
	</script>
</head>
</html>

Firefox, Chrome gibi browserlarda denedigimde ayný hatayi bir türlü alamadým sizde deneyebilirsiniz.Tabi içimden çok sevmesem de IE Developer Toolbar belki hayatimi kurtarir diyerek orada debug etmeye calistim ama yine nafile hatayi bir türlü debug edip yakalayamadim. Biraz arastirdigimda olayin syntax hatasi olabilecegine dair ipuclar buldum ama 2000 satirlik gercek Javascript dosyasi icerisinde bulmak pek kolay olmadi ve JsList‘e basvurdum.

Sagolsun bana birthdate satirinda bu uyariyi verdi. “warning: trailing comma is not legal in ECMA-262 object initializers”. Gordugunuz gibi fazladan bir virgul unutmusum diger browserlarda bu hata duzeltilse de IE 7 hata yuzunden diger JS kodlarini islemiyor ve oldukça baþ aðrýtýyor. Birthdate alanýndan sonraki virgulu kaldýrýnca herþey normale döndü. Umarým ayný hatayý alan biri olursa benim kadar uðraþmaz.


Mar 25 2011

Basit!! bir C Sorusu (Cevapları Bekliyorum)

Tag: GenelM. Cihat Altuntaş @ 6:46 pm

Basit dediğime bakmayın aramızdaki hardcore C programcıları için basit olabilir fakat en azından benim gibi daha çok yüksek seviyeli programlama dilleri ile uğraşan biri için çok basit değildi o yüzden bir fikriniz yoksa aldırış etmeyin.

Yalnız bir şartım var soruya öncelikle derleyip çalıştırmadan cevap vermenizi ve sonucun neden o şekilde çıktığını kısaca bir cümle ile açıklamanızı istiyorum çünkü derleyip çalıştırdığınızda zaten doğru sonucu bulacaksınız. Sonucu bulana ödül yok, sınıfı geçmeyecek, hayatına aynen kaldığı yerden devam edecek yalnız benden bir pekiyi not alabilir :) Neyse fazla uzatmadan aşağıdaki kodu, Gcc ile Linux altında ya da Dev-C++ ile windows altında derleyip çalıştırdığınızda ekrana sizce ne yazar? Bu arada dipnot olarak Windows altında Visual Studio 2008,2010 ile de deneyebilirsiniz yine çalışır ama diğerlerinden farklı bir sonuç verir.(neden ?)

#include <stdio.h>

void function(int a, int b) {
     int c=0;
     int* pointer;

     pointer =&c+2;
     (*pointer)+=8;
}

void main() {
  int x =0;
  int y=0;
  function(1,2);
  x = 3;
  y =5;
  printf("x=%d\n, b=%d\n",x,y);
}

Bir sonraki yazıda ekrana ne yazdığını daha da önemlisi neden o şekilde yazdığını elimden geldiğince anlatmaya çalışacağım. Ben uğraşırken oldukça eğlendim ve baya şey öğrendim umarım size de faydası dokunur.Hadi bakalım cevapları bekliyorum :)


Dec 07 2010

Okumayı bırak, Yapmaya başla

Tag: GenelM. Cihat Altuntaş @ 5:12 am

Any man who reads too much and uses his own brain too little falls into lazy habits of thinking. (Albert Einstein)

Son zamanlarda yazılım hayatımda daha çok bu felsefeyi benimsemeye başladım sizlerle paylaşmak istedim.


Sep 26 2010

Text Editör Seçimlerinin Galibi : Vim

Tag: GenelM. Cihat Altuntaş @ 7:21 am

Vim Logo

Geçtiğimiz referandum kadar ilgi çekeceğini sanmıyorum fakat Notepad, Wordpad, Notepad++ diye giden text editör serüveninde galibini Vim olarak açıklıyorum.

Yaklaşık 7-8 aydır kullandığım ana yazılım geliştirme IDE’leri haricindeki bütün text işlemleri ve Javascript programlama için Vim editörü kullanıyorum. Öğrenmesi biraz zor kullandıkça öğreniyorsunuz fakat ilerledikçe hızınız ve üretkenliğiniz oldukça artıyor. O yüzden hala öğreniyorum ve açıkçası ilerlemeyi biraz zamana bıraktım. Birkaç tuş ile normalde kullandığınız editörde birkaç dakika alan bir işlemi hızlıca yapabiliyorsunuz gerçekten çok iyi özellikleri var. Ayrıca sevdiğim özelliklerinden biride Windows, Linux ayrımı yapmadan her işletim sisteminde olması dolayısı ile Linux’ü açıp dosya editlemek ya da C,Perl.. kodu yazmak istediğinizde sağa sola bakıp kalmıyorsunuz.

Pragmatic Programmers’daki gibi

Use a Single Editor Well

yaklaşımının oldukça faydalı olduğuna inanıyorum. Bu yüzden Vim ya da benzeri bir editörü iyice öğrenmek programcı için oldukça faydalı olacaktır.Bundan sonra Vim ile ilgili öğrendiklerim ve faydalı bulduklarımı buraya yazmaya çalışacağım. Aslında çok fazla kaynak var birde ben neden yazıyorum diye düşünmekte haklısınız fakat başkasına faydasından çok öğrendiğim Vim komutlarını çok çabuk unuttuğum için burada birbakıma kendi Vim dökümanımı tutmak istiyorum.

Bu arada benzeri bir editör demiştim ya düzeltiyorum benzeri yok diyebilirim :) (Emacs,Textmate diyenleri duyar gibiyim)


Sep 26 2010

Hudson TFS Plugin Patch

Tag: Build AutomationM. Cihat Altuntaş @ 6:48 am

Hudson TFS Plugin Patch
İşyerinde CI‘dan sorumlu devlet bakanı olarak uygun CI aracını Hudson olarak belirledim. Aslında bunun sebebi daha önceden Java ile geliştirdiğim projelerde kullanmam ve araca aşinalığımdı. Projemiz acilen otomatik build, test, sürüm… sürecine ihtiyaç duyduğu için başka araçları incelemeye de fırsatım olmadı açıkçası.

Hudson Java ile yazılmış genellikle Java projelerinde CI aracı olarak kullanılsa da .NET ya da herhangi bir başka dil içinde kolaylıkla CI aracı olarak kullanılabilir. .NET ve Tfs ikilisi ile kullanmak için de oldukça güzel bir TFS Plugin‘i mevcut.

Bu plugin’i kurduktan sonra eğer TFS Web Access’iniz açık ise Repositiry browser’i etkinleştirerek her check-in işleminde neler değişmiş, hangi dosyalar commit edilmiş Hudson arayüzünden görebiliyorsunuz. Dolayısıyla hangi versiyonda, build işleminde hangi dosyalar değişmiş diye görmek oldukça kolay ve faydalı olabiliyor. Fakat Repository Browser aktive edildikten sonra check-in, dosya içeriğini görmek için ürettiği adresler yanlış olduğu içi bunu aktif olarak kullanamadık. Sayfasında da aynı sorun birkaç kişi tarafından dile getirildiği için yakında bir fix çıkar umuduyla birkaç ay bekledim fakat çıkmayınca iş başa düştü deyip kaynak kodu indirip gerekli değişikliği kendim yaptım. TeamSystemWebAccessBrowser.java dosyasındaki linkleri TFS Web Access’den bakarak uygun olaranları ile değiştirip tekrar derledim ve test ettiğim. Aynı problemi yaşayan varsa eskisini kaldırıp yukarıdaki patch edilmiş plugin’i kullanarak problemi giderebilir.


Sep 21 2010

İngilizce Sözlük Bookmarklet

Tag: GenelM. Cihat Altuntaş @ 4:56 pm

Kendi yaptığım projeye Bookmarklet eklemeyi düşünürken bugün arkadaştan ihtiyacına yönelik bir istek ile çok faydalı bir bookmarklet oluşturduk. Sesli Sözlük linkini kullandığınız browser’da adres çubuğuna sürükleyin.(IE’de manuel eklemeniz gerekiyor). Ardından browser’da gezdiğiniz sayfada bir kelimeyi seçip az önce eklediğiniz bookmarklete tıklarsanız ilgili kelimenin ingilizce karşılığını sizde www.seslisozluk.com sitesinde bulacaktır.


Jun 11 2010

Java Dergisi Yayında!

Tag: GenelM. Cihat Altuntaş @ 3:37 pm

Özcan Hocanın öncülük etmesiyle türkiyenin ilk Java Dergisi bayilerde yerini almış bulunuyor tükenmeden kapışın derim :) Gerçekten kaliteli bir içeriğe ve tamamen gönüllülük usülü ile çıkarılan derginin çok başarılı olacağına inanıyorum.
Bu benim içinde bir ilk olmuş oldu çünkü ilk defa bir yazım dergide yayımlandı. İçerisinde acizane çok sevmesem de bir adet Singleton Design Pattern yazım bulunmaktadır:) Neden sevmediğimi dergiden öğrenebilirsiniz.(Okuyucuyu teşvik edelim :) ) Ben daha elime alamadım fakat en kısa zamanda almayı düşünüyorum. Umarım herkes için oldukça faydalı bir dergi olur. Başta Özcan Hoca olmak üzere emeği geçen herkese teşekkür ederim…


May 23 2010

DynaTrace Ajax, Javascript Performans Test Aracı

Tag: Javascript,ToolsM. Cihat Altuntaş @ 9:53 am

High Performance Web Sites kitabının ilk bölümünü okurken aşağıdaki paragrafı okurken yüzüme okkalı bir tokat yemiş gibi hissetmiştim açıkçası.

Most of my web career has been spent as a backend engineer.As such, I dutifully approached each performance project as an exercise in backend optimization, concentrating on compiler options, database indexes, memory management, etc.There’s a lot of attention and many books devoted to optimizing performance in these areas, so that’s where most people spend time looking for improvements.In reality, for most web pages, less than 10–20% of the end user response time is spent getting the HTML document from the web server to the browser.If you want to dramatically reduce the response times of your web pages, you have to focus on the other 80–90% of the end user experience.

Yazar Web sitelerinde harcanan çoğu zamanın aşırı derece kötü performansa sahip değilse Database,Server tarafındaki işlemler,kodlar.. tarafından değil html’in serverdan alındıktan sonra yapılan işlemler tarafından tüketildiğini söylüyordu. Tabi benimde yazar gibi ağırlıklı tecrübem back-end olduğundan bu gerçek beni şaşırtmıştı diyebilirim. Fakat çalıştığım projede bunu yaşayarak doğrulamış olduk.

Html kodunun server tarafından alındıktan sonra browser tarafında işlerden fazla zaman alan şeylerden biride Javascript kodunun yüklenmesi,çalıştırılması.. olduğu için Javascript optimizasyonu ve performans testi daha da önem kazanıyor.Bu konuda bana oldukça yardımcı olan araçlardan biri olan DynaTrace Ajax yazılımından bahsetmeden geçersem hakkını yemiş olurum diye düşündüm. Yazılımın bedava versiyonu mevcut bende bu versiyonu kullandım ve oldukça faydalandım diyebilirim. Özellikle Javascript performans sıkıntılarının belirlenmesinde oldukça yardımcı oldu. Programın şuanda sadece Internet Explorer’a entegre olarak çalışıyor fakat bir sonraki versiyonunda Firefox desteğinin de geleceğini duyurdular. Programın kullanımı oldukça basit ve sitesinde yeride kadar kullanım dökümanı bulunuyor bu yüzden kapsamlı olarak programın nasıl kullanılacağını anlatmayacağım. Programda "Hot Spots" kısmında sayfanızın yüklenirken en çok zaman harcadığı şeyleri görebiliyorsunuz ya da özet kısmında işlemlerin ne kadarının server tarafında ne kadarının client tarafında harcandığını ve bunların kaçının CSS,Resim,Javascript olduğunu grafiksel olarak size kapsamlı şekilde gösteriyor. Aşağıda kendi geliştirdiğim bir projedeki "Hot Spots" kısmından aldığım performans göstergesini görebilirsiniz.

hotspots

Resimde gördüğünüz gibi en fazla zamanı nelerin aldığını gösteriyor. Aşağıda da InitMovieWicket fonksiyonu oldukça vakit almış bunuda bu resmi alırken farkettim bu metodu biraz optimize etmek gerekebilir. :)


May 15 2010

Javascript’in Balyozu Eval ve Array Notasyonu

Tag: GenelM. Cihat Altuntaş @ 1:29 pm

balyoz

Javascript programlama dili içerisinde eval fonksiyonu genellikle dinamik kod çalıştırmak için kullanılıyor. Örnek olarak server tarafından dönen bir JSON formatındaki nesneyi eval fonksiyonu ile Javascript nesnesine kolaylıkla dönüştürebiliriz.

Bunun dışında Javascript kodlarına baktığımda içerisinde eval gördüğüm yerlerin çoğunda kullanım yanlışlığı var ve bunun sebebi Javascript dilini iyi bilmemekten kaynaklanıyor. Eval’in yanlış kullanımına dair sıkça gördüğüm durumlardan bir tanesi şöyle oluyor.Örneğin bir nesnenin bir özelliğinde formu kayıt ederken çalıştırılacak fonksiyon ismi tutuluyor.

var form ={
	name :'Save',
	url : '/Form/Save',
	validation_function :'validateForm':
}
function save(form,element){
    eval(form.validate_function+'(element)');
    //....diger islemler
}

Yukarıdaki kodda formu kayıt ederken nesnenin özelliği olan hangi validasyon fonksiyonuna gireciğini kullanıp bu fonksiyonu çalıştırmak.Bu fonksiyon her nesne için farkı olabileceği için burada sabit bir fonksiyon çağıramıyoruz. Yani yapmak istediğimiz aslında dinamik olarak belirlenen bir fonksiyonu çalıştırmak bunu da yukarıdaki gibi eval kullanarak kodu çalıştırdığımızda Script Engine dinamik kodu tekrar derleyip belleğe yükledikten sonra çalıştırmaktadır. Bu da performans bakımından oldukça masraflı bir işlemdir.Kısacası balyoz ile sinek öldürmek diyebiliriz yani:) Bu yüzden gerçekten gerekmedikçe eval funksiyonundan kaçınmak Javascript performansı için oldukça faydalı olacaktır.

Peki yukarıdaki kodu eval kullanmadan nasıl yazabilirdik? Çok basit Javascript dilinde aşağıdaki iki ifade aynı şeyi yapar.

    nesne.method();
    nesne['method']();

Javascript içerisindeki fonksiyonlara yada nesnenin özelliklerine “.(dot)” notasyonu dışında “[](array)” notasyonu ile de ulaşabilirsiniz. Bunun dışında bilmemiz gereken birşey daha var; tanımlanan bütün fonksiyonlar global window nesnesine aitdir.Yani aşağıdaki 3 satır kod da aynı şeyi yapar

    function taklaAt(){
        //takla at...
    }

    //aynı seyi yapan satirlar
    taklaAt();
    window.taklaAt();
    window[taklaAt]();

Bu bilgileri de öğrendikten sonra ilk kodumuzu aşağıdaki gibi yazabiliriz.

var form ={
	name :'Save',
	url : '/Form/Save',
	validation_function :'validateForm':
}
function save(form,element){
    window[validation_function](element);
    //....diger islemler
}

Yukarıda ne yaptık? Window nesnesine ait olan dinamik fonksiyonumuzu array yani [] ile çağırdık.Javascript gibi performansın gerçekten önemli olduğu bir dilde yukarıdaki yaptığımız işlem oldukça iyi performans kazancı sağlayacaktır. Ayrıca debug ederken eval ile çağırılan fonksiyonların debug edilmesi normallerine göre daha zor olduğu için eval kullandığınız heryeri gözden geçirmenizde fayda olabilir.

Boşuna Eval is Evil dememişler :)


May 03 2010

NHibernate Enum mapping ve kaybolan saatler

Tag: NhibernateM. Cihat Altuntaş @ 4:13 pm

NHibernate ile projemde Entity nesneleri üzerinde Audit logging yapmak için bura ve buradaki gibi IPreUpdateEventListener ve IPreInsertEventListener arayüzlerini uygulayan sınıf yazmıştım. Buraya kadar herşey normal gidiyordu. Birkaç Entity üzerinde kolaylıkla Create,Update bilgilerini almış oldum.

Aşağıdaki gibi User ve Movie nesnelerimi map ettim.

 public class User
 {
        private IList<Movie> movies = new List<Movie>();

	//diger kodlar

	public void AddMovie(Movie movie)
	{
		//add movie
	}

 }

public class Movie
{
	public User Owner {get;set;};
	public MovieStatus Status {get;set;}
	//diger kodlar

}
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain" assembly="Domain">
  <class name="User,Domain" table="Users">
    <id name="UserID" column="UserId" type="Guid">
      <generator class="guid.comb" >
      </generator>
    </id>

    <bag name="Movies" generic="true" inverse="true" cascade="save-update">
      <key column="UserID"></key>
      <one-to-many class="Movie,Domain"/>
    </bag>
  </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Domain" namespace="Domain">
  <class name="Domain.Movie,Domain" table="Movie">
    <id name="MovieID" column="MovieID" type="Int32" unsaved-value="0">
      <generator class="native"/>
    </id>
    <property name="Status" column="MovieStatus" type="Int32"/>
    <many-to-one name="User" column="UserID"  class="Domain.User"/>
  </class>
</hibernate-mapping>

Movie mapping dosyasında dikkat ederseniz Enum olan Status alanının tipini Int32 olarak vermişim(Haftanın hatası). Tabi bunun için NHibernate’i suçlamamak lazım. Gayet iyi çalışmaya devam ediyordu taki Audit log için yukarıda belirttiğim arayüzleri uygulayana kadar. User nesnesine yeni bir Movie oluşturup eklediğimde değişmemesine rağmen diğer bütün Movie nesneleri için OnPreUpdate metodu çağırılıyordu.

Tabi bir anlam vermediğimden dolayı her yolu denedim diyebilirim. Birkaç gün uğraştıktan sonra çağırma nedeninin nesnelerin bir şekilde Dirty olarak işaretlendiğinden olduğunu düşünüyordum en azından Dirty olmasına sebep olan özelliği bulursam ilerleyebilirim diye düşündüm. Ardından hayat kurtaran Persister.FindDirty metodunu buldum.

Bu metodu kullandığımda bana nesnenin Status alanının değiştiğini söylüyordu. Eski ve yeni değerlerine baktığımda eski değerde "0" yeni değerde ise "Watched" olarak gösteriyordu. Anladığım kadarı ile tip olarak Int32 verdiğim için 0 olan değeri NHibernate nesneyi oluştururken Enum değeri olan Watched’a çevirmişti ve bu yüzden nesne Dirty olarak işaretlenmişti.Sorun Status alanının Int32 tipini kaldırdığımda ortadan kalktı. Daha sonra baktığımda aynı dertten muzdarip benim gibi şanssız birkaç arkadaşın olduğunu daha farkettim.

Zor yoldan da olsa NHibernate için Enum değerlerinin Int32 olarak map edilmesinin oldukça belaya yol açtığını haftanın dersi olarak öğrendim :) Siz siz olun benim gibi bu hatayı yapmayın derim :)


Next Page »