Thursday, March 19, 2015

Call WCF Service from Oracle

After heavy search on web, could not found any good reference code to call a WCF service from Oracle PL/SQL. So we wrote our implementation. It is %100 working.

Trick : You have to use SOAPAction for WCF calls. You must replace YOUR_ACTION code block in PL/SQL code with YOUR_ACTION in .Net code.
" [System.ServiceModel.OperationContractAttribute(Action=”YOUR_ACTION”) "


CREATE OR REPLACE FUNCTION INVOKEBLOCKAGE RETURN NUMBER IS
  HTTP_REQ        UTL_HTTP.REQ;
  HTTP_RESP       UTL_HTTP.RESP;
  V_ATTEMPT_COUNT NUMBER(2) := 0;
  P_REQ_ENV       VARCHAR2(5000);
  O_RESP_ENV      VARCHAR2(5000);
  O_ERRTEXT       VARCHAR2(5000);
  TYPE_SUCCESS CONSTANT CHAR(1) := 'S';
  TYPE_ERROR   CONSTANT CHAR(1) := 'E';
  TYPE_WARNING CONSTANT CHAR(1) := 'W';

  RETURN_SUCCESS   CONSTANT NUMBER(1) := 1;
  RETURN_WHITELIST CONSTANT NUMBER(1) := 2;

  ERROR_GROUP CONSTANT VARCHAR2(8) := 'WSBA';

  SERVICE_URL    CONSTANT VARCHAR2(256) := 'YOUR_URL';
  SERVICE_METHOD    CONSTANT VARCHAR2(64) := 'POST';
  SERVICE_NAMESPACE CONSTANT VARCHAR2(500) := 'YOUR_NAMESPACE';

  SERVICE_TIMEOUT       CONSTANT PLS_INTEGER := 30;
  SERVICE_ATTEMPT_COUNT CONSTANT PLS_INTEGER := 3;

BEGIN

  BEGIN
 
    P_REQ_ENV := '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:v3="http://tempuri.org">
<soapenv:Header>
        <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
         <wsse:UsernameToken>
            <wsse:Username>USER_NAME</wsse:Username>
            <wsse:Password>PASSWORD</wsse:Password>
         </wsse:UsernameToken>
      </wsse:Security>
      </soapenv:Header>
   <soapenv:Body>
      <v1:updateAInfo>
         <v1:RefNo>0</v1:RefNo>
      </v1:updateAInfo>
   </soapenv:Body>
</soapenv:Envelope>';
 
    -- BEGIN REQUEST
    HTTP_REQ := UTL_HTTP.BEGIN_REQUEST(SERVICE_URL,
                                       SERVICE_METHOD,
                                       UTL_HTTP.HTTP_VERSION_1_0);
 
    -- SET TIMEOUT
    UTL_HTTP.SET_TRANSFER_TIMEOUT(HTTP_REQ, SERVICE_TIMEOUT);
 
    -- SET HEADERS
    UTL_HTTP.SET_HEADER(HTTP_REQ, 'Content-Type', 'TEXT/XML');
    UTL_HTTP.SET_HEADER(HTTP_REQ, 'Content-Length', LENGTH(P_REQ_ENV));

    UTL_HTTP.SET_HEADER(HTTP_REQ,
                        'SOAPAction',
                        '"YOUR_ACTION"');
    dbms_output.put_line('Request:' || P_REQ_ENV);
    -- BEGIN TRANSFER
    UTL_HTTP.WRITE_TEXT(HTTP_REQ, P_REQ_ENV);
    HTTP_RESP := UTL_HTTP.GET_RESPONSE(HTTP_REQ);
 
    -- READ RESPONSE
    UTL_HTTP.READ_TEXT(HTTP_RESP, O_RESP_ENV);
    dbms_output.put_line('Resp2:' || O_RESP_ENV);
 
    UTL_HTTP.END_RESPONSE(HTTP_RESP);
 
  EXCEPTION
    WHEN UTL_HTTP.TRANSFER_TIMEOUT THEN
      IF V_ATTEMPT_COUNT < SERVICE_ATTEMPT_COUNT THEN
        V_ATTEMPT_COUNT := V_ATTEMPT_COUNT + 1;
      ELSE
        RETURN - 2;
      END IF;
  END;

  RETURN RETURN_SUCCESS;
EXCEPTION
  WHEN OTHERS THEN
    O_ERRTEXT := SQLERRM;
    RETURN - 1;
END;

Thursday, March 5, 2015

PistolWar - Airsoft Oyun Senaryosu

PistolWar - Airsoft Oyun Senaryosu

