ฝึกงาน #8

[16.04.2009]

หลังจากหยุดยาวช่วงสงกรานต์ไป ทำให้วันนี้ขี้เกียจไปฝึกงาน >,<~

เนื่องจาก เหตุการณ์ม็อบเสื้อแดง ท่านนายกจึงประกาศให้เป็นวันหยุดราชการ

แต่ไอ้เรามันบริษัทเอกชน ก็ต้องไปทำงานตามปกติ

แต่ก็มีดีอย่างนึงคือ รถไม่ติด ^^”

วันนี้ช่วงเช้าก็นั่งเบื่อ ก็หาเว็บที่สอน OOP+C# มานั่งอ่านเล่น

เจอเว็บนี้ http://thai-cs.spaces.live.com ดีเหมือนกัน

เอาไว้จะไปยืมหนังสือมาอ่าน (ไม่มีเงินซื้อเองแล้ว – -”)


ถึงช่วงบ่าย พี่ก็ถามว่า รู้จัก Stored Procedure มั้ย

เหอๆๆ ก็ตอบไปว่า ไม่รู้จัก งานเลยเข้า

พี่ก็เลยให้หาว่า คืออะไร ใช้ยังไง

ให้เวลา 1 ชั่วโมง

ก็ให้พี่ google ช่วย – -” ได้ความว่า

stored procedure เป็นการเขียน code เป็น procedure โดยปกติแล้ว code เหล่านี้จะอยู่ฝั่ง client
แต่การเขียนแบบ stored procedure นั้น code เหล่านี้จะอยู่ฝั่ง database
มีประโยชน์ คือ ช่วยให้เร็วกว่าการ query ธรรมดา เนื่องจาก การ query แต่ละครั้งจะต้องไปดึงข้อมูลออกมาทั้งหมด แต่การเขียนแบบ stored procedure จะทำงานฝั่ง server ข้อมูลที่ส่งกลับมาให้ฝั่ง client จึงมีน้อยกว่า
ข้อดีอีกอย่างก็คือ ในการ query ข้อมูลออกมาผิดคอลัมน์ (ไม่ว่าจะด้วยเหตุผลอะไรก็ตาม) ปกติแล้ว เราต้องทำการแก้ไขที่ตัว code (ซึ่งบางครั้งอาจจะวุ่นวาย – -”) แต่การทำ stored procedure นั้น เราก็แก้ในส่วน stored procedure ไม่ต้องไปแตะส่วนที่เป็น code เลย

—————————————————————————————————-

อ่านเพิ่มเติม

  • http://www.narisa.com/forums/index.php?showtopic=103
  • http://www.codetoday.net/Default.aspx?g=posts&t=163
  • http://greatfriends.biz/webboards/msg.asp?id=43381
  • http://www.expert2you.com/view_question2.php?q_id=9247
  • http://www.narisa.com/forums/index.php?autocom=blog&blogid=6&cmd=showentry&eid=6
  • http://obtheair.exteen.com/20060926/sql-in-code-vs-stored-procedure
  • http://thai-developer.6te.net/article.php?qrID=53
  • http://juuier.blogspot.com/2008/11/store-procedure-sqlserver.html

—————————————————————————————————-

เมื่อศึกษาแล้วก็ได้ทดลองเขียน code จาก northwind (อีกแล้ว)

โดยคราวนี้ให้ทำเหมือน Project ที่แล้ว แต่ให้เปลี่ยนในส่วนของ DAO จากเดิมเป็น query

ให้เปลี่ยนเป็นแบบ stored procedure

ก็ได้ทดลองทำการติดต่อผ่าน sql server ในรูปของ stored procedure

ทำเสร็จก็กลับบ้าน

ฝึกงาน #7

[10.04.2009]

เนื่องจาก โดยปกติแล้ว จะเขียนบันทึกการฝึกงานที่ทำงาน – -”

เพราะว่าเลิกงาน กลับมาหอ ก็ไม่อยากเปิดคอมแล้ว วันๆ อยู่แต่หน้าคอม เบื่อ

แต่หลังๆ มานี่ ไม่มีเวลาว่างจะอัพเลย ก็เลยต้องดองไว้นานหน่อย

มาเริ่มกันเลยดีกว่า

วันนี้ (นายกประกาศให้เป็นวันหยุดราชการ แต่บริษัทเราไม่หยุด เพราะเป็นเอกชน)

ก็มาทำงานปกติ ม็อบเสื้อแดงก็ยังไม่สงบดีนัก แต่ก็ต้องมาทำงาน


