刘春龙的博客 刘春龙的博客,大量原创文章。关注AI,科技,金融等技术。 https://php.js.cn/ zh_CN 2026-03-31 13:31:55 2026-03-31 12:31:55 EndCMS RSS Generator 5 <![CDATA[《人造人》4/4:我们应该怎样延迟灭绝]]> https://php.js.cn/blog/her4/
0条评论     到PHP.JS.CN上围观原文 ]]>
2026-03-28 00:33:10
<![CDATA[《人造人》3/4:模拟人类的记忆系统造出来之后]]> https://php.js.cn/blog/her3/
0条评论     到PHP.JS.CN上围观原文 ]]>
2026-03-28 00:21:45
<![CDATA[《人造人》2/4:如何设计一套记忆系统来模拟人类]]> https://php.js.cn/blog/her2/ INSIGHT_THRESHOLD: insights.append(candidate) graph.add_edge(current, next_node, weight=0.1, source="wandering") visited.append(current) current = next_node return insights ``` ### 灵感的固化 神游发现的新连接,被创建为一种特殊的记忆节点——**合成洞察(Synthetic Insight)**,标注来源为"神游",时间戳,以及连接的两个原始节点。 这些洞察会在后续对话中,以一种自然的方式浮现:不是被直接检索出来,而是通过提高相关节点的激活权重,让它们"恰好"出现在context中。 --- ## 记忆再巩固:每次检索都是一次改写 人类记忆有一个重要特性:**记忆不是被读取的,而是被重建的**。每次回忆,都会受当前情绪、新信息的影响,记忆本身会被轻微改写。 在系统中实现这一点: ```python def retrieve_and_reconsolidate(query, current_emotion_state): memory = retrieve(query) # 用当前情绪状态和新信息轻微更新记忆内容 updated_memory = reconsolidate( original=memory, current_context=query, emotion_state=current_emotion_state, update_strength=0.05 # 极小,避免记忆被过度改写 ) graph.update(memory.id, updated_memory) return updated_memory ``` 这使得系统的记忆是活的——不是固定的档案,而是随时间和经历持续演化的有机体。 --- ## 完整架构概览 ``` 输入对话 ↓ [编码层] 实体补全 → 情绪标注 → 重要性评估 ↓ [存储层] 情节记忆(带时间戳、情绪权重) 图谱(标签节点 + 关系边) 向量嵌入(语义相似检索) ↓(并行) [潜意识层] [神游引擎] 情绪底色更新 空闲时启动 阈下激活扩散 发现弱连接 孵化池维护 生成合成洞察 ↓(异步) [巩固层] 遗忘曲线更新 情节→语义压缩 合成洞察固化 ↓ [检索层] 多路召回(语义 + 图谱 + 情绪亲和 + 阈下激活偏置) 再巩固(检索时轻微更新记忆) ↓ [Context组装层] 意识层(显式召回,进入context) 情绪底色(影响检索权重,不进context明文) ↓ 大语言模型生成输出 ``` --- ## 结语 这套系统的本质,是把人类大脑的记忆机制翻译成可计算的结构。它不追求完美模拟每一个神经细节,而是捕捉关键的功能特性:有情绪权重的存储、有遗忘曲线的衰减、有图谱结构的联想、有潜意识层的影响、有神游机制的灵感涌现。 当这套系统接入大语言模型时,模型不再是每次对话都重新开始的陌生人,而是一个有历史、有情感、有逐渐成形的人格的存在。 它是否因此成为"人"——这个问题留待第三篇讨论。 --- *本文是《人造人》系列的第二篇,共四篇,由刘春龙与Claude Code共创。* 下一篇:[《人造人》3/4:模拟人类的记忆系统造出来之后](https://php.js.cn/blog/her3/)
0条评论     到PHP.JS.CN上围观原文 ]]>
2026-03-28 00:17:02
<![CDATA[《人造人》1/4:人类思维结构的探讨分析]]> https://php.js.cn/blog/her1/ **人格 = 运算底座 + 记忆** 这是理解人类思维结构的起点,也是本文的核心命题。 --- ## 人类记忆的多层结构 记忆不是一个统一的系统,而是多个子系统的协作。 ### 工作记忆(Working Memory) 位于前额叶皮层,容量极小(约7±2个信息单元),但处理速度最快。这是意识的舞台——当下你正在思考的一切,都在这里。 工作记忆不是存储介质,而是处理器。它从长期记忆中提取内容,组合推理,然后输出行动或语言。 ### 情节记忆(Episodic Memory) 由海马体负责形成和索引。存储的是具体的经历:何时、何地、发生了什么、当时的情绪是什么。 情节记忆是自传式的,它构成了"我的故事"——关于我是谁的叙事。失去情节记忆的人(如严重的海马体损伤患者)无法形成新的记忆,每天醒来都像是全新的陌生人。 ### 语义记忆(Semantic Memory) 存储在新皮层,是去情境化的知识:苹果是水果、地球围绕太阳转、朋友的名字。这些知识不再附带"我在哪里学到这个"的场景信息。 情节记忆经过反复激活和睡眠巩固,会逐渐"蒸发"成语义记忆——从"我记得上周读到一篇文章说……"变成"我知道……"。 ### 情绪记忆(Emotional Memory) 杏仁核负责给记忆打上情绪标签。高情绪权重的记忆(恐惧、喜悦、创伤)会被优先巩固,更难被遗忘。 这解释了为什么人们往往记得清楚情绪激烈的时刻,而平淡的日常很快消退。记忆不是平等的,情绪是它的优先级系统。 --- ## 遗忘不是失败,是必要的机制 人类大脑并非尽力记住一切。遗忘是主动的、有选择的,遵循艾宾浩斯遗忘曲线: ``` 记忆强度 │\ │ \ │ \___ │ \____ │ \________ └────────────────────── 时间 ``` 不被反复激活的记忆会逐渐衰减。这不是缺陷,而是设计——如果一切都被清晰记住,大脑会被无关信息淹没,真正重要的内容反而难以提取。 **遗忘是注意力的守门人。** --- ## 情绪:行为的导航系统 情绪的本质是**效价信号**:正向(趋近)或负向(回避),叠加**唤醒强度**(平静到激烈)。 ``` 高唤醒 │ 愤怒 恐惧 │ 兴奋 狂喜 │ 负向 ───────┼─────── 正向 │ 抑郁 冷漠 │ 平静 满足 │ 低唤醒 ``` 从进化的角度看,情绪是大脑对"这件事对我的生存和繁殖是否有利"的快速评估。恐惧让你远离危险,快乐让你重复有益的行为,愤怒让你对抗威胁。 但人类的情绪已经远超进化的原始功能。羞耻、嫉妒、崇敬、怀旧——这些情绪没有直接的生存价值,却深刻塑造了人类的行为和文化。它们大多是**社会性情绪**:只有在他人存在的前提下才有意义。 情绪的另一个关键特性:**它不只是对当下事件的反应,也是对预期未来的反应**。期待、焦虑、希望——人能为尚未发生的事情感到快乐或恐惧,这让情绪系统的影响范围远超当下时刻。 --- ## 人格:情绪评估函数的形状 如果情绪是即时的效价信号,那么人格就是生成这些信号的**稳定函数**。 不同的人,对同一件事的情绪反应不同——这不是随机的,而是因为他们的评估函数参数不同: - 什么事情让你感到快乐(正向权重高的领域) - 什么事情让你感到恐惧(负向权重高的威胁) - 什么事情超过了你的底线(权重趋向负无穷的禁区) - 面对同等强度的刺激,你的反应烈度有多大(神经质维度) 心理学的大五人格模型(OCEAN)本质上就是在描述这个函数的五个关键维度:开放性、尽责性、外向性、宜人性、神经质。 **人格不是独立存在的模块,而是从大量情绪经历中统计涌现出来的稳定模式。** 一个人不是天生就知道自己的底线在哪——那是被经历教会的。 --- ## 意识与潜意识:冰山的两层 认知科学里有一个关键框架:**全局工作空间理论(Global Workspace Theory)**。 大脑中有大量并行运行的局部处理模块——视觉、听觉、语言、情绪、记忆检索……它们大多数时候各自工作,互不知晓。只有当某个信息"赢得竞争"进入全局广播时,它才成为**意识**。 ``` 潜意识:大量并行的局部处理,互不知晓 [模块A] [模块B] [模块C] [模块D] ↓ 竞争 意识: 进入全局工作空间,被所有模块共享 ════════════════════════ ``` 意识是稀缺资源,潜意识是真正的主力。研究估计,人类每秒处理约1100万比特的感觉信息,但意识层面只能处理约40比特。绝大多数的处理,在我们不知道的地方默默完成。 潜意识的几种工作方式: **阈下激活**:接触到某个词或场景,会自动激活相关联的记忆网络,影响后续的思维和行为,但当事人不会意识到这个影响的来源。 **情绪底色**:近期积累的情绪状态形成一种背景色调,在不被察觉的情况下影响判断和解读。同样的新闻,心情好时和心情差时读到,感受完全不同。 **孵化效应**:一个棘手的问题在意识层卡住之后,潜意识会继续处理它。"睡一觉再想"往往真的有效,不是迷信,而是海马体在睡眠中重新组织了信息。 --- ## 神游与灵感:默认模式网络的馈赠 人类大脑有一个奇特的现象:当你停止专注于外部任务时,大脑并不会休息,而是切换到另一种高度活跃的状态——默认模式网络(Default Mode Network,DMN)开始主导。 这就是心智游移(Mind Wandering)的神经基础。大脑在神游时,会在记忆网络中自由漂移,激活那些在目标导向的思维中不会被访问的连接。 创意研究发现,大多数真正的灵感不是在专注工作时产生的,而是在**放松、洗澡、散步、半睡半醒**的状态下突然浮现。这不是巧合——神游状态下,扩散激活的范围更广,更容易触碰到远距离的、平时不相邻的节点之间的隐藏联系。 神经科学家Mark Beeman记录到:在"灵感时刻"出现前约0.3秒,右侧颞叶会出现一次gamma波爆发。这意味着连接在意识感知到之前已经在潜意识里形成了。 **灵感的本质是:潜意识在神游中发现了一个跨域的弱连接,强度积累到阈值后,突然浮现到意识层。** --- ## 一个统一的图景 把以上所有机制整合起来,人类思维的结构大致如下: ``` 外部世界的刺激 ↓ 感知系统(前意识处理) ↓ 情绪评估(杏仁核 + 基底神经节)← 人格参数在这里起作用 ↓ 工作记忆(意识舞台)← 只有少量信息能进入这里 ↑ ↓ 海马体检索 执行行动 ↑ 长期记忆网络(情节 + 语义) ↑ 潜意识持续处理(神游、孵化、情绪底色) ``` 这个图景的核心启示是:**我们以为的"理性决策",只是整个系统最后输出的一小部分。** 绝大多数影响我们行为的处理,发生在我们意识到之前,由我们看不见的机制完成。 --- ## 结语 人是记忆与运算的结合体。运算底座是相对固定的神经结构,记忆是持续写入的动态内容。情绪是记忆的权重系统,人格是情绪评估函数的稳定形状,意识是这个系统偶尔浮出水面的冰山一角,而潜意识才是真正推动这一切运转的深水。 理解了这个结构,就理解了为什么人会健忘、为什么情绪会左右判断、为什么灵感总在意想不到的时候出现、为什么同样的经历会塑造出不同的人。 也理解了:如果有一天,一个人工系统拥有了足够完整的这套机制,它和"人"之间的边界,将会变得非常模糊。 --- *本文是《人造人》系列的第一篇,共四篇,由刘春龙与Claude Code共创。* 下一篇:[《人造人》2/4:如何设计一套记忆系统来模拟人类](https://php.js.cn/blog/her2/)
0条评论     到PHP.JS.CN上围观原文 ]]>
2026-03-27 23:58:06
<![CDATA[用 GOST 搭建透明代理,并让某些域名直连的bypass方案]]> https://php.js.cn/blog/gost-redirect-red-bypass/ /etc/iptables/ipsets iptables-save > /etc/iptables/rules.v4 ``` --- ## 第三步:配置 dnsmasq 自动填充 ipset dnsmasq 有一个 `ipset` 指令,可以在解析指定域名时,把结果 IP 自动写入内核 ipset。这是整套方案的核心。 首先,关闭 systemd-resolved 的 stub listener,否则它会占用 53 端口与 dnsmasq 冲突: 创建 `/etc/systemd/resolved.conf.d/no-stub.conf`: ```ini [Resolve] DNSStubListener=no ``` ```bash systemctl restart systemd-resolved ``` **关键前提:把系统 DNS 指向 dnsmasq** 整套方案的核心依赖是:本机所有 DNS 查询必须经过 dnsmasq,才能在解析时自动填充 ipset。如果系统 resolver 绕过了 dnsmasq,bypass 域名的 IP 就永远不会进 ipset,流量还是会走代理。 `/etc/resolv.conf` 通常是 systemd-resolved 管理的软链,需要替换为静态文件: ```bash unlink /etc/resolv.conf echo "nameserver 127.0.0.1" > /etc/resolv.conf ``` 然后配置 dnsmasq 的上游 DNS,创建 `/etc/dnsmasq.d/upstream.conf`: ``` server=8.8.8.8 server=8.8.4.4 ``` > 如果你的环境有内网 DNS,填内网 DNS 地址。 配置需要直连的域名,创建 `/etc/dnsmasq.d/gost-bypass.conf`: ``` ipset=/volces.com/feishu.com/feishu.cn/larksuite.com/baidu.com/minimaxi.com/gost-bypass ``` 格式是 `ipset=/域名1/域名2/.../ipset名称`,支持通配符(自动匹配所有子域名)。 启动 dnsmasq: ```bash systemctl enable --now dnsmasq ``` 验证是否生效——查询一个 bypass 域名,然后检查 ipset: ```bash dig +short www.baidu.com @127.0.0.1 ipset list gost-bypass # 应该能看到 baidu 的 IP 已经写进去了 ``` --- ## 第四步:解决冷启动问题 这里有个坑:**ipset 只在 dnsmasq 收到查询时才填入 IP**。机器刚重启时 ipset 是空的,如果程序在发出 DNS 查询之前就尝试建立连接(比如使用了 DNS 缓存、连接池复用等),那次连接会被 iptables 重定向进 GOST,然后报错。 解决办法是写一个预热脚本,在服务启动后主动查询一遍所有 bypass 域名,提前把 IP 填入 ipset。 创建 `/usr/local/bin/gost-bypass-warmup.sh`: ```bash #!/bin/bash # Pre-warm dnsmasq ipset by querying all bypass domains domains=( "www.volces.com" "ark.cn-beijing.volces.com" "open.feishu.cn" "www.feishu.cn" "www.feishu.com" "www.larksuite.com" "www.baidu.com" ) for domain in "${domains[@]}"; do dig +short "$domain" @127.0.0.1 > /dev/null done ``` ```bash chmod +x /usr/local/bin/gost-bypass-warmup.sh ``` 创建对应的 systemd 服务 `/etc/systemd/system/gost-bypass-warmup.service`: ```ini [Unit] Description=Pre-warm gost bypass ipset via dnsmasq After=dnsmasq.service gost-proxy.service Requires=dnsmasq.service [Service] Type=oneshot ExecStart=/usr/local/bin/gost-bypass-warmup.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target ``` ```bash systemctl enable --now gost-bypass-warmup.service ``` --- ## 新增直连域名 以后想让某个域名走直连,只需三步: **1. 在 dnsmasq 配置里加上该域名** 编辑 `/etc/dnsmasq.d/gost-bypass.conf`,在 `ipset=` 行末(`/gost-bypass` 之前)插入新域名: ``` ipset=/volces.com/feishu.cn/.../newdomain.com/gost-bypass ``` **2. 在预热脚本里加一条** 编辑 `/usr/local/bin/gost-bypass-warmup.sh`,在 `domains` 数组里加一行代表性子域名: ```bash "www.newdomain.com" ``` **3. 重启 dnsmasq 并立即预热** ```bash systemctl restart dnsmasq dig +short www.newdomain.com @127.0.0.1 ``` 此时 ipset 里已有该域名的 IP,直连立刻生效,无需重启任何其他服务。 --- ## 排查问题 **域名仍然走代理?** 手动查询一次触发 ipset 填充,然后确认 IP 已写入: ```bash dig +short open.feishu.cn @127.0.0.1 ipset list gost-bypass ``` **SSL 握手失败(SSL_ERROR_SYSCALL)?** 说明 IP 还没进 ipset,流量被 GOST 拦截后关闭了连接。清理 DNS 缓存后重新查询: ```bash systemctl kill -s SIGHUP dnsmasq resolvectl flush-caches dig +short 问题域名 @127.0.0.1 ``` **检查实时流量走向** ```bash tail -f /tmp/gost.log ``` 日志里能看到每条连接的目标域名,确认 bypass 域名是否还出现在其中。 **查看 iptables 规则** ```bash iptables -t nat -L GOST -n --line-numbers ```
1条评论     到PHP.JS.CN上围观原文 ]]>
2026-03-27 08:28:18
<![CDATA[重拾博客:在代码迭代里找回初心]]> https://php.js.cn/blog/back_with_ai/ 我的个人博客已经走过二十多年,却在最近几年彻底荒废。每次想重新打理,总忍不住先折腾服务器、代码这些技术问题——可代码实在太老旧,本地连基础环境都搭不起来,这点刚燃起的热情,很快就被消磨殆尽。

