網頁

2013年3月26日

Bypass the 2GB file size limit on 32-bit Linux

在 32 位元的 Linux 上面寫超過 2GB 的檔案會發生錯誤,有時候你會發現不管怎麼寫資料,檔案的大小都是一個 magic number 2,147,483,647,有時候甚至導致程式意外的終止執行,簡直是摸不清楚頭緒。

這是因為 Linux 的系統內部處理檔案時用的指標定義為 long,而 long 在 32 位元的系統上的大小為 32 位元,因此最大只能支援 2^31-1 = 2,147,483,647 bits 等於是 2GB 扣掉 1 bite 的檔案大小。

64 位元的系統 (例如 AMD64 或 IA64) 則因為 long 定義成 64 位元,所以不會有問題。因此在 32 位元的 Linux 上面,程式需要作一些額外處理才能正確寫超過 2GB 的檔案。

首先我們先準備一個簡單的測試檔 test.cpp,大致上就是透過 fprintf 每一次輸出 3 bits 的資料,然後迴圈的個數是 1 Giga 次,也就是我們希望可以輸出 3 bits * 1 Giga = 3.0 Giga 的資料量,用這個來測試我們是否可以成功突破 linux 上 2.0 G 的檔案大小限制。

diff and patch

Linux 中 Diff 命令的功能為逐行比較兩個文字檔案,列出其不同之處。它對給出的檔進行系統的檢查,並顯示出兩個檔中所有不同的行,不要求事先對檔進行排序。

用 diff 工具可以將兩個檔案的差異性輸出成一個補丁檔。有了這個補丁檔,我們可以利用 patch 工具幫助我們從舊檔案升級成新檔案,或者從新檔案還原成舊檔案。所以 diff 和 patch 搭配在一起,威力無窮啊。

首先我們要做個小實驗,準備兩個文字檔叫做 old 和 new,檔案內容分別如下

Valgrind: a powerful memory profiling tool

Install

apt-get install valgrind

Usage

valgrind --leak-check=full --log-file=vglog ./a.out

Reference

wwwsqldesigner: Visual web-based SQL modelling tool

WWW SQL Designer allows users to create database designs, which can be saved/loaded and exported to SQL scripts. Various databases and languages are supported. Ability to import existing database design.

About

Hi and welcome to WWW SQL Designer! This tool allows you to draw and create database schemas (E-R diagrams) directly in browser, without the need for any external programs (flash). You only need JavaScript enabled. The Designer works perfectly in Mozillas (Firefox, Seamonkey), Internet Explorers (6, 7, 8), Safari and Operas. Konqueror works, but the experience is limited.

Many database features are supported, such as keys, foreign key constraints, comments and indexes. You can either save your design (for further loading & modifications), print it or export as SQL script. It is possible to retrieve (import) schema from existing database.

Install IMDbPY

Install Tools

apt-get install python-setuptools
apt-get install python-dev
apt-get install libmysqlclient15-dev
easy_install -U SQLObject
easy_install MySQL-python
easy_install psycopg2

  • SQLObject is a popular Object Relational Manager for providing an object interface to your database, with tables as classes, rows as instances, and columns as attributes.
  • MySQL-python is the most popular MySQL adapter for the Python
  • Psycopg2 is the most popular PostgreSQL adapter for the Python

Install setuptools (with easy_install)

setuptools是 Python Enterprise Application Kit(PEAK)的一個副項目,它 是一組Python的 distutilsde工具的增強工具(適用於 Python 2.3.5 以上的版本,64 位平台則適用於 Python 2.4 以上的版本),可以讓程序員更方便的創建和發佈 Python 包,特別是那些對其它包具有依賴性的狀況。

簡介

經常接觸Python的同學可能會注意到,當需要安裝第三方python包時,可能會用到easy_install命令。easy_install是由PEAK(Python Enterprise Application Kit)開發的setuptools包裡帶的一個命令,所以使用easy_install實際上是在調用setuptools來完成安裝模組的工作。

Perl 用戶比較熟悉 CPAN,而 Ruby 用戶則比較熟悉 Gems;引導 setuptools 的 ez_setup 工具和隨之而生的擴展後的 easy_install 與 “Cheeseshop”(Python Package Index,也稱為 “PyPI”)一起工作來實現相同的功能。它可以很方便的讓您自動下載,編譯,安裝和管理Python包。

Tabs and Indent in Vim

