Number Regex
13 May 2013
最近現場反饋, 有報表導出來的字段, 在Excel 打開後出現顯示錯誤的情況, 查看導出的內容, 發現是這樣的一個情況, 字段的內容本來應該是一個文本的, 比如這樣:
123456E1
這樣的文本, 在Excel 打開後, 顯示成這樣了:
1.23456E6
也就是說被識別成一個用科學計數法表示的數字了.
既然這樣, 那麼只能對這樣的文本進行一些特殊處理, 不能直接原樣輸出, 而是要輸出成Excel 的文本格式才行, 比如直接在字符竄的前後都添加上製表符(\t), 但是現在的主要問題就是要匹配到這些數字格式的字符竄, 進行這樣的特殊處理.
一開始考慮使用下面這個正則表達式來進行匹配:
\d+(\.\d*)?([Ee]\d+)?
這樣可以匹配到整數, 浮點數, 還可以識別到科學計數法格式的數字, 貌似已經可以滿足要求了.
不過經過測試很快發現, Excel 還可以識別到整數部分不存在的數字, 比如:
.23
整數部分被當作0 來處理了(Java 中也是如此). 看來還得對上面的正則表達式進行改造才行, 很直接的一個, 就是下面的表達式:
\d*(\.\d*)?([Ee]\d+)?
然後, 一經測試就發現這樣的表達式不正確了, 這個表達式允許整數部分和小數部分都不存在了...嗯, 這兩部分, 至少要有一個部分存在才行, 正則表達式貌似沒有這樣的操作符? 看來只能折騰一下, 再增加一個表達式來判斷:
\d*\.?\d+([Ee]\d+)?
咋一看, 好像這個表達式就可以滿足所有的要求了, 可以匹配整數, 小數, 還可以匹配整數部分不存在的數字...但是再一看, 小數部分不存在的匹配不上了(小數部分不存在的也是合法的數字形式, 在Excel 和Java 都是)...
用"|" 把這兩個表達式連接起來:
(\d*(\.\d*)?([Ee]\d+)?)|(\d*\.?\d+([Ee]\d+)?)
看起來這樣就可以滿足要求了, 嗯, 對了, 還需要再把正負號加上:
([+\-]?\d*(\.\d*)?([Ee][+\-]?\d+)?)|([+\-]?\d*\.?\d+([Ee][+\-]?\d+)?)
暫時就只能想到這樣了, 不知是否還有更簡潔的形式...
...Using Headless Virtualbox
12 Oct 2012
在Gentoo 系統裡面安裝了VirtualBox, 由於不想增加QT 的依賴, 因此去掉了圖形界面, 直接使用Headless 的方式, 也就是使用命令行來管理虛擬機了...
不過之前一直都是使用GUI, 突然換成命令行, 還真的相當不習慣呢...下面是嘗試創建一個XP 的虛擬機...
創建虛擬機
首先當然是先創建一個虛擬機了, 使用命令:
VBoxManage createvm --name xp --ostype WindowsXP --register --basefolder VirtualBox\ VMs/xp
這裡我是弄複雜了, 其實可以不需要再指定basefolder 了的, 命令會直接在默認的目錄下創建虛擬機的文件(會用虛擬機名創建文件夾先)...命令執行完成之後, 可以在對應目錄下找到名字為xp.vbox 的文件...
如果不確定虛擬機是否創建成功了, 可以使用命令查看當前的虛擬機列表:
VBoxManage list vms
修改虛擬機的網卡
因為我都是使用Bridge Adapter 方式進行鏈接的, 因此使用命令:
VBoxManage modifyvm xp --bridgeadapter1 wlan0
添加一個Bridge 類型的網卡, 注意這裡bridgeadapter1 中間是沒有空格的, 當然根據實際的情況, 可以換成1-4 中的一個.
磁盤控制器
接下來是添加磁盤控制器, 使用命令:
VBoxManage storagectl xp --name "IDE Controller" --add ide --controller PIIX4 --bootable on
這裡name 屬性是必須的, 值倒是無所謂, 隨便自己取名了...
添加磁盤控制器也是折騰了一陣, 一開始使用了下面的命令:
VBoxManage storagectl xp --name "SATA Controller" --add sata --controller PIIX4 --bootable on
想使用ICH6 的sata 控制器的, 結果不知道是我的機器不支持還是怎麼的, 出現錯誤, 於是改回使用PIIX4 了...
磁盤
添加磁盤, 找了好久命令說明, 發現沒有命令可以直接給虛擬機添加硬盤, 只能先創建硬盤, 然後通過其他命令綁定...創建磁盤使用命令:
VBoxManage createhd --filename xp --size 20000 --format VMDK --variant Split2G
在當前目錄下創建了一個20G 的VMDK 硬盤, 這個硬盤會拆分成10 個硬盤文件, 每個2G...這裡我以為也是不用指定目錄, 沒想到創建磁盤直接是把磁盤文件放在當前目錄了, 搞得我只好又手動將這些文件移動到虛擬機的目錄下...
可以使用命令查看當前的硬盤列表:
VBoxManage list hdds
綁定硬盤
將硬盤和虛擬機綁定, 找了好久, 最後才發現原來是使用下面的命令:
VBoxManage storageattach xp --storagectl "IDE Controller" --port 0 --device 0 --type hdd --medium /path/to/xp.vmdk
這裡面storagectl 的值是前面創建的磁盤控制器的名字, 這幾個參數都是必須的...最後面的medium 是磁盤的文件名, 這裡要使用絕對路徑...
添加一個光驅, 使用命令:
VBoxManage storageattach xp --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium emptydrive
這裡其實和前面添加硬盤差不了多少, 不過這裡要注意修改port 屬性的值, 另外, 磁盤控制器貌似默認只支持2 個port, 如果需要添加更多的磁盤, 那麼就需要修改磁盤控制器的PortCount 參數.
如果想給光驅插入iso 鏡像, 也可以使用上面的這個命令, 只是把emptydrive 替換成相應的iso 鏡像的路徑即可, 例如:
VBoxManage storageattach xp --storagectl "IDE Controller" --port 1 --device 0 --type dvddrive --medium /path/to/xp.iso
或許有其他方法可以直接往光驅裡面加載iso 鏡像, 不過暫時還沒有發現應該使用哪個命令...
其實如果了解virtualbox 虛擬機的xml 配置文件的定義, 也是可以直接修改對應的vbox 文件的, 對一些比較簡單的配置, 這種方式其實還更快捷一點...比如修改虛擬機的內存配置, 可以直接找到vbox 配置文件中的
<Memory RAMSize="128" PageFusion="false"/>
將其中的RAMSize 屬性改成自己想要的內存大小...
VBoxManage 還有好多命令, 可以參考VBoxManage Manual...
...JQuery + RequireJS
24 Sep 2012
最近弄的一個項目, 由於項目主體框架使用的是Primeface, 因此前端自動引入了jQuery.
在寫了一些代碼之後, 發現有不少函數是可以抽取出來公用的, 不過將這些函數放到單獨的文件又帶來一個比較麻煩的問題, 就是每次需要用到的時候, 都需要在頁面將對應的文件引入, 很是麻煩(因為這些函數也不是每一個頁面都會用到, 所以不想直接放在公共文件include).
由於之前看到過RequireJS, 稍微瞭解一點這個東東, 而且之前一個項目使用Dojo, 使用了AMD 的方式管理JS 文件的依賴關係, 因此這次很自然地想到使用RequireJS 來解決前面這個問題.
首先從requirejs.org 下載了最新的2.0.6 版, 也查看了一下RequireJS 裏面和jQuery 集成的sample, 只是發現這個例子裏面的jQuery 是經過一些處理的, 不過在require-jquery 查看了一下對應的源代碼發現, 其實原理並不難理解, 最關鍵是最後面的兩行:
1 if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
2 define( "jquery", [], function () { return jQuery; } );
3 }
在這裡定義了一個jquery 的模塊, 使得可以再外面進行引用, 但是由於我現在項目的jQuery 是Primeface 直接給引入的, 我已經不需要再引入一個require-jquery 了, 該怎麼辦呢?
琢磨了一下, 覺得可以直接參考require-jquery 的實現, 於是進行嘗試.
- 首先新建一個jquery.js 的文件
- 文件的內容很簡單, 和上面的也比較類似:
1 define( [], function() {
2 return window.jQuery;
3 });
- 在需要使用到jQuery 的js 文件a.js, 直接require 這個jquery:
1 require( ["./pathto/jquery", "otherjs"], function($, otherjs) {
2 // implement code here
3 });
測試比較簡單, 將上面這個a.js 通過requirejs.org 引入頁面最後面, 參考requirejs.org 上的做法, 如下:
1 <script src="pathto/require.js" type="text/javascript" data-main="pathto/a.js"></script>
完畢!
...Hello World!
23 Sep 2012
最近突然有種寫blog 的衝動, 又覺得在csdn, cnblog 這些地方, 實在有些不習慣, 於是就起了自己搭建一個簡單的blog 的念頭, 週五在網上找了一下使用markdown 寫blog 的東東, 才發現原來GitHub 已經提供有現成可用的東西, 而且貌似好些大牛也是這樣這樣弄的, 於是就決定在這裡開始我的blog 了!
PS: 經過這兩天的折騰, 總算不是白板一塊了, 稍稍有些樣子, 不是那麼單調了, 發現還真的不簡單啊, 還有好多東西要完善的, 比如category, tag 之類的, 另外分頁也還沒有弄好...2012-09-26
...