2015年3月10日 星期二

DLL


動態連結檔的目的, 就只是共用程式而已, 很單純.

為什麼要共用程式? 如果某段程式, 有許多程式都要用到, 如果都直接寫在exe裡, 那麼一個程式就一份, n個程式便有n份, 使用dll便可以節省成為一份, 這樣共用程式佔用的記憶體便會比較少. 如果該dll已有別人使用, 再執行需要該dll的程式時, 便不必再將該dll重新由硬碟載入, 初始執行的時間相對地也減少. 

使用dll的另一個好處是, 可以不公開程式碼便能分享給別人使用.

*** 其他的相關知識 ***

傳統動態連結檔都可以採用靜態呼叫或動態呼叫. 靜態呼叫指的是經由.lib連結 (Linux則是用-l指定連結, 但檔名必須lib開頭). 當程式執行時, 系統會自動載入該動態連結檔.

動態呼叫是, 當程式有需要時, 才去載入動態連結檔進行呼叫. Windows是使用LoadLibrary配GetProcAddress, Linux是使用dlopen配dlsym.

Windows的.dll檔, 除了傳統的動態連結檔外, 還包括COM與.net元件檔, 這三者的程式架構與呼叫法都完全不同, 雖然副檔名都是dll, 但並不能混為一談.

對於VC++的傳統動態連結檔, 還區分為regular dll與MFC extension dll, 前者指的是可給其他程式(例如VB)使用的dll, 後者是專門給有使用MFC的執行檔使用, 兩者間還是有點差異.




2007/6/12 上午 09:15:55
VC++ DLL 網友的實作經驗如下:

靜態連結: (指的是Compiler階段就連結)
1.先把寫好的DLL compiler,compiler後會產生xxx.DLL 跟xxx.LIB,然後這兩個檔案複製到xxx.c (你的執行檔的原碼)目錄下(印象中好像只要xxx.LIB就可以了。)
2. 然後Compiler xxx.c 變成xxx.EXE。
3. 呼叫xxx.DLL內的函數的時候,直接使用原本名稱就可以了。
4.執行的時候xxx.EXE 要跟xxx.DLL放一起

動態聯結: (指的是執行階段才連結)
1.在你的xxx.c 中去呼叫API LoadLibary()方式去使用你在xxx.DLL中的函數
2.直接Compiler xxx.c 變成xxx.exe
3.把xxx.exe 跟xxx.dll 放一起才能執行。

不管哪一種連結方式,都是把一些程式碼放在xxx.DLL中,只是呼叫的方式跟Compiler方式不太一樣,有時間你自己比較一下就會知道了。

DLL的函數匯出(Export ,簡單說就是哪些函數可以被你的xxx.exe呼叫):
看你要不要使用xxx.def or 利用標頭檔 Export 你的函數,我的經驗是而使用xxx.def 方式最簡單,其他細節請參閱DLL相關說明。

P.S DLL有分成MFC DLL/一般DLL...我是初學者,剛摸沒多久,所以沒寫過MFC,所以上述是一般標準VC++ DLL方式,如有誤請前輩指正。



什麼是DLL?

DLL 是動態連結程式庫, DLL提供一種方法,讓處理序 (Process) 呼叫不是可執行程式碼部分的函式。函式的可執行程式碼位於 DLL 裡,它包含一或多個已編譯、連結的函式,並且儲存在與使用它們的處理序不同的地方。 例如, 我們開發的Canvas, Gesture Handler, Rubik's Cube...等一些應用程式, 都會利用OTMUT.dll來開發Touch/Gesture的相關功能。 這有助於提升程式碼重複使用及有效率的記憶體使用量。

應用程式和 DLL 之間的差異?
雖然 DLL 和應用程式都是可執行程式模組, 但是它們在許多方面卻是不同。對使用者而言,最明顯的差異在於 DLL 不是可以直接執行的程式. 從系統觀點來看,應用程式和 DLL 之間有兩個基本差異: 
  • 應用程式本身可以同時在系統中執行多個執行個體,而 DLL 只能有一個執行個體。
  • 應用程式可以擁有如堆疊、全域記憶體、檔案控制代碼 (File Handle) 和訊息佇列等,而 DLL 則不含這些
動態連結與靜態連結的差異?

動態連結(Dynamic Link Libraries)允許可執行模組 (.DLL 或 .EXE 檔) 只包含在執行階段時用來找出 DLL 函式可執行程式碼的所需資訊。
在靜態連結(Static-Link Libraries)中,連結器 (Linker) 會從靜態連結程式庫取得所有參考函式,並且將它與您的程式碼一起放入可執行檔,它的內容除了程式設計者所設計的程式碼之外,還包含了所使用程式庫的程式碼,所以其檔案變得相當大。

