Search This Blog

Thursday, December 30, 2010

Inkscape

Inkscape က Illustrator တို့၊ CorelDraw တို့ လိုမျိုး vector graphic editor တစ်ခုပါ။ ပိုကောင်းတာ တစ်ခုကတော့ Inkscape က အလကား ရနိုင်တဲ့ free software ဖြစ်တာပါပဲ။ Open source software လည်း ဖြစ်ပါတယ်။ သူ့ကို http://inkscape.org/ မှာ ယူလို့ရပါတယ်။ သူ့ကို ကြိုက်တာ တစ်ခုကတော့ graphics တွေကို pdf format အနေနဲ့ save လုပ်လို့ရတာပါပဲ။ အဲဒါ​ကြောင့် pdflatex သုံးပြီး pdf ဖိုင်တွေ ထုတ်တဲ့ အခါ image ဖိုင်တွေ သုံးတာနဲ့ စာရင် ပိုကောင်းတဲ့ graphic quality ကို ရနိုင်ပါတယ်။ သူတို့ဟာ Scalable Vector Graphics ဖြစ်တာမို့ magnify လုပ်ကြည့် ရင် တောင် bitmap image တွေလို ပြဿနာ မရှိပါဘူး။
အောက်မှာ နမူနာ အနေနဲ့ Inkscape ကို သုံးပြီး မြားခေါင်း ပါတဲ့ မျဉ်းကြောင်း တစ်ကြောင်း ဆွဲ ကြည့် ထားပါတယ်။ ၁။ Bezier Curves ကိုရွေးပါ။ မျဉ်းကြောင်းကို စဆွဲ ဖို့ ကလစ် နှိပ်ပြီး၊ မျဉ်းကြောင်း ကို အဆုံးသတ်ဖို့ double click နှိပ်ပါ။ (click တစ်ချက်ပဲ နှိပ်ပြီး enter key နှိပ်လည်း ရပါတယ်။) ၂။ Object menu မှာ ရှိတဲ့ Fill and Stroke... command ကိုနှိပ်ပါ။ (ဒါမှမဟုတ် ဘယ်ဘက်အောက်နားက Fill: သို့ Stroke: ကို နှိပ်လို့လည်း ရပါတယ်။) နောက် Stroke style tab ထဲက End Markers ကို arrow ပြောင်းပါ။ ၃။ မျဉ်းကြောင်း ရဲ့ အရောင် ကို Stroke paint tab ထဲမှာ ပြောင်းနိုင်ပါတယ်။ မြားခေါင်း ရဲ့ အရောင် ကို ပါ ပြောင်းဖို့ အတွက် Extensions->Modify Path->Color Markers to Match Stroke ကို နှိပ် နိုင် ပါတယ်။ သင်္ချာ သင်္ကေတ တွေ ထည့် ချင်ရင်တော့ ctrl+u ကို နှိပ်ပြီး ထည့်ချင်တဲ့ သင်္ကေတရဲ့ hexadecimal Unicode code point ကို ရိုက်ပြီး enter ကိုနှိပ်ပါ။

http://wiki.inkscape.org/wiki/index.php/FAQ
http://www.unicode.org/charts/PDF/U0370.pdf


Monday, July 12, 2010

Random Password Generator

ကျွန်တော့ computer user account အချို့က password ပြောင်းဖို့ ပုံမှန် နားပူနားဆာ လုပ်လေ့ ရှိပါတယ်။ ကျောင်းက အီးမေးလ် လို တစ်ချို့ ကောင်တွေဆို သုံးပြီးသား password history ကို ဆယ်ခုလောက် ထိ မှတ်ထား တတ်တော့ သုံးပြီးသား ကို ပြန်သုံးလို့ မရ ပါဘူး။
အဲဒီတော့ ကျွန်တော့မှာ password အသစ် တွေကို ထပ်ကာ ထပ်ကာ စဉ်းစား ရတဲ့ ဒုက္ခ ပိုလာ ပါတယ်။ နောက် တော့ Internet မှာ အလကား ရတဲ့ random password generator တွေကို သုံးပါတယ်။ အရင်နေ့ က တော့ စာဖတ်ရင်း ပျင်းလာတာနဲ့ random password generator တစ်ခုကို ကိုယ့် ဟာကိုယ် အပျော်သဘော နဲ့ ရေးကြည့်ထားပါတယ်။ အောက်က လင့်ခ် မှာကြည့်နိုင်ပါတယ်။

