วันจันทร์ที่ 29 มกราคม พ.ศ. 2561

DBMS pt.2

    ในตอนนี้ได้ลองเปลี่ยนไปใช้ MySQLWorkbench ในการทดลองเล่นกับ Database โดย download และติดตั้งเรียบร้อย


    โดยได้ทดลองต่างๆเช่น

1. ทดลองสร้าง schema


    ซึ่งจริงแล้วเราสามารถเขียนเป็นโค้ดก็ได้ เช่นการสร้างดังกล่าวจะเขียนแทนด้วยโค้ดดังนี้

CREATE SCHEMA `db_week_3` DEFAULT CHARACTER SET utf8 ;

2. การสร้าง table เก็บข้อมูล


    เมื่อสร้าง schema แล้วเราสามารถที่จะสร้าง table และกำหนดค่าต่างๆ เช่นสร้างคอลัมน์เก็บ idstudent โดยสามารถจะเลือกชนิดของข้อมูลได้ และเลือกว่าจะเป็น Primary Key หรือเปล่า
    โดยโค้ดที่สามารถเขียนแทนได้ก็มีดังนี้

CREATE TABLE `db_week_3`.`student` (
  `idstudent` VARCHAR(20) NOT NULL,
  PRIMARY KEY (`idstudent`));

    ซึ่งการจะลบหรือจะแก้ไขอะไรจำเป็นจะต้องเปิดตัว server เอาไว้ด้วย





วันอังคารที่ 23 มกราคม พ.ศ. 2561

DBMS pt.1



    นอกจากงานที่ได้รับมอบหมายยังมีการทดลองใช้ DBMS หรือตัวจัดการระบบฐานข้อมูล ก็ได้มีคำแนะนำจากเพื่อนว่าลองใช้ xampp เพราะว่าตอบโจทย์และก็เป็น opensource และมี DBMS มี Apache กับ MariaDB

    แต่ตอนนี้ติดปัญหาเรื่องตัวโปรแกรม เพราะฉะนั้นขอเกริ่นไว้ก่อน ไว้จะมาต่อบทความหน้าขอบคุณครับ

 

My bitbucket profile

https://bitbucket.org/thanut_suwannawong/

Score and Grade (Python)




    จากสัปดาห์แรกของการเรียนการสอน อ.SPN ได้ขอให้ไปทำการทดลองมาเพิ่มเติมโดยให้ลองเอา spreadsheet ที่ได้ทำนั้นมาลอง export เป็นไฟล์ csv และนำมาคำนวณ

    ปัญหาที่ได้พบทั้งหมด

1. ในการเปิดไฟล์ csv มีปัญหาเรื่อง UnicodeError โดยวิธีการแก้ก็คือการใช้ตัว encoding เข้าไประบุว่าจะใช้ตัว decode ตัวไหน ในขั้นตอนการ open file csv


2. ปัญหานี้เป็นปัญหาใหญ่ซึ่งเกิดจากการออกแบบ spreadsheet ไว้ไม่ดีทำให้เมื่อเวลาดึงข้อมูล หรือ อ่านใน python แล้วไม่สามารถนำมาใช้ในการคำนวณได้ เลยจะต้องตัดคอลัมน์ออกไปหลายๆส่วนด้วยกัน และเหลือเอาไว้ที่จำเป็น ซึ่งมีแค่ ปีการศึกษา เกรด หน่วยกิต เพียงเท่านั้นจากตอนแรกที่ใส่คอลัมน์ที่ไม่จำเป็นไว้เยอะ โดยตัวผมเองนั้นใช้วิธีการตัดส่วนของ string เลยทำให้ไม่สามารถทำงานได้สะดวกหากยังเก็บคอลัมน์ที่ไม่จำเป็นไว้

3. เนื่องจากช่วงปิดเทอมนั้นไม่ได้ฝึกการทำงานเลย ทำให้มีผลกระทบอย่างมาก ทำให้งานที่ออกมางานแรกนั้นไม่ค่อยมีประสิทธิภาพ ต้องขออภัยไว้ ณ ที่นี้ด้วย และจะขอแก้ไขในงานครั้งต่อไปครับผม

