String Replace in Objective-C

เริ่มต้นด้วยการสร้างรายการตัวอักษรที่ไม่ต้องการ เนื่องจากทำงานกับ deviceToken เลยมีตัวอักษรที่ไม่ต้องการ 3 ตัว ได้แก่ “<", " ", ">” ก็สร้างชุดของตัวอักษรด้วย NSCharacterSet จะได้ว่า

NSCharacterSet *unwantedCharactersInDeviceToken = [NSCharacterSet characterSetWithCharactersInString:@"< >"];

ตอนนี้เราจะได้ชุดตัวอักษรที่ไม่ต้องการเรียบร้อยแล้ว (ตัวแปร unwantedCharactersInDeviceToken) ถัดไปคือการสร้าง NSArray จากข้อความที่เราสนใจ โดยใช้ชุดของตัวอักษรเป็นตัวแบ่ง จะได้ว่า

NSArray *filteredPharses = [[NSString stringWithFormat:@"%@", deviceToken] componentsSeparatedByCharactersInSet:unwantedCharactersInDeviceToken];

โดยที่ filteredPharses คือ ความความที่ถูกแบ่งออกเป็นช่วง ตามตำแหน่งที่พบตัวอักษรที่เราไม่ต้องการ

สุดท้าย คือการรวมเอาข้อความที่แบ่งไว้ด้วยตัวอักษรที่เราไม่ต้องการให้เป็น ข้อความ (NSString) ตามเดิม จะได้ว่า

NSString *finalJoinedMessage = [filteredPharses componentsJoinedByString:@""];

โค้ดสำเร็จรูปจะหน้าตาประมาณนี้

NSCharacterSet *unwantedCharactersInDeviceToken = [NSCharacterSet characterSetWithCharactersInString:@"< >"];
NSString *finalJoinedMessage = [[[NSString stringWithFormat:@"%@", deviceToken] componentsSeparatedByCharactersInSet:unwantedCharactersInDeviceToken] componentsJoinedByString:@""]];

ปล. เขียนไว้อ่านเองกันลืม

Google Maps V3 + HTML5

จากบล็อคก่อนหน้านี้ที่แนะนำการใช้งาน Google Maps V3 ให้ลองไปใช้ดูกันแล้วนั้น อย่างหนึ่งที่ไม่ชอบก็คือตำแหน่งเริ่มต้นนั้นมันตายตัวไปหน่อย คือกำหนดแล้วฝังเข้าไปในโค้ด JavaScript เลย แล้วถ้าเราต้องการทำเว็บแอพพลิเคชั่น (เพื่อให้มันสั้นลงต่อไปจะเรียก ‘แอพ’ หรือ ‘app’) ที่คำนึงถึงตำแหน่งผู้ใช้เป็นสำคัญ เช่น ตำแหน่งร้านอาหารที่น่าสนใจใกล้เคียงนั้นๆ หรือ ร้านค้าลดราคาใกล้ๆ เป็นต้น ดังนั้นอย่างแรกที่จำเป็นก็คือตำแหน่งที่เราอยู่ปัจจุบัน เพื่อนำมาข้อมูลที่เกี่ยวข้องมาแสดงผล

ซึ่งในตัวอย่างที่จะทำนี้เป็นการพัฒนาต่อจากบล็อคก่อนหน้านี้ดังนั้นก็ให้ดาวน์โหลดไฟล์ maps-demo.html.zip มาไว้ที่เครื่องก่อนเพื่อเตรียมตัวแก้ไข ซึ่งด้านในมีโค้ดด้านล่างนี้ (ดูตัวอย่างการแสดงผล)

<!DOCTYPE html>
<html>
  <head>
    <title>Google Maps V3 Demostrate</title>
    <script src="http://maps.googleapis.com/maps/api/js?sensor=true"></script>

    <script>
      function initWithMapStart() {
        var latlng = new google.maps.LatLng(13.75, 100.517);
        var mapOptions = {
                            zoom: 12,
                            center: latlng,
                            mapTypeId: google.maps.MapTypeId.ROADMAP
                        };
        var maps = new google.maps.Map(
                         document.getElementById('map-canvas'),
                         mapOptions
                   );

        var marker = new google.maps.Marker({
                            position: latlng,
                            map: maps,
                            animation: google.maps.Animation.DROP,
                            title: "Welcome to Thailand"
                        });

        var info = new google.maps.InfoWindow({
                            content: '<h1>Hello</h1>'
                        });
        google.maps.event.addListener(marker, 'click', function(){
            info.open(maps, marker);
        });
      }
    </script>

    <style>
      header,
      footer {
        text-align: center;
      }
      #map-canvas {
        display: block;
        margin: 20px auto;
        height: 400px;
        width: 640px;
        background-color: #ccc;
      }
    </style>
  </head>
  <body onload="initWithMapStart()">
    <header>
      <h1>Google Maps Demo</h1>
    <header>
    <article>
      <div id="map-canvas"></div>
    </article>
    <footer>
      <small><a href="http://we.in.th/">we.in.th</a></small>
    </footer>
  </body>
