Monday, 28 April 2014

Андройд хөгжүүлэгчийн хөтөч - 3р бүлэг - AdapterView-г ашигласан өгөгдөл холболт

AdapterView-г ашигласан өгөгдөл холболт
AdapterView нь ViewGroup-ын дэд класс юм. Энэ нь layout-д өгөгдлийг дүрслэхэд хэрэглэгдэнэ. AdapterView  классаас уламжлагдан үүссэн дэд классууд нь ямар төрлийн өгөгдлийг ямар аргаар дүрслэхээрээ өөр хоорондоо ялгагдана. Жишээ нь: Gallery, ListView, Spinner гэх мэт. AdapterView  нь хоёр гол үүрэгтэй.
  1. Layout-д өгөгдлийг дүрслэх
  2. Хэрэглэгчийн сонгосон зүйлийг гүйцэтгэх
Өгөгдлөөр layout-г дүүргэх
Layout дээр өгөгдлийг дүрслэх нь AdapterGroup-ыг Adapter-тай холбосноор эхэлнэ. Adapter нь гадны эх үүсвэрээс өгөгдлийг авч ирнэ. Жишээ нь: Програм код доторх list, өгөгдлийн базын query үр дүн гэх мэт
Дараах жишээ код нь
  1. Resource-д тодорхойлогдсон view-г ашиглан Spinner-г үүсгээд
  2. Локал resource дахь өнгөний жагсаалтыг уншиж ирэх ArrayAdapter-г байгуулна.
  3. ArrayAdapter-т тухайн Spinner-ыг холбоно.
 ArrayAdapter
Адабтерууд дундаас хамгийн энгийн нь ArrayAdapter юм. ArrayAdapter нь list object-ыг ListView дээр дүрслэн дэлгэх үүрэгтэй юм. Үүний тулд list object-н нэгж object-ийг ListView-ийн нэгж View оbject руу хувиргана. Өгөгдмөлөөр object-ын toString() функцыг дуудаж, гарсан бичвэрийг TextView дээр дүрслэнэ. Хүсвэл хөгжүүлэгч өөрийн шаардлагад нийцсэн custom ArrayAdapter байгуулан хэрэглэж болно. ArrayAdapter-ыг хэрэглэхийн тулд

  1. Өгөгдлийн эх үүсвэр болсон Array-г зааж өгөх
  2. Нэгж өгөгдлийг хэрхэн ViewObject дээр дүрслэхийг тодрхойлоход болно. getView() функц нь энэ үүргийг гүйцэтгэдэг.
Хэрэглэх жишээ:

Дээрх код нь дараах үйлдлүүдийг гүйцэтгэсэн байна.
  1. ArrayAdapter-ыг байгуулах. Өгөгдлийн эх үүсвэр нь users нэртэй ArrayList бөгөөд

Sunday, 27 April 2014

Андройд хөгжүүлэлт: Eclipse resource cannot be resolved or is not a field

Андройд дээр шинэ resource файл нэмээд түүнийгээ програм код дотроо дуудаж хэрэглэх гэтэл
resource cannot be resolved or is not a field ийм алдаа заагаад шинээр нэмсэн resource-г чинь танихгүй байвал дараах арга хэмжээг аваарай.
  1. Дараах жишээн дээр үзүүлсэн шиг хэлбэртэй R class-ны импорт хэсгийг кодноосоо арилга. Жишээ : import mn.myandoird.test.R;
  2. Project->clean хий.
  3. Дахин R class-аа импорт хий.
Импортлох 2 төрлийн R класс байгааг анхаарна уу. Нэг нь андройд фреймворкийн resource-уудыг агуулсан import android.R; болон нөгөө нь прожектыг хөрвүүлэхэд бидний үүсгэсэн resource-уудыг хөрвүүлж бий болсон R класс Жишээ : import mn.myandoird.test.R;

Андройд хөгжүүлэгчийн хөтөч - 3р бүлэг - Layout-г тунхаглах

Layout-г тунхаглах
/Ихэнх нэр томьёог үнэхээр орчуулж барахгүй юм байна. Орчуулж байна гээд дараа нь өөрийнхөө болон өрөөлийн толгойг эргүүлж байхаар зарим үгсийг орчуулалгүй англиар бичих юмуу криллээр галиглаж бичиж байя./
 
Layout нь активитигийн UI-н бүтэц, загварыг тодорхойлж, хэрэглэгчид харагдах бүхий л элементүүдийг өөртөө агуулж байдаг. Хөгжүүлэгч нь хоёр аргаар layout -г тунхаглах боломжтой.
  1. XML файлд UI-г урьдчилан тодорхойлох
  2. Активити ажиллах явцад(at runtime) layout элементийн хувилбарыг үүсгэх
Хөгжүүлэгч нь энэ хоёр аргыг хоёуланг нь хэрэглэх боломжтой. Жишээ нь: XML файлаар UI урьдчилан тунхагласны дараа аппликейшн ажиллах явцад xml доторх UI object-н төлөвийг өөрчлөгдөхөөр програмчилж болно. 
Андройд фреймворк нь UI-г тунхаглах мөн залуурдах функцуудыг агуулж байдаг.
XML файлд layout-г тодорхойлсноор UI-н загвар бүтэц болон програм код хоёрыг тусгаарлаж өгсөн юм. Ингэснээр програм кодыг өөрчилсөн ч layout-г дахин уншуулж хөрвүүлэх шаардлагагүй мөн UI-н бүтэц нь ойлгомжтой болж байгаа юм. Жишээ нь: мобайл төхөөрөмж болгонд тохирсон эсвэл өөр өөр хэл дээр хэд хэдэн тусдаа layout үүсгэж, аппликейшн уншигдахад тухайн нөхцөлд тохирох layout-г хэрэглэж болох юм.
XML дэх элемент нь ижил нэртэй класстай, attribute нь ижил нэртэй функцтэй байдаг. Ингэж тохирох класс болон функцтэй нь ойролцоо нэр өгсөн нь тухайн элемент, аттрибют нь ямар үүрэгтэй болохыг ялгаж өгөхийг тулд юм.
XML байгуулах
Layout файл нь нэг язгуур элементтэй байх ёстой. Тэр View юм уу ViewGroup юм. Язгуур элементийг тодрхойлсны дараа түүний дотор өөр layout юмуу виджетийг тодорхойлох замаар шатчилсан view бүтцийг байгуулна. Жишээ нь:
 
