CodingMan

新博客: www.veryitman.com
私信 关注
veryitman
码龄10年

上善若水

  • 1,381,111
    被访问量
  • 301
    原创文章
  • 1,924
    作者排名
  • 420
    粉丝数量
  • 于 2010-10-26 加入CSDN
获得成就
  • 获得1,362次点赞
  • 内容获得533次评论
  • 获得267次收藏
荣誉勋章
兴趣领域
  • #后端
    #分布式#Python#架构#MySQL#Linux#Redis#Spring Boot#C/C++#Java#Elasticsearch#Spring#Go/GoLang
TA的专栏
  • 微服务
    24篇
  • C/C++
    21篇
  • iOS
    29篇
  • Android 技术笔记
    49篇
  • Refactoring/Pattern
    5篇
  • Android packages/app
    5篇
  • Android 系统专题
    15篇
  • Android View/UI
    26篇
  • OpenSource
    6篇
  • React/React-Native
    4篇
  • Algorithm
    7篇
  • Mac OSX
    12篇
  • linux/ubuntu
    20篇
  • Cocos2d-iphone
    2篇
  • JavaSE
    48篇
  • DB
    15篇
  • WEB
    7篇
  • 7上8下
    21篇
  • FAQ
    24篇
  • 最近
  • 文章
  • 资源
  • 问答
  • 课程
  • 帖子
  • 收藏
  • 关注/订阅

微服务: Token 相关的重构

