跳到主要內容

發表文章

Hello World!

即將要搬家,因此舊網頁內容將慢慢轉移至Blogger。 如果要存取舊網頁,可以使用以下連結: https://wiki.tonylin.idv.tw/dokuwiki/doku.php
最近的文章

如何在VM上安裝DRBL?

由於某種原因最近在玩DRBL,但我的個人電腦被老媽拿去掛王者之劍。可憐的我只好用剩下唯一的電腦並開啟兩個VM來熟悉DRBL。在熙鈞教我DRBL之前,我先在Debian上安裝過DRBL Server,但DRBL Server必須使用本機的DHCP Server,並無法透過外部的DHCP Server去抓取Client。經過一番研究後,終於讓我可以完全透過VM去跑DRBL。 配備: 一台個人電腦 CPU: Intel i5-520;RAM: 4GB IP分享器 環境介紹: IP分享器使用PPPOE方式連ADSL,Broadcast 192.168.123.255,Gateway 192.168.123.254。 我們以ubuntu server 10.01為DRBL Server,並使用debian 500為我們DRBL Client。做為Client的主機其實不需要安裝OS。 如下圖,將兩個Linux映象檔的網路卡設定為橋接介面卡。其中DRBL Server主機要設定兩個介面卡,一個為連IP分享器的DHCP,一個為本機的DHCP。 設定步驟: 首先設定Ubuntu的網路卡。我們設定eth0為透過ip分享器連WAN的網卡,而eth1為DRBL所使用的subnet,如下圖所示。 這裡之前已經有修改dhcp設定檔,將網段設為10.68.0.x,因此在eth1中只需要將address設為gateway即可。下圖為先前測試同一個Switch下,兩個DHCP Server同時存在時,是否可正常運作的擷取圖。 有序列表項目Ubuntu主機執行”/opt/drbl/sbin/drblpush –i”,去收集Client網卡資訊。在到下圖 的畫面時,詢問使用者哪張網卡是連外部網路,這時輸入eth0(預設)。之後到達詢問使用者是否要收集Client Mac時,輸入Y。否則在同一個Switch下,我們的Client無法得知要向哪一個DHCP Server請求。 在DRBL Server收集Client時,將Debian主機重新啟動並以Lan的方式開機。過一陣子後,會如下圖 ,抓到我們Client的網卡,接著按2繼續開始瑣碎的DRBL設定。 在DRBL設定完成後,我們Debian主機在以LAN的方式開機,就可以看到如下圖的方式開機了。

設定RIDE儲存的line separator

Problem 由於開發人員喜好的開發環境不同,可能會遇到有人在windows與linux不同環境上開發robot,而造成code merge或是code review上的困擾。而最大的元兇就是換行字元。 How to resolve? 在ride中,有提供換行字元的設定,可以在Tools > Preference > Saving中找到Line Separator。原本設定為native,我們統一為linux的LF格式:

Setup HTTP + PHP with docker

Introduction 過去我架設網站的方式不是用實體機器的OS,就是透過VirtualBox,不然就是VMWare ESXi。因為我對Docker不熟,所以這次趁著要報廢舊機器,開始嘗試使用Docker架站。本篇記錄我在Rocky Linux 9.2上的設定過程。 Steps Install Docker and Docker-Compose 在Rocky Linux 9已轉變為使用podman去管理容器,所以當我執行下方指令時,實際上會更新podman與安裝podman-docker。 sudo dnf install docker 如果直接使用docker-compose去安裝,會找不到對應的package。參考網路作法是要自己下載額外處理,所以我直接使用Rocky Linux的解法: sudo dnf install podman-compose Prepare files 在撰寫dockerfile或docker-compose過程,跌跌撞撞。在這奉勸一句,對於不熟悉的項目,尤其和軟體或系統設定有關,“千萬”別照抄Chatgpt,否則你解問題的經驗值會暴增。我最後是基於 這篇文章 內容,去修改並解決相關環境問題。此作者結構設計非常清楚,app資料夾負責放對應的web應用程式,以我來說就是dokuwiki;php資料夾放置獨立php-fpm container的dockerfile,方便調整環境設定;最後就是docker-compose與nginx的設定檔。 ├── app │ ├── index.php │ └── dokuwiki ├── docker-compose.yaml ├── nginx.conf └── php ├── Dockerfile └── php.ini docker-compose.yaml 這裡須注意的是depends_on去控制啟動順序,而links讓nginx可以存取php,因為naginx會把php的request forward到9000的port。這裡須注意的是depends_on去控制啟動順序,而links讓nginx可以存取php,因為naginx會把php的request forward到9000的port。 version : ' 1 ' services :

