หน้าเว็บ

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

สร้าง icon สำหรับ shutdown และ restart

1. คลิกขวาที่ Desktop>New…>Shortcut
2. จะมีหน้าต่าง Create Shortcut ขึ้นมา ให้ใส่ C:\Windows\System32\shutdown.exe –s –f –t 00
    (Copy ไปใส่เลยก็ได้ครับ จะได้เว้นวรรคถูกต้อง) ถ้าต้องการสร้างปุ่ม Restart เปลี่ยนเป็น –r –f –t 00 เสร็จแล้วคลิก Next
3. ตั้งชื่อ Shortcut ที่ต้องการ แล้วคลิก Finish ครับ


ที่มา : http://ton-blog.blogspot.com/2008/10/shutdown-shutdown-restart-desktop.html

สรุปคีย์ลัดใน Windows 7 ที่ใช้งานบ่อย

- ปุ่ม Windows+ลูกศรขึ้น = ขยายเต็มหน้าจอ
- ปุ่ม Windows+ลูกศรซ้าย = จัดเรียงหน้าต่างไว้ทางซ้ายของจอ
- ปุ่ม Windows+ลูกศรขวา = จัดเรียงหน้าต่างไว้ทางขวาของจอ
- ปุ่ม Windows+ลูกศรล่าง = ย่อหน้าต่างลงเป็นขนาดปกติ กดอีกครั้งเพื่อย่อลงที่ทาสก์บาร์
- ปุ่ม Windows +เครื่องหมายบวก = ซูมขยายหน้าจอให้ใหญ่ขึ้น
- ปุ่ม Windows +เครื่องหมายลบ = ซูมย่อหน้าจอให้เล็กลงแต่ไม่ต่ำกว่า 100%
- ปุ่ม Windows+Home = ย่อทุกหน้าต่างลง ยกเว้นหน้าต่างที่กำลังทำงาน/กดอีกครั้งเพื่อเรียกคืน
- ปุ่ม Windows+Space = แอบดูหน้าเดสก์ท็อป
- ปุ่ม Windows+Tab = เปิดคุณสมบัติ แอร์โร่ ทาสก์ สวิชเชอร์ เพื่อสลับหน้าต่างแบบใหม่
- ปุ่ม Windows+Pause/Break = เปิดดูคุณสมบัติของเครื่อง
- ปุ่ม Shift+คลิกไอคอนบนทาสก์บาร์ = เปิดโปรแกรมดังกล่าวในหน้าต่างใหม่
- ปุ่ม Windows+D = แสดงหน้าเดสก์ท็อป กดอีกครั้งเพื่อเรียกคืนหน้าเดิม
- ปุ่ม Windows+E = แสดง วินโดว์เอ็กซพลอเร่อ
- ปุ่ม Windows+F = แสดงหน้าต่างค้นหา
- ปุ่ม Windows+G = ทำให้แก็ดจิทลอยอยู่หน้าสุด
- ปุ่ม Windows+L = ล็อคเครื่องคอมพิวเตอร์ในกรณีที่ตั้งรหัสผ่าน
- ปุ่ม Windows+M = ย่อทุกหน้าต่างลงเก็บไว้ที่ ทาสก์บาร์ กด Windows+Shift+M เพื่อเรียกคืน
- ปุ่ม Windows+P = ปรับตัวเลือกสำหรับการแสดงหลายหน้าจอ
- ปุ่ม Windows+R = แสดงหน้าต่าง Run
- ปุ่ม Windows+T = แสดง Thumbnail ของโปรแกรมที่ทำงานอยู่โดยไม่ต้องใช้เมาส์
- ปุ่ม Windows+X = แสดงหน้าต่าง Windows Mobility Center (สำหรับโน้ตบุค)
- ปุ่ม Windows+เลข 0-9 = เปิดโปรแกรมบนทาสก์บาร์ โดย 0=10 นับจากซ้ายไปขวา

ที่มา : http://www.wsrschool.com/article.php?id=1

วันเสาร์ที่ 24 มกราคม พ.ศ. 2558

วิธีแก้ไอคอนลำโพงหาย Windows 7

