วันจันทร์ที่ 22 มิถุนายน พ.ศ. 2563

Using Netbeans runs RESTful on Tomcat 9

ผมเห็นตัวอย่างมากมาย รัน REST กับ Tomcat 9 แต่เขาใช้ Eclipse ทำงานกัน แต่ผมชอบใช้ NetBeans มากกว่า จะทำตาม Eclipse กันอย่างไง

ที่ทดสอบนี้ใช้ Netbeans IDE 11.3 ใช้ Tomcat 9.0.16

วิธีการก็คล้ายๆ เพียงแต่ใช้เครื่อมมือไม่เหมือนกัน เริ่มทำกันดังนี้


  1. สร้างโปรเจ็ค File > New Project > Java with Maven > Web Application
  2. ไฟล์ pom.xml ใส่ dependency :
     <dependency>
               <groupId>org.glassfish.jersey.containers</groupId>
                    <artifactId>jersey-container-servlet</artifactId>
                    <version>2.25.1</version>
     </dependency>
  3. สร้างไฟล์ web.xml ใน WEB-INF ใส่ข้อความดังนี้

    <?xml version="1.0" encoding="UTF-8"?>

    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0">
     <display-name>TomcatNetBeans</display-name>
      <welcome-file-list>
        <welcome-file>index.html</welcome-file>
        <welcome-file>index.htm</welcome-file>
        <welcome-file>index.jsp</welcome-file>
        <welcome-file>default.html</welcome-file>
        <welcome-file>default.htm</welcome-file>
        <welcome-file>default.jsp</welcome-file>
      </welcome-file-list>

      <servlet>
        <servlet-name>Jersey REST Service</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.mycompany.tomcatnetbeans</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>Jersey REST Service</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    </web-app>

    ให้สังเกตว่า namespace ของผมเป็น com.mycompany.tomcatnetbeans ซึ่งต้องเปลี่ยนให้ตรงกับ namespace ที่เครื่องเราใช้
  4. สร้าง ไฟล์ Hello.java

    package com.mycompany.tomcatnetbeans;
    import javax.ws.rs.GET;
    import javax.ws.rs.Path;
    import javax.ws.rs.Produces;
    import javax.ws.rs.core.MediaType;

    @Path("/hello")
    public class Hello {
        @GET
        @Produces(MediaType.TEXT_PLAIN)
        public String helloText() {
            return "Hello, Restful";
        }
    }
  5. ไปหน้าต่าง Services เพื่อ เพิ่ม Server Tomcat เมื่อเพิ่มแล้ว คลิกขวา เพื่อให้เซิร์บเวอร์ทำงาน
  6. กด F11 เพื่อ Build Project และ F6 เพื่อ Run
  7. เปิด เบราเซอร์ ไปที่ http://localhost:8080/TomcatNetBeans/rest/hello

  หวังว่า คงใช้ลดเวลา ในการลองผิดลองถูก

วันพฤหัสบดีที่ 28 พฤษภาคม พ.ศ. 2563

เริ่มต้นใช้ PrimeNg กับ Angular

เริ่มต้นจากสร้าง app ใหม่ชื่อ myAngular


ng new myAngular
cd myAngular
npm install primeng --save
npm install primeicons --save


ตรวจสอบว่า มีโฟลเดอร์ priming และ primeicons ใน myAngular\node_modules แล้ว
ตรวจสอบว่า package.json มี  "primeicons": "^2.0.0",    "primeng": "^9.0.6 ในส่วน dependencies ต้องอยู่ dependencies เท่านั้น ถ้าไปอยู่ใน ส่วนผิด ถือว่าผิด (เลขที่รุ่นขึ้นกับการติดตั้ง ณ เวลา นั้นว่าได้รุ่นใด)
ณ ขณะนี้ยังไม่ได้เปิด myAngular ที่สร้างไว้ จะต้องเปิด

ng serve --open

ใส่เพิ่ม CSS ของ primeNg ใน angular.json (ใส่ theme ชื่อ nova-light ซึ่งเปลี่ยนที่หลังได้)

"styles": [
  "node_modules/primeicons/primeicons.css",
  "node_modules/primeng/resources/themes/nova-light/theme.css",
  "node_modules/primeng/resources/primeng.min.css",
]

เริ่มทดสอบคอมโพเน้นท์ primeNg ด้วย Button เพิ่มในไฟล์ app.module.ts

import {ButtonModule} from 'primeng/button';

และใส่เพิ่ม ButtonModule ในส่วน import

imports: [
    BrowserModule,
    AppRoutingModule,
    ButtonModule,
 ],

ใส่ ในส่วน app.component.html (กรณีนี่ทดสอบในหน้าหลัก)

