Thursday, September 23, 2010

SCJP考前筆記


給未來的裕翔

先推一下恆逸老師寫的書^^

書名: Java物件導向程式設計與SCJP認證明解
作者: 戴玉佩

  • private int i = 0, 這行如果是成員變數宣告的話ok, 區域變數宣告就會失敗, private不能用在區域變數上
  • 090不是八進位的int型別數字, 乍看之下, 有0開頭, 數字預設也的確是int, 但是八進位的數字只能是0~7^^

Wednesday, September 22, 2010

從level 3進入圖形桌面


給未來的裕翔

當我在level 5執行sudo init 3後

會進入level 3的登入畫面

這時我可以sudo init 5進入圖形桌面

不過要新登入就是了

書上說也可以startx -- -depth 16

不過每次這樣進入桌面都會有程式crash, 怪怪的

所以我偏好書上講另一種方式

startx -- -dpi 100

這樣就可以進入圖形桌面且不需要重新登入^^

打開一個terminal

輸入runlevel, 可以發現自己還是處於level 3喔

Tuesday, September 21, 2010

以他人之名sudo


給未來的裕翔

當我是root身份

我想為一位使用者新增web資料夾在他加目錄裡

當然owner是他囉

白痴作法就是先mkdir再chown

比較乾脆一點的是

sudo -u user mkdir web

帥吧^^

httpd和smbd的新增使用者比較


給未來的裕翔

httpd新增要認證的使用者時

使用者是不需要存在在/etc/passwd裡面的

可是smbd的需要

httpd第一次要新增使用者時

要加-c

產生該認證檔案

而smbd則是要加-a

意思是新增該使用者

認證檔案不在也會自動生成

設定讓新使用者一登入就必須換密碼


給未來的裕翔

如果想讓新使用者

在用預設密碼登入的同時更改成自己的密碼

chage -d 0 user

-d是last day

mas page裡面說只要設定為0就會強制新使用者登入時改密碼

後記;

另一個方法是

以passwd給使用者密碼後

再一次passwd -e user

Monday, September 20, 2010

新增使用者的comment


給未來的裕翔

如果現在我希望新增一個使用者

新增的同時寫入他的comment

useradd -c comment ......

如我我已經有一個使用者

我希望修改他的comment

usermod -c comment ......

設定好logrotate後, 強制執行一次


給未來的裕翔

設定好/etc/logrotate.d裡面的檔案後

想看是否會生效

可以先來一個rotate -f /etc/logrotate.d/target-log

-f是force意思吧, 沒真的去查

自訂一個ftp.log但不要寫到/var/log/messages裡


給未來的裕翔

最近在學習openSUSE裡面的syslog-ng

有個考古如我標題要求

本來我是新增一個flags(final)在log裡

log { source(src); filter(f_ftp); destination(ftpall); flags(final); };

後來看到有人直接在filter裡面加入'不要ftp'

filter f_messages { not facility(news, mail, ftp) and not filter(f_iptables); };

感覺這更厲害^^

寫下來崇拜一下~

Sunday, September 19, 2010

ssh server禁止密碼驗證


給未來的裕翔

如果想要讓ssh server只接受passphrase

而不接受一般密碼驗證的話

要修改/etc/ssh/sshd_config的設定

UsePAM no

這樣就可以了, 預設是yes

快速達成date +%Y-%m-%d-%H:%M


給未來的裕翔

date +%F-%R

帥吧


Saturday, September 18, 2010

openSUSE登入使用者後才能被ssh


給未來的裕翔

不知道是筆電的關係還是openSUSE的關係

如果沒有登入使用者, 並且跑完progress bar

那麼, 我就無法從另一台電腦ssh連過去

useradd的-p


給未來的裕翔

在openSUSE裡面的useradd

如果建立使用者時同時利用-p指定密碼

似乎之後無法以該密碼切換使用者!?

目前也只能安分點另外使用passwd了

useradd的-m

給未來的裕翔

在openSUSE裡面

如果新增使用者時沒加-m

家目錄是真的不會建立起來的

這點跟fedora就不太一樣

筆電似乎別闔起來比較快


給未來的裕翔

筆電似乎真的闔起來會進入XX模式

所以要練習時還是打開好了

openSUSE新增使用者的預設群組

給未來的裕翔

是GID為100的users

Thursday, September 16, 2010

在openSUSE裡面讓開機自動關閉firewall


給未來的裕翔

新增一行/etc/bash.bashrc最後面

rcSuSEfirewall2 stop

Wednesday, September 15, 2010

如何讓google的contact生日自動提醒?


給未來的裕翔

真是太爽了^^

首先到google的calendar裡

