顯示具有 其他 標籤的文章。 顯示所有文章
顯示具有 其他 標籤的文章。 顯示所有文章

2016年1月9日 星期六

google compiler

之前有找了一下 min js 的工具。
覺得比較單純的就選用了  google compiler
https://developers.google.com/closure/compiler/


下載後解壓縮,就可以直接使用~
他是java base的程式,所以環境要有java...

指令大概就這樣子
java -jar compiler.jar --js D:\xxxxxxx\my.js --js_output_file D:\xxxxxx\my.min.js --language_in=ECMASCRIPT5

有比較特別用到的就是language,他的項目可以參考 底下的說明
https://developers.google.com/closure/compiler/docs/api-ref?hl=en

language 要設定,中文字編過去才比較不會出錯。
我主要用 ECMASCRIPT5。
當 使用 ECMASCRIPT5_STRICT 時,變數名稱如果偷懶愛用什麼  var aa...的
(偶就是會這樣用XD...) compiler 會過,但執行就會GG...

如果原 js 內有用 eval ....那個也常常會有問題....
(又中槍Orz..偶是eval愛好者Q_Q|||)
eval 執行 function 看起來好像是可以用~

但是...eval ('var abc= {a:1}') ; 這種轉 json 的作法就沒辦法了一.一a...
但是又懶得再去找新的 min 工具~ 後來乾脆就分成兩隻 js...
min 會GG的就寫到另一隻 js ,不做min,
其它ok的照舊min~

那為了又懶得在 html include 多寫一隻js (因為超容易漏掉的)
所以~就用 jquery load script 一次搞定XD...
$.getScript( '/js/xxxx_ext.js');




2015年12月1日 星期二

apache httpd disable directory listing and error page

apache  httpd 預設在安裝時,
www/html/xxxx 下若是該資料夾,沒有index.html...index.xxxx等等~
打網址就會變成列出檔案列表~

當然是說放資料給人抓是挺方便的,只是有時後想藏一點感覺比較安全~
關掉檔案列表的方式是~可以每個資料夾去設定~
但我是覺得從源頭改掉比較快...

vim /etc/httpd/conf/httpd.conf
<Directory "/xxxxxxxxx">
....
     Options -Indexes FollowSymLinks

主要就是
Options -Indexes (原本沒有- ,加個-就是)

存檔後重起 httpd 應該就可以了~


設定 error page
vim /etc/httpd/conf/httpd.conf

在最底下的 virtual host 打開

<VirtualHost *:80>
...
    DocumentRoot /var/www/html
...

ErrorDocument 404 /404.html
ErrorDocument 500 /500.html
ErrorDocument 502 /502.html
ErrorDocument 503 /503.html
ErrorDocument 504 /504.html

</VirtualHost>

再重起server就好囉~

2015年10月2日 星期五

oracle function 日期 流水號

這次要用 oracle function 來實作 日期流水號~(每天從1開始跑)
以前都習慣用AP實作,不過因為這邊是多台又同時,會造成號碼重覆的問題~
聽說改了幾次寫法還是衝突,最後只好來試試...唯一的瓶頸-->就是那台DB...

我不太知道英文的關鍵字要怎麼下~中翻英去找,結果都蠻慘的~
不過用中文的話~打「oracle 日期 流水號」...就可以看到不少的參考~

不過我說是參考...因為照貼結果感覺都很慘就是XD...

這次的解法,是用DB 開 table 來記(不是做DB 的流水號)
因為覺得去reset seq 是一件很蠢的事情~感覺上也不符合seq的精神....

table,主要的欄位就是「日期」,跟「現在號碼」,為了通用,再多加個「流水號類別 」...
原理就是~指定類別,若日期內有號碼,就把號碼+1丟出。若table沒有那個日期,就丟1,insert一筆新的日期,和號碼1進去。
(理論上比較好的想法是降子,不過後來因為 ooxx的考量...我是不用insert,而是日期不同,就把原本的資料蓋成 【新的日期】,跟把號碼變成1。變形後可以減少筆數~當然是前端 AP的日期不能亂丟就是~若在跨日其實是會出事的XD,不過要是這事情不會發生就算了~)

----修正版~
後來想一想,還是改個寫法~先撈值出來看一下日期再做處理~

CREATE OR REPLACE FUNCTION FN_XXXX_SEQ(P_CTYPE IN VARCHAR2, P_DT IN VARCHAR2)
  RETURN VARCHAR2 IS V_SEQ VARCHAR2(10);
 
BEGIN
  BEGIN
    Select l.DT INTO P_DT From OWNER.TB_AAA l where l.TYPE = P_TYPE ;  
    if P_DT is not null and P_DT >= to_char(SYSDATE,'YYYYMMDD') then 
        UPDATE OWNER.TB_AAA S
           SET S.SN = LPAD(to_number(S.VALUE2)+1, 4, '0')
        WHERE S.TYPE = P_CTYPE
         RETURNING substr(S.DT, 3) || S.SN INTO V_SEQ;
   else
         UPDATE OWNER.TB_AAA S
         SET S.SN = '0001',
             S.DT = to_char(SYSDATE,'YYYYMMDD')
       WHERE S.TYPE = P_CTYPE
       RETURNING substr(S.DT, 3) || S.SN INTO V_SEQ;
    end if;
 
  END;

  COMMIT;
 
  RETURN V_SEQ;
END FN_XXXX_SEQ;

function實作上,基本上就是,你來我就先update 一次,然後把 序號 給到 V_SEQ內。
P_DT會先暫存 DB目前的日期(想做個Varible,一直GG..就算了Orz..),然後看是要用舊的資料,還是改新值給1...(日期若比資料庫小的,一律就以資料庫的時間為主~)

然後都寫成 function了,那就組好流水號格式送出去,AP端不再加工了~

雖說 oracle 對數字format 也有其他的寫法,不過 LPAD,好像比較正確~

另外,原本是要採用 EXCEPTION的判斷寫入(感覺得這個才比較正統)
但是~不知道為什麼~就是一直都掉不進  NO_DATA_FOUND
https://docs.oracle.com/cd/B10500_01/appdev.920/a96624/07_errs.htm
換了好幾個Exception也都不是...

事後,寫了個多Thread,模擬壓測的程式狂取號~似乎寫到function內,沒有重覆號的問題~原本想說不行就要DB lock(但是那個太危險了),但目前看起來是OK的樣子就是~

2015年9月11日 星期五

