2012年11月17日星期六

預設開啟VIM的語法功能(syntax on)

以下方法是給用戶修改各自的vim設定

指令:
$ vim ~/.vimrc

若裡面有內容,在首行加上:
syntax on

2012年10月6日星期六

解決IE沒有min-width和min-height問題

由於IE(Internet Explorer)不支援min-width這個CSS屬性,如在大部份瀏覽器上做到最小寬度這個效果,可用以下小技巧。

min-width: 1000px; /* 在Firefox,Chrome,Opera有效 */
width: expression(document.body.clientWidth < 1000? "1000px": "auto" ); /* 在IE有效 */


請注意,document.body.clientWidth是Javascript Object。他對整個版面有效,所以使用時請因應情況看如何使用,例如改為document.getElementById('something').width使用。

2012年10月5日星期五

替Blogger上張貼的原碼加上CSS樣式

許多系統開發者或工程師也會在blog上分享自己的經驗和技巧,像小弟一樣。
但在Blogger上文章編寫器並沒有專為顯示原碼(source code)而設的樣式,大家也只能夠使用<code>來把原碼包括其中。

但這樣只能做到把原碼以mono風格字體顯示而已,像這樣:


這樣不夠突出和不利閱讀。

現在Blogger可以讓用戶自己修改CSS風格,也可加上自己額外的CSS碼。小弟利用了這個功能,為<code>這個HTML標籤加上CSS風格,以後所有被<code></code>包圍著的原碼都有特別的風格了。像這樣:

要加上自訂CSS的方法,在編輯Blogger版面,先選「範本」。
再在範本頁內的網誌即時狀態,按下「自訂」按鈕。


再在編輯範本的控制上選「進階」,再在其旁邊選最底的「新增CSS」。旁邊就會有一個文字輸入框可以自行加上CSS了。


小弟的CCS如下:

/* Start – Code Snippet */
code {
background: grey;
border: solid black;
border-width: 1px 1px 1px 10px;
font: 13px 'Courier New', Courier, monospace;
line-height: 16px;
margin: 5px 5px 5px 5px;
padding: 5px 5px 5px 5px;
color: white;
display: block;
}
/* End – Code Snippet */


這就會把所有<code>包圍著的原碼都會變成上面一樣,原碼都帶在灰框內,字體是mono的風格了。

閣下也可因應自己的Blogger風格編輯自己的CSS。

在Linux上使用支付寶

淘寶上有許多在街上難以找到的貨品,他們提供運送服務。Linux用戶也會想在淘寶找東西買吧?但使用淘寶買東西才要使用支付寶,而支付寶桌面版非得要先安裝其插件(plugin)才能使用他來付費。

幸好,支付寶已經有Mac跟Linxu版的插件,支援Firefox,Chrome,和Opera。
http://help.alipay.com/lab/help_detail.htm?help_id=251848#21



Linux版的支付寶插件其實是一個shell script並在最後的位置附帶其已壓縮的二進制文件(binary file),打開其shell script(aliedit.sh)可以看到像下圖的內容。




一般就是解壓後執行這個aliedit.sh就完成。但由於我使用的Arch Linux在運行這個shell script時失敗了,所以我做了一些手動。


剖悉:
在__ARCHIVE_BELOW__下面亂七八糟的就是已壓縮的支付寶插件,shell script就是把在用戶的home建一個.aliedit/install資料夾,把這串夾在shell script裡的插件內容讀成二進制(binary),然後馬上解壓並儲進~/.aliedit/install。

 解壓後會得出以下檔案:
install.sh
lib/
lib/libaliedit32.so
lib/libaliedit64.so
README

在lib/裡面有:
libaliedit32.so
libaliedit64.so

其實只要因應自己的系統是32位元(bit)還是64位元(bit),然後把相應的library檔用install -D指命複製到/usr/lib/mozilla/plugins/就OK了。


以我的系統為例子。

下載aliedit.sh到系統。

用以下指命取出哪一行是插件壓縮檔的開始:
$ awk "/^__ARCHIVE_BELOW__/ {print NR + 1; exit 0; }" aliedit.sh

我這裡得出的是第95行。請留意下面解壓指令的行數。

建立一個資料夾:
$ mkdir alipay_plugin

把壓縮檔取出同時解壓:
$ tail -n+95 aliedit.sh | tar xzvm -C alipay_plugin

解壓後看看alipay_plugin裡的lib資料夾,應該有libaliedit32.so和libaliedit64.so兩個檔。