วิธีแก้ไอคอนลำโพงหาย Windows 7 (By SeasonTV Channel)
1. คลิ๊กขวาที่ My Computer, จากนั้นเลือก Manage.
2. คลิ๊ก Services and Applications.
3. ดับเบิ้ลคลิ๊กที่ Services.
4. เลื่อนลงมาเรื่อย ๆ ตรงรายชื่อ, คลิ๊กขวาของ service ที่ชื่อ SSDP Discovery Service, จากนั้นเลือก Properties.
5. ในแทบ General , ตรงหัวข้อ Startup type ให้คลิ๊กเลือก Disabled.
6. จากนั้นกด OK. รีสตาร์ทคอม 1 รอบเป็นอันเสร็จ

วันศุกร์ที่ 23 มกราคม พ.ศ. 2558

5 สิ่งที่ควรหยุดทำกับ jQuery

1. การเลิกใช้ Document ready
2. หยุดใช้การวนรอบแบบผิด ๆ
3. เลิกใช้ “this”
4. เลิกใช้ jQuery แบบเต็ม ๆ
5. ไม่ใช้ jQuery ตอนที่ไม่จำเป็น

ที่มา : 5 สิ่งที่ควรหยุดทำกับ jQuery

YEOMAN TUTORIAL - Master Front-End Workflow with Yeoman, Grunt and Bower




Youtube : LearnCode.academy

สอน AngularJS - เริ่มต้นใช้งาน AngularJS




Youtube : tutor4dev

วันศุกร์ที่ 16 มกราคม พ.ศ. 2558

Get Date or Time for, Server

  • Oracle
    SELECT TO_CHAR(CURRENT_DATE, 'DD-MON-YYYY HH:MI:SS') FROM DUAL; 
    or
    SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY HH:MI:SS') FROM DUAL;
  • MySQL
    SELECT CURDATE();
  • SQL Server
    SELECT GETDATE()
    GO

ที่มา: http://stackoverflow.com

วันพุธที่ 14 มกราคม พ.ศ. 2558

การใช้ Git ฉบับรีบร้อน

การใช้ Git ฉบับรีบร้อน

Git

Git เป็น revision control แบบ distributed (หมายความว่าไม่มีศูนย์กลาง) และ แบบ non-linear history (หมายความว่ามีประวัติการเปลี่ยนแปลงแบบไม่ใช่เส้นตรง) ดังนั้นทำให้คอนเซปต์ของ Git นั้นต่างจาก revision control รุ่นก่อนหน้าหลายอย่าง
ต่อไปจะอธิบายย่อๆเรื่องคำสั่ง Git โดยอิงกับการทำงานใน GitHub เป็นสำคัญ (Git มีวิธีใช้พลิกแพลงมากมาย ไปศีกษาการใช้อื่นได้ด้วยการไป Google เอาเอง)

clone

สมมุติว่ามี repository แห่งนีงใน GitHub เช่น https://github.com/norsez/projectA
เวลาเราจะใช้โค้ดใน repository นี้ เรา clone

clone Vs. checkout

ให้สังเกตุว่า การ clone ต่างจาก checkout ใน revision control แบบ linear history เช่น SVN ตรงที่ ใน SVN repository มีที่เดียวเป็นศูนย์กลาง สิ่งที่ checkout เป็นเพียงแค่ working directory ส่วนตัวของเรา
แต่ใน Git การ clone เราได้ทั้งตัว repository และ working directory อันนี้ทำให้เราได้ history graph มาเป็นของเราเอง เราเรียก repository ที่ต้นทางว่า origin repository (หรือ remote repository หากอยุ่ต่าง network จากเรา เช่น GitHub เองเป็นต้น) ส่วน repository ที่เรา clone มามักเรียกว่า local repository
และจะบอกว่า Git เองก็มี checkout ซี่งแท้แล้วก็เหมือนกับ SVN เพียงแต่ว่า Git checkout ทำได้จาก local repository มายัง working directory เท่านั้น ไม่สามารถทำได้จาก origin repository

addcommit