Vim 中關於 tab 的相關設定,大致上就是 tabstop 、expandtab、shiftwidth、softtabstop 這四個變數,要搞懂其中的道理著實不容易啊。所以就將我所理解的部分,做個筆記。

下面是我從國外網站關於這四個變數的英文敘述,先列在下面比較好釐清他們之間的關係

expandtab

When expandtab is set, hitting Tab in insert mode will produce the appropriate number of spaces.

這個變數大致上是在大型專案多人開發的時候,為了避免大家的 coding style 不同,造成版面上的混亂,因此將所有的 tab 用 space 來做取代,可以讓大家看到一致的面貌。正常情況下不建議打開這個變數,假設一個 tab 用四個 space 做取代,space 所站的空間就會變成 tab 的四倍大。

Install the Insight Debugger on Ubuntu

Insight 是一個基於 gdb 架構上非常方便使用的一套 GUI Debugger 軟體。可惜的是,Insight已經從 Ubuntu packages 中被移除了。

但是,感謝SevenMachines,a PPA repository 目前繼續提供此軟體下載的服務。因此將這個repository加進你的 apt source 裡頭,把下面兩行加進 /etc/apt/sources.list

deb http://ppa.launchpad.net/sevenmachines/dev/ubuntu natty main
deb-src http://ppa.launchpad.net/sevenmachines/dev/ubuntu natty main


然後更新你的 apt source
apt-get update

接著就直接給他大膽的安裝下去吧
apt-get install insight

現在你就可以開始享受 Insight 了。在 command line 下執行
insight programename

就會跳出一個GUI的畫面,操作非常的容易,完全相容於CLI gdb,而且也有提供gdb command line的畫面,所以只要你熟悉gdb的話,Insight 的操作一定也沒有問題。

Reference

怎麼再shell script中設定目前所用的環境變數或是改變所在目錄

若沒有做一些特殊安排是做不到的。因為,當我們創造出 child process 時,child process 會繼承其 parent process 的變數與所在的目錄。在這個 child process 只能改到自己的變數與所在目錄而無法影響到其 parent process。

要達到此目的, parent process 要與 child process 有一個溝通的機制。當  child process 要改變變數值時得把要改變的變數及其內容寫到一個講好的地方,讓 parent process 去讀取, 並改變 parent process 的變數。

另一個做法則是寫一個 shell script,然後在 Bourne shell 或 Korn shell 中用 ".",在 C shell 中用 source 去執行那個  shell script。 若此 script 名為 "myscript" :

在 Bourne shell 或 Korn shell 中就用
. myscript

在 C shell 中則用
source myscript

利用這種方式執行 shell script 時,是利用原本的parent process直接執行,而不是 fork 出一個新的 child process 去執行,透過這種方式,就可以保留環境變數或者是改變所在目錄。

總而言之,這個問題算是先天上的限制,也是一種 parent prcoss 和 child process 溝通上的一種機制。

Reference

xargs 將上一個程式輸出當成下一個程式的參數輸入

Origin: xargs 應用介紹

今天介紹的指令是 xargs,這個指令並不常見,卻很實用它的工作是將上一個程式輸出的結果轉成下一個程式的參數輸入

範例:
假設有一個目錄如下 (這個樹狀目錄架構是使用 tree 指令所產生的)

.
|-- Makefile
|-- VERSION
|-- VERSION.bak
|-- inc
|   |-- fork.h
|   |-- main.h
|   `-- main.h.bak
`-- src
    |-- common_lib
    |   |-- dl_math.c
    |   |-- dl_math.c.bak
    |   |-- dl_string.c
    |   `-- dl_string.c.bak
    |-- fork.c
    |-- fork.c.bak
    `-- main.c

這是一個程式開發的專案目錄,如果我想要將所有的*.bak 一次清除,那麼該怎麼做呢? 首先我得先找出所有的 *.bak,可以使用 find 指令

find . -iname "*.bak"

2013年3月25日

Install vim

安裝vim

sudo apt-get install vim

全域設定 /etc/vim/vimrc

預設的vim設定檔

局部設定 /etc/vim/vimrc.local

我們可以不更改全域設定的情況下,建立一個局部設定檔給所有的使用者使用

個人設定 ~/.vimrc

每一個使用者可以在自己的家目錄下建立個人的設定檔

Install openssh-server

Origin: ubuntu SSH遠端安全連線安裝及設定

