mac输入法切换快捷键用不了

新买的mac各种不好用不会用,拼音输入法居然不能和英文通过快捷键自由切换。网上各种搜也没有找到我想要的问题。因为大家都说按command+space就可以切换,但是我的却不行。

后来在System Preference > Keyboard中发现,拼音输入法的切换按钮上ctrl+space,但是实际上ctrl+space是打开的spotlight,mac系统初始化做得真够烂的,应该是快捷键冲突了。

于是我重置了快捷键,发现spotlight变成command+space了,输入法变成了ctrl+space,试了试,spotlight可以用,但是输入法不能切换。晕,mac默认的快捷键都不能正常工作。

于是我尝试把spotlight和输入法的快捷键换一下,勾选了输入法切换快捷键,修改快捷键为command+space,然后勾选spotlight快捷键修改成ctrl+space,经测试,都ok了。

总结下:

spotlight快捷键这样设置:ctrl+space

输入法快捷键这样设置:command+space

我的系统版本:10.11.5 (15F34)

 

macbook-pro安装adobe-flash-player后仍然不能看视频

想用刚买的mac pro看看优酷,结果提示需要安装flash player插件,然后我按照提示安装了adobe flash player,重启了safari,结果还是看不了视频,仍然提示未安装flash player。重启了机器后仍然是不行。

各种百度google搜索都没有找到办法。后来自己摸索,整好久才发现,原来默认插件安装是PPAPI Plug-in,它不是针对safari浏览器的,而是针对opera和chrome的。而NPAPI Plug-in这个才是真对safari、firefox、遨游的。要检查你安装的flash player插件是否支持safari可以这样看:系统偏好(System Preference)> Flash Player > Updates里面,效果如下:

Flash Play设置
Flash Play设置

如图所示,如果你的两个插件中NPAPI插件为安装,那么你就需要安装这个插件,安装方法如下:

首先几点上图中的install now,然后会自动打开一个adobe的网站,

安装flash player
安装flash player

 

不要点install now,因为那样会再次安装PPAPI插件,而这个插件对safari没用。应该点击左边的一个链接“Need Flash Player for a different computer”,点了以后看到的效果应该是这样的:

安装支持safari和遨游的flash player
安装支持safari和遨游的flash player

如上图的方式选择NPAPI,然后点击Downloading Now,后续按照提示一步步进行即可,然后重启浏览器就可以看视频了。

说实话,mac系统真心不如windows来得简单直接,不知道是转型mac不习惯,还是真的不好用~~

 

fastjson解析大文件时抛出java.lang.ArrayIndexOutOfBoundsException: -1

最近发现偶尔出现fastjson解析大文件时抛出java.lang.ArrayIndexOutOfBoundsException: -1异常。可以我是按照官方的中的实例代码来写的,如下的代码:

所以非常不解,我自己单独写代码解析json文件又没有问题,在应用跑了一段时间后,就突然出现这个问题。由于fastjson的代码没有深入阅读,而且异常还不是每次都能碰到,因此没有查到直接原因。但同事发现换个api来解析就不抛出异常了,因此在这里记录下,下次朋友类似的情况,也可以按照种方式来解决。代码这样改:

可能这种改法效率没有上面那个好,但是这个确实没有抛出异常了,至少在可用性方面得到保证。如果你也碰到这种情况,也可以尝试这样修改你代码。

linux管理多个ssh公钥密钥

很多网上免ssh密码使用git的命令都没有考虑到多个公钥密钥的情况,这里搜集并整理一下管理多个ssh公钥密钥的步骤。

首先生成公钥和密钥,默认情况公钥的文件名比密钥末尾多.pub,下面以管理coding.net和github.com两个git仓库的ssh公钥密钥为例(如果是在windows下,请安装git客户端然后使用git bash来键入下面的命令;如果是在linux下,则直接使用终端即可):

这个命令直接通过-f参数指定了密钥和公钥的文件名,比如-f ~/.ssh/id_rsa.coding,其生产的密钥为~/.ssh/id_rsa.coding,公钥为~/.ssh/id_rsa.coding.pub,生成好了公钥和密钥后,把公钥文件中的内容追加到~/.ssh/authorized_keys文件的末尾,同理github的公钥密钥的生成方式类似。注意追加前authorized_keys文件的末尾需要有个换行符。追加后的效果可能是这样的:

同时把这个公钥添加到git仓库ssh key管理的地方,比如github是在Settings–>SSH Keys里面

当有多个ssh密钥需要管理时,一定要修改config文件的权限,否则你配置后仍然时无效的

