2008年12月11日

[Java] 運用Eclipse與JDBC連接MySQL資料庫

用Eclipse寫Java程式,目前一切很正常

今天需要連接到MySQL,所以就小試了一下,程式碼如下

import java.sql.*;
public class dbconn {
public static void main(String[] args) {
String driver = "com.mysql.jdbc.Driver";
String url = "jdbc:mysql://ipaddress:3306/dbname";
String user = "taiwanwolf";
String password = "mypassword";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url,user,password);
if (conn != null && !conn.isClosed()) {
System.out.println("test ok");
conn.close();
}
else {
System.out.println("fail");
}
}
catch (ClassNotFoundException e) {
System.out.println("can not found driver class");
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}

}

---我是分隔線---

上面看起來很正常吧,結果按CTRL+F11,居然出現class not found的錯誤

想必是找不到JDBC的Class,google一下找到mysql 的JDBC Driver

下載點

點選Project -> properties
Java Build Path => Libraries -> Add External JARs
再選上面壓縮檔解開的Jar => mysql-connector-java-5.1.7-bin.jar

全部弄好之後居然出現另一個錯誤訊息
not allowed to connect to this MySQL serverConnection closed by foreign host

把 firewall 抽掉也不行,google了一下發現是MySQL預設是只接受localhost的連線

所以必須新增User並且指定可連線的IP,先用console登入, 然後用 grant 新增

一般新增語法
GRANT ALL ON *.* TO 'username'@'localhost' IDENTIFIED BY 'password' WITH GRANT OPTION;

我是採用這個
grant SELECT,INSERT,UPDATE,DELETE,CREATE,DROP on dbname.* TO 'taiwanwolf'@'123.111.222.%' identified by 'mypass';

FLUSH PRIVILEGES;

再試一次,搞定!

P.S1: 上述的123.111.222.%是表示只允許此段IP網段連入

P.S 2: iptables 裡面開啟3306可被連線的語法為
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

2008年12月5日

如何將Wireshark擷取的封包內的G.729還原?

目前網路電話由於頻寬問題,多半採用G.729當作Codec,而此codec目前並非是open source的授權,所以處理起來較為麻煩,以下為codec還原的方式

前置準備
先下載 open G.729 的 decoder
Windows 下可使用 Goldwave
Linux 下可使用 Perl 的Script

整個轉檔流程大概需經過以下的手續:
Wireshark(raw) -> open G.729 decoder (pcm) -> Goldwave (wav) or perl script (au) -> 播放器


步驟1. Wireshark(raw)

選單 Statistics -> RTP -> Show All Streams, 進入後會找出總共有多少RTP Stream

















RTP封包解開通常會長成這個樣子
-- 2個主叫端的聲音
-- 1個被叫端的聲音

第一個主叫端為接通前的聲音,通常是響鈴或來電答鈴音樂
第二個為被叫端的聲音,也就是接通回應
第三個為主叫端的聲音,也是接通開始說話

選擇要還原的RTP再按 Analyze ,通常是依序一個一個解








接下來的畫面選擇 Save Payload....
再下個畫面
Format 選 .raw
Channel 選 forward
再命名為 filename.raw




















步驟2. open G.729 decoder (pcm)
此時再借助這個opensource的小程式,將raw檔轉成pcm格式
將G729.zip解開,進入Dos模式執行裡面的程式如下:
va_g729_decoder.exe 來源.raw 目的.pcm


步驟3.1 Goldwave (wav), Windows適用
將轉好的pcm檔用Goldwave打開,並選擇下面的格式,打開後即可直接播放或轉成wav檔













步驟3.2 Perl script (au) , Linux適用

請將以下的Perl script存檔,檔名為 pcm2au.pl
--------我是分隔線--------
#
# USAGE: perl pcm2au.pl inputFile outputFile


$usage = "Usage: 'perl $0 ' ";

$srcFile = shift @ARGV || die $usage;
$dstFile = shift @ARGV || die $usage;

open(SRCFILE, "$srcFile") || die "Unable to open file: $!\n";
binmode SRCFILE;

open(DSTFILE, "> $dstFile") || die "Unable to open file: $!\n";
binmode DSTFILE;