งานวันนี้

ก็คือ พี่ให้ฝึกเขียน console application โดยใช้ database northwind (เหมือนเดิม)

โดยเขียนแบบ MVC (Model View Controller) ซึ่งประกอบไปด้วย
– PLS
– BLM
– DAO
โดยวันนี้ ได้ทดลองใช้ source safe คือเขียนร่วมกันกับเพื่อนในทีมอีกคน (ชื่อหลี)

ก็แบ่งกันตารางกันว่าใครจะจัดการข้อมูลตารางไหนบ้าง

จากนั้นก็ลงมือเขียน

หลักๆ ก็คือ สร้างโปรเจคย่อยๆ ดังนี้

  • PLS จะเป็นส่วนที่แสดงให้ผู้ใช้เห็น ในที่นี้คือ เป็นส่วนแสดง menu ให้ผู้ใช้เลือก
  • BLM ในที่นี้ทำหน้าที่แค่เชื่อมต่อข้อมูลระหว่างชั้น PLS และ DAO (เนื่องจากยังไม่มี Bussiness Rule ใดๆ เลย)
  • DAO ทำหน้าที่คิวรี่ข้อมูลออกมา แล้วส่งต่อไปให้ยัง BLM
  • Common ทำหน้าที่เป็น properties ในแต่ละ field ต่างๆ ของแต่ละ table

สิ่งที่ได้จากวันนี้

การสร้าง Object

Object obj = new Object();
การเรียก new Object(); มันจะไปจอง memory ส่วน obj นั้น เป็นเหมือนตัวชี้ไปที่ mem นั้นๆ
ดังนั้น สามารถ new Object(); ได้เลยแบบไม่ต้องมีตัวชี้
(เพื่อความเข้าใจมากยิ่งขึ้น ดูจากการ Assign ค่าให้กับ Object)

การ Assign ค่าให้กับ Object สามารถทำได้ 2 แบบดังนี้

1.
supplier.Add(new SupplierDo(){
Address = reader["Address"].ToString(),
City = reader["City"].ToString()
});

2.
SupplierDo supplierSample = new SupplierDo();
supplierSample.Address = reader["Address"].ToString();
..
..
..
..
supplier.Add(supplierSample);
โดยที่แบบที่ 1 จะสร้างตัว object ขึ้นมา ทำการ assign ค่า แล้ว List ก็ Add เข้าไปเลย
ส่วนแบบที่ 2 จะสร้าง object พร้อมกับชื่อเรียกตัวมัน ทำการ assign ค่า สั่งให้ List Add ชื่อเรียกนั้นๆ (ซึ่งชื่อเรียกนั้น เปรียบเสมือนตัวชี้ไปที่ object)

Set + Get

ใน java เราจะต้องเขียนเป็น method
แต่ใน C# ไม่ต้อง ให้มองว่าเป็น properties ตัวหนึ่ง
(รายละเอียด เดี๋ยวมาเพิ่มให้)

ตัวอย่างใน java

class Student {
private String name;
private double grade;
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
}
public double getGrade() {
return this.grade;
}
public void setGrade(double grade) {
if(grade < 0 || grade > 4)
throws new Exception();
else
this.grade = grade;
}
}

class School {
public void displayGrade(){
Student s = new Student();
s.setName("Dew");
s.setGrade(4.0);
}
}

ตัวอย่างใน c#

class Student {
private string _name;
public string Name {
get { return this._name; }
set { this._name = value; } // value ในที่นี้ก็คือค่า Name นั่นแหละ
}
private double _grade;
public double Grade {
get { return this._grade; }
set {
if(this._grade < 0 || this._grade > 4)
throws new Exception();
else
this._grade = value; // value ในที่นี้ ก็คือค่า Grade นั่นแหละ
}
}
}

class School {
public void displayGrade(){
Student s = new Student();
s.Name = Dew;
s.Grade = 4.0;
}
}

โดยที่ c# มันจะรู้เองว่าจะเรียกใช้ get หรือ set โดยดูที่ว่า ถ้ามีการ assign ค่าให้ (มีเครื่องหมาย = ) จะเรียกใช้ set ถ้าไม่ใช่ ก็จะเป็นการเรียกค่าออกมา ก็คือใช้ get

** สำหรับ snippet ของ properties คือ พิมพ์ prop แล้วตามด้วย tab 2 ครั้ง

snippet-prop-01

snippet-prop-02

ตอนเย็น พี่ดิวสอน Basic C#

