Clear DNS Cache (Flush DNS)

Windows 7

  1. Başlat butonuna tıklayın.
  2. Arama bölümüne cmd yazın.
  3. Komut İstemi bağlantısına sağ tıklayın ve Yönetici Olarak Çalıştır seçeneğini seçiniz.
  4. ipconfig /flushdns yazıp Enter tuşuna basınız.
  5. Eğer işlem başarılıysa aşağıdaki mesajı alırsınız:
    Windows IP configuration successfully flushed the DNS Resolver Cache.

Windows XP, 2000 veya Vista®

  1. Başlat butonuna tıklayın.
  2. Çalıştır bağlantısına tıklayın.(Eğer Çalıştır bağlantısını göremiyorsanız arama kutusuna run yazınız.)
  3. Açılan kutucuğa ipconfig /flushdns yazıp Enter tuşuna basınız.

MacOS® 10.7 and 10.8

  1. Uygulamalar‘a tıklayın.
  2. Araçlar‘a tıklayın.
  3. Terminal uygulamasına çift tıklayın.
  4. sudo killall -HUP mDNSResponder yazıp entera basın.
     Uyarı: Bu komutu kullanabilmek için bilgisayarın Yönetici şifresini bilmeniz gerekmektedir.

MacOS 10.5 and 10.6

  1. Uygulamalar‘a tıklayın.
  2. Araçlar‘a tıklayın.
  3. Terminal uygulamasına çift tıklayın.
  4. sudo dscacheutil -flushcache yazıp entera basın.

SwiftUI: List

İçerisinde en fazla 10 adet item barındırabilen bir listeleme nesnesi. Alternatif olarak kullanılabilecek farklı yöntemler mevcut. Aşağıdaki gibi kullanılabilir.

List(){
   Text("deneme metni")
   Text("deneme metni 2")
   Text("deneme metni 3")
   Text("deneme metni 4")
   Text("deneme metni 5")
   Text("deneme metni 6")
   HStack{
      Text("sol")
      Spacer()
      Text("sağ")
   }    
} 

Veri Dizisi Listeleme

List ile bir kaynaktan elde ettiğiniz veri dizisini listeleyebilirsiniz. Burada listeleme ile ilgili herhangi bir limitle karşılaşmıyorsunuz.

var dataList = ["Satır 1", "Satır 2", "Satır 3", "Satır 4", "Satır 5", "Satır 6", "Satır 7", "Satır 8", "Satır 9", "Satır 10", "Satır 11"] 

/* ... */

List(dataList, id: \.self ){ dataSatir in
   Text(dataSatir)
} 

SwiftUI: Form ve Section

Kullanıcılardan alacağımız veriler için kullanacağımız formlar, içerisinde section ve onun içerisindeki form elemanlarını barındırıyor. İçerisinde form elemanları olmak zorunda değil, istediğiniz bileşeni ekleyebiliyorsunuz.

Form{
   Section(header: Text("Kişisel Bilgiler") ){
     Text("test")
   }
            
   Section(header: Text("İletişim Bilgileri")){
     Text("test")
   }        
} 

Section header alanı için birden fazla view kullanmak istiyorsanız, bununla ilgili “Yeni Struct View Oluşturma” yazımıza göz atabilirsiniz.

SwiftUI: DatePicker

Gün/Ay/Yıl formatında bir tarih verisini kullanıcıdan alırken kullanacağımız bu araç için bir çok farklı kullanım yöntemi mevcuttur.

Şimdilik burada küçük bir kod parçası var. Ancak ilerleyen zamanlarda, tarihsel işlemler ve DatePicker ile ilgili diğer bilgileri ekleyeceğim.

@State private var currentDate = Date() 
/* ... */
DatePicker("Tarih Seçiniz:", selection: $currentDate) 

SwiftUI: Button

Kullanıcı için dokunma etkinliğinde çeşitli aksiyonlar tetiklemek için projelerimize buton dahil edebiliriz. SwiftUI’da butonları kullanabilmek için action ve label olmak üzere 2 özellik tanımlarız.

// Button
Button(action: {}, label: {})

// Label Ekleme
Button(action: {}, label: {
Text("Button")
  .foregroundColor(.black)
  .padding()
  .background(Color.yellow)
}) 

SwiftUI: GeometryReader

GeometryReader olarak adlandırılan bu nesne, içerisindeki nesneleri matematiksel olarak konumlandırabilmemiz için bize kendi geometrik bilgilerini, ölçülerini vermektedir.

