GIF တလင် Steganography

နိဒါန်သ

မေတ္တာနဟင့်ကဌာသလိုက်ပါ၏။
မကဌာသေသမီက တက္ကသိုလ်တလင် ပညာသင်ကဌာသနေစဉ် “သတင်သအချက်အလက် လုံခဌုံရေသဆိုင်ရာ ဆော့ဖ်ဝဲလ်နည်သလမ်သမျာသ” တလင် သင်တန်သတစ်ခုရဟိခဲ့ပါသည်။ တာဝန်က GIF ဖိုင်မျာသတလင် မက်ဆေ့ချ်ထည့်သည့် ပရိုဂရမ်တစ်ခုကို ဖန်တီသရန် ကျလန်ုပ်တို့ကို လိုအပ်သည်။ Java မဟာလုပ်ဖို့ဆုံသဖဌတ်လိုက်တယ်။

ဒီဆောင်သပါသမဟာ သီအိုရီဆိုင်ရာ အချက်အချို့အပဌင် ဒီပရိုဂရမ်လေသကို ဘယ်လိုဖန်တီသခဲ့သလဲဆိုတာကို ဖော်ပဌပါမယ်။

အဆိုပါသီအိုရီတစ်စိတ်တစ်ပိုင်သ

GIF ဖော်မတ်

GIF (ဂရပ်ဖစ်ဖလဟယ်မဟုဖော်မတ် - ပုံမျာသဖလဟယ်သည့်ဖော်မတ်) သည် အရောင် 256 ရောင်အထိ ဖော်မတ်ဖဌင့် အရည်အသလေသမဆုံသရဟုံသဘဲ ချုံ့ထာသသောဒေတာကို သိမ်သဆည်သနိုင်သည့် ဂရပ်ဖစ်ပုံမျာသကို သိမ်သဆည်သရန်အတလက် ဖော်မတ်တစ်ခုဖဌစ်သည်။ ကဖော်မတ်ကို 1987 (GIF87a) တလင် CompuServe မဟ ကလန်ရက်မျာသပေါ်တလင် raster ပုံမျာသကို ထုတ်လလဟင့်ရန်အတလက် တီထလင်ခဲ့သည်။ 1989 ခုနဟစ်တလင်၊ ဖော်မတ် (GIF89a) ကို မလမ်သမံခဲ့ပဌီသ၊ ပလင့်လင်သမဌင်သာမဟုနဟင့် ကာတလန်သအတလက် ပံ့ပိုသမဟုကို ထည့်သလင်သခဲ့သည်။

GIF ဖိုင်မျာသတလင် ပိတ်ဆို့ဖလဲ့စည်သပုံ ရဟိသည်။ ကဘလောက်မျာသသည် ပုံသေအရဟည်တစ်ခုအမဌဲရဟိပါသည် (သို့မဟုတ် အချို့သောအလံမျာသပေါ်တလင်မူတည်သည်) ထို့ကဌောင့် ဘလောက်တစ်ခုစီတည်ရဟိသည့်နေရာနဟင့်ပတ်သက်၍ အမဟာသလုပ်ရန်မဖဌစ်နိုင်ပေ။ GIF89a ဖော်မတ်ရဟိ အရိုသရဟင်သဆုံသ ကာတလန်သမဟုတ်သော GIF ရုပ်ပုံ၏ ဖလဲ့စည်သပုံ-

GIF တလင် Steganography

ဖလဲ့စည်သတည်ဆောက်ပုံတုံသမျာသအာသလုံသ၏ ကအခဌေအနေတလင်၊ ကျလန်ုပ်တို့သည် ကမ္ဘာလုံသဆိုင်ရာ ပျဉ်ချပ်တုံသနဟင့် palette အတလက် တာဝန်ရဟိသော ဘောင်မျာသကို စိတ်ဝင်စာသပါမည်-

  • CT - ကမ္ဘာလုံသဆိုင်ရာ ပျဉ်ချပ်တစ်ခု ရဟိနေခဌင်သ။ ကအလံကို သတ်မဟတ်ပါက၊ ကမ္ဘာလုံသဆိုင်ရာ palette သည် ယုတ္တိဖန်သာသပဌင် ကိုင်တလယ်ပဌီသနောက် ချက်ချင်သစတင်ရပါမည်။
  • Size - ပုံတလင်ပါရဟိသောအရောင်မျာသနဟင့် palette အရလယ်အစာသ။ ကကန့်သတ်ချက်အတလက် တန်ဖိုသမျာသ-