若是用Firefox或Chrome/Chromium的話,依照自己系統的位元是library複製到Firefox插件庫:(我的系統是64 bit的)
$ install -D -m644 lib/libaliedit64.so /usr/lib/mozilla/plugins/libaliedit64.so
請注意!以上指命是把支付寶插件安裝給此電腦的所有用戶使用。若果只想給自己的話,請用以下指命:
$ install -D -m644 lib/libaliedit32.so ~/.mozilla/plugins/libaliedit32.so



大家各自的系統情況皆有不同,若無法直接執行aliedit.sh作安裝的話,大可留言一起研究。但請在留言時,請同時留下閣下的系統詳細資訊,最起碼留下系統屬哪個Linux發行本(Debian、Ubuntu、Gentoo之類),版本號碼,屬x32還是x64,等等…

2012年10月4日星期四

在sql*plus使用SID連接Oracle Database

一般在使用sql*plus連接Oracle Database前,必需要先設定tnsnames.ora並為要連接的資料庫加上SID或Service Name。

這個實在是很麻煩的一個設定。而且自己也不一定是系統管理員。所以要有辦法不用設定tnsanames.ora也能用SID經sql*plus連接到資料庫。只要在sql*plus指令內使用connection string就能直接用SID連接了。


$ sqlplus username/password@"(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(Host=IP or hostname)(Port=port))(CONNECT_DATA=(SID=sid)))"

2012年6月22日星期五

查看Oracle資料庫(database)的記憶體使用分配

要查看Oracle資料庫的記憶體使用情況,可以DBA用戶執行以下指令:

  $ sqlplus / as sysdba > show sga;


2012年6月13日星期三

查看Oracle Database的系統記錄檔(error log)的儲存位置

使用sysdba用戶登入:

$ sqlplus / as sysdba 


用以下SQL去查看系統記檔的儲存位置

> SELECT value FROM v$parameter WHERE name='background_dump_dest';



> show parameter BACKGROUND_DUMP_DEST

結果會顯示系統記檔的儲存位置


部份資料源自:http://www.adp-gmbh.ch/ora/concepts/alert_log.html

2012年6月12日星期二

Arch Linux上暫停某套件的更新

在/etc/pacman.conf裡,找IngnorePkg並在後面加上不想更新的套件名稱。例如:
IgnorePkg = jre jdk

2012年6月7日星期四

INNER JOIN大不同


在使用LEFT JOIN時,遇到了結果不對的問題。
在StackOverflow找到了答案:http://stackoverflow.com/q/354070/822864


使用StackOverflow上的例子解釋一下。

以下兩句SQL回來的結果,看來是一樣。而且例子1在JOIN的條件上已有Orders.ID=12345這個名似是一個篩選條件,想來合併速度定必更快。

例子1:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID AND Orders.ID=12345



例子2:
SELECT *
FROM Orders
LEFT JOIN OrderLines ON OrderLines.OrderID=Orders.ID
WHERE Orders.ID = 12345



但事實並非如此。

例子1的執行結果會把OrderLines裡的記錄全都合併進去,而只有符合OrderLines.OrderID=Orders.ID和Orders.ID=12345這兩個條件的才會被連結成一個記錄。

而例子2則能輸出我想要的結果:把兩個表格合併並只出現Orders.ID = 12345的記錄。

根據現代的資料庫,他們一般也有優化SQL邏輯的能力。這種老掉牙JOIN語法,優化器是種得把集合處理好的。



*測試和使用環境是Oracle Enterprise Database 11g Release 2

2012年4月13日星期五

列出所有用戶名及群組名

這是一個小分享。

不是所有的Linux發行本也有指令讓系統管理員列出所有用戶名和群組,以下是兩個簡單的Shell指令作上述用途。

列出用戶
cat /etc/passwd | cut -d: -f1

列出群組
cat /etc/group | cut -d: -f1

簡單解釋一下
cat /etc/passwd | cut -d: -f1

cat /etc/passwd | 將/etc/passwd這個存放用戶資料的檔案列出並用|引導(pipe)到cut指令。
cut -d: -f1將從/etc/passw引導出來的文字作分割,用:作分隔符號,並將第一個(1)分隔出來的字眼列出。

2012年4月12日星期四

RHEL的auth.log沒有記錄?

要找登入的記錄,在一般的Linux也是去找/var/log/auth.log。但Red Hat Enterprise Linux或CentOS卻不是,登入驗證記錄是在/var/log/secure。

