<?xml version="1.0" encoding="UTF-8" standalone="no"?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"><channel><title>.:: Volkan Altan'ın Notları ::.</title><description></description><managingEditor>noreply@blogger.com (Unknown)</managingEditor><pubDate>Sun, 23 Jul 2023 07:15:44 +0300</pubDate><generator>Blogger http://www.blogger.com</generator><openSearch:totalResults xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">149</openSearch:totalResults><openSearch:startIndex xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">1</openSearch:startIndex><openSearch:itemsPerPage xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/">25</openSearch:itemsPerPage><link>http://volkanaltan.blogspot.com/</link><language>en-us</language><itunes:explicit>no</itunes:explicit><itunes:subtitle/><itunes:category text="Technology"><itunes:category text="Software How-To"/></itunes:category><itunes:owner><itunes:email>noreply@blogger.com</itunes:email></itunes:owner><item><title>Merhaba Berlin</title><link>http://volkanaltan.blogspot.com/2019/12/merhaba-berlin.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 5 Dec 2019 19:50:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-3198151149309379578</guid><description>Berlin maceralarımızı anlattığım yazıya buradan ulaşabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://medium.com/@volkana/merhaba-berlin-6b7c39b1bed5"&gt;https://medium.com/@volkana/merhaba-berlin-6b7c39b1bed5&lt;/a&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Teknolojik gelişmeleri takip etme döngüm</title><link>http://volkanaltan.blogspot.com/2017/11/teknolojik-gelismeleri-takip-etme-dongum.html</link><category>list</category><category>liste</category><category>pocket</category><category>reddit</category><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 17 Nov 2017 08:56:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-587626247024676377</guid><description>Teknolojik gelişmeleri takip etme döngümü yazdım;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://medium.com/@volkana/teknolojik-geli%C5%9Fmeleri-takip-etme-d%C3%B6ng%C3%BCm-7749b5c1aae7"&gt;https://medium.com/@volkana/teknolojik-geli%C5%9Fmeleri-takip-etme-d%C3%B6ng%C3%BCm-7749b5c1aae7&lt;/a&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title/><link>http://volkanaltan.blogspot.com/2017/11/medium-uzerinden-gercek-zamanl-analiz.html</link><category>Apache Kafka</category><category>Divolte Collector</category><category>Kafka Streams</category><category>Real Time Analytics</category><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 2 Nov 2017 18:28:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-795456066250620342</guid><description>Medium üzerinden "&lt;a href="https://medium.com/@volkana/ger%C3%A7ek-zamanl%C4%B1-analiz-projesi-51dc6771dca0"&gt;Gerçek Zamanlı Analiz Projesi&lt;/a&gt;" isimli bir yazı yayınladım.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Solr için Plugin yazmak</title><link>http://volkanaltan.blogspot.com/2017/10/solr-icin-plugin-yazmak.html</link><category>Custom Filter</category><category>Java</category><category>Plugin</category><category>Search Engine</category><category>Solr</category><author>noreply@blogger.com (Unknown)</author><pubDate>Sat, 7 Oct 2017 22:45:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-6182718243136847090</guid><description>Medium üzerinden "&lt;a href="https://medium.com/@volkana/solr-i%C3%A7in-plugin-yazmak-689079c41454"&gt;Solr için Plugin yazmak&lt;/a&gt;" isimli bir yazı yayınladım.</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Apache THRIFT</title><link>http://volkanaltan.blogspot.com/2016/10/apache-thrift.html</link><category>Apache Thrift</category><category>Php</category><category>Python</category><author>noreply@blogger.com (Unknown)</author><pubDate>Wed, 19 Oct 2016 23:50:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-3753513223318158426</guid><description>&lt;b&gt;Apache Thrift nedir?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Farklı programlama diller arasında iletişim kurabileceğiniz, bunu ölçeklenebilir, verimli ve sorunsuz bir şekilde yapabileceğimiz bir yazılım çatısıdır (framework). Bu işlemleri yaparken RPC (&lt;a href="https://en.wikipedia.org/wiki/Remote_procedure_call" rel="nofollow"&gt;remote procedure call&lt;/a&gt;) kullanır.&lt;br /&gt;
&lt;br /&gt;
RPC, request–response protokolüne benzemektedir. Bu yapıda bir istek yapıldığında sonuç gelene kadar client (istemci) bloklanır. RPC ek olarak asenkron işlemlere müsade etmektedir. XHTTP (Ajax) gibi düşünebilirsiniz.&lt;br /&gt;
&lt;br /&gt;
Binary protokolünü kullanmaktadır. Binary olması çok hızlı çalışmasını sağlamaktadır.&lt;br /&gt;
&lt;br /&gt;
Siz bir arayüz tanımlıyorsunuz. Sonrasına buna göre istediğiniz dilde kod yapısını çıkarıyor. Size de boşlukları doldurmak kalıyor.&lt;br /&gt;
&lt;br /&gt;
Kullanılabilir dillerden bazıları;&lt;br /&gt;
C++, Java, Python, PHP, Ruby, Erlang, Perl, Haskell, C#, Cocoa, JavaScript, Node.js, Smalltalk, OCaml and Delphi ...&lt;br /&gt;
&lt;br /&gt;
Biz &lt;b&gt;PHP&lt;/b&gt; ile &lt;b&gt;Python&lt;/b&gt;'u konuşturan örnek bir uygulama yapalım;&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
brew install thrift --with-python --with-php
git clone https://github.com/volkan/thrift-works
cd thrift-works
thrift -r --gen php:server tutorial.thrift
thrift -r --gen php:server shared.thrift
thrift -r --gen py tutorial.thrift
thrift -r --gen py shared.thrift
&lt;/code&gt;&lt;/pre&gt;
Python için;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
pip install thrift
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Veya

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
cd lib/py
python setup.py install
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
İki ayrı pencere;

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
python server/PythonServer.py
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
php client/PhpClient.php
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Böylece farklı dillerde iletişimi sağlamış olduk. Örnekler arasında "zip()" olanın içine "sleep" ile bekleme yapmasını söyledim. Ancak kod akışından bir engelleme olmadan arka planda çalışmaya devam ediyor. (Asenkron) Server tarafında "zip()" yazısı 5 saniye sonra çıkıyor.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://1.bp.blogspot.com/-AUebCj5ijDI/WAfbhxy83PI/AAAAAAABHY4/cNN_dfD3-3o_KYsIy23oYU7ixvNakCFyACK4B/s1600/Screen%2BShot%2B2016-10-19%2Bat%2B22.15.52.png" imageanchor="1"&gt;&lt;img border="0" height="160" src="https://1.bp.blogspot.com/-AUebCj5ijDI/WAfbhxy83PI/AAAAAAABHY4/cNN_dfD3-3o_KYsIy23oYU7ixvNakCFyACK4B/s320/Screen%2BShot%2B2016-10-19%2Bat%2B22.15.52.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-XjcKgSsyZC0/WAfbh-D5oKI/AAAAAAABHY8/j9Ba3-g_IKQc3NnqC3WfsDsQKT1oBe_sgCK4B/s1600/Screen%2BShot%2B2016-10-19%2Bat%2B22.15.41.png" imageanchor="1"&gt;&lt;img border="0" height="152" src="https://2.bp.blogspot.com/-XjcKgSsyZC0/WAfbh-D5oKI/AAAAAAABHY8/j9Ba3-g_IKQc3NnqC3WfsDsQKT1oBe_sgCK4B/s200/Screen%2BShot%2B2016-10-19%2Bat%2B22.15.41.png" width="200" /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-oeDyu5Yc3H8/WAfbg4WK5BI/AAAAAAABHYs/yL0am0TRODkAWkPznayfO7ohlGRFvGEpgCK4B/s1600/Screen%2BShot%2B2016-10-19%2Bat%2B22.10.16.png" imageanchor="1"&gt;&lt;img border="0" height="132" src="https://3.bp.blogspot.com/-oeDyu5Yc3H8/WAfbg4WK5BI/AAAAAAABHYs/yL0am0TRODkAWkPznayfO7ohlGRFvGEpgCK4B/s320/Screen%2BShot%2B2016-10-19%2Bat%2B22.10.16.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://2.bp.blogspot.com/-t1dVE3WKU10/WAfbgspqt0I/AAAAAAABHYk/S9SxMlVBrpEitUN5qr9CWBOd1DDsO7SpwCK4B/s1600/Screen%2BShot%2B2016-10-19%2Bat%2B22.09.59.png" imageanchor="1"&gt;&lt;img border="0" height="83" src="https://2.bp.blogspot.com/-t1dVE3WKU10/WAfbgspqt0I/AAAAAAABHYk/S9SxMlVBrpEitUN5qr9CWBOd1DDsO7SpwCK4B/s320/Screen%2BShot%2B2016-10-19%2Bat%2B22.09.59.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Dikkat çekmesi için bazı görseller paylaşacağım. Kaynakları da aşağıda veriyorum. İyi incelemeler :)&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://3.bp.blogspot.com/-iuEU2w5a8bg/WAfNAQ6EbxI/AAAAAAABHYU/n8TBL6xXUYEOtQ3iqDwxlTbhHdB8OWFawCK4B/s1600/Screen%2BShot%2B2016-10-19%2Bat%2B22.29.13.png" imageanchor="1"&gt;&lt;img border="0" height="186" src="https://3.bp.blogspot.com/-iuEU2w5a8bg/WAfNAQ6EbxI/AAAAAAABHYU/n8TBL6xXUYEOtQ3iqDwxlTbhHdB8OWFawCK4B/s320/Screen%2BShot%2B2016-10-19%2Bat%2B22.29.13.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-ouZfNMguh7Q/WAfM_9xcbJI/AAAAAAABHYM/dP0JQlt0m6Y31Gi8SnHk2reszyJsvtAxgCK4B/s1600/Screen%2BShot%2B2016-10-19%2Bat%2B22.28.57.png" imageanchor="1"&gt;&lt;img border="0" height="189" src="https://1.bp.blogspot.com/-ouZfNMguh7Q/WAfM_9xcbJI/AAAAAAABHYM/dP0JQlt0m6Y31Gi8SnHk2reszyJsvtAxgCK4B/s320/Screen%2BShot%2B2016-10-19%2Bat%2B22.28.57.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://4.bp.blogspot.com/-qDqNk_p9Axg/WAffHxvPnfI/AAAAAAABHZE/OBVVQe6OncEGQ6Iomge6q2qAwaH39Gt2gCK4B/s1600/Screen%2BShot%2B2016-10-19%2Bat%2B22.28.35.png" imageanchor="1"&gt;&lt;img border="0" height="188" src="https://4.bp.blogspot.com/-qDqNk_p9Axg/WAffHxvPnfI/AAAAAAABHZE/OBVVQe6OncEGQ6Iomge6q2qAwaH39Gt2gCK4B/s320/Screen%2BShot%2B2016-10-19%2Bat%2B22.28.35.png" width="320" /&gt;&lt;/a&gt;&lt;a href="http://1.bp.blogspot.com/-A-E0UUbe5Kk/WAfM_IX3EOI/AAAAAAABHYE/0Kjms_uSBKQZMr4mDOqMvkKlHQwvv88fgCK4B/s1600/Screen%2BShot%2B2016-10-19%2Bat%2B22.28.46.png" imageanchor="1"&gt;&lt;img border="0" height="183" src="https://1.bp.blogspot.com/-A-E0UUbe5Kk/WAfM_IX3EOI/AAAAAAABHYE/0Kjms_uSBKQZMr4mDOqMvkKlHQwvv88fgCK4B/s320/Screen%2BShot%2B2016-10-19%2Bat%2B22.28.46.png" width="320" /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Kaynaklar&lt;/b&gt;:&lt;br /&gt;
&lt;!--?xml version="1.0" encoding="UTF-8"?--&gt;

&lt;a href="https://www.youtube.com/watch?v=e8Df_8yMGRU" rel="nofollow" style="font-family: 'Helvetica Neue'; font-size: 14px;"&gt;https://www.youtube.com/watch?v=e8Df_8yMGRU&lt;/a&gt;&lt;br /&gt;
&lt;div style="font-family: 'Helvetica Neue'; font-size: 14px;"&gt;
&lt;span style="font-family: &amp;quot;helvetica neue&amp;quot;;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;a href="http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.3/thrift-0.9.3.tar.gz" rel="nofollow"&gt;http://www.apache.org/dyn/closer.cgi?path=/thrift/0.9.3/thrift-0.9.3.tar.gz&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="font-family: &amp;quot;helvetica neue&amp;quot;; font-size: 14px;"&gt;
&lt;a href="https://thrift.apache.org/tutorial/php" rel="nofollow"&gt;https://thrift.apache.org/&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style="font-family: 'Helvetica Neue'; font-size: 14px;"&gt;
&lt;div&gt;
&lt;a href="https://thrift.apache.org/tutorial/php" rel="nofollow"&gt;https://thrift.apache.org/tutorial/php&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;a href="https://thrift.apache.org/tutorial/py" rel="nofollow"&gt;https://thrift.apache.org/tutorial/py&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;a href="http://nordicapis.com/microservice-showdown-rest-vs-soap-vs-apache-thrift-and-why-it-matters/" rel="nofollow"&gt;http://nordicapis.com/microservice-showdown-rest-vs-soap-vs-apache-thrift-and-why-it-matters/&lt;/a&gt;&lt;br /&gt;
&lt;div style="font-family: 'Helvetica Neue'; font-size: 14px;"&gt;
&lt;a href="https://en.wikipedia.org/wiki/Apache_Thrift" rel="nofollow"&gt;https://en.wikipedia.org/wiki/Apache_Thrift&lt;/a&gt;&lt;/div&gt;
&lt;!--?xml version="1.0" encoding="UTF-8"?--&gt;

&lt;br /&gt;
&lt;div style="font-family: 'Helvetica Neue'; font-size: 14px;"&gt;
&lt;div style="font-family: &amp;quot;helvetica neue&amp;quot;; font-size: 14px;"&gt;
&lt;a href="https://en.wikipedia.org/wiki/Remote_procedure_call" rel="nofollow" style="font-family: &amp;quot;helvetica neue&amp;quot;; font-size: 14px;"&gt;https://en.wikipedia.org/wiki/Remote_procedure_call&lt;/a&gt;&lt;br /&gt;
&lt;span style="font-family: &amp;quot;helvetica neue&amp;quot;;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;a href="https://eng.uber.com/soa/" rel="nofollow"&gt;https://eng.uber.com/soa/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;helvetica neue&amp;quot;; font-size: 14px;"&gt;
&lt;span style="font-family: &amp;quot;helvetica neue&amp;quot;;"&gt;&lt;span style="font-size: 14px;"&gt;&lt;a href="https://eng.uber.com/trip-data-squeeze/" rel="nofollow"&gt;https://eng.uber.com/trip-data-squeeze/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div style="font-family: &amp;quot;helvetica neue&amp;quot;; font-size: 14px;"&gt;
&lt;a href="http://gearman.org/" rel="nofollow"&gt;http://gearman.org/&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div style="font-family: 'Helvetica Neue'; font-size: 14px;"&gt;
&lt;!--?xml version="1.0" encoding="UTF-8"?--&gt;

&lt;a href="https://github.com/yuxel/thrift-examples" rel="nofollow"&gt;https://github.com/yuxel/thrift-examples&lt;/a&gt;&lt;/div&gt;
</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://1.bp.blogspot.com/-AUebCj5ijDI/WAfbhxy83PI/AAAAAAABHY4/cNN_dfD3-3o_KYsIy23oYU7ixvNakCFyACK4B/s72-c/Screen%2BShot%2B2016-10-19%2Bat%2B22.15.52.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>SolrCloud yeni bir başlangıç</title><link>http://volkanaltan.blogspot.com/2016/10/solrcloud-yeni-bir-baslangic.html</link><category>Solr</category><category>SolrCloud</category><author>noreply@blogger.com (Unknown)</author><pubDate>Sun, 2 Oct 2016 00:30:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-7719052422982960539</guid><description>Daha önce hızlıca SolrCloud &lt;a href="https://volkanaltan.blogspot.com.tr/2016/05/solrcloud-kurulumu-ve-zookeeper.html"&gt;hakkında&lt;/a&gt; konuşmuştuk. Şimdi hızlı bir şekilde temel komutları gözden geçirelim.&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
bin/solr start -e cloud
&lt;/code&gt;&lt;/pre&gt;
Default ayarlarla kurulumu tamamlıyoruz.
Daha sonra tekrar çalıştırmak istediğimizde aşağıdaki şekilde çalıştırabiliriz.

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
bin/solr start -cloud -p 8983 -s "example/cloud/node1/solr" -m 2g
bin/solr start -cloud -p 7574 -s "example/cloud/node2/solr" -z localhost:9983 -m 2g
&lt;/code&gt;&lt;/pre&gt;
Sistem default ayarlarla ayağa kalktıktan sonra aşağıdaki şekilde kontrol ediyoruz.

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
➜  solr-6.0.0 bin/solr status

Found 2 Solr nodes:

Solr process 4600 running on port 7574
{
  "solr_home":"/Users/volkan/project/solr/solr-6.0.0/example/cloud/node2/solr",
  "version":"6.0.0 48c80f91b8e5cd9b3a9b48e6184bd53e7619e7e3 - nknize - 2016-04-01 14:41:49",
  "startTime":"2016-10-01T20:15:22.133Z",
  "uptime":"0 days, 0 hours, 3 minutes, 27 seconds",
  "memory":"91.5 MB (%18.6) of 490.7 MB",
  "cloud":{
    "ZooKeeper":"localhost:9983",
    "liveNodes":"2",
    "collections":"1"}}


Solr process 4497 running on port 8983
{
  "solr_home":"/Users/volkan/project/solr/solr-6.0.0/example/cloud/node1/solr",
  "version":"6.0.0 48c80f91b8e5cd9b3a9b48e6184bd53e7619e7e3 - nknize - 2016-04-01 14:41:49",
  "startTime":"2016-10-01T20:15:15.915Z",
  "uptime":"0 days, 0 hours, 3 minutes, 34 seconds",
  "memory":"74.3 MB (%15.1) of 490.7 MB",
  "cloud":{
    "ZooKeeper":"localhost:9983",
    "liveNodes":"2",
    "collections":"1"}}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Solr kendi içinde 3 farklı config yapısıyla geliyor. Biz bunlardan "data_driven_schema_configs" olanı seçip üzerinde çalışacağız. &lt;br /&gt;&lt;br /&gt;
