- Java突击小练习--利用正则表达式来简易的校验邮箱与手机号格式
CJH~
java正则表达式mysql
//校验邮箱publicclassTestEmail{publicstaticvoidmain(String[]args){Scannerinput=newScanner(System.in);//*号代表任意数量,放在0-9a-zA-Z后面,代表可以写任意数量的字母和数字//@是邮箱的符号,接在刚刚那串的后面//|代表或,也就是说@后可以跟着qq或163或sina中的任意字符串,代表哪家邮箱//
- mysql安装启动报错_mysql安装/启动报错汇总
weixin_29179583
mysql安装启动报错
2016/9/6补充初始化报错:#/usr/local/mysql/scripts/mysql_install_db--user=mysql--basedir=/usr/local/mysql/--datadir=/data/mysqldb/InstallingMySQLsystemtables...2016-09-0617:29:160[Warning]TIMESTAMPwithimplicit
- ASP.NET Core 项目 - 汽车租赁系统教程
齐游菊Rosemary
ASP.NETCore项目-汽车租赁系统教程项目地址:https://gitcode.com/gh_mirrors/as/ASP.NET-Core-Project-Car-Renting-System1、项目介绍ASP.NETCore项目-汽车租赁系统是一个基于ASP.NETCore框架的开源项目,旨在提供一个完整的汽车租赁管理系统。该项目包含了用户管理、车辆管理、租赁订单管理等功能模块,适用于中
- 使用agent搭建一个简易的ai论文写作程序
喂喂喂喂位
langChain手搓AIAgent记录人工智能langchain深度学习pythonAIGC
本程序能够自动化完成从规划、研究、撰写到修改的整个论文创作流程。基于LangGraph和LangChain框架构建,利用大型语言模型和搜索工具协同工作,形成了一个完整的论文写作流水线。核心功能分析计划生成功能(plan_node)这个node将接收状态,然后创建一个消息列表。其中一个将是PLAN_PROMPT,那将是SystemMessage。然后创建HumanMessage,传入我们要做的tas
- Fatal Python error: initfsencoding: unable to load the file system codec
珞珈山小裁缝11-8
python
FatalPythonerror:initfsencoding:unabletoloadthefilesystemcodecModuleNotFoundError:Nomodulenamed'encodings'Currentthread0x00007668(mostrecentcallfirst):问题原因:python路径错误我是直接运行exe程序(几乎没有配置python环境),我的pyth
- PyCharm报错—Fatal Python error : unable to load the file system codec
萧念莳
日常问题集锦pycharm
报错窗口如下:找了很多方法,发现只有这个可以,帮大家避雷!第一步:第二步:选择你最新安装的可用的python.exe所在路径最后就可以看到可以正常运行啦!
- TCPClient和TCPListen
呆呆敲代码的小Z
c#
TCPClientusingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSyst
- 物联网开发-jetlinks 开发协议包时引入dom4j提示 clasnotfound
lynn-66
jar物联网springcloudmaven
在开发协议jar包时需要解析xml,但是工程引入jetlinks-core包,这个包又引用了dom4j-1.6.1.jar,所以pom就没有配dom4j,编译不报错。本地main和测试方法都正常。但是包在项目中运行时,提示ClassNotFound.检查了工程Libraries,里面有dom4j的包。打印了System.getProperty("java.class.path")发现里面没有dom
- java list遍历添加元素_Java List集合方法及遍历过程代码解析
清净平常心
javalist遍历添加元素
集合元素框架publicclassListDemo02{publicstaticvoidmain(String[]args){//创建集合对象Listlist=newArrayList();//添加元素list.add("hello");list.add("world");list.add("java");//输出集合对象System.out.println(list);//[hello,worl
- 华为路由器配置DHCP服务以及配置端口网关IP
百里清风20190301
华为tcp/ip网络协议
实验拓扑结构:前提:HTTP服务器已启动http服务和配置好ip地址,client1与client2已配置不同网段的IP,路由器两端接口已预设IP实验需求:除平板服务器外,电脑自动获取IP配置子网掩码和DNS域名解析服务并且能实现全网通信步骤一:为两个不同的广播域配置网关IPsystem-view#进入系统视图[Huawei]interfaceg0/0/0#进入系统视图[Huawei-Gigabi
- uniCloud 外部系统联登 注册功能 C# 完整示例
易天法地
c#开发语言uniappunicloud
APP端this.$http.post(`/uniCloudRegister`,{clientInfo:JSON.stringify(uni.getSystemInfoSync())}).then(res=>{uni.stopPullDownRefresh()uni.hideNavigationBarLoading()console.info(res)}).catch(err=>{console.
- ROS中的三维占用网格地图与八叉树地图详尽解析
YRr YRr
ros地图
ROS中的三维占用网格地图与八叉树地图详尽解析在机器人自主导航与环境感知领域,地图构建与表示是核心技术之一。不同的三维地图表示方法在精度、效率、存储需求等方面各有优劣,直接影响机器人在复杂环境中的表现。本文将以ROS(RobotOperatingSystem,机器人操作系统)为背景,深入探讨两种常用的三维地图表示方法——三维占用网格地图(OccupancyGridMap,简称OGM)和八叉树地图(
- 全局路径规划器:full_coverage_path_planner完全指南
段钰忻
全局路径规划器:full_coverage_path_planner完全指南项目地址:https://gitcode.com/gh_mirrors/fu/full_coverage_path_planner项目介绍full_coverage_path_planner是一个在ROS(RobotOperatingSystem)环境下开发的开源全局路径规划算法实现,旨在提供全面覆盖的路径规划解决方案。该
- 《Operating System Concepts》阅读笔记:p309-p330
操作系统
《OperatingSystemConcepts》学习第29天,p309-p330总结,总计22页。一、技术总结1.Python中的并发编程(1)semaphoreclassthreading.Semaphore(value=1)。(2)conditionvariableclassthreading.Condition(lock=None)书上使用的是Java,因本人在开发工作中使用的是Pytho
- 鸿蒙HarmonyOS NEXT开发:自定义事件拦截(ArkTS组件事件)
「已注销」
鸿蒙ArkTSharmonyos华为鸿蒙android驱动开发
为组件提供自定义的事件拦截能力,开发者可根据事件在控件上按下时发生的位置,输入源等事件信息决定控件上的HitTestMode属性。说明:从APIVersion12开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。onTouchInterceptonTouchIntercept(callback:Callback)系统能力:SystemCapability.ArkUI.ArkUI
- 知识点专项整理
健忘的鱼
androidandroidstudiojava
跨进程通讯(IPC)参考Android通信机制消息队列:基于SystemV和Posix系统优点异步,解耦,缓冲,缺点:比信号和管道更加重,队列数据有上限(一般16KB)Android中代表handler,但handlerr只是进程内的通信方式:由消息轮询器(Looper)、消息队列(MessageQueue)、消息处理器(Handler)三部分组成,轮询器通过prepare()初始化消息队列,处理
- Uniapp当中的scroll-view滚动条不出现或者触底刷新事件不触发
堕落年代
uniappuni-app
一、未正确设置容器高度问题描述scroll-view未设置明确高度或高度值无效,导致无法形成有效滚动区域。解决方案•使用行内样式直接设置height(如style="height:500rpx;"),避免类名样式被覆盖。•动态计算高度(例如通过uni.getSystemInfoSync()获取屏幕剩余高度)。二、滚动条样式被覆盖或隐藏问题描述•默认滚动条被全局CSS样式(如::-webkit-sc
- OCS2 是一个针对切换系统最优控制(OCS2)的 C++工具箱
十年一梦实验室
c++开发语言
https://github.com/leggedrobotics/ocs2我将详细介绍位于https://github.com/leggedrobotics/ocs2的OCS2项目,这是一个由leggedrobotics团队开发并维护的开源软件库,专注于开关系统的最优控制(OptimalControlforSwitchedSystems)。以下是对其背景、功能、特点、应用场景及使用方法的全面说明
- HarmonyOS NEXT 使用AppStorageV2实现全屏展示
架构教育
在鸿蒙原生开发中,为了实现沉浸式效果,通常在页面中通过设置expandSafeArea属性向顶部和底部扩展安全区实现沉浸式效果,.expandSafeArea([SafeAreaType.SYSTEM],[SafeAreaEdge.TOP,SafeAreaEdge.BOTTOM]);设置完成后,发现没有实现想要的效果,就需要点击ArkUIInspector查看当前展示试图层级中,哪些试图没有实现沉
- HarmonyOS NEXT 添加地理围栏
架构教育
添加一个围栏,并订阅地理围栏事件,地理围栏就是虚拟地理边界,当设备进入、离开某个特定地理区域时,可以接收自动通知和警告目前仅支持圆形围栏,并且依赖GNSS芯片的地理围栏功能,仅在室外开阔区域才能准确识别用户进出围栏事件geofence:geoLocationManager.Geofence中的coordinateSystemType表示地理围栏圆心坐标的坐标系,APP应先使用getGeofence
- 基于k3s部署Nginx、MySQL、SpringBoot和Redis的详细教程
1.安装k3s集群1.1单节点快速部署#使用root或sudo权限执行curl-sfLhttps://get.k3s.io|sh-#验证安装sudokubectlgetnodes#输出应为Ready状态sudosystemctlstatusk3s1.2配置kubectl权限(可选)mkdir-p~/.kubesudocp/etc/rancher/k3s/k3s.yaml~/.kube/config
- docker启动报错:Job for docker. service failed because the control process exited with error code
奇怪的大象
javadocker容器运维intellij-ideajava
1、在使用systemctlstartdocker时,一直报错,如下图。试了网上的方法:**a、修改docker.service文件;b、在daemon.json中增加代码,**都不能解决我遇到的情况。2、经过不懈努力,终于找到办法。在/etc/docker文件目录下,找到daemon.json,这个文件是我们在安装时创建的,如果没有的话,使用mkdir/etc/docker&&touchdaem
- BigDecimal只覆盖整数部分或小数部分
支持未来
java算法开发语言
有个特殊处理需要把BigDecimal的整数部分和小数部分分开计算publicclassBdTest{publicstaticvoidmain(String[]args){BdBeanbt=newBdBean();bt.setBdA(4);System.out.println(bt.getB());bt.setBdA(0);System.out.println(bt.getB());bt.setB
- pipenv install -r requirements.txt
总是幸福的老豌豆
日常工作总结python
前言最近部署python项目时本地通过虚拟环境进行运行项目报错:错误如下PSC:\Users\Administrator\Desktop\desktop_health_sdk\desktop_health_sdk>pipenvinstall-rrequirements.txtWarning:Python2.7wasnotfoundonyoursystem..
- 什么是yocto(理清yocto poky openembedded bitbake间关系)
口袋物联
TIAM62x平台从入门到精通系列yoctoyoctopokybitbakeopenembedded
一基本概念TheYoctoProjectisanopen-sourceprojectthatdeliversasetoftoolsthatcreateoperatingsystemimagesforembeddedLinuxsystems.PokyisthereferenceoperatingsystemdistributionbuiltwithYoctoProjecttools,andOpenE
- Docker拉取镜像 - 代理
纳兰雨天
docker容器代理模式
docker配置代理创建或编辑Docker配置文件sudomkdir-p/etc/systemd/system/docker.service.dsudonano/etc/systemd/system/docker.service.d/http-proxy.conf在文件中添加代理配置:[Service]Environment="HTTP_PROXY=127.0.0.1:7897"Environme
- linux系统的加固,防火墙,弱口令的梳理
weixin_43806846
安全加固
防火墙开启防火墙:systemctlstartfirewalldsystemctlenablefirewalld弱口令opensslrand-base648>/root/.passwd#生成随机密码,保存至/root/.passwd,保存好root密码后,可以删除此文件cat/root/.passwd|passwdroot--stdin#更改root密码禁止root账号远程登录系统,并修改ssh默
- VSCode SSHFS 扩展使用教程
史跃骏Erika
VSCodeSSHFS扩展使用教程vscode-sshfsExtensionforVisualStudioCode:FilesystemproviderusingSSH项目地址:https://gitcode.com/gh_mirrors/vs/vscode-sshfs1.项目介绍VSCodeSSHFS是一个用于VisualStudioCode的扩展,允许用户通过SSH协议将远程文件系统挂载为本地
- ROS机器人边缘计算:EdgeComputing与ROS
AI天才研究院
计算AI大模型应用入门实战与进阶大数据人工智能语言模型AILLMJavaPython架构设计AgentRPA计算AI大模型应用
1.背景介绍1.1机器人操作系统(ROS)机器人操作系统(RobotOperatingSystem,简称ROS)是一个用于机器人软件开发的灵活框架。它提供了一系列工具、库和约定,使得创建复杂且健壮的机器人应用变得更加容易。ROS的核心是一个消息传递系统,它允许不同的软件模块(称为节点)之间进行通信。这种模块化设计使得开发人员可以更容易地重用和共享代码,从而加速了机器人软件的开发过程。1.2边缘计算
- python执行bash命令
weixin_44594953
pythonPythonos.systembash命令脚本执行参数传递
1、执行bash命令importosos.system('ls-al')2、执行bash脚本os.system('sh./test.sh')3、脚本中带参数arg1='111'arg2='222'os.system('sh./test.sh'+arg1+''+arg2)//参数前后要有空格
- 插入表主键冲突做更新
a-john
有以下场景:
用户下了一个订单,订单内的内容较多,且来自多表,首次下单的时候,内容可能会不全(部分内容不是必须,出现有些表根本就没有没有该订单的值)。在以后更改订单时,有些内容会更改,有些内容会新增。
问题:
如果在sql语句中执行update操作,在没有数据的表中会出错。如果在逻辑代码中先做查询,查询结果有做更新,没有做插入,这样会将代码复杂化。
解决:
mysql中提供了一个sql语
- Android xml资源文件中@、@android:type、@*、?、@+含义和区别
Cb123456
@+@?@*
一.@代表引用资源
1.引用自定义资源。格式:@[package:]type/name
android:text="@string/hello"
2.引用系统资源。格式:@android:type/name
android:textColor="@android:color/opaque_red"
- 数据结构的基本介绍
天子之骄
数据结构散列表树、图线性结构价格标签
数据结构的基本介绍
数据结构就是数据的组织形式,用一种提前设计好的框架去存取数据,以便更方便,高效的对数据进行增删查改。正确选择合适的数据结构,对软件程序的高效执行的影响作用不亚于算法的设计。此外,在计算机系统中数据结构的作用也是非同小可。例如常常在编程语言中听到的栈,堆等,就是经典的数据结构。
经典的数据结构大致如下:
一:线性数据结构
(1):列表
a
- 通过二维码开放平台的API快速生成二维码
一炮送你回车库
api
现在很多网站都有通过扫二维码用手机连接的功能,联图网(http://www.liantu.com/pingtai/)的二维码开放平台开放了一个生成二维码图片的Api,挺方便使用的。闲着无聊,写了个前台快速生成二维码的方法。
html代码如下:(二维码将生成在这div下)
? 1
&nbs
- ImageIO读取一张图片改变大小
3213213333332132
javaIOimageBufferedImage
package com.demo;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
/**
* @Description 读取一张图片改变大小
* @author FuJianyon
- myeclipse集成svn(一针见血)
7454103
eclipseSVNMyEclipse
&n
- 装箱与拆箱----autoboxing和unboxing
darkranger
J2SE
4.2 自动装箱和拆箱
基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为您打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。
4.2.1 autoboxing和unboxing
在Java中,所有要处理的东西几乎都是对象(Object)
- ajax传统的方式制作ajax
aijuans
Ajax
//这是前台的代码
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <% String path = request.getContextPath(); String basePath = request.getScheme()+
- 只用jre的eclipse是怎么编译java源文件的?
avords
javaeclipsejdktomcat
eclipse只需要jre就可以运行开发java程序了,也能自动 编译java源代码,但是jre不是java的运行环境么,难道jre中也带有编译工具? 还是eclipse自己实现的?谁能给解释一下呢问题补充:假设系统中没有安装jdk or jre,只在eclipse的目录中有一个jre,那么eclipse会采用该jre,问题是eclipse照样可以编译java源文件,为什么呢?
&nb
- 前端模块化
bee1314
模块化
背景: 前端JavaScript模块化,其实已经不是什么新鲜事了。但是很多的项目还没有真正的使用起来,还处于刀耕火种的野蛮生长阶段。 JavaScript一直缺乏有效的包管理机制,造成了大量的全局变量,大量的方法冲突。我们多么渴望有天能像Java(import),Python (import),Ruby(require)那样写代码。在没有包管理机制的年代,我们是怎么避免所
- 处理百万级以上的数据处理
bijian1013
oraclesql数据库大数据查询
一.处理百万级以上的数据提高查询速度的方法: 1.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 o
- mac 卸载 java 1.7 或更高版本
征客丶
javaOS
卸载 java 1.7 或更高
sudo rm -rf /Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
成功执行此命令后,还可以执行 java 与 javac 命令
sudo rm -rf /Library/PreferencePanes/JavaControlPanel.prefPane
成功执行此命令后,还可以执行 java
- 【Spark六十一】Spark Streaming结合Flume、Kafka进行日志分析
bit1129
Stream
第一步,Flume和Kakfa对接,Flume抓取日志,写到Kafka中
第二部,Spark Streaming读取Kafka中的数据,进行实时分析
本文首先使用Kakfa自带的消息处理(脚本)来获取消息,走通Flume和Kafka的对接 1. Flume配置
1. 下载Flume和Kafka集成的插件,下载地址:https://github.com/beyondj2ee/f
- Erlang vs TNSDL
bookjovi
erlang
TNSDL是Nokia内部用于开发电信交换软件的私有语言,是在SDL语言的基础上加以修改而成,TNSDL需翻译成C语言得以编译执行,TNSDL语言中实现了异步并行的特点,当然要完整实现异步并行还需要运行时动态库的支持,异步并行类似于Erlang的process(轻量级进程),TNSDL中则称之为hand,Erlang是基于vm(beam)开发,
- 非常希望有一个预防疲劳的java软件, 预防过劳死和眼睛疲劳,大家一起努力搞一个
ljy325
企业应用
非常希望有一个预防疲劳的java软件,我看新闻和网站,国防科技大学的科学家累死了,太疲劳,老是加班,不休息,经常吃药,吃药根本就没用,根本原因是疲劳过度。我以前做java,那会公司垃圾,老想赶快学习到东西跳槽离开,搞得超负荷,不明理。深圳做软件开发经常累死人,总有不明理的人,有个软件提醒限制很好,可以挽救很多人的生命。
相关新闻:
(1)IT行业成五大疾病重灾区:过劳死平均37.9岁
- 读《研磨设计模式》-代码笔记-原型模式
bylijinnan
java设计模式
声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/
/**
* Effective Java 建议使用copy constructor or copy factory来代替clone()方法:
* 1.public Product copy(Product p){}
* 2.publi
- 配置管理---svn工具之权限配置
chenyu19891124
SVN
今天花了大半天的功夫,终于弄懂svn权限配置。下面是今天收获的战绩。
安装完svn后就是在svn中建立版本库,比如我本地的是版本库路径是C:\Repositories\pepos。pepos是我的版本库。在pepos的目录结构
pepos
component
webapps
在conf里面的auth里赋予的权限配置为
[groups]
- 浅谈程序员的数学修养
comsci
设计模式编程算法面试招聘
浅谈程序员的数学修养
- 批量执行 bulk collect与forall用法
daizj
oraclesqlbulk collectforall
BULK COLLECT 子句会批量检索结果,即一次性将结果集绑定到一个集合变量中,并从SQL引擎发送到PL/SQL引擎。通常可以在SELECT INTO、
FETCH INTO以及RETURNING INTO子句中使用BULK COLLECT。本文将逐一描述BULK COLLECT在这几种情形下的用法。
有关FORALL语句的用法请参考:批量SQL之 F
- Linux下使用rsync最快速删除海量文件的方法
dongwei_6688
OS
1、先安装rsync:yum install rsync
2、建立一个空的文件夹:mkdir /tmp/test
3、用rsync删除目标目录:rsync --delete-before -a -H -v --progress --stats /tmp/test/ log/这样我们要删除的log目录就会被清空了,删除的速度会非常快。rsync实际上用的是替换原理,处理数十万个文件也是秒删。
- Yii CModel中rules验证规格
dcj3sjt126com
rulesyiivalidate
Yii cValidator主要用法分析:
yii验证rulesit 分类: Yii yii的rules验证 cValidator主要属性 attributes ,builtInValidators,enableClientValidation,message,on,safe,skipOnError
 
- 基于vagrant的redis主从实验
dcj3sjt126com
vagrant
平台: Mac
工具: Vagrant
系统: Centos6.5
实验目的: Redis主从
实现思路
制作一个基于sentos6.5, 已经安装好reids的box, 添加一个脚本配置从机, 然后作为后面主机从机的基础box
制作sentos6.5+redis的box
mkdir vagrant_redis
cd vagrant_
- Memcached(二)、Centos安装Memcached服务器
frank1234
centosmemcached
一、安装gcc
rpm和yum安装memcached服务器连接没有找到,所以我使用的是make的方式安装,由于make依赖于gcc,所以要先安装gcc
开始安装,命令如下,[color=red][b]顺序一定不能出错[/b][/color]:
建议可以先切换到root用户,不然可能会遇到权限问题:su root 输入密码......
rpm -ivh kernel-head
- Remove Duplicates from Sorted List
hcx2013
remove
Given a sorted linked list, delete all duplicates such that each element appear only once.
For example,Given 1->1->2, return 1->2.Given 1->1->2->3->3, return&
- Spring4新特性——JSR310日期时间API的支持
jinnianshilongnian
spring4
Spring4新特性——泛型限定式依赖注入
Spring4新特性——核心容器的其他改进
Spring4新特性——Web开发的增强
Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC
Spring4新特性——Groovy Bean定义DSL
Spring4新特性——更好的Java泛型操作API
Spring4新
- 浅谈enum与单例设计模式
247687009
java单例
在JDK1.5之前的单例实现方式有两种(懒汉式和饿汉式并无设计上的区别故看做一种),两者同是私有构
造器,导出静态成员变量,以便调用者访问。
第一种
package singleton;
public class Singleton {
//导出全局成员
public final static Singleton INSTANCE = new S
- 使用switch条件语句需要注意的几点
openwrt
cbreakswitch
1. 当满足条件的case中没有break,程序将依次执行其后的每种条件(包括default)直到遇到break跳出
int main()
{
int n = 1;
switch(n) {
case 1:
printf("--1--\n");
default:
printf("defa
- 配置Spring Mybatis JUnit测试环境的应用上下文
schnell18
springmybatisJUnit
Spring-test模块中的应用上下文和web及spring boot的有很大差异。主要试下来差异有:
单元测试的app context不支持从外部properties文件注入属性
@Value注解不能解析带通配符的路径字符串
解决第一个问题可以配置一个PropertyPlaceholderConfigurer的bean。
第二个问题的具体实例是:
 
- Java 定时任务总结一
tuoni
javaspringtimerquartztimertask
Java定时任务总结 一.从技术上分类大概分为以下三种方式: 1.Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务; 说明: java.util.Timer定时器,实际上是个线程,定时执行TimerTask类 &
- 一种防止用户生成内容站点出现商业广告以及非法有害等垃圾信息的方法
yangshangchuan
rank相似度计算文本相似度词袋模型余弦相似度
本文描述了一种在ITEYE博客频道上面出现的新型的商业广告形式及其应对方法,对于其他的用户生成内容站点类型也具有同样的适用性。
最近在ITEYE博客频道上面出现了一种新型的商业广告形式,方法如下:
1、注册多个账号(一般10个以上)。
2、从多个账号中选择一个账号,发表1-2篇博文