Excel 陣列使用簡單說明

假設我自今天想要計算出總計,可以新新增合計欄位,計算出單重*數量,
再以SUM()函數計算出總計


上述的方法固然可行,但是需要增加一欄,Excel有另一個陣列的方式來解決,
Excel支援陣列(同時按下Shift + Ctrl + Enter三個銨鍵),會在公式的最面/最後加上 「{」/ 「}」,
上面的列子可以改寫成成 {=SUM(F9:F11*G9:G11)},其最後的答案也是1950。

 {=SUM(F9:F11*G9:G11)} 是指F9:F11的三個元素與G9:G11的三個元素互想相乘後再以SUM()加總,
也就是說F9*G9、F10*G10、F11*G11,各別相對應的元素計算完成後,再加總出一個答案

Excel VBA 取得陣列的個數

使用  UBound( ) 函數可以得知陣列的個數,如下:

'宣告陣列
Dim ay_temp01() As Variant
    ay_tem01 = Array("JOHN", "MAY", "LEE")

'取得陣列個數,因為陣列由0開始,所以數量需要加1
Dim temp01 as Integer
temp01=UBound(ay_temp01) + 1

'可以配合LBound( )函數來組成廻圈,取得出陣列每一個元素
Dim a,b as Integer
Dim show_text as String
'陣列重0開始編號,所以不用加 1 
For a LBound(ay_temp01) To UBound(ay_temp01)
    b=msgbox(ay_temp01(a),vbOKonly)
next a

Excel VBA的錯誤:Class Range的Select方法失敗

Excel VBA在測試執行時,出現了下列的錯誤訊息:
「執行階段錯誤'1004':Class Range的Select方法失敗」