Bu ayar yapısında tanımlamasını yapmadığımız "field" lar otomatikmen en uygun olana çevrilir. Klasik &lt;b&gt;ElasticSearch&lt;/b&gt; kur çalıştır yapısı gibi düşünebilirsiniz. Ama gerçek anlamda işi olan biri default ayarlarla yetinemez ;)
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;server/solr/configsets/data_driven_schema_configs/conf/ dizininde işimiz bittikten sonra yapılan değişiklikleri zookeeper'a göndermemiz gerekiyor. 

Solr içinde zookeeper yönetmek için güzel bir script mevcut. Bununla işlerimizi rahatlıkla hâlledebiliyoruz.

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
➜  solr-6.0.0 ./server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983
usage: ZkCLI
 -c,--collection &lt;arg&gt;   for linkconfig: name of the collection
 -cmd                    cmd to run: bootstrap, upconfig, downconfig,
                         linkconfig, makepath, put, putfile,get,getfile,
                         list, clear, updateacls
 -d,--confdir &lt;arg&gt;      for upconfig: a directory of configuration files
 -h,--help               bring up this help page
 -n,--confname &lt;arg&gt;     for upconfig, linkconfig: name of the config set
 -name &lt;arg&gt;             name of the cluster property to set
 -r,--runzk &lt;arg&gt;        run zk internally by passing the solr run port -
                         only for clusters on one machine (tests, dev)
 -s,--solrhome &lt;arg&gt;     for bootstrap, runzk: solrhome location
 -val &lt;arg&gt;              value of the cluster to set
 -z,--zkhost &lt;arg&gt;       ZooKeeper host address
Examples:
zkcli.sh -zkhost localhost:9983 -cmd bootstrap -solrhome /opt/solr
zkcli.sh -zkhost localhost:9983 -cmd upconfig -confdir /opt/solr/collection1/conf -confname myconf
zkcli.sh -zkhost localhost:9983 -cmd downconfig -confdir /opt/solr/collection1/conf -confname myconf
zkcli.sh -zkhost localhost:9983 -cmd linkconfig -collection collection1 -confname myconf
zkcli.sh -zkhost localhost:9983 -cmd makepath /apache/solr
zkcli.sh -zkhost localhost:9983 -cmd put /solr.conf 'conf data'
zkcli.sh -zkhost localhost:9983 -cmd putfile /solr.xml /User/myuser/solr/solr.xml
zkcli.sh -zkhost localhost:9983 -cmd get /solr.xml
zkcli.sh -zkhost localhost:9983 -cmd getfile /solr.xml solr.xml.file
zkcli.sh -zkhost localhost:9983 -cmd clear /solr
zkcli.sh -zkhost localhost:9983 -cmd list
zkcli.sh -zkhost localhost:9983 -cmd clusterprop -name urlScheme -val https
zkcli.sh -zkhost localhost:9983 -cmd updateacls /solr
&lt;/arg&gt;&lt;/arg&gt;&lt;/arg&gt;&lt;/arg&gt;&lt;/arg&gt;&lt;/arg&gt;&lt;/arg&gt;&lt;/arg&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Aşağıdaki şekilde yaptığımız değişiklikleri Zookeeper'a gönderiyoruz.
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
solr-6.0.0-&amp;gt; ./server/scripts/cloud-scripts/zkcli.sh -zkhost localhost:9983 -cmd upconfig -confdir server/solr/configsets/data_driven_schema_configs/conf -confname gettingstarted
&lt;/code&gt;&lt;/pre&gt;
Yaptığımız değişikliklerin yansıması için;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
curl http://localhost:8983/solr/admin/collections?name=gettingstarted&amp;amp;action=RELOAD&amp;amp;wt=json
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Bundan sonra shar sayısı ve diğer bütün ayarlar için şuraya bir göz atmak gerekiyor;

&lt;a href="https://cwiki.apache.org/confluence/display/solr/Collections+API" rel="nofollow"&gt;https://cwiki.apache.org/confluence/display/solr/Collections+API&lt;/a&gt;

Temel bir şeyleri yazalım. &lt;br /&gt;&lt;br /&gt;Backup;

Sunucu da öncelikle örnek bir dizin açalım. Daha sonra bu dizine "solr" kullanıcısı için yazma yetkisi verelim 
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
mkdir -p /home/backup/solr 
sudo chown solr:solr /home/backup/solr
curl http://localhost:8983/solr/admin/collections?action=BACKUP&amp;amp;name=gettingstarted&amp;amp;collection=gettingstarted&amp;amp;location=/home/backup/solr&amp;amp;async=1000
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
async komutu ile arka planda bu süreç çalışmaya devam edecek. Daha sonra ürecin durumunu öğrenmek için 
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
curl http://localhost:8983/solr/admin/collections?action=REQUESTSTATUS&amp;amp;requestid=1000
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Süreci farklı şekilde gözden geçirmek adına, hızlıca bir collection oluşturalım;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
solr-6.0.0-&amp;gt; bin/solr create_collection -shards 2 -replicationFactor 2 -c test -d server/solr/configsets/data_driven_schema_configs
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Bu collection için 2 shard oluşturduk. replicationFactor ise 3 dedik. Şu demek;

Bütün datamız ikiye bölünecek. (shard sayısı) replicationFactor ise datanın kaç katı alan kullanacağımızı belirliyor.&lt;br /&gt;
&lt;br /&gt;
Datanın toplam boyutu * replicationFactor kadar yerimiz olmalı. 

"replicationFactor" 2 olduğunda her sunucuda birebir kopya var demek. 3 olduğunda ek olarak birer "shard"'ın daha kopyası elimizde demek. 4 desek her "shard"'ın 2 yedeği olacak demek.

"shard" sayısını daha sonra artırabilirsiniz. Mevcut "shard"ları bölebilirsiniz. API linkinde bu bilgiler mevcut.

Aşağıdaki örnek data basımı yaptık. 

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
solr-6.0.0-&amp;gt; bin/post -c test3 example/films

solr-6.0.0-&amp;gt; bin/post -h

Usage: post -c &lt;collection&gt; [OPTIONS] &lt;files d="" directories="" urls=""&gt;
    or post -help

   collection name defaults to DEFAULT_SOLR_COLLECTION if not specified

OPTIONS
=======
  Solr options:
    -url &lt;base solr="" update="" url=""&gt;&lt;/base&gt; (overrides collection, host, and port)
    -host &lt;host&gt; (default: localhost)
    -p or -port &lt;port&gt; (default: 8983)
    -commit yes|no (default: yes)

  Web crawl options:
    -recursive &lt;depth&gt; (default: 1)
    -delay &lt;seconds&gt; (default: 10)

  Directory crawl options:
    -delay &lt;seconds&gt; (default: 0)

  stdin/args options:
    -type &lt;content type=""&gt; (default: application/xml)

  Other options:
    -filetypes &lt;type&gt;[,&lt;type&gt;,...] (default: xml,json,jsonl,csv,pdf,doc,docx,ppt,pptx,xls,xlsx,odt,odp,ods,ott,otp,ots,rtf,htm,html,txt,log)
    -params "&lt;key&gt;=&lt;value&gt;[&amp;amp;&lt;key&gt;=&lt;value&gt;...]" (values must be URL-encoded; these pass through to Solr update request)
    -out yes|no (default: no; yes outputs Solr response to console)
    -format solr (sends application/json content as Solr commands to /update instead of /update/json/docs)


Examples:

* JSON file: bin/post -c wizbang events.json
* XML files: bin/post -c records article*.xml
* CSV file: bin/post -c signals LATEST-signals.csv
* Directory of files: bin/post -c myfiles ~/Documents
* Web crawl: bin/post -c gettingstarted http://lucene.apache.org/solr -recursive 1 -delay 1
* Standard input (stdin): echo '{commit: {}}' | bin/post -c my_collection -type application/json -out yes -d
* Data as string: bin/post -c signals -type text/csv -out yes -d $'id,value\n1,0.47'
&lt;/value&gt;&lt;/key&gt;&lt;/value&gt;&lt;/key&gt;&lt;/type&gt;&lt;/type&gt;&lt;/content&gt;&lt;/seconds&gt;&lt;/seconds&gt;&lt;/depth&gt;&lt;/port&gt;&lt;/host&gt;&lt;/files&gt;&lt;/collection&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
➜  solr-6.0.0 du -hs example/cloud/node1/solr/test3_shard1_replica1
 76K example/cloud/node1/solr/test3_shard1_replica1
➜  solr-6.0.0 du -hs example/cloud/node1/solr/test3_shard2_replica2
 64K example/cloud/node1/solr/test3_shard2_replica2
➜  solr-6.0.0 du -hs example/cloud/node1/solr/test3_shard1_replica3
 76K example/cloud/node1/solr/test3_shard1_replica3
➜  solr-6.0.0 du -hs example/cloud/node2/solr/test3_shard2_replica1
 64K example/cloud/node2/solr/test3_shard2_replica1
➜  solr-6.0.0 du -hs example/cloud/node2/solr/test3_shard1_replica2/
 76K example/cloud/node2/solr/test3_shard1_replica2/
➜  solr-6.0.0 du -hs example/cloud/node2/solr/test3_shard2_replica3
 64K example/cloud/node2/solr/test3_shard2_replica3
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://4.bp.blogspot.com/-wttMFX-02Io/V_Apsz9L1DI/AAAAAAABHFs/a6voiVN1hTk0pjAHxrIibdQxRC5VfXl-QCLcB/s1600/Screen%2BShot%2B2016-10-02%2Bat%2B00.12.03.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="220" src="https://4.bp.blogspot.com/-wttMFX-02Io/V_Apsz9L1DI/AAAAAAABHFs/a6voiVN1hTk0pjAHxrIibdQxRC5VfXl-QCLcB/s400/Screen%2BShot%2B2016-10-02%2Bat%2B00.12.03.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://2.bp.blogspot.com/-hhe9NG3SDy4/V_AptHaHHAI/AAAAAAABHFw/KuXCAulZWnsYOQqfhmZt0F7iwFtKuOrugCLcB/s1600/Screen%2BShot%2B2016-10-02%2Bat%2B00.24.12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="240" src="https://2.bp.blogspot.com/-hhe9NG3SDy4/V_AptHaHHAI/AAAAAAABHFw/KuXCAulZWnsYOQqfhmZt0F7iwFtKuOrugCLcB/s400/Screen%2BShot%2B2016-10-02%2Bat%2B00.24.12.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Umarım faydası olur :)</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://4.bp.blogspot.com/-wttMFX-02Io/V_Apsz9L1DI/AAAAAAABHFs/a6voiVN1hTk0pjAHxrIibdQxRC5VfXl-QCLcB/s72-c/Screen%2BShot%2B2016-10-02%2Bat%2B00.12.03.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Ölü XML den Diri XML çıkarmak :)</title><link>http://volkanaltan.blogspot.com/2016/06/olu-xml-den-diri-xml-ckarmak.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Wed, 1 Jun 2016 23:48:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-7952801643949484632</guid><description>&lt;a href="https://www.vitringez.com/"&gt;VitrinGez&lt;/a&gt;'de yoğun bir şekilde XML işliyoruz. Ancak firmalardan çoğu zaman düzgün çalışan XML alamıyoruz. Koskoca firmaya XML'i düzeltir misin de diyemiyorsunuz!&lt;br /&gt;
&lt;br /&gt;
Biz &lt;b&gt;bazı&lt;/b&gt; firmalardan XML alamayınca siteyi crawl ediyoruz. Bunun içinde &lt;a href="http://scrapy.org/" rel="nofollow"&gt;scrapy&lt;/a&gt; kullanıyoruz. Scrapy kullanırken bozuk XML lerde dahi çalıştığını farkettim. O zaman kaynak kodu inceledim.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://github.com/scrapy/scrapy/blob/master/scrapy/utils/iterators.py#L18"&gt;https://github.com/scrapy/scrapy/blob/master/scrapy/utils/iterators.py#L18&lt;/a&gt;


&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
def xmliter(obj, nodename):
    """Return a iterator of Selector's over all nodes of a XML document,
       given the name of the node to iterate. Useful for parsing XML feeds.
    obj can be:
    - a Response object
    - a unicode string
    - a string encoded as utf-8
    """
    nodename_patt = re.escape(nodename)

    HEADER_START_RE = re.compile(r'^(.*?)&amp;lt;\s*%s(?:\s|&amp;gt;)' % nodename_patt, re.S)
    HEADER_END_RE = re.compile(r'&amp;lt;\s*/%s\s*&amp;gt;' % nodename_patt, re.S)
    text = _body_or_str(obj)

    header_start = re.search(HEADER_START_RE, text)
    header_start = header_start.group(1).strip() if header_start else ''
    header_end = re_rsearch(HEADER_END_RE, text)
    header_end = text[header_end[1]:].strip() if header_end else ''

    r = re.compile(r'&amp;lt;%(np)s[\s&amp;gt;].*?&amp;lt;/%(np)s&amp;gt;' % {'np': nodename_patt}, re.DOTALL)
    for match in r.finditer(text):
        nodetext = header_start + match.group() + header_end
        yield Selector(text=nodetext, type='xml').xpath('//' + nodename)[0]
&lt;/code&gt;&lt;/pre&gt;
Yukarıda gördüğünüz üzere yapılan iş aslında çok basit. 

Önce xml'i küçük parçalara ayıyor. Sonra her birini bağımsız birer xml elemanı gibi kontrol ediyor.
Mesela aşağıdaki gibi bir XML yapımız olsun. Dikkat ederseniz ID 5 olan kısımda etiketi bozuk oluşturdum. Büyük bir XML dosyamız olsa küçücük bir kısım yüzünden bütün XML çöp oluyor.

Kodları gist'e koydum. Buradan inceleyebilirsiniz.
&lt;a href="https://gist.github.com/volkan/0d3af41be13a628201b1cee82246d095"&gt;https://gist.github.com/volkan/0d3af41be13a628201b1cee82246d095&lt;/a&gt;

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
$xml = '

';

echo fixXML($xml, 'product');

function fixXML($xml, $nodeName) {

        $patternTag = sprintf('/&amp;lt;%s[\s&amp;gt;].*?&amp;lt;\/%s&amp;gt;/s', $nodeName, $nodeName);
        preg_match_all($patternTag, $xml, $matches);

        $start = '&lt;root&gt;';
        $end = '&lt;/root&gt;';
        $list = [];
        $wrongItem = [];
        $doc = new \DOMDocument();
        foreach ($matches[0] as $key =&amp;gt; $item) {
            try {
                $tmpXML = $start . $item . $end;
                $status = @$doc-&amp;gt;loadXML($tmpXML);
                if ($status == false) {
                 throw new \Exception;
                }
                $list[] = $item;
            } catch (\Exception $e) {
                $wrongItem[] = $item;
            }
        }

        $xml = $start . implode("\n", $list) . $end;

        return $xml;
}
&lt;/code&gt;&lt;/pre&gt;
</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>SolrCloud kurulumu (ve ZooKeeper)</title><link>http://volkanaltan.blogspot.com/2016/05/solrcloud-kurulumu-ve-zookeeper.html</link><category>Distributed</category><category>Docker</category><category>Fault Tolerance</category><category>HA</category><category>High Availability</category><category>Solr</category><category>SolrCloud</category><category>ZooKeeper</category><author>noreply@blogger.com (Unknown)</author><pubDate>Sun, 29 May 2016 02:11:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-5606055355778582317</guid><description>Solr 4 ile birlikte master-slave mevzusu devam etmekle birlikte &lt;a href="https://cwiki.apache.org/confluence/display/solr/SolrCloud" rel="nofollow"&gt;SolrCloud&lt;/a&gt; olarak birden fazla solr makinenin birleştirilerek hata durumunda en az kayıpla çalışma devam etmesi ve bunlar olurken isteklerin tek bir makineye yönlendirilip arkada geri kalan işleri Solr'un hâlletmesi planlanmış. (fault tolerance and high availability).&lt;br /&gt;
&lt;br /&gt;
Kendi kurulum scripti ile &lt;a href="http://tomcat.apache.org/" rel="nofollow"&gt;tomcat&lt;/a&gt; gibi bir web server kurmadan doğrudan kendi içinde gelen &lt;a href="http://www.eclipse.org/jetty/" rel="nofollow"&gt;jetty&lt;/a&gt; isimli web server ile çalıştırabiliyorsunuz. Cloud yapısındaki datanın senkron olması için&amp;nbsp;&lt;a href="https://zookeeper.apache.org/" rel="nofollow"&gt;ZooKeeper&lt;/a&gt; isimli araç kullanılmakta. Localde test yapmak için&amp;nbsp;ZooKeeper kurmanıza gerek yok. Kendi içinde gömülü geliyor. Ama prod ortam için kurmalısınız. Çünkü solr kapanırsa ZooKeeper da kapanıyor.&lt;br /&gt;
&lt;br /&gt;
Düzenleme: Docker ile bütün işlemler burada:&amp;nbsp;&lt;a href="https://github.com/volkan/docker-solr-cloud"&gt;https://github.com/volkan/docker-solr-cloud&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Basit olarak kurup çalıştırmak için &lt;a href="https://cwiki.apache.org/confluence/display/solr/Getting+Started+with+SolrCloud" rel="nofollow"&gt;şurada&lt;/a&gt; anlatılan işlemleri yapıyoruz. Özetlersek;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
wget https://archive.apache.org/dist/lucene/solr/5.5.1/solr-5.5.1.tgz
tar zxvf solr-5.5.1.tgz
cd solr-5.5.1
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
bin/solr -e cloud
&lt;/code&gt;&lt;/pre&gt;
Buradan sonra gelen bütün seçenekleri enter'e basarak geçin. Sorunsuz bir şekilde kurulması gerekiyor.
Aşağıdaki şekilde durumu kontrol edebilirsiniz.
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
bin/solr status
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Bizim asıl amacımız &lt;a href="https://cwiki.apache.org/confluence/display/solr/Taking+Solr+to+Production" rel="nofollow"&gt;Production&lt;/a&gt; ortamında bunu kurmak. Şimdi onun için başlıyoruz. Örnekler Centos 6 için anlatılacaktır.
&lt;br /&gt;
Öncelikle varsa iptables stop edin yok yapamam diyorsanız şu kuralları kuracağınız bütün makinelere ekleyin;

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
vi /etc/sysconfig/iptables
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
-A OUTPUT -j ACCEPT
-A INPUT -p tcp --dport 2181 -j ACCEPT
-A INPUT -p tcp --dport 2182 -j ACCEPT
-A INPUT -p tcp --dport 2183 -j ACCEPT
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
yum install lsof -y
yum install java-1.7.0-openjdk java-1.7.0-openjdk-devel -y #java 1.7 yoksa
yum install -y system-config-services #docker için
useradd solr
cd /opt
wget https://archive.apache.org/dist/lucene/solr/5.5.1/solr-5.5.1.tgz
tar xzf solr-5.5.1.tgz &amp;amp;&amp;amp; solr-5.5.1/bin/install_solr_service.sh --strip-components=2
bash solr-5.5.1/bin/install_solr_service.sh solr-5.5.1.tgz
service solr start
chown solr:solr /var/solr -R #Solr home directory /var/solr/data not found! Gibi bir sorun çıkarsa
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Aşağıdaki çıktı ilk güzel haber :)
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
[root@9afe0af76150 opt]# service solr start
Waiting up to 30 seconds to see Solr running on port 8983 [-]
Started Solr server on port 8983 (pid=877). Happy searching!
&lt;/code&gt;&lt;/pre&gt;
Şimdi aynı makinede solr sayısını ikiye çıkaralım.

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
cd /opt
bash solr-5.5.1/bin/install_solr_service.sh solr-5.5.1.tgz -s solr2 -p 8984
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
Waiting up to 30 seconds to see Solr running on port 8984 [-]
Started Solr server on port 8984 (pid=1072). Happy searching!
&lt;/code&gt;&lt;/pre&gt;
Burada işimiz şimdilik bitti. ZooKeeper kurulumuna geçiyoruz örnek olması için tek makinede birden fazla makineye kuruyormuş gibi anlatıyorum;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
cd /opt
wget http://mirror.vorboss.net/apache/zookeeper/current/zookeeper-3.4.8.tar.gz
tar xzf zookeeper-3.4.8.tar.gz
cp -R /opt/zookeeper-3.4.8/ /opt/zookeeper-3.4.8-2
cp -R /opt/zookeeper-3.4.8/ /opt/zookeeper-3.4.8-3
ln -s /opt/zookeeper-3.4.8/ /opt/zookeeper
ln -s /opt/zookeeper-3.4.8-2/ /opt/zookeeper2
ln -s /opt/zookeeper-3.4.8-3/ /opt/zookeeper3
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
vi /usr/local/sbin/zkrun
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
nano veya vi ile açtığınız dosyaya aşağıdaki kodu yerleştirin. 
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
#!/bin/sh