ส่วนประกอบของ Class

  • Access Modifier
    • public : จะมองเห็นได้ทุกๆ class
    • private : จอมองเห็นเฉพาะ class ตัวมันเอง
    • protected : จะมองเห็น class ที่ inherit มาด้วย
  • Method

[AccessModifier]{static}[ReturnType][MethodName](param){

}

  • Properties : ต่างจาก method ที่ ไม่รับค่า param

[AccessModifier]{static}[Type][PropName]{

set { abc = value; }
get {return abc; }

}

Type : เป็นอะไรก็ได้ (เป็น obj ก็ได้)

static : ไม่ต้อง new, มี 1 เดียวเท่านั้น

constructor :

- จะถูกเรียกครั้งแรกครั้งเดียวที่มีการ new (จึงไม่สามารถเรียกใช้ได้)
– จะมีทุกๆ class
– ไม่สามารถ return ค่าใดๆ ได้ (เอาไว้เริ่มค่า)

* เหมือน method คือรับ param ใดๆ มาก็ได้

public [ClassName](){

}

 

base -> scope ของ class แม่ จะเห็น public, protected จะไม่สนใจ method class ตัวเอง
เรียก constructor ของ class แม่
this -> scope class


(All code from P’Dew) : Training.zip

ฝึกงาน # 6

[09.04.2009]

เนื่องจากวันนี้ตื่นสาย (มาก) ตื่นขึ้นมาตอน 8.20 จากนั้น รีบอาบน้ำ

ไปถึงหมอชิต 8.50 (เริ่มงาน 9.00 – -”) กว่าจะถึงที่บริษัท ก็ 9.20

วันนี้ก็เลยเป็นวันแรก ที่ไปฝึกงานสาย

ไหนๆ ก็สายละ เอากฎการฝึกงานของมหาลัยมาเตือนสติกันหน่อย

  • ต้องฝึกไม่น้อยกว่า 240 ชั่วโมงทำการ และไม่น้อยกว่า 30 วันทำการ
  • สายได้ไม่เกิน 5 วันทำการ
  • ลากิจ ต้องลาไม่น้อยกว่า 2 วันทำการ และจะลาได้ไม่เกิน 5 วันทำการ (รวมลากิจและลาป่วย) แต่ถ้ามีความจำเป็นต้องลาเกินกว่านั้นให้เขียนคำร้องมายังคณะ เพื่อพิจารณาเป็นครั้งๆ ไป


วันนี้ก็แก้ bug ของเมื่อวาน

แล้วพี่ดิวก็เอาโค้ดที่พี่ทำมาให้ศึกษา

ไฟล์ตัวอย่างของ P’ Dew : ObjectTutorial2.rar

ภายในมี 3 project ได้แก่

  • ObjectDisplay (อธิบายคุณสมบัิและการเขียนแบบ object)
  • StudentSample (เป็นโค้ดที่พี่ดิวเขียน โจทย์ Assignment เมื่อวานนี้)
  • DatabaseSample (เป็นโค้ดที่ใช้ติดต่อกับ Database)

ก็ให้มานั่งศึกษา แล้วลองปรับโค้ดของตัวเองใหม่ (เพราะว่าที่เขียนมันทุเรศมาก 555)

ดูเพิ่มเติม แล้วมาทำ Assignment


Snippet

ความรู้ใหม่ที่ได้จากการฝึกงานครั้งนี้ คือ Snippet ซึ่งเป็นการพิมพ์คำสั่งอย่างรวดเร็ว
เช่น เราต้องการพิมพ์ Console.WriteLine(); เราก็พิมพ์แค่ cw จากนั้นกด tab 2 ครั้ง

snippet ยังมีอีกหลายตัว ให้สังเกตจากรูป  ซึ่งอยู่หน้าคำสั่งที่เราต้องการ snippet_icon

snippet_cw


การแปลงค่า String -> ตัวเลข

เนื่องจากใน assignment ต้องมีการดักว่าข้อมูลที่ใส่ต้องเป็น ตัวเลข เท่านั้น วิธีทำก็มี 2 แบบ

1. ใช้ try…catch

try{
// ไม่เกิด error จะทำในนี้
}catch{
// เกิด error จะมาทำในนี้
}

2. ใช้ TryParse

double num;
string str;
bool isNum = double.TryParse(str, out num);
if (isNum){
// ถ้าเป็นตัวเลข
}else{
// ถ้าไม่เป็นตัวเลข
}