http://support.microsoft.com/kb/815065/zh-tw

DLL 的優點

  • 使用較少的資源
    當多個程式使用相同的媒體櫃的函式, DLL 可以減少重複的程式碼, 會在磁碟上及實體記憶體中載入。 這會大幅影響效能的執行在前景, 不只是程式還 Windows 作業系統上正在執行的其他程式。
  • 模組化結構升級
    DLL 有助於提升開發模組化的程式。 這可協助您開發大型的程式需要有多個語言版本或需要模組化結構的程式。 範例的模組化的程式是帳戶程式有許多可在 Run Time 動態載入的模組。
  • 簡化部署和安裝
    當函式在 DLL 內需要的更新程式或修正程式, 部署和安裝的 DLL 不需要程式, 以與 DLL 重新連結。 除此之外, 如果多個程式使用同一個 DLL, 多個程式將所有獲益更新或修正程式。 當您使用協力廠商 DLL, 定期更新或修正這個問題的發生原因, 是更頻繁地。


在 Windows 作業系統中的檔案:
  • ActiveX 控制項 (. ocx) 檔案
    ActiveX 控制項的範例是行事曆控制項, 可讓您從行事曆中選取一個日期。
  • 控制台 ] (cpl) 檔案
    cpl 檔案的範例是一個項目是位於 [ 控制台 ] 中。 每個項目都是特定的 DLL。
  • 裝置驅動程式 (drv) 檔案
    範例的裝置驅動程式是印表機驅動程式, 以控制列印至印表機。

DLL 相依性

當程式或 DLL 會在另一個 DLL 中使用的 DLL 函式時,會建立相依性。
  • ActiveX 控制項 (.ocx) 檔案
  • ActiveX 控制項的一個例子是可讓您從行事曆選取日期的行事曆控制項。
  • 控制控制台 (.cpl) 檔案
  • .Cpl 檔案的範例是位於 [控制台] 中的項目。
這些動作通常稱為 「 DLL 衝突。




在系統檔案中,有一種類型的檔案常常被各種程式所使用,而且當程式發生錯誤時,也常常會顯示這類檔案的訊息。這個檔案就是DLL檔。當程式出現問題時,我們可能常常會看到類似這種訊息:「xxx.dll發生錯誤,請關閉程式或洽系統管理人員」。

DLL的全名為Dynamic Link Library,一般翻為「動態連結資料庫」。它是系統中的一種「公用檔」,可以視為作業系統與許多應用程式的「共用材料」。當某個DLL發生問題時,所有必須使用這個「共用材料」的程式功能就無法順利執行,然後就可能出玩上述那種錯誤訊息。Windows含有一大堆各式各樣的DLL檔,它們所執掌的功能,大多屬於各種程式所常見的功能,例如當我們在任何程式中開啟視窗時,都會看到相同的外觀(例如它們的右上角都有三個分別代表「縮小」、「放大」、「關閉」的按鈕),操作方式也都相同,這就是Windows內建的標準DLL元件之一,任何程式想要執行視窗的開啟功能時,只要呼叫這個元件來執行即可。同樣,例如對話框、按鈕等常見的必備功能,都是由相關的DLL檔案來負責。

事實上,Windows可以看成由許DLL檔所組成的一套作業系統,這種方式可以讓作業系統容易開發與擴充,例如當作業系統相要對原有功能予以強化或加入一些新功能時,只要對舊有的DLL檔予以更新,或加上新的DLL檔即可,不必重撰寫整套程式碼,節省許多時間與複雜度。

這種做法不僅可以簡化作業系統本身的開發與擴充工作,對任何應用程式的開發而言也較方便。因為開發者可以專注在自己的特定功能,其他一 些Windows環境的標準功能,就交給作系統去負責即可。

此外,這還有一種好處,就是使用者不論使用任何程式,都會接觸相同的基本操作方式,不必每次都重新學習新的操作方法,否則若每個程式都有自己獨特的操作方式,那使用者鐵定受不了。

DLL不僅負責許多基本功能,它還負責一些特定應用的常見功能,例如在Internet環境中,就有一個相當知名的Winsock.dll檔來負責Internet環境中兩台電腦之間的底層溝通。

DLL會出問題,常常發生在兩種情形,一種是某個程式「秀逗」時,它所用到的DLL檔也連帶被系統鎖死,無法被其他程式所用使用,當這個DLL檔屬於核心檔案時,就可能導致一連串的錯誤,甚至當機。

