<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>小碼哥的博客</title>
    <link>https://lewang.dev/</link>
    <description>Recent content on 小碼哥的博客</description>
    <image>
      <title>小碼哥的博客</title>
      <url>https://lewang.dev/lewangdev-cover.png</url>
      <link>https://lewang.dev/lewangdev-cover.png</link>
    </image>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <lastBuildDate>Sat, 10 Aug 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://lewang.dev/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>如何开发FoloToy玩具可以使用的私有 STT/LLM/TTS 服务</title>
      <link>https://lewang.dev/posts/2024-08-10-how-to-write-custom-api-for-your-folotoys/</link>
      <pubDate>Sat, 10 Aug 2024 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2024-08-10-how-to-write-custom-api-for-your-folotoys/</guid>
      <description>FoloToy AI 玩具是如何工作的？ FoloToy 出品的所有玩具（包括电路板）作为客户端连接玩具服务，玩具服务我们提供了folotoy-server的docker自部署镜像，可以轻易的部署在各种 Linux 发行版系统上，包括 Debian/Ubuntu/CentOS等等，自部署镜像配置下载地址为：
自部署镜像：https://github.com/FoloToy/folotoy-server-self-hosting 部署教程：https://docs.folotoy.com/zh/docs/installation/start 玩具服务 folotoy-server 主要由以下3个部分组成 语音转文本：服务程序通过互联网接收玩具发送的实时录音数据，并调用 STT（声音转文本）API 将声音转换为文本。目前支持的 STT 选项包括：openai-whisper、azure-stt、azure-whisper、dify-stt、aliyun-asr 等，点击查看支持的STT完整列表。 调用大模型生成文本：在接收到上述文本后，立即调用 LLM（大型语言模型）API以流式方式获取 LLM 生成的句子。然后，调用 TTS（文本转语音）API 将句子转换为人类语音。目前支持的 LLM 选项包括：openai、 azure-openai、gemini、qianfan、dify或由 One-Api 代理的 LLM，以及与 OpenAI 接口兼容的其他大模型服务，如 moonshot 等， 点击查看支持的LLM或者Agent完整列表。 文本转语音：玩具将接收由FoloToy服务器生成的 TTS（文本转语音）音频文件流，并按顺序播放它们。目前支持的 TTS 选项包括： openai-tts、 azure-tts、 elevenlabs、 aliyun-tts、dify-tts、edge-tts(免费)等，点击查看支持的TTS完整列表。 FoloToy AI玩具调用的接口，支持了LLM行业的通行的做法，即完全兼容 OpenAI 的接口，在了解工作原理之后，只需要提供 OpenAI 接口格式相同RESTful接口，给folotoy-server调用，就能实现让玩具使用自定义的STT/LLM/TTS服务，如图所示：
接下来介绍如何实现蓝色圆圈的部分服务
实现和调用自定义服务 实现支持 OpenAI 接口的自定义服务之后可以通过修改 docker-compose.yml 或者 roles.json 文件来调用。docker-compose.yml 为修改全局变量，roles.json 可以针对角色进行修改，roles.json 配置的优先级高于 docker-compose.yml。
自定义 STT 服务 接口说明 自行实现 STT 服务 RESTful 接口说明，详情请参考 OpenAI STT 接口：https://platform.</description>
    </item>
    
    <item>
      <title>我的推特账号 lewangdev 终于解封了</title>
      <link>https://lewang.dev/posts/2024-01-31-my-twitter-unsuspended/</link>
      <pubDate>Wed, 31 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2024-01-31-my-twitter-unsuspended/</guid>
      <description>我的推特账号 x.com/lewangdev 终于解封了，从去年8月17号一直封到今天，已经差不多快有 6 个月的时间。在这 6 个月里，除了今年 1 月份，我每个月都写了一封申请解封的邮件，前几个月全部都是使用 ChatGPT 写的英文版解封申请，就在去年12月份的时候，想想自己莫名其妙被封确实有点恼火，于是用中文写了一封解封邮件，并且提到封我的账号是否是因为审核人员有种族歧视。以下是我的邮件内容：
Hi，
已经过去四个月了，我的账号 lewangdev 还是被冻结着的，真是太难熬了。我翻看自己的推文，始终认为我没有发布任何破坏了推特的规则的推文，冻结我的账号一定是一个误会。
我已经使用这个账号十多年了，一直在个人使用，我的账号被冻结不仅是我感觉到惊愕，我的所有朋友们都觉得太莫名奇妙了，让大家都觉得推特平台怎么会这样不确定。
另外我不知道你们为什么会封禁我的账号，是因为我一个亚洲人吗，如果不能给出冻结我账号的明确理由，我非常怀疑你们的审核人员是否有种族歧视。
请帮我解封账号，或者给出明确的冻结理由。
谢谢
到现在我都不知道我的账号为何被封，被举报还是被误杀？也许就像能哥说的，是马斯克在搬机房的时候弄坏了我的数据。看到能哥的说笑我还真可找到了可疑的证据: 账号被封之后几天，我发的推文里面的图片链接都挂掉了。
不过在我收到的解封邮件里，推特还是告诉了我，被冻结是因为违反了平台的4条规则，我确信我都没有做过。以下是推特解封邮件提到的我违反的规则：
Sending multiple unsolicited @replies or mentions. Learn more. Posting multiple unrelated updates to a trending or popular topic. Learn more. Aggressive and random repost and/or liking posts from other accounts. Learn more. Misuse of X product features This includes any of the following:
“follow churn” – following and then unfollowing large numbers of accounts in an effort to inflate one’s own follower count; indiscriminate following – following and/or unfollowing a large number of unrelated accounts in a short time period, particularly by automated means; and duplicating another account’s followers, particularly using automation.</description>
    </item>
    
    <item>
      <title>日本是一个完美的旅行地</title>
      <link>https://lewang.dev/posts/2024-01-30-my-first-japan-tourist/</link>
      <pubDate>Tue, 30 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2024-01-30-my-first-japan-tourist/</guid>
      <description>两周前是我第一次去日本，而且还独自带了一个8岁的孩子一起，在日本十多天，算是佛系的走了几个地方，无论走到哪里都感觉基础设施非常好，城市干净，空气清新，物价低廉，社会文明程度极高，网络畅通，另外饮食也很适合我和孩子的口味，完全不懂日语也不会影响到旅行。
在旅行的过程中，我使用最多的 App 是 Google Maps 和苹果自带的 Translate，找路和坐车都靠 Google Maps，Google Maps 唯一的不足是缺少店铺楼层的信息。我在上海很少用 Google Maps， 所以到了日本还不是很会用，有次在公交站台不知道自己有没有坐对方向来回看，也会有热心的人主动问我怎么样然后教我怎么用。
另外苹果自带的 Translate 使用非常方便，可以语音也可以拍照进行中日文互译，这样在没有中英文菜单的饭馆，也能点菜了。我刚开始没有使用 Translate，第一天住酒店的时候，看到前台在用它与我沟通才想起这个自带的 App。
接下来我从衣食住行四个方面说下我的体验。
「衣」 这次游览的地方在东京和大阪之间的区域，体感温度和上海感觉差不多，只有在箱根大涌谷火山口的山顶比较冷。我们没有带很多衣服，穿着与在上海时完全相同。
另外据说日本优衣库衣服非常便宜，打算实在不够穿再去买几件，后来路过优衣库的时候，还真的去买了几件衣服，但实在不知道要买什么，为了凑单到免税额，买了4件衣服。
「食」 在日本旅行，最不担心就是吃饭。我们在上海也很喜欢吃日式的餐饮，这次去日本更是连续吃了7-8顿寿司。我没有提前去搜索网红的餐厅，基本都是在 Google Maps 上看看住的附近有什么，或者路过商场车站的时候，看看楼宇广告牌有什么吃的就过去了。寿司吃过连锁的店和自助餐厅，价格感觉都不高，人均1-200就能吃得很爽了，像京都站11楼的「築地寿司清」，70-80块就可以点一大盘了。
另外我也去看了超市和便利店，价格低廉的便当比比皆是，而且还写清楚了热量和成分。
感觉不足的地方就是蔬菜和水果吃得很少，这段时间基本是在酒店早餐里才吃得到，如香蕉橙子和蔬菜色拉。要么就是喝各种蔬菜汁和果汁。
「住」 前面讲到日本物价低廉，也是因为我们体验了各种价格酒店之后得出来的一个结论。
订酒店的时候，看到各种价格的酒店都有，这几天住的酒店价格分布在 100-1500 之间，我感觉 100-800 之间的酒店，体验下来基本没什么区别，房间小但都很干净，感觉就像吃的一样，什么价格都有，但是价格便宜的体验也是很好的，甚至几乎所有的酒店配置都差不多，都有浴缸卫洗丽净化器等。而且住的几家酒店的前台，大多都有会说英语的接待人员。
我和朋友说，我在东京住了 300 多的酒店，在京都住了 100 多的酒店时，而且位置很好，酒店条件也很好，大多人反应都是日本酒店不会这么便宜，问我是不是青旅。等我发照片给他们看，才相信是真的。大概也因为是淡季，酒店整体的价格也便宜。
「行」 从上海往返东京或者大阪的机票很便宜，我买的国行的航班往返，提早预订当时花了 6000 多，日本地震后，机票价格暴降，且因地震可以免费退票，于是我退掉重新预订了相同的航班，一下子省了 3000 多块。
在日本的时候交通费用远高于上海，地铁公交都比上海贵一些。通过app和车站的牌子也能看到打车的价格，也是非常的高。 在日本坐地铁和新干线不需要安检，买新干线车票也不需要实名，这点非常的方便。
我在到日本后，在 Apple Pay 里开通了 Suica，并且在东京站也给孩子办理了一张儿童版的 Suica 卡，这样小孩坐公交和地铁都可以半价。Suica 卡不仅可以当公交卡使用，在很多自动售货机和店铺都可以直接当银行卡使用，无接触的像刷公交卡一样付钱，相当的方便。
下一次旅行 以前一直没有去过日本，因为担心语言的问题，现在来看，完全不用担心，这趟旅行我和孩子都非常满意，以后会多多去日本游玩。</description>
    </item>
    
    <item>
      <title>无用却能让我快乐的小事——改图标</title>
      <link>https://lewang.dev/posts/2024-01-11-change-icons/</link>
      <pubDate>Thu, 11 Jan 2024 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2024-01-11-change-icons/</guid>
      <description>最近几天连续做了几次改图标的事情，非常无用却令我开心。
给 Alacritty 换个图标 新安装了 Alacritty 这个终端，Alacritty 什么都好，就是图标我感觉太丑了。之前看到 @hitw93 的博客提到给 Alacritty 更改了图标，我照葫芦画瓢，做了红绿蓝三种颜色的终端图标，替换之后，每次在切换 app 或者在 Lanuchpad 页面看到它的图标时候，都会惊叹自己太有才了，心满意足。我制作的图标和替换方法都放在这里了：Alacritty.icns。
另外 Alacritty 也支持了背景模糊，这个功能我等了很久，不用担心截图时候把背景也显示出来了。
给输入法鼠须管 Squirrel 换个系统托盘图标 然后就是修改 rime 输入法鼠须管 Squirrel 的系统托盘图标了。macOS 在 Ventura/Monoma 系统之后，把输入法的图标由方形变成了矩形，在用 Ventura 或者 Monoma 选择输入法的时候，列表中那种不一致的感觉真让人难受，于是我去rime项目的仓库里搜索了一下有没有报过这个问题，果然有人与我的感受是相同的，我找到了修改图标的 PR，终于所有的输入法图标都一致变成矩形，看起来舒服了很多。
替换步骤：
打开目录 /Library/Input Methods/Squirrel.app/Contents/Resources 下载 rime.pdf 把目录下的 rime.pdf 换掉 退出系统登录再重新登录 给 LaCie 移动硬盘换个图标 今天又做了件没用的事：给移动硬盘换图标。买了块 SATA 口的 SSD，替换已经吃灰多年的 LaCie 移动硬盘里面的机械盘，替换完插到电脑上发现 LaCie 图标竟然没了，于是去官网搜了一下，不愧是法国的公司，管他性能怎么样，首先是要好看，所有产品的 icns 图标都可以下载，并且写清楚了怎么替换。图标和替换方法在这里：LaCie Drive Icons
现在好了，电脑里看得见的地方都满意了，虽然没啥用，却能让自己快乐事，为何不去做。这可能是细节控，每一个做产品的人大概都很注重细节，但是细节在一些情况下也需要妥协。
还是一件小事，我在发推特的时候会遇到：发推时是否需在英文单词的左右添加空格。我虽然有蓝标，但是我还是希望我的推文尽量只用一条并且能在 280 个字符以内，这样不会被折叠起来。如果提炼推文之后字数还超了，手动输入的空格明显就是浪费了，所以字数较少的推我会加空格，字数较多的推文我会去掉空格。
就这样，我经常会折腾一些无用的事，想一些无用的问题，但是能给我带来快乐。</description>
    </item>
    
    <item>
      <title>一次完美的逃离公有云操作：把挂载300G数据盘的阿里云主机迁移到本地</title>
      <link>https://lewang.dev/posts/2023-12-04-bails-out-of-the-public-cloud/</link>
      <pubDate>Mon, 04 Dec 2023 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2023-12-04-bails-out-of-the-public-cloud/</guid>
      <description>在主机还有 1 天到期之前，尝试下云就成功了，节省几千块。从阿里云下载的虚拟机文件在本地用 qemu 运行没有任何问题，因为备份的磁盘文件单个接近 200GB，我还担心网络问题以及操作复杂会比较耗时间，于是先把主机降到了最低配置准备再续一个月，没想到迁移过程很丝滑。这次迁移主机的系统盘和数据盘是通过下载从阿里云的磁盘快照构建镜像来恢复的，而不是通过备份数据的方式。
通过直接恢复虚拟机磁盘这种方式来迁移云主机，相较于通过 rsync 备份数据，要方便得多。
以下是我的操作过程。
阿里云导出主机镜像的文档写得还是不错的，生成和导出磁盘镜像我都是看阿里云文档来操作。第一步是打开阿里云控制台进入镜像页面，为自己的云主机创建一个镜像。我的这台主机每天都自动生成快照，并且在创建镜像之前，我手动也创建了一个永久保存的快照，我用这个永久快照来构建镜像的。
接下来点击「导出镜像」，阿里云后台会弹出提示窗口，根据提示配置好 oss Bucket，然后耐心等待，最后在会在 oss Bucket 看到两个文件，一个是系统盘，另外一个数据盘。
从 oss Bucket 下载文件到外网的流量是收费，我第一次直接用 http 链接下载，系统盘可以下载下来，但是数据盘下载失败了，浪费了不少的流量（钱），后来尝试用 阿里云的 ossutil 命令来下载，一次就成功了，把着两个文件下载到本地之后，接下来在本地使用 qemu 就可以把虚拟机跑起来
我从阿里云导出的 raw 格式的镜像， qemu 可以直接使用，如果打算用 virtualbox 来运行，也可以尝试用 qumu-img 转为 virtualbox 支持的磁盘格式。我这里直接解压系统盘和数据盘文件之后，执行一下命令来构建虚拟机：
# 使用系统盘创建虚拟机 virt-install \ --name aliyun-ci \ --osinfo centos7 \ --ram 8192 \ --vcpus 4 \ --network network=default \ --disk /var/lib/libvirt/images/aliyun-ci.raw \ --graphics vnc,listen=0.0.0.0 \ --noautoconsole --autostart \ --import # 挂载数据盘 virsh attach-disk aliyun-ci /mnt/nas/aliyun/ci/data.</description>
    </item>
    
    <item>
      <title>使用 rcode&#43;vscode&#43;docker 快速搭建隔离的 cuda 开发环境</title>
      <link>https://lewang.dev/posts/2023-11-28-build-cuda-dev-env-with-rcode-vscode-docker/</link>
      <pubDate>Tue, 28 Nov 2023 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2023-11-28-build-cuda-dev-env-with-rcode-vscode-docker/</guid>
      <description>昨天组装了一台GPU 开发机，我使用 rcode+vscode+docker 可以快速搭建出隔离的cuda开发环境，我感觉非常的方便。特别是 rcode 这个命令在使用 docker 构建 cuda 开发环境时非常有用。下面以搭建 faster-whisper 开发环境为例：
faster-whisper 的项目说明里提到，NVIDIA 官方 Docker 镜像 nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu22.04 已经包括了开发需要的库 cuBLAS for CUDA 11 和 cuDNN 8 for CUDA 11。执行以下命令下载并启动这个镜像，并且在启动时，安装好需要的 python 库 和 openssh-server 服务
执行以下命令查找到刚刚启动的容器的名称
sudo docker ps 例如我的容器名称是 admiring_kapitsa，使用以下命令进入容器的 console
sudo docker exec -it admiring_kapitsa /bin/bash 进入 console 之后，进入 /root 目录，创建以下目录和文件，并且把自己的公钥加到 authorized_keys 中：
mkdir /root/.ssh touch /root/.ssh/authorized_keys chmod 600 /root/.ssh/authorized_keys 经过这一步操作之后，后面可以通过 ssh 直接登录到容器中。
关闭容器 admiring_kapitsa 之后，把容器 commit 为一个本地镜像，这样以后可以重复使用
sudo docker stop admiring_kapitsa sudo docker commit admiring_kapitsa lewangdev/cudalab 下载 faster-whisper 的代码然后重新启动一个容器，并且配置好容器的 ssh 端口，挂载 faster-whisper 项目代码到容器中，例如我这里把 8822 端口映射到容器的 22 端口，把 faster-whisper 代码挂载到容器的 /src 目录下：</description>
    </item>
    
    <item>
      <title>从「改造火火兔」开始，到遇见 ChatGPT 玩具「FoloToy」</title>
      <link>https://lewang.dev/posts/2023-08-29-from-huohuotu-to-folotoy/</link>
      <pubDate>Tue, 29 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2023-08-29-from-huohuotu-to-folotoy/</guid>
      <description>获取「改造火火兔」动态和「FoloToy」玩具进展请关注我的电报频道 FoloToy
从上个月在推上公开一系列脑洞开始，到选定其中做智能硬件的想法，借助「改造火火兔」到昨天大概一个多月才算验证通所有的产品化技术难点，群友们都在安静等待着产品发布，我自己反而觉得越来越着急，这是一个月遇到技术问题的汇总，希望也能给其他做 IoT 硬件产品的朋友以启发。
我们没有选用树莓派之类的可以运行完整 Linux 的方案，而是采用了 ESP32 嵌入式方案，我们希望模块可以做得非常小，功耗低，成本也低，这样我们就需要自己搞定硬件的设计和固件的开发，也就遇到了后续的这些问题。
开始的选择了 ESP32S3 模块，搭配数字麦克风，第一版硬件做出来以后，发现数字麦克风在 USB 充电时总是会受到干扰，导致录音噪声太多以致不能识别语音，经过多次尝试，始终无法解决问题，我认为这种缺陷无法接受，需要调整。在测试玩具自带的模拟麦克风时，发现效果非常好，于是尝试使用自带麦克风。
起初想法是用户在拿到板子后，不需要自己运行服务程序，只需在固件中配置好 OpenAI 和 Azure 的 APIKey 就可以使用，在做了一些测试之后，发现芯片计算能力有限，从录音到播放生成的回复语音这段过程耗时太长，这样的体验让人难以接受，而把语音处理的过程放到服务器来实现后，回复较短的情况下，整体的响应的速度提高到 3-5s。
ChatGPT 玩具在对话时需要一直在线，是需要联网的 IoT 设备，除了要支持上下行控制指令和配置参数的下发上传，还需要上传下载语音。实现上，在线控制我们使用了 MQTT， 实时发送语音使用单独了 UDP 通道，设备再通过 HTTPS 下载服务器生成好的语音回复文件来播放，数据传输的方案也是遇到一些问题后才确定的。
一开始，我们认为玩具的交互过程非常简单，直接使用 UDP 就可以了，但在实现的过程中发现，服务器在向 ESP32 板子发送 UDP 的语音数据时，会发生非常明显的丢包，从而造成扬声器播放有断断续续的现象，而且不同的电脑运行服务器程序现象还不尽相同，我的 MacBook 体验就很好，而换成 ThinkPad 就丢包严重。
从 UDP 上解决这个问题我感觉难度较大，可能要我们自己做缓存适配硬件解码速度的来播放语音。于是我们从服务器推语音文件转向由板子自己拉(下载)语音文件的方式，流程：板子通过 UDP 上传语音，服务器接收语音后通过 MQTT 下发语音文件 URL，在服务器完成所有的接口调用和语音处理之后，通知板子下载语音。
到此，技术上主要的问题都已经解决，此外我们还做好了通过 Web 更新固件，配网，定义好了灯的状态，而且芯片换为资源更多的 ESP32，从而有足够的 Flash 用于存储出厂固件等。
另外也我注册好了产品的域名 https://FoloToy.com，接下来我们在 https://FoloToy.com 上相会, 谢谢。</description>
    </item>
    
    <item>
      <title>公开“脑洞”之后X友们的建议精选</title>
      <link>https://lewang.dev/posts/2023-08-17-comments-on-x-about-my-startup-ideas/</link>
      <pubDate>Thu, 17 Aug 2023 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2023-08-17-comments-on-x-about-my-startup-ideas/</guid>
      <description>上个月在 X 上公开脑洞之后，得到了很多 X 友的鼓励和帮助，而且讨论氛围实在是太棒，让我很是感动。看到有位 X 友这样说：
