Sanal Kimlik – 2

İlk yazı için buraya tıklayabilirsiniz.

Bir önceki yazıya açıklık getirmek için devamını yazıyorum. Fikrin ortaya çıkışının temel sebebi kimlikleri sadece e-mail aracılığıyla kontrol edebilmemizdi. E-mail olmazsa telefon numarası ya da başka bir şey. Oysa belli standartları yakalamak için herkese benzersiz birer numara verilmeli.

T.C. Kimlik numarası bu işi görüyor ama güvelik sebeplerinden her sitede bu numaranın kullanılıp, saklanması pek sağlıklı olmaz. İşte bu noktada Sanal Kimlik projesi devreye giriyor. Bir topluluk(Vakıf/Dernek) devletin kimlik veritabanına erişme hakkı alır. Kullanıcı önce normal üye olur gibi buraya üye olur. Karşılığında kendisine şifrelenmiş bir id numarası verilir. Burada kullanıcının bu numarayı çok iyi saklaması gerektiğinin bilincinde olması gerekiyor. Kullanıcı sanal kimliğini aldıktan sonra normal şekilde sitelere yine üye olabilir. Ama sertifikalanmış sitelere yani sanal kimlik ile üyelik alan sitelere üye olmak için bu numaraya ihtiyacı olacaktır. Burada numara kullanıcının hesabıyla ilişkilendirilir. Diğer ayrıntılar istenmez, mail sorulmaz kullanıcıya. Numarası alınır ve doğrulu Sanal Kimlik sunucusu üzerinde kontrol edilir. Bakın tekrar ediyorum sunucudan kişi bilgileri alınmıyor. Sadece numara kontrol ediliyor. Güvenlik açısından numarayı kullanmaya başlayan site sunucuya bir kayıt girer. Bu çok basit bir 1 veya 0 verisidir. 1 se kullanıyorum der. Sertifikalı tüm siteler bu şekilde listelenir kullanıcı herhangi birini kullanmaya başlamadan önce değer 0’dır.

Site kimliği onayladıktan sonra normal şekilde kullanıcı üye olur işlemlerine devam eder. Hesabıyla ilişkili bir numarası vardır. Devlet başka bir kullanıcının ya da site yönetiminin isteği olmadıkça hangi kullanıcı hangi sitede ne yazıyor öğrenemez. Sanal Kimlik kuruluşu tamamen bağımsız olmalıdır. Burada devlette kendi işlemlerinde numara doğrulaması yapabilir tıpkı diğer siteler gibi bu kimliği kullanabilir ama zaten esas kimlik bilgilerine sahip olduğu için böyle bir şey yapmasına gerek yoktur. Kullanıcı yanlış bir işlem yaptığında site yönetimi kullanıcı adıyla birlikte id numarasını engeller. Böylelikle bu kullanıcı bir daha kendi kimliğiyle bu siteye üye olamaz. Herhangi bir suç işlendiğinde resmi makamlar id bilgilerini topluluktan isteyebilir. Toplulukta bu bilgileri verir ama sadece resmi istek olduğunda.

Burada bu kimlik sunucusunun güvenliği önemli. Bunu mutlaka profesyonel yazılımcılar yapmalı ve şifrecilerin desteği sağlanmalı. Tam güvenlik sağlandıktan sonra iş ulusal sitelerden çıkıp uluslar arası sitelerde bu kimliği kullanmaya gelir. Devam edelim;

Dünya çapındaki sitelere üye olurken yine kullanıcı normal şekilde üye olur ama bu sefer id numarasının yanında ulusal kodda kullanılır. Bu işlemleri yürütmesi ve diğer ülkelerde sanal kimliğin yaygınlaşması için ayrı bir topluluk kurulur. Bu topluluk diğer ülkelerin sanal kimlik uygulamasına geçmek için gerekli alt yapıya(hukuki ve teknik) sahip olup olmadığını kontrol eder. Eğer sahipse ulusal bir kod ilan eder ve o ülke vatandaşlarıda bu sitelere üye olabilir. Elbette kendi ülkelerinde de sanal kimlik numarası veren bir topluluğa ve bu topluluğun bağımsız olarak çalışmasına olanak veren yasalara ihtiyaçları vardır.

Son olarak tekrardan belirtmek istiyorum. Sanal Kimlik bir fişleme aracı değil tamamen kimlik doğrulamada kullanılan bir güvenlik protokolüdür. Ne siteler kullanıcının kimlik bilgilerine ulaşabilir ne de devlet kullanıcıların takma isimlerine ulaşabilir. Bu yazıyı görselle desteklemek isterim ama elimde gerekli araç yok. Yardımcı olabilecek olanlarla bir ara iletişime geçerim.