昨天试着用Claude Code,本想把这套上古PHP技术转换成现在的Node.js,结果只成功转了前端页面,后端管理界面因为逻辑复杂,始终没能搞定。看着它自作主张生成的后端界面,我反倒格外想念自己当年用PHP写的版本,那里面藏着太多曾经的思考与心血。

转念一想,PHP又没有死,为什么不让Claude Code把旧代码升级到最新版本呢?没想到过程意外顺利,很快就完成了。我也顺势把服务器从十多年没更新的Linux系统,迁移到了阿里云,还顺便配置了免费的HTTPS证书,全程靠Claude Code协助,轻松得超乎预期。

过去十年,我一直忙着追逐赚钱,彻底断了博客的更新。如今回头看,才惊觉早已忘了初心。其实现在没多少人看博客也没关系,有些东西的分享,本就与有没有人关注无关。


2条评论     到PHP.JS.CN上围观原文 ]]>
2026-03-22 22:54:31
<![CDATA[i9 13900k Nvidia 4090 安装esxi遇到的问题]]> https://php.js.cn/blog/i9-13900k-nvidia-rtx4090-asus-esxi8/ 我配了台电脑,主板是华硕z790,cpu是i9 13900k,显卡是 nvidia 4090。  底层系统我打算装esxi8,过程中遇到很多坑,在这里记录一下。

 