𝕏𝕏助手™：评论区的态度和语气都很友善，让思路在探讨中变得更清晰这件事本身，不光对推主，对其他参与讨论或仅围观的推友来说，或许都有一定的参考价值。也是交流的意义之所在
原文点击这里查看：原文。
我把一些建议汇总了一下，放在这篇博文里。
开发硬件产品的门槛，做方案和做产品的区别 象牙山刘能：儿童那个不错，不过看起来不像是单枪匹马的项目
小码哥：能哥看得很准，我有个小团队，做 IoT 方案的，在验证这个想法
雷尼尔： 这个方案技术上的问题不是问题，我验证过了。但是真正的门槛在后面，产品开发和市场运营。 因为这个东西需要一直联网，而且对网络的信号有要求。另外设备网络的初始化，以及chatgpt或者类似技术在大陆的合规，都是比较大的问题。另外就是moq。你这个产品出来后，产品是自己做还是卖给其他人，差别很大。如果你自己做，开模具，到产品的初次量产，需要投入的资金都是不低的。做硬件产品的门槛要比软件高很多。
小码哥：合规的问题在大陆比较难解决，等政策明确了再看走正常途径申报，或者面向国内的产品就用国内的技术方案。光做硬件做到“产品”级门槛就很高，外型做好看一点，硬件本体最大的成本可能就是结构设计和开模。
我考虑先不追求外观，尽可能利用现有玩具的公模或者3d打印，芯片方案考虑用 ESP32，先做 DEMO
orange.ai：ai智能硬件空间还蛮大的，找到合适的模型，效果会很好。国家对硬件也没有啥监管，挺好发育的。
henu王凯：硬件门槛特别高、周期长、风险大，独立开发者、资金不宽裕的别碰硬件。
Justin.Ko: 智能硬件能toc，做得好能上量。对应的问题是团队变大，链条长，对创业有一定难度
Morris： 为什么用火火兔做智能硬件Demo？它有开放接口可定制吗？
小码哥: 因为我家里刚好有，另外它也是国内前几年儿童故事机市场最顶级的IP，应该会比较容易玩起来
ZHX：儿童玩具硬件部分也容易实现，主要是营销推广
昵称太受欢迎已被抢注: 儿童教育，英语智能对话，或者发音纠正的，应该很好
如何去做 Digital Signage（数字广告屏） Raymond: 我不是做硬件的，但是我其实非常羡慕可以做硬件的朋友，说实话，需求真的是太多了，比卷上天的软件多了去了。独立开发者，成功的案例也多，比如做 HHKB 蓝牙硬件的那个人，这个算是非常细分，非常小众了吧，过去10年，他个人只是做这个的收益，肯定非常可观了。还有哪个做LED氛围灯的，也是做的不错。
Yup: 这些里面我最看好的项目是做 Digital Signage的 SaaS，这个市场不大，但毛利丰足。做一个通用的管理后端，以插件形式深耕各个使用场景，以至于插件市场也是可以做成收费。将你们很在行的硬件盒子铺到Amazon等渠道，找KOL review一下，在线广告推一推，可以的。。。
Yup: 另外，做SaaS就真的不建议面向国内市场了，一定要先出海
小码哥: 多谢指导。前段时间接了一个港澳那边 Digital Signage 的项目，做完项目之后，大体上是这个思路
BobJiang: digital signage SaaS这个有利润，虽然规模不大，但是做深一点，复购还是可以。具体就考验你怎么执行了
小码哥: 确实，最近做了一个海外的digital signage项目，都是采购的软硬件产品来交付的，看到里面有不少地方可以去改进，关键的是项目的利润非常好。
验证产品需求的方法 Luo说不啰嗦: 加油！建议先验证需求再开动，选择比努力重要。
Tantan Fu: 请教一下如何验证需求呀？ 你看我的尝试，感觉验证不成功
Luo说不啰嗦: 首先，想清楚你的用户是谁，这个画像一定要越精准越好，不要试图一上来做一款 for everyone 的产品，这会成为你的负担。想清楚用户是谁之后，把人群特征用几个关键词列出来，这时候你就可以开始验证了：落地页/博客/社群/发帖, 尽可能多地收集线索 (leads)，和他们对话，做预售。</description>
    </item>
    
    <item>
      <title>逐渐消失的被依靠感</title>
      <link>https://lewang.dev/posts/2023-07-08-i-dont-need-you-any-more/</link>
      <pubDate>Sat, 08 Jul 2023 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2023-07-08-i-dont-need-you-any-more/</guid>
      <description>写了篇随笔记录送娃那天的心里感受，拍照片录视频很容易记录一些画面，但是想把自己的心里感受的记录下来，可能还是要靠文字
我的妹妹一家三口住在南方小镇，暑假之前儿子就和我说好，等放假了他要和奶奶一起去姑姑家找哥哥玩。上海南站有趟卧铺列车时间很合适，在高铁的时代，儿子从来没有体验过卧铺列车旅行，全家商量好之后，儿子决定尝试“新”的旅行方式。
送儿子和我妈去上海南站坐车，我先送他们到出发层，车站门口只能停 6 分钟，送他们到进站口后，我便马上返回车上开往停车场，准备在停好车之后再去车站找他们，还没等我停好车，儿子打来电话，好稚嫩的声音：“爸爸，你走吧，我们不需要你了，我们已经找到了候车的地方。”
我听完在夸他做得很好之后，除了惊讶，心里竟有了些失落，不过想到他那小小孩子就有了独立自信的样子，我心里也有了些许难以言说的自豪。
我刚出停车场没开出多远，我妈又打来了电话，说她在候车厅看到有人可以帮他们送上车，问我要不要让人送一下。我当然说同意，然后就听到我妈在电话里传来喊人的声音：“师傅，师傅，帮我们送上去” 。挂掉电话后，我继续驾车前行。
不一会儿，我正在高架上行驶，我妈再一次打来了电话。她告诉我他们已经到达了自己的卧铺座位，还告诉我他们没有找人送，因为我儿子不同意，死活不让别人送，坚持要自己去找位置。
其实在我妈打电话给我的时候，我也在想，虽然这是你们第一次坐卧铺车，但也没什么行李，是可以自己排队检票上车的。这时才明白原来我妈给我打电话是希望征得我的支持来否定她孙子的想法。
儿子继续在电话里和我说，奶奶路上一直在问人，他觉得没有必要，因为他有妈妈给他制作的乘车卡片，再根据车站里面的路牌指示，就可以认得路。我能想象出儿子他那坚定自信的样子，就像平时他坚持他可以自己建造他的乐高城堡一样。
祝他们旅途顺利。</description>
    </item>
    
    <item>
      <title>日常吐槽</title>
      <link>https://lewang.dev/posts/2023-03-20-thinking-daily-1/</link>
      <pubDate>Mon, 20 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2023-03-20-thinking-daily-1/</guid>
      <description>这几天在整理自己以前随意记录的文字,准备喂给 ChatGPT 看看能不能做出一个 AI, 真的 Talk to Myself, 顺便放几篇到博客上来充充数
本文写于 2018 年 8 月 28 日, 天气晴 28-33°C
这几天上海的天气都很不错，最近一个月台风特别多，而且巧得很都是周末来。最热的夏天已经过去了，早上骑着共享单车去云台路那边的星巴克办公，大概需要骑行 15 分钟。
每天骑车路上，总是有汽车不让路权的情形发生，没办法，肉身是斗不过杀人机器的，只好让让他们，人们的驾驶素养如此的差劲，没有好转的迹象，越来越让自己失去了对这个中国最发达城市一点点的爱。像这样的情形，几乎走在马路的人天天都会遇到，也没人愿意出来指责，姑且就这样吧。
想起来前几天在黄浦区人民政府那栋棺材楼附近，我绿灯走人行道过马路，还被转弯的烂司机指着警告，连一旁的金发外国友人都看了瞠目结舌。本想跟他较真到底，想想还是算了，祖国的人民警察那么忙，没空来处理这样的小屁事。就算来了又如何，对司机扣 2 分罚 100 块钱能有什么用？更何况，满大街的都是没有执法权的临时工警察(辅警协警), 喊了他们也没用, 就算喊来了，他们也是会催你赶紧走，别妨碍交通。哪里还有希望，我看不到。
不想太烦心，随他去吧，爱怎样就怎样，没人在乎。
每天的最快乐的时光是下班回到家里。和老婆一起陪陪孩子，做做游戏，聊聊天，轻松自在。今天和娃一起玩识字的游戏，一人写，家里剩下的人认字。儿子才三岁，当然不太认识几个汉字，但是他有很强的要“赢”的心态，一旦“输”就会伤心的哭起来。我妈说很像我小时候，自尊心太强了。
我不太认同自尊心太强这个说法。好在自己小时的那种感觉还没有完全消失，希望能帮助儿子自己找到问题（也可能不是问题），要让他知道，输了也无妨，至少可以看到自己的弱在哪里，而且能认识冠军赢家也挺好，输了也可以大方的走过去为赢家送去祝贺。更何况，很多事情根本也不是比赛，不一定要有输赢。</description>
    </item>
    
    <item>
      <title>Kindle 中国停止运营，一键下载已购买的电子书</title>
      <link>https://lewang.dev/posts/2022-06-06-save-your-kindle-ebooks/</link>
      <pubDate>Mon, 06 Jun 2022 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2022-06-06-save-your-kindle-ebooks/</guid>
      <description>前几天亚马逊宣告 Kindle 中国电子书店运营进行调整，通知标题写得比较委婉，其实就是亚马逊电子书即将退出中国市场，到时候我们购买的国行版 Kindle 将不能购买新电子书，也不能下载已经购买的电子书了。
如果购买的电子书比较多，手动一本一本的去下载是挺费时间的，我来分享一下我是如何使用 Python 一键下载所有电子书的。
安装 Python 用 Chrome 浏览器打开 https://python.org，下载最新版本的 Python 3.10.4
下载好然后运行 python-3.10.4-amd64.exe, 选择第一个选项，一定要记得勾选添加到 PATH，否则在命令行中执行 python 时会报错。
准备 Python 一键下载脚本 用 Chrome 浏览器打开 https://github.com/yihong0618/Kindle_download_helper，下载 ZIP 包后并且解压:
使用 Python 一键下载脚本 进入解压后的目录，点击鼠标右键打开一个命令行窗口
打开的命令行窗口是这样的：
接下来准备 python 的虚拟环境，在命令行窗口输入：
python -m venv venv 创建好虚拟环境之后，再激活虚拟环境，在命令行窗口输入：
.\venv\Scripts\activate.bat 安装 Python 脚本的依赖库，在命令行窗口输入：
pip install -r requirements.txt 至此，一键下载脚本准备就绪，在命令行窗口输入：
python kindle.py 这样看到了脚本的帮助提示：
接下来我们准备脚本需要的 cookie 和 csrf_token, 这两个值都需要通过 Chrome 浏览器获取。
获取 cookie 和 csrf_token 首先使用浏览器登录亚马逊账号，
登录地址 https://z.cn， 登录之后访问 https://www.</description>
    </item>
    
    <item>
      <title>写个程序把油管 YouTube 变成无限容量的网盘</title>
      <link>https://lewang.dev/posts/2022-05-27-store-files-as-youtube-videos/</link>
      <pubDate>Fri, 27 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2022-05-27-store-files-as-youtube-videos/</guid>
      <description>前几天刷新闻的时候，看到了一个代码仓库 YouTubeDrive 的介绍，他的作者在多年前用 Wolfram 语言（也就是 Mathematica） 编写了一段代码，可以将油管变成一个无限容量的大网盘，看完介绍之后我脑子里直接蹦出无数个“卧槽”，心里顿生“这样也行”的膜拜之情，不禁提问：这个是薅羊毛的最高境界吗？
说起 Wolfram 语言和 Mathematica，不得不提一下，它是我学习的第一个编程语言（汇编是第二个）。多年前我是在学校机房学的，当时只用它画画数学公式的图，今天看着 YouTubeDrive 的实现，才了解到 Wolfram 还可以这样用。
首先，和原作者一样，我也不提倡这样把 YouTube 当成一个无限容量的网盘使用，相同的道理，我也不提倡在国内把 B 站或者任意视频平台当做位无限容量的网盘来用。
昨天在看完 YouTubeDrive 源码之后，想着要不我也用 Python 实现一个，正好傍晚溜娃的时候，啥也不能干，就边走边想，我用 Python 应该怎么来实现一个？ 在坐着等娃的时候，就用手机查下资料，大概了解了一下 numpy 和 opencv 的使用，晚上吃过晚饭就开始写了，很快也实现了一个可以工作的 Python 版的。
我觉得这个想法还是挺有意思的，虽然不太靠谱，但是真的好玩。不想去读 Wolfram 源码的朋友可以看看我接下来的分析，看看是如何把文件变成 YouTube 视频的进行存储的。
磁盘上的文件是什么 在我们的计算机（无论电脑还是手机都是计算机）磁盘里，存放了很多很多的文件，例如图片，文档，视频等等，每种文件都有自己的类型，或者叫格式，一般我们都会给文件添加一个后缀名展示文件的类型，但是对于电脑而言，无论是什么文件，它都只是由比特（bit） 0 和 1 组成的数据。
例如这张图片：
用 vim 执行命令 :%!xxd，打开是这样的：
图片文件的头 4 个字节是 ffd8（其实 ffd8 说明了这个是 JPEG 格式的文件），ffd8 是 16 进制的表示法，比 2 进制看起来更清晰。
在计算机里，用 8 个 bit 表示一个 byte，即 1 个字节有 8 位，一个字节需要用 2 个 16 进制数来表示，例如：ffd8 是 2 个字节。</description>
    </item>
    
    <item>
      <title>grep，xargs 和 sed 的一次日常使用</title>
      <link>https://lewang.dev/posts/2022-05-21-replace-strings-in-all-files/</link>
      <pubDate>Sat, 21 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2022-05-21-replace-strings-in-all-files/</guid>
      <description>趁着周末空隙把自己年久失修博客整理了一下，用到了 grep，xargs 和 sed 命令，使用这 3 个命令组合批量替换了所有 Markdown 文件中的图片链接。
我的博客从我的学生时代就开始了，不断折腾自己的博客，所以学会了 HTML/CSS/JS，下次和大家分享一下我的博客旅程。
这里不详细讲解这 3 个命令的使用，这 3 个命令的使用可以写出来厚厚的一本书。如果希望详细的了解这些命令，可以在 Linux 的终端下输入这样的命令查看文档，例如查看 grep 如何使用：
man grep man 命令的常用操作:
退出: 按 q 键 查找：按 / 后输入查找关键字 下一页: 按 ctrl + d 或者 ctrl + f，tips: 这里的 d 大概是 down，f 大概是 forward 上一页: 按 ctrl + u 或者 ctrl + b，tips: 这里的 d 大概是 up，b 大概是 backward 查看其它命令的手册也是类似的。
我博客的问题 我的博客是用 hugo 构建的，所有的文章都放在 post 下面的目录里，图片则需要放在 static 的 images 下面，这样在用 vscode 写博客 Markdown 的时候无法在预览里面看到图片。于是我在 hugo 项目的根目录下添加了的一个 images 的符号链接到 static 目录下的 images， 才能解决图片预览的问题。</description>
    </item>
    
    <item>
      <title>命令行格式化 JSON</title>
      <link>https://lewang.dev/posts/2022-05-20-format-json-in-command-line-copy/</link>
      <pubDate>Fri, 20 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2022-05-20-format-json-in-command-line-copy/</guid>
      <description>今天要改 Docker 的两个配置 hostconfig.json 和 config.v2.json，打开一看，这个文件是单行的，在编辑器里面显示这是这样的：
代码都堆在一起，用 vim 格式化也没啥效果，编辑起来不是很方便。
Python 自带模块格式化 JSON 格式化 JSON 文件有很多方法，我最常用的就是 Python 自带的 json.tool 这个模块，只要安装了 Python 的电脑，都可以直接使用，这样就可以了：
python -m json.tool hostconfig.json &amp;gt; hostconfig-formatted.json 格式化以后再打开看一看：
这样编辑文件就方便多了。
与管道符一起使用 前面的例子我们还可以使用管道符(|)来实现，例如:
cat hostconfig.json | python -m json.tool &amp;gt; hostconfig-formatted.json 从 RESTful 接口直接获取数据并且格式化:
curl -s https://api.github.com/users/lewangdev | python -m json.tool 其它本地格式化工具 DevToysMac: MacOS 版的 DevToys or Windows，我是用 Windows 11 时候看到这个软件的，于是顺手搜了一下 MacOS 版的，也挺好用的。 jq: 除了像 sed 一样的处理 JSON 以外，还能把输出的 JSON 变成彩色的。 curl &amp;#39;https://api.</description>
    </item>
    
    <item>
      <title>如何打造国内开发所需要的网络</title>
      <link>https://lewang.dev/posts/2022-05-16-cndevnet-intro/</link>
      <pubDate>Mon, 16 May 2022 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2022-05-16-cndevnet-intro/</guid>
      <description>本项目正在调整，请稍等再使用
一个对国内开发者可能有点用的网络工具，cndevnet 帮助开发者，尤其是初学者不用再费心折腾 pip/npm/golang/flutter/android/blockchain 等等无法访问的问题。
背景 由于某些原因，国内开发者需要的不少技术站点或者镜像源都无法直接访问，这使得在开发者在日常工作中会消耗额外的时间，去设置各种代理或者寻找国内的可替代的镜像源来使用。
在开源软件的世界里，几乎所有的知名项目，原本只要把代码 clone 回来，不需要做额外任何配置，只需要按照它的说明就可以直接编译源码。但由于网络的原因，在国内甚至连开源软件的源码都不太方便直接下载，一些原本只需要从 GitHub 拉下来代码就可以直接编译成功的项目，在国内也是连编译都编译不过。
国内开发者群体是非常庞大的，所以我看到了很多知名的开源项目为中国用户在 README.md 文档或是页面的显著位置都增加了中文提示，去引导国内开发者去使用国内的镜像。
Flutter
powerlevel10k
但是，我想这种做法应该不属于 i18n，因为我很少看到有引导日本的开发者去用日本的镜像，或者引导德国的开发者去用德国的镜像，这看似解决了访问慢或者无法访问的问题，但其实是加剧了国内开发者与全球互联网的割裂，在开发者的世界里面，也形成了国内和国外两个网络。
给系统或软件单独设置代理，或者寻找国内的可替代的镜像源我都觉得不是一个好方案，因为这样在国内的你总会遇到各种各样的国外开发者就不会遇到的问题，最好还是能够拥有一个与国外开发者“用起来”好像是一样的网络环境。
cndevnet 就是为了解决这个问题而创建的，希望能帮助到和我一样遇到相同问题的国内开发者。
从 Linux 开始 cndevnet 可以在 Linux 环境下搭建一个专为初学开发者设置的开发网络，搭配使用 vscode 进行远程开发是一种不错的体验，适合学习 python/golang 等。
Linux 环境可以是在国内云平台上的一台云主机，也可以是运行在本地虚拟机里面的主机，或者是局域网中的一台 Linux 主机。
Debian 是一个非常棒的 Linux 发行版，推荐希望学习 Linux 的初学者使用。如果希望使用带有图形界面的 Linux 系统，Ubuntu 也是一个非常好的选择。
cndevnet 使用了以下软件和服务 Debian：目前支持的 Linux 系统 Docker: 用于运行 gost 和 smartdns 服务 gost: 用于建立 WSS(Websocket over TLS) 服务 smartdns： 用于解决 DNS 污染 dnsmasq-china-list： 国内域名 Cloudflare IP Range: Cloudflare 的 IP 范围 Cloudflare: Cloudflare 的 WSS 代理服务 Oracle Cloud: Oracle Cloud 的云主机 cndevnet 原理 cndevnet 通过 iptables 等工具和数据实现了系统的透明代理，由于是系统级的透明代理，所以在启用了 cndevnet 的 Linux 系统上，是不需要为系统或者各类开发工具或者服务单独设置代理的。</description>
    </item>
    
    <item>
      <title>写了一个 ShadowsocksX-NG 的 gost 插件</title>
      <link>https://lewang.dev/posts/2020-12-02-add-gost-plugin-for-shadowsocks-ng/</link>
      <pubDate>Wed, 02 Dec 2020 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2020-12-02-add-gost-plugin-for-shadowsocks-ng/</guid>
      <description>gost 是一个非常有用的网络工具，可以在 ShadowsocksX-NG 中安装 gost 插件，方便在 ShadowsocksX-NG 中使用 gost。