</html>

fig.1: โค้ดเดิมสำหรับแสดงผลแผนที่

จากที่บอกในข้างต้นว่าจะพัฒนาต่อจากของเดิมที่มีอยู่แล้ว โดยสิ่งที่เพิ่มขึ้นมากก็คือคุณสมบัติที่เรียกว่า Geolocation ซึ่งอยู่ใน HTML5 ทำสามารถดึงข้อมูลตำแหน่ง เช่น พิกัด (Latitude, Longitude) หรือ ที่อยู่ปัจจุบัน ของผู้ใช้ขณะนั้นมาแสดง แต่ก่อนที่จะแสดงนั้นเบราเซอร์จะขออนุญาตจากผู้ใช้ก่อนเสมอ หากไม่ต้องการให้เว็บไซต์นำตำแหน่งไปใช้งานก็ปฏิเสธได้ ใช้งานได้กับ IE9+, Firefox 3.5+, Safari5+ และ Google Chrome 4+ โดยที่ ดังนั้นให้เพิ่มโค้ดด้านล่างถัดจากบรรทัดที่ 32 ลงไป ดังนี้

if ( (typeof( window.navigator) != 'undefined') && !!navigator.geolocation ) {
    navigator.geolocation.getCurrentPosition(
        function(position) {
            panToCurrentLocation(position, maps, marker);
        },
        errorOccur
    );
}

fig.2: โค้ดสำหรับพิกัดที่ได้จากเบราเซอร์มาแสดงผล

Google Maps with Location Acquisition Notificationโดยที่

  • บรรทัดที่ 1 คือ การตรวจสอบว่าเบราเซอร์นี้รองรับ Geolocation หรือไม่
  • บรรทัดที่ 2-7 คือ การเรียกใช้งาน Geolocation ผ่านตัวแปร navigator ซึ่งก่อนจะดึงข้อมูลตำแหน่งของผู้ใช้เบราเซอร์จะขออนุญาตผู้ใช้ก่อนเสมอ เมื่อได้รับอนุญาตและได้ตำแหน่งผู้ใช้เรียบร้อยแล้วจะส่งไปยัง function(position) (บรรทัดที่ 3-5) โดยจะส่งไปให้ฟังก์ชั่น panToCurrentLocation ต่อไปพร้อมกับตัวแปร position, maps และ marker แต่ถ้าไม่สามารถอ่านพิกัดได้จะไปทำที่ฟังก์ชั่น errorOccur แทน

ถัดไปคือการสร้างฟังก์ชัน panToCurrentLocation และ errorOccur ขึ้นใหม่ ตามที่ได้ระบุไว้ใน fig.2 ดังนี้

function panToCurrentLocation(position, maps, marker) {
  var latlng = new google.maps.LatLng(position.coords.latitude, position.coords.longitude);
  maps.setCenter( latlng );
  maps.panTo( latlng );

  marker.setPosition( latlng );
  marker.setAnimation( google.maps.Animation.DROP );
}

function errorOccur( error ) {
  console.log( error );
}

fig.3: JavaScript สำหรับเปลี่ยนตำแหน่งในแผนที่

โดยที่

  • บรรทัดที่ 2: สร้างพิกัดจากแผนที่ใหม่
  • บรรทัดที่ 3: กำหนดจุดศูนย์กลางให้แผ่นที่ใหม่
  • บรรทัดที่ 4: เลื่อนตำแหน่งของแผนที่ไปยังตำแหน่งใหม่ที่ได้
  • บรรทัดที่ 6: เปลี่ยนตำแหน่งของ marker ให้แสดงที่ตำแหน่งปัจจุบัน
  • บรรทัดที่ 7: กำหนดแอนนิเมชั่นที่จะใช้แสดงผล marker

จากที่ทดลองใช้งานการค้นหาตำแหน่งนั้นอาจคลาดเคลื่อนได้ไม่ถูกต้องทุกครั้ง ดูตัวอย่างได้ที่ไฟล์ maps-demo-navigation หรือดาวน์โหลดไฟล์ maps-demo-navigation.html

ข้อมูลเพิ่มเติม:

Google Maps V3 Introduction