# chkconfig: - 75 50
# description: Starts and stops Zookeeper

cd /opt/zookeeper
bin/zkServer.sh $1
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
cp /usr/local/sbin/zkrun /usr/local/sbin/zkrun2
cp /usr/local/sbin/zkrun /usr/local/sbin/zkrun3
chmod +x /usr/local/sbin/zkru*
&lt;/code&gt;&lt;/pre&gt;
zkrun2 ve zkrun3 için "cd /opt/zookeeper" kısmını "cd /opt/zookeeper2" ve "cd /opt/zookeeper3" olarak değiştirin.

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
ln -s /usr/local/sbin/zkrun /etc/init.d/zookeeper
ln -s /usr/local/sbin/zkrun2 /etc/init.d/zookeeper2
ln -s /usr/local/sbin/zkrun3 /etc/init.d/zookeeper3
chkconfig --add zookeeper
chkconfig --add zookeeper2
chkconfig --add zookeeper3
chkconfig zookeeper on
chkconfig zookeeper2 on
chkconfig zookeeper3 on
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
zoo.cfg leri ayarlamakta sıra;

zoo.cfg dosyası oluşturup içine şunları koyuyoruz
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
vi /opt/zookeeper/conf/zoo.cfg
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
dataDir=/var/lib/zookeeperdata/1
clientPort=2181
initLimit=5
syncLimit=2
server.1=localhost:2888:3888
server.2=localhost:2889:3889
server.3=localhost:2890:3890
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Burada server.1 çok önemli. Çünkü bu sayıya göre data içinde myid dosyası oluşturup değer vereceğiz.
localhost yazan kısım hosts dosyasında yer alan diğer solr sunucularımız olabilirdi. Ben de bu kısım şöyle;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
server.1=solr1:2888:3888
server.2=solr2:2889:3889
server.3=solr3:2890:3890
&lt;/code&gt;&lt;/pre&gt;
/opt/zookeeper/conf/zoo.cfg dosyasını diğer zookeeper lara kopyalıyoruz. 
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
cp /opt/zookeeper/conf/zoo.cfg /opt/zookeeper2/conf/zoo.cfg 
cp /opt/zookeeper/conf/zoo.cfg /opt/zookeeper3/conf/zoo.cfg 
&lt;/code&gt;&lt;/pre&gt;
Şimdi /opt/zookeeper2/conf/zoo.cfg ve /opt/zookeeper3/conf/zoo.cfg  dosyasında yer alan "dataDir" ve "clientPort" kısmında 1 yazan yerleri sırasıyla 2 ve üç yapıyoruz. portlarıda 2182,2183


&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
mkdir -p /var/lib/zookeeperdata/1 mkdir -p /var/lib/zookeeperdata/2 mkdir -p /var/lib/zookeeperdata/3
echo 1 &amp;gt; /var/lib/zookeeperdata/1/myid
echo 2 &amp;gt; /var/lib/zookeeperdata/2/myid
echo 3 &amp;gt; /var/lib/zookeeperdata/3/myid

service zookeeper start &amp;amp;&amp;amp; service zookeeper2 start &amp;amp;&amp;amp; service zookeeper3 start
&lt;/code&gt;&lt;/pre&gt;
ZooKeeper da tamamlandı. Kontrol için aşağıdaki komutu yazıp ilgili çıktıyı görmeliyiz
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
[root@9afe0af76150 opt]# service zookeeper status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper/bin/../conf/zoo.cfg
Mode: follower
[root@9afe0af76150 opt]# service zookeeper2 status
ZooKeeper JMX enabled by default
Using config: /opt/zookeeper2/bin/../conf/zoo.cfg
Mode: leader
&lt;/code&gt;&lt;/pre&gt;
Şimdi Solr'a bu ZooKeeper'ları tanımlama zamanı.


/etc/default/solr.in.sh ve /etc/default/solr2.in.sh dosyalarını açıp ZK_HOST alanındaki yorum kısmını kaldırıyoruz. Buraya şunu yazıyoruz;

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
ZK_HOST="localhost:2181,localhost:2182,localhost:2183"
&lt;/code&gt;&lt;/pre&gt;
Sonra solrları restart ediyoruz.
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
service solr restart
service solr2 restart
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Hemen ilk collectionumuzu oluşturuyoruz.

&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
[root@9afe0af76150 opt]# bash /opt/solr/bin/solr create_collection -shards 2 -replicationFactor 2 -c product2 -d /opt/solr-5.5.1/server/solr/configsets/data_driven_schema_configs

Connecting to ZooKeeper at localhost:2181,localhost:2182,localhost:2183 ...
Uploading /opt/solr-5.5.1/server/solr/configsets/data_driven_schema_configs/conf for config product2 to ZooKeeper at localhost:2181,localhost:2182,localhost:2183

Creating new collection 'product2' using command:
http://localhost:8984/solr/admin/collections?action=CREATE&amp;amp;name=product2&amp;amp;numShards=2&amp;amp;replicationFactor=2&amp;amp;maxShardsPerNode=2&amp;amp;collection.configName=product2

{
  "responseHeader":{
    "status":0,
    "QTime":31629},
  "success":{
    "172.17.0.2:8984_solr":{
      "responseHeader":{
        "status":0,
        "QTime":21578},
      "core":"product2_shard1_replica2"},
    "172.17.0.2:8983_solr":{
      "responseHeader":{
        "status":0,
        "QTime":21819},
      "core":"product2_shard2_replica1"}}}
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Bu arada configde değişiklik yapmak için /opt/solr/server/scripts/cloud-scripts/zkcli.sh dosyasını kullanabilirsiniz. Örnek şemamız dinamik field yapısını desteklediği için direk kullanmaya başlayabilirsiniz. 
&lt;br /&gt;
PHP tarafında &lt;a href="https://github.com/solariumphp/solarium" rel="nofollow"&gt;solarium&lt;/a&gt; isimli kütüphaneyi önerebilirim.




&lt;br /&gt;
&lt;br /&gt;
Aşağıdaki çıktıyı şu &lt;a href="http://ip:8983/solr/#/~cloud" rel="nofollow"&gt;linke&lt;/a&gt; tıkladığınızda görürsünüz inşaallah :)&lt;br /&gt;
Not: Uygun vakitte Docker olarak kurulumu hazırlayıp buradan paylaşacağım.&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="https://2.bp.blogspot.com/-MbhW_0iXI4M/V0old_ovT1I/AAAAAAAA3EY/olro38FILMkyv-7U1l82EgGU_UJBc8QywCLcB/s1600/Screen%2BShot%2B2016-05-29%2Bat%2B02.07.56.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="71" src="https://2.bp.blogspot.com/-MbhW_0iXI4M/V0old_ovT1I/AAAAAAAA3EY/olro38FILMkyv-7U1l82EgGU_UJBc8QywCLcB/s320/Screen%2BShot%2B2016-05-29%2Bat%2B02.07.56.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="https://2.bp.blogspot.com/-MbhW_0iXI4M/V0old_ovT1I/AAAAAAAA3EY/olro38FILMkyv-7U1l82EgGU_UJBc8QywCLcB/s72-c/Screen%2BShot%2B2016-05-29%2Bat%2B02.07.56.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>AWS Elastic Beanstalk Hakkında Kısa Notlar</title><link>http://volkanaltan.blogspot.com/2016/05/aws-elastic-beanstalk-hakknda-ksa.html</link><category>Auto Scale</category><category>Aws</category><category>Elastic Beanstalk</category><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 13 May 2016 00:33:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-8251898656045659973</guid><description>AWS Elastic Beanstalk Hakkında Kısa Notlar hazırladım. Şuradan ulaşabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="https://medium.com/@volkana/aws-elastic-beanstalk-hakk%C4%B1nda-k%C4%B1sa-notlar-5302bf56a2c7#.4m74enq9x"&gt;https://medium.com/@volkana/aws-elastic-beanstalk-hakk%C4%B1nda-k%C4%B1sa-notlar-5302bf56a2c7#.4m74enq9x&lt;/a&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Verileri Cloud Ortamlarda Aktarma</title><link>http://volkanaltan.blogspot.com/2016/03/verileri-cloud-ortamlarda-aktarma.html</link><category>Amazon</category><category>Cloud</category><category>Drive</category><category>Dropbox</category><category>Google</category><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 18 Mar 2016 19:44:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-1407219301637441374</guid><description>Şimdiye kadar disklerde çok veri kaybeden biri olarak uzun zamandır sanal disklerde verilerimi tutuyorum. Bu işe ilk &lt;a href="http://dropbox.com/" rel="nofollow" target="_blank"&gt;DropBox&lt;/a&gt; ile başladım. Daha sonra &lt;a href="https://www.amazon.com/clouddrive/pricing?ref_=cd_lm_navpricing" rel="nofollow" target="_blank"&gt;Amazon'un 3 ay bedava sonra yıllığı $59.99&lt;/a&gt; olan paketini aldım. Bütün verilerimi buraya yükledim. Biraz uzun sürdü ama sonuçta işler bitmişti. O sıralarda Android işletim sistemine sahip bir telefon kullanıyordum. Bunun Amazon Photos ve Amazon Cloud Drive uygulamaları işimi görüyordu.&lt;br /&gt;
&lt;br /&gt;
Bir süre önce iphone bir telefona geçtim. Bu telefonla çektiğim 2 dakikalık videoların bile Amazon'a saatlerce gönderilemediğini farkettim. Biraz araştırınca son zamanlarda upload konularında amazonla ilgili ciddi sıkıntılar olduğunu gördüm. (Türkiye'ye özgü de olabilir.)&lt;br /&gt;
&lt;br /&gt;
Amazon destek ekibiyle görüşüp çözümler aradık. Bir de üzerine Amazon Cloud Drive uygulamasının iphone da ses dosyalarını cloud'a gönderememesi beni iyice rahatsız etti.&lt;br /&gt;
Bu sırada alternatif olarak görebildiğim &lt;a href="https://www.google.com.tr/intl/tr/drive/" rel="nofollow" target="_blank"&gt;Google Drive&lt;/a&gt;'a aynı dosyaları upload ederek test ettim. Sonuç çok iyiydi. 100 GB limitli aylık $1.99 olan bir paket satın aldım. Aslında &lt;a href="https://www.dropbox.com/" rel="nofollow" target="_blank"&gt;DropBox&lt;/a&gt; üzerinde 100GB seçeneği olsaydı onu tercih ederdim. Ancak bu seçenek mevcut değil.&lt;br /&gt;
&lt;br /&gt;
Sonuç olarak Amazon Cloud hesabımı iptal etme kararı aldım. Amazon'a durumu yazdım. 3 ay bedava kullanım sonrasında 3 ay da ödeme ile kullandığım hâlde hiç kesinti yapmadan &lt;b&gt;paranın tamamını&lt;/b&gt; iade edeceklerini söylediler. Müşteri memnuniyetinde çağ atlayan bir firma olan Amazon'a teşekkürlerimi sunuyorum.&lt;br /&gt;
&lt;br /&gt;
Ben bütün datalarımı taşımak için &lt;a href="https://www.digitalocean.com/" rel="nofollow" target="_blank"&gt;DigitalOcean&lt;/a&gt; firmasında $10 dolarlık bir makine oluşturup &lt;a href="http://rclone.org/" rel="nofollow" target="_blank"&gt;rclone&lt;/a&gt; uygulaması ile ekstra yere ihtiyaç duymaksızın bütün datayı taşımaya başladım. Belki $5 lık bir makine de iş görecekti. Sonuç olarak şimdiye kadar ara ara hata mesajları alsamda transfer iyi gidiyor. Zaten sorun çıksada rclon sync komutu ile olmayan dosyaları senkron edebileceğimi biliyorum.&lt;br /&gt;
&lt;br /&gt;
Umarım bu bilgiler işinize yarar :)&lt;br /&gt;
&lt;br /&gt;
Düzenleme: DigitalOceans da açtığım makine bir gece çalıştı. Bu nedenle saat ücretlendirilmesi oldu. Çok düşük bir miktar. Ayrıca dublicate dosyaları silmek için şu kodu kullandım&amp;nbsp;&lt;a href="https://github.com/ncw/rclone/issues/329#issuecomment-196046151" rel="nofollow"&gt;https://github.com/ncw/rclone/issues/329#issuecomment-196046151&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><enclosure length="-1" type="application/json" url="http://dropbox.com/"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>Şimdiye kadar disklerde çok veri kaybeden biri olarak uzun zamandır sanal disklerde verilerimi tutuyorum. Bu işe ilk DropBox ile başladım. Daha sonra Amazon'un 3 ay bedava sonra yıllığı $59.99 olan paketini aldım. Bütün verilerimi buraya yükledim. Biraz uzun sürdü ama sonuçta işler bitmişti. O sıralarda Android işletim sistemine sahip bir telefon kullanıyordum. Bunun Amazon Photos ve Amazon Cloud Drive uygulamaları işimi görüyordu. Bir süre önce iphone bir telefona geçtim. Bu telefonla çektiğim 2 dakikalık videoların bile Amazon'a saatlerce gönderilemediğini farkettim. Biraz araştırınca son zamanlarda upload konularında amazonla ilgili ciddi sıkıntılar olduğunu gördüm. (Türkiye'ye özgü de olabilir.) Amazon destek ekibiyle görüşüp çözümler aradık. Bir de üzerine Amazon Cloud Drive uygulamasının iphone da ses dosyalarını cloud'a gönderememesi beni iyice rahatsız etti. Bu sırada alternatif olarak görebildiğim Google Drive'a aynı dosyaları upload ederek test ettim. Sonuç çok iyiydi. 100 GB limitli aylık $1.99 olan bir paket satın aldım. Aslında DropBox üzerinde 100GB seçeneği olsaydı onu tercih ederdim. Ancak bu seçenek mevcut değil. Sonuç olarak Amazon Cloud hesabımı iptal etme kararı aldım. Amazon'a durumu yazdım. 3 ay bedava kullanım sonrasında 3 ay da ödeme ile kullandığım hâlde hiç kesinti yapmadan paranın tamamını iade edeceklerini söylediler. Müşteri memnuniyetinde çağ atlayan bir firma olan Amazon'a teşekkürlerimi sunuyorum. Ben bütün datalarımı taşımak için DigitalOcean firmasında $10 dolarlık bir makine oluşturup rclone uygulaması ile ekstra yere ihtiyaç duymaksızın bütün datayı taşımaya başladım. Belki $5 lık bir makine de iş görecekti. Sonuç olarak şimdiye kadar ara ara hata mesajları alsamda transfer iyi gidiyor. Zaten sorun çıksada rclon sync komutu ile olmayan dosyaları senkron edebileceğimi biliyorum. Umarım bu bilgiler işinize yarar :) Düzenleme: DigitalOceans da açtığım makine bir gece çalıştı. Bu nedenle saat ücretlendirilmesi oldu. Çok düşük bir miktar. Ayrıca dublicate dosyaları silmek için şu kodu kullandım&amp;nbsp;https://github.com/ncw/rclone/issues/329#issuecomment-196046151</itunes:subtitle><itunes:author>noreply@blogger.com (Unknown)</itunes:author><itunes:summary>Şimdiye kadar disklerde çok veri kaybeden biri olarak uzun zamandır sanal disklerde verilerimi tutuyorum. Bu işe ilk DropBox ile başladım. Daha sonra Amazon'un 3 ay bedava sonra yıllığı $59.99 olan paketini aldım. Bütün verilerimi buraya yükledim. Biraz uzun sürdü ama sonuçta işler bitmişti. O sıralarda Android işletim sistemine sahip bir telefon kullanıyordum. Bunun Amazon Photos ve Amazon Cloud Drive uygulamaları işimi görüyordu. Bir süre önce iphone bir telefona geçtim. Bu telefonla çektiğim 2 dakikalık videoların bile Amazon'a saatlerce gönderilemediğini farkettim. Biraz araştırınca son zamanlarda upload konularında amazonla ilgili ciddi sıkıntılar olduğunu gördüm. (Türkiye'ye özgü de olabilir.) Amazon destek ekibiyle görüşüp çözümler aradık. Bir de üzerine Amazon Cloud Drive uygulamasının iphone da ses dosyalarını cloud'a gönderememesi beni iyice rahatsız etti. Bu sırada alternatif olarak görebildiğim Google Drive'a aynı dosyaları upload ederek test ettim. Sonuç çok iyiydi. 100 GB limitli aylık $1.99 olan bir paket satın aldım. Aslında DropBox üzerinde 100GB seçeneği olsaydı onu tercih ederdim. Ancak bu seçenek mevcut değil. Sonuç olarak Amazon Cloud hesabımı iptal etme kararı aldım. Amazon'a durumu yazdım. 3 ay bedava kullanım sonrasında 3 ay da ödeme ile kullandığım hâlde hiç kesinti yapmadan paranın tamamını iade edeceklerini söylediler. Müşteri memnuniyetinde çağ atlayan bir firma olan Amazon'a teşekkürlerimi sunuyorum. Ben bütün datalarımı taşımak için DigitalOcean firmasında $10 dolarlık bir makine oluşturup rclone uygulaması ile ekstra yere ihtiyaç duymaksızın bütün datayı taşımaya başladım. Belki $5 lık bir makine de iş görecekti. Sonuç olarak şimdiye kadar ara ara hata mesajları alsamda transfer iyi gidiyor. Zaten sorun çıksada rclon sync komutu ile olmayan dosyaları senkron edebileceğimi biliyorum. Umarım bu bilgiler işinize yarar :) Düzenleme: DigitalOceans da açtığım makine bir gece çalıştı. Bu nedenle saat ücretlendirilmesi oldu. Çok düşük bir miktar. Ayrıca dublicate dosyaları silmek için şu kodu kullandım&amp;nbsp;https://github.com/ncw/rclone/issues/329#issuecomment-196046151</itunes:summary><itunes:keywords>Amazon, Cloud, Drive, Dropbox, Google</itunes:keywords></item><item><title>Algoritma verimliliği</title><link>http://volkanaltan.blogspot.com/2016/01/algoritma-verimliligi.html</link><category>Algoritma</category><category>Big O</category><category>Logaritma</category><category>Verimlilik</category><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 22 Jan 2016 19:25:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-3020762061600175434</guid><description>&lt;a href="http://2.bp.blogspot.com/-UkSgmZQG5pE/VqIsbg18TyI/AAAAAAAAAmI/72LnE6B62zw/s1600/speed.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/-UkSgmZQG5pE/VqIsbg18TyI/AAAAAAAAAmI/72LnE6B62zw/s320/speed.png" /&gt;&lt;/a&gt;Algoritma verimliliğini ifade etmek için kullanılan matematiksel ifade büyük &lt;b&gt;O&lt;/b&gt; dur. &lt;br /&gt;
Bu konuyu iyi kavrarsak kuracağımız her mantık, yazacağımız her kod kendini bize doğrudan verimlilik açısından açmış olacak.&lt;br /&gt;
Bu matematiksel terimle yapılan hız hesaplaması işlemciden bağımsız olduğu için bakan herkesin aklında aynı şeyi ifade eder.&lt;br /&gt;
&lt;br /&gt;
Bir algoritmanın çözüm süresi genellikle giren eleman büyüklüğü ile ilişkilidir. Biz buna&amp;nbsp;&lt;b&gt;N&lt;/b&gt; diyoruz. &lt;b&gt;N&lt;/b&gt; büyüdükçe algoritmanın çalışma hızının değişimini ifade etmek için aşağıda gibi bazı ifadeler kullanılır.&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs php"&gt;
O(1)
O(log n)
O(N)
O(N log N)
O(N^2)
&lt;/code&gt;&lt;/pre&gt;
&lt;br /&gt;
Şimdi konuya gerçek hayattan bir örnekle devam edelim!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Olay;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Genişbant interneti olan bir vatandaş 300MB'lık bir dosyayı 120 KM uzaklıktaki bir yere göndermek için internet ve ayağına usb bellek bağladığı bir güvercin kullanıyor. Güvercin hedefe ulaştığında internetten gönderilen dosyanın henüz %24'ü tamamlanmış.&lt;br /&gt;
&lt;br /&gt;
Bizi ilgilendiren kısmı şu, biz gönderdiğimiz dosyanın boyutunu internetten ve güvercinin ayağındaki USB bellekte artırdığımızda ne olacak?&lt;br /&gt;
&lt;br /&gt;
USB de yapılan dosya boyut artırımı hız olarak hiç bir etkide bulunmayacaktır! -USB sonsuz değil abartmayalım lütfen :) -&lt;br /&gt;
Ancak internette gönderilen dosyada yapılan artırım dosya boyutu kadar fark yapacaktır.&lt;br /&gt;
&lt;br /&gt;
İşte USB de yapılan artırım etkisi olmadığı için &lt;b&gt;O(1)&lt;/b&gt; olarak ifade edilir. İnternette yapılan artırım ise boyuta bağlı olarak hız değişeceği için &lt;b&gt;O(N)&lt;/b&gt; olarak ifade edilir.&lt;br /&gt;
&lt;br /&gt;
Bu hesaplamalarda N ile birlikte başka &lt;b&gt;değişkenler&lt;/b&gt; ve &lt;b&gt;sabitler&lt;/b&gt; olabilir. Ancak en büyük değer dışındaki bütün değerler atılır. Çünkü &lt;b&gt;N&lt;/b&gt; büyüdükçe diğer değişkenlerin büyüme hız ihmal edilebilecek kadar küçük kalmaktadır.&lt;br /&gt;
&lt;br /&gt;
Biraz kod örnekleri ile baştan başlayalım;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs php"&gt;
$n = 10;
$tour = 0;
for ($i = 0; $i &amp;lt; $n; $i++) {
    echo $i . PHP_EOL;
    $tour++;
}