你在安裝ubuntu時有安裝openssh嗎

接下來我們可以來看看怎麼設定ssh的部份

安裝openssh-server

如果你沒有安裝ubuntu時沒有安裝openssh,請用以下熟悉的指令來做安裝

sudo apt-get install openssh-server

好,當我們安裝好,基本上就可以用putty來用遠端登入了,當然是有帳密的人就可以登入啦,但是我們都瞭解,這樣子是不安全的,基本上我們要限定連入IP還有改變PORT,如此才會比較安全。

接下來我們一樣可以來檢查是否有執行這個ssh-server,輸入以下指令

ps aux | grep ssh

設定ssh_config內容

Install apache+mysql+php+phpmyadmin

1. 安裝mysql

sudo apt-get install mysql-server

中間需要輸入mysql的管理員密碼

2. 安裝apache 2.0

sudo apt-get install apache2

3. 安裝配置php5

sudo apt-get install php5

sudo apt-get install libapache2-mod-php5

sudo apt-get install php5-gd

sudo apt-get install php5-mysql

4. 安裝phpmyadmin

sudo apt-get install phpmyadmin

中間需要輸入mysql的管理員密碼,和上面設置的一樣即可

5. 重啟apache2

sudo /etc/init.d/apache2 restart

6. 測試apache

在瀏覽器中輸入http://localhost/

會有apache server預設的網頁顯示,真實檔案路徑在/var/www底下

這邊看得到的話表示apache server成功設定

7. 測試php環境

在/var/www建立info.php測試檔案,內容如下

<?php

phpinfo();

?>

在瀏覽器中輸入http://localhost/info.php

你將會看到php的相關配置信息,說明環境都配置好了。

8. 測試phpmyadmin

在瀏覽器中輸入http://localhost/phpmyadmin

應該可以看見 phpmyadmin的登入畫面

若在連結時出現: Not Found,解決方法是做一個Link

cd /var/www

ln -s /usr/share/phpmyadmin

解決Ubuntu下無法更新套件清單或安裝套件的問題 ?

在Ubuntu下使用apt-get的時候,常常會發生無法更新套件清單或安裝套件的問題,原因在於本地端機器無法順利連上Ubuntu伺服器去更新或下載資料。

因此,最簡單解決的方式就是替換掉Ubuntu伺服器位址了。

步驟如下:

1. 備份 sources.list
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak

2. 打開 sources.list
sudo vi /etc/apt/sources.list

3. 變更成美國的伺服器,在 vi 介面裡,用下面指令把  tw 換成 us
:1,$s/tw/us/g

4. 儲存  source.list
:wq!

5.更新套件清單
sudo apt-get update

完成上面的步驟之後,再重新安裝軟體就應該可以了。

參考資料: Ubuntu 如何解決 apt-get 無法更新套件清單或安裝套件的問題 ?

Install Samba

將Linux資料夾當成Window網路芳鄰上的共享資料夾

1.安裝 samba

sudo apt-get install samba

2.設定 samba 設定檔

sudo vim /etc/samba/smb.conf

3.增加分享的資料夾

在檔案的最後面加上

[Sharename]                                        ;分享資料夾的名稱
    comment = describe sharename
    path = /var/lib/sharename                ;分享路徑
    browseable = yes                             ;是否可瀏覽
    read only = no                                   ;唯讀
    create mask = 0644                         ;檔案遮罩
    directory mask = 0755                     ;資料夾遮罩

4.重新啟動 samba 服務

sudo /etc/init.d/smbd restart

5.建立samba帳號密碼

sudo smbpasswd -a <帳號>

SlickEdit 2011 常用設定

快速鍵

  • Find : Ctrl + f
  • Replace:Ctrl + r
  • Jump:Ctrl + j
  • Previous Buffer:Ctrl + p
  • Next Buffer:Ctrl + n
  • Change Dir:Ctrl + d
  • Find matched Braces:Ctrl + ]
  • Go to Definition:Ctrl + .
  • Go to Reference :Ctrl + /

tmux: 好用的多終端機視窗的軟體

mux 是一個 terminal multiplexer 的軟體,也就是可以在一個螢幕上切換多個終端機。當你暫時不需要tmux的時候,你也可以detach回到正常的終端機模式下,這時候tmux就會在背景繼續運作,當你需要tmux的時候,attach回到tmux的工作環境下。

