TOAD for Oracle可以很方便的幫我們找到Lock的相關訊息。
直接在工具列上點選Session Browser,再選擇Locks頁面
由下圖可以得知,SID 41有被Lock住的情況,以致Session無法完成作業。
而兇手就是與SID 41存取相同的Object Name的SID 177。
此時只要將SID 177給Kill掉就可以解除Lock。
Win 8.1突然無法使用行動硬碟
今天將行動硬碟接到筆電的USB孔,作業系統是Win 8.1,我的電腦內卻沒有出現新的磁碟,
但是行動硬碟前陣子才使用過,是正常的,怎麼今天就不行了,難道運氣真的這麼不好,它壞了。
先到裝置管理員查看,發現USB的控制器居然是問號,這之前是沒有發生過的,所以先將它解除掉。
但是行動硬碟前陣子才使用過,是正常的,怎麼今天就不行了,難道運氣真的這麼不好,它壞了。
先到裝置管理員查看,發現USB的控制器居然是問號,這之前是沒有發生過的,所以先將它解除掉。
解除完成後,再重新掃描硬體,它就恢復正常了,行動硬碟也馬上就可以使用了。
Oracle 9iR2可以利用flashback query來查詢undo的資料
Oracle 9iR2可以利用flashback query來查詢undo的資料,
只要是Undo的資料尚未被覆寫,就有機會把資料還原。
先將測試tmp_ccc內的資料清除
SQL> select count(1) from tmp01;
COUNT(1)
----------
10
SQL> delete tmp01 ;
10 rows deleted.
SQL> commit;
Commit complete.
SQL> select count(1) from tmp01;
COUNT(1)
----------
0
1、利用SCN查詢
找出現在的SCN
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual;
GET_SYSTEM_CHANGE_NUMBER
----------------------------
450302
查詢tmp01在SCN 450301時的資料
SELECT count(1) FROM tmp01 AS OF SCN 450301;
COUNT(1)
----------
10
2、利用時間查詢
找30分鐘前的資料
select count(1) from tmp_ccc AS OF TIMESTAMP TO_TIMESTAMP(sysdate-30/1440);
COUNT(1)
----------
10
也可以直接指定時間,先設定時間格式
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
Session altered.
查現在的時間,看看時間格式
SQL> SELECT LOCALTIMESTAMP FROM dual;
LOCALTIMESTAMP
---------------------------------------------------------------------------
27-DEC-2013 15:59:19
SQL> SELECT count(1) FROM tmp01 AS OF TIMESTAMP TO_TIMESTAMP('27-DEC-2013 15:29:00');
COUNT(1)
----------
10
只要是Undo的資料尚未被覆寫,就有機會把資料還原。
先將測試tmp_ccc內的資料清除
SQL> select count(1) from tmp01;
COUNT(1)
----------
10
SQL> delete tmp01 ;
10 rows deleted.
SQL> commit;
Commit complete.
SQL> select count(1) from tmp01;
COUNT(1)
----------
0
1、利用SCN查詢
找出現在的SCN
SQL> SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER FROM dual;
GET_SYSTEM_CHANGE_NUMBER
----------------------------
450302
查詢tmp01在SCN 450301時的資料
SELECT count(1) FROM tmp01 AS OF SCN 450301;
COUNT(1)
----------
10
2、利用時間查詢
找30分鐘前的資料
select count(1) from tmp_ccc AS OF TIMESTAMP TO_TIMESTAMP(sysdate-30/1440);
COUNT(1)
----------
10
也可以直接指定時間,先設定時間格式
SQL> ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY HH24:MI:SS';
Session altered.
查現在的時間,看看時間格式
SQL> SELECT LOCALTIMESTAMP FROM dual;
LOCALTIMESTAMP
---------------------------------------------------------------------------
27-DEC-2013 15:59:19
SQL> SELECT count(1) FROM tmp01 AS OF TIMESTAMP TO_TIMESTAMP('27-DEC-2013 15:29:00');
COUNT(1)
----------
10
由Session ID(SID)找出Concurrent Request
剛好遇到Lock的類型是Concurrent Request,因為知道Session ID(SID),
想由Session ID找出Concurrent Request,可以執行下列的SQL
select vs.sid "Session_ID"
,vs.serial# "Session_Serial#"
,vp.spid "OS_PID"
,fcp.user_concurrent_program_name "Concurrent Name"
,fcr.request_id "Concurrent ID"
,fcr.actual_start_date "Start Time"
,fcr.actual_completion_date "Finish Time"
,(fcr.actual_completion_date-fcr.actual_start_date)*24*60*60 "Expense Time(second)"
,decode(fcr.phase_code,'R','Running','C','Completed','P','Pending','I','Inactive') "Request Status"
,decode(fcr.status_code,'A','Waiting','B','Resuming','C','Normal','D','Cancelled','E','Error',
'F','Scheduled','G','Warning','H','On Hold','I','Normal','M','No Manager',
'Q','Standby','R','Normal','S','Suspended','T','Terminating','U','Disabled',
'W','Paused','X','Terminated','Z','Waiting') "Request Phase"
from v$session vs
,v$process vp
,fnd_concurrent_requests fcr
,fnd_concurrent_programs_tl fcp
where vs.paddr=vp.addr
and vs.process=fcr.os_process_id
and fcr.concurrent_program_id=fcp.concurrent_program_id
and fcr.phase_code='R' --running
and vs.sid = &SID ; --Session SID
想由Session ID找出Concurrent Request,可以執行下列的SQL
select vs.sid "Session_ID"
,vs.serial# "Session_Serial#"
,vp.spid "OS_PID"
,fcp.user_concurrent_program_name "Concurrent Name"
,fcr.request_id "Concurrent ID"
,fcr.actual_start_date "Start Time"
,fcr.actual_completion_date "Finish Time"
,(fcr.actual_completion_date-fcr.actual_start_date)*24*60*60 "Expense Time(second)"
,decode(fcr.phase_code,'R','Running','C','Completed','P','Pending','I','Inactive') "Request Status"
,decode(fcr.status_code,'A','Waiting','B','Resuming','C','Normal','D','Cancelled','E','Error',
'F','Scheduled','G','Warning','H','On Hold','I','Normal','M','No Manager',
'Q','Standby','R','Normal','S','Suspended','T','Terminating','U','Disabled',
'W','Paused','X','Terminated','Z','Waiting') "Request Phase"
from v$session vs
,v$process vp
,fnd_concurrent_requests fcr
,fnd_concurrent_programs_tl fcp
where vs.paddr=vp.addr
and vs.process=fcr.os_process_id
and fcr.concurrent_program_id=fcp.concurrent_program_id
and fcr.phase_code='R' --running
and vs.sid = &SID ; --Session SID
停用EBS上的Help -> Diagnostics功能
停用EBS上的Help -> Diagnostics功能,如下圖:
到System Administrator -> Porfile -> System
搜尋參數 Hide Diagnostics menu entry,並將它設定為Yes,就可以停用Diagnostics功能
當然也可以只針對某些帳號設定啟用,在搜尋時多勾選 User 層次,並選擇帳號就可以了。
另外如果想要在點選Diagnostics的功能時,需要輸入apps的密碼,
則搜尋參數 Utilities:Diagnostics ,將它設定 No(需要密碼)。
到System Administrator -> Porfile -> System
搜尋參數 Hide Diagnostics menu entry,並將它設定為Yes,就可以停用Diagnostics功能
當然也可以只針對某些帳號設定啟用,在搜尋時多勾選 User 層次,並選擇帳號就可以了。
另外如果想要在點選Diagnostics的功能時,需要輸入apps的密碼,
則搜尋參數 Utilities:Diagnostics ,將它設定 No(需要密碼)。
ramdisk、ramfs、tmpfs設定使用
在Linux中可以將一部分記憶體掛載成磁碟來使用,分別為:ramdisk、ramfs、tmpfs。
而在將記憶體掛載成磁碟之後,就可以把它依磁碟一般的存取它,因為是記憶體存取,
所以速度比一般的硬碟要快上非常多,但是關機後,裡面的資料也就跟著消失了。
ramdisk可以被Linux格式化且掛載,它在Kernel 2.0/2.2就已經被支援了,
可是ramdisk的大小固定,且無法在掛載時動態更改它。
1、建立一個要被掛載的目錄
# mkdir /mnt/ramdisk
2、格式化ramdisk,假設等會要掛載的是ram0
#mke2fs /dev/ram0
3、掛載 /dev/ram0
# mount /dev/ram0 /mnt/ramdisk
ramfs處於虛擬檔案系統(VFS)層,而不是像ramdisk那樣基於虛擬在記憶體中的檔案系統(ex2fs)。
因而無需格式化且可以創建很多個,只要記憶體足夠,在建立時可以指定其最大使用的記憶體大小。
而且用起來靈活,其大小隨所需要的空間而增加或減少。
# mkdir /mnt/ramfs
# mount -t ramfs ramfs /mnt/ramfs
預設ramfs最多可使用記憶體大小的一半。可以通過maxsize(以kbyte為單位)選項來改變,如下:
# mount -t ramfs none /testRAM -o maxsize=2000
或是以size選項來改變大小,如下:
mount -t ramfs ramfs /mnt/ramfs -o size=200m
tmpfs是一個虛擬記憶體檔案系統,它可以使用實體記憶體,也可以使用交換分區(SWAP)。
當tmpfs向虛擬記憶體子系統請求頁來存取檔案時,如同其它請求頁的一樣,
不會知道分配給自己的頁是在記憶體中還是在交換分區中。
與ramfs一樣,其大小可以隨著所需要的空間而動態的增減。
# mkdir -p /mnt/tmpfs
# mount tmpfs /mnt/tmpfs -t tmpfs
同樣可以在掛載時指定最大限制
# mount tmpfs /mnt/tmpfs -t tmpfs -o size=16m
以上都可以由指令mout來查詢掛載的情形
而在將記憶體掛載成磁碟之後,就可以把它依磁碟一般的存取它,因為是記憶體存取,
所以速度比一般的硬碟要快上非常多,但是關機後,裡面的資料也就跟著消失了。
ramdisk可以被Linux格式化且掛載,它在Kernel 2.0/2.2就已經被支援了,
可是ramdisk的大小固定,且無法在掛載時動態更改它。
1、建立一個要被掛載的目錄
# mkdir /mnt/ramdisk
2、格式化ramdisk,假設等會要掛載的是ram0
#mke2fs /dev/ram0
3、掛載 /dev/ram0
# mount /dev/ram0 /mnt/ramdisk
ramfs處於虛擬檔案系統(VFS)層,而不是像ramdisk那樣基於虛擬在記憶體中的檔案系統(ex2fs)。
因而無需格式化且可以創建很多個,只要記憶體足夠,在建立時可以指定其最大使用的記憶體大小。
而且用起來靈活,其大小隨所需要的空間而增加或減少。
# mkdir /mnt/ramfs
# mount -t ramfs ramfs /mnt/ramfs
預設ramfs最多可使用記憶體大小的一半。可以通過maxsize(以kbyte為單位)選項來改變,如下:
# mount -t ramfs none /testRAM -o maxsize=2000
或是以size選項來改變大小,如下:
mount -t ramfs ramfs /mnt/ramfs -o size=200m
tmpfs是一個虛擬記憶體檔案系統,它可以使用實體記憶體,也可以使用交換分區(SWAP)。
當tmpfs向虛擬記憶體子系統請求頁來存取檔案時,如同其它請求頁的一樣,
不會知道分配給自己的頁是在記憶體中還是在交換分區中。
與ramfs一樣,其大小可以隨著所需要的空間而動態的增減。
# mkdir -p /mnt/tmpfs
# mount tmpfs /mnt/tmpfs -t tmpfs
同樣可以在掛載時指定最大限制
# mount tmpfs /mnt/tmpfs -t tmpfs -o size=16m
以上都可以由指令mout來查詢掛載的情形
Linux ramdisk的設定、使用
ramdisk 就是將一部份的記憶體當成是磁碟來存取。
優點是磁碟的速度非常快,但是下次開機後資料就不見了。
系統有ram0到ram15,預設大小為16M,除非掛載ramdisk,否則並不占用記憶體空間空間。
要修改ramdisk的大小只要在kernel的後面加上ramdisk_size=xxxxx再重開機就可以了
[root @linux ~]# vi /etc/grub.conf
…略
kernel /vmlinuz-2.4.20-20.9 ro root=LABEL=/ hdc=ide-scsi ramdisk_size=64000
…略
============================================================================
掛載ramdisk的方法:
1、先format /dev/ram0,只需格式成ext2的格式就好。
[root@linux ~]# mke2fs /dev/ram0
2、建立一個要掛載的資料夾
[root@linux ~]# mkdir /mnt/ramdisk
3、掛載ramdisk到指定的資料夾
[root@linux ~]# mount /dev/ram0 /mnt/ramdisk
4、查看掛載後的情況
[root@linux ~]# df -h | grep ram0
/dev/ram0 16M 140K 15M 1% /mnt/ramdisk
5、使用 ramdisk:把它當做硬碟一樣使用這個空間。
6、缷載ramdisk
[root@linux ~]# umount -v /mnt/rd /dev/ram0
ramdisk的資料會一直保留起來到重開機前,都不會動到這一塊的空間。
優點是磁碟的速度非常快,但是下次開機後資料就不見了。
系統有ram0到ram15,預設大小為16M,除非掛載ramdisk,否則並不占用記憶體空間空間。
要修改ramdisk的大小只要在kernel的後面加上ramdisk_size=xxxxx再重開機就可以了
[root @linux ~]# vi /etc/grub.conf
…略
kernel /vmlinuz-2.4.20-20.9 ro root=LABEL=/ hdc=ide-scsi ramdisk_size=64000
…略
============================================================================
掛載ramdisk的方法:
1、先format /dev/ram0,只需格式成ext2的格式就好。
[root@linux ~]# mke2fs /dev/ram0
2、建立一個要掛載的資料夾
[root@linux ~]# mkdir /mnt/ramdisk
3、掛載ramdisk到指定的資料夾
[root@linux ~]# mount /dev/ram0 /mnt/ramdisk
4、查看掛載後的情況
[root@linux ~]# df -h | grep ram0
/dev/ram0 16M 140K 15M 1% /mnt/ramdisk
5、使用 ramdisk:把它當做硬碟一樣使用這個空間。
6、缷載ramdisk
[root@linux ~]# umount -v /mnt/rd /dev/ram0
ramdisk的資料會一直保留起來到重開機前,都不會動到這一塊的空間。
Goolge 發佈商工具列尚未初始化
我在Chrome有裝「Google發佈商工具」,平時都是正常的,但是因為防火牆上有設定網路使用密碼,
所以有時候Chrome會出現「Google發佈商工具列尚未初始化。」,雖然輸入密碼後,
網路已經可以正常使用,但是偶而還是一直無法成功連線。
找到「Google Publisher Toolbar」,取消「已啟用」的勾選再重新勾選就可以了。
所以有時候Chrome會出現「Google發佈商工具列尚未初始化。」,雖然輸入密碼後,
網路已經可以正常使用,但是偶而還是一直無法成功連線。
開啟「擴充功能」的「工具」
Win8.1 一些Window鍵的組合鍵
Windows鍵+Enter
開啟/關閉朗讀程式(會把動作或程式用唸的唸出來)
Ctrl+加號 (+) 或 Ctrl+減號 (-)
放大或縮小大量項目,例如釘選到 [開始] 畫面的應用程式
Ctrl+滾輪
放大或縮小大量項目,例如釘選到 [開始] 畫面的應用程式
Windows鍵+C
開啟常用鍵,在應用程式中,開啟應用程式的命令
Windows鍵+F
開啟搜尋常用鍵來搜尋檔案
Windows鍵+I
開啟設定常用鍵
Windows鍵+O
鎖定螢幕方向 (直向或橫向)
Windows鍵+Q
開啟搜尋,搜尋所有位置
Windows鍵 +W
開啟搜尋常用鍵
Windows鍵 +X
開啟 [快速連結] 功能表
Windows鍵 +Z
顯示應用程式中可用的命令
Windows鍵 +Tab
循環顯示最近使用的應用程式 (傳統型應用程式除外)
Windows鍵 +Home
使用中桌面視窗之外全部最小化 (再按一下可還原所有視窗)
Windows鍵 +空白鍵
切換輸入法
更詳細的鍵盤用法,可以參考
http://windows.microsoft.com/zh-tw/windows-8/keyboard-shortcuts
自訂V$SESSION Action及Module欄位
V$SESSION有兩個欄位Action及Module可以用DBMS_APPLICATION_INFO來自訂,
例如:帳號、程式名稱,這樣就可以知道Session是由誰及執行那一支程式了。
Syntax
DBMS_APPLICATION_INFO.SET_MODULE (
module_name IN VARCHAR2,
action_name IN VARCHAR2);
Example:
先找出自己的SID
SQL> select sid from v$mysata where rownum=1;
接著執行下列的語法
SQL> set timing on;
SQL> begin
2 dbms_application_info.set_module('aaa','bbb');
3 for i in 1..50 loop
4 --lock 50 seconds
5 dbms_lock.sleep(1);
6 end loop;
7 end;
8 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:50.52
在程式被Lock的50秒內,用另一個工具來查詢v$session:
select sid,active,module from v$session where sid = &SID
例如:帳號、程式名稱,這樣就可以知道Session是由誰及執行那一支程式了。
Syntax
DBMS_APPLICATION_INFO.SET_MODULE (
module_name IN VARCHAR2,
action_name IN VARCHAR2);
Example:
先找出自己的SID
SQL> select sid from v$mysata where rownum=1;
接著執行下列的語法
SQL> set timing on;
SQL> begin
2 dbms_application_info.set_module('aaa','bbb');
3 for i in 1..50 loop
4 --lock 50 seconds
5 dbms_lock.sleep(1);
6 end loop;
7 end;
8 /
PL/SQL procedure successfully completed.
Elapsed: 00:00:50.52
在程式被Lock的50秒內,用另一個工具來查詢v$session:
select sid,active,module from v$session where sid = &SID
關閉EBS的DB時,一直顯示connect,時間很久
在關閉EBS的DB時,有時候會發現長時間等待,檢查alert<SID>.log,會發現在等待Session的結束。
tail -fn alert<SID>.log
結果如下:
Shutting down instance (immediate)
License high water mark = 154
Wed Dec 18 10:53:12 2013
Active call for process 7140 user 'cloneora' program 'oracle@fh3440 (TNS V1-V3)'
SHUTDOWN: waiting for active calls to complete.
切換到OS,強制把Session給kill掉(Unix):
kill -9 <PID>
此時就可以發現關機程序繼續往下執行
Wed Dec 18 10:55:36 2013
ALTER DATABASE CLOSE NORMAL
Wed Dec 18 10:55:40 2013
SMON: disabling tx recovery
SMON: disabling cache recovery
…略
tail -fn alert<SID>.log
結果如下:
Shutting down instance (immediate)
License high water mark = 154
Wed Dec 18 10:53:12 2013
Active call for process 7140 user 'cloneora' program 'oracle@fh3440 (TNS V1-V3)'
SHUTDOWN: waiting for active calls to complete.
切換到OS,強制把Session給kill掉(Unix):
kill -9 <PID>
此時就可以發現關機程序繼續往下執行
Wed Dec 18 10:55:36 2013
ALTER DATABASE CLOSE NORMAL
Wed Dec 18 10:55:40 2013
SMON: disabling tx recovery
SMON: disabling cache recovery
…略
MRP因為Planning Manager有問題而執行失敗
今天一早同事反應從昨天晚上執行MRP,到現在還沒有成功,但是並無任何錯誤的訊息,
只是一直顯示running,由於超過以往執行時間太多,所以懷疑可能有Lock的現像。
執行下列語法,發現的確有Session互相Lock的情形,而且ctime的數值很高。
由上列v$lock所提供的SID到v$session去查詢,發現是Concurrect Request卡住。
執行下列的SQL找到相對應的Request,結果是Planning Manager的Request有問題。
因為一直無法將Request成功取消,只好將Session給砍掉。
重新執行MRP,成功。
只是一直顯示running,由於超過以往執行時間太多,所以懷疑可能有Lock的現像。
執行下列語法,發現的確有Session互相Lock的情形,而且ctime的數值很高。
select * from v$lock where block >0;
由上列v$lock所提供的SID到v$session去查詢,發現是Concurrect Request卡住。
select * from v$session where sid= &SID ;
執行下列的SQL找到相對應的Request,結果是Planning Manager的Request有問題。
select vs.sid "Session_SID" ,vs.serial# "Session Serial#" ,vp.spid "OS PID" ,fcp.user_concurrent_program_name "Concurrent Name" ,fcr.request_id ,fcr.actual_start_date "Start Time" ,fcr.actual_completion_date "Finish Time" ,(fcr.actual_completion_date-fcr.actual_start_date)*24*60*60 "Expense Time(second)" ,decode(fcr.phase_code,'R','Running','C','Completed', 'P','Pending','I','Inactive') "Request Status" ,decode(fcr.status_code,'A','Waiting','B','Resuming','C','Normal', 'D','Cancelled','E','Error','F','Scheduled', 'G','Warning','H','On Hold','I','Normal','M','No Manager', 'Q','Standby','R','Normal','S','Suspended','T','Terminating', 'U','Disabled','W','Paused','X','Terminated', 'Z','Waiting') "Request Phase" from v$session vs ,v$process vp ,fnd_concurrent_requests fcr ,fnd_concurrent_programs_tl fcp where vs.paddr=vp.addr and vs.process=fcr.os_process_id and fcr.concurrent_program_id=fcp.concurrent_program_id and fcr.phase_code='R' --running and vs.sid = &SID ; --Session SID
因為一直無法將Request成功取消,只好將Session給砍掉。
alter syste kill '&SID,&SERIAL#' ;請同事檢查Planning Manager的狀況,果然在17的下午之後就卡住了。
重新執行MRP,成功。
限制搜尋引擎抓取網站資料的範圍(robots.txt)--SEO的技巧
今天啟用Google的網站管理工具時,發現可以測試robots的功能,
但是我不知道什麼是robots,所以就搜尋並學習一下。
原來robots是關於SEO的小技巧,就是要給搜尋引擎讀取的文字檔。
對於SEO是重要的環節之一,雖然各家搜尋引擎對於robots.txt可能沒有以前那麼重視,
但是大部分的搜尋引擎蜘蛛(spider)還是支持的。
它是放在網站根目錄(例:http://lyhpcha.blogspot.tw/robots.txt),
其目的在於指定spider在網站上能抓取網頁的範圍的一個文字檔,
可以聲明網站中不想被搜尋引擎收錄的部分或者指定搜尋引擎只能收錄特定的部分。
robots.txt基本格式:
User-agent: *(spider名稱,*號代表全部)
Disallow: /001(Disallow:不允許搜索的範圍是/001為目錄以下)
Allow: /002 (Allow:允許搜索的範圍只有/001為目錄以下)
範例一:
User-agent: * (*號代表全部搜尋引擎)
Disallow: (空白的意思代表全部允許)
或者
User-agent: *
Allow: / (/代表允許訪問網站根目錄以下所有的資料)
範例二:僅允許Googlebot訪問
User-agent: Baiduspider
Disallow:
或者
User-agent: Baiduspider
Allow: /
範例三:禁止搜尋引擎訪問站內某些檔案:
User-agent: *
Allow: /myfile/(禁止/myfiles/目錄底下的所有檔案)
範例四:禁止搜尋引擎抓取所有圖片:
User-agent: *
Disallow: .jpg$
Disallow: .jpeg$
Disallow: .gif$
Disallow: .png$
Disallow: .bmp$
但是我不知道什麼是robots,所以就搜尋並學習一下。
原來robots是關於SEO的小技巧,就是要給搜尋引擎讀取的文字檔。
對於SEO是重要的環節之一,雖然各家搜尋引擎對於robots.txt可能沒有以前那麼重視,
但是大部分的搜尋引擎蜘蛛(spider)還是支持的。
它是放在網站根目錄(例:http://lyhpcha.blogspot.tw/robots.txt),
其目的在於指定spider在網站上能抓取網頁的範圍的一個文字檔,
可以聲明網站中不想被搜尋引擎收錄的部分或者指定搜尋引擎只能收錄特定的部分。
robots.txt基本格式:
User-agent: *(spider名稱,*號代表全部)
Disallow: /001(Disallow:不允許搜索的範圍是/001為目錄以下)
Allow: /002 (Allow:允許搜索的範圍只有/001為目錄以下)
範例一:
User-agent: * (*號代表全部搜尋引擎)
Disallow: (空白的意思代表全部允許)
或者
User-agent: *
Allow: / (/代表允許訪問網站根目錄以下所有的資料)
範例二:僅允許Googlebot訪問
User-agent: Baiduspider
Disallow:
或者
User-agent: Baiduspider
Allow: /
範例三:禁止搜尋引擎訪問站內某些檔案:
User-agent: *
Allow: /myfile/(禁止/myfiles/目錄底下的所有檔案)
範例四:禁止搜尋引擎抓取所有圖片:
User-agent: *
Disallow: .jpg$
Disallow: .jpeg$
Disallow: .gif$
Disallow: .png$
Disallow: .bmp$
Shell Script簡易教學
一、概論
在許多的情況之下,我們都需要固定一組可以重覆或判斷資訊的指令,
而把這些指令存被在文字檔中,再交由Shell執行,就是Script。
一般會將Shell Script的副檔名命名為.sh,雖然副檔名在Linux中並非必要,
但是有副檔名可以讓我們更容易管理這些檔案。
假設有一個名為test.sh 的 Shell Script,首先用文字編輯器來撰寫內容如下:
#!/bin/bash
echo Hello World
第一行是必需的,它是用來定義你要使用的 shell。Linux中有許多的Shell可以使用,
如:ksh、bash,但是彼此之間語法有所差異,所以我們首先需要定義使用哪一個Shell。
而第二行的 echo 代表列出一個字串,預設會把後面的字串「Hello World」顯示在螢幕上。
將test.sh存檔後,可以用下列其中一種方式執行它:
1、直接輸入 sh test.sh
2、改變test.sh的權限,加上可以執行的權限,
chmod a+x test.sh
接著直接執行它:
./test.sh
在Shell Script中,「#」表示註解,在#後面將視為註解並且被程式忽略。
例如:
#pwd
ls -l
Shell只會執行ls -l,而不會執行ls -l
而「;」 則代表指令的分隔,例如:
pwd;ls -l
和
pwd
ls -l
都是一樣執行pwd及ls -l。
二、變數的使用
在Shell Script中,所有的變數都視為字串,因此不需要在定義變數類型。
在Shell中定義和使用變數時並不一樣。
例如,定義一個變數id並且設定值為2013001,接著還要將印出變數的值:
id=2013001 -> 定義變數時前面不加「$」符號
echo $id -> 使用變數時前面要加「$」符號
注意,在等號的二邊不可以有空白,否則將出現錯誤。
再介紹一個範例:
dir=/home/oracle
ls $dir
這裡我們定義了變數dir的值為/home/oracle,接著用ls指令來印出變數dir,
此時指令會變為ls /home/oracle,所以就把目錄中所有檔案都列出來。
我們再來看一個例子,說明如何使用變數來定義變數:
$ tmppath=/tmp$ tmpfile=$tmppath/abc.txt$ echo $tmpfile
/tmp/abc.txt
我們也可以把指令的輸出傳回給變數,指令前後加上關鍵字「`」,
它是位於鍵盤左上角「數字鍵1」左邊的按鍵:
now=`date`
echo now
結果會秀出「Mon Dec 16 09:31:44 EAT 2013」
此外,雙引號與單引號字串對變數解釋有不同的意義,
如果是使用單引號,則變數會當成一般文字;雙引號才會解譯成變數,例如:
a=123
echo "$a" ->結果是123
echo '$a' ->結果是$a
Script也可以要求使用者輸入資料,利用read指令來讀取輸入的資料。如下:
#!/bin/sh
printf "Please input your name:"
read Name
echo "Your name is $Name"
由於echo指令內定會自動換行,所以我們使用printf這個指令來輸出字串。
我們將上述內容存成檔案test01.sh,接著執行它:
[root@oel62 test]# sh test01.sh
Please input your name: Job ->提示要輸入名字,此時輸入的是Job
Your name is Job
Shell Script有一些預設的特殊變數如下:
$? :表示上一個指令的離開狀況,一般指令正常離開會傳回 0。不正常離開則會傳回 1、2 等數值。
$1 :表示輸入的第一個參數,$2 則為第二個參數,依此類推。
$0 :shell script的檔名。
$@ :即代表 $1, $2,....直到所有參數結束。也就是說 $@ 代表了 "$1" "$2" "$3"....。
$* :所有參數無間隔的連在一起,成為單一個參數。也就是說 $* 代表了 "$1 $2 $3..."
三、運算符號
在 shell 中的四則運算必須使用 expr 這個指令來輔助。注意,在 + - * / 的二邊都有空白,如果沒有空白將產生錯誤:
expr 6 - 2
sum=`expr 10 + 20`
echo $sum
結果:
4
30
還有要特別注意的是乘號 * 。因為 * 有其他意義,所以要使用 \* 來代表。另外,也可以用 % 來求餘數。
count=`expr 9 \* 3`
echo $count
echo `expr $count % 3`
結果:
27
0
簡單的條件判斷是以 && 及 || 這二個符號來表示。
a && b如果 a 是真,則執行 b。如果 a 是假,則不執行 b。
a || b如果 a 是假,則執行 b。如果 a 是真,則不執行 b。
例如:
ls /home && echo YES
ls /dev/aaaa && echo YES
結果:
YES
ls: /dev/aaaa: No such file or directory
接著我們使用 test 及 [ 來做運算,運算所傳回的結果是真 (true) 或假 ( false)。
我們可以將它應用在條件判斷上。test 和 [ 都是一個指令,我們可以使用 test 並在其後加上參數來判斷真假。
或者也可以使用 [ 表達式 ] 來替代 test,要注意的是 [ ] 中的必須有空白間隔。
表達式說明如下:
-n str1 :如果字串 str1 的長度大於 0 則傳回 true。
-z str1 :如果字串 str1 的長度等於 0 則傳回 true。
str1 = str2 :如果字串str1等於字串str2則傳回 true,等號二邊有空白。
str1 != str2 :如果 str1 不等於 str2 則傳回 true。!= 的二邊有空白。
a -eq b :Equal,a 等於 b 則傳回真 (true)。
a -ne b :Not equal,a 不等於 b 則傳回真 (true)。
a -gt b :Grwater than,a 大於 b 則傳回真 (true)。
a -lt b :Less Than,a 小於 b 則傳回真 (true)。
a -ge b :Greater or equal,a 大於或等於 b 則傳回真 (true)。
a -le b :Less or equal,a 小於或等於 b 則傳回真 (true)。
我們舉例來說明:
test 5 -eq 5 && echo true
test abc!=cde && echo true
[ 6 -lt 10 ] && echo true
結果:
true
true
true
四、流程控制
1、if 的條件判斷
基本語法:
if condition-list
then list
elif condition-list
then list
else list
fi
範例:
if [ $1 = "aa" ]
then
echo "YES"
else
echo "NO"
fi
範例二:
$ ee test.sh
#!/bin/sh
if [ $1 -gt 10 ]
then echo " $1 is bigger then 10"
elif [ $1 -ge 0 ]
then echo " $1 is between 5 and 0. "
else echo "$1 is less then 0."
fi
2、while 及 until 迴圈
基本語法:
while condition-list
do list
done
until condition-list
do list
done
範例一:
#!/bin/sh
i=1
while [ $i -le 10 ]
do
echo $i
i=`expr $i + 1`
done
說明:首先令變數 i=1,接著在當i小於等於10執行迴圈的內容,而每次執行迴圈一次,則i加1。
範例二:
#!/bin/sh
i=1
until [ $i -gt 10 ]
do
echo $i
i=`expr $i + 1`
done
說明:首先令變數 i=1,接著迴圈會判斷,一直執行到i大於10才停止。
每跑一次迴圈就i就加1。
3、for 迴圈
基本語法:
for name in word1 word2 …
do do-list
done
for name
do do-list
done
範例一:
#!/bin/sh
for color_name in blue red green
do
echo $color_name
done
說明:這個Script中,會在每一次迴圈中將關鍵字in後面的字串分配給變數color_name,
然後印出變數 color。
4、case 判斷
基本語法:
case word in
pattern1) list1 ;;
pattern2) list2 ;;
…
esac
範例:
case $num1 in
1|2|3) echo $num1 is between 0~3;;
4|5|6|7) echo $num1 is between 4~7;;
8|9) echo $num1 is 8 or 9;;
*) echo $num1 is not on the list;;
esac
6、函式的運用
Shell Script中也可以使用函式 (function) 來將程式模組化。
基本語法:
name ( )
{
statement
}
函式有幾個要注意的地方:
A、在使用函式之前一定要先定義它,也就是在一個 Shell Script 中,一定要先寫函式的內容,
在函式之後再寫一般的程式部份。
B、在Script中的變數全部都是全域變數 (Global),所以函式中的變數會影響函式之外的其他部份。
C、在命令列中輸入的參數是以 $1,$2來讀取,但是這些參數並沒有辦法在函式中使用。
傳給函式的方法和在命令列中一樣,例如:[函式名稱] arg1 arg2..。
傳進函式的變數一樣會以 $1,$2來儲存並使用。
範例:
addnum1 ( )
{
echo 'Function $1 is' $1
echo 'Function $2 is' $2
}
echo 'Command $1 is' $1
echo 'Command $2 is' $2
a=`expr $1 + 10`
b=`expr $2 + 10`
addnum1 $a $b
程式執行:
[root@oel62 test]# ./test01.sh 2 3
結果:
Command $1 is 2
Command $2 is 3
Function $1 is 12
Function $2 is 13
在許多的情況之下,我們都需要固定一組可以重覆或判斷資訊的指令,
而把這些指令存被在文字檔中,再交由Shell執行,就是Script。
一般會將Shell Script的副檔名命名為.sh,雖然副檔名在Linux中並非必要,
但是有副檔名可以讓我們更容易管理這些檔案。
假設有一個名為test.sh 的 Shell Script,首先用文字編輯器來撰寫內容如下:
#!/bin/bash
echo Hello World
第一行是必需的,它是用來定義你要使用的 shell。Linux中有許多的Shell可以使用,
如:ksh、bash,但是彼此之間語法有所差異,所以我們首先需要定義使用哪一個Shell。
而第二行的 echo 代表列出一個字串,預設會把後面的字串「Hello World」顯示在螢幕上。
將test.sh存檔後,可以用下列其中一種方式執行它:
1、直接輸入 sh test.sh
2、改變test.sh的權限,加上可以執行的權限,
chmod a+x test.sh
接著直接執行它:
./test.sh
在Shell Script中,「#」表示註解,在#後面將視為註解並且被程式忽略。
例如:
#pwd
ls -l
Shell只會執行ls -l,而不會執行ls -l
而「;」 則代表指令的分隔,例如:
pwd;ls -l
和
pwd
ls -l
都是一樣執行pwd及ls -l。
二、變數的使用
在Shell Script中,所有的變數都視為字串,因此不需要在定義變數類型。
在Shell中定義和使用變數時並不一樣。
例如,定義一個變數id並且設定值為2013001,接著還要將印出變數的值:
id=2013001 -> 定義變數時前面不加「$」符號
echo $id -> 使用變數時前面要加「$」符號
注意,在等號的二邊不可以有空白,否則將出現錯誤。
再介紹一個範例:
dir=/home/oracle
ls $dir
這裡我們定義了變數dir的值為/home/oracle,接著用ls指令來印出變數dir,
此時指令會變為ls /home/oracle,所以就把目錄中所有檔案都列出來。
我們再來看一個例子,說明如何使用變數來定義變數:
$ tmppath=/tmp$ tmpfile=$tmppath/abc.txt$ echo $tmpfile
/tmp/abc.txt
我們也可以把指令的輸出傳回給變數,指令前後加上關鍵字「`」,
它是位於鍵盤左上角「數字鍵1」左邊的按鍵:
now=`date`
echo now
結果會秀出「Mon Dec 16 09:31:44 EAT 2013」
此外,雙引號與單引號字串對變數解釋有不同的意義,
如果是使用單引號,則變數會當成一般文字;雙引號才會解譯成變數,例如:
a=123
echo "$a" ->結果是123
echo '$a' ->結果是$a
Script也可以要求使用者輸入資料,利用read指令來讀取輸入的資料。如下:
#!/bin/sh
printf "Please input your name:"
read Name
echo "Your name is $Name"
由於echo指令內定會自動換行,所以我們使用printf這個指令來輸出字串。
我們將上述內容存成檔案test01.sh,接著執行它:
[root@oel62 test]# sh test01.sh
Please input your name: Job ->提示要輸入名字,此時輸入的是Job
Your name is Job
Shell Script有一些預設的特殊變數如下:
$? :表示上一個指令的離開狀況,一般指令正常離開會傳回 0。不正常離開則會傳回 1、2 等數值。
$1 :表示輸入的第一個參數,$2 則為第二個參數,依此類推。
$0 :shell script的檔名。
$@ :即代表 $1, $2,....直到所有參數結束。也就是說 $@ 代表了 "$1" "$2" "$3"....。
$* :所有參數無間隔的連在一起,成為單一個參數。也就是說 $* 代表了 "$1 $2 $3..."
三、運算符號
在 shell 中的四則運算必須使用 expr 這個指令來輔助。注意,在 + - * / 的二邊都有空白,如果沒有空白將產生錯誤:
expr 6 - 2
sum=`expr 10 + 20`
echo $sum
結果:
4
30
還有要特別注意的是乘號 * 。因為 * 有其他意義,所以要使用 \* 來代表。另外,也可以用 % 來求餘數。
count=`expr 9 \* 3`
echo $count
echo `expr $count % 3`
結果:
27
0
簡單的條件判斷是以 && 及 || 這二個符號來表示。
a && b如果 a 是真,則執行 b。如果 a 是假,則不執行 b。
a || b如果 a 是假,則執行 b。如果 a 是真,則不執行 b。
例如:
ls /home && echo YES
ls /dev/aaaa && echo YES
結果:
YES
ls: /dev/aaaa: No such file or directory
接著我們使用 test 及 [ 來做運算,運算所傳回的結果是真 (true) 或假 ( false)。
我們可以將它應用在條件判斷上。test 和 [ 都是一個指令,我們可以使用 test 並在其後加上參數來判斷真假。
或者也可以使用 [ 表達式 ] 來替代 test,要注意的是 [ ] 中的必須有空白間隔。
表達式說明如下:
-n str1 :如果字串 str1 的長度大於 0 則傳回 true。
-z str1 :如果字串 str1 的長度等於 0 則傳回 true。
str1 = str2 :如果字串str1等於字串str2則傳回 true,等號二邊有空白。
str1 != str2 :如果 str1 不等於 str2 則傳回 true。!= 的二邊有空白。
a -eq b :Equal,a 等於 b 則傳回真 (true)。
a -ne b :Not equal,a 不等於 b 則傳回真 (true)。
a -gt b :Grwater than,a 大於 b 則傳回真 (true)。
a -lt b :Less Than,a 小於 b 則傳回真 (true)。
a -ge b :Greater or equal,a 大於或等於 b 則傳回真 (true)。
a -le b :Less or equal,a 小於或等於 b 則傳回真 (true)。
我們舉例來說明:
test 5 -eq 5 && echo true
test abc!=cde && echo true
[ 6 -lt 10 ] && echo true
結果:
true
true
true
四、流程控制
1、if 的條件判斷
基本語法:
if condition-list
then list
elif condition-list
then list
else list
fi
範例:
if [ $1 = "aa" ]
then
echo "YES"
else
echo "NO"
fi
範例二:
$ ee test.sh
#!/bin/sh
if [ $1 -gt 10 ]
then echo " $1 is bigger then 10"
elif [ $1 -ge 0 ]
then echo " $1 is between 5 and 0. "
else echo "$1 is less then 0."
fi
2、while 及 until 迴圈
基本語法:
while condition-list
do list
done
until condition-list
do list
done
範例一:
#!/bin/sh
i=1
while [ $i -le 10 ]
do
echo $i
i=`expr $i + 1`
done
說明:首先令變數 i=1,接著在當i小於等於10執行迴圈的內容,而每次執行迴圈一次,則i加1。
範例二:
#!/bin/sh
i=1
until [ $i -gt 10 ]
do
echo $i
i=`expr $i + 1`
done
說明:首先令變數 i=1,接著迴圈會判斷,一直執行到i大於10才停止。
每跑一次迴圈就i就加1。
3、for 迴圈
基本語法:
for name in word1 word2 …
do do-list
done
for name
do do-list
done
範例一:
#!/bin/sh
for color_name in blue red green
do
echo $color_name
done
說明:這個Script中,會在每一次迴圈中將關鍵字in後面的字串分配給變數color_name,
然後印出變數 color。
4、case 判斷
基本語法:
case word in
pattern1) list1 ;;
pattern2) list2 ;;
…
esac
範例:
case $num1 in
1|2|3) echo $num1 is between 0~3;;
4|5|6|7) echo $num1 is between 4~7;;
8|9) echo $num1 is 8 or 9;;
*) echo $num1 is not on the list;;
esac
6、函式的運用
Shell Script中也可以使用函式 (function) 來將程式模組化。
基本語法:
name ( )
{
statement
}
函式有幾個要注意的地方:
A、在使用函式之前一定要先定義它,也就是在一個 Shell Script 中,一定要先寫函式的內容,
在函式之後再寫一般的程式部份。
B、在Script中的變數全部都是全域變數 (Global),所以函式中的變數會影響函式之外的其他部份。
C、在命令列中輸入的參數是以 $1,$2來讀取,但是這些參數並沒有辦法在函式中使用。
傳給函式的方法和在命令列中一樣,例如:[函式名稱] arg1 arg2..。
傳進函式的變數一樣會以 $1,$2來儲存並使用。
範例:
addnum1 ( )
{
echo 'Function $1 is' $1
echo 'Function $2 is' $2
}
echo 'Command $1 is' $1
echo 'Command $2 is' $2
a=`expr $1 + 10`
b=`expr $2 + 10`
addnum1 $a $b
程式執行:
[root@oel62 test]# ./test01.sh 2 3
結果:
Command $1 is 2
Command $2 is 3
Function $1 is 12
Function $2 is 13
ifive mini root說明及下載
記得要開啟USB偵錯模式,再將ifive mini關機,按下menu鍵後插入usb,會開機到安全模式(左下角會出現)
此時我的裝置會出現一個ifive的問號裝置,再安裝驅動程式。
官網下載的驅動程式是USB Storage(外接磁碟)的驅動程式,不是ADB Interface的驅動程式。
ADB_USB_Driver內的驅動程式是我自己從Windows資料夾內複製出來的,不確定能不能成功。
安裝「碗豆莢」可以正確地判斷並下載所需要的驅動程式。
接著直接執行 ROOT.exe,再按下 1 就可以了。
ROOT.exe 會使用ADB來破解及上傳程式,所以驅動程式一定要裝起來。
此破解非專門破解ifive mini,而是針對 RK3066 的 CPU 來破解。
下載的地址:
https://mega.co.nz/#!sIsDkTTQ!FfpgpkQeWSFBVLhI9F6OHgvMVaU1EpdDMk9HN5JIYJY
此時我的裝置會出現一個ifive的問號裝置,再安裝驅動程式。
官網下載的驅動程式是USB Storage(外接磁碟)的驅動程式,不是ADB Interface的驅動程式。
ADB_USB_Driver內的驅動程式是我自己從Windows資料夾內複製出來的,不確定能不能成功。
安裝「碗豆莢」可以正確地判斷並下載所需要的驅動程式。
接著直接執行 ROOT.exe,再按下 1 就可以了。
ROOT.exe 會使用ADB來破解及上傳程式,所以驅動程式一定要裝起來。
此破解非專門破解ifive mini,而是針對 RK3066 的 CPU 來破解。
下載的地址:
https://mega.co.nz/#!sIsDkTTQ!FfpgpkQeWSFBVLhI9F6OHgvMVaU1EpdDMk9HN5JIYJY
Post Clone EBS時,執行adcfgclone.pl dbTier 發生了錯誤
今天在Clone EBS到測試機時,在DB先執行adautocfg.sh及adpreclone.pl,結果發現測試機上面剩餘空間不足,
所以新增了小容量的undo tablespace,並把原來的undo tablespace刪除,以減少使用空間。
複製所有的檔案之後,在DB執行adcfgclone.pl時發生了錯誤,查詢log之後發現下列的錯誤:
adcrdb.sh started at Sun Dec 15 07:12:10 EAT 2013
…略
SQL*Plus: Release 9.2.0.7.0 - Production on Sun Dec 15 07:12:10 2013
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.
ORACLE instance shut down.
Connected to an idle instance.
ORACLE instance started.
Total System Global Area 598699744 bytes
Fixed Size 736992 bytes
Variable Size 419430400 bytes
Database Buffers 167772160 bytes
Redo Buffers 10760192 bytes
CREATE CONTROLFILE REUSE SET DATABASE "CLONE"
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file '/erptest/clonedata/UNDOTBS06.dbf'
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
…略
UNDOTBS06.dbf是舊有的undo tablespaces的Datafile,但是已經刪除了,
所以猜想應該是腳本其他地方錯誤的緣故。先檢查init<SID>.ora,內容是正確的,
接著在重新檢查log檔發會在執行adcrdb.sh時錯誤,再檢查該Script內容,
得知它會執行adcrdbclone.sql,而部份內容如下:
…略
'/erptest/clonedata/UNDOTBS06.dbf',
…略
就是這裡發生了錯誤,將UNDOTBS06.dbf改成正確的UNDO Datafile名稱之後,
重新執行adcrdb.sh,結果還是出現了錯誤如下:
ORA-01503: CREATE CONTROLFILE failed
ORA-01223: RESETLOGS must be specified to set a new database name
再修改一次adcrdbclone.sql,增加關鍵字RESETLOGS如下:
…略
CREATE CONTROLFILE REUSE SET DATABASE "CLONE" resetlogs
…略
再重新執行adcrdb.sh,這次就成功了啟動DB了。接著往下執行APP的部份就好了。
所以新增了小容量的undo tablespace,並把原來的undo tablespace刪除,以減少使用空間。
複製所有的檔案之後,在DB執行adcfgclone.pl時發生了錯誤,查詢log之後發現下列的錯誤:
adcrdb.sh started at Sun Dec 15 07:12:10 EAT 2013
…略
SQL*Plus: Release 9.2.0.7.0 - Production on Sun Dec 15 07:12:10 2013
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to an idle instance.
ORACLE instance shut down.
Connected to an idle instance.
ORACLE instance started.
Total System Global Area 598699744 bytes
Fixed Size 736992 bytes
Variable Size 419430400 bytes
Database Buffers 167772160 bytes
Redo Buffers 10760192 bytes
CREATE CONTROLFILE REUSE SET DATABASE "CLONE"
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file '/erptest/clonedata/UNDOTBS06.dbf'
ORA-27037: unable to obtain file status
HP-UX Error: 2: No such file or directory
Additional information: 3
…略
UNDOTBS06.dbf是舊有的undo tablespaces的Datafile,但是已經刪除了,
所以猜想應該是腳本其他地方錯誤的緣故。先檢查init<SID>.ora,內容是正確的,
接著在重新檢查log檔發會在執行adcrdb.sh時錯誤,再檢查該Script內容,
得知它會執行adcrdbclone.sql,而部份內容如下:
…略
'/erptest/clonedata/UNDOTBS06.dbf',
…略
就是這裡發生了錯誤,將UNDOTBS06.dbf改成正確的UNDO Datafile名稱之後,
重新執行adcrdb.sh,結果還是出現了錯誤如下:
ORA-01503: CREATE CONTROLFILE failed
ORA-01223: RESETLOGS must be specified to set a new database name
再修改一次adcrdbclone.sql,增加關鍵字RESETLOGS如下:
…略
CREATE CONTROLFILE REUSE SET DATABASE "CLONE" resetlogs
…略
再重新執行adcrdb.sh,這次就成功了啟動DB了。接著往下執行APP的部份就好了。
快速備份相簿到行動硬碟
下面是我在Win7下寫的一個簡單的批次檔,目的是將本機的相簿複製到2.5吋行動硬碟上,
因為每次都用複製貼上太浪費時間與資源,相片越來越多,複製也越來越慢,
所以使用Win7底下的差異性備份,只把新增的相片複製起來,已經複製過的就不再重覆,
如此每次備份相簿不到5分鐘,與之前每次全備份時要花費4個多小時,省時太多了,
加上行動硬碟不必浪費做多餘的寫入,使用壽命也會增加不少!
Photo_BK.bat的內容如下(用記事本把下列三行複製上去,再存成Photo_BK.bat):
@echo Off
robocopy F:\生活照片庫\photo G:\photo /e /xo /NJH
pause
說明:
F:\生活照片庫\photo是電腦上放相簿的資料夾
G:\photo 是行動硬碟插入USB後會掛載的磁碟代號及資料夾
/E 複製子目錄,包括空的子目錄
/XO 排除較舊的的檔案
/NJH 畫面上不會秀出工作標頭
只要一行就可以達到差異性的備份,而且還會顯示進度,結束備份時畫面會暫停,
此時只要按下空白鍵就可以結束。
因為每次都用複製貼上太浪費時間與資源,相片越來越多,複製也越來越慢,
所以使用Win7底下的差異性備份,只把新增的相片複製起來,已經複製過的就不再重覆,
如此每次備份相簿不到5分鐘,與之前每次全備份時要花費4個多小時,省時太多了,
加上行動硬碟不必浪費做多餘的寫入,使用壽命也會增加不少!
Photo_BK.bat的內容如下(用記事本把下列三行複製上去,再存成Photo_BK.bat):
@echo Off
robocopy F:\生活照片庫\photo G:\photo /e /xo /NJH
pause
說明:
F:\生活照片庫\photo是電腦上放相簿的資料夾
G:\photo 是行動硬碟插入USB後會掛載的磁碟代號及資料夾
/E 複製子目錄,包括空的子目錄
/XO 排除較舊的的檔案
/NJH 畫面上不會秀出工作標頭
只要一行就可以達到差異性的備份,而且還會顯示進度,結束備份時畫面會暫停,
此時只要按下空白鍵就可以結束。
SHS-1320電子鎖,自製手機及吊飾RFID感應卡開門
因為SHS-1320電子鎖的RFID感應相容Mifare,所以到網上買了電子標籤及晶片線圈兩種。
晶片線圈一組不到50元,電子標籤加一片手機吸波片一組不到100元。
電子標籤就像紙一樣的薄,也相容Mifare,我想可以用在很多地方。
我把晶片線圈放到青蛙吊飾的裡面,再用針線把下面的開口縫起來,才不會掉出來。
接著把青蛙登錄到電子鎖內,吊飾就可以拿來感應開門了。
把青蛙掛在鑰匙圈或包包上比傳統感應卡可愛多了,也不易被察覺這是感應卡。
由於電子標籤非常的簿,所以我把電子標籤貼在手機後殼內,但是手機會干擾到感應。
我試了幾種方法都無法開門,所以要加裝一片吸波片(黑色的部份),這樣就大功告成。
雖然不是真正用手機來遙控開門,但是還是滿足了我用手機開門的想法。
晶片線圈一組不到50元,電子標籤加一片手機吸波片一組不到100元。
電子標籤就像紙一樣的薄,也相容Mifare,我想可以用在很多地方。
這個已經被我把電子標籤黏在吸波片了,因為不易撕下來,所以沒辦法單獨拍照
晶片線圈,一定要有晶片,只有線圈是沒有感應資料
我把晶片線圈放到青蛙吊飾的裡面,再用針線把下面的開口縫起來,才不會掉出來。
接著把青蛙登錄到電子鎖內,吊飾就可以拿來感應開門了。
把青蛙掛在鑰匙圈或包包上比傳統感應卡可愛多了,也不易被察覺這是感應卡。
由於電子標籤非常的簿,所以我把電子標籤貼在手機後殼內,但是手機會干擾到感應。
我試了幾種方法都無法開門,所以要加裝一片吸波片(黑色的部份),這樣就大功告成。
雖然不是真正用手機來遙控開門,但是還是滿足了我用手機開門的想法。
吸波片要放在電子標籤與手機之間,所以電子標籤的面要朝向後殼
2014年防毒軟體排名
這是ToTopTenREVIEWS網站上公佈的2014年防毒軟體排名的前25名,雖然都是付費版的排名,
但是有部份的防毒軟體有提供免費版下載,當然免費版本可能會少了一些功能。
下面是排名前10名的付費版防毒軟體,可供參考
想了解更多排名及細節,可以按這裡前往ToTopTenREVIEWS
NO.1:Bitdefender Antivirus Plus(下載免費版)
NO.2:Kaspersky Anti-Virus
NO.3:Norton AntiVirus
NO.4:F-Secure Anti-Virus
NO.5: AVG Anti-Virus(下載免費版)
NO.6: BullGuard Antivirus
NO.7: G Data Antivirus
NO.8: Panda Antivirus Pro
NO.9: Avast! Pro AntiVirus(下載免費版)
NO.10: McAfee AntiVirus Plus
我自已常用的小紅傘(Avira Antivirus)排在第14名。
但是有部份的防毒軟體有提供免費版下載,當然免費版本可能會少了一些功能。
下面是排名前10名的付費版防毒軟體,可供參考
想了解更多排名及細節,可以按這裡前往ToTopTenREVIEWS
NO.1:Bitdefender Antivirus Plus(下載免費版)
NO.2:Kaspersky Anti-Virus
NO.3:Norton AntiVirus
NO.4:F-Secure Anti-Virus
NO.5: AVG Anti-Virus(下載免費版)
NO.6: BullGuard Antivirus
NO.7: G Data Antivirus
NO.8: Panda Antivirus Pro
NO.9: Avast! Pro AntiVirus(下載免費版)
NO.10: McAfee AntiVirus Plus
我自已常用的小紅傘(Avira Antivirus)排在第14名。
螢幕的解析度調的太高,畫面全黑
今天有朋友問不小心把螢幕的解析度調的太高,而且又不知道按了哪一個按鍵,以致現在整個畫面都是黑色的,
什麼畫面都看不見,要怎麼辦?
我記得我之前也有過這樣的經驗,印象中是重開機後一直按F8,進入安全模式後,再把解析度設定回復過重開機就好了。
什麼畫面都看不見,要怎麼辦?
我記得我之前也有過這樣的經驗,印象中是重開機後一直按F8,進入安全模式後,再把解析度設定回復過重開機就好了。
電子感應密碼鎖 SHS-1320
電子鎖已經裝了快兩年了,當初直接在拍賣網以三千多元買的,但是是我自己安裝的。
因為門上原本就有一個輔助鎖,加上SHS-1320的鎖體是外掛式,所以只有鑽幾個小孔就可以了。
設定上也不會很複雜,只要照著說明書上的步驟就可以了。
當初只有附三個感應卡,所以又在網上再買了幾個相容Mifare的方型及圓型感應卡,一個約25元。
感應卡是RFID,不是磁卡,所以造型可以有多樣變化,普通圓型的大概只有10元硬幣大小。
當然並不是有感應卡就可以使用了,還是要登錄作業,這部份照著說明書上的設定即可。
到目前換過兩次電池,不過並非它提示電量不足,而是我自己覺得聲音變小了,
加上安裝的是4顆充電電池,就把電池拿出來充電再放回去。
使用上到目前沒有什麼問題,到超商繳費或倒垃圾時,就不用帶鑰匙出門(用密碼開門)。
出門也不用怕忘了鎖門(我是設定關門自動上鎖,上鎖後會有聲音提示)。
至於萬一沒電的時候呢,我有拿一顆9V的方型電池,關門後再把電池全部拿下來,
直接將9V的電池接在感應區下面的緊急供電孔,就可以用密碼或感應卡開門了。
現在唯一的問題是IC如果故障的話,那大概只能破壞門了吧!
(所以考慮再過幾年後就換新的電子鎖比較保險吧!)
Samsung SHS-1320特色:
感應相容Mifare、悠遊卡
可登錄20組感應卡
密碼可輸入5~12個數字若密碼三次輸入錯誤時警報音會響起且一分鐘內無法操作的安全機制
強制鎖功能,從外部將無法開門,試圖開門時警報器將會響起
電力不足警示音,若電力只剩約一週時,電力不足會有警示音提醒更換電池
若欲以破壞大門或以非正常方式強行開鎖警報音將會響
關門後自動/手動上鎖的功能切換
火災警報功能,若室內溫度高達55度警報音將會響
外部緊急供電功能(9V電池操作)
電力來源為4顆3號鹼性電池
因為門上原本就有一個輔助鎖,加上SHS-1320的鎖體是外掛式,所以只有鑽幾個小孔就可以了。
設定上也不會很複雜,只要照著說明書上的步驟就可以了。
當初只有附三個感應卡,所以又在網上再買了幾個相容Mifare的方型及圓型感應卡,一個約25元。
感應卡是RFID,不是磁卡,所以造型可以有多樣變化,普通圓型的大概只有10元硬幣大小。
當然並不是有感應卡就可以使用了,還是要登錄作業,這部份照著說明書上的設定即可。
到目前換過兩次電池,不過並非它提示電量不足,而是我自己覺得聲音變小了,
加上安裝的是4顆充電電池,就把電池拿出來充電再放回去。
使用上到目前沒有什麼問題,到超商繳費或倒垃圾時,就不用帶鑰匙出門(用密碼開門)。
出門也不用怕忘了鎖門(我是設定關門自動上鎖,上鎖後會有聲音提示)。
至於萬一沒電的時候呢,我有拿一顆9V的方型電池,關門後再把電池全部拿下來,
直接將9V的電池接在感應區下面的緊急供電孔,就可以用密碼或感應卡開門了。
現在唯一的問題是IC如果故障的話,那大概只能破壞門了吧!
(所以考慮再過幾年後就換新的電子鎖比較保險吧!)
Samsung SHS-1320特色:
感應相容Mifare、悠遊卡
可登錄20組感應卡
密碼可輸入5~12個數字若密碼三次輸入錯誤時警報音會響起且一分鐘內無法操作的安全機制
強制鎖功能,從外部將無法開門,試圖開門時警報器將會響起
電力不足警示音,若電力只剩約一週時,電力不足會有警示音提醒更換電池
若欲以破壞大門或以非正常方式強行開鎖警報音將會響
關門後自動/手動上鎖的功能切換
火災警報功能,若室內溫度高達55度警報音將會響
外部緊急供電功能(9V電池操作)
電力來源為4顆3號鹼性電池
這是我買的感應卡
測試網站是否被中國大陸封鎖
中國大陸有實施Great FireWall(GFW),所以網站有可能會被GFW萬里長城防火牆給封鎖。
結果就是對岸人民無法瀏覽到被封鎖的網站,當然他們仍有其他方法可以破解 ,
但是對於一般人民也許就沒有機會看到這些網站。
所以下面有三個網址可以檢測自己的網站是否有被中國大陸的GFW給封鎖住:
網址1:http://www.websitepulse.com/help/testtools.china-test.html
在「Enter Test Website」輸入要檢測的網址後,如:http://lyhpcha.blogspot.tw
然後選擇上海(Shanghai)、北京(Beijing)、廣州(Guaugzhou)、香港(Hong Kong)之一
「Select Non-Chinese Location」是指其他非中國地區的城市,如不檢測就把勾勾拿掉就可以。
最後按下「Perform Test」,等待一小段時間,結果就出來了。
下圖是檢測後,沒有被北京封鎖的結果。
下圖以痞客邦的Blog檢測後,被封鎖的結果(右半部是New York紐約的檢測結果)
網址2:https://zh.greatfire.org/
輸入網址後按「搜索」,等待一小段時間就可以知道結果
如下面兩張圖片,綠色表示沒有被封鎖,另一個則是被封鎖
網址3:https://autoproxy2pac.appspot.com/gfwtest
輸入網址後按鍵盤的Enter,等一下就可以知道結果
如下面兩張圖片,第一張圖表示沒有被封鎖,第二張則是被封鎖
結果就是對岸人民無法瀏覽到被封鎖的網站,當然他們仍有其他方法可以破解 ,
但是對於一般人民也許就沒有機會看到這些網站。
所以下面有三個網址可以檢測自己的網站是否有被中國大陸的GFW給封鎖住:
網址1:http://www.websitepulse.com/help/testtools.china-test.html
在「Enter Test Website」輸入要檢測的網址後,如:http://lyhpcha.blogspot.tw
然後選擇上海(Shanghai)、北京(Beijing)、廣州(Guaugzhou)、香港(Hong Kong)之一
「Select Non-Chinese Location」是指其他非中國地區的城市,如不檢測就把勾勾拿掉就可以。
最後按下「Perform Test」,等待一小段時間,結果就出來了。
下圖是檢測後,沒有被北京封鎖的結果。
下圖以痞客邦的Blog檢測後,被封鎖的結果(右半部是New York紐約的檢測結果)
網址2:https://zh.greatfire.org/
輸入網址後按「搜索」,等待一小段時間就可以知道結果
如下面兩張圖片,綠色表示沒有被封鎖,另一個則是被封鎖
網址3:https://autoproxy2pac.appspot.com/gfwtest
輸入網址後按鍵盤的Enter,等一下就可以知道結果
如下面兩張圖片,第一張圖表示沒有被封鎖,第二張則是被封鎖
便攜式無線AP,Celleden Map1600簡易設定
因為家裡最高的樓層收不到TP-Link無線AP的訊號,但又不是每天都需要無線網路,
加上之前出遊住旅館時,拿筆電蹲在地上上網的糗樣。也不想花錢辦手機上網,
所以決定買一台便攜式無線AP,考慮多款AP之後,選擇價格很便宜的Celleden Map 1600。
這款AP是中國大陸製造的,可惜沒有內建充電池,但是體積不大,攜帶方便,設定也很簡單。
Celleden 150M 迷你型 無線WIFI分享器規格:
尺寸:9 x 7.1 x 2.3 cm
WLAN Port:10/100MB x 1
WIFI:支持IEEE802.11b/g/n,傳輸速率最高150Mbps
預設IP:192.168.2.1
預設無線密碼:12345678
接上網路線後就可以預設值來使用,搜尋無線網路並輸入預設密碼之後,
開啟IE或瀏覽器,輸入:http://192.168.2.1,開啟Web管理介面。輸入預設密碼:admin
如果上網需要以PPPoE撥號的話,就選擇「ADSL撥號」,再輸入帳號及密碼;
如果只要接上網路線就可以上網則選擇「自動獲取」,以DHCP獲取IP。
「無線加密」的部份,預設是12345678,可以改成自己想要的密碼。
接著按下「確定」就可以了。
以上是簡易設定,很快就可以設定好無線AP來使用,非常方便。
但是Map 1600還有進階功能,可以設定IP、流量、路由等功能。
加上之前出遊住旅館時,拿筆電蹲在地上上網的糗樣。也不想花錢辦手機上網,
所以決定買一台便攜式無線AP,考慮多款AP之後,選擇價格很便宜的Celleden Map 1600。
這款AP是中國大陸製造的,可惜沒有內建充電池,但是體積不大,攜帶方便,設定也很簡單。
Celleden 150M 迷你型 無線WIFI分享器規格:
尺寸:9 x 7.1 x 2.3 cm
WLAN Port:10/100MB x 1
WIFI:支持IEEE802.11b/g/n,傳輸速率最高150Mbps
預設IP:192.168.2.1
預設無線密碼:12345678
開啟IE或瀏覽器,輸入:http://192.168.2.1,開啟Web管理介面。輸入預設密碼:admin
如果上網需要以PPPoE撥號的話,就選擇「ADSL撥號」,再輸入帳號及密碼;
如果只要接上網路線就可以上網則選擇「自動獲取」,以DHCP獲取IP。
「無線加密」的部份,預設是12345678,可以改成自己想要的密碼。
接著按下「確定」就可以了。
以上是簡易設定,很快就可以設定好無線AP來使用,非常方便。
但是Map 1600還有進階功能,可以設定IP、流量、路由等功能。
新勁戰三代置物箱
剛好有朋友要看新勁戰的置物箱,所以順道就上傳上來,我放的是原廠的3/4罩的安全帽,
但是要把面罩的部份放在前面,這樣座墊才能順利關上,相反的話就會關不上去。
而且安全帽與座墊幾乎是貼近的,所以安全帽下面是沒有辦法再放雨衣的。
新勁戰的置物箱空間還蠻大的,如果像我不放安全帽的話,能放的東西其實也不少。
但是要把面罩的部份放在前面,這樣座墊才能順利關上,相反的話就會關不上去。
而且安全帽與座墊幾乎是貼近的,所以安全帽下面是沒有辦法再放雨衣的。
新勁戰的置物箱空間還蠻大的,如果像我不放安全帽的話,能放的東西其實也不少。
JInitiator是不能在IE 64bit上執行
我們的EBS 11i是用 jinitiator + Sum JAVA 6的jvm.dll,有同事反應他的是IE9,Win7 64bit作業系統,
今天突然沒有辦法進入ERP系統,但是直到昨天都還是正常的。
查了一下IE的安全性設定,是正確的,也確認jinitiator是ok的,最後發現是IE9 64bit的關係,改回IE 32bit就可以了。
只是比較奇怪的是,他的開始功能表上的IE64及IE全都是指向64bit的IE。
但是他並沒有更改過設定,而且只要把IE 32bit捷徑拉到開始列上就會自動變成IE 64bit的捷徑。
.png)
所以直接從C:\Program Files (x86)\Internet Explorer\ieplore.exe 拉出一個捷徑到桌面上。
可以從IE的「關於Internet Explorer」知道目前IE執行的版本。
.png)
.png)
訂閱:
文章 (Atom)

-
在電腦版的Line輸入文字時,遇到需要換行的情形時,我都是用記事本先寫好再複製上去,這樣就可以有換行的效果,可是這樣的做法好像失去Line的便利性。 於是查了一下,原來有一個設定可以指定Enter換行,而不是發訊息出去。 完成設定之後,要發送訊息就改用Al...
-
Windows7 / Windows8 kill process Linux下要刪除某個程序通常會使用 ps 配合 kill 來刪除程序。 例如:ps -ef |grep [PROCESS NAME] kill -9 [PID] 在Windows下,通常是...
-
Excel有許多實用的公式,善用這些公式可以達成大部份的功能,但是萬一公式無法滿足需求時,可以自訂公式來解決。 自訂公式其實就是自訂函數,先開啟Visual Basic(VBA) 新增一個「模組」 ...