echo sprintf('Tur Sayısı: %s', $tour) . PHP_EOL;
//10
&lt;/code&gt;&lt;/pre&gt;
Bu algoritma O(N) sürede çalışacaktır. 
Tur sayısı N ile eşittir.


&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs php"&gt;
$n = 10;
$array = [];
$tour = 0;
for ($i = 0; $i &amp;lt; $n; $i++) {
    for ($j = 0; $j &amp;lt; $n; $j++) {
        $array[$i][$j] = $i+$j;
        $tour++;
    }
}

echo sprintf('Tur Sayısı: %s', $tour) . PHP_EOL;
//100
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class="hljs php"&gt;
$n = 5;
$tour = 0;
for ($i = 0; $i &amp;lt; $n; $i++) {
    for ($j = 0; $j &amp;lt; $n; $j++) {
        $tour++;
    }
}

echo sprintf('Tur Sayısı: %s', $tour) . PHP_EOL;
//25
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class="hljs php"&gt;
$n = range(0, 10);
$count = count($n);
//N*(N-1)/2
echo $count*($count-1)/2 . PHP_EOL;

$tour = 0;
for ($i = 0; $i &amp;lt; $count; $i++) {
    $j = 0;
    while ($n[$i] != $n[$j]) {
        $j = $j + 1;
        $tour++;
    }
}

echo sprintf('Tur Sayısı: %s', $tour) . PHP_EOL;
//55
&lt;/code&gt;&lt;/pre&gt;

Bu üç algoritma O(N^2) sürede çalışacaktır.
Tur sayısı n sayısının karesi olacaktır. Daha önce bahsettiğimiz sabitlerin ve küçük kısımların atılması kuralı gereği O(N*(N-1)/2) yerine direk O(N^2) diyoruz.

&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs php"&gt;
$a = range(0, 5);
$b = range(0, 3);

$tour = 0;
for ($i = 0; $i &amp;lt; count($a)-1; $i++) {
    for ($j = 0; $j &amp;lt; count($b)-1; $j++) {
        $tour++;
    }
}

echo sprintf('Tur Sayısı: %s', $tour) . PHP_EOL;
//15
&lt;/code&gt;&lt;/pre&gt;
Bu algoritma O(a*b) sürede çalışacaktır.

&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="php"&gt;
$n = 10;
$tour = 0;
while ($n &amp;gt;= 1) {
    echo $n . PHP_EOL;
    $n = $n / 2;
    $tour++;
}

echo sprintf('Tur Sayısı: %s', $tour) . PHP_EOL;
//4
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class="hljs php"&gt;
$n = 20;
$tour = 0;
while ($n &amp;gt;= 1) {
    echo $n . PHP_EOL;
    $n = $n / 2;
    $tour++;
}

echo sprintf('Tur Sayısı: %s', $tour) . PHP_EOL;
//5
&lt;/code&gt;&lt;/pre&gt;
Bu algoritma O(log(N)) sürede çalışacaktır. &lt;br /&gt;
İşlem sayısı her defasında kendini ikiye &lt;b&gt;bölerek&lt;/b&gt; ilerliyor, katlayarak ilerlemenin tersi. &lt;br /&gt;
İkinci örnekte N iki katına çıkmasına rağmen tur sayısı yalnızca 1 artmıştır. &lt;br /&gt;
20 log 10 = 1.3, 30 log 10 = 1.47, 40 log 10 = 1.60 şeklinde ilerliyor. &lt;br /&gt;
N = 20 ve N = 30 arasında yalnızca 5 tur atılırken N = 40 olduğunda 6. tura geçiliyor. Tur sayısı, sayı oranına göre çok küçük bir miktarda artış meydana getiriyor.
&lt;br /&gt;
&lt;br /&gt;
Burada şunu sorabilirsiniz log tabanı kaç? Aslında bunun hiç bir önemi yok. Taban yazılmadığı zaman 10 kabul ediliyor. Ama bu iki veya 10 olabilir. Kurallar gereği bunlara takılmıyoruz. &lt;br /&gt;
&lt;br /&gt;
Kendini çağıran fonksiyonlarda durum nasıl dersiniz?
Adı üstünde kendini çağıran. Bu da kendi sayısı kadar olacaktır.
&lt;br /&gt;
&lt;br /&gt;
Recursive için Faktöriyel güzel bir örnek olacaktır. &lt;br /&gt;
Formül olarak N! = N * (N-1) * (N-2) * (N-3) ... şeklinde gidiyor.

&lt;br /&gt;
&lt;br /&gt;
&lt;pre&gt;&lt;code class="hljs  php"&gt;
function factorial($n, &amp;amp;$tour = 0) {
    $tour++;
    if ($n &amp;lt;= 1) {
        return 1;
    } else {
        return $n * factorial($n-1, $tour);
    }
}

$result = factorial(5, $tour);

echo sprintf('Sonuç: %s Tur Sayısı: %s', $result, $tour) . PHP_EOL;
//Tur Sayısı: 5
&lt;/code&gt;&lt;/pre&gt;
Bu algoritma O(N) sürede çalışacaktır. 
Tur sayısı &lt;b&gt;N&lt;/b&gt; ile eşittir.
&lt;br /&gt;
&lt;br /&gt;
Bu kadar sözden sonra izlemenizi tavsiye edeceğim iki video var;
&lt;br /&gt;
&lt;br /&gt;
1. &lt;a href="https://www.youtube.com/watch?v=Mnk7Oh6mA3w" target="_blank"&gt;Faktöriyel&lt;/a&gt;&lt;br /&gt;
2. &lt;a href="https://www.youtube.com/watch?v=V6mKVRU1evU"&gt;Big O Notations&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Kaynaklar;&lt;/b&gt;
&lt;br /&gt;
&lt;a href="http://www.bbc.com/turkce/haberler/2010/09/100916_pigeon.shtml" target="_blank"&gt;Güvercin ve İnternet&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://tr.wikipedia.org/wiki/B%C3%BCy%C3%BCk_O_g%C3%B6sterimi" target="_blank"&gt;Büyük O gösterimi&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://en.wikipedia.org/wiki/Big_O_notation" target="_blank"&gt;Big O Notation (İngilizce ve daha detaylı olan)&lt;/a&gt;&lt;br /&gt;
&lt;a href="https://www.quora.com/What-is-the-big-O-notation-and-how-do-I-calculate-it" target="_blank"&gt;What is the big O notation and how do I calculate it?&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://2.bp.blogspot.com/-UkSgmZQG5pE/VqIsbg18TyI/AAAAAAAAAmI/72LnE6B62zw/s72-c/speed.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>PHP ile Thread kullanımı</title><link>http://volkanaltan.blogspot.com/2015/09/php-ile-thread-kullanimi.html</link><category>Php</category><category>pthread</category><category>Thread</category><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 11 Sep 2015 15:46:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-6921210942348359093</guid><description>Diyelim ki üç işimiz var ve her biri 1 saniye sürüyor. Normalde arka arkaya çalıştığında bu işlem 3 (üç) saniye sürer. 
Bir sürü işimiz olsun her biri 1 saniyelik. Tek thread lik bir süreçte bu işler arka arkaya bir birini bekleyerek çalışacağı için toplam işlem süresi iş sayısı kadar olacaktır.&lt;br /&gt;
Bunlara işlem sayısı kadar thread açarsak bütün işler 1 saniye sürer.&lt;br /&gt;
&lt;br /&gt;
PHP ile bir örnek yapalım;&lt;br /&gt;
Projede Thread kullanmak için PHP de&amp;nbsp;&lt;a href="https://github.com/krakjoe/pthreads" target="_blank"&gt;pthread&lt;/a&gt; isimli extension yüklemek gerekiyor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;brew install php55-pthreads
&lt;/pre&gt;
&lt;br /&gt;
Bunu yapınca bütün PHP nin ve eklentilerinin yeniden derlenmesi gerektiğini söylemem gerekiyor.&lt;br /&gt;
&lt;br /&gt;
Örnek kullanım:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;
&lt;?php

class WebWork extends Collectable {
    public $result;

    public function run() {
        $sleep = 1;//mt_rand(1, 5);
        $this-&gt;result = $sleep;
        sleep($sleep);
    }

    public function getResult() {
        return $this-&gt;result;
    }
}

echo "basladi\n";
$timer = microtime(true);
$pool = new Pool(4);
$pool-&gt;submit
    (new WebWork());
$pool-&gt;submit
    (new WebWork());
$pool-&gt;submit
    (new WebWork());
$pool-&gt;submit
    (new WebWork());
$pool-&gt;shutdown();

$pool-&gt;collect(function($query){
    var_dump(
        $done = $query-&gt;getResult());
    
    return count($done);
});