另一種則是DLL檔的版本錯誤。由於功能的不斷強化,各種DLL檔都會常常更新。在更新作業系統時,新版的DLL檔會取代舊的,而在應用程式的安裝過程中,也會出現這種新版取代舊版的情形。當程式在安裝過程中,偵測出系統中已經擁有較新的版本時,一般都會出現訊息告知使用者,並建議保留新版,但若您不小心反而用舊版取代新版時,則日後如果有其他程式也要用到這個DLL時,就可能發生問題囉!

Windows dll 遺失


網站:DLL-files.com

如何將下載好的.dll檔加入電腦?
下載後的檔案是 ZIP 壓縮檔,你必須先解壓縮並將 .dll 檔複製到Windows系統目錄。
通常是 C:\Windows\System (Windows 95/98/Me), 
C:\WINNT\System32 (Windows NT/2000), 或
C:\Windows\System32 (Windows XP) 。
你也許要將 dll 檔放到應用程式指定的資料夾內,
若使用上述的方式還無法解決問題,你可能就必須使用 regsvr32 ,方法如下:
  1. 點選開始 -> 執行
  2. 輸入 CMD 後按下確認
  3. 輸入 regsvr32 “檔名.dll” 然後在按下確認。這樣做就能解決問題。
如果要尋求更多的線上支援服務,可以在 DLL-files.com 的 Live Support 系統註冊。

如果.dll要覆蓋的時候出現檔案使用中或無法覆蓋怎麼辦?
不用急,你可以試著先重新開機,然後在開機時按F8進到安全模式,在安全模式裡再做一次檔案覆蓋,應該就可以覆蓋過去了。
備註:通常會遺失或毀損的dll檔都是放在windows資料夾中的system32中。



2014年12月11日 星期四

DOS指令

設定組態檔位置C:\【config.sys】


md \a\b\c\d 建多層目錄
copy C:\a.lrc + C:\y.txt D:\Folder
move C:\a.txt D:\b.txt /-Y : 提示是否覆蓋
DIR介紹 #Dir microsoft 說明
print a list of the folders and subfolders of a directory to a file.
I only need the folders and sub folders.
dir /s /b /o:n /ad > f.txt

DIR /4 
顯示檔案清單以列出目錄中的檔案及子目錄
DIR /S /A:-D /B /O:N > list.txt
DIR /? 說明
說明指令/? 或執行 help 



Linux相似架構可參考鳥哥
檔案架構
沒有 C:\,取而代之的是根目錄 / ,下面有 /etc, /usr, /mnt, /boot, /home家目錄 等等,可以把任一個指定資料夾分到任一磁碟分割區,如 / 分到第一個分割區, /home 分到第二個分割區,這樣下次重灌不用再備份資料。 
權限 
分為rwx
Linux 的權限是很複雜的,尤其多了一個要有可「執行」權限才可執行程式。 
正規表示法
用來處理字串的方法,幾乎可以處理大部份的問題
指令查詢
除了 /? 、-h 、--help 的方法, Linux 還多了 man 的指令,如可用 man echo 查詢 echo 的用法。 
文字編輯
內建命令列的文字編輯器 vi 有很多指令要記但很重要

參考

簡單的DOS 指令

CMD 命令速查手冊

命令提示字元 00:教學目錄

How do i get a list of folders and subfolders without the files

[CMD] 目錄與檔案管理常用指令

Netbeans之tomcat部署 Deployment error: Starting of Tomcat failed. '127.0.0.1' 不是內部或外部命令、可執行的程式或批次檔

測試netbeans要添加外部tomcat


一直失敗搞了兩天,終於找到解決的方法

如果跑測試時出現錯誤


Deployment error: Starting of Tomcat failed. 
log檔有跑到
ContextListener: contextDestroyed().......
在netbeans啟動tomcat視窗中出現
'127.0.0.1' 不是內部或外部命令、可執行的程式或批次檔。
('127.0.0.1*' is not recognized as an internal or external command)

確定tomcat單獨執行是沒有問題的,但在netbeans無法順利部署
解決方法:

在tomcat中編輯 bin/catalina.bat

拿掉原本JAVA_OPTS字串的雙引號""
例如
:noJuliConfig
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%"
......

:noJuliManager
set "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"
改成
:noJuliConfig
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%
.. ....

:noJuliManager
set JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%


再跑一次測試OK

來源:

Error starting Tomcat from NetBeans - '127.0.0.1*' is not recognized as an internal or external command

網路停用IPv6

