Monday, December 26, 2011

Wicket စာျမည္း

Wicket စာျမည္း

စေနေန႕က မိန္းမကို အလုပ္ဆင္းလာတာေစာင္႔ရင္း လုိင္ဘရီမွာ ၅ နာရီေလာက္ အခ်ိန္ျဖဳန္းခဲ႔ပါတယ္။ Wicket in action ဖတ္ၾကည္႕ပါတယ္။

သေဘာက်ပါတယ္။ HTTP က stateless ျဖစ္ျပီး Java က stateful ျဖစ္ပါတယ္။ state ေတြကို မွတ္ေနရတာ Java ရဲ႕ ပ်င္းစရာအေကာင္းဆံုးေတြထဲက တစ္ခုျဖစ္ပါလိမ္႔မယ္။ Wicket က state management အတြက္ ေျဖရွင္းေပးမယ္လို႕ဆုိပါတယ္။ Juz java, Juz Html and correct abstraction လို႕ဆိုပါတယ္။ JSP ေတြ၊ JSF ေတြလိုမဟုတ္ဘူး။ သူက ရိုးရိုးရွင္းရွင္းေလးလို႕ဆုိပါတယ္။

နမူနာတစ္ခုပဲလုပ္ၾကည္႕ရေသးတဲ႔အတြက္ သိပ္အမ်ားၾကီးမသိေသးပါဘူး။ သိတာကေတာ႔ ေရွ႕က version တစ္ခုမွာ xss attack vulnerable ရိွတဲ႔အတြက္ update ထုတ္ထားျပီဆိုတာပါပဲ။

မ်ားမ်ားသိတာဟာ ေကာင္းပါတယ္။ ဘာေတြ ရိွေနျပီလဲဆိုတာသိမွ ကိုယ္က ေကာင္းေကာင္း အသံုးခ်ႏိုင္ပါမယ္။ အားလံုးကို ႏႈိးေဆာ္ခ်င္တာက ရပ္မေနပါနဲ႕ ဆက္သြားပါ။ သိသထက္သိေအာင္လုပ္ျပီး သံုးတတ္သထက္သံုးတတ္ေအာင္လုပ္ပါဆိုတာပါပဲ။

wicket အတြက္ plug-in လည္း Eclipse မွာရိွပါတယ္။ Eclipse Helios သြင္းထားရင္ Market Place မွာ ရွာျပီး download လုပ္လုိက္ရံုပါပဲ။

Wicket မွာ Java annotation ကို အလွဴလိုသံုးထားတာကိုေတြ႕ရပါလိမ္႔မယ္။ developer ေတြ အဆင္ေျပဖုိ႕ ထုတ္တာေတြမွန္သမွ်ကုိ warmly welcome လုပ္ပါတယ္။ ASF (Apache Software Foundation) သက္ေတာ္ရာေက်ာ္ရွည္ပါေစလုိ႕ဆုေတာင္းေပးလုိက္ပါတယ္။

Wicket in action ကေတာ႔ Manning ရဲ႕ in action series ပါပဲ။ ဖတ္ရတာ အဆင္ေျပပါတယ္။ ေရွ႕စာမ်က္ႏွာ ၂၀၊ ၃၀ ေလာက္အထိေတာ႔ အဆင္ေျပေနတယ္လုိ႕ တိတိက်က်ေျပာႏိုင္မယ္ထင္ပါတယ္။

J2EE ျဖစ္ေစ၊ C#,.Net ျဖစ္ေစ၊ သူတို႕ၾကိဳးစားေနတာေတြအကုန္လံုးက အဆင္ေျပဖုိ႕ပါပဲ။ Hibernate လိုမ်ိဳး ORM ေတြဆုိရင္ပဲၾကည္႕လုိက္။ သီအိုရီအတူတူပဲ။ implement လုပ္ၾကတာပဲကြာရင္ကြာမယ္။ achieve ျဖစ္ခ်င္တဲ႔ goal ေတြလည္းအတူတူပဲ။ language တစ္ခုခုကို က်က်နနတတ္ဖုိ႕ အခ်ိန္မ်ားမ်ားယူလုိက္ရင္ က်န္တာေတြ ေလ႔လာတဲ႔အခါ အမ်ားၾကီး သက္သာပါတယ္။ learning curve တိုသြားမယ္လုိ႕ဆိုလုိပါတယ္။

Regards,
Zero

Ref:
http://wicket.apache.org/

freeze the column in excel

freeze the column in excel

ဒါကေတာ႔ အပိုေပးတာပါ။ technical နဲ႕ဘာမွမဆိုင္ပါဘူး။
documentation လုပ္တဲ႔အခါ ေရွ႕နားမွာ အေရးၾကီးတဲ႔ row ေတြ excel ရဲ႕ ေရွ႕ပိုင္း column ေတြမွာထားျပီး freeze လုပ္ထားခ်င္တဲ႔အခါမ်ိဳးေတြမွာသံုးပါတယ္။ excel ကိုက အမ်ားၾကီးသံုးလို႕ရတာေတြရိွပါတယ္။

Column ကို select မွတ္ျပီး view Menu ထဲက Freeze Pane မွာ သြားျပီး freeze လုိက္ရံုပါပဲ။
ရဲေတြ ေအာ္တဲ႔ Freeze လိုပါပဲ။ (မလႈပ္နဲ႕ လက္ေျမွာက္ လိုပါပဲ။) columns ေတြ ရပ္ေနမွာပါ။ ေနာက္ကို scroll ပင္ဆြဲေသာ္လည္း သူတုိ႕ကေတာ႔ မေပ်ာက္ေတာ႔ပါဘူး။ ခပ္တည္တည္ၾကီးရပ္ေနတာကိုေတြ႕ရပါလိမ္႔မယ္။

ေရွ႕ကလူေတြ လက္ကျမင္းျပီး freeze သြားတာေတြကို ျပန္ျပီး unfreeze လုပ္ခ်င္ရင္လည္း အဲဒီလိုပါပဲ။ view>freeze pane>Unfreeze ပါပဲ။

Freeze ၾကည္႕ပါဦး။ အဆင္ေျပမွာပါ။

Regards,
Zero

Ref:
http://office.microsoft.com/en-us/excel-help/freeze-or-lock-rows-and-columns-HP005203861.aspx

line Number in Eclipse

line Number in Eclipse

Eclipse အေၾကာင္းကို မေန႕ကဖတ္ၾကည္႕ေတာ႔ I=M=P=R=E=S=S=I=V=E ျဖစ္ရတယ္ ေဒၚလာ သန္းေလးဆယ္ ကုန္က်ခဲ႔တဲ႔ project ျဖစ္ျပီး အလကားေပးထားတယ္ဆိုတာ ကမာၻ႕အံ႔ဖြယ္တစ္ခုပဲ။ IBM ရဲ႕ေစတနာလုိ႕လည္းေျပာႏုိင္ပါတယ္။

အခုကေတာ႔ အေသးအဖြဲတစ္ခုအေၾကာင္းပါ။ Error တက္ရင္ ဘယ္ line ကလည္းေတာ႔ သိၾကရပါတယ္။ Eclipse မွာ line no ကို Ctrl+l နဲ႕ရွာလုိ႕ရပါတယ္။ ဒီထက္ အဆင္ေျပတာတစ္ခုကေတာ႔ source code ကို line no တပ္ထားလုိက္တာ ေကာင္းပါတယ္။ မၾကာမၾကာ Ctrol l (l for line) ႏွိပ္ေနရတာ အခ်ိန္ကုန္ပါတယ္။

မခက္ခဲေပမယ္႔ အသံုး၀င္ပါတယ္။  ကဲလုပ္ၾကည္႕လုိက္ပါဦး။


1) Windows -> Preferences
2) General – > Editors -> Text Editors
and click the “Show Line Numbers” checkbox.



Tuesday, December 20, 2011

Java Map

Java Map