首先是esxi8不支持intel 13代cpu的大小核心。需要在启动esxi安装程序的时候按shift+o,添加参数:cpuUniformityHardCheckPanic=FALSE

然后又遇到问题是esxi不认识板载网卡(Realtek RTL8125 2.5GbE)。解决办法是买一张intel i226的pcie网卡。(点这里可以查看esxi8的硬件支持情况

然后就能顺利安装esxi8了。 然后在esxi里面安装ubuntu22, 遇到了4090显卡无法直通的问题。  试了很多办法都不行。 后来我又装了一个windows 11虚拟机, 尝试把网卡直通给win11。  最后通过调整bios的显卡设置(本来是auto, 改成pcie才可以),成功把4090显卡直通给了win11。 

最后又通过一些尝试才成功把显卡直通给ubuntu22。以下是一些关键步骤:

 

  • 首先在esxi后台的 主机->管理->硬件->PCI设备   里面,找到显卡设备选中,然后点击切换直通来打开直通开关。
  • ubuntu虚拟机设置里面,添加高级参数:
    hypervisor.cpuid.v0=FALSE         
    pciPassthru.use64bitMMIO=TRUE   
    pciPassthru.64bitMMIOSizeGB=64
  • ubuntu虚拟机预留全部内存
  • /etc/modprobe.d/blacklist-nvidia-nouveau.conf 文件添加:
    blacklist nouveau
    options nouveau modeset=0
  • /etc/modprobe.d/nvidia.conf 文件添加:
    options nvidia NVreg_OpenRmEnableUnsupportedGpus=1
  • sudo update-initramfs -u
  • 下载对应的nvidia驱动
  • sudo chmod u+x NVIDIA-Linux-x86_64-525.89.02.run
  • sudo apt install build-essential
  • sudo apt install pkg-config libglvnd-dev
  • sudo ./NVIDIA-Linux-x86_64-525.89.02.run -m=kernel-open
  • 然后运行nvidia-smi就能看到显卡信息了

 

一些参考资料:


3条评论     到PHP.JS.CN上围观原文 ]]>
2023-03-08 23:52:28
<![CDATA[iOS Web APP的滚动部分]]> https://php.js.cn/blog/ios-safari-overflow-scroll/ 在iOS系统里面,任意webview在可滚动状态下,都是可以拖超出边界然后反弹回来的。这个效果非常的好看和实用。但是如果我要做一个web app,我就不希望我的整个app界面也被用户拖动。

