รีแอ็คส์เนทิฟ (React Native)
Node.js | React | Reactnative | JavaScript | Java | LPMuseum | Login-main | props + state | JSLibrary
รีแอ็คส์เนทิฟ (React Native)
React คือ JavaScript Library ถูกสร้างโดย Facebook มีแนวความคิด View แบบ MVC (Model View Controller) เหมาะกับการพัฒนาเว็บไซต์ฝั่ง Front-end
React Native คือ เครื่องมือพัฒนา Mobile Application ที่เป็น Cross Platform Technology สามารถทำงานได้ทั้ง iOS และ Android โดยใช้ JavaScript ในการพัฒนา
Expo คือ เครื่องมือช่วย build app ที่เขียนด้วย React native เพื่อนำ app ขึ้นบน iOS หรือ Android โดยไม่ต้องลง Android Studio หรือ Xcode สามารถส่งแอพขึ้น expo.io ด้วยคำสั่ง expo build:android หรือ build:ios ในบัญชีที่เคยสมัครไว้ และกำหนดค่าของแอพในแฟ้ม app.json
React Native คือ การใช้ภาษา Javascript เป็นหลัก สำหรับสร้าง Mobile Application ทั้งบน iOS และ Android เป็น Cross Platform Technology ถูกสร้างโดยทีมงาน Facebook เป็น Open Source ที่มีนักพัฒนาสามารถสร้าง Library แล้วนำไปเผยแพร่ให้ใช้จำนวนมาก โดยไม่มีค่าใช้จ่าย ส่วน React หรือ ReactJS คือ แหล่งห้องสมุดจาวาคลิ๊ป (Javascript Library) สำหรับสร้างส่วนติดต่อกับผู้ใช้ (User interfaces) คล้ายกับ React Native ต่างกันที่วิธีการเขียน Component และ Execution
ารเรียกใช้ React หรือ ReactJS Component มีหลายวิธี อาทิ Simple Component, Stateful Component, Application และ Component Using External Plugins ซึ่งการเขียน React มี 2 แบบ คือ แบบใช้ JSX และ แบบไม่ใช้ JSX แล้วยังเขียน React ได้อย่างน้อย 3 วิธี คือ 1) ติดตั้งผ่าน CDN 2) ดาวน์โหลดไฟล์ JS และ 3) ติดตั้งผ่าน NPM (Node Package Manager)

Node หรือ Node.js คือ โปรแกรมสำหรับสั่งให้โปรแกรมภาษา Javascript ที่เขียนขึ้นทำงาน เช่น C:\> node hello.js ส่วน NPM (Node Package Manager for Node.js packages) คือ โปรแกรมจัดการ Node ซึ่งมี Package ให้จัดการเรียกใช้ได้จำนวนมาก เช่น C:\> npm i react และ npm i react-dom และ npm list สำหรับจัดการ React Library เพื่อเรียกใช้งาน ส่วน NPX นั้นมาพร้อมกับ npm 5.2 ขึ้นไป ใช้ npx -h พบว่าโปรแกรมนี้คือ Execute binaries from npm packages. เช่น npx create-react-app hello (ระหว่างติดตั้งจะมีการติดตั้ง react, react-dom, and react-scripts เพิ่มด้วย) แล้ว cd hello แล้ว npm start และเปิด http://localhost:3000 ซึ่งทั้ง NPM และ NPX มาพร้อมการติดตั้ง Node.JS

