JPA/Hibernate Pratikleri ve Püf Noktaları

Yaklaşık 2004 yılından bu yana önce Hibernate sonra da JPA üzerinde çalışıyorum. O dönemden bu yana pek çok projenin geliştirilmesinde görev aldım, danışmanlık ve mentörlük yaptım. Yıllar önce Ted Neward, ORM teknolojilerini bilgisayar bilimlerinin Vietnam’ına benzetmişti ve bunda da çok haklıydı. Eğer genel olarak ORM çözümleri, özelde de JPA/Hibernate ile ilgili sağlam bir teorik bilgiye sahip değilseniz projenizin tam manası ile bir bataklığa dönüşmesi işten bile değildir. Bütün bu yıllar boyunca JPA/Hibernate ile çalışmalarım sonucu bir takım temel kullanım pratikleri ve püf noktalar belirledim. Dahil olduğum projelerde de bu pratiklerin uygulanmasına, püf noktalara dikkat edilmesine azami gayret gösteriyorum ve sonuç olarak JPA/Hibernate ile çalışmak çok daha verimli bir hal alıyor. Aşağıda bu temel pratik ve püf noktalardan aklıma gelenlerin bir kısmını sizlerle paylaşmak istedim. Umarım işinize yarar!

  1. 1:1 ve M:1 ilişkiler de dahil olmak üzere bütün ilişkileri LAZY tanımlayın.
  2. 1:M ilişkileri her zaman için çift yönlü tanımlayın ve ilişkiyi sadece M:1 tarafından yönetin.
  3. M:N ilişkileri association table için ayrı bir entity tanımlayarak iki tane çift yönlü 1:M ilişki ile ele alın.
  4. Cascade tanımlarını sadece 1:M ve 1:1 ilişkilerde ve gerçekten hangi işlemlerin cascade etmesini istiyorsanız sadece onlar için kullanın.
  5. Embeddable yerine her zaman için Entity kullanın.
  6. Derin inheritance hiyerarşilerinden kaçının, mümkün olduğunca bütün hiyerarşi için “tek tablo” yönetimini tercih edin.
  7. Bileşke PK yönetiminden uzak durun
  8. Nümerik PK değeri ile çalışılması gerekiyorsa sentetik PK üretme yöntemlerinden SEQUENCE’i tercih edin.
  9. Entity sınıfların equals ve hashCode metotlarını implement ederken proxy ile çalışma ihtimaline karşın attribute değerlerine her zaman getter metotlar vasıtası ile erişin.
  10. HQL, Criteria ve Native SQL sorgularından sadece senaryonun ihtiyaç duyduğu kadar veriyi içeren DTO nesneleri dönün, hiçbir zaman Entity dönmeyin.
  11. LazyInitializationException probleminin en iyi çözüm yolu “fetch join”dir, Hibernate.initialize(), proxy nesnenin veya collection’ın içerisine erişim, OpenSessionInViewFiler, OpenEntityManagerInViewFilter gibi yöntemleri kesinlikle kullanmayın.
  12. Üretim ortamında detached uninitialized lazy ilişkilere veya proxy’lere erişim sırasında lazy hatası ile karşılaşmamak için hibernate.enable_lazy_load_no_trans property tanımının değerini TRUE yapın.
  13. Entity düzeyinde ikincil önbellek kullanıyorsanız, bu entity’nin 1:1 ve M:1 ilişkili hedef entity’lerini de entity düzeyinde önbellek kontrolüne dahil etmeyi unutmayın.
  14. İlişki düzeyinde ikincil önbellek kullanıyorsanız, ilişkinin hedef entity’sini de entity düzeyinde önbellek kontrolüne dahil etmeyi unutmayın.
  15. Sorgu sonuçlarının önbellekte tutulması faydadan çok zarar getirebilir, bunu unutmayın. Gerçekten sorgu sonuçlarını önbelleğe dahil edecekseniz ve sorgu sonucunda entity dönülüyorsa hedef entity’yi de önbellek kontrolüne dahil etmeyi unutmayın.

Eclipse Package Explorer’da Font Büyüklüğü

Uzun zamandır geliştirme platformu olarak Eclipse/Spring Tool Suite’i tercih ediyorum ve Kurumsal Java Eğitimleri’mizde de bunu kullanıyorum. Eğitimler sırasında Eclipse içerisinde açılan editor’lerin fontlarını Window>Preferences>Appearance>Colors and Fonts bölümünden değiştirebiliyoruz. Ancak geçen bir eğitimde projeksiyon cihazının netlik probleminden dolayı Package Explorer’daki paket, sınıf ve dosya isimlerinin de fontlarını büyütmek gerekti. Eclipse’in ayarlarını biraz kurcaladıktan sonra böyle birşeyin Eclipse içerisinden mümkün olmadığını anladım. Kısa bir “googling seansı” ardından cözümün plugins/org.eclipse.ui.themes_XXX/css altındaki css dosyalarını değiştirmekten geçtiğini anladım. Package Explorer’ın font ebatını değiştirmek için hangi temayı kullıyor iseniz ona karşılık gelen css dosyasının içerisine

.MPart Tree { font-size: 16; }

şeklinde bir css kuralı eklemeniz yeterli olacaktır. Bu işlemin ardından Eclipse/STS’i kapatıp açmayı unutmayın 🙂

Online Eğitim Hazırlama Tecrübeleri

