Author: kanakorn.h

  • เทคนิคการใช้งาน Regular Expression บน Excel

    เมื่อต้องการเลือกข้อมูล หรือจัดกลุ่มข้อมูลที่เป็นข้อความ ยาวๆ ซับซ้อน ก็ต้องคิดถึงการใช้ Regular Expression ซึ่งใช้งานได้ทั่วไปใน Shell Script ต่างๆ แต่เมื่อต้องทำสิ่งเหล่านี้ใน Excel นั้น ค่อนข้างยุ่งยาก  แล้วในที่สุด ก็ไปพบคนใจดี เขียน VBS มาให้ ตามไฟล์นี้ regexp.txt ให้ใช้งาน Regular Express แบบเป็น Formula ง่ายๆ

    วิธีการใช้ติดตั้งใช้งาน

    1. Download ไฟล์ข้างต้นไป แล้วแก้เป็นนามสกุล .bas
    2. เปิด Excel แล้วกดปุ่ม Alt-F11
    3. ไปที่ File > Import File แล้วเลือกไฟล์ .bas ข้างต้น
    4. ผลคือ จะได้ Module ชื่อ regexp
    5. ใน Excel ตั้งแต่ 2007 เป็นต้นไป จะไม่ยอมให้ Excel ใช้งานพวก Macro ต่างๆได้ ดังนั้น ให้ Save เป็นนามสกุล .xlsm จึงจะใช้งานต่อไปได้

    ใน Module นี้ จะได้ฟังก์ชั่นมา 3 อย่างคือ

    1. RegExp : หาว่าใน String นั้นมี Pattern ที่ค้นหาหรือไม่
    2. RegReplace: แทนที่คำที่ค้นหา
    3. RegExtract: แกะเอาเฉพาะ pattern ที่ต้องการออกมา

    ตัวอย่างที่ใช้งานจริง คือการแกะเอา Parameter บางอย่าง จาก URL ที่เก็บมา เพื่อเอาไปประมวลผลต่อด้วย PSPP หรือ SPSS

    สมมุติใน Cell “A1” มี URL ดังนี้

    /webmail/src/right_main.php?PG_SHOWALL=0&newsort=0&startMessage=1&mailbox=INBOX

    ใน Cell “B1” ต้องการดูว่า newsort ตั้งค่าเป็นอะไร ก็เขียนสูตรว่า

    =RegExExtract(“.*newsort=([0-9])&.*”,A1,”$1″)

    ผลที่ได้คือ 0

    หรือ Cell “C1” ต้องการดูค่าว่า mailbox ตั้งค่าอะไรอยู่ ก็ใช้สูตรว่า
    =RegExExtract(“.*mailbox=([a-zA-Z0-9._-]*)&.*”,A1,”$1″)

    Reference

    http://stackoverflow.com/questions/4556910/how-do-i-get-regex-support-in-excel-via-a-function-or-custom-function

  • เทคนิคในการบันทึกความเร็วของ Web Browser มาเก็บไว้ที่ Web Server

    ต่อจาก

    วิธีพัฒนา Squirrelmail Plugin – กรณี pagespeed

    เทคนิคการส่งค่าจาก PHP ให้ JavaScript

    เมื่อรู้ระยะเวลาที่ Web Browser ประมวลผลแล้ว ต่อไปก็ต้องการเก็บข้อมูลต่างๆมาเก็บที่ Web Server เพื่อบันทึกเก็บไว้วิเคราะห์ต่อไป สามารถทำได้โดยการใช้ JavaScript ส่งค่่าผ่าน HTTP GET Method มายัง PHP

    เริ่มจากสร้าง PHP  ให้ชื่อว่า getdata.php สำหรับรับค่าจาก JavaScript ที่ทำงานจาก Web Browser ของผู้ใช้ ดังนี้

    <?php
      $data=$_GET['data'];
      $h = fopen('/var/log/userview.log', 'a');
      fwrite($h, $data . "\n" );
      fclose($h)
    ?>

    สมมุติ เรียกใช้ผ่าน URL ต่อไปนี้

    http://myserver.com/getdata.php?data=xxyyzz

    ก็จะเอาค่า xxyyzz เขียนใส่ไฟล์ /var/log/userview.log และต่อท้ายไปเรื่อยๆ

    ในฝั่งของ JavaScript ให้เขียนโค๊ดดังนี้

    <SCRIPT LANGUAGE="JavaScript">
    var xmlhttp;
    var url;
    var data;
    
    data=servertime + ":" + second + ":" + total ;
    
    url="http://myserver.com/getdata.php?data=" + data;
    
     if (window.XMLHttpRequest)
        xmlhttp = new XMLHttpRequest();
     else
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    
    xmlhttp.open(\'GET\',url, true);
    xmlhttp.send();
    
    </script>

    เท่านี้ก็จะสามารถเก็บค่าต่างๆจาก Web Browser มาไว้ที่ Web Server ได้

  • เทคนิคการส่งค่าจาก PHP ให้ JavaScript

    ต่อจากตอนที่แล้ว “วิธีพัฒนา Squirrelmail Plugin – กรณี pagespeed

    จากการพัฒนา pagespeed plugin สำหรับ Squirrelmail เพื่อแสดงให้ผู้ใช้เห็นถึง “ความเร็ว” ในการประมวลผลจากฝั่ง server ได้แล้ว

    ต่อไปเราต้องการเอาดูว่า  “ความเร็ว” ในการเดินทางและแสดงผลบน Web Browser ของผู้ใช้ เป็นเท่าไหร่
    ทำได้โดยการใช้งาน JavaScript จับเวลาการทำงาน

    โดยเขียนโค๊ดต่อไปนี้ ใน ฟังก์ชั่น pagespeed_top

    echo ' <SCRIPT LANGUAGE="JavaScript">
     beforeload = (new Date()).getTime();
     </script>
     ';

    และส่วนนี้ไปในฟังก์ชั่น pagespeed_bottom

    echo ' <SCRIPT LANGUAGE="JavaScript">
     afterload = (new Date()).getTime();
     seconds = (afterload-beforeload)/1000;
     document.write("Browser Speed: " + seconds + " s");
    </script>
    ';

    เท่านี้ก็จะทราบระยะเวลาในการเดินทางและแสดงผลเสร็จบน Web Browser แล้วแสดงผลต่อผู้ใช้

    ต่อไปหากต้องการ รวมเวลาทั้งสิ้นที่ผู้ใช้ต้องรอ ตั้งแต่การทำงานที่ Squirrelmail จนกระทั้ง แสดงผลเสร็จ
    ก็ต้องเอาค่าตัวแปรจาก PHP ที่ชื่อว่า $showtime มาบวกกับตัวแปรของ JavaScript ที่ชื่อว่า seconds

    จะส่งค่าจาก PHP ให้ JavaScript อย่างไร ???

    ดูเหมือนยาก แต่จริงๆแล้ว ก็เพียงแค่ให้ PHP แสดงผลเป็นตัวแปรของ JavaScript เท่านั้น ก็สามารถทำให้ JavaScript เอาไปใช้งานต่อได้แล้ว ดังนี้

    echo ' <SCRIPT LANGUAGE="JavaScript">
       servertime = ' . $showtime . ';</SCRIPT>'  ;

    แล้วปรับแต่งโค๊ดใน pagespeed_bottom ข้างต้นเป็น

    echo ' <SCRIPT LANGUAGE="JavaScript">
       servertime = ' . $showtime . ';</SCRIPT>'  ;
    
    echo ' <SCRIPT LANGUAGE="JavaScript"> 
    afterload = (new Date()).getTime(); 
    seconds = (afterload-beforeload)/1000; 
    document.write("Browser Speed: " + seconds + " s"); 
    
    total=servertime + seconds;
    
    document.write("Total:" + total + " s");
    </script> ';

    เป็นตัวอย่างเทคนิคในการส่งค่าระหว่างการคำนวนของ PHP และ JavaScript เบื้องต้น

    ติดตามต่อไปในเรื่องของ “เทคนิคในการบันทึกความเร็วของ Web Browser มาเก็บไว้ที่ Web Server”

  • Warning :: spam-20130109

    พบจดหมายหลอกลวง มีเนื้อความประมาณนี้ (แค่นี้จริงๆ — ไม่จำเป็น อย่าได้ตาม link ไปนะครับ)

    http://www.hfh-schule.de/images/perfsedit.php

    เมื่อคลิกแล้ว (ไม่แนะนำให้ทุกท่านทำเช่นนี้ แต่ผมขอทดลองให้ดูเป็นตัวอย่าง) มันจะ detect ว่าเราอยู่ที่ใดในโลก ในตัวอย่างนี้ มันพบว่า IP Address ของผมอยู่ที่ Songkhla

    ก็จะไปยัง website ชื่อ http://workfromyourhome5.com/

    ซึ่งมันจะทำเป็น Phishing Site หน้าตาเหมือนของ CNBC เป๊ะ ดังนี้


    แต่ถ้าสังเกตดีๆ จะเห็นวันที่ update ข่าวนี้เป็น

    Published: Monday, 30 April 2012 | 7:48 AM ET

    แล้วทุก link ในหน้านี้ จะชี้ไปที่

    http://workfromyourhome5.com/go.php

    ซึ่งจะส่งไปยังหน้า page ที่จะหลอกเอาข้อมูลส่วนตัวเราไปครับ ดังนี้

    จึงเรียนมาเพื่อให้ระมัดระวังกันมากๆครับ

  • วิธีพัฒนา Squirrelmail Plugin – กรณี pagespeed

    Squirrelmail เป็น IMAP Client Webmail แบบมาตราฐาน ทำงานบน PHP ซึ่งติดตั้งง่าย ใช้งานได้รวดเร็ว ไม่ต้องกังวลเรื่องความเข้ากันได้กับ Web Browser ของผู้ใช้หลากหลาย เพราะไม่ค่อยมีการใช้งานพวก JavaScript

    มีความง่ายในการต่อขยายความสามารถ โดยผู้พัฒนาเปิดให้เขียน Plugin ได้ง่าย โดยไม่ต้องแก้ไข Code ของระบบโดยตรง ด้วยวิธีการเสียบ Code ผ่านจุดที่กำหนด ที่เรียกว่า “Hook” ทำให้ Plugin ที่เขียนขึ้น สามารถใช้งานต่อไปได้ แม้มีการปรับรุ่นของ Squirrelmail ต่อไป

    ตัวอย่างการเขียน Squirrelmail Plugin เพื่อแสดงความเร็วในการประมวลผลในแต่ละส่วนของ Squirrelmail
    ใช้ชื่อว่า pagespeed (ทำงานบน Squirrelmail 1.4.x)

    1. สร้าง folder ชื่อ pagespeed
    2. สร้างไฟล์ index.php เอาไว้เฉยๆ
    3. สร้างไฟล์ setup.php , ต่อไปนี้ จะกล่าวถึงการเขียนโค๊ตในไฟล์นี้
    4. สร้าง function แรกที่จะเสียบเข้ากับ Hook ต่างๆ ชื่อว่า squirrelmail_plugin_init_pagespeed
      $starttime=0;
      
      function squirrelmail_plugin_init_pagespeed() {
          global $squirrelmail_plugin_hooks;
         // Code Go Here
      }

      ชื่อฟังกชั่นต้องเป็น squirrelmail_plug_init_xxx() โดยที่ xxx ต้องตรงกับชื่อ folder ในที่นี้คือ pagespeed

    5. ต่อไป บอกให้ Squirrelmail รู้ว่า เราจะเสียบฟังก์ชั่น “pagespeed_top” และ “pagespeed_bottom” ที่่จะเขียนต่อไป ไว้ที่ Hook ใดบ้าง ในที่นี้ จะเสียบไว้ที่หน้า Login บริเวณ Hook ชื่อว่า login_top และ login_bottom, จะเขียนโค๊ดดังนี้ใน function squirrelmail_plugin_init_pagespeed ดังนี้
      $squirrelmail_plugin_hooks['login_top']['pagespeed'] = 'pagespeed_top';
      $squirrelmail_plugin_hooks['login_bottom']['pagespeed'] = 'pagespeed_bottom';

      รูปแบบการเขียนคือ
      $squirrelmail_plugin_hooks[‘ตำแหน่งที่จะเสียบ’][‘ชื่อ plugin’] = ‘ชื่อฟังก์ชั่น’;

    6. ต่อไปมาเขียนรายละเอียดของฟังก์ขั่น pagespeed_top และ pagespeed_bottompagespeed_top ทำหน้าที่ดูเวลาเริ่มต้น มีรายละเอียดดังนี้
      function pagespeed_top() {
         global $starttime;
      
         $gentime = microtime();
         $gentime = explode(' ',$gentime);
         $gentime = $gentime[1] + $gentime[0];
      
         $starttime=$gentime;
      }

      ส่วน pagespeed_bottom ทำหน้าที่ ดูเวลาสิ้นสุด แล้วคำนวนเวลาที่ใช้ไป
      จากนั้น ก็แสดงผลการคำนวนได้

      function pagespeed_bottom() {
         global $starttime;
      
         $gentime = microtime();
         $gentime = explode(' ',$gentime);
         $gentime = $gentime[1] + $gentime[0];
         $pg_end = $gentime;
         $totaltime = ($pg_end - $starttime);
         $showtime = number_format($totaltime, 4, '.' , '');
      
         echo 'Speed: ' . $showtime . ' s' ;
      }

    เท่านี้ก็ได้ plugin แล้ว ต่อไปก็เอาไปติดตั้งได้

    หากต้องการวัดความเร็วในหน้าอื่นๆ เช่น ในส่วนของ right_main (ส่วนแสดงรายการ email ที่อยู่ใน mailbox) ก็สามารถเพิ่มเข้าไปในฟังก์ชั่น squirrelmail_plugin_init_pagespeed ดังนี้

    $squirrelmail_plugin_hooks['right_main_after_header']['pagespeed'] = 'pagespeed_top';
    $squirrelmail_plugin_hooks['right_main_bottom']['pagespeed'] = 'pagespeed_bottom';

    รายละเอียดเกี่ยวกับตำแหน่งของ Hook ดูได้ที่นี่ http://squirrelmail.org/docs/devel/devel-4.html#ss4.4

  • ใช้ Powershell แบบ Linux Shell Script

    รวบรวมการทำงานกับ Powershell บน Windows โดยเทียบเคียงกับการใช้ ShellScript บน Linux
    (ทะยอยเขียนบันทึก โปรดติดตามเรื่อยๆ)

    • เลือกบางบรรทัดจากไฟล์ที่มีคำที่ต้องการอยู่
      shellscript: grep someword textfile.txt
      powershell: select-string “someword” textfile.txt
    • เลือกบางบรรทัดจากไฟล์ แล้วแยกด้วยเครื่องหมาย : เพื่อเอาฟิลด์ที่ 3
      shellscript: grep someword textfile.txt | awk -f ‘{FS=”:”}{print $3}’
      powershell: select string “someword” textfile.txt | % { $_.line.split(‘:’)[2];  }
    • เลือกบางบรรทัดจากไฟล์ แล้วเอาลงไฟล์
      shellscript: grep someword textfile.txt  > output.txt
      powershell: select string “someword” textfile.txt | foreach-object {$_.line} > output.txt
    • ดูท้ายไฟล์ตลอดเวลา (ไม่รู้จะใช้คำว่าอะไรดี) และเริ่มดูโดยเอา 3 บรรทัดสุดท้าย ไม่ใช่เริ่มทั้งไฟลฺ์
      shellscript: tail -f mydata.log
      powershell: get-content mydata.log -wait -tail 3
  • การเปลี่ยนชื่อ group mail ใน mailman

    ในการใช้ mailman เพื่อการให้บริการ Mailing List หรือ Group Mail นั้น การเปลี่ยนชื่อกลุ่มนั้น ค่อนข้างยุ่งยาก แต่สามารถทำได้ง่ายกว่า โดยการสร้าง List ใหม่แล้ว เอา Config และ Member เดิมมาใส่

    ขอยกตัวอย่าง กรณี จะเปลี่ยน group name ของกลุ่มคณะ วจก. ซึ่งเดิมจะขึ้นต้นด้วย mgt-* ให้ไปเป็น fms-*
    ก็จะใช้ Shell Script ตามนี้

    oldname="mgt"
    newname="fms"
    owner="admin.name@psx.ac.th"
    password="xxxxxx"
    
    for line in $( /usr/lib/mailman/bin/list_lists | grep -i "$oldname-"|awk '{print $1}') ; do
       /usr/lib/mailman/bin/config_list -o $line.txt $line
       /usr/lib/mailman/bin/list_members $line > $line-member.txt
       newgroupname=$newname-$(echo $line | sed -e "s/$oldname-\(.*\)*/\1/i")
       sed -e "s/$oldname-/$newname-/i" $line.txt > $newgroupname.txt
       /usr/lib/mailman/bin/newlist $newgroupname $owner $password
       /usr/lib/mailman/bin/config_list -i $newgroupname.txt $newgroupname
       /usr/lib/mailman/bin/add_members -w n -a n -r $line-member.txt $newgroupname
    done

    1. เมื่อต้องการทราบว่า ในระบบของ mailman มี List ใดบ้างที่ชื่อขึ้นต้นด้วย “mgt-” บ้าง
    ใช้คำสั่ง

    /usr/lib/mailman/bin/list_lists | grep -i "mgt-"

    2. ซึ่งจะพบว่ามีหลายกลุ่ม ที่มีชื่อขึ้นต้นด้วย “mgt-“, ก็สามารถใช้ Shell Script เพื่อ เอาผลลัพธ์ จากคำสั่งดังกล่าว มาทำงานร่วมกับคำสั่ง ต่อไปนี้ เพื่อเก็บ Config ของกลุ่มนั้นๆ ออกมาเป็นไฟล์ (สมมุติว่า ชื่อกลุ่มคือ mgt-xxx ก็นำออกมาเป็นไฟล์ชื่อ mtg-xxx.txt)

    /usr/lib/mailman/bin/config_list -o mgt-xxxx.txt mgt-xxx

    3.ต่อไป วิธีการดูว่า แต่ละกลุ่ม มีใครเป็นสมาชิกบ้าง แล้วนำออกมาเป็นไฟล์ (สมมุติว่า ชื่อกลุ่มคือ mgt-xxx ก็นำออกมาเป็นไฟล์ชื่อ mtg-xxx-member.txt)

    /usr/lib/mailman/bin/list_members mgt-xxx > mgt-xxx-member.txt

    จะได้ไฟล์ชื่อเดียวกับชื่อกลุ่ม แต่จะลงท้ายด้วยคำว่า -member.txt

    4, ในการเปลี่ยนชื่อกลุ่ม จะเปลี่ยนจาก mgt-xxxx มาเป็น fms-xxxx วิธีการที่จะได้คำว่า xxxx ที่ต่อท้าย mgt-xxxx นั้น ใช้คำสั่งต่อไปนี้

    echo "mgt-xxxx" | sed -e "s/mgt-\(.*\)*/\1/i"

    คำสั่ง sed นั้นมี option “-e” คือการสั่งให้ execute คำสั่งที่ตามมา
    ส่วน  “s/mgt-\(.*\)*/\1/i” นั้น จะมีโครงสร้างคือ

    s/pattern/replace/i

    s : หมายถึง substitute คือ แทนที
    pattern: ที่เขียนว่า mgt-\(.*\)* หมายความว่า เมื่อเจอรูปแบบ mgt-xxxx ก็จะเอา xxxx มาเก็บไว้ในตัวแปร
    replace: ที่เขียนว่า \1 ก็คือเอาค่าจากตัวแปรใน pattern \(.*\) นั่นก็คือ xxxx
    i: ตัวสุดท้ายหมายถึง Case-Insensitive หรือ ไม่สนใจตัวเลขตัวใหญ่

    5. ต่อไป เป็นสร้าง List ใหม่ ใช่คำสั่งว่า

    /usr/lib/mailman/bin/newlist fms-xxxx admin.name@psx.ac.th xxxxxx

    คือ สร้างกลุ่มใหม่ชื่อ fms-xxxx โดยให้ owner เป็น admin.name@psx.ac.th และใช้พาสเวิร์ดเป็น xxxxxx

    6. ปรับ config ของกลุ่มใหม่นี้ ให้เป็นตามกลุ่มเดิม

     /usr/lib/mailman/bin/config_list -i fms-xxxx.txt fms-xxxx

    โดยนำ config จากไฟล์ fms-xxxx.txt มาปรับใช้กับกลุ่มชื่อ fms-xxxx

    7. สุดท้าย นำสมาชิกจากกลุ่มเดิม เข้าสู่กลุ่มใหม่

    /usr/lib/mailman/bin/add_members -w n -a n -r mgt-xxxx-member.txt fms-xxxx

    โดย option แต่ละตัวหมายถึง
    -w n : ไม่ต้องแจ้งผู้ใช้ว่าถูกเพิ่มเข้ากลุ่ม
    -a n : ไม่ต้องแจ้ง owner

    และนำข้อมูลสมาชิกจากไฟล์ mgt-xxxx-member.txt เข้ากลุ่ม fms-xxxx

  • How Cyrus Murder (Mail Clustering) work?

    ต่อจาก Mail Clustering with Cyrus Murder

    เมื่อ Backend ทำการ Restart หรือมีการเปลี่ยนแปลงเกี่ยวกับ Mailbox

    เครื่อง backend01 และ backend02 ทำการรายงาน mailbox ทั้งหมดในเครื่องของตนเอง ให้ mupdate ทราบ จากนั้น mupdate ก็จะทราบว่า ทั้ง Cluster มี mailbox อะไรและอยู่ที่ใด

    โดยเครื่อง backend01 และ backend02 จะ Login ด้วย User ที่สร้างไว้ใน mupdate ก่อน จากนั้นจึงสามารถทำการ Synchronize ข้อมูล mailbox ไปยัง mupdate ได้

    เมื่อ Mail client ติดต่อใช้บริการ IMAP/POP มายัง Frontend Server

     

    1. เมื่อ Mail Client ซึ่งสมมุติว่า ตั้งค่า Incoming Server เป็น frontend.yourdomain.com ซึ่งเป็นแบบ DNS Round Robin ก็ตอบ IP Address ของเครื่อง frontend server ใน cluster เช่นตอบ IP Address ของ frontend01.yourdomain.com เป็นต้น

    2. เมื่อ frontend01.yourdomain.com รับการเชื่อมต่อจาก Mail Client และทำหน้าที่เป็น IMAP Proxy, สมมุติ Mail Client ต้องการติดต่อ Mailbox ของ User/yingyong.f, เครื่อง frontend01 ก็จะสอบถามไปยัง mupdate ว่า user/yingyong.f อยู่ที่เครื่องใด, ซึ่ง mupdate ก็ดูในฐานข้อมูลตนเอง และตอบว่าอยู่ที่ backend02

    3. จากนั้น frontend01 ก็จะติดต่อกับ backend02 จากนั้น เมื่อผู้ใช้ส่งคำสั่งต่างๆมาจาก Mail Client ก็จะทำผ่าน frontend01 ซึ่งจะไปสอบถาม backend02 ต่อไป จนกระทั่ง ปิดการเชื่อมต่อ

    เมื่อ Mail Client ส่ง email ถึง Domain

     

    1. Mail Client ส่ง email ถึง somsri.b@yourdomain.com, ระบบ DNS จะหาว่า yourdomain.com อยู่ที่ไหน ก็จะพบว่า MX Record ของ yourdomain.com อยู่ที่ frontend.yourdomain.com จากนั้น DNS ก็จะใช้ Round Robin ตอบ IP Address ของหนึ่งใน Frontend มา สมมุติว่าตอบของ frontend02 มา

    2. เครื่อง frontend02 ก็จะไปถาม mupdate ว่า somsri.b อยู่ที่เครื่องใด, mupdate ตอบว่า อยู่ที่ backend01

    3. เครื่อง frontend02 ก็จะส่ง email ต่อไปให้ เครื่อง backend01 เพื่อเขียนลง Mailbox ของ somsri.b ต่อไป