分类目录归档:技术

SSH生成密钥对,登录服务器

最简单的生成方法:

ssh-keygen

按照提示写文件名就可以了,假设我们生成了xxx.pub和xxx,其中xxx是密钥文件,xxx.pub是公钥文件

配置CentOS的免密码登录:

  1. 用vim打开文件,拷贝里面的内容到需要登录账号的主目录,如/root
  2. 打开vim /root/.ssh/authorized_keys,如果没有这个目录则这样创建
    • mkdir .ssh
    • chmod 700 .ssh
    • cd .ssh
    • touch authorized_keys
    • chmod 644 authorized_keys
  3. 将xxx.pub里面的内容(应该是一行)拷贝到authorized_keys里面(单独占一行)
  4. ssh root@xxx.xxx.xxx.xx,选择xxx密钥文件,就可以不用密码登录了

 

局限性

我总是认为,一些理论的东西没有太大的用处,于是只是在寻找哪些可以具体实施的技术细节。一直认为把开发的框架,开发硬件,中件间的优化一配置,数据库的设计,应用服务器的负载均衡,分布式数据库的使用,内存数据库的使用,缓存技术的应用这些综合起来都是架构的一部分,但一遇到理论的部分,我好像什么也不知道……

在没有弄懂一件事情之前,一定不要对它下结论:这啥用。也许之前的我更关注的是在整个软件过程中的具体技术细节的实现,对于架构的理解也是停留于框架和服务器的设计方面。而架构师却是需求与设计之间的一个角色

那系统分析师应该是偏向需求这个方向的,架构师偏向技术这个方向的。这么讲吧,拿出来一个架构方面的概念我好像听都没听过,我拿了架构师的教程,翻到架构师这一章,所有根据都看不懂,看了里面简略的解释(这本教材虽然厚,但涉及的面太广,根本达不到学习的目的)。其实在听课程之前,我连架构师属于哪个阶段的概念都比较模糊。

当然,我比较精于里面技术的部分,无论是计算机组成还是操作系统或者是计算机网络,有逻辑思考能力的环节起码在考试知识点这块都不那么担心,担心的是软件工程部分,里面理论太多。担心是的开发和数据结构部分,这块考试的时候大部分时候竟然都是考试概念,并不会让我们真的写一段代码。还有就是架构与安全部分,大部分时候考试的也是理论的部分。

说到这,其实现在的关键点是,考试逻辑的部分非常少,只是上午题中的一部分,下午题简答和论文,都需要有清晰的理论概念,然后加上实际的案例来做论述,而之前自身的局限性让我学习这些知识时会无比痛苦。

PV操作

至少有三次机会我可以把它学好,但还是对一些概念模糊

PV操作主要分两类:互斥和同步

简单讲,互斥的PV是同一个信号量,或者讲只有一个信号量。而同步的PV在同一段代码中是不同的信号量。同步一般是两个信号量。

那么信号量是什么?具体的概念书本上有,我这边理解信号量是指示队列的。因为如果简单把信号量定义成资源的个数,同步的时候完全可以只用一个信号量,因为池的大小是固定的,两个信号量就会浪费资源嘛。

这也是我一直不理解的地方,同步的时候为什么一直使用两个信号量。把信号量定义为指示队列的就好理解了。生产者消费者模式里面,生产者如果被阻塞就会形成一个阻塞队列,消费者如果被阻塞,了会形成一个消费者的队列。那么信号量S1就指示的是生产者的队列,如果等于负数就是队列中有进程等待,否则就没有进程等待。S2指示的是消费者的队列,如果为负数就表示队列中有消费者在等待,其绝对值就是等待消费者的个数。

PV里面一个重大的特点是阻塞进队列,唤醒队列中的进程。如P(S1),表示我会无论如何先减1,占用一个资源,如果资源还有,那么我就执行接下来的操作,如果资源没有了,那么我进队列。重点是后半部分的进入队列。如果同步只有一个信号量的话,就不能完成进队列和唤醒的操作。而消费者在消费完一个商品后,会执行V(S1),这个操作里面也有一个判断,如果S1的值是负数,则在执行完之后还要去生产者的队列唤醒一个进程。

其实在想不通为什么他们会这样做的时候,可以先把我们要解决的问题拿出来,看我有没有更好的办法去解决这个问题,一旦发现自己的理论不能解决这个问题的时候,你就会发现书本上提供方法的巧妙之处了。比如我一直觉得,同步模型完全可以使用一个信号量表示缓冲池空余的个数。先不说没办法统一定义PV的操作,光是两个队列都不好表示了,因为一个信号量只能真实反应池中空余的个数,并不能并未已经阻塞了多少生产者和多少消费者。当然有办法,可以再定义一个池的大小,这样也是两个变量,表面上更好理解了,但对PV的统一性造成了破坏。

