Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537
iami朋友圈程序全開源版源碼,前臺一鍵發布圖文,視頻,音樂。發布內容支持定位或自定義位置信息。支持將發布內容設為廣告模式消息站內通知或郵件通知。支持其他用戶注冊,支持其他用戶發布文章,管理自己的文章。擁有豐富的后臺管理功能,一鍵操作。
安裝環境:Nginx ≥1.22/PHP=7.4/MySQL ≥5.6安裝前首先配置運行環境,運行需要在PHP中安裝exif擴展。
總結:這邊測試了一下沒有發現問題,此源碼為開源版,安裝后即可使用。
版權申請:本文A5資源網原創,經原創作者允許轉載許可聲明。原文地址http://a5.org.cn/a5_ziyuan/38963.html
者:Matt Trilby-Bassett;Min Huang
排版:Rani Sun
開發人員在閱讀 API 參考文檔時,有時會需要或希望查看相應的源代碼。直到不久之前,.NET API 參考文檔還沒有提供指向源代碼的鏈接,這引起社區添加這一功能的呼聲。針對這一反饋,我們很高興地宣布,現在大多數流行的 .NET API 上都提供了連接文檔和源代碼的鏈接。
在這篇博文中,我們將分享將鏈接添加到文檔以及利用現有 API 來實現這一改進的詳細信息。
鏈接的實例
在介紹實施細節之前,我們想展示一下文檔的改動。對于符合我們標準(啟用了源代碼鏈接、具有可訪問的 PDB 并托管在公共存儲庫中)的 .NET API,其鏈接包含在 Definition 元數據中。以下來自 String 類的截圖演示了這個新鏈接的位置:
如果存在重載,鏈接將包含在重載標題的下面。下面的 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)
我們如何建立鏈接?
.NET 參考文檔管道對一組 DLL 文件和 NuGet 包進行操作。這些文件由各種工具處理,以將其內容轉換為顯示在 Microsoft Learn 上的 HTML 頁面。正確構建源代碼的鏈接需要了解源代碼、二進制文件和 GitHub 之間的關系,以及它們如何與一些現有的 .NET API 配合在一起。在與 .NET 和 Roslyn 團隊的開發人員討論我們公開源代碼鏈接的目標時,很明顯我們的要求與 Visual Studio 的Go to definition功能緊密相關。
憑借這種理解以及 @davidwengier 在 Roslyn 中針對外部源的Go to definition改進中提供的有關Go to definition的大量細節,我們能夠采用類似的方法來構建指向文檔源代碼的鏈接。
Go to definition
https://github.com/dotnet/roslyn/issues/55834
@davidwengier
https://github.com/davidwengier
源代碼鏈接
源代碼鏈接是一種技術,它使 .NET 開發人員能夠調試其應用程序引用的程序集的源代碼。盡管源代碼鏈接最初旨在用于源代碼調試,但它完全適用于我們的場景。每個啟用源代碼鏈接的 .NET 項目都會在 PDB(程序數據庫)中生成從相對文件夾路徑到 絕對存儲庫 URL 的映射。這與 @davidwengier 在 Roslyn 中針對外部源的 Go to definition 改進中所述一致。
若要查看源鏈接條目,可以使用 dotPeek 或 ILSpy 打開 DLL。以下屏幕截圖顯示了使用 dotPeek 訪問 System.Private.CoreLib 的源鏈接條目的示例,方法是導航到 Portable PDB Metadata,然后導航到 CustomDebugInformation 表:
[!NOTE] 若要了解有關源代碼鏈接的元數據定義,請轉到:PortablePdb-Metadata。
源代碼鏈接
https://github.com/dotnet/sourcelink
@davidwengier
https://github.com/davidwengier
Roslyn 中針對外部源的 Go to definition 改進
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
建立鏈接
現在我們知道在源代碼鏈接條目中存儲了一個總體映射,下一個問題是如何為這個 DLL 中的每個類型/成員構建唯一的鏈接?
例如,我們為 String.Clone 方法構建的鏈接是:
https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14/src/libraries/System.Private.CoreLib/src/System/String.cs#L388C13-L388C25
此鏈接可分為 3 個部分:
第一部分 https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14 是從源代碼鏈接映射 json 解析出來的,并且與特定的存儲庫提交綁定。
第二部分 src/libraries/System.Private.CoreLib/src/System/String.cs 可以在 PDB 的文檔表中找到。
最后一部分 #L388C13-L388C25 是基于 MethodDebugInformation 表的 SequencePoints 列構建的。SequencePoints blob 會將此方法塊中的一系列 IL 指令映射回其原始源代碼行號,如下面的屏幕截圖所示。有關更多詳細信息,請轉到 SequencePoints 元數據定義。
我們使用 System.Reflection.Metadata 庫來遍歷此 DLL 中的所有類型/成員,然后匹配 MethodDebugInformation 表中的記錄以構建最終的鏈接。
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}");
}
}
該實現也可以在 Roslyn DocumentDebugInfoReader.cs 和 SymbolSourceDocumentFinder.cs 中找到。
SequencePoints 元數據定義
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 文件
因為我們知道鏈接的信息可以在 PDB 中找到,所以下一步就是找到這些 PDB 以供我們使用。
目前,指定某一個 DLL,我們會在三個地方查找相應的 PDB:
嵌入式 PDB。如果您的 csproj 中指定了<DebugType>embedded</DebugType>,則 PDB 文件將嵌入到此 DLL 中。
磁盤上的 PDB。您可以將 PDB 放在 DLL 旁邊。
Microsoft Symbol Server。有一個公共符號服務器,我們可以從中下載 DLL 的 PDB。
請參閱 Roslyn PdbFileLocatorService.cs 中的實現。
PdbFileLocatorService.cs
https://github.com/dotnet/roslyn/blob/b3d9ff7c9dc9e330b24d6087419dffe611a9dd77/src/Features/Core/Portable/PdbSourceDocument/PdbFileLocatorService.cs
查找正確的 PDB 版本
我們想進一步討論如何從 Microsoft Symbol Server 下載指定 DLL 的正確版本的 PDB。
下面是一個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 來查找源代碼鏈接條目。現在我們可以再次打開它并檢查元數據部分。
在上面的截圖中,我們可以在 Debug Directory 中找到這個 GUID,并且該條目必須是一個可移植代碼視圖條目。該條目的 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 參考文檔管道對 DLL 文件或 NuGet 包的集合進行操作。但對于某些程序集,我們需要發揮創造力來生成指向源代碼的鏈接。以下是我們需要開發解決方案的兩種情況:
參考程序集。例如, Microsoft.NETCore.App.Ref 包中的 DLL。參考程序集沒有將 PDB 上傳到符號服務器,這阻止我們生成源代碼鏈接。我們當前的解決方案是下載Runtime 包并使用其中的程序集下載匹配的 PDB。
源代碼嵌入在 PDB 中。例如,System.Threading.AccessControl 包在構建時會將源代碼生成到 obj 文件夾中。
這并不能幫助我們鏈接到源代碼,因此我們不會使用 lib 文件夾中的 DLL,而是會在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 文件并成功建立源代碼的鏈接,我們就會將此信息以 JSON 文件形式保存在目標文檔 GitHub 存儲庫中。
為了了解我們將如何使用這些信息,我們需要重新審視 .NET 參考文檔管道。管道為每種唯一類型創建一個 XML 文件,我們的構建系統稍后會將其轉換為顯示在 Microsoft Learn 上的 HTML 頁面。為了將 XML 中的 API 映射到 JSON 文件中找到的相應源代碼鏈接,我們使用唯一標識符 DocId。此值存在于 XML(DocId)和 JSON(DocsId)中。
例如,System.String 的 DocId 為 T:System.String。此 DocId 值將用于定位 System.Private.CoreLib.json 文件(其對應版本)中的源代碼鏈接。
"DocsId": "T:System.String",
"SourceLink": "https://github.com/dotnet/runtime/blob/5535e31a712343a63f5d7d796cd874e563e5ac14/src/libraries/System.Private.CoreLib/src/System/String.cs"
若要了解如何生成 DocId,請參閱 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
已知限制
在當前的實施中,我們意識到一些限制:
對于 PDB 中沒有記錄文檔信息的類型(例如枚舉或接口),在 CustomDebugInformation 表中引入了新的 GUID TypeDefinitionDocuments 來解決此問題。但是,對于某些 DLL,這些信息有時會被修剪,導致我們無法生成鏈接。
請參閱此處的錯誤詳細信息 https://github.com/dotnet/runtime/issues/100051。
對于沒有定義主體的類成員(例如 extern 或 abstract),PDB 中不包含行信息(SequencePoints)。因此,我們無法指向某個跨度范圍,而是指向整個文件。我們計劃在未來做出改進以解決此問題。
TypeDefinitionDocuments
https://www.w3.org/TR/WCAG22/#keyboard-accessible
另一個改進想法
您可能已經注意到,我們與 Go to definition共享了許多核心邏輯。事實上,我們在實現中重用了它們的幾個類。我們提出了一個準備用來的改進此過程的功能,即使用現有代碼修改 Roslyn,以生成供我們使用的類型/成員級源映射。
如果社區有同樣的需求,請評論為我們投票。謝謝!
向我們提供您的反饋
我們很樂意聽取您對使用這些鏈接的反饋,因此請告訴我們您的想法!如果您發現任何與鏈接相關的問題,請隨時使用反饋控件分享或在相關文檔存儲庫上提交 GitHub 問題。
最后,致謝
我要感謝我的同事@shiminxu 為這個項目做出的貢獻。還要感謝 .NET 團隊的 @ericstj 和 Roslyn 團隊的 @tmat 提供的技術指導。最后,感謝無數為實現這一改變做出的貢獻的人。
@shiminxu
https://github.com/jianying10202713
@ericstj
https://github.com/ericstj
@tmat
https://github.com/tmat
日干貨好文分享丨請點擊+關注 對R語言感興趣的加微信fridaybifly,邀請你進入R語言學習群。
今天我們就一起來利用簡單的R函數做一些爬蟲工作,當做是為一些爬蟲愛好者提供一些思路。假如想爬取天善社區現在的在線課程數據,查看你感興趣課程的相關信息(授課老師、課時數、價格、銷量)等等。接下來,讓我們一步步完成以上的需求。
先看看天善社區的視頻首頁地址:
https://edu.hellobi.com/course/explore?page=1
首頁截圖如下:
在網頁上點擊鼠標右鍵,選擇查看網頁源代碼,查看當前頁面的HTML源碼:
假如各位看官不懂得爬蟲技術,只要懂得運用readLines函數和簡單的正則表達式就能完成簡單的爬蟲工作。
首先我們先利用readLines函數將網頁的html信息爬取到R中。
查看讀取后的結果:
可見,已經把HTML的源碼爬到R中,接下來,我們一步步提取需要的數據。
先提取課程名稱
現在提取課程數信息
學習人數、授課老師、課程售價的信息根據以上方式提取出來,代碼如下:
可見,第一頁的課程信息全部被爬下來了(備注,第十個課程無授課老師,直接跳過)。
我們發現,天善一共有7頁視頻,現在利用爬蟲全部爬取下來,總結網頁地址:
https://edu.hellobi.com/course/explore?page=1
https://edu.hellobi.com/course/explore?page=2
……
爬取全部網頁數據的完整代碼如下:
其實,R做爬蟲也有很多功能強大的包,例如quantmod包、XML包、RCrul包、rvest包。善用這些包,可以實現復雜的爬蟲工作,并大大簡化代碼量。最后,我們利用rvest包對以上的爬蟲重做一遍,這邊直接給出爬蟲代碼。
結果如下:
可見,天善線上一共有107套視頻。我們想查看一下謝佳標老師現在在線的視頻有哪些,中需要在serach窗口輸入老師名字即可。
說明:
本文作者為天善智能簽約講師謝佳標,此文允許轉載,轉載時需請完整保留以下內容,違者必究。
原文來自天善智能社區:
www.hellobi.com
原文地址:
https://ask.hellobi.com/blog/xiejiabiao/5402
友情提示:
天善智能是國內最大的商業智能BI、數據分析、大數據領域社區,歡迎大家登陸天善學院有更多免費行業專家數據庫,商業智能BI,數據分析,大數據,數據挖掘視頻和干貨好文分享。
Friday BI Fly:每周一個主題,一場跟數據有關的行業、工具、技術的交流盛宴。我們的口號是“Friday BI Fly 周五BI飛起來”。 Friday BI Fly 微信直播活動目前已舉辦30期,往期分享內容包括:【金融行業、零售行業、旅游行業、大數據挖掘、大數據落地、數據分析師、數據治理、大數據征信、風控管理、Python實戰、用戶畫像、數據治理、數據架構、R語言等】。
本周分享主題:2016年11月4日晚8點半微信直播交流游戲行業數據倉庫存儲模型第38場,參加每周五的微信直播分享活動,請加微信:fridaybifly(備注:公司+行業+姓名)。
更多內容歡迎登陸:https://www.hellobi.com/ 。
*請認真填寫需求信息,我們會在24小時內與您取得聯系。