window 8 停用IPv6
不需要IPv6可以在控制台>網路>網路和共用中心>網際網路>內容>取消勾選IPv6
過程可參考:

How To Disable IPv6 On Windows 7


其他參考:
Disabling IPv6 in Microsoft Windows 8 and Server 2012

2014年12月8日 星期一

neabean 安裝新版本jdk移除舊版本, jdkhome對照路徑找不到

如果更新jdk後,移除在安裝netbean一併安裝的舊版本jdk,或者安裝時路徑的更動
會導致netbean找不到jdk來源,開啟時會跳出類似下列訊息

Cannot locate Java installation in specified jdkhome:
C:\Program Files\Java\jdk1.8.0_20
Do you want to try to use default version?
解決方法:找到安裝目前jdk路徑(或者找不到趕快安裝)
C:\Program Files (x86)\Java\jdk1.8.0_25後
到netbean安裝目錄C:\Program Files\NetBeans 8.0\etc\netbeans.conf
編輯這個檔案內的jdkhome位置
netbeans_jdkhome="C:\Program Files\Java\jdk1.8.0_20"
改為netbeans_jdkhome="C:\Program Files (x86)\Java\jdk1.8.0_25"

參考:
NetBeans “Cannot locate java installation in specified jdkhome”?

2014年12月7日 星期日

blog搬家參考

目前用blogger來寫練習程式的筆記,
(點這裡看其他文章寫blogger原因Five reasons I recommend daily blogging (even if you disagree))
雖然blogger是最容易上手功能也很像word一樣簡單
但是總覺得版面看得很不順眼哪~
最近打算改用wordpress來寫blog
bloger幾乎成了顯學, 如何編輯一個blogger的資源實在很多,
常見blog平台:
1.blogger
2.wordpress
3.Tumblr.
4.ghost(有人介紹)
5.痞客邦(台灣)
6.微博(大陸)
7. Live Journal(俄國)
其他適合用來架站的還有: Joomla! , Drupal
(好文推THE Best Places to Start a Blog (Updated 2014 Edition))
recommended-blogging-resources/

Ghost 是比較後來推出的平台,有人寫了PK文可以參考看看個人需求

WordPress vs. Ghost – Which Blogging Platform Is Right For You?

wordPress還蠻多人寫中文的架站教學文可以參考




One idea of Computer Technology Trend


I want to apologize I might express not good, but I try my best in the words.

so far as I know google only for crawler from pages of every web site on the internet.
but how about the information through system or the apps ?
Think that one day we don't need to type a lot word into your computer in front of the table.
we can do more like siri, make a virtual reality that time . And we don't wanna a search bar, we want some more anthropocentric that can interact with people. something call automation.
I think this concept occurred in lots of movies ,like in the movie of Resident Evil there is a little robot girl which is a computer can communicate with you.

but Steve Jobs create this possibility, I think so far only little people knew what he was doing is "one little step for man one giant leap for mankind". I think he foresee this great change of computer technology, but what he cannot do is the technique all we have enough technique fulfill this big step for now. so Steve Jobs choose take a little step to lead human forward a least before he died, pretty smart guy right?
What I really want to mention is, I know I'm not the first or only one to think about this.
That's why I want to share this here.With the limitation I know,I believe this rudimentary idea might be down in some way in near future. I present here for I know some will accomplish it or maybe in decades I'm able to make it.



If  you have anything for discussion ,I glad to know your opinion. :)


2014年12月4日 星期四

install JDK8 on linux

from:


To add the WebUpd8 Oracle Java PPA repository and install Oracle Java 8 in Debian, use the following commands:

su -
echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list
echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list
apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886
apt-get update
apt-get install oracle-java8-installer
exit
java -version

//accept the Oracle JDK8 license automatically
echo oracle-java8-installer shared/accepted-oracle-license-v1-1 select true | sudo /usr/bin/debconf-set-selections

//set the Java environment variables
sudo apt-get install oracle-java8-set-default
另一方法為安裝openjdk的套件

How to download and install prebuilt OpenJDK packages

[debian]Debian底下安裝JAVA

Japplet Android apl Certificate


applet 有很嚴格的安全權限限制,所以預設就會有那三項限制
要突破這個限制的作法流程如下: 1. 將此 applet 打包成 jar 檔 2. 使用 keytool 產生 key
3. 使用 jarsigner , sign jar檔,這時要用到剛所產生的 key
 使用java提供的Jarsigner工具來替程式(.apk)簽署金鑰。 4. 寫一下 html tag 即可

轉自https://www.ptt.cc/man/java/D93F/DA/M.1142782269.A.322.html