Bu blog yazımda size online eğitim hazırlama tecrübelerimden bahsedeceğim. Yaklaşık 3.5 ay önce Udemy’de yayınlanmak üzere bir online eğitim hazırlama işine giriştim. Bu hafta itibari ile Spring Boot 2.0 ile Dinamik Web Uygulamaları isimli eğitimimiz Udemy platformundan yayına girmiş bulunuyor.

Nasıl bir ortam kurdum, eğitim içeriklerini nasıl hazırladım, kayıtları nasıl gerçekleştirdim, Udemy tarafındaki süreç nasıl yürüdü hepsini bu yazımda anlatmayı planlıyorum.

Uzun yıllardır Harezmi Bilişim Çözümleri bünyesinde Kurumsal Java Teknolojileri ile ilgili sınıf eğitimleri düzenliyoruz. Bu konuda önemli bir tecrübemiz olduğunu rahatlıkla söyleyebilirim. Bütün bu yıllar boyunca elimizde belirli bir olgunluğa ulaşmış eğitim materyalleri de mevcut. Bizde bütün bu klasik eğitim deneyiminden elde ettiğimiz çıktıyı, birde Udemy üzerinden online eğitimler şeklinde sunalım diyerek işe koyulduk. Burada eğitimlere online eğitim tabirini kullanıyorum, ama bu eğitimler sınıf eğitimleri gibi eğitmen ve katılımcıların senkron biçimde bir araya geldikleri şekilde olmuyor. Katılımcılar tamamen kendi zaman planlarına göre sistemden eğitim içeriğine erişip, bunların üzerinde çalışabiliyorlar. Aslında bu eğitimlere web platformundan sunulan asenkron eğitimler diyebiliriz, ama online eğitim demek de sanırım ana fikri anlatmak açısından yeterli, kısa ve öz gibi duruyor.

Doğal olarak online eğitimler, fiziksel ortamda, katılımcılarla yüz yüze gerçekleştirilen eğitimlerden daha farklı özelliklere sahip olmak durumundalar. Sınıf eğitimlerinde ortamda bir yazı tahtası kullanma imkanı sayesinde herhangi bir kompleks konuyu çok daha esnek ve farklı açılardan açıklama, izah etme imkanımız var. Online eğitimlerde ise bu araçlar daha çok slide’lar ve development ortamı ile sınırlı kalmış oluyor. Diğer bir farklı nokta ise katılımcılarla kurulan o andaki anlık etkileşime  ve ortam atmosferine göre anlatılan konularda değinilen noktaların derinliğinin dinamik olarak ayarlanabilmesi de mümkün. Online eğitimde ise eğitim kullanıcılara asenkron biçimde sunulduğu için eğitimdeki konu anlatımlarını ve derinliği sürekli olarak sabit bir düzeyde tutma durumu ortaya çıkıyor. Sınıf eğitiminde eğitmenin fiziksel aktivasyonu ve etkileşimini online ortamda mümkün olduğunca araçlar üzerinden sağlamaya çalışmak gerekiyor. Örneğin, bir kod parçacığındaki bölümleri detaylandırmak sınıf eğitiminde eğitmenin fiziksel anlatışı ile oldukça kolay gerçekleşmesine rağmen, online ortamda bu kod parçacığı ile ilgili bölümlemeleri, sözel anlatımları, görsel destekleri hazırlamak için etraflıca bir ön çalışma gerekiyor. Tabi bütün bu farklılıklarda sınıf eğitimlerinde kullanılan materyali olduğu gibi birebir online ortama taşıyarak sunmayı imkansız kılıyor.

Paylaşımıma online eğitimleri kaydetmek için nasıl bir ortam oluşturduğumuzu anlatarak devam etmek istiyorum.

Eğitim içeriğini kaydetmek ve daha sonrasında üzerinde değişiklikler yapabilmek için birkaç aracı ve programı temin etmek ve kurmak gerekti. Bunlardan birisi chroma key perdesi idi. Çektiğimiz eğitim videolarında eğitmenin görüntüsünün yer almasını istediğimiz vakit, video’da eğitmen görüntüsünün dışında arka planda istenmeyen, çekimi amatör göstrebilecek her türlü gereksiz detayın ortadan kalkması önemlidir. Her ne kadar çekim için arkanızı beyaz bir duvara verip, duvar ve eğitmen dışında bir görüntü olmasa bile, eğitmen ile duvar arasındaki derinlik ve gölgeler bile videonuzun amatörce görünmesine yetecektir. Chroma key perde sayesinde görüntü kaydetme programları kolaylıkla arka planı transparan yapabiliyorlar. Böylece video’da sadece eğitmenin görüntüsünden başka arka planla ilgili istenmeyen hiçbir detay da yer almamış oluyor.  Ayrıca transparan bu bölümlerin altında kalan yazı, grafik gibi kısımlarda arka plan transparan olduğu için rahatlıkla okunur kalıyor.

Video kayıt programı olarak açık kaynak kodlu OBS uygulamasını tercih ettik. OBS gerçekten profesyonel ayarda ve pek çok farklı senaryoyu destekleyecek kabiliyette bir screencasting aracı. Benden tam puan aldı diyebilirim. OBS ile farklı “scene” ler tanımlayıp, herbirisine de birden fazla farklı türde “source” ekleyebiliyorsunuz. Bu source’lar bir kamera görüntüsü, bilgisayarınızdaki bir pencere, yada bir imaj veya daha önce çekilmiş başka bir video olabilir. Bu source’ların üzerine, türlerine göre farklı farklı filter’lar tanımlayabiliyorsunuz. Bu filter’lar sayesinde görüntü ve ses üzerinde istediğiniz oynamayı ve iyileştirmeyi yapmanız mümkün.

