เล่นง่ายๆ กับเช็คว่า ip, e-email หรือ username ที่สมัครสมาชิกเข้ามาเป็น spammer หรือไม่?

ช่วงนี้เจอเรื่องปวดหัวเกี่ยวกับ spam ใน forum เยอะมาก ตอนนี้เลยใช้วิธีง่ายๆ ไปก่อนผ่าน http://www.stopforumspam.com ก็กันได้ในระดับนึง แต่ว่ามี API Limit อาจจะต้องหาวิธีอื่นๆ แก้ไขเฉพาะหน้ากันต่อไป คิดว่าน่าจะพอไหวอยู่

<?php
function is_forumspam_objectsIntoArray($arrObjData, $arrSkipIndices = array()) {
    $arrData = array();

    // if input is object, convert into array
    if (is_object($arrObjData)) {
        $arrObjData = get_object_vars($arrObjData);
    }

    if (is_array($arrObjData)) {
        foreach ($arrObjData as $index => $value) {
            if (is_object($value) || is_array($value)) {
                $value = is_forumspam_objectsIntoArray($value, $arrSkipIndices);
            }
            if (in_array($index, $arrSkipIndices)) {
                continue;
            }
            $arrData[$index] = $value;
        }
    }
    return $arrData;
}

/**
http://www.stopforumspam.com/api?ip=91.186.18.61
http://www.stopforumspam.com/[email protected]
http://www.stopforumspam.com/api?username=MariFoogwoogy
**/
function is_forumspam($var) {

    $var['email'] = urlencode($var['email']);

    $q = 'username='.$var['username'].'&email='.$var['email'].'&ip='.$var['ip'];

    $xmlUrl = "http://www.stopforumspam.com/api?".$q."&f=xmldom";

    $xmlStr = file_get_contents($xmlUrl);

    $xmlObj = simplexml_load_string($xmlStr);

    $arrXml = is_forumspam_objectsIntoArray($xmlObj);

    if($arrXml['ip']['appears'] == 1)
    return true;
    if($arrXml['email']['appears'] == 1)
    return true;
    if($arrXml['username']['appears'] == 1)
    return true;

    return false;
}

อ้างอิงจาก http://www.stopforumspam.com

 

 

เอา Zend Framework มาใส่ Codeigniter Framework เพื่อใช้ Zend Component

entry นี้ผมกะจะเขียนตั้งนานแล้ว แต่ว่าไม่มีโอกาสเสียที วันนี้เลยเอาสักหน่อยครับ

ผมไม่เท้าความว่า Codeigniter Framework คืออะไร หาอ่านกันเอานะครับ ติดตั้งอย่างไร เขียนยังไง ทำงานอย่างไร อันนี้หาเอาได้ในเว็บต่างๆ ทั้งไทยและเทศ ผมว่ามีเยอะ ผมลุยเรื่องปรับแต่งเพิ่มเติมเลยดีกว่า

เหตุผลที่เอา Component ของ Zend Framework (ต่อไปเรียก Zend) มาใช้ใน Codeigniter (ต่อไปเรียก CI) เพราะความครบเครื่องในการนำไปใช้งาน ที่หลายๆ อย่างทำได้ดีกว่าตัว CI เยอะมาก แต่โครงสร้างและติดตั้งของ Zend ทำได้ยุ่งยากกว่า ผมเลยเอามาผสมกัน หากใครใช้ Zend มาบ้างจะทราบดีว่ามันอลังการงานสร้างแค่ไหน ครบเครื่องอย่างไร

เอาหล่ะ ไม่พูดอะไรมาก ก่อนอื่นสร้างไฟล์ที่ path ตามด้านล่างครับ

system/application/libraries/Zend.php

ภายในไฟล์ก็ประกอบด้วยโค้ดตามด้วยล่างครับ

<?php
class CI_Zend {
    function __construct ($class = NULL) {

        ini_set('include_path',  ini_get('include_path') . PATH_SEPARATOR . APPPATH . 'libraries');

        if ($class) {
            require_once (string) $class . EXT;
            log_message('debug', "Zend Class $class Loaded");
        } else {
            log_message('debug', "Zend Class Initialized");
        }
    }

    function load ($class) {
        require_once (string) $class . EXT;
        log_message('debug', "Zend Class $class Loaded");
    }
}

โดยเมื่อได้ไฟล์ Zend.php แล้ว ให้เอา Directory “Zend” ทั้งหมดไปใส่ที่

system/application/libraries