過去, 我使用 Putty or XShell 連到Linux主機,需要開多個終端機來管理機器或撰寫程式,常常需要在多個終端機中手動切換終端機螢幕,非常的麻煩。用了tmux以後,你只要在鍵盤上就可以新增終端機、切換終端機,讓你的手指不再需要離開鍵盤,非常的方便。

tmux  的安裝

sudo apt-get install tmux

啟動 tmux

在命令提示字元下打入tmux就可以進入tmux工作環境

tmux的功能鍵

在 tmux 中,使用Ctrl + b當作任何功能的起始按鍵,所以要按Ctrl + b,放掉後,接著加上其他的按鍵就可以開啟tmux的任何功能。

快速鍵 說明
Ctrl + b 快速鍵的起始按鍵
c 開新視窗
exit 關閉視窗
p 前往前面一個視窗
n 前往後面一個視窗
0 to 9 前往特定的視窗
" 分割上下視窗
% 分割左右視窗
SPACE 重新排列視窗
↑ ↓ ← → 移動到其他的分割視窗
o 循環移動到其他的分割視窗
d 把目前tmux session丟到背景去 (回到原本terminal)
tmux attach 回到剛才的tmux session
? Help
Alt + ↑ ↓ ← → 調整分割視窗大小

tmux 設定檔

因為Ctrl+b用得不是很順手,因此用Ctrl+a取代Ctrl+b。新增設定檔~/.tmux.conf,內容如下:

# Make it use C-a, similar to screen..
unbind C-b
unbind l
set -g prefix C-a
bind-key C-a last-window

重新讀取tmux設定檔

tmux source-file ~/.tmux.conf

glob: Find pathnames matching a pattern

glob的主要功能是幫助你在特地的路徑下找尋符合特定pattern的檔案。跟opendir、readdir、closedir在特定的資料夾下做檔案的尋訪有一點類似。

我們就直接看一個簡單的範例吧,相信大家都可以理解:

#include 
#include
#include
using namespace std;

int main()
{
string path = "/home/derek/video/FastFive/FastFive.mpg";
path.resize(path.find_last_of('.'));
path += ".*.srt";

glob_t globbuf;
glob(path.c_str(), GLOB_NOESCAPE, NULL, &globbuf);
for (size_t i = 0; i < globbuf.gl_pathc; i++) {
printf("%s\n", globbuf.gl_pathv[i]);
}
globfree(&globbuf);

return 0;
}

這個簡單的範例是希望可以在/home/derekchen/video/FastFive/下找尋FastFive.mpg這部影片的外掛字幕檔,此字幕檔的pattern,就是跟影片同檔名,中間有語言的資料,最後用srt做結尾。所以像是"FastFive.chi.srt"或是"FastFive.eng.srt"都算是我們要找的檔案。

範例的一開始是先將副檔名".mpg"去除掉,然後接上"*.srt"字串,這就是我們所要找的pattern了。最後,套用glob的功能就可取得符合的數目gl_pathc,跟每一個檔案的名字gl_pathv[i]。

英文特殊符號念法

&   Ampersand (And 符號)
* Asterisk (星號)
@ At sign, at (At 符號,At)
\ Backslash (反斜線)
[ Open bracket (左中括弧)
^ Caret (插入號)
] Close bracket (右中括弧)
( Open parenthesis (左括弧)
) Close parenthesis (右括弧)
: Colon (冒號)
, Comma (逗號)
$ Dollar sign (錢符號)
-- Double dash (雙破折號)
... Ellipsis (省略符號)
' Single quote (單引號)
" Quote (雙引號)
= Equals (等號)
+ Plus, plus sign (加,加號)
! Exclamation point (驚歎號)
> Greater than (大於)
< Less than (小於)
# Pound sign (井字號)
? Question mark (問號)
. Period, dot (句號,點)
; Semicolon (分號)
- Hyphen (連字號)
— Dash (破折號)
_ Underscore (底線)
| Vertical bar (垂直線)
{ Open brace (左大括弧)
} Close brace (右大括弧)
% Percent, percent sign (百分比,百分比符號)
/ Slash (斜線)
// Double slash (雙斜線)
~ Tilde (取代符號,毛毛蟲)

解決json_encode中文UNICODE轉碼問題

用 PHP 的 json_encode 來處理中文的時候,中文都會被編碼,變成不可讀的,類似”\u***”的格式,有時候網頁上也會直接顯示null,最主要的原因是為了與前端緊密結合, json 只支援 utf8,如果想要讓中文不進行轉碼,這裡提供兩種簡單方法

