2012年5月30日 星期三

[memo] 只用 CSS 讓圖片在 DIV 中水平垂直都置中

原文出處: http://blog.xuite.net/vexed/tech/22551671-%E5%8F%AA%E7%94%A8+CSS+%E8%AE%93%E5%9C%96%E7%89%87%E5%9C%A8+DIV+%E4%B8%AD%E6%B0%B4%E5%B9%B3%E5%9E%82%E7%9B%B4%E9%83%BD%E7%BD%AE%E4%B8%AD


這個問題我很久以前思考過。水平置中當然沒問題, text-align : center 就好了。在 Firefox 和 Chrome 垂直置中也沒啥問題,因為 CSS 支援完整,可以動手腳的地方多。難的是在 IE 垂直置中。之前我想不到好的純 CSS 解法,所以最後我在 img onload 上註冊一個 handler ,動態算出 margin-top ,讓圖片垂直置中。
現在工作上又碰到這個問題,又開始苦思有沒有好的純 CSS 解法。結果在大陸找到這個網頁 - 圖片垂直居中的使用技巧。只能說太神了 m(__ __)m,這種解法我應該一輩子也想不出來吧。老實講我只約略知道為什麼可以這樣解,實際上的原理還是不太懂。
他的方式是抓出特定字型在 IE font-size 和所產生行高的比例,然後就以此比例來算出要垂直置中 font-size 該設多少。他算出來字型 Arial 的比例是 0.873 ,但我算出來約是 0.9 左右。所以要讓一張圖在 IE 高度 200px 的 DIV 中垂直置中就要把 font-family 設為 Arial 、 font-size 設為 200px * 0.9 = 180px 。
再來講講大陸網頁的 Firefox 部份,他用 display : table-cell 讓圖片在 Firefox 垂直置中,我不太喜歡 :p ,因為這樣 DIV 就不能 float : left 或 float : right 了。所以我用 line-height 兜出了一樣的效果。
下面是我整理出的在 IE 、 Firefox 、 Chrome 都可以跑的範例︰
Demo
HTML
<div><img src="demo.jpg" />div>
CSS
div {
  background-color : #EEE;
    
  height : 200px;
  width : 200px;
    
  text-align : center;
    
  /* Firefox, Chrome */
  line-height : 200px;
    
  /* IE */
  *font-size : 180px;  /* 200px * 0.9 = 180px */
  *font-family : Arial;
}

div img {
  vertical-align : middle;
}

下面是和 float : left 搭配的 Demo ︰
 
如果你的網頁的 DOCTYPE 不是 Standards 模式,或是沒有寫 DOCTYPE ,那會麻煩些,要多寫些 CSS :
div {
  background-color : #EEE;
    
  height : 200px;
  width : 200px;
    
  text-align : center;
    
  /* Firefox, Chrome */
  line-height : 200px;
  white-space : nowrap;
    
  /* IE */
  *font-size : 180px;  /* 200px * 0.9 = 180px */
  *font-family : Arial;
}

div:after {
  content : ".";
  font-size : 0;
  -webkit-text-size-adjust : none;
}

div img {
  vertical-align : middle;
}
div:after -webkit-text-size-adjust : none 是為了讓 Chrome 支援 font-size : 0 。

2012年5月28日 星期一

[轉貼] python CGI模塊獲取中文編碼問題解決- 部分方案


原始位置:

今天在嘗試Python的CGI模塊時遇到中文字符不能正確顯示的問題,很鬱悶.在網上仔細找了找,終於解決了這個問題,現在將解決方法陳述如下,以防下次失誤.

頁面源代碼如下
#-*- coding: utf8 -*-
import cgitb , cgi
cgitb.enable()
form = cgi.FieldStorage()
if (form.has_key("name") and form.has_key("addr")):
    print "
name:", form["name"].value
    print "