หากเราเปลี่ยนแปลงหลายไฟล์ใน repo ที่ clone มา จะมีแต่ไฟล์ที่ใน Index เท่านั้นที่สามารถบันทีกลง history เราใช้คำสั่ง add ในการเพิ่งไฟล์ลงไปใน Index ของ Git
จากนั้นเราก็ต้องสั่ง commit Git ก็จะไปมองหาทุกสิ่งใน Index แล้วบันทีกการเปลี่ยนแปลง
ใน Git เราสามารถ add อย่างอื่นนอกจากไฟล์ลง Index ได้เช่น บรรทัดบางบรรทัดในไฟล์ (หรือ hunk)
อนี่ง การที่เรา commit ให้รู้ว่า เรา commit ไปยัง repository ที่เรา clone มาเท่านั้น และไม่มีผลไปถีง origin repository ดังนั้น…

push

หลังจากเราทำงานไปได้พักนีง เราควรจะส่ง history ใหม่ๆจาก clone repo ของเรากลับไปยัง origin ที่ GitHub นี่คือตอนที่เราใช้ push
push จะลอก history ของเรากลับไปยัง origin repo

fetchpullmerge

แต่ว่าในการทำงานเป็นทีม ที่ origin repo อาจจะมีการเปลียนแปลงระหว่างที่เรายังไม่ได้ push เราควรจะ fetchสิ่งที่ clone repo เราไม่มีลงมาเสียก่อน
fetch จะดีงสิ่งใหม่ๆจาก origin มาที่ clone repository แต่ว่าจะไม่แตะต้อง working directory นี่เป็นสิ่งดีเพราะว่า เราจะได้ใช้จังหวะนี้ ดูว่ามี conflict อะไรเกิดขี้นหรือเปล่าในสิ่งที่เรายังไม่ได้ commit ไปใน clone repository เราจะได้ resolve conflict ได้ก่อน
สำหรับผู้ที่ชอบความตื่นเต้น สามารถใช้ pull ซี่งจะดึงสิ่งใหม่ๆจาก origin ลงมา merge ทั้งบน clone repository และ working directory โดยทันที หากเป็นมี conflict จากการ merge ใน working directory เราต้อง resolve conflict นั้นๆก่อนจะ commit ได้ต่อไป
นั่นคือ pull แท้จริงคือ fetch ต่อเนื่องด้วย merge ในท่าเดียวนั่นเอง

reset

ทุกคนย่อมมีพลาดพลั้ง เราสามารถย้อน working directory ของเราไป ณ commit หนี่งใดใน history ของ local repository ได้ ด้วยการ reset แต่ละ commit ใน Git จะมี id เป็นเลข hash ยาวๆเช่น
29a4c0d0549897bf2dabc90a4f7664de31d4df43 
แต่เราสามารถเรียกย่อๆได้ด้วยเลขเจ็ดตัวแรก
29a4c0d
เวลาเรา reset ก็แค่บอก Git ว่าเราจะ reset ไปยัง commit id ใด และเรายังสามารถกำหนดได้ด้วยว่า จะมี path หรือ file ไหนถูก reset บ้าง (อ่านคู่มือ Git client ของตัวเองนะว่าแต่ละอันกำหนดอย่างไร)

branch

เป็นเรื่องปกติที่ stable app จะต้องมีการแก้บั๊กหลัง roll out และในเวลาเดียวกัน เราก็อาจจะต้องเพิ่ม features ใหม่ๆที่อาจจะทำให้ app ไม่ stable สิ่งที่นิยมทำใน revisioning control คือการแยก branch ใหม่เพื่อให้เราเริ่มโค้ด features ใหม่ได้ ส่วน app ที่ stable ก็จะอยู่ใน master branch เพื่อให้งานดำเนินต่อไปได้โดยไม่ต้องรอแก้บั๊กใน master ให้เสร็จก่อน ใน Git เราใช้คำสั่ง branch เพื่อแตก branch ใหม่ออกมา
ิBranch ใหม่ที่แยกออกมาก็จะมี history เป็นของมันเอง เราสามารถ checkout และ commit สิ่งใหม่ๆใน branch นี้ได้ นั่นคือ ก็เหมือนใน local repository หนี่งๆ เราสามารถมี sub repository ย่อยๆนั่นเอง เพียงแต่เราเรียก sub repository พวกนี้ว่า branch
พอถีงเวลาที่เราเสร็จการแก้ master branch แล้ว เราสามารถใช้คำสั่ง merge เพื่อรวมงานของ master และ new features branch เข้าด้วยกัน ไม่ต่างจากการ merge remote และ local repository ข้างต้น

