Day 3521 无痕搬家(2)以及域名重定向

又给博客搬了个家,由于我仍然很穷,加之并没有需求和能力去管理VPS,所以仍然用简单的虚拟主机。

本次搬到衡天主机(hengtian.cc)的香港主机,速度似乎还不错。

前年的时候用的戈戈主机(gegehost.com),一开始用香港主机,结果每个月大概有2-3天是不能顺利联通的,后来又换日本主机,结果每天十次里有5次是不顺畅的。

我的博客上没有违规的东西,也并不怀疑GegeHost的服务质量,只能说镇上的网络环境太复杂,抛开某个很高很宽的东西,我所在的环境就有一个配置得很烂的自动流量切换出口,在同一次登录中会切换IP,结果会被对端判断为IP地址发生变化,要求重新登录,以至于我要上主机的控制面板需要科学上网,ft。

希望这次能用得久一些。


发完一小时后补充:

因为手下还有另一个娱乐性质的域名(kunjinkao.net),原来用GegeHost的时候,主机控制面板是cPanel,直接设置域名重定向就可以了,现在换到衡天这边,控制面板是DirectAdmin,找不到对应的选项,问客服说用控制面板里的「别名指向」,但实际上没有这一项(可能是虚拟主机不支持,VPS才支持?),后来干脆说DA实现不了,我是不太相信的。

最后以手写.htaccess转向成功,但不是很稳定,凑合着吧。

以下方法来自:http://wiki.dreamhost.com/Transparently_redirect_your_root_directory_to_a_subdirectory

RewriteEngine on
RewriteBase /

#以下kunjinkao.net是要跳转的目标目录,不是域名本身
RewriteCond %{REQUEST_URI} !^/kunjinkao.net/

# Rewrites all URLS [Replace "domain" with the actual domain, without the TLD (.com, .net, .biz, etc)]
# 重写所有URL(将domain(已替换为kunjinkao)替换成不带TLD(.com、.net之类的后缀)的域名本体
RewriteCond %{HTTP_HOST} ^(www\.)?kunjinkao\.

# Rewrite all those to insert /folder
# 将所有URL重写到/
RewriteRule ^(.*)$ /kunjinkao.net/$1 [L]

Day 3504 Chrome 45 与阿里旺旺

自从2014年1月的Chrome 29起,Google就逐步放弃了对NPAPI插件的支持,很多网站都受到了影响。

最近几天总感觉Chrome的“This site is using (name) plugin which will soon be unsupported”提示不见了,直到去了淘宝点击客服时,居然提示我没有安装阿里旺旺,看了一下浏览器版本自动升级到了Chrome 45,查了一下新闻,Chrome 45完全取消了对NPAPI Plugin的支持,并且也不再像以前的版本一样可以通过about:flags临时启用。

可惜国内的厂商们有各种壳浏览器和IE帮忙,根本不吃这一套,我就不吐槽工行要求Chrome版本至今都是21.0-24.9了,就更不吐槽某些银行根本就从未开发过ActiveX以外的插件了。

取消NPAPI支持后,在各种厂商开发官方新版插件前,只能用各种各样的workaround来继续使用这些服务,如使用各种辅助插件、干脆用IE专门打开这些网站等。

至于阿里旺旺,有一个4年前开发的插件至今还很好用:阿里旺旺支持。但是这个插件因为一些原因(貌似是Chrome清理多功能插件)被从Chrome Web Store下架了,好在还有第三方插件商店予以保留,在这里留了一个备份,开启Developer Mode然后拖进去安装就可以了。

安装后可能需要重启一下浏览器,Chrome下点击客服图标启动旺旺的功能就回来了,挺好用的,感谢作者yissyoo。

Day 3495 折腾蓝牙适配器驱动

新买了一个USB蓝牙适配器,实在是受够了之前买的便宜货无法跟BlueSoleil破解版好好协同工作了,于是买了个号称是Broadcom正版芯片的。

结果死活装不上驱动,由于系统是新装的,所以以为是硬件有问题,再拿到其它机器上,安装和使用都一切正常。

被折腾了三天,期间设备管理器给出的最多的提示是:

inst_bth_drv_failed

在安装该设备时出现错误:
这个设备的驱动程序安装文件丢失一个需要的项。这可能是由于 INF 是为 Windows 95 或更新版写的。请与您的硬件供应商联系。

仔细检查过驱动的版本,确定是Windows 7 x64的,找了很多解决方案都不行。