OBS üzerinden optimum görüntü ve ses elde etmek için kullandığımız bazı ayarları ve değerleri burada paylaşmak istiyorum.

Settings>Output>Recording bölümünde

Recording Format: mp4
Encoder: x264
Rescale output: off
Rate Control: CRF,0,0,ultrafast,None,None

Settings>Audio bölümünde

Sample Rate: 44.1 khz
Desktop Audio Device: <varsa sisteminizdeki gömülü mikrofon>
Mic/Auxiliary Audio Device: <varsa sisteminize bağlı harici mikrofon>

Settings>Video bölümünde

Base (Canvas) Resolution: 1920×1080
Output (Scaled) Resolution: 1920×1080
Downscale Filter: Lanczos
Common FPS Values: 30

Video Capture Device Source üzerinde eklenen filter’lar

Chroma Key
Key Color Type: Green

Scaling/Aspect Ratio
Scale Filtering: Bicubic
Resolution: 1920×1080

Mic/aux source üzerindeki filter’lar

Noise Suppression
Suppression Level: -30 dB

Gain
Gain: 10,20 dB

Ayrıca Settings>Hotkeys bölümünden start/stop recording ve scene switch’leri için hotkey tanımlamak da çekimler sırasında kullanımı oldukça pratik hale getiriyor.

Kamera olarak laptop üzerindeki built-in HD kamerayı kullandım. Ancak harici bir kamera veya webcam kullanacaksanız, yada cep telefonunuzu kamera olarak bilgisayarınıza bağlayacaksanız bir tripod’a ihtiyacınız olacak. Bu noktada çekim sırasında baş hizanıza gelecek bir tripod yüksekliği sizin için ideal olacaktır. Ben çekimler sırasında bir ara android cep telefonunu webcam olarak kullanmaya niyetlendiğim için bir tripod almış bulundum. Bu arada android cep telefonunu webcam olarak bilgisayara tanıtmak için droidcam uygulamasını cep telefonunuza ve bilgisayarınıza kurmanız, ayrıca cep telefonunuz üzerinde de  usb üzerinden kamera olarak erişime izin vermek için “usb debugging” özelliğini açmanız gerekiyor. Beni cep telefonunu webcam olarak kullanmaktan uzaklaştıran bir diğer nokta ise kameranın çekim sırasında belirli bir süre sonra kendiliğinden kapanması oldu. Muhtemelen bu cep telefonunun inaktif kalması ile ilgili idi ve cep telefonu üzerinden bir ayar ile çözülebilirdi, ancak laptop üzerindeki built-in kameranın HD olduğunu gördükten sonra onu kullanmak daha pratik ve kolay geldi.

Mikrofon olarak USB üzerinden bağlanan Trust 20378 modelini tercih ettim. Ses kalitesi gayet güzel. Yalnız Linux üzerinden çalıştırırken biraz zorlandım. Bunun nedeni benim harici mikrofonların, mikrofon ve kulaklık girişi combo olan dizüstü bilgisayar ve Linux (Mint) üzerinde kullanılması ile ilgili deneyim eksikliğim diyebiliriz. Eğer bilgisayarınızdaki audio jack combo ise, yani hem kulaklık hem de mikrofon girişi birlikte ise, bu durumda Trust mikrofonu jack üzerinden değil, kendi USB aparatı ile bilgisayara bağlamanız gerekiyor. İkinci problem noktası ise Linux içerisindeki audio/volume control panelinde sistemdeki bütün mikrofonlar görüntüleniyor ve burada Trust mikrofon sisteme “CM 108 Audio Controller Analog Mono” isimli bir device olarak dahil edilmiş vaziyette. Bunu volume control’de aktif bırakmamız gerekiyor. Yine OBS üzerinde de Settings>Audio bölümünde Mic/Auxiliary Device seçeneğinde de bu şekilde seçili olmalı.

Eğitim içeriği slide ve lab çalışmalarından oluşmuştu. Lab çalışmalarını virtualbox üzerinden çalışan bir Windows 8 guest işletim sisteminde kurulu geliştirme ortamında gerçekleştirip sessiz biçimde OBS ile kaydettim. Daha sonra da bu video’ları OBS üzerinden “video source” olarak tekrar oynatarak üzerine sesli okuma yaptım. Böylece lab çalışmalarının anlatımı çok daha akıcı oldu. Ayrıca lab çalışmalarını çekim öncesi baştan sona implement edip, adımları notlandırdım, çekimler sırasında da bu adımları takip ettim. Böylece lab çalışmalarında beklenmedik hatalar, örnekler arasında birebirleri ile uyumsuz, tutarsız konfigürasyon veya implementasyonlar ortaya çıkmamış oldu. Slide’ları oluşturmak için ise LibreOffice Impress’u kullandım. Slide’ları oluştururken dikkat etmeyip, daha sonra slide’ların teker teker üzerinden geçmemi gerektiren bir husus paper formatını Slide>Page/Slide Properties>Slide PaperFormat bölümünden  “Screen 16:9” şeklinde seçmeyi unutmam oldu. Default Screen 4:3 oranında oluşturduğum slide’ları 1920×1080 çözünürlüğünde kaydettiğim vakit video’unun sağında ve solunda siyah şeritler ortaya çıkınca bu hatamın farkına vardım. Allah’tan page formatı 16:9 olacak biçimde değiştirdiğimde slide’ların içeriğinde çok büyük kaymalar olmadı, birkaç slide’da meydana gelen format problemlerini düzelterek bu sorunu aşmış oldum.