stash

เวลา pull หรือ fetch เรามักจะต้อง merge เรามีการเปลี่ยนแปลงใหม่ๆใน working directory ของเรา ซี่งบางทีเราก็ไม่อยากจะ merge ณ จุดนั้น เพราะจริงๆเรารู้ว่าเรา commit หลังจากสิ่งที่ pull หรือ fetch ก็ได้ไม่มีปัญหา
ใน Git เราสามารถทำดังนั้นได้ด้วยการ stash สิ่งที่เราจะ commit เพื่อซ่อนไม่ให้ pull หรือ fetch เห็นและจะบังคับเรา merge พอเรา pull หรือ fetch เสร็จแล้ว เราสามารถดีงสิ่งที่ซ่อนไว้ใน stash กลับมา เพื่อการcommit อย่างราบรื่นต่อไป

Fork คืออะไร

Fork ไม่ใช่เรื่องของ Git โดยตรง แต่เป็นเรื่อง software development
การ fork คือการเอางาน open source มาต่อยอดของเราเอง โดยที่ไม่ได้ขี้นตรงกับแผนงานหลักของ open source นั้นๆ ใน GitHub เรา fork ได้โดยง่าย โดยปุ่มบนเวป GitHub เอง (ซี่งจริงๆ ก็ตงจะใช้ clone ภายใน) แต่ GitHub เพิ่มความสามารถในการจัดการโปรเจคที่เรา fork มามากมายด้วย เช่นวันหนี่งเราเกิดอยากจะ push สิ่งที่เราทำบางสิ่งกลับไปที่โปรเจค GitHub ก็มีวิธีให้ทำได้โดยง่ายเป็นระเบียบและมีบันทีกเรียบร้อย

Git SVN Bridge คืออะไร

Origin repository ของ cloned repository ไม่จำเป็นต้องเป็น Git repository origin จริงๆอาจจะเป็น SVN repository ก็ได้ Git มี Git SVN Bridge เพื่อให้เราใช้ความสามารถของ Git ในการทำงานกับ repo ที่เป็น SVN ได้

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

ทำให้ HTML ใช้ Enter แทน TAB ได้

ทำให้ HTML ใช้ Enter แทน TAB ได้


หลายๆคนคงติดปัญหาว่า อยากทำให้ Web Form สามารถกดปุ่ม [Enter] แทน[TAB] ในการ Input ข้อมูลใน Form ได้ ซึ่งทุกๆคนก็เขียน JavaScript ดัก Event KeyUp, KeyDown, KeyPress โดยต้องส่ง Next Field Name หรือ Id ไปให้ Function ด้วย หรือเทคนิคอื่นๆ ซึ่งมันก็แก้ปัญหาได้ระดับหนึ่ง
วันนี้ผมมีอีกเทคนิคนึงที่รับรองว่าเจ๋งกว่าวิธีที่ผมกล่าวผ่านมาข้างต้นแน่นอน เพราะมันทั้งเขียนสั้น ง่าย และมันก็ทดแทนปุ่ม [TAB] ได้ทุกประการ ไม่ว่าจะเป็น disabled field หรือ tabindex ซึ่งมันจะสะดวกกว่ามากในการที่เราจะจัดลำดับ Field ใน Form ของเรา
จากการที่ผมเองก็เคยทำแต่ไม่เคยจำทำให้ต้องคอย search หาเทคนิคเดียวกันนี้บ่อยๆ จึงทำให้คิดอยากเขียนมันเก็บไว้กันลืม วิธีที่ผมจะกล่าวถึงนี้ก็เป็นการใช้ JavaScript เช่นกันครับ แต่ทำเพื่อแปลงค่า KeyCode ที่ Tag Body ของ Html จาก [Enter] ให้กลายเป็น [TAB] ครับ ซึ่ง Code สั้นและง่ายมากๆ ไม่รู้จะอธิบายยังไง ขอเชิญดูตัวอย่าง code ที่ผมเตรียมให้ดูเลยดีกว่าครับ
<body onkeydown=
"if (event.keyCode==13)
{event.keyCode=9; return event.keyCode }"
>
Index 100 <input tabindex="100" name="I_100"><br>
Index 200 <input tabindex="200" name="I_200"><br>
Index 300 <input tabindex="300" name="I_300"><br>
Index 600 <input tabindex="600" name="I_600"><br>
Index 400 (disables)
<input tabindex="400" name="I_400" disabled><br>
Index 700 (hidden)
<input type="hidden" tabindex="700" name="I_700"><br>
Index 800 (readonly)
<input tabindex="800" name="I_800" readonly><br>
Index 900 <input tabindex="900" name="I_900"><br>
Index 500 <input tabindex="500" name="I_500"><br>
Index 950 <input tabindex="950" name="I_950"><br>
</body>
หากลอง copy code ข้างบนไปรันดู แล้วลอง กด [Enter] จะพบว่า ลำดับ หรือการทำงานจะเหมือนกด [TAB] เลยล่ะครับ
*หมายเหตุ สำหรับ Field ที่ทำเป็น readonly การกด[TAB] จะยังสามารถไป focus ที่ field นั้นได้อยู่แต่จะไม่เห็น cursor ซึ่งจะทำให้ user สับสนว่า cursor มันหายไปไหน ปกติกรณีแบบนี้ผมจะใช้เป็น text label หรือ disable input นั้นไปเลย ถ้าต้องการ submit ค่าไปกับ form ก็ทำเป็น  hidden field ซะ