折腾到第三天,看到有个类似的蓝牙设备不识别的问题,里面提到\Windows\inf\key.inf损毁导致的问题,恢复之后就安装成功了,想起之前也有个类似的帖子提到bth.inf,但是给出的解决方法是删掉bth.inf和bth.pnf,然后重启让系统自行更新这两个文件,当时进去找的时候就只看到PNF没看到INF,但没想到缺了并不会自动补回来。

找到bth.inf放进去,重新刷新硬件,立刻就安装成功了。

虽然我还是想不通为什么新装的系统会缺少一个基础文件……

Day 3489 在安装.Net Framework 4.0后,Windows XP启动时网络连接图标及相关组件启动缓慢

问题:

Windows XP系统启动后,(如果设置了本地连接/其它任何网络连接在任务栏上显示图标)网络连接图标半天也不出现,此时右键单击网上邻居,选择「属性」也没有反应,需要最短等待大约30秒(较新的机器)至10分钟(比较老的机器)才能正常使用网络功能。此时,如果使用「带网络连接的安全模式」启动,则不存在这个问题。

原因:

通常在安装了.Net Framework 4.0的Windows XP中出现,原因是安装该运行时后,系统会增加一个名为「Microsoft .NET Framework NGEN v4.0.30319_X86」的服务,该服务用于在系统启动时用最长10分钟的时间将高优先级的.Net程序编译为本机映像,以提高运行效率,但在较慢的机器上会严重拖慢启动速度(.Net的运行效率问题)。

解决:

  1. 直接禁用服务:启动服务管理器(开始-运行-services.msc,回车),找到「Microsoft .NET Framework NGEN v4.0.30319_X86」并将其启动方式修改为「手动」。
  2. 提前让NGEN干完活:以下方法来自此帖子,因为不如直接禁用服务方便,请有需要者自行翻译:

1) Run cmd.exe from Start > Run
2) Type cd\
3) Type cd Windows\Microsoft.NET\Framework\v2.0.50727
4) Type NGEN executequeueditems and press Enter
5) It will take about 10minutes depending upon system speed. After the process is complete, the following prompt will appear in the command prompt
C:\Windows\Microsoft.NET\Framework\v2.0.50727>
6) Type exit to close the command prompt.
After performing these steps, your computer will boot up at usual speed.

Day 3479 看似好用的PHP字母循环

最近给单位写了一个内网用的工资条查询页面,结构很简单:财务人员将从集团财务系统中导出的Excel表格上传,处理后为每位员工建立账户(当然已存在的不会重建,重名的也有处理方案,因为和主题无关不详细展开),建立对应年月数据表并填充数据,员工使用账号密码登录后可查看自己的「电子工资条」。做这个东西的初衷据说是财务不愿意打印纸质工资条了,ft。