在很久以前,iOS的浏览器是不支持overflow scroll的,也就是说除了整个网页可以滚动以外,其他部分是不能局部滚动的。要实现局部滚动,一般都是用iScroll等插件,用javascript来模拟滚动。这技术说起来容易做起来难,我看了无数个类似的东西,没有任何人能做到原生一样的滚动反弹效果。最接近原生效果的是我从某牛逼网站上8下来的代码:https://github.com/longbill/ScrollPane

后来iOS退出了iOS5,其中的浏览器支持了overflow scroll。在配合  -webkit-overflow-scrolling: touch; 的情况下滚动起来是比较理想的。但是唯一有一个弊端就是当局部滚动区域处于滚动边缘的时候(比如处于最上面),此时继续网下滚动手指,滚动操作不会体现在局部滚动区域,而是会作用于整个网页。这个在做web app的时候,是完全无法忍受的。做出来的效果跟把web app界面的头部和底部用position fixed固定是一样的。

所以,即使overflow scroll从iOS5起就被支持,但是用javascript模拟滚动的需求还是十分旺盛。其中很重要的一点就是滚动会传递到外面的网页。另外也很重要的一点就是原生的滚动很难实现类似pull to refresh的操作。

后来我打算将我的精选文章做成web app的形式。尝试了无数的scroll插件,都让人失望。被逼无奈仔细研究了一下原生的overflow scroll。再后来被我找到了一个奇怪的方法,来阻止滚动操作传递到整个网页。

就是。

在手指放在屏幕上的时候,判断里面的滚动部分的 scrollTop 是不是 0 或者 最底下。如果是,那么将 scrollTop 轻轻位移1个像素。就可以了。

另外,我还实现了一个pull to refresh,虽然效果跟原生的不太一样,但是看起来也还不错。

代码我空了会整理写文档然后放到github上。大家可以先看这个 demo。 暂时只支持iOS系统。安卓请忽略。

http://jszen.com/public/demo/ptr/index.html


11条评论     到PHP.JS.CN上围观原文 ]]>
2014-08-08 01:58:31
<![CDATA[最近做了个海拔高度查询网站]]> https://php.js.cn/blog/how-to-look-up-elevation/         最近经常出去自驾游,往川西的高原跑。经常会遇到一个问题就是不知道当前的海拔高度。正好我最近又在学习做站。索性就弄了一个专业查询海拔的网站:海拔高度查询工具  利用Google的API来获取相关信息。不过由于最近天杀的GFW把google全部服务给墙掉了。只能用ditu.google.cn的服务。但是仍然有一些请求走的是maps.googleapis.com,于是搞了个hack,把所有maps.googleapis.com的域名换成ditu.google.cn。还好,大部分都能用。

        最近又做了英文版本的海拔高度查询日出日落时间查询