ที่มา : https://kiwidaddy.wordpress.com

Code se37

วิธีโพส source code บน google blogspot

วิธีโพส source code บน google blogspot 1. หลังจาก sign in แล้วให้คลิ๊กเลือก Design บนแถบควบคุม จากนั้นเลือก Edit HTML 2. ที่แถบ Edit Template ให้ copy โค้ดด้านล่างนี้ไปวางไว้ก่อนหน้าแทก </head>

<link href="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.css" rel="stylesheet" type="text/css"/>
<script src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript"/>
3. สุดท้ายให้เพิ่มโค้ดเข้าไปที่ body จะได้ว่า
<body onload='prettyPrint()'>
4. ถึงจุดนี้เราก็จะสามารถแสดง source code โดยใช้ pre แทกซึ่งเรียกใช้ผ่านคลาส prettyprint ดังตัวอย่างตามโค้ดด้านล่าง
<pre class="prettyprint">
source code
</pre>
ที่มา : http://stongphu.blogspot.com

PermGen space error

PermGen space error (java.lang.OutOfMemoryError) คุณเคยเผชิญปัญหา java.lang.OutOfMemoryError: PermGen space error เวลา redeploy แอปพลิเคชั่นของคุณบน application server รึเปล่า? คุณเคยหงุดหงิดกับการที่ต้องมาคอย restart ตัว application server ในเวลาที่คุณกำลังตั้งใจแก้บั๊ค program ของคุณบน application server บ้างรึไม่? และคุณคงเคยค้นหาปัญหาเดียวกันนี้บน Internet และพบว่า พวกคนที่พัฒนาแอพลิเคชั่นบน application server ก็เจอปัญหาแบบนี้เหมือนๆกันเต็มไปหมดเลย คุณจึงสรุปว่ามันต้องเป็น bug ของ container แน่ๆเดี๋ยวต่อไปก็มี patch ออกมาเองแหละ แต่คุณเชื่อผมไม๊ว่าอันที่จริงแล้วมันอาจเกิดขึ้นเพราะความผิดพลาดใน code ของคุณเองก็ได้ เราลองเริ่มต้นด้วยการดูตัวอย่างจาก code ที่ง่ายๆนี้กัน
package com.stc.test;
import  java.io.*;
import  java.util.logging.*;
import  javax.servlet.*;
import  javax.servlet.http.*;
 