Bir sonraki yazı için tıklayınız.

Sanal Kimlik

Siteme Openid ekleme konusunu düşünürken uzun süredir düşündüğüm bir mesele tekrardan canlandı. İnternet o kadar hızla büyüyor ki içindeki verileri kontrol etmek gün geçtikçe zorlaşıyor. Sosyal ağlar, topluluklar, bloglar, her kesin açabildiği wikiler. Bu kadar yoğun bir bilgi bombardımanın ardında ihtiyacımız olan doğru veriyi alıp bilgiye ulaşmak imkansız hale gelebiliyor.
Bu sorun sadece sanal ortamda değil televizyonlarda, gazetelerde ve diğer medya unsurlarında da baş gösteriyor. Özellikle Amerikan televizyonlarında ki ekonomi ve politika programlarını seyrettikten sonra dünyanın ne büyük bir tehdit altında olduğunu bir kez daha kavrıyorum.

Ama şimdilik konumuz bunlar değil. Sadece internete yoğunlaşalım… internetin gücü diğerlerini ortadan kaldırmaya yeter. Şimdi bir kaç örnek vereyim mesela bugün başıma geldi bir kaç örnek kod aynı yerden alınmış ama eksik geçirilmişti. Ya da bazen yanlış olur sonuç olarak işime yaramayan bir bilgiyi bulmak için site site dolandım. Kaynak siteler öyle kötü ortamlarda değildi. Alanında uzman kişilerin yazdığını düşündüğümüz çeşitli metinler kullanıcıların hizmetine sunulmuştu ama sonuç olarak bana lazım olan kodun işime yaramayacağını uzun süren araştırmanın sonunda fark ettim. Bahsettiğim o uzun süre 10dakika da olsa eğer benim gibi 100 kişi varsa iş gücü kaybını hesaplayın da görelim. Başka bir kaynak direkt yalan haber yazıyor, kimisi iftira atıyor. Sadece kodlarla sınırlı değil habercilik ve eğitim kisfesi altında yanlış bilgi veren dolu kaynak var.

Aslında bilgi veren dememek gerek. Yanlış veri ileten araçlar olarak onları sıfatlandırmak gerek. Zira veri anlamlı değilse bilgi değildir. Belki şuan bende saçmalıyorum ama burası bir kaynak sitesi değil kişisel günlük 🙂 Neyse…

Openid desteğini araştırırken aklıma Kore de uygulanan sistem geldi. Yanılmıyorsam sanal vatandaşlık kimliğiniz sanal işlemlerde kullanılabiliyordu. Bu şekilde herhangi bir yasa dışı faaliyette bulunduğunuzda hemen tespit ediliyor ve cezalandırılabiliyordunuz. Bunun yanında mesela fake hesap dediğimiz sahte hesaplar aracılığıyla insanları rahatsız etme olanağınızda ortadan kalkıyordu. Mesela bir oyun beta testine başlıyor. Her vatandaşa 1 hesap alma hakkı veriyor ve böylece ikinci üçüncü hesaplar alıp oyunu şişirmesi engellenebiliyor. Üstelik oyuncu oyunda hile yaparsa oyundan uzaklaştırılıyor ve bir daha giremiyor.

Benim istediğim işte T.C. Kimlik Numarasının sanal alemde bu şekilde kullanılabilmesi. Devlet bize bu bilgileri kontrol etme ve saklama hakkı tanısın. Tıpkı OpenId gibi Türk sitelerinde kullanabileceğimiz bir vatandaşlık numarası olsun ve bunu kontrol edebilelim. Belli bir sertifikasyon sistemi getirilsin. Bu kimlik numarası kaydını alan ve güvenli bir şekilde saklayan sitelere bu sertifikalar dağıtılsın ve siteler bu sertifikaya sahip olup / olmayan şeklinde sınıflandırılsın. Bir sonra ki aşamada bu siteleri düzenli olarak kontrol edecek bir topluluk oluşturulsun ve sertifika verilen sitelerde ki içeriği denetlesin. Uydurma / Çalıntı içerik tespit edildiği takdirde kullanıcılar bu siteleri topluluğa şikayet edebilsin ve sertifikaları elinden alınsın. Bu şekilde çekirdek olarak oluşan bir ağ zamanla gelişip güvenli içerik veren kaliteli sitelerin oluşmasına olanak verebilir. Kullanıcıların güvenini ve sertifikayı elde edebilmek için siteler kendilerine çeki düzen verir ve bizlerde işimizi çabucak hallederiz. Bu çatı elbette Linux altında kurulabilir. Elimizde e-devlet projesi ve Pardus’ta var hani… Yeterli araçlara sahibiz.

