顯示具有 工作 標籤的文章。 顯示所有文章
顯示具有 工作 標籤的文章。 顯示所有文章

2021/09/16

Just a Note: Install Podman in WSL2

當初是因為 docker desktop 要開始收費,所以進行了很初期的 survey,不管是 docker 還是 podman,基本上在 windows 上不外乎就是透過 virtualbox/wsl 載入能執行 docker/podman 的 linux 系統,對於不熟 linux 的人(像我),程序難免複雜。
而這一年來,使用過 rancher-desktop、podman、minikube,在 windows 上的發展也都相當健全,我認為也都很容易便可當作 windows 上容器化技術的開發工具,不需要像初期一樣大費周章了。
rancher-desktop:https://rancherdesktop.io/
podman:https://podman.io/
minikube:https://minikube.sigs.k8s.io/

rancher-desktop、podman 會使用 wsl,minikube 則可以選擇 virtualbox 或 hyper-v 作為 hypervisor,有點像早期的 docker-toolbox。
我個人比較偏好使用 wsl 的 rancher-desktop、podman,主要是因為當要使用 container volumn 時,多透過一層 hypervisor 在設定上比較繁瑣,先前用 virtualbox 時,這部分常踩到雷。
rancher-desktop 可選擇 containerd 或 docker 作為 container runtime,對於原本習慣用 docker 的人應該會比較熟悉,在家試一些新東西時,主要都是使用 rancher-desktop;
podman 初期接觸的契機是因為工作,Red Hat 在 OpenShift 上主推的 container runtime 就是 podman,後來也因為 k8s 對於 docker 的支援上存在一些爭議與討論,所以工作上主要就都改用 podman,雖然還是只用在類比 docker command 上就是了。現在新的版本已經直接支援 docker api (模擬),也就是說安裝了 podman for windows 後,可以直接使用 docker 指令,但畢竟不是原生 docker,應該還是會有一些出入吧;
至於 minikube,是公司的分享會介紹的,只有簡單使用過,但因為會產生 virtualbox 或 hyper-v 的 vm,有些資安議題上的爭議,再加上前面提到的 volume 議題,所以我個人就不太偏好了,不過畢竟是公司在推廣的工具,所以還是加減看看。

近幾年容器化技術發展快速,無論使用哪套工具,在 windows 上皆已相當方便,原本複雜程序的文字就還是留著作為歷史紀錄吧!

2022.09.10 中秋

2016/10/11

Just a Note:Use GIT as SVN Client

2016.10.03 補充:
略過不要 fetch 的目錄。

當團隊中有人使用非 Windows 系統時,可能會發生 svn 中出現 Windows 無法接受的字元的目錄,
即使事後刪除了,但這樣的資訊仍會存在 history 中。

若此時使用 git svn 進行 fetch,便會發生無法建立目錄的錯誤。
此時可以透過 sparse checkout 避開這樣的目錄,具體步驟如下:

1. git config core.sparseCheckout true
2. 查看 .git/info 目錄下是否有 sparse-checkout 檔案,若無,新增一個。
3. 在檔案中加入
/*
!不要的目錄路徑

4. 重新執行 git svn rebase 或 git svn fetch

5. 即使加了上述的設定,在 git svn rebase 時,還是會有問題,此時就必須額外加上 --ignore-paths 忽略有問題的路徑:
git svn clone some_svn_url . -s --prefix=svn/ --ignore-paths="^(?:trunk|branches|tags)/不要的路徑"
git svn rebase --ignore-paths="^(?:trunk|branches|tags)/不要的路徑"


沒想到已經三年沒寫筆記了......

2016/04/07

Just a Note:Git Submodule

紀錄 git submodule 多人共用的情境與步驟。

1. 第一個新增 submodule 的人
git submodule add -b [submodule_branch] [submodule_url] [submodule_folder] (submodule_folder 需不存在,會產生或更新 .gitmodules)
git submodule init (register submodule in git)
git submodule update (把 submodule 的檔案更新回來)
git add .
git commit -m "add submodule"
git push

2. 其他人
git pull (submodule 目錄會是空的)
git submodule init (register submodule in git)
git submodule update (把 submodule 的檔案更新回來)

3. 更新 submodule:
(1) 在 submodule 原始的 repository (不是在此系統的 repo 下)修改,按照標準 git 程序進行更新。
(2) 直接在此系統的 submodule 目錄下進行修改:
cd [submodule_folder]
git add [stuff]
git commit -m "[comment]"
git push origin HEAD:[submodule_branch]

4. submodule 有更新,第一個處理 submodule 更新的人
git submodule update --remote (更新 submodule 檔案及 local git 紀錄的 submodule hash)
git add .
git commit -m "submodule update"
git push (如此 remote server 的 submodule reference 才會更新,否則其他人都還是會用到舊版的 submodule)

5. 其他人
git pull
git submodule update


參考:
Git submodules: Specify a branch/tag
http://stackoverflow.com/questions/1777854/git-submodules-specify-a-branch-tag
Git Submodule 的認識與正確使用!
http://josephjiang.com/entry.php?id=342
Issue with adding common code as git submodule: “already exists in the index”
http://stackoverflow.com/questions/12898278/issue-with-adding-common-code-as-git-submodule-already-exists-in-the-index
How do I remove a Git submodule?
http://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule
git submodule update --remote vs git pull
http://stackoverflow.com/questions/19619747/git-submodule-update-remote-vs-git-pull
git-submodule(1) Manual Page
http://git-scm.com/docs/git-submodule

2015/11/22

Just a Note:Simple Git Server on Windows (Using git daemon)

As Server

f:
md reop
cd repo
git init --bare xxxx.git
git daemon --verbose --base-path=f:/repo --export-all --enable=receive-pack



  • --verbose:開啟詳細 log,加了之後除錯比較方便。
  • --base-path=f:/repo:告訴 deamon 你的 git repository 統一放在哪個目錄下,可以在此目錄下建立不同的 git repository。以上述的例子,就是 xxxx.git 的父目錄。
  • --export-all:允許 pull base path 下所有的 git repository
  • --enable=receive-pack:開放匿名存取,目前還沒研究怎麼在 git daemon 裡做 access control。

As Client

git config --global sendpack.sideband false

  • Client 要設定此參數,在 push 時才不會 hang 住。

git clone git://yourserver/xxxx.git

  • git://yourserver 便會指到 daemon 的 base path,後面的 xxxx.git 就是在 base path 下建立的 git repository。

2014/07/21

Just a Note:Jetty Runner

說明:
Jetty/Howto/Using Jetty Runner

下載:
Jetty Runner Download

看起來只有 for Jetty 7.x 和 8.x 的版本,不過應該已經足夠。

基本的需求是:
1. 把 Web Application 當作 stand alone 的應用程式部署。
2. 檔案愈少愈好。

如此便只需要 jetty runner 的 jar 檔和 application 的 war 檔共兩個檔案,透過 command line 便可以啟動 application,如此對 Application Server 的依賴度就會降低。

啟動程式:

java -jar jetty-runner.jar --path /myapp myapp.war

2014/07/17

Why Do I Choose Redmine for Issue Tracking?

必須先說明,工作以來用過 Mantis、Clear Case、Trac、Redmine 等 Issue Tracking System,Clear Case 要商用軟體就不用談了,真正有實際架設經驗的只有 Trac 和 Redmine,會選用 Redmine 作為主要 Issue Tracking 系統的原因如下,主要還是跟 Trac 進行比較:

1. 原生支援整合 Subversion、Git。
 這段分析對 Trac 比較不公平一些,之前使用 Trac 時,經歷了整合 Subversion 1.4.x、1.5.x、1.6.x 和 Git,每一階段都很痛苦,因為 python 的版本、Trac 版本、相關 plugin 版本的配合著實令人頭痛。後來改用 Redmine 時,Subversion Server 已經固定使用 1.6.x 版,所以只要選用支援的版本,基本上就可以無痛整合;另外隨著 Git 的普及,原生整合 Git 對我來說也是相當重要的功能。我之前同時嘗試用 Trac 和 Redmine 整合 Git,但最後 Trac 沒有試成功,而 Redmine 則是無痛整合。

2. 較完整的使用者/權限管理/設定,使用者亦可自行進行密碼變更。
 之前用 Trac,沒有使用者自行管理密碼的功能(可能需要額外安裝 plugin),使用者的密碼都是管理者設定後便固定不變,其實這樣有點怪。

3. 較完整的專案管理/設定
 原生支援 multiple projects、子專案,透過 Web 管理介面便可進行專案的建立與設定。Trac 則是需要先建立一個 template,每要開一個新的專案,就需要複製實體目錄,再手動進行 config 的修改,操作門檻較高,且基本上 Trac 各專案均為獨立個體,只能透過 Web Server 設定,「假裝」有一個統一的入口。

4. 原生支援 wiki/論壇/行事曆功能
 Trac 原生只有 wiki,論壇、行事曆均需額外安裝 plugin。真的經歷過安裝 Trac plugin 的痛苦,便能體會原生支援的美好。

5. Email 通知功能
 Redmine 原生支援。Trac 大概也是得安裝 plugin 吧......

6. 外部系統可整合 Redmine 的使用者,達到 Single Sign-On 的目的。
 目前已將 Subversion、Git、Jenkins 的登入統一由 Redmine 控管。



當然我的需求和考量的點不見得對每個專案與環境都適用,僅供大家參考。

網路上都說 Trac 架設的門檻高,根據經驗的確如此,當要使用其他 plugin 時,更是痛苦。不過嚴格說起來,其實 Redmine 的架設也不是真的很容易,要感謝 Bitnami 提供相當完整的 Installer,讓這些系統的架設變得更為容易。

2014/06/11

Just a Note:StandardPasswordEncoder 解析

StandardPasswordEncoder 是 Spring Security 提供的 class,僅有兩個 method:encode 和 matches,分別用來對密碼進行編碼及驗證。

StandardPasswordEncoder(CharSequence secret)
String encode(CharSequence rawPassword)
boolean matches(CharSequence rawPassword,String encodedPassword)

編碼的演算法基本上為 Hash,但並非單純的 Hash,其因子有三:
1. Secret:透過 Constructor 傳入,用來和 Raw Password 一起進行 Hash 的資料,通常為有意義的唯一值,例如帳號,以避免不同帳號、相同密碼產生出一模一樣的 Hash 值。
2. Raw Password:密碼明碼。
3. Salt:為一亂數,用來強化密碼編碼。

編碼的基本流程:
0. 使用者註冊時,輸入帳號、密碼。
1. 根據帳號 (Secret) new 出一個 StandardPasswordEncoder 物件。
2. 呼叫 encode,傳入密碼 (Raw Password)。
 (1) 產生 n byte 的 Salt。StandardPasswordEncoder 中會產生 8 bytes 的亂數。同一系統中,Salt 的長度需相同,除非連長度都當作產生 Hash 的因子保存下來。
 (2) 將 (1) 產生的 Salt、1. 傳入的 Secret、2. 傳入的 Raw Password 組合起來一起進行 Hash 運算,產生 Hash。StandardPasswordEncoder 採用 SHA-256 演算法,並針對資料進行 1024 次 Hash 運算。
 (3) 取得 Salt+ Hash (Encoded Password),存入資料庫。

步驟 2. (1) 加入了未知長度、且每次隨機產生的 Salt,即使使用相同帳號 (Secret)、相同密碼 (Raw Password),每次編碼出來的結果也不會相同;
步驟 2. (2) 進行了多次 Hash 演算,最後的結果就不會是以單純的 ASCII 字元產生出的 Hash,而是值域更廣 binary data,可以增加暴力破解的難度。

驗證的基本流程:
0. 使用者登入時,輸入帳號、密碼。
1. 根據帳號 (Secret) new 出一個 StandardPasswordEncoder 物件。
2. 呼叫 matches,傳入密碼 (Raw Password) 和從資料庫取得的 Encoded Password。
 (1) 從 Encoded Password 中取出 Salt 和 Hash。
 (2) 將 (1) 取得的 Salt、1. 傳入的 Secret、2. 傳入的 Raw Password 組合起來一起進行 Hash 運算,產生 Hash'。
 (3) 比對 (2) 產生的 Hash' 和 (1) 取得的 Hash 是否相等。相等則代表密碼驗證成功。


原則上透過 StandardPasswordEncoder 的 encode 出來的結果已經很難透過暴力破解取得使用者密碼了,不過也可以再進一步調整部分編碼的參數,例如:
1. Salt 的長度。
2. Hash 時 Salt、Secret、Raw Password 排列組合。
3. Hash 的演算法和次數。
4. Salt、Hash 的排列組合。
只要在 encode 和 matches 中使用相同的因子,便可以自訂出獨有的密碼編碼機制來強化密碼的保護。

如此一來,即便有內部人員可以直接存取資料庫,也無法取得使用者的密碼。

2014/03/07

Just a Note:Sun JCE 驗章問題

驗章時須使用 Public Key,一般來說,在 JCE 下使用已知的 Key 值建立 Public Key 的方式有兩種:

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(pubKey.getEncoded());
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PublicKey pubKey = keyFactory.generatePublic(keySpec);

RSAPublicKeySpec keySpec = new RSAPublicKeySpec(new BigInteger(modulus), new BigInteger(exponent));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKey pubKey = (RSAPublicKey) keyFactory.generatePublic(keySpec);

差別在於 Key 值的保存型態,
第一種存的是 Key.getEncoded() 的值 (http://docs.oracle.com/javase/7/docs/api/java/security/Key.html),
第二種保存的是 Public Key 的 modulus 和 exponent。而使用第二種方式時,通常我們亦會把 modulus 和 exponent 用 byte[] 保存。

最近遇到的問題是,
如果 Public Key 是透過 RSAPublicKeySpec 建立的話,會驗章失敗;使用 X509EncodedKeySpec 建立的話,則會成功。
但是把兩種方式建出來的 Public Key dump 出來 (getEncoded()),卻會得到一模一樣的值。

Debug 後發現,
RSAPublicKeySpec 建出來的 Key,其 modulus 是負數,
X509EncodedKeySpec 建出來的 Key,其 modulus 則是正數。

解決方式:
當 modulus 的第一個 byte 大於等於 0x80 時,需在最前面多放一個 byte 0x00,再轉成 BigInteger,即能正確取得 modulus 的值。

String modulusStr = "C868EEE8D1D300207EA65DB1DBBFD52552AE1814E07FDF23DE040EC96E6F0F35C8ECF922C11D7F39B3E3162B96881447D16B0FCC75FB0378F2B19AFB22884B8F2E2840C74FE73DBCDBF653E26070955BB9A4011C1EDD9E1DBA482F02091DBBFAD77D13F91A06FF76C8FDE1E4F475A2DFF8A9567C115F50ACCA573315F7723D333218E266984953D0642057C46D6F952CFC7CFAEAA8945FAEDE441ADA8497F0895C1AC18CE6679467F6EFEF5C741879487E94B8DAF87FA45E87FD011BB0A794B4F433B655959B6D1D8164793421A360A39E17A2287EE5CFE7200FF6FA3F407DD7FEC2EAA6C6A89BE5A3CE3073B758E56654C17CE17A3657E76E219E1BECA9115D";
byte[] modulusTmp = Util.hexStringToByte(modulusStr);
byte[] modulus = null;
if (modulusTmp[0] < 0) {
    modulus = new byte[modulusTmp.length + 1];
    modulus[0] = 0x00;
    System.arraycopy(modulusTmp, 0, modulus, 1, modulusTmp.length);
} else {
    modulus = new byte[modulusTmp.length];
    System.arraycopy(modulusTmp, 0, modulus, 0, modulusTmp.length);
}

2013/04/23

Those Days in DES Team


整理硬碟,看到自己過去做的案子、寫的 code,想起自己在 DES Team 的日子。

Genkey 程式
到公司半年後的 2003/3~2004/8 一年半間密集地做了五家銀行主機安控提升案的 Genkey 程式和部分的主機 SUIP 外加一個 Open 端安控系統的功能新增。剛開始甚麼都不懂,只會拿前人已經寫好的程式,複製、修改、測試,過了就當作 OK。

就這樣做了三個專案,上百個 java Panel (12+74+65),常常遇到改個字、調個位置就要同時修改數十支 java 檔。
後面兩個專案因為前面的痛苦經驗+客戶要求,所以把數十個 Panel 彙整成八個,然後另外寫了一個工具產生選單和設定檔,不用一分鐘,就可以完成原本一個 Panel 要做的事情。如果畫面有需要微調的部分,最多也就是改 8 支程式。對比前面三個專案,如果要全部重做,開發的時間大概可以從數週縮短為兩天。
之後又花了一些時間把 Genkey 和工具加以改良,可以同時支援檔案匯出(for 主機安控)和 IC 卡儲存(for Open 安控)。

對 2004 年那個甚麼都還不會的我來說,其實很有成就感,即使現在看來那些 code 寫得一蹋糊塗,但至少縮短了大量瑣碎工作的時間。

只是有趣的是,做完這些之後,我就被派去支援端末,開始游牧民族般的專案生活,再也沒有碰過主機安控系統的開發。所以寫好的工具和程式就跟垃圾一樣一直躺在 file server 和我的硬碟裡,也沒有機會在任何專案中驗證。大概也沒人知道那套程式可以支援 IC 卡儲存。

PS. 後續有兩三個主機提升案曾拿去使用,但據我所知都是加上 Panel 複製、修改的混合體了。

留職停薪
2005/6,在支援端末又被調回後,決定留職停薪。會這麼做要感謝兩個貴人,因為他們很樂於分享,但是很多名詞我都聽不懂,即使是一些很基本的 java 概念。
美其名寫了 3 年的 java,其實當時我連 extends 和 implements 都搞不懂,也不知道甚麼是 abstract class 和 interface,別人明明寫好的 i18n 程式被自己改成 hard code 文字還感到很得意可以省下 native2ascii 的時間。
所以我決定留停 K 書考認證。原本計畫要考 SCJP 和 SCWCD,但惰性比自己預期得來的強大,所以最後草草 K 了 3 週、趕在 voucher 過期前去考了 SCJP,超低空飛過。
2005/10,WOW 開始公測,嗯...就不用多說甚麼了...

Security Server
2006/4,留職停薪後第一個正式參與的專案。
第一次從無到有寫 socket server、multi-thread、JCE 程式。其實一度因為寫不出來想放棄,所幸後來有把程式生出來交差......依然要感謝相同的兩個貴人,一個提供我很多建議、一個提供我範例程式且適當地回絕了我的推託。
接著又陸續調整,用在其他四、五個專案,相同的架構、介接不同的 HSM。
但因為工作分派的關係,幾乎都交接出去。
可能是我程式寫得很爛吧!即使花了很多時間做交接,感覺也沒人真的去了解我的想法、說了甚麼、寫了甚麼,得不到任何反饋。唯一的反饋當時覺得很刺耳,但的確也是我到現在都還不足之處。

不管是 Genkey 還是 SS,即使到現在,我都一直還覺得有很多地方可以改進、需要改善。
但說真的,想歸想,真的一點動力都沒有。反正大部分的人都覺得能跑就好了。



DES 的專案其實很有趣,完全就是看客戶環境決定你需要在甚麼平台、用甚麼程式語言寫程式。在留停之前的短短三年內,我寫過 COBOL、Java、C/C++、VB、ASP,碰過的作業系統有 OS2、Windows、RedHat、FreeBSD、CICS、IMS、AIX、AS400,雖然沒有任何一項能搬上檯面,但是在這些專案中,我想我大概理解了 SI 的意義。
時至今日,大環境並未改變,甚至更為複雜,我想,大概永遠只能當隻鼯鼠。


2013/03/23

Just a Note:SVN Repository Partial Merge

先描述一下情境,目的是要將自己開發環境的 svn 轉移到客戶的 svn repository。

客戶的 svn repository 事先就建立好,且有制定好的目錄結構,我們只是將 source 放到對應的路徑下。
現行的做法是,從開發環境 checkout 出最後一版資料,然後 commit 到客戶的 svn repository,視為全新的開始,過去的歷程就一筆勾銷。
然後開發人員便將 svn reporistory 重新指到客戶的環境。
這其實也沒什麼問題,因為客戶根本不需要知道開發期間資料來來回回異動的歷程。

只是對於沒事會常常去看歷程的人來說(<-- 就是我),歷程突然都沒了(除非連回原本的 repository),其實很困擾。

是不是有什麼辦法可以在移轉後保留原本歷程呢?因此有了這篇筆記。

2013/02/19

Just a Note:Convert Data between UTF16 String and Words

用 Java 很容易,用 javascript 完全沒頭緒......記個筆記,順便灌溉一下乾涸的 blog......

Convert data between UTF16 String and Words by using CryptoJS components.

Example:


<!DOCTYPE html>
<html>
<head>
<script src="core.js"></script>
<script src="enc-utf16.js"></script>
<script>
function testTo() {
    var data = document.getElementById("inputData").value;
    document.getElementById("result").innerHTML=CryptoJS.enc.Utf16LE.parse(data);
}
function testFrom() {
    var data = document.getElementById("inputData").value;
    var a = [];
    for(var i=0; i<data.length; i+=8){
        a.push('0x'+data.substring(i,i+8));
    }
    var words = CryptoJS.lib.WordArray.create(a);
    document.getElementById("result").innerHTML=CryptoJS.enc.Utf16LE.stringify(words);
}
</script>
</head>
<body>
<input type="text" id="inputData" />
<button type="button" onclick="testTo()">to UTF16-LE</button><button type="button" onclick="testFrom()">from UTF16-LE</button>
<div id="result"></div>
</body>
</html>


Get core.js, enc-utf16.js from CryptoJS.

Download the example code

2012/07/27

想想就好了

在現有專案型態下,即便是很類似的專案,我們也只是不斷地重新造輪,即使是號稱使用相同平台的專案,彼此之間也根本無法相容。

2012/07/23

Just a Note:參加 Java TWO 大拜拜的感想


1. 每個 topic 都只有不到一小時,很難深入描述,而且通常只能用很簡單的例子介紹"優點"。
2. 中午的便當還不錯。
3. 背包還不錯

2012/03/09

Message in a Bottle:Spring Batch DuplicateKeyException 處理紀錄(未解)


之前使用 spring batch,因為客戶要求寫 db 時,不能因為 primary key duplicate 而終止 batch。

所以我在 chunk 加了 skip-limit 的 property,並且設定

<skippable-exception-classes>
  <include class="org.springframework.dao.DuplicateKeyException" />
</skippable-exception-classes>

然後,昨天遇到了一狀況:
1. 查詢 batch_step_execution table 時,會發現 rollback_count 會是 write_skip_count 的兩倍。
2. 假設有兩筆資料 primary key 相同,且當 writer 是 db writer 時,會正確寫入一筆。
3. 承 2.,當 writer 是 composite writer 時 ( db writer + file writer ),這兩筆都不會寫入( db 和 file 皆如此)。

所以我在 chunk 後加上了

<no-rollback-exception-classes>
  <include class="org.springframework.dao.DuplicateKeyException"/>
</no-rollback-exception-classes>

承 3.,db 就正常了(寫入一筆),但是 file 依然兩筆都不寫。

還好 file 只是用來輔助檢查之用,經客戶確認可接受此狀況,所以就沒有繼續調整。

紀錄一下,看之後有沒有解決方法。

2011/12/01

Just a Note:MS SQL 查出包含 0x00 的資料

到底是誰沒事把 0x00 塞到 table 裡......


SELECT * FROM ( SELECT CHARINDEX(CONVERT(VARBINARY(1), 0X00),CONVERT(VARBINARY, aColumn)) AS IDX, * FROM aTable ) T WHERE IDX > 0

2009/04/04

始作俑者

 

 

 



上個月底公司公告更換防毒軟體,從Symantec EndPoint Protection換成Kaspersky。

好像有不少人更換後,就無法使用公司的無線網路,我也是其中之一,不過因為我都使用3G上網,所以一直沒有正視此問題。前幾天需要列印文件,發現完全無法連上公司的無線網路,重新設定的過程中,居然發生設定沒反應的狀況(沒錯誤訊息、也沒顯示該顯示的視窗),不禁懷疑是Kaspersky在搞鬼,然而停用了Kaspersky也無解、Google了很久都沒找到相關的問題。





今天檢查event log,赫然發現有大量的 RasMan(Remote Access Connection Manager) 服務啟動失敗的訊息,錯誤代碼是20035,Google "RasMan 20035",才知道原來兇手是移除不乾淨的Symantec EndPoint Protection。
Symantec EndPoint Protection將registry中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\PPP\EAP\13和HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\PPP\EAP\25中refrence到的dll都指向Symantec的SymRasMan.dll,而移除Symantec EndPoint Protection時並未還原此機碼值,但dll卻已經被移除了,造成上圖設定處無法進行設定,也造成無線網路無法透過Protected EAP (PEAP)進行認證(公司使用的認證方式),所以便無法使用公司無線網路。

我把家裡的這兩組 registry 設定匯入 notebook,便解決問題了。
不過看起來也蠻多人都挺正常的,所以目前不能確定在什麼樣的條件下,會造成這個問題。
我的作業系統是 Windows XP SP3。