4. ไม่ได้เขียนคอมเมนท์สักตัว ไม่ควรเอาเยี่ยงอย่าง

ผลการทำงาน


เทียบกับเว็บของมหาลัย




    จะเห็นได้ว่ามีความถูกต้องตามที่ได้ทดลองทำ

Code


    ในส่วนของโค้ดผมจะขออธิบายในส่วนของภาพรวมเพียงเท่านั้น เพราะว่าวิธีที่ใช้ในการทดลองนั้นไม่ได้ใช้วิธีที่ซับซ้อนมาก ใช้วิธีแบบเรียบง่าย มีการ import csv เพื่อใช้ในการเปิดไฟล์ csv โดยในฟังก์ชั่น main จะมีเพียงส่วนของ print และ เรียกใช้ฟังก์ชั่น 2 ตัวด้วยกันได้แก่

1. calculate_each(ปีการศึกษา)
    เป็นฟังก์ชั่นในการคำนวณเกรด โดยจะเรียกใช้ฟังก์ชั่น get_grade() กับ get_credit() เพื่อนำค่าของเกรดและหน่วยกิตทุกตัวเข้ามาเก็บไว้ในตัวแปร และหลังจากนั้นจะวนลูป เพื่อทำการคูณค่าของหน่วยกิต และ เกรดของวิชานั้นๆ เมื่อเสร็จแล้วนำมาหารกับ หน่วยกิตทั้งหมด แล้วปัดเอาทศนิยม 2 ตำแหน่ง return กับไป  ซึ่งค่าที่รับมาจากการเรียกนั้นคือ term เพื่อที่จะสื่อว่า ต้องการของเทอม เทอมไหน

2. calulate_all(จำนวนปีการศึกษาทั้งหมด)
    เป็นฟังก์ชั่นการคำนวณเกรดเฉลี่ยสะสมโดยวิธีการคำนวณก็จะคล้ายๆกับตัว calculate_each() โดยจะใส่จำนวนปีการศึกษาว่าต้องการทราบถึงเท่าไร  โดนสิ่งที่แตกต่างกับโค้ดตัวด้านบนคือจะมีการวนลูปนอกสุดเพิ่มขึ้นมา หรือก็คือการวนลูปคิดในแต่ละปีนั้นเอง โดยจะให้วนเท่ากับจำนวนของปีที่ต้องการ 

ฟังก์ชั่น get_grade() และ get_credit()

    ฟังก์ชั่นทั้งสองตัวนั้นมีการทำงานที่คล้ายกันมากๆ ที่ต่างกันคือตำแหน่งของ string ที่เลือกจะเก็บข้อมูลอย่างเช่น 


    ถ้ามองจากรูปประกอบจะเห็นได้ว่า ตัวหลัง 3 ตัว(รวมจุดทศนิยม) นั้นคือเกรดที่เรา เพราะฉะนั้นถ้าหากเราต้องการเอาเฉพาะตัวเกรด เราก็อาจจะใช้คำสั่งด้านล่าง
   
 term_1_grade.append(row[-3:])     กับ    term_1_grade.append(row[-4:-1])

    เป็นคำสั่งใช้ในการ append เอาค่าเข้าไปใน list เปล่าๆโดยที่ต้องมีสองค่าก็เพราะว่า บรรทัดแรกที่จะมีปีการศึกษาด้วยนั้นจะทำให้ string มีตำแหน่งที่ไม่ตรงกัน

    แต่ถ้าเป็นการหาหน่วยกิตก็จะใช้โค้ดดังนี้