OBS ile çekilen video’ları ham video’lar olarak tanımlayabiliriz. Çünkü bu video’ların başında veya sonunda istemediğimiz kısımlar olabiliyor, yada slide’ları anlatırken hatalar oluyor ve belirli bölümleri tekrar anlatıyoruz veya daha sonra birleştirmek ve tek bir ders yapmak için birkaç ayrı video çekebiliyoruz. Bütün bu ham video’ları işlemek ve yayına hazır hale getirmek için yine açık kaynak kodlu OpenShot video edit programından yararlandım. Amacınız video içerisindeki bazı bölümleri kesmek, video’ları birleştirmek, video’ların başına sonuna imajlar koymak, arka plana ses iliştirmek gibi şeyler ise OpenShot bunları gayet başarılı biçimde yapmamıza imkan veriyor. Video edit sonunda da video’muzu farklı formatlarda export edebiliyoruz.

Export işlemi için benim kullandığım ve OBS’deki çekim kalitesine yakın çıktı aldığım OpenShot ayarları şöyle:

Profile
Width: 1920
Height: 1080
Aspect Ratio: 16:9
Frame Rate: 30.00
Pixel Ratio: 1:1
Progressive: Yes

Export alırken de açılan dialogda Target olarak MP4 (h.264) , Quality olarak da High seçeneklerini seçtiğimizde gayet kaliteli ve sıkıştırılmış bir mp4 çıktısı elde edebildim.

Slide üzerinde konuşurken yapılan çekimde konuşmanın akıcılığını sağlamak için bir prompter kullanmayı düşündüm. Bunun için Internet’te bir arama yaptığımda karşıma TeleKast isimli browser üzerinden çalışan bir teleprompter uygulaması çıktı. Bence oldukça başarılı açık kaynak kodlu bir uygulama. Text editörde metni hazırlıyorsunuz ve teleprompter ile yükleyip oynatmaya başlıyorsunuz. Metnin akışını hızlandırmanız veya yavaşlatmanız, durdurmanız, font büyüklüğünü artırmanız veya azaltmanız mümkün. Teleprompter penceresinin büyüklüğünü ve pozisyonunu da ayarlayabiliyorsunuz. Bütün bunlar iyiydi ama deneme çekimleri sırasında slide’ları oynatırken bir yandan da teleprompter’dan akan bir metni takip etmek, iki tarafı senkronize götürmek hiç kolay değildi. Ayrıca slide’lar ile bu metin arasında bir ilişkilendirme yapılması ve iki tarafın birbiri ile uyumlu ve güncel tutulması gerekiyordu. Bu durumda arayışımı slide’ların kendi içindeki notlar bölümüne kaydırdım. Her bir slide gösterimi sırasında okuyacağım metni o slide’a ait notes bölümüne yazdım ve slide içerisinde animasyonları tetikleme anlarını da yine bu notların arasında kendimce belirlediğim bir karakter dizisi ile işaretledim. Slide Show’a geçtiğimde LibreOffice, dual screen ile çalıştığım için sorunsuz biçimde bir ekranda slide show’u oynattı, diğer ekranda da hem o slide’ın ufak halini, yanında da not bölümünü gösterdi. Notes kısmında metin üzerine uygulanan herhangi bir text formatının ekranda göz ardı edilmesi, satır aralıklarının dikkate alınmaması LibreOffice tarafı için sorunlu noktalar olsa da, bunlar bir showstopper değildi.

Çekimlerin tamamlanması ile birlikte eğitimin Udemy üzerinden yayınlanması aşamasına geçtik. Aslında herhangi bir eğitim içeriğini hazırlamaya başlamadan evvel bu eğitimi yayınlayacağınız online platforma girip eğitim içeriğini hazırlarken dikkat etmeniz veye uymanız gereken kurallar ve ayarları, oluşturacağınız eğitimin sahip olması gereken yapıyı vs. etraflıca incelemeniz çok çok önemli. Bende aslında sürece bu şekilde başladım ve Udemy’de yayınlanan eğitimlerin yapısını vs öğrendikten sonra eğitim içeriğini oluşturmaya ve ardından da çekimlere giriştim. Çekimlere başlamadan evvel kayıt ortamında oluşturduğunuz test videolarını da kalite kontrol için sisteme upload etmeniz gerekli.

Eğitim içeriği bölümlerden, her bir bölüm de derslerden oluşuyor. Ayrıca her bir derse yardımcı kaynak ve harici linkler vs de ekleyebiliyorsunuz. Eğitime ait bir kapak resmi ve tanıtım/promosyon videosu da hazırlamanız gerekiyor. Kapak resminde logolar haricinde metin kullanmanız istenmiyor, çünkü kapak sayfasında salt görsel elemanlar barındıran, metin içermeyen eğitimlerin %10 daha fazla satış yaptığı tespit edilmiş. %10 bizim için çok büyük bir oran gibi durmasa da Udemy gibi devasa bir platform için çok büyük bir oran olduğu kesin.

