Levenshtein uzaklığı 2 karakter katarı arasında tanımlanmış, bir katardan diğer katara dönüşümde minimum değişim sayısını verir. dönüşüm işlemlerinde ekleme, silme ve katar içinde karakter değişimleri kabul edilmektedir. Aynı zamanda “değişim uzaklığı (edit distance)” olarak da bilinmektedir. Örn: levenstein_distance(samantha,Sam) = 5 Pseudo kodu int LevenshteinDistance(char s[1..m], char t[1..n]) { declare int d[0..m, 0..n] for i from 0 to m d[i, 0] := i for j from 0 to n d[0, j] := j for j from 1 to n { for i from 1 to m { if s[i] = t[j] then d[i, j] := d[i-1, j-1] else d[i, j] := minimum ( d[i-1, j] + 1, // deletion d[i, j-1] + 1, // insertion d[i-1, j-1] + 1 // substitution ) } } return d[m,n] }       C Kodu: #include <stdlib.h> #include <malloc.h> #include <string.h> int levenshtein_distance(char *s,char*t); int minimum(int a,int b,int c); int levenshtein_distance(char *s,char*t) { int k, i, j, n, m, cost, *d, distance; n = strlen(s); m = strlen(t); if(n!=0 && m!=0) { d = malloc((sizeof(int))*(m+1)*(n+1)); m++; n++; for(k=0;k<n;k++) d[k]=k; for(k=0;k<m;k++) d[k*n]=k; for(i=1;i<n;i++) for(j=1;j<m;j++) { if(s[i-1]==t[j-1]) cost=0; else cost=1; d[j*n+i]=minimum(d[(j-1)*n+i]+1,d[j*n+i-1]+1,d[(j-1)*n+i-1]+cost); } distance=d[n*m-1]; free(d); return distance; } else return -1; } int minimum(int a,int b,int c) { int min=a; if(b<min) min=b; if(c<min) min=c; return min; }   Java Kodu: public static int getLevenshteinDistance (String s, String t) { if (s == null || t == null) { throw new IllegalArgumentException("Strings must not be null"); } int n = s.length(); int m = t.length(); if (n == 0) { return m; } else if (m == 0) { return n; } int p[] = new int[n+1]; int d[] = new int[n+1]; int _d[]; int i; int j; char t_j; int cost; for (i = 0; i<=n; i++) { p[i] = i; } for (j = 1; j<=m; j++) { t_j = t.charAt(j-1); d[0] = j; for (i=1; i<=n; i++) { cost = s.charAt(i-1)==t_j ? 0 : 1; d[i] = Math.min(Math.min(d[i-1]+1, p[i]+1), p[i-1]+cost); } _d = p; p = d; d = _d; } return p[n]; }   Kaynaklar: http://www.merriampark.com/ldc.htm http://www.merriampark.com/ldjava.htm .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } tweetmeme_source = 'makcura'; tweetmeme_service = 'bit.ly'; Tags: | Categories: C | JAVA | Algoritma
Microsoft teknolojilerini benimsemiş ve bunları kullanarak projeler geliştiren biri olarak, yazdığım programın kod kısmında veri tabanı bağlantıları ile uğraşmam. Ancak bu yazımda, daha önceki yazılarımda da bahsettiğim dönem projemde karşılaştığım ve internette aramak zorunda kaldığım durum: Java içinde MySQL veri tabanı bağlantılası yapma konusunu. Aslında çok kolay. Yine de sizle paylaşmak istedim. Connection dbConn = null; String dbUserName = new String("root"); //Veri tabanı kullanıcı adı String dbPassword = new String("root"); //Veri tabanı şifresi String dbURL = new String("jdbc:mysql://127.0.0.1/blg361g02"); //Veritabanı yeritry { Class.forName("com.mysql.jdbc.Driver").newInstance(); dbConn = DriverManager.getConnection(this.dbURL, this.dbUserName, this.dbPassword); //Bağlantının sağlandığı satır System.out.println("Database connection established"); } catch (Exception e) { System.err.println("Cannot connect to database server"); } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Tags: | Categories: JAVA | SQL
.NET teknolojilerinde en çok kullanılan özelliklerin arasında Repeater gelir. Kullanması da çok basittir. Kaynak veriyi verirsiniz, gerekli parametreleri girersiniz, her şey kendiliğinden olur biter. Bu kolaylıktan yola çıkarak Wicket içerisinde Repeater adında bir component aramaya başladım, ve buldum: org.apache.wicket.markup.repeater.RepeatingView İnternette yaptığım araştırmalarda bu aracın kullanımına dair çok karışık (en azından bana öyle geldi) bilgilere ulaştım. Evirdim çevirdim, ancak bir türlü kullanmayı beceremedim. Keza GridView i de öyle. Proje geliştirenler bilir; GridView, Repeater ın özelleşmiş bir versiyonudur. Durumu kara kara düşünürken bir anda karşıma PageableListView denen şahane bir component çıktı. Her derdime çare oldu, yaralarımı iyileştirdi, projemi yeniden ayağa kaldırdı. Bu komponent, org.apache.wicket.markup.html.list.PageableListView kütüphanesi altında yer almakta. Sınıfımızı import ettikten sonra kodlarımızı yazmaya başlayabiliriz. Öncelikle html sayfamızı oluşturalım: <div> <table> <tr> <th>Plaka</th> <th>Şasi No</th> <th>Sahip</th> <th>Durum</th> <th>Düzenle</th> <th>Sil</th> </tr> <tr wicket:id="carList"> <td><span wicket:id="plaque">[plaque]</span></td> <td><span wicket:id="sasi">[sasi]</span></td> <td><span wicket:id="ownerNameSurname">[owner]</span></td> <td><span wicket:id="status">[status]</span></td> <td><a href="#" wicket:id="edit">Düzenle</a></td> <td><a href="#" wicket:id="delete" >Sil</a></td> </tr> </table> </div> <div wicket:id="navigator"></div> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }   Sayfamızın html kodları bundan oluşmakta. Html kısmında dikkat edilmesi gereken nokta: PageableListView göstergemizi göstereceğimiz html componentinin wicket:id değerini bir tablonun <tr> değerinin içine attribute olarak eklemek. Mesela <table> etiketinin içine eklenmiş olsaydı her satır için en baştan bir tablo oluşturması gerekecekti. Listeleme esnasında da gerçekten göze hoş görülmeyen bir durum oluşuyor.  Şimdi java kodlarını yazmaya başlayalım: PageableListView lw = new PageableListView("carList", liste, 5) { @Override protected void populateItem(ListItem item) { final Cars car = (Cars) item.getModelObject(); item.add(new Label("plaque", car.getPlaque())); item.add(new Label("sasi", car.getPlateTag())); item.add(new Label("ownerNameSurname", car.getOwner().getName() + " " + car.getOwner().getSurname())); if (car.getStatus() == 0) { item.add(new Label("status", "İşleme alınmayı bekliyor")); } else if (car.getStatus() == 1) { item.add(new Label("status", "İşleme girdi")); } else if (car.getStatus() == 2) { item.add(new Label("status", "İşlem bitti/Teslim edilebilir")); } else { item.add(new Label("status", "Araç sahibinde")); } item.add(new Link("edit") { @Override public void onClick() { } }); item.add(new Link("delete") { @Override public void onClick() { car.DeleteCar(); }); }; add(lw);MarkupContainer carListNavigator = add(new PagingNavigator("navigator", lw)); Şimdi java kodları hakınca biraz konuşalım. Yukarıda görüldüğü gibi öncelikle PageableListView nesnesi yaratıyoruz. “carlist” html dosyasındaki karşılığının ismi, “liste” verilerimizin tutulduğu List<Cars> cinsinden bir liste. En sondaki 5 sayısı da bir sayfadana kaç tane satırdan oluşacağını bize bildiriyor. Nesne yaratıldığında içinde yer alan PopulateItem methodunu otomatik olarak NetBeans ekliyor. Netbaens in yararını gördüğüm ilk nokta. Daha sonra bu nesne içerisine teker teker diğer nesnelerimizi ekliyoruz. (PopulateItem içinde) PagingNavigator ise sayfalar arasında geçimizi sağlaycak. Oluşturması sadece 1 satır, kullanması çok eğlenceli… Sonuçta karşımıza çok güzel bir sonuç çıkıyor: Tags: | Categories: JAVA

Aralık 0925

Wicket - Login

Wicket ile karşılaştığım ilk sorunlardan biri: Sayfa içerisinde Submit işlemi. Aslında çok kolay gibi bir işlemmiş (Ben de yaptıktan sonra öğrendim). Bu işlemi bir Login sayfası üzerinde göstermek istedim sizlere. Zaten interaktif bir web projesinde en başta olması gereken durumdur Login.html sayfası. Html sayfasını aşağıda olduğu gibi oluşturuyoruz: <form wicket:id="loginForm"> <table> <tr> <td>TC Kimlik No: </td> <td><input type="text" wicket:id="username"/></td> </tr> <tr> <td>Şifre: </td> <td><input type="password" wicket:id="password"/></td> </tr> <tr> <td></td> <td><input type="submit" wicket:id="submitButton" value="Giriş"/></td> </tr> </table> </form> .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Şimdi sıra geldi bu sayfa arkasında çalışacak olan Java kodlarını yazmaya. Onlar içinde aşağıdakileri yazmak yeterli olacaktır: private String username; private String password; public Login() { super(); RequiredTextField userNameField = new RequiredTextField("username", new PropertyModel(this, "username")); PasswordTextField passField = new PasswordTextField("password", new PropertyModel(this, "password")); passField.setResetPassword(false); Form form = new LoginForm("loginForm"); form.add(userNameField); form.add(passField); form.add(new Button("submitButton") { @Override public void onSubmit() { String username = Login.this.getUserName(); String password = Login.this.getPassword(); //VeriTabanı bağlantıları ve kontrolleri }); add(form); } class LoginForm extends Form { public LoginForm(String id) { super(id); } } protected String getUserName() { return username; } protected String getPassword() { return password; } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; } Yukarıda yazdığımız tüm kod parçalarının bütünü aşağıdaki resimdeki gibi kullanıcı karşısına çıkmaktadır: Java kısmında yazılan PropertyModel kod parçasının ne işe yaradığına ileriki yazılarımda değineceğim. Tags: | Categories: JAVA

Aralık 0925

Wicket Nedir ?

Daha önceki yazımda bahsettiğim gibi bu dönem içerisinde aldığım bir dersin dönem projesini yapmak için Wicket adındaki bu frameworkü tanımam, anlamam ve kullanmam gerekiyordu. Wicket’ı tanıdık, öğrendik, hazmettik ve sonunda projemizi teslim ettik.   Peki, bu Wicket nedir? Çok önemli bir soru. Wicket hakkında herhangi bir bilgisi olmayanlar gibi, bu projeye başlarken ben de “buda ne ?” sorusunu kendime sormuştum. Wicket kısaca; Java programlama dili için geliştirilmiş bir Framework. Web uygulamaları geliştirmek amacıyla kullanılıyor. Bu durumu ilk öğrendiğimde ASP.NET platformu kullanarak proje geliştirmiş olmamın bana çok yardımcı olacağını düşünmüştüm. Ancak yanılışım. Wicket, Web projeleri geliştirmek için kullanılan frameworklerin atası durumundaymış. Microsoft teknolojilerinde gördüğüm birçok olanağı burada bulamadım. (Bu güne kadar, ciddi anlamda yaptığım projelerde sadece .NET platformunu kullanmamdan ötürü ASP.NET ile karşılaştırma yapıyorum.) Wicket kullanımı esnasında çok sıkıntı çektim (Özellikle Türkçe kaynak konusunda). Projede kullandığım kodları ve karşılaştığım sorunları burada sizlerle tek tek paylaşacağım. Ana Sayfa: Apache Wicket Tags: | Categories: JAVA

Kasım 0904

Mercurial Kullanımı

Java ile karşılaştığım ilk problem: Projemizi grup olarak yaptığımızdan ve sürüm denetiminin hoca tarafından kontrol edilmek istenmesinden ötürü bir depo kullanmamız gerek. Depoyu kurmak kolay oldu, ancak daha sonra bu depo ile bilgisayarlarımızdaki Netbeans’leri haberleştirmekte biraz sıkıntı çektik ve benim bu yazıyı yazmamı sağladı. Sorun: Mercurial Mercurial Nedir? Mercurial, ücretsiz kaynak kontrol yönetim aracıdır. Yazılımcıya süre sezgisel bir arayüz kullandırarak, her boyuttaki projesi için büyük avantaj sağlattırır. Versiyon kontrolünde kullanılır. Subversion gibi kullanıcı tabanlı mimariye sahip değildir. Her kullanıcıya yerel bir kopya bırakır, bu sayede internetten bağımsız da çalıştırılabilir. Yapı tasarımından sayesinde revizyonlar arasındaki farkları kolayca algılayabilir, zaman içerinde kolayca geriye dönebilir. Bu sayede OpenJDK veya Netbeans teki büyük projeler için tercih edilir. Platformdan bağımsız şekilde çalışır. Nasıl Çalışır? Ben Mercurial’ı Netbeans içinde kullandığım için orada il kurulumun nasıl yapılması gerektiğini ve kullanım sırasında karşıma çıkan sorunlardan sizlere söz edeceğim. Sürüm kontrolünde kullanıldığından uygulamanın depolandığı bir yere ihtiyaç duyulmakta. Yerel ağda depo görevi görebilecek bir sunucudan veya dışarıdan ücretsiz olarak depo hizmeti veren şirketlerden reposity adresi alınmalıdır. Ben bu hizmeti mercurial.intuxication.org adresi üzerinden ücretsiz ve kaliteli şekilde sağlamaktadır. Bu depoyu kullanabilmek için Netbeans’te haricen Mercurial programı kurulmuş olmalıdır. Bu programı da bu linkten indirip kurabilirsiniz. Projemizi oluşturduk ve repositye ilk dosyaların göndermesi yapmak istiyoruz. Bunun için Netbeans’te bulunan projeyi öncelikle initiliaze yapmak gerek. Bu işlemi Team -> Mercurial –> Initiliaze Project adımları izlenerek yapılabilir. Diğer adımda ise proje üzerinde sağ tıklanarak Mercurial -> Options adresi tıklandıktan sonra gelen ekrana push ve pull işlemlerinin yapılacağı reposity adresinin girilmesi gerekmektedir. (Örn: http://mercurial.intaxication.org/hg/deneme) Bundan sonraki adımda proje üzerinde yine sağ tıklanır, Mercurial -> Commit seçeneği tıklanır. Açılan pencerede projede yapılan en son değişikler sıralanır. Buraya bir yorum yazdıktan sonra proje sunucuya gönderilmeye hazırdır. Team -> Mercurial -> Share -> Push to default tıklanarak repositye gönderme işlemi başlatılır. Bu sırada reposity adresi size bir kullanıcı adı ve şifre soracaktır. Burada reposityi yaratan kişinin yarattığı kullanıcı adları ve şifreleri kullanılır. Team -> Mercurial -> Share -> Pull from default basamaklarını izlenerek de reposity de bulunan dosyalar yerelde bulunanlarla karşılaştırılarak farklılıkların yerele indirilmesi sağlanır. Ve göndermiş veya almış bulunmaktayız. Pekâlâ, projeye yeni biri eklendi ve bu dosyalara onun da ihtiyacı var. Yeni kişinin bilgisayarında gene yukarda yazılan Mercurial programı ve Netbeans kurulu olması gerekli. İlk proje çekimi için özel bir yöntem uygulayacağız. Öncelikle projeyi yerel bilgisayara kopyalamamız gerek. Bu işlemi Team -> Mercurial -> Clone Other… seçeneğinden gerçekleştiriyoruz. Açılan pencerede reposityimizin adresini yazıyoruz. Zaten Netbeans size yardımcı olacaktır. Bu sayfada reposityinin kurulum özelliklerine göre kullanıcı adı ve şifre yazmanız gerekebilir. Artık yerelde projeninin bir kopyası var. Gerisi yukarıdaki işlemlerin aynısı uygulanacaktır. Tags: | Categories: JAVA

Kasım 0904

Hello Java

.NET teknolojilerinden sonra biraz da özgür yazılıma yönlenmek istedim. Aslında biraz zorunlu bir yöneliş bu… Bu dönem aldığım Veri Tabanı Yönetim Sistemleri dersindeki projemizi Java ve MySQL kullanarak yapmamız gerekmekte. Visual Studio’nun bana sağlamış olduğu gerek görsel gerek kullanış açısından kullanıcı dostu IDE’yi bırakıp Netbeans’in gri sayfalarında dolaşmaya başladım. Java da bulduğum ilginç özellikleri, karşılaştığım sorunları buradan sizlerle paylaşacağım. Tags: | Categories: JAVA