เวลาใช้งาน ก็ใช้งานผ่าน Controller ของ CI โดยมี 2 แบบคือ

  1. โหลด Library Zend ที่เขียนสำหรับตั้ง include path ไปพร้อมๆ กับโหลด Component ไปด้วยเลย
$this->load->library('zend', 'Zend/Package/Name');
  1. โหลดตัว Library Zend ที่เขียนสำหรับตั้ง include path ก่อน แล้วค่อยโหลดตัว Component ทีหลังเป็นตัวๆ ไปก็ได้
$this->load->library('zend');
$this->zend->load('Zend/Package/Name');

การโหลด Zend Component แบบนี้ก็ทำให้ดูเป็นระเบียบกว่าการ require_once เข้ามา เพราะอย่างน้อยก็ทำให้เราทำ logs tracking ใน CI ได้ครับ รวมไปถึงการตั้ง include path เพื่อโยกย้าย Zend Framework ไปที่ไหนๆ ก็ได้ตามแต่เราตั้งใน include path โดยไม่ต้องอ้างอิง include path ของ System

เพียงเท่านี้เราก็ลั้นล้ากับ Zend ใน CI ได้สบายใจแล้วหล่ะครับ ;)

 

/*p0rt80 BKK*/ – PHP Day

ด้วยความร่วมมือจาก Narisa.com, ThaiAdmin.org, Blognone.com, ThaiThinkPad.com และ ไมโครซอฟท์ (ประเทศไทย) เราขอเชิญเพื่อนๆ ชาว Dev และเพื่อน ๆ ใน Community (คุณนั่นแหละ) และบุคคลที่สนใจ มาพบปะสังสรรค์แลกเปลี่ยนประสบการณ์กัน ในงาน /* pOrt80 BKK */ ซึ่งเป็นงานที่ว่ากันด้วยเรื่องการพัฒนา App โดย PHP และ Open source ต่าง ๆ เพื่อใช้ในงานประจำวันของเรา นอกจากเพื่อน ๆ ที่อาสาเป็น Speaker ในงานเช่น คุณสมเกียรติ ปุ๋ยสูงเนิน : [Narisa.com: Up1] คุณมหศักดิ์ พิจิตรธรรม (ZCE:214599205) : [Narisa.com : Zelda] เรายังได้เชิญตัวแทนจาก Zend Technologies ประเทศสิงคโปร์ มาพูดคุยเรื่องราวเกี่ยวกับ Framework, Roadmap และได้เชิญผู้คร่ำหวอดในวงการ PHP ที่ตั้งบริษัทของตัวเองจนประสบความสำเร็จมามาแบ่งปันประสบการณ์ว่าท่านเหล่า นั้นทำได้อย่างไร อีกทั้งยังมี คุณวสันต์ ลิ่วลมไพศาล ผู้ก่อตั้งเว็บไซต์ Blognone.com มาแชร์ความรู้ในการเข้าถึงข้อมูลได้ง่ายกว่าด้วย PHP Data Object พร้อมด้วยกูรูจาก Ford AntiTrust มาเล่าเรื่องราวของ PHP Performance with APC + Memcached

ในงานไม่ใช่จะแต่สาระเพียงอย่างเดียว ยังมีความบันเทิงพบปะเพื่อนใหม่ พร้อมรับของที่ระลึก
ให้กลับบ้าน มาเถอะครับ กระชับวงล้อม ขยับเข้ามาช่วยกันสร้างชุมชนที่มีแต่มิตรภาพกันครับ

งานนี้เหมาะกับใคร ?

  • ผู้สุงวัยชาว PHP ที่ต้องการถ่ายทอดประสบการณ์
  • ชาว PHP ที่ต้องการหาอะไรใหม่ ๆ มาช่วยให้งานดูดี
  • มือใหม่ บุคคลที่สนใจ
  • นักศึกษาที่กำลังหาแนวทางในการทำ Senior Project หรือ กำลังงงว่าจะไปทางไหนดี
  • ชาว Dev ไม่มีที่จะไปและไม่มีใครชวนไปไหนในวันอาทิตย์

วันและสถานที่จัดงาน

วันอาทิตย์ ที่ 19 กันยายน พ.ศ. 2553
เวลา 9.00 ถึง 17.15 น. (ลงทะเบียนเวลา 9.00 ถึง 9.30 น.)
ชั้น 38 บริษัท ไมโครซอฟท์ (ประเทศไทย)

ค่าใช้จ่ายและการลงทะเบียน