ถ้าใช้ TryParse จะเร็วกว่า try…catch เนื่องจากมันไม่ต้องเก็บ exception
แค่ return true, false เท่านั้น แต่ถ้าไม่รู้ว่ามี method TryParse ก็ใช้ try…catch ไป
ก็ง่ายดี ^^

อ่านเพิ่มเติม ข้อแตกต่างระหว่าง Convert.To…(….) กับ DataType.Parse(…)

(จาก link ด้านบน )

Int32.Parse(str) กับ Convert.ToInt32(str) ต่างกันที่
ถ้า str เป็นค่า null แล้ว Int32.Parse(str) จะ throws Exception แต่ ถ้า Convert.ToInt32(str) จะ return ค่า 0 แทนการ throws Exception

ปล. พี่ดิวจะนัดสอน C# ตอนเย็นทุกวัน (ถึงแม้จะเคยเรียนมาบ้างแล้ว แต่การที่พี่สอน ก็อาจจะทำให้ได้ความรู้หรือเทคนิคอะไรเล็กๆ น้อยๆ ที่เรายังไม่เคยรู้มาก่อนเลยก็ได้ ^^ เริ่มเย็นพรุ่งนี้)


ตอนเย็น คึกคักมาก เนื่องจากม็อบเสื้อแดง ทำให้หลายๆ คนกังวลว่าจะกลับบ้านยังไง – -”

ปล. Publish ล่าช้าไปหน่อย 555

ฝึกงาน #5

[08.04.2009]

เริ่ม asp.net แต่ก่อนจะเริ่ม ต้องทำการเรียนรู้ OOP ก่อน

พี่ดิวสอนเนื้อหาเบื้องต้นเกี่ยวกับ OOP

Object Oriented Programming (OOP) มีคุณสมบัติ 3 อย่างที่สำคัญ

1. Encapsulation
2. Polymorphism
3. Inheritance

Class vs Instance

Class เปรียบเสมือนเป็น ต้นแบบ ที่สามารถสร้างได้หลายๆ instance
Instance เป็นเหมือน ค่าตัวแปรตัวหนึ่ง
เช่น

Student std = new ….. ();

Student คือ class ส่วน std คือ instance

Model View Controller (MVC)

มี 3-tier ได้แก่

1. Presentation : หน้าจอที่เราเห็น (เปรียบกับ asp.net คือ ไฟล์ .aspx)
2. Bussiness : เป็นผู้คิดว่าจะเอาค่าอะไรออกไปแสดงที่ Presentation layer (เปรียบกับ asp.net คือ ไฟล์ .cs)
3. Data : เป็นการเอา data ออกมาจาก database (เปรียบกับ asp.net คือ ไฟล์ .cs)

MVC มีกฎสำคัญอยู่ข้อนึงคือ ห้ามมีการข้ามกันระหว่าง layer เช่น presentation ข้ามไป data แบบนี้ไม่ได้ จะได้คือ Presentation > Bussiness > Data หรือ Data > Bussiness > Presentation

หลังจากเรียน OOP แบบคอร์สเร่งรัดไปแล้ว พี่ดิวก็ให้ลองเขียน code

ไฟล์ตัวอย่างของ P’ Dew : ObjectTutorial.rar

งานที่ได้รับมอบหมาย

- สร้าง console application โดยใช้ C# ให้เขียนเป็นแบบ object
รายละเอียด
มี 4 เมนูให้เลือก โดยผู้ใช้ป้อนค่าเลข 1-4 เท่านั้น ดังนี้

  1. Input Student : input เป็น name, score
  2. Find Student : input เป็น name , output เป็น score
  3. Show Score : output เป็น mean, min, max
  4. Quit


ตอนเย็นของวันนี้ก็มีประชุม (พุธแรกของสัปดาห์ที่มีจันทร์แรก จะมีการประชุมของ SWAT Group)

พี่โจ้ (Assist.Group) ก็อยากให้น้องๆ นักศึกษาฝึกงานเข้าไปแนะนำตัวให้พี่ๆ รู้จัก

ก็รอจน 1 ทุ่มก็เริ่มประชุม (ชั้น 19) การประชุมวันนี้ ก็ได้รับความรู้มากมาย

  • พี่โบว์ พูดเรื่อง โยคะให้ฟัง (น่าสนใจมาก) ก็ได้ฝึกหายใจ และทำ facial yoga
  • พี่มิสซู พูดเรื่อง ASP.NET Charting Control น่าสนใจมาก สามารถสร้าง กราฟ ได้หลายรูปแบบมากๆ (รู้สึกว่า อาจจะได้ทำในโปรเจค แต่รายละเอียดยังไม่แน่ชัด)