Ингэж байгуулсан xml файлаа прожект доторх res/layout директорид хадгалаарай.
XML resource-г ачаалах
XML resource нь аппликейшныг хөрвүүлэх үед view resource-руу хөрвүүлэгдэнэ. Activity.onCreate() функц дотор setContentView() функцийг дуудаж, түүний параметрээр view resource-г дамжуулснаар resource ачаалагдана. onCreate() функцыг активити ажиллаж эхлэхэд андройд фреймворк дуудаж ажиллуулдаг юм. Жишээ нь:
Аттрибют - Attribute
View болон ViewGroup object нь өөрийн гэсэн Xml аттрибюттай байдаг. Эдгээр дунд тэдний эцэг view object-с уламжлагдан ирсэн аттрибютууд ч байна.
ID
View object гэх мэт бүхий л элементүүд өөрийгөө таниулах ID аттрибюттэй байх ба аппликейшныг хөрвүүлэх үед энэхүү ID нь бүхэл тоон утга авна. XML файл дотор id аттрибютэд утга өгөх: android:id="@+id/my_btn"
Андройд фреймворкд урьдчилан тодорхойлогдсон id resource-ууд байдаг. Эдгээрийг дуудаж хэрэглэхийн тулд android:id=@android:id/empty үүн шиг андройд гэсэн нэршлийг хэрэглэнэ. Ингэснээр андройд нь тухайн id resource-г прожезт доторх resource class дотор биш android.R class-аас дуудаж авчирна.
View-Г байгуулж, аппликейшнээс түүнийг дуудахдаа дараах үйл явцыг гүйцэтгэнэ.
  1. Layout файл дотор view/widget-г байгуулж, түүнд id утга өгнө.
  2. Програм кодны onCreate() функц дотор тухайн view object-н хувилбарыг байгуулж, тэр хвилбартаа layout-д урьдчилан тодорхойлсон view/widget-г хуваарилаж өгнө.
Layout параметр

Нэр томьёо
програм ажиллах явц - runtime
язгуур - root

Thursday, 24 April 2014

Андройд хөгжүүлэгчийн хөтөч - 3р бүлэг - Хэрэглэгчийн интерфейс

Хэрэглэгчийн интерфейс
  1. Хэрэглэчийн интерфейсийн тухай
  2. Layout - г зарлах
  3. Цэс байгуулах
  4. Диалог байгуулах
  5. UI event-г зохицуулах
  6. Хэрэглэгчид мэдэгдэх
  7. Стайл болон тема хэрэглэх
  8. Өөрийн темаг бий болгох
  9. AdapterViewег ашигласан өгөгдөл холболт
  10. Энгийн layout object
  11. Андройд view-г зурах арга
Хэрэглэгчийн интерфейсийн тухай - UI-н тухай
Аппликейшн дахь хэрэглэгчийн интерфейс гэдэг нь хэрэглэгчид харагдаж байгаа, хэрэглэгчтэй харьцаж байгаа бүх зүйлийг хэлнэ. Хэрэглэгчинй интерфейс нь View болон ViewGroup-ээс object-уудаас үүснэ. Олон төрлийн View болон ViewGroup байх ба эдгээр нь бүгд View болон классын залгамжлагчид юм.
Дэлгэцэнд харагдаж, хэрэглэгчид хариу үйлдэл үзүүлж байдаг товчлуур, бичвэрийн филд зэргээр хангадаг Widget класс нь View-ээс уламжилсан байдаг. Харин дэлгэцний зохион байгуулалтыг тохируулах Layout класс нь ViewGroup-ээс уламжилсан байдаг.
View дотор layout параметрүүд болон компонэнтууд хадгалагдах ба тэдгээр нь тодорхой тэгш өнцөгт талбайг эзлэн байдаг. View нь хэрэглэгчтэй харилцах хэсэг ба тухайн харилцаатай холбоотой event-г хүлээн авагч юм.
View-н шатчилсан бүтэц - View hierarchy
UI нь доорх зураг шиг View болон ViewGroup-үүдийн шатчилсан бүтцээр зохион байгуулагдана.
 
 
Энэхүү шатчилсан бүтцийг дэлгэцэнд харуулж, активититай холбохын тулд автивити дотор setContentView() функцыг дуудаж, шатчилсан бүтцийн оройн цэг (root node) - ийн холбоосыг (reference)-г параметраар дамжуулна. Оройн цэг маань түүний доторх child-уудад өөрсдийгөө дэлгэцэнд дүрслэхийг тушаана. Андройд нь энэ шатчилсан бүтэд дэх View-уудыг оройгоос нь эхлээд дэс дарааллаар судлаж, тэдний хувилбарыг үүсгэж(instance), parent дээр нь нэмж өгнө.
Зохион байгуулалт - Layout
Шатчилсан бүтцийг үүсгэх болон UI-ийг зохион байгуулах хамгийн энгийн арга бол XML зохион файлыг ашиглах юм. Энэхүү xml файлын элементүүд нь View болон ViewGroup-ууд юм. Эдгээрийн шатчилсан бүтцийг салаа модтой зүйрлэвэл View нь модны хамгийн үзүүрийн цэг, ViewGroup нь модны мөчир болно.
Xml файлын элемент бүр тус тусын жава класстай тохирно. Жишээ нь <TextView> элемент нь TextView классыг үүсгэнэ. Андройд систем нь рисус файлыг уншуулах үед, эдгээр элементүүдийн class-уудыг runtime object болгон байгуулна.
% addView(View) функцийг ашиглан View болон ViewGroup-ийг динамикаар байгуулах боломжтой.
Андройд нь View-үүдийн байршил бүтцийг зохион байгуулахын тулд олон төрлийн зохион байгуулалтыг агуулж байдаг.
Виджет - Widget
Виджет нь хэрэглэгчтэй харилцах интерфейсийг агуулж байдаг. Андройд нь checkbox, button, text field зэрэг үндсэн виджетүүдээс гадна data picker, clock, zoom control зэрэг нарийн виджетүүд байгаа. Хэрвээ хүсвэл хөгжүүлэгч өөрт тохирох виджетийг шинээр байгуулах юм уу, хуучин виджедээс уламжлан байгуулж болно.
UI event
UI-д байгуулсан view болон виджетүүдийг хэрэглэгчийн үйлдэлд хариу өгдөг болгох дараах 2 арга байна.
  1. Event listener-г тодорхойлж, view-д бүртгэх. Энэ нь event-д хариу өгөх хамгийн энгийн арга юм. On<Something>Listener хэлбэрийн нэртэй дотроо On<Something> нэртэй функцуудыг агуулсан интерфейсийг тодорхойлж, дараа нь view дотроо бүртгэх хэрэгтэй. Жишээ нь: View-г моус дарах event-д хариу хариу өгөхөөр тохируулахын тул OnClickListener-г байгуулж, OnClick функцыг тодорхойлсны дараа setOnClickListener() функцийг ашиглан view-д бүртгэнэ.
  2. View-д байгаа функцыг дахин тодрхойлох (overriding). Энэ өөрийн гэсэн view-г байгуулж, түүнийгээ event-д хариу үйлдэл үзүүлдэг болгохын тулд хэрэглэх арга юм. Жишээ нь: хуруугаар хүрэхэд хариу өгөхийн тулд onTouchEvent(), товчлуур дарагдах үзд хариу үйлдэл өгөхийн тулд onKeyDown() функцуудыг тодорхойлж болно.