互斥模型比较好理解,因为在同一做代码中,PV操作使用的是同一个信号量,这个信号量既表示了阻塞的队列,也能表示资源剩余的个数。因为大家都是同样的并行进程,所以大家都进入一个队列。

论文写作规范

有幸参加系统架构师的考试,正好有一个千载难逢的写论文机会,我一定要好好把握,尽管这次是为了应付考试,但谁又能说不是我通向论文的入门之中呢?

​写作的两部分:理论和实践

论文的题目是4选1,每个题目都会有一段描述和三个要求,第一个要求是统一的,就是要联系自己的职位和项目论述问题。第二个是最主要的,里面涉及到架构的方方面面。第三个也是可以部分套用的,就是总结一下自己所谈项目及对第二个问题的回答后,所取得的成就和不足的总结。

那么这篇论文就从上述两个方面展开。在项目方面,需要选择一个比较有典型性的项目,并且这个项目最好能够套用大部分架构的场景。这个项目可以事先准备好,以不变应万变。如果自己的项目比较多的话,要吧多准备两个。

其实我更关注是的理论的部分,实践的部分我们已经在工作中遇到更多,但理论的部分往往是我们忽略的。如软件工程中需要分析的几种方式,架构中的软件性能瓶颈及硬件性能瓶颈。上面两个也是我乱猜的两个,具体的还要看希赛给的论文范例,里面有各个方面所准备的范例。这也是我需要从这些论文中学习的东西:这些范例论文中是如何使用理论知识回答第二个问题的。如果这方面的问题解决了,剩下的问题就都不是问题了。

写作套路总结如下:

摘要  300-400字
项目概要 400-600字
开发项目的概要
开发的体制和“我”担任的工作
项目在系统设计方面的情况
把握用户需求的重要性 100-200字
采用过的手段 1000字-1400字
采取的手段中有效果的手段,效果体现在什么地方 200-300字
采取的手段中无效果的手段,为什么没有效果 200-300字
总结 100-200字

 

苹果禁止热更新及微信的小程序

如果腾讯开发团队同样收到了苹果公司的热更新警告,如果不巧针对的是微信和QQ的话,那么接下来苹果和微信的对决就比较好看了

大背景

最近苹果公司发给了不符合规范要求的开发者一封邮件,明令禁止热更新技术。啥叫热更新呢?从用户角度来讲就是,你在上架的时候App的全部功能已经固定了,不可能在不发布新版本的情况下出现新的功能。

微信的小程序算不算热更新?

从上面的定义可以知道,如果所有的小程序全部打包到微信的更新版本里面了,那就不属于热更新,否则就属于。我们知道小程序是不断在更新的,有更多的小程序加入到微信里面,也有部分小程序从微信中下架,所以不可能是微信把所有的小程序打包到某个版本的微信里面了,所以从严格的定义来看,微信的小程序100%属于热更新。

腾讯会不会向苹果屈服?

如果要在短短几天内修改小程序的框架将是一个非常棘手的事情,几乎是不可能。但腾讯也不太会直接放弃iPhone的市场。那最大的可能是双方坐下来谈判,拿出来一个双方都可以接受的方案。

苹果会不会下架腾讯的全部产品?

6月12号如果收到热更新提醒的开发者不提交新的版本删除相关功能,将会被苹果下回。基于上面的分析,微信肯定存在热更新并且在短时间内肯定改不了,如果苹果严格执行规则的话,就是下架所有腾讯的产品。但这种情况不太可能会出现,因为腾讯的产品对iPhone太重要了,加上腾讯会主动跟苹果联系,提出折中的解决方案,所以双方会出现妥协,妥协的结果可能是给腾讯一定的整改时间,腾讯也不会完全移除所有的热更新,只是象征性的删除一些功能,再发布个更新,给苹果有个台阶下。

以上的分析,都是基于腾讯的开发者团队收到了警告邮件,不排除苹果针对这么大影响力的腾讯会做特殊处理,不直接发邮件给开发者,而是通过另外一种渠道来协商

 

键盘总结

到现在也败了那么多键盘,现在应该是写总结的时候了。

首先正确的观点是机械键盘绝对高于普通的键盘,是这毋庸置疑的。无论从哪个角度来说,如果你没试用过机械键盘,那就赶快买一个吧,无论价格在什么查的范围,你都会感到有质的提升。那再从普通的机械键盘到更贵的机械键盘,提升度就没那么大了,可以参照耳机的价位与音质的关系。