Source PHP file

Ref: http://en.wikipedia.org/wiki/Password_generator

Friday, June 18, 2010

Common Interrupt Pitfalls

SDCC Compiler User Guide ထဲမှာ ပါတဲ့ စိတ်ဝင်စား စရာ အချက်တချို့ကို ပြန်ပြော ချင်ပါတယ်။ ကျွန်တော့် အတွေ့အကြုံ အရ အဲဒီ အချက်တွေဟာ အရမ်းအရေး ကြီးပြီး firmware programmer တွေအတွက် အမြဲခေါင်းထဲမှာ ရှိနေဖို့ လိုတယ် လို့ ထင်ပါတယ်။ တစ်ခါက ကျွန်တော့် ပရိုဂရမ် မှာ ဘာ အမှားမှ မရှိပဲ သူ့ကို သုံးတဲ့အခါ တလွဲတွေပဲ လုပ်နေပါတယ်။ Stack overflow ဖြစ်နိုင်တာ ကို ရုတ်တရက် သတိရ ပြီး Stack အရွယ်အစား ပြင်လိုက်တဲ့ အခါ ကောင်းသွားတာ မျိုး မကြာခဏ ကြုံဖူးပါတယ်။

Variable not declared volatile

တစ်ခြား function တွေက သုံးနေတဲ့ variable တွေကို interrupt service routine တစ်ခု ခုကနေ ပြောင်းလဲပေး နေတဲ့ အခါမျိုးမှာ အဲဒီ variable တွေကို volatile လို့ ကြေငြာပေးရပါမယ်။ အသေးစိတ်ကို http://en.wikipedia.org/wiki/Volatile_variable မှာ ကြည့်နိုင်ပါတယ်။

Non-atomic access

အကယ်၍ variable ကို သုံးတာ instruction တစ်ခုမက လိုပြီး သူ့ကို သုံးနေချိန်မှာ interrupt ဝင်လာနိုင်ရင် ဒေတာ အမှား ဖြစ်မသွားဖို့ interrupt ကို disabled လုပ်ထားဖို့ လိုပါတယ်။ အဲဒီလို Bug မျိုးဟာ ပြန်တွေ့အောင် reproduce လုပ်ဖို့ခက်ပြီး ဒုက္ခ တော်တော် ပေးနိုင်ပါတယ်။ ကျွန်တော်တော့ Real time and embedded systems ဆရာက အတန်းထဲမှာ mutual exclusion... mutual exclusion နဲ့ ခဏ ခဏ ပြောတာ ကို ကောင်း ကောင်း မှတ်မိ နေ ခဲ့ ပေမယ့် အဲဒီ ပြဿနာ မျိုး တစ်ခါ တက်ဖြစ်အောင် ပြန်တက်ဖူးပြီး သင်ခန်းစာ ကောင်းကောင်း ပြန်ရဘူး ပါတယ်။

Stack overflow

ခေါ်ထားတဲ့ address တွေရယ်၊ သုံးလက်စ register တန်ဖိုး တွေ ကို stack ပေါ်မှာ တင်သိမ်းထားပြီး၊ stack အရွယ်အစား မလုံလောက်ရင် နဂို နေရာဆီ ပြန်မရောက်ပဲ တစ်ခြား မထင်မှတ်တဲ့ နေရာ တွေဆီ ရောက်သွားပြီး ဒုက္ခ တွေ့နိုင် ပါတယ်။

Use of non-reentrant functions

ဖြစ်နိုင်ရင် interrupt ထဲမှာ တစ်ခြား function တွေကို မခေါ်ပဲ တတ်နိုင်သမျှ ရှောင်ကျဉ် ပါ။ အကယ်၍ interrupt က active ဖြစ်နိုင်တဲ့ အခြေအနေ မျိုးမှာ nonreentrant function တွေကို main program ကနေ မခေါ်သင့်ပါဘူး။ Good luck with your programming!

Friday, June 11, 2010

Circular Buffered UART Com Module for 8051 Microcontroller

Embedded system အများစု မှာ UART communication ကို သုံးကြပါတယ်။ ဒါကြောင့် ကျွန်တော် ရေးထားတဲ့ circular buffered UART comm module လေးကို ဒီမှာ ဖော်ပြချင်ပါတယ်။ သူ့ကို 8051 microcontroller အတွက် ရေးထားတာ ဖြစ်ပေမယ့် တစ်ခြား microcontroller တွေ အတွက်ဆိုရင် လဲ အလွယ်တစ်ကူ ပြောင်းသုံးလို့ ရပါတယ်။