Udemy’de eğitim yayınlamak için öncelikle bir eğitmen profili oluşturmanız ve bunu verify etmeniz gerekiyor. Doğrulama süreci eğitimi oluşturup, içeriğini upload ettikten sonra da yapılabiliyor, ancak eğitimi bu aşamadan evvel yayınlamanız mümkün değil. Son olarak da eğitim içeriğini tam olarak oluşturduğunuzu düşünüyorsanız, ön izleme sürecini başlatıyorsunuz. Bu süreçte eğitim içeriği ile ilgili Udemy content ekibinden herhangi bir olumsuz geri dönüş olmaz ise eğitiminiz artık yayına giriyor.

Online eğitim hazırlama ve yayınlama süreci ile ilgili daha pek çok nokta ve detay üzerinde konuşulabilir, ancak sanırım bu başlıklar bu süreç içerisindeki en temel adımlar ve sürecin de büyük bir bölümünü çevreliyorlar. Online eğitim hazırlamak isteyenler için umarım buradaki tespitler işe yarar. En azından ileride yeni eğitimler hazırlarken benim işime yarayacağı kesin 🙂

 

 

İnternet ve 25 Yıl

Türkiye’de İnternet bağlantısı ilk olarak 12 Nisan 1993 yılında ODTÜ ve Tübitak’ın birlikte yürüttüğü bir proje ile sağlanıyor. Yani İnternet ile tam 25 yıl geçmiş. Ben de bu 25 yılın neredeyse 24 yılına bir Internet kullanıcısı olarak şahitlik ettim. İnternet ile ilk tanışmam Eylül-Ekim 1994’e dayanır. ODTÜ’ye geldiğim ilk yıl 1. ve 2. yurtlardaki bilgisayar lablarında İnternet’te surf yapmaya başlamıştım. Dolayısı ile Türkiye’deki İnternet kullanıcılarından ilk birkaç bini arasındayım diyebilirim.

O yıllar aslında dünyada da İnternet’in hemen hemen emekleme yıllarıydı diyebiliriz. Lablardaki PC’lerde Mosaic ve Netscape browser’lar (Mosaic Browser daha sonra ortadan kalktı, Netscape’in ise 1.0 sürümü ile çalıştım :-)) ile İnternet’e bağlanır ve elimizde daha önceden bir yerlerden elde ettiğimiz web adreslerine girmeye çalışırdık. Tabi birde UNIX hesaplardan text tabanlı çalışan lynx browser’ı da unutmamak lazım. İnternet siteleri sayıca o kadar azdı ki,bazı sitelerde çeşitli konularla ilgili web adreslerinin listesi olurdu, yada bu listeleri kağıt kalemle biz kendimiz yapardık. O ilk birkaç yıl içinde web sayfaları yapmaya başladığımızda çoğumuzun “my favourite links” şeklinde bu siteleri listelediğimiz bölümleri mutlaka olmuştur. Web sitelerini kataloglama fikri şimdi ne kadar saçma gelse de Yahoo’nun bile 1994’deki ilk çıkışında bunun olduğunu düşünürsek o zamanlar için bilgiyi indeksleme yaklaşımı hiç de saçma bir fikir sayılmazdı.

Tarayıcıların o zamanki kabiliyetleri de çok sınırlı idi, sitelerinde çoğu metin ve biraz da resim içerikli idi, ses veya video hiç yoktu. Hatta tarayıcılar belirli bir büyüklüğün üstündeki resimleri HTML sayfanın içerisinde gömülü biçimde açamaz, ayrı bir pencerede açarlardı. O zamanlar Bilkent Üniversitesi’nin sunucusu üzerindeki Cindy Crawford ve Claudia Schiffer resimlerini açmak için ne uğraşlar vermişizdir 🙂 Şu anda sadece Youtube üzerinden anlık olarak yayımlanan video miktarını düşününce o zamanlar İnternet üzerindeki verinin miktarı bizler için kavranabilir, bir şekilde en azından sınırları çizilebilir veya hakim olunabilir geliyordu. Bugün için ne absürd bir düşünce.

Internet’de World Wide Web’in dominantlık kazanmasından evvel Gopher isimli bir protokol vardı. Gopher sunucular İnternet üzerindeki dosya ve sayfaları hiyerarşik biçimde listelerlerdi. WWW tarafındaki arama motorlarından önce bu gopher sunucuları üzerinde Veronica ile arama da yaptığımızı hatırlıyorum. Gopher’a çoğunlukla UNIX hesaplarımızdan bağlanırdık. O zamanlar içeriğin büyük kısmı metin olduğu için bu çok da sorun olmazdı.

O zamanlar ODTÜ’ye başlayan bütün öğrencilere hazırlıktan sonra birinci sınıfa başladıklarında ODTÜ Bilgi İşlem’den bir UNIX hesap verilirdi. Narwhal isimli bir sunucuya bağlanırdık. Bu hesapların ismi de o zamanlar narwhal account’u olarak bilinirdi. Narwhal daha sonra öğrencilerin erişimine kapanıp, yerine Orca gelmişti. Yurt odamdaki 4. sınıflardan birisinin narwhal account’u ile hazırlıktan itibaren UNIX sistemlere bağlanmaya ve İnternet’e erişmeye başlamıştım. Bu arkadaş biraz hacker diye tabir edilebilecek birisiydi ve yanılmıyorsam CERN veya buna benzer bilimsel bir organizasyona yetkisiz erişimde bulunmaya çalıştığı için oralardan da kendisine küçük bir uyarı yazısı gelmişti. O arkadaşın hesabı ile yurt lablarında İnternet’e bağlanırken, arada sırada kapıdan içeri Jandarma girecek ve ensemizde bitecek diye tedirgin de olmuyor değildim 🙂