原由 自从查资料上网工具换成 gost 之后，由于 MacOS 上没有 gost 专用的智能代理（也就是该翻的时候翻，不用翻的时候不翻）桌面客户端，所以需要用 gost 在本地把 wss 代理转成 ss 后再继续使用 ShadowsocksX-NG。 虽然可以用 launchctl 启动一个 gost 后台服务，但是用起来还是不太方便。
看了下 ShadowsocksX-NG 是如何工作的： ShadowsocksX-NG 会在本地启动 ss-local 进程跑一个 socks5 服务，而且 ShadowsocksX-NG 实现智能代理的逻辑与 ss-local 并没有太多的关系，所以只要在想办法本地能提供一个 socks5 服务就够了。
于是写了以下脚本替换了 ShadowsocksX-NG 安装目录下的 ss-local(替换之前要备份一下这个文件)
#!/bin/sh - #/opt/gost/gost -L=sock5://:1086 -F=wss://username:password@1.1.1.1:443 # Use gost.json #{ # &amp;#34;Retries&amp;#34;: 3, # &amp;#34;Debug&amp;#34;: false, # &amp;#34;ServeNodes&amp;#34;: [ # &amp;#34;socks5://127.0.0.1:1086&amp;#34; # ], # &amp;#34;ChainNodes&amp;#34;: [ # &amp;#34;wss://username:password@1.</description>
    </item>
    
    <item>
      <title>机房不能访问互联网，轻松搞定系统部署</title>
      <link>https://lewang.dev/posts/2020-11-27-go-through-the-system-firewall/</link>
      <pubDate>Fri, 27 Nov 2020 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2020-11-27-go-through-the-system-firewall/</guid>
      <description>创业这段时间以来，我们的 IoT 系统已经在不少客户的机房做了私有化部署，客户大多都是机加工厂、商业大楼、医院和大学实验室等，客户的机房都有一个相同的特点：私有云，与外网隔离，不能访问互联网。或者更为准确的说，是我们部署的服务器不能访问互联网，在没有互联网访问权限的情况下，系统的包管理工具(yum/apt/docker)都无法使用了，在这种情况下进行系统部署安装，费时费力，而且无法进行远程部署维护，也大大增加了项目的实施成本。
在最近的一个客户项目的实施过程中，看到客户的一些其他供应商在系统部署过程中非常艰难，甚至是 CentOS 系统初始化和 Docker 的安装就花掉了两个礼拜的人力，不排除一些供应商这样折腾会给他的客户留下工作敬业钱花的值的好印象，但对于我们这样的小创业公司来说，这样的时间浪费和低效是无法承担的成本，因为来实操部署的人就是公司老板本人了，我也不想出差在客户这里待上两个礼拜。
在工作完成之后，想想可以把解决问题的方法记录一下，也许能给遇到相同问题的同行一些启发和帮助。好了，废话不多说，接下来我们就来解决这个无外网的部署问题，顺便再解决一下远程维护的问题。
一、面临的问题 在部署和维护一个私有化企业内部使用且无互联网访问的系统中，可能会面临以下问题:
机房服务器无法访问 Internet 可通过接入企业内网来访问服务器，而从服务器无法直连办公室网络，即机房和办公室在不同的网段 无互联网访问权限的情况下，无法直接使用系统的配置工具，如 yum/apt/docker 等，配置系统和部署服务费时费力 无法远程进行维护 客户内网拓扑示意图，此处省略了防火墙，简化拓扑图的复杂度，如下:
网络拓扑图说明:
机房和办公室不在一个网段 机房网段假设为 172.22.0.0/16，办公室内网 WiFi 的网段为 192.168.137.0/24 机房服务器之间是互通的，办公室可以 ping 通机房服务器，在机房服务器上无法 ping 通办公室部署控制主机，这里假设办公室网络作为一个 NAT 放在上层交换机后面 内网没有互联网访问权限，包括机房服务器和办公室内网 WiFI 二、解决问题的方法 既然是由于机房服务器没有互联网访问权限，不能联网下载安装包，那就想办法让机房服务器可以连接互联网或者搭建内网的软件包镜像服务，于是想到一些方法来达到目的:
告知客户问题，申请开通互联网访问权限，可以限定为指定的网址和协议(HTTP/HTTPS)，需要远程维护的化，还需要申请可以连接到服务器的 VPN。这个方法在需要客户的进行审批，可能时间比较长。我们的客户中有不少都没有自建 VPN，或这不方便给我们开通 VPN，另外也无法开通需要我们部署的服务器的互联网访问权限，所以不能使用这个方法
在客户机房放置可以通过 4G 上网的堡垒机，堡垒机接入客户机房网络。在客户机房放一个堡垒机，虽然说是堡垒机，但可能客户那边的机房管理也还是不容许放置这样的机器的，所以也不能使用这个方法
搭建 yum(CentOS)/apt(Debian/Ubuntu)/docker 的内网镜像服务，搭建内网镜像服务可能就是一个比较艰巨的任务，难以接受给自己又添加了一个艰难的任务，此方法也作罢
通过在办公室网里放置部署控制机，同时连接内网和 4G 路由器提供的外网(互联网)，在部署控制机上搭建 SDWAN 或者 HTTP 代理，yum/apt/docker 都支持 HTTP 代理，这样修改系统配置之后，就可以通过代理安装部署服务，这个方法比较简单，而且几乎不需要客户的参与就可以完成。不过也有一些前置条件，例如:
办公室中主机可以接入客户网络
客户服务器允许办公室网络中主机通过 TCP 或者 UDP 访问其任意或者指定的端口
客户办公室的 4G 网络信号要足够好，这样可以提供更好的外网速度
拥有服务器的 root 管理员权限(需要安装软件和修改系统配置)
通过权衡利弊，我们最终使用的是第 4 个方法来搭建的，下面来讲讲搭建的过程。</description>
    </item>
    
    <item>
      <title>大象（Gradle）的故事：一见如故</title>
      <link>https://lewang.dev/posts/2020-02-22-hello-gradle-1/</link>
      <pubDate>Sat, 22 Feb 2020 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2020-02-22-hello-gradle-1/</guid>
      <description>小码哥：“与大象（Gradle）一见如故？你就是 Gradle？”
大象：“对，我就是那个用来构建 Java 项目的 Gradle 大象。 ”
小码哥：“我好像天天都在用你啊。看，我的项目都是用你构建的。”
大象：“但你不一定真的认识我，你每次修改点构建代码时是不是都要问下谷哥哥（Google）或溢栈哥哥（StackOverflow）？”
小码哥：“额。。。”
大象：“我是你的老朋友了，不要天天如初见哦，咱们得多聊聊，我爸妈给我写了传记（文档），估计你也懒得细看，不如我给你做个自我介绍吧。”
小码哥：“👌ok”
大象：“你有用 InteliJ IDEA 吗？ ”
小码哥：“对，用的社区版。”
大象：“那我就用 InteliJ IDEA CE 版来给你介绍自己”。
你好，我是 Gradle！ Gradle 是一个用来自动化构建项目的的工具，可以用来构建你常用的 Java、Kotlin 等 JVM 语言开发的项目。我的配置文件可以使用 Gvoovy 或者 Kotlin 来编写，不像隔壁前辈 Maven 那样，要写一大段 XML，你可以很开心的像写代码一样来调整我的配置。
其实我就是你的代码自动化产线，产线有几个工序（Task），你负责喂我代码，我负责打包（Jar/War/JavaDoc/Test）。是不是觉得与科幻片里面的工厂很像？
创建项目 请打开你的 InteliJ IDEA CE，使用 idea 可以很方便的创建一个由我构建的项目(File &amp;gt; New &amp;gt; Project&amp;hellip;)。
这里在对话框的左边栏选择 Gradle，右边选择 Java 项目。
输入好项目名之后点击 Finish 就可以啦。
探索项目 idea 帮我们创建了一个 Java 项目，浏览项目很容易发现两个以 gradle 为结尾的文件： build.gradle 和 settings.gradle。我们来看一下它们俩的内容。
settings.gradle</description>
    </item>
    
    <item>
      <title>游方塔园</title>
      <link>https://lewang.dev/posts/2019-11-02-fangta-paintings/</link>
      <pubDate>Sat, 02 Nov 2019 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2019-11-02-fangta-paintings/</guid>
      <description>昨日陪小糍粑参加幼儿园秋游活动，游览了一下位于松江区的方塔园，校方安排幼儿在白色布袋上绘画，于是有了以下大作。
观察幼儿绘画的过程挺有意思的，我们父母无须提供任何绘画的指导，只要等待小朋友们绘画完毕，来听听他们关于自己的画的解释即可。
关于上面的画，小糍粑是这样解释的。
他和爸爸来看方塔，想象和爸爸在方塔里面，草地的旁边有水，有果树(梨树)，有蓝天，蓝天上面有飞机在飞，他穿着红色的衣服和黑色的鞋子。
我感觉他画的非常自信，有考虑绘画的布局，所有的线条几乎都是一笔成型，丝毫不拖沓，很符合这个年龄幼儿的表现。
图里面有个地方是我画的，大家可以猜猜是哪里。</description>
    </item>
    
    <item>
      <title>WireGuard 使用简介</title>
      <link>https://lewang.dev/posts/2019-10-30-wireguard-go-setup/</link>
      <pubDate>Wed, 30 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2019-10-30-wireguard-go-setup/</guid>
      <description>背景 搭建 VPN 方便连接无公网 IP 云主机进行开发，WireGuard 配置比 OpenVPN 要简单很多，WireGuard 是通过 Linux 内核模块的方式实现的，这样性能最好，但是只能用在 Linux 系统上。本文使用的 wireguard-go， 则是使用 Golang 实现的 WireGuard 协议，属于用户空间(User Space)的实现，性能没有内核模块方式好，但好处就是跨平台且更简单易用。
VPN 的用处非常的多，不像 frp 之类的端口穿透应用，它是直接建立虚拟的网络，网络中的每个客户端也都可以拥有自己独立的 IP，于是测试调试就没有了端口的限制，非常的方便。
除了方便安全连接云服务器，还可以通过 VPN 搭建工业设备的远程部署和维护的解决方案。
编译 wireguard-go # 使用 GitHub 的源码镜像，速度会快一些 git clone git@github.com:wireguard/wireguard-go.git # 在 MacOS 下交叉编译 CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -v -o &amp;#34;wireguard-go&amp;#34; # Linux 环境下直接编译 go build -v -o &amp;#34;wireguard-go&amp;#34; cp wireguard-go /usr/sbin/ 编译 WireGuard tools git clone git@github.com:wireguard/wireguard.git # 安装依赖 ## debian&amp;amp;ubuntu sudo apt-get install libmnl-dev libelf-dev ## centos sudo yum install libmnl-devel elfutils-libelf-devel cd wireguard/src/tools make sudo make install 配置 WireGuard 生成密钥</description>
    </item>
    
    <item>
      <title>小糍粑的画</title>
      <link>https://lewang.dev/posts/2019-10-13-sons-paintings/</link>
      <pubDate>Sun, 13 Oct 2019 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2019-10-13-sons-paintings/</guid>
      <description>2019/10/13 上午大作 画了一辆坦克
2019/10/10 晚大作 1 2 3 4 小糍粑自己介绍： 爸爸妈妈宝宝奶奶和他的同学，右一是奶奶，右二是爸爸，右三是他自己，右四是妈妈，奶奶没地方画了
点评： 很明显的出现头足人像</description>
    </item>
    
    <item>
      <title>树莓派系统日志配置</title>
      <link>https://lewang.dev/posts/2019-09-19-rpi-log-config/</link>
      <pubDate>Thu, 19 Sep 2019 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2019-09-19-rpi-log-config/</guid>
      <description>背景 树莓派 raspbian 系统日志默认的配置会导致日志过大而占用太多的存储空间，并且频繁写日志也可能减短 EMMC 和 SD 卡的寿命，需要重新配置来满足项目的需求。
日志位置 /var/log /var/log/syslog /var/log/daemon.log /var/log/mail.info /var/log/mail.warn /var/log/mail.err /var/log/mail.log /var/log/kern.log /var/log/auth.log /var/log/user.log /var/log/lpr.log /var/log/cron.log /var/log/debug /var/log/messages 配置 rsyslog 与 logrotate rsyslog 的配置文件为 /etc/rsyslog.conf, 找到其中 RULES 段
############### #### RULES #### ############### # # First some standard log files. Log by facility. # auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog #cron.* /var/log/cron.log #daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log 将其中 daemon.* -/var/log/daemon.log 行注释掉，syslog中已经包含 daemon 的日志。</description>
    </item>
    
    <item>
      <title>如何修改 Linux 用户的 UID 和组的 GID</title>
      <link>https://lewang.dev/posts/2019-07-16-change-uid-gid-in-linux/</link>
      <pubDate>Tue, 16 Jul 2019 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2019-07-16-change-uid-gid-in-linux/</guid>
      <description>问题 在使用 Docker 或者 NFS 的时候，需要文件系统挂在到不同的系统中拥有正确的读写权限，需要指定文件所属用户和组的 uid 和 gid。在创建用户和组的时候，系统会自动分配对应的值，这导致在不同的系统中很容易造成 uid 和 gid 不一样而造成读写权限混乱。
例如在系统 A 中，用户 git 的 uid 和组 git 的gid 如下:
[sysops@cn-bj-aliyun-3 ~]$ id git uid=1001(git) gid=1001(git) groups=1001(git) 而系统 B 中的值如下:
[sysops@cn-bj-aliyun-3 ~]$ id git uid=998(git) gid=998(git) groups=998(git) 我们在系统 A 以 git 用户创建目录或者文件:
[git@cn-bj-aliyun-3 data]$ ls -lh total 60K -rw-r--r-- 1 git git 100 Jul 5 23:22 file1 -rw-r--r-- 1 git git 400 Dec 18 2018 file2 -rw-r--r-- 1 git git 349 Dec 18 2018 file3 将这个目录挂在到 B 系统中时，将会出现这种情况:</description>
    </item>
    
    <item>
      <title>CentOS 7 上使用 pyenv 安装 Python 3.7.3</title>
      <link>https://lewang.dev/posts/2019-05-29-centos7-pyenv-install-python-3/</link>
      <pubDate>Wed, 29 May 2019 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2019-05-29-centos7-pyenv-install-python-3/</guid>
      <description>概要 本文记录了在 CentOS 7.6 系统上通过 pyenv 安装 Python 3.7.3 的过程。
环境 CentOS Linux release 7.6.1810 (Core) Kernel 3 3.10.0-957.el7.x86_64 Pyenv 1.2.11 安装 pyenv $ curl https://pyenv.run | bash 然后根据提示把以下内容放到 ~/.bashrc 文件末尾
# Load pyenv automatically by adding # the following to ~/.bashrc: export PATH=&amp;#34;/root/.pyenv/bin:$PATH&amp;#34; eval &amp;#34;$(pyenv init -)&amp;#34; eval &amp;#34;$(pyenv virtualenv-init -)&amp;#34; 安装 Python 3.7.3 准备
$ sudo yum -y install xz bzip2 bzip2-devel sqlite-devel gcc openssl-devel readline-devel zlib-devel libffi-devel 安装</description>
    </item>
    
    <item>
      <title>Java 进阶要点</title>
      <link>https://lewang.dev/posts/2019-03-06-keynotes-of-new-java/</link>
      <pubDate>Wed, 06 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2019-03-06-keynotes-of-new-java/</guid>
      <description>自己学习 Java 和用 Java 过程中的理解和备忘的知识点。
JDK 11 Oracle 不在免费提供 LTS 版本了，包括 JDK 8 ZGC, 可伸缩的、低延迟的垃圾收集器，STW 时间不超过 10ms Nashorn 标记为 Deprecate 了 JDK 9 module try-catch 简化 _ 为保留关键字 var 将在 JDK 10 中作为关键字, 作为本地变量类型推断关键字 字符串相关，主要是 Compact String, 用 byte[] 替换了 char[], char 在 Java 中占两个字节 G1 作为默认垃圾回收器 JVM 启动 JVM 相关的命令行参数 G1 垃圾回收器 内存 JVM(Hotspot) 内存结构 制造各种 OutOfMemery 和 StackOverflow 各种 JVM 相关工具(jstat/jmap/jstack/jps 等) 解决 FullGC 的问题 引用：WeakRefrence/PhantomReference/SoftRefrence/FinalRefrence 等 ClassLoader/URLClassLoader Spring Boot 的 ClassLoader 自定义 ClassLoader 多线程和并发 JVM 的线程模型 1:1 协程 创建线程的方法 线程同步 synchronzied/对象锁/类锁/锁方法/锁锁代码块 线程池 锁相关（Lock 接口和实现类） Condition volatile ThreadLocal 用途和实现 并发（CAS/乐观锁/无锁/无等待/无阻塞） 字节码 基本结构 操作字节码的工具 Javassist/ASM AOP 集合 Collection,List,ArrayList,Vector,LinkedList, SkipList, Stack Queue HashMap/HashTable HashMap 扩容死循环问题 LinkedHashMap TreeMap HashSet,TreeSet WeakHashMap 并发相关的集合 ConcurrentHashMap CopyOnWriteArrayList IO IO 模型 NIO Non-blocking IO Java 8 IO 相关的接口和类 Netty Vert.</description>
    </item>
    
    <item>
      <title>树莓派 CM3/CM3&#43; 刷写系统</title>
      <link>https://lewang.dev/posts/2019-03-01-rpi-cm3-emmc-flashing/</link>
      <pubDate>Fri, 01 Mar 2019 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2019-03-01-rpi-cm3-emmc-flashing/</guid>
      <description>准备 阅读Flashing the Compute Module eMMC 准备一个可以刷系统的底板，我用的是微雪Compute-Module-IO-Board-Plus 步骤(Linux 系统下刷系统，可以使用树莓派来刷机) sudo apt install git libusb-1.0-0-dev git clone --depth=1 https://github.com/raspberrypi/usbboot &amp;amp;&amp;amp; cd usbboot &amp;amp;&amp;amp; make sudo ./rpiboot 连好线，跳线部分见各自底板的手册 拔掉 USB SLAVE 1/2/3/4 拔掉 SELECT 跳线帽 将 BOOT ENABLE USB SLAVE 跳线帽接到 EN 端 sudo fdisk -l 查看磁盘名称，这里是 /dev/sda sudo dd if=raspbian-lite.img of=/dev/sda bs=4MiB 刷入系统后，挂在启动分区，添加 SSH 来开启 SSH 服务，sudo mount /dev/sda1 /media cd /media &amp;amp;&amp;amp; touch SSH 使用慧通科技出品的 HuiBox-700 底板 省略上述的第4步，其它步骤完全一样</description>
    </item>
    
    <item>
      <title>使用 Docker 方式安装 Gitlab，没你想得那么简单</title>
      <link>https://lewang.dev/posts/2018-12-18-gitlab-docker-install/</link>
      <pubDate>Tue, 18 Dec 2018 23:25:20 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2018-12-18-gitlab-docker-install/</guid>
      <description>为什么要写这篇文章？ 曾经几年前在 Docker 还没有广泛应用的时候，在公司使用过源码的方式安装和升级过 Gitlab，虽远没有 Docker 方便，因为自己对 Linux 系统的理解，所以整体上感觉还是挺简单的。这几年随着 Docker 的普及，使得安装 Gitlab 更加的容易，不仅方便了我这样的老鸟，也更方便了小白用户们。但是 Gitlab 官方的 Docker 安装文档并没有写得很完善, 除了官方文档之外，检索出来的安装文档也是人云亦云，东拼西凑，结果也就是能运行起来，凑合着能用而已。避免出现下图中“我已经用 Docker 部署好啦”，其实已经翻车的情形。