Using Circular Buffered UART Com Module

သူ့ကို သုံးချင်တဲ့ module မှာ ထုံးစံ အတိုင်း header file ကြေငြာဖို့ လိုပါတယ်။ ကျွန်တော့် နမူနာ မှာတော့ header အားလုံးကို 'headers.h' ဖိုင်ထဲမှာ စုထားတဲ့ အတွက် အဲဒီဖိုင်ကို ထည့်လိုက်ရုံ ပါပဲ။
ပို့ဖို့၊ လက်ခံဖို့ အတွက် buffer အရွယ်အစားတွေကို ComConfig.h မှာ သတ်မှတ် နိုင်ပါတယ်။ အဲဒီမှာပဲ ဒေတာ လက်ခံရရှိတဲ့ အခါ ခေါ်ချင်တဲ့ function ကို သတ်မှတ်နိုင်ပါတယ်။
main function ထဲမှာ buffer ထဲမှာ ဒေတာ တွေ ရောက်နေ မနေ စစ်ဖို့ ComChkRx() function ကို poll လုပ် နိုင်ပါတယ်။
နမူနာ source code ကို

UART-Timer-8051 on GitHub

မှာရယူ နိုင်ပါတယ်။

Thursday, June 10, 2010

Soft-Timer Module for 8051 Microcontroller

Embedded system အားလုံးလိုလို မှာ timer တွေကို သုံးကြပါတယ်။ 8051 microcontroller မှာ hardware timer နှစ်ခု၊ သုံးခု ပဲ ပါတဲ့ အတွက် ပုံမှန် system တစ်ခု အတွက် လိုအပ်တဲ့ timer အားလုံးကို hardware timer တွေပဲ သုံးပြီး ရေးမယ် ဆိုရင် လုံလောက်မှာ မဟုတ်ပါဘူး။ ဒါကြောင့် သိပ်ပြီး တိကျဖို့ မလိုတဲ့ timer တွေကို ရေးတဲ့အခါ software ကိုပဲ သုံးပါတယ်။ ဒီမှာ ကျွန်တော် ရေးထားတဲ့ soft-timer module လေး တစ်ခု အကြောင်း ကို ပြောချင်ပါတယ်။ သူ့ကို 8051 microcontroller အတွက် ရေးထားတာ ဖြစ်ပေမယ့် တစ်ခြား microcontroller တွေ အတွက်ဆိုရင် လဲ အလွယ်တစ်ကူ ပြောင်းသုံးလို့ ရပါတယ်။
နမူနာ source code ကို

UART-Timer-8051 on GitHub

မှာရယူ နိုင်ပါတယ်။

Using soft-timer module

သူ့ကို သုံးချင်တဲ့ module မှာ ထုံးစံ အတိုင်း header file ကြေငြာဖို့ လိုပါတယ်။ ကျွန်တော့် နမူနာ မှာတော့ header အားလုံးကို 'headers.h' ဖိုင်ထဲမှာ စုထားတဲ့ အတွက် အဲဒီဖိုင်ကို ထည့်လိုက်ရုံ ပါပဲ။
Timer က သတ်မှတ်ချိန် ကုန် လို့ time out ဖြစ်ရင် လုပ်ချင်တဲ့ function ရယ်၊ timer ရဲ့ အချိန် သတ်မှတ်ဖို့၊ timer စတင်ဖို့ အတွက် function များကိုရေးပါ။ ကျွန်တော့် နမူနာ မှာတော့ SysSBYLEDTmrTO() နဲ့ SysSBYLEDInit() တို့ကို System.c module ထဲမှာ ရေးထားပါတယ်။
TmrConfig.h ဖိုင်ကို ဖွင့်ပြီး အဲဒီမှာ ရှိတဲ့ အဆင့် သုံးဆင့် ကို လုပ်ဖို့ လိုပါတယ်။ သင့် compiler က function pointers တွေကို သုံးလို့ မရရင် switch structure နဲ့ ပြောင်းသုံး နိုင်ပါတယ်။
main function ထဲမှာ initialize လုပ်ဖို့ TmrInit() နဲ့ ပုံမှန် poll လုပ်နေဖို့ TmrTask() တွေကို ခေါ်ဖို့ လို့ပါတယ်။ သူတို့ကို Tmr.c ထဲမှာ ရေးထားပါတယ်။