Bunu fişlemeye olanak sağlayan bir uygulama olarak görenler olabilir. Ben normal bir internet kullanıcısı olarak herhangi bir yasadışı işe karışmadıktan sonra yaptığım işlerin kayıt altına alınmasına karşı değilim. Birisi bir forumda bana hakaret ederse çabucak cezalandırılsın, cezalandırılmıyorsa da o forumdan uzaklaştırılsın ve bir daha karşıma çıkmasın isterim. Başka birisi benim sitemden yazıları çalıyorsa onu ifşa edebileyim, hakkımı koruyabileyim isterim. Bilmem siz ne düşünüyorsunuz? Önerileri alalım şöyle 🙂

Yazının devamı için tıklayın.

Django Sayfalama Pagination

Düzgün örnek bulmak kolay olmadı bu yüzden bir kaç örneği birleştirip kendi siteme göre çözümlemeler yaptım. Örneği burada paylaşıyorum böylelikle sizlerde kendi sorunlarınızı çözebilirsiniz.

view.py de şunları yapıyoruz. tüm dosyayı kopyalamadım çünkü çok uzun sadece bahsi geçen kısım şöyle olacak:


#normal view modüllerine şu eklenecek
from django.core.paginator import Paginator,InvalidPage, EmptyPage

def index(request, page=1):
 list = pnews.objects.all().order_by('-pdate')
 paginator = Paginator(list, 5)
 
 try:
  results = paginator.page(page)
 except(InvalidPage, EmptyPage):
  results = paginator.page(paginator.num_pages)
  
 return render_to_response('news/homepage.html', {"results":results})

urls.py şu satırı ekledim:


url(r'^news/(?Pd+)/

Burada yazdığımız satır şu işe yarıyor urlmiz/news/1 şeklinde kaçıncı sayfadaysak onu gösteriyor.

template dosyamızı şu şekilde düzeltiyoruz:

 
{%if results.has_previous%}
previous
{%endif%}
Page {{results.number}} of {{results.paginator.num_pages}}

{%if results.has_next%}
next
{%endif%}

 

Burada toplam kaç sayfada olduğumuzu gösteriyoruz. Bulunduğumuz sayfanın öncesi varsa öncesine, sonrası varsa da sonrasına link veriyoruz. Normalde düz liste olunca 1 yazılırdı ama pagination yapınca 2 ile verileri çekiyoruz bunuda belirtmiş olayım.


{% for pnews in results %} 1

{% for pnews in results.object_list %} 2

Ek:Tagların bazıları görünmüyor mouse ile seçip urllere bakın elimden gelen bir şey yok bloggerdaanca bu kadar kod yazılıyor.

, 'cms.news.views.index', name='gmsnews'),

Burada yazdığımız satır şu işe yarıyor urlmiz/news/1 şeklinde kaçıncı sayfadaysak onu gösteriyor.

template dosyamızı şu şekilde düzeltiyoruz:


Burada toplam kaç sayfada olduğumuzu gösteriyoruz. Bulunduğumuz sayfanın öncesi varsa öncesine, sonrası varsa da sonrasına link veriyoruz. Normalde düz liste olunca 1 yazılırdı ama pagination yapınca 2 ile verileri çekiyoruz bunuda belirtmiş olayım.


Ek:Tagların bazıları görünmüyor mouse ile seçip urllere bakın elimden gelen bir şey yok bloggerdaanca bu kadar kod yazılıyor.

The Order Of The Stick


Paylaşacağım diğer bir web comic ilk başladığım seri olan order of the stick. Yıllardır yayında olan bu seri Rich Burlew’in elinden çıkmakta. Sitesi GiantITP aynı zamanda ErfWorld’ün birinci kitabına ev sahipliği yapmıştı. FRP ve DnD dünyasına eğlenceli bir şekilde yaklaşan seride aynı zamanda çok sağlam bir konu var. Bazı bölümler için efsanevi diyebilirim. Uzun yıllardır sürdüğü için karakterler bizden birisi gibi oldu. Konusunu kısaca anlatmak gerekirse bir grup kahraman kötü lichi durdurmak için maceraya başlarlar. Yolda önlerine gelen rakipleri aşarken onları bekleyen yeni düşmanlar ve tuzaklardan habersizdirler. Ama ne olursa olsun onlar bizi güldürmeyi hep başarır. Şuan 690. sayısı yayınlanmış durumda eğer başlamadıysanız başlayın hemen 🙂 Böylece muhabbet edecek daha çok konumuz olur.
Bu arada ufak bir not ürünlerini şu adresten (mesela son çıkacak kitabı) bulabilirsiniz. Kitabını alamıyorum bari reklamını yapayım yıllardır okuyoruz bir katkımız olsun.

