摘要: //百度地圖的坐標轉(zhuǎn)換,由于百度地圖在GCJ02協(xié)議的基礎上又做了一次處理,變?yōu)?BD09協(xié)議的坐標,以下是坐標的轉(zhuǎn)化方式,可以方便和其他平臺轉(zhuǎn)化jQuery.MapConvert = { x_pi: 3.14159265358979324 * 3000.0 / 180.0, /// <summary... 閱讀全文
工作中,使用JAVA的JAXP讀取解析XML文件中,就碰到了一件奇件的事。在Web工程中,調(diào)試發(fā)現(xiàn)JAXP實際使用的是Xerces解析器,
可是,當將工程中的一個小Swing工具,與Web使用一樣的jar包,打成一個可執(zhí)行的jar包時,調(diào)試卻發(fā)現(xiàn)JAXP實際使用的是Crimson 解析器,還會發(fā)現(xiàn)解析XML文件時出現(xiàn)錯誤,經(jīng)過分析,發(fā)現(xiàn)Crimson解析器是Sun公司開發(fā)的(實際使用發(fā)現(xiàn)Crimson沒有Xerces解析器穩(wěn)定), 打包在JAVA_HOME/lib/dt.jar包中,這個dt.jar被設置在環(huán)境變量CLASSPATH中了,當運行可執(zhí)行的jar包是,JAXP會使用CLASSPATH的解析器, 在Web工程中的War包則不會。 通過閱讀JDK源碼javax.xml.parsers.FactoryFinder,javax.xml.parsers.SAXParserFactory以及DocumentBuilderFactory發(fā)現(xiàn)JDK按照如下順序: 1 系統(tǒng)屬性javax.xml.parsers.DocumentBuilderFactory或javax.xml.parsers.SAXParserFactory 2 在jdk-dir/lib/jaxp.properties中設定的javax.xml.parsers.DocumentBuilderFactory或javax.xml.parsers.SAXParserFactory屬性 3 運行時jar包中META-INF/services/javax.xml.parsers.DocumentBuilderFactory或javax.xml.parsers.SAXParserFactory文件中設定的值 4. 如果上面的解析器都沒有找到,則使用Crimson。如果還沒有。。。。。。那報ClassNotFound異常了。 通過JAXP查找解析器的順序,我們可以使用下面方式來決定,我們使用的實際解析器, 訪問AIX系統(tǒng)中部署在OC4J中的web 模塊的頁面時遇到這個錯誤: …… 這里是因為IBM的AIX系統(tǒng)使用的是IBM的JDK。而出現(xiàn)這個問題正是因為IBM和SUN的JDK的差異。 具體是因為$JAVA_HOME/jre/lib/jaxp.properties 這個文件。 這個文件以key=value的形式配置和指定實際使用的XML解析器實現(xiàn)類(譬如:javax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl)。在XML解析器初始化之前,JDK首先會搜索System的properties尋找解析器的配置項,如果沒有則會搜索 $JAVA_HOME/jre/lib 路徑下的 jaxp.properties 文件,如果還沒有,接下來會在classpath上的.jar包中尋找,仍然沒有的話就會使用默認的解析器。 實際上這個文件在SUN的JDK中是不存在的。在找不到文件的情況下,最終將使用默認解析器。在IBM的JDK中存在 jaxp.properties這個文件。但是這個文件中默認所有的配置項是注釋掉的,所以在搜索到此處時,不再繼續(xù)向下搜索,但是由于讀取不到配置項,所以會返回null ,于是出現(xiàn)了上文的第一個錯誤。第二個異常大概是因為訪問使用tiles框架的頁面時,由于XML解析器初始化出錯,所以tiles框架的配置文件也就讀取不了了。 Windows 強制刪除文件及文件夾命令一、刪除文件或目錄CMD命令: rd/s/q 盤符:\某個文件夾 (強制刪除文件文件夾和文件夾內(nèi)所有文件) XCOPY復制組文件 COPY復制文件 拷貝目錄和文件——xcopy 在拷貝單個文件時,可以使用copy命令完成,但當我們要成批拷貝文件,甚至連同子目錄一起拷貝時,就要用到xcopy。 一、Xcopy參數(shù)介紹 命令格式:XCOPY source [destination] 一堆可選的參數(shù) 參數(shù)介紹 source 指定要復制的文件。 destination 指定新文件的位置和/或名稱。 /A 只復制有存檔屬性集的文件, 但不改變屬性。 /M 只復制有存檔屬性集的文件, 并關閉存檔屬性。 /D:m-d-y 復制在指定日期或指定日期以后改變的文件。如果沒有提供日期,只復制那些源時間比目標時間新的文件。 /EXCLUDE:file1[+file2][+file3]... 例如,指定如 \obj\ 或 .obj 的字符串會排除目錄 obj 下面的所有文件或帶有 .obj 擴展名的文件。 /P 創(chuàng)建每個目標文件前提示。 /S 復制目錄和子目錄,除了空的。 /E 復制目錄和子目錄,包括空的。 與 /S /E 相同。可以用來修改 /T。 /V 驗證每個新文件。 /W 提示您在復制前按鍵。 /C 即使有錯誤,也繼續(xù)復制。 /I 如果目標不存在,又在復制一個以上的文件, 則假定目標一定是一個目錄。 /Q 復制時不顯示文件名。 /F 復制時顯示完整的源和目標文件名。 /L 顯示要復制的文件。 /G 允許將沒有經(jīng)過加密的文件復制到不支持加密的目標。 /H 也復制隱藏和系統(tǒng)文件。 /R 改寫只讀文件。 /T 創(chuàng)建目錄結構,但不復制文件。不包括空目錄或子目錄。/T /E 包括空目錄和子目錄。 /U 只復制已經(jīng)存在于目標中的文件。 /K 復制屬性。一般的 Xcopy 會重設只讀屬性。 /N 用生成的短名復制。 /O 復制文件所有權和 ACL 信息。 /X 復制文件審核設置(隱含 /O)。 /Y 禁止提示以確認改寫一個現(xiàn)存目標文件。 /-Y 導致提示以確認改寫一個現(xiàn)存目標文件。 /Z 用重新啟動模式復制網(wǎng)絡文件。 二、Xcopy命令實例介紹 ①本機復制文件或文件夾的實例 Xcopy d:\UpdateFiles e:\123 /s /e /y 命令解釋:將D盤的UpdateFiles文件夾中包含的所有東西,全部復制到E盤的123文件夾內(nèi);/s /e /y 參數(shù)說明:在復制文件的同時也復制空目錄或子目錄,如果目標路徑已經(jīng)有相同文件了,使用覆蓋方式而不進行提示。 ②在局域網(wǎng)中的應用實例 Xcopy \\192.168.0.168\UpdateFiles e:\123 /s /e /y 命令解釋:將192.168.0.168這臺計算機的名稱為UpdateFiles的文件夾內(nèi)的所有東西,全部復制到本機的e:\123 文件夾;參數(shù)說明:在復制文件的同時也復制空目錄或子目錄,如果目標路徑已經(jīng)有相同文件了,使用覆蓋方式而不進行提示。 刪除一個或數(shù)個文件。 一、Del參數(shù)介紹 DEL [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names ERASE [/P] [/F] [/S] [/Q] [/A[[:]attributes]] names names 指定一個或數(shù)個文件或目錄列表。通配符可被用來 刪除多個文件。如果指定了一個目錄,目錄中的所 有文件都會被刪除。 /P 刪除每一個文件之前提示確認。 /F 強制刪除只讀文件。 /S 從所有子目錄刪除指定文件。 /Q 安靜模式。刪除全局通配符時,不要求確認。 /A 根據(jù)屬性選擇要刪除的文件。 attributes R 只讀文件 S 系統(tǒng)文件 H 隱藏文件 A 存檔文件 - 表示“否”的前綴 如果命令擴展名被啟用,DEL 和 ERASE 會如下改變: /S 開關的顯示句法會顛倒,即只顯示已經(jīng) 刪除的文件,而不顯示找不到的文件。 有時候我們需要設置一個alarmmanager事件
如果我們就可以看到其中一個微博的alarm 如果我們想看他intent的詳細信息
1、AlarmManager,顧名思義,就是“提醒”,是Android中常用的一種系統(tǒng)級別的提示服務,在特定的時刻為我們廣播一個指定的Intent。簡單的說就是我們設定一個時間,然后在該時間到來時,AlarmManager為我們廣播一個我們設定的Intent,通常我們使用 PendingIntent,PendingIntent可以理解為Intent的封裝包,簡單的說就是在Intent上在加個指定的動作。在使用Intent的時候,我們還需要在執(zhí)行startActivity、startService或sendBroadcast才能使Intent有用。而PendingIntent的話就是將這個動作包含在內(nèi)了。 定義一個PendingIntent對象。 PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,0); 2、AlarmManager的常用方法有三個: (1)set(int type,long startTime,PendingIntent pi); 該方法用于設置一次性鬧鐘,第一個參數(shù)表示鬧鐘類型,第二個參數(shù)表示鬧鐘執(zhí)行時間,第三個參數(shù)表示鬧鐘響應動作。 (2)setRepeating(int type,long startTime,long intervalTime,PendingIntent pi); 該方法用于設置重復鬧鐘,第一個參數(shù)表示鬧鐘類型,第二個參數(shù)表示鬧鐘首次執(zhí)行時間,第三個參數(shù)表示鬧鐘兩次執(zhí)行的間隔時間,第三個參數(shù)表示鬧鐘響應動作。 (3)setInexactRepeating(int type,long startTime,long intervalTime,PendingIntent pi); 該方法也用于設置重復鬧鐘,與第二個方法相似,不過其兩個鬧鐘執(zhí)行的間隔時間不是固定的而已。 3、三個方法各個參數(shù)詳悉: (1)int type: 鬧鐘的類型,常用的有5個值:AlarmManager.ELAPSED_REALTIME、 AlarmManager.ELAPSED_REALTIME_WAKEUP、AlarmManager.RTC、 AlarmManager.RTC_WAKEUP、AlarmManager.POWER_OFF_WAKEUP。 AlarmManager.ELAPSED_REALTIME表示鬧鐘在手機睡眠狀態(tài)下不可用,該狀態(tài)下鬧鐘使用相對時間(相對于系統(tǒng)啟動開始),狀態(tài)值為3; AlarmManager.ELAPSED_REALTIME_WAKEUP表示鬧鐘在睡眠狀態(tài)下會喚醒系統(tǒng)并執(zhí)行提示功能,該狀態(tài)下鬧鐘也使用相對時間,狀態(tài)值為2; AlarmManager.RTC表示鬧鐘在睡眠狀態(tài)下不可用,該狀態(tài)下鬧鐘使用絕對時間,即當前系統(tǒng)時間,狀態(tài)值為1; AlarmManager.RTC_WAKEUP表示鬧鐘在睡眠狀態(tài)下會喚醒系統(tǒng)并執(zhí)行提示功能,該狀態(tài)下鬧鐘使用絕對時間,狀態(tài)值為0; AlarmManager.POWER_OFF_WAKEUP表示鬧鐘在手機關機狀態(tài)下也能正常進行提示功能,所以是5個狀態(tài)中用的最多的狀態(tài)之一,該狀態(tài)下鬧鐘也是用絕對時間,狀態(tài)值為4;不過本狀態(tài)好像受SDK版本影響,某些版本并不支持; (2)long startTime: 鬧鐘的第一次執(zhí)行時間,以毫秒為單位,可以自定義時間,不過一般使用當前時間。需要注意的是,本屬性與第一個屬性(type)密切相關,如果第一個參數(shù)對 應的鬧鐘使用的是相對時間(ELAPSED_REALTIME和ELAPSED_REALTIME_WAKEUP),那么本屬性就得使用相對時間(相對于 系統(tǒng)啟動時間來說),比如當前時間就表示為:SystemClock.elapsedRealtime();如果第一個參數(shù)對應的鬧鐘使用的是絕對時間 (RTC、RTC_WAKEUP、POWER_OFF_WAKEUP),那么本屬性就得使用絕對時間,比如當前時間就表示 為:System.currentTimeMillis()。 (3)long intervalTime:對于后兩個方法來說,存在本屬性,表示兩次鬧鐘執(zhí)行的間隔時間,也是以毫秒為單位。 (4)PendingIntent pi: 綁定了鬧鐘的執(zhí)行動作,比如發(fā)送一個廣播、給出提示等等。PendingIntent是Intent的封裝類。需要注意的是,如果是通過啟動服務來實現(xiàn)鬧鐘提 示的話,PendingIntent對象的獲取就應該采用Pending.getService(Context c,int i,Intent intent,int j)方法;如果是通過廣播來實現(xiàn)鬧鐘提示的話,PendingIntent對象的獲取就應該采用 PendingIntent.getBroadcast(Context c,int i,Intent intent,int j)方法;如果是采用Activity的方式來實現(xiàn)鬧鐘提示的話,PendingIntent對象的獲取就應該采用 PendingIntent.getActivity(Context c,int i,Intent intent,int j)方法。如果這三種方法錯用了的話,雖然不會報錯,但是看不到鬧鐘提示效果。 4.舉例說明:定義一個鬧鐘,5秒鐘重復響應。 (1)MainActivity,在onCreate中完成: //創(chuàng)建Intent對象,action為ELITOR_CLOCK,附加信息為字符串“你該打醬油了” Intent intent = new Intent("ELITOR_CLOCK"); intent.putExtra("msg","你該打醬油了"); //定義一個PendingIntent對象,PendingIntent.getBroadcast包含了sendBroadcast的動作。 //也就是發(fā)送了action 為"ELITOR_CLOCK"的intent PendingIntent pi = PendingIntent.getBroadcast(this,0,intent,0); //AlarmManager對象,注意這里并不是new一個對象,Alarmmanager為系統(tǒng)級服務 AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); /設置鬧鐘從當前時間開始,每隔5s執(zhí)行一次PendingIntent對象pi,注意第一個參數(shù)與第二個參數(shù)的關系 // 5秒后通過PendingIntent pi對象發(fā)送廣播 am.setRepeating(AlarmManager.RTC_WAKEUP,System.currentTimeMillis(),5*1000,pi); 那么啟動MainActivity之后,由于定義了AlarmManager am,并且調(diào)用了am.setRepeating(...)函數(shù),則系統(tǒng)每隔5s將會通過pi啟動intent發(fā)送廣播,其action為ELITOR_CLOCK。所以我們需要在Manifest.xml中注冊一個receiver,同時自己定義一個廣播接收器類。 (2)定義一個廣播接收器類MyReceiver,重寫onReceive()函數(shù)。 public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.d("MyTag", "onclock......................"); String msg = intent.getStringExtra("msg"); Toast.makeText(context,msg,Toast.LENGTH_SHORT).show(); } } (3)在Manifest.xml中注冊廣播接收器: <receiver android:name=".MyReceiver"> <intent-filter> <action android:name="ELITOR_CLOCK" /> </intent-filter> </receiver> 當我們從網(wǎng)上下載的原版蘋果系統(tǒng)是DMG格式的,要做系統(tǒng)引導必須做成ISO才能做系統(tǒng)盤,所以本文介紹在Windows7下如何來制作蘋果系統(tǒng)光盤,各位黑蘋果的童鞋要注意了。 準備以下三個東西。 1、蘋果OS10.8種子下載 OS X 10.8 正式版種子.torrent 2、 制作光盤工具UltraISO UltraISO破解帶注冊碼.zip 3、7zip http://www.7-zip.org/ 用種子下載整個鏡像,是InstallESD.dmg,用7zip打開。
![]()
進入 InstallMacOSX.pkg 目錄 提取 InstallESD.dmg 這個才是真正的鏡像文件。
![]()
我們可以改個名字,再進行格式轉(zhuǎn)換。
![]()
轉(zhuǎn)換成標準ISO,這個ISO才是我們要的光盤文件,可以來引導安裝蘋果系統(tǒng)。
![]()
介紹完畢,各位想裝蘋果系統(tǒng)要注意,使用原版蘋果系統(tǒng)都要提取轉(zhuǎn)換鏡像,適用于OS X 10.7\OS X 10.8.
在英文輸入法模式下: 0-9 對應的keyCode是 48-57
在中文輸入法模式下: 數(shù)字和字母的按鍵,以及tab鍵的keyCode為229 回車的回車的 keyCode 為8
以后在JS中少用按鍵的keyCode來判斷數(shù)字的輸入 直接用String.fromCharCode的方法來獲得輸入的字符,然后進行正則表達式的判讀
找到一種可以屏蔽復制,拖曳的方法,并且只能輸入數(shù)字,而且使用能讓輸入法的框消失 [xhtml] view plaincopy
另外注意,小鍵盤的onKeyPress 和 onKeyDown的 keyCode是不一樣的
Android SDK的tools目錄下提供了一個sqlite3.exe工具,這是一個簡單的sqlite數(shù)據(jù)庫管理工具。開發(fā)者可以方便的使用其對sqlite數(shù)據(jù)庫進行命令行的操作。 程序運行生成的*.db文件一般位于"/data/data/項目名(包括所處包名)/databases/*.db",因此要對數(shù)據(jù)庫文件進行操作需要先找到數(shù)據(jù)庫文件: 1、進入shell 命令 adb shell 2、找到數(shù)據(jù)庫文件 #cd data/data #ls --列出所有項目 #cd project_name --進入所需項目名 #cd databases #ls --列出現(xiàn)寸的數(shù)據(jù)庫文件 3、進入數(shù)據(jù)庫 #sqlite3 test_db --進入所需數(shù)據(jù)庫 會出現(xiàn)類似如下字樣: SQLite version 3.6.22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> 至此,可對數(shù)據(jù)庫進行操作。
4、sqlite常用命令 >.databases --產(chǎn)看當前數(shù)據(jù)庫 >.tables --查看當前數(shù)據(jù)庫中的表 >.help --sqlite3幫助 >.schema --各個表的生成語句
因CooCox用戶數(shù)及影響力越來越大,CooCox團隊也逐漸提高了對軟件及代碼協(xié)議的重視。在收集整理的過程中,一些歸納好的信息和大家分享一下。
首先借用有心人士的一張相當直觀清晰的圖來劃分各種協(xié)議:開源許可證GPL、BSD、MIT、Mozilla、Apache和LGPL的區(qū)別 ![]() 以下是上述協(xié)議的簡單介紹: BSD開源協(xié)議 BSD開源協(xié)議是一個給于使用者很大自由的協(xié)議。基本上使用者可以”為所欲為”,可以自由的使用,修改源代碼,也可以將修改后的代碼作為開源或者專有軟件再發(fā)布。 但”為所欲為”的前提當你發(fā)布使用了BSD協(xié)議的代碼,或則以BSD協(xié)議代碼為基礎做二次開發(fā)自己的產(chǎn)品時,需要滿足三個條件: 如果再發(fā)布的產(chǎn)品中包含源代碼,則在源代碼中必須帶有原來代碼中的BSD協(xié)議。 如果再發(fā)布的只是二進制類庫/軟件,則需要在類庫/軟件的文檔和版權聲明中包含原來代碼中的BSD協(xié)議。 不可以用開源代碼的作者/機構名字和原來產(chǎn)品的名字做市場推廣。 BSD 代碼鼓勵代碼共享,但需要尊重代碼作者的著作權。BSD由于允許使用者修改和重新發(fā)布代碼,也允許使用或在BSD代碼上開發(fā)商業(yè)軟件發(fā)布和銷售,因此是對商業(yè)集成很友好的協(xié)議。而很多的公司企業(yè)在選用開源產(chǎn)品的時候都首選BSD協(xié)議,因為可以完全控制這些第三方的代碼,在必要的時候可以修改或者二次開發(fā)。 Apache Licence 2.0 Apache Licence是著名的非盈利開源組織Apache采用的協(xié)議。該協(xié)議和BSD類似,同樣鼓勵代碼共享和尊重原作者的著作權,同樣允許代碼修改,再發(fā)布(作為開源或商業(yè)軟件)。需要滿足的條件也和BSD類似: 需要給代碼的用戶一份Apache Licence 如果你修改了代碼,需要再被修改的文件中說明。 在延伸的代碼中(修改和有源代碼衍生的代碼中)需要帶有原來代碼中的協(xié)議,商標,專利聲明和其他原來作者規(guī)定需要包含的說明。 如果再發(fā)布的產(chǎn)品中包含一個Notice文件,則在Notice文件中需要帶有Apache Licence。你可以在Notice中增加自己的許可,但不可以表現(xiàn)為對Apache Licence構成更改。 Apache Licence也是對商業(yè)應用友好的許可。使用者也可以在需要的時候修改代碼來滿足需要并作為開源或商業(yè)產(chǎn)品發(fā)布/銷售。 GPL 我們很熟悉的Linux就是采用了GPL。GPL協(xié)議和BSD, Apache Licence等鼓勵代碼重用的許可很不一樣。GPL的出發(fā)點是代碼的開源/免費使用和引用/修改/衍生代碼的開源/免費使用,但不允許修改后和衍生的代碼做為閉源的商業(yè)軟件發(fā)布和銷售。這也就是為什么我們能用免費的各種linux,包括商業(yè)公司的linux和linux上各種各樣的由個人,組織,以及商業(yè)軟件公司開發(fā)的免費軟件了。 GPL協(xié)議的主要內(nèi)容是只要在一個軟件中使用(”使用”指類庫引用,修改后的代碼或者衍生代碼)GPL 協(xié)議的產(chǎn)品,則該軟件產(chǎn)品必須也采用GPL協(xié)議,既必須也是開源和免費。這就是所謂的”傳染性”。GPL協(xié)議的產(chǎn)品作為一個單獨的產(chǎn)品使用沒有任何問題,還可以享受免費的優(yōu)勢。 由于GPL嚴格要求使用了GPL類庫的軟件產(chǎn)品必須使用GPL協(xié)議,對于使用GPL協(xié)議的開源代碼,商業(yè)軟件或者對代碼有保密要求的部門就不適合集成/采用作為類庫和二次開發(fā)的基礎。 其它細節(jié)如再發(fā)布的時候需要伴隨GPL協(xié)議等和BSD/Apache等類似。 LGPL LGPL是GPL的一個為主要為類庫使用設計的開源協(xié)議。和GPL要求任何使用/修改/衍生之GPL類庫的的軟件必須采用GPL協(xié)議不同。LGPL 允許商業(yè)軟件通過類庫引用(link)方式使用LGPL類庫而不需要開源商業(yè)軟件的代碼。這使得采用LGPL協(xié)議的開源代碼可以被商業(yè)軟件作為類庫引用并發(fā)布和銷售。 但是如果修改LGPL協(xié)議的代碼或者衍生,則所有修改的代碼,涉及修改部分的額外代碼和衍生的代碼都必須采用LGPL協(xié)議。因此LGPL協(xié)議的開源代碼很適合作為第三方類庫被商業(yè)軟件引用,但不適合希望以LGPL協(xié)議代碼為基礎,通過修改和衍生的方式做二次開發(fā)的商業(yè)軟件采用。 GPL/LGPL都保障原作者的知識產(chǎn)權,避免有人利用開源代碼復制并開發(fā)類似的產(chǎn)品 MIT MIT是和BSD一樣寬范的許可協(xié)議,作者只想保留版權,而無任何其他了限制.也就是說,你必須在你的發(fā)行版里包含原許可協(xié)議的聲明,無論你是以二進制發(fā)布的還是以源代碼發(fā)布的. MPL MPL是The Mozilla Public License的簡寫,是1998年初Netscape的 Mozilla小組為其開源軟件項目設計的軟件許可證。MPL許可證出現(xiàn)的最重要原因就是,Netscape公司認為GPL許可證沒有很好地平衡開發(fā)者對源代碼的需求和他們利用源代碼獲得的利益。同著名的GPL許可證和BSD許可證相比,MPL在許多權利與義務的約定方面與它們相同(因為都是符合OSIA 認定的開源軟件許可證)。但是,相比而言MPL還有以下幾個顯著的不同之處: ◆ MPL雖然要求對于經(jīng)MPL許可證發(fā)布的源代碼的修改也要以MPL許可證的方式再許可出來,以保證其他人可以在MPL的條款下共享源代碼。但是,在MPL 許可證中對“發(fā)布”的定義是“以源代碼方式發(fā)布的文件”,這就意味著MPL允許一個企業(yè)在自己已有的源代碼庫上加一個接口,除了接口程序的源代碼以MPL 許可證的形式對外許可外,源代碼庫中的源代碼就可以不用MPL許可證的方式強制對外許可。這些,就為借鑒別人的源代碼用做自己商業(yè)軟件開發(fā)的行為留了一個豁口。 ◆ MPL許可證第三條第7款中允許被許可人將經(jīng)過MPL許可證獲得的源代碼同自己其他類型的代碼混合得到自己的軟件程序。 ◆ 對軟件專利的態(tài)度,MPL許可證不像GPL許可證那樣明確表示反對軟件專利,但是卻明確要求源代碼的提供者不能提供已經(jīng)受專利保護的源代碼(除非他本人是專利權人,并書面向公眾免費許可這些源代碼),也不能在將這些源代碼以開放源代碼許可證形式許可后再去申請與這些源代碼有關的專利。 ◆ 對源代碼的定義 而在MPL(1.1版本)許可證中,對源代碼的定義是:“源代碼指的是對作品進行修改最優(yōu)先擇取的形式,它包括:所有模塊的所有源程序,加上有關的接口的定義,加上控制可執(zhí)行作品的安裝和編譯的‘原本’(原文為‘Script’),或者不是與初始源代碼顯著不同的源代碼就是被源代碼貢獻者選擇的從公共領域可以得到的程序代碼。” ◆ MPL許可證第3條有專門的一款是關于對源代碼修改進行描述的規(guī)定,就是要求所有再發(fā)布者都得有一個專門的文件就對源代碼程序修改的時間和修改的方式有描述。 |