左下角的Add -> Browse Interesting Calendars

-> More -> Contancts' birthdays and events

帥吧^^

Monday, September 13, 2010

無線滑鼠休眠


給未來的裕翔

我的無線滑鼠一段時間部動似乎會進入休眠模式

解決方案是點一下滑鼠按鍵即可

Friday, September 10, 2010

java的多型


給未來的裕翔

java有個重點是多型

這可是我當初自修完全看不懂的呢^^

汽車是車

所以我可以宣告一個車的參考指向汽車物件

同理, 經理也是員工

Employee e = new Manager();

這就是把經理找來當Employee用

那如果現在Employee有getInfo()方法

Manager裡面有覆寫getInfo()方法

試問, 我把經理當員工用

e.getInfo()是呼叫誰的getInfo() ?

經理的^^

老師的超棒例子!

"把所有員工找來報告, 經理報告的內容會和清潔工一樣嗎?"

那如果有個attribute是經理獨有, Employee沒有

ex: department

那我是不能存取它的department的

不過不能存取不代表他消失

老師的超棒例子

在我們面前是大師的他

回家變兒子的老子

此時的他依然擁有java知識

不過沒要教他兒子罷了

--------------------------------------------------

多型的好處, 異質集合

我可以宣告一個Employee陣列

裡面存放Manager, Engineer這些也算是員工的相異子類別

--------------------------------------------------

如果父類別有個方法要在子類別裡被覆寫

那麼它的存取控管必須大於等於父類別

也就是說, 如果在父類別裡是public的成員方法

在子類別裡它不能是private

因為在編譯器檢查的時候

是以父類別方法來檢查, 實際執行卻是執行子類別的方法

萬一上例在子類別宣告成private

那就會是"檢查通過, 但實際不能用" ^^

--------------------------------------------------

介於public和private中間還有兩個: default和protected

protected的方法可以被同package和子類別存取

default的方法可以被同package存取

什麼時候會用到protected呢

老師的超棒實務例子

"當我在規劃需要哪些方法時 先寫一個空的放在那"

"此時我不希望它被存取 因為是空的"

"之後被分配的人去把它實作 再把變protected改成public就可以被他人使用了"

"還有很多機會會用到啦 不過現在的你大概只能聽懂這個"

太棒了 被強者嗆就是爽^^

--------------------------------------------------

a instanceof b回傳boolean

可以想成判斷是否"a is b"

如果現在用Employee e參考指向Manager

e.getInfo()的話, 是Manager自己的getInfo()

可是如果想要使用Manager自己新增的playGolf()呢?

要先轉型回子類別Manager m = (Manager) e;

--------------------------------------------------

比較一下, 對陣來說, 它有個length成員變數

對字串來說, 它有個length()成員方法

--------------------------------------------------

子類別可以自動變父類別

父類別需要casting才可以變子類別

如果現在A是父類別, B和C是各自繼承A的兄弟類別

A a = new B();
B b = (B) a;
這樣ok

A a = new A();
B b = (B) a;
編譯ok, 執行失敗

那現在要怎樣才可以把B轉型成C呢?

B b = new B();
A a = b;
C c = (C) a;
這樣編譯會過喔^^

當然, 執行會錯啦~

--------------------------------------------------

Object o = new Object[n];

雖然看似tricky

但是這是合法的喔^^

因為陣列也是一種物件

如果現在Object o = new int[1]

裡面的element會不初始化成0

怎麼取值? 轉型!