Цэс
Цэс бол андройд UI-н бас нэгэн чухал хэсэг юм. Цэс нь view-тэй адил шатчилсан бүтэцтэй байна. Цэсний бүтцийг зохион байгуулах шаардлагагүй бөгөөд активити дотор onCreateOptionsMenu(), onCreateContextMenu() зэрэг функцуудыг тодорхойлж, цэсэнд оруулмаар байгаа зүйлсээ тунхаглахад л болно. Андройд нь автоматаар цэсний бүтцийг байгуулж, цэсийг дүрслэх болно. Хэрэглэгч цэс доторх зүйлийг сонгоход андройд нь OnOptionsItemSelected() болон onContextItemSelected() функцыг дуудаж өгдөг. Тиймээс цэсэнд event listener-г бүртгэх шаардлагагүй юм. Мөн xml файл дотор цэсний зүйлүүдийг тунхаглаж болно.
Нэмэлт сэдвүүд
Адабтор - Adapter
View-д урьдаас тодорхойлоогүй(not hard-coded) гадны өгөгдлийг харуулах гэж байгаа үед адабтерыг ашиглана. Adabter нь гадны өгөгдлүүдийг агуулж, AdabterView нь эдгээр өгөдлийг ViewGroup болон View-дээр дэлгэж өгнө.
Adapter нь өгөгдлийн эх үүсвэр болон энэ өгөгдлийг дүрслэх AdabterView хоорондын дамжуулах хэрэгсэл болж өгнө. Жишээ нь өгөгдлийн базаас өгөгдлийг авчрах CursorAdapter болон array-с өгөгдлийг авчрах ArrayAdapter зэргийг дурдаж болно.
Стайл болон Тема
Style болон Theme
Хэрвээ андройдын стандарт загвар таалагдахгүй бол өөрийн гэсэн стайл болон темаг үүсгэж болно.
  • Стайл нь layout-н нэгж элемэнтийг тохируулж болох загвар хэлнэ. Жишээ нь: Дурын бичвэрийн хэмжээ, өнгийг тодорхойлоод layout-н тодорхой нэг элементийн загварыг тодорхойлж болно.
  • Тема нь аппликейшны нэгж активитид тохируулж болох загвар юм. Жишээ нь: панелын арын өнгө, цэсний бичвэрийн өнгө болон хэмжээ гэх мэт.
 Андройд нь өгөгдмөл тема болон стайлтай ба хөгжүүлэгч өөрийн гэсэн тема стайлыг тунхаглах боломжтой юм.
...

Андройд хөгжүүүлэгчийн хөтөч - Нэр томьёонуудыг цэгцлэв.

Монголоор
Активити - activity
Виджет - Widget
Дахин тодрхойлох - overriding
Дуудах - 호출 /функцыг дуудаж ажиллуулах/
Зохион байгуулалт - Layout
Компонэнт - component
Контентоор хангагч

Манифест файл - manifest file
өгөгдөл холболт - data binding
Процесс - process
Рисус - resource
Тунхаглах - declaration - 선언
Үйлчилгээ - service
Хувилбар - instance
Англиар
Broadcast хүлээн авагч
java object
Thread
UI - user interface

Андройд хөгжүүлэгчийн хөтөч - 2р бүлэг - Процесс болон thread


Процесс болон thread
Аппликейшны эхний компонэнт ажиллах болоход андройд нь нэг thread-тэй линукс процессыг ажиллуулдаг. Програм хөгжүүлэгч нь компонэнтыг өөр процесс дотор ажиллуулахаар юм уу процесс дотор нэмэлт thread үүсгэхээр тохируулах боломжтой юм.
Процесс
Компонэнтыг ямар процесс дотор ажиллах вэ гэдгийг манифест файлд тохируулж өгнө. Манифест файл дахь <activity>, <service>, <receiver>, <provider> гэсэн 4 компонэнтийн элемент тус бүр <process> гэсэн attribute. Энэ attribute-ыг ашиглан компонэнт бүр тус тусын процесс дотор ажиллахаар тохируулах юмуу тодорхой хэдэн компонэнтыг бусад компонэнтуудаасаа тусдаа процесс дотор ажиллаж байхаар тохируулж болно. Эсвэл компонэнт дотор өөр аппликейшны компонэнтыг ажиллуулахаар ч тохируулж болох юм. Үүний тулд тухайн хоёр аппликейшн нэг хэрэглэгчийн id - тай нэг cертификаттай байх ёстой. Манифест файлын <application> элемент ч мөн <process> гэсэн attribute-тай байх ба энд тухайн аппликейшны бүх компонэнтын ажиллах процессын өгөгдмөл утгыг тодорхойлж өгдөг.
Бүх компонэнтууд нь тухайн процессын гол thread дотор үүснэ(instance). Тиймээс компонэнт нь их хугацаа шаардагдах үйлдэл хийх юмуу blocking хийвэл бусад компонэнтуудын ажиллагаанд саад учруулна. Тиймээс  их хугацаа шаардагдах үйлдэлд зориулж шинэ thread үүсгэж болно.
Андройд нь багтаамж хүрэлцэхээ болих юмуу хэрэглэгчийн яг одоо ажиллаж байгаа процесст илүү багтаамж шаардлагатай үед ард талд (background) идэвхгүй хэлбэрээр байгаа активититэй процессуудаас эхлэн унтрааж болно. Тэгвэл тэр процесс дотор ажиллаж байгаа бүх компонэнт устгагдана.
Thread
Аппликейшнд ганц процесс олгогдох боловч тэр дотроо олон thread үүсгэх боломжтой байдаг. Хэрэглэгчийн идэвхтэй ажиллуулж интерфейс нь хэрэглэгчийн үйлдэлд түргэн шуурхай хариу үйлдэл үзүүлж байх ёстой учраас, удаан хугацаа шаардагдах /интернэтээс файл татах гэх мэт/үйлдлүүдийг шинэ thread үүсгэж, тэр дотор ажиллуулах хэрэгтэй.
Thread нь жавагийн Thread object - оос үүснэ. Андройдод thread-ийг залах хэд хэдэн классууд байгаа.
  • Looper
  • Handler
  • HandlerThread

Tuesday, 22 April 2014

Mysql өгөгдлийн баз /database backup хийх арга болон өөр серверт хадгалах

/Энд a_host_name - ээс b_host_name рүү тодорхой нэг өгөгдлийн баазыг шилжүүлэн хадгалах үйлдлийг харууллаа./

Mysql тодорхой нэг өгөгдлийн базаа backup хийсний дараа өөр серверт шилжүүлэн хадгалахын тулд хэд хэдэн арга байна. Үүний тухай дэлгэрэнгүй мэдээллийг http://dev.mysql.com/doc/refman/5.0/en/copying-databases.html уншиж болно.

1. Шинэ сервертээ өгөгдлийн базаа байгуулна.
 shell> mysqladmin -u root_name create db_name -p
2. Local хадгалах ойд өгөгдлийн базаа хадгалана.
shell> mysqldump - u root_name -p - h a_host_name db_name > D:dbname.slq
3. Local backup хийсэн өгөгдлийн базаа шинэ сервертээ хадгална.
shell> mysql -u root_name -h b_host_name DBNAME -p < D:dbname.sql

