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

ไฟล์ต่างๆ ในระบบ unix จะแบ่งเป็นชั้นๆ ส่วนบนสุดคือ / หรือที่มักจะเรียกกันว่า root directory ถ้าไปลอง ls ดูที่ root ก็มักจะเห็นไฟล์หรือโฟล์เดอร์เหล่านี้

/bin ย่อมาจาก binary เป็นหนึ่งในหลายแห่ง ที่เก็บโปรแกรมแอพลิเคชันและยูทิลิตี้ต่างๆ แต่โปรแกรมที่อยู่ใน /bin มักเป็นโปรแกรมสำคัญที่ใช้บ่อยในการทำงานของระบบ ตัวอย่างเช่น โปรแกรม shell หรือ โปรแกรมจัดการไฟล์อย่าง cp และ chmod เป็นต้น

/sbin นี่ก็ใช้เก็บโปรแกรมเหมือนกัน แต่ว่าจะเป็นเฉพาะโปรแกรมที่ถูกใช้โดย superuser เท่านั้น ซึ่งก็เป็นที่มาของชื่อด้วย คือ superuser-bin

/dev ย่อมาจาก device เป็นที่เก็บไฟล์ที่เกี่ยวข้องกับฮาร์ดแวร์ของระบบ เช่น จอภาพ, คีย์บอร์ด ฮาร์ดดิสก์ หรือ usbport รวมถึงพอร์ทต่างๆ ด้วย

/etc เอาไว้เก็บพวกไฟล์ที่เป็น system configuration ทั้งหลาย

/home เป็นที่เก็บโฮมไดเร็กทอรีของผู้ใช้ทั้งหลาย โดยจะมีการแบ่งย่อยลงไปอีกตามชื่อ login เช่น ผู้ใช้ที่มีชื่อล็อกอินเป็น joe จะมีโฮมไดเร็กทอรีเป็น /home/joe

/lib ย่อมาจาก library ซึ่งเอาไว้เก็บไฟล์ system library สำคัญๆ ทั้งหลาย ในระบบ Unix พวกไลบรารีเหล่านี้จะแชร์กันระหว่างโปรแกรม โดยไม่ได้รวมไว้ในไฟล์ binary แต่จะถูกโหลดมาใช้เมื่อต้องการเท่านั้น ดังนั้นการลบหรือย้ายที่ไฟล์ใน /lib แม้เพียงไฟล์เดียว อาจส่งผลให้โปรแกรมเป็นจำนวนมากไม่สามารถใช้งานได้

/mnt ย่อมาจาก mount เป็นไดเร็กทอรีมาตรฐานในการพ่วงอุปกรณ์เก็บข้อมูลอย่างฮาร์ดดิสก์ ถ้าต้องการดูว่ามีอุปกรณ์เก็บข้อมูลอะไรพ่วงอยู่บ้าง สามารถเรียกใช้คำสั่ง mount ได้

/tmp ย่อมาจาก temporary เป็นที่เก็บไฟล์ชั่วคราวของระบบ อะไรที่อยู่ในนี้ ถือว่าสามารถลบทิ้งได้ถ้าเสร็จงานแล้ว

/usr ไดเร็กทอรีนี้ค่อนข้างจิปาถะ เก็บตั้งแต่แอพลิเคชันของยูสเซอร์อย่างเกม หรือโปรแกรมวาดภาพ ไปจนถึงฟีเจอร์ต่างๆ ของระบบอย่างเช่นระบบช่วยเหลือเป็นต้น  โดยทั่วไปจะถือว่าเป็นไฟล์ที่มีประโยชน์ แต่ไม่ได้จำเป็นถึงกับขาดไม่ได้ในการทำงานของระบบ

/var ย่อมาจาก variable เป็นที่เก็บของไฟล์ต่างๆ ที่มักจะเพิ่มจำนวนขึ้นเรื่อยๆ ตามเวลา เช่น เมล์ log file และไฟล์ฐานข้อมูล เป็นต้น

