Monday, October 18, 2010

可以同時秀出proxy和host的資訊

給未來的裕翔

http://ipid.shat.net/

這個網站不但可以知道自己的public ip

同時也可以知道自己的private ip

Sunday, October 17, 2010

pcmanx內容無法顯示中文?

給未來的裕翔

要安裝新套件

不過我不確定哪個是關鍵套件

但是sudo yum update -y *chinese*可以成功

哪位善心人士告訴我關鍵套件是哪個吧^^

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^^

Monday, August 23, 2010

openSUSE初體驗^^

給未來的裕翔

現在這篇是在openSUSE裡面打的^^

先講一下和Fedora的差異

第一次用KDE, 介面還蠻漂亮的, 不過不是很習慣

首先, 為了上網, 想去/etc/sysconfig/network-scripts/裡面修改ifcfg-eth0

結果這裡就不一樣了

位置是在/etc/sysconfig/network/ifcfg-eth0

裡面的參數也多許多

突然多了BROADCAST和NETWORK要輸入

因為我是C級網段, 所以IP直接最後一個數字分別改成255和0即可

而ROUTEER和DNS要另外在別的檔案設定

也許是因為openSUSE沒有NetworkManager吧

新增一個/etc/sysconfig/network/routes
default   140.114.28.254   0.0.0.0   eth0

然後DNS直接加到/etc/resolv.conf裡面

修改這三個檔案後, 重新啟動網路, 沒有service這個指令讓我用!!!

這樣講不對, 雖然which找不到, 但這只能表示它不在我的PATH裡面

(對於找不到的指令可以, ex: cnf service, 這樣就會告訴我指令位置)

找不到的會跟我說該怎麼裝

結果裝法居不是yum!!!   而是一個叫zypper的指令......

知道service位置後(也是可以/etc/init.d/service啦   不過字數稍嫌多)

sudo /sbin/network restart

此時又一件神奇事, 是要輸入root密碼耶! 不是使用者自己的!!!

假設我瞬間習慣, 網路到此應該就是通了~

接著是中文問題, 查google後

openSUSE -> Computer -> YaST -> System -> Language

在Secondary Languages裡面選Traditional Chinese

這樣就會裝東西裝一陣子

登出登入後, Ctrl + Space就可以叫出輸入法了

是SCIM喔, 不是iBus, 雖然我不知道差在哪

但都有新酷音可以選就是了

Saturday, August 21, 2010

vim累加數字

給未來的裕翔

在vim裡面按Esc後

游標移到某個數字上按Ctrl + a

會累加一耶!

Thursday, August 19, 2010

vi跟多重視窗相關的操作

給未來的裕翔

Ctrl + w + n: 開一個新的水平視窗

Ctrl + w + q: 關掉所在的視窗

這比:wq快, 不過以ZZ離開文件依舊比較順手^^

vi的大小寫互換

給未來的裕翔

~在vi裡是大小寫互換

Wednesday, August 18, 2010

find找檔案後搭配grep找內容

給未來的裕翔

如果現在我想要知道某個目錄以下(含子目錄)

的所有包含字串aaa的檔案

find target-dir -f file -exec grep -Hn aaa {} \;

-H是把檔名列出來

-n是把行數列出來

這樣就可以知道aaa在哪個檔案的哪個行數

解tar到其他地方去

給未來的裕翔

如果現在要解tar

但不想解到CWD

可以指明目的目錄

tar -xf file.tar -C target-dir

執行android程式前詢問device選擇

給未來的裕翔

如果我在Eclipse左側對專案按右鍵

選Run As -> Android Application

它似乎會以我剛練習建立的模擬器來跑

如果要設定成會詢問我的話

在專案按右鍵 ->  Run As -> Run Configurations -> Target -> Manual

如何讓linux的eclipse抓到android手機

給未來的裕翔

原來根本不需要裝驅動阿~

以root身份新增一個檔案

/etc/udev/rules.d/51-android.rules

內容為

SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"



SUBSYSTEM=="usb_device", SYSFS{idVendor}=="0bb4", MODE="0666"

是很確定要用哪個, 或是兩個都行

那個0bb4要換成廠商代號

範例裡0bb4剛好就是HTC, 所以不需要換

參考網頁:

http://developer.android.com/guide/developing/device.html

Auto Draft

Monday, August 16, 2010

java的adapter

給未來的裕翔

java的interface就是先定義一堆function

之後extend它的話

必須先把所有的abstract method都實作出來才能實體化

而adapter就是比較方便的interface

也有一堆先定義好的method

不過只需要實作我要的method即可

問題是, 那interface為何要存在?

直接都用adapter不就好了?

說得也是^^

雖然我現在還不知道

不過我猜, adapter只是先實作interface而已?

就是一堆empty method, 而之後要用哪個method

再繼承adapter實作我要的method

未來的裕翔, 是這樣嗎^^?

把手機調成USB debugging

給未來的裕翔

買了一隻HTC wildfire練習android

由於我的分類幾乎都是套件名稱

所以像是手機的設定, 實在不知如何歸類

由於會使用eclipse開發

暫定所有手機相關操作筆記都歸類到"eclipse-platform"

menu -> Settings -> Applications -> Development -> USB debugging

把它check即可

Saturday, August 14, 2010

kvm-intel.ko無法載入?

給未來的裕翔

剛開啟virt-manager

突然發現一個錯誤訊息

說kvm有些module無法載入

赫然察覺, 原來我之前都自動濾掉這個警告訊息了!

不知道之前的慢速跟失敗跟這有沒關係

以下紀錄如何去BIOS開啟virtualization

哪一家BIOS我忘記看了, 也懶的重開......

Security -> System Security

把Virtualization Technology (VTx)

和Virtualization Technology Directed I/O (VTd)

改成Enanble

那我怎麼知道是這兩個?

不, 我不知道^^

Friday, August 13, 2010

postfix架MTA要設定bool

給未來的裕翔

如果使用postfix架設MTA的話

要把allow_postfix_local_write_mail_spool設為1

不然會造成/var/mail/user.lock

然後就收不到信了

報告完畢

寄信給別人, 自己tcp_wrapper也要開!

給未來的裕翔

如果要寄信給別人

自己用預設sendmail當MTA的話

在tcp_wrapper要記得開

原來要開阿!

Thursday, August 12, 2010

安裝作業系統時選"取代現有linux作業系統"

給未來的裕翔

實在是有夠他x的

重灌前我記得有一堆logical volume的

結果重灌後, 只剩root, home, swap

而且size還不對, 好像把當初沒用掉的硬碟空間都用盡去了

他x的

跟我想像的完全不一樣!

還好是練習機

但還是很他x的

MBR的bootloader被洗掉怎辦?

給未來的裕翔

先作以下步驟

dd if=/dev/zero of=/dev/sda bs=256 count=1

好, MBR的前一半被洗掉了^^

注意, 那個256應該是可以換掉, 但別把partition table也蓋掉了

(複習, MBR是硬碟的第一個sector, 含512 bytes)

(boot loader的first stage佔446 bytes)

(partition table佔64 bytes)

重開機後, 會發現一下就出現錯誤訊息了

有史以來最快錯誤訊息~

使用DVD光碟進入rescue mode後

chroot /mnt/sysimage

grub-install /dev/sda

重開機就搞定啦^^

想備份partition table的話

sfdisk -d /dev/sda > backup-file

不過日後怎麼使用我不知道耶

想備份整個MBR的話

dd if=/dev/sda of=mbr-backup bs=512 count=1

同樣的, 日後怎麼使用我不知道耶^^

mount壞掉導致無法正常開機

給未來的裕翔

如果/bin/mount壞掉了

你就完了!

不過放心, 有我在^^

拿出DVD安裝光碟, 進入rescue mode

CD的沒有這功能喔~

憑小小的大腦勾選幾個選項後進入shell

書上說重裝rpm, 不過我不知道怎麼從光碟抽出來耶

也不像教室環境那樣有人架好NFS讓我使用rpm

就在我稍稍緊張之時!

我想到從當下的mount取代我原來壞掉的mount^^ !!!

要注意的是, rescue mode的mount不在/bin裡面

用which mount查看後, 在/usr/bin/裡

cp /usr/bin/mount /mnt/sysimage/bin

然後重開機就可以^^

Wednesday, August 11, 2010

觀察某台機器對我機器的連線

給未來的裕翔

/proc/net/nf_conntrack裡面紀錄一些連線的資訊

似乎是隨時更新, 不確定是不是一直append

如果我要觀察140.114.28.18x對我的連線

每一秒更新最新狀態

watch -n1 'grep 140.114.28.18x /proc/net/nf_conntrack'

dovecot的mail_location?

給未來的裕翔

dovecot架好後, 開放imaps和pop3s

然後在iptables開啟相對應的port之後(可查/etc/services)

selinux不需要設定

tcp_wrapper不需要設定

本來可以連成功的, 一般使用者

可是! 不知怎搞的

