rpm 的幾個必要用法:
安裝:
rpm -i lcdctld-1.0.0-1.i386.rpm
rpm -ivh lcdctld-1.0.0-1.i386.rpm #加上 vh 是顯示安裝進度及狀態
rpm -i ftp://your_site/lcdctld-1.0.0-1.i386.rpm #從 ftp 站下載並安裝
升級:
rpm -U lcdctld-1.0.1-1.i386.rpm
rpm -Uvh lcdctld-1.0.1-1.i386.rpm #加上 vh 是顯示升級進度及狀態
移除:
rpm -e lcdctld-1.0.0-1.i386.rpm
求助:
rpm –help
man rpm
如何了解目前 rpm 包的一個狀態(用個大陸用法”包”,別介意):
檢查是否有檔案被誤刪:
rpm -Va
查詢檔案屬於哪個包:
rpm -qf /usr/sbin/lcdctld
查詢包的資訊
rpm -qpi lcdctld-1.0.0-1.i386.rpm
查詢包裡面的檔案會被安裝到哪兒
rpm -qpl lcdctld-1.0.0-1.i386.rpm
怎麼建立包
建立包的程序,你可以參考上一篇的程序.
.spec 的格式說明
要注意的一點,一般一個包,裡面會包含 Source 和 Binary.
Header
.spec 檔是挺重要的檔案,有幾個 header,咱們必得放進去:
Summary:放一行簡單的說明
Name:放包的名稱
Version:放包的版本
Release:放包的釋出編號
Copyright:放包的版權宣告,譬如:GPL,BSD,MIT,public domain, distributable或 commerical
Group:包的分類,參考後面的附表一
Source:來源檔案的檔名,可以有多個,多個的時候,則用 Source0, Source1…
Patch:修正包的檔名,同樣地,可以有多個,多個的時候,用 Patch0, Patch1…
[*]BuildRoot:指定一個安裝路徑,通常命名為 name-root.
description 則可有可無~,建議是放上去,作一個詳細的說明,因為 Summary 提供的說明只有一行而已
Sections
prep:這個 section 一開始通常是放 %setup,%setup會先把SOURCES裡面的包解開放到 BUILD 目錄,再切換到該目錄下.再者就是 %patch,可以讓你對源碼作 patch 的動作,如果你前面的 header 有多個 patch 檔,那麼這裡只要用 %patch0 -p1 %patch1 -p2 就行了.
build:這個 section 則是建立.我參考 thttpd.spec, thttpd.spec 在這裡是放 configure 的動作,我認為此處也可以順便做 make的動作,反正都已經解開也patch過,Makefile 也出來了.不過一般似乎都是已經先 make 好了.
install:這個 section 就是放安裝的動作了,在這裡除了用笨方法 %{__mkdir}, install..等一些 shell script 去安裝之外,還可以用 make install 去安裝,這正好證實了我的推論,在 build section 中可以用 make.
clean:把之前在 prep section 解開放到 BUILD 的目錄給移除掉.
可有可無的Sections
pre:作安裝前的準備,yes, 就是 On_BeforeInstall
post:作安裝後的處置, yes, 就是 On_AfterInstall
preun:作移除安裝前的準備, 嗯, 就是 On_BeforeUnInstall
postun:作移除安裝後的擦屁股動作,就是 On_AfterUnInstall
files Section
這是一個很重要的 section, 他記錄了這個包有放什麼檔案到什麼地方.
簡單的用法就是寫
/usr/sbin/lcdctld
直接以絕對路徑+檔名指明,當然這樣子很累啦.
rpm 包有提供一些 macro 讓你省去這樣子的功夫.
%doc
%config
%dir
%defattr
%files
%doc 的位置是 /usr/doc/name-xx.xx.xx-xx, 你可以這麼用: %doc README INSTALL HISTORY ChangeLog
%config 就是指一些設定檔,例如: /etc/xxxxxx
%dir 表示特定屬於這個包的目錄,舉例來說就是 /etc/httpd/
%defattr 設定檔案的屬性,語法是 %defattr (mode,owner,group) filename
%files 看不懂,我猜應該跟直接列出檔名是一樣的
不過我看 thttpd.spec, %dir 可以直接用 /etc/httpd 來代替,前面不需要加上%dir, %defattr 則可以用 %attr 來代替.
changelog Section
這主要是讓維護包的人,可以放歷史紀錄,格式是
* Fri Dec 14 2001 Ellery Tsai
– do nothing, but eat, drink, sleep.
打包
打包的語法是:
rpm -ba lcdctld-1.0.0.spec
或
rpm -bb lcdctld-1.0.0.spec
ba 跟 bb 的差別是,ba 會連 source 和 binary 都打包,結果會產生兩個 rpm ,而 bb 只包 binary,只出現一個 rpm.
其他還有一些用法:
列出 files section 的檔案
rpm -bl lcdctld-1.0.0.spec
只做某些步驟,我猜想是便於內部測試用:
rpm -bc lcdctld-1.0.0.spec
rpm -bi lcdctld-1.0.0.spec
rpm -bp lcdctld-1.0.0.spec
建議
建議最好是先到 SOURCES 去手動一步一步來
先解開 tar 檔,並且先複製一份,並更名為 name-xx.xx.xx.orig,這主要是為了方便製作 patch 用.接著,依照說明去作:
patch
configure
make
make install
在 make install 的時候,順便把檔案位置都記下來,然後再把位置放到 .spec 檔中的 files section 裡面.
如果在前面幾個步驟,有需要修正一些東西,那麼表示你要做一個 patch 檔
作 patch 檔的語法如下:
diff -uNr name-xx.xx.xx.orig name-xx.xx.xx > name-xx.xx.xx-linux.patch
接著到 .spec 檔裡面的 patch header, 作修正.
最後
Yes, That’s All.
資料來源:RPM HOW-TO
此份文件在 \\xserver\linux\Datasheet\Linux-HOWTOs\English_pdf 這裡有.
附表一:
Amusements/Games
Amusements/Graphics
Applications/Archiving
Applications/Communications
Applications/Databases
Applications/Editors
Applications/Emulators
Applications/Engineering
Applications/File
Applications/Internet
Applications/Multimedia
Applications/Productivity
Applications/Publishing
Applications/System
Applications/Text
Development/Debuggers
Development/Languages
Development/Libraries
Development/System
Development/Tools
Documentation
System Environment/Base
System Environment/Daemons
System Environment/Kernel
System Environment/Libraries
System Environment/Shells
User Interface/Desktops
User Interface/X
User Interface/X Hardware Support
VFP7研討會後報告
我想這個研討會對各位應該是沒有什麼關係才對~~
為了避免浪費大家的時間,我就在這裡做個簡短報告,如果有興趣摸摸看的話,再私下來找我~
首先我假設各位已經使用過 6.0 了~
7.0 與 6.0 其實差別性不大,幾個重點:
1. UI 加強,以前沒有 IntelliSense,現在有了,什麼是 IntelliSense, 簡單的說,就是像VB一樣,我隨便打個 rsCustomer. (假設rsCustomer是adodb.recordset),VB 就會很貼心的跑出一狗票方法跟屬性讓你選.
2. COM 加強,之前的版本建立 COM 物件,實際上並沒有實做出所有應有的 Interface,以及建立標準的 IDL (Interface Definition Language),所以在某些特定的情況有問題.現在除了遵循標準之外,也更加強了控制 COM 物件的能力.
3. XML 與 Web Service, 提供了三個函數來支援 XML 與 Cursor 之間的轉換,並且多了一個精靈來產生 Web Service,這個精靈實際上是應用 SOAP ToolKit 2.0 sp2 來產生 Web Service 的.
4. Database 提供 Event 以及 OLEDB Provider, 這個我認為不是很重要,因為現在用 vfp 資料庫的人越來越少了.
說完以上幾點,大概就沒什麼了,也因此,這次的研討論,前面廢話一陣之後,直接就介紹 XML 的三個函數與 Web Service 精靈,介紹的範例寫的不錯,令人能一目了然.
會畢,大家提出一些問題~有兩個問題是讓我比較印象深刻的
1.關於 Microsoft 是否繼續推廣 VFP 的問題,基本上,我覺得問的人很笨,因為上課的人並不是微軟的人,就算是,他也沒辦法回答.我個人的答案是,目前桌上型資料庫的市場已經是 VFP 跟 ACCESS 獨大了,所有的敵人都已經死光光(Paradox,dBase,Clipper…等),他根本不需要再推廣,否則等於是拿石頭砸自己的腳.
2.有個傢伙問售後服務,他說能不能主動寄發 Service Pack 給客戶,或者在購買VFP的時候,能主動附上目前最新的 Service Pack. 否則的話,光華賣的補帖服務還比微軟好,因為補帖出貨的時候,連 Service Pack 都燒進去.那幹?還用正版.聽到這裡,深深覺得售後服務的重要性.
會後,填完問卷,還領了一張資源光碟,我還沒有看,待會我會放到 Server 上去.
報告完畢.
STL Container 的 destroy
因為工作的緣故,想要了解一下,如果我把物件丟到 STL Container 裡面的時候,C++會怎麼幫我 destroy, 所以寫了以下這支小程式來驗證一下:
#include <iostream> #include <string> #include <vector> class node { public: node(); node( string s ); node( char* s ); ~node(); private: string m_string; }; node::node() { m_string=""; cout << "initialize " << m_string << endl; } node::node(string s):m_string(s) { cout << "initialize " << m_string << endl; } node::node(char* s):m_string(s) { cout << "initialize " << m_string << endl; } node::~node() { cout << "destroy " << m_string << endl; } int main(void) { vector<node> vector_test1; vector<node*> vector_test2; cout << "Non-Pointer Version" << endl; vector_test1.push_back( node("test1") ); vector_test1.push_back( node("test2") ); vector_test1.push_back( node("test3") ); vector_test1.push_back( node("test4") ); vector_test1.push_back( node("test5") ); vector_test1.push_back( node("test6") ); vector_test1.push_back( node("test7") ); vector_test1.push_back( node("test8") ); vector_test1.push_back( node("test9") ); vector_test1.push_back( node("test10") ); cout << endl << "Pointer Version" << endl; vector_test2.push_back( new node("test1") ); vector_test2.push_back( new node("test2") ); vector_test2.push_back( new node("test3") ); vector_test2.push_back( new node("test4") ); vector_test2.push_back( new node("test5") ); vector_test2.push_back( new node("test6") ); vector_test2.push_back( new node("test7") ); vector_test2.push_back( new node("test8") ); vector_test2.push_back( new node("test9") ); vector_test2.push_back( new node("test10") ); }
執行以後的結果很有趣.
在我的機器上是這樣子的:
Non-Pointer Version initialize test1 destroy test1 initialize test2 destroy test1 destroy test2 initialize test3 destroy test1 destroy test2 destroy test3 initialize test4 destroy test4 initialize test5 destroy test1 destroy test2 destroy test3 destroy test4 destroy test5 initialize test6 destroy test6 initialize test7 destroy test7 initialize test8 destroy test8 initialize test9 destroy test1 destroy test2 destroy test3 destroy test4 destroy test5 destroy test6 destroy test7 destroy test8 destroy test9 initialize test10 destroy test10 Pointer Version initialize test1 initialize test2 initialize test3 initialize test4 initialize test5 initialize test6 initialize test7 initialize test8 initialize test9 initialize test10 destroy test1 destroy test2 destroy test3 destroy test4 destroy test5 destroy test6 destroy test7 destroy test8 destroy test9 destroy test10
這說明了幾件事情:
1.如果我不是利用 new 去建立物件,而是利用宣告建立物件的話
c++只是把建立好的物件複製一份到 container 中,接著就釋放他了
如果是利用 new 去建立物件,那麼在程式的最後,container 會自動呼叫每個元素的 解構子 destroyer 去解構,而無須我們再手動去解構他們.
2.vector 會自我成長,但是在成長的時候,會同樣利用複製的方式,把原本在 container 的資料複製到新的 container 裡面去,但這樣子不是很有效率
RPM製作簡單說明
在此直接以我在公司開發的 lcd daemon 來作為實例
首先把我的 lcd daemon 編譯過,得到 lcdctld, 假設為 1.0.0 版,release 第一次
接著,隨便在某個地方建立目錄,命名為 lcdctld-1.0.0
在裡面建立 /usr/sbin
然後把 lcdctld 放到 lcdctld-1.0.0/usr/sbin 裡面去
利用
tar cvzf lcdctld-1.0.0.tar.gz lcdctld-1.0.0
這個指令得到 tar.gz 檔案
把這個檔案丟到 /usr/src/redhat/SOURCES 裡面去
接著就是最重要的地方了
要編輯 lcdctld.spec 檔案
內容如下:
%define name lcdctld %define ver 1.0.0 Summary: MS-9507 LCD Daemon Name: %{name} Version: %{ver} Release: 1 License: Micro Star Inc. Group: System Environment/Daemons BuildRoot: %{_tmppath}/%{name}-%{ver}-root% description lcdctld is a daemon that listen MS-9507 device. %prep %setup -q %build %install rm -rf $RPM_BUILD_ROOT %{__mkdir} $RPM_BUILD_ROOT/ %{__mkdir} $RPM_BUILD_ROOT/usr %{__mkdir} $RPM_BUILD_ROOT/usr/sbin install -m555 usr/sbin/lcdctld $RPM_BUILD_ROOT/usr/sbin rm -f tmp %cleanrm -rf $RPM_BUILD_ROOT %files/usr/sbin/lcdctld
這裡面有很多東西,建議直接找個範本來修改比較好,我是直接拿 thttpd 的來作修改.
主要要修改的有上面的欄位:Summary, License, Name, Version, Group, …等等的
還有 %install 開始的地方,這裡主要就是寫複製檔案的 script.事實上, RPM 會自動把你 SOURCES 下的 tar.gz 檔解開,所以你只要把對應的檔案複製到 RPM_BUILD_ROOT 對應的目錄去就好了.
最後還有 %files ,如果這裡沒有東西,rpm 會發生錯誤.這裡主要是放檔案的列表,讓 rpm 知道這個 package 裡面有什麼檔案.
編輯好 lcdctld.spec 之後,輸入
rpm -bb lcdctld.spec
順利的話,你應該會在 /usr/src/redhat/RPMS/i386 目錄下看到 lcdctld-1.0.0-1.rpm 才對~~
你可以使用
rpm -Uvh lcdctld-1.0.0-1.rpm
來安裝
然後使用
rpm -e lcdctld-1.0.0-1
來移除
.spec 裡面的一些用法
%define -> 定義一些變數
%{xxx} -> 引用變數
%{_tmppath} -> 會指到 /var/tmp 下面
%{__command}-> shell的指令幾乎都可以引用,只是前面要加上兩個底線,例如 mkdir 就是 %{__mkdir}.
%prep
%setup
%build
%install
%clean
%files -> 這些都是表示特定的步驟,雜誌上只說在 %install, %clean, %files 要加東西而已,其他不清楚
我想這樣子在目前的使用上,應該就足夠了吧~
將來如果有新的發現,會在這個主題上繼續累加~
資料參考來源: Linuxer 雜誌第 12 期以及 Linux in a NutShell
Linux in a NutShell 只有說明 rpm 指令有哪些參數而已,完全沒有說明 .spec 檔要如何編輯
ASP.NET 的 ViewState
ViewState其實只是很普通的東西~~
簡單的說他就是 form 裡面的 hidden 欄位而已~~
現在在 asp.net 中,它已經被物件化了
我們只要這麼寫
ViewState("TestMe")="Nothing, just hidden."
在輸出的時候,它就會自動被輸出為
<form>
<input type="hidden" name="TestMe" value="!@#$!#@$"/>
</form>
這樣子的 html 碼.
而不需要像以往一樣自行去維護 hidden 欄位的值.
上面 TestMe 欄位的 value 我是隨便打的,事實上 asp.net 會對它作 base64 的編碼,以防止被別人看見~如果你覺得 base64 編碼太過於簡陋,你也可以選擇其他的編碼方式如: 3DES, MD5…等方式來作編碼,以防止被解析出來.
設定ViewState的方法有三種:
1.該目錄下的所有網頁都使用:這需要在 web.config 檔案中設定
<Pages EnableViewState="false"…/>
(p.s. web.config 檔案,事實上,JSP也有類似的用法,你可以互相對照一下)
2.在單一網頁中指定:這需要在每個 .aspx 前面加上
<%@Page EnableViewState="false"…%>
3.在每一個 control 指定:這需要設定該 control 的 EnableViewState 屬性,以 datagrid control 來說,用法如下:
<asp:datagrid EnableViewState="false…/>
如果你想設定編碼方式的話,則需要多加上
<%@Page EnableViewStateMAC=true %><machineKey validation="MD5"/>或<machineKey
validation="3DES"/>
雖然ViewState的內容可以編碼,但是建議還是不要把一些安全性的資料放在這裡.此外,利用這樣子的技術,有個缺點,就是會使得網頁傳遞的時候變慢,因為 form 的內容變多了~
如果想了解更多,請到這裡.
Breeze Center
星期天晚上和女友一起去逛了微風廣場~
我覺得他這個廣場的定位很清楚,就是定位在都會區上班的女性,都會新貴~有一定的消費能力.
所以這個廣場裡面賣的東西就很清楚啦~
大多都是名牌服飾,化妝品,保養品,spa之類的~
地下一樓到六樓就是賣這些東西.
七樓則有台隆手工藝館(應該是吧,希望沒記錯)提供一些實用,美觀的五金用品,這裡倒是蠻不錯的.
八樓和九樓則是國賓電影院,七樓跟地下一樓都有售票口~.
地下一樓還有日文書店,裡面全都是日文的書,沒有任何中文書,只有部分中文雜誌,如果要找一些日文資料,倒是可以來這裡找.
地下二樓則是美食街,地下三樓則是 super market, 有賣一些現成的菜餚,可以直接買回去,還有一些日本的泡麵,調味料以及食品.
在 2F 還有露天的咖啡館,蠻具風味的
而地下一樓除了售票口之外,居然可以從天井仰望到天空
常令人搞不清楚是地下一樓還是一樓 .
再加上地點絕佳,短短時間,聽說已經吸金三,四億元
真的是很佩服這個人~
好像是上一期還是這一期的數位周刊(or時代??)有刊載出來~~
有興趣的人可以去翻閱一下