ที่มา : Ramble around the UNIX file system

ได้รับคำถามว่าจากทีมงานที่กำลังทำ migration รายงานชุดหนึ่งไปยัง platform ใหม่ คำถามคือ ในรายงานเดิม แสดงค่าบางค่าเป็นศูนย์ (เพราะข้อมูลใน data warehouse มีค่าเป็นศูนย์) แต่ในรายงานใหม่ จะใช้เป็นค่าว่าง (NULL) แทนได้หรือไม่? นัยว่าจะมีส่วนช่วยในการเพิ่มความเร็วในการสร้างรายงาน แถมยกตัวอย่างเป็น Excel มาให้ดูด้วยว่า เป็น zero หรือเป็น null มันก็ให้ค่า MTD (ย่อมาจาก Month-to-date) หรือค่า total เท่ากัน

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

ความหมายในเชิงธุรกิจของค่าทั้งสองนี้ก็แตกต่างกันด้วย

  • Zero : มีค่าเท่ากับศูนย์ ถ้าเป็นยอดขาย ก็หมายความว่าขายไม่ได้เลย ถ้าเป็นจำนวนสต็อกสินค้า ก็หมายความว่า สินค้าหมดแล้ว
  • Null : ว่าง “ไม่มีค่า” แตกต่างจากมีค่าเป็นศูนย์นะครับ ในส่วนของยอดขาย อาจจะหมายถึง “ไม่ได้ทำการขาย” หรือขายแต่ไม่ได้จดบันทึก ถ้าเป็นสต็อกอาจจะหมายถึง “ไม่ได้นับสินค้าตัวนี้” หรือที่เห็นกันเป็นประจำก็คือ มีข้อมูลแหละ แต่ดันบังเอิญ เจ้ากรรมข้อมูลของวันนั้นส่งมาไม่ได้ ด้วยสาเหตุอะไรก็ตามที

ค่าทั้งสองจะมีลักษณะเหมือนกัน ถ้ามองจากการรวมผลโดยวิธีบวก หรือ Sum เพียงอย่างเดียว เหมือนอย่างที่เห็นในช่อง Total และ MTD ทำให้หลายๆ คนเข้าใจผิดว่าสองค่านี้มีความหมายเดียวกัน

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

September 23rd, 2008Learn Microsoft BI Video

วันนี้ผ่านไปเจอเว็บไซต์ที่ให้บริการดาวน์โหลดวีดีโอเกี่ยวกับ Microsoft Business Intelligence โดยเฉพาะครับ ชื่อ Learn Microsoft BI Video ต้องลงทะเบียนก่อน แต่ฟรีนะครับ มีตัวอย่างให้ลองดาวน์โหลดมาดูคุณภาพก่อนได้ นอกเหนือจากส่วนที่เจาะจงเป็นเทคโนโลยีของไมโครซอฟต์แล้ว ยังมีส่วนที่เป็นความรู้ทั่วไปเกี่ยวกับ business intelligence ด้วย ตอนนี้มีวีดีโออยู่ 18 รายการแต่ดูท่าทางจะยังมีเพิ่มขึ้นมาเรื่อยๆ

