DebugNode

  1. nginx上的Ghost博客使用Let's Encrypt证书实现SSL

    上一篇,聊到了博客上HTTPS的事情,首先是证书的问题,笔者之前有个沃通的免费证书,不过因为沃通的那些破事,Apple已经进行了处理,Firefox和Chrome都进行了相应的不信任处理,所以,笔者和onevcat一样,选择了Let's Encrypt的证书,这家是免费的,但是签发的有效期只有90天,不过有certbot-auto工具可以很方便的续签。 笔者是搭建在nginx上的Ghost的博客,基本按照这篇教程来就可以了,不过貌似需搭梯子,于是摘录部分如下。 The Guide All steps are written from the viewpoint of a Ghost blog that was setup on DigitalOcean using it's one-click installer, but they're likely applicable to most Nginx/Ghost setups in…

  2. 2017 iOS的HTTPS支持与ATS限制

    在iOS9时代,开发者们可能就会碰到一个问题,就是在默认情况下,iOS9就已经不支持HTTP请求,需要通过设置NSAppTransportSecurity字典的NSAllowsArbitraryLoads为YES来禁用ATS。 在WWDC 2016中,Apple就表示,从 2017 年 1 月 1 日起,所有的新提交 app 默认是不允许使用 NSAllowsArbitraryLoads 来绕过 ATS 限制的,也就是说,我们最好保证 app 的所有网络请求都是 HTTPS 加密的,否则可能会在应用审核时遇到麻烦。 根据onevcat在2016-11-28日的总结 这方面的相关规定和几个事实如下: 默认情况下你的 app 可以访问加密足够强 (TLS v1.2 以上,AES-128 和 SHA-2 以及 ECDHC 等) 的 HTTPS 内容。这对所有的网络请求都有效,包括 NSURLSession,…

  3. nginx 页面报ERR_CONTENT_DECODING_FAILED

    近日,将WordPress搭建的站点创意应用迁移到了nginx上,因为WP实在是很慢,所以一直有用缓存插件,之前在Apache下面使用的是wp-super-cache,转到nginx上后,wp-super-cache同样可以使用,只是需要配置一下站点的config,基本上按着教程来就是了。但是使用之后,发现缓存了的页面加载很快,未缓存的页面按道理应该是直接到php上进行处理并把页面缓存下来供下次访问使用,但是我发现这边不是的,在使用chrome访问时,会出现一个错误页面一闪而过,然后跳转到内容页,如果是使用IE和Safari,会直接提示页面错误(没详细信息)而进不去页面,需要再刷新一次才能进页面。一开始以为是wp-super-cache和nginx不兼容,于是换用了插件w3-total-cache,一番修改和配置后,w3-total-cache也可用了,然而问题依旧。 于是想起chrome的一闪而过的错误页面,录屏后发现报的是Error 330 (net::ERR_CONTENT_DECODING_FAILED):。当然有详细的错误信息就好找解决方案了。 It happens when your HTTP request's headers claim that the content is gzip encoded, but…

  4. 在.Net环境下使用Kafka,我有话要说

    近日基于项目的解耦与削峰需求,决定在项目中引入消息队列。因为同时项目部分业务已经迁移到Java上,所以消息队列组件又要兼顾Java环境下的使用,选来选去对比了RabbitMQ、RocketMQ和Kafka,最后还是决定使用Kafka。Kafka原是Linkin的日志收集组件,慢慢的已经发展成为了一个具有消息队列/存储/流处理功能的的高效组件,需基于Zookeeper使用。我们项目因Dubbox已经有现成的Zookeeper可供使用,同时又有日志收集的需求,所以就选它了。 选定了组件后,Java是亲生儿子,组件的支持当然不在话下,而.Net环境下就有那么一点尴尬,没有官方客户端支持,只有几个在github上的开源项目可供使用。如果你在几个开源项目中一眼就看见了金光闪闪的Maintainer: Microsoft,那么十有八九你也入坑了。 CSharpClient-for-Kafka Microsoft提供的客户端,这个开源项目文档缺失、源代码复杂且注释少得可怜,连最基本的Producer和Consumer都不得不去把整个项目clone下来去看项目的Demo是怎么实现的。项目依赖.Net Framework 4.5,依赖ZookeeperNet,而ZookeeperNet组件依赖log4net,但是因为ZookeeperNet很久未更新,他依赖的log4net是使用oldkey的版本(<=1.2.10),而项目中原有的项目中有组件(Log4mongo)依赖的log4net版本是newkey的版本(>1.2.10)…

  5. React Native Text显示更多功能

    有时,在App中显示一段文本时,会需要先显示部分内容,用户如果对余下内容感兴趣,那么点击一个‘显示更多’的按钮,然后再显示余下内容,这个非常普通的需求在React Native中并没有官方的支持,Text组件中有numberOfLines属性,可以通过这个属性来设置显示的行数,但是对于一些动态内容,我们并不知道这些动态文本会在各个分辨率的手机上占几行,所以就不好判断是否需要‘显示更多’按钮。通过文本长度判断可以解决一部分人的需求,但是这个并不准确。 好在React Native 提供了measure函数,一开始将numberOfLines设置成0,那么可以在measure中获取到Text组件显示全部内容时的高度,然后可以判断这个高度是不是大于需要显示行数所占的高度,比方说我需要显示4行,每行高度为25,如果measure中获取到的高度大于4*25,说明行数是大于4行的,那么就将numberOfLines设置成4,并且显示‘显示更多’按钮。 measureHeader() { this.refs.description.measure((ox, oy, width, height) => { if (height > 100) { this.setState(…

  6. React Native 输入框被键盘遮挡解决办法

    相信每一个移动开发者都会碰到输入框被键盘遮挡的状况,当然也有各种各样的解决方案 React Native 的版本目前已经到了0.34,对于这个被遮挡的问题,当然已经有很多轮子。到了0.29版本时,React Native更新了KeyboardAvoidingView组件用来解决这个问题。 KeyboardAvoidingView 可以将子元素的位置根据KeyBoard的高度进行自动调整,有三种behavior分别是'height', 'position', 'padding' ,看了下源码,大致是一个普通的View监听了Keyboard的几个事件然后进行相应的高度调整。 componentWillMount() { if (Platform.OS === 'ios') { this.subscriptions = [ Keyboard.addListener('keyboardWillChangeFrame', this.onKeyboardChange), ]; } else { this.subscriptions = [ Keyboard.addListener('keyboardDidHide', this.onKeyboardChange), Keyboard.addListener('keyboardDidShow', this.onKeyboardChange), ]; } }, 在padding模式下,KeyboardAvoidingView会在键盘弹出时添加一个paddingBottom:keybordHeight的样式,这样子就可以保证子元素肯定不会被键盘遮挡(- -!…