不只是 -PHP 和 -Sina

偶尔会接到来自大小来头的HR或者猎头的电话,或多或少地谈到挪个地方之类。
像下面这位同学的来信。猎头招聘短信.201511
上来就30K+15个月的开价,让人觉得还不错。当我还在思考时,又收到另外一位同学的来信,说某厂2-3年资历的人力的价格更让人觉得高啊。
猎头招聘短信.201511.2

沟通交流多是从 -PHP 和 -Sina 谈起。自我审视,其实我并不只是PHP和Sina,甚至在我的过往工作中,对PHP,对Sina的贡献都算不上多。

尽管在履历中谈到的开源软件 -gMIS 和 -GWA2 等项目都是用 -PHP 来实现的,但 -gMIS 思想源于早期在运营 -Java 平台时写的一个需求问题追踪与解决平台模块,自然后期做了脱胎换骨般地重构、扩展的改造和完善。

-GWA2 的思想也是将Java平台的一些理念(From Interface to Interaction)用PHP来实现。之所以用PHP来实现,其实就是简便与LAMP平台的普及,其实就做项目而言,PHP的动态、弱类型和非编译问题,经常让人头疼,又爱又恨。

相对于脚本语言,我更愿意用可以启用 strict mode的 -Perl 和 -JavaScript。比如Ajax类库 -GTAjax ,甚至在《中国计算机学会通讯》上写了两篇关于 JavaScript 编程的文章(-R/m2Se , -R/02Sm );硕毕论文 Dot-base62x 的实验环节和 -people-fwnews 都是用 -Perl 写的。

即便如此,我更愿意将自己看作是 Java工程师,PHP于我是可把玩的匕首,Java才是我善舞的长矛。更或者,我是服务端工程师? 也不全是,我现在的头衔是 Researcher, 或者以后是Scientist,但女儿 -Yoyo 那天来到我上班工作的地方,说我不是 Scientist,因为没有看到我有像Scientist应该有的办公室、实验室….;前几天在微信上评价PHP的帖文,她很好,可以用在所有点错小数点不用真付钱的场景,所以银行系统、电商系统都用了Java….,专业的比喻是,一架飞到天上(runtime)才知道有没有问题的飞机谁敢开?

Sina,我觉得有愧于她,入职之后试用期就领全额薪水,逐渐熟悉了全部开发环境后,因为无法忍受每天东南到西北的京城地铁一日游(4小时左右),在坚持了几个月后,选择了放弃。@易总 当时建议我在海淀买房,现在想来还真是良策。后来同在西北的狼厂和北大方厂等尚好的机会也不敢尝试了。后来因为去辉煌时代大厦的留学服务中心和公积金中心,回想,如果继续留在大Sina、在海淀落户下会怎样?

不只是 -PHP 和 -Sina,但偶尔的来函从这里谈起,可否总结成,大Sina口碑很好,或者对于未来人的建议是,良好的职业生涯,先从类似大Sina这样的知名单位做起?
相反,通过再之前公司的来邀约则较少,多数是熟人推荐,自然也多更靠谱些。

孰轻孰重,孰能辨清?

Sina存证。
sina.新浪.证件照.2011.small

GWA2:Web应用开发框架。

-gwa2

-gMIS: 通用信息管理系统。
-gmis-@people.cn-201501

上文中,以 “-” 的拼写,都是 -NatureDNS , -自然域名 。

上文中,第二幅图,腾讯邮件为何现在(Nov27)把一个月之后(Dec26)的邮件现在发给我了?

发表在 Base62x, 社会生活, 计算机技术 | 标签为 , , , , , | 留下评论

書中自有顔如玉愛自己悅己容2nd愛自己悅己容汽車老司機車載

删除确认、删除异步及删除延时,delete confirm,aysnc and delay

本文是对删除操作的一个优化的思考及实践的纪录。这里的删除也适合于更新等其他update操作。这里确认、异步和延时也适合其他非删除,但需要征询用户的情况。

首先要解决的问题是删除同步(sync),要变成删除异步(async)。当前在 -gMIS 中进行删除时,需要更新前端页面,办法时重新请求一下整个页面,这很不友好,也不节能,为了去掉一行,需要重新获取其他所有无关的数据再一次。这个可以使用异步的方法进行,就是在删除当前行时,不动其他的,在前端打个删去标记,通过 -GTAjax 给后台一个删除某行的命令即可。如果采用类似JSON的通信格式,则可以将通信成本控制到最低。

这里解决了两个问题,在服务器端减少了重新生成页面到各种计算,在通信层减少了传输信息量。在前端的影响几乎没有,已经通过JavaScript和DOM对待删除的纪录打了删除标记。在此之前 -gMIS 实现的inline edit (行内编辑),就是出于这样的考虑, 现在终于可以爱删除这个动作上也应用上了。 扩大些,这个思维适合所有前端需要局部更新,单传统做法需要更新所有页面组件的情况。