เอารายการวีดีโอที่มีอยู่มาโชว์เรียกน้ำย่อย

  • The first video is a twelve minute introduction entitled “What is Business Intelligence?” This video covers what is meant by terms such as data warehousing and business intelligence and why companies undertake such projects.
  • The second video is a 34 minute overview of how a single data warehouse can be used to deliver business value to a wide variety of users through scorecards, dashboards, reports, analytic applications, and custom applications.
  • The third video discusses the process of data warehousing, from the initial problem definition through the creation of the cubes and delivery of the data. This video runs 19.5 minutes.
  • The fourth video is “Why Business Intelligence Projects Fail (and what you can do about it).” This covers some of the primary reasons that BI projects fail along with tips for addressing the problems. This video is 32.5 minutes in length.
  • The fifth video is “Introduction to Business Intelligence Development Studio” and covers the primary tool used to create data warehouses. This is the environment for creating SSIS packages, SSAS cubes, and SSRS reports. This video runs 15.5 minutes.
  • The sixth video is an introduction to Analysis Services. It briefly discusses the two primary purposes of Analysis Services: building cubes and building mining models. The video runs 6.5 minutes.
  • The seventh video is a SQL Server Analysis Services video called “Creating Projects and Data Sources.” The video discusses the different types of Analysis Services projects and the options for creating them. It then discusses the creation of data sources and the various settings and considerations for handling authentication and impersonation. This video runs 17 minutes.
  • The eighth video covers the topic of Data Source Views (DSVs) in Analysis Services projects. DSVs are powerful, logical views of the schema on which the cube will be built. This video covers the creation of the DSV as well as manipulating the schema. This video runs 21 minutes.
  • The ninth video discusses the Cube Wizard for Analysis Services 2005. The Cube Wizard creates cubes but can also create dimensions, and populate those dimensions with attributes and hierarchies. This video will be followed by one specific to Analysis Services 2008 because of the significant differences in the Cube Wizard between versions. This video runs 16.5 minutes.
  • The tenth video shows the Cube Wizard for Analysis Services 2008. The Cube Wizard for 2008 is greatly simplified from the one in 2005 and takes a minimalist approach to creating dimensions. This video runs 12.5 minutes.
  • The eleventh video follows up on the Cube Wizard videos. The video explains the build, deployment, and processing pieces by deploying and processing the simple cube created in the previous videos. The video then covers browsing the data to verify the cube structure. This video runs 23 minutes.
  • The twelfth video shows the creation of dimensions using the Dimension Wizards in both SSAS 2005 and SSAS 2008. After creating a dimension, the difference between a database dimension and cube dimension is explored, along with several of the attributes of a dimension. Finally, properties of the attributes are examined along with a discussion of what will follow in future videos. This video runs 42.5 minutes.
  • The thirteenth video follows up on the twelfth by adding hierarchies to the dimensions created in the previous video. There is a discussion of why hierarchies should be created, then a demonstration of how to do it. Some properties are examined to change the name of the All level of the hierarchy, as well as to hide the All level. This video runs 25 minutes.
  • The fourteenth video is “Attribute Relationships” and covers an extremely important topic in dimension design. You’ll learn why attribute relationships are so important, how to create them, and some of the challenges you might have in working with them. Demonstrations in both SSAS 2005 and SSAS 2008 are provided. This video runs 57.5 minutes.
  • The fifteenth video is “Dimension Usage” and discusses how cubes handle multiple fact tables when the facts have different dimensionality. You’ll discover why you need multiple fact tables, how dimensions can be related to measure groups, and how to handle unrelated dimensions when viewing facts. This video runs 19 minutes.
  • The sixteenth video is “Aggregation Basics in SSAS 2005″ and covers why you want to create aggregations and how to use the aggregation wizard. A discussion of the “one-third rule” is included. This video runs 24 minutes.
  • The seventeenth video is “Aggregation Basics in SSAS 2008″ and covers why you want to create aggregations and how to use the new aggregation wizard, including the Aggregation Usage page. A discussion of the “one-third rule” is included. This video runs 25 minutes.
  • The eighteenth video is “Introduction to PerformancePoint Server.” and discusses the three modules of PerformancePoint Server: Monitoring, Analytics, and Planning. It describes how the three modules fit together to form a complete solution for keeping tabs on business performance. This video runs 21 minutes.

เว็บไซต์ SQL Server Videos ให้บริการวีดีโอฟรีเกี่ยวกับ MS SQL Server ที่น่าสนใจเพราะการจัดทำวีดีโอแต่ละตอน จะมุ่งเน้นงานอย่างใดอย่างหนึ่ง และมีการจัดหมวดหมู่ของวีดีโอไว้หลายแบบ เช่น แบ่งเป็น series แบ่งตาม skill level หรือแบ่งตาม audience เป็นต้น ใครกำลังเรียนรู้หรืออยากเพิ่มทักษะตัวเองด้าน MS SQL น่าจะได้ประโยชน์

