Gökhan Demir2023-01-11T07:36:09+00:00Gökhan DemirSunucu Komutları-2205182022-05-18T00:00:00+00:00/categories/linux/server-commands<p>Sunucunun hangi <strong>işletim sistemi</strong> ve <strong>işletim sistemi versiyonunu</strong> kullandığını öğrenmek <code>/etc/issue</code> dosyasının içerisine bakabilirsiniz.</p>
<pre><code>cat /etc/issue
</code></pre>
<p>Örnek;</p>
<pre><code>root@hummer:~# cat /etc/issue
Ubuntu 16.04.6 LTS \n \l
</code></pre>
<p>Sunucunun ne kadar süre çalıştığını(ayakta kaldığını) örğrenmek için <code>uptime</code> komutunu kullanabilirsiniz.</p>
<pre><code>uptime
</code></pre>
<p>Örnek;</p>
<pre><code>root@hummer:~# uptime
07:01:57 up 519 days, 10:39, 1 user, load average: 0.02, 0.05, 0.03
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><a href="https://linuxconfig.org/check-what-debian-version-you-are-running-on-your-linux-system">https://linuxconfig.org/check-what-debian-version-you-are-running-on-your-linux-system</a></li>
</ul>
GitHub Remote Komutu-2205122022-05-12T00:00:00+00:00/categories/github/github-remote<p>git remote komutu bir uzak repoya bağlanmasını(kanca atmasını) sağlar.</p>
<h3>Uzak Repoları Listeleme</h3>
<p>Tanımlı uzak repolarının isimlerini(<strong>NAME</strong>) listeler:</p>
<pre><code>git remote
</code></pre>
<p>Tanımlı uzak repolarının isimlerini(<strong>NAME</strong>) ve linklerini(<strong>URL</strong>) listeler:</p>
<pre><code>git remote -v
</code></pre>
<h3>Uzak Repo Ekleme</h3>
<pre><code>git remote add <NAME> <URL>
</code></pre>
<p><strong>NAME</strong> için 2 seçenek mevcuttur:</p>
<ul>
<li><p><code>origin</code> : Forklayıp oluşturduğunuz kendi reponuzdur.</p></li>
<li><p><code>upstream</code> : Forkladığınız asıl(uzak repoya) atıfta bulunur. (Uzak repodaki değişiklikleri almak için)</p></li>
</ul>
<p><strong>NOT</strong>: Buradaki <code>origin</code> ve <code>upstream</code> herkes tarafından kullanılan isimler olup kendinize göre ismi değiştirebilirsiniz. Buradaki önemli olan <code>origin</code> ismi için <code>SSH</code> URL'si, <code>upstream</code> için de <code>HTTPS</code> URL'si kullanıldığıdır.</p>
<p>Örnek <code>origin</code> için;</p>
<pre><code>git remote add origin git@github.com:gdemir/gdemir.github.io.git
</code></pre>
<p>Örnek <code>upstream</code>;</p>
<pre><code>git remote add upstream https://github.com/koy-odasi/core.git
</code></pre>
<h3>Uzak Repo Sorgulama</h3>
<p>Uzak ve yakın repo tanımlıysa ilgili <strong>URL</strong> linkini gösterir.</p>
<pre><code>git config remote.<NAME>.url
</code></pre>
<p>Örnek <code>origin</code> için;</p>
<pre><code>git config remote.origin.url
</code></pre>
<p>Örnek <code>upstream</code> için;</p>
<pre><code>git config remote.upstream.url
</code></pre>
<h3>Uzak Repo Silme</h3>
<p>İlgili uzak repo ismi ile bağlantı silinir.</p>
<pre><code>git remote rm <NAME>
</code></pre>
<p>Örnek;</p>
<pre><code>git remote rm upstream
</code></pre>
<h3>Uzak Repo Güncellemelerini Alma</h3>
<p>İlgili uzak repoda güncelleme varsa alınlamasını sağlar.</p>
<pre><code>git pull <NAME> master
</code></pre>
<p>Örnek <code>origin</code> için;</p>
<pre><code>git pull
</code></pre>
<p>veya</p>
<pre><code>git pull origin master
</code></pre>
<p>Örnek <code>upstream</code> için;</p>
<pre><code>git pull upstream master
</code></pre>
<h3>Uzak Repo Adını Değiştirme</h3>
<p>İlgili uzak repoda tanımlı olan repo ismini değiştirmenizi sağlar.</p>
<pre><code>git remote rename <SEARCHNAME> <REPLACENAME>
</code></pre>
<p>Örnek;</p>
<pre><code>git remote rename origin upstream
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><p><a href="https://stackoverflow.com/questions/9257533/what-is-the-difference-between-origin-and-upstream-on-github">https://stackoverflow.com/questions/9257533/what-is-the-difference-between-origin-and-upstream-on-github</a></p></li>
<li><p><a href="https://linuxize.com/post/how-to-remove-git-remotes/">https://linuxize.com/post/how-to-remove-git-remotes/</a></p></li>
</ul>
Vim Kısayolları-2205112022-05-11T00:00:00+00:00/categories/linux/vim-shortcuts<table>
<thead>
<tr>
<th> KOMUTLAR </th>
<th> AÇIKLAMA </th>
</tr>
</thead>
<tbody>
<tr>
<td> <code>g</code> + <code>g</code> </td>
<td> İmleçi dosyanın başına getirir. </td>
</tr>
<tr>
<td> <code>SHIFT</code> + <code>g</code> </td>
<td> İmleçi dosyanın sonuna getirir. </td>
</tr>
<tr>
<td> <code>i</code> </td>
<td> Dosyayı görüntüleme modundan çıkarıp düzenleme moduna geçmenize sağlar. </td>
</tr>
<tr>
<td> <code>ESC</code> </td>
<td> Düzenleme modundan çıkıp görüntüleme moduna geçmenizi sağlar. </td>
</tr>
<tr>
<td> <code>0</code> </td>
<td> İmleçi bulunduğu satırın en başına getirir. (Görüntüleme modunda iken) </td>
</tr>
<tr>
<td> <code>$</code> </td>
<td> İmleçi bulunduğu satırın sonuna götürür. (Görüntüleme modunda iken) </td>
</tr>
<tr>
<td> <code>:w</code> </td>
<td> Dosya içerisindeki değişiklikleri kaydetmenizi sağlar. </td>
</tr>
<tr>
<td> <code>:q</code> </td>
<td> Dosyadan çıkmanızı sağlar. </td>
</tr>
<tr>
<td> <code>:q!</code> </td>
<td> Dosyadaki değişiklikleri kaydetmeyerek çıkmanızı sağlar. </td>
</tr>
<tr>
<td> <code>:wq</code> </td>
<td> Dosya içerisindeki değişiklikleri kaydedip çıkmanızı sağlar. </td>
</tr>
<tr>
<td> <code>u</code> </td>
<td> Görüntüleme modunda iseniz yapılan değişiklikleri geri almanıza sağlar. </td>
</tr>
<tr>
<td> <code>SHIFT</code> + <code>v</code> </td>
<td> İmleçin bulunduğu ilgili satırı seçer. (Aşağı-Yukarı ok tuşlarıyla seçilen satırları genişletebilirsiniz.) </td>
</tr>
<tr>
<td> <code>y</code> </td>
<td> İmleçin seçtiği satırları kopyalar. </td>
</tr>
<tr>
<td> <code>p</code> </td>
<td> Görüntüleme modunda iken kopyaladığınız satırları yapıştırmanızı sağlar. </td>
</tr>
<tr>
<td> <code>:'<,'>%s/SEARCH/REPLACE/g</code> </td>
<td> İlgili satırlarda <strong>SEARCH</strong> anahtarının değerini <strong>REPLACE</strong> ile değiştirir. </td>
</tr>
<tr>
<td> <code>:'<,'>%s/SEARCH/REPLACE/gc</code> </td>
<td> İlgili satırlarda <strong>SEARCH</strong> anahtarının değerini <strong>REPLACE</strong> ile değiştirirken adım adım sorar </td>
</tr>
<tr>
<td> <code>d</code> </td>
<td> Düzenleme modunda seçilen satırları, görüntüleme modunda da imleçin üstündeki satırı siler. </td>
</tr>
<tr>
<td> <code>/SEARCH</code> </td>
<td> Görüntüleme modunda ilgili <strong>SEARCH</strong> anahtarının değerinin ilk eşleşmesini bulur, üstündeki imleçte getirir. </td>
</tr>
<tr>
<td> <code>*</code> </td>
<td> Görüntüleme modunda da imleç kelime üzerindeyken her basıldığında imleçin sonraki aynı kelimeyi bulur ve imleçte üstüne gider. </td>
</tr>
</tbody>
</table>
<h3>Kaynak</h3>
<ul>
<li><a href="https://umutbey.com/vim-kisayollari-en-cok-kullanilan-16-kisayol/">https://umutbey.com/vim-kisayollari-en-cok-kullanilan-16-kisayol/</a></li>
</ul>
Dosya İçerisindeki Tekil(Tekrar Etmeyen) IP'lerin Sayılarını Öğrenme-2205102022-05-10T00:00:00+00:00/categories/linux/unique-ip-count-on-file<p><code>unique_ip_count_on_file.sh</code> betiğinin içeriği aşağıdaki gibidir;</p>
<pre><code class="sh">#! /bin/bash
log_filename=$1
grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+" $log_filename | sort -u | wc -l
</code></pre>
<p>Çalıştırmak için;</p>
<pre><code>bash unique_ip_count_on_file.sh production_2022-05-10.log
</code></pre>
GitHub SSH Clone-2205102022-05-10T00:00:00+00:00/categories/github/github-ssh-clone<h3>Public ve Private Anahtarlarının Üretilmesi</h3>
<pre><code>ssh-keygen
</code></pre>
<p>komut çalıştırıldığında <code>id_rsa</code> konumu ve gerekli olan şifreyi(2 defa) sormaktadır, bunları giriyoruz.</p>
<pre><code>Generating public/private rsa key pair.
Enter file in which to save the key (/home/gdemir/.ssh/id_rsa):
Created directory '/home/gdemir/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/gdemir/.ssh/id_rsa.
Your public key has been saved in /home/gdemir/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:232/jCVq/32323gokhan.demir@TRF5020F95
The key's randomart image is:
+---[RSA 2048]----+
| |
| . |
| . . E .|
| . + . = |
| . . S = . . o|
| . .. + *.o ..|
| o...+*o+. .|
| . o=*oB= .. o |
| BO.=++*o.o+ |
+----[SHA256]-----+
</code></pre>
<h3>Public Anahtarımızın GitHub Sitesi İçine Kaydedilmesi</h3>
<p>Bunlar girildikten sonra <code>~/home/gdemir/.ssh/</code> dizini altında <code>id_rsa</code> ve <code>id_rsa.pub</code> anahtarları oluşmaktadır.
Oluşturulan bu <code>~/home/gdemir/.ssh/id_rsa.pub</code> içerisindeki <strong>key</strong>imizi;</p>
<p><a href="https://github.com/">GitHub</a> → <a href="https://github.com/settings">Settings</a> → <a href="https://github.com/settings/keys">SSH and GPG keys</a> → <a href="https://github.com/settings/ssh/new">Add new SSH keys</a> içerisine,</p>
<p>belirlediğiniz bir <strong>title</strong> (gdemir@ubuntu gibi) girilerek <strong>key</strong>imizi yapıştırıyoruz.
Artık sahip olduğumuz repolarımızı clone etme imkanımız olmuş oluyor. Clone etmek isteğiniz repoyu aşağıdaki gibi çalıştırıyorsunuz.</p>
<pre><code>git clone git@github.com:gdemir/gdemir.github.io.git
</code></pre>
<p>Artık repo üzerindeki dosyalar üzerinde güncelleme yapıp</p>
<pre><code>git commit -am 'gerekli güncelleme yapıldı'
</code></pre>
<p>komutuyla <code>commit</code> atıp</p>
<pre><code>git push
</code></pre>
<p>komutuyla ilgili repomuz GitHub üzerinde güncellenmiş oluyoruz.</p>
<h3>Kaynak</h3>
<ul>
<li><a href="https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/github-clone-with-ssh-keys">https://www.theserverside.com/blog/Coffee-Talk-Java-News-Stories-and-Opinions/github-clone-with-ssh-keys</a></li>
</ul>
Crontab İle MySQL Veritabanı Yedeğinin Alınması-2205102022-05-10T00:00:00+00:00/categories/linux/crontab-ile-mysql-veritabaninin-yedeginin-alinmasi<h3>Yedek Dosyalarımızı İçin Dizin Oluşturuyoruz</h3>
<pre><code>mkdir /root/db_backups
</code></pre>
<h3>Yeni Cron Ekliyoruz</h3>
<pre><code>crontab -e
</code></pre>
<p>komutuyla açılan içeriğin sonuna;</p>
<ul>
<li>DBNAME veritabanına ait ‘USERNAME’ isimli kullanıcının ‘PASSWORD’ parolasıyla</li>
<li>Her ayın ilk gününün saat 00:00 ‘da (01.06,2022 saat 00:00'da, 01.07,2022 saat 00:00'da … gibi)</li>
</ul>
<p>alınacak yedek dosyası için aşağıdaki gibi yedekleme komutumuzu yazıyoruz:</p>
<pre><code>0 0 1 * * mysqldump --user='USERNAME' --password='PASSWORD' DBNAME> /root/db_backup/backup_`date +\%Y-\%m-\%d_\%H:\%M`.sql
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><p><a href="https://exchangetuts.com/mysqldump-doesnt-work-in-crontab-1639698246383336">https://exchangetuts.com/mysqldump-doesnt-work-in-crontab-1639698246383336</a></p></li>
<li><p><a href="https://crontab.guru/">https://crontab.guru/</a></p></li>
</ul>
Crontab Komutu ve Örnek Crontab Uygulanması-2205092022-05-09T00:00:00+00:00/categories/linux/crontab-komutu-ve-ornek-crontab-uygulanmasi<p>Linux üzerinde hazır yüklü gelen ve <code>/etc/crontab</code> dosya yolunda barınan bir betiktir.</p>
<p>Örneğin bir shell betiği(<code>test.sh</code>) hazırlayıp bu betiği sunucu üzerinde belirli periyotlarda çalıştırmak isteyelim.</p>
<h3><code>test.sh</code> Betiğimizi Oluşturalım</h3>
<pre><code class="sh">#! /bin/bash
echo "Merhaba\n" >> hello.log
</code></pre>
<p>(Bu betiğimiz “Merhaba” kelimesini <code>hello.log</code> dosyası üzerine ekleme görevi üstlenmektedir.)</p>
<h3><code>test.sh</code> Betiğinin <code>crontab</code> Tarafından Çalıştırılabilmesi İçin İzin Haklarını Verilmesi</h3>
<pre><code>chmod 700 test.sh
</code></pre>
<h3><code>crontab</code>a Yeni Cron Eklenmesi Komutu Kullanılması</h3>
<pre><code>crontab -e
</code></pre>
<p><code>crontab -e</code> komutu ile açılan dosya sonuna aşağıdaki gibi <strong>her dakika</strong> çalışan içeriğin eklenmesi</p>
<pre><code class="sh">* * * * * /root/test.sh
</code></pre>
<p>Buradaki zaman periyotlarını düzenlemek için aşağıdaki zaman görev kalıbı incelenebilir:</p>
<pre><code class="sh"> * * * * * COMMAND(s)
−−− −−− −−− −−− −−−
| | | | ⋱−−→ Day of week (0 - 7) (Sunday=0 or 7)
| | | ⋱−−−−−−−−−→ Month (1 - 12)
| | ⋱−−−−−−−−−−−−−−−−→ Day of month (1 - 31)
| ⋱−−−−−−−−−−−−−−−−−−−−−−−→ Hour (0 - 23)
⋱−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−→ Minute (0 - 59)
</code></pre>
<p>artık <strong>her dakika</strong> da bir “Merhaba” yazısı <code>hello.log</code> dosyası üzerine yazılmaktadır. Dikkat edin dosya patlamasın 😉</p>
<h3>Çalışan Cron Komutlarını Görmek İçin</h3>
<pre><code>crontab -l
</code></pre>
<h3>Cron Komutlarını Silmek İçin</h3>
<pre><code>crontab -r
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><p><a href="https://dev.to/boobo94/how-to-back-up-postgres-database-on-linux-using-cronjob-2d3a">https://dev.to/boobo94/how-to-back-up-postgres-database-on-linux-using-cronjob-2d3a</a></p></li>
<li><p><a href="https://crontab.guru/">https://crontab.guru/</a></p></li>
</ul>
Html  Karakter Sorunu-2003292020-03-29T00:00:00+00:00/categories/linux/html-65279;-karakter-sorunu<p>Bu sorun genelde UTF desteklemeyen bir editör(Notepad gibi) ile kod düzenlemerinde ortaya çıkmaktadır. Editör ile açıldığında da görünmemektedir.</p>
<p>Hangi dosyalarda sorun olduğunu anlamak için aşağıdaki kod çalıştırılır:</p>
<pre><code class="sh">grep -rl $'\xEF\xBB\xBF' .
</code></pre>
<p>Sorunu düzelmek için aşağıdaki kod çalıştırılır:</p>
<pre><code class="sh">sudo sed -i 's/\xEF\xBB\xBF//g' FILE
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><p><a href="https://stackoverflow.com/questions/9691771/why-is-65279-appearing-in-my-html">https://stackoverflow.com/questions/9691771/why-is-65279-appearing-in-my-html</a></p></li>
<li><p><a href="https://stackoverflow.com/questions/3255993/how-do-i-remove-%C3%AF-from-the-beginning-of-a-file">https://stackoverflow.com/questions/3255993/how-do-i-remove-%C3%AF-from-the-beginning-of-a-file</a></p></li>
</ul>
MariaDB MySQL Root Parola Değiştirme-1912062019-12-06T00:00:00+00:00/categories/linux/mariadb-mysql-root-password-update<h4>Root Kullanıcısı İçin Gerekli Parola Atamasının Yapılması</h4>
<pre><code>GRANT ALL PRIVILEGES on *.* to 'root'@'localhost' IDENTIFIED BY '<password>';
FLUSH PRIVILEGES;
</code></pre>
<h4>Ek Olarak MariaDB İçerisinde Kök Dizin Olarak Bu Parolanın Kullanılmasının Sağlanması</h4>
<pre><code>UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root' AND plugin = 'unix_socket';
FLUSH PRIVILEGES;
</code></pre>
<h4>MySQL Servisinin Yeniden Başlatılması</h4>
<pre><code>sudo service mysql restart
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><a href="https://linuxize.com/post/how-to-reset-a-mysql-root-password/">https://linuxize.com/post/how-to-reset-a-mysql-root-password/</a></li>
</ul>
MariaDB ile MySQL Root Parolasını Sıfırlama-1912062019-12-06T00:00:00+00:00/categories/linux/mariadb-mysql-root-password-reset<h4>MySQL Devre Dışı Bırakma</h4>
<pre><code>sudo systemctl stop mysql
</code></pre>
<h4>MySQL Güvenli Modda Çalıştırılma</h4>
<pre><code>sudo mysqld_safe --skip-grant-tables &
</code></pre>
<p>eğer tekrardan çalıştırmak istersek ve “error mysqld_safe - a mysqld process already exists.” yanılgısı alırsak 2 adım izlenecek:</p>
<pre><code>killall mysqld mysqld_safe
</code></pre>
<p>ve</p>
<pre><code>killall -9 mysqld mysqld_safe
</code></pre>
<h4>MySQL'e Girişi Tekrar Test Etmek</h4>
<pre><code>mysql -u root -p
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><a href="https://stackoverflow.com/questions/28068155/access-denied-for-user-rootlocalhost-using-password-yes-after-new-instal">https://stackoverflow.com/questions/28068155/access-denied-for-user-rootlocalhost-using-password-yes-after-new-instal</a></li>
</ul>
Grub Önyükleyicisini Onarmak-1901152019-01-15T00:00:00+00:00/categories/linux/grub-repair<p>Çoğunlukla Windows yanına bir Linux işletim sistemi kullanılırken Windows’u bir sebepten dolayı yeniden kurulmasında çıkmaktadır. Windows tekrardan kurulduktan sonra Linux'a erşim sağlayamamaktadır. Çünkü Windows kurulurken Linux'un kurmuş olduğu önyükleyicisini silip kendi önyükleyicisini kurmakta ve bu önyükleyicide sadece Windows'u görmektedir. Ancak Linux önyükleyicileri Windows ve Linux'u görmektedir. Buradaki önyükleyicisini onarmak yani Linux önyükleyicisini tekrardan kurmak için aşağıdaki adımları izleyebilirsiniz.</p>
<h4>Bootable Linux ISO'sunu Yazdırma</h4>
<p>Hangi Linux kurulumunu gerçekleştirecekseniz o işletim sisteminin (mesela bir Ubuntu Desktop) iso'sunu indirin bunu CD/DVD ya da bootable(ilklendirilebilir) USB'ye yazdırın. Linux'u Bootable USB'ye yazmak için için <a href="https://www.pendrivelinux.com/universal-usb-installer-easy-as-1-2-3/">www.pendrivelinux.com</a> kullanabilirsiniz.</p>
<h4>Bootable Linux'u Başlatma</h4>
<p>CD/DVD ya da USB'yi bilgisayarınıza bağlayın ve başlatın. Linux'u kurumadan başlatmak için ekrana gelen menüde “Try Ubuntu Without Installing” (Kurulumu gerçekleştirmeden Ubuntu'yu dene) gibi bir seçenek varsa bunu seçerek başlatın.</p>
<h4>Boot-Repair Kurulumu</h4>
<p>Terminal Açalım (<code>Ctrl+Alt+T</code>) ve terminalde şu komutu ile depoyu koyarak paket yöneticisine bu paketi görmesini sağlayarak ekleyelim:</p>
<pre><code>sudo add-apt-repository ppa:yannubuntu/boot-repair
</code></pre>
<p>Paket yöneticisinde paket listemizi güncelleyelim:</p>
<pre><code>sudo apt-get update
</code></pre>
<p>Boot Repair programını kuralım:</p>
<pre><code>sudo apt-get install -y boot-repair && boot-repair
</code></pre>
<p>Program yönetici (root) parolanızı soracak. Grubu tekrar yüklemek ve ya onarmak için “Önerilen Onarım” (“Recommended repair”) seçeğine tıklamanız yeterli olacaktır. Boot-Repair önyükleyiciyi harddiskte kuracağı yeri kendisi otomatik olarak göremezse bunun neresi olacağını sizin yönlendirmeniz gerekecektir. Burada dikkatli olunması Windows(NTFS/FAT) veya Linux(EXT4) gibi yerlere değil, silinmemiş ise Windows önyükleyicisinin olduğu yere veya boş bir harddisk bölümüne kaydetmeniz gerekmektedir.</p>
Barak Framework-1801032018-01-03T00:00:00+00:00/categories/framework/barak-framework<p>PHP MVC tabanlı Barak Framework 3 yayımlandı.</p>
<p align="center">
<img src="https://raw.githubusercontent.com/barak-framework/barak/master/app/assets/img/default.png" height="64" />
</p>
<h4 align="center">Barak Framework</h4>
<p align="center">PHP MVC Framework Like ROR</p>
<p align="center">
<img src="https://poser.pugx.org/barak-framework/barak/v/stable" />
<img src="https://poser.pugx.org/barak-framework/barak/license" />
</p>
<hr />
<h2>Requirements</h2>
<ul>
<li>Packages</li>
</ul>
<blockquote><p>Programming Language : <code>Php</code></p>
<p>Database Access : <code>MySQL</code></p>
<p>Web Server : <code>Apache</code>, <code>Nginx</code>, <code>ISS</code></p>
<p>Package Manager : <code>Composer</code></p></blockquote>
<ul>
<li>Configuration</li>
</ul>
<blockquote><p>Linux, Apache, MySQL, Php Installation : <a href="/categories/linux/lamp/">LAMP</a></p>
<p>Linux, Nginx, MySQL, Php Installation : <a href="/categories/linux/lemp/">LEMP</a></p>
<p>Web Server Settings : <a href="https://github.com/barak-framework/barak/blob/master/.htaccess.sample">apache2-settings</a> or <a href="https://github.com/barak-framework/barak/blob/master/nginx.config.sample">nginx-settings</a> or <a href="https://github.com/barak-framework/barak/blob/master/web.config.sample">iss-settings</a></p>
<p>Package Mananger Installation : <a href="/categories/php/composer/">composer-installation</a></p></blockquote>
<h2>Install</h2>
<pre><code class="sh">composer create-project barak-framework/barak project_name
</code></pre>
<h2>Run</h2>
<pre><code>cd project_name
php -S localhost:9090
</code></pre>
<p>and check homepage : <a href="http://localhost:9090">http://localhost:9090</a> and thats all!</p>
<h2>Releases</h2>
<ul>
<li><a href="https://github.com/barak-framework/barak/releases">https://github.com/barak-framework/barak/releases</a></li>
</ul>
<hr />
<h2>Guides</h2>
<h3>Simple Usage</h3>
<hr />
<blockquote><p>request url : <code>/</code></p>
<p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/", "home#index")
);
</code></pre>
<blockquote><p><code>app/controller/HomeController.php</code></p></blockquote>
<pre><code class="php">class HomeController extends ApplicationController {
public function index() {
$this->message = "Hello World";
}
}
</code></pre>
<blockquote><p><code>app/views/home/index.php</code></p></blockquote>
<p>```php</p>
<h1> Home#Index </h1>
<p>;
<?= $message; ?>
```</p>
<blockquote><p><code>app/views/layouts/home.php</code></p></blockquote>
<pre><code class="html"><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="tr" lang="tr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title></title>
</head>
<body>
<?= $yield; ?>
</body>
</html>
</code></pre>
<h3>Router (<code>config/routes.php</code>)</h3>
<hr />
<p>İstek yapılacak her URL için <code>config/routes.php</code> dosyası içerisinde izin verilen sınıftır. Eğer ilgili istek URL bulunmuyorsa <code>public/404.html</code> sayfası gösterilir.</p>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>get</code>, <code>post</code>, <code>resource</code>, <code>resources</code>, <code>scope</code>, <code>root</code></p></blockquote>
<h4><code>get</code></h4>
<ul>
<li>Simple</li>
</ul>
<blockquote><p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/home/index")
);
</code></pre>
<ul>
<li>Dynamical Segment</li>
</ul>
<p>Dinamik route tanımlamalarında “home#index” gibi hedef belirtilmek zorundadır:</p>
<blockquote><p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/home/index/:id", "home#index")
);
</code></pre>
<p>Dinamik route tanımlamalarında ki “id” gibi parçalara erişim:</p>
<blockquote><p><code>app/controllers/HomeController.php</code></p></blockquote>
<pre><code class="php">class HomeController extends ApplicationController {
public function index() {
echo $this->id;
}
}
</code></pre>
<blockquote><p><code>app/views/home/index.php</code></p></blockquote>
<p>```php</p>
<h1> Home#Index </h1>
<p>;
<?= “id: $id”; ?>
```</p>
<h4><code>post</code></h4>
<ul>
<li>Simple</li>
</ul>
<blockquote><p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
post("/admin/login")
);
</code></pre>
<blockquote><p><code>app/controllers/AdminController.php</code></p></blockquote>
<pre><code class="php">class AdminController extends ApplicationController {
protected $before_actions = [
["require_login", "except" => ["login", "logout"]]
];
public function login() {
if (isset($_SESSION["admin"]))
return $this->redirect_to("/admin/index");
if (isset($_POST["username"]) and isset($_POST["password"])) {
if ($user = User::unique(["username" => $_POST["username"], "password" => md5($_POST["password"])])) {
$_SESSION["success"] = "Admin sayfasına hoş geldiniz";
$_SESSION["full_name"] = "$user->first_name $user->last_name";
$_SESSION["admininfo"] = $user;
$_SESSION["admin"] = true;
return $this->render("/admin/index");
} else {
$_SESSION["danger"] = "Oops! İsminiz veya şifreniz hatalı, belki de bunlardan sadece biri hatalıdır?";
}
}
return $this->render(["layout" => "default"]);
}
// public function index() {} // OPTIONAL
public function logout() {
if (isset($_SESSION["admin"]))
session_destroy();
return $this->redirect_to("/admin/login");
}
public function require_login() {
if (!isset($_SESSION["admin"])) {
$_SESSION["warning"] = "Lütfen hesabınıza giriş yapın!";
return $this->redirect_to("/admin/login");
}
}
}
</code></pre>
<blockquote><p><code>app/views/admin/index.php</code></p></blockquote>
<p>```php</p>
<h1> Admin#Index </h1>
<p>;
<?= $_SESSION[“full_name”]; ?>
```</p>
<h4><code>resource</code></h4>
<blockquote><p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
resource("/users")
);
</code></pre>
<blockquote><p><em>Aşağıdaki routes kümesini üretir:</em></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/users/", "users#index"), // all record
get("/users/create"), // new record form
post("users/save"), // new record save
get("/users/show"), // display record
get("/users/edit"), // edit record
post("/users/update"), // update record
post("/users/destroy") // destroy record
);
</code></pre>
<h4><code>resources</code></h4>
<blockquote><p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
resources("/users")
);
</code></pre>
<blockquote><p><em>Aşağıdaki routes kümesini üretir:</em></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/users", "users#index"), // all record
get("/users/create"), // new record form
post("/users/save"), // new record save
get("/users/show/:id", "users#show"), // display record
get("/users/edit/:id", "users#edit"), // edit record
post("/users/update"), // update record
post("/users/destroy") // destroy record
);
</code></pre>
<h4><code>scope</code></h4>
<p>Kodları daha derli toplu kullanmak için Route'in Gruplama özelliğidir. Bir <code>PATH</code> altında <code>CONTROLLER</code> ve <code>VIEW</code> dizininin çalışma imkanı sağlar.</p>
<blockquote><p>controller: <code>app/controllers/PATH/CONTROLLER.php</code></p>
<p>view : <code>app/views/VIEW/PATH/CONTROLLER/ACTION.php</code></p></blockquote>
<ul>
<li>Simple</li>
</ul>
<blockquote><p><code>config/routes.php</code></p>
<p>view : <code>app/views/admin/categories/ACTION.php</code>
controller : <code>app/controllers/admin/CategoriesController.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
scope("/admin",
resources("/categories")
)
);
</code></pre>
<blockquote><p><em>Aşağıdaki routes kümesini üretir:</em></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/admin/categories", "categories#index", "/admin"), // all record
get("/admin/categories/create", false, "/admin"), // new record form
post("/admin/categories/save", false, "/admin"), // new record save
get("/admin/categories/show/:id", "categories#show", "/admin"), // display record
get("/admin/categories/edit/:id", "categories#edit", "/admin"), // edit record
post("/admin/categories/update", false, "/admin"), // update record
post("/admin/categories/destroy", false, "/admin"), // destroy record
);
</code></pre>
<ul>
<li>Mix</li>
</ul>
<blockquote><p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/admin/login"),
scope("/admin",
[
get("/users", "users#index"),
get("/users/show/:id")
],
resources("/categories"),
resource("/products")
);
);
</code></pre>
<blockquote><p><em>Aşağıdaki routes kümesini üretir:</em></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/admin/login"),
get("/admin/users", "users#index", "/admin"), // all record
get("/admin/users/show/:id", false, "/admin"), // display record
get("/admin/categories", "categories#index", "/admin"), // all record
get("/admin/categories/create", false, "/admin"), // new record form
post("/admin/categories/save", false, "/admin"), // new record save
get("/admin/categories/show/:id", "categories#show", "/admin"), // display record
get("/admin/categories/edit/:id", "categories#edit", "/admin"), // edit record
post("/admin/categories/update", false, "/admin"), // update record
post("/admin/categories/destroy", false, "/admin"), // destroy record
get("/admin/products", "products#index", "/admin"), // all record
get("/admin/products/create", false, "/admin"), // new record form
post("/admin/products/save", false, "/admin"), // new record save
get("/admin/products/show", false, "/admin"), // display record
get("/admin/products/edit", false, "/admin"), // edit record
post("/admin/products/update", false, "/admin"), // update record
post("/admin/products/destroy", false, "/admin") // destroy record
);
</code></pre>
<h4><code>root</code></h4>
<blockquote><p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
root("home#index")
);
</code></pre>
<blockquote><p><em>Aşağıdaki routes kümesini üretir:</em></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/", "home#index"),
);
</code></pre>
<h3>Controllers (<code>app/controllers/*.php</code>)</h3>
<hr />
<p>Her <code>config/routes.php</code> içerisinde tanımlanan <code>get</code> işlemi için <code>app/controller/*.php</code> dosyası içerisinde fonksiyon tanımlamak zorunlu değildir, fonksiyon tanımlanırsa ve değişken yükü/yükleri controller içinde <code>$this->KEY</code> şeklinde tanımlanırsa ilgili yönlenen sayfada <code>$KEY</code> şeklinde veriye erişebilir. Her <code>config/routes.php</code> içerisinde tanımlanan <code>post</code> için ilgili <code>app/controller/*.php</code> dosyası içerisinde fonksiyon tanımlamak zorunludur.</p>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>render</code>, <code>redirect_to</code></p></blockquote>
<ul>
<li>Options</li>
</ul>
<blockquote><p><code>helpers</code>, <code>before_actions</code>, <code>after_actions</code></p></blockquote>
<h4><code>render</code></h4>
<blockquote><p>options : <code>layout</code>, <code>view</code>, <code>action</code>, <code>template</code>, <code>file</code>, <code>text</code>, <code>partial</code>, <code>locals</code></p></blockquote>
<pre><code class="php">class HomeController extends ApplicationController {
public function index() {
echo "HomeIndex sayfası öncesi çalışan fonksiyon";
/////////////////////////////////////////////////////////////////////////////////
// default render for this functions examples : /home/index
/////////////////////////////////////////////////////////////////////////////////
// LAYOUT: home, VIEW: home, ACTION: index, LOCALS: null
$this->render("/home/index");
$this->render(["template" => "/home/index"]);
$this->render(["template" => "/home/index", "locals" => null]);
$this->render(["template" => "/home/index", "layout" => "home"]);
$this->render(["template" => "/home/index", "layout" => "home", "locals" => null]);
$this->render(["view" => "home"]);
$this->render(["action" => "index"]);
$this->render(["layout" => "home"]);
$this->render(["view" => "home", "action" => "index"]);
$this->render(["view" => "home", "action" => "index", "locals" => null]);
$this->render(["view" => "home", "action" => "index", "layout" => "home"]);
$this->render(["view" => "home", "action" => "index", "layout" => "home", "locals" = null]);
/////////////////////////////////////////////////////////////////////////////////
// no options
/////////////////////////////////////////////////////////////////////////////////
// DEFAULT LAYOUT: home, VIEW: home, ACTION: index, DEFAULT LOCALS: null
$this->render("/home/index"); // like $this->render(["template" => "/home/index"]);
// DEFAULT LAYOUT: home, VIEW: home, ACTION: show, DEFAULT LOCALS: null
$this->render("/home/show"); // like $this->render(["template" => "/home/show"]);
// DEFAULT LAYOUT: home, VIEW: admin, ACTION: show, DEFAULT LOCALS: null
$this->render("/admin/show"); // like $this->render(["template" => "/admin/show"]);
/////////////////////////////////////////////////////////////////////////////////
// option : layout, view, action, template
/////////////////////////////////////////////////////////////////////////////////
// LAYOUT: false, DEFAULT VIEW: home, DEFAULT ACTION: index, DEFAULT LOCALS: null
$this->render(["layout" => false]);
// DEFAULT LAYOUT: false, DEFAULT VIEW: home, ACTION: index, DEFAULT LOCALS: null
$this->render(["action" => "index"]);
// DEFAULT LAYOUT: false, VIEW: home, DEFAULT ACTION: index, DEFAULT LOCALS: null
$this->render(["view" => "home"]);
// DEFAULT LAYOUT: home, VIEW: home, ACTION: index, DEFAULT LOCALS: null
$this->render(["template" => "/home/index"]);
// DEFAULT LAYOUT: home, VIEW: admin, ACTION: index, DEFAULT LOCALS: null
$this->render(["view" => "admin", "action" => "index"]);
// LAYOUT: admin, VIEW: home, ACTION: show, DEFAULT LOCALS: null
$this->render(["layout" => "admin", "view" => "home", "action" => "show"]);
// LAYOUT: admin, VIEW: home, ACTION: index, DEFAULT LOCALS: null
$this->render(["layout" => "admin", "template" => "home/index"]);
// LAYOUT: admin, VIEW: home, ACTION: show, DEFAULT LOCALS: null
$this->render(["layout" => "admin", "template" => "home/show"]);
/////////////////////////////////////////////////////////////////////////////////
// option : file ( LAYOUT : pass, VIEW : pass, ACTION : pass )
/////////////////////////////////////////////////////////////////////////////////
// include locals and this file
// example file path = "/app/views/home/users/show.php"
// DEFAULT LOCALS: null
$this->render(["file" => "/app/views/home/users/show.php"]);
// LOCALS: ( $fist_name : "Gökhan", $last_name : "Demir" )
$this->render(["file" => "/app/views/home/users/show.php", "locals" => ["fist_name" => "Gökhan", "last_name" => "Demir"]);
/////////////////////////////////////////////////////////////////////////////////
// option : partial ( LAYOUT : pass, VIEW : pass, ACTION : pass )
/////////////////////////////////////////////////////////////////////////////////
// include locals and this file "_show.php" on VIEW path
// example file : /app/views/home/users/_show.php
// DEFAULT LOCALS: null
$this->render(["partial" => "home/users/show"]);
// LOCALS: ( $fist_name : "Gökhan", $last_name : "Demir" )
$this->render(["partial" => "home/users/show", "locals" => "locals" => ["fist_name" => "Gökhan", "last_name" => "Demir"]]);
/////////////////////////////////////////////////////////////////////////////////
// option : text ( LAYOUT : pass, VIEW : pass, ACTION : pass, LOCALS : pass )
/////////////////////////////////////////////////////////////////////////////////
// this option, available in Ajax functions
$this->render(["text" => "Hello World"]);
}
}
</code></pre>
<h4><code>redirect_to</code></h4>
<blockquote><p>request url [<code>/</code> or <code>/home</code>] redirect to <code>/home/index</code></p>
<p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/", "home#home"), // or root("home#home"),
get("/home", "home#home"),
get("/home/index")
);
</code></pre>
<blockquote><p><code>app/controllers/HomeController.php</code></p></blockquote>
<pre><code class="php">class HomeController extends ApplicationController {
public function home() {
return $this->redirect_to("/home/index");
}
public function index() {}
}
</code></pre>
<blockquote><p><code>app/views/home/index.php</code></p></blockquote>
<p>```php</p>
<h1> Home#Index </h1>
<pre><code>
#### `helpers`
Helpers `app/helpers/*Helper.php` şeklinde tanımlanan her controller ya da proje için gerekli görüldüğü yerlerde çağrılması gereken sınıfları projeye dahil eder.
> keys : `$FILE`, `all`
> `$FILE`
İstenilen helper sınıflarını projeye dahil eder.
</code></pre>
<p>class HomeController extends ApplicationController {</p>
<p> protected $helpers = [“Password”];</p>
<p> public function index() {
echo “random password : ” . PasswordHelper::generate(10);
}
}
```</p>
<blockquote><p><code>all</code></p></blockquote>
<p><code>app/helpers/*</code> altındaki tüm helper sınıflarını projeye dahil eder. #TODO anahtar ismi daha özel olabilir ?</p>
<pre><code class="php">class HomeController extends ApplicationController {
protected $helpers = ["all"];
public function index() {
echo "random string : " . StringHelper::generate(10);
echo "random password : " . PasswordHelper::generate(10);
}
}
</code></pre>
<h4><code>before_actions</code></h4>
<p>Before Action (<code>protected $before_actions</code>) özelliği, <code>app/controller/*.php</code> dosyası içerisinde her çalışacak get/post fonksiyonları için önceden çalışacak fonksiyonları belirtmeye yarayan özelliktir. Özelliğin etkisini ayarlamak için aşağıdaki 3 şekilde kullanılabilir:</p>
<blockquote><p>options : <code>except</code>, <code>only</code></p></blockquote>
<ol>
<li><p><code>except</code> anahtarı ile nerelerde çalışmayacağını</p></li>
<li><p><code>only</code> anahtarı ile nerelerde çalışacağını</p></li>
<li><p>Anahtar yok ise her yerde çalışacağını</p></li>
</ol>
<pre><code class="php">class HomeController extends ApplicationController {
protected $before_actions = [
["login", "except" => ["login", "index"]],
["notice_clear", "only" => ["index"]],
["every_time"]
];
public function index() {
echo "HomeIndex : Anasayfa (bu işlem için login fonksiyonu çalışmaz, notice_clear ve every_time çalışır)";
}
public function login() {
echo "Home#Login : Her işlem öncesi login oluyoruz. (get/post için /home/login, /home/index hariç)";
}
public function notice_clear() {
echo "Home#NoticeClear : Duyular silindi. (get/post için sadece /home/index'de çalışır)";
}
public function every_time() {
echo "Home#EveryTime : Her zaman get/post öncesi çalışırım.";
}
</code></pre>
<h4><code>after_actions</code></h4>
<p>After Action (<code>protected $after_actions</code>) özelliği, <code>app/controller/*.php</code> dosyası içerisinde her çalışacak get/post fonksiyonları için sonradan çalışacak fonksiyonları belirtmeye yarayan özelliktir. Özelliğin etkisini ayarlamak için aşağıdaki 3 şekilde kullanılabilir:</p>
<blockquote><p>options : <code>except</code>, <code>only</code></p></blockquote>
<ol>
<li><p><code>except</code> anahtarı ile nerelerde çalışmayacağını</p></li>
<li><p><code>only</code> anahtarı ile nerelerde çalışacağını</p></li>
<li><p>Anahtar yok ise her yerde çalışacağını</p></li>
</ol>
<blockquote><p><code>config/routes.php</code></p></blockquote>
<pre><code class="php">ApplicationRoutes::draw(
get("/admin/home"),
get("/admin/login"),
post("/admin/login")
);
</code></pre>
<blockquote><p><code>app/controllers/AdminController.php</code></p></blockquote>
<pre><code class="php">class AdminController extends ApplicationController {
protected $before_actions = [
["require_login", "except" => ["login", "logout"]]
];
public function login() {
if (isset($_SESSION["admin"]))
return $this->redirect_to("/admin/index");
if (isset($_POST["username"]) and isset($_POST["password"])) {
if ($user = User::unique(["username" => $_POST["username"], "password" => md5($_POST["password"])])) {
$_SESSION["success"] = "Admin sayfasına hoş geldiniz";
$_SESSION["full_name"] = "$user->first_name $user->last_name";
$_SESSION["admininfo"] = $user;
$_SESSION["admin"] = true;
return $this->render("/admin/index");
} else {
$_SESSION["danger"] = "Oops! İsminiz veya şifreniz hatalı, belki de bunlardan sadece biri hatalıdır?";
}
}
return $this->render(["layout" => "default"]);
}
// public function index() {} // OPTIONAL
public function logout() {
if (isset($_SESSION["admin"]))
session_destroy();
return $this->redirect_to("/admin/login");
}
public function require_login() {
if (!isset($_SESSION["admin"])) {
$_SESSION["warning"] = "Lütfen hesabınıza giriş yapın!";
return $this->redirect_to("/admin/login");
}
}
}
</code></pre>
<blockquote><p><code>app/views/admin/login.php</code></p></blockquote>
<p>```html</p>
<div class="row">
<div class="col-xs-3">
<img src="/app/assets/img/default.png" class="img-thumbnail" />
</div>
<div class="col-xs-9">
<form class="login-form" action="/admin/login" accept-charset="UTF-8" method="post">
<input type="text" placeholder="Kullanıcı Adı" class="form-control" size="50" name="username" id="username" />
<input type="password" placeholder="Parola" class="form-control" size="50" name="password" id="password" />
<button type="submit" class="btn btn-primary" style="width:100%">SİSTEME GİRİŞ</button>
</form>
</div>
</div>
<pre><code>
> `app/views/admin/home.php`
</code></pre>
<h1> Admin#Home </h1>
<pre><code>
> `app/views/layouts/admin.php`
</code></pre>
<p><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="tr" lang="tr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title></title>
</head>
<body>
<?= $yield; ?>
</body>
</html>
```</p>
<h3>Views (<code>app/views/DIRECTORY/*.php</code>)</h3>
<hr />
<p>Her <code>get</code> işlemi için <code>config/routes.php</code> de yönlendirilen <code>controller</code> ve <code>action</code> adlarını alarak, <code>app/views/CONTROLLER/ACTION.php</code> html sayfası <code>app/views/layouts/CONTROLLER.php</code> içerisine <code><?= $yield; ?></code> değişken kısmına gömülür ve görüntülenir.</p>
<blockquote><p><code>app/views/DIRECTORY/*.php</code></p></blockquote>
<p>```html</p>
<h1> Hello World </h1>
<pre><code>
> `app/views/layouts/DIRECTORY.php`
</code></pre>
<p><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="tr" lang="tr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title></title>
</head>
<body>
<?= $yield; ?>
</body>
</html>
```</p>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>render</code></p></blockquote>
<h4><code>render</code></h4>
<p>Fonksiyonu Controller'daki gibi tüm özellikleri ile kullanılabilir. Yalnızca <code>*.php</code> dosyalarının içersinde kullanılırken <code><?php render(); ?></code> şeklinde kullanılmalıdır. Daha ayrıntılı bilgi için <a href="https://github.com/barak-framework/barak/blob/master/README.md#render">Controller#render</a></p>
<h3>Model (<code>app/models/TABLE.php</code>)</h3>
<hr />
<p>Her tablonun bir modeli olmak zorundadır.</p>
<blockquote><p><code>app/models/TABLE.php</code>
<code>example: app/models/User.php</code></p></blockquote>
<pre><code class="php">class User extends ApplicationModel {
public function full_name() {
return $this->first_name . " " . $this->last_name;
}
}
</code></pre>
<pre><code class="php">$user = User::find(1);
echo $user->full_name();
</code></pre>
<ul>
<li>Query Kick Function (static)</li>
</ul>
<blockquote><p><code>load</code></p></blockquote>
<ul>
<li>Query Load Functions (public)</li>
</ul>
<blockquote><p><code>select</code>, <code>where</code>, <code>or_where</code>, <code>joins</code>, <code>order</code>, <code>group</code>, <code>limit</code>, <code>offset</code></p></blockquote>
<ul>
<li>Query Fetch Functions (public)</li>
</ul>
<blockquote><p><code>get</code>, <code>get_all</code>, <code>pluck</code>, <code>count</code>, <code>update_all</code>, <code>delete_all</code>, <code>first</code>, <code>last</code></p></blockquote>
<ul>
<li>Query Function Helpers (static) [alias]</li>
</ul>
<blockquote><p><code>all</code>, <code>unique</code>, <code>find</code>, <code>find_all</code>, <code>exists</code>, <code>update</code>, <code>delete</code></p></blockquote>
<ul>
<li>Model Functions</li>
</ul>
<blockquote><p><code>draft</code>, <code>create</code>, <code>save</code>, <code>destroy</code></p></blockquote>
<h4>CREATE</h4>
<ul>
<li>Functions</li>
</ul>
<blockquote><p> <code>draft</code>, <code>create</code></p></blockquote>
<h5><code>draft</code></h5>
<pre><code class="php">// Ör. 1:
$user = User::draft();
$user->first_name = "Gökhan";
$user->save();
print_r($user); // otomatik id alır
</code></pre>
<pre><code class="php">// Ör. 2:
$user = User::draft(["first_name" => "Gökhan"])->save();
print_r($user); // otomatik id alır
</code></pre>
<h5><code>create</code></h5>
<pre><code class="php">$user = User::create(["first_name" => "Gökhan"]);
print_r($user);
</code></pre>
<h4>READ</h4>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>load</code>, <code>select</code>, <code>where</code>, <code>or_where</code>, <code>order</code>, <code>group</code>, <code>limit</code>, <code>get</code>, <code>get_all</code>, <code>pluck</code>, <code>count</code>, <code>joins</code>, <code>find</code>, <code>find_all</code>, <code>all</code>, <code>first</code>, <code>last</code></p></blockquote>
<h5><code>load</code></h5>
<pre><code class="php">// Ör. 1:
$user = User::load()->get();
// SELECT * FROM user LIMIT 1
echo $user->first_name;
</code></pre>
<pre><code class="php">// Ör. 2:
$users = User::load()->get_all();
// SELECT * FROM user
foreach ($users as $user)
echo $user->first_name;
</code></pre>
<h5><code>where</code></h5>
<p>operators: <code>=</code>, <code>!=</code>, <code>></code>, <code><</code>, <code>>=</code>, <code><=</code></p>
<pre><code class="php">$users = User::load()->where("first_name", "Gökhan")->get_all();
$users = User::load()->where("first_name", "Gökhan", "=")->get_all();
// SELECT * FROM user WHERE first_name = 'Gökhan';
$users = User::load()->where("age", 25, "<>")->get_all();
// SELECT * FROM user WHERE age <> 25;
$users = User::load()->where("age", 25, ">")->get_all();
// SELECT * FROM user WHERE age > 25;
$users = User::load()->where("age", 25, "<")->get_all();
// SELECT * FROM user WHERE age < 25;
$users = User::load()->where("age", 25, ">=")->get_all();
// SELECT * FROM user WHERE age >= 25;
$users = User::load()->where("age", 25, "<=")->get_all();
// SELECT * FROM user WHERE age <= 25;
</code></pre>
<p>operators: <code>IS NULL</code>, <code>IS NOT NULL</code></p>
<pre><code class="php">$users = User::load()->where("email", NULL)->get_all();
$users = User::load()->where("email", "IS NULL")->get_all();
// SELECT * FROM user WHERE email IS NULL;
$users = User::load()->where("email", "IS NOT NULL")->get_all();
// SELECT * FROM user WHERE email IS NOT NULL;
</code></pre>
<p>operators: <code>LIKE</code>, <code>NOT LIKE</code></p>
<pre><code class="php">$users = User::load()->where("email", "%.com.tr", "LIKE")->get_all();
// SELECT * FROM user WHERE email LIKE '%.com.tr';
$users = User::load()->where("email", "%.com.tr", "NOT LIKE")->get_all();
// SELECT * FROM user WHERE email NOT LIKE '%.com.tr';
</code></pre>
<p>operators: <code>IN</code>, <code>NOT IN</code></p>
<pre><code class="php">$users = User::load()->where("id", [1, 2, 3], "IN")->get_all();
// SELECT * FROM user WHERE id IN (1, 2, 3);
$users = User::load()->where("id", [1, 2, 3], "NOT IN")->get_all();
// SELECT * FROM user WHERE id NOT IN (1, 2, 3)
</code></pre>
<p>operators: <code>BETWEEN</code>, <code>NOT BETWEEN</code></p>
<pre><code class="php">$users = User::load()->where("created_at", ["2016-12-01", "2016-13-01"], "BETWEEN")->get_all();
// SELECT * FROM user WHERE created_at BETWEEN "2016-12-01" AND "2016-13-01";
$users = User::load()->where("created_at", ["2016-12-01", "2016-13-01"], "NOT BETWEEN")->get_all();
// SELECT * FROM user WHERE created_at NOT BETWEEN "2016-12-01" AND "2016-13-01";
</code></pre>
<h5><code>or_where</code></h5>
<p>only logic key: <code>OR</code></p>
<pre><code class="php">// where($field, $value, $mark, "OR")
$users = User::load()->where("first_name", "Gökhan")->or_where("last_name", "Demir")->get_all();
$users = User::load()->where("first_name", "Gökhan", "=", "AND")->where("last_name", "Demir", "=", "OR")->get_all();
// SELECT * FROM user WHERE first_name = 'Gökhan' OR last_name = 'Demir';
</code></pre>
<h5><code>select</code>, <code>where</code>, <code>order</code>, <code>group</code>, <code>limit</code>, <code>get</code>, <code>get_all</code></h5>
<pre><code class="php">$users = User::load()
->where("first_name", "Gökhan")
->select("first_name")
->order("id")
->limit(10)
->get_all();
foreach ($users as $user)
echo $user->first_name;
</code></pre>
<h5><code>pluck</code></h5>
<pre><code class="php">// Ör. 1:
$user_ids = User::load()->pluck("id");
print_r($user_ids);
// [1, 2, 3, 4, 66, 677, 678]
</code></pre>
<pre><code class="php">// Ör. 2:
$user_firstnames = User::load()->pluck("first_name");
print_r($user_firstnames);
// ["Gökhan", "Göktuğ", "Gökçe", "Gökay", "Atilla", "Altay", "Tarkan", "Başbuğ", "Ülkü"]
</code></pre>
<h5><code>count</code></h5>
<pre><code class="php">// Ör. 1:
echo User::load()->count();
// 12
</code></pre>
<pre><code class="php">// Ör. 2:
echo User::load()->where("first_name", "Gökhan")->count();
// 5
</code></pre>
<h5><code>joins</code></h5>
<pre><code class="php">// Ör. 1:
// Category ["id", "name"]
// Article ["id", "category_id"]
// Like ["id", "article_id"]
// Comment ["id", "article_id"]
// Tag ["id", "comment_id"]
$categories = Category::load()->joins("article")->get_all();
$categories = Category::load()->joins(["article"])->get_all();
$categories = Category::load()->joins(["article" => "comment"])->get_all();
$categories = Category::load()->joins(["article" => ["comment" => ["tag"]]])->get_all();
$categories = Category::load()->joins(["article" => ["comment" => ["tag"], "like"]])->get_all();
$categories = Category::load()->joins(["article" => ["comment" => ["tag"], "like"], "document"])->get_all();
$categories = Category::load()->joins(["article", "document"])->get_all();
</code></pre>
<pre><code class="php">// Ör. 2:
// Department ["id", "name"]
// User ["id", "department_id", "first_name"]
// Address ["id", "user_id", "content"]
$department = Department::load()
->joins(["user", "address"])
->where("User.id", 1)
->select("User.first_name, Department.name, Address.content")
->limit(1)
->get_all();
print_r($department);
</code></pre>
<h5><code>unique</code></h5>
<pre><code class="php">$user = User::unique(["username" => "gdemir", "password" => "123456"]);
echo $user->first_name;
</code></pre>
<h5><code>find</code></h5>
<pre><code class="php">$user = User::find(1);
echo $user->first_name;
</code></pre>
<h5><code>find_all</code></h5>
<pre><code class="php">$users = User::find_all([1, 2, 3]);
foreach ($users as $user)
echo $user->first_name;
</code></pre>
<h5><code>all</code></h5>
<pre><code class="php">$users = User::all();
foreach ($users as $user)
echo $user->first_name;
</code></pre>
<h5><code>first</code></h5>
<pre><code class="php">// Ör. 1:
$user = User::first();
echo $user->first_name;
</code></pre>
<pre><code class="php">// Ör. 2:
$users = User::first(10);
foreach ($users as $user)
echo $user->first_name;
</code></pre>
<h5><code>last</code></h5>
<pre><code class="php">// Ör. 1:
$user = User::last();
echo $user->first_name;
</code></pre>
<pre><code class="php">// Ör. 2:
$users = User::last(10);
foreach ($users as $user)
echo $user->first_name;
</code></pre>
<h5><code>exists</code></h5>
<pre><code class="php">echo User::exists(1) ? "kayit var" : "kayit yok";
</code></pre>
<h4>UPDATE</h4>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>save</code>, <code>update</code></p></blockquote>
<h5><code>save</code></h5>
<pre><code class="php">// Ör. 1:
$user = User::unique(["username" => "gdemir", "password" => "123456"]);
$user = User::find(1);
$user = User::load()->get();
$user = User::first();
$user = User::last();
$user->first_name = "Gökhan";
$user->save()
print_r($user);
</code></pre>
<pre><code class="php">// Ör. 2:
$users = User::find_all([1, 2, 3]);
$users = User::load()->get_all();
$users = User::all();
$users = User::load()
->where("first_name", "Gökhan")
->select("first_name")
->order("id")
->limit(10)
->get_all();
$users = User::first(10);
foreach ($users as $user) {
$user->first_name = "Göktuğ";
$user->save();
}
</code></pre>
<h5><code>update</code></h5>
<pre><code class="php">// Ör. 1:
User::update(1, ["first_name" => "Gökhan", "last_name" => "Demir"]);
</code></pre>
<pre><code class="php">// Ör. 2:
$users = User::find_all([1, 2, 3]);
$users = User::load()->get_all();
$users = User::all();
$users = User::load()
->where("first_name", "Gökhan")
->select("first_name")
->order("id")
->limit(10)
->get_all();
foreach ($users as $user)
User::update($user->id, ["first_name" => "Göktuğ", "last_name" => "Demir"]);
</code></pre>
<h4>DELETE</h4>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>destroy</code>, <code>delete</code>, <code>delete_all</code></p></blockquote>
<h5><code>destroy</code></h5>
<pre><code class="php">$user = User::unique(["username" => "gdemir", "password" => "123456"]);
$user = User::find(1);
$user = User::load()->get();
$user = User::first();
$user = User::last();
$user->destroy();
</code></pre>
<h5><code>delete</code></h5>
<pre><code class="php">User::delete(1);
</code></pre>
<h5><code>delete_all</code></h5>
<pre><code class="php">User::load()->delete_all();
User::load()->where("first_name", "Gökhan")->delete_all();
User::load()->where("first_name", "Gökhan")->limit(10)->delete_all();
User::load()->limit(10)->delete_all();
</code></pre>
<h4>DEPENDENCİES</h4>
<blockquote><p><code>$BELONG_TABLE->OWNER_TABLE</code></p></blockquote>
<pre><code class="php">// Department ["id", "name"]
// User ["id", "department_id", "first_name", "last_name"]
// Book ["id", "user_id", "name"]
// Department
// [1, "Bilgisayar Mühendisliği"]
// [2, "Makine Mühendisliği"]
// User
// [1, 1, "Gökhan", "Demir"]
// [2, 1, "Göktuğ", "Demir"]
// [3, 2, "Göksen", "Demir"]
// Book
// [1, 1, "Barak Türkmenlerinin Tarihi"]
// [2, 1, "Oğuz Boyu"]
// [3, 3, "Almila"]
$book = Book::find(1);
// [1, 1, "Barak Türkmenlerinin Tarihi"]
print_r($book->user);
// [1, 1, "Gökhan", "Demir"]
print_r($book->user->department);
// [1, "Bilgisayar Mühendisliği"]
echo "$book->user->department->name $book->user->first_name $book->name";
// "Bilgisayar Mühendisliği Gökhan Barak Türkmenlerinin Tarihi"
</code></pre>
<blockquote><p><code>$OWNER_TABLE->all_of_BELONG_TABLE</code></p></blockquote>
<pre><code class="php">// User ["id", "department_id", "first_name", "last_name"]
// Book ["id", "user_id", "name"]
// User
// [1, 1, "Gökhan", "Demir"]
// [2, 1, "Göktuğ", "Demir"]
// [3, 2, "Göksen", "Demir"]
// Book
// [1, 1, "Barak Türkmenlerinin Tarihi"]
// [2, 1, "Oğuz Boyu"]
// [3, 2, "Kımız"]
// [4, 3, "Almila"]
$user = User::find(1);
$books = $user->all_of_book;
foreach ($books as $book)
echo $book->name;
</code></pre>
<h3>Mailer (<code>app/mailers/*.php</code>)</h3>
<hr />
<p>Mailer sınıf olarak <code>PHPMailer</code>i kullanmaktadır ve yapı olarak Controllerin bir benzeri görev yapmaktadır. <code>helper</code>, <code>before_actions</code>, <code>after_actions</code> gibi ayarlamaları kullanabilme imkanı vermektedir. Her hazırlanan Mailer sınıfı içerisindeki fonksiyonda <code>mail</code> fonksyionu ve alıcı tanımlanmak <em>zorundadır</em>. Layout olarak <em>zorunlu</em> olarak <code>app/views/layouts/mailer.php</code> dosyasını kullanmaktadır. View olarak ise istenilen actiona göre <code>app/views/mail/ACTION.php</code> dosyası tanımlanması gerekir, buradaki <code>app/views/mail</code> dizinini kullanmak <em>zorunludur</em>.</p>
<ul>
<li>Mailer Kick Functions</li>
</ul>
<blockquote><p><code>delivery</code></p></blockquote>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>mail</code></p></blockquote>
<ul>
<li>Options</li>
</ul>
<blockquote><p><code>helpers</code>, <code>before_actions</code>, <code>after_actions</code></p></blockquote>
<h4><code>delivery</code> ($action, [$param1, $param2, …])</h4>
<ol>
<li>parametre olarak kullanılacak Mailer içersindeki method ismi yazılır.</li>
<li>parametre eğer method bir veri alacak şekilde tanımlandıysa bu veriler liste içersinde gönderilir.</li>
</ol>
<blockquote><p><code>app/controllers/HomeController.php</code></p></blockquote>
<pre><code class="php">class HomeController extends ApplicationController {
public function index() {
PasswordMailer::delivery("reset");
PasswordMailer::delivery("reset2", ["m930fj039fj039j", "gdemir.me", "mail@gdemir.me", "Gökhan Demir"]);
}
}
</code></pre>
<blockquote><p><code>app/mailers/PasswordMailer.php</code></p></blockquote>
<pre><code class="php">class PasswordMailer extends ApplicationMailer {
protected $after_actions = [["info"]];
public function info() {
if (isset($this->email) && isset($this->fullname)) {
$this->mail([
"to" => [[$this->email => $this->fullname]],
"subject" => "Güçlü Şifre İçin Öneriler"
]);
}
}
public function reset() {
$this->code = "ab234c2589de345fgAASD6";
$this->site_url = "gdemir.me";
$this->mail([
"to" => [["mail@gdemir.me" => "Gökhan Demir"]],
"subject" => "[Admin] Please reset your password"
]);
}
public function reset2($random_code, $site_url, $email, $fullname) {
$this->code = $random_code;
$this->site_url = $site_url;
$this->mail([
"to" => [[$email => $fullname]],
"subject" => "[Admin] Please reset your password"
]);
}
}
</code></pre>
<h4><code>mail</code></h4>
<blockquote><p>options : <code>to</code>, <code>subject</code></p>
<p><code>app/controllers/HomeController.php</code></p></blockquote>
<pre><code class="php">class HomeController extends ApplicationController {
public function index() {
PasswordMailer::delivery("reset");
PasswordMailer::delivery("reset2", ["m930fj039fj039j", "gdemir.me"]);
}
}
</code></pre>
<blockquote><p><code>app/mailers/UserMailer.php</code></p></blockquote>
<pre><code class="php">class UserMailer extends ApplicationMailer {
protected $after_actions = [["info"]];
protected $before_actions = [["notice"]];
public function notice() {
$this->mail([
"to" => [["gdemir@bil.omu.edu.tr" => "Gökhan Demir"]],
"subject" => "1 Kullanıcı Şifre Sıfırlama Talebinde Bulundu"
]);
}
public function info() {
if (isset($this->email) && isset($this->fullname)) {
$this->mail([
"to" => [[$this->email => $this->fullname]],
"subject" => "Güçlü Şifre İçin Öneriler"
]);
}
}
public function reset() {
$this->code = "ab234c2589de345fgAASD6";
$this->site_url = "gdemir.me";
$this->mail([
"to" => [["mail@gdemir.me" => "Gökhan Demir"]],
"subject" => "[Admin] Please reset your password"
]);
}
public function reset2($random_code, $site_url, $email, $fullname) {
$this->code = $random_code;
$this->site_url = $site_url;
$this->email = $email;
$this->fullname = $fullname;
$this->mail([
"to" => [[$this->email => $this->fullname]],
"subject" => "[Admin] Please reset your password"
]);
}
}
</code></pre>
<p>// default layout TODO change?</p>
<blockquote><p><code>app/views/layouts/mailer.php</code></p></blockquote>
<pre><code class="html"><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="tr" lang="tr">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title></title>
<link href="" rel="alternate" title="" type="application/atom+xml" />
<link rel="shortcut icon" href="/favicon.ico">
<link rel="stylesheet" href="/app/assets/css/syntax.css" type="text/css" />
<link href='http://fonts.googleapis.com/css?family=Monda' rel='stylesheet' type='text/css'>
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="/app/assets/js/html5shiv.min.js"></script>
<script src="/app/assets/js/respond.min.js"></script>
<![endif]-->
<script src="http://code.jquery.com/jquery.js"></script>
<script src="/app/assets/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container" style="width:365px; min-height:200px; margin-top: 8%;">
<?= $yield; ?>
</div>
</body>
</html>
</code></pre>
<blockquote><p><code>app/views/mail/password/reset.php</code></p></blockquote>
<pre><code class="html">Sistem şifrenizi kaybettiğinizi duyduk. Üzgünüm!<br/><br/>
Endişelenme! Parolanızı sıfırlamak için 1 saat içinde aşağıdaki bağlantıyı kullanabilirsiniz:<br/><br/>
<a href='http://$_site_url/admin/password_reset/$code'>http://$_site_url/admin/password_reset/$code</a>
</code></pre>
<blockquote><p><code>app/views/mail/password/reset2.php</code></p></blockquote>
<pre><code class="html">Sistem şifrenizi kaybettiğinizi duyduk. Üzgünüm!<br/><br/>
Endişelenme! Parolanızı sıfırlamak için 1 saat içinde aşağıdaki bağlantıyı kullanabilirsiniz:<br/><br/>
<a href='http://$_site_url/admin/password_reset/$code'>http://$_site_url/admin/password_reset/$code</a>
</code></pre>
<blockquote><p><code>app/views/mail/password/info.php</code></p></blockquote>
<pre><code class="html"><code>UYARI</code>:
<i class="text-info">
<ul class="col-sm-offset-1">
<li>Şifreniz en az 8 karakterden oluşmalıdır</li>
<li>Büyük, küçük harfler ve rakamların her biri en az 1 defa kullanılmalıdır</li>
<li>"?, @, !, #, %, +, -, *, %" gibi özel karakterler en az 1 defa kullanılmalıdır</li>
</ul>
</i>
</code></pre>
<blockquote><p><code>app/views/mail/password/notice.php</code></p></blockquote>
<p>```html
<code>BILDIRIM</code>:</p>
<hr>
<p>Web sayfasında 1 kişi şifre değişikliği talebinde bulundu. <br/>
<b>Tarih :</b> <?= date(“Y-m-d H:i:s”); ?>
```</p>
<h3>Configurations (<code>config/*</code>)</h3>
<hr />
<blockquote><p><code>config/application.ini</code> (application configuration file)</p></blockquote>
<pre><code class="ini">[application_configuration]
debug = true
timezone = Europe/Istanbul
locale = tr
logsize = 5242880
cacheexpiration = 604800
</code></pre>
<blockquote><p><code>config/database.ini</code> (database configuration file)</p></blockquote>
<pre><code class="ini">[database_configuration]
host = localhost
user = root
pass = barak
name = BARAK
</code></pre>
<blockquote><p><code>config/mailer.ini</code> (mailer configuration file)</p></blockquote>
<p>Default SMTP Configuration (Test Edildi)</p>
<pre><code class="ini">[mailer_configuration]
port = 25
address = mail.gdemir.me
username = mail@gdemir.me
password = 123456
</code></pre>
<p>Yandex SMTP Configuration (Test Edildi)</p>
<pre><code class="ini">port = 587
address = smtp.yandex.com
username = mail@gdemir.me
password = 123456
</code></pre>
<p>Gmail SMTP Configuration (Test Edilmedi)</p>
<pre><code class="ini">port = 465
address = smtp.gmail.com
username = mail@gdemir.me
password = 123456
</code></pre>
<blockquote><p><code>config/locales/LANGUAGE.php</code> (language configuration file)</p></blockquote>
<p>Varsayılan dosyası <code>config/locales/tr.php</code> dosyasıdır, yeni bir dil eklenecekse aynı list kullanılıp değer kısımları değiştirilerek
kaydedilmelidir. Bu çeviri dosyalarının yönetimi erişimi ve yönetimi için I18n kısmında anlatılmaktadır.</p>
<p><code>config/locales/tr.php</code></p>
<pre><code class="php"><?php
return [
"home" => [
"link" => "Anasayfa",
"about_us" => "Hakkımızda"
]
];
?>
</code></pre>
<p><code>config/locales/en.php</code></p>
<pre><code class="php"><?php
return [
"home" => [
"link" => "Homepage",
"about_us" => "About Us"
]
];
?>
</code></pre>
<h3>Seeds (<code>db/seeds.php</code>)</h3>
<hr />
<p>Proje başlamadan önce ilk çalıştırılacak dosyadır.</p>
<blockquote><p><code>db/seeds.php</code> (database seeds file)</p></blockquote>
<pre><code class="php">if (User::load()->count() == 0) {
User::create(["first_name" => "Gökhan", "last_name" => "Demir", "username" => "gdemir", "password" => "123456"]);
User::create(["first_name" => "Gökçe", "last_name" => "Demir", "username" => "gcdemir", "password" => "123456"]);
User::create(["first_name" => "Göktuğ", "last_name" => "Demir", "username" => "gtdemir", "password" => "123456"]);
User::create(["first_name" => "Atilla", "last_name" => "Demir", "username" => "ademir", "password" => "123456"]);
}
</code></pre>
<h3>I18n (<code>config/locales/LOCALE.php</code>)</h3>
<hr />
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>locale</code>, <code>get_locale</code>, <code>translate</code></p></blockquote>
<h4><code>locale</code></h4>
<p>Çeviri kelimeleri (<code>config/locales/tr.php</code> veya <code>config/locales/en.php</code> gibi dosyalar dizi olarak $<em>SESSION[“</em>i18n”] üzerine yüklenir.) proje başlangıcında <code>config/application.ini</code> dosyası içersinde <code>locale</code> değişkenine ile atanabilir veya projenin herhangi bir aşamasında aşağıdaki gibi atanabilir/değiştirilebilir. Varsayılan olarak <code>config/locales/tr.php</code> dosyası okunur.</p>
<pre><code class="php">ApplicationI18n::locale("tr");
</code></pre>
<h4><code>get_locale</code></h4>
<p>O an seçili olan dilin hangisi olduğunu anlamak için bu fonksiyon kullanılır.</p>
<pre><code class="php">// Ör. 1:
ApplicationI18n::get_locale();
// tr
</code></pre>
<pre><code class="php">// Ör. 2:
ApplicationI18n::get_locale();
// en
</code></pre>
<h4><code>translate</code></h4>
<p>Çevirisi yapılacak bir kelime dizini o an hangi dil yüklü ise ona göre çeviri yapmak için aşağıdaki gibi kullanılır.</p>
<pre><code class="php">ApplicationI18n::translate("home.about_us");
</code></pre>
<p>bu fonksiyonu daha kolay kullanmak için alias olarak tanımlı <code>t</code> fonksiyonu ile erişilebilir.</p>
<pre><code class="php">t("home.about_us");
</code></pre>
<h3>Debug</h3>
<hr />
<p>Exception, Error, Shutdown(Fatal Error) akışlarını yakalayıp tek sayfada göstermeye yararayan sınıftır. Eğer hataların gösterilmesi istenmiyorsa <code>config/application.ini</code> dosyası içerisinde <code>debug = false</code> denilerek kullanıcı bazlı <code>public/500.html</code> sayfası gösterilir, ancak log kaydı her şekilde de tutulur.</p>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>exception</code>, <code>error</code>, <code>shutdown</code></p></blockquote>
<h4><code>exception</code></h4>
<pre><code class="php">throw new Exception("OMG!");
</code></pre>
<p>veya</p>
<pre><code class="php">ApplicationDebug::exception(new Exception("OMG!"));
</code></pre>
<p>tarzındaki fonksiyonlar ile hataları bulunduğu sayfada yakalar ve istisnanın bulunduğu kod satırınının bir kısmını gösterir.</p>
<h4><code>error</code></h4>
<pre><code class="php">ApplicationDebug::error(123123, "Undefined variable: a", "/var/www/html/app/controllers/DefaultController.php", 10);
</code></pre>
<p>veya</p>
<pre><code class="php">echo $a;
</code></pre>
<p>gibi ifadelerle bir tanımlanmayan değişkenin kullanma hatasını adım adım framework'de hangi dosyalardan hangi satıra kadar olduğunun gösterilmesini sağlar.</p>
<h4><code>shutdown</code></h4>
<pre><code>ApplicationDebug::shutdown()
</code></pre>
<p>veya</p>
<p>ölümcül başka türlü hatalarda (sistemin çalışmadığı durumlarda) sistemin ölümcül hata verdiği kısmı adım adım framework'de hangi dosyalardan hangi satıra kadar olduğunun gösterilmesini sağlar.</p>
<h3>Logger (<code>tmp/log/*</code>)</h3>
<hr />
<p>Günlük olarak dosyalar açarak verilen mesajları loglamaya yarayan sınıftır. Log dosyaları varsayılan olarak 5242880 byte (5MB) ile sınırlıdır.</p>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>size</code>, <code>info</code>, <code>warning</code>, <code>error</code>, <code>fatal</code>, <code>debug</code></p></blockquote>
<h4><code>size</code></h4>
<p>Lop dosyasının maximum boyutunun ayarlanması</p>
<pre><code class="php">ApplicationLogger::size(5000);
</code></pre>
<h4><code>info</code>, <code>warning</code>, <code>error</code>, <code>fatal</code>, <code>debug</code></h4>
<pre><code class="php">ApplicationLogger::info("bilmek iyidir");
ApplicationLogger::warning("olabilir?");
ApplicationLogger::error("dikkat et");
ApplicationLogger::fatal("cevap vermiyor");
ApplicationLogger::debug("olaylar olaylar");
// log/2017-06-18.txt
// 2017-06-18 09:45:36 → info : bilmek iyidir
// 2017-06-18 09:45:36 → warning : olabilir?
// 2017-06-18 09:45:36 → error : dikkat et
// 2017-06-18 09:45:36 → fatal : cevap vermiyor
// 2017-06-18 09:45:36 → debug : olaylar olaylar
</code></pre>
<h3>Cache (<code>tmp/cache/*</code>)</h3>
<hr />
<p>Verilen anahtarlara göre <code>request_url</code> + <code>key</code> (istek url ve verilen anahtar)‘e göre md5 ile şifreleyip <code>tmp/cache/*</code> dizini üzerinde yazma, okuma, silme, var olduğunu bakma, tamamen silme gibi işlemleri yapan sınıftır. Veriler varsayılan olarak 604800 milisaniye (10 dakika) süre ile saklanır.</p>
<ul>
<li>Functions</li>
</ul>
<blockquote><p><code>expiration</code>, <code>write</code>, <code>read</code>, <code>delete</code>, <code>exist</code>, <code>reset</code></p></blockquote>
<h4><code>expiration</code></h4>
<p>Saklanacak verilerin genel olarak ne kadar süre ile tutulacağının ayarlanması</p>
<pre><code class="php">ApplicationLogger::expiration(604800);
</code></pre>
<h4><code>write</code></h4>
<p>Saklanacak verilerin <code>request_url</code> + <code>key</code> (istek url ve verilen anahtar)‘e göre md5 ile şifreleyip belleğe yazar. Bu şekilde farklı bir sayfada kaydettiğiniz aynı anahtar isimli veriler, farklı dosyalar olarak kaydedilmektedir.</p>
<pre><code class="php">$users = User::all();
ApplicationCache::write("users", $users);
</code></pre>
<h4><code>read</code></h4>
<p>Bellekteki veriyi <code>request_url</code> + <code>key</code> mantığı ile okur, eğer dosyanın süresi geçmişse otomatik olarak siler.</p>
<pre><code class="php">$users = ApplicationCache::read("users");
</code></pre>
<h4><code>delete</code></h4>
<p><code>request_url</code> + <code>key</code> mantığına göre bulunan ve var olan dosya süresine bakılmaksızın silinir.</p>
<pre><code class="php">ApplicationCache::delete("users");
</code></pre>
<h4><code>exists</code></h4>
<p><code>request_url</code> + <code>key</code> mantığına göre var olmasına bakar.</p>
<pre><code class="php">echo (ApplicationCache::exists("users")) ? "bellekte var" : "bellekte yok";
</code></pre>
<h4><code>reset</code></h4>
<p><code>tmp/cache/*</code> altındaki tüm saklanan verileri sürelerine bakılmaksızın siler.</p>
<pre><code class="php">ApplicationCache::reset();
</code></pre>
<h2>Trailer</h2>
<p><a href="https://www.youtube.com/watch?v=cYNnHN5w1ok"><img src="https://img.youtube.com/vi/cYNnHN5w1ok/2.jpg" alt="BarakTurkmens" /></a>
<a href="https://www.youtube.com/watch?v=haNqSJKs_j4"><img src="https://img.youtube.com/vi/haNqSJKs_j4/2.jpg" alt="BarakTurkmens#İskan" /></a>
<a href="https://www.youtube.com/watch?v=m21oNITMdyI"><img src="https://img.youtube.com/vi/m21oNITMdyI/2.jpg" alt="BarakTurkmens#YanıkKerem" /></a>
<a href="https://www.youtube.com/watch?v=uSoz28QpHRI"><img src="https://img.youtube.com/vi/uSoz28QpHRI/2.jpg" alt="BarakTurkmens#MürselBey" /></a>
<a href="https://www.youtube.com/watch?v=3RBtPGWRnsI"><img src="https://img.youtube.com/vi/3RBtPGWRnsI/2.jpg" alt="BarakTurkmens#VeledBey" /></a>
<a href="https://www.youtube.com/watch?v=CiThgSNoSr0"><img src="https://img.youtube.com/vi/CiThgSNoSr0/2.jpg" alt="BarakTurkmens#VeledBey2" /></a></p>
<h2>Sources</h2>
<ul>
<li><a href="https://tr.wikipedia.org/wiki/Barak_T%C3%BCrkmenleri">https://tr.wikipedia.org/wiki/Barak_T%C3%BCrkmenleri</a></li>
</ul>
<h2>License</h2>
<p>Barak is released under the <a href="http://www.opensource.org/licenses/MIT">MIT License</a>.</p>
GitHub Üzerinden Composer'e Paket Entegrasyonu-1702062017-02-06T00:00:00+00:00/categories/php/composer-github-integration<p>Composer üzerine eklenen tüm paketler <a href="https://packagist.org">https://packagist.org</a> üzerinden erişim sağlanabilmektedir. Buraya eklenecek paketler Bitbucket veya GitHub üzerindeki projenize ilgili API Token ile bağlantı sağlamakta ve erişilmektedir. Bitbucket or GitHub hesapları olamayanlar için manual kurulumu da anlatılmaktadır ilgili sitede anlatılmaktadır. (Bk.: <a href="https://packagist.org/about">https://packagist.org/about</a>)
Aşağıda bir Github projenizi nasıl <a href="https://packagist.org">https://packagist.org</a> üzerinden servis edeceksiniz adım adım anlatacağım.</p>
<h3>Hesap Oluşturma</h3>
<p><a href="https://packagist.org">https://packagist.org</a> üzerinde hesabımız yoksa <a href="https://packagist.org/register/">https://packagist.org/register/</a> linkinden bir hesap açıyoruz.</p>
<h3>Packagist Üzerinden API Token Alma</h3>
<p><a href="https://packagist.org">https://packagist.org</a> üzerinden Profile yani <a href="https://packagist.org/profile/">https://packagist.org/profile/</a> linkine tıklıyoruz. Show API Token diyerek kendi Token'imizi kopyalıyoruz.</p>
<h3>GitHub Projenize Packagist Servisi Ekleme</h3>
<p>GitHub üzerinden paket olarak ekliyeceğiniz proje için,</p>
<ul>
<li><p>İlgili projeye tıklıyoruz</p></li>
<li><p>Settings kısmına tıklıyoruz</p></li>
<li><p>Integrations & services kısmına tıklıyoruz</p></li>
<li><p>Add Service > Packagist tıklıyoruz</p></li>
</ul>
<p>Packagist profil sayfamızdaki,</p>
<ul>
<li><p>Kullanıcı Adınızı</p></li>
<li><p>API Token bilginizi</p></li>
<li><p>Projenin varsa bir web sayfasını</p></li>
</ul>
<p>ekliyerek kaydetiyoruz. Buraya kadar her şey tamam, artık <a href="https://packagist.org">https://packagist.org</a> projeniz servis edilmiş oluyor artık bu projenizi kullanmak isteyen arkadaşlar yapması gereken sadece aşağıdaki komut olacaktır.</p>
<pre><code>composer create-project {GitHub_Username}/{GitHub_Project} {Directory}
</code></pre>
<h3>Packagist'e Paket Gönderimi</h3>
<p>Paket gönderimini yapmadan önce ilgili projenizin ana dizin içerisinde <code>composer.json</code> dosyası eklenmiş olması gerekmektedir. Burada örnek verecek olursak,</p>
<pre><code>{
"name": "barak-framework/barak",
"type": "project",
"description": "Barak Framework",
"keywords": ["barak", "turkmen", "framework"],
"homepage": "https://github.com/barak-framework",
"license": "MIT",
"authors": [
{
"name": "Gökhan DEMİR",
"email": "gdemir3327@gmail.com",
"homepage": "https://gdemir.github.io",
"role": "Developer"
}
],
"require": {
"php": ">=5.4.0",
"phpmailer/phpmailer": "~5.2"
}
}
</code></pre>
<p>şeklinde bir <code>composer.json</code> tanımlayabilirsiniz. Daha fazla detay için <a href="https://getcomposer.org/doc/04-schema.md">https://getcomposer.org/doc/04-schema.md</a> sayfasına bakabilirsiniz. Ana dizinimizde artık <code>composer.json</code> dosyası olduğundan dolayı artık projeyi senkronize için gönderebiliriz. Göndermek için projenizin bulunduğu Bitbucket veya GitHub url linkini (<code>https://github.com/barak-framework/barak</code> gibi) <a href="https://packagist.org/packages/submit">https://packagist.org/packages/submit</a> linkindeki ilgili yere check yapmanız yeterlidir. Eğer check sonrası henüz bir sonuç yoksa 1 gün sonra tekrar deneyin API bilgilerinin senkronize sağlaması geç sürebilir.</p>
<h3>Örnek</h3>
<ul>
<li><a href="https://packagist.org/packages/barak-framework/barak">barak-framework/barak</a></li>
</ul>
<h3>Kaynak</h3>
<ul>
<li><p><a href="https://packagist.org">https://packagist.org</a></p></li>
<li><p><a href="https://packagist.org/about#how-to-update-packages">https://packagist.org/about#how-to-update-packages</a></p></li>
</ul>
Composer-1701262017-01-26T00:00:00+00:00/categories/php/composer<p>Composer PHP için geliştirilmiş bir Paket Yöneticisi‘dir. Bir framework’ün veya bir bileşenin bağımlı olduğu diğer bileşenleri ve gereksinimleri yönetir.</p>
<h3>Composer Nasıl Kurulur?</h3>
<p>Kullanmak istediğiniz projenizin içinde veya framework'ün içerisinde aşağıdaki gibi <code>composer.phar</code> dosyasını indiriyoruz:</p>
<pre><code>curl -sS https://getcomposer.org/installer | php
</code></pre>
<p>İndirilen <code>composer.phar</code> dosyasını global olarak her yerden <code>composer</code> adı altında kullanmak için taşıma yapıyoruz:</p>
<pre><code>mv composer.phar /usr/local/bin/composer
</code></pre>
<h3>Composer Nasıl Kullanılır</h3>
<p>İndirdiğimiz <code>composer.phar</code> dosyası <code>composer.json</code> dosyasının içersindeki paketlerin versiyonlarına göre okuyup indirir. Yani <code>composer.json</code> gerekli paketlerin tanımlandığı dosyadır.</p>
<blockquote><p>Ör.: <code>composer.json</code></p></blockquote>
<pre><code>{
"name": "barak-framework/barak",
"type": "project",
"description": "Barak Framework",
"keywords": ["barak", "turkmen", "framework"],
"homepage": "https://github.com/barak-framework/barak",
"license": "MIT",
"authors": [
{
"name": "Gökhan DEMİR",
"email": "gdemir3327@gmail.com",
"homepage": "https://gdemir.github.io",
"role": "Developer"
}
],
"require": {
"php": ">=5.4.0",
"phpmailer/phpmailer": "~5.2"
}
}
</code></pre>
<p>yukarıdaki örnekte olduğu gibi projenin gereksinimlerinde php ve phpmailer gözükmektedir:</p>
<pre><code>"require": {
"php": ">=5.4.0",
"phpmailer/phpmailer": "~5.2"
}
</code></pre>
<h3>Composer İle Bağımlı Paketlerin İndirilmesi</h3>
<p>Projenin içine indirdiğimiz indirdiğimiz <code>composer</code> gerekli paketlerin kurulumunu yapacağız, bunun için aşağıdaki komutu kullanıyoruz:</p>
<pre><code>composer install
</code></pre>
<p>yukarıdaki komut ile ilgili projemizin içerisinde aynı dizindeki <code>composer.json</code> dosyasını okuyup ilgili paketleri <code>vendor/</code> altına indirecektir. Bu paketlerin belli bir formata göre okuyan <code>vendor/autoload.php</code> ana yükleyici dosyası da inmiş olacaktır. Bu dosyayı nerede kullanırsak tüm paketleri otomatik yükleyemiş olacaksınız bunun için ilgili <code>php</code> dosyanızın içerisinde aşağıdaki komutu eklemeni yeterli olacaktır:</p>
<pre><code>require "vendor/autoload.php";
</code></pre>
<p>Evet buraya kadar her şey tamam artık istenilen tüm paketlerin sınıflarını çağrıldığı yerde kullanabilirsiniz!</p>
<h3>Composer ile Yeni Paket Yüklenmesi</h3>
<p><code>composer.json</code> sahip projenin içersindeyken <code>composer.lock</code> dosyasını silin:</p>
<pre><code>sudo rm -rf composer.lock
</code></pre>
<p>daha sonra gerekli paketi örnek olarak şekilde kurabilirsiniz:</p>
<pre><code>composer require phpmailer/phpmailer
</code></pre>
<p>bu komut <code>composer.json</code> içersindeki <code>required</code> hashine ekleme yapar ve <code>vendor</code> dizinin içersine istenilen paketi yerleştirir. Bu şekilde ilgili pakete erişebilirsiniz.</p>
<h4>Kaynak</h4>
<ul>
<li><p><a href="https://getcomposer.org/">https://getcomposer.org/</a></p></li>
<li><p><a href="http://www.teknomavi.com/yazilim/php/composer-paket-yoneticisi-nedir-nasil-kurulur-nasil-kullanilir/">http://www.teknomavi.com/yazilim/php/composer-paket-yoneticisi-nedir-nasil-kurulur-nasil-kullanilir/</a></p></li>
</ul>
Oğuz Kağandan Günümüze Barak Türkmenleri-1612212016-12-21T00:00:00+00:00/categories/barak/barak<p>Barak isimi, mitolojik devirlere ait Türk efsanelerine kadar dayanan tarihi geçmişe sahip bir isimdir. Etimolojik olarak varmak fiilinden dolayı çabuk yürüyen, koşan anlamına gelen bu kelime farklı sözlüklerde mitik ifadelerle de tanımlanmaktadır.
Anayurtları Asya’nın kuzeybatısı olan Baraklar, Horasan’dan Anadolu’ya üçüncü büyük göç dalgasında yer alan Beydili’yle beraber Musul, Telafer ve Bayat Türkmenleriyle aynı dönemde göç etmişlerdir. Barakların göçü, XVI. yüzyılda vergilerin ağırlığı, tabiat şartları ve diğer sıkıntılar yüzünden İran’ın Farap, Karacuk yaylasından başlamış ve iskân başı olan Firuz Bey önderliğinde Anadolu’ya yönelmiştir. Göçün, Anadolu güzergâhı ise Erzurum, Erzincan, Yozgat ve Sivas yolu olmuştur.</p>
<p>1691 yılında Osmanlı Devleti tarafından stratejik, ekonomik ve siyasi nedenlerle Rakka’ya iskân için emir alan Baraklar, 1692 yılında bölgedeki diğer aşiretlerle birlikte Rakka Mukavelesi’ni imzalayarak bu bölgeye gelmişlerdir. Ayrıca Baraklara yaylak olarak Sivas’taki Habeş Yaylası (Uzun Yayla), gösterilmiştir. Bu iskân sırasında Arap ve Kürt aşiretleriyle verdikleri mücadeleler neticesinde ise bugünkü yerlerine yerleşmişlerdir.</p>
<p>Baraklar, bugün Anadolu’da Barak Ovası ve Barakeli olarak ta bilinen bölgede bulunmaktadırlar. Bu bölge Güneydoğu Anadolu bölgesinde Kilis’in güneydoğusundan, Gaziantep’in Oğuzeli ilçesinin güneyinden ve Nizip ilçesinin kuzeydoğusunda bulunan Belkıs köyünden başlayarak doğuda Fırat nehri kıyısına ve güneyde Suriye sınırına kadar uzanan oldukça geniş bir alanı içine almaktadır.</p>
<h3>1.BARAK ADI ve BARAKLARIN KÖKENİ</h3>
<h4>1.1.Barak’ın Sözlük Anlamları</h4>
<p>Barak kelimesi Lehçe-i Osmânî’de ‘yünlü, kıllı, tüylü çuha’[1], Büyük Türk Lügati’nde ‘bir nev tüylü av köpeği, berg kebe (çobanların ve köylülerin giydikleri ve yere serdikleri yünden kaba aba)’[2], Türk Dialecte’de ‘uzun kuyruklu ve yallı soylu bir at cinsi, sık yünlü koyun, kıvırcık tüylü köpek cinsi’[3] ve Kâmûs-ı Türkî’de ise ‘uzun kıllı, uzun tüylü’[4] gibi birbirine yakın anlamlarda geçmektedir.</p>
<h5>1.1.1.Barak Adına Etimolojik Yaklaşım</h5>
<p>Genelde boy ve oymak adlarının döneminde kutsal sayılan bir hayvana atfedildiği ve bu hayvanın sıfat olarak boy veya oymak adının önünde yer aldığı bilinmektedir. Ancak Barak adı etimolojik olarak incelendiğinde kelimenin asıl anlamı ortaya çıkmaktadır. Buna göre; Eski Türkçede kelime başında bulunan b- sesi, Batı Türkçesinde kelime başında v- ye dönüşmüştür. Dolayısıyla Batı Türkçesinde kelime başındaki v- sesleri, Eski Türkçede b- biçiminde ifade edilmiştir. Hatta Kıpçak Türkçesinde kelime başı b- sesinin dönüşüme uğramadığı aynen korunduğu da görülmektedir[5]. Bu nedenle Barak kelimesine “var-/bar-” fiilinden dolayı[6] “çok çabuk yürüyen ve koşan” anlamı yüklenmektedir[7]. Nitekim kuzey Sibirya’da yaşayan, Yakut Türklerinin masallarında geçen, çok süratli yürüyen mitolojik bir kişinin adı “Baragçı”dır. Yakutlarda kadın ve erkek Şamanların ataları olan ve onları türeten, Kara Barak hatun gibi ikinci derecede tanrılardan bahsedilmektedir[8]. Bunun yanı sıra Barak uzun kuyruklu, soylu bir at cinsi olarak da sözlüklerde tanımlanmaktadır. Bütün bunların ışığında “Barak” kelimesinden hızlı koşan, yürüyen anlamı çıkarmak mümkündür. Kaldı ki, İslamiyet’ten sonra Barak sözcüğünün, Osmanlı belgelerinde yine hız ve çabukluğu ifade eden “Burak” kelimesiyle de nitelendirildiği görülmektedir.</p>
<h5>1.1.2.Barak Adını Açıklamaya Yardımcı Olan Mitik ve Efsanevi Anlatılar</h5>
<p>Efsanelerde Saka savaşçılarının savaş sırasında ejder gibi göründüğünden bahsedilmektedir. Bu görünümü başlarına bağladıkları dağ sığır kuyruğu sağlamaktadır. Atlar durduğu vakit üzerlerinden çeşitli paçavralar sarkar. Hareket ettikleri zaman ise değişik renkteki bu paçavralar rüzgarın da etkisiyle bir ıslık sesi çıkarır ve ejdere benzeyen bir görünüme bürünür. Kaşgarlı Mahmut buna benzer bir durumu Karahanlıların Budist Uygurlarla savaştıklarında görüldüğünü belirtir. Atlara takılan paçavralar ise Beçkem (Perçem) olarak ifade edilir[9].</p>
<p>Aynı şekilde Avrupalı seyyah ve gezginler tarafından Atilla’nın başı da köpeğe benzetilmiştir. Hunların Savaşta güçlerinin yetmediği düşmanlarını yüzlerinin korkunçluğu sayesinde korkutarak kaçırdıklarından bahsedilmektedir. Bununla birlikte savaşçıların gözlerinin görünmeyecek kadar küçük olduğu belirtilmektedir. Boyları küçük olan bu savaşçıların geniş omuzlara sahip oldukları, çevik ve ustaca hareket ettikleri, çok iyi ata bindikleri, boyunlarının ise ok ve yay kullanmaya müsait olduğu yine kaynaklarda yer almaktadır. Çocukların doğarken bile hiddetle dünyaya geldiği ve yeni doğan çocukların yüzlerinin demirle çizilerek acıya alıştırıldıkları vurgulanmaktadır[10].</p>
<p>Bütün bu özellikler, Barakları tasvir ederken de kullanılabilir. Çünkü Oğuz destanında bahsedildiği gibi Barakların çok eskiden uyguladıkları savaş teknikleri Sakalarınkine benzemektedir.</p>
<p>· Baraklar, savaştan önce vücutlarını çamura belerler. Bu işlem çamur kurudukça birkaç kez tekrarlanır. Böylece vücutlarını bir zırh gibi kaplayan çamur tabakasına ok ve mızrağın işlemesi güçleşir[11].</p>
<p>· Yine başlarını, kollarını ve vücutlarını kıllı derilerle kaplarlar. Böylece gerçekten acayip bir görüntüye sahip olup düşmanı caydırdıkları gibi ok ve mızrakların etkisini de azaltmış olurlar.</p>
<p>· Dini ayinlerini (şaman) başlarındaki kıllı maskelerle yapar ve anlaşılmayan sesler çıkarırlar.</p>
<p>Bütün bunlardan da anlaşılacağı üzere savaş ve ayin sırasında kullandıkları teknik ve edevatlar, Barak erkeklerinin neden çirkin ve kıllı olduklarını neden kıl ve it sıfatlarının Barak adı önünde yer aldığını izah etmeye yardımcı olacaktır. Aynı şekilde Barak kadınları savaşta yer almadıkları için elbette güzel olarak tasvir edilmektedirler. Dolayısıyla erkeklerinin hepsi çirkin, kadınlarının ise hepsi güzel olarak ifade edildiği bir kavim tanımı yanlış yorumların çıkmasına sebep olmaktadır.</p>
<p>Barak kelimesi, Kaşgarlı Mahmud’un Divan-ı Lügât-it-Türk adlı eserinde “çok tüylü köpek” olarak tabir olunmakta ve şu şekilde tarif edilmektedir; “Türklerin inandıklarına göre, kerkes kuşu kocayınca iki yumurta yumurtlarmış yumurtaların birisinden barak çıkarmış. Bu, köpeklerin en çok koşanı, en iyi avlayanı olurmuş öbür yumurtadan da bir yavru çıkarmış bu, son yavrusu olurmuş” [12]. Türkçede Barak kelimesinin anlamı bu mitolojik anlatıdaki anlamda sıklıkla kullanılmıştır.</p>
<p>Mitolojik olaylar, devrinin var oluşlarını izah ederken yaşananları doğaüstü üslupla resmeder. Dolayısıyla bu tür olaylar, zamanın şartlarına indirgenip değerlendirilmelidir. Oğuz destanında yer alan Baraklar Kıl Barak şeklinde ifade edilmiştir. Aynı şekilde İt Barak’ta yine efsanelerde yer almaktadır. Bu iki sıfat da savaşta kullandıkları tekniklerinden dolayı Barakların ismi önünde yer almıştır. Barakları bu tanımlarla ön plana çıkarıp onların kahramanlıklarını hasıraltı etmek ise elbette akla izana uymaz. Etimolojik anlamında da belirtildiği üzere Barak çevik, hızlı, atik demektir.</p>
<p>Barak kelimesi it ve kıl sıfatlarının telaffuzundan kaçınmak için oymak ahalisi tarafından bayraktar kelimesinin kısaltılmışı olarak ta tabir olunmaktadır. Buna göre Baraklar iskânın bayraktarı idiler. Dolayısıyla Barak kelimesi bayraktar kelimesine atfen ifade bulmuştur[13]. Ayrıca oymak ahalisi tarafından it veya kıl sıfatlarının kullanılmak istenmemesi, Barak kelimesine bayraktarın yanı sıra berrak ve bark gibi uydurma anlamların da yüklenmesine neden olmuştur. Genel olarak bu sıfatların benimsenememesinin nedeni ise günümüzde kullanılan anlamlarıyla algılanmış olmalarındandır.</p>
<h4>1.2.Barakların Türk Boy ve Oymak Sistemindeki Yeri</h4>
<p>Rasonyi’nin Tarihte Türklük adlı eserinde bir Kıpçak oymağı olarak tanıtılan Baraklar[14], Osmanlı iskân politikası uygulamasında Oğuzların Beydili boyuna tabi olarak gösterilmektedir.[15] Lakin Baraklar, kendilerini köken olarak Beydili Türkmenlerinden farklı görürler. Buna paralel olarak Barak oymağının kendi isteği ile Beydili Türkmenlerine katıldığından bahseden kaynaklar da mevcuttur[16]. Bazı yerlerde ise Baraklar, Dulkadir eline bağlı boylardan biri olan Cerit üzerinde gösterilmektedirler[17]. Oğuz ile Barak’ın kardeş olduğunu ifade eden kaynakların yanında Kıpçak ve Barak’ın kardeş olduğunu belirten kaynaklar da mevcuttur[18]. Dolayısıyla Baraklar, Oğuzlar ve Kıpçaklar gibi ayrı bir Türk boyu olarak ta yorumlanabilir. Barakların bir kısmı zamanın akışı içerisinde Kıpçaklar içerisinde eriyerek Kafkaslardan Macaristan’a kadar yayılmışlardır. Bir kısmı Horasan’da kalmış, bir kısmı da Anadolu’ya gelerek çeşitli badirelerden sonra bugün yaşadıkları bölgeye yerleşmişlerdir.</p>
<h5>1.2.1.Güneydoğu Anadolu’da Baraklar</h5>
<p>Kökeni, başka bir ifadeyle Anayurtları Asya’nın kuzeybatısı olan Baraklar, bugün aynı adla anılan Barak Ovası’nda bulunmaktadırlar. Bu bölge Güneydoğu Anadolu bölgesinde Kilis’in güneydoğusundan, Gaziantep’in Oğuzeli ilçesinin güneyinden ve Nizip ilçesinin kuzeydoğusunda bulunan Belkıs köyünden başlayarak doğuda Fırat nehri kıyısına ve güneyde Suriye sınırına kadar uzanan oldukça geniş bir alanı içine almaktadır.</p>
<p>Baraklar, bugün yaşadıkları bölgede büyük ölçüde Beydili ile karışık bir vaziyettedirler. Ayrıca çok az da olsa bu karışımın içerisinde Elbeyli, Karakeçili, Bayındır oymakları ile bazı Yörük obaları da yer almaktadır. Dolayısıyla Barak’a Beydili, Elbeyli, Karakeçili, Bayındır ve Yörük demek de yanlış olmaz. Kaldı ki, Barak kültürünün oluşumunda başka oymak ve obaların da etkisi görülür. Mevali (Gevence), Pican-Bircan (Alagöz), Damarka (Fayat Ağa), Elbeacur (Çıldıraba), Alaadinli (Karacaören) ve daha birçok oymak Barak kültürüyle benzerlik göstermekte, Baraklar gibi yaşamaktadırlar. Bunun yanı sıra XIX. yüzyıl sonlarında Ayntab kazasının sekiz nahiyesinden biri olan Reşi’ye[19] bağlı ve genellikle Kürtçenin konuşulduğu köylerde de Türkmenlerin etkileşimi görülmektedir. Örneğin Gaziantep’in Nizip ilçesine bağlı Kilisecik (Tanır) köyü, Bekmişli Türkmenlerinin yaşadığı bir köydür. Yine Cağıt (Tatlıcak)’ta Türkmenler Kürtçe konuşmaktadırlar. Burada yaşayan Türkmenler Reşi geleneklerinin oluşumunda da önemli rol oynamışlardır. Bu sosyolojik durumu, Anadolu’nun daha başka yerlerinde de görmek mümkündür.</p>
<h4>1.3.Barak ve Beydili’nin Horasan’dan Anadolu’ya Gelişleri</h4>
<p>Oğuzlar Anadolu topraklarına farklı zamanlarda cereyan eden üç büyük göç dalgasıyla gelmişlerdir. Ziya Gökalp bu göçü[20], şöyle anlatmaktadır; Bu göçlerden birincisi Selçuklularla beraber gelen Oğuzların veya Kınık Oğuzlarının göçüdür. Bu oğuzlar bilindiği gibi Artuklular, Atabekler, Mengücoğulları gibi siyasi teşekküller vücuda getirmişlerdir.</p>
<p>İkinci göç dalgası Celaleddin Harzemşah ile beraber gelen Salur Oğuzlarıdır. Salur hanedanı Kaşgar’da Hakaniye Devleti’ni kurmuştu. Salur yabgusu (ilbeyi) ile bu devletin subaşısı olan Selçuk’un bozuşması, Oğuzların bir kısmının Salur Oğuzlarından ayrılmasına neden olmuştu. Karahitaylar’ın Kaşgar’ı istila etmeleri üzerine de Salur Oğuzları Harezm ülkesine göç etmişlerdi. Cengiz istilası başlayınca Celaleddin Harzemşah ile beraber batıya geldiler. Celalettin’in ölmesiyle her tarafa dağıldılar. Kınıklılar, Kalaçlar, Karakeçi, Bucak, Bayır, İlbeyli, Sarılar, Tekeler, Çavdarlar, Karamanlar, Karapapaklar ve Kayılar bu göçe mensupturlar.</p>
<p>Üçüncü göç doğu İran’ın Farap kışlağında ve Karacuk yaylasında yaşayan Oğuzların göçü olmuştur. Bunlar da İlhanlılar devrinde batıya göç etmişlerdir. Bu Oğuzların başında Bayındır boyuna mensup bir han bulunmaktaydı. Akkoyonlu ve Karakoyunlu Devletleri bu üçüncü göç dalgasında gelen hanlar tarafından kuruldu.</p>
<p>Korkut Ata Oğuzname’sinde Oğuzların iki kolunu oluşturan, Üçoklarla Bozoklarının geçimsizliğini göstermektedir. Bu bakımdan Bozoklar Bayındır hanedanından uzak yaşamayı tercih etmişlerdir. Bugün Anadolu topraklarında Türkmen olarak bilinenler genel olarak Bayındır Oğuzlarının Bozoklarıdır. Çünkü bu Türkmenler devlet kurmamış ve il hayatı yaşamışlardır. Hükümet kurup şehirde oturanlar Türk adını aldıkları halde bunlar eski Türkmen unvanlarını korudular. Anadolu’daki Salur Oğuzlarının göçebeleri ise Yörük namıyla bunlardan ayrılırlar. Bu üçüncü göçe ait Bozoklar, Yozgat sancağına Bozok unvanını veren Oğuzlardır. Bunlardan Avşar boyu, Aziziye ve Konya taraflarında otururlar.</p>
<p>Beydili boyu Bozok Türkmenlerinin en çok olan kısmıdır. Türkmen Colabı’nda, Cerablus’da bulundukları gibi Şanlıurfa’daki Badıllı’larda bunların bir şubesidir. Karacadağ’da (Diyarbakır) yaşayan Terkan’larda Türkçeyi unutmalarına rapmen Beydili boyuna mensup olduklarını unutmamışlardır. Suruç’taki Barazan ve Mardin’deki Kalaçlar aşiretlerinde de Badıllı namını taşıyan oymaklar vardır.</p>
<p>Beydili’nin Cerablus’taki oymaklarından biri Karkın’dır Köylerden birinin ismi Kayan (Kıyan) Kayı ve ikisinin ismi Bazer’dir. Bu isimler Oğuzların Bozok boylarından üçünün adını taşımaktadır. Türkmen Colabı’nda Beydili’lerin mukaddes tanıdıkları bir aile vardır. Bu ailenin reisine Budak beyi ve Turhan beyi unvanı verilir.</p>
<p>Baraklar, Musul ve Telafer Türkmenleri ile Bayat Türkmenleri, İran’ın Kaşkayları ile Kaçarları, Akdeniz sahilinin Varsakları da bu üçüncü göç dalgasına aittirler. Bu üç il zamanında tek oğuz ilinden ayrıldıkları için aralarında fark yoktur.</p>
<h5>1.3.1.Horasan’dan Rakka’ya</h5>
<p>Çıktık Horasan’dan sökün eyledik</p>
<p>Düşürdüler bizi tozlu yollara</p>
<p>Omuzlarda parlıyor uzun şilfeler</p>
<p>Aşırdılar bizi karlı dağlara</p>
<p>Bölük Bölük Yüklendi Göçler</p>
<p>Atlandı İhtiyar, Yayandı Gençler</p>
<p>Başımıza Geldi Gördüğüm Düşler</p>
<p>Düşürdüler Bizi Gurbet Ellere</p>
<p>Gehi konduk, gehi göçtük yollardan</p>
<p>Bilip bilmediğim garip ellerden</p>
<p>Kerbela çölünden ıssız dağlardan</p>
<p>Bizden sonra bir nam kalsın illere</p>
<p>Oradan geçirdi sürdü Colab’a</p>
<p>Seksen dört bin evdir gelmez hesaba</p>
<p>Deve koyun çok insan kalaba</p>
<p>Susuz hayvan inileşir göllere</p>
<p>Dedemoğlu der ki aşkın bağından</p>
<p>Aşırdılar bizi Yozgat dağından</p>
<p>Anadolu Sivas şehri sağından</p>
<p>Bu zamanda destan olsun dillere[21]</p>
<ol>
<li>yüzyılda Horasanda İran’ın Farap, Karacuk yaylasından vergilerin ağır oluşu ve diğer baskılar neticesinde Firuz Bey önderliğinde başlayan göç Erzurum, Erzincan, Yozgat ve Sivas yoluyla Anadolu’ya ulaşmıştır. Göç esnasında Bekmişli, Karaşeyhli, Gündeşli, Gazili, Ulaşlı, Kadirli, Haydarlı, Şarkevi, Pirbudak oymakları, bu oymaklar boybeyi olan Budak oymağından Pir Budakoğlu Hacı Ali tarafından, Baraklar ise Ceceli Ali Paşa tarafından yönetilmiştir[22].</li>
</ol>
<p>Yeni-il (Sivas) haslarında, Arap Osman’a tabi olan Baraklar ve çoğu Beydili boyuna bağlı olan Halep Türkmenleri, 1691 yılında Rakka’ya iskân edilmek üzere emir almışlardır. Böylece Baraklar ve Beydili oymakları Rakka’ya gelmişlerdir[23]. Rakka’ya iskânın nedenlerini ise şöyle özetlemek mümkündür;</p>
<p>İskân’a tabi olan oymaklara yaylak yaşamı temin etmek, böylece gerekli asker ihtiyacını sağlamak
Yerli halka eziyet eden konar-göçer taifeyi bu şekilde cezalandırmak ve ahaliye zarar vermelerinin önüne geçmek
Yaylak ve kışlak yaşamını benimsemiş olan oymakların ziraatle uğraşmalarını sağlamak, viran yerleri yeniden bayındır hale getirmek
Eşkıyalığa meyletmiş olan Anezeler gibi Arap aşiretlerine karşı bir tampon oluşturmak
Yolları güvence altına almak. Özellikle de Birecik iskelesinden sevk edilen ve çoğu zaman Arap aşiretleri tarafından yağma edilen önemli eşyaların güvenle yerlerine ulaşmasını sağlamak</p>
<p>Rakka’ya iskân sırasında (Acem’e giden) Firuz Bey bulunmamıştır. İskân başı Firuz Bey’in oğlu Şahin Bey’dir. Kadıoğlu Hüseyin Paşa tarafından iskân başı olarak atanan Şahin Bey’in yanı sıra Baraklar, boy beyleri İnal Kethüda ve Mehmet oğlu Musa tarafından yönetilmişlerdir. Bekmişli cemaatinden Ganem ve Ali oğlu Halil, Araplı oymağından Musa oğlu Ganim ve İsmail oğlu Muharrem, Kadirli oymağından Abdulkadir oğlu Sevindik, Kazlı oymağından Şedid oğlu Cebbar, Karaşeyhli oymağından Şedid oğlu Asaf ve Ebuseyf oğlu Mirza Ali ile Arap aşiretleri arasında 19 Aralık 1692 yılında Rakka Mukavelesi imzalanmıştır[24].</p>
<p>Rakka Mukavelesi, bölgedeki Arap aşiretlerinin Türkmen yerleşimine karşı göstermeleri muhtemel tepkiden başka Rakka civarında oluşan tahribatı önlemek, iç güvenliği temin etmek, sosyal barışı sağlamak ve ekonomiyi güçlendirmek amacıyla Türkmenlerle Kürtler beraber, Arap aşiretleriyle imzalanmıştır. Oymakların yerleşim biçimi iskân türkülerinde şöyle ifade edilmektedir;</p>
<p>Toplandık aşiret geldik Colab’a</p>
<p>Baş bend de Firuz Bey’in değil mi?</p>
<p>Emretti Beyler konduk yan yana</p>
<p>Hacı Ali’nin yurdu Seylan değil mi?</p>
<p>Ondan aşağı Budak düzüldü</p>
<p>Bend sahibi isim ismine yazıldı</p>
<p>Orda Berk Ağa’nın keyfi bozuldu</p>
<p>Torunların yurdu Şirvan değil mi?</p>
<p>Yurt verildi Ulaşlı’nın Beyine</p>
<p>O da kondu Berk Ağa’nın sağına</p>
<p>Fırkat geldi Akçakale dağına</p>
<p>Bayındır’ın yurdu Goncan değil mi?</p>
<p>Dedemoğlu haymaların kurulsun</p>
<p>Çekilsin Bayraklar Mehter vurulsun</p>
<p>Döğülsün kahven harbin çalınsın</p>
<p>Abdalların yurdu ören değil mi?</p>
<p>Firuz Bey’in Colap’ta üç oğlunun ismi geçmektedir. Bunlar Şahin Bey, Kenan Bey ve Kurt Bey’dir. Firuz Bey Bozkoyunlu oymağının Kılıçbeyli obasına mensuptur. Rakka anlaşmasında imzası bulunan Seyif Han da yine Bozkoyunlu oymağının Alibeyli obasına mensuptur.</p>
<p>İskân başı olarak atanan Şahin Bey, kardeşi Kenan Bey’le beraber bazı oymakların deve ve koyun sürülerine el koymuştur. Bu durum Beydli Türkmenleri ve Baraklar arasında hoşnutsuzluğa neden olmuş ve Şahin Bey, Kadıoğlu Yusuf Paşa’ya şikâyet edilmiştir. Şahin Bey’den sonra Kenan Bey bir müddet iskânın başına getirilse de Yusuf Paşa oymaklar tarafından sevilen ve sayılan Şahin Bey’in oğlu Firuz Bey’i (Firuz Bey’in torunu Firuz Bey) 1702 yılında iskân başı olarak atamıştır[25]. Firuz Bey, Birecik’ten Bağdat’a kadar Türkmen ve Mevâli aşiretleriyle birlikte eski yolun güvenliğini sağlamış, ayrıca İran seferleri için asker toplama ve yollama işini de görmüştür.</p>
<p>Rakka’ya iskâna zorlanan oymaklar, tabiatıyla yerleşik yaşam tarzını benimsemekte güçlük çekmişler ve sık sık firar ederek yerlerini terk etmişlerdir. Baraklarla birlikte diğer Türkmen aşiretlerinin Anadadolu’ya dağıldıkları Osmanlı arşiv kayıtlarında şöyle ifade edilmektedir; Rakka Beylerbeyisi Hüseyin Paşa’ya hüküm ki, Rakka eyâletinde Belic nehri kenarında Ayneruz ve Akçakale civarında iskân edilen ve aşağıda adları yazılı oymaklar eşkıya ile savaşmaları gerekirken yerlerinden firar etmişlerdir. Bu oymaklar şunlardır; Bozulus Türkmenlerinden İzeddin ve Köçekli ve Avşar ve İnallı ve Anter ve Acarlu ve Cemolu ve Ömerli mahiyeti. Bundan başka Çağırganlı cemaatleri Hamza Hacılı oğlu, Bidil Bey oğlu Mehmed ve mahiyeti. Beydili Türkmenlerine tabi Ulaşlı cemaati boybeyi Ali Bey, yine Beydili Türkmenlerine bağlı Buraklu (Baraklu) cemaati boybeyi Muharrem oğlu Musa ve Hacıbal oğlu dört yüz nefer ile zikredilen Bozulus cemaatlerine katılarak, sekiz yüz nefer olmak üzere, Beydili cemaatlerinden Bekmişli cemaati boybeyi Hacı oğlu Ganem beş yüz nefer mahiyeti ile Karaşeyhli cemaati boybeyi Topal oğlu Asaf altı yüz nefer ile Bozkoyunlu cemaati Firuz Bey oğlu Şahin Bey altı yüz mahiyeti ile yine Bozkoyunlulardan Seyif Han iki yüz neferi ile Dimleklü cemaati ve boybeyi Pirbudak oğlu Mehmed ve Satılmış beş yüz nefer olmak üzere ki tamamı üç bin iki yüz nefer olur. Yukarıda adı geçen oymak ve boybeylerinin toplanarak iskân bölgesine gönderilmeleri emrolunur[26].</p>
<p>Sürelerin yaylalara çobanlar vasıtasıyla götürülüp getirilmesi emredildiği halde çoğu oymak ahalisi hayvanlarını kendileri götürmüş ve yaylaklarından geriye dönmemişlerdir. Rakka’ya iskân edilen Baraklara da Sivas’ın Habeş yaylası yaylak olarak tahsis edilmiş ve buraya gelen Baraklar, yerli halkın ekili dikili alanlarına zarar vermekle beraber, Rakka’ya dönmekten imtina etmişlerdir. Burak (Barak) cemaatinin Sivas ili ahalisine tecavüz ettiklerine dair Rakka mütesellimi Recep ve İskân başı Firuz Bey’e hüküm ki, Rakka iskânı topluluğundan Burak (Barak) cemaati Fırat nehri kenarında Rakka eyâletine bağlı Sınur denilen yerde ikâmet ettikleri halde zikredilen yerde ziraat ile uğraşacak yerleri olmadığından, geçimlerini deve koyun ve buna benzer hayvanlardan yapmaktadırlar. Ancak Rakka valilerinin izni ile devamlı yaylakları olan Habeş denilen yerde üç ay kaldıktan sonra davarlarıyla birlikte kışın iskân yerlerine dönmeleri gerekirken, Sivas ili ahalisinden bazı kimseler adı geçen cemaatin (diğer cemaatlerle birlikte) yaylaklarından ayrılmadığı zulüm ve eziyette bulunduklarını bildirmektedir. Ardından ise yeniden Rakka’ya dönmeleri (döndürülmeleri) emrolunmaktadır[27].</p>
<p>Baraklar Habeş yaylasına gidiş gelişlerinde Elbeyliler ile beraber hareket etmişlerdir. Yaylanın tasviri Elbeylioğlu’nun şiirinde oldukça güzel anlatılmıştır.</p>
<p>Sultan Habeş bir karlıca dağ olur</p>
<p>Suyun içen hastaları sağ olur</p>
<p>Ben giderim kötü Barak Bey olur</p>
<p>Babam yurdu telli yaylam kalındı</p>
<p>Top top olmuş gelen Barak kızları</p>
<p>Kudretten sürmelenmiş gözleri</p>
<p>Göz görürde can katlanmaz sizleri</p>
<p>Babam yurdu nazlı yaylam kalındı</p>
<p>Yağmur yağar ışıladır kaylağı</p>
<p>Eli göçmüş bozulaşır taylağı</p>
<p>Taze gelin koç yiğidin yaylağı</p>
<p>Babam yurdu nazlı yaylam kalındı</p>
<p>Sultan Habeş bir karlıca peridir</p>
<p>Bitmiş geyik göbeği de sümbül sarıdır</p>
<p>Arap atlar koç yiğidin yarıdır</p>
<p>Babam yurdu telli yaylam kalındı[28]</p>
<p>Baraklar ve Beydili oymakları iki yüz yıla yakın kaldıktan sonra Colab’dan ayrılmak zorunda kalmışlardır. Abbas paşa tarafından dağıtılan Türkmenler, bugün bulundukları yere yerleşmiş ve hayvancılığın yanı sıra ziraatla da uğraşmaya başlamışlardır. Barak, Osmanlı idâri taksimatında XXI. yüzyıl başlarına kadar Urfa sancağının Birecik kazasına bağlı bir nahiye statüsünde bulunmuştur[29].</p>
<p>Evvel gelişimiz iskân olanda</p>
<p>Dağıttın Colab’ı sen Abbas Paşa</p>
<p>Aşiret siz de bakın böyle zamana</p>
<p>Dağıttın Colab’ı sen Abbas Paşa</p>
<p>Haydarlı Çelebi çıksın bir yana</p>
<p>Araplı, Kadirli döndü aslana</p>
<p>Dört çevremiz döndü kara dumana</p>
<p>Dağıttın Colab’ı sen Abbas Paşa</p>
<p>Güneşle Ulaşlı tırada insin</p>
<p>Bayındırlı Kazlı arkada dursun</p>
<p>Torunla Şarkevi hazırlık görsün</p>
<p>Dağıttın Colab’ı sen Abbas Paşa</p>
<p>Mehmet Bey’im der ki belim büküldü</p>
<p>Gözüm yaşı sinelere döküldü</p>
<p>Dağıldı aşiretim bendim söküldü</p>
<p>Dağıttın Colab’ı sen Abbas Paşa[30]</p>
<p><a href="https://www.youtube.com/watch?v=cYNnHN5w1ok"><img src="https://img.youtube.com/vi/cYNnHN5w1ok/2.jpg" alt="BarakTurkmens" /></a>
<a href="https://www.youtube.com/watch?v=haNqSJKs_j4"><img src="https://img.youtube.com/vi/haNqSJKs_j4/2.jpg" alt="BarakTurkmens#İskan" /></a>
<a href="https://www.youtube.com/watch?v=m21oNITMdyI"><img src="https://img.youtube.com/vi/m21oNITMdyI/2.jpg" alt="BarakTurkmens#YanıkKerem" /></a>
<a href="https://www.youtube.com/watch?v=uSoz28QpHRI"><img src="https://img.youtube.com/vi/uSoz28QpHRI/2.jpg" alt="BarakTurkmens#MürselBey" /></a>
<a href="https://www.youtube.com/watch?v=3RBtPGWRnsI"><img src="https://img.youtube.com/vi/3RBtPGWRnsI/2.jpg" alt="BarakTurkmens#VeledBey" /></a>
<a href="https://www.youtube.com/watch?v=CiThgSNoSr0"><img src="https://img.youtube.com/vi/CiThgSNoSr0/2.jpg" alt="BarakTurkmens#VeledBey2" /></a></p>
Wordpress Kurulumu-1610062016-10-06T00:00:00+00:00/categories/linux/wordpress-installation<h3>Kurulum</h3>
<p>Wordpress indirmek için aşağıdaki linkten istediğimiz versiyonları seçiyoruz:</p>
<pre><code>https://wordpress.org/download/release-archive/
</code></pre>
<h3>Wordpress için MySQL kullanıcı ve şifre yaratma</h3>
<p>Veritabanını daha önceden kurduğumuz MySQL üzerinden yaratacağız. MySQL girişi için</p>
<pre><code>mysql -u root -p
</code></pre>
<p>Terminal size daha önceden belirlediğiniz şifreyi soracaktır. Şifreyi girip devam edelim. Giriş yaptıktan sonra wordpress adında bir veritabanı oluşturalım: (Veritabanı adını (wordpress), kullanıcı adını (wordpressuser) ve şifreyi (password) istediğiniz gibi değiştirebilirsiniz)</p>
<pre><code>CREATE DATABASE wordpress;
</code></pre>
<p>Kullanıcı adı oluşturmak için:</p>
<pre><code>CREATE USER wordpressuser@localhost;
</code></pre>
<p>Yeni kullanıcıya şifre koymak için:</p>
<pre><code>SET PASSWORD FOR wordpressuser@localhost= PASSWORD("password");
</code></pre>
<p>Son olarak kullanıcıya veritabanı üzerindeki tüm izinleri verelim:</p>
<pre><code>GRANT ALL PRIVILEGES ON wordpress.* TO wordpressuser@localhost IDENTIFIED BY 'password';
</code></pre>
<h3>Wordpress Yapılandırma Ayarları</h3>
<p>WordPress’in <code>wp-config-sample.php</code> dosyasının <code>wp-config.php</code> adında kopyasını yaratıp içinde ayarlamamız gereken satırları düzenleyelim.</p>
<pre><code>cp ~/wordpress/wp-config-sample.php ~/wordpress/wp-config.php
sudo EDITOR ~/wordpress/wp-config.php
</code></pre>
<p>Aşağıdaki satırlarda veritabanı ismini, kullanıcı adı ve şifresini bulup yukarıda belirlediklerinizle değiştirin:</p>
<pre><code>// ** MySQL settings - You can get this info from your web host ** //
/** The name of the database for WordPress */
define('DB_NAME', 'wordpress');
/** MySQL database username */
define('DB_USER', 'wordpressuser');
/** MySQL database password */
define('DB_PASSWORD', 'password');
</code></pre>
<p>Kaydedip kapatın.</p>
<h3>Web Klasörüne Kopyalamak</h3>
<p>WordPress dosyalarını yeni klasöre kopyalayalım.</p>
<pre><code>sudo cp -r ~/wordpress/* /var/www/html/
</code></pre>
<h3>Nginx Sunucu Yapılandırma</h3>
<p>WordPress için bir sanal sunucu yaratalım. Bunun için varsayılan nginx ayar dosyasını kopyalayacağız.</p>
<pre><code>sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/wordpress
</code></pre>
<p>WordPress ayar dosyasını açalım:</p>
<pre><code>sudo EDITOR /etc/nginx/sites-available/wordpress
</code></pre>
<p>Dosya içerisini aşağıdaki dosyayı yapıştıralım:</p>
<pre><code>server {
listen 80;
root /var/www/html/;
index index.php index.html;
server_name example.com www.example.com;
location / {
try_files $uri $uri/ /index.php?q=$request_uri;
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/www;
}
location ~ .php$ {
try_files $uri = 404;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
</code></pre>
<p>veya aşağıdaki satırdan indirebilirsiniz:</p>
<pre><code> wget https://gdemir.github.io/file/nginx-wordpress
</code></pre>
<p>Ayarlar mevcut(<code>available</code>) olmasına rağmen henüz sitemiz nginx sunucusunda aktif(<code>enabled</code>) olarak gözükmüyor. Bunun için aşağıdaki kodu çalıştıralım:</p>
<pre><code> sudo ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/wordpress
</code></pre>
<p>Ayrıca varsayılan bloğu silmek için:</p>
<pre><code>sudo rm /etc/nginx/sites-enabled/default
</code></pre>
<p><code>php7.0-mysql</code> paketini yükleyelim.</p>
<pre><code> sudo apt-get install php7.0-mysql
</code></pre>
<p>Son olarak servisleri tekrar başlatalım:</p>
<pre><code> sudo service nginx restart
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><a href="https://huse.in/123/wordpress-kurulumu">https://huse.in/123/wordpress-kurulumu</a></li>
</ul>
Apache .htaccess Dosyasını Çalıştırma-1605222016-05-22T00:00:00+00:00/categories/apache/setting-up-htaccess<p><code>apache</code> yapılandırma dosyasını açıyoruz:</p>
<pre><code>sudo $EDITOR /etc/apache2/apache2.conf
</code></pre>
<p>aşağıdaki satırının başında yorum satırı (<code>#</code>) var ise yorum satırı işaretini siliyoruz:</p>
<pre><code>AccessFileName .htaccess
</code></pre>
<p>aşağıdaki satırı bulup <code>AllowOverride None</code> kısmını <code>AllowOverride All</code> yapıyoruz:</p>
<pre><code><Directory /var/www>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>
</code></pre>
<p><code>.htaccess</code> dosyamızı oluşturuyoruz ve gerekli erişim izinlerini veriyoruz:</p>
<pre><code>sudo touch /var/www/html/.htaccess
sudo chmod 644 /var/www/html/.htaccess
</code></pre>
Apache .htaccess Dosyasında mod_rewrite Modülünü Aktif Yapma-1605222016-05-22T00:00:00+00:00/categories/apache/activate-mod_rewrite-htaccess<p><code>mod_rewrite</code> modülünü aktif yapıyoruz:</p>
<pre><code>sudo a2enmod rewrite
</code></pre>
<p><code>apache</code> servisini tekrar başlatıyoruz:</p>
<pre><code>sudo service apache2 restart
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><p><a href="http://stackoverflow.com/questions/24743674/htaccess-file-not-working-on-ubuntu-14-04-with-apache2">http://stackoverflow.com/questions/24743674/htaccess-file-not-working-on-ubuntu-14-04-with-apache2</a></p></li>
<li><p><a href="https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite-for-apache-on-ubuntu-14-04">https://www.digitalocean.com/community/tutorials/how-to-set-up-mod_rewrite-for-apache-on-ubuntu-14-04</a></p></li>
</ul>
phpMyAdmin Kurulumu-1605212016-05-21T00:00:00+00:00/categories/php/phpmyadmin<h3>phpMyAdmin Kurulumu</h3>
<p>Paketi kuruyoruz:</p>
<pre><code>sudo apt-get install phpmyadmin
</code></pre>
<p>Kurulum sırasında kullanılacak web sunucuları soracaktır (Ör.: <code>apache2</code>, <code>lighttpd</code>), burada nginx üzerinde çalışıyorsanız rastgele birini seçebilirsiniz. Daha sonra phpMyAdmin'in veritabanı üzerinde yapılandırma yapıp yapmayacağı sorulacak buna hayır diyerek kurulumu sonlandırıyoruz, kurulum bitmiş oluyor.</p>
<p>Kurulu olan phpMyAdmin ile websitenin servis edildiği kök dizin arasında (<code>/var/www/html</code>) sembolik bir bağlantı oluşturuyoruz ki <code>http://localhost/phpmyadmin</code> şeklinde linke ulaşabilelim:</p>
<pre><code>sudo ln -s /usr/share/phpmyadmin/ /var/www/html/
</code></pre>
<p>Var olan web sunucumuz olan Apache/Nginx/Lighttpd'i tekrar başlatıyoruz:</p>
<pre><code>sudo service [apache2|nginx|lighttpd] restart
</code></pre>
Bootstrap Responsive Tasarım-1601202016-01-20T00:00:00+00:00/categories/bootstrap/bootstrap-responsive-design<p>Bootstrap <code>navbar</code> gibi css bileşenleriyle; tarayıcı, tablet, mobil gibi cihazların ekran çözünürlüğüne duyarlı(ekran çözünürlüğüne göre yeniden şekillenen) görünüm sunmaktadır. Bunu sitenize sadece <code>bootstrap-css</code>, <code>bootstrap-js</code> dosyalarını ekleyerek ve <code>navbar</code> gibi bileşenleri kullanarak duyarlı hale getiremezsiniz. Bunun için ek olarak aşağıdaki <code>meta</code> etiketini <code>head</code> etiketleri arasına eklemeniz gerekiyor.</p>
<pre><code><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
</code></pre>
<p>Bu <code>meta</code> etiketini açıklayacak olursak,</p>
<p><code>width=device-width</code>: Cihazın ekran genişliğini elde ediyoruz.</p>
<p><code>initial-scale</code>: Sayfa açıldığında ne kadar zoom yapılacağını belirliyoruz. Mesela 1 diyerek gerçek boyut elde ediliyor.</p>
<p><code>maximum-scale</code>: Kullanıcın sayfayı ne kadar zoom yapabileceğini ayarlıyor.</p>
<p><code>user-scalable=no</code>: Kullanıcının sayfada zoom yapmasını engelliyorsunuz.</p>
<p>Not: Bu sitedeki header ve footer'da birer <code>navbar</code>dır ve responsive çalışmaktadır :-)</p>
<h3>Kaynak</h3>
<ul>
<li><p><a href="http://getbootstrap.com/css/#overview-mobile">http://getbootstrap.com/css/#overview-mobile</a></p></li>
<li><p><a href="http://getbootstrap.com/components/#navbar">http://getbootstrap.com/components/#navbar</a></p></li>
<li><p><a href="http://mhmtyylc.com/responsive-tasarim-nedir">http://mhmtyylc.com/responsive-tasarim-nedir</a></p></li>
</ul>
Php Call To Undefined Function Imagecreatefromjpeg Hatası-1505122015-05-12T00:00:00+00:00/categories/php/php-call-to-undefined-function-imagecreatefromjpeg-error<p>Php projemde <code>Imagecreatefromjpeg()</code> fonksiyonunu kullanırken bu hatayı alıyordum çözümü için aşağıdaki paketi kurmak yeterlidir.</p>
<pre><code>sudo apt-get install php5-gd
</code></pre>
<h4>Kaynak</h4>
<p><a href="http://stackoverflow.com/questions/13338339/imagecreatefromjpeg-and-similar-functions-are-not-working-in-php">imagecreatefromjpeg and similar functions are not working in PHP</a></p>
Nginx '413 Reuqest Entity Too Large' Hatası-1505122015-05-12T00:00:00+00:00/categories/nginx/nginx-413-request-entity-too-large-error<p>Resim yüklerken çok yüksek <code>MB</code>lı resimlerde bu hatayı alıyordum. Sorunun çözümü için <code>/etc/nginx/sites-available/default</code> dosyasının içine aşağıdaki satırı yazmak yeterli olacaktır.</p>
<pre><code>client_max_body_size 100m;
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><a href="http://makaleci.com/nginx-upload-limiti-sorununa-cozum-413-request-entity-too-large.html">413 Reuqest Entity Too Large</a></li>
</ul>
Fontawesome Nav Up Down-1505122015-05-12T00:00:00+00:00/categories/fontawesome/fontawesome-nav-up-down<h4>Html & Script</h4>
<pre><code><!-- nav-up-down -->
<div style="padding:20px; position:fixed; bottom:10px; right:30px;" class="fa fa-caret-square-o-up fa-2x" id="nav_up">
</div>
<div style="padding:20px; position:fixed; bottom:10px; right:70px;" class="fa fa-caret-square-o-down fa-2x" id="nav_down">
</div>
<script src="/assets/js/scroll-startstop.events.jquery.js" type="text/javascript"></script>
<script>
$(function() {
var $elem = $('body');
$('#nav_up').fadeIn('slow');
$('#nav_down').fadeIn('slow');
$(window).bind('scrollstart', function() {
$('#nav_up, #nav_down').stop().animate({'opacity' : '0.2'});
});
$(window).bind('scrollstop', function() {
$('#nav_up, #nav_down').stop().animate({'opacity' : '1'});
});
$('#nav_down').click(function (e) {
$('html, body').animate({scrollTop: $elem.height()}, 800);
});
$('#nav_up').click( function (e) {
$('html, body').animate({scrollTop: '0px'}, 800);
});
});
</script>
<!-- nav-up-down -->
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><p><a href="http://fontawesome.io/">fontawesome.io</a></p></li>
<li><p><a href="/assets/js/scroll-startstop.events.jquery.js">scroll-startstop.events.jquery.js</a></p></li>
</ul>
Bootstrap Hover Dropdown-1505112015-05-11T00:00:00+00:00/categories/bootstrap/bootstrap-hover-dropdown<h4>Html</h4>
<pre><code><li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-expanded="false">
Gökhan Demir
<span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li><a href="#">Hesap</a></li>
<li class="divider"></li>
<li><a href="#">Çıkış</a></li>
</ul>
</li>
</code></pre>
<h4>Script</h4>
<pre><code> <!-- dropdown hover -->
<script src="../assets/js/bootstrap-hover-dropdown.min.js"></script>
<script type="text/javascript">
$('.dropdown-toggle').dropdownHover();
</script>
<!-- dropdown hover end -->
</code></pre>
<h4>Kaynak</h4>
<ul>
<li><p><a href="https://cameronspear.com/demos/bootstrap-hover-dropdown/">Bootstrap Hover Dropdown</a></p></li>
<li><p><a href="https://raw.githubusercontent.com/CWSpear/bootstrap-hover-dropdown/master/bootstrap-hover-dropdown.min.js">bootstrap-hover-dropdown.min.js</a></p></li>
</ul>
Sublime Text-1504282015-04-28T00:00:00+00:00/categories/linux/sublime-text<p>Sublime Text, içinde python uygulama programlama arayüzü barındıran, çapraz platform bir kaynak kod düzenleme ve metin editörüdür. Arayüzü Vimden ilham alınarak tasarlanmıştır.</p>
<p>özellikleri şunlar:</p>
<p><code>CTRL</code> + <code>D</code>: Seçilen değişkenin aynısını her tuş tekrarında (<code>CTRL</code> + <code>D</code>) adım adım seçer ve tümünün ismini değiştir</p>
<p><code>ALT</code> + <code>F3</code>: Seçilen değişkenin hepsini seçer ve tümünün ismini değiştir</p>
<p><code>CTRL</code> + <code>SHIFT</code> + <code>L</code>: Seçilen değişkenlerin hepsine aynı işlemi uygulamanızı sağlar</p>
<p><code>CTRL</code> + <code>SHIFT</code> + <code>P</code>: Kodunuzu hangi dilde renklendirmek istediğinizi seçmenizi sağlar (ör. c, ruby vb.)</p>
<p><code>CTRL</code> + <code>P</code>: Proje dizininizde bulunan tüm dosyaları isimlerine göre seçmenizi sağlar. Arama kısmına <code>@</code> karakteri koyarsanız tüm dosyalarda fonksiyon isimlerine göre seçmenizi sağlar</p>
GitHub Push Hatası-1504232015-04-23T00:00:00+00:00/categories/github/git-push-error<h4>Git Push Hatası</h4>
<p><code>GitHub</code>a cv-creator dizinime push ederken bir kesinti oldu ve bilgisayar kapandı. Tekrardan açtığımda yarıda kalan <code>git push</code> komutunun çalışmadığını gördüm</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ git push
error: object file .git/objects/3a/648d4feca2e03cdcfdbe70f150fd4dab1b8697 is empty
fatal: loose object 3a648d4feca2e03cdcfdbe70f150fd4dab1b8697 (stored in .git/objects/3a/648d4feca2e03cdcfdbe70f150fd4dab1b8697) is corrupt
</code></pre>
<h4>Git Commit Id'isinin Bulunması ve Commit Id'sine Geçiş Yapılması</h4>
<p>ne olur, ne olmaz <code>.git</code> dizinimizi kopyalayalım</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ cp -a .git/ .git-old
</code></pre>
<p>hata veren <code>commit id</code>sini bulalım</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ tail -n 2 .git/logs/refs/heads/master
0000000000000000000000000000000000000000 0346e42c8b49cb07d31dbbd8b2322b995fb02baf gdemir <gdemir3327@gmail.com> 1429775482 +0300 clone: from git@github.com:gdemir/cv-creator.git
</code></pre>
<p><code>git push</code> hatası aldığımız <code>commit id</code>si <code>0346e42c8b49cb07d31dbbd8b2322b995fb02baf</code> olan dosya değişimlerini görüntüleyelim</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ git show 0346e42c8b49cb07d31dbbd8b2322b995fb02baf
commit 0346e42c8b49cb07d31dbbd8b2322b995fb02baf
Author: gdemir <gdemir@hummer.(none)>
Date: Mon Mar 16 09:39:07 2015 +0200
update:email
diff --git a/_config.yml b/_config.yml
index 7a12c39..85cfb48 100644
--- a/_config.yml
+++ b/_config.yml
@@ -12,7 +12,7 @@ personal:
account: gdemir
domain: gdemir.github.io
site: https://gdemir.github.io
- email: mail@gdemir.me
+ email: gdemir3327@gmail.com
photo: default.png
phone: +90(541) 3936946
birthday: 12.01.1990
diff --git a/cv/cv.erb.pdf b/cv/cv.erb.pdf
index de6774f..e9b5658 100644
Binary files a/cv/cv.erb.pdf and b/cv/cv.erb.pdf differ
</code></pre>
<p><code>HEAD</code> noktasından <code>commit id</code>imize geçiş yapalım</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ git update-ref HEAD 0346e42c8b49cb07d31dbbd8b2322b995fb02baf
</code></pre>
<h4>Reponun Resetlenmesi ve Hata Kontrolü Yapılması</h4>
<p><code>.git</code> dizinimizin <code>index</code> dosyasını silelim</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ rm .git/index
</code></pre>
<p>resetleme işlemini yapıyoruz</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ git reset
Unstaged changes after reset:
M README.md
M _config.yml
M cv/cv.erb.pdf
</code></pre>
<p><code>git fsck</code> ile kontrol ediyoruz sıkıntı var mı?</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ git fsck --full
Checking object directories: 100% (256/256), done.
Checking objects: 100% (195/195), done.
</code></pre>
<h4>Yarıda Kalan Git Push işleminin Bitirilmesi</h4>
<p>sıkıntımız olmadığına göre <code>.git-old</code> dizinimizi siliyoruz</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ sudo rm -rf .git-old
</code></pre>
<p>şimdi gönderemediğimiz değişikliklerimizi tekrardan görüyor mu bakalım</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: README.md
modified: _config.yml
modified: cv/cv.erb.pdf
no changes added to commit (use "git add" and/or "git commit -a")
</code></pre>
<p><code>git commit</code> ile yarıda kalan işlemimize yorum yazıyoruz</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ git commit -am '.'
[master 09a7b83] .
3 files changed, 22 insertions(+), 4 deletions(-)
</code></pre>
<p><code>git push</code> ile ana depoya gönderiyoruz</p>
<pre><code>gdemir@hummer:~/workspace/cv-creator$ git push
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 68.58 KiB | 0 bytes/s, done.
Total 6 (delta 3), reused 0 (delta 0)
To git@github.com:gdemir/cv-creator.git
0346e42..09a7b83 master -> master
</code></pre>
<h3>Kaynak</h3>
<ul>
<li><a href="http://stackoverflow.com/questions/11706215/how-to-fix-git-error-object-file-is-empty?answertab=votes#tab-top">how to fix GIT error: object file is empty?</a></li>
</ul>
Sublime Text Üzerinde Python Kodu Çalıştırma-1504112015-04-11T00:00:00+00:00/categories/linux/sublime-text-run-python-code<h4>“Control.sublime-package” Dosyasının Oluşturulması</h4>
<p>Sublime'da <code>Preferences(Tercihler) > Browse Packages(Paketleri Araştır)</code> kısmına tıklayın. Bulunduğunuz klasörden <code>Back Button(Geri Tuş)</code> basın. <code>Installed Packages/</code> dizinin içine <a href="https://sublime.wbond.net/installation#st2">Install Package Control</a> sitesinden Sublime Text3 metnini kopyalayıp <code>Control.sublime-package</code> dosyası adında kaydedin. Sublime'i tekrardan başlatın.</p>
<h4>Kullanıcı Ayarlarının Default Olarak Ayarlanması</h4>
<p><code>Preferences > Settings - Default</code> kısmındaki dosyanın içeriğinin tümünü kopyalayın ve <code>Preferences > Settings - User</code> kısmındaki dosyanın içine yapıştırın. (Önceden bir ayar varsa hepsini silin). Sublime'i tekrardan başlatın.</p>
<h4>Çalıştırma</h4>
<p>Çalıştırmak için <code>CTRL + B</code> tuşuna basmanız yeterlidir. Kod çıktısını görmek için <code>View > Show Console</code> kısmına tıklayarak takip edebilirsiniz.</p>
<h4>Kaynak</h4>
<p><a href="http://stackoverflow.com/questions/19732006/how-to-run-python-code-on-sublimerepl">How to Run Python Code on SublimeREPL</a></p>
Sublime Text Kurulumu-1504112015-04-11T00:00:00+00:00/categories/linux/sublime-text-install<p>Konsol üzerinden <a href="http://www.sublimetext.com/">Sublime Text</a> editörünü kurmak için aşağıdaki komutlar yeterlidir.</p>
<pre><code>sudo add-apt-repository ppa:webupd8team/sublime-text-2
sudo apt-get update
sudo apt-get install sublime-text
</code></pre>
<h4>Kaynak</h4>
<p><a href="http://ubuntuforums.org/showthread.php?t=2216832">Install Sublime via terminal with python</a></p>
Windowstan Linux Sanal Makineye Dosya Paylaşımı-1503282015-03-28T00:00:00+00:00/categories/network/share-file-host-windows-to-virtualbox-linux<h4>VirtualBox'a Paylaşılacak Dosyayı Ekleme</h4>
<p><code>Devices > Shared Folder Settings (Aygıtlar > Paylaşılan Klasör Ayarları)</code> kısmına tıklıyoruz</p>
<p><img src="/file/virtualbox-share-file-option.png" alt="share-file-option" /></p>
<p>Paylaşılacak yeni dosya ekliyoruz</p>
<p><img src="/file/network/share-file-add.png" alt="share-file-add" /></p>
<p>Paylaşılacak dosyanın ayarlarını <code>otomatik bağla</code> ve <code>kalıcı yap</code> diyoruz</p>
<p><img src="/file/virtualbox-share-file-add-option.png" alt="share-file-add-option" /></p>
<h4>VirtualBox'a Misafir Eklentilerinin Kurulması</h4>
<p>VirtualBox'ta Linux sanal makineler için eklentilerin kurulması gerekiyor.</p>
<p>Ubuntu için</p>
<pre><code>sudo apt-get install build-essential linux-headers-generic
</code></pre>
<p>Debian için</p>
<pre><code>sudo apt-get install build-essential linux-headers-{amd64 OR 686-pae OR 486}
</code></pre>
<p><code>Devices > Install Guest Additions</code> (<code>Aygıtlar > Misafir Eklentileri CD kalıbını ekle</code>) kısmına tıklayarak CD kalıbımızı ekliyoruz.</p>
<p><img src="/file/virtualbox-install-guest-additions.png" alt="install-guest-additions" /></p>
<p>Eğer yukarıdaki adımda aşağıdaki gibi <code>could not mount the media/drive '/usr/share/virtualbox/vboxguestadditions.iso'</code> hatası alıyorsanız, Manuel olarak komutlarla kurmak için şu sayfayı okuyun: <a href="/category/network/setup-manual-vboxguestadditions/">setup-manual-vboxguestadditions/</a></p>
<p><img src="/file/virtualbox-install-guest-additions-error.png" alt="install-guest-additions-error" /></p>
<p>Eklediğimiz <code>VBoxGuestAdditions.iso</code> dosyası sorunsuz yüklendiğini kontrol etmek için
<code>CD/DVD Devices > VBoxGuestAddtions.iso</code> (<code>CD/DVD Aygıtlar > VBoxGuestAddtions.iso</code>) kısmına bakıyoruz.</p>
<p><img src="/file/virtualbox-install-guest-additions-check.png" alt="install-guest-additions-check" /></p>
<p>Aynı şekilde eklenen eklentiler <code>/media/cdrom</code> dizini altında gözükecektir.</p>
<h4>Paylaşılan Dosyanın/Dizinin VirtualBox'a Alınması</h4>
<p>Paylaşılan dizinini/dosyanın aynı adında bir dizin oluşturup Virtual Machine (Sanal Makina)da dahil ediyoruz</p>
<pre><code>sudo mkdir /media/SHARE_FILE
sudo mount -t vboxsf SHARE_FILE /media/SHARE_FILE
</code></pre>
<p>Hepsi bu kadar, umarım yardımı olur.</p>
<h3>Kaynaklar</h3>
<ul>
<li><a href="https://forums.virtualbox.org/viewtopic.php?t=15679">Linux Guest Additions Kurulumu</a></li>
</ul>
<div class="embed-responsive embed-responsive-16by9">
<iframe class="embed-responsive-item" src="https://www.youtube.com/embed/BSg-_3OFlrQ"></iframe>
</div>
Manuel VboxGuestAdditions Kurulumu-1503282015-03-28T00:00:00+00:00/categories/network/setup-manual-vboxguestadditions<p>Windows host makinenizdaki <code>VirtualBox</code> dizinin yerini saptayın. (<code>C:\Program Files\Oracle\VirtualBox</code> gibi)</p>
<p><code>VirtualBox</code> dizinizi Önceki windows'tan VirtualBox Machine(Sanal Makina)ya dosya paylaşma girdisindeki gibi paylaşın. Paylaşım işlemini tamamlandıktan sonra <code>VirtualBox</code> dizininiz <code>/media/VirtualBox</code> path'inde var mı kontrol edin. Her şey tamamsa bizim için gerekli olan <code>VBoxGuestAdditions.iso</code> ISO dosyasını <code>/media</code> dizini altına kopyalayalım ve izinlerini ayarlıyalım.</p>
<pre><code>sudo cp -a /media/VirutalBox/VBoxGuestAdditions.iso /media/.
sudo chmod 777 /media/VBoxGuestAdditions.iso
</code></pre>
<p>ISO dosyamız için bir dizin oluşturup sistemimize dahil edelim.</p>
<pre><code>sudo mkdir /media/GuestAdditionsISO
sudo mount -o loop /media/VBoxGuestAdditions.iso /media/GuestAdditionsISO
</code></pre>
<p>çıkarılan ISO doyalarımızdan <code>VBoxLinuxAdditions.run</code> betiğini bulup çalıştıralım.</p>
<pre><code>cd /media/GuestAdditionsISO
sudo ./VBoxLinuxAdditions.run
</code></pre>
<h4>Kaynak</h4>
<p><a href="http://askubuntu.com/questions/321589/unable-to-mount-the-cd-dvd-image-on-the-machine-sandbox?answertab=votes#tab-top">Manuel VBoxGuestAdditions Kurulumu</a></p>
Rss Graffiti ile Blog Yazılarını Facebook'a Yönlendirme-1408202014-08-20T00:00:00+00:00/categories/rss/facebook-rss-graffiti<p>Blog yazılarınızı otomatik olarak facebook sayfanıza göndermek için, bir facebook uygulaması olan RSS Graffiti kullanabilirsiniz. Bu uygulama ile sadece blog yazılarını aktarmak değil, herhangi bir RSS beslemesi içinde kullanabilirsiniz, hatta birden çok blog yazısını bile aktarmak mümkün. RSS Graffiti gelişmiş ayarları var. Otomatik mesajlar yayınlayabilir, rss akış zamanlamasını yapılandırabilirsiniz. Tabi bunlar için bir facebook sayfanızın olması lazım. Rss Graffitiyi facebook sayfanıza eklemek için kişisel facebook hesabınıza giriş yapın ve şu adımları izleyin:</p>
<h4>Yeni Yayın Planı Ekle</h4>
<p><a href="https://apps.facebook.com/rssgraffiti/">https://apps.facebook.com/rssgraffiti/</a> adresine gidin. Rss Graffiti sizden gerekli izinler isteyecektir, bu izinleri verin ve devam edin. Sonunda sizi Rss Graffiti anasayfası karşılayacaktır.</p>
<p><img src="/file/rssgraffiti-new.png" alt="new" /></p>
<p>Bu sayfada <strong>Add New Publishing Plan</strong>‘a tıklayın. Bu pencerede yayınlama planını ismi ortaya çıkıyor, metin kutusuna yayın ismini yazın ve <strong>Create Publishing Plan</strong>'a tıklayın.</p>
<p><img src="/file/rssgraffiti-create.png" alt="create" /></p>
<p>Yayın planı ekledikten sonra, yapılandırma alanı görünür.</p>
<p>![publish]/file/rssgraffiti-publish.png)</p>
<h4>Yeni Kaynak</h4>
<p>Yapılandırma alanında yeni kaynak eklemek için <strong>Sources</strong> kısmında <strong>Add New</strong>‘a tıklayın. Sizden kaynak besleme linki isteyecek. Kaynak kısmına gerekli blogumuzun haber akış linkini <strong>example.com/rss.xml</strong> gibi yazın, <strong>Add Source</strong>'a tıklayın.</p>
<p><img src="/file/rssgraffiti-source.png" alt="source" /></p>
<p>Sizden kaynak yapılandırması isteyecek. Yeni kaynağımızı istediğimiz gibi ismini verip kaç saatta bir kontrol edecek gibi ayarlamaları yapıp <strong>Save</strong>‘a tıklıyoruz.</p>
<p><img src="/file/rssgraffiti-source-option.png" alt="source-option" /></p>
<p>İstediğimiz kaynak kaydedildi bunu görebiliyoruz.</p>
<p><img src="/file/rssgraffiti-source-ok.png" alt="source-ok" /></p>
<h4>Yeni Hedef</h4>
<p>Yapılandırma alanında yeni hedef eklemek için <strong>Target</strong> kısmında <strong>Add New</strong>‘a tıklayın. Sizden hedef sayfa isteyecek. Hedef kısmı için facebook sayfamızı olacağı için facebook seçiyoruz.</p>
<p><img src="/file/rssgraffiti-target.png" alt="target" /></p>
<p>Sizden kaynak yapılandırması isteyecek. Gerekli ayarlamaları yapmak istiyorsanız yapın ya da direkt olarak <strong>Save Changes</strong>‘a tıklayın.</p>
<p><img src="/file/rssgraffiti-target-option.png" alt="target-option" /></p>
<p>İstediğimiz hedef kaydedildi bunu görebiliyoruz.</p>
<p><img src="/file/rssgraffiti-target-ok.png" alt="target-ok" /></p>
<h4>Yayın Planını Aktif Hale Getirme</h4>
<p>İstediğimiz yayını ortadaki <strong>off</strong> yazan linke tıklayıp <strong>on</strong> yaparak aktif hale getiriyoruz.</p>
<p><img src="/file/rssgraffiti-publish-ok.png" alt="publish-ok" /></p>
<p>Artık blogumuza yazdığımız girdi, istediğimiz aralıklarla facebook'ta oluşturduğumuz sayfamıza otomatik düşecektir.</p>
<h4>Ayrıntılı video için</h4>
<div class="embed-responsive embed-responsive-16by9">
<iframe class="embed-responsive-item" src="//www.youtube.com/embed/ComG6n-IiS4?rel=0"></iframe>
</div>
Freebsd'de 'Was Not Properly Dismounted' Hatası-1310222013-10-22T00:00:00+00:00/categories/linux/was-not-properly-dismounted-on-freebsd<p>Freebsd üzerinde geçenlerde şöyle bir hata ile karşılaştım. Hata öncesi</p>
<pre><code> /tmp was not properly dismounted
/usr was not properly dismounted
</code></pre>
<p>tarzı uyarılar veriyordu. Bunun manası harddisk'i okuyamaz hale gelmiş olmasıdır. Sonrasında da;</p>
<pre><code> Enter full pathname of shell or RETRUN for/bin/sh:
</code></pre>
<p>gibi bir satırda takılı kalıyordu. Çözüm yolu ise şu şekilde. Öncelikle; <code>Enter</code> basıp prompt'a düşün. Sizi “<strong>#</strong>” şeklinde bir prompt karşılayacak. Sonrasında;</p>
<pre><code> fsck -y
</code></pre>
<p>yazın ve 5 aşamalı işlem bittikten sonra</p>
<pre><code> ***** FILE SYSTEM MARKED CLEAN *****
***** FILE SYSTEM WAS MODIFIED *****
</code></pre>
<p>yazısı çıkacaktır. Sisteme tekrardan power off-on yaparsanız (ki reset makinalarda çalışan process'leri durdurmuyor, tavsiye etmiyoruz) makinanız eski hale dönecektir.</p>
<p>NOT: Genelde bu problemler makinanın enerjisinin fiş yoluyla çekilmesi veya reset tuşuna basılması ile kaynaklıdır.</p>
Cisco 4900M Yapılandırma-1307302013-07-30T00:00:00+00:00/categories/network/cisco-4900M-conf<p>Gaziantep Emniyet Genel Müdürlüğündeki <strong>cisco 4900M switch</strong>inin yapılandırılması için genç mühendis arkadaşlarımızdan <a href="http://www.linkedin.com/profile/view?id=94845056">Sedat Göksel</a> ve <a href="http://www.linkedin.com/profile/view?id=81321761">Nazır Kura</a> ile gittik.</p>
<p>Switch'in <strong>management console</strong> portuna <strong>rs 232 usb converter</strong> kablosu ile bağlantı sağladık. Cisco switch aletlerin genelde konsol tabanlı yönetim panelleri olduğu için <a href="http://www.putty.org/">putty</a> programı ile yapılandırma yaptık. Temel sorun portlardaki <strong>tengigabitethernet</strong> olması bizde bunu <strong>gigabitethernet</strong> olarak değiştirdik. Gerekli yapılandırma ile ilgili kodlar aşağıdaki gibidir:</p>
<pre><code>// admin yetkisi alıyoruz
4900M>enable
// 2 nolu slotta olan portlarımızın durumlarına bakıyoruz
// burada tengigabitethernet olarak çıkışlarının olduğunu anladık
4900M#show int status mod 2
// 2 nolu slotta bağlı olan portlarımızın gruplarını görüntülüyoruz
4900M#show hw-module module 2 port-group
Module Port-group Active Inactive
-------------------------------------------------------------
2 1 Te2/1-2 Gi2/9-12
2 2 Te2/3-4 Gi2/13-16
2 3 Te2/5-6 Gi2/17-20
2 4 Te2/7-8 Gi2/21-24
// yapılandırma için yapılandırma kısmına geçiyoruz
4900M#configure terminal
// herbir port için gigabitethernet olarak güncelliyoruz
4900M(config)#hw-module module 2 port-group 1 select gigabitethernet
4900M(config)#hw-module module 2 port-group 2 select gigabitethernet
4900M(config)#hw-module module 2 port-group 3 select gigabitethernet
4900M(config)#hw-module module 2 port-group 4 select gigabitethernet
// en son yapılandırma ayarlarımızı kaydediyoruz
4900M#copy running-config startup-config //
</code></pre>
<p>Not : Türkiyenin pek çok şehrinin Emniyet Genel Müdürlüğünde bizim yapılandırma dosyamız kullanılmıştır.</p>
<h3>Kaynak</h3>
<ul>
<li><p><a href="http://www.cisco.com/en/US/docs/switches/lan/catalyst4500/12.2/54sg/configuration/guide/sw_int.pdf">Yapılandırma</a></p></li>
<li><p><a href="http://www.cisco.com/en/US/docs/switches/lan/catalyst4900/4900M/installation/guide/01intro.html">Kurulum</a></p></li>
</ul>
Yerel Ağda Ipleri Görmek-1307062013-07-06T00:00:00+00:00/categories/linux/lan-alive-ip-show<p><code>fping</code> çok windows ile birlikte gelen <code>ping</code> programı gibi, bir konsol programıdır.</p>
<h4>Kurulum</h4>
<pre><code>sudo apt-get install fping
</code></pre>
<p>Yerel ağda olan ip'leri öğrenmek önce kendi ip'mizi öğreniyoruz:</p>
<pre><code>ifconfig
eth0 Link encap:Ethernet HWaddr 00:23:5a:f7:e4:0a
UP BROADCAST MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
Interrupt:45 Base address:0x2000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:3403 errors:0 dropped:0 overruns:0 frame:0
TX packets:3403 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:530191 (530.1 KB) TX bytes:530191 (530.1 KB)
wlan0 Link encap:Ethernet HWaddr 00:1e:65:05:50:68
inet addr:192.168.2.3 Bcast:192.168.2.255 Mask:255.255.255.0
inet6 addr: fe80::21e:65ff:fe05:5068/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:31891 errors:0 dropped:0 overruns:0 frame:0
TX packets:22148 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:22100624 (22.1 MB) TX bytes:3247277 (3.2 MB)
</code></pre>
<p>İp'miz <strong>192.168.2.x</strong> olarak gözüküyor, o halde şu komutla yerel ağdaki ip'leri öğreniyoruz.</p>
<pre><code>fping -g 192.168.2.1/24 2> /dev/null | grep alive
</code></pre>
GitHub Sayfalarını Sadece gh-pages Branch'ında Oluşturma-1306102013-06-10T00:00:00+00:00/categories/github/gh-pages<p>Github sayfasından <a href="https://github.com/new">yeni depo</a> oluşturuyoruz. Sonrasında depo için gerekli ilk işlemlerimizi uyguluyoruz.</p>
<pre><code>touch README.md
git init
git add README.md
git commit -m "first commit"
</code></pre>
<p><code>gh-pages</code> branchını oluşturup <code>gh-pages</code> branch'ına geçiyoruz.</p>
<pre><code>git checkout -b gh-pages
</code></pre>
<p><code>master</code> branchını siliyoruz.</p>
<pre><code>git branch -d master
</code></pre>
<p>Oluşturduğumuz deponun adını(DEPO) ve github kullanıcı adımızı(USER) remote ekliyoruz.</p>
<pre><code>git remote add origin git@github.com:USER/DEPO.git
</code></pre>
<p>Depoyu yolluyoruz.</p>
<pre><code>git push -u origin gh-pages
</code></pre>
Grub 'error: no such partition grub rescue:' Hatası-1210222012-10-22T00:00:00+00:00/categories/linux/grub-hatasi<p>Bu hata genellikle linux işletim sistemlerini tekrar yüklerken ortaya çıkmaktadır. Çözümü kolaydır bunun için bootable CD veya USB ile bilgisayarı başlatın ve aşağıdaki adımları izleyin.</p>
<h4>linux sürücüsünün tespiti</h4>
<p>Öncelikle sürücülerde ne var bakmak gerekiyor.</p>
<pre><code>fdisk -l
</code></pre>
<p>Bu kaynaktan mesela ana diskin <code>/dev/sda</code> ve linux yüklü sürücünün de <code>/dev/sda6</code> olduğunu tespit ettik diyelim.</p>
<h4>linux sürücünün bağlanması</h4>
<p>Tespit ettiğimiz linux sürücüyü bilgisayara bağlıyalım.</p>
<pre><code>mkdir /media/sda6
mount /dev/sda6 /media/sda6
</code></pre>
<h4>grubun tekrar yüklenmesi</h4>
<p>Grubu ana sürücüye tekrar yüklemek için.</p>
<pre><code>grub-install --root-directory=/media/sda6 /dev/sda
</code></pre>
<p>Not: Buradaki <code>/dev/sda6</code> ve <code>/dev/sda</code> değişebilir.</p>
Rails fastercsv ile CSV Çıktı-1201262012-01-26T00:00:00+00:00/categories/rails/rails-fastercsv<p>Rails'de Csv çıktıları için fastercsv gemi</p>
<script src="http://gist.github.com/1681820.js" type="text/javascript"> </script>
<p>örnekler : <a href="http://github.com/JEG2/faster_csv/tree/master/examples">JEG2/fastercsv</a></p>
<h4>Kurulum</h4>
<pre><code> sudo gem install fastercsv
</code></pre>
<h4><code>Gemfile</code> İçine Eklenti</h4>
<pre><code> gem, 'fastercsv'
</code></pre>
<h4>Ek Olarak İlgili Dosya Başına Eklenmesi</h4>
<pre><code> require 'fastercsv'
</code></pre>
Rails prawn ile PDF-1201172012-01-17T00:00:00+00:00/categories/rails/rails-prawn<p>Rails'de Pdf çıktıları için prawn gemi</p>
<p><img src="/file/prawn.png" alt="prawn" /></p>
<p>site : <a href="http://prawn.majesticseacreature.com/">http://prawn.majesticseacreature.com/</a></p>
<p>repo : <a href="http://github.com/sandal/prawn">sandal/prawn</a></p>
<p>örnekler : <a href="http://github.com/sandipransing/prawn-example">sandipransing/prawn-example</a></p>
<h4>Kurulum</h4>
<pre><code> sudo gem install prawn
</code></pre>
<h4><code>Gemfile</code> İçine Eklenti</h4>
<pre><code> gem, 'prawn'
</code></pre>
<h4>Ek Olarak İlgili Dosya Başına Eklenmesi</h4>
<pre><code> require 'prawn'
</code></pre>
Yüklemede Kaldığı Yerden Devam - rsync-1110042011-10-04T00:00:00+00:00/categories/linux/resume-scp-transfer<p>Bazen scp ile büyük boyutlu bir dosyayı upload etmek gerekiyor. Bu işlemin takılı kalması (“stalled”) ihtimali var. Takıldığında al baştan yapmanız gerekiyor. Bu nedenle büyük boyutlu dosyaları rsync ile aşağıdaki gibi upload etmekte yarar var, işlem takılırsa komutu tekrar çalıştırmanız yeterli:</p>
<pre><code>partial --progress --rsh=ssh kullanici@makine:uzak_dosya yerel_dosya
</code></pre>
Gmate Kurulumu-1107052011-07-05T00:00:00+00:00/categories/linux/gmate-install<p>Bu paket <code>gedit</code>i, <code>textmate</code> benzeri hale getirmek için ufak eklentileri içerir.</p>
<p><img src="/file/gmate.png" alt="gmate" /></p>
<p>Konsol üzerinden Gmate editörünü kurmak için aşağıdaki komutlar yeterlidir.</p>
<pre><code>sudo apt-add-repository ppa:ubuntu-on-rails/ppa
sudo apt-get update
sudo apt-get install gedit-gmate
</code></pre>
Ruby on Rails ile MySQL-1106112011-06-11T00:00:00+00:00/categories/rails/mysql-with-rails<p>Normal RoR kurulumundan farklı olarak kurarken</p>
<pre><code>rails new my_app -d mysql
</code></pre>
<p>bu şekilde rails'de default olarak gelen sqlite3 yerine MySQL olarak inmiş oluyor.</p>
<p>Ek olarak <code>mysql</code> gemini kurmak gerekiyor :</p>
<pre><code>sudo gem install mysql2 # mysql2 kuruyoruz
</code></pre>
<p>Varsayılan rails kurulumunu yaptıysanız versiyon <code>0.2.6</code>‘yı kurun:</p>
<pre><code>sudo gem install mysql2 -v 0.2.11
</code></pre>
<h3>MySQL gem'i kurulumunda karşılaşılan hatalar ve çözümleri</h3>
<h4>extconf.rb failed</h4>
<p>Kurulumda clientlerin çalışmamasından dolayı hata alıyorsnuz şu kütüphaneyi yükleyin:</p>
<pre><code>sudo apt-get install libmysqlclient-dev
</code></pre>
<h4>Could not find gem ‘mysql2 (~> 0.2.6, runtime)’ in any of the gem sources listed in your Gemfile. Run <code>bundle install</code> to install missing gems.</h4>
<p>Rails sürümünüz <code>Gemfile</code> da <code>mysql2</code>nin versiyon olarak <code>0.2.6</code>dan yukarı olmasını istiyor şu gemi yükleyin:</p>
<pre><code>sudo gem install mysql2 -v 0.2.6
</code></pre>
Ruby on Rails-1106102011-06-10T00:00:00+00:00/categories/rails/rails<h4>rails yükleme:</h4>
<pre><code> $ sudo gem install rails -v 3.0.5
$ sudo gem install rails -v 3.0.9
</code></pre>
<p>Geçici problemlerden dolayı 3.0.5 daha temiz/hatasız… Bazı paketler 3.0.9 tam
olarak gelmiyor ya da versiyon uyuşmazlıkları var. Bu yüzden 2 versiyonuda kuruyoruz.</p>
<h4>rails uygulaması oluşturma:</h4>
<pre><code> $ rails new my_app
</code></pre>
<h4>gerekli gem paketlerinin kurulması:</h4>
<pre><code> $ bundle install
</code></pre>
<h4>kurulan gemlerin listesini görmek:</h4>
<pre><code> $ gem list
</code></pre>
<h4>veritabanı yapılandırması “database.yml”:</h4>
<pre><code> $ vim config/database.yml
</code></pre>
<p>gerekli eklemeler veya düzenelemer yapın örnek “database.yml”;</p>
<pre><code>development:
adapter: mysql2
encoding: utf8
reconnect: false
database: ror-app-db
pool: 5
username: root
password:
socket: /var/run/mysqld/mysqld.sock
</code></pre>
<h4>veritabanı oluşturma:</h4>
<pre><code> $ rake db:create
</code></pre>
<h4>veritabanına bağlanma:</h4>
<pre><code> $ rails dbconsole
</code></pre>
<h4>veritabanına tablo eklemek için:</h4>
<pre><code> $ rails generate scaffold Post name:string title:string content:text
invoke active_record
create db/migrate/20110630132903_create_posts.rb
create app/models/post.rb
route resources :posts
invoke scaffold_controller
create app/controllers/posts_controller.rb
invoke erb
create app/views/posts
create app/views/posts/index.html.erb
create app/views/posts/edit.html.erb
create app/views/posts/show.html.erb
create app/views/posts/new.html.erb
create app/views/posts/_form.html.erb
invoke stylesheets
create public/stylesheets/scaffold.css
</code></pre>
<p>örnek Post » “posts” isminde tablonun</p>
<pre><code>name: string
title: string
content: text
</code></pre>
<p>elamanları olacak şekilde tanımlanmıştır. Burada /show, /edit, /new
özelliklerini kullanabilmektedir. Bunlarda kısıtlama olması mümkündür.Bu kontrol
yapısı her şey olabildiğinden <strong>admin</strong> ‘e özgü tablo oluşturulmalarında
kullanılabilir.</p>
<h4>tabloları oluşturmayı tetiklemek için:</h4>
<pre><code> $ rake db:migrate
</code></pre>
<h4>tüm tabloları tek çatı altında toplamak için:</h4>
<pre><code> $ rake db:rollback
</code></pre>
<h4>rails'e merhaba demek için:</h4>
<pre><code> $ rails generate controller home index
create app/controllers/home_controller.rb
route get "home/index"
invoke erb
create app/views/home
create app/views/home/index.html.erb
</code></pre>
<h4>rails route(yönlendirme) ayarları(“get”, “post”):</h4>
<pre><code> $ vim config/routes.rb
</code></pre>
<h4>rails denemeleri için web sunucusunu başlatma:</h4>
<pre><code> $ rails server # veya "rails s"
</code></pre>
<h4>rails denemeleri için konsolu panelini başlatma:</h4>
<pre><code> $ rails console # veya "rails c"
</code></pre>
<h4>rails'i sunucuda çalıştırma:</h4>
<p>ruby web server olarak <a href="http://code.macournoyer.com/thin/">thin</a>
kullanılıyor, ve ek olarak nginx ayarları gerekiyor bunun için
şu dökümanı okuyunuz : <a href="http://ecylmz.com/107/nginx-rails-ve-thin/">nginx, rails ve thin</a></p>
MySQL'i Türkçeleştir - utf8-1105272011-05-27T00:00:00+00:00/categories/linux/mysql-utf8<p>Eğer linux kullanıyorsanız, mysql türkçe yapmak için aşağıdaki kodu
/etc/mysql/my.cnf dosyasındaki <strong>mysqld</strong> kısmının altına ekleyin :</p>
<pre><code> [mysqld]
# ----------------------------------------------------------------------
# UTF-8 temiz bir mysql için ilgili yapılandırma
# ----------------------------------------------------------------------
init_connect=’SET collation_connection = utf8_general_ci’
init_connect=’SET NAMES utf8′
default-character-set=utf8
character-set-server=utf8
collation-server=utf8_general_ci
skip-character-set-client-handshake
# ----------------------------------------------------------------------
</code></pre>
<p>daha sonra mysql'i tekrar başlatın :</p>
<pre><code>sudo service mysql stop restart
</code></pre>
<p>bu kadar artık temiz bir türkçe veritabanımız var.</p>
Tekrardan Üretilen ~/.ssh Çalışmama Sorunları-1105242011-05-24T00:00:00+00:00/categories/github/ssh-error<h4>“Read from socket failed: Connection reset by peer” Hatası</h4>
<script src="http://gist.github.com/1021381.js" type="text/javascript"> </script>
<p>gibi bir hata alıyorsanız çözümü için <code>~/.ssh/config</code> dosyası oluşturup içine alttaki kodu ekleyin :</p>
<pre><code>Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,3des-cbc
MACs hmac-md5,hmac-sha1,hmac-ripemd160
</code></pre>
<hr />
<h4>“Agent admitted failure to sign using the key” Hatası</h4>
<pre><code>$ git clone git@github.com:gdemir/x.git
cloning x...
Cloning into x...
The authenticity of host 'github.com (207.97.227.239)' can't be established.
RSA key fingerprint is ********************************.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'github.com,207.97.227.239' (RSA) to the list of known hosts.
Agent admitted failure to sign using the key.
Permission denied (publickey).
fatal: The remote end hung up unexpectedly
</code></pre>
<p>yeniden şifre oluşturmada (Overwrite) bazen bir sorun oluyor ve bir repo clone ederken, push ederken hata veriyor.</p>
<p>Çözümü ise iki şekilde :</p>
<p><em>1</em> - Yeni oluşturduğunuz şifreyi tekrardan girerek <code>id_rsa</code>‘yı güncellemek:</p>
<pre><code>ssh-add
</code></pre>
<p><em>2</em> - İlk çalışan bir betikte (ör.: <code>~/.bashrc</code>)</p>
<pre><code>export SSH_AUTH_SOCK=0
</code></pre>
<p>kodunun eklenmesi. Bu eklenti ile çalışıyor ancak, her clone'da şifre istiyor ve gnome arayüz sorgulama ekranı yerine konsol sorgulaması getiriyor. Daha temiz çözümü ise şöyle : ilk çalışan bir betikte (ör.: <code>~/.bashrc</code>)</p>
<pre><code>alias ssh-agent-init='bash -c '\''eval "`ssh-agent -s`"; ln
-sf $SSH_AUTH_SOCK $HOME/.ssh/.authsock; echo "Agent authsock
$SSH_AUTH_SOCK"; ssh-add /path/to/mykeys/id_[rd]sa'\'
</code></pre>
<p>kodunun eklenmesidir. <code>ssh-keygen</code>de girdiğimiz şifreyi tekrardan giriyoruz. Bundan başka bir problem var ise bu da <code>~/.ssh</code> dizin izleriyle alakalı olabilir. Tüm uğraşlarınıza rağmen hala düzelmediyse github sayfasındaki kurulumları takip edin <a href="http://help.github.com/linux-set-up-git/">linux-set-up-git</a></p>
C# Kodunu Geany'de Çalıştırmak-1105082011-05-08T00:00:00+00:00/categories/linux/csharp-geany<p>Geanyde .cs uzantılı bir dosya açıyoruz ve geany'nin üstteki seçeneklerden <code>İnşa Et > Dahili Seçenekleri ve Argümanları Ayarla</code> kısmına giriyoruz. Resimdeki gibi</p>
<p><img src="/file/csharp-in-geany.png" alt="csharp-in-geany" /></p>
<p>Derle kısmına :</p>
<pre><code> gmcs -nowarn:0219 /t:winexe "%f" /r:System,System.Drawing
</code></pre>
<p>Çalıştır kısmına :</p>
<pre><code> gmcs -nowarn:0219 /t:winexe "%f" /r:System,System.Drawing ; mono "%e.exe"
</code></pre>
<p>yazıyoruz, sonra tamam deyip kaydediyoruz, bu kadar. Not : csharp kurmak için :</p>
<pre><code> sudo apt-get install monodevelop
</code></pre>
<p>Derlemek için :</p>
<pre><code> mono-csc t.cs
</code></pre>
<p>Çalıştırmak için :</p>
<pre><code> ./t.exe
</code></pre>
DNS Değiştirmek - resolv.conf-1104232011-04-23T00:00:00+00:00/categories/linux/dns-degistir<p>Bilgisayarınızdaki dns ayarını değiştirmek istiyorsanız şu adımları izleyin <code>/etc/resolv.conf</code> dosyasını açın ve içindeki <strong>nameserver</strong>‘ın karşısındaki yazan kısımları istediğiniz dns ip'leri değiştirin.</p>
<p>Dosyamızın içeriğine bakıyoruz.</p>
<pre><code> cat /etc/resolv.conf
# Generated by NetworkManager
nameserver 156.154.70.22
nameserver 156.154.71.22
</code></pre>
<p>Dosyamıza giriyoruz.</p>
<pre><code> $EDITOR /etc/resolv.conf
</code></pre>
<p>sonra kaydetip çıkın bu kadar. Eğer bir dosya'ya yazmada bir sorunla karşılaşıyorsanız, dosya özelliklerinden ya da erişim haklarından kaynaklanıyordur şu adımları uygulayın. Öncelikle dosya özelliklerine bakın.</p>
<pre><code>lsattr /etc/resolv.conf
----ia------------- /etc/resolv.conf
</code></pre>
<p>buradaki i, dosyanın hiç bir şekilde değişmeyeceğini ifade ediyor. Buradaki a, ise; dosyanın sadece eklenebilir olduğunu ifade ediyor. Dosyaya yazmak için bu özellikleri kaldırıyoruz.</p>
<pre><code>sudo chattr -ia /etc/resolv.conf
</code></pre>
<p>ve dns'lerimizi değişitiriyoruz. Ancak yine bir problem var ise bu da erişim haklarından kaynaklanır bunun için de</p>
<pre><code>sudo chmod 777 /etc/resolv.conf
</code></pre>
<p>diyerek tüm yazma okuma haklarını herkese veriyoruz. Artık sorunsuz dns'lerimizi girip dosyayı kaydettikten sonra</p>
<pre><code>sudo chmod 444 /etc/resolv.conf
sudo chattr +ia /etc/resolv.conf
</code></pre>
<p>diyerek dosyamızı kilitliyoruz, artık dns'imiz değişti ve dosyamızı güven altına almış oluyoruz.</p>
Virtualbox'a Ip Atama-1101212011-01-21T00:00:00+00:00/categories/network/vb-ip-atama<p>Bilgisayarınızdaki bir sanal makinayı, ana makina ile ağ kurmasını sağlamak istiyorsanız şu adımları izleyin :</p>
<ul>
<li>Hangi sanal makina'da bu ayarı uygulayacaksanız, o <strong>sanal makineyi</strong> seçiyoruz :</li>
</ul>
<p><img src="/file/vb.png" alt="virtualboxs" /></p>
<ul>
<li>Virtualbox'ın üstteki menüsünden <strong>ayarlar</strong> kısmını seçiyoruz :</li>
</ul>
<p><img src="/file/vb-menu.png" alt="menu" /></p>
<ul>
<li>Ayarlarda çıkan menüden, <strong>ağ</strong> bölümünü seçiyoruz :</li>
</ul>
<p><img src="/file/vb-ag.png" alt="ag" /></p>
<ul>
<li>Bağdastırıcı-1 de sanal bağdaştırıcının ana bilgisayara bağlanma tipini <strong>bridged adapter</strong> olarak seçiyoruz : (ana makina gibi 192.168.x.x gibi bir ip alsın diye) ve internete çıkarmak için ana bilgisayar net'e nasıl bağlı ise o bağlanma ismini seçin : (ör. eth0, wlan0, usb0)</li>
</ul>
<p><img src="/file/vb-bagdas1.png" alt="bagdas-1" /></p>
<p>Ayrıca ek bilgi olarak, bilgisayarınıza veya sanal makinanıza seçtiginiz bir ip'yi atamak istiyorsanız.</p>
<p>Kablolu için:</p>
<pre><code>sudo ifconfig eth0 192.168.1.19
</code></pre>
<p>Kablosuz için:</p>
<pre><code>sudo ifconfig wlan0 192.168.1.19
</code></pre>
<p>şeklinde atayabiliyorsunuz.</p>
Vim Split-1012252010-12-25T00:00:00+00:00/categories/linux/vim-split<p>Vim editöründe çalışırken, aynı anda 2 sayfaya ihtiyacımız varsa <code>sp</code> komutu çok işe yarıyor. Yeni bir dosya açmak ya da var olan bir dosyayı açmak için :</p>
<pre><code>:sp filename
</code></pre>
<p>izlemek için <a href="/file/vim-sp.gif">tıklayınız</a></p>
<p>açılan iki pencere arasında git gel yapmak için birkez <code>CTRL</code> + <code>W</code> basıp gitmek istediğmiz dosyanın yönüne basıyoruz. (yön tuşları) (Ör. dosya altta ise; <code>CTRL</code> + <code>W</code> bas, sonra aşağı yön tuşuna bas.)</p>
<p>izlemek için <a href="/file/vim-sp-ctrl-w.gif">tıklayınız</a></p>
GitHub Badge-1012092010-12-09T00:00:00+00:00/categories/github/github-badge<p>GitHubdaki projelerinizin, gistlerinizin, grup üyelerinizin, grup görevlerinizin ufak görüntüsünü sayfanıza eklemek için öncelikle gerekli github-badge türlerinden<br/>
birini <a href="https://github.com/gdemir/github-badge">http://github.com/gdemir/github-badge</a> sayfasından seçip, sitenize eklemeniz yeterli ör. gdemir adlı kişinin repolarını görmek için aşağıdaki js kodu :</p>
<p> <div id="github-badge"></div>
<script type="text/javascript" charset="utf-8">
GITHUB_USERNAME = “gdemir”;
GITHUB_LIST_LENGTH = 10;
GITHUB_TITLE = “Projelerim”
GITHUB_SHOW_ALL = “Hepsini Göster”
</script>
<script src="https://gdemir.github.io/github-badge/github-badge-repo.js" type="text/javascript">
</script></p>
<p>şeklinde html içine aşağıdaki gibi eklemeniz yeterlidir :</p>
<p> <html>
<body>
<div id="github-badge"></div>
<script type="text/javascript" charset="utf-8">
GITHUB_USERNAME = “gdemir”;
GITHUB_LIST_LENGTH = 10;
GITHUB_TITLE = “Projelerim”
GITHUB_SHOW_ALL = “Hepsini Göster”
</script>
<script src="https://gdemir.github.io/github-badge/github-badge-repo.js" type="text/javascript">
</script>
</body>
</html></p>
<p>github-badge'nin yerini değiştirmek için css ile oynanabilir, benim sitem'deki css ayarlarım (“<code>local.css</code>"de) şöyle: (ör. repo için)</p>
<p> #github-badge {
width: 450px !important;
float: left !important;
clear: right !important;
margin-top: 4em !important;
margin-left: 25em !important;
margin-right: 1em !important;
}</p>
<p>çalışan kod ise şöyledir :</p>
<div id="github-badge"></div>
<script type="text/javascript" charset="utf-8">
GITHUB_USERNAME = "gdemir";
GITHUB_LIST_LENGTH = 10;
GITHUB_TITLE = "Projelerim";
GITHUB_SHOW_ALL = "Hepsini Göster";
</script>
<p><script src="https://gdemir.github.io/github-badge/github-badge-repo.js" type="text/javascript"></p>
diff ve patch-1011122010-11-12T00:00:00+00:00/categories/linux/diff-patch<p>Diff iki dosya arasındaki farkı, verdiğiniz seçeneğer göre gösteren bir programdır.</p>
<h4>Diff Kullanım</h4>
<pre><code>diff [seçenekler] orjinal_dosya/orjinal_dizin güncellenmiş_dosya/güncellenmiş_dizin
</code></pre>
<p>Patch diff'den aldıgı bir yama dosyasını, orginal dosyası ile birleştiren programdır.</p>
<h4>Patch Kullanım</h4>
<pre><code>patch [seçenekler] [patch_dosyası]
</code></pre>
<p>Şimdi bir yama ile orjinal dosyamızı yamalıyalım. Örneğin surum1.c ve surum2.c adında 2 dosyamız olsun. surum1.c dosyasında aşagıdaki kod var :</p>
<h1>include <stdio.h></h1>
<h1>define MAXLINE 128</h1>
<p>int main() {
char s[MAXLINE];
int c, i;</p>
<pre><code>for (i = 0; i < MAXLINE; s[i] = 0, i++)
; /*void*/
s[i] = '\0';
for (i = 0; i < MAXLINE; i++)
if (s[i] != 0) printf(" %c\t=>\t%d\n", i, s[i]);
return 0;
</code></pre>
<p>}</p>
<p>surum2.c dosyasında aşagıdaki kod var :</p>
<h1>include <stdio.h></h1>
<h1>define MAXLINE 128</h1>
<p>int main() {
char s[MAXLINE];
int c, i;</p>
<pre><code>for (i = 0; i < MAXLINE; s[i] = 0, i++)
; /*void*/
s[i] = '\0';
for (; (c = getchar()) != EOF; s[c] += 1)
;/*void*/
for (i = 0; i < MAXLINE; i++)
if (s[i] != 0) printf(" %c\t=>\t%d\n", i, s[i]);
return 0;
</code></pre>
<p>}</p>
<p>dosyalar birbirinden farklı mı diye bakıyoruz :</p>
<pre><code>diff -q surum1.c surum2.c
</code></pre>
<p>sorun yok ise yukarıdaki komut boş dönecektir. surum1.c kodunu surum2.c arasındaki farkı görmek için :</p>
<pre><code>diff -Naur surum1.c surum2.c
</code></pre>
<p>farkı yama yapıp surum1.c'yi güncellemek için ise :</p>
<pre><code>diff -Naur surum1.c surum2.c > surum1.patch
patch -p0 < surum1.patch
</code></pre>
<p>veya daha kısası olarak pipe(borulama) :</p>
<pre><code>diff -Naur surum1.c surum2.c | patch -p0
</code></pre>
<p>olarak kullanılabilir.</p>
<p>Not : patch komutu surum1.patch yamasını dosya1'ye(surum1.c) uygulayacagını anlaması için; dosya2(surum2.c) isminin en az dosya1'den eşit ya da uzun olması gerek, ya da <code>patch -p0 surum1.c < surum1.patch</code> şekilde nereye patch yapacağının bildirilmesi gerekir.</p>
Shell Komutlarını Kısaltma-1011032010-11-03T00:00:00+00:00/categories/linux/shell-alias<p>alias komutu ile linux konsolunda sık kullandığınız komutların kısayolunu oluşturmamıza yarayan <strong>takma ad</strong>‘dır. Örneğin <code>ls -al</code> ifadesini konsolda durmadan yazmak yerine,</p>
<h3><code>vim</code> ile <code>.bashrc</code>yi acıyoruz :</h3>
<pre><code> vim ~/.bashrc
</code></pre>
<p>en alt satıra</p>
<pre><code> alias li="ls -al"
</code></pre>
<p>yazıyoruz ve konsolu kapatıp tekrar açıyoruz. Konsolda <code>li</code> dediğimiz zaman, <code>ls -al</code> görevi görmüş oluyor.</p>
LAMP → Linux, apache, MySQL, PHP-1010292010-10-29T00:00:00+00:00/categories/linux/lamp<h4>MySQL Kurulumu</h4>
<p>Paketi kuruyoruz:</p>
<pre><code>sudo apt-get install mysql-server mysql-client
</code></pre>
<p>Kurulumda bizden <code>mysql-server</code> için root şifresi istiyor bunları girip kurulumu bitiriyoruz. MySQL processi çalışıyor mu bakıyoruz:</p>
<pre><code>sudo ps aux | grep mysqld
mysql 3799 0.5 3.6 145392 18484 ? Ssl 10:42 0:00 /usr/sbin/mysqld
hummer 3891 0.0 0.1 3208 808 pts/0 S+ 10:43 0:00 grep --color=auto mysqld
</code></pre>
<p><code>$ mysql -u root -p</code> diyerek <code>mysql</code> denememizi yapıyoruz</p>
<h4>Apache Kurulumu</h4>
<p>Paketi kuruyoruz:</p>
<pre><code>sudo apt-get install apache2
</code></pre>
<p><code>apache</code> processi çalışıyor mu bakıyoruz:</p>
<pre><code>sudo ps aux | grep apache2
</code></pre>
<h4>PHP Kurulumu</h4>
<p><code>php</code> için <code>php7.0</code> paketini, <code>php</code> üzerinden <code>mysql</code> ve <code>apache</code>ye bağlantıyı sağlamak için <code>php7.0-mysql</code>, <code>libapache2-mod-php7.0</code> modüllerini yüklüyoruz:</p>
<pre><code>sudo apt-get install php7.0 libapache2-mod-php7.0 php7.0-mysql
</code></pre>
<p><code>apache</code>yi yeniden başlatıyoruz:</p>
<pre><code>sudo service apache2 restart
</code></pre>
<p>dizin izinlerini ayarlıyoruz:</p>
<pre><code>sudo chmod 777 -R /var/www/html
</code></pre>
<p>test yapıyoruz:</p>
<pre><code>echo "<?php echo phpinfo(); ?>" > /var/www/html/test.php
</code></pre>
<p>tarayıcı da <code>localhost/test.php</code> diyerek, bizi aşagıdaki gibi bir ekran karşılaması gerek:</p>
<p><img src="/file/phpinfo.png" alt="phpinfo" /></p>
<p>Buraya kadar her şey tamam!</p>
tmux ile Konsol-1010242010-10-24T00:00:00+00:00/categories/linux/tmux<p><code>screen</code>in biraz daha gelişmiş bir programdır. Tmux'ın kullanımı Screen ile aynıdır. Tmux öncesi shell görüntümüzün şöyle olduğunu düşünelim :</p>
<p><img src="/file/terminal-normal.png" alt="terminal-normal" /></p>
<h4>Kurulum</h4>
<p>Paketi yüklüyelim :</p>
<pre><code>sudo apt-get install tmux
</code></pre>
<h4>Ayar</h4>
<p>Tmux'da daha geniş bilgi görmek ve renklendirmek için ayar dosyalarını <strong>ev dizinine</strong> indiriyoruz :</p>
<pre><code>wget https://gdemir.github.io/file/tmux.zip
unzip tmux.zip
</code></pre>
<p>çıkan zipteki <code>tmux</code> dizinini <code>etc</code> altına taşıyoruz.</p>
<pre><code>sudo mv ~/tmux /etc/
</code></pre>
<p>daha sonra ev dizinine default dosyanın symbol-link'ini çekiyoruz.</p>
<pre><code>ln -s /etc/tmux/rc/default ~/.tmux.conf
</code></pre>
<p>konsolu her açtığımızda tmux'ın çalışması için Vim ile <code>.bashrc</code>yi açıyoruz :</p>
<pre><code> vim ~/.bashrc
</code></pre>
<p>en alt satıra aşağıdaki yönlendirmeyi ekliyoruz.</p>
<pre><code>tmux 2>/dev/null 1>&2
</code></pre>
<p>Terminal'i tekrar başlatıyoruz ve bizi böyle bir ekran karşılıyor.</p>
<p><img src="/file/terminal-tmux.png" alt="terminal-tmux" /></p>
<p>thats all!</p>
Düzenli, Hızlı Gist Yönetimi - gistpaste-1010222010-10-22T00:00:00+00:00/categories/github/gistpaste<p>Paketleri yüklüyelim :</p>
<pre><code>wget http://github.com/dblevins/gistpaste/raw/master/gistpaste
chmod 755 gistpaste
sudo mv gistpaste /usr/local/bin/
</code></pre>
<p>Gistleri düzenli depo etmek için dizin oluşturuyoruz ve içine giriyoruz :</p>
<pre><code>mkdir ~/gist
cd ~/gist
</code></pre>
<p>bütün gistlerimizi <code>gist</code> dizininin altında depolayacağız. Daha sonra yeni gist dizini oluşturuyoruz ve içine giriyoruz :</p>
<pre><code>mkdir new
cd new
</code></pre>
<p>new dizini altında dosyalarımızı koyuyoruz daha sonra tüm dosyaları yolluyoruz :</p>
<pre><code>gistpaste *
</code></pre>
<p>(Dikkat! <code>.</code> ile başlayan veya <code>.pyc</code> <code>.swp</code> dosyalarını eklemeden önce silmeyi unutmayın.) Yolladıktan sonra size</p>
<pre><code> http://gist.github.com/123456
</code></pre>
<p>tarzında bir numara dönecek, eski new dizinimizi silelim ve yeni gist'mizi clone edelim.</p>
<pre><code> sudo rm -rf new
git@gist.github.com:123456
</code></pre>
<p>Bu şekilde çalışmanın avantajı ise tek hamlede add, push yapması.</p>
LEMP → Linux, Nginx, MySQL, PHP-1010212010-10-21T00:00:00+00:00/categories/linux/lemp<p>Kullanacağımız ortamı sırayla kuralım:</p>
<h4>MySQL kurulumu</h4>
<p>Paketi kuruyoruz:</p>
<pre><code>sudo apt-get install mysql-server mysql-client
</code></pre>
<p>Kurulumda bizden <code>mysql-server</code> için root şifresi istiyor, bunları girip kurulumu bitiriyoruz.
<code>MySQL</code> processi çalışıyor mu bakıyoruz:</p>
<pre><code>sudo ps aux | grep mysqld
mysql 3799 0.5 3.6 145392 18484 ? Ssl 10:42 0:00 /usr/sbin/mysqld
hummer 3891 0.0 0.1 3208 808 pts/0 S+ 10:43 0:00 grep --color=auto mysqld
</code></pre>
<p><code>$ mysql -u root -p</code> diyerek <code>mysql</code> denememizi yapıyoruz</p>
<h4>Nginx kurulumu</h4>
<p>Paketi kuruyoruz:</p>
<pre><code>sudo apt-get install apache2 nginx
</code></pre>
<p>(<code>apache2</code> kurmamızın nedeni <code>/var/www/html</code> dizini oluşturmada gerekli olduğu için)
nginx'i tekrar başlatalım:</p>
<pre><code>sudo service nginx start
Starting nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
configuration file /etc/nginx/nginx.conf test is successful
nginx.
</code></pre>
<p>nginx processi çalışıyor mu bakıyoruz:</p>
<pre><code>netstat -pantu | grep :80
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:80 0.0.0.0:* DİNLE -
</code></pre>
<p>burdaki</p>
<pre><code>wget https://gdemir.github.io/file/nginx-ayar
</code></pre>
<p>dosyasını indirip aşağıdaki komutla default dosyasına ayar bilgilerimizi yüklüyelim:</p>
<pre><code>sudo install -m 644 nginx-ayar /etc/nginx/sites-available/default
</code></pre>
<p>Dizin izinlerini ayarlayalım:</p>
<pre><code>sudo chown -R www-data:www-data /var/www/html
</code></pre>
<p>web sayfasından <code>http://localhost</code>‘a girelim. Eğer sorunsuz yüklendiyse ise şu şekilde bir çıktı almamız gerek. <code>Nginx</code>'i başlatmak için bilgisayarı tekrar başlatıyoruz.</p>
<pre><code>sudo reboot
</code></pre>
<p><code>Nginx</code>‘i tekrar başlatıyoruz:</p>
<pre><code>sudo service nginx start
</code></pre>
<h4>PHP kurulumu</h4>
<p>Paketi kuruyoruz:</p>
<pre><code>sudo apt-get install php7.0-fpm php7.0-mysql
</code></pre>
<p><code>PHP</code>i yapılandırıyoruz:</p>
<pre><code>sudo $EDITOR /etc/php/7.0/fpm/php.ini
</code></pre>
<p>bu dosyada ki <code>cgi.fix_pathinfo=1</code> satırını aşağıdaki gibi ayarlıyoruz:</p>
<pre><code>cgi.fix_pathinfo=0
</code></pre>
<p><code>PHP</code>‘i tekrar başlatıyoruz:</p>
<pre><code>sudo service php5-fpm restart
</code></pre>
<p>dizin izinlerini ayarlıyoruz:</p>
<pre><code>sudo chmod 777 -R /var/www/html
</code></pre>
<p>test yapıyoruz:</p>
<pre><code>echo "<?php echo phpinfo(); ?>" > /var/www/html/test.php
</code></pre>
<p>tarayıcı da <code>localhost/test.php</code> diyerek, bizi aşagıdaki gibi bir ekran karşılaması gerek:</p>
<p><img src="/file/phpinfo.png" alt="phpinfo" /></p>
<p>bu kadar her şey tamam!</p>
Vim'de Sözdizimi Denetimi-1010202010-10-20T00:00:00+00:00/categories/linux/vim-renk<p>Ayrıntılı <code>c</code> sentaks denetimi için (aşağıdaki eklentinin gerektirdiği) splint paketini kur:</p>
<pre><code> sudo apt-get install splint
</code></pre>
<p><code>checksyntax</code> eklentisini indir</p>
<pre><code> wget -O checksyntax.vba.gz 'http://www.vim.org/scripts/download_script.php?src_id=11435'
</code></pre>
<p>kur</p>
<pre><code> vim -c 'source %' checksyntax.vba.gz
</code></pre>
<p><code>~/.vimrc</code>ye şu ayarları ekle</p>
<pre><code> let g:checksyntax_auto_ruby = 1
let g:checksyntax_auto_php = 1
let g:checksyntax_auto_javascript = 1
let g:checksyntax_auto_c = 1
</code></pre>
<p>artık bu noktadan sonra <code>c</code> dosyasını her kayedettiğinde otomatik olarak söz dizimi denetimi de yapılacak.</p>
Vim'de Kod Derleme ve Çalıştırma-1010202010-10-20T00:00:00+00:00/categories/linux/vim-derle<h3><code>SingleCompile</code> Eklentisini İndir</h3>
<pre><code> wget -O SingleCompile.zip 'http://www.vim.org/scripts/download_script.php?src_id=14010'
</code></pre>
<h3>Eklentiyi Kur</h3>
<pre><code> sudo apt-get install unzip # unzip olmalı
unzip -d ~/.vim SingleCompile.zip
</code></pre>
<h3>Yapılandırma Ayarlarına Ekle</h3>
<p><code>~/.vimrc</code>ye şu ayarları ekle:</p>
<pre><code> nmap <f9> :SCCompile<cr>
nmap <c-f9> :SCCompileRun<cr>
</code></pre>
<p><code>F9</code> sadece derler. <code>CTRL</code> + <code>F9</code> derler ve çalıştırır.</p>
Path'e Yol Ekleme-1010182010-10-18T00:00:00+00:00/categories/linux/path-ekle<p>Yazdığımız programları konsoldan çalıştırmak istediğimizde programın içine shebang ekler daha sonra çalıştırıyorduk. Ancak yazdıgınız bir kodu komut satırından heryerde çalıştırmıyorduk, çalıştırmak için PATH ‘e ekleme yapmalıyız. Kendi <code>$PATH</code>'inizi görmek için :</p>
<pre><code>echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
</code></pre>
<p><code>$PATH</code>‘e başka bir yol eklemek için :</p>
<pre><code>PATH=$PATH:<eklenecek_yol>
</code></pre>
<p>örneğin home dizininizdeki tüm programlara yolunu eklemek istersek :</p>
<pre><code>PATH=$PATH:~/
</code></pre>
<p>Bu şekilde ekleme yaptıgımız <code>$PATH</code>, terminalin kapanma zamanına kadar kalıcı kalır, her seferinde çalışmasını istiyorsanız, <code>.bashrc</code> dosyasını açıyoruz :</p>
<pre><code>$EDITOR .bashrc
</code></pre>
<p>en son stırına</p>
<pre><code>export PATH=$PATH:<eklenecek_yol>
</code></pre>
<p>şeklinde kullanmak üzere, örneğin home dizinini</p>
<pre><code>export PATH=$PATH:~/
</code></pre>
<p>ekliyoruz, aktif olması için terminali kapatıp yenisini açıyoruz bu kadar.</p>
GitHub Komutlarını Kısaltma-1010162010-10-16T00:00:00+00:00/categories/github/git-kisayol<p>Herzaman github ile uğraşıyorsak bazı kısayollara ihtiyacımız var;<br/>
- git br = git branch<br/>
- git ci = git commit<br/>
- git co = git checkout<br/>
- git di = git diff<br/>
- git me = git merge<br/>
- git pl = git pull<br/>
- git pu = git push<br/>
- git st = git status<br/>
- git up = git pull<br/>
yerine kullanabiliriz. Bunu için <a href="/file/github-ayar">github-ayar</a> dosyasını ev dizinine indirin.</p>
<pre><code>mv ~/github-ayar ~/.gitconfig
</code></pre>
<p>olarak dosyanın adını değiştirin.</p>
<pre><code>$EDITOR ~/.gitconfig
</code></pre>
<p>komutuyla dosyayı açın,</p>
<p><code>[user]</code> ve <code>[github]</code> kısmlarını kendi kişisel bilgilerinize göre düzenleyin bu kadar.</p>
mc(midnight commander) Kullanımı ve Ayarlar-1010152010-10-15T00:00:00+00:00/categories/linux/midnight-commander<p>Konsol ile arayüz arası bir editördür, verdiği imkan ve hız ile en iyi konsoldur denilebilir.</p>
<h4>Kurulum</h4>
<pre><code>sudo apt-get install mc
</code></pre>
<p><code>sudo mc</code> diyerek başlatıyoruz. Açılınca 2 ekran bizi karşılıyor. İşlemleri birinden diğerine yapcak şekilde gerçekleştiriyoruz.</p>
<p>(Ör. kopyalama, taşıma vs.)</p>
<p><img src="/file/mc.png" alt="1" /></p>
<h4>Kullanım</h4>
<p><code>F8</code> : doysa veya dizini siler.</p>
<p><code>F5</code> : dosya veya dizini kopyalar.</p>
<p><code>F6</code> : doysa veya dizini taşır.</p>
<p><code>Tab</code> : menüler arası gidiş gelişi sağlar.</p>
<p><code>Esc + .</code> : “.” ile başlayan dizinleri gösterir/göstermez.</p>
<h4>Ayarlar</h4>
<p>Kullanım için bazı ayarlar yaparak özelleştiriyoruz:</p>
<p><code>F9</code> > <code>options(ayarlar)</code> > <code>configuration(yapılandırma)</code>ı seçiyoruz.</p>
<p>Buradan;</p>
<p><code>drop dwon menus(aşağı açılan menüler)</code>‘i aktif</p>
<p><code>Lynx like montion(Lynx benzeri hareket)</code>‘i aktif yapıyoruz.</p>
<p><img src="/file/mc-ayar.png" alt="2" /></p>
<p><<code>kaydet(save)</code>> diyerek çıkıyoruz.</p>
Vim-1010142010-10-14T00:00:00+00:00/categories/linux/vim<p>Vim geliştirilmiş bir editördür. Geniş kullanıcı kitlesi olan bir yazılımdır. Vim 3 hana hattan oluşur. Escape, insert, virtual.</p>
<h3>İnsert(<code>i</code>)</h3>
<pre><code>Yazma silme işlemlerini kullanacağınız bölümdür,
"i" harfine basarak yazma moduna geçer.
</code></pre>
<h3>Virtual(<code>v</code>)</h3>
<pre><code>Kopyalama , yapıştırma işlemlerinin yapıldıgı bölümdür,
"v" harfine basarak kullanılır.
Bu bölümde ;
d seçimi siler.(delete)
c seçimi keser ve yazma moduna geçer.(cut)
y seçimi kopyalar.(yank)
p seçimi yapıştırır.(paste)
</code></pre>
<h3>Escape(<code>ESC</code>)</h3>
<pre><code>Bu bölüme kök bölümü diyebiliriz, yani insert veya virtualdan
tekrar ana bölüme dönmeye yarar, "esc" tuşuna basarak kullanılır.
</code></pre>
<p>Yazdığınız bir dosyadan cıkmak istersek;<br/>
<code>:q</code> hiçbirşey yapmadan çıkış yapar.(quit)<br/>
<code>:wq</code> dosyada yeni değişiklikleri kaydeterek çıkmaya yarar.(write-quit)<br/>
<code>:q!</code> dosyada her ne olmuşsa olsun direkt çıkmaya yarar.(quit!)</p>
Vim'i .vimrc Dosyası ile Özelleştirme-1010142010-10-14T00:00:00+00:00/categories/linux/vim-vimrc<p><code>.vimrc</code> dosyası vim'de herzaman kullanmak istediğimiz özellikleri kullandığımız bir dosyadır. vim editöründe kullandığınız özelliklerin her zaman aktif olması için konsolu açıyoruz.</p>
<pre><code> $ cat >~/.wimrc
syntax enable
set background=dark
set cindent
map <f5> :w\| !ruby % <cr>
map <f4> :w\| !python % <cr>
map <f2> :w\| !php % <cr>
ctrl + d
</code></pre>
<p><code>ctrl + d</code> diyerek dosyaya <code>EOF</code> yollayıp kaydetmiş oluyoruz.<br/>
vimi tekrar açınca özellikler aktif olacaktır.</p>
<p><code>syntax enable</code> sözdizim renklendiricidir.<br/>
<code>set background=dark</code> arka planı karanlık yapıp yazıları ışıklandırır.<br/>
<code>set cindent</code> c kodları için indentlemeyi otomatik yapar.<br/>
<code>map <f5> :w\| !ruby % <cr></code> f5 basıldıgında ruby kodunu çalıştırır.<br/>
<code>map <f4> :w\| !python % <cr></code> f4 basıldıgında python kodunu çalıştırır.<br/>
<code>map <f2> :w\| !php % <cr></code> f2 basıldıgında php kodunu çalıştırır.</p>
Konsolu .bashrc Dosyası ile Renklendirmek-1010102010-10-10T00:00:00+00:00/categories/linux/bash-renk<p>Konsolumuzun rengi ilk olarak şöyle :</p>
<p><img src="/file/konsol-normal.png" alt="1" /></p>
<p>olduğunu düşünelim, Vim ile .bashrc dosyasını açıyoruz. (Tabiki vim yerine siz başka bir editör seçebilirsiniz.)</p>
<pre><code>vim ~/.bashrc
</code></pre>
<p><strong>#force_color_prompt=yes</strong> satırında ki <code>#</code> karakterini kaldırıp, ifadeyi aktif ediyoruz. Daha sonra;</p>
<pre><code> if [ "$color_prompt" = yes ]; then
PS1 = '\[\e[0;0m\]\u\[\e[m\]@\[\e[0m\]\w\[\e[m\]\[\e[0m\]\[\e[0m\]\$\[\e[m\]\[\e[0m\] '
else
PS1 = '${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
</code></pre>
<p>kısımdaki ilk <code>PS1</code> ifadesinin yerine;</p>
<pre><code>'\[\e[1;32m\]\u\[\033[2;31m\]@\[\033[1;36m\]\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]\$ '
</code></pre>
<p>yazıyoruz ve artık konsolumuzu renklendirmiş oluyoruz.</p>
<p><img src="/file/konsol-renkli.png" alt="2" /></p>
<p>Bu yukarıdaki renk stili benim favorimdir. Sizde kendinize göre renklendirebilirsiniz. Konsolu eski haline çevirmek için <strong>force_color_prompt=yes</strong> satırında ki <code>#</code> ifadesini tekrar koymanız yeterli.</p>
Shebang Ekleme ve Konsolda Program Çalıştırma-1010072010-10-07T00:00:00+00:00/categories/linux/shebang<h4>Shebang Ekleme</h4>
<p>Linux işletim sistemlerinde bir programın sadece uzantısına bakılıp sınırlandırma konulmaz. Bir programı ilk satırına shebang ifadesi ekleyerekte, işletim sisteminin programın türünü belirlemesini sağlayabiliriz. Program'ın içinde ilk satıra, programın bulundugu yolu verebiliriz. örneğin, <code>python</code> programınızın ilk satırına şunu yazıyoruz :</p>
<pre><code>#!/usr/bin/python
</code></pre>
<p>bu şekilde türünü belirlemiş oluyoruz veya <code>ruby</code> programınızın ilk satırına :</p>
<pre><code>#!/usr/bin/ruby
</code></pre>
<p><code>shell</code> programınızın ilk satırına :</p>
<pre><code>#!/bin/sh
</code></pre>
<h4>Konsolda Program Çalıştırma</h4>
<p>Programı konsolda çalıştırmak için çalıştırılabilir yapıyoruz.</p>
<pre><code>chmod +x <program_adı>
</code></pre>
<p>Programı çalıştırmak için ise</p>
<pre><code>./<program_adı>
</code></pre>
<p>diyerek programı çalıştırıyoruz.</p>
Standart i/o İşlemlerinin Yönlendirilmesi-1010072010-10-07T00:00:00+00:00/categories/linux/io-yonlendirme<h4>Standart i/o İşlemleri</h4>
<p>Unix'ta programlar ve dosyalar, i/o işlemleri yönünden;</p>
<pre><code> 0 : stdout (çıktı almak için)
1 : stdin (girdi girmek için)
2 : stderr (hataları görüntülemek için)
</code></pre>
<p>olmak üzere 3 akıntı yoluna sahiptir.<br/>
Bu 3 işlem programın veya dosyanın temel işlemleridir.</p>
<h4>Standart i/o İşlemlerinin Yönlendirilmesi</h4>
<p>Bazen programların veya dosyaların; hatalarını, çıktılarını, girdilerini<br/>
başka yerlere yönlendirerek, işleyişini incelemek isteriz.<br/>
Örneğin, bir program da hataları bir dosyaya yönlendirmek istersek :</p>
<pre><code>program_adı 2>dosya_adı
</code></pre>
<p>şeklinde kullanıyoruz. Bir <code>c</code> kodunda,</p>
<pre><code>fprintf(stderr, "Hata : kaynak bulunamadı");
</code></pre>
<p>ifadesi çalıştığında, hatalar ekranda görüntülenmez, bunun yerine <code>dosya_adı</code> isimli dosyaya yazılır. Eğer hataları ekranda görmek istiyorsak çıktıya yönlendirmemiz gerekiyor, bunun için :</p>
<pre><code>program_adı 2>&1
</code></pre>
<p>hataları çıktı olarak yönlendiririz. Eğer programın çıktıları yönlendirmek istiyorsak</p>
<pre><code>program_adı 1>dosya_adı
</code></pre>
<p>veya</p>
<pre><code>program_adı >dosya_adı
</code></pre>
<p>diyerekte kullanabiliriz. Yani default değeri 1 olarak kendisi atıyor.</p>
Güvenli Kopyalama Kullanımı - scp(security copy)-1010052010-10-05T00:00:00+00:00/categories/linux/scp<p>Scp bir ağdaki 2 bilgisayar arasında dosya, dizin transfer etmemize yarar. Bu işlem SSH ile yapıldıgından, şifreli ve güvenlidir. Scp'in kullanımı basit ve kısadır, ama yine de unutulabiliyor ben genelde unutuyorum :-)</p>
<p>Scp, cp komutu gibi çalışır</p>
<pre><code>cp kopyalanacak_dosya kopyalanacak_yer
</code></pre>
<p>Scp'in cp'den farkı ek olarak bilgisayarın <strong>host_ismi</strong> vererek nerede oldugunu söylemeniz gerekmektedir. Karşı bilgisayardan kendi bilgisayarımıza kopyalayacaksak</p>
<pre><code>scp host_ismi:kopyalanacak_dosya kopyalanacak_yer
</code></pre>
<p>Kendi bilgisayarımızdan karşı bilgisayara dosya yollayacaksak</p>
<pre><code>scp kopyalanacak_dosya host_ismi:kopyalanacak_yer
</code></pre>
<p>Bu kadar basit, ancak; bu dediklerimi 2 bilgisayarda <strong>kullanıcı_adı</strong>‘nız aynı ise yapabilirsiniz. Eğer 2 bilgisayarda <strong>kullanıcı_adı</strong>'nız aynı değil ise ek olarak <strong>host_ismi</strong>'den önce <code>kullanıcı_adı@host_ismi</code> şeklinde belirtmek zorundasınız.</p>
Gimp ile Yansıma-1008052010-08-05T00:00:00+00:00/categories/linux/gimp-yansima<p>Gimp, GNU dünyasının bize armağan ettiği bir resim düzenleme programıdır. Videoyu izleyerek sizde yazılara yansıma yapabilirsiniz.</p>
<p>İzlemek için <a href="/file/gimp-yansima.gif">tıklayınız.</a></p>
<p>Çalışmanın bitmiş hali</p>
<p><img src="/file/gdemir.png" alt="1" /></p>
<p>Daha da ileri, bitmiş bir çalışma için <a href="/file/flash.png">tıklayınız.</a></p>
<h4>Kurulum</h4>
<pre><code>sudo apt-get install gimp
</code></pre>
SSH Kimlik Taşıma ve Kullanımı-1007072010-07-07T00:00:00+00:00/categories/linux/ssh-kimlik-tasi<h4>Kurulum</h4>
<p>local bilgisayarımıza kuruyoruz.</p>
<pre><code>sudo apt-get install ssh
</code></pre>
<h4>Kullanım</h4>
<p>Örneğin sanal makinamız olsun. Sanal makina kullanıcı ismi <code>f3</code> olsun şu şekilde bağlanılır.</p>
<pre><code>ssh f3@192.168.1.1
</code></pre>
<h4>Kimlik taşıma</h4>
<p><code>ssh -A</code> bunun farkı sizin kendi bilgisayarınızdaki <code>~/ssh/id_rsa.pub</code> dosyayı bağlanılan bilgisayara taşıyıp, bağlandıgınız bilgisayarı kendi bilgisayarınız gibi kullanmaktır. Yani, localdeki kendi kimliğinizi taşımaya sağlar.</p>
<pre><code>ssh -A f3@192.168.1.1
</code></pre>
<h4>Kimlik kullanımı</h4>
<p>Kendi kimligimizi taşıyıp (<code>ssh -A</code>) <code>github clone</code> veya bunun benzeri işler yapacaksak</p>
<pre><code>sudo -E git <islem> (Ör. sudo -E git clone git@github.com:gdemir/gdemir.github.com.git)
</code></pre>
<p><code>-E</code> konmazsa kimliğinizi tanımayıp fatal hatası verecektir</p>
screen Kurulumu ve Kullanımı-1007072010-07-07T00:00:00+00:00/categories/linux/screen<p>Screen basit bir program olmasına rağmen, birden fazla termial açmadan<br/>
işlerimizi halletmemize yarayan ufak bir programdır.</p>
<h3>Kurulum</h3>
<pre><code>sudo apt-get install screen
</code></pre>
<h3>Kullanım</h3>
<p><code>ctrl + a + c</code> : yeni konsol açar<br/>
<code>ctrl + a + a</code> : son gezilen konsollarda gidiş dönüşün sağlar<br/>
<code>ctrl + a + 0</code> : 0 nolu konsola gider<br/>
<code>ctrl + a + 1</code> : 1 nolu konsola gider<br/>
<code>ctrl + a + 2</code> : 2 nolu konsola gider</p>
<p>Bu şekilde birden çok terminal açmaktan kurtuluyoruz, işlerimizi daha seri görüyoruz.</p>
MySQL'e Giriş ve Bazı İşlemler-1007072010-07-07T00:00:00+00:00/categories/linux/mysql-giris<h4>MySQL Kurulumu</h4>
<p>Paketleri kur:</p>
<pre><code>sudo apt-get install mysql-server mysql-client
</code></pre>
<p>Kurulumda bizden <code>mysql-server</code> için root şifresi istiyor, bunları girip kurulumu bitiriyoruz ve kurulum sonrası test ediyoruz.</p>
<pre><code>sudo ps aux | grep mysqld
mysql 3799 0.5 3.6 145392 18484 ? Ssl 10:42 0:00 /usr/sbin/mysqld
hummer 3891 0.0 0.1 3208 808 pts/0 S+ 10:43 0:00 grep --color=auto mysqld
</code></pre>
<h4>MySQL'e Bağlanma ve db Oluşturma</h4>
<pre><code>mysql -u <user ismi> <database ismi> -p
</code></pre>
<p>buradaki <code>-u</code> user, <code>-p</code> ise password sor manasında. İlk kez bağlanıyorsanız,</p>
<pre><code>mysql -u root -p < "create database dbname;"
</code></pre>
<p>diyerek root olarak databese oluşturabilirsiniz.</p>
<h4>MySQL'de Tablo Oluşturma</h4>
<p>MySQL'e bağlı oldugumuzu düşünelim,</p>
<pre><code>CREATE TABLE kul (
id int(11) NOT NULL auto%1Fincrement,
ad varchar(20) NOT NULL default '',
parola varchar(12) NOT NULL default '',
PRIMARY KEY (id)
) TYPE=MyISAM;
</code></pre>
<p>diyerek kul isimli tablo olurmuş oluyoruz.</p>
<h4>MySQL'den Veri Yedeğini Alma ve MySQL'e Yedeği Aktarma (manual)</h4>
<p>Konsoldan,</p>
<pre><code>mysqldump -u <user ismi> <database ismi> -p > yedek.sql
</code></pre>
<p>komutuyla <user ismi>li kullanıcı <database ismi>li db'i <code>yedek.sql</code> olarak üretir.
Veya,</p>
<pre><code>mysql -u <user ismi> <database ismi> -p < yedek.sql
</code></pre>
<p>diyerek <code>yedek.sql</code> ile <code>MySQL</code>e aktarır.</p>
<h4>MySQL'den Otomatik Veri Yedeği Alma (auto)</h4>
<p>sudo apt-get install automysqlbackup</p>
<p>ve şu şekilde çalıştırıyoruz. Konsoldan, bir kereliğine</p>
<p>automysqlbackup</p>
<p>diyerek çalıştırıyoruz. Veri yedeklerimizi de şu dizin altından görüntüleyebiliyoruz :</p>
<pre><code>ls /var/lib/automysqlbackup/
</code></pre>
<p>burada günlük, aylık, yıllık olarak otamatikmen kaydoluyor.</p>
<h4>MySQL'de Hata Akışına Bakma</h4>
<p>Konsoldan,</p>
<pre><code>tail -f /var/log/nginx/error.log
</code></pre>
<p>diyerek arkadaşınızın önerilerini dinleyebilirsiniz :-)</p>