Archive for the 'Programming Solution' Category

Ruby และ Rails Autocomplete สำหรับ Notepad++

หลังจากที่สำรวจแล้วก็งงๆ ว่าทำไมไม่มีใครแจกเจ้า Autocomplete ของ Ruby หรือ Rails ใน Notepad++ ออกมาเลยมีแต่ API มาให้ ผมเลยทำต่ออีกนิดเพื่อให้นำไปลงใน Notepad++ แล้วใช้ได้เลย โดยทุกท่าน สามารถ Download Ruby.xml File ได้ที่นี้ครับ ส่วนใครที่กดเข้าไปเป็น xml ไฟล์ก็กด Save As ได้เลยนะครับ

โดยวิธีติดตั้งใน Notepad++ นะครับ

  1. เอาไฟล์ ruby.xml ไปวางไว้ที่ notepad++_folder/plugins/APIs เช่นของผมก็คือ
    “C:\Program Files\Notepad++\plugins\APIs
  2. ถ้าคุณเปิด Notepad++ ให้ปิดแล้วเปิดใหม่
  3. ลองเปิดโปรเจคที่เป็น .rb ของคุณหรือไม่ก็ new อันใหม่ขึ้นมาแล้วเลือกภาษาเป็น ruby
  4. กด Ctrl+Space แล้วจะเห็น

ง่ายๆแค่นี้เองครับ ไม่รู้ว่ามีใครทำยัง แต่หาแล้วไม่เจอเลยเซร็งๆทำเองเลย แต่เจ้าตัวนี้ยังไม่ฉลาดมาก คือยังไม่บอกว่าต้องใส่ Parameters อะไรต่างๆนาๆ แต่ก็ทำให้ผมเขียนเร็วขึ้นเยอะ แถมโหลดเร็วไม่เสียอารมณ์ด้วยครับ :) ไม่ต้องไปใช้ Ruby IDE ต่างๆที่โหลดนานเพียงต้องการแก้ไฟล์เพียงนิดๆหน่อยเท่านั้น

PHP เรียกใช้ Web Service ของ .NET ด้วยการส่งและรับ Object

จากเมื่อวานที่ผมได้รับมาตอนเย็น ให้ทำให้ PHP เรียก Web Service ของ .NET แล้วตามทฤษฎีนั้นเรียกได้อยู่แล้ว แต่คราวนี้ผมต้องมาลงมือจริงๆทำจริง โดยผมได้ลองทำ Web Service ของ .NET ต้องขอบอกว่าง่ายมากๆใช้เวลาเพียงแปป เดียวเท่านั้น (อันนี้ขอข้ามนะ) เสร็จแล้วมาถึงวิธีเีรียก คราวนี้และปัญหาซึ่งบทความใน Internet ไม่มีอันไหนโดนตรงใจผมสักอัน ลองถามใน Twitter ก็มีแต่คุณ pittaya ตอบมาแล้วบอกให้เชื่อมต่อผ่าน JSON แต่.. ผมลืมบอกเขาไปว่ามันเป็น SOAP เพราะตาม requirement แล้วผมจำเป็นต้องใช้ SOAP ดังนั้นพี่เขาก็เลยบอกให้ลอง nusoap ครับแต่ทว่า… ผมกำลังคิดในใจ (ไม่ได้บอกพี่เขา) ว่า NuSOAP มันไม่เก่าไปแล้วหรอ มันมี Library ให้เรียกใช้ทำไมต้องไปใช้ NuSOAP ???

ดังนั้นเพื่อตอบสนอง Need ของตัวเองผมเลยพยายามค้นหาวิธีโดยไม่ใช้ NuSOAP แล้วผมก็ทำได้ครับ อันนี้ใช้ Library ที่ติดมาใน PHP เลยครับ โดยขั้นตอนแรกต้องไปเอา comment ของ php_soap.dll ออกจาก php.ini ก่อนครับโดยถ้าใครใช้ AppServ ก็จะอยู่ใน WINDOWS\php.ini แล้วก็เปลี่ยนจาก ;php_soap.dll เป็น php_soap.dll เอา ; ออกนั้นเอง เสร็จแล้วมาเริ่มกันเลยครับ

<s:element name=”sendObject”>
<s:complexType>
<s:sequence>
<s:element minOccurs=”0″ maxOccurs=”1″ name=”gc” type=”tns:GuestCounts”/>
</s:sequence>
</s:complexType>
</s:element>

Complex Type 1.0