吃個飯回來就連不到了

錯誤訊息如下

mail_location not set and autodetection failed: Mail storage autodetection failed with ......

去查一下後

把/etc/dovecot.conf裡面新增一行

mail_location = mbox:~/mail:INBOX=/var/mail/%u

不用擔心記不起來, 因為這是dovecot.conf裡面的example

直接用即可

這樣就可以了^^

另外, 如果要自製憑證

make -C /etc/pki/tls/certs

填完資料後, 憑證會產生在/etc/pki/tls/certs

權限是只有root可以讀

不過書上說沒關係(有講理由但我不懂)

接著修改dovecot.conf如, 搞定~
ssl_cert_file = /etc/pki/tls/certs/dovecot.pem

ssl_key_file = /etc/pki/tls/certs/dovecot.pem

96 ssl_cert_file = /etc/pki/tls/certs/dovecot.pem  97 ssl_key_file = /etc/pki/tls/certs/dovecot.pem

最近架samba筆記

給未來的裕翔

如果要架一個分享給大家的資料夾

但只開放某個group去新增或是移除檔案

/etc/hosts.allow不需要修改

iptables開啟, 137, 138, 139, 445

把要分享出去的資料夾context設為public_content_rw_t

並且把allow_smbd_anon_write設為1

然後特別注意smb.conf裡面的

read only = yes

write list = @allow-group

這樣設定就是大家都只能讀, 除了某個被我允許的group可以增減檔案

還有create mask = 0664

這設定是在預設產生檔案的mask, 跟umask不一樣喔

直接標明檔案產生的權限

那至於使用者可否讀寫檔案, 就直接跟檔案權限有關系