GeometryReader{ gr in
   Text("Sol Üst").foregroundColor(.black).position(x: gr.size.width*0.1, y: gr.size.height*0.1)
   Text("Sağ Üst").foregroundColor(.black).position(x: gr.size.width*0.85, y: gr.size.height*0.1)
   Text("Sol Alt").foregroundColor(.black).position(x: gr.size.width*0.1, y: gr.size.height*0.9)
   Text("Sağ Alt").foregroundColor(.black).position(x: gr.size.width*0.85, y: gr.size.height*0.9)
}.background(Color.orange).foregroundColor(.white).frame(width: 300, height: 300, alignment:.center/*) 

Bilgileri gr değişkenine atadık ve sonrasında GeometryReader içerisindeki nesneleri oluşturduk. gr.size.height ile parent nesnemizin yani GeometryReader nesnesinin yükseklik, gr.size.width ile genişlik bilgilerini aldık. Bu bilgileri 0 ile 1 arasında değerlerle çarparak, alttaki nesnelere de yüzde cinsinden bir konumlandırma yaptık.

Şimdilik bu kadar. GeometryReader ile ilgili daha fazla şey öğrendiğimde, sizlerle de paylaşacağım. Hoşçakalın.

SwiftUI: VStack, HStack, ZStack, Divider ve Spacer

SwiftUI ile kodlama yaparken nesneleri yatay, dikey veya üst üste konumlandırmak istediğimizde bu bileşenlerden faydalanırız. VStack nesneleri alt alta, HStack yan yana, ZStack ise üst üste konumlandırmamıza izin vermektedir.

Ekran görüntüsündeki görüntüyü aşağıdaki gibi oluşturduk. VStack, HStack ve ZStack kullanımı ile ilgili eklemelerim sürecek.

ScrollView(){ 

VStack(){ 
   Text("DİKEY 1") 
   Text("DİKEY 2") 
} // VStack 

HStack(){ 
   Text("YATAY 1") 
   Text("YATAY 2") 
} // HStack 

ZStack(){ 
   Text("ARKA").font(.largeTitle).foregroundColor(.red)
   Text("ÖN").foregroundColor(.orange).fontWeight(.bold).padding(.top) 
} // ZStack 

}

VStack ve HStack bileşenleri için alignment, spacing değerleri initialize edilirken gönderilebilir. ZStack sadece alignment değeri kabul edilmektedir.

Divider

Divider nesnesi hiç bir özellik tanımlamamıza izin vermiyor. Yalnızca nesneleri birbirinden bir çizgi ile ayırma işlemi yapar. Aşağıdaki gibi kullanabilirsiniz.

Divider()

Spacer

Nesneleri konumlandırırken spacer ile nesneleri sınırlar dahilinde itekleyebilirsiniz.

Spacer()

Spacer kullanırken minLength özelliği ile, Spacer için minimum yükseklik veya genişlik değeri atanabilir.

Spacer(minLength: 50)

Şimdilik bu kadar. Hoşçakalın.

React-Native: justifyContent ve alignItems

Herhangi bir component içerisindeki diğer bileşenlerin konumlandırılması için 2 farklı özellik kullanılmaktadır. Fakat bu 2 özellik de flexDirection ile ilişkili olarak çalışmaktadır.

justifyContent

Bir view için flexDirection row olarak ayarlandığında içindeki bileşenler yan yana listelenir. Bu durumda justifyContent, yatay hizalama özelliğini tanımlar. Ancak flexDirection column olarak ayarlandığında, justifyContent özelliği dikey hizalamayı belirlemektedir.

Yukarıdaki örnekte gördüğünüz gibi, justifyContent alt bileşenlerin listeleme eksenine göre hizalamayı sağlamaktadır.

alignItems

Bu özellik ise, justifyContent özelliğinin ters ekseninde hizalamayı belirler. Yani flexDirection row olarak belirlendiğinde içerisindeki bileşenler yatay olarak listelenecektir fakat alignItems ile bu bileşenlerin dikey hizalaması belirlenecektir. Aynı şekilde flexDirection column olarak belirlendiğinde de bileşenler dikey olarak listelenecektir fakat, alignItems ile bu bileşenlerin yatay hizalaması belirlenecektir.

Şimdilik bu kadar. Emeklerinizin karşılığını almanız dileğiyle. Hoşçakalın.

React Native: Flexbox ve FlexDirection Kullanımı

Flexbox ile farklı ekran ölçülerine uygun tasarımlar oluşturmamız kolaylaşır. FlexDirection, Flex, Row ve Column yapıları kullanılarak daha düzenli tasarımlar oluşturabiliyoruz.

FlexDirection Özelliği

FlexDirection özelliği row olarak tanımlandığında, ilgili css değişkeninin kullanıldığı alan bir satır olarak kabul edilir ve içerisindeki bileşenler yan yana dizilerek sütun özelliği kazanır. FlexDirection column olarak tanımlandığında ise, altındaki bileşenler de satır olarak kabul edilir ve alt alta dizilir. Tanımlanmadığında default olarak column kabul edilir.

Flex Özelliği

Stil değişkeni içerisinde yapacağınız flex:1 tanımlaması, ilgili bileşenin enine ve boyuna bütün sınırlarını kullanması anlamına gelir. Yani tam genişlik ve tam yükseklik.

Fakat şağıdaki örnekte göreceğiniz üzere, container için de box için de flex özelliği 1 olarak verilmiş. Fakat container başka bir parent component içerisinde olmadığı için, ekranın tamamını kaplamış, box ise eşit bir biçimde alanını 4’e bölmüş.

Flex özelliği için boyutlandırma hesaplarken, aynı parent view içinde bulunan flexlerin değerleri toplanır. Örneğin 2 adet flex:1, 3 adet flex 2 var ise; toplam flex değerleri 8 yapar. Bu 8’i alanın tamamı olarak kabul ederiz ve alanı 8’e böldüğümüzü düşünürsek, 2 adet 1 parça, 3 adet de 2 parçalı alan oluşmuş oluyor.

bigBox stil değişkenini kullanan bileşene baktığınızda, flex:1 kullanan box değişkenli bileşenin yüksekliği diğerlerinin 2 katı olduğunu görüntülersiniz. Eğer container flexDirection özelliği row olarak tanımlanmış olsaydı, genişliği bakımından 2 katı olacaktı.

SEO: Ahrefs Nedir ve Nasıl Ücretsiz Kullanılır?

Ahrefs web sitesinin trafiğini arttırmak adına çalışmak isteyen herkes için vazgeçilmez bir araç. Backlink izleme, arama trafiği tahmini, kelime analizi gibi bir çok aracı içinde barındıran bu gelişmiş SEO aracı ücretsiz kullanılabiliyor. Ancak bir çok kişi malesef bundan habersiz.

Nasıl ücretsiz kullanabilirim?

Bu çok kolay. Google Search Console‘da sitelerinizin doğrulanmış olması ve bu hesapla Ahrefs.com‘da Google hesabınız ile giriş yapmanız yeterlidir.

Search console doğrulaması yaptığınız siteleri ahrefs.com üzerinde ücretsiz olarak takip edebilmektesiniz. Tabi bu durumda kendi sitenize ait istatistikleri de ahrefs ile paylaşmış oluyorsunuz.

PHP: Yenileme (F5) İşleminde $_POST Değişkenini Boşaltmak

Bir form aracılığı ile post edilen verilerin PHP ile alınması işlenmesi sonrasında, ziyaretçinin yanlışlıkla veya bilinçli olarak sayfayı yenilemesi durumunda, karşısına “aynı verileri tekrar göndermek istiyor musunuz?” gibi bir uyarı penceresi çıkabilmektedir. Bundan kurtulmanın bir çok yolu mevcut.

Genellikle tercih edilen yöntem, verileri işledikten sonra farklı bir sayfaya yönlendirmek olur. Bazı durumlarda ise başka bir sayfaya yönlendirmek veya sayfayı PHP tarafında refresh etmek istemeyebilirsiniz. Zaten sağlıklı olanı da bence budur.

Aşağıdaki kod parçacığı ile (session_start() daha önce çalıştırılmış ise kaldırarak) bu uyarıyı kaldırabilirsiniz, kullanıcıların aynı verileri tekrar post etmesini engelleyebilirsiniz.

session_start();

if( strcasecmp($_SERVER['REQUEST_METHOD'],"POST") === 0) {
  $_SESSION['postdata'] = $_POST;
  header("Location: ".$_SERVER['PHP_SELF']."?".$_SERVER['QUERY_STRING']);
  exit;
}

if( isset($_SESSION['postdata'])) {
  $_POST = $_SESSION['postdata'];
  unset($_SESSION['postdata']);
}

Emeklerinizin karşılığını almanız dileğiyle. Hoşçakalın.

PHP: Tarayıcı Dili Tespiti

Ziyaretçimize ait IP, Lokasyon gibi bilgilerle de dil tespiti yapılabildiği gibi, tarayıcının dilini alarak da çoğunlukla istediğimiz sonuca ulaşabiliyoruz. PHP’de bunu yapabilmeniz için gerekli kod parçası aşağıdaki gibidir. Sonunda $language değişkeninde 2 karakterli dil kodunuzu edinmiş olacaksınız.

Eğer ziyaretçi belirtilen dillerden birisini kullanmıyor ise, default olarak tr ataması yapılacaktır.

$browser_language = (string) (isset($_SERVER['HTTP_ACCEPT_LANGUAGE']) === true && $_SERVER['HTTP_ACCEPT_LANGUAGE'] !== '') ? strtok(strip_tags($_SERVER['HTTP_ACCEPT_LANGUAGE']), ',') : '';
$browser_language = (isset($_GET['language']) === true && $_GET['language'] !== '') ? $_GET['language'] : $browser_language;
$language = (string) '';

switch (substr($browser_language, 0, 2)) {
    case 'de':
      $language = 'de';
      break;
    case 'en':
      $language = 'en';
      break;
    default:
      $language = 'tr';
}

echo $language;

PHP: WordPress Yazı Ekleme ve Güncelleme İşlemleri

WordPress hayatımızın her yerinde. Projelerinizde PHP ile WordPress’e yazı eklemek isteyebilirsiniz. Bunun için farklı yöntemler mevcut. Ben wp_post() adında bir fonksiyon oluşturarak, daha önce aynı başlıkta bir içerik var ise onun güncellenmesini sağlayan bir fonksiyon oluşturdum.

Öncelikle şunu belirtmek isterim ki, wordpress’de güncellenen her içerik ayrı bir kayıt olarak veritabanına versiyon halinde eklenmektedir. Bunun önüne geçmek için WP_POST_REVISIONS sabit tanımlamasını 0 olarak atayacağız. Başlayalım;

require "wp-load.php";
define('WP_POST_REVISIONS', 0);
date_default_timezone_set('Europe/Istanbul');

WordPress üzerinde çalışacağımız için, wp-load.php ile aynı dizinde çalışan dosyamızda, wp-load.php dosyasını dahil ettik. Sonrasında WP_POST_REVISIONS için değeri 0‘a eşitleyerek, yapılacak güncellemelerin veritabanında ekstra yer tutmasını engelledik. Yukarıda da bahsettiğim gibi bu tanımlamayı yapmazsanız, her güncelleme veritabanında ekstra bir kayıt daha oluşturacaktır.
(bkz: WordPress Page-Post Revisions)

Bir fonksiyon içerisinde bu işlemleri yapacaksanız fonksiyon içinden $wpdb değişkenine erişmeniz gerekmektedir.

function wp_post(){
   /* ..... */
   global $wpdb;
   /* ..... */
}

