不知道是不是從ubuntu 8.04開始, 用普通使用者使用minicom都會出現
minicom: cannot open /dev/ttyS0: Permission denied
的錯誤。
ok, 我知道是權限不足,那麼要如何解決呢?
原來是必需要加入到uucp這一個群組才可以啊~
修改/etc/group
每一行的格式是這樣的
群組名稱:群組密碼:GID:此群組支援的帳號名稱
「在此群組支援的帳號名稱」加入你的帳號
若要某一個群組支援多個帳號,就必需以「,」做為區隔, 例:
root:x:0:root,dmtsai
root這一個群組支援root與dmtsai這兩個帳號
第一次在使用的時候,可以使用$ minicom -s
來設定相關的參數,通常只有改兩個地方
1. /dev/ttyS0
2. Bps/Par/Bits
然後, 之後就可以使用$ minicom
進入minicom的世界啦
若不想要中文介面的話,可以使用$ export LANG=C
改為英文介面
喔耶,意外發現,若想要只有在使用某一個應用程式時, 需要某一個環境變數,那麼要如何使用哩~$ LANG=C minicom
這樣就可以只有在執行minicom時,LANG的環境變數值會是C
當然,就可以直接修改$HOME/.bashrc加入
alias minicom='LANG=C minicom'
參考資料:
/etc/group 檔案結構
Minicom: Permission denied
2009年5月27日 星期三
minicom - 設定
2009年5月26日 星期二
linux指令 - screen
screen是一個對於常常透過putty或pietty連線到工作站的使用者非常有用。當你要多個視窗時,不需要執行多次的putty來達到你的要求,screen這一個指令便可以達到。但是,如果在X11的情況下,終端機分頁就非常好用啦~
轉錄資料:
使用 screen
在命令列下打 screen 就會進入 screen 的天地:
% screen
注意,所有 screen 的指令都是以 Ctrl 鍵加上 a 鍵開始的,在之後以 C-a 代表,C-a c 代表按住 Ctrl 鍵不放再按 a 鍵,然後放開按 c 鍵;而 C-a C-c 代表按住 Ctrl 鍵不放再按 a 鍵,然後放開後再按住 Ctrl 鍵不放按 c 鍵。
開啟,關閉,切換
C-a c 或 C-a C-c 開啟新的視窗,並同時切換到這個新的視窗
C-a n 或 C-a C-n 或 C-a (space) 切換到下一個視窗(0->1 1->2 …)
C-a p 或 C-a C-p 切換到上一個視窗(1->0 2->1 …)
C-a C-a 切換到上一個顯示過的視窗(不是照順序切換)
C-a 0 切換到第 0 個視窗
C-a (1..9) 切換到第 (1..9) 個視窗
C-a w 或 C-a C-w 會列出目前所開啟的視窗
0$ tcsh 1$ tcsh 2*$ tcsh 3$ tcsh
有星號 “*” 的表示目前顯示中的視窗,之後的 tcsh 代表這個視窗的 title ,預設是以開啟時的 shell 名稱
C-a K 關閉所有的視窗並退出 screen
C-a ‘ 或 C-a ” 會出現 “Switch to window:” 字樣,輸入號碼後就可切到該視窗
單一視窗使用中的指令
C-a C 清除目前的視窗內容
C-a d 或 C-a C-d 脫離(detach)目前的 screen ,並放到背景執行(不管開了幾個視窗),下面會再提到
C-a D D 強力脫離,除了放到背景執行外,並自動 logout
C-a C-g 虛擬嗶聲(visual bell)的切換,可以在畫面上顯示訊息代表一般的嗶聲
C-a H 紀錄目前視窗所有顯示過的東西(檔名為 screenlog.n n 為視窗號碼)
C-a i 或 C-a C-i 顯示目前視窗的資訊
(11,24)/(80,24)+1000 +(+)flow -ins -org +wrap +app -log -mon +r G0 [BBBB]
C-a l 或 C-a C-l 重繪視窗,如果有字顯示亂掉了可以用這個指令
C-a m 或 C-a C-m 或 C-a (enter) 可以顯示最近一次顯示過的訊息
C-a t 或 C-a C-t 顯示系統的時間及主機名稱還有負載
C-a v 顯示版本資訊
C-a x 或 C-a C-x 如果你要暫時離開目前位置又不想先 logout ,那可以用這個來鎖住 screen
C-a ? 線上求助畫面
複製/卷軸 模式
按下 C-a [ 就可以進入 複製/卷軸 模式(只有在目前視窗才算,其他視窗照常)基本上跟 vi 很像:
h, j, k, l 分別為向左,向下,向上,向右移動一格(或是一行)
0 移到該行最左邊
^ 與 $ 分別移到該行最左邊及最右邊的非空白字元
w 以字為單位往前移動並移到字首
b 以字為單位往後移動並移到字首
e 以字為單位往前移動並移到字尾
C-b 向上捲一頁
C-f 向下捲一頁
C-u 向上捲半頁
C-d 向下捲半頁
/ 與 ? 向下或向上尋找字串
(space) 第一次按下到第二次按下的區域會被複製到暫存區內
(ESC) 離開 複製/卷軸 模式
接著按下 C-a ] 便可以把剛剛存到暫存區內的內容複製出來。
善用 screen
前面提到當按了 C-a d 脫離了 screen 後,會回到沒有執行 screen 時的狀態,但是同時在之前 screen 裡每個視窗內在跑的 process (不管是前景或背景執行的)仍然繼續執行,即使 logout 也不會有影響。所以你可能接著離開身邊的電腦,然後跑出去喝個水,或者另外找個舒服的地方坐下來再接著剛剛的工作。
好,當你重新登入(login)之後,要怎麼接回剛剛的 screen 呢?重打 screen 只會讓電腦另外又開個 screen 給你,你所要做的事就是加些參數:
screen -ls 顯示目前個人所有的 screen
% screen -ls
There are screens on:
1188.ttyp4.SungSung (Attached)
76920.ttypq.SungSung (Detached)
2 Sockets in /tmp/screens/S-AlanSung.
上面的 Attached 表示你現在連接的 screen ,而 Detached 則表示沒有連接的,最後則是共有多少個 screen 數量
screen -r 就是重新回到(resume)screen 裡,如果你只有開一個 screen ,那只要簡單地打
% screen -r
就沒問題了,但是像上面那個,如果你有了兩個以上的 screen ,這樣就有問題了
% screen -r
There are several screens on:
1188.ttyp4.SungSung (Detached)
76920.ttypq.SungSung (Detached)
Type “screen [-d] -r [pid.]tty.host” to resume one of them.
如它的訊息所述,你可以加上它的 process id 或是使用的 tty 加上主機名來決定要接回那一個 screen 。假設在這裡我們要接回 process id 為 1188 的那一個,就打
% screen -r 1188
或
% screen -r ttyp4
或
% screen -r ttyp4.SungSung
或
% screen -r 1188.ttyp4.SungSung
都可以
screen -d 假設現在自己的電腦突然當機,或是網路突然斷了一時連不上去,等到好了之後,想要接回來原來的 screen 卻發現
% screen -r
There is a screen on:
1188.ttyp4.SungSung (Attached)
There is no screen to be resumed.
這時候 -d 這個參數就派上用場了,讓你可以控制某個 screen 脫離(detach),接著再加上 -r 把這個 screen 接手回來
% screen -d
[1188.ttyp4.SungSung detached.]
% screen -r
或直接
% screen -d -r
screen -wipe
有時候不小心跳電了,這時候重開機後當然也不會有 screen 留著,但是由於 screen 會有紀錄所有的 screen ,因為雖然舊的沒有了,可是還是有紀錄在,因此這個指令就是把廢棄不用的 screen 給”擦拭乾淨”(wipe)
There are screens on:
69103.ttyp5.SungSung (Removed)
529.ttyp0.SungSung (Detached)
1 socket wiped out.
1 Socket in /tmp/screens/S-AlanSung.
會用了上面所介紹的功能,你可以現在進入 bbs ,進入聊天室跟人聊天或是在上面發表文章到一半,發現計中要關門了,你可以從容的 detach ,回家之後再連回來 attach ,繼續剛剛的話題或發表文章,而對方可能根本沒發覺。只要你連線的主機不當機,那電話線或網路再怎麼不穏都不必怕斷線。
如果你需要更多詳細的資料,可以善用線上手冊(manual pages)或是 info 這個指令
% man screen
% info screen
Ctrl-a S 就可以 split,
Ctrl-a tab 就可以切到下面的視窗,
Ctrl-a Ctrl-a 下面的視窗就可以到處切換,
Ctrl-a Q 就將分割的視窗關掉
[2014.04.28 補充]
在建立screen時,
替這一個screen建立一個名為BuildCode的screen
% screen -S BuildCode
設定快速鍵
$HOME/.screenrc
# Start message
startup_message off
# Set hardstatus always on
hardstatus alwayslastline " %-Lw%{= Bw}%n%f %t%{-}%+Lw %=| %M %d %0c:%s "
# Set default encoding using utf8
defutf8 on
# Refresh the display when exiting programs
altscreen on
# Dynamic title
shelltitle '$ |bash'
# Disable vbell
vbell off
# Keboard binding
# bind F1 to move to next window
bindkey -k k1 next
# bind F2 to create a new screen
bindkey -k k2 screen
# bind F3 to rename current screen window
bindkey -k k3 title
# bind F4 to kill current screen window
bindkey -k k4 kill
# bind F5 to detach screen session (to background)
bindkey -k k5 detach
[2014.05.26 補充]
原本screen只能讓一個user連到這一個session,
也就是說,
若由家裡連到某一個session,
則公司原本連到這一個session就會被踢掉。
但是,事實上,screen其實可以允許多個user連到某一個session,
只要後面連到seesion的加入-x的參數即可,
而這兩個畫面會同步,
非常有趣
刪除指定的screen section
% screen -X -S [session # you want to kill] kill
參考資料:
Introduction to screen
screen 教學
unix 上 screen 指令用法
Set screen names with GNU screen [closed]
使用 Screen 指令操控 UNIX/Linux 終端機的教學與範例
screen教學(linux終端機有多個分頁)
[Linux] screen教學與bindkey設定用法
進化版 screen - tmux
2009年5月25日 星期一
如何使用Sctp的partial reliability
因為要寫一個handover的網路電話,所以必需要知道目前使用的線路可能快要有問題了, 必需要切換線路,其中一個方式就是使用SCTP_SEND_FAILED的這一個事件。
SCTP_SEND_FAILED的介紹
When a message can't be delivered to a peer, the message is sent back to the user through this notification.
This notification is usually soon followed by an association failure notification.
基本上會出現SCTP_SEND_FAILED只有以下兩個情況
1. In most cases, the only way a message will not be delivered is if the association has failed.
只有當目前的這一個association才會顯示SCTP_SEND_FAILED
2. The only time a message failure will occur without an association failure is when the partial reliability extension of SCTP is being used
當有使用partial reliability時,若沒有在限定的時間(TTL[time to live])內送出去的話, 也會觸發SCTP_SEND_FAILED的事件
研究了好久, 總算知道如何使用partial reliability啦~
這裡使用的是one-to-one 的sctp, 也就是tcp style 的sctp,
one-to-many是不是也是一樣的設定方式,目前還不知道
這裡我們把它分為sender端與receiver端
sender端:
1. 在accept後, 要設定由accept回傳的connfd為SCTP_NODELAY, 因為若沒有設定SCTP_NODELAY的話,那麼程式會等收集到一定的量才送出資料,這個時候就會超過TTL的時間才送出去, 就會觸發SCTP_SEND_FAILED的事件啦, 以下的程式片斷struct sockaddr_in sd;
int connfd;
int flag=1;
socklen_t sdlen = sizeof(sd);
sockfd = ::socket(AF_INET,SOCK_STREAM,IPPROTO_SCTP);
sctp_sa.sin_family = AF_INET;
sctp_sa.sin_port = htons(1234);
sctp_sa.sin_addr.s_addr = htons("127.0.0.1");
connfd = ::accept(sockfd,(struct sockaddr *) &sd, (socklen_t *)&sdlen);
setsockopt(connfd,IPPROTO_SCTP,SCTP_NODELAY,&flag,sizeof(flag));
2. 在sctp_sendmsg的ttl欄位要加入你要設定的時間, 若是0的話, 則表示沒有限制ssize_t sctp_sendmsg(int sockfd,const void *msg,size_t msgsz, const struct sockaddr *to,socklen_t tolen,uint32_t ppid, uint32_t flags,uint16_t stream, uint32_t timetolive,uint32_t context);
這裡另外提到,在one-to-one的情況下若to是NULL的話,則會送到目前這一個association的primary address,當to是NULL的話,tolen必需要設定為0
receiver端也有兩點要注意:
1. 要設定要監控sctp_send_failure_eventstruct sctp_event_subscribe event;
event.sctp_send_failure_event = 1;
setsockopt(connfd,IPPROTO_SCTP,SCTP_EVENTS,&event,sizeof(event));
2. 由接收到的資料來判斷是否為sctp_send_failure_event事件, 以下是以one-to-one來當作例子
char inputBuffer[1024];
struct sockaddr_in peer,
int msg_flags;
struct sctp_sndrcvinfo sndrcvinfo;
socklen_t peerlen = sizeof(peer);
::sctp_recvmsg(connfd,inputBuffer,sizeof(inputBuffer),(struct sockaddr *) &peer,&peerlen,&sndrcvinfo,&msg_flag);
if (msg_flag & MSG_NOTIFICATION) // 判斷是否為事件, 若成立表示為事件
{
union sctp_notification *snp = (union sctp_notification *) inputBuffer;
switch (snp->sn_header.sn_type)
{
case SCTP_SEND_FAILED:
printf("SCTP_SEND_FAILED\n");
break;
default:
printf("unknow notification\n");
}
}以上就可以判斷是否有Sendfail的事件啦
2009年5月22日 星期五
手機身份証
今天約學弟一起去吃冰,沒有想到學弟的手機不見了,這個時候跟他們討論起手機身份証。
*#06#
在手機上按下以上的按扭就會出現這一支手機獨有的號碼。
以下是轉錄的資料
手機有「身份證字號」這則謠言在網路流傳已久,關於電信警察究竟會不會依此號碼幫人找回手機也一直有爭議,有人說會,有人說不會--其實,這兩個答案都不對,以下是我們的調查。
在網路上流傳的這則電子郵件說,只要在手機上輸入「*#06#」就能看到手機的身份證字號,這點並沒有錯,這個號碼是手機本身的IMEI序號,每隻手機都是獨一無二的。不過接下來的部分就有待商榷了。
首先是向電信警察局報案。據我們向電信警察隊查詢,他們表示,手機的遺失可以分為失竊與遺失兩種,前者可向警察局報案,至於後者,電信警察隊則做了個有趣的比方:「就像你掉了五百、一千元。」
電信警察隊表示,「理論」上,是可以透過IMEI號碼追查遺失手機。不過,「實際」上卻有很大的困難,最主要的問題還是在經費上。舉例來說,假設今天有人掉了一支手機,為了追查訊號,必須調閱六家電信業者的通聯紀錄,以一天一家120元來計算,光一支手機一天就要花720元的調查經費,如果運氣不好,撿到的人遲遲不使用,一連查個五天,差不多就可以買支新手機了。
不過,要說報案無用,那也不全對。假設你的手機不是失竊,而是被好心人撿到,你又剛好有在警察局備案,那麼,警察就可以根據你留下的IMEI號碼通知你來領回。
至於7日發表的「30分鐘快速維修手機 竟成銷贓最佳管道」一案,為什麼電信警察隊又主動偵辦了呢?
電信警察隊表示,上述案件應該視為「個案」。民眾來報案,他們當然都會受理,不過電信警察最主要的任務並不是找手機,除非是上級指示配合重大案件辦案,否則,一般民眾手機遺失,即使到電信警察隊報案,要找回來,也要看「天時、地利、人和」...簡單的說,就是「看情況」。
參考資料:
[資訊]手機身份證
2009年5月21日 星期四
RGB ,YUV, YCbCr的定義
YUV
視頻編解碼器功能
視頻編碼器要求YUV4:2:0格式的視頻輸入,因此可能根據應用需要進行視頻輸入的預處理,即對YUV4:2:2隔行掃瞄(例如從攝像機)到YUV 4:2:0非隔行掃瞄轉換,僅抽取但不過濾UV分。對視頻解碼器而言,還需要進行後處理,以將解碼的YUV 4:2:0數據轉換為RGB進行顯示,包括:YUV 4:2:0到RGB轉換;16位或12位RGB顯示格式;0到90度旋轉,實現橫向或縱向顯示。此外,視頻編解碼器通常還要求具有以下功能和特性:
支持MPEG-4簡單類 0、1 與 2 級;
兼容H.263與 MPEG-4 編解碼標準;
MPEG-4視頻解碼器支持的可選項有:AC/DC預測、可逆可變長度編碼(RVLC)、再同步標誌(RM)、數據分割(DP)、錯誤隱藏專利技術、支持每個宏塊4個運動矢量(4MV)、自由運動補償、解碼VOS層;
MPEG-4視頻編碼器選項有:RVLC、RM、DP、支持每個宏塊4個運動矢量(4MV)、報頭擴展碼、支持編碼期間碼率改變、支持編碼期間編碼幀率改變、插入或不插入可視對象序列起始碼;
支持編碼期間序列中插入I幀;
支持編碼器自適應幀內刷新(AIR);
支持多編解碼器,可用相同代碼運行多個編解碼器實例。
RGB
紅綠藍(RGB)是計算機顯示的基色,RGB565支持的色深可編程至高達每像素16位,即 RGB565(紅色5位,綠色6位,藍色5位)。
YCbCr
在DVD、攝像機、數字電視等消費類視頻產品中,常用的色彩編碼方案是YCbCr,其中Y是指亮度份量,Cb指藍色色度份量,而Cr指紅色色度份量。人的肉眼對視頻的Y份量更敏感,因此在通過對色度份量進行子採樣來減少色度份量後,肉眼將察覺不到的圖像質量的變化。主要的子採樣格式有YCbCr 4:2:0、YCbCr 4:2:2 和 YCbCr 4:4:4。
4:2:0表示每4個像素有4個亮度份量,2個色度份量(YYYYCbCr),僅採樣奇數掃瞄線,是便攜式視頻設備(MPEG-4)以及電視會議 (H.263)最常用格式;4:2:2表示每4個像素有4個亮度份量,4個色度份量(YYYYCbCrCbCr),是DVD、數字電視、HDTV 以及其它消費類視頻設備的最常用格式;4:4:4表示全像素點陣(YYYYCbCrCbCrCbCrCbCr),用於高質量視頻應用、演播室以及專業視頻產品。
轉換的公式
第一個公式是YUV轉換RGB(範圍0-255)時用的,第二個公式是用在YUV(601)也成為YCbCr轉換RGB(範圍0-255)時用的。
1.
Y = 0.299R + 0.587G + 0.114B
U = -0.147R - 0.289G + 0.436B
V = 0.615R - 0.515G - 0.100B
R = Y + 1.14V
G = Y - 0.39U - 0.58V
B = Y + 2.03U
2.
B= 1.164 * (Y - 16) + 2.018 * (U - 128)
G= 1.164 * (Y - 16) - 0.38 * (U - 128) - 0.813 * (V - 128)
R= 1.164 * (Y - 16) + 1.159 * (V - 128)
參考資料:
RGB ,YUV, YCbCr的定義
RGB ,YUV, YCbCr的轉換
2009年5月19日 星期二
如何使用Qt designer
耶,目前還是主要以Qt3在寫程式,所以,先用Qt3的designer來說明吧~
在開發Qt視窗程式時,我們可以使用Qt Designer的所視即所得環境,協助我們進行視窗外觀的設計,並透過指令產生對應的*.h與*.cpp檔案,這邊介紹Qt Designer的一些簡單的使用方法。
首先開啟Qt Designer,執行選單中的[File/New]指令(或按Ctrl+N)新增要使用的視窗類型,如下圖所示:
接下來的畫面與Visual Basic很像,我們在左邊的Toolbox選擇元件,在中間的表單區域以拖拉的方式配置元件,在右邊的Property Editor設定相關屬性,假設我們的元件如下配置:
接下來我們進行簡單的Signals - Slots連結,執行選單中的[Tools/Connect Signal/Slots]指令(或按F3),然後選擇發出Signal的元件,接著會出現以下視窗,在這邊我們簡單的設定按下按鈕後關閉視窗:
您可以執行選單中的[Preview/Preview Form]指令(或按Crtl+T)來預覽配置成果,接下來我們執行[File/Save]指令(或按Ctrl+S),將之儲存為form1.ui檔,這個檔案一堆描述元件屬性的標籤所組成,我們可以使用下面的指令來產生*.h檔:$ uic -o form1.h form1.ui
然後我們使用下面的指令產生*.cpp檔:$ uic -i form1.h -o form1.cpp form1.ui
您可以直接開啟這兩個檔案來看看它們的內容,並根據實際需求再作些修改,下面是我們產生的*.h檔內容:
/****************************************************************************
** Form interface generated from reading ui file 'form1.ui'
**
** Created: 二 5月 19 21:37:24 2009
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/
#ifndef FORM1_H
#define FORM1_H
#include <qvariant.h>
#include <qdialog.h>
class QVBoxLayout;
class QHBoxLayout;
class QGridLayout;
class QSpacerItem;
class QLabel;
class QPushButton;
class Form1 : public QDialog
{
Q_OBJECT
public:
Form1( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
~Form1();
QLabel* textLabel1;
QPushButton* pushButton1;
protected:
protected slots:
virtual void languageChange();
};
#endif // FORM1_H下面是產生的*.cpp內容:
/****************************************************************************
** Form implementation generated from reading ui file 'form1.ui'
**
** Created: 二 5月 19 21:38:40 2009
**
** WARNING! All changes made in this file will be lost!
****************************************************************************/
#include "form1.h"
#include <qvariant.h>
#include <qlabel.h>
#include <qpushbutton.h>
#include <qlayout.h>
#include <qtooltip.h>
#include <qwhatsthis.h>
/*
* Constructs a Form1 as a child of 'parent', with the
* name 'name' and widget flags set to 'f'.
*
* The dialog will by default be modeless, unless you set 'modal' to
* TRUE to construct a modal dialog.
*/
Form1::Form1( QWidget* parent, const char* name, bool modal, WFlags fl )
: QDialog( parent, name, modal, fl )
{
if ( !name )
setName( "Form1" );
textLabel1 = new QLabel( this, "textLabel1" );
textLabel1->setGeometry( QRect( 210, 30, 150, 65 ) );
pushButton1 = new QPushButton( this, "pushButton1" );
pushButton1->setGeometry( QRect( 250, 140, 82, 27 ) );
languageChange();
resize( QSize(582, 307).expandedTo(minimumSizeHint()) );
clearWState( WState_Polished );
// signals and slots connections
connect( pushButton1, SIGNAL( clicked() ), this, SLOT( close() ) );
}
/*
* Destroys the object and frees any allocated resources
*/
Form1::~Form1()
{
// no need to delete child widgets, Qt does it all for us
}
/*
* Sets the strings of the subwidgets using the current
* language.
*/
void Form1::languageChange()
{
setCaption( tr( "Form1" ) );
textLabel1->setText( tr( "<h1>Qt Designer</h1>" ) );
pushButton1->setText( tr( "Click me" ) );
}我們使用下面這個main.cpp程式來測試成果:
#include "form1.h"
#include <qapplication.h>
int main(int argc, char **argv) {
QApplication app(argc, argv);
Form1 *fm = new Form1();
app.setMainWidget(fm);
fm->show();
return app.exec();
}$ qmake-qt3 -project$ qmake-qt3$ make
參考資料:
使用Qt Designer設計視窗