İstanbul Küçükçekmece Lisesi’nden bir arkadaşım da o yıl Karadeniz Teknik Üniversitesi’nde sanırım Bilgisayar Bilimleri gibi bir bölümü kazanmıştı. Yaz tatilinde onunla bir araya geldiğimizde bana Tan Deniz Sarıhan’ın Herkes İçin İnternet kitabını gösterdi. Sanırım bu Türkiye’deki İnternet ile ilgili ilk kitaplardandır. Hemen Bayezit Meydanı’na gidip bir tane de ben edinmiş ve tatil’de baştan sona okuyup, ilginç bulduğum adreslerden notlar almıştım. Ancak kitabın yazarına daha sonra e-posta ile bir konu hakkında soru sorduğumda, kendisinden elektronik ortamda soru sorma adabı ile ilgili gayet sert ve kırıcı içerikli bir cevap alınca kendisine karşı pek de iyi duygular beslediğimi söyleyemem.

Geçen hafta kızımın okulunda bilişim teknolojileri dersinin öğretmeninin kapısında böyle bir afiş dikkatimi çekti. Malesef çocukların gözünde İnternet’i emniyetsiz, tehlikeli ve karanlık bir yer şeklinde gösteren, İnternet’e bağlanırken iki kere düşündürten bu tür yaklaşımlar gelecek nesillerin bu dünyanın nimetlerinden, kendilerine sunduğu ve sunacağı fırsatlardan yararlanmalarını zorlaştırır, onların zihinlerinde gerçek potansiyellerini açığa çıkarmaları noktasında engeller yaratır diye düşünüyorum.

İnternet ve bilgisayarlar benim için ilk andan itibaren bir alışkanlık, tutku halini almıştı. Hazırlık sona erip proficiency sınavına girince mecburen İstanbul’a, eve dönmüş ve lablardan uzak kalmıştım. Ancak proficiency sınav sonucunu öğrenme bahanesi ile Doğu Expresi’ne atlayıp Ankara’ya gelmeyi planladım. Aslında proficiency’yi rahat rahat geçtiğimden emindim, ama asıl niyetim yaz okulu boyunca da açık olan 1. veya 2. yurt labında biraz olsun İnternet’e girip surf yapabilmekti. Yanıma bilgisayar, unix ve www siteleri ile ilgili birkaç notumu ve 1.44 inçlik disketimi de alıp trene atladım. Ancak Eskişehir yakınlarında bulunduğumuz kompartmanda bir adam arıza(!) çıkardı, bende bundan biraz nasibimi aldım, kaşım açıldı, Eskişehir’de tedavimi olduktan sonra otobüs ile Ankara’ya ulaştım, ODTÜye geçtim, yine de birkaç saatliğine yurt labına uğradım.Tabi hemen bak İnternet/sosyal medya bağımlılığı ne kötü birşey, adamın başına böyle işler açıyor, o yüzdeen de Yeşilay bünyesinde içki, sigara, uyuşturucu ile mücadelenin yanında birde sosyal medya bağımlılığına karşıda bizi uyarıyorlar, ne de güzel yapıyorlar demeyelim lütfen. Malesef İnternet’i veya teknolojiyi özü itibari ile kötü olan şeylerle aynı cümle içinde anmak malesef vahim bir durum. Umarım bu sakat yaklaşımdan bir an evvel uzaklaşılır.

İnternet ile geçen bu 25 yılda paylaşılacak daha ne çok anı ve hikaye vardır. İlk arama motorları, dial up bağlantılar, web siteleri oluşturmalar vs. Benim için 94-95’de İnternet’li ilk yıllar işte böyleydi. Artık yapay zeka, artırılmış gerçeklik vs konuları, her yerden, her türlü cihaz ile bağlanabilme ve ucu bucağı olmayan bir depolama ve veri işleme kapasitesi ile çok farklı dünyalara yelken açıyoruz.

Bütün bu 25 yıl içerisinde Türkiye genelinde İnternet ile özdeşleşen pek çok isim olmuştur. Ancak ben bunlardan kısa zaman önce vefat eden Mustafa Akgül hoca’yı anmadan geçemeyeceğim. Akgül hoca, Türkiye’de İnternet’in kullanıma geçmesine öncülük etmiş kişlerden birisiydi, İnternet’in yaygınlaşması ve özgürce kullanılabilmesi için de kendi çapında elinden geldiği kadar üretmeye çalıştı. Gazetelerde, dergilerde yazdı, dokümanlar, kılavuzlar hazırladı, konferanslar, etkinlikler düzenledi. Arı gibi çalışkan bir insandı. Gördüğüm kadarı ile oldukça da mütevazi biriydi. Kendisini rahmetle ve saygı ile anıyorum, umarım bizlerde en az onun kadar Türkiye’deki bilişim ve İnternet dünyasına katkıda bulunabiliriz.

Bir sonraki 25. yılda da görüşmek dileğiyle…

İlerleme Süreklilik İster 2

Daha önceki bir yazımda Google’ın gözlük projesinden sonra giyilebilir bilgisayarların gelişiminde öncü role sahip Steve Mann’ın hikayesinden bahsetmiş ve Google’ın gözlük projesini bugün konuşuyor isek biraz da bunu 70’lerin sonlarından bu yana çalışmalarını ısrarla ve kesintisiz biçimde sürdüren Steve Mann ve benzerlerine borçlu olduğumuzu anlatmaya çalışmıştım.