Харин 3 дахь үйлдлийг хийхэд дараах алдаа заав.
ERROR 1449: the user specified as a definer does not exist
Үүнийг mysql client command line -д доорх коммандыг ажиллуулж арилгалаа.
mysql> grant all on *.* to 'root'@'%' identified by 'password' with grant option;
Үүний тухай дэлгэрэнгүйг энэ линкээс уншаарай. http://stackoverflow.com/questions/10169960/mysql-error-1449-the-user-specified-as-a-definer-does-not-exist

Monday, 21 April 2014

Андройд хөгжүүлэгчийн хөтөч - 2р бүлэг - Аппликейшны тухай?

2. Аппликейшны тухай
 2.1 Аппликейшн компонэнт
 2.2 Активити болон таск
 2.3 Процесс болон thread
 2.4 Компонэнтын амьдралын мөчлөг

Аппликейшны тухай
Андройд аппликейшн нь жава програмын хэл дээр бичигдэх ба бүх жава програм кодууд мөн аппликейшнд хэрэглэгдэх өгөгдлүүд болон бүх resource файлуудыг aapt utility - ээр багцлан .apk тодотголтой нэг архив файл бий болгодог. Энэ архив файл нь андройд төхөөрөмжид суулгах нэг аппликейшн юм.
  • Өгөгдмөл тохиргоогоор аппликейшн нь өөрийн гэсэн линукс процесс дотор ажиллана.
  • Процесс болгон өөрийн гэсэн жава virtual machine-тай.
  • Өгөгдмөл тохиргоогоор аппликейшн болгон тусдаа хэрэглэгчийн id-тай ба тухайн аппликейшны хувийн файлыг тухайн хэрэглэгч болон аппликейшн нь харах боломжтой. Хэрэв 2 өөр аппликейшн нэг хэрэглэгчийн id-тай байхаар тохируулагдсан бол тэр 2 аппликейшн нь өөр хоорондоо хувийн файлуудаа хуваалцах боломжтой ба нэг линукс процесс дотор ажиллаж, нэг жава virtual machine-ыг ашиглана.

Аппликейшн компонэнт
Андройдод нэг аппликейшн өөр нэг аппликейшны бусдад хэрэглүүлэхээр зөвшөөрсөн ямар нэг чадварыг ашиглах боломжтой байдаг.Үүний тулд нөгөө аппликейшныхаа кодыг өөртөө агуулах юмуу түүнтэй холбох ямар нэгэн холбоосны шаардлагагүй. Зөвхөн хэрэгтэй үед нөгөө аппликейшны тухайн ашиглах гэж байгаа хэсгээ ажиллуулахад л болох юм. Үүний тулд систем нь нөгөө аппликейшны процессыг ажиллуулаад ашиглах хэсгийн жава object-ын instance-ыг бий болгоно. Андройд аппликейшны бусад системүүдээс ялгарах онцлог шинж нь нийт аппликейшны хувьд ганц эхлэх цэг буюу main class гэж байдаггүй юм. Оронд нь андройд аппликейшн нь хэрэгтэй үед жава object-ын instance-ыг бий болгон ашиглах боломжтой компонэнтуудаас бүтдэг юм. Дөрвөн төрлийн компонэнт байдаг.
1. Активити - Activity
Активити гэж хэрэглэгчид харагдах интерфейсыг үүсгэн хэрэглэгчийн анхаарал дор ажилладаг компонент юм. Нэг аппликейшн нь түүний бүтцээс хамаарч нэг болон түүнээс дээш хэдэн ч активитигаас бүтэж болно. Жишээ нь: Зурвас бичих аппликейшн нь хуучин зурвасуудын архивыг харуулах активити, зурвас явуулах утасны дугаарыг сонгох утасны жагсаалт харуулах активити, сонгосон дугаар луу зурвасыг бичих активитинуудаас бүрдэж болно. Бүх активити нь Activity class-ын дэд class юм.
Активити болгон өгөгдмөл window-той байна. Энэ window нь шатласан бүтэцтэй олон view-ээс бүтнэ. View болгонд window доторх нэг хэсэг тэгш өнцөгт талбай ноогдох ба тухайн хэсэгт хийгдэх хэрэглэгчийн үйлдлийг хариуцна. Жишээ: button, text box, scroll bar, check box гэх мэт.
View шатласан бүтэц нь Activity.setContentView() гэсэн method-оор активити дэх window-д байршина.
2. Үйлчилгээ - Service
Үйлчилгээ нь харагдах интерфейс гэж байхгүй ба хэрэглэгч өөр юм хийх зуур ар талд ажиллаж байдаг. Жишээ нь: дуу тоглуулах ч юмуу, интернэтээс файл татах гэх мэт.
Үйлчилгээ нь Service class-ыг extend хийх ёстой.
Үйлчилгээний интерфэйстэй холбогдон тухайн үйлчилгэйтэй харилцах боломжтой юм. Жишээ нь  : тоглогдож буй дууг түр зогсоох, дахин ажиллуулах гэх мэт.
3. Broadcast receiver - Broadcats хүлээн авагч
Систем код болон аппликейшнээс ирсэн мэдэгдлийг хүлээн авч түүнд хариу өгөх үүрэгтэй компонэнт юм.
    Систем кодоос ирэх мэдэгдэл: батерей дутаж байна, зураг дарагдлаа гэх мэт.
    Аппликейшнээс ирэх мэдэгдэл: файл татаж дууслаа гэх мэт.