oracle 備忘

出來混總是會碰到的~其實我對甲骨文的印象很不好~又肥又胖又貴...
(快十年前,硬碟還很小,RAM 2G就很強大的時後,oracle一裝就馬上讓電腦慢到爆!)
(然後買了Java...又把人家搞爛)

不過還是又看到他了一.一|||...
是說用的方法網路資源很多,就當個記錄就是~

好吧Orz...先說一下工具的部份。
工具大家似乎都是使用 PL/SQL Developer。不過他要吃 oracle 的 ora 檔,還得要先裝一個oracle client(還好有人有現成的copy來用就沒差)...
目前 oracle 官網放的是叫 SQL Developer,老實說,難用到不知道要怎麼用,然後他連接的方式並不會產生ora檔~所以...就直接放棄他了一.一...
另外我平常使用的是小松鼠squirrel-sql,是一個用純 jdbc 實作出來的opensource...當然是很陽春,不過輕量簡單~若只是做查詢的簡單工作,又不想裝太多是個選擇。不過他抓不到 schema內的 REMARK(註解),在看會很不方便。

最後~我是用 PLSQL Developer 啦,因為要做點管理的工作Orz...
另外他對 function 等的編輯畫面好很多~

建立table~可以透過介面新增。工具好的話都不會有啥問題~
(工具 用介面建,之後匯出SQL給上線的server用就好)
就是建好要 grant 給其他 user 使用。
grant select, insert, update, delete on XXX_table to ZZZ_user;

因為有用到 synonym 的部份,要把有 owner(schema) 的轉成 public 也可以讀到~
create or replace public synonym XXX_table  for YY_owner.XXX_table;

另有做Trigger Log table的方式是~
先建一個 要 trigger 的 table,一般是 XXX_table_LOG,做好跟開 table 一樣的事。
寫 trigger,可以參照
https://docs.oracle.com/cd/E17952_01/refman-5.1-en/create-tablespace.html
因為有前人的照抄,搞懂語法後是還蠻容易的就是~
唯一要注意的就是,因為我這邊用的統一都是在 BEFORE 之前Trigger,在 insert 時要寫入LOG時,因為有些欄位是有帶預設值的,所以要記得用NVL判斷一下,已免應該有值,但寫了null~

CREATE OR REPLACE TRIGGER TG_XXX_table_LOG
  BEFORE INSERT OR DELETE OR UPDATE
  on YY_owner.XXX_table
  REFERENCING NEW AS NEW OLD AS OLD
  for each row
declare
  -- local variables here
begin
  IF updating THEN
    INSERT INTO YY_owner.XXX_table_LOG
      (Col_A,
       Col_B,
       LOG_DATE,
       LOG_ACTION)
    VALUES
      (:NEW.Col_A,
       :NEW.Col_B,
       SYSDATE,
       'U');
  ELSIF inserting THEN
    INSERT INTO YY_owner.XXX_table_LOG
      (Col_A,
       Col_B,
       LOG_DATE,
       LOG_ACTION)
    VALUES
      (:NEW.Col_A,
       NVL(:NEW.Col_B,'Y'),
       SYSDATE,
       'I');
  ELSE
    INSERT INTO YY_owner.XXX_table_LOG
      (Col_A,
       Col_B,
       LOG_DATE,
       LOG_ACTION)
    VALUES
      (:OLD.Col_A,
       :OLD.Col_B,
       SYSDATE,
       'D');
  END IF;
end;

話說...Oracle他喵的居然....把空字串當 null...一整個無言了...
所以平常常用的  IFNULL(COL_A, '') != ''
在 oracle 裡要寫成  NVL(COL_A, '') is not null
Orz...

Oracle 在下sql時,對於日期的比對 (時間區間),
無法使用  XXX_DATE >= '2015-10-02 00:00:00' 這種的寫法來下~
要利用轉日期型態  to_date('2015-10-02 00:00:00', 'YYYY-MM-DD HH24:MI:SS') 來表示 ,
要注意的是他的 format 跟一般用字也不一樣~~
可參考
http://www.techonthenet.com/oracle/functions/to_date.php




2015年9月3日 星期四

email tool: Thunderbird

最近因為買了新的nb來工作用~
新nb最麻煩的總是會碰到OFFICE的問題...
以前都可以拿公司的來灌,不過~這次公司沒有給,就只好自己生辦法~
是說也不太想弄窮人版的~就試著找些方法~

word/excel,這兩個可以用nb內建的Office Starter,有點半殘,不過能開能寫就好了~
pptx的問題,可以弄個 ppt viewer 來看(如果只是要看而已的話)
不然就是裝個OpenOffice...只是會跑版~不過因為工作性質應該用不到做ppt就想說沒差~

然後就是一定會碰到的收信問題...
一般都是用Outlook...不過因為偶也不想花錢~找了一下~
就打算用 Mozilla做的 Thunderbird...(有Mozilla掛保證,感覺就安心許多)
https://www.mozilla.org/en-US/thunderbird/

用了一下,覺得他很像就是把Firefox拿來改一改成收信軟體XD...
預設版本可以收一般 POP跟IMAP的信~
如果mail server是 MS的 exchange server,就要另外再加plugin~
我裝的是這種~
話說~ exquilla 是要收錢的Q.Q~可以試用一段時間,之後一個帳號一年10鎂吧~
https://addons.mozilla.org/en-us/thunderbird/addon/exquilla-exchange-web-services/
在設定中,要輸入exchange server的 EWS url...自動掃應該是沒用的....
https://{exchange server name}/EWS/Exchange.asmx

在Outlook上,一般只要你打 server name就可以了,在 thunderbird 上得生出一個網址來才行~
然後他也會把server上的通訊錄抓下來喔~我覺得還蠻不錯用的啦~

裡面讓偶試了有點久的功能,就是寄信給多個人時....好像自己在收信者那邊打會有問題~
要在寫信的那個視窗,打開通訊錄功能,從那邊加入,這樣多人才比較正常....

總之~我覺得還可以用啦^^~

2015年8月25日 星期二

eclipse mars ant not support jdk 1.6

每次到了新環境,就得再建一次開發工作環境~

然後~每次這時後的 Eclipse,都會讓人吐血一次...誰叫偶換地方的速度跟他改版的速度一樣=_=a...
這也是我討厭他的地方...