ตรวจรุ่นของเครื่องมือพัฒนาโปรแกรม
C:\> node -v (v10.15.3)
C:\> npm -v (6.4.1)
C:\> npx -v (6.4.1)
C:\> yarn -v (1.22.4)
Yarn คือ Dependency management tool หรือ package manager สำหรับ JavaScript จากทีมพัฒนาของ facebook ทำงานได้เร็ว และง่ายกว่า สามารถแชร์ package / module ได้ คล้ายกับ NPM แต่ปกติ node_modules จะแยกในแต่ละ folder แต่ Yarn workspaces จะแชร์ node_modules
เฟรมเวิร์ค และแพลตฟอร์ม ฟรมเวิร์ค (Framework) คือ ชุดคำสั่ง เครื่องมือ โครงสร้าง ต้นแบบพื้นฐาน ที่ถูกสร้างมารองรับการทำงาน เพื่ออำนวยความสะดวกแก่ผู้ใช้งาน แทนที่จะสร้างเองก็มีเครื่องมือที่พร้อมใช้ ช่วยให้พัฒนาระบบได้เร็ว และง่ายขึ้น แต่ขนาดโปรแกรมจะมีขนาดใหญ่ ต้องศึกษาฟังก์ชัน และใช้คุณสมบัติได้เท่าที่มี อาทิ Laravel เป็น Web application framework ส่วน Angular และ React Native เป็น Framework แบบ Cross Platform Technology
พลตฟอร์ม (Platform) คือ การทํางานร่วมกันของฮาร์ดแวร์ หรือซอฟต์แวร์ อาจเป็นระบบปฏิบัติการ สถาปัตยกรรมคอมพิวเตอร์ เช่น ไมโครซอฟท์วินโดวส์ แมคโอเอสเอ็กซ์ หรือแอนดรอย ครอสแพลตฟอร์ม (Cross Platform) คือ การรองรับให้โปรแกรมคอมพิวเตอร์ ภาษาโปรแกรม ระบบปฏิบัติการ หรือ ซอฟต์แวร์ สามารถทำงานได้บนหลายแพลตฟอร์ม เช่น บนไมโครซอฟท์วินโดวส์ บนแมคโอเอสเอ็กซ์ บนลีนุกซ์ บนแอนดรอย และบนเพาเวอร์พีซี
Top 20 Front-end ได้แก่ 1) React Native 2) Framework7 3) Flutter 4) NativeScript 5) Meteor 6) JQuery 7) CocoaTouch 8) Xamarin 9) Swiftic 10) Ionic 11) Sencha Ext JS 12) Apache Cordova 13) Onsen UI 14) Corona SDK 15) Monaca 16) Mobile Angular UI 17) Appcelerator Titanium 18) Uno 19) Ktor 20) Aurelia Top 10 Web Frameworks ได้แก่ 1) Ruby on Rails (Ruby) 2) Laravel (PHP) 3) Django (Python) 4) ASP.NET (C#) 5) Express (JavaScript) 6) Spring (Java) 7) Angular (JavaScript) 8) Ember (JavaScript) 9) Meteor (JavaScript) 10) Vue (JavaScript)
Node.js
ชุดโปรแกรมสำหรับสั่งให้โปรแกรมจาวาสคริปต์ที่เขียนขึ้นทำงานได้ ส่วน NPM คือ ตัวจัดการ Node Package
React
JS Library ถูกสร้างโดย Facebook มีแนวความคิด View แบบ MVC เหมาะกับพัฒนาเว็บไซต์ฝั่ง Front-end
React Native
JS Framework สำหรับพัฒนา Mobile App แบบ Cross-platform ที่เขียนครั้งเดียว ใช้ได้ทั้งบน Android และ iOS
Laravel
เฟรมเวิร์คภาษาพีเอชพี ในแบบ MVC ช่วยพัฒนาระบบได้อย่างรวดเร็ว แทนการพัฒนาตามหลักโปรแกรมโครงสร้าง
Javascript
คล้ายภาษาซี ใช้ร่วมกับเอชทีเอ็มแอลในการพัฒนาเว็บเพจ ประมวลผลบนบราวเซอร์ นำเสนอข้อมูลแบบโต้ตอบ
Java
พัฒนาโดย Sun ขายให้ Oracle ใช้เขียนโปรแกรมเชิงวัตถุประกอบด้วย Method มี State, Identity, Behavior
Bootstrap
ฟอนท์เอ็นเฟรมเวิร์คที่รวมเอาแฟ้มจาวาสคริปต์และซีเอสเอสที่ประมวลมาแล้วว่าดี เรียกใช้ง่าย จึงพัฒนาได้เร็ว
CSS
สไตล์ชีต ภาษากำหนดรูปแบบในเอชทีเอ็มแอล กำหนดเลย์เอาท์ สีอักษร สีพื้น ตัวอักษร การจัดวาง เส้นขอบ
PDF.JS
ชุดโปรแกรมเพื่อแสดงแฟ้มข้อมูลแบบ PDF บนเว็บบราวเซอร์สำหรับทุกอุปกรณ์ จึงไม่จำเป็นต้องมีแอพอื่น
Expo
เครื่องมือช่วย build app ที่เขียนด้วย React native เป็นแพลตฟอร์ม Cross เพื่อนำแอปขึ้นบน Mobile
Bluestacks
โปรแกรมจำลองเครื่องจักรเสมือนที่เป็นระบบแอนดรอยด์ ใช้ได้ทั้งบน windows + MacOS นิยมใช้เล่นเกม
นิยามศัพท์ Core UI Components คือ คอมโพแนนท์หลักที่ใช้สร้างปฏิสัมพันธ์กับผู้ใช้ เช่น View, Text, Image, Scrollview, TextInput
Webview คือ คอมโพแนนท์ที่สามารถนำข้อมูลจากเว็บไซต์ภายนอกเข้าไปแสดงในแอปพลิเคชัน หรือใช้คำสั่งภาษาเอชทีเอ็มแอลเพื่อสั่งแสดงผลได้
Gradle คือ เครื่องมือที่ใช้ในการสร้าง (build) และจัดการโครงการ (project managment) สำหรับโครงการที่พัฒนาด้วยภาษา Java, Kotlin, Scala และภาษาอื่นที่ใช้ Java Virtual Machine โดย Gradle ช่วยจัดการไลบรารี่ที่ต้องใช้งาน (libraries dependency) และกำหนดวิธีการสร้างโครงการ (project creating)
Gradlew คือ คล้ายเสื้อคลุม (wrapper) ครอบ Gradle เพื่อช่วยในการจัดการรุ่น ทำให้เรียกใช้ Gradle ได้ถูกรุ่น โดยไม่ต้องจัดการรุ่นด้วยตนเอง
Diamon with question mark คือ สัญลักษณ์ที่ถูกแทนที่ เมื่อตัวอักษรไม่เป็นที่ยอมรับในเอกสารหรือเว็บเพจ มักพบเมื่อมีการใช้ character set ผิดพลาด
Metro คือ ชุดรวม JavaScript ที่ช่วยเลือกไฟล์มาใช้ ถูกใช้เมื่อมีการประมวลผลโปรเจ็กต์เนทีฟแบบโต้ตอบ ที่มีการรวบรวมแฟ้มจาวาสคริปต์จำนวนมากมัดรวมเป็นแฟ้มเดียว ซึ่งการคอมไพล์ (compile) ทำโดยบันเดิลเลอร์ (bundler) เพื่อรวบมัดแฟ้มทั้งหมดเป็นก้อนเดียวกัน
การติดตั้งหรืออัพเดทรุ่นของ node.js

API: ธ.แห่งประเทศไทย
ารติดตั้ง node.js เพื่อใช้คำสั่ง npm (Node Package Manager) เริ่มจากดาวน์โหลด node-v...-x64.msi สำหรับ windows จาก https://nodejs.org/en/ พบโปรแกรมใน C:\Program Files\nodejs\ หลังติดตั้งตรวจสอบรุ่นด้วย C:\> npm -v (16.7.0)
มื่อเวลาผ่านไป พบว่า node.js ได้รับการพัฒนาจนมีรุ่นใหม่ และรุ่นเก่าใช้ติดตั้ง package ใหม่ไม่ได้ จึงต้องติดตั้งโปรแกรม nvm โดยดาวน์โหลด nvm-setup.exe สำหรับ windows มาใช้งาน เพื่อใช้จัดการรุ่นของ node.js ทำให้เราสามารถติดตั้ง node.js ได้หลายรุ่น และเลือกใช้รุ่นที่ต้องการได้ เช่น C:\> nvm use 16.7.0 เป็นต้น ดังนั้นหลังติดตั้ง node.js แล้วจะได้ node , npm และ npx ไว้ใช้งาน แต่ยังไม่มี nvm จึงต้องติดตั้งเพิ่ม เพราะเมื่อเวลาผ่านไป ก็จะต้องติดตั้ง node.js รุ่นใหม่ แม้ node.js รุ่นเก่าจะเป็น LTS (Long Term Support) version แต่มี package เสริมจำนวนมากที่ถูกพัฒนาเพิ่ม และแจ้งว่าไม่เข้ากันกับ package รุ่นเก่า ที่เป็น deprecated ไปแล้ว และไม่สนับสนุน package เหล่านั้นอีกต่อไป และ nvm นี้เองที่ช่วยสลับรุ่นของ node.js ทำให้สามารถนำ project เก่ามาแก้ไข โดยไม่ต้องปรับแก้ code ตามการพัฒนาของ node.js ในแต่ละรุ่น
ตรวจรุ่น https://nodejs.org/download/release/latest/
ตรวจรุ่น https://github.com/coreybutler/nvm-windows/releases
nvm-setup.zip (สั่ง nvm-setup.exe ได้ C:\Users\ACER\AppData\Roaming\nvm)
nvm -v (1.1.7)
npm cache verify (ตรวจสอบ cache)
npm cache clean -f (ถ้าติดตั้ง/สั่งงานไม่สำเร็จ ข้อมูลอาจค้าง ถ้าเจอปัญหาลองไปล้าง cache)
nvm list available (แสดง version ทั้งหมดที่ติดตั้งได้)
nvm install 16.7.0 (ติดตั้ง node.js รุ่นที่กำหนด)
node -v (เก่า v10.15.3)
npm -version (เก่า 6.4.1) 
nvm list (แสดง version ที่ถูกติดตั้งไว้แล้ว)
nvm use 16.7.0
node -v (v16.7.0)
npm -version (7.20.3)
React native : npx react-native run-android
เริ่มต้นกับ Android studio 2020.3.1.23-windows (23 ส.ค.64)
1. Download Android studio  และ install ง่าย ๆ ไม่ถามมาก
2. เปิดโปรแกรม ถ้าถามนำเข้า old config เลือก "Do not import settings" เพราะเคยลงรุ่นเก่านานแล้ว
3. Welcome, Standard, Select UI Theme : Darcula จากนั้นก็ Download Components ต่ออีกไม่นานเกินรอ
4. Welcome to Android studio, New Project, No Activity, "My Application", Finish
5. Menu bar, Tools, SDK Manager, Android SDK Location=C:\Users\LAB\AppData\Local\Android\Sdk
พบ Android 9.0 (Pie) : Installed
พบ Intel x86 Emulator Accelerator (HAXM installer) : Installed
6. Menu bar, Tools, ADV Manager
พบทั้ง Nexus 5X API 24 และ  Nexus 5X API 26 พร้อมทำงาน
เมื่อกด Launch this AVD in the emulator พบ emulator 
React native : npx react-native run-android
E:\> npm -v
npm notice New minor version of npm available! 7.15.1 -> 7.21.0
npm notice Run npm install -g npm@7.21.0 to update!
7.16.0
E:\> npm install -g npm@7.21.0
E:\> npm install -g react-native-cli
E:\> node -v
v16.3.0
E:\> java -version (ถ้าไม่พบอาจเป็นเพราะไม่กำหนด path)
java 10.0.2 2018-07-17
E:\> set
E:\> set | findstr java
พบ path มี C:\Program Files\Java\jdk-10.0.2\bin
E:\> echo %JAVA_HOME%
C:\Program Files\Java\jdk-10.0.2
E:\> py -V
Python 3.8.1
E:\>yarn -v
1.22.4
E:\> react-native -v
react-native-cli: 2.0.1
E:\> dir "C:\Program Files\Android\Android Studio\bin\studio64.exe"
E:\> "C:\Program Files\Android\Android Studio\bin\studio64.exe"
Android Studio 3.3.2
Menu bar, Tools, SDK Manager
พบ Android 9.0 (Pie) มี API Level 28 : Installed แล้ว
และพบช่อง Android SDK Location : C:\Users\LAB\AppData\Local\Android\Sdk
เข้า System Properties อีกรอบหนึ่ง
E:\> sysdm.cpl (เข้า System Properties)
เลือก Advanced , Environment Variables...
JAVA_HOME = C:\Program Files\Java\jdk-10.0.2
ANDROID_SDK_ROOT = C:\Users\LAB\AppData\Local\Android\Sdk
ANDROID_HOME = C:\Users\LAB\AppData\Local\Android\Sdk
ต้องออก DOS แล้วเข้าใหม่ 
ใช้ set ตรวจสอบการตั้ง ANDROID_HOME ได้
E:\reactnative> react-native init myproject หรือ react-native init mypro1 (การเริ่มต้นต้องนานหน่อย)
หลังติดตั้งด้วย init พบคำแนะนำ cd "E:\reactnative\myproject" && npx react-native run-android
เปิด Android Studio แล้วสร้าง Create Virtual Device ให้เรียบร้อย
เปิด Android Studio เข้า AVD Manager พบ Nexus 5X API24 ใช้ Android 7.0 แล้ว Launch this AVD in the emulator
E:\reactnative> cd myproject (มี 3443 Folders, 21110 Files, 221 MB)
E:\reactnative\myproject> npx react-native run-android (แสดงผลบน emulator ทันที)
- รอจนหน้าต่าง Downloading https://services.gradle.org/distributions/gradle-6.9-all.zip ครบ 100% 
- แล้วพบ Welcome to Gradle 6.9! แล้วรอติดตั้งต่อไป Preparing "Install Android SDK Platform 30 (revision: 3)
- เครื่องของผมก็ประมาณ 10 นาที จากนั้นควรเห็นผลงานบน AVD in the emulator แล้ว
- เมื่อเปิด project อื่นบน emulator พบว่า app ได้ถูกติดตั้งบน emulator อีก 1 app เรียบร้อยแล้ว
สรุปพบว่า App ทำงานบน Emulator ได้ปกติ
เพิ่มคำว่า สวัสดี ใน app.js
แล้วเข้าไปที่หน้า Node start ที่เปิดอยู่
กด R = Reload ตามคำแนะนำ To reload the app press "r"
พบว่าผลการแก้ไข app.js มีการ Refreshing อัตโนมัติไปปรากฎที่ Emulator ทันที
เมื่อแก้ไขโดยเพิ่ม custom font ก็พบว่าแสดงผลได้ปกติ
ซึ่งผลงานขณะนี้อยู่ใน E:\myproject\android\app\build\outputs\apk\debug\app-debug.apk - 42 MB
หากต้องการนำไปใช้งานต้องสั่ง gradlew assembleRelease เพื่อให้ได้ app-release.apk
แต่ app-debug.apk เป็น app ที่กำลังแก้ไข จะคัดลอกไปติดตั้ง บน emulator ไม่ได้
ต้อง run ผ่าน npx react-native run-android ที่ทำให้แก้ไข app.js และมีผลแบบ immediately ได้
อ่านเรื่อง Create Virtual Device
appjs_customfonts.zip
appjs_newappscreen.htm
React native : สั่ง gradlew ให้ได้แฟ้ม .apk
C:\> react-native init myproject
C:\> cd myproject
อ่าน https://www.decoide.org/react-native/docs/signed-apk-android.html
C:\myproject> keytool -genkey -v -keystore my-release-key.keystore -alias my-key-alias -keyalg RSA -keysize 2048 -validity 10000
Is CN=burin, OU=rujjanapan, O=thaiall, L=lampang, ST=lampang, C=th correct?
C:\myproject> dir my-release-key.keystore
C:\myproject> move my-release-key.keystore android/app
C:\myproject> cd android
C:\myproject> gradlew assembleRelease
/* Build failed เพราะไม่พบ ANDROID_SDK_ROOT
   sysdm.cpl, advanced, enviroment variables, system variables
   set ANDROID_SDK_ROOT=C:\Users\burin\AppData\Local\Android\Sdk */
React native : SDK Location + Run APK
รา build app เพื่อให้ได้แฟ้ม .apk ที่พัฒนาขึ้นด้วย React native ร่วมกับ Android SDK ซึ่งสามารถส่งออกผลงานได้หลายวิธี เมื่อได้แฟ้ม .apk มาแล้ว นำไปใช้บนอุปกรณ์ หรือ emulator ได้อีกหลายวิธี ซึ่งวิธีหนึ่งที่น่าสนใจ คือ upload แฟ้ม .apk ขึ้นไปทำงานบน เว็บบราวเซอร์ (Run APK Online in Browser) ผ่านบริการของ appetize.io หรือ ApkOnline Chrome extension (ส่วน testobject.com และ Manymo.com ประกาศยุติแล้ว) ซึ่งตัวอย่างนี้ เลือกใช้บริการที่ appetize.io เมื่อสมัคร และกรอกอีเมล ระบบจะส่งลิงค์ register ไปให้ทางอีเมล หลังจากนั้นจะพบลิงค์เข้าแอพแบบ online ในอีเมล หัวข้อ "Your links are ready!" มีข้อความว่า Your app is ready to go at https://appetize.io/app/g7..ym หรือ sign in เข้า dashboard เลือก ชื่อโปรเจคของเรา (myproject) มีตัวเลือก view , embed , manage , .. หากเลือก view ก็จะเปิด emulator แบบ online มาให้ใช้งาน ถ้าต้องการใช้บริการมากกว่านี้ หรือมีข้อจำกัดที่ลดลง เลือกจ่ายค่าบริการได้ ซึ่งหน้าตาแอพบนเว็บไซต์ เหมือนที่พบบน emulator โดยเงื่อนไขให้บริการแบบ Trail มีระยะเวลาหนึ่งเดือน หรือจำกัดจำนวน มีรายละเอียดดังนี้ Current plan: Trial. Period usage: 0 sessions, 0 minutes from Aug 1, 2021 12:00:00 AM to Sep 1, 2021 12:00:00 AM UTC. You are limited to 1 concurrent user and 100 minutes of streaming per month.
Android Studio
Menu bar, Tools, SDK Manager, Android SDK Location: C:\Users\burin\AppData\Local\Android\Sdk
Menu bar, Tools, SDK Manager, Android SDK, SDK Platforms, Check : Android 9.0 (Pie) API Level 28
Menu bar, Tools, SDK Manager, Android SDK, SDK Tools,
Check : Intel x86 Emulator Accelerator (HAXM installer) - Installed
Bios : VT-x Virtualization must be enabled in Bios ( VT-x )
C:\> sysdm.cpl
ANDROID_SDK_ROOT=C:\Users\burin\AppData\Local\Android\Sdk
อ่านเพิ่ม https://developer.android.com/studio/run/emulator-commandline
dir C:\Users\burin\.android\avd พบ folder : Nexus_5X_API_24.avd
C:\Users\burin\AppData\Local\Android\Sdk\emulator> emulator @Nexus_5X_API_24
C:\> react-native init myproject
C:\myproject\android> gradlew assembleRelease
dir E:\myproject\android\app\build\outputs\apk\release\app-release.apk - 31 MB
dir E:\myproject\android\app\build\outputs\apk\debug\app-debug.apk - 44 MB
snack.expo.dev
Reactnative ได้รับความนิยมอย่างมาก สำหรับพัฒนาแอปพลิเคชันบนอุปกรณ์เคลื่อนที่ ผู้พัฒนาต้องเรียนรู้การใช้เครื่องมือต่าง ๆ และมีเครื่องมือให้ทดสอบคำสั่งแบบออนไลน์ที่ snack.expo.dev พร้อมตัวอย่างโค้ดเริ่มต้น และบทเรียนโดยละเอียด ที่ reactnative.dev ในตัวอย่าง App.js มีหน้าที่แสดงคำว่า Hello world ที่กลางจอภาพ ในโค้ดบรรทัดแรก เริ่มจากใช้คำสั่ง import เพื่อนำเข้า core component ทั้งจาก react และ react-native ได้ component คือ React, Text และ View และมีการสร้าง Component ชื่อ App ที่มีลักษณะเป็น Function ที่รวบรวมค่าที่เหมือนพิมพ์เขียว และจะคืนค่าไปแสดงผลตามหน้าที่ที่กำหนด ซึ่ง App จะ Render ออกไปผ่านการ return เป็น View และ Text สุดท้ายก็จะ export ส่ง App component ออกไป ซึ่งรูปแบบการเขียนจะเป็นรูปแบบ JSX = JavaScript Syntax eXtension
นโค้ดมี Props ที่มาจากคำว่า คุณสมบัติ (properties ที่คล้ายกับ arguments) คือ style จากตัวอย่างนี้ พบว่า View มี 1 props ส่วนความหมายของ flex:1 คือ คุณสมบัติความยืดหยุน ที่เปลี่ยนแปลงเนื้อหาตามการขยาย (grow) และหด (shink) ใช้ร่วมกับ justifyContent: "center" ให้ผลคล้ายกับ valign=middle ส่วน alignItems: "center" มีหน้าที่จัดตำแหน่งแนวนอน คล้ายกับ align=center สรุปว่าเป้าหมายของโค้ดคือ แสดงคำว่า Hello world
import React from 'react';
import { Text, View } from 'react-native';
const App = () => {
  return (
    <View style={{ flex: 1, justifyContent: "center", alignItems: "center" }}>
      <Text>Hello world</Text>
    </View>
  );
}
export default App;
reactnative.dev/docs/getting-started
reactnative.dev/docs/intro-react
Library = react-native-device-info พื่อนที่ทำงาน แนะนำว่า react native มี library น่าสนใจหลายตัว อ่านเรื่อง library ที่ชื่อ react-native-device-info ใน aboutreact.com และ github.com พบว่า สามารถนำข้อมูลของอุปกรณ์มาใช้งานได้ด้วย code เขียนคำสั่งเพียงไม่กี่บรรทัด แนะนำขั้นตอนเบื้องต้น 4 ขั้น คือ ติดตั้งสภาพแวดล้อมสำหรับรีแอ็คส์เนทิฟ ติดตั้งไลบรารี่ เขียนโค้ด และสั่ง run มีดังนี้
C:\> react-native init devinfo
C:\> cd devinfo
C:\devinfo> npm install --save react-native-device-info
หรือ yarn add react-native-device-info
C:\devinfo> **noteapd** App.js
C:\devinfo> npm run android 
C:\devinfo> cd android
C:\devinfo\android> gradlew assembleRelease
C:\devinfo\android> dir app\build\outputs\apk\release\app-release.apk
{/* App.js */}
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
import DeviceInfo from 'react-native-device-info';
import { getUniqueId, useManufacturer, } from 'react-native-device-info';
export default function App() {
  let uid = "burin";
  const { result } = useManufacturer();   
  return (
    <View style={styles.container}>
    <Text>
      {'hello world 1'}{'\n'}
      hello world 2{'\n'}
      {uid}{'\n'} {/* burin */}
      {getUniqueId()}{'\n'} {/* 137f8e9e8fe81fd5 */}
      {result}{'\n'} {/* Google */}
      {DeviceInfo.getSystemVersion()}{'\n'} {/* 7.0 */}
      {DeviceInfo.getBundleId()}{'\n'} {/* com.test */}
      {DeviceInfo.getSystemName()}{'\n'} {/* Android */}
      {DeviceInfo.getModel()}{'\n'} {/* Android SDK built for x86 */}
      {DeviceInfo.getVersion()}{'\n'} {/* 1.0 */}
      {DeviceInfo.getBuildNumber()}{'\n'} {/* 1 */}
    </Text>
    </View>
  );
}
const styles = StyleSheet.create({
  container: {
    flex: 1, backgroundColor: '#fff', alignItems: 'center', justifyContent: 'center',
  },
});
React native : font-family:chulabhornlikit
C:\> npm install -g npm
C:\> npm install -g react-native-cli
C:\> react-native init helloworld 
C:\> cd helloworld (200 MB)
C:\helloworld> react-native -v (react-native-cli: 2.0.1 react-native: 0.65.1)
C:\helloworld> **notepad** react-native.config.js
C:\helloworld> copy chulabhornlikittext-bold.ttf helloworld/assets (นำไปเข้าห้อง fonts ให้อัตโนมัติ หลังสั่ง link)
C:\helloworld> npx react-native link 
C:\helloworld> dir helloworld\android\app\src\main\assets\fonts
C:\helloworld> **notepad** App.js
- Text style={{ fontFamily: "chulabhornlikittext-bold",  fontSize: 40 }} : ใช้ได้ เพราะชื่อฟอนต์ตรงตามชื่อแฟ้ม
- Text style={{ fontFamily: "ChulabhornLikitText-Bold",  fontSize: 40 }} : ต้องเป็นแบบ case sensitive
C:\helloworld> npm run android หรือ npx react-native run-android 
-รอ Configuring และ Executing ได้แฟ้ม .apk และ ใช้ Android emulator และทำงานใน Metro windows
- ถ้าผลลัพธ์เป็น "รูปสี่เหลี่ยมคำถาม" ให้เปลี่ยน encoding ของแฟ้มจาก thai เป็น utf-8
 
ารใช้ฟอนต์ของเราเอง (custom font) เริ่มต้นด้วยการเข้าไปอยู่ใน project แล้วตรวจสอบรุ่นด้วย react-native -v ถ้าพบรุ่นไม่ต่ำกว่า 0.6 ก็จะตั้งค่าแบบใหม่ module.exports={..} ถ้าต่ำกว่าต้องตั้งค่าแบบเก่า "rnpm":{..} ขั้นตอนแรก เริ่มด้วยการสร้างห้อง helloworld / assets / fonts แล้วคัดลอกแฟ้ม xxx.ttf ไปวางในห้อง fonts ขั้นตอนที่สอง สร้างแฟ้ม react-native.config.js มีโค้ดว่า module.exports = { project: { ios: {}, android: {}, }, assets: ["./assets/fonts/"], }; หรือ "rnpm": { "assets": ["./assets/fonts/"] } ขั้นตอนที่สาม สั่ง npx react-native link จะพบรายงานการลิงค์ว่า success Assets have been successfully linked to your project ขั้นตอนที่สี่ เมื่อเตรียมฟอนต์เสร็จแล้ว ก็ใช้งานฟอนต์โดยเปิด homepage มาแก้ไขด้วย **notepad** App.js แล้วเพิ่ม fontFamily: "Kanit-Bold", เช่น
<Text style={{ fontFamily: 'ChulabhornLikitText-Bold', fontSize: 40 }}>ตามชื่อแฟ้มฟอนต์</Text> หรือ
<Text style={{ fontFamily: 'TH Mali Grade 6', fontSize: 40 }}>สวัสดีชาวโลก</Text>
หากใช้ run บน emulator เมื่อแก้ไข App.js แล้วบันทึก จะพบผลการเปลี่ยนแปลงบน emulator
การสร้างแฟ้ม .apk ด้วย gradlew
C:\helloworld> npm run android (เป็นการสั่ง compile แล้วส่ง .apk ไปทดสอบบน emulator)
C:\helloworld\android> gradlew assembleRelease (รอนาน เพราะสร้างแฟ้ม apk ผ่าน android studio)
dir E:\helloworld\android\app\build\outputs\apk\release\app-release.apk (31 MB นำแฟ้มไปวางใน emulator ได้)
C:\Users\[***]\AppData\Local\Android\Sdk\emulator> emulator @Nexus_5X_API_24 (การสั่งเปิด emulator)
คำว่า work for me
มักถูกใช้ใน stackoverflow กรณีที่ความคิดเห็นใด นำไปใช้แล้วได้ผล
use-custom-font : 41 K
how-to-add-custom-font : 46 K
fonts-to-create-react-app : 248 K
appjs_customfonts.zip
แฟ้มตัวอย่าง Project
github.com/varun-raj
myflatlist_App.js.txt
myflatlist_Data.js.txt
touchable_click_App.js.txt
color_router_flux.zip
tutorialpoint_router_flux.zip
nativestack_App.js.zip
stack.navigator.zip
images_App.js.htm
lpmuseum_2564_App.js.htm
React native : expo
สร้างบัญชีใน expo.io ใช้อีเมลของ hotmail.com หรือ gmail.com ได้
https://medium.com/@sirawit/สร้าง-Cross-Platform-Mobile-App-อย่างง่าย-ๆ-ด้วย-Create-React-Native-App-fd5cf81d9aa8
ขั้นตอนการใช้งาน มีดังนี้
1. ติดตั้ง node.js เพื่อใช้คำสั่ง npm (Node Package Manager) - https://nodejs.org/en/
ได้รุ่น node-v11.12.0-x64.msi ขนาด 16.6 MB ลงใน C:\Program Files\nodejs\
C:\> npm -v (6.4.1)
2. เข้า CMD (ไม่ใช่ administrator)
C:\> npm install -g create-react-native-app
เพื่อติดตั้งชุดโปรแกรมสำหรับสร้าง mobile app บน expo (exponent = ตัวแทน หรือผู้อธิบาย)
ที่เป็น app แบบ cross platform หรือ multi-platform software
3. C:\> create-react-native-app myapp1
C:\Users\burin> create-react-native-app myapp1
'expo-cli' is not recognized as an internal or external command,
operable program or batch file.
This command requires Expo CLI.
Do you want to install it globally [Y/n]? y
Installing the package 'expo-cli'...
4. เลือก blank
? Choose a template:
----- Managed workflow -----
> blank         minimal dependencies to run and an empty root component
tabs          several example screens and tabs using react-navigation
----- Bare workflow -----
bare-minimum  minimal setup for using unimodules
5. รอกรอก name จึงใส่ "my first app"
{
	"expo": {
		"name": "myfirstapp",
		"slug": "myapp1"
	}
}
npm WARN deprecated core-js@1.2.7: core-js@ 2.6.5 is no longer maintained. 
Please, upgrade to core-js@3 or at least to actual version of core-js@2.
npm ERR! code ENOGIT
npm ERR! Error while executing:
npm ERR! No git binary found
https://git-scm.com/download/win
https://github.com/git-for-windows/git/releases/download/v2.21.0.windows.1/Git-2.21.0-64-bit.exe
6. ลง git แล้วสร้าง project ใหม่
ผ่าน DOS ไม่พบปัญหาการเรียกหา git อีก
C:\> cd myapp1
C:\myapp1> npm start
จากนั้นก็จะสั่งเปิด browser อัตโนมัติ
มี qr code ให้เรียกไปยัง exp://172.50.1.176:19000
ถ้าในเครื่องสามารถเชื่อมได้หลายวง
ต้องเปิดปิด lan card ให้ตรงกับวงของ smart phone
ที่ลง app expo ไว้
แก้ไข javascript ใน app.js เปลี่ยนสี background ได้โดยง่าย
7. C:\myapp1> notepad app.json (https://kobiton.com/topics/develop-deploy-and-test-react-native-apps-with-expo/)
{
	"expo": {
    "name": "myfirstapp",
    "slug": "myapp1",
    "privacy": "public",
    "sdkVersion": "32.0.0",
    "platforms": ["android"],
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/icon.png",
    "splash": {
		"image": "./assets/splash.png",
		"resizeMode": "contain",
		"backgroundColor": "#ffffff"
    },
    "updates": {"fallbackToCacheTimeout": 0},
    "assetBundlePatterns": ["**/*"],
    "android": {
		"package": "com.thaiall.myapp1"
    }
  }
}
C:\myapp1> expo build:android หรือ expo build:ios
> Would you like to proceed? ... yes
> Log in with an existing Expo account
> apk
> Generate new keystore
wait ...
เลือก [1]
ภาพ icon.png ต้อง square [192 * 192]
และเปลี่ยนภาพ splash.png แล้ว [381*748] / [1242 * 2436]
8. ผลงานแชร์ที่
https://exp.host/@thaiall/myapp1
APK download : https://expo.io/artifacts/000877b6-ecbc-4657-a9bb-4e315c52e770
https://expo.io/appetize-simulator?url=https://expo.io/@thaiall/myapp1
9. C:\myapp1> notepad app.js
พบว่าใช้ br ใน text ไม่ได้ ต้องใช้ {"\n"}
React native : expo - AdminLTE 3.0.4 - ต.ค.2563
C:\> explorer https://nodejs.org/en/ 
C:\> node -v (10.15.3)
C:\> npm -v (6.4.1)
C:\> npm install -g expo-cli 
C:\> expo -V (3.28.0)
C:\> expo whoami
› Not logged in, run expo login to authenticate
C:\> expo login
? Username/Email Address: hello@hotmail.com
? Password: [hidden]
Success. You are now logged in as hello.
C:\> expo whoami
Logged in as hello
C:\> npm install -g create-react-native-app (3.5.1)
C:\> explorer https://classic.yarnpkg.com/en/docs/install/#windows-stable (1.22.5)
C:\> npm install -g yarn
C:\> yarn -V (1.22.5)
C:\> create-react-native-app adminlte
> How would you like to start 
- Default new app
C:\> cd adminlte
C:\adminlte> npm install --save react-native-webview
C:\adminlte> npm audit fix (ได้รับคำแนะนำให้ npm install)
C:\adminlte> npm install
C:\adminlte> npm audit fix
C:\adminlte> notepad app.js
import React, { Component } from 'react';
import { WebView } from 'react-native-webview';
export default class App extends Component {
  render() {
    return (
    <WebView 
    source={{uri: 'https://thaiall.github.io/www/adminlte/adminlte_github.htm'}} 
    style={{marginTop: 20}} />
    );
  }
}

C:\adminlte> yarn web (พบ react-native-webview - expected version range: 10.7.0)
C:\adminlte> npm install --save react-native-webview@10.7.0
C:\adminlte> npm audit fix
C:\adminlte> yarn start
C:\adminlte> notepad app.json
{
  "name": "adminlte",
  "displayName": "adminlte",
  "expo": {
    "name": "adminlte",
    "slug": "adminlte",
    "version": "1.0.0",
    "assetBundlePatterns": [
      "**/*"
    ]
  }
}
แม้ไม่ได้ปรับแฟ้ม app.json ก็สามารถทำงานบน android smartphone ได้ปกติ
C:\adminlte> notepad app.json
{
  "name": "adminlte",
  "displayName": "adminlte",
  "expo": {
    "name": "AdminLTE",
    "slug": "adminlte",
    "privacy": "public",
    "sdkVersion": "39.0.0",
    "platforms": ["android"],
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/icon.png",
    "splash": {
      "image": "./assets/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    },
    "updates": {"fallbackToCacheTimeout": 0},
    "assetBundlePatterns": ["**/*"],
    "android": {
      "package": "com.thaiall.adminlte"
    }
  }
}
C:\adminlte> expo build:android
> Would you like to proceed? ... yes
> Log in with an existing Expo account
> apk
> Generate new keystore
C:\adminlte> expo build:ios
> ? Would you like to proceed?  (Y/n)
> ? What would you like your iOS bundle identifier to be? (com.thaiall.mygitfriends)
> ? Choose the build type you would like: » - Use arrow-keys. Return to submit.
- archive - Deploy the build to the store (Apple ID required)
- * simulator - Run the build on simulator (Build)
ถ้าเห็นเงียบ ๆ ไป ให้กด enter 1 ครั้ง
React native : expo - ต.ค.2563
ขั้นตอนการใช้งาน มีดังนี้
C:\> create-react-native-app myapp2
- Default new app (เลือกตัวนี้)
- Template form expo/examples: https://github.com/expo/examples
C:\> cd myapp2
C:\myapp2> yarn web
C:\myapp2> npm ls (แสดง package ทั้งหมด)
C:\myapp2> npm ls react-native
C:\myapp2> app.js (original)
import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
export default function App() {
  return (
    <View style={styles.container}>
    <Text>Open up App.js to start working on your app!</Text>
    <StatusBar style="auto" />
    </View>
  );
}
const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff',
    alignItems: 'center',
    justifyContent: 'center',
  },
});
C:\myapp2> expo install expo-splash-screen (พบปัญหาที่ต้องติดตั้งใหม่ ทำให้รุ่นถูกลดลง)
warn Package expo-splash-screen has been ignored because it contains invalid configuration. 
Reason: Cannot find module 'expo-splash-screen\package.json'
"expo-splash-screen": "~0.6.2", เป็น "expo-splash-screen": "~0.6.1",
---
C:\myapp2> notepad package.json (ต้องติดตั้งรุ่นเก่า แทนรุ่นใหม่)
"react-native-webview": "^10.9.2" เป็น "react-native-webview": "^10.7.0"
---
C:\myapp2> npm install -g react-native-cli
C:\myapp2> npm install --save react-native-webview
C:\myapp2> npm install --save react-native-webview@10.7.0 (expo install react-native-webview)
C:\myapp2> npm audit fix
C:\myapp2> npm install -g expo-cli (ติดตั้งรุ่นใหม่ จะได้ทันสมัย)
There is a new version of expo-cli available (3.28.0). 
You are currently using expo-cli 2.13.0 
Run `npm install -g expo-cli` to get the latest version
C:\myapp2> yarn start 
// npm start // npm run web  
// npm run android แบบนี้ต้องมี simulator
---
C:\myapp2> notepad app.js
import React, { Component } from 'react';
import { WebView } from 'react-native-webview';
export default class App extends Component {
  render() {
    return (
	<WebView 
	source={{uri: 'http://www.thaiall.com/sponsor'}} 
	style={{marginTop: 20}} />
	);
  }
}
React native : expo - mygitfriends.apk
C:\> explorer https://nodejs.org/en/download/
C:\> npm -v (6.14.5)
C:\> explorer https://classic.yarnpkg.com/en/docs/install/#windows-stable
C:\> yarn -v (1.22.4)
C:\> npm install -g expo-cli
C:\> expo -V (3.28.0)
C:\> expo whoami
Logged in as thaiall
C:\> npm install -g react-native-cli
C:\> react-native -v (react-native-cli: 2.0.1 react-native: 0.63.3)
C:\> create-react-native-app helloweb  (รอคอย 12 นาที)
>   Default new app
C:\helloweb> cd helloweb
C:\helloweb> notepad app.js
import { StatusBar } from 'expo-status-bar';
import React from 'react';
import { StyleSheet, Text, View } from 'react-native';
export default function App() {
return (
<View style={styles.container}>   
<Text>hello world
{/* Open up App.js to start working on your app! */}
</Text>
<StatusBar style="auto" />    
</View>
);
}
const styles = StyleSheet.create({
container: {
  flex: 1,
  backgroundColor: '#fff',
  alignItems: 'center',
  justifyContent: 'center',
},}
);
---
C:\helloweb> notepad app.json
{
  "name": "helloweb",
  "displayName": "helloweb",
  "expo": {
    "name": "helloweb",
    "slug": "helloweb",
    "version": "1.0.0",
    "assetBundlePatterns": [
      "**/*"
    ]
  }
}
---
C:\helloweb> yarn web หรือ npm run web (รอ Starting Metro Bundler. และแสดงผลใน browser อย่างถูกต้อง)
---
Mobile : ใช้ expo app สแกน qr code พบคำว่า hello world บน smart phone
---
C:\> create-react-native-app mygitfriends
> Default new app (รอคอย 12 นาที)
C:\> cd mygitfrinds
C:\mygitfrinds> npm run web หรือ yarn web  (รอประมวล webpack 3 นาที)
1. พบการแสดงผลใน Browser - localhost:19006
2. เปิด expo app สั่ง scan qr code เปิดบน smartphone ได้เลย
---
ปรับ code
สร้าง folder ชื่อ assets มี 2 แฟ้มในห้องนี้ คือ icon.png และ splash.png
---
C:\mygitfrinds> notepad app.json
{
  "expo": {
    "name": "My git friends",
    "slug": "mygitfriends",
    "privacy": "public",
    "sdkVersion": "39.0.0",
    "platforms": ["android","ios"],
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/icon.png",
    "splash": {
      "image": "./assets/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    },
    "updates": {"fallbackToCacheTimeout": 0},
    "assetBundlePatterns": ["**/*"],
    "android": {
      "package": "com.thaiall.mygitfriends"
    }
  }
}
---
C:\mygitfrinds> notepad app.js
import React, { Component } from 'react';
import { WebView } from 'react-native-webview';
export default class App extends Component {
  render() {
    return (
    <WebView 
    source={{uri:'https://thaiall.github.io/mygitfriends/adminlte_mygitfriends.htm'}}
    style={{marginTop: 20}}
    />
    );
  }
}
---
C:\mygitfrinds> yarn web หรือ npm run web
---
ไม่พบ webview
Module not found: Can't resolve 'react-native-webview' in 'C:\Users\LAB\mygitfriends'
// npm install --save react-native-webview (มีปัญหากับรุ่น 10.9.2)
C:\mygitfrinds> npm install --save react-native-webview@10.7.0 (รอคอย 5 นาที)
C:\mygitfrinds> npm audit fix (พบว่าไม่ผ่าน ต้องสั่ง npm install แก้ปัญหา Missing: expo-splash-screen@~0.6.2)
C:\mygitfrinds> npm install (เพื่อติดตั้ง package เพิ่ม)
C:\mygitfrinds> npm audit fix (ซ่อม เท่าที่ซ่อมได้ แต่ไม่ทั้งหมด ต้องปล่อยไป)
C:\mygitfrinds> npm run web
---
Mobile : ใช้ expo app สแกน qr code พบคำว่า hello world บน smart phone
---
C:\mygitfrinds> expo build:android
> ? Would you like to proceed?  (Y/n)
> apk
> Generate new keystore (รอคอย 3 นาที)
---
C:\mygitfrinds> expo build:ios
> ? Would you like to proceed?  (Y/n)
> ? What would you like your iOS bundle identifier to be? (com.thaiall.mygitfriends)
> ? Choose the build type you would like: » - Use arrow-keys. Return to submit.
- archive - Deploy the build to the store (Apple ID required)
- * simulator - Run the build on simulator (Build)
/* 
Successfully built standalone app: https://expo.io/artifacts/6ba79fc2-3ab3-4d0d-b185-e86b5aea4af3
mygitfriends-5c4dafb5-280c-45bb-844f-90997f4e62ee-simulator.tar.gz (50 MB)
จบ process เท่านี้
*/
> ? Do you have access to the Apple account that will be used for submitting this app to the App Store? (Y/n)
- No
> ? Will you provide your own Apple Distribution Certificate? » - Use arrow-keys. Return to submit.
- Let Expo handle the process
- I want to upload my own file
> อ่านเพิ่มที่ https://bit.ly/2VtGWhU หรือ https://www.icloud.com/ หรือ https://appleid.apple.com/account#!&page=create
> ? Apple ID
> ? Password
Authenticating to Apple Developer Portal...
Authentication with Apple Developer Portal failed!
Failed to set up Distribution Certificate
ไม่ได้ไปต่อตรงนี้
---
C:\mygitfrinds> notepad app.json
พบการปรับปรุงอัตโนมัติใน app.json กรณีสั่ง build:ios แบบ archive ที่ต้องใช้ Apple ID
{
  "expo": {
    "name": "My git friends",
    "slug": "mygitfriends",
    "privacy": "public",
    "sdkVersion": "39.0.0",
    "platforms": [
      "android",
      "ios"
    ],
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/icon.png",
    "splash": {
      "image": "./assets/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    },
    "updates": {
      "fallbackToCacheTimeout": 0
    },
    "assetBundlePatterns": [
      "**/*"
    ],
    "android": {
      "package": "com.thaiall.mygitfriends"
    },
    "ios": {
      "bundleIdentifier": "com.thaiall.mygitfriends"
    }
  }
}
มีให้เลือกทั้ง android และ ios

เชื่อมกับ github.com
React native : expo - app.js
import * as React from 'react';
import { Text, View, StyleSheet } from 'react-native';
import { Constants } from 'expo';
// You can import from local files
import AssetExample from './components/AssetExample';
// or any pure javascript modules available in npm
import { Card } from 'react-native-paper';
export default class App extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        <Text style={styles.paragraph}>
          Change code in the editor and watch it change on your phone! Save to get a shareable url.
        </Text>
        <Card>
          <AssetExample />
        </Card>
      </View>
    );
  }
}
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    paddingTop: Constants.statusBarHeight,
    backgroundColor: '#ecf0f1',
    padding: 8,
  },
  paragraph: {
    margin: 24,
    fontSize: 18,
    fontWeight: 'bold',
    textAlign: 'center',
  },
});
React native : Joom - WebView on snack in expo
import * as React from 'react';
import { WebView } from 'react-native-webview';
export default class App extends React.Component {
render() {
return (
  <WebView source={{ uri: 'http://www.thaiall.com/actress/joom.htm' }}            
  style={{marginTop: 20}} />
);
}
}
// https://expo.io/@thaiall/snacks
// http://www.thaiall.com/reactnative/snacks_joom.zip (Source code for reactnative)
การสร้าง App ที่ใช้ Top Tab Navigator บน Thunkable.com
1. Layout : Top Tab Navigator (4 tab)
2. เปลี่ยนสีพื้นให้ Home, About, Contact, Setting
3. ใส่ Webview ใน About มี url เป็น AdminLTE
- ใส่ Label แล้วพิมพ์ข้อความแนะนำ ใน Home
4. ใส่ Button ใน Home เพื่อสั่งลิงค์ไป About
- Blocks : when Button1 click
- do navigate to "About"
5. ใส่ Text input ใน Contact
6. ใส่ Button ใน Contact
- Blocks : when Button2 click
- do open link "https://github.com"
- on error navigate to "Home"
7. Preview

