Thailand Mobile Expo 2014 (รอบ 2)

วันนี้ไปงาน Thailand Mobile Expo 2014 (รอบที่ 2 ของปีมั้ง) มาเพราะตั้งใจจะไปสอย tablet ใหม่เพราะดูโปรโมชั่นของ 3 ค่ายที่ MacThai รวบรวมมาแล้วน่าสนใจครับ


เปิดด้วย Pretty

Asus Zenfone 4 น่าจะฮ๊อตถึงขั้นร้านขายฟิล์มกันรอยต้องประกาศว่ามีฟิล์มของรุ่นนี้

เดินเข้าไปถามราคาบู๊ททรูก่อนครับ คนเยอะมากๆ พอถามก็เดินไป AIS ถามดูก็ปรากฏว่ามันถูกกว่า True แต่จำไม่ได้ว่าเท่าไหร่เลยเดินย้อนกลับไปถาม True อีกที พอถามจนแน่ใจว่า AIS ถูกกว่าเยอะอยู่กลับไป AIS ปุ๊บของดันหมดพอดี -*-” (หอก ไม่ถึง 15 นาที) เดินไปถาม DTAC ก็มีของนะ โปรถูกกว่า True เพราะมี package ขั้นต่ำแค่ 3 เดือนให้เลือกแต่คิดไปคิดมาพอหมดสามเดือนไปใส่ sim ใหม่ก็แพงกว่า AIS อยู่ดี แถมยังต้องรอคิวอีก 100 กว่าคิวด้วย (ผมได้คิว 280 ตอนนั้นเพิ่งคิว 195 มั้ง)


Zenfone 4

ที่สะท้อนใจเล็กๆ คือเดินผ่านบู๊ท Nokia แต่ MC เรียกตัวเองว่า Microsoft แล้ว ;__; เสียใจ


Nokia XL เปิดตัวในไทยงานนี้เช่นกัน


molome ตุ๊กตาน่ารักมากกกก อยากได้

ปีนี้ที่น่าสนใจคือมีแข่ง CookieRun ของ Line ครับ ผมไปยืนดูอยู่แป๊บๆ แล้วก็ออกมาถ่ายรูปหมีดีกว่า

แวะไปดูคอนเสิร์ตว่านที่ Oppo มีพนักงานบู๊ทอื่นๆ ชูป้ายไฟเชียร์เพียบเลยย

สุดท้ายแวะไปดูคิว DTAC ปรากฏว่าผ่านไป 1 ชั่วโมงกว่าๆ เพิ่งได้ 40 คิว -*- ผมเลยขี้เกียจรอแล้ว ยังไงก็แพงกว่าโปร AIS แถมไม่ได้อยากได้ขนาดนั้นเลยกลับบ้านดีกว่า

ส่วนตัวผมว่าปีนี้คนเยอะเท่าเดิมแต่บู๊ทต่างๆ ไม่ค่อยน่าสนใจเท่าไหร่ครับ

JavaScript ตัด string แบบเนียนๆ

ช่วงที่ผ่านมามีโจทย์นึงจากลูกค้าให้ช่วยหา logic ตัด string แบบที่เขาต้องการบน JavaScript ให้หน่อย โดยเจ้า JavaScript ของผมเนี่ยเป็น mvc api ที่จะส่งข้อมูลลงมาจะเป็น string ที่มี tag span html ปนอยู่ใน string ด้วย (back end เป็นตัวใส่ให้) เพื่อที่จะเป็นจุดอ้างอิงให้ลูกค้าเอาใช้กำหนดใน css ของเขาครับ

HTML SPAN ที่ส่งมาจะมี class (ชื่อสมมติ) ดังนี้ ‘Highlight’, ‘Foo’ และ ‘Bar’สำหรับ class ‘Highlight’ นี่จะผสมกับ class อื่นได้ แต่จะอยู่ลำดับหลังเสมอเช่น หรือ จะไม่มี class=’Highlight Bar’ เด็ดขาด ในแต่ละ string จะมี span tag โผล่มากี่ตัวก็ได้ ไม่จำกัด

สิ่งที่ลูกค้าต้องการ: ลูกค้าต้องการให้ตัด span ที่มี class ‘Foo’ และ ‘Bar’ รวมไปถึงทุกอย่างที่อยู่ใน span tag ของมันออกให้หมด แต่ span ที่มี class ‘Highlight’ ไม่ต้องยุ่งกับมัน เช่น

