28 Ocak 2013 Pazartesi

İnternet Girişimcilerine Acı Gerçekler



2013 yılının bu ilk günlerinde, yakın zamanlarda kafamı meşgul eden bir hususta görüşlerimi paylaşmak istedim. İkibinli yılların ortalarından itibaren Facebook'un kurucusu Mark Zuckerberg'inki gibi hikayeler tüm dünyada olduğu gibi ülkemizde de "girişimcilerin" gözlerini parlatır oldu. Kısacık zamanlarda milyonlarca insana erişmenin getireceği zenginlik çok kimsenin rüyalarını süslüyor. Ancak....

Ne yazık ki iş artık hiç ama hiç kolay değil!...

Milyonlarca insana hitab edebilecek bir sistemin geliştirilmesi çok ileri düzey mühendislik bilgisi ve tecrübesi gerektiriyor. Özetle
muhteşem bir fikrim var, bulurum yeni mezun birkaç yazılımcı, veririm üç beş kuruş, yazdırırım yazılımı...

türünden düşüncelere sahip olanlar, hayallerine veda buselerini hemen verebilirler zira bu iş ne yeni mezun yazılımcıların yapabileceği bir iş, ne de üç beş kuruşa yapılabilecek bir iş!

Neden bu işin bu kadar basit olmadığını tüm cepheleriyle anlatmaya kalkarsam çok uzun bir yazı yazmam gerekir. Bu yazıda işin sadece teknoloji boyutunu, onun içinde de sadece yazılım mimarisi boyutunu ele almaya çalışacağım.

Muhteşem fikirlerimizi dünyanın kullanımına arz etmek için bir yazılım uygulaması geliştirmemiz gerekiyor. Yazılımın tıpkı yeni yapılacak bir bina gibi önce mimarisinin belirlenmesi gerekiyor. İşte ilk zorluk burada karşımıza çıkıyor: Öyle başdöndürücü gelişmeler var ki bırakın derinlemesine öğrenmeyi, neredeyse takip etmek bile çok zor. Sadece son bir sene içerisinde ortaya çıkıveren mimari bileşenleri ve yazılım trendlerini listeleyen bir çalışma rahatlıkla bir master tezi olabilir!...

Ciddi, gelecekte yeniden yazılması gerekmeden varlık gösterebilecek bir web 2.0 projesinin yazılım mimarisini şekillendirirken düşünülmesi gereken o kadar çok şey var ki! Mesela kimsenin düşünmediği en basit yerden başlayalım: "loglama"! Kod seviyesinde debugging amaçlı seviyesi belirlenebilir logging için mesela log4j, slf4j, logback gibi ilk anda aklıma gelen altenatif logging frameworkler var. Uygulama seviyesinde daha çok güvenlik amaçlı loglama (kim oturum açtı, ne işlem yaptı vs.) tamamen ayrı bir konu. Performansı düşürmeden, ayarlanabilir seviyelerde planlanmalı. Zira biliyoruz ki bu tür logları tutmak kanuni açıdan gerekli olabilir.

Güvenlik meselesi tamamen ayrı bir dünya. Authentication - Authorization için role based backend'ler kurgulanacak. Apache Shiro, Spring Security, JAAS gibi kendini ispatlamış framework'ler var ama hangisinin seçileceğini bilmek için ön çalışma sürecine ek olarak -hangisi seçilirse seçilsin- bir öğrenme süreci olacak. Arka tarafta openldap, active directory, OID gibi seçeneklerden birinin kullanılıp kullanılmayacağı da ayrı bir konu. Session management, SSL, encyrption gibi konulara hiç girmiyorum.

Artık neredeyse hiçbir modern uygulama klasik teknolojilerle kodlanmıyor. Servis odaklı mimari için de bir framework seçimi gerekiyor. REST, SOAP, WCF, RPC, JAVA RMI gibi seçenekler var. REST'i seçsen XML, JSON alternatiflerinden birini seçmek gerekiyor. Şu an RestEasy ya da Jersey gibi implemantasyonlardan birinin seçimi de önemli. Biri ya da diğerini tercih etmek için gereken araştırma-öğrenme sürecini yazmak lazım bir kenara.