Site – 3


3 oluyor bu daha önce 2 resim yayınlamıştım. Onların başlığı farklıydı ama olsun. Şimdi profil var, kayıt olunuyor, albüm var, iletişim formu var, rss desteği var, commentler var, news başlıklı bir dinamik içerik bölümü var istenirse başka da eklenir. sitemap eklenecek kolay iş o tüm içeriği tamamladıktan sonra halledeceğim. Başka ne gerekir buna? Sanırım tag özelliğini eklemem gerek SEO için de lazım oluyor. İşte temaya başladım, hazır bir tema kullanmak istemediğim için sıfırdan yazıyorum. Nerden başlasam diye bir an duraksamıştım sağolsunlar GimpTR sitesine güzel bir bölüm eklemişlerdi gimp ile web teması yapımıyla ilgili o yazı dizisi işimi gördü. Görselleri hazırlamadım sadece kodlarını tamamladım. Görsel işini arkadaşın tekine yıkmayı planlıyorum. 🙂 GimpTR‘yi uzun süredir takip ederim. Hani şu ülkede bu tarz kaç site var bilemiyorum. Açık kaynak bir program hakkında detaylı bilgi veriyorlar ve üstelik bunu çok iyi yapıyorlar, sağolsunlar. Neyse buyrun sitemin son hali. Sakın bunun şu bahsettiğim dizi/sinema portalı olduğunu sanmayın. Hoş onun içinde kullanabilirim ama bu sistemin daha çok pişmesi gerek.

Django URL kalıbını isimlendirme

Her belge için birer link ekleyeceğimi söylemiştim. Bun yapmak basit aslında öncelikle URL kalıbımızı(pattern) isimlendirmemiz gerekiyor mesela örnek olarak benimkileri yapıştırıyım buraya.
url(r’^news/$’, ‘cms.news.views.index’, name=’gmsnews’),
url(r’^news/(?Pd+)/$’, ‘cms.news.views.details’, name=’gmsdetails’),
Normalde url fonksiyonu içersinde kullanmıyoruz bu kalıpları ama isimlendireceğimiz zaman başına url koymamız gerekiyor. name atadıktan sonra template de istediğimiz şekilde bu urlleri çağırabiliriz. örneğin gmsdetails urlsi şu şekil çağrılıyor:
{%url gmsdetails pnews.id%}
Burada her id için sayfa atayacağı için id numarasınıda değişkenin içine yazmamız gerekiyor. Yazmazsak hata alırız. Normal gmsnews sayfasına dönmek içinse şunu yazıyoruz.
{%url gmsnews%}
Böylelikle uygulamama her haber bağlantısı için birer link ve ayrıntı sayfasınada geri dönüş linki eklemiş oldum. Aynı zamndan çaktırmadan da feed desteğini ekledim ama ondan bahsetmiyeceğim.

Django İle Bugünlük Bu Kadar


Basit bir şeye benziyor değil mi? Sanki düz htmlmiş gibi meret. Şimdilik görsellikle uğraşmadım onu ne sitesi olursa ona göre düzelteceğim. Bugün yaptıklarımı kısaca anlatmak gerekirse eski bir projemi tekrardan dirilttim. Hani şu yeşilli temalı bir blog projesi vardı resmini paylaşmıştım. İşte onu biraz daha geliştiriyorum. Dediğim gibi kodlara uzun süre bakmadığım için unutmuştum bir de başka bir özellik ekleyeceğim derken tüm sistemi dağıttım. Neyse sonradan düzelttim. Şimdi bundan böyle artık üye olabiliyoruz, üyeler giriş yapabiliyor çıkış yapabiliyor. Profillerini düzenleyebiliyorlar avatar yükleyebiliyorlar ama ben o özelliği kullanmayacağım. Sonracığıma statik sayfalar için bir modül vardı onu kaldırdım dediğim gibi hızlı olması için onları ayrı bir klasörde html olarak toplayıp nginx ile yayınlayacağım. Hmm sonra news sınıfıını geliştirdim biraz artık ana sayfada gönderenin adı ve saati yayınlanıyor otomatik. Bundan sonra comment ekleyeceğim. Sonra o sayfa başlıklarının ayrıntılı gözükmesi için başlıklara link vereceğim. Başka ne eklerim bilmiyorum ihtiyaç doğrultusunda bakacağız artık.