gthaiall@
เปรียบเทียบ thunkable กับ mit app inventor
No-Code / Low-Code Development Platform
thunkable.com โดย ครูอภิวัฒน์
/programming/helloworld.htm
/android
Chocolatey คือ package manager อ่านใน medium.com เรื่อง react native setup จาก บล็อกของ Kittisak Pimnonthong และ ขั้นตอนการติดตั้ง react native บน windows จาก บล็อกของ James Teerayuth ได้เห็นว่าการใช้ choco ช่วยติดตั้ง Package เพื่อทำให้ React native ทำงานนั้น ช่วยให้การติดตั้งทำได้ง่ายมาก เพียงคำสั่งเดียวสามารถลงได้ทั้ง python และ jdk
เช่น E:\> choco install -y nodejs.install python2 jdk8 หรือ E:\> choco install nvm (Node Version Manager)
Chocolatey คือ Package Manager สำหรับ Windows ใช้งานผ่าน cmd หรือ powershell ที่ Run as administrator สามารถติดตั้งโดยใช้คำสั่งต่อไปนี้ PS E:\> Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1')) เมื่อติดตั้งแล้ว และพิมพ์คำสั่ง E:\> choco จะแสดงเลขรุ่นที่ได้ติดตั้งไป เช่น Chocolatey v0.10.15
set user variables กับ system variables
ลูกศิษย์ชื่อหนึ่ง โพสต์ถามใน สมาคมโปรแกรมเมอร์ไทย เกี่ยวกับ C:\> npx react-native run-android ที่ต้องตั้งค่า JAVA_HOME แต่ผมสนใจเรื่องการตั้งค่าใน System variables และ User variables จึงเรียบเรียงมาเล่าสู่กันฟัง ซึ่งการเข้าไปตั้งค่านั้น สั่งผ่าน command line ด้วย sysdm.cpl แล้วเข้า Advanced มองหา Environment variables... ซึ่งตัวแปรที่ตั้งขึ้นนั้น มี 3 สภาพแวดล้อม (Environment) คือ 1) ตั้งขึ้นขณะอยู่ใน Current shell ที่กำลังเปิดใช้งานอยู่นั้น และหายไปเมื่อปิด shell ลง 2) ตั้งตัวแปรใน System variables จะมีตัวแปรและค่าให้ใช้ในทุกเชล และทุกยูเซอร์ ถ้ามีตัวแปรซ้ำกับที่ประกาศใน User variables ก็จะใช้ในส่วนที่ผู้ใช้เป็นผู้ประกาศขึ้นสำหรับตนเอง 3) ตั้งตัวแปรใน User variables จะใช้เฉพาะกับ user ที่ sign in ในระบบขณะนั้น ผู้ใช้คนอื่นก็จะไม่เห็นตัวแปรนั้น ซึ่งตัวแปรแบบนี้ไม่ได้เกี่ยวว่าจะอยู่ shell แบบไหน เพราะได้ค่าเหมือนกันทั้งใน user หรือ administrator หรือ powershell เช่น ตัวแปร burin มีค่าเป็น u ก็จะเป็นเช่นนั้น เมื่อเรียกใช้โดย user ปัจจุบัน แต่ถ้า sign out และมีสมาชิกคนอื่นเข้ามาในระบบ แล้วใช้ตัวแปรที่สร้างใน System variables ค่าของ burin ก็จะเป็น s ตามตัวอย่างในภาพ
อีกกรณีหนึ่ง คือ การจัดการกับ variable ใน shell หนึ่ง จะไม่มีผลไปยัง shell อื่น จะลบหรือเปลี่ยนค่า burin เมื่อเปิด shell ใหม่ ระบบก็จะ load ค่าอีกครั้งจากระบบใหม่เข้ามาใช้ใน shell ไม่ว่าจะเป็น user variables หรือ system variables ก็ตาม เพราะแต่ละ shell มีหน่วยความจำเก็บตัวแปรเป็น local variables ของตนเอง หรือแม้แต่การเข้าไปเปลี่ยนใน sysdm.cpl ก็จะไม่กระทบค่าตัวแปรใน shell ที่กำลังเปิดอยู่ หากต้องการค่า variable ที่มีการเปลี่ยนแปลง ก็ต้องปิด shell แล้วเปิดขึ้นมาใหม่
กลุ่มซิกเซนต์ ที่ปลุกให้กลับมาพัฒนาโมบายแอปอีกครั้ง
วันนี้ 29 สิงหาคม 2564 ครบกำหนดเวลาที่นิสิตปี 1 มหาวิทยาลัยเนชั่น ส่งผลงานเขียนบล็อก เพื่อร้องเรียงเรื่องราวบอกเล่าสั้น ๆ โดยใช้ภาพประกอบ มาลำดับความคิด เหตุการณ์ หรือช่วงเวลา ที่เลือกเขียนได้ทั้งแนวลึก และแนวกว้าง เมื่อได้อ่านผลงานแล้วรู้สึกสนุก นิสิตบอกเล่าถึงความสุขเกี่ยวกับชีวิตวัยรุ่น ที่เปลี่ยนผ่านจากเยาวชนตัวน้อยในครอบครัวสู่ความเป็นผู้ใหญ่ สู่ชีวิตนิสิตในรั้วมหาวิทยาลัย เล่าได้ดีโดยใช้ภาพเป็น Milestone ในแต่ละย่อหน้า เพราะภาพหนึ่งภาพแทนคำพูดนับพันคำ ทำให้นิสิตสรรหาภาพที่ชื่นชอบในอดีตมาประกอบการเล่าเรื่องได้อย่างมีความสุข ร้อยเรียงเป็นเรื่องราวน่าอ่าน มีที่มา ที่เป็นอยู่ และที่เป็นไป ฝึกทักษะการสื่อสารผ่านการเขียน รอบต่อไปก็จะฝึกทักษะการพูด และบันทึกคลิปออกสื่อกัน หวังว่าจะพัฒนาทักษะการเขียน แล้วใช้ทักษะการเขียนไปเขียนตอบข้อสอบต่อไป ชวนอ่านผลงานของ วรรณศาสน์ มณีรัมย์ เลิศฤดี พลคำมาก หรือ วัชราพร เพื่อนสงคราม
ลับมานึกถึง นิสิตรุ่นพี่ปี 4 สายเดฟ ผมตั้งชื่อว่า Six Sense ไม่ใช่ The Sixth Sense ที่เป็นชื่อภาพยนตร์ที่แสดงนำโดย Bruce Wills แต่ Six มาจาก จำนวน ไม่ใช่ Sixth ที่มาจากคำว่า ลำดับที่ ตั้งชื่อว่า ซิกเซนต์#1 ประกอบด้วย หวาน แพรว ฟลุ๊ค เฟิร์น นน ฝน ซิกเซนต์#2 ประกอบด้วย คอม หนึ่ง นิค มิ้ม แบล็ค วิว เพราะนิสิตทั้งสองรุ่น อ.แนน อ.นุ้ย อ.เชพ ผู้สอน และศิษย์พี่ที่รับศิษย์น้องไปทำงานตรงสาย ต่างเสมือนเป็นแรงผลักดันต่างกรรมต่างวาระ ทำให้ผมกลับมาสนใจการพัฒนาโมบายแอปด้วยเครื่องมือใหม่อีกครั้ง จากที่เริ่มพัฒนาเว็บแอป มาตั้งแต่ 2541 ก่อนหน้านี้เคยสนใจ Android Studio แต่อุปกรณ์ไม่พร้อมสนับสนุนการพัฒนา แล้วปัจจุบัน 2564 ได้พี่เปรม และพี่เบนซ์ มาช่วยทำให้อุปกรณ์ของผมพร้อมขึ้น และตัวเครื่องมือพัฒนาได้รับการปรับปรุงให้มีประสิทธิภาพ ขึ้น จึงเริ่มกลับมาสนใจการพัฒนาโมบายแอป ด้วย React Native บน Android SDK และถือเป็นเวลาที่ต้องกลับไปซ่อมแซมโมบายแอป ที่เคยใช้ webview หรือแอปเก่ามีปัญหาที่ไม่ สอดคล้องกับเงื่อนไขใหม่ของ Play Store จนเป็นผลให้ Google play store ลบแอปออก เนื่องจากเวลาผ่านไปเงื่อนไขก็เปลี่ยนตาม (lpmuseum2) โดยเฉพาะคำว่า deprecated หมายถึง การยุติฟังก์ชัน โมดูล หรือไลบรารี่ที่ใช้ในการพัฒนาแอปพลิเคชัน ที่ประกาศยุติอยู่เสมอในทุก เครื่องมือ ทำให้ต้องกลับไปรื้อแอปเก่า นำมาเข้าคิว เพื่อพัฒนาใหม่อีกหลายตัว
ลับมาชวนมองกระแส React Native พบว่า แนวโน้มการใช้เครื่องมือพัฒนาโมบายแอพในปัจจุบัน กลุ่มนักพัฒนาโมบายแอปในดาวเคราะห์สีน้ำเงินนี้ เลือกใช้ React Native ที่พัฒนาขึ้นโดย Facebook และเป็น Cross Platform ที่ส่งโค้ดไป compile บนตัวแปลภาษาในแต่ละอุปกรณ์ทำให้ใช้ฟังก์ชันได้ทุกตัว อาทิ Andriod หรือ iOS จึงเรียกว่า Native language จากบล็อกที่เขียนโดย Sophia Martin เขียน 14 ก.ย.2562 ระบุว่า เครื่องมือมาแรงมี 3 ตัว คือ Flutter , React Native และ Xamarin ส่วน Hirar Atha เขียน 23 ก.ค.63 นำเสนอ 6 Best programming languages ประกอบด้วย Android = 1) Java, 2) Kotlin ส่วน iOS = 3) Swift, 4) Objective-C ส่วน Cross Platform = 5) React Native, 6) Flutter แล้วคุณ Hirar Atha ยังเล่าว่า โดยเฉลี่ยแล้วผู้ใช้สมาร์ทโฟนอยู่กับอุปกรณ์ 2 ชั่วโมง 55 นาทีทุกวันเมื่อปี 2562 ซึ่งนานกว่าดูทีวีหรืออุปกรณ์อื่นใด มีร้อยละ 90 ใช้เวลาในแอปพลิเคชัน ซึ่งชัดเจนว่า Mobile apps คือ สื่อดิจิทัลที่ลูกค้าเกาะติดเป็นกลุ่มที่ใหญ่ที่สุด ผู้ใช้สมาร์ทโฟนเฉลี่ยแล้วมี 80 แอปพลิเคชัน และใช้อย่างน้อย 40 แอปพลิเคชันทุกเดือน
การ downgrad เพื่อแก้ปัญหา gradlew assembleRelease ไม่สำเร็จ
downgrade : Gradlew เพื่อแก้ปัญหา React-native-reanimated + plugin with id maven not found
เมื่อสั่ง C:\myproject\android> gradlew assembleRelease
พบ FAILURE: Build completed with 2 failures.
1) A problem occurred evaluating project ':react-native-reanimated'.
2) A problem occurred configuring project ':react-native-reanimated'.
Deprecated Gradle features were used in this build, making it incompatible with Gradle x.x.
หรือ Failed to transform react-native-reanimated-65-jsc.aar
พบคำแนะนำ 
ที่ https://stackoverflow.com/questions/68831714/failed-to-transform-react-native-reanimated-65-jsc-aar **
และ https://github.com/software-mansion/react-native-reanimated/issues/1798

