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小时内与您取得联系。