Gerekli Parametreler

$new_post = array(
     'post_title' => $post_title, // yazı başlığı
     'post_content' => $post_content, // içerik
     'post_status' => 'publish', // yayın durumu 
     'post_date' => date('Y-m-d H:i:s') , // yayın tarihi
     'post_author' => 1, // yazar id
     'post_type' => 'post', // post/page - yazı veya sayfa
     'post_category' => array(0), // kategori id'leri
     'post_name' => $permalink // permalink
);

Eklenecek içeriği bir dizi içerisinde topladık. wp_update_post ve wp_insert_post fonksiyonları bu şekilde göndermemizi istiyor. Bazı alanlar zorunlu değil elbette, ben kullandığım şekilde paylaşıyorum. Hangi parametreleri gönderebildiğinizi buradan inceleyebilirsiniz.

Ekleme ve Güncelleme İşlemleri

Önce oluşturacağımız yazının başlığının daha önce eklenip eklenmediğini kontrol ediyoruz. Aynı başlıkta başka bir yazı var ise onu güncelliyoruz, yok ise yenisini ekliyoruz.

$query = $wpdb->prepare('SELECT ID FROM ' . $wpdb->posts . ' WHERE post_title = %s', $post_title);
$wpdb->query($query);

if ($wpdb->num_rows){
   $post_id = $wpdb->get_var($query);
   $meta = get_post_meta($post_id, 'times', true);
   $meta++;
   update_post_meta($post_id, 'times', $meta);
   $new_post["ID"] = $post_id;
   wp_update_post($new_post);
}else{
   $post_id = wp_insert_post($new_post);
   add_post_meta($post_id, 'times', '1');
}

