已写下 85 篇博客文章,共计 101,765 字,完整阅读预计需要 8.5 小时,已有 251,760 次阅读。

按照【分类】筛选文章

按照【标签】筛选文章

Cover

Stripe 支付 (使用 Next.js 部署到 Cloudflare)

使用 Stripe 为您的生意进行线上收款开发。 

Cover

联邦宇宙(Mastodon、Fediverse)别名服务

一个开源的联邦宇宙别名服务。A Fediverse Alias Service for public 

Cover

Cloudflare Email Routing 免费邮件发送服务

Cloudflare Email Routing 免费邮件发送(作为 Service 服务)用于 Workers/Pages 项目中。  

Cover

Cloudflare KV 备份及迁移

# 背景 之前的项目一直都用的是免费的服务,后端 Vercel 托管,数据使用的 Cloudflare KV。 这其中就有一个很严重的问题:`延迟`。经常数据操作了,但是 KV 还是缓存的值。 现在索性全部换成 Cloudflare 全家桶,虽然可以直接用 KV,但结构化的数据可以用免费的 D1 额度。 从网上搜索了很多关于 Cloudflare KV 备份及迁移的文章,但是都不是很满意,所以自己写了一个。  

Cover

代码灵魂——通过你的代码表达你的意图

> 曾经,我以为:“好的代码像首诗,烂的代码像坨屎。” 但对于代码质量的好坏、阅读性的好坏,却没有一个有效的度量标准。每个人心中的一杆秤,是不同的。 那么多年过去了,依然无法去统一所有人的编程思想。而什么样的代码,才是好的代码,渐渐地,在心中有了一部分标准的答案。  

Cover

金铲铲之战九五新手教程

适用于当前 s9 赛季。 

Cover

【教女朋友 从 0 到 1 学编程系列】三、2048 前端游戏实战

 

Cover

【教女朋友 从 0 到 1 学编程系列】二、快速掌握前端基础

首先明确一点学习的最根本原则: - 预习:是不可能预习的 - 复习:是不可能复习的 那么如何能够教女朋友快速从零基础上手写代码,将成为本课时的最关键内容。 前端的基础主要包括三个部分,HTML、CSS、JS,其中 HTML 和 CSS 是前端的基础,JS 是前端的核心。本课时主要讲解 HTML 和 CSS,JS 将在下一阶段重点讲解。 简单来说,HTML 是网页的骨架,CSS 是网页的皮肤,JS 是网页的灵魂。 ## HTML HTML 指的是超文本标记语言: **H**yper**T**ext **M**arkup **L**anguage ![](https://www.runoob.com/wp-content/uploads/2013/06/02A7DD95-22B4-4FB9-B994-DDB5393F7F03.jpg) > 图片来自 [Runoob.com](https://www.runoob.com/html/html-intro.html) ### 通用声明 HTML 5: ```html <!doctype html> ``` 目前最常见的也是最简单的声明方式,其他还有 html 4.01、 xhtml 1.0 等,具体可以参考: [https://www.runoob.com/tags/tag-doctype.html](https://www.runoob.com/tags/tag-doctype.html) (`可以忽略不看`) 目前在大部分浏览器中,直接输出中文会出现中文乱码的情况,这时候我们就需要在头部将字符声明为 `UTF-8` 或 `GBK`。 整体页面结构: - `DOCTYPE` 声明 - `<html>` 页面元素 - `<head>` 头部信息元素(不会显示,内部元素顺序可以随意调整) - `<title>` 页面标题 - `<meta>` 元数据 - 其他头部信息 - `<body>` 网页主体 - 各元素内容 示例代码: ```html <!doctype html> <html lang="zh-CN"> <head> <meta charset="utf-8" /> <title>页面标题</title> </head> <body> <h1>我的第一个标题</h1> <p>我的第一个段落。</p> <!-- 这是一段注释,不会显示到页面中 --> </body> </html> ``` > [在线体验](https://www.runoob.com/try/try.php?filename=tryhtml_headers) ### head 元素 | 标签 | 描述 | | : 

Cover

【教女朋友 从 0 到 1 学编程系列】一、计算机基础

教女朋友 从 0 到 1 学编程系列大纲,主要技术栈围绕 JS/TS 前后端,欢迎完善补充,提出宝贵意见。 

Cover

Next.js (React) 实用进阶技巧

自用整理的 Next.js 或 React 项目进阶小技巧。 

Cover

remote-cloudflare-kv 在 Vercel 上使用 Cloudflare KV

最近我在做 Next.js 项目部署 Cloudflare Pages 时发现本地开发调试、登录鉴权等好多问题,所以又想要切回到 Vercel 中,便有了这么一个项目,可以在 Cloudflare 以外的环境上得到类似于 Worker Runtime 的 KV 使用体验。  

Cover

Mastodon 长毛象多租户:自定义域名、自定义账号别名

如果您想要一个属于自己的账号别名,但没有服务器的话,可以参考一下我的发电计划: https://afdian.net/a/willin 

Cover

安装部署 Mastodon 长毛象去中心化微博系统

如果您想要一个属于自己的账号别名,但没有服务器的话,可以参考一下我的发电计划: https://afdian.net/a/willin 

Cover

Next.js 13 appDir 实战 i18n

# 背景 官方目前未打算支持 i18n 国际化路由支持,且尚未提供解决方案,但是我们可以通过实验特性 appDir 来实现。 > ## Not Planned Features > > We are currently not planning to include the following features in app: > > - Internationalization (i18n) - we will be providing a guide on how to implement internationalization in app. > - AMP Support > > If you need any of these features, we will continue to support `pages`, including bug fixes and feature additions, for multiple major versions. 文档地址: https://beta.nextjs.org/docs/app-directory-roadmap#not-planned-features 首先需要了解一下 `Server and Client Components` 服务器组件和客户端组件。 | What do you need to do? | Server Component | Client Component | | : 

Cover

让平凡非凡——公益慈善篇

Willin Wang 公益慈善推荐 

Cover

为回家、出发——三十三周岁封笔

没有在深夜里痛哭过的人,不足以谈人生。 

Cover

NFT 数字藏品从设计到发布

本系列专栏主要内容涵盖从平台选择、前期规划、NFT 藏品设计、批量生成以及平台上线所有阶段。 

Cover

在 Wordpress 中集成 Authing SSO

# 安装 - Github [下载插件](https://github.com/Authing/wp-authing/releases) 并上传安装 - 插件安装页面搜索 Authing 并安装 ![Config](/images/blog/authing-wordpress/wp-authing-config.png) 按照插件提示进行配置。 - 填写 Authing 应用域名 - 将对应的配置项在 Authing 控制台中进行设置 - 填写 App ID 和 App Secret 进行保存 Authing 控制台配置示意如下图: ![Config](/images/blog/authing-wordpress/authing-config.png)  

Cover

今年的情人节,给心爱的她一个不一样的礼物吧