###################################
# Write the AU header
###################################

print DSTFILE ".snd";

$foo = pack("CCCC", 0,0,0,24);
print DSTFILE $foo;

$foo = pack("CCCC", 0xff,0xff,0xff,0xff);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0,3);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0x1f,0x40);
print DSTFILE $foo;

$foo = pack("CCCC", 0,0,0,1);
print DSTFILE $foo;

#############################
# swap the PCM samples
#############################

while (read(SRCFILE, $inWord, 2) == 2) {

@bytes = unpack('CC', $inWord);
$outWord = pack('CC', $bytes[1], $bytes[0]);
print DSTFILE $outWord;
}

close(DSTFILE);
close(SRCFILE);

--------我是分隔線--------
然後再執行 perl pcm2au.pl 來源.pcm 目的.au
就可產生 au 檔了

PS1. G.711的話,Wireshark可以直接分析之後轉存為 au 檔,就可以直接播放了。
PS2. 參考資料: http://wiki.wireshark.org/HowToDecodeG729

2008年12月4日

[程式] Perl 寄信給gmail的方法 (以網站復原為例)

如果監控的網站斷線恢復了,怎麼發個mail通知呢? 用Perl的做法如下

發信程式前面加上收件者, 這邊是寄給 qqq 跟 abc
chomp($theman="qqq\@gmail.com,abc\@gmail.com");
.
.
.

監控部份省略

.
.
.

需要發信的地方加上, 呼叫mailgood副程式
&mailgood($theman);

.
.
.


寄信的副程式
sub mailgood {
$subject = encode("big5",decode("utf8","網站狀態 - $ip 復原"));
$nowtime = `date +%Y\/%m\/%d-%H:%M:%S`;
$mailcontent = encode("big5",decode("utf8","復原時間 $nowtime"));
$to=shift;
# sendmail program location
my $mailprg = "/usr/sbin/sendmail -t";
# sender Email
my $from = "taiwanwolf\@abc.com";
open (MAIL,"|$mailprg") || die "$!\n";
print MAIL "Content-Type: text/plain; charset=big5\n";
print MAIL "Return-Path: $from\n";
print MAIL "From: $from\n";
print MAIL "To: $to\n";
print MAIL "Subject: $subject\n";
print MAIL "\n";
print MAIL "$mailcontent \n";
}

2008年11月25日

OpenSSH 密碼錯誤無法登入

最近同事當作維護跳板的電腦,因故改了我的使用者帳號狀態(停用再啟用)以及密碼更改,結果我怎麼樣都登不進去,查了一下發現是ssh帳號跟Windows使用者帳號沒有同步,所以 WindowsXP 更改使用者狀態及密碼之後,需要執行以下步驟,才能讓OpenSSH的帳號資料同步:

cd C:\Program Files\OpenSSH\bin
mkgroup -l > ..\etc\group
mkpasswd -l > ..\etc\passwd

這樣再重新用PuTTY試試看,應該就可以登入了

如果你的WindowsXP是SP2以後的,記得firewall要開TCP的22 port

Reference
openssh 下載點
OpsnSSH 設定參考

2008年11月14日

請插入磁片 : Microsoft office2003......

最近公司改用outlook2003 來收信,由於先前並沒有安裝outlook,所以就把光碟片拿出來新增,結果跑到一半出現 "請插入磁片 : Microsoft office2003...... ",意思是說把光碟片放在來源目錄之類,但是我已經把光碟片放進去了,還是出現這個訊息,後來想整個把Office移除在全部重裝好了(微軟系列的大絕 XD ),但還是出現一樣的訊息 (怒) ~
後來到處爬文找到ㄧ個雲林僑真國小的網頁,意思也是有老師反應Office的錯誤訊息不能修復之類,資訊組建議去下載Windows Installer Cleanup,抱著姑且一試的心理,用Windows Installer Cleanup把Office先全部移除,不過他移除的似乎是對檔案保護的ACL跟一些關聯而已,實際的檔案還在,之後再跑Office安裝程式重新安裝,結果除了原本沒裝的Outlook沒裝以外,其他的都還在,不需要再重新安裝其他程式,接著就進行outlook安裝,奇蹟發生了,居然通過了,不再出現很靠腰的"請插入磁片..."的訊息,安裝完後,測試其他的程式也都正常,在此不得不佩服小學裡面有許多臥虎藏龍的老師~~

