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

สร้าง XML Binding Class ด้วย JAXB

สไลด์ยังอุ่นๆ อยู่เลยเพราะพึ่งออกจากเตาใหม่ๆ สไลด์นี้ว่าด้วยการสร้าง XML Binding Class ด้วย JAXB ใน Java เป็นตัวอย่างและสรุปสั้นๆ ให้พี่ที่ทำงานฟัง ถ้าต้องการรายละเอียดถามได้ครับ

Google Maps :: แสดงผลข้อมูลการจราจรได้แล้ว

ข้อมูลการจราจรจาก อนุเสาวรีย์ชัยสมรภูมิ ไปยัง มหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์

ข้อมูลการจราจรจาก อนุเสาวรีย์ชัยสมรภูมิ ไปยัง มหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์

เป็นเรื่องดีไม่น้อยเลยครับ [สำหรับคนหลงทางบ่อยๆ แบบผม] เมื่อ Google Maps สามารถแสดงข้อมูลการจราจรของไทยได้แล้วไม่เพียงแค่เส้นทางการเดินทางนะครับ แต่เป็นข้อมูลการขนส่งด้วย เช่น จะขึ้นรถเมล์สายอะไร จากตรงไหน ใช้เวลาเท่าไหร่ และเวลาโดยประมาณที่จะถึงจุดหมายปลายทาง จากตัวอย่างด้านบน[คลิ๊กที่รูปภาพเพื่อดูของจริง] เป็นตัวอย่างที่ผมลองหาเส้นทางจาก จากอนุเสาวรีย์ชัยสมรภูมิ ไปยังมหาวิทยาลัยธรรมศาสตร์ ท่าพระจันทร์ ก็ได้ผลอย่างที่เห็นครับ นอกจากการเดินทางด้วยรถแล้ว ถ้าสังเกตุดีๆ จะเห็นข้อมูลเส้นทางเรือในแม่น้ำเจ้าพระยาด้วย

จากที่ลองค้นดูอีเมล์ที่ Google แจ้งการปรับปรุงให้ทราบเรื่อยๆ [แต่ไม่ได้สนใจ] ก็พบว่าข้อมูลการจราจร[GTrafficOverlay] เพิ่มเข้ามาตั้งแต่เวอร์ชั่น 2.81 ครับ [ปัจจุบันเวอร์ชั่น 2.170 อัพเดตวันที่ 6 สิงหาคม 2552]

Google Maps: http://maps.google.co.th
Issue Tracker: http://code.google.com/p/gmaps-api-issues/wiki/JavascriptMapsAPIChangelog

Introduce to Google Maps :: ยังไม่ได้หาย

ช่วงนี้ไม่ได้เขียนเกี่ยวกับ Google Maps นานครับ ก็ด้วยเหตุสำคัญๆ อยู่ 2 เรื่อง

  • อย่างแรกก็คือ Google Maps API Version 3 (V3) กำลังจะออกมาเป็นเวอร์ชั่นสมบูรณ์แล้ว [ขณะนี้อยู่ในช่วง beta] ซึ่งจะเปลี่ยนวิธีการเขียน script เยอะทีเดียว แต่เปลี่ยนไปในทางดีขึ้น และอีกอย่างิธีการพัฒนาในเวอร์ชั่นปัจจุบัน (V2) นั้นยังหาได้ตามเว็บไซต์ทั่วไปครับ เลยขอข้ามไปเขียน V3 เลยดีกว่า
  • ตอนนี้งานค่อนข้างยุ่งนิดหน่อย เรียกว่าหัวไม่ได้ว่างหางไม่ได้เว้นกันเลยทีเดียว ที่เขียนดองๆ ไว้ก็มีบ้าง แต่ยังไม่ถูกใจเท่าไหร่นัก เลยคิดว่าปล่อยออกมาตอน V3 ออกอย่างเป็นทางการจะดีกว่าครับ

แต่เรื่องที่อาจจะนำมาเขียนในตอนถัดๆ ไปก็น่าจะเป็น Objective-C ครับ เพราะร่ำๆ ไว้ตั้งแต่ blog เก่า จนกระทั่งยังมา blog นี้ก็ยังไม่ได้เขียนอะไรเท่าไหร่ เพราะว่าตอนนี้เปลี่ยนเครื่องคอมพิวเตอร์ที่ใช้ และไม่ได้ใช้ Windows นานจนจะลืมเมนูหมดแล้วครับ ไหนๆ ก็ใช้เครื่องนี้แล้วก็อยากลองเขียน App เล่นๆ สักตัวจะได้เป็นการลองวิชาไปในตัวด้วย ครับ :D

Introduce to Google Maps :: เตรียมพร้อมก่อนลุย

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

หลังจากเราสมัครของ key เพื่อใช้ดึงข้อมูลจาก Google Maps เลื่อนลงมาด้านล่างจะเห็นตัวอย่างการดึงโค้ดไปใช้งาน ทั้ง JavaScript, Flash และ HTTP Services

<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;sensor=true_or_false&amp;key=ABCDEF" type="text/javascript"></script>

วิธีเรียกใช้งานแบบ JavaScript โดยที่ ABCDEF คือ key ที่กูเกิ้ลให้มา

ถ้าลองเปรียบเทียบตัวอย่างด้านบน และตัวอย่างจาก blog ตอนที่แล้ว จะเห็นได้ว่าโค้ดที่กูเกิ้ลให้มา มี parameters ตัวหนึ่งที่ผมได้ตัดออกไป นั่นคือ sensor ที่จะเป็นพารามิเตอร์ที่บอกให้กูเกิ้ลตรวจสอบว่าเครื่อง Client ที่เรียกเข้ามามี อุปกรณ์ GPS ด้วยหรือไม่ ค่าที่เป็นไปได้คือ true และ false (เป็นค่า default) Continue reading