Input:

Time Warner Cable Reports Development of <span class='Bar Highlight'>AAA</span> First IP Set-Top Box, Sees Boxes <span class='Bar'>CATTT</span> in Select Markets by Year End  
<span class='Foo'>GE.N</span>  <span class='Foo'>TWC.N</span> <span class='Bar'>Hello</span>

Output:

Time Warner Cable Reports Development of <span class='Bar Highlight'>AAA</span> First IP Set-Top Box, Sees Boxes in Select Markets by Year End

Code แรกที่ผมทำนั้นเน้นให้ logic ถูก ทำงานได้ ยังไม่ได้คิดถึงเรื่อง Performance อะไรนัก เอาแบบวน loop recursive ถึกๆ แล้วหา string ด้วย indexOf แล้วตัดด้วย replace กันดื้อๆ เลย แบบนี้ครับ (gen มาจาก CoffeeScript นะ)

var arrayTag, filterTag, msgBase, removeTag, tagBar, tagFoo, tagSPAN;

tagBar = "<span class='Bar'>";
tagFoo = "<span class='Foo'>";
tagSPAN = "</span>";

arrayTag = [tagQuoteRef, tagStoryRef, tagNewsSearchID, tagNewsSearch];

msgBase = "Time Warner Cable Reports Development of <span class='Bar Highlight'>AAA</span> First IP Set-Top Box, Sees Boxes <span class='Foo'>CATTT</span> in Select <span class='Foo Highlight'>Maeooooo</span> Markets by Year End  <span class=Bar'>GE.N</span>  <span class='Bar'>TWC.N</span> <span class='Foo'>Hello</span> ";

filterTag = function(msgStr, filterStr, index) {
	var indexSpan, indexStart;
    	indexStart = -1;
	indexSpan = -1;
   	tmp = "";
    	indexStart = msgStr.indexOf(filterStr, index);
    	if (indexStart !== -1) {
      		indexSpan = msgStr.indexOf(tagSPAN, indexStart);
      		msgStr = msgStr.replace(msgStr.slice(indexStart, indexSpan + 7), '');
      		return filterTag(msgStr, filterStr, indexSpan + 8);
    	} else {
      		return msgStr;
	}
};

removeTag = function(msgStr) {
	var tagRemove, _i, _len;
    	console.log("Orignal Text: " + msgStr);
    	for (_i = 0, _len = arrayTag.length; _i < _len; _i++) {
      		tagRemove = arrayTag[_i];
      		msgStr = filterTag(msgStr, tagRemove, 0);
    	}
    	console.log("Remove Text: " + msgStr);
};

removeTag(msgBase);

รองรันๆ แล้วก็โอเค ไม่มีหลุดอะไร แต่ส่วนตัวคิดว่าถ้ามันเขียนด้วย Regular expression น่าจะเนียนกว่านี้ แต่ผมเขียนไม่เป็น เลยลองไปถาม @neizod ดู ซึ่งเนยซดก็ตอบว่า code ก็โอเคแหละ แต่ถ้าคิดถึง performance น่าจะลองแบบนี้นะครับ

msgBase =msgStr.split(/<span class='(?:Foo|Bar)'>.*?<\/span>/).join('')

เขร้ code แม่มสั้นสัดๆ ลองเทสด้วย เวบ jsperf แล้วเร็วโคตรๆ ผมก็เลยส่งอันนี้ให้ Dev ทีมผม review ดู น้องเขาก็เอาไป review สักพักแล้วก็บอกว่าอันนี้น่าจะเร็วกว่านะ

msgBase = msgStr.replace(/<span class='(Foo|Bar)'>.*?<\/span>/g,'');

ซึ่งผลก็ออกมา เร็วขึ้นเยอะ เลย \ w / ซึ่งผมก็เอาอันนี้แหละไปบอกลูกค้าอีกที

สรุป:

  • ความรู้และความเข้าใจเรื่อง Regular expression ถือว่าสำคัญมาก ซึ่งผมดันไม่รู้เลย
  • การได้เห็น code ดีๆ มันเปิดหูเปิดตาเราได้เยอะเลย

BioShock Infinite: Burial at Sea Episode Two

