<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 167,  comments - 30,  trackbacks - 0
    假設您今天要開發一個動畫編輯程式,動畫由影格(Frame)組成,數個影格組合為動畫清單,動畫清單也可以由其它已完成的動畫清單組成,也可以在動畫清單與清單之間加入個別影格。無論是影格或動畫清單都可以播放,而動畫清單負責的就是組合影格或動畫清單,所以可以這么設計:




    對于Frame而言,Playlist是一個容器,然而Playlist也實作Playable,所以它也可以播放,您可以進一步地將Playlist組合至另一個Playlist中,以形成更長的播放清單。以Java實現的話。
    以Java實現的話。
    import java.util.*;

    interface Playable {
    void play();
    }

    class Frame implements Playable {
    private String image;
    Frame(String image) {
    this.image = image;
    }
    public void play() {
    System.out.println("播放 " + image);
    }
    }

    class Playlist implements Playable {
    private List<Playable> list = new ArrayList<Playable>();
    public void add(Playable playable) {
    list.add(playable);
    }
    public void play() {
    for(Playable playable : list) {
    playable.play();
    }
    }
    }

    public class Main {
    public static void main(String[] args) {
    Frame logo = new Frame("片頭 LOGO");

    Playlist playlist1 = new Playlist();
    playlist1.add(new Frame("Duke 左揮手"));
    playlist1.add(new Frame("Duke 右揮手"));

    Playlist playlist2 = new Playlist();
    playlist2.add(new Frame("Duke 走左腳"));
    playlist2.add(new Frame("Duke 走右腳"));

    Playlist all = new Playlist();
    all.add(logo);
    all.add(playlist1);
    all.add(playlist2);

    all.play();
    }
    }

    以Python實現的話:
    class Frame:
    def __init__(self, image):
    self.image = image
    def play(self):
    print("播放 " + self.image)

    class Playlist:
    def __init__(self):
    self.list = []
    def add(self, playable):
    self.list.append(playable);
    def play(self):
    for playable in self.list:
    playable.play()

    logo = Frame("片頭 LOGO")

    playlist1 = Playlist()
    playlist1.add(Frame("Duke 左揮手"))
    playlist1.add(Frame("Duke 右揮手"))

    playlist2 = Playlist()
    playlist2.add(Frame("Duke 走左腳"))
    playlist2.add(Frame("Duke 走右腳"))

    all = Playlist()
    all.add(logo)
    all.add(playlist1)
    all.add(playlist2)

    all.play();以UML來表示Composite模式的結構:



    具有層次性或組合性的物件可以使用Composite模式,像是電路元件、視窗元件等,使用Composite模式可以大大減低這些元件設計的復雜度,以Java標準API中AWT視窗元件為例,
    Component上有個paint()方法,可以進行元件的繪制,Container可以容納Component(如Button、Label等),而Container繼承Component,所以Container也可以容納Container,這也是Composite模式的實際例子:
     

    from : http://caterpillar.onlyfun.net/Gossip/index.html 



    posted @ 2012-10-12 16:20 David1228 閱讀(333) | 評論 (0)編輯 收藏

    云計算用一個朋友的話來說:”做云計算最苦逼的就是得時時刻刻為一些可能一輩子都碰不到的事做好準備。更苦逼的就是剛以為一個問題不會遇到,立刻就發生了。。。“。這個還真的沒有辦法,誰讓哥我是搞云計算的呢,簡單一個虛擬化就搞的你蛋疼,你還能想其它的嗎?一直糾結在做虛擬化使用什么鏡像格式,剛剛開始用了raw的file,后來發現LVM的很多特性對于虛擬化還是有比較理想的能力,而且性能也很不錯就用了LVM。后來被VMware騙了跑去搞Esxi接觸了VMDK,最近研究openstack發現了qcow2格式,貌似現在很流行呀。也說不上分析這些鏡像格式的能力,就簡單說說自己的一些使用心得。

    目前主要有那些格式來作為虛擬機的鏡像:
    raw
    (default) the raw format is a plain binary image of the disc image, and is very portable. On filesystems that support sparse files, images in this format only use the space actually used by the data recorded in them.
    老牌的格式了,用一個字來說就是裸,也就是赤裸裸,你隨便dd一個file就模擬了一個raw格式的鏡像。由于裸的徹底,性能上來說的話還是不錯的。目前來看,KVM和XEN默認的格式好像還是這個格式。因為其原始,有很多原生的特性,例如直接掛載也是一件簡單的事情。
    裸的好處還有就是簡單,支持轉換成其它格式的虛擬機鏡像對裸露的它來說還是很簡單的(如果其它格式需要轉換,有時候還是需要它做為中間格式),空間使用來看,這個很像磁盤,使用多少就是多少(du -h看到的大小就是使用大小),但如果你要把整塊磁盤都拿走的話得全盤拿了(copy鏡像的時候),會比較消耗網絡帶寬和I/O。接下來還有個有趣的問題,如果那天你的硬盤用著用著不夠用了,你咋辦,在買一塊盤。但raw格式的就比較犀利了,可以在原來的盤上追加空間:
    dd if=/dev/zero of=zeros.raw bs=1024k count=4096(先創建4G的空間)
    cat foresight.img zeros.raw > new-foresight.img(追加到原有的鏡像之后)
    當然,好東西是吹出來的,誰用誰知道,還是有挺多問題的。由于原生的裸格式,不支持snapshot也是很正常的。傳說有朋友用版本管理軟件對raw格式的文件做版本管理從而達到snapshot的能力,估計可行,但沒試過,這里也不妄加評論。但如果你使用LVM的裸設備,那就另當別論。說到LVM還是十分的犀利的,當年用LVM做虛擬機的鏡像,那性能杠杠的。而且現在好多兄弟用虛擬化都采用LVM來做的。在LVM上做了很多的優化,國外聽說也有朋友在LVM增量備份方面做了很多的工作。目前來LVM的snapshot、性能、可擴展性方面都還是有相當的效果的。目前來看的話,備份的話也問題不大。就是在虛擬機遷移方面還是有很大的限制。但目前虛擬化的現狀來看,真正需要熱遷移的情況目前需求還不是是否的強烈。雖然使用LVM做虛擬機鏡像的相關公開資料比較少,但目前來看犧牲一點靈活性,換取性能和便于管理還是不錯的選擇。

    對于LVM相關的特性及使用可以參考如下鏈接:

    http://www.ibm.com/developerworks/linux/library/l-lvm2/index.html

    cow
    copy-on-write format, supported for historical reasons only and not available to QEMU on Windows
    曾經qemu的寫時拷貝的鏡像格式,目前由于歷史遺留原因不支持窗口模式。從某種意義上來說是個棄嬰,還沒得它成熟就死在腹中,后來被qcow格式所取代。

    qcow
    the old QEMU copy-on-write format, supported for historical reasons and superseded by qcow2

    一代的qemu的cow格式,剛剛出現的時候有比較好的特性,但其性能和raw格式對比還是有很大的差距,目前已經被新版本的qcow2取代。其性能可以查看如下鏈接:
    http://www.linux-kvm.org/page/Qcow2

    qcow2
    QEMU copy-on-write format with a range of special features, including the ability to take multiple snapshots, smaller images on filesystems that don’t support sparse files, optional AES encryption, and optional zlib compression
    現在比較主流的一種虛擬化鏡像格式,經過一代的優化,目前qcow2的性能上接近raw裸格式的性能,這個也算是redhat的官方渠道了,哈哈,希望有朋友能拍他們磚:

    https://fedoraproject.org/wiki/Features/KVM_qcow2_Performance

    對于qcow2的格式,幾點還是比較突出的,qcow2的snapshot,可以在鏡像上做N多個快照:

    • 更小的存儲空間,即使是不支持holes的文件系統也可以(這下du -h和ls -lh看到的就一樣了)
    • Copy-on-write support, where the image only represents changes made to an underlying disk image(這個特性SUN ZFS表現的淋漓盡致)
    • 支持多個snapshot,對歷史snapshot進行管理
    • 支持zlib的磁盤壓縮
    • 支持AES的加密

    vmdk 
    VMware 3 & 4, or 6 image format, for exchanging images with that product
    VMware的格式,這個格式說的蛋疼一點就有點牛X,原本VMware就是做虛擬化起家,自己做了一個集群的VMDK的pool,做了自己的虛擬機鏡像格式。又拉著一些公司搞了一個OVF的統一封包。從性能和功能上來說,vmdk應該算最出色的,由于vmdk結合了VMware的很多能力,目前來看,KVM和XEN使用這種格式的情況不是太多。但就VMware的Esxi來看,它的穩定性和各方面的能力還是可圈可點。

    vdi
    VirtualBox 1.1 compatible image format, for exchanging images with VirtualBox.
    SUN收購了VirtualBox,Oracle又收購了SUN,這么說呢,vdi也算虛擬化這方面的一朵奇葩,可惜的是入主的兩家公司。SUN太專注于技術(可以說是IT技術最前端也不為過),Oracle又是開源殺手(mysql的沒落)。單純從能力上來說vdi在VirtualBox上的表現還是不錯的。也是不錯的workstation級別的產品。

    說了這么多虛擬機鏡像格式,這么多虛擬化,做云計算的傷不起呀,得為長期發展考慮,也有朋友對鏡像的轉換做了很多事情,簡單看看幾種鏡像的轉化:

    VMDK–>qcow2:

    kevin@kevin:~# qemu-img convert -f vmdk -O qcow2 SLES11SP1-single.vmdk SLES11SP1-single.img

    http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm3/index.html

    qcow2–>raw:

    kevin@kevin:~$ qemu-img convert -O qcow2 image-raw.raw image-raw-converted.qcow

    轉載自:http://www.prajnagarden.com/?p=248 
    posted @ 2012-10-11 15:43 David1228 閱讀(638) | 評論 (0)編輯 收藏
    通過源碼包安裝、配置Mysql詳細步驟:

    1、上傳mysql-5.5.8-linux2.6-x86_64.tar.gzWeb服務器的/usr/local/目錄下

    2、解壓并重命名

    # cd /usr/local

    # tar –xvzf mysql-5.5.8-linux2.6-x86_64.tar.gz

    # mv mysql-5.5.8-linux2.6-x86_64 mysql

    3、配置/etc/my.cnf

    1)安裝操作系統時如果安裝了MySql就會生成/etc/my.cnf,而系統自帶的MySql版本較低,所以替換已有的/etc/my.cnf,替換之前可以備份my.cnf

    #mv /etc/my.cnf  /etc/my.cnf_bak

    # cp /usr/local/mysql/support-files/my-medium.cnf /etc/my.cnf

    2)編輯/etc/my.cnf,配置IP連接,在mysqld中加入下邊的紅色字體

    #vi /etc/my.cnf

    [mysqld]

    port            = 3306

    socket          = /tmp/mysql.sock

    skip-name-resolve

    skip-external-locking

    3)保存,退出。

    4、添加mysql用戶和用戶組

    如果系統已經安裝了mysql,則在添加mysql用戶和用戶組的時候會提示mysql用戶(或用戶組)已經存在,這種提示是正常的。

    # groupadd mysql

    # useradd -g mysql mysql

    5、修改mysql目錄權限

    1)設定root用戶可以訪問

    # chown -R root /usr/local/mysql

    2)設定mysql組和mysql用戶能訪問/usr/local/mysql/usr/local/mysql/data

    # chgrp -R mysql /usr/local/mysql

    #chown -R mysql /usr/local/mysql/data

    6、創建mysql系統數據庫

    # cd /usr/local/mysql

    #./scripts/mysql_install_db --user=mysql&

    7、使用mysql用戶啟動mysqld

    #/usr/local/mysql/bin/mysqld_safe  -user=mysql&

    8、設定MySqlroot用戶的密碼

    假設root用戶的密碼為123456,根據實際環境自行設定

    #/usr/local/mysql/bin/mysqladmin -u root password 123456

    9、使用root用戶登錄MySql

    根據步驟8設定的用戶密碼登錄mysql

    # cd /usr/local/mysql/bin

    #./mysql -u root -p     

    Enter password:

    10、開啟mysql遠程訪問

    1)賦予root用戶遠程訪問權限

    # grant all privileges on *.* to root @"%" identified by "123456";

    #flush privileges;

    2)參數說明

    a)   grant all privileges:賦予所有權限,all可以替換為相關操作;

    b)   *.*:說明數據庫和表名,*代表所有;

    c)   root:說明是給root用戶設定權限,可以替換為其他用戶;

    d)   %:這里是Host名稱,允許所有的就用%;

    e)   123456:是root用戶的密碼;

    f)   flush privileges:是把新賦權限表刷新加載到內存,可以理解為即時生效。

    11、配置MySql自動啟動

    編輯/etc/rc.d/rc.local文件,在文件最底端加入啟動語句

    # vi /etc/rc.d/rc.local

    ……

    /usr/local/mysql/bin/mysqld_safe -user=mysql&

    通過rpm包安裝、配置及卸載mysql的詳細過程.

      以MySQL-server-4.0.14-0.i386.rpm為例,放在/data目錄下

      cd /data

      rpm -ivh MySQL-server-4.0.14-0.i386.rpm

      安裝完成后在/usr/share/mysql目錄中會有一個mysql的啟動腳本mysql.server及示例配置文件等(如my-huge.cnf、my-large.cnf、my-medium.cnf)

      拷貝一個示例配置文件作為mysql的配置文件:

      cp /usr/share/mysql/my-medium.cnf /etc/my.cnf

      rpm包安裝完后自動將mysql安裝成系統服務,所以可以使用下面命令啟動、停止mysql

      啟動mysql

      /etc/init.d/mysql start 或 service mysql start

      停止mysql

      /etc/init.d/mysql stop 或 service mysql stop

      到此,mysql服務就安裝配置完成。

      安裝mysql客戶端

      rpm -ivh MySQL-client-4.0.14-0.i386.rpm

      mysql安裝好后目錄結構如下:

      工具程序在/usr/bin目錄中---ls /usr/bin/mysql*

      服務器程序/usr/sbin/mysqld

      數據目錄/var/lib/mysql

      默認情況下mysql將錯誤日志文件、二進制日志文件及進程文件寫在/var/lib/mysql目錄中,如localhost.err、localhost.pid、localhost-bin.001等

      要改變這些情況可以修改/etc/my.cnf文件

      如將日志文件寫在/var/log目錄中,可以在my.cnf文件中加入下面兩行:

      [mysqld_safe]

      err-log = /var/log/mysqld.log

      有個實用程序/usr/bin/mysql_install_db,該程序可以用來初始化 mysql數據庫,即創建/var/log/mysql目錄,及創建mysql數據庫(mysql授權表等信息)及test數據庫(空庫),如果不小心刪 除了/var/log/mysql目錄可以通過該程序來初始化.

      卸載mysql

      rpm -qa|grep -i mysql

      rpm -ev MySQL-server-4.0.14-0 MySQL-client-4.0.14-0

      卸載后/var/lib/mysql中的數據及/etc/my.cnf不會刪除,如果確定沒用后就手工刪除

      rm -f /etc/my.cnf

      rm -rf /var/lib/mysql

    posted @ 2012-10-11 15:21 David1228 閱讀(339) | 評論 (0)編輯 收藏

    一、命令行方式

    關閉要調整的虛擬機,編輯虛擬機配置文件

    #virsh edit 'your vm name'

    找到配置文件中的以下字段:

    <graphics type='vnc' port='-1'/>

    加入鍵盤的語言布局后如下:

    <graphics type='vnc' port='-1' keymap='en-us'/>

    保存退出后,重新載入虛擬機配置文件

    #virsh create /etc/libvirt/qemu/'your vm name'.xml

    如果要避免這種情況,在使用virt-install安裝的時候,就加入鍵盤布局的字段

    --keymap=en-us 

    二、virt-manager方式

    在虛擬關閉的狀態下,通過virt-manager界面選中相應的虛擬機:

    open-->Details-->Display VNC-->keymap-->en-us

    保存后再啟動虛擬機就可以了
    轉載自:http://cncto.blog.51cto.com/blog/235831/886946

    posted @ 2012-08-06 12:10 David1228 閱讀(3121) | 評論 (0)編輯 收藏

    【簡介】

    Python(蟒蛇)是一種動態解釋型的編程語言。Python可以在Windows、UNIX、MAC等多種操作系統上使用,也可以在Java、.NET開發平臺上使用。

    python logo

    python logo

     

    【特點】

    1 Python使用C語言開發,但是Python不再有C語言中的指針等復雜的數據類型。

    2 Python具有很強的面向對象特性,而且簡化了面向對象的實現。它消除了保護類型、抽象類、接口等面向對象的元素。

    3 Python代碼塊使用空格或制表符縮進的方式分隔代碼。

    4 Python僅有31個保留字,而且沒有分號、begin、end等標記。

    5 Python是強類型語言,變量創建后會對應一種數據類型,出現在統一表達式中的不同類型的變量需要做類型轉換。

    python_book

    python book

    【搭建開發環境】

    1 可以到www.python.org下載安裝包,然后通過configure、make、make install進行安裝。

    2 也可以到www.activestate.com去下載ActivePython組件包。(ActivePython是對Python核心和常用模塊的二進制包裝,它是ActiveState公司發布的Python開發環境。ActivePython使得Python的安裝更加容易,并且可以應用在各種操作系統上。ActivePython包含了一些常用的Python擴展,以及Windows環境的編程接口)。對ActivePython來說,如果你是windows用戶,下載msi包安裝即可;如果你是Unix用戶,下載tar.gz包直接解壓即可。

    3 Python的IDE,包括PythonWin、Eclipse+PyDev插件、Komodo、EditPlus

    【版本】

    python2與python3是目前主要的兩個版本。

    如下兩種情況下,建議使用python2:

    1 你無法完全控制你即將部署的環境時;

    2 你需要使用一些特定的第三方包或擴展時;

    python3是官方推薦的且是未來全力支持的版本,目前很多功能提升僅在python3版本上進行。

    【hello world】

    1 創建hello.py

    2 編寫程序:

    1. if __name__ == '__main__':  
    2. print "hello word" 

    3 運行程序:

    1. python ./hello.py 

    【注釋】

    1 無論是行注釋還是段注釋,均以#加一個空格來注釋。

    2 如果需要在代碼中使用中文注釋,必須在python文件的最前面加上如下注釋說明:

    1. # -* - coding: UTF-8 -* - 

    3 如下注釋用于指定解釋器

    1. #! /usr/bin/python 

    【文件類型】

    1 Python的文件類型分為3種,即源代碼、字節代碼和優化代碼。這些都可以直接運行,不需要進行編譯或連接。

    2 源代碼以.py為擴展名,由python來負責解釋;

    3 源文件經過編譯后生成擴展名為.pyc的文件,即編譯過的字節文件。這種文件不能使用文本編輯器修改。pyc文件是和平臺無關的,可以在大部分操作系統上運行。如下語句可以用來產生pyc文件:

    1. import py_compile  
    2. py_compile.compile(‘hello.py’) 

    4 經過優化的源文件會以.pyo為后綴,即優化代碼。它也不能直接用文本編輯器修改,如下命令可用來生成pyo文件:

    1. python -O -m py_complie hello.py 

    【變量】

    1 python中的變量不需要聲明,變量的賦值操作即使變量聲明和定義的過程。

    2 python中一次新的賦值,將創建一個新的變量。即使變量的名稱相同,變量的標識并不相同。用id()函數可以獲取變量標識:

    1. x = 1 
    2. print id(x)  
    3. x = 2 
    4. print id(x) 

    3 如果變量沒有賦值,則python認為該變量不存在

    4 在函數之外定義的變量都可以稱為全局變量。全局變量可以被文件內部的任何函數和外部文件訪問。

    5 全局變量建議在文件的開頭定義。

    6 也可以把全局變量放到一個專門的文件中,然后通過import來引用:

    gl.py文件中內容如下:

    1. _a = 1 
    2. _b = 2 

    use_global.py中引用全局變量:

    1. import gl  
    2. def fun():  
    3. print gl._a  
    4. print gl._b  
    5. fun() 

    【常量】

    python中沒有提供定義常量的保留字。可以自己定義一個常量類來實現常量的功能。

    1. class _const:  
    2. class ConstError(TypeError): pass 
    3. def __setattr__(self,name,vlaue):  
    4. if self.__dict__.has_key(name):  
    5. raise self.ConstError, “Can’t rebind const(%s)”%name  
    6. self.__dict__[name]=value  
    7. import sys  
    8. sys.modules[__name__]=_const() 

    【數據類型】

    1 python的數字類型分為整型、長整型、浮點型、布爾型、復數類型。

    2 python沒有字符類型

    3 python內部沒有普通類型,任何類型都是對象。

    4 如果需要查看變量的類型,可以使用type類,該類可以返回變量的類型或創建一個新的類型。

    5 python有3種表示字符串類型的方式,即單引號、雙引號、三引號。單引號和雙引號的作用是相同的。python程序員更喜歡用單引號,C/Java程序員則習慣使用雙引號表示字符串。三引號中可以輸入單引號、雙引號或換行等字符。

    【運算符和表達式】

    1 python不支持自增運算符和自減運算符。例如i++/i–是錯誤的,但i+=1是可以的。

    2 1/2在python2.5之前會等于0.5,在python2.5之后會等于0。

    3 不等于為!=或<>

    4 等于用==表示

    5 邏輯表達式中and表示邏輯與,or表示邏輯或,not表示邏輯非

    【控制語句】

    1 條件語句:

    1. if (表達式) :  
    2. 語句1  
    3. else :  
    4. 語句2 

    2 條件語句:
     

    1. if (表達式) :  
    2. 語句1  
    3. elif (表達式) :  
    4. 語句2  
    5. …  
    6. elif (表達式) :  
    7. 語句n  
    8. else :  
    9. 語句m 

    3 條件嵌套:

    1. if (表達式1) :  
    2. if (表達式2) :  
    3. 語句1  
    4. elif (表達式3) :  
    5. 語句2  
    6. …  
    7. else:  
    8. 語句3  
    9. elif (表達式n) :  
    10. …  
    11. else :  
    12. … 

    4 python本身沒有switch語句。

    5 循環語句:

    1. while(表達式) :  
    2. …  
    3. else :  
    4. … 

    6 循環語句:

    1. for 變量 in 集合 :  
    2. …  
    3. else :  
    4. … 

    7 python不支持類似c的for(i=0;i<5;i++)這樣的循環語句,但可以借助range模擬:

    1. for x in range(0,5,2):  
    2. print x 

    【數組相關】

    1 元組(tuple):python中一種內置的數據結構。元組由不同的元素組成,每個元素可以存儲不同類型的數據,如字符串、數字甚至元素。元組是寫保護的,即元組創建之后不能再修改。元組往往代表一行數據,而元組中的元素代表不同的數據項。可以把元組看做不可修改的數組。創建元組示例如下:

    1. tuple_name=(“apple”,”banana”,”grape”,”orange”) 

    2 列表(list):列表和元組相似,也由一組元素組成,列表可以實現添加、刪除和查找操作,元素的值可以被修改。列表是傳統意義上的數組。列表創建示例如下:

    1. list=[“apple”,”banana”,”grage”,”orange”] 

    可以使用append方法來在尾部追加元素,使用remove來刪除元素。

    3 字典(dictionary):由鍵-值對組成的集合,字典中的值通過鍵來引用。鍵和值之間用冒號隔開,鍵-值對之間用逗號隔開,并且被包含在一對花括號中。創建示例如下:

    1. dict={“a”:”apple”, “b”:”banana”, “g”:”grage”, “o”:”orange”} 

    4 序列:序列是具有索引和切片能力的集合。元組、列表和字符串都屬于序列。

    【函數相關】

    1 python程序由包(package)、模塊(module)和函數組成。包是由一系列模塊組成的集合。模塊是處理某一類問題的函數和類的集合。

    2 包就是一個完成特定任務的工具箱。

    3 包必須含有一個__init__.py文件,它用于標識當前文件夾是一個包。

    4 python的程序是由一個個模塊組成的。模塊把一組相關的函數或代碼組織到一個文件中,一個文件即是一個模塊。模塊由代碼、函數和類組成。導入模塊使用import語句。

    5 包的作用是實現程序的重用。

    6 函數是一段可以重復多次調用的代碼,函數定義示例如下:

    1. def arithmetic(x,y,operator):  
    2. result={  
    3. “+”:x+y,  
    4. “-“:x-y,  
    5. “*”:x*y,  
    6. “/”:x/y  

    7 函數返回值可以用return來控制。

    【字符串相關】

    1 格式化輸出:

    1. format=”%s%d” % (str1,num)  
    2. print format 

    2 用+進行字符串的合并:

    1. str1=”hello”  
    2. str2=”world”  
    3. result=str1+str2 

    3 字符串截取可以通過索引/切片,也可以通過split函數。

    4 通過切片截取字符串:

    1. word=”world”  
    2. print word[0:3] 

    5 python使用==和!=來進行字符串比較。如果比較的兩個變量的類型不相同,那么結果必然為不同。

    【文件處理】

    1 簡單處理文件:

    1. context=”hello,world”  
    2. f=file(“hello.txt”,’w’)  
    3. f.write(context);  
    4. f.close() 

    2 讀取文件可以使用readline()函數、readlines()函數和read函數。

    3 寫入文件可以使用write()、writelines()函數

    【對象和類】

    1 python用class保留字來定義一個類,類名的首字符要大寫。當程序員需要創建的類型不能用簡單類型來表示時,就需要定義類,然后利用定義的類創建對象。定義類示例:

    1. class Fruit:  
    2. def grow(self):  
    3. print “Fruit grow” 

    2 當一個對象被創建后,包含了三方面的特性,即對象的句柄、屬性和方法。創建對象的方法:

    1. fruit = Fruit()  
    2. fruit.grow() 

    3 python沒有保護類型的修飾符

    4 類的方法也分為公有方法和私有方法。私有函數不能被該類之外的函數調用,私有的方法也不能被外部的類或函數調用。

    5 python使用函數”staticmethod()“或”@ staticmethod“指令的方法把普通的函數轉換為靜態方法。靜態方法相當于全局函數。

    6 python的構造函數名為__init__,析構函數名為__del__

    7 繼承的使用方法:

    1. class Apple(Fruit):  
    2. def … 

    【連接mysql】

    1 用MySQLdb模塊操作MySQL數據庫非常方便。示例代碼如下:

    1. import os, sys  
    2. import MySQLdb  
    3. try:  
    4. conn MySQLdb.connect(host=’localhost’,user=’root’,passwd=’’,db=’address’  
    5. except Exception,e:  
    6. print e  
    7. sys.exit()  
    8. cursor=conn.cursor()  
    9. sql=’insert into address(name, address) values(%s, %s)’  
    10. value=((“zhangsan”,”haidian”),(“lisi”,”haidian”))  
    11. try 
    12. cursor.executemany(sql,values)  
    13. except Exception, e:  
    14. print e  
    15. sql=”select * from address”  
    16. cursor.execute(sql)  
    17. data=cursor.fetchall()  
    18. if data  
    19. for x in data:  
    20. print x[0],x[1]  
    21. cursor.close()  
    22. conn.close() 

    謝謝!

    原文鏈接: http://roclinux.cn/?p=2338


     

    posted @ 2012-07-10 09:35 David1228 閱讀(312) | 評論 (0)編輯 收藏
    一、問題描述
        根據CentOS-6.0-x86_64-bin-DVD1.iso制作虛擬機鏡像后,使用該鏡像創建的虛

    擬機都是網卡eth1,雖然能設置上ip但是虛擬網關并不能設置成功。
        并且隨著鏡像->虛擬機->鏡像->虛擬機類似流程迭代,網卡ethx會遞增。總結一

    句話:就是eth0不起作用。
        
    二、解決問題如下:

        1、在grub里增加biosdevname=0的啟動參數,形如

        kernel /vmlinuz-2.6.32-131.21.1.el6.i686 ro root=/dev/mapper/vg_test-

    lv_root rd_LVM_LV=vg_test/lv_root rd_LVM_LV=vg_test/lv_swap rd_NO_LUKS rd_NO_MD 

    rd_NO_DM LANG=en_US.UTF-8 SYSFONT=latar
        cyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet 

    biosdevname=0

        2、刪除udev的配置文件rm -f /etc/udev/rules.d/70-persistent-net.rules。

    (我的做法比較彪悍,直接把rules.d干掉了。)

        第3、4、5步是針對單個主機或者虛擬機而言的,我們保證鏡像中的eth0網卡配置

    文件存在,名字為ifcfg-eth0文件中DEVICE=eth0。
        
        3、把網卡配置文件改名

            mv ifcfg-em1 ifcfg-eth0

        4、把網卡配置文件內容修正,把em1的全部改成eth0

            perl -p -i -e ‘s/em1/eth0/g’ ifcfg-eth0 

        5、重啟系統即可

        6、配置ssh
            6.1:/etc/ssh/sshd_config   配置文件中修改或加入UseDNS=no,將

    #UseDNS=yes 改成:UseDNS=no
            6.2:/etc/ssh/sshd_config   配置文件中將#GSSAPIAuthentication 

    no 的#號去掉,更改成GSSAPIAuthentication no
            6.3:/etc/ssh/sshd_config   配置文件中將PermitRootLogin no修改

    為yes 
            6.4:   
            6.5:/etc/ssh/sshd_config   配置文件中將PasswordAuthentication 

    no修改為yes就可以了
            6.6:/etc/nsswitch.conf     配置文件中,將hosts:files dns  改

    成:hosts:files
            6.7:/etc/init.d/sshd restart         重啟sshd進程使配置生效
            
            其中6.1、6.2、6.6都是處于性能方面考慮
        
        7、鏡像中存在bcec提供的setIp、rc.local等腳本。
        
        經過在39.4環境測試,操作過程從原始鏡像 -> 新虛擬機 -> 制作鏡像鏡像 -> 

    新鏡像虛擬機,網卡都沒有問題,都是eth0。

     Centos6.0制作鏡像網卡問題總結-zhgp 
    posted @ 2012-06-15 11:07 David1228 閱讀(1001) | 評論 (0)編輯 收藏

    禁用 SSH 遠程主機的公鑰檢查

    SSH 公鑰檢查是一個重要的安全機制,可以防范中間人劫持等黑客攻擊。但是在特定情況下,嚴格的 SSH 公鑰檢查會破壞一些依賴 SSH 協議的自動化任務,就需要一種手段能夠繞過 SSH 的公鑰檢查。

    首先看看什么是 SSH 公鑰檢查

    SSH 連接遠程主機時,會檢查主機的公鑰。如果是第一次該主機,會顯示該主機的公鑰摘要,提示用戶是否信任該主機:
    The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established. RSA key fingerprint is a3:ca:ad:95:a1:45:d2:57:3a:e9:e7:75:a8:4c:1f:9f. Are you sure you want to continue connecting (yes/no)? 
    當選擇接受,就會將該主機的公鑰追加到文件 ~/.ssh/known_hosts 中。當再次連接該主機時,就不會再提示該問題了。 如果因為某種原因(服務器系統重裝,服務器間IP地址交換,DHCP,虛擬機重建,中間人劫持),該IP地址的公鑰改變了,當使用 SSH 連接的時候,會報錯:
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that the RSA host key has just been changed. The fingerprint for the RSA key sent by the remote host is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05. Please contact your system administrator. Add correct host key in /home/jiangxin/.ssh/known_hosts to get rid of this message. Offending key in /home/jiangxin/.ssh/known_hosts:81 RSA host key for 192.168.0.110 has changed and you have requested strict checking. Host key verification failed. 
    上面的警告信息說的是:
    • 服務器公鑰已經改變,新的公鑰的摘要是:e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05.
    • 該服務器原來的公鑰記錄在文件 ~/.ssh/known_hosts 中第 81 行。
    如果確認不是中間人劫持,需要連接到該服務器,怎么辦呢?最簡單的就是用 vi 打開 ~/.ssh/known_hosts 文件,定位到 81 行,將該行刪除。之后就可以使用 ssh 連接了。

    如何讓連接新主機時,不進行公鑰確認?

    在首次連接服務器時,會彈出公鑰確認的提示。這會導致某些自動化任務,由于初次連接服務器而導致自動化任務中斷。或者由于  ~/.ssh/known_hosts 文件內容清空,導致自動化任務中斷。 SSH 客戶端的 StrictHostKeyChecking 配置指令,可以實現當第一次連接服務器時,自動接受新的公鑰。只需要修改 /etc/ssh/ssh_config 文件,包含下列語句:
    Host *  StrictHostKeyChecking no 
    或者在 ssh 命令行中用 -o 參數
    $ ssh  -o StrictHostKeyChecking=no  192.168.0.110

    如何防止遠程主機公鑰改變導致 SSH 連接失敗

    當確認中間人劫持攻擊風險比較小的情況下,才可以使用下面的方法,禁用 SSH 遠程主機的公鑰檢查。 SSH 客戶端提供一個 UserKnownHostsFile 配置,允許指定不同的 known_hosts 文件。那么將 known_hosts 指向不同的文件,不就不會造成公鑰沖突導致的中斷了么?
    $ ssh -o UserKnownHostsFile=/dev/null 192.168.0.110 The authenticity of host '192.168.0.110 (192.168.0.110)' can't be established. RSA key fingerprint is e9:0c:36:89:7f:3c:07:71:09:5a:9f:28:8c:44:e9:05. Are you sure you want to continue connecting (yes/no)? 
    看,提示信息由公鑰改變中斷警告,變成了首次連接的提示。 和之前提到的 StrictHostKeyChecking 配置配合使用,則不再有任何警告出現了:
    $ ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null 192.168.0.110 Warning: Permanently added '192.168.0.110' (RSA) to the list of known hosts. jiangxin@192.168.0.110's password: 
    如果設置了無口令 SSH 登錄(即通過客戶端公鑰認證),就可以直接連接到遠程主機。這是基于 SSH 協議的自動化任務常用的手段。

    轉自: http://www.worldhello.net/2010/04/08/1026.html 
    可參考資料:http://www.symantec.com/connect/articles/ssh-host-key-protection
    posted @ 2012-06-15 09:30 David1228 閱讀(426) | 評論 (0)編輯 收藏

    在Set中有一個排序的集合SortedSet,用來保存按照自然順序排列的對象。Queue中同樣引入了一個支持排序的FIFO模型。

    并發隊列與Queue簡介 中介紹了,PriorityQueue和PriorityBlockingQueue就是支持排序的Queue。顯然一個支持阻塞的排序Queue要比一 個非線程安全的Queue實現起來要復雜的多,因此下面只介紹PriorityBlockingQueue,至于PriorityQueue只需要去掉 Blocking功能就基本相同了。

     轉自: http://m.tkk7.com/xylz/archive/2010/07/30/327582.htm

    排序的BlockingQueue — PriorityBlockingQueue

    先簡單介紹下PriorityQueue,因為PriorityBlockingQueue內部就是通過PriorityQueue適配實現的,只不過通過鎖進行同步和阻塞而已。

    PriorityQueue是一個數組實現的,是一個二叉樹的實現,這個二叉樹的任意一個節點都比其子節點要小,這樣頂點就是最小的節點。每一個元 素或者節點要么本身是可比較的(Comparable),或者隊列本身帶有一個比較器(Comparator<? super E>),所有元素就是靠比較自身的大小來確定順序的。而數組中頂點就是數組的第0個元素,因此出隊列的話總是取第0個元素。對于第0個元素,其子節 點是第1個元素和第2個元素,對于第1個元素,其子元素又是第3/4個元素,以此類推,第i個元素的父節點就是(i-1)/2。這樣任意一個元素加入隊列 就從其父節點(i-1)/2開始比較,一旦新節點比父節點小就交換兩個節點,然后繼續比較新節點與其新的父節點。知道所有節點都是按照父節點一定比子節點 小的順序排列。這是一個有點復雜的算法,此處不再討論更多的細節。不管是刪除還是查找,我們只需要了解的頂點(索引為0的元素)總是最小的。

    特別需要說明的是PriorityQueue是一個無界的隊列,也就是說一旦元素的個數達到了數組的大小,那么就將數組擴大50%,這樣這個數組就是無窮大的。當然了如果達到了整數的最大值就會得到一個OutOfMemoryError,這個是由邏輯保證的。

     

    對于PriorityBlockingQueue而言,由于是無界的,因此就只有非空的信號,也就是說只有take()才能阻塞,put是永遠不會阻塞(除非達到Integer.MAX_VALUE直到拋出一個OutOfMemoryError異常)。

    只有take()操作的時候才可能因為隊列為空而掛起。同時其它需要操作隊列變化和大小的只需要使用獨占鎖ReentrantLock就可以了,非常方便。需要說明的是PriorityBlockingQueue采用了一個公平的鎖。

     

    總的來說PriorityBlockingQueue 不是一個FIFO的隊列,而是一個有序的隊列,這個隊列總是取“自然順序”最小的對象,同時又是一個只能出隊列阻塞的BlockingQueue,對于入隊列卻不是阻塞的。所有操作都是線程安全的。

     

    直接交換的BlockingQueue — SynchronousQueue

     

    這是一個很有意思的阻塞隊列,其中每個插入操作必須等待另一個線程的移除操作,同樣任何一個移除操作都等待另一個線程的插入操作。因此此隊列內部其 實沒有任何一個元素,或者說容量是0,嚴格說并不是一種容器。由于隊列沒有容量,因此不能調用peek操作,因為只有移除元素時才有元素。

    一個沒有容量的并發隊列有什么用了?或者說存在的意義是什么?

    SynchronousQueue 的實現非常復雜,當然了如果真要去分析還是能夠得到一些經驗的,但是前面分析了過多的結構后,發現越來越陷于數據結構與算法里面了。我的初衷是通過研究并 發實現的原理來更好的利用并發來最大限度的利用可用資源。所以在后面的章節中盡可能的少研究數據結構和算法,但是為了弄清楚里面的原理,必不可免的會涉及 到一些這方面的知識,希望后面能夠適可而止。

    再回到話題。SynchronousQueue 內部沒有容量,但是由于一個插入操作總是對應一個移除操作,反過來同樣需要滿足。那么一個元素就不會再SynchronousQueue 里面長時間停留,一旦有了插入線程和移除線程,元素很快就從插入線程移交給移除線程。也就是說這更像是一種信道(管道),資源從一個方向快速傳遞到另一方 向。

    需要特別說明的是,盡管元素在SynchronousQueue 內部不會“停留”,但是并不意味之SynchronousQueue 內部沒有隊列。實際上SynchronousQueue 維護者線程隊列,也就是插入線程或者移除線程在不同時存在的時候就會有線程隊列。既然有隊列,同樣就有公平性和非公平性特性,公平性保證正在等待的插入線 程或者移除線程以FIFO的順序傳遞資源。

    顯然這是一種快速傳遞元素的方式,也就是說在這種情況下元素總是以最快的方式從插入著(生產者)傳遞給移除著(消費者),這在多任務隊列中是最快處理任務的方式。在線程池的相關章節中還會更多的提到此特性。

     

    事實上在《并發隊列與Queue簡介》 中介紹了還有一種BlockingQueue的實現DelayQueue,它描述的是一種延時隊列。這個隊列的特性是,隊列中的元素都要延遲時間(超時時 間),只有一個元素達到了延時時間才能出隊列,也就是說每次從隊列中獲取的元素總是最先到達延時的元素。這種隊列的場景就是計劃任務。比如以前要完成計劃 任務,很有可能是使用Timer/TimerTask,這是一種循環檢測的方式,也就是在循環里面遍歷所有元素總是檢測元素是否滿足條件,一旦滿足條件就 執行相關任務。顯然這中方式浪費了很多的檢測工作,因為大多數時間總是在進行無謂的檢測。而DelayQueue 卻能避免這種無謂的檢測。在線程池的計劃任務部分還有更加詳細的討論此隊列實現。

     

    下面就對常見的BlockingQueue進行小節下,這里不包括雙向的隊列,盡管ConcurrentLinkedQueue不是可阻塞的Queue,但是這里還是將其放在一起進行對比。

     

    并發隊列比較

    如果不需要阻塞隊列,優先選擇ConcurrentLinkedQueue;如果需要阻塞隊列,隊列大小固定優先選擇 ArrayBlockingQueue,隊列大小不固定優先選擇LinkedBlockingQueue;如果需要對隊列進行排序,選擇 PriorityBlockingQueue;如果需要一個快速交換的隊列,選擇SynchronousQueue;如果需要對隊列中的元素進行延時操 作,則選擇DelayQueue。

    posted @ 2012-03-19 14:45 David1228 閱讀(411) | 評論 (0)編輯 收藏

    2012-01-08 18:14:40     我來說兩句 
    收藏
    以前從來沒有使用過ruby,這兩天剛好要使用GitHub上的離線wiki系統gollum,所以要在偶的ubuntu下安裝ruby和ruby-gems。其中遇到一些問題:
     
     
     
    如果使用apt-get install ruby 和apt-get install rubygems1.8
     
    當使用gem install 命令時報以下錯誤:
     
     
     
    ERROR: While executing gem ... (TypeError) instance of Date needs to have method `marshal_load
     
     
     
    可能是Ubuntu環境的原因,那么就改用rvm安裝,參考了http://beginrescueend.com/rvm/install/
     
    若以非root模式安裝:
     
     
     
    bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
     
     
     
     
     添加rvm scripts路徑變量到bash:
     
     
     
         echo '[[ -s "$HOME/.rvm/scripts/rvm" ]] && . "$HOME/.rvm/scripts/rvm" # Load RVM function' >> ~/.bash_profile
     
      
     
     讓新的bash生效:
     
     
     
         source ~/.bash_profile
     
     
     
    安裝ruby1.9.2:
     
        rvm install 1.9.2
     
     
     
    讓系統默認使用1.92:
     
        rvm use 1.9.2 --default
     
     
     
     
     
     
    檢查安裝是否OK:
     
        ruby  -v
     
    --------------------------------------------
     
    接下來安裝rubygems
     
    先到官網下載安裝包http://rubygems.org/pages/download
     
     
     
     
    然后安裝
     
    ruby setup.rb
     
     
     
     
    默認采用淘寶的Gem鏡像站點
     
     
     
     
    gem source http://ruby.taobao.org/
     
     
     
     
    接下來就可以使用gem install xxx命令了,just enjoy it!
     
     
     
     
    PS:如過使用gem install報錯,可能是Ubuntu本身少一些依賴,比如我安裝gollum時缺少依賴libxml2,libxslt,
     
    缺少啥就install 啥:
     
     
     
    apt-get install libxml2
     
    apt-get install libxslt
     
    轉自:
    http://www.2cto.com/os/201201/116337.html
    posted @ 2012-03-14 10:08 David1228 閱讀(989) | 評論 (0)編輯 收藏
     rpm --erase --allmatches --nodeps xmlrpc-c-devel-1.16.24-1206.1840.el5_7.4
    posted @ 2012-02-14 17:31 David1228 閱讀(445) | 評論 (0)編輯 收藏
    僅列出標題
    共16頁: First 上一頁 2 3 4 5 6 7 8 9 10 下一頁 Last 

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    常用鏈接

    留言簿(4)

    隨筆分類

    隨筆檔案

    文章檔案

    新聞分類

    新聞檔案

    相冊

    收藏夾

    Java

    Linux知識相關

    Spring相關

    云計算/Linux/虛擬化技術/

    友情博客

    多線程并發編程

    開源技術

    持久層技術相關

    搜索

    •  

    積分與排名

    • 積分 - 358723
    • 排名 - 154

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 狠狠亚洲婷婷综合色香五月排名| 久久亚洲私人国产精品vA| 国产视频精品免费视频| 亚洲酒色1314狠狠做| 在线观看成人免费视频| 国产黄片不卡免费| 亚洲中文字幕无码av在线| 四虎永久免费网站免费观看| 免费成人在线电影| 亚洲AV无码一区二区三区牲色 | 亚洲综合网站色欲色欲| 亚洲视频免费观看| 特黄特色的大片观看免费视频| 亚洲人成网站影音先锋播放| 四虎影院免费视频| 久久久久免费精品国产小说| 久久久久亚洲AV无码去区首| 亚洲午夜免费视频| 国产精品亚洲mnbav网站| 最新欧洲大片免费在线| 亚在线观看免费视频入口| 美女视频免费看一区二区| 亚洲综合色一区二区三区小说| 亚洲色偷偷狠狠综合网| 女人与禽交视频免费看| 99视频在线看观免费| 久久av免费天堂小草播放| 亚洲精品伦理熟女国产一区二区| 亚洲激情中文字幕| 国产美女亚洲精品久久久综合| 青青青青青青久久久免费观看| 国产高清不卡免费视频| 四虎国产精品永免费| 亚洲精品国产摄像头| 亚洲综合丁香婷婷六月香| 亚洲Av无码精品色午夜| 亚洲一区二区三区乱码A| 四虎影视在线永久免费看黄| 大陆一级毛片免费视频观看| 每天更新的免费av片在线观看| 免费看少妇高潮成人片|