Öne Çıkan Görsel Ekleme

Eklediğimiz veya güncellediğimiz yazımız/sayfamız için sunucudaki veya uzak bir sunucudaki görseli öne çıkan görsel olarak ayarlayabiliriz. Bunun için $file değişkenine dosyanın yolunu belirtmemiz, ve ekleme/güncelleme işlemi sonucunda elimizdeki $post_id ve $attachment_id değişkenlerini set_post_thumbnail() fonksiyonu ile göndermemiz yeterli olmaktadır.

$file = "image.png";
if (@file_get_contents($file)){

    $filename = basename($file);
    $upload_file = wp_upload_bits($filename, null,file_get_contents($file));

    if (!$upload_file['error']){
       $wp_filetype = wp_check_filetype($filename, null);
       $attachment = array(
          'post_mime_type' => $wp_filetype['type'],
          'post_parent' => $parent_post_id,
          'post_title' => preg_replace('/\.[^.]+$/', '', $filename) ,
          'post_content' => '',
          'post_status' => 'inherit',
          'post_type' => 'page'
       );

    $attachment_id = wp_insert_attachment($attachment, $upload_file['file'], $parent_post_id);
    if (!is_wp_error($attachment_id)){
          require_once (ABSPATH . "wp-admin" . '/includes/image.php');
          $attachment_data = wp_generate_attachment_metadata($attachment_id, $upload_file['file']);
          wp_update_attachment_metadata($attachment_id, $attachment_data);
     }
}
set_post_thumbnail($post_id, $attachment_id);
}

