優點
·靜態工廠方法有名稱
·不用每次都創建新實例
·可以返回遠返回類型的任何子類型的對象
·在創建參數化類型實例的時候代碼更簡潔
缺點
·不能被子類化
·它們與其他的靜態方法實際上沒有任何區別
如果類的構造器或者靜態工廠中具有多個參數,可以考慮使用Builder模式
編寫一個包含單個元素的枚舉類型
public enum Elvis{
INSTANCE;
public void leaveTheBuilding*(){
...}
}
">public enum Elvis{
INSTANCE;
public void leaveTheBuilding*(){
...}
}
讓不需要實例化的類擁有私有(private)構造器來避免被實例化
//Noninstantiable utility class
public enum UtilityClass{
private UtilityClass(){
throw new AssertinError();
}
...
}
">//Noninstantiable utility class
public enum UtilityClass{
private UtilityClass(){
throw new AssertinError();
}
...
}
使用靜態的初始化器(initialize)避免創建重復的Calendar,TimeZone和Date實例
import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class Person {
private Date birthDate;
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
BOOM_START = gmtCal.getTime();
gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
BOOM_END = gmtCal.getTime();
}
public boolean isBabyBoomer() {
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) <= 0;
}
}
">import java.util.Calendar;
import java.util.Date;
import java.util.TimeZone;
public class Person {
private Date birthDate;
private static final Date BOOM_START;
private static final Date BOOM_END;
static {
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
BOOM_START = gmtCal.getTime();
gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
BOOM_END = gmtCal.getTime();
}
public boolean isBabyBoomer() {
return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) <= 0;
}
}
優先使用基本類型而不是裝箱基本類型,要當心無意識的自動裝箱。
一旦對象引用已經過期,只需清空這些引用即可。
終結方法(finalizer)通常是不可預測的,也是很危險的,一般情況下是不必要的。
不應該依賴終結方法來更新重要的持久狀態。
顯式終止方法的典型例子:InputStream,OutputStream,java.sql.Connection的Close
·類的每個實例本質上都是唯一的
·不關心類是否提供了“邏輯相等”
·超類已經覆蓋了equals,從超類繼承過來的行為對于子類也是合適的
·類是私有的或是包級私有的,應該覆蓋父類的equals方法保證永遠不會被調用
1.不要提供任何會修改對象狀態的方法
2.保證類不會被擴展
3.使所有域都是final
4.使所有域都成為私有的
5.確保對于任何可變組建的互斥訪問
- 現有的類可以很容易被更新,以實現新的接口
- 接口是定義minin(混合類型)的理想選擇
- 接口允許我們構造非層次結構的類型框架
SuppressWarnings注解始終在盡可能小的范圍中使用。
數組是協變得(covariant)。
數組是具體化的。
謹慎地選擇方法的名稱
不要過于追求提供便利的方法
避免過長的參數列表
無法使用for-each的情形
1.過濾
2.轉換
3.平行迭代
正確的做法:使用BigDecimal,int或者long進行貨幣計算
字符串不適合替代其他的值類型
字符串不適合代替枚舉類型
字符串不適合替代聚集類型
字符串也不適合太呆能力表(capabilities)
反射機制的代價
喪失了編譯時類型檢查的好處
執行反射訪問所需要的代碼非常笨拙和冗長
性能損失
JAVA提供了三種可拋出結構(throwable)
1.受檢的異常(checked exception)
2.運行時異常(run-time exception)
3.錯誤(error)
關鍵字synchronized可以保證在同一時刻,只有一個線程可以執行某一個方法,或者某一個代碼塊。
代價
1.實現Serializable接口而付出的最大代價是,可改變性變低
2.增加了出現Bug和安全漏洞的可能性
3.隨著類發行新的版本,相關的測試負擔也增加了
解決方法:
1、insert一行,再rollback就產生segment了。
該方法是在在空表中插入數據,再刪除,則產生segment。導出時則可導出空表。
2、設置deferred_segment_creation 參數
show parameter deferred_segment_creation
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
deferred_segment_creation boolean TRUE
SQL> alter system set deferred_segment_creation=false;
系統已更改。
SQL> show parameter deferred_segment_creation
NAME TYPE VALUE
----------------------------------- ----------- ------------------------------
deferred_segment_creation boolean FALSE
該參數值默認是TRUE,當改為FALSE時,無論是空表還是非空表,都分配segment。
需注意的是:該值設置后對以前導入的空表不產生作用,仍不能導出,只能對后面新增的表產生作用。如需導出之前的空表,只能用第一種方法。
搞了我好久,最后查到這個方法。
先查詢一下當前用戶下的所有空表
select table_name from user_tables where NUM_ROWS=0;
用以下這句查找空表
select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0
把查詢結果導出,執行導出的語句
'ALTERTABLE'||TABLE_NAME||'ALLOCATEEXTENT;'
-----------------------------------------------------------
alter table AQ$_AQ$_MEM_MC_H allocate extent;
alter table AQ$_AQ$_MEM_MC_G allocate extent;
alter table AQ$_AQ$_MEM_MC_I allocate extent;
alter table AQ$_AQ_PROP_TABLE_T allocate extent;
alter table AQ$_AQ_PROP_TABLE_H allocate extent;
alter table AQ$_AQ_PROP_TABLE_G allocate extent;
alter table AQ$_AQ_PROP_TABLE_I allocate extent;
alter table AQ$_KUPC$DATAPUMP_QUETAB_T allocate extent;
alter table AQ$_KUPC$DATAPUMP_QUETAB_H allocate extent;
alter table AQ$_KUPC$DATAPUMP_QUETAB_G allocate extent;
alter table AQ$_KUPC$DATAPUMP_QUETAB_I allocate extent;
'ALTERTABLE'||TABLE_NAME||'ALLOCATEEXTENT;'
-----------------------------------------------------------
alter table AQ$_SYS$SERVICE_METRICS_TAB_T allocate extent;
alter table AQ$_SYS$SERVICE_METRICS_TAB_H allocate extent;
alter table AQ$_SYS$SERVICE_METRICS_TAB_G allocate extent;
alter table AQ$_SYS$SERVICE_METRICS_TAB_I allocate extent;
然后再執行
exp 用戶名/密碼@數據庫名 file=/home/oracle/exp.dmp log=/home/oracle/exp_smsrun.log
成功!
/proc/bus/usb/* USBデバイス情報
/proc/cpuinfo CPU情報
/proc/interrupts IRQ情報
/proc/pci PCIデバイス情報
/proc/scsi/scsi SCSIデバイス情報
Linuxは、ハードウェアへのアクセスを抽象化するデバイスファイルを持っています。
デバイス情報を確認するためのコマンドも用意されています。
USBデバイスの情報を表示するには lsusb
PCIデバイスの情報を表示するには lspci
1.1.4 デバイスドライバのロード
Linuxでは、デバイスドライブはカーネルの一部として提供されています。
ロードされているカーネルモジュールを確認するには、lsmodコマンドを使います。
手動でロードする場合はmodprobeコマンドを実行します。
1.2 システムの起動
1.2.2 ブートオプションの指定
GRUBでブートオプションを指定するには、起動時の畫面でAキーを押します。
すると、キーボートからパラメータを入力できるようになります。
1.2.3 起動時のイベント確認
dmesgコマンドを使うと、システム起動時にどのような処理が行われたのかを確認できます。
システムのメインログファイルである/var/log/messagesにも起動時のメッセージが記録されています。
1.3 ランレベルとシャットダウン
1.3.1 ランレベル
種類
0 停止
1 シングルユーザーモード
2 マルチユーザーモード
3 マルチユーザーモード
4 未使用
5 マルチユーザーモード
6 再起動
S/s シングルユーザーモード
シングルユーザーモード rootユーザーだけが利用できる狀態です。
ランレベルの変更
現在のランレベルを表示するには、runlevelコマンドを使います。
ランレベルを変更するには、スーパーユーザーでinitコマンドもしくはtelinitコマンド
を使います。
#init 1
デフォルトのランレベルの設定
Linuxが起動すると、最初のプロセスとしてinitが実行され。
デフォルトのランレベルは、/etc/inittabに記述されています。
/etc/inittabファイルでデフォルトのランレベルを指定できます。書式も覚えておきましょう。
1.3.2 システムのシャットダウンと再起動
システムのシャットダウンや再起動は、shutdownコマンドを使って操作します。
shutdown [option] 時間 「メッセージ」
-h シャットダウン完了後にシステムを停止する
-r シャットダウン完了後にシステムを再起動する
-f 次回起動時にfsckをスキップする
-F 次回起動時にfsckを必ず実行する
-k 実際にシャットダウンせず警告メッセージを通知する
-c 現在実行中のシャットダウンをキャンセルする
第2章 Linuxのインストールとパッケージ管理
2.1 ハードディスクのレイアウト設計
ルートパーティション
さわっぷ領域
?/home
?/var
?/usr
?/boot
?スワップ領域
スワップ領域のサイズは物理メモリと同程度~2倍程度のサイズを割り當てます
用途が異なるディレクトリは別パーティションに配置するようにします。
2.2 ブートマネージャのインストール
2.2.1 GRUB
GRUBは多機能なブートローダです。
?多數のファイルシステムを認識可能
?シェル機能を搭載し、コマンドによる高度な管理が可能
#grub-install /dev/sda
GRUBの設定ファイルは/boot/grub/menu.lst
timeout メニューを表示している時間
default デフォルトで起動するエントリの番號
title メニューに表示されるエントリ名
root ルートデバイスの指定
kernel 起動するカーネルイメージファイルと起動オプションの指定
makeactive ルートパーティションをアクティブ化
chainloader 指定されたセクタの読み込みと実行
hiddenmenu 起動時に選択メニューを表示しない。
2.2.2 LILO
LILOはIntelアーキテクチャマシン用のブートローダです。
?ブートローダ
?マップインストーラ /sbin/lilo
?マップファイル ディスク上の物理的なカーネルの位置を記録したファイルです。
?LILO設定ファイル /etc/lib.confです。
第一段階のブートローダは、BIOSから呼び出され、第2段階のブートローダ
をメモリに読み込みます。第2段階のブートローダの役割は次の通りです。
?ブートプロンプトを表示する
?読み込むカーネルを選択する
?カーネルをメモリ上に読み込む
?etc/lib.conf
boot ブートセクタを含むデバイス名
timeout プロンプト時の入力待ちタイムアウト時間
prompt ブート時にプロンプトを表示して入力を要求する
default デフォルトで起動するカーネルの食べる
append 起動時にカーネルに渡すパラメータ
read-only ルートファイルしセムを読み込み専用でマウントする
map マップファイルの指定
image ブートイメージのラベル
label ブートイメージのラベル
initrd 初期RAMDISKの読み込み指定
root ルートファイルシステムのデバイス名
/etc/lilo.confの設定內容を反映させるには、/sbin/liloコマンドを実行する必要があります。
lilo コマンド
-C設定ファイル 設定ファイルを知っていする
-R 次回再起動時に適用されるコマンドラインパラメータを指定する
-V Version
-q 現在のマップファイルの內容を表示する
-t テストのみ実行する
-u LILOを削除する
-v 詳細情報を表示する
2.3 共有ライブラリ管理
共有ライブラリは、libreadline.so.5のように、「lib~.so~」という名前が付けられていうます。通常、/lib,/usr/libに配置されています
2.3.2 必要な共有ライブラリの確認
実行ファイルが必要としている共有ライブラリは、lddコマンドで調べることができます。
ldd /bin/cat
しかし、プログラムを実行するたびにこれらのディレクトリを検索するのは非効率出來なので、実際にはバイナリのキャッシュファイルである/etc/ld.so.cacheが參照されます。
ldconfigコマンドは、/etc/ld.so.confファイルに基づいて/etc/ld.so.cacheを再構築します。
#ldconfig
そのたのディレクトりも検索対象に加えたい場合は、環境変數LDLIBRARYPATHにデイレクト利リストを記述します。
2.4 Debianパッケージの管理
2.4.1 パッケージ管理とは
実行プログラム、設定ファイル、ドキュメントなどを一つのファイルにまとめたものをパッケージといいます。
パッケージ管理システム
パッケージの依存関係
パッケージ管理システムは依存関係を監視し、依存関係を 損なうようなインストールやアンインストールには警告をはします。
Debian形式は、Debian系のディストリビューションで利用されている。
パッケージ管理作業にはdpkg,dselect,APTツール
RPM形式は、パッケージ管理作業にはrpmコマンドが使われます。両者には互換性
がありませんが、alienコマンドを使って相互に形式を変換することもできます。
Debian形式のパッケージファイル名は、次のようになっています。
tree-1.5.0-2-i386.deb
tree: パッケージ名
1.5.0.2 バージョン番號
2 リリース番號
i386 アーキテクチャ
deb 拡張子
Debian形式のパッケージを扱うにはdpkgコマンドを使います。
dpkg [option] アクション
Option
-E すでに同バージョンがインストールされていればインストールしない
-G すでに新バージョンがインストールされていればインストールしない
-R ディレクトりないを再帰的に処理する
Action
-i パッケージをインストールする
-r 設定ファイルも含め完全にパッケージをアンインストール
-P 設定ファイルも含め完全にパッケージをアンインストール
-l インストール済みパッケージを検索して表示する
-S 指定したファイルがどのパッケージからインストールされたが表示する
-L 指定パッケージからインストールされたファイルを一覧表示する
-s パッケージの情報を表示する
--configure 展開されたぱっっケージを構成する
--unpack パッケージを展開する
dpkg -i apache2-2.2.3-4+etch6-all.deb
dpkg --purge apache2
dpkg -S '*/apache'
dpkg -l
dpkg -L bash
dpkg -s bash
2.4.3 apt-getコマンド
apt-getは、APTというパッケージ管理ツールに含まれるコマンドで、依存関係を調整
しながらパッケージのインストール、アップグレード、アンインストールを行います。
apt-get 「オプション」 サブコマンド パッケージ名
option
-d ファイルをダウンロードする
-s システムを変更せず動作をシミュレートする
サブコマンド
clean 過去に取得して保存中のパッケージを削除する
dist-upgrade Debianのシステムを最新にアップグレードする
install パッケージをインストールまたはアップグレードする
remove アンインストール
update パッケージデータベースを更新する
uograde システムの全ぽっけーじを安全にアップグレードする
apt-getコマンドでパッケージ管理を始めるには、まず/etc/apt/sources.listにパッケージ
を管理しているサイトのURLを記述します
apt-cacheコマンド
パッケージ情報を照會?検索することのできるコマンドです。
apt-cache
search
show
showpkg
depends
aptitudeコマンド
apt-getコマンドよりも高度な機能を持ったコマンドとしてaptitudeコマンドがあります。
とりわけ、正規表現を使った検索機能が優れています。
2.5 RPMパッケージの管理
RPMパッケージのファイル名は、次のようになっています。
bash-3.2-21.i386.rpm
bash パッケージの名稱
3.2 バージョン番號
21 リリース番號
i386 アーキテクチャ
rpm 拡張子
2.5.2 rpmコマンドの利用
rpmコマンドの主なオプション
-i インストール
-U アップグレード
-F
-v 詳細な情報を表示する
-h 進行狀況を「#」で
--nodeps 依存関係を無視してインストールする
--force 既存のファイルを新しいものに置き換える
--test 実際にはインストールせずテストを実施する
-e パッケージをアンインストール
-q 指定したパッケージがインストールされているか照會する
-a インストール済みのすべてのパッケージを表示する
-f 指定したファイルを含むパッケージ名を表示する
-p 対象としてパッケージファイルを指定する
パッケージのインストール
#rpm -ivh zsh-4.2.6-1.i386.rpm
次の例では、~/rpmsディレクトリ以下にあるRPMパッケージをすべてアップグレードします
#rpm -Fvh ~/rpms/*.rpm
パッケージのアンインストール
#rpm -e httpd
パッケージ情報
パッケージを調査するには-qオプションを使います。
#rpm -qa | grep emacs
#rpm -qi bash
#rpm -qf /bin/bash
#rpm -qlp bash-3.0-19.2.i386.rpm
#rpm -qR gzip
2.5.3 YUM
YUMの設定 /etc/yum.confと/etc/yum.repos.dディレクトリ以下のファイルで行います。
yum サブコマンド
check-update アップデート対象のパッケージリストを表示する
update パッケージ名 指定したパッケージ名をアップデートする
install パッケージ名 インストール
remove アンインストール
info 指定したぱけーじの情報を表示する
list 全パッケージをリスト表示する
search キーワードで検索する
grouplist パッケージグループをリスト表示する
groupinstall パッケージをインストール
#yum check-update
#yum update
#yum install
#yum remove emacs
#yum info samba
#yum list
#yum search ruby
#yum grouplist
#yum groupinsatll "X Window System"
#yumdownloader samba
Posted on 27 八月 2011 by 柳城 ,閱讀 554
接上(虛擬機VirtualBox+Centos+NAT網絡的配置過程):裝好VirtualBox后,在XP下進入網絡鄰居,多了個VirtualBox Host-Only Network。可知:
Host機的IP:192.168.56.1
在CentOS查看虛擬機的IP:
ifconfig -a #查看IP
eth0 Link encap:Ethernet HWaddr 08:00:27:BE:80:A6 inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:febe:80a6/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:172 errors:0 dropped:0 overruns:0 frame:0 TX packets:119 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:15640 (15.2 KiB) TX bytes:21109 (20.6 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
虛擬機的IP是10.0.2.15,自動獲取的IP。接下來打開 VirtualBox,按下圖設置:
SSH的默認端口是22,填好HostIP及GuestIP就行了。這樣子就能通過putty等軟件SSH登陸了。
SSH IP: 192.168.65.1
帳號:CentOS設置的帳號,如root
web的80端口是為以后安裝apache用的。設置了這個后,Host機才能用http://IP/通過瀏覽器直接訪問。(還需要設置CentOS的防火墻不屏蔽80端口。以后再詳~)
設置yum的鏡像,方便下載更新軟件。設置的方法參照:http://centos.ustc.edu.cn/
安裝地方設置為HTTP,Server ctos.ustc.edu.cn, 目錄 為centos/6/os/i386 或 centos/6/os/x86_64。
安裝后請按照以下步驟修改CenOS-Base.repo,以后就可以方便的用yum從本鏡像站點安裝、更新軟件。
CentOS6的安裝方法
cd /etc/yum.repos.d mv CentOS-Base.repo CentOS-Base.repo.save wget http://ctos.ustc.edu.cn/CentOS-Base.repo.6 wget http://ctos.ustc.edu.cn/epel.repo.6 mv CentOS-Base.repo.6 CentOS-Base.repo mv epel.repo.6 epel.repo
提醒:裝了centos的最小版本minimal之后,一開始沒有安裝wget了,所以就是需要配置SSH后,就能隨便上傳文件了。
1、プロキシの設定(yumによるアップデート) 】 |
◆/etc/yum.conf を編集しないでプロキシの指定する方法 記述例:プロキシのポート番號を5273としています。 # export proxy=http://proxy.hostname.com:5273/ |
日本國內では理研のサーバを指定するのが主流(らしい)なので、
yum が見に行くサーバを理研のサーバになるように変更します。
変更するファイルは /etc/yum.repos.d/CentOS-Base.repo です。
# vi /etc/yum.repos.d/CentOS-Base.repo
[base]
name=CentOS-$releasever - Base
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/os/$basearch/
gpgcheck=1
#released updates
[update]
name=CentOS-$releasever - Updates
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/updates/$basearch/
gpgcheck=1
#packages used/produced in the build but not released
[addons]
name=CentOS-$releasever - Addons
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/addons/$basearch/
gpgcheck=1
#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/extras/$basearch/
gpgcheck=1
#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
#packages in testing
[testing]
name=CentOS-$releasever - Testing
baseurl=http://ftp.riken.jp/Linux/centos/$releasever/testing/$basearch/
gpgcheck=1
enabled=0
[dag]
name=Dag RPM Repository for Red Hat Enterprise Linux
baseurl=http://ftp.riken.jp/Linux/dag/redhat/el$releasever/en/$basearch/dag
gpgcheck=1
enabled=1
設定後、上書き保存します。