term_1_credit.append(row[10])  กับ  term_1_credit.append(row[1])

    ซึ่งเป็นตำแหน่งของหน่วยกิตโดยที่มีสองตัวก็เพราะเหตุผลเดียวกัน

    โดยในแต่ละฟังก์ชันจะมีการเก็บค่าของเทอมแต่ละเทอมเป็น 1 list จะทำให้มีทั้งหมด 4 lists และ เราเก็บทั้งหน่วยกิตกับเกรด จะทำให้เป็นทั้งหมด 8 lists แต่ว่าตอน return ค่านั้นจะนำค่าไปใส่กับ list เปล่าๆอีกทีนึงดังนี้

all_grade = [term_1_grade,term_2_grade,term_3_grade,term_4_grade]
        return all_grade

all_credit = [term_1_credit,term_2_credit,term_3_credit,term_4_credit]
        return all_credit

ส่วนตัวโค้ดเต็มๆนั้นผมจะอัพลง bitbucket แล้วแปะลิ้งค์ไว้ให้ครับผม

ปัญหาที่พบ(ต่อ)

    เกิดปัญหาในเรื่องของ unicode error ซึ่งเจอตอนเปิดไฟล์ csv ด้วยการใช้คำสั่ง open

with open('score.csv', newline='',encoding='utf8')

    โดยวิธีการแก้ก็คือการใช้ encoding ='utf8' เพื่อใช้ในการ decode แต่ตอนที่พบปัญหานั้นไม่ได้บันทึกรูปมาให้ดูครับ

ปัญหาที่พบ(ต่อ)

   ในการทำงานได้พบปัญหาเพิ่มเติม ในเรื่องของการ merge cell แล้วทำให้ คอลัมน์ในแต่ละแถวนั้นไม่เท่ากันเลยแก้ปัญหาเลยการย้ายคอลัมน์หน่วยกิตที่ลงทั้งหมด ไปไว้ข้างหน้าแทน แล้วใช้เรื่องของคุณสมบัติ string ในการตัดเอาเฉพาะตัวหลังออกมาก็จะได้เกรด


    ปล. จากปัญหาที่ผ่านมาทั้งหมดทำให้รู้ว่าการออกแบบ Database นั้นสำคัญมาก ถ้าออกแบบไม่ดีนั้น การเก็บข้อมูลไม่เป็นระเบียบจะก่อเกิดปัญหาภายในอนาคตได้

ปัญหาที่พบ

    ในไฟล์ CSV ตัวล่าสุดที่ได้ทำการแก้ไขนั้น มีปัญหาในเรื่องของการจับข้อมูลในแต่คอลัมน์ จึงได้ลองแก้ไขตัวไฟล์ CSV ให้มีคอมลัมน์ที่น้อยลง โดยจะให้เหลือเพียง

1. ปีการศึกษา
2. หน่วยกิต
3. เกรดที่ได้
4.หน่วยกิตทั้งหมด


    ซึ่งทำให้มีความสะดวกต่อการนำค่าแต่ละตัวไปคำนวณเกรดต่อไปได้ แต่จะไม่สามารถแสดงชื่อของวิชานั้นได้ 

Export to .csv file




    ในสัปดาห์การเรียนในสัปดาห์ที่ 2 นั้น อ.SPN ได้ให้ทดลอง export CSV format หรือ ก็คือให้ดาวน์โหลดตัวข้อมูลเกรดที่ได้ทำใน spreadsheet ครั้งที่แล้วให้มาเป็นไฟล์ CSV เพื่อที่จะนำไปใช้ในการเขียนโปรแกรม Python เพื่อทำการคำนวณเกรด 
  
   โดยหลังจากที่ได้ทดลองดาวน์โหลดมาแล้วผลที่ได้ก็คือ ไฟล์ csv ดังภาพ


    ไฟล์ csv ดังกล่าวนั้นไม่เหมาะแกการจะนำไปใช้ในการเก็บข้อมูลคำนวณเกรด เพราะมีคอลัมน์บางคอลัมน์ที่ไม่จำเป็น ผมเลยทำการแก้ spread sheet และ เอาเฉพาะข้อมูลที่จำเป็นมาเท่านั้นได้แก่


    1. ภาคการเรียน
    2. ชื่อวิชา
    3. หน่วยกิต
    4. ตอนเรียน
    5. เกรด(ABC)
    6. เกรด(ตัวเลข)
    7. หน่วยกิตที่ลง

    โดยหลังจากแก้เสร็จได้ทำการ export ผลที่ได้คือ