開發Android時需要準備的金鑰keystore

java環境配置

java環境配置
設JDK安裝路徑:C:\Program Files\Java\jdk1.6.0_05 
以下的變量可以設置成用戶變量,也可以設置成系統變量。
兩者區別只是使用權限的問題而已。

第一種方法:
建立兩個變量:
變量名:PATH 
變量值:C:\Program Files\Java\jdk1.6.0_05\bin 
變量名:CLASSPATH 
變量值:.;C:\Program Files\Java\jdk1. 6.0_05\lib\tools.jar;C:\Program Files\Java\jdk1.6.0_05\jre\lib\dt.jar 
【注意開頭是句號加分好】


第二種方法:
建立三個環境變量
變量名:JAVA_HOME 
變量值:C:\Program Files\Java\jdk1.6.0_05注:JDK安裝路徑
變量名:PATH 
變量值:%JAVA_HOME%\bin 
變量名:CLASSPATH 
變量值:.;%JAVA_HOME%\lib\tools .jar;%JAVA_HOME%\jre\lib\dt.jar [本帖最後由宛南於2009年10月12日14:16編輯] 


tomcat多加一個
變數名:CATALINA_HOME
變量值:C:\Program Files\tomcat7
set CLASSPATH=%CLASSPATH%; %CATALINA_HOME%\common\lib\servlet-api.jar
;%CATALINA_HOME%\common\lib\jsp-api.jar

CNN簡單英文

有些新聞播報的用語,幾乎是所有英文主播(Anchor)或記者(Correspondent)的口頭禪,熟悉這些習慣用法,也會幫聽力加分!
  • We've got some breaking news for you tonight.(最新發展)
  • This just in. You are looking at obviously a very disturbing live shot there.(最新消息;插播一則新聞) 
  • And thank you all for being with us. Tonight, an exclusive in our top story coverage -- for the first time, we're going to take you into Israel's top priority target…….(獨家頭條新聞)
  • Before we go in depth, though, here's where the crisis stands at this hour.(深度報導) 
  • The exclusive interview continues on "LATE EDITION,(獨家訪問)
  • Our sources tell us that, in some cases, the hard drives of computers at Iraqi weapons facilities were replaced...(消息來源指出..) 
  • Stay tuned now for more news in the CNN "NEWSROOM(不要轉台!也可用keep watching:We will keep watching this story)
  • Barbara Starr reporting live from the Pentagon this morning.(現場報導,也可說reporting live at the scene.) 
  • Now, back to you, Marie.(還給主播)






節錄商業週刊

2014年12月3日 星期三

安裝 install Tomcat on linux

安裝文參考:

Nginx+tomcat整合安装配置

Virtual Host + Nginx + Tomcat

http://hosseinkaz.blogspot.tw/2012/06/setting-up-jdk-path-javahome-for.html

 sudo apt-get install tomcat7

~$ sudo service tomcat7 start 出現以下錯誤訊息
Job for tomcat7.service failed. See 'systemctl status tomcat7.service' and 'journalctl -xn' for details.
-- Unit tomcat7.service has begun starting up.
依照指示執行
~$  systemctl status tomcat7.service

出現此訊息
~$ sudo systemctl status tomcat7.service
tomcat7.service - LSB: Start Tomcat.
   Loaded: loaded (/etc/init.d/tomcat7)
   Active: failed (Result: exit-code) since 四 2014-12-04 03:43:40 CST; 2min 36s ago
  Process: 1494 ExecStart=/etc/init.d/tomcat7 start (code=exited, status=1/FAILURE)

12月 04 03:43:40 TAHITI systemd[1]: Starting LSB: Start Tomcat....
12月 04 03:43:40 TAHITI tomcat7[1494]: no JDK or JRE found - please set JAV...!
12月 04 03:43:40 TAHITI systemd[1]: tomcat7.service: control process exite...=1
12月 04 03:43:40 TAHITI systemd[1]: Failed to start LSB: Start Tomcat..
12月 04 03:43:40 TAHITI systemd[1]: Unit tomcat7.service entered failed state.
Hint: Some lines were ellipsized, use -l to show in full.

或~$ journalctl -xn'
-- Logs begin at 四 2014-12-04 03:38:33 CST, end at 四 2014-12-04 03:59:43 CST.
12月 04 03:53:10 TAHITI systemd[1]: Starting Cleanup of Temporary Directories...
-- Subject: Unit systemd-tmpfiles-clean.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
........
12月 04 03:59:43 TAHITI tomcat7[1640]: no JDK or JRE found - please set JAVA_HOME
12月 04 03:59:43 TAHITI systemd[1]: tomcat7.service: control process exited, cod
12月 04 03:59:43 TAHITI systemd[1]: Failed to start LSB: Start Tomcat..
-- Subject: Unit tomcat7.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
........