Аппликейшн нь чухал гэж бодсон мэдэгдэлд хариу өгөх зорилготой хэдэн ч broadcast receiver-тэй байж болно. Broadcast receiver нь Receiver class-ыг extend хийх ёстой. Broadcast receiver нь хэрэглэгчийн интерфэйс гэж байхгүй ба тухайн мэдэгдэлд хариу өгөх активитиг ажиллуулах юм уу notification manager-ыг ашиглан мэдэгдлийг чичиргээ, ая гаргах гэх мэт янз бүрийн аргаар  хэрэглэгчид мэдээлж болно.
4. Контентоор хангагч - Content provider
Бусад аппликейшнуудад хэрэглэгдэх өгөгдлийн олонлогийг бий болгоно. Энэхүү өгөгдлүүд нь файл систем, SQLite өгөгдлийн баз гэх мэт хаа нэгтээ хадгалагдаж байх юм. Аппликейшнт энэ content provider-ыг шууд content resolver-оор дамжуулан ашиглана. Контентоор хангагч нь ContentProvider class-г уламжлан (extend) авснаар өгөгдлийг бусад аппликейшн олж авч хадгалах боломжоор хангаж өгөх функцуудыг байгуулах юм. Гэхдээ аппликейшн нь эдгээр функцуудыг шууд дуудан хэрэглэж чадахгүй ба ContentResolver-оор дамжуулан хэрэглэх боломжтой юм. ContentResolver нь ямар ч контентоор хангагчтай харьцах чадвартай байдаг.
Компонэнтыг идэвхжүүлэх: Интент
Контентоор хангагч нь түүн лүү  ContentResolver хүсэлт явуулах үед идэвхжинэ. Харин үлдсэн гурван төрлийн компонэнт болох активити, үйлчилгээ, broadcast хүлээн авагч нь интент гэх зурвасаар идэвхжинэ. Энэ нь дотроо контент зурвасыг агуулсан интент object юм.
Активити болон үйлчилгээг идэвхжүүлэх интент нь тухайн компонэнтын гүйцэтгэх ажил болон өгөгдөл зэргийг заасан байна. Жишээ нь: Нэг активитид тодорхой текстийг засах үүрэг өгөх
  • Активитийг идэвхжүүлэхийн тулд Context.startActivity() эсвэл Activity.startActivityForResult() гэсэн функцуудад интент параметрыг дамжуулан өгч дуудна. Тухайн интентэд хариу өгөх активити нь getIntent() функцыг ашиглан өөрийг нь идэвхжүүлсэн интентийг олж авна. Нэг активити нь нөгөө активитигаа идэвхжүүлэн ажиллуулна. Хэрвээ ажиллуулсан активитигийн гаргах үр дүнг хүлээн авах шаардлагатай бол startActivityForResult() функцыг дуудаж шинэ активитиг идэвхжүүлэх хэрэгтэй. Жишээ нь: Хэрэглэгчийн сонгосон зургийг хүлээж авах
  • Үйлчилгээг идэвхжүүлэхийн тулд Context.startService() функцад интент object-г параметрээр дамжуулан өгч  дуудна. Систем нь үйлчилгээнд интент object-г onStart()  функцээр  дамжуулна. Мөн ижил замаар Context.bindService() функцад интент object-г параметрээр дамжуулан өгч  идэвхжсэн, идэвхжүүлсэн компонэнт хоорондын үргэлжилсэн холбоог бий болгож болно. Жишээ нь: Ар талд хөгжим тоглуулж буй үйлчилгээг хэрэглэгчээр залуулахын тулд хэрэглэгчийн интерфейсээр хангах шаардлагатай болно. Үүний тулд активити нь Context.bindService() функцыг дуудаж, тухайн үйлчилгээний хөгжим тоглуулах функцуудыг ашиглах боломжтой болно.
  • Context.sendBroadcast(), Context.sendOrderedBroadcast(), Context.sendStickyBroadcast() зэрэг олон төрлийн функцд интентийг дамжуулж, broadcast-г үүсгэж болно. Энэ интентээр дамжин идэвхжих бүх broadcast хүлээн авагчдад onReceive() функцээр интентийг дамжуулна.
Компонэнтыг унтраах
Контэнтээр хангагч болон broadcast хүлээн авагч хоёр нь өөрсдийг нь идэвхжүүлсэн хүсэлтэд хариу өгч байх хугацаандаа л асаалттай байх учраас зориудаар унтраах шаардлагагүй юм. Харин активити болон үйлчилгээ нь удаан хугацааны турш идэвхтэй хэвээрээ байх ба эдгээрийг унтраах тусгай функцууд байдаг.
  • Активити нь finish() функцыг ашиглан өөрийгөө, finishActivity() функцыг ашиглан өөр активитиг унтрааж болно
  • Үйлчилгээн stopSelf() юм уу Context.stopService() функцээр унтрана.
Компонэнтыг хэрэггүй болсон үед нь юм уу хэтэрхий олон компонэнт ажилласнаас болж санах ойн ачааллыг багасгахын тулд систем унтрааж болно.
Manifest файл
Manifest файл нь manifest.xml гэсэн xml файл байх ба аппликейшны package .apk дотор аппликейшны програм код, өгөгдлүүд, resource файлуудтай хамт байдлана. Манифест файлын гол үүрэг нь аппликейшны компонентуудыг зарлах явдал юм. Энд зарлагдаагүй компонэнт нь системд харагдахгүй ба ажиллахгүй гэсэн үг юм. Гэхдээ broadcast хүлээн авагч нь програм дотор Context.registerReceiver() функцээр динамикаар үүсгэгдэж болно.
Жишээ нь:
<?xml version="1.0" encoding="utf-8"?>
<manifest ..."
   <application ... >
        <activity
            android:name="mn.example.projectFragmentActivity"
            android:screenOrientation="landscape"
            android:theme="@style/AppTheme"
            ... >
        </activity>
        ...
    </application>
</manifest>

Интент филтер
Интент нь өөрийн обьект болох компонэнтаа тодорхой зааж өгдөг. Андройд нь манифест файлд зарласан мэдээллийг ашиглан тухайн компонантыг олно. Хэрвээ интент обьект болох компонэнтаа тодорхой зааж өгөөгүй бол түүнд тохирох компонэнтыг олохын тулд манифест файлд зарласан компонэнтын интент филтэр дэх тодорхойлолтыг харьцуулж үзнэ. Интент филтер хэсэгт компонэнт нь өөрийхөө гүйцэтгэх боломжтой интентүүдийг тодорхойлж өгсөн байдаг. Програм код дотор динамикаар үүсгэгдсэн broadcast хүлээн авагчийн интент филтерийг IntentFilter object-ын Instance-ийг үүсгэж тодорхойлно. Жишээ нь:
  ...
 <application
        <activity
            android:name="mn.example.projectFragmentActivity"
            android:screenOrientation="landscape"
            ... >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
       ...
    </application>

Активити болон таск
Нэг активити өөр нэг активитигээс ажиллуулах боломжтой. Энэ активити нь өөр аппликейшны активити байж ч болно. Жишээ нь: Хэрэглэгчид тодорхой нэг байршлын газрын зургийг харуулах хэрэгтэй боллоо гэж бодоё. Андройдын map view-д тэр чавдар байдаг тул хөгжүүлэгчийн хийх ажил нь интент object-д хэрэгтэй мэдээллүүдээ хадгалсны дараа энэ интент object-оо startActivity() функцийн параметр болгон дамжуулах явдал юм. Тэгвэл map view нь газрын зургийг харуулах ба хэрэглэгчийг Буцах(Back) товчийг дарахад буцаад эхний активитидаа ирнэ.
Таск нь нэг стак дотор эрэмбэлэгдэж байгаа нэг аппликейшнээс үүдэлтэйгээр үүсч, хэрэглэгчийн үзэж өнгөрсөн активитинуудын бүлэг юм. Энэ стакийн root активити нь хэрэглэгч анх сонгосон аппликейшны гол активити бөгөөд хамгийн дээр байгаа активити нь одоо ажиллаж байгаа активити юм. Нэг активити нь өөр нэг активитиг ажиллуулахад тэр нь стак дээр нэмэгдэж(push), стакийн хамгийн дээд талын активити болно. Харин хэрэглэгч Буцах(Back) товчийг дарах болгонд стакийн хамгийн дээд талын активитигаас эхлэн стакаас устгагдаж(pop), түүний дараагийн активити  стакийн хамгийн дээд талын активити болно.
Таск дотор нэг ижил активити олон байж болох ба стак нь тэр активитигийн инстанс болгоны тус тусын эхлэлийн цэгтэй байна.
Таск дотор байгаа бүх активитинууд нь хамт шилжинэ. Таскийг тэр чигт нь арагшаа шилжүүлэх юмуу, урагш дуудаж авчирж болно.
Дээрх ажиллах дараалал нь активити болон таскны өгөгдмөл тохиргоо бөгөөд манифест доторх активитигийн тодорхойлолтод эсвэл активитиг ажиллуулах интент object-д flag утгаар тохируулж өгч болно. Интент object-ын гол flag-ууд нь:
FLAG_ACTIVITY_NEW_TASK
FLAG_ACTIVITY_CLEAR_TOP
FLAG_ACTIVITY_RESET_TASK_IF_NEEDED
FLAG_ACTIVITY_SINGLE_TOP