2008年11月13日

移除hyperphp的免費架站服務的廣告

最近看了軟體玩家的介紹,去申請了hyperphp的免費hosting的服務,用起來還不錯,但現在卻多了討厭的廣告,所以看了一下網頁的 source code,是用iframe加上去的,所以呢 我們就在CSS樣式表加上一行試試看

iframe {display:none;!important}

測試一下 , 搞定!

2008年11月10日

[手機仔] SE G900 好用軟體介紹

最近換了 Sony Ericsson 的G900手機,手機本身是採用 Symbian UIQ3.0 作業系統,所以有觸控功能,整體來說還蠻不錯的,提供一些UIQ的軟體給各位補一補

[螢幕保護兼大時鐘]
IPHONE LOCK
網址:http://iphonelock.kwull.com/download.html

[桌面軟體]
GDESK
網址:http://gdesk.wetpaint.com/

[來電警衛]
MCleaner
網址:http://www.mcleaner.com/

這幾個裝一裝, 應該會讓你的Smartphone威力更強大喔!

[突破辦公室網路] ssh tunnel + Firefox Foxy Proxy

最近很多同事轉換跑道,到了新公司後,頻頻抱怨上個網都被擋 (ISP公司還檔上網感覺蠻好笑的)
於是想了用SSH Tunnel的方式來解
前置需求:
1.需要自己有一台有裝SSH服務的主機在Internet, 至於OS不限 (Linux當然最好,Windows也沒關係,加裝 OpenSSH就可了)
2.公司需要有一個可以連到外面的那台主機的, 請自己嘗試, 如果SSH預設的22 port被公司檔了, 就把SSH Server Listen 的Port改掉就好了
3.由於個人使用的多是微軟作業系統,所以以下的情境是用WindowsXP配合Putty的DOS版工具plink

目前我想到的有兩種應用方式:
A. 全部透過SSH Server來上Internet (適用於瀏覽器, MSN等可設定socks proxy的應用)
在Dos 視窗下輸入
plink -ssh -D 9005 -pw 密碼 -N taiwanwolf@ssh_server_ip
(-D 是指定Port forward用的Port, -pw 就是ssh登入的密碼, -N 就是不要帶出shell, 如此就可以做成 bat 檔來直接執行)
接下來設定Client
IE:[工具] -> [網際網路選項] -> [連線] -> [區域網路設定] -> Proxy伺服器打勾 -> [進階] ->
Socks 設定為 localhost , 連接埠設定為 9005
Windows Live Messenger: [工具] -> [選項] -> 連線 -> 進階設定 -> Socks 設定為 localhost : 9005 然後點選測試應該就可連線
Firefox (推薦) : 安裝FoxyProxy的Addons,按照下列圖解設定






































上面的 9005 是自訂的Port , 自己找一個本機沒在使用的Port就可以, 而taiwanwolf為在該SSH Server可登入的帳號名稱,這樣輸入並登入成功後,所有經過瀏覽器的動作, 都會往本機的9005 Port送,再被PortForward透過SSH Tunnel從SSH server出去了, 在網管端只會看到你與SSH Server有一個22 Port的連線

B. 連到某台機器 (適用telnet等無法設定proxy的應用, Port要對應)
在Dos 視窗下輸入 plink -ssh -L 9005:要連線的IP:23 taiwanwolf@ssh_server_ip
登入成功後, localhost 的9005 Port 就對應到 "要連線的IP"的23 Port, 所以此時可下 telnet localhost 9005 , 這樣就直接透過 SSH Server 的 IP 連到要連線的IP了, 這個可運用在某台要連線的設備只允許某些管理IP進去的情境

C. 新增 Linux 版本

ssh -N -f -L 9100:dest_server:21 taiwanwolf@middle_server

-N 參數的用途是"不建立shell"

-f 參數的用途是"連線後執行於背景"