Yer: Bina
Oyununun Adı: PistolWar
Oyun Çeşitleri: Bayrak, Flag
Oyun Süresi: 10 dk
Takımlar: 3 takım. Kırmızı, Mavi, Sarı.
Amaç: Bina içerisine takımlardan biri, istedikleri 2 noktaya bayrak asarlar. Diğer takımlar bayrakları süre dolmadan bina dışındaki başlangıç noktalarına götürmeye çalışırlar.

Oyun alanı:
  1. Herhangi bir sınırlama yoktur.
Silahlar:
  1. Evin içerisinde sadece pistol kullanılabilir. 
  2.  Evin dışından eve ya da evden dışarıya her türlü atış serbesttir.
  3. 10m altında tüfekle atış yapmamaya özen gösterilmelidir.
Oyunun oynanması:
  1. Mavi takım, eve bayrakları yerleştiren takımdır. Kırmızı ve Sarı takımlar bayraklardan en az 1 tanesini ele geçirip başlangıç noktalarına götürmeye çalışan takımlardır.
  2. Mavi takım eve girer ve 2dk içerisinde bayrakları binanın istedikleri bir yerine yerleştirirler. Tüfeklerini bir odaya(Cephanelik) bırakırlar. Pistol’leri holster’da kalacak şekilde bina içerisinde dolaşabilirler. Hiçbir şekilde bir başka asker ya da taarruz görmeden silah çekemezler. Pusu kuramazlar. Ancak silah sesi, karşı takımdan birini gördüklerinde alarm vererek silahlarını çekebilirler.
  3. Kırmızı ve Sarı takımlar birbiri ile düşman takımlardır.
  4. Mavi takım telsiz kullanamaz. Kırmızı ve Sarı takımlar kullanabilir.
  5. Binanın farklı uçlarından binaya giriş yaparlar. Birbirleri ile sıcak temasa geçebilirler.
Cephane:
  1. Mavi takım, sınırsız bb hakkı vardır. İsterlerse bb loader ya da bb paketlerini eve götürebilirler. Ancak bu bb’ler ve loader Cephanelikte durmak zorundadır.
  2. Kırmızı ve Sarı takımın bir askeri üzerinde sadece pistol taşıyabilir. Extra bb taşıyamaz.
  3. Cephanelikten her takım bb alabilir.
Vurulma:
  1. Bir asker sadece 1 kez vurulma hakkına sahiptir. Vurulan oyuncu, vurulduğu yere oturma pozisyonunda başına kırmızı bayrağı takarak bekler. Silahını elinde tutamaz.
  2. Vurulduğu pozisyon eğer çok ayakaltında ise kendini güvenli bir yere götürerek orada oturmaya devam edebilir.
  3. Vurulan kişi olduğu yerde hareket edemez.
  4. Vurulan kişi,  herhangi bir oyuncunun yerini belli edecek bir hareket, mimik ya da sinyal veremez.
  5. Vurulan oyuncu asla konuşamaz. BB ile vurulan oyuncu vurulduğunu sesli bir şekilde söyleyebilir. Telsizden haber veremez.
  6. Bıçak ile ölen kişi hiçbir şekilde öldüğünü söyleyemez, haber veremez.
  7. Vurulan kişi konuşursa, çok sağlam küfür yer.
  8. Ölmüş kişinin arkasına saklanmak serbesttir. Ancak gelecek bb’lerden şikâyet etmemelidir.
  9. Silent Kill ancak dummy knife ile yapılabilir. Elle ya da başka bir alet ile yapılamaz.  
Kazanma durumları:
  1. Mavi takımın kazanma durumları;
    • Süre sonunda herhangi bir bayrak alınmadıysa
    • Saldıran takımların tamamı vurulduysa
  2. Kırmızı ya da Sarı takımın kazanma durumları;
    • Bayraklardan en az 1 tanesi başlangıç noktasına götürüldüyse
    • Diğer takımların tamamı vurulduysa 
Extra:
  1. Ağızla bang ya da vurdum gibi söylemlerle oyuncu vurduğunu iddia etmek yasaktır.
  2. Oyun içinde sen vurulmadın mı diye sormak yasaktır.
  3. Karşı takım oyuncusu ile hiçbir şekilde diyaloğa girmek yasaktır.

NOT: Her oyuncunun dürüst bir şekilde oynadığını, tüm kurallara uyduğunu ve vurulduğunda çıktığını düşünerek oynadığımız sürece hepimiz büyük keyif alacağız. Sonunda kupa ya da bir ödül yok. Amaç eğlenmek. Eğer vurulduysan hırs yapmak yerine bir sonraki oyunda stratejini düzeltmek için uğraş. Oyun 10dk. En kötü bu süre kadar beklersin bir oyun daha oynamak için. Bildiğin gibi ortalama oyun sayımız 10. Daha çok oyun var yani. İyi oyunlar.