วันพุธ, กันยายน 24, 2551

Desktop Background ทีดี

ใน gnome community มีประกวดทำ Background สำหรับ 2.24 เค้าบอกเงื่อนไขในการส่งประกวดได้น่าสนใจมาก



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

พื้นหลังที่เข้าข่ายควรมีลักษณะ 4 ข้อ ดังนี้

ไม่ทำตัวเป็นจุดสนใจ ควรจะมั่วๆ เข้าไว้ ระวันการใส่รายละเอียด อย่างเส้นคมๆ หรือตัวอักษรที่อ่านออก โดยเฉพาะอย่างยิ่ง ข้อความหรือรูปสัญลักษณ์ อย่ามองข้ามเส้นคมๆ แม้ว่าสีจะไม่โดดออกมา เพราะจะทำให้อ่านข้อความด้านหน้าได้ยาก




ไล่สี เป็นสีสว่างหรือสีนวลๆ ก็ดี แต่ต้องระวังเส้นคมๆ ที่เกิดขึ้น ถ้าเราไม่มีรูปที่เข้าข่าย ลองใช้โปรแกรมวาดรูป ไล่สีดู ยังไงก็ดีกว่าภาพสีเดียว (สร้างเองก็ได้ไม่ต้อง download)




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




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




การเลือกพื้นหลัง ไม่ได้จำกัดเฉพาะ Desktop background จะรวมไปถึงพื้นหลังของโปรแกรมด้วย เช่นพื้นหลังของ Netscape 7


จะเห็นว่าสี background ช่วยส่งเสริมให้ปุ่มกดดูเด่นมากขึ้น ด้วยการไล่สีแนวตั้ง และการใส่เงาข้าง icon

ที่มา - designing interface

วันจันทร์, กันยายน 08, 2551

Object inheritance ของ ruby

ไหนๆ เขียนเรื่อง Object แล้วถ้าไม่เขียนเรื่อง Inheritance, include module ก็จะไม่ครบวงจร การสืบทอดความสามารถของ class แม่ในภาษา ruby ใช้เครื่องหมาย "<" เป็นสัญลักษณ์ประมาณว่า เอาความสามารถของด้านขวาไปใส่ด้านซ้าย

class Circle
  attr_accessor :circle, :radious
  class << self; attr_accessor :count end
end

class Ring < Circle
end

ring = Ring.new
ring.circle = 5
puts ring.circle #=> 5
Ring.count = 3
Circle.count = 8
puts Ring.count #=> 3
puts Circle.count #=> 8  

จากตัวอย่าง Ring ได้คุณสมบัติทุกอย่างจาก Circle ทั้ง class level และ instance level แต่ไม่ได้ ใช้ค่าของ count ร่วมกัน หากต้องการให้ใช้ร่วมกันเราต้องเขียนความสัมพันธ์ขึ้นมาเอง เช่น

class Ring < Circle
  def count=(c)
    Circle.count = c  
  end
end

ใน ruby ยังมีการดึงคุณสมบัติอีกแบบโดยการ include module

module Sing   
  def wing     
    "Say wing!!"    
  end 
end  

class Circle   
  include Sing 
end  

circle = Circle.new 
circle.wing 

การ include module ก็คล้ายกับการเอา code ใน module มาใส่ไว้ใน class ช่วยลดการเขียนที่ทำซ้ำๆ กันในแต่ละ Object ได้มากทีเดียว อย่าลืมว่า Object ของ ruby จะ inherit ได้แค่ Object เดียว ถ้าต้องการมากกว่านั้นก็มา include เอา (ส่วน concept ของการเลือก include หรือ inherit ไว้ค่อยเขียนกันอีกที)

เมื่อเราเรียก method wing ใน class Circle สิ่งที่ ruby ทำคือไปหา method wing ใน Circle ก่อน หากไม่เจอ จึงไปหาใน module โดยไล่จากตัวสุดท้ายไปหาตัวแรก เมื่อไม่เจอใน module จึงขึ้นไปหาที่ Super class ของ circle ต่อไป แล้วตามไปหาใน module ของ circle เป็นลำดับ ไปจนสิ่นสุดที่ Object

ที่มา -- railstips.org 

วันเสาร์, กันยายน 06, 2551

Object ในภาษา ruby