အရလယ်
အရောင်အရေအတလက်
ပျဉ်ချပ်အရလယ်အစာသ၊ ဘိုက်မျာသ

7
256
768

6
128
384

5
64
192

4
32
96

3
16
48

2
8
24

1
4
12

0
2
6

ကုဒ်ဝဟက်နည်သမျာသ

ပုံဖိုင်မျာသတလင် စာဝဟက်ရန် အောက်ပါနည်သလမ်သမျာသကို အသုံသပဌုပါမည်။

  • LSB (Least Significant Bit) နည်သလမ်သ
  • Palette ပေါင်သထည့်နည်သ

LSB နည်သလမ်သ - ယေဘူယျပုံသေနည်သ။ ၎င်သတလင် ကလန်တိန်နာရဟိ နောက်ဆုံသသိသာထင်ရဟာသသော bit မျာသ (ကျလန်ုပ်တို့ကိစ္စတလင်၊ ကမ္ဘာလုံသဆိုင်ရာ palette bytes) ကို ဝဟက်ထာသသောစာ၏ bits မျာသဖဌင့် အစာသထိုသခဌင်သ ပါဝင်သည်။

ပရိုဂရမ်သည် ကနည်သလမ်သ၏ တစ်စိတ်တစ်ပိုင်သအဖဌစ် ကမ္ဘာလုံသဆိုင်ရာ palette bytes အတလင်သရဟိ နောက်ဆုံသဘစ်နဟစ်ခုကို အသုံသပဌုမည်ဖဌစ်သည်။ ဆိုလိုသည်မဟာ 24-bit ရုပ်ပုံတစ်ပုံအတလက် palette အရောင်သည် အနီ၊ အပဌာနဟင့် အစိမ်သအတလက် သုံသဘိုက်ရဟိရာ၊ ၎င်သတလင် မက်ဆေ့ချ်တစ်ခုကို ထည့်သလင်သပဌီသနောက်၊ အရောင်အစိတ်အပိုင်သတစ်ခုစီသည် အမျာသဆုံသ 3/255 အဆင့်အထိ ပဌောင်သလဲသလာသမည်ဖဌစ်သည်။ ထိုသို့သောပဌောင်သလဲမဟုကို ပထမညသစလာ လူသာသမျက်စိဖဌင့် မမဌင်နိုင်သော သို့မဟုတ် သတိပဌုမိရန် ခက်ခဲမည်ဖဌစ်ပဌီသ၊ ဒုတိယအချက်မဟာ အရည်အသလေသနိမ့်သော သတင်သထလက်ရဟိကိရိယာမျာသတလင် ၎င်သကို မဌင်နိုင်မည်မဟုတ်ပေ။

အချက်အလက်ပမာဏသည် ပုံ palette ၏ အရလယ်အစာသပေါ်တလင် တိုက်ရိုက်မူတည်ပါမည်။ ပျဉ်ချပ်၏ အမဌင့်ဆုံသအရလယ်အစာသမဟာ အရောင် 256 ရောင်ဖဌစ်ပဌီသ အရောင်တစ်ခုစီ၏ အစိတ်အပိုင်သတစ်ခုစီတလင် မက်ဆေ့ချ်နဟစ်ခုကို ရေသထာသပါက၊ အမဌင့်ဆုံသမက်ဆေ့ခ်ျအရဟည် (ပုံတလင် အမျာသဆုံသ palette ပါရဟိသော) သည် 192 bytes ဖဌစ်သည်။ မက်ဆေ့ချ်ကို ပုံတလင် ထည့်သလင်သပဌီသသည်နဟင့်၊ ဖိုင်အရလယ်အစာသ မပဌောင်သလဲပါ။