Docker - Basic Commands

Images 查詢images: [ root @ localhost ~ ] # docker images Emulate Docker CLI using podman. Create / etc / containers / nodocker to quiet msg. REPOSITORY TAG IMAGE ID CREATED SIZE localhost / http-sample_http-service latest f8dec1371ce9 9 hours ago 44.4 MB docker.io / library / nginx alpine 529b5644c430 2 months ago 44.4 MB 刪除image: docker rmi image_name Containers 查詢所有containers(包含停止): [ root @ localhost ~ ] # docker ps -a Emulate Docker CLI using podman. Create / etc / containers / nodocker to quiet msg. CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f81f36b9cee1 docker.io / library / nginx:alpine nginx -g daemon o... 9 hours ago Created 0.0.0.0: 80 - > 80 / tcp http-sample_nginx_1 621e03be78a6 localhost / http-sample_http-service:latest nginx -g daemon o... 9 hours ago Exit

How to install RIDE on Windows?

Introduction 多年沒在Windows上開發RobotFramework,趁著這次整理一下RIDE安裝方法。 目前RIDE最新版本與Python對應版本如下: (3.6 < python <= 3.11) Install current released version (2.0.8.1) with: pip install -U robotframework-ride 安裝Python 直接到Python官網找尋最新的3.11版本,我使用3.11.9: link 。安裝就是一直下一步而已。 安裝wxPython 每次安裝RIDE最困難的都是wxPython。看了一下 官網 描述,我就姑且相信一下: 接著進入下 載頁面 就有安裝教學。基本上就是到Python目錄下的Scripts直接執行以下command: pip install -U wxPython 安裝RIDE 接著就如RIDE官網所說,執行以下command: pip install -U robotframework-ride 啟動RIDE 直接在相同目錄下執行ride就可以啟動了,你也可以直接在桌面建ride連結,加快下次啟動時間。 沒想到這次這麼順利就安裝完成了。因為我是使用java去啟動robot framework,就不特別講要怎麼使用pip安裝robot framework了。

無法預期的輸入

Problem 在寫測試案例時,我想不是每一個method都會有預期的輸入吧?像是時間或是執行期間產生的物件都是有可能的。舉例來說,我有一個MessageSender的類別提供了send method替我發送訊息。對caller而言,address、account、password是讀取資料庫而來,message是由user輸入但會夾雜timestamp。這樣我在寫的時候不就沒辦法先設定好expect的message嗎? 也許可以把它拆成純粹的message再加上一個date參數,但還是要面對一樣的問題。 public class MessageSender { public static void send ( String address, String account, String password, String message ) {   } } How to resolve? EasyMock提供了anyBoolean、anyByte、anyChar、isA甚至anyObject的函式替你解決這個問題。以上述的問題來說,我們可以這樣寫: @Test public void testSendMessage ( ) { PowerMock. mockStaticPartial ( MessageSender. class , "send" ) ; MessageSender. send ( EasyMock. eq ( "192.168.1.110" ) , EasyMock. eq ( "user" ) , EasyMock. eq ( "password" ) , EasyMock. isA ( String . class ) ) ;   PowerMock. expectLastCall ( ) . once ( ) ; PowerMock. replay ( MessageSender. class ) ; } 前三個參數很確切的知道內容是什麼,所以我透過EasyMock.eq將內容交給EasyMock的Matcher物件。而第四個參數我不確定到底是什麼字串,所以我透過isA確保它是

My Applications

這裡收集著我以前寫過比較有點功能的軟體,但不包含計畫與工作相關的內容。 Facebook版國軍登出倒數計時器 服役時興起且有時間,於是基於Facebook上,開發了一個可以計算自己還有多久退伍,並與朋友比較誰菜蟲多的應用程式。 SVN權限管理工具   這是在念研究所時,修習OOAD(物件導向分析設計)所開發的小軟體。讓我們可以透過Web的方式去管理在Subversion上的權限。提供使用者、群組,與權限管理之功能。  我的單字卡   這是為了追一個女生所開發的軟體。主要是提供建立與瀏覽單字卡之功能,原訂功能還包含管理與多國語言,但因把妹失敗而作廢。  Cube P2P模擬軟體  別人委託幫忙開發的軟體,從現有的程式去修改。工作內容為架構調整、維護、增加效能與量測節點加入與離開效率的功能。軟體詳細資料無法公佈。 證卷資料收集軟體 別人委託幫忙開發的軟體,主要功能為收集線上股票資訊至Excel或資料庫中,以做統計用途。  玩具戰爭遊戲補助程式  為了節省遊戲時間,所開發出的補助程式。