(English) Bug of the month: Array key!!! by joeskb
Mar0
เตือนความจำเกี่ยวกับข้อผิดพลาดในช่วงที่ผ่านมา เรื่องที่เจอเยอะที่สุดก็อย่างที่หัวข้อบอกครับ
ด้วยความที่ง่ายใส่ key เข้าไปได้โดยไม่ต้องผ่านการเช็คของ editor ก่อให้เกิดบัคหลายๆ อย่างตามมาอย่างไม่คาดฝัน
ตัวอย่างเช่น
$each['type']==”armor” กับการวางพลาดเป็น $each['type'=="armor"] ก่อให้เกิดบัคที่ใส่เกราะยังไงก็ไม่ได้สักที
ก้อนข้อมูลที่อยู่ลึกลงไปหลายๆ ชั้นก็ก่อปัญหาได้เช่นกัน
วิธีป้องกันเบื้องต้น คือการใช้ object แทน และการ select เฉพาะ field ที่ใช้จริง แทนที่กับ select * เพื่อให้มีข้อมูลอ้างอิงไว้ดูผ่านใน code
วิธีติดตั้งปลั๊กอินของ OneSignal ไปยัง Unity by joeskb
Feb1
เอกสารฉบับภาษาอังกฤษ วิธีการติดตั้งโดยบล๊อกนี้จะแนะนำให้เป็นภาษาไทยเข้าใจกันได้ง่ายขึ้น
- เริ่มด้วยโหลดปลั๊กอินตามลิงค์ 1.1
- ทำการ import package โดยเลือกจากเมนูด้านบน Assets เลือก Import Package เลือก Custom Package
- จะมีหน้าจอแสดงรายละเอียดของ package ให้กดปุ่ม import
- วางจุดสำหรับให้ OneSignal เริ่มทำงานโดยใช้คำสั่ง OneSignal.Init(“1st parameter”,’2nd parameter”,HandleNotificationFunction); โดยถ้ามี config สำหรับการจะเลือกรับหรือไม่ก็นำ if มาครอบบรรทัดนี้เอาไว้
- แก้พารามิเตอร์ของ init โดย 1st = OneSignal App Id, 2nd = Google Project number
- บล๊อกนี้จะแนะนำเพิ่มเติมสำหรับ android โดยให้แก้ไข AndroidManifest.xml ที่อยู่ใน Plugins/Android/OneSignalConfig
- แทนที่ ${manifestApplicationID} ด้วย Android package name ต้องไม่มี – ขั้นกลาง จะมีให้แก้อยู่สามที่
- นำ Icon ไปใส่ไว้ใน folder ต่างๆ ที่อยู่ภายใต้Assets\Plugins\Android\OneSignalConfig\res
- ให้ตั้งชื่อรูปหลักว่า ic_stat_onesignal_default และ ic_onesignal_large_icon_default สำหรับรูปใหญ่
- สามารถทดลองส่งข้อความจาก Server ได้ โดยแอปจะต้องถูกเปิด และถูกพักไว้อยู่ จึงจะแสดงการแจ้งเตือน
วิธีใช้งาน Helper และ View สำหรับสร้าง Table by joeskb
Jan0
สำหรับการเขียนโปรแกรม Back-end บางทีก็ต้องชั่งน้ำหนักระหว่างภาษาว่าใช้ภาษาไหนมากกว่ากัน ซึ่งก็ขึ้นอยู่กับความถนัดของแต่ละคนด้วย
ตัวอย่างนี้แสดงให้เห็นวิธีใช้ Codeigniter helper และ View โดยเน้นไปทาง ฝั่ง CI มากกว่า HTML
$this->load->helper('html');
$this->load->helper('url');
$this->load->library('table');
$this->table->set_template(['table_open' => '<table border="1">"]);
$this->table->set_caption('News List');
$this->table->set_heading('Logo', 'Subject', 'Publish date');
foreach ($this->CI->db->get('news')->result_array() as $row) {
$this->table->add_row(empty($row['logo']) ? ' ' : img(base_url() . 'assets/images/default/news_logo/' . $row['logo']), $row['subject'], $row['publish_date']);
}
$data['news_list'] = $this->table->generate();
$this->load->view('master/news', $data);
อธิบายคำสั่งสำคัญได้ดังนี้ครับ
- $this->table->set_template ใช้สำหรับกำหนดลักษณะของตารางโดยใส่ config ต่างๆ เป็น array ลงไป
- $this->table->set_caption ใช้กำหนด caption ของตาราง ใส่ string ได้เลย
- $this->table->set_heading ใช้กำหนดหัวข้อของแต่ละคอลัมน์ ใส่ string คั่นด้วยลูกน้ำไปเรื่อยๆ ได้เลย
- $this->table->add_row เป็นการใส่ข้อมูลแต่ละแถว สามารถใช้วน loop ได้อย่างง่ายมาก
- $this->table->generate คำสั่งสำหรับสร้าง html ตามที่ได้ตั้งค่าไว้ที่ด้านบนแล้ว
-
ทางฝั่ง view ก็จะได้นำไปใช้งานง่ายๆ แบบนี้ครับ
<?= $news_list?>
วิธีส่ง PHP Array ไปให้ List ใน C# by joeskb
Dec0
ส่งท้ายปีด้วยวิธีการส่งข้อมูลจาก Server ไปหา Client แบบไม่ซับซ้อนมาก
โดยสามารถนำไปใช้ได้ทันที่ และสามารถสอดไส้ใส่ไปใน JSON แบบไม่ต้องใช้ JSONArray
PHP
return implode(',', array('a','b','c','d'));
ฝั่ง Server ส่งออกไปเป็นลูกน้ำ
C#
List<string> A = new List<string>(JSONNode.asString.Split(','));
เพียงฝั่งละบรรทัด ก็สามารถส่ง Array เล็กใหญ่ไปอย่างง่ายดายครับ
การสร้าง Script สำหรับตรวจสอบความผิดพลาดบน GameObject by joeskb
Nov0
การ Debug ใน unity บ่อยครั้งที่เราไม่สามารถเช็คข้อมูล หรือหยุดการทำงานได้ทัน
พอใส่ Break point ก็เข้าไปดูใน hierarchy ไม่ได้ การสร้าง Script ไว้ใช้สำหรับตรวจจับถึงเป็นอีกทางเลือกหนึ่ง
ยกตัวอย่างการ ตรวจจับการเปลี่ยนแปลงของ position
เริ่มจากประกาศตัวแปรสำหรับเช็คการเปลี่ยนแปลงตำแหน่ง
Vector3 Current;
เริ่มเก็บค่าตั้งแต่การเริ่มเกม
void Awake ()
{
Current = transform.localPosition;
Debug.Log (Current.ToString ());
}
ทำการเช็คทุกเฟรมด้วย function update
void Update ()
{
if (transform.localPosition != Current) {
Current = transform.localPosition;
Debug.Log(Current.ToString());
Debug.Break();
}
}
การใส่ Debug.Break เป็นทางเลือก สำหรับตรวจเช็คภายใน hierarchy หรือจะใช้การ gameObject.getComponent อื่นๆ เอามาเช็ค
เมื่อสร้าง script เสร็จก็เอาไปเพิ่มใน game object ที่ต้องการตรวจสอบ ทำไว้หลายๆ ไฟล์เพื่อความสะดวกในการใช้งาน