วันอังคารที่ 16 มกราคม พ.ศ. 2561

Score and Grade



    จากสไลด์ของอาจารย์ SPN ได้กำหนดไว้ว่า ให้นศ.ทุกคนลองใช้ spreadsheet เพื่อทำการคำนวณ GPA ของนศ. แต่ละคนออกมา

    โดยอาจารย์ SPN ได้กำหนดให้ลองใช้ spreadsheet ของตัว Google


    โดยผมได้จัดทำ spreadsheet และทำตามที่อาจารย์ SPN ได้กำหนดไว้ โดยใช้วิธีในการทำแบบพื้นฐาน ไม่ได้ซับซ้อนอะไร

    ในตัวงานนั้นจะเป็น spreadsheet ซึ่งจะมีส่วนประกอบเป็นตารางมีคอลัมน์ มีแถว ในการอธิบายนั้นผมจะขออธิบายตามคอลัมน์ต่างๆ ซึ่งจะเป็นการเก็บข้อมูลหลายๆข้อมูลของแต่ละวิชา

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

Column(หลัก)

1. ปีการศึกษา


2. รายชื่อวิชา


3. หน่วยกิตกับตอนเรียน


4. เกรด


    ในส่วนนี้จะมีการแปลงเกรดจากที่เป็นตัวอักษรภาษาอังกฤษมาเป็นตัวเลข โดยใช้เงื่อนไข if ของ excel ดังนี้ 

=IF(E2="A",4,IF(E2="B+",3.5,IF(E2="B",3,IF(E2="C+",2.5,IF(E2="C",2,IF(E2="D+",1.5,IF(E2="D",1,0)))))))

ถ้าหากช่อง E2(คอลัมน์เกรดที่เป็นตัวอักษร) ตรงกับเงื่อนไขใดก็จะแปลงเป็นตัวเลขแล้วใส่ในช่อง F2(คอลัมน์เกรดที่แปลงเป็นตัวเลข)

คอลัมน์เกรด*หน่วยกิต ไว้สำหรับใช้ในการคำนวณเกรดโดยจะมีสูตรการคิดเกรดเฉลี่ยนรวมก็คือ นำเอาเกรด*หน่วยกิตของแต่ละวิชาแล้วจับมาหาผมรวม แล้วหารด้วยหน่วยกิตทั้งหมด
เกรดเฉลี่ย = ผลรวมทุกวิชาของ(หน่วยกิตของวิชา*เกรดที่ได้)/หน่วยกิตทั้งหมด

5. หน่วยกิตทั้งหมด


    หน่วยกิตที่ลงทั้งหมดในปีการศึกษานั้นบวกกัน

6. เกรดเฉลี่ยประจำเทอมและสะสม


        คิดได้จากสูตรในข้อที่ 4. หรือ ก็คือนำหน่วยกิตแต่ละวิชามาคูณกับเกรดที่ได้และจับหาผลรวมของทุกๆวิชา และหารด้วยหน่วยกิตทั้งหมดที่ลงจะได้ เกรดเฉลี่ยประจำเทอม ส่วนเกรดเฉลี่ยสะสมจะเอาทุกเกรดที่มีอยู่มารวมกันแล้วหารด้วยจำปีการศึกษาทั้งหมด

ผลลัพธ์



    ซึ่งหากนำไปเทียบกับที่ทางมหาลัยเป็นคนคิดนั้นผลก็คือตรงตามที่ได้ทดลองทำเอง









    ลิงค์ตัว spreadsheet (เฉพาะคนที่มี email.kmutnb.ac.th)












Database System


    หลังจากโพสต์นี้เป็นต้นไปจะเป็นโพสต์ที่เกี่ยวข้องกับวิชา Database System ประจำปีการศึกษา 2/2560