<h3 class="first">Button Component</h3>
<p-button label="Click"></p-button>
<p-button icon="pi pi-check" label="Click"></p-button>
<p-button icon="pi pi-check" iconPos="right" label="Click"></p-button>
<p-button icon="pi pi-check"></p-button>
<p-button icon="pi pi-check" [disabled]="true" label="Disabled"></p-button>

การนำเข้า อะไรที่เป็นโมดูล (สังเกตุว่ามีคำว่า module ต่อท้าย) จะต้องดำเนินการที่ไฟล์ app.module.ts ดังตัวอย่างการใช้ ButtonModule แต่ไม่ใช่ทุกตัวใน PrimeNg จะเป็นโมดูล เช่น MenuItem ซึ่งมาจาก primeng/api ตัวนี้ไม่ถือเป็นโมดูลเป็นเพียงไทป์ (type) หนึ่ง จึงไม่ต้องดำเนินการแบบเดียวกับโมดูล แต่ให้นำเข้า import ในคอมโพเน้นท์ ที่เรียกใช้ได้เลย เช่น
import {MenuItem} from 'primeng/api';

ในการนำไปใช้กับคอมโพเน้นท์ ต้องการไทป์นี้ในการอ้างอิงกับคอมโพเน้นท์ เช่น

items: MenuItem[ ];

ผลที่ได้ จากใช้ ButtonModule และอิลีเม้นท์ <p-button> ตามรูปนี้



วันเสาร์ที่ 16 พฤษภาคม พ.ศ. 2563

Array Filter in Observable Angular

ผมเห็นตัวอย่าง (Official) ใน Angular:

import { map } from 'rxjs/operators';
const nums = of(1, 2, 3); const squareValues = filter((val: number) => val %2 == 0); const squaredNums = squareValues(nums); squaredNums.subscribe(x => console.log(x)); ผมก็เข้าใจว่า ตัวแปร nums เป็นอาร์เรย์ทั่วไป จึงใช้ map หรือใช้ filter โดยมีตัววิ่งเป็นข้อมูลแต่ละตัวในอาร์เรย์ ก็ดูไม่มีปัญหาอะไร ผมเลยลองใช้กับอาร์เรย์ของออบเจ็กต์

const users= of(User[])
const filterOf = filter((user:User) => user.id%2==0);
coonst observable = filterOf(users);

ปรากฎว่าใช้ไม่ได้ มีแจ้งว่า ตัวแปรเข้าต้องเป็นอาร์เรย์ User[] แต่ใส่มาเป็น User ผมเลยคิดว่ามันไม่เหมือนกันกับ of(1,2,3) และเป็น number[] เหรอ?

เมื่อไม่ให้ใช้ก็ไม่ใช้ แล้ว จะให้ใส่เป็นอาร์เรย์ User[] ใช่ไหม ได้ แก้ใหม่เป็น

const filterOf = map((uses:User[]) => users.filter((user)=>user.id%2==0));

ปรากฎว่าได้จริงๆ ในตัวอย่างไม่เห็นบอกยกตัวอย่างแบบอาร์เรย์ เลยนึกว่าเป็นอาร์เรย์แล้ว ไม่ใช่เลย แก้โดยใช้ map อีกที และแตกย่อย โดย filter

วันศุกร์ที่ 10 เมษายน พ.ศ. 2563

Raspberry Pi with Serial USB

การใช้ Raspberry Pi ติดต่อผ่าน Serial USB

รายการที่ต้องใช้

  • CH340G Breakout 
  • สายต่อ 3 เส้น (ต่อกับ CH340G Breakout กับ Pin ของ Raspberry Pi)
  • สาย USB (ต่อกับ CH340G Breakout กับ คอมพิวเตอร์)


เมื่อต่อสาย USB จาก CH340G Breakout กับ Computer แล้ว ให้ตรวจสอบ Communication Port ที่ Device Manager จากรูปข้างล่างนี้ ได้ COM7




ต่อมา เปิด โปรแกรม PuTTY เลือกต่อแบบ Serial ที่ความเร็ว 115200 และเลือก COM7
เมื่อจะเข้าระบบ ก็จะมีให้การ ถาม UserName/Password กรณีที่เข้าแล้ว หน้าจอยังไม่มีถามให้เข้าระบบ(ดูเหมือนค้าง) ให้ กด Enter หนึ่งครั้ง

ซึ่งต่อไปจะแก้ไขระบบอะไร ให้อยู่ใหนโหมด Desktop หรือ CLI ให้ใช้คำสั่ง

sudo raspi-config

หมายเหตุ ระบบติดต่อนี้ ต้องกำหนด Raspberry Pi ต่อเชื่อมแบบ Serial ได้ เข้าแก้ไขโดยใช้คำสั่ง raspi-config


วันจันทร์ที่ 6 เมษายน พ.ศ. 2563

Raspberry Pi Zero (RPZ) VNC

