Monday, December 30, 2019

2010lar



2010 başları: Mahjong, babaannemin evi, merdivenin altındaki tüplü ekranlı PC. Ve mutluluk.

2019 sonları: Backgammon, babaannemin evinde çocukluğu geçen kuzenimin hastanesi, acil dahiliyede MacBook Pro. Ve kayboluş.

Sunday, December 15, 2019

Geleceğe geceden bir not

İtiraf etmeliyim, Blogger'ı özlemişim. Blogger'da yazmayı da okumayı da. Özellikle de saat gece 03'ten sonrasında. Sanırım bunu yapmayalı 6 yıla yaklaşıyor.

Bir süredir bir şeyler yazmak peşindeyim. Ancak yazacaklarımın insanlarda sadece "likelanabilir" olmaktan daha özel niyetler oluşturması önceliğim. Bir süredir farklı bir domain'de statik bir tool ile yazmaya çalışıyordum, sonrasında Medium'da. Birçok taslağımın artık ufak ufak insanların bir şeyler ararken bulabilecekleri belki faydalanabilecekleri belki zaman kaybıydı deyip bunu kahrolası like ve dislike fonksiyonlarıyla değil, uski usul -old school- emek vererek yorumlar girebilecekleri bir hale getirmek istiyorum. Bunun için de eski dostum Blogger'a bir selam vermem yetti.

Geçtiğimiz 5 yılın bir özeti elbette olabilir. Ancak gecenin bu saatini farklı bir konu için ayırmak istiyorum. Konumuz sosyal medya.

Sosyal medya alışkanlıklarımı kısalı, kısma çabam başlayalı oldukça uzun bir süre oldu. Açıkçası eski tadı alamıyorum paylaşımlardan, sorulardan, özenle verilen cevaplardan. Yazılı derin paylaşımlar yapamayalı oldukça uzun bir zaman oldu. Özlüyorum ve üzülüyorum.

5 yıl kadar önce saygı duyabilmeyi öğrenmeye başladım. Ancak şu an görüşlerim, nasıl derler, "complicated".

Neyse, muhabbet etmeyip/edemeyip sonradan stalk ederek hayatlarımıza devam edelim. Böyle kazanacağız.

Oh, iyi geldi...

Thursday, June 25, 2015

[Django] Changing field widget when when using inlines

For example, if you create a SiteOption model to extend Django's core sites framework you may want to add multiple inlines from one model (SiteOption) for grouping options, like:

General Options
Theme Options
Security Options
SEO Options

"Show me the code!"

Wednesday, June 17, 2015

[Django] Using cloud storage services as default storage backend

To use cloud storage services as default storage backend in Django – or actullay in Python, Apache's Libcloud wrapper can be a nice solution. Because it supports more than 30 providers, and has a huge community.

django-storages-redux app provides storage backends to use in Django. Good news, also supports Apache Libcloud. So you can use more than 30 cloud providers with Django. To install the app execute this:
$ pip install django-storages-redux
Also you must install Apache Libcloud:
$ pip install apache-libcloud
And enable from settings.py by adding following lines:
DEFAULT_FILE_STORAGE = 'storages.backends.apache_libcloud.LibCloudStorage'
DEFAULT_LIBCLOUD_PROVIDER = 'google_storage'
LIBCLOUD_PROVIDERS = {
 'google_storage': {
 'type': 'libcloud.storage.types.Provider.GOOGLE_STORAGE',
 'user': 'yourcloudstorageapikey:)',
 'key': 'yourcloudstorageapisecretkey:)',
 'bucket': 'default-bucket-name',
 }
}
 If you don't create bucket, you can create from shell:
$ ./manage.py shell

$ from storages.backends.apache_libcloud import LibCloudStorage
$ LibCloudStorage('google_storage').driver.create_container('default-bucket-name')

Wednesday, June 10, 2015

Detecting if an image is really an image

About Technique

HTTP protocol has really cool methods such as HEAD. HEAD method allows you to get only head data instead of head and body. Head data contains mimetype of the body, so we can rely on it to detect if it's really an image. Let's get it with JavaScript...

The Code

Sync Example


Async Example


As you can see, you can even detect huge images very quickly. ;)

Originally posted at https://coderwall.com/p/qdg71a/detecting-if-an-image-is-really-an-image

Sunday, April 19, 2015

Using Nginx on Mac OSX

To install Nginx on your Mac you can use simply brew command:
$ brew install nginx 
Default Nginx server name is localhost with 8080 port. So you can see default Nginx page by entering http://localhost:8080 address. Let's change something:

Changing default server name and port
Nginx.conf located at /usr/local/etc/nginx/nginx.conf dir. Open it with your favorite editor, to me the Vim:
$ vim /usr/local/etc/nginx/nginx.conf
 You'll see default server configuration like this:
server {    listen 8080;    server_name locahost;
    ## other things}
Change them with what you want and save the file. To reload Nginx configuration you should restart Nginx by calling these:
$ sudo nginx -s stop$ sudo nginx 
Including multi server defination from different files
Aww, cool topic. To keep different server definations in different files, you should need to this. Open nginx.conf, locate your cursor to the end of http defination block and simple paste this two lines:
$ include /usr/local/etc/nginx/conf.d/*.conf;
$ include /usr/local/etc/nginx/sites-enabled/*.conf;
Now your can create symlinks to these directories. Of course, don't forget to restart Nginx!

Saturday, February 21, 2015

[Django] Farkli App Icerisindeki Model'leri Ayni Grupta Gosterebilmek

Django admin'de birbiri ile alakali olan iki farkli app'iniz mevcutsa, bu modelleriniz asagidaki gibi gorunecektir:

[App 1]
- Model 1
- Model 2
[App 2]
- Model 3
Ancak siz bu goruntuyu istemiyor, asagidaki gibi bir goruntu istiyorsunuz:
[App 1]
- Model 1
- Model 2
- Model 3 
Hosgeldiniz! Yapilmasi gereken islem, App 2 altinda bulunan Model 3'un Meta sinifinda o modelin app'inin aslinda App 1 oldugunu soylemek. Onu da boyle yapiyoruz:



Onemli Guncelleme:
Bu degisikligin etkileri sandiginizdan daha buyuk olabilir. Bu islem tam anlami ile Django'nun app mimarisindeki app'inizin adinin degistirilmesi anlamina geliyor. Yani varsayilan olarak app'inizin adi olusturulan klasor ayni iken bunun degistirilmis olmasini sagladik. Buna ek olarak Python'un package yapisi yine klasor adi uzerinden calisacaktir.

Bu guncellemeyi yapmama neden olan case, bu app adini degistirdigim zaman bu Model 3'un Model 2'de Foreign key olarak tanimlandigi yerde hata almaya basladim. Bunun sebebi olaraki su tanimlamaydi:


Artik app adimiz 'app_1' olduguna gore buradakini de gistirmek zorundayiz. Bu durumda modelin refresh edilecegini de uzuntuyle belirtmem gerekiyor. :(