public class MyServlet extends HttpServlet {
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
      // Log at a custom level
      Level customLevel = new Level("OOPS", 555) {};
      Logger.getLogger("test").log(customLevel, "doGet() called");
   }
}
ลอง redeploy ตัวอย่างข้างบน บน application server ซ้ำๆซักพักนึงดู พนันได้เลยว่าจะพบกับ java.lang.OutOfMemoryError: PermGen space error ในเวลาไม่นาน ถ้าคุณอยากทำความเข้าใจว่ามันเกิดอะไรขึ้นลองอ่านหัวข้อถัดไปดู อะไรคือสาเหตุของปัญหา Application server หลายๆตัว อย่างเช่น Glassfish จะอนุญาติให้คุณ เขียนแอพลิเคชั่น (.ear, .war, etc) และ ติดตั้งมันร่วมกับ แอพลิเคชั่นอื่นๆ บนตัวมันเอง ทีนี้เวลาที่คุณต้องปรับแก้ program ของคุณ คุณก็คิดแค่ว่าแก้ source code , compile แล้วก็ redeploy ขึ้นไปบน application server ทุกอย่างก็น่าจะจบ โดยที่มันจะไม่มีผลข้างเคียงกับ application อื่นๆที่กำลังทำงานอยู่บน application server ได้เลย และไม่จำเป็นต้อง restart application server ด้วย ครับสิ่งที่คุณคิดมันถูกต้อง! กลไกนี้ทำงานได้ดีและไม่มีปัญหาอะไรเลยบน Glassfish และหรือ application server อื่นๆ (เช่น Java CAPS Integration Server) ซึ่งวิธีการนี้จะได้ผลเป็นปกติดีก็ต่อเมื่อ แอพลเคชั่นแต่ละตัว ถูก load ด้วย classloader ของตัวมันเอง โดย classloader จะเป็น class พิเศษที่ทำหน้าที่ load ไฟล์ .class ทั้งหลายมาจาก jar file และเมื่อคุณสั่ง undeploy ตัว class loader จะถูกทิ้ง และ class ทั้งหมดที่ถูก class loader อ่านเข้ามาก็จะถูกทิ้งไปด้วย ซึ่งควรส่งผลให้ garbage colloector (gc) ทำการเก็บกวาด มันทิ้งไปเพื่อคืน memory ในเวลาต่อมาซึ่งอาจจะช้าหรือเร็วก็ขึ้นอยู่กัย gc เอง แต่บางทีมันก็ไม่เป็นเช่นนั้น ด้วยว่ามีบางสิ่งบางอย่าง ยังคงยึดหรือ มีการอ้างอิงไปหา memory ของ class loader อยู่ ซึ่งนั่นจะเป็นการขัดขวางการเก็บกวาดของ gc และนั่นเอง ที่เป็นสาเหตุของ [java.lang.OutOfMemoryError: PermGen space exception] PermGen space อะไรคือ PermGen space ? ก่อนอื่นต้องเข้าใจก่อนว่าหน่วยความจำใน Virtual Machine จะถูกแบ่งเป็นขอบเขตต่างๆ ซึ่งหนึ่งในนั้นชื่อ PermGen โดยมันเป็นพื้นที่สำหรับ load พวก class file (ยังมีอย่างอื่นด้วย) ขนาดของ PermGen จะถูกกำหนดไว้คงที่ตั้งแต่เริ่ม start ตัว VM และมันจะมีขนาดเท่าเดิมตลอดเวลาหลังจากที่ VM เริ่มทำงานแล้ว คุณสามารถกำหนดขนาดของ PermGen ได้ด้วย Parameter ของ VM ดังนี้ -XX:MaxPermSize โดยค่า default ของมันจะเป็น 64Mb สำหรับ VM ของ Sun ตราบใดที่ปัญหายังเกี่ยวข้องกับการให้ GC เก็บกวาด class และคุณยังจำเป็นต้อง Load Class เพิ่มอยู่ VM ก็จะใช้พื้นที่นี้จนเต็มอยู่ดี แม้ว่าคุณจะเพิ่มขนาดของ Heap Memory ไปมาก แค่ไหนก็ตาม การใช้ VM Parameter -Xmx ไม่ได้ช่วยแก้ปัญหานี้เลย เพราะมันกำหนดขนาดสูงสุดของ Heap ไม่ใช่ขนาดของ PermGen Garbage collecting and classloaders เมื่อคุณพยายามเขียน code แย่ๆแบบนี้
private void x1() {
   for (;;) {
      List c = new ArrayList();
   }
}
มันเป็นการพยายามจองพื้นที่ใน memory ให้ object "c" อย่างต่อเนื่อง แต่ยังไงโปรแกรมก็ยังไม่ out of memory เพราะพื้นที่ memory ของ object "c" จะถูกจัดเป็น garbage เพื่อคืนค่า memory ทำให้คุณยังสามารถจองพื้นที่ให้ object ใหม่ได้เรื่อยๆ โดยพื้นที่ memory ของ object จะถูกจัดเป็น garbage ก็ต่อเมื่อ "พื้นที่" นั้นมีสภาพเป็น unreachable คือไม่มีทางที่จะ access หรือ อ้างถึงพื้นที่นั้น ได้จากที่ไหนในโปรแกรมได้อีกแล้ว ลองมาดูเป็นรูปภาพของ memory จากตัวอย่าง servlet กัน
package com.stc.test;
import java.io.*;
import java.net.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class Servlet1 extends HttpServlet {
 private static final String STATICNAME = "Simple";
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 }
}
เมื่อ Servlet นี้ถูก Load แล้ว Object ต่างๆจะอยู่ใน Memory ดังรูป (เราจำกัดเฉพาะส่วนที่อยู่ในประเด็นของเราเท่านั้น)
ส่วนสีเหลืองคือ instance ที่ถูก Load โดย app class loader และจากภาพเราจะเห็นว่า container จะมีการอ้างอิงไปหา application classloader ซึ่งมันถูกสร้างมาเฉพาะ application นี้เท่านั้น นอกจากนี้ container ยังอ้างอิงไปหา Servlet Instance เพื่อให้มันสามารถเรียกเมธอด doGet() ใน servlet ให้ทำงานได้ เมื่อมี http request เกิดขึ้น ส่วน STATICNAME จะถูกอ้างอิงได้จาก Servlet Class Object เพียงตัวเดียวเท่านั้น (Servlet1 instance จะ access ไปหา STATICNAME ได้โดยผ่าน Servlet Class Object)
:ข้อสังเกตุ:
// 1. Servlet Instance จะมีการอ้างอิงถึง Class ของมันเอง (Class Object)
//   ซึ่งทุกๆ Object ก็เป็นแบบนี้เสมอ  เช่น
   Class clsObj = obj.class;
 