唉~總之現在可以download下來的版本是 mars...
mars有個前提,要使用jdk7以上的版本才能啟動~
(對於 死忠 jdk 1.6的偶來說,真是個很麻煩的部份。總之~先灌1.6,最後再灌1.7以上的版本,ide就可以順利的開起來了)

說起來也不只是因為1.6是sun留下的最後一大版,另一個重要的原因是~阿就以前的系統都是以1.5/1.6為大宗(因為這兩版的相容性做得比較好)

先不爽一下1.7的問題,jdk1.7後拔掉一內建在1.6內的 sun的package,造成前人用這些method的都會有Class NotFound 的問題...解法有兩種:
一是把編譯運行的環境都改成jdk6,這是比較好的作法。
二是如果只是為了開發,又不想回去重裝jdk,就是引用6 裡的 rt.jar...或是看是在6裡面的那個jar,多個jar當lib就過了~

然後~因為這次的專案build,只能用ant跑~(因為前人寫了個很精美的build.xml...)
所以...就發現,這mars版本的ant 在跑指定jdk為 6時,會出現 不支援舊 jdk的訊息...
google了一下,目前,他是個bug...沒有什麼解....

所以~就....只好去找原生的ant下來(apache ant)...
http://ant.apache.org/bindownload.cgi
download zip下來,解開。好像看作業系統,windows去環境變數設定JAVA_HOME到 jdk6 的位置去~就可以了~
然後就開個cmd....
cd 到那個專案的build資料夾(ex: cd D:\workspace\myproject\build)
執行ant指令(ant.bat) (D:\apache-ant-1.9.6\bin\ant)
預設是跑build.xml...
總之要加別的就自己加指令~
ex: 指定task (ant mytask)
可參照
https://ant.apache.org/manual/running.html

目前看起來是自己另外call ant能跑起來了就好Orz...




2015年6月11日 星期四

ibatis 未開啟游標CRSR0001

「未開啟游標CRSR0001」
我覺得這個問題是個鬼...
然後因為Google不認識這個鬼...所以只好自己抓...

先註明一下這邊使用的版本:
ibatis 2.3.4
ibatis dao 2


原本都好好的沒事,然後就有一天被念說畫面出Exception了(很好心的寫了中文字,但...沒幫助阿|||Orz...照翻成英文,Google也不認識~Google只認識 沒關,沒有沒開的阿~囧rz)

因為程式很久沒改過,當然先懷疑是不是有人亂Key資料~DB看來看去,資料也很正常~

然後拿相同的SQL直接去DB查~整叢好好的(台)
所以DB資料錯誤問題排除...

再來就只好看程式了(不能推卸責任了Orz...)開啟全部的Log來看~發現其實他查回來的ResultSet 也是完整的,一筆也沒掉...
那所以一定是 ibatis 將資料轉成 Bean物件出事...

可是=.=|||...ibatis都照標準範本寫,是可以改什麼阿阿阿Orz...

是說我覺得這明明是一個很蠢的問題,筆數不過3xx就掛....又不是幾千萬(是說其他撈出來幾萬的function也活得好好的阿@@)...然後蠢問題的解答通常也很蠢...所以往蠢的方向去想...

把原本的 resultMap 改成 resultClass... 就...好...了...
(先說這 resultMap也是單純到不行的 1欄位 對 1欄位,還沒有做額外查詢)

-----------------------------------------
是說解法果然是很蠢...不過這說明了 ibatis 對於 resultMap 與 resultClass的處理方式明顯不一樣,先說我沒去讀他的source code,只從結果推論。

 resultClass 是比較偏像我心中的 ResultSet 拿出來就持續 next 往下填資料。

而 resultMap 則可能是依其對應的 pojo 與DB回傳欄位 的結構定義,先預支了一堆資源什麼的,然後不知道什麼蠢問題,造成他在 mapping時 出錯了~(筆數這麼少,欄位對應1對1這麼單純還出錯真是...)
-----------------------------------------

總之,結論就是,如果可以用 resultClass 實作,請優先使用 resultClass,減少不必要的困擾~~(是說找到的sample code,覺得 resultMap的還挺多的,當然是說map彈性比較大就是~)


2015年4月28日 星期二

Crystal Report repeat group header when change page

還是先嫌棄Crystal Report一下...真是很難用阿阿阿~
加上奇怪的中文翻譯~害我爬文爬很久,就是看不到像樣的鬼... 造成更多的誤解!!!!!

這次的需求其實也算合理,就是xls table式的排版,然後資料列太多,在下一頁上方顯示表頭。
一般情況應該很簡單,就是把表頭做在Crystal Report內的「頁首」就好~

BUT...人生就是有個BUT!
我的報表是有group分類的........天曉得group那時候換下個group...
搞不好人家剛好分段下面,下一頁又是漂亮的開始~所以基本上~這就會變成是動態的~
前一頁有完整結束,就不要重覆表頭,前一頁資料還沒完就show表頭...

查了很久,Crystal Report並沒有內建可以動態做到分頁順便幫你重複顯示表頭或區段的設定~所以...只好再度使用奇怪的手段一.一|||...

首先版面設計,要先做規劃,新增一區「頁首b」,並開立公式做狀態轉換
「頁首a」            原頁首
「頁首b」            重複表頭的樣式
「群組首#1」     群組資訊+表頭
「細目」              @group_flag
「群組尾#1」     @group_flag_end
「報表尾」


運用採用Status Diagram的概念, 定一個Shared的變數,當資料列在「細目」時,其flag=2,當在「群組尾」結束時回歸flag=1。(Crystal Report的數字 init是1...)
這樣當我在換頁時,就可以看flag,若為2就是還在畫細目中,要重覆表頭。1的話表示群組結束或開始,不須顯示表頭。

公式內容相當簡單如下:
@group_flag
Shared numberVar flag;
page := 2;
''
(最後一行要打上空字串'',才不會被看到,但在開發預覽可以不用打,方便看值的變化)

@group_flag_end
Shared numberVar flag;
page := 1;
''

最後在設計區,右鍵打開「區段專家」,選擇「頁首b」區段
右邊Tab「一般」,有個「抑制顯示(無截取細目)」<--頁首只有這個可以編輯,算了就加減用就是,項目的右邊有個「x-2」的圖示,點圖示後就可以用公式寫法來控制要顯示(false)跟隱藏(true)
注意這邊是結果要回傳true/false,跟一般寫回傳字串數字不同。
Shared numberVar flag;
if page > 1 then
false
else
true