printf("islem %f saniye surdu\n", microtime(true)-$timer);
echo "bitti\n";
?&gt;
&lt;/pre&gt;
&lt;br /&gt;
Yukarıdaki kodu isterseniz console isterseniz web üzerinden çalıştırın aynı sonucu alacaksınız. İşlemler yaklaşık olarak 1 saniye sürecek. Eğer thread sayısını 4 yerine 3 yaparsanız doğal olarak süre uzayacak.&lt;br /&gt;
&lt;br /&gt;
Daha fazla örnek için&amp;nbsp;&lt;a href="https://github.com/krakjoe/pthreads/tree/master/examples"&gt;https://github.com/krakjoe/pthreads/tree/master/examples&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>Solr Facet Pivot kullanımı</title><link>http://volkanaltan.blogspot.com/2015/08/solr-facet-pivot-kullanimi.html</link><category>facet</category><category>pivot</category><category>Solr</category><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 28 Aug 2015 14:24:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-2087700617005895439</guid><description>&lt;br /&gt;
&lt;b&gt;İhtiyaç&lt;/b&gt;: Filtrede birden fazla seçim yapıldığında bu seçimlerin hangi seçimlere bağımlı olduğunun bulunması.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Çözüm&lt;/b&gt;: Seçimi yapılan filtrelerin kırılımları solr facet pivot ile kolayca keşfedilebilir.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Örnek&lt;/b&gt; sorgu ve sonucu: 
&lt;pre class="php" name="code"&gt;
http://localhost:8983/solr/browse?wt=json&amp;facet=true&amp;q=*&amp;facet.pivot.mincount=1&amp;facet.pivot={!key%3Dsize-provider-brand-color}facet_attribute_slug_size,facet_provider_url,facet_brand_model_url,facet_color_url
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-H_rDiYo0yjU/VeBB_HI4u0I/AAAAAAAAAiI/iNS5_fcGrJ4/s1600/Screen%2BShot%2B2015-08-28%2Bat%2B14.03.49.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="320" src="http://3.bp.blogspot.com/-H_rDiYo0yjU/VeBB_HI4u0I/AAAAAAAAAiI/iNS5_fcGrJ4/s320/Screen%2BShot%2B2015-08-28%2Bat%2B14.03.49.png" width="257" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;{"responseHeader":{"status":0,"QTime":1},"response":{"numFound":6,"start":0,"docs":[]},"facet_counts":{"facet_queries":{},"facet_fields":{},"facet_dates":{},"facet_ranges":{},"facet_intervals":{},"facet_pivot":{"size-provider-brand-color":[{"field":"facet_attribute_slug_size","value":"m","count":1,"pivot":[{"field":"facet_provider_url","value":"nautica","count":1,"pivot":[{"field":"facet_brand_model_url","value":"nautica","count":1,"pivot":[{"field":"facet_color_url","value":"gri","count":1}]}]}]}]}}}
&lt;/pre&gt;
&lt;br /&gt;
Bu gelen sonuçları arka tarafta işleyip istediğiniz gibi kullanabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Not&lt;/b&gt;: Bu tür işlemler ekstra yük getirecektir. Bu nedenle solrconfig.xml dosyanızın içine benzer sorgularda Listener eklemelisiniz. Böylece "Searcher" açıldığında bu sorgu çalıştırılacak ve sorgular önceden çalıştırılmış olduğundan normalden daha hızlı çalışacaktır. Tabii cache ayarlarının da iyi olması gerekiyor.&lt;br /&gt;
&lt;br /&gt;
Örnek:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;     &lt;listener class="solr.QuerySenderListener" event="newSearcher"&gt;
        &lt;arr name="queries"&gt;
            &lt;lst&gt; &lt;str name="q"&gt;*&lt;/str&gt;
                &lt;str name="qt"&gt;/browse&lt;/str&gt;
                &lt;str name="sort"&gt;
                    sum(product(0.001,score_product_like),
                    product(0.02,score_product_hit),
                    product(0.50, score_provider_boost),
                    product(0.45,score_product_boost),
                    product(0.30, score_provider_boost_cpc),
                    product(0.30, score_provider_boost_cps),
                    product(0.50, score_category_product_boost),
                    product(0.09,score_random),
                    scale(random_1,1,5)) desc
                &lt;/str&gt;
                &lt;str name="facet"&gt;true&lt;/str&gt;
                &lt;str name="facet.pivot"&gt;facet_attribute_slug_size,facet_provider_url,facet_brand_model_url,facet_color_url&lt;/str&gt;
           &lt;/lst&gt;
        &lt;/arr&gt;
     &lt;/listener&gt;
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
Kolay gelsin.</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://3.bp.blogspot.com/-H_rDiYo0yjU/VeBB_HI4u0I/AAAAAAAAAiI/iNS5_fcGrJ4/s72-c/Screen%2BShot%2B2015-08-28%2Bat%2B14.03.49.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Redis Sentinel'e geçin rahat edin :)</title><link>http://volkanaltan.blogspot.com/2015/07/redis-sentinel-e-gecin-rahat-edin.html</link><category>credis</category><category>Php</category><category>Redis</category><category>Sentinel</category><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 24 Jul 2015 01:26:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-1428809400778551102</guid><description>Uzun zamandır yazmayı planladığım ama hep ertelediğim bir konuyu sizlerle paylaşmak istiyorum.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.vitringez.com/" target="_blank"&gt;Vitringez&lt;/a&gt; de memory cache olarak master-slave yapısında&amp;nbsp;&lt;a href="http://redis.io/" target="_blank"&gt;Redis&lt;/a&gt;&amp;nbsp;kullanıyoruz. Bir süre önce (2014 Haziran) ciddi sorunlar yaşamaya başladık. Sorun Redis tarafında oluyordu. Araştırmalarım neticesinde bizim sorunumuzu &lt;a href="http://redis.io/topics/sentinel" target="_blank"&gt;Redis Sentinel&lt;/a&gt;'in çözeceğini gördüm. Önce local de bazı testler yaptık. Sonrasında ise alt yapıda ufak güncellemeler yaptık. &lt;a href="https://github.com/colinmollenhour/credis" target="_blank"&gt;credis&lt;/a&gt; kütüphanesini kullanarak yeni yapıyı yayına aldık. O gün bugündür çok memnunuz. Sağladığı otomatik ayağa kaldırma mekanizması ile çok rahat ettik.&lt;br /&gt;
&lt;br /&gt;
Şimdi birlikte bir çalışma yapalım.&lt;br /&gt;
1. İlk olarak redis kurulumu yapın.&lt;br /&gt;
&lt;pre class="php" name="code"&gt;brew install redis
&lt;/pre&gt;
&lt;br /&gt;
&lt;br /&gt;
2. Şuradaki&amp;nbsp;&lt;a href="https://github.com/volkan/redis-work"&gt;https://github.com/volkan/redis-work&lt;/a&gt; dosyaları bir klasöre indirin.
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;git clone git@github.com:volkan/redis-work.git
&lt;/pre&gt;
3. Sentinel leri aktif hâle getiriyoruz. Failover mekanizması için en az iki sentinel aktif olmalı.
Ben bunları logları rahat takip etmek için ayrı tablarda açtım. 
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;redis-sentinel redis-sentinel_26379.conf
redis-sentinel redis-sentinel_26380.conf
&lt;/pre&gt;
4. Redisleri aktif hâle getiriyoruz. (Ayrı tablarda açma olayı redisler içinde geçerli.)
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;redis-server redis_6381.conf
redis-server redis_6380.conf
redis-server redis_6379.conf
&lt;/pre&gt;
5. Sentinel durumunu kontrol ediyoruz;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;redis$  redis-cli -h localhost -p 26379 info     
&lt;/pre&gt;
Aşağıda görüldüğü üzere henüz işlem yapılmıyor.
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;➜  redis git:(master) redis-cli -h localhost -p 26379 info     
# Server
redis_version:2.8.17
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:447fbed5d78be577
redis_mode:sentinel
os:Darwin 14.4.0 x86_64
arch_bits:64
multiplexing_api:kqueue
gcc_version:4.2.1
process_id:22338
run_id:db7af31f3bcacd0cd7433cb3aadc03751059f9fe
tcp_port:26379
uptime_in_seconds:351
uptime_in_days:0
hz:18
lru_clock:11625915
config_file:/Users/volkan/project/redis/redis-sentinel_26379.conf

# Sentinel
sentinel_masters:0
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
&lt;/pre&gt;
6. Sentinel'e master redis'i verip takip etmesini istiyoruz. Bu işlemi iki sentinel içinde yapıyoruz.
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;redis-cli -h localhost -p 26379 SENTINEL monitor mymaster 127.0.0.1 6381 2
redis-cli -h localhost -p 26380 SENTINEL monitor mymaster 127.0.0.1 6381 2
&lt;/pre&gt;
Sonrasında aldığımız çıktı da son satır önemli.
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;master0:name=mymaster,status=ok,address=127.0.0.1:6381,slaves=2,sentinels=2
&lt;/pre&gt;
&lt;pre class="php" name="code"&gt;➜  redis git:(master) redis-cli -h localhost -p 26379 info     
# Server
redis_version:2.8.17
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:447fbed5d78be577
redis_mode:sentinel
os:Darwin 14.4.0 x86_64
arch_bits:64
multiplexing_api:kqueue
gcc_version:4.2.1
process_id:22338
run_id:db7af31f3bcacd0cd7433cb3aadc03751059f9fe
tcp_port:26379
uptime_in_seconds:511
uptime_in_days:0
hz:13
lru_clock:11626075
config_file:/Users/volkan/project/redis/redis-sentinel_26379.conf

# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
master0:name=mymaster,status=ok,address=127.0.0.1:6381,slaves=2,sentinels=2
&lt;/pre&gt;
Sentinel de eklemeler sonrası slaveleri bulup gerekli çalışmaları yapıyor;

&lt;br /&gt;
&lt;pre class="php" name="code"&gt;[22338] 24 Jul 01:09:42.412 # +monitor master mymaster 127.0.0.1 6381 quorum 2
[22338] 24 Jul 01:09:42.459 * +slave slave 127.0.0.1:6380 127.0.0.1 6380 @ mymaster 127.0.0.1 6381
[22338] 24 Jul 01:09:42.459 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6381
[22338] 24 Jul 01:10:31.881 * +sentinel sentinel 127.0.0.1:26380 127.0.0.1 26380 @ mymaster 127.0.0.1 6381
&lt;/pre&gt;
7. 6381 olan master'ı kapatıyoruz!
Burada bizim verdiğimiz gecikme süresine göre sentinel devreye girip bir slave'i master yapıyor.

&lt;br /&gt;
&lt;pre class="php" name="code"&gt;[22338] 24 Jul 01:12:55.430 # +sdown master mymaster 127.0.0.1 6381
[22338] 24 Jul 01:12:55.489 # +new-epoch 1
[22338] 24 Jul 01:12:55.489 # +vote-for-leader 5f89e827f873bb2bf7acb7f898c21f0903bd80cb 1
[22338] 24 Jul 01:12:55.522 # +odown master mymaster 127.0.0.1 6381 #quorum 2/2
[22338] 24 Jul 01:12:55.522 # Next failover delay: I will not start a failover before Fri Jul 24 01:18:55 2015
[22338] 24 Jul 01:12:56.637 # +config-update-from sentinel 127.0.0.1:26380 127.0.0.1 26380 @ mymaster 127.0.0.1 6381
[22338] 24 Jul 01:12:56.637 # +switch-master mymaster 127.0.0.1 6381 127.0.0.1 6380
[22338] 24 Jul 01:12:56.637 * +slave slave 127.0.0.1:6379 127.0.0.1 6379 @ mymaster 127.0.0.1 6380
[22338] 24 Jul 01:12:56.639 * +slave slave 127.0.0.1:6381 127.0.0.1 6381 @ mymaster 127.0.0.1 6380
&lt;/pre&gt;
Tekrar info komutu çalıştırdığımızda durum aşağıdaki gibi. 6381 olan port 6380 olarak değişmiş.
➜  redis git:(master) ✗ redis-cli -h localhost -p 26379 info    

&lt;br /&gt;
&lt;pre class="php" name="code"&gt;master0:name=mymaster,status=ok,address=127.0.0.1:6380,slaves=2,sentinels=2
&lt;/pre&gt;
8. Kalan son master 6380 redisini kapattım. Kontrol ettiğimde kendisinin master yapıldığını gördüm.

&lt;br /&gt;
&lt;pre class="php" name="code"&gt;master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=2
&lt;/pre&gt;
Eğer yeni bir makine havuza ekleyecekseniz mutlaka çalışan master'a slave olarak eklemelisiniz. Sentinel bir kere bir makineyi takip etmeye başlarsa sonrasında onu doğru konuma yerleştirir.

Birden fazla makine üzerinde çalışırken bir şekilde birbirlerini görmeyebilirler. Bundan emin olmak için aşağıdaki komutu bir sentinel üzerinde çalıştırıp kontrol edebilirsiniz. "protected mode no" olmalı. Ayrıca en az 3 sentinel kullanmalısınız. (Daha fazla olacaksa bu sayı tek sayı olmalı 3,5,7 gibi.)
&lt;pre class="php" name="code"&gt;
SENTINEL ckquorum mymaster
&lt;/pre&gt;

&lt;br /&gt;
&lt;br /&gt;
Sonuç olarak bu harika nimeti kullanması gördüğünüz üzere oldukça kolay. credis kütüphanesi üzerinden sorgularınızı slave &amp;nbsp;makinelere dağıtık bir şekilde gönderip verimliliği artırabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
İyi kod yazmalar :)&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total></item><item><title>RabbitMQ'yi verimli kullanmak 2</title><link>http://volkanaltan.blogspot.com/2014/04/rabbitmqyi-verimli-kullanmak-2.html</link><category>Php</category><category>RabbitMQ</category><author>noreply@blogger.com (Unknown)</author><pubDate>Fri, 18 Apr 2014 10:19:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-7657968903199858495</guid><description>Çoğu zaman etraftan duyduğumuz PHP ile RabbitMQ kullanılırken "consumer"'ın python tarafından yazılması gerektiği oluyor. Buna gerekçe olarak PHP'nin memory kısmını iyi "yönetemediği" söyleniyor. Üstelik PHP ile kod yazıyorsanız ve bağımlılıklarınız proje içindeyse python için ekstra olarak bir sürü işlem yapmanız gerekecek. Bunun maliyeti ise ayrı bir konu.&lt;br /&gt;
&lt;br /&gt;
Bunun yanı sıra bunları söyleyenler bize, "python consumer olarak php den şu kadar kat daha iyi"yi gösterseler bile aşağıdaki işlemlerden sonra acaba arada bir fark kalıyor mu veya ne kadarlık fark kalıyor, veya python memory olarak hiç mi şişmeyecek veya sorunlar çıkarmayacak? Bu sorunlar çıkarken PHP'nin yanında bir de python'un dertleriyle uğraşmamız gerekmeyecek mi?&lt;br /&gt;
&lt;br /&gt;
Bu nedenle soruna çözüm odaklı yaklaşmak gerek, yeni bir sorun çıkartmamalıyız. Elimizdeki ürünleri en iyi şekilde konumlandırıp ayağa kaldırırsak "&lt;b&gt;ortak problem&lt;/b&gt;" olarak karşımıza çıkan sorunları çözüp, ondan sonra bunun üzerine diğer konulardan bahsetmek gerek diye düşünüyorum.&lt;br /&gt;
&lt;br /&gt;
Şimdi size &lt;b&gt;ortak problemlerin&lt;/b&gt; ortak &lt;b&gt;çözümünü&lt;/b&gt; anlatmaya çalışacağım;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Consumer&lt;/b&gt; yazarken &lt;b&gt;hangi dil olursa olsun&lt;/b&gt; ihtiyacımız olan temel bazı özellikler var. Bunları yaptığımız sürece, çok iyi memory yönetemezseniz bile paçayı kurtarabilirsiniz. Bunlar şöyle;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;1.&lt;/b&gt; İşlemesi gereken mesaj sayısına limit koymak.&lt;br /&gt;
&lt;b&gt;2.&lt;/b&gt; İşlem yapılmadığı zaman ne kadar süre sonra consumer process'inin kapanacağını söylemek.&lt;br /&gt;
&lt;b&gt;3.&lt;/b&gt; Kendisini sürekli canlı tutmak.&lt;br /&gt;
&lt;br /&gt;
Bu üç madde çok iyi iş yapıyor, bunlara ek olarak memory limitide koyabilirsiniz. Ben buna pek sıcak bakmıyorum.&lt;br /&gt;
&lt;br /&gt;
Biz PHP de bu işi için şu kütüphaneyi kullanıyoruz&amp;nbsp;&lt;a href="https://github.com/videlalvaro/php-amqplib"&gt;https://github.com/videlalvaro/php-amqplib&lt;/a&gt;&lt;br /&gt;
Symfony içinde bu saydığım işlemleri hızlıca yapmak için şu bundle&amp;nbsp;&lt;a href="https://github.com/videlalvaro/rabbitmqbundle"&gt;https://github.com/videlalvaro/rabbitmqbundle&lt;/a&gt;&amp;nbsp;işimizi görüyor.&lt;br /&gt;
&lt;br /&gt;
Yukarıdaki maddeler ile ilgili dikkat çekmek istediğim kısımlar;&lt;br /&gt;
&lt;br /&gt;
1. Madde için aşağıdaki limit koyabilirsiniz. Böylece process'in ekstra ram temizleme ve benzeri işleri ile uğraşmanız gerekmiyor.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;./app/console rabbitmq:consumer -m 50 upload_picture
&lt;/pre&gt;
&lt;br /&gt;
2. Madde ve&amp;nbsp;&lt;a href="http://volkanaltan.blogspot.com.tr/2013/12/rabbitmqyi-verimli-kullanmak.html" target="_blank"&gt;İlk yazıda&lt;/a&gt;&amp;nbsp;bahsettiğim (her consumer'a eşit yük dağılımı) ayarlar burada gözüküyor. Bu madde şu açıdan önemli, MySQL gibi bir veritabanına bağlantı açıp uzun süre beklerseniz (&lt;a href="https://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout" target="_blank"&gt;wait_timeout&lt;/a&gt;) bu bağlantınızı belirli bir süre sonra öldürür. Bu durumda da her işelemde "mysql gone away" hatası alırsınız. Bu ve benzeri durumların önüne geçmek için yaşam süresi vermek önemli.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;product_process:
            qos_options: {prefetch_size: 0, prefetch_count: 10, global: false}
            idle_timeout: 30
&lt;/pre&gt;
&lt;br /&gt;
3. Madde için bir &lt;a href="http://supervisord.org/" target="_blank"&gt;supervisord&lt;/a&gt;&amp;nbsp;kullanıyoruz. Örnek bir ayar aşağıda girdim. Herhangi bir sebeple kapanan process yeniden ayağa kaldırılıyor. Bu ayar ile aşağıdaki komutu iki kere çalıştırmasını istedik. Yani iki adet "consumer"'umuz oldu.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;[program:product_process]
command=/usr/local/php5/bin/php /home/p1/app/console rabbitmq:consumer -m 100 product_process --env=prod
process_name=%(process_num)02d
numprocs=2
directory=/tmp
autostart=true
autorestart=true
startsecs=5
startretries=100
user=project
redirect_stderr=false
stdout_logfile=/var/log/supervisor/product_process.out.log
stdout_capture_maxbytes=5MB
stdout_logfile_backups=10
stderr_logfile=/var/log/supervisor/product_process.error.log
stderr_capture_maxbytes=5MB
stderr_logfile_backups=10
&lt;/pre&gt;
&lt;br /&gt;
Biz bu şekilde ciddi bir performans yakaladık bu bilgiyi paylaşmamanın haksızlık olacağını düşündüğümden yazmak istedim :)&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Not (05.04.2014):&lt;/b&gt; 3 Mayıs 2014 tarihinde yapılan &lt;a href="http://2014.phpist.org/#schedule" target="_blank"&gt;php-ist konferansı&lt;/a&gt;nda sunum yapan&amp;nbsp;&lt;a href="http://videlalvaro.github.io/" target="_blank"&gt;Alvaro Videla&lt;/a&gt;'ya &lt;a href="http://www.mustafaileri.com/" target="_blank"&gt;Mustafa kardeşim&lt;/a&gt; bazı sorular yöneltmiş. Özetle PHP'nin consumer için uygun olup olmadığını sormuş. &lt;br /&gt;
&lt;b&gt;Cevap:&lt;/b&gt; Derlenebilen dillerin consumer yazmak için daha iyi olduğu, uzun süre ayakta olan php processlerinde ram saçmalama durumu olduğunu söylemiş.&lt;br /&gt;
&lt;br /&gt;
Daha sonra bizim yukarıda anlattığımız çözümlerin geçerliliğini sormuş. Bunlar için ise aşağı yukarı bu şekilde bir çok sorunun çözüldüğünü söylemiş.&lt;br /&gt;
&lt;br /&gt;
Sonuç olarak eğer bu şekilde sorununuz çözülüyorsa bu şekilde ilerlemek, ancak bunlar sizi kesmiyorsa consumer kısmını derlenen diller ile yazıp kafanızın rahat etmesini sağlamanız gerekiyor. Herşey ihtiyaca göre şekilleniyor. Ana sonuç: Samsun S3 mini işinizi görüyorsa Note 3 almayın :)&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>RabbitMQ'yi verimli kullanmak</title><link>http://volkanaltan.blogspot.com/2013/12/rabbitmqyi-verimli-kullanmak.html</link><category>RabbitMQ</category><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 12 Dec 2013 10:45:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-6554333556708191171</guid><description>RabbitMQ hakkında genel bilgi edinmek için sevgili Mustafa'nın yazısına bakabilirsiniz&amp;nbsp;&lt;a href="http://www.mustafaileri.com/post/60580598616/rabbitmq-ve-amqp-uzerine-biraz-tecrube-eski-yaz" target="_blank"&gt;http://www.mustafaileri.com/post/60580598616/rabbitmq-ve-amqp-uzerine-biraz-tecrube-eski-yaz&lt;/a&gt;&amp;nbsp;Benim burada bahsetmek istediğim biraz detay ve kısa bir bilgi.&lt;br /&gt;
&lt;br /&gt;
Default ayarlar ile kuyruğa yaklaşık 7000 mesaj bastıktan sonra 1 adet consumer çalıştırırsanız, bu alabileceği kadar mesajı &lt;b&gt;üstüne alır.&amp;nbsp;&lt;/b&gt;İkinci consumer açarsanız buda kalan kısımdan alabileceğini alır. Üçüncü consumer açtığınızda bu consumer'a maalesef mesaj &lt;b&gt;kalmamış&lt;/b&gt; olabilir!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-FY98UINLY_4/UqlwLDSHeEI/AAAAAAAAANs/JH8AKtIttsk/s1600/Screen+Shot+2013-12-12+at+10.10.14.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="98" src="http://1.bp.blogspot.com/-FY98UINLY_4/UqlwLDSHeEI/AAAAAAAAANs/JH8AKtIttsk/s640/Screen+Shot+2013-12-12+at+10.10.14.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Benim örneğimde consumer başına yaklaşık &lt;b&gt;3000&lt;/b&gt; mesaj düşüyor. Peki bu ne anlama geliyor?&lt;br /&gt;
&lt;br /&gt;
Siz 10.000 mesaj için 10.000 consumer açsanız maalesef bunların sadece 3-5 tanesi aktif olacak.&lt;br /&gt;
Yalnız &lt;b&gt;dikkat&lt;/b&gt; edilmesi gereken husus bu hesap &lt;b&gt;önce mesajlar&lt;/b&gt; basılıp sonra &lt;b&gt;sonra&lt;/b&gt; consumer aktif olduğu durumlar için geçerlidir. Eğer siz 10.000 consumer ayağa kaldırır bir yandan sürekli kuyruğa mesaj gönderirseniz RabbitMQ bunu &lt;b&gt;dağıtacaktır. &lt;/b&gt;Boşta olan her consumer üzerine mesaj alıp işleyecektir.&lt;br /&gt;
&lt;br /&gt;
Peki bunu nasıl aşabiliriz?&lt;br /&gt;
&lt;br /&gt;
Tabiiykide her kuyruğun alacağı mesaj sayısını belirterek.&lt;br /&gt;
&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://3.bp.blogspot.com/-l7VJcLSvpI4/Uqlxyh0s47I/AAAAAAAAAN4/n9R2UlRF6N8/s1600/Screen+Shot+2013-12-12+at+10.19.35.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;br /&gt;&lt;/a&gt;&lt;a href="http://3.bp.blogspot.com/-l7VJcLSvpI4/Uqlxyh0s47I/AAAAAAAAAN4/n9R2UlRF6N8/s1600/Screen+Shot+2013-12-12+at+10.19.35.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="380" src="http://3.bp.blogspot.com/-l7VJcLSvpI4/Uqlxyh0s47I/AAAAAAAAAN4/n9R2UlRF6N8/s640/Screen+Shot+2013-12-12+at+10.19.35.png" width="640" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Consumerlar için kaç adet mesaj alacağını &lt;a href="http://www.rabbitmq.com/specification.html#method-status-basic.qos" target="_blank"&gt;basic_qos&lt;/a&gt; ile bildiriyoruz PHP tarafında örnek kod şu şekilde oluyor;&lt;br /&gt;
&lt;br /&gt;
&lt;pre class="php" name="code"&gt;        $channel = $this-&amp;gt;getConnection()-&amp;gt;channel();
        $channel-&amp;gt;basic_qos(0, 100, null);
        $this-&amp;gt;setChannel($channel);
