『壹』 怎麼看nginx是否打開rewrite
對於nginx的各種指令而言,如果想知道該指令的配置格式和位置,那麼比較好的一種方式就是查看nginx的源碼,正所謂「源碼面前,了無秘密」。rewrite指令在nginx的http的rewrite模塊中定義(src/http/ngx_http_rewrite_mole.c)。查看一下該模塊的指令數組可以看到如下的代碼:staticngx_command_tngx_http_rewrite_commands[]={{ngx_string("rewrite"),NGX_HTTP_SRV_CONF|NGX_HTTP_SIF_CONF|NGX_HTTP_LOC_CONF|NGX_HTTP_LIF_CONF|NGX_CONF_TAKE23,ngx_http_rewrite,NGX_HTTP_LOC_CONF_OFFSET,0,NULL},//}從源碼可以看出,rewrite可以出現的地方有4個:NGX_HTTP_SRV_CONF,NGX_HTTP_SIF_CONF,NGX_HTTP_LOC_CONF,NGX_HTTP_LIF_CONF。分別對應著:NGX_HTTP_SRV_CONF:配置文件中的server域中的任何地方;NGX_HTTP_SIF_CONF:配置文件中server域中的if配置中;NGX_HTTP_LOC_CONF:配置文件中的location域中的任何地方;NGX_HTTP_LIF_CONF:配置文件中的location域中的if配置中;舉例如下://server{//rewrite"^/+$"/index.phpbreak;if($uri~*"^/+abc"){rewrite"^/+abc"/abc/index.phpbreak;}location/xy{rewrite"^/+xy$"/xy/index.phpbreak;}}
『貳』 如何開啟4k對齊
1.利用DiskGenius做4k對齊先選硬碟,手頭硬碟不能格,用U盤代替。新建分區。
(2)lif文件可以轉換格式擴展閱讀:
4k對齊對ssd(固態硬碟)效果很大,hdd(機械硬碟)較小,4k對齊要在已經格式化的硬碟上,不然不會提示對齊選項,也無法修改參數,並且要刪除所有分區。
磁碟沒有這個4K對齊的問題,以前用的是Win98,XP等系統,機械硬碟,容量很小,扇區都是默認512KB大小,分區時,以簇為單位,一般一個簇8KB,16KB,最大也就32KB,簇越小,越能節約磁碟空間。
現在大容量硬碟不在乎那幾個KB空間了,每個簇都是2048KB或4096KB,反而文件越小,浪費空間越大,反而影響磁碟讀取速度,以及使用壽命。
尤其是現在的固態硬碟,都是SLC顆粒還是MLC顆粒,這種固態硬碟的扇區為4KB,前面63個扇區為引導存儲區。
如果每個簇分成512B,會使後面的每4K(即4096)跨兩個扇區,這要,存儲一個文件,不管多少,都會佔用兩個扇區,就造成了很大浪費,必須要對齊4K才行。
『叄』 新買了個筆記本硬碟 哪種格式好為什麼
問題很詳細!
先來了解一下他們的區別:
FAT32:隨著大容量硬碟的出現,從Windows98開始,FAT32開始流行。它是FAT16的增強版本,可以支持大到2TB(2048G的分區。FAT32使用的簇比FAT16小,從而有效地節約了硬碟空間。
NTFS:微軟Windows NT內核的系列操作系統支持的、一個特別為網路和磁碟配額、文件加密等管理安全特性設計的磁碟格式。隨著以NT為內核的Windows 2000/ XP的普及,很多個人用戶開始用到了NTFS。NTFS也是以簇為單位來存儲數據文件,但NTFS中簇的大小並不依賴於磁碟或分區的大小。簇尺寸的縮小不但降低了磁碟空間的浪費,還減少了產生磁碟碎片的可能。NTFS支持文件加密管理功能,可為用戶提供更高層次的安全保證。
1、很顯然,如果沒有特殊要求,ntfs格式對系統是最好的,或多或少能提高性能;但是用fat格式也有,那就是兼容性。我就是保留一個小空間為fat格式,因為ghost還原識別不了ntfs。
2、雙系統用fat,也是兼容性的問題,如果其中一個系統是win2000或者以前的,那必須是fat格式,如果都是以後的系統,就無所謂了。
『肆』 用什麼程序打開.lif格式的圖片
用《批量圖片格式轉換大師》可以轉換成其它格式,然後...
『伍』 APK安裝(一)—— PMS原理分析
在 APK安裝概述 中曾提及apk有四種安裝場景,但無論是哪一種方式,最終會提交給 PackageManagerService 處理,只是前置的處理鏈路 不同,所以本篇先對 PMS 這一主要過程進行分析。 frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java 【基於Android 9.0】
1、對特定的一些系統進程信息進行設置處理,並保存到 Settings 中
2、解析 /etc/permissions 下相關xml文件取得系統相關許可權、系統具備的相關功能等信息
3、解析 /data/system/package.xml 文件獲取已安裝應用的相關信息
4、對相關的 apk 和 jar 進行 dex 優化處理,主要是 /system/framework 目錄下的相關jar和apk
5、依據 sharedUserId 這個配置來確定 apk 運行在哪個進程,然後把運行的相關進程信息加入到 Settings 中,使得系統可以知道每個 apk 運行在哪個進程中
6、解析 AndroidManifest.xml 文件,提煉文件中的節點信息
7、掃描本地文件,主要針對系統應用、本地安裝應用等等
8、管理本地 apk ,包括安裝、刪除等
前面說到 APK 的信息會提交給 PMS 進行安裝的一系列工作,具體是通過 PackageHandler 發送消息來驅動 APK 的復制和安裝,其時序圖如下:
上相過程中有幾點需要說明:
1、在 installStage 方法中創建了 InstallParams 對象,它對應於包的安裝數據,並創建 INIT_COPY 消息並發送給 PackageHandler 進行處理;
2、 PackageHandler 在處理 INIT_COPY 消息時,會先判斷是否綁定了 DefaultContainerService ,這是用於檢查和賦值可移動文件的服務,比較耗時,所以和 PMS 並沒有運行在同一個進程中,它們之間通過 IMediaContainerService 進行 IPC 通信,沒有綁定則會進行綁定,之後
DefaultContainerConnection 同樣是定義在 PMS 中,執行鏈路如下:
3、發送 MCS_BOUND 消息時,根據發送的 Message 是否帶 Object 分為兩種,如下所示:
4、 MCS_BOUND 消息的處理:
HandlerParams 是 PMS 中的抽象類,它的實現類為 PMS 的內部類 InstallParams 。 HandlerParams 的 startCopy 方法如下所示:
PackageManagerService.java#HandlerParams
在 注釋① 處調用抽象方法 handleStartCopy ,具體實現在 InstallParams 中,如下所示:
PackageManagerService.java#InstallParams
1、 注釋① 處確定了 APK 的安裝位置。
2、 注釋② 處創建 InstallArgs 對象,此對象是一個抽象類,定義了 APK 的復制和重命名APK等安裝邏輯,在 Android 8.x 及之前的版本中有三個子類: FileInstallArgs、AsecInstallArgs、MoveInstallArgs 。其中 FileInstallArgs 用於處理安裝到非ASEC的存儲空間的APK,即內部存儲空間(Data分區); AsecInstallArgs 用於處理安裝到ASEC(mnt/asec)即SD卡中的APK; MoveInstallArgs 用於處理已安裝APK的移動的邏輯;但在 Android 9.x 之後已經去掉了 AsecInstallArgs ,
3、 注釋③ 處調用 InstallArgs 的 Apk 方法,這里以 FileInstallArgs 的實現為例,內部會調用 FileInstallArgs 的 doCopyApk 方法:
1、 注釋① 處用於創建臨時存儲目錄,比如 /data/app/vmdl18300388.tmp ,其中 18300388 是安裝的 sessionId ;
2、 注釋② 處通過 IMediaContainerService 跨進程調用 DefaultContainerService 的 Package 方法,這個方法會在 DefaultContainerService 所在的進程中將 APK 復制到臨時存儲目錄,比如 /data/app/vmdl18300388.tmp/base.apk ,至此 APK 的復制工作結束。
在上述 APK 的賦值調用鏈的過程中,在 HandlerParams 的 startCopy 方法中,會調用 handleReturnCode 方法,時序圖如下:
PackageManagerService#handleReturnCode :
注釋① 處檢查APK的狀態,在安裝前確保安裝環境的可靠,如果不可靠會清除復制的APK文件, 注釋③ 處會檢測是否安裝成功,失敗則刪除安裝相關的目錄和文件。安裝完成之後在 注釋⑤ 處會發送 POST_INSALL 消息通知已安裝完成,此處稍後會說明。
注釋② 處的 installPackageTracedLI 會調用 PMS 的 installPackageLI 方法:
PackageManagerService.java#installPackageLI :
這里需要說明幾點:
1、 注釋③ 處,會先檢測 Settings 中保存有要安裝的 APK 信息,則說明安裝該 APK ,因此需要檢驗APK 的簽名信息,確保安全的進行替換。
2、 注釋④ 處,會對臨時文件重新命名,例如 /data/app/vmdl18300388.tmp/base.apk ,重命名為 /data/app/包名-oONlnRRPYyleU63AveqbYA==/base.apk 。新的包名後面帶上的一串字母和數字的混合字元串,是使用MD5的方式對隨機生成的16個字元進行加密之後的產物。
3、 注釋⑤ 處,根據 replace 來做區分,如果是替換安裝就會調用replacePackageLIF方法,其方法內部還會對系統APP和非系統APP進行區分處理,如果是新安裝APK會調用installNewPackageLIF方法
PackageManagerService.java#installNewPackageLIF :
在上面 processPendingInstall 方法的源碼分析中,在 注釋⑤ 處會發送 POST_INSTALL 消息通知安裝完成,那麼接下來就來具體看一看在 PackageHandler 中是怎麼處理這個消息的。
以上為主要的方法摘要,具體可總結為:
1、第一步:這里主要是先將安裝信息從安裝列列表中移除,這個也是前面在processPendingInstall中添加的
2、第二步:安裝成功後,獲取運行時許可權
3、第三步:獲取許可權後,發送ACTION_PACKAGE_ADDED廣播,告訴Laucher之流,更新icon
4、第四步:如果是升級更新則在發送兩條廣播
5、第五步:如果安裝包中設置了PRIVATE_FLAG_FORWARD_LOCK或者被要求安裝在SD卡上,則調用sendResourcesChangedBroadcast方法來發送一個資源更改的廣播
6、第六步:如果該應用是一個瀏覽器,則要清除瀏覽器設置,重新檢查瀏覽器設置
7、第七步:強制調用gc,出發JVM進行垃圾回收操作
8、第八步:刪除舊的安裝信息
9、回調回調 IPackageInstallObserver2 的 packageInstalled 方法。告訴 PackageInstaller 安裝結果。從而實現了安裝回調到UI層
上述幾部分大致說明 PMS 處理 APK 的主要步驟,可總結如下:
1、當 PackageInstaller 將 APK 的信息提交給 PMS 處理, PMS 會通過向 PackageHandler 發送消息來驅動 APK 的復制和安裝工作
2、 PMS 發送 INIT_COPY 和 MCS_BOUND 類型的消息,控制 PackageHandler 來綁定 DefaultContainerService 來完成 APK 的復制等工作
3、復制 APK 完成之後,則開始進行安裝 APK 的流程,包括安裝前的檢查、安裝 APK 和安裝後的收尾工作。
[ 1 ] https://maoao530.github.io/2017/01/18/package-install/
[ 2 ] https://blog.csdn.net/yiranfeng/article/details/103941371
[ 3 ] http://liuwangshu.cn/framework/pms/3-pms-install.html
[ 4 ] https://www.freesion.com/article/5119749905/
[ 5 ] https://www.jianshu.com/p/9ddb930153b7
『陸』 RO練金的生命體問題
RO文件夾下有個AI文件夾AI.LUA,用記事本打開
把function GetMyEnemy (myid)
local result = 0
local type = GetV (V_HOMUNTYPE,myid)
if (type == LIF or type == LIF_H or type == AMISTR or type == AMISTR_H or type == LIF2 or type == LIF_H2 or type == AMISTR2 or type == AMISTR_H2) then
result = GetMyEnemyA (myid)
elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H or type == FILIR2 or type == FILIR_H2 or type == VANILMIRTH2 or type == VANILMIRTH_H2) then
result = GetMyEnemyB (myid)
end
return result
end
修改下
function GetMyEnemy (myid)
local result = 0
local type = GetV (V_HOMUNTYPE,myid)
if (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H or type == FILIR2 or type == FILIR_H2 or type == VANILMIRTH2 or type == VANILMIRTH_H2) then
result = GetMyEnemyA (myid)
elseif (type == LIF or type == LIF_H or type == AMISTR or type == AMISTR_H or type == LIF2 or type == LIF_H2 or type == AMISTR2 or type == AMISTR_H2) then
result = GetMyEnemyB (myid)
end
return result
end
游戲輸入/hoai
好吧`同樣的問題就重復遍好了,lif和amistr都是被動的,filir和vanilmirth是主動的,按我的修改可以讓他們兩個變幻下
『柒』 lif文件 打開
在可編程器件設計領域,有一種軟體叫PDS,設計可形成LIF文件。
如果是這種文件,用LATTICE的PDS可打開
『捌』 如何將icns文件轉成PNG文件
1、網路上的免費icns轉成png的網站都開始收費了。
2、藉助工具可以進行轉換。如圖片格式轉換大師。它可以支持從bmp,dib,jpeg,jpg,jpe,png,pbm,pgm,ppm,sr,ras,cur,tif,tiff,png,raw,psd,jp2,cut,dcx,dicom,dcm,dds,exr,fits,fit,ftx,hdr,icns,iff,iwi,lbm,lif,mdl,mp3,pal,pcd,pcx,pic,pgm,pnm,psp,pix,pxr,rot,sgi,bw,rgb,rgba,texture,tga,tpl,utx,wal,vtf,wdp,hdp,xpm,wmf,emf批量轉換成:
bmp,dib,jpeg,jpg,jpe,png,psd,pbm,pgm,ppm,sr,ras,tiff,tif,dds,exr,h,hdr,jp2,pal,pcx,pnm,raw,sgi,bw,rgb,rgba,tga,vtf,gif格式。
3、下載地址:http://www.sharebank.com.cn/site/soft/SoftView_34066.htm。如圖:
4、圖片格式轉換大師可以免費下載試用,但是試用版有使用次數、時間和功能上的限制。注冊購買以後試用限制會被解除。
『玖』 設整形變數x=10,則表達式2<x<8的值
編輯
:kenwoodjw
對於機器學習演算法工程師而言,Python是不可或缺的語言,它的優美與簡潔令人無法自拔。那麼你過Python編程面試題嗎?從Python基礎到網頁爬蟲你是否能全方位Hold住?今天,為讀者們推薦一個Github項目。
在這個項目中, kenwoodjw 准備了近 300 道 Python 面試題,同時還包含解決方案與代碼。主要從 Python 基礎、高級語句、網頁應用、資料庫和測試等角度提問,讀者可只自己需要的領域。目前該項目已經完成了很多基礎和高級面試題,本文主要摘取一些 Python 面試題供大家參考。
項目地址:https://github.com/kenwoodjw/python_interiew_question
總體而言,項目有近300道面試題。雖然該項目剛開始創建,但很多Python面試題都已經提供決方案。如下所示為面試題示例:
本文截取了一些面試題及解決方案:
Python 基礎文件操作模塊與包數據類型企業面試題Python 高級設計模式系統編程如果希望機器學習面試題,可閱讀:春招已近,這份GitHub萬星的ML演算法面試大全請收下
Python 基礎
什麼是 Python?根據Python 創建者 Guido an Rossum 所言,Python是一種高級編程語言,其設計的核心理念是代碼的易讀性,以及允許編程者通過若干行代碼輕松表達想法創意。實際上,很多開發者選擇學習 Python 的首要原因是其編程的優美性,用它編碼和表達想法非常自然。
文件操作
1.若有一個jsonline格式的文件file.txt,大小約為10K,我們的處理方式為:
defget_lines(): l = []with open('file.txt', 'rb') as f:for eachline in f: l.append(eachline)return lif __name__ == '__main__':for e in get_lines(): process(e) #處理每一行數據
現在要處理一個大小為10G的file.txt文件,但是內存只有4G。如果在只修改get_lines 函數而其他代碼保持不變的情況下,應該如何實現?需要考慮的問題都有那些?
defget_lines(): l = []with open('file.txt','rb') as f: data = f.readlines(60000) l.append(data)yield l
要考慮的問題有:內存只有4G,無法一次性讀入10G文件。而分批讀入數據要記錄每次讀入數據的位置,且分批每次讀取得太小會在讀取操作上花費過多時間。
模塊與包
2.如何輸入日期, 判斷這一天是這一年的第幾天?
import datetimedefdayofyear(): year = input("請輸入年份: ") month = input("請輸入月份: ") day = input("請輸入天: ") date1 = datetime.date(year=int(year),month=int(month),day=int(day)) date2 = datetime.date(year=int(year),month=1,day=1)return (date1-date2).days+1數據類型
3.如何反轉字元串"aStr"?
print("aStr"[::-1])4.下面代碼的輸出結果將是什麼?會報錯嗎?
list = ['a','b','c','d','e']print(list[10:])
代碼將輸出[],並不會產生IndexError 錯誤。如果嘗試用超出成員的個數的index來獲取某個列表的成員,那就會報錯。例如,嘗試獲取 list[10] 和之後的成員,會導致IndexError。然而當我們嘗試獲取列表的切片時,開始的index超過成員個數並不會產生IndexError,而是僅僅返回一個空列表。因為並不會報錯,所以這種Bug很難追蹤到。
5.請寫出一段Python代碼,實現刪除list裡面的重復元素?
l1 = ['b','c','d','c','a','a']l2 = list(set(l1))print(l2)用list類的sort方法可以保證順序不變:
l1 = ['b', 'c', 'd', 'c', 'a', 'a']l2 = list(set(l1))l2.sort(key=l1.index)print(l2)也可以這樣寫:
l1 = ['b', 'c', 'd', 'c', 'a', 'a']l2 = sorted(set(l1), key=l1.index)print(l2)
也可以用遍歷:
l1 = ['b', 'c', 'd', 'c', 'a', 'a']l2 = []for i in l1:ifnot i in l2: l2.append(i)print(l2)企業面試題
6.設計實現遍歷目錄與子目錄,抓取.pyc文件
第一種方法:
import osdefgetFiles(dir, suffix): res = []for root, dirs, files in os.walk(dir):for filename in files: name, suf = os.path.splitext(filename)if suf == suffix: res.append(os.path.join(root, filename)) print(res)getFiles("./", '.pyc')
第二種方法:
import osdefpick(obj):try:if obj.[-4:] == ".pyc": print(obj)except:returnNonedefscan_path(ph): file_list = os.listdir(ph)for obj in file_list:if os.path.isfile(obj): pick(obj)elif os.path.isdir(obj): scan_path(obj)if __name__ == '__main__': path = input('輸入目錄') scan_path(path)
7.如何反轉一個整數,例如-123--> -321?
classSolution(object):defreerse(self, x):if-10 < x=""><>return x str_x = str(x)if str_x[0] != "-": str_x = str_x[::-1] x = int(str_x)else: str_x = str_x[1:][::-1] x = int(str_x) x = -xreturn x if-2147483648 < x=""><>if __name__ == '__main__': s = Solution() reerse_int = s.reerse(-120) print(reerse_int)
Python高級
Python高級包含很多重要的模塊,例如函數、類和實例、系統編程、正則表達式、網路編程等等。根據這些高級屬性,Python可用於數據科學、網頁開發、機器學習等等。
設計模式
8.對設計模式的理解,簡述你的設計模式?
設計模式是為我們經常會碰到的一些編程問題構建的可重用解決方案,它是總結性和經優化的。一個設計模式並不像一個類或一個庫那樣能夠直接作用於我們的代碼,反之,設計模式更為高級,它是一種在特定情形下實現的方法模板。常見的是工廠模式和單例模式。
單例模式應用的場景一般發現在以下條件下: 資源共享的情況下,避免由於資源操作時導致的性能或損耗等,如日誌文件,應用配置。控制資源的情況下,方便資源之間的互相通信。
9.生成器和迭代器的區別?
迭代器是一個更抽象的概念,任何對象,如果它的類有 next 方法和 iter 方法返回自己本身,它就是可迭代的。對於 string、list、dict、tuple 等這類容器對象,使用for循環遍歷是很方便的,for 語句實際上會對容器對象調用 iter() 函數。iter() 會返回一個定義了 next() 方法的迭代器對象,它在容器中逐個訪問容器內元素,在沒有後續元素時,next()會拋出一個StopIteration異常。
生成器(Generator)是創建迭代器的簡單而強大的工具。它們寫起來就像是正規的函數,只是在需要返回數據的時候使用yield語句。生成器能做到迭代器能做的所有事,而且因為自動創建iter()和next()方法,生成器顯得特別簡潔,而且生成器也是高效的,使用生成器表達式取代列表解析可以同時節省內存。除了創建和保存程序狀態的自動方法,當發生器終結時,還會自動拋出StopIteration異常。
10.對裝飾器的理解,你能寫出一個計時器裝飾器,它能記錄函數的執行時間嗎?
裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。
import timedeftimeit(func):defwrapper(): start = time.clock() func() end = time.clock() print('used:',end-start)return wrapper @timeitdeffoo(): print('in foo()'foo())
系統編程
11.介紹一下你的進程。
程序運行在操作系統上的一個實例,就稱之為進程。進程需要相應的系統資源:內存、時間片、pid。創建進程: 首先要導入multiprocessing中的Process;創建一個Process對象;創建Process對象時,可以傳遞參數。
p = Process(target=XXX, args=(tuple,), kwargs={key: alue})target = XXX # 指定的任務函數,不用加()args = (tuple,)kwargs = {key: alue} # 給任務函數傳遞的參數使用start()啟動進程 結束進程 給子進程指定函數傳遞參數Demo
import osfrom mulitprocessing import Processimport timedefpro_func(name, age, **kwargs):for i in range(5): print("子進程正在運行中,name=%s,age=%d,pid=%d" % (name, age, os.getpid())) print(kwargs) time.sleep(0.2)if __name__ == "__main__":# 創建Process對象 p = Process(target=pro_func, args=('小明', 18), kwargs={'m': 20})# 啟動進程 p.start() time.sleep(1)# 1秒鍾之後,立刻結束子進程 p.terminate() p.join()12.談談你對多進程、多線程、以及協程的理解,項目是否用?
進程:一個運行的程序(代碼)就是一個進程,沒有運行的代碼叫程序,進程是系統資源分配的最小單位,進程擁有自己獨立的內存空間,所有進程間數據不共享,開銷大。線程: cpu調度執行的最小單位,也叫執行路徑,不能獨立存在,依賴進程存在,一個進程至少有一個線程,叫主線程,而多個線程共享內存可以極大地提高了程序的運行效率。協程: 是一種用戶態的輕量級線程,協程的調度完全由用戶控制,協程擁有自己的寄存器上下文和棧。協程調度時,將寄存器上下文和棧保存到其他地方,在切回來的時候,恢復先前保存的寄存器上下文和棧,直接操中棧則基本沒有內核切換的開銷,可以不加鎖的訪問全局變數,所以上下文的切換非常快。
關於系統編程還有很多問題,例如:
本文為編輯,請聯系本獲得授權。