这里的异步,更多的是从前端的视角,当前端还能够看到某条被删除的纪录时,后台已经没有了。

然后要对删除确认做点革命性的创新。其实,早就对删除确认(Confirm)不满了,所谓删除确认,是在操作系统、信息管理系统中,总是会在删除之前,要求用户进行确认才继续进行。偶尔遇见用一下还能够忍受。在使用   -gMIS 管理的 -people-fwnews 时,每天会遇到很多需要删除移除和修正的内容。觉得对于已经明确需要删除的内容再进行确认是某种浪费,不可忍。需要找到另外一种更人性,或者更舒服一些的做法。

传统的删除确认:delete confirm in mac osxMac OS X的删除确认

271522_techxfdeletexf20151127xfxfPNGxWindows 10的删除确认

传统的删除确认在管理信息系统中的样子:delete confirm in -gmis
-gMIS 改造前的删除确认

通过前端或者后台生成一个确认对话框,用以对用户对提示,征询用户对资源纪录的移除动作的确认。这是常规的、靠谱地通常做法,偶尔用一下也不觉得有问题,用久了多了就会发现很费神。

但从另外一个角度说,如果不进行确认,删除之后无法进行找回,也是灾难。如何中庸地处理,有没有一种方法来进行中和?如果有新方法,应该能满足预期的三点:1)删除命令执行时,不需要用户二次交互,2)以某种方式警示用户进行删除,3)在第一步失误的情况下,可以回滚或终止。

在这种情况下,候选的方案是,变删除确(confirm)认为删除延时(delay),其步骤如下:
1. 删除命令(意愿)发出,
2. 给出提示,延迟一定时间后将实际执行删除操作,
3. 在延时期间,给出取消/终止删除操作的选项,
4. 当用户在延时倒计时期间,选择了取消/终止操作,则删除命令撤回,没有进一步地执行,
5. 当用户在延时倒计时期间,没有任何操作,则删除命令按预期进行。

这样,在删除一个对象时,用户只要交互一次即可完成最终删除,同时在发行删除有误时可以在延时期间随时取消删除行为。

对比如下两图,可以知道,传统的是阻塞模式,新的是非阻塞模式。271710_techxfdeletexf20151127xftraditionalxfxfPNGx

传统的阻塞模式的删除

271710_techxfdeletexf20151127xfinnovxfPNGx新的非阻塞模式的删除

改进后的删除延时使用实例:delete delay in -gMIS

从此不用非得再点击一次,才能继续往下。

此想法已经汇报演示给技术大家 @ownhere,评价是更人性一些的改进,演示给人民网的同学 @wangchen,评价是xxxx。

还需要一组数据来印证这种改进,在操作系统中,有多少次删除是进行了回滚?在管理信息系统,有多少次删除的确认中,用户选择了否?如果这两项的数据都表明,回滚和选择否的比例都很低很低,是否就不应该进行之前的设计,而应该应用新的删除延迟?

上文中,以 “-” 的拼写,都是 -NatureDNS , -自然域名 。

发表在 -gMIS, 编程技术, 计算机技术 | 标签为 , , | 3条评论

愛自己悅己容2nd愛自己悅己容汽車老司機車載汽車老司機

volmgrx_internal_error修复

windows 10 双硬盘组成软raid-1,在一次重启中,报蓝屏错误 volmgrx_interl_error,各种修复工作均无效。
后来搜索得到如下解决办法:

在高级修复工具命令行下,command tools,依次输入如下命令:

cmd> diskpart

cmd> list volume

cmd> select volume c

cmd> recover

然后再重启,尝试在启动菜单里选择第一个/第二个引导程序, windows 10 / windows 10 secondary plex….

然后就可以进入系统,重新进行磁盘阵列 raid-1 的修复。

发表在 计算机技术 | 标签为 , | 留下评论

中国国民党革委会中国国民党Apache Softwares亮月亮科技

webget发布

webget.logo.201510

webget,-webget 是一个http页面请求及返回的命令行调试工具。

webget 本质是将在命令行下将使用telnet来测试http传输协议或接口的的一系列命令组合一起发送,并将返回内容呈现出来。

早期工作中,还没有Chrome浏览器 ,MSIE还没有开发者模式,要调试某个http的通信情况,在命令行下使用telnet输入多个命令,如此用多了,就想到可以组合起来成一个命令行集,然后用perl实现了这个命令行集。

这么用了几年后来又继续改进,增加了对http/1.1 和 https的支持,对chunked size的支持, 对自定义User-Agent的支持等等。

目前是这个样子,仍然用起来顺手。

webget的发布页面在 -webget .

 

发表在 编程技术, 计算机技术 | 标签为 | 留下评论