// 2. Class Object จะมีอ้างอิงถึง ClassLoader ที่ Load มันขึ้นมาเสมอ เช่น
   ClassLoader clsLdr = clsObj.getClassLoader();
 
// 3. ClassLoader จะมีอ้างอิงถึง ClassObject ที่มัน Load ขึ้นมาเสมอ เช่น
   Class clsObj = clsLdr.loadClass("ClassName");

จากภาพเมื่อเรา Undeploy แอพลิเคชั่น ทำให้ Container ไม่อ้างอิงถึง instance ของ Servlet1 และ AppClassloader อีกต่อไป และทำให้มี object ที่ไม่สามารถอ้างอิงถึงใน VM ได้อีก(unreachable objects คือส่วนที่เป็นสีจางๆ) และพวกมันจะถูกจัดเป็นขยะ (garbage) ทำให้ gc สามารถคืน memory กลับมาให้เราได้ คราวนี้มาดูกันว่าจะเกิดอะไรขึ้นถ้าเรานำตัวอย่างเดิมมาปรับให้ใช้คลาส Level ในโค๊ดด้วย
package com.stc.test;
import java.io.*;
import java.net.*;
import java.util.logging.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class LeakServlet extends HttpServlet {
 private static final String STATICNAME = "This leaks!";
 private static final Level CUSTOMLEVEL = new Level("test", 550) { // anon class!
 };
 protected void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
 Logger.getLogger("test").log(CUSTOMLEVEL, "doGet called");
 }
}
* object class ชื่อ CUSTOMLEVEL เป็น anonymous class และเนื่องจาก Constructor ของ Level เป็นชนิด protected ทำให้เราจำเป็นต้องประกาศแบบนี้ เรามาดูแผนภาพของ memory ที่จะเกิดขึ้นกัน