~/.ssh/config文件的内容为:

其中User后面的值为你访问的git ssh地址的@之前的部分,比如:git@github.com:dongritengfei/beego.git的@前面是git,所以User后面的值为git。Host就是你的git仓库的域名或者IP。

然后是用这个命令来测试是否配置ok

如果你看到这个就说明你ok了,如果你看到下面的样子:

那你需要执行:

然后再试试应该就可以了。

其他

上面的说的SSH的情况,如果你使用的HTTPS的方式clone代码的话,需要免登就需要这样:http://www.akmumu.com/2015/06/02/360.html

input不能输入空格解决方法

最近发现页面中一个有suggest功能的input不能输入空格(这个input的suggest功能用到了bootstrap的dropdown功能),但是可以输入其他的字符,非常奇怪,我自己的js代码里面根本没有对输入做过任何的处理,而且输入空格时文本框中的内容没有任何变化。

只能猜测可能是其他的js中对所有的dropdown功能的input都做了按键监听和屏蔽。

无耐之下,用排除法,一个个的把页面中引入的js移除,查看输入框能否输入空格,经测试发现当删除了bootstrap的js引入后,input就可以输入空格了,说明问题在bootstrap.js里面,所以进到源码里面看了看,发现版本是v3.3.0,因此试试最新的版本v3.3.2,替换最新的版本后,恢复正常了。然后用svn的diff功能看了下两个版本源码中的区别,发现v3.3.2中修复了v3.3.0中的这个bug,增加了一个判断条件把文本框类型的控件过滤掉了。如下图:

bootstrap的bug:input不能输入空格
bootstrap的bug:input不能输入空格