1. 在PHP5.4, 這個問題終於得以解決, Json 新增了一個選項: JSON_UNESCAPED_UNICODE, 故名思議, 就是說, Json不要編碼Unicode, 那就不會有中文亂碼的問題了。
echo json_encode("中文", JSON_UNESCAPED_UNICODE);

2. 把中文先 urlencode 然後再使用 json_encode, json_encode 之後再次使用 urldecode 來解碼,這樣編碼出來的 json 中的中文就不會出現 unicode 編碼了。
這裡我提供一個尋訪 array 中 vlaue 為 string 的變數,幫這些變數加上這種機制。

Ububtu Apt 工具的快速參考

Origin: Apt和dpkg快速參考

apt-cache search # ------(package 搜索包)
apt-cache show #------(package 獲取包的相關信息,如說明、大小、版本等)
apt-get install # ------(package 安裝包)
apt-get install # -----(package - - reinstall 重新安裝包)
apt-get -f install # -----(強制安裝?#"-f = --fix-missing"當是修復安裝吧...)
apt-get remove #-----(package 刪除包)
apt-get remove - - purge # ------(package 刪除包,包括刪除配置文件等)
apt-get autoremove --purge # ----(package 刪除包及其依賴的軟體包+配置文件等(只對6.10有效,強烈推薦))
apt-get update #------更新源
apt-get upgrade #------更新已安裝的包
apt-get dist-upgrade # ---------升級系統
apt-get dselect-upgrade #------使用 dselect 升級
apt-cache depends #-------(package 了解使用依賴)
apt-cache rdepends # ------(package 了解某個具體的依賴?#當是查看該包被哪些包依賴吧...)
apt-get build-dep # ------(package 安裝相關的編譯環境)
apt-get source #------(package 下載該包的源代碼)
apt-get clean && apt-get autoclean # --------清理下載文件的存檔 && 只清理過時的包
apt-get check #-------檢查是否有損壞的依賴

apt-get install