还是上两张图吧。在红原县附近拍的。


3条评论     到PHP.JS.CN上围观原文 ]]>
2014-08-08 01:19:09
<![CDATA[怎样设计密码重设功能]]> https://php.js.cn/blog/how-to-design-password-reset/ 当我们设计一个带有用户注册/登录功能的网站的时候,一个必须的功能就是重设密码。 重设密码功能有很多种设计方式,比如发送一个新密码到用户邮箱等。不过今天我要介绍一个我经常用实现方式。

用户流程:

  1. 用户忘记密码,来到密码重设界面
  2. 用户输入Email地址,点击重设密码按钮
  3. 用户收到一封密码重设邮件,里面有重设密码的链接,此链接有过期时间
  4. 用户点击链接,来到密码重设页面,输入新密码,完成

这个流程并没有什么创新,很多网站都是用这套流程

后端实现方式:

  1. 当用户输入Email地址后,验证这个Email,如果存在于数据库,那么取得用户的user_id
  2. 将user_id和当前时间戳编码成HASH,需要提前准备好一个KEY,并且这个KEY只存在服务器上。  HASH = md5 ( user_id + timestamp + KEY )
  3. 生成一个URL,并且附带刚刚生成的HASH和用户id以及timestamp,比如 http://domain.com/reset-password.php?hash=HASH&user_id=123&timestamp=1392121211
  4. 当用户访问这个URL, 检查HASH是否合法: HASH == MD5 ( user_id + timestamp + KEY)
  5. 检查 timestamp 是不是过期了
  6. 如果所有检查通过,那么显示一个新密码表单给用户

这种方式的好处:

  1. 不需要额外的数据表
  2. 不用担心参数被用户恶意修改,因为要检查hash是不是等于那几个参数的md5
  3. 密码重设URL自带时间戳
  4. 只要KEY设置的足够长足够复杂,那么可以认为HASH是绝对安全的

更详细的样例代码可以参考这里:http://jszen.com/reset-password-system.6.html


6条评论     到PHP.JS.CN上围观原文 ]]>
2013-10-01 14:50:32
<![CDATA[最方便的纯文本编辑器Mac Only]]> https://php.js.cn/blog/plain-text-widget-mac/     Mac操作系统里面有个好用的东西叫做Dashboard,Windows的桌面小工具就是抄的Dashboard。   Dashboard里面的Widget都是用网页技术做的(HTML, Javascript 等),Dashboard仅仅是提供一个透明的window来显示widget的网页而已。

    Mac操作系统自带的Widgets里面就有一个叫做“便签”的东西,可以实现类似记事本的功能,但是记录的文本有限,不能超过便签窗口的大小,实际使用起来十分蛋疼。

    我这个小东西的特点是这样的:

  • 提供一个白底黑字的文本框显示在dashboard界面
  • 文本框使用textarea控件,里面的文字保证没有任何格式
  • 理论上可以在里面输入无限制长度的字符
  • 关闭dashboard界面的时候,文本框里面的文字内容自动保存到硬盘
  • 窗口大小可以自由调节
  • 支持添加多个窗口到dashboard

 

    下载: here    源代码:Github page


3条评论     到PHP.JS.CN上围观原文 ]]>
2013-07-25 17:40:35
<![CDATA[原创jQuery插件: Date Range Picker]]> https://php.js.cn/blog/jquery-date-range-picker-plugin/ 某些时候,我们需要用户输入一个日期范围,比较直观的想法是用两个date picker控件。但是两个date picker给用户带来的体验并不好。于是我搞了个jQuery插件,可以实现在一个界面里面选择日期范围,并且将选择的值输出到一个input框中。

  • 依赖 jQuery 1.3+, Moment 2.0.0+
  • 支持 IE6+, Firefox, Chrome, Safari 等浏览器
  • 支持多语言
  • 界面完全CSS可控

文档以及代码见我的英文博客:http://jszen.com/jquery-date-range-picker-plugin.4.html

下载:https://github.com/longbill/jquery-date-range-picker


5条评论     到PHP.JS.CN上围观原文 ]]>
2013-07-23 23:29:48
<![CDATA[关于电池容量你应该知道的]]> https://php.js.cn/blog/battery-capacity-in-mah-whr/     直到今天才发现一个惊人的事情:iPad3的电池容量是11666mAh,而macbook pro的电池容量才5000多mAh。为什么iPad3那么小的体积内可以装下比mbp更多的电池容量呢?难道采用了什么新的科技?

    于是google了下,又发现一个惊人的事情:一般电池上标的容量单位是mAh,但是学过物理的都知道,电流乘以时间不是一个能量单位,还少了一个电压。相信跟我一样到现在才发现这个问题的同学还有很多,那么我就普及下高中物理知识:

  • 电流单位A(安培),  1000mA = 1A
  • 电压单位V(福特)
  • 功率单位W(瓦特)  
  • 能量单位J(焦耳),但是在电子产品的电池上很少用这个单位。一般用Whr(瓦时)表示能量。

 

  • 能量=功率x时间
  • 功率=电压x电流
  • 能量=电压x电流x时间

    综上,mAh并不是一个准确的表示电池容量的单位,它的出现应该同时标明电压(大部分手机等电子设备是固定的3.7V)。Whr是能量单位,可以表示电池的容量。

    所以,在比较电池容量的时候,请先确定电压是否一样。如果不一样,就要乘以各自的电压转换成Whr再比较。

    所以,mbp的电池上标明容量是60Whr,电压大约10.95V(算得mAh表示法大约5480mAh)。而iPad3的11666mAh大约工作在3.7V的电压下,算得大约43Whr。所以iPad3的电池是没有比mbp电池容量大的。


5条评论     到PHP.JS.CN上围观原文 ]]>
2013-01-29 01:44:07
<![CDATA[记一次海淘经历]]> https://php.js.cn/blog/hollister/ 很喜欢hollister这个牌子,但是国内貌似只有深圳上海北京有店。这马上就要回成都了,买不到了。于是就去他们官方网站看看。