Контентоор хангагч - Content provider

Аппликейшн компонэнт - Application component
Активити - Activity
Tаск - Task
Процесс - Process
Компонэнтын амьдралын мөчлөг - Component lifecycle
Үйлчилгээ - Service

Андройд хөгжүүлэгчийн хөтөч - 1р бүлэг - Андройд гэж юу вэ?

Гарчиг
1. Андройд гэж юу вэ?
 1.1 Гол онцлог
 1.2 Андройдын бүтэц
 1.3 Application
 1.4 Application framework
 1.5 Library
 1.6 Андройд runtime
 1.7 Линукс кернел

Андройд гэж юу вэ?
 
Андойд нь үйлдлийн систем, суурь холбогч програм хангамж болон гол аппликешнуудыг агуулж байдаг мобайл төхөөрөмжид зориулагдсан програм хангамжийн стак (software stack) юм. Андройд SDK (Android SDK) нь аппликешныг хөгжүүлэхэд хэрэглэгдэх жава програмын хэл (java programming language) дээр бичигдсэн хэрэгслүүд болон API-уудыг агуулж байдаг.
 
үйлдлийн систем (operating system) - (Үйлдлийн системийг wikipedia дээр монголоор их сайхан тайлбарласан байна. ) Компьютерын ажиллагааг програм хангасж болон техник хангамж гэж ангилна. Техник хангамж нь компьютерын санах ой, CPU зэрэг эд ангиуд юм. Харин програм хангамж дотроо үйлдлийн систем болон энгийн хэрэглээний програмууд гэж хуваагдана.Үйлдлийн систем нь компьютер дэх техник хангамжуудыг удирддаг програмуудын цогц юм. Мөн техник хангамжууд болон хэрэглээний програмуудыг холбогч болж, хэрэглээний програмуудад шаардлагатай үйлчилгээнүүдийг үзүүлж байдаг. Энд бидний хамгийн өргөн хэрэглэдэг үйлдлийн систем болох Microsoft компаний Windows - н цувралуудыг дурдаж болно.
суурь холбогч програм (middleware) - Хэрэглээний програмуудад (software application) хэрэгтэй үйлчилгээг үзүүлдэг компьютер програм хангамж юм.
програм хангамжийн стак (software stack)
 
 
 
Application 
Андройд нь contact, message, map зэрэг хэд хэдэн гол аппликейшн-уудыг агуулж байдаг. Эдгээр аппликешнууд нь жава хэл дээр бичигдсэн.
 
Application framework
Application болгон framework API-ийг ашиглах ба андройд application-ууд өөр хоорондоо өөрсдийн чадварыг солилцох боломжтойгоор бүтэцлэгдсэн юм. Application-ууд дараах үйлчилгээ болон системийн олонлогуудыг агуулж байдаг.
1. View систем
Grid, button, text box гэх мэт
2. Контентоор хангагч (Content provider)
Аппликешнууд өөр хоорондоо өгөгдлөө хуваалцах боломжоор хангаж өгнө.
3. Resource хариуцагч (Resource manager)
String, layout файл гэх мэт non-code resource-д хандаж ашиглах боломжоор хангана.
4. Анхааруулга хариуцагч (Notification manager)
Аппликешныг төлөвийн самбарт анхааруулга зурвас гаргах боломжоор хангана
5. Активити хариуцагч (Activity manager)
Аппликешны амьдралын мөчлөг болон хэрэглэгчийн хэрэглэсэн аппликешнуудын замналыг хариуцна.
 
Libraries
Андройд нь систем компонентад ашиглагддаг C/C++ library-уудыг агуулж байдаг. Андройд хөгжүүлэгч нь framework API-аар дамжуулан эдгээр library-уудыг ашиглаж байдаг.  Гол library-уудыг дор жагсаав.  
System library - Linux-ын техниз хангамжид зориулсан C system library.
Media library - Бүх төрлийн зураг, дуу болон бичлэгэн файлуудыг тоглуулах болон бичих
LibWebCore - Веб хөтөч энжин
SQLite - Relational өгөгдлийн базын энжин
 
Андройд runtime
Андройд  дээр бичигдсэн програмыг ажиллуулахын тулд эхлээд жава compiler-аар жава virtual machine-д зориулагдсан .class файл руу хөрвүүлж, дараа нь андройд SDK-д байгаа DX гэх хэрэгслээр Dalvik virtual machine-д зориулагсан .dex format руу хувиргана. Ингэж бий болсон .dex файлыг Dalvik virtual machine ажиллууна.
Dalvik virtual machine нь андройд төхөөрөмж дээр аппликешнуудыг ажиллуулах зориулалттай. Dalvik virtual machine нь  register-д суурилсан бөгөөд доод түвшний санах ой хариуцалт болон threading зэрэгтэй хамааралтай чадварууд нь Линуксийн кернелээс шууд хамааралтай.
 
Линукс кернел
Андройдын аюулгүй байдал, санах ой, network болон driver-н хариуцалт зэрэг гол систем үйлчилгээнүүд нь линуксээс хамааралтай юм. Нэг үгээр хэлбэл андройдын дотоод цөм нь линукс кернел гэж хэлж болно.
 

 

Андройд хөгжүүлэгчийн хөтөч - Android Developer's guide /3rd edition/

Ажлын шаардлагаар андройд сурах хэрэгтэй болсон учраас энэхүү е-номыг солонгос хэл дээр татан авч судалж эхэллээ. Номыг уншихдаа бүлэг болгоны ард тэмдэглэл хөтөлж байхаар боллоо. Энэхүү тэмдэглэл байна андройдыг сурч байгаа хэн нэгэн эрхэм болоод надад өөрт маань эргээд хэрэг болж байвал миний одоо ингээд бичиж буй хэрэг бүтэх юм.

android.com -ын developer's guide-с солонгос хэл рүү орчуулсныг монгол хэлээрээ чадан ядан тайлбарлан бичихийг оролдлоо. Ихэнх мэргэжлийн үгсийг англиар нь юмуу галиглаж бичихээс өөр арга алга. Ойлгомжгүй тайлбарласан байвал санаа оноогоо сэтгэгдлээр бичээрэй. Шүүмжлэлийг хүлээж авна.

