วันจันทร์ที่ 25 มีนาคม พ.ศ. 2562

Ionic 4 & Angular 7 CRUD Mobile Apps

ศึกษาตาม tutorial จากเว็บไซต์ https://www.djamware.com/post/5be52ce280aca72b942e31bc/ionic-4-angular-7-and-cordova-tutorial-build-crud-mobile-apps ซึ่งเนื้อหาภายในเป็นการสร้างแอพพลิเคชันที่แสดงข้อมูลสินค้าได้แก่ ชื่อสินค้า ราคา และ คำอธิบาย โดยสามารถทำการ เพิ่ม ลบ เรียกดู และ แก้ไขข้อมูลได้ โดยแบ่งการสร้างเป็น 9 part ดังนี้

1: Create a New Application

เริ่มสร้างโปรเจคด้วยคำสั่ง ionic start ionic4-angular7-crud ใน command line จะได้โฟลเดอร์ของโปรเจค


2: Install Material and CDK

ติดตั้งสิ่งที่จำเป็นในการใช้งานลงไปในโปรเจค โดย

- พิมพ์คำสั่งใน command line
ng add @angular/material

- import Module ใน app.module.ts
import {
  MatInputModule,
  MatPaginatorModule,
  MatProgressSpinnerModule,
  MatSortModule,
  MatTableModule,
  MatIconModule,
  MatButtonModule,
  MatCardModule,
  MatFormFieldModule } from "@angular/material";
import { DragDropModule } from '@angular/cdk/drag-drop';
import { ScrollingModule } from '@angular/cdk/scrolling';

- register all module in @ngModule
imports: [
  BrowserModule,
  IonicModule.forRoot(),
  AppRoutingModule,
  BrowserAnimationsModule,
  DragDropModule,
  ScrollingModule,
  MatInputModule,
  MatPaginatorModule,
  MatProgressSpinnerModule,
  MatSortModule,
  MatTableModule,
  MatIconModule,
  MatButtonModule,
  MatCardModule,
  MatFormFieldModule
],

3: Create RESTful API Service

REST ย่อมาจาก Representational State Transfer เป็นรูปแบบหนึ่งในการออกแบบ open web technology เป็นการทำให้ข้อมูลอยู่ในรูปแบบของ resource ส่วนการกระทำต่าง ๆ เป็นไปตาม HTTP  Method (GET, POST, PUT, DELETE) และทำงานแบบ Stateless ทำให้สามารถสามารถพัฒนาได้ง่ายเนื่องจากอยู่บนมาตรฐาน HTTP และมีประสิทธิภาพในการทำงานที่ดี

- import module
- สร้าง class Product
- generate service ด้วยคำสั่ง ng g service api ใน command line
- กำหนด constant ใน src/app/api.service.ts

const httpOptions = {
  headers: new HttpHeaders({'Content-Type': 'application/json'})
};
const apiUrl = "/api/v1/products";

- สร้างฟังก์ชันในการทำงาน 4 ฟังก์ชัน ได้แก่ การเพิ่มสินค้า การลบสินค้า การเรียกข้อมูลมาแสดง และ การอัพเดทค่าเมื่อมีการแก้ไข โดยใช้ id เป็นตัวกำหนด

4: Modify Tabs Page

- สร้าง tab Details ด้วยคำสั่ง ionic g page details
- แก้ไขหน้า tab1 tab2 tab3 เดิมที่มีอยู่เป็น Home Edit Add และแก้ไข code ภายในให้เรียบร้อย
- import หน้าต่างๆมาที่ tabs และกำหนด router ในการ route ไปยังหน้าการใช้งานต่างๆ โดยกำหนดให้หน้าแรกเป็นหน้า Home
const routes: Routes = [
  {
    path: 'tabs',
    component: TabsPage,
    children: [
      {
        path: 'home',
        children: [
            {
              path: '',
              loadChildren: '../home/home.module#HomePageModule'
            }
          ]
      },
      {
        path: 'add',
        children: [
          {
            path: '',
            loadChildren: '../add/add.module#AddPageModule'
          }
        ]
      },
      {
        path: ':id',
        children: [
          {
            path: '',
            loadChildren: '../edit/edit.module#EditPageModule'
          }
        ]
      },
      {
        path: ':id',
        children: [
          {
            path: '',
            loadChildren: '../details/details.module#DetailsPageModule'
          }
        ]       
      }
    ]
  },
  {
    path: '',
    redirectTo: '/tabs/home',
    pathMatch: 'full'
  }
];

- สร้าง html สำหรับแสดงผลหน้าหลัก

Touch Typing [update]

ทดสอบผ่านเว็บไซต์ https://10fastfingers.com/typing-test/english


วันอังคารที่ 19 มีนาคม พ.ศ. 2562

Angular

Angular
คือ เฟรมเวิร์ค (framework) ที่พัฒนาโดย Google สำหรับสร้างแอพลิเคชั่นในฝั่ง Client ในรูปแบบ Single Page Applications ก็คือแอพพลิเคชันถูกโหลดมารวมในหน้าเดียว โดยติดตั้ง npm คือ
Node Package Manager เป็นการจัดการ Package ต่างๆ ที่ถูกติดตั้งบนแอพพลิเคชันที่ถูกติดตั้งมาพร้อมกับ Node.js โดยมีการใช้งานผ่านไฟล์หลัก 3 ไฟล์ คือ :
app.component.ts เป็นการ code ส่วนของ logic โดยเขียนในรูปแบบ TypeScript.
app.component.html เป็นการกำหนด template โดยเขียนในรูปแบบ HTML.
app.component.css เป็นการกำหนด CSS styles