BioShock Infinite: Burial at Sea Episode 2 เป็น DLC ตัวที่ 3 (และตัวสุดท้าย) ของ Bioshock Infinite มันเป็นภาคเสริมที่ทุกคนรอที่จะให้มันมาเฉลยอภิมหาความงงแตกจาก Episode 1 แถมเราจะได้รับบท Elizabeth เป็นครั้งแรกด้วย (แล้วใครจะโยนของให้กูล่ะ)

ภาคนี้เนื้อเรื่องจะต่อจาก Episode 1 แบบทันทีเลยครับครับ ในภาคนี้ Elizabeth ต้องหาทางช่วยแม่หนู Sally (Little Sister) ที่อยู่ในเงื้อมมือของ Atlas (ผู้ร้าย BioShock) โดยรับทำงานอะไรบางอย่างให้ Atlas ซึ่งทำให้เธอต้องเอาตัวรอดในเมืองคนบ้าที่ชื่อ Rapture ให้ได้

ภาคนี้เปลี่ยน gameplay ไปเป็นแบบลอบเร้นแทนครับ ด้วย Elizabeth เราเป็นสาวน้อยตัวเล็กๆ อันแสนจะบอบบาง เราเลยได้อาวุธใหม่อย่างหน้าไม้ไว้ยิงลูกดอกยาสลบหรือลูกดอกยาพิษ v แถมยังมีระบบ meter วัดเสียงและการตื่นตัวของศัตรูจากการกระทำของเรา (เดินเหยียบน้ำเหยียบกระจกทำให้เสียงดังผิดปกติ) และ vigor/plasmid ก็จะเป็นแนวๆ สนับสนุนการลอบเร้นทั้งหมดเลย

แม้ gameplay จะเปลี่ยนค่อนข้างมากแต่ก็ทำให้เรางงๆ แค่ตอนแรกเท่านั้นครับ เล่นไปสักพักจะเริ่มชินและเริ่มสนุกกับ gameplay ที่ต่างออกไปจากเดิม ความกดดันต่างๆ ก็หนักขึ้นเพราะต้องหลบทั้งศัตรูทั้ง Big Daddy เมือง Rapture ก็มืดๆ ทึมๆ จิตๆ เข้ากับการค่อยย่องแล้วแอบไปฟาดกบาลศัตรูที่สุด

BioShock Infinite: Burial at Sea Episode Two Poster

สิ่งที่เจ๋งที่สุดของ Episode 2 ไม่ใช่ gameplay แต่คือเนื้อเรื่องที่ประสานเนื้อเรื่องของ BioShock กับ Bioshock Infinite ให้เข้ากันสมกับเป็นภาคปิดท้ายของ series นี้ที่พัฒนาโดย Irrational Games (เพราะค่ายแม่งปิดตัวหลังเกมออก) ครับ ตัวผมเองนี่ต้องออกตัวก่อนว่าเล่น BioShock ภาคแรกไม่จบแต่ก็รู้ spoil เกือบทั้งหมดแล้วเลยค่อนข้างชอบกับจุดนี้, ส่วนที่เหลือก็ต้องไปเล่นกันเองครับ แม่งช๊อคเหี้ยๆ สมชื่อเกม

แต่เนื้อเรื่องก็ยังเป็นจุดบอดที่สุดของ Episode 2 เช่นกันครับ คุณเล่นจบแล้วก็จะพบว่าเกมไม่ได้ตอบหลายๆ คำถามที่ทิ้งไว้ใน Episode 1 (ทำไม Comstock แม่งรอดมาได้คนนึง, ทำไม Elizabeth แม่งโหดขนาดนั้น, ฯลฯ) เลยและเนื่องด้วยมันเป็นเกมแนวแอบๆ มันก็เลยไม่มี Boss fight แบบภาคหลักและ Episode 1 ไปซะงั้น

สรุป แม้ว่าจะเกมจะไม่ตอบหลายๆ คำถามของเราแถมยังทำให้เรางงหนักกว่าเดิม แต่ Burial at Sea Episode 2 ก็เล่นสนุกขึ้น มีพื้นที่ให้สำรวจเยอะขึ้น ควรค่าแก่การจัดหามาเล่นครับ

ป.ล. สิ่งที่ควรทำหลังจากเล่นจบ –> ไปเล่น BioShock ใหม่(หรือเล่นที่ค้างไว้ให้จบ)ทันที