<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Beytullah Taşkın on Medium]]></title>
        <description><![CDATA[Stories by Beytullah Taşkın on Medium]]></description>
        <link>https://medium.com/@beyt34?source=rss-3cc7d479b8bb------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*bxsCejYyMTqJc6HE.</url>
            <title>Stories by Beytullah Taşkın on Medium</title>
            <link>https://medium.com/@beyt34?source=rss-3cc7d479b8bb------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 15 Nov 2026 08:54:00 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@beyt34/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com/" rel="hub"/>
        <item>
            <title><![CDATA[Google Sheets’te Yatirim Takibi: TEFAS, BIST, BYF ve Kripto Verilerini Apps Script ile Cekmek]]></title>
            <link>https://medium.com/@beyt34/google-sheetste-yatirim-takibi-tefas-bist-byf-ve-kripto-verilerini-apps-script-ile-cekmek-0eaf0607e65d?source=rss-3cc7d479b8bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/0eaf0607e65d</guid>
            <dc:creator><![CDATA[Beytullah Taşkın]]></dc:creator>
            <pubDate>Mon, 04 May 2026 18:35:30 GMT</pubDate>
            <atom:updated>2026-05-06T08:43:34.430Z</atom:updated>
            <content:encoded><![CDATA[<p>Bir sure once TEFAS fonlarimi Google Sheets’te takip ediyordum, gayet guzel calisan bir IMPORTHTML formuluyle. Sonra bir gun sabah actigimda hucrelerin hepsinde hata. TEFAS site yapisini degistirmis, eski URL&#39;ler artik calismiyordu.</p><p>Bu nokta benim icin bir donus noktasi oldu. “Sayfa scraping ile ne kadar ileri gidebilirsin ki?” sorusunu kendime sormak zorunda kaldim. Cevap basitti: fazla ileri gidemezsin.</p><p>O gunden bu yana farkli bir yapi kurdum. TEFAS fonlari, BIST sertifikalari, BYF’ler ve kripto — hepsini tek bir Google Sheets dosyasinda, Apps Script custom function’lariyla toparliyorum. Bu yazida o yapiyi, nasil kuruldugunu ve hangi API’leri kullandigimi anlatiyorum.</p><h3>Genel Yapi</h3><p>Temel fikir su: Google Sheets’te bir hucreye normal formul gibi yazdigim custom function’lar, arka planda Apps Script uzerinden ilgili API’leri cagiriyor ve sayiyi dogrudan hucreye donduruyor.</p><pre>Sheets hucre → custom function → UrlFetchApp.fetch → API → JSON → sayi</pre><p>Bu yapi HTML parsing’e gore cok daha stabil. Cunku veri kaynagi degismedikce, yani API ayakta oldukca, formul calismaya devam ediyor.</p><h3>Baslangic: Apps Script Projesini Kurmak</h3><p>Google Sheets dosyaniza Apps Script baglamak icin:</p><ol><li>Uzantilar &gt; Apps Script menusunu acin</li><li>Mevcut icerik varsa temizleyin</li><li>GitHub’daki myPortfoyApp.gs dosyasinin icerigini yapistirin</li><li>Kaydedin ve ilk calistirmada izin isteklerini onaylayin</li></ol><p>Bundan sonra asagidaki tum fonksiyonlari herhangi bir hucrede kullanabilirsiniz.</p><h3>Kripto: BtcTurk ve CoinTR</h3><p>Kripto tarafinda iki kaynagi kullaniyorum: BtcTurk ve CoinTR.</p><h3>BtcTurk</h3><pre>=getBtcturkPrice(&quot;BTCUSDT&quot;)<br>=getBtcturkPriceChange(&quot;BTCUSDT&quot;)</pre><p>USDTTRY, BTCUSDT, ETHUSDT, SOLUSDT, AVAXUSDT, XRPUSDT gibi semboller destekleniyor.</p><h3>CoinTR</h3><pre>=getCoinTrPrice(&quot;BNBUSDT&quot;)<br>=getCoinTrPriceChange(&quot;BNBUSDT&quot;)</pre><p>Degisim fonksiyonlari ondalik oran dondurur — yani -0.023 gibi bir deger. Hucre bicimini % yapmayi unutmayin.</p><h3>BYF: Fiyat, Gunluk Degisim ve Donemsel Getiri</h3><p>BYF tarafinda iki farkli ihtiyac var: gunluk degisim ve donemsel performans. Bunlar icin farkli kaynaklar kullaniyorum.</p><h3>Gunluk Fiyat ve Degisim (Yahoo Finance)</h3><pre>=BYF_PRICE(&quot;GLDTR.F&quot;)<br>=BYF_CHANGE(&quot;GLDTR.F&quot;)</pre><p>GLDTR.F, ZGOLD.F, GMSTR.F gibi semboller Yahoo Finance uzerinden geliyor.</p><h3>Donemsel Degisim (TradingView Scanner)</h3><p>Donemsel performans icin Yahoo Finance yeterince kullanisli degil. Bu nedenle TradingView Scanner’a geciyorum:</p><pre>=BYF_CHANGE_PERIOD(&quot;GLDTR.F&quot;; 7)<br>=BYF_CHANGE_PERIOD(&quot;GLDTR.F&quot;; 30)<br>=BYF_CHANGE_PERIOD(&quot;GLDTR.F&quot;; 365)</pre><h3>BIST: Hangi Durumlarda Script Gerekmiyor?</h3><p>Standart BIST hisseleri icin aslinda hic Apps Script yazmaya gerek yok. Google Sheets’in dahili GOOGLEFINANCE fonksiyonu bu is icin yeterli:</p><pre>=GOOGLEFINANCE(&quot;ASELS&quot;)<br>=GOOGLEFINANCE(&quot;ASELS&quot;; &quot;changepct&quot;) / 100</pre><p>Kurulum gerektirmiyor, dogrudan Google’dan besleniyor, GARAN, THYAO, BIMAS gibi yaygin hisseler icin gayet saglam calisiyor.</p><h3>Script Gereken Durumlar</h3><p>Ancak ALTIN.S1 gibi BIST&#39;te islem goren sertifikalar GOOGLEFINANCE&#39;te yer almiyor. Bunlar icin ilk akla gelen IMPORTXML ile sayfa cekme, ama o da uzun omurlu olmuyor.</p><p>Bunun yerine TradingView Scanner API’sini kullandim:</p><pre>=BIST_PRICE(&quot;ALTIN.S1&quot;)<br>=BIST_CHANGE(&quot;ALTIN.S1&quot;)</pre><p>Bu fonksiyonlar ALTIN.S1&#39;in yani sira standart hisseler icin de calisiyor. Yani isterseniz tum BIST satirlarinizi bu fonksiyonlarla da tutabilirsiniz.</p><p>Donemsel degisim icin BYF_CHANGE_PERIOD ayni sekilde BIST sembollerinde de calisiyor:</p><pre>=BYF_CHANGE_PERIOD(&quot;ALTIN.S1&quot;; 30)<br>=BYF_CHANGE_PERIOD(&quot;GARAN&quot;; 365)</pre><h3>TEFAS: En Cok Emek Bu Kisma Girdi</h3><p>TEFAS, benim icin bu projenin baslangic noktasiydi ve en fazla is bu kisimda cikti.</p><p>Eski IMPORTHTML formulum TEFAS site guncellemesinden sonra tamamen bozuldu. Yeni site JavaScript ile render ediliyor, eski URL yapisi degisti ve dogrudan HTML cekme artik calismiyor.</p><p>Cozumu tarayicinin Network tab’ini acip sayfanin arka planda ne cagirdigina bakarak buldum. Fon fiyat verisi fonFiyatBilgiGetir adli bir endpoint&#39;ten JSON olarak geliyordu. Bu endpoint&#39;i Apps Script&#39;ten dogrudan cagirmak yetmiyordu — once fon sayfasini ziyaret edip session cookie&#39;lerini almak, sonra o cookie&#39;lerle POST istek atmak gerekiyordu.</p><p>Endpoint:</p><pre>https://www.tefas.gov.tr/api/funds/fonFiyatBilgiGetir</pre><p>Kullandigim fonksiyonlar:</p><pre>=TEFAS_FON_PRICE(&quot;GTL&quot;)<br>=TEFAS_FON_CHANGE(&quot;GTL&quot;)<br>=TEFAS_FON_GETIRI(&quot;GTL&quot;; 1)<br>=TEFAS_FON_GETIRI(&quot;GTL&quot;; 3)<br>=TEFAS_FON_GETIRI(&quot;GTL&quot;; 6)<br>=TEFAS_FON_GETIRI(&quot;GTL&quot;; 12)</pre><p>TEFAS_FON_GETIRI&#39;nin ikinci parametresi ay sayisi: 1, 3, 6 veya 12.</p><h3>Cache Meselesi</h3><p>Portfoy sayfasinda ayni fon kodu onlarca hucrede gecebiliyor. Her hucre icin ayri API istegi gitmesi hem yavas hem de TEFAS’a gereksiz yuklenme. Bu yuzden CacheService ile 1 saatlik cache ekledim. Ilk istek API&#39;ye gidiyor, sonraki istekler cache&#39;den geliyor. Fon fiyatlari gun icinde cok sik degismediginden bu sure makul bir denge.</p><h3>Sayfayi Nasil Duzenliyorum?</h3><p>Tum bu fonksiyonlari anlamli bir sekilde kullanmak icin sayfa yapisini da buna gore kurdum. Tipik bir satir soyle gorunuyor:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*g_LA07qBRQYImegxtSAA7g.png" /></figure><p>————</p><p>Kod hucrede tutuldugunda formulleri kolon referansiyla yazabiliyorsunuz. Yeni bir enstruman eklemek de sadece bir satir kopyalamak oluyor.</p><p>Bir kac pratik not:</p><ul><li>Degisim ve getiri fonksiyonlari ondalik oran dondurur — hucre bicimini % yapin</li><li>Turkce locale’de parametre ayirici ; olur, Ingilizce locale&#39;de ,</li><li>TEFAS cache 1 saatlik oldugu icin veriyi aninda gormek istiyorsaniz script tarafinda yenilemeniz gerekebilir</li></ul><h3>Formul Ozeti</h3><h3>Kripto</h3><pre>=getBtcturkPrice(&quot;BTCUSDT&quot;)         // BtcTurk fiyat<br>=getBtcturkPriceChange(&quot;BTCUSDT&quot;)   // BtcTurk 24s degisim<br>=getCoinTrPrice(&quot;BNBUSDT&quot;)          // CoinTR fiyat<br>=getCoinTrPriceChange(&quot;BNBUSDT&quot;)    // CoinTR 24s degisim</pre><h3>BYF</h3><pre>=BYF_PRICE(&quot;GLDTR.F&quot;)              // Yahoo Finance fiyat<br>=BYF_CHANGE(&quot;GLDTR.F&quot;)             // Yahoo Finance gunluk degisim<br>=BYF_CHANGE_PERIOD(&quot;GLDTR.F&quot;; 30)  // TradingView donemsel getiri</pre><h3>BIST</h3><pre>// Script gerektirmeyen (standart hisseler):<br>=GOOGLEFINANCE(&quot;ASELS&quot;)<br>=GOOGLEFINANCE(&quot;ASELS&quot;; &quot;changepct&quot;) / 100</pre><pre>// Script (sertifikalar ve ozel enstrumanlar):<br>=BIST_PRICE(&quot;ALTIN.S1&quot;)<br>=BIST_CHANGE(&quot;ALTIN.S1&quot;)</pre><h3>TEFAS</h3><pre>=TEFAS_FON_PRICE(&quot;GTL&quot;)<br>=TEFAS_FON_CHANGE(&quot;GTL&quot;)<br>=TEFAS_FON_GETIRI(&quot;GTL&quot;; 1)<br>=TEFAS_FON_GETIRI(&quot;GTL&quot;; 3)<br>=TEFAS_FON_GETIRI(&quot;GTL&quot;; 6)<br>=TEFAS_FON_GETIRI(&quot;GTL&quot;; 12)</pre><h3>Kaynak Kod</h3><p>Tum fonksiyonlarin guncel koduna GitHub’dan ulasabilirsiniz:</p><p><a href="https://github.com/beyt34/google-app-scripts"><strong>https://github.com/beyt34/google-app-scripts</strong></a></p><p>myPortfoyApp.gs dosyasini kendi Google Sheets projenize kopyalamaniz yeterli.</p><h3>Sonuc</h3><p>Bu yapiyi kurmanin asil degeri, kontrolun bende olmasi. Bir API degisirse sadece ilgili fonksiyonu guncelliyorum, geri kalan her sey oldugu gibi calismaya devam ediyor. HTML scraping’e dayali bir cozumde ise tek bir site guncellemesi her seyi bozabilir — ki benim basima tam olarak bu geldi.</p><p>Eger Google Sheets’te yatirim takibi yapiyorsaniz ve verileriniz artik guvenilmez hale geldiyse, bence bu yaklasimdaki asil kazanim sudur: hangi veriyi nereden cektiginizi bilmek ve bunu kontrol edebilmek.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=0eaf0607e65d" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[.Net Core Web Api üzerinden NLog Graylog Entegrasyonu]]></title>
            <link>https://medium.com/@beyt34/net-core-web-api-%C3%BCzerinden-nlog-graylog-entegrasyonu-b761bbda7eea?source=rss-3cc7d479b8bb------2</link>
            <guid isPermaLink="false">https://medium.com/p/b761bbda7eea</guid>
            <category><![CDATA[graylog]]></category>
            <category><![CDATA[nlog]]></category>
            <category><![CDATA[net-core-5]]></category>
            <dc:creator><![CDATA[Beytullah Taşkın]]></dc:creator>
            <pubDate>Tue, 19 Apr 2022 07:51:22 GMT</pubDate>
            <atom:updated>2022-04-19T08:42:33.420Z</atom:updated>
            <content:encoded><![CDATA[<p>Bu makalemizde;</p><ul><li>localde docker üzerinde graylog u kuracağız.</li><li>gelf tcp 12201 portu üzerinden tanımlama yapacağız.</li><li>örnek bir .netcore web api projesi oluşturacağız.</li><li>nlog ve graylog nuget paketlerini projemize dahil edip, graylog ve text file a log atılmasını sağlayacağız.</li></ul><p>Hadi başlayalım !</p><p>Öncelikle docker üzerinde graylog u kuralım.</p><p>Graylog kurulum için graylog dışında <strong>mongo</strong> ve <strong>elasticsearch</strong> e ihtiyaç duymaktadır. Bu 3 kurulumu aşağıdaki <strong>docker-compose.yml</strong> dosyasını powershell üzerinden çalıştırarak tamamlayabilirsiniz.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/fd606280e22cbb88e4c47f46149aa91f/href">https://medium.com/media/fd606280e22cbb88e4c47f46149aa91f/href</a></iframe><p>Powershell üzerinden aşağıdaki komut çalıştırılır. Olmayan docker imageları indirildikten sonra containerler ayağa kaldırılmış olur.</p><pre>$ docker-compose up -d</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*UirmMtcztbx_kqWquDyWeg.png" /></figure><p>localhost:9000 üzerinden graylog arayüzüne erişilir.</p><p>kullanıcı adı / şifre yml dosyasında belirtildiği gibi admin/admin ile giriş yapılır.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*obUIbPVhCEc8z0z1tUTlKQ.png" /></figure><p>Üst menü system-input adımından GELF TCP 12201 portu global olarak eklenir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/703/1*slvPEmaC4Qra-Iy7unrwqA.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/601/1*3DBboJrn9vUziGDgusGicg.png" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*aQ1ljdqVL6ZubdkLopJGTQ.png" /></figure><p>Graylog UI tarafında yapılacak ayarlar bu kadar. Şimdi uygulama tarafına geçebiliriz.</p><p>Bir tane .net Core WebApi projesi açılır.</p><p>Aşağıdaki nuget paketleri projeye dahil edilir.</p><pre>&lt;PackageReference Include=&quot;NLog.Web.AspNetCore&quot; Version=&quot;4.14.0&quot; /&gt;  <br>&lt;PackageReference Include=&quot;NLog.GelfLayout&quot; Version=&quot;1.2.0&quot; /&gt;</pre><p>Program.cs den nlog ayarları yapılır.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/fe446515701140251fc8c9e39a41e777/href">https://medium.com/media/fe446515701140251fc8c9e39a41e777/href</a></iframe><p>nlog.config ayarları yapılır.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/b59f305faac210f11280ecdb900656b9/href">https://medium.com/media/b59f305faac210f11280ecdb900656b9/href</a></iframe><p>Sample weatherforecast controller üzerinden loglama yapılır.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/db375d077ee2830053409c12b2c9c4a8/href">https://medium.com/media/db375d077ee2830053409c12b2c9c4a8/href</a></iframe><p>Şimdi uygulama çalıştırılıp, swagger üzerinden test edilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*M2_J2VPev6uMYN_oZXTRig.png" /></figure><p>Graylog arayüzünden logların atıldığı kontrol edilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/670/1*7RVtuoSHTbviRpJnMSrIAQ.png" /></figure><p>Uygulama bin klasörü altından text file log attığı kontrol edilir.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bCxI1AFfPK4keGB26-A-UA.png" /></figure><p>Böylece yazımızın sonuna geldik.</p><p>Faydalı olması dileğiyle…</p><p>github repo linki;</p><p><a href="https://github.com/beyt34/graylog-with-nlog">GitHub - beyt34/graylog-with-nlog</a></p><p>kaynaklar;</p><p><a href="https://github.com/farzadpanahi/NLog.GelfLayout">GitHub - farzadpanahi/NLog.GelfLayout: Gelf layout renderer for NLog</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b761bbda7eea" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>