downgrade
1. C:\myproject\android> gradlew -v (พบ Gradle 7.2 จะลดเป็น 6.8)
2. C:\myproject\android> notepad gradle/wrapper/gradle-wrapper.properties
จาก distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip
เป็น distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip
3. C:\myproject\android> notepad build.gradle
จาก classpath("com.android.tools.build:gradle:4.2.1")
เป็น classpath("com.android.tools.build:gradle:4.2.2")
4. C:\myproject\> npm un react-native (https://reactnative.dev/versions)
5. C:\myproject\> npm i react-native@0.64
6. C:\myproject\> del package-lock.json
7. C:\myproject\> rmdir /s node_modules
8. C:\myproject\> yarn install
9. C:\myproject\> yarn start --reset-cache
10. C:\myproject> npm list
11. C:\myproject> react-native info
12. C:\myproject\android> gradlew -v
13. C:\myproject\android> gradlew assembleRelease  --stacktrace
14. พบ Task :app:mergeReleaseResources FAILED
C:\myproject\android> 
rmdir /S app\src\main\res\drawable-hdpi
rmdir /S app\src\main\res\drawable-mdpi
rmdir /S app\src\main\res\drawable-xhdpi
rmdir /S app\src\main\res\drawable-xxhdpi
rmdir /S app\src\main\res\drawable-xxxhdpi
15. พบ Task :app:processReleaseMainManifest FAILED
แก้ไขแฟ้ม build.gradle ใน android/app
จาก defaultConfig { minSdkVersion 15 }
เป็น defaultConfig { minSdkVersion 21 }
            minSdkVersion 21
16. แก้ไขแฟ้ม build.gradle ใน android
จาก ext { minSdkVersion 15 }
เป็น ext { minSdkVersion 21 }
จาก compileSdkVersion = 30 targetSdkVersion = 30
เป็น compileSdkVersion = 28 targetSdkVersion = 28
คำสั่งที่น่าสนใจ C:\project> expo build:android -t app-bundle (สร้างแฟ้ม .aab ใน expo.io)
Android App Bundle (.AAB) คือ publishing format แบบใหม่ ที่ทีมพัฒนาของ Google ประกาศเปิดตัว ในงาน Google I/O 2018 โดยแฟ้มมีนามสกุลเป็น .aab เพื่อให้นักพัฒนาแอปพลิเคชั่นส่งขึ้น Google play แทนแฟ้ม .apk แบบเดิม แล้วทาง Google play จะนำ .aab ไปสร้างเป็น .apk ให้ผู้ใช้ต่อไป จุดเด่น คือ .aab คือ .apk ที่ Google play จะส่งให้ผู้ใช้เป็น Optimized .apk โดยตัดไฟล์ที่ไม่จำเป็นต่อเครื่องนั้นออกไป ทำให้ผู้ใช้เวลาดาวน์โหลดน้อยลง เพราะไฟล์มีขนาดเล็กลง ดังนั้นจะใช้งาน .aab ให้เหมือนกับ .apk ไม่ได้ เพราะอุปกรณ์ทั่วไปต้องการแฟ้ม .apk และ Google Play จะเริ่มรับเฉพาะแฟ้มแบบ Android App Bundle (.aab) แล้วจะแปลงออกไปให้เหมาะสมกับแต่ละอุปกรณ์เป็น .apk ตั้งแต่สิงหาคม 2564
อ่านเพิ่ม https://android-developers.googleblog.com/
อ่านเพิ่ม https://akexorcist.dev/android-app-bundle-part-1/
C:\project> expo diagnostics
Expo CLI 4.11.0 environment info:
  System:
    OS: Windows 8.1 6.3.9600
  Binaries:
    Node: 16.3.0 - C:\Program Files\nodejs\node.EXE
    Yarn: 1.22.4 - C:\Program Files (x86)\Yarn\bin\yarn.CMD
    npm: 7.21.0 - C:\Program Files\nodejs\npm.CMD
  IDEs:
    Android Studio: Version  3.3.0.0 AI-182.5107.16.33.5314842
  npmPackages:
    expo: ~42.0.1 => 42.0.3
    react: 16.13.1 => 16.13.1
    react-dom: 16.13.1 => 16.13.1
    react-native: ~0.63.4 => 0.63.4
    react-native-web: ~0.13.12 => 0.13.18
  Expo Workflow: bare
App : LPMuseum2 บน Google Play Store
โครงการวิจัย : การจัดการพิพิธภัณฑ์ชุมชนในระบบอิเล็กทรอนิกส์ของจังหวัดลำปาง
ที่มาของแอปพลิเคชัน lpmusem ทั้งรุ่น 1 และ 2 ใน Google play store อ้างอิงข้อมูลทั้งหมดจากข้อมูลในเว็บไซต์ lpmuseum.net ที่ดำเนินการภายใต้ โครงการ การจัดการพิพิธภัณฑ์ชุมชนในระบบอิเล็กทรอนิกส์ของจังหวัดลำปาง (The Management of Community Museum in Electronic System of Lampang Province) โดย พระครูสิริธรรมบัณฑิต,ผศ. ผู้อำนวยการวิทยาลัยสงฆ์นครลำปาง หัวหน้าแผนวิจัยและคณะ ซึ่งได้รับทุนอุดหนุนจากมหาวิทยาลัยมหาจุฬาลงกรณราชวิทยาลัย ประจำปีงบประมาณ 2563 MCU RS 6303008 โดยข้อมูลการศึกษาได้มาจาก 3 วัดต้นแบบ ได้แก่ วัดบ้านหลุก 289 หมู่ 6 ตำบลนาครัว อำเภอแม่ทะ จังหวัดลำปาง วัดปงสนุกเหนือ ตำบลเวียงเหนือ อำเภอเมืองลำปาง จังหวัดลำปาง วัดไหล่หินหลวง หมู่ 2 บ้านไหล่หิน ตำบลไหล่หิน อำเภอเกาะคา จังหวัดลำปาง
Sandbox
10 Best online editor : https://noeticforce.com/react-online-editor
React JS
https://stackblitz.com/edit/react-ssbqsz
React native 
https://reactnative.dev/docs/state
https://snack.expo.dev/@thaiall/f6feef
https://codesandbox.io/s/q4qymyp2l6?file=/src/App.js
web guides
https://expo.io/@silkyland 
https://exp.host/@thaiall/myapp2
https://medium.freecodecamp.org/license-plate-recognition-in-react-native-b4f790d3a160
https://github.com/WebMobi59/Expo.io-google-cloud-ocr
https://reactnative.dev/docs/0.61/webview
https://blog.logrocket.com/the-complete-guide-to-react-native-webview/
https://github.com/react-native-webview/react-native-webview/blob/master/docs/Getting-Started.md
https://josephkhan.me/webview-in-react-native/
https://stackoverflow.com/questions/61936085/error-from-chokidar-c-error-ebusy-resource-busy-or-locked-lstat-c-dump
https://medium.com/@idanlevi2/injecting-javascript-into-react-native-webview-521e4e55964b 
https://stackoverflow.com/questions/46992556/open-a-webview-after-a-button-pressed-with-reactnative
https://medium.com/geekculture/react-native-generate-apk-debug-and-release-apk-4e9981a2ea51
rspsocial
Thaiall.com