這邊編寫完成後,應該會看到小圖示「x-2」會變色。(應該只是標明有額外撰寫公式判斷,但他變紅色一整個就像在說寫錯了一樣)。然後該項設定的checkbox(勾)是沒有作用的,所以不要勾起來(勾起來設計頁面會看不到區段內容,要再拉表單會造成困擾)

接著就可以測試「頁首b」是否有正常的運作了~建議可先寫簡單的幾個字~看動態有沒有正確出現再去拉對齊苦工。






2015年3月3日 星期二

db2 sql substring (tag like string)

通常欄位資料都是一格一種資料,不過有時候會有像備註備忘~
或是不想加欄位,找了既有不用的某個欄位來塞一堆更奇怪的東西~
等ooxx的原因~

所以就是解析字串format,拿值出來的時候~就是只能用substring的作法~~
因為DB SQL通常只能一道做完,沒有人在split後又再取的...
使用符號分隔萬一順序沒標到分隔也會抓不出來~
所以在多種資料,硬要擠在同一欄時~我大多會使用xml的 內容 表示方法。
(substring時,頭尾都會不一樣,不用怕index用到別人的)

但如果資料庫支援 json格式的話~會傾向使用 json...因為現在json在 程式語言 parser比 xml好用~

總之~這次就是用 tag形式儲存就是了...
內容範例為: 欄位名(MEMO)
<NAME>Alex</NAME><ID>9527</ID>

取 NAME
SUBSTR(MEMO, LOCATE('<NAME>',MEMO)+6, LOCATE('</NAME>',MEMO)-LOCATE('<NAME>',MEMO)-6 )

取ID
SUBSTR(MEMO, LOCATE('<ID>',MEMO)+4, LOCATE('</ID>',MEMO)-LOCATE('<ID>',MEMO)-4 )

要注意的就是LOCATE(indexOf)  之後要加減其字的長度就是囉~
若是需要數字 或其他型態, 就是將字串再轉型期望的樣子。

2014年8月11日 星期一

html置中排版~

之前好像有寫過~不過最近有找到一個更漂亮的寫法,就記錄一下~

這次大多練習用css排,有單獨使用小調整的才寫在code裡,
規劃上就是以body, div來置中,div則走list區塊的方式在排,若是一個區塊裡又分左右的話,再考慮在div裡面開table或是div/span來處理。總之由上往下整體上都是一條條的div,這樣就不會亂跑了!

內容上主要分 h1(大標), h2(副標), .content(內文文字)
因為上次聽說search上h1會比較容易被查到,所以就配合一下。
.content 主要處裡文字縮排,左右空隙,不過因為margin-right好像很難用沒反應,所以乾脆就用width來算,就齊了一"一b...

這次其實是做的是EDM...(電子DM的版,所以跟網站不太一樣XD)
字大小都僅量用百分比在微調,還蠻好用的!

多個class,指定時用" "(空白隔開就可以了)
<div class="content text_bottom text_grey div_border" >

/**body 和 div要一起配合才會一起置中! div也可以不要用tag, 指定一個包很大的 id元素也可以~*/
body  {
    font-family: Microsoft JhengHei;   /**字型改正黑體*/
    margin: 0;
    text-align: center;
}

div {
    position: relative;
    margin: 0 auto;
    width: 800px;   /**版面寬度,主要配合banner圖*/
    text-align: left;
}


h1  {
    font-size: 32px;
    margin-left: 50px;
}

h2  {
    color:red;
    font-size: 24px;
    margin-left: 50px;
    margin-top: -20px;
}

.content  {
    margin-left: 30px;    /**內文縮排,width為全寬減掉右邊縮排的距離*/
    width: 740px;
}

.text_red  {
    color:red;
}

.text_small  {
    font-size: 70%;    /**字型比率(%),之前比較愛用+1, -1,不過有些微妙變化的字用百分比好用*/
}

.text_bottom  {
    margin:30px;     /**包在.content裡面,就可以縮排兩次了*/
    text-align:center;    /**字的位置,置中*/
}

.text_grey  {
    color:grey;
}



.div_border  {     /**div的外框線,一定要設定border-style才會跑出來*/
    border-color:grey;
    border-size: 1px;
    border-style: solid;
}

其他:
圖片要整張背景圖出來,用height限制最剛好,不會有換行縮排div太多或太少的問題
background-image: url('imgs/edm-07-01.png'); height:500px


2014年7月30日 星期三

application server和solaris一些小東西

 備註一下...
這次用到的環境是solaris 10+sun application server

solaris 雖然是liunx, 但是用起來還是有差...

cd , ls 差不多,習慣用-l都還好~
不過在檔案後面會出現*...好像表示非owner的檔案意思或是那是root的檔案~
用root來看就不會有*

在pietty上看起來的差別是~不曉得是不是建的人有設定~還是他就是那樣子?!
root的指令下法好像不能用左右改字~會變特殊符號?
所以只能一個字一個字敲~還好pietty的貼上功能還可以用QQ~
另外root看不到所在路徑(>左邊通常會顯示路徑)~但是會跟su前的那個路徑一樣~
為了確保安全~在執行前都先ls一下~
非root帳號~指令列就會標明完整的路徑~

常用的 tail -n 100 在solaris上要改成
tail -100 server.log

tar上~有些引數不能用~所以後來都用這組(-cf)
tar -cf abc.0728.tar abc/

chmod上改用文字描述(user+write權限)
chmod u+w aaa.txt

hosts位置也有點不同~
/etc/hosts還是有東西~但那是捷徑... ls -l後就可以看到實體位置

sun application server
偶只能說評價差~不過當年同期的TOMCAT可能還在3~5,BUG很慘烈的年代~也許是沒那麼差~不過用過TOMCAT6以後的穩定度~心中有很多os...

 先說中文化的介面真是造成認知上的困擾...

正統布署是用war,在application server的admin GUI上上傳,再指定在那幾個instance(實例),雖然偶覺得有指定了,但是他好像跟本就不鳥,不知道是中文翻議錯誤還是怎樣~
到server下去看source日期有時後跟本沒變~ (可是有時後又有~搭配七月特效,這真的只是古早的靈異問題嗎一.一a)

所以最保險的做法還是布署後,再去各server的實體路徑下確認檔案更換了沒,測試修bug就乾脆去換server下的單檔再重新啟動server就好了~因為佈署非常的慢~