Wednesday, May 26, 2010

Using SPI on Low-End Microcontroller

SPI က IC အချင်းချင်း ဆက်သွယ်ဖို့ အတွက် ရိုးရှင်းပြီး ထိရောက်တဲ့ bus တစ်ခုပါ။ Real Time Clock၊ EEPROM အစရှိတဲ့ chip အများစုမှာ ဆက်သွယ်ဖို့ အတွက် SPI ဒါမှမဟုတ် I2C bus တွေ ပါလေ့ရှိပါတယ်။ ထူးခြားတဲ့ အချက် မရှိရင် တော့ SPI သုံးရတာကို I2C ထက်ပိုကြိုက်ပါတယ်။ သူက ပိုမြန်ပြီး ပိုရှင်းလို့ပါ။ သူ့ကို software နဲ့ ဖန်တီး emulate လုပ်ဖို့လဲ လွယ်ပါတယ်။
တစ်ခါက 10MHz ရှိတဲ့ SPI ပါတဲ့ LED driver chip တစ်ခုကို လုပ်ဆောင်မှု အရမ်းမမြင့်တဲ့ 4MHz microcontroller နဲ့ တွဲသုံးဖြစ်ပါတယ်။ Design လုပ်တုန်းက ဈေးသက်သာ ဖို့ အတွက် အဓိက ထားလို့ပါ။ Microcontroller ကလဲ တစ် ဒေါ်လာတောင် မပေးရပါဘူး။ ဒါပေမယ့် သူ့မှာ firmware နဲ့ font တွေသိမ်းဖို့ flash အလုံအလောက် ရှိပါတယ်။ အစကတော့ SPI ကို ဒေတာ ပို့ဖို့၊ လက်ခံဖို့ အတွက် ပုံမှန် အတိုင်းပဲ နှေးတဲ့ အဝေးပို့ RS232 တို့၊ CAN bus တို့မှာ သုံးနေကြ အတိုင်း circular buffer ကို hardware interrupt နဲ့ တွဲသုံးပါတယ်။ အဲဒါက ပုံမှန် အခြေအနေမှာ တော့ အိုကေ ပါတယ်။ ပြဿနာ က ကြီးမားတဲ့ 96x16 dot-matrix LED ဆိုင်းဘုတ် ကြီးကို တစ်စက္ကန့် ၁၂၅ ကြိမ် မောင်းချင်ပြီး CPU ကို အသုံးချ တဲ့ utilization က အရမ်းမြင့်နေတာပါ။ အကျိုးဆက် အနေနဲ့ စာသားတွေကို ဘေးတိုက် ပြေးတာ အစရှိတဲ့ ဂရပ်ဖစ် လုပ်ဆောင်မှုတွေကို ကိုင်တွယ်ရတဲ့ အခါ ကောင်းကောင်း မလုပ်နိုင်တော့ပဲ ဖုတ်လှိုက် ဖုတ်လှိုက် ဖြစ်ချင်လာ ပါတယ်။ ဒါနဲ့ပဲ အရင်းအမြစ်ကို စာရင်းစစ် ကြည့်လိုက်တော့ အဓိက အသုံးအများဆုံး ဖြစ်တဲ့၊ CPU က အမြဲတမ်းလိုလို လုပ်ဆောင်နေ ရတဲ့ SPI function က interrupt တွေ၊ circular buffer တွေနဲ့ ဖောင်းပွ နေပြီး သူ့ကို ထိရောက်အောင် ပြင်နိုင်ရင် CPU က တော်တော် သက်သာသွားမယ် ဆိုတာ တွေ့ရပါတယ်။ ပုံမှန်ကတော့ hardware interrupt ကိုသုံးတာက ပိုထိရောက်၊ ပိုမြန်တာ မှန်ပါတယ်။ ဒါပေမယ့် ဒီ ကိစ္စမှာတော့ ပုံမှန် မဟုတ်ပါဘူး နှေးတဲ့ CPU က အရမ်းမြန် အရမ်းအသုံးပြုဖို့ လိုတဲ့ SPI ကို မောင်းဖို့ လိုနေလို့ပါ။ SPI ကို ဒေတာ တစ်လုံး ပို့တိုင်း CPU cycle တွေ အရမ်းစားတဲ့ ပို့တဲ့ interrupt function၊ လက်ခံတဲ့ interrupt function တွေကို လုပ်နေရလို့ပါ။ နောက်တော့ polling ဒါမှမဟုတ် emulation ကို သုံးပြီး SPI ကို ဆက်သွယ်တာက interrupt ထက် ပိုမြန်တာကို တွေ့ရပါတယ်။ ဒါတောင် polling ကိုသုံးမယ်ဆိုရင် hardware က လက်ခံတဲ့ bus speed ကိုပဲ သုံးလို့ရမှာပါ။ ဒါနဲ့ SPI function ကို ပိုထိရောက်အောင် firmware ကို ပြင်လိုက်တော့ ကောင်းသွားပါတယ်။ ဒါကြောင့် SPI ကို emulating လုပ်ရင် ကောင်းတဲ့ အချက် တစ်ချို့ ကို ကျွန်တော် တို့ရဲ့ အတွေ့အကြုံ အရ ပြောချင်တာက
  1. SPI ကို software မှာ emulate လုပ်ရင် ပိုမြန်တဲ့ အခါတွေ လည်း ရှိပါတယ်။
  2. အရည်အသွေး လည်း ပိုကောင်းပါတယ်။ ဘာကြောင့်လဲ ဆိုတော့ ရိုးရှင်းတာရယ်၊ interrupt ကြောင့် ဖြစ်လာနိုင်တဲ့ ပြဿနာ အများစုကနေ ရှောင်ပြီးသား ဖြစ်သွားလို့ပါ။
  3. ရိုးရှင်းတဲ့ code လေးကို ရေးရတာ ပိုမြန်၊ ပိုလွယ်ကူ၊ ပိုပြီး အမှားနည်းနိုင်ပါတယ်။ မဟုတ်ရင် အသစ်သုံးမယ့် microcontroller တိုင်း အတွက် အမျိုးမျိုးသော register setting တွေနားလည်ဖို့ datasheet ကို အချိန်ပေး ဖတ်ဖို့ လိုမှာပါ။
  4. အကောင်းဆုံးကတော့ portable ဖြစ်ပြီး hardware ကို မမှီခိုတော့ တာပါပဲ။