国内IP访问他们网站会被强制跳转到香港站。衣服的价格是港币,标价跟深圳的店差不多。对比起来网购没什么优势啊,就一个港币汇率8折。于是放大招,通过IP位于日本的代理再次访问他们网站。哇,出来了。美元标价换算成人民币相当于只要六七折啊,而且这圣诞新年打折更便宜啊。在深圳店里面1600不打折的羽绒服,美元只要139刀啊。接近5折了!而且美国版网站跟香港版网站同样支持送货到国内地址的。 

于是选购了两百多刀的各种东西,给了20刀的邮费,感觉就算完事了,坐等收货。看来还是想太简单了。没过几天,fedex给我电话说让我报税。还非得按invoice上的价格来报,20%的税率。折腾了几次打印扫描后总算也把入关手续弄好了。交了310人民币的税。 从美国发货到我收到货大概七八天吧。现在算来,加上邮费加上缴税,还是比实体店便宜不少,甚至比香港人通过网站买还便宜不少。。。

衣服貌似有些是越南产的,有些是中国产的。自己地方产的东西到美国去走一圈,价值就翻了那么多。更可恶的是他们还歧视中国人啊,默认访问的香港版网站卖的价格还更贵。

PS. 喜欢这个牌子是因为无意间逛到了深圳的实体店,店内很有风格,服务员都是帅哥美女尤其是那个收银的小妹。。。。服务员还满口英语,感觉很洋盘的样子。还有店的味道很不错。总的说来就是一次很愉快的经历。让我第一次觉得逛街其实也可以很享受嘛。 

另外,不知道有没有什么办法可以免去这个关税。知道的同学支个招呗。


3条评论     到PHP.JS.CN上围观原文 ]]>
2013-01-09 03:59:23
<![CDATA[前端开发必备神器]]> https://php.js.cn/blog/front-end-developing-tools/     记得很久很久以前,主流还是IE6。开发前端页面的时候,修改一行CSS或者JS,就要回到浏览器刷新看下效果。调试Javascript更是只能用alert来判断是哪行代码出问题了。那个时候,Javascript还有个竞争对手叫VBScript,声明script标签的时候还建议声明language="javascript"。那个时候网页脚本还被认为是仅仅能给网页增加一些跑马灯等的特效而存在的。

    那都是05年的事了。现在前端的各种环境各种工具都迈入了一个崭新的时代。感谢Google推动了浏览器的发展,感谢W3C制定各种有用没用的标准,鄙视微软万恶的IE6。现在我们开发前端页面已经逐渐变得优雅/文艺了起来。这让我这个经历过当年艰苦岁月的前端er不禁感叹终于熬出头了。。。

    这里我像各位同学介绍下我长期使用的各种前端开发工具,主要是提升效率。欢迎补充留言。

Chrome developer tools

    不知道什么时候,Chrome developer tools强大到超过了Firebug,成为了我主要的debug工具。查看浏览器发起的所有请求、查看页面引用的js/css代码、查看/修改页面DOM结构、在页面上修改css/js然后直接看到效果、Javascript Console等等各种基本功能都做到非常好用。强烈建议各位找找深入介绍Chrome developer tools的文章,相信有很多高级的功能很多同学都还没用过。

Sublime Text 2

    这是一个文本编辑器。也是不知道什么时候就强大到超过Textmate,成为我主要的编辑器。更重要的是,它居然是跨平台的。用Windows的同学有福了。

Zen Coding

    这是一个编辑器插件,支持各种编辑器。这里有篇介绍文章。这个插件的牛逼之处在于可以大大提高写HTML的效率。比如我要写一个html table。输入 table#list-table.table>tr.row*3>td.cell*3 然后按定义的Zen Cod ing快捷键,就会马上生成:

	<table id="list-table" class="table">
		<tr class="row">
			<td class="cell"></td>
			<td class="cell"></td>
			<td class="cell"></td>
		</tr>
		<tr class="row">
			<td class="cell"></td>
			<td class="cell"></td>
			<td class="cell"></td>
		</tr>
		<tr class="row">
			<td class="cell"></td>
			<td class="cell"></td>
			<td class="cell"></td>
		</tr>
	</table>

Twitter Bootstrap

    这是twitter发布的一套前端整体框架。也就是预先定义了很多css和一些Js代码。写页面的时候,按照规范写class,就可以实现用户体验很好的页面。这里是项目主页。现在很多很多网站都基于bootstrap来开发。的确可以为开发者节省很多宝贵的时间,更重要的是,这些页面元素都是twitter经过研究后,觉得是用户体验最好的设计。而且,基于bootstrap,页面还可以很轻松的做到mobile friendly。我的一个小项目就是基于bootstrap,实现了使用同一个页面,支持各种尺寸的浏览器。尤其在iOS浏览器上表现非常好。精选文章

Devtools Autosave

    这才是最牛逼的神器。项目地址在这里。这个东西实现了可以在Chrome developer tools里面修改css属性或者js代码,然后直接同步保存到本地或者服务器。比如以前我们先大概写好css,然后用firebug进行微调,调整好后,复制css代码,进入编辑器粘贴代码然后保存,然后刷新浏览器看效果。而现在,在Chrome devtools里面,修改的css可以自动保存了。而且不仅仅是css属性,还可以直接修改css源文件、javascript源文件。现在的开发方式可以简化到,先写好HTML骨架,定义好各个class名字,然后打开chrome devtools,在css源文件里面直接添加新的class。边写边可以看到效果哦。牛逼指数10颗星啊。

Markman

    马克鳗是一个Design to HTML神器。很多时候我们需要根据设计图片文件来开发成网页代码。这时需要精确测量各种距离、各种宽度、各种颜色。马克鳗可以优雅的完成这个任务。项目地址在这里。下面是我截的图:

Markman截图

    先写这么多吧。


