31 Ocak 2017 Salı

Resimleri İkon Hale Getirmek



                              Resimler Nasıl İkon (.ico uzantılı) Hale Getirilir? 



Resimlerin direkt olarak ikon hale getirebilmek için aşağıdaki adrese tıklayarak bu işlemi 2 adımda kolayca yapabilmekteyiz.

http://ico.bradleygill.com/index.php

1- İkon haline getirmek istediğiniz resmi upload edin.

2- ico uzantılı hale gelen resmin üzerine tıklayarak download edin.

19 Ocak 2017 Perşembe

Veritabanı DBLink Oluşturma



                                PostgreSQL'de DBLink Nasıl Oluşturulur?



        DBLink, bir veritabanından başka bir veritabanına erişim sağlamak için veritabanı nesneleri arası kurulan köprü mantığıdır. Bu ilişki aynı sunucu üzerinde iki farklı veritabanı arasında olacağı gibi farklı sunucular üzerine kurulu farklı veritabanları arasında da kurulabilir. Bizim yapacağımız örnekte farklı sunucular üzerine kurulu farklı veritabanları arasındaki dblink özelliği olacaktır. Bunun için A sunucusu üzerine kurulu test1DB ile B sunucusu üzerine kurulu test2DB veritabanları arasında bir dblink oluşturmaya çalışacağız. test1DB sql konsolu üzerine uygulayacağımız adımlar aşağıdaki gibidir:

Oluşturacağım DBLink'in adı: testpostgresconn


DBLink extensions'ın veritbanına yükleme

        CREATE EXTENSION dblink;


- Kurulan DBLink extensions'ın test edilmesi veya barındırdığı özelliklerin listelenmesi

  SELECT pg_namespace.nspname, pg_proc.proname
        FROM pg_proc, pg_namespace
          WHERE pg_proc.pronamespace=pg_namespace.oid
              AND pg_proc.proname LIKE '%dblink%';

-  DBLink üzerinden testDB2 Veritabanına Erişimin Test Edilmesi

SELECT dblink_connect('host=hostadresi user=db_kul_ad password=db_psswrd dbname=testDB2');


-  Global Kullanıcı (Authentication) ve Server Oluşturma

CREATE FOREIGN DATA WRAPPER db_kul_ad VALIDATOR postgresql_fdw_validator;
CREATE SERVER testpostgresconn FOREIGN DATA WRAPPER db_kul_ad OPTIONS (hostaddr 'hostadresi', dbname 'testDB2');


-  Ortak Kullanım için Mapping Oluşturma

CREATE USER MAPPING FOR db_kul_ad SERVER testpostgresconn OPTIONS (user 'db_kul_ad', password 'db_psswrd');


- Oluşturduğumuz DBLink'i Test Etme

SELECT dblink_connect('testpostgresconn');



Şuana kadarki adımları başarılı bir şekilde uyguladığımız taktirde aşağıdaki 'Select' sql sorgu cümleciği ile test1DB üzerinden test2DB veritabanındaki tablolara erişebiliriz. Ve bundan sonra test1DB üzerinden test2DB tablolarına erişim için sorgularımızı yaratmış olduğumuz 'testpostgresconn' adındaki sanal server ortak bağlantısına yazmamız gerekir.


SELECT * FROM public.dblink
('testpostgresconn','SELECT idstruct,nmstruct FROM public.wfstruct')
AS DATA(idstruct CHARACTER VARYING,nmstruct CHARACTER VARYING);




17 Ocak 2017 Salı

PHP'de SoapClient ile DataGrid Uygulaması



Bu makalede, PHP ve JavaScript yazılım dillerini kullanarak dinamik olarak dataGrid oluşturarak bir web servisin fonksiyonunu kullanarak grid ten toplu şekilde dönen verileri SoapClient aracılığı ile fonksiyona gönderme işlemini yapacağız.

İlk önce uygulamanın tasarımını oluşturacak olan SPCclienttasarim.php sayfasını aşağıdaki gibi oluşturuyoruz. Kodlamaların açıklamalı şekilde aşağıdaki gibi olacaktır.


                               
                        JavaScript ve HTML ile Dinamik Tablo Oluşturma


       .. / SPCclienttasarim.php Sayfası:


<!DOCTYPE html>
<head>
 <title>Gonder</title>
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />


<SCRIPT language="javascript">

//addRow fonksiyonu: html tablolarından table id'sini paremetre olarak alır, paremetre aldığı tabloya satır ekleme işlemi
function addRow(tableID) {

                                                          var table = document.getElementById(tableID);
                                                          var rowCount = table.rows.length;
                                                          var row = table.insertRow(rowCount);
                                                          var colCount = table.rows[0].cells.length;

for(var i=0; i<colCount+14; i++) {

var newcell = row.insertCell(i);
newcell.innerHTML = table.rows[1].cells[i].innerHTML;//tanımlanan satır '<tr>' uzunluğu kadar kolon '<td>' ekleme 
switch(newcell.childNodes[0].type) {
case "text":
newcell.childNodes[0].value = "";
break;
case "checkbox":
newcell.childNodes[0].checked = false;
break;
case "select-one":
newcell.childNodes[0].selectedIndex = 0;
break;
}
}
}