確定環境都有設定好
~$ javac -version
javac 1.8.0_25
~$ which javac
/usr/bin/javac
~$ which java
/usr/bin/java

~$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games:/usr/lib/jvm/java-8-oracle/bin:/usr/lib/jvm/java-8-oracle/db/bin:/usr/lib/jvm/java-8-oracle/jre/bin
~$  echo $JAVA_HOME
/usr/lib/jvm/java-8-oracle
可是仍然出現沒設好JAVA_HOME訊息
no JDK or JRE found - please set JAVA_HOME


參考:Specify JDK for tomcat7
Setting up jdk path (JAVA_HOME) for Tomcat7 in ubuntu
這時要編輯tomcat設定檔

(也有人說ubuntu下/etc/profile?加上export JAVA_HOME=/usr/local/java/jdk1.8.0_{xx})
/etc/default/tomcat7

註解掉的那一行#JAVA_HOME=/usr/lib/jvm/openjdk-6-jdk
改為設定 sets the JAVA_HOME variable:JAVA_HOME=/usr/lib/jvm/java-8-oracle  
重新restart~$  sudo service tomcat7 start
http://localhost:8080


~$ /usr/share/tomcat7/bin/startup.sh
Using CATALINA_BASE:   /usr/share/tomcat7
Using CATALINA_HOME:   /usr/share/tomcat7
Using CATALINA_TMPDIR: /usr/share/tomcat7/temp
Using JRE_HOME:        /usr/lib/jvm/java-8-oracle
Using CLASSPATH:       /usr/share/tomcat7/bin/bootstrap.jar:/usr/share/tomcat7/bin/tomcat-juli.jar
touch: cannot touch ‘/usr/share/tomcat7/logs/catalina.out’: 沒有此一檔案或目錄

/usr/share/tomcat7/bin/catalina.sh: 385: /usr/share/tomcat7/bin/catalina.sh: cannot create /usr/share/tomcat7/logs/catalina.out: Directory nonexistent

tomcat7's CATALINA_HOME in Debian/Ubuntu

It is under /usr/share/tomcat7/.
One way to find the location is to look into the service startup script /etc/init.d/tomcat7/. You will find these lines in it:
NAME=tomcat7
...
CATALINA_HOME=/usr/share/$NAME
測試下列設定
echo $JAVA_HOME
echo $CATALINA_HOME
echo $CLASSPATH

How to set JAVA_HOME or CATALINA_HOME if I have more than 1 version used for Projects?

Inside the tomcat startup script /bin/catalina.sh, the following environmental variables are used:
  • JAVA_HOME is the path of JDK that used to run the tomcat and web applications
  • CATALINA_HOME is the path of the tomcat binaries files
  • CATALINA_BASE is the path the tomcat configuration files
So , how about this approach? For example :
Install JDK 5.0 to : /opt/jdk5
Install JDK 6.0 to : /opt/jdk6
Install tomcat 6.0 to :/opt/tomcat6
Install tomcat 7.0 to : /opt/tomcat7 
Each of your web application has their own folder to hold their own tomcat 's configuration. For example :/home/web1 for the web application 1
/home/web2 for the web application 2

其他錯誤解決方法

 [tomcat7] systemd service starting problems

One of user suggest to increase "-wait" parameter in "/usr/lib/systemd/system/tomcat7.service".

Configure Tomcat Server

接下來有關Linux上tomcat 配置
有四個主要xml設定檔
  1. server.xmlSet the TCP Port Number
  2. web.xmlEnabling Directory Listing
  3. context.xmlEnabling Automatic Reload  
  4. tomcat-users.xml.

Tomcat設定SSL憑證

if your web wants to provide HTTPS that needs  SSL support  ,which is, data being sent is encrypted by one side, transmitted, then decrypted by the other side before processing
 certification(self-signed SSL certification or public certificaton)
請參考SSL your Tomcat 7+Tomcat - SSL操作大全 

 JKSPKCS11 or PKCS12 format keystores
The JKS format is Java's standard "Java KeyStore" format, and is the format created by the keytool command-line utility. This tool is included in the JDK. The PKCS12 format is an internet standard, and can be manipulated via (among other things) OpenSSL and Microsoft's Key-Manager.


OpenSSL implementing the Secure Sockets Layer (SSL v2/v3) and Transport Layer Security (TLS) protocols. 

