發表文章

目前顯示的是有「Linux」標籤的文章

[Linux] Ubuntu 的簡易時間同步

圖片
簡單記錄一下在 ubuntu 上進行時間同步的方法, 主要遇到的問題是在多台機器上架設叢集, 為了進行資料庫的存取, 需要同步一下系統的時間, 因此, 簡單記錄一下設定的過程: 1) 安裝並設定 ntp, ntpdate $ sudo apt-get install ntp ntpdate 2) 手動進行 ntp 對時, 更新系統時間 $ sudo ntpdate time.stdtime.gov.tw $ sudo hwclock -w # 若是需要更精確地同步時間, 可以透過設定 ntp 服務, 定時對時 # 可以參考:  https://blog.gtwang.org/linux/linux-ntp-installation-and-configuration-tutorial/ 3) 更改時區 (timezone) # 基本上, 對時完之後的時間對應的是 UTC 時間, # 程式執行時, 則是使用 local time, 對應到 timezone 的設定 首先, 我們先看一下當下的設定, 指令為: timedatectl 在設定中, 我們可以看到 timezone (Local time) 為 CST (Central Standard Time), 但是, 在設定時標準的格式為: 洲/城市 (Asia/Taipei), 我們可以透過指令, 查詢適合的設定: $ timedatectl list-timezones 最後可以以下列指令更新 timezone 的設定: $ sudo timedatectl set-timezone <your_time_zone> 詳細的可以參考:  https://linuxize.com/post/how-to-set-or-change-timezone-in-linux/ 

[RESTful] Java Servlet API Server ~3 (JSON format 與 library)

圖片
在上一篇文章中, 我們介紹了 Servlet 架構下的編譯環境, 並以範例說明如何產生一個網頁回應. 然而, 對於 RESTful API 而言, 另一個主要的需求即是作為 API 介面, API 的全稱為: Application Programming Interface, 主要的用途就是提供一個介面, 讓不同應用程式透過網路溝通, 簡單來說, 像是一個服務的窗口, 並定義該窗口對應的功能與服務. 另一方面, JSON 則是一種資料封裝格式, 可以把資料以 key-value 的方式, 組成 JSON 物件, 進行傳送. 來自:  https://docs.aws.amazon.com/zh_tw/sdk-for-javascript/v2/developer-guide/working-with-json.html 為了利用 Servlet 提供 JSON 的解析與回應, 我們需要章中, 我們介紹了 Servlet 架構下的編譯環境, 並以範例說明如何產生一個網頁回應. 然而, 對於 RESTful API 而言, 另一個主要的需求即是作為 API 介面, API 的全稱為: Application Programming Interface, 主要的用途就是提供一個介面, 讓不同應用程式透過網路溝通, 簡單來說, 像是一個服務的窗口, 並定義該窗口對應的功能與服務. 另一方面, JSON 則是一種資料封裝格式, 可以把資料以 key-value 的方式, 組成 JSON 物件, 進行傳送. 為了利用 Servlet 提供 JSON 的解析與回應, 我們需要 import org.json.*; 做為參考的 library, 範例程式可以參考:  https://blog.csdn.net/CapMiachael/article/details/72930357 import java.io.BufferedReader;  import java.io.IOException;  import java.io.PrintWriter;  import javax.servlet.ServletException;  import javax.servlet.http.HttpS...

[RESTful] Java Servlet API Server ~2 (helloworld)

