iami朋友圈程序全開源版源碼,前臺(tái)一鍵發(fā)布圖文,視頻,音樂。發(fā)布內(nèi)容支持定位或自定義位置信息。支持將發(fā)布內(nèi)容設(shè)為廣告模式消息站內(nèi)通知或郵件通知。支持其他用戶注冊(cè),支持其他用戶發(fā)布文章,管理自己的文章。擁有豐富的后臺(tái)管理功能,一鍵操作。
安裝環(huán)境:Nginx ≥1.22/PHP=7.4/MySQL ≥5.6安裝前首先配置運(yùn)行環(huán)境,運(yùn)行需要在PHP中安裝exif擴(kuò)展。
總結(jié):這邊測(cè)試了一下沒有發(fā)現(xiàn)問題,此源碼為開源版,安裝后即可使用。
版權(quán)申請(qǐng):本文A5資源網(wǎng)原創(chuàng),經(jīng)原創(chuàng)作者允許轉(zhuǎn)載許可聲明。原文地址http://a5.org.cn/a5_ziyuan/38963.html
者:Matt Trilby-Bassett;Min Huang
排版:Rani Sun
開發(fā)人員在閱讀 API 參考文檔時(shí),有時(shí)會(huì)需要或希望查看相應(yīng)的源代碼。直到不久之前,.NET API 參考文檔還沒有提供指向源代碼的鏈接,這引起社區(qū)添加這一功能的呼聲。針對(duì)這一反饋,我們很高興地宣布,現(xiàn)在大多數(shù)流行的 .NET API 上都提供了連接文檔和源代碼的鏈接。
在這篇博文中,我們將分享將鏈接添加到文檔以及利用現(xiàn)有 API 來(lái)實(shí)現(xiàn)這一改進(jìn)的詳細(xì)信息。
鏈接的實(shí)例
在介紹實(shí)施細(xì)節(jié)之前,我們想展示一下文檔的改動(dòng)。對(duì)于符合我們標(biāo)準(zhǔn)(啟用了源代碼鏈接、具有可訪問的 PDB 并托管在公共存儲(chǔ)庫(kù)中)的 .NET API,其鏈接包含在 Definition 元數(shù)據(jù)中。以下來(lái)自 String 類的截圖演示了這個(gè)新鏈接的位置:
如果存在重載,鏈接將包含在重載標(biāo)題的下面。下面的 String.IndexOf 方法截圖演示了這種情況:
參考文檔
https://learn.microsoft.com/en-us/dotnet/api/
String.IndexOf 方法
https://learn.microsoft.com/en-us/dotnet/api/system.string.indexof?view=net-8.0#system-string-indexof(system-string-system-int32-system-int32)
我們?nèi)绾谓㈡溄樱?/strong>
.NET 參考文檔管道對(duì)一組 DLL 文件和 NuGet 包進(jìn)行操作。這些文件由各種工具處理,以將其內(nèi)容轉(zhuǎn)換為顯示在 Microsoft Learn 上的 HTML 頁(yè)面。正確構(gòu)建源代碼的鏈接需要了解源代碼、二進(jìn)制文件和 GitHub 之間的關(guān)系,以及它們?nèi)绾闻c一些現(xiàn)有的 .NET API 配合在一起。在與 .NET 和 Roslyn 團(tuán)隊(duì)的開發(fā)人員討論我們公開源代碼鏈接的目標(biāo)時(shí),很明顯我們的要求與 Visual Studio 的Go to definition功能緊密相關(guān)。
憑借這種理解以及 @davidwengier 在 Roslyn 中針對(duì)外部源的Go to definition改進(jìn)中提供的有關(guān)Go to definition的大量細(xì)節(jié),我們能夠采用類似的方法來(lái)構(gòu)建指向文檔源代碼的鏈接。
Go to definition
https://github.com/dotnet/roslyn/issues/55834
@davidwengier
https://github.com/davidwengier
源代碼鏈接
源代碼鏈接是一種技術(shù),它使 .NET 開發(fā)人員能夠調(diào)試其應(yīng)用程序引用的程序集的源代碼。盡管源代碼鏈接最初旨在用于源代碼調(diào)試,但它完全適用于我們的場(chǎng)景。每個(gè)啟用源代碼鏈接的 .NET 項(xiàng)目都會(huì)在 PDB(程序數(shù)據(jù)庫(kù))中生成從相對(duì)文件夾路徑到 絕對(duì)存儲(chǔ)庫(kù) URL 的映射。這與 @davidwengier 在 Roslyn 中針對(duì)外部源的 Go to definition 改進(jìn)中所述一致。
若要查看源鏈接條目,可以使用 dotPeek 或 ILSpy 打開 DLL。以下屏幕截圖顯示了使用 dotPeek 訪問 System.Private.CoreLib 的源鏈接條目的示例,方法是導(dǎo)航到 Portable PDB Metadata,然后導(dǎo)航到 CustomDebugInformation 表:
[!NOTE] 若要了解有關(guān)源代碼鏈接的元數(shù)據(jù)定義,請(qǐng)轉(zhuǎn)到:PortablePdb-Metadata。
源代碼鏈接
https://github.com/dotnet/sourcelink
@davidwengier
https://github.com/davidwengier
Roslyn 中針對(duì)外部源的 Go to definition 改進(jìn)
https://devblogs.microsoft.com/dotnet/go-to-definition-improvements-for-external-source-in-roslyn/#source-link
ILSpy
https://github.com/icsharpcode/ILSpy
PortablePdb-Metadata
https://github.com/dotnet/runtime/blob/main/docs/design/specs/PortablePdb-Metadata.md#source-link-c-and-vb-compilers
建立鏈接
現(xiàn)在我們知道在源代碼鏈接條目中存儲(chǔ)了一個(gè)總體映射,下一個(gè)問題是如何為這個(gè) DLL 中的每個(gè)類型/成員構(gòu)建唯一的鏈接?
例如,我們?yōu)?String.Clone 方法構(gòu)建的鏈接是:
https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14/src/libraries/System.Private.CoreLib/src/System/String.cs#L388C13-L388C25
此鏈接可分為 3 個(gè)部分:
第一部分 https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14 是從源代碼鏈接映射 json 解析出來(lái)的,并且與特定的存儲(chǔ)庫(kù)提交綁定。
第二部分 src/libraries/System.Private.CoreLib/src/System/String.cs 可以在 PDB 的文檔表中找到。
最后一部分 #L388C13-L388C25 是基于 MethodDebugInformation 表的 SequencePoints 列構(gòu)建的。SequencePoints blob 會(huì)將此方法塊中的一系列 IL 指令映射回其原始源代碼行號(hào),如下面的屏幕截圖所示。有關(guān)更多詳細(xì)信息,請(qǐng)轉(zhuǎn)到 SequencePoints 元數(shù)據(jù)定義。
我們使用 System.Reflection.Metadata 庫(kù)來(lái)遍歷此 DLL 中的所有類型/成員,然后匹配 MethodDebugInformation 表中的記錄以構(gòu)建最終的鏈接。
var mdReader=peReader.GetMetadataReader();
foreach(var typeDefHandle in mdReader.TypeDefinitions)
{
var typeDef=mdReader.GetTypeDefinition(typeDefHandle);
string typeName=mdReader.GetString(typeDef.Name);
string ns=mdReader.GetString(typeDef.Namespace);
string fullName=String.IsOrEmpty(ns) ? typeName : $"{ns}.{typeName}";
Console.WriteLine(fullName);
foreach (var document in debugReader.FindSourceDocuments(typeDefHandle))
{
Console.WriteLine($" {document.SourceLinkUrl}");
}
}
該實(shí)現(xiàn)也可以在 Roslyn DocumentDebugInfoReader.cs 和 SymbolSourceDocumentFinder.cs 中找到。
SequencePoints 元數(shù)據(jù)定義
https://github.com/dotnet/runtime/blob/main/docs/design/specs/PortablePdb-Metadata.md#sequence-points-blob
System.Reflection.Metadata
https://learn.microsoft.com/en-us/dotnet/api/system.reflection.metadata?view=net-8.0
DocumentDebugInfoReader.cs
https://github.com/dotnet/roslyn/blob/bbcac94e166e0cd87d36b41a387278e7d00d1728/src/Features/Core/Portable/PdbSourceDocument/DocumentDebugInfoReader.cs
SymbolSourceDocumentFinder.cs
https://github.com/dotnet/roslyn/blob/4262648cadff59cc703b6be8c00b9814a6b13c5a/src/Features/Core/Portable/PdbSourceDocument/SymbolSourceDocumentFinder.cs
查找 PDB 文件
因?yàn)槲覀冎梨溄拥男畔⒖梢栽?PDB 中找到,所以下一步就是找到這些 PDB 以供我們使用。
目前,指定某一個(gè) DLL,我們會(huì)在三個(gè)地方查找相應(yīng)的 PDB:
嵌入式 PDB。如果您的 csproj 中指定了<DebugType>embedded</DebugType>,則 PDB 文件將嵌入到此 DLL 中。
磁盤上的 PDB。您可以將 PDB 放在 DLL 旁邊。
Microsoft Symbol Server。有一個(gè)公共符號(hào)服務(wù)器,我們可以從中下載 DLL 的 PDB。
請(qǐng)參閱 Roslyn PdbFileLocatorService.cs 中的實(shí)現(xiàn)。
PdbFileLocatorService.cs
https://github.com/dotnet/roslyn/blob/b3d9ff7c9dc9e330b24d6087419dffe611a9dd77/src/Features/Core/Portable/PdbSourceDocument/PdbFileLocatorService.cs
查找正確的 PDB 版本
我們想進(jìn)一步討論如何從 Microsoft Symbol Server 下載指定 DLL 的正確版本的 PDB。
下面是一個(gè)PDB 下載 URL的示例 ,其格式在 portable-pdb-signature 中定義。
http://msdl.microsoft.com/download/symbols/System.Private.CoreLib.pdb/8402667829752b9d0b00ebbc1d5a66d9FFFFFFFF/System.Private.CoreLib.pdb
從 URL 模式中我們可以觀察到,我們需要提供 PDB 文件名 System.Private.CoreLib.pdb 和 GUID 8402667829752b9d0b00ebbc1d5a66d9FFFFFFFF。那么問題是我們可以在哪里找到這些信息?
之前我們使用 dotPeek 打開 DLL 來(lái)查找源代碼鏈接條目?,F(xiàn)在我們可以再次打開它并檢查元數(shù)據(jù)部分。
在上面的截圖中,我們可以在 Debug Directory 中找到這個(gè) GUID,并且該條目必須是一個(gè)可移植代碼視圖條目。該條目的 Path 屬性代表 PDB 文件的路徑,我們可以從中獲取文件名。
foreach (var entry in peReader.ReadDebugDirectory())
{
if (entry.Type==DebugDirectoryEntryType.CodeView && entry.IsPortableCodeView)
{
var codeViewEntry=peReader.ReadCodeViewDebugDirectoryData(entry);
var pdbName=Path.GetFileName(codeViewEntry.Path);
var codeViewEntryGuid=$"{codeViewEntry.Guid.ToString("N").ToUpper()}FFFFFFFF";
return $"{MsftSymbolServerUrl}/{pdbName}/{codeViewEntryGuid}/{pdbName}";
}
}
查找 DLL 文件
如前所述,我們的 .NET 參考文檔管道對(duì) DLL 文件或 NuGet 包的集合進(jìn)行操作。但對(duì)于某些程序集,我們需要發(fā)揮創(chuàng)造力來(lái)生成指向源代碼的鏈接。以下是我們需要開發(fā)解決方案的兩種情況:
參考程序集。例如, Microsoft.NETCore.App.Ref 包中的 DLL。參考程序集沒有將 PDB 上傳到符號(hào)服務(wù)器,這阻止我們生成源代碼鏈接。我們當(dāng)前的解決方案是下載Runtime 包并使用其中的程序集下載匹配的 PDB。
源代碼嵌入在 PDB 中。例如,System.Threading.AccessControl 包在構(gòu)建時(shí)會(huì)將源代碼生成到 obj 文件夾中。
這并不能幫助我們鏈接到源代碼,因此我們不會(huì)使用 lib 文件夾中的 DLL,而是會(huì)在runtimes文件夾中查找同名的 DLL。
Microsoft.NETCore.App.Ref
https://www.nuget.org/packages/Microsoft.NETCore.App.Ref/8.0.0
Runtime 包
https://www.nuget.org/packages/Microsoft.NETCore.App.Runtime.linux-x64/8.0.0
System.Threading.AccessControl
https://www.nuget.org/packages/System.Threading.AccessControl/8.0.0
使用文檔管道中的鏈接
一旦我們找到正確的 DLL/PDB 文件并成功建立源代碼的鏈接,我們就會(huì)將此信息以 JSON 文件形式保存在目標(biāo)文檔 GitHub 存儲(chǔ)庫(kù)中。
為了了解我們將如何使用這些信息,我們需要重新審視 .NET 參考文檔管道。管道為每種唯一類型創(chuàng)建一個(gè) XML 文件,我們的構(gòu)建系統(tǒng)稍后會(huì)將其轉(zhuǎn)換為顯示在 Microsoft Learn 上的 HTML 頁(yè)面。為了將 XML 中的 API 映射到 JSON 文件中找到的相應(yīng)源代碼鏈接,我們使用唯一標(biāo)識(shí)符 DocId。此值存在于 XML(DocId)和 JSON(DocsId)中。
例如,System.String 的 DocId 為 T:System.String。此 DocId 值將用于定位 System.Private.CoreLib.json 文件(其對(duì)應(yīng)版本)中的源代碼鏈接。
"DocsId": "T:System.String",
"SourceLink": "https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14/src/libraries/System.Private.CoreLib/src/System/String.cs"
若要了解如何生成 DocId,請(qǐng)參閱 DocCommentId.cs 或 DocumentationCommentId.cs。
DocId
https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/language-specification/documentation-comments#d42-id-string-format
T:System.String
https://github.com/dotnet/dotnet-api-docs/blob/main/xml/System/String.xml#L4
System.Private.CoreLib.json
https://github.com/dotnet/dotnet-api-docs/blob/main/xml/SourceLinkInformation/net-8.0/System.Private.CoreLib.json
DocCommentId.cs
https://github.com/jbevain/cecil/blob/56d4409b8a0165830565c6e3f96f41bead2c418b/rocks/Mono.Cecil.Rocks/DocCommentId.cs#L303C2-L303C66
DocumentationCommentId.cs
https://github.com/dotnet/roslyn/blob/fd9a371c76d7b3440d0bf61ba2d8fe534d4a99ac/src/Compilers/Core/Portable/DocumentationCommentId.cs#L50
已知限制
在當(dāng)前的實(shí)施中,我們意識(shí)到一些限制:
對(duì)于 PDB 中沒有記錄文檔信息的類型(例如枚舉或接口),在 CustomDebugInformation 表中引入了新的 GUID TypeDefinitionDocuments 來(lái)解決此問題。但是,對(duì)于某些 DLL,這些信息有時(shí)會(huì)被修剪,導(dǎo)致我們無(wú)法生成鏈接。
請(qǐng)參閱此處的錯(cuò)誤詳細(xì)信息 https://github.com/dotnet/runtime/issues/100051。
對(duì)于沒有定義主體的類成員(例如 extern 或 abstract),PDB 中不包含行信息(SequencePoints)。因此,我們無(wú)法指向某個(gè)跨度范圍,而是指向整個(gè)文件。我們計(jì)劃在未來(lái)做出改進(jìn)以解決此問題。
TypeDefinitionDocuments
https://www.w3.org/TR/WCAG22/#keyboard-accessible
另一個(gè)改進(jìn)想法
您可能已經(jīng)注意到,我們與 Go to definition共享了許多核心邏輯。事實(shí)上,我們?cè)趯?shí)現(xiàn)中重用了它們的幾個(gè)類。我們提出了一個(gè)準(zhǔn)備用來(lái)的改進(jìn)此過程的功能,即使用現(xiàn)有代碼修改 Roslyn,以生成供我們使用的類型/成員級(jí)源映射。
如果社區(qū)有同樣的需求,請(qǐng)?jiān)u論為我們投票。謝謝!
向我們提供您的反饋
我們很樂意聽取您對(duì)使用這些鏈接的反饋,因此請(qǐng)告訴我們您的想法!如果您發(fā)現(xiàn)任何與鏈接相關(guān)的問題,請(qǐng)隨時(shí)使用反饋控件分享或在相關(guān)文檔存儲(chǔ)庫(kù)上提交 GitHub 問題。
最后,致謝
我要感謝我的同事@shiminxu 為這個(gè)項(xiàng)目做出的貢獻(xiàn)。還要感謝 .NET 團(tuán)隊(duì)的 @ericstj 和 Roslyn 團(tuán)隊(duì)的 @tmat 提供的技術(shù)指導(dǎo)。最后,感謝無(wú)數(shù)為實(shí)現(xiàn)這一改變做出的貢獻(xiàn)的人。
@shiminxu
https://github.com/jianying10202713
@ericstj
https://github.com/ericstj
@tmat
https://github.com/tmat
日干貨好文分享丨請(qǐng)點(diǎn)擊+關(guān)注 對(duì)R語(yǔ)言感興趣的加微信fridaybifly,邀請(qǐng)你進(jìn)入R語(yǔ)言學(xué)習(xí)群。
今天我們就一起來(lái)利用簡(jiǎn)單的R函數(shù)做一些爬蟲工作,當(dāng)做是為一些爬蟲愛好者提供一些思路。假如想爬取天善社區(qū)現(xiàn)在的在線課程數(shù)據(jù),查看你感興趣課程的相關(guān)信息(授課老師、課時(shí)數(shù)、價(jià)格、銷量)等等。接下來(lái),讓我們一步步完成以上的需求。
先看看天善社區(qū)的視頻首頁(yè)地址:
https://edu.hellobi.com/course/explore?page=1
首頁(yè)截圖如下:
在網(wǎng)頁(yè)上點(diǎn)擊鼠標(biāo)右鍵,選擇查看網(wǎng)頁(yè)源代碼,查看當(dāng)前頁(yè)面的HTML源碼:
假如各位看官不懂得爬蟲技術(shù),只要懂得運(yùn)用readLines函數(shù)和簡(jiǎn)單的正則表達(dá)式就能完成簡(jiǎn)單的爬蟲工作。
首先我們先利用readLines函數(shù)將網(wǎng)頁(yè)的html信息爬取到R中。
查看讀取后的結(jié)果:
可見,已經(jīng)把HTML的源碼爬到R中,接下來(lái),我們一步步提取需要的數(shù)據(jù)。
先提取課程名稱
現(xiàn)在提取課程數(shù)信息
學(xué)習(xí)人數(shù)、授課老師、課程售價(jià)的信息根據(jù)以上方式提取出來(lái),代碼如下:
可見,第一頁(yè)的課程信息全部被爬下來(lái)了(備注,第十個(gè)課程無(wú)授課老師,直接跳過)。
我們發(fā)現(xiàn),天善一共有7頁(yè)視頻,現(xiàn)在利用爬蟲全部爬取下來(lái),總結(jié)網(wǎng)頁(yè)地址:
https://edu.hellobi.com/course/explore?page=1
https://edu.hellobi.com/course/explore?page=2
……
爬取全部網(wǎng)頁(yè)數(shù)據(jù)的完整代碼如下:
其實(shí),R做爬蟲也有很多功能強(qiáng)大的包,例如quantmod包、XML包、RCrul包、rvest包。善用這些包,可以實(shí)現(xiàn)復(fù)雜的爬蟲工作,并大大簡(jiǎn)化代碼量。最后,我們利用rvest包對(duì)以上的爬蟲重做一遍,這邊直接給出爬蟲代碼。
結(jié)果如下:
可見,天善線上一共有107套視頻。我們想查看一下謝佳標(biāo)老師現(xiàn)在在線的視頻有哪些,中需要在serach窗口輸入老師名字即可。
說明:
本文作者為天善智能簽約講師謝佳標(biāo),此文允許轉(zhuǎn)載,轉(zhuǎn)載時(shí)需請(qǐng)完整保留以下內(nèi)容,違者必究。
原文來(lái)自天善智能社區(qū):
www.hellobi.com
原文地址:
https://ask.hellobi.com/blog/xiejiabiao/5402
友情提示:
天善智能是國(guó)內(nèi)最大的商業(yè)智能BI、數(shù)據(jù)分析、大數(shù)據(jù)領(lǐng)域社區(qū),歡迎大家登陸天善學(xué)院有更多免費(fèi)行業(yè)專家數(shù)據(jù)庫(kù),商業(yè)智能BI,數(shù)據(jù)分析,大數(shù)據(jù),數(shù)據(jù)挖掘視頻和干貨好文分享。
Friday BI Fly:每周一個(gè)主題,一場(chǎng)跟數(shù)據(jù)有關(guān)的行業(yè)、工具、技術(shù)的交流盛宴。我們的口號(hào)是“Friday BI Fly 周五BI飛起來(lái)”。 Friday BI Fly 微信直播活動(dòng)目前已舉辦30期,往期分享內(nèi)容包括:【金融行業(yè)、零售行業(yè)、旅游行業(yè)、大數(shù)據(jù)挖掘、大數(shù)據(jù)落地、數(shù)據(jù)分析師、數(shù)據(jù)治理、大數(shù)據(jù)征信、風(fēng)控管理、Python實(shí)戰(zhàn)、用戶畫像、數(shù)據(jù)治理、數(shù)據(jù)架構(gòu)、R語(yǔ)言等】。
本周分享主題:2016年11月4日晚8點(diǎn)半微信直播交流游戲行業(yè)數(shù)據(jù)倉(cāng)庫(kù)存儲(chǔ)模型第38場(chǎng),參加每周五的微信直播分享活動(dòng),請(qǐng)加微信:fridaybifly(備注:公司+行業(yè)+姓名)。
更多內(nèi)容歡迎登陸:https://www.hellobi.com/ 。
*請(qǐng)認(rèn)真填寫需求信息,我們會(huì)在24小時(shí)內(nèi)與您取得聯(lián)系。