//deleteRow fonksiyonu: html tablolarından table id'sini paremetre olarak alır, paremetre aldığı tablodan seçili satırları silme işlemi

function deleteRow(tableID) {
try {
var table = document.getElementById(tableID);
var rowCount = table.rows.length;

for(var i=0; i<rowCount; i++) {
var row = table.rows[i];
var chkbox = row.cells[0].childNodes[0];
if(null != chkbox && true == chkbox.checked) {
if(rowCount <= 1) {
alert("Cannot delete all the rows.");
break;
}
table.deleteRow(i);
rowCount--;
i--;
}

}
}catch(e) {
alert(e);
}
}


//CountRows fonksiyonu ile html'de tasarladığımız tabloların satır sayısını döndürebiliriz

    function CountRows() {
     var totalRowCount = 0;
     var rowCount = 0;
     var table = document.getElementById("dataTable");
     var rows = table.getElementsByTagName("tr")
   
       for (var i = 0; i < rows.length; i++) {
            totalRowCount++;
         if (rows[i].getElementsByTagName("td").length > 0) {
            rowCount++;
         }
       }
  var message = "Total Row Count: " + totalRowCount;
  message += "\nRow Count: " + rowCount;
 // alert(message);

//Aşağıdaki kod satırı ile JavaScript fonksiyonunun döndürdüğü satır sayısını 'NumRows' değişkeni olarak aynı sayfaya veya PHP kodlarımızın olduğu başka bir .php sayfasına post edebiliriz.

  document.getElementById("NumRows").value = totalRowCount;

  }

</SCRIPT>

</head>
<body>

<style type="text/css">