Geçenlerde bütün dünyanın hayranlık ve bir o kadar da ürperti ile seyrettiği Nik Wallenda’nın Grand Canyon’da bir uçtan diğer uca gerilmiş ip üzerinde emniyet kemeri olmadan yürüyüşünden sonra aklıma yine bu konu takıldı.

İmkansızın peşinden ısrarla koşmanın sonucu Nik Wallenda’nın “büyük yürüyüşü” olmuştu. Ancak bu büyük yürüyüşün başlangıcı neredeyse 18. yüzyıla kadar uzanıyor. Wallenda ailesi 7 nesildir ip üstünde cambazlıkla uğraşıyor. Yürüyüşlerinde zaferlerin yanında trajediler de yok değil. Ancak bunlar hiçbir zaman Wallenda’ların yürüyüşünü kesintiye uğratmamış ve muhtemelen de bu yürüyüş daha nesiller boyu devam edecek gibi görünüyor.

Dede Wallenda’nın 1973’deki Ölümcül Düşüşü

Torun Wallenda’nın 2013’deki Grand Canyon’daki Zaferi

Bizim kesintisiz yürüyüşlerimiz mi? Bizdeki durum ancak Cem Yılmaz’ın AROG’undan bir replik ile anlatılabilir: “Bir haftada ortaçağ, 15 günde yeniçağ, yemin ediyorum 1 aya kadar Fransız devrimine kadar götürürüz biz bu işi.”

İlerleme Süreklilik İster

Steve Mann’ı ve çalışmalarını İnternet üzerinden 94’den bu yana aralıklarla takip ediyorum. Kendisi 70’lerin sonlarından bu yana “giyilebilir bilgisayar” sistemleri üzerinde çalışıyor. Çalışmaları en son Google’ın “gözlük” projesini duyunca tekrar aklıma geldi. Acaba Steve Mann’da bu projede yer alıyor mu veya bu proje hakkında ne düşünüyor diye merak ediyordum. Kısa bir zaman sonra takip ettiğim twitlerden birisinde aşağıdaki yazı belirdi. Steve, yazıda 35 yılı bulan, kendi tabiri ile “mediated reality” yani “aracılı gerçeklik” tecrübelerinden ve Google’ın “gözlük” projesi hakkındaki fikirlerinden bahsediyor.

Steve Mann’ın 70’lerin sonlarındaki ilk çalışmalarına baktığımızda kafasında büyükçe, antenli ve garip bir kask görüyoruz. Steve bu çalışmalarını ilk dönemlerden itibaren günlük hayatta da tecrübe ediyormuş. Muhtemelen kendisi ile dalga geçen, alaya alan, çabalarının beyhude ve zaman kaybı olduğunu düşünen, bu külfete katlanmayı anlamlı bulmayan pek çok kişi olmuştur. Ancak bu çalışmaların kesintiye uğramadan 35 yılın sonunda geldiği noktaya ve sunduğu kabiliyetlere baktığımızda net bir ilerleme görüyoruz. Eğer Steve Mann bu süreci ısrarla sürdürmeseydi, kesinlikle günümüzde erişilen noktada olunamayacaktı.

Bütün bunları düşünürken aklıma bizim yazılım sektöründeki durumumuz geldi. Acaba özel veya kamu kuruluşlarımızın çalışmaları ne kadar süreklilik arz ediyor? İlk aşamada başarısız, verimsiz gibi duran çalışmaların içerisindeki işe yarar kısımlar ne ölçüde tespit edilip, revize edilerek, ne işe yarıyor, neresi problem yaratıyor bakılarak ortaya çıkan yapılar şirketin deneyim havuzuna aktarılıyor? Önceki projelerden elde edilen bilgi birikimi ve deneyim hangi oranda kesintisiz biçimde daha sonraki projelerde kullanılıyor, iyileştirilip bir ileri adıma taşınabiliyor? Teknolojide, araçlarda ve yazılım süreçlerinde ne gibi bir süreklilik var? Yoksa günü kurtaran çözümlerle ağustos böceği gibi yaşamaya devam mı ediliyor? Gazetelerden birisinin sloganıydı “her sabah dünya yeniden kurulur, her sabah taze bir başlangıçtır”, yoksa bizde bu sloganla mı hareket ediyoruz?

Sözün özü, herhangi bir konuda ilerleme ve tatmin edici bir sonuç istiyorsak kısa vadeli çözümlerin kurumsal vizyonu sekteye uğratmasının önüne geçmeliyiz. Esen rüzgarda bir oraya bir buraya savrulan yaprak olmaktan kurtulmalıyız.

Java Dergisi Yazıları

2010 yılında bir girişimle Özcan Acar tarafından hayata geçirilen Java Dergisi malesef kısa bir süre sonra yayın hayatına veda etmişti. O dönemde bende dergiye yazılarımla katkıda bulunuyordum. Derginin ilk iki sayısında yayımlanan ve 3. sayısı için hazırladığım fakat yayımlanma imkanı bulamayan yazılarımı buradan sizlerle tekrardan paylaşmak istedim.

If Your Eclipse Hangs…