简介在上一篇 微服务-Token的处理 中,写了一个 MSAuthTokenUtil 类,用来生成、刷新、校验 token,该类的方法都是 static 的。后续想了一下,还是将其改为普通的组件较好,在最新代码中对其做了两个较大的重构。重构为组件将其改名为 MSAuthTokenHelper,并将其中的所有 static 方法改为实例方法,用注解 @Component 修饰。@Slf4j@Componentpublic class MSAuthTokenHelper { ///....
原创
34阅读
1评论
0点赞
发布博客于 2 月前

微服务: 集成 JWT

简介在 Win10-安装-Redis 和 微服务-SpringBoot-集成-Redis 分别介绍了如何安装和使用 Redis,今天继续结合 Redis,聊聊 token 授权登录的事情。今天聊的主角是 JWT,聊完 JWT 之后再结合实例实现用户 token 登录。JWT 介绍JWT,JSON Web Token 的缩写,基于 RFC 7519 标准。下面内容来自 jwd.io,如下:JSON Web Tokens are an open, industry standard RFC 7519
原创
54阅读
0评论
0点赞
发布博客于 2 月前

微服务: SpringBoot 集成 Redis

简介忙碌了一周,感觉只有此刻写文字的时间才是最惬意的。最近工作比较忙,文章更新的较慢还望大家多多见谅????‍!在阅读下面的内容之前,希望你已经安装并且做好了学习 Spring Boot 集成 Redis 的准备了。如果你还没有搭建 Redis 环境,Win10-安装-Redis 这篇文章或许可以帮到您。在 Spring Boot 1.x 版本中默认的 Redis 客户端是 Jedis 实现的,Spring Boot 2.x 版本中默认客户端是用 Lettuce 实现的。可以从加入的依赖包中看出,S
原创
50阅读
0评论
0点赞
发布博客于 3 月前

Windows 10 安装 Redis

简介关于微服务相关的分享,我都是在 Windows 10 系统下实践的,所以跟 Spring Boot 配套的软件也是在此系统上面安装的。今天跟大家介绍一下如何在 Win10 下安装 Redis,该篇是 Spring Boot 使用 Redis 的处女篇,下篇结合之前登录场景举例如何在 Spring Boot 中使用 Redis。往期 Win10 下面安装 MySQL 的文章:MySQL8-0-15在Win10上的折腾记 推荐给有需要的伙伴。安装 RedisStep1:下载下载 Windows
原创
687阅读
0评论
0点赞
发布博客于 3 月前

微服务: 多 Module 管理工程

简介在 微服务-想办法让项目运行起来 这篇文章中,介绍了如何使用 IDEA 开发工具搭建本地的微服务开发环境,通常我们会把一个微服务项目分解成多个服务,那么为了更好的管理该项目,大家一般都会在 IDE 里面通过多 Module 来进行管理。这里的多 Module 可以理解为多个 SpringBoot 项目。近期收到一些小伙伴的反馈,在使用 IDEA 搭建多 Module 的时候总会遇到一些莫名其妙的问题,甚是让人烦恼。趁此机会给大家介绍一下。下面的实践,使用的是 IntelliJ IDEA 2020.
原创
187阅读
0评论
0点赞
发布博客于 6 月前

微服务: ConfigurationProperties配置

简介我们在开发的时候,可能会遇到这样的场景:变量希望能够被在配置文件中动态配置,只要修改这些配置,对应的 Java 类对象的变量值就可以改变,从而改变代码的行为。这样我们通过修改配置就可以满足业务诉求,而不需要修改一行代码。在 SpringBoot 中,可以通过 @ConfigurationProperties 和 @Values 两个注解配合 properties 文件达到上述目的。比如我的 application.properties 文件配置如下:# ------------------
原创
211阅读
0评论
0点赞
发布博客于 7 月前

ngrok 让服务近在咫尺

简介最近在和一个第三方服务做联调,即我方服务调用第三方的服务 API-A,然后第三方把结果回调给我方服务 API-B,因为我是在本地搭建的 SpringBoot 服务,又涉及到频繁的改动,所以就没有部署到远程服务器上面。API-A 回调到 API-B 需要我方服务能被外网访问,如是我就使用了 ngrok 这个工具进行了内网穿透,让第三方服务很容易的就访问到我的本地服务。所谓的内网穿透,也即 NAT 穿透,进行 NAT 穿透是为了使具有某一个特定源 IP 地址和源端口号的数据包不被 NAT 设备屏蔽而
原创
142阅读
0评论
1点赞
发布博客于 7 月前

微服务-Android客户端: 实现注册和登录

简介在 微服务项目系列文章 中跟大家一起学习了如何搭建、部署(本机和远程部署、热部署、Nginx等)、运行一个 SpringBoot 服务以及 MySQL 数据库的操作、文档(Swagger)的生成等操作,客户端采用浏览器的方式实现了用户注册、登录的流程。根据 微服务-立志做个伟大的项目 立下的【誓言】可以循序渐进的实现我们伟大的理想了,今天我们正式进入 Android 客户端的学习,希望对微服务、Android 开发感兴趣的同学有点帮助。如果你对 Android 不了解,建议先学习 Google 官网
原创
381阅读
0评论
1点赞
发布博客于 8 月前

微服务: 配置Nginx反向代理

原文 微服务: 配置Nginx反向代理,CSDN同步发布。转载请注明出处,谢谢!简介本来是一件很小的事情,但我觉得还是很有必要跟大家分享一下,勿以善小而不为。事情是这样的…有个小伙伴告诉我说自己想学习一下 SpringBoot 结合 Nginx,毕竟用了 Tomcat 那么久(启动 SpringBoot 项目会自动启动 Tomcat)也是时候玩玩 Nginx 了。这个想法很赞,去探索和了解自己没有学过的东西本来就是一种进步。他说按照网上教程配置了一下 Nginx,但是通过配置的方式访问 Ng.
原创
871阅读
0评论
0点赞
发布博客于 9 月前

微服务: Admin与服务监测和管理

原文 微服务: Admin与服务监测和管理,CSDN同步发布。转载请注明出处,谢谢!简介Spring Boot Admin 并不是 Spring Boot 官方出品的,开源地址 SpringBoot Admin,伴随着 SpringBoot 的更新,Spring Boot Admin 也做了相对应的更新。Spring Boot 推出 2.X 版本时,Spring Boot Admin 也及时进行了更新。本篇使用的就是 Spring Boot Admin 2.2.1版本,最新版本是 2.2.2。 S.
原创
320阅读
0评论
0点赞
发布博客于 10 月前

微服务: Actuator实现服务监测

简介SpringBoot Actuator 可以帮助我们监控 SpringBoot 应用的运行情况,服务上线后如何监控和管理自己的服务是我们要考虑的一个重要问题。Actuator 是 SpringBoot 的一个附加组件(需要自己手动集成),Actuator 能帮助应用程序实现在各个环境运行时的监控。可以使用 HTTP 的各个请求路径来进行健康检查、审计、收集引用的运行情况,对于应用状态、内存...
原创
499阅读
0评论
0点赞
发布博客于 10 月前

微服务: 结合MySQL实现登录注册

简介继 MySQL8.0.15在Win10上的折腾记 和 微服务: MySQL基本操作 后,由于个人原因没能继续创作,从今天开始补上,继续前进????。本篇是 微服务系列 的第 N 篇,本篇结合 MySQL 和 SpringBoot 实现用户登录注册,算是一个小实战也是对之前知识点的一个小结。在阅读本篇内容之前,需要大家做好如下几件事情:在本机安装了 MySQL,并且可以正常使用;如果你用的是...
原创
433阅读
0评论
0点赞
发布博客于 10 月前

聊聊 WAV

如果要解码 WAV 文件, 首先需要了解一下 WAV 音频文件的格式.今天说的是 线性 PCM 对应的 WAV 数据的格式以及如何在 iOS 上面使用 faad2 进行解码和播放改格式的音频数据。PCM 的种类线性化 PCMA 律量化的 PCMU 律量化的 PCMAD PCMGSMWAV 简介WAV 只是该音频文件的后缀名,其完整名称缩写是 WAVE.WAVE(Wave...
原创
341阅读
1评论
0点赞
发布博客于 1 年前

OpenSSL: RSA分段解密实战

原文 OpenSSL: 实战-RSA分段解密,CSDN同步发布。转载请注明出处,谢谢!简介本篇是继 OpenSSL: 简单易上手的RSA加解密 后的补充篇,实战篇。在实际项目中,并没有像上篇文章写的那么简单,实际情况要复杂的多。万变不离其宗,抽丝剥茧,复杂事务的背后一定是有其本质原因和原理的存在,而我们就是挖掘原理,探索本质的福尔摩斯。今天这篇文章,带领大家参与到实际项目中运用RSA...
原创
668阅读
0评论
1点赞
发布博客于 1 年前

OpenSSL: 简单易上手的RSA加解密

原文 OpenSSL: 简单易上手的RSA加解密,CSDN同步发布。转载请注明出处,谢谢!简介这篇文章是继 OpenSSL: 用VS2017创建C工程、OpenSSL: 完成VS2017的配置 两篇文章的第3篇,前两篇分别跟大家分享了如何在 visual studio2017 中创建C工程,配置OpenSSL的开发环境以及使用 openssl 开源库实现base64的编解码。本篇跟大家...
原创
304阅读
0评论
1点赞
发布博客于 1 年前

OpenSSL: 完成VS2017的配置

原文 OpenSSL: 完成VS2017的配置,CSDN同步发布。转载请注明出处,谢谢!简介在 OpenSSL: 用VS2017创建C工程 中跟大家分享了如何在 Visual Studio 2017 中创建 C 工程和注意事项以及遇到问题的解决方案,今天我们开始在 Visual Studio 2017 中搭建 OpenSSL 的开发环境。很多人在配置 OpenSSL 环境中遇到了不少...
原创
402阅读
3评论
2点赞
发布博客于 2 年前

微服务: MySQL基本操作

原文 微服务: MySQL基本操作,CSDN同步发布。转载请注明出处,谢谢!简介本篇是 微服务系列 的第 N 篇,从本篇开始我们就要接触和学习数据库相关的知识了。数据库我们选择 MySQL 数据库,免费且资料多,大部分公司都会使用该数据库。我是在 Windows 10 上面搭建的微服务开发环境,同理,MySQL 数据库也是在这个系统上面安装的并且使用的是 MySQL8.0 版本,如果你...
原创
571阅读
0评论
0点赞
发布博客于 2 年前

聊聊短地址及其原理

原文 短地址原理,CSDN同步发布。转载请注明出处,谢谢!简介一个同事遇到一个问题,他说受限于第三方的服务,自己请求所带过去的字符串因为太长,无法从第三方服务获取信息,很是苦恼????。后来我们商量了一下,最终借鉴短地址的思想解决了问题。道理很简单,因为我们请求中的附加字符串信息第三方服务只是透传回来给我们,我们只需要把这些附加信息进行字符压缩就可以了,这样请求带过去的字符串长度就满足了要求????...
原创
413阅读
0评论
1点赞
发布博客于 2 年前

OpenSSL: 用VS2017创建C工程

原文 OpenSSL: 用VS2017创建C工程,CSDN同步发布。转载请注明出处,谢谢!简介该系列文章给大家(主要是刚接触Visual Studio工具的C开发者)带来使用开发工具Visual Studio 2017进行OpenSSL编程,包括base64,AES、DES和RSA加解密等内容。对于C/C++的编程,我工作之后基本都是在Linux上面写,很少在Windows上面耕耘。最...
原创
375阅读
0评论
1点赞
发布博客于 2 年前

在Win10上折腾MySQL8.0.15

原文 MySQL8.0.15在Win10上的折腾记,CSDN同步发布。转载请注明出处,谢谢!安装和配置MySQL我在Windows 10上面使用 MySQL Instller 安装的MySQL8.0.15,安装完成后,启动MySQL遇到了不少问题,特此记录踩坑记。只要你的网络稳定,按照默认安装整个安装过程还算比较顺利。安装过程中需要设置密码,我设置的账号和密码都是 root,所以下面的...
原创
399阅读
0评论
0点赞
发布博客于 2 年前

微服务: 部署服务

原文 微服务: 部署服务,CSDN同步发布。转载请注明出处,谢谢!简介在 微服务系列 文章中,跟大家从环境搭建、Web工程创建、提供Restful接口、热部署、Git使用以及Swagger生成文档分享了SpringBoot的入门知识。今天继续分享如何使用IDEA和maven对工程进行打包操作,然后发布代码到服务器进行部署的过程。大家有任何问题,或者文中有不正确的地方欢迎留言评论,共同进...
原创
438阅读
2评论
0点赞
发布博客于 2 年前

微服务: Swagger生成Markdown文档

原文 Swagger生成Markdown文档,CSDN同步发布。转载请注明出处,谢谢!国庆放假期间,看了一部 2018年上映的电影 《本杰明.巴顿奇事》,豆瓣评分 8.9。影片讲述了一出生便拥有80岁老人形象的本杰明·巴顿,随着岁月的推移逐渐变得年轻,最终回到婴儿形态,并在苍老的恋人黛茜怀中离世的奇异故事。 如果没有看过的小伙伴,推荐大家去看看,里面有很多关于人生的哲理。本次文章封面图来...
原创
3025阅读
1评论
2点赞
发布博客于 2 年前

微服务: Swagger 实现在线文档自动化

原文 微服务: Swagger让你可以多抽一支烟,CSDN同步发布。转载请注明出处,谢谢!简介Swagger,可用于生成、描述、调用和可视化 RESTful 风格接口的API,是一套规范和完整的开发框架,并且能对接口进行单独测试。另外, Swagger 在 Github 上面是开源的。无论对于后端开发,还是前端开发以及测试同事,Swagger 都可以基本满足使用需求。在 Sprin...
原创
570阅读
0评论
0点赞
发布博客于 2 年前

微服务: 写注册和登录的接口

原文 微服务: 简单的用户名注册和登录,CSDN同步发布。转载请注明出处,谢谢!内容概要在本篇中我们要完成一个目标:提供注册、登录的接口给前端或者客户端来使用。涉及到的内容主要有下面几个:1 、SpringBoot 中常用的注解如何使用?2 、如何对接口进行单元测试?其他相关的微服务文章,可以点击 微服务专栏 了解。常用注解控制器 Controller 是 Spring 中最...
原创
2914阅读
0评论
2点赞
发布博客于 2 年前

还有你不知道的Java枚举特性(下篇)

简介这篇是博文 还有你不知道的Java枚举特性(上篇) 的下篇,可以点击下面的链接前往。本篇主要内容:Java 枚举是一个特殊的类,聊聊其方法的重写如何使用接口来组织 Java 枚举?如何使用枚举实现 Java 的单例模式JDK 数据结构中关于枚举的集合 EnumSet 和字典 EnumMap重写枚举的方法所有的枚举类都继承自 Enum,在这个父类当中 toString、equ...
原创
247阅读
0评论
0点赞
发布博客于 2 年前

跳绳的故事

夏天的太阳永远都是那么强劲有力,南方尤为突出。整个地面都冒着热气,像一双无形的双手紧紧地抱着你,马路上反射的光纵然你火眼金金也会心生敬畏。不知道你有没有发现,即使这么热的天,篮球场上还有很多“战士”奋不顾身的拼个你死我活。倒不是他们不怕热不怕累,而是因为他们喜欢这项运动更愿意为了这项运动而付出。讲一个听来的故事~公司将要进行跳绳比赛,各个小组积极备战,需要大家一起努力配合才能把绳跳好。组长...
原创
527阅读
0评论
0点赞
发布博客于 2 年前

还有你不知道的Java枚举特性(上篇)

简介博文 Java 枚举的本质 跟大家一起学习了 Java 语言中枚举到底是什么,探索其本质和原理。用一句话来概括其本质就是:“Java 中的枚举是一个特殊的 Java 类”,有兴趣的同学可以点击了解上面那篇文章。今天跟大家一起学习和总结一下 Java 中的枚举的其他特性和用途,由于内容较多,这次的分享分为两篇文章来写,欢迎大家拍砖、指正和交流!本篇主要内容:Java switch 语句...
原创
219阅读
0评论
0点赞
发布博客于 2 年前

微服务: 学习几个容易混淆的URL注解

原文 微服务: 学习几个容易混淆的URL注解,CSDN同步发布。转载请注明出处,谢谢!了解 URL首先,大家需要知道下面这三个东西的定义:URI,Universal Resource Identifier,统一资源标志符URL,Universal Resource Locator,统一资源定位符URN,Universal Resource Name,统一资源名称在 WWW 上...
原创
441阅读
2评论
2点赞
发布博客于 2 年前

Handler: 更新UI的方法

总是感觉 android 中 UI 更新很让人纠结!自己小结一下,算是抛砖引玉。读这篇文章之前,假设你已经明白线程、Handler 的使用。在文章的最后,附录一张草图,主要用于说明 Handler、Message、MessageQueue、Looper 之间的关系。1. 在 onCreate() 方法中开启线程更新 UIpublic class MasterActivity ex...
原创
44613阅读
40评论
33点赞
发布博客于 2 年前

微服务: 立志做个伟大的项目

原文 微服务: 立志做个伟大的项目,CSDN同步发布。转载请注明出处,谢谢!简介在开篇 微服务: 步步为营 里面我们已经定下一个小目标(以终为始的策略),即使用 Spring Boot 写 API 提供给 iOS、Android 客户端或者网页端来调用。接下来我们开始完成我们这个超级梦想吧!在启航之前,我们还是给这个 App 起个名字吧,该 App 就是给用户展示 Blog 的,所以暂...
原创
345阅读
0评论
2点赞
发布博客于 2 年前

微服务:本地热部署

原文 微服务: 本地热部署,CSDN同步发布。转载请注明出处,谢谢!简介在项目开发中,难免会经常修改代码来验证一些问题,如果每次修改都需要进行重新关闭、启动这样的操作会让人有点不爽,如果能实现代码的热部署就好了。所谓热部署,就是在应用正在运行的时候升级软件,却不需要重新启动应用。通俗来讲,热部署就是在修改代码后,不需要重新启动服务器,就可以加载修改后的代码,看到修改后的效果。对于 ID...
原创
1169阅读
0评论
0点赞
发布博客于 2 年前

吕不韦和嬴政的一次对话

原文 认知,CSDN同步发布。转载请注明出处,谢谢!任何时候都不要轻易的开口说:“这不可能”,就跟在任何情况下都不要轻易说放弃一样重要。在很多场合下,你这么一说不仅暴露了你的学识,而且还会暴露你的心态。特别是程序员,在产品说要实现xxx功能或者UE说要实现yyy效果的时候,很容易用“这个无法实现”这样的语句来“抗拒”需求。我记得有这样一件小事。程序员A说:“这个框架已经限制了,无法实...
原创
573阅读
0评论
0点赞
发布博客于 2 年前

微服务: Git入门

原文 微服务: Git入门,CSDN同步发布。转载请注明出处,谢谢!**代码管理如果你还没有Github账号,赶紧点击 这里 去创建一个,很简单,然后下载 Git GUI 安装即可,如果你还不会这些操作,请行动起来去搜索对应的方法,这里不再赘述。在项目开发过程中,除了写代码之外,还需要对代码进行管理。在说如何管理代码之前,先跟大家分享几个实际开发中关于代码管理的场景。案例1:入门的...
原创
952阅读
0评论
0点赞
发布博客于 2 年前

你有没有遇到叫二狗子的那个哥们?

原文 调侃C中的define,CSDN同步发布。转载请注明出处,谢谢!二狗子二狗子这个名字,在大街小巷,在电视剧中几乎都能听到。我也不知道老一辈的父母为什么这么喜欢给自己的孩子取这样的名字,唯一能让我信服的理由是:顺口!大叔大伯们之所以叫这个名字还有一个理由,之前孩子多,希望孩子像小狗儿一样好喂养。正好我们村有个孩子也叫二狗子,大名叫张力万,无论是叫二狗子还是叫张力万,都指的是同一个人...
原创
480阅读
0评论
0点赞
发布博客于 2 年前

又是一年高考时

原文 回忆高考,CSDN同步发布。转载请注明出处,谢谢!楔子转眼间,我人生中的高考距今已十几年有余了,那时候意气风发,踌躇满志,随时迎接高考的灵魂拷问。幸运的是自己跌跌撞撞的考上了大学,阴差阳错的变成了一名程序猿。今天是2019年高考的第一天,作为一名 “资深” 的程序猿我还是想用编程的方式来记录这一天,算是对学子们的祝福和对自己的高中生活的一点回忆吧。祝所有高考中的学者们都能如愿...
原创
477阅读
0评论
0点赞
发布博客于 2 年前

微服务: 想办法让项目运行起来

原文 微服务: 想办法让项目运行起来,CSDN同步发布。转载请注明出处,谢谢!必备工具最新的 Spring Boot 发布版本是 2.1.4,需要JDK版本最小为8即 JDK8,构建工程的工具 Maven 最小版本为3.3,Gradle 最小版本为4.4,当然了 Maven 和 Gradle 任选一个即可,接下来分享的文章中基本都使用 Maven 来构建工程。1、Spring Boot...
原创
2554阅读
0评论
1点赞
发布博客于 2 年前

微服务: 步步为营

上图是我从 spring.io 首页介绍截图过来的,简洁而不失霸气!最近两年,Spring Boot 伴随着微服务的发展而越发火热,很多公司也纷纷开始使用 Spring Boot 和 Spring Cloud 来开发自己的服务,Java开发的浪潮愈发汹涌。这年头不知道微服务不知道 Spring Boot 就感觉生活缺点什么似的。我们还是抱着学习的心态来学习一下这个时代宠儿吧,不要盲目吹捧就可以...
原创
355阅读
0评论
0点赞
发布博客于 2 年前

C函数中返回字符数组

原文 C函数中返回字符数组,CSDN同步发布。转载请注明出处,谢谢!内容简介在阅读本篇文章之前,建议大家看一下下面2篇文章:不见得你会计算C字符串长度双宿双飞的 malloc 和 free这篇文章主要分享两个点:1、为什么作为局部变量的字符数组不能直接返回,而字符指针却可以?2、当字符数组是局部变量的时候,函数如何返回它?3、字符数组(char [])和字符指针(char...
原创
9420阅读
3评论
13点赞
发布博客于 2 年前

你会计算C字符串长度吗?

原文 不见得你会计算C字符串长度,CSDN同步发布。转载请注明出处,谢谢!C 字符串在 C 语言中,字符串实际上是使用字符 '\0' 终止的一维字符数组。以下几种方式表示的都是 C 字符串的正确表达方式。// 要以 '\0' 结尾char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};// 要以 '\0' 结尾char greet...
原创
2961阅读
0评论
2点赞
发布博客于 2 年前

C语言中free、malloc 等内存管理函数

简介这两个函数是一对好朋友,几乎是形影不离。有 malloc 的地方就应该有 free 的存在。今天跟大家聊聊 malloc 和 free 这对好基友,这两个函数都是对堆内存进行管理的函数,另外还有 calloc、realloc、reallocf、valloc 等堆内存管理函数。void *在进行下面话题之前,我们先回忆一下 void * 是什么?void * 表示未确定类型的指针。C/...
原创
3123阅读
0评论
14点赞
发布博客于 2 年前

C 结构体指针初始化

原文 C 结构体指针初始化,CSDN同步发布。转载请注明出处,谢谢!在使用指针之前,务必要将其初始化。这个是我们最早学习 C 语言的时候,书上经常说的一个问题。在工作中,我们反而会经常忘记这条金科玉律。本篇文章的所有代码都经 gcc-7 编译器编译过。关于在 macOS 中如何安装和使用 gcc,可以参考 GCC: Homebrew 安装 GCC 和 Binutils 这篇文章。结构体成...
原创
4875阅读
0评论
0点赞
发布博客于 2 年前

反向代理

直接戳文章 反向代理阅读。文章内容:1、正向代理、反向代理2、实际例子配置 nginx 作为反向代理服务器
原创
258阅读
0评论
1点赞
发布博客于 2 年前

ReactNative: 不一样的 HelloWorld

如果之前你折腾过 ReactNative, 那么跑起来的效果就是几行文字.今天给大家展示一下在官方 start 的例子基础之上展示不一样的效果.下面跟大家分享如何展示 RN 自带的按钮组件. 后面会陆续给大家分享如何自定义按钮以及如何处理事件的传递等.UI 效果图如下: 其中, 按钮1, 是TouchableOpacity 按钮2, 是TouchableHighlight, 自带按下效果.in
原创
827阅读
0评论
1点赞
发布博客于 5 年前

ReactNative: 结合工程的思考

自从 FB 开源了 ReactNative, 受到大家的追捧. 聊天要是不聊这个东西, 别人会把你当做局外人一样看待.说句实在话, 学习 ReactNative 的成本还是比较大的. 什么 Node.js, JavaScript, ES6,还有一堆的管理和使用工具. 至少你还得懂至少一门平台语言, 否则无法展示你牛逼的才华.如果你想在移动 App 领域长期发展, 那需要学习的东西就更多了.不
原创
700阅读
0评论
1点赞
发布博客于 5 年前

ReactNative: 记录几个常用

距离这篇博客 ReactNative: react-native init 到底做了什么, 已好久没有更新关于 RN 的东西了.前两天有私信问我, 关于如何搭建 RN 开发环境? 进入开发界以来, 我们总是在不断地学习不断地向前发展. 学习新的东西, 总是需要搭建各种各样的开发环境. 搭建环境是锻炼和磨练一个人的开始, 所以,你要有耐心, 要坚持. 遇到困难, 看官方文档, 找 goo
原创
1289阅读
0评论
0点赞
发布博客于 5 年前

iOS UI: UIMenuController | InputView 折腾记

本来 UIMenuController 这个东西挺简单的. 直到… 遇到 InputView, 我就醉了, 程序也崩溃了.这里以 Demo 为主, 来说明问题.实现的效果很简单, 如下图ViewController.m#import "ViewController.h"@interface ViewController ()// 罪魁祸首在这里@property (nonatomic, str
原创
1862阅读
0评论
1点赞
发布博客于 5 年前

iOS 音视频: 让 FFMpeg 支持对 H.264 的编码

很多同学被诸如264之类的术语搞懵逼了. 先大概解释一下. H.264 是视频的一种编码标准(规范), x264 是一个库, 实现了对 H.264 视频格式的编码,但是没有实现解码 H.264 的功能. ffmpeg 是一个框架,实现了对 H.264视频格式的解码功能.换句话说 ffmpeg + x264 就包含了对 H.264 格式的编码、解码的实现。看一个典型的图
原创
2631阅读
0评论
0点赞
发布博客于 5 年前

iOS 音视频: 编译 FFmpeg-3.1.1

今天的主题 为 iOS 编译 FFmpeg3.1.1版本, 并且导入 xcode 工程.环境 1.Mac OS X 10.11.5 2.xcode7.3.1 3.Homebrew 0.9.9 4.FFmpeg3.1.1安装 Homebrew 可以自行到其官网参考安装说明.安装 FFmpeg 需要的编译和依赖 brew install automake fdk-
原创
1467阅读
3评论
1点赞
发布博客于 5 年前

iOS 多线程: dispatch_barrier_async

该篇是 「iOS 多线程」系列的第三篇.前面两篇可以戳击下面的链接.iOS 多线程: 正确认识 GCD 队列类型 iOS多线程: 信号量该系列博客是为了记录和分享自己关于 iOS 多线程的一些认识, 结合工作中遇到的问题, 和大家交流.欢迎拍砖.在这里你可以完整的查看 dispatch_barrier 的文档.关于dispatch_barrier_async, 有这样的描述: Discussi
原创
4308阅读
0评论
0点赞
发布博客于 5 年前

iOS 多线程: 信号量

今天跟大家聊聊关于 GCD 中的信号量的使用.网上有很多关于信号量的介绍, 这里只是结合本人一些理解和实际使用来分享给大家.在GCD中有三个函数是semaphore的操作,分别是 1.创建一个semaphore  dispatch_semaphore_create 2. 发送一个信号  dispatch_semaphore_signal 会使信号量计数增加1. 3
原创
1488阅读
0评论
2点赞
发布博客于 5 年前

iOS AutoLayout: 从 XIB 中加载 UIViewController

在博客 iOS AutoLayout: 关联 Xib 和 UIViewController 讨论了 UIViewController 如何和一个 xib 关联并且展现出来.在那篇博客中, 最后说到使用下面这种方式可以加载 ViewController -(instancetype)initWithNibName:(NSString )nibNameOrNil bundle:(NSBundle
原创
1490阅读
0评论
0点赞
发布博客于 5 年前

iOS AutoLayout: XIB 设置 CALayer 属性

苹果的自动布局这套框架的确是好.但是好的同时, 也给开发者带来了不小的挑战. 刚开始使用的时候, 还不如 Android 的 xml 布局好用, 虽然苹果多了可以拖拽的功能.当你熟练使用后, 你会发现, 还真 TM 有那么回事.之前有朋友私信问我, 平时在 iOS 开发中怎么书写 UI 布局的.这里统一给出答复: 优先 AutoLayout. 其次 Masonry. 纯代码打造.
原创
1637阅读
0评论
1点赞
发布博客于 5 年前

iOS UI 技巧: 视图无法被点击

初学 iOS 开发, 有时候会被一些很简单的问题给弄得头昏脑涨.iOS UI 技巧系列博客, 将和大家一起总结和积累在 iOS 开发中遇到的各种奇葩问题.今天和大家聊聊, 当前设置的视图无法被点击的原因和解决思路.当我们添加一个视图A到另外一个视图B上面, 希望视图B可以被点击或者被 touch.当然, 这个是一个再正常不过的要求.当你一切准备就绪, 发现, 卧槽, B 为什么...
原创
4831阅读
0评论
1点赞
发布博客于 5 年前

iOS AutoLayout: UIView 关联 Xib 不设置 File's Owner

继续上篇iOS AutoLayout: 关联 Xib 和 UIView博客唠叨.新定义一个 UIView 子类, 名字为 Custom2新建 xib 文件, 这里取名为 Custom2.xib看一下视图关系明显没有设置 File owner可以看出, Custom2 这个 View 的 Custom Class 是我们上面定义的 Custom2这个 UIView 的子类.ok, 设置完毕.将视图上面
原创
2568阅读
0评论
1点赞
发布博客于 5 年前

iOS AutoLayout: 关联 Xib 和 UIView

在博客 iOS AutoLayout: 关联 Xib 和 UIViewController 中介绍了 UIViewController 如何关联 xib 文件, 并给组件连线和一些问题.今天继续 Autolayout 的话题. 新建一个 Single View 的 iOS 项目 新建一个 Empty 的 Userinterface View, 取名为 View.xib 新建一
原创
2268阅读
0评论
1点赞
发布博客于 5 年前

iOS AutoLayout: 关联 Xib 和 UIViewController

今天主要跟大家分享两个内容 * UIViewController 如何作为 Xib 的 File’s Owner * Xib 中的组件如何和 UIViewController 连线 创建工程 MZXibAndVC简单的创建一个 Single View 的 iOS 工程即可. 创建 xib 文件 View.xib新建文件/iOS/UserInterface View/Empty 编
原创
2764阅读
0评论
1点赞
发布博客于 5 年前

iOS内存话题: 弱引用下的懒加载

iOS内存话题: 弱引用下的懒加载阅读下面的内容之前, 你应该知道什么是懒加载, 话句话说就是延时加载.今天跟大家聊聊对于一个弱引用对象如何使用懒加载, 以及注意事项!直接上例子.工程比较简单, 只有一个 ViewController.#import "ViewController.h"@interface ViewController ()@property (nonatomic, weak)
原创
1574阅读
0评论
1点赞
发布博客于 5 年前

TestPods 工程

对应博客http://blog.csdn.net/veryitman/article/details/51407078的资源. 可以下载自己实践.
zip
发布资源于 5 年前

Cocoapods: 打造本地 pod 库

如果你想了解和学习更多关于 cocoapods 的知识,可以去 这里 查看,有关于搭建私有仓库的知识和一些踩过的坑。项目到了一定规模, 项目的代码组织和结构显得尤为重要.重构项目结构, 可以从分离代码开始.代码分离, 可以把常用稳定的组件封装抽离出来.我的做法是使用 cocoapods 来管理.下面进入今天的主题: 使用 cocoapods 管理自己的本地代码.Mac OS...
原创
14313阅读
2评论
1点赞
发布博客于 5 年前

InstanceVar

对应博客: iOS内存话题: 实例变量造成的循环引用 地址: http://blog.csdn.net/veryitman/article/details/51298878
zip
发布资源于 5 年前

iOS内存话题: 实例变量造成的循环引用

OC 中关于成员变量和属性的区别, 在阅读下面内容之前请自行 google.工程目录如下示例较简单, ViewController 直接打开 CoreViewController.Person.h#import typedef void(^PlayFunction)(int x);@interface Person : NSObject@property
原创
1892阅读
0评论
1点赞
发布博客于 5 年前

TimerDealloc

对应博客http://blog.csdn.net/veryitman/article/details/51115553中的代码.
zip
发布资源于 5 年前

iOS内存话题: NSTimer 导致无法 dealloc

继博客 iOS内存话题: performSelector 导致不立即 dealloc 后, 今天讨论一下 NSTimer 导致内存无法释放的问题.直接上例子.ViewController 中打开另一个 ViewController(LoginPage).LoginPage.m#import "LoginPage.h"@interface LoginPage ()@prope
原创
2981阅读
0评论
1点赞
发布博客于 5 年前

ReactNative: react-native init 到底做了什么

阅读本篇之前, 假设你已经在 Mac 上面安装好了 React Native 相关的环境.React Native 的环境搭建可以参考官方文档, 相当的详细.不过, 你最好使用 vpn, 或者使用国内的镜像来搭建.环境搭建好了, 可以创建工程了.创建工程的命令如下react-native init AwesomeProject在这个命令的背后, 有如下几个步骤.
原创
4376阅读
0评论
2点赞
发布博客于 5 年前

Mac OSX 10.11.1+ 安装 Cocoapods

声明:该篇已被我编辑重新排版到这里 Mac 安装 Cocoapods该篇不再更新和维护. 欢迎大家关注我的个人微信公众号: ITMan, 微信公众号搜索: ITManMark. 或者扫描一下二维码    ...
原创
1183阅读
0评论
1点赞
发布博客于 5 年前

iOS内存话题: performSelector 导致不立即 dealloc

这次的例子是1. 基于 iphone 项目.2. 在模拟器上面测试的.3. 基于 ARC.例子比较简单, A ViewController 启动 B ViewController.主要代码在 B ViewController 里面.@interface BViewController ()@property (strong, nonatomic) NSMutab
原创
3111阅读
3评论
1点赞
发布博客于 6 年前

iOS Crash: dwarfdump 检查 UUID

紧接着博客 iOS Crash: symbolicatecrash 工具 继续关于 iOS Crash 的问题.我们知道, 查找 crash 问题的关键是要有符号表即 dsym 文件.并且, app 的 UUID 和 dsym 文件的 UUID 必须要保持一致, 才有意义.dsym 文件其实也没那么神秘, 他就是包含了我们的调试信息, 全名是debug symbols.使用
原创
3370阅读
0评论
1点赞
发布博客于 6 年前

iOS Crash: symbolicatecrash 工具

iOS 开发中, 我们经常会遇到 crash 的问题.在开发阶段, crash 很容易排查和解决.但是到了用户手中, 就没那么简单了.当然, 现在很多第三方的 SDK 有 crash 分析的功能, 我们可以直接集成到我们的项目当中来.~~大家可以到网上 soso.但是, 我们还是有必要知道更多 crash 的知识, 不然, 哪天让你开发一个 crash 日志系统, 你就会蒙逼了!
原创
1208阅读
0评论
1点赞
发布博客于 6 年前

xcode7 查看 run script 运行结果

在 xcode 中可以自定义 shell 脚本.直接在 xoce 控制台查看 shell 的运行结果, 如 echo "Run here"是没有输出结果的.查看方法如下:打开这个, 其实快捷键是 cmd+8.点击 build 选项, 右侧即可显示脚本输出内容.参考:http://stackoverflow.com/questions/858936
原创
7389阅读
0评论
1点赞
发布博客于 6 年前

iOS 多线程: 正确认识 GCD 队列类型

在面试或者跟一些有 ios 编程经验的人聊到关于 GCD 的队列类型的问题.很多人说自定义的 queue 是串行队列.这种说法在一定程度上面是不对的.今天跟大家聊聊 GCD 中的队列类型问题.------------------------------------------------------------------------------------------------
原创
3787阅读
0评论
1点赞
发布博客于 6 年前

sqlie3 Replace into

在数据库表中, 如果想某个字段相同的时候, 只是更新该条记录而不是再次插入新纪录?你会怎么办?你会说, 先 query 有没有, 有的话就 update, 没有就 insert.这种方式也是也可的.但是今天, 介绍另一种方式, replace into.-------------------------------------------------------
原创
878阅读
0评论
1点赞
发布博客于 6 年前

ChainingOSX

请看博客http://blog.csdn.net/veryitman/article/details/48252607
zip
发布资源于 6 年前

OC实战: ARC 下使用 Block 实现链式语法

本篇博客, 跟大家分享一下实现 objective-c 的链式语法.-----------------------------------------------------------------主要内容1. 基于 ARC.2. 使用 Objective-c 语言编写.3. 使用 block 实现.-------------------------------------
原创
1616阅读
0评论
1点赞
发布博客于 6 年前

OC实战: 抽象类的实现

新博客地址:http://www.veryitman.com/,致力于让开发变得更好!本篇新地址:http://www.veryitman.com/2019/04/21/%E7%94%A8Objective-C%E5%AE%9E%E7%8E%B0%E6%8A%BD%E8%B1%A1%E7%B1%BB/这里, 假设你已经明白了* oc 的继承.* oc 的多态.其实 oc 里面的方法...
原创
8873阅读
5评论
5点赞
发布博客于 6 年前

iOS: 由第三方SDK引起 duplicate symbol 的思考

本文建立在 xcode6.4 的基础之上.开发 App, 难免要接第三方的 SDK. 按照 SDK 文档接入, 理论上说不会有什么错误.~但是, 现实还是不是那么的理想~~第三方 SDK 一般不会写文档告诉你, 我使用了哪些第三方库, 你们在接入的时候要注意啊类似的话.可能说出这样的话, 无法体现自己的逼格, 呵呵!这样就苦逼了程序员们了.不过, 魔高一尺道高一丈!
原创
7764阅读
0评论
1点赞
发布博客于 6 年前

GCC系列: __attribute__((visibility("")))

在 objc-api.h 里面有很多关于__attribute__ 的定义.例如#if !defined(OBJC_VISIBLE)# if TARGET_OS_WIN32# if defined(BUILDING_OBJC)# define OBJC_VISIBLE __declspec(dllexport)# else# ...
原创
6707阅读
0评论
3点赞
发布博客于 6 年前

GCC系列: 加载静态链接库

在 mac osx 操作系统下, 请先移步->GCC系列: Homebrew安装GCC和binutils.GCC加载链接库会依赖加载顺序, 这样会导致无法调用预期的方法.下面举例说明.Car 和 Bus 都有 drive 函数, 在 main 里面调用谁的 drive, 取决于链接库的加载顺序.Car.c#include<stdio.h> #i...
原创
2873阅读
0评论
0点赞
发布博客于 6 年前

GCC系列: Homebrew安装GCC和binutils

最近在研究 GCC, 分享一下.这篇博客主要分享mac 下安装 gcc 和 binutils 工具.mac 下输入 gcc -v 其实是链接指向了LLVM, 不是 GNU 的 GCC.安装 gccbrew tap homebrew/versionsbrew install gcc49brew 会自动为你安装相关依赖, 比如gmp4, mpfr2, libmpc08, ...
原创
11198阅读
0评论
0点赞
发布博客于 6 年前

OC坑集: ARC单例模式

OC 的单例也是比较让人蛋疼的.ToolManager.h#import @interface ToolManager : NSObject@property (copy, nonatomic) NSString *tName;+ (ToolManager *)sharedToolManager;@endToolManager.m#import "ToolManag
原创
1833阅读
1评论
1点赞
发布博客于 6 年前

IOS8 UI: 由 self.view = nil 引起的思考

首先声明我使用了 ARC, 使用 OC 编码.有2个 ViewController, 暂且称之为 AController 和 BController.从 AController切换到(push) BController,  然后再从 BController 返回到 AController 中.这是很基本的操作.我手动的释放当前 AController 的 v
原创
3814阅读
0评论
0点赞
发布博客于 6 年前

OC坑集: ARC 下覆写 setter/getter

如果你看过博客 OC坑集: 实例变量不需要 @synthesize, 接下来的内容对你来说就是小菜一碟.在非 ARC 时代, 就是人们常说的 MRC(手动管理内存)时代, 我们需要 retain/release/autorelease 等.cocos2d-x 也借鉴了 oc 的 retain 等操作来管理内存.这里真心要吐槽一下, c++ 新标准为毛越来越像 java.好了, 不扯
原创
2761阅读
0评论
0点赞
发布博客于 6 年前

OC坑集: 实例变量不需要 @synthesize

不知道从几何开始, OC 中可以只写 @property 不写 @synthesize 了.虽然有点不习惯,但是用过之后觉得比较方便.你需要知道, 写了@property 之后1. 自动生成了_xxx这样的实例变量.2. 如果你手动重写 setXXX 和 XXX 方法, 就不会为你自动生成 _xxx 实例变量了.@interface Cat : NSObject@prope
原创
1112阅读
0评论
0点赞
发布博客于 6 年前

OC坑集: block作为函数参数

对于 OC 的争论一直不休, 对于一门语言, 我觉得只要能解决你的问题就够了.评论一门编程语言之前, 你需要真正的去用它, OC 孰好孰坏, 需要你自己去尝试.OC 坑集, 主要记载使用 OC 开发项目遇到的问题, 尽量简洁明了, 希望大家喜欢.block 语句块可以作为函数的参数, 在项目中都经常被作为回调来使用.如果你还不熟悉 block 语法, 请自行 googl
原创
14529阅读
0评论
2点赞
发布博客于 6 年前

Mac 为 Homebrew 设置代理

本文已被迁移到 我的博客-Homebrew 设置代理请移步。1. 打开终端cd ~/2. 查看当前目录ls -al是否有 .curl 文件.如果没有,新建一个吧touch .curl3. 编辑它,写入下面内容.如果已经存在这个文件的话,直接编辑.#HTTP代理proxy=ip:port把 ip 和 port 改为你的代理 ip ...
原创
21463阅读
0评论
1点赞
发布博客于 6 年前

xcode6.3 搭建 kobold2D 环境

xcode 版本关于 Kobold2D是一个基于 cocos2d-iphone 的2D 游戏引擎.但是这个引擎好久都没更新了.估计是使用的人太少了.也许你会问,为什么你还搭建这个环境?其实, Kobold2D 还是有很多值得我们学习的东西.可以去官网了解更多:点击打开链接也可以在 github 下载最新代码:源码下载安装下载地址:点我你会看到
原创
1230阅读
0评论
1点赞
发布博客于 6 年前

char | string | NSString 之间的转换

char to string方式一 char c1 = 'd'; string s1(1, c1); cout << "s1 = " << s1 << endl;方式二 char c2 = 'y'; char tc[128]; sprintf(tc, "%c", c2); string s2...
原创
1360阅读
0评论
1点赞
发布博客于 6 年前

char数组构造string

这是一个老掉牙的话题, 但是你稍加不注意就会出错.最近在写一个可以跨平台打印的程序,就遇到这个问题,故记之.共勉!用 char 数组初始化string#include using std::string;using std::cout;int main(int argc, const char * argv[]){ char chArray[] =
原创
4002阅读
0评论
1点赞
发布博客于 6 年前

coco2d-iphone: 环境搭建

* Mac OS 操作系统.* XCode 作为 IDE, 目前本人使用的是 xcode6.2.* cocos2d-iphone 2.2.0版本.选择这个版本是因为它支持苹果64位.关于cocos2d的前世今生可以参考这篇文章:Cocos2D家族的前世今生下面进入主题.一. 下载1. 打开连接:cocos2d-iphone download
原创
1924阅读
0评论
1点赞
发布博客于 6 年前

makefile:简单入门

简单的入门操作,高手请无视.C.h 文件#ifndef __C__HEADER#define __C__HEADERclass C{public: C(); C(C& c);};#endifC.cpp 文件#include "C.h"#include using namespace std;C::C(){}C::C(C& c)
原创
1635阅读
5评论
0点赞
发布博客于 6 年前

Mac OS 修改终端提示前缀

只需一条命令sudo scutil --set HostName重启终端即可生效.
原创
8131阅读
0评论
1点赞
发布博客于 6 年前

Ubuntu源码安装swig

现在 swig 已经支持 apt install 命令安装了,如果不想通过下面源码安装的可以直接执行下面命令安装。sudo apt install swig下面的步骤是使用 swig 源码安装的方法。1. 下载 swig 源码http://www.swig.org/survey.html填写一个简单的问卷,即可进入 sourceforge 下载。2. 安装 g++s...
原创
17465阅读
15评论
3点赞
发布博客于 8 年前

ubuntu 13.10 install wine

Here's how you can install Wine 1.7.1 in Ubuntu 13.10 Saucy Salamander.1. Open a terminal window.2. Type in the following commands then hit Enter after each.sudo add-apt-repository ppa
原创
1960阅读
0评论
0点赞
发布博客于 8 年前

CloudBaby:commit to github in windows 7

需要安装msysgitTortoiseGit一、创建 github 账号在 github 官网创建一个账号,二、Create a New Repository选择第一个即可创建。填好名称后Create,之后会出现一些仓库的配置信息。三、本地目录初始化在 eclipse 下面新建了一个  CloudBaby 项目
原创
1436阅读
0评论
0点赞
发布博客于 8 年前

jni tutorial:windows下的HelloJNI

你需要保证你满足下面条件:1. 使用 Eclipse 在 windows(32位操作系统)下学习。2. 安装了MinGW,并且配置好,保证 gcc 可以使用。一、新建项目HelloJNI.javapackage it.man.jni;public class HelloJNI { static { System.loadLibrary("HelloJN
原创
1913阅读
0评论
0点赞
发布博客于 8 年前

SQLite3 数据库升级

sqlite 数据库中有关数据库升级的操作,简单介绍。
原创
2559阅读
0评论
0点赞
发布博客于 8 年前

Pattern: 单例模式及其序列化实现

单例模式有很多种写法,推荐一篇比较好的文章http://devbean.blog.51cto.com/448512/203501读完上面的文章之后,你可以看看我这篇来自 Effective Java 的单例实现。1. 最简单的单例模式实现//Singleton with final field - page 10public class Elvis { pu
原创
1469阅读
0评论
4点赞
发布博客于 9 年前

UI 设计:pixel dip dpi sp density

-----------整理自网络-----------1. px (pixels)像素 – 是像素,就是屏幕上实际的像素点单位。dip或dp (device independent pixels)设备独立像素,与设备屏幕有关。sp (scaled pixels — best for text size):类似dp,主要处理字体的大小。dpi(dot per inch
原创
2346阅读
0评论
0点赞
发布博客于 9 年前

java 基础:static 与构造方法

了解静态代码块,可以先抽几分钟时间看看链接 http://blog.csdn.net/androidbluetooth/article/details/6454135先给个示例程序package it.mark;import java.util.HashMap;public class StaticDemo { public static HashMap map;
原创
2350阅读
0评论
1点赞
发布博客于 9 年前

Java 异常: 编译时和运行时异常

Throwable 类是所有异常类的父类RuntimeException 继承自 Throwable在 JDK 文档里面中文意思如下:之前,写代码的时候 throw 某个异常,发现有些异常就是不需要 throws 语句(在方法声明后面),而有些必须加上 throws 语句在方法声明后面),
原创
3157阅读
0评论
2点赞
发布博客于 9 年前

FAQ_23 设置 Toast 显示时间

在你写的 android 代码里面是否有下面的示例:Toast.makeText(getApplicationContext(), "*****", 1).show();或者Toast.makeText(getApplicationContext(), "*****", 1000).show();可以看到这两句代码里面的第三个参数是不一样的,看一下该方法的原型
原创
4486阅读
0评论
1点赞
发布博客于 9 年前