ผมพบว่าการใช้ ruby ในการเรียนรู้เรื่อง OOP เป็นเรื่องที่สนุกทีเดียว ทุกอย่างในภาษานี้เป็น Object ไปหมด แม้แต่ nil ยังเป็น object ด้วย ในตอนแรกผมมุ่งศึกษาตัว Rails เป็นหลัก และพบว่าหากไม่ใช่ Ruby แล้ว Rails คงเกิดได้ยากมาก หากต้องการศึกษา rails ให้มากกว่านี้ผมต้องแม่นเรื่อง Object ของ Ruby ให้มากขึ้น และบทความนี้ผมจะใช้สำหรับเป็น Reference ของตัวเอง ![object](/downloads/object1.png) ทดลองสร้าง Class Circle เพื่อเป็นพิมพ์เขียวให้กับ Object circle #circle.rb class Circle @@count @radious @circle end puts Circle.class_variables #=> @@count puts Circle.instance_variables #=> @circle@radious puts Circle.count #=> undefined method `count' @@count เป็นตัวแปรของ class หรือเรียกว่า class variable ส่วน @radious และ @circle เป็นตัวแปรของ object เมื่อ object ถูกสร้างขึ้น หรือเรียกว่า instance variable ซึ่งจะอธิบายความแตกต่างอีกทีหนึ่ง สังเกตุ error ของบรรทัดสุดท้าย เราจะพบว่า ruby ไม่สามารถอ้างอิงไปที่ตัวแปรโดยตรง แต่จะถามหา method เลย แปลว่าทุกอย่างต้องผ่าน method ที่นี้ลองสร้าง method สำหรับแก้ไขตัวแปร @radious #circle.rb class Circle def radious=(r) @radious = r end def radious return @radious end end circle = Circle.new puts circle.radious #=> nil circle.radious = 4 puts circle.radious #=> 4 เนื่องจาก ruby เป็นภาษาแบบ dynamic การให้โปรแกรมเขียนโปรแกรมจึงเป็นเรื่องปกติมากๆ เช่นในกรณีนี้เราจะมีคำสั่ง attr_reader :radious ใช้เขียนคำสั่ง def radious ... attr_writer :radious ใช้เขียนคำสั่ง def radious=(r) ... attr_accessor :radious ใช้คำสั่งเดียวเขียนสองคำสั่งข้างบนเลยครับ #circle.rb class Circle attr_accessor :radious end กลับมาดูความแตกต่างของ class variable และ instance variable โดยดูจากตัวอย่าง class Circle attr_accessor :radious def count=(c) @@count = c end def count @@count end end circle_1 = Circle.new circle_2 = Circle.new circle_1.radious = 1 circle_2.radious = 2 puts circle_1.radious #=> 1 puts circle_2.radious #=> 2 circle_1.count = 1 circle_2.count = 2 puts circle_1.count #=> 2 puts circle_2.count #=> 2 จากการทดลองเราพบว่า circle_1 และ circle_2 จะใช้ class_variable ร่วมกัน เมื่อแก้ค่า count ที่ circle_1 หรือ circle_2 ค่าจึงออกมาเป็นแบบเดียว puts Circle.class_variables #=> @@count puts Circle.instance_variables #=> nil puts circle_1.instance_variables #=> @radious จากการทดลองต่อมา เราจะไม่พบ instance_variables เนื่องจาก @radious จะเกิดขึ้นก็ต่อเมื่อมีการเรียกใช้ method radious = แล้วเท่านั้น ปัญหาต่อมาคือ เราไม่สามารถรู้จำนวนวงกลม ถ้าเราไม่ประกาศ circle ขึ้นมาซักหนึ่งอันก่อน ทางแก้คือทำให้ method count กลายเป็น class method โดยใส่คำว่า self ลงไป class Circle attr_accessor :radious def count=(c) @@count = c end def self.count @@count end end circle_1 = Circle.new circle_1.count = 2 puts Circle.count #=> 2 จะเห็นว่าเราสามารถรู้ค่าของ count ได้โดยไม่ต้องประกาศ circle ขึ้นมาอีกตัว ถ้าต้องการให้ ruby เขียน code แทนให้ลองทำแบบนี้ครับ class Circle attr_accessor :radious class << self; attr_accessor :count end end แบบนี้ทั้ง count และ count= จะเป็น class variable ทั้งคู่ สรุปว่าตอนนี้ ruby ของเรามี * **class variable** เป็นตัวแปรของ class ทุก instance จะใช้ตัวแปรนี้ร่วมกัน * **class method** เป็น method ของ class เช่นเดียวกับ class variable * **instance variable** เป็นตัวแปรที่จะใช้ได้เมื่อ class ถูกประกาศขึ้นมาแล้ว * **instance method** ใช้ได้แบบเดียวกับ instance variable เลือกใช้งานกันตามความเหมาะสมนะครับ