星期五, 11月 05, 2010

利用 vb.net 偵測全域的滑鼠及鍵盤動作

使用windowshooklib

http://www.vbforums.com/showthread.php?t=436321


http://www.code2point.com/Project.aspx?proj=4

使用方法就是下載其 WindowsHookLib.dll , 在 .net 專案中加入此參考,





Imports WindowsHook

Public Class Form1
Dim WithEvents mHook As New MouseHook

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
'Install the mouse hook
mHook.InstallHook()
Catch ex As Exception
MessageBox.Show("Failed to install the mouse hook!." _
& Environment.NewLine & ex.Message, "Hook Error!", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
Try
'Remove the mouse hook
mHook.RemoveHook()
Catch ex As Exception
MessageBox.Show("Error removing the mouse hook!." _
& Environment.NewLine & ex.Message, "Hook Error!", _
MessageBoxButtons.OK, MessageBoxIcon.Error)
End Try

End Sub

Private Sub mHook_MouseDown(ByVal sender As Object, ByVal e As WindowsHook.MouseEventArgs) Handles mHook.MouseDown
'Set the Handled property for the mouse down event
'to block the mouse down message for the
'controls that are not in the alowedList.
'e.Handled = Not Me.alowedList.Contains(CType(sender, IntPtr))
'Do some other things here
'...
'Me.TextBox1.Text = "mouse down"
Me.TextBox1.Text = e.Button.ToString
'...
End Sub
End Class


星期三, 7月 14, 2010

半形轉全形 (php)




function n_to_w($strs, $types = '0'){ // narrow to wide , or wide to narrow
$nt = array(
"(", ")", "[", "]", "{", "}", ".", ",", ";", ":",
"-", "?", "!", "@", "#", "$", "%", "&", "|", "\\",
"/", "+", "=", "*", "~", "`", "'", "\"", "<", ">",
"^", "_",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
"u", "v", "w", "x", "y", "z",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z",
" "
);
$wt = array(
"(", ")", "〔", "〕", "{", "}", "﹒", ",", ";", ":",
"-", "?", "!", "@", "#", "$", "%", "&", "|", "\",
"/", "+", "=", "*", "~", "、", "、", """, "<", ">",
"︿", "_",
"0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"a", "b", "c", "d", "e", "f", "g", "h", "i", "j",
"k", "l", "m", "n", "o", "p", "q", "r", "s", "t",
"u", "v", "w", "x", "y", "z",
"A", "B", "C", "D", "E", "F", "G", "H", "I", "J",
"K", "L", "M", "N", "O", "P", "Q", "R", "S", "T",
"U", "V", "W", "X", "Y", "Z",
" "
);

if ($types == '0'){
// narrow to wide
$strtmp = str_replace($nt, $wt, $strs);
}else{
// wide to narrow
$strtmp = str_replace($wt, $nt, $strs);
}
return $strtmp;
}

台北城中扶輪社網址

台北城中扶輪社
Rotary Club of Taipei Castle
www.taipei-castle.org.tw

星期二, 6月 22, 2010

超肥的Microsoft Office 輸入法 2010

真是厲害, 輸入法竟然能搞到 131.2 MB

星期二, 9月 15, 2009

Using MD5 in C language




http://mixtt.blogspot.com/2009/06/c-using-md5-in-c-language.html





#include <openssl/md5.h>
/*Encode str to str_enc using md5 algorithm*/
void md5(char *str, char *str_enc) {
int i = 0;
unsigned char d[16];
MD5_CTX ctx;
MD5_Init(&ctx);
MD5_Update (&ctx, (char *) str, strlen(str));
MD5_Final(d, &ctx);
for (i = 0; i < 16; i++) {
sprintf(str_enc + (i*2), "%02X", d[i]);
}
str_enc[32] = 0;
}

Use C language to get MAC Address in linux





#include <stdio.h>
#include <string.h> /* for strncpy */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>

int main(void) {
int fd;
struct ifreq ifr;

char mac[20];
fd = socket(AF_INET, SOCK_DGRAM, 0);

ifr.ifr_addr.sa_family = AF_INET;
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);

ioctl(fd, SIOCGIFHWADDR, &ifr);

close(fd);

sprintf(mac,"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",
(unsigned char)ifr.ifr_hwaddr.sa_data[0],
(unsigned char)ifr.ifr_hwaddr.sa_data[1],
(unsigned char)ifr.ifr_hwaddr.sa_data[2],
(unsigned char)ifr.ifr_hwaddr.sa_data[3],
(unsigned char)ifr.ifr_hwaddr.sa_data[4],
(unsigned char)ifr.ifr_hwaddr.sa_data[5]);

printf("eth0 mac address:%s\n", mac);

return 0;
}

星期一, 5月 11, 2009

Asterisk 整合 gtalk

gtalk.conf =>
[buddy]
username=xxx@gmail.com
disallow=all
allow=ulaw
context=google-in ;order apparently matters, needs to be placed after username= ?
connection=gtalk_account

jabber.conf =>
[gtalk_account]
type=client
serverhost=talk.google.com
username=yyy@gmail.com/Talk ;; Astersk 的 gtalk 分身,必須要有此帳號
secret=zzz ;; yyy@gmail.com 的密碼
port=5222
usetls=yes ; TLS is required by talk.google.com, you'll get a 'socket read error' without
usesasl=yes
buddy=xxx@gmail.com
buddy=aaa@gmail.com
statusmessage="From Miles Blogger"
timeout=100

;; 從 Asterisk 分機撥給 gtalk 帳號 xxx@gmail.com
;; 會從yyy@gmail.com 撥給 xxx@gmail.com

dialplan =>
exten => 888,1,NoOp(+++ Dial to xxx@gmail.com +++)
exten => 888,n,Dial(Gtalk/gtalk_account/xxx@gmail.com)
exten => 888,n,Hangup

從 xxx@gmail.com 撥給 yyy@gmail.com 會轉到 Asterisk 的 dialplan 中的
[google-in] 裡面


更多的詳情可參看:
http://www.voip-info.org/wiki/view/Asterisk+Google+Talk

星期四, 4月 30, 2009

Asterisk 整合 VoiceXML

VoiceGlue
http://www.voiceglue.org/

安裝說明
http://voiceglue.org/wiki/doku.php?id=voiceglue_0.9_installation_instructions

因為我是用Gentoo , 所以只好使用困難的安裝方法 :-)
經過一番努力安裝完成後,接著就看設定部分
http://voiceglue.org/wiki/doku.php?id=voiceglue_0.9_user_guide

測試的 Dialplan 為
exten => 6666,1,NoOp("++++ Test voiceglue +++")
exten => 6666,n,Answer
exten => 6666,n,AGI(agi://localhost/url=http%3A%2F%2Flocalhost%2Fvxml%2Fhello.vxml)
exten => 6666,n,Hangup


http://localhost/vxml/hello.vxml 內容為

(vxml version="2.0" xmlns="http://www.w3.org/2001/vxml")
(form)
(block)
(prompt)
Welcome
(/prompt)
(/block)
(/form)
(/vxml)


voiceglue 預設是使用 flite 做為 TTS,
我們可以將其改用 espeak ,使其支援中文,方法如下:
修改 voiceglue_tts_gen
將其內容改為
system ("espeak", "-s 120", "-v", "zh", "-w", $file, "\"".$ARGV[1]."\"");
system ("mv", $file, $file . ".16khz.wav");
system ("sox", $file . ".16khz.wav", "-r", "8000", $file);
system ("rm", "-f", $file . ".16khz.wav");

就是這麼簡單 :-)

試著將 http://localhost/vxml/hello.vxml
中的 Welcome 改成中文,就可以聽到中文的語音囉

PS: 網頁必須是 UTF8 格式

Asterisk & 中文 TTS

espeak
http://espeak.sourceforge.net/
有支援中文的 TTS

asterisk-espeak is a eSpeak text-to-speech module for the Asterisk open-source PBX
http://asterisk-espeak.sourceforge.net/

若是用 asterisk 1.6.x 的版本,可參考以下的說明 patch
http://www.mail-archive.com/openpkg-cvs@openpkg.org/msg21782.html


記得要在 espeak.conf 設定
voice=zh
如此才會正確的處理中文


正確 install 成功後,測試的 Dialplan 如下
exten => 900,1,NoOp("+++++ Test espeak ++++")
exten => 900,n,Answer
exten => 900,n,espeak(測試中,你好,歡迎使用 asterisk |any)
exten => 900,n,Hangup


PS: 中文必須使用 UTF8 格式

星期一, 5月 28, 2007

Asterisk extensions.conf (二)

extensions.conf

設計撥號規則 (二)
-----------------------------------------------------------------
通常我們會將 extensions.conf 切分成好幾個檔,
然後再 include 進來 , 這樣比較好做規劃

例如: 將從 FXO 進線的撥號規則存入 fxo_incoming.conf ,
從 SIP 進線的撥號規則存入 sip_incoming.conf

在 extensions.conf 中 , 就可以用
;;; For fxo incoming
#include fxo_incoming.conf
;;; For sip incoming
#include sip_incoming.conf
將其檔案 include 進來 , 另外要注意的是有另一種 include ,
是 include context , 而非 include 檔案

例如在 extensions.conf 中

[test_context]
exten => 1234,1,Answer
.....
.....
;;; include context : test2_context
include test2_context

[test2_context]
exten => 2345,1,Answer
....
....

即表示 context [test_context] , 包括 [tests_context] 這個 context 內容
亦即 context [test_context] 設定為
exten => 1234,1,Answer
.....
.....
exten => 2345,1,Answer
....
....

--------------------------------------------------------------------------------
Asterisk 使用以下特殊用途 extension 名稱:

* i : 使用者按下沒有定義的 extension 號碼
* s : Start extension in context
* h : Hangup extension
* t : Timeout extension
* T : AbsolutTimeout() extension
* o : Operator extension, used for operator exit by pressing zero in voicemail
--------------------------------------------------------------------------------
Macro (巨集)
範例:
Using a macro to create extensions
[globals]
PHONE1=Zap/1
PHONE2=SIP/6002

;;; Macro(oneline,${PHONE1},${PHONE2},${PHONE3}....)
;;; ${ARG1} 就等於 ${PHONE1} , ${ARG2} 就等於 ${PHONE3} 依此類推 ...
[macro-oneline]
exten => s,1,Dial(${ARG1},20,t)
exten => s,2,Voicemail(u${MACRO_EXTEN})
exten => s,3,Hangup
exten => s,102,Voicemail(b${MACRO_EXTEN})
exten => s,103,Hangup

[local]
exten => 6601,1,Macro(oneline,${PHONE1})
exten => 6602,1,Macro(oneline,${PHONE2})

星期三, 5月 23, 2007

Asterisk extensions.conf (一)

Asterisk 可說是目前當紅的 open source IP PBX
詳細說明可至 http://www.voip-info.org/wiki/view/Asterisk 查看

接下來將會以我所知來說明 Asterisk 的設定與運用

extensions.conf

設計撥號規則

內容如下:

;;;撥號規則的環境變數
[general]
;;;預設為 no
static=yes
;;;預設為 no , 如果 writeprotect=no 且 static=yes , 則當在 CLI command 模式中, 執行 save dialplan,
;;;將會儲存目前的撥號規則設定
writeprotect=yes
;;;如果設定為 yes , 則系統將會依據其判斷猜測其為 BUSY,CONGENSTION或HANGUP而終止通話斷線,強烈建議設定為yes
autofallthrough=yes
;;;若設定為 yes, 則執行 extensions reload 時 , 將會清除通用變數的資料
clearglobalvars=no
;;;
priorityjumping=no

;;;撥號規則的通用變數
[globals]
;;; 設定 INCOMING 變數等於 Zap/3&Zap/4
;;; 於撥號規則內可用 ${INCOMING} 來運用 (變數名稱不分大小寫 , 也就是 ${INCOMING} 相當於 ${incoming})
INCOMING => Zap/3&Zap/4
;;; 撥號規則是由一推的 contexts 所組成 , 每一個 context 由一推的 extensions 組成
;;; 例如以下: [sip_outgoing] 即是一個 context
[sip_outgoing]
;;; exten = extension,priority,Command(parameters) (使用 = 或 => 都可以)
extension => 123,1,Answer
extension => 123,2,Dial(SIP/456,30)
extension => 123,3,Hangup
;;; Pattern , 在 extension 中第一個字為 _ 時 , pattern 才有作用
;;; X 表示 0 至 9
;;; Z 表示 1 至 9
;;; N 表示 2 至 9
;;; [1237-9] 表示 1,2,3,7,8,9
;;; . 表示一個或多個任意字
;;; ! 表示 0 個或多個任意數
;;; 例如以下表示所有 4 位數字的都符合
extension => _XXXX,1,Answer
extension => _XXXX,2,Dial(SIP/567,30)
extension => _XXXX,3,Hangup

星期一, 4月 16, 2007

mysql 雙向 replication

mysql Replication
-----------------------------
1. 兩台主機的 mysql 設定檔
my.cnf
加上
;;server-id = 2
server-d =1
log-bin
binlog-do-db = db1
binlog-do-db = db2
binlog-do-db = db3
binlog-do-db = db4
;;master-host = 192.168.1.22
master-host = 192.168.1.30
master-user = ruser
master-password = rpass
master-port = 3306
master-connect-retry = 60
replicate-do-db = db1
replicate-do-db = db2
replicate-do-db = db3
replicate-do-db = db4

2. 兩台主機新增帳號
***** For 4.0.x 以前版本
grant file on *.* to ruser@192.168.1.22 identified by 'rpass';
grant file on *.* to ruser@192.168.1.30 identified by 'rpass';
***** For 4.1.x 以後版本
grant replication slave on *.* to ruser@192.168.1.22 identified by 'rpass';
grant replication slave on *.* to ruser@192.168.1.30 identified by 'rpass';

3. 修改 /etc/hosts.allow
mysqld: 127.0.0.1 192.168.1.22 192.168.1.30

4. 清除 bin-log 檔
設定使用 ssh 直接登入其它伺服器 , 不需要認證
在 192.168.1.22主機上執行
ssh-keygen -t rsa
不要輸入密碼, 產生 RSA key
cat /root/.ssh/id_rsa.pub
將內容複製起來 , 然後在 192.168.1.30 主機上 , 加入 /root/.ssh/authorized_keys 存檔

同樣動作 192.168.1.30 也做一次

如此在 192.168.1.22 主機上執行 ssh 192.168.1.30 , 即可直接登錄
同理在 192.168.1.30 主機上執行 ssh 192.168.1.22 也可直接登錄


新增一檔案 purge_replication_log.sh , 內容如下:

#!/usr/bin/env bash
#######################################################
# Initialization: define variables in need
#######################################################
PATH=/usr/local/bin:/usr/bin:/bin
USER="root"
PASSWD="rootpassword"
CMDSLAVE="stop slave;reset slave;start slave;"
CMDMASTER="reset master;"
MASTER="192.168.1.22"
SLAVE="192.168.1.30"
#### clean master bin-log and slave restart slave
(mysql -u$USER -p$PASSWD -e "$CMDMASTER") 1>/dev/null
(ssh $SLAVE "mysql -u$USER -p$PASSWD -e \"$CMDSLAVE\"") 1>/dev/null
### claen slave bin-log and master restart slave
(ssh $SLAVE "mysql -u$USER -p$PASSWD -e \"$CMDMASTER\"") 1>/dev/null
(mysql -u$USER -p$PASSWD -e "$CMDSLAVE") 1>/dev/null
exit 0


如此 , chmod 755 purge_replication_log.sh
定期執行 purge_replication_log.sh 即可將 bin-log 刪除 , 以防 bin-log 過大 , 並保持雙向同步

星期二, 11月 01, 2005

眼睛視網膜病變

最近眼睛右眼看東西, 正中間都有一團黑影 , 導致東西都看不清楚 ,
至醫院檢查 , 發現是視網膜病變所引起 , 需要長期休息及作進一步檢查.
原因可能是愛情動作片看太多了 , ㄚ~ 不是啦 , 醫生說應該是壓力大 , 且
太長時間看電腦螢幕所引起的 .

目前正在家休養中 , 可能會休息一兩個月吧~~ 大家努力
工作之餘 , 更要保重身體啊~~

星期五, 9月 02, 2005

在asp.net中處理意外情況

於Global.asax 中的 Application_Error 事件加上以下的內容 , 如此
當系統發生意外情況時 , 則會將錯誤訊息 mail 給指定的人 , 並將網頁導至
Maintenance.aspx

Sub Application_Error(ByVal sender As Object, ByVal e As EventArgs)
' 發生錯誤時引發
If (System.Web.HttpContext.Current.Request.Url.Authority <> "localhost") Then
''' Get the Exception object wrapped in the InnerException property
Dim unhandledException As Exception = Server.GetLastError().InnerException
''' Create a MailMessage
Dim mail As System.Web.Mail.MailMessage = New System.Web.Mail.MailMessage
mail.From = "error@abc.com"
mail.To = "admin@abc.com"
mail.BodyFormat = System.Web.Mail.MailFormat.Text
mail.Subject = "unHandledException.Message"
mail.Body = unhandledException.ToString()
System.Web.Mail.SmtpMail.SmtpServer = "127.0.0.1"
''' Send the email
System.Web.Mail.SmtpMail.Send(mail)
''' Redirect the user to a maintenence page
System.Web.HttpContext.Current.Response.Redirect("Maintenance.aspx")
End If
End Sub

星期一, 8月 15, 2005

利用crystal report 直接匯出pdf檔給client

'''利用crystal report 直接匯出pdf檔給client
'''在作業目錄底下新建一個reports目錄,權限設定為everyone可讀寫
'''記得要imports 以下兩項
'''Imports CrystalDecisions.CrystalReports.Engine
'''Imports CrystalDecisions.Shared
'''
Dim RptDoc As New ReportDocument
Dim rptFile As String = Server.MapPath("license.rpt")
'''
RptDoc.Load(rptFile)
''' 登入資料庫
Dim logonInfo As New TableLogOnInfo
Dim rptTable As Table
For Each rptTable In RptDoc.Database.Tables
logonInfo = rptTable.LogOnInfo
With logonInfo.ConnectionInfo
.ServerName = "localhost"
.DatabaseName = "ff"
.UserID = "aa"
.Password = "aa"
End With
rptTable.ApplyLogOnInfo(logonInfo)
Next

'RptDoc.ExportOptions.ExportFormatType = ExportFormatType.WordForWindows
RptDoc.ExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat
RptDoc.ExportOptions.FormatOptions = New PdfRtfWordFormatOptions
''' 設定參數
Dim Paravalues As New ParameterValues
Dim ParaDisValue As New ParameterDiscreteValue
'ParaDisValue = New ParameterDiscreteValue
ParaDisValue.Value = 6
Paravalues.Add(ParaDisValue)

RptDoc.DataDefinition.ParameterFields("License_Num").ApplyCurrentValues(Paravalues)

Dim crExportOptions As ExportOptions
Dim crDiskFileDestinationOptions As DiskFileDestinationOptions
Dim fname As String
fname = Server.MapPath("exports/") & Session.SessionID.ToString & ".pdf"
crDiskFileDestinationOptions = New DiskFileDestinationOptions
crDiskFileDestinationOptions.DiskFileName = fname
crExportOptions = RptDoc.ExportOptions
With crExportOptions
.DestinationOptions = crDiskFileDestinationOptions
.ExportDestinationType = ExportDestinationType.DiskFile
.ExportFormatType = ExportFormatType.PortableDocFormat
End With
RptDoc.Export()
Response.ClearContent()
Response.ClearHeaders()
Response.ContentType = "application/pdf"
Response.WriteFile(fname)
Response.Flush()
Response.Close()
System.IO.File.Delete(fname)

利用window.open開啟新視窗

利用asp.net(VS.net)開發web程式, 相信很多人都知道, 一個aspx的網頁只能有一個
form, 也就是說如果要在程式中利用button按鈕點一下後,連結到新的視窗,一般就只能
靠java script 來完成了.
最好是利用 window.open, 而不要使用window.showModalDialog , 因為
後者並非標準的語法,只有IE能解譯.
例如:
Private Sub BTP_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles BTPestUse1.Load
Dim JavaScript As String
Dim Url As String
Url = "'pChoice.aspx?pestcd=' + " & "Form1." & Me.TBP.ClientID & ".value" '''
Url = "encodeURIComponent(" & Url & ")"
JavaScript = "window.open(" & Url & ",'','height=600,width=800,menubar=no');"
Me.BTP.Attributes("onclick") = JavaScript
end sub

於子視窗 pChoice.aspx 中可以利用request("pestcd")取得TBP這個TextBox輸入的值

星期二, 5月 17, 2005

取得 MCAD 認證(Microsoft Certified Application Developer )

之前就差一科就能取得 MCAD , 拖了好久 , 終於在昨天通過了 , 耶~~~

Microsoft Certification Status

Certification Version Date Achieved

Microsoft Certified Application Developer May 16, 2005
For Microsoft .NET May 16, 2005
Microsoft Certified Professional Dec 29, 2003


Microsoft Certification Exams Completed Successfully

Exam ID Description Date Completed
306 Developing and Implementing Windows®-based Applications with Microsoft® Visual Basic® .NET and Microsoft® Visual Studio® .NET May 16, 2005
310 Developing XML Web Services and Server Components with Microsoft® Visual Basic® .NET and the Microsoft® .NET Framework Feb 23, 2004
305 Developing and Implementing Web Applications with Microsoft® Visual Basic® .NET and Microsoft® Visual Studio® .NET

星期四, 11月 18, 2004

桂林遊

2004年11月6日至2004年11月10日共五天 , 與父母及老婆參加鳳凰旅行社至桂林遊玩.

其中印象比較深刻的是坐船遊漓江,真不愧是百里畫廊,沿途風光相當漂亮,真像是置身於山水畫中.
張藝謀導演的印象劉三姐實景表演真是精彩,令人難忘!
堯山更是不可不去,坐覽車大約20分鐘上堯山,觀看整個桂林,飄渺之間,如詩如畫.

在桂林買東西,大概都可以標價的2折價錢購買到,不殺價就是冤大頭了 :P

星期二, 10月 19, 2004

壓縮 MS SQL 2000 中的資料檔及交易明細檔

use 資料庫名稱
Backup Log 資料庫名稱 with Truncate_only
DBCC ShrinkDataBase (資料庫名稱) --壓縮資料檔 --> *.mdf
DBCC ShrinkFile (資料庫名稱_log) --壓縮交易紀錄檔 --> *.ldf


http://charlesbc.blogspot.tw/2011/01/sql-server-log.html
SQL Server 2008

到了 SQL Server 2008,Trancate_only 的指令正式被取消了。由於資料庫的復原模式為簡單的情形下是不記錄所有的 log資料的。我們可以利用這一點清除 log 資料。因此,替代的方法,是將資料庫的復原模式先換成簡單模式,再調整為完整。指令如下

use master
go

--備份目前的 log
backup log DatabaseName to disk='c:\db.log' WITH NOFORMAT
--將資料庫復原模式切換到簡單模式
ALTER DATABASE DatabaseName SET RECOVERY SIMPLE WITH NO_WAIT


--找到 DatabaseNameLog 的值
use DatabaseName
go
select name from sys.database_files
where type_desc = 'log'

--縮減 log file 到 1MB
DBCC SHRINKFILE(DatabaseNameLog, 1)


--將資料庫復原模式切換到完整模式
USE [master]
GO
ALTER DATABASE [DatabaseName] SET RECOVERY FULL WITH NO_WAIT

星期二, 10月 05, 2004

Freebsd and Debian

前一陣子因工作需求,同時使用Freebsd與Debian,
Freebsd 的 port 與 Debian 的 apt 都相當好用,
只不過同時使用這兩個作業系統時,常會指令混淆~~ :-)