经过前面几章,我们的网站已经最基本的功能,接下来就是继续拓展其他的功能,这期一起来实现一个该网站流量分析的工具,统计出这个网站每天用户相关数据,不仅要满足了我们对流量统计数字的基本要求,并且用更简单的图形显示方式,让我们一目了然地获取页面热度、点击率信息等等。有了这个想法以后,那怎么实现呢,跟着笔者一步步来吧。
首先,需要考虑怎么才能获得用户访问网站时的相关数据呢?我们没必要自己去记录这些信息,目前已经有很多成熟的解决方案,提供捕获这些信息的免费接口,我们只用去访问这些接口就可以了。
在众多的方案中,有2款目前是比较流行的,分别是google analytics和百度统计。怎么说呢,google的确实是行业的大牛,不仅很成熟,而且有详尽的技术文档,数据收集过程很顺利,但是数据呈现需要fanqiang(原因你们懂得),这块是硬伤,一个开放的网站没法要求用户都要fanqiang吧,也是由于这个原因,让我忍痛放弃了google analytics。那只有一个选择了:百度统计。想比较而言,百度统计的相关技术文档不忍多说,都是泪,笔者在坑中摸爬滚打很久,才弄明白怎么调用和访问。
1 public static class HttpClientExtensions
2 {
3 ///
4 /// Get请求API
5 ///
6 ///
7 ///
8 ///
9 ///
10 ///
11 public static async Task<string > HttpGetAsync(this HttpClient client, string url)
12 {
13 // 初始化内容
14 var responseMessage = await client.GetAsync(url);
15 if (responseMessage.IsSuccessStatusCode)
16 {
17 return await responseMessage.Content.ReadAsStringAsync();
18 }
19 else
20 {
21 return $" 访问API地址:{url}出错,错误代码:{responseMessage.StatusCode},错误原因:{responseMessage.ReasonPhrase} " ;
22 }
23 }
24
25
26 ///
27 /// Post请求API
28 ///
29 ///
30 ///
31 ///
32 ///
33 ///
34 public static async Task<string > HttpPostAsync(this HttpClient client, string url, string jsonValue)
35 {
36 // 初始化内容
37 var content = new StringContent(jsonValue, Encoding.UTF8, " application/json " );
38
39 var responseMessage = await client.PostAsync(url, content);
40 if (responseMessage.IsSuccessStatusCode)
41 {
42 return await responseMessage.Content.ReadAsStringAsync();
43 }
44 else
45 {
46 return $" 访问API地址:{url}出错,参数:{jsonValue},错误代码:{responseMessage.StatusCode} ,错误原因:{responseMessage.ReasonPhrase} " ;
47 }
48 }
1 [Area(" Tools " )]
2 public class ApiSimulatorController : AppController
3 {
4 private readonly MyRequest _myRequest;
5
6 public ApiSimulatorController(IOptions myRequest)
7 {
8 _myRequest = myRequest.Value;
9 }
10
11 ///
12 /// API模拟主页
13 ///
14 ///
15 ///
16 public IActionResult Index(string selectedApiCode = null )
17 {
18 UpdateDropDownList(selectedApiCode);
19 if (selectedApiCode == null )
20 {
21 return View(" Index " , new ApiRequest());
22
23 }
24 var selectedApi = _myRequest.ApiRequests.FirstOrDefault(s => s.ApiCode == selectedApiCode);
25 if (selectedApi != null && selectedApi.Methord == " POST " )
26 selectedApi.ApiDatas = selectedApi.ApiDatas.ToJsonString();
27 return View(" Index " , selectedApi);
28 }
29
30 ///
31 /// 调用API
32 ///
33 ///
34 ///
35 public async Task InvokApi(ApiRequest request)
36 {
37 var hc = new HttpClient();
38
39 if (request.Methord == " GET " )
40 {
41 var getUrl = request.Url + " ? " ;
42 foreach (var para in request.ApiParas)
43 {
44 getUrl += " & " + para.ParaName + " = " + para.ParaValue;
45 }
46
47 ViewBag.SendContent = getUrl;
48 ViewBag.ReturnResult = (await hc.HttpGetAsync(getUrl)).ToJsonString();
49 }
50 else if (request.Methord == " POST " )
51 {
52 if (!string .IsNullOrEmpty(request.ApiDatas))
53 {
54 ViewBag.SendContent = request.Url;
55 ViewBag.ReturnResult = (await hc.HttpPostAsync(request.Url, request.ApiDatas)).ToJsonString();
56 }
57 else
58 {
59 ModelState.AddModelError(string .Empty, " 请输入Json格式请求参数 " );
60 }
61 }
62 else
63 {
64 ModelState.AddModelError(string .Empty, " 请求方式非法 " );
65 }
66
67 UpdateDropDownList(request.ApiCode);
68 return View(" Index " , request);
69 }
70
71 ///
72 /// 初始化下拉选择框
73 ///
74 private void UpdateDropDownList(string selectedApiCode = null )
75 {
76 List listApiName = new List();
77 foreach (var request in _myRequest.ApiRequests.Select(s => new { s.ApiName, s.ApiCode }))
78 {
79 listApiName.Add(new SelectListItem
80 {
81 Value = request.ApiCode,
82 Text = request.ApiName,
83 Selected = request.ApiCode == selectedApiCode
84 });
85 }
86 ViewBag.ApiCodes = listApiName;
87 }
88 }
1 < div class ="form-group" >
2 < label asp-for ="ApiCode" > API名称:label >
3 < select asp-for ="ApiCode" class ="form-control input-sm select2" asp-items ="ViewBag.ApiCodes" >
4 < option value ="" > -- 请选择 --option >
5 select >
6 div >
7 < div class ="form-group" >
8 < label asp-for ="Url" > API地址:label >
9 < input asp-for ="Url" class ="form-control input-sm" readonly >
10 div >
11 < div class ="form-group" >
12 < label asp-for ="Methord" > 请求方式:label >
13 < input asp-for ="Methord" class ="form-control input-sm" readonly >
14 div >
15 < div class ="form-group" >
16 < label for ="params" class ="" > 请求参数:label >
17 @if (Model.Methord == "GET")
18 {
19 < div style ="overflow-x:auto;" >
20 < table class ="table table-bordered table-striped table-condensed" id ="params" >
21 < thead >
22 < tr >
23 < td > 参数名td >
24 < td > 类型td >
25 < td > 是否必填td >
26 < td > 说明td >
27 < td > 值td >
28 tr >
29 thead >
30 < tbody >
31 @for (var i = 0; i < Model .ApiParas.Count(); i++)
32 {
33 >
34 < td >
35 < span > @Model.ApiParas[i].ParaNamespan >
36 @Html.TextBoxFor(a => a.ApiParas[i].ParaName,
37 new { @class = "form-control input-sm", type = "hidden" })
38 td >
39 < td >
40 < span > @Model.ApiParas[i].ParaTypespan >
41 @Html.TextBoxFor(a => a.ApiParas[i].ParaType,
42 new { @class = "form-control input-sm", type = "hidden" })
43 td >
44 < td >
45 < span > @(Model.ApiParas[i].Required ? "是" : "否")span >
46 @Html.TextBoxFor(a => a.ApiParas[i].Required,
47 new { @class = "form-control input-sm", type = "hidden" })
48 td >
49 < td >
50 < span > @Model.ApiParas[i].Descriptionspan >
51 @Html.TextBoxFor(a => a.ApiParas[i].Description,
52 new { @class = "form-control input-sm", type = "hidden" })
53 td >
54 < td >
55 @Html.TextBoxFor(a => a.ApiParas[i].ParaValue,
56 new { @class = "form-control input-sm" })
57 td >
58 tr >
59 }
60 tbody >
61 table >
62 div > }
63 else if ((Model.Methord == "POST"))
64 {
65 @Html.TextAreaFor(m => m.ApiDatas,
66 new { @class = "form-control", rows = "8", placeholder = "输入Json格式 ..." })
67 }
68 div >
69 < button type ="submit" class ="btn btn-success" >< i class ="fa fa-send-o margin-r-5" > i > 发送请求button >
json文件中增加“手机号码归属地”、“百度统计”相关API的配置,我们来测试一下:
流量分析工具
有了上面API模拟工具,现在可以很方便的调试我们百度统计接口了。百度统计是怎么获取这些网站用户访问的相关信息的呢?原理其实很简单,百度针对你的注册服务提供一段js代码,其中包含标识你在百度统计的id。你在网页中添加这段代码后,每当用户访问该网站时,会下载这段js脚本,加载完毕和离开页面的时候,都会发送一次请求和传递参数,百度统计服务中心从而捕获到这些信息,维护在服务器中。调用百度统计API传递你的id,会根据id返回你的网站对应分析数据。
关于流量统计原理,有兴趣详见揭秘百度统计和Google Analytics的工作原理
注册百度统计
知道了原理,那首先第一步我们注册百度统计用户。注册完成后,我们找到 代码管理-->代码获取,将百度统计帮你自动生成好的js脚本复制过来,粘贴到site.js文件中。由于_layout母版页引用了site.js文件,这样的话,网站域名下所有的用户访问,都会被统计。
安装完百度统计的代码,发布网站程序,可以用百度统计中代码检查,看看自己统计代码有没有被正确的安装,如果安装成功,估计20分钟后,就可以在百度统计中查看网站的访问情况了。当然,你也可以添加多个域名的网站。
申请Tongji API数据导出
现在我们很方便的在百度统计中查看各种统计数据了,比如流量分析、来源分析、访问分析、转化分析等等,接下来需要获取这些数据,来移植到我们自己的网站中来。百度提供了Tongji API,我们可以调用API来查询自己网站的分析数据,从而进一步组织增加的分析视图了。
要访问Tongji API,需要提供一个token值,这个需要开通申请,在 百度统计-->管理-->其他设置-->数据导出服务 中,请求开通,开通后百度统计会提供给你一个token字符串,以后用这个token就可以访问Tongji API。Tongji API具体的请求格式说明详见:百度统计开发平台
比如我们需要请求站点列表,使用API模拟工具,请求类型POST,url地址:https://api.baidu.com/json/tongji/v1/ReportService/getSiteList,这里注意请求的data参数格式应该如下:
1 {
2 " header " : {
3 " account_type " : 1 ,
4 " password " : " <密码> " ,
5 " token " : " " ,
6 " username " : " <用户名> "
7 },
8 " body " : {}
9 }
输入百度统计的用户名和密码及访问使用的token,即可正常访问我们的注册的所有站点,这里我们可以拿到站点的site_id(也可以通过百度统计页面查看),后面请求该站点的分析数据会用到。
地域分布数据获取
百度统计提供的数据类型很多,我们选取其中一个来试验下效果。比如我们需要获得访问网站用户的地域信息,不同省份的用户访问情况。
使用API模拟工具调试:请求类型POST,url地址:https://api.baidu.com/json/tongji/v1/ReportService/getData,请求的data参数格式如下:
1 {
2 " header " : {
3 " account_type " : 1 ,
4 " password " : "<密码> " ,
5 " token " : " " ,
6 " username " : "<用户名> "
7 },
8 " body " : {
9 " site_id " : <站点id> ,
10 " method " : " visit/district/a " ,
11 " start_date " : " 30daysago " ,
12 " end_date " : " today " ,
13 " metrics " : " pv_count,pv_ratio,visit_count,visitor_count,new_visitor_count,new_visitor_ratio, ip_count,bounce_ratio,avg_visit_time,avg_visit_pages,trans_count,trans_ratio " ,
14 " order " : " pv_count,desc " ,
15 " max_results " : 0
16 }
17 }
可以看到,正常返回按照不同省份区域的网站统计数据。
实现控制器逻辑:按照上面提供的json格式,配置到json文件中,并定义MyRequest对象,映射我们所有的API请求,MyRequest存放的是所有API请求的配置信息,通过API请求的id,加载不同的API配置信息。Areas/Tools/Controllers创建对应的控制器SiteAnalyticsController,主要实现GetVisitDistrictAnalytics方法,用来根据时间范围,获取相应的区域分析json数据:
1 [Area(" Tools " )]
2 public class SiteAnalyticsController : AppController
3 {
4 private readonly IList _requests;
5
6 public SiteAnalyticsController(IOptions myRequest)
7 {
8 _requests = myRequest.Value.ApiRequests;
9 }
10
11 public IActionResult Index()
12 {
13 return View();
14 }
15
16 ///
17 /// 获取百度访客区域统计数据
18 ///
19 ///
20 public async Task GetVisitDistrictAnalytics(string startDate, string endDate)
21 {
22 var hc = new HttpClient();
23 var request = _requests.FirstOrDefault(s => s.ApiCode == " BaiduGetVisitDistrict " );
24 var data = request.ApiDatas.Replace(" 30daysago " , startDate).Replace(" today " , endDate);
25 return Json(await hc.HttpPostAsync(request.Url, data));
26 }
27
28 ///
29 /// 获取百度趋势分析数据
30 ///
31 ///
32 public async Task GetTrendAnalytics(string startDate, string endDate)
33 {
34 var hc = new HttpClient();
35 var request = _requests.FirstOrDefault(s => s.ApiCode == " BaiduGetTrend " );
36 var data = request.ApiDatas.Replace(" 30daysago " , startDate).Replace(" today " , endDate);
37 return Json(await hc.HttpPostAsync(request.Url, data));
38 }
39 }
区域分析显示
有了区域分析的数据,接下来考虑要怎么显示。
我们设计各个省份的访问量,可以通过地图展现,根据实际访问量的多少,通过颜色的深浅表现;
表格的形式,具体显示不同省份的访问量和占比;
柱状图的形式,显示最近7天的访问量趋势;
地图展现,采用jvectormap插件,它是矢量地图,且有自己的API,还是非常好用的,具体使用方法,推荐访问官网:http://jvectormap.com/
Areas/Tools/Views创建视图Index:
1
2 < div class ="col-md-6 col-sm-6" >
3 < div class ="box-body" >
4 < div id ="map-markers" class ="text-center" style ="height: 420px;" >
5 < div > 浏览量地域分布div >
6 div >
7 div >
8 div >
9
10 < div class ="col-md-4 col-sm-4" style ="height: 440px; overflow: auto;" >
11 < table class ="table table-bordered" id ="districtTable" >
12 < tbody >
13 < tr >
14 < th style ="width: 10px" > #th >
15 < th > 省份th >
16 < th > 浏览量(PV)th >
17 < th > 占比th >
18 tr >
19 tbody >
20 table >
21 div >
22
23 < div class ="col-md-2 col-sm-2" >
24 < div class ="pad box-pane-right bg-green" style ="min-height: 280px" >
25 < div class ="description-block margin-bottom" id ="trend_pv_count" >
26 < div class ="sparkbar pad" data-color ="#fff" > div >
27 < h5 class ="description-header" > h5 >
28 < span class ="description-text" > 浏览量(PV)span >
29 div >
30 < div class ="description-block margin-bottom" id ="trend_visitor_count" >
31 < div class ="sparkbar pad" data-color ="#fff" > div >
32 < h5 class ="description-header" > h5 >
33 < span class ="description-text" > 访客数(UV)span >
34 div >
35 < div class ="description-block" id ="trend_ip_count" >
36 < div class ="sparkbar pad" data-color ="#fff" > div >
37 < h5 class ="description-header" > h5 >
38 < span class ="description-text" > IP数span >
39 div >
40 < div class ="description-block" id ="trend_avg_visit_time" >
41 < div class ="sparkbar pad" data-color ="#fff" > div >
42 < h5 class ="description-header" > h5 >
43 < span class ="description-text" > 平均访问时长span >
44 div >
45 div >
46 div >
SiteAnalytics.js中,定义jvectormap显示样式,动态获取区域分析数据后, 设置数据集mapObject.series.regions[0].setValues(visitorsData);
1 var options = {
2 map: 'cn_mill',
3 backgroundColor: 'transparent',
4 regionStyle: {
5 initial : {
6 fill : 'rgba(210, 214, 222, 1)',
7 'fill-opacity' : 1,
8 stroke : 'none',
9 'stroke-width' : 0,
10 'stroke-opacity': 1
11 },
12 hover : {
13 'fill-opacity': 0.7,
14 cursor : 'pointer'
15 },
16 selected : {
17 fill: 'yellow'
18 },
19 selectedHover: {}
20 },
21 series: {
22 markers: [{
23 attribute: 'fill',
24 scale: ['#C8EEFF', '#0071A4'],
25 normalizeFunction: 'polynomial',
26 values: [408, 512, 550, 781],
27 legend: {
28 vertical: true
29 }
30 }],
31 regions: [
32 {
33 scale: ['#ebf4f9', '#92c1dc'],
34 normalizeFunction: 'polynomial'
35 }
36 ]
37 },
38 onRegionLabelShow: function (e, el, code) {
39 var html = '';
40 html += ''
;
41 html += '
' + el.html() + '
'
;
42 html += '
浏览量(PV)';
43 if (typeof visitorsData[code] != 'undefined') {
44 html += visitorsData[code];
45 } else {
46 html += 0;
47 }
48 html += '
'
;
49 html += '
占比';
50 if (typeof pecentData[code] != 'undefined') {
51 html += pecentData[code];
52 } else {
53 html += 0;
54 }
55 html += ' %
'
;
56 el.html(html);
57 }
58 }
59
60 $('#map-markers').vectorMap(options);
小结
用地图显示区域分析功能至此就已经大体完成,我们加上图表数据的显示,这样内容更丰富些,最后,我们看下效果:
你可能感兴趣的:(ASP.NET Core 一步步搭建个人网站(5)_Api模拟和网站分析)
智驾技术全链条解析
TrustZone_
智驾 智驾
智驾技术全链条解析(2025年最新版)智驾技术涵盖从环境感知到车辆控制的完整闭环,涉及硬件、算法、数据与系统集成等多个领域。以下结合行业最新进展(截至2025年3月)进行深度拆解:一、感知技术:汽车的“感官系统”多传感器融合架构•核心传感器类型:◦激光雷达:华为ADS3.0采用200米探测距离的激光雷达,实现高精度三维建模,但成本较高(约2500元/颗);◦毫米波雷达:用于穿透雨雾探测,比亚迪天神
field.setAccessible(true);代码扫描有安全漏洞,解决方案
码叔义
常规发表 java 开发语言
AccessibleObject类是Field、Method和Constructor对象的基类,能够允许反射对象修改访问权限修饰符,绕过由Java访问修饰符提供的访问控制检查。它让程序员能够更改私有字段或调用私有方法,这在通常情况下是不允许的。例如:以下代码片段中,将Field将accessible标记设置为true。Classclazz=User.class;Fieldfield=clazz.g
请求https,X509证书信任管理器类,避免导证书
益梅珍
代码片段 发送请求 java
实现X509证书信任管理器类(避免导证书)packagecom.showlin.httpsDemo;importjavax.net.ssl.X509TrustManager;importjava.security.cert.CertificateException;importjava.security.cert.X509Certificate;/***@Author:xielin*@Descri
Sonar的常见场景
码叔义
常规发表 java 开发语言
Avoidlongparameterlists.方法参数过多,最多允许5个MissingaJavadoccomment.需要注释Expected@paramtagfor‘area’.需要注释Expected@returntag.需要注释Expected@throwstagfor‘Exception’.需要注释Unused@paramtagfor‘licenseInfoMap’.修改注释Lineis
python男孩_python爬虫:爬取男生喜欢的图片
weixin_39971138
python男孩
前言需要Python源码、PDF、视频资料可以点击下方链接获取http://note.youdao.com/noteshare?id=3054cce4add8a909e784ad934f956cef任务目标:1.抓取不同类型的图片2.编写一个GUI界面爬虫程序,打包成exe重新文件3.遇到的难点1.分析如何抓取不同类型的图片首先打开网站,可以看到有如下6个类型的菜单在这里插入图片描述点击不同菜单,
三维错切变换矩阵_齐次空间与仿射变换
瓢咋
三维错切变换矩阵
齐次空间与仿射变换1.齐次坐标与齐次空间1.1齐次坐标齐次坐标本质上是4D向量(x,y,z,w),在w=1处的三维空间定义为标准的3D空间,任何齐次坐标转化到标准3D空间坐标点为(x/w.y/w,z/w),如果w为0时(x,y,z,0)表示的是标准3D空间的方向(x,y,z)而并非坐标点。1.24X4齐次矩阵由于表示三维空间的3x3矩阵只能表示旋转和缩放不能表示移动,当我们使用齐次矩阵时就可以表示
cefsharp 带cookie访问_Python爬虫:scrapy之Cookie和Session
长虹万贯
cefsharp 带cookie访问
关于cookie和session估计很多程序员面试的时候都会被问到,这两个概念在写web以及爬虫中都会涉及,并且两者可能很多人直接回答也不好说的特别清楚,所以整理这样一篇文章,也帮助自己加深理解什么是Cookie其实简单的说就是当用户通过http协议访问一个服务器的时候,这个服务器会将一些Name/Value键值对返回给客户端浏览器,并将这些数据加上一些限制条件。在条件符合时,这个用户下次再访问服
https协议如何通过X509TrustManager接口实现自己创建的证书
wangmingbin
java https
开通了一个https协议,但是不是国际认证的,自己做的证书,访问一个接口的时候比如https:/xx.xx.xx.xx/a?c=d的时候,如果在游览器访问,需要用户确认的。如果我要模拟服务器向这个接口发送请求,就会报错误。我的原代码是:1创建信任管理器/***信任管理器**@authorliufeng*@date2013-04-10*/publicclassMyX509TrustManagerim
仿射变换矩阵应用
点云学习
c++ pcl点云处理 算法 pcl 点云处理 3D视觉
目录1原理介绍2数学公式推导3计算流程4示例代码仿射变换是计算机视觉、图像处理和点云处理中常用的几何变换之一。它不仅包括旋转和平移,还包括缩放和剪切等线性变换。仿射变换保持了点、直线和平面的平行性。1原理介绍仿射变换在三维空间中通常由一个3×3的线性变换矩阵和一个3×1的平移向量组成。通过使用齐次坐标,我们可以将仿射变换表示为一个4×4矩阵:其中:A是一个3×3的线性变换矩阵(包含旋转、缩放、剪切
理解 C# 泛型接口中的协变与逆变(抗变)
幻凌风
NET
一、协变和逆变是什么?先从字面上理解协变(Covariance)、逆变(Contravariance)。co-是英文中表示“协同”、“合作”的前缀,协变的字面意思就是“与变化的方向相同”。contra-是英文中表示“相反”的前缀,逆变的字面意思就是是“与变化方向相反”。那么问题来了,这里的变化方向指的是什么?C#中对于对象(即对象引用),仅存在一种隐式类型转换,即子类型的对象引用到父类型的对象引用
5G基本概念
私语茶馆
通信系统 5G
作者:私语茶馆1.5G应用场景概述1.1.5G应用场景ITU域2015年定义了三大应用场景:eMBB(增强型移动宽带)、uRLLC(低时延高可靠通信)、mMTC(海量物联网通信);emBB:EnhancedMobileBroadband,移动互联网应用,是4GMBB(移动宽带)的升级,主要侧重于网络速率、带宽容量、频谱效率等指标uRLLC:ultra-ReliableLowLatencyCommu
AI问答-供应链管理:直接采购和间接采购有什么区别
快雪时晴-初晴融雪
供应链管理 供应链管理
直接采购和间接采购是企业采购活动中的两种主要方式,它们在多个方面存在显著的区别。以下是关于直接采购和间接采购的详细对比:直接采购间接采购定义企业直接从生产商或供应商处购买所需的产品或服务,无需经过中间商或分销商。企业通过中间商(如贸易公司、物资公司、采购中介组织等)实施采购行为,也称委托采购或中介采购。服务对象主要服务于外部客户,用于产品生产及销售所需的物料与服务。主要服务于内部客户,支持产品生产
VSCode/Cursor 配置Clang-Format
shanght1
vscode ide 编辑器 c++
1、下载安装插件:Clang-Format2、下载安装Clang-Format运行文件LLVM-19.1.5-win64.exe3、解压上述文件至自定义文件夹如:E:\soft\LLVM4、自定义文件夹中存放:clang-format文件,内容可自己生成也可以网上找注意文件格式需要为:UTF-8eg:D:\Project\.clang-format5、配置clang-format插件设置:vsco
力扣-数组-34 在排序数组中查找元素的第一个和最后一个位置
夏末秋也凉
力扣 # 数组 leetcode 算法 数据结构
思路和时间复杂度思路:先找到中间数,如果没找到就返回{-1,-1},如果找到了就以当前节点为中点,向两边扩时间复杂度:代码classSolution{public:vectorsearchRange(vector&nums,inttarget){vectorres;if(nums.size()==0)return{-1,-1};//左闭右开intleft=0,right=nums.size();i
Java基础知识:标识符、关键字、数据类型
谏君之
java教程 java jvm 开发语言 编程
Java标识符Java中的标识符是赋予变量、类、方法、包、接口等的名称。这些是唯一的名称,每个Java变量都必须使用唯一名称进行标识。例:publicclassTest{publicstaticvoidmain(String[]args){inta=20;}}在上面的Java代码中,我们有5个标识符,如下所示:测试:类名main:方法名称字符串:预定义的类名args:变量名称a:变量名称Java标
The Rust Programming Language 学习 (二)
niandb
rust 开发语言 java
通用编程概念变量和可变性默认情况下变量是不可变的(immutable),不过你也可以选择让变量是可变的(mutable).变量的遮蔽你可以声明和前面变量具有相同名称的新变量,说这个是第一个变量被第二个变量遮蔽(shadow),这意味着当我们使用变量时我们看到的会是第二个变量的值。我们可以通过使用相同的变量名并重复使用let关键字来遮蔽变量,如下程序并不会报错:letx=5;letx=x+1;{le
tauri如何实现窗口拖动,自定义标题栏
爱音乐的程序猿
rust语言 前端 tauri rust 前端 桌面软件 exe
文章目录一、tauri是什么?二、封装好的标题栏,引用修改即可使用三相关配置实现细节实现窗口拖动一、tauri是什么?Tauri是一个开源框架,用于创建跨平台的桌面应用程序。它使用Rust编程语言,并结合了现有的Web技术,如HTML、CSS和JavaScript。Tauri旨在提供一个快速、可靠和安全的方式来构建本地应用程序,同时保持Web开发的灵活性和易用性。它支持多个操作系统和架构,包括Wi
Python爬虫学习(一)——爬取新浪新闻
WayBling
python python 爬虫
参照网易云课堂的课程实践的结果:准备工作:安装requests和BeautifulSoup4。打开cmd,输入如下命令pipinstallrequestspipinstallBeautifulSoup4打开我们要爬取的页面,这里以新浪新闻为例,地址为:http://news.sina.com.cn/china/大概的思路就是通过浏览器的开发者工具检测到要获取数据所需要的request是什么,然后使
WebSocket(WS)协议系列(四)SSL/TLS协议
是纯一呀
WebSocket 网络 websocket ssl 网络协议
SSL(SecureSocketsLayer)和TLS(TransportLayerSecurity)是用于在网络上实现安全通信的协议,它们通常用于加密数据传输,保护数据免受窃取、篡改和伪造。虽然SSL已被逐步淘汰,现代网络通信大多使用TLS,但很多时候,我们仍然会把SSL/TLS一起提及,通常理解为同一个概念。SSL/TLS协议是什么?SSL是最初由Netscape开发的一种加密协议,目的是在计
Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
m0_65559335
计算机杂谈 docker 容器 运维
Docker是一个开源的容器化平台,可以将应用程序和所有其依赖的组件打包成一个容器。它的基本概念是镜像和容器。镜像是一个只读的文件,包含了需要运行的应用程序和其所需的操作系统、库文件和依赖项。镜像可以从DockerHub等公共或私有仓库中获取,也可以通过Dockerfile定义自己定制的镜像。容器是从镜像创建的运行实例,是可执行和可移植的。每个容器都是独立的,隔离的环境,可以在任何支持Docker
(7)学习编程---python多进程、多线程、协程
daydreamer5920
编程 学习
多进程(Multiprocessing)概念多进程是指一个程序同时运行多个进程。每个进程都有自己的内存空间和资源,进程之间通过进程间通信(IPC)来共享数据。优点独立性:每个进程都有独立的内存空间,一个进程的崩溃不会影响其他进程。并行性:可以利用多核CPU的优势,实现真正的并行计算。缺点资源消耗:每个进程都有自己的内存空间,因此资源消耗较大。通信成本:进程间通信需要通过IPC,通信成本较高。多线程
了解rust以及cargo
RustKK
rust 开发语言 后端
Rust是一种系统编程语言,设计用来提供高性能和内存安全。它的主要目标是通过所有权(ownership)模型和借用检查(borrowchecking)来防止空指针和数据竞争等常见的编程错误Cargo是Rust的包管理器和构建系统。它的作用是简化Rust项目的构建、依赖管理、打包和发布。Cargo和Rust紧密结合,为开发者提供了一个高效的开发环境。Cargo的作用依赖管理:Cargo可以管理项目的
华为OD E卷 #16 机场航班调度
时光回响
华为OD机试E卷 华为od
题目A市机场停放了多架飞机,每架飞机都有自己的航班号CA3385,CZ6678,SC6508等,航班号的前2个大写字母(或数字)代表航空公司的缩写,后面4个数字代表航班信息。但是A市机场只有一条起飞跑道,调度人员需要安排目前停留在机场的航班有序起飞。为保障航班的有序起飞,调度员首先按照航空公司的缩写(航班号前2个字母)对所有航班进行排序,同一航空公司的航班再按照航班号的后4个数字进行排序,最终获得
华为OD E卷 #18 生成哈夫曼树
时光回响
华为OD机试E卷 华为od 算法 数据结构
题目给定长度为n的无序的数字数组,每个数字代表二叉树的叶子节点的权值,数字数组的值均大于等于1。请完成一个函数,根据输入的数字数组,生成哈夫曼树,并将哈夫曼树按照中序遍历输出。为了保证输出的二叉树中序遍历结果统一,增加限制:二叉树节点中,左节点权值小于右节点权值,根节点权值为左右节点权值之和。当左右节点权值相同时,左子树高度小于等于右子树高度。输入5515403010输出4010030601530
解释 TypeScript 中的类型系统,如何定义和使用类型?
程序员黄同学
前端开发 JavaScript typescript ubuntu javascript
1.类型系统的核心作用TypeScript类型系统本质上是JavaScript的静态类型增强方案,提供三个核心价值:开发阶段类型检查(类似编译时eslint)更清晰的API文档(类型即文档)更好的IDE自动补全支持代码示例://错误示范:未指定类型导致潜在隐患functionadd(a,b){returna+b;}add('hello',123);//运行时错误但编译期不报错//正确类型标注fun
怎么定义世界模型,Sora/Genie/JEPA 谁是世界模型呢?(1)
周博洋K
分布式 人工智能 深度学习 自然语言处理 机器学习
说这个问题之前先看一下什么是世界模型,它的定义是什么?首先世界模型的起源是咋回事呢?其实世界模型在ML领域不是什么新概念,远远早于Transfomer这些东西被提出来,因为它最早是强化学习RL领域的,在20世纪90年代由JuergenSchmiduber实验室给提出来的。2018年被Ha和Schmiduber发表了用RNN来做世界模型的论文,相当于给他重新做了一次定义。然后就是最近跟着Sora,G
rust语言闭包trait类型编译器推导总结
灵山悟空
rust 开发语言 后端
Rust编译器根据闭包对捕获的外部变量的使用方式自动推断其实现的Trait类型,如:Fn,FnMut,FnOnce;而非是否捕获所有权。注意move关键字只是令闭包捕获外部变量的所有权,并非决定闭包的Trait类型为FnOnce。对捕获变量的使用方式组合:(1)捕获外部变量的所有权。(2)消耗捕获的变量,消耗:释放,杀死,清除,关闭等。(3)只读。(4)可写(变)(5)不可变借用。(6)可变借用。
用python设计一个表白灯牌
噔噔噔噔@
python pygame
表白灯牌可以通过控制LED灯的颜色和亮度来实现。你可以使用树莓派或者Arduino这样的硬件平台,结合Python编程语言来控制LED灯的状态。下面是一个简单的示例代码,可以实现一个表白灯牌效果:importRPi.GPIOasGPIOimporttime#设置GPIO引脚编号模式GPIO.setmode(GPIO.BCM)#设置LED引脚编号red_pin=17green_pin=18#设置GP
“知识海洋”的探险之旅,考研复习等你来挑战
闲虎考研
考研复习 考研经验 考研
在知识的广袤天地中,我们如同勇敢的水手,驾驶着智慧的船只,穿越波涛汹涌的思想之海,探索未知的知识领域,每一次航行都是一次心灵的冒险,每一次探索都是对自我认知的深化。考研复习,就像是一场充满挑战的旅程,在这段旅途中,我们需要面对各种各样的问题和困难,需要不断地学习和提高自己的能力,正是这些挑战让我们更加坚定地追求知识,让我们更加珍惜来之不易的学习机会。我们要明确自己的目标,只有明确了目标,才能有针对
软件测试工作的必要性分析
噔噔噔噔@
压力测试 功能测试
软件测试是确保软件质量的关键步骤,它的必要性体现在以下几个方面:发现和修复缺陷:软件测试可以帮助发现软件中存在的缺陷和问题,及时修复这些问题可以提高软件的稳定性和可靠性,避免用户在使用过程中遇到意外情况。提高用户满意度:经过充分测试的软件往往具有更好的性能、稳定性和易用性,用户在使用时体验更加顺畅,从而提升用户的满意度和忠诚度。节省成本:在软件开发过程中发现和解决问题的成本要低于将软件发布后再修复
TOMCAT在POST方法提交参数丢失问题
357029540
java tomcat jsp
摘自http://my.oschina.net/luckyi/blog/213209
昨天在解决一个BUG时发现一个奇怪的问题,一个AJAX提交数据在之前都是木有问题的,突然提交出错影响其他处理流程。
检查时发现页面处理数据较多,起初以为是提交顺序不正确修改后发现不是由此问题引起。于是删除掉一部分数据进行提交,较少数据能够提交成功。
恢复较多数据后跟踪提交FORM DATA ,发现数
在MyEclipse中增加JSP模板 删除-2008-08-18
ljy325
jsp xml MyEclipse
在D:\Program Files\MyEclipse 6.0\myeclipse\eclipse\plugins\com.genuitec.eclipse.wizards_6.0.1.zmyeclipse601200710\templates\jsp 目录下找到Jsp.vtl,复制一份,重命名为jsp2.vtl,然后把里面的内容修改为自己想要的格式,保存。
然后在 D:\Progr
JavaScript常用验证脚本总结
eksliang
JavaScript javaScript表单验证
转载请出自出处:http://eksliang.iteye.com/blog/2098985
下面这些验证脚本,是我在这几年开发中的总结,今天把他放出来,也算是一种分享吧,现在在我的项目中也在用!包括日期验证、比较,非空验证、身份证验证、数值验证、Email验证、电话验证等等...!
&nb
微软BI(4)
18289753290
微软BI SSIS
1)
Q:查看ssis里面某个控件输出的结果:
A MessageBox.Show(Dts.Variables["v_lastTimestamp"].Value.ToString());
这是我们在包里面定义的变量
2):在关联目的端表的时候如果是一对多的关系,一定要选择唯一的那个键作为关联字段。
3)
Q:ssis里面如果将多个数据源的数据插入目的端一
定时对大数据量的表进行分表对数据备份
酷的飞上天空
大数据量
工作中遇到数据库中一个表的数据量比较大,属于日志表。正常情况下是不会有查询操作的,但如果不进行分表数据太多,执行一条简单sql语句要等好几分钟。。
分表工具:linux的shell + mysql自身提供的管理命令
原理:使用一个和原表数据结构一样的表,替换原表。
linux shell内容如下:
=======================开始 
本质的描述与因材施教
永夜-极光
感想 随笔
不管碰到什么事,我都下意识的想去探索本质,找寻一个最形象的描述方式。
我坚信,世界上对一件事物的描述和解释,肯定有一种最形象,最贴近本质,最容易让人理解
&
很迷茫。。。
随便小屋
随笔
小弟我今年研一,也是从事的咱们现在最流行的专业(计算机)。本科三流学校,为了能有个更好的跳板,进入了考研大军,非常有幸能进入研究生的行业(具体学校就不说了,怕把学校的名誉给损了)。
先说一下自身的条件,本科专业软件工程。主要学习就是软件开发,几乎和计算机没有什么区别。因为学校本身三流,也就是让老师带着学生学点东西,然后让学生毕业就行了。对专业性的东西了解的非常浅。就那学的语言来说
23种设计模式的意图和适用范围
aijuans
设计模式
Factory Method 意图 定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method 使一个类的实例化延迟到其子类。 适用性 当一个类不知道它所必须创建的对象的类的时候。 当一个类希望由它的子类来指定它所创建的对象的时候。 当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
Abstr
Java中的synchronized和volatile
aoyouzi
java volatile synchronized
说到Java的线程同步问题肯定要说到两个关键字synchronized和volatile。说到这两个关键字,又要说道JVM的内存模型。JVM里内存分为main memory和working memory。 Main memory是所有线程共享的,working memory则是线程的工作内存,它保存有部分main memory变量的拷贝,对这些变量的更新直接发生在working memo
js数组的操作和this关键字
百合不是茶
js 数组操作 this关键字
js数组的操作;
一:数组的创建:
1、数组的创建
var array = new Array(); //创建一个数组
var array = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长度
var arrayObj = new Array([element0[, element1[, ...[, elementN]]]
别人的阿里面试感悟
bijian1013
面试分享 工作感悟 阿里面试
原文如下:http://greemranqq.iteye.com/blog/2007170
一直做企业系统,虽然也自己一直学习技术,但是感觉还是有所欠缺,准备花几个月的时间,把互联网的东西,以及一些基础更加的深入透析,结果这次比较意外,有点突然,下面分享一下感受吧!
&nb
淘宝的测试框架Itest
Bill_chen
spring maven 框架 单元测试 JUnit
Itest测试框架是TaoBao测试部门开发的一套单元测试框架,以Junit4为核心,
集合DbUnit、Unitils等主流测试框架,应该算是比较好用的了。
近期项目中用了下,有关itest的具体使用如下:
1.在Maven中引入itest框架:
<dependency>
<groupId>com.taobao.test</groupId&g
【Java多线程二】多路条件解决生产者消费者问题
bit1129
java多线程
package com.tom;
import java.util.LinkedList;
import java.util.Queue;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.loc
汉字转拼音pinyin4j
白糖_
pinyin4j
以前在项目中遇到汉字转拼音的情况,于是在网上找到了pinyin4j这个工具包,非常有用,别的不说了,直接下代码:
import java.util.HashSet;
import java.util.Set;
import net.sourceforge.pinyin4j.PinyinHelper;
import net.sourceforge.pinyin
org.hibernate.TransactionException: JDBC begin failed解决方案
bozch
ssh 数据库异常 DBCP
org.hibernate.TransactionException: JDBC begin failed: at org.hibernate.transaction.JDBCTransaction.begin(JDBCTransaction.java:68) at org.hibernate.impl.SessionImp
java-并查集(Disjoint-set)-将多个集合合并成没有交集的集合
bylijinnan
java
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.ut
Java PrintWriter打印乱码
chenbowen00
java
一个小程序读写文件,发现PrintWriter输出后文件存在乱码,解决办法主要统一输入输出流编码格式。
读文件:
BufferedReader
从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
通常,Reader 所作的每个读取请求都会导致对基础字符或字节流进行相应的读取请求。因
[天气与气候]极端气候环境
comsci
环境
如果空间环境出现异变...外星文明并未出现,而只是用某种气象武器对地球的气候系统进行攻击,并挑唆地球国家间的战争,经过一段时间的准备...最大限度的削弱地球文明的整体力量,然后再进行入侵......
那么地球上的国家应该做什么样的防备工作呢?
&n
oracle order by与union一起使用的用法
daizj
UNION oracle order by
当使用union操作时,排序语句必须放在最后面才正确,如下:
只能在union的最后一个子查询中使用order by,而这个order by是针对整个unioning后的结果集的。So:
如果unoin的几个子查询列名不同,如
Sql代码
select supplier_id, supplier_name
from suppliers
UNI
zeus持久层读写分离单元测试
deng520159
单元测试
本文是zeus读写分离单元测试,距离分库分表,只有一步了.上代码:
1.ZeusMasterSlaveTest.java
package com.dengliang.zeus.webdemo.test;
import java.util.ArrayList;
import java.util.List;
import org.junit.Assert;
import org.j
Yii 截取字符串(UTF-8) 使用组件
dcj3sjt126com
yii
1.将Helper.php放进protected\components文件夹下。
2.调用方法:
Helper::truncate_utf8_string($content,20,false); //不显示省略号 Helper::truncate_utf8_string($content,20); //显示省略号
&n
安装memcache及php扩展
dcj3sjt126com
PHP
安装memcache tar zxvf memcache-2.2.5.tgz cd memcache-2.2.5/ /usr/local/php/bin/phpize (?) ./configure --with-php-confi
JsonObject 处理日期
feifeilinlin521
java json JsonOjbect JsonArray JSONException
写这边文章的初衷就是遇到了json在转换日期格式出现了异常 net.sf.json.JSONException: java.lang.reflect.InvocationTargetException 原因是当你用Map接收数据库返回了java.sql.Date 日期的数据进行json转换出的问题话不多说 直接上代码
&n
Ehcache(06)——监听器
234390216
监听器 listener ehcache
监听器
Ehcache中监听器有两种,监听CacheManager的CacheManagerEventListener和监听Cache的CacheEventListener。在Ehcache中,Listener是通过对应的监听器工厂来生产和发生作用的。下面我们将来介绍一下这两种类型的监听器。
activiti 自带设计器中chrome 34版本不能打开bug的解决
jackyrong
Activiti
在acitivti modeler中,如果是chrome 34,则不能打开该设计器,其他浏览器可以,
经证实为bug,参考
http://forums.activiti.org/content/activiti-modeler-doesnt-work-chrome-v34
修改为,找到
oryx.debug.js
在最头部增加
if (!Document.
微信收货地址共享接口-终极解决
laotu5i0
微信开发
最近要接入微信的收货地址共享接口,总是不成功,折腾了好几天,实在没办法网上搜到的帖子也是骂声一片。我把我碰到并解决问题的过程分享出来,希望能给微信的接口文档起到一个辅助作用,让后面进来的开发者能快速的接入,而不需要像我们一样苦逼的浪费好几天,甚至一周的青春。各种羞辱、谩骂的话就不说了,本人还算文明。
如果你能搜到本贴,说明你已经碰到了各种 ed
关于人才
netkiller.github.com
工作 面试 招聘 netkiller 人才
关于人才
每个月我都会接到许多猎头的电话,有些猎头比较专业,但绝大多数在我看来与猎头二字还是有很大差距的。 与猎头接触多了,自然也了解了他们的工作,包括操作手法,总体上国内的猎头行业还处在初级阶段。
总结就是“盲目推荐,以量取胜”。
目前现状
许多从事人力资源工作的人,根本不懂得怎么找人才。处在人才找不到企业,企业找不到人才的尴尬处境。
企业招聘,通常是需要用人的部门提出招聘条件,由人
搭建 CentOS 6 服务器 - 目录
rensanning
centos
(1) 安装CentOS
ISO(desktop/minimal)、Cloud(AWS/阿里云)、Virtualization(VMWare、VirtualBox)
详细内容
(2) Linux常用命令
cd、ls、rm、chmod......
详细内容
(3) 初始环境设置
用户管理、网络设置、安全设置......
详细内容
(4) 常驻服务Daemon
【求助】mongoDB无法更新主键
toknowme
mongodb
Query query = new Query(); query.addCriteria(new Criteria("_id").is(o.getId())); &n
jquery 页面滚动到底部自动加载插件集合
xp9802
jquery
很多社交网站都使用无限滚动的翻页技术来提高用户体验,当你页面滑到列表底部时候无需点击就自动加载更多的内容。下面为你推荐 10 个 jQuery 的无限滚动的插件:
1. jQuery ScrollPagination
jQuery ScrollPagination plugin 是一个 jQuery 实现的支持无限滚动加载数据的插件。
2. jQuery Screw
S