SPI မှာ တိကျတဲ့ formal standard မရှိပါဘူး။ ပုံမှန် shift register တစ်ခုလို ရှင်းလွန်းလို့ပါ။ Timing diagram ကိုမြင်ရုံနဲ့ နားလည်နိုင်ပါတယ်။ အောက်က နမူနာက SPI မျိုးကွဲ တစ်ခုကို emulate လုပ်တဲ့ C function တစ်ခုပါ။
//-------------------------------------
unsigned char spi(unsigned char d)
{
    unsigned char i;
    SCLK=1;
    EN=1;
    for(i=0;i<8;i++)
    {
        MOSI=(d & 0x80)?1:0;        
        //Delay(period/2)-optional for slower SPI bus speed
        SCLK=0;
        d<<=1;        
        d|=MISO;
        //Delay(period/2)-optional for slower SPI bus speed
        SCLK=1;
    }
    EN=0;
    return d;
}
//-------------------------------------

Tuesday, May 25, 2010

Astable Multivibrator using Op-amp

မိတ်ဆွေ တစ်ယောက်က op-amp circuit တစ်ခုရဲ့ oscillation frequency ကို တွက်ထုတ်ဖို့ အကူ အညီ တောင်းလာ ပါတယ်။ တိုင်းကြည့်လို့ ရတဲ့ frequency က ၁၀၉ kHz ရှိတယ်လို့ ဆိုပါတယ်။ သူက ထွက်လာတဲ့ oscillation frequency နဲ့ သုံးထားတဲ့ passive component တွေရဲ့ ဆက်သွယ်မှု ကို တွက်ထုတ် ချင်တာ ပါ။ ဒီလို analog circuits တွေကို မတွေ့ ဖြစ်တာ တော်တော် ကြာနေ ပေမယ့် ကြည့်ပေးမယ် လို့ သဘောတူ လိုက်ပါတယ်။ ဒါနဲ့ သူက ဆားကစ် ပတ်လမ်း ပုံကို ဖုန်းနဲ့ ဓာတ်ပုံရိုက် ပြီး MMS နဲ့ ပို့ လိုက်ပါတယ်။ ကြည့် လိုက်တော့ သူ့ရဲ့ တည်ဆောက်ပုံ က ရိုးရှင်းပြီး တွေ့ နေကြ ပုံစံ မျိုး ဖြစ်နေတာနဲ့ frequency ကို တွက်ကြည့် ပြီး ဖုန်းနဲ့ ဓာတ်ပုံ ပြန်ရိုက်၊ အောက်က ပုံတွေကို သူဆီကို MMS နဲ့ ပြန် ပို့ လိုက်ပါတယ်။