2012年2月29日星期三

直接以PL/SQL印出整潔的表格(table)架構

執行以下SQL指令:


SELECT
user_tab_columns.column_name Column_Name,
user_tab_columns.data_type Format,
NVL2(user_cons_columns.constraint_name, 'YES', '') Primary_Key,
CASE
  WHEN user_tab_columns.nullable='Y' THEN 'NO'
  WHEN user_tab_columns.nullable='N' THEN 'YES'
END Mandatory,
user_tab_columns.table_name
FROM user_cons_columns
LEFT JOIN user_constraints ON (user_cons_columns.constraint_name=user_constraints.constraint_name)
RIGHT OUTER JOIN user_tab_columns ON (user_cons_columns.table_name=user_tab_columns.table_name AND user_cons_columns.column_name=user_tab_columns.column_name AND user_constraints.constraint_type='P')
ORDER BY user_tab_columns.table_name, user_tab_columns.column_id;



若果使用SQL Developer更可以把結果直接儲存作.xls。




改良版(會把字符類別的長度列出)︰

SELECT
user_tab_columns.column_name Column_Name,
CASE
  WHEN user_tab_columns.data_type LIKE '%CHAR%' THEN user_tab_columns.data_type || '(' || user_tab_columns.char_length || ' CHAR)'
  ELSE user_tab_columns.data_type
END Format,
NVL2(user_cons_columns.constraint_name, 'YES', '') Primary_Key,
CASE
  WHEN user_tab_columns.nullable='Y' THEN 'NO'
  WHEN user_tab_columns.nullable='N' THEN 'YES'
END Mandatory,
user_tab_columns.table_name
FROM user_cons_columns
LEFT JOIN user_constraints ON (user_cons_columns.constraint_name=user_constraints.constraint_name)
RIGHT OUTER JOIN user_tab_columns ON (user_cons_columns.table_name=user_tab_columns.table_name AND user_cons_columns.column_name=user_tab_columns.column_name AND user_constraints.constraint_type='P')
ORDER BY user_tab_columns.table_name, user_tab_columns.column_id;

2012年2月27日星期一

把嗶聲關掉

在中文輸入法篇碼輸入錯誤時,會發出嗶(beep)聲,這個很煩人,所以找辦法關掉。

在Arch Linux上,方法很簡單。

使用root權限在/etc/modprobe.d底下建立一個conf檔,例如/etc/modprobe.d/nobeep.conf

內裡加入阻入kernel載入pcspkr的設定句︰blacklist pcspkr

以上動作可以用一句指令完成︰
echo "blacklist pcspkr" > /etc/modprobe.d/nobeep.conf

資料來源︰https://wiki.archlinux.org/index.php/Kernel_modules#Blacklisting

2012年2月22日星期三

Arch Linux開關機時讀取及儲存ALSA音量狀態


首先在/etc/rc.conf內的DAEMONS列加上alsa

修改/etc/conf.d/alsa,將SAVE_VOLUME設為yes,如下︰

SAVE_VOLUME="yes"


完成並重新登入。


若果希望將用戶音量狀態分別儲存,可以額外使用以下方法。

~/.bash_login加上alsactl restore -f ~/.asoundrc
可用以下指令完成︰
echo "alsactl restore -f ~/.asoundrc" >> ~/.bash_login

~/.bash_logout加上alsactl store -f ~/.asoundrc

可用以下指令完成︰
echo "alsactl store -f ~/.asoundrc" >> ~/.bash_login

但若果你的home底下已有.bash_profile.profile任何一個檔案,則建議把alsactl store -f ~/.asoundrc指令加到.bash_profile內。因為當有.bash_profile.profile時,.bash_login便可能不被讀取。

完成並重新登入。

2012年2月12日星期日

在Linux上使用One2Free Lte上網

香港的One2Free電訊公司推出了Lte(4G)的上網服務,並隨服務送上一個Lte的USB modem(ZTE MF820)。使用Linux的我當然是要把這東西攪到能在Linux上能用。


我用的是Arch Linux,所以安裝套件的方法跟RedHat、Debian、Ubuntu、Gentoo等不同,但大家可以用各自的package manager安裝。


步驟︰

因為這類USB modem大多都內置儲存空間以把驅動程式附帶在內,所以在插上USB modem後系統一般都會辨認到USB儲存裝置。這時候,我們就需要用usb_modeswitch工具跳到驅動modem。