How to Mind Map วิธีเขียน Mind Map ฉบับเจ้าสำนัก

Mind Map เป็นเครื่องมือในการช่วยพัฒนาความคิดและความจำ ซึ่งได้รับการพัฒนาโดยโทนี่ บูซานมานานหลายสิบปีแล้ว และเข้ามาแพร่หลายในเมืองไทยหลายปีทีเดียว มีการใช้ Mind Map โดยผู้บริหารและบุคคลสำคัญหลายคน ตลอดจนมีการนำไปใช้งานในองค์กรหลายแห่ง

สำหรับท่านที่ยังไม่รู้จักว่า Mind Map คืออะไร มีประโยชน์อย่างไร และใช้งานอย่างไร ผมอยากแนะนำให้อ่านหนังสือเล่มนี้ How to Mind Map วิธีเขียน Mind Map ฉบับเจ้าสำนัก โดยโทนี่ บูซาน

หนังสือเล่มนี้อธิบายประวัติความเป็นมาของ Mind Map ประโยชน์ และวิธีการเขียน Mind Map อ่านเข้าใจง่าย และมีภาพประกอบเป็นจำนวนมากครับ รูปเล่มก็เล็ก พกสะดวก ใช้เวลาอ่านไม่นานก็จบ และสามารถเริ่มใช้งาน Mind Map ได้ทันที

ข้อมูลเพิ่มเติมเกี่ยวกับ Mind Map

http://www.mindmap.in.th/
http://en.wikipedia.org/wiki/Mind_map

คราวที่แล้วเอาสไลด์ชุด Data Warehouse 101 มาฝาก วันนี้เป็นบทที่สองจากหนังสือเล่มเดิมนั่นแหละครับ ที่จริงก็ทำไว้แค่สองบทเท่านั้นเอง เป็นการปูพื้น บทที่สองนี้มีชื่อเรียกโดยเฉพาะว่า Business Dimensional Life Cycle เป็นกระบวนการจัดการโครงการที่ทาง The Kimball Group คิดขึ้นมา  มาจนถึงปัจจุบัน วิธีการนี้ก็ไม่ได้แปลกใหม่อะไรเลย แต่ผมคิดว่ายังมีประโยชน์สำหรับคนที่เริ่มทำงานเกี่ยวกับ data warehouse project เป็นครั้งแรก เพราะทำให้มองเห็นภาพได้ชัดเจนว่า โดยรวมๆ แล้ว มีอะไรที่จำเป็นต้องทำบ้าง

Data Warehouse 102

View SlideShare presentation or Upload your own. (tags: basic data)

Bitmap Index เป็นอินเด็กซ์แบบหนึ่งซึ่งเริ่มมีใช้ตั้งแต่ Oracle 7.3 เป็นต้นมา โดยมีลักษณะสำคัญคือมีอัตราการบีบอัดข้อมูลที่สูงมาก ทำให้เหมาะต่อการใช้งานด้านดาต้าแวร์เฮาส์ และ OLAP มากกว่าอินเด็กซ์แบบ B-Tree ที่รู้จักกันโดยทั่วไป

ลักษณะของ Bitmap Index