今天是 2022 年 2 月 2 日,距离今年的情人节只有不到两周的时间了。 给大家隆重介绍一个网站,[憨憨.我爱你](https://xn--wkua.xn--6qq986b3xl/) 参考示例网站: - [表白幻灯片.憨憨.我爱你](https://xn--owtp31bqkbezhj50a.xn--wkua.xn--6qq986b3xl/) - [源码](https://github.com/willin-love/romantic_page) - [恋爱计时器.憨憨.我爱你](https://xn--m7rx3unue2vok44a.xn--wkua.xn--6qq986b3xl/) - [源码](https://github.com/willin-love/romantic_page) # 申请流程 打开官网首页: [憨憨.我爱你](https://xn--wkua.xn--6qq986b3xl/) (由于该网站数据库使用的是 PlanetScale 免费服务,位于美东,所以访问可能会稍微有点慢。请耐心等待。) ![](/images/blog/hanhan-i-love-u/home.png) 使用 [Authing](https://www.authing.cn/?utm_source=v0&utm_campaign=hanhan) 账号登录(可以手机、邮箱注册,Github 账号登录,或者微信小程序扫码,后续还会添加更多登录方式)。 ![](/images/blog/hanhan-i-love-u/dashboard.png) 可以分别点击进入域名申请和邮箱申请。 ## 域名申请 域名申请界面如下: ![](/images/blog/hanhan-i-love-u/domain.png) 支持的绑定方式有三种: - CNAME: 可以使用 Github Pages、 Netlify、 Gitee、 Coding.net、 Cloudflare 等提供托管服务的平台 - 值参考: `willin.github.io` - 注意: 不支持 Vercel ,因为 Vercel 默认情况下并不支持绑定二级域名(除非所有权在你个人名下) - A: IPv4 需要自己搭建服务器,并进行绑定 - 值参考: `1.2.3.4` (你服务器的 ip 地址) - AAAA: IPv6 需要自己搭建服务器,并进行绑定 - 不做表述,不太推荐非专业人士选择 - 如果你需要同时绑定 IPv4 和 IPv6 的话,建议建议注册 A 类型,然后 ISSUE 或邮件联系我配合处理 其中还有一项 Proxied(CDN),如果不知道作用,可以尝试开启或关闭来测试。 ## 邮箱申请 域名申请界面如下: ![](/images/blog/hanhan-i-love-u/email.png) 目前使用了 Cloudflare 的邮件转发服务,但由于暂不支持 IDN 域名,所以可以提前抢注,第一时间拥有。 ## 其他说明 ### 如需帮助 欢迎在 Github 上关注我: [willin](https://github.com/willin) ,如果在为心爱的她准备礼物时遇到问题,可以为你免费提供技术咨询。 ### 还想要其他的域名 - [js.cool](https://github.com/js-cool) (在多次协商后,目前已经支持 Vercel 绑定) - log.lu (敬请期待) ### 感觉慷慨 - 您可以将该网站分享给更多的人 - 您也可以通过以下渠道进行打赏: - [微信](https://willin.github.io/images/wx.png) - [支付宝](https://willin.github.io/images/alipay.png) - [爱发电](https://afdian.net/@willin) - [Github Sponsors](https://github.com/sponsors/willin) - [Paypal](https://www.paypal.com/paypalme/willinwang) ### 跃跃欲试 或许你也有很多想法,想要实现。您可以: - 使用 [Authing](https://www.authing.cn/?utm_source=v0&utm_campaign=hanhan) 快速集成开发你自己的应用 - Fork 本项目源码(完全开源),并提供你自己的域名服务 - [项目源码](https://github.com/willin/xn--wkua.xn--6qq986b3xL) - 在 Github 上对本项目进行完善和优化 - [项目后续规划](https://github.com/willin/xn--wkua.xn--6qq986b3xL/issues/3)  

Cover

全栈框架应用快速集成 Authing SSO

分别以 Next.js 和 Remix 框架为例,讲解如何在半小时内快速集成 Authing SSO 

Cover

Authing 团队管理 + Wechaty 机器人 = 无限可能

分别以微信群、飞书、Authing 作为上游用户源,构建人事管理机器人的实际案例教程。 

Cover

你好 Remix 博客

在博客沉寂了很久之后,我决定重新做一个。 - 初瘦: [v0.chat](https://v0.chat) - 2018 年 - 用 Nuxt.js 框架封装了一个仅有 255 行代码的博客系统 [Nuxtpress](https://github.com/assholev0/nuxtpress) - 《不可替代的团队领袖培养计划》: [leader.js.cool](https://leader.js.cool) - 2016 年 - 先后用过 Gitbook、Docsify 和 Nuxt.js (Nuxt Content) - 山沟沟: [sh.gg](https://sh.gg) - 2015 年 - 使用的 Hexo 和 Next 主题,去年底换成了 Icarus Cyberpunk 主题,发布过 [Hexo Wordcount](https://github.com/willin/hexo-wordcount) 插件 - Willin.org、 Willin.me 等 - 从 2009 年开始使用 Wordpress 搭建 - 一直到 2015 年前后,不再使用自建服务器,改为纯静态化博客 - best02.cn、 Agean.com.cn 等 - 从 2002 年起,使用过 Z-Blog、Emlog、Typecho 等各种博客系统去搭建动态博客 # 技术选型 | 项目 | 选择 | | : 

Cover

Discourse 零代码集成 SSO 教程

# Discourse 是什么? Discourse 是 Stack Overflow 的联合创始人 Jeff Atwood 推出的一个新的开源论坛项目,其目的是为了改变十年未变的论坛软件,摒弃了传统论坛的话题讨论形式、拥有自学习系统、全 Web 应用同时适用于桌面和移动终端。 # Authing 是什么? [Authing](https://www.authing.cn/?utm_source=v0&utm_campaign=blog) 是国内首款以开发者为中心的全场景身份云产品,集成了所有主流身份认证协议,为企业和开发者提供完善安全的用户认证和访问管理服务。 以「API First」作为产品基石,把身份领域所有常用功能都进行了模块化的封装,通过全场景编程语言 SDK 将所有能力 API 化提供给开发者。同时,用户可以灵活的使用 Authing 开放的 RESTful APIs 进行功能拓展,满足不同企业不同业务场景下的身份管理需求。 ## 传统系统 SSO 单点登录改造 首先,需要对原有系统的用户体系进行改造,使其能够适应通用的用户认证标准协议(如 OAuth)。如果系统体量较大,甚至还需要考虑将原有业务中的用户体系抽出,专门做成单点登录的用户中心。需要进行设计、编码、测试、升级、扩容等一系列复杂的开发运维操作,才能够实现。 该方式耗时间,耗精力,耗成本,风险大(需要在业务领域之外不断去踩坑)。 ## Authing SSO 集成 如果您的应用是基于 Authing 提供的身份系统进行开发,那么恭喜你,可以使用较少的代码(或者配置)即可轻松几步,快速完成单点登录的集成。 该方式低成本,无须额外设计和开发,采用标准协议,轻松打通。 # Discourse 安装 参考资料: - Discourse 官方 Docker 仓库: [https://github.com/discourse/discourse_docker](https://github.com/discourse/discourse_docker) - 安装指南文档: [https://github.com/discourse/discourse/blob/main/docs/INSTALL-cloud.md](https://github.com/discourse/discourse/blob/main/docs/INSTALL-cloud.md) 建议将 Discourse Docker 仓库 Fork,并在本地先进行开发调试确认无误后再进行产品环境的安装。下面是简单的安装步骤说明及配置中常见问题的 FAQ。 注意:请在 Linux 服务器或者 macOS 下进行安装(Windows 需要自行摸索一下)。 ## 拉取 Discourse Docker 仓库 ```bash git clone https://github.com/discourse/discourse_docker.git /var/discourse cd /var/discourse ``` 使用自动化配置脚本: ```bash ./discourse-setup ``` 非 `root` 用户的话,需要在前面加 `sudo` 运行。根据提示一步一步输入配置项,完成安装配置。默认的配置在本地运行的时候大概率会运行不起来。 打开 `containers/app.yml` 配置文件进行配置调整,如果手动配置,也可以执行: ```bash cp samples/standalone.yml containers/app.yml ``` 复制一个示例模板作为开始。 ## 应用配置 在开始配置之前,先确保域名已经绑定到服务器上(DNS 中的 A 记录绑定),或者本地修改 `/etc/hosts` 文件(不要使用 example.com 或者需要强制 https 的域名后缀作为本地开发调试,如: `.app`、`.dev`等)。 环境变量设置参考: ```yaml env: LC_ALL: en_US.UTF-8 LANG: en_US.UTF-8 LANGUAGE: en_US.UTF-8 EMBER_CLI_PROD_ASSETS: 1 # DISCOURSE_DEFAULT_LOCALE: en ## How many concurrent web requests are supported? Depends on memory and CPU cores. ## will be set automatically by bootstrap based on detected CPUs, or you can override #UNICORN_WORKERS: 3 ## TODO: The domain name this Discourse instance will respond to ## Required. Discourse will not work with a bare IP number. DISCOURSE_HOSTNAME: 'discourse.local' ## Uncomment if you want the container to be started with the same ## hostname (-h option) as specified above (default "$hostname-$config") # DOCKER_USE_HOSTNAME: true ## TODO: List of comma delimited emails that will be made admin and developer ## on initial signup example '[email protected],[email protected]' DISCOURSE_DEVELOPER_EMAILS: '[email protected]' ## TODO: The SMTP mail server used to validate new accounts and send notifications # SMTP ADDRESS, username, and password are required # WARNING the char '#' in SMTP password can cause problems! DISCOURSE_SMTP_ADDRESS: smtp.mail.qq.com DISCOURSE_SMTP_PORT: 25 DISCOURSE_SMTP_USER_NAME: [email protected] DISCOURSE_SMTP_PASSWORD: 'password' DISCOURSE_SMTP_ENABLE_START_TLS: fales # (optional, default true) DISCOURSE_SMTP_AUTHENTICATION: plain DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none DISCOURSE_NOTIFICATION_EMAIL: [email protected] ## If you added the Lets Encrypt template, uncomment below to get a free SSL certificate #LETSENCRYPT_ACCOUNT_EMAIL: [email protected] ## The http or https CDN address for this Discourse instance (configured to pull) ## see https://meta.discourse.org/t/14857 for details #DISCOURSE_CDN_URL: https://discourse-cdn.example.com ## The maxmind geolocation IP address key for IP address lookup ## see https://meta.discourse.org/t/-/137387/23 for details #DISCOURSE_MAXMIND_LICENSE_KEY: 1234567890123456 ``` 简单说明: - `UNICORN_WORKERS`:根据 CPU 数量决定 Worker 数量或者手动配置 - `DISCOURSE_HOSTNAME`:正确配置域名 - `DISCOURSE_SMTP_XXX`:正确配置 SMTP 邮件发送服务,不然会收不到验证码和通知邮件 插件配置: ```yaml ## Plugins go here ## see https://meta.discourse.org/t/19157 for details hooks: after_code: - exec: cd: $home/plugins cmd: - git clone https://github.com/discourse/docker_manager.git - git clone https://github.com/discourse/discourse-oauth2-basic.git - git clone https://github.com/angelim/discourse_user_auto_activation.git ``` 这三个插件的作用: - Docker 管理,自带默认 - OAuth 2 集成,用于与 Authing SSO 连接实现单点登录 - 自动激活(邮箱)插件,可选 ## 启动论坛服务 提醒:先配置好 SSL 证书再启动服务(参考 FAQ SSL 证书配置,或者使用 Let's Encrypt 签发证书)。 配置完成后制作镜像: ```bash ./launcher bootstrap app ./launcher start app ``` 如果已经初始化过,可以通过重新制作镜像的方式: ```bash ./launcher rebuild app ``` 过程漫长,耐心等待。下面整理了我在调试过程中遇到的一些问题和一些提示。 ## FAQ ### 域名配置 主要修改模板: ```yaml templates: - 'templates/postgres.template.yml' - 'templates/redis.template.yml' - 'templates/web.template.yml' - 'templates/web.ratelimited.template.yml' ## Uncomment these two lines if you wish to add Lets Encrypt (https) - 'templates/web.ssl.template.yml' #- "templates/web.letsencrypt.ssl.template.yml" ``` - 如果需要 SSL 支持, `"templates/web.ssl.template.yml" ` 这个模板文件需要引入。 - 如果需要免费的域名证书更新, `"templates/web.letsencrypt.ssl.template.yml"` 这个模板需要引入。 同时根据需要,将端口开放出来: ```yaml ## which TCP/IP ports should this container expose? ## If you want Discourse to share a port with another webserver like Apache or nginx, ## see https://meta.discourse.org/t/17247 for details expose: - '80:80' # http - '443:443' # https ``` ### SSL 证书配置 首先确认一下文件目录的映射是否正确: ```yaml ## The Docker container is stateless; all data is stored in /shared volumes: - volume: host: /var/discourse/shared/standalone guest: /shared - volume: host: /var/discourse/log/var-log guest: /var/log ``` 类似这样的目录映射,将证书文件放置到对应的 ssl 目录下,检查这两个文件路径是否正确: ```yaml /var/discourse/shared/standalone/ssl/ssl.crt /var/discourse/shared/standalone/ssl/ssl.key ``` 自签证书参考: ```bash openssl genrsa -aes256 -passout pass:gsahdg -out ssl.pass.key 4096 openssl rsa -passin pass:gsahdg -in ssl.pass.key -out ssl.key openssl req -new -key ssl.key -out ssl.csr # You are about to be asked to enter information that will be incorporated # into your certificate request. # What you are about to enter is what is called a Distinguished Name or a DN. # There are quite a few fields but you can leave some blank # For some fields there will be a default value, # If you enter '.', the field will be left blank. #  

Cover

笔记本、台式机、平板二合一?Mac、Win、Linux?

根据日常使用的需求进行选择,笔记本、台式机、平板和二合一电脑我都有尝试过,目前而言,最适合我个人的是笔记本。 

Cover

Promise、async/await 使用经验

# Promise 产生:改善 Callback Hell 问题 ## 什么样的方法可以用 Promise 重写 例 1: ```javascript mysql.query('SELECT 1 + 1 AS solution', function (err, rows, fields) { if (err) { throw err; } // 对查询结果进行操作 console.log('The solution is: ', rows[0].solution); }); ``` 例 2: ```javascript fs.readFile('myfile.txt', function (err, file) { if (err) { throw err; } // 对file进行操作 }); ``` ## 如何将一个回调方法改为 Promise ### Promisify 一般情况下,该方式首选。 ```javascript const util = require('util'); const fs = require('fs'); const stat = util.promisify(fs.stat); stat('.') .then((stats) => { // Do something with `stats` }) .catch((error) => { // Handle the error. }); ``` ### new Promise() 虽然所有的最终实现原理应该都是这样,但这种写法上的话,又再次出现了地狱回调的问题,可读性非常差。 ```javascript const fs = require('fs'); const stat = (...args) => new Promise((resolve, reject) => { fs.stat(...args, (err, stats) => { if (err) { reject(err); } else { resolve(stats); } }); }); stat('.') .then((stats) => { // Do something with `stats` }) .catch((error) => { // Handle the error. }); ``` ### Defer 兼顾了可读性的一种写法。 ```javascript const fs = require('fs'); const getDefer = () => { const deferred = {}; deferred.promise = new Promise((resolve, reject) => { deferred.resolve = resolve; deferred.reject = reject; }); return deferred; }; const stat = (...args) => { const deferred = getDefer(); fs.stat(...args, (err, stats) => { if (err) { deferred.reject(err); } else { deferred.resolve(stats); } }); return deferred.promise; }; stat('.') .then((stats) => { // Do something with `stats` }) .catch((error) => { // Handle the error. }); ``` ## 如何调用 Promise 方法 ### 直接执行 ```javascript promiseFn() .then() .catch() .then() // 此处的 .then 未经过异常捕获 .finally(); // 不管成功失败,最终都将执行 ``` ### 批量执行 ```javascript Promise.all([promiseFn1(), promiseFn2()]).then(); Promise.allSettled(); // 推荐 Promise.race(); Promise.any(); ```  

Cover

羡鱼「初瘦酒馆」

到了梅雨季节。 忽冷忽热的天,未落雨时闷热潮湿;雨落时伴着风,又有些许寒凉。 郭敏在年前继续出发了,陆离也跟着一起。他俩人,应该是好上了。  

Cover

模块化开发、容器化开发

 

Cover

愉快地使用 Manjaro 21 玩耍

 

Cover

Nest.js 基础入门

除了在 Controller 中,在 Model、 Service 等其他地方内层方法均可以进行优化,因为外层调用的时候已经带上了 `await`。同时,还需要注意各个方法的返回类型,养成良好习惯。 

Cover

过敏的郭敏「初瘦酒馆」

转眼又过去了几个月,不知不觉入冬了。 后来酒馆又招了个姑娘,名字叫郭敏。 她是个背包客,一人带着一狗,一路当义工一路走。 我们这儿虽然是旅游城市,但其实没有什么旅游文化,没有密集的老街和小客栈。她选在我这里当义工主要是因为我这儿城郊位置比较偏,她白天可以往外面景点到处跑跑,晚上回来又免去了进城的烦恼。我收留她主要的原因是她不要工资,还能干些活,每天驻唱两首,全凭顾客打赏。 说实话,我还得感谢她,帮酒馆的生意给救活了。不仅仅是她民谣唱的好,还有她的那只讨喜的拉布拉多。  

Cover

不如算了吧

最近在看房子,打算跟同事朋友三个人一起合租。高不成低不就的,要么特别偏远,要么看好的就比预算高些。反反复复跑了四五个地方没做决定,说白了,就是穷惹的祸。不然哪需要纠结呢?! 算了吧,再看看。总是这么安慰自己。 出来打拼了十年了,从最初的隔断房小单间,到跟朋友合租,到租整套,终于住进自己的房子里。为了工作离公司近,又出来租房子,生活压力整租又负担不起,我心里默默问了自己,难道又要沦落到合租很差的房子像住员工宿舍了吗? 所以咬咬牙,决定搬回家里。  

Cover

光怪陆离「初瘦酒馆」

四月的天,飘起了雪,又有点冷了。  

Cover

梦想清单8号:王初瘦V0

给捕梦者的投稿:1.建立一个家 

Cover

透明的秘密「初瘦酒馆」

有一段时间没有见到小白了。小白是酒馆的老顾客了,虽然他的外号叫小白,但其实挺黑的。看样子,小白也就 20 出头,据他自己吹牛的时候说,高中毕业就出来打工了,现在已经混出了“不小”的名堂。 今天他是一个人来的,而平时,他总是带着不同的妹子。 他坐到了平时的“专座”上,招呼我过去。我给他按照老规矩上了酒,准备坐在他的旁边聊几句。这个位子,应该坐一个姑娘。坐下前,我特意问了一下:“今天只有你一个人?” “对。”得到肯定地答复后,我就坐了下来。 虽然小白是老顾客了,但我们并没有太多交流,毕竟这家伙每次出现的时候都不是一个人。他这人很爽快,从不废话,干脆利索。 “分手了?”“恩。” 一时间无话陷入了沉默。虽然在我认识的人当中,小白算小的,但我感觉他的故事,不算少的。  

Cover

他浪够了,也烂透了「初瘦酒馆」

今天是 2020 年 5 月 25 日,小雨,酒馆里没什么客人。兜里的烟也没了,虽然我不知道瘾为何物,但这个东西帮助我打发了不少无聊的时间。这种时候,我偶尔也会装装深沉,思考一下人生。比如,如果有下辈子,那我就当一只水母吧,没有心脏,一直在大海里游,死后会化为水,融入大海里,没有痕迹,就当没来过。 临夜,准备早些打烊回去休息,来了个小胖子。他没有打伞,灰色的衬衫肩膀上还落着些雨滴。 “小兄弟,这是刚收工吗?”我热情地招呼他。伙计刚收工走了,只剩下我跟他两个人。 他点点头,点了一杯什果宾治。补了一句,“不小了,都 36 了。” 我打趣地说道:“看不出来啊老哥。不要点酒精?还是你是开车来的么?” 小胖坐到了吧台边,“不用了,我刚搬来附近。加班回来,瞥见这条街上就剩你这儿亮着,招牌挺有意思的。所以我把车停回去之后就走过来看看。我不喝酒,也不抽烟。” 我楞了一下,抬头仔细看了他几眼。虽然稍显肥腻,眼神里有些沧桑和疲惫,但干净整齐,看上还是挺年轻的。“好男人吖!你是说「初瘦酒馆」这个名字么?想当初,也瘦过。岁月是把猪饲料啊,怎么着以前我也是个瘦小伙儿。” 他似乎被我逗乐了,笑了一下,露出了小虎牙。但一转念又收起了表情,沉默了一阵子,说了一句深沉的话——“烟酒情话,样样不差,未必是个坏男人;很惭愧,恐怕我是个罪孽深重的人。” “不会吧。一看就知道是个好好先生。怎么?背着老婆在外面有人了?”然后我看了看他的表情,让我有种哪壶不开提哪壶的感觉。 “我一个人。” “看来,有故事。”我意味深长地叹了口气,把调好的无酒精鸡尾酒递到他手边。在这里,我见过形形色色的人,也听过了很多故事,轰轰烈烈,是是非非;但我有种预感,小胖的故事,应该会有些特别。  

Cover

子龙姑娘「初瘦酒馆」

“过去了。”说完,二傻掐灭了手中的烟,站了起来,叹了口气缓缓走出酒馆。  

Cover

剩暖渣、初瘦——三十一周岁再话

王初瘦今年**三十一**了。 岁月像一把杀猪刀,初瘦快要破碎他再瘦的梦。初瘦总会自嘲说,心宽体胖。可是只有傻子才看不出来吧,他那些沉稳,是被现实磨平的棱角。 虽然我也很了解初瘦,但还是很难去形容他究竟是一个怎样的人,最后总结出来三个字——**剩**、**暖**、**渣**。 ## 剩 三十有一,孤苦无依。没错,我应该尊称初瘦为大龄剩男了。 > 等公交的人,等的是去往正确目的地的那辆车,哪怕晚点了,也要等。而不是在某个时间点,看哪辆进站,就上哪辆车。 或许吧,这可以成为他狡辩的借口。可正常而言,到这个岁数他还没有结婚,我觉得他多多少少还是……很有问题的。书没读好,钱没挣到,没让父母过得好,喜欢的人也没留住,就连深夜安慰自己都不会。 他对我说过好多次——“这人生呐,有点大风大浪不算什么,哪能没点坎坷呢,如果什么事情都一帆风顺的,那这样的生活,应该也挺没劲的吧。” 有了房子不一定就有家,该剩下还是剩下。用两手抠都快数不过来初瘦有过几段感情经历了,如果他还是个精神小伙儿,或许勉强还可以在狐朋狗友面前炫耀一番,但都一三十多岁的老大叔了,只能把失败一词套在他身上了。像初瘦他这个年纪的朋友,大多孩子都会打酱油了。面对周围诸多「人生赢家」,没有成家已经很失败了。立业成家,成家立业。这孑然一身倒也不算什么,相较于**一事无成**、**一无所有**,他反反复复在低谷中挣扎着。 > 越聪明就越悲伤,悲伤随着聪明而增长。——《安德烈·卢布廖夫》 剩下来的原因,以及他一事无成的原因,我无从得知。我知道的一点,就是并不是他不努力。相反的,他已经比很多人更努力了。他告诉过我,苦难并不会让人成功,人应该吃奋斗的苦,而不是生活的苦。 emmmm,但是生活喂来给他,不吃也得吃啊。房贷、车贷、工作,不给他喘息的余地。祝愿他早一点摆脱这样的窘境吧。 ## 暖 初瘦他吖,曾经也是个看见姑娘都会脸红,到后来却能随口开车的人。没毕业那会儿,像他这样庸俗的人,从不喜欢装深沉,直来直往,不拘小节。慢慢地,话少了,沉稳了,细致了。 年轻的时候,他确实脾气臭,不细致,不会体谅人,还没有耐心。经历过失去,才更懂得珍惜。没有经历过撕心裂肺的伤痛,应该就不会知道要收起锋利的羽翼,温柔善待;没有过义无反顾奋不顾身的尝试,应该就不会知道细节对成败的决定性因素,细致耐心。**没有人天生温柔**,也许失去和错过,成就了成长。 他属于乐观的人,同时也是个很没有安全感的人,一个矛盾的综合体。或许只是死要面子活受罪,他总是想把最好的一面示人,哪怕是亲近的人。不想被怜悯,无论多苦,能自己扛住的,就自己默默承受。像蜡烛,炙热,奋不顾身。 > 所谓,一见钟情只不过是见色起意,所谓日久生情不过是权衡利弊。 难怪初瘦这人,仅第一印象就足以沉沦,付出而不计得失。听初瘦自己说,他泪点很低,虽然很少有人见到。他的原话形容自己“常在别人的故事里,流着自己的眼泪。”他向来很认真,所以我也就没有问过他,认真会不会也输得很惨。 也还有人说初瘦冷漠无情,其实我能理解,毕竟不是中央空调,他也没啥必要对谁都发光发热。我也不大明白,像他这样莫名其妙的人,会不会有人心疼? ## 渣 上学的那会儿,初瘦坚持会写写文字。他总是说自己是个没有秘密的人,心里藏不住事情,也不愿意两面三刀。很多琐碎的情绪都能从他的文字中觉察,喜怒哀乐也全部挂在脸上。 不忘初心,方得始终;初心易得,始终难守。我也不记得从什么开始,也许是一瞬间,也或许是潜移默化中,他**偏离**了原有的人设。如那些放荡不羁的人儿,都和这世界潦草地和解了。这应该并不算多渣,只不过向现实低了头,很多时候**言不由衷**,**身不由己**。 > 都说双子最多情,但不限于初瘦一个人吧,渣男都一个样,恨不得见一个爱一个。 > > 又有说双子看似多情,其实是最薄情的。 表面上初瘦是个没心没肺的渣男,轻描淡写地跟我提过被辜负的往事,也闭口不谈辜负过的罪孽。我的感觉应该是他罪孽深重,活该单身吧。反正他从来不肯面对现实,承认自己很渣就是了。他苦笑着跟我说——“情非得已。”  

Cover

中年人就该有勇气面对过去的自己

这篇文字与罗永浩无关,只是觉得这个标题比较贴切我目前的状态。 提笔忘字,不禁想起这么一句话:“一日不读书,无人看得出;一周不读书,开始会爆粗;一月不读书,智商输给猪。” 已经不记得多久没有写些文字了,也许是被岁月磨平了个性,平日里所有的形容都用一句卧槽可以表达。细想想,这么个状态,已经持续了两年了吧。 过往如云烟,却历历在目。两年半前在当时公司附近买了房子;两年前的这个时候,也第一次随着自己的心意买了一台限量版小车。似乎生活慢慢步入了正轨,却又在一瞬间跌入谷底。成年人的崩溃,总是悄无声息。 ![懂事崩](https://user-images.githubusercontent.com/1890238/78338149-d07b4200-75c4-11ea-82b8-67182681ed13.jpg) > “真正成熟的大人有勇气成为别人的过去” 不得不说的是,这两年的时间,算是人生中最艰难的两年。其实很多朋友同事甚至亲人都不能够理解。似乎就像年轻的时候那种烦恼,不说憋屈,说了矫情。但又不同,年轻时无畏无惧,大不了重头再来。而岁月催人老,不会一而再地给我一次又一次再来过的机会了。 不知道多久没有出去走走了,也许是因为疫情的影响,更多的可能应该是贫穷限制了我的行动力。最多的娱乐活动就是站在窗边,看楼下的车水马龙,以及偶尔一声引擎的嘶吼。 从小,我就有一个梦想,做一名出色的赛车手。在大学毕业之前,我最擅长的绝活便是极品飞车的雨夜山路甩尾。我一直觉得,我应该是一个被技术耽误的好司机。只有开车在路上的时候,才是身心最放松的片刻。 现在这辆车虽然很喜欢,但始终感觉还差一点意思。曾心想着一步到位,买一辆 SUV,可以全地形,但不曾想,其实越野模式一次都没有开启过。就像《活着》里的歌词一样——“我那可怜的吉普车,很久没爬山也没过河,他在这个城市里,过的很压抑。” 或许,每个男孩子心中都装着一个跑车梦吧。但随着时间的推移,慢慢埋藏到心底。记得以前看过这么一个调侃的段子:有些东西,生下来有了就有了;生下来没有,那就很难有了。 不服输,不服老,不服命运的不公,都没有用的。人生会面临一次又一次的交叉路口,或许选择不一定正确,但最好不留遗憾,不会后悔。 > 我还是从前那个少年 > > 没有一丝丝改变 > > 时间只不过是考验 > > 种在心中信念丝毫未减 其实一直以来,我的梦想之车是兰博基尼。几百万的价格,让慢慢懂事的我发现了望尘莫及。最接近它的一次,是在 18 年,SUV 车型 URUS 上市的时候。原本预计售价 130 万左右,对标玛莎拉蒂 Levante,咬紧牙关再多努力两年还是可以承受的。 结果。。。 ![urus](https://user-images.githubusercontent.com/1890238/78384363-a0f02800-760c-11ea-943a-3681d3b3d40a.jpg) 拉开了我与梦想之间的距离。紧接着又一次又一次的变故,把我逼向了低谷。以至于 `03+` 发布的时候我都没有关注。 或许 `03+` 是我离梦想最近的一部车,在我的眼里仿佛一台西装暴徒,吸引住了我这颗年轻而又骚动的心。 因为限量发售,所以关注了一段时间之后觉得可能与它无缘了。今年的 3 月 16 号,又发售了一批(性能版仅`80`台),我在前一天看到新闻,叫上了俩朋友一起抢,侥幸抢到了三台。 ![03+](https://user-images.githubusercontent.com/1890238/78207202-92522580-74d3-11ea-81e9-cb2d39bdbc8d.jpg) 订单号 60666,或许会是一个好兆头。再配一个 666 的车牌号,就更棒了。 低下头,摸摸自己的口袋,要不起。不得已,我想应该只能跟我的老伙计 01 时间限量版告别了。我很喜欢以前这台 01,虽然陪我的日子并不长,刚到两年。 都说是“成年人从来不做选择题,我都要!”可惜的是,囊中羞涩。 这两天看到新闻评价罗永浩直播带货说:“中年人就该有勇气面对过去的自己。”马上人到中年的我,虽然又走向了一事无成的边缘,但这就是人生呐。生命不息,折腾不止。 再不疯狂我们就老了。比起一成不变,我更喜欢追求新鲜刺激的事物。01 就像是一个老好人,哪哪都好,但就是过于安分。03+就像是一个心态年轻的中年人,可以在有限的范围内放肆,也可以规矩本分。 所以这个决定虽然很艰难,但我并不会后悔。 还好,现在也不需要考虑车子的空间,毕竟也没孩子,A 级车足够了。毕竟一台车,也不能陪伴多少年,以后真有需要的时候再做打算吧。 脚踏实地,迟早还是会把生活、工作再扭回正轨的。 文末提醒一句:道路千万条,安全第一条;行车不规范,亲人两行泪。  

Cover

Nuxtpress - Node.js 动态网站静态化之路

相信 Hexo、Ghost、WordPress 等常见的开源内容框架对于很多人来说都不陌生。 

Cover

说来有点可笑,听了你可别哭

最近从 11.17 华为发售 Mate 20 RS 以来,我已经抢了无数次,没有抢到。 

Cover

愉快地使用 ElementoryOS 5 玩耍

 

Cover

初瘦与那些他的三观不正的杂念

初瘦,在我老家的土话里是跟禽兽一个意思。用以自嘲坏事做多,所以总是在跟病魔做抗争。同时,文雅一点的说辞就是,想当初,也瘦过。 

Cover

开篇:你好,世界!

不能免俗。第一篇文章依然是 “Hello World!”作为技术人的标配,前前后后 N 个博客也都是以此作为序章。 

Cover

VSCode 配置 Webpack 路径提示及智能跳转

 

Cover

创意分享:Redis 客户端

我在 iPad 上买过两个: - Redis Touch(6 元) - RedisFly (24 元) 但这两个都不支持 SSH 登录,让我很尴尬。 ## 第一步,分析:实现设想 没考虑原生方式,原因很简单,不会。 最初的设想是直接封装一个 Hybrid App,用 js 实现。 但搜索了一圈,好像没有什么方案可以直接在前端去连接 ssh 服务器的。 那么就需要服务器作为中转,将客户端的请求采用 ssh 连接进行透传,然后保持连接,并抛出 RESTful 或 Websocket 接口。 ## 第二步,应用架构 最终用户使用的网络传输过程大概是这样子的: ![redis-app.svg](./_attachment/redis-app.svg) ```sequence 客户端->应用服务器: 普通接口调用 应用服务器->用户服务器: ssh 连接 redis Note right of 应用服务器: 抛出接口 用户服务器-->应用服务器: 返回结果 应用服务器-->客户端: 返回结果 ``` ## 第三步,筹备 TODO List: - [ ] 设计 UI 原型 - [ ] 服务器端 ssh 连接 - [ ] 服务器端接口设计 - [ ] 开发客户端上层应用 - [ ] 进行测试发布 - [ ] 服务器优化,以允许更高并发客户端连接  

Cover

创意分享:Github/Coding 聚合客户端

## 为什么需要一个聚合的客户端 举个栗子,之前微博类产品风靡的时候,有很多类似的产品,如:腾讯微博、新浪微博、饭否、Twitter……那么,就可能会发生这样的一个现象,手机上装了一大堆类似的 APP,然后用个文件夹放到一起。 实际上大多数也确实这么做了。切换不同的 APP,去刷内容不同但本质相近的微博消息。 同样,目前我在我的手机上各自装了 Coding.net 和 GitHub(GitPoint)客户端。 而最近,我在入手 iPad Pro 之后,发现 Cdoing 并没有对应的 iPad 客户端,从而萌生了这样的一个点子。 ## 第一步,分析 从技术实现的角度来讲,并不复杂。 因为它们都是代码管理平台,功能相近,有着许多共同之处,随便列举一些: - 都是通过 OAuth 进行鉴权 - 大多数都功能重叠,如:用户,项目,组织(团队),关注,ISSUE…… ## 第二步,设计接口逻辑架构 ![api.svg](./_attachment/api.svg) ```mermaid graph TD APP[应用层]-->INTERFACE(封装统一接口) INTERFACE-->|抛出参数一致|CODING[封装Coding API] INTERFACE-->|抛出参数一致|GITHUB[封装Github API] ``` ### 以 Star 一个项目为例 根据操作的类型进行判断,接口参数里带入类型即可。 ![star-project.svg](./_attachment/star-project.svg) ```sequence Action->Interface: 关注github\nwillin/leader.js.cool Interface->Github: 调用关注 Note right of Github: 抛出接口一致 Interface-->Action: 返回结果 Action->Interface: 关注coding\nwillin/leader.js.cool Interface->Coding: 调用关注 Interface-->Action: 返回结果 ``` ### 第三步,筹备 TODO List: - [ ] 整理完整的功能清单(包括相同功能和两个平台差异性功能) - [ ] 设计 UI 原型(两者的客户端可以选择一个作为主体风格,或者重新设计) - [ ] 封装底层接口 - [ ] 开发上层应用 - [ ] 进行测试发布  

Cover

iPad 开发/高效应用列表

 

Cover

Docsify 画图建模 Mermaid 插件支持

 

Cover

优雅地使用平板进行远程OS X编码开发

 

Cover

国内可备案域名后缀及价格列表

 

Cover

2017.02.22 团队·经济·团队经济

 

Cover

前端阅读体验优化-GitBook自动换肤

 

Cover

MX Master Mac配置推荐

 

Cover

2016.06.20 我们都在乞讨

 

Cover

浮云淡、解甲——二十七周岁沉思

 

Cover

Gitbook 捐赠打赏插件

 

Cover

JS 判断一个数是否为 2 的 N 次幂

问题: > 判断一个数(x)是否为 2 的 N 次幂,如果是,返回是 2^n 中的 n,如果不是返回 false 约束: `x <= 2^800` ## SB 青年版 不用说,递归肯定是最 sb 的版本: ```js function power2sb(x, n) { n = n || 0; if (x === 1) { return n; } if (x < 1) { return false; } return power2sb(x / 2, n + 1); } ``` 结果测试: ```js console.log(power2sb(4)); // 2 console.log(power2sb(5)); // false console.log(power2sb(65536)); // 16 console.log(power2sb(Math.pow(2, 52) + 1)); // false console.log(power2sb(Math.pow(2, 53) + 1)); // false 实际结果:53 ``` ## LowB 青年版 低级循环版,与上一个版本半斤八两。 ```js function power2lb(x) { var n = 0; while (x >= 1) { if (x === 1) { return n; } x = x / 2; n++; } return false; } ``` 结果测试: ```js console.log(power2lb(4)); // 2 console.log(power2lb(5)); // false console.log(power2lb(65536)); // 16 console.log(power2lb(Math.pow(2, 52) + 1)); // false console.log(power2lb(Math.pow(2, 53) + 1)); // false 实际结果:53 ``` ## 普通青年版 ```js function power2nm(x) { // 奇数肯定不是2的N次幂 if (x % 2 === 1) { return false; } // 总结规律 // 2^2=4 // 2^3=8 // 2^4=16 // 2^5=32 // 2^6=64 // 2^7=128 // 2^8=256 // 2^9=512 // 所以,个位不可能为 0 if (x % 10 === 0) { return false; } var n = 0; while (x >= 1) { if (x === 1) { return n; } x = x / 2; n++; } return false; } ``` ## 文艺青年版 位运算,无循环。 ```js function power2fs(x) { // 一句话版本 return (x & (x - 1)) === 0 ? (x - 1).toString(2).length : false; /* 解释: 1. (x & ( x - 1)) === 0 先来寻找一下规律: 2^2=4 对应二进制为 100 2^3=8 1000 2^4=16 10000 所以, 2^N=1+N个0 2^N-1=N个1 100 & 11  

Cover

入手新域名 js.cool

 

Cover

Node.js阿里云接口(Aliyun API)SDK

 

Cover

2016.4.1 不要当傻瓜

## 不要让自己当傻瓜 在研发团队中,有两种常见类型的傻瓜。一种是一心钻技术,技术再深,在产品中无用武之地;另一种是一心构想理想化的产品,产品再宏大,无法被现有技术实现。 技术不是万能的,所有的技术都需要落地为产品,才能创造价值。技术就像是高楼之根基,得打下去,楼才能稳固;但却没有人能看到根基的样子。技术也像是内裤,得穿在身上,但不能逢人就扒出来展示一番。之所以会有鼓吹人人都是产品经理,却没有人推崇人人都是技术经理,人人都是架构师,人人都是算法工程师,就是这样的一个道理。 产品设计和技术研发是紧密关联的,很多技术人或产品人无法进步的瓶颈就在于坐井观天,固步自封。如果跳出技术的范畴去看产品,跳出产品的视野去谈技术,会有意外的收获。 技术并不需要钻研多深,能够满足产品的所有需求即可。产品也不需要功能多全,能够切实解决用户的某一痛点即可。在此基础之上,多余的部分,才能产出额外价值。 ## 不要把用户当傻瓜 其实对待客户,无论是当成傻瓜,还是当成上帝,都需要真诚。技术服务于产品,产品服务于用户,最终都是要让用户成为受益者。所以,做产品需要有同理心,不能搪塞,做可持续的产品,而不是一次性买卖。 哪怕用户真的是傻瓜,不是用来骗的,也应该要把用户当傻瓜宠。如果一个产品需要考验用户的记忆力,挑战用户的智商才能玩转,怎么会是一个好产品?一个连自己都不愿用的产品,拿出去卖的话可能都会挂不住脸。 迈出第一步,产品设计要合理。举个例子,大多数产品都会有按键,按键的个数和按键的功能都是有讲究的。比如为了缩减按键的个数,增加了每个按键的功能,导致有重叠,用户就需要靠记忆去记同一个按键,按多少下表示什么样的意义,就容易产生误操作。有一个很糟糕的设计案例就是一个按钮同时分到了四五种功能,有的要连按 5 次甚至 10 次,不仅浪费了记忆成本,还浪费了用户操作时间成本。显然,不能自诩这样的产品能够帮助用户培养耐心。 进阶,将合理的设计更贴心。比如常见的电子设备重置键大多是一个孔,需要用针或者其他尖细的东西捅进去才行。往往我们需要重置的时候,并不会用这么一样顺手的工具在身边。像苹果或一些手机,取 Sim 卡需要的卡针会随机赠送,但实际上可以再进一步,如果可以轻轻按压一下就自动弹出,不用任何工具,那将会更方便。当然其中也需要综合考虑一下美观、是否能够实现等因素。尽可能减少用户的麻烦,方便用户,为用户引导良好的行为和习惯,才会更受用户青睐。  

Cover

2016.3.29 新木桶原理

 

Cover

MySQL 跨表数据同步优化

 

Cover

2016.2.29 人为什么活着

 

Cover

Hexo 文章阅读时长预计

 

Cover

2016.01.27 治国

之前听过这么一个段子,说一个人跳槽,无非只有这么**两点**动机。 ## 钱,少了。 > 王者之国,使人民富裕;霸者之国,使士富裕;仅存之国,使大夫富裕;无道之国,国库富裕。——姜子牙 很多时候,我不是很明白,工作那么拼命到底是为什么。包括我自己,身边的很多人都很努力,却都很可悲。流光容易把人抛,红了樱桃,绿了芭蕉。累死累活,把自己拖垮了,低头看看瘪瘪的钱包,基本上还是一无所有。 那么多年,我们究竟努力把钱塞满了谁的口袋? ## 心,累了。 > 域民不以封疆之界,固国不以山溪之险,威天下不以兵革之利。得道者多助,失道者寡助。寡助之至,亲戚畔之。多助之至,天下顺之。——《孟子·公孙丑下》 一种情况,是失人心。做到因势而谋、应势而动、顺势而为,或许是一件很容易的事情。但总是逆势而行,或恐回天乏力,神仙难救。 > 丘也闻有国有家者,不患寡而患不均,不患贫而患不安。盖均无贫,和无寡,安无倾。夫如是,故远人不服,则修文德以来之。既来之,则安之。——《论语·季氏》 另一种情况,是失公正。公是公平,正是正义。若私心太重,罔顾客观事实,所及之处,人心不服。 故有 **_依道不依势、依志不依力_** <i className="fa fa-check-square-o"></i>之说。  

Cover

js版 Leetcode Single Number

 

Cover

2016.01.05 多面世界

 

Cover

2016.1.2 月捐停止

 

Cover

2016.1.1 搬家

 

Cover

Hexo 文章计数插件 WordCount

灵感来自[简书](http://www.jianshu.com/users/6c72e78080ff)。 字数统计的结果跟简书有差异,主要是由于本插件只统计了中文字数和英文单词数,所以结果会比简书统计的字数略少一些。 特别适合文字爱好者,比如我。 [![npm](https://img.shields.io/npm/dm/hexo-wordcount.svg)](https://npmjs.org/package/hexo-wordcount) [![npm](https://img.shields.io/npm/dt/hexo-wordcount.svg)](https://npmjs.org/package/hexo-wordcount) 项目地址: [https://npmjs.org/package/hexo-wordcount](https://npmjs.org/package/hexo-wordcount) ## 安装和使用 ### 安装 ``` npm i --save hexo-wordcount ``` ### 使用 修改`Themes`模板文件,在`Post`文章模板区域加入: ``` <span class="post-count">{{ wordcount(post.content) }}</span> ``` 即可统计单篇文章的字数。 ``` <span class="post-count">{{ totalcount(site) }}</span> ``` 上面这句是统计总字数的,可以放到`Footer`或其他位置里。  

Cover

待重头、涅槃——二十六周岁思绪

如果你今天没有努力,明天就不会成功。 ## 风格 很久没有记录文字,摸起键盘已经不知道该说些什么。我已经忘记了自己曾要做一个诗人,做一个小说作家。翻看回这几年来每一年写的东西,没能让自己读完,太过于悲观,或许是人生中最坎坷曲折的几个年头,但更多的,只是宣泄。就像不知道从什么时候开始,连自己都不愿意看到镜子里的自己,又胖,又黑,这也就罢了,感觉还越来越丑了。 一直在围绕`生活`、`事业`、`爱情`来开展,似乎也是时候换一种风格了。 ## 进展(Progress) - 我达到的程度 在非技术领域涉猎广泛,尤其对经济学、心理学、物联网产业和产品、用户体验等各个方面。 呵呵,像上面这种废话就没什么说的必要了。虽然确实是事实。 现实和理想还是有差距的。去衡量一个人一段时间提升了多少,最好的方法就是去衡量他创造了多说价值,以及给亲友带来多少便利。换言之,我做的很多事情并没有什么价值,并与我设想的相差甚远。总体来说,做的事情大多是很简单的,简单的事情我完成得也算不错。 说来惭愧,每天挣扎在各种简单没有技术含量的事情中,大多做出来的成果也无非就是把一件简单的事情换另一种更简单的方法实现。而我渴望着,更大的困境和挑战。 ## 过程(Process) - 我在做的事情 不用多说也知道,一直是在做一些服务器相关的事情,目前主要是在做 Open API 平台和后台管理系统。关键词: DevOps、全栈、算法、性能、安全、并发、数据处理。 正如我刚说的,实际上做的事情都是在重复一些简单过程。是时候做出一些改变了,尝试一些新事物,和一些新创意。 除了主要工作,排在首位的是学习如何进行团队的协作与管理,这是一个薄弱点。 工作之外的事情,并没有什么好消息。 ## 计划(Program) - 我可能会去尝试 我又不是英雄,拯救世界我做不来。 在路上,做的都是为了先给自己一个更好的世界,给爱的人一个更好的世界,然后,才可能是给这个世界一个更好的世界。 这里有一份代办事项清单(未来的一年内): 1. **读一些书。**其实今年已经又买了很多,但因为很忙还没读完,如一些幽默故事,诗歌,技术等相关的。 2. **一场远行。**暂定 1000KM 之外。 3. **复习英语。**落下了很久,已经生疏了。 4. **一次升职。**然后给自己定更高的目标。 5. **改善生活习惯。**健康的身体,革命的本钱。 6. **一段感情。**一起步入爱情的坟墓。 或许并不算一件难事,建立一个家,积攒起匮乏的安全感。当然也不是那么简单的一件事。 ## 结束亦是开始 记忆总是泛着一丝苦味,所以谈起的时候再努力也会显得有些消极,但实际上,面对未来,我是很乐观的人。我喜欢计划,也有明确的方向感。 写到这里的时候我扫视了一遍前文,宠辱不惊的感觉并不喜欢,实际在过去的一年里,喜悲不断。那就少写一点吧,多做一些实事。 不求做伟大的人,却要做大写的人,这就是我。  

Cover

js版 Leetcode接受率最低题valid-number

 

Cover

js版Leetcode第一难题wildcard-matching

 

Cover

js版 Leetcode spiral-matrix-ii

 

Cover

API接口性能统计之平均响应时间算法

 

Cover

日本雅虎程序员跳槽程序测试问题

 

Cover

2014年终总结(物联)

 

Cover

卸载 Mac 默认的 Xcode 附带的 git

 

Cover

志难酬、虚妄——二十五周岁放诞

人生天地之间,若白驹过隙,忽然而已。 不知不觉又是一个春夏,没有记录太多。虽是奔着多做事、少放屁,但也还是未见精进。  

Cover

言有尽、蹉跎——二十四周岁自嘲

如果好久没有消息,那一定是过得不好。 是的,混得不是很好,甚至都懒得写些什么了,无论是记录心迹,还是技术相关。 转瞬间,毕业一年了。  

Cover

北京,我将要离开你。挥别66脑

其实我不怎么喜欢北京,不是因为北京的人情不好,而是这里的环境太恶劣了。自从来了这里,每天都是在拉肚子中度过,每次刷牙都是满嘴的血沫子,指甲盖也劈了好几次。 终于,我选择了离开北京。也离开我现在所在的团队。我们的团队是一群很出色的人聚集的团队,我们的产品却一直迟迟没有上线。作为技术合伙人,我和经理华东在对产品的定位上有着很大的偏差。人生嘛难免有分歧,谁都是有理想有抱负的人。完美的东西,我们谁都想追求,只是代价太高,时间太长。只是歧路坎坷,没有必要太过计较对与错。我尊重华东,更尊重华东想要的完美产品,只是我的能力给不了他。所以,也差不多该是离开的时候了。  

Cover

离别赠言·给连云港电子口岸的发展建议

从六月份来到 EDI,到九月份离开,仅有短暂的三个月时间。感谢领导,和各位同事,在这段时间里,给与我的照顾与教诲。常言道,言多必失,少说话多做事。但就要离开了,我想把这段时间总结的一些心得建议反馈给领导,仅代表个人的意见,望领导能批评指正。  

Cover

理还乱、浮沉——二十三周岁反思

Shown off, Shone out. 想自己闪耀,就得想到燃烧殆尽的那一刻。 A bit blundering, then a bit elbowed. 每一丝浮躁,都会换来一丝排挤。  

Cover

照无眠、荏苒——二十二周岁碎念

也许我看着很牛 B,或者装着很牛 B,其实很 SB。 我不想为自己辩解什么,其实我很庸俗,甚至可以说,是恶俗。  

Cover

道不尽、流年——二十周岁感言

我 21 岁了,不仅未能顶天立地,甚至还没找到属于自己的位置。 总结这 20 年,主要是生活、爱情、事业三个方面。