Гарчиг
1. Андройд гэж юу вэ?
2. Аппликешны тухай
3. Хэрэглэгчийн интерфейс
4. Resource esset
5. Интент болон интент филтер
6. Өгөгдөл хадгалах талбар
7. Контентоор хангагч
8. Аюулгүй байдал болон эрх
9. Андройд манифест файл

Thursday, 6 March 2014

MySQL error getting DDL for object

"Error getting DDL for object
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIGGER `mark`.`evaluation_insert`"

MySQL Workbrench ажиллаж байгаад байгуулсан хүснэгтээ засварласны дараа  "Error getting DDL for object
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TRIGGER `mark`.`evaluation_insert`" ийм алдаа гарч ирлээ.
Ингэснээр дахин энэ хүснэгтийг засварлах боломжгүй болж, "alter table" дарах болгонд

 энэ алдаа гарч  ирэх болов. Энэхүү алдаа нь хүснэгтэд баганы тайлбарыг юникод үсэг бичигдсэнтэй холбоотой юм байна. Хүснэгтийн баганыг засварласны дараа тухайн баганы тайлбар дахь юникод үсгийг танихаа байсан байна. Тэгвэл энэ асуудлыг шийдвэрлэхийн тулд тухайн баганы тайлбарыг sql statement ашиглан дахин засварлахад болно.
 

Alter table tbl_attend
modify total_in_time BIGINT(11) Comment "총 참여시간";

Ер н бол хүснэгтэд COMMENT бичих хэрэггүй бололтой.

Friday, 28 February 2014

MySQL болон C хэл рүү монгол кириллээр өгөгдөл бичих, унших. ө ү үсэгний асуудал

MySQL дээр database-ээ анх байгуулахдаа utf8_unicode_ci эсвэл utf8_general_ci энэ хоёрын аль нэгээр хадгалаарай. utf8_general_ci нь арай хурдан боловч utf8_unicode_ci нь илүү тодорхой гэсэн байна. Би програм бичихдээ алийг нь хэрэглэж байснаа мартчихаж.

С хэлээр бичигдэж буй програмаас дээрх монгол кирилл өгөгдөл хадгалагдсан байгаа database-н хүснэгт рүү монгол кирилл үг орсон sql statement явуулах, мөн монгол кирилл үг орсон өгөгдөл авчрах жишээ кодыг тайлбартай нь тавья.
1. Эхний method DB-тэй холбохын тулд тохиргоо хийх method
*5р мөр : Database-ээ utf8аар хадгалсан учраас DB-холболтоо utf8-р тохируулж өглөө.
Иймээс DB рүү илгээх query болон DB-ээс ирэх result нь utf8-р кодлогдсон байгаа.
1. MYSQL* connectDB(void)
2. {
3.     MYSQL *conn;
4.     conn = mysql_init(NULL);
5.     mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8");
6.     mysql_options(conn, MYSQL_INIT_COMMAND, "SET NAMES utf8");
7.     mysql_real_connect(conn, DB_HOST, DB_USER, DB_PASS, DB_NAME, 3306, (char *)NULL, 0);
8.     if(conn == NULL)
9.    {
10.       fprintf(stderr, "Mysql connection error : %s", mysql_error(conn));
11.       exit(0);
12.  }
 13.      return conn;
14.}

2. Хоёр дахь method DB рүү query-г илгээж, DB-с ирэх хариуг хүлээн авах үүрэгтэй.
Энэхүү method-ын эхний parameter нь wchar_t type-тай query нэртэй string байна. Би дээрийн бичлэг дээрээ C хэлэн дээр монгол кирилл үсгийг зөв хадгалахын тулд wide character type-г ашиглана гэж бичсэн. Тэгэхээр энэхүү query string маань unicode -оор кодлогдсон байгаа. Харин mysql database дэх монгол кириллээр бичигдсэн өгөгдөл маань utf8-аар кодлогдсон байгаа. Тиймээс DB рүү илгээх query-гээ utf8-аар кодлож байж илгээх ёстой. Тэгэхгүй бол кириллээр бичсэн үгийг зөв тайлж уншиж чадахгүй кодлосон арга нь өөр учраас.
 *2р мөрөнд : "char * UNIToUTF(wchar_t*)" -г ашиглаж query-н кодыг Unicode-с UTF8-руу хувиргалаа. Сайн ажиглаарай UNIToUTF нэртэй method -ний оролт нь wchar_t* type-тай байсан бол гаралт нь char * type-тай байна.
*3р мөрөнд : Ингэж хувиргасан query-гээ (queryChar)
mysql_real_query method-г ашиглан db рүү явууллаа.
*10р мөрөнд db-ээс хариу result-авчирлаа.
1.MYSQL_RES * fetch_result(wchar_t * query, MYSQL * conn){
2.    MYSQL_RES * res;
3.    int query_stat;
4.    char * queryChar = UNIToUTF(query);
5.   query_stat = mysql_real_query(conn, queryChar, strlen(queryChar));
6.   if(query_stat)
7.   {
8.        fprint(stderr, "Mysql query error : %s", mysql_error(conn));
9.   }
10.   res = mysql_store_result(conn);
11.   return res;
}