Bitmap index ถูกออกแบบมาให้ใช้สำหรับคอลัมน์ที่มีลักษณะ low cardinality หรือมีค่าที่เป็นไปได้สำหรับคอลัมน์นั้นจำนวนน้อยๆ เมื่อเทียบกับจำนวนเรคอร์ดในตารางนั้น สัดส่วนจำนวนค่าที่เป็นไปได้ของคอลัมน์เทียบกับจำนวนเรคอร์ด เรียกว่า cardinality คอลัมน์ที่มี cardinality = 0.4% หมายความว่า ในตารางขนาด 1000 เรคอร์ด คอลัมน์นั้นมีค่าที่แตกต่างกัน 4 ค่า
Bitmap Index เหมาะอย่างยิ่งกับการใช้ร่วมกันคอลัมน์ที่ มี caridnality ต่ำๆ เช่น 0.2% - 1% เป็นต้น อินเด็กซ์ที่ถูกสร้างขึ้นจะประกอบด้วยบิทต่างๆ เพื่อให้แทนค่าในคอลัมน์ที่ถูกทำอินเด็กซ์ของแต่ละแถว ตัวอย่างเช่น คำสั่ง

create bitmap index person_region on person (region);

จะสร้างอินเด็กซ์ในลักษณะเช่นนี้

        Row     Region   North   East   West   South
        1       North        1      0      0       0
        2       East         0      1      0       0
        3       West         0      0      1       0
        4       West         0      0      1       0
        5       South        0      0      0       1
        6       North        1      0      0       0

ข้อดีของ Bitmap Index

  • เรียกใช้งานได้รวดเร็วกว่า ทั้งนี้เนื่องจากการทำงานจะใช้ bitwise operator หรือการจัดการข้อมูลเป็นบิท ซึ่งจะทำงานได้เร็วกว่าการเปรียบเทียบทางคณิตศาสตร์โดยทั่วไป
  • ขนาดของอินเด็กซ์เล็กกว่า B-Tree index มาก เนื่องจาก Bitmap มีลักษณะการบีบอัดที่สูงมาก ดังนั้นจึงใช้เนื้อที่ในการเก็บอินเด็กซ์เล็กด้วย bitmap index อาจจะมีขนาดเพียงแค่ 1% (1 ใน 100) เทียบกับขนาดของ B-Tree index ก็ได้ แต่อย่างไรก็ตาม การประหยัดเนื้อที่ดิสก์ไม่ควรจะเป็นเหตุผลหลักในการเลือกใช้ bitmap index เพราะยังมีผลกระทบหรือข้อควรพิจารณาอย่างอื่นด้วย

ข้อเสียของ Bitmap Index

  • Bitmap Index จะต้องใช้กำลังการประมวลผลจาก CPU สูงมากหากต้องมีการ insert หรือ update ข้อมูลในตาราง เพราะจะต้องทำการอ่านอินเด็กซ์ นำมา decompress เปลี่ยนแปลงค่าอินเด็กซ์แล้ว compress กลับไปเก็บไว้ในดิสก์อีกครั้ง ดังนั้นจึงไม่เหมาะอย่างยิ่งสำหรับตารางที่มีการเปลี่ยนแปลงข้อมูลบ่อยๆ แต่จะเหมาะสำหรับตารางที่เป็น read-only

เมื่อไหร่ควรจะใช้ Bitmap Index