Yoğun servis odaklı bir sistemde gelen mesajlar için bir queing mekanizması kullanmak artık şart. Asenkron çağrılarla gelen mesajların mutlaka işlendiğini garanti etmek için seçebileceğimiz messaging framework'ler içinde ilk aklıma gelenler ActiveMQ, OpenMQ, FuseMQ, RabbitMQ.

Ana platform için JAVA tarafında J2EE, Spring 3, EJB 3, JSF 2 gibi alternatifler var. Her biri kendi içinde derya deniz. Frontend tabi ki çok çok önemli. Kesinlikle HTML5 uyumlu bir javascript framework seçilmeli GWT, Primefaces, Sencha, Dojo, jQuery, YUI, Prototype, MooTools.. İşin mobil tarafı unutulmamalı: Sencha Touch, jQuery Mobile, vs....

Mobil uygulamalar, IOS, Android ve artık Windows 8 platformları için Native Os App olarak ayrı ayrı mı geliştirilecek. HTML5 tabanlı bir çözüm mü olacak? PhoneGAP gibi hem crossplatform hem native bir yol mu seçilecek...

Abartmamak için service orchestration - ESB konularına girmiyorum ama UltraESB, FUSEESB, Apache Camel, Apache ServiceMix, Mule, WSO2, Talend alternatifleri bir yerlerde bekliyor.

ORM kullanılıp kullanılmayacağı önemli bir karar. Hibernate 4 en kuvvetli aday ama performans üzerinde olumsuz etkisi ortada. MyBatis ya da Apache DBUtils gibi tam ORM sayılmayan daha lightweight kütüphaneler tercih edilebilir. Tabi relational database kullanacaksak. Şu an trend NoSQL veritabanları yönünde. Meşhur Bigdata konsepti gündemdeyken artık  MySQL-MariaDB, PostrGreSQL, MsSQL, Oracle, DB2 gibi veritabanları pek tercih edilmemeye başladı. Yeni adaylar sayıca bayağı çok: MongoDB , Cassandra, CouchDB, Redis, Riak, HBase, Couchbase, Neo4j, Hypertable, ElasticSearch, Accumulo, VoltDB, Scalaris.

Bu yazdıklarım sadece JAVA tarafındaki alternatifler. PHP ve .Net tarafında bu derece haberdar değilim doğrusu. Ruby On Rails hatta Python gibi popülerlik atağındaki teknolojileri daha da az biliyorum. Mesela son zamanlarda bir Node.js humması var ki şu anda daha yeni yeni bakmaya başladım...

Yazılım mimarisinin belirlenmesi derken kastettiğim bu kadar çok alternatif arasından doğru seçimleri yaparak kimliklendirme, yetkilendirme, loglama, servis, ui, ve temel db işlemleri gibi herşeyin standardize edildiği bir integrated framework'un hazırlanması. Bütün bunlar görüldüğü gibi, "yeni mezun yazılımcı çocukların" falan altından kalkabileceği şeyler değil. Hatta çok tecrübeli bir mühendisin dahi altından kalkabileceği şeyler değil. Birkaç tane ateş gibi, meraklı, araştırmacı, neyin ne olduğunu bilen, işin belli bir kısmına iyice odaklanmış, mesleğini seven, tecrübeli mühendisi bir araya getirmek ve birlikte çalıştırabilmek lazım. Bunun için bol bol para ve ayrıca da zaman lazım. 2000'lerin başlarında, hatta ortalarında olsaydık belki Zuckerberg tarzı (bir developer + bir iş geliştirmeci ile) bir mucize gerçekleştirme şansımız daha fazla olabilirdi ama artık milyonların aktif kullanıcının yoğun kullanımını hedefleyen web 2.0 projeleriyle rekabet edebilecek yeni sosyal medya projeleri çok ciddi yatırım gerektiriyor maalesef. Sosyal medya olarak değerlendirilecek, yani milyonlar değilse bile yüzbinleri kendine çekebilecek fikirlerin düşük bütçelerle hayata geçirilmesi çok zor.