我希望每做一件小事的时候也都能抱着“知其然知其所以然”的心态对待，用 Docker 方式安装 Gitlab，说简单来说就是一行命令的事儿，但是这样就够了吗？我看是不够的，所以就有了这篇文档。
本文需要达成的事项 在 CentOS 7 系统中安装 Docker 使用 Docker 方式安装中文版 Gitlab 和宿主机器共用 22(SSH) 端口 支持 SSH(22)/HTTPS(443) 方式推拉仓库 使用 SMTP 方式配置通知邮箱(腾讯企业邮箱) 改写默认的项目标签(Labels) 在 CentOS 7 系统中安装 Docker 这部分参考 Docker 的官方文档, 罗列一下安装步骤, 细节请看 Docker 的官方文档。如果使用 root 用户安装，sudo 可以去掉。
1. 删除老版本 Docker $ sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine 2.</description>
    </item>
    
    <item>
      <title>有关 2017 流水账和胡思乱想的记录</title>
      <link>https://lewang.dev/posts/2017-12-31-year-end-reviews-of-2017/</link>
      <pubDate>Sun, 31 Dec 2017 00:08:25 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2017-12-31-year-end-reviews-of-2017/</guid>
      <description>好久没有写过文字了，前几篇文也是自己从 Google Doc 中摘出来的工作日志，拿来凑凑数，刷新下 Github 的时间线，有点儿不太像话。看看自己书桌上叠起来超过一尺高的新书才知道，想看的还没来得及看完，想学的也还没来得及学会，想做的也没有做得很好，一年就过去了。2017 是我来魔都的第 5 年，回想这 5 年，自己的成长还是很多的，但 2017 这一年，好像与 2016 并没有什么大的不同，这让自己感到很担忧。
在 2017 年的最后几天，终于离开了自己熟悉的工作环境，从自己的舒适空间加入了一个新的环境，我想这就是改变的开始，一个新的起点。
2017 是平淡的，可能和未来的每一年也不会有太大差别，尽管我不希望这样。元旦假期这 3 天有空的时候都在回想，但是又想不起有那些特别印象深刻的事情，以至于总结都不太好写下去。我想那不如就回想几个和自己有关系的场景，做一个清单好了：
Bye 2017 区块链和比特币 人工智能（AI） 物联网大数据 Insurtech 和 Fintech 关于个人职业发展的思考 Hello 2018 Bye 2017 编程语言学习 Golang：完成基本语法学习（官方文档和《Go 语言实战》），可以无障碍阅读 Golang 项目代码（《自己动手写 Java 虚拟机》），并且可手动完成简单 Golang 项目用 Python 重写，主要有 eureka client Kotlin：除协程外，完成官方文档中所有语言部分的学习内容，并使用 kotlin 开发了 2 个项目，其中一个是用 kotlin 重写了 Aprereo CAS 的核心功能 TypeScript：完成基本语法学习，目前没有实际应用的场景，希望从 2018 起，自己在需要写 JavaScript 的地方，全部用 TypeScript 来代替 书籍阅读 阅读量太少，希望在 2018 年里能增大阅读量。
技术类 《图说区块链》 严格讲不算技术类书籍 《自己动手写 Java 虚拟机》 《Go 语言实战》 《贝叶斯思维》未读完 《Spark 高级数据分析》未读完 《垃圾回收的算法和实现》未读完 《机器学习》未读完 文艺类 《追风筝的人》 今年读到最长的一篇小说， 从作者笔下故事了解了阿富汗的人文历史，很是感动和惊讶。另外就是觉得译者也很厉害，从头读到尾，除了人名，没觉得是在读一本英文翻译过来的书 《灿烂千阳》未读完 《上帝掷骰子吗》 感觉写这本书的作者应该是个天才，搜了一下，很神秘的作者 《乡关何处》 看着也挺有意思的 《野火集》 读晚了，读的大陆删节版，我觉得每一个人都应该读下这本书 《自私的基因》 《创业者的窘境》 看完觉得最该读这本书的人应该是我老婆 还有就是身边的亲密好友或同学 《人类简史》未读完 Kindle 版，用手机看的，亚马逊真牛逼，让我买了一个 kindle 放在家里吃灰 开源技术 计划搭建一个开源物联网平台，还没有想好具体要做的事情，所以没有什么进展 整理了常用的 docker templates，docker 和 python 一样成为自己不可或缺的工具 家庭网络 升级了硬件和软件，让家里无线网络有了更好的覆盖，并且让所有家庭联网设备都可以自由的访问互联网 儿子最喜欢的应用是 Youtube Kids 区块链和比特币 不记得是哪一天了，大约是在几个月之前，和同事在兰州料理吃午饭，这段时间大家都在讨论 ICO，区块链，交易所的事情，我突然想起自己在 2013 年的时候曾经关注过比特币和区块链，并且那个时候买了一些瑞波币，于是回去查了一下，私钥和地址都还在，并且由此莫名其妙赚到了人生的“第一桶金”。</description>
    </item>
    
    <item>
      <title>LVM 实战记录</title>
      <link>https://lewang.dev/posts/2017-08-03-lvm-in-action/</link>
      <pubDate>Thu, 03 Aug 2017 23:55:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2017-08-03-lvm-in-action/</guid>
      <description>背景 阿里云云主机两块 100G 的云盘合一个逻辑卷（LV）来使用，单个的 100G 磁盘不够用，需要合在一起使用，并且方便以后扩容
基本知识 磁盘 /dev/xvdb /dev/xvdc 分区, 使用 fdisk 进行分区 fdisk &amp;gt; n &amp;gt; p &amp;gt; 1..4, 主分区最多只有 4 个 准备分区后，将分区类型变为 LVM 分区，fdisk &amp;gt; t &amp;gt; 8e, 8e 是 LVM 类型 ID 物理卷（PV），卷组（VG），逻辑卷（LV），从磁盘分区创建 PV，通过 PV 创建 VG 或者把 PV 加入已有的 VG，在 VG 上创建 LV，LV 看起来就是逻辑的上磁盘，使用和真实的磁盘没什么明显区别, 在 LV 上构建文件系统 创建 创建物理卷 pvcreate /dev/xvdb1，对分区进行操作 创建 vg0 卷组 vgcreate vg0 /dev/xvdb1 查看卷组 vgdisplay， 可以看到卷组有多大 在 vg0 上创建 data 逻辑卷 lvcreate -L 99G -n data vg0 或者 lvcreate -l 25556 -n data vg0 创建文件系统 mkfs.</description>
    </item>
    
    <item>
      <title>日志收集和分析系统架构</title>
      <link>https://lewang.dev/posts/2017-07-23-log-processing-system/</link>
      <pubDate>Sun, 23 Jul 2017 22:30:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2017-07-23-log-processing-system/</guid>
      <description>背景 微服务，日志分散且种类多（php/java/python），用 docker 起应用，日志通过卷放在宿主机器指定目录下，服务有众多实例，metrics 数据也不仅相同，无论是日志还是 metrics 数据，都可以看作是时间序列数据
分散主要表现为：
多个主机 多个目录下多个文件 应用开发所使用的技术栈不同日志格式不同 web log（主要是 nginx） 各类事件 一些其它事务性的日志 日志为时间序列数据，包括：
系统日志: 各类系统产生的跟业务有关的日志或者与业务无关的日志 web 服务器日志：如 access.log/error.log 等有固定格式的日志 性能监控日志：打点记录各类服务的 metrics(全部为数值类型 long/double/bool) 系统日志 由时间戳、一些枚举值以及日志内容(变长字符串)组成
日志时间颗粒度：支持毫秒/秒 枚举值包括： [必选]主机名/host [必选]服务名/service [必选]实例编号/instance [必选]日记级别/level：info/debug/warn/trace/error 等 [可选]异常名/exception: 如果是异常，把异常名作为枚举值记录 [可选]线程名/thread: [可选]方法名/method： [可选]文件名/file： [可选]行号/line： 日志内容(变长字符串): 为实际记录的内容以及异常堆栈信息 web 服务器日志 access log（nginx） 日志内容：主要是文本(string）或者一些系统 metrics 数据(数值类型 long/double)
日志存储和处理： 数据磁带（1 周）：kafka 提供热数据检索（1 个月）：solr(or lucence based on cassandra) 日志存储（永久）： kariosdb/cassandra: 支持 double/long/string 类型，kariosdb 相当于在 cassandra 上面套了一个壳，这样简化了很多时间序列数据处理的操作 数据展示：grafana，官方支持 kariosdb 扩展：数据深度挖掘分析 系统架构 特点：</description>
    </item>
    
    <item>
      <title>Log4j2 快速入门</title>
      <link>https://lewang.dev/posts/2017-07-15-log4j2/</link>
      <pubDate>Sat, 15 Jul 2017 23:31:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2017-07-15-log4j2/</guid>
      <description>背景 Java 生态下的日志库太多，配置也不同，大多数情况下会使用 SLF4j (又引入了一个库)来抽象日志接口。在使用 Log4j2 后，发现可以不使用 SLF4j 了，并且配置变得更简单，可以使用 lombok 的 log4j2 注解等。
需要搞清楚
如何设置哪些日志要记录下来 日志记录到哪里去 LEVEL 日志级别： 内置（有 Fatal）：All &amp;lt; Trace &amp;lt; Debug &amp;lt; Info &amp;lt; Warn &amp;lt; Error &amp;lt; Fatal &amp;lt; OFF 还可以自定义： https://logging.apache.org/log4j/2.0/manual/customloglevels.html Appender: 日志输出的目的地 内置的目的地有：
console, files（FIle/RollingFile）, remote socket servers, Apache Flume, JMS, remote UNIX Syslog daemons, various database APIs &amp;hellip; Appender 在接受到日志以后，可以通过级别过滤选择记录日志，具体配置： https://logging.apache.org/log4j/2.0/manual/appenders.html
Logger 负责决定哪些日志要记录和发配日志 哪些需要记日志，设置什么级别，并且配置日志输出到哪些个 Appender 中去都在 Logger 中配置。Logger 有类似继承的关系，名为 Root 的的 Logger 为所有 Logger 的根，也就是说没有做特殊设置（additivity=false), 那么这个 Logger 的日志将会记录到自己指定的 Appender，并且也都会记录到自己所有“父” Logger 设置的 Appender 中去</description>
    </item>
    
    <item>
      <title>MySQL 数据备份和不停机重新搭建主从同步</title>
      <link>https://lewang.dev/posts/2017-06-06-xtrabackup/</link>
      <pubDate>Tue, 06 Jun 2017 12:15:07 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2017-06-06-xtrabackup/</guid>
      <description>背景 目前公司主要服务都是直接使用 MySQL 主服务器，从服务主要给离线数据分析服务使用，由于前期弄得比较简单的粗暴，从服务上还有一两个数据库在做生产使用, 并且从服数据已经不能和主服进行进行同步了，有大量错误，忽略都没有办法进行。此外，主服仅配置了三个核心数据的 binlog，随着业务的变化，其它数据库不能走主从这条路来同步数据，于是希望不停机的情形下重新调整主服配置，记录所有的数据库的 binlog，同时添加新的从服务器来同步数据
方案 1 MySQL 的主从是通过同步 binlog 日志来实现数据同步的，于是需要想办法把从服数据先于主服同步，记录 binlog 的 pos 值，再配置从服从该 pos 处开始同步，考虑可以使用 mysqldump 导出所有 innodb 数据，使用 rsync 同步所有 myisam 数据文件，然后再开启主从同步。但是目前这种方案不适用，主服不能长时间停机
方案 2 使用 xtrabackup 来完成目标
主从服务器上都需要安装 xtrabackup（实际使用 xtrabackupex）：
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-4/percona-release-0.1-4.noarch.rpm yum install -y percona-xtrabackup-24 主服： 备份数据 # 注意数据库名称的转义，例如 - 号是 @002d innobackupex --defaults-file=/etc/my.cnf --socket=/var/lib/mysql/mysql.sock --user=root --password=xxxx --parallel=2 --databases=&amp;#34;db1 db2&amp;#34; /data/backup/xtrabackup/ 保持事务一致 innobackupex --apply-log /data/backup/xtrabackup/2017-06-06_13-16-21/ 同步数据 rsync -avHz 2017-06-06_13-16-21 sysops@cow:/data/backup 从服： 修改 my.cnf 相关配置，恢复备份数据</description>
    </item>
    
    <item>
      <title>办理机动车临牌</title>
      <link>https://lewang.dev/posts/2016-01-28-banlinpai/</link>
      <pubDate>Thu, 28 Jan 2016 11:55:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2016-01-28-banlinpai/</guid>
      <description> 政策已变，目前只能办理有效期为 15 天的临牌，并且最多只能办理两次
问题 外地户口，上海购车办理机动车(出省)临牌(出省和不出省的临牌办理方法一样,出省临牌有效期是30天，不出省的是15天)
文档记录状态 可用
发生时间 2016年01月28日9:00至9:30
体验得分 90
办理地点 黄浦公安分局交警支队，地址上海黄浦区陆家浜路88号（地铁4号线南浦大桥站1号出口200米处）
可办理时间 周一至周六 8:30-17:00
需要材料 车辆合格证原件和复印件 购车发票原件和复印件 交强险保单原件和复印件 身份证原件和正反面复印件 零钱5元 办理流程记录 进入大厅后跟保安说办理机动车临牌，拿一张《申请办理机动车临时号牌单》，然后坐在椅子上排队并填好临时号牌单 等待办理, 交警会打印两张临牌出来 恭喜你，没有第3步，可以拿着临牌走了 提高效率的小提示 自带黑色签字笔一支 原件和复印件分开成两份 </description>
    </item>
    
    <item>
      <title>驾照转入换证</title>
      <link>https://lewang.dev/posts/2015-10-15-huanzheng/</link>
      <pubDate>Thu, 15 Oct 2015 11:55:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2015-10-15-huanzheng/</guid>
      <description>问题 外地户口＋上海居住证，外地驾照即将到期，需要将外地驾照转入上海并且进行驾照到期换证。
可用状态 可用
发生时间 2015年10月15日8:00至10:00
体验得分 90
办理地点 车辆管理所三分所，地址浦东新区沪南公路2638 号
可办理时间 周一至周五 9:00-17:00
办理流程记录 前往4号楼的3层填表缴费并拍照，缴费需要排队，人较多，费用 25 元 拍好照片并拿到照片和表格后前往4号楼2层填表缴费并体检，缴费需要排队，人较多，费用 60 元 缴完体检费进去之后，需要填表并且贴好照片，体检项都是分开进行，主要体检内容包括视力，听力，身高体重，色盲等检测，其他项都是医生随手填上去的，哪个人少就先去体检哪个。我体检的顺序依次是视力，听力，身高体重，色盲检测。 每项体检完，看下体检表格，看看体检项有没有空的，如果没有就直接去出口处，把表格交上去，然后等报告 拿到体检报告后，直接去1号楼一层大厅门口右手处工作人员拿号，号码那张纸要保存好，最后一步领证还需要使用。 叫号后前往柜台管理，跟工作人员确认下需要办理的内容。我这里是办理转入和到期换证。这里会使用照片一张，工作人员会提供剪刀。办理过程大约需要5分钟 前往缴费处缴费，注意看下缴费窗口的号码，缴费处在大厅另外一侧，费用 10 元 前往发证处等待叫号领证 提高效率的小提示 8点30之前到达4号楼3层排队, 尽管 9 点才开始 自带黑色签字笔一支 身份证复印件和居住证复印件各一份 </description>
    </item>
    
    <item>
      <title>Nginx 性能调优「译」</title>
      <link>https://lewang.dev/posts/2014-10-16-tuning-nginx/</link>
      <pubDate>Thu, 16 Oct 2014 15:27:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2014-10-16-tuning-nginx/</guid>
      <description>这是一篇译文，原文链接：Tuning NGINX for Performance
Nginx 为人熟知的是在负载均衡、静态缓存和 WEB 服务器等方面的高性能，目前世界上最繁忙的站点中大约有 40% 在使用 Nginx。绝大多数情况下，大多数默认的 Nginx 和 Linux 配置都可以工作得非常好，但也需要做一些优化以获得最好的性能。本文将讨论在优化系统时需要考虑的 Nginx 和 Linux 的部分配置。可配置的选项有很多，但是本文只涵盖推荐大多数用户调整的配置选项。本文没有涵盖的配置选项，只有那些对 Nginx 和 Linux 有了深入的理解的人或者获得了 Nginx 技术支持和专业的服务团队的推荐建议后，才可以考虑调整。Nginx 专业服务器团队已经为世界上一些最繁忙的站点通过优化 Nginx 获得了最高水平的性能，并且可以为任何需要获得自己系统最大产出的客户服务。
简介 本文假设读者对 Nginx 架构和配置的概念已有了基本的了解。Nginx 的文档内容将不会在本文中重复，但本文会提供各项配置简要的介绍和相关文档的链接。
在性能调优时，要遵循一个好的规则：一次只修改一个配置选项，如果这个修改没有在性能方面带来优化，那么要再改回默认值。
我们从 Linux 性能优化的讨论开始，因为 Linux 性能优化的一些值会影响到 Nginx 的一些配置。
Linux 配置 尽管现代 Linux 内核（2.6+）在各种配置情况下都工作得很好，但也有一些配置是想要修改的。如果操作系统的配置设置的太低，那内核日志将会有错误信息，从而得知哪些配置需要调整。Linux 性能优化可能涉及的配置有很多，这里我们只讨论那些优化达到正常工作负载最有可能涉及到的那些配置。调整这些配置请参考详细的 Linux 文档。
Backlog 队列 下面的配置选项与网络连接和其排队方法直接相关。如果连入率很高（译者注：客户端发起的连接很多）且系统性能配置不匹配，例如一些连接表现得有所停顿，那么修改下面得配置将可能有用。
net.core.somaxconn: 设置等待 Nginx 接受的连接队列的大小。由于 Nginx 接受连接非常的快，这个值通常情况下不用设置得很大，但系统默认值可能比较小，所以对于流量比较大的站点，增大这个值是个不错的想法。如果这个值太小，在内核日志中应该会看到错误消息，那么就需要增大这个值，直到错误消失。注意：若将这个值设置为大于 512 的话，那么需要在 Nginx 配置中修改 listen 指令的 backlog 参数来匹配这个数字。
net.core.netdev_max_backlog: 设置数据包在被发送到 CPU 前可被网卡缓存的速率。对于带宽很大的机器来说，这个值需要增大。可以查阅网卡关于这项设置的建议文档或者查看内核日志中此项设置相关的错误。</description>
    </item>
    
    <item>
      <title>Github Pages 服务的域名设置</title>
      <link>https://lewang.dev/posts/2014-05-06-github-pages-dns-settings/</link>
      <pubDate>Tue, 06 May 2014 22:51:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2014-05-06-github-pages-dns-settings/</guid>
      <description>这几天每次 Push 博客到 Github Pages 时总会收到一封邮件：