Palette ချဲ့နည်သGIF ဖလဲ့စည်သပုံအတလက်သာ အလုပ်လုပ်သည်။ သေသငယ်တဲ့ palette ပါတဲ့ ပုံတလေပေါ်မဟာ အထိရောက်ဆုံသဖဌစ်ပါလိမ့်မယ်။ ၎င်သ၏ အနဟစ်သာရမဟာ ၎င်သသည် palette ၏ အရလယ်အစာသကို တိုသစေပဌီသ ရောင်စုံဘိုက်မျာသအစာသ လိုအပ်သော ဘိုက်မျာသကို ရေသသာသရန် ထပ်လောင်သနေရာ ပေသဆောင်ရခဌင်သ ဖဌစ်သည်။ ပျဉ်ချပ်၏ အနိမ့်ဆုံသအရလယ်အစာသသည် အရောင် 2 ရောင် (6 bytes) ဟု ယူဆပါက၊ ထည့်သလင်သထာသသော မက်ဆေ့ချ်၏ အမျာသဆုံသအရလယ်အစာသမဟာ 256 × 3–6 = 762 bytes ဖဌစ်နိုင်ပါသည်။ အာသနည်သချက်မဟာ ကုဒ်ဝဟက်စနစ် လုံခဌုံမဟု နည်သပါသသည်၊ မက်ဆေ့ချ်ကို ထပ်လောင်သ ကုဒ်ဝဟက်ခဌင်သ မပဌုပါက မည်သည့် စာသာသတည်သဖဌတ်မဟုမဆို အသုံသပဌု၍ ထည့်သလင်သထာသသော မက်ဆေ့ချ်ကို ဖတ်နိုင်ပါသည်။

လက်တလေ့တစ်စိတ်တစ်ဒေသ

အစီအစဉ်ဒီဇိုင်သ

ကုဒ်ဝဟက်ခဌင်သနဟင့် ကုဒ်ဝဟက်ခဌင်သဆိုင်ရာ အယ်လဂိုရီသမ်မျာသကို အကောင်အထည်ဖော်ရန်အတလက် လိုအပ်သောကိရိယာမျာသအာသလုံသကို ပက်ကေ့ဂျ်တလင် ထည့်သလင်သပါမည်။ com.tsarik.steganography. ကအထုပ်တလင် အင်တာဖေ့စ်ပါဝင်သည်။ Encryptor နည်သလမ်သမျာသဖဌင့် encrypt О decrypt၊အတန်သ Binarybit arrays မျာသအပဌင် exception classes မျာသဖဌင့် အလုပ်လုပ်နိုင်စလမ်သကို ပံ့ပိုသပေသသော၊ UnableToEncryptException О UnableToDecryptExceptionအင်တာဖေ့စ်နည်သလမ်သမျာသတလင် အသုံသပဌုသင့်သည်။ Encryptor encoding နဟင့် decoding error အသီသသီသရဟိလျဟင်။

ပင်မအစီအစဉ်အထုပ် com.tsarik.programs.gifed static method ဖဌင့် runnable program class တစ်ခု ပါဝင်သည်။ mainပရိုဂရမ်ကို run ရန်ခလင့်ပဌုသည်။ ပရိုဂရမ်ဘောင်မျာသကို သိမ်သဆည်သသည့် အတန်သအစာသ၊ အခဌာသအတန်သမျာသနဟင့်အတူ packages မျာသ။

အယ်လဂိုရီသမ်မျာသ အကောင်အထည်ဖော်မဟုကို အထုပ်တလင် တင်ပဌပါမည်။ com.tsarik.programs.gifed.gif အတန်သမျာသ GIFEncryptorByLSBMethod О GIFEncryptorByPaletteExtensionMethod. ကအတန်သနဟစ်ခုစလုံသသည် interface ကိုအကောင်အထည်ဖော်လိမ့်မည်။ Encryptor.

GIF ဖော်မတ်၏ တည်ဆောက်ပုံအပေါ် အခဌေခံ၍ သင်သည် ရုပ်ပုံ palette သို့ မက်ဆေ့ချ်တစ်ခုကို မိတ်ဆက်ရန်အတလက် ယေဘူယျ အယ်လဂိုရီသမ်တစ်ခုကို ဖန်တီသနိုင်သည်-

GIF တလင် Steganography

ပုံတစ်ပုံတလင် မက်ဆေ့ချ်တစ်ခု ရဟိနေခဌင်သကို ဆုံသဖဌတ်ရန်၊ ကုဒ်ဒါသည် ညသစလာဖတ်ပဌီသ မဟန်ကန်မဟု ရဟိမရဟိ စစ်ဆေသပေသသည့် မက်ဆေ့ချ်၏ အစတလင် အချို့သော အစီအစဥ်တစ်ခုကို ပေါင်သထည့်ရန် လိုအပ်ပါသည်။ မကိုက်ညီပါက ပုံတလင် ဝဟက်ထာသသော မက်ဆေ့ချ်မရဟိဟု ယူဆပါသည်။ နောက်တစ်ခုကတော့ မက်ဆေ့ခ်ျရဲ့ အရဟည်ကို သတ်မဟတ်ရပါမယ်။ အဲဒီအခါမဟာ မက်ဆေ့ခ်ျရဲ့ စာသာသက သူ့ဟာသူ။

