分类目录归档:工作

打脸的事情

我也非常喜欢做打脸的事情,刚刚讲了一句话,过了一分钟就会被打脸

比如说上一篇刚说的语音输入法不适合我,但是下一篇的整片文章都是使用的语音输入法。你说百度找谁去说理

但是语音输入法的错误率确实非常的高,难以相信。还有就是如果一篇文章写完了就发表出来,不然写的草稿就真成草稿了

自助烧烤不是一个好东西

如果吃的太少了,你会觉得很困,如果吃的太多了,你会觉得很难受,正反两方面来说,都是不合算的

烧烤这类东西可吃可不吃,从医学上来,讲也不健康,有致癌的风险。其实里面的饮料也有问题,并不是现榨的,里面肯定会有很多食品添加剂。

吃东西的话,应该想吃多少吃多少,如果觉得这顿不饿的话,那么可以少吃一点,这样还能省钱。如果觉得这种比较饿的话,那就多吃一点身体比较舒服。从两方面来讲,都是划算的

同样的王者荣耀也不是一个好东西,它能消磨掉你大多数的时间,比如在深夜1点45分还没有睡觉?,幸运的是自己还能写一篇博客出来,已经没有想到,为什么而写了

最近两天比较重要的几件事,腾讯导航卡用户量突破2000万,恭喜腾讯,好的东西就是要拿来跟大家分享,大家才来使用的。最近比特币勒索的事情弄的人心惶惶,纷纷自查自己电脑的安全性,逼迫大家都成为了安全专家。坚果手机大卖,衷心祝愿销量再上去。还在考虑。iPhone什么时候会有ideapill这样类似的应用上线

懂与不懂

我是对任何事情都没有耐心的,花钱的事情除外,因为问题对花钱的事情期望太高,所以会硬着头皮看下去或者学下去

登录昨天的电影和这次数据库工程师的考试。电影刚开场我已经很不耐烦了,又是英语,又是不知道在讲什么,但根据我这么长看电影的经验,前期不懂的一些的问题最终都会解决的,再加上是自己花钱和花时间来看电影 ,好看不好看都要硬着头皮看下去。

再如这次的软考,我知道自己吵报名培训也是能够考个及格的分数的,报名培训也得不了满分,几乎没有区别,但还是参加了网络课程,应该教育的收获还不少,里面都是针对怎么考试的,像我这样没有怎么复习过年,提分的效果应该是不错的,但具体知识的增长就比较有限了,因为里面不讲太深入的内容。

与之而来的副产品是,我了解了直播课程的形式,感觉非常灵活,可能让自己再多参加几场培训,应该会的,起码把高级的课程过了,这是副产品,但高级的课程就没有这么大的自信了

收费的有价值的知识让我们能打起精神,是因为你能深入进去,那么免费的有价值的知识就不能让我们打起精神吗?这是我下一个阶段需要验证的事情,我有两个知识视频,从初步来看,两个都非常好,也需要花大量时间去练习,一个是Swift的iOS开发,另外一个是OCP和OCM的教程。前一个是免费获得的,后一个是花了一点钱从淘宝上买来的,这两个视频目前唯一的问题没有截止时间,所以我并没有给予足够的重视。Swift已经看了一半左右,OCP的只是看了个开头。Swift没有证书可以考试,但实际上却很有价值,OCP和OCM可以考证书同时也比较有用,至少比现在我要考试的数据库工程师要有价值,我目前这样认为

 

重新开张

在我开始这个博客的时候已经写过了,我有一个黑猫同学看是一个经常写作的人,虽然我不太认可他的写作水平。但是他是我认识的,写博客到现在坚持时间最长的人,并且中间中断的时候也非常非常的少。因为我关注的几个博客的博主,有很多由于工作或者是生活的原因已经中断了写作转移到了其他地方,但是这个同学一直坚持在自己的博客上发布东西。

中间有段时间,我的有位同学提醒我,我的博客访问不到了,后来我没有回复的时候实在太忙也没有好好整理,域名DNS的东西。直到最近我又开始每天的记录每天记录的多了可能会出现一些东西需要整理成有条理的,分类的东西,觉得还是要按主题记录在博客上。

在博客中断的这段时间,曾经有几次?我想查询一下之前我写的一篇文章,就是关于eclipse快捷键的文章。但突然发现自己的域名不能访问了,当时一阵沮丧,但也仅限于当时而已。

直到最近收到了Godaddy的邮件通知说我的域名马上要过期了需要续费,于是又交了一年的费用才发现钱没浪费,博客又给开通了。

