tag:blogger.com,1999:blog-60267288068301538372024-03-13T04:01:57.554-07:00Berat DoğanBerat Doganhttp://www.blogger.com/profile/03522794789358947488noreply@blogger.comBlogger30125tag:blogger.com,1999:blog-6026728806830153837.post-89630425279511169542015-06-25T07:16:00.001-07:002015-06-25T07:17:47.346-07:00[Django] Changing field widget when when using inlinesFor 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:<br />
<div>
<br /></div>
<div>
General Options</div>
<div>
Theme Options</div>
<div>
Security Options</div>
<div>
SEO Options</div>
<div>
<i><br /></i>
<h4>
<i>"Show me the code!"</i></h4>
</div>
<div>
<script src="https://gist.github.com/beratdogan/bd57ef57e53b12b48d9e.js"></script></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-6625136301838226672015-06-17T07:39:00.000-07:002015-06-25T07:40:10.431-07:00[Django] Using cloud storage services as default storage backend<div class="tr_bq">
To use cloud storage services as default storage backend in Django – or actullay in Python, Apache's <a href="https://libcloud.apache.org/" target="_blank">Libcloud</a> wrapper can be a nice solution. Because it supports more than 30 providers, and has a huge community.</div>
<br />
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:<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">$ pip install <a href="https://github.com/jschneier/django-storages" target="_blank">django-storages-redux</a></span></blockquote>
Also you must install Apache Libcloud:<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">$ pip install apache-libcloud</span></blockquote>
And enable from settings.py by adding following lines:<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">DEFAULT_FILE_STORAGE = 'storages.backends.apache_libcloud.LibCloudStorage'<br />DEFAULT_LIBCLOUD_PROVIDER = 'google_storage'<br />LIBCLOUD_PROVIDERS = {<br /> 'google_storage': {<br /> 'type': 'libcloud.storage.types.Provider.GOOGLE_STORAGE',<br /> 'user': 'yourcloudstorageapikey:)',<br /> 'key': 'yourcloudstorageapisecretkey:)',<br /> 'bucket': 'default-bucket-name',<br /> }<br />}</span></blockquote>
If you don't create bucket, you can create from shell:<br />
<blockquote>
<span style="font-family: Courier New, Courier, monospace;">$ ./manage.py shell</span><span style="font-family: Courier New, Courier, monospace;"><br /></span><span style="font-family: Courier New, Courier, monospace;"><br /></span><span style="font-family: Courier New, Courier, monospace;">$ from storages.backends.apache_libcloud import LibCloudStorage</span><span style="font-family: Courier New, Courier, monospace;"><br /></span><span style="font-family: Courier New, Courier, monospace;">$ LibCloudStorage('google_storage').driver.create_container('default-bucket-name')</span></blockquote>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-51351895441788631712015-06-10T16:02:00.000-07:002015-06-25T05:19:06.883-07:00Detecting if an image is really an image<h2>
About Technique</h2>
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...<br />
<h2>
The Code</h2>
<h4>
Sync Example</h4>
<script src="https://gist.github.com/beratdogan/615c7f2a7515550766e3.js?file=async.coffee"></script>
<br />
<h4>
Async Example</h4>
<script src="https://gist.github.com/beratdogan/615c7f2a7515550766e3.js?file=async.coffee"></script>
<br />
As you can see, you can even detect huge images very quickly. ;)<br />
<br />
<i>Originally posted at https://coderwall.com/p/qdg71a/detecting-if-an-image-is-really-an-image</i>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-54857493854219775362015-04-19T02:57:00.002-07:002015-04-19T02:57:15.764-07:00Using Nginx on Mac OSX<div class="tr_bq">
To install Nginx on your Mac you can use simply brew command:</div>
<blockquote class="tr_bq">
<i>$ brew install nginx </i></blockquote>
Default Nginx server name is <i>localhost</i> with <i>8080</i> port. So you can see default Nginx page by entering <i>http://localhost:8080</i> address. Let's change something:<br />
<br />
<b>Changing default server name and port</b><br />
Nginx.conf located at /usr/local/etc/nginx/nginx.conf dir. Open it with your favorite editor, to me the Vim:<br />
<blockquote class="tr_bq">
<i>$ vim /usr/local/etc/nginx/nginx.conf</i></blockquote>
You'll see default server configuration like this:<br />
<blockquote>
<i>server {</i><i> listen 8080;</i><i> server_name locahost;</i><i><br /></i><i> ## other things</i><i>}</i></blockquote>
Change them with what you want and save the file. To reload Nginx configuration you should restart Nginx by calling these:<br />
<blockquote class="tr_bq">
<i>$ sudo nginx -s stop</i><i>$ sudo nginx</i> </blockquote>
<b>Including multi server defination from different files</b><br />
Aww, cool topic. To keep different server definations in different files, you should need to this. Open <i>nginx.conf</i>, locate your cursor to the end of <i>http</i> defination block and simple paste this two lines:<br />
<blockquote>
<i>$ include /usr/local/etc/nginx/conf.d/*.conf;<br /> $ include /usr/local/etc/nginx/sites-enabled/*.conf;</i></blockquote>
Now your can create symlinks to these directories. Of course, don't forget to restart Nginx!<br />
<br />
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-46941287535792656722015-02-21T11:20:00.003-08:002015-02-21T13:21:50.878-08:00[Django] Farkli App Icerisindeki Model'leri Ayni Grupta Gosterebilmek<div class="tr_bq">
Django admin'de birbiri ile alakali olan iki farkli app'iniz mevcutsa, bu modelleriniz asagidaki gibi gorunecektir:</div>
<br />
<blockquote>
[App 1]<br />
- Model 1<br />
- Model 2<br />
[App 2]<br />
- Model 3</blockquote>
Ancak siz bu goruntuyu istemiyor, asagidaki gibi bir goruntu istiyorsunuz:<br />
<blockquote class="tr_bq">
[App 1]<br />
- Model 1<br />
- Model 2<br />
- Model 3 </blockquote>
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:<br />
<br />
<br />
<script src="https://gist.github.com/beratdogan/e29d2f41aa9780b058ec.js?file=model3.py"></script>
<br />
<b>Onemli Guncelleme:</b><br />
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.<br />
<br />
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:<br />
<br /><br />
<script src="https://gist.github.com/beratdogan/e29d2f41aa9780b058ec.js?file=model2.py"></script>
Artik app adimiz 'app_1' olduguna gore buradakini de gistirmek zorundayiz. Bu durumda modelin refresh edilecegini de uzuntuyle belirtmem gerekiyor. :(Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-40723518156139401142015-01-03T10:12:00.000-08:002015-02-21T11:09:30.243-08:00Yazar Olma SorunsaliYaklasik bir bucuk sene once buyuk paylasim umutlari ile actigim bloguma ozellikle son bes aydir yazamadigimi fark ettim. Draft olarak birkac paragrafi yazilmis 18 adet yazim bulunmaktaymis. Bunlari sirasiyla tamamlayip daha fazla yazmak niyetindeyim. Yazi yazmak uretkenligimi arttirdigini hatirliyorum. Bunun ustune gidecegim. Hatta yazmanin faydalari da bir konu olarak olabilir!
Takipte kalin, degerli gunluk bir tane olan ziyaretcilerim!
21 Subat '14 guncellemesi: (Yazamadi)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-54690640109984541282014-07-31T01:33:00.001-07:002014-08-21T05:38:24.771-07:00[DevOps][Nginx] fastcgi_pass ProblemsIf you are getting error about fastcgi_pass option like this:
<blockquote>2014/07/31 08:08:39 [error] 3536#0: *6 connect() failed (111: Connection refused) while connecting to upstream, client: 95.95.95.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost"</blockquote>
or this:
<blockquote>2014/07/31 08:25:07 [crit] 3644#0: *23 connect() to unix:/tmp/php5-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 95.95.95.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/tmp/php5-fpm.sock:", host: "localhost"</blockquote>
You have probably setted wrong or passive TCP or socket address. You can learn PHP's TCP or socket addsress from <i>/etc/php5/fpm/pool.d/www.conf</i> file. Check lines that starts with these:
<blockquote>listen = 127.0.0.1:9000
;listen = /tmp/php5-fpm.sock
</blockquote>
Destroy <i>;</i> char from starting, and have fun! Don't forget to restart your PHP or your another service -- like this <i>$ service php5-fpm restart</i>!Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-11980749956709335932014-07-21T12:54:00.003-07:002014-07-21T12:54:59.020-07:00[Vagrant][Nginx][Laravel] Laravel Kurulum Sorunlarihttp://laravel-recipes.com/recipes/26
http://laravel.io/forum/05-14-2014-502-bad-gateway-in-vagrant-permission-deniedUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-60338247311337054992014-07-18T02:30:00.003-07:002014-07-18T02:30:47.580-07:00[Nginx] Konfigurasyon Dosyalarini Test EtmekNginx eger site konfigurasyonlarinizi mazeret gostererek <i>service nginx restart</i> komutlariniza kayitsiz kaliyorsa, asadidaki komut ile Nginx konfigurasyon dosyanizi test edip sorunun kaynagina ulasabilirsiniz.
<blockquote>/usr/nginx/sbin/nginx -t -c /etc/nginx/DOSYA.conf</blockquote>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-56119489631283327382014-05-14T19:29:00.002-07:002014-05-14T19:29:27.866-07:00[Git] GitHub Sifresini KaydetmekBaslikta her ne kadar GitHub gecse de bu sadece GitHub icin gecerli degil. Bircok Git <i>client</i>inde durum aynidir. <i>pull, push</i> gibi git sunucunuza baglanmaniz gerektigi islemlerde sizden giris bilgileri istenecektir. Ancak surekli bilgileri girmek sikici bir hale gelebilir. Tabii bunun adi asla usengeclik olamaz ;)<br />
<br />
Onunuzde iki secenek mevcut; gecici olarak <i>cache</i>lemek, kalici olarak saklamak.<br />
<br />
<b>Gecici Olarak Cachelemek</b><br />
<br />
<blockquote class="tr_bq">
$ git config --global credential.helper 'cache --timeout=300'</blockquote>
Burada 300 yerine saniye bazinda <i>cache </i>suresini girebilirsiniz.<br />
<br />
<b>Kalici Olarak Saklamak</b><br />
<br />
<blockquote class="tr_bq">
$ git config --global credential.helper store</blockquote>
<i>Her iki secenek icin de Git surumunuzun 1.7.9 olmasi gerekli.</i><br />
<i><br /></i>
<b>Kaynaklar</b><br />
http://git-scm.com/docs/git-credential-cache<br />http://wiki.epfl.ch/help-git-en/can-i-store-my-password-for-the-command-lineUnknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-59306264971020936542014-04-23T17:47:00.000-07:002014-04-23T17:48:25.925-07:00[JavaScript][CoffeeScript] Degisken/Fonksiyon Etki AlanlariJavaScript'te alisilmisin disinda <i>-PHP'nin disinda!-</i> bir etki alani prensibi mevcut. Ust seviyede tanimlamis oldudugunuz bir degisken ya da fonksiyona asagi seviyelerden ulasabilirsiniz. Alt seviyeden ust seviyeye ise hayir. (Yani bunun yontemleri var ancak konuyla alakali olmadigindan dolayi pas geciyorum.)<br />
<br />
Beni bu arastirmaya iten "<i>CoffeeScript'teki <span style="font-family: Courier New, Courier, monospace;">-></span> ile <span style="font-family: Courier New, Courier, monospace;">=></span> arasindaki farkin nedenir nedir?</i>" sorusuydu. Sorunun cevabi yukaridaki bilginin varligindan haberi olan kisiler icin <a href="http://coffeescript.org/#fat-arrow">gayet net olarak dokumante edilmis</a> CoffeeScript tarafindan. Durumu aciklamaya calisalim:<br />
<br />
<script src="https://gist.github.com/beratdogan/11237301.js?file=1_scope.js"></script>
Peki ya yukaridaki gibi bir kodlamada ust seviyedeki elementi secmek istersek? Ki buyuk ihtimalle oyle bir seye ihtiyaciiz olacaktir. Oyleyse asagidaki gibi yapip baska bir degiskene atamak gerekli, referans gosterip elbette.<br />
<br />
<script src="https://gist.github.com/beratdogan/11237301.js?file=2_scope.js"></script>
Islem bu kadar. Simdi gelelim bunun CoffeeScript ile olan iliskisine:<br />
<br />
CoffeeScript ile calisiyorken nesne tabanli calismak zorunda hissediyorsunuz kendinizi, "class" etiketini gordukten sonra, ehehe. Elbette boyle bir durumda <i>this </i>kelimesi sizin icin gerekli oluyor, gerci bu ornekte sinif tanimlanmiyor ancak yine de ilintili. Lafi da fazla uzatmadan CoffeeScript'in kendi ornegi uzerinden olayi aciklamak istiyorum:<br />
<script src="https://gist.github.com/beratdogan/11237301.js?file=3_scope.coffee"></script>
<br />
Sorun kendini bellli ettigine gore cozumune de asagidan ulasabilirsiniz:<br />
<script src="https://gist.github.com/beratdogan/11237301.js?file=4_scope.coffee"></script>
<br />
Bu kadar... :)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-40074904444280512582014-04-21T15:19:00.000-07:002014-04-21T15:19:42.375-07:00[NodeJS][Ipucu] npm Paketlerini Global Olarak YuklemekCoffeeScript, underscore gibi bazi paketler her projede (daha dogrusu bir projeden de bagimsiz her yerde) gerekli olarbilir. Boylesi durumlarda "Yok mu bu paketleri her yerde kullanabilmenin bir yolu?!" diyebilirsiniz. Elbette var! Paketleri yuklerken tek yapmaniz gereken <span style="font-family: Courier New, Courier, monospace;">npm install <pkg> -g</span><br />
seklinde -gparametresinden faydalanmak.<br />
<br />
<b>Kaynaklar</b><br />
<a href="http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/">http://blog.nodejs.org/2011/03/23/npm-1-0-global-vs-local-installation/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-15511120736378468192014-04-17T06:06:00.000-07:002014-05-08T11:52:06.239-07:00[Facebook API] Bir Gorusmedeki Tum Mesajlari AlmakEger bir arkadasinila uzun sureli Facebook'tan iletisim kuruyorsaniz, ve o kisi ile suan iletisimde degilsiniz ancak iletisime gecmek icin hos bir seyler yapmak istiyorsaniz, Facebook'ta olan guzel konusmalarinizi ona iletmek isteyebilirsiniz.<br />
<br />
Kodlama kisisel olduguu icin, ne sintaks, ne testler hic bir sey yoktur. Sadece isinizi gorsun yeterli. :)<br />
<br />
Oncelikle mesajlari Facebook API'si ile 30'arli gruplar halinde cekiyoruz. Sonrasinda onlari PHP tarafinda birlestiriyoruz.<br />
<br />
<br />
<script src="https://gist.github.com/beratdogan/3574cc733e6ab1fcb286.js"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-19488735953835765992014-04-12T20:30:00.000-07:002014-04-29T10:05:11.794-07:00[CoffeeScript] Watcher Shell/CommandAppends seperated .coffee files into one file, and compiles as application.js. So cool, hah?<br />
<br />
<b>Example structure:</b><br />
-- 10_controllers<br />
---- home.coffee<br />
---- show.coffee<br />
---- admin.coffee<br />
-- 90_ui<br />
---- home.coffee<br />
---- show.coffee<br />
---- admin.coffee<br />
<br />
<b>Example output:</b><br />
<i>Imagine all of above Coffee files in one compiled file as well as every hitting CTRL+S!</i><br />
<br />
<script src="https://gist.github.com/beratdogan/10564016.js"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-34337802343365208862014-04-05T14:50:00.000-07:002014-04-07T05:23:30.838-07:00AngularJS Ogreniyorum!Uzunca zmandir kendimi pratik anlamda bir seylerde gelistirmedigimi fark ettim. Teorik bilgimin oldugu <i>Single-Page Application</i>'lar da zaten ne zamandir aklimda iken AngularJS'yeogrenmek uzere kollanrimi sivadim. Umuyorum ki Onumuzdeki birkac yazimda AngularJS hakinda goruslerimi yazacagim. "Neden AngularJS?" sorusuna simdilik tek cevabim "Cunku arkasinda Google var!" olacaktir. Bakalim ilerleyen asamalarda neler olacak...<br />
<br />
<b>Yazilar (yazilmasi plananan yazilar)</b><br />
<br />
<ul>
<li><i>Single-Page Application</i>larda SEO Uzerine</li>
<li>AngluarJS vs. Backbone</li>
<li>Ucmaya Hazirlik: AngularJS, jQuery ve CoffeeScript!</li>
</ul>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-66535085208543807772014-03-15T04:36:00.001-07:002014-04-28T09:19:17.435-07:00[C#] Exe icine Gomulmus Baska Bir Exe'yi CalistirmakC#'ta bir program yazarken bazen farkli bir calistirilabilir (exe) dosyayi calistirmak gerekebilir. Bu noktada ana sorun, bir programin icine farkli bir dosyayi nasil gomup, onu nasil geri cikartacagimizdir. Hadi yapalim!<br />
<br />
Yapacagimiz islem, dosyayi bir temp dosyaya kaydedip, onu calistirmak...<br />
<br />
Oncelikle calistirmak istedigimiz dosyayi, projemizin icine gonderiyoruz ve sag tiklayip Properties barini acip Build Action ozelligini Embeded Action olarak ayarliyoruz ki programimizi derledigimizde dosyamiz da exemizin icine gomulmus olsun.<br />
<br />
Oncelikle gecici dosyalar olusturmak icin buldugum bir sinif var. Onu programize dahil edelim:<br />
<script src="https://gist.github.com/grafitus/9565628.js?file=TempFileClass.cs"></script>
<br />
<br />
Simdi de programi calistirmak istedigimiz yerdeasagidaki kodu yaziyoruz:
<script src="https://gist.github.com/grafitus/9565628.js?file=run.cs"></script>
<br />
Bu kadar, tabii ihtiyaciniza gore sekillendirmek size kalmis...Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-21926255671051809132014-03-10T07:36:00.001-07:002014-03-10T11:33:59.956-07:00Mozilla Addon SDK'da console.log() Mesajlarini GorebilmekHep REGEDIT tarzi kayit defterlerinde mevcut olmayan, ancak sonradan birilerinin eklemesine izin verebilen sistemlere "gicik" olmusumdur. Yine bu tarz bir seyle karsilastim... <b>*</b><br />
<br />
Sorun, Addon SDK'da main.js'de <span style="font-family: Courier New, Courier, monospace;">console.log("log mesaji icerigi"); </span><span style="font-family: inherit;">yazdiginizda bunu varsayilan olarak <i>Browser Console'da </i>goremezsiniz. Sistem elestirisini birakip hemen cozumu veriyorum:</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Yeni bir sekme acip adres cubuguna </span>about:config yazip, ardindan cikan uyariyi da kabul edip Firefox'un REGEDIT'ine ulasmis oluyoruz. Burada sag tiklayip, Yeni'yi ardindan da Dizi'yi seciyoruz. Gelen ekranda <i>prefence name</i> olarak <span style="font-family: Courier New, Courier, monospace;">extensions.sdk.console.logLevel</span> giriyoruz. Bunun degerini de <span style="font-family: Courier New, Courier, monospace;">all </span>yapiyoruz.<br />
<br />
Artik console.log() mesajlarini <i>Browser Console</i>'da gorebilirsiniz.<br />
<br />
<b>* Guncelleme </b>Biraz daha arastirmadan sonra yukaridaki ilk paragraftaki sitemlerimde haksiz oldugum sonucuna vardim. <a href="https://developer.mozilla.org/en-US/Add-ons/SDK/Tools/console#Logging_Levels" target="_blank">console referansinda</a> yukaridaki secenegin varsayilan olarak tanimli gelmeyisinin sebebi olarak, eklentiye ozel tanimlama yapabilmemize olanak saglamak amacli oldugu sonucu cikarilabiliyor. :)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-26131963033901890582014-02-25T19:20:00.000-08:002014-02-25T19:20:00.000-08:00.Net2.0 Uygulamalarinin .Net4.0'da CalismamasiMerhabalar,<br />
<br />
Oncelikle sizden cok kendimin saskinlikler icinde oldugunu belirtmeliyim. .Net teknolojilerine her daim karsit birisi oldugum biline dursun, bu konuda bir yazi yazma geregi hissedecegimi dahi tahmin etmezdim. Insanin basina her sey gelebiliyor...<br />
<br />
Bir proje icin ufak bir "calistirilabilir uygulama"ya ihtiyac oldu. Mecburen Vusial Studio'yu kurmak zorunda kaldim. :) Uygulamada cok fazla islem olmadigindan dolayi, daha dusuk gereksinimleri olmasi amaciyla .Net2.0 kullanarak yazdim. Ancak is testlere geldiginde .Net4.0 kurulu bilgisayarlarda "Unable to find a version of the runtime to run this application." seklinde bir hata aldim. Biraz arastirmalar sonucunda .Net4.0'in geriye yonelik destek vermedigini ogrendim. (Hayir hayir, elestiri yapmayacagim!)<br />
<br />
Cozum olarak ise App.config dosyasi olusturup, icerisine bunun .Net4.0 ile uyumlu oldugunu belirtmemiz gerekliymis. App.config dosyasinin icerigi soyle:<br />
<br />
<script src="https://gist.github.com/grafitus/9222874.js"></script>
<br />
Bunu yaptiginizda sorunun ortadan kalkacagini umuyorum.<br />
<br />
---<br />
<br />
Simdir bir nokta daha var ki eger siz de "building" isleminden sonra ekstra bir dosya olmasindan sikayetteyseniz, -<i>cok basit bir cozum olarak</i>- WinRAR'in SFX ozelligini kullanarak tum dosyalari tek cati altinda toplayip acildiktan sonra programinizin acilmasini saglayabilirsiniz. Benim isimi gordu. :)Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-49638372127066908952014-02-04T01:33:00.002-08:002014-04-28T11:54:22.962-07:00[PHP] Tek Kullanimlik Sinif YapmakMerhabalar,<br />
<br />
Facebook'taki PHP grubunda birisi boyle bir istekde bulunmus. Siniftan sadece tek bir "instance" uretmek, daha sonra istenildiginde ise bir Exception vermesi isteniyordu.<br />
<br />
PHP5.4'un nimaetlerinden traitler yardimiyla bunu hazirladim. Guzel bir ornek olacagini dusunuyorum.<br />
<br />
Trait kullanilarak hazirlanan sinif ilk getInstance() metodu kullanildiginda sinifin bir ornegini gonderecek, bir dahaki cagirildiginda ise <i>DisposableClassException </i>gonderecektir. Bunu yakalamak da size kalmis. :)<br />
<br />
<script src="https://gist.github.com/beratdogan/8791849.js"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-89896198022178860372013-12-27T12:33:00.001-08:002014-04-28T09:20:40.102-07:00[PHP] DOMDocument Sınıfının Desteklenmeyen Etiketlerde Hata Vermesinin EngellenmesiBaşlık pek bi' uzun oldu. Sorun ve çözümü pek kolay hâlbu ki.<br />
<br />
<a href="http://php.net/domdocument" target="_blank">DOMDocument </a>sınıfını kullanırken veya kullanan bir dependency ile çalışırken uygun olmayan etiket hatası almanız gayet mümkün. Hele de şu vakitlerde Facebook gibi sosyal ağların<i> semantik algılama</i> için web sitelerine eklenmesini istediği W3 standartları dışında olan etiketlerden dolayı.<br />
<br />
<a href="https://github.com/technosophos/querypath/" target="_blank">QueryPath </a>kullanırken ben de aşağıdaki hatayı aldım. Ufak bir araştırma ile DOMDocument'in hata yakalama özelliğini pasif ederek uyarı vermemesni sağladım. Hatalardan kaçtığımdan değil; ancak bu sorunu aşmanın hatayı gözardı etmekten başka çaresi yok.<br />
<br />
<blockquote class="tr_bq">
<b style="background-color: #f3f3f3; color: #222222; font-family: Helvetica, Arial, sans-serif;">Warning</b><span style="background-color: #f3f3f3; color: #222222; font-family: Helvetica, Arial, sans-serif;">: DOMDocument::loadHTML() [</span><a class="ui-link" href="http://oyunbot.hileci.org/wpdemo/bot_chicken/domdocument.loadhtml" style="background-color: #f3f3f3; color: #2489ce; font-family: Helvetica, Arial, sans-serif; font-weight: bold;">domdocument.loadhtml</a><span style="background-color: #f3f3f3; color: #222222; font-family: Helvetica, Arial, sans-serif;">]: Tag fb:like invalid in Entity, line: 135 in </span><b style="background-color: #f3f3f3; color: #222222; font-family: Helvetica, Arial, sans-serif;">/.../querypath/src/QueryPath/DOMQuery.php</b><span style="background-color: #f3f3f3; color: #222222; font-family: Helvetica, Arial, sans-serif;"> on line </span><b style="background-color: #f3f3f3; color: #222222; font-family: Helvetica, Arial, sans-serif;">3643</b></blockquote>
Çözümü şu şekilde yapabilirsiniz:<br />
<script src="https://gist.github.com/grafitus/8152249.js?file=domdocument.php"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-19831883511649626142013-12-19T01:00:00.000-08:002014-04-28T11:53:39.244-07:00[Laravel] Denetim (Validation) Sınıfını AJAX ile KullanmakServer-side denetim işlemlerinin geçmişte kaldığını (kalması gerektiğini!) düşünüyorum. Daha iyi bir kullanıcı etkileşimi için de client-side yani sayfanın yenilenmeden onaylanması gerektiğini de...<br />
<div>
<br /></div>
<div>
Yanlız bu durumda bir sorun oluşmakta. Eğer sadece client-side denetim yaparsak yeterli bilgiye sahip kullanıcı bu denetimleri aşarak karşılaşmak istemediğimiz durumlar altına bizi sokabilir. Öyleyse klasik yoldan denetim yapıp bunu etkili bir biçimde kullanıcıya göstereceğiz, yani AJAX ile...</div>
<div>
<br />
Vereceğim örneği hazırlığında bulunduğum basit bir destek sistemi üzerinden vereceğim. Böylelikle daha gerçek hayattan bir uygulama yapmış olacağız.<br />
<br />
Laravel Artisan CLI'de <span style="font-family: Courier New, Courier, monospace;"><i>php artisan controller:make TicketsController</i></span> komutunu çalıştırarak bir <a href="http://laravel.com/docs/controllers#resource-controllers" rel="nofollow" target="_blank"><i>resource controller</i></a> oluşturuyoruz. işlerimiz bunun üzerinden yürüyecek.</div>
<div>
<div>
<br />
Şimdi de Ticket ve TicketMessage adlarında iki adet birbirlerine one to many ilişkisiyle bağlı model oluşturacağız. Bunlar ./app/models klasöründe bulunmalı. Bu arada tablo yapılarını vermiyorum. Zaten gerekli yapıyı siz tahmin ediyorsunuz. ;P<br />
<br />
<script src="https://gist.github.com/beratdogan/8035982.js?file=Ticket.php"></script>
<br />
<script src="https://gist.github.com/beratdogan/8035982.js?file=TicketMessage.php"></script>
<br />
Modellerimiz de hazır olduğuna göre artık podyuma çıkılabilir! (Pek yersiz bir mizah oldu bu, kabul.) ./controllers/TicketController.php'yi açıyoruz. Oradaki <i>store </i>metodu dışındakiler şimdilik bizi ilgilendirmiyor. <i>store</i> metodunda <i>create </i>metodunda verileri denetleyip, duruma göre <i>AJAX </i>ile cevap vereceğiz duruma göre veri kaydedip <i>index </i>metoduna göndereceğiz sayfayı. <i>store </i>metodununun içeriği şöyle:<br />
<br />
<script src="https://gist.github.com/beratdogan/8035982.js?file=TicketsController.store.php"></script>
<br />
Şimdi de AJAX iletişimini sağlayan JavaScript kodlarımızı verelim:<br />
<script src="https://gist.github.com/beratdogan/8035982.js?file=validate.js"></script>
<br />
Bunun haricinde view'ları vermiyorum. Verilmek istenen mesaj ile alakalı olmadığından dolayı. view'lar tasarrımınıza göre özel olarak hazırlanmalıdır.<br />
<br />
<div>
Kaynaklar</div>
<div>
<a href="http://stackoverflow.com/questions/17097797/validation-errors-in-ajax-mode">http://stackoverflow.com/questions/17097797/validation-errors-in-ajax-mode</a></div>
</div>
</div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-64233920951413170242013-12-10T17:42:00.003-08:002014-04-28T11:56:39.041-07:00[Laravel] Validatörde reCAPTCHA DoğrulamasıBiraz uzun bir başlık oldu. Umarım bu uzun başlığın hakkını verebiliriz:<br />
<br />
Öncelikle doğrulaması yapacağımız<i> API</i>'yle iletişim için ben <a href="https://github.com/stil/curl-easy" target="_blank">cURL-Easy</a> adında bir <i>wrapper </i>kullandım. --Tavsiye ederim.-- <i>Laravel</i>'e eklemek için aşağıdaki packeti <i>composer.json</i> dosyanızda tanımlayıp "composer update" komutunu <i>CLI</i>'dan çalıştırın:
<br />
<script src="https://gist.github.com/beratdogan/c014d027518c4986e2d6.js?file=composer.json"></script>
<br />
<i>./app/filters.php</i> dosyasında uygulamanın başlatıldığı zamanı temsil eden <i>App:before </i>filtresinde <i>Validator</i>'ü genişleterek "recaptcha" adında bir <i>rule</i>a sahip oluyoruz.<br />
<script src="https://gist.github.com/beratdogan/c014d027518c4986e2d6.js?file=filter.php"></script>
<br />
Bu işlemden sonra <i>./app/en/validation.php</i>'de uygun bir yerde hata mesajının tanımlanması gerekli:
<br />
<script src="https://gist.github.com/beratdogan/c014d027518c4986e2d6.js?file=validation.php"></script>
Artık reCAPTCHA doğrulamalarını "recaptcha" adındaki<i> rule</i>ınızla kolayca yapabilirsiniz.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-58259848727175844432013-10-07T22:34:00.003-07:002013-10-07T22:34:47.710-07:00Blogger/Blogspot Dinamik Gösterim Sayfalarında GitHub Gist Embed KullanımıBlogger "dynamic view" tasarımları gerçekten çok albenili. Ancak kod paylaşımları için kullanılan <i>GitHub Gist</i>leri desteklemyor. Bunun için de bir bir proje geliştirilmiş. Projeye ait <i>repository</i>e gitmek için <a href="https://github.com/moski/gist-Blogger">tıklayın</a>.
<b>Kullanım</b>
Bu kodu <i>Gist</i> eklemek istediğiniz yazıların en sonuna editörü <i>HTML</i> moduna geçirerek ekleyin:
<br />
<div class="gistLoad" data-file="install.html" data-id="a93875040769ecad7741" id="gist-a93875040769ecad7741">
Loading ....</div>
Sonrasında da aşağıdaki kodu <i>Gist</i>i göstermek istediğiniz noktada yine editörünüz <i>HTML</i> modundayken kendi <i>Gist</i>inizin ID'sini yazarak yazıyı kayıt edin:
<br />
<div class="gistLoad" data-file="usage.html" data-id="a93875040769ecad7741" id="gist-a93875040769ecad7741">
Loading ....</div>
<br />
Tabii unutmadan şuan burada da kullandığım gibi eğer <i>Gist</i> içerisindeki sadece bir tane dosyayı göstermek isiyorsanız <i>data-file </i>"attribute"ini kullanmalısınız:<br />
<div class="gistLoad" data-file="usage-file.html" data-id="a93875040769ecad7741" id="gist-a93875040769ecad7741">
Loading ....</div>
<script src="https://raw.github.com/moski/gist-Blogger/master/public/gistLoader.js" type="text/javascript"></script>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-9561650891203122013-09-26T17:42:00.001-07:002013-09-26T17:48:45.132-07:00Continuous Integration (Sürekli Entegrasyon) Nedir? Travis-CI Nedir?<i>Continuous Integration</i> (<i>Sürekli Entegrasyon</i>) yaklaşımı birlikte kullanılan VCS ile yapılan her commit-push işleminden sonra kaynak kodu derleyipi testlerini çalıştırıp yapılan son değişikliklerin projenin sağlık durumuna etkisini görmemizi sağlar. Buradaki ilk akla gelen soru şüphesiz "Projeyi biz derleyemiyormuyuz? / Testlerini çalıştıramıyor muyuz?" Sorunun cevabı, evet. Fakat bir projenin derlenişinin (alışık olmayarak masaüstü yazılımdan bahsediyoruz) ve test edilişinin onu beklerken bize ne kadar vakit kaybettireceğini biliyor muyuz? <i>Continuous Integration</i>'a ihtiyacımız işte tam bu noktada oluyor.<br />
<br />
Kullanılan <i>Continuous Integration </i>servisi, <i>asenkron</i> (bizden bağımsız)<i> </i>olarak son commit-push ile beraber projeyi derliyor ve testleri gerçekleştirip bize sonucu belirtiyor, biz de hatrı sayılır bir zamanı ilerleme çubuğunun karşısında geçirmiyoruz.<br />
<br />
---<br />
<br />
Gel gelelim, <i>Travis-CI.org</i> servisine. <i>Travis-CI</i> servisi <i>açık kaynak</i> uygulamalar için <i>Continuous Integration</i> hizmeti vermektedir. <i>GitHub</i>'la eşsiz etkileşmiyle; <i>GitHub</i>'da bulunan repositorylerimizi otomatik algılayıp kurulum aşamasını da kısaltmaktadır. Birçok dili desteklemesi de birçok <i>community </i>tarafından kullanılmasının sebei olmuştur. An itibariyle şu dilleri desteklemekte: Clojure, PHP, Java, Node.js (JavaScript), Ruby, Python, Objective-C, Scala, Go, Perl.<br />
<br />
Şimdilik kullanım hakkında detaylar veremeyeceğim. İlerleyen zamanlar için ayrı bir blog konusu olarak akılda kalmalı.<br />
<br />
<b>Kaynaklar</b><br />
<a href="http://www.serdardemir.net/continuous-integration-nedir.html">http://www.serdardemir.net/continuous-integration-nedir.html</a><br />
<a href="http://net.tutsplus.com/tutorials/tools-and-tips/travis-ci-what-why-how/">http://net.tutsplus.com/tutorials/tools-and-tips/travis-ci-what-why-how/</a>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-6026728806830153837.post-8726127295757531622013-09-18T09:34:00.000-07:002013-09-22T11:12:36.691-07:00Singleton (Tekil Nesne) Tasarım DeseniMerhabalar,<br />
<br />
Bugün en bilinen ve ihtiyaç duyulan 'Tasarım Desenleri'nden biri olan <i>Singleton</i>'u inceleyeceğiz/öğreneceğiz.<br />
<br />
Öncelikle, <i>Singleton </i>için Türkçye'ye iyi bir karşılık arayışdaydım. Biraz Googling'ten sonra bu desene kendi çapımda '<i>Issız Nesne</i>' olarak adlandırmayı uygun gördüm. Fark ettiğiniz üzere bu karşılık Çağan Irmak imzalı 'Issız Adam' filminden gelmekte. Belki de <i>Singleton </i>için daha fazla açıklamaya gerek kalmamıştır, bu benzetmeden sonra. ;P<br />
<br />
<b>Olay: </b>Singleton 'Tasarım Deseni' ile hazırladığımız sınıftan sadece bir tane 'örnek' (<i>instance</i>) oluşturmamızı, ve buna her yerden erişebilmemizi sağlar.<br />
<b>Neden: </b>Tamamiyle OOP tabanlı bir proje üzerinde çalıştığınızı düşünün. Bu projeyi elbetteki bazı yönetici sınıflarınız da olacaktır. Örnek vermek gerekirse, uygulamanızda tek bir <i>Database </i>sınıfının varlığı kaçınılmazdır. İşte bu noktada bir uygulamada <i>Database </i>sınıfından kaç tane 'örnek'e (<i>instance</i>) ihtiyacımız olacaktır? Cevap sırıtmakta, <i>sadece bir</i>!<br />
<br />
<b>PHP ile Singleton çalışması:</b><br />
<br />
<div class="gistLoad" data-file="Singleton.php" data-id="63e2b81b3913a039b74b" id="gist-63e2b81b3913a039b74b-php">
Loading ....<br />
<br /></div>
PHP5.4 ile birlikte "<i>trait</i>s" denen bir özellik eklendi. Bu <i>trait</i>ler dediğimiz özellik, belirteceğimiz <i>property </i>(özellik) ve <i>methodl</i>arının (metot) <i>trait</i>i kullanacağımız sınafa göre şekillenmesi amacıyla eklendi. Aslında bu ayrı bir yazı konusu olurdu. Ancak basit anlamda anlatmak için yeterli cümleleri kurduğuma inanıyorum.
Şimdi yapacağımız şey ise <i>trait</i>leri kullanarak <i>Singleton </i>tasarım desenini tüm sınıflarımızda kullanabilmek. Bu sayede <i>DRY</i> (<i>Don't Repeat Yourself</i>) ilkesini de gerçekleştirmiş olacağız. <i>Kalıtım</i>'ın (<i>Inheritance</i>) da dibine vurduğumuz söylenebilir.
<br />
<div class="gistLoad" data-file="SingletonTrait.php" data-id="63e2b81b3913a039b74b" id="gist-63e2b81b3913a039b74b-php">
Loading ....<br />
<br /></div>
<b>JavaScript ile Singleton çalışması:</b>
<br />
<div class="gistLoad" data-file="Singleton.js" data-id="63e2b81b3913a039b74b" id="gist-63e2b81b3913a039b74b-js">
Loading ....<br />
<br /></div>
<b>Java ile Singleton çalışması:</b>
<br />
<div class="gistLoad" data-file="Singleton.java" data-id="63e2b81b3913a039b74b" id="gist-63e2b81b3913a039b74b-java">
Loading ....<br />
<br /></div>
<b>Ruby ile Singleton çalışması:</b>
<br />
<div class="gistLoad" data-file="Singleton.rb" data-id="63e2b81b3913a039b74b" id="gist-63e2b81b3913a039b74b-rb">
Loading ....</div>
<script src="https://raw.github.com/moski/gist-Blogger/master/public/gistLoader.js" type="text/javascript"></script>Unknownnoreply@blogger.com0