用keytool產生鑰匙.keystore 檔(Keytool 是一個JAVA環境下的安全鑰匙與憑證的管理工具)
uses “keytool” command to create a self-signed certificate


$JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA \
  -keystore /path/to/my/keystore
$tomcat7\bin>keytool -genkey -alias tomcat -keyalg RSA -validity 365 -keystore Mykeystore 

~$ $JAVA_HOME/bin/keytool -genkey -alias tomcat -keyalg RSA -validity 365 -keystore mykeystore.jks
產生一個叫mykeystore.jks檔
輸入金鑰儲存庫密碼:  yourpassword你的密碼
重新輸入新密碼: yourpassword你的密碼
您的名字與姓氏為何?
  [Unknown]:  coco liu
您的組織單位名稱為何?
  [Unknown]:  internet
您的組織名稱為何?
  [Unknown]:  internet
您所在的城市或地區名稱為何?
  [Unknown]:  taichung
您所在的州及省份名稱為何?
  [Unknown]:  taiwan
此單位的兩個字母國別代碼為何?
  [Unknown]:  tw
CN=coco liu, OU=internet, O=internet, L=taichung, ST=taiwan, C=tw 正確嗎?
  [否]:  y
輸入 的金鑰密碼yourpassword你的密碼
(RETURN 如果和金鑰儲存庫密碼相同):  
重新輸入新密碼:yourpassword你的密碼

根據這個jks檔產生一個csr檔,輸入命令:
keytool -certreq -alias tomcat -keystore server.jks -file server.csr

顯示keystore的資訊.
/etc/tomcat7/conf$ keytool -list -v -keystore mykeystore.jks
輸入金鑰儲存庫密碼: yourpassword你的密碼


金鑰儲存庫類型: JKS
金鑰儲存庫提供者: SUN

您的金鑰儲存庫包含 1 項目

別名名稱: tomcat
建立日期: 2014/12/4
項目類型: PrivateKeyEntry
憑證鏈長度: 1
憑證 [1]:
擁有者: CN=coco liu, OU=internet, O=internet, L=taichung, ST=taiwan, C=tw
發出者: CN=coco liu, OU=internet, O=internet, L=taichung, ST=taiwan, C=tw
序號: 4507a287
有效期自: Thu Dec 04 21:57:29 CST 2014 到: Fri Dec 04 21:57:29 CST 2015
憑證指紋:
MD5:  4A:DE:B1:B5:79:D0:C5:E7:E5:BC:E5:92:E0:5B:84:25
SHA1: 6A:AB:96:4F:79:77:52:27:31:23:C2:74:5C:F4:4A:9B:DA:B5:6A:3F
SHA256: 54:63:32:7E:34:76:A5:38:15:77:50:7B:15:C6:BB:CB:68:B2:DC:0D:42:C0:E7:39:60:0E:4A:87:0C:E2:A6:BB
簽章演算法名稱: SHA256withRSA
版本: 3
擴充套件: 
#1: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 0D 77 41 E6 8E 29 CC DC   E7 6F A3 0F 05 45 E5 4C  .wA..)...o...E.L
0010: 7E DF D0 D7                                        ....
]
]
*******************************************
*******************************************