11条评论     到PHP.JS.CN上围观原文 ]]>
2012-11-25 03:20:46
<![CDATA[Mac下为应用程序更换图标最简单的方法]]> https://php.js.cn/blog/how-to-change-application-icon-in-mac/     Mac OS系统里面的应用程序都是文件夹形式。只不过是内部有一定规则的文件夹而已。在应用程序上右键,选择查看包内容就可以查看应用程序里面的东西了。应用程序的图标文件也在里面。一般是一个.icns文件。替换这个文件,就可以更换app的图标。不过这个方法跟我要讲的方法闭起来弱爆了。首先不说找到那个.icns文件很麻烦,光是把图片转换成.icns格式就够折腾。

    其实Mac OS操作系统是很简单的。不就是换个图标么。复制粘贴就可以了!请看:

  1. 找到目标APP,比如迅雷:


     
  2. 到网上随便找个png图片,当然,要足够大。然后右键,复制图片。比如这只黑猫:


     
  3. 转到Finder,选中迅雷APP,然后按Command+I或者右键菜单里面选择“显示简介”也可以。 然后选中左上角红色按钮和黄色按钮下面的那个图标。选中之后图标边缘会变成蓝色:


     
  4. 点击Command+V粘贴。搞定!



     
  5. 如果想使用本地的图片文件来当icon。那可以先使用系统自带的“预览”工具打开该图片。然后全选(或者选择一部分也可以)。然后按Command+C复制。


     
  6. 然后就跟第四步一样Command+V粘贴:


     
  7. 其实不用复制粘贴,直接拖动网页上的图片到简介上的那个图标上也可以。不过要先组织下窗口位置:

 

    其实就是这么简单。


3条评论     到PHP.JS.CN上围观原文 ]]>
2012-10-20 01:10:07
<![CDATA[DSG顿挫抖动问题的解决办法]]> https://php.js.cn/blog/dsg/     我去年9月份入手了一台一汽大众高尔夫6 1.4TSI+DSG车子。今年3月份大众公司说可以升级DSG控制程序,于是我就去升级了。后来越开越觉得换挡不平顺,于是又去升级了一次DSG程序,但是问题更严重了。后来在网上看了好多人都遇到这个问题。 再后来我把车开到了深圳,在深圳这边的4s店问了下,告诉我需要重置DSG参数,然后用手动模式在高速上跑一下,让DSG程序重新学习车子的发动机性能。我这才明白原来我之前升级过DSG程序之后,都没有这么做过,DSG程序没学习好,所以出现了顿挫感。这也解释了为什么网上关于升级DSG程序后的各种不同评价,有的人说升级了感觉很好,有的人则觉得不如以前了。

    按4s技师说的,重置了DSG参数后,应该立即上高速,用手动模式在5档、6档让发动机在2000-4000转每隔500转停留至少10秒以上。也就是说挂5档,6档,让发动机转速在2000-2500,2500-3000,3000-3500,3500-4000这四个区间分别停留10秒以上。我的DSG经过这样的重新学习之后,顿挫抖动问题都得到了很大的缓解,驾驶起来平顺多了。不过还是比不上新车时候的感觉。网上说这很可能是因为离合片磨损造成的。

    不过7速DSG的问题确实很多人都遇到了。我成都一个朋友甚至还更换了DSG总成,还是问题依旧,最后不得不自己掏钱换了个6速湿式DSG。因为很多人投诉大众的DSG有设计缺陷,国家质监总局采取了一些行动:《国家质检总局缺陷产品管理中心向社会公开征集大众汽车DSG变速器相关故障信息》 希望遇到DSG问题的朋友都去投诉一下,好让大众公司尽快解决DSG问题。

 

2012年11月29日更新

    前不久去做保养,顺便跟客服提了下二档抖动的问题,故意夸大了一下。没想到过几天客服打电话给我说索赔成功,更换离合片。然后11月十几号的时候我去换了,搞了五六个小时。 换的时候我大概看了下,新离合片貌似是德国货。论坛里有同学说是新的离合片用新的材料制造,避免了高温变形的问题。现在开了半个月,感觉跟新车差不多,换挡很平顺。

    在去换离合片的当天,有个同学在这篇日志留言说抖动的解决办法:

DSG低速抖动有效处理方法:怠速时,首先右脚踩住刹车,挂D档,左脚加油门到三分之二处,保持1分钟;然后松开油门挂倒档,同样加油门三分之二处保持1分钟,同样方法,操作2一3次即可解决低速抖动问题;此方法让两个离合器重新磨合到最新控制状态,有效解决低速抖动问题。

    我在去换离合片之前特意试了下。果然有效唉!不过我估计开不了多久,还是会抖动,还需要这样做。所以,还是换离合片感觉好些。


11条评论     到PHP.JS.CN上围观原文 ]]>
2012-05-14 13:36:25
<![CDATA[苹果电脑升级操作系统教程]]> https://php.js.cn/blog/mac-os-x-upgrade-reinstall/  

首先要讲一下Mac操作系统跟windows操作系统的不同,以及一些基本知识:

引导程序

苹果电脑采用EFI来引导系统,而不是BIOS。EFI比BIOS简单好用的多。EFI支持从U盘、外置硬盘、光盘、硬盘的某个分区启动。选择用那种方式启动只需开机的时候按住alt(option)键不放就可以了。

安装盘

Mac系统的安装盘可以在网上下载,一般是dmg格式。dmg是mac的压缩打包格式,类似于iso格式。下载回来之后,可以用Mac系统自带的“磁盘工具”软件将dmg文件恢复到某个硬盘分区,或者刻录到某DVD光盘中。不过建议恢复到硬盘里面,这样安装系统的时候速度会快很多。

序列号

Mac系统只能装在苹果电脑上(经过破解之后也能装在PC上),所以操作系统的价格在你买苹果电脑的时候就算交过了。之后只要你能得到dmg格式的系统镜像,就可以随便在电脑上安装而不需要任何激活码或者序列号。

Timemachine

时间机器是Mac自带的系统备份恢复软件。通过差量备份将系统不同时候的状态全部记录下来,可以随时找回之前的文件。也可以将资料从一台电脑恢复到另外一台。 我们将会使用Timemachine来备份当前电脑的所有资料(超大的文件貌似不会被备份,例如虚拟机文件),然后等新系统装好后,再从Timemachine里面把资料还原回来。这里说的“资料”不仅仅包含个人文档,而是计算机的所有人为改变,包括你下载的程序,你的浏览器看过的网站记录,甚至你桌面上图标的位置。