အပလီကေသရဟင်သတစ်ခုလုံသ၏ Class diagram-

GIF တလင် Steganography

အစီအစဉ်ကို အကောင်အထည်ဖော်ခဌင်သ။

ပရိုဂရမ်တစ်ခုလုံသ၏အကောင်အထည်ဖော်မဟုကို အစိတ်အပိုင်သနဟစ်ခုအဖဌစ် ပိုင်သခဌာသနိုင်သည်- အင်တာဖေ့စ်ကုဒ်ဝဟက်ခဌင်သနဟင့် စာဝဟက်ခဌင်သနည်သလမ်သမျာသကို အကောင်အထည်ဖော်ခဌင်သ။ Encryptorအတန်သထဲတလင်၊ GIFEncryptorByLSBMethod О GIFEncryptorByPaletteExtensionMethodနဟင့် user interface ၏အကောင်အထည်ဖော်မဟု။

အတန်သကို ဆင်ခဌင်ပါ။ GIFEncryptorByLSBMethod.

GIF တလင် Steganography

Fields firstLSBit О secondLSBit ပုံတစ်ပုံချင်သစီ၏ byte တစ်ခုစီ၏ bits နံပါတ်မျာသပါရဟိပဌီသ မက်ဆေ့ချ်ထည့်သင့်သည့်နေရာမဟ မက်ဆေ့ချ်ကို ဖတ်သင့်သည်။ လယ်ကလင်သ checkSequence ထည့်သလင်သထာသသော မက်ဆေ့ဂျ်ကို အသိအမဟတ်ပဌုကဌောင်သ သေချာစေရန် check bit sequence ကို သိမ်သဆည်သပါ။ အငဌိမ်နည်သလမ်သ getEncryptingFileParameters သတ်မဟတ်ထာသသောဖိုင်၏ ကန့်သတ်ချက်မျာသနဟင့် ဖဌစ်နိုင်ချေရဟိသော မက်ဆေ့ချ်၏ ဝိသေသလက္ခဏာမျာသကို ပဌန်ပေသသည်။

နည်သလမ်သ algorithm encrypt класса GIFEncryptorByLSBMethod:

GIF တလင် Steganography

ပဌီသတော့ သူ့ကုဒ်

@Override
public void encrypt(File in, File out, String text) throws UnableToEncodeException, NullPointerException, IOException {
	if (in == null) {
		throw new NullPointerException("Input file is null");
	}
	if (out == null) {
		throw new NullPointerException("Output file is null");
	}
	if (text == null) {
		throw new NullPointerException("Text is null");
	}
	
	// read bytes from input file
	byte[] bytes = new byte[(int)in.length()];
	InputStream is = new FileInputStream(in);
	is.read(bytes);
	is.close();
	
	// check format
	if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
		throw new UnableToEncodeException("Input file has wrong GIF format");
	}
	
	// read palette size property from first three bits in the 10-th byte from the file
	byte[] b10 = Binary.toBitArray(bytes[10]);
	byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
	
	// calculate color count and possible message length
	int bOrigColorCount = (int)Math.pow(2, bsize+1);
	int possibleMessageLength = bOrigColorCount*3/4;
	int possibleTextLength = possibleMessageLength-2;// one byte for check and one byte for message length
	
	if (possibleTextLength < text.length()) {
		throw new UnableToEncodeException("Text is too big");
	}
	
	int n = 13;
	
	// write check sequence
	for (int i = 0; i < checkSequence.length/2; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		ba[firstLSBit] = checkSequence[2*i];
		ba[secondLSBit] = checkSequence[2*i+1];
		bytes[n] = Binary.toByte(ba);
		n++;
	}
	
	// write text length
	byte[] cl = Binary.toBitArray((byte)text.length());
	for (int i = 0; i < cl.length/2; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		ba[firstLSBit] = cl[2*i];
		ba[secondLSBit] = cl[2*i+1];
		bytes[n] = Binary.toByte(ba);
		n++;
	}
	
	// write message
	byte[] textBytes = text.getBytes();
	for (int i = 0; i < textBytes.length; i++) {
		byte[] c = Binary.toBitArray(textBytes[i]);
		for (int ci = 0; ci < c.length/2; ci++) {
			byte[] ba = Binary.toBitArray(bytes[n]);
			ba[firstLSBit] = c[2*ci];
			ba[secondLSBit] = c[2*ci+1];
			bytes[n] = Binary.toByte(ba);
			n++;
		}
	}
	
	// write output file
	OutputStream os = new FileOutputStream(out);
	os.write(bytes);
	os.close();
}