-L 把本機的9100透過 midserver 導到 dest_server 的 21

如果要把ssh tunnel連線中斷, 可以下 ps aux | grep 9100 找出 PID, 再去 kill -9 PID 把 Process砍掉, 就可以了~

P.S 如果只有開 local 的80 port 可以出去, 那就要把外面的 ssh server 的 listen 改為 80 port
先把 ssh server 的 /etc/ssh/sshd_config 加上一行 Port 80, 然後 AllowUsers 如果沒有的話要加上欲登入者的ID, 然後在用戶端要多下 plink -P 80 再接續原先的解法

參考網站 : http://ppc52776.blogspot.com/2007/11/ssh-tunnel-firewall.html

2008年10月20日

SSH免密碼登入

需求: PC1的 voip帳號要免密碼登入Server1的 voip2

在PC1 (放Private key)
su-
su - voip
ssh-keygen -t rsa
scp .ssh/id_rsa.pub voip2@server1_ip:/home/voip2
p.s scp若不能登入要去改 PC1 /home/voip/.ssh/known_hosts 刪掉舊紀錄


在server1 (放Public key)
su-
su - voip2
cat id_rsa.pub >> .ssh/authorized_keys <- 這是voip2目錄下的
chmod 700 .ssh/ <- 不然會無法執行
chmod 600 .ssh/authorized_keys <- 不然會無法執行
rm id_rsa.pub

回到 PC1 驗證

ssh -l voip2 server1的IP

恭喜你已經免密碼登入了

2008年10月14日

Reload Service

今天有同事換辦公室之後,也換了網段,一直說連不上某台機器,奇怪 Firewall也開了,怎會不行呢? 原來是 sshd_config 裡面的 AllowHosts 忘了加上新辦公室的網段,加上去之後要 restart sshd,但是用service sshd restart 不行, 所以就用 kill -HUP sshd PID, 就搞定了!

PS. 如果有多個PID也可以一次重啟 kill -HUP PID1; kill -HUP PID2; kill -HUP PID3

2008年10月13日

[SSH] Local: Bad packet length 1349676916.

這幾天在作硬碟備份,所以需要開一些firewall與CISCO的ACL,但是在開完之後用SSH到File Server卻回應 Local: Bad packet length 1349676916.的訊息,無法連線

此時解決方法為,可在 server端 操作下列步驟

step1
cat /etc/ssh/sshd_config | grep Protocol
#Protocol 2,1
Protocol 2

step2
vim /etc/ssh/sshd_config 改為可支援 ssh v1及 v2
Protocol 2,1
#Protocol 2

step3
改為再下reload指令 service sshd restart

應該就可以正常連線了

原始出處 : http://ubuntuforums.org/archive/index.php/t-6928.html

2008年8月20日

如何使用別人的IP上網?

用途 : 陷害別人 XD, 某台Server只能用某個IP登入, 隱藏身份等...

前置作業:
1. 需有一台可SSH登入的主機, 可用Linux 或在Windows上安裝OpenSSH
2. 需有安裝 PuTTY

作法:

1. 開啟Putty -> SSH -> Tunnels , 在右邊窗格, Source Port 輸入 20000
Destination 的選項點選 Dynamic, 然後按下 [Add], 結果會如下圖所示

















這個意思就是說你在本機電腦上, 連20000 Port會被導向到你連上的SSH Server, 從該台 SSH Server的IP往外連

2. 回到 Session 窗格設好 SSH Server的資訊, 搭配第一步弄好的設定連上 SSH Server, 即可將Putty視窗縮小

3. 例如使用IE -> 工具 -> 網際網路選項 -> 連線 -> 區域網路設定 -> Proxy 伺服器 打勾 -> 點選進階 -> 在 Socks 那邊輸入 localhost , 連接埠填 20000 -> 確定

這樣就可以去類似 whereismyip 的網站, 你就會發現你的IE連線的IP已改成 SSH Server的IP了!

2008年8月19日

懶人自動化系列1 - 如何計算某件事情的處理時間

