frida
frida 注入是基于 ptrace實(shí)現(xiàn)的。frida 調(diào)用ptrace向目標(biāo)進(jìn)程注入了一個(gè)frida-agent-xx.so文件。后續(xù)騷操作是這個(gè)so文件跟frida-server通訊實(shí)現(xiàn)的窄刘。
frida 動(dòng)態(tài)插樁工具 插入一些代碼到原生的app的內(nèi)存空間,原生平臺(tái)可以是 mac linux win android ios 而且 frida是開(kāi)源的
Xposed 框架
安卓所有的APP進(jìn)程是用 Zygote(孵化器)進(jìn)程啟動(dòng)的钩述。
Xposed替換了 Zygote 進(jìn)程對(duì)應(yīng)的可執(zhí)行文件/system/bin/app_process,每啟動(dòng)一個(gè)新的進(jìn)程项戴,都會(huì)先啟動(dòng)xposed替換過(guò)的文件,都會(huì)加載xposed相關(guān)代碼肤无。這樣就注入了每一個(gè)app進(jìn)程先蒋。
兩種方法分別使用了Android、python+JS作為開(kāi)發(fā)語(yǔ)言進(jìn)行hook宛渐。
python中requests里 .text和.content方法的區(qū)別
.text是現(xiàn)成的字符串竞漾,
.content還要編碼,
但是.text不是所有時(shí)候顯示都正常窥翩,
這是就需要用.content進(jìn)行手動(dòng)編碼业岁。
異步與非阻塞的區(qū)別
異步:調(diào)用在發(fā)出之后,這個(gè)調(diào)用就直接返回寇蚊,不管有無(wú)結(jié)果
非阻塞:關(guān)注的是程序在等待調(diào)用結(jié)果(消息笔时,返回值)時(shí)的狀態(tài),指在不能立刻得到結(jié)果之前仗岸,該調(diào)用不會(huì)阻塞當(dāng)前線程
scrapy詳細(xì)工作流程
1.首先Spiders(爬蟲(chóng))將需要發(fā)送請(qǐng)求的url(requests)經(jīng)ScrapyEngine(引擎)交給Scheduler(調(diào)度器)允耿。
2.Scheduler(排序,入隊(duì))處理后扒怖,經(jīng)ScrapyEngine右犹,DownloaderMiddlewares(可選,主要有User_Agent, Proxy代理)交給Downloader姚垃。
3.Downloader向互聯(lián)網(wǎng)發(fā)送請(qǐng)求念链,并接收下載響應(yīng)(response)。將響應(yīng)(response)經(jīng)ScrapyEngine,SpiderMiddlewares(可選)交給Spiders掂墓∏矗
4.Spiders處理response,提取數(shù)據(jù)并將數(shù)據(jù)經(jīng)ScrapyEngine交給ItemPipeline保存(可以是本地君编,可以是數(shù)據(jù)庫(kù))跨嘉。
5.提取url重新經(jīng)ScrapyEngine交給Scheduler進(jìn)行下一個(gè)循環(huán)。直到無(wú)Url請(qǐng)求程序停止結(jié)束吃嘿。
Scrapy去重原理
1.Scrapy本身自帶有一個(gè)中間件;
2.scrapy源碼中可以找到一個(gè)dupefilters.py去重器;
3.需要將dont_filter設(shè)置為False開(kāi)啟去重祠乃,默認(rèn)是True,沒(méi)有開(kāi)啟去重兑燥;
4.對(duì)于每一個(gè)url的請(qǐng)求亮瓷,調(diào)度器都會(huì)根據(jù)請(qǐng)求得相關(guān)信息加密得到一個(gè)指紋信息,并且將指紋信息和set()集合中的指紋信息進(jìn)行 比對(duì)降瞳,如果set()集合中已經(jīng)存在這個(gè)數(shù)據(jù)嘱支,就不在將這個(gè)Request放入隊(duì)列中;
5.如果set()集合中沒(méi)有存在這個(gè)加密后的數(shù)據(jù),就將這個(gè)Request對(duì)象放入隊(duì)列中挣饥,等待被調(diào)度除师。
scrapy和scrapy-redis有什么區(qū)別?為什么選擇redis數(shù)據(jù)庫(kù)扔枫?
1) scrapy是一個(gè)Python爬蟲(chóng)框架汛聚,爬取效率極高,具有高度定制性短荐,但是不支持分布式倚舀。而scrapy-redis一套基于redis數(shù)據(jù)庫(kù)、運(yùn)行在scrapy框架之上的組件搓侄,可以讓scrapy支持分布式策略,
Slaver端共享Master端redis數(shù)據(jù)庫(kù)里的item隊(duì)列话速、請(qǐng)求隊(duì)列和請(qǐng)求指紋集合讶踪。
2) 為什么選擇redis數(shù)據(jù)庫(kù),因?yàn)閞edis支持主從同步泊交,而且數(shù)據(jù)都是緩存在內(nèi)存中的乳讥,所以基于redis的分布式爬蟲(chóng),對(duì)請(qǐng)求和數(shù)據(jù)的高頻讀取效率非常高廓俭。
python中使用的垃圾回收機(jī)制:
1. 引用計(jì)數(shù)
引用計(jì)數(shù)法有其明顯的優(yōu)點(diǎn)云石,如高效、實(shí)現(xiàn)邏輯簡(jiǎn)單研乒、具備實(shí)時(shí)性汹忠,一旦一個(gè)對(duì)象的引用計(jì)數(shù)歸零,內(nèi)存就直接釋放了。不用像其他機(jī)制等到特定時(shí)機(jī)宽菜。將垃圾回收隨機(jī)分配到運(yùn)行的階段谣膳,處理回收內(nèi)存的時(shí)間分?jǐn)偟搅似綍r(shí),正常程序的運(yùn)行比較平穩(wěn)铅乡。但是继谚,引用計(jì)數(shù)也存在著一些缺點(diǎn),
通常的缺點(diǎn)有:
邏輯簡(jiǎn)單阵幸,但實(shí)現(xiàn)有些麻煩花履。每個(gè)對(duì)象需要分配單獨(dú)的空間來(lái)統(tǒng)計(jì)引用計(jì)數(shù),這無(wú)形中加大的空間的負(fù)擔(dān)挚赊,并且需要對(duì)引用計(jì)數(shù)進(jìn)行維護(hù)诡壁,在維護(hù)的時(shí)候很容易會(huì)出錯(cuò)。
在一些場(chǎng)景下咬腕,可能會(huì)比較慢欢峰。正常來(lái)說(shuō)垃圾回收會(huì)比較平穩(wěn)運(yùn)行,但是當(dāng)需要釋放一個(gè)大的對(duì)象時(shí)涨共,比如字典纽帖,需要對(duì)引用的所有對(duì)象循環(huán)嵌套調(diào)用,從而可能會(huì)花費(fèi)比較長(zhǎng)的時(shí)間举反。
循環(huán)引用懊直。這將是引用計(jì)數(shù)的致命傷,引用計(jì)數(shù)對(duì)此是無(wú)解的火鼻,因此必須要使用其它的垃圾回收算法對(duì)其進(jìn)行補(bǔ)充室囊。
也就是說(shuō),Python 的垃圾回收機(jī)制魁索,很大一部分是為了處理可能產(chǎn)生的循環(huán)引用融撞,是對(duì)引用計(jì)數(shù)的補(bǔ)充。
2. 標(biāo)記清除 解決循環(huán)引用的問(wèn)題
Python采用了“標(biāo)記-清除”(Mark and Sweep)算法粗蔚,解決容器對(duì)象可能產(chǎn)生的循環(huán)引用問(wèn)題尝偎。(注意,只有容器對(duì)象才會(huì)產(chǎn)生循環(huán)引用的情況鹏控,比如列表致扯、字典、用戶自定義類的對(duì)象当辐、元組等抖僵。而像數(shù)字,字符串這類簡(jiǎn)單類型不會(huì)出現(xiàn)循環(huán)引用缘揪。作為一種優(yōu)化策略耍群,對(duì)于只包含簡(jiǎn)單類型的元組也不在標(biāo)記清除算法的考慮之列)
跟其名稱一樣义桂,該算法在進(jìn)行垃圾回收時(shí)分成了兩步,分別是:
A)標(biāo)記階段世吨,遍歷所有的對(duì)象澡刹,如果是可達(dá)的(reachable),也就是還有對(duì)象引用它耘婚,那么就標(biāo)記該對(duì)象為可達(dá)罢浇;
B)清除階段,再次遍歷對(duì)象沐祷,如果發(fā)現(xiàn)某個(gè)對(duì)象沒(méi)有標(biāo)記為可達(dá)嚷闭,則就將其回收。
3. 隔代回收
在循環(huán)引用對(duì)象的回收中赖临,整個(gè)應(yīng)用程序會(huì)被暫停胞锰,為了減少應(yīng)用程序暫停的時(shí)間,Python 通過(guò)“分代回收”(Generational Collection)以空間換時(shí)間的方法提高垃圾回收效率兢榨。
分代回收是基于這樣的一個(gè)統(tǒng)計(jì)事實(shí)嗅榕,對(duì)于程序,存在一定比例的內(nèi)存塊的生存周期比較短吵聪;而剩下的內(nèi)存塊凌那,生存周期會(huì)比較長(zhǎng),甚至?xí)某绦蜷_(kāi)始一直持續(xù)到程序結(jié)束吟逝。生存期較短對(duì)象的比例通常在 80%~90% 之間帽蝶,這種思想簡(jiǎn)單點(diǎn)說(shuō)就是:對(duì)象存在時(shí)間越長(zhǎng),越可能不是垃圾块攒,應(yīng)該越少去收集励稳。這樣在執(zhí)行標(biāo)記-清除算法時(shí)可以有效減小遍歷的對(duì)象數(shù),從而提高垃圾回收的速度囱井。
python gc給對(duì)象定義了三種世代(0,1,2),每一個(gè)新生對(duì)象在generation zero中驹尼,如果它在一輪gc掃描中活了下來(lái),那么它將被移至generation one,在那里他將較少的被掃描庞呕,如果它又活過(guò)了一輪gc,它又將被移至generation two新翎,在那里它被掃描的次數(shù)將會(huì)更少。
gc的掃描在什么時(shí)候會(huì)被觸發(fā)呢?答案是當(dāng)某一世代中被分配的對(duì)象與被釋放的對(duì)象之差達(dá)到某一閾值的時(shí)候千扶,就會(huì)觸發(fā)gc對(duì)某一世代的掃描料祠。值得注意的是當(dāng)某一世代的掃描被觸發(fā)的時(shí)候骆捧,比該世代年輕的世代也會(huì)被掃描澎羞。也就是說(shuō)如果世代2的gc掃描被觸發(fā)了,那么世代0,世代1也將被掃描敛苇,如果世代1的gc掃描被觸發(fā)妆绞,世代0也會(huì)被掃描顺呕。
反爬對(duì)抗
通過(guò)Headers反爬蟲(chóng)
從用戶請(qǐng)求的Headers反爬蟲(chóng)是最常見(jiàn)的反爬蟲(chóng)策略。很多網(wǎng)站都會(huì)對(duì)Headers的User-Agent進(jìn)行檢測(cè)括饶,還有一部分網(wǎng)站會(huì)對(duì)Referer進(jìn)行檢測(cè)(一些資源網(wǎng)站的防盜鏈就是檢測(cè)Referer)株茶。如果遇到了這類反爬蟲(chóng)機(jī)制,可以直接在爬蟲(chóng)中添加Headers图焰,將瀏覽器的User-Agent復(fù)制到爬蟲(chóng)的Headers中启盛;或者將Referer值修改為目標(biāo)網(wǎng)站域名。對(duì)于檢測(cè)Headers的反爬蟲(chóng)技羔,在爬蟲(chóng)中修改或者添加Headers就能很好的繞過(guò)僵闯。基于用戶行為反爬蟲(chóng)
還有一部分網(wǎng)站是通過(guò)檢測(cè)用戶行為,例如同一IP短時(shí)間內(nèi)多次訪問(wèn)同一頁(yè)面藤滥,或者同一賬戶短時(shí)間內(nèi)多次進(jìn)行相同操作鳖粟。
大多數(shù)網(wǎng)站都是前一種情況,對(duì)于這種情況拙绊,使用IP代理就可以解決向图。可以專門(mén)寫(xiě)一個(gè)爬蟲(chóng)标沪,爬取網(wǎng)上公開(kāi)的代理ip榄攀,檢測(cè)后全部保存起來(lái)。這樣的代理ip爬蟲(chóng)經(jīng)常會(huì)用到谨娜,最好自己準(zhǔn)備一個(gè)航攒。有了大量代理ip后可以每請(qǐng)求幾次更換一個(gè)ip,這在requests或者urllib2中很容易做到趴梢,這樣就能很容易的繞過(guò)第一種反爬蟲(chóng)漠畜。
對(duì)于第二種情況,可以在每次請(qǐng)求后隨機(jī)間隔幾秒再進(jìn)行下一次請(qǐng)求坞靶。有些有邏輯漏洞的網(wǎng)站憔狞,可以通過(guò)請(qǐng)求幾次,退出登錄彰阴,重新登錄瘾敢,繼續(xù)請(qǐng)求來(lái)繞過(guò)同一賬號(hào)短時(shí)間內(nèi)不能多次進(jìn)行相同請(qǐng)求的限制。動(dòng)態(tài)頁(yè)面的反爬蟲(chóng)
上述的幾種情況大多都是出現(xiàn)在靜態(tài)頁(yè)面尿这,還有一部分網(wǎng)站簇抵,我們需要爬取的數(shù)據(jù)是通過(guò)ajax請(qǐng)求得到,或者通過(guò)JavaScript生成的射众。首先用Firebug或者HttpFox對(duì)網(wǎng)絡(luò)請(qǐng)求進(jìn)行分析碟摆。如果能夠找到ajax請(qǐng)求,也能分析出具體的參數(shù)和響應(yīng)的具體含義叨橱,我們就能采用上面的方法典蜕,直接利用requests或者urllib2模擬ajax請(qǐng)求断盛,對(duì)響應(yīng)的json進(jìn)行分析得到需要的數(shù)據(jù)。js加密
需要破解網(wǎng)頁(yè)上的js加密過(guò)程愉舔,代碼實(shí)現(xiàn) 或者 直接執(zhí)行該段js代碼cookies 反爬
一些網(wǎng)站會(huì)有cookie反爬钢猛,cookie有時(shí)效性⌒停可以通過(guò)多賬號(hào)模擬登陸命迈,拿到cookie,維護(hù)一個(gè)cookie池火的。app逆向
需要反編譯apk文件躺翻,hook到加密位置, 找到加密代碼卫玖。app加殼
需要進(jìn)行脫殼處理公你,然后在進(jìn)行APP逆向操作so文件加密
so文件為動(dòng)態(tài)加載的文件,libnative-lib.so中假瞬,函數(shù)只有調(diào)用中才會(huì)加載陕靠,加密是找到函數(shù)偏移和長(zhǎng)度,進(jìn)行位運(yùn)算脱茉,所以解密也就按照一樣的方式還原即可剪芥。
TensorFlow 是由 Google Brain 團(tuán)隊(duì)為深度神經(jīng)網(wǎng)絡(luò)(DNN)開(kāi)發(fā)的功能強(qiáng)大的開(kāi)源軟件庫(kù)
TensorFlow 則還有更多的特點(diǎn),如下:
支持所有流行語(yǔ)言琴许,如 Python税肪、C++、Java榜田、R和Go益兄。
可以在多種平臺(tái)上工作,甚至是移動(dòng)平臺(tái)和分布式平臺(tái)箭券。
它受到所有云服務(wù)(AWS净捅、Google和Azure)的支持。
Keras——高級(jí)神經(jīng)網(wǎng)絡(luò) API辩块,已經(jīng)與 TensorFlow 整合蛔六。
與 Torch/Theano 比較,TensorFlow 擁有更好的計(jì)算圖表可視化废亭。
允許模型部署到工業(yè)生產(chǎn)中国章,并且容易使用。
有非常好的社區(qū)支持豆村。
TensorFlow 不僅僅是一個(gè)軟件庫(kù)液兽,它是一套包括 TensorFlow,TensorBoard 和 TensorServing 的軟件你画。
分布式鎖要滿足哪些要求呢抵碟? 保證大家訪問(wèn)這個(gè)資源數(shù)據(jù)是一致性
排他性:在同一時(shí)間只會(huì)有一個(gè)客戶端能獲取到鎖,其它客戶端無(wú)法同時(shí)獲取
避免死鎖:這把鎖在一段有限的時(shí)間之后坏匪,一定會(huì)被釋放(正常釋放或異常釋放)
高可用:獲取或釋放鎖的機(jī)制必須高可用且性能佳
基于 數(shù)據(jù)庫(kù)實(shí)現(xiàn) redis 基于Redis實(shí)現(xiàn)的鎖機(jī)制拟逮,主要是依賴redis自身的原子操作
樂(lè)觀鎖
(1)鎖服務(wù)要有遞增的版本號(hào)version
(2)每次更新數(shù)據(jù)的時(shí)候都必須先判斷版本號(hào)對(duì)不對(duì),然后再寫(xiě)入新的版本號(hào)
(需要注意的是适滓,在InnoDB中只有字段加了索引的敦迄,才會(huì)是行級(jí)鎖,否者是表級(jí)鎖凭迹,所以這個(gè)id字段要加索引)
mysql 悲觀鎖 當(dāng)這條記錄加上排它鎖之后罚屋,其它線程是無(wú)法操作這條記錄的。
基于 ZooKeeper實(shí)現(xiàn) 是一個(gè)分布式的嗅绸、開(kāi)源的程序協(xié)調(diào)服務(wù)脾猛,是 hadoop 項(xiàng)目下的一 個(gè)子項(xiàng)目 他提供的主要功能包括:配置管理、名字服務(wù)鱼鸠、分布式鎖猛拴、集群管理。 就是使用它的臨時(shí)有序節(jié)點(diǎn)來(lái)實(shí)現(xiàn)的分布式鎖蚀狰。
當(dāng)某客戶端要進(jìn)行邏輯的加鎖時(shí)愉昆,就在zookeeper上的某個(gè)指定節(jié)點(diǎn)的目錄下,去生成一個(gè)唯一的臨時(shí)有序節(jié)點(diǎn)麻蹋, 然后判斷自己是否是這些有序節(jié)點(diǎn)中序號(hào)最小的一個(gè)跛溉,如果是,則算是獲取了鎖扮授。如果不是芳室,則說(shuō)明沒(méi)有獲取到鎖哟绊,那么就需要在序列中找到比自己小的那個(gè)節(jié)點(diǎn)俯艰,并對(duì)其調(diào)用exist()方法,對(duì)其注冊(cè)事件監(jiān)聽(tīng)碴卧,當(dāng)監(jiān)聽(tīng)到這個(gè)節(jié)點(diǎn)被刪除了深夯,那就再去判斷一次自己當(dāng)初創(chuàng)建的節(jié)點(diǎn)是否變成了序列中最小的抖格。如果是,則獲取鎖咕晋,如果不是雹拄,則重復(fù)上述步驟。
app 雙向認(rèn)證
關(guān)于雙向證書(shū)認(rèn)證:客戶端有自己的密匙掌呜,并持有服務(wù)端的證書(shū)滓玖,服務(wù)端給客戶端發(fā)送數(shù)據(jù)時(shí),需要將服務(wù)端的證書(shū)發(fā)給客戶端驗(yàn)證质蕉,驗(yàn)證通過(guò)才運(yùn)行發(fā)送數(shù)據(jù)势篡,
同樣翩肌,客戶端請(qǐng)求服務(wù)器數(shù)據(jù)時(shí),也需要將自己的證書(shū)發(fā)給服務(wù)端驗(yàn)證禁悠,通過(guò)才允許執(zhí)行請(qǐng)求念祭。
創(chuàng)建一個(gè)證書(shū)的步驟:
(1)生成系統(tǒng)私鑰
(2)生成待簽名證書(shū)
(3)生成x509證書(shū), 用CA私鑰進(jìn)行簽名
InnoDB MyISAM
事務(wù)處理或是外鍵 全文索引
大尺寸的數(shù)據(jù)集趨向于選擇InnoDB方式,支持事務(wù)處理和故障恢復(fù)碍侦。數(shù)據(jù)庫(kù)的大小決定了故障恢復(fù)的時(shí)間長(zhǎng)短粱坤,InnoDB可以利用事務(wù)日志進(jìn)行數(shù)據(jù)恢復(fù),這會(huì)比較快瓷产。
而MyISAM可能會(huì)需要幾個(gè)小時(shí)甚至幾天來(lái)干這些事站玄,InnoDB只需要幾分鐘。
總結(jié):InnoDB的行鎖是針對(duì)索引加的鎖濒旦,不是針對(duì)記錄加的鎖株旷。并且該索引不能失效,否則都會(huì)從行鎖升級(jí)為表鎖尔邓。
多進(jìn)程灾常、多線程、協(xié)程
多進(jìn)程:密集CPU任務(wù)铃拇,需要充分使用多核CPU資源(服務(wù)器钞瀑,大量的并行計(jì)算)的時(shí)候,用多進(jìn)程慷荔。 multiprocessing
缺陷:多個(gè)進(jìn)程之間通信成本高雕什,切換開(kāi)銷大。
多線程:密集I/O任務(wù)(網(wǎng)絡(luò)I/O显晶,磁盤(pán)I/O贷岸,數(shù)據(jù)庫(kù)I/O)使用多線程合適。
threading.Thread磷雇、multiprocessing.dummy
缺陷:同一個(gè)時(shí)間切片只能運(yùn)行一個(gè)線程偿警,不能做到高并行,但是可以做到高并發(fā)唯笙。
Python的多線程:
GIL 全局解釋器鎖:線程的執(zhí)行權(quán)限螟蒸,在Python的進(jìn)程里只有一個(gè)GIL。
一個(gè)線程需要執(zhí)行任務(wù)崩掘,必須獲取GIL七嫌。
好處:直接杜絕了多個(gè)線程訪問(wèn)內(nèi)存空間的安全問(wèn)題。
壞處:Python的多線程不是真正多線程苞慢,不能充分利用多核CPU的資源诵原。
但是,在I/O阻塞的時(shí)候,解釋器會(huì)釋放GIL绍赛。
協(xié)程:又稱微線程蔓纠,在單線程上執(zhí)行多個(gè)任務(wù),用函數(shù)切換吗蚌,開(kāi)銷極小腿倚。不通過(guò)操作系統(tǒng)調(diào)度,沒(méi)有進(jìn)程褪测、線程的切換開(kāi)銷。genvent潦刃,monkey.patchall
多線程請(qǐng)求返回是無(wú)序的侮措,那個(gè)線程有數(shù)據(jù)返回就處理那個(gè)線程,而協(xié)程返回的數(shù)據(jù)是有序的乖杠。
缺陷:?jiǎn)尉€程執(zhí)行分扎,處理密集CPU和本地磁盤(pán)IO的時(shí)候,性能較低胧洒。處理網(wǎng)絡(luò)I/O性能還是比較高.
sort 與 sorted 區(qū)別:
sort 是應(yīng)用在 list 上的方法畏吓,sorted 可以對(duì)所有可迭代的對(duì)象進(jìn)行排序操作。
list 的 sort 方法返回的是對(duì)已經(jīng)存在的列表進(jìn)行操作卫漫,無(wú)返回值菲饼,而內(nèi)建函數(shù) sorted 方法返回的是一個(gè)新的 list,而不是在原來(lái)的基礎(chǔ)上進(jìn)行的操作列赎。
filter宏悦、map
def func(i):
return i % 2 == 1
newlist = filter(func, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # filter 過(guò)濾
newlist1 = filter(lambda i: i % 2 == 1, a)
print(list(newlist))
print(list(newlist1))
r = map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 會(huì)根據(jù)提供的函數(shù)對(duì)指定序列做映射。
print(list(r))
mysql 事務(wù)
mysql 事務(wù)是由一組SQL語(yǔ)句組成的邏輯處理單元包吝,事務(wù)具有ACID屬性饼煞。
事務(wù) :是數(shù)據(jù)庫(kù)操作的最小工作單元,是作為單個(gè)邏輯工作單元執(zhí)行的一系列操作诗越;這些操作作為一個(gè)整體一起向系統(tǒng)提交砖瞧,要么都執(zhí)行、要么都不執(zhí)行嚷狞;事務(wù)是一組不可再分割的操作集合
原子性(Atomicity):事務(wù)是一個(gè)原子操作單元块促。在當(dāng)時(shí)原子是不可分割的最小元素,其對(duì)數(shù)據(jù)的修改床未,要么全部成功褂乍,要么全部都不成功。
一致性(Consistent):事務(wù)開(kāi)始到結(jié)束的時(shí)間段內(nèi)即硼,數(shù)據(jù)都必須保持一致?tīng)顟B(tài)逃片。
隔離性(Isolation):數(shù)據(jù)庫(kù)系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的”獨(dú)立”環(huán)境執(zhí)行。
持久性(Durable):事務(wù)完成后褥实,它對(duì)于數(shù)據(jù)的修改是永久性的呀狼,即使出現(xiàn)系統(tǒng)故障也能夠保持。sx
觸發(fā)器
觸發(fā)器是一種特殊的存儲(chǔ)過(guò)程损离,主要是通過(guò)事件來(lái)觸發(fā)而被執(zhí)行的哥艇,他可以強(qiáng)化約束,來(lái)維護(hù)數(shù)據(jù)庫(kù)的完整性和一致性僻澎,可以跟蹤數(shù)據(jù)內(nèi)的操作從而不允許未經(jīng)許可的 更新和變化貌踏,可以聯(lián)級(jí)運(yùn)算。只有表支持觸發(fā)器窟勃,視圖不支持觸發(fā)器
1祖乳、給手機(jī)安裝軟件
離線
將init_machine.sh,及android_package.zip上傳至/data/local/tmp目錄下
給手機(jī)安裝termux,此為命令行工具秉氧,打開(kāi)軟件
輸入su,切換至管理員賬戶
輸入cd data/local/tmp,因?yàn)樵剖謾C(jī)不能打/符眷昆,所以用tab鍵來(lái)湊齊。
輸入sh init_machine.sh,即可安裝好軟件和服務(wù)
usb線連
在電腦上輸入python -m uiautomator2 init即可
2汁咏、打開(kāi)ATX
打開(kāi)ATX 點(diǎn)擊"啟動(dòng)uiautomator"
3亚斋、打開(kāi)QpythonL
一定要先打開(kāi)這個(gè)軟件,不然你python腳本會(huì)上傳不成功攘滩,
打開(kāi)軟件后的順序?yàn)椋? 文件
scripts
4帅刊、上傳腳本
將auto_test.py和wx_helper.py上傳至/storage/emulated/0/qpython/scripts文件夾下
5、運(yùn)行腳本
打開(kāi)QpythonL點(diǎn)擊auto_test.py文件漂问,點(diǎn)擊下方的三角符號(hào)
Web服務(wù)器網(wǎng)關(guān)接口(Python Web Server Gateway Interface厚掷,縮寫(xiě)為WSGI)是為Python語(yǔ)言定義的Web服務(wù)器和Web應(yīng)用程序或框架之間的一種簡(jiǎn)單而通用的接口。自從WSGI被開(kāi)發(fā)出來(lái)以后级解,許多其它語(yǔ)言中也出現(xiàn)了類似接口冒黑。
sekiro
sekiro是一個(gè)基于長(zhǎng)鏈接和代碼注入的Android private API暴露框架。
框架分為兩部分:
server
暴露一個(gè)TCP端口和兩個(gè)HTTP端口
管理通過(guò)TCP連接的client和user發(fā)來(lái)的http 請(qǐng)求
client
通過(guò)TCP和server連接勤哗,響應(yīng)server發(fā)來(lái)的請(qǐng)求
工作流程是這樣的:
client通過(guò)TCP和server建立長(zhǎng)連接
user發(fā)送http請(qǐng)求給server
server根據(jù)用戶發(fā)來(lái)的http請(qǐng)求的參數(shù)抡爹,通過(guò)TCP將請(qǐng)求轉(zhuǎn)發(fā)給client
client收到請(qǐng)求并響應(yīng)server
server將從client收到的請(qǐng)求返回給user