addr:", form["addr"].value
[這裡僅僅測試addr參數為中文]接收Ascii字符時運行良好,但是接收中文字符時顯示亂碼,瀏覽器切換到GB2312編碼時
可以正常顯示,但是個人要求它成為UTF-8編碼顯示

改成print "
addr:", form["addr"].value.encode('utf-8') 就報如下錯誤:
UnicodeDecodeError: 'utf8' codec can't decode bytes in position 0-1: invalid data

Python裡面的編碼和解碼也就是unicode和str這兩種形式的相互轉化。編碼是unicode -> str,相反的,解碼就
是str -> unicode。剩下的問題就是確定何時需要進行編碼或者解碼了.關於文件開頭的"編碼指示",也就是# -*- coding: -*-這個語句。Python默認腳本文件都是UTF-8編碼的,當文件中有非UTF-8編碼範圍內的字符的時候就要使用"編碼指示"來修正.關於sys.defaultencoding,這個在解碼沒有明確指明解碼方式的時候使用。比如我有如下代碼:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
s = '中文' #注意這裡的str是str類型的,而不是unicode
s.encode(' gb18030') 這句代碼將s重新編碼為gb18030的格式,即進行unicode -> str的轉換。因為s本身就是str類型的,因此Python會自動的先將s解碼為unicode ,然後再編碼成gb18030。因為解碼是python自動進行的,我們沒有指明解碼方式,python就會使用sys.defaultencoding指明的方式來解碼。很多情況下sys.defaultencoding是ANSCII,如果s不是這個類型就會出錯。拿上面的情況來說,我的sys.defaultencoding是anscii,而s的編碼方式和文件的編碼方式一致,是utf8的,所以出錯了: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0 : ordinal not in range(128) 對於這種情況,我們有兩種方法來改正錯誤:一是明確的指示出s的編碼方式#! /usr/bin/env python # -*- coding: utf-8 -*- s = '中文' s.decode('utf-8').encode('gb18030') 二是更改sys.defaultencoding為文件的編碼方式#! /usr/bin/env python # -*- coding : utf-8 -*- import sys reload(sys) # Python2.5初始化後會刪除sys.setdefaultencoding這個方法,我們需要重新載入sys.setdefaultencoding('utf-8') str = '中文' str .encode('gb18030')

   
看完之後,改成這樣
print "
addr:", form["addr"].value.decode('gb2312').encode('utf-8')
成功通過.

我總結一下為什麼要這麼寫的原因 :
1. 當取回來的數據與你當前腳本中聲明的編碼不一致時就要做編碼轉換
2.在編碼轉換時首先要將該數據以自身編碼的格式換成unicode碼,再將這個unicode按utf8編碼
3.為什麼我的瀏覽器會傳回gb2312 的編碼數據到服務器,這應該和客戶端的系統編碼有關係


這裡順便轉載一下,關於Python 操作Mysql的中文問題:

Python操作MySQL以及中文亂碼的問題
下面幾個措施,保證MySQL的輸出沒有亂麻:1 Python文件設置編碼utf-8 (文件前面加上#encoding=utf-8)     2 MySQL數據庫charset=utf-8     3 Python連接MySQL是加上參數charset= utf8     4設置Python的默認編碼為utf-8 (sys.setdefaultencoding(utf-8)
   


Java代碼  收藏代碼
  1. #encoding=utf- 8  
  2. import  sys  
  3. import  MySQLdb  
  4.   
  5. reload(sys)  
  6. sys.setdefaultencoding( 'utf-8' )  
  7.   
  8. db=MySQLdb.connect(user= 'root' ,charset= 'utf8' )  
  9. cur=db.cursor()  
  10. cur.execute( 'use mydb' )  
  11. cur.execute( 'select * from mytb limit 100' )  
  12.   
  13. f=file( "/home/user/work/tem.txt" 'w' )  
  14.   
  15. for  i in cur.fetchall():  
  16.     f.write(str(i))  
  17.     f.write( " " )  
  18.   
  19. f.close()  
  20. cur.close()  







測試以下連接成功: index.psp?name=iamsese&addr=北京

2012年5月1日 星期二

lvm resize (add space)

我是參考 http://www.tcpdump.com/kb/os/linux/lvm-resizing-guide/all-pages.html 的資料
對LVM沒有概念可以看這篇 http://benjr.tw/node/490

1. 先確定你的VG有多餘的空間(Free space)
vgdisplay

2. 沒有多餘的空間時,可以添加空磁區到VG裡面使空間增加
vgextend
ex: vgextend ubuntu /dev/sda2

3. 開始增加磁碟大小(LV)
lvresize -L<想增加的大小>
ex: lvresize -L+500G /dev/ubuntu/root

4. 新增完之後要讓系統重新調整過inode
resize2fs -p
ex: resize2fs -p /dev/ubuntu/root

到這邊,新增LV空間步驟就完成了

2012年4月5日 星期四

freeNX for ubuntu 11.04

基本上是照這一篇安裝

首先把freenx加入apt-source
sudo add-apt-repository ppa:freenx-team
接下來把 natty 關鍵字改成舊的 lucid 不然更新會抓不到
sudo sed -i 's/natty/lucid/g' /etc/apt/sources.list.d/freenx-team-ppa-natty.list
之後就開始安裝啦
sudo apt-get update
sudo apt-get install freenx
由於比較新的版本不知道為什麼裡面不會自動安裝 nxsetup這隻程式m所以要另外下載
wget https://bugs.launchpad.net/freenx-server/+bug/576359/+attachment/1378450/+files/nxsetup.tar.gz
tar -xvf nxsetup.tar.gz
sudo cp nxsetup /usr/lib/nx/nxsetup
sudo /usr/lib/nx/nxsetup --install 
上面的步驟跑完,freeNX就裝好囉
接下來就是去抓windows裡面的安裝檔

Winows 的客戶端請到這邊下載

http://www.nomachine.com/download-client-windows.php

下載好就會指引你安裝以及設定你要連線的電腦,設定完就可以開始用囉

2012年3月31日 星期六

Opennebula 3.3.0 in Ubuntu 11.10 安裝

看不習慣的話可以到google doc看 http://goo.gl/sLoq7

這邊的安裝步驟主要是參考
http://www.qyjohn.net/?p=1581製作出來的
  1. [管理端] 安裝基本作業系統,這邊是採用Ubuntu 11.10

安裝光碟可以到 http://ftp.twaren.net/ubuntu-cd/ 這邊下載


  1. 安裝完作業系統,重開機就會出現登入的畫面
  2. 先使用自己的帳號登入,準備開始安裝Opennebula的套件,這邊是採用tarball的方式安裝
  3. 開始創建Opennebula所需要的目錄以及使用者跟群組

sudo mkdir -p /srv/cloud/
sudo groupadd -g 10000 cloud
sudo useradd -u 10000 -g cloud -m oneadmin -d /srv/cloud/one -s /bin/bash
sudo passwd oneadmin
sudo chown -R oneadmin:cloud /srv/cloud/
su -l oneadmin
ssh-keygen
cat ~/.ssh/id_rsa.pub > ~/.ssh/authorized_keys
echo “StrictHostKeyChecking no” > ~/.ssh/config
exit


  1. 安裝NFS服務,以供之後migration所需 (如果只有單台可跳過)

sudo apt-get install nfs-kernel-server
sudo pico /etc/exports


  1. 編輯 /etc/exports

加入此行

/srv/cloud *(rw,fsid=0,nohide,sync,root_squash,no_subtree_check)


  1. 啟動NFS服務

sudo /etc/init.d/nfs-kernel-server start


  1. 安裝Opennebula 需要使用到的套件

sudo apt-get install libsqlite3-dev libxmlrpc-c3-dev g++ ruby libopenssl-ruby libssl-dev ruby-dev
sudo apt-get install libxml2-dev libmysqlclient-dev libmysql++-dev libsqlite3-ruby libexpat1-dev
sudo apt-get install rake rubygems libxml-parser-ruby1.8 libxslt1-dev genisoimage scons
sudo apt-get install mysql-server
sudo gem install nokogiri
sudo gem install rake
sudo gem install xmlparser

  1. 建立MySQL資料庫,提供Opennebula使用

mysql -u root -p
CREATE USER ‘oneadmin’@'localhost’ IDENTIFIED BY ‘oneadmin’;
CREATE DATABASE opennebula;
GRANT ALL PRIVILEGES ON opennebula.* TO ‘oneadmin’ IDENTIFIED BY ‘oneadmin’;
quit;


  1. 以下更換成oneadmin使用者,下載並安裝opennebula

su -l oneadmin
wget http://dev.opennebula.org/attachments/download/478/opennebula-3.0.0.tar.gz
tar -zxvf opennebula-3.0.0.tar.gz
cd opennebula-3.0.0
scons sqlite=no mysql=yes
./install.sh -u oneadmin -g cloud -d /srv/cloud/one


  1. 編輯 ~/.bash_profile 新增變量,使之後的指令可以順利執行

export ONE_LOCATION=/srv/cloud/one
export ONE_AUTH=$ONE_LOCATION/.one/one_auth
export ONE_XMLRPC=http://localhost:2633/RPC2
export PATH=$ONE_LOCATION/bin:/usr/local/bin:/var/lib/gems/1.8/bin/:$PATH

source ~/.bash_profile


  1. 編輯 ~/.one/oneauth 設置之後要用的用戶名稱及密碼

mkdir ~/.one
echo “oneadmin:YOUR_PASSWORD” > ~/.one/one_auth
chmod 640 ~/.one/one_auth


  1. 編輯 ~/etc/oned.conf 更改使用MySQL資料庫

# DB = [ backend = "sqlite" ]


# Sample configuration for MySQL

DB = [ backend = "mysql",

server = "localhost",

port = 0,

user = "oneadmin",

passwd = "oneadmin",

db_name = "opennebula" ]


  1. 到這邊 Opennebula的管理節點就全部設定完畢,如果你只有一台(管理與計算節點一起),請繼續在這台執行以下的動作
  2. [計算端] 安裝計算節點的作業系統並登入
  3. 安裝虛擬化需使用的套件

sudo apt-get install qemu-kvm libvirt-bin bridge-utils ubuntu-vm-builder ruby


  1. 安裝NFS客戶端 (若只有一台可跳過)

sudo apt-get install nfs-common

  1. 編輯 /etc/fstab (在這邊我們假設剛剛的NFS伺服器在192.168.1.1)

192.168.1.1:/srv/cloud /srv/cloud nfs defaults 0 0


  1. 建立NFS目錄以及掛載遠端目錄

sudo mkdir -p /srv/cloud
sudo mount /srv/cloud


  1. 創建Opennebula要使用的使用者及群組 (單台可跳過此步驟)

sudo groupadd -g 10000 cloud
sudo useradd -u 10000 -g cloud -m oneadmin -s /bin/bash
sudo usermod -d /srv/cloud/one oneadmin
sudo passwd oneadmin
sudo chown oneadmin:cloud /srv/cloud/


  1. 編輯 /etc/libvirt/libvirtd.conf

unix_sock_group = “cloud”


  1. 編輯 /etc/libvirt/qemu.conf

vnc_listen = “0.0.0.0″


  1. 重新啟動libvirt

sudo service libvirt-bin restart
sudo chown :cloud /var/run/libvirt/libvirt-sock


  1. 編輯 /etc/network/interface,此處需視自己的網路狀況設定

auto eth1

iface eth1 inet manual


auto br1

iface br1 inet static

address 192.168.1.2

netmask 255.255.255.0

network 192.168.1.0

broadcast 192.168.1.255

bridge_ports eth1

bridge_stp off

bridge_fd 0

bridge_maxwait 0


  1. [管理端] 再來要把可以執行虛擬機器的節點添加進來,請注意,如果只有一台的話也要把自己添加進來
  2. 加入計算端

onehost create 192.168.1.2 im_kvm vmm_kvm tm_shared

onehost list

成功的話應該會看到機器已經加進來,狀態(STAT)需要是on


  1. 加入完之後,下載一個已經配置好的虛擬機器做測試

mkdir ~/one-templates
cd ~/one-templates
wget http://dev.opennebula.org/attachments/download/170/ttylinux.tar.gz
tar xzf ttylinux.tar.gz


  1. 編輯 ~/one-templates/small_network.txt

NAME = “Small Network”

TYPE = FIXED


BRIDGE = br1

LEASES = [ IP="192.168.1.5"]

LEASES = [ IP="192.168.1.6"]

LEASES = [ IP="192.168.1.7"]

LEASES = [ IP="192.168.1.8"]

LEASES = [ IP="192.168.1.9"]

LEASES = [ IP="192.168.1.10"]

LEASES = [ IP="192.168.1.11"]

LEASES = [ IP="192.168.1.12"]

LEASES = [ IP="192.168.1.13"]

LEASES = [ IP="192.168.1.14"]

LEASES = [ IP="192.168.1.15"]


  1. 加入網路定義到Opennebula

onevnet create small_network.net


  1. 編輯 ttylinux.one

NAME = ttylinux

CPU = 0.1

MEMORY = 64


DISK = [

source = "/srv/cloud/one/one-templates/ttylinux.img",

target = "hda",

readonly = "no" ]


NIC = [ NETWORK_ID = 0]


GRAPHICS = [ TYPE = "VNC"]


FEATURES=[ acpi="no" ]


  1. 開始創建虛擬機器

onevm create ttylinux.one


  1. 可以用這個指令看虛擬機

onevm list


  1. 詳細資料可以用這個指令看,0是上面list裡面你自己的虛擬機器ID

onevm show 0


  1. 用 onevm list 找到虛擬機的VNC port (本例為5900),即可以用vncviewer開啟虛擬機畫面


PS. 若遇到ruby的問題(invalid date format in specification: "2011-08-25 00:00:00.000000000Z"

),可以先試試看更新ruby

gem update --system (Ubunt不可用,需要使用apt-get update在執行以下指令)
gem install rubygems-update
update_rubygems
資料來源: http://stackoverflow.com/questions/7290575/invalid-date-format-specification-in-gemspec

2012年3月28日 星期三

Ubuntu using Tex

本來是參考這篇文章

後來發現 Ubuntu 套件庫已經有內建 texlive了
可以參考這篇

簡單來說,只要在Ubuntu環境下(我是用11.10)執行以下指令

$ sudo apt-get install texlive
$ sudo apt-get install texlive-full
等上面裝好之後應該就已經有了tex的環境,可以直接編譯文件了
如果想要 GUI 的編輯畫面可以多執行

$ sudo apt-get install gedit-latex-plugin
就會在附屬應用程式裡面多出一個 TeXworks 的程式,可以在裡面輸入tex文件編譯執行
懶得找的可以直些複製下面的執行
$ sudo apt-get install gedit-latex-plugin texlive-fonts-recommended latex-beamer texpower texlive-pictures texlive-latex-extra texpower-examples imagemagick
中文字型的部份找到很多,不過我測試的是從這邊

在Texlive安裝完之後可以去下載
ftp://cle.linux.org.tw/tex/cjk/fonts/nsungt1/nsungt1-1.4.2.tar.gz

解壓縮之後執行該目錄下的 ./install.sh 就會有中文字型可以用了
想知道怎麼寫的話,底下有個 test 的資料夾可以進去看範例