这次开张,我不知道能够坚持多长时间,但是我希望是足够长,就向我地每日记录一样可以时时督促我,利用好自己的时间,自己每天都能够有一点点进步。博客的功能,最重要的是分主题的记录我的一些思考,方便我之后回过来查询。

我之前注意到我的wordpress有定时发布的功能,写的比较少所以没有后续的文章可以定时发布,每次都是到了不得不发的时候才去写,之后可以好好利用这个功能。最近发现好多人在开自己的公众号,公众号的一个最大好处就是可以在朋友圈相互传播,但是博客的开放性更好,不但具有的一切好处,还具有公众号,不具备的能力:自由开放。

如果需要的话也可以加上次的转发的功能,只不过是要单独申请一个可以签名的公众号而已。单独签名这项功能,我们做了不知多少次,所以说已经相当熟练。

又要过期了

问题在要过期的时候才会看到博客的重要性。虽然我已经做了每天的备份,但在距离最后一天的时候,我不还是要确保所备份的东西是最新的版本,不然近期写的东西可能会全部丢失。

仔细看了一下我近些年写的东西,总文字量也才只有500k左右的样子,是什么概念呢?虽然跨度很长,但我确实没有写多少东西。又看了一下附件的量,也只有50多M的量,超乎我的想象,因为我虽然一张照片也不主动上传,但一些经验的截屏还是有蛮多的。再看一上2016年的文章,可能就更少了。附件里面基本没有文件,还以为是自己备份的问题呢,其实不是。在重置了服务器密码之后 ,我竟然找不到挂载的磁盘了,导致出现三天的博客无法访问,有时在想,真的这样了吗,不再写下去了,对我的损失不是蛮大的,不能为了自己偷懒把自己辛苦几年的东西完全丢弃掉,也不能因为一年的租金把自己的东西丢失掉,于是我决定花一下午的时间把它整理好,或者恢复,或者迁移,做好新的工作。

到现在虽然还没有完全完成迁移工作,也许应该说迁移 工作还没有开始 ,但至少已经确保了最新的备份,另外可以使用最后一天的服务器也已经恢复了正常,也就是说我还有一天的时间把另外一台服务器弄正常。如果 一天没能完成,也只是主站无法打开的问题,不影响其他的。

给手机大战泼四盆冷水——总结

最近非常非常的忙,第一个原因是在忙自己的事情,第二个原因,你懂的

吴晓波老师的节目隔了好几期,今天吃饭的空听完了《给手机大战泼四盆冷水》,以下是针对节目的总结

一、生态闭环

闭环

闭环是不存在的
乔布斯是早期受益者,但iPhone做的也并不是全闭环
所以闭环是否存在要打个巨大的问号

生态

生态链更不靠谱,为了打造自己的生态,所有内容供应商谈合作,无论视频资源还是音乐资源,重复性都非常大,很难差异化
现在的用户对信息需求是非线性的,对平台没太大的感情
闭环生态几乎痴人说梦

二、粉丝经济

在中国手机已经从粉丝经济打到了价格战
粉丝经济是要形成人情关系,性价比关系就模糊掉。而现在中国厂商所追求的是价廉物美,造成了在中国手机是屌丝经济,为了一块钱的差价,也会很容易背叛,这与粉丝经济有巨大的矛盾,目前而言粉丝经济在中国不存在的

三、缺乏核心技术的行业颠覆

目前所有的手机厂商核心技术都受制于人,系统受制于Android,CPU受制于高通、联发科,摄像头受制于索尼。唯一自己存在的只有组装能力和营销能力。综观经济学历史,颠覆只出现在技术革命领域!

中国在估值200亿智能硬件公司竟然没有发明专利,因为中国的企业具备的是组装与市场营销和鼓吹的能力,而这一切都是根基不稳的

四、我们仍然相信规模决定一切

年初5家手机宣布停掉产量要超过1亿台,第一季度显示手机出货量不到1亿台,平均下来全年销量也就4亿台左右,产能出现巨大过剩!中国企业家始终相信只有了规模以后才能闭环,规模加成本等于中国制造

第三次工业革命与中国制造2025都提出,未来制造业绝对不能成本加规模的方式来进行

手机大战才刚刚开始,是牌对对手的恐惧,我使用比你少的钱,狙击你的成功,我的目的就达到了。而这些钱也是拿资本市场上的钱,跟我个人没什么关系,这就是现今的经济泡沫

手机生产商一定要思考自己做手机的目的是什么,目的的价值决定所牺牲的程度

微信鉴权学习

时序图

这是最近开发应用的一个时序图,里面有两个鉴权的部分,其中的好坏我已经标出来了