The page build completed successfully, but returned the following warning:
GitHub Pages recently underwent some improvements (https://github.com/blog/1715-faster-more-awesome-github-pages) to make your site faster and more awesome, but we&amp;rsquo;ve noticed that iforget.info isn&amp;rsquo;t properly configured to take advantage of these new features. While your site will continue to work just fine, updating your domain&amp;rsquo;s configuration offers some additional speed and performance benefits. Instructions on updating your site&amp;rsquo;s IP address can be found at https://help.</description>
    </item>
    
    <item>
      <title>悟性</title>
      <link>https://lewang.dev/posts/2014-04-26-power-of-understanding/</link>
      <pubDate>Sat, 26 Apr 2014 01:11:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2014-04-26-power-of-understanding/</guid>
      <description>“悟性”是一个很虚的东西吗？
前段时间和同学聊天，聊如何从众多的各方面初步看起来差不多应聘者中去做选择？聊来聊去最终落到了“悟性”上。我自己在突然想到悟性这个词的时候脑子几乎一片空白，不知道如何去判断一个人的悟性，或者说悟性到底是怎么样的，凭什么说一个人悟性好或者悟性差。
昨天下午有个年龄不小的同学过来面试，聊了一个小时以后，向老板 汇报面试意见时，这同学各方面都很不错，但是总觉得有些地方不对，找不到词来形容自己内心当时的想法，于是结结巴巴的说，这种情况下，我要看一个人有没有悟性，接着我举了一个例子来说明什么时悟性：
假如一个人，被安排了事情 A，我觉得有悟性的人，可能在做 A 事情的时候，把相关的事情 B、C 都做了，或者要求时做到A，但是主动把结果做成 A++
说完后，我觉得不妥：这可能不是一个人有没有悟性的问题，而是这个人主动不主动、有没有热情的问题。
到底什么怎样才能通过一些具体的例子体会悟性这个词的含义？
佛家讲究悟性。《心经》仅有 260 个字，有悟性的人才可以写出《心经与生活智慧》，甚至心经和量子物理都有关系，你看了之后，才发现：哦，原来心经是说这些的啊。
道家也讲究悟性。当年菩提老祖在孙猴子头上敲三下的时候，要是孙猴子没有悟性只有兽性的话，估计就没有后面的孙悟空了。
自己之前团队中有个新同事，年龄比我长，团队之间大家相互做 Code Review，且不说代码质量， 从代码风格上我就对此人无语了：从不注意已有代码在变量、函数、文件命名上的一些基本的规范，别人不告诉他，就不会意识到这个问题。一些看得见的东西不一定非要教条式的写到文件里，然后去专门花时间去学,去强制。有些问题，还是自己意识到比较好，从别人口里说出来，那就不好玩了。
一句话说得好：
不怕狼一样的对手，就怕猪一样的队友。
不多说了，不强求，悟性有可能就是天生的。做不了大师兄，做二师弟也不赖。</description>
    </item>
    
    <item>
      <title>成长</title>
      <link>https://lewang.dev/posts/2014-04-25-grow-up/</link>
      <pubDate>Fri, 25 Apr 2014 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2014-04-25-grow-up/</guid>
      <description>成长就是看自己以前写的东西（包括微博、博客、说说等等）的时候觉得以前自己很 SB, 然后迫切地想把它们删掉
这句话不止一次看到，反思自己，确实是那么回事儿，不能太赞同哦（我了个去上海腔了呢）。
先前早些时候，把新浪博客和人人删的一干二净，也就是过把自己过去的所有文字的创造付之一炬，说没有一点惋惜，那是不可能的，想想当年自己顶着农村小孩黝黑皮肤初来乍到大城市，牛流不分，不怕喝不上牛奶只能喝豆浆的尴尬，给学校里各个杂志投稿，现在读来那些稿件，莫不觉得自己二逼。还好是些低年级学生玩的校办杂志，没多少人，为了回忆二逼的岁月，我特地还留了一本，没有其他人变态一样也留了一本吧。
哦，对了，如果你想删掉所有的 SNS 平台的日志，不如学门编程的手艺，使用他们所谓的开放接口删了他们。不知道人人网的 3g.renren.com, 如果还能访问那可以试试小码哥几年前弄的人人自杀小工具 xiaomg.sinaapp.com，如果恰好能帮你删掉所有的东西，那么就是人人网的不对了，这么多年了，一点进步都没有，还有几个人在山寨机上开个ucweb访问你的3g网站。小工具的代码就不要看了，惨不忍闻，套用前面的话，写得太二逼了。说不定哪天就会被删掉，就像删这些日志一样。
感性的文字都已经被删掉了，这下子没人看的得到我过去的无知，也只有我自己知道自己过去的无畏。
准备把散落在各处的技术博文都挪到这里来，二逼 SB 可能不大适合形容一个人的手艺，但是菜鸟二字恰如其分。
又一个菜鸟来了。大牛们见笑了。</description>
    </item>
    
    <item>
      <title>谁是德布罗意</title>
      <link>https://lewang.dev/posts/2014-03-13-who-is-de-broglie/</link>
      <pubDate>Thu, 13 Mar 2014 21:16:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2014-03-13-who-is-de-broglie/</guid>
      <description>这张照片很多人应该都见过，名副其实的二十世纪最伟大科学家们的合影。爱因斯坦占据了最明显的位置，德布罗意也在其中。
这里是摘自百度百科的一些内容：
在光具有波粒二象性的启发下，法国物理学家德布罗意（1892～1987）在 1924 年提出一个假说，指出波粒二象性不只是光子才有，一切微观粒子，包括电子和质子、中子，都有波粒二象性。他把光子的动量与波长的关系式 p=h/λ 推广到一切微观粒子上，指出：具有质量 m 和速度 v 的运动粒子也具有波动性，这种波的波长等于普朗克恒量 h 跟粒子动量 mv 的比，即 λ=h/(mv)。这个关系式后来就叫做德布罗意公式。
从德布罗意公式很容易算出运动粒子的波长。
例如，电子的电荷是 1.6×10^-19 库，质量是 0.91×10^-30 千克，经过 200 伏电势差加速的电子获得的能量 E=Ue=200×1.6×10-19 焦 =3.2×10-17 焦。这个能量就是电子的动能，即0.5mv^2=3.2×10^-17 焦，因此 v=8.3910^6 米/秒。于是，按照德布罗意公式这运动电子的波长是 λ=h/(mv)=6.6310^-34/(9.110^-318.39*10^6)=8.7×10-11 米，或者 0.87 埃。
我们看到，这个波长与伦琴射线的波长相仿。前面讲过，这样短的波长，只有用晶体做衍射光栅才能观察到衍射现象。后来人们的确用这种办法观察到了电子的衍射，从而证明了德布罗意假说的正确性。
是不是有点印象了，这就是高中物理课本里面的内容吧。
前几天和公司几个童鞋一起吃饭，先是有人说《水知道答案》，且先不说它是不是伪科普，我们试图用一些我们想得到的知识来说明一些问题，于是我想到了物质波，也就是德布罗意波。让我惊愕的是，那三位同学一致表示他们完全不知道什么是德布罗意波，搞得我仿佛穿越了，穿越到阿西莫夫的基地里去了。
一定是在耍我。
如果德布罗意波都不知道，那肯定也错过了德布罗意本人和他那篇博士论文的八卦故事了。不多说了，还是偷着乐吧。
哈哈</description>
    </item>
    
    <item>
      <title>从域名和 CDN 来看网站架构</title>
      <link>https://lewang.dev/posts/2014-03-06-arch-of-website-domain-cdn/</link>
      <pubDate>Thu, 06 Mar 2014 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2014-03-06-arch-of-website-domain-cdn/</guid>
      <description>为了自己做好网站的架构，找了知乎，豆瓣，大众点评和百姓网来做参考。这里主要来看域名和 CDN 相关的部分，后台的架构也还是要边学便实践。
大概情况 从前端分析了知乎的域名和 DNS 情况，同时对比了一下豆瓣、大众点评和百姓网。从域名、DNS、CDN 等使用角度来说，他们之间大同小异。
使用的分析工具 Chrome WHOIS DNSLookup 非 CDN 使用 记录 域名 用途 路径 A zhihu.com 使用 301 跳转到 www.zhuhu.com IP A zhi.hu 使用 302 跳转到 www.zhihu.com IP A www.zhihu.com IP A comet.zhihu.com WebSocket 推送消息 IP A analytics.zhihu.com 知乎自己的统计分析，同时使用了 Google Analytics IP 大部分都是用了 301 或者 302 跳转，注意他们的区别：301 是永久跳转(浏览器会做客户端端缓存)，而 302 是临时跳转。此外 baidu.com 到 www.baidu.com 并不是使用 301 或者 302 ，而是使用下面的一段 HTML 代码
&amp;lt;html&amp;gt; &amp;lt;meta http-equiv=&amp;#34;refresh&amp;#34; content=&amp;#34;0;url=http://www.baidu.com/&amp;#34; /&amp;gt; &amp;lt;/html&amp;gt; 相比而言，我觉得使用 301 更 Geek，更好一些。</description>
    </item>
    
    <item>
      <title>使用 Vagrant 构建开发环境</title>
      <link>https://lewang.dev/posts/2014-03-03-building-devenv-by-vagrant/</link>
      <pubDate>Mon, 03 Mar 2014 23:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2014-03-03-building-devenv-by-vagrant/</guid>
      <description>Vagrant 是一个构建虚拟开发环境的利器，它使得在团队中很容易共享开发环境，有了它，不必每个人都搭建一个自己的开发环境了。在没有使用 vagrant 之前，我在 windows 中安装了 virtualbox，然后在 virtualbox 中安装了一个 ubuntu server。在 ubuntu 中安装了 mysql、jdk 等软件，并且设置了一个共享目录，以便于将工程代码直接共享给 ubuntu。在外部开发调试过程中（Java 项目），我需要在 virtualbox 中设置好几个端口映射，如 mysql，ssh 等等。这样在 cygwin 里面就可以通过 ssh 登录 ubuntu server 了，为了使得 ssh 登录不用每次设置密码，还需要手动生成公钥私钥。换机器了，这一切我又得重新配置。新同事来了，他也得像我这样重新配置一遍。有可能他还会有问题说：为什么按照你的说明，代码在我这里却无法运行呢？
一切都从 Yining 告诉了我 vagrant 之后发生了变化，原来一切都这么简单。
安装 VirtualBox Vagrant 其实是对 virtualbox 做了一层包装，它让使用 virtualbox 作为虚拟机更为简单。当然也可以使用 vmware，使用 vmware 那得找一个 license 了。
好吧，去这里 下载 VirtualBox。我使用的是 4.3.8 for OSX
安装 Vagrant 下载 vagrant
添加虚拟机镜像到 Vagrant vagrant box add vdevenv ~/Workspace/vagrant/boxes/vdevenv-0.0.0.1.box vagrant 的干净的镜像可以在这里下载:
Ubuntu precise 32 VirtualBox Ubuntu precise 64 VirtualBox 更多镜像 在工作目录启动 Vagrant 进入自己的代码所在的目录，启动刚刚添加的虚拟机镜像</description>
    </item>
    
    <item>
      <title>Python on My rMBP</title>
      <link>https://lewang.dev/posts/2014-03-02-python-on-my-rmbp/</link>
      <pubDate>Sun, 02 Mar 2014 21:16:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2014-03-02-python-on-my-rmbp/</guid>
      <description>前几天入手了一台 Macbook Pro Retina，把 BIG 提到了很爽的地步。经过几天的折腾，可以和 windows，ubuntu desktop 说 Byebye 了。之前整整用了一年的 Ubuntu 来工作，我用它来写 C、Java 和 Python, 要是 windows 没有 cygwin, 没有 MacType，那该多么恐怖。后来用了一段时间的 MBP，让我坚定了以后要自己买一个 MBP。
ubuntu 那么的惹人爱，因为它有个还挺好用的 GUI，从 debian 那继承过来的 apt-get, 一下子把一个从 redhat 9 用到 fedora 4 的穷学生拉到了 ubuntu 的阵营，至此，deskop 就被 ubuntu 占领了。在此之前，我还用段时间的 debian 和 gentoo。
不得不说，debian 太伟大太牛逼了，有一次要在一个 MIPS 的小设备上编译安装 erlang， openssl，libcurl 等做一些实验, 要跨平台编译这些软件安装到小设备上去，费了半天终于把这些都编好了，还写了一个编译脚步，结果 erlang 运行的时候虚拟机总是报错，也不知道怎么回事。后来注意到 debian 居然有 MIPS，ARM 的源，后来在 MIPS 设备上安装软件做实验，我再也没有遇到问题，一切都用 apt-get 搞定了。
除了 apt-get, 我想最令我惊喜还有 ubuntu 自带了 python 2.7，让我很容易在两台电脑之间拷贝文件：</description>
    </item>
    
    <item>
      <title>阿里云和 ucloud 云主机评测</title>
      <link>https://lewang.dev/posts/2013-08-09-benchmark-of-aliyun-and-ucloud/</link>
      <pubDate>Fri, 09 Aug 2013 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2013-08-09-benchmark-of-aliyun-and-ucloud/</guid>
      <description>总体说明 我使用联通 10M 光网，SSH 在多个时间段登录两个主机都是非常的快，但是阿里云的 SSH 有时会断开连接，需要重新登录(一天遇到 n 次)，ucloud 一次都没有断开连接过。两者总体操作上都很流畅。平时我比较习惯于使用 ubuntu，于是在两个主机上都安装了 Ubuntu 12.04_64 的 Server 版本。在安装初始化系统过程中(测试过两次)，Ucloud 的速度要快于阿里云主机，粗略估计都是在 20s 以内，因此差别不大。
阿里云主机安装过程中不需要人为参与，选好主机配置即可，主机一旦创建完成，用户名和口令会发送到测试者手机上，而且直接发送的是 root 账户口令。Ucloud 除了选择配置之外，还需要设置强登录密码，使用普通用户登录，感觉更 geek 一点。
默认情况配置下，关闭重启服务器，Ucloud 会发送主机变化短信到手机，阿里云不会。阿里云在系统负载预警方面比较全面，ucloud 侧重于 server 上在线状态和相关服务的预警。
在试用和测试过程中我主要偏向于静态的测试，后面还有一个好玩的 Super PI 测试。
阿里云和 ucloud 都是主机，和实际的服务器使用上没有什么区别。另外阿里云有 paas，需要单独购买，目前支持 php 和 nodejs，一些基本的服务如 memcached 等都可直接使用。
如果做互备，如果我们不使用这两个云平台各自特有的一些服务(主要是阿里云有一些如开放存储服务 OSS 等)，相互切换难度上应该是差不多的。
主机概览 项目 阿里云 ucloud 按量付费 支持(不能升级或者调整主机配置*) 不支持 包年包月 支持 支持 操作系统 可重置 可重装 CPU 升级 支持(需要关机) 支持(需要关机) 内存升级 支持(需要关机) 支持(需要关机) 磁盘扩容 支持，可以升级或者添加新的磁盘，最大为 2000G 支持，可以扩容最大到 1000G（与系统盘在同一个主机上），&amp;lt;/br/&amp;gt;或者添加新的网络磁盘 udisk 磁盘镜像 支持 支持 带宽升级 支持 支持 其它服务[需要单独购买] 项目 阿里云 ucloud 负载均衡服务 支持(目前免费)，需要两台主机以上 支持(目前免费)，需要两台主机以上 关系型数据库服务 支持，mysql 和 sqlserver 支持，mysql 和 percona 特有的服务 开放存储服务 OSS、开放数据处理服务 ODPS、开放结构化数据服务 OTS CDN、短信服务（可二次开发）、与又拍、DNSPod 和搜狐 SendCloud 直接绑定 *按量付费不支持更换操作系统；不支持配置变更功能（包括带宽升级、CPU 和内存升级、新增数据盘）;“包年包月“和”按量付费“不支持相互更换;1 台云服务器只能选择 1 种，无法同时选择</description>
    </item>
    
    <item>
      <title>Linux 共享库（动态链接库）相关的一些记录</title>
      <link>https://lewang.dev/posts/2013-03-04-so-load-path-in-linux/</link>
      <pubDate>Mon, 04 Mar 2013 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2013-03-04-so-load-path-in-linux/</guid>
      <description>相关的环境变量 LD_LIBRARY_PATH ld-linux.so 寻找 shared object 的路径，优先加载出现在路径前面的 shared object。如，export LD_LIBRARY_PATH=/home/user/lib:$LD_LIBRARY_PATH LD_PRELOAD 指定优先供 ld-linux.so 加载的 shared object。如，export LD_PRELAOD=/home/user/lib/glibc.so，可以使用这个变量来改变加载顺序，例如我们自定义的 glibc.so 中实现了新的 strcmp 之类的函数，那么可以使用这个变量来实现函数的替换，实现注入 LD_DEBUG 使用这个环境变量来 debug 载入 shared object 的情况。如，export LD_DEBUG=files,这样会打印所有所有加载 shared object 的记录 一些工具 如何查看一个程序或者 shared object 加载哪些 shared object ldd，可以查看程序或者.so，如，
$ ldd ./foo_test $ ldd ./libfoo.so 对于已经运行的程序，可以这样 $ cat /proc/PID/maps | awk &amp;#39;{print $6}&amp;#39;| grep &amp;#39;\.so&amp;#39;| sort | uniq $ lsof -p PID | awk &amp;#39;{print $9}&amp;#39; | grep &amp;#39;\.so&amp;#39; 没有启动的程序可以这样 $ strace .</description>
    </item>
    
    <item>
      <title>关于openlayers的一些说明</title>
      <link>https://lewang.dev/posts/2012-11-13-about_openlayers/</link>
      <pubDate>Tue, 13 Nov 2012 01:25:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-11-13-about_openlayers/</guid>
      <description>以前做的openlayers的项目基本都是很水的，但是毕竟都结了，算是有一丁点的积累。不过做项目的时候也是边学便用，代码写得很糟糕，一直没想着留着。于是毕业了，换城市了，换了几次电脑，这些代码终于都没了（有些网友那里应该还有，我发送过几次给别人）。
鉴于有不少openlayers的爱好者跟我讨论openlayers的一些开发问题，我想我还是把以前的思路整理一下，对openlayers做些精简和开发，弄一个直接可以使用的简单库出来。</description>
    </item>
    
    <item>
      <title>使用gdb根据指令地址定位到C代码对应的行</title>
      <link>https://lewang.dev/posts/2012-11-06-how_to_use_gdb_to_find_the_kernel_source_code/</link>
      <pubDate>Tue, 06 Nov 2012 07:18:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-11-06-how_to_use_gdb_to_find_the_kernel_source_code/</guid>
      <description>最近做一些Kernel方面的工作，从一头雾水开始，多做些记录吧。
addr2line也可以根据指令地址定位C代码对应的行，但是对于Kernel module却不是很方便，使用gdb就要容易得多。
NOTE：在使用gdb定位C代码之前需要开启-g选项编译内核或者module
例如有这样的Call Trace
Call Trace:
[&amp;lt;8033265c&amp;gt;] dump_stack+0x8/0x30
[&amp;lt;8003abbc&amp;gt;] warn_slowpath_common+0x70/0x98
[&amp;lt;80041f10&amp;gt;] local_bh_enable_ip+0x98/0xec
[] ieee80211_alloc_node+0x29c/0x47c [umac]
[] ieee80211_reset_bss+0x58/0x154 [umac]
[] ieee80211_vap_attach+0x20/0x68 [umac]
[] ath_vap_create+0x430/0x6b0 [umac]
[] wlan_vap_create+0x58/0x210 [umac]
[] osif_ioctl_create_vap+0x268/0x790 [umac]
[] ath_ioctl+0x134/0x94c [umac]
[&amp;lt;8022db50&amp;gt;] dev_ioctl+0x28c/0x88
现在想定位指令：
[&amp;lt;80041f10&amp;gt;] local_bh_enable_ip+0x98/0xec
可以这样做：
$ mips-linux-gdb vmlinux
GNU gdb 6.8
Copyright (coffee) 2008 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.</description>
    </item>
    
    <item>
      <title>几个简单的Makefile</title>
      <link>https://lewang.dev/posts/2012-11-06-quick_makefile/</link>
      <pubDate>Tue, 06 Nov 2012 07:05:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-11-06-quick_makefile/</guid>
      <description>几个简单适合小程序的Makefile，可直接拷贝使用，自己mark一下，这样长时间不用Makefile也不用去看手册了
0.只有一个文件
变量的定义，方便使用 CC = gcc
CCFLAGS = -O2 -s
BIN = test
OBJ = root_password_tool_win32.o
$(BIN) : $(OBJ)
$(CC) $(CCFLAGS) -o test $(OBJ)
$(OBJ) : root_password_tool_win32.c
$(CC) $(CCFLAGS) -c root_password_tool_win32.c
.PHONY : clean
clean :
-rm $(BIN) $(OBJ)
1.简单编译命令行程序，$(CC)前面是tab，不是space
一共五个文件：
test.c
md5.c md5.h
password.c password.h
main函数在test.c中，test.c文件include了md5.h和password.h
CC = gcc
CCFLAGS = -O2 -s
BIN = password
OBJ = md5.o password.o test.o
$(BIN) : $(OBJ)
$(CC) $(CCFLAGS) -o password $(OBJ)</description>
    </item>
    
    <item>
      <title>Java程序如何限速(控制下载和上传速度)</title>
      <link>https://lewang.dev/posts/2012-10-18-bandwidthlimiter/</link>
      <pubDate>Thu, 18 Oct 2012 08:34:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-10-18-bandwidthlimiter/</guid>
      <description>好久没有在这里写点东西了，要养成书写记录的习惯。
这里简单的讨论一下java设计网络程序中如何控制上传和下载速度，我们常见的FTP，HTTP，BT等协议都是TCP的，但是现在流行的utorrent却基于UDP实现了自己UTP协议(UDP+拥塞控制)，不管使用什么协议，站在I/O的角度来说，限速的控制思路都是一样的。
思路很简单，如下：
1.假设下载或者上传速度上限是m (KB/s),那么发送一个固定的字节数据(假设是n字节)的时间花费是：n/m；
2.假设现在要发送n字节的数据，那么理论所需的时间应该是n/m，而在实际情况下，发送n字节的数据只花费了t秒，那么发送该发送线程就应该睡眠n/m-t秒，这样就基本实现了速度的控制。
代码以TCP为例
速度控制
1 package com.actiontec.net.bandwidth;
2
3 /**
4 *
5 * @author Le
6 *
7 /
8 public class BandwidthLimiter {
9
10 / KB /
11 private static Long KB = 1024l;
12
13 / The smallest count chunk length in bytes /
14 private static Long CHUNK_LENGTH = 1024l;
15
16 / How many bytes will be sent or receive /</description>
    </item>
    
    <item>
      <title>把ubuntu配置成路由器&#43;DHCP</title>
      <link>https://lewang.dev/posts/2012-08-22-router-dhcp/</link>
      <pubDate>Wed, 22 Aug 2012 14:30:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-08-22-router-dhcp/</guid>
      <description>资源： __ __
PC A: Ubuntu 12.04 LTS，两块网卡，分别为eth0和eth1，使用eth0连接 互联网 __ __
PC B: Windows 7, 一块网卡，为eth0 __ __
目标： __ __
使得B通过A连接互联网(IPv4)，即实现A为路由器的功能 __ __
步骤： __ __
PC A: __ __
(0)假设eth0已经配置好，PC可以通过eth0连接互联网 ，配置eth1为，如/etc/network/interface所示 __ __
auto lo __ __
iface lo inet loopback __ __
auto eth0 __ __
iface eth0 inet static __ __
address 172.16.10.65 __ __
gateway 172.16.10.254 __ __
netmask 255.255.0.0 __ __
auto eth1 __ __</description>
    </item>
    
    <item>
      <title>再说 PHP 中 SimpleXML</title>
      <link>https://lewang.dev/posts/2012-03-22-a-short-discuss-of-simplexml-of-php/</link>
      <pubDate>Thu, 22 Mar 2012 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-03-22-a-short-discuss-of-simplexml-of-php/</guid>
      <description>前一篇帖子使用了 xpath，后来了解到 xpath 的性能可能比较差，而且在遇到有命名空间的时候还有点小麻烦。这里都已豆瓣提供的 API 返回的 xml 为例。豆瓣返回的 xml 不是 rss 格式的，而是 Atom 格式，有很多的命名空间，如果习惯于操作 rss 格式的 xml，那么可以直接把 xml 里面的命名空间的字符串都 replace 掉，这个方法貌似很简单很暴力，就不会遇到命名空间的问题了。
从豆瓣 API 开始，点击这个链接 http://api.douban.com/book/subjects?q=java 你就可以看到 xml 格式，由于返回的是 Atom 格式的 xml，浏览器会自动帮你解析，所以应该这样
# 这样就可以得到一个java.xml文件。 $ wget -O java.xml http://api.douban.com/book/subjects?q=java 这样就可以得到一个 java.xml 文件，接下来使用 SimplePHP 处理这个文件。
首先要创建一个 SimpleXML 对象
//$content为xml的内容 $xml = new SimpleXMLElement($content); 现在要获取 opensearch 命名空间下的 totalResults 节点的文本，代码如下：
$children = $xml-&amp;gt;children(&amp;#39;http://a9.com/-/spec/opensearchrss/1.0/&amp;#39;); $totalResults = $children-&amp;gt;totalResults; 处理所有 xml 文档中所有的 entry 节点
//处理所有找到的记录 $entries = $xml-&amp;gt;entry; foreach($entries as $entry){ //取命名空间下的孩子节点 $entryChildren = $entry-&amp;gt;children(&amp;#39;http://www.</description>
    </item>
    
    <item>
      <title>我想做的东西可以不值钱，但是它必须‘酷’</title>
      <link>https://lewang.dev/posts/2012-03-13-things-i-create-must-be-cool/</link>
      <pubDate>Tue, 13 Mar 2012 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-03-13-things-i-create-must-be-cool/</guid>
      <description>这句话是 FACEBOOK 的马克·扎克伯格说的。
我很认同，并且感觉自己也是这么做的。现在自己做得很多事情，从来没有考虑过它会不会值钱，只是感觉把自己的想法做出来，变成实物的过程就已经很酷。
对于酷，我觉得至少有两方面的意义。
一种酷，是一种自我实现的感觉，是一种认同感，成就感。比如自己把自己的不错的想法实现了，当自己看到自己作品的时候，肯定觉得这种感觉很酷。接着你的作品有很多人用了，看了，然后给与了肯定或者赞扬的评价，这时候感到酷，我觉得就应该是一种认同感和成就感。都是内心的感觉，一种推进自我完善的感觉。
还有一种酷，那就是表面上的酷，比如你的网页效果做得很酷很炫，你实现的功能很酷。虽然这些是表面上的酷，但这些酷的背后却隐藏着无数的思考和磨练。这么表面上的酷，却恰恰可以给人带来内心上的酷。
就拿摆摊网来说，小小的网站，做得很简单。但是为了实现页面小小的效果，还不得不去多学点东西多花些时间。我喜欢自己东西能弄得那种能给人至简至美的感觉，但是却不能因为简而不“美”了，这里的美是给人一种更好的感觉。所以自己总是在觉得不破坏简的前提下，尽量的让自己的应用让人使用的体验更好更酷。比如说发布书籍信息的页面，以前必须使用 ISBN 号，现在这里点击查看的将要改成 @林风琦 推荐的 chegg 的效果，是不是比豆瓣的书籍检索要酷很多。进一步思考，对于摆摊首页的检索，以后是不是应该结合用户的搜索习惯和本身的书籍物品数据也实现这种 AutoComplete 功能。还比如说摆摊还将开发 Android 手机客户端，到时候只要一拍，就可以把书信息扫下来了，看，多酷！
现在自己的科研也是这样，能给自己带来一种很酷的感觉，但是就科研的实际应用来说，我觉得可以应用的范围很小。但是想着能把 Jim Gray 这位数据库大神[此大神已经被外星人带走了，详情看这里]负责的基于微软 SQL Server 的 SDSS 项目迁移到适合科学运算的数组模型的数据库上来，然后我们还有可能就性能 PK 一把，想想就觉得很酷。更酷的是，自己还想到了一种自动迁移的方法[还没有经过深思和验证]。反正就是觉得酷儿！
为了更酷，继续努力！
我是 A Lucky Apple，@小码哥</description>
    </item>
    
    <item>
      <title>在这安静的夜里</title>
      <link>https://lewang.dev/posts/2012-03-10-at-a-late-night/</link>
      <pubDate>Sat, 10 Mar 2012 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-03-10-at-a-late-night/</guid>
      <description>今天组会不用开了，报告也不用做了，感觉比较爽，于是晚上的时候决定给摆摊写一些新的东西。
于是刚刚给摆摊的首页添加了一个小小的功能，就是能够随机的选取5本书在首页上循环展示，另外修正了一些网友提出的问题。
首页图片轮换是用jquery实现的，做法也很简单，当然实现的功能和效果还是比较弱的，这里是我用到一些资料。 CSS定位：http://www.haozi.cn/code/position-static-relative-absolute-float/
好了，摆摊这几天暂时就这个样子了，得放下心思继续去搞自己的科研了。
过段时间一定要好好总结一下，写一些关于数组数据库系列的文章。</description>
    </item>
    
    <item>
      <title>写给 2012 的摆摊</title>
      <link>https://lewang.dev/posts/2012-01-09-for-baigetan-2012/</link>
      <pubDate>Mon, 09 Jan 2012 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2012-01-09-for-baigetan-2012/</guid>
      <description>我期待 2012 的到来，这一年我将有一个新的开始，好期待。
最近一直在忙着做实验，读论文，都没有什么时间来弄弄摆摊，自己心里的那种对于摆摊的激情也渐渐淡了很多，但是想想自己当初的想法，立马又有动力拾起摆摊。
一个小小的网站，看起来确实很简单，也就是拿 php 连连数据库，做做一些简单的操作，可自己在写这个网站的时候总是很慢。时间少而且比较凌乱是一个原因，但是总的还是缺少一个全面完善细致的规划，自己大部分也是照着当初的设计，然后想到哪儿做到哪儿，如今的摆摊，已经和当初的相去甚远了。越写越复杂，问题也越来越多，停下来一想，还是挥起大刀把乱乱的东西都砍了吧，弄得越简单越好。
加油！过几天就要回家了，不知道什么时候才能做好，让自己心里舒服一下。这几天赶紧将域名绑定好，将人人、新浪微博等的接入做好，大概就这个样子了。
大家新年快乐！</description>
    </item>
    
    <item>
      <title>SimpleXML使用xpath</title>
      <link>https://lewang.dev/posts/2011-12-01-how-to-use-simplexml-of-php/</link>
      <pubDate>Thu, 01 Dec 2011 13:09:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-12-01-how-to-use-simplexml-of-php/</guid>
      <description>这几天没心情看论文，于是开始写写摆摊网的代码。摆摊主要做高校二手书籍信息的分享，于是需要从豆瓣上获取图书信息，豆瓣提供了一个完整的 xml 来描述一本书，例如http://api.douban.com/book/subject/isbn/9787543639136，于是需要处理这个 xml 来获取相应信息，这里小码哥采用的是直接使用 xpath 来获取 xml 文档中相应的信息。摆摊使用了 sae，于是使用 SimpleXML 来处理 xml，加上自己还只是 PHP 的初学者，于是出现了一些问题。
这里是一些学习资料：
xpath:http://www.w3school.com.cn/xpath/ simplexml:http://cn2.php.net/manual/en/simplexmlelement.xpath.php 新建 SimpleXMLElement 对象，xml 文件内容在$content 中
$bookFromDouban = new SimpleXMLElement($content); 直接查询，在命名空间 db 下的所有 attribute，且有 name 属性，以下 xpath 查询是没有问题的，
$result = $bookFromDouban-&amp;gt;xpath(&amp;#34;//db:attribute[@name]&amp;#34;); 但是，这条查询就有问题了，如下，
$result = $bookFromDouban-&amp;gt;xpath(&amp;#34;//link[@rel=&amp;#39;self&amp;#39;]|//link[@rel=&amp;#39;image&amp;#39;]&amp;#34;); 上面的代码表示在默认的命名空间里面查询 link 节点，但是在 php 5.0 以上却不能查出数据。需要这样操作
//获取这个xml的所有的命名空间 $namespaces = $bookFromDouban-&amp;gt;getNamespaces(); //注册默认的命名空间为&amp;#39;d&amp;#39; $bookFromDouban-&amp;gt;registerXPathNamespace(&amp;#39;d&amp;#39;, $namespaces[&amp;#39;&amp;#39;]); //现在这个查询就ok了 $result = $bookFromDouban-&amp;gt;xpath(&amp;#34;//d:link[@rel=&amp;#39;self&amp;#39;]|//d:link[@rel=&amp;#39;image&amp;#39;]&amp;#34;); 对$result 遍历就简单了，这里也给出一个简单的例子，遍历完，变量就初始化了。PS：代码写的不优雅，欢迎拍砖。
translator = array(); $author = array(); $i = $j = 0; foreach($result as $item) { foreach($item-&amp;gt;attributes() as $val) { $val = str_replace(&amp;#39;-&amp;#39;,&amp;#39;_&amp;#39;,$val); if($val == &amp;#39;author&amp;#39;) { $author[$i++] = &amp;#39;&amp;#39;.</description>
    </item>
    
    <item>
      <title>jquery $.ajax() 中 datatype 为 json 时的问题</title>
      <link>https://lewang.dev/posts/2011-12-01-when-datatype-is-json/</link>
      <pubDate>Thu, 01 Dec 2011 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-12-01-when-datatype-is-json/</guid>
      <description>最近在为摆摊写点前端 js 的时候，在使用 jquery 的 $.ajax()这个方法的时候，当 datatype 设置为 json 时，总是不执行 success 回调，而是执行 error 回调。而将 datatype 设置成 text，就可以执行 success 回调了，摆摊使用的是 jQuery JavaScript Library v1.6.2，查看 jQuery 文档可知：
“json”: Evaluates the response as JSON and returns a JavaScript object. In jQuery 1.4 the JSON data is parsed in a strict manner; any malformed JSON is rejected and a parse error is thrown. (See json.org for more information on proper JSON formatting.)
我用 php 产生的字符串是</description>
    </item>
    
    <item>
      <title>未来是个未知数</title>
      <link>https://lewang.dev/posts/2011-11-09-future-is-unknown/</link>
      <pubDate>Wed, 09 Nov 2011 13:09:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-11-09-future-is-unknown/</guid>
      <description>未来是个未知数，自己的未来自己都不知道会是什么样子，问别人，别人又怎么会知道你的未来。
不要忘了自己心中想要的东西，即使是为了养家糊口而从事自己不喜欢的工作，也不要忘记自己希望做什么，静静的准备着，迟早有一天会爆发的。
单纯的做着自己的业余爱好，业余爱好也就会发展成职业的。但是我不会忘了我心中想要去做什么，我会为之而积累准备。
未来是个未知数，没有方程组能解开这个未知数，只能去试，试试才会知道。
摆摊网的未来也是个未知数，很大的可能就是被淹没在数以亿计的小小站点之中，被互联网大潮一扫而过，什么也不会留下，但是，这就是我的爱好，我喜欢把自己的想法实现，不管别人喜不喜欢用，但是，我喜欢摆摊网，它是我想法的一个实体，我每次尝试的一个印记。
自己的工作也定下来了，有接着研究自己的课题，但这几天不能安静下来搞自己的课题，总想着摆摊网还没有做好，于是拿出了两天，把摆摊的页面都做了出来，接下来就要做网站的逻辑部分了。
网站很简单，但是要做好做的精致做得完美做得好用也是很不容易的。自己还是慢慢来搞，每天写点代码吧，还是要干些要紧的事儿，后天又得做报告了，得赶论文ppt了。
期待有同学加入，一起来开发摆摊网，让摆摊网早点上线！！！
要开始为了毕业而忙碌了。
我是小码哥（新浪微博）</description>
    </item>
    
    <item>
      <title>关于摆摊的一些思考</title>
      <link>https://lewang.dev/posts/2011-11-08-think-of-baigetan/</link>
      <pubDate>Tue, 08 Nov 2011 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-11-08-think-of-baigetan/</guid>
      <description>今天是十一假期归来的第一天，实验室也启用了新的管理制度，坐在北洋楼的实验室也有一会儿了，刚发了一会儿呆，对摆摊又有了一些新的思考。
我的目标是想把摆摊做成高校的网上交易平台，也就是类似淘宝，但是作为摆摊网的初期是不合适的，因为这个交易平台太大太复杂。
所以摆摊的第一步还是做交易信息的发布和检索，主打高校的书籍和物品交易信息，交易还是线下完成，这样，初期的摆摊应该就和赶集、百姓、58 等类似了，而且这样摆摊的实现难度也会大大降低，在加上 SNS 和 LBS，摆摊就可以提供比赶集、百姓、58 等更精准的信息服务了。
这几天只是做了一些准备工作，熟悉了 sae 的环境，网站的架构也基本完成，页面上的设计也差不多了，接下来就是定下摆摊网的初步方向，确定第一阶段的核心功能，将其业务逻辑实现了。
加油！</description>
    </item>
    
    <item>
      <title>摆摊网页面设计</title>
      <link>https://lewang.dev/posts/2011-11-07-design-of-baigetan/</link>
      <pubDate>Mon, 07 Nov 2011 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-11-07-design-of-baigetan/</guid>
      <description>从泰山回来这几天，抽得空把摆摊网的页面做了出来，包括 css 和 html 的编写等，现在可以从 baitan.sinaapp.com 看到页面效果了，目前兼容 ie8、ff、chrome、safari 等。
baitan001.com 也在备案之中，应该很快就可以使用 baitan001.com 域名访问了。
有同学想练习 js，php 等 web 技术的，不妨联系我，我肯定能让你参与进来！
我是小码哥</description>
    </item>
    
    <item>
      <title>冬天来了</title>
      <link>https://lewang.dev/posts/2011-10-27-winter-is-coming/</link>
      <pubDate>Thu, 27 Oct 2011 13:10:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-10-27-winter-is-coming/</guid>
      <description>前几天一场大降温，把我给冻着了，肚子疼了好几天，还发烧，还好有个小盆友给我“打针喂药”，使得我这几天才得以康复，重现往日风采。
本来这周五得做论文的报告，于是这周基本都在看论文。谁知这周又冒出了几个公司让我去面试，论文的报告又就此作罢，挪到下周。
自己的外语很烂，基本没有投什么外企，昨天参加了微策略的面试之后，反而对自己的外语变得有些自信，最后和那位印度面试官聊天，他说我外语挺好，可是小盆友却说他那是在说客套话，不管客套不客套，反正我觉得挺开心，哈哈。。。
这周末还有几个知名互联网公司的笔试面试，加油！
关于摆摊，我还是抽出了一些时间来做了一些开发工作。先是看了赶集网吴石展杭州Qcon的关于MySQL数据库开发的三十六条军规，然后立马按照这些军规，对摆摊的数据库结构做了一些更改。此外，还开发了用户注册模块，只是页面还没有美化。
还是一点一点的来，事情太多，还要搞科研毕业，加油！
我是小码哥（新浪微博）</description>
    </item>
    
    <item>
      <title>摆摊的一些进展</title>
      <link>https://lewang.dev/posts/2011-10-21-process-of-baigetan/</link>
      <pubDate>Fri, 21 Oct 2011 13:11:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-10-21-process-of-baigetan/</guid>
      <description>这段时间都在进行密集的笔试面试，但还是没有停下摆摊网的开发进程。目前摆摊网已经由吴江川同学设计好了产品的原型，我也在原型的基础上做好了全部页面的设计工作，接下来就是开始后台逻辑的开发。
目前后台数据库部分已经设计完毕。
加油！
我是小码哥</description>
    </item>
    
    <item>
      <title>十一掠影</title>
      <link>https://lewang.dev/posts/2011-10-01-snapshot-of-10-1/</link>
      <pubDate>Sat, 01 Oct 2011 00:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-10-01-snapshot-of-10-1/</guid>
      <description>早上睡到9点才起床，然后下楼载着小盆友去学三吃了早饭，一人吃了六个小包子，出了食堂发现天气真好，决定去拍些照片，然后又载着小盆友回到宿舍拿了相机。
今天天气真好，微微的风，蓝蓝的天，枝头的树叶也变成了整片整片的金黄，好美！
东西都已经收拾好了，明天一早出发，去泰山，看日出。
我是小码哥</description>
    </item>
    
    <item>
      <title>关于我</title>
      <link>https://lewang.dev/about/</link>
      <pubDate>Wed, 28 Sep 2011 03:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/about/</guid>
      <description>小碼哥，或樂哥
过往与向往 兲朝哏都七里台职业技术学院相声专业(CS)硕士毕业 混迹六七八三个里台八年，走了一条学生、老师、学生曲折漫长的校园之路，除了一纸文凭之外，更是收获了爱情、友情和师生情 喜折腾，瞎折腾，机缘巧合来到魔都并定居在此 技校授得一技之长，努力成为一名匠人 联系方式 Email: atob(&#39;bGV3YW5nLmRldkBnbWFpbC5jb20=&#39;) 微博: @小码哥 Twitter: @lewangx GitHub: @lewangdev 关于本站 本网站使用 Hugo 静态博客生成器构建，托管在 Github Pages 服务上，本站 GitHub 仓库地址是 lewangdev.github.io。</description>
    </item>
    
    <item>
      <title>摆摊网</title>
      <link>https://lewang.dev/posts/2011-09-28-hello-baigetan/</link>
      <pubDate>Wed, 28 Sep 2011 03:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-09-28-hello-baigetan/</guid>
      <description>点评：留在这里，让自己可以看到以往无知的自己
一转眼，20 年就过去了，终于要和自己 20 年的学生身份说拜拜了。
那天去图书馆借书，回来的路上敬业湖桥边的那棵树的时候，心不由得感叹起来，这棵树，我已经拍下了它的春夏秋冬，它叶枯叶落，相似年年，只因它生根于此，我是要走的。
去图书馆，边走边想，就想到了前几天在知乎上看到的社会化图书馆网站，感觉很不错(而且 UI 做的很不错，想借鉴一下)。想着自己买了好多书，都闲在书架上，是不是也可以搞一个校园图书馆，把同学校的闲书都利用起来。然后又马上否定了自己，因为我自己其实并不愿意把自己买的书借给别人看。这个想法就此作罢。
想想自己倒是有不少二手书带不走了，得卖掉，还有一些小物件，也带不走了，扔了还挺可惜，也可以卖掉。于是想找找哪里去买，学校 BBS 感觉还可以，但是信息没有分类，不易于检索，而且用户体验很不好。百姓、赶集、58 同城确实可以发布二手信息，但是信息又接近海量，不能针对目标人群——学生，比如我想找同专业学长学姐的书，那就不好找了，再比如我要找我考研学校的资料，那也不好找了，除非去相应的论坛，不然也是很难找。还有个大学生 C2C，这个网站感觉心太大，不靠谱，而且用户体验很差。而且到学生毕业的时候，将会有大量的二手信息，是不是可以考虑搭建一个大学生专用的二手物品交易平台，而且融入校园 SNS 和 LBS 元素，主打二手书籍的交易呢。综合考虑以上，我觉得这挺靠谱的。
于是我打算开发一个这样的平台——摆摊网
天大每年有 6000 多的毕业生，如果有 30%的毕业生能使用，那就将近 2000 人，融入 SNS 元素之后，用户会不会爆炸是增加？我觉得流量肯定会有的。
于是立马动手，先是在美橙互联上注册了域名 baitan001.com (正宗的开心网也是 kaixin001.com )，然后找了几个同学听了他们意见，同时还邀请了两个同学一起来做这个小项目。
感谢新浪 SAE 给了我实现自己的这个小小梦想的机会，前段时间参加新浪微博应用大赛，对 SAE 也有了一些了解，综合考虑之后，决定就在 SAE 平台上来做摆摊网的开发。
花了昨天一晚上加上今天一下午，结合以往自己用过的 PHP 框架代码，而且动手折腾出了 Baitan 0.0.1 版本 PHP 框架，兼容 SAE 平台，接下来就是一步一步的把摆摊做出来了。
这段时间一直忙于找工作，参加各种笔试面试，然后被各种鄙视，当然也收获了不少，短短不到一个月，也已经有了好几个巨头互联网公司的 offer 了，自己的工作也大概就这么定下来了。自己在大学和研究生阶段也折腾过不少东西了，但是还是没有做出一个让自己满意的东西，我想把摆摊网做好，即使没人用，我也自己去维护去完善，当做是自己在种地吧。我有梦想，但最开心的还是有个她愿意倾听我。
今天把baitan001.com做了域名备案，申请了腾讯的企业邮箱，Baitan 0.0.1 框架的相关测试也已经基本完成，敬请期待摆摊网的到来吧！</description>
    </item>
    
    <item>
      <title>改造openlayers构建轻量级专用地图信息系统（1）</title>
      <link>https://lewang.dev/posts/2011-08-15-openlayers-custom/</link>
      <pubDate>Mon, 15 Aug 2011 05:55:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-08-15-openlayers-custom/</guid>
      <description>本文为一个openlayers项目的总结，其中可能有一些遗漏或描述得不准确的地方，望批评指正。
本文目标：
构建一个完全自定义的轻量级地图信息系统，以openlayers为基础，需要自定义地图的元素样式，包括图层切换的样式、地图导航的样式、地图标记的实现、自定义弹出框等等。该专用地图信息系统地图来源于google地图，包括普通地图图层、卫星影像图层、路面信息图层，另外自行画了一些局部区域的三维地图，本项目为企业内部项目，与互联网隔离，故不可使用google的地图api，则需要抓取google的相关地图资源（暂时使用google地图资源），利用openlayers构建轻量级专用地图信息系统，这里的轻量级是指使用tilecache接口实现地图图层（相关资料见前篇博文）
实现的效果图如下：
图1 后台管理页面
图2 前台展示页面（全屏显示）
地图相关说明：
地图页面事件说明
地图基本功能
(1) 左上角的地图浏览控件：包括地图的上下左右移动，地图的缩放
(2) 右上角三个选项，包括地图、航拍、三维，点击每个选项，出现相应的地图视图，其中地图、航拍使用google地图数据（下载google地图）
(3) 能够标注地图的行政区域
(4) 鼠标在地图上双击鼠标左键，放大地图一个级别，鼠标滚轮向前向后转动分别是放大缩小地图一个级别，鼠标右键点击，无响应事件
展示平台功能
(1)主界面视图
a) 有若干个个图层，地图下面有各个图层的选项卡，点击每个选项，显示相应的内容
(2)局部区域视图
a) 选中标记（点），跳转到局部区域视图
b) 点击标记（点），根据项目的相应设置，显示地图下方的选项卡，点击选项卡，显示响应的内容
c) 鼠标放在标记（点）上时。出现提示框，鼠标移到提示框上面，可以点击相应的链接，点击链接之后，弹出一个对话框，并且锁住地图界面
地图数据说明
地图基本数据
(1)地图图片，要有连续的缩放级别的图，每个级别之间相差2倍
(2)航拍图片，要有连续的缩放级别的图，每个级别之间相差2倍
(3)三维图片，需要和地图图片、航拍图片保持一致的大小，和缩放级别和地理位置
(4)地图效果图上面的使用的图标和弹出窗口图，需要原件，编写css需要使用</description>
    </item>
    
    <item>
      <title>mark一下学习计划</title>
      <link>https://lewang.dev/posts/2011-05-11-mark2011/</link>
      <pubDate>Wed, 11 May 2011 14:26:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2011-05-11-mark2011/</guid>
      <description>为2011年mark一篇日志
好久都没有做总结了，好久都没有做什么项目了，整天忙着上课，读论文，最近一段时间还开始忙着谈恋爱了。
2011年开始这几个月读了数篇readings in database systems中超牛们的论文，对关系数据库知识也有了一定了解，而不是停留在以前仅仅会用关系数据库那个层次上了。还读了simpledb的源代码，minibase的源代码没有读完，也不想读了，很没意思，Jim Gray大神说关系数据库没啥搞头了，我觉得也是。Stonebraker大神也搞出了scidb，不搞传统的关系数据库了。
好吧，我也不搞关系数据库了，开始跟进scidb吧。no-sql，not only-sql。我来了。</description>
    </item>
    
    <item>
      <title>openlayers小结(有参考项目代码)</title>
      <link>https://lewang.dev/posts/2010-10-11-how_to_do_with_openlayers/</link>
      <pubDate>Mon, 11 Oct 2010 12:42:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2010-10-11-how_to_do_with_openlayers/</guid>
      <description>最近一段时间里，又做了一个跟openlayers相关的项目，但是到目前为止，我对openlayers还是不怎么了解，做东西也只是参考了openlayers的例子，以及自己的一些对openlayers用法的一些猜测。openlayers是一个用js实现的GIS前端框架，我的js目前还是打酱油的水平，要是没有jquery，那就基本写不了几行js代码了。js那是相当的强大，再加上VML\SVG、HTML5以及很多js rich框架等等，感觉js在浏览器端真是无所不能啊
目前这个项目主要功能就是在某城市的地图上标示电缆、光缆、井盖、光缆接头、线杆、建筑物形状和位置、各分级单位的位置以及快速定位等等，要求的功能很简单，而且有前段时间做学校电子地图的一些积累，所以大概在两周左右就做完了这个项目。
感觉openlayers的资料很少，自己也没有太多的时间和精力去读它的源码，目前我都是通过看openlayers自带的那些example和api文档来摸索的，下面简单总结一下openlayers的相关用法，欢迎大家拍砖。
（以下均以OpenLayers-2.9.1为例说明，完整的项目代码在这里下载,地图图片http://121.193.130.68/list/）
1、我只用到了openlayers里面的tilecache接口，其它的例如WMS，google map等等都没有用到。原因是这样的。tilecache接口是用来从tilecache服务器上请求图片的。通过观察google map或者一些其它的地图服务，发现他们都是使用256x256像素大小的图片（也就是tile）来拼接地图的，通常的做法是在gis服务器之间架设一个tilecache服务器，这样，gis生成的图片就可以缓存在tilecahe服务器上，而tilecache服务器仅仅提供简单http服务即可，如果请求的图片(tile)不在tilecache服务器上，那么tilecache服务器会想gis服务器请求，把把gis生成的图片缓存在tilecache服务器上。
通过观察tilecache服务器的目录结构，发现缓存图片按照这样的模具结构存放：{缩放级别}/{横坐标}/{纵坐标}.{图片格式后缀名}，注意这个坐标系的原点在屏幕的左下角。观察到这个规律以后，就可以直接把一张大的地图按照256x256的大小切割，并按照上述的目录结构存放，值得注意的是，每个缩放级别要一定满足2^n的规律，即第一级整个地图大小若为1，那么第二级整个地图大小应为2，第三级应为4，依次类推。这里需要简单修改一下openlayers的tilecache接口代码，文件位于OpenLayers-2.9.1\lib\OpenLayers\Layer\TileCache.js,修改如下：
1 var components = [
2 this.layername,
3 zeroPad(tileZ, 2),
4 //zeroPad(parseInt(tileX / 1000000), 3),
5 //zeroPad((parseInt(tileX / 1000) % 1000), 3),
6 zeroPad((parseInt(tileX) % 1000), 3),
7 //zeroPad(parseInt(tileY / 1000000), 3),
8 //zeroPad((parseInt(tileY / 1000) % 1000), 3),
9 zeroPad((parseInt(tileY) % 1000), 3) + &amp;lsquo;.&amp;rsquo; + this.extension
10 ];
同样，由于只使用tilecache，所以openlayers里面其它的代码也可删除，以减小openlayers的代码量，最后通过自带的python写的工具，压缩openlayers代码即可。
2.地图初次加载的时候，向服务器请求所有数据信息，并在地图上绘出相应的点线面。如何画出建筑的轮廓？用透明的就行了。
a.显示点信息,包括画点、用图标显示点，代码如下。
1 /*
2 * 在地图上画出所有的点并保存点的相关信息到字典中
3 */
4 function initFeaturePoint(vectorLayer,categoryId){</description>
    </item>
    
    <item>
      <title>小记盛大校园牛人创新技术大赛</title>
      <link>https://lewang.dev/posts/2010-09-18-snda/</link>
      <pubDate>Sat, 18 Sep 2010 09:13:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2010-09-18-snda/</guid>
      <description>好久没有在blogjava上面写东西了，前段时间一直在忙两个项目，忙到没有时间做一些总结，还好项目进展都还不错。这段时间自己虽然搞得很忙，但是自己却感到非常的开心，我突然觉得这个世界好像都是属于我的：遇到了很多给我帮助的人，做了很多自己喜欢做的事，开始了自己特别向往的生活。
突然觉得自己的梦想正在慢慢靠近，简直是触手可及，但是我还是冷静了一下，没有急忙着伸出手，还是把梦想放在高高的地方，让自己一直都能看到，然后去追逐吧。
觉得自己越来越感性，喜欢研究血型，喜欢研究星座，喜欢思考，喜欢去捕捉自己的点点思绪，然后写成文字，留在纸上，也觉得自己越来越走向偏执，而不是小时候那种的任性。
言归正传，说说自己参加的这次盛大校园牛人创新技术大赛。比赛相关细节请访问http://ic.sdo.com/。这是自己再次成为学生以后参加的第一个面向全国在校学生的技术大赛，在这个比赛中，我一个人一组，并最终进入决赛获得了三等奖，拿到了1w块的奖金。自己真是太幸运了，从决定参加比赛到完成代码大概用了两个星期的时间，而且主要的编码工作还只是用了两个周末的时间来完成的。
下面说说我做了什么。
我很喜欢旅游，喜欢背着包安静的行走，拍下自己路过的一切景色，也很喜欢在自己的日记本里记下自己每一天的心情。这个小应用旨在让每一个喜欢旅游的中国人都能在自己祖国的版图上留下自己的足迹，形成自己的足迹快照，并且能够在自己留下的足迹的地方添加日志和上传照片，这样去过相同地方的人就可以交流着相互的旅行记忆，想去同一个地方的人也可以组团或者提供那种类似“沙发客”的那种服务，帮助别人实现自己的旅行梦想。同时，可以对用户的数据进行发掘，也许20年后，在相同一天去过某个地方的人会收到一封相同的信，内容是我们为他保留的日志和照片；足迹中国还应该积极发掘想要去相同地方的或者路线相同相似的人，推荐他们组成一个旅行梦之队，为这些人提供订票、预定住所、购买保险等等一站式的旅游服务。
我给这个小应用取名为足迹中国。
因为我想：
在自己去过的每一个地方留下足迹，分享自己的旅行记忆
在自己想去的每一个地方做个标记，分享自己的旅行梦想。
东西弄得很简单，技术细节就不说了。下面说说比赛入围以后的，我去到盛大的一些所见所闻。
说到比赛，我想除了收获了最直接的奖金之外，还有如朋友、实实在在的企业体验、以及对盛大的了解等等。我想，说到盛大，几乎在每一个中国网民的心里网络游戏简直就是他的代名词，在参观了盛大创新院、盛大在线、盛大客服之后以及HR老师们培训的过程中，HR老师不断问我们盛大是一个什么类型的企业，最后终于被成功洗脑，我现在可以清楚的说出盛大是一个互动娱乐媒体企业了。
在上海待的这几天，盛大在线和盛大创新院的老师们都给我们做了比较周到的安排。第一天上午创新院的范老师和庄老师带领我们参观了创新院(其实之前我已经来过创新院了，并且待了一个多月)，并给我们下午的演讲做了一次演练。下午的时候盛大在线的朱总、创新院的郭院长以及其他几位盛大各部门的大牛们准时坐到了评委席，我第一个上，有点紧张啊(此处省去200字)。晚上的时候和专家们共进晚餐，可以和专家直接交谈，咨询技术问题，交流自己的想法确实是一件非常爽的事情。当晚还和HR的老师们交流和很长时间，了解到了盛大的一些福利待遇，最重要的是HR姐姐们传授了我们很多找工作方面的有用经验。当然HR姐姐们还说那张获奖证书就是盛大的绿卡。。。第一天就这样过去了。
第二天参观了盛大在线和客服中心，并且最终揭晓了奖项情况。最后很意外的让我代表了所有获奖同学上台做个简单的发言。真是有点激动啊，被代表了20多年了，今天终于可以代表一下别人了。立马沉住气，开始打腹稿。等到走上讲台之后，才发现刚才打完的腹稿早就被胃消化，没被吸收就直接进入大肠了。算了，于是胡言乱语了一通，现在只记得说自己想去创新院实习。因为自己确实希望能去创新院实习。我在创新院呆过一段时间，对那里的技术氛围有些了解，感觉那里的每个人都超牛，每个人都能不断的闪出非常吸引人的点子。那里环境优雅，一切都非常好，给人一种自由的感觉。
ft。。。一下子写了这么多了。。。就此搁笔，期待奖金早日入账！我就可以换个android的手机了</description>
    </item>
    
    <item>
      <title>删除Firefox地址栏下拉列表中的指定记录</title>
      <link>https://lewang.dev/posts/2010-01-11-del-firefox-address/</link>
      <pubDate>Mon, 11 Jan 2010 08:31:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2010-01-11-del-firefox-address/</guid>
      <description>2010年的第一篇日志献给了firefox
原因很简单，我要删掉删除Firefox地址栏下拉列表中指定的几条记录，试了del、alt+del、shift+del、ctrl+del都不管用
才发现这些记录都已经是书签了，于是选择:书签&amp;ndash;&amp;gt;管理书签&amp;ndash;&amp;gt;在搜索书签栏里面输入要删除的网址，找到删除即可</description>
    </item>
    
    <item>
      <title>用飞信(libfetion)定时发天气预报</title>
      <link>https://lewang.dev/posts/2009-11-23-libfetion/</link>
      <pubDate>Mon, 23 Nov 2009 06:56:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2009-11-23-libfetion/</guid>
      <description>什么是libfetion？请访问http://www.libfetion.cn/查看
以下都是在ubuntu下进行的
参考
http://www.libfetion.cn/Docs-dve/Build-LibFx-on-ubuntu.txt
请使用svn客户端下载libfetion-gui的源码
http://libfetion-gui.googlecode.com/svn/
安装开发过程中需要的软件
1 sudo apt-get install libc-dev
2 sudo apt-get install g++
3 sudo apt-get install libcurl4-openssl-dev
在trunk/qt4_src/libfetion/lib目录下找到静态库libfetion_32.a，由于代码打算是用python来写，所以制作了一个动态库libfetion.so
具体步骤如下：
#解压静态库为*.o
ar -x libfetion_32.a
#重新封装为so
g++ -shared -Wall -fPIC -lcurl -pthread *.o -o libfetion.so
#查看so[可选步骤]
nm libfetion.so
发送天气预报的python代码如下，libfetion.so中具体的方法请查看trunk/qt4_src/libfetion/include/libfetion/libfetion.h
1 #!/usr/bin/env python
2 #coding=utf-8
3 #only can run at linux
4 import os
5 import ctypes
6 import urllib2
7
8 #城市代码列表
9 city_codes = {
10 &amp;lsquo;合肥&amp;rsquo; : &amp;lsquo;CHXX0448&amp;rsquo;,</description>
    </item>
    
    <item>
      <title>使用Openlayers搭一个E校园(e-campus),类似e都市，6d校园</title>
      <link>https://lewang.dev/posts/2009-07-10-e-campus/</link>
      <pubDate>Fri, 10 Jul 2009 16:57:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2009-07-10-e-campus/</guid>
      <description>最近为学校搭建了一个校园电子地图，做得不怎么好，只能凑合着用了。
快回家了，做点记录，欢迎拍砖指正。
新生应该可以在录取通知书里看到这个地图的链接了^_^
刚开始做这个地图的时候，打算使用geoserver等专业的东西，时间太紧了，对GIS一点了解都没有，所以就放弃了。看到了6D校园和e都市的实现方案，找了一找，发现了mapeasy这个js库，于是把6D校园的地图图片下载下来了，自己试着用mapeasy实现了一下，效果很好，但是总感觉不对劲，像6D校园和e都市都是使用html map area来标注地图信息的，这样就与真正的地理信息系统差远了，不好快速的添加信息或者做路径搜索了，于是又不是很满意。在使用geoserver的时候，注意到它显示地图信息使用了openlayers，于是简单看了一下openlayers的例子，感觉很强大，也比较符合我的想法。
openlayers可以直接使用图片做地图的来源，然后直接编辑地图，添加地图的地理信息，包括点，线，多边形区域，这样就很容易做路径搜索，也很快速容易添加地图的地理信息了。
看到openlayers可以使用tilecache做地图的图片来源，我就搭建了tilecache服务器，这个tilecache是用python写的，很容易配置。我仔细看了一下tilecache的配置，发现这个完全可以直接使用图片就可以，只是把切好的图片按照titlecache的目录结构放置好，就行了。于是简单的修改了一下openlayers的tilecache接口，就基本实现了电子地图。地图原图是一个面积很大图片，我用PIL库，使用python写了一个简单的切图程序，把地图按照横纵坐标切成了256X256大小的图片，并且按照自己定制tilecache的目录结构存好图片，最后把这些图片放在apache http服务器下，使用openlayers直接读取即可。
最后实现的功能有：地图浏览，地图缩略展示，地面建筑标记，地面建筑提示，路线标记，快速定位，后台添加信息等(路径搜索暂未实现)
其中后台可以直接画出建筑的多边形、路线、点标记，然后添加信息
后台管理页面如下：</description>
    </item>
    
    <item>
      <title>使用jquery&#43;jQuery Cycle Plugin实现MSN首页图片滑动切换效果</title>
      <link>https://lewang.dev/posts/2009-07-09-jquery-msn/</link>
      <pubDate>Thu, 09 Jul 2009 15:20:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2009-07-09-jquery-msn/</guid>
      <description>初学jquery，觉得很好玩。欢迎拍砖指正
我实现的效果截图
msn的效果截图
全部是js实现的，效果还不错，可以IE7，ff3，Chrome上正常运行,这里是demo[查看]
其中使用了jquery1.3.2[下载]，jquery.cycle.all.js[下载] 所有文件在这里[下载]
1 body {
2 font-family: Arial, Helvetica, sans-serif;
3 font-size: 12px;
4 font-style: normal;
5 line-height: normal;
6 font-weight: normal;
7 }
8 .clear{
9 clear:both;
10 height:0px;
11 }
12 .hot {
13 background-color: #F7F7F7;
14 height: 227px;
15 width: 302px;
16 border: 1px solid #DEDEDE;
17 padding-right:5px;
18 }
19
20 .hot_pic {
21 height: 190px;
22 width: 250px;
23 padding: 0;</description>
    </item>
    
    <item>
      <title>appengine支持Java了</title>
      <link>https://lewang.dev/posts/2009-04-08-appenginejavaoverview/</link>
      <pubDate>Wed, 08 Apr 2009 06:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2009-04-08-appenginejavaoverview/</guid>
      <description>刚刚登录appengine的时候才发现开始支持java了。
上午的时候还没有。
对java的比较熟悉，但是还是喜欢比较简洁的python
http://code.google.com/intl/zh-CN/appengine/docs/java/overview.html
&amp;lt;http://googleappengine.blogspot.com/2009/04/seriously-this-time-new-language- on-app.html&amp;gt;
这是注册试用后google appengine给发的邮件:
Hello,
Thanks for signing up to try Google App Engine for Java! Your account has now
been activated, so you can begin building applications with our new Java
runtime.
Please note that this is still an early look at our support for the Java
language and you may encounter issues during development. We look forward to
hearing your feedback! To learn more, please visit:</description>
    </item>
    
    <item>
      <title>初识python</title>
      <link>https://lewang.dev/posts/2009-03-25-python-start/</link>
      <pubDate>Wed, 25 Mar 2009 01:02:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2009-03-25-python-start/</guid>
      <description>以教程中的一段小诗开始：
Programming is fun
When the work is done
if you wanna make your work also fun:
use Python!
1 #!/usr/bin/env python
2 #coding=utf-8
3 poem = &amp;lsquo;&amp;rsquo;&amp;rsquo;\
4 Programming is fun
5 When the work is done
6 if you wanna make your work also fun:
7 use Python!
8 &amp;rsquo;&amp;rsquo;&amp;rsquo;
9
10 f = file(&amp;lsquo;c:\\poem.txt&amp;rsquo;,&amp;lsquo;w&amp;rsquo;)
11 f.write(poem)
12 f.close()
哇，下面这段真是解释性的脚本语言的魅力啊，动态生成语句，然后直接解释执行，太灵活了
1 #!/usr/bin/env python
2 #coding=utf-8
3 stm = &amp;lsquo;a = 10&amp;rsquo;</description>
    </item>
    
    <item>
      <title>中国各城市的经纬度数据(精确到县级城市)</title>
      <link>https://lewang.dev/posts/2009-03-12-gs-china/</link>
      <pubDate>Thu, 12 Mar 2009 12:34:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2009-03-12-gs-china/</guid>
      <description>经纬度数据收集自 维北有斗-天文爱好者的乐园
编写这篇博文有几个目的：
首先认识了两个单词
latitude [lat·i·tude || &amp;rsquo;lætɪtuːd /-tjuːd] n. 纬度; 回旋余地, 自由; 纬度地区
longitude [lon·gi·tude || &amp;rsquo;lɑndʒɪtuːd /&amp;rsquo;lɒndʒɪtjuːd] n. 经度; 经线
1.学习dom4j的简单用法
2.做一个方便使用的全国城市经纬度数据库
3.利用google天气api做一个全面的天气预报服务
4.学习用python编写webservice
内容：
1.学习dom4j的简单用法
收集了的经纬度都是按照城市分开的单独的htm文件，我已经处理过为符合html4.0标准的html文件了，即所有的标识都是成对的，这里可以下载这些文件(点击下载经纬度html包)
(1)如何使用dom4j读入xml文档
使用dom4j读入xml文档代码片段
1 File file = new File(&amp;ldquo;G:\\workspace\\test.xml&amp;rdquo;);
2 SAXReader reader = new SAXReader();
3 //根据实际情况设置编码
4 reader.setEncoding(&amp;ldquo;GBK&amp;rdquo;);
5 Document doc = reader.read(files);
6
7 //获得xml文档的根节点
8 Element root = doc.getRootElement();
(2)如何遍历xml文档的所有结点
这样就读入了这个xml文档，并获得了这个xml文档对象的根结点，由于xml文档是一个树形结构，这样就很容易遍历它所有的结点了。
这里根据自己的需要，测试使用了两种遍历方法，一种是根据树的结构编写递归程序，一种就是直接使用循环，还有都dom4j自带的visitor模式访问也很好用，这里有篇参考文档，可以看看(查看)
使用递归遍历
public void visitAll(Element root, Element child){ // 枚举所有子节点 for ( Iterator i = root.</description>
    </item>
    
    <item>
      <title>使用Code Blocks(mingw)IDE利用windows api编写远程桌面端口修改程序</title>
      <link>https://lewang.dev/posts/2008-12-02-remotedesktop/</link>
      <pubDate>Tue, 02 Dec 2008 10:24:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2008-12-02-remotedesktop/</guid>
      <description>办公室通过路由器上网，所以不能直接远程桌面登录到自己计算机上，办公室的人都想在宿舍登录到自己的计算机上工作学习，所以可以简单的将路由器的3389端口(windows远程桌面默认使用3389端口)映射到自己的IP上，同时修改其他人计算机的远程桌面端口，然后再相应的将路由器端口映射到自己的IP上即可。
修改远程桌面端口需要修改注册表中的两个值：
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp]
&amp;ldquo;PortNumber&amp;rdquo;=dword:00000d3d
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp]
&amp;ldquo;PortNumber&amp;rdquo;=dword:00000d3d
修改两个值，十进制是0-65535，双字十六进制是0x00000000-0x0000FFFF，推荐修改为1024以上。
如何使用windows api编写一个小程序来修改端口呢？接下来就详细的讲讲这个程序应该如何实现，另外在讨论一下如何使用windows api编写简单的windows程序。
下载开源的windows api集成开发环境Code::Blocks (访问Code::Blocks主页)
建议下载集成mingw的CodeBlocks，这样就不用单独下载安装mingw了，如果不知道什么是mingw，赶紧google一下看看吧。配置好开发环境后，就可以开始下一步啦。
启动Code::Blocks，然后新建一个Win32 GUI Project，这样IDE会自动构建一个对话框，而且程序的基本结构也就构造好了。程序的入口就是WinMain函数，然后就可以在这个基础之上编写我们的程序了。
先确定这个程序有几个窗口，然后修改resource.rc文件，资料都可以去MSDN查找
resource.rc
1 #include &amp;ldquo;resource.h&amp;rdquo;
2 3 DLG_MAIN DIALOGEX 6,6,269,131
4 STYLE 0x90CC0800
5 CAPTION &amp;ldquo;远程桌面连接端口修改器&amp;rdquo;
6 FONT 8,&amp;ldquo;MS Sans Serif&amp;rdquo;,0,0
7 BEGIN
8 CONTROL &amp;ldquo;&amp;quot;,IDC_EDT,&amp;ldquo;Edit&amp;rdquo;,0x50010000,72,51,170,13,0x00000200
9 CONTROL &amp;ldquo;十进制(&amp;amp;D)&amp;quot;,IDC_RBN_D,&amp;ldquo;Button&amp;rdquo;,0x50010009,20,81,54,9
10 CONTROL &amp;ldquo;十六进制(&amp;amp;H)&amp;quot;,IDC_RBN_H,&amp;ldquo;Button&amp;rdquo;,0x50010009,90,81,60,9
11 CONTROL &amp;ldquo;二进制(&amp;amp;B)&amp;quot;,IDC_RBN_B,&amp;ldquo;Button&amp;rdquo;,0x50010009,164,81,54,9
12 CONTROL &amp;ldquo;修改(&amp;amp;E)&amp;quot;,IDC_BTN_E,&amp;ldquo;Button&amp;rdquo;,0x50010000,14,107,54,13
13 CONTROL &amp;ldquo;还原(&amp;amp;B)&amp;quot;,IDC_BTN_B,&amp;ldquo;Button&amp;rdquo;,0x50010000,70,107,54,13
14 CONTROL &amp;ldquo;关于(&amp;amp;A)&amp;quot;,IDC_BTN_A,&amp;ldquo;Button&amp;rdquo;,0x50010000,126,107,54,13
15 CONTROL &amp;ldquo;退出(&amp;amp;Q)&amp;quot;,IDC_BTN_Q,&amp;ldquo;Button&amp;rdquo;,0x50010000,198,107,54,13
16 CONTROL &amp;ldquo;远程桌面端口&amp;rdquo;,IDC_STC,&amp;ldquo;Static&amp;rdquo;,0x50000000,16,53,52,9
17 CONTROL &amp;ldquo;基数&amp;rdquo;,IDC_GRP,&amp;ldquo;Button&amp;rdquo;,0x50000007,14,70,228,24</description>
    </item>
    
    <item>
      <title>windows xp sp3 &#43; apache_2.2.8-win32-x86-openssl-0.9.8g.msi &#43; php-5.2.5-Win32.zip &#43; mysql-5.0.45-win32.exe的安装记录</title>
      <link>https://lewang.dev/posts/2008-09-03-226778/</link>
      <pubDate>Wed, 03 Sep 2008 13:16:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2008-09-03-226778/</guid>
      <description>在windows下安装过很多次apache+php+mysql了，每次都没有做一个详细的记录。今天心情不好，所以写个日志。
这里的安装方法都是参考于php的官方安装文档，所以直接查看它的官方文档就可以安装了
主要参考这两个手册：php-5中文手册和php-5.2.5-Win32.zip 软件包中的install.txt
首先请准备以下软件(ps：我的这些软件都是很久前下载的，现在已经有新版本了，不过安装方法都是一样的)
点击下载apache
点击下载php-5
点击下载mysql
下面开始安装(安装顺序无所谓)和配置，不要一味的照搬，自己结合自己的情况看看
===&amp;gt; 软件的安装
1)安装apache_2.2.8-win32-x86-openssl-0.9.8g.msi
=&amp;gt;安装方法：直接运行安装程序安装
2）安装php-5
=&amp;gt; 解压下载的安装包，将解压后的文件目录名改为php，以方便后面的配置
=&amp;gt;进入刚刚改名为php的目录，找到php.ini-recommended文件，将该文件改名为php.ini
=&amp;gt;将名为php的目录整个拷贝了任意一个盘(c，d……)的根目录下，以方便后面的配置,我将php整个目录拷贝到了D盘根目录下，即d:\php
3）安装mysql
=&amp;gt;安装方法：直接运行安装程序安装
=&amp;gt;配置mysql：安装完mysql后，程序会自动弹出配置窗口，直接点击&amp;quot;next&amp;quot;&amp;hellip;&amp;hellip;.，然后设置好相应的字符编码和root用户的密码等
这样程序就安装完成了，下面分析这些软件应该如何配置才能工作。
===&amp;gt; 服务器的配置(这里只是简单讲讲如何让服务器正常工作，想要知道更多的配置，请自行查看软件配置文档)
1）配置php(先前我将解压后的php包整个拷贝到了d目录下d:\php)
=&amp;gt;进入php所在目录，目录结构基本是这个样子
点击展开
d:\php
|
+&amp;ndash;dev
| |
| |-php5ts.lib
|
+&amp;ndash;ext &amp;ndash; extension DLLs for PHP
| |
| |-php_bz2.dll
| |
| |-php_cpdf.dll
| |
| |-..
|
+&amp;ndash;extras
| |
| +&amp;ndash;mibs &amp;ndash; support files for SNMP
| |
| +&amp;ndash;openssl &amp;ndash; support files for Openssl</description>
    </item>
    
    <item>
      <title>使用正则表达式来限制输入框中只能输入数字</title>
      <link>https://lewang.dev/posts/2008-09-02-226416/</link>
      <pubDate>Tue, 02 Sep 2008 08:10:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2008-09-02-226416/</guid>
      <description>在JavaScript中使用正则表达式来限制输入框——输入框中只能输入数字
点击查看
1 这样使用：
点击查看
1 请在这里测试</description>
    </item>
    
    <item>
      <title>也扯打造个性BlogJava模板</title>
      <link>https://lewang.dev/posts/2008-05-06-template-canvas/</link>
      <pubDate>Tue, 06 May 2008 07:49:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2008-05-06-template-canvas/</guid>
      <description>编写此文的目的：当你看到我这篇博文的时候，估计你就不能体会我为什么要编写此文了。在此文发表之前，我需要一篇博文来改变我的首页的丑陋的状态，于是我就写了这篇博文。
使用到的工具：大脑一个,手两只， IE Developer(点击下载)，其他东西若干
打造过程:
前天申请的BlogJava,感觉很不错，看看后台，发现可以通过修改CSS改变自己博客的面貌。 cnblog上有人说有比较好的costom的模板，可在BlogJava里我却没有找到这个模板。系统里已经自带了很多模板了，都很漂亮，但是自己还是喜欢那种oracle数据库帮助文档那种样式的页面，在后台选了个最接近自己想法的模板cogitation,然后就开始这次改造工程。
大侠们见谅，以下部分没有什么内涵，都是一些干完体力活后发的牢骚
如果你还想继续往下看，请确保你已经成功安装了IE Developer浏览器插件。
打开自己的BlogJava首页，可以看到自己选的模板已经生效了，先用IE Developer查看一下自己首页的结构吧，很简单，一目了然。想起了后台可以自己用HTML定义页面的头部和尾部，这个太好了，直接把原先的页面头和尾设为不显示,css代码如下：
#footer{ }{
display:none;
}
#top { }{
display:none;
}
然后自己写个页面头和尾，把自己的写的头和尾的html代码拷到后台对应的地方，代码不要是完整的html页，一两个table即可。自己写的头和尾页可以有css，把这些css放到『通过css定制页面』中去吧。例如我的页首页脚html代码就是这样：
Canvas
积极且具有忧患意识的人,在每一次忧患中都会看到机会,并且在每个机会中也都会看到某种忧患! ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) 首页 ![](/Images/OutliningIndicators/None.gif) 新随笔 ![](/Images/OutliningIndicators/None.gif) 聚合 ![](/Images/OutliningIndicators/None.gif) 联系 ![](/Images/OutliningIndicators/None.gif) 管理 ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) ![](/Images/OutliningIndicators/None.gif) Copyright © Canvas Wong Contact me
接下来就是用IE develop导出页面css，然后自己修改成自己想要的样子，再放回『通过css定制页面』中去即可。
看到留言框内有个google广告，通过后台可以去掉这个广告，但是会留下一个iframe框，不知道你那是不是也这样。仔细看了一下留言页面代码，使用这段css代码把iframe设置为不显示:
iframe{ }{
display:none;
}
总结:右键-&amp;gt;查看源代码,原模板的东西都在，只是没有显示出来，糊弄一下看客的眼睛而已。
找一个自己喜欢的模板，将它打造得面目全非吧。</description>
    </item>
    
    <item>
      <title>打造ICTCLAS JNI For Java</title>
      <link>https://lewang.dev/posts/2008-05-06-jni-free-ictclas/</link>
      <pubDate>Tue, 06 May 2008 06:40:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2008-05-06-jni-free-ictclas/</guid>
      <description>声明:ICTCLAS以及我修改ICTCLAS JNI For Java的版权均归原作者所有，未经原作者允许，请勿作其它商业用途