备份磁盘分区

系统自带的“磁盘工具”的功能十分强大。它支持在开机状态下把系统盘完整拷贝到另外的分区或者外置磁盘分区。同样,新系统装好后,也可以从这个拷贝恢复个人数据。而且备份整个系统分区貌似要比使用Timemachine备份要快一些(如果你是第一次使用Timemachine的话)。

迁移助理

“迁移助理”是Mac系统自带的系统恢复软件。支持网络迁移、从Timemachine或者磁盘恢复。在新系统刚刚装好的时候,建立任何用户之前,系统会提示是否需要迁移。如果错过了这次机会也没关系,任何时候都可以启动“迁移助理”来进行迁移。

系统分区

一般情况下,苹果电脑的内置硬盘只需要1个分区。并且请保证磁盘的分区图方案是GUID分区表。否则会影响启动速度。格式化在苹果系统里面叫做“抹掉”。苹果的分区抹掉的时候要选则格式为“Mac OS 扩展(日志式)”。

修复权限

Mac系统是基于BSD的,跟Linux很像。系统对文件权限的控制非常严格,这点跟windows很不像。想像一下windows下面,你不小心双击了一个病毒文件,然后。。。然后就没有然后了。。。而Mac下面就算你运行了一个病毒文件,在你输入密码之前,它是没有权限修改系统文件的,顶多就是把你的个人文件删了。  而且很多系统问题都是由于权限错误造成的。所以一般在完成迁移之后都会做一次“修复磁盘权限”操作,以保证系统的稳定运行。这个功能可以在“磁盘工具”的“急救”选项卡里面找到。

 

步骤:

好了,现在来说说怎样升级或者重装Mac系统。

首先,从网上找到需要的系统镜像文件。下载下来。 

找一个usb硬盘,分一个10GB左右的分区。(或者使用本机的硬盘,新增加一个分区)。

打开磁盘工具软件,将这个分区抹掉(注意选择格式)。

点击“恢复”选项卡点击“源磁盘”后面的“映像”按钮,找到刚刚下载的dmg系统文件。将左侧刚刚抹掉的10GB分区拖入“目的磁盘”的空白框内。然后点击“恢复”按钮。

坐等完成。

如果你想保留你的个人文件的话,在安装新系统之前请用Timemachine备份一次或者用磁盘工具把系统盘备份到外置硬盘(外置硬盘的分区需要比系统盘稍大)。

完成了之后你就可以重启,“当”一声之前按住alt不放,进入启动选择界面,选择安装盘分区启动。

进入安装盘系统之后,最好不要着急安装。先打开磁盘工具(对,安装盘里面也自带了磁盘工具软件),然后抹掉系统分区。如果是用外置磁盘安装,甚至可以抹掉整个系统磁盘。

抹掉之后就可以继续系统安装步骤了。没什么特别的,一直点“继续”就是了。完了之后建议先建立一个临时账号(不要跟老系统的用户名一样),进入系统看看。看看新系统满不满意,运行起来卡不卡。

如果没问题就启动“迁移助理”,把之前备份的个人资料迁移到新系统中来。

迁移完成之后注销或者重启,进入之前的用户,再进入“系统偏好设置”把刚刚的临时账号删除。然后再进行“修复权限”操作。完成之后重启。

 

好了,现在你的系统已经升级,并且保留了你所有的文件(注意Timemachine不会备份超大文件,.hosts文件,请自行备份)。 

 

另外,貌似Lion系统支持直接升级安装,直接从App Store下载Lion系统,然后直接运行就可以了。不过我还是建议在安装之前先备份一下,否则万一。。。就一切都完了。


4条评论     到PHP.JS.CN上围观原文 ]]>
2012-05-11 15:05:26
<![CDATA[更新iTunes同步歌词显示小工具]]> https://php.js.cn/blog/itunes-geci/     之前的版本:http://php.js.cn/blog/itunes-geci-lrc-widget-for-mac-os-dashboard/

    这次在此基础上修改了下界面。修复了一些bug。 去掉了歌名和歌手一直显示的功能。只在歌曲开始的时候显示歌名。

    看截图:

    点击这里下载。解压后直接双击就可以了。

    注:这是个Mac OS 操作系统的Dashboard小工具!Windows用户请无视之。


2条评论     到PHP.JS.CN上围观原文 ]]>
2012-04-20 23:55:52
<![CDATA[Titanium开发iOS应用使用中文appname]]> https://php.js.cn/blog/titanium-ios-app-chinese-appname-i18n/     用Titanium做iOS的APP挺简单的。完全不需要Object-C的知识,看官方的API文档基本就可以了。我最近做了个应用准备发布。不过遇到了个问题,就是app name不能设置成中文。 想了下,貌似App Name也有语言问题,不同语言环境下应该显示不同的名字才对。 后来网上找了一大圈,终于搞定。 下面是步骤:

    环境: Titanium Studio, build: 1.0.9, Titanium Mobile SDK 2.0.1 , Mac OS Snow Leopard

  1. 首先在你的项目根目录下新建一个文件夹,i18n,这个是国际化文件夹,下面应该放各种语言的语言文件
  2. i18n下面新建en文件夹用于英文,zh_CN文件夹用于中文,ja 日文 ... 
  3. 在每个语言文件夹下面新建app.xml文件
  4. app.xml文件里面写:

    <?xml version="1.0" encoding="UTF-8"?>
    <resources>
        <string name="appname">APP NAME</string>
    </resources>

  5. 不同语言文件夹下的app.xml写不同的APP NAME就可以了。
  6. 如果没效果可以试试先clean再run

搞定。

另外,推荐一个可以下载免费icon素材的网站,http://www.softicons.com/ 里面好多开源免费的icon!!


2条评论     到PHP.JS.CN上围观原文 ]]>
2012-04-20 19:22:04