以下是我觉得应该向微信学习的地方:

  1. 客户端访问的时候使用临时,一次性的code做传递
  2. 保密的数据通过服务端与服务端传输
  3. 可以把微信的鉴权无限扩展到N个项目
  4. 可以把JSAPI无限扩展于N个项目

以上只需要搭建一个类似于微信鉴权的平台

这是一封接口讨论的邮件,其实写邮件说明这个情况并不是得瑟,是有了想法,不甘于只写到博客里面,因为博客里面看的人实在太少。即使看的人多一些也未必了解情况,而一同做项目的人就不一样了,我发给他们都看的懂,有了想法就交流,这样比较好。但说实话我并没有想要去改动现在的接口,因为信息泄漏的危险实在太小了,我没有动力增加自己与对方的工作量来做这个事情

DNS备份与恢复

有时候需要更换DNS服务器,做好备份与恢复工作显得比较重要,总结最近两次基于Windows DNS的备份与恢复过程,备忘

DNS备份

  1. win + r -> dnsmgmt.msc /s -> 右击机器名 -> 所有任务 -> 停止
  2. win + r -> regedit -> 查找HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\DNS,右击,导出,命名为dns1.reg。
  3. win + r -> regedit -> 查找HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\DNS Server,右击,导出,命名为dns2.reg。
  4. win + r -> system32 -> 拷贝dns目录下.dns结尾的文件并保存

DNS的恢复

  1. win + r -> dnsmgmt.msc /s -> 右击机器名 -> 所有任务 -> 停止
  2. 把所有后缀为.dns的文件复制到这台机器的%system32%\dns文件夹下。
  3. 将dns1.reg和dns2.reg的文件。双击它们,一次一个,并且确认自己想把它们安装到注册表中。
  4. 重新启动DNS服务。

[转]Chrome 远程调试协议分析与实战

背景

某一天,A 君想获取 Chrome 页面中的性能数据,诸如时间、白屏和首屏等,因为需要和竞品进行对比分析,无法注入代码,该怎么办?

此时,你也许能想到开发者工具(DevTools),也许知道Timeline(包含浏览器完整的行为数据),该怎么自动获取到 Timeline 数据呢?

开发者工具

开发者工具(DevTools)是一个独立的 Web 应用程序(HTML+CSS+Javascript),被集成在浏览器中,通过远程调试协议(remote debugging protocol)和浏览器内核进行交互,直接使用 Ctrl+Shift+I 呼出。

devtools

可以在当前的浏览器页面直接打开 DevTools 调试,也可以在浏览器之外进行调试,本文的实战内容基于 PC 平台浏览器之外的远程调试。

远程调试协议

远程调试协议基于 WebSocket,利用 WebSocket 建立连接 DevTools 和浏览器内核的快速数据通道。DevTools 中的源代码(Main.js:220)如下:

var ws;
if ("ws" in WebInspector.queryParamsObject)
    ws = "ws://" + WebInspector.queryParamsObject.ws;
else if ("page" in WebInspector.queryParamsObject) {
    var page = WebInspector.queryParamsObject.page;
    var host = "host" in WebInspector.queryParamsObject ? WebInspector.queryParamsObject.host : window.location.host;
    ws = "ws://" + host + "/devtools/page/" + page;
}

该协议把操作划分为不同的域(domain),比如 DOM、Debugger、Network、Console 和 Timeline 等,可以理解为 DevTools 中的不同功能模块。

每个域(domain)定义了它所支持的 command 和它所产生的 event。

每个 command 包含 request 和 response 两部分,request 部分指定所要进行的操作以及操作说要的参数,response 部分表明操作状态,成功或失败。

command 和 event 中可能涉及到非基本数据类型,在 domain 中被归为 Type,比如:’frameId’: <FrameId>,其中 FrameId 为非基本数据类型

至此,不难理解:

domain = command + event + type

远程调试协议应用场景

  • 针对移动端的远程调试,因为移动平台一般都不会提供足够大的区域来显示 DevTools,必须要在手机浏览器之外进行远程调试,具体配置请参看这篇文章

  • 获取 JS 的Runtime数据,常用的如window.performancewindow.chrome.loadTimes()

  • 获取NetworkTimeline数据,进行自动性能分析

  • 与强大的phantomjs合体,phantomjs 暂时只支持基于 remote debugging protocol 的调试,希望能支持 Network 及 Timeline 数据的获取,phantomjs 的最新技术请点击进入

远程调试协议结构

以 Page domain 为例

command 结构如下:

Page.navigate
request: {
    "id": <number>,
    "method": "Page.navigate",
    "params": {
        "url": <string>
    }
}
response: {
    "id": <number>,
    "error": <object>
}

执行 Page.navigate 操作,需要参数 url,id 可以随意指定,不过要确认全局的唯一性,因为需要通过 id 关联 request 和 response。

event 结构如下:

Page.loadEventFired
{
    "method": "Page.loadEventFired",
    "params": {
    "timestamp": <number>
    }
}

Page domain 派发 loadEventFired 事件结构数据(通过 WebSocket 的 onmessage 获取),并包含参数 timestamp

type 结构如下:

Frame: object
    id ( string )
        Frame unique identifier.
    loaderId ( Network.LoaderId )
        Identifier of the loader associated with this frame.
    mimeType ( string )
        Frame document's mimeType as determined by the browser.
    name ( optional string )
        Frame's name as specified in the tag.
    parentId ( optional string )
        Parent frame identifier.
    securityOrigin ( string )
        Frame document's security origin.
    url ( string )
        Frame document's URL.

Frame type 为包含 id,loaderId,mimeType,name,parentId,securityOrigin 和 url 字段的 Object 数据类型,其中 loaderId 为另外一个定义在 Network domain 中的 type

更多协议内容请猛戳这里

远程调试协议实战

此协议用于 server 端和 client 端的通讯,所以需要先建立 server 端,然后 client 端通过协议连接到 server 端

开启 server 服务

打开浏览器的远程调试支持,并指定端口号:

./chrome --remote-debugging-port=9222

./chrome 为已安装的 Chrome 可执行程序

获取 server 地址

在浏览器中直接输入:

http://localhost:9222/json

获取所有的 tabs 信息,数据格式如下:

[
    {},
    {},
    {}
]

每个 {} 的内容如下:

{
    description: "",
    devtoolsFrontendUrl: "/devtools/devtools.html?ws=localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F",
    faviconUrl: "http://www.baidu.com/favicon.ico",
    id: "A12A4B08-E5AF-4A84-A86A-A1C86E731D7F",
    thumbnailUrl: "/thumb/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F",
    title: "百度一下,你就知道",
    type: "page",
    url: "http://www.baidu.com/",
    webSocketDebuggerUrl: "ws://localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F"
}

websocket server 端地址:

webSocketDebuggerUrl: "ws://localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F"

建立连接

在任意地址栏中输入 http://localhost:9222 + devtoolsFrontendUrl 值即可(等同于在当前页面直接打开 DevTools):

http://localhost:9222/devtools/devtools.html?ws=localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F"

或直接使用 WebSocket 连接,使用 webSocketDebuggerUrl 值连接:

var ws = new WebSocket('ws://localhost:9222/devtools/page/A12A4B08-E5AF-4A84-A86A-A1C86E731D7F"');

注意:每次只能进行一次 WebSocket 连接,之后的连接都会失败

调用 Command

WebSocket 通道建立完成之后,通过如下方式进行调用:

打开指定页面,并进行事件监听(以 Page.loadEventFired 为例):

ws.onmessage = function(event) {
    console.log(event.data);
};
ws.send('{"id": 1, "method": "Page.navigate", "params": {"url": "http://www.baidu.com"}}')

获取到的 loadEventFired 事件数据如下:

{"method": "Page.loadEventFired", "params": {"timestamp": 1402317772.874949}}

更多连接方式

nodejs ws

非常轻量级的 WebSocket 库,支持 client 端和 server 端,使用方式基本同 HTML5 的标准 WebSocket 库

client 示例:

var WebSocket = require('ws');
var ws = new WebSocket('ws://www.host.com/path');
ws.on('open', function() {
    ws.send('something');
});
ws.on('message', function(data, flags) {
    // flags.binary will be set if a binary data is received
    // flags.masked will be set if the data was masked
});

server 示例:

var WebSocketServer = require('ws').Server
      , wss = new WebSocketServer({port: 8080});
    wss.on('connection', function(ws) {
        ws.on('message', function(message) {
            console.log('received: %s', message);
        });
        ws.send('something');
    });

请移步:官方 ws 库

nodejs chrome-remote-interface

一个实现了 remote debugging protocol 的 nodejs 库,其中 WebSocket 使用的是 ws 库,使用方便,推荐使用

示例代码:

var Chrome = require('chrome-remote-interface');
Chrome(function (chrome) {
    with (chrome) {
        on('Page.loadEventFired', function(time) {
            send('Runtime.evaluate',{'expression': 'chrome.loadTimes()', returnByValue: true}, function(err, result) {
                //console.log(err, result );
            });
        });
        Page.enable();
        Page.navigate({'url': 'http://www.baidu.com'});
    }
});