参考ASCII表,空格的ascii码是32,还有三个按键也被屏蔽了,分别是:&、(、escape键。v3.3.0中的代码可以看到,如果是空格、&、(、escape键这4个按键中的任何一个,则执行:

e.preventDefault()
e.stopPropagation()

也就是说如果按的是上面的4个按键中的任何一个,就阻止这个事件的默认行为,所以文本框中的内容没有变化。v3.3.2版本中增加了一个控件tagName的判断,如果是input或者textarea就不做上面的阻止行为。这样正好解决了问题。

结论是:bootstrap v3.3.0里面的bug,bootstrap升级到最新的3.3.2就可以了。

skype在红米note上打不出电话

MIUI6
MUI6

前不久放出来的小米note没有抢到,于是干脆买了个红米note增强版,用起来还不错,所以软件都正常,但是唯独skype在红米上打不出电话,很奇怪,百度了一下搜集了一些意见,有人说要下载官方版本的skype,不要下载小米应用商店的,于是尝试了一下,发现确实官网的可以电话,看来如果下次再碰到应用超市的不能正常使用,就直接用浏览器进入官网直接下载安装,或者百度,或者在小米论坛里看看帖子。

java.lang.UnsupportedOperationException at javax.crypto.CipherSpi.engineGetKeySize

Unlimited Strength Java(TM) Cryptography Extension (JCE)
Unlimited Strength Java(TM) Cryptography
Extension (JCE)

java.lang.UnsupportedOperationException at javax.crypto.CipherSpi.engineGetKeySize的原因是默认的jdk的key长度有128bit限制,所以需要把这个长度限制放宽。官方有个无长度限制版的JCE jar包,下载地址:

jdk6:http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

jdk7:http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

解压后,将两个jar包(local_policy.jar、US_export_policy.jar)放在如下的目录下:

<java-home>/lib/security              [Unix]
<java-home>/jre/lib/security        [Unix]

<java-home>\lib\security              [Win32]
<java-home>\jre\lib\security        [Win32]

Reference

http://docs.oracle.com/javase/1.5.0/docs/guide/security/jce/JCERefGuide.html#Introduction

local_policy.jar and US_export_policy.jar different with Unlimited Strength Vs Default.

 

https://wprp.zemanta.com/static/js/loader.js影响wordpress页面加载速度

最近发现我的wordpress博客访问速度又变慢了,在chrome下F12打开network一看,发现有这样一个请求无法连接:https://wprp.zemanta.com/static/js/loader.js?version=3.5.3。

于是用老方法,notepad++查找wordpress所有文件的代码(相关的方法请看:WordPress搭建的博客访问变慢的解决方案),发现public_html\wp-content\plugins\wordpress-23-related-posts-plugin\config.php文件中有两处出现了https://wprp.zemanta.com/static/(除了cache的文件以外)。

这样就清晰了,原来是WordPress Related Posts插件导致的,这个插件用于自动生成文章末尾的相关文章,这个插件是外国人开发的,所以引入了被墙的js。而现在国内支持各种相关链接的有很多:比如:无觅推荐、百度推荐、友荐等,我网站上已经使用百度推荐,于是可以直接删掉WordPress Related Posts插件,还顺带提升下性能。当然博客的内链少了一些,因为WordPress Related Posts插件是同步展示推荐的相关文章的,而百度推荐等其他的推荐都是js异步的。

现在博客速度恢复正常。

ipad4屏幕碎了,自己淘了个屏自己换

ipad4从桌上掉下了,正好一个角着地,屏幕碎了,而且受力的角变形了,有点翘起来。原打算找苹果的官方维修点修理的,结果打电话一问,说不能换屏幕,只能整机换,整机换需要1900元。请问这是维修么?到底会不会修屏幕我都怀疑了。

这是我见过的最烂的售后,这帮维修的为了赚钱,换屏幕这种费力不赚钱的活,他们不干,只做大单。

没想过找乱七八糟的维修点修理,因为那里修复估计也挺贵的。于是尝试了下在淘宝上看看有没有维修ipad屏幕的,一搜才发现修屏幕是淘宝上一个很正常的行业,而且价格出奇的便宜,只要100元左右。然后找了个销量最高的店,进去一看,发现还可以自己买回屏幕,自己DIY。一想要是自己把ipad拿去给别人修不太放心,要是别人给你更换了次品的零件,那就不好玩了。还是自己DIY比较靠谱,然后看了下更换屏幕的视频,似乎不难。于是自己买了个屏幕——127元,包含操作手册和一些必要的小工具。(尼玛,才过几天就降到110元了,如果也有想自己DIY的可以也来这家店买:https://new9.taobao.com/?spm=2013.1.1000126.3.0hDhCv)。

屏幕到了以后,卖家让我看网上的视频,按照视频里面的方式来操作,当然我顺便搜了一下其他的修理ipad4的视频,比如这个:国内最详细iPad4更换触摸屏教程,里面讲的很清晰。

在维修之前需要了解一点ipad里面的基本构造:

  1. ipad屏幕这个概念其实包含两个内容:触摸屏和显示屏。触摸屏就是我们摸到的屏幕,专门用来感受触摸的;显示屏是在触摸屏下面的,专门用来控制显示的。显示屏与触摸屏不是贴合的,而是分离的;两个屏分别有排线与主板相连。也就是说层次关系是最上面是触摸屏,其实是显示屏,再其次是主板
  2. 其实触摸屏也有两层,一层是硬度较高的玻璃,这才是我们真正每天在摸的屏,底下一层是用来感应触摸的屏,这一层是有排线的,需要和主板连接,用来专门控制触摸的,这两层屏是贴合在一起的整体。我从淘宝买来的就是整个触摸屏(另外还包含了home键和对应的排线),往往我们屏幕碎了都是外面的那层碎掉了,底下那层真正管理触摸的没有碎,因为我们屏幕碎了,仍然可以触摸使用;
  3. 尽管触摸屏在显示屏上面,但是触摸屏的排线却在显示屏的下面,所以在拆机时需要在掀开了触摸屏后,要先卸下显示屏,然后再卸下触摸屏

当然视频再详细,也需要注意一些细节的易错的点,我整理了一下:

  1. home键的右侧,的4cm距离的范围不要敲,那里有蓝牙天线,撬不好,就把蓝牙搞坏了,建议留到最后,热风吹一下就可以轻松的拿下来了。
  2. 拆机很关键,也最耗时,要想快一点,就得用吹风机多吹一下,核心是要从屏幕没坏的一边开始。
  3. 撬屏幕边缘的时候,不要把工具深得太靠里面了,基本不要超过白色的边框的宽度。因为超过后,里面就是显示屏了,要是划伤了显示屏,就不好玩了
  4. 把触摸屏的边缘都撬好以后,注意掀开屏幕的方位,让home键靠近自己,摄像头远离自己,然后把屏幕像翻书一样,从右往左掀开,注意动作要轻,如果遇到阻力一定要看看怎么回事,在home键的左边是触摸屏的排序位置,掀开到左边放下,然后用小启子把显示屏的4个螺丝拧下,然后按照和触摸屏一样的方式,把显示屏从右往左掀开,显示屏的排线也在左边,然后先把显示屏的排线取下,再把触摸屏的排线取下。安装的过程和拆的过程相反。
  5. 注意取下排线的时候,最好记住排线的那一面是朝上的,以免到时候安装的时候不记得了,一个简单的办法是在拆之前,给排线拍张照片,回头安装时可以作为参考
  6. 在安装屏幕之前一定要注意把摔碎ipad屏幕的着力点清理一下,让ipad的边缘平整,可以用刀慢慢的一层层的割掉不平整的地方,还可以借助钳子。这个过程中,需要注意最好不要把密封圈弄坏了,可以把密封圈揭开一段,但是不要弄断了,否则自己粘密封圈也挺麻烦的。
  7. 把机器倒过来摇一摇,让一些玻璃碎片调出来,然后用吹风机把整个机器内部吹一下,尽量保证里面干净。
  8. 把新的触摸屏和显示的排线接上后,不用要螺丝,不要撕掉保护膜,先测试一下,如果你开机发现屏幕不亮,那么可以尝试按住home键和开机键保持10秒,强制重启。如果还是不行,可能你的排线没有插入到位。需要对照拆机时拍下的照片对比下,是哪里没有插好。测试没有问题了,再把显示屏装上然后擦干净,再安装好触摸屏即可。

下面是一些我安装过程中的照片:

ipad屏幕更换——用吹风机加热屏幕边缘
ipad屏幕更换——用吹风机加热屏幕边缘

 

ipad4屏幕更换——撬开触摸屏边缘
ipad4屏幕更换——撬开触摸屏边缘
ipad4屏幕更换——从右往左掀开触摸屏
ipad4屏幕更换——从右往左掀开触摸屏
ipad4屏幕更换——把屏幕放好,注意排序
ipad4屏幕更换——把屏幕放好,注意排序
ipad4屏幕更换——掀开显示屏后排线的样子
ipad4屏幕更换——掀开显示屏后排线的样子
ipad4屏幕更换——触摸屏和显示屏的排线
ipad4屏幕更换——触摸屏和显示屏的排线
ipad4屏幕更换——home键的排线
ipad4屏幕更换——home键的排线,注意引脚是朝上的

整个过程可以看出一个非专业人士完全可以根据网上的视频、卖家的手册和售后服务搞定拆机和安装。

java.lang.NullPointerException at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:630)

为了防止CSRF攻击,在struts2的form表单中使用<s:token/>,在拦截器里添加了<interceptor-ref name=”token”/>,结果发现抛出下面的异常:

java.lang.NullPointerException
at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:630)
at com.opensymphony.xwork2.util.LocalizedTextUtil.findText(LocalizedTextUtil.java:606)
at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:210)
at com.opensymphony.xwork2.TextProviderSupport.getText(TextProviderSupport.java:139)
at org.apache.struts2.interceptor.TokenInterceptor.getErrorMessage(TokenInterceptor.java:182)
at org.apache.struts2.interceptor.TokenInterceptor.handleInvalidToken(TokenInterceptor.java:166)
at org.apache.struts2.interceptor.TokenInterceptor.handleToken(TokenInterceptor.java:151)
at org.apache.struts2.interceptor.TokenInterceptor.doIntercept(TokenInterceptor.java:142)
at com.alibaba.search.scc.web.interceptor.SccTokenInterceptor.intercept(SccTokenInterceptor.java:42)
at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:562)
at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)