整套程序中其他部分都是基本的PHP+MySQL流程,唯独如何对Excel表处理是个难点,必须要感谢PHPExcel,使得读取Excel表格不再是最困难的部分。在编写表格读取代码的过程中,还发现了PHP一个有趣的特性:

  在处理字符变量的算数运算时,PHP 沿袭了 Perl 的习惯,而非 C 的。例如,在 Perl 中 $a = ‘Z’; $a++; 将把 $a 变成’AA’,而在 C 中,a = ‘Z’; a++; 将把 a 变成 ‘[‘(’Z’ 的 ASCII 值是 90,'[‘ 的 ASCII 值是 91)。注意字符变量只能递增,不能递减,并且只支持纯字母(a-z 和 A-Z)。递增/递减其他字符变量则无效,原字符串没有变化。

——PHP文档《递增/递减运算符》

也就是说,如果要以列为单位递增读取表格中的内容,无需手工编写代码处理列名称(Excel的列名称是A、B、C……AA、AB、AC……XFD之类,不同版本的Excel末列名称不同,但都是1-3个字母的顺序组合),只需要使用类似下面的代码即可:

……
for($col = 'A'; $col < 'ZZ'; $col++) {
$phpExcel_Sheet -> getCell($col.$row);
}
……

一番努力后,程序已可以正确处理财务部早先给出的样表,但是由于本单位的特殊情况,还有另一套工资表要处理,这个版本的工资表格式上与先前的样表无异,只是工资项目比较多,即:先前的样表最大到Z列,而另一版本的最大列为AW。

由于PHP没有简便的方式将关联数组按索引进行读取(话说为啥不支持?),程序中拼合最终入库的数据时是这样处理的:

……
$lastcol = array_keys($xls_itemname)[sizeof($gz_itemname)-1]; //获取末列Key
foreach($xls_data as $data_row) {
for($col = 'E'; $col < $lastcol; $col++) {
$json_array[$xls_itemname[$col]] = $data_row[$col]; //为生成类似 {'基本工资':'800.00', '岗位薪酬':'1000.00',...}这样的JSON做准备
}
$json = json_encode($json_array);
……
}
……

结果,以上代码在处理第一批样表(末列为Z)时工作良好;但到了第二批样表,上传后直接运行超时,将debug信息打印出来,发现虽然$lastcol的值正确取到了AW,但程序在处理到AW列后并未停止,一路飙到了不知道哪里去,直到达到PHP的最大运行时间被掐断为止。

调试了很久都不知所措,最后只好用另一种方式进行临时补救:

……
//不再取$lastcol
foreach($xls_data as $data_row) {
for($col = 'E'; $col < 'ZZ'; $col++) {
if(isset($xls_itemname[$col]) == FALSE) break; //当取到未定义的列名时跳出
……
}
}
……

这种方法的运行效率想必比较低,但是至少可以正常运行。

猜测与PHP特殊的字母递增运算的实现有关系,但是我还是不知道为什么。

Day 3469 三星840 EVO与Windows 7 x64配合使用时无法使计算机进入睡眠模式的问题

当三星840 EVO SSD(120G,估计与容量没关系)与Windows 7 x64配合使用时,在极其罕见的情况下,会导致选择电源菜单下的「睡眠」后,未进入睡眠状态而立即返回登录界面,即屏幕只黑一下然后立刻就回到登录界面。

解决方法:将页面文件设置为「无页面文件」,重启后再重新建立页面文件即可。

上次出现这个问题是今年3月,五个月后的今天又来一遍,因为之前用机械硬盘时从未见过这个问题,所以怀疑与SSD有关,但也不敢确定。

2015-09-03:又来了一遍……最近准备加内存,干脆不设页面文件了。

Day 3414 用Arduino制作RFID钥匙链

rfid_keychain

很多人对管理密码感到由衷的麻烦,在生物特征验证尚未完全普及的今天(好像迄今为止做的最好、最为人所知的就是专属于iPhone 5S起的Touch ID),假设服务商没有(被迫)采取明文存储密码的2B做法,那么密码太短可能很容易被猜解出来,而密码太长又很容易记不住,而且在输入时也很麻烦。

因此有许多基于软件的密码管理器出现了(如1Password),只要记住一个主密码,剩下的密码都由其负责管理,并且很多优秀的产品已经出了很多平台的版本,可以跨平台进行使用,然而这种方式仍然有一点局限性:

  1. 在程序无法运行的环境下无法使用,例如:使用TrueCrypt加密的系统分区,在开机时要求输入密码;
  2. 主密码是拥有一切的前提,换句话说,如果忘记了主密码又没有备份,那么所有的密码可能都要丢失掉;
  3. 很多人有对商业软件与生俱来的不信任,在米国的棱镜项目被揭露后尤其如此。

我一直觉得很奇怪,为什么没有一种硬件,将密码离线存储在诸如IC卡之类的外部存储设备上,在需要的时候只要读卡,就能能模拟真实的键盘将密码输入。经过一番搜索,发现这种东西可能早就有了,只是没有供个人使用的商业化产品出现,其中的一个例子就是Mooltipass。

Mooltipass是一款设计精良的硬件密码管理器,除了实现以上所述的功能外,还能在适合的环境下与插件配合进行自动登录、帮助用户生成强密码(并存储下来供下次使用)。当时看到这款产品时,它还处在早期研发阶段,后来上了Indiegogo众筹。我没有双币卡,而且看到众筹也晚了些,$80的价格对我来说也有点贵(虽然说真的,值这个价钱),并且关于International Shipping说得好像也不是很清楚,所以就这么错过去了。

后来我听说了Arduino这个电子积木,其使用一种近似C的语言进行编程,并且通过一些方式可以模拟USB键盘。虽然我不会写C,但懂一点C#,两者有共通之处,所以二话没说就买了一堆零件开始尝试。

在拖延症和急功近利心理的共同作用下,一共走了以下几个弯路:

  1. 买错型号:设计上我想让成品既能读卡,又能写卡,但买了一圈之后我才知道能同时模拟USB键盘并与SPI总线上的RFID读卡模块RC-522通讯的型号是Arduino Leonardo,等我终于意识到时,已经额外买了Uno和Nano了。
  2. 多买了许多零件:跟以上理由相同,一开始以为需要用V-USB去模拟USB键盘,所以电阻、稳压二极管等等买了一大堆,最后才买到真正需要的东西。

虽然造成了许多不必要的支出,但最终这个东西还是做出来了,只有两个基本功能:

  1. 读卡,并将解密后的数据模拟键盘输入。
  2. 写卡,将加密后的明文(最长16位)存储到RFID标签中。

真正用到的元器件成本如下:

  1. Arduino Leonardo R3(¥30)
  2. 3×4矩阵键盘(¥5)
  3. RFID读卡模块RC522(含2张S50卡)(¥18)
  4. 无源蜂鸣器1枚(¥4)
  5. 公对母杜邦线一堆(¥5)
  6. 10K单联电位器(¥0.5)
  7. 8.5×5.5cm面包板(¥4)
  8. 1602 蓝色背光LCD(¥8)

合计¥74.50元——这么一算好像也不便宜,但是如果从一开始就核算成本,以自己的惰性怕是永远也做不出来。

不过以后输入16位长的密码简单些了。

源码和接线方式就算了,写的太烂。

2015-08-16更新:由于我手太笨,一直学不会焊接,所以这东西的最终形态是:

封装形式为PBC,即Paper Box Container

Day 3367 迅雷离线的坑

偶然想起手机上的Wikipedia离线资料还是2013年的,于是去Kiwix那边找更新的下载包,zh-cn语言带图版要7.2G,直接下载只有10KB/s,BT挂不动,结果把种子往迅雷离线里一拖发现已经离线好了,于是就下吧。

几个小时后文件下载完毕了,双击打开:

kiwix_package_1

于是换用7-zip,扫描了一阵子之后:

kiwix_package_2

六个多小时啊就这么白瞎了?于是想看看是不是扩展名问题,结果有了意外的发现:

kiwix_package_3

……迅雷你用六个小时给我下了9.5个G的0!?

怀疑离线服务器上的文件就是个dummy……鄙视。

Day 3365 PsExec和UAC

直接说方法:要使用PsExec在启用了UAC的远程系统上运行程序,需要这样做:

RunAs /user:domain\user “psexec \\remote-computer-name -h executable-file”

而不能这样做:

psexec \\remote-computer-name -u domain\user -h executable-file

详细原因见此:http://www.riosec.com/articles/Windows-UAC-PsExec

顺便把内容复制过来留给自己看:

Recently I ran across a scenario where the Microsoft Sysinternals tool PsExec would not work against a Windows 7 domain-joined computer. The command was failing with an “Access Denied” error. On Vista and newer, User Access Control (UAC) issues a restricted token to processes, but PsExec requires an elevated token. On the local system’s Microsoft-Windows-UAC\Operational log the following event appeared: The process failed to handle ERROR_ELEVATION_REQUIRED during the creation of a child process.

Further research found that newer versions of PsExec have a command argument (-h) to specify elevated rights.

However, even with specifying -h PsExec was still failing with “Access Denied”. After some digging, I discovered that it’s all about how the authentication credentials are presented to the remote system. UAC has an exception for remote connections using domain credentials, so that machines can still be administrated remotely (otherwise, there would be no way to respond to UAC prompts). When connecting remotely and authenticating with NTLM using a domain account, Windows 7 issues an elevated token.

With PsExec when you specify the username on the command line it causes an explicit (local) authentication to occur on the remote system, and Windows issues a limited rights token, causing PsExec to fail. However, if you authenticate as the target user on the local computer (using RunAs or logging in directly), and then use PsExec with implicit (NTLM) authentication to the remote computer, the process gets the elevated token on the remote system and it works.

This behavior becomes more obvious when using telnet. The built-in Windows telnet client automatically authenticates using NTLM (top window in the screen shot below), and the user is given an elevated token. However, logging in with the same user from a third-party telnet client results in a restricted token (bottom window).

Day 3353 Mac Pro 2007全新安装OS X Mavericks

因为一些事情,从其它部门弄来一台Mac Pro 1,1 2007年款的台式机,而因为某些原因需要给这台跑着OS X 10.4 “Tiger”机器升级到10.9 Mavericks。由于对OS X下操作的不熟悉,以及苹果对直接从Mac App Store中升级至新版系统时所做的限制,足足折腾了两天才达到目的。

网上有教程,但都是英文的,我不确定那些高大上的中文论坛里是否有教程,不过估计搜不到是有付费墙之类的,所以还是记录一下自己折腾的过程好了: 继续阅读 “Day 3353 Mac Pro 2007全新安装OS X Mavericks”