ဒီေန႕ Oracle က နမူနာျပထားတဲ႔ Map ကို ခဏေလာက္ျပန္ၾကည္႕ရင္းသေဘာက်တာနဲ႕ ဒီမွာတင္ထားလိုက္တယ္။
import java.util.*;
public class PhoneList {
   public static void main(String args[]) {
     // Create map - maintain insertion order
     Map map = new LinkedHashMap();

သူ႕ရဲ႕ comment ေတြကိုၾကည္႕ရင္ကို နားလည္ႏိုင္ပါတယ္။ 
Insert လုပ္တဲ႔အခါ ပထမဆံုး ထည္႕တဲ႔ record က ပထမ ေနရာမွာရိွေနခ်င္တယ္ဆိုရင္၊
 တစ္နည္းအားျဖင္႔ order ကို မွတ္ထားခ်င္တယ္ဆိုရင္
LinkedHasMap ကိုသံုးရပါတယ္။ ဒါမ်ိဳးေတြက SCJP မွာေမးတတ္ပါတယ္။

// Add members
     map.put("George", "202-456-1111");
     map.put("Bill", "212-348-8882");
     map.put("Hillary", "202-224-4451");
     map.put("Elvis", "901-332-3322");
     map.put("Jimmy", "229-924-6935");
 
ဒီေနရာမွာ map ထဲကို id နဲ႕ value ထည္႕ပါတယ္။ ဒီေနရာမွာ Phone List လုပ္ေနတာဆိုေတာ႔ လူနာမည္နဲ႕
ဖံုးနံပါတ္အတြဲလုိက္ေလးေတြထည္႕ပါတယ္။ဒါေတြကို Array နဲ႕လုပ္လည္းရပါတယ္။
Map ရဲ႕အားသာခ်က္ေတြကေတာ႔ အမ်ားၾကီးရိွပါတယ္။ အထူးသျဖင္႔ Object ေတြကို 2D, 3D လုပ္တဲ႔အခါလြယ္ပါတယ္။
map တစ္ခုထဲမွာ map ေတြထပ္ထည္႕ခ်င္လည္းရပါတယ္။ dimension မ်ားလာရင္ ပိုျပီး လြယ္ကူေစပါတယ္။
Objects ေတြကိုလည္း အဆင္ေျပေျပသံုးႏုိင္ပါတယ္။ 
http://en.wikipedia.org/wiki/Hash_table Hash table ေတြရဲ႕ structure နဲ႕
 pros and cons ေတြကို အဲဒီမွာဖတ္လို႕လည္းရပါတယ္။
တစ္ခါတစ္ေလၾကရင္ ကိုယ္အဆင္ေျပတာသံုးေနၾကတာမ်ားပါတယ္။ 
ဘယ္လိုနည္းနဲ႕ျဖစ္ျဖစ္ အဆင္ေျပေအာင္ လုပ္ႏိုင္ၾကရင္ေကာင္းပါတယ္။
 တစ္ခ်ိဳ႕ ေနရာေတြမွာ ပိုျပီးအဆင္ေျပလြယ္ကူတယ္ ဆိုတာကိုသိစရာလိုပါတယ္။

// Print map
     print(map, "Insertion Order:");
Print function တစ္ခုေအာက္မွာေရးထားတာကိုေခၚတာပါပဲ။ အေပၚမွာ LinkedHashMap လုပ္ထားတဲ႔အတြက္
Add လုပ္ထားတဲ႔ order အတိုင္းထြက္လာပါတယ္။

// Convert map to regular
     map = new HashMap(map);

တစ္ခါတစ္ေလၾကရင္ Data ေတြရိွေနရင္ေတာ္ျပီ ပထမဆံုးထည္႕ထားတာ ပထမဆံုးမွာရိွကိုရိွေနရမယ္ဆိုတာမ်ိဳး မလိုခ်င္ဘူးဆိုရင္
HashMap သံုးလို႕ရပါတယ္။ Hashing Order လို႕ေခၚပါတယ္။ သူအဆင္ေျပသလို ထည္႕ထားပါလိမ္႔မယ္။ ျပန္ထုတ္လိုက္ရင္ 
Hash Order အတုိင္းထြက္လာပါမယ္။
ေနာက္ဆံုးမွာျပထားတဲ႔ results ေတြကိုၾကည္႕ရင္ပိုျပီးသေဘာေပါက္ႏုိင္ပါတယ္။
// Print map
     print(map, "Hashing Order:");

     // Convert map to sorted
     map = new TreeMap(map);


TreeMap လုပ္လုိက္ရင္ sort လုပ္ျပီးသားရပါမယ္။ ကိုယ္႔ဘာသာကို sorting စီေနဖုိ႕မလုိပါဘူး။

// Print map print(map, "Sorted"); } private static void print(Map map, String message) { System.out.println(message); Set entries = map.entrySet(); Iterator iterator = entries.iterator(); while (iterator.hasNext()) { Map.Entry entry = (Map.Entry)iterator.next(); System.out.println(entry.getKey() + " : " + entry.getValue()); } System.out.println(); } }


Your result should look something like the following:
Insertion Order:
George : 202-456-1111
Bill : 212-348-8882
Hillary : 202-224-4451
Elvis : 901-332-3322
Jimmy : 229-924-6935

Hashing Order:
Hillary : 202-224-4451
George : 202-456-1111
Bill : 212-348-8882
Jimmy : 229-924-6935
Elvis : 901-332-3322

Sorted
Bill : 212-348-8882
Elvis : 901-332-3322
George : 202-456-1111
Hillary : 202-224-4451
Jimmy : 229-924-6935

Regards,
Zero

ref:
http://java.sun.com/new2java/supplements/solutions/July02.html
http://en.wikipedia.org/wiki/Hash_table

Monday, December 19, 2011

Java SE သင္ခန္းစာ Link and JSP သင္ခန္းစာ Link

Java SE သင္ခန္းစာ Link and JSP သင္ခန္းစာ Link

လြယ္လြယ္ကူကူ အေျခခံေလးေတြေလ႔လာဖို႕အတြက္သင္႔ေတာ္ပါတယ္။ ဘာမွမလုပ္ရင္ေတာ႔ ဘာမွမျဖစ္ပါဘူး။ တစ္ခုခုလုပ္ရင္ေတာ႔တစ္ခုခုျဖစ္ပါတယ္။ ေလ႔က်င္႔ေတာ္မူႏုိင္ၾကပါေစ။

https://wikis.oracle.com/display/code/Language+Syntax#LanguageSyntax

JSP အလြယ္စားေလ႔က်င္႔ခန္းေတြကို ဒီေနရာမွာေလ႔လာလုိ႕ရပါတယ္။
run လုိ႕ရတယ္။ ျမင္သာထင္သာရိွတယ္ေပါ႔ခမ်ာ။

http://www.jsptut.com/

ပထမဆံုးအလုပ္ကေတာ႔ ေပ်ာ္ဖုိ႕ပဲ။ ေပ်ာ္ေအာင္လုပ္ပါ။ ဘာမဆို သင္ယူရင္ေပ်ာ္မွတတ္တယ္။ မေပ်ာ္တဲ႔သူေတြက ဘာသင္သင္ တကယ္မတတ္ဘူး။ မတတ္သာလုိ႕သင္ရတဲ႔ဟာေတြက တကယ္မတတ္ရျခင္းရဲ႕ အေၾကာင္းရင္းဘဲ။

စစခ်င္း လြယ္တာေတြေလ႔လာ။ ပိုျပီးခက္တာေတြလားပါလာမွာပဲ။ လြယ္တာေတြကို ေက်ညက္သြားရင္ ကိုယ္႔ကိုယ္ကို နည္းနည္းပိုျပီး ယံုၾကည္လာတယ္။ ငါလုပ္ရင္ျဖစ္ေလာက္တယ္ဆိုတာမ်ိဳးေလးျဖစ္ဖုိ႕လိုတယ္။

Regards,
Zero

Boxing Conversion

Boxing Conversion


Boxing ဆိုတာနဲ႕ လက္ေ၀ွ႕ထုိးတယ္မ်ားထင္မလားမသိဘူး။ primitive type ေတြကို သူတို႕အတြက္လုပ္ထားတဲ႔ refernce type ေတြဆီကို ေျပာင္းတာကို Boxing လုိ႕ေခၚတာပါ။ ေသတၱာထဲထည္႕တာေပါ႔ခမ်ာ။ ေအာက္မွာရွစ္ခုရိွတယ္တဲ႔ခင္ဗ်။
  • From type boolean to type Boolean
  • From type byte to type Byte
  • From type char to type Character
  • From type short to type Short
  • From type int to type Integer
  • From type long to type Long
  • From type float to type Float
  • From type double to type Double
Double ဆိုတာေတြ႕ရင္ မေနႏုိင္မထိုင္ႏိုင္ 1 cent issue ကိုသတိရမိတယ္ဗ်။ double ေတြဟာ သိမ္းစရာရိွတာကို အတည္႕မသိမ္းဘူးခင္ဗ်။ ဘာနဲ႕တူသလဲဆိုရင္ ဟာထဲကလို ႏြားေတြျဖတ္ေျပးတာကို ေျခေထာက္ေတြလုိက္ေရၾကည္႕ျပီး ေလးနဲ႕စားသလိုမ်ိဳးေပါ႔။ လြယ္တာကို ခက္ေအာင္လုပ္တယ္။ 60 ကို ၅၉.၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉၉ ဆိုျပီးသိမ္းတဲ႔အတြက္ အတြက္အခ်က္ေတြ လုပ္ရင္း လုပ္ရင္း လုပ္ရင္း လုပ္ရင္း ေနာက္ဆံုး တစ္ျပားကြာကုန္တယ္ေပါ႔ဗ်ာ။ အဲဒါေၾကာင္႔လည္း BigDecimal ပဲေနာက္ပိုင္းေျပာင္းသံုးၾကတယ္။


Run time ၾကရင္ Boxing conversion ေတြက ဒီလိုေျပာင္းလဲသတဲ႔။
  • If p is a value of type boolean, then boxing conversion converts p into a reference r of class and type Boolean, such that r.booleanValue() == p
p က boolean ဆိုပါေတာ႔။ လြယ္ေအာင္ေရးလိုက္ရင္ boolean p=true;
ဆိုပါေတာ႔။ run time ေရာက္ရင္ primitive type boolean ေလးကို Reference Type အျဖစ္ေျပာင္းပစ္လုိက္တယ္။ ေျပာင္းပစ္လုိက္တယ္ဆိုတာမွာ Reference Type Boolean r ထဲကို boolean တန္ဖိုးေရာက္သြားတယ္။ B အၾကီးေတြ အေသးေတြ ရွဳပ္ေနတယ္လို႕မထင္ပါနဲ႕။ Java ရဲ႕ၾကီးက်ယ္ေသာ boxing ေျပာင္းလဲမႈၾကီးပါ။ 


Boolean b;
boolean a=true;
b = new Boolean(a);
System.out.println(b.booleanValue());
Boolean ၾကီးဟာ reference type ၾကီးပါ။ သူက class လည္းျဖစ္တဲ႔အတြက္ သံုးခ်င္ရင္ new လုပ္ေပးရပါမယ္။ Boolean b= new Boolean("true") ဆိုျပီး တစ္ခါတည္း create လုပ္လုိက္တာကိုၾကေတာ႔ auto boxing လို႕ေခၚတယ္ဗ်။ Class ေတြကို compare လုပ္ေနတာလို႕ ခင္ဗ်ားတို႕သတိထားမိရင္ == operator ကို သံုးရင္လြဲမယ္ဆိုတာကိုလည္း ေျပာစရာမလုိပါဘူး။ Boolean ၾကီးကို == နဲ႕သြားျပီးတုိက္ဆုိင္ရင္ လြဲမွာပဲ။ သူ႕ရဲ႕ value က .booleanValue() နဲ႕ရွာမွထြက္လာမယ္။ .equals () operator နဲ႕လည္း နည္းနည္းစမ္းျပီးေရးၾကည္႕ပါ။ က်န္တာေတြလည္း အလားတူပါပဲ။


 အဲဒီရွစ္မ်ိဳးကို ေျပာင္းျပန္လွည္႕ေျပာရင္ တနည္းအားျဖင္႔ Reference Type ကေန primitive ကိုေျပာင္းတာကို unboxing ေသတၱာထဲက ထုတ္တယ္လို႕ဆိုတာပါပဲ။ လူမ်ားေတြ boxing/unboxing လုပ္တယ္ဘာညာဆိုတာေတြကို အၾကီးၾကီးထင္မွာစိုးလုိ႕ပါ။ သိေအာင္လုပ္ထားတာေကာင္းပါတယ္။

Boxing was introduced in JDK 1.5 to eliminate trivial conversions between primitives (intboolean, etc) and corresponding wrapper objects (IntegerBoolean, etc). Boxing allows some code to be a bit more concise and legible. It's also useful when using collections (which only take objects, not primitives).

Integer, Boolean စတဲ႔ Reference Type Objects ေတြကို wrapper objects လို႕လည္းေခၚတယ္ဆိုတာကို ေျပာခ်င္လုိ႕ကူးလာတာပါ။ JDK 1.5 ရဲ႕ သိသာထင္ရွားတဲ႔အမွတ္အသားတစ္ခုပါပဲ။

အဆင္ေျပၾကမယ္လို႕ထင္ပါတယ္။
နားမလည္ဘူးလား။ နားလည္လားေတာ႔မသိပါဘူး။ ၾကိဳးစားျပီး ရွာဖတ္ၾကည္႕ပါ။ ေရးေတးေတးျဖစ္ေနရင္လည္း မ်ားမ်ားေလးေလ႔လာၾကည္႕ပါ။ အဆင္ေျပသြားမွာပါ။ တကယ္တမ္း အလုပ္မွာ ဒီေလာက္သိစရာမလိုဘူး။ ေရးေနတာၾကာျပီ။ ကြ်န္ေတာ္ဆို ဒါကို Boxing လား၊ ၀ူရွဴးလားမသိဘဲ တစ္ႏွစ္ခြဲေလာက္ေရးေနတာပဲ။ ေရးလို႕ျဖစ္ပါတယ္။ ကိုယ္သိေနတာေတြကို ဘယ္လုိေခၚလဲျပန္ျပီးေလ႔လာရတာလည္း ေပ်ာ္စရာေကာင္းပါရဲ႕ဗ်ာ။

ကဲ Boxing သင္ခန္းစာ ဆံုးေလ၏။            ။

Regards,
Zero.

Ref:

Sunday, December 18, 2011

Singleton

Singleton

Design Pattern စာအုပ္ေတြထဲမွာေရာ source code ေတြမွာပါ ေတြ႕ဖူးပါတယ္။ ဘာအတြက္သံုးလဲအနည္းငယ္ေလာက္ပဲသိပါတယ္။ Java မွာသိစရာနည္းနည္းမ်ားတယ္ထင္ပါတယ္။ နည္းနည္းသိတဲ႔အသိဟာအႏၲရာယ္မ်ားတယ္ဆိုေပေသာ္ျငားလည္း အင္တာဗ်ဴးေျဖဖို႕ၾကေတာ႔လည္း အသံုး၀င္သား။

အၾကမ္းဖ်င္းေလာက္ပဲေျပာမွာဆုိေတာ႔ wiki ရဲ႕ဖြင္႔ဆိုခ်က္ကိုပဲ ကိုးကားလုိက္ပါတယ္။ အိမ္ေရာက္ရင္ ထပ္ကိုးကားစရာမ်ား ကံေကာင္းေထာက္မျပီးေတြ႕ခဲ႔ရင္ ေနာက္တစ္ေခါက္ ထပ္ကိုးကားပါဦးမယ္။ singleton ဟာ class ေတြ instantiation လုပ္တာကို ကန္႕သတ္ဖုိ႕သံုးပါသတဲ႔။ system တစ္ခုလံုးမွာ ဒီ Object တစ္ခုပဲသံုးမယ္ဆုိျပီး ဒီဇုိင္းဆင္ရင္ သံုးတယ္ေပါ႔ခမ်ာ။ အထူးသျဖင္႔ သူ႕ကို Instance ဘယ္ႏွစ္ခုအထိပဲသံုးမလဲဆိုတာမ်ိဳးကန္႕သတ္ခ်င္ရင္ အဆင္ေျပတယ္ေပါ႔ဗ်ာ။

Anti-pattern လို႕လည္းဆိုၾကသဗ်။ Anti-pattern ဆိုတာက သံုးသာသံုးေနတယ္။ အက်ိဳးသိပ္မရိွဘူး။ သူ႕ဘာသာသူ ရြာလည္ေနတယ္လို႕ဆိုလုိတယ္။ အသံုးမတတ္တာေၾကာင္႔လည္းျဖစ္ႏိုင္သလို၊ မလိုအပ္ဘဲသိပ္သံုးလြန္းတာေၾကာင္႔လည္းျဖစ္မယ္။ အင္တာဗ်ဴးရင္ေတာ႔ လႊတ္သာေျပာေပး။ ဒီလုိကိစၥေတြသိတယ္ဆိုတာ ေတာ္ရံုမဟုတ္ဘူး ထင္လာတဲ႔အထိေပါ႔။

Java မွာေတာ႔ ပ်င္းပ်င္းရိရိ singleton နဲ႕ မပ်င္းတပ်င္းဆိုျပီးႏွစ္ခုရိွတယ္ဗ်။

ပ်င္းတယ္ဆိုတာကေတာ႔ ခိုင္းတုိင္းမလုပ္ဘူးေပါ႔ခမ်ာ။ တျခားလူလုပ္ေပးမလား ထၾကည္႕တာေပါ႔။ ရိွရင္ ဒီေကာင္႔ကိုခုိင္းလုိက္ပါ။ ကြ်န္ေတာ္ဆက္အိပ္ေနခ်င္လို႕ဆိုတာမ်ိဳးကို ပ်င္းတယ္ေခၚတာေပါ႔။
ဒါေလးေတြေတာ႔ၾကည္႕ထားေပါ႔ဗ်ာ။ ေလေတြခ်ည္း စြတ္ေပါေနေတာ႔လည္း တကယ္မေရးတတ္ဘူးထင္ျပီးေမးၾကည္႕ရင္ ခက္ေနမယ္။ ခ်ေရးျပႏိုင္ေတာ႔ တစ္ပန္းခြဲေလာက္သာတာေပါ႔။

public class MySingleton { 
 private static MySingleton _instance = 
  new MySingleton(); 

 private MySingleton() { 
  // construct object . . . 
 } 

 public static MySingleton getInstance() { 
  return _instance; 
 } 

 // Remainder of class definition . . .

အဲဒီမွာၾကည္႕ရင္ MySingleton ၾကီးကို ေခၚလိုက္တာနဲ႕ instantiate လုပ္ျပီး memory ေပၚတင္ထားလုိက္တယ္။ static ပါတဲ႔အတြက္ သူက အလားတူေကာင္ေတြနဲ႕အတူရိွေနမရိွေန memory တစ္ခြင္မွာသူတစ္ေကာင္သာရိွေနဖုိ႕အတြက္ လုပ္ထားတယ္ေပါ႔ဗ်ာ။ ေခၚလိုက္တုိင္း တစ္ေကာင္ထြက္လာမယ္။ရိွေနတဲ႔ေကာင္ေသမယ္။ ျခေသၤ႔မင္းဆိုတာ တစ္ေကာင္တည္းပဲ မန္မိုရီတစ္ဂူတည္း ႏွစ္ေကာင္မေအာင္းခ်င္ဘူးေပါ႔ဗ်ာ။
ငပ်င္း singleton
public class MySingleton { 
 private static MySingleton _instance; 

 private MySingleton() { 
  // construct object . . . 
 } 

 // For lazy initialization 
 public static synchronized MySingleton getInstance() { 
  if (_instance==null)
   _instance = new MySingleton(); 
  } 
  return _instance; 
 } 
  // Remainder of class definition . . . 

Java ကို မခ်စ္ၾကတာ ဒီအေၾကာင္းေတြေၾကာင္႔ထင္တယ္။ ဘာေတြေလွ်ာက္ေရးထားမွန္းမသိတာမ်ားလုိ႕ျဖစ္မယ္။ synchronized ဆိုတာကေတာ႔ ဒီ method ကို တစ္ေယာက္သံုးေနရင္ေနာက္တစ္ေယာက္ကေစာင္႔ေနေပေတာ႔တဲ႔။ lock လုပ္တဲ႔သေဘာပါ။ အင္မတန္အႏၲရာယ္မ်ားပါတယ္။ ပထမတစ္ေယာက္က သူပဲ ထာ၀ရသံုးေနမယ္ဆိုရင္ ေနာက္တစ္ေယာက္က ေနာက္ဘ၀မွပဲသံုးရပါမယ္။ token ဆိုတဲ႔ network topology လို သူကပဲ အပိုင္စီးထားလိုက္ရင္က်န္တဲ႔သူေတြ ငုတ္တုတ္ေမ႔သြားသလိုေပါ႔ခမ်ာ။ အခုန static method ဆိုတာကလည္း နည္းနည္းပြားျပီးျပီဆိုေတာ႔ထပ္မပြားေတာ႔ပါဘူး။ ဒီ တစ္ေခါက္ေတာ႔ စစခ်င္း new နဲ႕ instantiate မလုပ္တာကိုေတြ႕ပါလိမ္႔မယ္။ if(instance==null) ဆိုတာကေတာ႔ ပ်င္းလို႕ အရင္အေကာင္ရိွေသးရင္ အဲဒီအေကာင္ကို ဆက္သံုးၾကပါ။ ငါ႔ကို မေခၚပါနဲ႕ဦးဆိုတဲ႔သေဘာပါပဲ။ တကယ္လုိ႕ ေရွ႕ကေကာင္ၾကြျပီဆိုမွ သူ႕ကို အသစ္ဖန္တီးျပီး သံုးလုိ႕ရမယ္ဆိုတဲ႔သေဘာပါပဲ။

Bill Pugh ဆိုတဲ႔ researcher ကလည္း ကဲတယ္ခင္ဗ်။ အခုနက ကြ်န္ေတာ္ေျပာတဲ႔ synchronized ၾကီးက ဒုကၡေပးတယ္ဆိုတာသူလည္း ေပါက္တယ္တဲ႔ခင္ဗ်။ သူကေတာ႔ researcher ပီပီ အခ်ိန္ေတြပိုေနေတာ႔ေလွ်ာက္ေရးပံုရပါတယ္။


public class Singleton {
        // Private constructor prevents instantiation from other classes
        private Singleton() { }
 
        /**
        * SingletonHolder is loaded on the first execution of Singleton.getInstance() 
        * or the first access to SingletonHolder.INSTANCE, not before.
        */
        private static class SingletonHolder { 

                public static final Singleton instance = new Singleton();
        }
 
        public static Singleton getInstance() {

                return SingletonHolder.instance;
        }
}


static final Singleton ပါခဗ်။ final keyword ကလည္း အင္မတန္က်ယ္တဲ႔ေခါင္းစဥ္တစ္ခုျဖစ္ပါတယ္။ အဲဒီလိုေရးလုိက္တာ သရက္ေစ႔ျဖစ္တယ္တဲ႔ခင္ဗ်။ thread-safe ဆုိတာ အခုန synchronized သံုးတာမ်ိဳး၊ တစ္ေယာက္သံုးေနတုန္း ေနာက္တစ္ေယာက္က ၀င္မရွဳပ္ေအာင္လုပ္တာမ်ိဳးကိုေခၚတယ္လို႕ အၾကမ္းမွတ္ထားလုိက္ရင္ရေလာက္ပါျပီ။

Regards,
Zero

အခုအခ်ိန္ကစျပီး ref: မ်ားကို လူေလးစားေလာက္ေအာင္ထည္႕ေတာ္မူသြားပါေတာ႔မယ္။ ေနာက္တစ္ခါ ျပန္ဖတ္ရင္ Bookmarks ကေန မရွာခ်င္ေတာ႔ဘူး။

ref:
http://java.sun.com/developer/technicalArticles/Programming/singletons/
http://en.wikipedia.org/wiki/Singleton_pattern
http://www.javaworld.com/javaworld/jw-04-2003/jw-0425-designpatterns.html
ဒီၤေအာက္ဆံုးကလင္႔ခ္ကေတာ႔ ဂန္းေအာ႔ဖ္ဖုိးကို ေနာက္ေျပာင္တယ္ခင္ဗ်။
http://www.infoq.com/news/2007/07/GoFCriticism

Servlet in 10 min

Servlet in 10 min

Servlet ေတြ အေၾကာင္းကို အလြယ္ေလးတစ္ခုေရးျပတာပါ။
Online မွာေတြ႕ေနၾကဟာေလးကို ပိုျပီးျပည္႕ျပည္႕စံုစံုျဖစ္ေအာင္ ရွင္းျပထားပါတယ္။


package business;

import java.io.*;
import javax.servlet.http.*;
import javax.servlet.*;

public class ServletExample extends HttpServlet {

public void doGet (HttpServletRequest req,
                     HttpServletResponse res)
    throws ServletException, IOException
  {
    PrintWriter out = res.getWriter();
    out.println("Hello, world!");
    out.close();
  }
}

Code ကေတာ႔မေျပာင္းမလဲ Hello, world ပါပဲ။
package ကို business ဆိုတဲ႔ package ထဲမွာေရးထားတာကိုေတြ႕မွာပါ။ အဲဒီလိုဆိုရင္ class ကို လွမ္းေခၚတဲ႔အခါမွာ business.ServletExample  လို႕ေခၚရပါတယ္။ HttpServlet ကို extend လုပ္ထားတာကိုလည္းေတြ႕ပါလိမ္႔မယ္။ ကြ်န္ေတာ္တို႕ေရးသမွ် servlet ေတြဟာ HttpServlet ကို extend လုပ္ရပါမယ္။


(HttpServletRequest req,HttpServletResponse res)
ဆိုတာကိုလည္းေတြ႕ၾကမယ္ထင္ပါတယ္။ HttpServletRequest ဆိုတာကိုအၾကမ္းဖ်င္းပဲေျပာသြားပါမယ္။ ေနာက္ပိုင္းမွာ အလ်င္းသင္႔ရင္ တခါအေသးစိတ္ထပ္ေျပာပါမယ္။ request ဆိုကတည္းက သူက ေတာင္းပါတယ္။ ပါလာတာေတြေပးခိုင္းပါတယ္။ html form တစ္ခုမွာ post လုပ္လိုက္ရင္ input parameters ေတြ form ထဲမွာပါလာပါတယ္။ အဲဒီ data ေတြကို လိုခ်င္တဲ႔အခါ HttpServletRequest ကေနယူႏုိင္ပါတယ္။ ေနာက္ဥပမာေတြၾကရင္လည္းထပ္ျပီးရွင္းျပပါဦးမယ္။အခုကေတာ႔ set up ေလးတစ္ခု လြယ္လြယ္ကူကူလုပ္ဖုိ႕ပါပဲ။ HttpServletResponse က response ဆိုတဲ႔အတုိင္း ျပန္ျပီးေျပာတာပါပဲ။ သူ႕ကို တစ္ခုခု လာေျပာရင္ စကားျပန္ေျပာသလိုေပါ႔။ ျပန္ေျပာတဲ႔စကားကလည္း အမ်ိဳးမ်ိဳးရိွသလို၊ သူမွာ response လုပ္မယ္႔ type ေတြရိွပါတယ္။ text/html လား pdf လား ၊ excel လားဆိုတဲ႔ content type ေတြရိွပါတယ္။ ေကာင္မေလးတစ္ေယာက္ကို propose သြားလုပ္သလိုေပါ႔။ ဟိုက ဘာနဲ႕မဆို ေကာက္ေပါက္ႏိုင္တယ္မဟုတ္လား။

ဒီမွာေတာ႔ Hello, World နဲ႕ေကာက္ေပါက္လိုက္ပံုရတယ္။


PrintWriter out = res.getWriter();
   out.println("Hello, world!");
    out.close();


Print Writer တစ္ခုယူျပီး ေရးခ်င္ရာေရးတယ္။ response မွာျပန္ေရးေပးလုိက္တယ္။ ဆိုလုိတာက ဒီ Servlet ကိုေခၚရင္ သူ႕ရဲ႕ doGet မွာ ဒါကို အေၾကာင္းျပန္လိမ္႔မယ္ေပါ႔။

ေရးတာျပီးရင္ Tomcat မွာ project ေလးတစ္ခုတည္ေဆာက္မယ္။
လြယ္လြယ္ကူကူ JavaExample ဆိုျပီးနာမည္ေပးမယ္။ အဲဒီအထဲမွာ index.html ဆိုျပီး html page တစ္ခုေရးထားပါ။

ျပီးရင္ JavaExample folder ထဲမွာ WEB-INF ဆိုတဲ႔ folder တစ္ခုေဆာက္ပါ။ Tomcat ကလည္း ေခတ္ေဟာင္းက မိဘမ်ားလို ေမွ်ာ္လင္႔ခ်က္ရိွပါတယ္။ သူက webapps ေအာက္က project တိုင္းကို index စီးျပီး WEB-INF ရံေစခ်င္ပါတယ္။ သူ႕ရဲ႕ default structure နဲ႕တူေအာင္ပါ။ WEB-INF ထဲမွာ web.xml ပါရပါမယ္။ ျပီးရင္ classes ဆိုတဲ႔ folder လည္းပါရပါမယ္။ အဲဒီခပ္ေပါေပါအကြက္ေတြကို အထင္မေသးနဲ႕ SCWCD မွာ ဒါေတြပဲေမးေနတာ။ ခပ္ေပါေပါေတြေပမယ္႔ အေျခခံအေနနဲ႕ေတာ႔သိတာေကာင္းပါတယ္။

web.xml ကိုၾကည္႕ရေအာင္ဗ်ာ။


[web-app xmlns="http://java.sun.com/xml/ns/j2ee" version="2.4"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http:/java.sun.com/dtd/web-app_2_3.dtd"]
  [servlet]
    [servlet-name]example[/servlet-name]
    [servlet-class]business.ServletExample[/servlet-class]
  [/servlet]

  [servlet-mapping]
    [servlet-name]example[/servlet-name]
    [url-pattern]/testHello[/url-pattern]
  [/servlet-mapping]
[/web-app]


ဒါက အေျခခံပံုစံေပါ႔ဗ်ာ။ ဒီ config မ်ိဳးေတြကုိ Java မွာ အမ်ားၾကီးေတြ႕ရမယ္။ servlet  နဲ႕ servlet-mapping ဆိုျပီးႏွစ္ခုရိွမယ္။ servlet-name ႏွစ္ခုကတူရပါမယ္။ ၾကိဳက္နဲ႕နာမည္အတူတူေပးထားလုိ႕ရပါတယ္။ ကိုယ္ၾကိဳက္တာ ကိုယ္မလုပ္ရတာက servlet-class ပါ။အခုနကေျပာသလို business.ServletExample  ဆိုျပီး class name ကို package နဲ႕တကြ အျပည္႕အစံုေရးပါတယ္။ ဒါမွလည္း tomcat ကရွာေတြ႕ပါတယ္။ [က< ကို အစားထိုးထားတာပါ။ blogspot ကစိတ္ၾကီးေတာ႔ html tag တို႕မည္သည္ less than , greater than ပါကုန္သည္ဆိုျပီး စစ္ေနတာေၾကာင္႔ အစားထုိးလုိက္ရပါတယ္။ ဂရိတ္တားသန္းကေတာ႔ ] အျဖစ္အစားထုိးထားပါတယ္။ web.xml ကေခါင္းစဥ္ၾကီးတစ္ခုပါ။ အခုေတာ႔ အက်ဥ္းခ်ဳပ္လုိက္ပါတယ္။

ေအာက္နားေလးမွာပါတဲ႔ url-pattern ကေတာ႔ က်ယ္ျပန႔္ပါတယ္။ ေလာေလာဆယ္ က်ဥ္းလိပ္တဲ႔အေနနဲ႕ တစ္ခုပဲေရးျပထားပါတယ္။/testHello နဲ႕၀င္လာရင္ သူ႕အလုပ္လုိ႕ယူဆတယ္လုိ႕ဆိုလိုပါတယ္။

အခုကိစၥမွာဆုိရင္ http://localhost:8080/JavaExample/testHello
ဆိုရင္ သူ႕အလုပ္လုိ႕ယူဆပါလိမ္႔မယ္။ သူ႕အလုပ္လုိ႕ယူဆရင္ သူ႕ဆရာကိုအေၾကာင္းၾကားပါလိမ္႔မယ္။ သူ႕ဆရာနာမည္က example ဆိုရင္ သူ႕ဆရာ example ကို ဘာလုပ္ရမလဲဆရာဆုိျပီးေမးပါလိမ္႔မယ္။ သူ႕ဆရာကလည္း အေပၚဘက္က သူေနရာကိုျပန္တက္ျပီး စားပြဲကအံ႔ဆြဲကိုဖြင္႔ေတာ႔မွ business.ServletExample ကိုေတြ႕ပါတယ္။ အဲဒီေကာင္ကိုသာ run လုိက္ေပေတာ႔ဆိုျပီး run လုိက္တဲ႔အခါမွာ doGet ကိုေရာက္ျပီး Hello, world! ကိုျမင္ရပါလိမ္႔မယ္။

အခုေျပာေနတာဟာ hello world အေၾကာင္းလုိ႕မ်ား ထင္ေနၾကမလားမသိပါဘူး။ မဟုတ္ရပါဘူး။ တကယ္ေျပာေနတာက tomcat ရဲ႕ project folder structure အေၾကာင္းပါ။ အဲဒီ ServletExample ကို compile လုပ္ဖုိ႕အတြက္ လိုတဲ႔ jar file ကိုလည္း tomcat ရဲ႕ lib folder ထဲမွာေတြ႕ႏိုင္ပါတယ္။ servlet-api.jar ျဖစ္ပါတယ္။ ဒီ jar ဟာအေရးၾကီးပါတယ္။ tomcat ဗားရွင္းအနိမ္႔ေတြမွာ run ဖုိ႕ဆုိရင္လည္း အဲဒီ tomcat ရဲ႕ lib ထဲက servlet-api.jar ကိုယူျပီး compile လုပ္ရပါတယ္။

ဒီအခု post ဟာ hello world servlet example ေတြထဲမွာေတာ႔ ေတာ္ေတာ္ေလးျပည္႕ျပည္႕စံုစံုျဖစ္တဲ႔ hello world တစ္ခုလုိ႕ထင္ပါတယ္။ မ်ားေသာအားျဖင္႔ အလုပ္လုပ္တဲ႔သူေတြမွာ အလုပ္ကရႏိုင္တဲ႔ အေတြ႕အၾကံဳေတြ တေလွၾကီးရႏိုင္ေပမယ္႔ အလုပ္မလုပ္ရေသးတဲ႔လူေတြအဖုိ႕ ပိုျပီးျပည္႕ျပည္႕စံုစံုေရးဖုိ႕လိုမယ္ထင္လို႕ ဒီပို႕စ္ကိုေရးလုိက္ပါတယ္။

ဒီေနရာမွာ သိပ္ဟုန္သြားမွာဆိုးလို႕ servlet API ေတြရဲ႕ Version ေတြထည္႕မေျပာေတာ႔ပါဘူး။ ေနာက္ပို႕စ္မ်ားၾကမွ ပိုျပီး တိတိက်က် ေရးလိုက္ပါဦးမယ္။

ေပ်ာ္ရႊင္ဖြယ္ေလ႔က်င္႔ခန္းေလးျဖစ္ပါေစ။

Regards,
Zero

Apache Tomcat Tips

Apache Tomcat Tips

၁။JAVA_HOME for Tomcat
အလကားေပးတဲ႔ Apache Tomcat Web container ဟာ Java သမားေတြအတြက္ေတာ႔ မရိွမျဖစ္တစ္ခုပါပဲ။
Java Version အမ်ိဳးမ်ိဳးနဲ႕သံုးခ်င္တဲ႔အခါ Tomcat ထဲမွာ configure လုပ္လုိ႕ရပါမယ္။ တစ္ေၾကာင္းထဲပါ။

bin folder ေအာက္က catilina.bat ထဲမွာျပင္ရပါမယ္။ text editor တစ္ခုခုနဲ႕ .bat  file ကို ဖြင္႔လုိက္ရင္

set JAVA_HOME=C:\jdk1.6.0_13\

သတိထားဖုိ႕က ေနာက္ဆံုးက \ ေလးပါ။

ဘယ္ေနရာမွာထည္႔ရမလဲဆိုတာကေတာ႔ rem ဆိုတဲ႔ comments ေတြနဲ႕ ပိတ္ထားတဲ႔ block of comments ေတြ ေအာက္နားမွာပါ။ တခါတေလၾကရင္ jdk 1.5 နဲ႕ေျပာင္းျပီး test လုပ္ေပးဖုိ႕လုိတယ္၊ တစ္ခါတစ္ေလၾကရင္ 1.6 နဲ႕ test လုပ္ခ်င္လည္းလုပ္မယ္။ အဲဒီလိုအခါမ်ိဳးမွာ သိပ္အသံုး၀င္ပါတယ္။

၂။No more pop-up


Tomcat ကို run တဲ႔အခါမွာ pop-up window တစ္ခု တက္တက္လာတာ ၆ျမင္ကတ္စရာသိပ္ေကာင္းပါတယ္။ ပထမ run လုိက္တဲ႔ command prompt ေလးတစ္ခုထဲမွာပဲၾကည္႕ခ်င္ရင္ နည္းနည္းျပင္ရပါမယ္။ အဲဒါေလးကလည္း အရင္ရံုးကလူေတြဆီက မွတ္ထားခဲ႔တာေလးတစ္ခုပါ။ လက္ေဆာင္ျပန္ေပးလုိက္ပါတယ္။

bin folder ထဲက catilina.bat က တစ္ေၾကာင္းကိုျပင္ရပါမယ္။

call "%EXECUTABLE%" start %CMD_LINE_ARGS%

အဲဒီ start ကို run လို႕ေျပာင္းလိုက္ရင္ လိုခ်င္တဲ႔အတုိင္းရပါမယ္။

call "%EXECUTABLE%" run %CMD_LINE_ARGS%

ဒီ command က ေအာက္ဆံုးနားမွာပါပဲ။ ရွာရလြယ္ပါတယ္။

အဆင္ေျပမယ္လုိ႕ ေမွ်ာ္လင္႔ပါတယ္။

Regards,
Zero

Notes: bro divinity is now in marriage leaves :)
Bro, please add ur apache and tomcat experience on CentOS when u have time.

Eclipse Shortcuts && Tips

Eclipse Shortcuts && Tips

အခုတေလာ အိမ္မွာ စာျပန္လုပ္ရင္း လြယ္ကူတဲ႔ေလ႔က်င္႔ခန္းေတြ တင္ဖုိ႕ ျပင္ဆင္ေနပါတယ္။
တခ်ိဳ႕ကိစၥေတြဟာ လုပ္ေနၾကနည္းေတြနဲ႕အသားက်ျပီး ပုိလြယ္တာေတြ မလုပ္မိတာေတြရိွတတ္တယ္။ ဒါေတြကို နည္းနည္းေလာက္ေရးလုိက္ပါတယ္။ စေရးၾကမယ္႔လူေတြအတြက္ good practise ေတြျဖစ္ေစမယ္ထင္ပါတယ္။

1.User Library in Ecilpse

Jar files ေတြကို ပံုမွန္အားျဖင္႔
project right clik>Build Path>>Configure Build Path>>Libraries
အဲဒီေရာက္ရင္ Jar ေတြကို Add Jars လုပ္လိုက္တယ္။

အဲဒီ နည္းလမ္းဟာ အင္မတန္မွ အဆင္ေျပပါတယ္။ ေတာ္ေတာ္လည္းလြယ္ကူပါတယ္။ အခုေနာက္ပိုင္းမွာ project အသစ္တစ္ခု ရိွတုိင္း လုိတဲ႔ jar files ေတြ ထပ္ထပ္ထည္႕ေနရတာ tedious ျဖစ္ရတယ္။ အဲဒီေတာ႔ Eclipse မွာ user library ေလးလုပ္ထားလိုက္ရင္ ေနာက္ project ေတြကို develop လုပ္တဲ႔အခါ jar files add ေနရတဲ႔ အလုပ္တစ္ခုသက္သာသြားမွာပါ။ Jar File အစား user lib တစ္ခုတည္း add လုပ္ရင္ လုိအပ္တဲ႔ jar ေတြ အကုန္ရႏုိင္ပါတယ္။

User Library အသစ္တစ္ခု create လုပ္ဖုိ႕ကို Eclipse Menu ထဲက Window>>Preference ထဲသြားျပီး search box မွာ user လုိ႕ရိုက္ထည္႕လုိက္ပါ။ Java Build Path>>User Libraries ဆိုတာေတြ႕ရင္ User Libraries ကို click ေခါက္ပါ။ ျပီးရင္ ညာဘက္မွာ New လုပ္ပါ။ New လုပ္ျပီး နာမည္ကို myUserLibs လို႕ေပးတယ္ဆိုပါေတာ႔။ myUserLibs ကို click လုပ္ျပီး Add Jars လုပ္ပါ။ လုိခ်င္တဲ႔ Jars files ေတြ တစ္ခါတည္း ခ်ိတ္ထားလုိက္ပါ။

အဲဒီ ကိစၥျပီးရင္
project right clik>Build Path>>Configure Build Path>>Libraries ျပန္သြားပါ။
Add Jars အစား Add Library ေရြးပါ။ User Library ေရြးျပီး next လုပ္ပါ။ အဲဒီမွာ အခုန create လုပ္ထားတဲ႔ myUserLibs ကိုေတြ႕ပါလိမ္႔မယ္။ ေရြးလိုက္ပါ။ အဲဒါပါပဲ။

မထူးျခားေပမယ္႔ အဆင္ေျပ အသံုးတည္႕ပါတယ္။

၂.Ctr+Shift+O (ကြန္ထရိုး ရွစ္ဖ္ အို)
ေနာက္ဆံုးက အိုျဖစ္ပါတယ္။ သုညမဟုတ္ပါဘူး။ တခါတေလ ဘာျဖစ္တတ္လဲဆိုေတာ႔ ေရွ႕ကေရးသြားတဲ႔သူေတြက warning ျပေနတာေလးေတြကို မသန္႕ရွင္းသြားတဲ႔အခါမ်ိဳးေတြမွာ အသံုးတည္႕ပါတယ္။ အထူးသျဖင္႔ import လုပ္ထားျပီး မသံုးတဲ႔ declaration ေတြအတြက္ေတာ႔ တစ္ခုခ်င္းလိုက္ဖ်က္ေနမယ္႔အစား control shift O ကို တစ္ျပိဳင္နက္ႏွိပ္လုိက္ရင္ အဲဒီ မလိုဘဲ အပိုျဖစ္ေနတာေတြကို IDE က ဖ်က္ေပးပါတယ္။

၃။Ctrl+1 (Quick Fix)

ပထမပံုမွာ ၾကည္႕ရင္ Book ဆိုတဲ႔ Class က ဘယ္ကမွန္းမသိပါဘူး။ Book က ဒီ example မွာေတာ႔ ကြ်န္ေတာ္ေရးထားတဲ႔ bean တစ္ခုျဖစ္ပါတယ္။ model package ေအာက္မွာရိွပါတယ္။ သိပ္မပ်င္းတဲ႔သူေတြကေတာ႔ import model.Book; လို႕ေရးလိုက္ၾကမွာပဲ။ ပ်င္းခ်င္လည္းရပါတယ္။ တခါတေလ package အားလံုးကို အာဂံုမေဆာင္ႏုိင္တဲ႔အခါမွေတာ႔ အဲဒီ Class ေပၚမွာ cursor ကို ထားျပီး ctrl+1 လုပ္လုိက္ရင္ IDE ကေန suggest ေတာ္မူပါလိမ္႔မယ္။













ေအာက္ကပံုမွာ suggest လုပ္ထားတာေတြ႕ႏိုင္ပါတယ္။ Book ဆိုတဲ႔ class ႏွစ္ခုရိွတယ္။ ဘယ္ဟာကိုေရြးမလဲေမးပါတယ္။ ကြ်န္ေတာ္ေရးထားတဲ႔ class က model package ေအာက္မွာလို႕ အခုနကေျပာထားတာကို သတိရမယ္ဆိုရင္ ဘယ္ဟာကို ေရြးရမယ္ဆိုတာ သိေလာက္ပါျပီ။ အဲဒါကို ေရြးလုိက္ရံုနဲ႕ import ေပးပါလိမ္႔မယ္။ Eclipse မွာ အဲဒါေတြပါပါတယ္။ မ်ားမ်ားသံုးေပးပါ။












၄။getters and setters

ငယ္တုန္းကေတာ႔ အဲဒါေတြ သိပ္ပ်င္းတယ္။ Java Bean ေတြေရးရင္ အျမဲတမ္းမပါမျဖစ္ဟာ getters and setters ပဲ။ Bean ဆိုလုိ႕ Bean နဲ႕ Class ဘာကြာလဲဆိုတဲ႔ေမးခြန္းေတြရိွပါတယ္။ bean ကေတာ႔ no arg constructor ပါမယ္။ သူ႕အထဲက private variableေတြအတြက္ public method နဲ႕အထုတ္အသြင္းလုပ္ႏုိင္ဖုိ႕ getters နဲ႕ setters ပါမယ္။ reusable ျဖစ္ေအာင္ေရးထားတာျဖစ္တဲ႔အတြက္ မလိုအပ္တာေတြကို bean ထဲမထည္႕ၾကဘူး။ ၀ါသနာပါရင္ေတာ႔ ျဖည္႕စြက္ေရးလုိ႕ရတယ္။ ကြ်န္ေတာ္႔အၾကိဳက္အရေတာ႔ Bean ကို Bean သန္႕သန္႕ေလးပဲထားေလ႔ရိွတယ္။ လိုရင္ တျခား Helper တစ္ခုခုေရးမယ္။ interface တစ္ခုခုထဲ implements လုပ္ျပီး ေရးခ်င္လည္းေရးမယ္။ bean ကိုေတာ႔ ရိုးရိုးွရင္းရွင္းပဲထားလုိက္တယ္။ Bean မွာပါတဲ႔ Getter, Setter ေတြသိပ္မ်ားလာရင္ ေရးေနရတာ ပ်င္းစရာသိပ္ေကာင္းတယ္။ Eclipse team ကလည္း ဒါကိုသိပါတယ္။

Bean/Classတစ္ခု ေရးေနတဲ႔အခါ
 private String name;
 private int id;
 private String nric;

စတာေတြေရးျပီးရင္ right click  ႏွိပ္ျပီး source ထဲက Generate Getters and Setters ထဲ၀င္ျပီး အဲဒီ private variables ေတြကို select မွတ္ျပီး OK လုပ္လိုက္ရင္ getters ေတြ setters ေတြ ေအာ္တုိမစ္တစ္ လွလွပပေလး ေရးျပီးသားျဖစ္ပါတယ္။ Thank U Eclipse.

၅။ Ctrl+Click

Method ေတြျဖစ္ျဖစ္၊ class ေတြျဖစ္ျဖစ္၊ control click နဲ႕သြားၾကည္႕ရွာၾကည္ရင္ ျမန္ျမန္ေရာက္ျပီး error ကိုလည္း ခဏေလးေတြ႕ႏိုင္ပါတယ္။ အဲဒါေတြကို java ေရးေနတဲ႔လူေတြ အားလံုး သိၾကပါတယ္။ မသိေသးတဲ႔ စေရးတဲ႔လူေတြအတြက္ေတာ႔ အဲဒါေတြဟာ အေရးၾကီးပါတယ္။ ေက်ာင္းေတြမွာ IDE မသင္ေပးလုိက္တဲ႔အတြက္ IDE အေၾကာင္းကိုလည္း အခ်ိန္နည္းနည္းယူျပီး ေလ႔လာသင္႔ပါတယ္။ ဒါမွ ကိုယ္သံုးေနတဲ႔ IDE ဟာ ဘာေတြ support လုပ္လည္းပိုသိႏုိင္ပါလိမ္႔မယ္။

Regards,
Zero

Thursday, December 15, 2011

အပ်င္းေျပ Remote Access MySql

အပ်င္းေျပ Remote Access MySql

အခုတေလာ အိမ္မွာ program ေလးဘာေလး မေမ႔ေအာင္ ျပန္ေရးပါတယ္။

MySql ကို remote ကေန၀င္ခ်င္ရင္ fire wall မွာ Port blocking လုပ္ထားလားၾကည္႕ပါ။ Window Firewall မွာ port ကို configure လုပ္ေပးလုိ႕ရပါတယ္။ default ဆိုရင္ Port 3306 ကို ဖြင္႔ေပးလုိက္ပါ။ ေနာက္တစ္ခုက security suite ေတြမွာပါတဲ႔ firewall ေတြမွာ portေတြပိတ္ထားရင္လည္း ဖြင္႔ေပးပါ။

MySQL ကုိ စသြင္းကတည္းက remote Login လုပ္မယ္ဆုိတာေရြးထားလိုက္ရင္လြယ္ပါတယ္။

Database တစ္ခုမွာ root access ကို remote ကေန ဖြင္႔မေပးတာေတာ႔အေကာင္းဆံုးပါပဲ။ သီးျခား user account တစ္ခု create လုပ္ျပီး privilege ေတြေပးပါ။ လြယ္လြယ္ကူကူ လုပ္ခ်င္ရင္ SQLYog ျဖစ္ျဖစ္သြင္းထားျပီး Manage User ကေန user ေတြ create လုပ္ျပီး access rights ေတြ define လုပ္ႏုိင္ပါတယ္။

အားလံုးအိုေကျပီဆိုရင္ေတာ႔ တျခား စက္တစ္လံုးကေန MySQL run ထားတဲ႔စက္ကို ping ၾကည္႕ပါ။
ping လုိ႕ရရင္ telnet နဲ႕ Port ပြင္႔ေနလား မပြင္႔ေနလားၾကည္႕ပါ။ Windows 7 မွာေတာ႔ telnet client ကိ္ု အရင္ on ရပါမယ္။ default က off ထားပါတယ္။

ping IP address.
telnet IP adress(space)port No.

အဲဒီလိုရျပီဆိုရင္ေတာ႔ program ကေန ခ်ိတ္ၾကည္႕လုိ႕ရပါျပီ။ SQL client နဲ႕ျဖစ္ျဖစ္ java ရဲ႕ JDBC နဲ႕ျဖစ္ျဖစ္ခ်ိတ္ျပီး ေရးလို႕ရပါျပီ။


My SQL မွာပဲျဖစ္ျဖစ္ တျခား RDBMS ေတြမွာပဲျဖစ္ျဖစ္။ Access right ကို အမ်ားၾကီးေပးထားျပီး ျပန္ေလ်ာ႔ခ်င္တယ္ဆိုရင္သတိထားဖုိ႕လိုပါတယ္။ ဥပမာအားျဖင္႔ user A ကို ပထမ delete ေရာ update access ပါေပးထားျပီး၊ select တစ္ခုပဲ ျပန္ေပးတယ္ဆိုပါေတာ႔။ userA ဟာ သူ႕ access right ကို modify မလုပ္ခင္ login ၀င္ထားရင္ အဲဒီ session ရိွေနသေရြ႕ေတာ႔ သူ႕မွာ အရင္ privilegeေတြက်န္ေနပါေသးတယ္။ remote log-in ၀င္တဲ႔ user account ေတြဆိုရင္ session ကို kill လုပ္တာျဖစ္ျဖစ္၊ မလုပ္တတ္ရင္ MySQL service ကို restart လုပ္လုိက္တာျဖစ္ျဖစ္ လုပ္ရပါမယ္။ အဲဒီလိုမလုပ္သေရြ႕ေတာ႔ user access update လုပ္လိုက္တာဟာ privilege ေတြ ေလ်ာ႔သြားဖုိ႕၊ေျပာင္းသြားဖုိ႕အတြက္ မေသခ်ာပါဘူး။ အဲဒီ အေျခခံအခ်က္ေတြကို သတိထားဖုိ႕လိုပါတယ္။

သိပ္မ်ား အၾကမ္းဖ်င္းဆန္ေနမလားမသိဘူးဗ်ာ။
screen captured လုပ္ရမွာပ်င္းတာနဲ႕ ဒီအတိုင္းပဲေရးလုိက္ပါတယ္။
အဆင္ေျပမယ္ထင္ပါတယ္။
အဆင္မေျပဘူးဆိုရင္လည္း မေျပတာေလး comment ေရးခဲ႔ပါ။

Regards,
The zero.

Wednesday, November 30, 2011

Data Profiling Tool, The SQL Power Architect

Data Profiling Tool, The SQL Power Architect

အလကားရျပီး သံုးေပ်ာ္တဲ႔ Tool တစ္ခုပါပဲ။
အခုတေလာ အဲဒါနဲ႕ပဲ ေန႕တုိင္း အလုပ္မ်ားေနပါတယ္။

ဘာအတြက္သံုးသလဲဆိုရင္ေတာ႔ Data ေတြဟာ Database ထဲမွာ သိမ္းထားျပီးရင္း သိမ္းထားနဲ႕ ဘယ္ေလာက္ အေျခအေနဆိုးေနလဲမသိေတာ႔ေလာက္ေအာင္ျဖစ္လာပါတယ္။ Name field မွာ null ျဖစ္ေနတာ၊ NRIC မွာ null ျဖစ္ေနတာေတြ၊ date ေတြက 1900 ေတြ၊ 2900 ေတြျဖစ္ေနတယ္ဆိုရင္ data volume မ်ားလာရင္ analyze လုပ္ဖုိ႕ခက္ပါတယ္။ အဲဒါေတြအတြက္ ဒီ SQL Power Architect ကို အလကား download လုပ္ျပီးစစ္ေဆးၾကည္႕ႏုိင္ပါတယ္။ Oracle အတြက္ သံုးေနပါတယ္။ MS SQL အတြက္လည္းရိွပါတယ္။

လိုအပ္ရင္သံုးလို႕ရေအာင္ပါ။
ထူးထူးျခားျခားမဟုတ္ေပမယ္႔ အသံုးတဲ႔တဲ႔ Profiler Tools တစ္ခုအေၾကာင္း သတင္းေပးတဲ႔သေဘာပါပဲ။

Setup ကလည္းမခက္ပါဘူး။
JDBC driver ေတာင္းရင္လည္း driver api ကို download လုပ္ျပီး locate လုပ္ေပးလုိက္ရံုပါပဲ။

DB connection ရျပီဆိုရင္ Table Name မွာ right click လုပ္ျပီး profile လုပ္ရံုပါပဲ။ အဲဒီ result ကို view selected လုပ္လုိက္ရင္ Graphical view နဲ႕ေရာ csv view နဲ႕ပါ အေသးစိတ္ၾကည္႕ႏိုင္ပါတယ္။ export လုပ္လို႕လည္းရပါတယ္။ အလကားရတဲ႔ႏြားကို သြားျဖဲျပီးၾကည္႕ျပီးသကာလမွာ ဒီႏြားၾကီးမဆိုးဘူးလို႕ သေဘာေပါက္ရပါတယ္။

(မၾကာမီ post မ်ားကို ေန႕စဥ္ update လုပ္သြားပါမယ္။)

Regards,
Zero

Wednesday, October 12, 2011

Design Patterns

Design Patterns

Today, I brush up on design patterns.
Here is the link for you to read and to do so :

Sometimes, we knew it from the source code though we didn't see this is which design pattern. There will be a B=I=G questionmark about design patterns, do we need to know Design patterns? The question is as simple as that. But the answer will be not so straightforward. (Somebody may think the opposite of straightforward will be wavybackward.) Indeed, there is no such thing design patterns are the musts, all developer should know design patterns as his sweetheart's birthday. In the real world solution, we may use a lot of design patterns according to the framework's support or according to the structure of the architect/tech lead, who take most of the share from the projects. Anyway, the answer will absolutely depends on you. Do you want to know clearly and vividly about the design pattern though you may not use (except in your interviews)? If you give a mere yes or a small nod or shrug your shoulders, you should learn about these design patterns.

Unfortunately, there is no shortcut in reading a book. If you are equally lazy as me, try to read regular hour(/s) everyday instead of reading a tech-book per day as geeks do. There are some patterns you should know as a good developer. These patterns are very useful if you really want to write quality codes.

For design patterns, I am reading Head First Design Patterns - O'Reilly Media.
One of my friends who suggests to read this book says it is easier to understand than the book written by Gang of 4. Of course all the head first series are fun to read.

We should be professional at least. Though we may not use a lot of Design Pattern in current environments, we should know proper ways of coding and basic patterns.

Most of us learnt design patterns @ school. After we had got some experiences from work, we should now digest our knowledge from school and fill the gap in our understanding of the software development.

There are two ways to prevent the reinventing the wheel; the first is not to do anything, sit tight and do nothing special, the second is to learn the proven solutions that conquer the same old barriers before.

Sometimes, working 2 hard can lead you 2 B mediocre. Read in advance something you may need to know in your life/work before you encounter the big problems.

Thanks for reading my post.

I will try to post some design patterns summaries soon.

Regards,
Zero/Zero

Thursday, June 23, 2011

အပလာသခ်ာၤ အင္ အိုရီကယ္။

အပလာသခ်ာၤ အင္ အိုရီကယ္။

Applied Maths ကို ခပ္ၾကမ္းၾကမ္းဘာသာျပန္ပစ္လိုက္တာ။

သခ်ာၤကို Set ေတြအမ်ားၾကီးေလ႔လာခဲ႔တာ ငယ္ကတည္းပဲ။ ကိုယ္႔ကိုယ္ကိုယ္လည္း သခ်ာၤအေတာ္ေလးေတာ္တယ္ထင္မိတာ။ ဒီေန႕ေတာ႔ စာထဲမွာသင္ခဲ႔တာကို ဘယ္လိုျပန္အသံုးခ်ရမလဲဆိုတာမွာညံ႕တယ္လုိ႕သိရတယ္။

Database ေတြဟာ သခ်ာၤရဲ႕ Set theroy ေတြေပၚမူတည္ျပီးတည္ေဆာက္ထားပါတယ္။
Intersect ေတြ Union ေတြ Minus ေတြရိွပါတယ္။

ဒီေန႕လိုခ်င္တာက NRIC တူျပီး PLAN မတူတဲ႔ policies ေတြပါ။

PLAN ေရာ NRIC ပါတူတာဆိုရင္ ဒီလုိယူလို႕ရပါတယ္။

select * from table_name where (NRIC,PLAN) in
(
('NRIC1','PLAN1'),
('NRIC2','PLAN2'),
('NRIC3','PLAN3'),
..etc
);


တစ္ခုတူျပီးတစ္ခုမတူတာကို ၾကေတာ႔ in နဲ႕လုပ္လုိ႕မရဘူးဗ်။

အဲဒီေတာ႔ excel မွာပဲ query ကို genereate လုပ္ျပီး၊ တစ္ေၾကာင္းစီ result ကို ျပန္ေပါင္းရေကာင္းမလားစဥ္းစားတယ္။ လိုင္း ၅၀၇ လိုင္းေလာက္ လုပ္ရမယ္။

ေနာက္ေတာ႔ ေဘးနားက တရုတ္ကိုေမးၾကည္႕တယ္။ သူလည္းမရဘူးလုိ႕ေျပာတယ္။ ျပီးေတာ႔မွ ထပ္စဥ္းစားျပီး MINUS နဲ႕လုပ္ရင္ရမယ္ထင္တယ္ဆိုျပီး formula ျပန္ေရးၾကတယ္။ သူစဥ္းစားတာမွန္တယ္။

အမွန္ကရတယ္။ ရုတ္တရတ္စဥ္းစားမိဖုိ႕ခက္တာပါ။ NIRC တူတာေတြကို ယူလိုက္ျပီး NRIC ေရာ PLAN ပါတူတာကို ျပန္ႏႈတ္လိုက္ရင္လိုခ်င္တဲ႔အေျဖကိုရပါတယ္။

select NRIC from tableA where NIC in (
'NRIC1',
'NRIC2',
'NRIC3',
....
)MINUS
select NRIC from tableA where (NRIC,PLAN) in
(
('NRIC1','PLAN1'),
('NRIC2','PLAN2'),
('NRIC3','PLAN3'),
..etc
);

Set ေတြကို ပံုဆြဲၾကည္႕ရင္ လြယ္ေပမယ္႔ တကယ္ၾကံဳလာေတာ႔ ရုတ္တရတ္စဥ္းစားလုိ႕မထြက္တတ္ဘူးဆိုတာကိုေျပာခ်င္တာပါ။ MINUS မွာလည္း တစ္ခ်ိဳ႕ျပႆနာေလးေတြရိွပါေသးတယ္။ လုပ္ရင္းကိုင္ရင္းပိုျပီးေကာင္းတဲ႔ query ေတြေရးတတ္ဖုိ႕ေလ႔လာေနတုန္းပါပဲ။

ေနာက္တစ္ခုက Excel တစ္ခုလံုး အသံုးခ်နည္းဆိုျပီးေရးရမလားမသိဘူး။ Excel မွာလုပ္လုိ႕ရတာေတြအမ်ားၾကီးပဲရိွေသးတယ္။ အထူးသျဖင္႔ query ေတြကို sql format ေရးဖုိ႕ concat လုပ္ျပီး drag ဆြဲသြားလုိက္တာတုိ႕ဘာတုိ႕၊ သိပ္လြယ္တယ္။ ျမန္တယ္။

double qoutes ေပၚေအာင္ double code 4 ခုေရးရတာလည္း ရယ္စရာေကာင္းတယ္။ တစ္ခုက escape character အေနနဲ႕သံုးတာပါ။ ေနာက္ျပီး oracle မွာ နာမည္မွာ single quote ပါရင္ ဒီအတိုင္းထည္႕ေရးလို႕မရဘဲ || ေတြနဲ႕ concat လုပ္ဖုိ႕လုိတာကို excel မွာကတည္းက replace all လုပ္ပစ္လုိက္လုိ႕ရပါတယ္။ Excel ကို မ်ားမ်ားသံုးရင္ query ေတြ တလေဟာေရးရတဲ႔ေနရာေတြမွာ အေတာ္ေလးသက္သာပါတယ္။ TRIM လုပ္ဖုိ႕တုိ႕၊ substring ရွာဖုိ႕တုိ႕ကိုလည္း Excel မွာပါျပီးသားျဖစ္တဲ႔အတြက္ formula တစ္ခုေလာက္ေရးျပီး query ေတြ တရေဟာ drag လုပ္ႏုိင္ပါျပီ။

ကိုယ္သက္သာဖုိ႕ဆိုတာကိုယ္႔တာ၀န္ပါပဲ။
ဘာမွမသိလို႕ ခက္တဲ႔နည္းေတြနဲ႕လုပ္ေနရတာမ်ိဳး ဘယ္ေတာ႔မွမျဖစ္ေစနဲ႕။

ကိုယ္႔ထက္ေတာ္တဲ႔သူေတြသက္သာေနတာကိုလည္း အလကားေနအထင္မေသးနဲ႕။ သူတို႕ဆီက productive ျဖစ္တာေလးေတြေလ႔လာပါ။

Lazy developers rule the creation of the effective ways.

Thursday, June 2, 2011

Copy ကူးတာကိုလည္း တစ္ခါတေလ backup လုပ္တယ္လို႕ေခၚတယ္

တစ္ခ်ိဳ႕ေတြေပါ့၊ လိုခ်င္ေတာ့ ၾကီးၾကီးက်ယ္က်ယ္ ။ Daily full backup ၊ one month cycle တဲ့။ Backup software ေတာ့မဝယ္ခ်င္ဘူး ၊ ဘယ္လိုပဲရရတဲ့ backup ျဖစ္ရင္ျပီးေရာတဲ့။ File ေတြမွားမွားဖ်က္ၾက overwrite ေတြ မွားမွားလုပ္ၾကလြန္းလို႕တဲ့။ ဒီလိုလား ၊ ရပါတယ္။ xcopy နဲ႕ပဲ လုပ္လို႕ရပါတယ္။ အဲဒါနဲ႕ပဲ ဒီေန႕ သုံးေၾကာင္း bat script ေလးတစ္ခုေရးျဖစ္တယ္။ အမွန္က ဘယ္မွာေတြ့ဖူးမွန္းမသိတာတစ္ခုကို မွီညမ္းျပီး ဟိုးအရင္တစ္ခါက ေရးထားတာပါ။ နည္းနည္းေလးပဲျပင္လိုက္ရတယ္။

@Echo off
rd /s /q E:\$Recycle.bin
xcopy D:\Company\* E:\Serverbackp\Company\%date:~4,2%\* /Y /Q /S


ဒုတိယ တစ္ေၾကာင္းက ပံုမွန္ဆိုမလိုပါဘူး။ ဒီ user ေတြက ဘာေတြလုပ္မွန္းမသိ မၾကာမၾကာ recycle bin corrupted error ျဖစ္တယ္။ ဘာလို႕ျဖစ္လည္း သူတို႕ဘာလုပ္လည္းဆိုတာ သူတို႕ကိုတိုင္လည္းမသိဘူး။ Recycle bin ကအေရးမၾကီးဘူး၊ ရတယ္တဲ့။ ဟုတ္တယ္ေလ မွားဖ်က္မိလို႕ ျပန္လိုခ်င္ရင္ backup ေတြရွိေနမွာပဲ။ အဲဒါနဲ႕ က်ေနာ့ script ထဲမွာ အဲ quickfix ေလးထဲ့ေရးလိုက္တာ။

ပထမလိုင္းကေတာ့ အလကား output ေတြေပၚေပၚလာရင္ မ်က္စိေနာက္လို႕ echo off လိုက္တာ ။ Bat ေရးဖူးတဲ့သူတိုင္း သိပါတယ္။
ဒုတစ္ယလိုင္းကေတာ့ recycle bin error ကို quickfix အေနနဲ႕ Empty recycle bin လုပ္လိုက္တာ။ အမွန္က Recycle.Bin directory ကို ဖ်က္လိုက္တာပါ။ ဒါေပမယ့္ တစ္ခုခု delete လုပ္ရင္ျဖစ္ျဖစ္၊ logout / login လုပ္ရင္ျဖစ္ျဖစ္ recycle.bin folder က ျပန္ create ျဖစ္ပါတယ္။ အဲေတာ့ ဒါ command line က empty recycle bin လုပ္လိုက္တာပဲလို႕ သေဘာထားပါတယ္။ :D

ေနာက္ဆုံးလိုင္းကေတာ့ Windows ရဲ့ အသုံးတည့္ command ေလးတစ္ခုျဖစ္တဲ့ xcopy နဲ႕ files ေတြကို ကူးဖို႕ပါ။ ဒီမွာ ျပသနာ နည္းနည္းရွိပါတယ္။ က်ေနာ္တို႕က one month cycle လိုခ်င္တာပါ။ ဆိုလိုတာက ေန႕စဥ္ overwrite မလုပ္ခ်င္ပါဘူး။ ေန႕စဥ္ new backup set ထားသြားျပီး တစ္လၾကာမွ ပထမေန႕က backup set ကို overwrite ခ်င္တာပါ။ အဲဒါေၾကာင့္ ေနာက္က destination မွာ %date~:4,2% ဆိုတာေလးပါေနတာပါ။ Windows မွာ %date% environmental variable က system date ကို ကိုယ္စားျပဳပါတယ္။ %date% ကမွ ေလးလုံးေျမာက္ကေန ငါးလုံးေျမာက္အထိ ( ႏွစ္လုံးထဲ) လိုခ်င္လို႕ %date~:4,2% လို႕ေရးတာပါ။ ကိုယ္ယူထားတယ့္ date / time format ေပၚမွာ မူတည္ပါလိမ့္မယ္။ mm-dd-yyyy ဆိုရင္ေတာ့ 7,2 လို႕ယူရပါလိမ့္မယ္။ အေနာက္က /Y ကေတာ့ overwrite ဖို႕ yes / no prompt ေတြမွာ အကုန္ yes လို႕သတ္မွတ္ျပီး overwrite သြားဖို႕၊ /Q ကေတာ့ process output မျပဖို႕နဲ႕ ၊ /S ကေတာ့ subdirectories ေတြပါ ကူးဖို႕ ထဲ့ထားတာပါ။

Diskspace ပိုးဆိုးပက္စက္တက္တာကလြဲရင္ သူတို႕လိုခ်င္သလိုျဖစ္ပါတယ္။ Diskspace ကေတာ့ အမွန္ဆို compress ေလးေလာက္လုပ္သင့္တာေပါ့ေနာ္။ ဒါေပမယ့္ user က ဒီတိုင္းက သူတို႕အတြက္ ပိုေကာင္းတယ္၊ ဘာမွမလုပ္ရပဲ backup file ေတြကို ျမင္ရတာ ပိုသေဘာက်တယ္ဆိုလို႕ ျဖစ္သလိုပဲ လုပ္ေပးလိုက္ပါတယ္။ အမွန္က backup လုပ္တာလို႕ ေျပာဖို႕ေတာင္ ခက္ပါတယ္၊ တစ္ျခားတစ္ေနရာရာကို copy ကူးထားလိုက္တာပါပဲ။ ကိုယ့္ဟာကို compression လုပ္ခ်င္ရင္ေတာ့ winrar command line tools ေလးနဲ႕ လုပ္လို႕ရပါတယ္။

Divinity

Tuesday, May 31, 2011

MySQL root password reset

MySQL ကဘယ္ သေကာင့္သားက install သြားမွန္းမသိ၊ root password လည္း ဘယ္နားမွာမွ မွတ္မထား၊ documentation ကလည္းမရွိ ၊ ဟုတ္ေတာ့ေနျပီ ။ ဒီထဲက database ေတြကို ေရႊ႕ဖို႕ဟာ ဘယ္ mysql account password မွမသိဘူး။ ဘယ္လို export ထုတ္ရပါ့။ o_O

တျခား database ေတြလည္း သိပ္မရင္းႏွီးေတာ့ တျခား database ေတြမွာ ခက္လားမခက္လား ေတာ့ မသိဘူး။ MySQL မွာေတာ့ မခက္ပါဘူး။ MySQL server command ေတြထဲမွာ skip-grant-tables ဆိုတယ့္ option ရွိပါတယ္။ Privileges system ကို မသုံးပဲ ၊ database အားလုံးကို unrestricted access ျဖစ္သြားပါတယ္။ Database downtime ေလး မိနစ္ဝက္ေလာက္ေတာ့ ရွိမွာေပါ့။ ဘယ္တတ္ႏိုင္မလည္း ။

ပထမဆုံး MySQL ကို --skip-grant-tables option နဲ႕ ျပန္စပါ။
> mysqld_safe --skip-grant-tables &


ေနာက္ဆုံးက Ampersand (&) ေလးကေတာ့ process ကို background process အျဖစ္ run လိုက္တာပါ ။ ဒီလို run လိုက္ရင္ MySQL က ဝင္ခ်င္တိုင္းဝင္ ထြက္ခ်င္တိုင္းထြက္လို႕ရျပီ ။
> mysql


Root user အေနနဲ႕ MySQL ထဲကို ဝင္သြားပါလိမ့္မယ္။ အဲၾကမွ password ျမန္ျမန္ reset လုပ္ေပါ့။
mysql> UPDATE mysql.user SET password=PASSWORD('New-password') WHERE User='root';


Mysql database ထဲက user ဆိုတယ့္ table မွာ password ဆိုတယ့္ column ကို update လိုက္တာေပါ့။ ေနာက္က Password(' ') ဆိုတာၾကီးကေတာ့ MySQL ရဲ့ password hashing function ပါ။ Query မွာတုန္းက plain text ၾကီးနဲ႕ ႐ိုက္ေပမယ့္ database ထဲကို hash အေနနဲ႕ insert သြားလုပ္လိမ့္မယ္။ ဒီ query က တျခား mysql account password ေမ့ရင္လည္း အသုံးတဲ့ပါတယ္။

ျပီးရင္ flush privileges လုပ္လိုက္ရင္ privileges system ျပန္ျပီး active ျဖစ္ပါျပီ။ ဆိုလိုတာက ပံုမွန္အတိုင္ တျခား account restriction ေတြျပန္ရွိျပီေပါ့။ က်ေနာ္ကေတာ့ MySQL ကို restart ျပန္လုပ္ေလ့ရွိပါတယ္။ init script ကို ျပန္ေခၚျပီး restart ခ်လိုက္တာ ဘာေလာက္မွမၾကာပါဘူး။

ကဲ ဒါဆို MySQL root password reset ရသြားျပီ။ က်န္တာေတာ့ ကိုယ့္ဟာကို export ဆက္လုပ္ေတာ့ေပါ့။ :)

Divinity

Friday, May 20, 2011

OpenSource ေတြသုံးၾကည့္ရေအာင္ (1) ( Openfiler - Opensource NAS)

ဒီေန႕ေခတ္က OpenSource ရဲ့ေခတ္လို႕ေျပာရင္ေတာင္ လြန္မယ္မထင္ဘူး။ Commercial products ေတာ္ေတာ္မ်ားမ်ားအတြက္ alternative အေနနဲ႕ Opensource product ေတြရွိေလ့ရွိပါတယ္။ Microsoft Office ေလာက္မေကာင္းဘူးလို႕ေျပာလို႕ရေပမယ့္ OpenOffice.org ဆိုလည္း သုံးလို႕ အဆင္ေျပပါတယ္။ Firewall မွာလည္း Fortinet တို႕ Checkpoint တို႕ကို မမွီေပမယ့္ home and small office users ေတြေလာက္အတြက္ လံုေလာက္တယ့္ capability ကိုေပးႏိုင္တယ့္ Opensource firewall ေတြအမ်ားၾကီးပါ ။ Licensed version လည္း ဝယ္သုံးရတာ သက္သာတာ က်ေနာ္တို႕ႏိုင္ငံမွာပဲရွိပါတယ္။တျခားႏိုင္ငံေတြက က်ေနာ္တို႕ေလာက္ License version မသုံးႏိုင္လို႕ Opensource ေတြကို အားကိုးရတယ္။ EMC ကိုဖို႕မျဖစ္ႏိုင္ေပမယ့္ budget cut down ျဖစ္ျပီး အသုံးတဲ့တယ့္ Opensource NAS တစ္ခုအေၾကာင္း သတင္းေပးခ်င္ပါတယ္။

Small office တစ္ခုအေနနဲ႕ centralized file storage တစ္ခုေတာ့ထားခ်င္တယ္၊ ဒါေပမယ့္ storage server license ဝယ္ရမွာလည္း ေစ်းၾကီးတယ္။ Office မွာကမွ လူက ဆယ္ေယာက္ေလာက္ရွိတာ၊ server license ေတာ့မဝယ္ခ်င္ဖူးဆိုရင္ Opensource nas ေတြအမ်ားၾကီးရွိပါတယ္။ အဲဒီထဲမွာေတာ့့ OpenNAS နဲ႕ Openfiler က stable ျဖစ္ျပီး လူသုံးမ်ားတယ္။ Small office မဟုတ္ေပမယ့္လည္း budget cut down လုပ္ခ်င္ရင္ stable ျဖစ္လို႕ သုံးလို႕ အဆင္ေျပႏိုင္ပါတယ္။ ဒီ post မွာ က်ေနာ္တို႕ Openfiler ရဲ့ capability ကို ၾကည့္ၾကည့္ရေအာင္ ။

Overview
Linux based ပါပဲ။ OpenLDAP ၊ NFS ၊ NIFS ၊ SAMBA ၊ iSCSI initiator အစရွိသျဖင့္ NAS တစ္ခုအတြက္ လိုအပ္တာေတြျပန္ ေပါင္းထဲ့ထားတယ့္ Linux based တစ္ခုပါပဲ။ Software RAID ၊ Hardware RAID ႏွစ္ခုလုံးကို support လုပ္ပါတယ္။ WebUI ပါလို႕ administration လြယ္ကူပါတယ္။ ဒါေပမယ့္ UI ကေနမရတယ့္ configuration အတြက္လည္း ကိုယ့္ဟာကိုယ္ console terminal ကေန ျပင္လို႕ troubleshoot လုပ္လို႕ရတာမို႕ သုံးရတာ flexible ျဖစ္ပါတယ္။ WebUI မွာတင္ Java servlet တစ္ခုနဲ႕ console access ထဲ့ေပးထားပါတယ္။ ( init 1 ႐ိုက္ဖို႕လိုရင္ေတာ့ သုံးလို႕မရႏိုင္ေပမယ့္ ေတာ္ရုံေတာ့ အသုံးတဲ့ပါတယ္)

Storage Flexibility
Openfiler မွာ iSCSI configure လုပ္လို႕ရလို႕ iSCSI capable external enclosure တစ္ခုခုနဲ႕ ခ်ိတ္ဆက္သုံးလို႕ရပါတယ္။ Storage တိုးခ်င္ရင္ enclosure ထဲမွာ hard disk ေတြထပ္တိုးျပီး Openfiler က Volume Group expend လုပ္လိုက္ရင္ရျပီ ။ အဲေတာ့ အျမဲတိုးတက္လာတယ့္ storage space လိုအပ္ခ်က္ကို အမွီလိုက္ႏိုင္ပါတယ္။ လက္ရွိ version မွာ 60 TB အထိ support လုပ္ပါတယ္။ Online volume resizing လုပ္လို႕ရတာမို႕ space expend လုပ္ခ်င္ရင္ေတာင္ downtime မရွိ လုပ္ႏိုင္ပါတယ္။

User Account Control
OpenLDAP ပါတာမို႕ local ldap server configure လုပ္ျပီး user acct control လုပ္လို႕ရပါတယ္။ တကယ္လို႕ network ထဲမွာ authentication server ရွိျပီးသားဆိုလည္း ရွိေနျပီးသား LDAP server သို႕မဟုတ္ AD ကိုခ်ိတ္ဆက္အသုံးျပဳႏိုင္ပါတယ္။ ဘယ္ user / group က ဘယ္ share ကို အသုံးျပဳႏိုင္သလည္းဆိုတာကိုလည္း configure လုပ္ရတာ လြယ္ကူပါတယ္။

Quota control
User ေတြကို quota သတ္မွတ္လို႕ရသလို ၊ share တစ္ခုခ်င္းကိုလည္း ဘယ္ share က ဘယ္ေလာက္ space ထိပဲ grow လုပ္ခြင့္ျပဳမယ္ဆိုျပီး သတ္မွတ္လို႕ရပါတယ္။ Company အတြင္းက ဘယ္ department က ဘယ္ေလာက္ space ပဲသုံးလို႕ရမယ္ဆိုျပီး သက္မွတ္တာမ်ိဳးအတြက္ အဆင္ေျပပါတယ္။

Rich Communication methods
SSH ၊ SMB ၊ CIFS ၊ NFS ၊ FTP အကုန္ support လုပ္လို႕ Unix ၊ Linux ၊ Mac ၊ Windows မေရြး ခ်ိတ္ဆက္အသုံးျပဳႏိုင္ပါတယ္။

High Availability
Openfiler မွာ HA cluster setup လုပ္လို႕ရပါတယ္။ တစ္လုံးထက္ပိုတယ့္ Openfiler server ေတြကေတာ့ Cluster တစ္ခုအေနနဲ႕ serve လုပ္ႏိုင္တာမို႕ single point of failure ကိုေရွာင္ႏိုင္ပါတယ္။ (ဒါကလည္း iSCSI လိုမ်ိဳးနဲ႕ တြဲမွ အဆင္ေျပမွာပါ။ )

Snapshot
Openfiler ရဲ့ volume တစ္ခုခ်င္းကို snapshot ႐ိုက္ျပီးတစ္ေနရာရာ ျပန္သြားထားလို႕ရပါေသးတယ္။ Storage server ကို backup ျပန္လုပ္တာေပါ့။ Revert ျပန္လုပ္ရတာလည္း လြယ္လြယ္ကူကူပဲ။

Easy Administration
ခုနကေျပာသလို ႐ိုးရွင္းျပီး ျပည့္စံုတယ့္ WebUI ေၾကာင့္ administrate လုပ္ရတာ လြယ္ကူလြန္းပါတယ္။ Volume group ေတြ၊ User / group quota ေတြနဲ႕ မစိမ္းဖူးဆိုရင္ ဘာမွ အထူးအစမ္းမရွိႏိုင္ပါဘူး။

Openfiler ရဲ့ ေကာင္းတယ့္အခ်က္ေတြအမ်ားၾကီးရွိပါေသးတယ္။ အလကားရတာမို႕ Cost effective ျဖစ္တယ္လို႕ေျပာရင္ လြန္မယ္မထင္ပါဘူး။ Exchange server ၊ VMware စတာတို႕နဲ႕တြဲျပီး storage အျဖစ္သုံးလို႕လည္းရပါတယ္။ Opensource တို႕ရဲ့ထုံးစံအတိုင္း documentation ကေတာ့ သိပ္အားမေကာင္းပါဘူး။ ဒါေပမယ့္ feature ေတာ္ေတာ္မ်ားမ်ားက ဘာ technical skills မွမလိုပဲ လြယ္လြယ္ကူကူပဲ သုံးလို႕ရပါတယ္။

က်ေနာ့္ ပတ္ဝန္းက်င္မွာ က်ေနာ္ေန႕စဥ္အမွ် ထိေတြ႕ေနရတယ့္ Opensource product ေတြအေၾကာင္း တစ္ခုခ်င္း ေရးပါအုန္းမယ္ ။ ( ေျပာျပန္ျပီ)

Divinity

Thursday, May 19, 2011

ေအာ္ရီကယ္

ေအာ္ရီကယ္

ဒီေန႕ ရံုးမွာ ေရွ႕ကလူက data ႏွစ္ခုကို column ႏွစ္ခုမခြဲဘဲ ေပါင္းထည္႕သြားတာကို query ျပန္ေရးတဲ႔အခါ ႏွစ္ခုခြဲျပီးျပန္လိုခ်င္တာနဲ႕ delimter တို႕ splitter တို႕အေၾကာင္းကိုေရာက္သြားတယ္။
တစ္ခါတစ္ေလ knowledge transfer လုပ္တာေကာင္းတယ္။ လူမ်ားသိျပီးသားကို ပြားယူလုိက္တယ္။ ေဘးနားက ကတံုးနဲ႕ညီေလးကို ေဟ႔ေကာင္ ငါဒီလိုလိုခ်င္တာေလး ေရးပါဦးဆိုျပီး ေမးလုိက္ေတာ႔ သံုးမိနစ္အၾကာမွာ ေအာက္ပါ script ကိုရတယ္။

SELECT SUBSTR(DEPT, 1, INSTR(DEPT, '|') - 1) AS L_DEPT,

SUBSTR(DEPT, INSTR(DEPT, '|') + 1) AS R_DEPT,

DEPT

FROM INCOME.T_MCS_ENDOR_UPLOAD;


မူလျပႆနာက ဒီလို Dept(Department) Column မွာ Department နဲ႕ Cost Centre values ႏွစ္ခုကို pipe(|) demlimter နဲ႕ၾကံၾကံဖန္ဖန္ထည္႕သြားတယ္။ Department Data ေတြက

356|T&O-SG-Account Services
7185|IBG3-E2-E

စသျဖင္႔ေပါ႔ေလ။ ေရွ႕က Cost Center ။ Pipe ေနာက္က Department ။ အေပၚက query ကိုၾကည္႕ရင္
SUBSTR(DEPT, 1, INSTR(DEPT, '|') - 1) AS L_DEPT

substr Function ကိုသံုးထားတယ္။ Substring ရဲ႕အတုိေကာက္လုပ္ထားတာမွန္းသိသာတယ္။ ဘာကို substring လုပ္မွာလဲဆိုတာကို ၾကည္႕ရင္ အေနာက္မွာ Dept ဆိုတဲ႔ Department column ကိုေတြ႔မယ္။ ဆက္ၾကည္႔ရင္ 1 ကိုေတြ႕မယ္။ 1 က start position ပါ။ Java မွာလို zero ကမစပါဘူး။ ေရွ႕ဆံုးကေကာင္က postion 1. ဟုတ္ျပီ ေရွ႕ဆံုးက ရျပီ။ ဘယ္နားမွာဆံုးမလဲ။ ဒီအတိုင္းေတြးၾကည္႕ pipe ေရွ႕မွာဆံုးမယ္။ pipe ရဲ႕ေရွ႕တစ္ေနရာဆိုေတာ႔ pipe ရဲ႕ေနရာ -1။ pipe ရဲ႕ေနရကို ရွာဖို႕ INSTR function သံုးတယ္။ Department Data ရဲ႕ pipe (|) ရိွတဲ႔ေနရာဆိုေတာ႔ INSTR(DEPT, '|') ဆိုျပီးရွာတယ္။ AS L_DEPT ကေတာ႔ Alias လုပ္တာေပါ႔။ အဲဒီ pipe ရဲ႕ ဘယ္ဘက္ျခမ္းေပါ႔။ တစ္နည္းအားျဖင္႔ as CostCentre ေပါ႔။

ဒုတိယပိုင္းကေတာ႔ပိုလြယ္သြားပါျပီ။ pipe ေနာက္ကေန အဆံုးအထိ။ အဆံုးအထိဆိုရင္ end position မထည္႕ေပးလည္းရပါတယ္။ စတဲ႔ေနရာက pipe ရဲ႕ေနာက္။ pipe ရဲ႕ အေရွ႕ေနရာမွာ တစ္ႏႈတ္ရင္ pipe ရဲ႕ေနာက္တစ္ေနရာ တစ္ေပါင္းလုိက္ရံုပါပဲ။

SUBSTR(DEPT, INSTR(DEPT, '|') + 1) AS R_DEPT

သူမို႕လုိ႕ သံုးမိနစ္နဲ႕ေရးႏိုင္ေပမယ္႔ ကိုယ္႔ဘာသာကိုယ္ရွာေရးရင္ နာရီ၀က္ေလာက္မၾကာရင္ေတာင္ ဆယ္႔ငါးမိနစ္ေလာက္ ၾကာသြားႏုိင္ပါတယ္။ အဲဒီ အခ်ိန္ကို အခုလို ျပန္ေရးဖုိ႕အသံုးခ်လိုက္ပါတယ္။ လုပ္ေဖာ္ကိုင္ဖက္ကေတာ္ရင္ သူ႕ဆီက မ်ားမ်ားေလ႔လာပါ။ အခုေတြ႕ရတာက code ေရးတာမွာ သိပ္မကြာေပမယ္႔ sql skills မွာ ေတာ္ေတာ္ကြာပါတယ္။

တရုတ္ျပည္မွာ sql အလြန္ေရးတဲ႔ development process ရိွပံုရပါတယ္။
သိသြားရင္ ဘာမွမဟုတ္ေပမယ္႔ တစ္ခုခုကို သိလုိက္ရတာဟာ ေက်နပ္ဖုိ႕ေကာင္းပါတယ္။ တကယ္လုိလာမွ ထရွာေနမယ္႔အစား ဖတ္ထားရင္းမွတ္ထားလုိက္မယ္ဆိုရင္ တစ္ခ်ိန္မွာ အသံုး၀င္ႏိုင္ပါတယ္။

ေအာ္ .. စကားစပ္မိလို႕ အဲဒီလို data ႏွစ္ခုကို column တစ္ခုထဲထည္႕ဖုိ႕ ဘယ္ေတာ႔မွ မၾကိဳးစားပါနဲ႕။ အဲဒီလို လုပ္ၾကတဲ႔သူေတြဟာ အပ်င္းထူတာလည္းျဖစ္ရင္ျဖစ္မယ္။ မဟုတ္ရင္လည္း ေဆာ႔ေနတာေနမွာ။ ဘယ္ေနရာမ်ိဳးေတြမွာၾကံဳရတတ္လဲဆိုတာကေတာ႔ အင္မတန္ကို data ေတြမ်ားျပီး column ထပ္တိုးဖို႕မသင္႔ဘူးလုိ႕(ဒါကလည္း ထင္တာေနမွာပါ) ယူဆရတဲ႔ table ေတြမွာ column အသစ္တိုးမယ္ဆိုရင္ DBA နဲ႕ စကားေျပာေနရမယ္ဆုိျပီး ၾကိတ္လုပ္လုိက္ပံုရပါတယ္။

ေအာ္ စင္ကာပူ ေဆာ႔ဖ္၀ဲေလာက ....... သနားစရာ။


Notes:
အလကားေပးေနတဲ႔ JDK ေတြကိုေတာင္ အနည္းဆံုး Java2 (JDK 1.5) ေျပာင္းမသံုးႏုိင္တဲ႔ စင္ကာပူက အူေၾကာင္ေၾကာင္ Architect ေတြရဲ႕ Decision making ကို အံ႔အားသင္႔ပါတယ္။ Backward compatibility အတြက္လည္းမဟုတ္ပါဘူး။ ဘာမွန္းကို မသိတာ။ ပိုဆိုးတာ အစိုးရေဆာ႔ဖ္၀ဲလ္ေတြ။ JDK 1.3။

ဒုတိယ အညံ႔ဆံုး ေဆာ႔ဖ္၀ဲေတြကိုေတာ႔ starhub မွာေရးတယ္ထင္တယ္။ ဘယ္ေနရာမွမဆို error ေလးအေဖြးသားနဲ႕။