tag:blogger.com,1999:blog-61673194410681459502024-03-19T05:54:52.777-07:00Kerem HallaçPer aspera ad astraAnonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.comBlogger18125tag:blogger.com,1999:blog-6167319441068145950.post-35098120564662686882017-03-07T11:14:00.001-08:002017-03-07T11:14:17.480-08:00Kod Kapsamı ve Gcov ile Lcov Araçlarının KullanımıHerkese merhaba bu senenin ilk döneminde bitirme projemde Libreoffice'de birim testlerin geliştirilmesi üzerine çalışmalarım oldu. Şimdi ise Libreoffice'de kod kapsamı üzerinde çalışıyorum.<br />
<br />
Bu yazımda;<br />
• Kod kapsamının ne olduğundan<br />
• Projelerin kod kapsamı açısından nasıl geliştirilebileceğinden<br />
• Kod kapsamıyla ilgili kullanılan araçlardan bahsedeceğim. <br />
<br />
<b>Kod Kapsamı: </b>Tam olarak bir orandır. Projede var olan testlerin kontrol ettiği kodun, yazılan bütün koda oranına denir. Sonuç olarak bize bir % vermektedir ve bu oranın 100'e yakın olması amaçlanmaktadır. Projelerde kod kapsamını geliştirirken farklı parametreler değerlendirilir. Bunlara bakacak olursak;<br />
<br />
• Yazdığımız testler bütün kod için yetersiz olabilir. Projede test edilmeyen kısımlar için ek olarak birim testler yazılmalıdır.<br />
<br />
• Projede ölü kodlar bulunabilir bunlar projeden kaldırılmalıdır.<br />
<br />
<b>Gcov ve Lcov: </b>Gcov projelerimizi kod kapsamı bakımından test edebileceğimiz bir araçtır, lcov ise bu test sonuçlarını tarayıcıda görmemizi sağlayan bir araçtır. Şimdi bir dosya üzerinde bu araçların kullanımına bakalım.<br />
<br />
hello.cpp isimli dosyamızı kod kapsamı testini gcov ile yapalım.<br />
<br />
<pre style="background: #f6f8ff; color: #000020;">$ g<span style="color: #308080;">+</span><span style="color: #308080;">+</span> <span style="color: #308080;">-</span>fprofile<span style="color: #308080;">-</span>arcs <span style="color: #308080;">-</span>ftest<span style="color: #308080;">-</span>coverage hello<span style="color: #308080;">.</span>cpp <span style="color: #308080;">-</span>o hello </pre>
<br />
komutunu çalıştırarak <b>hello.gcno</b> dosyasını oluşturmuş oluruz. Daha sonra<br />
<br />
<pre style="background: #f6f8ff; color: #000020;"><span style="color: #308080;">$ .</span><span style="color: #308080;">/</span>hello
</pre>
<br />
komutunu çalıştırıp <b>hello.gcda</b> dosyasını oluştururuz. Şimdi<br />
<br />
<pre style="background: #f6f8ff; color: #000020;">$ gcov hello<span style="color: #308080;">.</span>cpp
</pre>
<br />
komutu ile dosyamızda kod kapsamı testi yapmış oluruz ve<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_b_Ep8o01D4H-ecHos_KbW8a_9CqS7N9T8FftrvIERoiBeZa82FjU4X-XxjU-uXH4A3IAkV_cbHWtTMwLNzXenLJGiVYR5rcbO70ggFLBSHzZu2ea4YQxAipXgmrwtkY1uUMPa9z5tE5Y/s1600/Screenshot+from+2017-03-07+21%253A40%253A27.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="71" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_b_Ep8o01D4H-ecHos_KbW8a_9CqS7N9T8FftrvIERoiBeZa82FjU4X-XxjU-uXH4A3IAkV_cbHWtTMwLNzXenLJGiVYR5rcbO70ggFLBSHzZu2ea4YQxAipXgmrwtkY1uUMPa9z5tE5Y/s400/Screenshot+from+2017-03-07+21%253A40%253A27.png" width="400" /> </a></div>
<div class="separator" style="clear: both; text-align: left;">
çıktısını almış oluruz. Şimdi lcov kullanımına bakalım.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<pre style="background: #f6f8ff; color: #000020;">$ lcov <span style="color: #308080;">-</span><span style="color: #308080;">-</span>capture <span style="color: #308080;">-</span><span style="color: #308080;">-</span>directory <span style="color: #308080;">.</span> <span style="color: #308080;">-</span><span style="color: #308080;">-</span>output<span style="color: #308080;">-</span>file hello<span style="color: #308080;">.</span>info
</pre>
<br />
komutunu çalıştırarak <b>hello.info </b>dosyasını oluşturduk.<br />
<br />
<pre style="background: #f6f8ff; color: #000020;">$ genhtml hello<span style="color: #308080;">.</span>info <span style="color: #308080;">-</span><span style="color: #308080;">-</span>output<span style="color: #308080;">-</span>directory <span style="color: #308080;">.</span>
</pre>
<br />
komutunu çalıştırdıktan sonra klasörümüzde <b>index.html</b> dosyası oluşacaktır. Bu dosyayı tarayıcımızda çalıştırdığımızda;<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge2rQqZbl5X-WvthBSulNh87f9J3xV2di-luVwFC8cQvJWRwvm8JDRFFmY13B0IH0N-cpO15DDcjLo649HE_BHaDi2Inx1ILVfvN9xLaCIiEX01dMJdlRrbIXV6o06zrl6zv2-rwflK1gL/s1600/Screenshot+from+2017-03-07+21%253A51%253A29.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="156" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEge2rQqZbl5X-WvthBSulNh87f9J3xV2di-luVwFC8cQvJWRwvm8JDRFFmY13B0IH0N-cpO15DDcjLo649HE_BHaDi2Inx1ILVfvN9xLaCIiEX01dMJdlRrbIXV6o06zrl6zv2-rwflK1gL/s640/Screenshot+from+2017-03-07+21%253A51%253A29.png" width="640" /></a></div>
<br />
arayüzü karşımıza çıkacaktır buradan dosyaların kod kapsam oranlarına nerelerde hatalar olduğuna bakabiliriz.<br />
<br />
Bir sonraki yazımda Libreoffice'de kod kapsamından, nasıl geliştirlebileceğinden ve benim katkılarımdan bahsedeceğim iyi çalışmalar.Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-71176686300781827952017-01-15T12:26:00.000-08:002017-01-15T12:26:00.061-08:00LibreOffice Çalışmalarım - 1Herkese merhaba bu sene bitirme projemi LibreOffice ile ilgili yapıyorum. Bu yazımda ilk dönemde nasıl işler yaptığımdan bahsedeceğim.<br />
<br />
Geçen senenin başından itibaren LibreOffice ile ilgili çalışıyorum. Geçen sene çalışmalarım projenin farklı kısımlarıyla ilgili oldu. Öncelikle süreci öğreten hata kayıtlarına kod göndermekle başladım daha sonra LibreOffice veritabanı aracı olan Base üzerinde çalıştım senenin sonunda 6 tane yama gönderdim.<br />
<br />
Bu sene bitirme projemde ise LibreOffice'de birim testler üzerine çalışıyorum. Projede Java ile yazılmış birim testlerin Python ve C++ ortamlarına geçirilmesi isteniyor. Var olan testlerin ise yeni getirilen özellikler ile değiştirilmesi isteniyor.<br />
<br />
Python testlerinde değiştirilmesi istenen <a href="https://cgit.freedesktop.org/libreoffice/core/commit/?id=af8143bc40cf2cfbc12e77c9bb7de01b655f7b30" target="_blank">özellikler</a> vardı. 2 farklı modüldeki python testlerin büyük bir kısmına bu özellikleri kazandırdım ve 10 tane yama gönderdim.<br />
<br />
C++ testlerinde ise kod kapsamayı olumsuz yönde etkileyen kod kapsama oranını düşüren kısımların düzeltilmesi ile ilgili çalıştım. LibreOffice'de yazılmış olan kodlardaki kod kapsama oranlarına <a href="http://lcov.libreoffice.org/" target="_blank">şuradan</a> ulaşabilirsiniz. Bu konuyla ilgili de 6 tane yama gönderdim.<br />
<br />
Bu çalışmalarıma ek olarak LibreOffice projesinde Almanca kullanılan kelimelerin İngilizce'ye çevirilmesi isteniyor. Bu hata kaydını seviyorum doğrusu, çalışmaya ara verdiğim zamanlarda bununla ilgili çalışıyorum :) Bu konuyla ilgili de 3 tane yama gönderdim.<br />
<br />
LibreOffice deposuna gönderdiğim yamaların linklerine <a href="https://gerrit.libreoffice.org/#/q/owner:hallackerem%2540gmail.com+status:merged" target="_blank">şuradan</a> ulaşabilirsiniz.<br />
<br />
İyi çalışmalar.Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-49148588992537337752016-09-17T01:34:00.001-07:002016-09-20T14:13:59.768-07:00ODC İş Çözümleri Yaz StajıHerkese merhaba, ikinci stajımı bu yaz ODC'de yaptım ve bu süre içerisinde kazanmış olduğum deneyimlerimi paylaşmak istedim.<br />
<br />
Stajım iki ay sürdü. İlk ayda <a href="http://swagger.io/" target="_blank">Swagger</a> üzerine çalıştım. Bir rest apinin nasıl Swagger uyumlu hale getirileceğini öğrendim. Diğer Swagger araçlarını (<a href="http://swagger.io/swagger-codegen/" target="_blank">Swagger Codegen</a>, <a href="http://swagger.io/swagger-ui/" target="_blank">Swagger UI</a>, <a href="http://swagger.io/swagger-core/" target="_blank">Swagger Core</a> ) da öğrenip üzerinde çalıştığım projede uyguladım. Swagger çalışmalarıma ek olarak ilk ayda <a href="http://trbootstrap.com/" target="_blank">Bootstrap</a> öğrendim. Uygulama olarak Bootstrap ile bir form oluşturdum, bu formdaki girilen bilgileri bir servise gönderdim. İkinci ayda ise JUnit üzerine çalışmalar yaptım. 1 ay boyunca birim test ile ilgilenmem çok faydalı oldu benim için. Büyük çaplı projelerdeki birim testin önemini anlamış oldum. Nelerin test edilmesi gerektiğini, hangi amaçla test edildiğini öğrenmiş oldum.<br />
<br />
Staj maceramın :) neler yaptım kısmı böyleydi. Şimdi duygu ve düşüncelere geçmek istiyorum.<br />
<br />
Staj çıkışında metrobüste eve dönerken; akşama hangi konulara bakmam gerektiğini ve o gün neler öğrendiğimi düşündüğümde doğru yolda olduğumu anladım :) Tam bunu anladığımda <a href="https://www.youtube.com/watch?v=RXS5M2a9ZDc" target="_blank">Eluveitie - Vianna</a> şarkısı çalıyordu. Beni motive eden parçalardan birisidir dayanamadım sizle de paylaştım.<br />
<br />
Kavacık ciddi anlamda çok güzel e-si-yor-du :) Öğle aralarımız çok eğlenceli geçiyordu. <br />
<br />
Stajda aklıma gelen her soruyu sorduğumda göstermiş oldukları sabırdan dolayı :) <a class="g-profile" href="https://plus.google.com/113027704005574432348" target="_blank">+Serdar Yiğit</a> <a class="g-profile" href="https://plus.google.com/111701434619558661830" target="_blank">+ibrahim halil altun</a> , Sinan Dirlik ve Nevra Aşuk'a çok teşekkür ederim. Bana yapmış olduğunuz bütün tavsiyeleri ve uyarıları dikkate aldım. Çok güzel zamanlardı benim için özlüyor insan :( İlk defa bir yazımda bu kadar duygusal cümleler kuruyorum :)<br />
<br />
Stajda olduğum süre içerisinde bana yardımcı olan herkese ve <a href="http://www.odc.com.tr/TR/index.php" target="_blank">ODC</a>'ye teşekkür etmek istiyorum.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6RQzvjRLFVdDdOHFF-L7v_mqN__Qm9-AqEiKaDnuOxH6bCWBOuVnrLGzNybNX3pNh_0sRP3DRkSQlEanyrcYebWERl1OEGylUTZFQQ0WbbOXVaqt77i6KZYJzimO_dwh-Kzhc3qXRFqmR/s1600/ODC-I---Cozumleri-halkla-ili--kiler-ajansini-secti_1422626218.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6RQzvjRLFVdDdOHFF-L7v_mqN__Qm9-AqEiKaDnuOxH6bCWBOuVnrLGzNybNX3pNh_0sRP3DRkSQlEanyrcYebWERl1OEGylUTZFQQ0WbbOXVaqt77i6KZYJzimO_dwh-Kzhc3qXRFqmR/s320/ODC-I---Cozumleri-halkla-ili--kiler-ajansini-secti_1422626218.jpg" width="320" /></a></div>
<br />
Son olarak stajımla ilgili sevdiğim sloganım "More than an Internship :) "Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-71700904441764306402016-08-16T12:16:00.001-07:002016-08-16T12:16:03.542-07:00Birim Test ve JUnit KullanımıHerkese merhaba, bu yazımda Birim Test ve Java'nın bir kütüphanesi olan JUnit'den bahsedeceğim. Yazının içeriğine alt başlıklar halinde şöyle bir bakacak olursak;<br />
<br />
<span style="background-color: white; color: #50545c; font-family: "open sans" , sans-serif; font-size: 15px; line-height: 23.25px;">• <b>Birim Test nedir?</b></span><br />
<span style="background-color: white; color: #50545c; font-family: "open sans" , sans-serif; font-size: 15px; line-height: 23.25px;">• <b>Yazılım Projesinde Birim Test'in Önemi nedir?</b></span><br />
<span style="background-color: white; color: #50545c; font-family: "open sans" , sans-serif; font-size: 15px; line-height: 23.25px;">• <b>JUnit nedir? -</b></span><span style="background-color: white; color: #50545c; font-family: "open sans" , sans-serif; font-size: 15px; line-height: 23.25px;"> </span><b style="color: #50545c; font-family: "open sans", sans-serif; font-size: 15px; line-height: 23.25px;">Junit'de kullanılan assertion / annotation kavramları nelerdir?</b><br />
<span style="background-color: white; color: #50545c; font-family: "open sans" , sans-serif; font-size: 15px; line-height: 23.25px;">• <b>Eclips'de JUnit oluşturulması ve çalıştırılması nasıl olur?</b></span><br />
<span style="background-color: white; color: #50545c; font-family: "open sans" , sans-serif; font-size: 15px; line-height: 23.25px;"><b><br /></b></span>
<span style="background-color: white; color: #50545c; font-family: "open sans" , sans-serif; font-size: 15px; line-height: 23.25px;"><b> <i>Birim Test</i></b></span><br />
En basit anlamda projemizdeki fonksiyonların çalışıp çalışmadığını kontrol eder. Birden fazla birim testimiz olabilir fakat hepsi birbirinden bağımsız çalışmalıdır. Yani her test için odaklanılan tek nokta vardır. Testler sonuç olarak bize true / false döndürürler.<br />
Birim Test hataları bulmak için kullanılmaz, bizim verdiğimiz girdiler ile fonksiyonun çalışırlığını kontrol eder.<br />
Projemizde kaç tane fonksiyon varsa o kadar test olmalıdır.<br />
Birim Test nedir? sorusuna cevap bulduktan sonra şimdi neden kullanılıra gelelim;<br />
<br />
<span style="color: #50545c; font-family: "open sans" , sans-serif; font-size: 15px; line-height: 23.25px;"><b><i>Yazılım Projesinde Birim Test'in Önemi nedir?</i></b></span><br />
Bize kaliteli kod yazmamızı sağlar. Projeyi geliştirme esnasında yanlışlarımızı görmemizi sağlar. Bütün bileşenleri birbirinden bağımsız bir biçimde tasarlamış oluruz. Böylelikle bakımı daha kolay ve kaliteli bir yazılım ortaya çıkar.<br />
Şimdi Java'da test olayına bakalım;<br />
<br />
<b style="color: #50545c; font-family: "open sans", sans-serif; font-size: 15px; line-height: 23.25px;">JUnit nedir? - </b><b style="color: #50545c; font-family: "open sans", sans-serif; font-size: 15px; line-height: 23.25px;">Junit'de kullanılan assertion / annotation kavramları nelerdir?</b><br />
Projemizde bulunan fonksiyonların doğru çıktı verip vermediğini kontrol etmemize yarayan Java kütüphanesidir. Testimizin çalışabilmesi için öncesinde ve sonrasında olması gereken işlemler olabilir. Örnek olarak test edeceğimiz fonksiyonun çalışabilmesi için bir veritabanı bağlantısı gerekiyorsa bunu testten önce sağlamamız gerekir. Böyle durumlarda annotation kullanırız. Testlerde kullanılan annotation'lara bakarsak;<br />
<br />
<pre style="background: #f6f8ff; color: #000020;">@Test : Metodun test edileceğini gösterir
@Test(expected = Exception<span style="color: #008c00;">.</span>class) : Metod hata fırlatmalıdır
@Before : Metodtan önce çalışır<span style="color: #008c00;">.</span>
@After : Metodtan sonra çalışır
@BeforeClass : Sınıf instance olduğunda bir defalığına çalışır
@AfterClass : Metodları test ettikten sonra çalışır
@Ignore : Test edilmesini istemediğimiz metodları temsil eder
</pre>
<br />
Test ettiğimiz fonksiyonların dönüş değerlerine göre durum karşılaştırmaları yaptığımız assertionlar vardır.<br />
Bunların kullanımına bakacak olursak;<br />
<br />
<pre style="background: #f6f8ff; color: #000020;"><span style="color: #200080; font-weight: bold;">public</span> <span style="color: #200080; font-weight: bold;">class</span> OrnekTest<span style="color: #406080;">{</span>
<span style="color: #308080;">@</span>Test
<span style="color: #200080; font-weight: bold;">public</span> <span style="color: #7779bb;">void</span> tabikiTest<span style="color: #308080;">(</span><span style="color: #308080;">)</span><span style="color: #406080;">{</span>
<span style="color: #6679aa; font-weight: bold;">String</span> name <span style="color: #308080;">=</span> <span style="color: #1060b6;">"Kerem"</span><span style="color: #406080;">;</span>
assertEquals<span style="color: #308080;">(</span>name<span style="color: #308080;">,</span> OrnekSinif<span style="color: #308080;">.</span>getPersonName<span style="color: #308080;">(</span><span style="color: #308080;">)</span><span style="color: #308080;">)</span><span style="color: #406080;">;</span>
<span style="color: #406080;">}</span>
<span style="color: #406080;">}</span>
</pre>
<br />
OrnekSinif(nasıl bir sınıf ismiyse :D )'ın getPersonName() fonksiyonundan dönen isim ile bizim oluşturduğumuz ismi karşılaştırıyoruz.<br />
assertEquals() metodu bu iki değer doğruysa test sonucunu true olarak döndürecektir.<br />
Birçok assertion bulunmaktadır bunların <a href="http://junit.sourceforge.net/javadoc/org/junit/Assert.html" target="_blank">tam listesi.</a><br />
<br />
Şimdi artık Eclips'te bir JUnit oluşturup, çalıştırmaya bir bakalım:<br />
<br />
<img alt="✖" class="emoji" draggable="false" src="https://s.w.org/images/core/emoji/72x72/2716.png" style="background-color: white; background-image: none; border: none; box-shadow: none; box-sizing: border-box; color: #50545c; display: inline; font-family: "open sans", sans-serif; font-size: 15px; height: 1em; line-height: 23.25px; margin: 0px 0.07em; max-width: 100%; padding: 0px; vertical-align: -0.1em; width: 1em;" /> Öncelikle projemize JUnit bağımlılıklarını ekliyoruz.<br />
<br />
<pre style="background: #f6f8ff; color: #000020;"><span style="color: #0057a6;"><</span><span style="color: #333385;">dependency</span><span style="color: #0057a6;">></span>
<span style="color: #0057a6;"><</span><span style="color: #333385;">groupId</span><span style="color: #0057a6;">></span>junit<span style="color: #0057a6;"></</span><span style="color: #333385;">groupId</span><span style="color: #0057a6;">></span>
<span style="color: #0057a6;"><</span><span style="color: #333385;">artifactId</span><span style="color: #0057a6;">></span>junit<span style="color: #0057a6;"></</span><span style="color: #333385;">artifactId</span><span style="color: #0057a6;">></span>
<span style="color: #0057a6;"><</span><span style="color: #333385;">version</span><span style="color: #0057a6;">></span>4.12<span style="color: #0057a6;"></</span><span style="color: #333385;">version</span><span style="color: #0057a6;">></span>
<span style="color: #0057a6;"></</span><span style="color: #333385;">dependency</span><span style="color: #0057a6;">></span>
</pre>
<br />
<img alt="✖" class="emoji" draggable="false" src="https://s.w.org/images/core/emoji/72x72/2716.png" style="background-color: white; background-image: none; border: none; box-shadow: none; box-sizing: border-box; color: #50545c; display: inline; font-family: "open sans", sans-serif; font-size: 15px; height: 1em; line-height: 23.25px; margin: 0px 0.07em; max-width: 100%; padding: 0px; vertical-align: -0.1em; width: 1em;" /> <b>New </b><span style="background-color: white; color: #555555; font-family: "source sans pro" , "arial" , "helvetica" , "geneva" , sans-serif; font-size: 15px; line-height: 24px; text-align: justify;">→ </span><b>Other </b><span style="background-color: white; color: #555555; font-family: "source sans pro" , "arial" , "helvetica" , "geneva" , sans-serif; font-size: 15px; line-height: 24px; text-align: justify;">→</span><b> JUnit </b><span style="background-color: white; color: #555555; font-family: "source sans pro" , "arial" , "helvetica" , "geneva" , sans-serif; font-size: 15px; line-height: 24px; text-align: justify;">→ </span><b>JUnit Test Case </b><br />
Daha sonra testimizin ismini belirleyip <b>Finish </b>diyoruz.<br />
<br />
<pre style="background: #f6f8ff; color: #000020;"><span style="color: #200080; font-weight: bold;">import</span><span style="color: #004a43;"> org</span><span style="color: #308080;">.</span><span style="color: #004a43;">junit</span><span style="color: #308080;">.</span><span style="color: #004a43;">Test</span><span style="color: #406080;">;</span>
<span style="color: #200080; font-weight: bold;">public</span> <span style="color: #200080; font-weight: bold;">class</span> TestOrnek <span style="color: #406080;">{</span>
<span style="color: #308080;">@</span>Test
<span style="color: #200080; font-weight: bold;">public</span> <span style="color: #7779bb;">void</span> test<span style="color: #308080;">(</span><span style="color: #308080;">)</span> <span style="color: #406080;">{</span>
fail<span style="color: #308080;">(</span><span style="color: #1060b6;">"Not yet implemented"</span><span style="color: #308080;">)</span><span style="color: #406080;">;</span>
<span style="color: #406080;">}</span>
<span style="color: #406080;">}</span>
</pre>
<br />
Oluşan testimizin içeriği böyle oluyor.<br />
Burada @Test kısmına girdileri verip sonuçların doğruluğunun kontrolünü yaparız.<br />
<br />
Şimdi bu testimize örnek bir uygulama yapalım.<br />
<br />
<pre style="background: #f6f8ff; color: #000020;"><span style="color: #200080; font-weight: bold;">import</span><span style="color: #004a43;"> static org</span><span style="color: #308080;">.</span><span style="color: #004a43;">junit</span><span style="color: #308080;">.</span><span style="color: #004a43;">Assert</span><span style="color: #308080;">.</span><span style="color: #200080; font-weight: bold;">*</span><span style="color: #406080;">;</span>
<span style="color: #200080; font-weight: bold;">import</span><span style="color: #004a43;"> org</span><span style="color: #308080;">.</span><span style="color: #004a43;">junit</span><span style="color: #308080;">.</span><span style="color: #004a43;">Test</span><span style="color: #406080;">;</span>
<span style="color: #200080; font-weight: bold;">public</span> <span style="color: #200080; font-weight: bold;">class</span> TestOrnek <span style="color: #406080;">{</span>
<span style="color: #200080; font-weight: bold;">public</span> <span style="color: #7779bb;">int</span> topla<span style="color: #308080;">(</span><span style="color: #7779bb;">int</span> x<span style="color: #308080;">,</span> <span style="color: #7779bb;">int</span> y<span style="color: #308080;">)</span><span style="color: #406080;">{</span>
<span style="color: #7779bb;">int</span> sonuc <span style="color: #308080;">=</span> <span style="color: #008c00;">0</span><span style="color: #406080;">;</span>
sonuc <span style="color: #308080;">=</span> x <span style="color: #308080;">+</span> y<span style="color: #406080;">;</span>
<span style="color: #200080; font-weight: bold;">return</span> sonuc<span style="color: #406080;">;</span>
<span style="color: #406080;">}</span>
<span style="color: #308080;">@</span>Test
<span style="color: #200080; font-weight: bold;">public</span> <span style="color: #7779bb;">void</span> test<span style="color: #308080;">(</span><span style="color: #308080;">)</span> <span style="color: #406080;">{</span>
<span style="color: #7779bb;">int</span> sonuc<span style="color: #308080;">=</span><span style="color: #008c00;">0</span><span style="color: #406080;">;</span>
sonuc <span style="color: #308080;">=</span> topla<span style="color: #308080;">(</span><span style="color: #008c00;">5</span><span style="color: #308080;">,</span> <span style="color: #008c00;">10</span><span style="color: #308080;">)</span><span style="color: #406080;">;</span>
assertEquals<span style="color: #308080;">(</span><span style="color: #008c00;">15</span><span style="color: #308080;">,</span> sonuc<span style="color: #308080;">)</span><span style="color: #406080;">;</span>
<span style="color: #406080;">}</span>
<span style="color: #406080;">}</span>
</pre>
<br />
Burada eğer topla fonksiyonumuzun sonucu 15 ise testimiz true olarak dönüş yapacaktır.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisx9FlQwzCt1G9p954fz48oEUAzXuM6e4zLbqxGhe4T9PkSQpniaklcK3kRLBpxRrRQYQlNJ1L9Lo7bvvEO3iza3X_ekBVADVQaACcnxv1NsM2YReVKLonLdfTRFFGH2ZNnbp_K2K9bsZe/s1600/Screenshot+%25287%2529.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="304" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisx9FlQwzCt1G9p954fz48oEUAzXuM6e4zLbqxGhe4T9PkSQpniaklcK3kRLBpxRrRQYQlNJ1L9Lo7bvvEO3iza3X_ekBVADVQaACcnxv1NsM2YReVKLonLdfTRFFGH2ZNnbp_K2K9bsZe/s640/Screenshot+%25287%2529.png" width="640" /></a></div>
<br />
Testimizin çalışırlığını böylece kontrol etmiş oluruz.<br />
İyi çalışmalar. Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-59596997240983125212016-08-04T12:19:00.000-07:002016-08-16T00:26:18.495-07:00Bootstrap Kullanarak Form OluşturmakHerkese merhaba, web kütüphanelerinden biri olan Bootstrap ile girilen bir json formatını kullanarak form oluşturmaktan bahsedeceğim.<br />
<br />
Öncelikle Bootstrap'in ne olduğu hakkında bir şeyler söyleyecek olursam;<br />
<br />
<b><a href="http://trbootstrap.com/" target="_blank">Bootstrap;</a> </b>HTML, CSS ve JS'i bir arada bulunduran ve bunları kullanarak web arayüzü geliştirebildiğimiz bir kütüphanedir.<br />
CSS'e ek olarak CSS önişlemcisi olan <a href="http://trbootstrap.com/css/#less" target="_blank">Less</a> ve <a href="http://trbootstrap.com/css/#sass" target="_blank">Sass</a>'ı kullanır.<br />
<br />
Bootstrap açık kaynaklı bir kütüphanedir. Github projesine <a href="https://github.com/twbs/bootstrap" target="_blank">buradan</a> bakabilirsiniz.<br />
<br />
Bootstrap sayfasında birçok uygulayabileceğimiz <a href="http://trbootstrap.com/getting-started/#examples" target="_blank">örnekler</a> bulunmaktadır.<br />
<br />
Şimdi bir json girdisine karşılık gelen formumuzu oluşturalım.<br />
<br />
1-) İlk adım olarak formumuzda hangi alanların oluşmasını istiyorsak o alanları json formatında javascript kodumuzun içerisinde belirtiyoruz.<br />
<pre style='color:#000020;background:#f6f8ff;'><span style='color:#200080; font-weight:bold; '>var</span> fields<span style='color:#308080; '>,</span> form<span style='color:#406080; '>;</span>
fields <span style='color:#308080; '>=</span> <span style='color:#308080; '>[</span>
<span style='color:#406080; '>{</span>
name<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>username</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
label<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>Username</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
type<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>text</span><span style='color:#800000; '>'</span>
<span style='color:#406080; '>}</span><span style='color:#308080; '>,</span> <span style='color:#406080; '>{</span>
name<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>password</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
label<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>Password</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
type<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>password</span><span style='color:#800000; '>'</span>
<span style='color:#406080; '>}</span><span style='color:#308080; '>,</span> <span style='color:#406080; '>{</span>
name<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>fruit</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
label<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>Fruit</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
choices<span style='color:#406080; '>:</span> <span style='color:#308080; '>[</span>
<span style='color:#308080; '>[</span><span style='color:#800000; '>'</span><span style='color:#1060b6; '>apple</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>Apple</span><span style='color:#800000; '>'</span><span style='color:#308080; '>]</span><span style='color:#308080; '>,</span>
<span style='color:#308080; '>[</span><span style='color:#800000; '>'</span><span style='color:#1060b6; '>pear</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>Pear</span><span style='color:#800000; '>'</span><span style='color:#308080; '>]</span><span style='color:#308080; '>,</span>
<span style='color:#308080; '>[</span><span style='color:#800000; '>'</span><span style='color:#1060b6; '>orange</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>Orange</span><span style='color:#800000; '>'</span><span style='color:#308080; '>]</span>
<span style='color:#308080; '>]</span><span style='color:#308080; '>,</span>
type<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>selectmultiple2</span><span style='color:#800000; '>'</span>
<span style='color:#406080; '>}</span><span style='color:#308080; '>,</span> <span style='color:#406080; '>{</span>
label<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>Submit</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
type<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>submit</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
<span style='color:#200080; font-weight:bold; '>class</span><span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>btn-danger</span><span style='color:#800000; '>'</span><span style='color:#308080; '>,</span>
icon<span style='color:#406080; '>:</span> <span style='color:#800000; '>'</span><span style='color:#1060b6; '>ok</span><span style='color:#800000; '>'</span>
<span style='color:#406080; '>}</span><span style='color:#308080; '>]</span><span style='color:#406080; '>;</span>
</pre>
<code class="Brush plain"><code class="Brush plain"><code class="Brush plain"><br /></code></code></code>
<span style="font-size: small;"><code></code></span>2-) Daha sonra bu json girdisini alıp alanlarıyla form oluşturabileceğimiz formata çeviriyoruz.<br />
<br />
<pre style='color:#000020;background:#f6f8ff;'>fields <span style='color:#308080; '>=</span> JSON<span style='color:#308080; '>.</span>stringify<span style='color:#308080; '>(</span>fields<span style='color:#308080; '>)</span><span style='color:#406080; '>;</span>
fields <span style='color:#308080; '>=</span> formatter<span style='color:#308080; '>.</span>formatjson<span style='color:#308080; '>(</span>fields<span style='color:#308080; '>)</span><span style='color:#406080; '>;</span>
demoInput <span style='color:#308080; '>=</span> $<span style='color:#308080; '>(</span><span style='color:#800000; '>'</span><span style='color:#1060b6; '>#form-demo-input</span><span style='color:#800000; '>'</span><span style='color:#308080; '>)</span><span style='color:#406080; '>;</span>
demoInput<span style='color:#308080; '>.</span>val<span style='color:#308080; '>(</span>fields<span style='color:#308080; '>)</span><span style='color:#406080; '>;</span>
outputForm <span style='color:#308080; '>=</span> $<span style='color:#308080; '>(</span><span style='color:#800000; '>'</span><span style='color:#1060b6; '>#form-demo-output</span><span style='color:#800000; '>'</span><span style='color:#308080; '>)</span><span style='color:#406080; '>;</span>
outputForm<span style='color:#308080; '>.</span>submit<span style='color:#308080; '>(</span><span style='color:#200080; font-weight:bold; '>function</span><span style='color:#308080; '>(</span><span style='color:#308080; '>)</span> <span style='color:#406080; '>{</span><span style='color:#200080; font-weight:bold; '>return</span> <span style='color:#0f4d75; '>false</span><span style='color:#406080; '>}</span><span style='color:#308080; '>)</span><span style='color:#406080; '>;</span>
</pre>
Bu işlemleri gerçekleştirdiğimizde formumuz şekildeki gibi oluşur;<br />
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZhmOEaQ6MDvg39AvcqRfaWogc47J0Y1YKdSb-jMUQmZhDrtkkQB5vaaMvqV-enypE1nwkQHJ0LYue3HIbp24syMW5_wjEES1e8iay1SbvJ1RYxxOQwKKQ960cU6uvRKGgE4jue-niyVoG/s1600/Screenshot+from+2016-08-04+22%253A01%253A41.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZhmOEaQ6MDvg39AvcqRfaWogc47J0Y1YKdSb-jMUQmZhDrtkkQB5vaaMvqV-enypE1nwkQHJ0LYue3HIbp24syMW5_wjEES1e8iay1SbvJ1RYxxOQwKKQ960cU6uvRKGgE4jue-niyVoG/s400/Screenshot+from+2016-08-04+22%253A01%253A41.png" width="400" /></a><br />
Kodun tamamı ve uyguladığım örneğe <a href="http://www.jqueryscript.net/form/JSON-Based-Form-Builder-with-jQuery-and-Bootstrap-FormForm.html" target="_blank">linkten</a> ulaşabilirsiniz.<br />
İyi çalışmalar ve kolaylıklar dilerim.Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-32563934043814173292016-08-01T12:39:00.001-07:002016-08-16T00:30:17.023-07:00Rest Api'yi Swagger Uyumlu Hale GetirmekHerkese merhaba, bu yazımda bir Rest Apinin Swagger uyumlu hale getirilmesindeki adımlardan bahsedeceğim. Neleri eklememiz gerektiğinden, hangi özellikler için hangi metodları kullandığımızdan bahsedeceğim.<br />
<br />
<b><i>*Swagger-UI: </i></b><br />
Bir bağımlılığa sahip değildir, kendi yerel makinemizde çalıştırabiliriz. Apinin swagger uyumlu hale geldikten sonraki görüntüsüne örnek olarak <a href="http://petstore.swagger.io/" target="_blank">petstore </a>uygulaması verilebilir.<br />
<br />
Şimdi apiyi swagger uyumlu hale getirmek için izlenecek adımları sırayla uygulamaya başlayalım.<br />
<br />
<b>1-)</b>Öncelikle apimizde bulunan pom.xml dosyasının içine gereken bağımlılıkları ekliyoruz.<br />
<br />
<pre style='color:#000020;background:#f6f8ff;'><span style='color:#0057a6; '><</span><span style='color:#333385; '>dependency</span><span style='color:#0057a6; '>></span>
<span style='color:#0057a6; '><</span><span style='color:#333385; '>groupId</span><span style='color:#0057a6; '>></span>io.swagger<span style='color:#0057a6; '></</span><span style='color:#333385; '>groupId</span><span style='color:#0057a6; '>></span>
<span style='color:#0057a6; '><</span><span style='color:#333385; '>artifactId</span><span style='color:#0057a6; '>></span>swagger-jaxrs<span style='color:#0057a6; '></</span><span style='color:#333385; '>artifactId</span><span style='color:#0057a6; '>></span>
<span style='color:#0057a6; '><</span><span style='color:#333385; '>version</span><span style='color:#0057a6; '>></span>${swagger-version}<span style='color:#0057a6; '></</span><span style='color:#333385; '>version</span><span style='color:#0057a6; '>></span>
<span style='color:#0057a6; '><</span><span style='color:#333385; '>scope</span><span style='color:#0057a6; '>></span>compile<span style='color:#0057a6; '></</span><span style='color:#333385; '>scope</span><span style='color:#0057a6; '>></span>
<span style='color:#0057a6; '></</span><span style='color:#333385; '>dependency</span><span style='color:#0057a6; '>></span>
</pre>
<b>2-) </b>Daha sonra <a href="https://github.com/swagger-api/swagger-ui/releases" target="_blank">buradan</a> Swagger-ui paketini indiriyoruz.<br />
<br />
-> Bu indirdiğimiz paketin içindeki dist klasörünün içindeki bütün dosyaları kopyalıyoruz.<br />
-> Projemizin içinde src/main/webapp içine bir swagger klasörü oluşturalım. Kopyaladığımız bütün dosyaları bu klasörün içine yapıştıralım.<br />
<br />
<b>3-) </b>Şimdi de webconfig.java dosyamızın içine port bilgisi, url bilgisi, uygulama adı gibi swaggerı servera tanımlayacak bilgileri giriyoruz.<br />
<br />
<b>4-) </b>Şimdi ise apimizi swagger uyumlu hale getirebilmek için kod içeriklerinde değişiklikler yapıyoruz.<br />
<br />
Bu kısımda birçok ek açıklamalar kullanıyoruz.<br />
<br />
@Api: Başına getirilen sınıfı bir swagger kaynağı olarak işaretler.<br />
<br />
@ApiModel: Swagger modelleri hakkında bilgiler eklememizi sağlar.<br />
<br />
@ApiOperation: Özel olarak belirlediğimiz bir yola karşılık gelen bir tanımlama yapar.<br />
<br />
@ApiParam: İşlemdeki parametreleri tanımlarız.<br />
<br />
@ApiResponse: İşlem sırasında oluşabilecek hataları tanımlarız.<br />
<br />
Tüm bunları gerçekleştirdikten sonra şekildeki gibi bir görüntü çıkar.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkdxw4wmnOGmO-kh9WV_-p4ofmXZsoI5wUn_RYYW4abnvxSEN83CuB1nVe6bQUTSfj7Zz3JElLzbB7bJLXsoxREwoA3AxE7uFiDQItSyD9dsOS_CNwHZlacr0nn1pFCgVNy1iSvPbsL-s9/s1600/Screenshot+from+2016-08-01+22%253A31%253A00.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="347" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjkdxw4wmnOGmO-kh9WV_-p4ofmXZsoI5wUn_RYYW4abnvxSEN83CuB1nVe6bQUTSfj7Zz3JElLzbB7bJLXsoxREwoA3AxE7uFiDQItSyD9dsOS_CNwHZlacr0nn1pFCgVNy1iSvPbsL-s9/s640/Screenshot+from+2016-08-01+22%253A31%253A00.png" width="640" /></a></div>
<br />
Burada petstore uygulamasının Pet, Store ve User modellerinden User'ın içindeki işlemler yer almaktadır.<br />
<br />
Bu uygulamanın kaynak kodu <a href="https://github.com/swagger-api/swagger-samples/tree/master/java/java-resteasy" target="_blank">şu adreste</a> bulunmaktadır.<br />
İyi çalışmalar dilerim.Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-288790782971600152016-07-27T13:37:00.001-07:002016-08-16T00:34:44.087-07:00Swagger-Codegen ile Kod OluşturmaSelamlar, bu yazımda Swagger araçlarından biri olan Swagger-Codegen ile var olan bir apiyi generate etmekten bahsedeceğim.<br />
<br />
Öncelikle <b><a href="http://www.tutorialspoint.com/compiler_design/compiler_design_code_generation.htm" target="_blank">Kod Oluşturma</a> </b>nedir bunu açıklayacak olursam;<br />
Var olan kodlara kod yazma yeteneği kazandırma işlemidir diyebiliriz. Örneğin elimizde herhangi bir dilde yazılmış bir api var. Biz bunu başka bir dile çevirmek istiyoruz. Bu noktada Kod Oluşturma yapmamız gerekmektedir. Birçok dilde bu işleme özel araçlar bulunmaktadır.<br />
<br />
Ben bu yazımda bahsettiğim örneği açıklayacağım. Bir dilde yazılmış örnek bir apiyi Swagger-Codegen aracını kullanarak başka bir dile generate edilişinden bahsedeceğim.<br />
<br />
*<b>Swagger-Codegen</b><br />
<code><br /></code>
Apiyi generate ederken Java kullanacağım.<br />
<br />
-> Öncelikle Swagger-Codegen .jar dosyasını <a href="http://repo1.maven.org/maven2/io/swagger/swagger-codegen-cli/2.2.0/swagger-codegen-cli-2.2.0.jar" target="_blank">buradan</a> indirmemiz gerekiyor.<br />
<br />
-> Daha sonra aşağıdaki komutları sırasıyla uygulayarak elimizde bulunan apiyi istediğimiz bir dile çevirebiliriz.<br />
<br />
<pre style='color:#000020;background:#f6f8ff;'>$ git clone https<span style='color:#406080; '>:</span><span style='color:#595979; '>//github.com/swagger-api/swagger-codegen</span>
</pre>
<br />
<pre style='color:#000020;background:#f6f8ff;'>$ cd swagger<span style='color:#308080; '>-</span>codegen
</pre>
<br />
<pre style='color:#000020;background:#f6f8ff;'>$ mvn clean package
</pre>
<br />
<pre style='color:#000020;background:#f6f8ff;'>$ java <span style='color:#308080; '>-</span>jar modules<span style='color:#308080; '>/</span>swagger<span style='color:#308080; '>-</span>codegen<span style='color:#308080; '>-</span>cli<span style='color:#308080; '>/</span>target<span style='color:#308080; '>/</span>swagger<span style='color:#308080; '>-</span>codegen<span style='color:#308080; '>-</span>cli<span style='color:#308080; '>.</span>jar
generate \
<span style='color:#308080; '>-</span>i http<span style='color:#406080; '>:</span><span style='color:#595979; '>//petstore.swagger.io/v2/swagger.json \</span>
<span style='color:#308080; '>-</span>l php \
<span style='color:#308080; '>-</span>o <span style='color:#308080; '>/</span>var<span style='color:#308080; '>/</span>tmp<span style='color:#308080; '>/</span>php_api_client
</pre>
<br />
Adımlarını takip ederek apiyi php dilindeki haline generate etmiş oluruz.<br />
<br />
Buradaki parametrelere bakacak olursak;<br />
<b>i: </b>Apinin .json linki<br />
<b>l: </b>Generate etmek istediğimiz dil<br />
<b>o: </b>Generate etmek istediğimiz yerin uzantısı<br />
<br />
Hangi dillere generate edebileceğimizi öğrenmek için;<br />
<br />
<pre style='color:#000020;background:#f6f8ff;'>$ ls <span style='color:#308080; '>-</span><span style='color:#008c00; '>1</span> modules<span style='color:#308080; '>/</span>swagger<span style='color:#308080; '>-</span>codegen<span style='color:#308080; '>/</span>src<span style='color:#308080; '>/</span><span style='color:#400000; '>main</span><span style='color:#308080; '>/</span>java<span style='color:#308080; '>/</span>io<span style='color:#308080; '>/</span>swagger<span style='color:#308080; '>/</span>codegen<span style='color:#308080; '>/</span>languages<span style='color:#308080; '>/</span>
</pre>
<br />
<code>Daha fazla bilgiyi Swagger-Codegen <a href="https://github.com/swagger-api/swagger-codegen" target="_blank">Github</a> sayfasından edinebilirisiniz.</code><br />
<code>Umarım faydalı olmuştur iyi çalışmalar.</code>Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-17722231640009643382016-07-26T04:28:00.002-07:002016-07-26T04:28:37.683-07:00Swagger ve Araçları Herkese merhaba, bu yaz stajında Swagger ile ilgili çalışmalar yapıyorum. Bu süreçte öğrendiğim konulardan bahsetmek istedim.<br />
<b><br />*Öncelikle <span style="background-color: white; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; box-sizing: border-box; color: #333333; font-family: "helvetica neue", helvetica, "segoe ui", arial, freesans, sans-serif; line-height: 28.8px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;"> </span><span style="background-color: white; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; box-sizing: border-box; color: #333333; font-family: "helvetica neue", helvetica, "segoe ui", arial, freesans, sans-serif; line-height: 28.8px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">Open API Initiative'den </span><span style="background-color: white; border-image-outset: initial; border-image-repeat: initial; border-image-slice: initial; border-image-source: initial; border-image-width: initial; border: 0px; box-sizing: border-box; color: #333333; font-family: "helvetica neue" , "helvetica" , "segoe ui" , "arial" , "freesans" , sans-serif; line-height: 28.8px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline;">bahsedecek olursam;</span></b><br />
<span style="background-color: white; color: #333333; font-family: "helvetica neue", helvetica, "segoe ui", arial, freesans, sans-serif; line-height: 28.8px;">Linux Foundation altında açık denetimli bir yapı olarak oluşturulan, gelişmekte ve yükselişte olan bir tanımlama formatıdır. Swagger Specification doğrudan Open Specification'ın temeline dayanarak OAI'ye eklenmiştir.</span><br />
<span style="background-color: white; color: #333333; font-family: "helvetica neue", helvetica, "segoe ui", arial, freesans, sans-serif; font-size: 16px; line-height: 28.8px;"><br /></span>
*<b>OpenAPI Specification(The Swagger Specification);</b><br />
<b><br /></b>
OpenAPI Specification'ın hedefi; insanların ve bilgisayarların anlayabilmesi için REST API'lerin arayüzlerine dilden bağımsız bir standard tanımlamaktır. OpenAPI var olan bir apiyi tekrar yazmamamızı sağlar ama OpenAPI Specification'ın yapısında tanımlanmış servislerin yeteneklerini belirlemek gerkir.<br />
<br />
<b>*Swagger nedir ve hangi amaçla kullanılır?</b><br />
<br />
Swagger; REST Apilerin web ortamında kullanıcılara daha basit ve kullanışlı bir şekilde sunulmasını sağlar. Birçok dile frameworkü bulunmaktadır.<br />
Bir diğer avantajı, herhangi bir dilde yazılmış bir REST Api'yi başka bir dile dönüştürmeye uygundur( Code Generation ).<br />
<br />
Bu proje içinde kendi araçlarını barındırır. Bunları inceleyecek olursak;<br />
<br />
<i><b>*Swagger Core: </b></i>Swagger'ın bir Java uygulamasıdır diyebiliriz. <a href="https://github.com/swagger-api/swagger-core" target="_blank">Github'ta</a> uygulamalı olarak Java ile bir Swagger uygulaması bulunmaktadır.<br />
<br />
<i>*<b>Swagger Codegen: </b></i>Bir dilde yazılmış REST Api'leri istediğimiz dile dönüştürme işlemine yardımcı olur. Bunun java dili yardımıyla yapılışı <a href="https://github.com/swagger-api/swagger-codegen" target="_blank">Github'ta</a> bulunmaktadır.<br />
<br />
<i>*<b>Swagger UI: </b></i>Swagger uyumlu hale getirilmiş Api'yi kullanıcıya sunan bir araçtır. Bu aracın da uyarlanışı <a href="http://swagger.io/swagger-ui/" target="_blank">Github'ta</a> bulunmaktadır.<br />
<b><i><br /></i></b>
<b><i>*Swagger Editor: </i></b>Swagger tanımlamalarını YAML veya JSON formatta oluşturur. Sitesinde bulunan api'yi Generate Client bölümünden istediğimiz dile çevirebiliriz. Swagger Codegen'in yaptığı işlem buna karşılık geliyor. Bu uygulama konuyu anlamak için faydalı oldu benim için.<br />
<a href="http://editor.swagger.io/#/" target="_blank">Uygulama linki </a><br />
<br />
<b><i><a href="http://swagger.io/irc/" target="_blank">*Swagger IRC</a></i></b><br />
<br />
Peki her şeyi tasarladık adımları uyguladık kullanıcıların karşısına nasıl bir görüntü çıkacak;<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDvL7JnLGXMx-R0zHJK62n0t7EIp32Z-m421xS6eWoJptMAjhj6ds6oi2CSoBXHb-KerpyaseOJC6mLwPf4QKQWIbOsv3yZ5HPwGyOIXd_XpFkUfa82jdCIso_aj8Pex9E5U-P7DYKGA5m/s1600/Screenshot+from+2016-07-25+22%253A07%253A08.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjDvL7JnLGXMx-R0zHJK62n0t7EIp32Z-m421xS6eWoJptMAjhj6ds6oi2CSoBXHb-KerpyaseOJC6mLwPf4QKQWIbOsv3yZ5HPwGyOIXd_XpFkUfa82jdCIso_aj8Pex9E5U-P7DYKGA5m/s640/Screenshot+from+2016-07-25+22%253A07%253A08.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Şekilde görüldüğü gibi uygulamadaki bir bölümle iligli işlemler kullanıcıya listelenmektedir. Kullanıcı istediği işlemi gerekli parametreleri girerek gerçekleştirebilir.<br />
<br />
Bu yazımda Swagger'ın ne olduğundan, araçlarından, hangi kolaylıkları sağladığından bahsettim. Bir sonraki yazılarımda araçların nasıl kullanıldığından ve bir apinin Swagger uyumlu hale nasıl getirildiği hakkında yazacağım.<br />
Görüşmek üzere.<br />
<br />Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-19503619869692562972016-05-03T15:21:00.002-07:002016-05-03T15:21:23.419-07:00LibreOffice Hackfest 2016 - AnkaraHerkese merhaba, bu sene Ankara'da TÜBİTAK-ULAKBİM tarafından bir Hackfest gerçekleşti.<br />
<br />
Etkinlik heyecan vericiydi benim için. Çünkü LibreOffice geliştiricilerinden Michael Meeks, Marcus Mohrhard ve Jan-Marek Glogowski'de katıldılar.<br />
<br />
İlk gün geliştiricilerin yaptığı sunumları dinledik. Bu sunumlar bana birçok şey kattı. Çünkü yeni bakış açılar kazanıp, çalıştığımız alanın bilmediğimiz inceliklerini öğrendik.<br />
<br />
Sonraki 2 günde uğraştığım iki tane hata kaydı üzerinde çalıştım. Çalışırken takıldığımız yerlerde geliştiricilere sorup o an halletmek çok iyi oldu.<br />
<br />
Ben LibreOffice Base bileşeni üzerinde çalışıyorum. Bununla ilgili Michael Meeks'e merak ettiğim bütün soruları sordum. Etkinliğin en iyi yönlerinden birisi de buydu benim için; o an merak ettiğim ya da takıldığım konuyu geliştiricilerle çözmek.<br />
<br />
Etkinliğe çalışmaktan büyük keyif aldığım Çanakkale ekibi ile katıldım :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgISMEriEy5wUF-EPVnNu85rGw1KH1PlcoUR2Q-o8rLvV-rS9tYDM0cZH-Vxnja_UaVau9aUoq3y9k-pB-z9Gbt4jJMDxjRFNhUio0arw3KBV89Gxiuzkpt0jZE5qDuqAl47Lc7YExpZIbB/s1600/ChYeBXYUkAEYrxu.jpg%253Alarge.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgISMEriEy5wUF-EPVnNu85rGw1KH1PlcoUR2Q-o8rLvV-rS9tYDM0cZH-Vxnja_UaVau9aUoq3y9k-pB-z9Gbt4jJMDxjRFNhUio0arw3KBV89Gxiuzkpt0jZE5qDuqAl47Lc7YExpZIbB/s400/ChYeBXYUkAEYrxu.jpg%253Alarge.jpeg" width="400" /></a></div>
<br />
Etkinlikte sabahtan akşama kadar kodlama yaptık ama keyifimiz gayet yerindeydi. Çünkü çalışma performansımızdan memnunduk :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilMkqByfFXdUxPwi456JX90yGFgIcBW5ahYoDDpjtmAQ6rY8WewSXvWFHY8Btxofpeu3DORyURC8KygcnP3zbqeOSrm9fWfEWaqVMnzkJS5sm81EgBjpMyALPKCGluSA2NRikRXRugGV-E/s1600/Screenshot+from+2016-05-04+00%253A50%253A31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="298" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEilMkqByfFXdUxPwi456JX90yGFgIcBW5ahYoDDpjtmAQ6rY8WewSXvWFHY8Btxofpeu3DORyURC8KygcnP3zbqeOSrm9fWfEWaqVMnzkJS5sm81EgBjpMyALPKCGluSA2NRikRXRugGV-E/s400/Screenshot+from+2016-05-04+00%253A50%253A31.png" width="400" /></a></div>
<br />
<br />
Etkinliğe katılmam beni hem mutlu edip hem de birçok şey kattı.<br />
Öncelikle <a class="g-profile" href="https://plus.google.com/103870377160954835583" target="_blank">+Necdet </a>hocama, TÜBİTAK-ULAKBİM'e, orada tanıştığımız Muhammet Kara ve Gökhan Gurbetoğlu'na, tabiki yurt dışından gelen Michael Meeks, Marcus Mohrhard ve Jan-Marek Glogowski'ye çok teşekkür ediyorum.<br />
<br />
Yakında görüşmek üzere :) <br />
<br />Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-14006506092733130902016-03-28T15:54:00.001-07:002016-03-28T15:54:13.658-07:00Özgür Yazılım ve Linux Günleri - 2016 Herkese merhaba, Özgür Yazılım ve Linux Günleri bu sene 26-27 Mart tarihlerinde İstanbul Bilgi Ünversitesi'nde gerçekleşti. Etkinliğe ilk defa bu sene katıldım.<br />
<br />
Neden daha önceden katılmadığımı kendime birçok kez sordum :) Çünkü oradaki ortam çok mutlu etti beni. Yeni insanlarla tanışmak yeni bilgiler öğrenmek farklı bakış açıları kazanmak insana çok fayda sağlıyor.<br />
<br />
Etkinlikte dinlediğim beni en çok etkileyen sunum <a class="g-profile" href="https://plus.google.com/103870377160954835583" target="_blank">+Necdet Yücel </a> ve <a class="g-profile" href="https://plus.google.com/108119453562648749330" target="_blank">+Kaan Ozdincer</a> 'in <b>"Yine Yeniden Özgür Yazılım" </b>sunumuydu. Özgür Yazılım ile ilgili doğru bilinen yanlışlar, eksik kalan tanımlamalar, bu alanda nelere dikkat etmemizin gerektiği gibi daha birçok şey öğrenmiş oldum. Bunlar benim için teknik bir bilgiden daha önemliydi. Çünkü benimsediğim ve çalışmayı istediğim bir alan hakkında en ince ayrıntıya kadar bilgi sahibi olmuştum. Böylece hayatımda etkisi çok fazla olan bir 45 dakikaydı benim için :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDorRoTiRWgQaZlcDwSTqErm9bVgmSfloK7a7CWdzNb8pzGKA2R-afeTek501xPE8rmhqpcyuQfuu6zhcSnEZWJdpkKIP3Q2UFMv2AQ7rku17Sw-uYl_FWtYi9G3WfuRBes4fPOZ0Wlki4/s1600/CeiixrjWwAE8dPW.jpg%253Alarge.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDorRoTiRWgQaZlcDwSTqErm9bVgmSfloK7a7CWdzNb8pzGKA2R-afeTek501xPE8rmhqpcyuQfuu6zhcSnEZWJdpkKIP3Q2UFMv2AQ7rku17Sw-uYl_FWtYi9G3WfuRBes4fPOZ0Wlki4/s320/CeiixrjWwAE8dPW.jpg%253Alarge.jpeg" width="320" /></a></div>
<br />
Bir başka severek dinlediğim sunum ise <a class="g-profile" href="https://plus.google.com/111469494273927102130" target="_blank">+Aydan Taşdemir</a> 'in "<b>Pgbarman ile PostgreSQL Yedekleme</b>" sunumuydu. LibreOffice Base bileşeni üzerinde çalıştığım için veritabanıyla ilgili bir sunum dinlemek çok iyi oldu benim için. Özellikle şu anda uğraştığım iş PostgreSQL ile ilgili olduğundan bu sunum bana çok faydalı oldu. PostgreSQL ile ilgili yeni bir özellik öğrenmiş oldum.<br />
<br />
Biz yine Çanakkale'den kalabalık bir ekiple geldik. Bu etkinliğin benim açımdan önemi ayrı bir büyüktü. Çünkü sunumlardan birisini biz yapacaktık, içimde sadece o an tanımlayabileceğim bir heyecan vardı :)<br />
<br />
Bizim sunumumuz "<b>LibreOffice Geliştirme ve Yaygınlaştırma</b>" toplantısı şeklinde gerçkleşti. 13 kişilik büyük bir ekip olarak bugüne kadar yaptığımız çalışmalardan bahsettik. Kendi söylediklerimde ve arkadaşlarımı dinlerken şunu farkettim; gerçekten süreç çok fazla çalışmayı gerektiriyor. Bir iş üzerinde haftalarca hatta aylarca pes etmeden ısrar etmek gerekebiliyor. Ama sonunda kazanılan bilgiler ve çalıştığınız işi bitirdiğinizi görmek aşırı mutluluk veriyor :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-pcIsVqPwBwkixFyabQ10M0S4mdPw9wOTJWg0-YPjtEMsdVjqJdt-EwlOUMcKh8k1WJSvZZlWCNSwp1nj3oLcWY3w8qzBs1yx-Bk55k8W1xL0vKc4OT2Htw_S786zqDHAvfwcS4fxsv4P/s1600/12920524_10153619410173845_3784109899607686931_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg-pcIsVqPwBwkixFyabQ10M0S4mdPw9wOTJWg0-YPjtEMsdVjqJdt-EwlOUMcKh8k1WJSvZZlWCNSwp1nj3oLcWY3w8qzBs1yx-Bk55k8W1xL0vKc4OT2Htw_S786zqDHAvfwcS4fxsv4P/s320/12920524_10153619410173845_3784109899607686931_n.jpg" width="320" /></a></div>
<br />
<br />
Bir sonraki yazıma kadar daha çok çalışıp sizlere daha iyi haberler vermek istiyorum görüşmek üzere :)Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-88427999051142952722016-02-08T02:54:00.001-08:002016-02-08T02:54:18.138-08:00AB2016 - LibreOffice Geliştirme AtölyesiBu sene Akademik Bilişim Aydın Adnan Menderes Üniversitesi'nde gerçekleşti. Etkinlikte 4 gün süren eğitimler ve sonrasında 3 gün konferanslar yapıldı.<br />
<br />
Biz Çanakkale'den kalabalık bir ekiple "<a href="http://ab.org.tr/ab16/kursdir/119.html" target="_blank">LibreOffice Geliştirme Atölyesi</a>" eğitimine katıldık. 4 gün boyunca sabah 9 - akşam 6 saatleri arasında çalışmak benim için çok faydalı oldu. 4 gün boyunca LibreOffice deposuna gönderdiğim 2 yamam alındı :) bunların linkleri <a href="https://gerrit.libreoffice.org/#/c/22035/" target="_blank">Link1</a> ve <a href="https://gerrit.libreoffice.org/#/c/21916/" target="_blank">Link2 </a><br />
<br />
Eğitimde her gün kendime bir şeyler katarak ilerledim. Biten günün sonunda yeni bilgiler öğrenerek yurda gitmek gerçekten çok mutluluk verici oluyor. Sabah bir de yama kabul mailiyle uyanmak +1 mutluluk oluyor :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOptm0Uezftx45dop5rtmaLwWgju61vxQ-uIU-xQQjo3n7ipyx9Pr-bSLi4FYX1yZkUiEifjCHObSyjgzLz7C9mzu-90sHSY0ypnpV1zl1VYl_50XnuqYJe3bQWUgU-03iULQUvR081X-C/s1600/photo_2016-02-08_12-37-28.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhOptm0Uezftx45dop5rtmaLwWgju61vxQ-uIU-xQQjo3n7ipyx9Pr-bSLi4FYX1yZkUiEifjCHObSyjgzLz7C9mzu-90sHSY0ypnpV1zl1VYl_50XnuqYJe3bQWUgU-03iULQUvR081X-C/s400/photo_2016-02-08_12-37-28.jpg" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />
Çalışırken bir yerde takıldığımızda soru sormak istediğimizde hemen yardımımıza koşan sabırla bizleri dinleyen :) <a class="g-profile" href="https://plus.google.com/106152297270761637177" target="_blank">+Gülşah Köse</a> , <a class="g-profile" href="https://plus.google.com/104394055859757545983" target="_blank">+aybüke özdemir</a> , <a class="g-profile" href="https://plus.google.com/100345898069827905649" target="_blank">+Berk Güreken</a> ve <a class="g-profile" href="https://plus.google.com/101491250557255880038" target="_blank">+yeliz taneroğlu</a> eğitmenlerimize teşekkür ediyorum.<br />
<br />
Bu organizasyonda emeği geçen <a class="g-profile" href="https://plus.google.com/115989833498490959543" target="_blank">+Mustafa Akgul</a> ve <a class="g-profile" href="https://plus.google.com/103870377160954835583" target="_blank">+Necdet Yücel</a> hocalarıma çok teşekkür ederim.<br />
<br />
Çok çalışmak gerçekten çok mutluluk verici :)Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-75738084631818752332016-01-26T09:40:00.000-08:002016-01-26T09:40:11.282-08:00Packathon Macerası 23 Ocak tarihinde İstanbul'da Bahçeşehir Üniversitesi'nde gerçekleşen Packathon etkinliğine Kripton ekibi olarak katılmaya karar verdik. Etkinlikle ilgili bilgiye <a href="http://packathon.org/" target="_blank">buradan</a> ulaşabilirsiniz.<div>
<br /></div>
<div>
Etkinlikte çalıştığım ekip arkadaşlarımla 1 gün boyunca öyle bir ortamda çalışmak bana çok şeyler kazandırdı. Günün başlangıcında ekip olarak görev paylaşımında bulunduk. Üzerime düşen görevi yapmam gerektiğinin bilinciyle insan çalıştığından daha fazla çalışıyor. Hepimiz çok çalışıp hedeflediğimiz işleri yerine getirdik. Günün sonunda böyle sonuçlar görmek insanı çok fazla mutlu ediyor ve daha çok çalışma isteği kazandırıyor.</div>
<div>
<br /></div>
<div>
Gün içerisinde çalışırken sürekli meslek hayatımda da böyle bir ortamda olmanın beni mutlu edebileceğini düşündüm. Çünkü üzerinde çalıştığım alan keyif veriyor, birlikte çalıştığım arkadaşlarla o alanda çalışmak gerçekten çok keyifli oluyor. Tatil gününde dışarda kar yağarken birlikte kod yazmak gerçekten çok mutlu edici :) </div>
<div>
<br /></div>
<div>
Etkinliğinin düzenlenmesinde emeği geçen herkese teşekkür ediyorum. Beni çok mutlu eden etkinlikten sonraki duygularımı paylaşmak istedim ve tabiki bir gün boyunca benimle birlikte çalışan ekip arkadaşlarıma da teşekkür ediyorum. </div>
<div>
<br /></div>
<div>
O günden çok sevdiğim bir fotoyu paylaşmak istiyorum ( Gerçekten haberimiz yoktu :) ) <div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV9mFH7Put2K-Ae0aNnk4_TvQTff9GIXASN-yKdrBFaCe1MkW1izq2zJjk2ND2RHceIKRlMygAkrHXmxNNYYsf26gHK9_mPjpobYDrj4xJ29BoiVkLiAWzTmiUp7FJKhyopktZlDP4HUkS/s1600/12524103_10207495445879820_6575725130864290478_n.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="225" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV9mFH7Put2K-Ae0aNnk4_TvQTff9GIXASN-yKdrBFaCe1MkW1izq2zJjk2ND2RHceIKRlMygAkrHXmxNNYYsf26gHK9_mPjpobYDrj4xJ29BoiVkLiAWzTmiUp7FJKhyopktZlDP4HUkS/s400/12524103_10207495445879820_6575725130864290478_n.jpg" width="400" /></a></div>
</div>
Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-76995437838060261292015-07-24T06:47:00.001-07:002015-07-24T06:48:43.217-07:00<h2>
<span style="color: #3d85c6;"><a href="http://keremhallac.blogspot.com/2015/07/promoqube-yaz-staj-for-ruby-d-aslnda.html" target="_blank">PROMOQUBE Yaz Stajı (for Ruby :D ) </a></span></h2>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
Aslında yaz stajlarının hiçbir zaman faydalı geçmediği bir şey yapılmadığı konusunda neredeyse herkes hem fikirdir. Hatta boş boş oturarak geçer 20 iş günü :) Benim geçen seneki yaptığım stajda aynen bu şekilde olmuştu o yüzden biraz akıllanmıştım. Bu sefer farklı olmalıydı bazı şeyler.</div>
<div>
<br /></div>
<div>
Bir gün yine Ruby çok öğrenme aşkıyla doldum ve Ruby-tr mail grubuna mail attım "Yaz için stajyer arayan var mı?" diye :) Geriye dönüşler oldu pek umudum yoktu ama her şey beklediğimin tersine gitti. Gayet güzel oldu her şey. Memnun kaldım stajımın sonunda. </div>
<div>
<br /></div>
<div>
Ruby bilgim 2014 Akademik Bilişim'de 4 günlük eğtimde ne aldıysam o kadardı. Daha sonraları hoby olarak üstüne gide gide bir şeyler öğrendiğimleydi. </div>
<div>
<br /></div>
<div>
Promoqube'de Ruby ile ilgili (bana göre) çok büyük işler yapmaya çalıştım. Her gün yeni bir şeyler öğreniyordum her öğrendiğimi yazıyordum. Unutmayayım kalıcı kalsın ileriki zamanlara da kalsın diye. Stajım böylelikle baya faydalı geçti. </div>
<div>
<br /></div>
<div>
Uludağ sözlük için bir web parser yazdım. Staj bittikten sonra şimdiki hedefim bir türlü öğrenmeye cesaret edemediğim Rails'i öğrenmek :) Umarım onda da güzel şeyler yaparım ve Ruby ile çalışmalarıma devam ederim.</div>
<div>
<br /></div>
<div>
Staj yapıcak arkadaşlara tavsiyem; github hesabınızda birşeyler olsun en azından, blog yazmıyorsanız acilen bir şeyler yazın ve "Özgür Yazılım ulan!" diyin dikkat çekiyorsunuz zaten :) </div>
<div>
<br /></div>
<div>
Çünkü staj mülakatında birçok konu üstüne konuştuk fakat karşımdaki insanların merak ettiği şeyler; "Python nerde öğrendin?" "Ne zamandır Ubuntu kullanıyorsun?" "Neden Özgür Yazılım düşünüyorsun?" ve anladım ki bu alanda gerçekten bir şeyler öğrenmek istedikçe kapılar her zaman açılıyor. En şaşırtıcı noktada en son soru olarak "Okulun neydi?" dediler bir kez daha anladım bizim meslekte okul ve nottan çok neyi yapabiliyor olduğunun daha önemli olduğunu.</div>
<div>
<br /></div>
<div>
Staj yapıyor olan ve yapacak olan arkadaşlara başarılar dilerim şimdiden :)<br />
<br />
Son olarak meşhur Promoqube Logosu :)<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2dqBAZYTpA2VEGU4G7WLpwWtiSGFx9mLnNwkMqawn33SCs7eiLE66PK8TXeK3vTOATEUU3Isa8T5Fx3ZDA0V9fJnNMLQFjwDgQ7KFU8pTxvEreukEUYC1BmvEEyFULSjt3yjoQIHpgSHa/s1600/pq_logo_v1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2dqBAZYTpA2VEGU4G7WLpwWtiSGFx9mLnNwkMqawn33SCs7eiLE66PK8TXeK3vTOATEUU3Isa8T5Fx3ZDA0V9fJnNMLQFjwDgQ7KFU8pTxvEreukEUYC1BmvEEyFULSjt3yjoQIHpgSHa/s1600/pq_logo_v1.jpg" /></a></div>
</div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-78961742277504830072015-07-23T07:32:00.000-07:002015-07-23T07:32:28.538-07:00<h2>
<span style="color: #3d85c6;"><a href="http://keremhallac.blogspot.com/2015/07/ruby-ile-kendimize-ozel-gem-olusturmak.html" target="_blank">Ruby ile Kendimize Özel Gem Oluşturmak</a></span></h2>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
Bu yazımda Ruby de kendi istediğimiz işlevleri programda yerine getiren bir gem oluşturmaktan bahsedeceğim.</div>
<div>
<br /></div>
<div>
Ruby çok sayıda büyüleyici ve kullanışlı kütüphanelere sahiptir, bir çoğu klasik gem dosyası olarak yayınlanmıştır. Diğer kütüphaneler kaynak kodunun .zip ya da .tar.gz arşivlenmişi olarak yayınlanır.</div>
<div>
<br /></div>
<div>
Şimdi öncelikle bir ekrana "Merhaba naber nasılsın :) " yazdıran ruby kodumuzu tasarlayalım.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVxTSTuX9E8uaXmDOquFYARY5AxNfDAHx8UKGiUxmf76T6c3ERizHz-VQQ5dStf1KX3RfPtUTF7cg7p_BFBwTdt1V_m4L4BTHd8PeHecoHPEw9Xo8MzDq0WYP1UEKR-3-zWBZWnRLuqWZ2/s1600/Ekran+Resmi+2015-07-23+17.02.47.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhVxTSTuX9E8uaXmDOquFYARY5AxNfDAHx8UKGiUxmf76T6c3ERizHz-VQQ5dStf1KX3RfPtUTF7cg7p_BFBwTdt1V_m4L4BTHd8PeHecoHPEw9Xo8MzDq0WYP1UEKR-3-zWBZWnRLuqWZ2/s400/Ekran+Resmi+2015-07-23+17.02.47.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Tamam şimdi bu işlevi yerine getirecek bir gem dosyamızı oluşturalım. Bunun uzantısı .gemspec olmalıdır. Onun kodu da aşağıdaki gibidir:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnS_ctwMkL7QKD3dWe5orBPSgkZqMOKyzPfgBBVwGlTKMnezc90E6RlQAtcAw5-HuDWwCDpFXcCGkvwoF6HI9WbwGJJAO62pp0F1iFsTP6E-SVplzVOHFqGchR0J_HpGQoHz1Ut5rDfjeQ/s1600/Ekran+Resmi+2015-07-23+17.09.34.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="253" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhnS_ctwMkL7QKD3dWe5orBPSgkZqMOKyzPfgBBVwGlTKMnezc90E6RlQAtcAw5-HuDWwCDpFXcCGkvwoF6HI9WbwGJJAO62pp0F1iFsTP6E-SVplzVOHFqGchR0J_HpGQoHz1Ut5rDfjeQ/s400/Ekran+Resmi+2015-07-23+17.09.34.png" width="400" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Artık kodlarımız hazır. Terminali açıp aşağıdaki kodu yazdığımızda gem'i oluşturmuş oluyoruz.</div>
<div>
<br /></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4A9wvxzzF0pBI9g1fD2JqMdJz5tJG8A6b1bmteQesNrEenS8-J3NYGYPzuhcpT-qZLaO1nbnukunNFRQ2wqQ68w9sC9LqKECV2YLwR5mYc4Iw1EXTW53xyJBUZ4AWFtKZk8Vaqc_MYGOs/s1600/Ekran+Resmi+2015-07-23+17.12.31.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi4A9wvxzzF0pBI9g1fD2JqMdJz5tJG8A6b1bmteQesNrEenS8-J3NYGYPzuhcpT-qZLaO1nbnukunNFRQ2wqQ68w9sC9LqKECV2YLwR5mYc4Iw1EXTW53xyJBUZ4AWFtKZk8Vaqc_MYGOs/s640/Ekran+Resmi+2015-07-23+17.12.31.png" width="640" /></a></div>
<div>
<br /></div>
<div>
Evet oluşturduğumuz gemi install edelim. Onu yapmak için konsola;</div>
<div>
<br /></div>
<div>
<span style="color: #666666;">% sudo gem install ./merh-0.0.0.gem</span> komutunu yazıyoruz.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitc-opmYZYm3ZKxhC1OtLH1SqfLnyv9tcKhgHe1pEqBu8Zt3AffLaW2uf5x-wyrZFWdPiiwy-twvyeOrJjnx8dRJakVMP4-wODspe3NpZa8BL-DLLYM2BIMbaynN3LylCUvLQzJNmXuoe8/s1600/Ekran+Resmi+2015-07-23+17.16.10.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="108" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitc-opmYZYm3ZKxhC1OtLH1SqfLnyv9tcKhgHe1pEqBu8Zt3AffLaW2uf5x-wyrZFWdPiiwy-twvyeOrJjnx8dRJakVMP4-wODspe3NpZa8BL-DLLYM2BIMbaynN3LylCUvLQzJNmXuoe8/s640/Ekran+Resmi+2015-07-23+17.16.10.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Artık kendi oluşturduğumuz gem yüklenmiş oldu istediğimiz ruby koduna require ederek kullanabiliriz. Yapmamız gereken tek şey .rb uzantılı ruby kodumuzun başına;</div>
<div>
<br /></div>
<div>
<span style="color: #666666;">>> require 'merh'</span> yazmaktır.</div>
<div>
<br /></div>
<div>
Ben bu işlemleri ilk öğrendiğimde çok keyif almıştım çünkü istediğimiz işleri yaptıran kendimize özel bir gem oluşturarak çok farklı şeyler yapabiliriz. Bu başlangıç olarak size örnek göstermek istediğim bir gemdi. Umarım ilgilenenlere faydalı olmuştur. </div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-60116697571418066282015-07-13T07:01:00.000-07:002015-07-13T07:03:02.107-07:00<h2>
<span style="background-color: white; color: #3d85c6;"><a href="https://keremhallac.blogspot.com/b/post-preview?token=K65oiU4BAAA.-34uMDD6V3CYi-9DUw-6Rg.Js8HL_dOzIedM_5G76UzEQ&postId=6011669757141806628&type=POST" target="_blank">Redis & Redis-rb</a></span></h2>
<div>
<span style="background-color: white; color: #3d85c6;"><br /></span></div>
<div>
<span style="color: #3d85c6;">Redis:</span> Veriyi key-value şekilde hafızada tutar. Açık kaynaktır. Redis geçici olan hiçbir şeyi veritabanında gereksiz yere yazmaz. Çeşitli veri yapıları kullanmaya izin verir. Yüksek performanslı cacheing mekanizmasına sahiptir. Veriyi RAM'de tutar ancak istenen aralıklarla veriyi diske kaydedebilir. Belirli periyotlarda aklında tuttuğu verileri bir dosyaya yazdığı için veri kaybı söz konusu değildir.</div>
<div>
<br /></div>
<div>
Memcached'den farklıdır. <a href="https://github.com/memcached/memcached" target="_blank">Memcached </a>sadece veri girişi ve çıkışı yapar. Veriyi RAM'de tutar ancak veriyi dosyaya yazamaz.</div>
<div>
<br /></div>
<div>
Redis github üzerinde <a href="https://en.wikipedia.org/wiki/In-memory_database" target="_blank">in-memory</a> nosql veritabanıdır.</div>
<div>
Kullandığı veri yapıları "string, hashes, lists, bitmaps vb."</div>
<div>
<br /></div>
<span style="color: #3d85c6;"><b>Destekleyen diller;</b></span> C, C#, C++, Clojure, Common Lisp, D, Dart, emacs lisp, Erlang, Fancy, Go, Haskell, haXe, Io, Java, Lua, Node.js, Objective-C, Perl, PHP, Pure Data, Python, Ruby, Scala, Scheme, Smalltalk, Tcl.<br />
<div>
<br /></div>
<h3>
<span style="color: #3d85c6;">Redis-rb</span></h3>
<div>
<span style="color: #3d85c6;"><br /></span></div>
Yukarda Redis'i tanımladıktan sonra şimdi de Ruby'de Redis işlemlerinden bahsetmek istiyorum.<br />
<br />
Her zaman olduğu gibi öncelikli olarak Redis'i require etmemiz gerekir:<br />
<br />
>> <span style="color: red;">require</span> <span style="color: orange;">"redis"</span><br />
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
Redis sınıfı tarafından Redise bağlanmak istersek:</div>
<div>
<br /></div>
<div>
>> redis = <i><span style="color: #6fa8dc;">Redis</span></i>.<span style="color: red;">new</span></div>
<div>
<span style="color: red;"><br /></span></div>
<div>
Eğer bir naklen serverı veya farklı bir porta bağlanmaya ihtiyaç duyarsak:</div>
<div>
<br /></div>
<div>
>> redis = <i><span style="color: #6fa8dc;">Redis</span></i>.<span style="color: red;">new</span>(<span style="color: #8e7cc3;">:host </span>=> <span style="color: orange;">"10.0.1.1"</span>, <span style="color: #8e7cc3;">:port</span> => <span style="color: #8e7cc3;">6380</span>, <span style="color: #8e7cc3;">:db </span>=> <span style="color: #8e7cc3;">15</span>)</div>
<div>
<br /></div>
<div>
Ayrıca özel bağlantı ayarları olan bir URL'ye bağlanabiliriz:</div>
<div>
<br /></div>
<div>
>> redis = <i><span style="color: #6fa8dc;">Redis</span></i>.<span style="color: red;">new</span>(<span style="color: #8e7cc3;">:url </span>=> <span style="color: orange;">"redis://:p4ssw0rd@10.0.1.1:6380/15"</span>)</div>
<div>
<br /></div>
<div>
Bir Unix sokette redis dinlemek için bağlanabiliriz:</div>
<div>
<br /></div>
<div>
>> redis = <i><span style="color: #6fa8dc;">Redis</span></i>.<span style="color: red;">new</span>(<span style="background-color: white;"><span style="color: #8e7cc3;">:path</span></span> => <span style="color: orange;">"/tmp/redis.sock"</span>)</div>
<div>
<br /></div>
<div>
Bir password korumalı redis örneğine bağlantı için:</div>
<div>
<br /></div>
<div>
>> redis = <i><span style="color: #6fa8dc;">Redis</span></i>.<span style="color: red;">new</span>(<span style="color: #8e7cc3;">:password </span>=> <span style="color: orange;">"kerem3434"</span>)</div>
<div>
<br /></div>
<div>
-Redis sınıfı aynı isimlendirilmiş metodları dışa aktarır. Verilen komutlarla çalışırlar.</div>
<div>
-Redis websitesinde özel olarak hazırlanmış argumentler kullanılır. Bakmak için <a href="http://redis.io/commands" target="_blank">tıklayınız</a>.</div>
<div>
<br /></div>
<div>
Bunlara örnek olaran SET ve GET komutlarına bi bakalım.</div>
<div>
<br /></div>
<div>
>> redis.set(<span style="color: orange;">"mykey"</span>, <span style="color: orange;">"kerem hallac"</span>)</div>
<div>
<span style="color: #999999;"># => "OK"</span></div>
<div>
<br /></div>
<div>
>> redis.get(<span style="color: orange;">"mykey"</span>)</div>
<div>
<span style="color: #999999;"># => "kerem hallac"</span></div>
<div>
<span style="color: #999999;"><br /></span></div>
<h3>
<span style="color: #3d85c6;"><span style="background-color: white;">Sentinel Support</span></span></h3>
<div>
<span style="color: #3d85c6;"><span style="background-color: white;"><br /></span></span></div>
<div>
<span style="background-color: white;">Performansı otomatik üstlenme işini Redis Sentinel ile yaparız. Sentinele bağlanma;</span></div>
<div>
<span style="background-color: white;"><br /></span></div>
<div>
<span style="background-color: white;"></span><br />
<div>
<span style="background-color: white;">>> SENTINELS = [{<span style="color: #8e7cc3;">:host </span>=> <span style="color: orange;">"127.0.0.1"</span>, <span style="color: #8e7cc3;">:port</span> => <span style="color: #8e7cc3;">26380</span>},</span></div>
<span style="background-color: white;">
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span> {<span style="color: #8e7cc3;">:host</span> => <span style="color: orange;">"127.0.0.1"</span>, <span style="color: #8e7cc3;">:port</span> => <span style="color: #8e7cc3;">26381</span>}]</div>
<div>
<br /></div>
<div>
>> redis = <i><span style="color: #6fa8dc;">Redis</span></i>.<span style="color: red;">new</span>(<span style="color: #8e7cc3;">:url </span>=> <span style="color: orange;">"redis://mymaster"</span>, <span style="color: #8e7cc3;">:sentinels </span>=> SENTINELS, <span style="color: #8e7cc3;">:role </span>=> <span style="color: #8e7cc3;">:master</span>)</div>
</span></div>
<div>
<span style="color: #999999;"><br /></span></div>
<div>
-Redis stringler isadece değer olarak depolar. Eğer bir nesne depolamak istersek, <span style="color: #3d85c6;">JSON</span> require edip kullanmamız gerekmektedir.</div>
<div>
<br /></div>
<div>
<div>
>> <span style="color: red;">require</span> <span style="color: orange;">"json"</span></div>
<div>
<br /></div>
<div>
>> redis.set <span style="color: orange;">"foo"</span>, [<span style="color: #8e7cc3;">1</span>, <span style="color: #8e7cc3;">2</span>, <span style="color: #8e7cc3;">3</span>].to_json</div>
<div>
<span style="color: #999999;"># => OK</span></div>
<div>
<br /></div>
<div>
>> <span style="color: #6fa8dc;">JSON</span>.parse(redis.get(<span style="color: orange;">"foo"</span>))</div>
<div>
<span style="color: #999999;"># => [1, 2, 3]</span></div>
</div>
<div>
<span style="color: #999999;"><br /></span></div>
<h3>
<span style="color: #3d85c6;">Pipelining</span></h3>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
Çoklu komutları sıralı bir şekilde çalıştırdığımız zaman, fakat bağımlı olmadan, pipelined çağırılabilir. Bu istemci bir sonraki komutun gönderilmesinden önce ilk komutun cevabı için beklemez. </div>
<div>
Bunun avantajı çoklu komutlar gönderildiğinde dönüş yüksek hızlı bir çalışmada sonuçlanır.</div>
<div>
<br /></div>
<div>
<div>
>> redis.pipelined <span style="color: red;">do </span></div>
<div>
>> <span class="Apple-tab-span" style="white-space: pre;"> </span> redis.set <span style="color: orange;">"foo"</span>, <span style="color: orange;">"bar"</span></div>
<div>
>> <span class="Apple-tab-span" style="white-space: pre;"> </span> redis.incr <span style="color: orange;">"baz"</span></div>
<div>
>> <span style="color: red;">end</span></div>
<div>
<br /></div>
<div>
<span style="color: #999999;"># => ["OK", 1]</span></div>
</div>
<div>
<span style="color: #999999;"><br /></span></div>
<div>
Bir atomik oluşumda numaralı komutları çalıştırabilmek için MULTI/EXEC kullanılır. Pipeline çalışmasına benzerdir. Cevaplar multi metodu tarafından döndürülülür.</div>
<div>
<br /></div>
<div>
<div>
>> redis.multi <span style="color: red;">do </span></div>
<div>
>><span class="Apple-tab-span" style="white-space: pre;"> </span> redis.set <span style="color: orange;">"foo"</span>, <span style="color: orange;">"bar"</span></div>
<div>
>><span class="Apple-tab-span" style="white-space: pre;"> </span> redis.incr <span style="color: orange;">"baz"</span></div>
<div>
>><span style="color: red;"> end</span></div>
<div>
<br /></div>
<div>
<span style="color: #999999;"># => ["OK", 1]</span></div>
</div>
<div>
<span style="color: #999999;"><br /></span></div>
<div>
Bir şey yolunda gitmiyorsa exception çevirmeliyiz.</div>
<div>
<br /></div>
<div>
<div>
>> <span style="color: red;">begin</span> </div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span> redis.ping </div>
<div>
>> <span style="color: red;">rescue</span> Exception => e </div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span> e.inspect</div>
<div>
<span style="color: #999999;"># => #<Redis::CannotConnectError: Timed out connecting to Redis on 10.0.1.1:6380></span></div>
<div>
<br /></div>
<div>
<span class="Apple-tab-span" style="white-space: pre;"> </span> e.message</div>
<div>
<span style="color: #999999;"># => Timed out connecting to Redis on 10.0.1.1:6380</span></div>
<div>
>> <span style="color: red;">end</span></div>
</div>
<div>
<br />
Daha fazla bilgi için ---->> <a href="https://github.com/keremh/redis-rb">https://github.com/keremh/redis-rb</a><br />
<br /></div>
<div>
Redis hakkında söylemek istediklerim bu kadar umarım isteyen kişilere faydalı olmuştur. Son olarak Redis'in efsane fotoğrafıyla yazımı sonlandırıyorum :) </div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwZz-AvNcGvc9XzZPNrm3mB2hLMKiAm569Vi05R_lTW2bGdhb1B1-GKglIkkUbhWgtSa8t4D0KKJhkn-x3yKieLBBUBShpbhq9UrS3weRN-rrWwD_Oqt7VCsT0ucF2-RvdvKFRfX36zKl7/s1600/redis.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="275" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwZz-AvNcGvc9XzZPNrm3mB2hLMKiAm569Vi05R_lTW2bGdhb1B1-GKglIkkUbhWgtSa8t4D0KKJhkn-x3yKieLBBUBShpbhq9UrS3weRN-rrWwD_Oqt7VCsT0ucF2-RvdvKFRfX36zKl7/s320/redis.png" width="320" /></a></div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-47681476840154375382015-07-10T04:21:00.001-07:002015-07-10T04:25:02.045-07:00<h2>
<span style="color: #3d85c6;"><a href="http://keremhallac.blogspot.com.tr/2015/07/ruby-ile-unit-testing-yazlan-bir-ruby.html" target="_blank">Ruby ile Unit Testing</a></span></h2>
<div>
Yazılan bir Ruby kodunun nasıl test edileceğinden bahsetmek istedim. Bu test aşaması sonunda kodun çalışmasında sonuç olarak kaç tane iddia var, kaç tane arıza var, kaç tane hata var, kaç tane atlama var bunların sonucuna ulaşmış oluruz.</div>
<div>
<br /></div>
<span style="color: #3d85c6;">Unit Testing: </span>Yazılım programlamasında bir yazılım tasarımı ve geliştirme yöntemidir. Bu yöntemde yazılımcı yazılım kodunu oluşturan birimlerin kullanıma hazır olduğuna ikna olur.<br />
<br />
Şimdi bir SimpleNumber isimli içinde iki sayıyı toplayıp çarpan iki tane metod bulunduran basit bir sınıf oluşturalım:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1jwi2HSYP_lYOanvP4OOzDBVIIrd74QrWteAWN_2wKMBZcDsWuTq7oMsI6-xfHPxEBtkPTRi-qkrJ_2j6s41cQbJQ9spiilXbU2CHR8TiiVpZsXkLQOVQhof3xYyFkI_A0Suks9JM7SxD/s1600/Ekran+Resmi+2015-07-10+13.51.40.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="258" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi1jwi2HSYP_lYOanvP4OOzDBVIIrd74QrWteAWN_2wKMBZcDsWuTq7oMsI6-xfHPxEBtkPTRi-qkrJ_2j6s41cQbJQ9spiilXbU2CHR8TiiVpZsXkLQOVQhof3xYyFkI_A0Suks9JM7SxD/s320/Ekran+Resmi+2015-07-10+13.51.40.png" width="320" /></a></div>
<br />
<br />
<blockquote class="tr_bq">
<br /></blockquote>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Şimdi bu kodun doğruluğuyla alakalı bir test kodu hazırlayalım..<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidTdd_GiC5L4C8SuKTnafi2cvRYwXAnbK7u32KTSgL1YFaI_8oB28Krcrgc-cckkR5wBixogE7c3UaTnAEHI5W9_dQGr1bjr1qAqzBpM3Z5qqaQHwbZXIwdb4Ygp-smWYSg4TRqsF1Z9-T/s1600/Ekran+Resmi+2015-07-10+13.57.54.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="145" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidTdd_GiC5L4C8SuKTnafi2cvRYwXAnbK7u32KTSgL1YFaI_8oB28Krcrgc-cckkR5wBixogE7c3UaTnAEHI5W9_dQGr1bjr1qAqzBpM3Z5qqaQHwbZXIwdb4Ygp-smWYSg4TRqsF1Z9-T/s400/Ekran+Resmi+2015-07-10+13.57.54.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Bu yazdığımız Testi terminalde çalıştırdığımızda alıcağımız çıktı şu olucaktır:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkZVwiaik9uUEAKrUwoUGgKywcZTT-shKKyvYRXB2B_jsKos0SoPK_EMdls6gH2h0qT2eMzyniOqRCxH-cjL7YpHYD7ItYL6MsUKlOpIbuJ9jFgnZGbF10nYGHtMrz478R0TkwlCoDyEO8/s1600/Ekran+Resmi+2015-07-10+14.00.04.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="126" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkZVwiaik9uUEAKrUwoUGgKywcZTT-shKKyvYRXB2B_jsKos0SoPK_EMdls6gH2h0qT2eMzyniOqRCxH-cjL7YpHYD7ItYL6MsUKlOpIbuJ9jFgnZGbF10nYGHtMrz478R0TkwlCoDyEO8/s640/Ekran+Resmi+2015-07-10+14.00.04.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Bu testin sonunda istediğimiz bilgilere ulaşmış oluruz.<br />
Bize daha fazla bilgilerin vermesini isteyebiliriz bir Test sonucunun daha kompleks bir kod tasarlıycak olursak:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7rrJToyGcjdUgVFwaFsfW3S0ndQO5f08O8PkBNK_T5hE8SKh9L_065OLA_VVdiEHiXNFDhRXDn0sqQQ1M3H6H1LyL3rfSsERM_1pjKtpSfr6UHOtYNt2tX7vh67_GuJMfT993oHNkaFjh/s1600/Ekran+Resmi+2015-07-10+14.06.08.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj7rrJToyGcjdUgVFwaFsfW3S0ndQO5f08O8PkBNK_T5hE8SKh9L_065OLA_VVdiEHiXNFDhRXDn0sqQQ1M3H6H1LyL3rfSsERM_1pjKtpSfr6UHOtYNt2tX7vh67_GuJMfT993oHNkaFjh/s640/Ekran+Resmi+2015-07-10+14.06.08.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Bu Test kodunu çalıştıracak olursak alıcağımız çıktı şöyle olucaktır:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcuM-K1wrCrHkVd4FjNPIMvqYGFXcBdAx2uNGFUwd5ASi4to2chtVlcNpNdG7hEDxkOeQZYZLowRTz0FiZ1IaFwvjcQC_p0b0SftdzUQIdvRfxkATRbGPMajAqGqmDpVBDy7ouQBskDRW_/s1600/Ekran+Resmi+2015-07-10+14.08.42.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhcuM-K1wrCrHkVd4FjNPIMvqYGFXcBdAx2uNGFUwd5ASi4to2chtVlcNpNdG7hEDxkOeQZYZLowRTz0FiZ1IaFwvjcQC_p0b0SftdzUQIdvRfxkATRbGPMajAqGqmDpVBDy7ouQBskDRW_/s640/Ekran+Resmi+2015-07-10+14.08.42.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
Ruby'de bu Test aşamasını yukarıdaki kodlarda da kullandığımız birtakım assertionlarla sağlarız.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaBg44THnIvem7UldF4q5wzRjQ96ENPoSMFD2Rb8XYeHDmp_GfARTLq7VlGL5Eebg1qceK5PIbf8LCyElqBEdbF-ru9dmdhv5TyI9190-wHtM2fhHMpe-H9HX9s-_H_in469pulzRyNFJI/s1600/Ekran+Resmi+2015-07-10+14.11.12.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="172" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiaBg44THnIvem7UldF4q5wzRjQ96ENPoSMFD2Rb8XYeHDmp_GfARTLq7VlGL5Eebg1qceK5PIbf8LCyElqBEdbF-ru9dmdhv5TyI9190-wHtM2fhHMpe-H9HX9s-_H_in469pulzRyNFJI/s640/Ekran+Resmi+2015-07-10+14.11.12.png" width="640" /></a></div>
<br />
Onlardan birkaç tanesi bu şekildedir. Tablonun tamamına ulaşmak için <a href="https://en.wikibooks.org/wiki/Ruby_Programming/Unit_testing">tıklayınız</a>.<br />
<br />
Ruby ile ilgili yazmış olduğum Unit Test yazımın sonuna geldik. Okuyup vakit ayırdığınız için teşekkürler umarım faydalı olmuştur ilgilenenlere görüşmek üzere :)Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-83437568579036776382015-07-03T01:32:00.002-07:002015-07-03T02:09:51.574-07:00<h2>
<b><span style="color: #3d85c6;"><a href="http://keremhallac.blogspot.com.tr/2015/07/nokogiri-ile-htmlxml-dokumanlarn.html">Nokogiri ile HTML/XML Dökümanlarını Parsing İşlemi</a></span></b></h2>
<div>
Bir önceki yazımda bir web sitesini Request ve Respond işlemlerinin nasıl yapıldığından bahsetmiştim. Bu işlemlerin ardından o web sitesinde istediğimiz bir kısmı <a href="https://en.wikipedia.org/wiki/Parsing" target="_blank">Parse</a> etme işleminden bahsedicem bu yazımda. </div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;">Nokogiri: </span><a href="http://www.nokogiri.org/tutorials/parsing_an_html_xml_document.html" target="_blank">Nokogiri</a> bir HTML, XML, SAX ve Okuyucu Parserıdır. Ruby'nin Gem listinin içinde yer alır. Dökümanların çekimi sırasında CSS ve XPath ayırıcılarından yardım alır.</div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;">HTML: </span>Web sayfalarını oluşturmak için kullanılan standart metin işaretleme dilidir.</div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;">XML: </span>Hem insanlar hem bilgi işlem sistemleri tarafından kolayca okunabilecek dökümanlar oluşturmaya yarayan bir işaretleme dilidir.</div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;">SAX:</span> XML dosyalarını olay tabanlı, sözcüksel işlemedir. Dosya içerisindeki her düğüm bir geri-besleme fonksiyonu aracılığı ile istemci koda yansıtılır.</div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;">CSS: </span>HTML'e ek olarak metin ve format biçimlendirme alanında fazladan olanaklar sunan bir Web teknolojisidir.</div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;">XPath: </span>XML dökümanındaki bir bilgiyi bulmak için kullanılan bir dildir. XML dökümanı içindeki elemanları ve onlara ait özellikleri incelemeye yarar.</div>
<div>
<br /></div>
<h3>
<span style="color: #3d85c6;">Nokogiri Kurulumu:</span></h3>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrJXkCCL2Eez1XOqOKiXXfyb08JrVG5Vcet877VXwxAEF7Eufe74l9BiWIqn4CbahrZSTo4BLbSKaAtdR2o0L66nrpM8T11CjlADlEyD4GxjFOA-wly2BDCZivKOdFoB73xr7zDIiy870u/s1600/Ekran+Resmi+2015-07-03+10.23.25.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrJXkCCL2Eez1XOqOKiXXfyb08JrVG5Vcet877VXwxAEF7Eufe74l9BiWIqn4CbahrZSTo4BLbSKaAtdR2o0L66nrpM8T11CjlADlEyD4GxjFOA-wly2BDCZivKOdFoB73xr7zDIiy870u/s1600/Ekran+Resmi+2015-07-03+10.23.25.png" /></a>Bu komutu terminale yazdığımızda nokogiri eğer yüklü değilse yüklemiş oluruz.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<h3>
<span style="color: #3d85c6;">Kullanımı için gerekli 'require' işlemleri:</span></h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz1SsCyT0qucskYXfWRYII32L_6FhIUuI4lFpZQVmvd4BbpXjHLnNqemmo58Rm3mlGqKj_T8Y_xaAovPg-jHn4iwz1SzeCVOSzjaHJ1itm3Yvun7Dl5oD1wj6Pxo53kOYGdah7wnEKemgT/s1600/Ekran+Resmi+2015-07-03+10.25.28.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz1SsCyT0qucskYXfWRYII32L_6FhIUuI4lFpZQVmvd4BbpXjHLnNqemmo58Rm3mlGqKj_T8Y_xaAovPg-jHn4iwz1SzeCVOSzjaHJ1itm3Yvun7Dl5oD1wj6Pxo53kOYGdah7wnEKemgT/s1600/Ekran+Resmi+2015-07-03+10.25.28.png" /></a></div>
<div>
Kodun başına mutlaka nokogiri ve open-uri gem'lerini require etmemiz gerekir.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<h3>
<span style="color: #3d85c6;">HTML dökümanını parse etme:</span></h3>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIU3-Fd5HFDFOp8tg8oMQeFtQZqGcDB9f3UJjF16hs9R17SS9Yyp0l4Ludp3N1dOCJ2znrG9Bo0K_4Q-JgUayOSqO04IHgg7EOpfs9qSzrnuPwlHZkajuiQiBfnS-k-Nnh3BZ6249T-jy_/s1600/Ekran+Resmi+2015-07-03+10.33.05.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="52" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIU3-Fd5HFDFOp8tg8oMQeFtQZqGcDB9f3UJjF16hs9R17SS9Yyp0l4Ludp3N1dOCJ2znrG9Bo0K_4Q-JgUayOSqO04IHgg7EOpfs9qSzrnuPwlHZkajuiQiBfnS-k-Nnh3BZ6249T-jy_/s640/Ekran+Resmi+2015-07-03+10.33.05.png" width="640" /></a><span style="color: #3d85c6;"><br /></span></div>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
Bu komut ile verilen linkteki entry'i fetch etmiş oluyoruz. Sonraki adımda da bu entry içindeki yorumlardan istediğimiz birisini parse edeceğiz.</div>
<div>
Parse etmeyi istediğimiz yorumun içinden bir kelimeyi seçip sağ tıklayıp "Öğeyi Denetle" deriz.</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfg6j0y6c_83GAarLfAkqDU3V00meCSp-zebuAJ769B3ZWZEbzhIhj-wNvTbPCXxmBt5v_SfiQusgJaEjFSpb_IjuB5HNATfIbjqFuyFTUZPF9OlIjL6QwNR98mUSGJgYtK-wUL0KfAVeq/s1600/Ekran+Resmi+2015-07-03+10.42.08.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="165" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgfg6j0y6c_83GAarLfAkqDU3V00meCSp-zebuAJ769B3ZWZEbzhIhj-wNvTbPCXxmBt5v_SfiQusgJaEjFSpb_IjuB5HNATfIbjqFuyFTUZPF9OlIjL6QwNR98mUSGJgYtK-wUL0KfAVeq/s400/Ekran+Resmi+2015-07-03+10.42.08.png" width="400" /></a>Burada işaretli kısımdaki id içeriğini altta gösterilen kod kısmında parametre olarak kullanırız ve o yorumun tamamını parse etmiş oluruz.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAXiWDVjRVsif7kwFH6T7_GMcRQUdgcDLegLVKk2J6Ws7kb_6FtUr72Zi_KVKK1k-kAOVDJM4Y7RfmC8gDuyK8YPh5-noe2rRAHSZ2wrpIwiFUZegWLE2UQieobdAhRYrROTBwWjKqqA-C/s1600/Ekran+Resmi+2015-07-03+10.53.06.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="57" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAXiWDVjRVsif7kwFH6T7_GMcRQUdgcDLegLVKk2J6Ws7kb_6FtUr72Zi_KVKK1k-kAOVDJM4Y7RfmC8gDuyK8YPh5-noe2rRAHSZ2wrpIwiFUZegWLE2UQieobdAhRYrROTBwWjKqqA-C/s400/Ekran+Resmi+2015-07-03+10.53.06.png" width="400" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiAXiWDVjRVsif7kwFH6T7_GMcRQUdgcDLegLVKk2J6Ws7kb_6FtUr72Zi_KVKK1k-kAOVDJM4Y7RfmC8gDuyK8YPh5-noe2rRAHSZ2wrpIwiFUZegWLE2UQieobdAhRYrROTBwWjKqqA-C/s1600/Ekran+Resmi+2015-07-03+10.53.06.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><br /></a></div>
<div>
Bu kodun çıktısı olarakta artık o yorumu parse etmiş oluruz.</div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEE_yn7hZApHTmtW9pUv_gJ7gdIoHXIl7pF9wy6tDTkuLL1dkNN3uDk5GPpicDR3aMPqvoq4aJemhDGo67bNX4sY-BGjifTQgoMo0kwwg8hgnBFOzJGoHQtrYN0s0mL6PJ26IKHZFoXqud/s1600/Ekran+Resmi+2015-07-03+10.55.04.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="80" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhEE_yn7hZApHTmtW9pUv_gJ7gdIoHXIl7pF9wy6tDTkuLL1dkNN3uDk5GPpicDR3aMPqvoq4aJemhDGo67bNX4sY-BGjifTQgoMo0kwwg8hgnBFOzJGoHQtrYN0s0mL6PJ26IKHZFoXqud/s640/Ekran+Resmi+2015-07-03+10.55.04.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Bu işlemi bir döngü içinde başlık kısmına denk gelen id numarasından başlanarak arttıra arttıra giderek cevap alabildiğimiz entryleri parse etmemiz mümkündür. Ben bu işlemi CSS kullanarak yaptım bunun XPath ile yapılması da mümkündür tabiki. Fakat o kısımda pek bir bilgim olmadığından CSS'i tercih ettim.</div>
<div>
Yine bu olayı ben HTML kullanarak yaptım bunun XML kullanarak bir dosyadan parse etmekte mümkündür. Aşağıda sizlere onun kodunu paylaşıyorum.</div>
<div>
<br /></div>
<div>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB3PmnK55tEAE-qJSiHo7cJuhrwH-0oXAhXjb-kron1MOV3SKghVz0VEajOVBa_QDh4EGIEOpttaIvTcPsy4ulbd0igGTelcosc89gijJBUl5JW4LD3tE48KEEVmQMwfLoB_NXQR8EqLq2/s1600/Ekran+Resmi+2015-07-03+11.00.53.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiB3PmnK55tEAE-qJSiHo7cJuhrwH-0oXAhXjb-kron1MOV3SKghVz0VEajOVBa_QDh4EGIEOpttaIvTcPsy4ulbd0igGTelcosc89gijJBUl5JW4LD3tE48KEEVmQMwfLoB_NXQR8EqLq2/s1600/Ekran+Resmi+2015-07-03+11.00.53.png" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<h3>
<span style="color: #3d85c6;"><br /></span></h3>
<h3>
<span style="color: #3d85c6;"><br /></span></h3>
<h3>
<span style="color: #3d85c6;">Bazı Parse Ayarları:</span></h3>
<div>
<span style="color: #3d85c6;"><br /></span></div>
<div>
<ul>
<li><span style="color: #3d85c6;">NOBLANKS: </span>Boş nodeları siler</li>
<li><span style="color: #3d85c6;">NOENT: </span>Entitilerin yerine geçer</li>
<li><span style="color: #3d85c6;">NOERROR:</span> Hata raporlarını ortadan kaldırır.</li>
<li><span style="color: #3d85c6;">STRICT:</span> Kusurlu dökümanların parse edilidiği zaman bir hata yükseltir</li>
<li><span style="color: #3d85c6;">NONET:</span> Hiç internet bağlantısı olmadığında parse etme işlemini engeller.</li>
</ul>
</div>
<div>
Yukarıda ayarların kodda nasıl kullanıldığına bakacak olursak;</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu8C_x7laLCN1IRSOfAQ8DOsAHjk0GhrOVLUStktPh7sWFC6xyPPlUXA7_tefyZETPZduMkPIUQ50uV1AHKRlY72dPi31ClRQkqrhBn54F6WktdXc5-uCg6aUYgSlc6PwR8HZXZh2pjV7a/s1600/Ekran+Resmi+2015-07-03+11.10.45.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="83" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiu8C_x7laLCN1IRSOfAQ8DOsAHjk0GhrOVLUStktPh7sWFC6xyPPlUXA7_tefyZETPZduMkPIUQ50uV1AHKRlY72dPi31ClRQkqrhBn54F6WktdXc5-uCg6aUYgSlc6PwR8HZXZh2pjV7a/s640/Ekran+Resmi+2015-07-03+11.10.45.png" width="640" /></a></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
<br /></div>
<div>
Bu yazımın da sonuna gelmiş bulunuyoruz okuyup vakit ayırdığınız için teşekkür ederim. Umarım birazcıkda olsa ilgilenenlere faydalı olmuştur. Sonraki yazılarımda görüşmek üzere :) </div>
<div>
<br /></div>
Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0tag:blogger.com,1999:blog-6167319441068145950.post-82539675585181698932015-06-30T04:51:00.001-07:002015-07-03T02:11:07.670-07:00<b><span style="color: #3d85c6; font-size: x-large;"><a href="http://keremhallac.blogspot.com.tr/2015/06/class-nethttp-http-client-api-for-ruby.html">class Net::HTTP</a></span></b><br />
<b><span style="color: blue; font-size: large;"><br /></span></b>
<b><span style="color: #3d85c6; font-size: large;">HTTP Client API For Ruby</span></b><br />
<b><span style="color: #3d85c6;"><br /></span></b>
Ruby ile bir web sitesini crawl etmek istediğimde iki işlemi yapmak zorunda olduğumu öğrendim. Bunlar <a href="http://ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTPResponse.html" target="_blank">Request</a> ve <a href="http://ruby-doc.org/stdlib-2.0.0/libdoc/net/http/rdoc/Net/HTTPResponse.html" target="_blank">Response </a>işlemleri. Bu yazımda baştan adım adım kod örnekleriyle açıklamalarda bulunacağım. Öncelikle bazı tanımların üstünde durmak istiyorum :)<br />
<br />
<span style="color: #3d85c6;">HTTPS(Secure Hyper Text Transfer Protocol): </span>HTTP'nin güvenli ağ protokolü ile birleştirilmiş halidir. Klasik HTTP protokolüne SSL protokolünün eklenmesiyle oluşturulur. İnternette sunucular ve son kullanıcılar arasında bilgilerin başkaları tarafından okunamayacak şekilde aktarılmasını hedefler.<br />
<br />
<span style="color: #3d85c6;">HTTP(Hyper Text Transfer Protocol): </span>İnternette sunucular ve son kullanıcılar arasında bilgilerin aktarılmasını hedefler. Uygulama katmanında yer alır.<br />
<br />
<span style="color: #3d85c6;">URI(Uniform Resource Identifier): </span>Web üzerinde belli bir kaynağa ulaşmak için kullanılan belli bir formata sahip karakter dizisidir.<br />
<br />
<span style="color: #3d85c6;">URL(Uniform Resource Locator):</span> Teknik söylem ve yazım kullanımlarında URI yerine kullanılır.<br />
<br />
<span style="color: #3d85c6;">Web Crawling: </span>Web sitelerini sıralı bir şekilde gezinerek bütün linklerini ya da <span style="color: #3d85c6;"> </span>bizim belirlediğimiz sayıda linklerini elde etmektir.<br />
<br />
Bütün örnek kodların başına NET::HTTP yüklenmiş varsayılır:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrDyWm8gf3SMLZ7IBJAOP1xIAbizSYrEY-qC4wl6GgMb8SfflRYf65TkKE7UJqmRT9LTySaf9hfBZXAM1IksAUYt3QZYl2Kz5pjNx2EZc3yGUZwkr5OsQWaB2Lc6cJwlC5P8SpvLF5Ul5-/s1600/Ekran+Resmi+2015-06-30+13.53.34.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="45" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjrDyWm8gf3SMLZ7IBJAOP1xIAbizSYrEY-qC4wl6GgMb8SfflRYf65TkKE7UJqmRT9LTySaf9hfBZXAM1IksAUYt3QZYl2Kz5pjNx2EZc3yGUZwkr5OsQWaB2Lc6cJwlC5P8SpvLF5Ul5-/s400/Ekran+Resmi+2015-06-30+13.53.34.png" width="400" /></a></div>
<br />
<br />
<br />
<br />
<br />
GET etme işleminde veriyi sadece request ederiz kaydetme yoktur.<br />
POST işleminde ise gönderilen veriyi istersek veritabanına kaydedebiliriz.<br />
<br />
GET etme işlemi yalnız başına, URI yardımıyla veya dinamik parametrelerle birlikte yapılır:<br />
<br />
<span style="color: #3d85c6;">GET:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBxaeQx3wNr7y5HzSQGyJwqOmDffv8d7aW2OjtWvwsN2yJkxbSW9rH-NUCGGxZJRj-6rLuk1WEVRz01AfvSr-XRzKoM4J2bCSNM8QokRksShq1b0d03rmYLMy0r-o5CXO4B2NvFyW4FpYZ/s1600/Ekran+Resmi+2015-06-30+14.00.25.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="59" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhBxaeQx3wNr7y5HzSQGyJwqOmDffv8d7aW2OjtWvwsN2yJkxbSW9rH-NUCGGxZJRj-6rLuk1WEVRz01AfvSr-XRzKoM4J2bCSNM8QokRksShq1b0d03rmYLMy0r-o5CXO4B2NvFyW4FpYZ/s640/Ekran+Resmi+2015-06-30+14.00.25.png" width="640" /></a></div>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">GET by URI:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiul99oZcbYdxUq2E9U8HtaClzJg2lkLVK0NAwc6olelLhbLeqZf5PJvkw1Gb69XyBKwu0Wwak91qLnsSQH18_W1isIsV8XgRIUwxCQCGSoUDl0hY6YO8dB_F77z7m_mJOmJC1v97qM2MBI/s1600/Ekran+Resmi+2015-06-30+14.03.51.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="64" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiul99oZcbYdxUq2E9U8HtaClzJg2lkLVK0NAwc6olelLhbLeqZf5PJvkw1Gb69XyBKwu0Wwak91qLnsSQH18_W1isIsV8XgRIUwxCQCGSoUDl0hY6YO8dB_F77z7m_mJOmJC1v97qM2MBI/s640/Ekran+Resmi+2015-06-30+14.03.51.png" width="640" /></a></div>
<br />
<br />
<br />
<br />
<br />
<span style="color: #3d85c6;">GET with Dynamic Parameters:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJr7zHfvN3KY-to3PmieWqZTmVgJIryvAerGmQ8GI8RHuLptFXNLgMJpvPinjIh2ancNtDsT9pLRqlJLpLtsHv_ejl011R30HP0Aj_77tJDlFhvvqQXbCv1jJrasDSZTOWaWiOIPB16xEI/s1600/Ekran+Resmi+2015-06-30+14.08.45.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="122" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJr7zHfvN3KY-to3PmieWqZTmVgJIryvAerGmQ8GI8RHuLptFXNLgMJpvPinjIh2ancNtDsT9pLRqlJLpLtsHv_ejl011R30HP0Aj_77tJDlFhvvqQXbCv1jJrasDSZTOWaWiOIPB16xEI/s400/Ekran+Resmi+2015-06-30+14.08.45.png" width="400" /></a></div>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">NET::HTTP kullanımı:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqOYNX4S7YHhX_2WzHoC7bmYEoOO_DYFsVYtKXKeZHb8Nn7MMR0BTu_NLh7MV5V0bIzEmLFO3sra8mbPOfJozC4AKQmbRgJAqUKoo_nQ0WXUCZaXzjwByQtKFyVmCh2s8cpUEcyD6kPqrR/s1600/Ekran+Resmi+2015-06-30+14.10.39.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="110" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgqOYNX4S7YHhX_2WzHoC7bmYEoOO_DYFsVYtKXKeZHb8Nn7MMR0BTu_NLh7MV5V0bIzEmLFO3sra8mbPOfJozC4AKQmbRgJAqUKoo_nQ0WXUCZaXzjwByQtKFyVmCh2s8cpUEcyD6kPqrR/s400/Ekran+Resmi+2015-06-30+14.10.39.png" width="400" /></a></div>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">s</span><span style="color: #3d85c6;">tart: </span>hızlı bir şekilde bir tane HTTP server için bir bağlantı oluşturur.<br />
<span style="color: #3d85c6;">new: </span>eğer kendi kendine kapanmayan bir bağlantılı çoklu HTTP kullanmak istersek.<br />
<span style="color: #3d85c6;">finish: </span>bağlantıyı elle kapamak için.<br />
<br />
<span style="color: #3d85c6;">Dataların Response Edilişi:</span><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8aZLdcR8jgHTU-cRZrF2hfSZfc_FNhlxHd587-YA3tKNHqvGe5pTctpvyVFE7Ik-isYxJjD6WmOEEpOovT-1G7a7Lgs-CZd2JJNuZJr0sPAyh0DHju4L1brG6DH8HTrkHYMCiIVJEObAC/s1600/Ekran+Resmi+2015-06-30+14.15.05.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="266" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh8aZLdcR8jgHTU-cRZrF2hfSZfc_FNhlxHd587-YA3tKNHqvGe5pTctpvyVFE7Ik-isYxJjD6WmOEEpOovT-1G7a7Lgs-CZd2JJNuZJr0sPAyh0DHju4L1brG6DH8HTrkHYMCiIVJEObAC/s400/Ekran+Resmi+2015-06-30+14.15.05.png" width="400" /></a><span style="color: #3d85c6;"><br /></span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">Yönlendirmelerin Takibi:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1lIlHVsj3yagYUv4-NKvR7vFUMl3fWzzhIPeNGA5pQAlCE_Ja6MupP6W19jOQ5ebn89KFrceXnMVnpthrpwyVKFjGg4NmA6S1snB1JIXgagYdcmu3NSWsT0ugKXR0MgRF4u90x8k64Uvc/s1600/Ekran+Resmi+2015-06-30+14.18.03.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="255" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1lIlHVsj3yagYUv4-NKvR7vFUMl3fWzzhIPeNGA5pQAlCE_Ja6MupP6W19jOQ5ebn89KFrceXnMVnpthrpwyVKFjGg4NmA6S1snB1JIXgagYdcmu3NSWsT0ugKXR0MgRF4u90x8k64Uvc/s400/Ekran+Resmi+2015-06-30+14.18.03.png" width="400" /></a></div>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">Headerların Set Edilişi:</span><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9DKZG_R2W6RaI2d3MhtwDebHmHPMlFR_pfyfuZqSWJ7SKMSGgfSZZIhvUTVBmOjA4aHRSMpu1Ig7pGdgI5ROZ5QTl9LTKEi7XwddOMsvXHwXjk29p-yg1UDTBNzNACnvdEzy1aKCp78Hj/s1600/Ekran+Resmi+2015-06-30+14.22.43.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="201" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9DKZG_R2W6RaI2d3MhtwDebHmHPMlFR_pfyfuZqSWJ7SKMSGgfSZZIhvUTVBmOjA4aHRSMpu1Ig7pGdgI5ROZ5QTl9LTKEi7XwddOMsvXHwXjk29p-yg1UDTBNzNACnvdEzy1aKCp78Hj/s400/Ekran+Resmi+2015-06-30+14.22.43.png" width="400" /></a><span style="color: #3d85c6;"><br /></span><br />
<br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">Akış Response Bodyleri:</span><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7KeT299_VunZdijfMfNfBKTFtb4UAn7Aphz4zGeNs1Z7PaEDDYoCjGEHs5lx0SLicmL6dmKDZQGSQOgR3HHBKwoneapgy9AHpxGZbN4ZP9EWii9n9sPhanpsmq64C51Fq-PangNMkMlR/s1600/Ekran+Resmi+2015-06-30+14.25.19.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="226" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA7KeT299_VunZdijfMfNfBKTFtb4UAn7Aphz4zGeNs1Z7PaEDDYoCjGEHs5lx0SLicmL6dmKDZQGSQOgR3HHBKwoneapgy9AHpxGZbN4ZP9EWii9n9sPhanpsmq64C51Fq-PangNMkMlR/s400/Ekran+Resmi+2015-06-30+14.25.19.png" width="400" /></a><span style="color: #3d85c6;"><br /></span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">HTTPS ve SSL kullanımı:</span><br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwfSMOC29OQRpZY12L-yOfBT6hkFyH7_QkOD1Ba-I_URx7NotJQ5BF_mRW1UumqN6K7mz6aJjTLxqMHsAuJ6-oOZlla1jXbbJhR3I0LdOoOEOjmhU1lsIuTTMpWaW_n0Pq1Qizk6OHHb4q/s1600/Ekran+Resmi+2015-06-30+14.30.18.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="148" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiwfSMOC29OQRpZY12L-yOfBT6hkFyH7_QkOD1Ba-I_URx7NotJQ5BF_mRW1UumqN6K7mz6aJjTLxqMHsAuJ6-oOZlla1jXbbJhR3I0LdOoOEOjmhU1lsIuTTMpWaW_n0Pq1Qizk6OHHb4q/s400/Ekran+Resmi+2015-06-30+14.30.18.png" width="400" /></a><span style="color: #3d85c6;"><br /></span><br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;">Proxyler:</span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFXQbLZ7KdoAO6tZyTvRl9Ua2jH9HwwIz8zoHdCUbV0SYfNwVkVY-ATicsHFR_tla9ASmA2QP1hXIxe3tw-p_xGTTQGiVE9N4dI-XvmAJJUGGnJRK11DlQK8w7F6sywxLeHP6WrGOieL2M/s1600/Ekran+Resmi+2015-06-30+14.33.08.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="97" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFXQbLZ7KdoAO6tZyTvRl9Ua2jH9HwwIz8zoHdCUbV0SYfNwVkVY-ATicsHFR_tla9ASmA2QP1hXIxe3tw-p_xGTTQGiVE9N4dI-XvmAJJUGGnJRK11DlQK8w7F6sywxLeHP6WrGOieL2M/s640/Ekran+Resmi+2015-06-30+14.33.08.png" width="640" /></a></div>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<a href="http://ruby-doc.org/stdlib-2.2.2/libdoc/net/http/rdoc/Net/HTTP.html" target="_blank">Net::HTTP</a> http_proxy den otomatik olarak bir proxy oluşturur.<br />
<br />
Bir <span style="background-color: white;"><a href="https://tr.wikipedia.org/wiki/Arama_robotu" target="_blank">Web Crawler</a></span> yazma maceramın ilk adımı olan bu işlemleri sizinle paylaşmak istedim umarım yararlı olmuştur ilgilenenlere. Diğer paylaşımlarımda görüşmek üzere teşekkür ederim :)<br />
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>
<span style="color: #3d85c6;"><br /></span>Anonymoushttp://www.blogger.com/profile/04130990337289299966noreply@blogger.com0