Google Sitemap Ping İşlemi

Bütün bunlar bittikten sonra site haritasını Google’a bildirmek isteyebilirsiniz. Bu durumda da aşağıdaki kod parçası işinizi görecektir.

file_get_contents('http://www.google.com/webmasters/sitemaps/ping?sitemap=' . get_site_url() . '/sitemap.xml');

İşte bu kadar. Yardımcı olabileceğim herhangi bir konu olursa, yorum formu üzerinden bildirebilirsiniz.

Emeklerinizin karşılığını en kısa sürede almanız dileğiyle, hoşçakalın.

React Native: StyleSheet Kullanımı

StyleSheet import etmeden stillere dair bir şey yapamıyoruz. Aşağıdaki gibi import edilir.

import { StyleSheet } from ‘react-native’;

StyleSheet import edildikten sonra, stillerin içinde barındırılacağı bir const tanımlaması yapılır.

Sabit içerisinde tıpkı css sınıfları gibi stil değişkenleri tanımlanabilir. Stil değişkenleri virgül (,) ile ayrılmalıdır.

<View style={styles.container}>
    <Text>
        Deneme yazisi
    </Text>
</View>

const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: 500,
    backgroundColor: '#ecf0f1',
    padding: 8,
  }
});

Stil değişkenleri de özellikler de virgülle ayrılmaktadır. Ayrıca birden fazla stil değişkenini aynı component için kullanabilirsiniz. Bunun için {} parantezler içerisinde [] ile array oluşturularak, stil değişkenlerini de virgülle ayırabilirsiniz.

<View style={[styles.card, styles.redBg]}></View>

Inline Stillendirme

Stiller component içerisine css değişkeni vermeden de kullanılabilir. 1 veya 2 özellik için kullanılabilir olsa da, daha fazla özellik tanımlaması yaparken kodunuzun daha düzensiz görünmesine yol açacaktır. Inline kullanım için aşağıdaki gibi örneklenebilir.

export default function App() {
  return (
    <View style={{ backgroundColor: 'red', flex:1 }}>
    
    </View>
  );
}

Burası şimdilik bu kadar. İçerikler sürekli genişlemeye devam edecektir. Herkese iyi çalışmalar.

Google AMP: Analytics Yerleştirme Kodu

AMP ile hazırladığınız sayfalarınızda Google Analytics hizmetini kullanabilmeniz için <amp-analytics> bileşenini kullanmanız gerekmektedir.

Google AMP hakkında bilgi edinmek için Google tarafından hazırlanan Türkçe dökümanlara buradan gözatabilirsiniz. Ayrıca dilerseniz amp-analytics bileşen sayfasına da bakabilirsiniz.

Continue reading “Google AMP: Analytics Yerleştirme Kodu”