<s:complexType name=”GuestCounts”>
<s:sequence>
<s:element minOccurs=”1″ maxOccurs=”1″ name=”AgeQualifyingCode” type=”s:int”/>
<s:element minOccurs=”1″ maxOccurs=”1″ name=”Count” type=”s:int”/>
</s:sequence>
</s:complexType>

Complex Type 1.1

อันนี้เป็น Complex Type นะครับคืออะไรลองศึกษากันเองครับ

$client = new SoapClient(”http://localhost/HotelService.asmx?WSDL”);
$wrapper->gc->Count = 10;
$wrapper->gc->AgeQualifyingCode = 50;
$params = new SoapParam($wrapper, “sendObject”);
var_dump($client->sendObject($params));

อันนี้คือส่วน Code ที่ใช้ครับ

code จริงๆก็ประมาณนี้เองครับ แต่อธิบายยากนะจะบอกให้ อิอิ โดยบรรทัดแรกนั้นเป็นการสร้าง SoapClient จาก WSDL ครับผมโดยอันนี้สังเกตุได้ว่าผมจะเติม ?WSDL ด้วยเพราะเจ้า WebService ของ .NET ปกติมันไม่้ได้ทำออกมาเป็น WSDL ซึ่งเราสามารถเล่นกับ WebService ก่อนได้ครับ เช่น มี Method ที่รับ Int แล้ว Return String เราก็สามารถลองใส่ Int เล่นๆได้ครับแล้วกดเพื่อดูผลลัพธ์ได้เลย


มาดูบรรทัดที่ 2 กับ 3 ครับ เราจะทำการสร้าง Array Structure ลอยๆขึ้นมาก่อนครับเพื่อให้ถูกต้องตาม Complex Type นั้นในที่นี้ผมเลยสร้างชื่อ $wrapper->gc ต้องเป็นชื่อ gc นะครับดูจาก Complex type 1.0 จะเห็นว่า name=”gc” อันนี้ต้องตั้งชื่อตามเขา ทุกๆ Variable (ส่วนคำว่า $wrapper เปลี่ยนได้) เลยเลยสรุปเป็น $wrapper->gc->Count ดูจาก Complex type 1.1 จะเห็นได้ว่า name=”Count” ซึ่งต้องเหมือนกันเปะๆ ทำเสร็จแล้วคราวนี้เราจะได้ Array Structure ที่ตรงกับ Complex Type แล้ว


ต่อมาดูบรรทัดที่ 4 ครับผมทำการสร้างตัวแปรชื่อ $params ให้เท่ากับ SoapParam($wrapper,”sendObject”); อันนี้และครับพระเอกของงานนี้ โดยเจ้า SoapParam เนี้ยมันจะทำการ Map ตัวแปร $wrapper กับ element name=”sendObject” ดูได้จาก Complex Type 1.0 นั้นหมายความว่าตอนนี้เราจะได้ $params ที่พร้อมจะส่งข้อมูลเป็น object แล้ว


บรรทัดที่ 5 ก็เป็นการเรียก WebService ในคำสั่งที่ว่า $client->sendObject($params) แบบนี้ส่วน var_dump คือการ dump ตัวแปรออกมาดูว่าข้างในมีอะไรบ้างซึ่งผลลัพธ์จะแล้วแต่คนทำ Business Logic ใน WebService นะครับโดยผมจะได้ดังนี้

object(stdClass)#3 (1) { ["sendObjectResult"]=> int(20) }


จริงๆแล้วผลลัพธ์ที่ผมได้ออกมาเป็น 20 นั้นสาเหตุคือ ผมให้มัน return 10+gc.Count แล้วผมใส่ gc.Count เป็น 10 เลยได้ออกมาเป็น 20 อย่างที่เห็นครับผม ส่วนถ้าใครต้องการข้อมูล 20 เลยนั้นต้องเรียกแบบนี้ครับ


echo $client->sendObject($params)->sendObjectResult // ผลลัพธ์ที่ได้คือ 20


อันนี้คือตามหลักของ SOAP นะครับก็คือจะมีทั้ง Request Response ก็ต้องยอมๆเขาไปครับ สังเกตุนะครับว่าไม่มีวงเล็บ เพราะมันเป็นการเรียกข้อมูล variable นะครับไม่ใช่เรียก method วันนี้ผมก็นำมา share ให้คนที่มีปัญหาเรื่องนี้ทำกันนะครับ ส่วนเรื่อง return เป็น object นั้นไม่ต้องทำอะไรเลยครับ มันก็จะ return มาเป็น เหมือน Array Structure นะครับเอาไปเรียกใช้ได้ตามสะดวกเลยครับพี่น้องครับ วันนี้ผมลาไปก่อนแล้วนะครับ สวัสดีครับ

คอมมานต์ Ubiquity ตัวแรกของผม Abbreviation หาตัวย่อได้ดังใจ

UbiquityAbbreviation เอาละัครับวันนี้ผมก็ได้ทำ command เล็กๆตัวหนึ่งเสร็จยังไม่ค่อยดีเท่าไรแต่ก็พอใช้ได้น่า โดยเจ้า Abbreviation ที่ทำมาเนี้ยก็ไปเอาคำพวกนี้มาจาก abbreviations.com แล้วผมก็เลยพัฒนาตัวขำๆมา 1 ตัวซึ่งจะไปโหลดแต่คำย่อ ออกมาแล้วนำมาแสดงผลตอนนี้ยังเป็นรุ่นแรกอยู่ เลยไม่มีอะไรมากตอนนี้ก็แค่ เอามาแค่หน้าแรก (ไม่เกิน 11 results ต่อหน้า) โดยอย่างเช่น พิมพ์ abbreviation brb ก็จะหาว่าคำว่า brb มีตัวย่อไหม ซึ่งก็จะออกมาแบบนี้

Be Right Back
Be Right Back
Benefits Review Board

ประมาณนี้เป็นต้น ซึ่งยังไม่สมบูรณ์ แต่ก็ใช้ได้แล้วนะ โดยวิธีใช้ก็ง่ายๆครับพิมพ์

abbreviation คำย่อ

เอาละครับสำหรับใครที่อยากลองนะครับ ก็ลองเล่นได้เลยครับ ที่นี้ เอาน่าครับเริ่มต้นให้คนไทยทำกันครับ ผมเริ่มแล้วนะแล้วคุณละ ??

ปัญหาของ Ruby ! สำหรับชาว Java

หลังจากที่ศึกษา เป็นเวลาพอสมควรกับ Ruby (ยังไม่ยับ Rails) ก็ได้เห็นปัญหาอย่างหนึ่งในการศึกษา Ruby ก็คือการเขียนที่พลิกแพลงได้ตลอด ไม่ว่าจะเปลี่ยน ชื่อ method ด้วย alias หรือจะเขียนแบบมี () หรือไม่มีก็ได้ การใช้ do end แืทน { } แล้วอื่นๆอีกมากมาย จะว่ามันเป็นข้อดีของ Ruby ก็ได้ แต่สำหรับชาว Java (แบบที่เขียนมานานพอสมควร) จะมีอคติเล็กน้อยในตอนแรก ผมก็เป็นเวลาดูโปรแกรมคนอื่น แล้วบางครั้งก็ยัง งง อยู่ว่ามันมาได้ยังไง ?

ถึงตอนนี้จะแกะ Code ได้บางแล้ว แต่ส่วนสำคัญที่มันเป็นปัญหาของคนชอบ Java คือรูปแบบที่ไม่ตายตัว แต่ถ้าเราสนใจ Ruby นั้นคือสัญญาณที่เรากำลังจะบอกได้ว่า Java มันมีข้อเสียอยู่ วันนี้ผมจะลองมาเปรียบเทียบ ระหว่าง Java กับ Ruby โดยผมศึกษามาพอสมควร คงจะบอกความแตกต่างเบื้องต้นได้ แต่ลึกต้องไปศึกษากันอีกที มาว่ากันที่ข้อเสียก่อนละกัน

  • Ruby มีการทำงานแบบ Duck Typing ได้คือการไม่สนใจ Parameter ที่ส่งมาว่าจะเป็น Class อะไรก็ตาม
  • มีวิธีเขียนที่มากมาย จนงงได้ สำหรับมือใหม่แล้วคนที่ยังชินกับการเขียนแบบ Java
  • การมีหลาย method ที่ให้ผลเหมือนกันอยู่ใน Class เดียวกันทำให้งง ในตอนแรก
  • การที่จะมีคำสั่ง return หรือไม่มีก็ได้ใน method ทำให้ งงสุด สำหรับชาว Java อย่างผมคนหนึ่ง
  • การเีขียนแบบ Shorthand บางอย่างนั้นทำให้เรา ไม่รู้ความหมายการทำงานเลย เช่น p “555″ สั้นสุดๆ แต่กลับมาอ่านบางครั้งก็งง สำหรับผู้เริ่มต้น
  • ไม่มี  Overloading อีกต่อไป !! (แต่มีวิธีทำให้เหมือนแต่ผมว่ามันยุ่งยากกว่าของ Java เยอะ)
  • ยังไม่มี IDE เจ๋งๆที่สามารถรองรับทุกเรื่องของ Ruby ได้
  • มีอะไรที่สามารถตัดออกได้เยอะ เพราะมีวิธีอื่นทดแทนได้มาก
  • เป็นภาษาที่ตอนนี้ Performance ไม่สูงทั้งเรื่อง Server และตัวภาษามันเอง

ถัดมามาพูดข้อดีของ Ruby สงสัยยาวเหยียดเลยครับผม แต่อย่างว่าของพวกนี้มันแล้วแ่ต่คนชอบด้วยนะ งั้นขอพูดในมุมมองของผมละกัน

  • การมี alias ทำให้ผมจะใช้ function เดิมๆกับภาษาที่ผมถนัดได้ เช่น จะใช้คำว่า println แทนคำว่า puts ก็ได้
  • การมี default value ของ method ทำให้ผมสามารถเขียน function ได้สะดวกขึ้น
  • การที่ทำให้เราเลือกเขียนรูปแบบของภาษาที่เราถนัดได้เอง เช่นผมชอบเขียนแบบ Understand & Readable หรือแนวที่อ่านและเข้าใจง่าย
  • เราสามารถทำเป็น module แล้วเสริมเข้าไปใน class ได้ง่ายๆ เพราะมีการรองรับเรื่องนี้ไว้อยู่แล้ว
  • สนับสนุนการทำ AOP โดยไม่ต้องใช้ Framework กันเลยทีเดียว
  • เป็นภาษาที่ทุกอย่างเป็น Object จริงๆ ไม่มี Primitive (แต่จริงๆ Java ก็ใช้ทุกอย่างเป็น Object ก็ได้แต่เขียนได้ไม่สวยแบบ Ruby เช่น 10.times do |x| puts x end)
  • เขียนน้อยได้เยอะ ! เป็นภาษาที่ Productivity สูงโดยธรรมชาติ
  • เป็น OOP ที่สมบูรณ์แบบเหมือน Java ทำได้ทุกเรื่อง !! ไม่ว่าจะเป็น Encapsulation , Inheritance , Polymorphism ฯลฯ
  • ติดต่อ Database ได้ง่ายแสนง่าย ส่วนใหญ่จะไม่เกิน 1 บรรทัดทั้งนั้นไม่ว่า MySQL , SQLite , PostreSQL
  • Symbol มีลักษณะคล้าย String แต่เป็น String ที่ไม่ธรรมดาในหลายกรณี
  • เป็นภาษาที่ไม่ต้อง Compile เหมือน Java Code Test ๆได้ทันที (ถ้าเครื่องช้าเจอการ Compile นานแล้วซึ้งครับ)
  • สามารถทำแบบนี้ได้ x,y,z = 10,11,12 ชอบโคตร หรือจะ Swap ก็ง่าย x,y = y,x Java หมดสิทธิ์ ! ทำง่ายๆแบบนี้

จะเห็นได้ว่าข้อเสียของมัน ในอนาคตถ้าทำเรื่อง IDE ดีๆออกมา รวมกับ server ที่ช่วยเรื่อง Performance ให้มันดีขึ้นละก็ ผมว่าอนาคตสดใส เพราะตอนนี้ผมชอบเรื่อง Simplicity และ Productivity ของภาษานี้อย่างมาก ยิ่งถ้าบวกกับการเขียนอย่างมี Style ที่ดีแล้ว มันคงเป็นภาษาหนึ่งที่เขียน ได้โดยมี Comment เพียงน้อยนิดได้เลย ทีเดียว !  ถ้าผมไม่ลองเล่น Ruby ผมคงเลือก Python ไปแล้ว แต่พอลองเล่นแล้วกลับชอบ Ruby มากกว่า แต่มันคงต้องใช้ Effort ในการนิยามเริ่มต้นก่อนเขียน Program นิดหนึ่ง ถึงจะดึงประสิทธิภาพที่แท้จริงของมันออกมา เล่นได้เต็มที่

จริงๆผมว่าทั้งสองภาษาเป็นภาษาที่สุดยอด ทั้งสองอันแต่ในมุมมองของผม Ruby มันเจ๋งกว่าเรื่องเขียนน้อยได้เยอะ แต่ก็ต้องเป็นคนเขีัยนโปรแกรมได้ดี ก่อนถึงควรจะมาจับภาษานี้ เพราะตัวมันเอง Flexible มากๆแล้วความ Flexible ของมันจะเป็นดาบสองคม สำหรับโปรแกรมเมอร์มือใหม่ แต่เป็นพยัคติดปีกให้โปรแกรมเมอร์มือเก่าๆ !!

ทำความสะอาด Tag Html ด้วย jQuery

ผมขอแปลมาจาก CodingInstinct เลยละกันครับ ผมว่าเป็นเทคนิคที่เข้าใจง่ายแล้วสุดยอดเหมาะสมกับคนชอบเห็น code แบบ clean สุดๆต้องไม่พลาดเจ้าตัวนี้เลยละครับ

กล่องใส่ข้อความสวยๆ

จะเห็นได้การที่เราจะทำกล่องข้อความสวยๆแบบนี้ เราคงต้องไปเจอกับ Code สุดไม่ Clean ประเภทนี้รึเปล่า ?

<div class="shadebox-wrapper">
  <div class="shadebox-wrapper2">
    <div class="shadebox-wrapper3">
      <div class="shadebox">
        <div class="shadebox-header">
          <b class="shadebox-tlc"></b>
          <b class="shadebox-trc"></b>
        </div>            

        <h2>Hello</h2>

        <div class="shadebox-inner">
          Lorem uipsad asd asd asd as
          asdassdasd asd asd
          dasdaasd  asd asd
          asdasdsd dsd
        </div>

        <div class="shadebox-footer">
          <b class="shadebox-blc"></b>
          <b class="shadebox-brc"></b>
        </div>
      </div>
    </div>
  </div>
</div>

โดยเจ้าของบทความว่าเขาอาจจะใช้ JQuery Corner เพื่อกำจัด Code ยุ่งยากเช่นนี้ออกไปได้ แต่มันไม่มีเงาในแบบที่เขาต้องการ (นั้นเป็นเหตุผลที่เขาทำกล่องแบบนี้ขึ้นมาเอง) แต่เขาหวังว่า Code ของเขาจะเหลืออย่างมากเพียงแค่นี้

<div class="shadebox">
  <h2>Hello</h2>            

  <div class="shadebox-inner">
    Lorem uipsad asd asd asd as
    asdassdasd asd asd
    dasdaasd  asd asd
    asdasdsd dsd
  </div>
</div>

เสร็จแล้วเขาก็สามารถทำได้ด้วยคำสั่ง Wrap , prepend , append ของ jQuery ด้วย code ดังนี้เลย

<script type="text/javascript">

  $(document).ready(function() {
    $('.shadebox').wrap(
      "<div class='shadebox-wrapper'>" +
      "<div class='shadebox-wrapper2'>" +
      "<div class='shadebox-wrapper3'>" +
      "</div></div></div>");

    $('.shadebox').prepend("<div class='shadebox-header'><b class='shadebox-tlc'></b><b class='shadebox-trc'></b></div>");
    $('.shadebox').append("<div class='shadebox-footer'><b class='shadebox-blc'></b><b class='shadebox-brc'></b></div>");
  });              

</script>

โดยเขายังฝากบอกมันไม่มีวิธีแก้ไขปัญหาที่เหมาะสมที่สุดสำหรับเรื่องนี้แต่ประเด็นของเขาคือเขาอยากทำให้ Code ของเขาอ่านง่ายและ maintanance ง่ายที่สุด ผมจะขออธิบาย Code อย่างสั้นๆได้ใจความนะครับโดย wrap จะทำการหุ้ม

<div class=”shadebox”> ก่่อนเสร็จแล้วก็เติม code ในส่วนหัวและท้าย (สังเกตุจากตอนต้นมาเป็น code ที่ปรับแล้วจะมีในส่วน wrapper แล้วก็ส่วน Header หลัง <div class=”shadebox”> แล้วค่อยตามด้วยค่าต่างๆแล้วปิดท้ายด้วย Footer แบบที่เขาต้องการ prepend เพื่อทำการแทรก header append ทำการแทรก footer ทำให้ code เขา clean สุดๆ ก็ฝากวิธีนี้เพื่อใครกำลังต้องการ Clean HTML jQuery ทำให้มันเป็นเรื่องง่ายมากเลยทีเดียว ;)

Next Page »