ฟรี! ตลอดงานครับ มาแต่ตัวกับหัวใจ เราเตรียมอาหารกลางวันรสดี กาแฟรสเลิศ ของเสริฟในยามว่าง เราเตรียมไว้ให้ตลอดงานครับ ร่วมลงทะเบียนเข้างานเพื่อรับของที่ระลึกเก๋ ๆ ได้ที่นี่ครับ

หัวข้อภายในงาน

  • PHP Roadmap
    โดย Mr. Rama Yurindra, Zend Technologies Representative, Singapore
  • ธุรกิจสิบล้านกับงาน PHP แบ่งปันประสบการณ์ดี ๆ จากคนคอเดียวกัน
    ว่าสามารถสร้างธุรกิจให้ประสบความสำเร็จจาก PHP ได้อย่างไร

    โดย คุณศุภโชติ กาญจนกรทอง ผู้ก่อตั้งบริษัท 2Fellows Network and Design
  • Exploring a power of SQL Server and PHP
    โดย คุณฟูเกียรติ จุลนวล (Narisa.com: Fuju)
  • สร้างระบบ e-commerce ด้วย CodeIgniter
    โดย คุณสมเกียรติ ปุ๋ยสูงเนิน (Narisa.com: Up1)
  • PHP in Enterprise
    โดย คุณมหศักดิ์ พิจิตรธรรม (ZCE:214599205) : (Narisa.com : Zelda)
  • PHP Performance with APC + Memcached
    โดย Ford AntiTrust (Web Developer/Consultant, Database Consultant, Ubuntu Implementer, Blogger and Photographer)
  • เข้าถึงข้อมูลได้ง่ายกว่าด้วย PHP Data Object
    โดย คุณวสันต์ ลิ่วลมไพศาล ผู้ก่อตั้งเว็บไซต์ Blognone.com
  • Update Web Platform Installer และ Resource ฟรี ๆ
    จาก ไมโครซอฟท์ (ประเทศไทย)

    โดย คุณสงวน ธรรมโรจน์สกุล

รายละเอียดเพิ่มเติมอ่านได้ที่ http://www.microsoft.com/thailand/seminar/FY11Q1_port80bkk/

 

Script PHP สำหรับแสดงรายการคนที่เราไป follow ว่ามีการ tweet ครั้งสุดท้ายเมื่อไหร่

เอาไปแกะต่อกันเองนะครับ เขียนแบบลวกๆ ไว้ใช้งานคนเดียว แต่มีหลายคนอยากได้ก็เลยจัดให้ครับ

เอาไว้ดูว่าคนที่เราตามอยู่เนี่ยเลิกเล่น twitter ไปหรือยัง จะได้ไป unfollow ได้ เพื่อลดจำนวนคนที่เรา follow ครับ

<?php
error_reporting(0);

$type = 'friends'; // friends | following

$login = "username:password";
$cursor = -1;
$user_info = explode(':', $login, 2);
$req_num = 0;
$user_lists = array();

while($cursor != 0 ) {

    $req_num++;
    $tweeters = null;
    $retry  = false;
    $uri = "http://twitter.com/statuses/".$type.".xml?screen_name=".$user_info[0]."&cursor=".$cursor;

    $tw = curl_init();
    curl_setopt($tw, CURLOPT_URL, $uri);
    curl_setopt($tw, CURLOPT_USERPWD, $login);
    curl_setopt($tw, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($tw, CURLOPT_TIMEOUT, 30);
    $twi = curl_exec($tw);

    try {
        $tweeters = new SimpleXMLElement($twi);
    } catch(Exception $e) {
        $retry = true;
    }

    if(count($tweeters) > 0 ) {
        foreach($tweeters->users->user as $user) {
            $datetime = new DateTime($user->status->created_at);
            $timestmp = mktime(
                $datetime->format('H'),
                $datetime->format('i'),
                $datetime->format('s'),
                $datetime->format('n'),
                $datetime->format('j'),
                $datetime->format('Y')
            );
            $user_lists[$timestmp][] = $user;
        }
    }
    if(!$retry)
        $cursor = $tweeters->next_cursor;
}

if(count($user_lists) > 0 ) {
    ksort($user_lists, SORT_NUMERIC);
    foreach($user_lists as $timestmp => $user_list) {
        foreach($user_list as $user) {
            echo date("Y-m-d", $timestmp) . ' - ' . $user->screen_name.PHP_EOL;
        }
    }
}
echo PHP_EOL;
echo 'Req : '.$req_num.PHP_EOL;