แนวทางในการพิจารณาว่าควรจะใช้ Bitmap Index แทนที่ B-Tree Index หรือไม่ ประกอบด้วย

  • ตารางนั้นมีการ insert/update ข้อมูลบ่อยเพียงใด หากมีการเปลี่ยนแปลงข้อมูลบ่อยมากๆ อย่างเช่นในระบบที่ทำงานแบบ online real time ที่มีการเปลี่ยนแปลงสถานะของข้อมูลบ่อยๆ การใช้ bitmap index จะส่งผลให้เกิดภาระต่อ CPU ในการ update index สูงกว่า B-Tree Index แต่สำหรับในระบบดาต้าแวร์เฮ้าส์ที่ข้อมูลไม่มีการเปลี่ยนแปลงเลย หรือเปลี่ยนน้อยมากๆ จะเหมาะกับใช้ bitmap index มากกว่า
  • ตารางนั้นมีค่า cardinality มากน้อยเพียงใด ดังที่ได้อธิบายไว้ก่อนหน้านี้แล้ว cardinality ของตารางยิ่งต่ำ ยิ่งเหมาะที่จะทำ bitmap index หาก cardinality ของตารางมีค่าสูงกว่า 1% ก็ไม่ควรทำ bitmap index บนตารางนั้น หากคุณเคยมีประสบการณ์ในการสร้างอินเด็กซ์บน OLTP (Online-Transactional Processing) มาก่อน คงอาจจะสงสัย เพราะหลักเกณฑ์ในการสร้างอินเด็กซ์แตกต่างกัน  ในระบบ OLTP คอลัมน์ที่ควรจะสร้างอินเด็กซ์ ควรจะมี high cardinality อาทิเช่น order id, หรือ row id เป็นต้น เพราะระบบ OLTP สนับสนุนการ insert/update และ delete ข้อมูลเป็นหลัก  ในขณะที่ระบบสนับสนุนการตัดสินใจเช่นดาต้าแวร์เฮ้าส์ ซึ่งเหมาะจะใช้ bitmap index มากกว่า จะเน้นไปที่ความรวดเร็วในการเข้าถึงและเรียกค้นข้อมูล และไม่มีการเปลี่ยนแปลงข้อมูลมากนัก

หวังว่าความรู้เบื้องต้นเกี่ยวกับ bitmap index คงเป็นจุดเริ่มต้นให้ทำความเข้าใจฟีเจอร์ที่มีประโยชน์นี้ได้บ้าง  ใครเคยมีประสบการณ์ในการทำงานกับ bitmap index ก็มาเล่าสู่กันฟังบ้างนะครับ

สังเกต เห็นว่าเครื่อง Eee PC เริ่มทำงานช้าลง โดยเฉพาะอย่างยิ่งหลังจากบูตเครื่องใหม่ จากที่เคยเริ่มใช้งานได้เลย ผ่านไปซักเดือนกว่าๆ สังเกตได้ว่าต้องรอพักใหญ่กว่าเครื่องจะเริ่มรับคำสั่ง ตอนแรกก็ไม่รู้หรอกว่าเกิดอะไรขึ้น ต้องเสียเวลาจับสังเกตเอาโดยการเปิด Task Manager เอาไว้แล้วก็นั่งมองดูว่ากำลังทำอะไรอยู่ พบว่าหนึ่งในสาเหตุก็คือการที่ Windows XP กำหนดให้มีการตรวจสอบทุกครั้งว่ามี update อะไรใหม่ๆ มาบ้าง แล้วก็ดาวน์โหลดมาติดตั้งโดยอัตโนมัติ ผมอยากให้น้อง Eee กลับมาทำงานว่องไวเหมือนเดิม ก็เลยไปปิด หรือ Disable Automatic Updates เสีย

วิธีการก็ง่ายๆ ครับ แต่ใช้เมาส์คลิกขวาไปที่ My Computer แล้วเลือก Properties แท็บ Automatic Updates เลือกตัวเลือก Turn off Automatic Updates ก็เป็นอันเสร็จ เพียงแต่ว่านับจากนี้ไป ก็เป็นการเพิ่มความเสี่ยงที่เครื่องคอมพิวเตอร์ของเราอาจจะถูกโจมตีจากภาย นอกได้ง่ายขึ้น เราอาจจะต้องเพิ่มความระมัดระวังและคอยอัพเดตเป็นระยะๆ เท่านั้นเอง

ช่วงนี้คิดว่าคงออกนอกเรื่องไปหน่อย แต่เอาเป็นว่า เขียนไว้กันตัวเองลืมด้วยก็แล้วกัน และเผื่อใครเจอปัญหาอย่างที่ผมเจอ จะได้รู้วิธีแก้  ผมมีความจำเป็นต้องติดตั้ง web server ตัวเล็กๆ ให้ทำงานอยุ่บน Windows XP เพื่อทดสอบงานด้าน Python โดยจำเป็นต้องเรียกใช้จาก Command Prompt หรือที่คนรุ่นเก่าๆ อาจจะเคยเรียกว่า DOS Prompt แล้วก็พิมพ์คำสั่งเอา และเพื่อความสะดวก ก็จำเป็นต้องกำหนดตัวแปร Path เพื่อให้สามารถเรียกใช้โปรแกรมจากไดเร็กทอรีต่างๆ กันได้โดยไม่จำเป็นต้องอ้างชื่อไดเร็กทอรียาวๆ