我的用法照理讲应该是官方的用法,按照异常堆栈查看struts2源码,发现问题在这里:

出问题的是textProvider.getText方法,原因是textProvider中的bundle和class是空的,为什么是空的呢?可以看到setTextProvider方法上有一个@Inject注解,这个注解告诉了struts2需要注入一个类型为com.opensymphony.xwork2.TextProvider的实例,因为struts jar包里面的struts-default.xml中默认的配置是:

所以默认注入的就是TextProviderSupport实例对象,而这个bean中没有默认指定class和bundle,这就导致了textProvider.getText方法抛出空指针异常。

根据官方文档中的说法,可以自己实现TextProvider,形如:

<bean class=”org.demo.MyTextProvider” name=”myTextProvider” type=”com.opensymphony.xwork2.TextProvider” />

<constant name=”struts.xworkTextProvider” value=”myTextProvider” />

换个方式解决问题:

如果上面的getErrorMessage方法中执行了if语句里面的内容就不会走到textProvider.getText方法那里去,所以可以尝试让action的类型属于TextProvider,在TextProvider上ctrl+T可以看到其实现类上有ActionSupport类,所以这就知道了只需要让action类继承ActionSupport类即可避免抛出上面的空指针异常。

当然,既然进入到handleInvalidToken方法里面来了,那就需要为返回值INVALID_TOKEN_CODE(“invalid.token“)配置出错页面,形如: