النتائج 1 إلى 13 من 13

الموضوع: على هامش التجارب [ Intelligent Query Language ]

  1. #1
    عضو فعال
    تاريخ التسجيل
    Jul 2003
    المشاركات
    1,576

    Talking على هامش التجارب [ Intelligent Query Language ]



    IQL او Intelligent Query Language

    موضوع شيق للغاية ، قرأت عنه بعض المقالات مؤخرا وتأثرت به إلى حد ما

    والليلة والواحد سهران كده مش عارف يعمل ايه ( بيدور على طريقة عشان يهرب بيها من المذاكرة لامتحان بكرة ) جاءت في بالي فكرة تنفيذ سكربت بسيط وسريع لتطبيق فكرة IQL وان كنت اشك اني استطعت الوصول لفكرتها بشكل صحيح .. ولكن لهذا اسم الموضوع " على هامش التجارب "


    موضوع ال IQL باختصار هو .. مثلا لو افترضنا انه يوجد Panel مخصصة في لوحة تحكم ال VBulletin للمشرف العام للوصول إلى المواضيع بشكل اسرع واكثر احترافية .. من خلال كتابة بعض الاوامر النصية مثل
    browse all topics
    او
    browse topics with date greater than 30 days

    او اي كان .. ومن المفترض ان يقوم سكربتك ( والذي يدعم مبدأ ال IQL ) بترجمة هذه الجملة إلى SQL ويقوم بتنفيذها ..


    ما نطول عليكم ، ده اللي انا وصلتله خلال ساعة ونص ، طبعا قمت بالتحضر لعدة خصائص ولكن الوقت لا يسعفني لاكمالها الآن .. feel free to improve it

    كود PHP:
    <?php
    // class.iql.php
    class IQL{
        var 
    $pub = array();
        var 
    $flds = array();
        var 
    $string;
        var 
    $words = array();
        var 
    $query "";
        
        function 
    run($string){
            
    $this->string strtolower($string)." #";
            
    $this->words $this->wordCut($this->string);
            
    $func "iql_".$this->words[0];
            if (
    method_exists($this$func)){
                
    $this->$func();
            }else{
                
    $this->fail(1);
            }
        }
        
        function 
    wordCut($sText){
            
    $sString wordwrap($sText1'[cut]');
            return 
    explode('[cut]'$sString);
       }
       
       function 
    iql_browse(){
           
    $func "iql_browse_".$this->words[1];
           if (
    method_exists($this$func)){
                
    $this->$func();
            }else{
                
    $this->fail(1);
            }
       }
       
       function 
    iql_browse_students(){
           
    $this->iql_browse_all(1);
       }
       
       function 
    iql_browse_all($n 2){
           if (
    $this->pub$this->words[$n] ]){
               
               
    $q "select * from ".$this->pub$this->words[2] ];
               
    $this->add2query($q);
               
               if (
    $this->words$n+] && $this->words$n+]){
                   if (
    in_array($this->words$n+],$this->flds)){
                       
    $q2 $this->add2where($n+3);
                   }
               }
           }else{
               
    $this->fail(1);
           }
       }
       
       function 
    add2where($x){
           if (
    $this->words[$x] == "greaterthan" || ($this->words[$x] == "greater" && $this->words[$x+1] == "than") ){
               if (! 
    is_numeric($this->words[$x+2])){
                   if (
    is_numeric($this->words[$x+1])){
                       
    $value $this->words[$x+1];
                   }else{
                       
    $this->fail(1);
                   }
               }else{
                   
    $value $this->words[$x+2];
               }
               
               
    $factor ">";
               
           }else if ( 
    $this->words[$x] == "lessthan" || ($this->words[$x] == "less" && $this->words[$x+1] == "than") ){

               if (! 
    is_numeric($this->words[$x+2])){
                   if (
    is_numeric($this->words[$x+1])){
                       
    $value $this->words[$x+1];
                   }else{
                       
    $this->fail(1);
                   }
               }else{
                   
    $value $this->words[$x+2];
               }
               
                
    $factor "<";
                
                
            }else if (
    $this->words[$x] == "equal"){
                
    preg_match("/equal(.*)(order|and|or|#)/"$this->string$res);
                
    $factor "=";
                
    $value $res[1];
                
            }else if (
    $this->words[$x] == "notequal" || ( $this->words[$x] == "not" && $this->words[$x+1] == "equal") ){
                
    preg_match("/equal(.*)(order|and|or|#)/"$this->string$res);
                
    $factor "!=";
                
    $value $res[1];
            }else{
                
    $this->fail(1);
            }
            
                
    $q " where ".$this->words[$x-1].$factor '$value'";
                
    $this->add2query($q);
                
       }
       
       function 
    add2query($string){
           
    $this->query .= $string;
       }
       
       function 
    fail($number){
           
    // 1 = Syntax Error
           
    exit;
       }
       
       function 
    getQ(){
           return 
    $this->query;
       }
    }


    واستخدام الملف :



    كود PHP:
    <?php
    //iql.php
    include('class.iql.php');
    $obj = new IQL;
    $obj->pub = array("students"=>"stu");
    $obj->flds = array("age""name");
    // $obj->run("Browse all students with name equal ahmed ehab");
    // $obj->run("Browse all students with name not equal ahmed ehab");
    // $obj->run("Browse all students with age greaterthan 20");
    // $obj->run("Browse all students with age greater than 20");
    $obj->run("Browse all students with age equal 20");
    echo 
    $obj->getQ();




    حاولت البحث عن مراجع جيدة عن ال IQL في جوجل .. ولكن لم اجد فاعتذر عن عدم اضافة مراجع في هذا الموضوع . .

    تحياتي





    __________________
    SWF Thumbnail - tweet me


  2. #2
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    رهييب ياحمد ... فعلاً حاجة حلوة ..

    جميل الكلاس أيضاً مع أني ما قرأته كله لكن أخذت نظرة سريعة ..

    طيب شو الفكرة من استخدام IQL في ظل وجود أوامر وأزرار أسهل ؟!

    لا تنسى أن المستخدم قد يخطئ إملائياً !

    شوف، لو كان نظام الـ IQL المعتمد عربي يبقى روعة ، يعني مناسب جداً للمستخدمين العرب ..

    وسؤال كمان، ليش أضفت "#" لاستعلام الـ IQL ؟

    موضوع شيق ولي عودة إن شاء الله ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  3. #3
    عضو فعال
    تاريخ التسجيل
    Jul 2003
    المشاركات
    1,576


    اهلا اهلا اشرف باشا .. شكرا على مرورك يا جميل

    بالنسبة لفكرة IQL عامة ، لابد انك لاحظت في بعض الاحيان يكون لديك حرية الاختيار ما بين Normal Mode او Advanced Mode مثلا في كتابة ال BB Code او غيره ..

    او تعالا صحيح ، اثناء كتابتك انت للموضوع واحببت ان تقوم باضافة كود php هل تقوم بالضغط على الزر ام تقوم بكتابة [ php ] بيدك وتقوم باغلاقها ؟

    هذه هي الفكرة ، تخيل مجتمع اغلبية زواره او من المفترض ان كل اعضاءه من المبرمجين او ناس لديهم خبرة ، وتريد توفير طريقة افضل واسهل ومريحة اكثر ..


    بالنسبة للكلاس ، لقد اعتمدت بشكل كامل في السكربت على تقطيع ال String القادم إلى كلمات .. والتحقق من كل كلمة بالترتيب ..
    مثلا اول كلمة من المفترض ان تكون
    Browse او GET
    فقمت بانشاء فنكشن باسم iql_browse و المفروض iql_get (ولكن ماعملتهاش )
    تاني كلمة من المفترض ان تكون مثلا
    browse all او browse student او browse students .. وهكذا

    يعني قمت بحصر الاحتمالات .. وتقييم السكربت على اساس هذه الاحتمالات ..
    ولهذا قمت باضافة ال # في آخر السترينج .. حتى يمكنني التشييك على نهايته ، وكذلك في النقطة الخاصة ب
    equal and not equal

    كانت لدي الجملة بهذا الشكل :
    " browse student with name equal ahmed ehab "

    فكنت اريد استخلاص الاسم او ال value من بعد equal ولكن واجهتني مشكلة انه من الممكن ان تكون ال value عدة اشكال مختلفة لا يمكن حصرها .. فقمت بحصرها ب
    and|or|order|#



    عموما ، لا ادري هل الطريقة المتبعة في ميكاانيكية السكربت صحيحة ام لا .. كنت افضل استخدام RegEx بشكل كامل .. ولكن لا ادري كيفيتها بالضبط ..

    اشياء يمكن تحسينها في الكلاس :
    - Order By
    - Limit
    - more than one coniditon (حاليا الكلاس تدعم شرط واحد في where )



    تحياتي وشكرا لاهتمامك





    __________________
    SWF Thumbnail - tweet me

  4. #4
    عضو سوبر نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    613


    رائع جداً ، فكرة جميلة لتبسيط البسيط ، شكراً لك






  5. #5
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    أحمد أفندم

    قبل ما أكتب أي حاجة أنا خطرت ببالي فكرة رائعة ، أعتقد تنفيذها هيفيد الكل إن شاء الله .. هاراسلك بريدياً وأشوف رأيك إن شاء الله ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  6. #6
    عضو نشيط جدا
    تاريخ التسجيل
    Nov 2003
    المشاركات
    461


    رائع بالفعل ،

    للاسف الاختبارات خانقة
    على العموم لي عودة بعد انتهاء الاختبارات (نهاية الاسبوع القادم)





    __________________
    AlwatanVoice, www.alwatanvoice.com
    Almashroo, www.almashroo.com

    Pal Coder == Palestinian Coder

  7. #7
    عضو نشيط
    تاريخ التسجيل
    May 2007
    المشاركات
    181


    يعني انت زنق معاك تنزل موضوع حلو كدا يشد الواحد
    وهو عنده امتحانات
    ماش ياعم
    بس موضوع جميل وفكره ولا اروع فعلا
    انا فكرت في الحوار دا بس ماكنتش اعرف ان في اصلا مسمى وفكر شغال
    جزاك الله خير
    لي عوده





    __________________
    يتم قبول الان استقبال اي طلبات التطبيقات
    على اي نوع من المنصات الاتيه للجوال
    ( اندرويد -- ايفون ) تابعنا
    ( أعمالنا - اتصل بنا )
    يمكنك الان عمل تطبيق خاص لمنتداك

  8. #8
    عضو شرف
    تاريخ التسجيل
    Apr 2002
    المشاركات
    1,379


    الفكره جيدة لكن تطبيقها عمليا ليس مفيد جدا ... فكرة وضع مرادفات لل sql او html هو تقنين استخدامها او توحيدها على سبيل المثال bbcode وضع من اجل اتاحة وسوم خاصة في html وتجاهل البقية منها وهو حل من اجل آمان البرنامج ويشمل ذلك وسوم wiki الخاصة .
    لكن ما يعيب bbcode او wiki code هو انها لم توحد هذه الشفره , علما ان اغلب التطبيقات الحديثة اصبحت تستخدم wiki code .

    الفكرة التى قد تكون مفيدة جدا في الصنف السابقة, ان يتعامل مع قواعد بينات مختلفة بنفس الصيغه , اي يكون هناك sql عادي موحد لكل انواع قواعد البينات ويتم ترجمتة حسب قادة البينات .

    مثال الاستعلام العادي سيكون:
    كود:
    SELECT * FROM `table_name` LIMIT 5
    سيصبح في mysql
    كود:
    SELECT * FROM `table_name` LIMIT 5
    اما في oracle سيصبح
    كود:
    SELECT * FROM `table_name` where rownum<=5






    __________________
    ضيف الله العتيبي مبرمج حر و مهندس معتمد من زيند (ZCE)
    الاتصال: daif@daif.net او جوال: 0556639884
    الخدمات: تقديم استشارات برمجيه, تطوير بوابات/خدمات إلكترونيه للقطاع العام او الخاص .

  9. #9
    عضو فعال
    تاريخ التسجيل
    Jul 2003
    المشاركات
    1,576


    Pal Coder :
    artint.net :

    يا جدعاااااان .. احلى برمجة تطلع من ايدك هي في ايام الامتحانات
    لما يكون وراك امتحان Computer Graphics بعد 3 ساعات وانت قاعد تتابع سوالف .. بردو بتحط احلى ردود

    تسلموا عالتشجيع .. وبانتظار عودتكم



    daif :
    شكرا لمرورك وكلامك يا باشا
    كلامك صحيح
    1- لاحظت مدى تقنين البرمجية ، فلايمكن اضافة كلمة اخرى غير Browse بسهولة ، وايضا لا ادري ان كان " تعميم " الكلمات او " تنوعها " هو من الناحية الايجابية ام السليبة .. سواء عمليا او برمجيا
    يعني كونك انت تستخدم مثلا كلمة Browse وغيرك يستخدم كلمة Get وغيرك يستخدم كلمة Show .. في نفس البرمجة او نفس الصفحة ، هل هذه ستكون ميزة ؟ ام انها ستكون عيب ويجب ان يكون الكلام موحد ووفق سياق واحد ؟

    2- فكرة تعدد محركات الداتا بيز في بالي ولكن لم اقم باضافتها مباشرة نظرا لأني لم اتعامل مع الاوراكل من قبل ولكن اضافتها او اضافة اي محرك قواعد بيانات آخر او حتى اي لغة مصدرية اخرى مثلا XML سيكون سهل للغاية

    لأنك تقوم ببناء الجملة من الصفر وإلى نهايتها بنفسك .. من بضع كلمات يقوم الزائر بكتابتها وتقوم برمجيتك بفهم المطلوب وتحويله إلى شكل اوامر برمجية


    نريد افكار عملية لتحسين الفكرة وطريقة برمجتها .. الموضوع جميل والله ولذيذ

    دعواتكم لي في الامتحان
    تحياتي





    __________________
    SWF Thumbnail - tweet me

  10. #10
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    1- لاحظت مدى تقنين البرمجية ، فلايمكن اضافة كلمة اخرى غير Browse بسهولة ، وايضا لا ادري ان كان " تعميم " الكلمات او " تنوعها " هو من الناحية الايجابية ام السليبة .. سواء عمليا او برمجيا
    يعني كونك انت تستخدم مثلا كلمة Browse وغيرك يستخدم كلمة Get وغيرك يستخدم كلمة Show .. في نفس البرمجة او نفس الصفحة ، هل هذه ستكون ميزة ؟ ام انها ستكون عيب ويجب ان يكون الكلام موحد ووفق سياق واحد ؟
    امبارح وأنا بلعب بالكلاس عملت شوية تطويرات ، ومن ضمنها كان تعدد الكلمات ، طريقتي كانت في تعيين مصفوفة في الكلاس كالتالي:

    كود PHP:
     public $cmd = array
      (
       
    'browse' => 'select',
       
    'show' => 'select'
      
    ); 
    وبذلك ، أصبحت دالة run كالتالي:
    كود PHP:
     function run($string){ 
      
    $this->string strtolower($string) .' #';
      
    $this->words $this->wordCut($this->string); 
      if (!isset(
    $this->cmd[$this->words[0]])) $this->fail(1);
      
    $func 'iql_'$this->cmd[$this->words[0]];
      if (
    method_exists($this$func)) {
       
    $this->$func();
      } else { 
       
    $this->fail(1);
      }
     } 
    مع تعديل اسم الفنكشن من iql_browse إلى iql_select ( استخدام أسماء التعليمات الأصلية للوصول للهدف عن طريق أسماء أخرى ) :
    كود PHP:
    function iql_select(){ 
    وكذلك قمت بدعم طريقة:
    كود:
    Browse from 10 to 20 students
    عن طريق :
    كود PHP:
      if ($this->words[1] == 'all') {
       
    $this->limitfrom $this->limitto 0;
      } elseif (
    $this->words[1] == 'from') {
       
    $this->limitfrom intval($this->words[2]);
       if (
    $this->words[3] == 'to') {
        
    $this->limitto intval($this->words[4]);
       }
      } elseif (
    $this->words[1] == 'to') {
       
    $this->limitto intval($this->words[2]);
      } 
    داخل دالة iql_select ، وطبعاً، معرفين متغيرين في الكلاس :
    كود PHP:
     public $limitfrom 0;
     public 
    $limitto 0
    طبعاً انا ما طرحتش التعديلات على شكل كلاس كامل لإني عدّلت حاجات والباقي خرب عشان ترتيب الكلمات وكدا ، فمش ممكن أنزله إلا لما يكون شغال بطريقة صحيحة ..

    لكن أعتقد أن صيغة from و to غير مناسبة بهذه الطريقة ، أفكّر في صيغ مفيدة للـ Limit :
    كود:
    Browse first 10 students
    Browse second 10 students
    ...
    تنفع للصفحات ، يعني تمشي صفحة صفحة ..

    كود:
    Browse students from 10 to 20
    بدل الطريقة اللي عملتها أنا، أحس دي مناسبة أكتر ..

    كود:
    Browse any 10 students
    يستخدم Rand في الترتيب ..

    كود:
    How many/much students?
    ممكن لو عايز توسَع أكتر يعني ..

    كود:
    Browse 5 students
    وبرضه:
    كود:
    Browse 5 students with greatest age
    بحيث يعمل Order By Age و Limit

    كود:
    Browse students without age
    بحيث الحقل age فاضي

    وايه رأيك يكون في علامات للحقول ، يعني مثلاً [field] لو اتكتب كدا ياخد اسم الحقل زي ماهو ، لو كان بدون [] يشوف اسم الحقل من الكلاس عن طريق الاسم الموجود ..

    وممكن تكون الخاصية اختيارية في الكلاس ..

    هذا اللي خاطر في بالي الآن ..

    ولي عودااات إن شاء الله ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  11. #11
    عضو فعال
    تاريخ التسجيل
    Jul 2003
    المشاركات
    1,576


    باك ..

    اشرف باشا ، مجهود رائع ..

    قمت باضافة النقطة التي اضفتها إلى الكلاس ..
    كود PHP:
    <?php
    class IQL{
        var 
    $pub = array();
        var 
    $flds = array();
        var 
    $string;
        var 
    $words = array();
        var 
    $query "";
        var 
    $cmd = array();
        
        function 
    run($string){
            
    $this->string strtolower($string)." #";
            
    $this->words $this->wordCut($this->string);
            if (!isset(
    $this->cmd[$this->words[0]])) $this->fail(1);
            
    $met $this->cmd$this->words[0] ];
            
    $func "iql_$met";
            if (
    method_exists($this$func)){
                
    $this->$func();
            }else{
                
    $this->fail(1);
            }
        }
        
        function 
    wordCut($sText){
            
    $sString wordwrap($sText1'[cut]');
            return 
    explode('[cut]'$sString);
       }
       
       function 
    iql_select(){
           
    $func "iql_browse_".$this->words[1];
           if (
    method_exists($this$func)){
                
    $this->$func();
            }else{
                
    $this->fail(1);
            }
       }
       
       function 
    iql_browse_students(){
           
    $this->iql_browse_all(1);
       }
       
       function 
    iql_browse_all($n 2){
           if (
    $this->pub$this->words[$n] ]){
               
               
    $q "select * from ".$this->pub$this->words[2] ];
               
    $this->add2query($q);
               
               if (
    $this->words$n+] && $this->words$n+]){
                   if (
    in_array($this->words$n+],$this->flds)){
                       
    $q2 $this->add2where($n+3);
                   }
               }
           }else{
               
    $this->fail(1);
           }
       }
       
       function 
    add2where($x){
           if (
    $this->words[$x] == "greaterthan" || ($this->words[$x] == "greater" && $this->words[$x+1] == "than") ){
               if (! 
    is_numeric($this->words[$x+2])){
                   if (
    is_numeric($this->words[$x+1])){
                       
    $value $this->words[$x+1];
                   }else{
                       
    $this->fail(1);
                   }
               }else{
                   
    $value $this->words[$x+2];
               }
               
               
    $factor ">";
               
           }else if ( 
    $this->words[$x] == "lessthan" || ($this->words[$x] == "less" && $this->words[$x+1] == "than") ){

               if (! 
    is_numeric($this->words[$x+2])){
                   if (
    is_numeric($this->words[$x+1])){
                       
    $value $this->words[$x+1];
                   }else{
                       
    $this->fail(1);
                   }
               }else{
                   
    $value $this->words[$x+2];
               }
               
                
    $factor "<";
                
                
            }else if (
    $this->words[$x] == "equal"){
                
    preg_match("/equal(.*)(order|and|or|#)/"$this->string$res);
                
    $factor "=";
                
    $value $res[1];
                
            }else if (
    $this->words[$x] == "notequal" || ( $this->words[$x] == "not" && $this->words[$x+1] == "equal") ){
                
    preg_match("/equal(.*)(order|and|or|#)/"$this->string$res);
                
    $factor "!=";
                
    $value $res[1];
            }else{
                
    $this->fail(1);
            }
            
                
    $q " where ".$this->words[$x-1].$factor '$value'";
                
    $this->add2query($q);
                
       }
       
       function 
    add2query($string){
           
    $this->query .= $string;
       }
       
       function 
    fail($number){
           
    // 1 = Syntax Error
           
    exit;
       }
       
       function 
    getQ(){
           return 
    $this->query;
       }
    }

    ويتم اضافة هذا إلى الكائن :
    كود PHP:
    $obj->cmd = array('browse'=>'select''show'=>'select'); 



    بالنسبة لفكرة ال [] اعتقد انه يجب استخدامها .. واستخدامها اعتقد سيفتح الطريق لاستخدام ال RegEx بشكل اكبر ..

    اعتقد انه سيكون هناك نوعا ما Syntax خاص حتى يتم التعامل مع السترينج المدخل بشكل كامل .. مثلا من المفترض ان يكون هناك شكل معين لكتابة اسماء الحقول في السترينج .. او القيم ولكن بهذا سنقلل من قيمة الفكرة نفسها كسهولة التعامل .. وسيبدا يتحول الامر إلى انشاء اوامر برمجية اخرى ..

    تحياتي





    __________________
    SWF Thumbnail - tweet me

  12. #12
    عضو شرف
    تاريخ التسجيل
    May 2007
    المشاركات
    1,647


    شكراً لاستجابتك عزيزي المستخدم هع ..

    اعتقد انه سيكون هناك نوعا ما Syntax خاص حتى يتم التعامل مع السترينج المدخل بشكل كامل .. مثلا من المفترض ان يكون هناك شكل معين لكتابة اسماء الحقول في السترينج .. او القيم ولكن بهذا سنقلل من قيمة الفكرة نفسها كسهولة التعامل .. وسيبدا يتحول الامر إلى انشاء اوامر برمجية اخرى ..
    تطبيق فكرة ضيف الله سوف تحوّل الفكرة إلى أوامر برمجية جديدة ..

    الآن الموضوع ممكن أن يتم بإحدى طريقتين:
    * التسهيل على المبرمجين : بتحويل التقنية إلى توحيد الاستعلام ، وهي بفكرة ضيف الله ..
    * التسهيل على المستخدمين : بإعطاء التقنية مرونة أعلى ، وهذا سيجعلها متوفرة بمتناول يد الجميع ، وسيحبها المستخدمون لأنها توفّر عليهم الوقت والجهد ..

    النقطة الثانية هي التي تحقق مقصد IQL بالتحديد ، لذلك أنا أرى أن إعطاء التقنية مرونتها المطلوبة ، أو مرونة أعلى من الحالية ، بل وبمحاولة توفير جميع الاحتمالات ، هو ما سيجعل من هذه البرمجية أعجوبة تحقق الكثير من الأهداف ، وأهمها السلاسة ..

    فعلاً يجب توفير Syntax جديد ، بل الأفضل أن يتم توفير Multi-Syntaxes .. حتى لو تم دعم [] ، فهي إضافية لتحديد اسم الحقل بالضبط مثلاً ، والطريقة العادية ستعمل بكفاءة كذلك ، كل حسب الهدف المطلوب ..

    أرى أن الفكرة واسعة جداً والعمل عليها لتصبح بالشكل المطلوب قد يستغرق وقتاً طويلاً ..

    سأتردد على الموضوع كلما جدّ به جديد إن شاء الله تعالى ..

    شكراً على المتابعة مستر أحمد ..

    تحياتي، أشرف السمهوري





    __________________
    # اتبعني على Twitter
    # عِرفان ساهم ببناء المحتوى العربي العلمي على الإنترنت!

  13. #13
    عضو نشيط
    تاريخ التسجيل
    Nov 2007
    المشاركات
    252


    الله بعطيك العافية










ضوابط المشاركة

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  

أضف موقعك هنا|شقق للايجار في الكويت | بيوت للبيع في الكويت | شركة كشف تسربات المياه | شركة عزل اسطح بالرياض | عزل فوم بالرياض| عزل اسطح بالرياض | كشف تسربات المياة بالرياض | شركة عزل اسطح بالرياض