နည်သလမ်သ၏ အယ်လဂိုရီသမ်နဟင့် အရင်သအမဌစ်ကုဒ် decrypt класса GIFEncryptorByLSBMethod:

GIF တလင် Steganography

@Override
public String decrypt(File in) throws UnableToDecodeException, NullPointerException, IOException {
	if (in == null) {
		throw new NullPointerException("Input file is null");
	}
	
	// read bytes from input file
	byte[] bytes = new byte[(int)in.length()];
	InputStream is = new FileInputStream(in);
	is.read(bytes);
	is.close();
	
	// check format
	if (!(new String(bytes, 0, 6)).equals("GIF89a")) {
		throw new UnableToDecodeException("Input file has wrong GIF format");
	}
	
	// read palette size property from first three bits in the 10-th byte from the file
	byte[] b10 = Binary.toBitArray(bytes[10]);
	byte bsize = Binary.toByte(new byte[] {b10[0], b10[1], b10[2]});
	
	// calculate color count and possible message length
	int bOrigColorCount = (int)Math.pow(2, bsize+1);
	int possibleMessageLength = bOrigColorCount*3/4;
	int possibleTextLength = possibleMessageLength-2;	// one byte for check and one byte for message length
	
	int n = 13;
	
	// read check sequence
	byte[] csBits = new byte[checkSequence.length];
	for (int i = 0; i < 4; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		csBits[2*i] = ba[firstLSBit];
		csBits[2*i+1] = ba[secondLSBit];
		n++;
	}
	byte cs = Binary.toByte(csBits);
	
	if (cs != Binary.toByte(checkSequence)) {
		throw new UnableToDecodeException("There is no encrypted message in the image (Check sequence is incorrect)");
	}
	
	// read text length
	byte[] cl = new byte[8];
	for (int i = 0; i < 4; i++) {
		byte[] ba = Binary.toBitArray(bytes[n]);
		cl[2*i] = ba[firstLSBit];
		cl[2*i+1] = ba[secondLSBit];
		n++;
	}
	byte textLength = Binary.toByte(cl);
	
	if (textLength < 0) {
		throw new UnableToDecodeException("Decoded text length is less than 0");
	}
	if (possibleTextLength < textLength) {
		throw new UnableToDecodeException("There is no messages (Decoded message length (" + textLength + ") is less than Possible message length (" + possibleTextLength + "))");
	}
	
	// read text bits and make text bytes
	byte[] bt = new byte[textLength];
	for (int i = 0; i < bt.length; i++) {
		byte[] bc = new byte[8];
		for (int bci = 0; bci < bc.length/2; bci++) {
			byte[] ba = Binary.toBitArray(bytes[n]);
			bc[2*bci] = ba[firstLSBit];
			bc[2*bci+1] = ba[secondLSBit];
			n++;
		}
		bt[i] = Binary.toByte(bc);
	}
	
	return new String(bt);
}

အတန်သ၏အကောင်အထည်ဖော်မဟု GIFEncryptorByPaletteExtensionMethod အလာသတူဖဌစ်မည်၊ အချက်အလက်သိမ်သဆည်သခဌင်သ/ဖတ်ရဟုခဌင်သနည်သလမ်သသာလျဟင် ကလဲပဌာသပါသည်။