การกำหนดตัวแปร Path ใน command prompt ทำได้ง่ายๆ คือ พิมพ์คำสั่ง path= ตามด้วยชื่อไดเร็กทอรี หรือถ้าจะเพิ่ม ก็ใช้เป็น Path=%Path%; แล้วตามด้วยไดเร็กทอรีที่ต้องการเพิ่ม ทีนี้ที่น่ารำคาญคือพอปิด Command Shell ไปแล้วมาเปิดใหม่ ก็ต้องมานั่งกำหนดกันใหม่ ทำยังไงให้สามารถมีค่าตัวแปร Path เป็นอย่างที่ต้องการได้เลยทุกครั้งที่เรียกใช้ cmd shell ?

ค้นกูเกิลนิดหน่อยก็ได้คำตอบแล้วครับ

  1. คลิ้กเมาส์ปุ่มขวาที่ไอคอน My Computer แล้วเลือกคำสั่ง Properties
  2. เลือกแท็บ Advanced
  3. คลิ้กปุ่ม Environment Variables
  4. จะเห็นไดอะล็อกบ็อกซ์ Environment Variables เลือกตัวแปร Path แล้วคลิ้ก edit

จะมีสองส่วนนะครับ คือส่วนที่เป็น User-specific กับส่วนที่เป็นของระบบ ถ้าใช้ส่วนตัวก็เลือกที่เป็น user-specific ด้านบนก็พอแล้ว

นานๆ ต้องมาเขียนโค้ดเองเสียที ก็ชักขึ้นสนิมเหมือนกัน เช้านี้เริ่มต้นด้วยโจทย์ที่ว่าต้องการเขียน function บน Oracle PL/SQL ที่รับข้อมูลเป็นวันที่ แล้วส่งค่ากลับมาเป็นจำนวนสัปดาห์ในเดือนที่วันที่นั้นอยู่ ดูตัวอย่างดีกว่า

จากปฏิทินที่ว่านี้ สมมติว่าเรากำหนดให้วันเริ่มต้นของสัปดาห์เป็นวันอาทิตย์ หมายถึงว่าหนึ่งสัปดาห์มีตั้งแต่วันเสาร์จนถึงวันอาทิตย์ เพราะฉะนั้น วันนี้ (27 มีนา) ก็จะเป็นวันที่อยู่ในสัปดาห์ที่ 5 ของเดือนมีนาคม

วิธี นับ week แบบนี้มีให้เห็นอยู่เหมือนกัน แต่ที่ควรระวังก็คือ บางทีมันก็ทำให้เำกิดสัปดาห์ที่ 6 ของเดือนได้เหมือนกัน อย่างเดือนนี้ ตามนิยามข้างต้น วันที่ 30 กับ 31 จะตกอยู่ในสัปดาห์ที่ 6

ดังนั้นฟังก์ชันนี้ควรจะทำงานดังนี้

  • ใส่ค่าวันที่ 27 มีนา ส่งค่าคืนเป็น 5
  • ใส่ค่าวันที่ 31 มีนา ส่งค่าคืนเป็น 6
  • ใส่ค่าวันที่ 1 มีนา คืนค่าเป็น 1