คำสั่งหลัก
ng new my-app      สร้างแอพใหม่ชื่อ my-app
ng serve แสดง link http://localhost:4200/ ให้นำไปใช้งาน
ng serve --open                               เปิด browser http://localhost:4200/ โดยอัตโนมัติ
ng generate component heroes สร้าง component ใหม่ชื่อ heroes

วันจันทร์ที่ 18 มีนาคม พ.ศ. 2562

Test ครั้งที่ 2

ทดสอบการเปิดเว็บไซต์
ดู Header ว่าตรงหรือไม่
ทดสอบการเพิ่มคำถามเข้าไป

https://github.com/Freezzes/testtwo

วันจันทร์ที่ 11 มีนาคม พ.ศ. 2562

วันอาทิตย์ที่ 10 มีนาคม พ.ศ. 2562

[TDD] อธิบาย Commit (ต่อ)

Commit ที่ 9

caa1dd6
Model for list Items and associated migration

เริ่มนำ models เข้ามาใช้งาน และทดสอบการบันทึก object ใหม่ลงใน model โดยเมื่อเรายังไม่ได้ทำการสร้างตัว model เมื่อเราทำการ test จะหา model ไม่พบ และเมื่อเราสร้าง model แล้วก็ต้องทำการ migrate model ด้วย เพื่อบอกให้ฐานข้อมูลรับทราบว่ามีการเปลี่ยนแปลง model และเมื่อมีการเปลี่ยนแปลงข้อมูลใน model จะต้องทำการตั้ง default และ makemigrations ใหม่ทุกครั้ง


Commit ที่ 10

f894a48
Redirect after POST, and show all items in template

บันทึกข้อความที่ใส่ลงในช่อง input เข้าฐานข้อมูลโดยเริ่มจากการ test ว่ามีการบันทึกข้อมูลหรือไม่โดยการรับคำที่ใส่ลงใน input มาเก็บในตัวแปร และ save ลงในฐานข้อมูล(เมื่อเปิดขึ้นมาจะเกิด error เนื่องจากยังไม่มี input) หลังจากนั้นเพิ่มฟังก์ชันให้บันทึกลงในฐานข้อมูลโดยการกำหนด test ให้เป็นข้อความหนึ่ง เมื่อมีการรัน test ข้อความนั้นจะไปปรากฏในส่วนของช่อง input และถูกส่งมาบันทึกลงบนฐานข้อมูลด้วย method POST และแสดงผลบนเว็บไซต์ด้วยการ return redirect มาที่หน้าเดิม และให้แสดงผลครั้งที่รันกับข้อความที่แสดงแต่ละครั้งที่รัน



Commit ที่ 11

eb983d5 
make functional_tests an app, use LiveServerTestCase

แก้ไขฟังก์ชัน functional test โดยไม่ใช้ setUp และ tearDown โดยการเปลี่ยนไปใช้ class LiveServerTestCase ซึ่งเป็นความสามารถของ Django โดยเมื่อเรารัน test ใหม่ข้อมูลเดิมที่ได้รันและบันทึกไว้ก็จะหายไปและเป็นการเริ่มใหม่เสมอ และจะสังเกตุเห็นได้ว่า url เปลี่ยนไป จาก 8000 เป็น 62582 ซึ่งเป็น url จาก LiveServerTestCase



Commit ที่ 12

0d4e613 
try to get url

เปลี่ยน time.sleeps เป็น ฟังก์ชัน wait_for_row_in_list_table และกำหนดเวลาในการรอ test ให้มีขอบข่ายที่ชัดเจน 
เพิ่ม url สำหรับการทำงานเฉพาะอย่าง ใช้ assertRegex สำหรับตรวจสอบ regular expression แล้วจึงเพิ่มการ test เพื่อดู url

[TDD] อธิบาย Commit (ต่อ)

Commit ที่ 5

28ed91e
Functional test now checks we can input a to-do item

เพิ่มความสนใจการ test ไปที่ส่วน header ด้วย ทำให้เกิด error เนื่องจากไม่มีการกำหนด header ไว้

Commit ที่ 6

6dc0830
Refactor home page view to use a template

สร้างเทมเพลตมาใช้งาน และ ทดลอง test การเรียกใช้งานเทมเพลตในตอนแรกจะมีการ error เนื่องจากยังไม่มีการ install apps และเมื่อ installs app แล้วก็จะใช้งานได้

Commit ที่ 7

c540754
Front page HTML now generated from a template

เพิ่มในส่วนของ header ลงไปในเทมเพลต ทำให้เทมเพลตสามารถเรียกใช้งานได้แล้วไม่เกิด error เมื่อ test ที่ส่วน header


Commit ที่ 8

1940dd3
change functional test and home.html

ใช้งาน method POST ในเทมเพลต โดยการใส่ลงใน form และทำการเพิ่ม time.sleep จาก 1 เป็น 10 (time.sleep เป็นการกำหนดค่าเวลาที่จะทำการหยุดการทดสอบชั่วคราวและแสดงผลหน้าต่างเว็บไซต์ที่ได้) ซึ่งเมื่อมีการใช้ method POST ทำให้หน้าเว็บแสดงค่า error เนื่องจากไม่มีการใส่ tag CSRF

หลังจากนั้นมีการกำหนดค่า functional test สนใจไปที่การใส่ input และ การเรียกข้อความออกมาแสดงผล โดยการกำหนดให้รับข้อความจากช่อง input มาแสดงในส่วนของ table โดยการเรียกมาใช้แบบ dict.get โดยเมื่อทำการใส่ข้อความลงไปในช่อง input และกด enter ข้อความที่ใส่จะไปปรากฏทางด้านล่างในส่วนที่เรียกผลลัพธ์ออกมาแสดง

ใส่ตัวอักษร y ลงในช่อง input


แสดงผลเป็นตัวอักษร y ที่ด้านล่าง