某次悲慘的情境就是同時deploy兩個server...結果不知道布太久斷掉還怎樣,總之在gui上就出現unknow(狀態不明)的情況,此時用gui的任何按鈕就會送你一堆莫名其妙的Exception...
過一天還是一樣~google上沒找到解法,因為真的很難google...名字取太差了,難怪之後改玻離魚還比較好辨識

總之解法就是,在看他的目錄結構的時後,看到server下有個bin,裡面還寫得很好懂的start, stop,鼓起勇氣給它stopserv下去,反正原本也就爛了,再爛也沒差了...stopserv後果然有些不好看的訊息,再去gui上看,狀態終於歸回未啟動!再啟動就正常了^^~

猜測可能是由agent控制server時,可能timeout(因為當時真的等到想關網頁了),或是某些檔案內容鎖檔io問題或是balabala的,變成agent狀態不明無法判別再處裡。因為偶看到的是EOFException,這個通常是搶檔案或是檔案沒寫全的錯誤。

2014年2月20日 星期四

網址前的icon favicon.ico

這個好像也是萬年問題~
要怎麼放google一下應該超多的~

一般就是放各web server 根目錄下的favicon.ico

不過倒霉的很多時候還是不出來~
其實重點是~ 先看看你圖檔的格式有迷有對啦!!!
每次別人拿圖來~十次有九次都是錯的!!!
(我習慣使用tomcat.ico做對照組比對XD)
ico檔可不是png, jpg改副檔名就好...

不過常常要用時~ 會找不到工具轉...
剛發現一個不錯的網站~ 可線上傳檔案, 再幫你export~ 
http://xiconeditor.com/

另外補充apache 幫的路徑自動加ico的做法~

conf/httpd 底下加
AddType image/x-icon .ico

重起apache...

2014年2月18日 星期二

hive 指令

hive都是打打一串很長的cmd在處理~

要注意的是~ 若沒有做程序控管~ 同時做HIVE指令可能會出事~
(因為是使用"一個"檔案當DB資料~ 檔案本來就無法同時多個程序寫入!!~ 讀取分析可能又卡在hadoop分散式檔案系統~又麻煩了點~~)
hadoop的檔案系統~ 基本上只有put, rmr(新增, 刪除), 沒有"更新"這件事!!!!!!
(我也很希望有T__T)
更新這件事~只能先砍掉~ 再新增...但是因為通常Hadoop又喊自己是Big Data...幾G甚至到T的資料在那邊一直copy...I/O會到極限就算了
(I/O在OS效能上~算很容易跑到100%CPU, 也容易影響到其他工作)~

反正Hadoop不會是Fast Data的最好選擇就是了!!!頂多是搭配使用~
總之偶覺得很難用啦~ 看很多solution都寫的多好用一樣~ 那都是要配很多東西~ 再加上特定條件才成立的!

這邊列一些有用到hive指令~
另外執行cmd的方式~
僅量使用bin/hive -e 的方式執行~
而不是用bin/hive進console....
但是因為bin/hive -e, 會受到"引號的限制~ 可能會有某些情況無法全擠進同一個句子裡...還是得用bin/hive解....(有點爛~__~|||)

匯入資料時要注意~ 該內容只支援UTF-8...中文常會GG的~~
(要匯之前還要先去把原csv整個轉檔~ 又是個坑一_一||||)

select語法建議就看文件囉~跟SQL有點像~但又不太一樣~

###顯示table列表
(其實一個table就等於是一個hadoop file~有興趣去hadoop裡面純看hadoop檔案,  /user/hive/warehouse下就會有個名字和table name一樣的檔)
show tables;



###顯示table
decribe test_csv;

###刪除
DROP TABLE test_csv;

###notices row format must!
CREATE TABLE test_csv (id STRING, sn INT, name STRING)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' ;

###sync data with csv localfile (overwrite)
load data local inpath '/XXXXX/hadoop/files/aa.txt' overwrite into table test_csv;
###insert(append data with csv)
load data local inpath '/XXXX/hadoop/files/aa.txt' into table test_csv;

###create_idx
CREATE INDEX idx_date
ON TABLE xxx_data (date_str)
AS 'org.apache.hadoop.hive.ql.index.compact.CompactIndexHandler'
WITH DEFERRED REBUILD;

###select sample
SELECT * FROM xxxxxx WHERE yyyyMMdd = '2013AUG16' order by num;

2013年12月20日 星期五

postgresql9.1 extend postgis

其實就一行小小的指令~ 很好用~
這是為啥偶後來都喜歡9.1版的postgresql...

不然centos原生就有8了, 以前run了很多年的8也是很穩定~
沒事找事做很累的T___T....


前提的條件就是先裝好postgreql9.1...(extend的功能9.1才開始有的)
並且灌好postgis的plugin~

在自用的database 開好後~ 依情況~或是需要時再執行一行指令
CREATE EXTENSION postgis;

就馬上擁有postgis好用的功能^_^Y....
話說postgis2.0的好用之處~ 目前是還沒有特別發現~
因為最常用的還是距離運算, 空間包含之類的...這些在1.5版時就蠻齊的了

附上官網說明...
http://postgis.net/docs/postgis_installation.html#create_new_db_extensions

古早做法很麻煩的~ 要執行幾個sql匯入function, object....etc
早期為了怕有問題~ 是先做一個有geom的database起來~
然後再開database templet弄進來~

只是就有時候覺得owner或role的設定覺得不開心一_一a....

2013年12月10日 星期二

Nagwin

唉~前因後果不提~
總之...原本是要裝nagios, 一個監控主機套件~ 不過原生是在linex上
要裝的機器是windows server
這是他們家官網
http://www.nagios.org/

很妙的是~ 他們對其他平台的支援方式是提供"VM檔"...
不過我自己就已經是VM...要玩VM裡的VM這種遊戲嗎~囧?

所以後來就使用Nagwin...簡單的講~ 就是把nagios加上模擬linex運行環境的方式搞到windows上
https://www.itefix.no/i2/nagwin

這東東~ 我覺得並不是完美安裝包~
(完美安裝包~ 我會說像postgresql, apache httpd那種~  點兩下就會百分之百成功的)
不過主要的問題發生點我認為在於...帳號權限的處理問題上~

首先這包只有32bit的碼, 不過這個倒不是重點~ 能跑就好了~ 管他的一u一a...