除了机械键盘,我们对于便捷性还有一定的要求,所以像现在的Surface和iPad Pro都提供了一种既可以当保护盖,又可以打字的键盘,轻便是其主要的追求。相对而言,现在做的都还不错,特别是在不能忍受不iPad自带键盘的时候,写代码与字符输入真是差实体键盘一个档次。所以才导致了我这次买微软通用键盘,轻便和可编程是我选择的最重要因素。

接下来要谈的就是我现在正常使用的虚拟键盘了,可能在不同的设备上使用体验不一样,我只是在表述在9寸iPad上的使用体验。如果不录入大量字符(如编程),那么虚拟键盘并没有想象的那么难用,并且还有蓝牙键盘所不能取代的优势:

  1. 不需要额外带一个键盘。你不会因为忘记带更多的设备而烦恼,也会减轻你装备的重量,随时可以使用
  2. 可以使用第三方键盘。我并不是说苹果自带的键盘不好,当然也不错,但是无奈我是五笔输入法爱好者,蓝牙不支持第三方输入法是一个很大的问题。对蓝牙键盘的限制也非常的多,如以基本上不能很好的输入。而虚拟键盘则想用哪个第三方输入法就用那个,不受约束
  3. 如果使用顺利的话,更少的切换输入法,可以减少其带来的时间消耗

看到了,人目前几种键盘都有,在平时办公室当然是机械键盘的天下。外出如果 需要编程iPad加蓝牙键盘则成了必要的搭配。如果只是简单的文字录入,那么虚拟键盘则是最好的解决方案

虽然蓝牙键盘是最中庸的一种解决方案,但是也显得最鸡肋。因为外出如果 需要大量编程,我肯定会找一个舒服的地方,然后找一台电脑开始我的工作,而不太会在pad上长期的工作。如果只是简单的修改,虚拟键盘完全能够胜任现在的功能。如果是不需要查找资料的博客(现在大量是这样的工作),则虚拟键盘也是飞速,所以不需要蓝牙键盘,否则还要天天带着,麻烦

Struts 获取request中inputStream的问题

问题:如果使用了Struts2,如下代码提交的http post请求会获取不到数据

    ...
    url = new URL(path);
    conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(true);
    OutputStream os = conn.getOutputStream();
    os.write(param.getBytes(charsetName));
    os.flush();
    os.close();
    input = conn.getInputStream();
    ...

Struts2中的读取代码如下:

    ...
    ServletInputStream is = request.getInputStream();
    String result = TohoursUtils.inputStream2String(is);
    super.printToHtml("result:" + result);
    ...

这样调用一直会出现空白,但使用POSTMAN调用会打出结果,什么原因?

于是使用wireshark查了一下,http请求默认使用Content-Type: application/x-www-form-urlencoded,而POSTMAN由于提交的都字符串,所以使用的是Content-Type: plain/text,于是在OutputStream write前,增加conn.setRequestProperty("Content-Type", "plain/text");就可以了

原因:是由于Struts拦截了所有的http请求,如果是x-www-form-urlencoded则要处理成Action变量;这就是说Struts框架中已经将inputStream读走了,而inputStream只能读一次,所以后面就读取不到了

为虚拟产品(服务)付钱

开始的时候我觉得不需要为虚拟产品付钱,因为自从有了网络以来我们都是这么做的,如此我便痛恨那么收钱的公司,比如腾讯,有钱可以买出差异;比如迅雷,有钱可以让下载速度更快!

我现在怀疑当初不愿意花钱在虚拟的产品上是因为我没钱,现在虽然还是没钱,但比之前的状态好了许多,于是我就尝试买一些虚拟的东西,比如迅雷会员;因为家里的移动宽带实在不给力,一个普通的视频都不能正常的播放,而直接下载的速度几乎不可用。但使用了迅雷加速以后,可以达到1.2M/S的速度!基本对于美剧,软件,普通电影都可以应付了!这样我也不需要再看优酷的广告了(据说现在已经超过1分钟了,真黑!)。第一年付了白金的会员,第二年续费的时候我就没有交钱了,因为迅雷上市了,上市就要接受各种审查,其中最重要的一点是盗版不见了,盗版加速也不支持了,那会员也就失去了其意义

一个我认为目前而言性价比非常高的是网易音乐的包月,我以前是十分反对包月的,要么一次性让我买下来,要么你免费!因为我觉得每个月都交给人钱是一件让人十分不快的事情。但现在我越来越反对自己原来的看法,不但接受付费的服务,还接受任何优质内容提供商的付费产品!网易音乐的包月其实大部分是交给了联通,但可以让我随时随地听自己想听的音乐,或者声音类节目(如罗胖子的节目,吴晓波的节目都在这上面完成的)。我算了一笔账,9块一月,就不需要占手机的空间,比加价1000块增加手机容量来的划算。100多倍的差距,100多个月,近十年!你加价1000块买个手机也是两年就扔的事吧!觉得划算