ก่อนหน้านี้เคยเขียนวิธีการนำเอา Google Maps มาใช้งานกับเว็บไซต์ด้วยกัน 2 ตอน (1, 2) ตอนที่เขียนไปนั้น Google Maps เวอร์ชั่น 2.x ปัจจุบันอยู่ในสถานะ deprecated หรืออยู่ระหว่างการเลิกใช้งานนั้นเอง โดยตอนนี้ Google Maps เองก็พยายามเข็ญให้นักพัฒนาขยับไปใช้ Google Maps เวอร์ชั่นปัจจุบันคือเวอร์ชั่น 3 หรือเรียกสั้นๆ ว่า V3 ซึ่งการเรียกใช้งานนั้นง่ายกว่าเวอร์ชั่นเก่ามาก อย่างแรกที่เห็นได้ชัดคือเราไม่จำเป็นต้องสมัครเพื่อขอ API Key สำหรับใช้ดาวน์โหลด Google Maps Library อีกต่อไปแล้ว และการกำหนดค่าทั้งหมดใช้การกำหนดค่าผ่าน Object ที่เข้าใจได้ง่ายกว่าเวอร์ชั่นเก่ามาก
Continue reading

The Way To Lion

ไม่ได้เขียน blog มานานแล้วเหมือนกันแฮะ รู้สึกได้อย่างหนึ่งเลยว่า Social Network ดึงเอา content ที่อยู่ในหตัวแล้วอยากเขียนลง blog ออกไปเยอะทีเดียว

เมื่อวานก่อน (20 ก.ค.) นั่งหลังคดหลังแข็งดาวน์โหลด Lion มาใช้ ($29  ผ่าน Mac App Store) 3.7GB อ้วกเป็นเลือดกันเลยทีเดียว ตอนแรกยังไม่แน่ใจว่าจะลงแบบไหนดี สุดท้ายก็ตัดสินใจได้ว่าเอาแบบ Clean Install ไปเลยแล้วกัน
Continue reading

FindBy{table field}($q)

เมื่อก่อนใช้ Doctrine สำหรับคุยกับฐานข้อมูลข้างหลัง ใช้สะดวกดี แต่มีอยู่ฟังก์ชั่นที่สงสัยว่ามันทำยังไง คือ $doctrineObj->findBy{Table Field}('something') แต่ช่วงนั้นก็ได้แต่สงสัยว่ามันทำยังไง วันนี้เลยลองไปนั่งหาวิธีเล่นๆ ก็พบว่ามันใช้ PHP Magic Method อยู่ด้านหลัง (แอบนึกว่ามันถึกสร้าง method มาให้หมด) ที่ชอบคือมันดูเป็นภาษามนุษย์มากขึ้น อ่าน method แล้วเข้าใจทันที

คราวนี้ต้องมาเขียนอะไรเล่นกับ WordPress เลยลองเอาใช้ดูบ้าง อาจจะได้เอาไว้ใช้งานต่อๆ ไปด้วย :P ขั้นแรกก็สร้างคลาสพื้นฐานกันก่อน
Continue reading

PHP Magic Method __call

<?php
class Foo {
    public function __construct() {}

    public function __call($method, $args = null) {
        $msg = "You're asking me for method";
        return ($args == null) ? "$msg '$method'" : "$msg $mothod with arguments $args";
    }
}

$foo = new Foo();
echo $foo->hello(); // You're asking me for method 'hello';
echo $foo->hi('sitdh'); // You're asking me for method 'hi' with arguments 'sitdh'

Spica EP: I

ช่วงนี้เกิดอาการกระแดะเบื่อ Nokia 5800 ซะงั้น เพราะนิ้วใหญ่ จอเล็กเลยจิ้มลำบากมั้ง ตอนนี้เลยซื้อ Spica มาแล้ว อยากเอามาเขียนโปรแกรมเต็มแก่ แต่ไม่รู้ว่าจะมีความอยากได้นานเท่าไหร่

แต่เรื่องแรกที่เซ็งคือเครื่องที่ได้มาลำโพงดันแหลมพร่าซะงั้น (ออกแนวลำโพงแตก) ตอนนี้อัพเป็น 2.1 แล้วซะด้วย เหลือแค่ดาวน์เกรดเป็น 1.5 เหมือนเดิม แล้วค่อยเอาไปทะเลาะกับศูนย์ซัมซุงให้ช่างออกใบรับรองให้ก่อนว่าลำโพงมันเจ๊งจริงๆ เราไม่ได้อุบอิ๊บคิดไปเองว่ามันเสียงแตก จากนั้นค่อยเอาไปเปลี่ยนที่ร้านเพราะโชคดีที่ว่ามันยังอยู่ในระยะเวลาประกัน 7 วัน (เป็นขึ้นตอนมาตรฐานที่ call center ของ samsung บอกมาอีกที) วันศุกร์คงได้เอาไปเปลี่ยน

ถ้าเปลี่ยนไม่ได้คงเห็นข่าวร้าน J-Mart ที่ฟิวเจอร์รังสิตไฟไหม้แน่นอน