if ( o isinstanceof int [] )
int[] ia = (int


Thursday, September 9, 2010

wordpress安裝備忘錄

為了使用wordpress
要先有mysql-server
裝完後service mysqld start
chkconfig mysqld on
接著進入mysql, 首先為mysql的root建立密碼
mysqladmin -r root password 'my-password進入mysql產生資料庫並授權
mysql -u root -p
create database wordpress;
grant all privileges on wordpress.* to bob@localhost identified by 'another-password';
show databased;
驗證完後就從mysql離開, quit
修改/etc/wordpress/wp-config.php裡面的
database-name
user-name
database-password
之後把/usr/share/wordpress整個移到/var/www/html之下
不過此時的/var/www/html/wordpress/wp-config.php連結失效
重新製作, 連到/etc/wordpress/wp-config.php
不知為啥
把wordpress整個複製到/var/www/html
resotrecon -R /var/www/html/wordpress
想要以瀏覽器開啟
http://localhost/wordpress/wp-admin/install.php
總是失敗
http://localhost/index.html可以
http://localhost/wordpress/index.html就不行
後來
把它整個移到~/public_html之下就可以了
ps: 如果wordpress的資料庫密碼忘了或錯了, 以root進入後,
前面講的grant blabla重打一次即可
照理說
之後wordpress備份
應該就是家目錄和wordpress資料庫就可以了

httpd.conf語法檢查

如果要檢查httpd.conf的語法
有三種方法
service httpd configtest: 書上說其實就是呼叫apachectl configtest
apachectl configtest: 正常
httpd -t: 書上說這個提供的資訊最少
結論: 我都用apachectl configtest好了

httpd的allow和deny

對httpd.conf來說
order allow,deny
可以想成, 後者deny為預設, 或是高權重
同時被定義或未被定義的clients會以後者, 也就是deny處理
反之
order deny,allow
都講或都沒講的clients都以allow處理

httpd與selinux

就算httpd有開啟
就算iptables不會擋網頁服務
就算/etc/httpd/conf/httpd.conf的UserDir
有設定成public_html
還是無法讓每位使用者提供自己的服務
因為selinux檔掉了
必須
sudo setsebool -P httpd_enable_homedirs 1
才可以
謹記!

ftp client端太久沒用會被踢開

ftp client端太久沒用會被踢開

ftp裡面沒有tab補齊檔名的功能

防火牆如果設定不開放21, 連線中的ftp不會被影響

即使是連線中, selinux的allow_ftpd_anon_write可以馬上生效

把vsftpd套件移除, 上傳或供下載的檔案都還在

裝好的vsftpd開啟就可以供下載檔案了

如果不能上傳單純因為權限, 改完權限client馬上就可以上傳了, 不需要重登

selinux的效力依舊是最大

Saturday, September 4, 2010

java物件繼承

給未來的裕翔

Autoboxing/Autounboxing沒事別用

因為有效能問題

雖然用java就表示效能並非首要考量

但是java已經夠不快了

別再用一些有的沒的讓它更慢

當然, 也許有一天它會適合我(在某種情況下)

--------------------------------------------------

java是限制單一繼承的

如此可避免行為混淆(怕遇到一堆有同名method的父類別)

--------------------------------------------------

對method而言, 有限制最寬鬆的public

同package和子類別和其他都可以使用

接著是protected

同package和子類別都可以使用

再來是default

同package才能使用

最後是private

只有本身該類別可以使用

protected老師說留到後面講

所以我先記default的筆記

default並不是真的寫這個關鍵字出來喔^^

真的在method前寫default的話編譯反而會錯

至於class, 只有public和default兩種

那為什麼需要default呢?

當我們在設計一個系統的時候

要先進行子系統切割

以汽車來講, 一萬多個零件

"爽斃了" by 老師

所以要進行子系統切割: 引擎系統, 機電系統, 底盤系統......

(其實我忘記老師到底說了哪些系統)

以引擎系統(package)而言

我不是真的去操作它

而是透過油門(package interface)

(其實就只是一個public class)

至於引擎內部(一堆default class)怎樣運作

我可以不用知道^^(耶~!)

哪天也許引擎內部(一堆default class)稍作修改

我依舊只需要踩油門(package interface)就能加速

暸改嗎? 所以package的封裝是藉由class的default來達成

--------------------------------------------------

一個類別可以包含

1. attribute

2. method

3. constructor

4. nested class

--------------------------------------------------

從父類別繼承的method可以override

signature要一樣

return type可以不一樣, 不過有限制

限制是: override後的return type必須是原來method的return type的子類別

不過這是5.0以後才有的啦

那如果signature不一樣, 也是可以的呦^^

這樣變成method overload了

compiler是不會發出警告或錯誤的

不過在5.0以後, 可以在該method上方加一行

@Override

這樣compiler就會幫我檢查, 這是java裡面的annotation之ㄧ

--------------------------------------------------

如果現在有兩個方法

public int mm() {...}
public String mm () {...}

這樣編譯會錯

但不是overload的問題

而是method redefine的錯誤

--------------------------------------------------

現在有個A, 它有個m方法

B繼承A

C繼承B

對C來說, 如果使用super.m()

它是呼叫B的m(), 實際執行A的m()

如果B有override過A的m()

那C使用super.m()時

它是呼叫B的m(), 實際執行B的m()

那此時如果我想使用A的m()呢?

super.super? 錯!!!

老師說有方法可以, 不過現在沒要提^^

如果要使用父類別的constructor

super(...)

所以比較一下

使用父類別的方法: super.m()

使用父類別的constructor: super(...)

--------------------------------------------------

constructor裡面可以呼叫另一個constructor

如果它又呼叫回來?

recursive? 聰明的編譯器會檢查來避免^^

--------------------------------------------------

當我沒建立costructor時

編譯器會為我準備一個

當我繼承某類別, 編譯器會為我子類別的constructor裡最前面那行加上

super()

注意, 參數列是空的喔

萬一, 我的父類別有自訂constructor

(那編譯器不會為我準備空的constructor)

那編譯器為我子類別加上的super()就會造成編譯器失敗

因為找無^^

順帶一提: 老師說沒事別用繼承, 也是效能問題

--------------------------------------------------

javap class-name

可以拿來反組譯class

--------------------------------------------------

Object是所有類別的根源

裡面有toString(), equals(), hashCode()這些方法

這是提供來讓我們override的

equals()視不同情況改寫

預設是

public boolean equals( Object o )
{
return this == o;
}

當我new了兩個物件, 它們就不會是identical

但某些內容可以equal

可是如果我不改寫equals()的話

它依舊只比較是否identical^^

所以如果兩個字串使用s1 == s2

一定是false的啦^^

應該要用s1.equals(s2)

(String類別有override過equals()方法)

hashCode()有個規則

如果a.equals(b)如果是true的話

a.hashCode() == b.hashCode()必須為true

至於實作, 也是依情況而定^^

--------------------------------------------------

Integer是int的包裝類別

如果現在wAmount是Integer

int r = wAmount + 1在java 5.0之前會錯

會錯是因為物件不能做算術運算

5.0之後是ok的, 因為有autoboxing

那如果現在要把String換成int

可參考下面

String sAmount = "10000"
int amount = Integer.parseInt(sAmount);

如果sAmount是"0x123A"或"12.3"都會錯

不過"12.3"可以用Double.parseDouble(sAmount)來轉^^

Friday, September 3, 2010

java陣列


給未來的裕翔

要宣告一個陣列

int[] a


int a[]

皆可, 不過老師建議用上面那個

因為以method來看

如果現在有個method要回傳整數陣列

public int[] doSomething() {...}

那個中括號很明顯就不能跟int拆開

所以保持一致比較好

另外

如果現在這樣宣告, int a[], b

那個a[]是參考型別, 因為陣列是一個特殊物件

(element可以說是它的attribute)

而b是基本型別

接著

int[] a = new int [-5], 編譯ok, 執行不ok

int[] a = new int [0], 編譯ok, 執行ok

int[] a = new int [3.5], 編譯就不ok了^^

如果現在有以下宣告

int size = 5
int[] ia = new int [size]

在c編譯不會過喔, size必須是constant才可以

理由是c的stack是固定大小的

陣列大小必須在編譯時期就知道

而java有heap memory, 所以剛那兩行宣告是會過的

陣列大小可為0, 那陣列上限呢?

跟JVM預設的heap mem有關, 64MB

可改大小, 不過還是有其上限

就是int的上限, 21億多

那是因為陣列的index是整數

另外, int[] x如果被初始化

它的值是null

從這裡也可以發現, int[] x比起int x[]更容易判斷它是參考型別

在main方法裡

如果

int size

int[] a = new int[size]

會錯, 原因跟陣列無關, 而是區域變數使用前沒給值

但如果上面那兩行放在class裡面就ok

因為建立物件的同時size會被給0

(中場閒聊: SCJP很少考單一觀念)

至於陣列的初始化

int[] ia = { 1, 3, 5 } 這ok

int[] ia;
ia = { 1, 3, 5 } 這不ok

int[] ia;
ia = new int[] { 1, 3, 5 } 這就ok

再來, 陣列物件有個attribute叫length

它是final, 無法修改

如果要複製陣列

可以用System.arraycopy()

需要五個參數, 分別是

source, sourceIndex, target, targetIndex, count

只處理一維, 事實上java也只有一維

要複製元素的話盡量使用這個方法, 不要自己寫for

因為這方法使用原生方法, 利用OS來達成

所以會比自己寫for快很多

再來是方法的overloading

如果一個類別裡面同時有

public m( int... a )和public m( int[] a )

會錯, 因為int...其實就是陣列

把其中一個換成public m(int a)就可以過編譯

但是, 如果我現在是

public m( int... a )
public m( int a )

雖然可以編譯過

由於int... a也可以接收一個變數的呼叫

那到時怎知哪個會被呼叫

答案是public m( int a )

因為它最符合

基於它(...)給的幫助不大, 又會造成混淆

老師對它的評價: 爛死了!!!

^^

(順便提一下, main的String[]換成String...也是ok的)

(若只有String則不ok)

現在談一下命令列

如果我java MyApp a b c

args就是a, b, c三個字串

如果現在只有java MyApps

那args還會建立嗎?

會! 個數為0的陣列

這很重要嗎?

當然, 要成為master, 至少就要知道的比別人多^^

所以上例的args就算沒element, 它也不會是null

java封裝


給未來的裕翔

市面上有很多java可以拖拉介面的軟體(除了eclipse)

那它們彼此間可以自定控制項, 並且在別的java IDE使用

因為那有規範, JavaBeans

getXxx和setXxx也是它的規範內容

不過getXxx有個例外

當回傳只有true或false的話, 要改成isXxx

另外, 如果getXxx和setXxx只有最陽春的功能

那attribute是否可設為public

不行! 因為要考慮到之後可能會改

setXxx會修改的機率很大, 那getXxx呢?

也是有機會的! 例如: 回傳的幣值

所以attribute最好都由相對應的method來存取

以Employee類別裡面的salary這變數來說, getSalary和setSalary合稱它的property

我們稱: Employee類別有一個salary property

property裡面的get和set不用成對出現

那attribute和property呢?

舉例來說, 我得知Person類別裡面有個getAge()方法

我們稱: Person類別有一個age property

那age這個attibute存在嗎? 不一定要存在喔^^

以此例來說, age這變數是不應該存在的!

"變動資料不應該設計在資料表內"

ex: 一個人又不是年年25歲

所以, 以此例來說, 該紀錄的是生日

而getAge()是利用生日和今天日期來算出年齡的

結論: 老師好強阿...... 可以一直舉例教學


nsswitch.conf的host查詢順序

給未來的裕翔

由於我在練習架NIS server(雖然失敗)

中間有動到/etc/nsswitch.conf這個檔案

hosts: files nis dns

由於我的nis沒架成功

導致在nis查詢hosts那邊卡很久

可以考慮把dns一到第二個或第一個

openSUSE的SuSEfirewall2_setup


給未來的裕翔

由於不知道怎麼修改openSUSE裡面的防火牆

想說先關掉好了

但是它也沒有iptables這個service

最像的兩個是

SuSEfirewall2_init和SuSEfirewall2_setup

起先關init那個會失敗, 於是關setup那個

關完後, 什麼服務都失效了!!!

真讓我驚訝, 難道說那個不是防火牆?

沒辦法了, 只好恢復它, 手動去該host輸入rcSuSEfirewall2 stop

無知就是悲哀阿......

openSUSE裡面預設的/etc/sudoers不是很好


給未來的裕翔

在openSUSE裡面, 預設是誰都可以使用sudo的

而密碼是root的密碼

萬一root和normal user不同

首先, 誰都可以使用就不是很安全了

接著, 萬一root和normal user真實世界是不同人

每次root改密碼不就要知會normal user?

萬一normal user不只一位, 甚至很多位?

所以我自己會偏向把/etc/sudoers裡面的

Defaults targetpw
ALL     ALL=(ALL) ALL
註解掉

ps: 赫然發現, blogger也可以用pre語法耶^^

Thursday, September 2, 2010

在KDE裡面不小心把System tray不見了!?


給未來的裕翔

我剛不小心把它移除了

想說登出登入也許就好了^^

沒有!!! 只好上網查

可是!!! 我是用無線網路阿~

我又不會自己設定

每次都是用System tray的圖示來簡單操作的^^

現在System tray不見了, 我怎能透過上面的小圖示上網呢!!!

沒辦法 摸索吧~

在Panel上按右鍵 -> Panel Options -> Add Widgets -> Running -> System Tray

成功是成功了, 不過出現在關機圖示右側, 不很習慣

所以我打算...... 習慣它^^

賞你一個有yum還需要學rpm的理由


給未來的裕翔

因為openSUSE有rpm但沒yum

而是zypper^^

從wordpress轉到blogger

給未來的裕翔

基於我現在租屋的網路環境是NAT後方的private IP

加上電費每度四元

本來有考慮網路上的免費空間 000webhost

不過註冊後一直沒審核完畢!?

後來打算忍痛使用付費空間

馬上打消念頭^^ 付費耶!

牽一條public IP? 似乎更貴~ 房東也不知道會不會答應

就決定是blogger了!!!

不過由於wordpress之前的設定

只要我架站位置不是140.114.229.129

開啟網站就會少一些東西

因為一些resource的位址是會用到140.114.229.129的

但我就已經是private IP啦!

這時發揮所學^^

ifconfig eth0 140.114.229.129

開啟網站, 果然奏效啦!

使用wordpress的tools, 把它export

把一個xml檔存到桌面後

到http://wordpress2blogger.appspot.com/

convert好之後, 一樣下載一個xml到桌面

接著到blogger匯入它

搞定!!!

差點就要使用"努力法"了

ps: 這是我在blogger首po^^