&lt;/pre&gt;
&lt;br /&gt;
Biz şu kütüphaneyi kullanıyoruz size de tavsiye ederim&amp;nbsp;&lt;a href="https://github.com/videlalvaro/php-amqplib"&gt;https://github.com/videlalvaro/php-amqplib&lt;/a&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://1.bp.blogspot.com/-FY98UINLY_4/UqlwLDSHeEI/AAAAAAAAANs/JH8AKtIttsk/s72-c/Screen+Shot+2013-12-12+at+10.10.14.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>php ist 2013</title><link>http://volkanaltan.blogspot.com/2013/07/php-ist-2013.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 11 Jul 2013 16:26:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-4427895319478373752</guid><description>Geçtiğimiz günlerde Türkiye'de php üzerine yapılmış en iyi etkinliklerden biri yapıldı. Şimdi bunu duyanlar abartıyorum sanacak ancak geçmişte "özgür web günleri"'ne katılmış başka etkinlikleri görmüş takip etmiş biri olarak onlarla kıyaslayınca çok rahat bir şekilde bunu söylüyebiliyorum.&lt;br /&gt;
&lt;br /&gt;
Etkinlikte bir sunumda ben yaptım. &lt;a href="http://www.slideshare.net/volkanva/php-ile-debugging" target="_blank"&gt;PHP'de debugging&lt;/a&gt; konulu bu sunum, vakit darlığı ve acemiliğim nedeniyle hızlı geçti.&lt;br /&gt;
&lt;br /&gt;
En önemli ayrıntılardan biri etkinliğin videosununda çekilmiş olmasıydı. Emeği geçen ve sponsor olan herkese teşekkür ederim.&lt;br /&gt;
&lt;br /&gt;
Etkinliğe ait videolar :&amp;nbsp;&lt;a href="http://www.paylas.com/phpist/etkinlik/istanbul-php-konferansi"&gt;http://www.paylas.com/phpist/etkinlik/istanbul-php-konferansi&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Tüm konuşmacıların slideları:&amp;nbsp;&lt;a href="http://2013.phpist.org/#!/speakers"&gt;http://2013.phpist.org/#!/speakers&lt;/a&gt;&lt;br /&gt;
(konuşmacı adlarına tıkladığınızda açılmaktadır.)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Git'i proje içinde kullanmak </title><link>http://volkanaltan.blogspot.com/2013/02/giti-proje-icinde-kullanmak.html</link><category>Git</category><author>noreply@blogger.com (Unknown)</author><pubDate>Sat, 16 Feb 2013 21:53:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-1253578940492128986</guid><description>Daha önce "&lt;a href="http://volkanaltan.blogspot.com/2012/05/git-notlarm.html" target="_blank"&gt;git notlarım&lt;/a&gt;" isimli bir blog yazmıştım. Ancak burda sadece komutlar bulunuyor. Detaylı kullanım yer almıyor. Her nekadar bu kullanım İbrahim Gündür kardeşimiz tarafından ele alındıysada ( &lt;a href="http://ibrahimgunduz.net/yar-yaban-ellere-git-mis/" target="_blank"&gt;ibrahimgunduz.net/yar-yaban-ellere-git-mis/ &lt;/a&gt;) talep üzerine (Hakan Bey'e beni teşvik ettiği için teşekkür ediyorum) bende birşeyler yazmaya çalışacağım.&lt;br /&gt;
&lt;br /&gt;
Öncelikle "git" hızlı, kolay ve mantıklı bir kullanım sunuyor. Ayrıca piyasada ücretli ücretsiz servis alacağınız çok sağlam firtmalar bulunuyor ve Enterprise desteğide mevcut. (&lt;a href="http://github.com/"&gt;http://github.com&lt;/a&gt; , &lt;a href="https://bitbucket.org/"&gt;https://bitbucket.org/&lt;/a&gt;)&lt;br /&gt;
&lt;br /&gt;
Yeni bir projeye başladığımızda proje klasöründeyken aşağıdaki komutu yazıp git'i aktif ediyoruz.&lt;br /&gt;
$&lt;b&gt;git init&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
İlk olarak projede birşey eklemeden çıkarmadan önce kendimizi git'e tanıtmalıyız.&lt;br /&gt;
&lt;br /&gt;
$&lt;b id="internal-source-marker_0.702255992917344" style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git config --local user.name "isim.soyisim"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
$&lt;b id="internal-source-marker_0.702255992917344" style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git config --local user.email "volkan.altan@gmail.com"&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Böylece yapacağım işlemler artık github veya x hesabımla değil. Bu bilgiler ile olacak.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Aslında bu bilgiler "&lt;b&gt;jira&lt;/b&gt;" veya proje takibi için kullandığımız hesap bilgilerimiz olursa iyi olur.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Sonrasında projede hiçbir zaman gitmesini istemediğimiz dosyaları tanımlıyoruz. Bunu global veya  her proje için ayrı tanımlayabiliriz, proje içerisinde ".gitignore" isimli bir dosya oluşturursak içine yazacağımız klasör isimleri veya dosyalar hiçbir zaman gitmeyecektir. Daha fazla bilgi için bu link faydalı olacaktır &lt;/span&gt;&lt;/span&gt;&lt;a href="https://help.github.com/articles/ignoring-files" style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;https://help.github.com/articles/ignoring-files&lt;/a&gt;&amp;nbsp;.&lt;br /&gt;
&lt;br /&gt;
Yukarda oluşturduğumuz projeyi şimdi github'a gönderelim.&lt;br /&gt;
github.com dan proje oluşturalım. Adı "deneme" olsun.&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git add .&lt;/b&gt;&lt;br /&gt;
$&lt;b&gt;git commit -m 'ilk göndermeler'&lt;/b&gt;&lt;br /&gt;
$&lt;b&gt;git remote add origin git@github.com:volkan/deneme.git&lt;/b&gt;&lt;br /&gt;
$&lt;b&gt;git push -u origin master&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;br /&gt;&lt;/span&gt;
Proje ile github arasındaki bağ kuruldu. Artık istediğimiz gibi çalışabiliriz.&lt;br /&gt;
&lt;br /&gt;
Ben size linux kullanıyorsanız "&lt;a href="https://github.com/robbyrussell/oh-my-zsh" target="_blank"&gt;oh my zsh&lt;/a&gt;" kurup kullanmanızı tavsiye ediyorum. Bunun en çok işimize yaracak yönlerinden biri bulunduğumuz "dalı" o an görebilecek olmamız.&lt;br /&gt;
&lt;br /&gt;
Projede açılan her işe yeni bir "dal" açmak veya ihtiyaca göre sadece developer'a özel "dal" açabilirsiniz. Biz işleri &lt;b&gt;jira&lt;/b&gt;'da açıp işin adına göre yeni bir "dal" açmayı tercih ediyoruz.&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git checkout -b PRJ-10&lt;/b&gt;&lt;br /&gt;
$&lt;b&gt;git status&lt;/b&gt;&lt;br /&gt;
(-b hem "dal" oluşturur hem checkout işlemini yapar)&lt;br /&gt;
Bu şekilde her geliştirici sisteme kendini tanıtıp çalıştığı iş için "dal" açabilir.&lt;br /&gt;
&lt;br /&gt;
Projede çalışırken, yaptığımız işi kaybetmemek için ara ara "commit" edip github'a göndermeliyiz.&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git push origin PRJ-10&lt;/b&gt;&lt;br /&gt;
(origin bulunduğunuz nokta yani bulunduğunuz "dal" demektir)&lt;br /&gt;
Gün içinde bunu birkaç defa yapabiliriz. Bu çalışma temponuzla alakalı.&lt;br /&gt;
&lt;br /&gt;
Bu arada siz geliştirme yaparken projede boş durmuyor. Sizden önce işini yapıp bitiren arkadaşların işleri çeşitli statuslerden geçtikten sonra "master"'a alınıyor. &amp;nbsp;Ve sizin ilk başladığınız "dal", "ana daldan" geri kalmış oluyor. Bu yüzden çalıştığınız "dal" çeşitli statüslerden geçip "master"'a alınacağı zaman bu işleri yapan kişi sizden &lt;b&gt;master&lt;/b&gt;'ını güncelleyip dalını "&lt;b&gt;rebase&lt;/b&gt;" eder misin? der.&lt;br /&gt;
&lt;br /&gt;
Siz yaptığınız bütün işleri add, commit ve push ettikten sonra master'a geçip.&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git fetch&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
Yazarsanız hangi dalda olursanız olun bütün değişiklikleri alırsınız. Ancak bu değişiklikler herhangi bir yere yazılmaz.&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git pull&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
Derseniz hem fetch, hem "merge" yapmış olursunuz. Yani bulunduğunuz "dal" sunucuda bir yere bağlı ve mevcutsa ordan aldığı güncellemeleri sizin dalınıza birleştirir. Bu nedenle "git pull" yerine&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git pull --rebase&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Daha uygun bir çözüm gibi geliyor.&lt;br /&gt;
&lt;br /&gt;
merge ile rebase arasındaki fark, "merge" de üstünde yazılırken "rebase" aralara yazıyor.&lt;br /&gt;
&lt;br /&gt;
Bu nedenle değişiklikler her commit'e uygulanıyor.&lt;br /&gt;
&lt;br /&gt;
Velhasıl sizden rebase al dediklerinde sırasıyla aşağıdaki komutları çalıştırmanız gerekiyor.&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git status &lt;/b&gt;(gözümüzden kaçan birşey var mı diye bakıyoruz.)&lt;br /&gt;
$&lt;b&gt;git checkout master&lt;/b&gt;&lt;br /&gt;
$&lt;b&gt;git pull&lt;/b&gt;&lt;br /&gt;
$&lt;b&gt;git checkout PRJ-10&lt;/b&gt;&lt;br /&gt;
$&lt;b&gt;git rebase master&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Burda çakışmalar çıkarsa onları düzeltmek için "ara yüzü" olan bir araç iyi olacaktır.&lt;br /&gt;
&lt;a href="http://michaelgalloy.com/2008/01/29/opendiff.html"&gt;http://michaelgalloy.com/2008/01/29/opendiff.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git mergetool&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
İle çakışmaları düzeltmeye başlayabiliriz.&lt;br /&gt;
&lt;br /&gt;
Bununla birlikte commit sayımız çok olduğu zaman çakışmalarda o kadar çok düzeltme isteyecektik.&lt;br /&gt;
Ara ara commit, push ettikten sonra son commitimizde, bütün commitleri birleştirip tek commit yapabiliriz.&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git rebase -i HEAD~3&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Burda 3, son 3 commit demek. Yukardaki komutu yazdığımız da tanımlı editör açılacaktır.&lt;br /&gt;
Bu bende "vim" açılan ekrandan;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;pick&lt;/b&gt; 73a45d3 mesaj1
&lt;b&gt;pick&lt;/b&gt; b5f70f9  mesaj2
&lt;b&gt;pick&lt;/b&gt; a2c63a4 mesaj3

sondan iki &lt;/span&gt;&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;"pick"&lt;/b&gt;&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; i &lt;/span&gt;&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;"f"&lt;/b&gt;&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt; yapıyoruz, böylece diğer commit mesajları "&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;mesaj1" olarak güncellenecek.&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;

&lt;b&gt;pick&lt;/b&gt; 73a45d3 mesaj1
&lt;b&gt;f&lt;/b&gt; b5f70f9 mesaj2
&lt;b&gt;f&lt;/b&gt; a2c63a4 mesaj3
&lt;b&gt;:wq! &lt;/b&gt;(kaydet ve çık)&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
İşlemler başarılı olursa geriye kodu psuh etmek kalıyor.&lt;br /&gt;
&lt;br /&gt;
$&lt;b&gt;git push origin PRJ-10 -f&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Burda "-f" parametresi kullandık, çünkü github'da bulunan kodlar ile bizdeki kodlar arasında fark oluştu. Bu fark kod farkı değil "başlık" farkıdır.&lt;br /&gt;
&lt;b&gt;&lt;br /&gt;&lt;/b&gt;
Yazdıklarım %100 doğru veya en uygun çalışma şekli değildir. Bu sadece naçizane bir tavsiyedir. Daha iyi yöntemleri olan yorum olarak yazarsa memnun oluruz.&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><enclosure length="0" type="application/octet-stream" url="https://bitbucket.org/"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>Daha önce "git notlarım" isimli bir blog yazmıştım. Ancak burda sadece komutlar bulunuyor. Detaylı kullanım yer almıyor. Her nekadar bu kullanım İbrahim Gündür kardeşimiz tarafından ele alındıysada ( ibrahimgunduz.net/yar-yaban-ellere-git-mis/ ) talep üzerine (Hakan Bey'e beni teşvik ettiği için teşekkür ediyorum) bende birşeyler yazmaya çalışacağım. Öncelikle "git" hızlı, kolay ve mantıklı bir kullanım sunuyor. Ayrıca piyasada ücretli ücretsiz servis alacağınız çok sağlam firtmalar bulunuyor ve Enterprise desteğide mevcut. (http://github.com , https://bitbucket.org/) Yeni bir projeye başladığımızda proje klasöründeyken aşağıdaki komutu yazıp git'i aktif ediyoruz. $git init İlk olarak projede birşey eklemeden çıkarmadan önce kendimizi git'e tanıtmalıyız. $git config --local user.name "isim.soyisim" $git config --local user.email "volkan.altan@gmail.com" Böylece yapacağım işlemler artık github veya x hesabımla değil. Bu bilgiler ile olacak. Aslında bu bilgiler "jira" veya proje takibi için kullandığımız hesap bilgilerimiz olursa iyi olur. Sonrasında projede hiçbir zaman gitmesini istemediğimiz dosyaları tanımlıyoruz. Bunu global veya her proje için ayrı tanımlayabiliriz, proje içerisinde ".gitignore" isimli bir dosya oluşturursak içine yazacağımız klasör isimleri veya dosyalar hiçbir zaman gitmeyecektir. Daha fazla bilgi için bu link faydalı olacaktır https://help.github.com/articles/ignoring-files&amp;nbsp;. Yukarda oluşturduğumuz projeyi şimdi github'a gönderelim. github.com dan proje oluşturalım. Adı "deneme" olsun. $git add . $git commit -m 'ilk göndermeler' $git remote add origin git@github.com:volkan/deneme.git $git push -u origin master Proje ile github arasındaki bağ kuruldu. Artık istediğimiz gibi çalışabiliriz. Ben size linux kullanıyorsanız "oh my zsh" kurup kullanmanızı tavsiye ediyorum. Bunun en çok işimize yaracak yönlerinden biri bulunduğumuz "dalı" o an görebilecek olmamız. Projede açılan her işe yeni bir "dal" açmak veya ihtiyaca göre sadece developer'a özel "dal" açabilirsiniz. Biz işleri jira'da açıp işin adına göre yeni bir "dal" açmayı tercih ediyoruz. $git checkout -b PRJ-10 $git status (-b hem "dal" oluşturur hem checkout işlemini yapar) Bu şekilde her geliştirici sisteme kendini tanıtıp çalıştığı iş için "dal" açabilir. Projede çalışırken, yaptığımız işi kaybetmemek için ara ara "commit" edip github'a göndermeliyiz. $git push origin PRJ-10 (origin bulunduğunuz nokta yani bulunduğunuz "dal" demektir) Gün içinde bunu birkaç defa yapabiliriz. Bu çalışma temponuzla alakalı. Bu arada siz geliştirme yaparken projede boş durmuyor. Sizden önce işini yapıp bitiren arkadaşların işleri çeşitli statuslerden geçtikten sonra "master"'a alınıyor. &amp;nbsp;Ve sizin ilk başladığınız "dal", "ana daldan" geri kalmış oluyor. Bu yüzden çalıştığınız "dal" çeşitli statüslerden geçip "master"'a alınacağı zaman bu işleri yapan kişi sizden master'ını güncelleyip dalını "rebase" eder misin? der. Siz yaptığınız bütün işleri add, commit ve push ettikten sonra master'a geçip. $git fetch&amp;nbsp; Yazarsanız hangi dalda olursanız olun bütün değişiklikleri alırsınız. Ancak bu değişiklikler herhangi bir yere yazılmaz. $git pull Derseniz hem fetch, hem "merge" yapmış olursunuz. Yani bulunduğunuz "dal" sunucuda bir yere bağlı ve mevcutsa ordan aldığı güncellemeleri sizin dalınıza birleştirir. Bu nedenle "git pull" yerine $git pull --rebase Daha uygun bir çözüm gibi geliyor. merge ile rebase arasındaki fark, "merge" de üstünde yazılırken "rebase" aralara yazıyor. Bu nedenle değişiklikler her commit'e uygulanıyor. Velhasıl sizden rebase al dediklerinde sırasıyla aşağıdaki komutları çalıştırmanız gerekiyor. $git status (gözümüzden kaçan birşey var mı diye bakıyoruz.) $git checkout master $git pull $git checkout PRJ-10 $git rebase master Burda çakışmalar çıkarsa onları düzeltmek için "ara yüzü" olan bir araç iyi olacaktır. http://michaelgalloy.com/2008/01/29/opendiff.html $git mergetool&amp;nbsp; İle çakışmaları düzeltmeye başlayabiliriz. Bununla birlikte commit sayımız çok olduğu zaman çakışmalarda o kadar çok düzeltme isteyecektik. Ara ara commit, push ettikten sonra son commitimizde, bütün commitleri birleştirip tek commit yapabiliriz. $git rebase -i HEAD~3 Burda 3, son 3 commit demek. Yukardaki komutu yazdığımız da tanımlı editör açılacaktır. Bu bende "vim" açılan ekrandan; pick 73a45d3 mesaj1 pick b5f70f9 mesaj2 pick a2c63a4 mesaj3 sondan iki "pick" i "f" yapıyoruz, böylece diğer commit mesajları "mesaj1" olarak güncellenecek. pick 73a45d3 mesaj1 f b5f70f9 mesaj2 f a2c63a4 mesaj3 :wq! (kaydet ve çık) İşlemler başarılı olursa geriye kodu psuh etmek kalıyor. $git push origin PRJ-10 -f Burda "-f" parametresi kullandık, çünkü github'da bulunan kodlar ile bizdeki kodlar arasında fark oluştu. Bu fark kod farkı değil "başlık" farkıdır. Yazdıklarım %100 doğru veya en uygun çalışma şekli değildir. Bu sadece naçizane bir tavsiyedir. Daha iyi yöntemleri olan yorum olarak yazarsa memnun oluruz.</itunes:subtitle><itunes:author>noreply@blogger.com (Unknown)</itunes:author><itunes:summary>Daha önce "git notlarım" isimli bir blog yazmıştım. Ancak burda sadece komutlar bulunuyor. Detaylı kullanım yer almıyor. Her nekadar bu kullanım İbrahim Gündür kardeşimiz tarafından ele alındıysada ( ibrahimgunduz.net/yar-yaban-ellere-git-mis/ ) talep üzerine (Hakan Bey'e beni teşvik ettiği için teşekkür ediyorum) bende birşeyler yazmaya çalışacağım. Öncelikle "git" hızlı, kolay ve mantıklı bir kullanım sunuyor. Ayrıca piyasada ücretli ücretsiz servis alacağınız çok sağlam firtmalar bulunuyor ve Enterprise desteğide mevcut. (http://github.com , https://bitbucket.org/) Yeni bir projeye başladığımızda proje klasöründeyken aşağıdaki komutu yazıp git'i aktif ediyoruz. $git init İlk olarak projede birşey eklemeden çıkarmadan önce kendimizi git'e tanıtmalıyız. $git config --local user.name "isim.soyisim" $git config --local user.email "volkan.altan@gmail.com" Böylece yapacağım işlemler artık github veya x hesabımla değil. Bu bilgiler ile olacak. Aslında bu bilgiler "jira" veya proje takibi için kullandığımız hesap bilgilerimiz olursa iyi olur. Sonrasında projede hiçbir zaman gitmesini istemediğimiz dosyaları tanımlıyoruz. Bunu global veya her proje için ayrı tanımlayabiliriz, proje içerisinde ".gitignore" isimli bir dosya oluşturursak içine yazacağımız klasör isimleri veya dosyalar hiçbir zaman gitmeyecektir. Daha fazla bilgi için bu link faydalı olacaktır https://help.github.com/articles/ignoring-files&amp;nbsp;. Yukarda oluşturduğumuz projeyi şimdi github'a gönderelim. github.com dan proje oluşturalım. Adı "deneme" olsun. $git add . $git commit -m 'ilk göndermeler' $git remote add origin git@github.com:volkan/deneme.git $git push -u origin master Proje ile github arasındaki bağ kuruldu. Artık istediğimiz gibi çalışabiliriz. Ben size linux kullanıyorsanız "oh my zsh" kurup kullanmanızı tavsiye ediyorum. Bunun en çok işimize yaracak yönlerinden biri bulunduğumuz "dalı" o an görebilecek olmamız. Projede açılan her işe yeni bir "dal" açmak veya ihtiyaca göre sadece developer'a özel "dal" açabilirsiniz. Biz işleri jira'da açıp işin adına göre yeni bir "dal" açmayı tercih ediyoruz. $git checkout -b PRJ-10 $git status (-b hem "dal" oluşturur hem checkout işlemini yapar) Bu şekilde her geliştirici sisteme kendini tanıtıp çalıştığı iş için "dal" açabilir. Projede çalışırken, yaptığımız işi kaybetmemek için ara ara "commit" edip github'a göndermeliyiz. $git push origin PRJ-10 (origin bulunduğunuz nokta yani bulunduğunuz "dal" demektir) Gün içinde bunu birkaç defa yapabiliriz. Bu çalışma temponuzla alakalı. Bu arada siz geliştirme yaparken projede boş durmuyor. Sizden önce işini yapıp bitiren arkadaşların işleri çeşitli statuslerden geçtikten sonra "master"'a alınıyor. &amp;nbsp;Ve sizin ilk başladığınız "dal", "ana daldan" geri kalmış oluyor. Bu yüzden çalıştığınız "dal" çeşitli statüslerden geçip "master"'a alınacağı zaman bu işleri yapan kişi sizden master'ını güncelleyip dalını "rebase" eder misin? der. Siz yaptığınız bütün işleri add, commit ve push ettikten sonra master'a geçip. $git fetch&amp;nbsp; Yazarsanız hangi dalda olursanız olun bütün değişiklikleri alırsınız. Ancak bu değişiklikler herhangi bir yere yazılmaz. $git pull Derseniz hem fetch, hem "merge" yapmış olursunuz. Yani bulunduğunuz "dal" sunucuda bir yere bağlı ve mevcutsa ordan aldığı güncellemeleri sizin dalınıza birleştirir. Bu nedenle "git pull" yerine $git pull --rebase Daha uygun bir çözüm gibi geliyor. merge ile rebase arasındaki fark, "merge" de üstünde yazılırken "rebase" aralara yazıyor. Bu nedenle değişiklikler her commit'e uygulanıyor. Velhasıl sizden rebase al dediklerinde sırasıyla aşağıdaki komutları çalıştırmanız gerekiyor. $git status (gözümüzden kaçan birşey var mı diye bakıyoruz.) $git checkout master $git pull $git checkout PRJ-10 $git rebase master Burda çakışmalar çıkarsa onları düzeltmek için "ara yüzü" olan bir araç iyi olacaktır. http://michaelgalloy.com/2008/01/29/opendiff.html $git mergetool&amp;nbsp; İle çakışmaları düzeltmeye başlayabiliriz. Bununla birlikte commit sayımız çok olduğu zaman çakışmalarda o kadar çok düzeltme isteyecektik. Ara ara commit, push ettikten sonra son commitimizde, bütün commitleri birleştirip tek commit yapabiliriz. $git rebase -i HEAD~3 Burda 3, son 3 commit demek. Yukardaki komutu yazdığımız da tanımlı editör açılacaktır. Bu bende "vim" açılan ekrandan; pick 73a45d3 mesaj1 pick b5f70f9 mesaj2 pick a2c63a4 mesaj3 sondan iki "pick" i "f" yapıyoruz, böylece diğer commit mesajları "mesaj1" olarak güncellenecek. pick 73a45d3 mesaj1 f b5f70f9 mesaj2 f a2c63a4 mesaj3 :wq! (kaydet ve çık) İşlemler başarılı olursa geriye kodu psuh etmek kalıyor. $git push origin PRJ-10 -f Burda "-f" parametresi kullandık, çünkü github'da bulunan kodlar ile bizdeki kodlar arasında fark oluştu. Bu fark kod farkı değil "başlık" farkıdır. Yazdıklarım %100 doğru veya en uygun çalışma şekli değildir. Bu sadece naçizane bir tavsiyedir. Daha iyi yöntemleri olan yorum olarak yazarsa memnun oluruz.</itunes:summary><itunes:keywords>Git</itunes:keywords></item><item><title>Jirada import workflow XML sonrası NullPointerException almak</title><link>http://volkanaltan.blogspot.com/2012/12/jirada-import-workflow-xml-sonras.html</link><category>jira</category><category>NullPointerException</category><category>tip</category><author>noreply@blogger.com (Unknown)</author><pubDate>Tue, 18 Dec 2012 19:00:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-1661066309035287623</guid><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://1.bp.blogspot.com/-B8LNFPTZOJ0/UNCgc0BdIMI/AAAAAAAAAKQ/e4GMj7ofurA/s1600/LOGO_JIRA.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="166" src="http://1.bp.blogspot.com/-B8LNFPTZOJ0/UNCgc0BdIMI/AAAAAAAAAKQ/e4GMj7ofurA/s320/LOGO_JIRA.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Jira'da iş akışını değiştirmek istedik. Bunun içinde arkadaşımın daha önceden hazırladığı iş akışını istedim. Onu alıp import edince herşey çok güzel olacak sandım... Ancak aldığım bu hata ile ciddi sorunlar yaşadım. &lt;br /&gt;
&lt;br /&gt;
&lt;pre name="code"&gt;Error rendering WebPanel (workflows/workflows.vm): org.apache.velocity.exception.MethodInvocationException: Invocation of method 'getHtml' in class com.atlassian.jira.web.component.IssueConstantWebComponent threw exception java.lang.NullPointerException at workflows/workflows.vm[line 136, column 65]
&lt;/pre&gt;
&lt;br /&gt;
Hatayı araştırdığınızda size önerilen şey şu;
&lt;br /&gt;
&lt;a href="https://confluence.atlassian.com/display/JIRAKB/NullPointerException+after+importing+workflow+XML"&gt;https://confluence.atlassian.com/display/JIRAKB/NullPointerException+after+importing+workflow+XML&lt;/a&gt;
&lt;br /&gt;
&lt;br /&gt;
Aynı zamanda sorunu yaşayıp çözüm arayan garibanlar ;

&lt;a href="https://answers.atlassian.com/questions/60144/workflow-scheme-and-project-where-do-they-link-in-database"&gt;https://answers.atlassian.com/questions/60144/workflow-scheme-and-project-where-do-they-link-in-database&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
İşin kötü yanı bu workflow'u değiştirmek için girmeniz gereken sayfada bu hatayı alıyorsunuz. Başka bir projenin sayfasından bu yönetim kısmına gidip ID yi elle değişitrmek istediğinizde de yemiyor...&lt;br /&gt;
&lt;br /&gt;
Projelerin ID lerini bulmak için rest API den faydalanıyoruz.&lt;br /&gt;
http://ip:8080/rest/api/2/project [1]&lt;br /&gt;
&lt;br /&gt;
http://ip:8080/secure/project/SelectProjectWorkflowScheme!default.jspa?projectId=10000&lt;br /&gt;
&lt;br /&gt;
Ama aynı hata devam ediyor...&lt;br /&gt;
&lt;br /&gt;
Sonra aklıma yardım sayfasında elemanın mysql üzerinden insert yapmaya çalışması geldi. Yeni eklediğim workflow daki "attribute" ları eklemem gerektiğini düşündüm. &amp;nbsp;(En başta olması gereken buydu zaten)&lt;br /&gt;
&lt;br /&gt;
http://ip:8080/secure/admin/ViewStatuses.jspa&lt;br /&gt;
&lt;br /&gt;
Burda acaba ID tutar mı nasıl olacak derken aynı workflow da tanımlandığı ismi ile ekledim.&lt;br /&gt;
Ve her eklediğim o an aktif oldu.&lt;br /&gt;
&lt;br /&gt;
Sonuç: Artık çalışıyor :)&lt;br /&gt;
&lt;br /&gt;
[1]&amp;nbsp;&lt;a href="http://docs.atlassian.com/jira/REST/latest/"&gt;http://docs.atlassian.com/jira/REST/latest/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://1.bp.blogspot.com/-B8LNFPTZOJ0/UNCgc0BdIMI/AAAAAAAAAKQ/e4GMj7ofurA/s72-c/LOGO_JIRA.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Code Retreat Istanbul</title><link>http://volkanaltan.blogspot.com/2012/12/coderetreat-istanbul.html</link><category>Coderetreat</category><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 13 Dec 2012 10:01:00 +0200</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-7663095111099718234</guid><description>Merhaba,&lt;br /&gt;
&lt;br /&gt;
Geçtiğimiz Cumartesi (8.12.2012) Parkyeri &amp;amp; Telenity iş birliği ile hazırlanan&amp;nbsp;&lt;b&gt;Coderetreat Istanbul&lt;/b&gt; etkinliğine katıldım. İnanılmaz keyifli ve güzeldi. Çeşitli etkinliklere kartılmıştım ama&amp;nbsp;&lt;b&gt;Coderetreat &lt;/b&gt;budur diyeceğimiz bir etkinlikti.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Neler kazandırdı ?&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;a.&lt;/b&gt; Hiç tanımadığınız insanlarla çalışma fırsatı.&lt;br /&gt;
&lt;b&gt;b.&lt;/b&gt;&amp;nbsp;&lt;a href="http://www.youtube.com/watch?v=U1SDMq06yDw" target="_blank"&gt;Silbaştan&lt;/a&gt; yapmak gerek bazen.&lt;br /&gt;
&lt;b&gt;c.&lt;/b&gt; Farklı şekilde düşünmeye çalışma.&lt;br /&gt;
&lt;b&gt;d.&lt;/b&gt; Çok iyi şarkı söyleyemesenizde ortama ayak uydurma.&lt;br /&gt;
&lt;b&gt;e.&lt;/b&gt; Dünya TDD yapana güzel.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;a)&lt;/b&gt; Her 45 dakikada yeni bir oturum, yeni görev ve yeni bir arkadaşınız oluyor.&lt;br /&gt;
Herkes bir önceki otorumda yaptığı iş ile ilgili bilgi paylaşımında bulunuyor.&lt;br /&gt;
Tabi yeni gelişmelerle ilgili eski "pair" larınız ile konuşup geçmişi yad ediyorsunuz.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;b)&lt;/b&gt; Her 45 dakika sonunda mevcut kodu shift+delete ile silip ortadan kaldırıyorsunuz.&lt;br /&gt;
Her oturumda yeni biri olarak işe başlıyorsunuz.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;c)&lt;/b&gt; Aslında bunun için zorluyorlar ki bu çok iyi. Eve hergün aynı yoldan gidince durup düşünmüyorsunuz bile o yolu öylece gidiyorsunuz. Ama bilmediğiniz yola girince kafanız hiç aşağı eğilmiyor...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;d)&lt;/b&gt; Bazı terimleri, yazılan kodu anlamasanızda sizde yazıyorsunuz bişeyler. Sonra zaten nakaratı öğrenince sizde bağırmaya başlıyorsunuz...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;e)&lt;/b&gt; Eee bu kadar şey ne için, maymun gözünü açsın diye. Ama işe başladığınızda bal kabağı ile takılmaya devam ediyorsunuz. TDD yapılan bir firmada çalışmanın tadıda ne güzel olurdu...&lt;br /&gt;
&lt;br /&gt;
Son olarak böylesi organizasyonların artmasını diliyorum, Allah diğer "büyük" firmalarada böylesi faydalı etkinlikler yapmayı nasip etsin. Büyükler bu işlere yatırım yapıp ev sahipliği yapmayacaksa "yurt dışından adam getirelim" kafası yaşamaya devam edecek. Ama bunun bir kısır döngü olduğu "bilen"ler tarafından "biliniyor"...&lt;br /&gt;
&lt;br /&gt;
Not: Etkinlik ile ilgili detaylı bilgi için&amp;nbsp;&lt;a href="https://www.facebook.com/groups/coderetreatistanbul/" target="_blank"&gt;Facebook Sayfası&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Teşekkürler&amp;nbsp;&lt;b&gt;Parkyeri &amp;amp; Telenity&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Zend Framework 2'yi tanıyalım...</title><link>http://volkanaltan.blogspot.com/2012/09/zend-framework-2yi-tanyalm.html</link><category>Php</category><category>Zend Framework</category><category>zf2</category><author>noreply@blogger.com (Unknown)</author><pubDate>Tue, 25 Sep 2012 23:22:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-4130272582434369650</guid><description>&lt;div class="separator" style="clear: both; text-align: center;"&gt;
&lt;a href="http://4.bp.blogspot.com/-6dViynw7WBE/UFd6P65rrPI/AAAAAAAAAJ0/pB3mUBN7qc8/s1600/ZF2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="189" src="http://4.bp.blogspot.com/-6dViynw7WBE/UFd6P65rrPI/AAAAAAAAAJ0/pB3mUBN7qc8/s320/ZF2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;"&gt;Bildiğiniz üzere Zend Framework 2'nin kararlı sürümü geçtiğimiz günlerde&amp;nbsp;&lt;/span&gt;&lt;a data-mce-href="http://framework.zend.com/" href="http://framework.zend.com/" style="font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;" target="_blank"&gt;yayınlandı&lt;/a&gt;&lt;span style="color: #333333; font-family: Georgia, 'Times New Roman', 'Bitstream Charter', Times, serif; font-size: 13px; line-height: 19px;"&gt;.&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #333333; font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; font-size: x-small;"&gt;&lt;span style="line-height: 19px;"&gt;Zend ciddi değişiklikler ile karşımıza neredeyse tamamen yeni bir ürün çıkarttı. Bende bunu en sade haliyle anlatmaya çalıştım.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #333333; font-family: Georgia, Times New Roman, Bitstream Charter, Times, serif; font-size: x-small;"&gt;&lt;span style="line-height: 19px;"&gt;&lt;a href="http://www.gelistiricigunlugu.com/zend-framework-2yi-taniyalim/"&gt;http://www.gelistiricigunlugu.com/zend-framework-2yi-taniyalim/&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;</description><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" height="72" url="http://4.bp.blogspot.com/-6dViynw7WBE/UFd6P65rrPI/AAAAAAAAAJ0/pB3mUBN7qc8/s72-c/ZF2.png" width="72"/><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Rocket Internet'in ardından</title><link>http://volkanaltan.blogspot.com/2012/08/rocket-internetin-ardndan.html</link><author>noreply@blogger.com (Unknown)</author><pubDate>Sat, 18 Aug 2012 01:28:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-5289888812070439034</guid><description>Aslında söylenecek çok şey var ama çoğunu arkadaşlarımız söyledi şuralardan okuyabilirsiniz.&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://irfandurmus.com/blog/rocket-turkiye-ofisinin-kapanmasi/"&gt;http://irfandurmus.com/blog/rocket-turkiye-ofisinin-kapanmasi/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://ibrahimgunduz.net/rockete-veda/"&gt;http://ibrahimgunduz.net/rockete-veda/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://negaripseylervarya.blogspot.com/2012/08/efendi-gibi-nasl-batlr.html"&gt;http://negaripseylervarya.blogspot.com/2012/08/efendi-gibi-nasl-batlr.html&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Birde işin medyatik yönü var o da şurda ;&lt;br /&gt;
&lt;a href="http://www.webrazzi.com/2012/08/17/rocket-internet-turkiye-kapaniyor/"&gt;www.webrazzi.com/2012/08/17/rocket-internet-turkiye-kapaniyor/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Eee bu kadar mı ? Yok arkadaşlar ben size başka şeyler anlatacağım. Bütün kaliteli imkanların yanı sıra,&lt;br /&gt;
&lt;br /&gt;
Adam akıllı kütüphanesi vardı,&lt;br /&gt;
İnançlara saygı ve hoşgörü vardı.&lt;br /&gt;
Örnek:&lt;br /&gt;
&lt;b&gt;Mescidi vardı&amp;nbsp;&lt;/b&gt;(henüz bu imkanı veren yer göremedim, ayrıca mescit için toplantı odasının bir kısmını bölüp ayırmışlardı.)&lt;br /&gt;
Ramazan nedeniyle CTO (Önder Bey) Volkan sabah biraz erken gel akşamda kafan durunca çık diyebiliyordu.&lt;br /&gt;
Bir sorununuz olduğunda Takım liderinizden developer arkadaşlarınıza herkes alakadar oluyordu.&lt;br /&gt;
Kısaca insalık hoşgörü hat safhadaydı. Kimsede size dik dik bakıp laf sokuşturma peşinde değildi!&lt;br /&gt;
&lt;br /&gt;
Bu kadar şeyden sonra Cumartesi sorun çıktı bakar mısın dediklerinde seve seve bakıyorsunuz...&lt;br /&gt;
(Gerçi öyle bişey nasip olmadı :) )&lt;br /&gt;
&lt;br /&gt;
Sonuç Rocket Internet gerçekten iyiydi...&lt;br /&gt;
&lt;br /&gt;
Tüm çalışma arkadaşlarıma teşekkürü bir borç biliyorum. Hepsine başarılar diliyorum.&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total></item><item><title>MySQL stres testleri için mysqlslap</title><link>http://volkanaltan.blogspot.com/2012/06/mysql-stres-testleri-icin-mysqlslap.html</link><category>MySql</category><category>mysqlslap</category><category>Performance</category><category>stress test</category><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 7 Jun 2012 14:45:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-7927278275624627510</guid><description>MySQL stres testleri için mysqlslap kullanımı ile ilgili bir yazı yazdım. &lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.gelistiricigunlugu.com/mysql-stres-testleri-icin-mysqlslap/"&gt;http://www.gelistiricigunlugu.com/mysql-stres-testleri-icin-mysqlslap/&lt;/a&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Subquery pişmanlık değildir!!!</title><link>http://volkanaltan.blogspot.com/2012/05/subquery-pismanlk-degildir.html</link><category>MySql</category><category>Performance</category><author>noreply@blogger.com (Unknown)</author><pubDate>Thu, 31 May 2012 15:29:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-3863939975557042177</guid><description>Subquery pişmanlık değildir!!!&lt;br /&gt;
&lt;br /&gt;
Neden mi ?&lt;br /&gt;
&lt;br /&gt;
JOIN ile yaptığınız sql'i &lt;b&gt;Explain&lt;/b&gt; ile kontrol edin. Sonrasında eğer bir tablonun binlerce satır gezdiğini görüyorsanız ve subquery yapılabiliyorsa direk select'e bunu alın...&lt;br /&gt;
&lt;br /&gt;
Birde şimdi bakın hızına...&lt;br /&gt;
&lt;br /&gt;
Büyük joinlerle yazdığınız SQL'ler sonrasında &lt;b&gt;ORDER BY&lt;/b&gt; ile sıraya koyuluyorsa veya &lt;b&gt;GROUP BY&lt;/b&gt; ile müdahale ediliyorsa bu müdahele öncesi bir joini tablodan çıkarmak akıllıca olacaktır...&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Not: &lt;/b&gt;Asla unutmamak gerek ki bir durumda doğru olan bir şey her durumda doğru olmayabilir.&lt;br /&gt;
O yüzden diyoruz ki &lt;b&gt;EXPLAIN&lt;/b&gt; kullanın.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Not2:&lt;/b&gt; Testler öncesinde şu komutları çalıştırmayı unutmayın, aynı zamanda test edilen iki query aynı anda çalıştırılmalı. Birini çalıştırıp daha sonra diğerini çalıştırmak büyük &lt;b&gt;hata&lt;/b&gt; olacaktır.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
SET GLOBAL query_cache_size = 0;&lt;br /&gt;
SET GLOBAL query_cache_type=0;&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Not3:&lt;/b&gt; &lt;b&gt;DISTINCT&lt;/b&gt; ile &lt;b&gt;GROUP BY&lt;/b&gt;&amp;nbsp;arasındaki fark GROUP BY'ın aynı zamanda ORDER BY özelliğinin bulunmasıdır. Ona göre bu komutları kullanın.&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item><item><title>Git notlarım</title><link>http://volkanaltan.blogspot.com/2012/05/git-notlarm.html</link><category>Git</category><category>Notlarım</category><author>noreply@blogger.com (Unknown)</author><pubDate>Mon, 28 May 2012 20:18:00 +0300</pubDate><guid isPermaLink="false">tag:blogger.com,1999:blog-6590504022815262237.post-4720244218900457241</guid><description>Bunlar sadece çok kullandığımız komutların notları. Zaman zaman güncellenecektir.&lt;br /&gt;
&lt;br /&gt;
&lt;b id="internal-source-marker_0.980091396253556" style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git reset --hard origin/branch-name&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;local branch’i origin deki ile aynı duruma getirmek için kullanılıyor.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git reset --hard hash &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;ile geri çektik&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git push origin +master:master&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; çekilen yere ana depo eşitlendi.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git push origin branch-name&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; yeni dal uzakta oluşturma&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git push origin :branch-name&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;remote depo silme&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git branch -a&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; bütün depoları göster&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git branch -r&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; uzak depoları göster&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git branch -l&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; local depoları göster&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git branch -m old-branch-name new-branch-name&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;branch adı değiştirme&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git push origin branch-name&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; &amp;nbsp;kendi kullanıcıma bağlı olan yerde dal açma&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git remote add uzakdepo /home/username/myrepo&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt; uzak depo bağlama&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;Böylece uzakdepo benim için anahtar kelime oluyor&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;Belirli bir loga dönmek için&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git reset --hard (hash)&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;d6422a1266c4199cf772d960a172b7aceca66e3b&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git reset --hard origin/master &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;locali origine eşitlemek için&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;b style="font-weight: normal;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b style="font-weight: normal;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Bir dosyayı herhangi bir dala geri alma;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git checkout hash &amp;nbsp;filePath&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Stage de iken &lt;b&gt;git checkout -- filePath&lt;/b&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;uzaktaki dalı localde oluşturmak için&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git checkout -b BRANCH-NAME origin/BRANCH-NAME&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;git checkout -b BRANCH-NAME BRANCH-NAME&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;İki türlüde oluyor. Uzaktaki dalı sizin için çekiyor. &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git fetch&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt; &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;ile locale merge edilebilecek veya erişilebilecek dallar veya dosyalar çekilir&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git pull &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;ile hem fetch işlemi hemde merge işlemi yapılır&lt;/span&gt;&lt;br /&gt;
&lt;b style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git diff branch-name &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;bulunduğunuz branch ile yazdığınız branch arasındaki farkı gösterir&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git diff branch-name &amp;gt; diff.patch &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;göstereceği şeyi dosyaya yazar