安裝libusb及usbutils套件
pacman -S libusb usbutils

安裝usb_modeswitch套件
pacman -S usb_modeswitch


插上USB modem後,使用lsusb指令查看。
lsusb

我的ZTE MF860會顯示一行︰
Bus 004 Device 009: ID 19d2:0166 ONDA Communication S.p.A.

這個就係USB modem上的儲存裝置。

19d2就是其廠商ID
0166是其產品ID

接下來我們要令usb_modeswitch在看到這個ID時自動驅動USB modem,而ZTE MF820的USB modem ID是19d2:0167,至於其他品牌的ID是甚麼就得自己去查了。

/usr/share/usb_modeswitch19d2:0166並修改。
vim /usr/share/usb_modeswitch/19d2:0166

改為以下內容︰

DefaultVendor= 0x19d2
DefaultProduct=0x0166

TargetVendor=  0x19d2
TargetProduct= 0x0167

MessageEndpoint=0x01
MessageContent="55534243e856e2892400000080000685000000240000000000000000000000"

CheckSuccess=20


資料來源︰http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?p=4995

以後插上這個USB modem後,執行lsusb就會看到︰
Bus 004 Device 010: ID 19d2:0167 ONDA Communication S.p.A.

這就代表成功驅動USB modem了。

如果為了令USB modem執行得更有效率,使用root權限啟用option這個module。
modprobe -v option

有些討論提到用option這個module的耗電量和CPU使用率較usb-serial為低。但使用usb-serial則單段TCP連接速度較高。至於如何取捨是否使用option這個module。要是不使用option這個module的話,就不用執行上面的指令了。

如果option module未能辨認您的USB modem,就把ID加到/sys/bus/usb-serial/drivers/option1/new_id
echo -n "19d2 0167" > /sys/bus/usb-serial/drivers/option1/new_id



接下來設定連接到互聯網。

安裝wvdial套件(大家也可以安裝gnome-ppp,但就需要同時安裝gtk2了。)
pacman -S wvdial

安裝後使用root執行︰
wvdialconf

wvdialconf會找到你的USB modem在哪,而且會產生一個/etc/wvdial.conf設定檔案。

執行wvdialconf後大概會看到以下畫面


然後修改/etc/wvdial.conf,改為以下內容︰

[Dialer Defaults]
Init1 = ATZ
Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0

# Init command for ZTE 4G modem
#auto (default)
#Init3 = AT+ZSNT=0,0,0
#只使用GPRS
#Init3 = AT+ZSNT=1,0,0
#GPRS優先
#Init3 = AT+ZSNT=0,0,1
#只使用3G
#Init3 = AT+ZSNT=0,0,2
#3G優先
#Init3 = AT+ZSNT=2,0,0
#只使用LTE
Init3 = AT+ZSNT=6,0,0

#LTE優先(此指命經測試並未成功)
#Init3 = AT+ZSNT=0,0,6



Modem Type = Analog Modem
Phone = *99#

ISDN = 0
Password = any
Username = any
Modem = /dev/ttyUSB2
#Baud = 9600
Baud = 460800
Stupid Mode = 1


資料來源︰http://www.draisberghof.de/usb_modeswitch/bb/viewtopic.php?p=4995

使用者帳戶及密碼並無需設定。


然後就可以使用root權限執行wvdial指令連接上網。


大家也可以在wvdial指令後加上&令其改為背景執行。
wvdial &

2012年2月7日星期二

重設Oracle資料庫的序列號(Sequence)

在Oracle資料庫裡要重設序列號(Sequence)並沒有直接的方法,小筆用過的方法也只兩種。一種是先刪除(DROP),再重新建立。這個方法當然不太好,因為當有觸發器(trigger)與其有關連時就不能這麼做了。另一種方法是先把序列號的每次遞增量加大,令序列號在拿下面號碼時就達到最大值,令其自己回復到最小值。但當然這個序列號需要有設為循環(CYCLE)才能這樣做。

第一種方法太簡單,在此不作闡述。第二種方法的具體的方法如下。


假設此序列號的最大值是256,而現時序列已去到100。每次遞增量為1。


ALTER SEQUENCE sequence_name INCREMENT BY 156;  --令序列的遞增量每次為156,那下個序列號就是256了。
SELECT sequence_name.nextval FROM dual;  --令序列號達到下個序列號(256),他就會自己重設了。
ALTER SEQUENCE sequence_name INCREMENT BY 1;  --令序列號的遞增量變回原來的值,這裡假設每次遞增1。