Sunday, May 2, 2010

Choosing name for our daughter

သမီးလေး မွေးလာတော့ သူ့အတွက် နာမည် ပေးဖို့ စဉ်းစားရင်း ဖတ်မိတဲ့ စာအုပ်တွေထဲက ရယ်၊ ကိုယ့်ဟာကိုယ် ကြိုက်တဲ့ အချက် လေးတွေရယ် ကိုပြန်ပြီး အမှတ်တရ တင်လိုက်ပါတယ်။
  1. ပထမဆုံး စဉ်းစားတဲ့ အချက်က သမီး ငယ်စဉ်ခါရော၊ လူကြီးဖြစ်လာတဲ့အခါရောပါ အသက် အရွယ် မရွေး အဆင်ပြေမယ့် နာမည်မျိုးပါ။
  2. ကျွန်တော်တို့ ရွေးလိုက်တဲ့ နာမည် ကြောင့် သမီးလေး အနောက် အပြောင် ခံရနိုင် စရာ အကြောင်းလုံးဝ မရှိတဲ့ နာမည်မျိုး ဖြစ်အောင်လည်း အထူး စိုက်ရပါသေးတယ်။
  3. အဓိပ္ပာယ် ကောင်းတဲ့ နာမည်လေး ဖြစ်ရင်တော့ ပိုကောင်းတာပေါ့ နော်။
  4. ရိုးရာ အစဉ်အလာ မပျက် မြန်မာ နာမည် ပဲပေးချင်ပါတယ်။ နေ့နံ ကိုက်တဲ့ ဟာမျိုးလည်း ဖြစ်ချင်ပါသေးတယ်။ သမီးတုန်းက တော့ မွေးဖို့ ခန့်မှန်းထားတဲ့ ရက်က တနင်္ဂနွေ ဆို့တော့ 'အေး' နဲ့စဖို့ စဉ်းစားထားတာ တစ်ကယ်မွေးတော့ စနေ နေ့မှာ။
  5. ကဗျာ တစ်ပုဒ်လို ရွတ်ဆိုရ ချော မွေ့ တဲ့ နာမည်မျိုး၊ သီချင်းလေး တစ်ပုဒ် လို အသံထွက် ငြိမ့်ညောင်းတဲ့ နာမည် မျိုးလည်း ဖြစ်ချင် ပြန်ရော။
  6. အဖေ ဆီက နာမည်တစ်လုံး၊ အမေ ဆီက နာမည် တစ်လုံး စီလည်း သမီးနာမည် မှာ ပါစေချင်သေးတယ်။
  7. ဖြစ်ချင်တာတွေ၊ ထည့်စဉ်းစား ထားတာ တွေ ဘယ်လိုပဲ ရှိရှိ ၊ အခု စဉ်းစား နေတဲ့ နာမည်က သမီးလေး အတွက် ဆိုတော့ သမီးလေး ဘဝ တစ်လျှောက်လုံး သူကြိုက်မည့် နာမည်မျိုး ဖြစ်ဖို့သာ အရေးအကြီး ဆုံးလို့ ကျွန်တော် တို့ ဘာသာ ပြန်ပြီး သတိပေးရ ပါသေး တယ်။

Friday, April 30, 2010

C Programming on Windows