下載 以及所有倚賴的包裹,同時進行包裹的安裝或升級。如果某個包裹被設置了 hold (停止標誌,就會被擱在一邊(即不會被升級)。更多 hold 細節請看下面。

apt-get remove [--purge]

移除 以及任何倚賴這個包裹的其它包裹。
--purge 指明這個包裹應該被完全清除 (purged) ,更多信息請看 dpkg -P。

apt-get update

升級來自 Debian 鏡像的包裹列表,如果你想安裝當天的任何軟體,至少每天運行一次,而且每次修改了
/etc/apt/sources.list 后,必須執行。

apt-get upgrade [-u]

升級所以已經安裝的包裹為最新可用版本。不會安裝新的或移除老的包裹。如果一個包改變了倚賴關係而需要安裝一個新的包裹,那麼它將不會被升級,而是標誌為 hold。apt-get update 不會升級被標誌為 hold 的包裹 (這個也就是 hold 的意思)。請看下文如何手動設置包裹為 hold。我建議同時使用 '-u' 選項,因為這樣你就能看到哪些包裹將會被升級。

apt-get dist-upgrade [-u]

和 apt-get upgrade 類似,除了 dist-upgrade 會安裝和移除包裹來滿足倚賴關係。因此具有一定的危險性。

apt-cache search

搜索滿足 的包裹和描述。

apt-cache show

顯示 的完整的描述。

apt-cache showpkg

顯示 許多細節,以及和其它包裹的關係。

dpkg -L <package_name>

使用 apt-get install 之後,不知道軟體裝到哪些地方去?來試試這個。

PHP Error Reporting: Turning on Error Reporting in PHP

Modify php.ini

open /etc/php5/apache2/php.ini

ser error_reporting = E_ALL

set display_errors = On

Restart apache server

/etc/init.d/apache2 restart

Check error log

/var/log/apache2/error.log

Reference

Compile Jsoncpp

Download scons

SCons is an Open Source software construction tool. that is, a next-generation build tool.

apt-get install scons

Compile Jsoncpp

cd jsoncpp-src-0.5.0

scons platform=linux-gcc

2013年3月22日

PHP Time Functions

strtotime

int strtotime ( string $time [, int $now = time() ] )

The function expects to be given a string containing an English date format and will try to parse that format into a Unix timestamp (the number of seconds since January 1 1970 00:00:00 UTC), relative to the timestamp given in now, or the current time if now is not supplied.

date

string date ( string $format [, int $timestamp = time() ] )

Returns a string formatted according to the given format string using the given integer timestamp or the current time if no timestamp is given. In other words, timestamp is optional and defaults to the value of time().

2013年3月12日

W3C - Language codes,ISO 639 語言代碼,ISO 3166 標準國家代碼,ISO 4217 貨幣代碼

Origin: W3C - Language codes,ISO 639 語言代碼,ISO 3166 標準國家代碼,ISO 4217 貨幣代碼

現在有許多網站都有提供多國語系的版本,例如 iGoogle 首頁(http://www.google.com/ig?hl=zh-tw),其中(zh-tw)便是在 Google 繁體中文的代碼。但各家網站所使用的語系代碼都不太相同,例如有些網站就把繁體中文代碼直接簡化成(tw)。其實這些都沒有錯,只要本身系統區分的出來就好。

但是我的想法偏向比較標準的定義,在全球資訊網聯盟(World Wide Web Consortium,簡稱︰W3C)有了相關定義,在 8.1.1 Language codes 中定義了表示法如下︰

language-code = primary-code ( "-" subcode )*
primary-code︰為 ISO 639 兩個字母的語言縮寫。
subcode︰為 ISO 3166 國家代碼

2013年3月10日

Efficient Use of PostgreSQL Indexes

Origin: Efficient Use of PostgreSQL Indexes

There are many types of indexes in Postgres, as well as different ways to use them. In this article we give an overview of the types of indexes available, and explain different ways of using and maintaining the most common index type: B-Trees.

Index Types

Postgres supports many different index types:
  • B-Tree is the default that you get when you do CREATE INDEX. The B stands for Balanced, and the idea is that the amount of data on both sides of the tree is roughly the same. Therefore the number of levels that must be traversed to find rows is always in the same ballpark. B-Tree indexes can be used for equality and range queries efficiently. They can operate against numeric, text or NULL values.
  • Hash Indexes are only useful for equality comparisons, but you pretty much never want to use them since they are not transaction safe, so the advantage over using a B-Tree is rather small.
  • Generalized Inverted Indexes (GIN) are useful when an index must map many values to one row, whereas B-Tree indexes are optimized for when a row has a single key value. GINs are good for indexing array values as well as for implementing full-text search.
  • Generalized Search Tree (GiST) indexes allow you to build general balanced tree structures, and can be used for operations beyond equality and range comparisons. They are used to index the geometric data types, as well as full-text search.
This article is about how to get the most out of default B-Tree indexes. For examples of GIN and GiST index usage, refer to the contrib packages.

2013年3月7日

CSS Properties Ordering Guide

/*
CSS Properties Ordering Guide

Double line breaks only included to separate certain property types.
Do not put double line breaks in production code.

Andy Ford - Aloe Studios http://aloestudios.com
*/

el {
display: ;
visibility: ;
float: ;
clear: ;

position: ;
top: ;
right: ;
bottom: ;
left: ;
z-index: ;

width: ;
min-width: ;
max-width: ;
height: ;
min-height: ;
max-height: ;
overflow: ;

margin: ;
margin-top: ;
margin-right: ;
margin-bottom: ;
margin-left: ;

padding: ;
padding-top: ;
padding-right: ;
padding-bottom: ;
padding-left: ;

border: ;
border-top: ;
border-right: ;
border-bottom: ;
border-left: ;

border-width: ;
border-top-width: ;
border-right-width: ;
border-bottom-width: ;
border-left-width: ;

border-style: ;
border-top-style: ;
border-right-style: ;
border-bottom-style: ;
border-left-style: ;

border-color: ;
border-top-color: ;
border-right-color: ;
border-bottom-color: ;
border-left-color: ;

outline: ;

list-style: ;

table-layout: ;
caption-side: ;
border-collapse: ;
border-spacing: ;
empty-cells: ;

font: ;
font-family: ;
font-size: ;
line-height: ;
font-weight: ;
text-align: ;
text-indent: ;
text-transform: ;
text-decoration: ;
letter-spacing: ;
word-spacing: ;
white-space: ;
vertical-align: ;
color: ;

background: ;
background-color: ;
background-image: ;
background-repeat: ;
background-position: ;

opacity: ;

cursor: ;

content: ;
quotes: ;
}


/* EOF */