這個方法對其他資料庫物件的影響應該是最小的了。

查看Oracle資料庫表格的外鍵(foreign key)關係

在沒有商業版Toad此類功具的協助下,一般的程式開發者在跟進已完成的系統結構時,遇到文件做得不好的系統,往往都會在追尋從屬關係時感到困難。即使是使用Oracle SQL Developer也未能幫得上忙。

雖然沒有好工具,我們也可以靠Oracle的完善的視圖(View)找查表格(table)之間的關係。

以下是光靠SQL查出關連的外鍵(foreign key),雖然未及使用軟件般有圖表和連線展現關係表,但總算可以清晰地列出有關的外鍵和表格。


代入表格名後,可以找到其他有引用到本表格欄位的外鍵。
SELECT table_name, constraint_name, r_constraint_name, status
FROM user_constraints
WHERE constraint_type = 'R'
AND r_constraint_name in
(
SELECT constraint_name from user_constraints
WHERE constraint_type in ('P', 'U')
AND UPPER(table_name) = UPPER('table_name')
)
ORDER BY table_name, constraint_name;



代入表格名後,可以找到本表格找用了哪些表格欄位作外鍵。
SELECT table_name, constraint_name, r_constraint_name, status
FROM user_constraints
WHERE constraint_type = 'R'
AND UPPER(table_name) = UPPER('table_name')
ORDER BY table_name;



2012年2月6日星期一

停止在Oracle SQL Developer內的替代功能

Oracle SQL Developer有即時替代的功能,只要在執行的SQL語句加上&就可以把某字眼作代入。例子:

SELECT * FROM student WHERE classname = '&classname';

這樣&classname這個字眼可以作為變量,代入不同的值。若先前已定義&classname的話,在執行SQL語句時就會自動代入。若&classname未被定義的話,Oracle SQL Developer會彈出對話框要求即時輸入代入的數值。

這就導致SQL語句不能有&的情況。例子:

SELECT * FROM student WHERE student_name = 'Jr. Sledgehammer & Maul';

因為語句裡有&,令Oracle SQL Developer會彈出對話框詢問取代值。

只要在執行語句之前執行:

SET DEFINE OFF;

Oracle SQL Developer就不會問了。

2012年2月4日星期六

解決一直以來wicd在啟動時不連接eth0的問題

在使用wicd後,一直以來,他都不會在啟動後馬上替我連接eth0的。

但其實,他是有苦衷的。看/var/log/wicd/wicd.log會發現︰

No wired connection present, attempting to autoconnect to wireless network

但原因仍然不明。看ArchWiki後不加思索的就跟著做,在/etc/rc.local裡加上︰

dhcpcd -k eth0
dhcpcd -bn eth0



可以用root權限執行以下指令就不需用vi修改了,

echo "dhcpcd -k eth0" >> /etc/rc.local
echo "dhcpcd -bn eth0" >> /etc/rc.local



2012年2月3日星期五

在Linux上使用QQ

以2009版本以前,Pidginlibpurple一直帶有插件讓大家使用騰訊QQ。可惜騰訊是一家理念奇異的公司。大概也是賺到盡的理念,所以他一直阻攔第三方即時通信軟件使用他們的通信協定,例如是Pidgin。而他們又不在乎Linux的用戶,即使在2010年突然推出了一個能發信息但又未完善的Linux QQ,最後在發佈完1.0 Beta 1就再沒消息,大概已沒有跟進。同時他們又以轉換協定的愚蠢方式(卻又很有效)去阻止第三方客戶端使用。

後來小弟今天發現原來早在2010年就有一小群內地的熱心開發者利用QQ 2010的協定去做了一個Pidgin插件,這個插件還不錯。功能未算完滿,但對比起libpurple的QQ 2008協定插件卻絕對穩定而且來的好。他們的專案存放在Google Code開源—libqq-pidgin

大家可以使用svn下載源最新的原碼自動編譯,又或直接在Downloads頁下載適當的插件版本使用。

最方便的當然是下載已編譯好的插件使用。以下是一個可以供大部分Linux版本使用的方法︰

根據閣下的Linux的版本去選擇下載指令


64位元(x64)︰

wget http://libqq-pidgin.googlecode.com/files/libqq-pidgin.0.71_x64.tar.gz
tar xzf libqq-pidgin.0.71_x64.tar.gz