จากภาพคุณคงจะเห็นบางสิ่งที่คุณคาดไม่ถึง คลาส Level จะมี static member ของ Level Instance ทุกๆตัวที่สร้างขึ้นมา(รวมถึง CUSTOMLEVEL ของคุณด้วย) ซึ่งนี่เป็น constructor ของคลาส Level ที่อยู่ใน JDK
protected Level(String name, int value) {
 this.name = name;
 this.value = value;
 synchronized (Level.class) {
 known.add(this);
 }
}
ใน code ข้างต้น "known" คือ static ArrayList ในคลาส Level ซึ่งถูก implement เอาไว้แบบนี้ ทีนี้เรามาดูกันต่อว่าจะเกิดอะไรขึ้นเมื่อเรา undeploy

จะมีเฉาะ Instance ของ LeakServlet เท่านั้นที่ถูกจัดเป็น Garbage เพราะยังคงมีการอ้าถึง Object CUSTOMLEVEL จากภายนอกของ AppClassloader อยู่ สิ่งที่สำคัญของเรื่องนี้ก็คือ เมื่อใดก็ตามที่มี Object นอก AppClassloader ยังคงอ้างถึง Object ซึ่งถูก Load ด้วย AppClassloader อยู่ Object ที่เราสนใจนั้นก็จะไม่มีทางถูกจัดเป็น Garbage เลยครับ
ที่มา : https://kiwidaddy.wordpress.com

วันเสาร์ที่ 10 มกราคม พ.ศ. 2558

Bookmark

http://www.cpubenchmark.net/CPU_mega_page.html เว็บนี้เค้าเปลี่ยนเทียบประสิทธิภาพ CPU ของแต่ละค่ายแต่ละรุ่นไว้ให้เราด้วยดีจุง
http://www.ninenik.com เว็บนี้เค้ามีเนื้อหาสอนเขียนโปรแกรมที่อธิบายเข้าใจงายดี
http://image.online-convert.com/convert-to-webp เว็บแปลงรูปเป็น webp
http://www.siamhtml.com/introduction-to-node-jsNode.js คืออะไร ? + สอนวิธีใช้
http://blog.panjmp.com/2014/04/what-is-mean-stack/MEAN Stack คืออะไร?
http://www.siamhtml.com/restful-api-with-node-js-and-express/สร้าง API ง่ายๆ ด้วย Node.js และ Express
http://www.siamhtml.com/introduction-grunt/Grunt คืออะไร ? + สอนวิธีใช้
http://www.siamhtml.com/introduction-to-gulp-js/ Gulp.js คืออะไร ? + สอนวิธีใช้
http://nikhorn-ubuntu.blogspot.com/2013/10/ubuntu-oracle-vm-virtualbox.html
วิธีติดตั้ง Ubuntu บน Oracle VM VirtualBox
http://nextflow.in.th/2014/solve-nodejs-npm-windows-7-8-error-enoent/
วฺิธีแก้ปัญหา NodeJS บน Window 7, 8, 8.1 :Error ENOENT หรือ npm install npm -g
http://nextflow.in.th/2014/intro-setup-bower/ รู้จักกับ bower : วิธีติดตั้งและใช้งาน
http://www.greanapp.com/?p=30 Web App ด้วย Yoman Workflow !
http://www.position-relative.net/creation/formValidator/ ทำ validate ข้อมูลใน form
http://bassistance.de/jquery-plugins/jquery-plugin-autocomplete/การทำ AutoComplete
http://www.kontentblue.com/site/article/articles?tag=java&page=2เว็บนี้เค้าอธิบาย OOP แล้วเข้าใจง่ายดีครับ
https://winnerboy7.wordpress.com/2013/07/17/%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B9%83%E0%B8%8A%E0%B9%89-vim/วิธีใช้ Vim
http://docs.emmet.io/abbreviations/syntax/Emmet ช่วย gen html css
http://pantip.com/topic/32230350มาทำ USB Multiboot XP / 7 / 8 / 8.1 / Linux ด้วย Flashdrive อันเดียวกันเถอะ
http://www.siamhtml.com/run-test-with-karma/ วิธีรัน Test อัตโนมัติด้วย Karma
https://magickiat.wordpress.com/ รวมเกี่ยวกับการเขียนโปรแกรม

บริหารสมองเป็น 2 เท่า

บริหารสมองเป็น 2 เท่า