首先下载ICTCLAS Beta版本公开源代码:点击下载
我使用的是Visual studio 2005开发环境，源码使用VC6开发的，现在把这个工程转移到VS2005下。我使用的方法比较笨，基本上是属于体力+暴力型的，不过自己觉得爽就可以了
在VS2005里新建Win32项目FREEICTCLAS,在application Settings选项里选中Dll和Empty Project,然后新建以下过滤器(New Filter)，并且将原项目的源码及其目录结构copy到现在的win32项目的目录下(过滤器和项目目录示意图)
示意图(点击前面+号展开)
| |
这样这个win32工程基本就建完了。
观察ICTCLAS源代码后编写以下带有native声明的方法的java类，只实现了头两个方法，第三个暂未实现，与ICTCLAS接口基本保持一致
代码如下:
FreeICTCLAS.java(点击+展开)
public class FreeICTCLAS
{
///*
* 初始化设置取值都是0,1,2
*/
public native boolean FreeICTCLAS_Init(int OperateType, int OutputFormat);
///*
* 与Free版本中有所不同,返回值为结果
/
public native String FreeICTCLAS_ParagraphProcess(String sParagraph);
/**//
* 与Free版本中基本保持一致
*/
public native boolean FreeICTCLAS_FileProcess(String sSourceFilename, String sResultFilename);
public static void main(String[] args)
{
System.loadLibrary(&amp;ldquo;FreeICTCLAS&amp;rdquo;);
FreeICTCLAS test = new FreeICTCLAS();
test.FreeICTCLAS_Init(0,0);
String str = test.</description>
    </item>
    
    <item>
      <title>JNI技术入门之Hello World篇</title>
      <link>https://lewang.dev/posts/2008-05-05-jni-hello-world/</link>
      <pubDate>Mon, 05 May 2008 06:29:00 +0000</pubDate>
      
      <guid>https://lewang.dev/posts/2008-05-05-jni-hello-world/</guid>
      <description>毕业设计是做一个中文的XML信息检索系统。当时选题的时候真的是不知道天高地厚，选了这么一个难题，但是毕竟已经选了，那就不要畏缩了！查阅了信息检索的相关资料后，遇到了一个很棘手的问题——中文如何分词？这是个大问题，不知道如何入手。于是查查资料看看有没有现成中文分词系统拿来用，这一找就找到了中科院的ICTCLAS。网上已经有很多的已经封装好了的ICTCLAS.dll，由于毕设打算用Java技术打造一个系统原型，那就需要通过JNI技术来调用ICTCLAS.dll。其实这也已经有人做好了，但是，我还是想知道JNI的个什么样的东西，还想知道如何正确的使用这个技术。
已经习惯了从Hello World开始。
我使用的是JDK_1.6.0和Visual studio 2005，使用Visual studio 2005生成可供Java调用的dll需要做以下设置：
在Visual studio 2005的菜单Tools\options\Projects and Solutions\VC++ Directories，添加JDK安装目录下inlcude和include/win32目录,如下图所示
设置图(点击前面+号展开)
编写带有native声明的方法的java类，代码如下
JniTest.java(点击前面+号展开)
public class JniTest{ /*静态块装载JniTest.dll，不用写出后缀名.dll,因为不同平台，系统会自动识别*/ static { System.loadLibrary(&amp;quot;JniTest&amp;quot;); } /*native方法申明,不要写具体的实现*/ public native void sayHello(); } 然后在命令行输入Javac JniTest.java编译JniTest.java
生成JniTest.class文件后，再使用javah JniTest生成JniTest.h，代码如下
JniTest.h(点击前面+号展开)
/* DO NOT EDIT THIS FILE - it is machine generated */ #include &amp;lt;jni.h&amp;gt; /* Header for class JniTest */ #ifndef _Included_JniTest #define _Included_JniTest #ifdef __cplusplus extern &amp;quot;C&amp;quot; { #endif /* * Class: JniTest * Method: sayHello * Signature: ()V */ JNIEXPORT void JNICALL Java_JniTest_sayHello (JNIEnv *, jobject); #ifdef __cplusplus } #endif #endif 在Visual studio 2005里新建项目Win32 project，在弹出的对话框中点击application setting，然后再选上dll和Empty project。 接着在项目中添加JniTest.</description>
    </item>
    
    <item>
      <title>归档</title>
      <link>https://lewang.dev/archives/</link>
      <pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate>
      
      <guid>https://lewang.dev/archives/</guid>
      <description>归档</description>
    </item>
    
  </channel>
</rss>