使用su轉換使用者為root

cp ./libqq.so /usr/lib/purple-2/
chmod 755 /usr/lib/purple-2/libqq.so




32位元(x86)︰

wget http://libqq-pidgin.googlecode.com/files/libqq.so_0.71_i386.7z
7z x libqq.so_0.71_i386.7z
(請確認為有安裝7zip)

使用su轉換使用者為root

cp ./libqq.so /usr/lib/purple-2/
chmod 755 /usr/lib/purple-2/libqq.so



重新啟動Pidgin,就可以在新加帳號內擇選QQ。


是懶人又是使用Arch Linux的話,AUR上有套件包︰
http://aur.archlinux.org/packages.php?ID=49794

使用RedHat/CentOS的懶人可以下載RPM︰http://libqq-pidgin.googlecode.com/files/libqq-0.71-1.x86_64.rpm

在Oracle上限制SELECT的結果列數

在MySQL上,我們可以使用

SELECT student_number, name, class FROM student ORDER BY enrollment_year DESC LIMIT 10, 20;

這樣就可把學生依入學年份排序,並只列出首第11至20個的結果。

Oracle沒有LIMIT,在Oracle上要怎樣做到呢?這問題經常有人在問。

其實我們以用subquery加上ROWNUM的小技巧去做到。

SELECT * FROM (SELECT student_number, name, class FROM student WHERE enrollment_year>2010) WHERE ROWNUM BETWEEN 11 AND 20;

這樣,結果就會例出排序後第11至20個結果。大家亦可以把WHERE clause上改為︰

ROWNUM>10 AND ROWNUM<=20

全句︰

SELECT * FROM (SELECT student_number, name, class FROM student WHERE enrollment_year>2010) WHERE ROWNUM>10 AND ROWNUM<=20;

結果也是一樣的。

2012年1月21日星期六

解決avast! Linux Home Edition的Invalid argument警告

雖然在Linux上受病毒影響的機會極微,但很多時中了病毒的朋友也會向我求救。雖然Linux上跑的防毒程式不多,但因為Linux可說是「逄Windows毒不侵」的優勢,也會幫朋友一把,替人家掃掃USB上的毒。avast也有推出Linux的家用版掃毒程式avast! Linux Home Edition。很多朋友安裝後會先更新一下,這是正確做法。更新後avast卻出現「An error occured in avast! engine: Invalid argument」的警告,究竟是甚麼argument錯誤呢?




其實原因是avast的病毒定義檔使用Linux的SHM(Shared Memory),基於安全理由等等因素,shm的記憶空間是有預設上限的。而avast的病毒定義檔在更新後卻佔上大約50MB左右的容量,一般Linux系統也不會有這麼大的shm上限,所以shm記憶空間不足以載入avast的病毒定義檔。你可以執行以下指令比較shm上限值和avast的病毒定義檔大小。



查看系統shm上限
cat /proc/sys/kernel/shmmax

查看avast病毒定義檔大小
du -h ~/.avast/400.vps





以我的Arch Linux為例,shm上限是33554432 Bytes,除以1024x1024後即32MB。而我的avast病毒定義檔在更新後的大小是49MB,明顯比shm大很多。

解決方法可以將系統的shmmax,即shm上限設大。但這個方法並非必要,亦不知道avast的病毒定義檔哪一天會再脹大,無法肯定多少MB才夠他用。亦不知道哪天avast會把這個問題解決。所以我們可以用一個暫時的方法將shmmax設大一點,這個方法所設的shmmax在系統重開後會被還原。

執行以下指令可以暫時將shmmax加大,但需用root權限才可以執行,所以請先以su指令轉換成root,又或在指令前加上sudo。


sysctl -w kernel.shmmax=52428800



52428800 Bytes即50MB,足以存放avast現時49MB的定義檔。



現在運行avast! Linux Home Edition沒問題了。




方求方便,我直接寫了個shellscript執行avast!。

#!/bin/bash
#boost shmmax to 50MB
#then start avast!

sudo sysctl -w kernel.shmmax=52428800
nohup avastgui > /dev/null &


但這裡假設系統已有sudo指令,若沒有sudo的系統的話,請以su代替。

參考資料︰
Linux Shared Memory的解釋(英語)︰http://en.wikipedia.org/wiki/Shared_memory
Linux Shared Memory的解釋及實際使用(英語)︰http://www.cyberciti.biz/tips/what-is-devshm-and-its-practical-usage.html