Herkese kolay gelsin.

Django Notları

Bugün eski projelerimden birisine bakmam gerekti. Daha önce friendfeed de bir link paylaşmıştım. Django hakkında 10 numara gibi bir şeydi ama paylaşmama rağmen kendimin bu numaraları kullanmadığımın farkına vardım. Kodları Linux’ta yazdığım için dizinleri tek tek linuxa göre yazmıştım. Windows’a gelince tabiki hiç biri çalışmadı. Bende aynı hatayı yapmamak için bu numaralardan birisini çektim. Böylece bundan böyle kodları hangi platforma taşırsam taşıyım çalışacaklar. Unutkanlığımdan kurtulmak için blogda paylaşıyorum böylelikle bir daha aynı hatayı yaparsam insanlar beni kınayabilecek 😛

neyse gelelim koda:

import os ile elbette os modülünü ekliyoruz settings.py dosyasına ondan sonra
SITE_ROOT = os.path.realpath(os.path.dirname(__file__)) satırını ekliyoruz. Böylelikle dosyamızın bulunduğu dizinin adresini alıyoruz.
Sonra artık ne için dizin gerekiyorsa bunun üzerine çalışıyoruz mesala bende templates dizinine girmem gerekiyordu şöyle girdim.
TEMPLATE_DIRS = (os.path.join(SITE_ROOT, ‘templates’),) virgüle dikkat edin.

Diğer bir husus DEBUG’ı sunucuya taşıdımızda False yapmaktı. Bunun için şöyle bir şey buldum:


import socket

if socket.gethostname() == 'xxx111.com':
    DEBUG = False
else:
    DEBUG = True

Burada da host name’i alıyoruz xxx111.com’sa cevap demek ki sunucuya yollamışız diyoruz ve False ediyoruz. Bu özelliği deneyemedim daha yanlışsa düzeltin beni.

Bir başka numara ki bence benim yaptığım en büyük hatalardan birisi buydu. Statik sayfaları apache’ye yüklettirmekti. Onlar için ayrı bir model bile yazmıştım oysa ne gerek var böyle bir şeye? Statik sayfa için admin paneli gerekmiyor herhangi bir editör ile html olarka oluşturup yayınlasak yeterli. Bunun için nginx kullanıp htmlleri onun üzerinden yayınlamak gerekiyormuş. Bunu sunuya geçtiğimde kullanacağım.

http://docs.djangoproject.com/en/dev/topics/cache/ sitesinde cache olayı anlatılmış uzun uzun. Ben memcached’ı gözüme kestirdim her ne kadar şuan ihtiyacım olmasada ilerde olabilir diye hazırda koda ekleme yapabilirim. Tabi böyle bazı şeyleri denemek ve performans farkını görmek için dolu bir içeriği sunucuda test etmem gerekiyor. DB de 100 veri varken göstereceği farkla 10000 veri varken göstereceği farkı anlamak gerek. Deneyen varsa yorum yapsın bizde bilelim. Ona göre diğer cache yöntemlerinden birisinide kullanabilirim.

Siteyi hızlandırmak için diğer bir yöntemde css ve js’leri sıkıştırmakmış. django-compress isimli bir modül aracılığıyla bu işlem yapılıyor. İki tane js’i sıkıştırsan ne olur sıkıştırmasan ne olur diyebilirsiniz ama django’yu hızlandırmak için yaptığım aramalarda bir kaç kişi bu özelliği anlatmış. Şimdi yine kullanıcı sayısıyla orantılı bir konu. Tek bir js bile olsa 100k kullanıcınız varsa bu yöntemler etkili olabilir. Ama ben sadece blog yazacam derseniz gerekmeyebiliyor. Bana göre basit bir blog dahi yazsakta (ki öyle bir site için 4-5 model bile yetiyor) işimizi düzgün yapıp bu teknikleri uygulamalıyız. İleride belki o uygulamayı başka bir tanesine ekleriz bilemezsiniz gelecekte ne olacağını.

Hız için diğer tavsiyeler apache ile alakalı onları başka bir yazıda paylaşırım. Birde auth modülüyle ilgili güzel örnekler var. Django’nun en sevdiğim özelliği kullanıcı girişi için ekstra bir çalışma yapmamanız. İsterseniz kendi login templateni bile kullanabiliyorsunuz. Başka platformlarda belki uzun uzun kodlar yazmanız gerekir login olabilmesi için kullanıcınızın, djangoda ise template 1-2 link ekliyorsunuz tamam iş.

Neyse, herkese iyi çalışmalar.