錯誤的地方如下:
Workbooks("測試.xls").Sheets("TEST02).Activate
…略
Sheets("TEST01").Range("C8").Copy
Sheets("TEST01").Range("D8").Select
ActiveSheet.Paste
Application.CutCopyMode = False
  
其實不是語法有錯誤,而是因為有使用複製貼上的功能,但是沒有指定正確的Sheets,
因為目前activate是TEST02,但是指定要貼上的是TEST01,只要在Copy之前加上
Workbooks("測試.xls").Sheets("TEST01).Activate就可以解決了。


「看門狗」PC版36項修改器

最近都在玩「看門狗」的PC遊戲,遊戲的內容讓我感到很興趣,主要在說一個幾乎所有的裝置,
如手機、監視器、交通系統、電腦、ATM、電氣控制箱…等能與網路連線的裝置都整合成ctOS系統,
由單一系統就可以管理與監控,而主角就是一名駭客與私法制裁者,藉由系統漏洞取得控制權,
並且藉此以私法制裁罪犯與報復傷害主角家人的幫派成員。

其實ctOS就是雲端系統的應用,把整個城市當成是一部超大型電腦,有授權就可以取得想要的資料,
這樣的雲端系統可以非常有效地分配資源及共享資料,當然也可以快速反應問題與解決問題,
例如遊戲中可以找到有系統漏洞的電氣箱,讓它過載而爆炸而停電,但是只有一小部份的時間,
系統會自動搜尋備援機制而恢復供電。

反觀來說,如此龐大複雜的系統,會存在許多的漏洞(bug),否則主角也無法輕易入侵到ctOS的系統,
而事實上也是如此,就現今所有的系統,沒有一個是完全沒有漏洞,只有多或少,影響大不大的問題,
就像最近的OpenSSL的漏洞已存在數年了,直到最近才爆出來,但是不表示這些年內沒有人知道這個漏洞。

我的心得:
1、機車比汽車好用多了,尤其在逃離追緝或是趕到目的地的時候,而且高速撞車時會飛出去。
2、聲音實在太小了,我有參考網友的設定,雖然比較大聲了,但是還是蠻小聲的。
3、有水的地方或捷運實在是逃跑最佳選擇。
4、榴彈槍可以一槍解決罪犯車隊,如果目標是要被除掉的話。
5、路上的蒸氣管、可以昇起的橋與路障,善用的話可以很快讓罪犯車隊停下來。
6、電腦的配備要很好,像我就只是把特效全關了,解析度也只有1024x768
7、消音管的槍如特戰1911,侵入ctOS主機與幫派據點都好用,在敵人沒有發現你的情況下打他是不會引起騷動。
8、難免會有傷害/殺害平民,但是只會影響到暫時性的聲望值,解決犯罪就會再度提昇
9、錢還蠻好賺的,駭進別人的手機就可以得到,真希望我也有這種技術
10、對付有防護裝甲的士兵,還是用炸彈或引爆比較理想,我用槍打好久才會死掉
11、因為我實在是太「肉腳」了,所以用了修改器開啟無限生命


修改器下載:
https://mega.co.nz/#!JMEnya4L!Dr11EyFIzND71IpFdgdGphfwLSYfO5JAXzHmbcMSoBU

使用方法:先開啟修改器,再進入遊戲

修改器說明:
按F1 無限生命
按F2 無限彈藥/物品+999
按F3 無需裝彈
按F4 啟用無後坐力
按F5 關閉無後坐力
按F6 無限電磁
按F7 無限集中
按F8 不會被員警發現
按F9 不會被檢測
按F10 任務不會被發現
按F11 增加等級
按F12 降低等級
按Num 0 金錢增加+50000
按Num 1 經驗增加+2000
按Num 2 變為良民
按Num 3 車輛無限生命
按Num 4 凍結所有計時
按Num 5 增加入侵事件
按num 6 蜘蛛坦克無限能量
按Num 7 蜘蛛坦克無限導彈
按Num 8 玩笑:無限檢測
按Num 9 技能點數+250
按Num / NVZ增加生命
按Num * NVZ無限彈藥
按Num . NVZ購買所有物品
按Num + 時間速度加快
按Num - 時間速度減慢
按Ctrl + Num 1 趣味:啟用車輛超級漂移
按Ctrl + Num 2 趣味: 關閉車輛超級漂移
按Ctrl + Num 3 趣味:車輛快速損壞
按Ctrl + Num 4 趣味:所有車輛爆炸
按Ctrl + Num 5 趣味:啟用車輛末日
按Ctrl + Num 6 趣味:關閉車輛末日
按Ctrl + Num 7 趣味:增加滑鼠靈敏度
按Ctrl + Num 8 趣味:降低滑鼠靈敏度
按Ctrl + Num 9 趣味:還原滑鼠靈敏度

Oracle 11g RMAN - catalog start with

透過使用catalog start with指令,可以將備份集的資訊重新導入到目前的Control file。
適用Control fi已經太舊或是手動建立(可能沒有最新備份集的資訊),或是備份集的路徑不一樣時。

例如:利用RMAN在測試機實行還原時,將備份檔案複製到測試機的/backup底下,
但是control file或是catalog database備份路徑是設定在/rman底下,就可以透過指令重新導入資訊。
RMAN> startup nomount pfile=?/dbs/initTEST.ora
RMAN> restore controlfile from '/backup/TEST_bakctl_c-2151344704-20140617-03';
RMAN> alter database mount;
RMAN> catalog start with '/backup/'   (記得最後一定要以「/」結束,不然會找不到路徑
…(略)


EBS 自訂Mail HTML格式的簡單範例

CREATE OR REPLACE PROCEDURE APPS.SEND_MAIL_HTML_TEST
is

    v_message           varchar2(2000);
   
    conn utl_smtp.connection;
    vrData    RAW(32767);
   
    sender      varchar2(500) := 'prodmgr@test.ccc.com.tw';
    receiver      varchar2(500) :='keven@ccc.com.tw';
    subj            varchar2(200):='HTML Mail TEST';
    
    --組成HTML語法
    cursor cur1 is
        select '<table>'  aa from dual
                       union all
                           select '<tr><td><font size="20">' || segment1 || '</font> </td>' 
                           || '<td><font size="20">' || description || '</font></td></tr>' aa
                                from mtl_system_items_b
                                 where rownum<11
                      union all
                          select '</table>' aa from dual ;
                       
    r1 cur1%rowtype;
 
begin
    
     --指定SMTP SERVER
    conn := utl_smtp.open_connection('192.168.1.10'); 

    --也可以指定Port:utl_smtp.open_connection('192.168.1.10',25); 

    --對SMTP SERVER發出答應
    utl_smtp.helo(conn, 'ccc.com.tw');

    --實際寄送的寄件者
    utl_smtp.mail(conn, sender);

    --實際寄送的收件者
    utl_smtp.rcpt(conn, receiver);

    
    utl_smtp.open_data(conn);

    --開啟傳送mail內容,先傳送header的定義,也是mail內容的一部份,用mail的原始檔查看可以得知。
    UTL_smtp.write_data(conn, 'MIME-Version: ' || '1.0' ||UTL_tcp.CRLF);

    --指定格式為HTML,並將語系設為utf-8
    UTL_smtp.write_data(conn, 'Content-Type: ' ||  'text/html; charset=utf-8' || UTL_tcp.CRLF);
    UTL_smtp.write_data(conn, 'Content-Transfer-Encoding: ' || '8bit'|| UTL_tcp.CRLF);

    --如果格式為文字,則改為下列的語法,並將語系設為big5
    --UTL_SMTP.WRITE_DATA(conn, 'Content-Type: text/plain; charset="big5"'||UTL_TCP.CRLF);

    --下面一樣是傳送mail的內容,寄件人、副件、密件,會自動將收件者依類型區分,
    --實際上mail寄送是不管副件、密件…等,只管mail地址。
    utl_smtp.write_data(conn, 'From: "Name" <'||sender||'>'|| UTL_tcp.CRLF);
    utl_smtp.write_data(conn, 'To: "Name" <'||receiver||'>'|| UTL_tcp.CRLF);
   -- utl_smtp.write_data(conn, 'Cc: "Name" <'||creceiver||'>'|| UTL_tcp.CRLF);  
    
    --傳送mail的內容,主旨
    UTL_SMTP.WRITE_RAW_DATA(conn, UTL_RAW.CAST_TO_RAW('Subject: '|| subj ||UTL_tcp.CRLF));
    UTL_smtp.write_data(conn, UTL_tcp.CRLF);

    for r1 in cur1 loop

       --將要傳送的mail內文轉碼後傳送
        vrData := utl_raw.cast_to_raw(r1.aa);
        UTL_smtp.write_raw_data(conn, vrData); 

    end loop ;
    
    --關閉連線
    utl_smtp.close_data(conn);
    utl_smtp.quit(conn);
 
EXCEPTION
  WHEN UTL_smtp.transient_error OR UTL_smtp.permanent_error THEN
    UTL_smtp.quit(conn);

  WHEN OTHERS THEN
    UTL_smtp.quit(conn);
    NUll;

end ;

END send_mail_html;
/
        

Oracle 11g RMAN異機還原出現RMAN-06172,結果是NFS掛載的問題

系統:Solaris 10 
Database:11gR2 

我把RMAN備份到遠端的主機上,以NFS方式掛載到本機的/bak上。

使用RMAN在還原Controlfile時,出現了錯誤的訊息:
RMAN-06172:  no autobackup found or specified handle is not a valid copy or piece

可是我的指令是 restore control file from '/bak/TEST_bakctl_c-285915458-20140617-02'
已經指定了路徑及位置,為什麼還是有錯誤,為了這個問題找了幾天的文件,
也試了好幾個方法都不行,最後自己發現把檔案複製到本機上就解決了,一直覺得很奇怪。

接著下一個步驟restore database時,也出現了錯誤如下,才知道是NFS的掛載選項有問題。
ORA-27054: NFS file system where the file is created or resides is not mounted with correct options

最初的掛載方式為 mount -o rw 192.168.1.100:/backup/DB  /dbbak,存取上沒有任何問題。
沒有想到還要指定其他的參數才能讓RMAN可以正常操作,最後掛載的指令如下:
mount -o rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,proto=tcp 192.168.1.100:/backup/DB  /dbbak

参考文件:
ORA-27054: NFS file system where the file is created or resides is not mounted with correct options [ID 781349.1]

App Inventer2 讓Label 可以產生多行字串

如果想在Label元件輸入多行字串,可以在每一個斷行處加上「/n」,例如:


000webhost在網頁內自動嵌入廣告

我的一個php測試站是使用000webhost的服務,最近發現我的網頁內被自動嵌入000webhost的廣告,
一點首頁時就會出現廣告,雖然我不排斥使用免費的資源被嵌入廣告,只是在測試php回傳資料時,
常會因為廣告的Scripts而造成測試上的困擾,最後找到一個設定可以去掉廣告的Script,
只是不知道未來還會不會再被嵌入廣告的Script,至少現在測試是正常的。

回傳的程式碼中有一段廣告的Scripts


從控制介面上找到「Account Tools」,開啟「Remove Inactivity Ads」的功能選項,
選擇自己的網址後按下「Reset Stats」就可以了。



重新測試發現廣告已經消失了

Solaris 10 Zone 新增fs後出現錯誤:Insufficient specification

原本已有一個zone,名稱是test01,現在要在test01上增加一個fs,所以執行下列步驟:

# zonecfg -z test01
zonecfg:: test01> add fs
zonecfg:: test01:fs> set type=zfs
zonecfg:: test01:fs> set special=pool/erptest
zonecfg:: test01:fs> set dir=/erptest
zonecfg:: test01:fs> end
zonecfg:: test01> commit
zonecfg:: test01>exit

重開test01時出現錯誤
# zoneadm -z test01 reboot
resource specification incomplete
test01: Insufficient specification

原因是test01內就有一個erptest的目錄存在,所以出現錯誤,把目錄刪除後就可以了。

App Inventor2 Web Viewer元件簡單測試

利用WebViewer來顯示網頁的資料,先將WebViewer元件增加到畫面上。


在事件「Initalize」設定好URL的網址,再呼叫WebViewer的GoHome函數,就可以把遠端網頁的內容顯示出來




App Inventor2 與PHP的傳值與傳回值(HTTP Post)

下圖是Designer的畫面,共有四個元件
Button1:確認
Button2:清除,把Label1設為88888
Label1:顯示值
web1:web元件,可以POST或GET


下圖是 Blocks的設計流程,主要在於呼叫PostText來上傳資料到PHP,此處用join來告知PHP上傳的變數名稱與值
,所以join的第一個值為test=,加上第二個的值,其字串為"test=bbbbbb;

如果想POST多個參數,在每個參數間以「&」為區別,如下:


模擬器執行的結果


PHP的測試語法(test01.php):
<?php
    echo $_POST["test"];
?>

下面是利用表單來測試test01.php是否運作是否正常:
<html>
<head>
<title>Test01_01</title>
</head>
<body>
<form action="test01.php" name="form" method="post">
<table width="600" border="1">
<tr>
<th width="91"> <div align="center">輸入值</div></th>
</tr>
<tr>
<td><div align="center"><input type="text" name="test"></div></td>
</tr>
</table>
<input type="submit" name="submit" value="submit">
</form>
</body>
</html> 

Windows 7 工作排程執行失敗,代碼 0x10


設定工作排程器讓批次檔自動執行,但是卻出現了 0x10 的錯誤代碼,原因是使用網路磁碟的原故。

首先已在本機掛載Z:磁碟成功:
C:/>net use z: \\192.168.1.1\dbbak password /user:test01   

批次檔(test.bat)的內容如下,:
@echo off
robocopy z:\rman\ \\192.168.1.112\backup_test\  20140705* /log:backup_test.log /MT:100 /R:3 /W:10
exit

雖然Z:磁碟已經掛載好了,但是因為工作排程器在執行指令時,是獨立的作業,所以會找不到Z:碟碟,
因此修改批次檔如下才能成功執行:
@echo off
net use z: \\192.168.1.1\dbbak password /user:test01   
robocopy z:\rman\ \\192.168.1.112\backup_test\  20140705* /log:backup_test.log /MT:100 /R:3 /W:10
exit

Windows掛載共享磁碟/網路磁碟(CIFS)指令

語法:net use  磁碟代號  網路磁碟   密碼  /user:使用者

例如:
C:\> net use y:  //192.168.1.1/test_bk
C:\> net use z: //192.168.1.1/test password123 /user:test01

另外須注意的是掛載網路磁碟後面是不加「\」,範例如下:
C:\Users\keven_chen>net use z: \\192.168.1.1\bak1\  password /user:admin
系統發生 53 錯誤。
找不到網路路徑。

C:\Users\keven_chen>net use z: \\192.168.1.1\bak1 password /user:admin
命令已經成功完成。

詳細用法可以參考net use /?
NET USE
[devicename | *] [\\computername\sharename[\volume] [password | *]]
        [/USER:[domainname\]username]
        [/USER:[dotted domain name\]username]
        [/USER:[username@dotted domain name]
        [/SMARTCARD]
        [/SAVECRED]
        [[/DELETE] | [/PERSISTENT:{YES | NO}]]

NET USE {devicename | *} [password | *] /HOME

NET USE [/PERSISTENT:{YES | NO}]

Android App Inventor 2與PHP的傳值與傳回值(HTTP Get)

首先設計一個簡單的PHP程式,並且將程式傳到支援PHP的網站空間上去。
例如網址空間:http://test.ccc.com.tw/

PHP檔名:test.php
<?php
  if($_GET["v_chk"]==1) {
    echo "您的年齡是:" . $_GET["age"] ;
  } else {
    echo "沒有收到";
  }
?>

完整的網址如下,會傳回「您的年齡是:XX」的字串:
http://test.ccc.com.tw/test.php?v_chk=1&age=16


App Inventor 2 的畫面設計如下:
重要的元件有輸入值的文字框(TextBox1);及「按下我測試」的按鈕(Button1);Web元件(web1)


App Inventor 2的程式流程如下:
當按下Button1時,會設定Web1的Url值,因為要串成完整的網址,所以用join來組合兩段語法的值,
所以join右邊的組合就會變為http://test.ccc.com.tw/test.php?v_chk=1&age=Textbox1.Text,
而Textbox1.Text就是我們輸入年齡的值。
接著呼叫web1.get,因為我們沒有設定SaveResponse及Requesfilename,所以會觸發web1.gottext事件。
在gottext件件中,先判斷responsecode是否傳回代碼200,200表示網站成功執行,
最後就把PHP的回傳值(responsecontent),帶入Label2顯示出來。


執行的結果

如果輸入框輸入中文的話,出現的結果會變成亂碼,所以我在TextBox1之前加上編碼函數如下圖:

測試中文的部份就正常了。



EBS 修改/新增FND_User的API

更新指定USER Name的資料
DECLARE
    v_user_name                 VARCHAR2(100)   := 'TEST'; --輸入USER NAME
    v_user_password             VARCHAR2(100)   := '123';
    v_user_start_date           DATE            := TO_DATE('30-JUN-2014');
    v_user_end_date             VARCHAR2(100)   := NULL;
    v_password_date             VARCHAR2(100)   := TO_DATE('30-JUN-2014');
    v_password_life_days        NUMBER          := 90; --密碼存活的天數
    v_person_id                 NUMBER          := 1230;
    v_email_address             VARCHAR2(100)   := 'test@test.com';


BEGIN
   fnd_user_pkg.updateuser
   (  x_user_name               => v_user_name,
      x_owner                   => NULL,
      x_unencrypted_password    => v_user_password,
      x_start_date              => v_user_start_date,
      x_end_date                => v_user_end_date,
      x_password_date           => v_password_date,
      x_password_life_days      => v_password_lifespan_days,
      x_employee_id             => v_person_id,
      x_email_address           => v_email_address
   );

 COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;


=================================================================================

新增USER
DECLARE
   v_user_name                VARCHAR2(100)  := 'TEST';
   v_user_password            VARCHAR2(100)  := '123456';
   v_user_start_date          DATE           := TO_DATE('30-JUN-2014');
   v_user_end_date            VARCHAR2(100)  := NULL;
   v_password_date            VARCHAR2(100)  := TO_DATE('30-JUN-2014');
   v_password_life_days       NUMBER         := 90;
   v_person_id                NUMBER         := 1230;
   v_email_address            VARCHAR2(100) := 'TEST@test.com';

BEGIN
  fnd_user_pkg.createuser
  (  x_user_name                => v_user_name,
     x_owner                    => NULL,
     x_unencrypted_password     => v_user_password,
     x_start_date               => v_user_start_date,
     x_end_date                 => v_user_end_date,
     x_password_date            => v_password_date,
     x_password_lifes_days      => v_password_lifespan_days,
     x_employee_id              => v_person_id,
     x_email_address            => v_email_address
 );
 
 COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;


======================================================================================


BEGIN
   fnd_user_pkg.CHANGE_USER_NAME
   ( x_old_user_name   =>  'test',
     x_new_user_name   => 'test01'
   );

 COMMIT;

EXCEPTION
    WHEN OTHERS THEN
        ROLLBACK;
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

Soalris 10 MD5檢查(使用digest)

Linux可以用md5sum來檢查MD5,而Solaris 10可以用digest來檢查MD5

語法:digest  [-alv]  FILE
-a  :aigorithm 指定演算法
-l  :list  顯示所有支援的演算法
-v  :verbose  輸出較詳細的訊息,就是把演算法及檔案名稱一起顯示出來。

例如:

列出支援的演算法
bash-3.2# digest -l
sha1
md5
sha256
sha384
sha512

產生指定檔案的MD5
bash-3.2# digest -a md5 -v TEST_ora_22104_O329.trc
md5 (TEST_ora_22104_O329.trc) = 37c1e295951a9582e703e093595b9dfb