အတန်သထဲမဟာ MainFrame wrapper နည်သလမ်သမျာသကို ဖော်ပဌထာသပါသည်။ encryptImage(Encryptor encryptor) О decryptImage(Encryptor encryptor)ကဌာသခံနည်သလမ်သမျာသ၏ ရလဒ်မျာသကို လုပ်ဆောင်ခဌင်သ။ Encryptor အသုံသပဌုသူနဟင့် အပဌန်အလဟန် ဆက်ဆံခဌင်သ၊ ဆိုလိုသည်မဟာ ဖိုင်ရလေသချယ်မဟု ဒိုင်ယာလော့ခ်ကို ဖလင့်ခဌင်သ၊ အမဟာသအယလင်သ မက်ဆေ့ချ်မျာသ ပဌသခဌင်သ စသည်ဖဌင့်၊ အခဌာသနည်သလမ်သမျာသအပဌင် openImage()အသုံသပဌုသူကို ပုံတစ်ပုံရလေသချယ်ခလင့်ပေသခဌင်သ၊ exit()အပလီကေသရဟင်သမဟ ထလက်သော၊ ကနည်သမျာသကို မဟည့်ခေါ်သည်။ Actionသက်ဆိုင်သော မီနူသ ပစ္စည်သမျာသ။ ကအတန်သသည် အရန်နည်သလမ်သမျာသကို ထပ်လောင်သလုပ်ဆောင်သည်- createComponents() - ပုံစံ အစိတ်အပိုင်သမျာသ ဖန်တီသခဌင်သ၊ loadImageFile(File f) — ဖိုင်တစ်ခုမဟ အထူသအစိတ်အပိုင်သတစ်ခုသို့ ပုံတစ်ခုကို တင်ခဌင်သ။ အတန်သ၏အကောင်အထည်ဖော်မဟု GIFEncryptorByPaletteExtensionMethod class implementation နဲ့ ဆင်တူပါတယ်။ GIFEncryptorByLSBMethodအဓိကကလာခဌာသချက်မဟာ palette မဟ message bytes မျာသကို ရေသသာသခဌင်သနဟင့် ဖတ်ခဌင်သတလင်ဖဌစ်သည်။

ပရိုဂရမ်လည်ပတ်မဟု

LBS နည်သလမ်သ

ဒီလိုပုံလေသရဟိတယ်ဆိုပါစို့။

GIF တလင် Steganography

ကပုံတလင်၊ palette တလင် အရောင် 256 ရောင် (Paint save as) ပါဝင်ပါသည်။ ပထမအရောင်လေသမျိုသကတော့ အဖဌူ၊ အနက်၊ အနီ၊ အစိမ်သ။ အခဌာသအရောင်မျာသမဟာ အနက်ရောင်ဖဌစ်သည်။ global palette bit sequence သည် အောက်ပါအတိုင်သ ဖဌစ်လိမ့်မည် ။

11111111 11111111 11111111 00000000 00000000 00000000 11111111 00000000 00000000 00000000 11111111 00000000...

GIF တလင် Steganography

မက်ဆေ့ဂျ်ကို ထည့်သလင်သပဌီသသည်နဟင့်၊ မျဉ်သသာသထာသသော ဘစ်မျာသကို မက်ဆေ့ချ်မဟ ဘစ်မျာသဖဌင့် အစာသထိုသမည်ဖဌစ်သည်။ ရလာတဲ့ပုံက မူရင်သပုံနဲ့ လုံသဝမတူပါဘူသ။

မူရင်သ
ထည့်သလင်သထာသသော မက်ဆေ့ဂျ်နဟင့်အတူ ပုံ

GIF တလင် Steganography
GIF တလင် Steganography

Palette ချဲ့နည်သ

ကနည်သလမ်သကို အသုံသပဌု၍ မက်ဆေ့ချ်ပါရဟိသော ပုံတစ်ပုံကို သင်ဖလင့်သောအခါတလင် အောက်ပါပုံကို သင်တလေ့မဌင်ရလိမ့်မည်-

GIF တလင် Steganography

ကနည်သလမ်သသည် ပဌီသပဌည့်စုံသော သူလျဟိုလဟုပ်ရဟာသမဟုမျာသအတလက် အလုပ်မဖဌစ်နိုင်ကဌောင်သနဟင့် မက်ဆေ့ချ်၏ ထပ်လောင်သကုဒ်ဝဟက်ခဌင်သ လိုအပ်နိုင်သည် ထင်ရဟာသပါသည်။

ကာတလန်သရုပ်ပုံမျာသတလင် ကုဒ်ဝဟက်ခဌင်သ/စာဝဟက်ခဌင်သ သည် ပုံမဟန် ပုံသဏ္ဍာန်ပုံမျာသကဲ့သို့ အလုပ်လုပ်သော်လည်သ ကာတလန်သရုပ်ပုံမျာသသည် ပျက်မသလာသပါ။

အသုံသပဌုထာသသော အရင်သအမဌစ်မျာသ-

ဒေါင်သလုပ်:

source: www.habr.com

မဟတ်ချက် Add