&lt;/span&gt;&lt;br /&gt;
&lt;b style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Sadece git değil svn üzerinden aldığınız patchleride uygulayabilirsiniz.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Diff alma ve patch'e yazma&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git diff &amp;gt; ../diff.patch&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;git diff BRANCH-NAME &amp;gt; ../diff.patch&lt;/b&gt;&lt;br /&gt;
&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/b&gt;
&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Branch birleştirme&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git merge &lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;BRANCH-NAME&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Çakışma varsa &lt;/span&gt;&lt;br /&gt;
&lt;b&gt;&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;git &lt;/span&gt;&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;mergetool&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;branchi hangi daldan oluşturduğunu bulma &lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br class="kix-line-break" /&gt;git reflog show --all | grep -i "branch:" | grep -i created | grep -i BRANCH-ADI&lt;/span&gt;&lt;br /&gt;
&lt;b style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;comit edilmemiş dosyayı silme: &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;Önce fiziksel silme “&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;rm file&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;” sonra “&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git rm file&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;” &amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;git add -u&lt;/span&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt; incele&lt;/span&gt;&lt;br /&gt;
&lt;b style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; vertical-align: baseline; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/b&gt;
&lt;b id="internal-source-marker_0.980091396253556" style="font-weight: normal;"&gt;&lt;span style="font-family: Arial; font-size: 15px; font-weight: bold; vertical-align: baseline; white-space: pre-wrap;"&gt;for x in `git status | grep deleted | awk '{print $3}'`; do echo $x; done;&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Statusu deleted olanları ekrana basma.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;İki commit arasındaki farkları alma;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git log &lt;/b&gt;ile&lt;b&gt; &lt;/b&gt;yapılan commitlerin hashi bulunur. &lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git diff hash1 hash2 &lt;/b&gt;şeklinde fark görüntülenir.&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Alınan diff'i kontrol etme&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git apply --check diff.patch&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;
&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Alınan diff ile nelerin değiştiğini görme&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git apply --stat diff.patch&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Uygulama&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git apply diff.patch&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;Diff olayı derin mevzu şurası iyi bir kaynak : &lt;/span&gt;&lt;span style="background-color: white; font-size: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;a href="http://learn.github.com/p/diff.html"&gt;http://learn.github.com/p/diff.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span 15px="15px" font-size:="font-size:" pre-wrap="pre-wrap" white-space:="white-space:"&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;b&gt;Git commit lerini birleştirme;&lt;/b&gt;
git commit -m 'mesaj' . ile çok sayıda commit yapıp sonra bunları teke çekmek isteyebilirsiniz.
komut: &lt;b&gt;git rebase -i HEAD~3&lt;/b&gt;
Burda 3 commit sayısı siz commit sayınızı yazacaksınız. 
vim açılacak;
pick 73a45d3 mesaj1
pick b5f70f9  mesaj2
pick a2c63a4 mesaj3

 sondan iki &lt;b&gt;"pick"&lt;/b&gt; i &lt;b&gt;"f"&lt;/b&gt; yapıyoruz;