请移步:官方 chrome-remote-interface

nodejs socket.io

功能强大,支持集成 WebSocket 服务器端和 Express3 框架与一身,使用简单,有兴趣者请移步:官方 socket.io

WebSocket

协议

它是 HTML5 一种新的协议,实现了浏览器与服务器全双工通信,只需要一个握手动作,浏览器和服务器之间就形成了一个快速通道,然后进行数据互传。

优点:

1、交互时的 header 只有约 2Bytes
2、服务端可以主动推送数据给客户端

header 格式(握手时):

request:

Cache-Control:no-cache
Connection:Upgrade
Host:localhost:9222
Origin:http://family.baidu.com
Pragma:no-cache
Sec-WebSocket-Extensions:permessage-deflate; client_max_window_bits, x-webkit-deflate-frame
Sec-WebSocket-Key:TKSQVug6zSIH4uzIyTYBcg==
Sec-WebSocket-Version:13
Upgrade:websocket
User-Agent:Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/35.0.1914.0 Safari/537.36

response:

Connection:Upgrade
Sec-WebSocket-Accept:HyjfMUpyYgWgkYLn/vDDf6rZLuk=
Upgrade:WebSocket

header 格式(交互时):

request:

User-Agent: Fiddler
Content-Type: application/json; charset=utf-8
Host: fakewebsocket
Content-Length: 211

response:

FiddlerTemplate: True
Date: Fri, 25 Jan 2013 16:49:29 GMT
Content-Length: 51

查看 WebSocket 连接

DevTools

直接使用 DevTools,在控制台建立 WebSocket 连接并交互,在 Network 面板中直接显示

fiddler

fiddler

自定义 fiddler 的规则,根据 WebSocket 特征提取信息并伪造 WebSocket 结构数据

因为伪造时,host 为 fakewebsocket,无法识别,所以通过 AutoResponder 伪造 respose 数据

请移步:Debug / Inspect WebSocket traffic with Fiddler

优化方向 优化手段
请求数量 合并脚本和样式表,CSS Sprites,拆分初始化负载,划分主域
请求带宽 开启 GZip,精简 JavaScript,移除重复脚本,图像优化
缓存利用 使用 CDN,使用外部 JavaScript 和 CSS,添加 Expires 头,减少 DNS 查找,配置 ETag,使 AjaX 可缓存
页面结构 将样式表放在顶部,将脚本放在底部,尽早刷新文档的输出
代码校验 避免 CSS 表达式,避免重定向

更多参考

原文

学习中的致使弱点

我在学习新技术的时候有个弱点,没有一追到底的决心,说的好听点叫不钻牛角尖。比如,在学习JDK的时候,需要JDK的编译环境,我总是对自己说这个环境搭建起来很麻烦,而且后面是否能成功都不一定;当然我说的没错,一些环境搭建确实费时费力,而且也不一定能够达到效果,但如果安装的次数多了,搭建环境也并非不可能的事情,而问题是如果没有这个环境,最终学习的效果就大打折扣。

为什么我网络实验课上的所有内容都给了我很深的印象,原因就是我们都去动手做了,而且达到了一定的效果,而这些效果又震撼了当时的我,所以令我记忆深刻;而这种深刻的记忆后面就由于自己的弱点而没有再次出现过。

做这些事情可能要花一些时间,而这些时间是值得去花的,成功了以后对自己的进步是不可估量的。如果每次都停留在理论的角度,每次都停留在别人做实验的角度,自己的进步可能就会出现瓶颈,自己离达到一个优秀的程序员也将渐行渐远

当然到达某个程度并非一定要使用这个软件,只是你达到这个程度也才能知道使用这个软件的便利性。我以前认为任何一个软件都最好不要作用任何插件,因为软件本身的功能都已经很齐全了,也让我少了很多探索的动力;而现在才发现当时的我是多么幼稚:软件不用来装插件完成各种功能就像你买一个苹果手机而不去App Store去装软件一样,你以为操作系统已经可以完成你自己想要的一切,这是多么不成熟的一种想法啊,想现在任何操作系统都是软件为王的时代,如果不是App Store里面有那么多好用的软件,谁会使用iOS这么封闭的一个系统?

发现了插件的重要性,于是我着手从自己现有的软件开始,VIM, SublimeText和Eclipse,这些IDE是我经常使用的,我需要找一下有没有更适合的软件让他们更好的工作,当然VIM是重中之重,但似乎目前的并不那么的顺利