ตอน แรกก็กะจะเขียนเอง แต่พอลองร่างคร่าวๆ สงสัยต้องเขียนเป็น loop แฮะ อย่ากระนั้นเลย มันน่าจะมีใครซักคนเคยเขียนฟังก์แบบนี้ออกมาแล้วแน่ๆ ก็เลยค้น google ด้วยคำว่า plsql counting number of weeks ก็เลยมาเจอบทความชิ้นนี้ SQL: Find the Week Number in a Month ผมยกโค้ดของเขามาอธิบายเลยก็แล้วกันนะครับ เพราะเข้าใจได้ไม่ยากเลย

เริ่ม แรกก็หาวันเริ่มต้นของเดือนก่อน โดยใช้ฟังก์ชัน trunc ซึ่งจะปัดเศษวันและเวลาตามพารามิเตอร์ที่ใส่เข้าไป ‘MM’ นี่หมายถึงปัดเศษเป็นเดือนนะครับ

SQL> select trunc(sysdate, 'MM') from dual;
TRUNC(SYS
———
01-FEB-06

แล้ว ก็ใช้ฟังก์ชัน NEXT_DAY เพื่อหาวันในสัปดาห์ถัดไป ฟังก์ชันนี้จะรับพารามิเตอร์ตัวที่สองเป็น วันของสัปดาห์ เช่น Sunday เพราะฉะนั้น select next_day(trunc(sysdate, 'MM'), 'Sunday') from dual ก็จะให้ค่าเป็น วันอาทิตย์แรกของเดือน พอนับย้อนหลังไปเจ็ดวัน ก็จะได้วันเริ่มต้นสัปดาห์แรกของเดือน

SQL > select next_day(trunc(sysdate, 'MM') - 7, 'Sunday') from dual;

NEXT_DAY(
———
29-JAN-06

จาำก จุดนี้เราก็สามารถหาได้แล้วว่าวันที่ปัจจุบัน ห่างจากวันเริ่มต้นของสัปดาห์แรกของเดือนเป็นจำนวนกี่วัน และคิดเป็นกี่สัปดาห์ได้ด้วยกันหาร 7 ปัดเศษทิ้งแล้วบวกด้วย 1 เพื่อให้เริ่มนับสัปดาห์แรกเป็นสัปดาห์ที่ 1

SQL> select sysdate - next_day(trunc(sysdate, 'MM') - 7, 'Sunday') from dual;

SYSDATE-NEXT_DAY(TRUNC(SYSDATE,’MM’)-7,’SUNDAY’)
————————————————
3.55945602

SQL> select (sysdate - next_day(trunc(sysdate, ‘MM’) - 7, ‘Sunday’))/7 from dual;

(SYSDATE-NEXT_DAY(TRUNC(SYSDATE,’MM’)-7,’SUNDAY’))/7
—————————————————-
.508627646

SQL> select trunc(((sysdate - next_day(trunc(sysdate, ‘MM’) - 7, ‘Sunday’))/7),0) + 1
from dual;

TRUNC(((SYSDATE-NEXT_DAY(TRUNC(SYSDATE,’MM’)-7,’SUNDAY’))/7),0)+1
—————————————————————–
1

ถัด จากนี้ก็เอา logic ที่ว่านี่แหละ มาเขียนเป็นฟังก์ชัน โดยกำหนด default parameter และกำหนดให้สามารถเปลี่ยนวันเริ่มต้นของสัปดาห์ได้ด้วย

CREATE OR REPLACE FUNCTION week_in_month
(check_date DATE DEFAULT sysdate, week_start CHAR DEFAULT ‘Sunday’)
RETURN number
IS
week_number NUMBER;
BEGIN
select trunc(((check_date - next_day(trunc(check_date, ‘MM’) - 7, week_start))/7),0) + 1 into week_number from dual;
RETURN week_number;
END;
/

ลองเอาไปใช้ดูนะครับ ถ้าใช้แล้วถูกใจยังไง ตามไป comment ขอบคุณคุณ Jon เจ้าของโค้ดหน่อยก็ดีนะครับ เค้าจะได้มีกำลังใจ


© 2007 BzInsight | iKon Wordpress Theme by Windows Vista Administration | Powered by Wordpress