Keytool命令行參數說明:
參數說明
-genkey在用戶主目錄中建立一個預設檔".keystore",還會產生一個mykey的別名,mykey中包含用戶的公鑰、私鑰和憑證
-alias別名
-keystore指定密鑰庫的名稱(產生的各類資訊將不在.keystore文件中
-keyalg指定密鑰的演算法
-validity指定建立的憑證有效期多少天
-keysize指定密鑰長度
-storepass指定密鑰庫的密碼
-keypass指定別名條目的密碼
-dname指定憑證擁有者資訊 例如: "CN=sagely,OU=atr,O=szu,L=sz,ST=gd,C=cn"
-list顯示密鑰庫中的憑證詳細資訊
-export將別名指定的憑證導出到文件 keytool -export -alias caroot -file caroot.crt
-file參數指定導出到檔的檔案名
-delete刪除密鑰庫中某條目
-keypasswd修改密鑰庫中指定條目口令 keytool -keypasswd -alias sage -keypass .... -new .... -storepass ... -keystore sage
-import將已簽名數位憑證導入密鑰庫 keytool -import -alias sage -keystore sagely -file sagely.crt
導入已簽名數位憑證用keytool -list -v 以後可以明顯發現多了認證鏈長度,並且把整個CA鏈全部列印出來


根據產生的keystore 修改tomcat設定檔sever.xml(沒有APR的Tomcat)
為伺服器加入自己產生的憑證
拿掉下列Connector標籤註解
加入 keystoreFile="conf/mykeystore.jks"產生的鑰匙位置
和 keystorePass="yourpassword你的密碼" 輸入的密碼

   

改為
   
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS"
               keystoreFile="conf/mykeystore" keystorePass="yourpassword你的密碼" />


瀏覽https://localhost:8443/
就會出現有些網站用https瀏覽時瀏覽器跳出憑證不安全的提示(因為是自己產生的憑證)



Tomcat can use two different implementations of SSL:
  • the JSSE implementation provided as part of the Java runtime (since 1.4)
  • the APR implementation, which uses the OpenSSL engine by default.
APR 連接器
Tomcat還有一個特殊的模組:APR(Apache Portable Runtime)是為了提高Tomcat處理靜態內容性能,提供的元件,其實就是以Apache2.0為核心的一個http服務。在HTTPS方面,APR和Apache一樣採用Openssl,在憑證安裝部分,會簡要說明一下。
Tomcat支援Jave Keystore檔格式作為SSL憑證存儲用途。Java Keystore文件的常見副檔名有.jks和.key。要製作JKS檔,有2種主要方式:
  1. 用JRE自帶的Keytool工具。先產生一個新的jks檔,並到處一個csr檔,然後將csr發給CA簽名,並將簽名後的文件導入jks文件。
  2. 用openssl工具,製作key和csr文件,將csr發給CA簽名得到cer檔,然後將key和cer合併成一個jks檔。


產生certificate

/etc/tomcat7/conf$ sudo keytool -certreq -alias tomcat -keystore /etc/tomcat7/conf/mykeystore.jks -file mycertificate.csr
[sudo] password for user: 
輸入金鑰儲存庫密碼:yourpassword你的密碼
將保存好的.cer檔和製作CSR時候生成的.key一起複製到伺服器上。

將server.cer檔內容複製利用線上工具P7B線上轉換工具轉換為P7B檔保存為cert.txt。
然後將CA簽好的憑證文件cert.txt導入jks文件:
keytool -import -keystore mykeystore.jks -alias tomcat -file cert.txt

P7B檔案是主要與PKCS #7 Certificate相關的Web Files。


tomcat SSL Configuration HOW-TO
http://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html
How To Configure Tomcat To Support SSL Or Https

WIS 匯智
WIS 匯智 SSL 數位憑證Keytool工具介紹

Tomcat 設定技巧 - Top 10 


~$ systemctl status tomcat7.service
Failed to get D-Bus connection: Failed to connect to socket /var/run/dbus/system_bus_socket: 沒有此一檔案或目錄
~$ journalctl -xn

$ sudo service tomcat7 restart
Job for tomcat7.service failed. See 'systemctl status tomcat7.service' and 'journalctl -xn' for details.
$ systemctl status tomcat7.service
Failed to get D-Bus connection: Failed to connect to socket /var/run/dbus/system_bus_socket: 

$ journalctl -xn
-- Logs begin at 五 2014-12-05 04:36:41 CST, end at 五 2014-12-05 05:53:44 CST. --
12月 05 05:53:39 TAHITI sudo[2304]: ayu : TTY=pts/0 ; PWD=/etc/tomcat7 ; USER=root ; COMMAND=/u
12月 05 05:53:39 TAHITI sudo[2304]: pam_unix(sudo:session): session opened for user root by ayu
12月 05 05:53:39 TAHITI systemd[1]: Stopping LSB: Start Tomcat....
-- Subject: Unit tomcat7.service has begun shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit tomcat7.service has begun shutting down.
12月 05 05:53:39 TAHITI tomcat7[2309]: Stopping Tomcat servlet engine: tomcat7.
12月 05 05:53:39 TAHITI systemd[1]: Starting LSB: Start Tomcat....
-- Subject: Unit tomcat7.service has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit tomcat7.service has begun starting up.
12月 05 05:53:44 TAHITI tomcat7[2320]: Starting Tomcat servlet engine: tomcat7 failed!
12月 05 05:53:44 TAHITI systemd[1]: tomcat7.service: control process exited, code=exited status
12月 05 05:53:44 TAHITI systemd[1]: Failed to start LSB: Start Tomcat..
-- Subject: Unit tomcat7.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
-- 
-- Unit tomcat7.service has failed.
-- 
-- The result is failed.
12月 05 05:53:44 TAHITI systemd[1]: Unit tomcat7.service entered failed state.
12月 05 05:53:44 TAHITI sudo[2304]: pam_unix(sudo:session): session closed for user root