3.
*7, 8р мөр : DB-ээс ирсэн хариу өгөгдөл маань utf8-аар кодлогдсон байгаа тул UTF8ToUNI гэсэн method-г ашиглан Unicode руу хувиргана.
1. wchar_t query[256];
2. wcscpy(query, L"select col1, col2 from table1 where col1 like 'өглөө' ");
3. MYSQL_RES *res;
4. MYSQL_ROW row;
5.  res = fetch_result(query, conn);
6.  while((row=mysql_fetch_row(res))!=NULL){
7.  wchar_t * col1 = UTF8ToUNI(row[0]);
8.  wchar_t * col2= UTF8ToUNI(row[1]);
....
4. Хамгийн сүүлийн хоёр method бол та бүхэн өөрийнхөө кодод тэр чигээр нь хуулж аваад ашиглах хамгийн гол method-ууд байгаа.
*4 болон 6р мөрөнд ижил method-г дуудсан боловч сүүлээсээ гурав дахь parameter-ээс шалтгаалж 2 өөр үйлдэл гүйцэтгэнэ.
*4р мөрөнд сүүлээсээ гурав дахь parameter буюу string-н уртыг 0р өгвөл whcar_t type- р хадгалагдсан string-г utf8 руу хадгалахад хэр их багтаамж шаардлагатайг хэмжиж өгнө.
*5р мөрөнд HEAP-т дээрх мөрөнд хэмжсэн хэмжээний багтаамжтай зайг гаргаж, түүнийхээ хаягийг strUTF8 -д хадгалууллаа.
*6р мөрөнд энэ урьдчилан бэлдсэн зайндаа strUNI-д байгаа Unicode-р кодлогдсон үгийн utf8 рүү хувиргаж хадгална.
1.char* UNIToUTF8(const wchar_t * strUNI)
2.{
3.    char * strUTF8=NULL;
4.    int nLen = WideCharToMultiByte(CP_UTF8, 0, strUNI, -1, strUTF8, 0, NULL, NULL);
5.    strUTF8 = (char*)malloc(nLen+1);
6.    WideCharToMultiByte(CP_UTF8, 0, strUNI, -1, strUTF8, nLen, NULL, NULL);
7.    return strUTF8;
8.}
wchar_t* UTF8ToUNI(const char* strUTF8)
{
 wchar_t * strUnicode;
 int nLen = MultiByteToWideChar(CP_UTF8, 0, strUTF8, lstrlen(strUTF8)+1, NULL, NULL);
strUnicode = (wchar_t*)malloc(nLen+1);
 MultiByteToWideChar(CP_UTF8, 0, strUTF8, lstrlen(strUTF8)+1, strUnicode, nLen);
 return strUnicode;
}

За өөрийнхөө дээр бичиж байсан кодыг ашиглан жишээ авч чадах ядахаараа тайлбарлалаа. Зарим нэг нэр томьёог монголоор хэлж мэдэхгүй болохоор шууд англиар биччихлээ.
Би өөрөө энэ асуудлыг шийдэх гэж хэдэн өдөр болж байсан шиг санагдаж байна. Дараа дараагийн хүмүүс маань нэгнийхээ туршлаган дээр суурилаад хийвэл хамтаараа илүү олон асуудлуудыг шийдэж чадах болов уу. Та бүхэнд амжилт хүсье.

keyword : mongolian cyrillic word, mysql table record, c programming language

Friday, 21 February 2014

MySQL error code 1175

MySQL safe mode/ аюулгүй төлөвт байхад table update/delete хийхэд WHERE дээр хүснэгтийн индекс ороогүй бол error code 1175 алдаа гарна. Аюулгүй төлөв нь хүснэгтийн өгөгдлүүд олноороо устгагдахаас сэргийлж байгаа юм. Дараах query-аар энэхүү тохиргоог арилгасны дараа update-хийвэл болно.
SET SQL_SAFE_UPDATES = 0;

Monday, 3 February 2014

MySQL view

Тодорхойлолт

View нь байнга хэрэглэгддэг, төвөгтэй select query-г хадгалах зорилготой ба хиймэл хүснэгт(virtual table) гэж нэрлэгдэх нь бий. Учир нь view нь яг table-тэй адилхан багана, мөртэй боловч жинхэнэ өгөгдөл энд хадгалагдаж байгаа биш юм. Гол зорилго нь join -г ашиглан хэд хэдэн өөр table болон view-ээс төвөгтэйгээр гаргаж авах өгөгдлийг хадгалж, дараа нь хялбар аргаар энэхүү өгөгдлийг харах боломжтой. Мөн шаардлагатай нөхцөлийг хангасан тохиолдолд View-ийг ашиглан жинхэнэ өгөгдлийг шинэчилэх боломжтой.

Давуу тал

1. Хэцүү query - г хялбарчилж өгнө. Олон өөр өөр table-ээс өгөгдлийг гаргаж авах урт, төвөгтэй query-ийг view болгон хадгалж, энэ төвөгтэй query-г байнга хэрэглэхийг оронд view-ийг ашиглан амархан select query-ээр өгөгдлийг харж болно.
2. Зарим хэрэглэгчдэд тодорхой өгөгдлийг харуулахгүйгээр хязгаарлах боломжтой.
3. Зөвхөн өгөгдлийг харах боломжтой (read only) view-ийг байгуулж, өгөгдлийг өөрчлөх боломжгүй хамгаалалт үүсгэж болно.
4. Өөр өгөгдлөөс тооцоолон гаргах боломжтой өгөгдлийг view-д хадгалах боломжтой. Table-д ингэж тооцоолон гаргах боломжтой өгөгдлийг хадгалбал ой санамжийн зайг үр ашиггүй хэрэглэсэн болно.

Сул тал

1. View өөр view-ээс үүссэн бол өгөгдлийг тооцоолон гаргахад бага зэрэг удна.
2. Table-ээс үүсгэдэг учраас table өөрчлөгдөхөд view-г ч мөн өөрчлөх шаардлагатай болдог.

Monday, 5 August 2013

Монгол кирилл бичгийн ө, ү үсэг мөн монгол бичгийг С хэлэнд таниулах

Энэ сэдвээр нэлээн дээрээс бичмээр байсан ч зав болохгүй байсаар өдийг хүрлээ.
С хэл дээр ямар нэгэн мэдэхгүй зүйл гарахад Googlees хайгаад асуултынхаа хариуг англи болон бусад хэл дээр амархан олчихно. Гэхдээ тэр бүр хайж олдоод байхгүй сэдэв бол яг одоо бичиж буй, монгол хэл монгол бичигтэй холбоотой сэдэв юм. Англи, солонгос зэрэг хөгжингүй орнуудын хэлтэй харьцуулахад манай монгол хэлний компьютерийн шинжилгээний ажил өргөн хөгжөөгүй байгаа болохоор энэ тал дээр програмчид маань их бэрхшээлтэй хувь хувьдаа тулгарч байдаг байх. Яг одоо миний бичиж буй сэдвийн бэрхшээл тулгарсан хүн байвал наашаа анхаарлаа хандуулна уу. Би өөрөө энэ бэрхшээлээ давах гэж хэчнээн өдөр зарцуулсан болохоор дараа дараачийн хүмүүстээ энэ туршлагаасаа хуваалцахыг хүсч байна. Уншигч та энэ бичлэгийг ашиглан асуудлаа шийдвэрлэж чадвал миний энэ блогийг бичиж буй зорилго хэрэгжиж байна гэсэн үг юм.

С хэлэнд /string/ үгтэй ажиллахад ер нь анх суралцагсдад хэцүү байдаг.
string хадгалах зориулалттай char type өргөн хэрэглэдэг байх. Гэтэл энэ type-г ашиглан бичсэн дараах кодуудыг харцгаая.

char * ch = "аав";


Ингэж бичихэд аав гэдэг үг зөв уншигдана. Гэтэл

char * ch = "өвөө";



гэвэл ?????? буюу асуултын тэмдэгнүүд л уншигдана.

Тиймээс үгээ хадгалахдаа char биш wchar_t -г ашиглаарай
Жишээ нь:

wchar_t * ch = L"өвөө";









wchar_t * ch = L"ᠡᠪᠦᠭᠡ";





Таны хүссэн хариу хэвлэгдэх болно. Энэ жишээ шиг зүгээр нэг хэвлэхдээ гол нь биш С хэл таны оруулсан үгийг үнэн зөвөөр нь уншиж чадаж байна гэсэн үг юм.
Дараагийн удаа MySQL С хэлтэй хэрхэн хослуулах вэ, DBд байгаа монгол үсгээр хадгалсан датаг хэрхэн С хэл рүү унших вэ, DB рүүгээ хэрхэн монгол үсгээр бичсэн үг орсон query явуулах тухай бичих болно.