((

光這樣設定, 在client端使用smbclient -U lulumi //smb-server/shared-dir

會出現錯誤訊息

tree connect failed: NT_STATUS_BAD_NETWORK_NAME

把selinux關掉後就正常, 那就是有個神秘的boolean或是context需要改囉!
sudo setsebool samba_export_all_ro 1

sudo setsebool samba_export_all_rw 1

這兩個任一個都可以解決問題

client端要注意一下

能不能下載檔案, 跟檔案本身權限(r)有關

能不能上傳檔案, 跟資料夾本身權限(w)有關

其他要注意的有~ gid和sticky bit最好開啟

新增使用者samba密碼的話, 用smbpasswd -a user

-a是add

使用者只需要存在server端即可,  client端要登入時要-U指明即可

那些使用者也不需要login shell, 給予/sbin/nologin即可

Tuesday, August 10, 2010

查看一個selinux boolean的存取限制

給未來的裕翔

如果要看一個selinux boolean的功能

man -k selinux | grep your-service-keyword

那如果要看它的存取限制呢

也就是說, 現在, 我想知道

當某個boolean設立之後

某種context的process能對file有何存取能力?

舉例來說, 當allow_smbd_anon_write設成on後

那些具有smbd_t的process, 能對檔案作什麼動作?

sesearch --allow -s smbd_t -c file -b allow_smbd_anon_write

--allow      找allow的rules

-s      source

-c      class

-b      bool





samba_share_t v.s. public_content_rw_t

給未來的裕翔

書上說

如果我要開放一個samba服務

分享的資料夾看是要context改成samba_share_t

或是改成public_content_rw_t並且allow_smbd_anon_write設為on

那怎不乾脆設為samba_share_t就好呢?

因為就只能分享給samba

如果有其他服務可能會存取這個資料夾

那就會是public_content_rw_t會比較適當

附註: 同樣是允許寫入, 架nfs時好像沒有改context和boolean耶

錯誤訊息: clnt_create: RPC: Authentication error

給未來的裕翔

如果當使用showmount -e localhost時看到這訊息

記得在/etc/hosts.allow裡面加rpcbind:ALL

搞定^^

不過加完後變成新的錯誤訊息

clnt_create: RPC: Program not registered

搞不定^^"

後記: 重啟nfs就可以了

不過發生一個小問題, client端可以正常掛載

但是真要編輯掛載過來的檔案, 一開始呈現當掉狀態...

過一會(不到五分鐘), 才看似正常

ftp架設完整筆記

給未來的裕翔

vsftpd架設大概是RHCE裡牽扯到最多雜物的吧

如果現在想要架設一個ftp server

可以讓anonymous上傳檔案到特定資料夾

但不能讓anonymous下載

甚至不讓anonymous看到裡面有什麼

那我要做的設定selinux(context and bool), tcp_wrappers, iptables, permission

先講permision的部份

首先在/var/ftp新增上傳資料夾, ex: upload

然後改變它的mode為730, group為ftp

這樣ftp就可以進入該資料(x)夾並寫入檔案(w)

不過看不到自己上傳啥, 或是別人上傳啥

但好像還是有機會可以瞎猜檔名嘗試下載? 沒真的去試

所以還需要修改檔案上傳後的權限

在iptables方面, 開tcp的port 21

在tcp_wrappers方面, allow vsftpd

Sunday, August 8, 2010

最近架nfs server的筆記

給未來的裕翔

最近重新架了nfs server

發現一件事

hosts.allow不需要設定耶!?

不過iptables還是要tcp的111(rpcbind)和2049(nfs)

selinux似乎也不需要改什麼

然後, nfs的預設就有root squash

後記: 也許是因為我多了service nfslock start

java的mouse event的clicked和released的差別?

給未來的裕翔

距離當初問博班java問題也差不多兩週年了

"把那看懂你就會了"

我得到的不是答案是真理

我遇到的不是貴人是垃圾

回正題

單純按滑鼠後放開, 那叫Clicked

按滑鼠後拖曳再放開, 那叫Released

nfs一直Stale NFS file handle

給未來的裕翔

當我在client端掛載nfs後

在server重新整啟nfs

這時client只要對那nfs掛載點作任何事情

都會產生"Stale NFS file handle"錯誤訊息

這時我在client端可以sudo umount -f /your/nfs/mount/point

Saturday, August 7, 2010

vi裡讀進man的結果

給未來的裕翔

剛看到一個範例

以vi開啟某個檔案

想要讀取man ls的資料

假設我只要含有ls的那幾行

可以在vi底下打

:r !man ls | grep ls

酷耶, 不過讀進一堆^H

不知那是啥

也不知道如何替換掉

以使用者身份登入lftp

給未來的裕翔

lftp是一個連到ftp server的工具

所以server開啟vsftpd即可

不用擅自猜測可能有xinetd控管的lftp

以anonymous身份使用的話

直接lftp ftp-server即可

如果想以popoya身份登入

lftp ftp-server -u popoya

雖然vsftpd.conf預設允許這樣做(local_enable=YES)

但是selinux不允許

必須setsebool -P ftp_home_dir on才行

基於安全, 建議不開放使用者登入

(因為密碼是明碼傳送)

所以vsftpd.conf的local_enable要設為NO

剛設為on的selinux也要記得改為off

提醒: 要成功架ftp server的話

/etc/sysconfig/iptables的tcp要開放21

/etc/ssyconfig/iptables-config的IPTABLES_MODULES="ip_conntrack_ftp ip_nat_ftp"

/etc/hosts.allow要vsftpd:ALL

對某台dns server進行norecurse查詢

給未來的裕翔

如果我要查一個zone, ex: aaa.bbb.com

向某台dns server查詢, ex: my.dns.server

dig +nocurse aaa.bbb.com @my.dns.server

那個+nocurse的意思可以想成

不准my.dns.server去問別人

不知道就是不知道^^

不知道就會fail

假設它預設不會知道, 但卻沒fail?

那可能是cache有答案

cache的答案可用rndc flush清除

dns的interactive!!!

給未來的裕翔

赫然發現

之前一直以為是iterative的dns 查詢方式

似乎是interactive阿!!!

測試master DNS server是否允許zone-transfer

給未來的裕翔

雖然我沒要架slave DNS server

以下指令我也沒真的去測試

不過先把看到的記下來

之後有問題就可以直接搜尋筆記了

假設有一台DNS server的ip是111.222.222.111

它負責lulumi.com網域

那我要測試它是否有對我這台機器開放zone transfer

dig -t axfr lulumi.com @111.222.222.111

-t是type

axfr是一個mechanism的名稱, 不是四個參數

或是使用指令host

host -l lulumi.com

dig也可不加那個@111.222.222.111

有加的話應該是問"111.222.222.111有否提供lulumi.com的zone transfer?"

沒加的話應該是問"是否有誰提供lulumi.com的zone transfer?"

host要加@111.222.222.111的話, 我還不確定語法上要怎麼加

沒看到範例

喔喔喔! dig的recurse和trace!!!

給未來的裕翔

雖然之前解釋過recursive和iterative查詢

不過有些觀念還不是很清楚

當我想看查詢的過程, 要加+trace

可是我man dig時, 它說recurse這bit是預設set的

不過當使用+trace的話, recurse的bit就會被disable

嗯嗯! 怎會這樣? 當我想看它遞迴查詢的過程, 居然會disable那個recurse的bit!!!

難道, +trace顯示出來的不是recurse?

想了又想, 以下是我的設想:

我是client, 我有架一台dns server, 然後有設定forwarders

當我平常dig時, 我跟dns server說"幫我查"

於是dns server去跟它的forwarders說"幫我client作recursive查詢"

然後forwarders回傳dns server一個結果, dns server也回傳我一個結果

ok, 很合理

而當我使用+trace時, 它給我查詢的過程

我一樣對dns server說"親愛的 幫我查"

而這時dns server心花怒放^^

對forwarders說"幫我一個小忙, 請問哪邊可以查到這答案"

forwarders回我的dns server一個地址

於是dns server再去那個地址問"幫我一個小忙, 請問哪邊可以查到這答案"

這樣一路問下去, dns server終於幫我搞定我要問的了

對dns server而言, 它的行為是iterative

所以我在想, 當我使用+trace時, recurse的bit被disable

就是因為對我的dns server而言, 他是一個個iterative去查的

所以平常講的recursive和iterative, 都是指dns server和forwarders之間的查詢方式!?

簡單說來, recursive查詢就是我請對方幫我搞定

iterative查詢就是我請對方告訴我一個方向

以上, 個人猜測^^"

ref: http://dns-learning.twnic.net.tw/dns/03opDNS.html

selinux的restorecon根據

給未來的裕翔

當以restorecon對某個檔案或目錄進行恢復context時

它是以根據的

可用semanage fcontext -l來看那些根據, ex:
/var/www/nut-cgi-bin/upsstats\.cgi                 regular file       system_u:object_r:httpd_nutups_cgi_script_exec_t:s0
/var/www/perl(/.*)? all files system_u:object_r:httpd_sys_script_exec_t:s0
/var/www/svn(/.*)? all files system_u:object_r:httpd_sys_rw_content_t:s0

今天如果我把/var/www/html的index.html複製到別的資料夾去, ex: /se-test

如果直接cp, 的context會變成:

unconfined_u:object_r:default_t:s0

如果用cp -a, 它的context會跟原本一樣:

unconfined_u:object_r:httpd_sys_content_t:s0

而那個/se-test是自己隨便建立的, context是

unconfined_u:object_r:default_t:s0

所以, 當我對裡面的檔案進行restorecon

index.html也只會變成unconfined_u:object_r:default_t:s0

不會變成unconfined_u:object_r:httpd_sys_content_t:s0

除了我手動chcon -t httpd_sys_content_t index.html

有辦法讓它(/se-test)預設就是httpd_sys_content_t嗎?

可以呦~^^

新增一個restorecon的根據

semanage fcontext -a -t httpd_sys_content_t '/se-test(/.*)?'

-a是add

-t是type

'/se-test(/.*)?'是什麼呢! 是什麼呢? 有誰知道是什麼嗎?

總之, restorecon的根據建立完成^^

之後對/se-test或裡面檔案進行restorecon就會變成

httpd_sys_content_t

一些關於htaccess的筆記

給未來的裕翔

如果要用htaccess的話

先作兩個動作

在首頁資料夾底下新增.htaccess

裡面有四個設定要記一下
AuthName "xxxxxx"      # xxxxxx隨便打, 記得有雙引號就好
AuthType Basic
AuthUserFile /your/.htpasswd-yyy/location
require valid-user

打岔一下, authName也可以, Require也可以, 大小寫似乎都可以?

接著去設定
        AllowOverride AuthConfig

基本設定這樣就可以了

接下來就是新增帳密問題

帳號不一定要存在http server上, 就算存在密碼也可以隨便設

htpasswd -c /your/.htpasswd-yyy/location amy

htpasswd /your/.htpasswd-yyy/location boby

每建一個使用者就同時設定密碼

只有第一次需要-c, 第二次也-c的話, 第一次設定的就不見了

設定完後不需要重啟httpd

使用瀏覽器測試時, 就可以看到它要求輸入帳密

一旦輸入後, 之後無論在瀏覽器怎樣重新整理都不需要再輸入了

如果新增帳密要測試的話

建議重啟瀏覽器

有點小成就感^^

Friday, August 6, 2010

nautilus的畫面分割

給未來的裕翔

在nautilus裡面

按F3可以變成兩個切割畫面耶^^

亮色背景表示是CWD

再按一次F3, 暗色背景那塊會消失

squid的allow和deny有順序性

給未來的裕翔

在squid server端

如果我在/etc/squid/squid.conf裡面允許140.114.28.0/24使用

卻不准它去瀏覽.yahoo.com的話

應該要這樣寫
acl deny_dst dstdomain .yahoo.com
http_access deny deny_dst
acl allow_group src 140.114.28.0/24
http_access allow allow_group

如果先允許allow_group再拒絕deny_dst

那當我client使用該squid server時

一旦比對到allow_group就放行了

不會再比對下去

所以順序很重要!

另外, 擋成功的話, client會看到網頁左上角有烏賊的圖示

squid要開的防火牆

給未來的裕翔

squid要開的防火牆似乎不只tcp的3128(預設port)

udp的3128也要開

也就是tcp和udp的3128都要開

Thursday, August 5, 2010

vim刪至檔首

給未來的裕翔

dgg

d1G也可以啦, 多一鍵

請問: sudo vim是看誰的.vimrc?

給未來的裕翔

請問~~~(威哥式問法)

當我使用sudo vim filename時

它看的.vimrc是誰的?

root? sudoer?

答: sudoer^^

named.conf的listen-on port 53

給未來的裕翔

這次憑印象建立重建DNS server

失敗~^^

不過就一個DNS server, 每次都能失敗其實也該頒給我獎狀...

好在有筆記^^

我就不信每次都會遇到新問題~

原來是我named.conf裡面的listen-on port 53忘記加DNS server本身的ip

加了以後就可以了

以前對於這點很納悶, 127.0.0.1不就是本身的ip嗎?

現在我在猜

那ip代表interface嗎? 是的話就解釋的通了

127.0.0.1代表lo

而DNS server的真實ip代表eth0

就當是這樣吧^^

筆電使用外接光碟機安裝linux, 不過讀不到?

給未來的裕翔

可以試著換一台外接光碟機^^

Wednesday, August 4, 2010

cp來源和目標同位置的話?

給未來的裕翔

沒想到cp有個小技巧

當我對/etc/sysconfig/iptables作備份時

如果備份成/etc/sysconfig/iptables.bak

我都是cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak

不然了不起一點就是先cd /etc/sysconfig

cp iptables iptables.bak

剛發現

其實我可以直接

cp /etc/sysconfig/iptables{,.bak}

這跟touch file{1,2,3}的道理是一樣的

會變成touch file1 file2 file3, 它們數字在指令裡是以逗號隔開

同理/etc/sysconfig/iptables{,.bak}

因為逗號前面沒東西, 所以展開是/etc/sysconfig/iptables

而逗號後面是.bak, 展開變成/etc/sysconfig/iptables.bak

如同touch file1 file2 file3

我的cp指令變成

cp /etc/sysconfig/iptables /etc/sysconfig/iptables.bak

帥!

hosts.allow的spawn

給未來的裕翔

hosts.allow和hosts.deny本來是一道防線

有類似的設定sshd : 140.114.28.

如果在限制連線的同時希望有所動作

ex: 連進來的都紀錄到log

我們可以寫成

sshd : 140.114.28. : spawn $(date) %c %d >> /your/log/location

這樣可以紀錄日期, client, daemon

或是直接藉由logger工具

sshd : 140.114.28. : spawn logger %c %d

因為logger會自動紀錄日期, 所以不再另外標

其他的%, 可man hosts.allow查閱

ftp如果permission denied?

給未來的裕翔

如果哪天使用ftp下載東西時

遇到permission denied的話

也許可以先檢查一下自己的CWD是不是有權限寫入......

這是我用tftp遇到的問題(雖然沒有下成功)

不過還是歸類到vsftpd好了

enable那些被xinetd控管的程式

給未來的裕翔

假設我要修改tftp的disable為no

我必須sudo vim /etc/xinetd.d/tftp

有個更方便的方法

sudo chkconfig tftp on

突然想起鳥哥好像有講過^^"

iptables-save

給未來的裕翔

iptables-save > /etc/sysconfig/iptables和service iptables save

都是把當下的規則存到/etc/sysconfig/iptables

很明顯的, service iptables save比較簡短^^

打個岔

iptables -F的當下馬上生效

因為我馬上無法操作

還有iptables -F清的是RULE

我新增的chain不會被清掉

遠端修改iptables注意事項

給未來的裕翔

遠端修改iptables時

最好不要輕易sudo service iptables restart

我把iptables清空後, INPUT的policy改為DROP

重新啟動後就突然斷線了

是沒有顯示啦, PS1依然顯示我在server

不過操作就不能動了

我在猜, 是因為ssh那條規則被我移除掉了?

還是那個ESTABLISHED,RELATED?

再來就是, 我直接跑去server上操作

結果ssh原來的client和ping外面主機都沒結果

不知道依舊是那ESTABLISHED,RELATED?

還是icmp的規則尚未增加?

先記下來供以後釐清

(沒有以後了!!!)

ps查process的context資訊

給未來的裕翔

除了file有context, 程序也是有的

當被問如和看ntpd的context時

很得意的key出以下指令^^

ps Z `pidof ntpd`

後來發現ps可以直接對process名稱進行處理

ps Z -C ntpd

這兩個印出的資訊會一樣

再來就是, 參考答案給ps -ZC ntpd

由於-Z在ps help裡面是沒有的

因此我偏向使用上面第二個

ps Z -C ntpd

md5sum, sha1sum, gpg

給未來的裕翔

簡介一下md5sum, sha1sum, 和gpg

md5sum和sha1sum是對檔案算hash, 然後驗證用

gpg才是對檔案加密用的

用法:

md5sum file

sha1sum file

如果想要比較兩個檔案的hash, 直接放在一起即可

md5sum file1 file2

sha1sum比照辦理^^

至於加密

gpg -c file

輸入加密密碼後會在current working directory(CWD)產生一個file.gpg

要解密的話

如果直接輸出到螢幕

gpg -d file.gpg

要另存新檔的話

gpg -o file2 -d file.gpg

ssh-agent的功能

給未來的裕翔

關於ssh-agent的功能

其實我不是很清楚......

直接打ssh-agent, 這樣算執行一次

eval $(ssh-agent), 這樣也算執行一次

此時用pidof ssh-agent

可以看到兩個pid

總之, 如果我要用ssh-add先取得我的密碼的話

ssh-agent就要先執行

直接打ssh-agent再ssh-add不行

非得eval $(ssh-agent)才可以

Tuesday, August 3, 2010

cut的deliiter如果是空白?

給未來的裕翔

cut -d' ' -f#

head指定不列出的行數

給未來的裕翔

head是拿來列出檔案開始的幾行的

預設十行

可用head -n 20改成列出20行

如果今天我想, 從頭列出到倒數第三行?

那就是最後兩行不列出

head -n -2

報告完畢

首次嘗試rsync

給未來的裕翔

一直以來都懶的備份

一開始藉口是"等以後學linux再好好備份"

接下來藉口是"等我熟悉指令再好好備份"

終於, 沒藉口啦^^"

剛練習用一下rsync發現還不錯耶, 也常在網路上看到相關介紹

不過似乎都是連port 22?

以--port=###也無法改port的樣子

假設天命註定就port 22吧

我想把server端使用者lulumi的Desktop裡面所有檔案同步過來

rsync lulumi@rsync-server:Desktop/* .

注意那個 . 一開始沒看到真是搞死我

這樣只會複製檔案, 略過資料夾, 想連資料夾一起同步的話

rsync -r lulumi@rsync-server:Desktop/* .

至於server端的設定, 不需要特地設iptables也不需要修改/etc/hosts.allow

應該是ssh有通就可

缺點是要打密碼, 不過既然是用ssh通道, 應該可以改成無密碼的passphrase?

沒試過, 再說~

find的size

給未來的裕翔

剛發現一件事

使用find -size時

如果後面要加單位

k, M, G大小寫要一致

注意, 那個k如果大寫會有問題

但是M和G要大寫

find的rm確認

給未來的裕翔

如果使用find

要針對找到的檔案進行刪除

刪除前要先經使用者確認

find xxxxxx -exec rm -i {} \;

有個更快的喔! 那個確認動作交給find來問

find xxxxxx -ok rm {} \;

find的and和or

給未來的裕翔

這篇不是解答而是疑問

預設來講

find的每個expression是以and連接

需要or的話

可以-or或是-o

(補充, 需要not的話,可以-not或是 !)

今天我遇到一個問題

找出/底下owner非root, bin的檔案

find / -not -user root -not -user  bin -ls 2> /dev/null

一開始我想錯了, 打成

find / -not -user root -or -not -user  bin -ls 2> /dev/null

事後想想, 雖然想錯, 不過這指令應該print出更多結果才對阿!?

居然沒有, 而且結果似乎是錯的? 跟我想的完全不一樣!

有請未來的裕翔開導我^^

用at -c看工作內容

給未來的裕翔

當以at指明一件工作時

可用at -l查工作代號

再以

at -c 代號

來看工作內容

可以看到一堆有的沒的

那是當時at的環境紀錄

好像是一堆環境變數

crontab可以接受stdin耶!

給未來的裕翔

一般來說

可以 crontab -e 來編輯一個重複發生的事情

不過這樣就必須進入互動模式了

剛發現可以用pipe

echo 'command' | crontab

不過這只限第一次

如果要新增第二份工作

也用pipe的話

第一份工作會被覆蓋

利用ps和tail找出最大咖程式

給未來的裕翔

如果要列出所有process

ps aux

output有它的format

如果我想要自訂format, ex: pid, process name, %cpu

ps axo pid,comm,pcpu

ps axo pid,comm,%cpu 也可, 不過會多按一個鍵^^

可以發現跟ps aux比起來

少一個u, 多一個o

o是option的意思, 指定後面format用

至於那個u, 我也不知道為什麼不見了, 不過加了會錯

這樣就以顯示我要的format, 接著是排序問題, 利用--sort選項

如果要以pcpu排序

ps axo pid,comm,pcpu --sort=pcpu

預設是increasing

ps axo pid,comm,pcpu --sort=pcpu

如果要decreasing

ps axo pid,comm,pcpu --sort=-pcpu

所以如果想知道最大咖的程式

ps axo pid,comm,pcpu --sort=pcpu | tail -n1

那 ps axo pid,comm,pcpu --sort=-pcpu | head -n1 可以嗎?

不行

因為這就是output:

PID COMMAND         %CPU

這是header阿!

bash script測試資料夾是否存在

給未來的裕翔

這很簡單

不過我就是會忘記^^

test -d target-dir

echo $?

0表示存在

1表示不存在

ping的-w

給未來的裕翔

通常ping某一台機器, 如果有問題

ping指令就會等response很久

如果想訂一個等待時間, ex: 2秒

ping -w2 host

報告完畢

Monday, August 2, 2010

java的警告: The serializable class RadioButtonFrame does not declare a static final serialVersionUID field of type long

給未來的裕翔

最近java練習到GUI部份後

都會出現這個警告

The serializable class RadioButtonFrame does not declare a static final serialVersionUID field of type long

想當初在eclipse時, 直接點一下它就幫我搞定了^^

現在用vim寫我還真不知道怎麼處理

一開始當然是人工忽略該警告

不過最近決定這樣不行, 要了解一下!

於是google到這篇

http://xray2005.javaeye.com/blog/196639

但我不知道他在說啥...

總之, 解決方案是在警告所在位置, 增加以下
private static final long serialVersionUID = 1L;


搞定!

vim的.是重複行為 重複哪個行為?

給未來的裕翔

如果我現在想要修改/etc/logrotate.conf

ex: 把weekly換成daily

/etc/logrotate.conf裡面有兩個weekly

所以改完一個後, 要按Esc再按n

這時候會跳到第二個weekly

按.

就自動重複上一個改字的行為

把它變成daily

原本我還以為, 會重複那個n呢!

vim的{}

給未來的裕翔

{ 和 } 它是在段落間移動

實際上使用的話

可以想成是在空白行之間移動

/etc/sudoers某行解釋

給未來的裕翔

在/etc/sudoers裡面

有一行是

root ALL=(ALL) ALL

它意思是允許root使用者

在任意的機器上

使用任意指令

以任意使用者身份

另外, sudo每次輸密碼的效力可以維持五分鐘

五分鐘內沒動作的話

重新sudo就要重輸密碼

cut的field幾行都可以

給未來的裕翔

如果想以cut抓取/etc/passwd的某幾行

ex: 1, 4, 7行

cut -d: -f1,3,7 /etc/passwd

這幾行中間還會自動以 : 隔開喔~

sed的i

給未來的裕翔

請看以下

sed 's/^cat$/dog/i' filename

那個i

不是inform

而是ignore case

aspell如果no list?

給未來的裕翔

如果使用aspell檢查錯字時

aspell list < file

顯示

Error: No word lists can be found for the language "en_US".

那就裝一下別的套件吧

sudo yum -y install aspell-en

搞定

tee的功能

給未來的裕翔

在pipe處理中

通常都是把上一個STDOUT當成STDIN處理後再把它STDOUT

看是要匯入檔案

或是再傳給下一個指令

可否同時達成?

xxx | tee filename | yyy

上面的意思是xxx把自己的STDOUT傳給tee後

tee產生兩個STDOUT(我也不知道這說法對不對...)

一個匯入檔案filename

一個當yyy的STDIN

報告完畢

mutt的閱讀信件

給未來的裕翔

在mutt裡

如果要往下: Enter

如果要往上: Backspace

歷史命令混搭風

給未來的裕翔

當我執行某個動作

ex: cp xxxxxxxxxxxxxxxxxx

之後只要!cp

它就會去執行我最近以cp開頭的動作

至於$()則是跟` `一樣, 裡面的動作先執行

剛發現

可以 $(!cp) 耶!

混搭風阿!

不過不能 `!cp`

`` 裡面沒有替換動作的

ls的-F

給未來的裕翔

如果ls時忘記每個顏色代表的意思

可以考慮ls -F

它會加一些識別符號再每個檔名後面

萬用字元

給未來的裕翔

萬用字元的英文是 wild card

注意: 跟正規不一樣

一般為人所知的是*

代表任意長度的任意字元

而?

代表長度1的任意字元

報告完畢

Sunday, August 1, 2010

cp對於ln的處理

給未來的裕翔

cp複製一個檔案時

如果它是link檔

被複製的不會是ln檔本身, 而是ln檔指的對象

可用 cp -a 來複製ln檔本身

cal看連續月份

給未來的裕翔

如果想用cal指令看2010年7,8,9月

cal 8 2010 -3

那個-3就是以8月為中心的連續三個月

-2呢? 不行喔^^

剛看了一下, 好像只有-3可用^^"

Saturday, July 31, 2010

android環境設定筆記

給未來的裕翔

其實我也有點忘光光了

不過至少在全忘掉之前多少寫一點

這就是累積阿!

首先下載android-sdk_r06-linux_86.tgz

解壓縮進入android-sdk-linux_86資料夾

然後tools/android update sdk來安裝sdk

安裝在android-sdk-linux_86資料夾裡

它建議以後升級或幹嘛的都利用它的manager

不要自己下載覆蓋貼上

再來是Eclipse要安裝adt

開啟Eclipse後, Help -> Install New Software

新增以下網址

https://dl-ssl.google.com/android/eclipse/

然後安裝它所提供的東西

重啟Eclipse之後, Window -> Preferences -> Android

把位置指定剛才的android-sdk-linux_86資料夾

然後Apply -> OK

( 赫然發現, 在Eclipse裡面, Window -> Android SDK and ADK Manager )

( 也可以叫出類似update manager的東西耶! 還是說是一樣的? 本來就有這功能? 還是哪時跑進去的? )

到此, 環境算是設定好了, 應該吧

Eclipse安裝ADT遇到問題

給未來的裕翔

我這次要提供的不是解法

而是禱告感謝神蹟

幾天前無法裝ADT

我真的不知道遇到什麼問題

幾天後, 就可以動了!!!!!! 該死!!!

到底是我重開Eclipse所以可以動?

還是我重開機?

還是因為我玩小遊戲贏了?

我做了一堆有的沒的

但Eclipse一直開在那沒管它

重開機後卻可以動, 這叫我怎麼知道哪步是關鍵步驟!

快速得知process id

給未來的裕翔

平常如果想查某process的pid的話, ex: pidgin

都是ps aux | grep pidgin

剛又進不了^^

在知道process是pidgin的情況下

我可以pidof pidgin

就直接回傳數字了

帥吧^^

藍牙耳機充電後再啟用的最方便方式

給未來的裕翔

如果現在藍牙手機沒電了

充完電後

把藍牙耳機調到"被找模式" ^^      <-      這是錯的, 開啟耳機就可以了

然後在Gnome的右上角上找藍牙符號

由於藍牙耳機還在選單上

選Connect, 有時不會馬上生效, 要稍等再按~

接著選Open Sound Preferences

在裡面的Output

選這隻藍牙耳機, 這樣應該就可以繼續聽了

不需要重開瀏覽器或有的沒的

另外, 如果重開機了

原本建立的連線還會在

耳機不需要先關掉再重新進入"被找模式" ^^

而是直接在Gnome右上角的藍芽符號

從該設備點選Connect即可

再另外, 如果切換到level 3再切換回level 5

直接可以聽喔^^

什麼都不需要做~

後記: 如果充完電後重開卻一直無法建立連線

可以考慮重開進入"被找模式^^ "

然後去藍芽圖示裡的設定點一下該裝置的連線

藍芽圖示就會說它偵測到一個裝置要求連線之類的

搞定~

再後記:

有時開機就可以Connect

有時要進入被找模式再Connect

是不是跟我直接關機或是直接充電有關?

充電算不算關機?

還是關掉時間長短?

先紀錄一下

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

我關機一個晚上, 隔天要進入"被找模式"才可以比較快連線

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

昨天晚上充電, 剛直接開啟好像就接通了

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

吃飯去先關掉, 回來開機就自動接上了

Friday, July 30, 2010

A台有的套件, B台也要

給未來的裕翔

這是一個我很喜歡的實作題

首先, 在A台電腦把所有安裝的套件名稱存檔

rpm -qa -queryformat "%{NAME}" > a-installed.txt

把a-installed.txt複製到B台電腦後

比較優雅的作法是, 把B台也有的套件從名單濾掉
for package in `cat a-installed.txt`
do
rpm -q $package &> /dev/null || echo $package >> b-not-installed.txt
done

先不管指令的回傳值, 上面那個script的意思是

對a-installed.txt的每個套件名稱

測試B本機有沒有, 以rpm -q來測試, 沒有就當false(先不管回傳值)

兩個指令中間是以||區隔

&&檢查到有false就停

||是檢查到有true就停

對那些不存在B本機的套件, 回傳false, 因此就會執行第二道指令

把它們的名稱echo到b-not-installed.txt裡面

那如果B本機本來有存在數個a-installed.txt裡面的套件呢?

在一開始的rpm -q會回傳true, 然後就沒事了~

這樣產生的b-not-installed.txt就是A有B沒有的

接著, yum似乎不能接受stdin來的input

所以可以利用xargs

cat b-not-installed.txt | xargs sudo yum -y install



sudo yum -y install `cat b-not-installed.txt`

似乎後者較好^^

當然啦, 這是比較優雅的作法, 因為少了上面那個bash script

也是無所謂阿, 已經裝過的會自動略過嘛!

rpm的queryformat

給未來的裕翔

原來rpm這麼多選項可以用阿!

如果想知道我裝哪些套件

用rpm的話, rpm -qa就好

不過這是有版本編號和architecture的

如果只想要套件名稱就好呢?

rpm -qa --queryformat "%{NAME}\n"

帥吧!

列出套件安裝順序

給未來的裕翔

原來可以列出套件順序阿!

rpm -qa --last

這樣就會列出從最新到最舊的順序

很久以前裝的套件更新後, 就是當下最新

但是因為套件很多

如果想要順序顛倒, 新的在最下面的話

rpm -qa --last | tac

yum和rpm查詢安裝軟體的速度

給未來的裕翔

如果想知道裝了哪些含有gnome字眼的套件

rpm -qa | grep gnome



rpm -qa '*gnome*'

都可以, 速度差不多

如果要用yum的話

yum list installed | grep gnome



yum list installed '*gnome*'

也是都可以

不過後者快多了!

需要xargs的理由

給未來的裕翔

為什麼需要xargs?

我小小的大腦認為

因為不是每個指令都可以對stdin作處理的

ex: 指令a | 指令b | 指令c

指令a的output就是指令b的stdin

指令b的output就是指令c的stdin

重複一次

不是每個指令都可以對stdin作處理的

所以需要xargs

ex: 如果我想用whatis針對前面指令丟出來的幾個東西作查詢

因為whatis的用法只處理後面接的對象, ex: whatis blabla

無法ex: 指令d | whatis

所以就必須利用

指令d | xargs whatis

以上: 我小小的大腦的結論

sed的delimiter

給未來的裕翔

剛看到一個指令

rpm -ql rpm | sed -n '/bin/s:.*/::p'

一開始看到::就傻眼了

而且還有那個s:

經我小小的大腦思考後

我判斷那個::和:都是delimiter

而完整的意思就是

先以rpm -ql rpm把套件rpm所含有的檔案列出來

再以sed作處理, -n的意思是, sed只列出作處理的那幾行

不加-n的話, 從stdin進來的都會列出來

再來就是重頭戲'/bin/s:.*/::p'

上色加空白以表示方便的看法

' / bin / s : .*/ : : p'

紅色的斜線是第一階段的delimiter, 區隔範圍動作

/bin/的意思是鎖定stdin含有bin的行

後接的s:.*/::p是說, 任意連續字元 .* 以斜線 / 當右側結束字元(貪婪原則)

全部替換為

然後print出來

真是帥呆了!

查某package各版本的log changec和會執行的script

給未來的裕翔

以套件mlocate為例

想看它每個小版本之間的差異的話

rpm -q --changelog mlocate

想知道它在安裝或移除時會額外作啥

rpm -q --scripts mlocate

Thursday, July 29, 2010

grep的正規表示式

給未來的裕翔

如果要在grep裡面用正規表示, ex:

grep '^\[.*\]' file      單引號可以

grep "^\[.*\]" file      雙引號可以

grep ^\[.*\] file      不加不可以

crontab移除注意事項

給未來的裕翔

不管用crontab -e幾個事項

crontab -r會一次全部清除

連問也不問......

Tuesday, July 27, 2010

pts和virtual console

給未來的裕翔

渾渾噩噩過了24載

對於pts和virtual console的差別, 不想再無所謂了^^

pts是pseudo terminal slave, 也就是在桌面環境開啟的terminal

而virtual console就是Ctrl + Alt + F1~F6的那個東西

至於名稱來源我就不知道啦~

為boot menu上鎖

給未來的裕翔

當忘記root密碼的時候, 可以藉由single user mode去建新密碼

帥呆了^^

對於那些不懂linux有這功能的人來說

只要電腦能被別的linux玩家直接接觸, 有鎖等於沒鎖阿!

這讓我超得意也超緊張, 雖然我會改密碼, 但我不會防止人家改我密碼

剛發現, boot menu可以上鎖耶!!!

先以grub-md5-crypt產生一組亂碼

假設叫做 35984ut98h9fx

在/boot/grub/grub.conf新增一行

password --md5 35984ut98h9fx

這樣之後如果人家要edit自己的boot menu

就必須先輸入密碼(但依然可以使用rescue mode破解)

沒要修改的話, 就沒影響(表示我可以遠端開機)

另外發現一件事!

即使我輸同樣的密碼, 不同時間產生的亂碼會不一樣耶!

我在某電腦以normal user產生一組亂碼

再以root身份把它貼到/boot/grub/grub.conf

也可以耶!!!

Monday, July 26, 2010

暫時更改hostname

給未來的裕翔

/proc裡面紀錄著電腦的一些資訊

像是記憶體: /proc/meminfo

或是cpu: /proc/cpuinfo

平常我們設定hostname

是到/etc/sysconfig/network修改, 然後重開機才生效

開機時會把hostname的值紀錄在/proc/sys/kernel/hostname

之後如果輸入指令hostname

它會去讀/proc/sys/kernel/hostname

所以我們可以暫時修改該檔案來達到"不重開機改hostname"的目的

不過記得要改回來阿

不然我也不知道會發生什麼事

查看cpu數量

給未來的裕翔

如果想要查看cpu數量

可以/ecc /proc/cpuinfo

不過這樣顯示的資訊落落長

可以安裝套件x86info

然後輸入指令x86info

可以看到濃縮的cpu資訊

(至少展示長度是濃縮的)

bash的`

給未來的裕翔

剛發現, 在同一行可以用兩次以上的``耶!

ex: mkinitrd --with=raid1 initramfs-raid1-`uname -r`.img `uname -r`

這樣可以製作還有raid1.ko的RAN disk file

阿琪與遠端桌面

給未來的阿琪

如果你說的連線是只有桌面環境的

從linux連到windows的話

先安裝套件tsclient

(linux裡面的套件你就想成是windows裡面的軟體吧)

先切換成root

su -

再以yum下載

yum -y install tsclient

yum安裝過程會跟你確認是否下載

加那個-y就可以自動幫你回答yes

那如果要自動回答no呢? 你來鬧的阿^^?

裝好之後

Applications -> Internet -> Terminal Server Client

-> Add Connection -> Windows Terminal Service

Host填IP就可以了

Username和Password看你要現在填(之後可以直接進入工作畫面)

或是不填(之後連線會先進入登入畫面)

Domain就不用鳥它了, 其它我也沒用過, 有心得再跟我分享吧^^

至於windows連linux桌面, 不會耶, 也不想研究, 哈哈

不過我知道可以, 要裝一個軟體, 名稱我忘了, 不過不想google耶, 哈哈

幫不上忙, 歹勢^^

阿琪與gnome terminal

給現在的阿琪

雖然在linux的桌面環境裡

可以叫出模擬的terminal

然後輸入指令叫出視窗程式, ex: pidgin &

不過這樣會有幾個缺點

有些pidgin的訊息可能會輸出到剛才輸指令的terminal

當然, 沒繼續使用terminal的話沒差

還有一個缺點就是, 萬一不小心關掉terminal

因為pidgin是那個teminal的子程式

就一起關掉啦~

在fedora如何使用中文輸入法

給現在的証琪^^

System -> Preferences -> Input Method -> Input Method Preferences

-> Input Method -> Select an input method -> Chinese -> Chewing -> Add

bluetooth adapter

給未來的裕翔

當以藍芽耳機聽音樂聽到一半時

把藍芽adapter拔掉, 再插上

可以聽耶!!!

Thursday, July 22, 2010

chrome的快捷鍵

給未來的裕翔

原來Alt + 左是上一頁阿!!!

Alt + 右是下一頁

似乎眾所皆知?

Wednesday, July 21, 2010

java編譯多個檔案

給未來的裕翔

如果現在有兩個檔案

design.java和designTest.java

書上說, 編譯時要javac design.java designTest.java

然後java designTest來執行

我也都照做,  後來又多了extends

我的疑問是, 被extends的那個也需要放進來一起編譯嗎?

還是我依舊編譯那兩個, 它會自己去找?

似乎會自己去找?

那我如果一開始就只編譯那個designTest.java

它也會自己去找會用到的東西嗎?

實驗結果: 會耶! 會自己去找!

所以以後只編譯那個designTest.java就可以了

Tuesday, July 20, 2010

vlc player的snapshot

給未來的裕翔

totem似乎沒有snapshot的功能

而vlc player有

Video -> Snapshot

影像會存到

/home/xxxxx/.local/share/vlc

Monday, July 19, 2010

把檔案非註解部份秀出來

給未來的裕翔

以/etc/ntp.conf為例

它裡面的的註解是#

所以先把它cat出來

再利用grep把每列開頭不為#的抓出來

完整命令如下

cat /etc/ntp.conf | grep ^[^#]

如何架設NTP Server

給未來的裕翔

首先

把ntpd服務關掉: service ntpd stop

不然無法先以ntpdate校正時間

架server前

要先以ntpdate粗略校正: ntpdate -b more-accurate-time-server

不然如果時間差太多, 之後本機架好NTP Server似乎就會瀟灑的罷工

接著修改/etc/ntp.conf

server more-accurate-time-server-1
server more-accurate-time-server-2
server more-accurate-time-server-3
server 127.127.1.0 # 我看到的兩範例都有這行, 我也不甚了
fudge 127.127.1.0 stratum 10 # 我看到的兩範例都有這行, 我也不甚了
driftfile /var/lib/ntp/drift
# 想限制可以使用此NTP Server的來源就如下設定
# restrict $$$.$$$.$$$.$$$

之後把ntpd服務打開: service ntpd start

同時設定成每此開機都會啟動: chkconfig ntpd on

搞定~

編譯C++需要安裝的套件

給未來的裕翔

為了編譯 OpenCV 2(因為yum只能下載到1.1)

我需要裝C++編譯器, 不然會一直configure錯誤

看到網頁說gcc也可以編譯C++檔案

親自嘗試後, 如果不是我太笨就是他騙人……

後來想起之前在windows上編譯C++是利用MinGW的g++指令

於是利用所學^^

yum provides g++

失敗~他建議我改成

yum provides /g++

果然找到一個!

gcc-c++

耶!搞好久~~~

結語: 都快忘了重點是編譯OpenCV……

Qt起手包

給未來的裕翔

本來是不想用Qt的

因為之前看過Qt和Gtk的歷史鬥爭文

Qt飾演反派^^

不過既然朋友A和朋友B都希望我學Qt

那就來吧!

首先, 安裝qt-devel套件: yum install -y qt-devel

之後

在要編譯的程式碼的資料夾裡

依序輸入

qmake -project

qmake

make

就產生與資料夾同名的執行擋了^^

真爽~

對partition製作ext3 file system和label

給未來的裕翔

利用fdisk切割好一個partitinon後

本來我是用

mkfs -t ext3 /dev/sda#

tune2fs -L label-name

來達到這兩個目的

剛發現可以一行搞定的簡單指令

mkfs.ext3 -L label-name /dev/sda#

有沒有label成功可用blkid來驗證

又進步了~耶

快速製作大量使用者

給未來的裕翔

寫一個script

for name in name1 name2 name3 # …
do
useradd $name
echo password | passwd $name –stdin
done

如果使用者實在太大量了

可以把所有使用者另外存一個name-file

name1
name2
name3
blablabla

把原來的script修正為

for name in `cat name-file`
do
useradd $name
echo password | passwd $name –stdin
done

搞定~

從光碟製作映像檔+掛載

給未來的裕翔

這是從網路上看到的

(我很需要……)

已經成功做出映像檔

不過還不確定做出來的映像檔可否使用

在此先把指令記錄下來

dd if=/dev/cdrom of=/my-iso-file-destination

搞定!

幾天後的今天

我嘗試掛載幾天前的那天所製作的映像檔

mount -t iso9660 -o loop /where-my-iso-is/file-name.iso /where-I-want-to-mount

可以用耶^^

下次來測試最新防拷電影DVD看看, 以嚴肅嚴謹的科學探討精神~

查詢自動掛載的NTFS硬碟的uuid

給未來的裕翔

我是Fedora 12的LXDE桌面

每當要使用win下的NTFS分割區時

它才會自動掛載在/media下

但我想要開機就自動掛載

可是我看/etc/fstab下的自動掛載大部分都藉由uuid來指定

所以我想知道我使用的NTFS硬碟uuid是多少

網路上查了一下

把步驟記錄下來供我日後使用^^

首先, 使用df -h, 自己觀察一下NTFS使用的是硬碟的哪一個partition

我自己是/dev/sda5

接著, 輸入ll /dev/disk/by-uuid

就可以看到每個partition對應到哪個uuid了

赫然發現

原來我的NTFS在/media下面掛載的名稱就是用uuid!

我還以為是亂數咧~

這時又突然想到

其實我直接用/dev/sda5掛載到我想要的資料夾不就可以了嗎……

不過在此之前我要先知道要用什麼type掛載NTFS

使用mount指令看一下

答案是fuseblk

Good!

ps: 這次嘗試同時驗證了, 一個partition可以同時掛載到多個資料夾上

在Linux安裝Matlab所需的library

給未來的裕翔

其實我真的不想裝Matlab

礙於研究需要

加上學校有提供幾乎沒toolbox的正版

來第二次嘗試一下吧(第一次是我幾乎不會Linux的情況下裝的)

不過這次重點不是如何安裝

而是描述我安裝過程所遇到的一個問題

安裝時顯示缺少libXp.so

過去的我

應該就直接嘗試yum -y install libXp.so吧

結果會失敗

但是 現在的我進步了!

首先

yum whatprovides libXp.so 失敗

依照建議, 再來:

yum whatprovides /libXp.so 失敗

依照建議, 再來:

yum whatprovides */libXp.so 找到套件了^^

yum -y install libXp-devel 成功!

爽阿~

後記: 裝完後還是不能用, 把selinux關掉就可以用了

後記2: 本來想先掛載NTFS硬碟, 再把Matlab安裝在裡面,

結果變成, Matlab安裝在掛載資料夾, 但是NTFS卸載了……奇怪~

traceroute的進化版: mtr

給未來的裕翔

當我使用traceroute tw.yahoo.com時

照理講會顯示所有經過的路徑

可是因為某些原因

有些會顯示星星

此時, 如果改成mtr tw.yahoo.com

都秀出來了!

而且速度超快!

parted怪怪

給未來的裕翔

parted的優點印象中是

可以切割的數量可達幾十個

fdisk好像只能十幾個(也夠了)

另一個我比較重視的優點是

切割完後不需要執行partprobe

來讓系統認識新切割的partition

可用cat /proc/partitions來檢視

不過呢, 不知是我電腦怎

就是無法展現這項優點, 總是說我的什麼在忙碌中

我也不了

因此對我而言, 其實fdisk和parted差不多

就在剛剛

我發現parted致命的缺點^^

不能在切partition的同時製作ext4檔案系統, 甚至ext3也不行

似乎必須另外搭配mkfs之類的來製作檔案系統

嘖嘖~

block size的大小是?

給未來的裕翔

1 kilo bytes

quota用完可能會讓使用者無法登入圖形介面

給未來的裕翔

如果root對home做quota限制

當使用者達到quota硬性上限時

之後會讓使用者無法登入圖介面

因為每當使用者登入圖形介面時

會在其home下面產生一些暫時檔

quota滿了就產生不了

產生不了就無法登入

by 我的Linux老師

WaveLab安裝

給未來的裕翔

在Linux裝完Matlab之後

去MCALab下載WAVELAB850.ZIP

然後解壓縮

把資料夾Wavelab850放到

where-I-install-Matlab/toolbox/之下

變成where-I-install-Matlab/toolbox/Wavelab850

把Wavelab850裡面的WavePath.m複製到(用剪下貼上之後會有錯誤)

where-I-install-Matlab/toolbox/local裡

並改名為startup.m

這樣開Matlab就會自動啟動WaveLab了

接著測試mex有沒compile成功

雖然沒成功也沒關係

但能成功幹嘛不成功?

在Matlab裡面輸入which FWT_PO

如果秀出where-I-install-Matlab/toolbox/Wavelab850/Orthogonal/FWT_PO.mexglx

就是成功!

當然 一開始是會秀出m檔而非mexglx檔的

因為我安裝WaveLab失敗多次

中間做了什麼關鍵步驟我也不是很確定

不過的確有某一次開啟matlab時

它問我要不要compile mex檔

回答yes以後就會編譯出mexglx檔

如果一直沒遇到matlab如此提問

可以嘗試以root開啟matlab試試看

/usr/local/bin/matlab matlab &

改天有機會重裝WaveLab我再仔細研究看哪些是關鍵步驟

現在學業研究進度落後, 暫不考慮

桌面水波特效按法

給未來的裕翔

之前裝了一堆有的沒的compiz相關套件後

有開啟水波特效

不過這是之前做的

詳細步驟全忘了

要講的是

當初不知道為什麼啟動水波特效後沒有任何動靜

就沒去管它

後來發現偶爾會不小心出現水波特效

原來是要用按的

剛上網查了一下按法

Ctrl + Win + 滑鼠任意移動

爽阿^^

快捷鍵(有些要開compiz)

在此紀錄我還不熟練但很喜歡的桌面快捷鍵:

Ctrl + Alt + d: 其它壓住不放, 按一下d把所有視窗放大, 再一次縮小所有視窗

(如果目標是縮小所有視窗, 滑鼠移到最右上, 點桌面任一點也可達到同功能)

Ctrl + l(L小寫): 在console裡等同於是clear指令, 但更方便

(在firefox裡就是跳到網址列)

Ctrl + q: 可以關掉大部分程式, 不過關不掉console

Ctrl + d: 可以關掉console^^

Alt + 滑鼠滾輪上下: 調整游標所在位置下的第一個視窗的透明度

Alt + Tab: 在目前桌面的所有工作中切換
Ctrl + Alt + Tab: 在所有桌面的所有工作中切換

Ctrl + Alt + 鍵盤下: 樸素式切換桌面
Ctrl + Alt + 鍵盤左右: 炫麗式切換桌面
Ctrl + Shift + Alt + 鍵盤左右: 把正在工作的視窗移到左或右桌面

Ctrl + Win + 滑鼠隨意操作: 水波
Shift + F9: 到處是水波, 像下雨時的地面一樣, 再按一次才會停

Win + 滑鼠左鍵拖曳: 左鍵放開就會把剛框選的區域便圖檔放桌面
Win + 滑鼠右鍵拖曳: 右鍵放開就會局部放大, Esc離開

MCALab安裝

給未來的裕翔

當初裝Matlab就是為了裝WaveLab

而裝WaveLab就是為了裝MCALab

終於讓我走到這一步了 嗚嗚~

這次我直接仿照WaveLab的安裝方式

把解壓縮的資料夾放到where-I-install-Matlab/toobox/下

把裡面的MCAPath.m複製到where-I-install-Matlab/toobox/local/裡

就在我想用root開gedit編輯where-I-install-Matlab/toobox/local/starup.m的同時

錯誤! 說什麼我在唯讀的硬碟上!

明明就不是阿~!

後來我使用echo MCAPath >> startup.m卻可以

怪咧~

而開啟Matlab後也有warning, 說什麼無法寫入

即便我重新以sudo開啟Matlab也是一樣

後來

我把MCALabWithUtilities和Wavelab850的user和group換成root.root

chwon -R root.root MCALabWithUtilities

chwon -R root.root Wavelab850

重開Matlab, 成功!

為什麼成功還是想不透~

原來odt轉pdf可以上密碼阿

給未來的裕翔

File -> Export as PDF -> Security -> Set open password

MCALab安裝

給未來的裕翔

當初裝Matlab就是為了裝WaveLab

而裝WaveLab就是為了裝MCALab

終於讓我走到這一步了 嗚嗚~

這次我直接仿照WaveLab的安裝方式

把解壓縮的資料夾放到where-I-install-Matlab/toobox/下

把裡面的MCAPath.m複製到where-I-install-Matlab/toobox/local/裡

就在我想用root開gedit編輯where-I-install-Matlab/toobox/local/starup.m的同時

錯誤! 說什麼我在唯讀的硬碟上!

明明就不是阿~!

後來我使用echo MCAPath >> startup.m卻可以

怪咧~

而開啟Matlab後也有warning, 說什麼無法寫入

即便我重新以sudo開啟Matlab也是一樣

後來

我把MCALabWithUtilities和Wavelab850的user和group換成root.root

chwon -R root.root MCALabWithUtilities

chwon -R root.root Wavelab850

重開Matlab, 成功!

為什麼成功還是想不透~

MCLab使用

給未來的裕翔

好奇:

當我把WaveLab和MCALab工具放在where-I-install-Matlab/toolbox裡

是不是不管資料夾第幾層的m檔都可以直接在Matlab呼叫?

答案是: 是!

不過呢~

version libmx.INTERNAL not defined in file libmx.so with link time reference

幾乎不管執行哪個指令都會出現類似上面的error

google結果是, 建議可以看是否缺少所需的library

於是對有問題的mexglx檔使用ldd

ldd xxx.mexglx

發現有三個dynamic lib我沒有

libmx.so

libmat.so

libmex.so

這時老招重套

yum whatprovides libmx

yum whatprovides */libmx

yum whatprovides *bin/libmx

都不行

甚至出現新警告

說什麼database deform

再次google

建議先執行yum clean all

再yum whatprovides libmx

就可以了!!!!!!

不過呢

ldd xxx.mexglx依舊失敗

於是自製連結檔

cd /usr/lib

ln -s libmx-1.0.so.0 libmx.so

此時ldd xxx.mexglx抓到libmx.so了^^

但剩下的libmat.so和libmex.so無論怎麼yum whatprovides就是找不到

突然靈光一閃

locate libmex.so

locate libmat.so

原來matlab自己有提供阿, 連libmx.so都有… 嗚嗚……

繞一大圈……

突然腦中想起剛剛google眾多建議中

有一位建議修改LD_LIBRARY_PATH

於是我正在參考網路文章

筆記先紀錄到此

真是慢長的戰鬥阿……

MCALab的mexglx

給未來的裕翔

昨天嘗試修改LD_LIBRARY_PATH之後

開matlab整個視窗亂掉了

原本以為是因為我亂修改LD_LIBRARY_PATH

可是剛剛登出登入後

以root身份開第一次matlab還是會這樣

重開一次matlab就沒事了

所以應該不是LD_LIBRARY_PATH直接影響

昨天新心得:

即使我以locate找出libmx.so libmex.so libmat.so所在

把所在路徑加入到LD_LIBRARY_PATH

echo “LD_LIBRARY_PATH=/path-I-want:$LD_LIBRARY_PATH”

依然無效!

因為我忘記export LD_LIBRARY_PATH

export好之後, ldd xxx.mexglx都找到了

但是

matlab裡面執行依然失敗~

mrdwt.mexglx: symbol mxCreateDoubleMatrix, version libmx.INTERNAL not defined in file libmx.so with link time reference.

剛剛使出下策

把locate libmx.so所在資料夾整個複製到 /usr/lib底下

修改/etc/ld.so.conf.d/matlab.conf

matlab依然失敗~

直接把libmx.so複製到/usr/lib

matlab依然失敗~

甚至當我ldd xxx.mexglx時

not found的library變更多了

之前一度都找到了說

現在可能原因那麼多

我也不知道是哪個造成的

真想放棄……

現在朝向把mexglx檔移掉

讓matlab執行m檔

結果還是依然失敗

直接顯示找不到mexglx檔

快不知道還能怎麼辦了

又不是我把所有方法都試過

就可以跟理直氣壯跟教授說: “該試的都試了 我無可奈何”

我哪那麼有種~

MCALab的mex錯誤嘗試

給未來的裕翔

我一直不確定

mrdwt.mexglx: symbol mxCreateDoubleMatrix, version libmx.INTERNAL not defined in file libmx.so with link time reference

這錯誤訊息的原因為何

一直以為是libmx.so抓不到

現在要來驗證一下

是否真的沒抓到

為了達到所謂的沒抓到

我很乾脆的把所有我因嘗試而複製的和原本的libmx.so砍掉

重開matlab

看之後在matlab輸入MCALab指令所產生的錯誤訊息會不會不一樣

結果

光是重開matlab就失敗了, 爽!

以下為重開matlab的錯誤訊息

where-I-install-matlab/bin/glnx86/MATLAB: error while loading shared libraries: libmx.so: cannot open shared object file: No such file or directory

表示之前都有抓到

之前失敗幾乎可以篤定是我matlab太新和MCALab的所提供的 mexglx不合

確定一件事情真讓人爽快^^

美中不足的是我還是沒解決問題

後記:

我真該為libmx.so備份的……

debug到賭氣刪檔真的很不應該~

看來要重灌matlab了……

nmap

給未來的裕翔

想要測試某主機listen哪些service

nmap ###.###.###.###

想要測試某網段哪些主機會回應ping

nmap -sP ###.###.###.*

選項sP就是scan ping

pidgin清螢幕

給未來的裕翔

剛用pidgin跟水哥聊天的同時

赫然發現

Ctrl + l(L小寫)

可以清對話內容耶!

雖然沒什麼幫助

ps 被清掉的對話內容, 依舊會紀錄到log裡, 如果此功能有開的話~

Matlab的libmx.so被砍掉怎辦?

給未來的裕翔

昨天一時衝動把這砍了

雖然驗證了一些事情

但其實我不需要完全砍掉的…

問題一: touch一個同名檔可以嗎?

不行!錯誤訊息如下:

error while loading shared libraries: /win-data/matlab-linux/bin/glnx86/../../bin/glnx86/libmx.so: file too short

問題二: 也許是matlab有檢查格式, 把libmat.so複製一份成libmx.so可以嗎?

不行!錯誤訊息如下:

symbol lookup error: /where-I-install-matlab/bin/glnx86/../../bin/glnx86/../../bin/glnx86/../../bin/glnx86/../../bin/glnx86/libmwmathcore.so: undefined symbol: mxReallocEx

所以, Matlab的libmx.so被砍掉怎辦?

不知道^^

/usr滿了似乎不影響重裝Matlab

給未來的裕翔

因為libmx.so被我砍了

苦無良策, 於是重裝matlab

不過昨天yum其他東西時

好像因為/usr滿了而失敗

(似乎還有空間, 我猜是inode用完, 可是inode又不容易用完~)

本來很擔心matlab也會裝失敗的

結果平安無事^^

改天再來研究怎麼處理/usr滿了的問題

總是mex而不是m

給未來的裕翔

關於處理mex無法執行的問題

最後我決定逃避^^

在xxx.mexglx所在資料夾裡新建一個資料夾

把xxx.mexglx移過去

結果matlab顯示找不到

可是同名的m file明明也在當下的資料夾

重開matlab後

又發生mex無法執行的訊息, 而不是找不到

馬上把資料夾移到matlab路徑之外的地方, 像是家目錄

matlab又發生找不到的訊息

重開matlab後

產生新錯誤訊息了!可以確定找到同名的m file了

我個人結論:

關於matlab執行mex和m file的順序

我不知道怎麼改

不過預設是mex優先於m file

也許是MCALab的MCAPath的關係(或是maltab特性)

就是, 即使我在MCALab產生新資料夾

在重開matlab後也會被新增到path變數

而matlab執行function的順序似乎是先以mex找所有path

找不到再以m找所有path, 這可以解釋為什麼總是找到mex而非m file

把mex移到家目錄後, 開啟matlab執行function

會顯示找不到, 可是, 此時再把mex移回原來在matlab的位置後

依舊找不到

關於這點, 我覺得是因為在matlab開啟後

對所有在它path裡的function有做一個類似snapshot的東西

一開始沒有, 那就是沒有, 即使之後添加也當沒有

一開始有, 要用到就到所在位置執行, 突然找不到就秀錯誤訊息

以上

高興歸高興

已經確定就算成功執行m檔

還是有新的錯誤息……

vim快速取代

給未來的裕翔

剛拿到一份列表:

name1,email
name2,email2
名稱,電子郵件列表
name3,email3
name4,email4
名稱,電子郵件列表
……

應要求把它換成

email1,email2,email3,……

首先以gvim開啟

在command模式

輸入 :%s/名.*\n/

接著 :%s/.*,/,/

接著 :%s/\n/

最後手動把第一行一開始的逗號去掉

大功告成!

好有成就感^^

log server架設成功!

給未來的裕翔

雖然這沒什麼了不起

不過也夠我爽一陣子了^^

趁印象清晰時趕快寫筆記

本來 以為syslog和rsyslog的教學可以互通的

居然不行!

至少在log server不行!

很多syslog的教學說要在log server的

/etc/sysconfig/syslog裡面增加一個選項, -r

在此鄭重強調

對應到rsyslog的/etc/sysconfig/rsyslog裡, 什麼也不需要更動

只需要在/etc/rsyslog.conf裡面



#$ModLoad imudp.so
#$UDPServerRun 514

註解註解掉, 就可以當log server了^^

當然, 必須先重新啟動一下

service rsyslog restart

而在client端

也是修改/etc/rsyslog.conf

把log要存的位置

從檔案改成@log-server即可

client改完應該也要重新啟動吧

這我倒是沒注意

總之, 爽阿^^

ps: 設好之後, 馬上以logger “log server test”來測試一下

應該會在/var/log/messages裡出現吧