另一个是服务器,我原来一直要有自己的服务,要有一个真正属于自己的服务器,还不想托管到机房,于是我都考虑到了在自己的家里扯个专线,这样就不用给机房租金了!多么幼稚的想法!机房搬到家里来了!而现在的服务器租用,托管,VPS,云服务器产品一大堆,想什么时候升级就可以升级,还用花几万买服务器,花几千扯专线!

我非常想正常使用网络,由于GFW的存在,我没办法正常使用Google的产品,以前也总是找一些免费的方法,但效果都不太好,过不了多长时间又要再折腾一次。就算我花钱的买的VPN也同样不给力,要么IP被封,要么走全局代理!几度悲观之后才算找到了如今这种花点钱,但让你舒适的访问方式!

当然,花钱在虚拟产品上,还是有被骗的经历,下一篇就写一写这件值得记录的事情

微信开发思考备忘

最近做几个微信的项目,用到了微信的一些基本功能,对微信的公众号与开发者账号也有了一定的了解,有几点心得记录下来

微信

微信公众号

1、 微信公众号分类:订阅号,服务号,企业号
2、其中订阅号可以个人注册,其余的都只能企业或政府机构才能注册
3、订阅号所能使用的微信权限最小,不能使用微信授权,微信支付等功能
4、企业号主要注重于企业内部的交流,没有仔细研究
5、认证过的服务号可以使用微信API中的所有功能
6、个人订阅号是不能申请认证的,也就是说不可能用到微信授权与微信支付的功能

认证只支付企业,并且每年要交300块的认证费。当然为了讨好政府机构,政府部门认证是不需要交费的!

开发者账号

开发者账号分为:网站开发者,APP开发者,公众账号开发者

网站开发者和APP开发者基本都是使用微信定义的一些外部接口,如分享到微信这类的功能,并非微信内部功能,但也能调用微信支付与微信授权,整体上像是两个APP

公众账号开发者,就跟前面申请的公众号类似了,是为开发公司而准备的,可以接入其他公众号的开发而不获得客户公众号的Secrit

当然,现在微信订阅号与微信服务号都已经支持了菜单的自定义,后台的接入,可以让微信服务号或订阅号更智能,也可以使开发者有更多的开发空间

微信的偏见

以前的时候,不经过认证可以调用一些微信的分享接口和部分功能,但突然某一天,这些都被微信给封掉了,要想调用正常的API需要签名,每个页面都需要签名

微信对竞争对手是有限制措施的,一直以来就不允许淘宝的链接显示在微信浏览器里面,比如前段时间为了打压网易音乐,不允许网易音乐的分享功能。但对与自己有合作关系的百度宽容了这么多,不仅能够分享到微信,还能在列表页直接播放音乐,与自己的音乐APP同等待遇,一句话:我的地盘我说了算,我看谁不顺眼就让你从我的地盘上消失

我们可以使用微信做什么?

照片打印机

在灵山旅游的时候,看到一个微信免费打印照片的功能,就是你关注一个公众号,发一张照片给他,他就可以在你对面的机器上即时的打印出来。这在当时是一个很新颖的观点并且免费有一次体验的机会。

而今天,我们也已经拿到了这样的机器,从基本上分析来看,其实还蛮简单的,这台机器的组成有:大屏幕(估计是最贵的一个部件了),低配PC(里面安装XP系统!),HP打印机(打印照片用的),无线网卡,用来连接网络用的

以下是猜测打印的过程:

1、扫描微信公众号,加关注(这步是为了推广公众号)
2、发照片给公众号,公众号可以把照片收到后台服务器
3、输入机器编号,后台服务器通知相应的机器,并把要打印的照片传输给这台机器
4、拿到照片的机器打印照片

如果你觉得体验还不够,还可能投币还做有偿打印

但我觉得做到这一步还不够好,现在微信支付那么方便,为什么要投币呢?当然想再打印照片的时候直接调用微信的支付接口就可以完成在线付款的操作,直接就出照片好了

另外一个我觉得不太好的地方是,这台打印机打印照片实在太慢了,像在景区的时候想要打印照片是要排队的,不太适用服务于大批量用户。

微信商业平台

现在开网店没那么困难了,特别是在微信可以直接支付的情况下,给个二维码,就可以完成支付购买的整个流程,无需注册,省事,省时!