İşin kötüsü tüm bunların sağlanması da başarıyı garanti etmiyor. Yüksek bütçeler, tecrübeli mühendisler ve yüksek motivasyon sağlansa da başarıyı yakalamak biraz şans işi. Google Plus, arkasında google olmasına rağmen beklenen başarıyı yakalayamadı mesela. Ne maddi destek sıkıntısı vardı, ne teknoloji, ne tanıtım... Ama olmadı işte...

Şu an bir kamu kurumunun altyapısının tasarlanması için bu konularda kafa patlatıyor, araştırmalar yapıyorum. Devletin projelerine bakıyorum hepsi rezil durumda. Yöneticiler vaziyetten habersiz... Mesela son zamanda ortaya çıkan redhack'in YÖK EDYS'sini patlatması hadisesine bakın. Güvenlik işini, dünyadan habersiz junior adamlara bırakırsanız işte aynen böyle madara olursunuz. Bunun, sizin "muhteşem fikrinizin dünyayla buluştuğu" bir sosyal medya sitesinde yaşandığını, insanları gizli ya da sınırlı olarak koyduğu kişisel bilgilerinin ortaya döküldüğünü düşünsenize! O gün o site biter...

Kimsenin hayallerini yıkmak istemem ama bu yola çıkacak olanlar en azından ne ile uğraştıklarını bilsinler istedim. Bir twitter, bir facebook, bir instagram kurgulamak, öyle Joomla ile Wordpress ile web sitesi kurmaya ya da (.net'ci arkadaşlar alınmasın ama) Visual Studio'da sürükle bırak yöntemleriyle web uygulaması yapmaya benzemez.

20 Nisan 2011 Çarşamba

[Ljava.lang.String;@

Tomcat'te bir servlet yazdınız diyelim. Yapılan requestlerin içeriğini görmek istiyorsunuz. request.getParameterMap() ne güzel map döndürüyor hemen gösteririm dediniz ama Map'inize ait Key değeri doğru görüntülendiği halde value değeri şöyle görüntüleniyor:

[Ljava.lang.String;@ ve bir takım rakamlar...

Bunun sebebi dönen objenin bir string değil array olması. [Ljava.lang.String;@ ifadesi dönen değerin bir String array olduğunu gösteriyor. O zaman doğru tipe Cast ederek değeri alabiliriz. Uzun uzun döngüler yazmak istemeyenler java.util paketinde bulunan Arrays.deepToString metodunu kullanabilirler.

Tüm bu anlattıklarımı yapmak için servlet'in doPost metodu içinde:

logger.debug("GELEN İSTEK: " + toString(request.getParameterMap()));

yazıp şu metodu ekleyebiliriz:

private String toString(Map m) {
StringBuilder sb = new StringBuilder("[");
String sep = " , ";
for (Object object : m.keySet()) {
sb.append(sep)
.append(object.toString())
.append(" -> ")
.append(Arrays.deepToString((String[]) m.get(object)));
}
return sb.append("]").toString();
}

12 Ekim 2010 Salı

JBPM 4.4 ile MySQL

JBPM 4.4 ile çalışırken veritabanınızı HSQL'den MySQL'e çevirirseniz. "jbpm.hibernate.cfg.xml" dosyanızı değiştirmeniz gerekir.

Eğer gerekli değişikliği yaptıktan sonra şu hatayı alıyorsanız:

SEVERE: Cannot delete or update a parent row: a foreign key constraint fails (`jbpm4`.`jbpm4_execution`, CONSTRAINT `FK_EXEC_INSTANCE` FOREIGN KEY (`INSTANCE_`) REFERENCES `jbpm4_execution` (`DBID_`))


Yapmanız gereken "jbpm.hibernate.cfg.xml" dosyasındaki "MySQLDialect" ifadesini "MySQLInnoDBDialect" ile değiştirmektir. Nihai dosya şöyle birşey olmalıdır:


Değişen dosyanın içeriği şöyle olmalıdır:


<?xml version="1.0" encoding="utf-8"?>

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpm4</property>
<property name="hibernate.connection.username">jboss</property>
<property name="hibernate.connection.password">jboss</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.format_sql">true</property>
<!-- property name="hibernate.show_sql">true</property-->


<mapping resource="jbpm.repository.hbm.xml" />
<mapping resource="jbpm.execution.hbm.xml" />
<mapping resource="jbpm.history.hbm.xml" />
<mapping resource="jbpm.task.hbm.xml" />
<mapping resource="jbpm.identity.hbm.xml" />

</session-factory>
</hibernate-configuration>






9 Ekim 2010 Cumartesi

Evrak Takip Sistemi (ETS) nedir? Dijital Arşiv (DA) nedir? Doküman Yönetim Sistemi (DYS) nedir? Ne değildir?

Evrak Takip Sistemi (ETS) bir kuruma dışarıdan gelen ve kurumdan dışarıya gönderilen resmi yazışmaların kayıtlarının bir veritabanında saklanarak ihtiyaç halinde o dokümanlara fiziksel olarak erişmeyi kolaylaştırmak için kullanılan uygulamadır. Evrakların kendileri dijital ortamda saklanmaz sadece geliş-gönderiliş zamanı, geldiği-gittiği kurum, teslim alan-eden kişinin kim olduğu, elle verilen numarası ve fiziksel olarak hangi dosyada, hangi klasörde, hangi depoda saklandığı gibi künye bilgileri –biz buna meta data deriz- saklanır. Bunu bir kütüphane otomasyonu gibi düşünebilirsiniz. Yazılım, aradığınız kitabın hangi rafta olduğu ya da şu an mevcut olup olmadığı bilgisine erişim maksadıyla kullanılır. Kitabın kendisini –içeriğini- size ekranda göstermez. İçerikte bazı kelimeleri arama imkanı vermez.

Dijital Arşiv Sistemleri ETS’den bir adım öteye giderek indekslenen dokümanları dijital ortama aktararak saklama ve bunlara erişim imkanı veren sistemlerdir. Kağıda basılı (hard copy) belgelerin tarayıcılar vasıtasıyla taranarak elektronik ortama aktarılması esasına dayanır. Aktarılan belgeler çoğu kez, hem fiziksel hem dijital ortamda saklanır. Yani kağıt ortamı tamamen kaldırılmaz. Bunun kamilen olabilmesi için ilişkide bulunan tüm kurumların ıslak imza ile aynı hukuki geçerlilikte olan dijital imzalı elektronik dokümanlarla haberleşmesi gerekir.

Dijital İmza

Ülkemizde Dijital İmza konusunun hukuki-teknik altyapısı tam oluşmamıştır. Elektronik İmza kanunda değişmesi gereken noktalar için çalışma yapılmaktadır. Dijital imzayla bir belgeyi imzalamak o belgenin imzalandığı andan itibaren değişmediğini garanti altına almak demektir. Dijital imzayla imzalanan bir belgenin parmak izi (hash) bilgisi çıkarılır. Bu doküman içinde bir nokta bile değişse hash bilgisi bozulmuş olacağından imzası geçersiz olur. Dijital imzanın bir görevi de imzalayan kişiyi belirlemektir. Bunun için kişilerin ellerinde akıllı kartlar olmalı ve bir pin numarası girerek imzalama işlemi tamamlanmalıdır. Kanunda eksik olan konu zaman damgası konusudur. Dijital imza sertifikaları belli zaman aralıkları için verilmektedir. Belgenin imzalandığı anda imzalayan kişinin sertifikasının geçerli olması için bir zaman sertifika otoritesinin (CA) güvenilirliğini tanıdığı bir zaman sunucusundan (time server) zaman bilgisi güvenli yoldan alınmalıdır. Yani offline durumda yapılan dijital imzanın hukuki geçerliliği yoktur zira kişiler bilgisayarlarının saatini geri alarak sertifikaları expire etmiş olsa bile imzalamayı gerçekleştirebilirler. Bazı dijital imza sağlayıcıları time server sorguları için para charge ediyorlar. Yani her imza için (kuruşlar mertebesinde de olsa) ek para istiyorlar.

Elektronik imza konusunda sahanın derin bir cehaleti söz konusudur. Veritabanındaki alanların ya da canlı -on the fly- oluşturulan raporların imzalanması diye bir şey söz konusu değildir. Bir PDF’i bir Word belgesini, bir jpg resmi imzalayabilirsiniz. Yani elinizde dijital bir doküman olmalıdır.

Repository

Dijital Arşiv sistemleri çeşitli formattaki evrakı (resim ya da yazı) iki şekilde saklar. Kimisi depolama ortamı (repository) olarak Oracle gibi ilişkisel veritabanlarını, kimi de dosya sistemlerini kullanır. Bir de google gibi evrak indeksleme konusunda korkunç bir hıza ve yatay genişlemeye ihtiyaç duyan yazılım şirketlerinin kendileri için geliştirdikleri (GFS-Google File System veya NoSQL) gibi yüksel performanslı sistemler, alt yapılar vardır. Veritabanını kullanmayı tercih edenlerin sistemlerin yüksek doküman sirkülasyonu olan kurumlarda arşivlenen dosyaların sayısı hızla arttığı için ciddi performans problemleriyle karşılaştıkları bilinmektedir.

OCR (Optical Character Recognition – Optik Karakter Tanıma)

DA sistemleri dijitize edilen içeriği aranabilir halde sunmak için OCR ismi verilen teknolojiyi kullanır. Tarayıcılarda taradığımız yazıların bilgisayar için aslında manzara resminden farkı yoktur. O reim içinde yazılanların text haline getirilmesi için ek bir çabaya ihtiyaç vardır. Gelişmiş matematiksel algoritmalarla resim şeklinde taranan dosyaların içindeki harfleri tanır, kelimelere, cümlelere çevirir ve sonra indeksler. Bu özel bir uzmanlık alanıdır ve bizim yapacağımız bir iş, yazacağımız bir bileşen değildir. Bu bileşeni bu işi kendine uzmanlık alanı olarak seçen firmalardan birinden ücreti mukabili alıp kullanırız.


İndeksleme

İndeksleme işi de oldukça kompleks matematik algoritmalar gerektirir. Zira kullanıcı herhangi bir kelime içinde geçebilecek herhangi üç harfle de arama yapabilir, bir cümle ile de. Arana kelimelerin metin içinde birbirleriyle uzaklığının hesaplanması isabetli sonuçlar döndürmek için gereklidir. Örneğin “dijital arşiv” ifadesini arayan birisine döndürülen sonuçlarda dijital ve arşiv kelimelerinin ardı ardına ve en sık geçtiği dokümanlar en başta, daha seyrek geçtiği dokümanlar daha sonra, bu iki kelimenin arasında başka kelimelerin girdiği dokümanlar daha sonra, bu iki kelimenin aynı anda bulunduğu ama yakın olmadıkları dokümanlar daha sonra, bu iki ifadeden birinin geçtiği dokümanlar da en sonda getirilmelidir. Profesyonel sistemlerde aramaların çabuk cevap dönebilmesi için bu işlemler arama yapıldığı anda yapılmaz. Arka planda indeksleme motoru çalışıp her muhtemel ifade için akıllı algoritmalarla sonuçlar hazırlar. Mesela siz Google’da bir şey aradığınızda eğer o arama ilk defa yapılacak olsaydı milyarlarca dokümanın tek tek açılıp bakılması belki aylar sürerdi. Ama sorgularımıza mili saniyeler içinde cevap alıyoruz. Dijital arşiv sistemlerini kafanızda sanal kütüphaneler şeklinde canlandırabilirsiniz.



Şifreleme-Encryption

Dijital arşiv sistemlerinde arşive erişim yetki mekanizmasıyla olsa da dosyaların gerçekten arşivlendiği yerlere (mesela dosya sunucusu olan makineye) fiziksel erişim sağlayanların belgelere erişmemeleri için dosyaların şifrelenerek (encryption) saklanmaları gerekir. Böylelikle kötü niyetli bir kişi dosyalara erişse bile içeriklerine bakamayacaktır.


Doküman Yönetim Sistemleri (DYS)

DYS’ler şu ana kadar anlattıklarımız arasında en gelişmiş sistemlerdir. DA kabiliyetlerinin yanı sıra versiyon yönetimi, dinamik iş akışları, dinamik iş kuralları, raporlama, dış ERP sistemleriyle entegrasyon gibi ek özellikler sunarlar. Bu özelliklerin nerdeyse her biri için sayfalarca açıklama gerekeceğinden buraya almıyorum. Dijital Arşivi bir kargo şirketinin ana deposu gibi düşünürseniz DYS’yi bu kargo şirketinin tümü gibi düşünebilirsiniz. Hangi belge (kargo) sisteme nasıl girecek, kim karşılayacak, kim taşıyacak, nereye taşıyacak, nerede ne şekilde saklanacak, hedefine nasıl ulaştırılacak, alıcı yerinde bulunamazsa ne yapılacak, bütün bunların takibini müşteriler nasıl yapacak gibi her konu DYS’lerde düşünülmek zorundadır. Legacy sistemlerle entegrasyon da başka önemli bir husustur. Yetkilendirmeyi ya da insan kaynağının izin durumlarını mevcut ERP otomasyonu ile entegre olarak halletmek. Mevcut yapı ile bilgi alışverişi yapmak mümkün olmalıdır. Dünyada tek işi DYS yazmak olan firmalar var. Satış rakamları milyon dolarlar mertebelerinde.


Şimdi kabaca bir dijital arşiv modulünden (dikkat DYS'den değil) beklenen özellikleri listeleyelim:

  • Gelen-Giden Evrak Kaydı
  • Yetkilendirme
  • Tarama
  • Taranan Resmin Üzerinde Manipülasyon yapabilme
  • Yüksek boyutlu dosyaların sorunsuz transferi ve depolanması
  • Dosya sunucusu kullanımı
  • İstenen başka bir sunucunun dosya sunucusu yapılabilmesi
  • Dosya sunucusunda dosyaların binary olarak saklanması
  • Dosyaların meta taglarının kendi üstlerinde saklanması
  • Arşiv indeksinin dosyalar üzerinde yeniden oluşturulabilmesi
  • Dış bir veritabanına ihtiyaç bulunmaması
  • Versiyonlama
  • Elektronik imza
  • Elektronik imzalı dokümanlar için viewer
  • Repository ile güvenli (encrypted) iletişim
  • Transaction desteği – rollback imkanı
  • Text tabanlı dosyalarda full-text arama kabiliyeti
  • OCR ve indeksleme
  • Basit bir loglama ve log takibi mekanizması
  • Modül seviyesinde (iç) yetkilendirme
  • Versiyon yönetimi
Salih Cenap Baydar

4 Temmuz 2010 Pazar

6 Şubat 2010 Cumartesi

Motivasyon üzerine...

4 Şubat 2010 Perşembe

jsf action call problemi

Sebebini bilemediğim bir şekilde bazen(her zaman değil) bir jsf sayfasındaki objeye bind edilmiş bir action çağırılmıyor. Bunun için hiç bir exception yakalıyamıyor ve hiç bir mesaj ya da stacktrace görüntüleyemiyor olmam da çok ilginç. Birtakım araştırmalarımdan sonra sorunun jsf sayfasındaki alanların managed bean e map edilememesinden kaynaklanıyor olabileceğini okudum. Oysa ki sayfadaki objelerin binding attribute ları doğru bir şekilde manage bean deki karşılıklarına set edilmişti.

Daha sonra çağırılamayan action ın bind edildiği objenin 'immadiate' property sini 'true' yapınca action call sorunu çözüldü ama bu seferde sayfadaki diğer alanlarda sorun çıkmaya başladı. Bu sefer manage edebildiğim exception lar sayesinde bulduğum sorunlu alanların 'immadiate' property lerini 'true' yaptım.

Sorun şimdilik çözüme kavuştu ama sorunsuz çalışan bir uygulamada hiçbirşey değişmeden bu sorunun ortaya çıkması çok ilginç. Ne sorunu tanımlayabildim ne de çözümü anlayabildim.

Bunun jsf de bir bug olduğu yorumlanıyor: http://jan-so.blogspot.com/2008/02/jsf-does-not-call-action-in-managed.html

7 Aralık 2009 Pazartesi

sqlserver identity kolonun degerini yenilemek

Şöyleki,
identity kolonlu tablomuzda aradan bazı satırı sildik ve aradaki değerleri kullanmak istiyoruz.

(
IDENTITY
29
30

39
40
...
gibi
30 39 arası silinmiş
ve kullanmak istiyoruz
)

dbcc checkident (mytable, reseed, 30)

not:
1.yapılacak ilk kayıt verilen sayının 1 fazlası olarak kaydedilir.
2.kolon aynı zamanda primary key se 39 a gelindiğinde çıkacak sorun için hazırlıklı olunmalıdır.

21 Ekim 2009 Çarşamba

9 Eylül 2009 Çarşamba

Dunning ve Kruger Etkisi

Justin Kruger and David Dunning isimli iki psikoloji profesörü 65 Cornell üniversite öğrencisi üzerinde bazı testler uygulamışlar. Gramer, mantık ve şaka içerikli testler yapmışlar ve öğrencilerden testlerdeki performanslarını tahmin etmelerini istemişler.

Testlerde en düşük %25 e girenler, performans ve yeteneklerini çok daha üzerinde tahmin etmişler. İlk %12 ye girenler ise kendilerini %58 lerde tahmin etmişler.

Çalışmaları ve deney sonuçları, Aralık 1999 da Journal of Personality and Social Psychology dergisi yayınlanmış. Makalede vardıkları sonuç ise:
    We propose that those with limited knowledge in a
    domain suffer a dual burden: Not only do they reach mistaken
    conclusions and make regrettable errors, but their incompetence
    robs them of the ability to realize it.
İlgilenenler için makale burada.

4 Eylül 2009 Cuma

Java client ile servlet kullanarak file upload (Bu cümleyi Türkçe yazmak mümkün mü?)

Diyelim ki java ugulamanız ile bir server'a dosya upload etmeniz gerekiyor.. Apache bunun için http client ve file upload kütüphaneleri oluşturmuş. Bu kütüphaneleri kullanarak basit bir şekilde işinizi halledebiliyorsunuz. Ben client tarafında httpclient-2.0 jar'ı, server tarafında ise fileupload-1.0 jar'ı kullandım. Bunların yeni sürümleri de var ama bunlar da işimi gördü.

Öncelikle client koda bakalım:

public static void upload(String sourceFilePath) {
String servletUrl = "http://some.url/servlet";
try {
HttpClient client = new HttpClient();
MultipartPostMethod mPost = new MultipartPostMethod(servletUrl);
// Connection timeout in milliseconds
client.setConnectionTimeout(8000);

File file = new File(sourceFilePath);
mPost.addParameter(file.getName(), file);

int statusCode = client.executeMethod(mPost);
mPost.releaseConnection();
if (statusCode == 2000) {
throw new Exception("Dosya upload edilemedi");
}
// diğer işlemler....
} catch (Exception ex) {
// hatayla ilgili kod...
}
}


Karşı tarafta da bu isteği karşılayacak bir servlet yazmak gerekiyor:

protected void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException {
String dosyaDizini="D:\\";
try {
DiskFileUpload diskFileUpload = new DiskFileUpload();
// Maksimum kabul edilebilecek dosya boyutu
diskFileUpload.setSizeMax(1000000);

List requestItems = diskFileUpload.parseRequest(request);
Iterator iterator = requestItems.iterator();

while (iterator.hasNext()) {
FileItem fileItem = (FileItem) iterator.next();
if (!fileItem.isFormField()) {
File file= new File(dosyaDizini,fileItem.getName());
fileItem.write(file);
// CLİENT'A BAŞARI MESAJI
response.sendError(1000);
}
}
} catch (Exception ioex) {
// HATA OLUŞTU MESAJI
response.sendError(2000);
}
}

Tabi ki bu api ile dosya dışında metinsel parametreler göndermek de mümkün.



3 Eylül 2009 Perşembe

Şiirler(!)






24 Ağustos 2009 Pazartesi

Oracle veritabanında belli sütunların saklanması

Oracle veritabanında sadece bazı sütünlardaki (kredi kartı no ya da TC Kimlik No gibi) bilgilerin saklanması gerekebilir. Bu alanları şifrelemeden gözlerden saklamak istersek Oracle 10g'den sonra kullanılabilen Virtual Private Database (VPD) "data masking" işimize yarıyor.

Bunun avantajı, veritabanında alanlar decyrpt - encrypt edilmediğinden performans kaybı yaşatmaması..

Önce bir fonksiyon oluşturuyoruz:

CREATE OR REPLACE
FUNCTION vpd_function (obj_owner IN VARCHAR2, obj_name IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN '1=2';
END vpd_function;
/

Bu fonksiyonun döndürdüğü değer (1=2) maskelemek istediğimiz sütunlar için bir where cümlesi vazifesi görecek. Her zaman yanlış olacağından bu alanlar boş gelmiş olacak.

Şimdi bu fonksiyonu kullanacak bir policy tanımlıyoruz:

BEGIN
DBMS_RLS.ADD_POLICY(object_schema=> 'ŞEMA_ADI',
object_name=> 'TABLO_ADI',
policy_name=> 'POLICY_ADI',
function_schema=> 'ŞEMA_ADI',
policy_function=> 'vpd_function',
sec_relevant_cols=> 'VIRGULLE_AYRILMIŞ_SÜTUN_ADLARI',
policy_type => DBMS_RLS.SHARED_STATIC,
sec_relevant_cols_opt=> dbms_rls.ALL_ROWS);

END;
/

Burada POLICY_ADI'na istediğiniz herhangi bir isim verebilirsiniz.

Son olarak bu policy'nin dışında kalacak kullanıcıya izin veriyoruz:

grant exempt access policy to KULLANICI;

Artık ister program kullansın ister yazılım içinde bağlantı kursun, ilgili tabloda select çeken kullanıcı tüm satırları görecek ama belirttiğimiz sütunlar ona boş görünecektir.

8 Temmuz 2009 Çarşamba

Halı Saha Maçı

Sevgili arkadaşlar

Maç bugün (8 Temmuz 2009) 19:00-20:00 saatleri arasında olacak şekilde ayarlandı. Halı sahanın adresi:

Tuana
4.Cad. No:24 Yıldızevler/Çankaya
Tel:441 76 75

Burası atakule'ye oldukça yakın.. Harita üzerinde gösterirsek:



Daha Büyük Haritayı Görüntüle


Akşam görüşmek üzere

26 Haziran 2009 Cuma

Michael Jackson öldü...

20 sene önce kendi çabalarımızla öğrenmeye çalışmış, bir türlü becerememiştik. Moon walk nasıl yapılır öğrenmek isteyenler için: http://www.youtube.com/watch?v=E_FzgtLVzbI

Moon walk'ı ustanın kendisinden izlemek için: http://www.youtube.com/watch?v=s7MmEMrCRfc

2 Haziran 2009 Salı

Merhaba

Geçen sene bu aralar blogda bayağı bir hareket varmış. Bu sene yazılar azaldı. Buna rağmen, ziyaretçi sayımız 5000 i geçmiş. Bence yazıları arttıralım. Ne dersiniz ?

13 Mayıs 2009 Çarşamba

SQL SERVER String Functions

SELECT [Kolon1] ,
STUFF([Kolon1],3,9,'-')
+STUFF( substring([Kolon1],3,7),3,9,'-')
+STUFF( substring([Kolon1],5,5),3,0,'-')
FROM [TABLO1]
WHERE
LEN ([Kolon1])= 9
and
CHARINDEX('-' , [Kolon1])=0
and
CHARINDEX('.' , [Kolon1])=0
and
CHARINDEX('/' , [Kolon1])=0



sonuçlar
123546789
12-34-56-789