愛自己悅己容汽車老司機車載汽車老司機好奇婴幼儿

关于带有连字符hyphen名称注册自然域名NatureDNS

naturedns-logo-201406

连字符hyphen (-)选作自然域名的标记符(起始符号和层级间隔符号),但当实体对象的名称中有连字符时,该如何操作?尤其在以空格作为词间区分的语言中,如英语。

-university-derby
-derby-university

-grand-hotel-beijing
-grand-beijing-hotel
-beijing-hotel-grand
-beijing-grand-hotel
-hotel-grand-beijing

哪个才是合适的,或者每一个都行?或者每一个都不行?

通过这种二级域名的形式来兼容带有连字符的名称,那么注册了 -university 的人,不将 -university-derby 给 the University of Derby 怎么办? 或者注册了 -Derby 顶级域名的人不将 -derby-university 给 the University of Derby 怎么办?

一种思考和规划是,-derby 这样的顶级域名,当属于其行政主管机关,或者由其授权给运营者,然后负责 -derby 下的各种域名,然后分给当地大学的,就是 -derby-university .

类似地, -university 则应该在名义上归属于 大学联合会的组织,由其运营或者委托其他机构运营,该受托机构负责分配 -university-derby 给大学 the University of Derby .

同样地,-beijing 这个顶级域名应该属于当地行政机构, -hotel 应该属于酒店行业协会,然后再由这些机构负责分配子域名 -beijing-hotel  或者 -hotel-beijing 不同的饭店、酒家.

从语义上来说,-北京-饭店 (-北京饭店), -beijing-hotel  和 -饭店-北京 , -hotel-beijing 似乎略微有些不同,但在用作实体名称时,应该不会有太大的歧义,会存在一个实体的名称,颠倒顺序后,变成另外一个实体吗? 可能会有,或应该是个别现象。

发表在 -NatureDNS/-自然域名 | 标签为 , , | 留下评论

中国国民党革委会中国国民党Apache Softwares亮月亮科技

一种debug方法的实现

据说程序的开发成本占20%,维护成本占80%,而维护的主要方式之一依靠的是log输出。

输出log有很多方式,各种开发语言都有不同的设施来满足这一功能。

在PHP中,可以这么实现一个debug功能。其主要功能是输出什么时间在什么位置(程序名、函数名)输出了标记为xxx的某个对象$obj的打印形式的描述信息。

function debug($obj, $tag=null, $output=null);
# $obj 是待输出和跟踪的对象,可能是string,也可能是array、hash等不同的数据结构;
# $tag 是用于标记待输出对象的字符串,一般用于过滤相关输出内容;默认 $tag 为null;
# $output 类似loglevel, 但又不同,通常 $output==null, 表示在后天输出相关日志,与 error_log 函数类似; $output==1时,在后台和前端同事输出相关测试信息;$output==2时,根据PHP中的backtrace信息,输出更多内容。
# 调用例子:
# debug($aHash); # 在后台输出一个hash变量的内容;使用 -GWA2 的 WebApp->toString 方法或者 -PHP 内置的 serialize ;
# debug($aHash, ‘aHash’);  # 在输出中增加识别标记字符 ‘aHash’;
# debug($aHash, ‘aHash’, 2); # 同时在前端和后台输出相关内容,然后附带 -PHP 的backtrace信息.

源码 source:

# write log in a simple approach
# by wadelau@ufqi.com, Sat Oct 17 17:38:26 CST 2015
# e.g.
# debug($user);
# debug($user, ‘userinfo’); # with tag ‘userinfo’
# debug($user, ‘userinfo’, 1); # with tag ‘userinfo’ and in backend and frontend
function debug($obj, $tag=”, $output=null){
$caller = debug_backtrace();
if(is_array($obj)){
if(isset($user)){
$s .= $user->toString($obj);
}
else{
$s .= serialize($obj);
}
}
else{
$s .= $obj;
}

if($tag != ”){
$s = ” $tag:[$s]”;
}
$callidx = count($caller) – 2;
$s .= ‘ func:[‘.$caller[$callidx][‘function’].’] file:[‘.$caller[$callidx][‘file’].’]’;

if($output != null){
if($output == 0){ # in backend only
error_log($s);
}
else if($output == 1){ # in backend and frontend
error_log($s);
print $s;
}
else if($output == 2){ # in backend and frontend with backtrace
$s .= ” backtrace:[“.serialize($caller).”]”;
error_log($s);
print $s;
}
}
else{
error_log($s); # default mode
}

}

其他版本的语言也可参考此行为,自行实现。这一功能已经更新到新版的 -gMIS 和 -GWA2 的源码中.

 

发表在 -gMIS, -GWA2, 服务器运维, 编程技术, 计算机技术 | 标签为 , , , | 留下评论

Apache Softwares亮月亮科技OpenAI ChatGPTPdf Drive