table { width:1600px; margin:1px auto; table-layout:fixed; border-collapse:collapse; border: 1px solid #CCC;}

table th { border: 2px solid #CCC; background-color:#D5D9E1; color: #4C5260; font-size: 14px; text-align:center; }

      th.chkk { width: 25px }

table td {white-space: nowrap; }

      td.chkk { width: 25px }


input[type="text"] {
  font-size:0.75em;
  color: #6F798E;
  padding:0.25em;
  box-sizing: border-box;
  width:100%;
}

input[type=submit] {
    padding:5px 15px;
    background:#ccc;
    border: 2px solid #CCC;
    cursor:pointer;
    -webkit-border-radius: 5px;
    border-radius: 8px;
color: #6F798E;
}

input[type=button] {
    padding:5px 15px;
    background:#ccc;
    border: 1px solid #CCC;
    cursor:pointer;
    -webkit-border-radius: 8px;
    border-radius: 10px;
color: #6F798E;
}

.button:hover {background-color: #828385; color: #E3ECFF;}

.button:active {
  background-color: #061535;
  box-shadow: 0 5px #666;
  transform: translateY(4px);
}

 select {
                margin: 0;
                padding: 0;
                width: 100px;
                color: #6F798E;
box-sizing: border-box;
            }

</style>
//Aşağıdaki html formunda yapılacak olan işlemler method= POST için değişkenleri normal olarak 'SPCclient.php' sayfasına POST etmek istediğimizi gösteriyoruz.

<form name="form1" method="post" action="SPCclient.php">

//Yukarıda JavaScript'de yazmış olduğumuz satır ekleme ve satır silme fonksiyonlarının buttonların click olayına bağlanması paremetre olarak işlemleri hangi html tabloya uygulamak istiyorsak o tablonun id='dataTable' giriyoruz.
  
<INPUT type="button" value="Add Row" onclick="addRow('dataTable')" />
<INPUT type="button" value="Delete Row" onclick="deleteRow('dataTable')" />

<br/>
//En dış tablo ..
 <table width: 100%; cellspacing="2" cellpadding="2" border="1">
    <tr>
    <td>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
    <td><b>&nbsp;&nbsp;&nbsp;&nbsp;idcollect&nbsp;&nbsp;&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;idcharacteristic</b></td>
    <td><b>idsequencesample</b></td>
    <td><b>&nbsp;&nbsp;&nbsp;dtsample&nbsp;&nbsp;&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;&nbsp;&nbsp;tmsample&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;config&nbsp;</b></td>
    <td><b>&nbsp;&nbsp;idmachine&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;&nbsp;idoperator&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;&nbsp;idinspector&nbsp;</b></td>
    <td><b>&nbsp;&nbsp;idshift&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;&nbsp;idgage&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;&nbsp;nmlot&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;nmmo&nbsp;</b></td>
    <td><b>&nbsp;&nbsp;qtitens&nbsp;&nbsp;</b></td>
    <td><b>&nbsp;qtdefectsitem&nbsp;</b></td>
    <td><b>&nbsp;qtrejectsitem&nbsp;</b></td>
    </tr>
</table>

//DataGrid olarak kullanmak istediğimiz tablo ... 

<TABLE id="dataTable" cellspacing="2" cellpadding="2" border="1">
<tr>
<th class="chkk"></th><th colspan="15"></th>
</tr>
        <tr>
//html'de checkbox nesnesini oluşturma ..
         <td><input type="checkbox" name="chk"/></td>
//html'de dropdown nesnesini oluşturma... ve birden fazla satır eklendiği taktirde aynı değişkene birden fazla değer atamak için aşağıdaki gibi nesnenin değer tutacak olan değişkenini array olarak tanımlıyoruz.
         <td>
         <select name="idcollect[]">
         <option value="33test">33test</option>
         <option value="000032test">000032test</option>
         <submit>submit</submit>
         </select>
         </td>

         <td>
         <select name="idcharacteristic[]">
         <option value="OP01">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OP01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</option>
         <option value="OP02">OP02</option>
         <option value="OP03">OP03</option>
         <option value="OP04">OP04</option>
         <option value="OP05">OP05</option>
         <submit>submit</submit>
         </select>
         </td>
//her satır eklemede aynı değişkene fazladan bir değer bağlanabilmesi için tabloda tanımlı tüm input ve/veya select nesnelerinin değişkenlerini dizi şeklinde tanımlıyoruz.
         <td>
         <input type="text" size="13" name='idsequencesample[]'>
         </td>

         <td>
         <input type="text" size="8" name="dtsample[]">
         </td>

         <td>
         <input type="text" size="8" name="tmsample[]">
         </td>

         <td>
         <input type="text" size="2" name="config[]">
         </td>

         <td>
         <input type="text" size="8" name="idmachine[]">
         </td>

        <td>
        <input type="text" size="8" name="idoperator[]">
        </td>

         <td>
         <input type="text" size="8" name="idinspector[]">
         </td>

         <td>
         <input type="text" size="4" name="idshift[]">
         </td>

         <td>
         <input type="text" size="4" name="idgage[]">
         </td>

         <td>
         <input type="text" size="3" name="nmlot[]">
         </td>

         <td>
         <input type="text" size="3" name="nmmo[]">
         </td>

        <td>
        <input type="text" size="4" name="qtitens[]">
        </td>

         <td>
         <input type="text" size="10" name="qtdefectsitem[]">
         </td>

         <td>
         <input type="text" size="9" name="qtrejectsitem[]">
         </td>

</tr>
 </table>
//JavaScript'de yazdığımız satır sayma fonksiyonunun döndürdüğü NumRows değişkenini form'da tanımlı 'SPCclient.php' sayfasına post etmek için aşağıdaki gibi 'hidden' tipinde nesne tanımlıyoruz.
<input type="hidden" id='NumRows' name='NumRows' value="0">
//Form nesnelerinin değerlerini 'SPCclient.php' sayfasına post etmek için aşağıdaki gibi 'submit' tipinde nesne tanımlıyoruz.
<center> <input type="submit" name="GONDER" value="GONDER" onclick="CountRows();"/> </center>

</form>
</body>

</html>


  PHP ile Soap Client Oluşturmak ve HTML Form'dan Post Edilen Değişkenleri Kullanmak 


 .. / SPCclient.php Sayfası:


<?php

$url  = "http://domain/se/ws/spc_ws.php";

//soap web sunucuya bağlanmak için yapılması gereken konfigürasyon aşağıdaki gibidir. 
$opts = array('ssl' => array('verify_peer'=>false, 'verify_peer_name'=>false,'allow_self_signed' => true));
$params = array ('cache_wsdl' => WSDL_CACHE_NONE, 'encoding' => 'UTF-8', 'verifypeer' => false, 'verifyhost' => false, 'soap_version' => SOAP_1_1, 'trace' => true, 'exceptions' => true, "connection_timeout" => 180,
                 'login'    => 'usrname',
                 'password' => 'psswrd',
                 'stream_context' => stream_context_create($opts) );

try {
//soap web servise bağlanacak client nesnesinin oluşturulması aşağıdaki gibidir.
           $client = new SoapClient ( $url . "?wsdl", $params );
//web servisin barındırdığı tüm fonksiyonları listelemek için kod satırı aşağıdaki gibidir. 
           //var_dump($client->__getFunctions());
         
if (isset($_POST['GONDER']))
{//html formun değerlerini post edecek buttona basıldığında gerçekleşmesi beklenen işlemler aşağıdaki gibidir.

//JavaScript'de yazdığımız tablonun satır sayısını döndüren fonksiyondan dönen değerleri aşağıdaki gibi karşılıyoruz.
    $NumRows = $_REQUEST['NumRows']-1;

     echo "GIRILEN VERILER";
     echo "<br>";
     echo "<br>";

//tablonun satır sayısı kadar dönecek olan döngüde yapılan işlemler..
    for($i=0; $i < $NumRows; $i++)
    {

//web serviste tanımlı fonksiyona client ile göndereceğimiz paremetrelerin tanımlanması aşağıdaki gibidir. 
                $idcollect="";
                $idcharacteristic="";
                $idsequencesample="";
                $dtsample="";
                $tmsample="";
                $config="";
                $idmachine="";
                $idoperator="";
                $idinspector="";
                $idshift="";
                $idgage="";
                $nmlot="";
                $nmmo="";
                $qtitens="";
                $qtdefectsitem = "";
                $qtrejectsitem="";

//her döngüde post ile html formdan dönen değerlerin değişkenlere bağlanması aşağıdaki gibidir.  
    $idcollect = $_POST['idcollect'];
    $idcharacteristic = $_POST['idcharacteristic'];

     if (count( array_filter($_POST['idsequencesample'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Orneklem Sirasi Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $idsequencesample = $_POST['idsequencesample'];

    if (count( array_filter($_POST['dtsample'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Orneklem Tarihi Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $dtsample = $_POST['dtsample'];

    if (count( array_filter($_POST['tmsample'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Orneklem Saati Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $tmsample = $_POST['tmsample'];

    if (count( array_filter($_POST['idmachine'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Makine ID Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $idmachine = $_POST['idmachine'];

    if (count( array_filter($_POST['idoperator'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Operator ID Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $idoperator = $_POST['idoperator'];

    if (count( array_filter($_POST['idinspector'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Kontrolor ID Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $idinspector = $_POST['idinspector'];

    if (count( array_filter($_POST['idshift'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Vardiya ID Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $idshift = $_POST['idshift'];

    $idgage = $_POST['idgage'];
    $nmlot = $_POST['nmlot'];
    $nmmo = $_POST['nmmo'];

    if (count( array_filter($_POST['qtitens'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Orneklem Sayisi Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $qtitens = $_POST['qtitens'];


    if (count( array_filter($_POST['qtdefectsitem'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Kusurlu Sayisi Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $qtdefectsitem = $_POST['qtdefectsitem'];


    if (count( array_filter($_POST['qtrejectsitem'])) ==0)
    {
    echo "<script type='text/jscript'>alert('Red Sayisi Bos Birakilamaz. !!')</script>";
    exit;
    }
    else
    $qtrejectsitem = $_POST['qtrejectsitem'];


//değişkenlerin soap client paremetresi olarak tanımlanması  
 $paremetreler = array('idcollect' =>$idcollect[$i],'idcharacteristic' =>$idcharacteristic[$i],'idsequencesample' =>$idsequencesample[$i],'dtsample' =>$dtsample[$i],'tmsample' =>$tmsample[$i],'config' =>$config[$i],'idmachine' =>$idmachine[$i],'idoperator' =>$idoperator[$i],'idinspector' =>$idinspector[$i],'idshift' =>$idshift[$i],'idgage' =>$idgage[$i],'nmlot' =>$nmlot[$i],'nmmo' =>$nmmo[$i],'qtitens' =>$qtitens[$i],'qtdefectsitem' =>$qtdefectsitem[$i],'qtrejectsitem' =>$qtrejectsitem[$i]);

//web servisten fonksiyon çağırma ve tanmlanan paremetrelerin fonksiyon değişkeni olarak aktarılması aşağıdaki gibidir. 
     $data =  $client->__soapCall('ImportSampleAtt', array('parameters'=> $paremetreler));
//fonksiyondan dönen sonuç..   
     var_dump($data);

//html tablodan web servise post edilen tüm verilerin listelenmesi
        echo "<br>";
        echo $idcollect[$i];
        echo " ";
        echo $idcharacteristic[$i];
        echo " ";
        echo $idsequencesample[$i];
        echo " ";
        echo $dtsample[$i];
        echo " ";
        echo $tmsample[$i];
        echo " ";
        echo $config[$i];
        echo " ";
        echo $idmachine[$i];
        echo " ";
        echo $idoperator[$i];
        echo " ";
        echo $idinspector[$i];
        echo " ";
        echo $idshift[$i];
        echo " ";
        echo $idgage[$i];
        echo " ";
        echo $nmlot[$i];
        echo " ";
        echo $nmmo[$i];
        echo " ";
        echo $qtitens[$i];
        echo " ";
        echo $qtdefectsitem[$i];
        echo " ";
        echo $qtrejectsitem[$i];
        echo "<br>";
    }

}

}
catch(Exception $e)
{
//web servise bağlanılamadığı taktirde verilecek hata mesajı..
 die($e->getMessage());
}
?>






11 Ocak 2017 Çarşamba

PHP ' de Web Servis Uygulaması (Server - Client)




Bu yazımda PHP'de nasıl web sunucu ve istemci yazıldığına dair örnek uygulama yaparak, olası hatalar ve  açıklamalarla konuya değiniyor olacağım. Uygulamanın sunucu tarafında dışarıdan aldığı iki sayı değişkeninin toplamını veya farkını bulan fonksiyonlar yer alacak.



                                      PHP'de Web Servis Oluşturmak


Bunun için ilk olarak ben soap'ın nusoap toolkitininin kütüphanesini indirerek işe başladım. Kütüphaneyi bu linkten indirebilirsiniz. Kütüphane lib klasörü altında .php dosyalarından oluştuğu için projelere import ederken require_once(‘lib/nusoap.php’); şeklinde kullanmamız gerekecektir. Kütüphaneyi bu şekilde import ettikten sonra aşağıdaki gibi sunucu kodlarını yazıyoruz.

../se/servis.php

<?php
  include_once 'lib/nusoap.php'; //nusoap kütüphanesinin sunucuya import edilmesi
  $servis = new soap_server(); //yeni bir soap_server nesnesi oluşturmak

  $endpoint = "http://domain_adresi/se/servis.php"; //client'ın sunucuya erişimi için soap address oluşturmak
  $ns = "urn:serviswsdl"; //xml hedef alan adının tanımlanması
  $servis->schemaTargetNamespace = $ns;
  $servis->configureWSDL("web-service",$ns,$endpoint);//soap sunucunun xml diline dökümü olan wsdl kodlamasının konfigurasyonu: web servisin adı, xml tabanlı soap hedef sunucu adı ve hedef soap adresinden oluşmaktadır. 

//web servisin içinde barındıracağı gerekli işlemleri yapacak olan fonksiyonların tanımlanması

  $servis->register("Topla",array('idfield1' => 'xsd:integer', 'idfield2' => 'xsd:integer'), array('return' => 'xsd:string'), $ns); //istemciden alacağı iki sayının toplamını döndüren fonksiyon

  $servis->register("Cikar",array('idfield1' => 'xsd:integer', 'idfield2' => 'xsd:integer'), array('return' => 'xsd:string'), $ns); //istemciden alacağı iki sayının farkını döndüren fonksiyon

  $servis->register("goster",array('idfield1' => 'xsd:string'), array('return' => 'xsd:string'), $ns); //istemciden aldığı sayıyı ekranda gösteren fonksiyon

- Yukarıda web servise tanımladığımız fonksiyonları aşağıdaki gibi yazıyoruz. 

  function Topla($idfield1, $idfield2)
  {
   $toplam = $idfield1 + $idfield2;
   $sonuc = "Girilen Sayilarin Toplami:" .$idfield1 ."+" .$idfield2 ."=" .$toplam;
   return $sonuc;
  }

  function Cikar($idfield1, $idfield2)
  {
   $fark = $idfield1 - $idfield2;
   $sonuc = "Girilen Sayilarin Farki:" .$idfield1 ."-" .$idfield2 ."=" .$fark;
   return $sonuc;
  }

  function goster($idfield1)
  {
     $sonuc = $idfield1;
     return $sonuc;
  }


 //server-client veri iletişimi için gereken kodları aşağıdaki gibi yazıyoruz. 

$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
$servis->service($HTTP_RAW_POST_DATA);

?>

     Web Servisin Başarılı Şekilde Oluşturulmuş Halinin Görüntüsü Aşağıdaki gibi Olmalıdır









                                                  PHP'de Client Oluşturmak


   ../se/client.php


Not: Client'ı nusoap kütüphanesini kullanmadan soap servisin kendi fonksiyonlarını kullanarak yazdım. Amaç, nusoap kullanmadan da istemci ve/veya web sunucunun nasıl yazılabileceğini göstermek.


<?php

//Aşağıdaki gibi client'ın tutacağı değerleri değişkenlere aktarıyorum. Bu dışarıdan kullanıcının gireceği değerler şeklinde de olabilir. örnek olması açısından şimdilik değişkenlere sabit değerler atıyorum.

 $idfield1 =20;
 $idfield2 =30;

$url  = "http://domain_address/se/servis.php"; //Buraya yukarıda yazmış olduğumuz servisin yolunu tanımlıyoruz.

//Client'ın sunucuya bağlanırken bilindik hatalarla karşılaşmamak için aşağıdaki gibi konfigurasyonları yazıyoruz.
$opts = array('ssl' => array('verify_peer'=>false, 'verify_peer_name'=>false,'allow_self_signed' => true));
$params = array ('cache_wsdl' => WSDL_CACHE_NONE, 'encoding' => 'UTF-8', 'verifypeer' => false, 'verifyhost' => false, 'soap_version' => SOAP_1_1, 'trace' => true, 'exceptions' => true, "connection_timeout" => 180, 'stream_context' => stream_context_create($opts) );

try {
           $client = new SoapClient ( $url . "?wsdl", $params );//Client nesnesinin oluşturulma şekli
          //var_dump($client->__getFunctions()); //comment şeklinde bıraktığım bu kod serviste tanımlı tüm fonksiyonları listelemek için kullanılır. 
           $data =  $client->Topla($idfield1,$idfield2); //Client üzerinden servisteki 'Topla' fonksiyonunun çağrılması
       
      var_dump($data);//Sonuç yazdırma..

}
catch(Exception $e)
{
die($e->getMessage());//Client'ın sunucuya bağlanmada veya ilgili fonksiyonlara istekte bulunulduğu karşılaşılacak hataları yakalamak için işlemleri try-catch bloklarını kullanarak yapıyoruz. 
}

?>



                                          

14 Aralık 2016 Çarşamba

Windows Servis ve WCF Web Servisleri



                       
                             Windows Servisi Olarak WCF Web Servisi Yayınlama


C#'da WCF Servislerini Windows Servisi olarak yayınlamak için izlenecek adımlar:

1- Visual Studio açılır, platforumun sol tarafındaki Visual C# sekmesi altından WCF'ye tıklanarak WCF Service Library seçilerek yeni bir WCF kütüphanesi oluşturulur. Açılan yeni WCF Library projesi arayüzünün sağ tarafındaki Solution Explorer  panelinde oluşturmuş olduğumuz yeni wcf servisi adı altında Service1.cs ve IService1.cs classlarının oluşmuş olduğu görülecektir. Oluşturmuş olduğumuz projeye default olarak eklenen bu örnek class'lar istenirse silinir veya editlenerek yazmak istediğimiz kendi kodumuzu yazabiliriz. Projeyle örnek olarak gelen classları sildiğimiz taktirde kendi classlarımızı oluşturmak için proje adı üzerine sağ tıklanarak Add New Item -> Class diyerek kendi classımızı oluşturabiliriz. Aynı şekilde oluşturduğumuz classın implementi için örnekteki gibi Interface class oluşturabiliriz. Oluşturduğumuz Interface classın kütüphane tanımlama bölümüne using System.ServiceModel; kütüphanesini eklememiz gerekir. Public Interface IService classın üst kısmına [ServiceContract] kodunu eklememiz gerekir. Ayrıca classta tanımlayacağımız her fonksiyon için tanımladığımız fonksiyonun üst kısmına [OperationContract] kodunu eklememiz gerekir. Daha sonra interface classı normal class üzerinde :IService1 şeklinde implemente ederek gerekli kodu yazarız. Tanımlanan classı daha sonra windows service'den çağıracağımız için public yapmamız gerekir.

2- Oluşturmuş olduğumuz projeye Add New Project diyerek sol paneldeki Visual C# sekmesi altından Windows seçilerek Windows Service projesi oluşturulur. Oluşturulan projenin Solution Explorer paneli altındaki App.config sağ tıklanarak Edit WCF Configuration tıklanır. Açılan pencerede Services bölümünde Create a New Service -> Service Type browse'tan oluşturmuş olduğumuz projenin klasörü açılır: -> Bin->Debug->Service.dll seçtikten sonra Next diyerek bir sonraki aşamalara geçilir. Communication Mode aşamasında HTTP seçili bırakılır, bir sonraki adımda Basic Web Services İnteroperability seçili bırakılır, address of your endpoint adımında http:// yazan yere bir endpoint adı sallanır. Tüm bu işlemler tamamlandıktan sonra Configuration penceresinin sol tarafında yer alan Host  çift tıklanarak ardından New buttonuna tıklanır ve Base address PC'mizin ip adresi http://192....:8080 numarası şeklinde girilir. Not: port numarası değiştirilebilir. IP adresini öğrenmek için command promt penceresinde ipconfig yazmak yeterlidir.
Bu işlemi de bitirdikten sonra Configuration panelinde Advanced sekmesi seçilir. Bir alt sekmedeki Service Behaviors tıklanır, ardından gelen panelin Add butonundan serviceMetadata seçilir, ardından new behavior yerine behavior ismi verilerek bu işlem de tamamlanmış olur. Oluşturulmuş olan yeni behavior sekmesine tıklanarak gelen serviceMetadata penceresinden HttpGetEnabled özelliği true yapılır. Daha sonra oluşturulmuş olan bu behavior özellikleri Services sekmesi altındaki oluşturmuş olduğumuz webservisin adına tıklanarak behaviorConfiguration olarak seçilir.



3- Solution Explorer penceresinden Add Reference tıklayarak yapmış olduğumuz WebService.dll dosyasını ve Assemblies->Framework tıklayarak System.ServiceModel kütüphanelerini import ediyoruz.

4- Windows Serivce'nin Service1.cs tıklayarak açılan Design panelde boşlukta sağ tıklayarak Add Installer tıklanır. Böylece oluşturmuş olduğumuz serviceInstaller1 sekmesi üzerine sağ tıklanarak Properties'ten panelin sağ tarafta çıkan Service Name ayarlanır, Start Type Manual olarak bırakılır. serviceProcessInstaller1 sekmesine sağ tıklanarak sağ tarafta çıkan Account  ayarı LocalSystem olarak ayarlanır. Ardından Service1.cs nin click here to switch to code view tıklanarak windows servisi başlatma ve kapama için gereken kodlar yazılır:
ilk önce using System.ServiceModel; tanımlanır, ardından aşağıdaki gibi wcf açma kapama komutları yazılır.

       ServiceHost sh;
        public Service1()
        {
            InitializeComponent();
        }
      protected override void OnStart(string[] args)
        {
            sh = new ServiceHost(typeof(VeriTransfer.VeriGonder));//Referans olarak göstermek için import ettiğimiz wcf servis dosyasını buraya çağırıyoruz. Burada görüldüğü gibi benim WCF web servisimin adı VeriTransfer 'dir.
            sh.Open();
        }

        protected override void OnStop()
        {
            sh.Close();
        }

5- Şuana kadar hazırlamış olduğumuz windows service'nin pc'ye yüklenmesi, Installutil.exe ve windows servisi uygulamamızın kaynak dosyası dizini kullanılarak yapılır. Bunun için command prompt açılır ve kendi windows servis klasörünüzün yolunu bu örneğe editleyerek şu şekilde komut yazılır:

Install :

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe" "C:\Users\Surec\Documents\Visual Studio 2013\Projects\VeriTransfer\WindowsServiceWCF\bin\Debug\WindowsServiceWCF.exe"


Uninstall :

"C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe"  -u "C:\Users\Surec\Documents\Visual Studio 2013\Projects\VeriTransfer\WindowsServiceWCF\bin\Debug\WindowsServiceWCF.exe"


tüm bu işlemleri yukarıdaki 5 adımı da sorunsuz şekilde yaptığımız taktirde Görev Yöenticisi açarak ->Hizmetler sekmesini tıkladığımızda yapmış olduğumuz windows servisini diğer servisler arasında görebileceğiz.








Muhtemel Hatalar :



This service on local computer started and then stopped. some services stop automatically if then are not in use by other servces or programs

yukarıdaki hatayı aldığımız taktirde öncelikle servisimizin kodlarını kontrol etmemiz gerekiyor öyle ki:
      -  ismini değiştirmiş olduğumuz classların değiştiştirilmesi gereken veya class ile aynı isme sahip olması gereken yerleri incelemek gerekir.
     -  daha sonra hem wcf library'nin olduğu App.Config dosyası incelenmeli hem de windows servisin App.Config dosyası incelenmeli yukarıdaki App.Config ayarları iki taraf için de Edit WCF Configuration üzerinden eksiksiz yapılmalıdı en son ayarlar ile proje Build edilmelidir.














9 Aralık 2016 Cuma

IIS (Internet Information Services) Nedir? IIS'de Web Sitesi Yayınlama



                                          

                                            IIS (Internet Information Services) Nedir?


IIS en basit anlatımla Microsoft'un web sunucusudur. Microsoft tabanlı web sayfalarının ve uygulamalarının barındırıldığı sunucu Internet Information Services (IIS) diye anılır. Buradan anlaşılacağı üzere Asp.net web uygulamaları IIS üzerinde barındırılır ve IIS üzeerinden çalıştırılarak yayınlanabilir. İstemcinin isteklerini sunucuda IIS karşılar ve cevaplandırır. IIS'in varsayılan portu 80 dir.

IIS hosting hizmeti veren kuruluşların Windows tabanlı sunucularında kullanılır. Ayrıca localhost'ta IIS kurulumu yaparak geliştirmiş olduğumuz Asp.net uygulamalarını kendi bilgisayarımız üzerinde de çalıştırabiliriz. Şuanki IIS versiyonu IIS8'dir. Asp.Net geliştirmek için Visual Studio kullanılıyorsa ayrıyeten IIS kurmamıza gerek yoktur.

IIS hosting hizmetini localhost'a kurmak için yapmamız gereken: Başlat -> Denetim Masası -> Windows Özelliklerini Aç/Kapat sekmelerini izleyerek açılan pencereden Internet Information Services seceneğini aktif ettiğimizde sistem IIS için gerekli yazılımı otomatik kuruyor.



                                                IIS'de Web Sitesi Yayınlama


Asp.Net'te yapmış olduğumuz web tabanlı uygulamayı kendi bilgisayarımızda yayınlamak istiyorsak IIS içerisinde ASP.NET barındırılıyor olması gerekir. IIS dışarıdan gelen çağrıları yanıtlayabilemk için varsayılan olarak 80 portu dinler ve gelen talepleri uygun altyapıya devrederek dışarıya HTML çıktısını verir. Biz de geliştirmiş olduğumuz Asp.Net uygulamalarını yayınlamak için IIS üzerinde gerekli konfigürasyonları yapmamız gerekir. Bir Asp.Net uygulamasını IIS üzerinden yayınlamak istiyorsak, IIS üzerinde sanal dizin (Virtual Directory) adını verdiğimiz yapıları kullanmamız gerekir.

Yeni bir web sitesi yayınlamak için ilk olarak Denetim Masası'ından Yönetimsel Araçlar bölümüne geçilip Internet Information Services(IIS) kısa yoluna tıklanarak IIS'in yönetim penceresi açılır.




Yönetimsel Araçlar bölümünden IIS’e çift tıklandığında IIS’in yönetim penceresi açılıyor olacaktır. Bu pencere aracılığı ile IIS üzerinde bulunan siteler görülüp, özellikleri ayarlanabilir ya da yeni bir site eklenebilir. Yeni bir site eklemek için Siteler üzerinde (Sites) mouse’ın sağ tuşu ile tıklanıp açılan menüden Add Web Site(Web Sitesi Ekle) seçeneği seçilmelidir. 




Yukarıdaki işlemden sonra sanal site adı ve fiziksel dosyaların saklanacağı yer soruluyor olacaktır. Site adı bölümüne istediğimiz ismi yazdıktan sonra fiziksel yol (Physical Path) bölümünden de fiziksel dosyalarımızın, yani ASP.NET dosyalarımızın, bulunduğu bölümü seçiyoruz. Ana bilgisayar adı olarak bölümüne www.domainAdı.com değerini yazarak ve Tamam diyerek web sitemizi IIS üzerinde hazır hale getiriyoruz. IP Adresi üzerinden web uygulamamıza IP Adresi üzerinden erişmek istiyorsak IP adresi değerini seçmemiz gerekir. 80 Port default olarak kalırsa ileride olası hataları almamak için daha iyi olur.



  

                         IIS ile ilgili işlemlerden sonra sitemiz kendi bilgisayarımız üzerinde yayınlamak için C:\Windows\System32\drivers\etc dizini altındaki hosts dosyasını aşağıdaki ekranda görüldüğü gibi değiştirerek kaydediyoruz.






 Çıkabilecek Olası Hatalar

 1 -

HTTP Error 401.3 - Unauthorized You do not have permission to view this directory or page because of the access control list (ACL) configuration or encryption settings for this resource on the Web server.

Böyle bir hata alındığı taktirde öncelikle yayınlamak istediğimiz Asp.Net uygulamasının kullandığı Application Pool'u değiştirmeyi denememiz gerekir. Ya da uygulamamızın kullanıyor olduğu Application Pool'un ayarlarını kontrol etmemiz gerekiyor. Ben öyle bir hata aldığımda alttaki resimlerde görüldüğü gibi Asp.Net uygulamamın kullanıyor olduğu DefaultAppPool'u .Net v4.5 Classic ile değiştirdim. Aşağıdaki ayar penceresini açmak için IIS'de yayınlamak istediğimiz Web Sitesinin IIS arayüzünde sol taraftaki adının üzerine mouse'la sağ tuşlayarak Manage Website -> Advanced Setting.. yolunu izlememiz gerekir.



Web sitemizin IIS üzerinde kullandığı pool ayarlarına bakmak için şöyle bir yol izlenmelidir: IIS arayüzünün sol tarafındaki sekmelerden Application Pools -> 

uygulamamızın kullandığı Application Pool'un üzerine mouse ile sağ tuşalayarak aşağıdaki gibi Advanced Settings arayüzünden ayarlar yapılmalıdır.


Identity ayarının ApplicationPoolIdentity olması gerekir.

Ayrıca yukarıdaki hatayı almamak için IIS ayarlarından Authentication ayarlarını yapmamız gerekiyor.



Aşağıdaki görüntüdeki gibi işaretli yerlerin Enabled olarak ayarlanmış olması gerekir.


Ayrıca Anonymous Authentication ayarları için mouse ile üzerine sağ tuş  Edit yaparak aşağıdaki gibi Application Pool Identity seçeneğinin seçili olması gerekir. 





2- 

                                               HTTP Error 403.14 - Forbidden

                                               The Web server is configured to not list the contents of this directory.


Böyle bir hata alındığında ise IIS ayarlarından Directory Browsing ayarına çift tıklayarak Actions durumunu Enabled  yapmamız gerekir.






7 Aralık 2016 Çarşamba

SQL Tabloyu Kendisi Ile Eslestirme



                                       


                                             TABLOYU KENDISI ILE ESLESTIRME:



   SQL'de bazi senaryolara gore tablodaki verilerin ayni tablodaki baska verilerle eslestirilmesi gerekebilir. Asagida yazdigim sorguya gore senaryoda bir sistemin kullanicilarinin liderleri listelenmek istenmistir. Hangi kullanicinin lideri kim ise o kullaniciya bagli liderin ismi ayni tablodan gelecek sekilde karsisina listelenmek istenmistir. Buna gore sorgu asagidaki gibi olmalidir:






SELECT u.cduser,u.nmuser,l.cdleader.l.nmuser FROM aduser as u LEFT OUTHER JOIN aduser as l ON u.cdleader=l.cduser