ติดตั้ง docker 17.06.0 CE บน Ubuntu

ล่าสุด วิธีการติดตั้ง Docker รุ่น 17.06.0 CE ซึ่งรองรับ docker-compose version 3.3 ให้ติดตั้งด้วยวิธีนี้ sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable” sudo apt update sudo apt-get install apt-transport-https ca-certificates curl software-properties-common curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add – sudo apt-get update sudo apt-get install docker-ce

Read More »

การปรับเปลี่ยนรูปแบบการแสดงผลเส้นทางระหว่างพิกัดจุดบนแผนที่ Google Map APIs ด้วย DirectionsTravelMode

          ก่อนที่เราจะไปเริ่มเนื้อหาของบทความี้ ผู้เขียนต้องขอท้าวความเดิมตอนที่แล้วของบทความก่อน ซึ่งผู้เขียนได้พูดถึงวิธีการแสดงผลเส้นทางทางระหว่างพิกัดจุดบนแผนที่ Google Map APIs ด้วย DirectionsService ในเบื้องต้นไว้ (สามารถศึกษาเพิ่มเติมได้จากบทความ : การแสดงเส้นทางระหว่างพิกัดจุดบนแผนที่ Google Map APIs ด้วย DirectionsService ในเบื้องต้น )  สำหรับในบทความนี้ผู้เขียนจึงอยากต่อยอดการทำงาน และเพิ่มลูกเล่นให้กับการแสดงผลแผนที่ด้วยการปรับเปลี่ยนการกำหนดรูปแบบการแสดงผลของเส้นทางให้ผู้เยี่ยมชมเว็บไซต์  ซึ่งเราจะให้ผู้ใช้สามารถเลือกรูปแบบในการแสดงผลได้ว่า ต้องการดูเส้นทางในรูปแบบใดตามรูปแบบ Mode ที่ผู้ใช้เลือกมา เช่น เส้นทางเดิน ทางถนน หรือขนส่งสาธารณะ เป็นต้น โดยวิธีการดังกล่าวนี้เหมาะกับเว็บไซต์ที่มีความเกี่ยวข้องกับความต้องการที่ต้องการทราบเส้นทางในแต่ละรูปแบบ เพื่อเป็นประโยชน์ในการนำไปประยุกต์ใช้กับงานของแต่ละท่านได้ค่ะ    ตัวอย่างผลลัพธ์ที่ได้จากบทความที่แล้ว  ซึ่งจากตัวอย่างโค้ดในบทความที่แล้ว การกำหนด DirectionsTravelMode เป็น DRIVIING ซึ่งในความเป็นจริงแล้วยังมีรูปแบบอื่นๆให้เลือกใช้ด้วยกันทั้งหมด 4 รูปแบบ ดังนี้ DRIVING (Default):เป็นโหมดตั้งต้นให้หากไม่ได้มีการกำหนดไว้ ซึ่งเป็นโหมดที่แสดงเส้นทางการขับขี่ด้วยยานพาหนะ BICYCLING: เป็นโหมดสำหรับเส้นทางที่เตรียมไว้สำหรับผู้ขับขี่จักรยาน TRANSIT: เป็นโหมดสำหรับแสดงเส้นทางระบบขนส่งสาธารณะ เช่น  รถบัส รถไฟ หรือแม้แต่เครื่องบิน เป็นต้น WALKING: เป็นโหมดสำหรับแสดงเส้นทางการเดินถนน           ซึ่งผู้เขียนจะขอยกตัวอย่างในส่วนของการเลือกรูปแบบเส้นทางและผลลัพธ์ของแต่ละรูปแบบ ดังตัวอย่างโค้ดต่อไปนี้ การกำหนดรูปแบบของเส้นทางในการแสดงผลบนแผนที่ โค้ด Javascript  <script type=”text/javascript”> function initialize() { // ประกาศเรียกใช้งาน DirectionsService เพื่อการแสดงผลให้มีลักษณะเป็น Global window.directionsService = new google.maps.DirectionsService(); window.directionsDisplay = new google.maps.DirectionsRenderer(); var map; var bounds = new google.maps.LatLngBounds(); var mapOptions = { mapTypeId: ‘roadmap’ }; // แสดงผลแผนที่ในหน้าจอตาม Element ที่กำหนด map = new google.maps.Map(document.getElementById(“map_canvas”), mapOptions); map.setTilt(45); // กำหนดพิกัดจุดให้กับจุดเริ่มต้นและเส้นสุด window.markers = [ [‘Place1’, 51.501546, -0.142000], [‘Place2’, 51.512051,-0.091225] ]; // ให้แสดงผลสิ่งที่ตั้งค่าไว้ในพื้นที่แผนที่ที่กำหนด directionsDisplay.setMap(map); // กำหนดค่าเริ่มต้นของรูปแบบให้เป็นเส้นทางการเดิน (walking mode) calcRoute(); } // เป็นฟังก์ชั่นในการคำนวณเส้นทางระหว่างสองจุดพิกัดบนแผนที่และเลือกกำหนดค่า Mode ในการแสดงผล function calcRoute() { var selectedMode = document.getElementById(‘travelType’).value; var request = { origin: new google.maps.LatLng(markers[0][1], markers[0][2]), destination: new google.maps.LatLng(markers[1][1], markers[1][2]), //// //กำหนดรูปแบบการแสดงผลเส้นทางโดยเริ่มต้นให้เป็นเส้นทางการเดิน(ตามรายการแรกที่เลือก) travelMode: google.maps.TravelMode[selectedMode] }; directionsService.route(request, function(response, status) { if (status == google.maps.DirectionsStatus.OK) { directionsDisplay.setDirections(response); } }); } </script> ส่วนของการแสดงผลใน body <body>  <div id=”map_wrapper”> <div id=”map_canvas” class=”mapping”></div> </div> <div id=”travel_selector”> <p><strong>Mode of Travel: </strong> <select id=”travelType” onchange=”calcRoute();”> <option value=”WALKING”>Walking</option> <option value=”BICYCLING”>Bicycling</option> <option value=”DRIVING”>Driving</option> <option value=”TRANSIT”>Transit</option> </select></p> </div> </body> ผลลัพธ์ในแต่ละรูปแบบ แบบที่ 1 DRIVING Mode :   แบบที่ 2 BICYCLING Mode:

Read More »

การแสดงเส้นทางระหว่างพิกัดจุดบนแผนที่ Google Map APIs ด้วย DirectionsService ในเบื้องต้น

          หลังจากที่ก่อนหน้านี้ ผู้เขียนเคยได้มีโอกาสศึกษาบทความเกี่ยวกับความสามารถของ Google Map APIs มาบ้างแล้วนั้น ผู้เขียนเห็นว่าเรื่องเกี่ยวกับแผนที่นับเป็นอีกหัวข้อที่น่าสนใจในการพัฒนาเว็บไซต์ในปัจจุบัน โดยเฉพาะเว็บไซต์ที่มีส่วนเกี่ยวข้องกับสถานที่ และที่ตั้ง เพราะถือเป็นการเพิ่มลูกเล่นให้มีความตื่นตาตื่นใจยิ่งขึ้น โดยความสามารถของแผนที่ที่ใน Google Map APIs มีมาให้ใช้กันได้ในหลายรูปแบบ ขึ้นอยู่กับความต้องการของผู้พัฒนาแต่ละคน อาทิ การกำหนดพิกัดจุด การแสดงเส้นทาง การค้นหาละติจูด-ลองจิจูดจากการคลิกบนแผนที่ หรือจนกระทั่งการดึงพิกัดมาจากฐานข้อมูลเพื่อมาแสดงผล เป็นต้น โดยในความเป็นจริงแล้ว ลูกเล่นเกี่ยวกับการทำงานกับแผนที่ยังมีอีกมากมาย แต่ในบทความนี้ ผู้เขียนจะขอพูดถึงในส่วนของการแสดงเส้นทางระหว่างจุดสองจุดในแบบเบื้องต้นเพื่อทำความเข้าใจก่อนนำไปประยุกต์ใช้ ดังนี้ การแสดงเส้นทางโดยเบื้องต้นเมื่อทราบจุดพิกัดละติจูด-ลองจิจูดบนแผนที่ อ้างอิงไฟล์ที่ใช้ในการทำงานร่วมกับ Google Map APIs <script src=”https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places&language=en” async defer></script> ส่วนของ Javascript ที่ใช้ในการแสดงเส้นทางระหว่างพิกัด 2 จุดบนแผนที่ <script type=”text/javascript”> /////////การกำหนดค่าละติจูด-ลองจิจูดระหว่าง 2 ตำแหน่ง ในที่นี้คือ มหาวิทยาลัยสงขลานครินทร์ และสวนสาธารณะหาดใหญ่ var markers = [ { “title”: ‘มหาวิทยาลัยสงขลานครินทร์’, “lat”: ‘7.006941’, “lng”: ‘100.498412’, “description”: ‘<b>มหาวิทยาลัยสงขลานครินทร์:</b> (อังกฤษ: Prince of Songkla University; อักษรย่อ: ม.อ.) เป็นมหาวิทยาลัยแห่งแรกในภาคใต้ของประเทศไทย ตาม พระราชบัญญัติมหาวิทยาลัยสงขลานครินทร์ พ.ศ. ๒๕๑๑ ก่อตั้งในปี พ.ศ. 2510 ต่อมา พระบาทสมเด็จพระปรมินทรมหาภูมิพลอดุลยเดชได้พระราชทานชื่อเมื่อวันที่ 22 กันยายน พ.ศ. 2510 จึงถือว่าวันที่ 22 กันยายนของทุกปี เป็นวันสงขลานครินทร์’ } , { “title”: ‘สวนสาธารณะหาดใหญ่’, “lat”: ‘7.042899’, “lng”: ‘100.507664’, “description”: ‘<b>สวนสาธารณะเทศบาลนครหาดใหญ่:</b> เป็นแหล่งพักผ่อนหย่อนใจของคนเมืองแห่งนี้ มีทัศนียภาพที่สวยงาม เต็มไปด้วยด้วยแมกไม้เขียวขจี มีอ่างเก็บน้ำขนาดใหญ่ สัตว์น้ำนานาชนิดมากมาย สมบูรณ์ด้วยธรรมชาติอันบริสุทธิ์ ที่รอคอยต้อนรับนักท่องเที่ยวให้ได้สัมผัสกับความร่มรื่นของพรรณไม้นานาชนิด’ } ]; ///////เป็นการกำหนดค่าต่างๆตอนที่ฟอร์มมีการโหลด window.onload = function () { //////กำหนดค่ากึ่งกลางการแสดงผลแผนที่ ระยะใกล้ และชนิดการแสดงผลของแผนที่ var mapOptions = { center: new google.maps.LatLng(markers[0].lat, markers[0].lng), zoom: 10, mapTypeId: google.maps.MapTypeId.ROADMAP }; //////ประกาศ Element ที่จะใช้ในการแสดงผล var map = new google.maps.Map(document.getElementById(“dvMap”), mapOptions); var infoWindow = new google.maps.InfoWindow(); var lat_lng = new Array(); ///สร้างตัวแปรอาร์เรย์เพื่อเก็บค่าละติจูด-ลองจิจูด var latlngbounds = new google.maps.LatLngBounds(); /// วนพื่อเก็บค่าละติจูด-ลองจิจูดในตัวแปรอาร์เรย์ และเก็บค่าในการพิกัดจุดของแต่ละจุดที่มี for (i = 0; i < markers.length; i++) { var data = markers[i] var myLatlng = new google.maps.LatLng(data.lat, data.lng); lat_lng.push(myLatlng); var marker = new google.maps.Marker({ position: myLatlng, map: map, title: data.title }); latlngbounds.extend(marker.position); //////กำหนดเมื่อมีอีเวนต์คลิก ให้แสดงผลรายละเอียดที่กำหนดไว้ในตัวแปรของ marker ที่กำหนดไว้ในแต่ละตำแหน่ง (function (marker, data) { google.maps.event.addListener(marker, “click”, function

Read More »

Itextsharp #4 คู่มือเทคนิคพื้นฐานการใช้งาน PdfTable สำหรับมือใหม่ ตอนที่ 2

บทความนี้สำหรับผู้ที่ยังไม่ได้อ่านบทความก่อนหน้านี้ สามารถอ่านบทความได้ที่ Itextsharp #3 คู่มือเทคนิคพื้นฐานการใช้งาน PdfTable สำหรับมือใหม่ ตอนที่ 1 เพื่อความเข้าใจต่อเนื่องกันนะครับ โดยเนื้อหาในบทความนี้เป็นส่วนของใช้งาน Table ที่ผู้เขียนเองใช้ในการทำงานคือการทำ Nest Table นั้นเองโดยปกติการสร้างเอกสาร1ใบ ผู้เขียนจะใช้ Table ตัวแรกในการกำหนดรูปแบบหน้าตาของเอกสาร การจัดตำแหน่งสัดส่วนต่างๆ หลังจากนั้นก็ใช้ Table ซ้อนเข้าไปตามส่วนต่างๆตามที่ออกแบบไว้มาจัดการส่วนของข้อมูล จึงจำเป็นต้องใช้งาน Nest Table เราไปดูตัวอย่างรูปกันก่อนดีกว่าครับ จากตัวอย่างจะพบว่าสำหรับคนที่เขียนโปรแกรมก็คือการซ้อนตารางปกติที่พบเจอได้ในการเขียนโปแกรม จากรูปคือเอาTable2 ใส่ใน Cell ที่1ของ Table1 หรือพูดภาษาของเขียนโปรแกรมคือเขียน Table2 ลงใน <TD> แรกของ Table1 นั้นเอง ซึ่งถามว่าทำงานคล้ายๆกับตารางทั่วไปแล้วสามารถรวมCell ก่อนเพิ่มตารางได้ไหมใน ItextSharp ทำได้เหมือนกันครับ ตามรูปเลยครับ จากตัวอย่างเป็นการรวม Collumn แล้วทำการเพิ่ม Table2 เข้าไปโดยใน ItextSharp เรากำหนดCollumn ของTable1และTable2 เท่ากัน ตัวโปรแกรมจะจัดขนาดของ Cell ให้เท่ากันอัตโนมัติเมื่อทำการแสดงผลเหมือนในรูปตัวอย่างครับ ส่วนการเขียนโปแกรมนั้นง่ายมากๆเพิ่มขั้นตอนจากตอนที่1มานิดเดียว เราไปดู Code กันเลยดีกว่าครับ PdfPCell PdfCell = null; PdfPTable PdfTableH = new PdfPTable(3); float[] tbHwidths = { 50f, 50f, 50f }; PdfTableH.SetWidths(tbHwidths); PdfTableH.WidthPercentage = 100; PdfCell = new PdfPCell(new Phrase(new Chunk(“Table 2 Cell 1”, bold))); PdfCell.HorizontalAlignment = Element.ALIGN_CENTER; PdfCell.PaddingBottom = 8; PdfTableH.AddCell(PdfCell); PdfCell = new PdfPCell(new Phrase(new Chunk(“Table 2 Cell 2”, bold))); PdfCell.HorizontalAlignment = Element.ALIGN_CENTER; PdfCell.PaddingBottom = 8; PdfTableH.AddCell(PdfCell); PdfCell = new PdfPCell(new Phrase(new Chunk(“Table 2 Cell 3”, bold))); PdfCell.HorizontalAlignment = Element.ALIGN_CENTER; PdfCell.PaddingBottom = 8; PdfTableH.AddCell(PdfCell); PdfCell = new PdfPCell(new Phrase(new Chunk(“Table 2 Cell 4”, bold))); PdfCell.HorizontalAlignment = Element.ALIGN_CENTER; PdfCell.PaddingBottom = 8; PdfTableH.AddCell(PdfCell); PdfCell = new PdfPCell(new Phrase(new Chunk(“Table 2 Cell 5”, bold))); PdfCell.HorizontalAlignment = Element.ALIGN_CENTER; PdfCell.PaddingBottom = 8; PdfTableH.AddCell(PdfCell); PdfCell = new PdfPCell(new Phrase(new Chunk(“Table 2 Cell 6”, bold))); PdfCell.HorizontalAlignment = Element.ALIGN_CENTER; PdfCell.PaddingBottom = 8; PdfTableH.AddCell(PdfCell); //—————————————————————–// PdfPTable PdfTable = new PdfPTable(3); float[] tbwidths = { 50f, 50f, 50f }; PdfTable.SetWidths(tbwidths); PdfTable.WidthPercentage

Read More »