另外安裝時~ 他會要求輸入windows帳號密碼, 推估除了是做為設定成windows服務用的(若有安裝完成, 去windows服務裡可以看到生出四個服務, 帳號就是剛剛打的那個), 不過windows帳號是個神奇的系統, 可以安裝又不見得可以跑...(因為我使用的帳號(非administrator), 是可以安裝該服務, 不過無法啟動喔...不過去服務裡面把user設定改掉後~ 就可以啟動了XD, 暫時還沒有看到其他奇怪的事)
Nagwin有提供帳號密碼登入他的網頁, 密碼變更是使用該指令~ 很可能會發生下了指令~ 但是無法寫入密碼的那個檔(看檔案更新日期應該就很清楚)...所以爛人解法~ 就是找一台權限夠能跑的~ 改好密碼~ 把那個檔案貼去失敗的那邊Orz...


不過nagwin的plugin就沒這麼幸運了...
winrpe (原nagios裡的nrpe,安裝在其他主機上, 提供給主要nagios資訊的agent)
https://www.itefix.no/i2/winrpe
不知道為啥(應該還是帳號權限問題, 因為像log那種都寫不進去, 要手動去改資料夾檔案的權限)~ 裝起來寫成功, 但是沒跑起來失敗就算了(該聽的port沒serivce)...
最慘的是居然跑去改該帳號的其他設定(目前最直接發現的就是他居然鎖了該帳號的遠端桌面服務, 還好最後有找到地方把黑名單清掉(本機安全性原則->使用者權限指派->拒絕遠端連線登入...), 還有其他後遺症還沒有碰到就不知道了Orz...
要說還好在測試機就先病發了一_一...不過測試機登不進去也是造成很大困擾.........
所以就先放生他吧...

安裝方式請參照官網...win安裝一直都沒什麼特別困難的...
https://www.itefix.no/i2/content/nagwin-installation
出事的地方都很奇怪~ 基本上都是系統環境問題...

而監控的設定基本上和nagios是一樣的~從他安裝好的路徑下應該很容易看出linex愛用的目錄資料結構~

改密碼指令是到bin/
htpasswd2 -b /etc/nginx/htpasswd nagiosadmin new-password

測試監控項目的指令check_xxx都放在plugin/下
在設定之前, 可以先在這邊試試check指令有沒有正常符合期待~
測試OK後再寫進設定檔做監控比較好~
以免一直看不出問題在那....

題外話: 那天爬了很久的nagios...然後偶發現偶在facebook上~ 居然出現nagios的專頁推薦!!

centos + ganglia

Ganglia是一套主機資源監控的軟體~
大概就是看看cpu/ram/網路資源使用量降子~
原生是linex系統的東東~

資源監控~偶看大概都不跳出這些作法~
會有一台主要server, 搜集資訊, 提供網頁/AP, 儀板表介面~

另外會有所謂像agent這樣的東西~ 裝在其他監控的主機上...
定期把資訊送到server, 或是由server從agent機器上拉過去...

不過這樣子也合理啦~ 因為監控很多是監控到主機硬體資源的使用部分~
正常主機~ 是不會讓其他主機access硬體資訊的...

ganglia分為三個部分~
ganglia-gmetad  --> 資料整合(server裝就好)
ganglia-web  --> 提供http介面(server裝就好), 使用的是php的套件, 所以要先裝好httpd
ganglia-gmond  --> 資料收集(要監控的機器都要裝)
上面套件安裝好後~ 會變成centos上的service, 所以需要開機啟動的話~ 就自己要再去開啟
web介面是沒有帳號權限的~ 就是裝好後~ 連網址就可以直接看到內容~

重點大概就是注意gmond, cluster的 name 要與gmetad的datasource名稱一致, 這樣才對得上..該名稱也會顯示在頁面上~就當成是server群組的名稱吧~

agent/server 溝通的port default是 8649, 要走別的port, gmetad主機後要加port

gmond裡, 還有可以改的大概就是host.location, 填主機的名字以方便識別
udp_send_channel改一下, ttl=1才會live, host給自己的IP, 其他check一下是否有差別

安裝方式如下:

   su
   rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
   yum install ganglia ganglia-gmetad ganglia-web ganglia-gmond
   #only client without server
   #yum install ganglia ganglia-gmond
  
   ##if everything OK, ganglia will be installed  /etc/ganglia/
   ## httpd page installed /usr/share/ganglia  
  
   vim /etc/ganglia/gmetad.conf
   ##Update data source name and ip address : data_source "OnSite_QA" 60 ipaddress
   ##If you define 60 every 60 seconds the data will poll from the ganglia monitoring daemons
  data_source "hadoop" 60 192.168.3.xx1   192.168.3.xx2   192.168.3.xx3   192.168.3.xx4

   vim /etc/ganglia/gmond.conf
cluster {
name = "hadoop"    ##modify
owner = "unspecified"
latlong = "unspecified"
url = "unspecified"
}
host {
  location = "host1"
}
udp_send_channel {
  #bind_hostname = yes # Highly recommended, soon to be default.
                       # This option tells gmond to use a source address
                       # that resolves to the machine's hostname.  Without
                       # this, the metrics may appear to come from any
                       # interface and the DNS names associated with
                       # those IPs will be used to create the RRDs.
  #mcast_join = 239.2.11.71
  port = 8649
  host = 192.168.3.xx1
  ttl = 1
}

udp_recv_channel {  
port = 8649
}
tcp_accept_channel {
port = 8649
}
  
   ##start service
   #/etc/init.d/gmetad restart
   #/etc/init.d/gmond restart
   service gmetad restart
   service gmond restart  <--better
  
   service httpd restart
  
   ##change php allow
   vim /etc/httpd/conf.d/ganglia.conf
  
  <Location /ganglia>
    Order deny,allow
    #Deny from all  ##modify here
    Allow from all  ##modify here
    Allow from ::1
    # Allow from .example.com
  </Location>

win + apache proxy

在windows上裝apache 相信是很common的討論~
google大神不用認真拜就很多了~~

以往為了技術單純化~ 都用一隻湯姆貓解決比較簡單~
不過因為這次要整合四五個來源的http服務, 再統一從對外網站對外提供...
所以還是靠個有口碑的proxy比較輕鬆~~
(不然到時候一堆人又會吵是誰誰誰沒轉好~)

對於網頁proxy 的作法~
apache有提供蠻多的方式...
ex: 設定指定目錄, virtual host...etc, 在tomcat整合還有ajp等方式~~~

因為windows安裝完的設定與centos上不一樣~
(centos上懶人安裝, 功能較多)
仔細看~ 會發現httpd裡面的模組就有差~
在LoadModule 裡面, windows的vhost(virtual host), ajp預設都是沒有開啟~
而且可能也沒有相關lib..要另外download

所以為了簡單...所以直接採用單純的proxy...
在centos好像會自己弄成virtual host...

virtual host是比較高級~ 可以再設定限制連線~
不過我在這邊用已經是最外層對外服務的web了~
所以直接用轉導倒也是OK~

原則上基本就是...
1. 到官網下載安裝包
http://httpd.apache.org/download.cgi

2. 點兩下安裝...

3. 改改設定檔
httpd.conf 修改
Listen 80   <---改成需要的port

 啟用module
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so

4. 設定簡易proxy
httpd.conf 拉到最底下直接加上轉導路徑
ProxyPass /tomcat/ http://localhost:8080/
ProxyPassReverse /tomcat/ http://localhost:8080/

5. 啟動(重啟) apache服務

6. 測試

2013年10月29日 星期二

wav spectrum 頻譜圖 + python audiolab

因為這次要處理wav檔案資料...
其實py audiolab能處理上不止算頻譜,
只是其他的項目用Java解決掉~
就只有頻譜圖是用python...
(一來不會算頻譜, 二來Java繪圖的套件過於艱澀, py找來的資源就已經相當漂亮了Q_Q)

環境安裝貼在上一篇文...



先貼一張結果圖~













程式沒幾行, 過程是挺心酸的...Q_Q...
整個重點大概在於:
python 與相關應用module安裝...
找一段可以用的程式碼來打底...
(google audiolab+spectrum 應該就會有~我也是google來的)
調好圖表版面, 對齊(因有上下圖需要對齊的需求), 間隔, 顏色
(sample是2分鐘的wav, 但因實務上只使用大約30s, 所以才用5s做單位x軸)
解決中文字的問題....
(python原生沒中文, 最後採用指定TTF解決, 跨平台機器安裝才方便Q_Q)

原始碼

#!/usr/bin/env python
#-*- coding: utf-8 -*-
import sys
from pylab import *
import wave
import matplotlib.pyplot as plt

myfont = matplotlib.font_manager.FontProperties(fname='/etc/xxxx/MSJH.TTF')
infile = None
outfile = None
secInterval = 5    #x-axis interval

def show_wave_n_spec():
   
    if(len(sys.argv) < 2) :
        print('err input, plz input argv[1] and argv[2]')
        return
   
    infile = sys.argv[1]
    outfile = sys.argv[2]
   
    spf = wave.open(infile,'r')
    f = spf.getframerate()
   
    sound_info = spf.readframes(-1)
    sound_info = fromstring(sound_info, 'Int16')
    spflength = round(spf.getnframes()/f)
    #print(spflength)
    #print(sound_info)
   
    #---------------pic1   
    ax = subplot(211)
    title(u'Waveform(波形圖)',fontproperties=myfont)
   
    plot(sound_info, '#5755FF')
    xlim(0, len(sound_info))
    plt.axis([0, len(sound_info), -15000, 15000])
    grid(True)
   
    #change axis-x position/text
    xlabel2 = range(0, int(spflength+1), secInterval)
    xposition2 = []
    for x in xlabel2:
        xposition2.append(x*f)
   
    #print(xposition2)
    ax.set_xticks(xposition2)
    ax.set_xticklabels(xlabel2)
   
    #change axis-y
    ylabel2 = []
    for x in ax.get_yticks() :
        ylabel2.append(str(x/1000)+'k')
    ax.set_yticklabels(ylabel2)
   
    #---------------pic2   
    ax2 = subplot(212)
    title(u'Spectrogram(頻譜圖)',fontproperties=myfont)
    spectrogram = specgram(sound_info, Fs = f, scale_by_freq=True,sides='default')   
    plt.axis([0, spflength, 0, 20000])
    ax2.set_xticks(xlabel2)
    ax2.set_xticklabels(xlabel2)
    grid(True)
    ylabel2 = []
    for x in ax2.get_yticks() :
        ylabel2.append(str(x/1000)+'k')
    ax2.set_yticklabels(ylabel2)   
       
    #show()
    savefig(outfile);
    spf.close()


show_wave_n_spec()

centos 6.3 + python module scikits.audiolab

原本是想用Java處理就好~ 不過卡在頻譜圖一直畫不出來...
(叫一個工數只有20~40分的程度人來做真是太勉強了Orz...)

最後只好妥協用python的套件...

先講快樂windows安裝包(比起centos真的快樂很多, 前提是找得到)...
選用2.6版本~ 是因為當初找得比較齊的~
還好centos內建也是2.6, 至少轉移上去程式可以不用改...
windows快樂包~ 沒記錯的話應該是(依序安裝)
python-2.6.6rc2.amd64.msi
numpy-MKL-1.7.1.win-amd64-py2.6.exe
matplotlib-1.2.1.win-amd64-py2.6.exe
scikits.audiolab-0.10.2.win32-py2.6.exe

接著就是讓我非常意外的...centos安裝...
明明已經是內建python的環境, 怎麼會裝得那麼淒慘...
真的不知道要怎麼說...以下是到處解決xxx package not found後的統整結果~
可能裡面有多裝了一些什麼碗糕的~ 反正重點就是...能一路裝完就好了T___T...

至於重點應該還是在於
裝好gcc
裝好numpy module(1.6.2)
裝好matplotlib(1.1.1)  <--原本想裝最新版的, 看到前置清單放棄...還好舊版的會動...無言
裝好audiolab(0.11.0)
只是為了裝好其中一個模組~ 大概就是要一直google, 試裝N次...Orz...
安裝像debug一樣~ 真是好樣的open source...喵的


   su
    yum install gcc
   
    su   
    cd /etc/xxx/install
    wget --no-check-certificate http://pypi.python.org/packages/source/d/distribute/distribute-0.6.27.tar.gz
    tar -xvf distribute-0.6.27.tar.gz
    cd distribute-0.6.27
    python setup.py build
    python setup.py install
   
    yum install gcc-gfortran
    yum install blas-devel
    yum install lapack-devel
    yum install python-dev python-devel
    yum install gcc-c++
    yum install libpng-devel
   
    ##install pip
    #yum -y install python-setuptools 
    easy_install pip
    pip install pil
   
    ##install numpy
    cd /etc/xxx/install
    #wget --no-check-certificate https://pypi.python.org/packages/source/n/numpy/numpy-1.7.1.tar.gz#md5=0ab72b3b83528a7ae79c6df9042d61c6
    wget http://downloads.sourceforge.net/project/numpy/NumPy/1.6.2/numpy-1.6.2.tar.gz
    tar -xvf numpy-1.6.2.tar.gz
    cd numpy-1.6.2
    python setup.py build
    python setup.py install
   
    ##
    wget http://downloads.sourceforge.net/project/scipy/scipy/0.11.0/scipy-0.11.0.tar.gz
    tar -xzf scipy-0.11.0.tar.gz
    cd scipy-0.11.0
    python setup.py build
    python setup.py install
   
   
    ##install freetype
    cd /etc/xxx/install
    wget http://sourceforge.net/projects/freetype/files/freetype2/2.5.0/freetype-2.5.0.1.tar.gz/download
    tar -xzf freetype-2.5.0.1.tar.gz
    cd freetype-2.5.0.1
    ./configure --without-png
    make
    make install
   
       
    ##install matplotlib(use 1.1.1 OK!! 1.3 fail...Orz)
    #yum install python-matplotlib   
    wget http://downloads.sourceforge.net/project/matplotlib/matplotlib/matplotlib-1.1.1/matplotlib-1.1.1.tar.gz?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fmatplotlib%2Ffiles%2Fmatplotlib%2Fmatplotlib-1.1.1%2F&amp;ts=1351382082&amp;use_mirror=jaist
    tar -xvf matplotlib-1.1.1.tar.gz
    cd matplotlib-1.1.1
    python setup.py build
    python setup.py install
   
   
    ##install wave module
    wget http://www.mega-nerd.com/libsndfile/files/libsndfile-1.0.25.tar.gz
    tar -xzf libsndfile-1.0.25.tar.gz
    cd libsndfile-1.0.25
    ./configure
    make -j8
    make -j8 install
   
    wget --no-check-certificate https://pypi.python.org/packages/source/s/scikits.audiolab/scikits.audiolab-0.11.0.tar.gz#md5=f93f17211c7763d8631e0d10f37471b0
    tar -xzf scikits.audiolab-0.11.0.tar.gz
    cd scikits.audiolab-0.11.0
    python setup.py build
    python setup.py install

centos 6.3 + apache + php + tomcat

起因1是...Java系統都是tomcat...然後centos吵不是root不能bind 80....
我又不想用root跑tomcat...所以就只好加apache...

因2是...postgresql管理工具, 還是phpPgAdmin比較方便...
反正php都是活在apache下

因3是...因為網管議題乾脆都走http ws比較單純...
所以有東西會從內網proxy->DMZproxy->外網proxy
(喵的~ 我也不想搞成這樣)

因4是...apache(httpd)裝起來好快阿阿阿~~~

因5是...我已經在很努力的精簡過多的功能維護設定...
(之後維護的人接不起來...雖小的還是我~_~)

總之~ 基本架構就是apache+php+tomcat....
依不同的主機跟功能~ 會有兩兩配的情況, 還有os(centos, win server)配...
連安裝建置也要客制化真是要死了
(所以今年決定放棄之前比較熟悉ubuntu陣營了...主因是看到centos的桌面比ubuntu好很多...)

總之底下是php(以phpPgAdmin)安裝法...centos和win安裝差蠻多的~

   su
   ##只要一行就裝完apache, 給個讚
   yum -y install httpd
   #change apache listen port
   vim /etc/httpd/conf/httpd.conf
   Listen 80  ( other port--> Listen *:9080)
   /etc/rc.d/init.d/httpd start
   ###(if perssion deney check this)
   getenforce
   -->Enforcing
   setenforce 0
   getenforce
   -->Permissive
   service httpd start
  
   #check log to see httpd is OK?
   ps -ef | grep http
   cat /var/log/httpd/error_log

 
   ##安裝PHP, 也是一行...好!
   yum -y install php
   ##php test page
   cd /var/www/html/
   vim index.php
<?php
phpinfo();
?>  
   ##restart httpd
   service httpd restart
  
   ##test php
   xxxx/index.php 

   ##安裝phpPgAdmin...真好~
   ##不過有發生過yum找不到package...不知道是剛好被關掉還那邊網路檔掉??
   yum install phpPgAdmin
   #check conf, 預設就只開localhost, 不錯有sense...一般應用就是看情況再多加Allow
   cat /etc/httpd/conf.d/phpPgAdmin.conf
  
<Location /phpPgAdmin>
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1
    Allow from ::1
    # Allow from .example.com
</Location>
  
   cat /etc/php.ini

   #如果不知道被東西被裝到那邊去~ search file一下
   #check where? (test ok it is /usr/share/phpPgAdmin)
   find / -name phpPgAdmin
   exit;
  
   ### 安裝湯姆貓, 個人習慣使用zip安裝, yum資料夾結構亂跑很難處理
   ### 使用一般user, 裝在預設8080就好  
   mkdir tomcat
   cd tomcat
   cp ~/apache-tomcat-7.0.26.tar.gz .
   tar -zxv -f apache-tomcat-7.0.26.tar.gz
   cd apache-tomcat-7.0.26
   bin/startup.sh

   ## open browser link xxxx:8080 to test

   ### more setting
   vim bin/catalina.sh
   add
   JAVA_OPTS="-Xms128m -Xmx1024m"
 
   ### use 80(apache2 proxy, ajp)
   su
   vim /etc/httpd/conf/httpd.conf
   ##(G)加在最底下,
   ##不要用/根目錄 轉導~ 會導致php或其他apache目錄被搶走~
   ##依需要使用對應之路徑就好
   <VirtualHost *:80>
       ServerName mybestappp.com
       ServerAlias www.mybestapp.com

       ProxyRequests Off
       ProxyPreserveHost On

       ErrorLog /etc/xxx/log/httpd.tomcat.error.log
       CustomLog /etc/xxx/log/httpd.tomcat.log combined

       <Proxy *>
              Order deny,allow
               Allow from all
       </Proxy>

       ProxyPass /tomcat ajp://localhost:8009/
       ProxyPassReverse /tomcat ajp://localhost:8009/

       ProxyPass /mywebapp ajp://localhost:8009/mywebapp
       ProxyPassReverse /mywebapp ajp://localhost:8009/mywebapp

   </VirtualHost>

   service httpd restart