C programming ကို စလေ့လာ နေကြတဲ့ မိတ်ဆွေ တွေက ဘယ် IDE ကို Windows ပေါ်မှာသုံး လို့ ကောင်းမလဲ လို့ မေးကြပါတယ်။ ကျွန်တော့် အထင်ကတော့ Microsoft Visual Studio Express က တော်တော် သုံးလို့ကောင်းပါတယ်။ ဒီလင့် http://www.microsoft.com/express/ မှာ အလကား ရ နိုင်ပါတယ်။ နောက် လူကြိုက်များတာ တစ်ခု ကတော့ Bloodshed က Dev-C++ ပါ။ သူ့ကို လည်း http://www.bloodshed.net/devcpp.html မှာ ဖရီး ဒေါင်းလုပ် လုပ် နိုင်ပါတယ်။ နမူနာ အနေနဲ့ C project တစ်ခုကို Visual C++ 2008 Express Edition မှာ ဖန်တီး ကြည့်ထားပါတယ်။ စစချင်း File menu>>New>>Project... ကိုသွားပါ။ New Project window ပေါ်လာ ပါမယ်။ Project types: Visual C++ မှာ Win32 ကိုရွေးပါ။ Templates: Visual Studio Installed templates မှာ Win32 Console Application ကိုရွေးပါ။ အောက်နားက text box မှာ project နာမည် ရိုက်ထည့် ပြီး၊ သိမ်းမည့် folder ကို ရွေးပါ။ OK ကိုနှိပ်ပါ။ Win32 Application Wizard box ပေါ်လာရင် Next ကိုနှိပ်ပါ။ Application type မှာ Console application ကိုရွေးပါ။ နောက် additional options: မှာ Empty project ကိုရွေးနိုင်ပါတယ်။ Finish ခလုပ်ကို နှိပ်ပါ။ အောက်မှာ ပြထားတဲ့ အတိုင်းSolution Explorer window ထဲက Source Files ပေါ်မှာ right click နှိပ်ပြီး Add>>New Item... ကိုနှိပ်ပါ။ Add new item window ပေါ်လာရင် Name text box ထဲမှာ file name ကို.c extension နဲ့ ထည့်ရိုက်ဖို့ အရေးကြီးပါတယ်။ ဥပမာ StrPos.c။ အောက်က နမူနာ ပရိုဂရမ်က ဘယ်လိုရေးရမလဲလို့ မေးကြတဲ့ string position ကို C library functions တွေ မသုံးပဲ ရှာတဲ့ဟာပါ။ စာလုံး အကြီး အသေး မခွဲ ပါဘူး။
#include <stdio.h>
typedef signed char   CHAR;
typedef signed int    POSITION;
#define ToL(c) (((c)>='A')&&((c)<='Z')?(c+0x20):(c))
POSITION strcmp(CHAR* s1,CHAR* s2)
{ 
    for(;*s2;s1++,s2++) if(ToL(*s1)!=ToL(*s2)) return 0;
    return 1;
}
POSITION stripos (CHAR* haystack,CHAR* needle,POSITION offset)
{        
    for(;*(haystack+offset);offset++) if(strcmp(haystack+offset,needle)) return offset;    
    return -1;  
}
int main(int argc,char *argv[])
{
  CHAR str1[]="Hello! Good morning!";
  CHAR str2[]="good";
  printf("\nFound at: %d \n",stripos(str1,str2,0));   
  return 0;
}
အဲဒီနောက် F5 သို့မဟုတ် Debug menu>>Start Debugging ကိုနှိပ်ပြီး run ကြည့်နိုင်ပါတယ်။ Debug menu>>Start Without Debugging ကို သုံးလို့လည်း ရပါတယ်။

Tuesday, February 2, 2010

VB2005 Timers

The .NET Framework ထဲမှာ သုံးစရာ timer အမျိုးမျိုး ရှိပါတယ်။ Windows Forms applications တွေမှာ ဆိုရင် System.Windows.Forms.Timer control ကို သုံးနိုင်ပြီး user interface မရှိတဲ့ application မှာ ဆိုရင်တော့ System.Threading.Timer class ဒါမှမဟုတ် the System.Timers.Timer class ကို သုံးနိုင်ပါတယ်။ အောက်မှာ ပြထားတဲ့ နမူနာ မှာ System.Threading.Timer class ကို သုံး ပြီး procedure တစ်ခုကို ခေါ်သုံးထား ပါတယ်။ Timer ကို စပြီးတာ နဲ့ သူ့ရဲ့ တန်ဖိုးတွေကို ပြောင်းချင်ရင် Change method ကိုသုံးပြီးမှ ပြောင်းလို့ ရပါတယ်။ Stop method မရှိပါဘူး။ ရပ်ချင်ရင် Dispose method ကိုသုံးမှ ရပါမယ်။
Imports System.Threading
Dim dueTime as New TimeSpan(0,0,1)
Dim period as New TimeSpan(0,0,0,0,500)
Dim t As New Timer(AddressOf TimerProc, Nothing, dueTime, period)
Dim tEn As Boolean = True
Private Sub TimerProc(ByVal state As Object)
 If tEn = True Then
'Do timer things
 End If
End Sub