RPZ ตอนแรกที่ใช้ มักใช้เป็น CLI เลยคอนฟิกไว้เป็นแบบนี้ตั้งแต่แรก แล้วก็เซ็ตต่อเชื่อม WiFi ไว้พร้อมเมือเปิด RPZ ก็ใช้ได้

การต่อเมื่อกับ RPZ ก็ใช้ PuTTY กรณีที่รู้เลข IP ก็ใส่ได้เลย แต่ปัญหามักพบว่าในตอนแรกจะไม่ทราบ ไอพี แก้ปัญหาโดยการติดต่อโดยใช้ PuTTY ติดต่อใช้ Host Name : raspberrypi.local  และ Port: 22

แต่ต้องมีข้อแม้ว่า RPZ ตัวนั้นต้องเคยต่อเชื่อมกับ Hotspot ได้มาก่อน เมื่อเปิด RPZ ก็จะเชื่อมต่อทันที และเราที่ใช้คอมพิวเตอร์ก็ต้องต่อเชื่อมกับ Hotspot ตัวเดียวกัน (วงแลนเดียวกัน)


เมื่อ login ได้แล้ว

ตอนี้หาจะดูไอพี ใช้คำสั่ง

ifconfig

ต่อมาถ้าต้องการการเข้าโหมด WindowX บ้าง ใช้คำสั่ง

sudo startx

ในขั้นตอนนี้ PuTTY จะทำงานในโหมดกราฟฟิกไม่ได้แล้ว ให้เปิด


 VNC Viewer ใส่ ไอพี

และผลที่ได้

หมายเหตุ การเปิดเชื่อมแบบ VNC ได้ RPZ ต้องมีกำหนดให้มีการใช้ต่อเชื่อมแบบนี้ได้ หากไม่มีก็แก้ที่ raspi-config

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

Tiny AVR ISP ATtiny44 USBTinyISP Programmer

Tiny ISP programmer

ซื้อมา ตามภาพ เพียงแต่มาต่อขาเอง และเชื่อมกับ Arduino UNO


ลงไดร์เวอร์ ตาม url นี้
https://learn.adafruit.com/usbtinyisp/drivers

ผมทดลองกับ Windows 10

ทดลองกับโปรแกรม Example/ 01.Basik/ Blinking


เลือก วิธีวิธีอัปโหลด และบอร์ด Arduino Uno





ถ้าไม่มีอะไรผิดพลาด ก็จะได้ผลตามโปรแกรม Blink

ทำกลับให้เหมือนเดิม ใช้ Burn Bootloader (ตอนนี้ยังต่อสายเหมือนเดิม)





วันเสาร์ที่ 29 มิถุนายน พ.ศ. 2562

Hello Max II EMP204T100C5

เพิ่งจะซื้อ บอร์ด Max II จากจีนมา (แน่นอนว่าราคาไม่แพง)


แล้วทดลองเขียนโปรแกรม VHDL ให้ LED ต่อกับขา 21 (ตามเลขบนบอร์ด)

library ieee;
use ieee.std_logic_1164.all;
entity Hello is
   port(
     LED_0: out std_logic -- Pin 21
   );
end Hello;

architecture rtl of Hello is
begin
   LED_0 <= '1'; -- Output to LED_0
end rtl;

ทำงานได้จริง

โปรแกรมที่ใช้ Quartus Prime 18.1.0 Lite Edition


XOR logic
ทดลองอีกที ครานี้เขียนด้วยภาษา Verilog จากตัวอย่างที่ให้มากับโปรแกรม Quartus Prime

module xor_logic (x1, x2, f);
  input x1, x2;
  output f;
  assign f = (x1 & ~x2)|(~x1 & x2);
endmodule

ให้ทำการ compile เลือกไอคอน สีเขียวรูปสามเหลี่ยม(run) แล้วค่อยกำหนดพิน 
และเมื่อคอมไพล์เสร็จ จึงค่อยกำหนดพินดังรูปนี่้

ให้พิน PIN_1, PIN_2 แทน x1, x2,  และ PIN_7 แทน f

เมื่อ กำนหนด pins ทั้งหมดแล้ว ขั้นตอนไป คือ  upload ไปยัง board MaxII emp240
 วิธีการคือ ต้องต่อกับ usb blaster ให้คลิกที่เมนู Programmer แล้วเลือก ตามรูปต่อไปนี้ แล้วให้คลิก Start รอจนครบ 100% ถือว่าสำเร็จ



ทดสอบโลจิกนี้ เหมือนกันได้จริง ต่างกันเป็นเท็จ ทดสอบกับ LED ดังรูปนี้


ตัวอย่างนี้ได้มาจาก Quartus Prime Introduction Using Verilog Designs ที่แจกให้ตอนซื้อบอร์ดมา