圖片
在 上一篇文章 中, 我們建立了 Servlet 的編譯環境, 接著, 我們就從最簡單的 helloworld 開始, 介紹如何撰寫第一支 Servlet 程式. 以下是編譯環境中的路徑: 網頁根目錄: /var/lib/tomcat8/webapps/ROOT/ tomcat8 library 目錄: /usr/share/tomcat8/lib/ tomcat8 log 目錄: /var/lib/tomcat8/logs/ 首先, 我們要先定義 Servlet API 的入口, 此文件位於: /var/lib/tomcat8/webapps/ROOT/WEB-INF/web.xml 我們將內容填入如下: <web-app> <servlet> <servlet-name>HelloWorld</servlet-name> <servlet-class>HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/HelloWorld</url-pattern> </servlet-mapping> </web-app> 在文件中, 定義了 API 的路徑 ( servlet-mapping ) 以及對應的 Servlet 程式 ( servlet ), 透過這兩個設定, 我們就建立了 Servlet 與 API Server 之間的呼叫關係, 接著, 我們進行 helloworld 的 Servlet 程式撰寫, 以下為範例: import java.io.*;  import javax.servlet.ServletException;  import javax.servlet.http.*;  public class HelloWorld extends HttpServlet  {       static ...

[RESTful] Java Servlet API Server ~1 (Servlet 介紹與 tomcat8)

圖片
在 之前的文章 中, 介紹了如何用 node.js 快速建立 API Server,  然而, 由於效率問題, node.js 並不是一個穩定的架構用以作為 API Server, 同時, JSON Server 本身實作的架構, 依賴對檔案的讀寫, 對於大量存取的 API 實作來說, 容易造成 IO 的消耗, 考慮到上述因素, 我們便開始研究其他 API Server 的實作方式, 在本篇介紹中, 便以 Java Servlet + tomcat8 作為實作的平台. 關於 Java Servlet 是 Java 語言中的一種特殊類別, 用 Java 編寫的伺服器端程式, 可以透過與使用者的互動, 動態產生網頁, 對於 API Server 來說, 主要的功能則是繼承自: javax.servlet.http.HttpServlet 另一方面, tomcat 則是一開源的 HTTP 伺服器, 支援 Servlet 與 JSP, 在我們的實作中, 我們使用 ubuntu 16.04 作為基礎的作業系統, 並使用 tomcat8 作為網頁伺服器 (參考: 此文 ). 安裝 tomcat8 的開發環境: sudo apt-get install tomcat8 sudo apt-get install tomcat8-docs tomcat8-examples tomcat8-admin tomcat8 的開啟/關閉/重啟: systemctl start tomcat8 systemctl stop tomcat8 systemctl restart tomcat8 安裝好 tomcat8 之後, 會使用預設的服務埠 (8080), 連入: http://127.0.0.1:8080 之後, 我們可以看到下方頁面: 其中, 紅框處為網頁目錄的位置,  此目錄也是我們之後開發 Servlet 程式的相對根目錄, 藍框處標明了套件安裝的路徑, 其中, 這兩個路徑我們之後都還會用到, /usr/share/tomcat8/lib/ 有用以 compile 的 library, /var/lib/tomcat8/logs/ 則保存紀錄檔, tomcat8-examples 則提供一些 Servlet 的範例程式, 可以參考. 我們在此整理一下開發環境...

[REST] 網頁開發環境: LAMP + WordPress

圖片
為了建立一個簡單的網頁介面, 我們在 Linux (ubuntu 16.04) 上建立一個標準的網頁開發環境, 也就是所謂的 LAMP: Linux, Apache, MySQL, PHP 這部分滿簡單的, 可以參考:  https://jerrynest.io/ubuntu16-04-wordpress/ 只需要輸入以下指令: sudo apt-get update sudo apt-get upgrade sudo apt-get install lamp-server^ sudo apt-get install phpmyadmin 其中, phpmyadmin 為一個可以透過 php 讀取 mySQL 的介面, 完成安裝之後, 記得把 php 網頁專案放到 /var/www/html/ 底下, 確保外部的存取, 指令如下: cd /var/www ln -s /usr/share/phpmyadmin 完成後, 可以透過 http://yourip:port/phpmyadmin 來查看 mySQL 的設定, 進入網頁後, 帳號為 root, 密碼為安裝 mySQL 時輸入的密碼, 就可以利用圖形化介面操作 mySQL, 接下來, 要建立一個動態網頁的環境, 在動態網頁的架構下, 通常我們將網頁分成三部分: 框架 (html), 排版 (css), 計算 (php), WordPress 是一個基於 PHP 技術的網頁模板, 並提供大量的模板參考, 在參考的文章中, 使用 apt-get 的方式來安裝 WordPress, 但在實測環境中, 因為不是純粹的 localhost 環境, 並透過 NAT 進行 port-to-port 的對應, 因此無法直接套用生成的 config 檔. 因此, 我們參考 WordPress 的教學, 直接對環境進行設定. 教學來自:  https://codex.wordpress.org/Installing_WordPress 此教學分成 5 個部分, 下載 WordPress: wget https://wordpress.org/latest.tar.gz 設置資料庫 (帳...

[OpenWRT] OpenWRT 的設定 (4): 網路設定

圖片
在 OpenWRT 的預設設定中, /etc/config/network 的設定可以分成兩部分, 第一部分是CPU那一端的設定檔, config 'interface' 'loopback'        option 'ifname'   'lo'        option 'proto'    'static'        option 'ipaddr'   '127.0.0.1'        option 'netmask'  '255.0.0.0' config 'interface' 'lan'         option 'ifname'   'eth0.1'         option 'type'     'bridge'         option 'proto'    'static'         option 'ipaddr'   '192.168.1.1'         option 'netmask'  '255.255.255.0' config 'interface' 'wan'         option 'ifname' 'eth0.2'         option 'proto' 'dhcp' 在此部分, 我們可以看到, 對於 CPU 那一端的網路設定而言, 除了 Linux 常見的 loopback 網路設定外, 還有兩張網卡, 分別對應於上一篇文章中圖片內的 eth0 和 eth1, 事實上, eth0.1 和 eth 0.2 對應於同一張物理網卡, 只是虛...

[OpenWRT] OpenWRT 的設定 (3): 架構

圖片
對於 OpenWRT 系統來說, 最重要的功能就是提供網路通訊, 而對於 WiFi AP 而言, 網路一共分成兩個角色: 作為有線網路的路由器, 以及作為 WiFi 無線網路主控節點, 而對應於 OpenWRT 的設定檔而言, 則是對應於 network 和 wireless 兩個設定檔中. 為了理解這兩個檔案的設定, 我們要先理解硬體上的設定, 我們以 TP-Link 1043 為例, 其 CPU, 有線網路和無線網路的關聯性如下圖: 來自:  https://openwrt.org/fr/toh/tp-link/tl-wr1043nd

[OpenWRT] OpenWRT 的設定 (2): 工作排程

圖片
在 Linux 系統中, cron 是一種將工作排程的方式, 關於 cron 的敘述, 可以參考鳥哥的介紹: http://linux.vbird.org/linux_basic/0430cron.php 而在 OpenWRT 中也支援 cron 的功能, 要啟用 cron 的功能, 我們要先編輯 cron 的排程列表, 輸入 crontab -e, 就可以開始編輯 cron 的工作排程, 其格式如下: 來自:  http://einverne.github.io/post/2017/03/auto-reboot-openwrt.html 簡單來說, 就是定義 分; 時; 日; 月; 周期 以及要執行的工作, 舉例而言, 我們可以定義: */1 * * * * echo "hello" 這樣就會每一分鐘都顯示一次 "hello" 訊息, 我們可以在 logread 中看到: root@OpenWrt:~# logread Jun 21 07:17:01 OpenWrt cron.err crond[1211]: USER root pid 1495 cmd echo "hello"

[OpenWRT] OpenWRT 的設定 (1): 時區和同步

在完成 OpenWRT 的移植之後, 接下來就要開始設定 OpenWRT 的設置, 畢竟, 都建立了一個以 Linux 為基底的 WiFi AP, 當然會希望它可以完成比既有 WiFi AP 更多的功能. 在 OpenWRT (以backfire為例) 中, 關於功能的設定, 都放在 /etc/config 資料夾之下 root@OpenWrt:/etc/config# ls dhcp      dropbear  firewall  fstab     mountd    network   openflow  system    wireless 其中, dropbear 是 OpenWRT 的 SSH server, fstab, mountd 負責檔案系統部分, dhcp, firewall 如其名稱所示, 負責 IP 位置請求以及防火牆, openflow 為 openflow 的相關設定, network 為有線網路的設定, wireless 為無線網路的設定, 這兩部分應該會找時間再記錄細節. system 為一些系統上的設定, 例如所在時區.

[OpenWRT-backfire] toolchain / cross-compiler 的建立

圖片
在開發許多 IoT 裝置或是 WiFi AP 時, 由於這些裝置缺乏完整的程式開發的環境, 我們會需要 toolchain /cross-compiler 來輔助我們進行程式的開發, 考慮到所有程式都會編譯成執行檔, 而此執行檔的建立, 又和所使用的系統平台相關, 因此, toolchain 的主要功能即在於提供一套編譯環境, 可以讓你編譯不同平台上可以執行的程式, http://slideplayer.com/slide/11189636/ 以 Raspberry Pi 為例, 可以參考這一篇文章: https://www.raspberrypi.com.tw/tag/toolchain/ 當然, toolchain 中有許多細節, 在此不詳細敘述, 只放上來這一次針對 OpenWRT backfire 製作 toolchain 的步驟, 由於backfire版本過舊, 也列出所需要的修改.

kvm-clock: KVM guest machine 的計時機制

在雲端的架構中, 虛擬機 (virtual machine, or guest machine) 透過hypervisor取得實體機 (physical machine, or host machine) 的硬體資源, 其中, 有根據虛擬化的程度又分為許多不同的虛擬化技術, 像是virtualbox和VMWare的全虛擬化, 虛擬化完整的作業系統, docker或是LXC的container技術, 虛擬機像是一隻程式, 沒有獨立的作業系統, 另外, 還有一種辦虛擬化技術, host machine和guest machine共享Linux Kernel, 例如: KVM (Kernel-based Virtual Machine) http://www.linux-kvm.org/page/Main_Page 在本篇文章中, 我們將討論KVM架構下, host machine和guest machine之間的同步關係.