因為工作上的需求,需要有效管理,而有效管理就是需要一些量化的數據來佐證,明明沒什麼好分析的,但還是硬要分析個東西出來,而且還要比較來,比較去看個趨勢之類,為了要有更多的時間,所以只能想辦法來讓電腦來代勞了

故需求是 "計算一個月內每件派案的處理時間(註1)"

而那些數據並不是乖乖的存成文字檔或放在DB等你去撈,而是在一個ASP網頁的查詢系統上
,你只能連到那個網頁去查詢你自己曾經處理過的過程,所以這個部分我是用 curl 的方式模擬POST,把全部的先抓回來,再去parser檔案撈出想要的資訊,再存檔,此部份有時間再來詳述

先開始吧

執行環境:CentOS v5.0
程式語言:Perl

前置作業
需先確認 cpan 可用

1. 切換為 root, 在命令列打 cpan
2. 輸入 install Date::Manip, 接下來就是一段漫長的安裝過程
3. 寫程式

首先需初始化你的假期與上班時間
use Date::Manip;

Date_Init('PersonalCnf=holiday.cfg',
'WorkWeekBeg=1',
'WorkWeekEnd=5',
'WorkDayBeg=08:30',
'WorkDayEnd=18:00');

而 holiday.cfg 為自己建的一個假日檔,你可以放今年的國定假日在裡面,內容如下

*Holiday
1/1 = New Year's Day
10/10 = Nation's Birth Day
#fourth Thu in Nov = Thanksgiving

其餘參數說明
WorkWeekBeg=1' # 每週上班的第一天是星期一
'WorkWeekEnd=5' # 每週上班的最後天是星期五
'WorkDayBeg=08:30' # 每天上班的時間是 8:30
'WorkDayEnd=18:00' # 每天下班的時間是 18:00

重點 => 開始計算經過時間,程式如下

$d1 = "2008/06/03 11:00";
$d2 = "2008/06/05 12:30";
$d = DateCalc($d1,$d2,\$err,2);

#計算總共經過多久時間(不含下班時間), 重點在於那個紅字的 2 表示切換為 Business Mode, 只計算上班時間,所以在 2008/06/03 的18:00~2008/06/04的08:30之前的時間是不會被計算的~
以上為範例,我自己的作法是用 open FILE, "< $ARGV[0]"; 讀入整理好一個月的檔案資料,再進程式來算,以往可能需花1個小時人工計算的工作,現在約10秒內就可解決了!

註1 : 派案時間為客服人員接到客戶的來電問題,經過分類之後轉派給後端人員的程序,從開始到處理完畢的時間為派案處理時間

如何讓 Apache 的 access log能夠自動rotate

根據許多前人的經驗, 發現 Apache 內建的 Rotatelogs.exe 雖然可以做到 rotate , 但是其分割是以啟動httpd的時候起算,也就是說你在8/19 的15:00開始啟動 apache, 你的access.log並不會在8/20就被closed, 而是在 8/20 的15:00, 這樣的話對於系統管理者來說,就喪失了分日期管理的意義 (還要自己去parse內容),所以使用 mod_log_rotate 模組是比較理想的方式, 使用方式如下

前置作業
1.請看目前自己的Apache版本為何, 可用 httpd -v 或 apachectl status來查看
2.下載相對應版本的 mod_log_rotate.so , 可至此網站下載

正式開始
1. 修改 httpd.conf, 用以載入模組:
LoadModule log_rotate_module modules/mod_log_rotate.so
CustomLog /logs/access_%Y%m%d.log common
RotateLogs On
RotateLogsLocalTime On

2. 重啟 apache
使用 service httpd restart 或 apachectl restart 或若使用xampp, wamp 之類可用選單重啟

如此就可以用天為單位,分割 access.log 了

cygwin 使用 crontab

1. 先跑setup.exe, 安裝cron服務
2. cygrunsrv -I cron -p /usr/sbin/cron -a -D
3. 控制台 -> 系統管理工具 -> 服務 , 把 cron 起動起來
4. cron-config
5. 新增使用者 cyg_server


檢查
ps -ef | grep cron

Linux 下的bt工具

使用 screen + rtorrent, 從此在 Linux 下就可以邊bt邊工作了~