Recently, my STS installation started to freeze during “initializing java/spring tooling” step. As a first attempt, I suspended all validations from window>preferences>validation, however it didn’t help much. Whenever you experience a hang or freeze in your Eclipse installation, it is always a good habit to look inside of .metadata/.log file in Eclipse workspace folder. Most of the time, causes for such hangs or freezes appear to be network problems. I was right, this time it was no exception, either. I noticed “Connection timeout” messages in the log file. In order to discover the URL address which causes connection timeout, I switched off wireless connection of my laptop and restarted STS. This time messages turned into “unknown host exception” indicating java.sun.com. I thought I am on the right track. I guessed somehow there was a connectivity problem with java.sun.com. The last step was to add a line in my /etc/hosts file so that java.sun.com request will resolve into my machine instead of going through Internet. After adding that line, and restarting STS again, error messages turned into FileNotFoundExceptions pointing URI http://java.sun.com/dtd/web-app_2_3.dtd. Exception stacktrace was self explanatory, the problem was related with Spring tooling auto config detection.

!MESSAGE java.io.FileNotFoundException: http://java.sun.com/dtd/web-app_2_3.dtd
!STACK 0
java.lang.RuntimeException: java.io.FileNotFoundException: http://java.sun.com/dtd/web-app_2_3.dtd
at org.springframework.ide.eclipse.core.SpringCoreUtils.parseDocument(SpringCoreUtils.java:650)
at org.springframework.ide.eclipse.core.SpringCoreUtils.parseDocument(SpringCoreUtils.java:627)
at com.springsource.sts.ide.metadata.locate.DynamicWebProjectBeansConfigLocator.canLocateInProject(DynamicWebProjectBeansConfigLocator.java:239)
at org.springframework.ide.eclipse.beans.core.model.locate.AbstractPathMatchingBeansConfigLocator.locateBeansConfigs(AbstractPathMatchingBeansConfigLocator.java:67)

 

Ubuntu Kurulumları Hep Böyle Problemli mi Olacak?

Birkaç senedir dizüstü bilgisayarlarımda ubuntu linux işletim sistemini kullanıyorum. Ubuntu’ya geçiş kararım bir akşam üstü dizüstü bilgisayarımı kapatmaya çalıştığımda Windows XP’nin dakikalar boyunca uğraşması sonucu aniden oluvermişti. O gün bu bugündür de bu işletim sistemini severek kullanıyorum.

İşletim sisteminin performansına ve kurulduktan sonraki istikrarlı çalışmasına hiç bir diyeceğim yok. Ancak ne zaman ki bilgisayarımdaki sürümü yükseltmeye kalksam veya sıfırdan bir kurulum yapmak istesem bu işlemlerin ilk seferde düzgün biçimde gerçekleştiğine pek şahit olmadım. 9.10 sürümünü CD’den bir bilgisayarıma kurmak için defalarca uğraştığımı hatırlıyorum. Bir türlü internal CD ile kurulum yapamamıştım. En sonunda diski çıkarıp başka bir makinada kurulum yaptıktan diski tekrar eski makinaya takmıştım. 9.10’dan 10.10’a upgrade süreci de istediğim gibi gerçekleşmemişti. Sıfırdan kurulum yapmadan, önce 10.04 ardından da 10.10’a yükseltmeye çalışmıştım. Ama ya iso imajlarında checksum problemleri, ya da kurulumdan sonra işletim sisteminin düzgün biçimde açılmaması gibi problemlerden ötürü bir türlü 10.10’a geçiş yapamamıştım.

Geçenlerde yeni bir dizüstü bilgisayar aldım. Sistem i7, 8 GB’da RAM’e sahip olunca 10.10’u sıfırdan kurmak ve 64 bit ubuntu’yu denemek istedim. Artık USB’den boot özelliği de iyice yaygınlaştığı için 10.10 64 bit imajını internetten indirip USB startup disk’i oluşturuverdim. Ardından da kuruluma başladım. Herşey gayet normal seyrederken birden yine bir hata penceresi karşıma çıkıverdi. apt installer bazı paketlerin kurulumuna devam edemiyordu, bir bug request’i gönderebilir, logları inceleyebilirdim. Sistemi reboot ettim, işletim sistemi bulunamıyordu, demek oluyordu ki grub loader’ın kopyalanması aşamasına da gelinmemişti. Logları incelemeden evvel hemen her bilgisayarcının yaptığı gibi kurulumu aynen bir kere daha başlattım. Önceki kurulumda seçenekler arasında olup seçtiğim flash player gibi 3rd party araçların kurulması seçeneğini bu sefer boş bırakmayı denedim. Evvet! bu sefer şansım yaver gitti ve kurulum başarılı biçimde sonlandı. Artık 10.10 ve 64 bit bir ubuntu ile çalışıyorum. Bakalım 64 bit ubuntu ne kadar fark yaratacak…

Matematik Nedir?

Elime bir “discrete” matematik kitabı geçti. Discrete matematiğe üniversiteden bu yana hep ilgi duymuşumdur. Ancak matematiğin bu kolunu anlatmaya çalışan kitaplardan yana da bu güne kadar pek tatmin olmamışımdır. Sanırım Norman L. Biggs’in Discrete Mathematics kitabı bunu tersine çevirecek gibi. Kitabın giriş sayfasındaki şu ifadeleri yıllar önce bilinçli biçimde matamatik öğrenmeye başladığımız zamanlarda duymuş olsaydık sanırım pek çoğumuzun matematik algısı çok daha farklı olurdu.

Mahtematicians deal with statements.
Usually the statements are about numbers.
The statements may be true or false.
To decide whether a statement is true or false requires a proof.