pick 73a45d3 mesaj1
f b5f70f9 mesaj2
f a2c63a4 mesaj3
:wq!

 işlem tamam. git log ile kontrol edebilirsiniz . daha fazla durum için açılan pencereden detaylar var oraya bakabilirsiniz.

&lt;b&gt;Çalıştığınız branch'e origin(master) den güncelleme almak.&lt;/b&gt;
Sorun şöyle çıkıyor, bir branch de çalışıp push ettiniz front-end aldı bişeyler yaptı push etti. Locali son duruma getirmek için komut ;
&lt;b&gt;git pull --rebase origin BRANCH-NAME&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;b&gt;Sürekli kullanıcı adı veya Şifre sorulması&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Projenizde çalışırken bu sorunu yaşıyorsanız &lt;b&gt;https&lt;/b&gt; şeklinde url set edilmiş demektir. &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Şöyle değiştirebilirsiniz.&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git remote set-url origin git@github.com:kullanici/proje.git&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Tüm değerleri görmek içi: &lt;b&gt;git config --list&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;Yapılan commiti geri alma&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;b style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;git reset --soft HEAD^&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-family: Arial; font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/span&gt;
&lt;b&gt;Uzak depo ekleme&lt;/b&gt;&lt;br /&gt;
git remote add zf2 https://github.com/zendframework/zf2.git&lt;br /&gt;
&lt;b&gt;Depoyu çekme&lt;/b&gt;&lt;br /&gt;
git fetch zf2&lt;br /&gt;
&lt;b&gt;Depoyu master ile birleştirme (çek birleştir)&lt;/b&gt;&lt;br /&gt;
git pull zf2 master&lt;br /&gt;
Kimi zaman birleştirme yerine araya girme yapılmalı, sizin branch geride kalmış olabilir.&lt;br /&gt;
&lt;b&gt;git rebase zf2&lt;/b&gt;&lt;br /&gt;
Yaptıklarımızı gönderme&lt;br /&gt;
git push origin&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Bulunduğunuz branch için güncelleme geldiğinde onu kolayca almak&lt;/b&gt;&lt;br /&gt;
git checkout zf2&lt;br /&gt;
git pull --rebase&lt;br /&gt;
&lt;br /&gt;
Önce zf2 branchine geçtik, bu başka bir branchde olabilirdi.&lt;br /&gt;
Sonra yeni neler var diye baktık.&lt;br /&gt;
Son olarak zf2 için gelen yeni kodları ilgili branche aldık.&lt;br /&gt;
&lt;br /&gt;
Değişiklikleri kaydet ve dalın içini değişim öncesi hale getir.&lt;br /&gt;
&lt;b&gt;git stash save&lt;/b&gt;&lt;br /&gt;
Kaydettiğin değişiklikleri geri getir.&lt;br /&gt;
&lt;b&gt;git stash pop&lt;/b&gt;&lt;br /&gt;
&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;span style="font-family: Arial;"&gt;Hayat kurtarır (projeyi git te olmayan herşeyden temizler...)&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-family: Arial;"&gt;&lt;span style="font-size: 15px; white-space: pre-wrap;"&gt;&lt;b&gt;git clean -d -f -x&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;
&lt;span style="background-color: white; font-size: 15px; white-space: pre-wrap;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Local branch silme&lt;br /&gt;
&lt;b&gt;git branch -D ISSUE-NO&lt;/b&gt;&lt;br /&gt;
Uzak branch silme&lt;br /&gt;
&lt;b&gt;git push origin :ISSUE-NO&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;</description><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total></item></channel></rss>